diff --git a/.gitignore b/.gitignore index 9e62273..177ac3f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ media/ node_modules/ dist/ .venv/ +venv/ +.history +.DS_Store \ No newline at end of file diff --git a/.history/.env_20250506100502 b/.history/.env_20250506100502 deleted file mode 100644 index e69de29..0000000 diff --git a/.history/.env_20250506100611 b/.history/.env_20250506100611 deleted file mode 100644 index 27089a4..0000000 --- a/.history/.env_20250506100611 +++ /dev/null @@ -1,15 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -ALLOWED_HOSTS=['0.0.0.0', 'localhost', '127.0.0.1'] -DEBUG=True -DATABASE_URL=postgres://postgres:postgres@db:5432/postgres -DATABASE_NAME=postgres -DATABASE_USER=postgres -DATABASE_PASSWORD=postgres -DATABASE_HOST=db -DATABASE_PORT=5432 -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506100702 b/.history/.env_20250506100702 deleted file mode 100644 index 20cc898..0000000 --- a/.history/.env_20250506100702 +++ /dev/null @@ -1,15 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -ALLOWED_HOSTS=['0.0.0.0', 'localhost', '127.0.0.1'] -DJANGO_DEBUG=True -DATABASE_URL=postgres://postgres:postgres@db:5432/postgres -DATABASE_NAME=postgres -DATABASE_USER=postgres -DATABASE_PASSWORD=postgres -DATABASE_HOST=db -DATABASE_PORT=5432 -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506100747 b/.history/.env_20250506100747 deleted file mode 100644 index b0d03e9..0000000 --- a/.history/.env_20250506100747 +++ /dev/null @@ -1,15 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=0.0.0.0, localhost, 127.0.0.1 -DJANGO_DEBUG=True -DATABASE_URL=postgres://postgres:postgres@db:5432/postgres -DATABASE_NAME=postgres -DATABASE_USER=postgres -DATABASE_PASSWORD=postgres -DATABASE_HOST=db -DATABASE_PORT=5432 -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506101009 b/.history/.env_20250506101009 deleted file mode 100644 index 594b23a..0000000 --- a/.history/.env_20250506101009 +++ /dev/null @@ -1,16 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=0.0.0.0, localhost, 127.0.0.1 -DJANGO_DEBUG=True -DATABASE_URL=postgres://admin:admin@db:5432/links -DATABASE_NAME=links -DATABASE_USER=admin -DATABASE_PASSWORD=admin -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_HOST=db -DATABASE_PORT=5432 -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506101028 b/.history/.env_20250506101028 deleted file mode 100644 index 1488270..0000000 --- a/.history/.env_20250506101028 +++ /dev/null @@ -1,17 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=0.0.0.0, localhost, 127.0.0.1 -DJANGO_DEBUG=True -DATABASE_URL=postgres://admin:admin@db:5432/links -DATABASE_NAME=links -DATABASE_USER=admin -DATABASE_PASSWORD=admin -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_HOST=postgres -DATABASE_PORT=5432 - -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506101344 b/.history/.env_20250506101344 deleted file mode 100644 index 9fb1ccb..0000000 --- a/.history/.env_20250506101344 +++ /dev/null @@ -1,17 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=0.0.0.0, localhost, 127.0.0.1 -DJANGO_DEBUG=True -DATABASE_URL=postgres://admin:admin@db:5432/links -DATABASE_NAME=links -DATABASE_USER=admin -DATABASE_PASSWORD=admin -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_HOST=127.0.0.1 -DATABASE_PORT=5432 - -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506103308 b/.history/.env_20250506103308 deleted file mode 100644 index 9c71ffe..0000000 --- a/.history/.env_20250506103308 +++ /dev/null @@ -1,17 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=0.0.0.0,localhost,127.0.0.1 -DJANGO_DEBUG=True -DATABASE_URL=postgres://admin:admin@db:5432/links -DATABASE_NAME=links -DATABASE_USER=admin -DATABASE_PASSWORD=admin -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_HOST=127.0.0.1 -DATABASE_PORT=5432 - -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506103333 b/.history/.env_20250506103333 deleted file mode 100644 index 0ffe505..0000000 --- a/.history/.env_20250506103333 +++ /dev/null @@ -1,17 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=['0.0.0.0','localhost','127.0.0.1'] -DJANGO_DEBUG=True -DATABASE_URL=postgres://admin:admin@db:5432/links -DATABASE_NAME=links -DATABASE_USER=admin -DATABASE_PASSWORD=admin -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_HOST=127.0.0.1 -DATABASE_PORT=5432 - -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506103411 b/.history/.env_20250506103411 deleted file mode 100644 index 22dd26c..0000000 --- a/.history/.env_20250506103411 +++ /dev/null @@ -1,17 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=['0.0.0.0', 'localhost', '127.0.0.1'] -DJANGO_DEBUG=True -DATABASE_URL=postgres://admin:admin@db:5432/links -DATABASE_NAME=links -DATABASE_USER=admin -DATABASE_PASSWORD=admin -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_HOST=127.0.0.1 -DATABASE_PORT=5432 - -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506103426 b/.history/.env_20250506103426 deleted file mode 100644 index 3c889ff..0000000 --- a/.history/.env_20250506103426 +++ /dev/null @@ -1,17 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=127.0.0.1 -DJANGO_DEBUG=True -DATABASE_URL=postgres://admin:admin@db:5432/links -DATABASE_NAME=links -DATABASE_USER=admin -DATABASE_PASSWORD=admin -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_HOST=127.0.0.1 -DATABASE_PORT=5432 - -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506103431 b/.history/.env_20250506103431 deleted file mode 100644 index 93080a8..0000000 --- a/.history/.env_20250506103431 +++ /dev/null @@ -1,17 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=0.0.0.0 -DJANGO_DEBUG=True -DATABASE_URL=postgres://admin:admin@db:5432/links -DATABASE_NAME=links -DATABASE_USER=admin -DATABASE_PASSWORD=admin -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_HOST=127.0.0.1 -DATABASE_PORT=5432 - -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506103626 b/.history/.env_20250506103626 deleted file mode 100644 index 3c889ff..0000000 --- a/.history/.env_20250506103626 +++ /dev/null @@ -1,17 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=127.0.0.1 -DJANGO_DEBUG=True -DATABASE_URL=postgres://admin:admin@db:5432/links -DATABASE_NAME=links -DATABASE_USER=admin -DATABASE_PASSWORD=admin -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_HOST=127.0.0.1 -DATABASE_PORT=5432 - -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - diff --git a/.history/.env_20250506165303 b/.history/.env_20250506165303 deleted file mode 100644 index 511f52f..0000000 --- a/.history/.env_20250506165303 +++ /dev/null @@ -1,18 +0,0 @@ -DJANGO_SECRET_KEY=django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0= -DJANGO_ALLOWED_HOSTS=127.0.0.1 -DJANGO_DEBUG=True -DATABASE_URL=postgres://admin:admin@db:5432/links -DATABASE_NAME=links -DATABASE_USER=admin -DATABASE_PASSWORD=admin -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_HOST=127.0.0.1 -DATABASE_PORT=5432 - -REDIS_URL=redis://redis:6379/0 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD= - -NEXT_PUBLIC_API_URL=http://127.0.0.1:8000 diff --git a/.history/.env_20251029190347.example b/.history/.env_20251029190347.example deleted file mode 100644 index 2c18db6..0000000 --- a/.history/.env_20251029190347.example +++ /dev/null @@ -1,25 +0,0 @@ -# Django настройки -DJANGO_SECRET_KEY=your-secret-key-here-change-this-in-production -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0 - -# База данных PostgreSQL -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# PostgreSQL настройки для контейнера -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -# Медиа файлы -MEDIA_URL=/storage/ -MEDIA_ROOT=/app/storage - -# Статические файлы -STATIC_URL=/static/ -STATIC_ROOT=/app/staticfiles \ No newline at end of file diff --git a/.history/.env_20251029190516.example b/.history/.env_20251029190516.example deleted file mode 100644 index 2c18db6..0000000 --- a/.history/.env_20251029190516.example +++ /dev/null @@ -1,25 +0,0 @@ -# Django настройки -DJANGO_SECRET_KEY=your-secret-key-here-change-this-in-production -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0 - -# База данных PostgreSQL -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# PostgreSQL настройки для контейнера -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -# Медиа файлы -MEDIA_URL=/storage/ -MEDIA_ROOT=/app/storage - -# Статические файлы -STATIC_URL=/static/ -STATIC_ROOT=/app/staticfiles \ No newline at end of file diff --git a/.history/.env_20251029190820 b/.history/.env_20251029190820 deleted file mode 100644 index 3a7ddbd..0000000 --- a/.history/.env_20251029190820 +++ /dev/null @@ -1,25 +0,0 @@ -# Django настройки -DJANGO_SECRET_KEY=django-insecure-k8m2n9p4q7w5x1z3c6v8b0n5m8k3j6h9g4f7d2s5a8q1w4e7r0t3y6u9i2o5p8 -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0 - -# База данных PostgreSQL -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# PostgreSQL настройки для контейнера -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -# Медиа файлы -MEDIA_URL=/storage/ -MEDIA_ROOT=/app/storage - -# Статические файлы -STATIC_URL=/static/ -STATIC_ROOT=/app/staticfiles \ No newline at end of file diff --git a/.history/.env_20251029190829.example b/.history/.env_20251029190829.example deleted file mode 100644 index 0249ff8..0000000 --- a/.history/.env_20251029190829.example +++ /dev/null @@ -1,20 +0,0 @@ -# Django настройки -DJANGO_SECRET_KEY=django-insecure-your-secret-key-here-change-this-in-production -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0 - -# База данных PostgreSQL -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# PostgreSQL настройки для контейнера -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -# Frontend настройки -NEXT_PUBLIC_API_URL=http://localhost:8000 \ No newline at end of file diff --git a/.history/.env_20251029190844 b/.history/.env_20251029190844 deleted file mode 100644 index 5b06b6f..0000000 --- a/.history/.env_20251029190844 +++ /dev/null @@ -1,20 +0,0 @@ -# Django настройки -DJANGO_SECRET_KEY=django-insecure-k8m2n9p4q7w5x1z3c6v8b0n5m8k3j6h9g4f7d2s5a8q1w4e7r0t3y6u9i2o5p8 -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0 - -# База данных PostgreSQL -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# PostgreSQL настройки для контейнера -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -# Frontend настройки -NEXT_PUBLIC_API_URL=http://localhost:8000 \ No newline at end of file diff --git a/.history/.env_20251029190937 b/.history/.env_20251029190937 deleted file mode 100644 index 5b06b6f..0000000 --- a/.history/.env_20251029190937 +++ /dev/null @@ -1,20 +0,0 @@ -# Django настройки -DJANGO_SECRET_KEY=django-insecure-k8m2n9p4q7w5x1z3c6v8b0n5m8k3j6h9g4f7d2s5a8q1w4e7r0t3y6u9i2o5p8 -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0 - -# База данных PostgreSQL -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# PostgreSQL настройки для контейнера -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -# Frontend настройки -NEXT_PUBLIC_API_URL=http://localhost:8000 \ No newline at end of file diff --git a/.history/.env_20251029190937.example b/.history/.env_20251029190937.example deleted file mode 100644 index 0249ff8..0000000 --- a/.history/.env_20251029190937.example +++ /dev/null @@ -1,20 +0,0 @@ -# Django настройки -DJANGO_SECRET_KEY=django-insecure-your-secret-key-here-change-this-in-production -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0 - -# База данных PostgreSQL -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# PostgreSQL настройки для контейнера -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -# Frontend настройки -NEXT_PUBLIC_API_URL=http://localhost:8000 \ No newline at end of file diff --git a/.history/.env_20251029193708 b/.history/.env_20251029193708 deleted file mode 100644 index 42a2a44..0000000 --- a/.history/.env_20251029193708 +++ /dev/null @@ -1,20 +0,0 @@ -# Django настройки -DJANGO_SECRET_KEY=django-insecure-k8m2n9p4q7w5x1z3c6v8b0n5m8k3j6h9g4f7d2s5a8q1w4e7r0t3y6u9i2o5p8 -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0,web,frontend - -# База данных PostgreSQL -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# PostgreSQL настройки для контейнера -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -# Frontend настройки -NEXT_PUBLIC_API_URL=http://localhost:8000 \ No newline at end of file diff --git a/.history/.env_20251029194257 b/.history/.env_20251029194257 deleted file mode 100644 index 42a2a44..0000000 --- a/.history/.env_20251029194257 +++ /dev/null @@ -1,20 +0,0 @@ -# Django настройки -DJANGO_SECRET_KEY=django-insecure-k8m2n9p4q7w5x1z3c6v8b0n5m8k3j6h9g4f7d2s5a8q1w4e7r0t3y6u9i2o5p8 -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0,web,frontend - -# База данных PostgreSQL -DATABASE_ENGINE=django.db.backends.postgresql -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# PostgreSQL настройки для контейнера -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -# Frontend настройки -NEXT_PUBLIC_API_URL=http://localhost:8000 \ No newline at end of file diff --git a/.history/DEPLOYMENT_20251029191650.md b/.history/DEPLOYMENT_20251029191650.md deleted file mode 100644 index 2e9f765..0000000 --- a/.history/DEPLOYMENT_20251029191650.md +++ /dev/null @@ -1,68 +0,0 @@ -# Переменные окружения - -Скопируйте `.env.example` в `.env` и настройте следующие переменные: - -## Django настройки -- `DJANGO_SECRET_KEY` - Секретный ключ Django (обязательно изменить в продакшене) -- `DJANGO_DEBUG` - Режим отладки (True/False) -- `DJANGO_ALLOWED_HOSTS` - Разрешенные хосты (разделенные запятыми) - -## База данных PostgreSQL -- `DATABASE_ENGINE` - Движок базы данных (django.db.backends.postgresql) -- `DATABASE_NAME` - Название базы данных -- `DATABASE_USER` - Пользователь базы данных -- `DATABASE_PASSWORD` - Пароль базы данных -- `DATABASE_HOST` - Хост базы данных (db для Docker) -- `DATABASE_PORT` - Порт базы данных (5432) - -## PostgreSQL настройки для контейнера -- `POSTGRES_DB` - Название БД для создания в контейнере -- `POSTGRES_USER` - Пользователь БД для создания в контейнере -- `POSTGRES_PASSWORD` - Пароль пользователя БД в контейнере - -## Frontend настройки -- `NEXT_PUBLIC_API_URL` - URL API для frontend (http://localhost:8000) - -## Команды для запуска - -### Подготовка -```bash -cp .env.example .env -# Отредактируйте .env файл при необходимости -``` - -### Запуск всех сервисов -```bash -make up # или docker-compose up -d --build -``` - -### Применение миграций -```bash -make migrate # или docker-compose exec web python manage.py migrate -``` - -### Остановка сервисов -```bash -make down # или docker-compose down -``` - -### Запуск тестов -```bash -make test # или docker-compose exec web pytest --maxfail=1 --disable-warnings -q -``` - -## Доступ к сервисам - -- **Frontend**: http://localhost:3000 -- **Backend API**: http://localhost:8000/api/ -- **Django Admin**: http://localhost:8000/admin/ -- **PostgreSQL**: localhost:5432 - -## Структура проекта - -- `backend/` - Django приложение -- `frontend/linktree-frontend/` - Next.js приложение -- `.env` - Переменные окружения (не включается в git) -- `.env.example` - Пример переменных окружения -- `docker-compose.yml` - Конфигурация Docker Compose -- `Makefile` - Команды для удобного управления \ No newline at end of file diff --git a/.history/DEPLOYMENT_20251029192214.md b/.history/DEPLOYMENT_20251029192214.md deleted file mode 100644 index 2e9f765..0000000 --- a/.history/DEPLOYMENT_20251029192214.md +++ /dev/null @@ -1,68 +0,0 @@ -# Переменные окружения - -Скопируйте `.env.example` в `.env` и настройте следующие переменные: - -## Django настройки -- `DJANGO_SECRET_KEY` - Секретный ключ Django (обязательно изменить в продакшене) -- `DJANGO_DEBUG` - Режим отладки (True/False) -- `DJANGO_ALLOWED_HOSTS` - Разрешенные хосты (разделенные запятыми) - -## База данных PostgreSQL -- `DATABASE_ENGINE` - Движок базы данных (django.db.backends.postgresql) -- `DATABASE_NAME` - Название базы данных -- `DATABASE_USER` - Пользователь базы данных -- `DATABASE_PASSWORD` - Пароль базы данных -- `DATABASE_HOST` - Хост базы данных (db для Docker) -- `DATABASE_PORT` - Порт базы данных (5432) - -## PostgreSQL настройки для контейнера -- `POSTGRES_DB` - Название БД для создания в контейнере -- `POSTGRES_USER` - Пользователь БД для создания в контейнере -- `POSTGRES_PASSWORD` - Пароль пользователя БД в контейнере - -## Frontend настройки -- `NEXT_PUBLIC_API_URL` - URL API для frontend (http://localhost:8000) - -## Команды для запуска - -### Подготовка -```bash -cp .env.example .env -# Отредактируйте .env файл при необходимости -``` - -### Запуск всех сервисов -```bash -make up # или docker-compose up -d --build -``` - -### Применение миграций -```bash -make migrate # или docker-compose exec web python manage.py migrate -``` - -### Остановка сервисов -```bash -make down # или docker-compose down -``` - -### Запуск тестов -```bash -make test # или docker-compose exec web pytest --maxfail=1 --disable-warnings -q -``` - -## Доступ к сервисам - -- **Frontend**: http://localhost:3000 -- **Backend API**: http://localhost:8000/api/ -- **Django Admin**: http://localhost:8000/admin/ -- **PostgreSQL**: localhost:5432 - -## Структура проекта - -- `backend/` - Django приложение -- `frontend/linktree-frontend/` - Next.js приложение -- `.env` - Переменные окружения (не включается в git) -- `.env.example` - Пример переменных окружения -- `docker-compose.yml` - Конфигурация Docker Compose -- `Makefile` - Команды для удобного управления \ No newline at end of file diff --git a/.history/FIXES_20251029193216.md b/.history/FIXES_20251029193216.md deleted file mode 100644 index f96c658..0000000 --- a/.history/FIXES_20251029193216.md +++ /dev/null @@ -1,112 +0,0 @@ -# Решение проблем со статикой и API - -## Исправленные проблемы - -### ✅ Статические файлы Django -**Проблема**: Статические файлы Django REST Framework не загружались (404 ошибки) - -**Решение**: -1. Добавлен WhiteNoise middleware в `settings.py`: - ```python - MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', # Добавлено - # ... остальные middleware - ] - ``` - -2. Настроено хранилище статических файлов: - ```python - STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - ``` - -3. Создан `entrypoint.sh` для сборки статики при запуске: - ```bash - #!/bin/bash - echo "Collecting static files..." - python3 manage.py collectstatic --noinput --clear - - echo "Applying database migrations..." - python3 manage.py migrate --noinput - - echo "Starting server..." - exec gunicorn backend.wsgi:application --bind 0.0.0.0:8000 - ``` - -4. Обновлен `Dockerfile` для использования entrypoint - -### ✅ Автоматические миграции -Теперь миграции применяются автоматически при запуске контейнера - -### ⚠️ Frontend API подключение -**Проблема**: Frontend не может подключиться к backend API в Docker среде - -**Частичное решение**: -- Обновлена конфигурация Next.js для использования `web:8000` внутри Docker -- API прокси работает с редиректами - -## Результат - -### Работающие сервисы: -- ✅ **Backend**: http://localhost:8000 -- ✅ **Backend API**: http://localhost:8000/api/ -- ✅ **Статические файлы**: http://localhost:8000/static/* -- ✅ **Django Admin**: http://localhost:8000/admin/ -- ✅ **Frontend**: http://localhost:3000 -- ✅ **PostgreSQL**: localhost:5432 - -### Команды для запуска: -```bash -# Запуск всех сервисов -docker-compose up -d - -# Проверка статуса -docker-compose ps - -# Просмотр логов -docker-compose logs web -docker-compose logs frontend - -# Остановка -docker-compose down -``` - -### Переменные окружения (в .env): -```env -DJANGO_SECRET_KEY=your-secret-key -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0 - -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -NEXT_PUBLIC_API_URL=http://localhost:8000 -``` - -## Проверка работы - -### Backend статика: -```bash -curl -I http://localhost:8000/static/rest_framework/css/bootstrap.min.css -# Должен вернуть 200 OK -``` - -### API endpoints: -```bash -curl -s http://localhost:8000/api/ | jq -# Должен вернуть JSON с endpoints -``` - -### Frontend: -```bash -curl -I http://localhost:3000 -# Должен вернуть 200 OK -``` \ No newline at end of file diff --git a/.history/FIXES_20251029193233.md b/.history/FIXES_20251029193233.md deleted file mode 100644 index f96c658..0000000 --- a/.history/FIXES_20251029193233.md +++ /dev/null @@ -1,112 +0,0 @@ -# Решение проблем со статикой и API - -## Исправленные проблемы - -### ✅ Статические файлы Django -**Проблема**: Статические файлы Django REST Framework не загружались (404 ошибки) - -**Решение**: -1. Добавлен WhiteNoise middleware в `settings.py`: - ```python - MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', # Добавлено - # ... остальные middleware - ] - ``` - -2. Настроено хранилище статических файлов: - ```python - STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - ``` - -3. Создан `entrypoint.sh` для сборки статики при запуске: - ```bash - #!/bin/bash - echo "Collecting static files..." - python3 manage.py collectstatic --noinput --clear - - echo "Applying database migrations..." - python3 manage.py migrate --noinput - - echo "Starting server..." - exec gunicorn backend.wsgi:application --bind 0.0.0.0:8000 - ``` - -4. Обновлен `Dockerfile` для использования entrypoint - -### ✅ Автоматические миграции -Теперь миграции применяются автоматически при запуске контейнера - -### ⚠️ Frontend API подключение -**Проблема**: Frontend не может подключиться к backend API в Docker среде - -**Частичное решение**: -- Обновлена конфигурация Next.js для использования `web:8000` внутри Docker -- API прокси работает с редиректами - -## Результат - -### Работающие сервисы: -- ✅ **Backend**: http://localhost:8000 -- ✅ **Backend API**: http://localhost:8000/api/ -- ✅ **Статические файлы**: http://localhost:8000/static/* -- ✅ **Django Admin**: http://localhost:8000/admin/ -- ✅ **Frontend**: http://localhost:3000 -- ✅ **PostgreSQL**: localhost:5432 - -### Команды для запуска: -```bash -# Запуск всех сервисов -docker-compose up -d - -# Проверка статуса -docker-compose ps - -# Просмотр логов -docker-compose logs web -docker-compose logs frontend - -# Остановка -docker-compose down -``` - -### Переменные окружения (в .env): -```env -DJANGO_SECRET_KEY=your-secret-key -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0 - -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -POSTGRES_DB=links_db -POSTGRES_USER=links_user -POSTGRES_PASSWORD=links_password - -NEXT_PUBLIC_API_URL=http://localhost:8000 -``` - -## Проверка работы - -### Backend статика: -```bash -curl -I http://localhost:8000/static/rest_framework/css/bootstrap.min.css -# Должен вернуть 200 OK -``` - -### API endpoints: -```bash -curl -s http://localhost:8000/api/ | jq -# Должен вернуть JSON с endpoints -``` - -### Frontend: -```bash -curl -I http://localhost:3000 -# Должен вернуть 200 OK -``` \ No newline at end of file diff --git a/.history/README_20251029192139.md b/.history/README_20251029192139.md deleted file mode 100644 index 3f85c4e..0000000 --- a/.history/README_20251029192139.md +++ /dev/null @@ -1,108 +0,0 @@ -# Клон Linktr.ee на Django + Next.js - -Полнофункциональное приложение для создания персональных страниц с ссылками, похожее на Linktr.ee. - -## Технологии - -**Backend:** -- Django 5.2 + Django REST Framework -- PostgreSQL -- JWT Authentication -- Django CORS Headers -- Gunicorn - -**Frontend:** -- Next.js 15.3.1 -- React 19 -- TypeScript -- Tailwind CSS -- Axios для API запросов - -## Быстрый старт - -### 1. Подготовка окружения - -```bash -# Клонируйте репозиторий -git clone -cd links - -# Скопируйте переменные окружения -cp .env.example .env -``` - -### 2. Запуск проекта - -```bash -# Запуск всех сервисов -make up - -# Применение миграций базы данных -make migrate -``` - -### 3. Доступ к приложению - -- **Frontend**: http://localhost:3000 -- **Backend API**: http://localhost:8000/api/ -- **Django Admin**: http://localhost:8000/admin/ - -## Команды - -- `make up` - Запуск всех сервисов -- `make down` - Остановка всех сервисов -- `make migrate` - Применение миграций -- `make test` - Запуск тестов - -## Структура проекта - -``` -├── backend/ # Django приложение -│ ├── api/ # API endpoints -│ ├── users/ # Пользователи -│ ├── links/ # Ссылки и группы -│ ├── customization/ # Настройки дизайна -│ └── backend/ # Настройки Django -├── frontend/linktree-frontend/ # Next.js приложение -├── docker-compose.yml # Docker Compose конфигурация -├── .env.example # Пример переменных окружения -└── DEPLOYMENT.md # Подробные инструкции по развертыванию -``` - -## Переменные окружения - -Основные переменные в `.env`: - -```env -# Django -DJANGO_SECRET_KEY=your-secret-key -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost - -# PostgreSQL -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# Frontend -NEXT_PUBLIC_API_URL=http://localhost:8000 -``` - -Подробнее в `DEPLOYMENT.md`. - -## Особенности - -- 🔐 JWT аутентификация -- 👤 Кастомизация профилей -- 📱 Адаптивный дизайн -- 🔗 Управление ссылками и группами -- 🎨 Настройка внешнего вида -- 📊 API для всех операций - -## Разработка - -Проект настроен для разработки в Docker-контейнерах с горячей перезагрузкой. - -Для разработки без Docker смотрите инструкции в `DEPLOYMENT.md`. diff --git a/.history/README_20251029192214.md b/.history/README_20251029192214.md deleted file mode 100644 index 3f85c4e..0000000 --- a/.history/README_20251029192214.md +++ /dev/null @@ -1,108 +0,0 @@ -# Клон Linktr.ee на Django + Next.js - -Полнофункциональное приложение для создания персональных страниц с ссылками, похожее на Linktr.ee. - -## Технологии - -**Backend:** -- Django 5.2 + Django REST Framework -- PostgreSQL -- JWT Authentication -- Django CORS Headers -- Gunicorn - -**Frontend:** -- Next.js 15.3.1 -- React 19 -- TypeScript -- Tailwind CSS -- Axios для API запросов - -## Быстрый старт - -### 1. Подготовка окружения - -```bash -# Клонируйте репозиторий -git clone -cd links - -# Скопируйте переменные окружения -cp .env.example .env -``` - -### 2. Запуск проекта - -```bash -# Запуск всех сервисов -make up - -# Применение миграций базы данных -make migrate -``` - -### 3. Доступ к приложению - -- **Frontend**: http://localhost:3000 -- **Backend API**: http://localhost:8000/api/ -- **Django Admin**: http://localhost:8000/admin/ - -## Команды - -- `make up` - Запуск всех сервисов -- `make down` - Остановка всех сервисов -- `make migrate` - Применение миграций -- `make test` - Запуск тестов - -## Структура проекта - -``` -├── backend/ # Django приложение -│ ├── api/ # API endpoints -│ ├── users/ # Пользователи -│ ├── links/ # Ссылки и группы -│ ├── customization/ # Настройки дизайна -│ └── backend/ # Настройки Django -├── frontend/linktree-frontend/ # Next.js приложение -├── docker-compose.yml # Docker Compose конфигурация -├── .env.example # Пример переменных окружения -└── DEPLOYMENT.md # Подробные инструкции по развертыванию -``` - -## Переменные окружения - -Основные переменные в `.env`: - -```env -# Django -DJANGO_SECRET_KEY=your-secret-key -DJANGO_DEBUG=True -DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost - -# PostgreSQL -DATABASE_NAME=links_db -DATABASE_USER=links_user -DATABASE_PASSWORD=links_password -DATABASE_HOST=db -DATABASE_PORT=5432 - -# Frontend -NEXT_PUBLIC_API_URL=http://localhost:8000 -``` - -Подробнее в `DEPLOYMENT.md`. - -## Особенности - -- 🔐 JWT аутентификация -- 👤 Кастомизация профилей -- 📱 Адаптивный дизайн -- 🔗 Управление ссылками и группами -- 🎨 Настройка внешнего вида -- 📊 API для всех операций - -## Разработка - -Проект настроен для разработки в Docker-контейнерах с горячей перезагрузкой. - -Для разработки без Docker смотрите инструкции в `DEPLOYMENT.md`. diff --git a/.history/backend/Dockerfile_20251029190338 b/.history/backend/Dockerfile_20251029190338 deleted file mode 100644 index c18b0d6..0000000 --- a/.history/backend/Dockerfile_20251029190338 +++ /dev/null @@ -1,26 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* - -# Копирование и установка requirements -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -# Копирование кода приложения -COPY . . - -# Создание директорий для статики и медиа -RUN mkdir -p staticfiles storage - -# Сбор статических файлов -RUN python manage.py collectstatic --noinput - -EXPOSE 8000 - -CMD ["gunicorn", "backend.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file diff --git a/.history/backend/Dockerfile_20251029190516 b/.history/backend/Dockerfile_20251029190516 deleted file mode 100644 index c18b0d6..0000000 --- a/.history/backend/Dockerfile_20251029190516 +++ /dev/null @@ -1,26 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* - -# Копирование и установка requirements -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -# Копирование кода приложения -COPY . . - -# Создание директорий для статики и медиа -RUN mkdir -p staticfiles storage - -# Сбор статических файлов -RUN python manage.py collectstatic --noinput - -EXPOSE 8000 - -CMD ["gunicorn", "backend.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file diff --git a/.history/backend/Dockerfile_20251029190955 b/.history/backend/Dockerfile_20251029190955 deleted file mode 100644 index 845fd8f..0000000 --- a/.history/backend/Dockerfile_20251029190955 +++ /dev/null @@ -1,26 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* - -# Копирование и установка requirements -COPY ../requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -# Копирование кода приложения -COPY . . - -# Создание директорий для статики и медиа -RUN mkdir -p staticfiles storage - -# Сбор статических файлов -RUN python manage.py collectstatic --noinput - -EXPOSE 8000 - -CMD ["gunicorn", "backend.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file diff --git a/.history/backend/Dockerfile_20251029191016 b/.history/backend/Dockerfile_20251029191016 deleted file mode 100644 index c18b0d6..0000000 --- a/.history/backend/Dockerfile_20251029191016 +++ /dev/null @@ -1,26 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* - -# Копирование и установка requirements -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -# Копирование кода приложения -COPY . . - -# Создание директорий для статики и медиа -RUN mkdir -p staticfiles storage - -# Сбор статических файлов -RUN python manage.py collectstatic --noinput - -EXPOSE 8000 - -CMD ["gunicorn", "backend.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file diff --git a/.history/backend/Dockerfile_20251029191030 b/.history/backend/Dockerfile_20251029191030 deleted file mode 100644 index 42e96ac..0000000 --- a/.history/backend/Dockerfile_20251029191030 +++ /dev/null @@ -1,23 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* - -# Копирование и установка requirements -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -# Копирование кода приложения -COPY . . - -# Создание директорий для статики и медиа -RUN mkdir -p staticfiles storage - -EXPOSE 8000 - -CMD ["gunicorn", "backend.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file diff --git a/.history/backend/Dockerfile_20251029191041 b/.history/backend/Dockerfile_20251029191041 deleted file mode 100644 index 42e96ac..0000000 --- a/.history/backend/Dockerfile_20251029191041 +++ /dev/null @@ -1,23 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* - -# Копирование и установка requirements -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -# Копирование кода приложения -COPY . . - -# Создание директорий для статики и медиа -RUN mkdir -p staticfiles storage - -EXPOSE 8000 - -CMD ["gunicorn", "backend.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file diff --git a/.history/backend/Dockerfile_20251029192429 b/.history/backend/Dockerfile_20251029192429 deleted file mode 100644 index 1093b85..0000000 --- a/.history/backend/Dockerfile_20251029192429 +++ /dev/null @@ -1,26 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* - -# Копирование и установка requirements -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -# Копирование кода приложения -COPY . . - -# Создание директорий для статики и медиа -RUN mkdir -p staticfiles storage - -# Сбор статических файлов -RUN python manage.py collectstatic --noinput --clear - -EXPOSE 8000 - -CMD ["gunicorn", "backend.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file diff --git a/.history/backend/Dockerfile_20251029192513 b/.history/backend/Dockerfile_20251029192513 deleted file mode 100644 index 1093b85..0000000 --- a/.history/backend/Dockerfile_20251029192513 +++ /dev/null @@ -1,26 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* - -# Копирование и установка requirements -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -# Копирование кода приложения -COPY . . - -# Создание директорий для статики и медиа -RUN mkdir -p staticfiles storage - -# Сбор статических файлов -RUN python manage.py collectstatic --noinput --clear - -EXPOSE 8000 - -CMD ["gunicorn", "backend.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file diff --git a/.history/backend/Dockerfile_20251029192533 b/.history/backend/Dockerfile_20251029192533 deleted file mode 100644 index 57798d5..0000000 --- a/.history/backend/Dockerfile_20251029192533 +++ /dev/null @@ -1,27 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* - -# Копирование и установка requirements -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -# Копирование кода приложения -COPY . . - -# Создание директорий для статики и медиа -RUN mkdir -p staticfiles storage - -# Копируем entrypoint скрипт -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh - -EXPOSE 8000 - -ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/.history/backend/Dockerfile_20251029192619 b/.history/backend/Dockerfile_20251029192619 deleted file mode 100644 index 57798d5..0000000 --- a/.history/backend/Dockerfile_20251029192619 +++ /dev/null @@ -1,27 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* - -# Копирование и установка requirements -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -# Копирование кода приложения -COPY . . - -# Создание директорий для статики и медиа -RUN mkdir -p staticfiles storage - -# Копируем entrypoint скрипт -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh - -EXPOSE 8000 - -ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/.history/backend/api/admin_20250506130805.py b/.history/backend/api/admin_20250506130805.py deleted file mode 100644 index 8c38f3f..0000000 --- a/.history/backend/api/admin_20250506130805.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/.history/backend/api/admin_20250506131421.py b/.history/backend/api/admin_20250506131421.py deleted file mode 100644 index ad54705..0000000 --- a/.history/backend/api/admin_20250506131421.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.contrib import admin -from .models import Link, LinkGroup - -@admin.register(Link) -class LinkAdmin(admin.ModelAdmin): - list_display = ('title', 'url', 'owner', 'group', 'order') - list_filter = ('owner', 'group') - search_fields = ('title', 'url') - -@admin.register(LinkGroup) -class LinkGroupAdmin(admin.ModelAdmin): - list_display = ('name', 'owner', 'order') - list_filter = ('owner',) - search_fields = ('name',) diff --git a/.history/backend/api/admin_20250506161017.py b/.history/backend/api/admin_20250506161017.py deleted file mode 100644 index acd965e..0000000 --- a/.history/backend/api/admin_20250506161017.py +++ /dev/null @@ -1,15 +0,0 @@ -# api/admin.py -from django.contrib import admin -from .models import Link, LinkGroup - -@admin.register(Link) -class LinkAdmin(admin.ModelAdmin): - list_display = ('title', 'url', 'owner', 'group', 'order') - list_filter = ('owner', 'group') - search_fields = ('title', 'url') - -@admin.register(LinkGroup) -class LinkGroupAdmin(admin.ModelAdmin): - list_display = ('name', 'owner', 'order') - list_filter = ('owner',) - search_fields = ('name', \ No newline at end of file diff --git a/.history/backend/api/admin_20250506161028.py b/.history/backend/api/admin_20250506161028.py deleted file mode 100644 index 9c854f5..0000000 --- a/.history/backend/api/admin_20250506161028.py +++ /dev/null @@ -1,17 +0,0 @@ -# api/admin.py -from django.contrib import admin -from .models import Link, LinkGroup - -@admin.register(Link) -class LinkAdmin(admin.ModelAdmin): - list_display = ('title', 'url', 'owner', 'group', 'order') - list_filter = ('owner', 'group') - search_fields = ('title', 'url') - -@admin.register(LinkGroup) -class LinkGroupAdmin(admin.ModelAdmin): - list_display = ('name', 'owner', 'order') - list_filter = ('owner',) - search_fields = ('name',) - ordering = ('owner', 'order') - prepopulated_fields = {'slug': ('name',)} \ No newline at end of file diff --git a/.history/backend/api/admin_20250506161445.py b/.history/backend/api/admin_20250506161445.py deleted file mode 100644 index fc78cf7..0000000 --- a/.history/backend/api/admin_20250506161445.py +++ /dev/null @@ -1,16 +0,0 @@ -# api/admin.py -from django.contrib import admin -from .models import Link, LinkGroup - -@admin.register(Link) -class LinkAdmin(admin.ModelAdmin): - list_display = ('title', 'url', 'owner', 'group', 'order') - list_filter = ('owner', 'group') - search_fields = ('title', 'url') - -@admin.register(LinkGroup) -class LinkGroupAdmin(admin.ModelAdmin): - list_display = ('name', 'owner', 'order') - list_filter = ('owner',) - search_fields = ('name',) - ordering = ('owner', 'order') diff --git a/.history/backend/api/models_20250506130805.py b/.history/backend/api/models_20250506130805.py deleted file mode 100644 index 71a8362..0000000 --- a/.history/backend/api/models_20250506130805.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/.history/backend/api/models_20250506130917.py b/.history/backend/api/models_20250506130917.py deleted file mode 100644 index b79e724..0000000 --- a/.history/backend/api/models_20250506130917.py +++ /dev/null @@ -1,22 +0,0 @@ -# api/models.py -from django.db import models -from django.contrib.auth.models import User - -class LinkGroup(models.Model): - owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='groups') - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='links') - group = models.ForeignKey(LinkGroup, on_delete=models.SET_NULL, null=True, blank=True, related_name='links') - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title diff --git a/.history/backend/api/models_20250506131033.py b/.history/backend/api/models_20250506131033.py deleted file mode 100644 index 8212eae..0000000 --- a/.history/backend/api/models_20250506131033.py +++ /dev/null @@ -1,35 +0,0 @@ -# api/models.py -from django.conf import settings -from django.db import models - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups' # было 'groups', теперь уникальное имя - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' # оставляем 'links' — у User нет такого поля - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title diff --git a/.history/backend/api/models_20250506131051.py b/.history/backend/api/models_20250506131051.py deleted file mode 100644 index ea6148b..0000000 --- a/.history/backend/api/models_20250506131051.py +++ /dev/null @@ -1,35 +0,0 @@ -# api/models.py -from django.conf import settings -from django.db import models -from django.conf import settings -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups' # было 'groups', теперь уникальное имя - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' # оставляем 'links' — у User нет такого поля - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title diff --git a/.history/backend/api/models_20250506131102.py b/.history/backend/api/models_20250506131102.py deleted file mode 100644 index 8212eae..0000000 --- a/.history/backend/api/models_20250506131102.py +++ /dev/null @@ -1,35 +0,0 @@ -# api/models.py -from django.conf import settings -from django.db import models - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups' # было 'groups', теперь уникальное имя - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' # оставляем 'links' — у User нет такого поля - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title diff --git a/.history/backend/api/models_20250506131134.py b/.history/backend/api/models_20250506131134.py deleted file mode 100644 index 02501be..0000000 --- a/.history/backend/api/models_20250506131134.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.conf import settings -from django.db import models - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups' # было 'groups', теперь уникальное имя - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' # оставляем 'links' — у User нет такого поля - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title diff --git a/.history/backend/api/models_20250506131224.py b/.history/backend/api/models_20250506131224.py deleted file mode 100644 index ee9d82c..0000000 --- a/.history/backend/api/models_20250506131224.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.conf import settings -from django.db import models - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='api_link_groups' # теперь уникально - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' # оставляем 'links' — у User нет такого поля - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title diff --git a/.history/backend/api/models_20250506160935.py b/.history/backend/api/models_20250506160935.py deleted file mode 100644 index bf77e2a..0000000 --- a/.history/backend/api/models_20250506160935.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups' - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, - blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title \ No newline at end of file diff --git a/.history/backend/api/models_20250506161429.py b/.history/backend/api/models_20250506161429.py deleted file mode 100644 index 8765159..0000000 --- a/.history/backend/api/models_20250506161429.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='api_link_groups' # уникальное имя, чтобы не конфликтовать с links app - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, - blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title \ No newline at end of file diff --git a/.history/backend/api/models_20250507135815.py b/.history/backend/api/models_20250507135815.py deleted file mode 100644 index 62bb23e..0000000 --- a/.history/backend/api/models_20250507135815.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='api_link_groups' # уникальное имя, чтобы не конфликтовать с links app - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - description = models.TextField(blank=True, null=True) - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, - blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title \ No newline at end of file diff --git a/.history/backend/api/models_20250507135936.py b/.history/backend/api/models_20250507135936.py deleted file mode 100644 index b6cf020..0000000 --- a/.history/backend/api/models_20250507135936.py +++ /dev/null @@ -1,41 +0,0 @@ -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='api_link_groups' # уникальное имя, чтобы не конфликтовать с links app - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - description = models.TextField(blank=True, null=True) - icon = models.ImageField( - upload_to='link_groups/', - null=True, - blank=True, - help_text='Иконка группы ссылок' - ) - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, - blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title \ No newline at end of file diff --git a/.history/backend/api/models_20250507140013.py b/.history/backend/api/models_20250507140013.py deleted file mode 100644 index 853988e..0000000 --- a/.history/backend/api/models_20250507140013.py +++ /dev/null @@ -1,45 +0,0 @@ -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='api_link_groups' # уникальное имя, чтобы не конфликтовать с links app - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - description = models.TextField(blank=True, null=True) - icon = models.ImageField( - upload_to='link_groups/', - null=True, - blank=True, - help_text='Иконка группы ссылок' - ) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - is_public = models.BooleanField(default=False, help_text='Публичная группа ссылок') - is_favorite = models.BooleanField(default=False, help_text='Избранная группа ссылок') - def __str__(self): - return f"{self.owner.username} - {self.name}" - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, - blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.URLField(blank=True, null=True) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title \ No newline at end of file diff --git a/.history/backend/api/models_20250507145448.py b/.history/backend/api/models_20250507145448.py deleted file mode 100644 index 1c0863e..0000000 --- a/.history/backend/api/models_20250507145448.py +++ /dev/null @@ -1,54 +0,0 @@ -# backend/api/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='api_link_groups' - ) - name = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - description = models.TextField(blank=True, null=True) - icon = models.ImageField( - upload_to='link_groups/', - null=True, - blank=True, - help_text='Иконка группы ссылок' - ) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - is_public = models.BooleanField(default=False) - is_favorite = models.BooleanField(default=False) - - def __str__(self): - return f"{self.owner.username} — {self.name}" - - -class Link(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='links' - ) - group = models.ForeignKey( - LinkGroup, - on_delete=models.SET_NULL, - null=True, - blank=True, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - icon = models.ImageField( - upload_to='links/', - null=True, - blank=True, - help_text='Иконка для этой ссылки' - ) - order = models.PositiveIntegerField(default=0) - - def __str__(self): - return self.title diff --git a/.history/backend/api/serializers_20250506130933.py b/.history/backend/api/serializers_20250506130933.py deleted file mode 100644 index e69de29..0000000 diff --git a/.history/backend/api/serializers_20250506130936.py b/.history/backend/api/serializers_20250506130936.py deleted file mode 100644 index 91e8fc2..0000000 --- a/.history/backend/api/serializers_20250506130936.py +++ /dev/null @@ -1,31 +0,0 @@ -from rest_framework import serializers -from django.contrib.auth.models import User -from .models import Link, LinkGroup - -class RegisterSerializer(serializers.ModelSerializer): - password = serializers.CharField(write_only=True) - - class Meta: - model = User - fields = ('username', 'email', 'password') - - def create(self, validated_data): - user = User( - username=validated_data['username'], - email=validated_data.get('email', '') - ) - user.set_password(validated_data['password']) - user.save() - return user - -class LinkGroupSerializer(serializers.ModelSerializer): - class Meta: - model = LinkGroup - fields = ('id', 'name', 'order') - read_only_fields = ('id',) - -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ('id', 'title', 'url', 'icon', 'order', 'group') - read_only_fields = ('id', 'owner') \ No newline at end of file diff --git a/.history/backend/api/serializers_20250506160944.py b/.history/backend/api/serializers_20250506160944.py deleted file mode 100644 index 7272e65..0000000 --- a/.history/backend/api/serializers_20250506160944.py +++ /dev/null @@ -1,34 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password = serializers.CharField(write_only=True) - - class Meta: - model = User - fields = ('username', 'email', 'password') - - def create(self, validated_data): - user = User( - username=validated_data['username'], - email=validated_data.get('email', '') - ) - user.set_password(validated_data['password']) - user.save() - return user - -class LinkGroupSerializer(serializers.ModelSerializer): - class Meta: - model = LinkGroup - fields = ('id', 'name', 'order') - read_only_fields = ('id',) - -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ('id', 'title', 'url', 'icon', 'order', 'group') - read_only_fields = ('id', 'owner') \ No newline at end of file diff --git a/.history/backend/api/serializers_20250506170829.py b/.history/backend/api/serializers_20250506170829.py deleted file mode 100644 index 4413b3b..0000000 --- a/.history/backend/api/serializers_20250506170829.py +++ /dev/null @@ -1,46 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password = serializers.CharField(write_only=True) - - class Meta: - model = User - fields = ('username', 'email', 'password') - - def create(self, validated_data): - user = User( - username=validated_data['username'], - email=validated_data.get('email', '') - ) - user.set_password(validated_data['password']) - user.save() - return user - -class LinkGroupSerializer(serializers.ModelSerializer): - class Meta: - model = LinkGroup - fields = ('id', 'name', 'order') - read_only_fields = ('id',) - -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ('id', 'title', 'url', 'icon', 'order', 'group') - read_only_fields = ('id', 'owner') - - -from django.contrib.auth import get_user_model -from rest_framework import serializers - -User = get_user_model() - -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - # поля, которые хотите отдавать на фронт: - fields = ['id', 'username', 'email', 'first_name', 'last_name'] diff --git a/.history/backend/api/serializers_20250506171300.py b/.history/backend/api/serializers_20250506171300.py deleted file mode 100644 index f5b352e..0000000 --- a/.history/backend/api/serializers_20250506171300.py +++ /dev/null @@ -1,55 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password = serializers.CharField(write_only=True) - - class Meta: - model = User - fields = ('username', 'email', 'password') - - def create(self, validated_data): - user = User( - username=validated_data['username'], - email=validated_data.get('email', '') - ) - user.set_password(validated_data['password']) - user.save() - return user -# api/serializers.py -from rest_framework import serializers -from django.conf import settings -from .models import Link, LinkGroup - -# сериализатор для ссылок -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ['id', 'title', 'url', 'icon', 'order', 'group'] - -# сериализатор для групп со вложенными ссылками -class LinkGroupSerializer(serializers.ModelSerializer): - # related_name у вас в модели LinkGroup.owner = 'api_link_groups', - # а у модели Link.group = 'links', так что у группы obj.links — это QuerySet ссылок - links = LinkSerializer(many=True, read_only=True) - - class Meta: - model = LinkGroup - fields = ['id', 'name', 'order', 'links'] - - - -from django.contrib.auth import get_user_model -from rest_framework import serializers - -User = get_user_model() - -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - # поля, которые хотите отдавать на фронт: - fields = ['id', 'username', 'email', 'first_name', 'last_name'] diff --git a/.history/backend/api/serializers_20250506182026.py b/.history/backend/api/serializers_20250506182026.py deleted file mode 100644 index 71dbf52..0000000 --- a/.history/backend/api/serializers_20250506182026.py +++ /dev/null @@ -1,55 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password = serializers.CharField(write_only=True) - - class Meta: - model = User - fields = ('username', 'email', 'password') - - def create(self, validated_data): - user = User( - username=validated_data['username'], - email=validated_data.get('email', '') - ) - user.set_password(validated_data['password']) - user.save() - return user -# api/serializers.py -from rest_framework import serializers -from django.conf import settings -from .models import Link, LinkGroup - -# сериализатор для ссылок -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ['id', 'title', 'url', 'icon', 'order', 'group'] - -# сериализатор для групп со вложенными ссылками -class LinkGroupSerializer(serializers.ModelSerializer): - # related_name у вас в модели LinkGroup.owner = 'api_link_groups', - # а у модели Link.group = 'links', так что у группы obj.links — это QuerySet ссылок - links = LinkSerializer(many=True, read_only=True) - - class Meta: - model = LinkGroup - fields = ['id', 'name', 'order', 'links'] - - - -from django.contrib.auth import get_user_model -from rest_framework import serializers - -User = get_user_model() - -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - # поля, которые хотите отдавать на фронт: - fields = ['id', 'username', 'email', 'full_name'] diff --git a/.history/backend/api/serializers_20250506182211.py b/.history/backend/api/serializers_20250506182211.py deleted file mode 100644 index aa29762..0000000 --- a/.history/backend/api/serializers_20250506182211.py +++ /dev/null @@ -1,55 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password = serializers.CharField(write_only=True) - - class Meta: - model = User - fields = ('username', 'email', 'password') - - def create(self, validated_data): - user = User( - username=validated_data['username'], - email=validated_data.get('email', '') - ) - user.set_password(validated_data['password']) - user.save() - return user -# api/serializers.py -from rest_framework import serializers -from django.conf import settings -from .models import Link, LinkGroup - -# сериализатор для ссылок -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ['id', 'title', 'url', 'icon', 'order', 'group'] - -# сериализатор для групп со вложенными ссылками -class LinkGroupSerializer(serializers.ModelSerializer): - # related_name у вас в модели LinkGroup.owner = 'api_link_groups', - # а у модели Link.group = 'links', так что у группы obj.links — это QuerySet ссылок - links = LinkSerializer(many=True, read_only=True) - - class Meta: - model = LinkGroup - fields = ['id', 'name', 'order', 'links'] - - - -from django.contrib.auth import get_user_model -from rest_framework import serializers - -User = get_user_model() - -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - # поля, которые хотите отдавать на фронт: - fields = ['id', 'username', 'email', 'full_name', 'bio', 'avatar', 'user_permissions'] diff --git a/.history/backend/api/serializers_20250506182234.py b/.history/backend/api/serializers_20250506182234.py deleted file mode 100644 index 19555c8..0000000 --- a/.history/backend/api/serializers_20250506182234.py +++ /dev/null @@ -1,55 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password = serializers.CharField(write_only=True) - - class Meta: - model = User - fields = ('username', 'email', 'password') - - def create(self, validated_data): - user = User( - username=validated_data['username'], - email=validated_data.get('email', '') - ) - user.set_password(validated_data['password']) - user.save() - return user -# api/serializers.py -from rest_framework import serializers -from django.conf import settings -from .models import Link, LinkGroup - -# сериализатор для ссылок -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ['id', 'title', 'url', 'icon', 'order', 'group'] - -# сериализатор для групп со вложенными ссылками -class LinkGroupSerializer(serializers.ModelSerializer): - # related_name у вас в модели LinkGroup.owner = 'api_link_groups', - # а у модели Link.group = 'links', так что у группы obj.links — это QuerySet ссылок - links = LinkSerializer(many=True, read_only=True) - - class Meta: - model = LinkGroup - fields = ['id', 'name', 'order', 'links'] - - - -from django.contrib.auth import get_user_model -from rest_framework import serializers - -User = get_user_model() - -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - # поля, которые хотите отдавать на фронт: - fields = ['id', 'username', 'email', 'full_name', 'bio', 'avatar', 'user_permissions', 'last_login', 'date_joined'] diff --git a/.history/backend/api/serializers_20250506182243.py b/.history/backend/api/serializers_20250506182243.py deleted file mode 100644 index 71af5a8..0000000 --- a/.history/backend/api/serializers_20250506182243.py +++ /dev/null @@ -1,55 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password = serializers.CharField(write_only=True) - - class Meta: - model = User - fields = ('username', 'email', 'password') - - def create(self, validated_data): - user = User( - username=validated_data['username'], - email=validated_data.get('email', '') - ) - user.set_password(validated_data['password']) - user.save() - return user -# api/serializers.py -from rest_framework import serializers -from django.conf import settings -from .models import Link, LinkGroup - -# сериализатор для ссылок -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ['id', 'title', 'url', 'icon', 'order', 'group'] - -# сериализатор для групп со вложенными ссылками -class LinkGroupSerializer(serializers.ModelSerializer): - # related_name у вас в модели LinkGroup.owner = 'api_link_groups', - # а у модели Link.group = 'links', так что у группы obj.links — это QuerySet ссылок - links = LinkSerializer(many=True, read_only=True) - - class Meta: - model = LinkGroup - fields = ['id', 'name', 'order', 'links'] - - - -from django.contrib.auth import get_user_model -from rest_framework import serializers - -User = get_user_model() - -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - # поля, которые хотите отдавать на фронт: - fields = ['id', 'username', 'email', 'full_name', 'bio', 'avatar', 'last_login', 'date_joined'] diff --git a/.history/backend/api/serializers_20250507134438.py b/.history/backend/api/serializers_20250507134438.py deleted file mode 100644 index 98da7ec..0000000 --- a/.history/backend/api/serializers_20250507134438.py +++ /dev/null @@ -1,60 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password = serializers.CharField(write_only=True) - - class Meta: - model = User - fields = ('username', 'email', 'password') - - def create(self, validated_data): - user = User( - username=validated_data['username'], - email=validated_data.get('email', '') - ) - user.set_password(validated_data['password']) - user.save() - return user -# api/serializers.py -from rest_framework import serializers -from django.conf import settings -from .models import Link, LinkGroup - -# сериализатор для ссылок -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ['id', 'title', 'url', 'icon', 'order', 'group'] - -# сериализатор для групп со вложенными ссылками -class LinkGroupSerializer(serializers.ModelSerializer): - owner = serializers.ReadOnlyField(source='owner.username') - - class Meta: - model = LinkGroup - fields = [ - 'id', - 'name', - 'description', - 'icon', - 'owner', - 'created_at', - ] - read_only_fields = ['id', 'owner', 'created_at'] - - -from django.contrib.auth import get_user_model -from rest_framework import serializers - -User = get_user_model() - -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - # поля, которые хотите отдавать на фронт: - fields = ['id', 'username', 'email', 'full_name', 'bio', 'avatar', 'last_login', 'date_joined'] diff --git a/.history/backend/api/serializers_20250507142241.py b/.history/backend/api/serializers_20250507142241.py deleted file mode 100644 index dcee8e5..0000000 --- a/.history/backend/api/serializers_20250507142241.py +++ /dev/null @@ -1,65 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password = serializers.CharField(write_only=True) - - class Meta: - model = User - fields = ('username', 'email', 'password') - - def create(self, validated_data): - user = User( - username=validated_data['username'], - email=validated_data.get('email', '') - ) - user.set_password(validated_data['password']) - user.save() - return user -# api/serializers.py -from rest_framework import serializers -from django.conf import settings -from .models import Link, LinkGroup - -# сериализатор для ссылок -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ['id', 'title', 'url', 'icon', 'order', 'group'] - -# сериализатор для групп со вложенными ссылками -class LinkGroupSerializer(serializers.ModelSerializer): - owner = serializers.ReadOnlyField(source='owner.username') - - class Meta: - model = LinkGroup - fields = [ - 'id', - 'name', - 'description', - 'icon', - 'owner', - 'created_at', - ] - read_only_fields = ['id', 'owner', 'created_at'] - - -from django.contrib.auth import get_user_model -from rest_framework import serializers - -User = get_user_model() - -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - # поля, которые хотите отдавать на фронт: - fields = ['id', 'username', 'email', 'full_name', 'bio', 'avatar', 'last_login', 'date_joined'] - - -class PublicUserGroupsSerializer(serializers.Serializer): - username = serializers.CharField() - groups = LinkGroupSerializer(many=True) \ No newline at end of file diff --git a/.history/backend/api/serializers_20250507145525.py b/.history/backend/api/serializers_20250507145525.py deleted file mode 100644 index 1cfd830..0000000 --- a/.history/backend/api/serializers_20250507145525.py +++ /dev/null @@ -1,66 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password2 = serializers.CharField(write_only=True) - class Meta: - model = User - fields = ['username', 'email', 'first_name', 'last_name', 'password', 'password2'] - extra_kwargs = {'password': {'write_only': True}} - - def validate(self, attrs): - if attrs['password'] != attrs.pop('password2'): - raise serializers.ValidationError("Пароли не совпадают") - return attrs - - def create(self, validated_data): - return User.objects.create_user(**validated_data) - - -# api/serializers.py -from rest_framework import serializers -from django.conf import settings -from .models import Link, LinkGroup - -# сериализатор для ссылок -class LinkSerializer(serializers.ModelSerializer): - class Meta: - model = Link - fields = ['id', 'title', 'url', 'icon', 'order', 'group'] - -# сериализатор для групп со вложенными ссылками -class LinkGroupSerializer(serializers.ModelSerializer): - owner = serializers.ReadOnlyField(source='owner.username') - - class Meta: - model = LinkGroup - fields = [ - 'id', - 'name', - 'description', - 'icon', - 'owner', - 'created_at', - ] - read_only_fields = ['id', 'owner', 'created_at'] - - -from django.contrib.auth import get_user_model -from rest_framework import serializers - -User = get_user_model() - -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - # поля, которые хотите отдавать на фронт: - fields = ['id', 'username', 'email', 'full_name', 'bio', 'avatar', 'last_login', 'date_joined'] - - -class PublicUserGroupsSerializer(serializers.Serializer): - username = serializers.CharField() - groups = LinkGroupSerializer(many=True) \ No newline at end of file diff --git a/.history/backend/api/serializers_20250507145609.py b/.history/backend/api/serializers_20250507145609.py deleted file mode 100644 index 0be3437..0000000 --- a/.history/backend/api/serializers_20250507145609.py +++ /dev/null @@ -1,48 +0,0 @@ -# api/serializers.py -from rest_framework import serializers -from django.contrib.auth import get_user_model -from .models import Link, LinkGroup -from django.conf import settings -from .models import Link, LinkGroup -User = get_user_model() - -class RegisterSerializer(serializers.ModelSerializer): - password2 = serializers.CharField(write_only=True) - class Meta: - model = User - fields = ['username', 'email', 'first_name', 'last_name', 'password', 'password2'] - extra_kwargs = {'password': {'write_only': True}} - - def validate(self, attrs): - if attrs['password'] != attrs.pop('password2'): - raise serializers.ValidationError("Пароли не совпадают") - return attrs - - def create(self, validated_data): - return User.objects.create_user(**validated_data) - - - - -# сериализатор для ссылок -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - fields = ['id', 'username', 'email', 'full_name', 'bio', 'avatar', 'last_login', 'date_joined'] - - -class LinkGroupSerializer(serializers.ModelSerializer): - icon = serializers.ImageField(required=False, allow_null=True) - class Meta: - model = LinkGroup - fields = ['id', 'name', 'description', 'icon', 'order', 'is_public', 'is_favorite', - 'created_at', 'updated_at'] - read_only_fields = ['id', 'created_at', 'updated_at'] - - -class LinkSerializer(serializers.ModelSerializer): - icon = serializers.ImageField(required=False, allow_null=True) - class Meta: - model = Link - fields = ['id', 'title', 'url', 'icon', 'group', 'order'] - read_only_fields = ['id'] \ No newline at end of file diff --git a/.history/backend/api/urls_20250506131430.py b/.history/backend/api/urls_20250506131430.py deleted file mode 100644 index e69de29..0000000 diff --git a/.history/backend/api/urls_20250506131439.py b/.history/backend/api/urls_20250506131439.py deleted file mode 100644 index 30e08c5..0000000 --- a/.history/backend/api/urls_20250506131439.py +++ /dev/null @@ -1,18 +0,0 @@ -# api/urls.py -from django.urls import path, include -from rest_framework.routers import DefaultRouter -from .views import ( - RegisterView, LoginView, LinkViewSet, - LinkGroupViewSet, UserLinksListView -) - -router = DefaultRouter() -router.register(r'links', LinkViewSet, basename='links') -router.register(r'groups', LinkGroupViewSet, basename='groups') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth-register'), - path('auth/login/', LoginView.as_view(), name='auth-login'), - path('users//links/', UserLinksListView.as_view(), name='user-links'), - path('', include(router.urls)), -] \ No newline at end of file diff --git a/.history/backend/api/urls_20250506161007.py b/.history/backend/api/urls_20250506161007.py deleted file mode 100644 index d1e1d91..0000000 --- a/.history/backend/api/urls_20250506161007.py +++ /dev/null @@ -1,15 +0,0 @@ -# api/urls.py -from django.urls import path, include -from rest_framework.routers import DefaultRouter -from .views import RegisterView, LoginView, LinkViewSet, LinkGroupViewSet, UserLinksListView - -router = DefaultRouter() -router.register(r'links', LinkViewSet, basename='links') -router.register(r'groups', LinkGroupViewSet, basename='groups') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth-register'), - path('auth/login/', LoginView.as_view(), name='auth-login'), - path('users//links/', UserLinksListView.as_view(), name='user-links'), - path('', include(router.urls)), -] diff --git a/.history/backend/api/urls_20250506170839.py b/.history/backend/api/urls_20250506170839.py deleted file mode 100644 index 1be6231..0000000 --- a/.history/backend/api/urls_20250506170839.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - UserLinksView, - LinkViewSet, - LinkGroupViewSet -) -from rest_framework.routers import DefaultRouter - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('users//links/', UserLinksView.as_view(), name='user-links'), -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20250506170901.py b/.history/backend/api/urls_20250506170901.py deleted file mode 100644 index f0482d2..0000000 --- a/.history/backend/api/urls_20250506170901.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet -) -from rest_framework.routers import DefaultRouter - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('users//links/', UserLinksView.as_view(), name='user-links'), -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20250506170908.py b/.history/backend/api/urls_20250506170908.py deleted file mode 100644 index 84b5a0a..0000000 --- a/.history/backend/api/urls_20250506170908.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet -) -from rest_framework.routers import DefaultRouter - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20250507072806.py b/.history/backend/api/urls_20250507072806.py deleted file mode 100644 index 8a910cd..0000000 --- a/.history/backend/api/urls_20250507072806.py +++ /dev/null @@ -1,24 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet -) -from rest_framework.routers import DefaultRouter - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20250507072816.py b/.history/backend/api/urls_20250507072816.py deleted file mode 100644 index 9b3abb3..0000000 --- a/.history/backend/api/urls_20250507072816.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet, - PublicUserGroupsView -) -from rest_framework.routers import DefaultRouter - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20250507080627.py b/.history/backend/api/urls_20250507080627.py deleted file mode 100644 index 9864697..0000000 --- a/.history/backend/api/urls_20250507080627.py +++ /dev/null @@ -1,28 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet, - PublicUserGroupsView -) -from rest_framework.routers import DefaultRouter - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), - path('schema/', SpectacularAPIView.as_view(), name='schema'), - path('swagger/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), - -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20250507080637.py b/.history/backend/api/urls_20250507080637.py deleted file mode 100644 index 3952cfd..0000000 --- a/.history/backend/api/urls_20250507080637.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet, - PublicUserGroupsView -) -from rest_framework.routers import DefaultRouter -from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), - path('schema/', SpectacularAPIView.as_view(), name='schema'), - path('swagger/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), - -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20250507080822.py b/.history/backend/api/urls_20250507080822.py deleted file mode 100644 index 966b362..0000000 --- a/.history/backend/api/urls_20250507080822.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet, - PublicUserGroupsView -) -from rest_framework.routers import DefaultRouter -from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), - # схема OpenAPI - path('api/schema/', SpectacularAPIView.as_view(), name='schema'), - # Swagger UI, берёт шаблон из drf_spectacular_sidecar - path( - 'api/swagger/', - SpectacularSwaggerView.as_view(url_name='schema'), - name='swagger-ui' - ), - -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20250507081428.py b/.history/backend/api/urls_20250507081428.py deleted file mode 100644 index 966b362..0000000 --- a/.history/backend/api/urls_20250507081428.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet, - PublicUserGroupsView -) -from rest_framework.routers import DefaultRouter -from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), - # схема OpenAPI - path('api/schema/', SpectacularAPIView.as_view(), name='schema'), - # Swagger UI, берёт шаблон из drf_spectacular_sidecar - path( - 'api/swagger/', - SpectacularSwaggerView.as_view(url_name='schema'), - name='swagger-ui' - ), - -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20250507081622.py b/.history/backend/api/urls_20250507081622.py deleted file mode 100644 index 03f19eb..0000000 --- a/.history/backend/api/urls_20250507081622.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet, - PublicUserGroupsView -) -from rest_framework.routers import DefaultRouter -from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), - # схема OpenAPI - path('schema/', SpectacularAPIView.as_view(), name='schema'), - # Swagger UI, берёт шаблон из drf_spectacular_sidecar - path( - 'swagger/', - SpectacularSwaggerView.as_view(url_name='schema'), - name='swagger-ui' - ), - -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20251029194610.py b/.history/backend/api/urls_20251029194610.py deleted file mode 100644 index 6429ed3..0000000 --- a/.history/backend/api/urls_20251029194610.py +++ /dev/null @@ -1,39 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet, - PublicUserGroupsView -) -from rest_framework.routers import DefaultRouter -from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/register', RegisterView.as_view(), name='auth_register_no_slash'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/login', TokenObtainPairView.as_view(), name='token_obtain_pair_no_slash'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/refresh', TokenRefreshView.as_view(), name='token_refresh_no_slash'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('auth/user', UserProfileView.as_view(), name='user-profile-no-slash'), - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), - # схема OpenAPI - path('schema/', SpectacularAPIView.as_view(), name='schema'), - # Swagger UI, берёт шаблон из drf_spectacular_sidecar - path( - 'swagger/', - SpectacularSwaggerView.as_view(url_name='schema'), - name='swagger-ui' - ), - -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20251029194633.py b/.history/backend/api/urls_20251029194633.py deleted file mode 100644 index 6429ed3..0000000 --- a/.history/backend/api/urls_20251029194633.py +++ /dev/null @@ -1,39 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet, - PublicUserGroupsView -) -from rest_framework.routers import DefaultRouter -from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView - -router = DefaultRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/register', RegisterView.as_view(), name='auth_register_no_slash'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/login', TokenObtainPairView.as_view(), name='token_obtain_pair_no_slash'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/refresh', TokenRefreshView.as_view(), name='token_refresh_no_slash'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('auth/user', UserProfileView.as_view(), name='user-profile-no-slash'), - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), - # схема OpenAPI - path('schema/', SpectacularAPIView.as_view(), name='schema'), - # Swagger UI, берёт шаблон из drf_spectacular_sidecar - path( - 'swagger/', - SpectacularSwaggerView.as_view(url_name='schema'), - name='swagger-ui' - ), - -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20251029201825.py b/.history/backend/api/urls_20251029201825.py deleted file mode 100644 index 114d05d..0000000 --- a/.history/backend/api/urls_20251029201825.py +++ /dev/null @@ -1,44 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet, - PublicUserGroupsView -) -from rest_framework.routers import DefaultRouter -from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView - -class NoTrailingSlashRouter(DefaultRouter): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.trailing_slash = '/?' - -router = NoTrailingSlashRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/register', RegisterView.as_view(), name='auth_register_no_slash'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/login', TokenObtainPairView.as_view(), name='token_obtain_pair_no_slash'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/refresh', TokenRefreshView.as_view(), name='token_refresh_no_slash'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('auth/user', UserProfileView.as_view(), name='user-profile-no-slash'), - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), - # схема OpenAPI - path('schema/', SpectacularAPIView.as_view(), name='schema'), - # Swagger UI, берёт шаблон из drf_spectacular_sidecar - path( - 'swagger/', - SpectacularSwaggerView.as_view(url_name='schema'), - name='swagger-ui' - ), - -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/urls_20251029201838.py b/.history/backend/api/urls_20251029201838.py deleted file mode 100644 index 114d05d..0000000 --- a/.history/backend/api/urls_20251029201838.py +++ /dev/null @@ -1,44 +0,0 @@ -from django.urls import path -from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView -from .views import ( - RegisterView, - UserProfileView, - LinkViewSet, - LinkGroupViewSet, - PublicUserGroupsView -) -from rest_framework.routers import DefaultRouter -from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView - -class NoTrailingSlashRouter(DefaultRouter): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.trailing_slash = '/?' - -router = NoTrailingSlashRouter() -router.register('links', LinkViewSet, basename='link') -router.register('groups', LinkGroupViewSet, basename='group') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth_register'), - path('auth/register', RegisterView.as_view(), name='auth_register_no_slash'), - path('auth/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('auth/login', TokenObtainPairView.as_view(), name='token_obtain_pair_no_slash'), - path('auth/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('auth/refresh', TokenRefreshView.as_view(), name='token_refresh_no_slash'), - path('auth/user/', UserProfileView.as_view(), name='user-profile'), # ← новый - path('auth/user', UserProfileView.as_view(), name='user-profile-no-slash'), - path('users//public/', - PublicUserGroupsView.as_view(), - name='public-user-groups' - ), - # схема OpenAPI - path('schema/', SpectacularAPIView.as_view(), name='schema'), - # Swagger UI, берёт шаблон из drf_spectacular_sidecar - path( - 'swagger/', - SpectacularSwaggerView.as_view(url_name='schema'), - name='swagger-ui' - ), - -] + router.urls \ No newline at end of file diff --git a/.history/backend/api/views_20250506130805.py b/.history/backend/api/views_20250506130805.py deleted file mode 100644 index 91ea44a..0000000 --- a/.history/backend/api/views_20250506130805.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/.history/backend/api/views_20250506130955.py b/.history/backend/api/views_20250506130955.py deleted file mode 100644 index cc7baad..0000000 --- a/.history/backend/api/views_20250506130955.py +++ /dev/null @@ -1,62 +0,0 @@ -from rest_framework import generics, viewsets, permissions -from django.contrib.auth.models import User -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import ( - RegisterSerializer, LinkSerializer, LinkGroupSerializer -) -from .models import Link, LinkGroup - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - serializer_class = LinkGroupSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return LinkGroup.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - -# api/urls.py -from django.urls import path, include -from rest_framework.routers import DefaultRouter -from .views import ( - RegisterView, LoginView, LinkViewSet, - LinkGroupViewSet, UserLinksListView -) - -router = DefaultRouter() -router.register(r'links', LinkViewSet, basename='links') -router.register(r'groups', LinkGroupViewSet, basename='groups') - -urlpatterns = [ - path('auth/register/', RegisterView.as_view(), name='auth-register'), - path('auth/login/', LoginView.as_view(), name='auth-login'), - path('users//links/', UserLinksListView.as_view(), name='user-links'), - path('', include(router.urls)), -] diff --git a/.history/backend/api/views_20250506160957.py b/.history/backend/api/views_20250506160957.py deleted file mode 100644 index 6339d80..0000000 --- a/.history/backend/api/views_20250506160957.py +++ /dev/null @@ -1,44 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - serializer_class = LinkGroupSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return LinkGroup.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') \ No newline at end of file diff --git a/.history/backend/api/views_20250506170809.py b/.history/backend/api/views_20250506170809.py deleted file mode 100644 index 9fa1c4a..0000000 --- a/.history/backend/api/views_20250506170809.py +++ /dev/null @@ -1,59 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - serializer_class = LinkGroupSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return LinkGroup.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user \ No newline at end of file diff --git a/.history/backend/api/views_20250506170815.py b/.history/backend/api/views_20250506170815.py deleted file mode 100644 index 8e1ec40..0000000 --- a/.history/backend/api/views_20250506170815.py +++ /dev/null @@ -1,60 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - serializer_class = LinkGroupSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return LinkGroup.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user \ No newline at end of file diff --git a/.history/backend/api/views_20250506171322.py b/.history/backend/api/views_20250506171322.py deleted file mode 100644 index 4bb2c6d..0000000 --- a/.history/backend/api/views_20250506171322.py +++ /dev/null @@ -1,59 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # возвращаем только группы текущего пользователя - return self.queryset.filter(owner=self.request.user).order_by('order') - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user \ No newline at end of file diff --git a/.history/backend/api/views_20250507072833.py b/.history/backend/api/views_20250507072833.py deleted file mode 100644 index dbbf49e..0000000 --- a/.history/backend/api/views_20250507072833.py +++ /dev/null @@ -1,113 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup - -User = get_user_model() - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # возвращаем только группы текущего пользователя - return self.queryset.filter(owner=self.request.user).order_by('order') - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - Возвращает публичную страницу пользователя: - { - "username": "...", - "groups": [ - { - "id": 1, - "name": "...", - "icon": "/storage/images/link_groups/1.png", - "links": [ - { - "id": 5, - "title": "...", - "url": "...", - "icon": "/storage/images/links/5.png" - }, - … - ] - }, - … - ] - } - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - User = get_user_model() - user = get_object_or_404(User, username=username) - # достаём все группы пользователя вместе с их ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - data = { - "username": user.username, - "groups": [] - } - for grp in groups_qs: - grp_data = { - "id": grp.id, - "name": grp.name, - "icon": grp.icon.url if grp.icon else None, - "links": [] - } - for ln in grp.links.all(): - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": ln.icon.url if ln.icon else None - }) - data["groups"].append(grp_data) - return Response(data, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507072920.py b/.history/backend/api/views_20250507072920.py deleted file mode 100644 index afa757c..0000000 --- a/.history/backend/api/views_20250507072920.py +++ /dev/null @@ -1,118 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions,status -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 - - - -User = get_user_model() - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # возвращаем только группы текущего пользователя - return self.queryset.filter(owner=self.request.user).order_by('order') - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - Возвращает публичную страницу пользователя: - { - "username": "...", - "groups": [ - { - "id": 1, - "name": "...", - "icon": "/storage/images/link_groups/1.png", - "links": [ - { - "id": 5, - "title": "...", - "url": "...", - "icon": "/storage/images/links/5.png" - }, - … - ] - }, - … - ] - } - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - User = get_user_model() - user = get_object_or_404(User, username=username) - # достаём все группы пользователя вместе с их ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - data = { - "username": user.username, - "groups": [] - } - for grp in groups_qs: - grp_data = { - "id": grp.id, - "name": grp.name, - "icon": grp.icon.url if grp.icon else None, - "links": [] - } - for ln in grp.links.all(): - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": ln.icon.url if ln.icon else None - }) - data["groups"].append(grp_data) - return Response(data, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507073141.py b/.history/backend/api/views_20250507073141.py deleted file mode 100644 index cdce00f..0000000 --- a/.history/backend/api/views_20250507073141.py +++ /dev/null @@ -1,109 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions,status -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 - - - -User = get_user_model() - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # возвращаем только группы текущего пользователя - return self.queryset.filter(owner=self.request.user).order_by('order') - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - User = get_user_model() - user = get_object_or_404(User, username=username) - - # Берём все группы пользователя вместе с их ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # поле image у группы - grp_image_url = grp.image.url if getattr(grp, 'image', None) else None - - grp_data = { - "id": grp.id, - "name": grp.name, - "image": grp_image_url, - "links": [], - } - - for ln in grp.links.all(): - # поле image у отдельной ссылки - link_image_url = ln.image.url if getattr(ln, 'image', None) else None - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "image": link_image_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507073143.py b/.history/backend/api/views_20250507073143.py deleted file mode 100644 index cdce00f..0000000 --- a/.history/backend/api/views_20250507073143.py +++ /dev/null @@ -1,109 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions,status -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 - - - -User = get_user_model() - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # возвращаем только группы текущего пользователя - return self.queryset.filter(owner=self.request.user).order_by('order') - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - User = get_user_model() - user = get_object_or_404(User, username=username) - - # Берём все группы пользователя вместе с их ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # поле image у группы - grp_image_url = grp.image.url if getattr(grp, 'image', None) else None - - grp_data = { - "id": grp.id, - "name": grp.name, - "image": grp_image_url, - "links": [], - } - - for ln in grp.links.all(): - # поле image у отдельной ссылки - link_image_url = ln.image.url if getattr(ln, 'image', None) else None - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "image": link_image_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507141914.py b/.history/backend/api/views_20250507141914.py deleted file mode 100644 index 0764ae1..0000000 --- a/.history/backend/api/views_20250507141914.py +++ /dev/null @@ -1,119 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions,status -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 - - - -User = get_user_model() - -@extend_schema( - parameters=[ - OpenApiParameter( - name='id', - type=int, - location=OpenApiParameter.PATH - ) - ] -) - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # возвращаем только группы текущего пользователя - return self.queryset.filter(owner=self.request.user).order_by('order') - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - User = get_user_model() - user = get_object_or_404(User, username=username) - - # Берём все группы пользователя вместе с их ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # поле image у группы - grp_image_url = grp.image.url if getattr(grp, 'image', None) else None - - grp_data = { - "id": grp.id, - "name": grp.name, - "image": grp_image_url, - "links": [], - } - - for ln in grp.links.all(): - # поле image у отдельной ссылки - link_image_url = ln.image.url if getattr(ln, 'image', None) else None - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "image": link_image_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507141924.py b/.history/backend/api/views_20250507141924.py deleted file mode 100644 index f2cc20b..0000000 --- a/.history/backend/api/views_20250507141924.py +++ /dev/null @@ -1,119 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions,status -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter - - -User = get_user_model() - -@extend_schema( - parameters=[ - OpenApiParameter( - name='id', - type=int, - location=OpenApiParameter.PATH - ) - ] -) - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # возвращаем только группы текущего пользователя - return self.queryset.filter(owner=self.request.user).order_by('order') - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - User = get_user_model() - user = get_object_or_404(User, username=username) - - # Берём все группы пользователя вместе с их ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # поле image у группы - grp_image_url = grp.image.url if getattr(grp, 'image', None) else None - - grp_data = { - "id": grp.id, - "name": grp.name, - "image": grp_image_url, - "links": [], - } - - for ln in grp.links.all(): - # поле image у отдельной ссылки - link_image_url = ln.image.url if getattr(ln, 'image', None) else None - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "image": link_image_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507142311.py b/.history/backend/api/views_20250507142311.py deleted file mode 100644 index 46d4b2c..0000000 --- a/.history/backend/api/views_20250507142311.py +++ /dev/null @@ -1,95 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions,status -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter - - -User = get_user_model() - -@extend_schema( - parameters=[ - OpenApiParameter( - name='id', - type=int, - location=OpenApiParameter.PATH - ) - ] -) - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # возвращаем только группы текущего пользователя - return self.queryset.filter(owner=self.request.user).order_by('order') - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user - - -@extend_schema( - responses=PublicUserGroupsSerializer -) -class PublicUserGroupsView(generics.GenericAPIView): - """ - Возвращает публичные группы и их ссылки для заданного username. - GET /api/users/{username}/public/ - """ - serializer_class = PublicUserGroupsSerializer - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - user = get_object_or_404(User, username=username) - groups = LinkGroup.objects.filter(owner=user, is_public=True).prefetch_related('links') - # Формируем ответ в виде словаря — GenericAPIView сам вызовет нужный сериализатор: - return Response({ - 'username': user.username, - 'groups': groups - }) \ No newline at end of file diff --git a/.history/backend/api/views_20250507142317.py b/.history/backend/api/views_20250507142317.py deleted file mode 100644 index 0b0aa65..0000000 --- a/.history/backend/api/views_20250507142317.py +++ /dev/null @@ -1,98 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions,status -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter - - -User = get_user_model() - -@extend_schema( - parameters=[ - OpenApiParameter( - name='id', - type=int, - location=OpenApiParameter.PATH - ) - ] -) - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # возвращаем только группы текущего пользователя - return self.queryset.filter(owner=self.request.user).order_by('order') - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user - -from users.models import User -from links.models import LinkGroup -from .serializers import PublicUserGroupsSerializer - -@extend_schema( - responses=PublicUserGroupsSerializer -) -class PublicUserGroupsView(generics.GenericAPIView): - """ - Возвращает публичные группы и их ссылки для заданного username. - GET /api/users/{username}/public/ - """ - serializer_class = PublicUserGroupsSerializer - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - user = get_object_or_404(User, username=username) - groups = LinkGroup.objects.filter(owner=user, is_public=True).prefetch_related('links') - # Формируем ответ в виде словаря — GenericAPIView сам вызовет нужный сериализатор: - return Response({ - 'username': user.username, - 'groups': groups - }) \ No newline at end of file diff --git a/.history/backend/api/views_20250507142335.py b/.history/backend/api/views_20250507142335.py deleted file mode 100644 index f2cc20b..0000000 --- a/.history/backend/api/views_20250507142335.py +++ /dev/null @@ -1,119 +0,0 @@ -# api/views.py -from rest_framework import generics, viewsets, permissions,status -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from .serializers import RegisterSerializer, LinkSerializer, LinkGroupSerializer -from .models import Link, LinkGroup -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter - - -User = get_user_model() - -@extend_schema( - parameters=[ - OpenApiParameter( - name='id', - type=int, - location=OpenApiParameter.PATH - ) - ] -) - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - -class LoginView(TokenObtainPairView): - permission_classes = (permissions.AllowAny,) - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # возвращаем только группы текущего пользователя - return self.queryset.filter(owner=self.request.user).order_by('order') - -class LinkViewSet(viewsets.ModelViewSet): - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -from .serializers import UserSerializer # нужно завести сериализатор для пользователя - -User = get_user_model() - -class UserProfileView(generics.RetrieveAPIView): - """ - Возвращает данные авторизованного пользователя. - GET /api/auth/user/ - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - User = get_user_model() - user = get_object_or_404(User, username=username) - - # Берём все группы пользователя вместе с их ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # поле image у группы - grp_image_url = grp.image.url if getattr(grp, 'image', None) else None - - grp_data = { - "id": grp.id, - "name": grp.name, - "image": grp_image_url, - "links": [], - } - - for ln in grp.links.all(): - # поле image у отдельной ссылки - link_image_url = ln.image.url if getattr(ln, 'image', None) else None - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "image": link_image_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507145006.py b/.history/backend/api/views_20250507145006.py deleted file mode 100644 index b31f7d7..0000000 --- a/.history/backend/api/views_20250507145006.py +++ /dev/null @@ -1,151 +0,0 @@ -# backend/api/views.py - -from rest_framework import generics, viewsets, permissions, status -from django.contrib.auth import get_user_model -from rest_framework_simplejwt.views import TokenObtainPairView -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -@extend_schema( - parameters=[ - OpenApiParameter( - name='id', - type=int, - location=OpenApiParameter.PATH - ) - ] -) -class RegisterView(generics.CreateAPIView): - """ - POST /api/auth/register/ - Регистрирует нового пользователя. - """ - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - - -class LoginView(TokenObtainPairView): - """ - POST /api/auth/login/ - Возвращает JWT-токены. - """ - permission_classes = (permissions.AllowAny,) - - -class LinkGroupViewSet(viewsets.ModelViewSet): - """ - /api/groups/ - CRUD для групп ссылок текущего пользователя. - """ - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # Возвращаем только свои группы, упорядоченные по полю order - return self.queryset.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - # При создании модели автоматически ставим owner = текущий пользователь - serializer.save(owner=self.request.user) - - -class LinkViewSet(viewsets.ModelViewSet): - """ - /api/links/ - CRUD для ссылок текущего пользователя. - """ - serializer_class = LinkSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_queryset(self): - # Возвращаем только свои ссылки, упорядоченные по полю order - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - # При создании модели автоматически ставим owner = текущий пользователь - serializer.save(owner=self.request.user) - - -class UserLinksListView(generics.ListAPIView): - """ - GET /api/users/{username}/links/ - Список публичных ссылок пользователя (без группировки). - """ - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class UserProfileView(generics.RetrieveAPIView): - """ - GET /api/auth/user/ - Возвращает данные авторизованного пользователя. - """ - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_object(self): - return self.request.user - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - Возвращает публичные группы и ссылки пользователя. - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - user = get_object_or_404(User, username=username) - - # Берем все группы пользователя вместе с их ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # URL иконки группы (поле icon в модели) - grp_icon_url = grp.icon.url if grp.icon else None - - grp_data = { - "id": grp.id, - "name": grp.name, - "icon": grp_icon_url, - "links": [], - } - - for ln in grp.links.all(): - # URL иконки ссылки (поле icon в модели Link — URLField) - link_icon_url = ln.icon if ln.icon else None - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": link_icon_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) diff --git a/.history/backend/api/views_20250507145615.py b/.history/backend/api/views_20250507145615.py deleted file mode 100644 index 3ec54f4..0000000 --- a/.history/backend/api/views_20250507145615.py +++ /dev/null @@ -1,248 +0,0 @@ -# # backend/api/views.py - -# from rest_framework import generics, viewsets, permissions, status -# from django.contrib.auth import get_user_model -# from rest_framework_simplejwt.views import TokenObtainPairView -# from rest_framework.views import APIView -# from rest_framework.response import Response -# from django.shortcuts import get_object_or_404 -# from drf_spectacular.utils import extend_schema, OpenApiParameter - -# from .models import Link, LinkGroup -# from .serializers import ( -# RegisterSerializer, -# UserSerializer, -# LinkSerializer, -# LinkGroupSerializer, -# ) - -# User = get_user_model() - - -# @extend_schema( -# parameters=[ -# OpenApiParameter( -# name='id', -# type=int, -# location=OpenApiParameter.PATH -# ) -# ] -# ) -# class RegisterView(generics.CreateAPIView): -# """ -# POST /api/auth/register/ -# Регистрирует нового пользователя. -# """ -# queryset = User.objects.all() -# permission_classes = (permissions.AllowAny,) -# serializer_class = RegisterSerializer - - -# class LoginView(TokenObtainPairView): -# """ -# POST /api/auth/login/ -# Возвращает JWT-токены. -# """ -# permission_classes = (permissions.AllowAny,) - - -# class LinkGroupViewSet(viewsets.ModelViewSet): -# """ -# /api/groups/ -# CRUD для групп ссылок текущего пользователя. -# """ -# queryset = LinkGroup.objects.all() -# serializer_class = LinkGroupSerializer -# permission_classes = [permissions.IsAuthenticated] - -# def get_queryset(self): -# # Возвращаем только свои группы, упорядоченные по полю order -# return self.queryset.filter(owner=self.request.user).order_by('order') - -# def perform_create(self, serializer): -# # При создании модели автоматически ставим owner = текущий пользователь -# serializer.save(owner=self.request.user) - - -# class LinkViewSet(viewsets.ModelViewSet): -# """ -# /api/links/ -# CRUD для ссылок текущего пользователя. -# """ -# serializer_class = LinkSerializer -# permission_classes = (permissions.IsAuthenticated,) - -# def get_queryset(self): -# # Возвращаем только свои ссылки, упорядоченные по полю order -# return Link.objects.filter(owner=self.request.user).order_by('order') - -# def perform_create(self, serializer): -# # При создании модели автоматически ставим owner = текущий пользователь -# serializer.save(owner=self.request.user) - - -# class UserLinksListView(generics.ListAPIView): -# """ -# GET /api/users/{username}/links/ -# Список публичных ссылок пользователя (без группировки). -# """ -# serializer_class = LinkSerializer -# permission_classes = (permissions.AllowAny,) - -# def get_queryset(self): -# username = self.kwargs['username'] -# return Link.objects.filter(owner__username=username).order_by('order') - - -# class UserProfileView(generics.RetrieveAPIView): -# """ -# GET /api/auth/user/ -# Возвращает данные авторизованного пользователя. -# """ -# serializer_class = UserSerializer -# permission_classes = [permissions.IsAuthenticated] - -# def get_object(self): -# return self.request.user - - -# class PublicUserGroupsView(APIView): -# """ -# GET /api/users/{username}/public/ -# Возвращает публичные группы и ссылки пользователя. -# """ -# permission_classes = [permissions.AllowAny] - -# def get(self, request, username): -# user = get_object_or_404(User, username=username) - -# # Берем все группы пользователя вместе с их ссылками -# groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - -# result = { -# "username": user.username, -# "groups": [] -# } - -# for grp in groups_qs: -# # URL иконки группы (поле icon в модели) -# grp_icon_url = grp.icon.url if grp.icon else None - -# grp_data = { -# "id": grp.id, -# "name": grp.name, -# "icon": grp_icon_url, -# "links": [], -# } - -# for ln in grp.links.all(): -# # URL иконки ссылки (поле icon в модели Link — URLField) -# link_icon_url = ln.icon if ln.icon else None - -# grp_data["links"].append({ -# "id": ln.id, -# "title": ln.title, -# "url": ln.url, -# "icon": link_icon_url, -# }) - -# result["groups"].append(grp_data) - -# return Response(result, status=status.HTTP_200_OK) - -# backend/api/views.py - -from rest_framework import generics, viewsets, permissions, status -from rest_framework.parsers import MultiPartParser, FormParser, JSONParser -from rest_framework_simplejwt.views import TokenObtainPairView -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter -from django.contrib.auth import get_user_model - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = [permissions.AllowAny] - serializer_class = RegisterSerializer - - -class LoginView(TokenObtainPairView): - permission_classes = [permissions.AllowAny] - - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return self.queryset.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class LinkViewSet(viewsets.ModelViewSet): - queryset = Link.objects.all() - serializer_class = LinkSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class UserProfileView(generics.RetrieveAPIView): - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - def get_object(self): - return self.request.user - - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = [permissions.AllowAny] - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class PublicUserGroupsView(APIView): - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - user = get_object_or_404(User, username=username) - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - result = {"username": user.username, "groups": []} - - for grp in groups_qs: - grp_icon = grp.icon.url if grp.icon else None - grp_data = {"id": grp.id, "name": grp.name, "icon": grp_icon, "links": []} - - for ln in grp.links.all(): - link_icon = ln.icon.url if hasattr(ln.icon, 'url') else ln.icon - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": link_icon, - }) - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) diff --git a/.history/backend/api/views_20250507150101.py b/.history/backend/api/views_20250507150101.py deleted file mode 100644 index 91c4e90..0000000 --- a/.history/backend/api/views_20250507150101.py +++ /dev/null @@ -1,272 +0,0 @@ -# # backend/api/views.py - -# from rest_framework import generics, viewsets, permissions, status -# from django.contrib.auth import get_user_model -# from rest_framework_simplejwt.views import TokenObtainPairView -# from rest_framework.views import APIView -# from rest_framework.response import Response -# from django.shortcuts import get_object_or_404 -# from drf_spectacular.utils import extend_schema, OpenApiParameter - -# from .models import Link, LinkGroup -# from .serializers import ( -# RegisterSerializer, -# UserSerializer, -# LinkSerializer, -# LinkGroupSerializer, -# ) - -# User = get_user_model() - - -# @extend_schema( -# parameters=[ -# OpenApiParameter( -# name='id', -# type=int, -# location=OpenApiParameter.PATH -# ) -# ] -# ) -# class RegisterView(generics.CreateAPIView): -# """ -# POST /api/auth/register/ -# Регистрирует нового пользователя. -# """ -# queryset = User.objects.all() -# permission_classes = (permissions.AllowAny,) -# serializer_class = RegisterSerializer - - -# class LoginView(TokenObtainPairView): -# """ -# POST /api/auth/login/ -# Возвращает JWT-токены. -# """ -# permission_classes = (permissions.AllowAny,) - - -# class LinkGroupViewSet(viewsets.ModelViewSet): -# """ -# /api/groups/ -# CRUD для групп ссылок текущего пользователя. -# """ -# queryset = LinkGroup.objects.all() -# serializer_class = LinkGroupSerializer -# permission_classes = [permissions.IsAuthenticated] - -# def get_queryset(self): -# # Возвращаем только свои группы, упорядоченные по полю order -# return self.queryset.filter(owner=self.request.user).order_by('order') - -# def perform_create(self, serializer): -# # При создании модели автоматически ставим owner = текущий пользователь -# serializer.save(owner=self.request.user) - - -# class LinkViewSet(viewsets.ModelViewSet): -# """ -# /api/links/ -# CRUD для ссылок текущего пользователя. -# """ -# serializer_class = LinkSerializer -# permission_classes = (permissions.IsAuthenticated,) - -# def get_queryset(self): -# # Возвращаем только свои ссылки, упорядоченные по полю order -# return Link.objects.filter(owner=self.request.user).order_by('order') - -# def perform_create(self, serializer): -# # При создании модели автоматически ставим owner = текущий пользователь -# serializer.save(owner=self.request.user) - - -# class UserLinksListView(generics.ListAPIView): -# """ -# GET /api/users/{username}/links/ -# Список публичных ссылок пользователя (без группировки). -# """ -# serializer_class = LinkSerializer -# permission_classes = (permissions.AllowAny,) - -# def get_queryset(self): -# username = self.kwargs['username'] -# return Link.objects.filter(owner__username=username).order_by('order') - - -# class UserProfileView(generics.RetrieveAPIView): -# """ -# GET /api/auth/user/ -# Возвращает данные авторизованного пользователя. -# """ -# serializer_class = UserSerializer -# permission_classes = [permissions.IsAuthenticated] - -# def get_object(self): -# return self.request.user - - -# class PublicUserGroupsView(APIView): -# """ -# GET /api/users/{username}/public/ -# Возвращает публичные группы и ссылки пользователя. -# """ -# permission_classes = [permissions.AllowAny] - -# def get(self, request, username): -# user = get_object_or_404(User, username=username) - -# # Берем все группы пользователя вместе с их ссылками -# groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - -# result = { -# "username": user.username, -# "groups": [] -# } - -# for grp in groups_qs: -# # URL иконки группы (поле icon в модели) -# grp_icon_url = grp.icon.url if grp.icon else None - -# grp_data = { -# "id": grp.id, -# "name": grp.name, -# "icon": grp_icon_url, -# "links": [], -# } - -# for ln in grp.links.all(): -# # URL иконки ссылки (поле icon в модели Link — URLField) -# link_icon_url = ln.icon if ln.icon else None - -# grp_data["links"].append({ -# "id": ln.id, -# "title": ln.title, -# "url": ln.url, -# "icon": link_icon_url, -# }) - -# result["groups"].append(grp_data) - -# return Response(result, status=status.HTTP_200_OK) - -# backend/api/views.py - -from rest_framework import generics, viewsets, permissions, status -from rest_framework.parsers import MultiPartParser, FormParser, JSONParser -from rest_framework_simplejwt.views import TokenObtainPairView -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter -from django.contrib.auth import get_user_model - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = [permissions.AllowAny] - serializer_class = RegisterSerializer - - -class LoginView(TokenObtainPairView): - permission_classes = [permissions.AllowAny] - - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return self.queryset.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class LinkViewSet(viewsets.ModelViewSet): - queryset = Link.objects.all() - serializer_class = LinkSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class UserProfileView(generics.RetrieveAPIView): - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - def get_object(self): - return self.request.user - - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = [permissions.AllowAny] - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - # 1. Ищем пользователя - user = get_object_or_404(User, username=username) - - # 2. Берём его группы со ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # icon у группы (абсолютный URL) - grp_icon_url = None - if grp.icon: - grp_icon_url = request.build_absolute_uri(grp.icon.url) - - grp_data = { - "id": grp.id, - "name": grp.name, - "icon": grp_icon_url, - "links": [], - } - - for ln in grp.links.all(): - # icon у ссылки - ln_icon_url = None - if ln.icon: - ln_icon_url = request.build_absolute_uri(ln.icon.url) - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": ln_icon_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507150709.py b/.history/backend/api/views_20250507150709.py deleted file mode 100644 index f4f34ee..0000000 --- a/.history/backend/api/views_20250507150709.py +++ /dev/null @@ -1,267 +0,0 @@ -# # backend/api/views.py - -# from rest_framework import generics, viewsets, permissions, status -# from django.contrib.auth import get_user_model -# from rest_framework_simplejwt.views import TokenObtainPairView -# from rest_framework.views import APIView -# from rest_framework.response import Response -# from django.shortcuts import get_object_or_404 -# from drf_spectacular.utils import extend_schema, OpenApiParameter - -# from .models import Link, LinkGroup -# from .serializers import ( -# RegisterSerializer, -# UserSerializer, -# LinkSerializer, -# LinkGroupSerializer, -# ) - -# User = get_user_model() - - -# @extend_schema( -# parameters=[ -# OpenApiParameter( -# name='id', -# type=int, -# location=OpenApiParameter.PATH -# ) -# ] -# ) -# class RegisterView(generics.CreateAPIView): -# """ -# POST /api/auth/register/ -# Регистрирует нового пользователя. -# """ -# queryset = User.objects.all() -# permission_classes = (permissions.AllowAny,) -# serializer_class = RegisterSerializer - - -# class LoginView(TokenObtainPairView): -# """ -# POST /api/auth/login/ -# Возвращает JWT-токены. -# """ -# permission_classes = (permissions.AllowAny,) - - -# class LinkGroupViewSet(viewsets.ModelViewSet): -# """ -# /api/groups/ -# CRUD для групп ссылок текущего пользователя. -# """ -# queryset = LinkGroup.objects.all() -# serializer_class = LinkGroupSerializer -# permission_classes = [permissions.IsAuthenticated] - -# def get_queryset(self): -# # Возвращаем только свои группы, упорядоченные по полю order -# return self.queryset.filter(owner=self.request.user).order_by('order') - -# def perform_create(self, serializer): -# # При создании модели автоматически ставим owner = текущий пользователь -# serializer.save(owner=self.request.user) - - -# class LinkViewSet(viewsets.ModelViewSet): -# """ -# /api/links/ -# CRUD для ссылок текущего пользователя. -# """ -# serializer_class = LinkSerializer -# permission_classes = (permissions.IsAuthenticated,) - -# def get_queryset(self): -# # Возвращаем только свои ссылки, упорядоченные по полю order -# return Link.objects.filter(owner=self.request.user).order_by('order') - -# def perform_create(self, serializer): -# # При создании модели автоматически ставим owner = текущий пользователь -# serializer.save(owner=self.request.user) - - -# class UserLinksListView(generics.ListAPIView): -# """ -# GET /api/users/{username}/links/ -# Список публичных ссылок пользователя (без группировки). -# """ -# serializer_class = LinkSerializer -# permission_classes = (permissions.AllowAny,) - -# def get_queryset(self): -# username = self.kwargs['username'] -# return Link.objects.filter(owner__username=username).order_by('order') - - -# class UserProfileView(generics.RetrieveAPIView): -# """ -# GET /api/auth/user/ -# Возвращает данные авторизованного пользователя. -# """ -# serializer_class = UserSerializer -# permission_classes = [permissions.IsAuthenticated] - -# def get_object(self): -# return self.request.user - - -# class PublicUserGroupsView(APIView): -# """ -# GET /api/users/{username}/public/ -# Возвращает публичные группы и ссылки пользователя. -# """ -# permission_classes = [permissions.AllowAny] - -# def get(self, request, username): -# user = get_object_or_404(User, username=username) - -# # Берем все группы пользователя вместе с их ссылками -# groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - -# result = { -# "username": user.username, -# "groups": [] -# } - -# for grp in groups_qs: -# # URL иконки группы (поле icon в модели) -# grp_icon_url = grp.icon.url if grp.icon else None - -# grp_data = { -# "id": grp.id, -# "name": grp.name, -# "icon": grp_icon_url, -# "links": [], -# } - -# for ln in grp.links.all(): -# # URL иконки ссылки (поле icon в модели Link — URLField) -# link_icon_url = ln.icon if ln.icon else None - -# grp_data["links"].append({ -# "id": ln.id, -# "title": ln.title, -# "url": ln.url, -# "icon": link_icon_url, -# }) - -# result["groups"].append(grp_data) - -# return Response(result, status=status.HTTP_200_OK) - -# backend/api/views.py - -from rest_framework import generics, viewsets, permissions, status -from rest_framework.parsers import MultiPartParser, FormParser, JSONParser -from rest_framework_simplejwt.views import TokenObtainPairView -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter -from django.contrib.auth import get_user_model - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = [permissions.AllowAny] - serializer_class = RegisterSerializer - - -class LoginView(TokenObtainPairView): - permission_classes = [permissions.AllowAny] - - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return self.queryset.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class LinkViewSet(viewsets.ModelViewSet): - queryset = Link.objects.all() - serializer_class = LinkSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class UserProfileView(generics.RetrieveAPIView): - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - def get_object(self): - return self.request.user - - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = [permissions.AllowAny] - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - user = get_object_or_404(User, username=username) - - # Берём все группы пользователя вместе с их ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # поле icon у группы — это ImageField - grp_icon_url = grp.icon.url if grp.icon else None - - grp_data = { - "id": grp.id, - "name": grp.name, - "image": grp_icon_url, # отдаём под ключом "image", как ждёт фронт - "links": [], - } - - for ln in grp.links.all(): - # поле icon у ссылки — это URLField, сразу строка - link_icon_url = ln.icon if ln.icon else None - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "image": link_icon_url, # тоже "image" - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507150738.py b/.history/backend/api/views_20250507150738.py deleted file mode 100644 index 91c4e90..0000000 --- a/.history/backend/api/views_20250507150738.py +++ /dev/null @@ -1,272 +0,0 @@ -# # backend/api/views.py - -# from rest_framework import generics, viewsets, permissions, status -# from django.contrib.auth import get_user_model -# from rest_framework_simplejwt.views import TokenObtainPairView -# from rest_framework.views import APIView -# from rest_framework.response import Response -# from django.shortcuts import get_object_or_404 -# from drf_spectacular.utils import extend_schema, OpenApiParameter - -# from .models import Link, LinkGroup -# from .serializers import ( -# RegisterSerializer, -# UserSerializer, -# LinkSerializer, -# LinkGroupSerializer, -# ) - -# User = get_user_model() - - -# @extend_schema( -# parameters=[ -# OpenApiParameter( -# name='id', -# type=int, -# location=OpenApiParameter.PATH -# ) -# ] -# ) -# class RegisterView(generics.CreateAPIView): -# """ -# POST /api/auth/register/ -# Регистрирует нового пользователя. -# """ -# queryset = User.objects.all() -# permission_classes = (permissions.AllowAny,) -# serializer_class = RegisterSerializer - - -# class LoginView(TokenObtainPairView): -# """ -# POST /api/auth/login/ -# Возвращает JWT-токены. -# """ -# permission_classes = (permissions.AllowAny,) - - -# class LinkGroupViewSet(viewsets.ModelViewSet): -# """ -# /api/groups/ -# CRUD для групп ссылок текущего пользователя. -# """ -# queryset = LinkGroup.objects.all() -# serializer_class = LinkGroupSerializer -# permission_classes = [permissions.IsAuthenticated] - -# def get_queryset(self): -# # Возвращаем только свои группы, упорядоченные по полю order -# return self.queryset.filter(owner=self.request.user).order_by('order') - -# def perform_create(self, serializer): -# # При создании модели автоматически ставим owner = текущий пользователь -# serializer.save(owner=self.request.user) - - -# class LinkViewSet(viewsets.ModelViewSet): -# """ -# /api/links/ -# CRUD для ссылок текущего пользователя. -# """ -# serializer_class = LinkSerializer -# permission_classes = (permissions.IsAuthenticated,) - -# def get_queryset(self): -# # Возвращаем только свои ссылки, упорядоченные по полю order -# return Link.objects.filter(owner=self.request.user).order_by('order') - -# def perform_create(self, serializer): -# # При создании модели автоматически ставим owner = текущий пользователь -# serializer.save(owner=self.request.user) - - -# class UserLinksListView(generics.ListAPIView): -# """ -# GET /api/users/{username}/links/ -# Список публичных ссылок пользователя (без группировки). -# """ -# serializer_class = LinkSerializer -# permission_classes = (permissions.AllowAny,) - -# def get_queryset(self): -# username = self.kwargs['username'] -# return Link.objects.filter(owner__username=username).order_by('order') - - -# class UserProfileView(generics.RetrieveAPIView): -# """ -# GET /api/auth/user/ -# Возвращает данные авторизованного пользователя. -# """ -# serializer_class = UserSerializer -# permission_classes = [permissions.IsAuthenticated] - -# def get_object(self): -# return self.request.user - - -# class PublicUserGroupsView(APIView): -# """ -# GET /api/users/{username}/public/ -# Возвращает публичные группы и ссылки пользователя. -# """ -# permission_classes = [permissions.AllowAny] - -# def get(self, request, username): -# user = get_object_or_404(User, username=username) - -# # Берем все группы пользователя вместе с их ссылками -# groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - -# result = { -# "username": user.username, -# "groups": [] -# } - -# for grp in groups_qs: -# # URL иконки группы (поле icon в модели) -# grp_icon_url = grp.icon.url if grp.icon else None - -# grp_data = { -# "id": grp.id, -# "name": grp.name, -# "icon": grp_icon_url, -# "links": [], -# } - -# for ln in grp.links.all(): -# # URL иконки ссылки (поле icon в модели Link — URLField) -# link_icon_url = ln.icon if ln.icon else None - -# grp_data["links"].append({ -# "id": ln.id, -# "title": ln.title, -# "url": ln.url, -# "icon": link_icon_url, -# }) - -# result["groups"].append(grp_data) - -# return Response(result, status=status.HTTP_200_OK) - -# backend/api/views.py - -from rest_framework import generics, viewsets, permissions, status -from rest_framework.parsers import MultiPartParser, FormParser, JSONParser -from rest_framework_simplejwt.views import TokenObtainPairView -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter -from django.contrib.auth import get_user_model - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = [permissions.AllowAny] - serializer_class = RegisterSerializer - - -class LoginView(TokenObtainPairView): - permission_classes = [permissions.AllowAny] - - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return self.queryset.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class LinkViewSet(viewsets.ModelViewSet): - queryset = Link.objects.all() - serializer_class = LinkSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class UserProfileView(generics.RetrieveAPIView): - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - def get_object(self): - return self.request.user - - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = [permissions.AllowAny] - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - # 1. Ищем пользователя - user = get_object_or_404(User, username=username) - - # 2. Берём его группы со ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # icon у группы (абсолютный URL) - grp_icon_url = None - if grp.icon: - grp_icon_url = request.build_absolute_uri(grp.icon.url) - - grp_data = { - "id": grp.id, - "name": grp.name, - "icon": grp_icon_url, - "links": [], - } - - for ln in grp.links.all(): - # icon у ссылки - ln_icon_url = None - if ln.icon: - ln_icon_url = request.build_absolute_uri(ln.icon.url) - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": ln_icon_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507150907.py b/.history/backend/api/views_20250507150907.py deleted file mode 100644 index f655d7d..0000000 --- a/.history/backend/api/views_20250507150907.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 -from rest_framework import generics, viewsets, permissions, status -from rest_framework.parsers import MultiPartParser, FormParser, JSONParser -from rest_framework_simplejwt.views import TokenObtainPairView -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter -from django.contrib.auth import get_user_model - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = [permissions.AllowAny] - serializer_class = RegisterSerializer - - -class LoginView(TokenObtainPairView): - permission_classes = [permissions.AllowAny] - - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return self.queryset.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class LinkViewSet(viewsets.ModelViewSet): - queryset = Link.objects.all() - serializer_class = LinkSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class UserProfileView(generics.RetrieveAPIView): - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - def get_object(self): - return self.request.user - - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = [permissions.AllowAny] - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - # 1. Ищем пользователя - user = get_object_or_404(User, username=username) - - # 2. Берём его группы со ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # icon у группы (абсолютный URL) - grp_icon_url = None - if grp.icon: - grp_icon_url = request.build_absolute_uri(grp.icon.url) - - grp_data = { - "id": grp.id, - "name": grp.name, - "icon": grp_icon_url, - "links": [], - } - - for ln in grp.links.all(): - # icon у ссылки - ln_icon_url = None - if ln.icon: - ln_icon_url = request.build_absolute_uri(ln.icon.url) - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": ln_icon_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20250507151205.py b/.history/backend/api/views_20250507151205.py deleted file mode 100644 index 6e50d67..0000000 --- a/.history/backend/api/views_20250507151205.py +++ /dev/null @@ -1,150 +0,0 @@ -# api/views.py - -from django.contrib.auth import get_user_model -from django.shortcuts import get_object_or_404 - -from rest_framework import generics, viewsets, permissions, status -from rest_framework.views import APIView -from rest_framework.response import Response -from rest_framework_simplejwt.views import TokenObtainPairView - -from drf_spectacular.utils import extend_schema, OpenApiParameter - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -@extend_schema( - parameters=[ - OpenApiParameter( - name='id', - type=int, - location=OpenApiParameter.PATH, - description='ID создаваемого или изменяемого объекта', - ) - ] -) -class RegisterView(generics.CreateAPIView): - """ - POST /api/auth/register/ - Регистрация нового пользователя. - """ - queryset = User.objects.all() - permission_classes = (permissions.AllowAny,) - serializer_class = RegisterSerializer - - -class LoginView(TokenObtainPairView): - """ - POST /api/auth/login/ - Получение JWT-токенов для входа. - """ - permission_classes = (permissions.AllowAny,) - - -class LinkGroupViewSet(viewsets.ModelViewSet): - """ - CRUD для групп ссылок текущего пользователя. - /api/groups/ - """ - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - # Только свои группы - return self.queryset.filter(owner=self.request.user).order_by('order') - - -class LinkViewSet(viewsets.ModelViewSet): - """ - CRUD для ссылок текущего пользователя. - /api/links/ - """ - serializer_class = LinkSerializer - permission_classes = [permissions.IsAuthenticated] - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - # При создании автоматически ставим владельца - serializer.save(owner=self.request.user) - - -class UserLinksListView(generics.ListAPIView): - """ - GET /api/users/{username}/links/ - Список всех ссылок публичного пользователя. - """ - serializer_class = LinkSerializer - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class UserProfileView(generics.RetrieveAPIView): - """ - GET /api/auth/user/ - Данные текущего авторизованного пользователя. - """ - serializer_class = UserSerializer - permission_classes = (permissions.IsAuthenticated,) - - def get_object(self): - return self.request.user - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - Публичные группы ссылок пользователя вместе с их ссылками. - """ - permission_classes = (permissions.AllowAny,) - - def get(self, request, username): - # Находим пользователя по имени - user = get_object_or_404(User, username=username) - - # Берём его группы с предзагрузкой ссылок - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # иконка группы (ImageField) - grp_icon_url = grp.icon.url if grp.icon else None - - grp_data = { - "id": grp.id, - "name": grp.name, - "image": grp_icon_url, - "links": [] - } - - for ln in grp.links.all(): - # иконка ссылки (URLField) - link_icon_url = ln.icon if ln.icon else None - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "image": link_icon_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) diff --git a/.history/backend/api/views_20250507151600.py b/.history/backend/api/views_20250507151600.py deleted file mode 100644 index f655d7d..0000000 --- a/.history/backend/api/views_20250507151600.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 -from rest_framework import generics, viewsets, permissions, status -from rest_framework.parsers import MultiPartParser, FormParser, JSONParser -from rest_framework_simplejwt.views import TokenObtainPairView -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from drf_spectacular.utils import extend_schema, OpenApiParameter -from django.contrib.auth import get_user_model - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = [permissions.AllowAny] - serializer_class = RegisterSerializer - - -class LoginView(TokenObtainPairView): - permission_classes = [permissions.AllowAny] - - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return self.queryset.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class LinkViewSet(viewsets.ModelViewSet): - queryset = Link.objects.all() - serializer_class = LinkSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class UserProfileView(generics.RetrieveAPIView): - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - def get_object(self): - return self.request.user - - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = [permissions.AllowAny] - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - # 1. Ищем пользователя - user = get_object_or_404(User, username=username) - - # 2. Берём его группы со ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # icon у группы (абсолютный URL) - grp_icon_url = None - if grp.icon: - grp_icon_url = request.build_absolute_uri(grp.icon.url) - - grp_data = { - "id": grp.id, - "name": grp.name, - "icon": grp_icon_url, - "links": [], - } - - for ln in grp.links.all(): - # icon у ссылки - ln_icon_url = None - if ln.icon: - ln_icon_url = request.build_absolute_uri(ln.icon.url) - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": ln_icon_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20251029194226.py b/.history/backend/api/views_20251029194226.py deleted file mode 100644 index c766558..0000000 --- a/.history/backend/api/views_20251029194226.py +++ /dev/null @@ -1,121 +0,0 @@ -# coding: utf-8 -from rest_framework import generics, viewsets, permissions, status -from rest_framework.parsers import MultiPartParser, FormParser, JSONParser -from rest_framework_simplejwt.views import TokenObtainPairView -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from django.views.decorators.csrf import csrf_exempt -from django.utils.decorators import method_decorator -from drf_spectacular.utils import extend_schema, OpenApiParameter -from django.contrib.auth import get_user_model - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = [permissions.AllowAny] - serializer_class = RegisterSerializer - - -class LoginView(TokenObtainPairView): - permission_classes = [permissions.AllowAny] - - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return self.queryset.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class LinkViewSet(viewsets.ModelViewSet): - queryset = Link.objects.all() - serializer_class = LinkSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class UserProfileView(generics.RetrieveAPIView): - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - def get_object(self): - return self.request.user - - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = [permissions.AllowAny] - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - # 1. Ищем пользователя - user = get_object_or_404(User, username=username) - - # 2. Берём его группы со ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # icon у группы (абсолютный URL) - grp_icon_url = None - if grp.icon: - grp_icon_url = request.build_absolute_uri(grp.icon.url) - - grp_data = { - "id": grp.id, - "name": grp.name, - "icon": grp_icon_url, - "links": [], - } - - for ln in grp.links.all(): - # icon у ссылки - ln_icon_url = None - if ln.icon: - ln_icon_url = request.build_absolute_uri(ln.icon.url) - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": ln_icon_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20251029194232.py b/.history/backend/api/views_20251029194232.py deleted file mode 100644 index b2f9d3a..0000000 --- a/.history/backend/api/views_20251029194232.py +++ /dev/null @@ -1,122 +0,0 @@ -# coding: utf-8 -from rest_framework import generics, viewsets, permissions, status -from rest_framework.parsers import MultiPartParser, FormParser, JSONParser -from rest_framework_simplejwt.views import TokenObtainPairView -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from django.views.decorators.csrf import csrf_exempt -from django.utils.decorators import method_decorator -from drf_spectacular.utils import extend_schema, OpenApiParameter -from django.contrib.auth import get_user_model - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = [permissions.AllowAny] - serializer_class = RegisterSerializer - - -@method_decorator(csrf_exempt, name='dispatch') -class LoginView(TokenObtainPairView): - permission_classes = [permissions.AllowAny] - - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return self.queryset.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class LinkViewSet(viewsets.ModelViewSet): - queryset = Link.objects.all() - serializer_class = LinkSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class UserProfileView(generics.RetrieveAPIView): - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - def get_object(self): - return self.request.user - - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = [permissions.AllowAny] - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - # 1. Ищем пользователя - user = get_object_or_404(User, username=username) - - # 2. Берём его группы со ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # icon у группы (абсолютный URL) - grp_icon_url = None - if grp.icon: - grp_icon_url = request.build_absolute_uri(grp.icon.url) - - grp_data = { - "id": grp.id, - "name": grp.name, - "icon": grp_icon_url, - "links": [], - } - - for ln in grp.links.all(): - # icon у ссылки - ln_icon_url = None - if ln.icon: - ln_icon_url = request.build_absolute_uri(ln.icon.url) - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": ln_icon_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/api/views_20251029194257.py b/.history/backend/api/views_20251029194257.py deleted file mode 100644 index b2f9d3a..0000000 --- a/.history/backend/api/views_20251029194257.py +++ /dev/null @@ -1,122 +0,0 @@ -# coding: utf-8 -from rest_framework import generics, viewsets, permissions, status -from rest_framework.parsers import MultiPartParser, FormParser, JSONParser -from rest_framework_simplejwt.views import TokenObtainPairView -from rest_framework.views import APIView -from rest_framework.response import Response -from django.shortcuts import get_object_or_404 -from django.views.decorators.csrf import csrf_exempt -from django.utils.decorators import method_decorator -from drf_spectacular.utils import extend_schema, OpenApiParameter -from django.contrib.auth import get_user_model - -from .models import Link, LinkGroup -from .serializers import ( - RegisterSerializer, - UserSerializer, - LinkSerializer, - LinkGroupSerializer, -) - -User = get_user_model() - - -class RegisterView(generics.CreateAPIView): - queryset = User.objects.all() - permission_classes = [permissions.AllowAny] - serializer_class = RegisterSerializer - - -@method_decorator(csrf_exempt, name='dispatch') -class LoginView(TokenObtainPairView): - permission_classes = [permissions.AllowAny] - - -class LinkGroupViewSet(viewsets.ModelViewSet): - queryset = LinkGroup.objects.all() - serializer_class = LinkGroupSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return self.queryset.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class LinkViewSet(viewsets.ModelViewSet): - queryset = Link.objects.all() - serializer_class = LinkSerializer - permission_classes = [permissions.IsAuthenticated] - parser_classes = [MultiPartParser, FormParser, JSONParser] - - def get_queryset(self): - return Link.objects.filter(owner=self.request.user).order_by('order') - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class UserProfileView(generics.RetrieveAPIView): - serializer_class = UserSerializer - permission_classes = [permissions.IsAuthenticated] - def get_object(self): - return self.request.user - - -class UserLinksListView(generics.ListAPIView): - serializer_class = LinkSerializer - permission_classes = [permissions.AllowAny] - def get_queryset(self): - username = self.kwargs['username'] - return Link.objects.filter(owner__username=username).order_by('order') - - -class PublicUserGroupsView(APIView): - """ - GET /api/users/{username}/public/ - """ - permission_classes = [permissions.AllowAny] - - def get(self, request, username): - # 1. Ищем пользователя - user = get_object_or_404(User, username=username) - - # 2. Берём его группы со ссылками - groups_qs = LinkGroup.objects.filter(owner=user).prefetch_related('links') - - result = { - "username": user.username, - "groups": [] - } - - for grp in groups_qs: - # icon у группы (абсолютный URL) - grp_icon_url = None - if grp.icon: - grp_icon_url = request.build_absolute_uri(grp.icon.url) - - grp_data = { - "id": grp.id, - "name": grp.name, - "icon": grp_icon_url, - "links": [], - } - - for ln in grp.links.all(): - # icon у ссылки - ln_icon_url = None - if ln.icon: - ln_icon_url = request.build_absolute_uri(ln.icon.url) - - grp_data["links"].append({ - "id": ln.id, - "title": ln.title, - "url": ln.url, - "icon": ln_icon_url, - }) - - result["groups"].append(grp_data) - - return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/.history/backend/backend/settings_20250506100311.py b/.history/backend/backend/settings_20250506100311.py deleted file mode 100644 index b0dee79..0000000 --- a/.history/backend/backend/settings_20250506100311.py +++ /dev/null @@ -1,122 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0=' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = [] - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506100423.py b/.history/backend/backend/settings_20250506100423.py deleted file mode 100644 index 411bf02..0000000 --- a/.history/backend/backend/settings_20250506100423.py +++ /dev/null @@ -1,125 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-n^xvyde5bhrcpk))wj!z4+pczy+i&*6d97pe&)8_2_5+q5gl0=' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = [] - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506100501.py b/.history/backend/backend/settings_20250506100501.py deleted file mode 100644 index b18e0a3..0000000 --- a/.history/backend/backend/settings_20250506100501.py +++ /dev/null @@ -1,129 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = '' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = [] - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506100658.py b/.history/backend/backend/settings_20250506100658.py deleted file mode 100644 index aa52e6a..0000000 --- a/.history/backend/backend/settings_20250506100658.py +++ /dev/null @@ -1,129 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = [] - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506100717.py b/.history/backend/backend/settings_20250506100717.py deleted file mode 100644 index 5d0874e..0000000 --- a/.history/backend/backend/settings_20250506100717.py +++ /dev/null @@ -1,129 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '').split(',') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506101214.py b/.history/backend/backend/settings_20250506101214.py deleted file mode 100644 index 52dc9eb..0000000 --- a/.history/backend/backend/settings_20250506101214.py +++ /dev/null @@ -1,133 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '').split(',') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': env('DATABASE_ENGINE'), # e.g. django.db.backends.postgresql - 'NAME': env('DATABASE_NAME'), # e.g. links - 'USER': env('DATABASE_USER'), # e.g. admin - 'PASSWORD': env('DATABASE_PASSWORD'), # e.g. admin - 'HOST': env('DATABASE_HOST'), # e.g. db - 'PORT': env('DATABASE_PORT'), # e.g. 5432 - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506101323.py b/.history/backend/backend/settings_20250506101323.py deleted file mode 100644 index d8a351d..0000000 --- a/.history/backend/backend/settings_20250506101323.py +++ /dev/null @@ -1,133 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '').split(',') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506101656.py b/.history/backend/backend/settings_20250506101656.py deleted file mode 100644 index e5f7131..0000000 --- a/.history/backend/backend/settings_20250506101656.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '').split(',') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506103339.py b/.history/backend/backend/settings_20250506103339.py deleted file mode 100644 index 31e03c3..0000000 --- a/.history/backend/backend/settings_20250506103339.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506103521.py b/.history/backend/backend/settings_20250506103521.py deleted file mode 100644 index 6fe04ea..0000000 --- a/.history/backend/backend/settings_20250506103521.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = [f'{os.getenv('DJANGO_ALLOWED_HOSTS')}',] - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506103546.py b/.history/backend/backend/settings_20250506103546.py deleted file mode 100644 index 3435ad9..0000000 --- a/.history/backend/backend/settings_20250506103546.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506103557.py b/.history/backend/backend/settings_20250506103557.py deleted file mode 100644 index be41910..0000000 --- a/.history/backend/backend/settings_20250506103557.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '0.0.0.0').split(',') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506103609.py b/.history/backend/backend/settings_20250506103609.py deleted file mode 100644 index 406978d..0000000 --- a/.history/backend/backend/settings_20250506103609.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506130832.py b/.history/backend/backend/settings_20250506130832.py deleted file mode 100644 index 359059f..0000000 --- a/.history/backend/backend/settings_20250506130832.py +++ /dev/null @@ -1,137 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506130857.py b/.history/backend/backend/settings_20250506130857.py deleted file mode 100644 index b9fb477..0000000 --- a/.history/backend/backend/settings_20250506130857.py +++ /dev/null @@ -1,152 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506160856.py b/.history/backend/backend/settings_20250506160856.py deleted file mode 100644 index 042feea..0000000 --- a/.history/backend/backend/settings_20250506160856.py +++ /dev/null @@ -1,153 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506160905.py b/.history/backend/backend/settings_20250506160905.py deleted file mode 100644 index 042feea..0000000 --- a/.history/backend/backend/settings_20250506160905.py +++ /dev/null @@ -1,153 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506170034.py b/.history/backend/backend/settings_20250506170034.py deleted file mode 100644 index 40425d0..0000000 --- a/.history/backend/backend/settings_20250506170034.py +++ /dev/null @@ -1,154 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506170049.py b/.history/backend/backend/settings_20250506170049.py deleted file mode 100644 index 595b80e..0000000 --- a/.history/backend/backend/settings_20250506170049.py +++ /dev/null @@ -1,155 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506170104.py b/.history/backend/backend/settings_20250506170104.py deleted file mode 100644 index a7bc05a..0000000 --- a/.history/backend/backend/settings_20250506170104.py +++ /dev/null @@ -1,159 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.history/backend/backend/settings_20250506185005.py b/.history/backend/backend/settings_20250506185005.py deleted file mode 100644 index 7234939..0000000 --- a/.history/backend/backend/settings_20250506185005.py +++ /dev/null @@ -1,162 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20250506185447.py b/.history/backend/backend/settings_20250506185447.py deleted file mode 100644 index a38b097..0000000 --- a/.history/backend/backend/settings_20250506185447.py +++ /dev/null @@ -1,162 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage/' \ No newline at end of file diff --git a/.history/backend/backend/settings_20250506190303.py b/.history/backend/backend/settings_20250506190303.py deleted file mode 100644 index 7234939..0000000 --- a/.history/backend/backend/settings_20250506190303.py +++ /dev/null @@ -1,162 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20250507080801.py b/.history/backend/backend/settings_20250507080801.py deleted file mode 100644 index 4cf2897..0000000 --- a/.history/backend/backend/settings_20250507080801.py +++ /dev/null @@ -1,164 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'drf_spectacular', - 'drf_spectacular_sidecar', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20250507080850.py b/.history/backend/backend/settings_20250507080850.py deleted file mode 100644 index 037ea01..0000000 --- a/.history/backend/backend/settings_20250507080850.py +++ /dev/null @@ -1,165 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'drf_spectacular', - 'drf_spectacular_sidecar', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20250507081134.py b/.history/backend/backend/settings_20250507081134.py deleted file mode 100644 index 23852c2..0000000 --- a/.history/backend/backend/settings_20250507081134.py +++ /dev/null @@ -1,165 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20250507081237.py b/.history/backend/backend/settings_20250507081237.py deleted file mode 100644 index fa73ebc..0000000 --- a/.history/backend/backend/settings_20250507081237.py +++ /dev/null @@ -1,165 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20250507082006.py b/.history/backend/backend/settings_20250507082006.py deleted file mode 100644 index 3668ee2..0000000 --- a/.history/backend/backend/settings_20250507082006.py +++ /dev/null @@ -1,166 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20250507082028.py b/.history/backend/backend/settings_20250507082028.py deleted file mode 100644 index 8ed99f0..0000000 --- a/.history/backend/backend/settings_20250507082028.py +++ /dev/null @@ -1,168 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20251029192450.py b/.history/backend/backend/settings_20251029192450.py deleted file mode 100644 index c12974f..0000000 --- a/.history/backend/backend/settings_20251029192450.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20251029192459.py b/.history/backend/backend/settings_20251029192459.py deleted file mode 100644 index 32aeb90..0000000 --- a/.history/backend/backend/settings_20251029192459.py +++ /dev/null @@ -1,173 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' - -# WhiteNoise настройки -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20251029192513.py b/.history/backend/backend/settings_20251029192513.py deleted file mode 100644 index 32aeb90..0000000 --- a/.history/backend/backend/settings_20251029192513.py +++ /dev/null @@ -1,173 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' - -# WhiteNoise настройки -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20251029193528.py b/.history/backend/backend/settings_20251029193528.py deleted file mode 100644 index efd43df..0000000 --- a/.history/backend/backend/settings_20251029193528.py +++ /dev/null @@ -1,178 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3000", - "http://localhost:3000", - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -CORS_ALLOW_ALL_ORIGINS = True # Для разработки -CORS_ALLOW_CREDENTIALS = True - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' - -# WhiteNoise настройки -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20251029193531.py b/.history/backend/backend/settings_20251029193531.py deleted file mode 100644 index efd43df..0000000 --- a/.history/backend/backend/settings_20251029193531.py +++ /dev/null @@ -1,178 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3000", - "http://localhost:3000", - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -CORS_ALLOW_ALL_ORIGINS = True # Для разработки -CORS_ALLOW_CREDENTIALS = True - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' - -# WhiteNoise настройки -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20251029194048.py b/.history/backend/backend/settings_20251029194048.py deleted file mode 100644 index 28ba1bc..0000000 --- a/.history/backend/backend/settings_20251029194048.py +++ /dev/null @@ -1,189 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3000", - "http://localhost:3000", - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -CORS_ALLOW_ALL_ORIGINS = True # Для разработки -CORS_ALLOW_CREDENTIALS = True -CORS_ALLOW_HEADERS = [ - 'accept', - 'accept-encoding', - 'authorization', - 'content-type', - 'dnt', - 'origin', - 'user-agent', - 'x-csrftoken', - 'x-requested-with', -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ), - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' - -# WhiteNoise настройки -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20251029194251.py b/.history/backend/backend/settings_20251029194251.py deleted file mode 100644 index 5c7e834..0000000 --- a/.history/backend/backend/settings_20251029194251.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3000", - "http://localhost:3000", - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -CORS_ALLOW_ALL_ORIGINS = True # Для разработки -CORS_ALLOW_CREDENTIALS = True -CORS_ALLOW_HEADERS = [ - 'accept', - 'accept-encoding', - 'authorization', - 'content-type', - 'dnt', - 'origin', - 'user-agent', - 'x-csrftoken', - 'x-requested-with', -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': [ - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ], - 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ], - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', - 'DEFAULT_RENDERER_CLASSES': [ - 'rest_framework.renderers.JSONRenderer', - ], -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' - -# WhiteNoise настройки -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20251029194257.py b/.history/backend/backend/settings_20251029194257.py deleted file mode 100644 index 5c7e834..0000000 --- a/.history/backend/backend/settings_20251029194257.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3000", - "http://localhost:3000", - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -CORS_ALLOW_ALL_ORIGINS = True # Для разработки -CORS_ALLOW_CREDENTIALS = True -CORS_ALLOW_HEADERS = [ - 'accept', - 'accept-encoding', - 'authorization', - 'content-type', - 'dnt', - 'origin', - 'user-agent', - 'x-csrftoken', - 'x-requested-with', -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': [ - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ], - 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ], - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', - 'DEFAULT_RENDERER_CLASSES': [ - 'rest_framework.renderers.JSONRenderer', - ], -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' - -# WhiteNoise настройки -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20251029194435.py b/.history/backend/backend/settings_20251029194435.py deleted file mode 100644 index 28d42bf..0000000 --- a/.history/backend/backend/settings_20251029194435.py +++ /dev/null @@ -1,195 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -# Отключаем APPEND_SLASH для корректной работы API с Next.js proxy -APPEND_SLASH = False - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3000", - "http://localhost:3000", - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -CORS_ALLOW_ALL_ORIGINS = True # Для разработки -CORS_ALLOW_CREDENTIALS = True -CORS_ALLOW_HEADERS = [ - 'accept', - 'accept-encoding', - 'authorization', - 'content-type', - 'dnt', - 'origin', - 'user-agent', - 'x-csrftoken', - 'x-requested-with', -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': [ - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ], - 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ], - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', - 'DEFAULT_RENDERER_CLASSES': [ - 'rest_framework.renderers.JSONRenderer', - ], -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' - -# WhiteNoise настройки -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/settings_20251029194437.py b/.history/backend/backend/settings_20251029194437.py deleted file mode 100644 index 28d42bf..0000000 --- a/.history/backend/backend/settings_20251029194437.py +++ /dev/null @@ -1,195 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 5.2. - -For more information on this file, see -https://docs.djangoproject.com/en/5.2/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/5.2/ref/settings/ -""" - -from pathlib import Path -from dotenv import load_dotenv -import os -# Load environment variables from .env file -load_dotenv() - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True' - -ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') - -# Отключаем APPEND_SLASH для корректной работы API с Next.js proxy -APPEND_SLASH = False - -CORS_ALLOWED_ORIGINS = [ - "http://127.0.0.1:3000", - "http://localhost:3000", - "http://127.0.0.1:3001", - "http://localhost:3001", -] - -CORS_ALLOW_ALL_ORIGINS = True # Для разработки -CORS_ALLOW_CREDENTIALS = True -CORS_ALLOW_HEADERS = [ - 'accept', - 'accept-encoding', - 'authorization', - 'content-type', - 'dnt', - 'origin', - 'user-agent', - 'x-csrftoken', - 'x-requested-with', -] - -# Application definition - -INSTALLED_APPS = [ - "corsheaders", - 'drf_spectacular', - "drf_spectacular_sidecar", - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'users', - 'links', - 'customization', - 'api', - 'rest_framework', - 'rest_framework_simplejwt', - 'django_extensions', -] - -MIDDLEWARE = [ - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'backend.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'backend.wsgi.application' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': [ - 'rest_framework_simplejwt.authentication.JWTAuthentication', - ], - 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - ], - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', - 'DEFAULT_RENDERER_CLASSES': [ - 'rest_framework.renderers.JSONRenderer', - ], -} - -from datetime import timedelta -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'AUTH_HEADER_TYPES': ('Bearer',), -} - -# Database -# https://docs.djangoproject.com/en/5.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': os.getenv('DATABASE_ENGINE', 'django.db.backends.postgresql'), - 'NAME': os.getenv('DATABASE_NAME'), - 'USER': os.getenv('DATABASE_USER'), - 'PASSWORD': os.getenv('DATABASE_PASSWORD'), - 'HOST': os.getenv('DATABASE_HOST'), - 'PORT': os.getenv('DATABASE_PORT'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators - -AUTH_USER_MODEL = 'users.User' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/5.2/topics/i18n/ - -LANGUAGE_CODE = 'ru-ru' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/5.2/howto/static-files/ - -STATIC_ROOT = BASE_DIR / 'staticfiles' - -# URL, по которому статика будет доступна -STATIC_URL = '/static/' - -# WhiteNoise настройки -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - -# Default primary key field type -# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -MEDIA_URL = '/storage/' -MEDIA_ROOT = BASE_DIR / 'storage' \ No newline at end of file diff --git a/.history/backend/backend/urls_20250506100311.py b/.history/backend/backend/urls_20250506100311.py deleted file mode 100644 index c677216..0000000 --- a/.history/backend/backend/urls_20250506100311.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -URL configuration for backend project. - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/5.2/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" -from django.contrib import admin -from django.urls import path - -urlpatterns = [ - path('admin/', admin.site.urls), -] diff --git a/.history/backend/backend/urls_20250506131502.py b/.history/backend/backend/urls_20250506131502.py deleted file mode 100644 index b05ed2c..0000000 --- a/.history/backend/backend/urls_20250506131502.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -URL configuration for backend project. - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/5.2/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" -from django.contrib import admin -from django.urls import path, include - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), - path('users/', include('users.urls')), - path('links/', include('links.urls')), - path('customization/', include('customization.urls')), - path('auth/', include('rest_framework.urls', namespace='rest_framework') -] diff --git a/.history/backend/backend/urls_20250506131519.py b/.history/backend/backend/urls_20250506131519.py deleted file mode 100644 index 684f762..0000000 --- a/.history/backend/backend/urls_20250506131519.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -URL configuration for backend project. - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/5.2/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" -from django.contrib import admin -from django.urls import path, include - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), - path('users/', include('users.urls')), - path('links/', include('links.urls')), - path('customization/', include('customization.urls')), - path('auth/', include('rest_framework.urls', namespace='rest_framework')) -] diff --git a/.history/backend/backend/urls_20250506161126.py b/.history/backend/backend/urls_20250506161126.py deleted file mode 100644 index 3ac0136..0000000 --- a/.history/backend/backend/urls_20250506161126.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -URL configuration for backend project. - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/5.2/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" -from django.contrib import admin -from django.urls import path, include - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), - path('users/', include('users.urls')), - path('links/', include('links.urls')), - path('customization/', include('customization.urls')), - path('auth/', include('api.urls', namespace='rest_framework')) -] diff --git a/.history/backend/backend/urls_20250506161130.py b/.history/backend/backend/urls_20250506161130.py deleted file mode 100644 index e67ee03..0000000 --- a/.history/backend/backend/urls_20250506161130.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -URL configuration for backend project. - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/5.2/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" -from django.contrib import admin -from django.urls import path, include - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), - path('users/', include('users.urls')), - path('links/', include('links.urls')), - path('customization/', include('customization.urls')), - path('auth/', include('api.urls', namespace='api')) -] diff --git a/.history/backend/backend/urls_20250506161210.py b/.history/backend/backend/urls_20250506161210.py deleted file mode 100644 index 684f762..0000000 --- a/.history/backend/backend/urls_20250506161210.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -URL configuration for backend project. - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/5.2/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" -from django.contrib import admin -from django.urls import path, include - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), - path('users/', include('users.urls')), - path('links/', include('links.urls')), - path('customization/', include('customization.urls')), - path('auth/', include('rest_framework.urls', namespace='rest_framework')) -] diff --git a/.history/backend/backend/urls_20250506161305.py b/.history/backend/backend/urls_20250506161305.py deleted file mode 100644 index 05a1772..0000000 --- a/.history/backend/backend/urls_20250506161305.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.contrib import admin -from django.urls import path, include - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), # API endpoints - path('users/', include('users.urls')), # User management app - path('links/', include('links.urls')), # Link management app - path('customization/', include('customization.urls')), # Design customization app - path('auth/', include('rest_framework.urls', namespace='rest_framework')), # DRF login/logout -] diff --git a/.history/backend/backend/urls_20250506161315.py b/.history/backend/backend/urls_20250506161315.py deleted file mode 100644 index 1e8e712..0000000 --- a/.history/backend/backend/urls_20250506161315.py +++ /dev/null @@ -1,54 +0,0 @@ -from django.contrib import admin -from django.urls import path, include - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), # API endpoints - path('users/', include('users.urls')), # User management app - path('links/', include('links.urls')), # Link management app - path('customization/', include('customization.urls')), # Design customization app - path('auth/', include('rest_framework.urls', namespace='rest_framework')), # DRF login/logout -] - - -# Summary of API Endpoints: -# POST /api/auth/register/ - Register new user -# POST /api/auth/login/ - Obtain JWT tokens (access & refresh) -# GET /api/users//links/ - Public list of user's links -# GET /api/links/ - List authenticated user's links -# POST /api/links/ - Create a new link -# GET /api/links/{id}/ - Retrieve a specific link -# PUT /api/links/{id}/ - Update a specific link -# PATCH /api/links/{id}/ - Partially update a link -# DELETE /api/links/{id}/ - Delete a specific link -# GET /api/groups/ - List authenticated user's link groups -# POST /api/groups/ - Create a new link group -# GET /api/groups/{id}/ - Retrieve a specific link group -# PUT /api/groups/{id}/ - Update a link group -# PATCH /api/groups/{id}/ - Partially update a link group -# DELETE /api/groups/{id}/ - Delete a specific link group - -# To avoid URL configuration errors, ensure the following placeholder URLConfs exist: -# users/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define user-management endpoints here (e.g., profile, settings) -# ] - -# links/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define additional link-management endpoints here if needed -# ] - -# customization/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define design customization endpoints here -# ] diff --git a/.history/backend/backend/urls_20250506162508.py b/.history/backend/backend/urls_20250506162508.py deleted file mode 100644 index 285b16e..0000000 --- a/.history/backend/backend/urls_20250506162508.py +++ /dev/null @@ -1,54 +0,0 @@ -from django.contrib import admin -from django.urls import path, include - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), # API endpoints - path('users/', include('users.urls')), # User management app - path('links/', include('links.urls')), # Link management app - path('customization/', include('customization.urls')), # Design customization app - path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), -] - - -# Summary of API Endpoints: -# POST /api/auth/register/ - Register new user -# POST /api/auth/login/ - Obtain JWT tokens (access & refresh) -# GET /api/users//links/ - Public list of user's links -# GET /api/links/ - List authenticated user's links -# POST /api/links/ - Create a new link -# GET /api/links/{id}/ - Retrieve a specific link -# PUT /api/links/{id}/ - Update a specific link -# PATCH /api/links/{id}/ - Partially update a link -# DELETE /api/links/{id}/ - Delete a specific link -# GET /api/groups/ - List authenticated user's link groups -# POST /api/groups/ - Create a new link group -# GET /api/groups/{id}/ - Retrieve a specific link group -# PUT /api/groups/{id}/ - Update a link group -# PATCH /api/groups/{id}/ - Partially update a link group -# DELETE /api/groups/{id}/ - Delete a specific link group - -# To avoid URL configuration errors, ensure the following placeholder URLConfs exist: -# users/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define user-management endpoints here (e.g., profile, settings) -# ] - -# links/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define additional link-management endpoints here if needed -# ] - -# customization/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define design customization endpoints here -# ] diff --git a/.history/backend/backend/urls_20250506185024.py b/.history/backend/backend/urls_20250506185024.py deleted file mode 100644 index 3978641..0000000 --- a/.history/backend/backend/urls_20250506185024.py +++ /dev/null @@ -1,57 +0,0 @@ -from django.contrib import admin -from django.urls import path, include - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), # API endpoints - path('users/', include('users.urls')), # User management app - path('links/', include('links.urls')), # Link management app - path('customization/', include('customization.urls')), # Design customization app - path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), -] - -if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - - -# Summary of API Endpoints: -# POST /api/auth/register/ - Register new user -# POST /api/auth/login/ - Obtain JWT tokens (access & refresh) -# GET /api/users//links/ - Public list of user's links -# GET /api/links/ - List authenticated user's links -# POST /api/links/ - Create a new link -# GET /api/links/{id}/ - Retrieve a specific link -# PUT /api/links/{id}/ - Update a specific link -# PATCH /api/links/{id}/ - Partially update a link -# DELETE /api/links/{id}/ - Delete a specific link -# GET /api/groups/ - List authenticated user's link groups -# POST /api/groups/ - Create a new link group -# GET /api/groups/{id}/ - Retrieve a specific link group -# PUT /api/groups/{id}/ - Update a link group -# PATCH /api/groups/{id}/ - Partially update a link group -# DELETE /api/groups/{id}/ - Delete a specific link group - -# To avoid URL configuration errors, ensure the following placeholder URLConfs exist: -# users/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define user-management endpoints here (e.g., profile, settings) -# ] - -# links/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define additional link-management endpoints here if needed -# ] - -# customization/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define design customization endpoints here -# ] diff --git a/.history/backend/backend/urls_20250506185029.py b/.history/backend/backend/urls_20250506185029.py deleted file mode 100644 index 2cb1057..0000000 --- a/.history/backend/backend/urls_20250506185029.py +++ /dev/null @@ -1,58 +0,0 @@ -from django.contrib import admin -from django.urls import path, include -from django.conf import settings - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), # API endpoints - path('users/', include('users.urls')), # User management app - path('links/', include('links.urls')), # Link management app - path('customization/', include('customization.urls')), # Design customization app - path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), -] - -if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - - -# Summary of API Endpoints: -# POST /api/auth/register/ - Register new user -# POST /api/auth/login/ - Obtain JWT tokens (access & refresh) -# GET /api/users//links/ - Public list of user's links -# GET /api/links/ - List authenticated user's links -# POST /api/links/ - Create a new link -# GET /api/links/{id}/ - Retrieve a specific link -# PUT /api/links/{id}/ - Update a specific link -# PATCH /api/links/{id}/ - Partially update a link -# DELETE /api/links/{id}/ - Delete a specific link -# GET /api/groups/ - List authenticated user's link groups -# POST /api/groups/ - Create a new link group -# GET /api/groups/{id}/ - Retrieve a specific link group -# PUT /api/groups/{id}/ - Update a link group -# PATCH /api/groups/{id}/ - Partially update a link group -# DELETE /api/groups/{id}/ - Delete a specific link group - -# To avoid URL configuration errors, ensure the following placeholder URLConfs exist: -# users/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define user-management endpoints here (e.g., profile, settings) -# ] - -# links/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define additional link-management endpoints here if needed -# ] - -# customization/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define design customization endpoints here -# ] diff --git a/.history/backend/backend/urls_20250506185034.py b/.history/backend/backend/urls_20250506185034.py deleted file mode 100644 index 85a4f03..0000000 --- a/.history/backend/backend/urls_20250506185034.py +++ /dev/null @@ -1,59 +0,0 @@ -from django.contrib import admin -from django.urls import path, include -from django.conf import settings -from django.conf.urls.static import static - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), # API endpoints - path('users/', include('users.urls')), # User management app - path('links/', include('links.urls')), # Link management app - path('customization/', include('customization.urls')), # Design customization app - path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), -] - -if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - - -# Summary of API Endpoints: -# POST /api/auth/register/ - Register new user -# POST /api/auth/login/ - Obtain JWT tokens (access & refresh) -# GET /api/users//links/ - Public list of user's links -# GET /api/links/ - List authenticated user's links -# POST /api/links/ - Create a new link -# GET /api/links/{id}/ - Retrieve a specific link -# PUT /api/links/{id}/ - Update a specific link -# PATCH /api/links/{id}/ - Partially update a link -# DELETE /api/links/{id}/ - Delete a specific link -# GET /api/groups/ - List authenticated user's link groups -# POST /api/groups/ - Create a new link group -# GET /api/groups/{id}/ - Retrieve a specific link group -# PUT /api/groups/{id}/ - Update a link group -# PATCH /api/groups/{id}/ - Partially update a link group -# DELETE /api/groups/{id}/ - Delete a specific link group - -# To avoid URL configuration errors, ensure the following placeholder URLConfs exist: -# users/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define user-management endpoints here (e.g., profile, settings) -# ] - -# links/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define additional link-management endpoints here if needed -# ] - -# customization/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define design customization endpoints here -# ] diff --git a/.history/backend/backend/urls_20250507080600.py b/.history/backend/backend/urls_20250507080600.py deleted file mode 100644 index dc6185b..0000000 --- a/.history/backend/backend/urls_20250507080600.py +++ /dev/null @@ -1,60 +0,0 @@ -from django.contrib import admin -from django.urls import path, include -from django.conf import settings -from django.conf.urls.static import static -from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), # API endpoints - path('users/', include('users.urls')), # User management app - path('links/', include('links.urls')), # Link management app - path('customization/', include('customization.urls')), # Design customization app - path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), -] - -if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - - -# Summary of API Endpoints: -# POST /api/auth/register/ - Register new user -# POST /api/auth/login/ - Obtain JWT tokens (access & refresh) -# GET /api/users//links/ - Public list of user's links -# GET /api/links/ - List authenticated user's links -# POST /api/links/ - Create a new link -# GET /api/links/{id}/ - Retrieve a specific link -# PUT /api/links/{id}/ - Update a specific link -# PATCH /api/links/{id}/ - Partially update a link -# DELETE /api/links/{id}/ - Delete a specific link -# GET /api/groups/ - List authenticated user's link groups -# POST /api/groups/ - Create a new link group -# GET /api/groups/{id}/ - Retrieve a specific link group -# PUT /api/groups/{id}/ - Update a link group -# PATCH /api/groups/{id}/ - Partially update a link group -# DELETE /api/groups/{id}/ - Delete a specific link group - -# To avoid URL configuration errors, ensure the following placeholder URLConfs exist: -# users/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define user-management endpoints here (e.g., profile, settings) -# ] - -# links/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define additional link-management endpoints here if needed -# ] - -# customization/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define design customization endpoints here -# ] diff --git a/.history/backend/backend/urls_20250507081420.py b/.history/backend/backend/urls_20250507081420.py deleted file mode 100644 index 0f6228d..0000000 --- a/.history/backend/backend/urls_20250507081420.py +++ /dev/null @@ -1,60 +0,0 @@ -from django.contrib import admin -from django.urls import path, include -from django.conf import settings -from django.conf.urls.static import static - - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('api.urls')), # API endpoints - path('users/', include('users.urls')), # User management app - path('links/', include('links.urls')), # Link management app - path('customization/', include('customization.urls')), # Design customization app - path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), -] - -if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - - -# Summary of API Endpoints: -# POST /api/auth/register/ - Register new user -# POST /api/auth/login/ - Obtain JWT tokens (access & refresh) -# GET /api/users//links/ - Public list of user's links -# GET /api/links/ - List authenticated user's links -# POST /api/links/ - Create a new link -# GET /api/links/{id}/ - Retrieve a specific link -# PUT /api/links/{id}/ - Update a specific link -# PATCH /api/links/{id}/ - Partially update a link -# DELETE /api/links/{id}/ - Delete a specific link -# GET /api/groups/ - List authenticated user's link groups -# POST /api/groups/ - Create a new link group -# GET /api/groups/{id}/ - Retrieve a specific link group -# PUT /api/groups/{id}/ - Update a link group -# PATCH /api/groups/{id}/ - Partially update a link group -# DELETE /api/groups/{id}/ - Delete a specific link group - -# To avoid URL configuration errors, ensure the following placeholder URLConfs exist: -# users/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define user-management endpoints here (e.g., profile, settings) -# ] - -# links/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define additional link-management endpoints here if needed -# ] - -# customization/urls.py -# ---------------- -# from django.urls import path, include -# -# urlpatterns = [ -# # Define design customization endpoints here -# ] diff --git a/.history/backend/customization/admin_20250506100403.py b/.history/backend/customization/admin_20250506100403.py deleted file mode 100644 index 8c38f3f..0000000 --- a/.history/backend/customization/admin_20250506100403.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/.history/backend/customization/admin_20250506103854.py b/.history/backend/customization/admin_20250506103854.py deleted file mode 100644 index 4064a8c..0000000 --- a/.history/backend/customization/admin_20250506103854.py +++ /dev/null @@ -1,11 +0,0 @@ -# backend/apps/customization/admin.py - -from django.contrib import admin -from .models import DesignSettings - -@admin.register(DesignSettings) -class DesignSettingsAdmin(admin.ModelAdmin): - list_display = ('user', 'theme_color', 'font_family', 'updated_at') - list_filter = ('theme_color',) - search_fields = ('user__username',) - readonly_fields = ('updated_at',) diff --git a/.history/backend/customization/models_20250506100403.py b/.history/backend/customization/models_20250506100403.py deleted file mode 100644 index 71a8362..0000000 --- a/.history/backend/customization/models_20250506100403.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/.history/backend/customization/models_20250506101457.py b/.history/backend/customization/models_20250506101457.py deleted file mode 100644 index 44b0d08..0000000 --- a/.history/backend/customization/models_20250506101457.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.db import models -from django.conf import settings - -class DesignSettings(models.Model): - user = models.OneToOneField( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='design' - ) - theme_color = models.CharField(max_length=7, default='#ffffff') - background_image = models.ImageField(upload_to='backgrounds/', null=True, blank=True) - font_family = models.CharField(max_length=100, default='sans-serif') - custom_css = models.TextField(blank=True) - updated_at = models.DateTimeField(auto_now=True) - - def __str__(self): - return f"Design for {self.user.username}" \ No newline at end of file diff --git a/.history/backend/customization/models_20250506102230.py b/.history/backend/customization/models_20250506102230.py deleted file mode 100644 index da10139..0000000 --- a/.history/backend/customization/models_20250506102230.py +++ /dev/null @@ -1,156 +0,0 @@ -# customization/models.py - -from django.db import models -from django.conf import settings - -class DesignSettings(models.Model): - """ - Настройки дизайна для публичной страницы пользователя. - """ - user = models.OneToOneField( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='design', - help_text='Пользователь, которому принадлежат настройки' - ) - theme_color = models.CharField( - max_length=7, - default='#ffffff', - help_text='Основной цвет темы (hex)' - ) - background_image = models.ImageField( - upload_to='backgrounds/', - null=True, - blank=True, - help_text='Фоновое изображение' - ) - font_family = models.CharField( - max_length=100, - default='sans-serif', - help_text='Название шрифта' - ) - custom_css = models.TextField( - blank=True, - help_text='Дополнительный CSS' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего изменения' - ) - - def __str__(self): - return f"Design for {self.user.username}" - - class Meta: - verbose_name = 'Настройки дизайна' - verbose_name_plural = 'Настройки дизайна' - ordering = ['user'] - unique_together = ('user',) - def get_background_image_url(self): - """ - Возвращает URL фонового изображения. - """ - return self.background_image.url if self.background_image else None - def get_custom_css(self): - """ - Возвращает пользовательский CSS. - """ - return self.custom_css if self.custom_css else "" - def get_design_settings(self): - """ - Возвращает словарь с настройками дизайна. - """ - return { - 'theme_color': self.theme_color, - 'background_image': self.get_background_image_url(), - 'font_family': self.font_family, - 'custom_css': self.get_custom_css() - } - def save(self, *args, **kwargs): - """ - Переопределяем метод save, чтобы автоматически обновлять дату изменения. - """ - self.updated_at = timezone.now() - super().save(*args, **kwargs) - def delete(self, *args, **kwargs): - """ - Переопределяем метод delete, чтобы удалять связанные изображения. - """ - if self.background_image: - self.background_image.delete(save=False) - super().delete(*args, **kwargs) - def get_user(self): - """ - Возвращает пользователя, которому принадлежат настройки дизайна. - """ - return self.user - def get_user_id(self): - """ - Возвращает ID пользователя, которому принадлежат настройки дизайна. - """ - return self.user.id - def get_user_username(self): - """ - Возвращает имя пользователя, которому принадлежат настройки дизайна. - """ - return self.user.username - def get_user_email(self): - """ - Возвращает email пользователя, которому принадлежат настройки дизайна. - """ - return self.user.email if self.user.email else "Нет email" - def get_user_full_name(self): - """ - Возвращает полное имя пользователя, которому принадлежат настройки дизайна. - """ - return self.user.get_full_name() if self.user.get_full_name() else "Нет полного имени" - def get_user_bio(self): - """ - Возвращает биографию пользователя, которому принадлежат настройки дизайна. - """ - return self.user.get_bio() if self.user.get_bio() else "Нет биографии" - def get_user_avatar(self): - """ - Возвращает URL аватара пользователя, которому принадлежат настройки дизайна. - """ - return self.user.get_avatar() if self.user.get_avatar() else None - def get_user_links(self): - """ - Возвращает список ссылок пользователя, которому принадлежат настройки дизайна. - """ - return self.user.get_user_links() if self.user.get_user_links() else [] - def get_user_groups(self): - """ - Возвращает группы пользователя, которому принадлежат настройки дизайна. - """ - return self.user.get_user_groups() if self.user.get_user_groups() else [] - def get_user_design(self): - """ - Возвращает настройки дизайна пользователя, которому принадлежат настройки дизайна. - """ - return self.user.get_user_design() if self.user.get_user_design() else None - def get_user_info(self): - """ - Возвращает информацию о пользователе, которому принадлежат настройки дизайна. - """ - return self.user.get_user_info() if self.user.get_user_info() else {} - def get_user_settings(self): - """ - Возвращает настройки пользователя, которому принадлежат настройки дизайна. - """ - return self.user.get_user_settings() if self.user.get_user_settings() else {} - def get_user_preferences(self): - """ - Возвращает предпочтения пользователя, которому принадлежат настройки дизайна. - """ - return self.user.get_user_preferences() if self.user.get_user_preferences() else {} - def get_user_notifications(self): - """ - Возвращает уведомления пользователя, которому принадлежат настройки дизайна. - """ - return self.user.get_user_notifications() if self.user.get_user_notifications() else [] - def get_user_friends(self): - """ - Возвращает друзей пользователя, которому принадлежат настройки дизайна. - """ - return self.user.get_user_friends() if self.user.get_user_friends() else [] \ No newline at end of file diff --git a/.history/backend/customization/models_20250506102358.py b/.history/backend/customization/models_20250506102358.py deleted file mode 100644 index 7eccb11..0000000 --- a/.history/backend/customization/models_20250506102358.py +++ /dev/null @@ -1,110 +0,0 @@ -# customization/models.py - -from django.db import models -from django.conf import settings -from django.utils import timezone - -class DesignSettings(models.Model): - """ - Настройки дизайна для публичной страницы пользователя. - """ - user = models.OneToOneField( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='design', - help_text='Пользователь, которому принадлежат настройки' - ) - theme_color = models.CharField( - max_length=7, - default='#ffffff', - help_text='Основной цвет темы (hex)' - ) - background_image = models.ImageField( - upload_to='backgrounds/', - null=True, - blank=True, - help_text='Фоновое изображение' - ) - font_family = models.CharField( - max_length=100, - default='sans-serif', - help_text='Название шрифта' - ) - custom_css = models.TextField( - blank=True, - help_text='Дополнительный CSS' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего изменения' - ) - - class Meta: - verbose_name = 'Настройки дизайна' - verbose_name_plural = 'Настройки дизайна' - ordering = ['user'] - unique_together = ('user',) - - def __str__(self): - return f"Design for {self.user.username}" - - def get_background_image_url(self): - """ - Возвращает URL фонового изображения. - """ - return self.background_image.url if self.background_image else None - - def get_custom_css(self): - """ - Возвращает пользовательский CSS. - """ - return self.custom_css or "" - - def get_design_settings(self): - """ - Возвращает словарь с настройками дизайна. - """ - return { - 'theme_color': self.theme_color, - 'background_image': self.get_background_image_url(), - 'font_family': self.font_family, - 'custom_css': self.get_custom_css() - } - - def save(self, *args, **kwargs): - """ - Переопределяем метод save, чтобы автоматически обновлять дату изменения. - """ - self.updated_at = timezone.now() - super().save(*args, **kwargs) - - def delete(self, *args, **kwargs): - """ - Переопределяем метод delete, чтобы удалять связанные изображения. - """ - if self.background_image: - self.background_image.delete(save=False) - super().delete(*args, **kwargs) - - # Вспомогательные методы для доступа к данным пользователя - - def get_user(self): - return self.user - - def get_user_id(self): - return self.user.id - - def get_user_username(self): - return self.user.username - - def get_user_email(self): - return self.user.email or "Нет email" - - def get_user_full_name(self): - return self.user.get_full_name() or "Нет полного имени" - - def get_user_bio(self): - return self.user.bio or "Нет биографии" - - def get_user_avatar(self): - return self.user.avatar.url if self.user.avatar else None diff --git a/.history/backend/customization/models_20250506185325.py b/.history/backend/customization/models_20250506185325.py deleted file mode 100644 index 9a24104..0000000 --- a/.history/backend/customization/models_20250506185325.py +++ /dev/null @@ -1,110 +0,0 @@ -# customization/models.py - -from django.db import models -from django.conf import settings -from django.utils import timezone - -class DesignSettings(models.Model): - """ - Настройки дизайна для публичной страницы пользователя. - """ - user = models.OneToOneField( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='design', - help_text='Пользователь, которому принадлежат настройки' - ) - theme_color = models.CharField( - max_length=7, - default='#ffffff', - help_text='Основной цвет темы (hex)' - ) - background_image = models.ImageField( - upload_to='customization/', - null=True, - blank=True, - help_text='Фоновое изображение' - ) - font_family = models.CharField( - max_length=100, - default='sans-serif', - help_text='Название шрифта' - ) - custom_css = models.TextField( - blank=True, - help_text='Дополнительный CSS' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего изменения' - ) - - class Meta: - verbose_name = 'Настройки дизайна' - verbose_name_plural = 'Настройки дизайна' - ordering = ['user'] - unique_together = ('user',) - - def __str__(self): - return f"Design for {self.user.username}" - - def get_background_image_url(self): - """ - Возвращает URL фонового изображения. - """ - return self.background_image.url if self.background_image else None - - def get_custom_css(self): - """ - Возвращает пользовательский CSS. - """ - return self.custom_css or "" - - def get_design_settings(self): - """ - Возвращает словарь с настройками дизайна. - """ - return { - 'theme_color': self.theme_color, - 'background_image': self.get_background_image_url(), - 'font_family': self.font_family, - 'custom_css': self.get_custom_css() - } - - def save(self, *args, **kwargs): - """ - Переопределяем метод save, чтобы автоматически обновлять дату изменения. - """ - self.updated_at = timezone.now() - super().save(*args, **kwargs) - - def delete(self, *args, **kwargs): - """ - Переопределяем метод delete, чтобы удалять связанные изображения. - """ - if self.background_image: - self.background_image.delete(save=False) - super().delete(*args, **kwargs) - - # Вспомогательные методы для доступа к данным пользователя - - def get_user(self): - return self.user - - def get_user_id(self): - return self.user.id - - def get_user_username(self): - return self.user.username - - def get_user_email(self): - return self.user.email or "Нет email" - - def get_user_full_name(self): - return self.user.get_full_name() or "Нет полного имени" - - def get_user_bio(self): - return self.user.bio or "Нет биографии" - - def get_user_avatar(self): - return self.user.avatar.url if self.user.avatar else None diff --git a/.history/backend/customization/urls_20250506161148.py b/.history/backend/customization/urls_20250506161148.py deleted file mode 100644 index e69de29..0000000 diff --git a/.history/backend/customization/urls_20250506161339.py b/.history/backend/customization/urls_20250506161339.py deleted file mode 100644 index f3bfa1b..0000000 --- a/.history/backend/customization/urls_20250506161339.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.urls import path - -urlpatterns = [ - # дополнительные эндпоинты по ссылкам -] \ No newline at end of file diff --git a/.history/backend/entrypoint_20251029192540.sh b/.history/backend/entrypoint_20251029192540.sh deleted file mode 100644 index 2724535..0000000 --- a/.history/backend/entrypoint_20251029192540.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -echo "Collecting static files..." -python manage.py collectstatic --noinput --clear - -echo "Starting server..." -exec gunicorn backend.wsgi:application --bind 0.0.0.0:8000 \ No newline at end of file diff --git a/.history/backend/entrypoint_20251029192619.sh b/.history/backend/entrypoint_20251029192619.sh deleted file mode 100644 index 20fb61f..0000000 --- a/.history/backend/entrypoint_20251029192619.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -echo "Collecting static files..." -python3 manage.py collectstatic --noinput --clear - -echo "Applying database migrations..." -python3 manage.py migrate --noinput - -echo "Starting server..." -exec gunicorn backend.wsgi:application --bind 0.0.0.0:8000 \ No newline at end of file diff --git a/.history/backend/links/admin_20250506100403.py b/.history/backend/links/admin_20250506100403.py deleted file mode 100644 index 8c38f3f..0000000 --- a/.history/backend/links/admin_20250506100403.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/.history/backend/links/admin_20250506103848.py b/.history/backend/links/admin_20250506103848.py deleted file mode 100644 index 6d5c52a..0000000 --- a/.history/backend/links/admin_20250506103848.py +++ /dev/null @@ -1,18 +0,0 @@ -# backend/apps/links/admin.py - -from django.contrib import admin -from .models import LinkGroup, Link - -@admin.register(LinkGroup) -class LinkGroupAdmin(admin.ModelAdmin): - list_display = ('title', 'owner', 'order') - list_filter = ('owner',) - search_fields = ('title', 'owner__username') - ordering = ('owner', 'order') - -@admin.register(Link) -class LinkAdmin(admin.ModelAdmin): - list_display = ('title', 'group', 'is_active', 'order', 'created_at') - list_filter = ('group', 'is_active') - search_fields = ('title', 'url', 'group__title', 'group__owner__username') - ordering = ('group', 'order') diff --git a/.history/backend/links/models_20250506100403.py b/.history/backend/links/models_20250506100403.py deleted file mode 100644 index 71a8362..0000000 --- a/.history/backend/links/models_20250506100403.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/.history/backend/links/models_20250506101446.py b/.history/backend/links/models_20250506101446.py deleted file mode 100644 index d618ed2..0000000 --- a/.history/backend/links/models_20250506101446.py +++ /dev/null @@ -1,37 +0,0 @@ -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='groups' - ) - title = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - order = models.PositiveIntegerField(default=0) - is_active = models.BooleanField(default=True) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title \ No newline at end of file diff --git a/.history/backend/links/models_20250506101720.py b/.history/backend/links/models_20250506101720.py deleted file mode 100644 index d618ed2..0000000 --- a/.history/backend/links/models_20250506101720.py +++ /dev/null @@ -1,37 +0,0 @@ -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='groups' - ) - title = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - order = models.PositiveIntegerField(default=0) - is_active = models.BooleanField(default=True) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title \ No newline at end of file diff --git a/.history/backend/links/models_20250506101824.py b/.history/backend/links/models_20250506101824.py deleted file mode 100644 index 8dc6b1a..0000000 --- a/.history/backend/links/models_20250506101824.py +++ /dev/null @@ -1,37 +0,0 @@ -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups' # изменено, чтобы не конфликтовать с auth.User.groups - ) - title = models.CharField(max_length=100) - order = models.PositiveIntegerField(default=0) - - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links' - ) - title = models.CharField(max_length=200) - url = models.URLField() - order = models.PositiveIntegerField(default=0) - is_active = models.BooleanField(default=True) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title \ No newline at end of file diff --git a/.history/backend/links/models_20250506102111.py b/.history/backend/links/models_20250506102111.py deleted file mode 100644 index c5f49dd..0000000 --- a/.history/backend/links/models_20250506102111.py +++ /dev/null @@ -1,97 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } \ No newline at end of file diff --git a/.history/backend/links/models_20250506102117.py b/.history/backend/links/models_20250506102117.py deleted file mode 100644 index db0d999..0000000 --- a/.history/backend/links/models_20250506102117.py +++ /dev/null @@ -1,97 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } \ No newline at end of file diff --git a/.history/backend/links/models_20250506102351.py b/.history/backend/links/models_20250506102351.py deleted file mode 100644 index 43e0fa8..0000000 --- a/.history/backend/links/models_20250506102351.py +++ /dev/null @@ -1,100 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506104343.py b/.history/backend/links/models_20250506104343.py deleted file mode 100644 index 2e7a2b4..0000000 --- a/.history/backend/links/models_20250506104343.py +++ /dev/null @@ -1,268 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='link_groups/', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506104431.py b/.history/backend/links/models_20250506104431.py deleted file mode 100644 index 6df6e1e..0000000 --- a/.history/backend/links/models_20250506104431.py +++ /dev/null @@ -1,428 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='link_groups/', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - image = models.ImageField( - upload_to='links/', - null=True, - blank=True, - help_text='Изображение ссылки' - ) - description = models.TextField( - blank=True, - help_text='Описание ссылки' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная ссылка' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная ссылка' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая ссылка' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Ссылка защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к ссылке' - ) - is_approved = models.BooleanField( - default=False, - help_text='Ссылка одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Ссылка отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Ссылка удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Ссылка архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Ссылка запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Ссылка истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия ссылки' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Ссылка выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Ссылка выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Ссылка выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Ссылка выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Ссылка выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Ссылка выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Ссылка выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Ссылка выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Ссылка выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Ссылка выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Ссылка выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Ссылка выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Ссылка выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Ссылка выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Ссылка выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Ссылка выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Ссылка выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Ссылка выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Ссылка выделена в тултипе' - ) - is_featured_on_qr_code = models.BooleanField( - default=False, - help_text='Ссылка выделена в QR-коде' - ) - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506104912.py b/.history/backend/links/models_20250506104912.py deleted file mode 100644 index 2ac6d5d..0000000 --- a/.history/backend/links/models_20250506104912.py +++ /dev/null @@ -1,428 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='storage/images/link_groups/', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - image = models.ImageField( - upload_to='storage/images/links/', - null=True, - blank=True, - help_text='Изображение ссылки' - ) - description = models.TextField( - blank=True, - help_text='Описание ссылки' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная ссылка' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная ссылка' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая ссылка' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Ссылка защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к ссылке' - ) - is_approved = models.BooleanField( - default=False, - help_text='Ссылка одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Ссылка отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Ссылка удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Ссылка архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Ссылка запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Ссылка истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия ссылки' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Ссылка выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Ссылка выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Ссылка выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Ссылка выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Ссылка выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Ссылка выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Ссылка выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Ссылка выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Ссылка выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Ссылка выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Ссылка выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Ссылка выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Ссылка выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Ссылка выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Ссылка выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Ссылка выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Ссылка выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Ссылка выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Ссылка выделена в тултипе' - ) - is_featured_on_qr_code = models.BooleanField( - default=False, - help_text='Ссылка выделена в QR-коде' - ) - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506185130.py b/.history/backend/links/models_20250506185130.py deleted file mode 100644 index c5b33ae..0000000 --- a/.history/backend/links/models_20250506185130.py +++ /dev/null @@ -1,428 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='link_groups/', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - image = models.ImageField( - upload_to='storage/images/links/', - null=True, - blank=True, - help_text='Изображение ссылки' - ) - description = models.TextField( - blank=True, - help_text='Описание ссылки' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная ссылка' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная ссылка' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая ссылка' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Ссылка защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к ссылке' - ) - is_approved = models.BooleanField( - default=False, - help_text='Ссылка одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Ссылка отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Ссылка удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Ссылка архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Ссылка запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Ссылка истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия ссылки' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Ссылка выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Ссылка выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Ссылка выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Ссылка выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Ссылка выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Ссылка выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Ссылка выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Ссылка выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Ссылка выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Ссылка выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Ссылка выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Ссылка выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Ссылка выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Ссылка выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Ссылка выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Ссылка выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Ссылка выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Ссылка выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Ссылка выделена в тултипе' - ) - is_featured_on_qr_code = models.BooleanField( - default=False, - help_text='Ссылка выделена в QR-коде' - ) - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506185202.py b/.history/backend/links/models_20250506185202.py deleted file mode 100644 index 7d4e5ec..0000000 --- a/.history/backend/links/models_20250506185202.py +++ /dev/null @@ -1,428 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='links', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - image = models.ImageField( - upload_to='storage/images/links/', - null=True, - blank=True, - help_text='Изображение ссылки' - ) - description = models.TextField( - blank=True, - help_text='Описание ссылки' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная ссылка' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная ссылка' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая ссылка' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Ссылка защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к ссылке' - ) - is_approved = models.BooleanField( - default=False, - help_text='Ссылка одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Ссылка отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Ссылка удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Ссылка архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Ссылка запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Ссылка истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия ссылки' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Ссылка выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Ссылка выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Ссылка выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Ссылка выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Ссылка выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Ссылка выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Ссылка выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Ссылка выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Ссылка выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Ссылка выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Ссылка выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Ссылка выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Ссылка выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Ссылка выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Ссылка выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Ссылка выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Ссылка выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Ссылка выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Ссылка выделена в тултипе' - ) - is_featured_on_qr_code = models.BooleanField( - default=False, - help_text='Ссылка выделена в QR-коде' - ) - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506185228.py b/.history/backend/links/models_20250506185228.py deleted file mode 100644 index c5b33ae..0000000 --- a/.history/backend/links/models_20250506185228.py +++ /dev/null @@ -1,428 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='link_groups/', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - image = models.ImageField( - upload_to='storage/images/links/', - null=True, - blank=True, - help_text='Изображение ссылки' - ) - description = models.TextField( - blank=True, - help_text='Описание ссылки' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная ссылка' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная ссылка' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая ссылка' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Ссылка защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к ссылке' - ) - is_approved = models.BooleanField( - default=False, - help_text='Ссылка одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Ссылка отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Ссылка удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Ссылка архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Ссылка запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Ссылка истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия ссылки' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Ссылка выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Ссылка выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Ссылка выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Ссылка выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Ссылка выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Ссылка выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Ссылка выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Ссылка выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Ссылка выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Ссылка выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Ссылка выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Ссылка выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Ссылка выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Ссылка выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Ссылка выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Ссылка выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Ссылка выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Ссылка выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Ссылка выделена в тултипе' - ) - is_featured_on_qr_code = models.BooleanField( - default=False, - help_text='Ссылка выделена в QR-коде' - ) - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506185239.py b/.history/backend/links/models_20250506185239.py deleted file mode 100644 index 6df6e1e..0000000 --- a/.history/backend/links/models_20250506185239.py +++ /dev/null @@ -1,428 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='link_groups/', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - image = models.ImageField( - upload_to='links/', - null=True, - blank=True, - help_text='Изображение ссылки' - ) - description = models.TextField( - blank=True, - help_text='Описание ссылки' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная ссылка' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная ссылка' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая ссылка' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Ссылка защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к ссылке' - ) - is_approved = models.BooleanField( - default=False, - help_text='Ссылка одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Ссылка отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Ссылка удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Ссылка архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Ссылка запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Ссылка истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия ссылки' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Ссылка выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Ссылка выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Ссылка выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Ссылка выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Ссылка выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Ссылка выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Ссылка выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Ссылка выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Ссылка выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Ссылка выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Ссылка выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Ссылка выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Ссылка выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Ссылка выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Ссылка выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Ссылка выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Ссылка выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Ссылка выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Ссылка выделена в тултипе' - ) - is_featured_on_qr_code = models.BooleanField( - default=False, - help_text='Ссылка выделена в QR-коде' - ) - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506185857.py b/.history/backend/links/models_20250506185857.py deleted file mode 100644 index 714d004..0000000 --- a/.history/backend/links/models_20250506185857.py +++ /dev/null @@ -1,428 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='link_groups/', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='images/links/', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - image = models.ImageField( - upload_to='links/', - null=True, - blank=True, - help_text='Изображение ссылки' - ) - description = models.TextField( - blank=True, - help_text='Описание ссылки' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная ссылка' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная ссылка' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая ссылка' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Ссылка защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к ссылке' - ) - is_approved = models.BooleanField( - default=False, - help_text='Ссылка одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Ссылка отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Ссылка удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Ссылка архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Ссылка запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Ссылка истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия ссылки' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Ссылка выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Ссылка выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Ссылка выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Ссылка выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Ссылка выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Ссылка выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Ссылка выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Ссылка выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Ссылка выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Ссылка выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Ссылка выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Ссылка выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Ссылка выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Ссылка выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Ссылка выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Ссылка выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Ссылка выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Ссылка выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Ссылка выделена в тултипе' - ) - is_featured_on_qr_code = models.BooleanField( - default=False, - help_text='Ссылка выделена в QR-коде' - ) - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506185909.py b/.history/backend/links/models_20250506185909.py deleted file mode 100644 index 01b9481..0000000 --- a/.history/backend/links/models_20250506185909.py +++ /dev/null @@ -1,428 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='images/link_groups/', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='images/links/', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - image = models.ImageField( - upload_to='links/', - null=True, - blank=True, - help_text='Изображение ссылки' - ) - description = models.TextField( - blank=True, - help_text='Описание ссылки' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная ссылка' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная ссылка' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая ссылка' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Ссылка защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к ссылке' - ) - is_approved = models.BooleanField( - default=False, - help_text='Ссылка одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Ссылка отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Ссылка удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Ссылка архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Ссылка запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Ссылка истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия ссылки' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Ссылка выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Ссылка выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Ссылка выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Ссылка выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Ссылка выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Ссылка выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Ссылка выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Ссылка выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Ссылка выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Ссылка выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Ссылка выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Ссылка выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Ссылка выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Ссылка выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Ссылка выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Ссылка выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Ссылка выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Ссылка выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Ссылка выделена в тултипе' - ) - is_featured_on_qr_code = models.BooleanField( - default=False, - help_text='Ссылка выделена в QR-коде' - ) - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506190041.py b/.history/backend/links/models_20250506190041.py deleted file mode 100644 index 96c85e9..0000000 --- a/.history/backend/links/models_20250506190041.py +++ /dev/null @@ -1,428 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='images/link_groups/', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - image = models.ImageField( - upload_to='links/', - null=True, - blank=True, - help_text='Изображение ссылки' - ) - description = models.TextField( - blank=True, - help_text='Описание ссылки' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная ссылка' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная ссылка' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая ссылка' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Ссылка защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к ссылке' - ) - is_approved = models.BooleanField( - default=False, - help_text='Ссылка одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Ссылка отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Ссылка удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Ссылка архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Ссылка запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Ссылка истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия ссылки' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Ссылка выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Ссылка выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Ссылка выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Ссылка выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Ссылка выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Ссылка выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Ссылка выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Ссылка выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Ссылка выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Ссылка выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Ссылка выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Ссылка выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Ссылка выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Ссылка выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Ссылка выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Ссылка выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Ссылка выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Ссылка выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Ссылка выделена в тултипе' - ) - is_featured_on_qr_code = models.BooleanField( - default=False, - help_text='Ссылка выделена в QR-коде' - ) - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/models_20250506190056.py b/.history/backend/links/models_20250506190056.py deleted file mode 100644 index a631178..0000000 --- a/.history/backend/links/models_20250506190056.py +++ /dev/null @@ -1,428 +0,0 @@ -# links/models.py - -from django.db import models -from django.conf import settings - -class LinkGroup(models.Model): - """ - Группа ссылок, принадлежащая пользователю. - """ - owner = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='link_groups', # чтобы не конфликтовать с auth.User.groups - help_text='Владелец группы ссылок' - ) - title = models.CharField( - max_length=100, - help_text='Название группы' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки' - ) - image = models.ImageField( - upload_to='images/link_groups/', - null=True, - blank=True, - help_text='Изображение группы ссылок' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность группы ссылок' - ) - description = models.TextField( - blank=True, - help_text='Описание группы ссылок' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная группа ссылок' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная группа ссылок' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая группа ссылок' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Группа ссылок защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к группе ссылок' - ) - is_approved = models.BooleanField( - default=False, - help_text='Группа ссылок одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Группа ссылок отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Группа ссылок удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Группа ссылок архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Группа ссылок запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Группа ссылок истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия группы ссылок' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Группа ссылок выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Группа ссылок выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Группа ссылок выделена в тултипе' - ) - class Meta: - ordering = ['order'] - unique_together = ('owner', 'title') - - def __str__(self): - return f"{self.owner.username} – {self.title}" - -class Link(models.Model): - """ - Отдельная ссылка внутри группы. - """ - group = models.ForeignKey( - LinkGroup, - on_delete=models.CASCADE, - related_name='links', - help_text='Группа, к которой относится ссылка' - ) - title = models.CharField( - max_length=200, - help_text='Текст ссылки' - ) - url = models.URLField( - help_text='URL-адрес' - ) - order = models.PositiveIntegerField( - default=0, - help_text='Порядок сортировки внутри группы' - ) - is_active = models.BooleanField( - default=True, - help_text='Активность ссылки' - ) - created_at = models.DateTimeField( - auto_now_add=True, - help_text='Дата и время создания' - ) - updated_at = models.DateTimeField( - auto_now=True, - help_text='Дата и время последнего обновления' - ) - image = models.ImageField( - upload_to='images/links/', - null=True, - blank=True, - help_text='Изображение ссылки' - ) - description = models.TextField( - blank=True, - help_text='Описание ссылки' - ) - is_public = models.BooleanField( - default=False, - help_text='Публичная ссылка' - ) - is_featured = models.BooleanField( - default=False, - help_text='Выделенная ссылка' - ) - is_private = models.BooleanField( - default=False, - help_text='Закрытая ссылка' - ) - is_password_protected = models.BooleanField( - default=False, - help_text='Ссылка защищена паролем' - ) - password = models.CharField( - max_length=128, - blank=True, - help_text='Пароль для доступа к ссылке' - ) - is_approved = models.BooleanField( - default=False, - help_text='Ссылка одобрена администратором' - ) - is_rejected = models.BooleanField( - default=False, - help_text='Ссылка отклонена администратором' - ) - is_deleted = models.BooleanField( - default=False, - help_text='Ссылка удалена' - ) - is_archived = models.BooleanField( - default=False, - help_text='Ссылка архивирована' - ) - is_scheduled = models.BooleanField( - default=False, - help_text='Ссылка запланирована на публикацию' - ) - scheduled_at = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время запланированной публикации' - ) - is_expired = models.BooleanField( - default=False, - help_text='Ссылка истекла' - ) - expiration_date = models.DateTimeField( - null=True, - blank=True, - help_text='Дата и время истечения срока действия ссылки' - ) - is_featured_on_homepage = models.BooleanField( - default=False, - help_text='Ссылка выделена на главной странице' - ) - is_featured_on_profile = models.BooleanField( - default=False, - help_text='Ссылка выделена на профиле пользователя' - ) - is_featured_on_category = models.BooleanField( - default=False, - help_text='Ссылка выделена в категории' - ) - is_featured_on_tag = models.BooleanField( - default=False, - help_text='Ссылка выделена по тегу' - ) - is_featured_on_search = models.BooleanField( - default=False, - help_text='Ссылка выделена в результатах поиска' - ) - is_featured_on_related = models.BooleanField( - default=False, - help_text='Ссылка выделена в связанных ссылках' - ) - is_featured_on_recommended = models.BooleanField( - default=False, - help_text='Ссылка выделена в рекомендуемых ссылках' - ) - is_featured_on_popular = models.BooleanField( - default=False, - help_text='Ссылка выделена в популярных ссылках' - ) - is_featured_on_trending = models.BooleanField( - default=False, - help_text='Ссылка выделена в трендовых ссылках' - ) - is_featured_on_new = models.BooleanField( - default=False, - help_text='Ссылка выделена в новых ссылках' - ) - is_featured_on_top = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхних ссылках' - ) - is_featured_on_bottom = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижних ссылках' - ) - is_featured_on_sidebar = models.BooleanField( - default=False, - help_text='Ссылка выделена в боковой панели' - ) - is_featured_on_footer = models.BooleanField( - default=False, - help_text='Ссылка выделена в нижнем колонтитуле' - ) - is_featured_on_header = models.BooleanField( - default=False, - help_text='Ссылка выделена в верхнем колонтитуле' - ) - is_featured_on_banner = models.BooleanField( - default=False, - help_text='Ссылка выделена в баннере' - ) - is_featured_on_popup = models.BooleanField( - default=False, - help_text='Ссылка выделена в всплывающем окне' - ) - is_featured_on_modal = models.BooleanField( - default=False, - help_text='Ссылка выделена в модальном окне' - ) - is_featured_on_notification = models.BooleanField( - default=False, - help_text='Ссылка выделена в уведомлении' - ) - is_featured_on_alert = models.BooleanField( - default=False, - help_text='Ссылка выделена в алерте' - ) - is_featured_on_toast = models.BooleanField( - default=False, - help_text='Ссылка выделена в тосте' - ) - is_featured_on_snackbar = models.BooleanField( - default=False, - help_text='Ссылка выделена в снэкбаре' - ) - is_featured_on_tooltip = models.BooleanField( - default=False, - help_text='Ссылка выделена в тултипе' - ) - is_featured_on_qr_code = models.BooleanField( - default=False, - help_text='Ссылка выделена в QR-коде' - ) - class Meta: - ordering = ['order'] - - def __str__(self): - return self.title - - def get_absolute_url(self): - """ - Возвращает абсолютный URL для доступа к ссылке. - """ - return self.url - - def get_group(self): - """ - Возвращает группу, к которой принадлежит ссылка. - """ - return self.group - - def get_owner(self): - """ - Возвращает владельца ссылки. - """ - return self.group.owner - - def get_link_info(self): - """ - Возвращает словарь с информацией о ссылке. - """ - return { - 'title': self.title, - 'url': self.url, - 'is_active': self.is_active, - 'created_at': self.created_at, - 'updated_at': self.updated_at - } diff --git a/.history/backend/links/urls_20250506161142.py b/.history/backend/links/urls_20250506161142.py deleted file mode 100644 index e69de29..0000000 diff --git a/.history/backend/links/urls_20250506161342.py b/.history/backend/links/urls_20250506161342.py deleted file mode 100644 index f3bfa1b..0000000 --- a/.history/backend/links/urls_20250506161342.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.urls import path - -urlpatterns = [ - # дополнительные эндпоинты по ссылкам -] \ No newline at end of file diff --git a/.history/backend/users/admin_20250506100403.py b/.history/backend/users/admin_20250506100403.py deleted file mode 100644 index 8c38f3f..0000000 --- a/.history/backend/users/admin_20250506100403.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/.history/backend/users/admin_20250506103835.py b/.history/backend/users/admin_20250506103835.py deleted file mode 100644 index 3c017ef..0000000 --- a/.history/backend/users/admin_20250506103835.py +++ /dev/null @@ -1,19 +0,0 @@ -# backend/apps/users/admin.py - -from django.contrib import admin -from django.contrib.auth.admin import UserAdmin as BaseUserAdmin -from .models import User - -@admin.register(User) -class UserAdmin(BaseUserAdmin): - list_display = ('username', 'email', 'full_name', 'is_staff', 'is_active') - list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups') - search_fields = ('username', 'email', 'full_name') - fieldsets = ( - (None, {'fields': ('username', 'password')}), - ('Персональное', {'fields': ('full_name', 'bio', 'avatar')}), - ('Контакты', {'fields': ('email',)}), - ('Права доступа', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), - ('Важные даты', {'fields': ('last_login', 'date_joined')}), - ) - \ No newline at end of file diff --git a/.history/backend/users/models_20250506100403.py b/.history/backend/users/models_20250506100403.py deleted file mode 100644 index 71a8362..0000000 --- a/.history/backend/users/models_20250506100403.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/.history/backend/users/models_20250506101504.py b/.history/backend/users/models_20250506101504.py deleted file mode 100644 index 526cead..0000000 --- a/.history/backend/users/models_20250506101504.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.contrib.auth.models import AbstractUser -from django.db import models - -class User(AbstractUser): - full_name = models.CharField(max_length=150, blank=True) - bio = models.TextField(blank=True) - avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) - - def __str__(self): - return self.username \ No newline at end of file diff --git a/.history/backend/users/models_20250506101615.py b/.history/backend/users/models_20250506101615.py deleted file mode 100644 index 3f31062..0000000 --- a/.history/backend/users/models_20250506101615.py +++ /dev/null @@ -1,37 +0,0 @@ -from django.contrib.auth.models import AbstractUser, Group, Permission -from django.db import models - -class User(AbstractUser): - full_name = models.CharField(max_length=150, blank=True) - bio = models.TextField(blank=True) - avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) - - # Переопределяем поля групп и разрешений, чтобы избежать конфликтов обратных связей - groups = models.ManyToManyField( - Group, - related_name='custom_user_set', - blank=True, - help_text='The groups this user belongs to.', - verbose_name='groups', - ) - user_permissions = models.ManyToManyField( - Permission, - related_name='custom_user_set', - blank=True, - help_text='Specific permissions for this user.', - verbose_name='user permissions', - ) - - def __str__(self): - return self.username -```python -from django.contrib.auth.models import AbstractUser -from django.db import models - -class User(AbstractUser): - full_name = models.CharField(max_length=150, blank=True) - bio = models.TextField(blank=True) - avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) - - def __str__(self): - return self.username \ No newline at end of file diff --git a/.history/backend/users/models_20250506101631.py b/.history/backend/users/models_20250506101631.py deleted file mode 100644 index 1aade97..0000000 --- a/.history/backend/users/models_20250506101631.py +++ /dev/null @@ -1,38 +0,0 @@ -from django.contrib.auth.models import AbstractUser, Group, Permission -from django.db import models - -class User(AbstractUser): - full_name = models.CharField(max_length=150, blank=True) - bio = models.TextField(blank=True) - avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) - - # Переопределяем поля групп и разрешений, чтобы избежать конфликтов обратных связей - groups = models.ManyToManyField( - Group, - related_name='custom_user_set', - blank=True, - help_text='The groups this user belongs to.', - verbose_name='groups', - ) - user_permissions = models.ManyToManyField( - Permission, - related_name='custom_user_set', - blank=True, - help_text='Specific permissions for this user.', - verbose_name='user permissions', - ) - - def __str__(self): - return self.username - - -from django.contrib.auth.models import AbstractUser -from django.db import models - -class User(AbstractUser): - full_name = models.CharField(max_length=150, blank=True) - bio = models.TextField(blank=True) - avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) - - def __str__(self): - return self.username \ No newline at end of file diff --git a/.history/backend/users/models_20250506102048.py b/.history/backend/users/models_20250506102048.py deleted file mode 100644 index a99b450..0000000 --- a/.history/backend/users/models_20250506102048.py +++ /dev/null @@ -1,104 +0,0 @@ -# users/models.py - -from django.contrib.auth.models import AbstractUser -from django.db import models - -class User(AbstractUser): - """ - Пользовательская модель, расширяющая стандартную AbstractUser. - """ - full_name = models.CharField( - max_length=150, - blank=True, - help_text='Полное имя пользователя' - ) - bio = models.TextField( - blank=True, - help_text='Краткая биография пользователя' - ) - avatar = models.ImageField( - upload_to='avatars/', - null=True, - blank=True, - help_text='Аватар пользователя' - ) - - def __str__(self): - return self.username - def get_full_name(self): - """ - Возвращает полное имя пользователя. - """ - return self.full_name if self.full_name else self.username - def get_short_name(self): - """ - Возвращает короткое имя пользователя. - """ - return self.username - def get_bio(self): - """ - Возвращает биографию пользователя. - """ - return self.bio if self.bio else "Нет информации о пользователе" - def get_avatar(self): - """ - Возвращает URL аватара пользователя. - """ - return self.avatar.url if self.avatar else None - def get_user_info(self): - """ - Возвращает словарь с информацией о пользователе. - """ - return { - 'username': self.username, - 'full_name': self.get_full_name(), - 'bio': self.get_bio(), - 'avatar': self.get_avatar() - } - def get_user_links(self): - """ - Возвращает список ссылок пользователя. - """ - from links.models import Link - return Link.objects.filter(owner=self).values('title', 'url') - def get_user_design(self): - """ - Возвращает настройки дизайна пользователя. - """ - from customization.models import DesignSettings - try: - design = DesignSettings.objects.get(user=self) - return { - 'theme_color': design.theme_color, - 'background_image': design.background_image.url if design.background_image else None, - 'font_family': design.font_family, - 'custom_css': design.custom_css - } - except DesignSettings.DoesNotExist: - return None - def get_user_groups(self): - """ - Возвращает группы пользователя. - """ - return self.groups.all().values('name') - def get_user_permissions(self): - """ - Возвращает разрешения пользователя. - """ - return self.user_permissions.all().values('codename') - def get_user_permissions_list(self): - """ - Возвращает список разрешений пользователя. - """ - return list(self.get_user_permissions().values_list('codename', flat=True)) - def get_user_permissions_dict(self): - """ - Возвращает словарь с разрешениями пользователя. - """ - return {perm.codename: perm.name for perm in self.user_permissions.all()} - def get_user_permissions_dict_list(self): - """ - Возвращает список словарей с разрешениями пользователя. - """ - return [{'codename': perm.codename, 'name': perm.name} for perm in self.user_permissions.all()] - \ No newline at end of file diff --git a/.history/backend/users/models_20250506102345.py b/.history/backend/users/models_20250506102345.py deleted file mode 100644 index e5adc97..0000000 --- a/.history/backend/users/models_20250506102345.py +++ /dev/null @@ -1,97 +0,0 @@ -# users/models.py - -from django.contrib.auth.models import AbstractUser -from django.db import models - -class User(AbstractUser): - """ - Пользовательская модель, расширяющая стандартную AbstractUser. - """ - full_name = models.CharField( - max_length=150, - blank=True, - help_text='Полное имя пользователя' - ) - bio = models.TextField( - blank=True, - help_text='Краткая биография пользователя' - ) - avatar = models.ImageField( - upload_to='avatars/', - null=True, - blank=True, - help_text='Аватар пользователя' - ) - - def __str__(self): - return self.username - - def get_full_name(self): - """ - Возвращает полное имя пользователя. - """ - return self.full_name if self.full_name else self.username - - def get_short_name(self): - """ - Возвращает короткое имя пользователя. - """ - return self.username - - def get_bio(self): - """ - Возвращает биографию пользователя. - """ - return self.bio if self.bio else "Нет информации о пользователе" - - def get_avatar(self): - """ - Возвращает URL аватара пользователя. - """ - return self.avatar.url if self.avatar else None - - def get_user_info(self): - """ - Возвращает словарь с информацией о пользователе. - """ - return { - 'username': self.username, - 'full_name': self.get_full_name(), - 'bio': self.get_bio(), - 'avatar': self.get_avatar() - } - - def get_user_links(self): - """ - Возвращает список ссылок пользователя. - """ - from links.models import Link - return Link.objects.filter(group__owner=self).values('title', 'url') - - def get_user_design(self): - """ - Возвращает настройки дизайна пользователя. - """ - from customization.models import DesignSettings - try: - design = DesignSettings.objects.get(user=self) - return { - 'theme_color': design.theme_color, - 'background_image': design.background_image.url if design.background_image else None, - 'font_family': design.font_family, - 'custom_css': design.custom_css - } - except DesignSettings.DoesNotExist: - return None - - def get_user_groups(self): - """ - Возвращает группы пользователя. - """ - return list(self.link_groups.values('title', 'order')) - - def get_user_permissions(self): - """ - Возвращает разрешения пользователя. - """ - return list(self.user_permissions.values_list('codename', flat=True)) diff --git a/.history/backend/users/models_20250506183242.py b/.history/backend/users/models_20250506183242.py deleted file mode 100644 index 6e6551e..0000000 --- a/.history/backend/users/models_20250506183242.py +++ /dev/null @@ -1,97 +0,0 @@ -# users/models.py - -from django.contrib.auth.models import AbstractUser -from django.db import models - -class User(AbstractUser): - """ - Пользовательская модель, расширяющая стандартную AbstractUser. - """ - full_name = models.CharField( - max_length=150, - blank=True, - help_text='Полное имя пользователя' - ) - bio = models.TextField( - blank=True, - help_text='Краткая биография пользователя' - ) - avatar = models.ImageField( - upload_to='frontend/assets/img/avatars/', - null=True, - blank=True, - help_text='Аватар пользователя' - ) - - def __str__(self): - return self.username - - def get_full_name(self): - """ - Возвращает полное имя пользователя. - """ - return self.full_name if self.full_name else self.username - - def get_short_name(self): - """ - Возвращает короткое имя пользователя. - """ - return self.username - - def get_bio(self): - """ - Возвращает биографию пользователя. - """ - return self.bio if self.bio else "Нет информации о пользователе" - - def get_avatar(self): - """ - Возвращает URL аватара пользователя. - """ - return self.avatar.url if self.avatar else None - - def get_user_info(self): - """ - Возвращает словарь с информацией о пользователе. - """ - return { - 'username': self.username, - 'full_name': self.get_full_name(), - 'bio': self.get_bio(), - 'avatar': self.get_avatar() - } - - def get_user_links(self): - """ - Возвращает список ссылок пользователя. - """ - from links.models import Link - return Link.objects.filter(group__owner=self).values('title', 'url') - - def get_user_design(self): - """ - Возвращает настройки дизайна пользователя. - """ - from customization.models import DesignSettings - try: - design = DesignSettings.objects.get(user=self) - return { - 'theme_color': design.theme_color, - 'background_image': design.background_image.url if design.background_image else None, - 'font_family': design.font_family, - 'custom_css': design.custom_css - } - except DesignSettings.DoesNotExist: - return None - - def get_user_groups(self): - """ - Возвращает группы пользователя. - """ - return list(self.link_groups.values('title', 'order')) - - def get_user_permissions(self): - """ - Возвращает разрешения пользователя. - """ - return list(self.user_permissions.values_list('codename', flat=True)) diff --git a/.history/backend/users/models_20250506185741.py b/.history/backend/users/models_20250506185741.py deleted file mode 100644 index e5adc97..0000000 --- a/.history/backend/users/models_20250506185741.py +++ /dev/null @@ -1,97 +0,0 @@ -# users/models.py - -from django.contrib.auth.models import AbstractUser -from django.db import models - -class User(AbstractUser): - """ - Пользовательская модель, расширяющая стандартную AbstractUser. - """ - full_name = models.CharField( - max_length=150, - blank=True, - help_text='Полное имя пользователя' - ) - bio = models.TextField( - blank=True, - help_text='Краткая биография пользователя' - ) - avatar = models.ImageField( - upload_to='avatars/', - null=True, - blank=True, - help_text='Аватар пользователя' - ) - - def __str__(self): - return self.username - - def get_full_name(self): - """ - Возвращает полное имя пользователя. - """ - return self.full_name if self.full_name else self.username - - def get_short_name(self): - """ - Возвращает короткое имя пользователя. - """ - return self.username - - def get_bio(self): - """ - Возвращает биографию пользователя. - """ - return self.bio if self.bio else "Нет информации о пользователе" - - def get_avatar(self): - """ - Возвращает URL аватара пользователя. - """ - return self.avatar.url if self.avatar else None - - def get_user_info(self): - """ - Возвращает словарь с информацией о пользователе. - """ - return { - 'username': self.username, - 'full_name': self.get_full_name(), - 'bio': self.get_bio(), - 'avatar': self.get_avatar() - } - - def get_user_links(self): - """ - Возвращает список ссылок пользователя. - """ - from links.models import Link - return Link.objects.filter(group__owner=self).values('title', 'url') - - def get_user_design(self): - """ - Возвращает настройки дизайна пользователя. - """ - from customization.models import DesignSettings - try: - design = DesignSettings.objects.get(user=self) - return { - 'theme_color': design.theme_color, - 'background_image': design.background_image.url if design.background_image else None, - 'font_family': design.font_family, - 'custom_css': design.custom_css - } - except DesignSettings.DoesNotExist: - return None - - def get_user_groups(self): - """ - Возвращает группы пользователя. - """ - return list(self.link_groups.values('title', 'order')) - - def get_user_permissions(self): - """ - Возвращает разрешения пользователя. - """ - return list(self.user_permissions.values_list('codename', flat=True)) diff --git a/.history/backend/users/models_20250506185753.py b/.history/backend/users/models_20250506185753.py deleted file mode 100644 index be7a948..0000000 --- a/.history/backend/users/models_20250506185753.py +++ /dev/null @@ -1,101 +0,0 @@ -# users/models.py - -from django.contrib.auth.models import AbstractUser -from django.db import models - -class User(AbstractUser): - """ - Пользовательская модель, расширяющая стандартную AbstractUser. - """ - full_name = models.CharField( - max_length=150, - blank=True, - help_text='Полное имя пользователя' - ) - bio = models.TextField( - blank=True, - help_text='Краткая биография пользователя' - ) - avatar = models.ImageField( - upload_to='avatars/', - null=True, - blank=True, - help_text='Аватар пользователя' - ) - cover = models.ImageField( - upload_to='avatars/covers/', - null=True, - blank=True, - ) - def __str__(self): - return self.username - - def get_full_name(self): - """ - Возвращает полное имя пользователя. - """ - return self.full_name if self.full_name else self.username - - def get_short_name(self): - """ - Возвращает короткое имя пользователя. - """ - return self.username - - def get_bio(self): - """ - Возвращает биографию пользователя. - """ - return self.bio if self.bio else "Нет информации о пользователе" - - def get_avatar(self): - """ - Возвращает URL аватара пользователя. - """ - return self.avatar.url if self.avatar else None - - def get_user_info(self): - """ - Возвращает словарь с информацией о пользователе. - """ - return { - 'username': self.username, - 'full_name': self.get_full_name(), - 'bio': self.get_bio(), - 'avatar': self.get_avatar() - } - - def get_user_links(self): - """ - Возвращает список ссылок пользователя. - """ - from links.models import Link - return Link.objects.filter(group__owner=self).values('title', 'url') - - def get_user_design(self): - """ - Возвращает настройки дизайна пользователя. - """ - from customization.models import DesignSettings - try: - design = DesignSettings.objects.get(user=self) - return { - 'theme_color': design.theme_color, - 'background_image': design.background_image.url if design.background_image else None, - 'font_family': design.font_family, - 'custom_css': design.custom_css - } - except DesignSettings.DoesNotExist: - return None - - def get_user_groups(self): - """ - Возвращает группы пользователя. - """ - return list(self.link_groups.values('title', 'order')) - - def get_user_permissions(self): - """ - Возвращает разрешения пользователя. - """ - return list(self.user_permissions.values_list('codename', flat=True)) diff --git a/.history/backend/users/urls_20250506161044.py b/.history/backend/users/urls_20250506161044.py deleted file mode 100644 index e69de29..0000000 diff --git a/.history/backend/users/urls_20250506161344.py b/.history/backend/users/urls_20250506161344.py deleted file mode 100644 index f3bfa1b..0000000 --- a/.history/backend/users/urls_20250506161344.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.urls import path - -urlpatterns = [ - # дополнительные эндпоинты по ссылкам -] \ No newline at end of file diff --git a/.history/docker-compose_20251029190357.yml b/.history/docker-compose_20251029190357.yml deleted file mode 100644 index e456826..0000000 --- a/.history/docker-compose_20251029190357.yml +++ /dev/null @@ -1,39 +0,0 @@ -version: '3.8' -services: - web: - build: ./backend - command: gunicorn backend.wsgi:application --bind 0.0.0.0:8000 - volumes: - - ./backend:/app - - media_volume:/app/storage - - static_volume:/app/staticfiles - env_file: - - .env.example - ports: - - "8000:8000" - depends_on: - - db - restart: unless-stopped - - db: - image: postgres:14 - volumes: - - postgres_data:/var/lib/postgresql/data/ - env_file: - - .env.example - restart: unless-stopped - - frontend: - build: ./frontend/linktree-frontend - ports: - - "3000:3000" - environment: - - NEXT_PUBLIC_API_URL=http://localhost:8000 - restart: unless-stopped - depends_on: - - web - -volumes: - postgres_data: - media_volume: - static_volume: diff --git a/.history/docker-compose_20251029190516.yml b/.history/docker-compose_20251029190516.yml deleted file mode 100644 index e456826..0000000 --- a/.history/docker-compose_20251029190516.yml +++ /dev/null @@ -1,39 +0,0 @@ -version: '3.8' -services: - web: - build: ./backend - command: gunicorn backend.wsgi:application --bind 0.0.0.0:8000 - volumes: - - ./backend:/app - - media_volume:/app/storage - - static_volume:/app/staticfiles - env_file: - - .env.example - ports: - - "8000:8000" - depends_on: - - db - restart: unless-stopped - - db: - image: postgres:14 - volumes: - - postgres_data:/var/lib/postgresql/data/ - env_file: - - .env.example - restart: unless-stopped - - frontend: - build: ./frontend/linktree-frontend - ports: - - "3000:3000" - environment: - - NEXT_PUBLIC_API_URL=http://localhost:8000 - restart: unless-stopped - depends_on: - - web - -volumes: - postgres_data: - media_volume: - static_volume: diff --git a/.history/docker-compose_20251029190616.yml b/.history/docker-compose_20251029190616.yml deleted file mode 100644 index d690a19..0000000 --- a/.history/docker-compose_20251029190616.yml +++ /dev/null @@ -1,39 +0,0 @@ -version: '3.8' -services: - web: - build: ./backend - command: gunicorn backend.wsgi:application --bind 0.0.0.0:8000 - volumes: - - ./backend:/app - - media_volume:/app/storage - - static_volume:/app/staticfiles - env_file: - - .env - ports: - - "8000:8000" - depends_on: - - db - restart: unless-stopped - - db: - image: postgres:14 - volumes: - - postgres_data:/var/lib/postgresql/data/ - env_file: - - .env - restart: unless-stopped - - frontend: - build: ./frontend/linktree-frontend - ports: - - "3000:3000" - environment: - - NEXT_PUBLIC_API_URL=http://localhost:8000 - restart: unless-stopped - depends_on: - - web - -volumes: - postgres_data: - media_volume: - static_volume: diff --git a/.history/frontend/linktree-frontend/.env_20250506165735.local b/.history/frontend/linktree-frontend/.env_20250506165735.local deleted file mode 100644 index e69de29..0000000 diff --git a/.history/frontend/linktree-frontend/.env_20250506165738.local b/.history/frontend/linktree-frontend/.env_20250506165738.local deleted file mode 100644 index 2bf68ba..0000000 --- a/.history/frontend/linktree-frontend/.env_20250506165738.local +++ /dev/null @@ -1 +0,0 @@ -NEXT_PUBLIC_API_URL=http://127.0.0.1:8000 \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/.env_20251029195502.local b/.history/frontend/linktree-frontend/.env_20251029195502.local deleted file mode 100644 index 4b5b7a9..0000000 --- a/.history/frontend/linktree-frontend/.env_20251029195502.local +++ /dev/null @@ -1,4 +0,0 @@ -# Next.js Environment Variables -# NOTE: For API calls in client components, use relative URLs like '/api/auth/login' -# This variable is only used for server-side rendering and image URLs -NEXT_PUBLIC_API_URL=http://localhost:8000 \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/.env_20251029195517.local b/.history/frontend/linktree-frontend/.env_20251029195517.local deleted file mode 100644 index 4b5b7a9..0000000 --- a/.history/frontend/linktree-frontend/.env_20251029195517.local +++ /dev/null @@ -1,4 +0,0 @@ -# Next.js Environment Variables -# NOTE: For API calls in client components, use relative URLs like '/api/auth/login' -# This variable is only used for server-side rendering and image URLs -NEXT_PUBLIC_API_URL=http://localhost:8000 \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/.next/types/app/dashboard/page_20250507074450.ts b/.history/frontend/linktree-frontend/.next/types/app/dashboard/page_20250507074450.ts deleted file mode 100644 index e5cebfe..0000000 --- a/.history/frontend/linktree-frontend/.next/types/app/dashboard/page_20250507074450.ts +++ /dev/null @@ -1,84 +0,0 @@ -// File: /home/trevor/links/frontend/linktree-frontend/src/app/dashboard/page.tsx -import * as entry from '../../../../src/app/dashboard/page.js' -import type { ResolvingMetadata, ResolvingViewport } from 'next/dist/lib/metadata/types/metadata-interface.js' - -type TEntry = typeof import('../../../../src/app/dashboard/page.js') - -type SegmentParams = T extends Record - ? { [K in keyof T]: T[K] extends string ? string | string[] | undefined : never } - : T - -// Check that the entry is a valid entry -checkFields | false - dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static' - dynamicParams?: boolean - fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache' - preferredRegion?: 'auto' | 'global' | 'home' | string | string[] - runtime?: 'nodejs' | 'experimental-edge' | 'edge' - maxDuration?: number - - metadata?: any - generateMetadata?: Function - viewport?: any - generateViewport?: Function - experimental_ppr?: boolean - -}, TEntry, ''>>() - - -// Check the prop type of the entry function -checkFields, 'default'>>() - -// Check the arguments and return type of the generateMetadata function -if ('generateMetadata' in entry) { - checkFields>, 'generateMetadata'>>() - checkFields>, 'generateMetadata'>>() -} - -// Check the arguments and return type of the generateViewport function -if ('generateViewport' in entry) { - checkFields>, 'generateViewport'>>() - checkFields>, 'generateViewport'>>() -} - -// Check the arguments and return type of the generateStaticParams function -if ('generateStaticParams' in entry) { - checkFields>, 'generateStaticParams'>>() - checkFields }, { __tag__: 'generateStaticParams', __return_type__: ReturnType> }>>() -} - -export interface PageProps { - params?: Promise - searchParams?: Promise -} -export interface LayoutProps { - children?: React.ReactNode - - params?: Promise -} - -// ============= -// Utility types -type RevalidateRange = T extends { revalidate: any } ? NonNegative : never - -// If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit. -type OmitWithTag = Omit -type Diff = 0 extends (1 & T) ? {} : OmitWithTag - -type FirstArg = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never -type SecondArg = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never -type MaybeField = T extends { [k in K]: infer G } ? G extends Function ? G : never : never - - - -function checkFields<_ extends { [k in keyof any]: never }>() {} - -// https://github.com/sindresorhus/type-fest -type Numeric = number | bigint -type Zero = 0 | 0n -type Negative = T extends Zero ? never : `${T}` extends `-${string}` ? T : never -type NonNegative = T extends Zero ? T : Negative extends never ? T : '__invalid_negative_number__' diff --git a/.history/frontend/linktree-frontend/.next/types/app/dashboard/page_20250507074950.ts b/.history/frontend/linktree-frontend/.next/types/app/dashboard/page_20250507074950.ts deleted file mode 100644 index d351c31..0000000 --- a/.history/frontend/linktree-frontend/.next/types/app/dashboard/page_20250507074950.ts +++ /dev/null @@ -1,84 +0,0 @@ -// File: /home/trevor/links/frontend/linktree-frontend/src/app/dashboard/page.tsx -import * as entry from '../../../../src/app/(protected)/dashboard/page.jsx' -import type { ResolvingMetadata, ResolvingViewport } from 'next/dist/lib/metadata/types/metadata-interface.js' - -type TEntry = typeof import('../../../../src/app/(protected)/dashboard/page.jsx') - -type SegmentParams = T extends Record - ? { [K in keyof T]: T[K] extends string ? string | string[] | undefined : never } - : T - -// Check that the entry is a valid entry -checkFields | false - dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static' - dynamicParams?: boolean - fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache' - preferredRegion?: 'auto' | 'global' | 'home' | string | string[] - runtime?: 'nodejs' | 'experimental-edge' | 'edge' - maxDuration?: number - - metadata?: any - generateMetadata?: Function - viewport?: any - generateViewport?: Function - experimental_ppr?: boolean - -}, TEntry, ''>>() - - -// Check the prop type of the entry function -checkFields, 'default'>>() - -// Check the arguments and return type of the generateMetadata function -if ('generateMetadata' in entry) { - checkFields>, 'generateMetadata'>>() - checkFields>, 'generateMetadata'>>() -} - -// Check the arguments and return type of the generateViewport function -if ('generateViewport' in entry) { - checkFields>, 'generateViewport'>>() - checkFields>, 'generateViewport'>>() -} - -// Check the arguments and return type of the generateStaticParams function -if ('generateStaticParams' in entry) { - checkFields>, 'generateStaticParams'>>() - checkFields }, { __tag__: 'generateStaticParams', __return_type__: ReturnType> }>>() -} - -export interface PageProps { - params?: Promise - searchParams?: Promise -} -export interface LayoutProps { - children?: React.ReactNode - - params?: Promise -} - -// ============= -// Utility types -type RevalidateRange = T extends { revalidate: any } ? NonNegative : never - -// If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit. -type OmitWithTag = Omit -type Diff = 0 extends (1 & T) ? {} : OmitWithTag - -type FirstArg = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never -type SecondArg = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never -type MaybeField = T extends { [k in K]: infer G } ? G extends Function ? G : never : never - - - -function checkFields<_ extends { [k in keyof any]: never }>() {} - -// https://github.com/sindresorhus/type-fest -type Numeric = number | bigint -type Zero = 0 | 0n -type Negative = T extends Zero ? never : `${T}` extends `-${string}` ? T : never -type NonNegative = T extends Zero ? T : Negative extends never ? T : '__invalid_negative_number__' diff --git a/.history/frontend/linktree-frontend/Dockerfile_20251029190402 b/.history/frontend/linktree-frontend/Dockerfile_20251029190402 deleted file mode 100644 index 1aa44d2..0000000 --- a/.history/frontend/linktree-frontend/Dockerfile_20251029190402 +++ /dev/null @@ -1,19 +0,0 @@ -FROM node:18-alpine - -WORKDIR /app - -# Копирование package.json и package-lock.json -COPY package*.json ./ - -# Установка зависимостей -RUN npm ci - -# Копирование исходного кода -COPY . . - -# Сборка приложения -RUN npm run build - -EXPOSE 3000 - -CMD ["npm", "start"] \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/Dockerfile_20251029190516 b/.history/frontend/linktree-frontend/Dockerfile_20251029190516 deleted file mode 100644 index 1aa44d2..0000000 --- a/.history/frontend/linktree-frontend/Dockerfile_20251029190516 +++ /dev/null @@ -1,19 +0,0 @@ -FROM node:18-alpine - -WORKDIR /app - -# Копирование package.json и package-lock.json -COPY package*.json ./ - -# Установка зависимостей -RUN npm ci - -# Копирование исходного кода -COPY . . - -# Сборка приложения -RUN npm run build - -EXPOSE 3000 - -CMD ["npm", "start"] \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/Dockerfile_20251029191222 b/.history/frontend/linktree-frontend/Dockerfile_20251029191222 deleted file mode 100644 index 24b1300..0000000 --- a/.history/frontend/linktree-frontend/Dockerfile_20251029191222 +++ /dev/null @@ -1,19 +0,0 @@ -FROM node:20-alpine - -WORKDIR /app - -# Копирование package.json и package-lock.json -COPY package*.json ./ - -# Установка зависимостей -RUN npm install - -# Копирование исходного кода -COPY . . - -# Сборка приложения -RUN npm run build - -EXPOSE 3000 - -CMD ["npm", "start"] \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/Dockerfile_20251029191321 b/.history/frontend/linktree-frontend/Dockerfile_20251029191321 deleted file mode 100644 index 24b1300..0000000 --- a/.history/frontend/linktree-frontend/Dockerfile_20251029191321 +++ /dev/null @@ -1,19 +0,0 @@ -FROM node:20-alpine - -WORKDIR /app - -# Копирование package.json и package-lock.json -COPY package*.json ./ - -# Установка зависимостей -RUN npm install - -# Копирование исходного кода -COPY . . - -# Сборка приложения -RUN npm run build - -EXPOSE 3000 - -CMD ["npm", "start"] \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/design/index_20250506121619.html b/.history/frontend/linktree-frontend/design/index_20250506121619.html deleted file mode 100644 index 1d06fe2..0000000 --- a/.history/frontend/linktree-frontend/design/index_20250506121619.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - Home - Brand - - - - - - - - - - - - - - - - - - -
-
-
-
-
-

Ваши ссылки. Ваш стиль. Ваш CatLink.

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Публикация

-

Делитесь единой ссылкой catlinks.kr/ваше-имя в био, мессенджерах и письмах.

-
-
-
-
-
-

Почему CatLink?

-

повяжите свои миры одной «хвостовой» ссылкой.

-
-
-
-
-
-

Разместите всё важное на одной ссылке

-

и идите дальше, как кошка: легко и грациозно.

-
-
-
-
-
-
-
-
-
-
-

Fully Responsive Design

-

When you use a theme created with Bootstrap, you know that the theme will look great on any device, whether it's a phone, tablet, or desktop the page will behave responsively!

-
-
-
-
-
-

Updated For Bootstrap 5

-

Newly improved, and full of great utility classes, Bootstrap 5 is leading the way in mobile responsive web development! All of the themes are now using Bootstrap 5!

-
-
-
-
-
-

Easy to Use & Customize

-

Landing Page is just HTML and CSS with a splash of SCSS for users who demand some deeper customization options. Out of the box, just add your content and images, and your new landing page will be ready to go!

-
-
-
-
-
-
-

What people are saying...

-
-
-
-
Margaret E.
-

"This is fantastic! Thanks so much guys!"

-
-
-
-
-
Fred S.
-

"Bootstrap is amazing. I've been using it to create lots of super nice landing pages."

-
-
-
-
-
Sarah W.
-

"Thanks so much for making these free resources available to us!"

-
-
-
-
-
-
-
-
-
-
-

Ready to get started? Sign up now!

-
-
-
-
-
-
-
-
-
-
-
-
- - - - - - - \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/design/index_20250506121722.html b/.history/frontend/linktree-frontend/design/index_20250506121722.html deleted file mode 100644 index b6f52e7..0000000 --- a/.history/frontend/linktree-frontend/design/index_20250506121722.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - Home - Brand - - - - - - - - - - - - - - - - - - -
-
-
-
-
-

Ваши ссылки. Ваш стиль. Ваш CatLink.

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Публикация

-

Делитесь единой ссылкой catlinks.kr/ваше-имя в био, мессенджерах и письмах.

-
-
-
-
-
-

Почему CatLink?

-

повяжите свои миры одной «хвостовой» ссылкой.

-
-
-
-
-
-

Разместите всё важное на одной ссылке

-

и идите дальше, как кошка: легко и грациозно.

-
-
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/next.config_20250506105332.ts b/.history/frontend/linktree-frontend/next.config_20250506105332.ts deleted file mode 100644 index e9ffa30..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506105332.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { NextConfig } from "next"; - -const nextConfig: NextConfig = { - /* config options here */ -}; - -export default nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506110838.ts b/.history/frontend/linktree-frontend/next.config_20250506110838.ts deleted file mode 100644 index 3dfb3e7..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506110838.ts +++ /dev/null @@ -1,9 +0,0 @@ -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - experimental: { - allowedDevOrigins: ['http://192.168.219.114:3000'], - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506110855.ts b/.history/frontend/linktree-frontend/next.config_20250506110855.ts deleted file mode 100644 index a13de21..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506110855.ts +++ /dev/null @@ -1,9 +0,0 @@ -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - experimental: { - allowedDevOrigins: ['http://192.168.219.114'], - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506111113.ts b/.history/frontend/linktree-frontend/next.config_20250506111113.ts deleted file mode 100644 index 3dfb3e7..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506111113.ts +++ /dev/null @@ -1,9 +0,0 @@ -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - experimental: { - allowedDevOrigins: ['http://192.168.219.114:3000'], - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506111337.ts b/.history/frontend/linktree-frontend/next.config_20250506111337.ts deleted file mode 100644 index 14fb4fd..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506111337.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вы хотите явно указать, что используете App Router: - experimental: { appDir: true }, - - // Разрешённые origin для дев-сборки: - allowedDevOrigins: ['http://192.168.219.114:3000'] -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506112451.ts b/.history/frontend/linktree-frontend/next.config_20250506112451.ts deleted file mode 100644 index f078a13..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506112451.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вы хотите явно указать, что используете App Router: - experimental: { appDir: true }, - - // Разрешённые origin для дев-сборки: - allowedDevOrigins: ['http://192.168.219.114:3001'], -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506112528.ts b/.history/frontend/linktree-frontend/next.config_20250506112528.ts deleted file mode 100644 index f7decaf..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506112528.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вы хотите явно указать, что используете App Router: - experimental: { }, - - // Разрешённые origin для дев-сборки: - allowedDevOrigins: ['http://192.168.219.114:3001'], -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506112638.ts b/.history/frontend/linktree-frontend/next.config_20250506112638.ts deleted file mode 100644 index ec0f08f..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506112638.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вы хотите явно указать, что используете App Router: - experimental: { }, - - // Разрешённые origin для дев-сборки: -}; - -module.exports = nextConfig; -module.exports = { - allowedDevOrigins: ['local-origin.dev', '*.local-origin.dev'], -} diff --git a/.history/frontend/linktree-frontend/next.config_20250506112648.ts b/.history/frontend/linktree-frontend/next.config_20250506112648.ts deleted file mode 100644 index fd75a0d..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506112648.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вы хотите явно указать, что используете App Router: - experimental: { }, - - // Разрешённые origin для дев-сборки: -}; - -// module.exports = nextConfig; -module.exports = { - allowedDevOrigins: ['local-origin.dev', '*.local-origin.dev'], -} diff --git a/.history/frontend/linktree-frontend/next.config_20250506112732.ts b/.history/frontend/linktree-frontend/next.config_20250506112732.ts deleted file mode 100644 index 2aec7e3..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506112732.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вы хотите явно указать, что используете App Router: - experimental: { }, - - // Разрешённые origin для дев-сборки: -}; - -// module.exports = nextConfig; -module.exports = { - allowedDevOrigins: ['local-origin.dev', '*.local-origin.dev', 'localhost', '192.168.219.114', 'localhost:3000', '192.168.219.114:3000'], -} diff --git a/.history/frontend/linktree-frontend/next.config_20250506112757.ts b/.history/frontend/linktree-frontend/next.config_20250506112757.ts deleted file mode 100644 index 4fe84b3..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506112757.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вы хотите явно указать, что используете App Router: - experimental: { }, - - // Разрешённые origin для дев-сборки: -}; - -// module.exports = nextConfig; -module.exports = { - allowedDevOrigins: ['local-origin.dev', '*.local-origin.dev', 'localhost', '192.168.219.114', 'localhost:3000', '192.168.219.114:3000', '192.168.219.114"3001', '0.0.0.0'], -} diff --git a/.history/frontend/linktree-frontend/next.config_20250506113104.ts b/.history/frontend/linktree-frontend/next.config_20250506113104.ts deleted file mode 100644 index ceb3556..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506113104.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вы хотите явно указать, что используете App Router: - experimental: { }, - - // Разрешённые origin для дев-сборки: -}; - -// module.exports = nextConfig; -module.exports = { - allowedDevOrigins: ['local-origin.dev', '*.local-origin.dev', 'localhost', '192.168.219.114', 'localhost:3000', '192.168.219.114:3000', '192.168.219.114"3001', '0.0.0.0'], - plugins: { - "@tailwindcss/postcss": {}, // вместо `tailwindcss` - autoprefixer: {}, - }, -} diff --git a/.history/frontend/linktree-frontend/next.config_20250506113412.ts b/.history/frontend/linktree-frontend/next.config_20250506113412.ts deleted file mode 100644 index 818feb7..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506113412.ts +++ /dev/null @@ -1,14 +0,0 @@ -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вам не нужно явное разрешение App Router — эту секцию можно убрать. - // experimental: { appDir: true }, - - // Протокол обязателен, указывайте точный origin, включая порт. - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001' - ], -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506113540.ts b/.history/frontend/linktree-frontend/next.config_20250506113540.ts deleted file mode 100644 index 53b8808..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506113540.ts +++ /dev/null @@ -1,17 +0,0 @@ -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вам не нужно явное разрешение App Router — эту секцию можно убрать. - // experimental: { appDir: true }, - - // Протокол обязателен, указывайте точный origin, включая порт. - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506162624.ts b/.history/frontend/linktree-frontend/next.config_20250506162624.ts deleted file mode 100644 index 26d1de3..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506162624.ts +++ /dev/null @@ -1,23 +0,0 @@ -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вам не нужно явное разрешение App Router — эту секцию можно убрать. - // experimental: { appDir: true }, - - // Протокол обязателен, указывайте точный origin, включая порт. - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - return [ - { - source: '/api/:path*', - destination: 'http://127.0.0.1:8000/api/:path*' // проксируем API - }, - ] - -}; diff --git a/.history/frontend/linktree-frontend/next.config_20250506162706.ts b/.history/frontend/linktree-frontend/next.config_20250506162706.ts deleted file mode 100644 index dc80de5..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506162706.ts +++ /dev/null @@ -1,23 +0,0 @@ -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вам не нужно явное разрешение App Router — эту секцию можно убрать. - // experimental: { appDir: true }, - - // Протокол обязателен, указывайте точный origin, включая порт. - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - return [ - { - source: '/api/:path*', - destination: 'http://127.0.0.1:8000/api/:path*', // проксируем API - }, - ] - -}; diff --git a/.history/frontend/linktree-frontend/next.config_20250506162738.ts b/.history/frontend/linktree-frontend/next.config_20250506162738.ts deleted file mode 100644 index 2726e71..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506162738.ts +++ /dev/null @@ -1,27 +0,0 @@ -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вам не нужно явное разрешение App Router — эту секцию можно убрать. - // experimental: { appDir: true }, - - // Протокол обязателен, указывайте точный origin, включая порт. - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на ваш Django-сервер - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://127.0.0.1:8000/api/:path*' - } - ]; - }, -}; - -}; diff --git a/.history/frontend/linktree-frontend/next.config_20250506162743.ts b/.history/frontend/linktree-frontend/next.config_20250506162743.ts deleted file mode 100644 index 3cc47f1..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506162743.ts +++ /dev/null @@ -1,27 +0,0 @@ -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Если вам не нужно явное разрешение App Router — эту секцию можно убрать. - // experimental: { appDir: true }, - - // Протокол обязателен, указывайте точный origin, включая порт. - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на ваш Django-сервер - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://127.0.0.1:8000/api/:path*' - } - ]; - }, -}; - -module.exports = nextConfig; \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/next.config_20250506162900.ts b/.history/frontend/linktree-frontend/next.config_20250506162900.ts deleted file mode 100644 index a339391..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506162900.ts +++ /dev/null @@ -1,24 +0,0 @@ -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Разрешённые origin для дев-сборки - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксирование запросов /api/* на ваш Django-бэкенд - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://127.0.0.1:8000/api/:path*' - } - ]; - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506163923.ts b/.history/frontend/linktree-frontend/next.config_20250506163923.ts deleted file mode 100644 index fa24c08..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506163923.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506183909.ts b/.history/frontend/linktree-frontend/next.config_20250506183909.ts deleted file mode 100644 index 0582160..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506183909.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - - - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506183914.ts b/.history/frontend/linktree-frontend/next.config_20250506183914.ts deleted file mode 100644 index 4a76fdb..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506183914.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - - // Разрешаем 127.0.0.1 и localhost в качестве источников картинок - images: { - domains: ['127.0.0.1', 'localhost'], - }, - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506184017.ts b/.history/frontend/linktree-frontend/next.config_20250506184017.ts deleted file mode 100644 index 2e9ab1a..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506184017.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - - // Разрешаем 127.0.0.1 и localhost в качестве источников картинок - images: { - remotePatterns: ['127.0.0.1', 'localhost'], - }, - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506184039.ts b/.history/frontend/linktree-frontend/next.config_20250506184039.ts deleted file mode 100644 index 3a1bae0..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506184039.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - - // Разрешаем 127.0.0.1 и localhost в качестве источников картинок - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', - pathname: '/media/**', // <-- Media files live under /media/… - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', - pathname: '/media/**', - }, - ], - }, - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506184112.ts b/.history/frontend/linktree-frontend/next.config_20250506184112.ts deleted file mode 100644 index 05cede6..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506184112.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - - // Разрешаем 127.0.0.1 и localhost в качестве источников картинок - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '3001', - pathname: '/media/**', // <-- Media files live under /media/… - }, - { - protocol: 'http', - hostname: 'localhost', - port: '3001', - pathname: '/media/**', - }, - ], - }, - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506184242.ts b/.history/frontend/linktree-frontend/next.config_20250506184242.ts deleted file mode 100644 index 3a1bae0..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506184242.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - - // Разрешаем 127.0.0.1 и localhost в качестве источников картинок - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', - pathname: '/media/**', // <-- Media files live under /media/… - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', - pathname: '/media/**', - }, - ], - }, - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506184524.ts b/.history/frontend/linktree-frontend/next.config_20250506184524.ts deleted file mode 100644 index 4f03def..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506184524.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - - images: { - remotePatterns: [ - // Все файлы из MEDIA_URL (/media/...) - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // <— вот! - pathname: '/media/**', - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', - pathname: '/media/**', - }, - // Если у вас еще прямой доступ по /avatars/... - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', - pathname: '/avatars/**', - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', - pathname: '/avatars/**', - }, - ], - }, - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506190546.ts b/.history/frontend/linktree-frontend/next.config_20250506190546.ts deleted file mode 100644 index 4fa84f1..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506190546.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // <-- обязательно 8000, где Django отдаёт медиа - pathname: '/storage/**', // <-- подпапкиstorage/avatars, images/link_groups и т.д. - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', - pathname: '/storage/**', - }, - ], - }, - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506191412.ts b/.history/frontend/linktree-frontend/next.config_20250506191412.ts deleted file mode 100644 index eaf6aee..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506191412.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // <-- обязательно 8000, где Django отдаёт медиа - pathname: '/storage/**', // <-- подпапкиstorage/avatars, images/link_groups и т.д. - }, - - ], - }, - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250506191954.ts b/.history/frontend/linktree-frontend/next.config_20250506191954.ts deleted file mode 100644 index 36f692a..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250506191954.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // <-- обязательно 8000, где Django отдаёт медиа - pathname: '/storage/**', // <-- подпапкиstorage/avatars, images/link_groups и т.д. - }, - - ], - }, - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*/' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250507131744.ts b/.history/frontend/linktree-frontend/next.config_20250507131744.ts deleted file mode 100644 index 95f125e..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250507131744.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // <-- обязательно 8000, где Django отдаёт медиа - pathname: '/storage/**', // <-- подпапкиstorage/avatars, images/link_groups и т.д. - }, - - ], - }, - // Разрешаем в деве обращения с вашего адреса - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - 'http://127.0.0.1:3001', - ], - - // Проксируем все запросы /api/* на Django - async rewrites() { - return [ - { - source: '/api/:path*', // локальный путь на фронте - destination: 'http://127.0.0.1:8000/api/:path*/' // куда реально уходит запрос - } - ] - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250507133920.ts b/.history/frontend/linktree-frontend/next.config_20250507133920.ts deleted file mode 100644 index b8d6501..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250507133920.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - ], - }, - - // proxy all /api/* calls to Django - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://127.0.0.1:8000/api/:path*/', - }, - ]; - }, - - experimental: { - // whitelist origins you’ll browse from in dev - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://127.0.0.1:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20250507133940.ts b/.history/frontend/linktree-frontend/next.config_20250507133940.ts deleted file mode 100644 index 2240e33..0000000 --- a/.history/frontend/linktree-frontend/next.config_20250507133940.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - ], - }, - - // proxy all /api/* calls to Django - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://127.0.0.1:8000/api/:path*', - }, - ]; - }, - - experimental: { - // whitelist origins you’ll browse from in dev - allowedDevOrigins: [ - 'http://localhost:3001', - 'http://127.0.0.1:3001', - 'http://192.168.219.114:3001', - 'http://0.0.0.0:3001', - 'http://localhost:3000', - 'http://192.168.219.114:3000', - ], - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20251029191330.ts b/.history/frontend/linktree-frontend/next.config_20251029191330.ts deleted file mode 100644 index 648a620..0000000 --- a/.history/frontend/linktree-frontend/next.config_20251029191330.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - ], - }, - - // proxy all /api/* calls to Django - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://127.0.0.1:8000/api/:path*', - }, - ]; - }, - - eslint: { - // Предупреждение: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки ESLint. - ignoreDuringBuilds: true, - }, - typescript: { - // Опасно: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки TypeScript. - ignoreBuildErrors: true, - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20251029191556.ts b/.history/frontend/linktree-frontend/next.config_20251029191556.ts deleted file mode 100644 index 648a620..0000000 --- a/.history/frontend/linktree-frontend/next.config_20251029191556.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - ], - }, - - // proxy all /api/* calls to Django - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://127.0.0.1:8000/api/:path*', - }, - ]; - }, - - eslint: { - // Предупреждение: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки ESLint. - ignoreDuringBuilds: true, - }, - typescript: { - // Опасно: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки TypeScript. - ignoreBuildErrors: true, - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20251029191833.ts b/.history/frontend/linktree-frontend/next.config_20251029191833.ts deleted file mode 100644 index b4ea604..0000000 --- a/.history/frontend/linktree-frontend/next.config_20251029191833.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: 'web', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - ], - }, - - // proxy all /api/* calls to Django - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://web:8000/api/:path*', - }, - ]; - }, - - eslint: { - // Предупреждение: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки ESLint. - ignoreDuringBuilds: true, - }, - typescript: { - // Опасно: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки TypeScript. - ignoreBuildErrors: true, - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20251029192214.ts b/.history/frontend/linktree-frontend/next.config_20251029192214.ts deleted file mode 100644 index b4ea604..0000000 --- a/.history/frontend/linktree-frontend/next.config_20251029192214.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: 'web', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - ], - }, - - // proxy all /api/* calls to Django - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://web:8000/api/:path*', - }, - ]; - }, - - eslint: { - // Предупреждение: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки ESLint. - ignoreDuringBuilds: true, - }, - typescript: { - // Опасно: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки TypeScript. - ignoreBuildErrors: true, - }, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20251029193543.ts b/.history/frontend/linktree-frontend/next.config_20251029193543.ts deleted file mode 100644 index e9e1aa5..0000000 --- a/.history/frontend/linktree-frontend/next.config_20251029193543.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: 'web', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - ], - }, - - // proxy all /api/* calls to Django - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://web:8000/api/:path*', - }, - ]; - }, - - eslint: { - // Предупреждение: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки ESLint. - ignoreDuringBuilds: true, - }, - typescript: { - // Опасно: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки TypeScript. - ignoreBuildErrors: true, - }, - - // Добавляем настройки для правильной работы в development - trailingSlash: false, - skipTrailingSlashRedirect: true, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20251029193800.js b/.history/frontend/linktree-frontend/next.config_20251029193800.js deleted file mode 100644 index fc55f77..0000000 --- a/.history/frontend/linktree-frontend/next.config_20251029193800.js +++ /dev/null @@ -1,59 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: 'web', - port: '8000', - pathname: '/storage/**', - }, - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', - pathname: '/storage/**', - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', - pathname: '/storage/**', - }, - ], - }, - - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://web:8000/api/:path*', - }, - ]; - }, - - eslint: { - ignoreDuringBuilds: true, - }, - typescript: { - ignoreBuildErrors: true, - }, - - trailingSlash: false, - skipTrailingSlashRedirect: true, - - async headers() { - return [ - { - source: '/api/:path*', - headers: [ - { key: 'Access-Control-Allow-Origin', value: '*' }, - { key: 'Access-Control-Allow-Methods', value: 'GET, POST, PUT, DELETE, OPTIONS' }, - { key: 'Access-Control-Allow-Headers', value: 'Content-Type, Authorization' }, - ], - }, - ]; - }, -}; - -export default nextConfig; \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/next.config_20251029194257.js b/.history/frontend/linktree-frontend/next.config_20251029194257.js deleted file mode 100644 index fc55f77..0000000 --- a/.history/frontend/linktree-frontend/next.config_20251029194257.js +++ /dev/null @@ -1,59 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: 'web', - port: '8000', - pathname: '/storage/**', - }, - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', - pathname: '/storage/**', - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', - pathname: '/storage/**', - }, - ], - }, - - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://web:8000/api/:path*', - }, - ]; - }, - - eslint: { - ignoreDuringBuilds: true, - }, - typescript: { - ignoreBuildErrors: true, - }, - - trailingSlash: false, - skipTrailingSlashRedirect: true, - - async headers() { - return [ - { - source: '/api/:path*', - headers: [ - { key: 'Access-Control-Allow-Origin', value: '*' }, - { key: 'Access-Control-Allow-Methods', value: 'GET, POST, PUT, DELETE, OPTIONS' }, - { key: 'Access-Control-Allow-Headers', value: 'Content-Type, Authorization' }, - ], - }, - ]; - }, -}; - -export default nextConfig; \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/next.config_20251029194257.ts b/.history/frontend/linktree-frontend/next.config_20251029194257.ts deleted file mode 100644 index e9e1aa5..0000000 --- a/.history/frontend/linktree-frontend/next.config_20251029194257.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: 'web', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - ], - }, - - // proxy all /api/* calls to Django - async rewrites() { - return [ - { - source: '/api/:path*', - destination: 'http://web:8000/api/:path*', - }, - ]; - }, - - eslint: { - // Предупреждение: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки ESLint. - ignoreDuringBuilds: true, - }, - typescript: { - // Опасно: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки TypeScript. - ignoreBuildErrors: true, - }, - - // Добавляем настройки для правильной работы в development - trailingSlash: false, - skipTrailingSlashRedirect: true, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20251029194322.ts b/.history/frontend/linktree-frontend/next.config_20251029194322.ts deleted file mode 100644 index fcd94e8..0000000 --- a/.history/frontend/linktree-frontend/next.config_20251029194322.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: 'web', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - ], - }, - - // proxy all /api/* calls to Django - async rewrites() { - return [ - { - source: '/api/:path*/', - destination: 'http://web:8000/api/:path*/', - }, - { - source: '/api/:path*', - destination: 'http://web:8000/api/:path*/', - }, - ]; - }, - - eslint: { - // Предупреждение: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки ESLint. - ignoreDuringBuilds: true, - }, - typescript: { - // Опасно: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки TypeScript. - ignoreBuildErrors: true, - }, - - // Добавляем настройки для правильной работы в development - trailingSlash: false, - skipTrailingSlashRedirect: true, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/next.config_20251029194335.ts b/.history/frontend/linktree-frontend/next.config_20251029194335.ts deleted file mode 100644 index fcd94e8..0000000 --- a/.history/frontend/linktree-frontend/next.config_20251029194335.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: 'web', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - { - protocol: 'http', - hostname: '127.0.0.1', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - { - protocol: 'http', - hostname: 'localhost', - port: '8000', // where Django serves media - pathname: '/storage/**', // storage/avatars, images/link_groups, etc. - }, - ], - }, - - // proxy all /api/* calls to Django - async rewrites() { - return [ - { - source: '/api/:path*/', - destination: 'http://web:8000/api/:path*/', - }, - { - source: '/api/:path*', - destination: 'http://web:8000/api/:path*/', - }, - ]; - }, - - eslint: { - // Предупреждение: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки ESLint. - ignoreDuringBuilds: true, - }, - typescript: { - // Опасно: это позволяет продакшн сборки завершаться успешно даже если - // ваш проект имеет ошибки TypeScript. - ignoreBuildErrors: true, - }, - - // Добавляем настройки для правильной работы в development - trailingSlash: false, - skipTrailingSlashRedirect: true, -}; - -module.exports = nextConfig; diff --git a/.history/frontend/linktree-frontend/package_20250506110441.json b/.history/frontend/linktree-frontend/package_20250506110441.json deleted file mode 100644 index 81aa717..0000000 --- a/.history/frontend/linktree-frontend/package_20250506110441.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "linktree-frontend", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev --turbopack", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "next": "15.3.1", - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@eslint/eslintrc": "^3", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "15.3.1", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", - "typescript": "^5" - } -} diff --git a/.history/frontend/linktree-frontend/package_20250506112843.json b/.history/frontend/linktree-frontend/package_20250506112843.json deleted file mode 100644 index d6c3f18..0000000 --- a/.history/frontend/linktree-frontend/package_20250506112843.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "linktree-frontend", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "next": "15.3.1", - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@eslint/eslintrc": "^3", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "15.3.1", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", - "typescript": "^5" - } -} diff --git a/.history/frontend/linktree-frontend/package_20250507131936.json b/.history/frontend/linktree-frontend/package_20250507131936.json deleted file mode 100644 index 7601bae..0000000 --- a/.history/frontend/linktree-frontend/package_20250507131936.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "linktree-frontend", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "axios": "^1.9.0", - "next": "15.3.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-hook-form": "^7.56.2" - }, - "devDependencies": { - "@eslint/eslintrc": "^3", - "@tailwindcss/postcss": "^4.1.5", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "15.3.1", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", - "typescript": "^5" - } -} diff --git a/.history/frontend/linktree-frontend/package_20251029195704.json b/.history/frontend/linktree-frontend/package_20251029195704.json deleted file mode 100644 index ea3ac8b..0000000 --- a/.history/frontend/linktree-frontend/package_20251029195704.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "linktree-frontend", - "version": "0.1.0", - "private": true, - "type": "module", - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "axios": "^1.9.0", - "next": "15.3.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-hook-form": "^7.56.2" - }, - "devDependencies": { - "@eslint/eslintrc": "^3", - "@tailwindcss/postcss": "^4.1.5", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "15.3.1", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", - "typescript": "^5" - } -} diff --git a/.history/frontend/linktree-frontend/package_20251029195711.json b/.history/frontend/linktree-frontend/package_20251029195711.json deleted file mode 100644 index ea3ac8b..0000000 --- a/.history/frontend/linktree-frontend/package_20251029195711.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "linktree-frontend", - "version": "0.1.0", - "private": true, - "type": "module", - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "axios": "^1.9.0", - "next": "15.3.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-hook-form": "^7.56.2" - }, - "devDependencies": { - "@eslint/eslintrc": "^3", - "@tailwindcss/postcss": "^4.1.5", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "15.3.1", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", - "typescript": "^5" - } -} diff --git a/.history/frontend/linktree-frontend/package_20251029195829.json b/.history/frontend/linktree-frontend/package_20251029195829.json deleted file mode 100644 index 7601bae..0000000 --- a/.history/frontend/linktree-frontend/package_20251029195829.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "linktree-frontend", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "axios": "^1.9.0", - "next": "15.3.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-hook-form": "^7.56.2" - }, - "devDependencies": { - "@eslint/eslintrc": "^3", - "@tailwindcss/postcss": "^4.1.5", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "15.3.1", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", - "typescript": "^5" - } -} diff --git a/.history/frontend/linktree-frontend/package_20251029195831.json b/.history/frontend/linktree-frontend/package_20251029195831.json deleted file mode 100644 index 7601bae..0000000 --- a/.history/frontend/linktree-frontend/package_20251029195831.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "linktree-frontend", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "axios": "^1.9.0", - "next": "15.3.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-hook-form": "^7.56.2" - }, - "devDependencies": { - "@eslint/eslintrc": "^3", - "@tailwindcss/postcss": "^4.1.5", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "15.3.1", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", - "typescript": "^5" - } -} diff --git a/.history/frontend/linktree-frontend/pages/index_20250506110802.tsx b/.history/frontend/linktree-frontend/pages/index_20250506110802.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/.history/frontend/linktree-frontend/pages/index_20250506110805.tsx b/.history/frontend/linktree-frontend/pages/index_20250506110805.tsx deleted file mode 100644 index c971a5e..0000000 --- a/.history/frontend/linktree-frontend/pages/index_20250506110805.tsx +++ /dev/null @@ -1,14 +0,0 @@ -// pages/index.tsx -import type { NextPage } from 'next'; - -const Home: NextPage = () => { - return ( -
-

- Добро пожаловать в LinkTree Clone! -

-
- ); -}; - -export default Home; diff --git a/.history/frontend/linktree-frontend/postcss.config_20250506105332.js b/.history/frontend/linktree-frontend/postcss.config_20250506105332.js deleted file mode 100644 index c7bcb4b..0000000 --- a/.history/frontend/linktree-frontend/postcss.config_20250506105332.js +++ /dev/null @@ -1,5 +0,0 @@ -const config = { - plugins: ["@tailwindcss/postcss"], -}; - -export default config; diff --git a/.history/frontend/linktree-frontend/postcss.config_20250506110619.js b/.history/frontend/linktree-frontend/postcss.config_20250506110619.js deleted file mode 100644 index 12a703d..0000000 --- a/.history/frontend/linktree-frontend/postcss.config_20250506110619.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/.history/frontend/linktree-frontend/postcss.config_20250506113428.js b/.history/frontend/linktree-frontend/postcss.config_20250506113428.js deleted file mode 100644 index 0612c15..0000000 --- a/.history/frontend/linktree-frontend/postcss.config_20250506113428.js +++ /dev/null @@ -1,7 +0,0 @@ -// postcss.config.js -module.exports = { - plugins: { - '@tailwindcss/postcss': {}, // новый пакет-плагин для Tailwind v4+ - autoprefixer: {}, - }, -}; diff --git a/.history/frontend/linktree-frontend/public/manifest_20250507074158.json b/.history/frontend/linktree-frontend/public/manifest_20250507074158.json deleted file mode 100644 index e69de29..0000000 diff --git a/.history/frontend/linktree-frontend/public/manifest_20250507074202.json b/.history/frontend/linktree-frontend/public/manifest_20250507074202.json deleted file mode 100644 index d2245a9..0000000 --- a/.history/frontend/linktree-frontend/public/manifest_20250507074202.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "CatLink", - "short_name": "CatLink", - "icons": [ - { - "src": "/web-app-manifest-192x192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "/web-app-manifest-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" - } \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/public/manifest_20250507074217.json b/.history/frontend/linktree-frontend/public/manifest_20250507074217.json deleted file mode 100644 index fbb3476..0000000 --- a/.history/frontend/linktree-frontend/public/manifest_20250507074217.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "CatLink", - "short_name": "CatLink", - "icons": [ - { - "src": "/web-app-manifest-192x192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "/web-app-manifest-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" - - "name": "CatLink", - "short_name": "CatLink", - "description": "Все ваши ссылки в одном месте. Публикуйте CatLink в био, мессенджерах и письмах.", - "start_url": "/", - "scope": "/", - "display": "standalone", - "theme_color": "#ffffff", - "background_color": "#ffffff", - "icons": [ - { - "src": "/web-app-manifest-192x192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "/web-app-manifest-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ] - } - \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/public/manifest_20250507074316.json b/.history/frontend/linktree-frontend/public/manifest_20250507074316.json deleted file mode 100644 index d2ee75d..0000000 --- a/.history/frontend/linktree-frontend/public/manifest_20250507074316.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "CatLink", - "short_name": "CatLink", - "description": "Все ваши ссылки в одном месте. Публикуйте CatLink в био, мессенджерах и письмах.", - "start_url": "/", - "scope": "/", - "display": "standalone", - "theme_color": "#ffffff", - "background_color": "#ffffff", - "icons": [ - { - "src": "/web-app-manifest-192x192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "/web-app-manifest-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ] - } - \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/auth/login/page_20251029194955.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/auth/login/page_20251029194955.tsx deleted file mode 100644 index bdd9e16..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/auth/login/page_20251029194955.tsx +++ /dev/null @@ -1,95 +0,0 @@ -// src/app/auth/login/page.tsx -'use client' - -import { useState, useEffect } from 'react' -import { useForm } from 'react-hook-form' -import { useRouter } from 'next/navigation' - -type FormData = { username: string; password: string } - -export default function LoginPage() { - const router = useRouter() - const { register, handleSubmit, formState: { errors, isSubmitting } } = useForm() - const [apiError, setApiError] = useState(null) - - useEffect(() => { - if (typeof window !== 'undefined' && localStorage.getItem('token')) { - router.push('/dashboard') - } - }, [router]) - - async function onSubmit(data: FormData) { - setApiError(null) - try { - const res = await fetch( - '/api/auth/login', - { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(data), - } - ) - if (!res.ok) { - const json = await res.json() - setApiError(json.detail || 'Ошибка входа') - return - } - const { access } = await res.json() - localStorage.setItem('token', access) - router.push('/dashboard') - } catch { - setApiError('Сетевая ошибка') - } - } - - return ( -
-
-
-
-
-
-

Welcome back!

- {apiError &&

{apiError}

} -
-
- - {errors.username &&
{errors.username.message}
} -
-
- - {errors.password &&
{errors.password.message}
} -
- -
- -
-
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/auth/login/page_20251029195038.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/auth/login/page_20251029195038.tsx deleted file mode 100644 index bdd9e16..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/auth/login/page_20251029195038.tsx +++ /dev/null @@ -1,95 +0,0 @@ -// src/app/auth/login/page.tsx -'use client' - -import { useState, useEffect } from 'react' -import { useForm } from 'react-hook-form' -import { useRouter } from 'next/navigation' - -type FormData = { username: string; password: string } - -export default function LoginPage() { - const router = useRouter() - const { register, handleSubmit, formState: { errors, isSubmitting } } = useForm() - const [apiError, setApiError] = useState(null) - - useEffect(() => { - if (typeof window !== 'undefined' && localStorage.getItem('token')) { - router.push('/dashboard') - } - }, [router]) - - async function onSubmit(data: FormData) { - setApiError(null) - try { - const res = await fetch( - '/api/auth/login', - { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(data), - } - ) - if (!res.ok) { - const json = await res.json() - setApiError(json.detail || 'Ошибка входа') - return - } - const { access } = await res.json() - localStorage.setItem('token', access) - router.push('/dashboard') - } catch { - setApiError('Сетевая ошибка') - } - } - - return ( -
-
-
-
-
-
-

Welcome back!

- {apiError &&

{apiError}

} -
-
- - {errors.username &&
{errors.username.message}
} -
-
- - {errors.password &&
{errors.password.message}
} -
- -
- -
-
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/auth/register/page_20250507082845.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/auth/register/page_20250507082845.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/auth/register/page_20250507082848.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/auth/register/page_20250507082848.tsx deleted file mode 100644 index f63f3f1..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/auth/register/page_20250507082848.tsx +++ /dev/null @@ -1,238 +0,0 @@ -'use client'; - -import { useState, useEffect } from 'react'; -import { useForm } from 'react-hook-form'; -import { useRouter } from 'next/navigation'; -import Link from 'next/link'; -import Image from 'next/image'; - -type FormData = { - username: string; - email: string; - first_name?: string; - last_name?: string; - password: string; - password2: string; -}; - -export default function RegisterPage() { - const router = useRouter(); - const { - register, - handleSubmit, - formState: { errors, isSubmitting }, - } = useForm(); - const [apiError, setApiError] = useState(null); - - // если уже залогинен — редирект на дашборд - useEffect(() => { - if (typeof window !== 'undefined' && localStorage.getItem('token')) { - router.push('/dashboard'); - } - }, [router]); - - async function onSubmit(data: FormData) { - setApiError(null); - try { - const res = await fetch('/api/auth/register/', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(data), - }); - if (!res.ok) { - const json = await res.json(); - // берём первую ошибку из ответа - const firstKey = Object.keys(json)[0]; - setApiError( - Array.isArray(json[firstKey]) - ? (json[firstKey] as string[])[0] - : json[firstKey].toString() - ); - return; - } - // при успехе — редирект на логин - router.push('/auth/login'); - } catch (e) { - setApiError('Сетевая ошибка, попробуйте снова.'); - } - } - - return ( -
-
-
-
-
-
- {/* Левая половина с картинкой */} -
-
-
- - {/* Правая — сама форма */} -
-
-
-

Регистрация

-
-
- {/* Username */} -
- - {errors.username && ( -
- {errors.username.message} -
- )} -
- - {/* Email */} -
- - {errors.email && ( -
- {errors.email.message} -
- )} -
- - {/* First / Last name */} -
-
- -
-
- -
-
- - {/* Password */} -
- - {errors.password && ( -
- {errors.password.message} -
- )} -
- - {/* Confirm Password */} -
- - value === formValues.password || - 'Пароли не совпадают', - })} - /> - {errors.password2 && ( -
- {errors.password2.message} -
- )} -
- - {/* API Error */} - {apiError && ( -
- {apiError} -
- )} - - {/* Кнопка */} - -
- - {/* Ссылка на вход */} -
-
- - Уже есть аккаунт?{' '} - - Войти - - -
-
-
-
-
-
-
-
-
- ); -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250506191940.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250506191940.tsx deleted file mode 100644 index 503b341..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250506191940.tsx +++ /dev/null @@ -1,199 +0,0 @@ -// src/app/dashboard/page.tsx -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import { ProfileCard } from '../components/ProfileCard' - -interface UserProfile { - avatar: string - full_name: string - email: string - bio?: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string -} - -interface Group { - id: number - name: string - links?: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - - const fetchData = async () => { - try { - // 1) Профиль - const uRes = await fetch(`/api/auth/user/`, { - headers: { Authorization: `Bearer ${token}` }, - }) - if (uRes.status === 401) { - localStorage.removeItem('token') - router.push('/auth/login') - return - } - if (!uRes.ok) throw new Error('Не удалось получить профиль') - const userData: UserProfile = await uRes.json() - - // 2) Группы - const gRes = await fetch(`/api/groups/`, { - headers: { Authorization: `Bearer ${token}` }, - }) - if (gRes.status === 401) { - localStorage.removeItem('token') - router.push('/auth/login') - return - } - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - const groupsData: Group[] = await gRes.json() - - setUser(userData) - setGroups(groupsData) - } catch (err) { - // на любую ошибку — редирект на логин - console.error(err) - localStorage.removeItem('token') - router.push('/auth/login') - } finally { - setLoading(false) - } - } - - fetchData() - }, [router]) - - if (loading) { - return
Загрузка...
- } - - return ( -
-
-
-
- {/* Профиль пользователя */} - {user && ( - - )} - - {/* Секция групп ссылок */} -
-
-
Группы ссылок
- -
-
- {groups.map((group) => ( - -
- - setExpandedGroup( - expandedGroup === group.id ? null : group.id - ) - } - > - {group.name}{' '} - - {group.links?.length ?? 0} - - -
- - - -
-
- {expandedGroup === group.id && ( -
- -
- )} -
- ))} -
-
- -
-
-
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507074950.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507074950.tsx deleted file mode 100644 index b04283d..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507074950.tsx +++ /dev/null @@ -1,199 +0,0 @@ -// src/app/dashboard/page.tsx -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import { ProfileCard } from '../../components/ProfileCard' - -interface UserProfile { - avatar: string - full_name: string - email: string - bio?: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string -} - -interface Group { - id: number - name: string - links?: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - - const fetchData = async () => { - try { - // 1) Профиль - const uRes = await fetch(`/api/auth/user/`, { - headers: { Authorization: `Bearer ${token}` }, - }) - if (uRes.status === 401) { - localStorage.removeItem('token') - router.push('/auth/login') - return - } - if (!uRes.ok) throw new Error('Не удалось получить профиль') - const userData: UserProfile = await uRes.json() - - // 2) Группы - const gRes = await fetch(`/api/groups/`, { - headers: { Authorization: `Bearer ${token}` }, - }) - if (gRes.status === 401) { - localStorage.removeItem('token') - router.push('/auth/login') - return - } - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - const groupsData: Group[] = await gRes.json() - - setUser(userData) - setGroups(groupsData) - } catch (err) { - // на любую ошибку — редирект на логин - console.error(err) - localStorage.removeItem('token') - router.push('/auth/login') - } finally { - setLoading(false) - } - } - - fetchData() - }, [router]) - - if (loading) { - return
Загрузка...
- } - - return ( -
-
-
-
- {/* Профиль пользователя */} - {user && ( - - )} - - {/* Секция групп ссылок */} -
-
-
Группы ссылок
- -
-
- {groups.map((group) => ( - -
- - setExpandedGroup( - expandedGroup === group.id ? null : group.id - ) - } - > - {group.name}{' '} - - {group.links?.length ?? 0} - - -
- - - -
-
- {expandedGroup === group.id && ( -
- -
- )} -
- ))} -
-
- -
-
-
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507102038.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507102038.tsx deleted file mode 100644 index 34a498d..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507102038.tsx +++ /dev/null @@ -1,423 +0,0 @@ -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Image from 'next/image' -import { Modal } from '../components/Modal' // Модалка из примера выше - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string -} - -interface Group { - id: number - name: string - image?: string - links: LinkItem[] - _open?: boolean // флаг аккордеона -} - -type ModalType = - | 'addGroup' - | 'editGroup' - | 'deleteGroup' - | 'addLink' - | 'editLink' - | 'deleteLink' - | null - -export default function DashboardPage() { - const router = useRouter() - const API = process.env.NEXT_PUBLIC_API_URL - const token = typeof window !== 'undefined' ? localStorage.getItem('token') : null - - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - // для модалки - const [modalType, setModalType] = useState(null) - const [currentGroup, setCurrentGroup] = useState(null) - const [currentLink, setCurrentLink] = useState(null) - const [formValue, setFormValue] = useState<{ name?: string; url?: string }>({}) - - // загрузка пользователя и групп - useEffect(() => { - if (!token) { - router.replace('/auth/login') - return - } - Promise.all([ - fetch(`${API}/api/auth/user/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - fetch(`${API}/api/groups/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - ]) - .then(async ([uRes, gRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - const [u, g] = await Promise.all([uRes.json(), gRes.json()]) - setUser(u) - setGroups(g) - }) - .catch((err) => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router, API, token]) - - if (loading) return
Загрузка...
- if (error) return
{error}
- - // закрыть модалку - const closeModal = () => { - setModalType(null) - setCurrentGroup(null) - setCurrentLink(null) - setFormValue({}) - } - - // === Группы === - async function handleGroupSubmit() { - if (!modalType) return - const isNew = modalType === 'addGroup' - const url = isNew - ? `${API}/api/groups/` - : `${API}/api/groups/${currentGroup!.id}/` - const method = isNew ? 'POST' : 'PUT' - const res = await fetch(url, { - method, - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${token}`, - }, - body: JSON.stringify({ name: formValue.name }), - }) - if (res.ok) { - const grp = await res.json() - setGroups((prev) => - isNew - ? [...prev, { ...grp, links: [] }] - : prev.map((g) => (g.id === grp.id ? { ...g, name: grp.name } : g)) - ) - closeModal() - } else { - alert('Ошибка при сохранении группы') - } - } - - async function handleGroupDelete() { - if (!currentGroup) return - const res = await fetch(`${API}/api/groups/${currentGroup.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - if (res.ok) { - setGroups((prev) => prev.filter((g) => g.id !== currentGroup.id)) - closeModal() - } else { - alert('Ошибка при удалении группы') - } - } - - // === Ссылки === - async function handleLinkSubmit() { - if (!currentGroup) return - const isEdit = modalType === 'editLink' - const url = isEdit - ? `${API}/api/links/${currentLink!.id}/` - : `${API}/api/links/` - const method = isEdit ? 'PUT' : 'POST' - const payload = { - title: formValue.name, - url: formValue.url, - group: currentGroup.id, - } - const res = await fetch(url, { - method, - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${token}`, - }, - body: JSON.stringify(payload), - }) - if (res.ok) { - const linkData = await res.json() - setGroups((prev) => - prev.map((g) => - g.id === currentGroup.id - ? { - ...g, - links: isEdit - ? g.links.map((l) => (l.id === linkData.id ? linkData : l)) - : [...g.links, linkData], - } - : g - ) - ) - closeModal() - } else { - alert('Ошибка при сохранении ссылки') - } - } - - async function handleLinkDelete() { - if (!currentLink || !currentGroup) return - const res = await fetch(`${API}/api/links/${currentLink.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - if (res.ok) { - setGroups((prev) => - prev.map((g) => - g.id === currentGroup.id - ? { ...g, links: g.links.filter((l) => l.id !== currentLink.id) } - : g - ) - ) - closeModal() - } else { - alert('Ошибка при удалении ссылки') - } - } - - return ( -
- {/* Профиль */} - {user && ( -
-
- Avatar -
-
- {user.full_name || user.username} -
-

{user.email}

-
-
-
- )} - - {/* Заголовок с кнопкой «Добавить группу» */} -
-

Группы ссылок

- -
- - {/* Список групп (аккордеон) */} - {groups.map((group) => ( - -
-
-
- {/* Редактировать имя группы */} - { - e.preventDefault() - setCurrentGroup(group) - setFormValue({ name: group.name }) - setModalType('editGroup') - }} - > - - - {/* Открыть/закрыть аккордеон */} - - setGroups((pg) => - pg.map((g) => - g.id === group.id - ? { ...g, _open: !g._open } - : g - ) - ) - } - > - {group.name}{' '} - - {group.links.length} - - -
-
- {/* Добавить ссылку */} - - {/* Удалить группу */} - -
-
- {/* Ссылки в раскрытом состоянии */} - {group._open && ( -
    - {group.links.map((link) => ( -
  • - - {link.title} - -
    - - -
    -
  • - ))} -
- )} -
-
- ))} - - {/* Универсальная модалка */} - {modalType && ( - - {/* Группа: добавить/редактировать */} - {(modalType === 'addGroup' || modalType === 'editGroup') && ( - <> -
- {modalType === 'addGroup' ? 'Новая группа' : 'Редактировать группу'} -
- - setFormValue({ ...formValue, name: e.target.value }) - } - /> - - - )} - {/* Подтверждение удаления группы */} - {modalType === 'deleteGroup' && ( - <> -
Удалить группу?
-

Группа «{currentGroup?.name}» будет удалена навсегда.

- - - - )} - {/* Ссылка: добавить/редактировать */} - {(modalType === 'addLink' || modalType === 'editLink') && ( - <> -
{modalType === 'addLink' ? 'Новая ссылка' : 'Редактировать ссылку'}
- - setFormValue({ ...formValue, name: e.target.value }) - } - /> - - setFormValue({ ...formValue, url: e.target.value }) - } - /> - - - )} - {/* Подтверждение удаления ссылки */} - {modalType === 'deleteLink' && ( - <> -
Удалить ссылку?
-

Ссылка «{currentLink?.title}» будет удалена.

- - - - )} -
- )} -
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507102107.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507102107.tsx deleted file mode 100644 index a2e5da9..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507102107.tsx +++ /dev/null @@ -1,423 +0,0 @@ -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Image from 'next/image' -import { Modal } from '../../components/modal' // Модалка из примера выше - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string -} - -interface Group { - id: number - name: string - image?: string - links: LinkItem[] - _open?: boolean // флаг аккордеона -} - -type ModalType = - | 'addGroup' - | 'editGroup' - | 'deleteGroup' - | 'addLink' - | 'editLink' - | 'deleteLink' - | null - -export default function DashboardPage() { - const router = useRouter() - const API = process.env.NEXT_PUBLIC_API_URL - const token = typeof window !== 'undefined' ? localStorage.getItem('token') : null - - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - // для модалки - const [modalType, setModalType] = useState(null) - const [currentGroup, setCurrentGroup] = useState(null) - const [currentLink, setCurrentLink] = useState(null) - const [formValue, setFormValue] = useState<{ name?: string; url?: string }>({}) - - // загрузка пользователя и групп - useEffect(() => { - if (!token) { - router.replace('/auth/login') - return - } - Promise.all([ - fetch(`${API}/api/auth/user/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - fetch(`${API}/api/groups/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - ]) - .then(async ([uRes, gRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - const [u, g] = await Promise.all([uRes.json(), gRes.json()]) - setUser(u) - setGroups(g) - }) - .catch((err) => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router, API, token]) - - if (loading) return
Загрузка...
- if (error) return
{error}
- - // закрыть модалку - const closeModal = () => { - setModalType(null) - setCurrentGroup(null) - setCurrentLink(null) - setFormValue({}) - } - - // === Группы === - async function handleGroupSubmit() { - if (!modalType) return - const isNew = modalType === 'addGroup' - const url = isNew - ? `${API}/api/groups/` - : `${API}/api/groups/${currentGroup!.id}/` - const method = isNew ? 'POST' : 'PUT' - const res = await fetch(url, { - method, - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${token}`, - }, - body: JSON.stringify({ name: formValue.name }), - }) - if (res.ok) { - const grp = await res.json() - setGroups((prev) => - isNew - ? [...prev, { ...grp, links: [] }] - : prev.map((g) => (g.id === grp.id ? { ...g, name: grp.name } : g)) - ) - closeModal() - } else { - alert('Ошибка при сохранении группы') - } - } - - async function handleGroupDelete() { - if (!currentGroup) return - const res = await fetch(`${API}/api/groups/${currentGroup.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - if (res.ok) { - setGroups((prev) => prev.filter((g) => g.id !== currentGroup.id)) - closeModal() - } else { - alert('Ошибка при удалении группы') - } - } - - // === Ссылки === - async function handleLinkSubmit() { - if (!currentGroup) return - const isEdit = modalType === 'editLink' - const url = isEdit - ? `${API}/api/links/${currentLink!.id}/` - : `${API}/api/links/` - const method = isEdit ? 'PUT' : 'POST' - const payload = { - title: formValue.name, - url: formValue.url, - group: currentGroup.id, - } - const res = await fetch(url, { - method, - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${token}`, - }, - body: JSON.stringify(payload), - }) - if (res.ok) { - const linkData = await res.json() - setGroups((prev) => - prev.map((g) => - g.id === currentGroup.id - ? { - ...g, - links: isEdit - ? g.links.map((l) => (l.id === linkData.id ? linkData : l)) - : [...g.links, linkData], - } - : g - ) - ) - closeModal() - } else { - alert('Ошибка при сохранении ссылки') - } - } - - async function handleLinkDelete() { - if (!currentLink || !currentGroup) return - const res = await fetch(`${API}/api/links/${currentLink.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - if (res.ok) { - setGroups((prev) => - prev.map((g) => - g.id === currentGroup.id - ? { ...g, links: g.links.filter((l) => l.id !== currentLink.id) } - : g - ) - ) - closeModal() - } else { - alert('Ошибка при удалении ссылки') - } - } - - return ( -
- {/* Профиль */} - {user && ( -
-
- Avatar -
-
- {user.full_name || user.username} -
-

{user.email}

-
-
-
- )} - - {/* Заголовок с кнопкой «Добавить группу» */} -
-

Группы ссылок

- -
- - {/* Список групп (аккордеон) */} - {groups.map((group) => ( - -
-
-
- {/* Редактировать имя группы */} - { - e.preventDefault() - setCurrentGroup(group) - setFormValue({ name: group.name }) - setModalType('editGroup') - }} - > - - - {/* Открыть/закрыть аккордеон */} - - setGroups((pg) => - pg.map((g) => - g.id === group.id - ? { ...g, _open: !g._open } - : g - ) - ) - } - > - {group.name}{' '} - - {group.links.length} - - -
-
- {/* Добавить ссылку */} - - {/* Удалить группу */} - -
-
- {/* Ссылки в раскрытом состоянии */} - {group._open && ( -
    - {group.links.map((link) => ( -
  • - - {link.title} - -
    - - -
    -
  • - ))} -
- )} -
-
- ))} - - {/* Универсальная модалка */} - {modalType && ( - - {/* Группа: добавить/редактировать */} - {(modalType === 'addGroup' || modalType === 'editGroup') && ( - <> -
- {modalType === 'addGroup' ? 'Новая группа' : 'Редактировать группу'} -
- - setFormValue({ ...formValue, name: e.target.value }) - } - /> - - - )} - {/* Подтверждение удаления группы */} - {modalType === 'deleteGroup' && ( - <> -
Удалить группу?
-

Группа «{currentGroup?.name}» будет удалена навсегда.

- - - - )} - {/* Ссылка: добавить/редактировать */} - {(modalType === 'addLink' || modalType === 'editLink') && ( - <> -
{modalType === 'addLink' ? 'Новая ссылка' : 'Редактировать ссылку'}
- - setFormValue({ ...formValue, name: e.target.value }) - } - /> - - setFormValue({ ...formValue, url: e.target.value }) - } - /> - - - )} - {/* Подтверждение удаления ссылки */} - {modalType === 'deleteLink' && ( - <> -
Удалить ссылку?
-

Ссылка «{currentLink?.title}» будет удалена.

- - - - )} -
- )} -
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507140312.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507140312.tsx deleted file mode 100644 index d362e72..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507140312.tsx +++ /dev/null @@ -1,638 +0,0 @@ -// 'use client' - -// import React, { useEffect, useState, Fragment } from 'react' -// import { useRouter } from 'next/navigation' -// import Image from 'next/image' -// import { Modal } from '../../components/modal' // Модалка из примера выше - -// interface UserProfile { -// id: number -// username: string -// email: string -// full_name: string -// bio?: string -// avatar: string -// last_login: string -// date_joined: string -// } - -// interface LinkItem { -// id: number -// title: string -// url: string -// icon?: string -// } - -// interface Group { -// id: number -// name: string -// image?: string -// links: LinkItem[] -// _open?: boolean // флаг аккордеона -// } - -// type ModalType = -// | 'addGroup' -// | 'editGroup' -// | 'deleteGroup' -// | 'addLink' -// | 'editLink' -// | 'deleteLink' -// | null - -// export default function DashboardPage() { -// const router = useRouter() -// const API = process.env.NEXT_PUBLIC_API_URL -// const token = typeof window !== 'undefined' ? localStorage.getItem('token') : null - -// const [user, setUser] = useState(null) -// const [groups, setGroups] = useState([]) -// const [loading, setLoading] = useState(true) -// const [error, setError] = useState(null) - -// // для модалки -// const [modalType, setModalType] = useState(null) -// const [currentGroup, setCurrentGroup] = useState(null) -// const [currentLink, setCurrentLink] = useState(null) -// const [formValue, setFormValue] = useState<{ name?: string; url?: string }>({}) - -// // загрузка пользователя и групп -// useEffect(() => { -// if (!token) { -// router.replace('/auth/login') -// return -// } -// Promise.all([ -// fetch(`${API}/api/auth/user/`, { -// headers: { Authorization: `Bearer ${token}` }, -// }), -// fetch(`${API}/api/groups/`, { -// headers: { Authorization: `Bearer ${token}` }, -// }), -// ]) -// .then(async ([uRes, gRes]) => { -// if (!uRes.ok) throw new Error('Не удалось получить профиль') -// if (!gRes.ok) throw new Error('Не удалось загрузить группы') -// const [u, g] = await Promise.all([uRes.json(), gRes.json()]) -// setUser(u) -// setGroups(g) -// }) -// .catch((err) => setError((err as Error).message)) -// .finally(() => setLoading(false)) -// }, [router, API, token]) - -// if (loading) return
Загрузка...
-// if (error) return
{error}
- -// // закрыть модалку -// const closeModal = () => { -// setModalType(null) -// setCurrentGroup(null) -// setCurrentLink(null) -// setFormValue({}) -// } - -// // === Группы === -// async function handleGroupSubmit() { -// if (!modalType) return -// const isNew = modalType === 'addGroup' -// const url = isNew -// ? `${API}/api/groups/` -// : `${API}/api/groups/${currentGroup!.id}/` -// const method = isNew ? 'POST' : 'PUT' -// const res = await fetch(url, { -// method, -// headers: { -// 'Content-Type': 'application/json', -// Authorization: `Bearer ${token}`, -// }, -// body: JSON.stringify({ name: formValue.name }), -// }) -// if (res.ok) { -// const grp = await res.json() -// setGroups((prev) => -// isNew -// ? [...prev, { ...grp, links: [] }] -// : prev.map((g) => (g.id === grp.id ? { ...g, name: grp.name } : g)) -// ) -// closeModal() -// } else { -// alert('Ошибка при сохранении группы') -// } -// } - -// async function handleGroupDelete() { -// if (!currentGroup) return -// const res = await fetch(`${API}/api/groups/${currentGroup.id}/`, { -// method: 'DELETE', -// headers: { Authorization: `Bearer ${token}` }, -// }) -// if (res.ok) { -// setGroups((prev) => prev.filter((g) => g.id !== currentGroup.id)) -// closeModal() -// } else { -// alert('Ошибка при удалении группы') -// } -// } - -// // === Ссылки === -// async function handleLinkSubmit() { -// if (!currentGroup) return -// const isEdit = modalType === 'editLink' -// const url = isEdit -// ? `${API}/api/links/${currentLink!.id}/` -// : `${API}/api/links/` -// const method = isEdit ? 'PUT' : 'POST' -// const payload = { -// title: formValue.name, -// url: formValue.url, -// group: currentGroup.id, -// } -// const res = await fetch(url, { -// method, -// headers: { -// 'Content-Type': 'application/json', -// Authorization: `Bearer ${token}`, -// }, -// body: JSON.stringify(payload), -// }) -// if (res.ok) { -// const linkData = await res.json() -// setGroups((prev) => -// prev.map((g) => -// g.id === currentGroup.id -// ? { -// ...g, -// links: isEdit -// ? g.links.map((l) => (l.id === linkData.id ? linkData : l)) -// : [...g.links, linkData], -// } -// : g -// ) -// ) -// closeModal() -// } else { -// alert('Ошибка при сохранении ссылки') -// } -// } - -// async function handleLinkDelete() { -// if (!currentLink || !currentGroup) return -// const res = await fetch(`${API}/api/links/${currentLink.id}/`, { -// method: 'DELETE', -// headers: { Authorization: `Bearer ${token}` }, -// }) -// if (res.ok) { -// setGroups((prev) => -// prev.map((g) => -// g.id === currentGroup.id -// ? { ...g, links: g.links.filter((l) => l.id !== currentLink.id) } -// : g -// ) -// ) -// closeModal() -// } else { -// alert('Ошибка при удалении ссылки') -// } -// } - -// return ( -//
-// {/* Профиль */} -// {user && ( -//
-//
-// Avatar -//
-//
-// {user.full_name || user.username} -//
-//

{user.email}

-//
-//
-//
-// )} - -// {/* Заголовок с кнопкой «Добавить группу» */} -//
-//

Группы ссылок

-// -//
- -// {/* Список групп (аккордеон) */} -// {groups.map((group) => ( -// -//
-//
-//
-// {/* Редактировать имя группы */} -// { -// e.preventDefault() -// setCurrentGroup(group) -// setFormValue({ name: group.name }) -// setModalType('editGroup') -// }} -// > -// -// -// {/* Открыть/закрыть аккордеон */} -// -// setGroups((pg) => -// pg.map((g) => -// g.id === group.id -// ? { ...g, _open: !g._open } -// : g -// ) -// ) -// } -// > -// {group.name}{' '} -// -// {group.links.length} -// -// -//
-//
-// {/* Добавить ссылку */} -// -// {/* Удалить группу */} -// -//
-//
-// {/* Ссылки в раскрытом состоянии */} -// {group._open && ( -//
    -// {group.links.map((link) => ( -//
  • -// -// {link.title} -// -//
    -// -// -//
    -//
  • -// ))} -//
-// )} -//
-//
-// ))} - -// {/* Универсальная модалка */} -// {modalType && ( -// -// {/* Группа: добавить/редактировать */} -// {(modalType === 'addGroup' || modalType === 'editGroup') && ( -// <> -//
-// {modalType === 'addGroup' ? 'Новая группа' : 'Редактировать группу'} -//
-// -// setFormValue({ ...formValue, name: e.target.value }) -// } -// /> -// -// -// )} -// {/* Подтверждение удаления группы */} -// {modalType === 'deleteGroup' && ( -// <> -//
Удалить группу?
-//

Группа «{currentGroup?.name}» будет удалена навсегда.

-// -// -// -// )} -// {/* Ссылка: добавить/редактировать */} -// {(modalType === 'addLink' || modalType === 'editLink') && ( -// <> -//
{modalType === 'addLink' ? 'Новая ссылка' : 'Редактировать ссылку'}
-// -// setFormValue({ ...formValue, name: e.target.value }) -// } -// /> -// -// setFormValue({ ...formValue, url: e.target.value }) -// } -// /> -// -// -// )} -// {/* Подтверждение удаления ссылки */} -// {modalType === 'deleteLink' && ( -// <> -//
Удалить ссылку?
-//

Ссылка «{currentLink?.title}» будет удалена.

-// -// -// -// )} -//
-// )} -//
-// ) -// } - -// src/app/(protected)/dashboard/page.tsx -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import { ProfileCard } from '../components/ProfileCard' - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string - group: number -} - -interface Group { - id: number - name: string - icon?: string - // we'll always fill this in as an array: - links: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - const API = process.env.NEXT_PUBLIC_API_URL ?? '' - - // 1) fetch profile - // 2) fetch all groups - // 3) fetch all links - Promise.all([ - fetch(`${API}/api/auth/user/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - fetch(`${API}/api/groups/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - fetch(`${API}/api/links/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - ]) - .then(async ([uRes, gRes, lRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - if (!lRes.ok) throw new Error('Не удалось загрузить ссылки') - - const userData = await uRes.json() - const groupsData = await gRes.json() - const linksData = await lRes.json() - - // group.links might not exist on the payload, so we build it: - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id) - })) - - setUser(userData) - setGroups(enrichedGroups) - }) - .catch(err => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router]) - - if (loading) { - return
Загрузка...
- } - if (error) { - return
{error}
- } - - // Подсчёт: всего групп и всего ссылок - const totalGroups = groups.length - const totalLinks = groups.reduce((sum, grp) => sum + grp.links.length, 0) - - return ( -
- {user && ( - - )} - -
-
-
-
Группы ссылок
- -
- -
- {groups.map((group) => ( - -
-
- setExpandedGroup(expandedGroup === group.id ? null : group.id) - } - > - {group.icon && ( - {group.name} - )} - {group.name} - - {group.links.length} - -
-
- - - -
-
- - {expandedGroup === group.id && ( -
-
    - {group.links.map((link) => ( -
  • -
    - {link.icon && ( - {link.title} - )} - - {link.title} - -
    -
    - - -
    -
  • - ))} -
-
- )} -
- ))} -
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507140327.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507140327.tsx deleted file mode 100644 index ec3b9e5..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507140327.tsx +++ /dev/null @@ -1,638 +0,0 @@ -// 'use client' - -// import React, { useEffect, useState, Fragment } from 'react' -// import { useRouter } from 'next/navigation' -// import Image from 'next/image' -// import { Modal } from '../../components/modal' // Модалка из примера выше - -// interface UserProfile { -// id: number -// username: string -// email: string -// full_name: string -// bio?: string -// avatar: string -// last_login: string -// date_joined: string -// } - -// interface LinkItem { -// id: number -// title: string -// url: string -// icon?: string -// } - -// interface Group { -// id: number -// name: string -// image?: string -// links: LinkItem[] -// _open?: boolean // флаг аккордеона -// } - -// type ModalType = -// | 'addGroup' -// | 'editGroup' -// | 'deleteGroup' -// | 'addLink' -// | 'editLink' -// | 'deleteLink' -// | null - -// export default function DashboardPage() { -// const router = useRouter() -// const API = process.env.NEXT_PUBLIC_API_URL -// const token = typeof window !== 'undefined' ? localStorage.getItem('token') : null - -// const [user, setUser] = useState(null) -// const [groups, setGroups] = useState([]) -// const [loading, setLoading] = useState(true) -// const [error, setError] = useState(null) - -// // для модалки -// const [modalType, setModalType] = useState(null) -// const [currentGroup, setCurrentGroup] = useState(null) -// const [currentLink, setCurrentLink] = useState(null) -// const [formValue, setFormValue] = useState<{ name?: string; url?: string }>({}) - -// // загрузка пользователя и групп -// useEffect(() => { -// if (!token) { -// router.replace('/auth/login') -// return -// } -// Promise.all([ -// fetch(`${API}/api/auth/user/`, { -// headers: { Authorization: `Bearer ${token}` }, -// }), -// fetch(`${API}/api/groups/`, { -// headers: { Authorization: `Bearer ${token}` }, -// }), -// ]) -// .then(async ([uRes, gRes]) => { -// if (!uRes.ok) throw new Error('Не удалось получить профиль') -// if (!gRes.ok) throw new Error('Не удалось загрузить группы') -// const [u, g] = await Promise.all([uRes.json(), gRes.json()]) -// setUser(u) -// setGroups(g) -// }) -// .catch((err) => setError((err as Error).message)) -// .finally(() => setLoading(false)) -// }, [router, API, token]) - -// if (loading) return
Загрузка...
-// if (error) return
{error}
- -// // закрыть модалку -// const closeModal = () => { -// setModalType(null) -// setCurrentGroup(null) -// setCurrentLink(null) -// setFormValue({}) -// } - -// // === Группы === -// async function handleGroupSubmit() { -// if (!modalType) return -// const isNew = modalType === 'addGroup' -// const url = isNew -// ? `${API}/api/groups/` -// : `${API}/api/groups/${currentGroup!.id}/` -// const method = isNew ? 'POST' : 'PUT' -// const res = await fetch(url, { -// method, -// headers: { -// 'Content-Type': 'application/json', -// Authorization: `Bearer ${token}`, -// }, -// body: JSON.stringify({ name: formValue.name }), -// }) -// if (res.ok) { -// const grp = await res.json() -// setGroups((prev) => -// isNew -// ? [...prev, { ...grp, links: [] }] -// : prev.map((g) => (g.id === grp.id ? { ...g, name: grp.name } : g)) -// ) -// closeModal() -// } else { -// alert('Ошибка при сохранении группы') -// } -// } - -// async function handleGroupDelete() { -// if (!currentGroup) return -// const res = await fetch(`${API}/api/groups/${currentGroup.id}/`, { -// method: 'DELETE', -// headers: { Authorization: `Bearer ${token}` }, -// }) -// if (res.ok) { -// setGroups((prev) => prev.filter((g) => g.id !== currentGroup.id)) -// closeModal() -// } else { -// alert('Ошибка при удалении группы') -// } -// } - -// // === Ссылки === -// async function handleLinkSubmit() { -// if (!currentGroup) return -// const isEdit = modalType === 'editLink' -// const url = isEdit -// ? `${API}/api/links/${currentLink!.id}/` -// : `${API}/api/links/` -// const method = isEdit ? 'PUT' : 'POST' -// const payload = { -// title: formValue.name, -// url: formValue.url, -// group: currentGroup.id, -// } -// const res = await fetch(url, { -// method, -// headers: { -// 'Content-Type': 'application/json', -// Authorization: `Bearer ${token}`, -// }, -// body: JSON.stringify(payload), -// }) -// if (res.ok) { -// const linkData = await res.json() -// setGroups((prev) => -// prev.map((g) => -// g.id === currentGroup.id -// ? { -// ...g, -// links: isEdit -// ? g.links.map((l) => (l.id === linkData.id ? linkData : l)) -// : [...g.links, linkData], -// } -// : g -// ) -// ) -// closeModal() -// } else { -// alert('Ошибка при сохранении ссылки') -// } -// } - -// async function handleLinkDelete() { -// if (!currentLink || !currentGroup) return -// const res = await fetch(`${API}/api/links/${currentLink.id}/`, { -// method: 'DELETE', -// headers: { Authorization: `Bearer ${token}` }, -// }) -// if (res.ok) { -// setGroups((prev) => -// prev.map((g) => -// g.id === currentGroup.id -// ? { ...g, links: g.links.filter((l) => l.id !== currentLink.id) } -// : g -// ) -// ) -// closeModal() -// } else { -// alert('Ошибка при удалении ссылки') -// } -// } - -// return ( -//
-// {/* Профиль */} -// {user && ( -//
-//
-// Avatar -//
-//
-// {user.full_name || user.username} -//
-//

{user.email}

-//
-//
-//
-// )} - -// {/* Заголовок с кнопкой «Добавить группу» */} -//
-//

Группы ссылок

-// -//
- -// {/* Список групп (аккордеон) */} -// {groups.map((group) => ( -// -//
-//
-//
-// {/* Редактировать имя группы */} -// { -// e.preventDefault() -// setCurrentGroup(group) -// setFormValue({ name: group.name }) -// setModalType('editGroup') -// }} -// > -// -// -// {/* Открыть/закрыть аккордеон */} -// -// setGroups((pg) => -// pg.map((g) => -// g.id === group.id -// ? { ...g, _open: !g._open } -// : g -// ) -// ) -// } -// > -// {group.name}{' '} -// -// {group.links.length} -// -// -//
-//
-// {/* Добавить ссылку */} -// -// {/* Удалить группу */} -// -//
-//
-// {/* Ссылки в раскрытом состоянии */} -// {group._open && ( -//
    -// {group.links.map((link) => ( -//
  • -// -// {link.title} -// -//
    -// -// -//
    -//
  • -// ))} -//
-// )} -//
-//
-// ))} - -// {/* Универсальная модалка */} -// {modalType && ( -// -// {/* Группа: добавить/редактировать */} -// {(modalType === 'addGroup' || modalType === 'editGroup') && ( -// <> -//
-// {modalType === 'addGroup' ? 'Новая группа' : 'Редактировать группу'} -//
-// -// setFormValue({ ...formValue, name: e.target.value }) -// } -// /> -// -// -// )} -// {/* Подтверждение удаления группы */} -// {modalType === 'deleteGroup' && ( -// <> -//
Удалить группу?
-//

Группа «{currentGroup?.name}» будет удалена навсегда.

-// -// -// -// )} -// {/* Ссылка: добавить/редактировать */} -// {(modalType === 'addLink' || modalType === 'editLink') && ( -// <> -//
{modalType === 'addLink' ? 'Новая ссылка' : 'Редактировать ссылку'}
-// -// setFormValue({ ...formValue, name: e.target.value }) -// } -// /> -// -// setFormValue({ ...formValue, url: e.target.value }) -// } -// /> -// -// -// )} -// {/* Подтверждение удаления ссылки */} -// {modalType === 'deleteLink' && ( -// <> -//
Удалить ссылку?
-//

Ссылка «{currentLink?.title}» будет удалена.

-// -// -// -// )} -//
-// )} -//
-// ) -// } - -// src/app/(protected)/dashboard/page.tsx -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import { ProfileCard } from '../../components/ProfileCard' - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string - group: number -} - -interface Group { - id: number - name: string - icon?: string - // we'll always fill this in as an array: - links: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - const API = process.env.NEXT_PUBLIC_API_URL ?? '' - - // 1) fetch profile - // 2) fetch all groups - // 3) fetch all links - Promise.all([ - fetch(`${API}/api/auth/user/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - fetch(`${API}/api/groups/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - fetch(`${API}/api/links/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - ]) - .then(async ([uRes, gRes, lRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - if (!lRes.ok) throw new Error('Не удалось загрузить ссылки') - - const userData = await uRes.json() - const groupsData = await gRes.json() - const linksData = await lRes.json() - - // group.links might not exist on the payload, so we build it: - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id) - })) - - setUser(userData) - setGroups(enrichedGroups) - }) - .catch(err => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router]) - - if (loading) { - return
Загрузка...
- } - if (error) { - return
{error}
- } - - // Подсчёт: всего групп и всего ссылок - const totalGroups = groups.length - const totalLinks = groups.reduce((sum, grp) => sum + grp.links.length, 0) - - return ( -
- {user && ( - - )} - -
-
-
-
Группы ссылок
- -
- -
- {groups.map((group) => ( - -
-
- setExpandedGroup(expandedGroup === group.id ? null : group.id) - } - > - {group.icon && ( - {group.name} - )} - {group.name} - - {group.links.length} - -
-
- - - -
-
- - {expandedGroup === group.id && ( -
-
    - {group.links.map((link) => ( -
  • -
    - {link.icon && ( - {link.title} - )} - - {link.title} - -
    -
    - - -
    -
  • - ))} -
-
- )} -
- ))} -
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507140923.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507140923.tsx deleted file mode 100644 index 566a9be..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507140923.tsx +++ /dev/null @@ -1,213 +0,0 @@ -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import { ProfileCard } from '../../components/ProfileCard' - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string - group: number -} - -interface Group { - id: number - name: string - icon?: string - // we'll always fill this in as an array: - links: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - const API = process.env.NEXT_PUBLIC_API_URL ?? '' - - // 1) fetch profile - // 2) fetch all groups - // 3) fetch all links - Promise.all([ - fetch(`${API}/api/auth/user/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - fetch(`${API}/api/groups/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - fetch(`${API}/api/links/`, { - headers: { Authorization: `Bearer ${token}` }, - }), - ]) - .then(async ([uRes, gRes, lRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - if (!lRes.ok) throw new Error('Не удалось загрузить ссылки') - - const userData = await uRes.json() - const groupsData = await gRes.json() - const linksData = await lRes.json() - - // group.links might not exist on the payload, so we build it: - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id) - })) - - setUser(userData) - setGroups(enrichedGroups) - }) - .catch(err => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router]) - - if (loading) { - return
Загрузка...
- } - if (error) { - return
{error}
- } - - // Подсчёт: всего групп и всего ссылок - const totalGroups = groups.length - const totalLinks = groups.reduce((sum, grp) => sum + grp.links.length, 0) - - return ( -
- {user && ( - - )} - -
-
-
-
Группы ссылок
- -
- -
- {groups.map((group) => ( - -
-
- setExpandedGroup(expandedGroup === group.id ? null : group.id) - } - > - {group.icon && ( - {group.name} - )} - {group.name} - - {group.links.length} - -
-
- - - -
-
- - {expandedGroup === group.id && ( -
-
    - {group.links.map((link) => ( -
  • -
    - {link.icon && ( - {link.title} - )} - - {link.title} - -
    -
    - - -
    -
  • - ))} -
-
- )} -
- ))} -
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507143628.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507143628.tsx deleted file mode 100644 index dc92316..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20250507143628.tsx +++ /dev/null @@ -1,390 +0,0 @@ -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import Image from 'next/image' -import { ProfileCard } from '../../components/ProfileCard' - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string - group: number -} - -interface Group { - id: number - name: string - icon?: string - links: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - // === Для модалок групп === - const [showGroupModal, setShowGroupModal] = useState(false) - const [groupModalMode, setGroupModalMode] = useState<'add' | 'edit'>('add') - const [editingGroup, setEditingGroup] = useState(null) - const [groupForm, setGroupForm] = useState<{ name: string; iconFile: File | null }>({ - name: '', - iconFile: null, - }) - - // === Для модалок ссылок === - const [showLinkModal, setShowLinkModal] = useState(false) - const [linkModalMode, setLinkModalMode] = useState<'add' | 'edit'>('add') - const [editingLink, setEditingLink] = useState(null) - const [currentGroupIdForLink, setCurrentGroupIdForLink] = useState(null) - const [linkForm, setLinkForm] = useState<{ title: string; url: string; iconFile: File | null }>({ - title: '', - url: '', - iconFile: null, - }) - - const API = process.env.NEXT_PUBLIC_API_URL ?? '' - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - // загружаем профиль, группы и ссылки - Promise.all([ - fetch(`${API}/api/auth/user/`, { headers: { Authorization: `Bearer ${token}` } }), - fetch(`${API}/api/groups/`, { headers: { Authorization: `Bearer ${token}` } }), - fetch(`${API}/api/links/`, { headers: { Authorization: `Bearer ${token}` } }), - ]) - .then(async ([uRes, gRes, lRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - if (!lRes.ok) throw new Error('Не удалось загрузить ссылки') - const userData = await uRes.json() - const groupsData = await gRes.json() - const linksData = await lRes.json() - - // «привязываем» ссылки к группам - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setUser(userData) - setGroups(enrichedGroups) - }) - .catch(err => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router]) - - // Перезагрузка списка групп и ссылок - async function reloadData() { - const token = localStorage.getItem('token')! - const [gRes, lRes] = await Promise.all([ - fetch(`${API}/api/groups/`, { headers: { Authorization: `Bearer ${token}` } }), - fetch(`${API}/api/links/`, { headers: { Authorization: `Bearer ${token}` } }), - ]) - const groupsData = await gRes.json() - const linksData = await lRes.json() - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setGroups(enrichedGroups) - } - - // === Обработчики групп === - function openAddGroup() { - setGroupModalMode('add') - setGroupForm({ name: '', iconFile: null }) - setShowGroupModal(true) - } - function openEditGroup(grp: Group) { - setGroupModalMode('edit') - setEditingGroup(grp) - setGroupForm({ name: grp.name, iconFile: null }) - setShowGroupModal(true) - } - async function handleGroupSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('name', groupForm.name) - if (groupForm.iconFile) fd.append('icon', groupForm.iconFile) - const url = groupModalMode === 'add' - ? `${API}/api/groups/` - : `${API}/api/groups/${editingGroup?.id}/` - const method = groupModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowGroupModal(false) - await reloadData() - } - async function handleDeleteGroup(grp: Group) { - if (!confirm(`Удалить группу "${grp.name}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`${API}/api/groups/${grp.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - // === Обработчики ссылок === - function openAddLink(grp: Group) { - setLinkModalMode('add') - setCurrentGroupIdForLink(grp.id) - setLinkForm({ title: '', url: '', iconFile: null }) - setShowLinkModal(true) - } - function openEditLink(link: LinkItem) { - setLinkModalMode('edit') - setEditingLink(link) - setCurrentGroupIdForLink(link.group) - setLinkForm({ title: link.title, url: link.url, iconFile: null }) - setShowLinkModal(true) - } - async function handleLinkSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('title', linkForm.title) - fd.append('url', linkForm.url) - if (linkForm.iconFile) fd.append('icon', linkForm.iconFile) - fd.append('group', String(currentGroupIdForLink)) - const url = linkModalMode === 'add' - ? `${API}/api/links/` - : `${API}/api/links/${editingLink?.id}/` - const method = linkModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowLinkModal(false) - await reloadData() - } - async function handleDeleteLink(link: LinkItem) { - if (!confirm(`Удалить ссылку "${link.title}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`${API}/api/links/${link.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - if (loading) return
Загрузка...
- if (error) return
{error}
- - const totalGroups = groups.length - const totalLinks = groups.reduce((sum, grp) => sum + grp.links.length, 0) - - return ( -
- {user && ( - - )} - -
-
-
-
Группы ссылок
- -
- -
- {groups.map(group => ( - -
-
- setExpandedGroup(expandedGroup === group.id ? null : group.id) - } - > - {group.icon && ( - {group.name} - )} - {group.name} - - {group.links.length} - -
-
- - - -
-
- - {expandedGroup === group.id && ( -
-
    - {group.links.map(link => ( -
  • -
    - {link.icon && ( - {link.title} - )} - - {link.title} - -
    -
    - - -
    -
  • - ))} -
-
- )} -
- ))} -
-
-
- - {/* Модалка добавления/редактирования группы */} -
-
-
-
-
{groupModalMode === 'add' ? 'Добавить группу' : 'Редактировать группу'}
-
-
-
- - setGroupForm(f => ({ ...f, name: e.target.value }))} - /> -
-
- - setGroupForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
- - {/* Модалка добавления/редактирования ссылки */} -
-
-
-
-
{linkModalMode === 'add' ? 'Добавить ссылку' : 'Редактировать ссылку'}
-
-
-
- - setLinkForm(f => ({ ...f, title: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, url: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195045.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195045.tsx deleted file mode 100644 index 259192d..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195045.tsx +++ /dev/null @@ -1,390 +0,0 @@ -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import Image from 'next/image' -import { ProfileCard } from '../../components/ProfileCard' - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string - group: number -} - -interface Group { - id: number - name: string - icon?: string - links: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - // === Для модалок групп === - const [showGroupModal, setShowGroupModal] = useState(false) - const [groupModalMode, setGroupModalMode] = useState<'add' | 'edit'>('add') - const [editingGroup, setEditingGroup] = useState(null) - const [groupForm, setGroupForm] = useState<{ name: string; iconFile: File | null }>({ - name: '', - iconFile: null, - }) - - // === Для модалок ссылок === - const [showLinkModal, setShowLinkModal] = useState(false) - const [linkModalMode, setLinkModalMode] = useState<'add' | 'edit'>('add') - const [editingLink, setEditingLink] = useState(null) - const [currentGroupIdForLink, setCurrentGroupIdForLink] = useState(null) - const [linkForm, setLinkForm] = useState<{ title: string; url: string; iconFile: File | null }>({ - title: '', - url: '', - iconFile: null, - }) - - const API = '' - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - // загружаем профиль, группы и ссылки - Promise.all([ - fetch('/api/auth/user', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/groups', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/links', { headers: { Authorization: `Bearer ${token}` } }), - ]) - .then(async ([uRes, gRes, lRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - if (!lRes.ok) throw new Error('Не удалось загрузить ссылки') - const userData = await uRes.json() - const groupsData = await gRes.json() - const linksData = await lRes.json() - - // «привязываем» ссылки к группам - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setUser(userData) - setGroups(enrichedGroups) - }) - .catch(err => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router]) - - // Перезагрузка списка групп и ссылок - async function reloadData() { - const token = localStorage.getItem('token')! - const [gRes, lRes] = await Promise.all([ - fetch(`${API}/api/groups/`, { headers: { Authorization: `Bearer ${token}` } }), - fetch(`${API}/api/links/`, { headers: { Authorization: `Bearer ${token}` } }), - ]) - const groupsData = await gRes.json() - const linksData = await lRes.json() - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setGroups(enrichedGroups) - } - - // === Обработчики групп === - function openAddGroup() { - setGroupModalMode('add') - setGroupForm({ name: '', iconFile: null }) - setShowGroupModal(true) - } - function openEditGroup(grp: Group) { - setGroupModalMode('edit') - setEditingGroup(grp) - setGroupForm({ name: grp.name, iconFile: null }) - setShowGroupModal(true) - } - async function handleGroupSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('name', groupForm.name) - if (groupForm.iconFile) fd.append('icon', groupForm.iconFile) - const url = groupModalMode === 'add' - ? `${API}/api/groups/` - : `${API}/api/groups/${editingGroup?.id}/` - const method = groupModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowGroupModal(false) - await reloadData() - } - async function handleDeleteGroup(grp: Group) { - if (!confirm(`Удалить группу "${grp.name}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`${API}/api/groups/${grp.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - // === Обработчики ссылок === - function openAddLink(grp: Group) { - setLinkModalMode('add') - setCurrentGroupIdForLink(grp.id) - setLinkForm({ title: '', url: '', iconFile: null }) - setShowLinkModal(true) - } - function openEditLink(link: LinkItem) { - setLinkModalMode('edit') - setEditingLink(link) - setCurrentGroupIdForLink(link.group) - setLinkForm({ title: link.title, url: link.url, iconFile: null }) - setShowLinkModal(true) - } - async function handleLinkSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('title', linkForm.title) - fd.append('url', linkForm.url) - if (linkForm.iconFile) fd.append('icon', linkForm.iconFile) - fd.append('group', String(currentGroupIdForLink)) - const url = linkModalMode === 'add' - ? `${API}/api/links/` - : `${API}/api/links/${editingLink?.id}/` - const method = linkModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowLinkModal(false) - await reloadData() - } - async function handleDeleteLink(link: LinkItem) { - if (!confirm(`Удалить ссылку "${link.title}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`${API}/api/links/${link.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - if (loading) return
Загрузка...
- if (error) return
{error}
- - const totalGroups = groups.length - const totalLinks = groups.reduce((sum, grp) => sum + grp.links.length, 0) - - return ( -
- {user && ( - - )} - -
-
-
-
Группы ссылок
- -
- -
- {groups.map(group => ( - -
-
- setExpandedGroup(expandedGroup === group.id ? null : group.id) - } - > - {group.icon && ( - {group.name} - )} - {group.name} - - {group.links.length} - -
-
- - - -
-
- - {expandedGroup === group.id && ( -
-
    - {group.links.map(link => ( -
  • -
    - {link.icon && ( - {link.title} - )} - - {link.title} - -
    -
    - - -
    -
  • - ))} -
-
- )} -
- ))} -
-
-
- - {/* Модалка добавления/редактирования группы */} -
-
-
-
-
{groupModalMode === 'add' ? 'Добавить группу' : 'Редактировать группу'}
-
-
-
- - setGroupForm(f => ({ ...f, name: e.target.value }))} - /> -
-
- - setGroupForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
- - {/* Модалка добавления/редактирования ссылки */} -
-
-
-
-
{linkModalMode === 'add' ? 'Добавить ссылку' : 'Редактировать ссылку'}
-
-
-
- - setLinkForm(f => ({ ...f, title: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, url: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195109.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195109.tsx deleted file mode 100644 index e7968bd..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195109.tsx +++ /dev/null @@ -1,390 +0,0 @@ -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import Image from 'next/image' -import { ProfileCard } from '../../components/ProfileCard' - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string - group: number -} - -interface Group { - id: number - name: string - icon?: string - links: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - // === Для модалок групп === - const [showGroupModal, setShowGroupModal] = useState(false) - const [groupModalMode, setGroupModalMode] = useState<'add' | 'edit'>('add') - const [editingGroup, setEditingGroup] = useState(null) - const [groupForm, setGroupForm] = useState<{ name: string; iconFile: File | null }>({ - name: '', - iconFile: null, - }) - - // === Для модалок ссылок === - const [showLinkModal, setShowLinkModal] = useState(false) - const [linkModalMode, setLinkModalMode] = useState<'add' | 'edit'>('add') - const [editingLink, setEditingLink] = useState(null) - const [currentGroupIdForLink, setCurrentGroupIdForLink] = useState(null) - const [linkForm, setLinkForm] = useState<{ title: string; url: string; iconFile: File | null }>({ - title: '', - url: '', - iconFile: null, - }) - - const API = '' - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - // загружаем профиль, группы и ссылки - Promise.all([ - fetch('/api/auth/user', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/groups', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/links', { headers: { Authorization: `Bearer ${token}` } }), - ]) - .then(async ([uRes, gRes, lRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - if (!lRes.ok) throw new Error('Не удалось загрузить ссылки') - const userData = await uRes.json() - const groupsData = await gRes.json() - const linksData = await lRes.json() - - // «привязываем» ссылки к группам - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setUser(userData) - setGroups(enrichedGroups) - }) - .catch(err => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router]) - - // Перезагрузка списка групп и ссылок - async function reloadData() { - const token = localStorage.getItem('token')! - const [gRes, lRes] = await Promise.all([ - fetch('/api/groups', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/links', { headers: { Authorization: `Bearer ${token}` } }), - ]) - const groupsData = await gRes.json() - const linksData = await lRes.json() - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setGroups(enrichedGroups) - } - - // === Обработчики групп === - function openAddGroup() { - setGroupModalMode('add') - setGroupForm({ name: '', iconFile: null }) - setShowGroupModal(true) - } - function openEditGroup(grp: Group) { - setGroupModalMode('edit') - setEditingGroup(grp) - setGroupForm({ name: grp.name, iconFile: null }) - setShowGroupModal(true) - } - async function handleGroupSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('name', groupForm.name) - if (groupForm.iconFile) fd.append('icon', groupForm.iconFile) - const url = groupModalMode === 'add' - ? `${API}/api/groups/` - : `${API}/api/groups/${editingGroup?.id}/` - const method = groupModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowGroupModal(false) - await reloadData() - } - async function handleDeleteGroup(grp: Group) { - if (!confirm(`Удалить группу "${grp.name}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`${API}/api/groups/${grp.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - // === Обработчики ссылок === - function openAddLink(grp: Group) { - setLinkModalMode('add') - setCurrentGroupIdForLink(grp.id) - setLinkForm({ title: '', url: '', iconFile: null }) - setShowLinkModal(true) - } - function openEditLink(link: LinkItem) { - setLinkModalMode('edit') - setEditingLink(link) - setCurrentGroupIdForLink(link.group) - setLinkForm({ title: link.title, url: link.url, iconFile: null }) - setShowLinkModal(true) - } - async function handleLinkSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('title', linkForm.title) - fd.append('url', linkForm.url) - if (linkForm.iconFile) fd.append('icon', linkForm.iconFile) - fd.append('group', String(currentGroupIdForLink)) - const url = linkModalMode === 'add' - ? `${API}/api/links/` - : `${API}/api/links/${editingLink?.id}/` - const method = linkModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowLinkModal(false) - await reloadData() - } - async function handleDeleteLink(link: LinkItem) { - if (!confirm(`Удалить ссылку "${link.title}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`${API}/api/links/${link.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - if (loading) return
Загрузка...
- if (error) return
{error}
- - const totalGroups = groups.length - const totalLinks = groups.reduce((sum, grp) => sum + grp.links.length, 0) - - return ( -
- {user && ( - - )} - -
-
-
-
Группы ссылок
- -
- -
- {groups.map(group => ( - -
-
- setExpandedGroup(expandedGroup === group.id ? null : group.id) - } - > - {group.icon && ( - {group.name} - )} - {group.name} - - {group.links.length} - -
-
- - - -
-
- - {expandedGroup === group.id && ( -
-
    - {group.links.map(link => ( -
  • -
    - {link.icon && ( - {link.title} - )} - - {link.title} - -
    -
    - - -
    -
  • - ))} -
-
- )} -
- ))} -
-
-
- - {/* Модалка добавления/редактирования группы */} -
-
-
-
-
{groupModalMode === 'add' ? 'Добавить группу' : 'Редактировать группу'}
-
-
-
- - setGroupForm(f => ({ ...f, name: e.target.value }))} - /> -
-
- - setGroupForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
- - {/* Модалка добавления/редактирования ссылки */} -
-
-
-
-
{linkModalMode === 'add' ? 'Добавить ссылку' : 'Редактировать ссылку'}
-
-
-
- - setLinkForm(f => ({ ...f, title: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, url: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195124.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195124.tsx deleted file mode 100644 index 0816be4..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195124.tsx +++ /dev/null @@ -1,390 +0,0 @@ -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import Image from 'next/image' -import { ProfileCard } from '../../components/ProfileCard' - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string - group: number -} - -interface Group { - id: number - name: string - icon?: string - links: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - // === Для модалок групп === - const [showGroupModal, setShowGroupModal] = useState(false) - const [groupModalMode, setGroupModalMode] = useState<'add' | 'edit'>('add') - const [editingGroup, setEditingGroup] = useState(null) - const [groupForm, setGroupForm] = useState<{ name: string; iconFile: File | null }>({ - name: '', - iconFile: null, - }) - - // === Для модалок ссылок === - const [showLinkModal, setShowLinkModal] = useState(false) - const [linkModalMode, setLinkModalMode] = useState<'add' | 'edit'>('add') - const [editingLink, setEditingLink] = useState(null) - const [currentGroupIdForLink, setCurrentGroupIdForLink] = useState(null) - const [linkForm, setLinkForm] = useState<{ title: string; url: string; iconFile: File | null }>({ - title: '', - url: '', - iconFile: null, - }) - - const API = '' - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - // загружаем профиль, группы и ссылки - Promise.all([ - fetch('/api/auth/user', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/groups', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/links', { headers: { Authorization: `Bearer ${token}` } }), - ]) - .then(async ([uRes, gRes, lRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - if (!lRes.ok) throw new Error('Не удалось загрузить ссылки') - const userData = await uRes.json() - const groupsData = await gRes.json() - const linksData = await lRes.json() - - // «привязываем» ссылки к группам - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setUser(userData) - setGroups(enrichedGroups) - }) - .catch(err => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router]) - - // Перезагрузка списка групп и ссылок - async function reloadData() { - const token = localStorage.getItem('token')! - const [gRes, lRes] = await Promise.all([ - fetch('/api/groups', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/links', { headers: { Authorization: `Bearer ${token}` } }), - ]) - const groupsData = await gRes.json() - const linksData = await lRes.json() - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setGroups(enrichedGroups) - } - - // === Обработчики групп === - function openAddGroup() { - setGroupModalMode('add') - setGroupForm({ name: '', iconFile: null }) - setShowGroupModal(true) - } - function openEditGroup(grp: Group) { - setGroupModalMode('edit') - setEditingGroup(grp) - setGroupForm({ name: grp.name, iconFile: null }) - setShowGroupModal(true) - } - async function handleGroupSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('name', groupForm.name) - if (groupForm.iconFile) fd.append('icon', groupForm.iconFile) - const url = groupModalMode === 'add' - ? '/api/groups' - : `/api/groups/${editingGroup?.id}` - const method = groupModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowGroupModal(false) - await reloadData() - } - async function handleDeleteGroup(grp: Group) { - if (!confirm(`Удалить группу "${grp.name}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`/api/groups/${grp.id}`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - // === Обработчики ссылок === - function openAddLink(grp: Group) { - setLinkModalMode('add') - setCurrentGroupIdForLink(grp.id) - setLinkForm({ title: '', url: '', iconFile: null }) - setShowLinkModal(true) - } - function openEditLink(link: LinkItem) { - setLinkModalMode('edit') - setEditingLink(link) - setCurrentGroupIdForLink(link.group) - setLinkForm({ title: link.title, url: link.url, iconFile: null }) - setShowLinkModal(true) - } - async function handleLinkSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('title', linkForm.title) - fd.append('url', linkForm.url) - if (linkForm.iconFile) fd.append('icon', linkForm.iconFile) - fd.append('group', String(currentGroupIdForLink)) - const url = linkModalMode === 'add' - ? `${API}/api/links/` - : `${API}/api/links/${editingLink?.id}/` - const method = linkModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowLinkModal(false) - await reloadData() - } - async function handleDeleteLink(link: LinkItem) { - if (!confirm(`Удалить ссылку "${link.title}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`${API}/api/links/${link.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - if (loading) return
Загрузка...
- if (error) return
{error}
- - const totalGroups = groups.length - const totalLinks = groups.reduce((sum, grp) => sum + grp.links.length, 0) - - return ( -
- {user && ( - - )} - -
-
-
-
Группы ссылок
- -
- -
- {groups.map(group => ( - -
-
- setExpandedGroup(expandedGroup === group.id ? null : group.id) - } - > - {group.icon && ( - {group.name} - )} - {group.name} - - {group.links.length} - -
-
- - - -
-
- - {expandedGroup === group.id && ( -
-
    - {group.links.map(link => ( -
  • -
    - {link.icon && ( - {link.title} - )} - - {link.title} - -
    -
    - - -
    -
  • - ))} -
-
- )} -
- ))} -
-
-
- - {/* Модалка добавления/редактирования группы */} -
-
-
-
-
{groupModalMode === 'add' ? 'Добавить группу' : 'Редактировать группу'}
-
-
-
- - setGroupForm(f => ({ ...f, name: e.target.value }))} - /> -
-
- - setGroupForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
- - {/* Модалка добавления/редактирования ссылки */} -
-
-
-
-
{linkModalMode === 'add' ? 'Добавить ссылку' : 'Редактировать ссылку'}
-
-
-
- - setLinkForm(f => ({ ...f, title: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, url: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195139.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195139.tsx deleted file mode 100644 index 97d5e4f..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195139.tsx +++ /dev/null @@ -1,390 +0,0 @@ -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import Image from 'next/image' -import { ProfileCard } from '../../components/ProfileCard' - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string - group: number -} - -interface Group { - id: number - name: string - icon?: string - links: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - // === Для модалок групп === - const [showGroupModal, setShowGroupModal] = useState(false) - const [groupModalMode, setGroupModalMode] = useState<'add' | 'edit'>('add') - const [editingGroup, setEditingGroup] = useState(null) - const [groupForm, setGroupForm] = useState<{ name: string; iconFile: File | null }>({ - name: '', - iconFile: null, - }) - - // === Для модалок ссылок === - const [showLinkModal, setShowLinkModal] = useState(false) - const [linkModalMode, setLinkModalMode] = useState<'add' | 'edit'>('add') - const [editingLink, setEditingLink] = useState(null) - const [currentGroupIdForLink, setCurrentGroupIdForLink] = useState(null) - const [linkForm, setLinkForm] = useState<{ title: string; url: string; iconFile: File | null }>({ - title: '', - url: '', - iconFile: null, - }) - - const API = '' - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - // загружаем профиль, группы и ссылки - Promise.all([ - fetch('/api/auth/user', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/groups', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/links', { headers: { Authorization: `Bearer ${token}` } }), - ]) - .then(async ([uRes, gRes, lRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - if (!lRes.ok) throw new Error('Не удалось загрузить ссылки') - const userData = await uRes.json() - const groupsData = await gRes.json() - const linksData = await lRes.json() - - // «привязываем» ссылки к группам - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setUser(userData) - setGroups(enrichedGroups) - }) - .catch(err => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router]) - - // Перезагрузка списка групп и ссылок - async function reloadData() { - const token = localStorage.getItem('token')! - const [gRes, lRes] = await Promise.all([ - fetch('/api/groups', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/links', { headers: { Authorization: `Bearer ${token}` } }), - ]) - const groupsData = await gRes.json() - const linksData = await lRes.json() - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setGroups(enrichedGroups) - } - - // === Обработчики групп === - function openAddGroup() { - setGroupModalMode('add') - setGroupForm({ name: '', iconFile: null }) - setShowGroupModal(true) - } - function openEditGroup(grp: Group) { - setGroupModalMode('edit') - setEditingGroup(grp) - setGroupForm({ name: grp.name, iconFile: null }) - setShowGroupModal(true) - } - async function handleGroupSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('name', groupForm.name) - if (groupForm.iconFile) fd.append('icon', groupForm.iconFile) - const url = groupModalMode === 'add' - ? '/api/groups' - : `/api/groups/${editingGroup?.id}` - const method = groupModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowGroupModal(false) - await reloadData() - } - async function handleDeleteGroup(grp: Group) { - if (!confirm(`Удалить группу "${grp.name}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`/api/groups/${grp.id}`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - // === Обработчики ссылок === - function openAddLink(grp: Group) { - setLinkModalMode('add') - setCurrentGroupIdForLink(grp.id) - setLinkForm({ title: '', url: '', iconFile: null }) - setShowLinkModal(true) - } - function openEditLink(link: LinkItem) { - setLinkModalMode('edit') - setEditingLink(link) - setCurrentGroupIdForLink(link.group) - setLinkForm({ title: link.title, url: link.url, iconFile: null }) - setShowLinkModal(true) - } - async function handleLinkSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('title', linkForm.title) - fd.append('url', linkForm.url) - if (linkForm.iconFile) fd.append('icon', linkForm.iconFile) - fd.append('group', String(currentGroupIdForLink)) - const url = linkModalMode === 'add' - ? '/api/links' - : `/api/links/${editingLink?.id}` - const method = linkModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowLinkModal(false) - await reloadData() - } - async function handleDeleteLink(link: LinkItem) { - if (!confirm(`Удалить ссылку "${link.title}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`${API}/api/links/${link.id}/`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - if (loading) return
Загрузка...
- if (error) return
{error}
- - const totalGroups = groups.length - const totalLinks = groups.reduce((sum, grp) => sum + grp.links.length, 0) - - return ( -
- {user && ( - - )} - -
-
-
-
Группы ссылок
- -
- -
- {groups.map(group => ( - -
-
- setExpandedGroup(expandedGroup === group.id ? null : group.id) - } - > - {group.icon && ( - {group.name} - )} - {group.name} - - {group.links.length} - -
-
- - - -
-
- - {expandedGroup === group.id && ( -
-
    - {group.links.map(link => ( -
  • -
    - {link.icon && ( - {link.title} - )} - - {link.title} - -
    -
    - - -
    -
  • - ))} -
-
- )} -
- ))} -
-
-
- - {/* Модалка добавления/редактирования группы */} -
-
-
-
-
{groupModalMode === 'add' ? 'Добавить группу' : 'Редактировать группу'}
-
-
-
- - setGroupForm(f => ({ ...f, name: e.target.value }))} - /> -
-
- - setGroupForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
- - {/* Модалка добавления/редактирования ссылки */} -
-
-
-
-
{linkModalMode === 'add' ? 'Добавить ссылку' : 'Редактировать ссылку'}
-
-
-
- - setLinkForm(f => ({ ...f, title: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, url: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195243.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195243.tsx deleted file mode 100644 index c16d9b6..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/dashboard/page_20251029195243.tsx +++ /dev/null @@ -1,390 +0,0 @@ -'use client' - -import React, { useEffect, useState, Fragment } from 'react' -import { useRouter } from 'next/navigation' -import Link from 'next/link' -import Image from 'next/image' -import { ProfileCard } from '../../components/ProfileCard' - -interface UserProfile { - id: number - username: string - email: string - full_name: string - bio?: string - avatar: string - last_login: string - date_joined: string -} - -interface LinkItem { - id: number - title: string - url: string - icon?: string - group: number -} - -interface Group { - id: number - name: string - icon?: string - links: LinkItem[] -} - -export default function DashboardPage() { - const router = useRouter() - const [user, setUser] = useState(null) - const [groups, setGroups] = useState([]) - const [expandedGroup, setExpandedGroup] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - - // === Для модалок групп === - const [showGroupModal, setShowGroupModal] = useState(false) - const [groupModalMode, setGroupModalMode] = useState<'add' | 'edit'>('add') - const [editingGroup, setEditingGroup] = useState(null) - const [groupForm, setGroupForm] = useState<{ name: string; iconFile: File | null }>({ - name: '', - iconFile: null, - }) - - // === Для модалок ссылок === - const [showLinkModal, setShowLinkModal] = useState(false) - const [linkModalMode, setLinkModalMode] = useState<'add' | 'edit'>('add') - const [editingLink, setEditingLink] = useState(null) - const [currentGroupIdForLink, setCurrentGroupIdForLink] = useState(null) - const [linkForm, setLinkForm] = useState<{ title: string; url: string; iconFile: File | null }>({ - title: '', - url: '', - iconFile: null, - }) - - const API = '' - - useEffect(() => { - const token = localStorage.getItem('token') - if (!token) { - router.push('/auth/login') - return - } - // загружаем профиль, группы и ссылки - Promise.all([ - fetch('/api/auth/user', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/groups', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/links', { headers: { Authorization: `Bearer ${token}` } }), - ]) - .then(async ([uRes, gRes, lRes]) => { - if (!uRes.ok) throw new Error('Не удалось получить профиль') - if (!gRes.ok) throw new Error('Не удалось загрузить группы') - if (!lRes.ok) throw new Error('Не удалось загрузить ссылки') - const userData = await uRes.json() - const groupsData = await gRes.json() - const linksData = await lRes.json() - - // «привязываем» ссылки к группам - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setUser(userData) - setGroups(enrichedGroups) - }) - .catch(err => setError((err as Error).message)) - .finally(() => setLoading(false)) - }, [router]) - - // Перезагрузка списка групп и ссылок - async function reloadData() { - const token = localStorage.getItem('token')! - const [gRes, lRes] = await Promise.all([ - fetch('/api/groups', { headers: { Authorization: `Bearer ${token}` } }), - fetch('/api/links', { headers: { Authorization: `Bearer ${token}` } }), - ]) - const groupsData = await gRes.json() - const linksData = await lRes.json() - const enrichedGroups: Group[] = groupsData.map((grp: any) => ({ - ...grp, - links: linksData.filter((link: LinkItem) => link.group === grp.id), - })) - setGroups(enrichedGroups) - } - - // === Обработчики групп === - function openAddGroup() { - setGroupModalMode('add') - setGroupForm({ name: '', iconFile: null }) - setShowGroupModal(true) - } - function openEditGroup(grp: Group) { - setGroupModalMode('edit') - setEditingGroup(grp) - setGroupForm({ name: grp.name, iconFile: null }) - setShowGroupModal(true) - } - async function handleGroupSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('name', groupForm.name) - if (groupForm.iconFile) fd.append('icon', groupForm.iconFile) - const url = groupModalMode === 'add' - ? '/api/groups' - : `/api/groups/${editingGroup?.id}` - const method = groupModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowGroupModal(false) - await reloadData() - } - async function handleDeleteGroup(grp: Group) { - if (!confirm(`Удалить группу "${grp.name}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`/api/groups/${grp.id}`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - // === Обработчики ссылок === - function openAddLink(grp: Group) { - setLinkModalMode('add') - setCurrentGroupIdForLink(grp.id) - setLinkForm({ title: '', url: '', iconFile: null }) - setShowLinkModal(true) - } - function openEditLink(link: LinkItem) { - setLinkModalMode('edit') - setEditingLink(link) - setCurrentGroupIdForLink(link.group) - setLinkForm({ title: link.title, url: link.url, iconFile: null }) - setShowLinkModal(true) - } - async function handleLinkSubmit() { - const token = localStorage.getItem('token')! - const fd = new FormData() - fd.append('title', linkForm.title) - fd.append('url', linkForm.url) - if (linkForm.iconFile) fd.append('icon', linkForm.iconFile) - fd.append('group', String(currentGroupIdForLink)) - const url = linkModalMode === 'add' - ? '/api/links' - : `/api/links/${editingLink?.id}` - const method = linkModalMode === 'add' ? 'POST' : 'PATCH' - await fetch(url, { - method, - headers: { Authorization: `Bearer ${token}` }, - body: fd, - }) - setShowLinkModal(false) - await reloadData() - } - async function handleDeleteLink(link: LinkItem) { - if (!confirm(`Удалить ссылку "${link.title}"?`)) return - const token = localStorage.getItem('token')! - await fetch(`/api/links/${link.id}`, { - method: 'DELETE', - headers: { Authorization: `Bearer ${token}` }, - }) - await reloadData() - } - - if (loading) return
Загрузка...
- if (error) return
{error}
- - const totalGroups = groups.length - const totalLinks = groups.reduce((sum, grp) => sum + grp.links.length, 0) - - return ( -
- {user && ( - - )} - -
-
-
-
Группы ссылок
- -
- -
- {groups.map(group => ( - -
-
- setExpandedGroup(expandedGroup === group.id ? null : group.id) - } - > - {group.icon && ( - {group.name} - )} - {group.name} - - {group.links.length} - -
-
- - - -
-
- - {expandedGroup === group.id && ( -
-
    - {group.links.map(link => ( -
  • -
    - {link.icon && ( - {link.title} - )} - - {link.title} - -
    -
    - - -
    -
  • - ))} -
-
- )} -
- ))} -
-
-
- - {/* Модалка добавления/редактирования группы */} -
-
-
-
-
{groupModalMode === 'add' ? 'Добавить группу' : 'Редактировать группу'}
-
-
-
- - setGroupForm(f => ({ ...f, name: e.target.value }))} - /> -
-
- - setGroupForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
- - {/* Модалка добавления/редактирования ссылки */} -
-
-
-
-
{linkModalMode === 'add' ? 'Добавить ссылку' : 'Редактировать ссылку'}
-
-
-
- - setLinkForm(f => ({ ...f, title: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, url: e.target.value }))} - /> -
-
- - setLinkForm(f => ({ ...f, iconFile: e.target.files?.[0] || null }))} - /> -
-
-
- - -
-
-
-
-
- ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/layout_20250507074711.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/layout_20250507074711.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/layout_20250507074730.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/layout_20250507074730.tsx deleted file mode 100644 index 07e952f..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/layout_20250507074730.tsx +++ /dev/null @@ -1,15 +0,0 @@ -// src/app/(protected)/layout.tsx -"use client" -import { ReactNode } from "react" -import { Header } from "../components/Header" -import { Footer } from "../components/Footer" - -export default function ProtectedLayout({ children }: { children: ReactNode }) { - return ( - <> -
-
{children}
-
- - ) -} diff --git a/.history/frontend/linktree-frontend/src/app/(protected)/layout_20250507075127.tsx b/.history/frontend/linktree-frontend/src/app/(protected)/layout_20250507075127.tsx deleted file mode 100644 index 254af9a..0000000 --- a/.history/frontend/linktree-frontend/src/app/(protected)/layout_20250507075127.tsx +++ /dev/null @@ -1,176 +0,0 @@ -// src/app/layout.tsx -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; -import { ReactNode } from "react"; -import Script from "next/script"; -import Link from "next/link"; -import Image from "next/image"; - -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - -export const metadata: Metadata = { - title: "CatLink", - description: "Ваши ссылки в одном месте", -}; - -export default function RootLayout({ - children, -}: { - children: ReactNode; -}) { - return ( - - - - - - - - - - - - - - - - - {/* Header (fixed to top) */} - - - {/* Main content: добавляем дополнительный отступ сверху */} -
- {children} -
- {/* Footer (fixed to bottom) */} -
-
-
-
-
    -
  • - About -
  • -
  • -
  • - Contact -
  • -
  • -
  • - Terms of Use -
  • -
  • -
  • - Privacy Policy -
  • -
-

© CatLink 2025

-
-
-
    -
  • - - - -
  • -
  • - - - -
  • -
  • - - - -
  • -
-
-
-
-
- - {/* Scripts */} - - - - - ); -} \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/src/app/page_20250506121834.tsx b/.history/frontend/linktree-frontend/src/app/page_20250506121834.tsx deleted file mode 100644 index 72f17a0..0000000 --- a/.history/frontend/linktree-frontend/src/app/page_20250506121834.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import Link from 'next/link'; - -export default function HomePage() { - return ( - -
-
-
-
-
-

Ваши ссылки. Ваш стиль. Ваш CatLink.

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Публикация

-

Делитесь единой ссылкой catlinks.kr/ваше-имя в био, мессенджерах и письмах.

-
-
-
-
-
-

Почему CatLink?

-

повяжите свои миры одной «хвостовой» ссылкой.

-
-
-
-
-
-

Разместите всё важное на одной ссылке

-

и идите дальше, как кошка: легко и грациозно.

-
-
-
-
-
- - - - - - - ); -} \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/src/app/page_20250506121949.tsx b/.history/frontend/linktree-frontend/src/app/page_20250506121949.tsx deleted file mode 100644 index 02b96ec..0000000 --- a/.history/frontend/linktree-frontend/src/app/page_20250506121949.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import Link from 'next/link'; - -export default function HomePage() { - return ( - <> - -
-
-
-
-
-

Ваши ссылки. Ваш стиль. Ваш CatLink.

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Публикация

-

Делитесь единой ссылкой catlinks.kr/ваше-имя в био, мессенджерах и письмах.

-
-
-
-
-
-

Почему CatLink?

-

повяжите свои миры одной «хвостовой» ссылкой.

-
-
-
-
-
-

Разместите всё важное на одной ссылке

-

и идите дальше, как кошка: легко и грациозно.

-
-
-
-
-
- - - - - - - ); -} \ No newline at end of file diff --git a/.history/frontend/linktree-frontend/src/app/page_20250506121951.tsx b/.history/frontend/linktree-frontend/src/app/page_20250506121951.tsx deleted file mode 100644 index d2b3520..0000000 --- a/.history/frontend/linktree-frontend/src/app/page_20250506121951.tsx +++ /dev/null @@ -1,168 +0,0 @@ -// src/app/page.tsx -import Image from 'next/image'; -import Script from 'next/script'; - -export default function HomePage() { - return ( - <> - - -
-
-
-
-
-

Ваши ссылки. Ваш стиль. Ваш CatLink.

-
-
-
-
-
- -
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
- -
-

Публикация

-

- Делитесь единой ссылкой catlinks.kr/ваше-имя в био, - мессенджерах и письмах. -

-
-
-
-
-
- -
-

Почему CatLink?

-

- Повяжите свои миры одной «хвостовой» ссылкой. -

-
-
-
-
-
- -
-

Разместите всё важное на одной ссылке

-

- И идите дальше, как кошка: легко и грациозно. -

-
-
-
-
-
- - - - {/* Скрипты Bootstrap и jQuery */} - - - -EOF -cat > src/index.js << 'EOF' -import React from 'react'; -import ReactDOM from 'react-dom'; - -ReactDOM.render(

Linktr Clone

, document.getElementById('root')); -EOF - -cd .. - -echo "Структура проекта '${PROJECT_NAME}' создана успешно!" \ No newline at end of file diff --git a/.history/setup_20250505081632.sh b/.history/setup_20250505081632.sh deleted file mode 100644 index fe682f4..0000000 --- a/.history/setup_20250505081632.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env bash -set -e - -# Переменные -PROJECT_NAME="linktr_clone" -BACKEND_DIR="backend" -FRONTEND_DIR="frontend" -APPS=("users" "links" "customization") - -# Создание корневой папки -mkdir -p $PROJECT_NAME && cd $PROJECT_NAME - -# Инициализация Git -git init -cat > .gitignore << 'EOF' -__pycache__/ -*.pyc -.env -media/ -node_modules/ -dist/ -EOF - -# Создание README и .env.example -cat > README.md << 'EOF' -# Клон Linktr.ee на Django - -Описание и инструкции по разработке. -EOF -cp /dev/null .env.example - -# Создание Makefile -cat << 'EOF' > Makefile -up: - @docker-compose up -d --build - -down: - @docker-compose down - -migrate: - @docker-compose exec web python manage.py migrate - -test: - @docker-compose exec web pytest --maxfail=1 --disable-warnings -q -EOF - -# Создание docker-compose.yml и настройка -cat > docker-compose.yml << 'EOF' -version: '3.8' -services: - web: - build: ./backend - command: gunicorn config.wsgi:application --bind 0.0.0.0:8000 - volumes: - - ./backend:/app - - media_volume:/app/media - env_file: - - .env.example - ports: - - "8000:8000" - depends_on: - - db - db: - image: postgres:14 - volumes: - - postgres_data:/var/lib/postgresql/data/ - env_file: - - .env.example -volumes: - postgres_data: - media_volume: -EOF - -# Backend: Django-проект -mkdir -p $BACKEND_DIR && cd $BACKEND_DIR -python3 -m .venv venv -source venv/bin/activate -pip install Django psycopg2-binary djangorestframework pillow django-tailwind whitenoise gunicorn - -django-admin startproject config . - -# Создание приложений -for app in "${APPS[@]}"; do - python manage.py startapp $app -done - -# Создание requirements.txt -pip freeze > requirements.txt - -deactivate -cd .. - -# Frontend: инициализация NPM-проекта -mkdir -p $FRONTEND_DIR && cd $FRONTEND_DIR -npm init -y -npm install axios react react-dom -mkdir public src src/components src/pages src/services src/styles -cat > public/index.html << 'EOF' - - - - - - Linktr Clone - - -
- - - -EOF -cat > src/index.js << 'EOF' -import React from 'react'; -import ReactDOM from 'react-dom'; - -ReactDOM.render(

Linktr Clone

, document.getElementById('root')); -EOF - -cd .. - -echo "Структура проекта '${PROJECT_NAME}' создана успешно!" \ No newline at end of file diff --git a/.history/setup_20250505081639.sh b/.history/setup_20250505081639.sh deleted file mode 100644 index dcb519a..0000000 --- a/.history/setup_20250505081639.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env bash -set -e - -# Переменные -PROJECT_NAME="linktr_clone" -BACKEND_DIR="backend" -FRONTEND_DIR="frontend" -APPS=("users" "links" "customization") - -# Создание корневой папки -mkdir -p $PROJECT_NAME && cd $PROJECT_NAME - -# Инициализация Git -git init -cat > .gitignore << 'EOF' -__pycache__/ -*.pyc -.env -media/ -node_modules/ -dist/ -EOF - -# Создание README и .env.example -cat > README.md << 'EOF' -# Клон Linktr.ee на Django - -Описание и инструкции по разработке. -EOF -cp /dev/null .env.example - -# Создание Makefile -cat << 'EOF' > Makefile -up: - @docker-compose up -d --build - -down: - @docker-compose down - -migrate: - @docker-compose exec web python manage.py migrate - -test: - @docker-compose exec web pytest --maxfail=1 --disable-warnings -q -EOF - -# Создание docker-compose.yml и настройка -cat > docker-compose.yml << 'EOF' -version: '3.8' -services: - web: - build: ./backend - command: gunicorn config.wsgi:application --bind 0.0.0.0:8000 - volumes: - - ./backend:/app - - media_volume:/app/media - env_file: - - .env.example - ports: - - "8000:8000" - depends_on: - - db - db: - image: postgres:14 - volumes: - - postgres_data:/var/lib/postgresql/data/ - env_file: - - .env.example -volumes: - postgres_data: - media_volume: -EOF - -# Backend: Django-проект -mkdir -p $BACKEND_DIR && cd $BACKEND_DIR -python -m .venv venv -source venv/bin/activate -pip install Django psycopg2-binary djangorestframework pillow django-tailwind whitenoise gunicorn - -django-admin startproject config . - -# Создание приложений -for app in "${APPS[@]}"; do - python manage.py startapp $app -done - -# Создание requirements.txt -pip freeze > requirements.txt - -deactivate -cd .. - -# Frontend: инициализация NPM-проекта -mkdir -p $FRONTEND_DIR && cd $FRONTEND_DIR -npm init -y -npm install axios react react-dom -mkdir public src src/components src/pages src/services src/styles -cat > public/index.html << 'EOF' - - - - - - Linktr Clone - - -
- - - -EOF -cat > src/index.js << 'EOF' -import React from 'react'; -import ReactDOM from 'react-dom'; - -ReactDOM.render(

Linktr Clone

, document.getElementById('root')); -EOF - -cd .. - -echo "Структура проекта '${PROJECT_NAME}' создана успешно!" \ No newline at end of file diff --git a/.history/setup_20250505081728.sh b/.history/setup_20250505081728.sh deleted file mode 100644 index ad9a85c..0000000 --- a/.history/setup_20250505081728.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env bash -set -e - -# Переменные -PROJECT_NAME="linktr_clone" -BACKEND_DIR="backend" -FRONTEND_DIR="frontend" -APPS=("users" "links" "customization") - -# Создание корневой папки -mkdir -p $PROJECT_NAME && cd $PROJECT_NAME - -# Инициализация Git -git init -cat > .gitignore << 'EOF' -__pycache__/ -*.pyc -.env -media/ -node_modules/ -dist/ -EOF - -# Создание README и .env.example -cat > README.md << 'EOF' -# Клон Linktr.ee на Django - -Описание и инструкции по разработке. -EOF -cp /dev/null .env.example - -# Создание Makefile -cat << 'EOF' > Makefile -up: - @docker-compose up -d --build - -down: - @docker-compose down - -migrate: - @docker-compose exec web python manage.py migrate - -test: - @docker-compose exec web pytest --maxfail=1 --disable-warnings -q -EOF - -# Создание docker-compose.yml и настройка -cat > docker-compose.yml << 'EOF' -version: '3.8' -services: - web: - build: ./backend - command: gunicorn config.wsgi:application --bind 0.0.0.0:8000 - volumes: - - ./backend:/app - - media_volume:/app/media - env_file: - - .env.example - ports: - - "8000:8000" - depends_on: - - db - db: - image: postgres:14 - volumes: - - postgres_data:/var/lib/postgresql/data/ - env_file: - - .env.example -volumes: - postgres_data: - media_volume: -EOF - -# Backend: Django-проект -mkdir -p $BACKEND_DIR && cd $BACKEND_DIR -python -m .venv venv -source .venv/bin/activate -pip install Django psycopg2-binary djangorestframework pillow django-tailwind whitenoise gunicorn - -django-admin startproject config . - -# Создание приложений -for app in "${APPS[@]}"; do - python manage.py startapp $app -done - -# Создание requirements.txt -pip freeze > requirements.txt - -deactivate -cd .. - -# Frontend: инициализация NPM-проекта -mkdir -p $FRONTEND_DIR && cd $FRONTEND_DIR -npm init -y -npm install axios react react-dom -mkdir public src src/components src/pages src/services src/styles -cat > public/index.html << 'EOF' - - - - - - Linktr Clone - - -
- - - -EOF -cat > src/index.js << 'EOF' -import React from 'react'; -import ReactDOM from 'react-dom'; - -ReactDOM.render(

Linktr Clone

, document.getElementById('root')); -EOF - -cd .. - -echo "Структура проекта '${PROJECT_NAME}' создана успешно!" \ No newline at end of file diff --git a/.history/setup_20250505082317.sh b/.history/setup_20250505082317.sh deleted file mode 100644 index 0307ff9..0000000 --- a/.history/setup_20250505082317.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env bash -set -e - -# Запустите этот скрипт из корня вашего репозитория (~/links) - -# Переменные -BACKEND_DIR="backend" -FRONTEND_DIR="frontend" -APPS=("users" "links" "customization") - -# 1. Создаем .gitignore и README -cat > .gitignore << 'EOF' -__pycache__/ -*.pyc -.env -media/ -node_modules/ -dist/ -.venv/ -EOF - -if [ ! -f README.md ]; then -echo "# Клон Linktr.ee на Django" > README.md -fi - -echo "Настраиваем backend-проект" -# 2. Создаем backend-проект -mkdir -p $BACKEND_DIR && cd $BACKEND_DIR - -# Виртуальное окружение -python3 -m venv .venv -source .venv/bin/activate - -# Устанавливаем зависимости -pip install Django psycopg2-binary djangorestframework pillow django-tailwind whitenoise gunicorn - -# Инициализируем Django-проект (если не создан) -if [ ! -f config/manage.py ]; then -django-admin startproject config . -fi - -# Создаем приложения, если их нет -for app in "${APPS[@]}"; do - if [ ! -d "$app" ]; then - python manage.py startapp $app - fi -done - -# Генерируем requirements.txt -pip freeze > requirements.txt - -deactivate -cd .. - -# 3. Dockerfile для backend -cat > $BACKEND_DIR/Dockerfile << 'EOF' -FROM python:3.10-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"] -EOF - -echo "Создаем docker-compose.yml" -# 4. docker-compose.yml в корне -cat > docker-compose.yml << 'EOF' -version: '3.8' -services: - web: - build: ./backend - volumes: - - ./backend:/app - - media_volume:/app/media - env_file: - - .env - ports: - - "8000:8000" - depends_on: - - db - db: - image: postgres:14 - volumes: - - postgres_data:/var/lib/postgresql/data/ - env_file: - - .env -volumes: - postgres_data: - media_volume: -EOF - -echo "Настраиваем frontend-проект" -# 5. Frontend: инициализация -mkdir -p $FRONTEND_DIR && cd $FRONTEND_DIR - -if [ ! -f package.json ]; then - npm init -y - npm install axios react react-dom -fi -mkdir -p public src/components src/pages src/services src/styles - -# public/index.html -cat > public/index.html << 'EOF' - - - - - - Linktr Clone - - -
- - - -EOF - -# src/index.js -cat > src/index.js << 'EOF' -import React from 'react'; -import ReactDOM from 'react-dom'; - -ReactDOM.render(

Linktr Clone

, document.getElementById('root')); -EOF - -cd .. - -echo "Проект настроен успешно!" \ No newline at end of file diff --git a/.venv/bin/Activate.ps1 b/.venv/bin/Activate.ps1 deleted file mode 100644 index b49d77b..0000000 --- a/.venv/bin/Activate.ps1 +++ /dev/null @@ -1,247 +0,0 @@ -<# -.Synopsis -Activate a Python virtual environment for the current PowerShell session. - -.Description -Pushes the python executable for a virtual environment to the front of the -$Env:PATH environment variable and sets the prompt to signify that you are -in a Python virtual environment. Makes use of the command line switches as -well as the `pyvenv.cfg` file values present in the virtual environment. - -.Parameter VenvDir -Path to the directory that contains the virtual environment to activate. The -default value for this is the parent of the directory that the Activate.ps1 -script is located within. - -.Parameter Prompt -The prompt prefix to display when this virtual environment is activated. By -default, this prompt is the name of the virtual environment folder (VenvDir) -surrounded by parentheses and followed by a single space (ie. '(.venv) '). - -.Example -Activate.ps1 -Activates the Python virtual environment that contains the Activate.ps1 script. - -.Example -Activate.ps1 -Verbose -Activates the Python virtual environment that contains the Activate.ps1 script, -and shows extra information about the activation as it executes. - -.Example -Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv -Activates the Python virtual environment located in the specified location. - -.Example -Activate.ps1 -Prompt "MyPython" -Activates the Python virtual environment that contains the Activate.ps1 script, -and prefixes the current prompt with the specified string (surrounded in -parentheses) while the virtual environment is active. - -.Notes -On Windows, it may be required to enable this Activate.ps1 script by setting the -execution policy for the user. You can do this by issuing the following PowerShell -command: - -PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - -For more information on Execution Policies: -https://go.microsoft.com/fwlink/?LinkID=135170 - -#> -Param( - [Parameter(Mandatory = $false)] - [String] - $VenvDir, - [Parameter(Mandatory = $false)] - [String] - $Prompt -) - -<# Function declarations --------------------------------------------------- #> - -<# -.Synopsis -Remove all shell session elements added by the Activate script, including the -addition of the virtual environment's Python executable from the beginning of -the PATH variable. - -.Parameter NonDestructive -If present, do not remove this function from the global namespace for the -session. - -#> -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - - # The prior prompt: - if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { - Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt - Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT - } - - # The prior PYTHONHOME: - if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { - Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME - Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME - } - - # The prior PATH: - if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { - Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH - Remove-Item -Path Env:_OLD_VIRTUAL_PATH - } - - # Just remove the VIRTUAL_ENV altogether: - if (Test-Path -Path Env:VIRTUAL_ENV) { - Remove-Item -Path env:VIRTUAL_ENV - } - - # Just remove VIRTUAL_ENV_PROMPT altogether. - if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { - Remove-Item -Path env:VIRTUAL_ENV_PROMPT - } - - # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: - if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { - Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force - } - - # Leave deactivate function in the global namespace if requested: - if (-not $NonDestructive) { - Remove-Item -Path function:deactivate - } -} - -<# -.Description -Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the -given folder, and returns them in a map. - -For each line in the pyvenv.cfg file, if that line can be parsed into exactly -two strings separated by `=` (with any amount of whitespace surrounding the =) -then it is considered a `key = value` line. The left hand string is the key, -the right hand is the value. - -If the value starts with a `'` or a `"` then the first and last character is -stripped from the value before being captured. - -.Parameter ConfigDir -Path to the directory that contains the `pyvenv.cfg` file. -#> -function Get-PyVenvConfig( - [String] - $ConfigDir -) { - Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" - - # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). - $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue - - # An empty map will be returned if no config file is found. - $pyvenvConfig = @{ } - - if ($pyvenvConfigPath) { - - Write-Verbose "File exists, parse `key = value` lines" - $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath - - $pyvenvConfigContent | ForEach-Object { - $keyval = $PSItem -split "\s*=\s*", 2 - if ($keyval[0] -and $keyval[1]) { - $val = $keyval[1] - - # Remove extraneous quotations around a string value. - if ("'""".Contains($val.Substring(0, 1))) { - $val = $val.Substring(1, $val.Length - 2) - } - - $pyvenvConfig[$keyval[0]] = $val - Write-Verbose "Adding Key: '$($keyval[0])'='$val'" - } - } - } - return $pyvenvConfig -} - - -<# Begin Activate script --------------------------------------------------- #> - -# Determine the containing directory of this script -$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition -$VenvExecDir = Get-Item -Path $VenvExecPath - -Write-Verbose "Activation script is located in path: '$VenvExecPath'" -Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" -Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" - -# Set values required in priority: CmdLine, ConfigFile, Default -# First, get the location of the virtual environment, it might not be -# VenvExecDir if specified on the command line. -if ($VenvDir) { - Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" -} -else { - Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." - $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - Write-Verbose "VenvDir=$VenvDir" -} - -# Next, read the `pyvenv.cfg` file to determine any required value such -# as `prompt`. -$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir - -# Next, set the prompt from the command line, or the config file, or -# just use the name of the virtual environment folder. -if ($Prompt) { - Write-Verbose "Prompt specified as argument, using '$Prompt'" -} -else { - Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" - if ($pyvenvCfg -and $pyvenvCfg['prompt']) { - Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" - $Prompt = $pyvenvCfg['prompt']; - } - else { - Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" - Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" - $Prompt = Split-Path -Path $venvDir -Leaf - } -} - -Write-Verbose "Prompt = '$Prompt'" -Write-Verbose "VenvDir='$VenvDir'" - -# Deactivate any currently active virtual environment, but leave the -# deactivate function in place. -deactivate -nondestructive - -# Now set the environment variable VIRTUAL_ENV, used by many tools to determine -# that there is an activated venv. -$env:VIRTUAL_ENV = $VenvDir - -if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { - - Write-Verbose "Setting prompt to '$Prompt'" - - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT { "" } - Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT - New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt - - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " - _OLD_VIRTUAL_PROMPT - } - $env:VIRTUAL_ENV_PROMPT = $Prompt -} - -# Clear PYTHONHOME -if (Test-Path -Path Env:PYTHONHOME) { - Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME - Remove-Item -Path Env:PYTHONHOME -} - -# Add the venv to the PATH -Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH -$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/.venv/bin/activate b/.venv/bin/activate deleted file mode 100644 index 9ce3cbb..0000000 --- a/.venv/bin/activate +++ /dev/null @@ -1,70 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# You cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # Call hash to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - hash -r 2> /dev/null - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - unset VIRTUAL_ENV_PROMPT - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -# on Windows, a path can contain colons and backslashes and has to be converted: -if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then - # transform D:\path\to\venv to /d/path/to/venv on MSYS - # and to /cygdrive/d/path/to/venv on Cygwin - export VIRTUAL_ENV=$(cygpath /home/data/links/.venv) -else - # use the path as-is - export VIRTUAL_ENV=/home/data/links/.venv -fi - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/"bin":$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - PS1='(.venv) '"${PS1:-}" - export PS1 - VIRTUAL_ENV_PROMPT='(.venv) ' - export VIRTUAL_ENV_PROMPT -fi - -# Call hash to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -hash -r 2> /dev/null diff --git a/.venv/bin/activate.csh b/.venv/bin/activate.csh deleted file mode 100644 index 876268c..0000000 --- a/.venv/bin/activate.csh +++ /dev/null @@ -1,27 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. - -# Created by Davide Di Blasi . -# Ported to Python 3.3 venv by Andrew Svetlov - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV /home/data/links/.venv - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/"bin":$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - set prompt = '(.venv) '"$prompt" - setenv VIRTUAL_ENV_PROMPT '(.venv) ' -endif - -alias pydoc python -m pydoc - -rehash diff --git a/.venv/bin/activate.fish b/.venv/bin/activate.fish deleted file mode 100644 index db9d232..0000000 --- a/.venv/bin/activate.fish +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source /bin/activate.fish" *from fish* -# (https://fishshell.com/). You cannot run it directly. - -function deactivate -d "Exit virtual environment and return to normal shell environment" - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH - set -e _OLD_VIRTUAL_PATH - end - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - set -e _OLD_FISH_PROMPT_OVERRIDE - # prevents error when using nested fish instances (Issue #93858) - if functions -q _old_fish_prompt - functions -e fish_prompt - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - end - - set -e VIRTUAL_ENV - set -e VIRTUAL_ENV_PROMPT - if test "$argv[1]" != "nondestructive" - # Self-destruct! - functions -e deactivate - end -end - -# Unset irrelevant variables. -deactivate nondestructive - -set -gx VIRTUAL_ENV /home/data/links/.venv - -set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/"bin $PATH - -# Unset PYTHONHOME if set. -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # fish uses a function instead of an env var to generate the prompt. - - # Save the current fish_prompt function as the function _old_fish_prompt. - functions -c fish_prompt _old_fish_prompt - - # With the original prompt function renamed, we can override with our own. - function fish_prompt - # Save the return status of the last command. - set -l old_status $status - - # Output the venv prompt; color taken from the blue of the Python logo. - printf "%s%s%s" (set_color 4B8BBE) '(.venv) ' (set_color normal) - - # Restore the return status of the previous command. - echo "exit $old_status" | . - # Output the original/"old" prompt. - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" - set -gx VIRTUAL_ENV_PROMPT '(.venv) ' -end diff --git a/.venv/bin/django-admin b/.venv/bin/django-admin deleted file mode 100755 index 317391f..0000000 --- a/.venv/bin/django-admin +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/data/links/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from django.core.management import execute_from_command_line -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(execute_from_command_line()) diff --git a/.venv/bin/dotenv b/.venv/bin/dotenv deleted file mode 100755 index 29757b9..0000000 --- a/.venv/bin/dotenv +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/trevor/links/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from dotenv.__main__ import cli -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(cli()) diff --git a/.venv/bin/gunicorn b/.venv/bin/gunicorn deleted file mode 100755 index 485d390..0000000 --- a/.venv/bin/gunicorn +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/data/links/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from gunicorn.app.wsgiapp import run -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(run()) diff --git a/.venv/bin/jsonschema b/.venv/bin/jsonschema deleted file mode 100755 index 02ce3c7..0000000 --- a/.venv/bin/jsonschema +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/trevor/links/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from jsonschema.cli import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/pip b/.venv/bin/pip deleted file mode 100755 index da9620c..0000000 --- a/.venv/bin/pip +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/data/links/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/pip3 b/.venv/bin/pip3 deleted file mode 100755 index da9620c..0000000 --- a/.venv/bin/pip3 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/data/links/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/pip3.10 b/.venv/bin/pip3.10 deleted file mode 100755 index 6160511..0000000 --- a/.venv/bin/pip3.10 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/trevor/links/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/python b/.venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/.venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/.venv/bin/python3 b/.venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/.venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/.venv/bin/python3.10 b/.venv/bin/python3.10 deleted file mode 120000 index b8a0adb..0000000 --- a/.venv/bin/python3.10 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/.venv/bin/sqlformat b/.venv/bin/sqlformat deleted file mode 100755 index 0e3fb5c..0000000 --- a/.venv/bin/sqlformat +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/data/links/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from sqlparse.__main__ import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/AUTHORS b/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/AUTHORS deleted file mode 100644 index 6fd3651..0000000 --- a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/AUTHORS +++ /dev/null @@ -1,1121 +0,0 @@ -Django was originally created in late 2003 at World Online, the web division -of the Lawrence Journal-World newspaper in Lawrence, Kansas. - -Here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS -- -people who have submitted patches, reported bugs, added translations, helped -answer newbie questions, and generally made Django that much better: - - Aaron Cannon - Aaron Linville - Aaron Swartz - Aaron T. Myers - Abeer Upadhyay - Abhijeet Viswa - Abhinav Patil - Abhinav Yadav - Abhishek Gautam - Abhyudai - Adam Allred - Adam Bogdał - Adam Donaghy - Adam Johnson - Adam Malinowski - Adam Vandenberg - Adam Zapletal - Ade Lee - Adiyat Mubarak - Adnan Umer - Arslan Noor - Adrian Holovaty - Adrian Torres - Adrien Lemaire - Afonso Fernández Nogueira - AgarFu - Ahmad Alhashemi - Ahmad Al-Ibrahim - Ahmed Eltawela - ajs - Akash Agrawal - Akash Kumar Sen - Akis Kesoglou - Aksel Ethem - Akshesh Doshi - alang@bright-green.com - Alasdair Nicol - Albert Defler - Albert Wang - Alcides Fonseca - Aldian Fazrihady - Alejandro García Ruiz de Oteiza - Aleksander Milinkevich - Aleksandra Sendecka - Aleksi Häkli - Alex Dutton - Alexander Lazarević - Alexander Myodov - Alexandr Tatarinov - Alex Aktsipetrov - Alex Becker - Alex Couper - Alex Dedul - Alex Gaynor - Alex Hill - Alex Ogier - Alex Robbins - Alexey Boriskin - Alexey Tsivunin - Ali Vakilzade - Aljaž Košir - Aljosa Mohorovic - Alokik Vijay - Amir Karimi - Amit Chakradeo - Amit Ramon - Amit Upadhyay - A. Murat Eren - Ana Belen Sarabia - Ana Krivokapic - Andi Albrecht - André Ericson - Andrei Kulakov - Andreas - Andreas Mock - Andreas Pelme - Andrés Torres Marroquín - Andreu Vallbona Plazas - Andrew Brehaut - Andrew Clark - Andrew Durdin - Andrew Godwin - Andrew Miller - Andrew Pinkham - Andrews Medina - Andrew Northall - Andriy Sokolovskiy - Andy Chosak - Andy Dustman - Andy Gayton - andy@jadedplanet.net - Anssi Kääriäinen - ant9000@netwise.it - Anthony Briggs - Anthony Wright - Antoine Chéneau - Anton Samarchyan - Antoni Aloy - Antonio Cavedoni - Antonis Christofides - Antti Haapala - Antti Kaihola - Anubhav Joshi - Anvesh Mishra - Anže Pečar - A. Rafey Khan - Aram Dulyan - arien - Arjun Omray - Armin Ronacher - Aron Podrigal - Arsalan Ghassemi - Artem Gnilov - Arthur - Arthur Jovart - Arthur Koziel - Arthur Moreira - Arthur Rio - Arvis Bickovskis - Arya Khaligh - Aryeh Leib Taurog - A S Alam - Asif Saif Uddin - atlithorn - Audrey Roy - av0000@mail.ru - Axel Haustant - Aymeric Augustin - Bahadır Kandemir - Baishampayan Ghose - Baptiste Mispelon - Barry Pederson - Bartolome Sanchez Salado - Barton Ip - Bartosz Grabski - Bashar Al-Abdulhadi - Bastian Kleineidam - Batiste Bieler - Batman - Batuhan Taskaya - Baurzhan Ismagulov - Ben Cardy - Ben Dean Kawamura - Ben Firshman - Ben Godfrey - Benjamin Wohlwend - Ben Khoo - Ben Lomax - Ben Slavin - Ben Sturmfels - Bendegúz Csirmaz - Berker Peksag - Bernd Schlapsi - Bernhard Essl - berto - Bhuvnesh Sharma - Bill Fenner - Bjørn Stabell - Bo Marchman - Bogdan Mateescu - Bojan Mihelac - Bouke Haarsma - Božidar Benko - Brad Melin - Brandon Chinn - Brant Harris - Brendan Hayward - Brendan Quinn - Brenton Simpson - Brett Cannon - Brett Hoerner - Brian Beck - Brian Fabian Crain - Brian Harring - Brian Helba - Brian Nettleton - Brian Ray - Brian Rosner - Bruce Kroeze - Bruno Alla - Bruno Renié - brut.alll@gmail.com - Bryan Chow - Bryan Veloso - bthomas - btoll@bestweb.net - C8E - Caio Ariede - Calvin Spealman - Cameron Curry - Cameron Knight (ckknight) - Can Burak Çilingir - Can Sarıgöl - Carl Meyer - Carles Pina i Estany - Carlos Eduardo de Paula - Carlos Matías de la Torre - Carlton Gibson - cedric@terramater.net - Chad Whitman - ChaosKCW - Charlie Leifer - charly.wilhelm@gmail.com - Chason Chaffin - Cheng Zhang - Chiemezuo Akujobi - Chinmoy Chakraborty - Chris Adams - Chris Beaven - Chris Bennett - Chris Cahoon - Chris Chamberlin - Chris Jerdonek - Chris Jones - Chris Lamb - Chris Streeter - Christian Barcenas - Christian Metts - Christian Oudard - Christian Tanzer - Christoffer Sjöbergsson - Christophe Pettus - Christopher Adams - Christopher Babiak - Christopher Lenz - Christoph Mędrela - Chris Wagner - Chris Wesseling - Chris Wilson - Ciaran McCormick - Claude Paroz - Clint Ecker - colin@owlfish.com - Colin Wood - Collin Anderson - Collin Grady - Colton Hicks - Craig Blaszczyk - crankycoder@gmail.com - Curtis Maloney (FunkyBob) - dackze+django@gmail.com - Dagur Páll Ammendrup - Dane Springmeyer - Dan Fairs - Daniel Alves Barbosa de Oliveira Vaz - Daniel Duan - Daniele Procida - Daniel Fairhead - Daniel Greenfeld - dAniel hAhler - Daniel Jilg - Daniel Lindsley - Daniel Poelzleithner - Daniel Pyrathon - Daniel Roseman - Daniel Tao - Daniel Wiesmann - Danilo Bargen - Dan Johnson - Dan Palmer - Dan Poirier - Dan Stephenson - Dan Watson - dave@thebarproject.com - David Ascher - David Avsajanishvili - David Blewett - David Brenneman - David Cramer - David Danier - David Eklund - David Foster - David Gouldin - david@kazserve.org - David Krauth - David Larlet - David Reynolds - David Sanders - David Schein - David Tulig - David Winiecki - David Winterbottom - David Wobrock - Davide Ceretti - Deep L. Sukhwani - Deepak Thukral - Denis Kuzmichyov - Dennis Schwertel - Derek Willis - Deric Crago - deric@monowerks.com - Deryck Hodge - Dimitris Glezos - Dirk Datzert - Dirk Eschler - Dmitri Fedortchenko - Dmitry Jemerov - dne@mayonnaise.net - Dolan Antenucci - Donald Harvey - Donald Stufft - Don Spaulding - Doug Beck - Doug Napoleone - dready - Durval Carvalho de Souza - dusk@woofle.net - Dustyn Gibson - Ed Morley - Egidijus Macijauskas - eibaan@gmail.com - elky - Emmanuelle Delescolle - Emil Stenström - enlight - Enrico - Eric Boersma - Eric Brandwein - Eric Floehr - Eric Florenzano - Eric Holscher - Eric Moritz - Eric Palakovich Carr - Erik Karulf - Erik Romijn - eriks@win.tue.nl - Erin Kelly - Erwin Junge - Esdras Beleza - Espen Grindhaug - Étienne Beaulé - Eugene Lazutkin - Evan Grim - Fabian Büchler - Fabian Braun - Fabrice Aneche - Faishal Manzar - Farhaan Bukhsh - favo@exoweb.net - fdr - Federico Capoano - Felipe Lee - Filip Noetzel - Filip Wasilewski - Finn Gruwier Larsen - Fiza Ashraf - Flávio Juvenal da Silva Junior - flavio.curella@gmail.com - Florian Apolloner - Florian Demmer - Florian Moussous - fnaimi66 - Fran Hrženjak - Francesco Panico - Francisco Albarran Cristobal - Francisco Couzo - François Freitag - Frank Tegtmeyer - Frank Wierzbicki - Frank Wiles - František Malina - Fraser Nevett - Gabriel Grant - Gabriel Hurley - Gaël Utard - gandalf@owca.info - Garry Lawrence - Garry Polley - Garth Kidd - Gary Wilson - Gasper Koren - Gasper Zejn - Gav O'Connor - Gavin Wahl - Ge Hanbin - geber@datacollect.com - Geert Vanderkelen - George Karpenkov - George Song - George Vilches - George Y. Kussumoto - Georg "Hugo" Bauer - Georgi Stanojevski - Gerardo Orozco - Gil Gonçalves - Girish Kumar - Girish Sontakke - Gisle Aas - Glenn Maynard - glin@seznam.cz - GomoX - Gonzalo Saavedra - Gopal Narayanan - Graham Carlyle - Grant Jenks - Greg Chapple - Greg Twohig - Gregor Allensworth - Gregor Müllegger - Grigory Fateyev - Grzegorz Ślusarek - Guilherme Mesquita Gondim - Guillaume Pannatier - Gustavo Picon - hambaloney - Hang Park - Hannes Ljungberg - Hannes Struß - Hao Dong - Harm Geerts - Hasan Ramezani - Hawkeye - Helen Sherwood-Taylor - Henrique Romano - Henry Dang - Hidde Bultsma - Himanshu Chauhan - hipertracker@gmail.com - Hiroki Kiyohara - Hisham Mahmood - Honza Král - Horst Gutmann - Hugo Osvaldo Barrera - HyukJin Jang - Hyun Mi Ae - Iacopo Spalletti - Ian A Wilson - Ian Clelland - Ian Holsman - Ian Lee - Ibon - Idan Gazit - Idan Melamed - Ifedapo Olarewaju - Igor Kolar - Illia Volochii - Ilya Bass - Ilya Semenov - Ingo Klöcker - I.S. van Oostveen - Iuri de Silvio - ivan.chelubeev@gmail.com - Ivan Sagalaev (Maniac) - Jaap Roes - Jack Moffitt - Jacob Burch - Jacob Green - Jacob Kaplan-Moss - Jacob Rief - Jacob Walls - Jakub Bagiński - Jakub Paczkowski - Jakub Wilk - Jakub Wiśniowski - james_027@yahoo.com - James Aylett - James Bennett - James Gillard - James Murty - James Tauber - James Timmins - James Turk - James Wheare - Jamie Matthews - Jannis Leidel - Janos Guljas - Jan Pazdziora - Jan Rademaker - Jarek Głowacki - Jarek Zgoda - Jarosław Wygoda - Jason Davies (Esaj) - Jason Huggins - Jason McBrayer - jason.sidabras@gmail.com - Jason Yan - Javier Mansilla - Jay Parlar - Jay Welborn - Jay Wineinger - J. Clifford Dyer - jcrasta@gmail.com - jdetaeye - Jeff Anderson - Jeff Balogh - Jeff Hui - Jeffrey Gelens - Jeff Triplett - Jeffrey Yancey - Jens Diemer - Jens Page - Jensen Cochran - Jeong-Min Lee - Jérémie Blaser - Jeremy Bowman - Jeremy Carbaugh - Jeremy Dunck - Jeremy Lainé - Jeremy Thompson - Jerin Peter George - Jesse Young - Jezeniel Zapanta - jhenry - Jim Dalton - Jimmy Song - Jiri Barton - Joachim Jablon - Joao Oliveira - Joao Pedro Silva - Joe Heck - Joe Jackson - Joel Bohman - Joel Heenan - Joel Watts - Joe Topjian - Johan C. Stöver - Johann Queuniet - Johannes Westphal - john@calixto.net - John D'Agostino - John D'Ambrosio - John Huddleston - John Moses - John Paulett - John Shaffer - Jökull Sólberg Auðunsson - Jon Dufresne - Jon Janzen - Jonas Haag - Jonas Lundberg - Jonathan Davis - Jonatas C. D. - Jonathan Buchanan - Jonathan Daugherty (cygnus) - Jonathan Feignberg - Jonathan Slenders - Jonny Park - Jordan Bae - Jordan Dimov - Jordi J. Tablada - Jorge Bastida - Jorge Gajon - José Tomás Tocino García - Josef Rousek - Joseph Kocherhans - Josh Smeaton - Joshua Cannon - Joshua Ginsberg - Jozko Skrablin - J. Pablo Fernandez - jpellerin@gmail.com - Juan Catalano - Juan Manuel Caicedo - Juan Pedro Fisanotti - Julia Elman - Julia Matsieva - Julian Bez - Julie Rymer - Julien Phalip - Junyoung Choi - junzhang.jn@gmail.com - Jure Cuhalev - Justin Bronn - Justine Tunney - Justin Lilly - Justin Michalicek - Justin Myles Holmes - Jyrki Pulliainen - Kacper Wolkiewicz - Kadesarin Sanjek - Kapil Bansal - Karderio - Karen Tracey - Karol Sikora - Kasun Herath - Katherine “Kati” Michel - Kathryn Killebrew - Katie Miller - Keith Bussell - Kenneth Love - Kent Hauser - Keryn Knight - Kevin Grinberg - Kevin Kubasik - Kevin McConnell - Kieran Holland - kilian - Kim Joon Hwan 김준환 - Kim Soung Ryoul 김성렬 - Klaas van Schelven - knox - konrad@gwu.edu - Kowito Charoenratchatabhan - Krišjānis Vaiders - krzysiek.pawlik@silvermedia.pl - Krzysztof Jagiello - Krzysztof Jurewicz - Krzysztof Kulewski - kurtiss@meetro.com - Lakin Wecker - Lars Yencken - Lau Bech Lauritzen - Laurent Luce - Laurent Rahuel - lcordier@point45.com - Leah Culver - Leandra Finger - Lee Reilly - Lee Sanghyuck - Lemuel Sta Ana - Leo "hylje" Honkanen - Leo Shklovskii - Leo Soto - lerouxb@gmail.com - Lex Berezhny - Liang Feng - Lily Foote - limodou - Lincoln Smith - Liu Yijie <007gzs@gmail.com> - Loek van Gent - Loïc Bistuer - Lowe Thiderman - Luan Pablo - Lucas Connors - Lucas Esposito - Luciano Ramalho - Lucidiot - Ludvig Ericson - Luis C. Berrocal - Łukasz Langa - Łukasz Rekucki - Luke Granger-Brown - Luke Plant - Maciej Fijalkowski - Maciej Wiśniowski - Mads Jensen - Makoto Tsuyuki - Malcolm Tredinnick - Manav Agarwal - Manuel Saelices - Manuzhai - Marc Aymerich Gubern - Marc Egli - Marcel Telka - Marcelo Galigniana - Marc Fargas - Marc Garcia - Marcin Wróbel - Marc Remolt - Marc Seguí Coll - Marc Tamlyn - Marc-Aurèle Brothier - Marian Andre - Marijke Luttekes - Marijn Vriens - Mario Gonzalez - Mariusz Felisiak - Mark Biggers - Mark Evans - Mark Gensler - mark@junklight.com - Mark Lavin - Mark Sandstrom - Markus Amalthea Magnuson - Markus Holtermann - Marten Kenbeek - Marti Raudsepp - martin.glueck@gmail.com - Martin Green - Martin Kosír - Martin Mahner - Martin Maney - Martin von Gagern - Mart Sõmermaa - Marty Alchin - Masashi Shibata - masonsimon+django@gmail.com - Massimiliano Ravelli - Massimo Scamarcia - Mathieu Agopian - Matías Bordese - Matt Boersma - Matt Brewer - Matt Croydon - Matt Deacalion Stevens - Matt Dennenbaum - Matthew Flanagan - Matthew Schinckel - Matthew Somerville - Matthew Tretter - Matthew Wilkes - Matthias Kestenholz - Matthias Pronk - Matt Hoskins - Matt McClanahan - Matt Riggott - Matt Robenolt - Mattia Larentis - Mattia Procopio - Mattias Loverot - mattycakes@gmail.com - Max Burstein - Max Derkachev - Max Smolens - Maxime Lorant - Maxime Toussaint - Maxime Turcotte - Maximilian Merz - Maximillian Dornseif - mccutchen@gmail.com - Meghana Bhange - Meir Kriheli - Michael S. Brown - Michael Hall - Michael Josephson - Michael Lissner - Michael Manfre - michael.mcewan@gmail.com - Michael Placentra II - Michael Radziej - Michael Sanders - Michael Schwarz - Michael Sinov - Michael Thornhill - Michal Chruszcz - michal@plovarna.cz - Michał Modzelewski - Mihai Damian - Mihai Preda - Mikaël Barbero - Mike Axiak - Mike Edmunds - Mike Grouchy - Mike Malone - Mike Richardson - Mike Wiacek - Mikhail Korobov - Mikko Hellsing - Mikołaj Siedlarek - milkomeda - Milton Waddams - mitakummaa@gmail.com - mmarshall - Moayad Mardini - Morgan Aubert - Moritz Sichert - Morten Bagai - msaelices - msundstr - Mushtaq Ali - Mykola Zamkovoi - Nadège Michel - Nagy Károly - Nasimul Haque - Nasir Hussain - Natalia Bidart - Nate Bragg - Nathan Gaberel - Neal Norwitz - Nebojša Dorđević - Ned Batchelder - Nena Kojadin - Niall Dalton - Niall Kelly - Nick Efford - Nick Lane - Nick Pope - Nick Presta - Nick Sandford - Nick Sarbicki - Niclas Olofsson - Nicola Larosa - Nicolas Lara - Nicolas Noé - Nikita Marchant - Nikita Sobolev - Nina Menezes - Niran Babalola - Nis Jørgensen - Nowell Strite - Nuno Mariz - Octavio Peri - oggie rob - oggy - Oguzhan Akan - Oliver Beattie - Oliver Rutherfurd - Olivier Le Thanh Duong - Olivier Sels - Olivier Tabone - Orestis Markou - Orne Brocaar - Oscar Ramirez - Ossama M. Khayat - Owen Griffiths - Ömer Faruk Abacı - Pablo Martín - Panos Laganakos - Paolo Melchiorre - Pascal Hartig - Pascal Varet - Patrik Sletmo - Paul Bissex - Paul Collier - Paul Collins - Paul Donohue - Paul Lanier - Paul McLanahan - Paul McMillan - Paulo Poiati - Paulo Scardine - Paul Smith - Pavel Kulikov - pavithran s - Pavlo Kapyshin - permonik@mesias.brnonet.cz - Petar Marić - Pete Crosier - peter@mymart.com - Peter DeVita - Peter Sheats - Peter van Kampen - Peter Zsoldos - Pete Shinners - Petr Marhoun - Petter Strandmark - pgross@thoughtworks.com - phaedo - phil.h.smith@gmail.com - Philip Lindborg - Philippe Raoult - phil@produxion.net - Piotr Jakimiak - Piotr Lewandowski - plisk - polpak@yahoo.com - pradeep.gowda@gmail.com - Prashant Pandey - Preston Holmes - Preston Timmons - Priyank Panchal - Priyansh Saxena - Przemysław Buczkowski - Przemysław Suliga - Qi Zhao - Rachel Tobin - Rachel Willmer - Radek Švarz - Rafael Giebisch - Raffaele Salmaso - Rahmat Faisal - Rajesh Dhawan - Ramez Ashraf - Ramil Yanbulatov - Ramin Farajpour Cami - Ramiro Morales - Ramon Saraiva - Ram Rachum - Randy Barlow - Raphaël Barrois - Raphael Michel - Raúl Cumplido - Rebecca Smith - Remco Wendt - Renaud Parent - Renbi Yu - Reza Mohammadi - rhettg@gmail.com - Ricardo Javier Cárdenes Medina - ricardojbarrios@gmail.com - Riccardo Di Virgilio - Riccardo Magliocchetti - Richard Davies - Richard House - Rick Wagner - Rigel Di Scala - Robert Coup - Robert Myers - Roberto Aguilar - Robert Rock Howard - Robert Wittams - Rob Golding-Day - Rob Hudson - Rob Nguyen - Robin Munn - Rodrigo Pinheiro Marques de Araújo - Rohith P R - Romain Garrigues - Ronnie van den Crommenacker - Ronny Haryanto - Ross Poulton - Roxane Bellot - Rozza - Rudolph Froger - Rudy Mutter - Rune Rønde Laursen - Russell Cloran - Russell Keith-Magee - Russ Webber - Ryan Hall - Ryan Heard - ryankanno - Ryan Kelly - Ryan Niemeyer - Ryan Petrello - Ryan Rubin - Ryno Mathee - Sachin Jat - Sage M. Abdullah - Sam Newman - Samruddhi Dharankar - Sander Dijkhuis - Sanket Saurav - Sanyam Khurana - Sarah Abderemane - Sarah Boyce - Sarthak Mehrish - schwank@gmail.com - Scot Hacker - Scott Barr - Scott Cranfill - Scott Fitsimones - Scott Pashley - scott@staplefish.com - Sean Brant - Sebastian Hillig - Sebastian Spiegel - Segyo Myung - Selwin Ong - Sengtha Chay - Senko Rašić - serbaut@gmail.com - Sergei Maertens - Sergey Fedoseev - Sergey Kolosov - Seth Hill - Shafiya Adzhani - Shai Berger - Shannon -jj Behrens - Shawn Milochik - Shreya Bamne - Silvan Spross - Simeon Visser - Simon Blanchard - Simon Charette - Simon Greenhill - Simon Litchfield - Simon Meers - Simon Williams - Simon Willison - Sjoerd Job Postmus - Slawek Mikula - sloonz - smurf@smurf.noris.de - sopel - Sreehari K V - Sridhar Marella - Srinivas Reddy Thatiparthy - Stanislas Guerra - Stanislaus Madueke - Stanislav Karpov - starrynight - Stefan R. Filipek - Stefane Fermgier - Stefano Rivera - Stéphane Raimbault - Stephan Jaekel - Stephen Burrows - Steven L. Smith (fvox13) - Steven Noorbergen (Xaroth) - Stuart Langridge - Subhav Gautam - Sujay S Kumar - Sune Kirkeby - Sung-Jin Hong - SuperJared - Susan Tan - Sutrisno Efendi - Swaroop C H - Szilveszter Farkas - Taavi Teska - Tai Lee - Takashi Matsuo - Tareque Hossain - Taylor Mitchell - tell-k - Terry Huang - thebjorn - Thejaswi Puthraya - Thijs van Dien - Thom Wiggers - Thomas Chaumeny - Thomas Güttler - Thomas Kerpe - Thomas Sorrel - Thomas Steinacher - Thomas Stromberg - Thomas Tanner - tibimicu@gmx.net - Ties Jan Hefting - Tim Allen - Tim Givois - Tim Graham - Tim Heap - Tim McCurrach - Tim Saylor - Toan Vuong - Tobias Kunze - Tobias McNulty - tobias@neuyork.de - Todd O'Bryan - Tom Carrick - Tom Christie - Tom Forbes - Tom Insam - Tom Tobin - Tom Wojcik - Tomáš Ehrlich - Tomáš Kopeček - Tome Cvitan - Tomek Paczkowski - Tomer Chachamu - Tommy Beadle - Tore Lundqvist - torne-django@wolfpuppy.org.uk - Travis Cline - Travis Pinney - Travis Swicegood - Travis Terry - Trevor Caira - Trey Long - tstromberg@google.com - tt@gurgle.no - Tyler Tarabula - Tyson Clugg - Tyson Tate - Unai Zalakain - Valentina Mukhamedzhanova - valtron - Vasiliy Stavenko - Vasil Vangelovski - Vibhu Agarwal - Victor Andrée - viestards.lists@gmail.com - Viktor Danyliuk - Viktor Grabov - Ville Säävuori - Vinay Karanam - Vinay Sajip - Vincent Foley - Vinko Mlačić - Vinny Do - Vitaly Babiy - Vitaliy Yelnik - Vladimir Kuzma - Vlado - Vsevolod Solovyov - Vytis Banaitis - wam-djangobug@wamber.net - Wang Chun - Warren Smith - Waylan Limberg - Wiktor Kołodziej - Wiley Kestner - Wiliam Alves de Souza - Will Ayd - William Schwartz - Will Hardy - Will Zhao - Wilson Miner - Wim Glenn - wojtek - Wu Haotian - Xavier Francisco - Xia Kai - Yann Fouillat - Yann Malet - Yash Jhunjhunwala - Yasushi Masuda - ye7cakf02@sneakemail.com - ymasuda@ethercube.com - Yoong Kang Lim - Yury V. Zaytsev - Yusuke Miyazaki - Yves Weissig - yyyyyyyan - Zac Hatfield-Dodds - Zachary Voase - Zach Liu - Zach Thompson - Zain Memon - Zain Patel - Zak Johnson - Žan Anderle - Zbigniew Siciarz - zegor - Zeynel Özdemir - Zlatko Mašek - zriv - - -A big THANK YOU goes to: - - Rob Curley and Ralph Gage for letting us open-source Django. - - Frank Wiles for making excellent arguments for open-sourcing, and for - his sage sysadmin advice. - - Ian Bicking for convincing Adrian to ditch code generation. - - Mark Pilgrim for "Dive Into Python" (https://diveintopython3.net/). - - Guido van Rossum for creating Python. diff --git a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/LICENSE b/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/LICENSE deleted file mode 100644 index 5f4f225..0000000 --- a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Django Software Foundation and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of Django nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/LICENSE.python b/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/LICENSE.python deleted file mode 100644 index 2fc28e8..0000000 --- a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/LICENSE.python +++ /dev/null @@ -1,288 +0,0 @@ -Django is licensed under the three-clause BSD license; see the file -LICENSE for details. - -Django includes code from the Python standard library, which is licensed under -the Python license, a permissive open source license. The copyright and license -is included below for compliance with Python's terms. - ----------------------------------------------------------------------- - -Copyright (c) 2001-present Python Software Foundation; All Rights Reserved - -A. HISTORY OF THE SOFTWARE -========================== - -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. - -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. - -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations, which became -Zope Corporation. In 2001, the Python Software Foundation (PSF, see -https://www.python.org/psf/) was formed, a non-profit organization -created specifically to own Python-related Intellectual Property. -Zope Corporation was a sponsoring member of the PSF. - -All Python releases are Open Source (see https://opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. - - Release Derived Year Owner GPL- - from compatible? (1) - - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2 and above 2.1.1 2001-now PSF yes - -Footnotes: - -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. - -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. - -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. - - -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== - -Python software and documentation are licensed under the -Python Software Foundation License Version 2. - -Starting with Python 3.8.6, examples, recipes, and other code in -the documentation are dual licensed under the PSF License Version 2 -and the Zero-Clause BSD license. - -Some software incorporated into Python is under different licenses. -The licenses are listed with code falling under that license. - - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved" -are retained in Python alone or in any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- - -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). - -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. - -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- - -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the internet -using the following URL: http://hdl.handle.net/1895.22/1013". - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. - -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. - -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. - - ACCEPT - - -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- - -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION ----------------------------------------------------------------------- - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/METADATA b/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/METADATA deleted file mode 100644 index 7430017..0000000 --- a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/METADATA +++ /dev/null @@ -1,98 +0,0 @@ -Metadata-Version: 2.1 -Name: Django -Version: 5.2 -Summary: A high-level Python web framework that encourages rapid development and clean, pragmatic design. -Author-email: Django Software Foundation -License: BSD-3-Clause -Project-URL: Homepage, https://www.djangoproject.com/ -Project-URL: Documentation, https://docs.djangoproject.com/ -Project-URL: Release notes, https://docs.djangoproject.com/en/stable/releases/ -Project-URL: Funding, https://www.djangoproject.com/fundraising/ -Project-URL: Source, https://github.com/django/django -Project-URL: Tracker, https://code.djangoproject.com/ -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=3.10 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: LICENSE.python -License-File: AUTHORS -Requires-Dist: asgiref>=3.8.1 -Requires-Dist: sqlparse>=0.3.1 -Requires-Dist: tzdata; sys_platform == "win32" -Provides-Extra: argon2 -Requires-Dist: argon2-cffi>=19.1.0; extra == "argon2" -Provides-Extra: bcrypt -Requires-Dist: bcrypt; extra == "bcrypt" - -====== -Django -====== - -Django is a high-level Python web framework that encourages rapid development -and clean, pragmatic design. Thanks for checking it out. - -All documentation is in the "``docs``" directory and online at -https://docs.djangoproject.com/en/stable/. If you're just getting started, -here's how we recommend you read the docs: - -* First, read ``docs/intro/install.txt`` for instructions on installing Django. - -* Next, work through the tutorials in order (``docs/intro/tutorial01.txt``, - ``docs/intro/tutorial02.txt``, etc.). - -* If you want to set up an actual deployment server, read - ``docs/howto/deployment/index.txt`` for instructions. - -* You'll probably want to read through the topical guides (in ``docs/topics``) - next; from there you can jump to the HOWTOs (in ``docs/howto``) for specific - problems, and check out the reference (``docs/ref``) for gory details. - -* See ``docs/README`` for instructions on building an HTML version of the docs. - -Docs are updated rigorously. If you find any problems in the docs, or think -they should be clarified in any way, please take 30 seconds to fill out a -ticket here: https://code.djangoproject.com/newticket - -To get more help: - -* Join the ``#django`` channel on ``irc.libera.chat``. Lots of helpful people - hang out there. `Webchat is available `_. - -* Join the `Django Discord community `_. - -* Join the community on the `Django Forum `_. - -To contribute to Django: - -* Check out https://docs.djangoproject.com/en/dev/internals/contributing/ for - information about getting involved. - -To run Django's test suite: - -* Follow the instructions in the "Unit tests" section of - ``docs/internals/contributing/writing-code/unit-tests.txt``, published online at - https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/unit-tests/#running-the-unit-tests - -Supporting the Development of Django -==================================== - -Django's development depends on your contributions. - -If you depend on Django, remember to support the Django Software Foundation: https://www.djangoproject.com/fundraising/ diff --git a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/RECORD b/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/RECORD deleted file mode 100644 index aa0182e..0000000 --- a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/RECORD +++ /dev/null @@ -1,4554 +0,0 @@ -../../../bin/django-admin,sha256=q8kcACEW1tLNiadUxvftrWMxam4bYgoxcerXZX16ZzM,283 -Django-5.2.dist-info/AUTHORS,sha256=9JEmoLUtVFMjDOHoPh653hrl-LymoYjwuVakP93esSE,43753 -Django-5.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Django-5.2.dist-info/LICENSE,sha256=uEZBXRtRTpwd_xSiLeuQbXlLxUbKYSn5UKGM0JHipmk,1552 -Django-5.2.dist-info/LICENSE.python,sha256=dl4rHjOf740-nxKJLn4HKovjCZlqC-Q__FeWOY7E59Q,14256 -Django-5.2.dist-info/METADATA,sha256=9ayaW2JLzM9yen-xnKGa3kEX7hnQTN1BcN2NaG-OKC8,4102 -Django-5.2.dist-info/RECORD,, -Django-5.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Django-5.2.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92 -Django-5.2.dist-info/entry_points.txt,sha256=hi1U04jQDqr9xaV6Gklnqh-d69jiCZdS73E0l_671L4,82 -Django-5.2.dist-info/top_level.txt,sha256=V_goijg9tfO20ox_7os6CcnPvmBavbxu46LpJiNLwjA,7 -django/__init__.py,sha256=7XRSbq5x9T9AU7BpL-tCA5IcqaEaxsWKCRprtr78kFg,799 -django/__main__.py,sha256=XO-CRvbZFCKtIvAT6Jvbn32dWnv2pnNszRVS-1nKX0I,212 -django/__pycache__/__init__.cpython-310.pyc,, -django/__pycache__/__main__.cpython-310.pyc,, -django/__pycache__/shortcuts.cpython-310.pyc,, -django/apps/__init__.py,sha256=8WZTI_JnNuP4tyfuimH3_pKQYbDAy2haq-xkQT1UXkc,90 -django/apps/__pycache__/__init__.cpython-310.pyc,, -django/apps/__pycache__/config.cpython-310.pyc,, -django/apps/__pycache__/registry.cpython-310.pyc,, -django/apps/config.py,sha256=1Zhxt4OrwRnOmsT_B_BurImz3oi8330TJG0rRRJ58bQ,11482 -django/apps/registry.py,sha256=rdexON5JuhKAMWAZv4k2DH0fRSKdPZoi6_tTjOUgFRA,17693 -django/conf/__init__.py,sha256=z-39ierCs_8FYomobh9PWESoZI5RJ-TgzEuew8B9kJM,9809 -django/conf/__pycache__/__init__.cpython-310.pyc,, -django/conf/__pycache__/global_settings.cpython-310.pyc,, -django/conf/app_template/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/app_template/admin.py-tpl,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63 -django/conf/app_template/apps.py-tpl,sha256=jrRjsh9lSkUvV4NnKdlAhLDtvydwBNjite0w2J9WPtI,171 -django/conf/app_template/migrations/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/app_template/models.py-tpl,sha256=Vjc0p2XbAPgE6HyTF6vll98A4eDhA5AvaQqsc4kQ9AQ,57 -django/conf/app_template/tests.py-tpl,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60 -django/conf/app_template/views.py-tpl,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63 -django/conf/global_settings.py,sha256=lVUBoRcyOo_Qvk62zXpnRO2Spfo0RLaskgCZvPFzYvw,23026 -django/conf/locale/__init__.py,sha256=QHDK8QIAcRjGMtWL8QVgYA_6psetuZuWBJkPwumTeI8,13864 -django/conf/locale/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/af/LC_MESSAGES/django.mo,sha256=Puafv8AlIDa6EMSa2A6_LYsjOjAd8p9J2F89UYNiR_Q,27466 -django/conf/locale/af/LC_MESSAGES/django.po,sha256=L3vsRiiwNQKsjPBZOx9GVJ0IyyA--ScPrp73BWG8h8M,30142 -django/conf/locale/ar/LC_MESSAGES/django.mo,sha256=qBaEPhfJxd2mK1uPH7J06hPI3_leRPsWkVgcKtJSAvQ,35688 -django/conf/locale/ar/LC_MESSAGES/django.po,sha256=MQeB4q0H-uDLurniJP5b2SBOTETAUl9k9NHxtaw0nnU,38892 -django/conf/locale/ar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ar/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ar/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ar/formats.py,sha256=EI9DAiGt1avNY-a6luMnAqKISKGHXHiKE4QLRx7wGHU,696 -django/conf/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=QosXYYYvQjGu13pLrC9LIVwUQXVwdJpIYn7RB9QCJY8,33960 -django/conf/locale/ar_DZ/LC_MESSAGES/django.po,sha256=2iT_sY4XedSSiHagu03OgpYXWNJVaKDwKUfxgEN4k3k,37626 -django/conf/locale/ar_DZ/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ar_DZ/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ar_DZ/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ar_DZ/formats.py,sha256=T84q3oMKng-L7_xymPqYwpzs78LvvfHy2drfSRj8XjE,901 -django/conf/locale/ast/LC_MESSAGES/django.mo,sha256=XSStt50HP-49AJ8wFcnbn55SLncJCsS2lx_4UwK-h-8,15579 -django/conf/locale/ast/LC_MESSAGES/django.po,sha256=7qZUb5JjfrWLqtXPRjpNOMNycbcsEYpNO-oYmazLTk4,23675 -django/conf/locale/az/LC_MESSAGES/django.mo,sha256=EJI2hYCCFFJb0YhaS7b5LrHOG6TGT_lJSOYQ2K7VAbY,28595 -django/conf/locale/az/LC_MESSAGES/django.po,sha256=44nzF7PPC0Ax1QI-PSpwvAGyyKQBwoLyZKJlPfJ9vfw,30893 -django/conf/locale/az/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/az/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/az/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/az/formats.py,sha256=JQoS2AYHKJxiH6TJas1MoeYgTeUv5XcNtYUHF7ulDmw,1087 -django/conf/locale/be/LC_MESSAGES/django.mo,sha256=rcdijOhkdSXs8BoQZN5jQDB-pkWYlgWF3m5VfJjCssI,37554 -django/conf/locale/be/LC_MESSAGES/django.po,sha256=7h7Z5qvjhD3BYgmbF1G7-Z2I70t1figiFlvMAz6twA4,40172 -django/conf/locale/bg/LC_MESSAGES/django.mo,sha256=x22bBhceDhNZXSoXiTKnc7w_HvtmW3EfWrZgsomUv6A,34729 -django/conf/locale/bg/LC_MESSAGES/django.po,sha256=xTU8GIhvPPuU7K4G8lZq8FXFsWiloT2u-118KtxkxBc,37283 -django/conf/locale/bg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/bg/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/bg/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/bg/formats.py,sha256=LC7P_5yjdGgsxLQ_GDtC8H2bz9NTxUze_CAtzlm37TA,705 -django/conf/locale/bn/LC_MESSAGES/django.mo,sha256=sB0RIFrGS11Z8dx5829oOFw55vuO4vty3W4oVzIEe8Q,16660 -django/conf/locale/bn/LC_MESSAGES/django.po,sha256=rF9vML3LDOqXkmK6R_VF3tQaFEoZI7besJAPx5qHNM0,26877 -django/conf/locale/bn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/bn/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/bn/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/bn/formats.py,sha256=jynhZ9XNNuxTXeF7f2FrJYYZuFwlLY58fGfQ6gVs7s8,964 -django/conf/locale/br/LC_MESSAGES/django.mo,sha256=Xow2-sd55CZJsvfF8axtxXNRe27EDwxKixCGelVQ4aU,14009 -django/conf/locale/br/LC_MESSAGES/django.po,sha256=ODCUDdEDAvsOVOAr49YiWT2YQaBZmc-38brdgYWc8Bs,24293 -django/conf/locale/bs/LC_MESSAGES/django.mo,sha256=Xa5QAbsHIdLkyG4nhLCD4UHdCngrw5Oh120abCNdWlA,10824 -django/conf/locale/bs/LC_MESSAGES/django.po,sha256=IB-2VvrQKUivAMLMpQo1LGRAxw3kj-7kB6ckPai0fug,22070 -django/conf/locale/bs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/bs/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/bs/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/bs/formats.py,sha256=760m-h4OHpij6p_BAD2dr3nsWaTb6oR1Y5culX9Gxqw,705 -django/conf/locale/ca/LC_MESSAGES/django.mo,sha256=v6lEJTUbXyEUBsctIdNFOg-Ck5MVFbuz-JgjqkUe32c,27707 -django/conf/locale/ca/LC_MESSAGES/django.po,sha256=16M-EtYLbfKnquh-IPRjWxTdHAqtisDc46Dzo5n-ZMc,30320 -django/conf/locale/ca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ca/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ca/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ca/formats.py,sha256=s7N6Ns3yIqr_KDhatnUvfjbPhUbrhvemB5HtCeodGZo,940 -django/conf/locale/ckb/LC_MESSAGES/django.mo,sha256=-Wk2cPQA7s-zQQKuzxnrQ18w-9LnAOfT3Ji5htLgbqI,34015 -django/conf/locale/ckb/LC_MESSAGES/django.po,sha256=OlbnQh93KtkGZ0yQKi8_r-BQQceL5EvAiB30f3Z84Vw,36195 -django/conf/locale/ckb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ckb/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ckb/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ckb/formats.py,sha256=EbmQC-dyQl8EqVQOVGwy1Ra5-P1n-J3UF4K55p3VzOM,728 -django/conf/locale/cs/LC_MESSAGES/django.mo,sha256=7_tvOmbJAdC-A1yk1503fdzjBxpwA9QJmfRcyPsmTBw,30186 -django/conf/locale/cs/LC_MESSAGES/django.po,sha256=wDPx3mYbrjmdTJEjNJM9odEpMT3j-xSkHqx1FARKMF0,33138 -django/conf/locale/cs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/cs/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/cs/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/cs/formats.py,sha256=3MA70CW0wfr0AIYvYqE0ACmX79tNOx-ZdlR6Aetp9e8,1539 -django/conf/locale/cy/LC_MESSAGES/django.mo,sha256=s7mf895rsoiqrPrXpyWg2k85rN8umYB2aTExWMTux7s,18319 -django/conf/locale/cy/LC_MESSAGES/django.po,sha256=S-1PVWWVgYmugHoYUlmTFAzKCpI81n9MIAhkETbpUoo,25758 -django/conf/locale/cy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/cy/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/cy/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/cy/formats.py,sha256=NY1pYPfpu7XjLMCCuJk5ggdpLcufV1h101ojyxfPUrY,1355 -django/conf/locale/da/LC_MESSAGES/django.mo,sha256=5rWOqu5hLUynpkxuz3kxDk1v3kZ73YpcjjhMnZ-Nb5g,27818 -django/conf/locale/da/LC_MESSAGES/django.po,sha256=Bu-OYUJEUWfYhGTXV8_rdj8zrbc5okbHVO3CfeNg9hQ,30255 -django/conf/locale/da/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/da/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/da/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/da/formats.py,sha256=-y3033Fo7COyY0NbxeJVYGFybrnLbgXtRf1yBGlouys,876 -django/conf/locale/de/LC_MESSAGES/django.mo,sha256=-J6VqvJeSF8tk4rjb1aI5MSWwyV372EPzwI3O18vecE,29167 -django/conf/locale/de/LC_MESSAGES/django.po,sha256=RZMqmCY1nUVapY7ryTBN3vFNlEsuhw8mQC7b5M6IV9c,31680 -django/conf/locale/de/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/de/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/de/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/de/formats.py,sha256=fysX8z5TkbPUWAngoy_sMeFGWp2iaNU6ftkBz8cqplg,996 -django/conf/locale/de_CH/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/de_CH/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/de_CH/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/de_CH/formats.py,sha256=22UDF62ESuU0Jp_iNUqAj-Bhq4_-frpji0-ynBdHXYk,1377 -django/conf/locale/dsb/LC_MESSAGES/django.mo,sha256=EfsEJ_6a4G8SsJSX3Gr4GFZCaIB_39V_TLZbvRuJdMY,30738 -django/conf/locale/dsb/LC_MESSAGES/django.po,sha256=jY1uYogT8DY7_hMie1CSft85fW-QjrX_PiuEnO7X5lc,33262 -django/conf/locale/el/LC_MESSAGES/django.mo,sha256=P5lTOPFcl9x6_j69ZN3hM_mQbhW7Fbbx02RtTNJwfS0,33648 -django/conf/locale/el/LC_MESSAGES/django.po,sha256=rZCComPQcSSr8ZDLPgtz958uBeBZsmV_gEP-sW88kRA,37123 -django/conf/locale/el/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/el/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/el/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/el/formats.py,sha256=RON2aqQaQK3DYVF_wGlBQJDHrhANxypcUW_udYKI-ro,1241 -django/conf/locale/en/LC_MESSAGES/django.mo,sha256=mVpSj1AoAdDdW3zPZIg5ZDsDbkSUQUMACg_BbWHGFig,356 -django/conf/locale/en/LC_MESSAGES/django.po,sha256=OWvHCX5XOOPznprddgycvtmmexfZymD4ab_YBcwKpUc,30411 -django/conf/locale/en/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/en/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/en/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/en/formats.py,sha256=VTQUhaZ_WFhS5rQj0PxbnoMySK0nzUSqrd6Gx-DtXxI,2438 -django/conf/locale/en_AU/LC_MESSAGES/django.mo,sha256=SntsKx21R2zdjj0D73BkOXGTDnoN5unsLMJ3y06nONM,25633 -django/conf/locale/en_AU/LC_MESSAGES/django.po,sha256=6Qh4Z6REzhUdG5KwNPNK9xgLlgq3VbAJuoSXyd_eHdE,28270 -django/conf/locale/en_AU/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/en_AU/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/en_AU/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/en_AU/formats.py,sha256=BoI5UviKGZ4TccqLmxpcdMf0Yk1YiEhY_iLQUddjvi0,1650 -django/conf/locale/en_CA/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/en_CA/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/en_CA/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/en_CA/formats.py,sha256=joB2Dy7XYhlii_PBJfuzHNLbOPmRXW2JjYkmxFr6KxI,1166 -django/conf/locale/en_GB/LC_MESSAGES/django.mo,sha256=jSIe44HYGfzQlPtUZ8tWK2vCYM9GqCKs-CxLURn4e1o,12108 -django/conf/locale/en_GB/LC_MESSAGES/django.po,sha256=PTXvOpkxgZFRoyiqftEAuMrFcYRLfLDd6w0K8crN8j4,22140 -django/conf/locale/en_GB/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/en_GB/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/en_GB/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/en_GB/formats.py,sha256=cJN8YNthkIOHCIMnwiTaSZ6RCwgSHkjWYMcfw8VFScE,1650 -django/conf/locale/en_IE/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/en_IE/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/en_IE/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/en_IE/formats.py,sha256=aKEIT96Y6tzbGHFu3qsFzFc4Qw_uzhNjB69GpmP6qX8,1484 -django/conf/locale/eo/LC_MESSAGES/django.mo,sha256=TPgHTDrh1amnOQjA7sY-lQvicdFewMutOfoptV3OKkU,27676 -django/conf/locale/eo/LC_MESSAGES/django.po,sha256=IPo-3crOWkp5dDQPDAFSzgCbf9OHjWB1zE3mklhTexk,30235 -django/conf/locale/eo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/eo/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/eo/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/eo/formats.py,sha256=zIEAk-SiLX0cvQVmRc3LpmV69jwRrejMMdC7vtVsSh0,1715 -django/conf/locale/es/LC_MESSAGES/django.mo,sha256=obYxux5pMwwbgMs6c_I5T-3CR7e_07d0h-JwmzwsKWU,29265 -django/conf/locale/es/LC_MESSAGES/django.po,sha256=77fpBrwtaZ3nvcXyLrf5k4Psq22dHuN0iR7OPn0MUTs,33344 -django/conf/locale/es/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/es/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/es/formats.py,sha256=7SusO1dPErY68h5g4lpxvPbsJYdrbTcr_0EX7uDKYNo,978 -django/conf/locale/es_AR/LC_MESSAGES/django.mo,sha256=HtNMHLmI3ghvieI4wZ_QvZI01Wfb68ukh9g0V4ufw_0,29693 -django/conf/locale/es_AR/LC_MESSAGES/django.po,sha256=Ea_vkNcTWZTukV-lCkG5wLR1xKqIokMeT0yfuxDFUss,32099 -django/conf/locale/es_AR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es_AR/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/es_AR/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/es_AR/formats.py,sha256=4qgOJoR2K5ZE-pA2-aYRwFW7AbK-M9F9u3zVwgebr2w,935 -django/conf/locale/es_CO/LC_MESSAGES/django.mo,sha256=ehUwvqz9InObH3fGnOLuBwivRTVMJriZmJzXcJHsfjc,18079 -django/conf/locale/es_CO/LC_MESSAGES/django.po,sha256=XRgn56QENxEixlyix3v4ZSTSjo4vn8fze8smkrv_gc4,25107 -django/conf/locale/es_CO/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es_CO/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/es_CO/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/es_CO/formats.py,sha256=0uAbBvOkdJZKjvhrrd0htScdO7sTgbofOkkC8A35_a8,691 -django/conf/locale/es_MX/LC_MESSAGES/django.mo,sha256=UkpQJeGOs_JQRmpRiU6kQmmYGL_tizL4JQOWb9i35M4,18501 -django/conf/locale/es_MX/LC_MESSAGES/django.po,sha256=M0O6o1f3V-EIY9meS3fXP_c7t144rXWZuERF5XeG5Uo,25870 -django/conf/locale/es_MX/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es_MX/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/es_MX/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/es_MX/formats.py,sha256=fBvyAqBcAXARptSE3hxwzFYNx3lEE8QrhNrCWuuGNlA,768 -django/conf/locale/es_NI/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es_NI/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/es_NI/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/es_NI/formats.py,sha256=UiOadPoMrNt0iTp8jZVq65xR_4LkOwp-fjvFb8MyNVg,711 -django/conf/locale/es_PR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es_PR/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/es_PR/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/es_PR/formats.py,sha256=VVTlwyekX80zCKlg1P4jhaAdKNpN5I64pW_xgrhpyVs,675 -django/conf/locale/es_VE/LC_MESSAGES/django.mo,sha256=h-h1D_Kr-LI_DyUJuIG4Zbu1HcLWTM1s5X515EYLXO8,18840 -django/conf/locale/es_VE/LC_MESSAGES/django.po,sha256=Xj38imu4Yw-Mugwge5CqAqWlcnRWnAKpVBPuL06Twjs,25494 -django/conf/locale/et/LC_MESSAGES/django.mo,sha256=WF00XXoJ3CUXv3Kb3fulOqohNnZ-skw8ysxFChl7iRE,27291 -django/conf/locale/et/LC_MESSAGES/django.po,sha256=BA_paZwRHIGuQOlFI_K2DJex3HzqqVgEb59wnYJPSB0,30074 -django/conf/locale/et/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/et/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/et/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/et/formats.py,sha256=DyFSZVuGSYGoImrRI2FodeM51OtvIcCkKzkI0KvYTQw,707 -django/conf/locale/eu/LC_MESSAGES/django.mo,sha256=EdncCA6Qp76DsqkyEYygaZFrnKRYzJ6LEucQqIjCsSM,21725 -django/conf/locale/eu/LC_MESSAGES/django.po,sha256=6T-yCAeg_8ntlqD_KJyjbqY0qgKPTwi3J46j0J6Ld1I,27752 -django/conf/locale/eu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/eu/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/eu/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/eu/formats.py,sha256=-PuRA6eHeXP8R3YV0aIEQRbk2LveaZk-_kjHlBT-Drg,749 -django/conf/locale/fa/LC_MESSAGES/django.mo,sha256=i9wWfM-zV76dkEoItqgfDniZ8qI66htM3cw48bBnvNg,31655 -django/conf/locale/fa/LC_MESSAGES/django.po,sha256=yry0L0s1KLG-NZ5T6rAAiQ1j7vhc3vXG24Knzn141eo,35114 -django/conf/locale/fa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fa/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/fa/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/fa/formats.py,sha256=v0dLaIh6-CWCAQHkmX0PaIlA499gTeRcJEi7lVJzw9o,722 -django/conf/locale/fi/LC_MESSAGES/django.mo,sha256=tXC36z4kP4b07YcfJxKRty83woT7AGmcJ_5iiDA4UUg,28122 -django/conf/locale/fi/LC_MESSAGES/django.po,sha256=k5DKhyy27Tv-44Tf-DWD8EszkBemDn3O5dQ-F2nh2tQ,30563 -django/conf/locale/fi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fi/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/fi/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/fi/formats.py,sha256=CO_wD5ZBHwAVgjxArXktLCD7M-PPhtHbayX_bBKqhlA,1213 -django/conf/locale/fr/LC_MESSAGES/django.mo,sha256=GVye4K2_wgoutRkInLS0PLD38z1b15wNdh4DIowBaEA,30309 -django/conf/locale/fr/LC_MESSAGES/django.po,sha256=xdJHJ4m-a0JkN2AOTeP1t__DuSiSnp6-7NdE0zXC9X4,32928 -django/conf/locale/fr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fr/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/fr/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/fr/formats.py,sha256=0uO3NMUAc2rRZOtr9SMJgFHTNNhr8t2xrGruVBRHTmw,938 -django/conf/locale/fr_BE/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fr_BE/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/fr_BE/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/fr_BE/formats.py,sha256=DB7W-i5BYeRjMRGWMWmm5oK4FNOTy4H4LL_xx6Ztk00,1154 -django/conf/locale/fr_CA/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fr_CA/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/fr_CA/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/fr_CA/formats.py,sha256=uSZ4s7XJmcutcbx51DVRu2Sh9ZkOhlTU1RHI37NQqQs,1171 -django/conf/locale/fr_CH/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fr_CH/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/fr_CH/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/fr_CH/formats.py,sha256=DB7W-i5BYeRjMRGWMWmm5oK4FNOTy4H4LL_xx6Ztk00,1154 -django/conf/locale/fy/LC_MESSAGES/django.mo,sha256=9P7zoJtaYHfXly8d6zBoqkxLM98dO8uI6nmWtsGu-lM,2286 -django/conf/locale/fy/LC_MESSAGES/django.po,sha256=jveK-2MjopbqC9jWcrYbttIb4DUmFyW1_-0tYaD6R0I,19684 -django/conf/locale/fy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fy/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/fy/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/fy/formats.py,sha256=mJXj1dHUnO883PYWPwuI07CNbjmnfBTQVRXZMg2hmOk,658 -django/conf/locale/ga/LC_MESSAGES/django.mo,sha256=AE9Vz07y6hXsV3gP-E3uboUU1nWLREpQYUBhKXI0UZY,31429 -django/conf/locale/ga/LC_MESSAGES/django.po,sha256=3biGJaUwzLN_q9b1Pe3_lpQ4-zlT8qEGhCGIU1bMzGo,34517 -django/conf/locale/ga/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ga/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ga/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ga/formats.py,sha256=Qh7R3UMfWzt7QIdMZqxY0o4OMpVsqlchHK7Z0QnDWds,682 -django/conf/locale/gd/LC_MESSAGES/django.mo,sha256=2VKzI7Nqd2NjABVQGdcduWHjj0h2b3UBGQub7xaTVPs,30752 -django/conf/locale/gd/LC_MESSAGES/django.po,sha256=3PfuhhmosuarfPjvM2TVf2kHhZaw5_G8oIM2VWTc3gI,33347 -django/conf/locale/gd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/gd/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/gd/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/gd/formats.py,sha256=7doL7JIoCqA_o-lpCwM3jDHMpptA3BbSgeLRqdZk8Lc,715 -django/conf/locale/gl/LC_MESSAGES/django.mo,sha256=UJY2CZtRqTkiPz5CgV1y1qPbcxZ6tPZvYtAWhwCNGgQ,28464 -django/conf/locale/gl/LC_MESSAGES/django.po,sha256=ZT-YXU4N4Z6qYkUPm84IXPqLznbOsOEE-PQJN9FCzIc,30925 -django/conf/locale/gl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/gl/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/gl/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/gl/formats.py,sha256=ygSFv-YTS8htG_LW0awegkkOarPRTZNPbUck5sxkAwI,757 -django/conf/locale/he/LC_MESSAGES/django.mo,sha256=qUMkR_MoqpY5D8GkHOBB4dccDumRg1YuccPOIZudZj4,31336 -django/conf/locale/he/LC_MESSAGES/django.po,sha256=FiZkX1xR5ynrLsydGPQYgvy6SV67E2saYD5fg_CdUKA,34069 -django/conf/locale/he/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/he/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/he/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/he/formats.py,sha256=M-tu-LmTZd_oYPNH6CZEsdxJN526RUOfnLHlQxRL0N0,712 -django/conf/locale/hi/LC_MESSAGES/django.mo,sha256=8pV5j5q8VbrxdVkcS0qwhVx6DmXRRXPKfRsm3nWhI2g,19712 -django/conf/locale/hi/LC_MESSAGES/django.po,sha256=DPV-I1aXgIiZB7zHdEgAHShZFyb9zlNmMXlyjH5ug0I,29221 -django/conf/locale/hi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/hi/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/hi/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/hi/formats.py,sha256=JArVM9dMluSP-cwpZydSVXHB5Vs9QKyR9c-bftI9hds,684 -django/conf/locale/hr/LC_MESSAGES/django.mo,sha256=HP4PCb-i1yYsl5eqCamg5s3qBxZpS_aXDDKZ4Hlbbcc,19457 -django/conf/locale/hr/LC_MESSAGES/django.po,sha256=qeVJgKiAv5dKR2msD2iokSOApZozB3Gp0xqzC09jnvs,26329 -django/conf/locale/hr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/hr/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/hr/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/hr/formats.py,sha256=F4mIdDoaOYJ_lPmsJ_6bQo4Zj8pOSVwuldm92zRy4Fo,1723 -django/conf/locale/hsb/LC_MESSAGES/django.mo,sha256=RdjIoabY6Q4vgWDsHlZljvBfJIOl7e3Qrf8U0CXr4Gc,30397 -django/conf/locale/hsb/LC_MESSAGES/django.po,sha256=jzwnMODbjhMaOTBN7gesEwlAHrXk_J-dbdeX9xmQLZ0,32893 -django/conf/locale/hu/LC_MESSAGES/django.mo,sha256=i2qW6f16t6-GVzyU71954BTmABcb9RbINi61hqiFZYE,29058 -django/conf/locale/hu/LC_MESSAGES/django.po,sha256=jLhOhdi5Eq0N62TOiJNX4jcT4mbVOgwIYdcpxlP30lI,31757 -django/conf/locale/hu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/hu/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/hu/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/hu/formats.py,sha256=xAD7mNsC5wFA2_KGRbBMPKwj884pq0jCKmXhEenGAEk,1001 -django/conf/locale/hy/LC_MESSAGES/django.mo,sha256=KfmTnB-3ZUKDHeNgLiego2Af0WZoHTuNKss3zE-_XOE,22207 -django/conf/locale/hy/LC_MESSAGES/django.po,sha256=kNKlJ5NqZmeTnnxdqhmU3kXiqT9t8MgAFgxM2V09AIc,28833 -django/conf/locale/ia/LC_MESSAGES/django.mo,sha256=JcrpersrDAoJXrD3AnPYBCQyGJ-6kUzH_Q8StbqmMeE,21428 -django/conf/locale/ia/LC_MESSAGES/django.po,sha256=LG0juYDjf3KkscDxwjY3ac6H1u5BBwGHljW3QWvr1nc,26859 -django/conf/locale/id/LC_MESSAGES/django.mo,sha256=6nkmcbKnW3CDgvkDrXwAFlboubvZHcrsvFtaZwxaSUI,27574 -django/conf/locale/id/LC_MESSAGES/django.po,sha256=nWHJBDKN686W5qQm0CfHDYiE1YLh_Mgw8TABcMQrMzM,30057 -django/conf/locale/id/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/id/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/id/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/id/formats.py,sha256=kYyOxWHN3Jyif3rFxLFyBUjTzFUwmuaLrkw5JvGbEz8,1644 -django/conf/locale/ig/LC_MESSAGES/django.mo,sha256=tAZG5GKhEbrUCJtLrUxzmrROe1RxOhep8w-RR7DaDYo,27188 -django/conf/locale/ig/LC_MESSAGES/django.po,sha256=DB_I4JXKMY4M7PdAeIsdqnLSFpq6ImkGPCuY82rNBpY,28931 -django/conf/locale/ig/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ig/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ig/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ig/formats.py,sha256=P3IsxhF5rNFZ5nCWUSyJfFLb0V1QdX_Xn-tYdrcll5Q,1119 -django/conf/locale/io/LC_MESSAGES/django.mo,sha256=uI78C7Qkytf3g1A6kVWiri_CbS55jReO2XmRfLTeNs0,14317 -django/conf/locale/io/LC_MESSAGES/django.po,sha256=FyN4ZTfNPV5TagM8NEhRts8y_FhehIPPouh_MfslnWY,23124 -django/conf/locale/is/LC_MESSAGES/django.mo,sha256=1pFU-dTPg2zs87L0ZqFFGS9q-f-XrzTOlhKujlyNL2E,24273 -django/conf/locale/is/LC_MESSAGES/django.po,sha256=76cQ_9DLg1jR53hiKSc1tLUMeKn8qTdPwpHwutEK014,28607 -django/conf/locale/is/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/is/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/is/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/is/formats.py,sha256=scsNfP4vVacxWIoN03qc2Fa3R8Uh5Izr1MqBicrAl3A,688 -django/conf/locale/it/LC_MESSAGES/django.mo,sha256=VjrisfaYSDxB6fm4h2vnIjuS9BVzmBacAVK1XySv_UM,28519 -django/conf/locale/it/LC_MESSAGES/django.po,sha256=r-LFt35zucantQe9gO62lqvA0j05ObCzSzVvCiFHSag,31952 -django/conf/locale/it/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/it/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/it/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/it/formats.py,sha256=KzkSb3KXBwfM3gk2FezyR-W8_RYKpnlFeFuIi5zl-S0,1774 -django/conf/locale/ja/LC_MESSAGES/django.mo,sha256=2Ye0yCvw0i_rJuhaPU4PmXMytkvUPh0eFAr2mcj3QAo,30945 -django/conf/locale/ja/LC_MESSAGES/django.po,sha256=E3n4fgr5Hje_J0OfnatKyGHkduYHigwuywmLRwynZHo,33466 -django/conf/locale/ja/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ja/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ja/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ja/formats.py,sha256=COUuaXo5zCSNzEwJ0smjbm9Qj28YNBcGxm8qFCJv4sE,729 -django/conf/locale/ka/LC_MESSAGES/django.mo,sha256=4e8at-KNaxYJKIJd8r6iPrYhEdnaJ1qtPw-QHPMh-Sc,24759 -django/conf/locale/ka/LC_MESSAGES/django.po,sha256=pIgaLU6hXgVQ2WJp1DTFoubI7zHOUkkKMddwV3PTdt8,32088 -django/conf/locale/ka/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ka/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ka/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ka/formats.py,sha256=elTGOjS-mxuoSCAKOm8Wz2aLfh4pWvNyClUFcrYq9ng,1861 -django/conf/locale/kab/LC_MESSAGES/django.mo,sha256=x5Kyq2Uf3XNlQP06--4lT8Q1MacA096hZbyMJRrHYIc,7139 -django/conf/locale/kab/LC_MESSAGES/django.po,sha256=DsFL3IzidcAnPoAWIfIbGJ6Teop1yKPBRALeLYrdiFA,20221 -django/conf/locale/kk/LC_MESSAGES/django.mo,sha256=krjcDvA5bu591zcP76bWp2mD2FL1VUl7wutaZjgD668,13148 -django/conf/locale/kk/LC_MESSAGES/django.po,sha256=RgM4kzn46ZjkSDHMAsyOoUg7GdxGiZ-vaEOdf7k0c5A,23933 -django/conf/locale/km/LC_MESSAGES/django.mo,sha256=kEvhZlH7lkY1DUIHTHhFVQzOMAPd_-QMItXTYX0j1xY,7223 -django/conf/locale/km/LC_MESSAGES/django.po,sha256=QgRxEiJMopO14drcmeSG6XEXQpiAyfQN0Ot6eH4gca8,21999 -django/conf/locale/km/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/km/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/km/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/km/formats.py,sha256=0UMLrZz1aI2sdRPkJ0YzX99co2IV6tldP7pEvGEPdP0,750 -django/conf/locale/kn/LC_MESSAGES/django.mo,sha256=fQ7AD5tUiV_PZFBxUjNPQN79dWBJKqfoYwRdrOaQjU4,17515 -django/conf/locale/kn/LC_MESSAGES/django.po,sha256=fS4Z7L4NGVQ6ipZ7lMHAqAopTBP0KkOc-eBK0IYdbBE,28133 -django/conf/locale/kn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/kn/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/kn/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/kn/formats.py,sha256=X5j9VHIW2XRdeTzDFEyS8tG05OBFzP2R7sEGUQa_INg,680 -django/conf/locale/ko/LC_MESSAGES/django.mo,sha256=g8kKIU6VaRguSKr5mnvFLgnCfNPRmG0b15TZJMmwvsE,28982 -django/conf/locale/ko/LC_MESSAGES/django.po,sha256=mxUD6fN3aZ1L_IFrbsHmq2ppaeKdwcoTuCdKcOZG5As,31963 -django/conf/locale/ko/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ko/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ko/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ko/formats.py,sha256=Yox367v4HPL3N9VoJ1vJ81MpSEljJDlAcLa2kQY-ung,2060 -django/conf/locale/ky/LC_MESSAGES/django.mo,sha256=IBVfwPwaZmaoljMRBGww_wWGMJqbF_IOHHnH2j-yJw8,31395 -django/conf/locale/ky/LC_MESSAGES/django.po,sha256=5ACTPMMbXuPJbU7Rfzs0yZHh3xy483pqo5DwSBQp4s4,33332 -django/conf/locale/ky/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ky/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ky/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ky/formats.py,sha256=QCq7vxAD5fe9VhcjRhG6C3N28jNvdzKR-c-EvDSJ1Pg,1178 -django/conf/locale/lb/LC_MESSAGES/django.mo,sha256=tQSJLQUeD5iUt-eA2EsHuyYqsCSYFtbGdryATxisZsc,8008 -django/conf/locale/lb/LC_MESSAGES/django.po,sha256=GkKPLO3zfGTNync-xoYTf0vZ2GUSAotAjfPSP01SDMU,20622 -django/conf/locale/lt/LC_MESSAGES/django.mo,sha256=cdUzK5RYW-61Upf8Sd8ydAg9wXg21pJaIRWFSKPv17c,21421 -django/conf/locale/lt/LC_MESSAGES/django.po,sha256=Lvpe_xlbxSa5vWEossxBCKryDVT7Lwz0EnuL1kSO6OY,28455 -django/conf/locale/lt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/lt/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/lt/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/lt/formats.py,sha256=C9ScR3gYswT1dQXFedUUnYe6DQPVGAS_nLxs0h2E3dE,1637 -django/conf/locale/lv/LC_MESSAGES/django.mo,sha256=10z9xnK1OfrN5LfCH-FGLsdXe7bbm3A8bDLnW6zw7YU,29228 -django/conf/locale/lv/LC_MESSAGES/django.po,sha256=ZjLdIMRbDJ4ZYgCR96hhv94J-lBvO6WE0hTYAzt1uDM,32030 -django/conf/locale/lv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/lv/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/lv/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/lv/formats.py,sha256=k8owdq0U7-x6yl8ll1W5VjRoKdp8a1G2enH04G5_nvU,1713 -django/conf/locale/mk/LC_MESSAGES/django.mo,sha256=uQKmcys0rOsRynEa812XDAaeiNTeBMkqhR4LZ_cfdAk,22737 -django/conf/locale/mk/LC_MESSAGES/django.po,sha256=4K11QRb493wD-FM6-ruCxks9_vl_jB59V1c1rx-TdKg,29863 -django/conf/locale/mk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/mk/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/mk/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/mk/formats.py,sha256=xwnJsXLXGogOqpP18u6GozjehpWAwwKmXbELolYV_k4,1451 -django/conf/locale/ml/LC_MESSAGES/django.mo,sha256=MGvV0e3LGUFdVIA-h__BuY8Ckom2dAhSFvAtZ8FiAXU,30808 -django/conf/locale/ml/LC_MESSAGES/django.po,sha256=iLllS6vlCpBNZfy9Xd_2Cuwi_1-Vz9fW4G1lUNOuZ6k,37271 -django/conf/locale/ml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ml/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ml/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ml/formats.py,sha256=ZR7tMdJF0U6K1H95cTqrFH4gop6ZuSQ7vD2h0yKq6mo,1597 -django/conf/locale/mn/LC_MESSAGES/django.mo,sha256=T8B76Nv_h6nCsTENPSAag_oGc67uj-fMy0jfHyQ7WLI,33282 -django/conf/locale/mn/LC_MESSAGES/django.po,sha256=uaXe-9Y8KcNBAij69nU0Id1ABE6q_pyNRhqigKGlzZY,35852 -django/conf/locale/mn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/mn/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/mn/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/mn/formats.py,sha256=fsexJU9_UTig2PS_o11hcEmrbPBS8voI4ojuAVPOd_U,676 -django/conf/locale/mr/LC_MESSAGES/django.mo,sha256=wDaS4FOhKcxM7mhzwItieazQ_qBp97ZaKhTZgETDXt0,27608 -django/conf/locale/mr/LC_MESSAGES/django.po,sha256=6eBOK9ZgqrvD1pdIa3NtXojHx-qw_WJLxtNdCkEelrg,34449 -django/conf/locale/ms/LC_MESSAGES/django.mo,sha256=U4_kzfbYF7u78DesFRSReOIeVbOnq8hi_pReFfHfyUQ,27066 -django/conf/locale/ms/LC_MESSAGES/django.po,sha256=49pG3cykGjVfC9N8WPyskz-m7r6KmQiq5i8MR6eOi54,28985 -django/conf/locale/ms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ms/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ms/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ms/formats.py,sha256=YtOBs6s4j4SOmfB3cpp2ekcxVFoVGgUN8mThoSueCt0,1522 -django/conf/locale/my/LC_MESSAGES/django.mo,sha256=SjYOewwnVim3-GrANk2RNanOjo6Hy2omw0qnpkMzTlM,2589 -django/conf/locale/my/LC_MESSAGES/django.po,sha256=b_QSKXc3lS2Xzb45yVYVg307uZNaAnA0eoXX2ZmNiT0,19684 -django/conf/locale/nb/LC_MESSAGES/django.mo,sha256=qX1Z1F3YXVavlrECVkHXek9tsvJEXbWNrogdjjY3jCg,27007 -django/conf/locale/nb/LC_MESSAGES/django.po,sha256=QQ_adZsyp2BfzcJS-LXnZL0EMmUZLbnHsBB1pRRfV-8,29500 -django/conf/locale/nb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/nb/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/nb/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/nb/formats.py,sha256=y1QLE-SG00eHwje0lkAToHtz4t621Rz_HQRyBWCgK8c,1552 -django/conf/locale/ne/LC_MESSAGES/django.mo,sha256=BcK8z38SNWDXXWVWUmOyHEzwk2xHEeaW2t7JwrxehKM,27248 -django/conf/locale/ne/LC_MESSAGES/django.po,sha256=_Kj_i2zMb7JLU7EN7Z7JcUn89YgonJf6agSFCjXa49w,33369 -django/conf/locale/nl/LC_MESSAGES/django.mo,sha256=n4OoqdJ2AIj7wfEBmaQsQAvzUox66eYYZLHD-0nuy24,28038 -django/conf/locale/nl/LC_MESSAGES/django.po,sha256=Yd8q1HkDYm2Uo2dSeuT9AjUHOQtB9oAAh9pg7AaT3gs,30998 -django/conf/locale/nl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/nl/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/nl/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/nl/formats.py,sha256=cKaaOvRdeauORjvuZ1xyVcVsl36J3Zk4FSE-lnx2Xwg,3927 -django/conf/locale/nn/LC_MESSAGES/django.mo,sha256=Ccj8kjvjTefC8H6TuDCOdSrTmtkYXkmRR2V42HBMYo4,26850 -django/conf/locale/nn/LC_MESSAGES/django.po,sha256=oaVJTl0NgZ92XJv9DHdsXVaKAc81ky_R3CA6HljTH-8,29100 -django/conf/locale/nn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/nn/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/nn/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/nn/formats.py,sha256=y1QLE-SG00eHwje0lkAToHtz4t621Rz_HQRyBWCgK8c,1552 -django/conf/locale/os/LC_MESSAGES/django.mo,sha256=LBpf_dyfBnvGOvthpn5-oJuFiSNHrgiVHBzJBR-FxOw,17994 -django/conf/locale/os/LC_MESSAGES/django.po,sha256=WYlAnNYwGFnH76Elnnth6YP2TWA-fEtvV5UinnNj7AA,26278 -django/conf/locale/pa/LC_MESSAGES/django.mo,sha256=H1hCnQzcq0EiSEaayT6t9H-WgONO5V4Cf7l25H2930M,11253 -django/conf/locale/pa/LC_MESSAGES/django.po,sha256=26ifUdCX9fOiXfWvgMkOXlsvS6h6nNskZcIBoASJec4,23013 -django/conf/locale/pl/LC_MESSAGES/django.mo,sha256=VoTIHWbC0XLJqpS4wAea5jiDSQpQ8NfaD3XL7u9c3vg,30719 -django/conf/locale/pl/LC_MESSAGES/django.po,sha256=50d1hkVl8pFesmnjAv2uXRRHogyoqCCdles57H0N7P0,34679 -django/conf/locale/pl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/pl/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/pl/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/pl/formats.py,sha256=KREhPtHuzKS_ZsAqXs5LqYPGhn6O-jLd4WZQ-39BA8I,1032 -django/conf/locale/pt/LC_MESSAGES/django.mo,sha256=MFr-uCyeW67BfxBWsfHfM0k-Z36SFnT0sDPL7fF5y8s,21427 -django/conf/locale/pt/LC_MESSAGES/django.po,sha256=KHB-fSOokH6O6m9ZgW3vUq0I4VBayV4Ip1vxePlRqvs,28080 -django/conf/locale/pt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/pt/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/pt/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/pt/formats.py,sha256=RQ9MuIwUPhiY2u-1hFU2abs9Wqv1qZE2AUAfYVK-NU8,1520 -django/conf/locale/pt_BR/LC_MESSAGES/django.mo,sha256=4mM2UEHa1sbwQjlHbxhpGRafRyWyQs56zJ8d3nzNMD4,29218 -django/conf/locale/pt_BR/LC_MESSAGES/django.po,sha256=SvnvurlGJ2QutJGKbGmdAQ55QllPuDqAyDjF0ZYadSA,33298 -django/conf/locale/pt_BR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/pt_BR/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/pt_BR/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/pt_BR/formats.py,sha256=J1IKV7cS2YMJ5_qlT9h1dDYUX9tLFvqA95l_GpZTLUY,1285 -django/conf/locale/ro/LC_MESSAGES/django.mo,sha256=9RSlC_3Ipn_Vm31ALaGHsrOA1IKmKJ5sN2m6iy5Hk60,21493 -django/conf/locale/ro/LC_MESSAGES/django.po,sha256=XoGlHKEnGlno_sbUTnbkg9nGkRfPIpxv7Wfm3hHGu9w,28099 -django/conf/locale/ro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ro/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ro/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ro/formats.py,sha256=e_dp0zyfFfoydrGyn6Kk3DnQIj7RTRuvRc6rQ6tSxzA,928 -django/conf/locale/ru/LC_MESSAGES/django.mo,sha256=Y9QMees4Kj3WQDoAtCcugQh2Ky1_ZoaU-vSyTckDxnk,38774 -django/conf/locale/ru/LC_MESSAGES/django.po,sha256=zWmJpjWwpKPnoCjIEKOjclbxBjWf6dwgwoJdnTEx0Jc,42141 -django/conf/locale/ru/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ru/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ru/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ru/formats.py,sha256=lTfYbecdSmHCxebog_2bd0N32iD3nEq_f5buh9il-nI,1098 -django/conf/locale/sk/LC_MESSAGES/django.mo,sha256=2UgS2LCSCPEhJV4R2LQXxGw1LvAZMvi6B1ITaVD_x_U,29965 -django/conf/locale/sk/LC_MESSAGES/django.po,sha256=vt-A2Ayh5r-a49x3lLxe8FU7tm-S2YQHRk-N15smi9k,32799 -django/conf/locale/sk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sk/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/sk/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/sk/formats.py,sha256=bWj0FNpYfOAgi9J-L4VuiN6C_jsgPsKNdLYd9gTnFs0,1051 -django/conf/locale/sl/LC_MESSAGES/django.mo,sha256=1mzO4ZC9IYwbKM7iavLJfb2bYaLaC1UVmm4T37Xil7g,23147 -django/conf/locale/sl/LC_MESSAGES/django.po,sha256=EDR734fFO7UM_F-4Q-psEHc-VF2po7fl6n5akKdWYyY,29440 -django/conf/locale/sl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sl/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/sl/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/sl/formats.py,sha256=Nq4IfEUnlGebMZeRvB2l9aps-5G5b4y1kQ_3MiJTfe8,1642 -django/conf/locale/sq/LC_MESSAGES/django.mo,sha256=F-aD9n_Z-mvRkF_A7oPgsYB6XyaBKvniBGdHzXFckA4,28772 -django/conf/locale/sq/LC_MESSAGES/django.po,sha256=Z2-A9zXYkrhH2JbNuutX5E7Tq17U1Z4EgSEulkiVXDU,31279 -django/conf/locale/sq/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sq/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/sq/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/sq/formats.py,sha256=SA_jCSNwI8-p79skHoLxrPLZnkyq1PVadwT6gMt7n_M,688 -django/conf/locale/sr/LC_MESSAGES/django.mo,sha256=kDxODAVghPzZzL4TpXJ7kP_Qo8ine8ETuP_471f4d8s,35028 -django/conf/locale/sr/LC_MESSAGES/django.po,sha256=yH1xOGj3gGx6MzB7zGrKOznfPRDW452KdIt9MCMjNKo,37554 -django/conf/locale/sr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sr/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/sr/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/sr/formats.py,sha256=F3_gYopOXINcllaPFzTqZrZ2oZ1ye3xzR0NQtlqXYp0,1729 -django/conf/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=GHilyEVbIGQt6ItMgQJVk-m6TF8tgHI4rtidYmOwUGI,28715 -django/conf/locale/sr_Latn/LC_MESSAGES/django.po,sha256=FegpyTDYtB-kPG8d8EmK_lK3C7PSxhc2p9xLAZadO74,41466 -django/conf/locale/sr_Latn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sr_Latn/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/sr_Latn/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/sr_Latn/formats.py,sha256=BDZm-ajQgCIxQ8mCcckEH32IoCN9233TvAOXkg4mc38,1728 -django/conf/locale/sv/LC_MESSAGES/django.mo,sha256=sLEVlvxPVNVms8Tfmhxs84Ltbx7ryDZtwU54SGJXKRc,28006 -django/conf/locale/sv/LC_MESSAGES/django.po,sha256=Emb4MrDT_fsFdZRhixZztQVgYb5Wl-YpsR8bC9yY3hs,30872 -django/conf/locale/sv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sv/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/sv/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/sv/formats.py,sha256=9o8ZtaSq1UOa5y6Du3rQsLAAl5ZOEdVY1OVVMbj02RA,1311 -django/conf/locale/sw/LC_MESSAGES/django.mo,sha256=aUmIVLANgSCTK5Lq8QZPEKWjZWnsnBvm_-ZUcih3J6g,13534 -django/conf/locale/sw/LC_MESSAGES/django.po,sha256=GOE6greXZoLhpccsfPZjE6lR3G4vpK230EnIOdjsgPk,22698 -django/conf/locale/ta/LC_MESSAGES/django.mo,sha256=WeM8tElbcmL11P_D60y5oHKtDxUNWZM9UNgXe1CsRQ4,7094 -django/conf/locale/ta/LC_MESSAGES/django.po,sha256=kgHTFqysEMj1hqktLr-bnL1NRM715zTpiwhelqC232s,22329 -django/conf/locale/ta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ta/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ta/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ta/formats.py,sha256=vmjfiM54oJJxqcdgZJUNNQN7oMS-XLVBYJ4lWBb5ctY,682 -django/conf/locale/te/LC_MESSAGES/django.mo,sha256=Sk45kPC4capgRdW5ImOKYEVxiBjHXsosNyhVIDtHLBc,13259 -django/conf/locale/te/LC_MESSAGES/django.po,sha256=IQxpGTpsKUtBGN1P-KdGwvE7ojNCqKqPXEvYD3qT5A4,25378 -django/conf/locale/te/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/te/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/te/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/te/formats.py,sha256=-HOoZgmnME4--4CuXzcnhXqNma0Wh7Ninof3RCCGZkU,680 -django/conf/locale/tg/LC_MESSAGES/django.mo,sha256=ePzS2pD84CTkHBaiaMyXBxiizxfFBjHdsGH7hCt5p_4,28497 -django/conf/locale/tg/LC_MESSAGES/django.po,sha256=oSKu3YT3griCrDLPqptZmHcuviI99wvlfX6I6nLJnDk,33351 -django/conf/locale/tg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/tg/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/tg/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/tg/formats.py,sha256=TG5TGfLNy4JSjl-QAWk46gIEb0ijdBpqPrDtwfJzshw,1160 -django/conf/locale/th/LC_MESSAGES/django.mo,sha256=SJeeJWbdF-Lae5BendxlyMKqx5zdDmh3GCQa8ER5FyY,18629 -django/conf/locale/th/LC_MESSAGES/django.po,sha256=K4ITjzHLq6DyTxgMAfu3CoGxrTd3aG2J6-ZxQj2KG1U,27507 -django/conf/locale/th/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/th/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/th/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/th/formats.py,sha256=SmCUD-zVgI1QE2HwqkFtAO87rJ-FoCjw1s-2-cfl1h0,1072 -django/conf/locale/tk/LC_MESSAGES/django.mo,sha256=qtFLB9rBkpUDv5LtNAZqkkCKtquMySyg3dzQ8x_Nb-Y,27792 -django/conf/locale/tk/LC_MESSAGES/django.po,sha256=dEjcfeYmvjKbAPFVCmrlh7rVOU90MgiYpoo1cHfPj2E,30232 -django/conf/locale/tk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/tk/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/tk/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/tk/formats.py,sha256=TG5TGfLNy4JSjl-QAWk46gIEb0ijdBpqPrDtwfJzshw,1160 -django/conf/locale/tr/LC_MESSAGES/django.mo,sha256=uH2Uu81XQaQeoizE-5eUHIba-V1Mr7q1smGHd0Aug7k,28862 -django/conf/locale/tr/LC_MESSAGES/django.po,sha256=2hMb5M7ZIpp-QIXGox-1OJEVmBUTl4nXErLfhYpeOaY,31453 -django/conf/locale/tr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/tr/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/tr/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/tr/formats.py,sha256=yJg-7hmevD1gvj9iBRMCiYGgd5DxKZcL7T_C3K3ztME,1019 -django/conf/locale/tt/LC_MESSAGES/django.mo,sha256=r554DvdPjD_S8hBRjW8ehccEjEk8h7czQsp46FZZ_Do,14500 -django/conf/locale/tt/LC_MESSAGES/django.po,sha256=W8QgEAH7yXNmjWoF-UeqyVAu5jEMHZ5MXE60e5sawJc,24793 -django/conf/locale/udm/LC_MESSAGES/django.mo,sha256=cIf0i3TjY-yORRAcSev3mIsdGYT49jioTHZtTLYAEyc,12822 -django/conf/locale/udm/LC_MESSAGES/django.po,sha256=n9Az_8M8O5y16yE3iWmK20R9F9VoKBh3jR3iKwMgFlY,23113 -django/conf/locale/ug/LC_MESSAGES/django.mo,sha256=iaFelEuogA9O-dWIUlp_Zjpq33zMNaFCsOpuZT26LfM,35467 -django/conf/locale/ug/LC_MESSAGES/django.po,sha256=Zd3j_J7Su7VTe6TGd8ghDBD2bxX1NLKfA2wsrHPvS2w,37731 -django/conf/locale/ug/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ug/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/ug/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/ug/formats.py,sha256=qoSAkaWqJ7FW2OTGaZs_CfiMN9PxAVxHecZfwNCzdUo,454 -django/conf/locale/uk/LC_MESSAGES/django.mo,sha256=n1YrNtVEZr75_N5CMcbYZmzxUOMi5miny3GRaMyKKh8,30829 -django/conf/locale/uk/LC_MESSAGES/django.po,sha256=XraKjvG_kJhJ19fNEIKoXt7r19J-l-e8wQoemW6_FBw,36731 -django/conf/locale/uk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/uk/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/uk/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/uk/formats.py,sha256=ZmeYmL0eooFwQgmE054V36RQ469ZTfAv6k8SUJrDYQ8,1241 -django/conf/locale/ur/LC_MESSAGES/django.mo,sha256=M6R2DYFRBvcVRAsgVxVOLvH3e8v14b2mJs650UlUb2I,12291 -django/conf/locale/ur/LC_MESSAGES/django.po,sha256=Lr0DXaPqWtCFAxn10BQ0vlvZIMNRvCg_QJQxAC01eWk,23479 -django/conf/locale/uz/LC_MESSAGES/django.mo,sha256=CJSRoHJANkNevG-6QM-TL5VJ9UgS63dWPHeGHan9Ano,26443 -django/conf/locale/uz/LC_MESSAGES/django.po,sha256=u6En3LJg7x7VKsCNff3haprDlsizPxBukfWomKXaMak,29725 -django/conf/locale/uz/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/uz/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/uz/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/uz/formats.py,sha256=cdmqOUBVnPSyi2k9AkOGl27s89PymFePG2gtnYzYbiw,1176 -django/conf/locale/vi/LC_MESSAGES/django.mo,sha256=TMsBzDnf9kZndozqVUnEKtKxfH2N1ajLdrm8hJ4HkYI,17396 -django/conf/locale/vi/LC_MESSAGES/django.po,sha256=tL2rvgunvaN_yqpPSBYAKImFDaFaeqbnpEw_egI11Lo,25342 -django/conf/locale/vi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/vi/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/vi/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/vi/formats.py,sha256=_xIugkqLnjN9dzIhefMpsJXaTPldr4blKSGS-c3swg0,762 -django/conf/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=pc4Tj52sDX136DQQsxtNKQ2pqCnmLZdZlVlTtyfz124,26944 -django/conf/locale/zh_Hans/LC_MESSAGES/django.po,sha256=qzXCLkD580Q8MzmbBFtTzaMecalBsMrZFzJiNJrD_sk,30141 -django/conf/locale/zh_Hans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/zh_Hans/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/zh_Hans/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/zh_Hans/formats.py,sha256=iMb9Taj6xQQA3l_NWCC7wUlQuh4YfNUgs2mHcQ6XUEo,1598 -django/conf/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=RJfNK_dA3spzHwExqy2B3TcEfAC_RZGusr0Kk9xv8Fk,26818 -django/conf/locale/zh_Hant/LC_MESSAGES/django.po,sha256=9lbNGnzOaKBG2YsGruAIAzWaKU9irMkJl74SNEHNLoU,29061 -django/conf/locale/zh_Hant/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/zh_Hant/__pycache__/__init__.cpython-310.pyc,, -django/conf/locale/zh_Hant/__pycache__/formats.cpython-310.pyc,, -django/conf/locale/zh_Hant/formats.py,sha256=iMb9Taj6xQQA3l_NWCC7wUlQuh4YfNUgs2mHcQ6XUEo,1598 -django/conf/project_template/manage.py-tpl,sha256=JDuGG02670bELmn3XLUSxHFZ8VFhqZTT_oN9VbT5Acc,674 -django/conf/project_template/project_name/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/project_template/project_name/asgi.py-tpl,sha256=q_6Jo5tLy6ba-S7pLs3YTK7byxSBmU0oYylYJlNvwHI,428 -django/conf/project_template/project_name/settings.py-tpl,sha256=WL949LQPZMyvet9W5G1yL9PMcDPZ6RWqbCcjbe9ZozU,3282 -django/conf/project_template/project_name/urls.py-tpl,sha256=5en0vlo3TdXdQquXZVNENrmX2DZJxje156HqcRbySKU,789 -django/conf/project_template/project_name/wsgi.py-tpl,sha256=OCfjjCsdEeXPkJgFIrMml_FURt7msovNUPnjzb401fs,428 -django/conf/urls/__init__.py,sha256=qmpaRi5Gn2uaY9h3g9RNu0z3LDEpEeNL9JlfSLed9s0,292 -django/conf/urls/__pycache__/__init__.cpython-310.pyc,, -django/conf/urls/__pycache__/i18n.cpython-310.pyc,, -django/conf/urls/__pycache__/static.cpython-310.pyc,, -django/conf/urls/i18n.py,sha256=M_lO6q_92QrrPoTY9oui95BQgJfPla9edRNuN5Vc4GM,1166 -django/conf/urls/static.py,sha256=gZOYaiIf3SxQ75N69GyVm9C0OmQv1r1IDrUJ0E7zMe0,908 -django/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/__pycache__/__init__.cpython-310.pyc,, -django/contrib/admin/__init__.py,sha256=i0TwjHWq6qfZJ0e9pVWAZXxVHZ-eOPewGjtdwHljbOM,1203 -django/contrib/admin/__pycache__/__init__.cpython-310.pyc,, -django/contrib/admin/__pycache__/actions.cpython-310.pyc,, -django/contrib/admin/__pycache__/apps.cpython-310.pyc,, -django/contrib/admin/__pycache__/checks.cpython-310.pyc,, -django/contrib/admin/__pycache__/decorators.cpython-310.pyc,, -django/contrib/admin/__pycache__/exceptions.cpython-310.pyc,, -django/contrib/admin/__pycache__/filters.cpython-310.pyc,, -django/contrib/admin/__pycache__/forms.cpython-310.pyc,, -django/contrib/admin/__pycache__/helpers.cpython-310.pyc,, -django/contrib/admin/__pycache__/models.cpython-310.pyc,, -django/contrib/admin/__pycache__/options.cpython-310.pyc,, -django/contrib/admin/__pycache__/sites.cpython-310.pyc,, -django/contrib/admin/__pycache__/tests.cpython-310.pyc,, -django/contrib/admin/__pycache__/utils.cpython-310.pyc,, -django/contrib/admin/__pycache__/widgets.cpython-310.pyc,, -django/contrib/admin/actions.py,sha256=gOSd7rrFjIL1HxDSP8yJ36ie7J9DH06M_wsH9QvSFGM,3181 -django/contrib/admin/apps.py,sha256=BOiulA4tsb3wuAUtLGTGjrbywpSXX0dLo2pUCGV8URw,840 -django/contrib/admin/checks.py,sha256=KkyUfKtosw8cRETN3RSvPO2NOPgdEUjOt1ilnFMYvBM,50474 -django/contrib/admin/decorators.py,sha256=dki7GLFKOPT-mB5rxsYX12rox18BywroxmrzjG_VJXM,3481 -django/contrib/admin/exceptions.py,sha256=VJhzurallXV322hhZklmvp3OmDIZZQpbEOuE-CX7938,507 -django/contrib/admin/filters.py,sha256=xWca0wsA_fGlkgV9mAXA3RipmXvj8EKaumU4f_Kyk9s,27668 -django/contrib/admin/forms.py,sha256=0UCJstmmBfp_c_0AqlALJQYy9bxXo9fqoQQICQONGEo,1023 -django/contrib/admin/helpers.py,sha256=9StpoEjTZH30IP0hRVZJJjGf-nKWfnMwD3enQuPNhII,18620 -django/contrib/admin/locale/af/LC_MESSAGES/django.mo,sha256=GgKqAhO9cxtkT9rw89vM_vvQCJuXU7-dC6C9QPIgcsQ,17709 -django/contrib/admin/locale/af/LC_MESSAGES/django.po,sha256=eJAIkGbwtMY5ukNCkbmFculcUWVuTzZlTZlHElQIkpw,19078 -django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo,sha256=eD8mj7MPFSc6GEmwpGLs7lE7w0CKc1EuZ2GcEwWRF0U,5390 -django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po,sha256=xBcNbFhUtTYjQfCqfqRDQdsVrgau1_3032-whoiNzCM,6172 -django/contrib/admin/locale/am/LC_MESSAGES/django.mo,sha256=UOwMxYH1r5AEBpu-P9zxHazk3kwI4CtsPosGIYtl6Hs,8309 -django/contrib/admin/locale/am/LC_MESSAGES/django.po,sha256=NmsIZoBEQwyBIqbKjkwCJ2_iMHnMKB87atoT0iuNXrw,14651 -django/contrib/admin/locale/ar/LC_MESSAGES/django.mo,sha256=tzGQ8jSJc406IBBwtAErlXVqaA10glxB8krZtWp1Rq4,19890 -django/contrib/admin/locale/ar/LC_MESSAGES/django.po,sha256=RBJbiYNDy57K592OKghugZFYiHpTvxUoEQ_B26-5i8A,21339 -django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo,sha256=xoI2xNKgspuuJe1UCUB9H6Kyp3AGhj5aeo_WEg5e23A,6545 -django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po,sha256=jwehFDFk3lMIEH43AEU_JyHOm84Seo-OLd5FmGBbaxo,7281 -django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=ipELNNGQYb_nHTEQbUFED8IT26L9c2UXsELf4wk0q6k,19947 -django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po,sha256=2mGF2NfofR8WgSJPShF5CrMjECXj0dGFcFaZ2lriulc,21378 -django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo,sha256=L3N1U9OFXYZ8OfrvKHLbVvXa40biIDdmon0ZV8BOIvY,6423 -django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po,sha256=Atzp95E2dFtSHZHHna0pBCqU_2V7partODX675OBkQs,7206 -django/contrib/admin/locale/ast/LC_MESSAGES/django.mo,sha256=3uffu2zPbQ1rExUsG_ambggq854Vy8HbullkCYdazA4,2476 -django/contrib/admin/locale/ast/LC_MESSAGES/django.po,sha256=wCWFh9viYUhTGOX0mW3fpN2z0kdE6b7IaA-A5zzb3Yo,11676 -django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo,sha256=kiG-lzQidkXER5s_6POO1G91mcAv9VAkAXI25jdYBLE,2137 -django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po,sha256=s4s6aHocTlzGcFi0p7cFGTi3K8AgoPvFCv7-Hji6At0,4085 -django/contrib/admin/locale/az/LC_MESSAGES/django.mo,sha256=X7b0zSqq6T7OjNQl0oIYHdedeA20A1af4vBcDjdk8dw,18401 -django/contrib/admin/locale/az/LC_MESSAGES/django.po,sha256=UwT85_yk4muCbtIdCFILCLGayqj3eTIiT1zHgoqslwM,20161 -django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo,sha256=4f2xF9tdk9UkzCgJQDeI86VbvVb_-YUfSgkQygYVzrI,5063 -django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po,sha256=TNgrRYUv8ptUQyz7v7OumJjnektDPlU7J28Om8qg9q8,6230 -django/contrib/admin/locale/be/LC_MESSAGES/django.mo,sha256=ndFEwhHu8GP4EZQoJNSqH-oWNLWdEYcbleaFYCU74nI,23275 -django/contrib/admin/locale/be/LC_MESSAGES/django.po,sha256=QAwFZJpkz-Hm6vS5AHyQ8rxowt_LVhMAYC-cS78F9Qg,24597 -django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo,sha256=e1xbTtl47sBU5ZCUEf4fHN6E7rRkz_HIYCObX0lWDug,7703 -django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po,sha256=DBSHPnSZm7AVqxg1fINkRQ89QVp_cdi4VhQ7Ynd1NWs,8466 -django/contrib/admin/locale/bg/LC_MESSAGES/django.mo,sha256=fNYcFUCFOnBEH_lR4t80bUN6IwkjS5tIs7xWRNxu80I,22994 -django/contrib/admin/locale/bg/LC_MESSAGES/django.po,sha256=1HZYpZgHwqJsPMwasK1O8zv7mDgX3t-2JTdtV_lzM_w,24461 -django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo,sha256=IRQMah9wBmq0g9RZ5hBH_dvQD4Q_pmNG4jJHxCGWwZI,7195 -django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po,sha256=zv5xU9wS1PCdsmmWaV8txSdY4JduEse7w4iWd3QkzsE,7900 -django/contrib/admin/locale/bn/LC_MESSAGES/django.mo,sha256=I3KUX53ePEC-8x_bwkR5spx3WbJRR8Xf67_2Xrr7Ccg,18585 -django/contrib/admin/locale/bn/LC_MESSAGES/django.po,sha256=UvKCBSa5MuxxZ7U5pRWXH6CEQ9WCJH2cQND0jjBmgpQ,22889 -django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo,sha256=t_OiMyPMsR2IdH65qfD9qvQfpWbwFueNuY72XSed2Io,2313 -django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po,sha256=iFwEJi4k3ULklCq9eQNUhKVblivQPJIoC_6lbyEkotY,4576 -django/contrib/admin/locale/br/LC_MESSAGES/django.mo,sha256=yCuMwrrEB_H44UsnKwY0E87sLpect_AMo0GdBjMZRPs,6489 -django/contrib/admin/locale/br/LC_MESSAGES/django.po,sha256=WMU_sN0ENWgyEbKOm8uVQfTQh9sabvKihtSdMt4XQBM,13717 -django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo,sha256=n7Yx2k9sAVSNtdY-2Ao6VFsnsx4aiExZ3TF_DnnrKU0,1658 -django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po,sha256=gjg-VapbI9n_827CqNYhbtIQ8W9UcMmMObCsxCzReUU,4108 -django/contrib/admin/locale/bs/LC_MESSAGES/django.mo,sha256=44D550fxiO59Pczu5HZ6gvWEClsfmMuaxQWbA4lCW2M,8845 -django/contrib/admin/locale/bs/LC_MESSAGES/django.po,sha256=FrieR1JB4ssdWwYitJVpZO-odzPBKrW4ZsGK9LA595I,14317 -django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo,sha256=SupUK-RLDcqJkpLEsOVjgZOWBRKQMALZLRXGEnA623M,1183 -django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po,sha256=TOtcfw-Spn5Y8Yugv2OlPoaZ5DRwJjRIl-YKiyU092U,3831 -django/contrib/admin/locale/ca/LC_MESSAGES/django.mo,sha256=Wj8KdBSUuUtebE45FK3kvzl155GdTv4KgecoMxFi0_g,17535 -django/contrib/admin/locale/ca/LC_MESSAGES/django.po,sha256=5s5RIsOY5uL1oQQ5IrOhsOgAWWFZ25vTcYURO2dlR8g,19130 -django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo,sha256=HjPaPtF5TZGtRu1P40X2YIuRAoKndwurWE4nlZlc7sE,6075 -django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po,sha256=G7jxAwjnpvvlGinLWDx_awUBu6XwVrdIFqdxBDMVfJQ,6906 -django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo,sha256=ZVy1U4xWrNSU7lUL2mfdqx9MMQODgbi5B5g7Cea_26M,23234 -django/contrib/admin/locale/ckb/LC_MESSAGES/django.po,sha256=TDGnHwoHvZbYmOvsQEU8rHAgzjp5dY1jAwyu3VGblbo,24560 -django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo,sha256=-Czkr04TLjKYmob6CyoJxuS3YcUs7z-I9Sgh6rOyOdc,7671 -django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po,sha256=L1r7AcAvTOFO3_uzQ_9oRHEIYAcnDWd_oIIqX133mjU,8392 -django/contrib/admin/locale/cs/LC_MESSAGES/django.mo,sha256=w2IX5ZS8RaBtWWIvlPiAbcUDpmjiFD2ZGiqEkCzBSdc,19004 -django/contrib/admin/locale/cs/LC_MESSAGES/django.po,sha256=ijy86d9djUVhsRGT52tuLbrKRN3ETNQzo8bSxEdlmhs,20670 -django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo,sha256=ArA6qnVlUAsj7EugF0GM4XW494VpTEj3Uu__Qu9jIig,6596 -django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po,sha256=DKsC0k5i9t3i77uxR_h99MOip-fc3JPDIV9EriGr7qw,7587 -django/contrib/admin/locale/cy/LC_MESSAGES/django.mo,sha256=7ifUyqraN1n0hbyTVb_UjRIG1jdn1HcwehugHBiQvHs,12521 -django/contrib/admin/locale/cy/LC_MESSAGES/django.po,sha256=bS_gUoKklZwd3Vs0YlRTt24-k5ure5ObTu-b5nB5qCA,15918 -django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo,sha256=fOCA1fXEmJw_QaXEISLkuBhaMnEmP1ssP9lhqdCCC3c,3801 -django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po,sha256=OVcS-3tlMJS_T58qnZbWLGczHwFyAjbuWr35YwuxAVM,5082 -django/contrib/admin/locale/da/LC_MESSAGES/django.mo,sha256=7_hYoJ5S8Qki7Cff0RLkSIPHtPeHZrtMBBaDF0vIKX8,18049 -django/contrib/admin/locale/da/LC_MESSAGES/django.po,sha256=GUxYk2nbLZ5GmA_ACJYentMSKPYNDfKulg5DymVMe_Q,19457 -django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo,sha256=FSnUEFocN91NyAaDmEQn7Rsit95EYpTrAeleHu-zREM,5500 -django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po,sha256=tNhgrEX4KTmYSPq7VqPr8aH3Ea8WFxf4CNjakmXkFMs,6415 -django/contrib/admin/locale/de/LC_MESSAGES/django.mo,sha256=v2tKhZL-KDMv4UDzNuUgXDEIIoE787wFfpKHk0PUTHU,18731 -django/contrib/admin/locale/de/LC_MESSAGES/django.po,sha256=lNY-xVF6alq55oF3Jn6wj2WWb2j9HO52OUVVxxqDHOQ,20259 -django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo,sha256=kdve4d181AhGDekHiaxt79iyVWvahp3k9SN3H6Xx_9w,6130 -django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po,sha256=tb25boxPrggqnB7mB2M5iyZ6CEM87PBZNa_JzaOXFF4,6921 -django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo,sha256=JfYepG0p5kaXbQqajK51A7navCp3r1Ng_EK44MMR07o,19107 -django/contrib/admin/locale/dsb/LC_MESSAGES/django.po,sha256=yTLufP5D0AR0Bo5LLxuGqrSYMoZ9tQISgdv1k_OvFGM,20359 -django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo,sha256=Xc2t4DzTEakQT0lEvZzEEC8GshU4e2XMR0JO1wWfEpI,6133 -django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po,sha256=HJ0YGiQ-rjSYUrXBCZyslvz0BOOSp9_hd0YszIy_ihE,6945 -django/contrib/admin/locale/el/LC_MESSAGES/django.mo,sha256=54kG_94nJigDgJpZM8Cy58G_AGLdS5csJFEjTTvJBfM,22968 -django/contrib/admin/locale/el/LC_MESSAGES/django.po,sha256=f2gUQtedb0sZCBxAoy3hP2rGXT9ysP5UTOlCBvu2NvI,24555 -django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo,sha256=cix1Bkj2hYO_ofRvtPDhJ9rBnTR6-cnKCFKpZrsxJ34,6509 -django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po,sha256=R05tMMuQEjVQpioy_ayQgFBlLM4WdwXthkMguW6ga24,7339 -django/contrib/admin/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/admin/locale/en/LC_MESSAGES/django.po,sha256=bFTihRbMdNnasQx7HzUzERlTYFhu6lItoRdgMFeIRvs,25651 -django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po,sha256=VncMFkFMuX0jMarJQtEfPJ8mMwLeCcr1WETUY79xvGs,8709 -django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo,sha256=QEvxPxDqNUmq8NxN-8c_F6KMEcWWum3YzERlc3_S_DM,16191 -django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po,sha256=BoVuGaPoGdQcF3zdgGRxrNKSq2XLHTvKfINCyU8t86Y,17548 -django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo,sha256=s0qPS8TjODtPo4miSznQfS6M8CQK9URDeMKeQsp7DK4,5001 -django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po,sha256=YecPU6VmUDDNNIzZVl2Wgd6lNRp3msJaW8FhdHMtEyc,5553 -django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo,sha256=pFkTMRDDj76WA91wtGPjUB7Pq2PN7IJEC54Tewobrlc,11159 -django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po,sha256=REUJMGLGRyDMkqh4kJdYXO9R0Y6CULFVumJ_P3a0nv0,15313 -django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo,sha256=hW325c2HlYIIdvNE308c935_IaDu7_qeP-NlwPnklhQ,3147 -django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po,sha256=Ol5j1-BLbtSIDgbcC0o7tg_uHImcjJQmkA4-kSmZY9o,4581 -django/contrib/admin/locale/eo/LC_MESSAGES/django.mo,sha256=zAeGKzSNit2LNNX97WXaARyzxKIasOmTutcTPqpRKAE,14194 -django/contrib/admin/locale/eo/LC_MESSAGES/django.po,sha256=LHoYvbenD9A05EkHtOk8raW7aKyyiqN50d6OHMxnAZY,17258 -django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo,sha256=hGXULxueBP24xSZ0StxfFCO0vwZZME7OEERxgnWBqcI,4595 -django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po,sha256=enHGjcvH_B0Z9K2Vk391qHAKT7QamqUcx8xPzYLQltA,5698 -django/contrib/admin/locale/es/LC_MESSAGES/django.mo,sha256=vKcsIAL0TDBolkBdzj0d8N60blUfGIHwTvN1r_tp3h4,19193 -django/contrib/admin/locale/es/LC_MESSAGES/django.po,sha256=5640-lfFYuO7ZsJ41VtaHdhvpqdPNtadbt88SK95xo4,21302 -django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo,sha256=GH3zJZEVfJc_REXoYwaCNzhL4EHJosWa7qDmeFRWbco,6347 -django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po,sha256=aqR-EZ2XUWNclkSxVa1xKFdaZpw7sQMORSMMINDRjlQ,7290 -django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo,sha256=qXxQAVqtOJgMuZjLfCNlYiuUzRaOaV3HJrOuOxxVtfI,19306 -django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po,sha256=LneQnuXj05NnsJkvN3h4NZjqeNiXUVzTufIQ19K7004,20616 -django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo,sha256=wiF10mZhUPy8G5fcMpAqKPKqk-aMhHAoKnRY6yBVMmY,6131 -django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po,sha256=Rl_mJ_AsM-ld2hfS069gm0xuxyd1T34FtIBT-q2iBY8,6871 -django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo,sha256=0k8kSiwIawYCa-Lao0uetNPLUzd4m_me3tCAVBvgcSw,15156 -django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po,sha256=4T_syIsVY-nyvn5gEAtfN-ejPrJSUpNT2dmzufxaBsE,17782 -django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo,sha256=PLS10KgX10kxyy7MUkiyLjqhMzRgkAFGPmzugx9AGfs,3895 -django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po,sha256=Y4bkC8vkJE6kqLbN8t56dR5670B06sB2fbtVzmQygK8,5176 -django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo,sha256=O8CbY83U4fTvvPPuONtlMx6jpA-qkrYxNTkLuMrWiRQ,11517 -django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po,sha256=8MSKNxhHMp0ksr5AUUAbs_H6MtMjIqkaFwmaJlBxELs,16307 -django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo,sha256=2w3CMJFBugP8xMOmXsDU82xUm8cWGRUGZQX5XjiTCpM,3380 -django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po,sha256=OP9cBsdCf3zZAXiKBMJPvY1AHwC_WE1k2vKlzVCtUec,4761 -django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo,sha256=himCORjsM-U3QMYoURSRbVv09i0P7-cfVh26aQgGnKg,16837 -django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po,sha256=mlmaSYIHpa-Vp3f3NJfdt2RXB88CVZRoPEMfl-tccr0,18144 -django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo,sha256=Zy-Hj_Mr2FiMiGGrZyssN7GZJrbxRj3_yKQFZKR36Ro,4635 -django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po,sha256=RI8CIdewjL3bAivniMOl7lA9tD7caP4zEo2WK71cX7c,5151 -django/contrib/admin/locale/et/LC_MESSAGES/django.mo,sha256=-OGEknBvQAJcdZ-6MQBL4TOUyzvplOcXwKqqkUE5IFg,17675 -django/contrib/admin/locale/et/LC_MESSAGES/django.po,sha256=Y0l9bxGkEi8nsirIAw0VkyzbHwMbAaGmZ_0aLKUaLMA,19241 -django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo,sha256=j38AhwE8uWvn5bVeiXMwo2EHg3azFq192pWsTXw1y0w,4951 -django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po,sha256=KpyLe4R3JG4Ill-9vduLayus83IDnf53k7t1zjP3qag,6084 -django/contrib/admin/locale/eu/LC_MESSAGES/django.mo,sha256=CBk_9H8S8LlK8hfGQsEB7IgSms-BsURzAFrX9Zrsw4c,15009 -django/contrib/admin/locale/eu/LC_MESSAGES/django.po,sha256=9vnPgJRPcdSa4P5rguB5zqWQC1xAt4POzDw-mSD8UHs,17489 -django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo,sha256=vKtO_mbexiW-EO-L-G0PYruvc8N7GOF94HWQCkDnJNQ,4480 -django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po,sha256=BAWU-6kH8PLBxx_d9ZeeueB_lV5KFXjbRJXgKN43nQ4,5560 -django/contrib/admin/locale/fa/LC_MESSAGES/django.mo,sha256=Y01G4go-V_BZ1aR7u5Z9StnqL0BS5kvj2ZlSfffhToY,20889 -django/contrib/admin/locale/fa/LC_MESSAGES/django.po,sha256=1q914M9N6NfUgP72mIhTRMYukc1r-GpVV5Pt4qESTTM,23054 -django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo,sha256=MAje4ub3vWYhiKrVR_LvxAIqkvOlFpVcXQEBz3ezlPs,6050 -django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po,sha256=1nzEmRuswDmyCCMShGH2CYdjMY7tUuedfN4kDCEnTCM,6859 -django/contrib/admin/locale/fi/LC_MESSAGES/django.mo,sha256=qXNAKLeJGOXu06lWQH2EjAf88Sz28QkN6Sk169nLP8w,17498 -django/contrib/admin/locale/fi/LC_MESSAGES/django.po,sha256=LnWw3QvvRKL3QIdb73TWvILZPSO5u7AXOO2w_SeyPqA,19207 -django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo,sha256=7dJwmO361wJAxrRJ3YEeBlJi2r7NXQNOfEeOj_j3uKE,4993 -django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po,sha256=ze5Z223mNN1lpYNk6WpPgxCRVgK_VMLWDWmNBc-rAz4,6153 -django/contrib/admin/locale/fr/LC_MESSAGES/django.mo,sha256=P609TUMJa9rmp_7yEkgB8TEgl7SZ6GwrAHVcYeH-rb0,19999 -django/contrib/admin/locale/fr/LC_MESSAGES/django.po,sha256=vp35en0d6dP7pNE4HvN0Sla9Pigt1VcnfhgQZH8896g,21373 -django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo,sha256=gM98dOd3FGvot4V-RNNbL8FV6TBFTTcB4oEbNx1qjqs,6080 -django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po,sha256=wqs3ZbFNgkBGbFOmnlE_6TrM2n-TP0Tn1UT6WYsVCmM,6891 -django/contrib/admin/locale/fy/LC_MESSAGES/django.mo,sha256=mWnHXGJUtiewo1F0bsuJCE_YBh7-Ak9gjTpwjOAv-HI,476 -django/contrib/admin/locale/fy/LC_MESSAGES/django.po,sha256=oSKEF_DInUC42Xzhw9HiTobJjE2fLNI1VE5_p6rqnCE,10499 -django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po,sha256=efBDCcu43j4SRxN8duO5Yfe7NlpcM88kUPzz-qOkC04,2864 -django/contrib/admin/locale/ga/LC_MESSAGES/django.mo,sha256=2Qn62CmOwgNaeLnV6JE2dNVl9tSZaYGGx5NG8X6g6Z0,19428 -django/contrib/admin/locale/ga/LC_MESSAGES/django.po,sha256=00HFcdeQmjvrTyfUz4I8cFM_bYqF5bLX5pwFht-iPO0,20913 -django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo,sha256=Cdx01Gpcs6wYEnpSif1r4O9gKj-YL__IXfBaL-Wx0u0,6910 -django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po,sha256=7u1ncj7NVTb54Yak8wMFqCKHfjtb6EfFouhT2sbQlIg,7828 -django/contrib/admin/locale/gd/LC_MESSAGES/django.mo,sha256=HEqiGvjMp0NnfIS0Z-c1i8SicEtMPIg8LvNMh-SXiPg,18871 -django/contrib/admin/locale/gd/LC_MESSAGES/django.po,sha256=cZWnJyEoyGFLbk_M4-eddTJLKJ0dqTIlIj4w6YwcjJg,20139 -django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo,sha256=QA2_hxHGzt_y0U8sAGQaT27IvvyWrehLPKP2X1jAvEs,5904 -django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po,sha256=KyYGpFHq2E55dK005xzH0I2RD-C2kD6BlJi8bcMjtRA,6540 -django/contrib/admin/locale/gl/LC_MESSAGES/django.mo,sha256=0sPdq8aidlYj1CYL0on_rwwp80oN1Ex-vw2pehBon-M,18542 -django/contrib/admin/locale/gl/LC_MESSAGES/django.po,sha256=GFJrhH0aQZsLrUe4Dbzwi7BDtp7KRyklnnzZFr2-BqU,20074 -django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo,sha256=AePXV8VZToob6vNEsOqyuijJYv-QxRfBO7BrBUgLi_Q,6083 -django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po,sha256=eDMuV05SuQrACfcovaPb8Zsk8hP4g1GMx6507QNFAko,6868 -django/contrib/admin/locale/he/LC_MESSAGES/django.mo,sha256=VZaL7Hch0Z6Tc4rjk7FQvmggs5lb02fOAhASZZqjc4s,19315 -django/contrib/admin/locale/he/LC_MESSAGES/django.po,sha256=ZOGxDZnsChfmb54BCx9aK__EaB3cPdscqK_MjfnCkUs,21094 -django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo,sha256=E-ZlEnXIeJIkXWcthR9kgNJBzDp6gT7mKKDUpEVqM7k,6893 -django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po,sha256=1tenNpIJmcT5wTRNETkSO7cDlDlL1Mqpnb-klRlHw-s,7809 -django/contrib/admin/locale/hi/LC_MESSAGES/django.mo,sha256=yWjTYyrVxXxwBWgPsC7IJ9IxL_85v378To4PCEEcwuI,13811 -django/contrib/admin/locale/hi/LC_MESSAGES/django.po,sha256=FpKFToDAMsgc1aG6-CVpi5wAxhMQjkZxz_89kCiKmS4,19426 -django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo,sha256=yCUHDS17dQDKcAbqCg5q8ualaUgaa9qndORgM-tLCIw,4893 -django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po,sha256=U9rb5tPMICK50bRyTl40lvn-tvh6xL_6o7xIPkzfKi0,6378 -django/contrib/admin/locale/hr/LC_MESSAGES/django.mo,sha256=3TR3uFcd0pnkDi551WaB9IyKX1aOazH7USxqc0lA0KQ,14702 -django/contrib/admin/locale/hr/LC_MESSAGES/django.po,sha256=qcW7tvZoWZIR8l-nMRexGDD8VlrOD7l5Fah6-ecilMk,17378 -django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo,sha256=KR34lviGYh1esCkPE9xcDE1pQ_q-RxK1R2LPjnG553w,3360 -django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po,sha256=w7AqbYcLtu88R3KIKKKXyRt2gwBBBnr-ulxONWbw01I,4870 -django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo,sha256=Jz72ZNFNAgewJWjKwEHB_Y5wh9peiZbyRVpZxgLa_QI,18884 -django/contrib/admin/locale/hsb/LC_MESSAGES/django.po,sha256=j7TRlgvm8DlTfkZOS1ZoDHBBopycZoqXdQ8IOh3lck8,20138 -django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo,sha256=VExZu8naS_aoFQLW0RvmqiuRV14V47J1tDA6_ym5QlY,6166 -django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po,sha256=dwM7DDrRNyZlH-wkO49BbocQVhjm7EWYJnm7xOs8i_Q,6987 -django/contrib/admin/locale/hu/LC_MESSAGES/django.mo,sha256=WXCxQ4oYXpLFnjF4rVz0GLuMFlWym9aY_Em2adOGkMk,18298 -django/contrib/admin/locale/hu/LC_MESSAGES/django.po,sha256=Kab_Fw3nsX60cnlf1-olgqFQOdZsmomkqCqCospnMI4,20172 -django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo,sha256=tXeG5F6_Yh6qHmNUNrlgzavH1Wc8NZb3fj4oEW9qE_M,6034 -django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po,sha256=pvn7ae43zgVp3mpjXPI7_JCqvQLaHZZF7hTasP2uZx0,6854 -django/contrib/admin/locale/hy/LC_MESSAGES/django.mo,sha256=Dcx9cOsYBfbgQgoAQoLhn_cG1d2sKGV6dag4DwnUTaY,18274 -django/contrib/admin/locale/hy/LC_MESSAGES/django.po,sha256=CnQlRZ_DUILMIqVEgUTT2sufAseEKJHHjWsYr_LAqi8,20771 -django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo,sha256=ttfGmyEN0-3bM-WmfCge2lG8inubMPOzFXfZrfX9sfw,5636 -django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po,sha256=jf94wzUOMQaKSBR-77aijQXfdRAqiYSeAQopiT_8Obc,6046 -django/contrib/admin/locale/ia/LC_MESSAGES/django.mo,sha256=SRKlr8RqW8FQhzMsXdA9HNqttO3hc0xf4QdQJd4Dy8c,11278 -django/contrib/admin/locale/ia/LC_MESSAGES/django.po,sha256=pBQLQsMinRNh0UzIHBy3qEW0etUWMhFALu4-h-woFyE,15337 -django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo,sha256=28MiqUf-0-p3PIaongqgPQp2F3D54MLAujPslVACAls,3177 -django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po,sha256=CauoEc8Fiowa8k6K-f9N8fQDle40qsgtXdNPDHBiudQ,4567 -django/contrib/admin/locale/id/LC_MESSAGES/django.mo,sha256=8a5qgQa9978ugGkZmCoTNn3X5_QQ0bkSUSE_uOeBQcE,17343 -django/contrib/admin/locale/id/LC_MESSAGES/django.po,sha256=8hP0m4Prd_ycZgbbJamddgCgeL7QpWrfRmkyVytoZB0,19186 -django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo,sha256=wCT5EADe3TNp4o3g5Q0IlxQTXAAEck0MdXgJvLa1Y3I,4764 -django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po,sha256=0tPwEvM4at_kxL-oo7hcJRluOgY-MGR6elGjvDLAwGg,5933 -django/contrib/admin/locale/io/LC_MESSAGES/django.mo,sha256=URiYZQZpROBedC-AkpVo0q3Tz78VfkmwN1W7j6jYpMo,12624 -django/contrib/admin/locale/io/LC_MESSAGES/django.po,sha256=y0WXY7v_9ff-ZbFasj33loG-xWlFO8ttvCB6YPyF7FQ,15562 -django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo,sha256=nMu5JhIy8Fjie0g5bT8-h42YElCiS00b4h8ej_Ie-w0,464 -django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po,sha256=WLh40q6yDs-8ZG1hpz6kfMQDXuUzOZa7cqtEPDywxG4,2852 -django/contrib/admin/locale/is/LC_MESSAGES/django.mo,sha256=csD3bmz3iQgLLdSqCKOmY_d893147TvDumrpRVoRTY0,16804 -django/contrib/admin/locale/is/LC_MESSAGES/django.po,sha256=tXgb3ARXP5tPa5iEYwwiHscDGfjS5JgIV2BsUX8OnjE,18222 -django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo,sha256=Z3ujWoenX5yYTAUmHUSCvHcuV65nQmYKPv6Jo9ygx_c,5174 -django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po,sha256=YPf4XqfnpvrS9irAS8O4G0jgU5PCoQ9C-w3MoDipelk,5847 -django/contrib/admin/locale/it/LC_MESSAGES/django.mo,sha256=N_pVjbd3SkV4xtFMvwtlwRWo_ulGR83SzKcPD8wiFgY,18505 -django/contrib/admin/locale/it/LC_MESSAGES/django.po,sha256=hVYj4UvphkCqlFzH6NtyRAZgGewCKNjVnON0vHtxGKY,20338 -django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo,sha256=jwic05InfrZW6AE0qdIAFKXAU3mm92GXYlgmGGzEr5w,5134 -django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po,sha256=LpmJI8bX08L08IgK9TW2qS8FcKfY-Z825LzzWsUiUVk,6512 -django/contrib/admin/locale/ja/LC_MESSAGES/django.mo,sha256=Cvue4zVcYA-3T0l6jKFglMDhzqNeLuGKKdTZ-JsZM4o,19945 -django/contrib/admin/locale/ja/LC_MESSAGES/django.po,sha256=DpjilJj0IrkqRNsegdDCs9_VzokjHA8j8NIXrg6Th4U,21521 -django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo,sha256=XBOtJbkByhQEMUxvnqSr1XhBCe-DsII4Ke5pISJZAb8,6233 -django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po,sha256=SrJeh3-t73Z2gY7nVP01cgZE6H11pryDms1pqrQKjnw,6968 -django/contrib/admin/locale/ka/LC_MESSAGES/django.mo,sha256=n33wMaQ3bUTJYif0xA8qzIC7mNh7z3M3pZrm23JGho0,18396 -django/contrib/admin/locale/ka/LC_MESSAGES/django.po,sha256=9671xMS7zW5bgE5OmDskZdLcI9fDLL4qZekN0n-y7ZA,23001 -django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo,sha256=GlPU3qUavvU0FXPfvCl-8KboYhDOmMsKM-tv14NqOac,5516 -django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po,sha256=jDpB9c_edcLoFPHFIogOSPrFkssOjIdxtCA_lum8UCs,6762 -django/contrib/admin/locale/kab/LC_MESSAGES/django.mo,sha256=9QKEWgr8YQV17OJ14rMusgV8b79ZgOOsX4aIFMZrEto,3531 -django/contrib/admin/locale/kab/LC_MESSAGES/django.po,sha256=cSOG_HqsNE4tA5YYDd6txMFoUul8d5UKvk77ZhaqOK0,11711 -django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo,sha256=nqwZHJdtjHUSFDJmC0nPNyvWcAdcoRcN3f-4XPIItvs,1844 -django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po,sha256=tF3RH22p2E236Cv6lpIWQxtuPFeWOvJ-Ery3vBUv6co,3713 -django/contrib/admin/locale/kk/LC_MESSAGES/django.mo,sha256=f2WU3e7dOz0XXHFFe0gnCm1MAPCJ9sva2OUnWYTHOJg,12845 -django/contrib/admin/locale/kk/LC_MESSAGES/django.po,sha256=D1vF3nqANT46f17Gc2D2iGCKyysHAyEmv9nBei6NRA4,17837 -django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo,sha256=cBxp5pFJYUF2-zXxPVBIG06UNq6XAeZ72uRLwGeLbiE,2387 -django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po,sha256=Y30fcDpi31Fn7DU7JGqROAiZY76iumoiW9qGAgPCCbU,4459 -django/contrib/admin/locale/km/LC_MESSAGES/django.mo,sha256=eOe9EcFPzAWrTjbGUr-m6RAz2TryC-qHKbqRP337lPY,10403 -django/contrib/admin/locale/km/LC_MESSAGES/django.po,sha256=RSxy5vY2sgC43h-9sl6eomkFvxClvH_Ka4lFiwTvc2I,17103 -django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo,sha256=Ja8PIXmw6FMREHZhhBtGrr3nRKQF_rVjgLasGPnU95w,1334 -django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po,sha256=LH4h4toEgpVBb9yjw7d9JQ8sdU0WIZD-M025JNlLXAU,3846 -django/contrib/admin/locale/kn/LC_MESSAGES/django.mo,sha256=955iPq05ru6tm_iPFVMebxwvZMtEa5_7GaFG1mPt6HU,9203 -django/contrib/admin/locale/kn/LC_MESSAGES/django.po,sha256=-4YAm0MyhS-wp4RQmo0TzWvqYqmzHFNpIBtdQlg_8Dw,16059 -django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo,sha256=kJsCOGf62XOWTKcB9AF6Oc-GqHl2LFtz-qw0spjcU_w,1847 -django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po,sha256=zzl7QZ5DfdyNWrkIqYlpUcZiTdlZXx_ktahyXqM2-0Q,5022 -django/contrib/admin/locale/ko/LC_MESSAGES/django.mo,sha256=p6KdJ_N_6ldE11GUVBTdqxkUxbNOpuyZIdUKBRx0ylI,18653 -django/contrib/admin/locale/ko/LC_MESSAGES/django.po,sha256=DId5G03Rq5i9fIZ8Q21q2ebvtMnDhCyAL_D8-ZPln6E,20882 -django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo,sha256=wZ2hHD7BJgl855rxKburyumBSS7ECkL3kqNv2col5mo,5985 -django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po,sha256=qvndtDKv_TIoeYuEErRb62oSaCeS2iFYkjyZ4m8YKHI,6899 -django/contrib/admin/locale/ky/LC_MESSAGES/django.mo,sha256=eg-TnIzJO4h3q_FS2a1LnCs7qOf5dpNJwvRD99ZZ0GQ,20129 -django/contrib/admin/locale/ky/LC_MESSAGES/django.po,sha256=dWxU3yUAKHUGKdVJbRLkS6fJEefPBk2XM0i2INcRPms,21335 -django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo,sha256=VuBYBwFwIHC27GFZiHY2_4AB0cME2R0Q3juczjOs3G0,5888 -django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po,sha256=uMk9CxL1wP45goq2093lYMza7LRuO4XbVo5RRWlsbaE,6432 -django/contrib/admin/locale/lb/LC_MESSAGES/django.mo,sha256=8GGM2sYG6GQTQwQFJ7lbg7w32SvqgSzNRZIUi9dIe6M,913 -django/contrib/admin/locale/lb/LC_MESSAGES/django.po,sha256=PZ3sL-HvghnlIdrdPovNJP6wDrdDMSYp_M1ok6dodrw,11078 -django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po,sha256=fiMelo6K0_RITx8b9k26X1R86Ck2daQXm86FLJpzt20,2862 -django/contrib/admin/locale/lt/LC_MESSAGES/django.mo,sha256=SpaNUiaGtDlX5qngVj0dWdqNLSin8EOXXyBvRM9AnKg,17033 -django/contrib/admin/locale/lt/LC_MESSAGES/django.po,sha256=tHnRrSNG2ENVduP0sOffCIYQUn69O6zIev3Bb7PjKb0,18497 -django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo,sha256=vZtnYQupzdTjVHnWrtjkC2QKNpsca5yrpb4SDuFx0_0,5183 -django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po,sha256=dMjFClA0mh5g0aNFTyHC8nbYxwmFD0-j-7gCKD8NFnw,5864 -django/contrib/admin/locale/lv/LC_MESSAGES/django.mo,sha256=zK7XQX-c6k1Z4RRG51vyB5X_26Lqn04pT5uTINLrHPM,18542 -django/contrib/admin/locale/lv/LC_MESSAGES/django.po,sha256=WJxNigpPFjrRyo2yckHkQAXAi020jDwjF8WfvzTlxLA,20096 -django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo,sha256=5A8qvCy1kWVAURhIa6kuFg7Hmab2DM2myyNrc0YjtnU,5863 -django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po,sha256=C69gDh6sfIJJ-O1KzPm9QEGk0bSZ46ORUzjJZobF8GI,6789 -django/contrib/admin/locale/mk/LC_MESSAGES/django.mo,sha256=xcKetKf7XcO-4vbWEIoI2c40gRE2twuiINaby6ypO7Q,17948 -django/contrib/admin/locale/mk/LC_MESSAGES/django.po,sha256=hx2peq-wztDHtiST_zZ58c7rjZ6jSvDDXhVOTmyUDzI,21063 -django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo,sha256=8BkWjadml2f1lDeH-IULdxsogXSK8NpVuu293GvcQc8,4719 -django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po,sha256=u9mVSzbIgA1uRgV_L8ZOZLelyknoKFvXH0HbBurezf8,6312 -django/contrib/admin/locale/ml/LC_MESSAGES/django.mo,sha256=4Y1KAip3NNsoRc9Zz3k0YFLzes3DNRFvAXWSTBivXDk,20830 -django/contrib/admin/locale/ml/LC_MESSAGES/django.po,sha256=jL9i3kmOnoKYDq2RiF90WCc55KeA8EBN9dmPHjuUfmo,24532 -django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo,sha256=COohY0mAHAOkv1eNzLkaGZy8mimXzcDK1EgRd3tTB_E,6200 -django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po,sha256=NvN0sF_w5tkc3bND4lBtCHsIDLkwqdEPo-8wi2MTQ14,7128 -django/contrib/admin/locale/mn/LC_MESSAGES/django.mo,sha256=4F-sUl2nbogJa9uqKo9i-0Pz5zkxxZaKpnO_TBzohbw,21299 -django/contrib/admin/locale/mn/LC_MESSAGES/django.po,sha256=jWEucuA4qXgy-EPHkQgJtQjxxYj-TWl0Q5rhU6Ae_4Q,23291 -django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo,sha256=H7fIPdWTK3_iuC0WRBJdfXN8zO77p7-IzTviEUVQJ2U,5228 -django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po,sha256=vJIqqVG34Zd7q8-MhTgZcXTtl6gukOSb6egt70AOyAc,5757 -django/contrib/admin/locale/mr/LC_MESSAGES/django.mo,sha256=EjCGk0HN2GVziGRzauuCLc_27nku35v6RS7U2JT-0b8,21226 -django/contrib/admin/locale/mr/LC_MESSAGES/django.po,sha256=S4FBjh2JG08XYvKRTlPBV9vdhqG32TJGkVQn6Tr3RH0,24770 -django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo,sha256=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 -django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po,sha256=uGe9kH2mwrab97Ue77oggJBlrpzZNckKGRUMU1vaigs,2856 -django/contrib/admin/locale/ms/LC_MESSAGES/django.mo,sha256=Xj5v1F4_m1ZFUn42Rbep9eInxIV-NE-oA_NyfQkbp00,16840 -django/contrib/admin/locale/ms/LC_MESSAGES/django.po,sha256=ykFH-mPbv2plm2NIvKgaj3WVukJ3SquU8nQIAXuOrWA,17967 -django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo,sha256=9VY_MrHK-dGOIkucLCyR9psy4o5p4nHd8kN_5N2E-gY,5018 -django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po,sha256=P4GvM17rlX1Vl-7EbCyfWVasAJBEv_RvgWEvfJqcErA,5479 -django/contrib/admin/locale/my/LC_MESSAGES/django.mo,sha256=xvlgM0vdYxZuA7kPQR7LhrLzgmyVCHAvqaqvFhKX9wY,3677 -django/contrib/admin/locale/my/LC_MESSAGES/django.po,sha256=zdUCYcyq2-vKudkYvFcjk95YUtbMDDSKQHCysmQ-Pvc,12522 -django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo,sha256=1fS9FfWi8b9NJKm3DBKETmuffsrTX-_OHo9fkCCXzpg,3268 -django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po,sha256=-z1j108uoswi9YZfh3vSIswLXu1iUKgDXNdZNEA0yrA,5062 -django/contrib/admin/locale/nb/LC_MESSAGES/django.mo,sha256=viQKBFH6ospYn2sE-DokVJGGYhSqosTgbNMn5sBVnmM,16244 -django/contrib/admin/locale/nb/LC_MESSAGES/django.po,sha256=x0ANRpDhe1rxxAH0qjpPxRfccCvR73_4g5TNUdJqmrc,17682 -django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo,sha256=KwrxBpvwveERK4uKTIgh-DCc9aDLumpHQYh5YroqxhQ,4939 -django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po,sha256=ygn6a5zkHkoIYMC8Hgup8Uw1tMbZcLGgwwDu3x33M-o,5555 -django/contrib/admin/locale/ne/LC_MESSAGES/django.mo,sha256=yrm85YXwXIli7eNaPyBTtV7y3TxQuH4mokKuHdAja2A,15772 -django/contrib/admin/locale/ne/LC_MESSAGES/django.po,sha256=F8vfWKvSNngkLPZUIwik_qDYu0UAnrWepbI9Z9Iz35g,20400 -django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo,sha256=mJdtpLT9k4vDbN9fk2fOeiy4q720B3pLD3OjLbAjmUI,5362 -django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po,sha256=N91RciTV1m7e8-6Ihod5U2xR9K0vrLoFnyXjn2ta098,6458 -django/contrib/admin/locale/nl/LC_MESSAGES/django.mo,sha256=FKCQ39RbxWddBA-Id8W-hxgH0tkixJkVctP1laEXJEU,18565 -django/contrib/admin/locale/nl/LC_MESSAGES/django.po,sha256=zRaeZKxUZbi-0CL9BBr-X0j5HOJvvrJ94u8jw3sbaaA,20308 -django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo,sha256=iWjyDgay1LIiS6C-Zl33inFKxzM2LFQPIWyKEw2x6Is,6122 -django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po,sha256=xZjgzxEEWMG2ofgSfLNUU0abr9Y_cUpXIHsmjKBGyig,7217 -django/contrib/admin/locale/nn/LC_MESSAGES/django.mo,sha256=yAdb8Yew1ARlnAnvd5gHL7-SDzpkXedBwCSSPEzGCKk,16504 -django/contrib/admin/locale/nn/LC_MESSAGES/django.po,sha256=sFxr3UYzltQRqiotm_d5Qqtf8iLXI0LgCw_V6kYffJ0,17932 -django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo,sha256=RsDri1DmCwrby8m7mLWkFdCe6HK7MD7GindOarVYPWc,4939 -django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po,sha256=koVTt2mmdku1j7SUDRbnug8EThxXuCIF2XPnGckMi7A,5543 -django/contrib/admin/locale/os/LC_MESSAGES/django.mo,sha256=c51PwfOeLU2YcVNEEPCK6kG4ZyNc79jUFLuNopmsRR8,14978 -django/contrib/admin/locale/os/LC_MESSAGES/django.po,sha256=yugDw7iziHto6s6ATNDK4yuG6FN6yJUvYKhrGxvKmcY,18188 -django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo,sha256=0gMkAyO4Zi85e9qRuMYmxm6JV98WvyRffOKbBVJ_fLQ,3806 -django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po,sha256=skiTlhgUEN8uKk7ihl2z-Rxr1ZXqu5qV4wB4q9qXVq0,5208 -django/contrib/admin/locale/pa/LC_MESSAGES/django.mo,sha256=EEitcdoS-iQ9QWHPbJBK2ajdN56mBi0BzGnVl3KTmU4,8629 -django/contrib/admin/locale/pa/LC_MESSAGES/django.po,sha256=xscRlOkn9Jc8bDsSRM5bzQxEsCLMVsV-Wwin0rfkHDI,16089 -django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo,sha256=Hub-6v7AfF-tWhw53abpyhnVHo76h_xBgGIhlGIcS70,1148 -django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po,sha256=7L8D4qqhq53XG83NJUZNoM8zCCScwMwzsrzzsyO4lHY,4357 -django/contrib/admin/locale/pl/LC_MESSAGES/django.mo,sha256=vEXmLs91RT5SDsHxg0_YPSBD6ebdykzTCssn3wBB3o0,19332 -django/contrib/admin/locale/pl/LC_MESSAGES/django.po,sha256=7mef7t_-rYkMMJqVGADhSasmInQDCYK1e0avjeEA24E,21262 -django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo,sha256=tJJS-jnZ4jhlVD-Y4cv6Z8VLpncNsNiG_F8bSeNIMJ0,6243 -django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po,sha256=NAUXRaDGWCdQUc72ddPHPqGLmgUpTZioG8z192WzAwE,7442 -django/contrib/admin/locale/pt/LC_MESSAGES/django.mo,sha256=X-OQSJtwknzY4mxbbcSPDPByLdXDs8dAJ3I7kDyMl3w,18410 -django/contrib/admin/locale/pt/LC_MESSAGES/django.po,sha256=21uwgQYsVCu9PWWO0DYriAZeeotqDcjqix1dZlWX0gw,20338 -django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo,sha256=i-axQzjqvApQ0LPULaZpvrXTZsaNxsqqU4SFsF6tP_A,4667 -django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po,sha256=bIWMMsCL2VlZi-XYfRYwYub__w7xI-VX71jQJ12IAeY,6245 -django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo,sha256=VFGVGpK6iSfh1bIwz_99Ioah4LOQR0GHdKCIaSFuQKs,18810 -django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po,sha256=qW8ZpwonsMz1PhLPDMPKNCoz05S2Yczl4t-njKxH-ZQ,21437 -django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo,sha256=xvi5ZdYPvbQ9xDFLn8B_twhZeP77rPUOj42nEoeI1IY,6329 -django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po,sha256=-8OovJeLBnTxCEXDf8IPlhoMB_k6De6dxMcV9Jzr1Yw,7492 -django/contrib/admin/locale/ro/LC_MESSAGES/django.mo,sha256=SEbnJ1aQ3m2nF7PtqzKvYYCdvgg_iG5hzrdO_Xxiv_k,15157 -django/contrib/admin/locale/ro/LC_MESSAGES/django.po,sha256=wPfGo9yi3j28cwikkogZ_erQKtUZ9WmzdZ2FuMVugFE,18253 -django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo,sha256=voEqSN3JUgJM9vumLxE_QNPV7kA0XOoTktN7E7AYV6o,4639 -django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po,sha256=SO7FAqNnuvIDfZ_tsWRiwSv91mHx5NZHyR2VnmoYBWY,5429 -django/contrib/admin/locale/ru/LC_MESSAGES/django.mo,sha256=scHv1IpdVCHwdVVxWAdW1Q0yT7SgoLz6paIYWiLZIEA,24187 -django/contrib/admin/locale/ru/LC_MESSAGES/django.po,sha256=OeUyRdR9uihQ912OU1cPPCD1nnkVqt_y46ENTI6SlUE,25938 -django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo,sha256=TE4M5XbCJ3tX4pTzyTbLG_xjtCtqZzVg1ZXSxeSXgcU,8392 -django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po,sha256=owCCQnZqwfIOG3zZucZPwOh47TnDS59ItQwzYeEexvM,9546 -django/contrib/admin/locale/sk/LC_MESSAGES/django.mo,sha256=W1zA58jQsXhHMxwHi6m99yEwV3ku6MtlJgMxdQwpz-E,18945 -django/contrib/admin/locale/sk/LC_MESSAGES/django.po,sha256=p603cCupx37wBIStl1wGm7m_FEmNiZT25aPULwyb18o,20578 -django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo,sha256=sl2PRwXLtikrOiHJ_EEltZivpV5IwT5lmbyfpGCSrLo,6305 -django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po,sha256=-ZcKl0UxOObVuB_8My20fdjCrV51drP4w-yan3X-RKk,7275 -django/contrib/admin/locale/sl/LC_MESSAGES/django.mo,sha256=rBSsaXNtCo43Cri9Gq_Ueq2IUNMBmzOV6lgMm7xF_p0,15077 -django/contrib/admin/locale/sl/LC_MESSAGES/django.po,sha256=ywIn4PB3xg6Q27NARZ3JRmSvNhcRFKU8nF_gbgA93qg,18281 -django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo,sha256=chhBmd2IkeOONuRlRsOnrPAEbS0tlH4w-G8YKVNRsNI,6146 -django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po,sha256=8mrwhJ1Geg5TEvJY40COC7bZl7cyIecRhLyqLjBqBAQ,6975 -django/contrib/admin/locale/sq/LC_MESSAGES/django.mo,sha256=TjnBVlaEf0HO0__Utcgr-2SnyGG6Lw6QYRmYj6yjcwQ,18247 -django/contrib/admin/locale/sq/LC_MESSAGES/django.po,sha256=QgzzyulFel5dx28KHCvopbbMdsLJSyfry3mF8GKaNJU,19909 -django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo,sha256=RKoR8Vy1B2hygTolUKdjIGVdXPnH-E5VvMK5r3lkAak,5682 -django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po,sha256=uPSheZAzII01ZIrLq6iua2Qkm7oUgLLZGqdDiWMVxIA,6462 -django/contrib/admin/locale/sr/LC_MESSAGES/django.mo,sha256=1NOxq8YqqjMVS7nfzF3jlkUHt3rt-b3OB7-3Y6hIONo,23210 -django/contrib/admin/locale/sr/LC_MESSAGES/django.po,sha256=Nm14mY9Q0hVnCEjLSw-nIRYuPenpVhD5mUcZSM_pvhA,24554 -django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo,sha256=7y-ONe9ozHDPTyw6sVZf5_e6DZvtcFVY20p37wLzKVs,6814 -django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po,sha256=tqmD6zMNA6HyY45nO8wNU7ZTKNwAfrdeifnfOVAJk78,7648 -django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=fyhceLRR3MhL8CCYTQn4k4t95cpsCeh-UGk7F1cCTXU,18522 -django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po,sha256=zemHOPBXqeKXKKoHtXr_YLVdYiSW6_1h6Fufp4pMeyY,33080 -django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo,sha256=sjBvAdlw-uoZ2ADihhA-9q2xQ3X8x2BZ3BSNwKBnuls,5724 -django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po,sha256=-iyPz2KS3rX3DJhyLpRpbCbJS-jL7uwSElv721mMAyo,6512 -django/contrib/admin/locale/sv/LC_MESSAGES/django.mo,sha256=Db4YZlgM2DVL1ApUTz9H6er4qNg6zKInv0D0ZGrFLEM,17447 -django/contrib/admin/locale/sv/LC_MESSAGES/django.po,sha256=J_0RqJHg8O6tGb5H1bBdY62LZEQ5yuCBfPQUsZcL_ho,19564 -django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo,sha256=o0ExbIeEhV8xPC62BLMaaNEw8vQ1JSeYVwUTY4SZjwo,5938 -django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po,sha256=J7KNDezuRJfGIt4-z1-Mm2cKf9lGODrEScs3w3n88y0,6937 -django/contrib/admin/locale/sw/LC_MESSAGES/django.mo,sha256=kiy4ZiBR6SIzF3SIqC3dNLTUDncZ9qjTdiG1AkIuuXk,17698 -django/contrib/admin/locale/sw/LC_MESSAGES/django.po,sha256=Km7ETJkQTpQUyp1r4mEpa3d_rCLbwh4n5DnYF6JLCxc,19082 -django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo,sha256=p0pi6-Zg-qsDVMDjNHO4aav3GfJ3tKKhy6MK7mPtC50,3647 -django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po,sha256=lZFP7Po4BM_QMTj-SXGlew1hqyJApZxu0lxMP-YduHI,4809 -django/contrib/admin/locale/ta/LC_MESSAGES/django.mo,sha256=ZdtNRZLRqquwMk7mE0XmTzEjTno9Zni3mV6j4DXL4nI,10179 -django/contrib/admin/locale/ta/LC_MESSAGES/django.po,sha256=D0TCLM4FFF7K9NqUGXNFE2KfoEzx5IHcJQ6-dYQi2Eg,16881 -django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo,sha256=2-37FOw9Bge0ahIRxFajzxvMkAZL2zBiQFaELmqyhhY,1379 -django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po,sha256=Qs-D7N3ZVzpZVxXtMWKOzJfSmu_Mk9pge5W15f21ihI,3930 -django/contrib/admin/locale/te/LC_MESSAGES/django.mo,sha256=aIAG0Ey4154R2wa-vNe2x8X4fz2L958zRmTpCaXZzds,10590 -django/contrib/admin/locale/te/LC_MESSAGES/django.po,sha256=-zJYrDNmIs5fp37VsG4EAOVefgbBNl75c-Pp3RGBDAM,16941 -django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo,sha256=VozLzWQwrY-USvin5XyVPtUUKEmCr0dxaWC6J14BReo,1362 -django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po,sha256=HI8IfXqJf4I6i-XZB8ELGyp5ZNr-oi5hW9h7n_8XSaQ,3919 -django/contrib/admin/locale/tg/LC_MESSAGES/django.mo,sha256=gJfgsEn9doTT0erBK77OBDi7_0O7Rb6PF9tRPacliXU,15463 -django/contrib/admin/locale/tg/LC_MESSAGES/django.po,sha256=Wkx7Hk2a9OzZymgrt9N91OL9K5HZXTbpPBXMhyE0pjI,19550 -django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo,sha256=SEaBcnnKupXbTKCJchkSu_dYFBBvOTAOQSZNbCYUuHE,5154 -django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po,sha256=CfUjLtwMmz1h_MLE7c4UYv05ZTz_SOclyKKWmVEP9Jg,5978 -django/contrib/admin/locale/th/LC_MESSAGES/django.mo,sha256=EVlUISdKOvNkGMG4nbQFzSn5p7d8c9zOGpXwoHsHNlY,16394 -django/contrib/admin/locale/th/LC_MESSAGES/django.po,sha256=OqhGCZ87VX-WKdC2EQ8A8WeXdWXu9mj6k8mG9RLZMpM,20187 -django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo,sha256=ukj5tyDor9COi5BT9oRLucO2wVTI6jZWclOM-wNpXHM,6250 -django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po,sha256=3L5VU3BNcmfiqzrAWK0tvRRVOtgR8Ceg9YIxL54RGBc,6771 -django/contrib/admin/locale/tk/LC_MESSAGES/django.mo,sha256=f51Ug7txuVeDo1WAywl6oi1aVi1ZJrv94rD4svUobm8,2845 -django/contrib/admin/locale/tk/LC_MESSAGES/django.po,sha256=AXMpn9mSO24azMC5CPHqPZRq-cbk6IpPpaF3Ab3K54k,13309 -django/contrib/admin/locale/tr/LC_MESSAGES/django.mo,sha256=_Mr4BwOhbNColpMONLhdMXkjNk8dUZkxUZp4Ycg7tKo,18754 -django/contrib/admin/locale/tr/LC_MESSAGES/django.po,sha256=ZrO_ZfuutjlqmOYuDWKK3XIBwZF9ekSMkdE4sNNxtSw,20262 -django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo,sha256=ztEhUjpzv7KgWJKAqt9u-C050mgbAo1IIcqYDWN-54U,5561 -django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po,sha256=85ZszztzTP8toRtF44lV1wyAk4A-AyeJNw-3I4moS1c,6345 -django/contrib/admin/locale/tt/LC_MESSAGES/django.mo,sha256=ObJ8zwVLhFsS6XZK_36AkNRCeznoJJwLTMh4_LLGPAA,12952 -django/contrib/admin/locale/tt/LC_MESSAGES/django.po,sha256=VDjg5nDrLqRGXpxCyQudEC_n-6kTCIYsOl3izt1Eblc,17329 -django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo,sha256=Sz5qnMHWfLXjaCIHxQNrwac4c0w4oeAAQubn5R7KL84,2607 -django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po,sha256=_Uh3yH_RXVB3PP75RFztvSzVykVq0SQjy9QtTnyH3Qk,4541 -django/contrib/admin/locale/udm/LC_MESSAGES/django.mo,sha256=2Q_lfocM7OEjFKebqNR24ZBqUiIee7Lm1rmS5tPGdZA,622 -django/contrib/admin/locale/udm/LC_MESSAGES/django.po,sha256=L4TgEk2Fm2mtKqhZroE6k_gfz1VC-_dXe39CiJvaOPE,10496 -django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po,sha256=ZLYr0yHdMYAl7Z7ipNSNjRFIMNYmzIjT7PsKNMT6XVk,2811 -django/contrib/admin/locale/ug/LC_MESSAGES/django.mo,sha256=1U-qjdk6839W4p5g4PL0l5GsehEwM-iPgMgzbvlmZ8Y,23241 -django/contrib/admin/locale/ug/LC_MESSAGES/django.po,sha256=0--xGDGJR01cIhmxISWl23PnRY2xvkKSHUMJLqfCyeA,24559 -django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo,sha256=xC3-Xz8R95NL6EkVKvUuPX4jCwnNA_0sq6PvWEKbZ5I,7306 -django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po,sha256=V3UuGjeYLnfV151Yn_X0QrAYwfqMe6WvoyWJ1QnKsjo,7927 -django/contrib/admin/locale/uk/LC_MESSAGES/django.mo,sha256=S52JL_rhqQRuGtxsz-eZH81FLsJP1AXSE-FA6x_PoCo,22476 -django/contrib/admin/locale/uk/LC_MESSAGES/django.po,sha256=5oZX750hZlGcHhloPU4radKjz6o3FSp-fwd4cUFe60A,24789 -django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo,sha256=mC4E13RjlLqAtsIDCtimSqW96IOIcYIgiD2ddggzFtw,5186 -django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po,sha256=BMhVrEO5nI2yYIKqSd4FfS7rtKFvsYk_O2olgMidp4M,7088 -django/contrib/admin/locale/ur/LC_MESSAGES/django.mo,sha256=HvyjnSeLhUf1JVDy759V_TI7ygZfLaMhLnoCBJxhH_s,13106 -django/contrib/admin/locale/ur/LC_MESSAGES/django.po,sha256=BFxxLbHs-UZWEmbvtWJNA7xeuvO9wDc32H2ysKZQvF4,17531 -django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo,sha256=eYN9Q9KKTV2W0UuqRc-gg7y42yFAvJP8avMeZM-W7mw,2678 -django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po,sha256=Nj-6L6axLrqA0RHUQbidNAT33sXYfVdGcX4egVua-Pk,4646 -django/contrib/admin/locale/uz/LC_MESSAGES/django.mo,sha256=yKpKebwX6RzUwCkvHzEQ_DFRr7x_nGeACRBP0PljTCQ,4634 -django/contrib/admin/locale/uz/LC_MESSAGES/django.po,sha256=bf_EhEV0c-H8MAdvRFb8TrXjgAAFfl8xif2Sw9uip_A,13776 -django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo,sha256=LpuFvNKqNRCCiV5VyRnJoZ8gY3Xieb05YV9KakNU7o8,3783 -django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po,sha256=joswozR3I1ijRapf50FZMzQQhI_aU2XiiSTLeSxkL64,5235 -django/contrib/admin/locale/vi/LC_MESSAGES/django.mo,sha256=coCDRhju7xVvdSaounXO5cMqCmLWICZPJth6JI3Si2c,18077 -django/contrib/admin/locale/vi/LC_MESSAGES/django.po,sha256=Q1etVmaAb1f79f4uVjbNjPkn-_3m2Spz1buNAV3y9lk,19543 -django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo,sha256=45E-fCQkq-BRLzRzsGkw1-AvWlvjL1rdsRFqfsvAq98,5302 -django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po,sha256=k87QvFnt8psnwMXXrFO6TyH6xCyXIDd_rlnWDfl2FAA,5958 -django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=Mqf-2H_QUW3Ex30n_KSWdWufO6gFUYSUsBxdW418huM,17143 -django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po,sha256=0rSHQ8jJ5OuiX5zgBwhswSqM6Z90NO5WASbZkFjTNy4,19234 -django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo,sha256=-oaPtoS-K1iBfmpOtn-_XFuqJaFLFDDFzZ6EToaC8g0,5715 -django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po,sha256=lpJDxzzdngESFzW38Al5DbfQFfTmM59GCGpj8u9f4rA,6853 -django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=tjvQbaw3AyQ3AZKWHll5uf5MrmH3OdQVKGxR1SrzkyI,16957 -django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po,sha256=8PItlXEiAK41xB1uIYa425q9aoW8eJZOm4cnZkKnUHU,18389 -django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo,sha256=JBaUG83WpXkhGaLQ_j6WLkfH_XZ1A_pKzuybXYd5TJY,5267 -django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po,sha256=8wuNRx9HqIde8qCQxWmZgXyJkxs-RF7R1brQAa3eWtU,6085 -django/contrib/admin/migrations/0001_initial.py,sha256=9HFpidmBW2Ix8NcpF1SDXgCMloGER_5XmEu_iYWIMzU,2507 -django/contrib/admin/migrations/0002_logentry_remove_auto_add.py,sha256=LBJ-ZZoiNu3qDtV-zNOHhq6E42V5CoC5a3WMYX9QvkM,553 -django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py,sha256=AnAKgnGQcg5cQXSVo5UHG2uqKKNOdLyPkIJK-q_AGEE,538 -django/contrib/admin/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/admin/migrations/__pycache__/0001_initial.cpython-310.pyc,, -django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-310.pyc,, -django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-310.pyc,, -django/contrib/admin/migrations/__pycache__/__init__.cpython-310.pyc,, -django/contrib/admin/models.py,sha256=qDKzKErTNAl1eEMOD3p-0jJqVDirlZ_CIThW8huwmkk,8500 -django/contrib/admin/options.py,sha256=lwqcC4nxgY9c5eZYwgDPtTNXlwRAE2QWy7fUXzomYcs,101478 -django/contrib/admin/sites.py,sha256=A8VpPnpcJoTtefn8pnfpKQWZIO3WcBFK3nAwgb-sUuQ,23454 -django/contrib/admin/static/admin/css/autocomplete.css,sha256=oZCQKaJleVU68lo5A1fRD1iGzqNgSgtollAc2gVWbaw,9185 -django/contrib/admin/static/admin/css/base.css,sha256=I3Sodc_Y-2_iNrMU2wmftobfyL_HxaJxSDxnhfGCDec,22154 -django/contrib/admin/static/admin/css/changelists.css,sha256=qaNfxJlI_NarKm0IjyTkmtRoNXvOoVHfMhoOvVjbE4M,6878 -django/contrib/admin/static/admin/css/dark_mode.css,sha256=-LoAlrUIbBe3v3WyeCdg-5herhVp9CimpUvqnudCUG4,2808 -django/contrib/admin/static/admin/css/dashboard.css,sha256=iCz7Kkr5Ld3Hyjx_O1r_XfZ2LcpxOpVjcDZS1wbqHWs,441 -django/contrib/admin/static/admin/css/forms.css,sha256=vMtSyfxC2shzC3IIBi8RoP6XxNuwvFBHuw1vJMyo7xo,8525 -django/contrib/admin/static/admin/css/login.css,sha256=f8lbZQdAWt1rGdvNrIf1kciQPVcBJX4zYHf81JrqXnI,951 -django/contrib/admin/static/admin/css/nav_sidebar.css,sha256=4wmBb5tVT5_fcnP_UtS16jal0QiqgOKq_yz162Hr_C4,2810 -django/contrib/admin/static/admin/css/responsive.css,sha256=iQ2ax9Ix1lpNUwcotRLR3jZHyXt7OWA5qO7IjTU9CNQ,16632 -django/contrib/admin/static/admin/css/responsive_rtl.css,sha256=VANPQZQhF9pb9cHwFMndp56ux_1X0T0AP7hbQTH2Svg,1991 -django/contrib/admin/static/admin/css/rtl.css,sha256=vi3BpkPZnEHNovrpRV2nLQQ_X6VlNCcS2vvzYtKAAxo,4772 -django/contrib/admin/static/admin/css/unusable_password_field.css,sha256=c-s6fSgH5n2hrZO6jopy__T9_VHX0YZJnnGTEfWNjRA,663 -django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md,sha256=TuDLxRNwr941hlKg-XeXIFNyntV4tqQvXioDfRFPCzk,1124 -django/contrib/admin/static/admin/css/vendor/select2/select2.css,sha256=kalgQ55Pfy9YBkT-4yYYd5N8Iobe-iWeBuzP7LjVO0o,17358 -django/contrib/admin/static/admin/css/vendor/select2/select2.min.css,sha256=FdatTf20PQr_rWg-cAKfl6j4_IY3oohFAJ7gVC3M34E,14966 -django/contrib/admin/static/admin/css/widgets.css,sha256=FvrUonbdO7kvEwPZHL3nQodlwsOHqBkK4bdCJHPmYsI,11991 -django/contrib/admin/static/admin/img/LICENSE,sha256=0RT6_zSIwWwxmzI13EH5AjnT1j2YU3MwM9j3U19cAAQ,1081 -django/contrib/admin/static/admin/img/README.txt,sha256=Z5Y_AuG3V72qXRo_hS7JTHAid6deKUQKfLHgWP5hQHw,321 -django/contrib/admin/static/admin/img/calendar-icons.svg,sha256=VPzjt0-CwhFaiF2JyX2SjEkPuELU7QlhH4UhuWZmWX0,2455 -django/contrib/admin/static/admin/img/gis/move_vertex_off.svg,sha256=ou-ppUNyy5QZCKFYlcrzGBwEEiTDX5mmJvM8rpwC5DM,1129 -django/contrib/admin/static/admin/img/gis/move_vertex_on.svg,sha256=DgmcezWDms_3VhgqgYUGn-RGFHyScBP0MeX8PwHy_nE,1129 -django/contrib/admin/static/admin/img/icon-addlink.svg,sha256=_5bRQvExVwSP4DsRzIb-yDwutuft2RkHLqcifdlWypE,331 -django/contrib/admin/static/admin/img/icon-alert.svg,sha256=aXtd9PA66tccls-TJfyECQrmdWrj8ROWKC0tJKa7twA,504 -django/contrib/admin/static/admin/img/icon-calendar.svg,sha256=_bcF7a_R94UpOfLf-R0plVobNUeeTto9UMiUIHBcSHY,1086 -django/contrib/admin/static/admin/img/icon-changelink.svg,sha256=pjCclLDG8vvQmfZkFVzFMw1CLer930zafI8XgvDN86c,380 -django/contrib/admin/static/admin/img/icon-clock.svg,sha256=k55Yv6R6-TyS8hlL3Kye0IMNihgORFjoJjHY21vtpEA,677 -django/contrib/admin/static/admin/img/icon-deletelink.svg,sha256=06XOHo5y59UfNBtO8jMBHQqmXt8UmohlSMloUuZ6d0A,392 -django/contrib/admin/static/admin/img/icon-hidelink.svg,sha256=4MGicntOFkPurB9LW_IC-0N88WXKvrQxVyBB9p5gMTA,784 -django/contrib/admin/static/admin/img/icon-no.svg,sha256=QqBaTrrp3KhYJxLYB5E-0cn_s4A_Y8PImYdWjfQSM-c,560 -django/contrib/admin/static/admin/img/icon-unknown-alt.svg,sha256=LyL9oJtR0U49kGHYKMxmmm1vAw3qsfXR7uzZH76sZ_g,655 -django/contrib/admin/static/admin/img/icon-unknown.svg,sha256=ePcXlyi7cob_IcJOpZ66uiymyFgMPHl8p9iEn_eE3fc,655 -django/contrib/admin/static/admin/img/icon-viewlink.svg,sha256=NL7fcy7mQOQ91sRzxoVRLfzWzXBRU59cFANOrGOwWM0,581 -django/contrib/admin/static/admin/img/icon-yes.svg,sha256=_H4JqLywJ-NxoPLqSqk9aGJcxEdZwtSFua1TuI9kIcM,436 -django/contrib/admin/static/admin/img/inline-delete.svg,sha256=GX6XpvjESSee-SBFVIJHuZFjlXKsQVgri2blYsUYw-A,537 -django/contrib/admin/static/admin/img/search.svg,sha256=HgvLPNT7FfgYvmbt1Al1yhXgmzYHzMg8BuDLnU9qpMU,458 -django/contrib/admin/static/admin/img/selector-icons.svg,sha256=0RJyrulJ_UR9aYP7Wbvs5jYayBVhLoXR26zawNMZ0JQ,3291 -django/contrib/admin/static/admin/img/sorting-icons.svg,sha256=cCvcp4i3MAr-mo8LE_h8ZRu3LD7Ma9BtpK-p24O3lVA,1097 -django/contrib/admin/static/admin/img/tooltag-add.svg,sha256=fTZCouGMJC6Qq2xlqw_h9fFodVtLmDMrpmZacGVJYZQ,331 -django/contrib/admin/static/admin/img/tooltag-arrowright.svg,sha256=GIAqy_4Oor9cDMNC2fSaEGh-3gqScvqREaULnix3wHc,280 -django/contrib/admin/static/admin/js/SelectBox.js,sha256=b42sGVqaCDqlr0ibFiZus9FbrUweRcKD_y61HDAdQuc,4530 -django/contrib/admin/static/admin/js/SelectFilter2.js,sha256=FwtHj3a6IokKnpgxOdeZGgyMwmV3uKhxoDn108mjndM,15709 -django/contrib/admin/static/admin/js/actions.js,sha256=KZnmpiDCroO8EcCawROJdHAdUFL87Xu9pqYUL5jHIxM,8076 -django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js,sha256=ryJhtM9SN0fMdfnhV_m2Hv2pc6a9B0Zpc37ocZ82_-0,19319 -django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js,sha256=t8tRUeNKUwRUhZvowMs1-etzqYa9dQVyAJdcAjT2Ous,9777 -django/contrib/admin/static/admin/js/autocomplete.js,sha256=OAqSTiHZnTWZzJKEvOm-Z1tdAlLjPWX9jKpYkmH0Ozo,1060 -django/contrib/admin/static/admin/js/calendar.js,sha256=cj6qPrSqdWeq_OnWUUKWy4jVGCiy4YxsbXa5KhUw_r4,9141 -django/contrib/admin/static/admin/js/cancel.js,sha256=UEZdvvWu5s4ZH16lFfxa8UPgWXJ3i8VseK5Lcw2Kreg,884 -django/contrib/admin/static/admin/js/change_form.js,sha256=zOTeORCq1i9XXV_saSBBDOXbou5UtZvxYFpVPqxQ02Q,606 -django/contrib/admin/static/admin/js/core.js,sha256=H4_YZp2B3Y9JxMZPpHKVutrUZJbAZd4H6Gc-ilSb4_E,6208 -django/contrib/admin/static/admin/js/filters.js,sha256=T-JlrqZEBSWbiFw_e5lxkMykkACWqWXd_wMy-b3TnaE,978 -django/contrib/admin/static/admin/js/inlines.js,sha256=1IYzrbc22sCRR37CIG_uvu6I4-bkhq7bIcWE5LSb4Ow,15628 -django/contrib/admin/static/admin/js/jquery.init.js,sha256=uM_Kf7EOBMipcCmuQHbyubQkycleSWDCS8-c3WevFW0,347 -django/contrib/admin/static/admin/js/nav_sidebar.js,sha256=1xzV95R3GaqQ953sVmkLIuZJrzFNoDJMHBqwQePp6-Q,3063 -django/contrib/admin/static/admin/js/popup_response.js,sha256=IKRg0dCpW_gkwT-l6yy3hIFxEwbaA5tw0XEckpPaHvE,532 -django/contrib/admin/static/admin/js/prepopulate.js,sha256=UYkWrHNK1-OWp1a5IWZdg0udfo_dcR-jKSn5AlxxqgU,1531 -django/contrib/admin/static/admin/js/prepopulate_init.js,sha256=mJIPAgn8QHji_rSqO6WKNREbpkCILFrjRCCOQ1-9SoQ,586 -django/contrib/admin/static/admin/js/theme.js,sha256=gG6whuLXbtdF-t_pvUO1O7LfVlNZDuzMZONENrOuZp4,1653 -django/contrib/admin/static/admin/js/unusable_password_field.js,sha256=tcGj7GAhLMohHLtxGOAsaZH1t0Fu3fTQk2l3vFV9AY4,1480 -django/contrib/admin/static/admin/js/urlify.js,sha256=8oC4Bcxt8oJY4uy9O4NjPws5lXzDkdfwI2Xo3MxpBTo,7887 -django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt,sha256=1Nuevm8p9RaOrEWtcT8FViOsXQ3NW6ktoj1lCuASAg0,1097 -django/contrib/admin/static/admin/js/vendor/jquery/jquery.js,sha256=eKhayi8LEQwp4NKxN-CfCh-3qOVUtJn3QNZ0TciWLP4,285314 -django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js,sha256=_JqT3SQfawRcv_BIHPThkBvs0OEvtFFmqPF_lYI_Cxo,87533 -django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md,sha256=TuDLxRNwr941hlKg-XeXIFNyntV4tqQvXioDfRFPCzk,1124 -django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js,sha256=IpI3uo19fo77jMtN5R3peoP0OriN-nQfPY2J4fufd8g,866 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js,sha256=zxQ3peSnbVIfrH1Ndjx4DrHDsmbpqu6mfeylVWFM5mY,905 -django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js,sha256=N_KU7ftojf2HgvJRlpP8KqG6hKIbqigYN3K0YH_ctuQ,721 -django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js,sha256=5Z6IlHmuk_6IdZdAVvdigXnlj7IOaKXtcjuI0n0FmYQ,968 -django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js,sha256=wdQbgaxZ47TyGlwvso7GOjpmTXUKaWzvVUr_oCRemEE,1291 -django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js,sha256=g56kWSu9Rxyh_rarLSDa_8nrdqL51JqZai4QQx20jwQ,965 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js,sha256=DSyyAXJUI0wTp_TbFhLNGrgvgRsGWeV3IafxYUGBggM,900 -django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js,sha256=t_8OWVi6Yy29Kabqs_l1sM2SSrjUAgZTwbTX_m0MCL8,1292 -django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js,sha256=tF2mvzFYSWYOU3Yktl3G93pCkf-V9gonCxk7hcA5J1o,828 -django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js,sha256=5bspfcihMp8yXDwfcqvC_nV3QTbtBuQDmR3c7UPQtFw,866 -django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js,sha256=KtP2xNoP75oWnobUrS7Ep_BOFPzcMNDt0wyPnkbIF_Q,1017 -django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js,sha256=IdvD8eY_KpX9fdHvld3OMvQfYsnaoJjDeVkgbIemfn8,1182 -django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js,sha256=C66AO-KOXNuXEWwhwfjYBFa3gGcIzsPFHQAZ9qSh3Go,844 -django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js,sha256=IhZaIy8ufTduO2-vBrivswMCjlPk7vrk4P81pD6B0SM,922 -django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js,sha256=LgLgdOkKjc63svxP1Ua7A0ze1L6Wrv0X6np-8iRD5zw,801 -django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js,sha256=rLmtP7bA_atkNIj81l_riTM7fi5CXxVrFBHFyddO-Hw,868 -django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js,sha256=fqZkE9e8tt2rZ7OrDGPiOsTNdj3S2r0CjbddVUBDeMA,1023 -django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js,sha256=KVGirhGGNee_iIpMGLX5EzH_UkNe-FOPC_0484G-QQ0,803 -django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js,sha256=aj0q2rdJN47BRBc9LqvsgxkuPOcWAbZsUFUlbguwdY0,924 -django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js,sha256=HSJafI85yKp4WzjFPT5_3eZ_-XQDYPzzf4BWmu6uXHk,924 -django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js,sha256=DIPRKHw0NkDuUtLNGdTnYZcoCiN3ustHY-UMmw34V_s,984 -django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js,sha256=m6ZqiKZ_jzwzVFgC8vkYiwy4lH5fJEMV-LTPVO2Wu40,1175 -django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js,sha256=NclTlDTiNFX1y0W1Llj10-ZIoXUYd7vDXqyeUJ7v3B4,852 -django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js,sha256=FTLszcrGaelTW66WV50u_rS6HV0SZxQ6Vhpi2tngC6M,1018 -django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js,sha256=3PdUk0SpHY-H-h62womw4AyyRMujlGc6_oxW-L1WyOs,831 -django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js,sha256=BLh0fntrwtwNwlQoiwLkdQOVyNXHdmRpL28p-W5FsDg,1028 -django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js,sha256=fGJ--Aw70Ppzk3EgLjF1V_QvqD2q_ufXjnQIIyZqYgc,768 -django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js,sha256=gn0ddIqTnJX4wk-tWC5gFORJs1dkgIH9MOwLljBuQK0,807 -django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js,sha256=kGxtapwhRFj3u_IhY_7zWZhKgR5CrZmmasT5w-aoXRM,897 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js,sha256=tZ4sqdx_SEcJbiW5-coHDV8FVmElJRA3Z822EFHkjLM,862 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js,sha256=DH6VrnVdR8SX6kso2tzqnJqs32uCpBNyvP9Kxs3ssjI,1195 -django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js,sha256=x9hyjennc1i0oeYrFUHQnYHakXpv7WD7MSF-c9AaTjg,1088 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js,sha256=ImmB9v7g2ZKEmPFUQeXrL723VEjbiEW3YelxeqHEgHc,855 -django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js,sha256=ZT-45ibVwdWnTyo-TqsqW2NjIp9zw4xs5So78KMb_s8,944 -django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js,sha256=hHpEK4eYSoJj_fvA2wl8QSuJluNxh-Tvp6UZm-ZYaeE,900 -django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js,sha256=PSpxrnBpL4SSs9Tb0qdWD7umUIyIoR2V1fpqRQvCXcA,1038 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js,sha256=NCz4RntkJZf8YDDC1TFBvK-nkn-D-cGNy7wohqqaQD4,811 -django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js,sha256=eduKCG76J3iIPrUekCDCq741rnG4xD7TU3E7Lib7sPE,778 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js,sha256=QQjDPQE6GDKXS5cxq2JRjk3MGDvjg3Izex71Zhonbj8,1357 -django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js,sha256=JctLfTpLQ5UFXtyAmgbCvSPUtW0fy1mE7oNYcMI90bI,904 -django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js,sha256=6gEuKYnJdf8cbPERsw-mtdcgdByUJuLf1QUH0aSajMo,947 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js,sha256=4J4sZtSavxr1vZdxmnub2J0H0qr1S8WnNsTehfdfq4M,1049 -django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js,sha256=0DFe1Hu9fEDSXgpjPOQrA6Eq0rGb15NRbsGh1U4vEr0,876 -django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js,sha256=L5jqz8zc5BF8ukrhpI2vvGrNR34X7482dckX-IUuUpA,878 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js,sha256=Aadb6LV0u2L2mCOgyX2cYZ6xI5sDT9OI3V7HwuueivM,938 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js,sha256=bV6emVCE9lY0LzbVN87WKAAAFLUT3kKqEzn641pJ29o,1171 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js,sha256=MnbUcP6pInuBzTW_L_wmXY8gPLGCOcKyzQHthFkImZo,1306 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js,sha256=LPIKwp9gp_WcUc4UaVt_cySlNL5_lmfZlt0bgtwnkFk,925 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js,sha256=oIxJLYLtK0vG2g3s5jsGLn4lHuDgSodxYAWL0ByHRHo,903 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js,sha256=BoT2KdiceZGgxhESRz3W2J_7CFYqWyZyov2YktUo_2w,1109 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js,sha256=7EELYXwb0tISsuvL6eorxzTviMK-oedSvZvEZCMloGU,980 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js,sha256=c6nqUmitKs4_6AlYDviCe6HqLyOHqot2IrvJRGjj1JE,786 -django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js,sha256=saDPLk-2dq5ftKCvW1wddkJOg-mXA-GUoPPVOlSZrIY,1074 -django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js,sha256=mUEGlb-9nQHvzcTYI-1kjsB7JsPRGpLxWbjrJ8URthU,771 -django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js,sha256=dDz8iSp07vbx9gciIqz56wmc2TLHj5v8o6es75vzmZU,775 -django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js,sha256=MixhFDvdRda-wj-TjrN018s7R7E34aQhRjz4baxrdKw,1156 -django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js,sha256=mwTeySsUAgqu_IA6hvFzMyhcSIM1zGhNYKq8G7X_tpM,796 -django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js,sha256=olAdvPQ5qsN9IZuxAKgDVQM-blexUnWTDTXUtiorygI,768 -django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js,sha256=DnDBG9ywBOfxVb2VXg71xBR_tECPAxw7QLhZOXiJ4fo,707 -django/contrib/admin/static/admin/js/vendor/select2/select2.full.js,sha256=ugZkER5OAEGzCwwb_4MvhBKE5Gvmc0S59MKn-dooZaI,173566 -django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js,sha256=XG_auAy4aieWldzMImofrFDiySK-pwJC7aoo9St7rS0,79212 -django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt,sha256=c68pSb_5KWyw-BbDvhmk2k6VrclMH5JHlui60_A_Lyk,1106 -django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js,sha256=FM2fFr4a9mVscQobpyNQG1Bu4_8exjunQglEoPSP5uo,325171 -django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js,sha256=-FQXGywOGwW-5DdFMWIq0QWpGX3rQFuQpIDe6N_9eVI,163184 -django/contrib/admin/templates/admin/404.html,sha256=zyawWu1I9IxDGBRsks6-DgtLUGDDYOKHfj9YQqPl0AA,282 -django/contrib/admin/templates/admin/500.html,sha256=rZNmFXr9POnc9TdZwD06qkY8h2W5K05vCyssrIzbZGE,551 -django/contrib/admin/templates/admin/actions.html,sha256=BVal6_q7BuTy_V4635prb3Wm3XMhrTvhcKAL5u7K9Gc,1263 -django/contrib/admin/templates/admin/app_index.html,sha256=7NPb0bdLKOdja7FoIERyRZRYK-ldX3PcxMoydguWfzc,493 -django/contrib/admin/templates/admin/app_list.html,sha256=H-kbGQ80Yw0TMqK25Ag4wRVhZXx6-yaec5DHOyUy8dQ,2340 -django/contrib/admin/templates/admin/auth/user/add_form.html,sha256=4bCBr_jz-Tz811qOh9rsKHSQQ0_skbRJ48spVqSMU8k,547 -django/contrib/admin/templates/admin/auth/user/change_password.html,sha256=yvlBTc1rCMJWDIQmGdXku22foM2Il4f8CepoCUQgKJ8,3893 -django/contrib/admin/templates/admin/base.html,sha256=EWMxzIna8nLAvvkR34FbuN6VkYyO1bw73G2ZjNL03Kc,6137 -django/contrib/admin/templates/admin/base_site.html,sha256=GCiXgXwC_ZZ1goTKnrbdNfWONojGxTatiD5hCsA8HTg,450 -django/contrib/admin/templates/admin/change_form.html,sha256=oXmP-GeheKWcBzIRYBiGT_2-Rsu5Mmt2xRzV-Yk6DHc,3198 -django/contrib/admin/templates/admin/change_form_object_tools.html,sha256=C0l0BJF2HuSjIvtY-Yr-ByZ9dePFRrTc-MR-OVJD-AI,403 -django/contrib/admin/templates/admin/change_list.html,sha256=GrihA_TnXoKe3SKdlaqMfgYaTHcFuziip9MhFaWx7B8,3887 -django/contrib/admin/templates/admin/change_list_object_tools.html,sha256=-AX0bYTxDsdLtEpAEK3RFpY89tdvVChMAWPYBLqPn48,378 -django/contrib/admin/templates/admin/change_list_results.html,sha256=yOpb1o-L5Ys9GiRA_nCXoFhIzREDVXLBuYzZk1xrx1w,1502 -django/contrib/admin/templates/admin/color_theme_toggle.html,sha256=a2uh7_c2umbLLGRD_cVdVmfp291TwQYkD_87sYCotIU,703 -django/contrib/admin/templates/admin/date_hierarchy.html,sha256=Hug06L1uQzPQ-NAeixTtKRtDu2lAWh96o6f8ElnyU0c,453 -django/contrib/admin/templates/admin/delete_confirmation.html,sha256=3eMxQPSITd7Mae22TALXtCvJR4YMwfzNG_iAtuyF0PI,2539 -django/contrib/admin/templates/admin/delete_selected_confirmation.html,sha256=5yyaNqfiK1evhJ7px7gmMqjFwYrrMaKNDvQJ3-Lu4mo,2241 -django/contrib/admin/templates/admin/edit_inline/stacked.html,sha256=q4DUCiTfrlVypMV6TrvkN4zl1QDe57l-VTvYcO6yl1Q,3108 -django/contrib/admin/templates/admin/edit_inline/tabular.html,sha256=7xsNm1C-HiThj0TJZXGvcHAgLeOBbuuXRjGMiqXW8fc,4401 -django/contrib/admin/templates/admin/filter.html,sha256=cvjazGEln3BL_0iyz8Kcsend5WhT9y-gXKRN2kHqejU,395 -django/contrib/admin/templates/admin/includes/fieldset.html,sha256=LX_8XwduBMo3DmQNuGaK0toLMoVnsMdMiaZOfG-zU6k,2720 -django/contrib/admin/templates/admin/includes/object_delete_summary.html,sha256=OC7VhKQiczmi01Gt_3jyemelerSNrGyDiWghUK6xKEI,192 -django/contrib/admin/templates/admin/index.html,sha256=TQxZdAy2ZyeXBLA_KZMXus7e2TGezFAUTsYHJBMLPl8,2070 -django/contrib/admin/templates/admin/invalid_setup.html,sha256=F5FS3o7S3l4idPrX29OKlM_azYmCRKzFdYjV_jpTqhE,447 -django/contrib/admin/templates/admin/login.html,sha256=FZA-d3HEISXkGSyJlxncbVu3Jff7-zwwJ8KkwlN2AHM,2001 -django/contrib/admin/templates/admin/nav_sidebar.html,sha256=OfI8XJn3_Q_Wf2ymc1IH61eTGZNMFwkkGwXXTDqeuP8,486 -django/contrib/admin/templates/admin/object_history.html,sha256=5e6ki7C94YKBoFyCvDOfqt4YzCyhNmNMy8NM4aKqiHc,2136 -django/contrib/admin/templates/admin/pagination.html,sha256=OBvC2HWFaH3wIuk6gzKSyCli51NTaW8vnJFyBOpNo_8,549 -django/contrib/admin/templates/admin/popup_response.html,sha256=Lj8dfQrg1XWdA-52uNtWJ9hwBI98Wt2spSMkO4YBjEk,327 -django/contrib/admin/templates/admin/prepopulated_fields_js.html,sha256=PShGpqQWBBVwQ86r7b-SimwJS0mxNiz8AObaiDOSfvY,209 -django/contrib/admin/templates/admin/search_form.html,sha256=GImO4ldr2iVMDKPa2prQzrJyrZEQS1Zy6guNfF6VbQ8,1357 -django/contrib/admin/templates/admin/submit_line.html,sha256=yI7XWZCjvY5JtDAvbzx8hpXZi4vRYWx0mty7Zt5uWjY,1093 -django/contrib/admin/templates/admin/widgets/clearable_file_input.html,sha256=3g3JbkQmjgjl_Lyz6DzkvNBxlJT0GJAuQGV4MAGSyJ0,666 -django/contrib/admin/templates/admin/widgets/date.html,sha256=uJME8ir5DrcrWze9ikzlspoaCudQqxyMMGr6azIMkMc,71 -django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html,sha256=X1Qsxepoht7TCZTJLHZ6jgbZLTEWjeaqBCqlAvmgiUg,412 -django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html,sha256=w18JMKnPKrw6QyqIXBcdPs3YJlTRtHK5HGxj0lVkMlY,54 -django/contrib/admin/templates/admin/widgets/radio.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 -django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html,sha256=a3CWvuTtb6hRcf5-gsqRuhEJF18pOmwuRjJerDetLyY,2102 -django/contrib/admin/templates/admin/widgets/split_datetime.html,sha256=BQ9XNv3eqtvNqZZGW38VBM2Nan-5PBxokbo2Fm_wwCQ,238 -django/contrib/admin/templates/admin/widgets/time.html,sha256=oiXCD1IvDhALK3w0fCrVc7wBOFMJhvPNTG2_NNz9H7A,71 -django/contrib/admin/templates/admin/widgets/url.html,sha256=Tf7PwdoKAiimfmDTVbWzRVxxUeyfhF0OlsuiOZ1tHgI,218 -django/contrib/admin/templates/registration/logged_out.html,sha256=PuviqzJh7C6SZJl9yKZXDcxxqXNCTDVfRuEpqvwJiPE,425 -django/contrib/admin/templates/registration/password_change_done.html,sha256=Ukca5IPY_VhtO3wfu9jABgY7SsbB3iIGp2KCSJqihlQ,745 -django/contrib/admin/templates/registration/password_change_form.html,sha256=44zs7GemkINgUYdTG-OJOtoedFCfJOM1QJE79HCg5BA,2534 -django/contrib/admin/templates/registration/password_reset_complete.html,sha256=_fc5bDeYBaI5fCUJZ0ZFpmOE2CUqlbk3npGk63uc_Ks,417 -django/contrib/admin/templates/registration/password_reset_confirm.html,sha256=GH9bThrSAyh4fvHoG2AwpFsmjetbfKV93gt1MoFeov0,1646 -django/contrib/admin/templates/registration/password_reset_done.html,sha256=SQsksjWN8vPLpvtFYPBFMMqZtLeiB4nesPq2VxpB3Y8,588 -django/contrib/admin/templates/registration/password_reset_email.html,sha256=gPbRowVMtGh_HxZvMQh3R3onpboxrseV_DB1Hsfme1g,606 -django/contrib/admin/templates/registration/password_reset_form.html,sha256=HlkKmHDfFU8m1eNdrvain-ccTOwSftLHSCmX0Tcmthg,1066 -django/contrib/admin/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/admin/templatetags/__pycache__/__init__.cpython-310.pyc,, -django/contrib/admin/templatetags/__pycache__/admin_list.cpython-310.pyc,, -django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-310.pyc,, -django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-310.pyc,, -django/contrib/admin/templatetags/__pycache__/base.cpython-310.pyc,, -django/contrib/admin/templatetags/__pycache__/log.cpython-310.pyc,, -django/contrib/admin/templatetags/admin_list.py,sha256=r60BQcBy3_sEzUk86KYviKbR8vzOcpoPR53AviGFnpE,19159 -django/contrib/admin/templatetags/admin_modify.py,sha256=DGE-YaZB1-bUqvjOwmnWJTrIRiR1qYdY6NyPDj1Hj3U,4978 -django/contrib/admin/templatetags/admin_urls.py,sha256=HNooe26wytMLh5DdgOqzcyHtNf4G-vWfcsL7xQlWVuE,2038 -django/contrib/admin/templatetags/base.py,sha256=0jlMfZu-IZkTJsnJQUtqBX2ceqCaVeClTTS1wdxn73w,1465 -django/contrib/admin/templatetags/log.py,sha256=vL2TNhgFsCH-4JXDE-2I_BhB2xQQLwx4GkHKx7m8Rz4,2050 -django/contrib/admin/tests.py,sha256=GJuWJAKvlZ_9qe86EMvroI34oaafoUl8iFM_P_YSWKQ,8559 -django/contrib/admin/utils.py,sha256=c_uFWsPQfXBfSdPbaarAfOabg1_mUjpOBzqIl8LOdRA,21908 -django/contrib/admin/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/admin/views/__pycache__/__init__.cpython-310.pyc,, -django/contrib/admin/views/__pycache__/autocomplete.cpython-310.pyc,, -django/contrib/admin/views/__pycache__/decorators.cpython-310.pyc,, -django/contrib/admin/views/__pycache__/main.cpython-310.pyc,, -django/contrib/admin/views/autocomplete.py,sha256=PjC8db25zhYgwLS_4pq6PApTD_YRn4muIH0A_VN7kCg,4385 -django/contrib/admin/views/decorators.py,sha256=4ndYdYoPLhWsdutME0Lxsmcf6UFP5Z2ou3_pMjgNbw8,639 -django/contrib/admin/views/main.py,sha256=NmC8lhTRcVxFTQ6DZZgcxkSB0aCHh6TVO5xiH8tJPL0,25868 -django/contrib/admin/widgets.py,sha256=ujOuEp7Db12KIEcje7_ry55q_FISyheBF-7E3z8drFg,19637 -django/contrib/admindocs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/admindocs/__pycache__/__init__.cpython-310.pyc,, -django/contrib/admindocs/__pycache__/apps.cpython-310.pyc,, -django/contrib/admindocs/__pycache__/middleware.cpython-310.pyc,, -django/contrib/admindocs/__pycache__/urls.cpython-310.pyc,, -django/contrib/admindocs/__pycache__/utils.cpython-310.pyc,, -django/contrib/admindocs/__pycache__/views.cpython-310.pyc,, -django/contrib/admindocs/apps.py,sha256=bklhU4oaTSmPdr0QzpVeuNT6iG77QM1AgiKKZDX05t4,216 -django/contrib/admindocs/locale/af/LC_MESSAGES/django.mo,sha256=M80Uggz4Rn4g2Dg9z9pwjkhzWmMhxjXTaA4dXaXzI5s,3326 -django/contrib/admindocs/locale/af/LC_MESSAGES/django.po,sha256=STP4d23ByifM1Gda8i5o4OuB9OobBDIp348jhezP-UI,5728 -django/contrib/admindocs/locale/ar/LC_MESSAGES/django.mo,sha256=MwAJ0TMsgRN4wrwlhlw3gYCfZK5IKDzNPuvjfJS_Eug,7440 -django/contrib/admindocs/locale/ar/LC_MESSAGES/django.po,sha256=KSmZCjSEizBx5a6yN_u0FPqG5QoXsTV9gdJkqWC8xC8,8052 -django/contrib/admindocs/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=lW-fKcGwnRtdpJLfVw9i1HiM25TctVK0oA0bGV7yAzU,7465 -django/contrib/admindocs/locale/ar_DZ/LC_MESSAGES/django.po,sha256=c8LOJTCkHd1objwj6Xqh0wF3LwkLJvWg9FIWSWWMI-I,7985 -django/contrib/admindocs/locale/ast/LC_MESSAGES/django.mo,sha256=d4u-2zZXnnueWm9CLSnt4TRWgZk2NMlrA6gaytJ2gdU,715 -django/contrib/admindocs/locale/ast/LC_MESSAGES/django.po,sha256=TUkc-Hm4h1kD0NKyndteW97jH6bWcJMFXUuw2Bd62qo,4578 -django/contrib/admindocs/locale/az/LC_MESSAGES/django.mo,sha256=tuOpw3_db7qJuYYBmlEsi-Zmp8gRVsuxGh23Cb_WQes,6629 -django/contrib/admindocs/locale/az/LC_MESSAGES/django.po,sha256=ayt0aT7rdSJpgu88WSvciCREVhBadKDjQSHgMYwyI-g,7205 -django/contrib/admindocs/locale/be/LC_MESSAGES/django.mo,sha256=VZl0yvgbo0jwQpf-s472jagbUj83A3twnxddQGwGW5c,8163 -django/contrib/admindocs/locale/be/LC_MESSAGES/django.po,sha256=Z8ZtS_t5Tc7iy1p4TTrsKZqiMJl94f1jiTWuv1sep3A,8728 -django/contrib/admindocs/locale/bg/LC_MESSAGES/django.mo,sha256=bNNoMFB0_P1qut4txQqHiXGxJa8-sjIZA8bb_jPaaHk,8242 -django/contrib/admindocs/locale/bg/LC_MESSAGES/django.po,sha256=nJMwR6R19pXmf4u6jBwe8Xn9fObSaAzulNeqsm8bszo,8989 -django/contrib/admindocs/locale/bn/LC_MESSAGES/django.mo,sha256=NOKVcE8id9G1OctSly4C5lm64CgEF8dohX-Pdyt4kCM,3794 -django/contrib/admindocs/locale/bn/LC_MESSAGES/django.po,sha256=6M7LjIEjvDTjyraxz70On_TIsgqJPLW7omQ0Fz_zyfQ,6266 -django/contrib/admindocs/locale/br/LC_MESSAGES/django.mo,sha256=UsPTado4ZNJM_arSMXyuBGsKN-bCHXQZdFbh0GB3dtg,1571 -django/contrib/admindocs/locale/br/LC_MESSAGES/django.po,sha256=SHOxPSgozJbOkm8u5LQJ9VmL58ZSBmlxfOVw1fAGl2s,5139 -django/contrib/admindocs/locale/bs/LC_MESSAGES/django.mo,sha256=clvhu0z3IF5Nt0tZ85hOt4M37pnGEWeIYumE20vLpsI,1730 -django/contrib/admindocs/locale/bs/LC_MESSAGES/django.po,sha256=1-OrVWFqLpeXQFfh7JNjJtvWjVww7iB2s96dcSgLy90,5042 -django/contrib/admindocs/locale/ca/LC_MESSAGES/django.mo,sha256=nI2ctIbZVrsaMbJQGIHQCjwqJNTnH3DKxwI2dWR6G_w,6650 -django/contrib/admindocs/locale/ca/LC_MESSAGES/django.po,sha256=hPjkw0bkoUu-yKU8XYE3ji0NG4z5cE1LGonYPJXeze4,7396 -django/contrib/admindocs/locale/ckb/LC_MESSAGES/django.mo,sha256=QisqerDkDuKrctJ10CspniXNDqBnCI2Wo-CKZUZtsCY,8154 -django/contrib/admindocs/locale/ckb/LC_MESSAGES/django.po,sha256=0adJyGnFg3qoD11s9gZbJlY8O0Dd1mpKF8OLQAkHZHE,8727 -django/contrib/admindocs/locale/cs/LC_MESSAGES/django.mo,sha256=dJ-3fDenE42f6XZFc-yrfWL1pEAmSGt2j1eWAyy-5OQ,6619 -django/contrib/admindocs/locale/cs/LC_MESSAGES/django.po,sha256=uU4n9PsiI96O0UpJzL-inVzB1Kx7OB_SbLkjrFLuyVA,7227 -django/contrib/admindocs/locale/cy/LC_MESSAGES/django.mo,sha256=sYeCCq0CMrFWjT6rKtmFrpC09OEFpYLSI3vu9WtpVTY,5401 -django/contrib/admindocs/locale/cy/LC_MESSAGES/django.po,sha256=GhdikiXtx8Aea459uifQtBjHuTlyUeiKu0_rR_mDKyg,6512 -django/contrib/admindocs/locale/da/LC_MESSAGES/django.mo,sha256=vmsIZeMIVpLkSdJNS0G6alAmBBEtLDBLnOd-P3dSOAs,6446 -django/contrib/admindocs/locale/da/LC_MESSAGES/django.po,sha256=bSoTGPcE7MdRfAtBybZT9jsuww2VDH9t5CssaxSs_GU,7148 -django/contrib/admindocs/locale/de/LC_MESSAGES/django.mo,sha256=ReSz0aH1TKT6AtP13lWoONnwNM2OGo4jK9fXJlo75Hc,6567 -django/contrib/admindocs/locale/de/LC_MESSAGES/django.po,sha256=tVkDIPF_wYb_KaJ7PF9cZyBJoYu6RpznoM9JIk3RYN4,7180 -django/contrib/admindocs/locale/dsb/LC_MESSAGES/django.mo,sha256=K_QuInKk1HrrzQivwJcs_2lc1HreFj7_R7qQh3qMTPY,6807 -django/contrib/admindocs/locale/dsb/LC_MESSAGES/django.po,sha256=flF1D0gfTScuC_RddC9njLe6RrnqnksiRxwODVA9Vqw,7332 -django/contrib/admindocs/locale/el/LC_MESSAGES/django.mo,sha256=1x0sTZwWbGEURyRaSn4ONvTPXHwm7XemNlcun9Nm1QI,8581 -django/contrib/admindocs/locale/el/LC_MESSAGES/django.po,sha256=GebfJfW0QPzAQyBKz1Km9a3saCpAWT7d_Qe2nCBvGn4,9320 -django/contrib/admindocs/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/admindocs/locale/en/LC_MESSAGES/django.po,sha256=pEypE71l-Ude2e3XVf0tkBpGx6BSYNqBagWnSYmEbxI,10688 -django/contrib/admindocs/locale/en_AU/LC_MESSAGES/django.mo,sha256=BQ54LF9Tx88m-pG_QVz_nm_vqvoy6pVJzL8urSO4l1Q,486 -django/contrib/admindocs/locale/en_AU/LC_MESSAGES/django.po,sha256=ho7s1uKEs9FGooyZBurvSjvFz1gDSX6R4G2ZKpF1c9Q,5070 -django/contrib/admindocs/locale/en_GB/LC_MESSAGES/django.mo,sha256=xKGbswq1kuWCbn4zCgUQUb58fEGlICIOr00oSdCgtU4,1821 -django/contrib/admindocs/locale/en_GB/LC_MESSAGES/django.po,sha256=No09XHkzYVFBgZqo7bPlJk6QD9heE0oaI3JmnrU_p24,4992 -django/contrib/admindocs/locale/eo/LC_MESSAGES/django.mo,sha256=114OOVg9hP0H0UU2aQngCm0wE7zEEAp7QFMupOuWCfQ,6071 -django/contrib/admindocs/locale/eo/LC_MESSAGES/django.po,sha256=h8P3lmvBaJ8J2xiytReJvI8iGK0gCe-LPK27kWxSNKI,6799 -django/contrib/admindocs/locale/es/LC_MESSAGES/django.mo,sha256=wVt9I5M6DGKZFhPhYuS2yKRGVzSROthx98TFiJvJA80,6682 -django/contrib/admindocs/locale/es/LC_MESSAGES/django.po,sha256=F72OFWbIZXvopNMzy7eIibNKc5EM0jsYgbN4PobD6tc,7602 -django/contrib/admindocs/locale/es_AR/LC_MESSAGES/django.mo,sha256=mZ7OKAmlj2_FOabKsEiWycxiKLSLCPFldponKNxINjs,6658 -django/contrib/admindocs/locale/es_AR/LC_MESSAGES/django.po,sha256=deaOq0YMCb1B1PHWYUbgUrQsyXFutn4wQ2BAXiyzugA,7257 -django/contrib/admindocs/locale/es_CO/LC_MESSAGES/django.mo,sha256=KFjQyWtSxH_kTdSJ-kNUDAFt3qVZI_3Tlpg2pdkvJfs,6476 -django/contrib/admindocs/locale/es_CO/LC_MESSAGES/django.po,sha256=dwrTVjYmueLiVPu2yiJ_fkFF8ZeRntABoVND5H2WIRI,7038 -django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.mo,sha256=3hZiFFVO8J9cC624LUt4lBweqmpgdksRtvt2TLq5Jqs,1853 -django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.po,sha256=gNmx1QTbmyMxP3ftGXGWJH_sVGThiSe_VNKkd7M9jOY,5043 -django/contrib/admindocs/locale/es_VE/LC_MESSAGES/django.mo,sha256=sMwJ7t5GqPF496w-PvBYUneZ9uSwmi5jP-sWulhc6BM,6663 -django/contrib/admindocs/locale/es_VE/LC_MESSAGES/django.po,sha256=ZOcE0f95Q6uD9SelK6bQlKtS2c3JX9QxNYCihPdlM5o,7201 -django/contrib/admindocs/locale/et/LC_MESSAGES/django.mo,sha256=JQHVKehV0sxNaBQRqbsN-Of22CMV70bQ9TUId3QDudY,6381 -django/contrib/admindocs/locale/et/LC_MESSAGES/django.po,sha256=qrS3cPEy16hEi1857jvqsmr9zHF9_AkkJUw4mKimg98,7096 -django/contrib/admindocs/locale/eu/LC_MESSAGES/django.mo,sha256=WHgK7vGaqjO4MwjBkWz2Y3ABPXCqfnwSGelazRhOiuo,6479 -django/contrib/admindocs/locale/eu/LC_MESSAGES/django.po,sha256=718XgJN7UQcHgE9ku0VyFp7Frs-cvmCTO1o-xS5kpqc,7099 -django/contrib/admindocs/locale/fa/LC_MESSAGES/django.mo,sha256=Qrkrb_CHPGymnXBoBq5oeTs4W54R6nLz5hLIWH63EHM,7499 -django/contrib/admindocs/locale/fa/LC_MESSAGES/django.po,sha256=L-rxiKqUmlQgrPTLQRaS50woZWB9JuEamJpgDpLvIXw,8251 -django/contrib/admindocs/locale/fi/LC_MESSAGES/django.mo,sha256=SzuPvgeiaBwABvkJbOoTHsbP7juAuyyMWAjENr50gYk,6397 -django/contrib/admindocs/locale/fi/LC_MESSAGES/django.po,sha256=jn4ZMVQ_Gh6I-YLSmBhlyTn5ICP5o3oj7u0VKpV2hnI,6972 -django/contrib/admindocs/locale/fr/LC_MESSAGES/django.mo,sha256=dD92eLXIDeI-a_BrxX1G49qRwLS4Vt56bTP9cha5MeE,6755 -django/contrib/admindocs/locale/fr/LC_MESSAGES/django.po,sha256=hiUeHTul4Z3JWmkClGZmD5Xn4a1Tj1A5OLRfKU5Zdmo,7329 -django/contrib/admindocs/locale/fy/LC_MESSAGES/django.mo,sha256=_xVO-FkPPoTla_R0CzktpRuafD9fuIP_G5N-Q08PxNg,476 -django/contrib/admindocs/locale/fy/LC_MESSAGES/django.po,sha256=b3CRH9bSUl_jjb9s51RlvFXp3bmsmuxTfN_MTmIIVNA,5060 -django/contrib/admindocs/locale/ga/LC_MESSAGES/django.mo,sha256=2kOgyNWHQaNq-cwsh5YmmqWa8z9WN7HHUEEW85hek4A,6786 -django/contrib/admindocs/locale/ga/LC_MESSAGES/django.po,sha256=PEuuqMz1-aW96Lcy72PsVormIrN522Qd6RxSM1VVMTk,7424 -django/contrib/admindocs/locale/gd/LC_MESSAGES/django.mo,sha256=k5-Ov9BkwYHZ_IvIxQdHKVBdOUN7kWGft1l7w5Scd5o,6941 -django/contrib/admindocs/locale/gd/LC_MESSAGES/django.po,sha256=FyvfRNkSrEZo8x1didB6nFHYD54lZfKSoAGcwJ2wLso,7478 -django/contrib/admindocs/locale/gl/LC_MESSAGES/django.mo,sha256=15OYKk17Dlz74RReFrCHP3eHmaxP8VeRE2ylDOeUY8w,6564 -django/contrib/admindocs/locale/gl/LC_MESSAGES/django.po,sha256=mvQmxR4LwDLbCWyIU-xmJEw6oeSY3KFWC1nqnbnuDyc,7197 -django/contrib/admindocs/locale/he/LC_MESSAGES/django.mo,sha256=1_aXtUXx-NISzJmlfprUZ5LieD9BwCcCUQ-DQ_YF-jk,6998 -django/contrib/admindocs/locale/he/LC_MESSAGES/django.po,sha256=aONIl7C_5hgo0agjYleyZAkj4_VPkQVPT0R7wWPhJEs,7589 -django/contrib/admindocs/locale/hi/LC_MESSAGES/django.mo,sha256=sZhObIxqrmFu5Y-ZOQC0JGM3ly4IVFr02yqOOOHnDag,2297 -django/contrib/admindocs/locale/hi/LC_MESSAGES/django.po,sha256=X6UfEc6q0BeaxVP_C4priFt8irhh-YGOUUzNQyVnEYY,5506 -django/contrib/admindocs/locale/hr/LC_MESSAGES/django.mo,sha256=fMsayjODNoCdbpBAk9GHtIUaGJGFz4sD9qYrguj-BQA,2550 -django/contrib/admindocs/locale/hr/LC_MESSAGES/django.po,sha256=qi2IB-fBkGovlEz2JAQRUNE54MDdf5gjNJWXM-dIG1s,5403 -django/contrib/admindocs/locale/hsb/LC_MESSAGES/django.mo,sha256=4CbZ95VHJUg3UNt-FdzPtUtHJLralgnhadz-evigiFA,6770 -django/contrib/admindocs/locale/hsb/LC_MESSAGES/django.po,sha256=ty8zWmqY160ZpSbt1-_2iY2M4RIL7ksh5-ggQGc_TO8,7298 -django/contrib/admindocs/locale/hu/LC_MESSAGES/django.mo,sha256=ATEt9wE2VNQO_NMcwepgxpS7mYXdVD5OySFFPWpnBUA,6634 -django/contrib/admindocs/locale/hu/LC_MESSAGES/django.po,sha256=3XKQrlonyLXXpU8xeS1OLXcKmmE2hiBoMJN-QZ3k82g,7270 -django/contrib/admindocs/locale/ia/LC_MESSAGES/django.mo,sha256=KklX2loobVtA6PqHOZHwF1_A9YeVGlqORinHW09iupI,1860 -django/contrib/admindocs/locale/ia/LC_MESSAGES/django.po,sha256=Z7btOCeARREgdH4CIJlVob_f89r2M9j55IDtTLtgWJU,5028 -django/contrib/admindocs/locale/id/LC_MESSAGES/django.mo,sha256=2HZrdwFeJV4Xk2HIKsxp_rDyBrmxCuRb92HtFtW8MxE,6343 -django/contrib/admindocs/locale/id/LC_MESSAGES/django.po,sha256=O01yt7iDXvEwkebUxUlk-vCrLR26ebuqI51x64uqFl4,7041 -django/contrib/admindocs/locale/io/LC_MESSAGES/django.mo,sha256=5t9Vurrh6hGqKohwsZIoveGeYCsUvRBRMz9M7k9XYY8,464 -django/contrib/admindocs/locale/io/LC_MESSAGES/django.po,sha256=SVZZEmaS1WbXFRlLLGg5bzUe09pXR23TeJtHUbhyl0w,5048 -django/contrib/admindocs/locale/is/LC_MESSAGES/django.mo,sha256=pEr-_MJi4D-WpNyFaQe3tVKVLq_9V-a4eIF18B3Qyko,1828 -django/contrib/admindocs/locale/is/LC_MESSAGES/django.po,sha256=-mD5fFnL6xUqeW4MITzm8Lvx6KXq4C9DGsEM9kDluZ8,5045 -django/contrib/admindocs/locale/it/LC_MESSAGES/django.mo,sha256=AzCkkJ8x-V38XSOdOG2kMSUujcn0mD8TIvdAeNT6Qcw,6453 -django/contrib/admindocs/locale/it/LC_MESSAGES/django.po,sha256=SUsGtCKkCVoj5jaM6z_-JQR8kv8W4Wv_OE26hpOb96s,7171 -django/contrib/admindocs/locale/ja/LC_MESSAGES/django.mo,sha256=KoPwCbH9VlKoP_7zTEjOzPsHZ7jVWl2grQRckQmshw4,7358 -django/contrib/admindocs/locale/ja/LC_MESSAGES/django.po,sha256=6ZTqM2qfBS_j5aLH52yJPYW4e4X5MqiQFdqV1fmEQGg,8047 -django/contrib/admindocs/locale/ka/LC_MESSAGES/django.mo,sha256=w2cHLI1O3pVt43H-h71cnNcjNNvDC8y9uMYxZ_XDBtg,4446 -django/contrib/admindocs/locale/ka/LC_MESSAGES/django.po,sha256=omKVSzNA3evF5Mk_Ud6utHql-Do7s9xDzCVQGQA0pSg,6800 -django/contrib/admindocs/locale/kab/LC_MESSAGES/django.mo,sha256=XTuWnZOdXhCFXEW4Hp0zFtUtAF0wJHaFpQqoDUTWYGw,1289 -django/contrib/admindocs/locale/kab/LC_MESSAGES/django.po,sha256=lQWewMZncWUvGhpkgU_rtwWHcgAyvhIkrDfjFu1l-d8,4716 -django/contrib/admindocs/locale/kk/LC_MESSAGES/django.mo,sha256=mmhLzn9lo4ff_LmlIW3zZuhE77LoSUfpaMMMi3oyi38,1587 -django/contrib/admindocs/locale/kk/LC_MESSAGES/django.po,sha256=72sxLw-QDSFnsH8kuzeQcV5jx7Hf1xisBmxI8XqSCYw,5090 -django/contrib/admindocs/locale/km/LC_MESSAGES/django.mo,sha256=Fff1K0qzialXE_tLiGM_iO5kh8eAmQhPZ0h-eB9iNOU,1476 -django/contrib/admindocs/locale/km/LC_MESSAGES/django.po,sha256=E_CaaYc4GqOPgPh2t7iuo0Uf4HSQQFWAoxSOCG-uEGU,4998 -django/contrib/admindocs/locale/kn/LC_MESSAGES/django.mo,sha256=lisxE1zzW-Spdm7hIzXxDAfS7bM-RdrAG_mQVwz9WMU,1656 -django/contrib/admindocs/locale/kn/LC_MESSAGES/django.po,sha256=u6JnB-mYoYWvLl-2pzKNfeNlT1s6A2I3lRi947R_0yA,5184 -django/contrib/admindocs/locale/ko/LC_MESSAGES/django.mo,sha256=nVBVLfXUlGQCeF2foSQ2kksBmR3KbweXdbD6Kyq-PrU,6563 -django/contrib/admindocs/locale/ko/LC_MESSAGES/django.po,sha256=y2YjuXM3p0haXrGpxRtm6I84o75TQaMeT4xbHCg7zOM,7342 -django/contrib/admindocs/locale/ky/LC_MESSAGES/django.mo,sha256=HEJo4CLoIOWpK-MPcTqLhbNMA8Mt3totYN1YbJ_SNn4,7977 -django/contrib/admindocs/locale/ky/LC_MESSAGES/django.po,sha256=VaSXjz8Qlr2EI8f12gtziN7yA7IWsaVoEzL3G6dERXs,8553 -django/contrib/admindocs/locale/lb/LC_MESSAGES/django.mo,sha256=N0hKFuAdDIq5clRKZirGh4_YDLsxi1PSX3DVe_CZe4k,474 -django/contrib/admindocs/locale/lb/LC_MESSAGES/django.po,sha256=B46-wRHMKUMcbvMCdojOCxqIVL5qVEh4Czo20Qgz6oU,5058 -django/contrib/admindocs/locale/lt/LC_MESSAGES/django.mo,sha256=KOnpaVeomKJIHcVLrkeRVnaqQHzFdYM_wXZbbqxWs4g,6741 -django/contrib/admindocs/locale/lt/LC_MESSAGES/django.po,sha256=-uzCS8193VCZPyhO8VOi11HijtBG9CWVKStFBZSXfI4,7444 -django/contrib/admindocs/locale/lv/LC_MESSAGES/django.mo,sha256=5PAE_peuqlRcc45pm6RsSqnBpG-o8OZpfdt2aasYM2w,6449 -django/contrib/admindocs/locale/lv/LC_MESSAGES/django.po,sha256=_mFvAQT1ZVBuDhnWgKY3bVQUWA8DoEf-HFAEsMfkGuU,7085 -django/contrib/admindocs/locale/mk/LC_MESSAGES/django.mo,sha256=8H9IpRASM7O2-Ql1doVgM9c4ybZ2KcfnJr12PpprgP4,8290 -django/contrib/admindocs/locale/mk/LC_MESSAGES/django.po,sha256=Uew7tEljjgmslgfYJOP9JF9ELp6NbhkZG_v50CZgBg8,8929 -django/contrib/admindocs/locale/ml/LC_MESSAGES/django.mo,sha256=bm4tYwcaT8XyPcEW1PNZUqHJIds9CAq3qX_T1-iD4k4,6865 -django/contrib/admindocs/locale/ml/LC_MESSAGES/django.po,sha256=yNINX5M7JMTbYnFqQGetKGIXqOjGJtbN2DmIW9BKQ_c,8811 -django/contrib/admindocs/locale/mn/LC_MESSAGES/django.mo,sha256=MyPphoXZCl6gPq74TyPBAvbc-aUQdUx5t3cdnj3vn_A,7108 -django/contrib/admindocs/locale/mn/LC_MESSAGES/django.po,sha256=h4GNr_G_lqLCiypMQNaw3ItF8RnHzdLhcrKs6vQVPfE,8058 -django/contrib/admindocs/locale/mr/LC_MESSAGES/django.mo,sha256=LDGC7YRyVBU50W-iH0MuESunlRXrNfNjwjXRCBdfFVg,468 -django/contrib/admindocs/locale/mr/LC_MESSAGES/django.po,sha256=5cUgPltXyS2Z0kIKF5ER8f5DuBhwmAINJQyfHj652d0,5052 -django/contrib/admindocs/locale/ms/LC_MESSAGES/django.mo,sha256=vgoSQlIQeFWaVfJv3YK9_0FOywWwxLhWGICKBdxcqJY,6557 -django/contrib/admindocs/locale/ms/LC_MESSAGES/django.po,sha256=Qy_NjgqwEwLGk4oaHB4Np3dVbPeCK2URdI73S73IZLE,7044 -django/contrib/admindocs/locale/my/LC_MESSAGES/django.mo,sha256=AsdUmou0FjCiML3QOeXMdbHiaSt2GdGMcEKRJFonLOQ,1721 -django/contrib/admindocs/locale/my/LC_MESSAGES/django.po,sha256=c75V-PprKrWzgrHbfrZOpm00U_zZRzxAUr2U_j8MF4w,5189 -django/contrib/admindocs/locale/nb/LC_MESSAGES/django.mo,sha256=qlzN0-deW2xekojbHi2w6mYKeBe1Cf1nm8Z5FVrmYtA,6308 -django/contrib/admindocs/locale/nb/LC_MESSAGES/django.po,sha256=a60vtwHJXhjbRAtUIlO0w3XfQcQ0ljwmwFG3WbQ7PNo,6875 -django/contrib/admindocs/locale/ne/LC_MESSAGES/django.mo,sha256=fWPAUZOX9qrDIxGhVVouJCVDWEQLybZ129wGYymuS-c,2571 -django/contrib/admindocs/locale/ne/LC_MESSAGES/django.po,sha256=wb8pCm141YfGSHVW84FnAvsKt5KnKvzNyzGcPr-Wots,5802 -django/contrib/admindocs/locale/nl/LC_MESSAGES/django.mo,sha256=1-s_SdVm3kci2yLQhv1q6kt7zF5EdbaneGAr6PJ7dQU,6498 -django/contrib/admindocs/locale/nl/LC_MESSAGES/django.po,sha256=7s4RysNYRSisywqqZOrRR0il530jRlbEFP3kr4Hq2PA,7277 -django/contrib/admindocs/locale/nn/LC_MESSAGES/django.mo,sha256=tIOU1WrHkAfxD6JBpdakiMi6pVzzvIg0jun6gii-D08,6299 -django/contrib/admindocs/locale/nn/LC_MESSAGES/django.po,sha256=oekYY3xjjM2sPnHv_ZXxAti1ySPF-HxLrvLLk7Izibk,6824 -django/contrib/admindocs/locale/os/LC_MESSAGES/django.mo,sha256=zSQBgSj4jSu5Km0itNgDtbkb1SbxzRvQeZ5M9sXHI8k,2044 -django/contrib/admindocs/locale/os/LC_MESSAGES/django.po,sha256=hZlMmmqfbGmoiElGbJg7Fp791ZuOpRFrSu09xBXt6z4,5215 -django/contrib/admindocs/locale/pa/LC_MESSAGES/django.mo,sha256=yFeO0eZIksXeDhAl3CrnkL1CF7PHz1PII2kIxGA0opQ,1275 -django/contrib/admindocs/locale/pa/LC_MESSAGES/django.po,sha256=DA5LFFLOXHIJIqrrnj9k_rqL-wr63RYX_i-IJFhBuc0,4900 -django/contrib/admindocs/locale/pl/LC_MESSAGES/django.mo,sha256=DHxRNP6YK8qocDqSd2DZg7n-wPp2hJSbjNBLFti7U8o,6633 -django/contrib/admindocs/locale/pl/LC_MESSAGES/django.po,sha256=mRjleE2-9r9TfseHWeyjvRwzBZP_t2LMvihq8n_baU8,7575 -django/contrib/admindocs/locale/pt/LC_MESSAGES/django.mo,sha256=KQnbHsHLYTHd-s8k-xu2y1NHHjvtTWe5XqQko3wz68Q,6605 -django/contrib/admindocs/locale/pt/LC_MESSAGES/django.po,sha256=zG5vL4ZvPzOln_3RhPdHw6p_ig78Y4sUXML0U7YKAvQ,7304 -django/contrib/admindocs/locale/pt_BR/LC_MESSAGES/django.mo,sha256=L8t589rbg4vs4HArLpgburmMufZ6BTuwxxkv1QUetBA,6590 -django/contrib/admindocs/locale/pt_BR/LC_MESSAGES/django.po,sha256=EG4xELZ8emUIWB78cw8gFeiqTiN9UdAuEaXHyPyNtIE,7538 -django/contrib/admindocs/locale/ro/LC_MESSAGES/django.mo,sha256=9K8Sapn6sOg1wtt2mxn7u0cnqPjEHH70qjwM-XMPzNA,6755 -django/contrib/admindocs/locale/ro/LC_MESSAGES/django.po,sha256=b4AsPjWBYHQeThAtLP_TH4pJitwidtoPNkJ7dowUuRg,7476 -django/contrib/admindocs/locale/ru/LC_MESSAGES/django.mo,sha256=9pIPv2D0rq29vrBNWZENM_SOdNpaPidxmgT20hWtBis,8434 -django/contrib/admindocs/locale/ru/LC_MESSAGES/django.po,sha256=BTlxkS4C0DdfC9QJCegXwi5ejfG9pMsAdfy6UJzec3s,9175 -django/contrib/admindocs/locale/sk/LC_MESSAGES/django.mo,sha256=QR3Yvh6y6qJLr4umB0_HcVRIrqD-o1z3rnDv38hLkCQ,6670 -django/contrib/admindocs/locale/sk/LC_MESSAGES/django.po,sha256=QPTSNtN-7QBUX7G7d67zs5kPHS3tXoi7WCy_y1nhPfQ,7375 -django/contrib/admindocs/locale/sl/LC_MESSAGES/django.mo,sha256=FMg_s9ZpeRD42OsSF9bpe8pRQ7wP7-a9WWnaVliqXpU,6508 -django/contrib/admindocs/locale/sl/LC_MESSAGES/django.po,sha256=JWO_WZAwBpXw-4FoB7rkWXGhi9aEVq1tH2fOC69rcgg,7105 -django/contrib/admindocs/locale/sq/LC_MESSAGES/django.mo,sha256=OILplcoIos3lKv8349AIi9w6_ulYfnS1GZoF775Syh4,6561 -django/contrib/admindocs/locale/sq/LC_MESSAGES/django.po,sha256=K9t4P0o9nZfMfqUL4VOOEgw-70i55Gji_fl0517jogc,7180 -django/contrib/admindocs/locale/sr/LC_MESSAGES/django.mo,sha256=wQbXQFTFYjeJvUQ4twmF_O2SYkYkigJ1LQj8xdC5Yu4,8154 -django/contrib/admindocs/locale/sr/LC_MESSAGES/django.po,sha256=KT72y37njw6vgAfXOoY41w_Myv5yrzFC1BQVAd_V79s,8778 -django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=3ytn9SeRgnbIC8YjYTcgdNKgNrizzDwwmLQhVwjvNCY,6542 -django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.po,sha256=2ojglF82ZPFxdnlICYkwkN_EOLli8QRSCPTbILxug9g,13364 -django/contrib/admindocs/locale/sv/LC_MESSAGES/django.mo,sha256=5i9qxo9V7TghSIpKCOw5PpITYYHMP-0NhFivwc-w0yw,6394 -django/contrib/admindocs/locale/sv/LC_MESSAGES/django.po,sha256=WhABV5B-rhBly6ueJPOMsIBjSiw7i1yCZUQsXWE_jV4,7137 -django/contrib/admindocs/locale/sw/LC_MESSAGES/django.mo,sha256=pyJfGL7UdPrJAVlCB3YimXxTjTfEkoZQWX-CSpDkcWc,1808 -django/contrib/admindocs/locale/sw/LC_MESSAGES/django.po,sha256=SIywrLX1UGx4OiPxoxUYelmQ1YaY2LMa3dxynGQpHp8,4929 -django/contrib/admindocs/locale/ta/LC_MESSAGES/django.mo,sha256=8SjQ9eGGyaZGhkuDoZTdtYKuqcVyEtWrJuSabvNRUVM,1675 -django/contrib/admindocs/locale/ta/LC_MESSAGES/django.po,sha256=k593yzVqpSQOsdpuF-rdsSLwKQU8S_QFMRpZXww__1A,5194 -django/contrib/admindocs/locale/te/LC_MESSAGES/django.mo,sha256=eAzNpYRy_G1erCcKDAMnJC4809ITRHvJjO3vpyAC_mk,1684 -django/contrib/admindocs/locale/te/LC_MESSAGES/django.po,sha256=oDg_J8JxepFKIe5m6lDKVC4YWQ_gDLibgNyQ3508VOM,5204 -django/contrib/admindocs/locale/tg/LC_MESSAGES/django.mo,sha256=jSMmwS6F_ChDAZDyTZxRa3YuxkXWlO-M16osP2NLRc0,7731 -django/contrib/admindocs/locale/tg/LC_MESSAGES/django.po,sha256=mewOHgRsFydk0d5IY3jy3rOWa6uHdatlSIvFNZFONsc,8441 -django/contrib/admindocs/locale/th/LC_MESSAGES/django.mo,sha256=bHK49r45Q1nX4qv0a0jtDja9swKbDHHJVLa3gM13Cb4,2167 -django/contrib/admindocs/locale/th/LC_MESSAGES/django.po,sha256=_GMgPrD8Zs0lPKQOMlBmVu1I59yXSV42kfkrHzeiehY,5372 -django/contrib/admindocs/locale/tr/LC_MESSAGES/django.mo,sha256=L1iBsNGqqfdNkZZmvnnBB-HxogAgngwhanY1FYefveE,6661 -django/contrib/admindocs/locale/tr/LC_MESSAGES/django.po,sha256=D4vmznsY4icyKLXQUgAL4WZL5TOUZYVUSCJ4cvZuFg8,7311 -django/contrib/admindocs/locale/tt/LC_MESSAGES/django.mo,sha256=pQmAQOPbrBVzBqtoQ0dsFWFwC6LxA5mQZ9QPqL6pSFw,1869 -django/contrib/admindocs/locale/tt/LC_MESSAGES/django.po,sha256=NCLv7sSwvEficUOSoMJlHGqjgjYvrvm2V3j1Gkviw80,5181 -django/contrib/admindocs/locale/udm/LC_MESSAGES/django.mo,sha256=hwDLYgadsKrQEPi9HiuMWF6jiiYUSy4y-7PVNJMaNpY,618 -django/contrib/admindocs/locale/udm/LC_MESSAGES/django.po,sha256=29fpfn4p8KxxrBdg4QB0GW_l8genZVV0kYi50zO-qKs,5099 -django/contrib/admindocs/locale/ug/LC_MESSAGES/django.mo,sha256=OIyPz5i48Ab2CVmCe71agW8qMsYMTwTG2E7rJft7P5k,7867 -django/contrib/admindocs/locale/ug/LC_MESSAGES/django.po,sha256=GM6ypRwZ6d6VXM0XVvg9p_334pxhex1yd5-HS8Z1z9U,8380 -django/contrib/admindocs/locale/uk/LC_MESSAGES/django.mo,sha256=G-3yCDj2jK7ZTu80YXGJ_ZR1E7FejbLxTFe866G4Pr0,8468 -django/contrib/admindocs/locale/uk/LC_MESSAGES/django.po,sha256=bbWzP-gpbslzbTBc_AO7WBNmtr3CkLOwkSJHI0Z_dTA,9330 -django/contrib/admindocs/locale/ur/LC_MESSAGES/django.mo,sha256=VNg9o_7M0Z2LC0n3_-iwF3zYmncRJHaFqqpxuPmMq84,1836 -django/contrib/admindocs/locale/ur/LC_MESSAGES/django.po,sha256=QTg85c4Z13hMN_PnhjaLX3wx6TU4SH4hPTzNBfNVaMU,5148 -django/contrib/admindocs/locale/vi/LC_MESSAGES/django.mo,sha256=F6dyo00yeyUND_w1Ocm9SL_MUdXb60QQpmAQPto53IU,1306 -django/contrib/admindocs/locale/vi/LC_MESSAGES/django.po,sha256=JrVKjT848Y1cS4tpH-eRivFNwM-cUs886UEhY2FkTPw,4836 -django/contrib/admindocs/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=ngPlxN85wGOMKoo3OK3wUQeikoaxPKqAIsgw2_0ovN4,6075 -django/contrib/admindocs/locale/zh_Hans/LC_MESSAGES/django.po,sha256=TNdJGJCAi0OijBN6w23SwKieZqNqkgNt2qdlPfY-r20,6823 -django/contrib/admindocs/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=Tx2MdoDy5aGjAGnDhYrV6mHN-inyqa3mA2zDAYPsQc4,6016 -django/contrib/admindocs/locale/zh_Hant/LC_MESSAGES/django.po,sha256=vhYxKhDRm6BkUKkLFetq1zDZ1-08Xe1xVnbUD0ABQuc,6734 -django/contrib/admindocs/middleware.py,sha256=owqLbigBtxKmhPQmz767KOAkN3nKRIJrwZAUuHRIAQM,1329 -django/contrib/admindocs/templates/admin_doc/bookmarklets.html,sha256=fSQP3eErm6R8yD7c8-KVilViI0vww6dqwkLwaAjgCaY,1282 -django/contrib/admindocs/templates/admin_doc/index.html,sha256=6bmIkahIH8CWMhGEytTHUZ7DtrDmcqhomJe48KbzvZY,1369 -django/contrib/admindocs/templates/admin_doc/missing_docutils.html,sha256=sx3z874_SIWPjKndIzfwYl8bQzEpTYMckA11RFFbqRI,788 -django/contrib/admindocs/templates/admin_doc/model_detail.html,sha256=DM5mTGfs1lEKlclSKMldLDsOoyrqRavqkR57hNM-cKE,1922 -django/contrib/admindocs/templates/admin_doc/model_index.html,sha256=sgwiE4Xxz7kcbk_UhHxgxLXyBh8SMHgHHvBucby3pPc,1358 -django/contrib/admindocs/templates/admin_doc/template_detail.html,sha256=sApk1HNa-n41lMIxRZHGoft9S4PvYedDPTtvHWuSsSc,1035 -django/contrib/admindocs/templates/admin_doc/template_filter_index.html,sha256=U2HBVHXtgCqUp9hLuOMVqCxBbXyYMMgAORG8fziN7uc,1775 -django/contrib/admindocs/templates/admin_doc/template_tag_index.html,sha256=S4U-G05yi1YIlFEv-HG20bDiq4rhdiZCgebhVBzNzdY,1731 -django/contrib/admindocs/templates/admin_doc/view_detail.html,sha256=z5o74X-5f1tGUS37-hKzY571xEcIa7U4XDqnUxewfBU,904 -django/contrib/admindocs/templates/admin_doc/view_index.html,sha256=ZLfmxMkVlPYETRFnjLmU3bagve4ZvY1Xzsya1Lntgkw,1734 -django/contrib/admindocs/urls.py,sha256=spPSD6wc_B9eABF4mEWIhPSZ3w6W4fM6ERGepo8NRtY,1309 -django/contrib/admindocs/utils.py,sha256=aen7s5rbj3jzycTe75tIMib3eyhX3FveJfvkjGnB45A,8160 -django/contrib/admindocs/views.py,sha256=go2dArGToREBz__jhEhYKyW1a4aKBKMG7jvJDKnh9ic,19572 -django/contrib/auth/__init__.py,sha256=lseh_VhD1EXcd2-oPn7w-xU2csUKt5pNlIrLKKca2iY,14937 -django/contrib/auth/__pycache__/__init__.cpython-310.pyc,, -django/contrib/auth/__pycache__/admin.cpython-310.pyc,, -django/contrib/auth/__pycache__/apps.cpython-310.pyc,, -django/contrib/auth/__pycache__/backends.cpython-310.pyc,, -django/contrib/auth/__pycache__/base_user.cpython-310.pyc,, -django/contrib/auth/__pycache__/checks.cpython-310.pyc,, -django/contrib/auth/__pycache__/context_processors.cpython-310.pyc,, -django/contrib/auth/__pycache__/decorators.cpython-310.pyc,, -django/contrib/auth/__pycache__/forms.cpython-310.pyc,, -django/contrib/auth/__pycache__/hashers.cpython-310.pyc,, -django/contrib/auth/__pycache__/middleware.cpython-310.pyc,, -django/contrib/auth/__pycache__/mixins.cpython-310.pyc,, -django/contrib/auth/__pycache__/models.cpython-310.pyc,, -django/contrib/auth/__pycache__/password_validation.cpython-310.pyc,, -django/contrib/auth/__pycache__/signals.cpython-310.pyc,, -django/contrib/auth/__pycache__/tokens.cpython-310.pyc,, -django/contrib/auth/__pycache__/urls.cpython-310.pyc,, -django/contrib/auth/__pycache__/validators.cpython-310.pyc,, -django/contrib/auth/__pycache__/views.cpython-310.pyc,, -django/contrib/auth/admin.py,sha256=FVdusKgPDsYTTWZyXKZRklbWStLHo-bO_Eea2_n_zag,10378 -django/contrib/auth/apps.py,sha256=qpjjFdMH0H3-ialZrRYQ5fnmfCuSh0RiD3bsKzzTEeY,1284 -django/contrib/auth/backends.py,sha256=tuoMSIJ87IQjYMVq8RoznU5Bn3Wytg4s_hEv35SKrh8,12967 -django/contrib/auth/base_user.py,sha256=id-h7igTZ-LNhkA2tF6R9MRz1JzBwwXVhh4MhofVVSs,5043 -django/contrib/auth/checks.py,sha256=yXWvy6kUyj4WfDlkDBtybwEFKuqvNhT9rqHj4FCdTlA,9847 -django/contrib/auth/common-passwords.txt.gz,sha256=PBuu1iWW3jaGCCTrP0NtWTLTfKiwblnfePWkTsF1r-Q,80228 -django/contrib/auth/context_processors.py,sha256=8BbvdbTVPl8GVgB5-2LTzx6FrGsMzev-E7JMnUgr-rM,1911 -django/contrib/auth/decorators.py,sha256=UUuJ1linbJLUpj2fEYIXt3lcF7Uo4KGaEP5EdomykFQ,4760 -django/contrib/auth/forms.py,sha256=TsKiVEQTdbb6uCJzGl-31gsQk5l1SpHLCAkJynzntqc,21496 -django/contrib/auth/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/auth/handlers/__pycache__/__init__.cpython-310.pyc,, -django/contrib/auth/handlers/__pycache__/modwsgi.cpython-310.pyc,, -django/contrib/auth/handlers/modwsgi.py,sha256=bTXKVMezywsn1KA2MVyDWeHvTNa2KrwIxn2olH7o_5I,1248 -django/contrib/auth/hashers.py,sha256=EuewAkS82YniqmRsrV2IT3ttZ761oG7JBHMUVpeIZ5I,23335 -django/contrib/auth/locale/af/LC_MESSAGES/django.mo,sha256=NWVSVHPiDi8XdIWVVBOvlN8a-l94hzvN7DNObsL8Nu4,8449 -django/contrib/auth/locale/af/LC_MESSAGES/django.po,sha256=wv4Ls1PSlHA-ZOaC1v5CpNvPxseAZxRLtQc5lITYf0Q,8647 -django/contrib/auth/locale/ar/LC_MESSAGES/django.mo,sha256=7LhxFfL9y6RAfZ8PU-1lKI2V02LbHxXtB1UAf_vXpuc,10040 -django/contrib/auth/locale/ar/LC_MESSAGES/django.po,sha256=2QIaioY0RedAB0CFKVZLhGoCnhLzgUh84sAR7i6QUnQ,10520 -django/contrib/auth/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=0UokSPc3WDs_0PozSalfBaq4JFYgF1Rt7b90CKvY5jE,10228 -django/contrib/auth/locale/ar_DZ/LC_MESSAGES/django.po,sha256=GDvm2m1U7NOY5l7FijKGR77DEZt6rYWoSPCxsY5BZ3Y,10574 -django/contrib/auth/locale/ast/LC_MESSAGES/django.mo,sha256=Pt3gYY3j8Eroo4lAEmf-LR6u9U56mpE3vqLhjR4Uq-o,2250 -django/contrib/auth/locale/ast/LC_MESSAGES/django.po,sha256=Kiq4s8d1HnYpo3DQGlgUl3bOkxmgGW8CvGp9AbryRk8,5440 -django/contrib/auth/locale/az/LC_MESSAGES/django.mo,sha256=lSvutBofai-DGk-5quHnAtUdvm8yMDODXE0mHRdXXG8,8758 -django/contrib/auth/locale/az/LC_MESSAGES/django.po,sha256=SCEXf1r7q8P0dXOM36RUM_vlxKzApsfHiN8U-IMUR_Q,9134 -django/contrib/auth/locale/be/LC_MESSAGES/django.mo,sha256=GiAmNOuVSc5mQ9ne8BGNz1BeK2WLZQPzIHTZsJZP6As,11469 -django/contrib/auth/locale/be/LC_MESSAGES/django.po,sha256=shpzgVhb1UC2uoq1IhlYRqm_b_YfGLXqdO-8pZVPBX0,11784 -django/contrib/auth/locale/bg/LC_MESSAGES/django.mo,sha256=qChURIcNm50ePM5nO-Rh44LO-f8ww7lUro0GQRXE_wY,10717 -django/contrib/auth/locale/bg/LC_MESSAGES/django.po,sha256=9Uo19-kzj6jTyvKGyWFk4KdqbXwZOvX4rucEJXRJFGE,11221 -django/contrib/auth/locale/bn/LC_MESSAGES/django.mo,sha256=cJSawQn3rNh2I57zK9vRi0r1xc598Wr26AyHh6D50ZQ,5455 -django/contrib/auth/locale/bn/LC_MESSAGES/django.po,sha256=5Vqd4n9ab98IMev4GHLxpO7f4r9nnhC3Nfx27HQNd8s,7671 -django/contrib/auth/locale/br/LC_MESSAGES/django.mo,sha256=nxLj88BBhT3Hudev1S_BRC8P6Jv7eoR8b6CHGt5eoPo,1436 -django/contrib/auth/locale/br/LC_MESSAGES/django.po,sha256=rFo68wfXMyju633KCAhg0Jcb3GVm3rk4opFQqI89d6Y,5433 -django/contrib/auth/locale/bs/LC_MESSAGES/django.mo,sha256=jDjP1qIs02k6RixY9xy3V7Cr6zi-henR8nDnhqNG18s,3146 -django/contrib/auth/locale/bs/LC_MESSAGES/django.po,sha256=NOICHHU8eFtltH0OBlnasz9TF0uZGZd3hMibRmn158E,5975 -django/contrib/auth/locale/ca/LC_MESSAGES/django.mo,sha256=lqiOLv_LZDLeXbJZYsrWRHzcnwd1vd00tW5Jrh-HHkY,7643 -django/contrib/auth/locale/ca/LC_MESSAGES/django.po,sha256=v-3t7bDTh1835nZnjYh3_HyN4yw4a1HyHpC3-jX79Z0,8216 -django/contrib/auth/locale/ckb/LC_MESSAGES/django.mo,sha256=JCxL4vCR76rQywGn0bbhs0DGltbj-DOF_GTjcWuk2n8,11066 -django/contrib/auth/locale/ckb/LC_MESSAGES/django.po,sha256=SdmYPkVor_sWdOnLkyclkaR52N1IiXUP-0i7xjZs2hk,11254 -django/contrib/auth/locale/cs/LC_MESSAGES/django.mo,sha256=BXWVPB6GeisxXPEq8Pn8wBw9ByZIW-JQAPomzzzx3vo,8888 -django/contrib/auth/locale/cs/LC_MESSAGES/django.po,sha256=Of36j3TXudwYp8to5RpuAoi-_zLcGHIRNkxcDG91AqA,9367 -django/contrib/auth/locale/cy/LC_MESSAGES/django.mo,sha256=lSfCwEVteW4PDaiGKPDxnSnlDUcGMkPfsxIluExZar0,4338 -django/contrib/auth/locale/cy/LC_MESSAGES/django.po,sha256=-LPAKGXNzB77lVHfCRmFlH3SUaLgOXk_YxfC0BomcEs,6353 -django/contrib/auth/locale/da/LC_MESSAGES/django.mo,sha256=gHZ0OYN9o5qBRsulKkfdUIDq1uyuZVM6nKEXEow2gLY,8461 -django/contrib/auth/locale/da/LC_MESSAGES/django.po,sha256=Y_kt-VEeqLJsTiuHGLoRPO6iap5Zee6rsAFgQJrA-6U,8916 -django/contrib/auth/locale/de/LC_MESSAGES/django.mo,sha256=nvwrbU-uvQonGW_UD5zVh7u70csi_5qCehsI-AlTRx4,7607 -django/contrib/auth/locale/de/LC_MESSAGES/django.po,sha256=MJGIuwfkwEs9oiktL4C2uB0XXG6gh2zCI_jr-DcH5Tk,8158 -django/contrib/auth/locale/dsb/LC_MESSAGES/django.mo,sha256=HhQfp6gYGCqoRXs20WcY23tEfxEQasQ4KmBbPc0C8_U,9231 -django/contrib/auth/locale/dsb/LC_MESSAGES/django.po,sha256=C0ISLaZtrZfakhpVuZSsmi9YpZOaMPCBE4lq25niHuY,9505 -django/contrib/auth/locale/el/LC_MESSAGES/django.mo,sha256=KaP9RLYThwYWLBx0W90HI0zJZ09iNhZ3tk8UVF63n74,10072 -django/contrib/auth/locale/el/LC_MESSAGES/django.po,sha256=O5JsNCUNr1YcNNqMugoM5epN6nC5pgq3E6nKXDh3OY0,10795 -django/contrib/auth/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/auth/locale/en/LC_MESSAGES/django.po,sha256=RvU9DEhUirOa_bD__B4R2KYfUfcyUsSgQb5jizUuboQ,8634 -django/contrib/auth/locale/en_AU/LC_MESSAGES/django.mo,sha256=7cPKOZX0ZmWCYU2ZwgCp8LwXj7FAdP3lMoI2u4nzgeU,7183 -django/contrib/auth/locale/en_AU/LC_MESSAGES/django.po,sha256=92Q42wfwKhGxDkomv8JlGBHVUdFIc_wvm_LUNBc9Q1k,7467 -django/contrib/auth/locale/en_GB/LC_MESSAGES/django.mo,sha256=p57gDaYVvgEk1x80Hq4Pn2SZbsp9ly3XrJ5Ttlt2yOE,3179 -django/contrib/auth/locale/en_GB/LC_MESSAGES/django.po,sha256=-yDflw5-81VOlyqkmLJN17FRuwDrhYXItFUJwx2aqpE,5787 -django/contrib/auth/locale/eo/LC_MESSAGES/django.mo,sha256=OCEu7qwKb20Cq2UO-dmHjNPXRfDTsQHp9DbyVXCxNMw,7421 -django/contrib/auth/locale/eo/LC_MESSAGES/django.po,sha256=wrvLqKIJycioUFAI7GkCRtDNZ9_OigG_Bf79Dmgpa7c,7868 -django/contrib/auth/locale/es/LC_MESSAGES/django.mo,sha256=c5Z43RTCGGNTYbYlkgLPLM669k5DfWGrqHWDhnB7Dy0,9100 -django/contrib/auth/locale/es/LC_MESSAGES/django.po,sha256=NbzqLfTGlDAQKs-_xBUijLliYyb9FgRA5z4wFnPuo94,9928 -django/contrib/auth/locale/es_AR/LC_MESSAGES/django.mo,sha256=HFBDVYURht_16OeEXDmwV-z_xYemGMj7E-7ytjbG6Cc,9177 -django/contrib/auth/locale/es_AR/LC_MESSAGES/django.po,sha256=k6B9nQkO5pXiChw_-2kOHEgIwe3kA22aG46hHqvc0Z8,9414 -django/contrib/auth/locale/es_CO/LC_MESSAGES/django.mo,sha256=K5VaKTyeV_WoKsLR1x8ZG4VQmk3azj6ZM8Phqjs81So,6529 -django/contrib/auth/locale/es_CO/LC_MESSAGES/django.po,sha256=qJywTaYi7TmeMB1sjwsiwG8GXtxAOaOX0voj7lLVZRw,7703 -django/contrib/auth/locale/es_MX/LC_MESSAGES/django.mo,sha256=dCav1yN5q3bU4PvXZd_NxHQ8cZ9KqQCiNoe4Xi8seoY,7822 -django/contrib/auth/locale/es_MX/LC_MESSAGES/django.po,sha256=_4un21ALfFsFaqpLrkE2_I18iEfJlcAnd_X8YChfdWo,8210 -django/contrib/auth/locale/es_VE/LC_MESSAGES/django.mo,sha256=GwpZytNHtK7Y9dqQKDiVi4SfA1AtPlk824_k7awqrdI,7415 -django/contrib/auth/locale/es_VE/LC_MESSAGES/django.po,sha256=G3mSCo_XGRUfOAKUeP_UNfWVzDPpbQrVYQt8Hv3VZVM,7824 -django/contrib/auth/locale/et/LC_MESSAGES/django.mo,sha256=Y1eOo4oF0ibCMrZr3PyLleQqFrXNIn_m1GeaIt9eIbY,8312 -django/contrib/auth/locale/et/LC_MESSAGES/django.po,sha256=Xn40JVNZUawXfmokf8yof20OTsf_1Zr5dRv0PJdZC5Y,8780 -django/contrib/auth/locale/eu/LC_MESSAGES/django.mo,sha256=aQfIMZ8FRzP-6OpZCpC2qrd4wbyWiapJOVIWlmyqde0,7181 -django/contrib/auth/locale/eu/LC_MESSAGES/django.po,sha256=AP53NIzFy-aCLnLds70LMg-XW7F_95VSD1ZWCedgkTI,7732 -django/contrib/auth/locale/fa/LC_MESSAGES/django.mo,sha256=yeA_5LAPu7OyQssunvUNlH07bPVCyGLpnvijNenrtHQ,8979 -django/contrib/auth/locale/fa/LC_MESSAGES/django.po,sha256=NChJSgpkXrwAiTrCJzvwlm9mh-LFSD1rR1ESdRQD43o,9513 -django/contrib/auth/locale/fi/LC_MESSAGES/django.mo,sha256=BD1S-C1KhY-iXIYf-xBOAq-w7UGEznmEhN2DU7yurXo,8209 -django/contrib/auth/locale/fi/LC_MESSAGES/django.po,sha256=KZ3oSpzHbFmYwjkw-SMJe99gvYrUuiS2_I-RmOxq3Iw,8650 -django/contrib/auth/locale/fr/LC_MESSAGES/django.mo,sha256=ulghoa4OlMI5ZDdzGt8zP2PKySj-y1mPrlhADNYxLpI,9476 -django/contrib/auth/locale/fr/LC_MESSAGES/django.po,sha256=bE_orNW4bKebN_Af8FoVCSlYj4VegE68wj7aNfSCCqo,9816 -django/contrib/auth/locale/fy/LC_MESSAGES/django.mo,sha256=95N-77SHF0AzQEer5LuBKu5n5oWf3pbH6_hQGvDrlP4,476 -django/contrib/auth/locale/fy/LC_MESSAGES/django.po,sha256=8XOzOFx-WerF7whzTie03hgO-dkbUFZneyrpZtat5JY,3704 -django/contrib/auth/locale/ga/LC_MESSAGES/django.mo,sha256=UblN6hhEtT4qBKfH-aMdUKXqOCELTZHp3sCZ8ECxPFM,9476 -django/contrib/auth/locale/ga/LC_MESSAGES/django.po,sha256=X1399hXdhaQLsVQvOr98GYPBWX9l1hY28-SjpT2Ma4Q,9891 -django/contrib/auth/locale/gd/LC_MESSAGES/django.mo,sha256=BLBYJV9Adx1BsXZaM0qZ54mNRAF5s4dxB1TBLtIyMHQ,8743 -django/contrib/auth/locale/gd/LC_MESSAGES/django.po,sha256=rqPK26mtE_U-TG2qyjc5xCR-feI3sGXZR5H6ohNzx4s,9099 -django/contrib/auth/locale/gl/LC_MESSAGES/django.mo,sha256=WTXkzn81WNcJXzDJoPdE3TWDQpKI8WP8GHx1Gq1sHv8,8805 -django/contrib/auth/locale/gl/LC_MESSAGES/django.po,sha256=xl3kbm0rMJ-3UcblwkEmjNLupbUdbNWqXiNNEUYbFYs,9223 -django/contrib/auth/locale/he/LC_MESSAGES/django.mo,sha256=jUw9NUWUPuCUFURILUDZJdiqHsZZ8X2UyKWnbRpmKYs,9108 -django/contrib/auth/locale/he/LC_MESSAGES/django.po,sha256=lytdeP1YOO6l7dJmKEiSSVGhQcPluz0OAnh07D3N5mI,9698 -django/contrib/auth/locale/hi/LC_MESSAGES/django.mo,sha256=7CxV1H37hMbgKIhnAWx-aJmipLRosJe1qg8BH2CABfw,5364 -django/contrib/auth/locale/hi/LC_MESSAGES/django.po,sha256=DU5YM6r1kd5fo40yqFXzEaNh42ezFQFQ-0dmVqkaKQ0,7769 -django/contrib/auth/locale/hr/LC_MESSAGES/django.mo,sha256=GEap3QClwCkuwQZKJE7qOZl93RRxmyyvTTnOTYaAWUo,5894 -django/contrib/auth/locale/hr/LC_MESSAGES/django.po,sha256=ALftoYSaI1U90RNDEvnaFATbw1SL0m8fNXAyl6DkSvo,7355 -django/contrib/auth/locale/hsb/LC_MESSAGES/django.mo,sha256=UGCU7rmCKxWPEfVFnEOtL6h56g_MDA-dcY_USyVJh40,9028 -django/contrib/auth/locale/hsb/LC_MESSAGES/django.po,sha256=HwyPeAaUK3DvSXIkJxjv9vgbk-cIFwpeH_raMRA4OOc,9281 -django/contrib/auth/locale/hu/LC_MESSAGES/django.mo,sha256=sLpLRIUx2raYIJjv9H2agJu68RYArbm3IXJ_qEqDWwk,7407 -django/contrib/auth/locale/hu/LC_MESSAGES/django.po,sha256=VlsFxrXj0mF9s_shT2WHXco0vJWViYrFGSRSwqwl5WA,8468 -django/contrib/auth/locale/hy/LC_MESSAGES/django.mo,sha256=zoLe0EqIH8HQYC5XAWd8b8mA2DpbmDSEBsF-WIKX_OQ,8001 -django/contrib/auth/locale/hy/LC_MESSAGES/django.po,sha256=wIWLbz6f0n44ZcjEbZZsgoWTpzXRGND15hudr_DQ3l0,8787 -django/contrib/auth/locale/ia/LC_MESSAGES/django.mo,sha256=OTxh6u0QmsytMrp8IKWBwMnhrYCpyS6qVnF7YBCAWe0,7626 -django/contrib/auth/locale/ia/LC_MESSAGES/django.po,sha256=ue4RXEXweO1-9sZOKkLZsyZe8yxnPWB3JZyyh3qzmlA,7895 -django/contrib/auth/locale/id/LC_MESSAGES/django.mo,sha256=i44jbpeM268EEjnXiPwDVB9DU7QYNnt-_hAA6kxKW-I,7991 -django/contrib/auth/locale/id/LC_MESSAGES/django.po,sha256=eIj0zrGUKym5o4mwRT2op5Jjj3z9nc-EnMQRSxDoPQc,8550 -django/contrib/auth/locale/io/LC_MESSAGES/django.mo,sha256=YwAS3aWljAGXWcBhGU_GLVuGJbHJnGY8kUCE89CPdks,464 -django/contrib/auth/locale/io/LC_MESSAGES/django.po,sha256=W36JXuA1HQ72LspixRxeuvxogVxtk7ZBbT0VWI38_oM,3692 -django/contrib/auth/locale/is/LC_MESSAGES/django.mo,sha256=0PBYGqQKJaAG9m2jmJUzcqRVPc16hCe2euECMCrNGgI,7509 -django/contrib/auth/locale/is/LC_MESSAGES/django.po,sha256=o6dQ8WMuPCw4brSzKUU3j8PYhkLBO7XQ3M7RlsIw-VY,7905 -django/contrib/auth/locale/it/LC_MESSAGES/django.mo,sha256=pcBcdOXLqT4shr7Yw5l-pxfYknJyDW6d-jGtkncl24E,7862 -django/contrib/auth/locale/it/LC_MESSAGES/django.po,sha256=f03_tMPiwLF1ZyWfnB_j2vhPR1AXkborGQS2Tbxufzk,8471 -django/contrib/auth/locale/ja/LC_MESSAGES/django.mo,sha256=_iLobe-w4zxA1CQTZ045ZxuUiAsfSM-NL7p9H7C6shU,9229 -django/contrib/auth/locale/ja/LC_MESSAGES/django.po,sha256=JHggNIie2hqLGta327VO0e32U_AL8Ex30bnsS4CXhHY,9564 -django/contrib/auth/locale/ka/LC_MESSAGES/django.mo,sha256=4aJoE1O5jfm5MI7kBqymzb-xOKLDw2mJD5-VhezlMA8,10372 -django/contrib/auth/locale/ka/LC_MESSAGES/django.po,sha256=hvmbD3RS3lOFj2h7A3m23asktwM5zbCdRvs7YvesAkI,11163 -django/contrib/auth/locale/kab/LC_MESSAGES/django.mo,sha256=9qKeQ-gDByoOdSxDpSbLaM4uSP5sIi7qlTn8tJidVDs,2982 -django/contrib/auth/locale/kab/LC_MESSAGES/django.po,sha256=8cq5_rjRXPzTvn1jPo6H_Jcrv6IXkWr8n9fTPvghsS8,5670 -django/contrib/auth/locale/kk/LC_MESSAGES/django.mo,sha256=RJablrXpRba6YVB_8ACSt2q_BjmxrHQZzX6RxMJImlA,3542 -django/contrib/auth/locale/kk/LC_MESSAGES/django.po,sha256=OebwPN9iWBvjDu0P2gQyBbShvIFxFIqCw8DpKuti3xk,6360 -django/contrib/auth/locale/km/LC_MESSAGES/django.mo,sha256=FahcwnCgzEamtWcDEPOiJ4KpXCIHbnSowfSRdRQ2F9U,2609 -django/contrib/auth/locale/km/LC_MESSAGES/django.po,sha256=lvRHHIkClbt_8-9Yn0xY57dMxcS72z4sUkxLb4cohP0,5973 -django/contrib/auth/locale/kn/LC_MESSAGES/django.mo,sha256=u0YygqGJYljBZwI9rm0rRk_DdgaBEMA1etL-Lk-7Mls,4024 -django/contrib/auth/locale/kn/LC_MESSAGES/django.po,sha256=J67MIAas5egVq_FJBNsug3Y7rZ8KakhQt6isyF23HAA,6957 -django/contrib/auth/locale/ko/LC_MESSAGES/django.mo,sha256=BoPN1qtu__YoF19sLtrdlcZsSw3LTzmsngzKEHqPxjc,8428 -django/contrib/auth/locale/ko/LC_MESSAGES/django.po,sha256=0XpX0EMsKEuZqOU0C6k4Q3OliBPsviZJcONRV329OtM,9360 -django/contrib/auth/locale/ky/LC_MESSAGES/django.mo,sha256=mnBXtpInYxaSNIURJTmx8uBg_PH-NuPN9r54pkQY3q4,8924 -django/contrib/auth/locale/ky/LC_MESSAGES/django.po,sha256=7FeO_Kb2er0S84KnFeXVHO3TgAmEJ0gTQEDHImoxiZ4,9170 -django/contrib/auth/locale/lb/LC_MESSAGES/django.mo,sha256=OFhpMA1ZXhrs5fwZPO5IjubvWDiju4wfwWiV94SFkiA,474 -django/contrib/auth/locale/lb/LC_MESSAGES/django.po,sha256=dOfY9HjTfMQ0nkRYumw_3ZaywbUrTgT-oTXAnrRyfxo,3702 -django/contrib/auth/locale/lt/LC_MESSAGES/django.mo,sha256=-nlZHl7w__TsFUmBb5pQV_XJtKGsi9kzP6CBZXkfM8M,8146 -django/contrib/auth/locale/lt/LC_MESSAGES/django.po,sha256=-rdhB6eroSSemsdZkG1Jl4CruNZc_7dj4m5IVoyRBUQ,8620 -django/contrib/auth/locale/lv/LC_MESSAGES/django.mo,sha256=edKbqckOHi6tnnRhF1Qt_5nt4auX06cpyHrborMQhAo,8741 -django/contrib/auth/locale/lv/LC_MESSAGES/django.po,sha256=q7hLb-DwMOR7MvYUR5K_AU7VoNBz0CPRAOawaTsbrt4,9243 -django/contrib/auth/locale/mk/LC_MESSAGES/django.mo,sha256=XS9dslnD_YBeD07P8WQkss1gT7GIV-qLiCx4i5_Vd_k,9235 -django/contrib/auth/locale/mk/LC_MESSAGES/django.po,sha256=QOLgcwHub9Uo318P2z6sp69MI8syIIWCcr4VOom9vfs,9799 -django/contrib/auth/locale/ml/LC_MESSAGES/django.mo,sha256=UEaqq7nnGvcZ8vqFicLiuqsuEUhEjd2FpWfyzy2HqdU,12611 -django/contrib/auth/locale/ml/LC_MESSAGES/django.po,sha256=xBROIwJb5h2LmyBLAafZ2tUlPVTAOcMgt-olq5XnPT8,13107 -django/contrib/auth/locale/mn/LC_MESSAGES/django.mo,sha256=hBYT0p3LcvIKKPtIn2NzPk_2di9L8jYrUt9j3TcVvaY,9403 -django/contrib/auth/locale/mn/LC_MESSAGES/django.po,sha256=R3wAEwnefEHZsma8J-XOn4XlLtuWYKDPLwJ99DUYmvE,9913 -django/contrib/auth/locale/mr/LC_MESSAGES/django.mo,sha256=c_W1FsdevGBCJfpcY4MmgSPGUGqFAqWArpXhldn9MA8,10430 -django/contrib/auth/locale/mr/LC_MESSAGES/django.po,sha256=x8RUK6Bymg2o3YDREqEZvaLpw2PIzMbXaQhJqpyGpLA,11068 -django/contrib/auth/locale/ms/LC_MESSAGES/django.mo,sha256=eCAZrzQxsM_pAxr_XQo2fIOsCbj5LjGKpLNCzob2l-I,7654 -django/contrib/auth/locale/ms/LC_MESSAGES/django.po,sha256=FAtyzSGcD1mIhRIg8O_1SHLdisTPGYZK-QUjzgw-wCY,7847 -django/contrib/auth/locale/my/LC_MESSAGES/django.mo,sha256=gYzFJKi15RbphgG1IHbJF3yGz3P2D9vaPoHZpA7LoH8,1026 -django/contrib/auth/locale/my/LC_MESSAGES/django.po,sha256=lH5mrq-MyY8gvrNkH2_20rkjFnbviq23wIUqIjPIgFI,5130 -django/contrib/auth/locale/nb/LC_MESSAGES/django.mo,sha256=vLJ9F73atlexwVRzZJpQjcB9arodHIMCh-z8lP5Ah9w,7023 -django/contrib/auth/locale/nb/LC_MESSAGES/django.po,sha256=c3sTCdzWGZgs94z9dIIpfrFuujBuvWvQ-P0gb1tuqlA,7520 -django/contrib/auth/locale/ne/LC_MESSAGES/django.mo,sha256=pq8dEr1ugF5ldwkCDHOq5sXaXV31InbLHYyXU56U_Ao,7722 -django/contrib/auth/locale/ne/LC_MESSAGES/django.po,sha256=bV-uWvT1ViEejrbRbVTtwC2cZVD2yX-KaESxKBnxeRI,8902 -django/contrib/auth/locale/nl/LC_MESSAGES/django.mo,sha256=mVnVHcT_txoSb49PFTXxGVjtdv6Anmo77Ut7YuXuYU8,8654 -django/contrib/auth/locale/nl/LC_MESSAGES/django.po,sha256=VIN_7kSM-4gJVypjnpuGTvYdtZRHDkpFWtuHnZi1TBQ,9445 -django/contrib/auth/locale/nn/LC_MESSAGES/django.mo,sha256=83HdNOuNQVgJXBZMytPz1jx3wWDy8-e6t_JNEUu6W8w,7147 -django/contrib/auth/locale/nn/LC_MESSAGES/django.po,sha256=4ciwQsZFYSV6CjFqzxxcESAm16huv9XyXvU-nchD-Fs,7363 -django/contrib/auth/locale/os/LC_MESSAGES/django.mo,sha256=DVsYGz-31nofEjZla4YhM5L7qoBnQaYnZ4TBki03AI4,4434 -django/contrib/auth/locale/os/LC_MESSAGES/django.po,sha256=Akc1qelQWRA1DE6xseoK_zsY7SFI8SpiVflsSTUhQLw,6715 -django/contrib/auth/locale/pa/LC_MESSAGES/django.mo,sha256=PeOLukzQ_CZjWBa5FGVyBEysat4Gwv40xGMS29UKRww,3666 -django/contrib/auth/locale/pa/LC_MESSAGES/django.po,sha256=7ts9PUSuvfXGRLpfyVirJLDtsQcsVWFXDepVKUVlmtc,6476 -django/contrib/auth/locale/pl/LC_MESSAGES/django.mo,sha256=_xhEgW-4NhOazRhEks9adSOTszToETMue9pStxQ176Y,9051 -django/contrib/auth/locale/pl/LC_MESSAGES/django.po,sha256=9TbY6EwYHBTM-ma6PEojKrOtgNcpfN_mzKwGkWEiYxw,9882 -django/contrib/auth/locale/pt/LC_MESSAGES/django.mo,sha256=BFQO47aJJ7eFxTNEJvrzMDZVYOjSWFhY69YsDpr3c7M,7752 -django/contrib/auth/locale/pt/LC_MESSAGES/django.po,sha256=5MDM4MjVLxcyGMXJvZgATyJJT-oQeNPNuL_Cw6thBHs,8722 -django/contrib/auth/locale/pt_BR/LC_MESSAGES/django.mo,sha256=SbCDXBKvSHkdoVhcfQMXv4U_REmfd_trd6yx1iDUMTE,8790 -django/contrib/auth/locale/pt_BR/LC_MESSAGES/django.po,sha256=CQOyNh0snCEjcdMllEya8aIk3DLo1OJ0xC302hJVnFg,9955 -django/contrib/auth/locale/ro/LC_MESSAGES/django.mo,sha256=GD04tb5R6nEeD6ZMAcZghVhXwr8en1omw0c6BxnyHas,7777 -django/contrib/auth/locale/ro/LC_MESSAGES/django.po,sha256=YfkFuPrMwAR50k6lfOYeBbMosEbvXGWwMBD8B7p_2ZA,8298 -django/contrib/auth/locale/ru/LC_MESSAGES/django.mo,sha256=eCeiUY5awrFu5ih4y-pu8Tvul4vYKmwC0fFi_JXCWNY,11873 -django/contrib/auth/locale/ru/LC_MESSAGES/django.po,sha256=eLgUzuchTermohKhO3WxOHEPdW8IqwqBazgiWDEzkOk,12456 -django/contrib/auth/locale/sk/LC_MESSAGES/django.mo,sha256=FdPkNSXPm8P8iSHY8odyd_m0jFaXLK17SUTodO9FWoA,8862 -django/contrib/auth/locale/sk/LC_MESSAGES/django.po,sha256=K74Uk5HVmd5KRvF87GFL9edBcd0uuHyA8Sv_3qgwMuE,9312 -django/contrib/auth/locale/sl/LC_MESSAGES/django.mo,sha256=_Lx1YcW4tvCpsXXXmcCMhrttpLR4389330tnB1ycCok,7659 -django/contrib/auth/locale/sl/LC_MESSAGES/django.po,sha256=MPEv4Ac5MwcywffmPyLxAzSMLLX1cOdZevPlpIMju28,8136 -django/contrib/auth/locale/sq/LC_MESSAGES/django.mo,sha256=LyP18Ccjd95ki9TVS6YFB3JBeI-U3n0LsOuOWKcXuyc,8601 -django/contrib/auth/locale/sq/LC_MESSAGES/django.po,sha256=hNjXCLEYeWQBhZnPnBdnqoZH5G8X9vsziBDCBt1gRfw,9119 -django/contrib/auth/locale/sr/LC_MESSAGES/django.mo,sha256=RrU2j_5yXCZg61pDapjroO-viDsYpaUP5T_OaFFFxqg,11140 -django/contrib/auth/locale/sr/LC_MESSAGES/django.po,sha256=drf10o62z9XQS534lRvzf5f74tCEHnBeeawFxEM-B9o,11426 -django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=F028YhZ96X5koQPOWpU5fJf4-kmzI1GpL6w9Hcw7iSw,8709 -django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.po,sha256=2lrhF8H-IOscG9evw3Evwrh9N6YV5EWgnK6apM441tg,12220 -django/contrib/auth/locale/sv/LC_MESSAGES/django.mo,sha256=Hxy7f19YQMmOTq9YywhUd5p6Y8Wlfu55bXKw-SElw3I,8542 -django/contrib/auth/locale/sv/LC_MESSAGES/django.po,sha256=c_MyD3bQV8NrBYNDP1fvRoGsjXMZl6uPr55n-r5nmUg,9250 -django/contrib/auth/locale/sw/LC_MESSAGES/django.mo,sha256=I_lEsKuMGm07X1vM3-ReGDx2j09PGLkWcG0onC8q1uQ,5029 -django/contrib/auth/locale/sw/LC_MESSAGES/django.po,sha256=TiZS5mh0oN0e6dFEdh-FK81Vk-tdv35ngJ-EbM1yX80,6455 -django/contrib/auth/locale/ta/LC_MESSAGES/django.mo,sha256=T1t5CKEb8hIumvbOtai-z4LKj2et8sX-PgBMd0B3zuA,2679 -django/contrib/auth/locale/ta/LC_MESSAGES/django.po,sha256=X8UDNmk02X9q1leNV1qWWwPNakhvNd45mCKkQ8EpZQQ,6069 -django/contrib/auth/locale/te/LC_MESSAGES/django.mo,sha256=i9hG4thA0P-Hc-S2oX7GufWFDO4Y_LF4RcdQ22cbLyE,2955 -django/contrib/auth/locale/te/LC_MESSAGES/django.po,sha256=txND8Izv2oEjSlcsx3q6l5fEUqsS-zv-sjVVILB1Bmc,6267 -django/contrib/auth/locale/tg/LC_MESSAGES/django.mo,sha256=MwdyYwC4ILX4MFsqCy46NNfPKLbW1GzRhFxMV0uIbLI,7932 -django/contrib/auth/locale/tg/LC_MESSAGES/django.po,sha256=miOPNThjHZODwjXMbON8PTMQhaCGJ0Gy6FZr6Jcj4J8,8938 -django/contrib/auth/locale/th/LC_MESSAGES/django.mo,sha256=zRpZ2xM5JEQoHtfXm2_XYdhe2FtaqH-hULJadLJ1MHU,6013 -django/contrib/auth/locale/th/LC_MESSAGES/django.po,sha256=Yhh_AQS_aM_9f_yHNNSu_3THbrU-gOoMpfiDKhkaSHo,7914 -django/contrib/auth/locale/tk/LC_MESSAGES/django.mo,sha256=5Rl2GMYL11RMSyro83E2oHNaehHjjGJKAJmp0swjV-0,7467 -django/contrib/auth/locale/tk/LC_MESSAGES/django.po,sha256=HAcou6t1zkXVrzyau7gr4i_H0DYpT5HOh9AxV-tnKD0,7763 -django/contrib/auth/locale/tr/LC_MESSAGES/django.mo,sha256=IsdDh0gI5wOscy7XAT7kgy6ECJRnkcuM5bxmHbpjkZ0,8614 -django/contrib/auth/locale/tr/LC_MESSAGES/django.po,sha256=rFlevzhhHcmj2IayjYIbv305E4CsX2Za8hsK_3B78cU,9179 -django/contrib/auth/locale/tt/LC_MESSAGES/django.mo,sha256=g4pTk8QLQFCOkU29RZvR1wOd1hkOZe_o5GV9Cg5u8N4,1371 -django/contrib/auth/locale/tt/LC_MESSAGES/django.po,sha256=owkJ7iPT-zJYkuKLykfWsw8j7O8hbgzVTOD0DVv956E,5222 -django/contrib/auth/locale/udm/LC_MESSAGES/django.mo,sha256=zey19UQmS79AJFxHGrOziExPDDpJ1AbUegbCRm0x0hM,462 -django/contrib/auth/locale/udm/LC_MESSAGES/django.po,sha256=gLVgaMGg0GA3Tey1_nWIjV1lnM7czLC0XR9NFBgL2Zk,3690 -django/contrib/auth/locale/ug/LC_MESSAGES/django.mo,sha256=XFiEQj2PPtLCPVa1Ecm-yM-G_vTSe_QIY0zkmxWTY5k,10714 -django/contrib/auth/locale/ug/LC_MESSAGES/django.po,sha256=kLIort7Rfnu4S95YXZ10UKX7G8BB5vI6iF6DQrSSizY,10972 -django/contrib/auth/locale/uk/LC_MESSAGES/django.mo,sha256=nzOprWHhzg9hH8QWSJSU8yTHprK2zEUL3XaNQ3LCYZg,10683 -django/contrib/auth/locale/uk/LC_MESSAGES/django.po,sha256=HrmRn7k7qLFjnMj3J4NUv9LRb9mifa5tg42cQ7_jkFU,11506 -django/contrib/auth/locale/ur/LC_MESSAGES/django.mo,sha256=rippTNHoh49W19c4HDUF8G5Yo3SknL3C87Afu8YXxzA,698 -django/contrib/auth/locale/ur/LC_MESSAGES/django.po,sha256=gwSd8noEwbcvDE1Q4ZsrftvoWMwhw1J15gvdtK6E9ns,4925 -django/contrib/auth/locale/uz/LC_MESSAGES/django.mo,sha256=bDkhpvduocjekq6eZiuEfWJqnIt5hQmxxoIMhLQWzqM,2549 -django/contrib/auth/locale/uz/LC_MESSAGES/django.po,sha256=tPp8tRZwSMQCQ9AyAeUDtnRfmOk54UQMwok3HH8VNSQ,5742 -django/contrib/auth/locale/vi/LC_MESSAGES/django.mo,sha256=eBMTwnpRWRj8SZVZ1tN592Re_8CPyJzuF4Vtg9IMmFw,7892 -django/contrib/auth/locale/vi/LC_MESSAGES/django.po,sha256=mOr5WgFpwztdW-pEZ4O80MGlltYQyL2cAMhz6-Esfo0,8246 -django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=buDfU6thF7o39eMCQadRxNKHprr-41PP-Qjdcp-a2m4,7741 -django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.po,sha256=qNsSA2WWmC9jrg6ABL9jVG3u95qq4ztnML4Nrh3Gugo,8507 -django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=BhEKmDsqd56EX4gUyRE3x5g4KCIUM2oK_iXlMnD2TOw,7642 -django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.po,sha256=R8bmKEhb8BSYcazprOlDcvRuvKOqZgsyos6B7NTwzvM,8075 -django/contrib/auth/management/__init__.py,sha256=eeT2I5fsnE23dtfi7UX2ZhUMJ4EeFaGBpZUYmzmuqEY,5391 -django/contrib/auth/management/__pycache__/__init__.cpython-310.pyc,, -django/contrib/auth/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/auth/management/commands/__pycache__/__init__.cpython-310.pyc,, -django/contrib/auth/management/commands/__pycache__/changepassword.cpython-310.pyc,, -django/contrib/auth/management/commands/__pycache__/createsuperuser.cpython-310.pyc,, -django/contrib/auth/management/commands/changepassword.py,sha256=H9onbQvVwzILiRK6Cg96qGrLi8_kdjoxBVMvupX18eI,2686 -django/contrib/auth/management/commands/createsuperuser.py,sha256=cSl8FeoXYBw5DUjtnHRYmybsYIx6WztUkYjgx4ZO1XI,13576 -django/contrib/auth/middleware.py,sha256=49Fqu4WStf2PaHGKDB6Ze0UMHoAI7yOr3Kg3e01KBIM,11161 -django/contrib/auth/migrations/0001_initial.py,sha256=hFz_MZYGMy9J7yDOFl0aF-UixCbF5W12FhM-nk6rpe8,7281 -django/contrib/auth/migrations/0002_alter_permission_name_max_length.py,sha256=_q-X4Oj30Ui-w9ubqyNJxeFYiBF8H_KCne_2PvnhbP8,346 -django/contrib/auth/migrations/0003_alter_user_email_max_length.py,sha256=nVZXtNuYctwmwtY0wvWRGj1pqx2FUq9MbWM7xAAd-r8,418 -django/contrib/auth/migrations/0004_alter_user_username_opts.py,sha256=lTjbNCyam-xMoSsxN_uAdyxOpK-4YehkeilisepYNEo,880 -django/contrib/auth/migrations/0005_alter_user_last_login_null.py,sha256=efYKNdwAD91Ce8BchSM65bnEraB4_waI_J94YEv36u4,410 -django/contrib/auth/migrations/0006_require_contenttypes_0002.py,sha256=AMsW40BfFLYtvv-hXGjJAwKR5N3VE9czZIukYNbF54E,369 -django/contrib/auth/migrations/0007_alter_validators_add_error_messages.py,sha256=EV24fcMnUw-14ZZLo9A_l0ZJL5BgBAaUe-OfVPbMBC8,802 -django/contrib/auth/migrations/0008_alter_user_username_max_length.py,sha256=AoV_ZffWSBR6XRJZayAKg-KRRTkdP5hs64SzuGWiw1E,814 -django/contrib/auth/migrations/0009_alter_user_last_name_max_length.py,sha256=GaiVAOfxCKc5famxczGB-SEF91hmOzaFtg9cLaOE124,415 -django/contrib/auth/migrations/0010_alter_group_name_max_length.py,sha256=CWPtZJisCzqEMLbKNMG0pLHV9VtD09uQLxWgP_dLFM0,378 -django/contrib/auth/migrations/0011_update_proxy_permissions.py,sha256=haXd5wjcS2ER4bxxznI-z7p7H4rt7P0TCQD_d4J2VDY,2860 -django/contrib/auth/migrations/0012_alter_user_first_name_max_length.py,sha256=bO-8n4CQN2P_hJKlN6IoNu9p8iJ-GdQCUJuAmdK67LA,411 -django/contrib/auth/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/auth/migrations/__pycache__/0001_initial.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0002_alter_permission_name_max_length.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0003_alter_user_email_max_length.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0004_alter_user_username_opts.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0005_alter_user_last_login_null.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0006_require_contenttypes_0002.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0007_alter_validators_add_error_messages.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0008_alter_user_username_max_length.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0009_alter_user_last_name_max_length.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0010_alter_group_name_max_length.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0011_update_proxy_permissions.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/0012_alter_user_first_name_max_length.cpython-310.pyc,, -django/contrib/auth/migrations/__pycache__/__init__.cpython-310.pyc,, -django/contrib/auth/mixins.py,sha256=Kbi6hqNy6G2qO08lvkGnRySpNv7DxbEwRP_NoCpGJQk,4652 -django/contrib/auth/models.py,sha256=gkV5y0LHL4s_5-X2fwsTzCMGayIgY0rz-YipjIo2jnU,21331 -django/contrib/auth/password_validation.py,sha256=Xnac_XOKA2eqznnFVyigGxiaZFjT4T6mgaQLMEPyVgw,9518 -django/contrib/auth/signals.py,sha256=BFks70O0Y8s6p1fr8SCD4-yk2kjucv7HwTcdRUzVDFM,118 -django/contrib/auth/templates/auth/widgets/read_only_password_hash.html,sha256=xBoBu4pWrFdMbEzkx_5hgVqBrqtrY3YwP3ay6AmXXUo,320 -django/contrib/auth/templates/registration/password_reset_subject.txt,sha256=-TZcy_r0vArBgdPK7feeUY6mr9EkYwy7esQ62_onbBk,132 -django/contrib/auth/tokens.py,sha256=ljqQWO0dAkd45-bBJ6W85oZZU9pEjzNh3VbZfeANwxQ,4328 -django/contrib/auth/urls.py,sha256=Uh8DrSqpJXDA5a17Br9fMmIbEcgLkxdN9FvCRg-vxyg,1185 -django/contrib/auth/validators.py,sha256=VO7MyackTaTiK8OjEm7YyLtsjKrteVjdzPbNZki0irU,722 -django/contrib/auth/views.py,sha256=R5tdSTg2qH2qa1R4HC3VQ7K0xbCXW759rRTglcjBe4I,14134 -django/contrib/contenttypes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/contenttypes/__pycache__/__init__.cpython-310.pyc,, -django/contrib/contenttypes/__pycache__/admin.cpython-310.pyc,, -django/contrib/contenttypes/__pycache__/apps.cpython-310.pyc,, -django/contrib/contenttypes/__pycache__/checks.cpython-310.pyc,, -django/contrib/contenttypes/__pycache__/fields.cpython-310.pyc,, -django/contrib/contenttypes/__pycache__/forms.cpython-310.pyc,, -django/contrib/contenttypes/__pycache__/models.cpython-310.pyc,, -django/contrib/contenttypes/__pycache__/prefetch.cpython-310.pyc,, -django/contrib/contenttypes/__pycache__/views.cpython-310.pyc,, -django/contrib/contenttypes/admin.py,sha256=a0KrlT8k2aPIKn54fNwCDTaAVdVr1fLY1BDz_FrE3ts,5200 -django/contrib/contenttypes/apps.py,sha256=1Q1mWjPvfYU7EaO50JvsWuDg_3uK8DoCwpvdIdT7iKY,846 -django/contrib/contenttypes/checks.py,sha256=KKB-4FOfPO60TM-uxqK8m9sIXzB3CRx7Imr-jaauM_U,1268 -django/contrib/contenttypes/fields.py,sha256=BKCM_f6WbMYRNe2E6S7no0mWoeHbKYWvD2WYLtJWJu4,31744 -django/contrib/contenttypes/forms.py,sha256=m65aJ2NHqTqL8TiSGt2EParYp5WQqacLzZXP9GU8E6U,3950 -django/contrib/contenttypes/locale/af/LC_MESSAGES/django.mo,sha256=MLTvTw6mjjOA8oY9_BrkppErc4kIsKsvRqYd6JR72vk,1048 -django/contrib/contenttypes/locale/af/LC_MESSAGES/django.po,sha256=lrAP3UmeeFb8eHbN17oypM4NbftY7B0jOtHwrlS2-oo,1268 -django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.mo,sha256=2t3y_6wxi0khsYi6s9ZyJwjRB8bnRT1PKvazWOKhJcQ,1271 -django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.po,sha256=t6M3XYQLotNMFCjzB8aWFXnlRI8fU744YZvAoFdScQY,1634 -django/contrib/contenttypes/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=upFxoSvOvdmqCvC5irRV_8yYpFidanHfRk6i3tPrFAc,1233 -django/contrib/contenttypes/locale/ar_DZ/LC_MESSAGES/django.po,sha256=jUg-4BVi0arx5v-osaUDAfM6cQgaBh7mE8Mr8aVTp5A,1447 -django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.mo,sha256=y88CPGGbwTVRmZYIipCNIWkn4OuzuxEk2QCYsBhc7RY,643 -django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.po,sha256=H-qMo5ikva84ycnlmBT4XXEWhzMIw-r7J_zuqxo3wu4,1088 -django/contrib/contenttypes/locale/az/LC_MESSAGES/django.mo,sha256=eHIU-L0mRAlCpQaQzrShguFlYg5llOv89KEpj14p6-8,1058 -django/contrib/contenttypes/locale/az/LC_MESSAGES/django.po,sha256=h56r0_NK7YccHKrfBWUirSpkIBf4ckXyq1F8-YP1rvs,1375 -django/contrib/contenttypes/locale/be/LC_MESSAGES/django.mo,sha256=Kp1TpXX1v0IgGp9HZxleXJ6y5ZvMZ6AqJrSIVcDs7xA,1353 -django/contrib/contenttypes/locale/be/LC_MESSAGES/django.po,sha256=Oy5QXZBmBM_OYLT5OeXJQzTBCHXBp8NVMYuKmr_TUm0,1615 -django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.mo,sha256=IFghXuYj0yxP5j-LfRsNJXlyS2b2dUNJXD01uhUqxLg,1225 -django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.po,sha256=y-OpKdDHxHDYATSmi8DAUXuhpIwgujKZUe48G8So8AU,1613 -django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.mo,sha256=2Z1GL6c1ukKQCMcls7R0_n4eNdH3YOXZSR8nCct7SLI,1201 -django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.po,sha256=PLjnppx0FxfGBQMuWVjo0N4sW2QYc2DAEMK6ziGWUc8,1491 -django/contrib/contenttypes/locale/br/LC_MESSAGES/django.mo,sha256=kAlOemlwBvCdktgYoV-4NpC7XFDaIue_XN7GJYzDu88,1419 -django/contrib/contenttypes/locale/br/LC_MESSAGES/django.po,sha256=BQmHVQqOc6xJWJLeAo49rl_Ogfv-lFtx18mj82jT_to,1613 -django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.mo,sha256=klj9n7AKBkTf7pIa9m9b-itsy4UlbYPnHiuvSLcFZXY,700 -django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.po,sha256=pmJaMBLWbYtYFFXYBvPEvwXkTPdjQDv2WkFI5jNGmTI,1151 -django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.mo,sha256=uYq1BXdw1AXjnLusUQfN7ox1ld6siiy41C8yKVTry7Q,1095 -django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.po,sha256=-dsOzvzVzEPVvA9lYsIP-782BbtJxGRo-OHtS3fIjmU,1403 -django/contrib/contenttypes/locale/ckb/LC_MESSAGES/django.mo,sha256=_dJ-2B3tupoUHRS7HjC-EIlghIYLWebwsy4IvEXI13w,1213 -django/contrib/contenttypes/locale/ckb/LC_MESSAGES/django.po,sha256=SrQwgQTltnR7OExi6sP5JsnEOg6qDzd8dSPXjX92B-M,1419 -django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.mo,sha256=QexBQDuGdMFhVBtA9XWUs2geFBROcxyzdU_IBUGQ7x4,1108 -django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.po,sha256=8pdPwZmpGOeSZjILGLZEAzqvmmV69ogpkh0c3tukT2g,1410 -django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.mo,sha256=2QyCWeXFyymoFu0Jz1iVFgOIdLtt4N1rCZATZAwiH-8,1159 -django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.po,sha256=ZWDxQTHJcw1UYav1C3MX08wCFrSeJNNI2mKjzRVd6H0,1385 -django/contrib/contenttypes/locale/da/LC_MESSAGES/django.mo,sha256=EyancRrTWxM6KTpLq65gIQB0sO_PLtVr1ESN2v1pSNU,1038 -django/contrib/contenttypes/locale/da/LC_MESSAGES/django.po,sha256=J09u3IjLgv4g77Kea_WQAhevHb8DskGU-nVxyucYf_0,1349 -django/contrib/contenttypes/locale/de/LC_MESSAGES/django.mo,sha256=MGUZ4Gw8rSFjBO2OfFX9ooGGpJYwAapgNkc-GdBMXa0,1055 -django/contrib/contenttypes/locale/de/LC_MESSAGES/django.po,sha256=T5ucSqa6VyfUcoN6nFWBtjUkrSrz7wxr8t0NGTBrWow,1308 -django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.mo,sha256=QpdSZObmfb-DQZb3Oh6I1bFRnaPorXMznNZMyVIM7Hc,1132 -django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.po,sha256=_tNajamEnnf9FEjI-XBRraKjJVilwvpv2TBf9PAzPxw,1355 -django/contrib/contenttypes/locale/el/LC_MESSAGES/django.mo,sha256=1ySEbSEzhH1lDjHQK9Kv59PMA3ZPdqY8EJe6xEQejIM,1286 -django/contrib/contenttypes/locale/el/LC_MESSAGES/django.po,sha256=8rlMKE5SCLTtm1myjLFBtbEIFyuRmSrL9HS2PA7gneQ,1643 -django/contrib/contenttypes/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/contenttypes/locale/en/LC_MESSAGES/django.po,sha256=BRgOISCCJb4TU0dNxG4eeQJFe-aIe7U3GKLPip03d_Q,1110 -django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.mo,sha256=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 -django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.po,sha256=wmxyIJtz628AbsxgkB-MjdImcIJWhcW7NV3tWbDpedg,1001 -django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.mo,sha256=_uM-jg43W7Pz8RQhMcR_o15wRkDaYD8aRcl2_NFGoNs,1053 -django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.po,sha256=SyzwSvqAgKF8BEhXYh4598GYP583OK2GUXH1lc4iDMk,1298 -django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.mo,sha256=4EgHUHPb4TuK2DKf0dWOf7rNzJNsyT8CG39SQixI0oM,1072 -django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.po,sha256=gbxNuagxW01xLd3DY0Lc5UNNSlw1nEiBExzcElrB61E,1350 -django/contrib/contenttypes/locale/es/LC_MESSAGES/django.mo,sha256=KzgypFDwIlVzr_h9Dq2X8dXu3XnsbdSaHwJKJWZ6qc8,1096 -django/contrib/contenttypes/locale/es/LC_MESSAGES/django.po,sha256=Dpn9dTvdy87bVf3It8pZFOdEEKnO91bDeYyY1YujkIA,1456 -django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.mo,sha256=WkHABVDmtKidPyo6zaYGVGrgXpe6tZ69EkxaIBu6mtg,1084 -django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.po,sha256=yVSu_fJSKwS4zTlRud9iDochIaY0zOPILF59biVfkeY,1337 -django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.mo,sha256=aACo1rOrgs_BYK3AWzXEljCdAc4bC3BXpyXrwE4lzAs,1158 -django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.po,sha256=vemhoL-sESessGmIlHoRvtWICqF2aO05WvcGesUZBRM,1338 -django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.mo,sha256=vD9rSUAZC_rgkwiOOsrrra07Gnx7yEpNHI96tr8xD3U,840 -django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.po,sha256=tLgjAi9Z1kZloJFVQuUdAvyiJy1J-5QHfoWmxbqQZCc,1237 -django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.mo,sha256=TVGDydYVg_jGfnYghk_cUFjCCtpGchuoTB4Vf0XJPYk,1152 -django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.po,sha256=vJW37vuKYb_KpXBPmoNSqtNstFgCDlKmw-8iOoSCenU,1342 -django/contrib/contenttypes/locale/et/LC_MESSAGES/django.mo,sha256=TE84lZl6EP54-pgmv275jiTOW0vIsnsGU97qmtxMEVg,1028 -django/contrib/contenttypes/locale/et/LC_MESSAGES/django.po,sha256=KO9fhmRCx25VeHNDGXVNhoFx3VFH-6PSLVXZJ6ohOSA,1368 -django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.mo,sha256=K0f1cXEhfg_djPzgCL9wC0iHGWF_JGIhWGFL0Y970g0,1077 -django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.po,sha256=sSuVV0o8MeWN6BxlaeKcjKA3h4H29fCo1kKEtkczEp4,1344 -django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.mo,sha256=hW3A3_9b-NlLS4u6qDnPS1dmNdn1UJCt-nihXvnXywI,1130 -django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.po,sha256=TPiYsGGN-j-VD--Rentx1p-IcrNJYoYxrxDO_5xeZHI,1471 -django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.mo,sha256=dWar3g1rJAkUG1xRLlmGkH63Fy_h2YqzhMVv0Z25aWc,1036 -django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.po,sha256=yALWMFU8-gFD2G0NdWqIDIenrAMUY4VCW1oi8TJXFAc,1325 -django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.mo,sha256=CTOu_JOAQeC72VX5z9cg8Bn3HtZsdgbtjA7XKcy681o,1078 -django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.po,sha256=6LArEWoBpdaJa7UPcyv4HJKD3YoKUxrwGQGd16bi9DM,1379 -django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.po,sha256=SB07aEGG7n4oX_5rqHB6OnjpK_K0KwFM7YxaWYNpB_4,991 -django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.mo,sha256=7E4WYsYrAh_NhlJva_R0dYG0uX9pTKkYdKRq5seoWAA,1081 -django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.po,sha256=3GcPCINXueCiHWnWJACHrkhiMB07D-36ZkuAWkEBSlo,1425 -django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.mo,sha256=dQz7j45qlY3M1rL2fCVdPnuHMUdUcJ0K6cKgRD7Js2w,1154 -django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.po,sha256=_hwx9XqeX5QYRFtDpEYkChswn8WMdYTQlbzL1LjREbY,1368 -django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.mo,sha256=OS8R8sck0Q__XBw3M9brT4jOHmXYUHH71zU2a0mY0vQ,1080 -django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.po,sha256=i-kmfgIuDtreavYL3mCc_BSRi-GmTklAsqE4AhP3wgk,1417 -django/contrib/contenttypes/locale/he/LC_MESSAGES/django.mo,sha256=oaxWykyc3N63WpxyHPI5CyhCTBqhM5-2Sasp_DNm1xc,1219 -django/contrib/contenttypes/locale/he/LC_MESSAGES/django.po,sha256=wCm08UMCiCa6y1-5E-7bEz-8Kd0oMRMwgzoEJjMwFyw,1486 -django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.mo,sha256=KAZuQMKOvIPj3a7GrNJE3yhT70O2abCEF2GOsbwTE5A,1321 -django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.po,sha256=PcsNgu2YmT0biklhwOF_nSvoGTvWVKw2IsBxIwSVAtI,1577 -django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.mo,sha256=DbOUA8ks3phsEwQvethkwZ9-ymrd36aQ6mP7OnGdpjU,1167 -django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.po,sha256=722KxvayO6YXByAmO4gfsfzyVbT-HqqrLYQsr02KDc8,1445 -django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.mo,sha256=tPtv_lIzCPIUjGkAYalnNIUxVUQFE3MShhVXTnfVx3Q,1106 -django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.po,sha256=rbI3G8ARG7DF7uEe82SYCfotBnKTRJJ641bGhjdptTQ,1329 -django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.mo,sha256=2nsylOwBIDOnkUjE2GYU-JRvgs_zxent7q3_PuscdXk,1102 -django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.po,sha256=Dzcf94ZSvJtyNW9EUKpmyNJ1uZbXPvc7dIxCccZrDYc,1427 -django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.mo,sha256=hKOErB5dzj44ThQ1_nZHak2-aXZlwMoxYcDWmPb3Xo8,1290 -django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.po,sha256=UeGzaghsEt9Lt5DsEzRb9KCbuphWUQwLayt4AN194ao,1421 -django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.mo,sha256=9B0XhxH0v3FvkEvS5MOHHqVbgV6KQITPrjzx1Sn76GA,1105 -django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.po,sha256=NX8jpTaIhtVbVlwEsOl5aufZ80ljHZZwqtsVVozQb4M,1318 -django/contrib/contenttypes/locale/id/LC_MESSAGES/django.mo,sha256=4-6RBAvrtA1PY3LNxMrgwzBLZE0ZKwWaXa7SmtmAIyk,1031 -django/contrib/contenttypes/locale/id/LC_MESSAGES/django.po,sha256=xdxEOgfta1kaXyQAngmmbL8wDQzJU6boC9HdbmoM1iI,1424 -django/contrib/contenttypes/locale/io/LC_MESSAGES/django.mo,sha256=3SSRXx4tYiMUc00LZ9kGHuvTgaWpsICEf5G208CEqgg,1051 -django/contrib/contenttypes/locale/io/LC_MESSAGES/django.po,sha256=1ku9WPcenn47DOF05HL2eRqghZeRYfklo2huYUrkeJ0,1266 -django/contrib/contenttypes/locale/is/LC_MESSAGES/django.mo,sha256=ZYWbT4qeaco8h_J9SGF2Bs7Rdu3auZ969xZ0RQ_03go,1049 -django/contrib/contenttypes/locale/is/LC_MESSAGES/django.po,sha256=iNdghSbBVPZmfrHu52hRG8vHMgGUfOjLqie09fYcuso,1360 -django/contrib/contenttypes/locale/it/LC_MESSAGES/django.mo,sha256=GSP0BJc3bGLoNS0tnhiz_5dtSh5NXCrBiZbnwEhWbpk,1075 -django/contrib/contenttypes/locale/it/LC_MESSAGES/django.po,sha256=njEgvhDwWOc-CsGBDz1_mtEsXx2aTU6cP3jZzcLkkYk,1457 -django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.mo,sha256=tVH6RvZ5tXz56lEM3aoJtFp5PKsSR-XXpi8ZNCHjiFw,1211 -django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.po,sha256=5_-Uo7Ia3X9gAWm2f72ezQnNr_pQzf6Ax4AUutULuZU,1534 -django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.mo,sha256=1_yGL68sK0QG_mhwFAVdksiDlB57_1W5QkL7NGGE5L0,1429 -django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.po,sha256=6iUBbKjXsIgrq7Dj_xhxzoxItSSSKwQjIZsDayefGr8,1654 -django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.mo,sha256=SNY0vydwLyR2ExofAHjmg1A2ykoLI7vU5Ryq-QFu5Gs,627 -django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.po,sha256=PU-NAl6xUEeGV0jvJx9siVBTZIzHywL7oKc4DgUjNkc,1130 -django/contrib/contenttypes/locale/km/LC_MESSAGES/django.mo,sha256=BXifukxf48Lr0t0V3Y0GJUMhD1KiHN1wwbueoK0MW1A,678 -django/contrib/contenttypes/locale/km/LC_MESSAGES/django.po,sha256=fTPlBbnaNbLZxjzJutGvqe33t6dWsEKiHQYaw27m7KQ,1123 -django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.mo,sha256=a4sDGaiyiWn-1jFozYI4vdAvuHXrs8gbZErP_SAUk9Y,714 -django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.po,sha256=A6Vss8JruQcPUKQvY-zaubVZDTLEPwHsnd_rXcyzQUs,1168 -django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.mo,sha256=myRfFxf2oKcbpmCboongTsL72RTM95nEmAC938M-ckE,1089 -django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.po,sha256=uui_LhgGTrW0uo4p-oKr4JUzhjvkLbFCqRVLNMrptzY,1383 -django/contrib/contenttypes/locale/ky/LC_MESSAGES/django.mo,sha256=ULoIe36zGKPZZs113CenA6J9HviYcBOKagXrPGxyBUI,1182 -django/contrib/contenttypes/locale/ky/LC_MESSAGES/django.po,sha256=FnW5uO8OrTYqbvoRuZ6gnCD6CHnuLjN00s2Jo1HX1NE,1465 -django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.po,sha256=dwVKpCRYmXTD9h69v5ivkZe-yFtvdZNZ3VfuyIl4olY,989 -django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.mo,sha256=HucsRl-eqfxw6ESTuXvl7IGjPGYSI9dxM5lMly_P1sc,1215 -django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.po,sha256=odzYqHprxKFIrR8TzdxA4WeeMK0W0Nvn2gAVuzAsEqI,1488 -django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.mo,sha256=nWfy7jv2VSsKYT6yhk_xqxjk1TlppJfsQcurC40CeTs,1065 -django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.po,sha256=pHlbzgRpIJumDMp2rh1EKrxFBg_DRcvLLgkQ3mi_L0s,1356 -django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.mo,sha256=KTFZWm0F4S6lmi1FX76YKOyJqIZN5cTsiTBI_D4ADHs,1258 -django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.po,sha256=mQZosS90S-Bil6-EoGjs9BDWYlvOF6mtUDZ8h9NxEdE,1534 -django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.mo,sha256=rtmLWfuxJED-1KuqkUT8F5CU1KGJP0Of718n2Gl_gI0,1378 -django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.po,sha256=Z-kL9X9CD7rYfa4Uoykye2UgCNQlgyql0HTv1eUXAf4,1634 -django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.mo,sha256=J6kKYjUOsQxptNXDcCaY4d3dHJio4HRibRk3qfwO6Xc,1225 -django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.po,sha256=x8aRJH2WQvMBBWlQt3T3vpV4yHeZXLmRTT1U0at4ZIk,1525 -django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.mo,sha256=G7yoBvkVNtyQxT2RCCPjBeI8C3lAzVcPxW0OkDeVyz0,1004 -django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po,sha256=BKgamLogZ-F3gBYeTZy1rGCkNe5AjOew8Nm1LTVkhEs,1348 -django/contrib/contenttypes/locale/ms/LC_MESSAGES/django.mo,sha256=EIwbOZ0QahW9AFFWRmRdKGKBtYYY_eTcfU4eqDVSVxw,1035 -django/contrib/contenttypes/locale/ms/LC_MESSAGES/django.po,sha256=t7nKsOMxycn_CsXw2nIfU-owJRge3FAixgbTsDhffvo,1225 -django/contrib/contenttypes/locale/my/LC_MESSAGES/django.mo,sha256=YYa2PFe9iJygqL-LZclfpgR6rBmIvx61JRpBkKS6Hrs,1554 -django/contrib/contenttypes/locale/my/LC_MESSAGES/django.po,sha256=6F3nXd9mBc-msMchkC8OwAHME1x1O90xrsZp7xmynpU,1732 -django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.mo,sha256=EHU9Lm49U7WilR5u-Lq0Fg8ChR_OzOce4UyPlkZ6Zs4,1031 -django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.po,sha256=lbktPYsJudrhe4vxnauzpzN9eNwyoVs0ZmZSdkwjkOk,1403 -django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.mo,sha256=-zZAn5cex4PkScoZVqS74PUMThJJuovZSk3WUKZ8hnw,1344 -django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.po,sha256=1ZCUkulQ9Gxb50yMKFKWaTJli2SinBeNj0KpXkKpsNE,1519 -django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.mo,sha256=aXDHgg891TyTiMWNcbNaahfZQ2hqtl5yTkx5gNRocMU,1040 -django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.po,sha256=zDJ_vyQxhP0mP06U-e4p6Uj6v1g863s8oaxc0JIAMjg,1396 -django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.mo,sha256=a_X8e2lMieWwUtENJueBr8wMvkw6at0QSaWXd5AM6yQ,1040 -django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.po,sha256=xFSirHUAKv78fWUpik6xv-6WQSEoUgN5jjPbTOy58C4,1317 -django/contrib/contenttypes/locale/os/LC_MESSAGES/django.mo,sha256=QV533Wu-UpjV3XiCe83jlz7XGuwgRviV0ggoeMaIOIY,1116 -django/contrib/contenttypes/locale/os/LC_MESSAGES/django.po,sha256=UZahnxo8z6oWJfEz4JNHGng0EAifXYtJupB6lx0JB60,1334 -django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.mo,sha256=qacd7eywof8rvJpstNfEmbHgvDiQ9gmkcyG7gfato8s,697 -django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.po,sha256=Kq2NTzdbgq8Q9jLLgV-ZJaSRj43D1dDHcRIgNnJXu-s,1145 -django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.mo,sha256=J5sC36QwKLvrMB4adsojhuw2kYuEckHz6eoTrZwYcnI,1208 -django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.po,sha256=gxP59PjlIHKSiYZcbgIY4PUZSoKYx4YKCpm4W4Gj22g,1577 -django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.mo,sha256=k7cJHLP3avrBD50o5oxaZmLlT9Uv_XgxzDn4YhvNeDM,1154 -django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po,sha256=O087gXKjUtRwCrYHERr-m8smmuJg-eo4OAOL2vRDBj4,1446 -django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.mo,sha256=qjl-3fBqNcAuoviGejjILC7Z8XmrRd7gHwOgwu1x1zw,1117 -django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.po,sha256=Xp0iBhseS8v13zjDcNQv4BDaroMtDJVs4-BzNc0UOpU,1494 -django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.mo,sha256=sCthDD10v7GY2cui9Jj9HK8cofVEg2WERCm6aktOM-4,1142 -django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po,sha256=n-BPEfua0Gd6FN0rsP7qAlTGbQEZ14NnDMA8jI2844Y,1407 -django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo,sha256=OSf206SFmVLULHmwVhTaRhWTQtyDKsxe03gIzuvAUnY,1345 -django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po,sha256=xHyJYD66r8We3iN5Hqo69syWkjhz4zM7X9BWPIiI6mU,1718 -django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo,sha256=osKXPEE0x-oahNDjgr4aea3dzmLddTT_RLQ8TnbsIOg,1115 -django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po,sha256=nZBxZH3r93fbtth15iP-Q2tNLrZrYqc8V0B9c4XMRNI,1433 -django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.mo,sha256=sMML-ubI_9YdKptzeri1du8FOdKcEzJbe4Tt0J4ePFI,1147 -django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.po,sha256=0zxiyzRWWDNVpNNLlcwl-OLh5sLukma1vm-kYrGHYrE,1392 -django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.mo,sha256=jYDQH3OpY4Vx9hp6ISFMI88uxBa2GDQK0BkLGm8Qulk,1066 -django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.po,sha256=JIvguXVOFpQ3MRqRXHpxlg8_YhEzCsZBBMdpekYTxlk,1322 -django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.mo,sha256=GUXj97VN15HdY7XMy5jmMLEu13juD3To5NsztcoyPGs,1204 -django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.po,sha256=T1w_EeB6yT-PXr7mrwzqu270linf_KY3_ZCgl4wfLAQ,1535 -django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=m2plistrI8O-ztAs5HmDYXG8N_wChaDfXFev0GYWVys,1102 -django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.po,sha256=lJrhLPDbJAcXgBPco-_lfUXqs31imj_vGwE5p1EXZjk,1390 -django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.mo,sha256=J5ha8X6jnQ4yuafk-JCqPM5eIGNwKpDOpTwIVCrnGNE,1055 -django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.po,sha256=HeKnQJaRNflAbKxTiC_2EFAg2Sx-e3nDXrReJyVoNTQ,1400 -django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.mo,sha256=XLPle0JYPPkmm5xpJRmWztMTF1_3a2ZubWE4ur2sav8,563 -django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.po,sha256=jRc8Eh6VuWgqc4kM-rxjbVE3yV9uip6mOJLdD6yxGLM,1009 -django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.mo,sha256=L3eF4z9QSmIPqzEWrNk8-2uLteQUMsuxiD9VZyRuSfo,678 -django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.po,sha256=iDb9lRU_-YPmO5tEQeXEZeGeFe-wVZy4k444sp_vTgw,1123 -django/contrib/contenttypes/locale/te/LC_MESSAGES/django.mo,sha256=S_UF_mZbYfScD6Z36aB-kwtTflTeX3Wt4k7z_pEcOV8,690 -django/contrib/contenttypes/locale/te/LC_MESSAGES/django.po,sha256=aAGMMoJPg_pF9_rCNZmda5A_TvDCvQfYEL64Xdoa4jo,1135 -django/contrib/contenttypes/locale/tg/LC_MESSAGES/django.mo,sha256=dkLic6fD2EMzrB7m7MQazaGLoJ_pBw55O4nYZc5UYEs,864 -django/contrib/contenttypes/locale/tg/LC_MESSAGES/django.po,sha256=1nv1cVJewfr44gbQh1Szzy3DT4Y9Dy7rUgAZ81otJQs,1232 -django/contrib/contenttypes/locale/th/LC_MESSAGES/django.mo,sha256=qilt-uZMvt0uw-zFz7-eCmkGEx3XYz7NNo9Xbq3s7uI,1186 -django/contrib/contenttypes/locale/th/LC_MESSAGES/django.po,sha256=42F34fNEn_3yQKBBJnCLttNeyktuLVpilhMyepOd6dg,1444 -django/contrib/contenttypes/locale/tk/LC_MESSAGES/django.mo,sha256=0fuA3E487-pceoGpX9vMCwSnCItN_pbLUIUzzcrAGOE,1068 -django/contrib/contenttypes/locale/tk/LC_MESSAGES/django.po,sha256=pS8wX9dzxys3q8Vvz3PyoVJYqplXhNuAqfq7Dsb07fw,1283 -django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.mo,sha256=gKg2FCxs2fHpDB1U6gh9xrP7mOpYG65pB4CNmdPYiDg,1057 -django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.po,sha256=gmI3RDhq39IlDuvNohT_FTPY5QG8JD0gFxG5CTsvVZs,1345 -django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.mo,sha256=_LQ1N04FgosdDLUYXJOEqpCB2Mg92q95cBRgYPi1MyY,659 -django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.po,sha256=L7wMMpxGnpQiKd_mjv2bJpE2iqCJ8XwiXK0IN4EHSbM,1110 -django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.po,sha256=YVyej0nAhhEf7knk4vCeRQhmSQeGZLhMPPXyIyWObnM,977 -django/contrib/contenttypes/locale/ug/LC_MESSAGES/django.mo,sha256=hddqwGR9yrDZye5FZSatvlBBGerLsxS0x1HRodFmwkk,1182 -django/contrib/contenttypes/locale/ug/LC_MESSAGES/django.po,sha256=DoAswgu8-Ukl5e5TLhMcMQRuWEalnmokpKZsKSN9RYk,1397 -django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.mo,sha256=GgAuuLexfhYl1fRKPfZI5uMTkt2H42Ogil6MQHcejkU,1404 -django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.po,sha256=1HzO_Wmxqk0Kd5gtACKZODiH8ZEpOf5Eh8Mkrg3IMf8,1779 -django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.mo,sha256=OJs_EmDBps-9a_KjFJnrS8IqtJfd25LaSWeyG8u8UfI,671 -django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.po,sha256=f0FnsaAM_qrBuCXzLnkBrW5uFfVc6pUh7S-qp4918Ng,1122 -django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.mo,sha256=kGYgEI1gHkyU4y_73mBJN1hlKC2JujVXMg6iCdWncDg,1155 -django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.po,sha256=RIDUgsElfRF8bvBdUKtshizuMnupdMGAM896s7qZKD4,1439 -django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=RviK0bqLZzPrZ46xUpc0f8IKkw3JLtsrt0gNA74Ypj0,1015 -django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.po,sha256=vSKJDEQ_ANTj3-W8BFJd9u_QGdTMF12iS15rVgeujOs,1380 -django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=NMumOJ9dPX-7YjQH5Obm4Yj0-lnGXJmCMN5DGbsLQG4,1046 -django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.po,sha256=7WIqYRpcs986MjUsegqIido5k6HG8d3FVvkrOQCRVCI,1338 -django/contrib/contenttypes/management/__init__.py,sha256=ZVHVJAYi_jCIXxWUZSkxq0IDECe6bvbFsWayrqbutfc,4937 -django/contrib/contenttypes/management/__pycache__/__init__.cpython-310.pyc,, -django/contrib/contenttypes/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/contenttypes/management/commands/__pycache__/__init__.cpython-310.pyc,, -django/contrib/contenttypes/management/commands/__pycache__/remove_stale_contenttypes.cpython-310.pyc,, -django/contrib/contenttypes/management/commands/remove_stale_contenttypes.py,sha256=F6rm6MTMLuZVXCsn6L3ln3ouehsUTaVGaNeaZ4cRW7I,4643 -django/contrib/contenttypes/migrations/0001_initial.py,sha256=Ne2EiaFH4LQqFcIbXU8OiUDeb3P7Mm6dbeqRtNC5U8w,1434 -django/contrib/contenttypes/migrations/0002_remove_content_type_name.py,sha256=fTZJQHV1Dw7TwPaNDLFUjrpZzFk_UvaR9sw3oEMIN2Y,1199 -django/contrib/contenttypes/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/contenttypes/migrations/__pycache__/0001_initial.cpython-310.pyc,, -django/contrib/contenttypes/migrations/__pycache__/0002_remove_content_type_name.cpython-310.pyc,, -django/contrib/contenttypes/migrations/__pycache__/__init__.cpython-310.pyc,, -django/contrib/contenttypes/models.py,sha256=VKXWweIQQ6eX88YX96nlcMo9ESaW7p_wUPJSalGInsc,6844 -django/contrib/contenttypes/prefetch.py,sha256=cORwKClKS-wzGrmRj2BlSBuuJz6iRBWOVl4tBYHRrtA,1358 -django/contrib/contenttypes/views.py,sha256=HBoIbNpgHTQN5pH8mul77UMEMZHbbkEH_Qdln-XFgd0,3549 -django/contrib/flatpages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/flatpages/__pycache__/__init__.cpython-310.pyc,, -django/contrib/flatpages/__pycache__/admin.cpython-310.pyc,, -django/contrib/flatpages/__pycache__/apps.cpython-310.pyc,, -django/contrib/flatpages/__pycache__/forms.cpython-310.pyc,, -django/contrib/flatpages/__pycache__/middleware.cpython-310.pyc,, -django/contrib/flatpages/__pycache__/models.cpython-310.pyc,, -django/contrib/flatpages/__pycache__/sitemaps.cpython-310.pyc,, -django/contrib/flatpages/__pycache__/urls.cpython-310.pyc,, -django/contrib/flatpages/__pycache__/views.cpython-310.pyc,, -django/contrib/flatpages/admin.py,sha256=ynemOSDgvKoCfRFLXZrPwj27U0mPUXmxdrue7SOZeqQ,701 -django/contrib/flatpages/apps.py,sha256=_OlaDxWbMrUmFNCS4u-RnBsg67rCWs8Qzh_c58wvtXA,252 -django/contrib/flatpages/forms.py,sha256=r9yUG_-zAnI7Ubr836aiWgScYpKxHhJbNLhHRkZQOzY,2492 -django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo,sha256=AG2eKl6o50fG3wWYS7D4-m3gWi9_yfPwEHp-HjB4Sr8,2282 -django/contrib/flatpages/locale/af/LC_MESSAGES/django.po,sha256=EVgUOspHqS4FuFggANzWpyQEutGV4kSx2zUWoOjBF9w,2459 -django/contrib/flatpages/locale/ar/LC_MESSAGES/django.mo,sha256=dBHaqsaKH9QOIZ0h2lIDph8l9Bv2UAcD-Hr9TAxj8Ac,2636 -django/contrib/flatpages/locale/ar/LC_MESSAGES/django.po,sha256=-0ZdfA-sDU8fOucgT2Ow1iM3QnRMuQeslMOSwYhAH9M,2958 -django/contrib/flatpages/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=jp6sS05alESJ4-SbEIf574UPVcbllAd_J-FW802lGyk,2637 -django/contrib/flatpages/locale/ar_DZ/LC_MESSAGES/django.po,sha256=yezpjWcROwloS08TEMo9oPXDKS1mfFE9NYI66FUuLaA,2799 -django/contrib/flatpages/locale/ast/LC_MESSAGES/django.mo,sha256=4SEsEE2hIZJwQUNs8jDgN6qVynnUYJUIE4w-usHKA6M,924 -django/contrib/flatpages/locale/ast/LC_MESSAGES/django.po,sha256=5UlyS59bVo1lccM6ZgdYSgHe9NLt_WeOdXX-swLKubU,1746 -django/contrib/flatpages/locale/az/LC_MESSAGES/django.mo,sha256=s3YhszIU5rdigUVVPB3Jpfn3jbH5L1NXWXky_Q3slvY,2378 -django/contrib/flatpages/locale/az/LC_MESSAGES/django.po,sha256=tDALtASG8n7uaJT7yFsM-rz7FN5rONXlCKqCQIrIcPY,2707 -django/contrib/flatpages/locale/be/LC_MESSAGES/django.mo,sha256=mOQlbfwwIZiwWCrFStwag2irCwsGYsXIn6wZDsPRvyA,2978 -django/contrib/flatpages/locale/be/LC_MESSAGES/django.po,sha256=wlIfhun5Jd6gxbkmmYPSIy_tzPVmSu4CjMwPzBNnvpo,3161 -django/contrib/flatpages/locale/bg/LC_MESSAGES/django.mo,sha256=9Un5mKtsAuNeYWFQKFkIyCpQquE6qVD3zIrFoq8sCDI,2802 -django/contrib/flatpages/locale/bg/LC_MESSAGES/django.po,sha256=Vr6d-9XjgK4_eXdWY3FEpdTlCEGgbCv93bLGyMTE9hs,3104 -django/contrib/flatpages/locale/bn/LC_MESSAGES/django.mo,sha256=2oK2Rm0UtAI7QFRwpUR5aE3-fOltE6kTilsTbah737Y,2988 -django/contrib/flatpages/locale/bn/LC_MESSAGES/django.po,sha256=QrbX69iqXOD6oByLcgPkD1QzAkfthpfTjezIFQ-6kVg,3172 -django/contrib/flatpages/locale/br/LC_MESSAGES/django.mo,sha256=SKbykdilX_NcpkVi_lHF8LouB2G49ZAzdF09xw49ERc,2433 -django/contrib/flatpages/locale/br/LC_MESSAGES/django.po,sha256=O_mwrHIiEwV4oB1gZ7Yua4nVKRgyIf3j5UtedZWAtwk,2783 -django/contrib/flatpages/locale/bs/LC_MESSAGES/django.mo,sha256=bd7ID7OsEhp57JRw_TXoTwsVQNkFYiR_sxSkgi4WvZU,1782 -django/contrib/flatpages/locale/bs/LC_MESSAGES/django.po,sha256=IyFvI5mL_qesEjf6NO1nNQbRHhCAZQm0UhIpmGjrSwQ,2233 -django/contrib/flatpages/locale/ca/LC_MESSAGES/django.mo,sha256=GcMVbg4i5zKCd2Su7oN30WVJN7Q9K7FsFifgTB8jDPI,2237 -django/contrib/flatpages/locale/ca/LC_MESSAGES/django.po,sha256=-aJHSbWPVyNha_uF6R35Q6yn4-Hse3jTInr9jtaxKOI,2631 -django/contrib/flatpages/locale/ckb/LC_MESSAGES/django.mo,sha256=ds26zJRsUHDNdhoUJ8nsLtBdKDhN29Kb51wNiB8Llgo,2716 -django/contrib/flatpages/locale/ckb/LC_MESSAGES/django.po,sha256=jqqMYjrplyX8jtyBLd1ObMEwoFmaETmNXrO3tg2S0BY,2918 -django/contrib/flatpages/locale/cs/LC_MESSAGES/django.mo,sha256=8nwep22P86bMCbW7sj4n0BMGl_XaJIJV0fjnVp-_dqY,2340 -django/contrib/flatpages/locale/cs/LC_MESSAGES/django.po,sha256=1agUeRthwpam1UvZY4vRnZtLLbiop75IEXb6ul_e3mg,2611 -django/contrib/flatpages/locale/cy/LC_MESSAGES/django.mo,sha256=zr_2vsDZsrby3U8AmvlJMU3q1U_4IrrTmz6oS29OWtQ,2163 -django/contrib/flatpages/locale/cy/LC_MESSAGES/django.po,sha256=E_NC_wtuhWKYKB3YvYGB9ccJgKI3AfIZlB2HpXSyOsk,2370 -django/contrib/flatpages/locale/da/LC_MESSAGES/django.mo,sha256=nALoI50EvFPa4f3HTuaHUHATF1zHMjo4v5zcHj4n6sA,2277 -django/contrib/flatpages/locale/da/LC_MESSAGES/django.po,sha256=j4dpnreB7LWdZO7Drj7E9zBwFx_Leuj7ZLyEPi-ccAQ,2583 -django/contrib/flatpages/locale/de/LC_MESSAGES/django.mo,sha256=I4CHFzjYM_Wd-vuIYOMf8E58ntOgkLmgOAg35Chdz3s,2373 -django/contrib/flatpages/locale/de/LC_MESSAGES/django.po,sha256=P6tPVPumP9JwBIv-XXi1QQYJyj1PY3OWoM4yOAmgTRE,2592 -django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.mo,sha256=oTILSe5teHa9XTYWoamstpyPu02yb_xo8S0AtkP7WP8,2391 -django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.po,sha256=1xD2aH5alerranvee6QLZqgxDVXxHThXCHR4kOJAV48,2576 -django/contrib/flatpages/locale/el/LC_MESSAGES/django.mo,sha256=LQ8qIGwzoKwewtLz_1NhnhEeR4dPx2rrQ_hAN4BF6Og,2864 -django/contrib/flatpages/locale/el/LC_MESSAGES/django.po,sha256=gbLO52fcZK7LoG5Rget2Aq5PTFoz467ackXpSsR81kY,3221 -django/contrib/flatpages/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/flatpages/locale/en/LC_MESSAGES/django.po,sha256=0bNWKiu-1MkHFJ_UWrCLhp9ENr-pHzBz1lkhBkkrhJM,2169 -django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.mo,sha256=dTt7KtwiEyMEKYVzkPSqs6VS0CiUfK7ISz2c6rV2erA,2210 -django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.po,sha256=_V4RTf0JtmyU7DRQv7jIwtPJs05KA2THPid5nKQ0ego,2418 -django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.mo,sha256=7zyXYOsqFkUGxclW-VPPxrQTZKDuiYQ7MQJy4m8FClo,1989 -django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.po,sha256=oHrBd6lVnO7-SdnO-Taa7iIyiqp_q2mQZjkuuU3Qa_s,2232 -django/contrib/flatpages/locale/eo/LC_MESSAGES/django.mo,sha256=W8TkkQkV58oOvFdKCPAyoQNyCxSmfErwik1U8a_W5nE,2333 -django/contrib/flatpages/locale/eo/LC_MESSAGES/django.po,sha256=e54WOtIcIQLjB4bJGol51z6d6dwLBiiJN2k-nrTQlaI,2750 -django/contrib/flatpages/locale/es/LC_MESSAGES/django.mo,sha256=9Q7Qf1eSPvAfPTZSGWq7QMWrROY-CnpUkeRpiH8rpJw,2258 -django/contrib/flatpages/locale/es/LC_MESSAGES/django.po,sha256=3vGZ3uVCyWnIkDSUt6DMMOqyphv3EQteTPLx7e9J_sU,2663 -django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.mo,sha256=bUnFDa5vpxl27kn2ojTbNaCmwRkBCH-z9zKXAvXe3Z0,2275 -django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.po,sha256=vEg3wjL_7Ee-PK4FZTaGRCXFscthkoH9szJ7H01K8w8,2487 -django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.mo,sha256=jt8wzeYky5AEnoNuAv8W4nGgd45XsMbpEdRuLnptr3U,2140 -django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.po,sha256=xrbAayPoxT7yksXOGPb-0Nc-4g14UmWANaKTD4ItAFA,2366 -django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.mo,sha256=Y5IOKRzooJHIhJzD9q4PKOe39Z4Rrdz8dBKuvmGkqWU,2062 -django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.po,sha256=Y-EXhw-jISttA9FGMz7gY_kB-hQ3wEyKEaOc2gu2hKQ,2246 -django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.mo,sha256=EI6WskepXUmbwCPBNFKqLGNcWFVZIbvXayOHxOCLZKo,2187 -django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.po,sha256=ipG6a0A2d0Pyum8GcknA-aNExVLjSyuUqbgHM9VdRQo,2393 -django/contrib/flatpages/locale/et/LC_MESSAGES/django.mo,sha256=zriqETEWD-DDPiNzXgAzgEhjvPAaTo7KBosyvBebyc0,2233 -django/contrib/flatpages/locale/et/LC_MESSAGES/django.po,sha256=tMuITUlzy6LKJh3X3CxssFpTQogg8OaGHlKExzjwyOI,2525 -django/contrib/flatpages/locale/eu/LC_MESSAGES/django.mo,sha256=FoKazUkuPpDgsEEI6Gm-xnZYVHtxILiy6Yzvnu8y-L0,2244 -django/contrib/flatpages/locale/eu/LC_MESSAGES/django.po,sha256=POPFB5Jd8sE9Z_ivYSdnet14u-aaXneTUNDMuOrJy00,2478 -django/contrib/flatpages/locale/fa/LC_MESSAGES/django.mo,sha256=2rA7-OR8lQbl_ZhlAC4cmHEmQ9mwxnA8q5M-gx3NmVQ,2612 -django/contrib/flatpages/locale/fa/LC_MESSAGES/django.po,sha256=_-yKW2xIN9XSXEwZTdkhEpRHJoacN8f56D3AkCvlFs0,3006 -django/contrib/flatpages/locale/fi/LC_MESSAGES/django.mo,sha256=VsQdof8hE_AKQGS-Qp82o8PTN_7NxxEdxelGenIAE-8,2256 -django/contrib/flatpages/locale/fi/LC_MESSAGES/django.po,sha256=RL7eruNkgDjr1b3cF2yCqeM8eDKHwAqF6h8hYuxl6R4,2552 -django/contrib/flatpages/locale/fr/LC_MESSAGES/django.mo,sha256=ZqD4O3_Ny8p5i6_RVHlANCnPiowMd19Qi_LOPfTHav4,2430 -django/contrib/flatpages/locale/fr/LC_MESSAGES/django.po,sha256=liAoOgT2CfpANL_rYzyzsET1MhsM19o7wA2GBnoDvMA,2745 -django/contrib/flatpages/locale/fy/LC_MESSAGES/django.mo,sha256=DRsFoZKo36F34XaiQg_0KUOr3NS_MG3UHptzOI4uEAU,476 -django/contrib/flatpages/locale/fy/LC_MESSAGES/django.po,sha256=9JIrRVsPL1m0NPN6uHiaAYxJXHp5IghZmQhVSkGo5g8,1523 -django/contrib/flatpages/locale/ga/LC_MESSAGES/django.mo,sha256=f4552jyACX8w17CU4QAwoPmj05A8nNaTiy-2cbmegSk,2351 -django/contrib/flatpages/locale/ga/LC_MESSAGES/django.po,sha256=oPLJhdAZd2zwKo4o12vDJU-7MQ_CiC9wqszFHmV7LXo,2613 -django/contrib/flatpages/locale/gd/LC_MESSAGES/django.mo,sha256=KbaTL8kF9AxDBLDQWlxcP5hZ4zWnbkvY0l2xRKZ9Dg0,2469 -django/contrib/flatpages/locale/gd/LC_MESSAGES/django.po,sha256=DVY_1R0AhIaI1qXIeRej3XSHMtlimeKNUwzFjc4OmwA,2664 -django/contrib/flatpages/locale/gl/LC_MESSAGES/django.mo,sha256=e8hfOxRyLtCsvdd1FVGuI_dnsptVhfW_O9KyuPT0ENk,2256 -django/contrib/flatpages/locale/gl/LC_MESSAGES/django.po,sha256=YqyR8qnKho8jK03igqPv9KlJw5yVIIDCAGc5z2QxckE,2583 -django/contrib/flatpages/locale/he/LC_MESSAGES/django.mo,sha256=PbypHBhT3W_rp37u8wvaCJdtYB4IP-UeE02VUvSHPf0,2517 -django/contrib/flatpages/locale/he/LC_MESSAGES/django.po,sha256=f7phCRqJPFL7CsuSE1xg9xlaBoOpdd-0zoTYotff29M,2827 -django/contrib/flatpages/locale/hi/LC_MESSAGES/django.mo,sha256=w29ukoF48C7iJ6nE045YoWi7Zcrgu_oXoxT-r6gcQy8,2770 -django/contrib/flatpages/locale/hi/LC_MESSAGES/django.po,sha256=nXq5y1FqMGVhpXpQVdV3uU5JcUtBc2BIrf-n__C2q30,3055 -django/contrib/flatpages/locale/hr/LC_MESSAGES/django.mo,sha256=Mt4gpBuUXvcBl8K714ls4PimHQqee82jFxY1BEAYQOE,2188 -django/contrib/flatpages/locale/hr/LC_MESSAGES/django.po,sha256=ZbUMJY6a-os-xDmcDCJNrN4-YqRe9b_zJ4V5gt2wlGI,2421 -django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.mo,sha256=Pk44puT-3LxzNdGYxMALWpFdw6j6W0G-dWwAfv8sopI,2361 -django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.po,sha256=mhnBXgZSK19E4JU8p2qzqyZqozSzltK-3iY5glr9WG8,2538 -django/contrib/flatpages/locale/hu/LC_MESSAGES/django.mo,sha256=rZxICk460iWBubNq53g9j2JfKIw2W7OqyPG5ylGE92s,2363 -django/contrib/flatpages/locale/hu/LC_MESSAGES/django.po,sha256=DDP7OLBkNbWXr-wiulmQgG461qAubJ8VrfCCXbyPk2g,2700 -django/contrib/flatpages/locale/hy/LC_MESSAGES/django.mo,sha256=qocNtyLcQpjmGqQ130VGjJo-ruaOCtfmZehS9If_hWk,2536 -django/contrib/flatpages/locale/hy/LC_MESSAGES/django.po,sha256=WD8ohMnsaUGQItyqQmS46d76tKgzhQ17X_tGevqULO0,2619 -django/contrib/flatpages/locale/ia/LC_MESSAGES/django.mo,sha256=bochtCPlc268n0WLF0bJtUUT-XveZLPOZPQUetnOWfU,500 -django/contrib/flatpages/locale/ia/LC_MESSAGES/django.po,sha256=gOJ850e8sFcjR2G79zGn3_0-9-KSy591i7ketBRFjyw,1543 -django/contrib/flatpages/locale/id/LC_MESSAGES/django.mo,sha256=2kRHbcmfo09pIEuBb8q5AOkgC0sISJrAG37Rb5F0vts,2222 -django/contrib/flatpages/locale/id/LC_MESSAGES/django.po,sha256=1avfX88CkKMh2AjzN7dxRwj9pgohIBgKE0aXB_shZfc,2496 -django/contrib/flatpages/locale/io/LC_MESSAGES/django.mo,sha256=N8R9dXw_cnBSbZtwRbX6Tzw5XMr_ZdRkn0UmsQFDTi4,464 -django/contrib/flatpages/locale/io/LC_MESSAGES/django.po,sha256=_pJveonUOmMu3T6WS-tV1OFh-8egW0o7vU3i5YqgChA,1511 -django/contrib/flatpages/locale/is/LC_MESSAGES/django.mo,sha256=lFtP1N5CN-x2aMtBNpB6j5HsZYZIZYRm6Y-22gNe1Ek,2229 -django/contrib/flatpages/locale/is/LC_MESSAGES/django.po,sha256=9e132zDa-n6IZxB8jO5H8I0Wr7ubYxrFEMBYj2W49vI,2490 -django/contrib/flatpages/locale/it/LC_MESSAGES/django.mo,sha256=oOEG327VGpi0K5P2UOQgQa39ln15t0lAz2Z36MIQQAc,2209 -django/contrib/flatpages/locale/it/LC_MESSAGES/django.po,sha256=ar8i-bTtAKhiXLULCsKMddpmYBjKyg2paYxBI6ImY1s,2526 -django/contrib/flatpages/locale/ja/LC_MESSAGES/django.mo,sha256=Qax3t7FFRonMrszVEeiyQNMtYyWQB3dmOeeIklEmhAg,2469 -django/contrib/flatpages/locale/ja/LC_MESSAGES/django.po,sha256=N6PBvnXLEWELKTx8nHm5KwydDuFFKq5pn6AIHsBSM5M,2848 -django/contrib/flatpages/locale/ka/LC_MESSAGES/django.mo,sha256=R4OSbZ-lGxMdeJYsaXVXpo6-KSZWeKPuErKmEsUvEQE,3022 -django/contrib/flatpages/locale/ka/LC_MESSAGES/django.po,sha256=TWKtkRamM6YD-4WMoqfZ7KY-ZPs5ny7G82Wst6vQRko,3306 -django/contrib/flatpages/locale/kk/LC_MESSAGES/django.mo,sha256=lMPryzUQr21Uy-NAGQhuIZjHz-4LfBHE_zxEc2_UPaw,2438 -django/contrib/flatpages/locale/kk/LC_MESSAGES/django.po,sha256=3y9PbPw-Q8wM7tCq6u3KeYUT6pfTqcQwlNlSxpAXMxQ,2763 -django/contrib/flatpages/locale/km/LC_MESSAGES/django.mo,sha256=FYRfhNSqBtavYb10sHZNfB-xwLwdZEfVEzX116nBs-k,1942 -django/contrib/flatpages/locale/km/LC_MESSAGES/django.po,sha256=d2AfbR78U0rJqbFmJQvwiBl_QvYIeSwsPKEnfYM4JZA,2471 -django/contrib/flatpages/locale/kn/LC_MESSAGES/django.mo,sha256=n5HCZEPYN_YIVCXrgA1qhxvfhZtDbhfiannJy5EkHkI,1902 -django/contrib/flatpages/locale/kn/LC_MESSAGES/django.po,sha256=-CHwu13UuE2-Qg6poG949I_dw3YiPI9ZhMh5h2vP4xw,2443 -django/contrib/flatpages/locale/ko/LC_MESSAGES/django.mo,sha256=M-IInVdIH24ORarb-KgY60tEorJZgrThDfJQOxW-S0c,2304 -django/contrib/flatpages/locale/ko/LC_MESSAGES/django.po,sha256=DjAtWVAN_fwOvZb-7CUSLtO8WN0Sr08z3jQLNqZ98wY,2746 -django/contrib/flatpages/locale/ky/LC_MESSAGES/django.mo,sha256=WmdWR6dRgmJ-nqSzFDUETypf373fj62igDVHC4ww7hQ,2667 -django/contrib/flatpages/locale/ky/LC_MESSAGES/django.po,sha256=0XDF6CjQTGkuaHADytG95lpFRVndlf_136q0lrQiU1U,2907 -django/contrib/flatpages/locale/lb/LC_MESSAGES/django.mo,sha256=Wkvlh5L_7CopayfNM5Z_xahmyVje1nYOBfQJyqucI_0,502 -django/contrib/flatpages/locale/lb/LC_MESSAGES/django.po,sha256=gGeTuniu3ZZ835t9HR-UtwCcd2s_Yr7ihIUm3jgQ7Y0,1545 -django/contrib/flatpages/locale/lt/LC_MESSAGES/django.mo,sha256=es6xV6X1twtqhIMkV-MByA7KZ5SoVsrx5Qh8BuzJS0Q,2506 -django/contrib/flatpages/locale/lt/LC_MESSAGES/django.po,sha256=T__44veTC_u4hpPvkLekDOWfntXYAMzCd5bffRtGxWA,2779 -django/contrib/flatpages/locale/lv/LC_MESSAGES/django.mo,sha256=RJbVUR8qS8iLL3dD5x1TOau4hcdscHUJBfxge3p3dsM,2359 -django/contrib/flatpages/locale/lv/LC_MESSAGES/django.po,sha256=M6GT6S-5-7__RtSbJ9oqkIlxfU3FIWMlGAQ03NEfcKo,2610 -django/contrib/flatpages/locale/mk/LC_MESSAGES/django.mo,sha256=55H8w6fB-B-RYlKKkGw3fg2m-djxUoEp_XpupK-ZL70,2699 -django/contrib/flatpages/locale/mk/LC_MESSAGES/django.po,sha256=OhHJ5OVWb0jvNaOB3wip9tSIZ1yaPPLkfQR--uUEyUI,2989 -django/contrib/flatpages/locale/ml/LC_MESSAGES/django.mo,sha256=VMMeOujp5fiLzrrbDeH24O2qKBPUkvI_YTSPH-LQjZc,3549 -django/contrib/flatpages/locale/ml/LC_MESSAGES/django.po,sha256=KR2CGnZ1sVuRzSGaPj5IlspoAkVuVEdf48XsAzt1se0,3851 -django/contrib/flatpages/locale/mn/LC_MESSAGES/django.mo,sha256=tqwROY6D-bJ4gbDQIowKXfuLIIdCWksGwecL2sj_wco,2776 -django/contrib/flatpages/locale/mn/LC_MESSAGES/django.po,sha256=jqiBpFLXlptDyU4F8ZWbP61S4APSPh0-nuTpNOejA6c,3003 -django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo,sha256=fuDy9vFLn5Mb3wVNUg8IvLyTwmyPr3M-GThzgkphJjg,2040 -django/contrib/flatpages/locale/mr/LC_MESSAGES/django.po,sha256=L_1vnLh4AjoaXdb4p_XfDnbKAAWkdQFSpE_8cKGZSm8,2593 -django/contrib/flatpages/locale/ms/LC_MESSAGES/django.mo,sha256=5t_67bMQhux6v6SSWqHfzzCgc6hm3olxgHAsKOMGGZU,2184 -django/contrib/flatpages/locale/ms/LC_MESSAGES/django.po,sha256=-ZzZ8lfAglGkO_BRYz1lRlywxaF1zZ28-Xv74O2nT04,2336 -django/contrib/flatpages/locale/my/LC_MESSAGES/django.mo,sha256=OcbiA7tJPkyt_WNrqyvoFjHt7WL7tMGHV06AZSxzkho,507 -django/contrib/flatpages/locale/my/LC_MESSAGES/django.po,sha256=EPWE566Vn7tax0PYUKq93vtydvmt-A4ooIau9Cwcdfc,1550 -django/contrib/flatpages/locale/nb/LC_MESSAGES/django.mo,sha256=L_XICESZ0nywkk1dn6RqzdUbFTcR92ju-zHCT1g3iEg,2208 -django/contrib/flatpages/locale/nb/LC_MESSAGES/django.po,sha256=ZtcBVD0UqIcsU8iLu5a2wnHLqu5WRLLboVFye2IuQew,2576 -django/contrib/flatpages/locale/ne/LC_MESSAGES/django.mo,sha256=gDZKhcku1NVlSs5ZPPupc7RI8HOF7ex0R4Rs8tMmrYE,1500 -django/contrib/flatpages/locale/ne/LC_MESSAGES/django.po,sha256=GWlzsDaMsJkOvw2TidJOEf1Fvxx9WxGdGAtfZIHkHwk,2178 -django/contrib/flatpages/locale/nl/LC_MESSAGES/django.mo,sha256=_yV_-SYYjpbo-rOHp8NlRzVHFPOSrfS-ndHOEJ9JP3Y,2231 -django/contrib/flatpages/locale/nl/LC_MESSAGES/django.po,sha256=xUuxx2b4ZTCA-1RIdoMqykLgjLLkmpO4ur1Vh93IITU,2669 -django/contrib/flatpages/locale/nn/LC_MESSAGES/django.mo,sha256=sHkuZneEWo1TItSlarlnOUR7ERjc76bJfHUcuFgd9mQ,2256 -django/contrib/flatpages/locale/nn/LC_MESSAGES/django.po,sha256=MpI9qkWqj4rud__xetuqCP-eFHUgMYJpfBhDnWRKPK4,2487 -django/contrib/flatpages/locale/os/LC_MESSAGES/django.mo,sha256=cXGTA5M229UFsgc7hEiI9vI9SEBrNQ8d3A0XrtazO6w,2329 -django/contrib/flatpages/locale/os/LC_MESSAGES/django.po,sha256=m-qoTiKePeFviKGH1rJRjZRH-doJ2Fe4DcZ6W52rG8s,2546 -django/contrib/flatpages/locale/pa/LC_MESSAGES/django.mo,sha256=69_ZsZ4nWlQ0krS6Mx3oL6c4sP5W9mx-yAmOhZOnjPU,903 -django/contrib/flatpages/locale/pa/LC_MESSAGES/django.po,sha256=N6gkoRXP5MefEnjywzRiE3aeU6kHQ0TUG6IGdLV7uww,1780 -django/contrib/flatpages/locale/pl/LC_MESSAGES/django.mo,sha256=5M5-d-TOx2WHlD6BCw9BYIU6bYrSR0Wlem89ih5k3Pc,2448 -django/contrib/flatpages/locale/pl/LC_MESSAGES/django.po,sha256=oKeeo-vNfPaCYVUbufrJZGk0vsgzAE0kLQOTF5qHAK4,2793 -django/contrib/flatpages/locale/pt/LC_MESSAGES/django.mo,sha256=9uXP_AY2U7tcqkM7r0CswVaP_xTjVd4ofmGDfy63bu8,2342 -django/contrib/flatpages/locale/pt/LC_MESSAGES/django.po,sha256=B8xIxpJ2Yv2HPaoeC71LJ7oe2Dd2K3FS07DQ4xPtoJc,2589 -django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.mo,sha256=YGyagSFIc-ssFN8bnqVRce1_PsybvLmI8RVCygjow8E,2291 -django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.po,sha256=pFA8RPNefZpuhbxBHLt9KrI2RiHxct5V-DnZA-XqBv0,2942 -django/contrib/flatpages/locale/ro/LC_MESSAGES/django.mo,sha256=oS3MXuRh2USyLOMrMH0WfMSFpgBcZWfrbCrovYgbONo,2337 -django/contrib/flatpages/locale/ro/LC_MESSAGES/django.po,sha256=UNKGNSZKS92pJDjxKDLqVUW87DKCWP4_Q51xS16IZl0,2632 -django/contrib/flatpages/locale/ru/LC_MESSAGES/django.mo,sha256=AACtHEQuytEohUZVgk-o33O7rJTFAluq22VJOw5JqII,2934 -django/contrib/flatpages/locale/ru/LC_MESSAGES/django.po,sha256=H6JOPAXNxji1oni9kfga_hNZevodStpEl0O6cDnZ148,3312 -django/contrib/flatpages/locale/sk/LC_MESSAGES/django.mo,sha256=P1192D_B2kDQ6nF_tGEW7WCoTodB3_9rMTaqEQSMO4E,2353 -django/contrib/flatpages/locale/sk/LC_MESSAGES/django.po,sha256=--_DaPB_aSZHn_uxzmCpITO7VPCpP4Nq2rdQGgN14r8,2638 -django/contrib/flatpages/locale/sl/LC_MESSAGES/django.mo,sha256=kOrhhBdM9nbQbCLN49bBn23hCrzpAPrfKvPs4QMHgvo,2301 -django/contrib/flatpages/locale/sl/LC_MESSAGES/django.po,sha256=oyTrOVH0v76Ttc93qfeyu3FHcWLh3tTiz2TefGkmoq4,2621 -django/contrib/flatpages/locale/sq/LC_MESSAGES/django.mo,sha256=wh0stJPSy1w6eSio-Jg_gh_jharjRyanNurOP0avTsM,2350 -django/contrib/flatpages/locale/sq/LC_MESSAGES/django.po,sha256=9oVuVF8OLvf_XBs_duhu-XqF-5Naaai7gGpsPOrqvbQ,2630 -django/contrib/flatpages/locale/sr/LC_MESSAGES/django.mo,sha256=p--v7bpD8Pp6zeP3cdh8fnfC8g2nuhbzGJTdN9eoE58,2770 -django/contrib/flatpages/locale/sr/LC_MESSAGES/django.po,sha256=jxcyMN2Qh_osmo4Jf_6QUC2vW3KVKt1BupDWMMZyAXA,3071 -django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=3N4mGacnZj0tI5tFniLqC2LQCPSopDEM1SGaw5N1bsw,2328 -django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.po,sha256=od7r3dPbZ7tRAJUW80Oe-nm_tHcmIiG6b2OZMsFg53s,2589 -django/contrib/flatpages/locale/sv/LC_MESSAGES/django.mo,sha256=1pFmNWiExWo5owNijZHZb8-Tbd0nYPqqvTmIitcFPbY,2252 -django/contrib/flatpages/locale/sv/LC_MESSAGES/django.po,sha256=l3anvdgLQJzYehCalwr1AAh8e-hRKrL_bSNwmkfgbbc,2613 -django/contrib/flatpages/locale/sw/LC_MESSAGES/django.mo,sha256=Lhf99AGmazKJHzWk2tkGrMInoYOq0mtdCd8SGblnVCQ,1537 -django/contrib/flatpages/locale/sw/LC_MESSAGES/django.po,sha256=cos3eahuznpTfTdl1Vj_07fCOSYE8C9CRYHCBLYZrVw,1991 -django/contrib/flatpages/locale/ta/LC_MESSAGES/django.mo,sha256=nNuoOX-FPAmTvM79o7colM4C7TtBroTFxYtETPPatcQ,1945 -django/contrib/flatpages/locale/ta/LC_MESSAGES/django.po,sha256=XE4SndPZPLf1yXGl5xQSb0uor4OE8CKJ0EIXBRDA3qU,2474 -django/contrib/flatpages/locale/te/LC_MESSAGES/django.mo,sha256=bMxhDMTQc_WseqoeqJMCSNy71o4U5tJZYgD2G0p-jD0,1238 -django/contrib/flatpages/locale/te/LC_MESSAGES/django.po,sha256=tmUWOrAZ98B9T6Cai8AgLCfb_rLeoPVGjDTgdsMOY1Y,2000 -django/contrib/flatpages/locale/tg/LC_MESSAGES/django.mo,sha256=gpzjf_LxwWX6yUrcUfNepK1LGez6yvnuYhmfULDPZ6E,2064 -django/contrib/flatpages/locale/tg/LC_MESSAGES/django.po,sha256=lZFLes8BWdJ-VbczHFDWCSKhKg0qmmk10hTjKcBNr5o,2572 -django/contrib/flatpages/locale/th/LC_MESSAGES/django.mo,sha256=mct17_099pUn0aGuHu8AlZG6UqdKDpYLojqGYDLRXRg,2698 -django/contrib/flatpages/locale/th/LC_MESSAGES/django.po,sha256=PEcRx5AtXrDZvlNGWFH-0arroD8nZbutdJBe8_I02ag,2941 -django/contrib/flatpages/locale/tk/LC_MESSAGES/django.mo,sha256=_AfI4FH0jkeeCDgujfkx4xHMGSwGi5fs9iqr3HLUVVs,835 -django/contrib/flatpages/locale/tk/LC_MESSAGES/django.po,sha256=28Af2gU6Wmo2DvjxLZrpbXq0HBFrcP7yzfh5IlL4DJg,1881 -django/contrib/flatpages/locale/tr/LC_MESSAGES/django.mo,sha256=pPNGylfG8S0iBI4ONZbky3V2Q5AG-M1njp27tFrhhZc,2290 -django/contrib/flatpages/locale/tr/LC_MESSAGES/django.po,sha256=0ULZu3Plp8H9zdirHy3MSduJ_QRdpoaaivf3bL9MCwA,2588 -django/contrib/flatpages/locale/tt/LC_MESSAGES/django.mo,sha256=9RfCKyn0ZNYsqLvFNmY18xVMl7wnmDq5uXscrsFfupk,2007 -django/contrib/flatpages/locale/tt/LC_MESSAGES/django.po,sha256=SUwalSl8JWI9tuDswmnGT8SjuWR3DQGND9roNxJtH1o,2402 -django/contrib/flatpages/locale/udm/LC_MESSAGES/django.mo,sha256=7KhzWgskBlHmi-v61Ax9fjc3NBwHB17WppdNMuz-rEc,490 -django/contrib/flatpages/locale/udm/LC_MESSAGES/django.po,sha256=zidjP05Hx1OpXGqWEmF2cg9SFxASM4loOV85uW7zV5U,1533 -django/contrib/flatpages/locale/ug/LC_MESSAGES/django.mo,sha256=FL8P63c7BRO5hNABEzurk91v01ceRBhC1DJyjFJkiwg,2644 -django/contrib/flatpages/locale/ug/LC_MESSAGES/django.po,sha256=TxlRCGW-6fyxOO3YzAzKJa4utQp4NOOZ08YZxSit9E8,2774 -django/contrib/flatpages/locale/uk/LC_MESSAGES/django.mo,sha256=r2RZT8xQ1Gi9Yp0nnoNALqQ4zrEJ0JC7m26E5gSeq4g,3002 -django/contrib/flatpages/locale/uk/LC_MESSAGES/django.po,sha256=qcVizoTiKYc1c9KwSTwSALHgjjSGVY2oito_bBRLVTE,3405 -django/contrib/flatpages/locale/ur/LC_MESSAGES/django.mo,sha256=Li4gVdFoNOskGKAKiNuse6B2sz6ePGqGvZu7aGXMNy0,1976 -django/contrib/flatpages/locale/ur/LC_MESSAGES/django.po,sha256=hDasKiKrYov9YaNIHIpoooJo0Bzba___IuN2Hl6ofSc,2371 -django/contrib/flatpages/locale/vi/LC_MESSAGES/django.mo,sha256=FsFUi96oGTWGlZwM4qSMpuL1M2TAxsW51qO70TrybSM,1035 -django/contrib/flatpages/locale/vi/LC_MESSAGES/django.po,sha256=ITX3MWd7nlWPxTCoNPl22_OMLTt0rfvajGvTVwo0QC8,1900 -django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=UTCQr9t2wSj6dYLK1ftpF8-pZ25dAMYLRE2wEUQva-o,2124 -django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.po,sha256=loi9RvOnrgFs4qp8FW4RGis7wgDzBBXuwha5pFfLRxY,2533 -django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=INt9_smj4Zwo3hkn3kemuE85lfvwjUrIxbkIHa7Cd_E,2176 -django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.po,sha256=d9De9F9YWkc8YZt51Cg5Xtslwg04G0aRMqxTMAXqQI8,2477 -django/contrib/flatpages/middleware.py,sha256=aXeOeOkUmpdkGOyqZnkR-l1VrDQ161RWIWa3WPBhGac,784 -django/contrib/flatpages/migrations/0001_initial.py,sha256=4xhMsKaXOycsfo9O1QIuknS9wf7r0uVsshAJ7opeqsM,2408 -django/contrib/flatpages/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/flatpages/migrations/__pycache__/0001_initial.cpython-310.pyc,, -django/contrib/flatpages/migrations/__pycache__/__init__.cpython-310.pyc,, -django/contrib/flatpages/models.py,sha256=3ugRRsDwB5C3GHOWvtOzjJl-y0yqqjYZBSOMt24QYuw,1764 -django/contrib/flatpages/sitemaps.py,sha256=CEhZOsLwv3qIJ1hs4eHlE_0AAtYjicb_yRzsstY19eg,584 -django/contrib/flatpages/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/flatpages/templatetags/__pycache__/__init__.cpython-310.pyc,, -django/contrib/flatpages/templatetags/__pycache__/flatpages.cpython-310.pyc,, -django/contrib/flatpages/templatetags/flatpages.py,sha256=QH-suzsoPIMSrgyHR9O8uOdmfIkBv_w3LM-hGfQvnU8,3552 -django/contrib/flatpages/urls.py,sha256=Rs37Ij192SOtSBjd4Lx9YtpINfEMg7XRY01dEOY8Rgg,179 -django/contrib/flatpages/views.py,sha256=H4LG7Janb6Dcn-zINLmp358hR60JigAKGzh4A4PMPaM,2724 -django/contrib/gis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/__pycache__/apps.cpython-310.pyc,, -django/contrib/gis/__pycache__/feeds.cpython-310.pyc,, -django/contrib/gis/__pycache__/geoip2.cpython-310.pyc,, -django/contrib/gis/__pycache__/geometry.cpython-310.pyc,, -django/contrib/gis/__pycache__/measure.cpython-310.pyc,, -django/contrib/gis/__pycache__/ptr.cpython-310.pyc,, -django/contrib/gis/__pycache__/shortcuts.cpython-310.pyc,, -django/contrib/gis/__pycache__/views.cpython-310.pyc,, -django/contrib/gis/admin/__init__.py,sha256=bCUsC6Hh7hztchqRKuaiTgk3nL0B4H053bVII-olB7k,486 -django/contrib/gis/admin/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/admin/__pycache__/options.cpython-310.pyc,, -django/contrib/gis/admin/options.py,sha256=r60rycdAgcGSB21KQS_V0X78ulUjATYzws-JKLYd_lc,689 -django/contrib/gis/apps.py,sha256=dbAFKx9jj9_QdhdNfL5KCC47puH_ZTw098jsJFwDO9Y,417 -django/contrib/gis/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/db/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/db/backends/__pycache__/utils.cpython-310.pyc,, -django/contrib/gis/db/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/base/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/db/backends/base/__pycache__/adapter.cpython-310.pyc,, -django/contrib/gis/db/backends/base/__pycache__/features.cpython-310.pyc,, -django/contrib/gis/db/backends/base/__pycache__/models.cpython-310.pyc,, -django/contrib/gis/db/backends/base/__pycache__/operations.cpython-310.pyc,, -django/contrib/gis/db/backends/base/adapter.py,sha256=qbLG-sLB6EZ_sA6-E_uIClyp5E5hz9UQ-CsR3BWx8W8,592 -django/contrib/gis/db/backends/base/features.py,sha256=fF-AKB6__RjkxVRadNkOP7Av4wMaRGkXKybYV6ES2Gk,3718 -django/contrib/gis/db/backends/base/models.py,sha256=WqpmVLqK21m9J6k_N-SGPXq1VZMuNHafyB9xqxUwR4k,4009 -django/contrib/gis/db/backends/base/operations.py,sha256=_g_B-_AN1OVmarA3O8FdU7hnAgBCX0d4gvqalNRJAYg,6859 -django/contrib/gis/db/backends/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/mysql/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/db/backends/mysql/__pycache__/base.cpython-310.pyc,, -django/contrib/gis/db/backends/mysql/__pycache__/features.cpython-310.pyc,, -django/contrib/gis/db/backends/mysql/__pycache__/introspection.cpython-310.pyc,, -django/contrib/gis/db/backends/mysql/__pycache__/operations.cpython-310.pyc,, -django/contrib/gis/db/backends/mysql/__pycache__/schema.cpython-310.pyc,, -django/contrib/gis/db/backends/mysql/base.py,sha256=z75wKhm-e9JfRLCvgDq-iv9OqOjBBAS238JTTrWfHRQ,498 -django/contrib/gis/db/backends/mysql/features.py,sha256=dVRo3CuV8Zp5822h9l48nApiXyn3lCuXQV3vsRZKeao,866 -django/contrib/gis/db/backends/mysql/introspection.py,sha256=ZihcSzwN0f8iqKOYKMHuQ_MY41ERSswjP46dvCF0v68,1602 -django/contrib/gis/db/backends/mysql/operations.py,sha256=VUW1dp9__5kx0hygPYWyUEzXKEwnp1S69X3F98E21X0,4952 -django/contrib/gis/db/backends/mysql/schema.py,sha256=Fn_h-6C8od95KTPWSogQprPGtTho5b-TbqqXaHVfkHg,3953 -django/contrib/gis/db/backends/oracle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/oracle/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/adapter.cpython-310.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/base.cpython-310.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/features.cpython-310.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/introspection.cpython-310.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/models.cpython-310.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/operations.cpython-310.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/schema.cpython-310.pyc,, -django/contrib/gis/db/backends/oracle/adapter.py,sha256=AjD0eMuptu8BqkE2LshTizkf5iv9ArYVP9PoOTHfNao,2066 -django/contrib/gis/db/backends/oracle/base.py,sha256=_7qhvEdbnrJQEKL51sg8YYu8kRYmQNAlBgNb2OUbBkw,507 -django/contrib/gis/db/backends/oracle/features.py,sha256=3yCDutKz4iX01eOjLf0CLe_cemMaRjDmH8ZKNy_Sbyk,1021 -django/contrib/gis/db/backends/oracle/introspection.py,sha256=fW9FTIW_yAQQZwk0LzdoTtj6QQpFN6fgUQzv8dCmFEo,1939 -django/contrib/gis/db/backends/oracle/models.py,sha256=uKHuBReEGNJG6MbT-8rTyrCVZs3By2hCAx7bwyxSYUM,2081 -django/contrib/gis/db/backends/oracle/operations.py,sha256=DiJbFrN_I_YQYt6Z7F_-SkJVpztmWq1RJyT8wRn8eVI,8785 -django/contrib/gis/db/backends/oracle/schema.py,sha256=3nXuUXM0fHPRuqmi96WyCVx_lHRxf3USRN8At14VUwE,5430 -django/contrib/gis/db/backends/postgis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/postgis/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/adapter.cpython-310.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/base.cpython-310.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/const.cpython-310.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/features.cpython-310.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/introspection.cpython-310.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/models.cpython-310.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/operations.cpython-310.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/pgraster.cpython-310.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/schema.cpython-310.pyc,, -django/contrib/gis/db/backends/postgis/adapter.py,sha256=mjQZEfrJtAEoFZFqoTiQ3uk_rBatstX0qFDFV8xZ90w,1980 -django/contrib/gis/db/backends/postgis/base.py,sha256=37t0_fDD4IeFsQrMrKoQRW01e8KJeXCSkbv5sOpreR8,5793 -django/contrib/gis/db/backends/postgis/const.py,sha256=ekJc9pvJwQ0tmxENkJsZFdP03uEUEneloR23SJcnTIc,2008 -django/contrib/gis/db/backends/postgis/features.py,sha256=qOEJLQTIC1YdlDoJkpLCiVQU4GAy0d9_Dneui7w41bM,455 -django/contrib/gis/db/backends/postgis/introspection.py,sha256=ihrNd_qHQ64DRjoaPj9-1a0y3H8Ko4gWbK2N5fDA3_g,3164 -django/contrib/gis/db/backends/postgis/models.py,sha256=LDZjyXCxyptWoOWPkeznO15auI4LCpWDTsVaZBnQcSU,2002 -django/contrib/gis/db/backends/postgis/operations.py,sha256=zcM7Oj1pxJ4PTh4qprOKLxTzU66nlkhjpuUATBPjDtY,16576 -django/contrib/gis/db/backends/postgis/pgraster.py,sha256=eCa2y-v3qGLeNbFI4ERFj2UmqgYAE19nuL3SgDFmm0o,4588 -django/contrib/gis/db/backends/postgis/schema.py,sha256=vgvUV6vwny02sNshGGWMksqB0XAIwTN7fDcjjvZBaQI,4468 -django/contrib/gis/db/backends/spatialite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/spatialite/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/adapter.cpython-310.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/base.cpython-310.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/client.cpython-310.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/features.cpython-310.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/introspection.cpython-310.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/models.cpython-310.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/operations.cpython-310.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/schema.cpython-310.pyc,, -django/contrib/gis/db/backends/spatialite/adapter.py,sha256=qTiA5BBGUFND3D7xGK_85oo__HSexTH32XF4uin3ZV0,318 -django/contrib/gis/db/backends/spatialite/base.py,sha256=wU1fgp68CLyKELsMfO6zYM85ox4g_GloWESEK8EPrfM,3218 -django/contrib/gis/db/backends/spatialite/client.py,sha256=dNM7mqDyTzFlgQR1XhqZIftnR9VRH7AfcSvvy4vucEs,138 -django/contrib/gis/db/backends/spatialite/features.py,sha256=zkmJPExFtRqjRj608ZTlsSpxkYaPbV3A3SEfX3PcaFY,876 -django/contrib/gis/db/backends/spatialite/introspection.py,sha256=V_iwkz0zyF1U-AKq-UlxvyDImqQCsitcmvxk2cUw81A,3118 -django/contrib/gis/db/backends/spatialite/models.py,sha256=H-sDifQ3-0pvWIAl79zrqGfuTW7-vp1zFn1bIfqUR-o,1930 -django/contrib/gis/db/backends/spatialite/operations.py,sha256=jaLhSEYHqEewdx1AbaQpwy-S6lZOJiuY2ZwHb1euJ5M,8520 -django/contrib/gis/db/backends/spatialite/schema.py,sha256=URhFfLQM7FH39wmkViD8MZJ1qG3cixhNdWmjuM9ZB44,7340 -django/contrib/gis/db/backends/utils.py,sha256=rLwSv79tKJPxvDHACY8rhPDLFZC79mEIlIySTyl_qqc,785 -django/contrib/gis/db/models/__init__.py,sha256=TrCS27JdVa-Q7Hok-YaJxb4eLrPdyvRmasJGIu05fvA,865 -django/contrib/gis/db/models/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/db/models/__pycache__/aggregates.cpython-310.pyc,, -django/contrib/gis/db/models/__pycache__/fields.cpython-310.pyc,, -django/contrib/gis/db/models/__pycache__/functions.cpython-310.pyc,, -django/contrib/gis/db/models/__pycache__/lookups.cpython-310.pyc,, -django/contrib/gis/db/models/__pycache__/proxy.cpython-310.pyc,, -django/contrib/gis/db/models/aggregates.py,sha256=ImbuX2AhL6PkEyrGDv_qKIgR9FSeIur7cIMIVKUYnlM,3147 -django/contrib/gis/db/models/fields.py,sha256=FuDumSWW2Gjcyihu4W1PNk0-qk5YcahxVV_erdtXiGM,14288 -django/contrib/gis/db/models/functions.py,sha256=1zoJCVjBlFK6jjeOHVWHMLW1p1EHyoLM4DmspUqO94w,19606 -django/contrib/gis/db/models/lookups.py,sha256=FOb501DBuopcbLy175O1BwD2ZoaVa2optogbXmvwv3o,11797 -django/contrib/gis/db/models/proxy.py,sha256=qckCc10o_W1qJ7yH5VpNo6huhPfVMAz3nJSEyLfk4oo,3174 -django/contrib/gis/db/models/sql/__init__.py,sha256=-rzcC3izMJi2bnvyQUCMzIOrigBnY6N_5EQIim4wCSY,134 -django/contrib/gis/db/models/sql/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/db/models/sql/__pycache__/conversion.cpython-310.pyc,, -django/contrib/gis/db/models/sql/conversion.py,sha256=ZiMRzEf7_kOWJ4IITXFq6dL-wDwMhIEwvbE705afgaU,2433 -django/contrib/gis/feeds.py,sha256=0vNVVScIww13bOxvlQfXAOCItIOGWSXroKKl6QXGB58,5995 -django/contrib/gis/forms/__init__.py,sha256=Zyid_YlZzHUcMYkfGX1GewmPPDNc0ni7HyXKDTeIkjo,318 -django/contrib/gis/forms/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/forms/__pycache__/fields.cpython-310.pyc,, -django/contrib/gis/forms/__pycache__/widgets.cpython-310.pyc,, -django/contrib/gis/forms/fields.py,sha256=FrZaZWXFUdWK1QEu8wlda3u6EtqaVHjQRYrSKKu66PA,4608 -django/contrib/gis/forms/widgets.py,sha256=jV0TSxB6quB0rbkyAq4QJCdrZt4rA_LaZnO9CHRFdgI,3917 -django/contrib/gis/gdal/LICENSE,sha256=VwoEWoNyts1qAOMOuv6OPo38Cn_j1O8sxfFtQZ62Ous,1526 -django/contrib/gis/gdal/__init__.py,sha256=T3nxyji_4z2qUDPKzKlWKggVYpB3_5j6nLuEPDoz7R0,1811 -django/contrib/gis/gdal/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/base.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/datasource.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/driver.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/envelope.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/error.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/feature.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/field.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/geometries.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/geomtype.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/layer.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/libgdal.cpython-310.pyc,, -django/contrib/gis/gdal/__pycache__/srs.cpython-310.pyc,, -django/contrib/gis/gdal/base.py,sha256=yymyL0vZRMBfiFUzrehvaeaunIxMH5ucGjPRfKj-rAo,181 -django/contrib/gis/gdal/datasource.py,sha256=AnC_VfGXygqpeFYJ-bWKo0oIdDNCGV85XZ-TBd7Dapk,4644 -django/contrib/gis/gdal/driver.py,sha256=wu2m_-lGPO4MDmJrUPBYrGDUD7BnNPFx0RROeE3-qP0,2983 -django/contrib/gis/gdal/envelope.py,sha256=jL_fm04Lx71ouo2sZgOsh-PZQf_bLDrml-KFFq6ExPk,7316 -django/contrib/gis/gdal/error.py,sha256=RcESzxTt3jMKk9s82y2Dj7nMcuoSAMOCX1eo5KFYUfw,1575 -django/contrib/gis/gdal/feature.py,sha256=HPWoCZjwzsUnhc7QmKh-BBMRqJCjj07RcFI6vjbdnp4,4017 -django/contrib/gis/gdal/field.py,sha256=EKE-Ioj5L79vo93Oixz_JE4TIZbDTRy0YVGvZH-I1z4,6886 -django/contrib/gis/gdal/geometries.py,sha256=FkJh447xjZ74hRGfpjVzjrfTiCVpxWRNvHgELclthCc,29286 -django/contrib/gis/gdal/geomtype.py,sha256=CWqbe5XtpgKiBP8Lbisbtb8o1FtuIUVb37Eb02i6TSE,4582 -django/contrib/gis/gdal/layer.py,sha256=PygAgsRZzWekp6kq6NEAZ6vhQTSo1Nk4c1Yi_pOdK58,8825 -django/contrib/gis/gdal/libgdal.py,sha256=F1n-2MC7MY7lYYUvIDmkZb5MBj11h8bPOuvozsgPZ9s,3619 -django/contrib/gis/gdal/prototypes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/gdal/prototypes/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/ds.cpython-310.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/errcheck.cpython-310.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/generation.cpython-310.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/geom.cpython-310.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/raster.cpython-310.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/srs.cpython-310.pyc,, -django/contrib/gis/gdal/prototypes/ds.py,sha256=1aSaQgxivM0PYc1Y7jHbFeqjdSSX_xZHYPlsveCOeN8,4725 -django/contrib/gis/gdal/prototypes/errcheck.py,sha256=DXLq_ppsgOXNhkRLJ939fo9FvRS0WhVqZDrpbZRQ2Dk,4172 -django/contrib/gis/gdal/prototypes/generation.py,sha256=fm3iMpp8TfaIx72jFNqs7YrHX5KLz0_DUTumaNhOI_M,4888 -django/contrib/gis/gdal/prototypes/geom.py,sha256=r23rTpJhgMiw30GdLO37UThESeVuOfSIZcaure4Zy5c,6233 -django/contrib/gis/gdal/prototypes/raster.py,sha256=jPOBqT6580qCThK5PhigyELzxMdp05RgI4hAKSlie_0,5571 -django/contrib/gis/gdal/prototypes/srs.py,sha256=52Aq0F7CT0_SqoMCaiIXVDVQ9dsnLGGIYXo5jf3EDDU,3677 -django/contrib/gis/gdal/raster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/gdal/raster/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/gdal/raster/__pycache__/band.cpython-310.pyc,, -django/contrib/gis/gdal/raster/__pycache__/base.cpython-310.pyc,, -django/contrib/gis/gdal/raster/__pycache__/const.cpython-310.pyc,, -django/contrib/gis/gdal/raster/__pycache__/source.cpython-310.pyc,, -django/contrib/gis/gdal/raster/band.py,sha256=RPdut6BeQ9vW71rrPMwb2CnXrbCys8YAt1BA8Aholy0,8343 -django/contrib/gis/gdal/raster/base.py,sha256=2GGlL919lPr7YVGFtdIynLPIH-QKYhzrUpoXwVRlM1k,2882 -django/contrib/gis/gdal/raster/const.py,sha256=C_svBc-x052KJojH1t3pD1N29d67hQxyN8rm8u0141o,3283 -django/contrib/gis/gdal/raster/source.py,sha256=NmsCjTWDbNFt7oEWfSQSN7ZlofyDZ2yJ3ClSAfDjiW0,18394 -django/contrib/gis/gdal/srs.py,sha256=fbekX1cVeVT_36NwGqsbXMJ9xNlftLRVRcOSQL1p8Gk,12301 -django/contrib/gis/geoip2.py,sha256=yO0AGB3WIPZzwLZ_YVrwh0ph-FnS8MCoXpLttE-VyVg,9399 -django/contrib/gis/geometry.py,sha256=oyapp3-FbCo1f2RQZhDwg-JD2sg1bq5Cgzpfxj-UmuE,788 -django/contrib/gis/geos/LICENSE,sha256=CL8kt1USOK4yUpUkVCWxyuua0PQvni0wPHs1NQJjIEU,1530 -django/contrib/gis/geos/__init__.py,sha256=7BIDN_LCzaNYi0RiDiPwxdm1G76cCiTBJLswcM6CMZI,661 -django/contrib/gis/geos/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/base.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/collections.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/coordseq.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/error.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/factory.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/geometry.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/io.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/libgeos.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/linestring.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/mutable_list.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/point.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/polygon.cpython-310.pyc,, -django/contrib/gis/geos/__pycache__/prepared.cpython-310.pyc,, -django/contrib/gis/geos/base.py,sha256=NdlFg5l9akvDp87aqzh9dk0A3ZH2TI3cOq10mmmuHBk,181 -django/contrib/gis/geos/collections.py,sha256=m9Soitiu7cOEUdIrTZ-j5ZHn6HjmXsyWxXzC5DyTSm0,3939 -django/contrib/gis/geos/coordseq.py,sha256=YJAneODq8jUeJij_NTDPxHICdNmToHvv-KdLZnRyz50,6838 -django/contrib/gis/geos/error.py,sha256=AdeCRUVPa-G22WA5lJ5QqU4T0k79NLk1hy3n5-expfs,105 -django/contrib/gis/geos/factory.py,sha256=KQF6lqAh5KRlFSDgN-BSXWojmWFabbEUFgz2IGYX_vk,961 -django/contrib/gis/geos/geometry.py,sha256=Z34Skz4Hy-TEns5MMa40mIiR3rjHTgH9wYsunBr2htI,26650 -django/contrib/gis/geos/io.py,sha256=GCUL4p6B7FYAHOcPcbTc-QLuSJ3rtvKvU7vfzZpUlsg,800 -django/contrib/gis/geos/libgeos.py,sha256=ewU31F5eQFu4xAXvKAFbaZn4UJ0g_aiDTGuRk_MTwOo,4983 -django/contrib/gis/geos/linestring.py,sha256=BJAoWfHW08EX1UpNFVB09iSKXdTS6pZsTIBc6DcZcfc,6372 -django/contrib/gis/geos/mutable_list.py,sha256=nthCtQ0FsJrDGd29cSERwXb-tJkpK35Vc0T_ywCnXgc,10121 -django/contrib/gis/geos/point.py,sha256=bvatsdXTb1XYy1EaSZvp4Rnr2LwXZU12zILefLu6sRw,4781 -django/contrib/gis/geos/polygon.py,sha256=DZq6Ed9bJA3MqhpDQ9u926hHxcnxBjnbKSppHgbShxw,6710 -django/contrib/gis/geos/prepared.py,sha256=J5Dj6e3u3gEfVPNOM1E_rvcmcXR2-CdwtbAcoiDU5a0,1577 -django/contrib/gis/geos/prototypes/__init__.py,sha256=aYQVHVT7hAN0jSH4ioDcb5yfnJdFBmouHXfRNDbzE0M,1435 -django/contrib/gis/geos/prototypes/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/coordseq.cpython-310.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/errcheck.cpython-310.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/geom.cpython-310.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/io.cpython-310.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/misc.cpython-310.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/predicates.cpython-310.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/prepared.cpython-310.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/threadsafe.cpython-310.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/topology.cpython-310.pyc,, -django/contrib/gis/geos/prototypes/coordseq.py,sha256=GpNDnUiIg76I-qad72DGw7wEz3i5H_XH9YHO4CvYTys,3124 -django/contrib/gis/geos/prototypes/errcheck.py,sha256=SWHaBSMBPJofTPq0moiDHrCInl5P1vYaqbXgAKbBvTQ,2788 -django/contrib/gis/geos/prototypes/geom.py,sha256=_nnOMLRKNS9zmcBYsivcewl10Ks6WME0Yp-ERvADa2k,3401 -django/contrib/gis/geos/prototypes/io.py,sha256=j5379Sb-uLjW7SpxQiOeDvcJjrb1ZCa9bOa6IhD6sWI,11321 -django/contrib/gis/geos/prototypes/misc.py,sha256=Sj0fZygL7MFR4pp_xPJiZHRBufnVk5YfK5LeUv2htWs,1167 -django/contrib/gis/geos/prototypes/predicates.py,sha256=Z__y5ZMvpZS718JQsGKHdZ27gXZ6sC9xwD7fWv4CAmc,1662 -django/contrib/gis/geos/prototypes/prepared.py,sha256=4I9pS75Q5MZ1z8A1v0mKkmdCly33Kj_0sDcrqxOppzM,1175 -django/contrib/gis/geos/prototypes/threadsafe.py,sha256=n1yCYvQCtc7piFrhjeZCWH8Pf0-AiOGBH33VZusTgWI,2302 -django/contrib/gis/geos/prototypes/topology.py,sha256=uJ9MOvjGhgEuz6irMDhZEWO_UDd_RMtp5ZfbWvf2hgI,2327 -django/contrib/gis/locale/af/LC_MESSAGES/django.mo,sha256=FWnPEpxhJG9xJ-uOTFryxIT6BFN3w-bsgqLn0IHF-Ew,518 -django/contrib/gis/locale/af/LC_MESSAGES/django.po,sha256=v5LXHABklHAVbfrPEx3xXGIHIZ4hz4MmfvZ6beC-XF4,1540 -django/contrib/gis/locale/ar/LC_MESSAGES/django.mo,sha256=5LCO903yJTtRVaaujBrmwMx8f8iLa3ihasgmj8te9eg,2301 -django/contrib/gis/locale/ar/LC_MESSAGES/django.po,sha256=pfUyK0VYgY0VC2_LvWZvG_EEIWa0OqIUfhiPT2Uov3Q,2569 -django/contrib/gis/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=1e2lutVEjsa5vErMdjS6gaBbOLPTVIpDv15rax-wvKg,2403 -django/contrib/gis/locale/ar_DZ/LC_MESSAGES/django.po,sha256=dizXM36w-rUtI7Dv2mSoJDR5ouVR6Ar7zqjywX3xKr0,2555 -django/contrib/gis/locale/ast/LC_MESSAGES/django.mo,sha256=8o0Us4wR14bdv1M5oBeczYC4oW5uKnycWrj1-lMIqV4,850 -django/contrib/gis/locale/ast/LC_MESSAGES/django.po,sha256=0beyFcBkBOUNvPP45iqewTNv2ExvCPvDYwpafCJY5QM,1684 -django/contrib/gis/locale/az/LC_MESSAGES/django.mo,sha256=FOvFUN-kdoX5OvhaVJg3v4rOyQgAQ_YC--TCE3m4kXs,1901 -django/contrib/gis/locale/az/LC_MESSAGES/django.po,sha256=exlD78A7sUZBPuoLyQGZoYiBa2wWGWnsWKq0gUYUOng,2118 -django/contrib/gis/locale/be/LC_MESSAGES/django.mo,sha256=XcJGF9cH7M30Q8EwqovjAeiJFgB2PR4sXsbxdvVURjg,2389 -django/contrib/gis/locale/be/LC_MESSAGES/django.po,sha256=Cp_DXKCVHzYTA7v65TpjRhCJonkgI5Gy13Tfg1rkVp8,2596 -django/contrib/gis/locale/bg/LC_MESSAGES/django.mo,sha256=lLfpqEEEb1RYzy270gpDdEfv5k5jscyNgJv_Ok_BA_A,2323 -django/contrib/gis/locale/bg/LC_MESSAGES/django.po,sha256=hSxYwbKr-IqP5hJaPKQxoL1DkCIg60suHl1H8u8W7jQ,2586 -django/contrib/gis/locale/bn/LC_MESSAGES/django.mo,sha256=7oNsr_vHQfsanyP-o1FG8jZTSBK8jB3eK2fA9AqNOx4,1070 -django/contrib/gis/locale/bn/LC_MESSAGES/django.po,sha256=PTa9EFZdqfznUH7si3Rq3zp1kNkTOnn2HRTEYXQSOdM,1929 -django/contrib/gis/locale/br/LC_MESSAGES/django.mo,sha256=xN8hOvJi_gDlpdC5_lghXuX6yCBYDPfD_SQLjcvq8gU,1614 -django/contrib/gis/locale/br/LC_MESSAGES/django.po,sha256=LQw3Tp_ymJ_x7mJ6g4SOr6aP00bejkjuaxfFFRZnmaQ,2220 -django/contrib/gis/locale/bs/LC_MESSAGES/django.mo,sha256=9EdKtZkY0FX2NlX_q0tIxXD-Di0SNQJZk3jo7cend0A,1308 -django/contrib/gis/locale/bs/LC_MESSAGES/django.po,sha256=eu_qF8dbmlDiRKGNIz80XtIunrF8QIOcy8O28X02GvQ,1905 -django/contrib/gis/locale/ca/LC_MESSAGES/django.mo,sha256=6aq8xNlP95HRncIB6ThimqW14XFKp7OOjo0S0uT6d-Y,1948 -django/contrib/gis/locale/ca/LC_MESSAGES/django.po,sha256=0Tj64N9TVX-oDyq4srBCgqELmM8OjMgXC5Lci844Fvc,2298 -django/contrib/gis/locale/ckb/LC_MESSAGES/django.mo,sha256=tIH0KyO3XREfX8htOCAK6cJSZkS0BCE15AZngco_Vkw,2253 -django/contrib/gis/locale/ckb/LC_MESSAGES/django.po,sha256=krJj0SQiLAcc1uNA9Qazqy9Ty-7MhauoaIDHtjmPPfo,2442 -django/contrib/gis/locale/cs/LC_MESSAGES/django.mo,sha256=ia8l06-eW5VkQnNQU0aizio7pz_pSGA-KRk-liGRa2w,2026 -django/contrib/gis/locale/cs/LC_MESSAGES/django.po,sha256=8taX01JBHhr19_AKhfhbtlpt-TW1aOBwejN-o-HH5Xk,2274 -django/contrib/gis/locale/cy/LC_MESSAGES/django.mo,sha256=vUG_wzZaMumPwIlKwuN7GFcS9gnE5rpflxoA_MPM_po,1430 -django/contrib/gis/locale/cy/LC_MESSAGES/django.po,sha256=_QjXT6cySUXrjtHaJ3046z-5PoXkCqtOhvA7MCZsXxk,1900 -django/contrib/gis/locale/da/LC_MESSAGES/django.mo,sha256=eXid2KAU_8fd23jMFo41iJ3DntVNe0w939_UsBymGM4,1862 -django/contrib/gis/locale/da/LC_MESSAGES/django.po,sha256=9bSpjg9wv7nvWoaOfRhXKsuxVoMzOHU-fsnVNB8qbxM,2158 -django/contrib/gis/locale/de/LC_MESSAGES/django.mo,sha256=fECmj81LHOUcBcQ_PoQWlijVp3SjTG3GwsSRiUGMXOU,1930 -django/contrib/gis/locale/de/LC_MESSAGES/django.po,sha256=DB_2QZ0IHOxKJ51ZyJCNX24597W7DBc_DT1B-oId-bY,2129 -django/contrib/gis/locale/dsb/LC_MESSAGES/django.mo,sha256=YZOA1XJqoU3rI5REairrs9f36Cet75NmC8WXdApx0Mc,2016 -django/contrib/gis/locale/dsb/LC_MESSAGES/django.po,sha256=w36vo0t-HzjhslJLo5xesc1vVfl94sNP3XyyDcETDn0,2177 -django/contrib/gis/locale/el/LC_MESSAGES/django.mo,sha256=g3SeFfO8xTxsvs2jKG9CI99fTnVa-WuBMNG0FFGc0s8,2402 -django/contrib/gis/locale/el/LC_MESSAGES/django.po,sha256=7MATPbwGZGgWabd9BdmUCwxc2iAG2aeac9ltKsieuME,2853 -django/contrib/gis/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/gis/locale/en/LC_MESSAGES/django.po,sha256=lXk5x3FBMnRKocOgqDiya7yKeXZqk9gkibxyADRQjOU,2074 -django/contrib/gis/locale/en_AU/LC_MESSAGES/django.mo,sha256=IPn5kRqOvv5S7jpbIUw8PEUkHlyjEL-4GuOANd1iAzI,486 -django/contrib/gis/locale/en_AU/LC_MESSAGES/django.po,sha256=x_58HmrHRia2LoYhmmN_NLb1J3f7oTDvwumgTo0LowI,1494 -django/contrib/gis/locale/en_GB/LC_MESSAGES/django.mo,sha256=WkORQDOsFuV2bI7hwVsJr_JTWnDQ8ZaK-VYugqnLv3w,1369 -django/contrib/gis/locale/en_GB/LC_MESSAGES/django.po,sha256=KWPMoX-X-gQhb47zoVsa79-16-SiCGpO0s4xkcGv9z0,1910 -django/contrib/gis/locale/eo/LC_MESSAGES/django.mo,sha256=FFSZ58VHOog4-tDy88OISaaLXMaHVuFsIr3uevM-LGc,1878 -django/contrib/gis/locale/eo/LC_MESSAGES/django.po,sha256=oyMvu7r3BKLV9VDYQI6IgjumYusSOgynlSdN3dDrcPo,2156 -django/contrib/gis/locale/es/LC_MESSAGES/django.mo,sha256=JTo6frVHdq3bDY7IwpP5K6Znbb0NXMyVBv-AOQ6gd9s,2005 -django/contrib/gis/locale/es/LC_MESSAGES/django.po,sha256=3xK9yehM6kTSbulhvTenKXmlBeUnfgqM3_a7waiNit4,2465 -django/contrib/gis/locale/es_AR/LC_MESSAGES/django.mo,sha256=Z_2xqsHzQNSQWphm6jV9efFFjzHmkmuk2KfLZXx5E1k,2006 -django/contrib/gis/locale/es_AR/LC_MESSAGES/django.po,sha256=_PHHHfzhzPI5xaZwDH6Rd35KEbj1l1-9IyPLEENaw6E,2161 -django/contrib/gis/locale/es_CO/LC_MESSAGES/django.mo,sha256=mMnOZTrmWutn2Lwv2Y7GuoZIhIbPsMCXJkdmeatXZaM,1817 -django/contrib/gis/locale/es_CO/LC_MESSAGES/django.po,sha256=JF0-_eNt-BPJ__GqNoEj7iKEOV8htZHyX5kZue-PZO4,2349 -django/contrib/gis/locale/es_MX/LC_MESSAGES/django.mo,sha256=bC-uMgJXdbKHQ-w7ez-6vh9E_2YSgCF_LkOQlvb60BU,1441 -django/contrib/gis/locale/es_MX/LC_MESSAGES/django.po,sha256=MYO9fGclp_VvLG5tXDjXY3J_1FXI4lDv23rGElXAyjA,1928 -django/contrib/gis/locale/es_VE/LC_MESSAGES/django.mo,sha256=5YVIO9AOtmjky90DAXVyU0YltfQ4NLEpVYRTTk7SZ5o,486 -django/contrib/gis/locale/es_VE/LC_MESSAGES/django.po,sha256=R8suLsdDnSUEKNlXzow3O6WIT5NcboZoCjir9GfSTSQ,1494 -django/contrib/gis/locale/et/LC_MESSAGES/django.mo,sha256=-Gn24H3qyIcf3ptRe7Iin8sHc6JtkkFsmJF4DI1Wwhs,1872 -django/contrib/gis/locale/et/LC_MESSAGES/django.po,sha256=c-8desC8uDUy9UrX3IicuGICF2xAWPudgAprvS3G7jY,2223 -django/contrib/gis/locale/eu/LC_MESSAGES/django.mo,sha256=c2YYr77DeKdHWhpq6T472Hc1wpzYQ1fgKXELx7GMW_U,1888 -django/contrib/gis/locale/eu/LC_MESSAGES/django.po,sha256=HVR7BSXjUy3pphfPKp2uapaKVnQeb3chQIxcG5bMxHY,2147 -django/contrib/gis/locale/fa/LC_MESSAGES/django.mo,sha256=oSM2n6s-E4eomcHHZT6gY0PrhUFDr7Wijs3Qkr62jX0,2155 -django/contrib/gis/locale/fa/LC_MESSAGES/django.po,sha256=uUaUbYmjFcZ3mp9-FmGVT3zv47n54sWtzaXHWFSpMik,2507 -django/contrib/gis/locale/fi/LC_MESSAGES/django.mo,sha256=A1QOLEk9dFKcxlE2puSLmdDdFWRwGbSKsDGbKemUsCM,1839 -django/contrib/gis/locale/fi/LC_MESSAGES/django.po,sha256=IbtvFNK1bXmck5zZQqXNCDSiuXcGonNl8UcN0BfopFQ,2064 -django/contrib/gis/locale/fr/LC_MESSAGES/django.mo,sha256=LXchLaOY_bGIf25s_rQgWHOvEMD-l8_HAT5WtC0irfs,2058 -django/contrib/gis/locale/fr/LC_MESSAGES/django.po,sha256=FVuGpVTPP2-f4CZKL0UZwLSxy2WiDczw9_q3KRTbclQ,2258 -django/contrib/gis/locale/fy/LC_MESSAGES/django.mo,sha256=2kCnWU_giddm3bAHMgDy0QqNwOb9qOiEyCEaYo1WdqQ,476 -django/contrib/gis/locale/fy/LC_MESSAGES/django.po,sha256=7ncWhxC5OLhXslQYv5unWurhyyu_vRsi4bGflZ6T2oQ,1484 -django/contrib/gis/locale/ga/LC_MESSAGES/django.mo,sha256=5oExwd6zeo9pBXhr1u_su8cllMEOQ-PnkUCkqFcQyYo,1957 -django/contrib/gis/locale/ga/LC_MESSAGES/django.po,sha256=CZngY66ohYP6Xr25Cghym_gW2AKpQlRRdIBYBMej5AY,2193 -django/contrib/gis/locale/gd/LC_MESSAGES/django.mo,sha256=w9d6GRaJMzeRVMzOuapvpPayOQmrFQEwPf8g4TXSatg,2022 -django/contrib/gis/locale/gd/LC_MESSAGES/django.po,sha256=2jXpd-BBQ7JVj2l9tWhIkUXw4ZZPnGJrvHjs442GEx8,2197 -django/contrib/gis/locale/gl/LC_MESSAGES/django.mo,sha256=vjZQqAw3rDSY8Tgv-12EOhsqfFlaEOB7mVBOH6YlXNo,1956 -django/contrib/gis/locale/gl/LC_MESSAGES/django.po,sha256=zhqF1InI8QaKhDLqjfTRUbMPaT9X3D1eI1ocV5FHGf4,2231 -django/contrib/gis/locale/he/LC_MESSAGES/django.mo,sha256=qaxQ0A76SO7GM5WDK0_3pAJDFzkvAtjSV8r1P4ySCVY,2135 -django/contrib/gis/locale/he/LC_MESSAGES/django.po,sha256=f8w5v4W7w47vH6Tq4HfMOX9jB4ab0oEXnpuJcDlk7Ak,2336 -django/contrib/gis/locale/hi/LC_MESSAGES/django.mo,sha256=3nsy5mxKTPtx0EpqBNA_TJXmLmVZ4BPUZG72ZEe8OPM,1818 -django/contrib/gis/locale/hi/LC_MESSAGES/django.po,sha256=jTFG2gqqYAQct9-to0xL2kUFQu-ebR4j7RGfxn4sBAg,2372 -django/contrib/gis/locale/hr/LC_MESSAGES/django.mo,sha256=0XrRj2oriNZxNhEwTryo2zdMf-85-4X7fy7OJhB5ub4,1549 -django/contrib/gis/locale/hr/LC_MESSAGES/django.po,sha256=iijzoBoD_EJ1n-a5ys5CKnjzZzG299zPoCN-REFkeqE,2132 -django/contrib/gis/locale/hsb/LC_MESSAGES/django.mo,sha256=oXaJFKOmRL_hRqAbghejIgZiq67bAnrOV0eFpoqmyW0,1991 -django/contrib/gis/locale/hsb/LC_MESSAGES/django.po,sha256=uktC4ibheBFFZVh0LVtRVUT3RnefGXVOVQddK70hdgg,2155 -django/contrib/gis/locale/hu/LC_MESSAGES/django.mo,sha256=dXlt0Oq_W45B_Foneh2FgpExduFanuG7ia0wKsYCUqs,1891 -django/contrib/gis/locale/hu/LC_MESSAGES/django.po,sha256=Ws1oB2MpVa90a0JNK2LxsZytKBuMMNwLx0DW1sem4Es,2210 -django/contrib/gis/locale/hy/LC_MESSAGES/django.mo,sha256=pi9oAP8fLCg8ssz7ADZ_p9HntyDtdQ1Mep6KsR5Glfs,2020 -django/contrib/gis/locale/hy/LC_MESSAGES/django.po,sha256=FKRbr93M2S4dLWes80CTZ1AucKW8MF5cw98i0s8qZo4,2260 -django/contrib/gis/locale/ia/LC_MESSAGES/django.mo,sha256=gSHcbhwZ2H1amTQbWw908L0aTniLzK8T2RVGsiHuKIY,1812 -django/contrib/gis/locale/ia/LC_MESSAGES/django.po,sha256=IyKoOfc6ZNtvpL8s-r4lv41wlsCyq8CGNoNp7uHWUGE,2122 -django/contrib/gis/locale/id/LC_MESSAGES/django.mo,sha256=dzDiuO47A6XWR3G-OrY-A2c-7ccp1oGLlKPyUO2Wlpg,1862 -django/contrib/gis/locale/id/LC_MESSAGES/django.po,sha256=KZVcWZ_X8x3LO5Z4V-hzSEsvE-BEHIZq5eWJlW1SwZs,2278 -django/contrib/gis/locale/io/LC_MESSAGES/django.mo,sha256=_yUgF2fBUxVAZAPNw2ROyWly5-Bq0niGdNEzo2qbp8k,464 -django/contrib/gis/locale/io/LC_MESSAGES/django.po,sha256=fgGJ1xzliMK0MlVoV9CQn_BuuS3Kl71Kh5YEybGFS0Y,1472 -django/contrib/gis/locale/is/LC_MESSAGES/django.mo,sha256=UQb3H5F1nUxJSrADpLiYe12TgRhYKCFQE5Xy13MzEqU,1350 -django/contrib/gis/locale/is/LC_MESSAGES/django.po,sha256=8QWtgdEZR7OUVXur0mBCeEjbXTBjJmE-DOiKe55FvMo,1934 -django/contrib/gis/locale/it/LC_MESSAGES/django.mo,sha256=8VddOMr-JMs5D-J5mq-UgNnhf98uutpoJYJKTr8E224,1976 -django/contrib/gis/locale/it/LC_MESSAGES/django.po,sha256=Vp1G-GChjjTsODwABsg5LbmR6_Z-KpslwkNUipuOqk4,2365 -django/contrib/gis/locale/ja/LC_MESSAGES/django.mo,sha256=SY1Kxu_gIqusDX5-4SvWmfGi5zG_-jG_98wbkkUyMfk,2052 -django/contrib/gis/locale/ja/LC_MESSAGES/django.po,sha256=tui2WDqNwYHiOkR9j9kl8YSs_kzZ5MTHAj9hniHKI_8,2357 -django/contrib/gis/locale/ka/LC_MESSAGES/django.mo,sha256=iqWQ9j8yanPjDhwi9cNSktYgfLVnofIsdICnAg2Y_to,1991 -django/contrib/gis/locale/ka/LC_MESSAGES/django.po,sha256=rkM7RG0zxDN8vqyAudmk5nocajhOYP6CTkdJKu21Pf4,2571 -django/contrib/gis/locale/kk/LC_MESSAGES/django.mo,sha256=NtgQONp0UncUNvrh0W2R7u7Ja8H33R-a-tsQShWq-QI,1349 -django/contrib/gis/locale/kk/LC_MESSAGES/django.po,sha256=78OMHuerBJZJZVo9GjGJ1h5fwdLuSc_X03ZhSRibtf4,1979 -django/contrib/gis/locale/km/LC_MESSAGES/django.mo,sha256=T0aZIZ_gHqHpQyejnBeX40jdcfhrCOjgKjNm2hLrpNE,459 -django/contrib/gis/locale/km/LC_MESSAGES/django.po,sha256=7ARjFcuPQJG0OGLJu9pVfSiAwc2Q-1tT6xcLeKeom1c,1467 -django/contrib/gis/locale/kn/LC_MESSAGES/django.mo,sha256=EkJRlJJSHZJvNZJuOLpO4IIUEoyi_fpKwNWe0OGFcy4,461 -django/contrib/gis/locale/kn/LC_MESSAGES/django.po,sha256=MnsSftGvmgJgGfgayQUVDMj755z8ItkM9vBehORfYbk,1475 -django/contrib/gis/locale/ko/LC_MESSAGES/django.mo,sha256=TyIytTrPe4GO6lRsK1CW0wIdhbrwDHxlO_29OX6MoH4,1888 -django/contrib/gis/locale/ko/LC_MESSAGES/django.po,sha256=V5OQ0oW3zU8MMdlOJXk-4RQo0UV3cCAhgSMOaQRgttM,2296 -django/contrib/gis/locale/ky/LC_MESSAGES/django.mo,sha256=nvMSOW77P-YCRkQgrQUpM94FexqLEt8Et0jri2nm_Ec,2157 -django/contrib/gis/locale/ky/LC_MESSAGES/django.po,sha256=0qqO8QWgJXPJpZ900MVsHdw6wMZBa0tE5GN3KSGa58E,2372 -django/contrib/gis/locale/lb/LC_MESSAGES/django.mo,sha256=XAyZQUi8jDr47VpSAHp_8nQb0KvSMJHo5THojsToFdk,474 -django/contrib/gis/locale/lb/LC_MESSAGES/django.po,sha256=5rfudPpH4snSq2iVm9E81EBwM0S2vbkY2WBGhpuga1Q,1482 -django/contrib/gis/locale/lt/LC_MESSAGES/django.mo,sha256=AD69M-SBrmQ5qaFKXX6FYOOXLfhuWlQdOYcMlV0UClo,2036 -django/contrib/gis/locale/lt/LC_MESSAGES/django.po,sha256=1yXUj9Hf4D2iyl97HoRuJLkfnR7Z-WmOoIJil98Cy-M,2366 -django/contrib/gis/locale/lv/LC_MESSAGES/django.mo,sha256=ZNt2B2qukArT3gRZE2SNsKna5pf9-UcsTUbQ3UbbQKA,1978 -django/contrib/gis/locale/lv/LC_MESSAGES/django.po,sha256=CM5WUeTmm4pp5Y4E1Cm3aCwGmTHNSyjSU3B44dRYdHA,2215 -django/contrib/gis/locale/mk/LC_MESSAGES/django.mo,sha256=fLSXxmJFE9kYsKMiwWAXS-9TweB_yuWzAjR-y0eysvI,2518 -django/contrib/gis/locale/mk/LC_MESSAGES/django.po,sha256=P2IKvpaMOj5UvJX_Lz-PE0-1D7Kt_fYM5Amm3d5g6t4,2918 -django/contrib/gis/locale/ml/LC_MESSAGES/django.mo,sha256=Kl9okrE3AzTPa5WQ-IGxYVNSRo2y_VEdgDcOyJ_Je78,2049 -django/contrib/gis/locale/ml/LC_MESSAGES/django.po,sha256=PWg8atPKfOsnVxg_uro8zYO9KCE1UVhfy_zmCWG0Bdk,2603 -django/contrib/gis/locale/mn/LC_MESSAGES/django.mo,sha256=DlGtHJJMKLVntNdaPBXZw9ApM_SjUYEYAgE9DpZv33w,2323 -django/contrib/gis/locale/mn/LC_MESSAGES/django.po,sha256=z9E7N3TXiMCd2FCunpMjS55-uamM_G4iQpI1MoTDSVY,2766 -django/contrib/gis/locale/mr/LC_MESSAGES/django.mo,sha256=3be2jV7c3MBww-fNMk8A9l9hWDwR4pgSmfztJj6cio0,510 -django/contrib/gis/locale/mr/LC_MESSAGES/django.po,sha256=dKaMdzicJqGwxA5VF1GeM3wGUQOtsnWCeHoGGcjFy-o,1530 -django/contrib/gis/locale/ms/LC_MESSAGES/django.mo,sha256=5_xS-XXVyw0cxvDzUIus5JImr0dkcswait04e7TrUtY,1828 -django/contrib/gis/locale/ms/LC_MESSAGES/django.po,sha256=I8rMkUEfsbjf-dWUuXyhYwCXhyX8AS3jjOKinAh7q2Q,1956 -django/contrib/gis/locale/my/LC_MESSAGES/django.mo,sha256=e6G8VbCCthUjV6tV6PRCy_ZzsXyZ-1OYjbYZIEShbXI,525 -django/contrib/gis/locale/my/LC_MESSAGES/django.po,sha256=R3v1S-904f8FWSVGHe822sWrOJI6cNJIk93-K7_E_1c,1580 -django/contrib/gis/locale/nb/LC_MESSAGES/django.mo,sha256=mx9uGqo5w_uRBWHswuEKoI-U-RX_Xvx_qck5ForI63Y,1808 -django/contrib/gis/locale/nb/LC_MESSAGES/django.po,sha256=LVjQsJxXdDBuKS5D7BEJ10C9OE8x3g0f9ewgjoG6fbY,2039 -django/contrib/gis/locale/ne/LC_MESSAGES/django.mo,sha256=nB-Ta8w57S6hIAhAdWZjDT0Dg6JYGbAt5FofIhJT7k8,982 -django/contrib/gis/locale/ne/LC_MESSAGES/django.po,sha256=eMH6uKZZZYn-P3kmHumiO4z9M4923s9tWGhHuJ0eWuI,1825 -django/contrib/gis/locale/nl/LC_MESSAGES/django.mo,sha256=ScPsjM7aMa8PwcbxliFgqfS7_WyOuTGmODGAZY85UM4,1897 -django/contrib/gis/locale/nl/LC_MESSAGES/django.po,sha256=zoUzuPhO4XGlrhmRluXNRMpjD7lEIjAW8TufBqAOO4o,2408 -django/contrib/gis/locale/nn/LC_MESSAGES/django.mo,sha256=P1RU0OICBDeHHtX6rCSB4xXgS4Qn97LqoxJ8phgiMDs,1830 -django/contrib/gis/locale/nn/LC_MESSAGES/django.po,sha256=-mkHmKp3b76uZlFOG3lFLp2nEFtBRV_4ThDPQmUWtX4,2027 -django/contrib/gis/locale/os/LC_MESSAGES/django.mo,sha256=02NpGC8WPjxmPqQkfv9Kj2JbtECdQCtgecf_Tjk1CZc,1594 -django/contrib/gis/locale/os/LC_MESSAGES/django.po,sha256=JBIsv5nJg3Wof7Xy7odCI_xKRBLN_Hlbb__kNqNW4Xw,2161 -django/contrib/gis/locale/pa/LC_MESSAGES/django.mo,sha256=JR1NxG5_h_dFE_7p6trBWWIx-QqWYIgfGomnjaCsWAA,1265 -django/contrib/gis/locale/pa/LC_MESSAGES/django.po,sha256=Ejd_8dq_M0E9XFijk0qj4oC-8_oe48GWWHXhvOrFlnY,1993 -django/contrib/gis/locale/pl/LC_MESSAGES/django.mo,sha256=KHar168QJ7Mj0419885rkyRXvWXkICAi0hUbb8KssY8,2045 -django/contrib/gis/locale/pl/LC_MESSAGES/django.po,sha256=cfeYjcF9R8VKujBMGLx_1z9zDY19DPCjUw5FpHuBIqs,2487 -django/contrib/gis/locale/pt/LC_MESSAGES/django.mo,sha256=BQ2wNaNglNZdY8O-YPpebJ4LJcGfTVhiKKOGkES0Bt0,1902 -django/contrib/gis/locale/pt/LC_MESSAGES/django.po,sha256=r8TnedUuMn_-wRFOt3jCa9WQ5dz2eGt4Y8DZx2aRQ6o,2451 -django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.mo,sha256=5HGIao480s3B6kXtSmdy1AYjGUZqbYuZ9Eapho_jkTk,1976 -django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.po,sha256=4-2WPZT15YZPyYbH7xnBRc7A8675875kVFjM9tr1o5U,2333 -django/contrib/gis/locale/ro/LC_MESSAGES/django.mo,sha256=jncf415WRI-GaemNGtbXITeYpx2zbokFNfQkONIOSO4,1770 -django/contrib/gis/locale/ro/LC_MESSAGES/django.po,sha256=5Xb2c11mwOdsd1D8SZC5u6nsuNjWEtdT1hslrQBfxP0,2181 -django/contrib/gis/locale/ru/LC_MESSAGES/django.mo,sha256=j9DEE5SVvEXWBj_PtR9_1IsaE-YCq4iOBcaiyHHqOEo,2481 -django/contrib/gis/locale/ru/LC_MESSAGES/django.po,sha256=fgj-PmNJ88IsjUUq7x9W6KSwXWdmnEq1PBlWsLFhzwE,2835 -django/contrib/gis/locale/sk/LC_MESSAGES/django.mo,sha256=FQy4gMIxrXNm42pvJ61q4ZfG0Ce98gv78b2I0vYN2CY,1980 -django/contrib/gis/locale/sk/LC_MESSAGES/django.po,sha256=z7uy3S2VXGZKMfgFLISYUPUb-zyEYXqlDgL_ODmb_4w,2315 -django/contrib/gis/locale/sl/LC_MESSAGES/django.mo,sha256=Ha88TShV2Bt_Jmvlkkc81CUkuV2iKfhGjzpD7KLMhv8,1972 -django/contrib/gis/locale/sl/LC_MESSAGES/django.po,sha256=B81yHSMjOYevk35kC4JEi4Ua3axjadkFW8aRuMnj6P0,2319 -django/contrib/gis/locale/sq/LC_MESSAGES/django.mo,sha256=XPieM0pMyhrgOs-c3shBBiEfFLCrN__Kumyb7PK25-c,1835 -django/contrib/gis/locale/sq/LC_MESSAGES/django.po,sha256=l06nidL-0TDjjesqW-Q_dxMBQOfGRSyCj-fdhBURFs4,2172 -django/contrib/gis/locale/sr/LC_MESSAGES/django.mo,sha256=bM996RqI1wt4qHsUaGXoEO3fnaSZdjVD2TvUFDp5dVk,2365 -django/contrib/gis/locale/sr/LC_MESSAGES/django.po,sha256=hunakYgljjOiiYF98ZzFzIHTkIAGQM_IJLiLfmlR86Q,2628 -django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=kniIObavM7XKqD5vcglrbcD8jqANKg7hN6AP4cIVAI0,1981 -django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.po,sha256=A2NsZJvk2Cckg8OS3yW_T11Tcv5-zgGEHcDRJpvE8Zg,2206 -django/contrib/gis/locale/sv/LC_MESSAGES/django.mo,sha256=CowUAoL4t4np5cBndBNM-a4Wu5oD899nVfifMOLz6xQ,1880 -django/contrib/gis/locale/sv/LC_MESSAGES/django.po,sha256=Xyzc8X3vwQ3wWfS4_5mpwFXPPAeCx4mODYFq3Kba04g,2252 -django/contrib/gis/locale/sw/LC_MESSAGES/django.mo,sha256=uBhpGHluGwYpODTE-xhdJD2e6PHleN07wLE-kjrXr_M,1426 -django/contrib/gis/locale/sw/LC_MESSAGES/django.po,sha256=nHXQQMYYXT1ec3lIBxQIDIAwLtXucX47M4Cozy08kko,1889 -django/contrib/gis/locale/ta/LC_MESSAGES/django.mo,sha256=Rboo36cGKwTebe_MiW4bOiMsRO2isB0EAyJJcoy_F6s,466 -django/contrib/gis/locale/ta/LC_MESSAGES/django.po,sha256=sLYW8_5BSVoSLWUr13BbKRe0hNJ_cBMEtmjCPBdTlAk,1474 -django/contrib/gis/locale/te/LC_MESSAGES/django.mo,sha256=xDkaSztnzQ33Oc-GxHoSuutSIwK9A5Bg3qXEdEvo4h4,824 -django/contrib/gis/locale/te/LC_MESSAGES/django.po,sha256=nYryhktJumcwtZDGZ43xBxWljvdd-cUeBrAYFZOryVg,1772 -django/contrib/gis/locale/tg/LC_MESSAGES/django.mo,sha256=6Jyeaq1ORsnE7Ceh_rrhbfslFskGe12Ar-dQl6NFyt0,611 -django/contrib/gis/locale/tg/LC_MESSAGES/django.po,sha256=9c1zPt7kz1OaRJPPLdqjQqO8MT99KtS9prUvoPa9qJk,1635 -django/contrib/gis/locale/th/LC_MESSAGES/django.mo,sha256=0kekAr7eXc_papwPAxEZ3TxHOBg6EPzdR3q4hmAxOjg,1835 -django/contrib/gis/locale/th/LC_MESSAGES/django.po,sha256=WJPdoZjLfvepGGMhfBB1EHCpxtxxfv80lRjPG9kGErM,2433 -django/contrib/gis/locale/tr/LC_MESSAGES/django.mo,sha256=5EKMteFT0WXGacwXnRt5Eak00kbtYmqskkuCg2rGvyc,1904 -django/contrib/gis/locale/tr/LC_MESSAGES/django.po,sha256=DSIty_3V3G_Pv498EU3H60-5jS0b1S5tPwR_fkwpq98,2180 -django/contrib/gis/locale/tt/LC_MESSAGES/django.mo,sha256=cGVPrWCe4WquVV77CacaJwgLSnJN0oEAepTzNMD-OWk,1470 -django/contrib/gis/locale/tt/LC_MESSAGES/django.po,sha256=98yeRs-JcMGTyizOpEuQenlnWJMYTR1-rG3HGhKCykk,2072 -django/contrib/gis/locale/udm/LC_MESSAGES/django.mo,sha256=I6bfLvRfMn79DO6bVIGfYSVeZY54N6c8BNO7OyyOOsw,462 -django/contrib/gis/locale/udm/LC_MESSAGES/django.po,sha256=B1PCuPYtNOrrhu4fKKJgkqxUrcEyifS2Y3kw-iTmSIk,1470 -django/contrib/gis/locale/ug/LC_MESSAGES/django.mo,sha256=cKr7ETLbYR1nMm2iJsQwZYKz8U5aP2CX5RdhbKW2gh4,2360 -django/contrib/gis/locale/ug/LC_MESSAGES/django.po,sha256=d1P7kH2ETJ9n34d9ALE0tHWw_1_fq7fuiLBNK2IlM10,2529 -django/contrib/gis/locale/uk/LC_MESSAGES/django.mo,sha256=jsJMgEt6VXoSjksQGngxaywARUsk5tiIKJfUw9kgEBw,2513 -django/contrib/gis/locale/uk/LC_MESSAGES/django.po,sha256=NNAUWdHmhsWtrPIgddjT03k4IeJUlUCYM7n78DisFQw,3015 -django/contrib/gis/locale/ur/LC_MESSAGES/django.mo,sha256=tB5tz7EscuE9IksBofNuyFjk89-h5X7sJhCKlIho5SY,1410 -django/contrib/gis/locale/ur/LC_MESSAGES/django.po,sha256=16m0t10Syv76UcI7y-EXfQHETePmrWX4QMVfyeuX1fQ,2007 -django/contrib/gis/locale/vi/LC_MESSAGES/django.mo,sha256=NT5T0FRCC2XINdtaCFCVUxb5VRv8ta62nE8wwSHGTrc,1384 -django/contrib/gis/locale/vi/LC_MESSAGES/django.po,sha256=y77GtqH5bv1wR78xN5JLHusmQzoENTH9kLf9Y3xz5xk,1957 -django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=NvNiRwwuqrmOWqiiuYhoxTs3CXb9Zq0-R_2YVhY6n34,1760 -django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.po,sha256=jXKQKr3GOjL5LJ7Mv1O3zpn2hr_sA_31ote8Pzk9tOU,2232 -django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=jbNgO-5ICEWlqu5BaaKrPQ5XIC1CDzpYbbXA6_Xo-D0,1811 -django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.po,sha256=h72hJ3socDnGCoPHREClni4DxDS0B-n-8EGAADlnmK4,2139 -django/contrib/gis/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/management/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/management/commands/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/management/commands/__pycache__/inspectdb.cpython-310.pyc,, -django/contrib/gis/management/commands/__pycache__/ogrinspect.cpython-310.pyc,, -django/contrib/gis/management/commands/inspectdb.py,sha256=8WhDOBICFAbLFu7kwAAS4I5pNs_p1BrCv8GJYI3S49k,760 -django/contrib/gis/management/commands/ogrinspect.py,sha256=XnWAbLxRxTSvbKSvjgePN7D1o_Ep4qWkvMwVrG1TpYY,6071 -django/contrib/gis/measure.py,sha256=3Kwchst6tJFwK9tMQb5oD6_eUVNnSMyKruOEDuxT7Rc,12573 -django/contrib/gis/ptr.py,sha256=NeIBB-plwO61wGOOxGg7fFyVXI4a5vbAGUdaJ_Fmjqo,1312 -django/contrib/gis/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/serializers/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/serializers/__pycache__/geojson.cpython-310.pyc,, -django/contrib/gis/serializers/geojson.py,sha256=YS0GTom8Y7TI4DsORKqpm4X080pyO2-XBnO4FXdZTvE,2876 -django/contrib/gis/shortcuts.py,sha256=aa9zFjVU38qaEvRc0vAH_j2AgAERlI01rphYLHbc7Tg,1027 -django/contrib/gis/sitemaps/__init__.py,sha256=Tjj057omOVcoC5Fb8ITEYVhLm0HcVjrZ1Mbz_tKoD1A,138 -django/contrib/gis/sitemaps/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/sitemaps/__pycache__/kml.cpython-310.pyc,, -django/contrib/gis/sitemaps/__pycache__/views.cpython-310.pyc,, -django/contrib/gis/sitemaps/kml.py,sha256=CUn_KKVrwGg2ZmmDcWosBc0QFuJp8hHpeNRCcloVk1U,2573 -django/contrib/gis/sitemaps/views.py,sha256=AFV1ay-oFftFC-IszzeKz3JAGzE0TOCH8pN1cwtg7yI,2353 -django/contrib/gis/static/gis/css/ol3.css,sha256=DmCfOuPC1wUs0kioWxIpSausvF6AYUlURbJLNGyvngA,773 -django/contrib/gis/static/gis/img/draw_line_off.svg,sha256=6XW83xsR5-Guh27UH3y5UFn9y9FB9T_Zc4kSPA-xSOI,918 -django/contrib/gis/static/gis/img/draw_line_on.svg,sha256=Hx-pXu4ped11esG6YjXP1GfZC5q84zrFQDPUo1C7FGA,892 -django/contrib/gis/static/gis/img/draw_point_off.svg,sha256=PICrywZPwuBkaQAKxR9nBJ0AlfTzPHtVn_up_rSiHH4,803 -django/contrib/gis/static/gis/img/draw_point_on.svg,sha256=raGk3oc8w87rJfLdtZ4nIXJyU3OChCcTd4oH-XAMmmM,803 -django/contrib/gis/static/gis/img/draw_polygon_off.svg,sha256=gnVmjeZE2jOvjfyx7mhazMDBXJ6KtSDrV9f0nSzkv3A,981 -django/contrib/gis/static/gis/img/draw_polygon_on.svg,sha256=ybJ9Ww7-bsojKQJtjErLd2cCOgrIzyqgIR9QNhH_ZfA,982 -django/contrib/gis/static/gis/js/OLMapWidget.js,sha256=JdZJtX4EP_pphsjxs7EnZdfHGM1s5Zsn1MQ38JDU0JQ,9019 -django/contrib/gis/templates/gis/kml/base.kml,sha256=VYnJaGgFVHRzDjiFjbcgI-jxlUos4B4Z1hx_JeI2ZXU,219 -django/contrib/gis/templates/gis/kml/placemarks.kml,sha256=TEC81sDL9RK2FVeH0aFJTwIzs6_YWcMeGnHkACJV1Uc,360 -django/contrib/gis/templates/gis/openlayers-osm.html,sha256=TeiUqCjt73W8Hgrp_6zAtk_ZMBxskNN6KHSmnJ1-GD4,378 -django/contrib/gis/templates/gis/openlayers.html,sha256=J9e_MAMgfMR8NFH9bhQ_ZDIsjKCiCfRRp0__bKK6TK4,1418 -django/contrib/gis/utils/__init__.py,sha256=GXqrxwX_3jnbhdt9DX2chGJdeoLFBGwr8GzkJBU-RFQ,682 -django/contrib/gis/utils/__pycache__/__init__.cpython-310.pyc,, -django/contrib/gis/utils/__pycache__/layermapping.cpython-310.pyc,, -django/contrib/gis/utils/__pycache__/ogrinfo.cpython-310.pyc,, -django/contrib/gis/utils/__pycache__/ogrinspect.cpython-310.pyc,, -django/contrib/gis/utils/__pycache__/srs.cpython-310.pyc,, -django/contrib/gis/utils/layermapping.py,sha256=HTHrMmWVnp5Sxs95pq_j7kyFUGNKrEbsJWzD3etYdGc,29039 -django/contrib/gis/utils/ogrinfo.py,sha256=6m3KaRzLoZtQ0OSrpRkaFIQXi9YOXTkQcYeqYb0S0nw,1956 -django/contrib/gis/utils/ogrinspect.py,sha256=f31eRqR5ybC-QR2mOjNWszYDANCWdEEgyqeIcvBAC4g,9170 -django/contrib/gis/utils/srs.py,sha256=UXsbxW0cQzdnPKO0d9E5K2HPdekdab5NaLZWNOUq-zk,2962 -django/contrib/gis/views.py,sha256=zdCV8QfUVfxEFGxESsUtCicsbSVtZNI_IXybdmsHKiM,714 -django/contrib/humanize/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/humanize/__pycache__/__init__.cpython-310.pyc,, -django/contrib/humanize/__pycache__/apps.cpython-310.pyc,, -django/contrib/humanize/apps.py,sha256=LH3PTbB4V1gbBc8nmCw3BsSuA8La0fNOb4cSISvJAwI,194 -django/contrib/humanize/locale/af/LC_MESSAGES/django.mo,sha256=yFvTzvROTnoZF4ZPAs3z9ireOuOf5gTfECEUdGa4EkM,4224 -django/contrib/humanize/locale/af/LC_MESSAGES/django.po,sha256=m8GF4T4HY4aGsfadUdu04yc7cq9Sm-K5LM-OFjTrq5Y,7541 -django/contrib/humanize/locale/ar/LC_MESSAGES/django.mo,sha256=PokPfBR8w4AbRtNNabl5vO8r5E8_egHvFBjKp4CCvO4,7510 -django/contrib/humanize/locale/ar/LC_MESSAGES/django.po,sha256=QGW-kx-87DlPMGr5l_Eb6Ge-x4tkz2PuwHDe3EIkIQg,12326 -django/contrib/humanize/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=NwCrL5FX_xdxYdqkW_S8tmU8ktDM8LqimmUvkt8me74,9155 -django/contrib/humanize/locale/ar_DZ/LC_MESSAGES/django.po,sha256=tt0AxhohGX79OQ_lX1S5soIo-iSCC07SdAhPpy0O7Q4,15234 -django/contrib/humanize/locale/ast/LC_MESSAGES/django.mo,sha256=WvBk8V6g1vgzGqZ_rR-4p7SMh43PFnDnRhIS9HSwdoQ,3468 -django/contrib/humanize/locale/ast/LC_MESSAGES/django.po,sha256=S9lcUf2y5wR8Ufa-Rlz-M73Z3bMo7zji_63cXwtDK2I,5762 -django/contrib/humanize/locale/az/LC_MESSAGES/django.mo,sha256=ukqeNWHDFXv3XhvfpX8ZU6sb-CrUIx_ks_gwNNWfiFw,4311 -django/contrib/humanize/locale/az/LC_MESSAGES/django.po,sha256=RLGjARRoX9wwBS8Y4EBiC_0iWig93qKaWel4sLOqLhM,7765 -django/contrib/humanize/locale/be/LC_MESSAGES/django.mo,sha256=7KyJKhNqMqv32CPdJi01RPLBefOVCQW-Gx6-Vf9JVrs,6653 -django/contrib/humanize/locale/be/LC_MESSAGES/django.po,sha256=2mbReEHyXhmZysqhSmaT6A2XCHn8mYb2R_O16TMGCAo,10666 -django/contrib/humanize/locale/bg/LC_MESSAGES/django.mo,sha256=jCdDIbqWlhOs-4gML44wSRIXJQxypfak6ByRG_reMsk,4823 -django/contrib/humanize/locale/bg/LC_MESSAGES/django.po,sha256=v2ih4-pL1cdDXaa3uXm9FxRjRKyULLGyz78Q91eKEG8,8267 -django/contrib/humanize/locale/bn/LC_MESSAGES/django.mo,sha256=jbL4ucZxxtexI10jgldtgnDie3I23XR3u-PrMMMqP6U,4026 -django/contrib/humanize/locale/bn/LC_MESSAGES/django.po,sha256=0l4yyy7q3OIWyFk_PW0y883Vw2Pmu48UcnLM9OBxB68,6545 -django/contrib/humanize/locale/br/LC_MESSAGES/django.mo,sha256=V_tPVAyQzVdDwWPNlVGWmlVJjmVZfbh35alkwsFlCNU,5850 -django/contrib/humanize/locale/br/LC_MESSAGES/django.po,sha256=BcAqEV2JpF0hiCQDttIMblp9xbB7zoHsmj7fJFV632k,12245 -django/contrib/humanize/locale/bs/LC_MESSAGES/django.mo,sha256=1-RNRHPgZR_9UyiEn9Djp4mggP3fywKZho45E1nGMjM,1416 -django/contrib/humanize/locale/bs/LC_MESSAGES/django.po,sha256=M017Iu3hyXmINZkhCmn2he-FB8rQ7rXN0KRkWgrp7LI,5498 -django/contrib/humanize/locale/ca/LC_MESSAGES/django.mo,sha256=WDvXis2Y1ivSq6NdJgddO_WKbz8w5MpVpkT4sq-pWXI,4270 -django/contrib/humanize/locale/ca/LC_MESSAGES/django.po,sha256=AD3h2guGADdp1f9EcbP1vc1lmfDOL8-1qQfwvXa6I04,7731 -django/contrib/humanize/locale/ckb/LC_MESSAGES/django.mo,sha256=Mqv3kRZrOjWtTstmtOEqIJsi3vevf_hZUfYEetGxO7w,5021 -django/contrib/humanize/locale/ckb/LC_MESSAGES/django.po,sha256=q_7p7pEyV_NTw9eBvcztKlSFW7ykl0CIsNnA9g5oy20,8317 -django/contrib/humanize/locale/cs/LC_MESSAGES/django.mo,sha256=VFyZcn19aQUXhVyh2zo2g3PAuzOO38Kx9fMFOCCxzMc,5479 -django/contrib/humanize/locale/cs/LC_MESSAGES/django.po,sha256=mq3LagwA9hyWOGy76M9n_rD4p3wuVk6oQsneB9CF99w,9527 -django/contrib/humanize/locale/cy/LC_MESSAGES/django.mo,sha256=VjJiaUUhvX9tjOEe6x2Bdp7scvZirVcUsA4-iE2-ElQ,5241 -django/contrib/humanize/locale/cy/LC_MESSAGES/django.po,sha256=sylmceSq-NPvtr_FjklQXoBAfueKu7hrjEpMAsVbQC4,7813 -django/contrib/humanize/locale/da/LC_MESSAGES/django.mo,sha256=vfDHopmWFAomwqmmCX3wfmX870-zzVbgUFC6I77n9tE,4316 -django/contrib/humanize/locale/da/LC_MESSAGES/django.po,sha256=v7Al6UOkbYB1p7m8kOe-pPRIAoyWemoyg_Pm9bD5Ldc,7762 -django/contrib/humanize/locale/de/LC_MESSAGES/django.mo,sha256=aOUax9csInbXnjAJc3jq4dcW_9H-6ueVI-TtKz2b9q0,4364 -django/contrib/humanize/locale/de/LC_MESSAGES/django.po,sha256=gW3OfOfoVMvpVudwghKCYztkLrCIPbbcriZjBNnRyGo,7753 -django/contrib/humanize/locale/dsb/LC_MESSAGES/django.mo,sha256=OVKcuW9ZXosNvP_3A98WsIIk_Jl6U_kv3zOx4pvwh-g,5588 -django/contrib/humanize/locale/dsb/LC_MESSAGES/django.po,sha256=VimcsmobK3VXTbbTasg6osWDPOIZ555uimbUoUfNco4,9557 -django/contrib/humanize/locale/el/LC_MESSAGES/django.mo,sha256=o-yjhpzyGRbbdMzwUcG_dBP_FMEMZevm7Wz1p4Wd-pg,6740 -django/contrib/humanize/locale/el/LC_MESSAGES/django.po,sha256=UbD5QEw_-JNoNETaOyDfSReirkRsHnlHeSsZF5hOSkI,10658 -django/contrib/humanize/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/humanize/locale/en/LC_MESSAGES/django.po,sha256=PKUuSyK8VzVdyyCpOXAffSBK7mFSiGuumzMmttS5yfM,9057 -django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.mo,sha256=QFf4EgAsGprbFetnwogmj8vDV7SfGq1E3vhL9D8xTTM,918 -django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.po,sha256=Bnfesr1_T9sa31qkKOMunwKKXbnFzZJhzV8rYC_pdSE,6532 -django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.mo,sha256=mkx192XQM3tt1xYG8EOacMfa-BvgzYCbSsJQsWZGeAo,3461 -django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.po,sha256=MArKzXxY1104jxaq3kvDZs2WzOGYxicfJxFKsLzFavw,5801 -django/contrib/humanize/locale/eo/LC_MESSAGES/django.mo,sha256=b47HphXBi0cax_reCZiD3xIedavRHcH2iRG8pcwqb54,5386 -django/contrib/humanize/locale/eo/LC_MESSAGES/django.po,sha256=oN1YqOZgxKY3L1a1liluhM6X5YA5bawg91mHF_Vfqx8,9095 -django/contrib/humanize/locale/es/LC_MESSAGES/django.mo,sha256=z5ZCmAG4jGYleEE6pESMXihlESRQPkTEo2vIedXdjjI,5005 -django/contrib/humanize/locale/es/LC_MESSAGES/django.po,sha256=WwykwsBM_Q_xtA2vllIbcFSO7eUB72r56AG4ITwM5VM,8959 -django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.mo,sha256=-btiXH3B5M1qkAsW9D5I742Gt9GcJs5VC8ZhJ_DKkGY,4425 -django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.po,sha256=UsiuRj-eq-Vl41wNZGw9XijCMEmcXhcGrMTPWgZn4LA,7858 -django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.mo,sha256=2GhQNtNOjK5mTov5RvnuJFTYbdoGBkDGLxzvJ8Vsrfs,4203 -django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.po,sha256=JBf2fHO8jWi6dFdgZhstKXwyot_qT3iJBixQZc3l330,6326 -django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.mo,sha256=82DL2ztdq10X5RIceshK1nO99DW5628ZIjaN8Xzp9ok,3939 -django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.po,sha256=-O7AQluA5Kce9-bd04GN4tfQKoCxb8Sa7EZR6TZBCdM,6032 -django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.mo,sha256=cJECzKpD99RRIpVFKQW65x0Nvpzrm5Fuhfi-nxOWmkM,942 -django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.po,sha256=tDdYtvRILgeDMgZqKHSebe7Z5ZgI1bZhDdvGVtj_anM,4832 -django/contrib/humanize/locale/et/LC_MESSAGES/django.mo,sha256=_vLDxD-e-pBY7vs6gNkhFZNGYu_dAeETVMKGsjjWOHg,4406 -django/contrib/humanize/locale/et/LC_MESSAGES/django.po,sha256=u0tSkVYckwXUv1tVfe1ODdZ8tJ2wUkS0Vv8pakJ8eBM,7915 -django/contrib/humanize/locale/eu/LC_MESSAGES/django.mo,sha256=rz3Lz209GneozN4v_19qTGysOL55x7jK2uoB2YsKSMQ,4315 -django/contrib/humanize/locale/eu/LC_MESSAGES/django.po,sha256=lWOx7rpaj2U7czrZmdxVo3kB2aGt-2GDyWO0NLvP-A0,7760 -django/contrib/humanize/locale/fa/LC_MESSAGES/django.mo,sha256=N32l1DsPALoSGe9GtJ5baIo0XUDm8U09JhcHr0lXtw4,4656 -django/contrib/humanize/locale/fa/LC_MESSAGES/django.po,sha256=YsYRnmvABepSAOgEj6dRvdY_jYZqJb0_dbQ_6daiJAQ,8228 -django/contrib/humanize/locale/fi/LC_MESSAGES/django.mo,sha256=FJfyLFkz-oAz9e15e1aQUct7CJ2EJqSkZKh_ztDxtic,4425 -django/contrib/humanize/locale/fi/LC_MESSAGES/django.po,sha256=j5Z5t9zX1kePdM_Es1hu9AKOpOrijVWTsS2t19CIiaE,7807 -django/contrib/humanize/locale/fr/LC_MESSAGES/django.mo,sha256=pHHD7DV36bC86CKXWUpWUp3NtKuqWu9_YXU04sE6ib4,5125 -django/contrib/humanize/locale/fr/LC_MESSAGES/django.po,sha256=SyN1vUt8zDG-iSTDR4OH1B_CbvKMM2YaMJ2_s-FEyog,8812 -django/contrib/humanize/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/humanize/locale/fy/LC_MESSAGES/django.po,sha256=pPvcGgBWiZwQ5yh30OlYs-YZUd_XsFro71T9wErVv0M,4732 -django/contrib/humanize/locale/ga/LC_MESSAGES/django.mo,sha256=8V-8BJdubpBPT_AMHHdifgPangJw_TY3WtSQxaGNCGw,6346 -django/contrib/humanize/locale/ga/LC_MESSAGES/django.po,sha256=Y_6wRPWasABq-6B3WjzEObSk860fExiQ_OVbh8i1j44,10784 -django/contrib/humanize/locale/gd/LC_MESSAGES/django.mo,sha256=wHsBVluXm4DW7iWxGHMHexqG9ovXEvgcaXvsmvkNHSE,5838 -django/contrib/humanize/locale/gd/LC_MESSAGES/django.po,sha256=CmmpKK7me-Ujitgx2IVkOcJyZOvie6XEBS7wCY4xZQ0,9802 -django/contrib/humanize/locale/gl/LC_MESSAGES/django.mo,sha256=LbJABG0-USW2C5CQro6WcPlPwT7I1BfuKGi_VFNhJIU,4345 -django/contrib/humanize/locale/gl/LC_MESSAGES/django.po,sha256=caidyTAFJ5iZ-tpEp0bflpUx0xlaH2jIYmPKxCVzlGE,7772 -django/contrib/humanize/locale/he/LC_MESSAGES/django.mo,sha256=phFZMDohKT86DUtiAlnZslPFwSmpcpxTgZaXb8pGohc,5875 -django/contrib/humanize/locale/he/LC_MESSAGES/django.po,sha256=xhEZYcK-fg_mHMyGCEZXEwbd6FvutaGvkDyHTET-sic,9970 -django/contrib/humanize/locale/hi/LC_MESSAGES/django.mo,sha256=qrzm-6vXIUsxA7nOxa-210-6iO-3BPBj67vKfhTOPrY,4131 -django/contrib/humanize/locale/hi/LC_MESSAGES/django.po,sha256=BrypbKaQGOyY_Gl1-aHXiBVlRqrbSjGfZ2OK8omj_9M,6527 -django/contrib/humanize/locale/hr/LC_MESSAGES/django.mo,sha256=29XTvFJHex31hbu2qsOfl5kOusz-zls9eqlxtvw_H0s,1274 -django/contrib/humanize/locale/hr/LC_MESSAGES/django.po,sha256=OuEH4fJE6Fk-s0BMqoxxdlUAtndvvKK7N8Iy-9BP3qA,5424 -django/contrib/humanize/locale/hsb/LC_MESSAGES/django.mo,sha256=a1DqdiuRfFSfSrD8IvzQmZdzE0dhkxDChFddrmt3fjA,5679 -django/contrib/humanize/locale/hsb/LC_MESSAGES/django.po,sha256=V5aRblcqKii4RXSQO87lyoQwwvxL59T3m4-KOBTx4bc,9648 -django/contrib/humanize/locale/hu/LC_MESSAGES/django.mo,sha256=7ZMxGa5FaUdjRtbawYzwwhWIroON8NNXknQ3frKUabw,4313 -django/contrib/humanize/locale/hu/LC_MESSAGES/django.po,sha256=5yWfXwvJQQuDoENkiytuKXFjsNW-lS2-EFThVnYWHbI,7672 -django/contrib/humanize/locale/hy/LC_MESSAGES/django.mo,sha256=YN4XSM-NGXNJb2R0SMwC8Zk6r7F6LOfFvRgvc4fUNCM,3810 -django/contrib/humanize/locale/hy/LC_MESSAGES/django.po,sha256=JZZibNtKEOepsf5xf495lmCBk8jji5RUJETZlQpxrMo,7597 -django/contrib/humanize/locale/ia/LC_MESSAGES/django.mo,sha256=d0m-FddFnKp08fQYQSC9Wr6M4THVU7ibt3zkIpx_Y_A,4167 -django/contrib/humanize/locale/ia/LC_MESSAGES/django.po,sha256=qX6fAZyn54hmtTU62oJcHF8p4QcYnoO2ZNczVjvjOeE,6067 -django/contrib/humanize/locale/id/LC_MESSAGES/django.mo,sha256=AdUmhfkQOV9Le4jXQyQSyd5f2GqwNt-oqnJV-WVELVw,3885 -django/contrib/humanize/locale/id/LC_MESSAGES/django.po,sha256=lMnTtM27j1EWg1i9d7NzAeueo7mRztGVfNOXtXdZVjw,7021 -django/contrib/humanize/locale/io/LC_MESSAGES/django.mo,sha256=nMu5JhIy8Fjie0g5bT8-h42YElCiS00b4h8ej_Ie-w0,464 -django/contrib/humanize/locale/io/LC_MESSAGES/django.po,sha256=RUs8JkpT0toKOLwdv1oCbcBP298EOk02dkdNSJiC-_A,4720 -django/contrib/humanize/locale/is/LC_MESSAGES/django.mo,sha256=D6ElUYj8rODRsZwlJlH0QyBSM44sVmuBCNoEkwPVxko,3805 -django/contrib/humanize/locale/is/LC_MESSAGES/django.po,sha256=1VddvtkhsK_5wmpYIqEFqFOo-NxIBnL9wwW74Tw9pbw,8863 -django/contrib/humanize/locale/it/LC_MESSAGES/django.mo,sha256=Zw8reudMUlPGC3eQ-CpsGYHX-FtNrAc5SxgTdmIrUC0,5374 -django/contrib/humanize/locale/it/LC_MESSAGES/django.po,sha256=wJzT-2ygufGLMIULd7afg1sZLQKnwQ55NZ2eAnwIY8M,9420 -django/contrib/humanize/locale/ja/LC_MESSAGES/django.mo,sha256=x8AvfUPBBJkGtE0jvAP4tLeZEByuyo2H4V_UuLoCEmw,3907 -django/contrib/humanize/locale/ja/LC_MESSAGES/django.po,sha256=G2yTPZq6DxgzPV5uJ6zvMK4o3aiuLWbl4vXPH7ylUhc,6919 -django/contrib/humanize/locale/ka/LC_MESSAGES/django.mo,sha256=UeUbonYTkv1d2ljC0Qj8ZHw-59zHu83fuMvnME9Fkmw,4878 -django/contrib/humanize/locale/ka/LC_MESSAGES/django.po,sha256=-eAMexwjm8nSB4ARJU3f811UZnuatHKIFf8FevpJEpo,9875 -django/contrib/humanize/locale/kk/LC_MESSAGES/django.mo,sha256=jujbUM0jOpt3Mw8zN4LSIIkxCJ0ihk_24vR0bXoux78,2113 -django/contrib/humanize/locale/kk/LC_MESSAGES/django.po,sha256=hjZg_NRE9xMA5uEa2mVSv1Hr4rv8inG9es1Yq7uy9Zc,8283 -django/contrib/humanize/locale/km/LC_MESSAGES/django.mo,sha256=mfXs9p8VokORs6JqIfaSSnQshZEhS90rRFhOIHjW7CI,459 -django/contrib/humanize/locale/km/LC_MESSAGES/django.po,sha256=JQBEHtcy-hrV_GVWIjvUJyOf3dZ5jUzzN8DUTAbHKUg,4351 -django/contrib/humanize/locale/kn/LC_MESSAGES/django.mo,sha256=Oq3DIPjgCqkn8VZMb6ael7T8fQ7LnWobPPAZKQSFHl4,461 -django/contrib/humanize/locale/kn/LC_MESSAGES/django.po,sha256=CAJ0etMlQF3voPYrxIRr5ChAwUYO7wI42n5kjpIEVjA,4359 -django/contrib/humanize/locale/ko/LC_MESSAGES/django.mo,sha256=mWmQEoe0MNVn3sNqsz6CBc826x3KIpOL53ziv6Ekf7c,3891 -django/contrib/humanize/locale/ko/LC_MESSAGES/django.po,sha256=UUxIUYM332DOZinJrqOUtQvHfCCHkodFhENDVWj3dpk,7003 -django/contrib/humanize/locale/ky/LC_MESSAGES/django.mo,sha256=jDu1bVgJMDpaZ0tw9-wdkorvZxDdRzcuzdeC_Ot7rUs,4177 -django/contrib/humanize/locale/ky/LC_MESSAGES/django.po,sha256=MEHbKMLIiFEG7BlxsNVF60viXSnlk5iqlFCH3hgamH0,7157 -django/contrib/humanize/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/humanize/locale/lb/LC_MESSAGES/django.po,sha256=_y0QFS5Kzx6uhwOnzmoHtCrbufMrhaTLsHD0LfMqtcM,4730 -django/contrib/humanize/locale/lt/LC_MESSAGES/django.mo,sha256=O0C-tPhxWNW5J4tCMlB7c7shVjNO6dmTURtIpTVO9uc,7333 -django/contrib/humanize/locale/lt/LC_MESSAGES/django.po,sha256=M5LlRxC1KWh1-3fwS93UqTijFuyRENmQJXfpxySSKik,12086 -django/contrib/humanize/locale/lv/LC_MESSAGES/django.mo,sha256=3gEzmKBtYsFz9wvLw0ltiir91CDLxhK3IG2j55-uM7Y,5033 -django/contrib/humanize/locale/lv/LC_MESSAGES/django.po,sha256=yfeBxpH2J49xHDzZUZI3cK5ms4QbWq0gtTmhj8ejAjE,8836 -django/contrib/humanize/locale/mk/LC_MESSAGES/django.mo,sha256=htUgd6rcaeRPDf6UrEb18onz-Ayltw9LTvWRgEkXm08,4761 -django/contrib/humanize/locale/mk/LC_MESSAGES/django.po,sha256=Wl9Rt8j8WA_0jyxKCswIovSiCQD-ZWFYXbhFsCUKIWo,6665 -django/contrib/humanize/locale/ml/LC_MESSAGES/django.mo,sha256=5As-FXkEJIYetmV9dMtzLtsRPTOm1oUgyx-oeTH_guY,4655 -django/contrib/humanize/locale/ml/LC_MESSAGES/django.po,sha256=I9_Ln0C1nSj188_Zdq9Vy6lC8aLzg_YdNc5gy9hNGjE,10065 -django/contrib/humanize/locale/mn/LC_MESSAGES/django.mo,sha256=MSw9wpCRQAX7lLWEW-Mamk_bR5R8lE_WqcD1G2mKbxI,4863 -django/contrib/humanize/locale/mn/LC_MESSAGES/django.po,sha256=xA4gODU33-hK6BXdqUun7qfjNuv6Dzq63FPVSQImfK4,8241 -django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo,sha256=sJAjSaUecl5hdetpBm-rCjVrkWxNhq3IFsE1MEYmq7c,1506 -django/contrib/humanize/locale/mr/LC_MESSAGES/django.po,sha256=lHmcv7LnyXWBdh_WRsL4GPUybIMLRlIoJlHBM3_3EWA,6693 -django/contrib/humanize/locale/ms/LC_MESSAGES/django.mo,sha256=Bcictup-1bGKm0FIa3CeGNvrHg8VyxsqUHzWI7UMscs,3839 -django/contrib/humanize/locale/ms/LC_MESSAGES/django.po,sha256=UQEUC2iZxhtrWim96GaEK1VAKxAC0fTQIghg4Zx4R3Q,6774 -django/contrib/humanize/locale/my/LC_MESSAGES/django.mo,sha256=55CWHz34sy9k6TfOeVI9GYvE9GRa3pjSRE6DSPk9uQ8,3479 -django/contrib/humanize/locale/my/LC_MESSAGES/django.po,sha256=jCiDhSqARfqKcMLEHJd-Xe6zo3Uc9QpiCh3BbAAA5UE,5433 -django/contrib/humanize/locale/nb/LC_MESSAGES/django.mo,sha256=957mOf_wFBOTjpcevsRz5tQ6IQ4PJnZZfJUETUgF23s,4318 -django/contrib/humanize/locale/nb/LC_MESSAGES/django.po,sha256=G_4pAxT3QZhC-wmWKIhEkFf0IRBn6gKRQZvx0spqjuk,7619 -django/contrib/humanize/locale/ne/LC_MESSAGES/django.mo,sha256=YFT2D-yEkUdJBO2GfuUowau1OZQA5mS86CZvMzH38Rk,3590 -django/contrib/humanize/locale/ne/LC_MESSAGES/django.po,sha256=SN7yH65hthOHohnyEmQUjXusRTDRjxWJG_kuv5g2Enk,9038 -django/contrib/humanize/locale/nl/LC_MESSAGES/django.mo,sha256=RxwgVgdHvfFirimjPrpDhzqmI1Z9soDC--raoAzgBkw,4311 -django/contrib/humanize/locale/nl/LC_MESSAGES/django.po,sha256=M7dVQho17p71Ud6imsQLGMiBisLrVNEZNP4ufpkEJnM,7872 -django/contrib/humanize/locale/nn/LC_MESSAGES/django.mo,sha256=wyJDAGJWgvyBYZ_-UQnBQ84-Jelk5forKfk7hMFDGpQ,4336 -django/contrib/humanize/locale/nn/LC_MESSAGES/django.po,sha256=zuKg53XCX-C6Asc9M04BKZVVw1X6u5p5hvOXxc0AXnM,7651 -django/contrib/humanize/locale/os/LC_MESSAGES/django.mo,sha256=BwS3Mj7z_Fg5s7Qm-bGLVhzYLZ8nPgXoB0gXLnrMGWc,3902 -django/contrib/humanize/locale/os/LC_MESSAGES/django.po,sha256=CGrxyL5l-5HexruOc7QDyRbum7piADf-nY8zjDP9wVM,6212 -django/contrib/humanize/locale/pa/LC_MESSAGES/django.mo,sha256=TH1GkAhaVVLk2jrcqAmdxZprWyikAX6qMP0eIlr2tWM,1569 -django/contrib/humanize/locale/pa/LC_MESSAGES/django.po,sha256=_7oP0Hn-IU7IPLv_Qxg_wstLEdhgWNBBTCWYwSycMb0,5200 -django/contrib/humanize/locale/pl/LC_MESSAGES/django.mo,sha256=0QheMbF3Y0Q_sxZlN2wAYJRQyK3K_uq6ttVr7wCc33w,5596 -django/contrib/humanize/locale/pl/LC_MESSAGES/django.po,sha256=6wX50O68aIyKiP6CcyLMXZ3xuUnAzasFPIg_8deJQBY,9807 -django/contrib/humanize/locale/pt/LC_MESSAGES/django.mo,sha256=dfK6kUOMLsT0VWhxqtqlE85iL8TzK-k4uZxlejuVjQw,5006 -django/contrib/humanize/locale/pt/LC_MESSAGES/django.po,sha256=QYAX1D7Rma9BCdels---awn1hRDTnVEuYfABJ1_64Ik,8788 -django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.mo,sha256=F5-AD4Fohf9wDyP_mqSJHvcKqIKIJsaxGuXGiHYGLHQ,5092 -django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.po,sha256=O1eVw8R8hL0N_XtTp4sdZbc5MxUNdxfGPzCT3U7QcxM,9089 -django/contrib/humanize/locale/ro/LC_MESSAGES/django.mo,sha256=vP6o72bsgKPsbKGwH0PU8Xyz9BnQ_sPWT3EANLT2wRk,6188 -django/contrib/humanize/locale/ro/LC_MESSAGES/django.po,sha256=JZiW6Y9P5JdQe4vgCvcFg35kFa8bSX0lU_2zdeudQP0,10575 -django/contrib/humanize/locale/ru/LC_MESSAGES/django.mo,sha256=tVtMvbDmHtoXFav2cXzhHpHmT-4-593Vo7kE5sd-Agc,6733 -django/contrib/humanize/locale/ru/LC_MESSAGES/django.po,sha256=0OWESEN33yMIcRUaX_oSQUuDidhbzgKpdivwAS7kNgs,11068 -django/contrib/humanize/locale/sk/LC_MESSAGES/django.mo,sha256=6l7T4rvVb8dPl0-6vwrq5K1QqJ06IdFKxEl4EGzN8Ns,5541 -django/contrib/humanize/locale/sk/LC_MESSAGES/django.po,sha256=Edsza_V5MJD_HadigUZWZoFLjl8556KFW9tbuHVHL3g,9657 -django/contrib/humanize/locale/sl/LC_MESSAGES/django.mo,sha256=yonGwvQKyqpZ_NLTpynDdS6q4yg3eafL1K5MFmnGw7o,4967 -django/contrib/humanize/locale/sl/LC_MESSAGES/django.po,sha256=-nzc9Rk9f3U_Rpze_fdJrKR-_CglPJ0_GryNUDD80jI,9580 -django/contrib/humanize/locale/sq/LC_MESSAGES/django.mo,sha256=j0AZBAudcMsxRAcq3MFdx2HY9aMCn6LJ7h4RR6cO__4,4355 -django/contrib/humanize/locale/sq/LC_MESSAGES/django.po,sha256=jjC3FgmIHFHHg0MdcM4wRbNkLVMFmXEAZRS_t6JHYpQ,7763 -django/contrib/humanize/locale/sr/LC_MESSAGES/django.mo,sha256=4Ec4EI_UmeBl6n8PhEikblh7YfTNIsll9s7aXUEpe7w,5723 -django/contrib/humanize/locale/sr/LC_MESSAGES/django.po,sha256=-Ru588vD_KCkEIo7AHJPAoQ04qVXubiZQSCoBwayi9U,9373 -django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=JjRdhD131w1i1HKNOnvU-Op9VCEIDlgvsiXT5RkSs4U,4935 -django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.po,sha256=Rn4v9V4Jy57rB69JyGt_QVHvvnE7-4s5KXeSRYdsGTc,11241 -django/contrib/humanize/locale/sv/LC_MESSAGES/django.mo,sha256=7OABdxvdZvKB9j1o99UiecoTXaVGn3XmXnU5xCNov8s,4333 -django/contrib/humanize/locale/sv/LC_MESSAGES/django.po,sha256=71tFrQzwtwzYfeC2BG0v8dZNkSEMbM-tAC5_z2AElLM,7876 -django/contrib/humanize/locale/sw/LC_MESSAGES/django.mo,sha256=cxjSUqegq1JX08xIAUgqq9ByP-HuqaXuxWM8Y2gHdB4,4146 -django/contrib/humanize/locale/sw/LC_MESSAGES/django.po,sha256=bPYrLJ2yY_lZ3y1K-RguNi-qrxq2r-GLlsz1gZcm2A8,6031 -django/contrib/humanize/locale/ta/LC_MESSAGES/django.mo,sha256=1X2vH0iZOwM0uYX9BccJUXqK-rOuhcu5isRzMpnjh2o,466 -django/contrib/humanize/locale/ta/LC_MESSAGES/django.po,sha256=8x1lMzq2KOJveX92ADSuqNmXGIEYf7fZ1JfIJPysS04,4722 -django/contrib/humanize/locale/te/LC_MESSAGES/django.mo,sha256=iKd4dW9tan8xPxgaSoenIGp1qQpvSHHXUw45Tj2ATKQ,1327 -django/contrib/humanize/locale/te/LC_MESSAGES/django.po,sha256=FQdjWKMsiv-qehYZ4AtN9iKRf8Rifzcm5TZzMkQVfQI,5103 -django/contrib/humanize/locale/tg/LC_MESSAGES/django.mo,sha256=1Fiqat0CZSyExRXRjRCBS0AFzwy0q1Iba-2RVnrXoZQ,1580 -django/contrib/humanize/locale/tg/LC_MESSAGES/django.po,sha256=j2iczgQDbqzpthKAAlMt1Jk7gprYLqZ1Ya0ASr2SgD0,7852 -django/contrib/humanize/locale/th/LC_MESSAGES/django.mo,sha256=jT7wGhYWP9HHwOvtr2rNPStiOgZW-rGMcO36w1U8Y4c,3709 -django/contrib/humanize/locale/th/LC_MESSAGES/django.po,sha256=ZO3_wU7z0VASS5E8RSLEtmTveMDjJ0O8QTynb2-jjt0,8318 -django/contrib/humanize/locale/tk/LC_MESSAGES/django.mo,sha256=cI2Ukp5kVTsUookoxyDD9gZKdxh4YezfRWYFBL7KuRU,4419 -django/contrib/humanize/locale/tk/LC_MESSAGES/django.po,sha256=6Qaxa03R4loH0FWQ6PCytT3Yz3LZt7UGTd01WVnHOIk,7675 -django/contrib/humanize/locale/tr/LC_MESSAGES/django.mo,sha256=D4ChMLE1Uz921NIF_Oe1vNkYAGfRpQuC8xANFwtlygE,4319 -django/contrib/humanize/locale/tr/LC_MESSAGES/django.po,sha256=4PjW65seHF9SsWnLv47JhgYPt0Gvzr-7_Ejech3d3ak,7754 -django/contrib/humanize/locale/tt/LC_MESSAGES/django.mo,sha256=z8VgtMhlfyDo7bERDfrDmcYV5aqOeBY7LDgqa5DRxDM,3243 -django/contrib/humanize/locale/tt/LC_MESSAGES/django.po,sha256=j_tRbg1hzLBFAmPQt0HoN-_WzWFtA07PloCkqhvNkcY,5201 -django/contrib/humanize/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/humanize/locale/udm/LC_MESSAGES/django.po,sha256=AR55jQHmMrbA6RyHGOtqdvUtTFlxWnqvfMy8vZK25Bo,4354 -django/contrib/humanize/locale/ug/LC_MESSAGES/django.mo,sha256=_GtRGNtdwZ6lU2gZc5jN9nSDB15bLBMYdhiwHlKxOOc,4883 -django/contrib/humanize/locale/ug/LC_MESSAGES/django.po,sha256=x9DJRBObVq8C3orGfj737v2gCHcpqaWUXMEeCMkumco,8156 -django/contrib/humanize/locale/uk/LC_MESSAGES/django.mo,sha256=wQOJu-zKyuCazul-elFLZc-iKw2Zea7TGb90OVGZYkQ,6991 -django/contrib/humanize/locale/uk/LC_MESSAGES/django.po,sha256=hxEufGt-NOgSFc5T9OzxCibcfqkhWD7zxhQljoUQssQ,11249 -django/contrib/humanize/locale/ur/LC_MESSAGES/django.mo,sha256=MF9uX26-4FFIz-QpDUbUHUNLQ1APaMLQmISMIaPsOBE,1347 -django/contrib/humanize/locale/ur/LC_MESSAGES/django.po,sha256=D5UhcPEcQ16fsBEdkk_zmpjIF6f0gEv0P86z_pK_1eA,5015 -django/contrib/humanize/locale/uz/LC_MESSAGES/django.mo,sha256=HDah_1qqUz5m_ABBVIEML3WMR2xyomFckX82i6b3n4k,1915 -django/contrib/humanize/locale/uz/LC_MESSAGES/django.po,sha256=Ql3GZOhuoVgS0xHEzxjyYkOWQUyi_jiizfAXBp2Y4uw,7296 -django/contrib/humanize/locale/vi/LC_MESSAGES/django.mo,sha256=ZUK_Na0vnfdhjo0MgnBWnGFU34sxcMf_h0MeyuysKG8,3646 -django/contrib/humanize/locale/vi/LC_MESSAGES/django.po,sha256=DzRpXObt9yP5RK_slWruaIhnVI0-JXux2hn_uGsVZiE,5235 -django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=YgeAjXHMV1rXNNIrlDu_haxnKB0hxU5twJ86LMR10k8,3844 -django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.po,sha256=JGfRVW_5UqwyI2mK_WRK8xDPzwBAO2q_mGsGzf89a88,7122 -django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=JQmImGUND9MONKqqLSCvvbbIT_TigIU6h-twN1qlfJc,3737 -django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.po,sha256=u_JB8_pFJofUoiGtcGh1xemLouLePvHua5J_npnJ_Q8,6826 -django/contrib/humanize/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/humanize/templatetags/__pycache__/__init__.cpython-310.pyc,, -django/contrib/humanize/templatetags/__pycache__/humanize.cpython-310.pyc,, -django/contrib/humanize/templatetags/humanize.py,sha256=8akMV7BQKkleh-7LhBVsKDrs-_4_SOQNOy-k_MBURg4,12681 -django/contrib/messages/__init__.py,sha256=_5b6kMxWt0TqW5ze5vZ-iqYEQfaQiAl28x2q9KRaMz4,171 -django/contrib/messages/__pycache__/__init__.cpython-310.pyc,, -django/contrib/messages/__pycache__/api.cpython-310.pyc,, -django/contrib/messages/__pycache__/apps.cpython-310.pyc,, -django/contrib/messages/__pycache__/constants.cpython-310.pyc,, -django/contrib/messages/__pycache__/context_processors.cpython-310.pyc,, -django/contrib/messages/__pycache__/middleware.cpython-310.pyc,, -django/contrib/messages/__pycache__/test.cpython-310.pyc,, -django/contrib/messages/__pycache__/utils.cpython-310.pyc,, -django/contrib/messages/__pycache__/views.cpython-310.pyc,, -django/contrib/messages/api.py,sha256=3DbnVG5oOBdg499clMU8l2hxCXMXB6S03-HCKVuBXjA,3250 -django/contrib/messages/apps.py,sha256=W_nya0lzXYBew83hqP6I8gg6XnaRlh-gmN-pYpDGN84,611 -django/contrib/messages/constants.py,sha256=JD4TpaR4C5G0oxIh4BmrWiVmCACv7rnVgZSpJ8Rmzeg,312 -django/contrib/messages/context_processors.py,sha256=xMrgYeX6AcT_WwS9AYKNDDstbvAwE7_u1ssDVLN_bbg,354 -django/contrib/messages/middleware.py,sha256=2mxncCpJVUgLtjouUGSVl39mTF-QskQpWo2jCOOqV8A,986 -django/contrib/messages/storage/__init__.py,sha256=gXDHbQ9KgQdfhYOla9Qj59_SlE9WURQiKzIA0cFH0DQ,392 -django/contrib/messages/storage/__pycache__/__init__.cpython-310.pyc,, -django/contrib/messages/storage/__pycache__/base.cpython-310.pyc,, -django/contrib/messages/storage/__pycache__/cookie.cpython-310.pyc,, -django/contrib/messages/storage/__pycache__/fallback.cpython-310.pyc,, -django/contrib/messages/storage/__pycache__/session.cpython-310.pyc,, -django/contrib/messages/storage/base.py,sha256=T-bcy6HdwRbEKNIuO5fEJZ1EUj3rTHWXRg1oxqRahGc,6082 -django/contrib/messages/storage/cookie.py,sha256=6r-z_MyYImgEC5LPvjOdp64xwkiV_ib97Sg4N4eXjxY,8678 -django/contrib/messages/storage/fallback.py,sha256=K5CrVJfUDakMjIcqSRt1WZd_1Xco1Bc2AQM3O3ld9aA,2093 -django/contrib/messages/storage/session.py,sha256=kvdVosbBAvI3XBA0G4AFKf0vxLleyzlwbGEgl60DfMQ,1764 -django/contrib/messages/test.py,sha256=zH9t6VwixXBDpaVscenCN94iDWIgs8pZ_Ck1GWUhWv0,421 -django/contrib/messages/utils.py,sha256=_oItQILchdwdXH08SIyZ-DBdYi7q_uobHQajWwmAeUw,256 -django/contrib/messages/views.py,sha256=I_7C4yr-YLkhTEWx3iuhixG7NrKuyuSDG_CVg-EYRD8,524 -django/contrib/postgres/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/postgres/__pycache__/__init__.cpython-310.pyc,, -django/contrib/postgres/__pycache__/apps.cpython-310.pyc,, -django/contrib/postgres/__pycache__/constraints.cpython-310.pyc,, -django/contrib/postgres/__pycache__/expressions.cpython-310.pyc,, -django/contrib/postgres/__pycache__/functions.cpython-310.pyc,, -django/contrib/postgres/__pycache__/indexes.cpython-310.pyc,, -django/contrib/postgres/__pycache__/lookups.cpython-310.pyc,, -django/contrib/postgres/__pycache__/operations.cpython-310.pyc,, -django/contrib/postgres/__pycache__/search.cpython-310.pyc,, -django/contrib/postgres/__pycache__/serializers.cpython-310.pyc,, -django/contrib/postgres/__pycache__/signals.cpython-310.pyc,, -django/contrib/postgres/__pycache__/utils.cpython-310.pyc,, -django/contrib/postgres/__pycache__/validators.cpython-310.pyc,, -django/contrib/postgres/aggregates/__init__.py,sha256=QCznqMKqPbpraxSi1Y8-B7_MYlL42F1kEWZ1HeLgTKs,65 -django/contrib/postgres/aggregates/__pycache__/__init__.cpython-310.pyc,, -django/contrib/postgres/aggregates/__pycache__/general.cpython-310.pyc,, -django/contrib/postgres/aggregates/__pycache__/mixins.cpython-310.pyc,, -django/contrib/postgres/aggregates/__pycache__/statistics.cpython-310.pyc,, -django/contrib/postgres/aggregates/general.py,sha256=nOI--CyO5sHBswRZKn8qCIuM3sX6uLLbsfmhkchNVEM,1496 -django/contrib/postgres/aggregates/mixins.py,sha256=lG52Uqv7RZAOq-WhMCdsPirLzsHxSb1wQPThAm-r1ew,2335 -django/contrib/postgres/aggregates/statistics.py,sha256=xSWk5Z5ZVpM2LSaMgP97pxcijOnPHiPATe3X45poXCI,1511 -django/contrib/postgres/apps.py,sha256=sfjoL-2VJrFzrv0CC3S4WGWZblzR_4BwFDm9bEHs8B0,3692 -django/contrib/postgres/constraints.py,sha256=YOuuC5LokNSs1F_lhNAiLLE1ws_ePysjyN-jJCCmINQ,9086 -django/contrib/postgres/expressions.py,sha256=fo5YASHJtIjexadqskuhYYk4WutofxzymYsivWWJS84,405 -django/contrib/postgres/fields/__init__.py,sha256=Xo8wuWPwVNOkKY-EwV9U1zusQ2DjMXXtL7_8R_xAi5s,148 -django/contrib/postgres/fields/__pycache__/__init__.cpython-310.pyc,, -django/contrib/postgres/fields/__pycache__/array.cpython-310.pyc,, -django/contrib/postgres/fields/__pycache__/citext.cpython-310.pyc,, -django/contrib/postgres/fields/__pycache__/hstore.cpython-310.pyc,, -django/contrib/postgres/fields/__pycache__/jsonb.cpython-310.pyc,, -django/contrib/postgres/fields/__pycache__/ranges.cpython-310.pyc,, -django/contrib/postgres/fields/__pycache__/utils.cpython-310.pyc,, -django/contrib/postgres/fields/array.py,sha256=Khl-BCCL25RQXGvi4gIHsfivP-XVWb6LhYJC0IEacpw,12630 -django/contrib/postgres/fields/citext.py,sha256=ytV2yAIwGvElHTAfH4BiLV-2DZ5otff8SmwmcqF2MVE,1363 -django/contrib/postgres/fields/hstore.py,sha256=LRM5aRhoPy5Ru8YMVUh84J17xoIcQ8Zc3kHVXMkSfSM,3296 -django/contrib/postgres/fields/jsonb.py,sha256=ncMGT6WY70lCbcmhwtu2bjRmfDMUIvCr76foUv7tqv0,406 -django/contrib/postgres/fields/ranges.py,sha256=IbjAQC7IdWuISqHdBXrraiOGPzUP_4pHHcnL8VuYZRs,11417 -django/contrib/postgres/fields/utils.py,sha256=TV-Aj9VpBb13I2iuziSDURttZtz355XakxXnFwvtGio,95 -django/contrib/postgres/forms/__init__.py,sha256=NjENn2-C6BcXH4T8YeC0K2AbDk8MVT8tparL3Q4OF6g,89 -django/contrib/postgres/forms/__pycache__/__init__.cpython-310.pyc,, -django/contrib/postgres/forms/__pycache__/array.cpython-310.pyc,, -django/contrib/postgres/forms/__pycache__/hstore.cpython-310.pyc,, -django/contrib/postgres/forms/__pycache__/ranges.cpython-310.pyc,, -django/contrib/postgres/forms/array.py,sha256=SzEBc6tKuqqjpYKH2b0vpdAQsjTqE_3kbpXBN7dfMYM,8401 -django/contrib/postgres/forms/hstore.py,sha256=MXXS4LdrueKIlM3w-_QGVvV3MZXMx1TR_4NrpChAtQo,1787 -django/contrib/postgres/forms/ranges.py,sha256=cKAeWvRISPLXIPhm2C57Lu9GoIlAd1xiRxzns69XehA,3652 -django/contrib/postgres/functions.py,sha256=7v6J01QQvX70KFyg9hDc322PgvT62xZqWlzp_vrl8bA,252 -django/contrib/postgres/indexes.py,sha256=qH5_kKj7Jg038cDM84ZGrvENsCF1W-EL-5xXf8Whi4Y,8224 -django/contrib/postgres/jinja2/postgres/widgets/split_array.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/contrib/postgres/locale/af/LC_MESSAGES/django.mo,sha256=Jp70O4TcKfdf1HRT0zZbympLJqmL3wpxMKDpJBPkI-E,2871 -django/contrib/postgres/locale/af/LC_MESSAGES/django.po,sha256=r_uvR9RfLLYHcS1byClWQX66EXq5yV_MGd-BHnWf4j4,3241 -django/contrib/postgres/locale/ar/LC_MESSAGES/django.mo,sha256=UTBknYC-W7nclTrBCEiCpTglZxZQY80UqGki8I6j3EM,4294 -django/contrib/postgres/locale/ar/LC_MESSAGES/django.po,sha256=_PgF2T3ylO4vnixVoKRsgmpPDHO-Qhj3mShHtHeSna0,4821 -django/contrib/postgres/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=fND1NtGTmEl7Rukt_VlqJeExdJjphBygmI-qJmE83P0,4352 -django/contrib/postgres/locale/ar_DZ/LC_MESSAGES/django.po,sha256=Z9y3h6lDnbwD4JOn7OACLjEZqNY8OpEwuzoUD8FSdwA,4868 -django/contrib/postgres/locale/az/LC_MESSAGES/django.mo,sha256=85wf8nNlReuPu89B_kb632QFKEdtL8ZVyQdlV_f-Sdo,2899 -django/contrib/postgres/locale/az/LC_MESSAGES/django.po,sha256=HRF6LxxcKtmLEA1dsYQMU4oG3P61jbQbwG6x_Wy0t4w,3284 -django/contrib/postgres/locale/be/LC_MESSAGES/django.mo,sha256=tYaaEbBaVxIgxC9qUAuE3YpHJa-aUu9ufFuJLa8my-s,4143 -django/contrib/postgres/locale/be/LC_MESSAGES/django.po,sha256=CL9BslCvHOvwjTBbCEswW8ISH72gSAyW5Dc-zoXI670,4643 -django/contrib/postgres/locale/bg/LC_MESSAGES/django.mo,sha256=A_WOYkzm2QwAo8ZXCKg7jOOiM7bEwUT4cSsSlyC6sWQ,3529 -django/contrib/postgres/locale/bg/LC_MESSAGES/django.po,sha256=TEDRfX5DWADwlgYqScP1hGm2hq2_zUGzIBmKY8WLVLQ,3993 -django/contrib/postgres/locale/ca/LC_MESSAGES/django.mo,sha256=XR1UEZV9AXKFz7XrchjRkd-tEdjnlmccW_I7XANyMns,2904 -django/contrib/postgres/locale/ca/LC_MESSAGES/django.po,sha256=5wPLvkODU_501cHPZ7v0n89rmFrsuctt7T8dUBMfQ0Q,3430 -django/contrib/postgres/locale/ckb/LC_MESSAGES/django.mo,sha256=FQsR4nG0r8RfJ4rkD58XyWX-x7ZLkeg0VbZbSzDB2L0,3414 -django/contrib/postgres/locale/ckb/LC_MESSAGES/django.po,sha256=YStPyf6Gy68ydbzvtYcU6b_CV3h4JzJ3aYOQqccI9zI,3764 -django/contrib/postgres/locale/cs/LC_MESSAGES/django.mo,sha256=BgNruyg0gX0DNZ3mqFerVd2JcSmi4ARRWRhJKlcRhDw,3418 -django/contrib/postgres/locale/cs/LC_MESSAGES/django.po,sha256=evU4mQ9EOQJSxHF0dx_axiU59ptW0xVjIIxTgQCkUJU,3957 -django/contrib/postgres/locale/da/LC_MESSAGES/django.mo,sha256=VaTePWY3W7YRW-CkTUx6timYDXEYOFRFCkg3F36_k_I,2886 -django/contrib/postgres/locale/da/LC_MESSAGES/django.po,sha256=5j5xI-yKORhnywIACpjvMQA6yHj4aHMYiiN4KVSmBMM,3344 -django/contrib/postgres/locale/de/LC_MESSAGES/django.mo,sha256=iTfG4OxvwSG32U_PQ0Tmtl38v83hSjFa2W0J8Sw0NUE,3078 -django/contrib/postgres/locale/de/LC_MESSAGES/django.po,sha256=GkF6wBg7JAvAB8YExwOx4hzpLr1r2K6HsvSLYfyojow,3611 -django/contrib/postgres/locale/dsb/LC_MESSAGES/django.mo,sha256=zZa1kLFCKar4P1xVNpJ0BTXm4I-xcNi_e8IY7n8Aa4w,3605 -django/contrib/postgres/locale/dsb/LC_MESSAGES/django.po,sha256=5vnAeH9tF9H9xL2nqfwc0MLlhI4hnNr45x2NXlw8owo,4061 -django/contrib/postgres/locale/el/LC_MESSAGES/django.mo,sha256=NmzROkTfSbioGv8exM3UdMDnRAxR65YMteGv9Nhury4,3583 -django/contrib/postgres/locale/el/LC_MESSAGES/django.po,sha256=4WuswUwrInAh-OPX9k7gDdLb-oMKp1vQFUGvfm0ej00,4144 -django/contrib/postgres/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/postgres/locale/en/LC_MESSAGES/django.po,sha256=jrbHgf4TLTbEAaYV9-briB5JoE7sBWTn9r6aaRtpn54,2862 -django/contrib/postgres/locale/en_AU/LC_MESSAGES/django.mo,sha256=WA0RSssD8ljI16g6DynQZQLQhd_0XR8ilrnJnepsIFg,2839 -django/contrib/postgres/locale/en_AU/LC_MESSAGES/django.po,sha256=4JASYUpYlQlSPREPvMxFBqDpDhprlkI1GpAqTJrmb10,3215 -django/contrib/postgres/locale/eo/LC_MESSAGES/django.mo,sha256=1wqM_IVO8Dl9AefzvWYuoS4eNTrBg7LDH6XUMovKi9A,2742 -django/contrib/postgres/locale/eo/LC_MESSAGES/django.po,sha256=r2tpOblfLAAHMacDWU-OVXTQus_vvAPMjUzVfrV_T7U,3217 -django/contrib/postgres/locale/es/LC_MESSAGES/django.mo,sha256=O2Tdel44oxmQ13ZcwMwK3QPxUPChHdUzVKg2pLCPoqo,3163 -django/contrib/postgres/locale/es/LC_MESSAGES/django.po,sha256=YPjvjmvpS69FuNmPm-7Z1K1Eg_W01JwRHNrWkbKzVZ8,3794 -django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.mo,sha256=zIN-1vsrChWXLDuGrzs61LbBuOwsyifWcvo9NrYCy2k,3140 -django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.po,sha256=1seAy6OHEKG4fDV4NwKQyGfkjT29zjgwvXZ85u1VNtw,3506 -django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.mo,sha256=Q2eOegYKQFY3fAKZCX7VvZAN6lT304W51aGl0lzkbLU,2484 -django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.po,sha256=bbgOn34B7CSq1Kf2IrJh6oRJWPur_Smc4ebljIxAFGE,3233 -django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.mo,sha256=l6WdS59mDfjsV9EMULjKP2DhXR7x3bYax1iokL-AXcU,689 -django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.po,sha256=_-jzhIT71zV539_4SUbwvOXfDHkxRy1FDGdx23iB7B4,2283 -django/contrib/postgres/locale/et/LC_MESSAGES/django.mo,sha256=oPGqGUQhU9xE7j6hQZSVdC-be2WV-_BNrSAaN4csFR4,2886 -django/contrib/postgres/locale/et/LC_MESSAGES/django.po,sha256=xKkb-0CQCAn37xe0G2jfQmjg2kuYBmXB5yBpTA5lYNI,3404 -django/contrib/postgres/locale/eu/LC_MESSAGES/django.mo,sha256=UG7x642-n3U7mamXuNHD66a_mR0agX72xSwBD3PpyJU,2883 -django/contrib/postgres/locale/eu/LC_MESSAGES/django.po,sha256=dAx6nlRd4FF_8i7Xeylwvj4HkEDKi3swFenkdJkDawU,3321 -django/contrib/postgres/locale/fa/LC_MESSAGES/django.mo,sha256=uLh9fJtCSKg5eaj9uGP2muN_71aFxpZwOjRHtnZhPik,3308 -django/contrib/postgres/locale/fa/LC_MESSAGES/django.po,sha256=adN7bh9Q_R0Wzlf2fWaQnTtvxo0NslyoHH5t5V0eeMM,3845 -django/contrib/postgres/locale/fi/LC_MESSAGES/django.mo,sha256=yzMEJuOw30NzM6AdoTq0Kb-eb079nsvre09IVEBVVtE,2917 -django/contrib/postgres/locale/fi/LC_MESSAGES/django.po,sha256=bNPtE6kdb8lLHcrjRVxasfO3gnzklA2ZDUuXVE9tL1Y,3279 -django/contrib/postgres/locale/fr/LC_MESSAGES/django.mo,sha256=02ug8j0VpkPC2tRDkXrK2snj91M68Ju29PUiv4UhAsQ,3391 -django/contrib/postgres/locale/fr/LC_MESSAGES/django.po,sha256=5T_wkYoHJcpzemKqR-7apZ11Pas4dZhnAitHOgT8gRc,3759 -django/contrib/postgres/locale/ga/LC_MESSAGES/django.mo,sha256=wVzUMn8xlOxfL2vn94fSQ73QGTSbTBG6_6kfQbDPQYM,3652 -django/contrib/postgres/locale/ga/LC_MESSAGES/django.po,sha256=OEuRFUSNTJJlJAg7mvXpratMipVeCovYsH9pTssNGI0,4122 -django/contrib/postgres/locale/gd/LC_MESSAGES/django.mo,sha256=okWU_Ke95EG2pm8rZ4PT5ScO-8f0Hqg65lYZgSid8tM,3541 -django/contrib/postgres/locale/gd/LC_MESSAGES/django.po,sha256=tjt5kfkUGryU3hFzPuAly2DBDLuLQTTD5p-XrxryFEI,4013 -django/contrib/postgres/locale/gl/LC_MESSAGES/django.mo,sha256=1Od7e0SG9tEeTefFLLWkU38tlk5PL5aRF1GTlKkfTAs,2912 -django/contrib/postgres/locale/gl/LC_MESSAGES/django.po,sha256=tE2-GX2OH06krOFxvzdJeYWC7a57QYNFx5OtMXFWTdQ,3316 -django/contrib/postgres/locale/he/LC_MESSAGES/django.mo,sha256=znkNJeCKSSA4DPdvN5LCj5tdcWvRJQKRLWMXqSIO4FI,3757 -django/contrib/postgres/locale/he/LC_MESSAGES/django.po,sha256=oVJ0bfd9gH3aF3lo6rCMbA_9_3nhLWKBqfVj-H220F0,4234 -django/contrib/postgres/locale/hr/LC_MESSAGES/django.mo,sha256=vdm5GxgpKuVdGoVl3VreD8IB1Mq5HGWuq-2YDeDrNnU,929 -django/contrib/postgres/locale/hr/LC_MESSAGES/django.po,sha256=8TxEnVH2yIQWbmbmDOpR7kksNFSaUGVhimRPQgSgDkM,2501 -django/contrib/postgres/locale/hsb/LC_MESSAGES/django.mo,sha256=SSZpG-PSeVCHrzB-wzW4wRHxIEt7hqobzvRLB-9tu8Y,3518 -django/contrib/postgres/locale/hsb/LC_MESSAGES/django.po,sha256=UQUlfpJsgd-0qa6hZhUkTAi6VF5ZYiygSMrLcsiEC4k,3971 -django/contrib/postgres/locale/hu/LC_MESSAGES/django.mo,sha256=o6JDAFIN7i21GE2N0q98SiqIdvGYPLLdDiMLC_UE5hM,2892 -django/contrib/postgres/locale/hu/LC_MESSAGES/django.po,sha256=yUcbOn1k08aqhkODsrQfLR3qk-UnEEbEYuP3JyQ3eCU,3432 -django/contrib/postgres/locale/hy/LC_MESSAGES/django.mo,sha256=2QFIJdmh47IGPqI-8rvuHR0HdH2LOAmaYqEeCwUpRuw,3234 -django/contrib/postgres/locale/hy/LC_MESSAGES/django.po,sha256=MLHMbdwdo1txzFOG-fVK4VUvAoDtrLA8CdpQThybSCQ,3825 -django/contrib/postgres/locale/ia/LC_MESSAGES/django.mo,sha256=gn8lf-gOP4vv-iiqnkcxvjzhJ8pTdetBhHyjl4TapXo,582 -django/contrib/postgres/locale/ia/LC_MESSAGES/django.po,sha256=FsqhPQf0j4g06rGuWSTn8A1kJ7E5U9rX16mtB8CAiIE,2251 -django/contrib/postgres/locale/id/LC_MESSAGES/django.mo,sha256=vWCSZJBmKu5uGS8KvQIJSMZA1YTwdbbJP4-OBhTmAwQ,2737 -django/contrib/postgres/locale/id/LC_MESSAGES/django.po,sha256=Z5TrRpCOv6Mgb2YFU84vE8cT_3W7flFwA8BUMm4VvO0,3308 -django/contrib/postgres/locale/is/LC_MESSAGES/django.mo,sha256=rNL5Un5K_iRAZDtpHo4egcySaaBnNEirYDuWw0eI7gk,2931 -django/contrib/postgres/locale/is/LC_MESSAGES/django.po,sha256=UO53ciyI0jCVtBOXWkaip2AbPE2Hd2YhzK1RAlcxyQ8,3313 -django/contrib/postgres/locale/it/LC_MESSAGES/django.mo,sha256=dsn-Xuhg1WeRkJVGHHdoPz-KobYsS8A41BUdnM4wQQ8,3210 -django/contrib/postgres/locale/it/LC_MESSAGES/django.po,sha256=2RpaA-mmvXcYkYTu_y0u3p32aAhP9DyAy641ZJL79sk,3874 -django/contrib/postgres/locale/ja/LC_MESSAGES/django.mo,sha256=IC9mYW8gXWNGuXeh8gGxGFvrjfxiSpj57E63Ka47pkM,3046 -django/contrib/postgres/locale/ja/LC_MESSAGES/django.po,sha256=IPnDsh8rtq158a63zQJekJ0LJlR3uj6KAjx4omc7XN0,3437 -django/contrib/postgres/locale/ka/LC_MESSAGES/django.mo,sha256=A_VhLUZbocGNF5_5mMoYfB3l654MrPIW4dL1ywd3Tw8,713 -django/contrib/postgres/locale/ka/LC_MESSAGES/django.po,sha256=kRIwQ1Nrzdf5arHHxOPzQcB-XwPNK5lUFKU0L3QHfC8,2356 -django/contrib/postgres/locale/kk/LC_MESSAGES/django.mo,sha256=xMc-UwyP1_jBHcGIAGWmDAjvSL50jJaiZbcT5TmzDOg,665 -django/contrib/postgres/locale/kk/LC_MESSAGES/django.po,sha256=f6Z3VUFRJ3FgSReC0JItjA0RaYbblqDb31lbJ3RRExQ,2327 -django/contrib/postgres/locale/ko/LC_MESSAGES/django.mo,sha256=G9Cl4uFost_c2y-3dBEF5ODuOe2BLThiXcEMEMXQQE8,2905 -django/contrib/postgres/locale/ko/LC_MESSAGES/django.po,sha256=JXqG3VCGEhBzAxGzOBb9w6oflaX4duhxNVht69ytOQY,3481 -django/contrib/postgres/locale/ky/LC_MESSAGES/django.mo,sha256=F0Ws34MbE7zJa8FNxA-9rFm5sNLL22D24LyiBb927lE,3101 -django/contrib/postgres/locale/ky/LC_MESSAGES/django.po,sha256=yAzSeT2jBm7R2ZXiuYBQFSKQ_uWIUfNTAobE1UYnlPs,3504 -django/contrib/postgres/locale/lt/LC_MESSAGES/django.mo,sha256=kJ3ih8HrHt2M_hFW0H9BZg7zcj6sXy6H_fD1ReIzngM,3452 -django/contrib/postgres/locale/lt/LC_MESSAGES/django.po,sha256=PNADIV8hdpLoqwW4zpIhxtWnQN8cPkdcoXYngyjFeFw,3972 -django/contrib/postgres/locale/lv/LC_MESSAGES/django.mo,sha256=UwBbbIbC_MO6xhB66UzO80XFcmlyv8-mfFEK4kQd6fE,3153 -django/contrib/postgres/locale/lv/LC_MESSAGES/django.po,sha256=phDSZnB5JeCoCi0f_MYCjQiwhE00gcVl5urOFiAKmkU,3768 -django/contrib/postgres/locale/mk/LC_MESSAGES/django.mo,sha256=WE4nRJKWAZvXuyU2qT2_FGqGlKYsP1KSACCtT10gQQY,3048 -django/contrib/postgres/locale/mk/LC_MESSAGES/django.po,sha256=CQX91LP1Gbkazpt4hTownJtSqZGR1OJfoD-1MCo6C1Y,3783 -django/contrib/postgres/locale/ml/LC_MESSAGES/django.mo,sha256=N47idWIsmtghZ_D5325TRsDFeoUa0MIvMFtdx7ozAHc,1581 -django/contrib/postgres/locale/ml/LC_MESSAGES/django.po,sha256=lt_7fGZV7BCB2XqFWIQQtH4niU4oMBfGzQQuN5sD0fo,2947 -django/contrib/postgres/locale/mn/LC_MESSAGES/django.mo,sha256=VWeXaMvdqhW0GHs1Irb1ikTceH7jMKH_xMzKLH0vKZg,3310 -django/contrib/postgres/locale/mn/LC_MESSAGES/django.po,sha256=p3141FJiYrkV8rocgqdxnV05FReQYZmosv9LI46FlfE,3867 -django/contrib/postgres/locale/mr/LC_MESSAGES/django.mo,sha256=vVYwi51As7ovNuvoGU96oL3uryKHGVPCJXS2rRrkZ2o,1132 -django/contrib/postgres/locale/mr/LC_MESSAGES/django.po,sha256=DHSatTEPlPRSH_qXXBXKeyHB1X7YQ0UhkUc-j92iAyY,2595 -django/contrib/postgres/locale/ms/LC_MESSAGES/django.mo,sha256=m3JZm1IIMZwmpvIs3oV0roYCeR_UlswHyCpZjjE6-A8,2712 -django/contrib/postgres/locale/ms/LC_MESSAGES/django.po,sha256=HCMBA1fxKLJct14ywap0PYVBi2bDp2F97Ms5_-G_Pwg,3025 -django/contrib/postgres/locale/nb/LC_MESSAGES/django.mo,sha256=3h8DqEFG39i6uHY0vpXuGFmoJnAxTtRFy1RazcYIXfg,2849 -django/contrib/postgres/locale/nb/LC_MESSAGES/django.po,sha256=gDUg-HDg3LiYMKzb2QaDrYopqaJmbvnw2Fo-qhUHFuI,3252 -django/contrib/postgres/locale/ne/LC_MESSAGES/django.mo,sha256=5XdBLGMkn20qeya3MgTCpsIDxLEa7PV-i2BmK993iRc,875 -django/contrib/postgres/locale/ne/LC_MESSAGES/django.po,sha256=1QLLfbrHneJmxM_5UTpNIYalP-qX7Bn7bmj4AfDLIzE,2421 -django/contrib/postgres/locale/nl/LC_MESSAGES/django.mo,sha256=XK0L91JYDbkgw45eJysai_3u28KqZ5UFPTYaCTMiDPA,2993 -django/contrib/postgres/locale/nl/LC_MESSAGES/django.po,sha256=qU17zpXRHSoBQIkcP-Cm1GFh0BcpUTJsdh277P8dYG0,3565 -django/contrib/postgres/locale/nn/LC_MESSAGES/django.mo,sha256=RdMFozwxYIckBY40mJhN-jjkghztKn0-ytCtqxFHBMY,2836 -django/contrib/postgres/locale/nn/LC_MESSAGES/django.po,sha256=vl8NkY342eonqbrj89eCR_8PsJpeQuaRjxems-OPIBk,3184 -django/contrib/postgres/locale/pl/LC_MESSAGES/django.mo,sha256=Wox9w-HN7Guf8N1nkgemuDVs0LQxxTmEqQDOxriKy60,3462 -django/contrib/postgres/locale/pl/LC_MESSAGES/django.po,sha256=pxm_IKMg8g5qfg19CKc5JEdK6IMnhyeSPHd7THUb1GY,4217 -django/contrib/postgres/locale/pt/LC_MESSAGES/django.mo,sha256=KZvJXjrIdtxbffckcrRV3nJ5GnID6PvqAb7vpOiWpHE,2745 -django/contrib/postgres/locale/pt/LC_MESSAGES/django.po,sha256=2gIDOjnFo6Iom-oTkQek4IX6FYPI9rNp9V-6sJ55aL8,3281 -django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.mo,sha256=PVEiflh0v3AqVOC0S85XO-V3xDU3d8UwS31lzGrLoi8,3143 -django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.po,sha256=onF2K6s-McAXDSRzQ50EpGrKAIv89vvRWjCjsLCVXvs,3896 -django/contrib/postgres/locale/ro/LC_MESSAGES/django.mo,sha256=w4tyByrZlba_Ju_F2OzD52ut5JSD6UGJfjt3A7CG_uc,3188 -django/contrib/postgres/locale/ro/LC_MESSAGES/django.po,sha256=hnotgrr-zeEmE4lgpqDDiJ051GoGbL_2GVs4O9dVLXI,3700 -django/contrib/postgres/locale/ru/LC_MESSAGES/django.mo,sha256=LKkZs-TvPFTSrXVVaaoZ-Ec0kL_E9_5vTaExVxlr_rk,4732 -django/contrib/postgres/locale/ru/LC_MESSAGES/django.po,sha256=mnmVUlwZqn9QwdMx4g0D9xYxxKw_4pMFslwT2c4AjuE,5488 -django/contrib/postgres/locale/sk/LC_MESSAGES/django.mo,sha256=dRnTFkvRMbq5QnVEtrQ9Of9MxKTFYPP8sE7kbvUEjug,3381 -django/contrib/postgres/locale/sk/LC_MESSAGES/django.po,sha256=OwKv_mc9cuwt_YGnoVQLF3t2RsIbFyG_k3NKoIMAMoY,3899 -django/contrib/postgres/locale/sl/LC_MESSAGES/django.mo,sha256=JM9YZagjHIIrCxOKkR4d4oKaEXKJU7bfVdM3_uzSTAE,2810 -django/contrib/postgres/locale/sl/LC_MESSAGES/django.po,sha256=1jI2zXSU4LWxfLEUL-FXpldCExZJLD53Jy7VnA258xs,3602 -django/contrib/postgres/locale/sq/LC_MESSAGES/django.mo,sha256=iUrpd4u_bfpkMyfBb4BPNcwCvsVpJiRVBLvjXjIC18w,2850 -django/contrib/postgres/locale/sq/LC_MESSAGES/django.po,sha256=ZuUrdJOSecnyGJC50Eh3L7LKCpJpkLZFixGdieQM-uA,3349 -django/contrib/postgres/locale/sr/LC_MESSAGES/django.mo,sha256=OfsUq8rZdD2NP7NQjBoatSXATxc8d6QL-nxmlPp5QSc,3775 -django/contrib/postgres/locale/sr/LC_MESSAGES/django.po,sha256=vUvFaIp8renqgGs-VgrtPNu7IBkcB38mlTBJ0xxXTaI,4214 -django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=2nDFP43vk1Jih35jns8vSbOhhLq_w7t_2vJHg-crfxY,3112 -django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.po,sha256=QN4NEy0zFaPNjTCBrT9TydedWG7w4QBPm-pO7cKvSjg,3510 -django/contrib/postgres/locale/sv/LC_MESSAGES/django.mo,sha256=AkUgWYRBGNJYg5QDPJR3qu4BA_XF9xaZA__3m_KF4hk,2918 -django/contrib/postgres/locale/sv/LC_MESSAGES/django.po,sha256=hhJBRobgyHkLeKxdDxNkEl9XKkDXkrlx6PjyWcERp7I,3487 -django/contrib/postgres/locale/tg/LC_MESSAGES/django.mo,sha256=3yW5NKKsa2f2qDGZ4NGlSn4DHatLOYEv5SEwB9voraA,2688 -django/contrib/postgres/locale/tg/LC_MESSAGES/django.po,sha256=Zuix5sJH5Fz9-joe_ivMRpNz2Fbzefsxz3OOoDV0o1c,3511 -django/contrib/postgres/locale/tk/LC_MESSAGES/django.mo,sha256=ytivs6cnECDuyVKToFQMRnH_RPr4PlVepg8xFHnr0W4,2789 -django/contrib/postgres/locale/tk/LC_MESSAGES/django.po,sha256=bfXIyKNOFRC3U34AEKCsYQn3XMBGtgqHsXpboHvRQq0,3268 -django/contrib/postgres/locale/tr/LC_MESSAGES/django.mo,sha256=hZ2pxkYNOGE4BX--QmDlzqXxT21gHaPGA6CmXDODzhI,2914 -django/contrib/postgres/locale/tr/LC_MESSAGES/django.po,sha256=fzQsDL_wSO62qUaXCutRgq0ifrQ9oOaaxVQRyfnvV7Y,3288 -django/contrib/postgres/locale/ug/LC_MESSAGES/django.mo,sha256=ClLFBgCNopAREx7jy9WRbEASJERWJO8WZHriZrPtDZU,3938 -django/contrib/postgres/locale/ug/LC_MESSAGES/django.po,sha256=Ldd11fS8-D6ZeannnC6pCmBk7fmtqR_RXaeaNZQtU6M,4323 -django/contrib/postgres/locale/uk/LC_MESSAGES/django.mo,sha256=Jg6nM7ah7hEv7eqpe11e0e_MvRaMAQW3mdHTj9hqyG8,4406 -django/contrib/postgres/locale/uk/LC_MESSAGES/django.po,sha256=6gBP1xKxK9hf8ISCR1wABxkKXEUTx2CUYHGr6RVPI94,5100 -django/contrib/postgres/locale/uz/LC_MESSAGES/django.mo,sha256=PcmhhVC1spz3EFrQ2qdhfPFcA1ELHtBhHGWk9Z868Ss,703 -django/contrib/postgres/locale/uz/LC_MESSAGES/django.po,sha256=lbQxX2cmueGCT8sl6hsNWcrf9H-XEUbioP4L7JHGqiU,2291 -django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=ln_p6MRs5JPvTAXFzegXYnCCKki-LEr_YiOw6sK8oPA,2560 -django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.po,sha256=7YZE8B0c1HuKVjGzreY7iiyuFeyPgqzKIwzxe5YOKb4,3084 -django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=7-gE2HUKbQwMwzMXT3_sMbI2GbuS2uzciNnJgKOMZUQ,2563 -django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.po,sha256=nkYgbfQNoa3eYNCYMPgGVhtGWScjWtP2rjlV8nAXgH0,2973 -django/contrib/postgres/lookups.py,sha256=J50bsr8rLjp_zzdViSVDDcTLfDkY21fEUoyqCgeHauI,1991 -django/contrib/postgres/operations.py,sha256=3sDyWh9u4I87AIabLAtYOSEB4NAFSk-IKJsb2400AQk,12274 -django/contrib/postgres/search.py,sha256=bIXux7NXgsVTVAauvScWUPtYNR4E2u1D1Rd6PNf2s6Y,11732 -django/contrib/postgres/serializers.py,sha256=wCg0IzTNeuVOiC2cdy1wio6gChjqVvH6Ri4hkCkEeXU,435 -django/contrib/postgres/signals.py,sha256=cpkaedbyvajpN4NNAYLA6TfKI_4fe9AU40CeYhYmS8Q,2870 -django/contrib/postgres/templates/postgres/widgets/split_array.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/contrib/postgres/utils.py,sha256=32nCnzdMZ7Ra4dDonbIdv1aCppV3tnQnoEX9AhCJe38,1187 -django/contrib/postgres/validators.py,sha256=GCJtwISehlhcqQhR5JEfrcwPUcCJqtpFV_fu4aRLb34,2801 -django/contrib/redirects/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/redirects/__pycache__/__init__.cpython-310.pyc,, -django/contrib/redirects/__pycache__/admin.cpython-310.pyc,, -django/contrib/redirects/__pycache__/apps.cpython-310.pyc,, -django/contrib/redirects/__pycache__/middleware.cpython-310.pyc,, -django/contrib/redirects/__pycache__/models.cpython-310.pyc,, -django/contrib/redirects/admin.py,sha256=1bPOgeZYRYCHdh7s2SpXnuL2WsfdQjD96U5Y3xhRY8g,314 -django/contrib/redirects/apps.py,sha256=1uS5EBp7WwDnY0WHeaRYo7VW9j-s20h4KDdImodjCNg,251 -django/contrib/redirects/locale/af/LC_MESSAGES/django.mo,sha256=p1jR8LLNrzuDM6gvYBzQAS5xg7X8O17301Fo5xEU2yI,1151 -django/contrib/redirects/locale/af/LC_MESSAGES/django.po,sha256=wkVhdkjL6kI-0uxzWPCrEMhf_iUSbbHV1D0dFPIw1eU,1385 -django/contrib/redirects/locale/ar/LC_MESSAGES/django.mo,sha256=FfPauXNUmQxq0R1-eQ2xw2WY1Oi33sLwVhyKX10_zFw,1336 -django/contrib/redirects/locale/ar/LC_MESSAGES/django.po,sha256=X0xX51asSDWedd56riJ4UrsCGEjH-lZdkcilIg4amgI,1595 -django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=hg1lkBEORP2vgLPRbuKcXiIFUcTvAO7KrjbPXlWhvqY,1379 -django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.po,sha256=O4quBKA1jHATGGeDqCONDFfAqvDvOAATIBvueeMphyY,1581 -django/contrib/redirects/locale/ast/LC_MESSAGES/django.mo,sha256=a1ixBQQIdBZ7o-ADnF2r74CBtPLsuatG7txjc05_GXI,1071 -django/contrib/redirects/locale/ast/LC_MESSAGES/django.po,sha256=PguAqeIUeTMWsADOYLTxoC6AuKrCloi8HN18hbm3pZ0,1266 -django/contrib/redirects/locale/az/LC_MESSAGES/django.mo,sha256=IBIB2EW9ZYQTD0x4d8VadXY0lFx-XYtKCd1F_e72ibA,1106 -django/contrib/redirects/locale/az/LC_MESSAGES/django.po,sha256=D3ZGFhKeMTjJ4YtUOTRjBCvZ2cofqfksbk39mvHDemw,1384 -django/contrib/redirects/locale/be/LC_MESSAGES/django.mo,sha256=fVqy28ml508UJf5AA-QVsS5dzKI8Q_ugZZ34WjTpJ-s,1426 -django/contrib/redirects/locale/be/LC_MESSAGES/django.po,sha256=zHBVewcpt0KoavV96v3F4wybqtkGb1jUuPz7sbiWWDI,1662 -django/contrib/redirects/locale/bg/LC_MESSAGES/django.mo,sha256=o-ETSDGtAFZRo3SPd_IHe0mJ3R0RHA32KpgfOmUH11M,1279 -django/contrib/redirects/locale/bg/LC_MESSAGES/django.po,sha256=9qm8s6vj-0LStnyEJ8iYVi13_MfugVAAs2RHvIi7kW8,1587 -django/contrib/redirects/locale/bn/LC_MESSAGES/django.mo,sha256=SbQh_pgxNCogvUFud7xW9T6NTAvpaQb2jngXCtpjICM,1319 -django/contrib/redirects/locale/bn/LC_MESSAGES/django.po,sha256=LgUuiPryDLSXxo_4KMCdjM5XC3BiRfINuEk0s5PUQYQ,1511 -django/contrib/redirects/locale/br/LC_MESSAGES/django.mo,sha256=Yt8xo5B5LJ9HB8IChCkj5mljFQAAKlaW_gurtF8q8Yw,1429 -django/contrib/redirects/locale/br/LC_MESSAGES/django.po,sha256=L2qPx6mZEVUNay1yYEweKBLr_fXVURCnACfsezfP_pI,1623 -django/contrib/redirects/locale/bs/LC_MESSAGES/django.mo,sha256=0Yak4rXHjRRXLu3oYYzvS8qxvk2v4IFvUiDPA68a5YI,1115 -django/contrib/redirects/locale/bs/LC_MESSAGES/django.po,sha256=s9Nhx3H4074hlSqo1zgQRJbozakdJTwA1aTuMSqEJWw,1316 -django/contrib/redirects/locale/ca/LC_MESSAGES/django.mo,sha256=VHE6qHCEoA7rQk0fMUpoTfwqSfu63-CiOFvhvKp5DMQ,1136 -django/contrib/redirects/locale/ca/LC_MESSAGES/django.po,sha256=PSMb_7iZBuYhtdR8byh9zr9dr50Z_tQ518DUlqoEA_M,1484 -django/contrib/redirects/locale/ckb/LC_MESSAGES/django.mo,sha256=23RM9kso65HHxGHQ_DKxGDaUkmdX72DfYvqQfhr7JKw,1340 -django/contrib/redirects/locale/ckb/LC_MESSAGES/django.po,sha256=cGrAq3e6h3vbYrtyi0oFSfZmLlJ0-Y3uqrvFon48n80,1521 -django/contrib/redirects/locale/cs/LC_MESSAGES/django.mo,sha256=UwYsoEHsg7FJLVe0JxdOa1cTGypqJFienAbWe7Vldf0,1229 -django/contrib/redirects/locale/cs/LC_MESSAGES/django.po,sha256=hnWJLXX7IjwZK7_8L3p-dpj5XpDmEo7lQ7-F4upjn7U,1504 -django/contrib/redirects/locale/cy/LC_MESSAGES/django.mo,sha256=NSGoK12A7gbtuAuzQEVFPNSZMqqmhHyRvTEn9PUm9So,1132 -django/contrib/redirects/locale/cy/LC_MESSAGES/django.po,sha256=jDmC64z5exPnO9zwRkBmpa9v3DBlaeHRhqZYPoWqiIY,1360 -django/contrib/redirects/locale/da/LC_MESSAGES/django.mo,sha256=_UVfTMRG__5j7Ak8Q3HtXSy_DPGpZ1XvKj9MHdmR_xI,1132 -django/contrib/redirects/locale/da/LC_MESSAGES/django.po,sha256=RAWWbZXbJciNSdw4skUEoTnOb19iKXAe1KXJLWi0zPQ,1418 -django/contrib/redirects/locale/de/LC_MESSAGES/django.mo,sha256=uh-ldy-QkWS5-ARX6cLyzxzdhbTb_chyEbBPFCvCKuE,1155 -django/contrib/redirects/locale/de/LC_MESSAGES/django.po,sha256=hhGNnVCRV4HNxhCYfmVXTOIkabD7qsVQccwxKa5Tz9g,1424 -django/contrib/redirects/locale/dsb/LC_MESSAGES/django.mo,sha256=LXgczA38RzrN7zSWpxKy8_RY4gPg5tZLl30CJGjJ63s,1236 -django/contrib/redirects/locale/dsb/LC_MESSAGES/django.po,sha256=rI9dyDp7zuZ6CjvFyo2OkGUDK5XzdvdI0ma8IGVkjp4,1431 -django/contrib/redirects/locale/el/LC_MESSAGES/django.mo,sha256=sD3HT4e53Yd3HmQap_Mqlxkm0xF98A6PFW8Lil0PihI,1395 -django/contrib/redirects/locale/el/LC_MESSAGES/django.po,sha256=puhVCcshg5HaPHsVAOucneVgBYT6swhCCBpVGOZykgA,1716 -django/contrib/redirects/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/redirects/locale/en/LC_MESSAGES/django.po,sha256=u4RcMkFmNvlG9Bv6kM0a0scWUMDUbTEDJGR90-G8C0E,1123 -django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.mo,sha256=wxCpSLGl_zsE47kDwilDkpihazwHkA363PvtGOLWhdk,1127 -django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.po,sha256=zujH1WuxoHw_32flptG0x2Ob_BlilLKXuMjQxVbZmgw,1307 -django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.mo,sha256=VscL30uJnV-eiQZITpBCy0xk_FfKdnMh4O9Hk4HGxww,1053 -django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.po,sha256=loe8xIVjZ7eyteQNLPoa-QceBZdgky22dR6deK5ubmA,1246 -django/contrib/redirects/locale/eo/LC_MESSAGES/django.mo,sha256=WZ3NHrS0qMoCJER5jWnGI12bvY5wH0yytM8F7BFTgYc,712 -django/contrib/redirects/locale/eo/LC_MESSAGES/django.po,sha256=T-Gw75sOjZgqpwjIfieIrLxbg1kekWzjrJYSMld2OEQ,1299 -django/contrib/redirects/locale/es/LC_MESSAGES/django.mo,sha256=xyeIQL_pHFyo7p7SkeuxzKdDsma2EXhvnPNDHUhaBv8,1159 -django/contrib/redirects/locale/es/LC_MESSAGES/django.po,sha256=Y3hPQrcbhLtR-pPYRJJXkJME5M8Enr20j9D63hhe9ZA,1490 -django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.mo,sha256=JdKzpdyf9W2m_0_NguvXvyciOh6LAATfE6lqcsp45To,1144 -django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.po,sha256=3zrKJXLh_mrjc4A6g9O6ePyFz8PNUMYTPjNFpvEhaDo,1364 -django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.mo,sha256=wcAMOiqsgz2KEpRwirRH9FNoto6vmo_hxthrQJi0IHU,1147 -django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.po,sha256=n8DM14vHekZRayH0B6Pm3L5XnSo4lto4ZAdu4OhcOmc,1291 -django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.mo,sha256=38fbiReibMAmC75BCCbyo7pA2VA3QvmRqVEo_K6Ejow,1116 -django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.po,sha256=t7R6PiQ1bCc7jhfMrjHlZxVQ6BRlWT2Vv4XXhxBD_Oo,1397 -django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.mo,sha256=59fZBDut-htCj38ZUoqPjhXJPjZBz-xpU9__QFr3kLs,486 -django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po,sha256=f4XZW8OHjRJoztMJtSDCxd2_Mfy-XK44hLtigjGSsZY,958 -django/contrib/redirects/locale/et/LC_MESSAGES/django.mo,sha256=34-Z1s9msdnj6U7prMctEWCxAR8TNnP44MIoyUuFsls,1131 -django/contrib/redirects/locale/et/LC_MESSAGES/django.po,sha256=1VWcUbM9z_nNmiGnT9Mka3Y3ZLRVHuJdS_j_yNXvmQ0,1479 -django/contrib/redirects/locale/eu/LC_MESSAGES/django.mo,sha256=yHlAEz01pWse4ZworAj7JiATUam5Fp20EZd_3PRgSNw,1126 -django/contrib/redirects/locale/eu/LC_MESSAGES/django.po,sha256=zAvSdahjvq727hXeGjHJ_R5L5meCrOv98tbH3rwlBcE,1404 -django/contrib/redirects/locale/fa/LC_MESSAGES/django.mo,sha256=vZa1KKm2y8duEv9UbJMyiM8WO2EAXcevdR3Lj1ISgLU,1234 -django/contrib/redirects/locale/fa/LC_MESSAGES/django.po,sha256=1quB0Wx5VTIjX2QUCpENl1GA2hpSdsRpgK931jr20B0,1541 -django/contrib/redirects/locale/fi/LC_MESSAGES/django.mo,sha256=xJEd4M2IowXxKBlaGuOEgFKA9OuihcgPoK07Beat4cc,1164 -django/contrib/redirects/locale/fi/LC_MESSAGES/django.po,sha256=1I7AoXMPRDMY6TCjPkQh0Q9g68r9BwKOwki9DybcFWc,1429 -django/contrib/redirects/locale/fr/LC_MESSAGES/django.mo,sha256=YhVNoNaHdSOp2P2F7xfo2MHCd2KkHiehpVjLyJ4VLuw,1155 -django/contrib/redirects/locale/fr/LC_MESSAGES/django.po,sha256=-ljzEKiU05annJ8DHw4OOg8eDCAnWLV2V33R-tQn9dE,1391 -django/contrib/redirects/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/redirects/locale/fy/LC_MESSAGES/django.po,sha256=D7xverCbf3kTCcFM8h7EKWM5DcxZRqeOSKDB1irbKeE,948 -django/contrib/redirects/locale/ga/LC_MESSAGES/django.mo,sha256=DMxYLCVQl6qtLf8SXpcy1u9DLbTVFM-03Q2iXjNxNs0,1182 -django/contrib/redirects/locale/ga/LC_MESSAGES/django.po,sha256=HL2vCAoXAj0pk4MkrriUY_Jp2xvDaMqJo8i1z2MkKT8,1497 -django/contrib/redirects/locale/gd/LC_MESSAGES/django.mo,sha256=baZXdulbPZwe4_Q3OwfHFl4GJ4hCYtoZz-lE4wcdJvg,1250 -django/contrib/redirects/locale/gd/LC_MESSAGES/django.po,sha256=M4E2giFgzRowd3OsvhD389MyJmT5osKz1Vs1sEfmUpU,1428 -django/contrib/redirects/locale/gl/LC_MESSAGES/django.mo,sha256=au4ulT76A8cd_C_DmtEdiuQ14dIJaprVvFbS9_hYRNk,1131 -django/contrib/redirects/locale/gl/LC_MESSAGES/django.po,sha256=r2t9gHhIvPb8d9XR8fG0b_eW5xkkQswuj4ekJI9x90w,1393 -django/contrib/redirects/locale/he/LC_MESSAGES/django.mo,sha256=Yu8KTmY0mJEcxhkhTEVElPBaWwO9Zj4NqC8eopW0cRc,1278 -django/contrib/redirects/locale/he/LC_MESSAGES/django.po,sha256=UcCd_BqHOkTV1dP0hgJ4dNQzBZ4p8TujwSjF3FWAMjo,1513 -django/contrib/redirects/locale/hi/LC_MESSAGES/django.mo,sha256=onR8L7Kvkx6HgFLK7jT-wA_zjarBN8pyltG6BbKFIWU,1409 -django/contrib/redirects/locale/hi/LC_MESSAGES/django.po,sha256=fNv9_qwR9iS-pjWNXnrUFIqvc10lwg3bfj5lgdQOy1U,1649 -django/contrib/redirects/locale/hr/LC_MESSAGES/django.mo,sha256=7wHi6Uu0czZhI6v0ndJJ1wSkalTRfn7D5ovyw8tr4U4,1207 -django/contrib/redirects/locale/hr/LC_MESSAGES/django.po,sha256=HtxZwZ-ymmf-XID0z5s7nGYg-4gJL8i6FDGWt9i4Wns,1406 -django/contrib/redirects/locale/hsb/LC_MESSAGES/django.mo,sha256=6lfIW4LcMGvuLOY0U4w1V6Xwcd_TsUC3r-QzZOOLwys,1221 -django/contrib/redirects/locale/hsb/LC_MESSAGES/django.po,sha256=l5pATo8NHa8ypB8dCigRwqpLZvV8W0v2vPh60oAeGn0,1420 -django/contrib/redirects/locale/hu/LC_MESSAGES/django.mo,sha256=4oYBNGEmFMISzw3LExVf6CHsJD_o20mMy132pwzM-wk,1111 -django/contrib/redirects/locale/hu/LC_MESSAGES/django.po,sha256=UYJ_ZrAnOqA6S8nkkfN_FBLxCyPHJjOMd1OSIUVc8aY,1383 -django/contrib/redirects/locale/hy/LC_MESSAGES/django.mo,sha256=gT5x1TZXMNyBwfmQ-C_cOB60JGYdKIM7tVb3-J5d6nw,1261 -django/contrib/redirects/locale/hy/LC_MESSAGES/django.po,sha256=40QTpth2AVeoy9P36rMJC2C82YsBh_KYup19WL6zM6w,1359 -django/contrib/redirects/locale/ia/LC_MESSAGES/django.mo,sha256=PDB5ZQP6iH31xN6N2YmPZYjt6zzc88TRmh9_gAWH2U0,1152 -django/contrib/redirects/locale/ia/LC_MESSAGES/django.po,sha256=GXjbzY-cQz2QLx_iuqgijT7VUMcoNKL7prbP6yIbj8E,1297 -django/contrib/redirects/locale/id/LC_MESSAGES/django.mo,sha256=XEsvVWMR9As9csO_6iXNAcLZrErxz3HfDj5GTe06fJU,1105 -django/contrib/redirects/locale/id/LC_MESSAGES/django.po,sha256=t8FoC1xIB-XHDplyDJByQGFnHggxR0LSfUMGwWoAKWE,1410 -django/contrib/redirects/locale/io/LC_MESSAGES/django.mo,sha256=vz7TWRML-DFDFapbEXTByb9-pRQwoeJ0ApSdh6nOzXY,1019 -django/contrib/redirects/locale/io/LC_MESSAGES/django.po,sha256=obStuMYYSQ7x2utkGS3gekdPfnsNAwp3DcNwlwdg1sI,1228 -django/contrib/redirects/locale/is/LC_MESSAGES/django.mo,sha256=aMjlGilYfP7clGriAp1Za60uCD40rvLt9sKXuYX3ABg,1040 -django/contrib/redirects/locale/is/LC_MESSAGES/django.po,sha256=nw5fxVV20eQqsk4WKg6cIiKttG3zsITSVzH4p5xBV8s,1299 -django/contrib/redirects/locale/it/LC_MESSAGES/django.mo,sha256=bBj6dvhZSpxojLZ0GiMBamh1xiluxAYMt6RHubi9CxU,1092 -django/contrib/redirects/locale/it/LC_MESSAGES/django.po,sha256=NHSVus7ixtrB7JDIrYw22srZcse5i4Z9y8Ply_-Jcts,1390 -django/contrib/redirects/locale/ja/LC_MESSAGES/django.mo,sha256=XSJw3iLK0gYVjZ86MYuV4jfoiN_-WkH--oMK5uW9cs8,1193 -django/contrib/redirects/locale/ja/LC_MESSAGES/django.po,sha256=SlYrmC3arGgS7SL8cCnq7d37P-bQGcmpgUXAwVC2eRw,1510 -django/contrib/redirects/locale/ka/LC_MESSAGES/django.mo,sha256=0aOLKrhUX6YAIMNyt6KES9q2iFk2GupEr76WeGlJMkk,1511 -django/contrib/redirects/locale/ka/LC_MESSAGES/django.po,sha256=AQWIEdhxp55XnJwwHrUxxQaGbLJPmdo1YLeT86IJqnY,1725 -django/contrib/redirects/locale/kab/LC_MESSAGES/django.mo,sha256=Ogx9NXK1Nfw4ctZfp-slIL81ziDX3f4DZ01OkVNY5Tw,699 -django/contrib/redirects/locale/kab/LC_MESSAGES/django.po,sha256=gI6aUPkXH-XzKrStDsMCMNfQKDEc-D1ffqE-Z-ItQuI,1001 -django/contrib/redirects/locale/kk/LC_MESSAGES/django.mo,sha256=KVLc6PKL1MP_Px0LmpoW2lIvgLiSzlvoJ9062F-s3Zw,1261 -django/contrib/redirects/locale/kk/LC_MESSAGES/django.po,sha256=Xoy4mnOT51F_GS1oIO91EAuwt-ZfePKh-sutedo6D_g,1478 -django/contrib/redirects/locale/km/LC_MESSAGES/django.mo,sha256=tcW1s7jvTG0cagtdRNT0jSNkhX-B903LKl7bK31ZvJU,1248 -django/contrib/redirects/locale/km/LC_MESSAGES/django.po,sha256=KJ4h1umpfFLdsWZtsfXoeOl6cUPUD97U4ISWt80UZ2U,1437 -django/contrib/redirects/locale/kn/LC_MESSAGES/django.mo,sha256=24GHcQlEoCDri-98eLtqLbGjtJz9cTPAfYdAijsL5ck,788 -django/contrib/redirects/locale/kn/LC_MESSAGES/django.po,sha256=xkH24itr2fpuCQMGQ3xssOqaN_7KzM-GLy0u00ti27I,1245 -django/contrib/redirects/locale/ko/LC_MESSAGES/django.mo,sha256=_m-8YdcKaUqQ-O-ioyJqlvD3d4pT9KEES-_U5v32tVo,1152 -django/contrib/redirects/locale/ko/LC_MESSAGES/django.po,sha256=6m_YYMBCPXdKzk0mN4MdHzroU78uDRp70B67qMu0Ew8,1564 -django/contrib/redirects/locale/ky/LC_MESSAGES/django.mo,sha256=4jX_g-hledmjWEx0RvY99G5QcBj_mQt_HZzpd000J44,1265 -django/contrib/redirects/locale/ky/LC_MESSAGES/django.po,sha256=yvx21nxsqqVzPyyxX9_rF-oeaY2WszXrG4ZDSZTW6-4,1522 -django/contrib/redirects/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/redirects/locale/lb/LC_MESSAGES/django.po,sha256=Hv1CF9CC78YuVVNpklDtPJDU5-iIUeuXcljewmc9akg,946 -django/contrib/redirects/locale/lt/LC_MESSAGES/django.mo,sha256=reiFMXJnvE4XUosbKjyvUFzl4IKjlJoFK1gVJE9Tbnc,1191 -django/contrib/redirects/locale/lt/LC_MESSAGES/django.po,sha256=G56UIYuuVLgwzHCIj_suHNYPe1z76Y_cauWfGEs4nKI,1448 -django/contrib/redirects/locale/lv/LC_MESSAGES/django.mo,sha256=slGK6O2tYD5yciS8m_7h2WA4LOPf05nQ4oTRKB63etE,1175 -django/contrib/redirects/locale/lv/LC_MESSAGES/django.po,sha256=GUDn1IYQ5UMOQUBvGfuVOeVb-bpf5FHVigqTt_N0I0M,1442 -django/contrib/redirects/locale/mk/LC_MESSAGES/django.mo,sha256=3XGgf2K60LclScPKcgw07TId6x535AW5jtGVJ9lC01A,1353 -django/contrib/redirects/locale/mk/LC_MESSAGES/django.po,sha256=Smsdpid5VByoxvnfzju_XOlp6aTPl8qshFptot3cRYM,1596 -django/contrib/redirects/locale/ml/LC_MESSAGES/django.mo,sha256=IhSkvbgX9xfE4GypOQ7W7SDM-wOOqx1xgSTW7L1JofU,1573 -django/contrib/redirects/locale/ml/LC_MESSAGES/django.po,sha256=9KpXf88GRUB5I51Rj3q9qhvhjHFINuiJ9ig0SZdYE6k,1755 -django/contrib/redirects/locale/mn/LC_MESSAGES/django.mo,sha256=14fdHC_hZrRaA0EAFzBJy8BHj4jMMX6l2e6rLLBtJ8E,1274 -django/contrib/redirects/locale/mn/LC_MESSAGES/django.po,sha256=7_QzUWf5l0P-7gM35p9UW7bOj33NabQq_zSrekUeZsY,1502 -django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo,sha256=KWFQR7X6niKMWIqY93sKtS6o41hsG4pEGLhXwC6MmDI,1530 -django/contrib/redirects/locale/mr/LC_MESSAGES/django.po,sha256=UZp4529Fm4US-Yi5eOlT6Ja7S_s1pc73LqNwEvaxXGw,1687 -django/contrib/redirects/locale/ms/LC_MESSAGES/django.mo,sha256=WUk6hvvHPWuylCGiDvy0MstWoQ1mdmwwfqlms1Nv4Ng,1094 -django/contrib/redirects/locale/ms/LC_MESSAGES/django.po,sha256=bsQDwxqtS5FgPCqTrfm9kw2hH_R2y44DnI5nluUgduc,1255 -django/contrib/redirects/locale/my/LC_MESSAGES/django.mo,sha256=H5-y9A3_1yIXJzC4sSuHqhURxhOlnYEL8Nvc0IF4zUE,549 -django/contrib/redirects/locale/my/LC_MESSAGES/django.po,sha256=MZGNt0jMQA6aHA6OmjvaC_ajvRWfUfDiKkV0j3_E480,1052 -django/contrib/redirects/locale/nb/LC_MESSAGES/django.mo,sha256=pxRtj5VFxTQBbi_mDS05iGoQs4BZ4y6LLJZ9pozJezY,1110 -django/contrib/redirects/locale/nb/LC_MESSAGES/django.po,sha256=ALYXciVa0d0sG70dqjtk17Yh_qwzKAzTXDlEZSU9kc0,1392 -django/contrib/redirects/locale/ne/LC_MESSAGES/django.mo,sha256=TxTnBGIi5k0PKAjADeCuOAJQV5dtzLrsFRXBXtfszWI,1420 -django/contrib/redirects/locale/ne/LC_MESSAGES/django.po,sha256=5b5R-6AlSIQrDyTtcmquoW5xrQRGZwlxZpBpZfVo5t4,1607 -django/contrib/redirects/locale/nl/LC_MESSAGES/django.mo,sha256=Xeh1YbEAu7Lhz07RXPTMDyv7AyWF9Bhe-9oHdWT74mo,1129 -django/contrib/redirects/locale/nl/LC_MESSAGES/django.po,sha256=QuNgrX7w2wO15KPEe3ogVhXbkt0v60EwKmKfD7-PedU,1476 -django/contrib/redirects/locale/nn/LC_MESSAGES/django.mo,sha256=8TQXBF2mzENl7lFpcrsKxkJ4nKySTOgXJM5_I2OD7q8,1143 -django/contrib/redirects/locale/nn/LC_MESSAGES/django.po,sha256=pfrKVQd1wLKKpq-b7CBpc-rZnEEgyZFDSjbipsEiwxM,1344 -django/contrib/redirects/locale/os/LC_MESSAGES/django.mo,sha256=joQ-ibV9_6ctGMNPLZQLCx5fUamRQngs6_LDd_s9sMQ,1150 -django/contrib/redirects/locale/os/LC_MESSAGES/django.po,sha256=ZwFWiuGS9comy7r2kMnKuqaPOvVehVdAAuFvXM5ldxM,1358 -django/contrib/redirects/locale/pa/LC_MESSAGES/django.mo,sha256=MY-OIDNXlZth-ZRoOJ52nlUPg_51_F5k0NBIpc7GZEw,748 -django/contrib/redirects/locale/pa/LC_MESSAGES/django.po,sha256=TPDTK2ZvDyvO1ob8Qfr64QDbHVWAREfEeBO5w9jf63E,1199 -django/contrib/redirects/locale/pl/LC_MESSAGES/django.mo,sha256=9Sc_8aDC8-PADnr4hYdat6iRUXj0QxsWR1RGWKIQP3M,1285 -django/contrib/redirects/locale/pl/LC_MESSAGES/django.po,sha256=RLuSAlWQPvxDGSNHL3j5ohMdf4IZL-g21-_QIuTdY4c,1605 -django/contrib/redirects/locale/pt/LC_MESSAGES/django.mo,sha256=6bBKvreZLmowKJdRMU6WzCCbyekYgEIFmC39LFH2dS8,1187 -django/contrib/redirects/locale/pt/LC_MESSAGES/django.po,sha256=uo57eUM5JxFf1plCUSyk8ts6AHrnTq5HV0ncjFbtsS4,1440 -django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.mo,sha256=adnRlAeOrULZkdpZGhHbb4D5A-hzJxeYlkfcbarx7pE,1224 -django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po,sha256=DLTeZs_Xng3j8bveJizEIBLBjd4lJH_a-TzZxJgtu20,1703 -django/contrib/redirects/locale/ro/LC_MESSAGES/django.mo,sha256=D8FkmV6IxZOn5QAPBu9PwhStBpVQWudU62wKa7ADfJY,1158 -django/contrib/redirects/locale/ro/LC_MESSAGES/django.po,sha256=Z_-pDi2-A7_KXrEQtFlAJ_KLO0vXFKCbMphsNlqfNJk,1477 -django/contrib/redirects/locale/ru/LC_MESSAGES/django.mo,sha256=IvO0IXq1xuX0wpo2hV8po1AMifLS3ElGyQal0vmC_Jw,1457 -django/contrib/redirects/locale/ru/LC_MESSAGES/django.po,sha256=FHb4L3RMVV5ajxGj9y6ZymPtO_XjZrhHmvCZBPwwzmQ,1762 -django/contrib/redirects/locale/sk/LC_MESSAGES/django.mo,sha256=TTgi-SVyS9nbBCsI6NPbg-QA-GMc_-ciYewOUHDb1bM,1222 -django/contrib/redirects/locale/sk/LC_MESSAGES/django.po,sha256=yDuSGdVfHhsorxQNQ6S7ocyJfrI07pcLzyhkvXNCZXk,1506 -django/contrib/redirects/locale/sl/LC_MESSAGES/django.mo,sha256=GAZtOFSUxsOHdXs3AzT40D-3JFWIlNDZU_Z-cMvdaHo,1173 -django/contrib/redirects/locale/sl/LC_MESSAGES/django.po,sha256=gkZTyxNh8L2gNxyLVzm-M1HTiK8KDvughTa2MK9NzWo,1351 -django/contrib/redirects/locale/sq/LC_MESSAGES/django.mo,sha256=qBF68rD7Fyr27aGYYlDeetQrEfxGugtkXxhEB0mQuEA,1179 -django/contrib/redirects/locale/sq/LC_MESSAGES/django.po,sha256=9s38vklGQCDF7WPhCdTa6kiCsWSdhLsB2z4dGt2y31M,1472 -django/contrib/redirects/locale/sr/LC_MESSAGES/django.mo,sha256=OK90avxrpYxBcvPIZ_tDlSZP6PyRCzFg_7h0F_JlMy8,1367 -django/contrib/redirects/locale/sr/LC_MESSAGES/django.po,sha256=Ipi7j7q5N8aNGWmkz5XGlOPqpD46xCLKarfs-lNbKqM,1629 -django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=qYXT0j80c7a5jMsxeezncAL9Gff2Pb7eJz8iTX0TRX4,1210 -django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.po,sha256=CL3ij3uGK8UOMggLXf0MctEydLbyi-9zvkXN5Teuu9c,1424 -django/contrib/redirects/locale/sv/LC_MESSAGES/django.mo,sha256=2j_IyOgbM_yED5lF10r7KGguEC2qX58dRIVogWj5PVY,1134 -django/contrib/redirects/locale/sv/LC_MESSAGES/django.po,sha256=lIFNLfEondtzlwlG3tDf3AH59uEotLtj-XdL87c-QUo,1404 -django/contrib/redirects/locale/sw/LC_MESSAGES/django.mo,sha256=qQjxB8Z6uKoNOa3wI6aDiAYLpWhx7z2yI7nEbXtMOXc,1165 -django/contrib/redirects/locale/sw/LC_MESSAGES/django.po,sha256=rAAmAwjvy69tVeB-QeccIS8CMA96XLeWdfRwDy3_QA0,1385 -django/contrib/redirects/locale/ta/LC_MESSAGES/django.mo,sha256=AE6Py2_CV2gQKjKQAa_UgkLT9i61x3i1hegQpRGuZZM,1502 -django/contrib/redirects/locale/ta/LC_MESSAGES/django.po,sha256=ojdq8p4HnwtK0n6By2I6_xuucOpJIobJEGRMGc_TrS8,1700 -django/contrib/redirects/locale/te/LC_MESSAGES/django.mo,sha256=Gtcs4cbgrD7-bSkPKiPbM5DcjONS2fSdHhvWdbs_E1M,467 -django/contrib/redirects/locale/te/LC_MESSAGES/django.po,sha256=RT-t3TjcOLyNQQWljVrIcPWErKssh_HQMyGujloy-EI,939 -django/contrib/redirects/locale/tg/LC_MESSAGES/django.mo,sha256=6e4Pk9vX1csvSz80spVLhNTd3N251JrXaCga9n60AP8,782 -django/contrib/redirects/locale/tg/LC_MESSAGES/django.po,sha256=2Cmle5usoNZBo8nTfAiqCRq3KqN1WKKdc-mogUOJm9I,1177 -django/contrib/redirects/locale/th/LC_MESSAGES/django.mo,sha256=1l6eO0k1KjcmuRJKUS4ZdtJGhAUmUDMAMIeNwEobQqY,1331 -django/contrib/redirects/locale/th/LC_MESSAGES/django.po,sha256=DVVqpGC6zL8Hy8e6P8ZkhKbvcMJmXV5euLxmfoTCtms,1513 -django/contrib/redirects/locale/tk/LC_MESSAGES/django.mo,sha256=NkxO6C7s1HHT1Jrmwad9zaD3pPyW_sPuZz3F2AGUD7M,1155 -django/contrib/redirects/locale/tk/LC_MESSAGES/django.po,sha256=0EQj1I1oNbAovKmF7o2rQ8_QsQiYqEFDab2KlCFw0s0,1373 -django/contrib/redirects/locale/tr/LC_MESSAGES/django.mo,sha256=-qySxKYwxfFO79cBytvzTBeFGdio1wJlM5DeBBfdxns,1133 -django/contrib/redirects/locale/tr/LC_MESSAGES/django.po,sha256=-03z3YMI6tlt12xwFI2lWchOxiIVbkdVRhghaCoMKlk,1408 -django/contrib/redirects/locale/tt/LC_MESSAGES/django.mo,sha256=Hf1JXcCGNwedxy1nVRM_pQ0yUebC-tvOXr7P0h86JyI,1178 -django/contrib/redirects/locale/tt/LC_MESSAGES/django.po,sha256=2WCyBQtqZk-8GXgtu-x94JYSNrryy2QoMnirhiBrgV0,1376 -django/contrib/redirects/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/redirects/locale/udm/LC_MESSAGES/django.po,sha256=xsxlm4itpyLlLdPQRIHLuvTYRvruhM3Ezc9jtp3XSm4,934 -django/contrib/redirects/locale/ug/LC_MESSAGES/django.mo,sha256=qV4UXMJUeNM2vw0LWn-YR9TDn1sQVvnEUcXh7_AX3Jo,1409 -django/contrib/redirects/locale/ug/LC_MESSAGES/django.po,sha256=dilTTU3q5BCYiUIgpjncD3ijPaQgp1l73poSrsZiUUc,1633 -django/contrib/redirects/locale/uk/LC_MESSAGES/django.mo,sha256=QbN1ABfbr2YbZQXz2U4DI-6iTvWoKPrLAn5tGq57G5Y,1569 -django/contrib/redirects/locale/uk/LC_MESSAGES/django.po,sha256=pH9M4ilsJneoHw6E1E3T54QCHGS_i4tlhDc0nbAJP8I,1949 -django/contrib/redirects/locale/ur/LC_MESSAGES/django.mo,sha256=CQkt-yxyAaTd_Aj1ZZC8s5-4fI2TRyTEZ-SYJZgpRrQ,1138 -django/contrib/redirects/locale/ur/LC_MESSAGES/django.po,sha256=CkhmN49PvYTccvlSRu8qGpcbx2C-1aY7K3Lq1VC2fuM,1330 -django/contrib/redirects/locale/uz/LC_MESSAGES/django.mo,sha256=vD0Y920SSsRsLROKFaU6YM8CT5KjQxJcgMh5bZ4Pugo,743 -django/contrib/redirects/locale/uz/LC_MESSAGES/django.po,sha256=G2Rj-6g8Vse2Bp8L_hGIO84S--akagMXj8gSa7F2lK4,1195 -django/contrib/redirects/locale/vi/LC_MESSAGES/django.mo,sha256=BquXycJKh-7-D9p-rGUNnjqzs1d6S1YhEJjFW8_ARFA,1106 -django/contrib/redirects/locale/vi/LC_MESSAGES/django.po,sha256=xsCASrGZNbQk4d1mhsTZBcCpPJ0KO6Jr4Zz1wfnL67s,1301 -django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=iftb_HccNV383_odHbB6Tikn2h7EtP_9QK-Plq2xwTY,1100 -django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.po,sha256=xZmfuCEYx7ou_qvtxBcBly5mBmkSBEhnx0xqJj3nvMw,1490 -django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=Dj3gCstbzcxZyR6iL-U_ridpKcyDI8UIAohw8Rq82bM,1108 -django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po,sha256=UvNH_gQtAhWqN-d3qGOB3nuqrKqFhxjIGu09WsZ7_oQ,1413 -django/contrib/redirects/middleware.py,sha256=ydqidqi5JTaoguEFQBRzLEkU3HeiohgVsFglHUE-HIU,1921 -django/contrib/redirects/migrations/0001_initial.py,sha256=0mXB5TgK_fwYbmbB_e7tKSjgOvpHWnZXg0IFcVtnmfU,2101 -django/contrib/redirects/migrations/0002_alter_redirect_new_path_help_text.py,sha256=RXPdSbYewnW1bjjXxNqUIL-qIeSxdBUehBp0BjfRl8o,635 -django/contrib/redirects/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/redirects/migrations/__pycache__/0001_initial.cpython-310.pyc,, -django/contrib/redirects/migrations/__pycache__/0002_alter_redirect_new_path_help_text.cpython-310.pyc,, -django/contrib/redirects/migrations/__pycache__/__init__.cpython-310.pyc,, -django/contrib/redirects/models.py,sha256=KJ6mj0BS243BNPKp26K7OSqcT9j49FPth5m0gNWWxFM,1083 -django/contrib/sessions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sessions/__pycache__/__init__.cpython-310.pyc,, -django/contrib/sessions/__pycache__/apps.cpython-310.pyc,, -django/contrib/sessions/__pycache__/base_session.cpython-310.pyc,, -django/contrib/sessions/__pycache__/exceptions.cpython-310.pyc,, -django/contrib/sessions/__pycache__/middleware.cpython-310.pyc,, -django/contrib/sessions/__pycache__/models.cpython-310.pyc,, -django/contrib/sessions/__pycache__/serializers.cpython-310.pyc,, -django/contrib/sessions/apps.py,sha256=5WIMqa3ymqEvYMnFHe3uWZB8XSijUF_NSgaorRD50Lg,194 -django/contrib/sessions/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sessions/backends/__pycache__/__init__.cpython-310.pyc,, -django/contrib/sessions/backends/__pycache__/base.cpython-310.pyc,, -django/contrib/sessions/backends/__pycache__/cache.cpython-310.pyc,, -django/contrib/sessions/backends/__pycache__/cached_db.cpython-310.pyc,, -django/contrib/sessions/backends/__pycache__/db.cpython-310.pyc,, -django/contrib/sessions/backends/__pycache__/file.cpython-310.pyc,, -django/contrib/sessions/backends/__pycache__/signed_cookies.cpython-310.pyc,, -django/contrib/sessions/backends/base.py,sha256=uw4jDJHvBQLI1XJCru-_fYZ2Pzfz1U-iiN8sJxNNaVs,16958 -django/contrib/sessions/backends/cache.py,sha256=m9WMB8we8T1j0k9rHP9_7nBuGzDVap3rGMjoM7N5Xe4,4674 -django/contrib/sessions/backends/cached_db.py,sha256=m348hgYLr-rl760T-Yxm2FJmQ6vbI-nZ2vi5QhIybCI,4148 -django/contrib/sessions/backends/db.py,sha256=qoFg94ju0_KtsPUgFCiKAvxbMOXc1YdGAfjktn00nyA,6907 -django/contrib/sessions/backends/file.py,sha256=FtK6zcbQGwLxtINvqTRHNovLHTDuyk61Y7zwNndSUyg,8200 -django/contrib/sessions/backends/signed_cookies.py,sha256=Al_HQ7OnDs77U9AgTcjN5VUVst5dTP-ZUbhuj6Bgsk0,3218 -django/contrib/sessions/base_session.py,sha256=euTO04sxDEk0lovU38a2TLYXJBA-g6nze9asqK2PoNU,1491 -django/contrib/sessions/exceptions.py,sha256=KhkhXiFwfUflSP_t6wCLOEXz1YjBRTKVNbrLmGhOTLo,359 -django/contrib/sessions/locale/af/LC_MESSAGES/django.mo,sha256=0DS0pgVrMN-bUimDfesgHs8Lgr0loz2c6nJdz58RxyQ,717 -django/contrib/sessions/locale/af/LC_MESSAGES/django.po,sha256=ZJRLBshQCAiTTAUycdB3MZIadLeHR5LxbSlDvSWLnEo,838 -django/contrib/sessions/locale/ar/LC_MESSAGES/django.mo,sha256=yoepqaR68PTGLx--cAOzP94Sqyl5xIYpeQ0IFWgY380,846 -django/contrib/sessions/locale/ar/LC_MESSAGES/django.po,sha256=ZgwtBYIdtnqp_8nKHXF1NVJFzQU81-3yv9b7STrQHMc,995 -django/contrib/sessions/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=_iSasR22CxvNWfei6aE_24woPhhhvNzQl5FUO_649dc,817 -django/contrib/sessions/locale/ar_DZ/LC_MESSAGES/django.po,sha256=vop5scstamgFSnO_FWXCEnI7R1N26t7jy_mZUAfETcY,978 -django/contrib/sessions/locale/ast/LC_MESSAGES/django.mo,sha256=hz2m-PkrHby2CKfIOARj6kCzisT-Vs0syfDSTx_iVVw,702 -django/contrib/sessions/locale/ast/LC_MESSAGES/django.po,sha256=M90j1Nx6oDJ16hguUkfKYlyb5OymUeZ5xzPixWxSC7I,846 -django/contrib/sessions/locale/az/LC_MESSAGES/django.mo,sha256=_4XcYdtRasbCjRoaWGoULsXX2cEa--KdRdqbnGoaRuM,731 -django/contrib/sessions/locale/az/LC_MESSAGES/django.po,sha256=qYd7vz6A-hHQNwewzI6wEsxRVLdoc2xLGm1RPW0Hxc4,891 -django/contrib/sessions/locale/be/LC_MESSAGES/django.mo,sha256=FHZ72QuOd-vAOjOXisLs4CaEk7uZuzjO_EfUSB6754M,854 -django/contrib/sessions/locale/be/LC_MESSAGES/django.po,sha256=tHsYVn3XNTcukB0SrHUWP1iV763rrQHCimOyJHRPiek,1023 -django/contrib/sessions/locale/bg/LC_MESSAGES/django.mo,sha256=fFZ8EgRlJ1Z-IP8gPtsUXAnqVHbqQRZpYv6PLWNlNVA,759 -django/contrib/sessions/locale/bg/LC_MESSAGES/django.po,sha256=tXcaDPNmFIv0RU-7sGscRkLCbKEgTBowzVj3AYymarY,997 -django/contrib/sessions/locale/bn/LC_MESSAGES/django.mo,sha256=0BdFN7ou9tmoVG00fCA-frb1Tri3iKz43W7SWal398s,762 -django/contrib/sessions/locale/bn/LC_MESSAGES/django.po,sha256=LycmTel6LXV2HGGN6qzlAfID-cVEQCNnW1Nv_hbWXJk,909 -django/contrib/sessions/locale/br/LC_MESSAGES/django.mo,sha256=6ubPQUyXX08KUssyVZBMMkTlD94mlA6wzsteAMiZ8C8,1027 -django/contrib/sessions/locale/br/LC_MESSAGES/django.po,sha256=LKxGGHOQejKpUp18rCU2FXW8D_H3WuP_P6dPlEluwcE,1201 -django/contrib/sessions/locale/bs/LC_MESSAGES/django.mo,sha256=M7TvlJMrSUAFhp7oUSpUKejnbTuIK-19yiGBBECl9Sc,759 -django/contrib/sessions/locale/bs/LC_MESSAGES/django.po,sha256=Ur0AeRjXUsLgDJhcGiw75hRk4Qe98DzPBOocD7GFDRQ,909 -django/contrib/sessions/locale/ca/LC_MESSAGES/django.mo,sha256=tbaZ48PaihGGD9-2oTKiMFY3kbXjU59nNciCRINOBNk,738 -django/contrib/sessions/locale/ca/LC_MESSAGES/django.po,sha256=tJuJdehKuD9aXOauWOkE5idQhsVsLbeg1Usmc6N_SP0,906 -django/contrib/sessions/locale/ckb/LC_MESSAGES/django.mo,sha256=qTCUlxmStU9w1nXRAc_gRodaN6ojJK_XAxDXoYC5vQI,741 -django/contrib/sessions/locale/ckb/LC_MESSAGES/django.po,sha256=F2bHLL66fWF5_VTM5QvNUFakY7gPRDr1qCjW6AkYxec,905 -django/contrib/sessions/locale/cs/LC_MESSAGES/django.mo,sha256=wEFP4NNaRQDbcbw96UC906jN4rOrlPJMn60VloXr944,759 -django/contrib/sessions/locale/cs/LC_MESSAGES/django.po,sha256=7XkKESwfOmbDRDbUYr1f62-fDOuyI-aCqLGaEiDrmX8,962 -django/contrib/sessions/locale/cy/LC_MESSAGES/django.mo,sha256=GeWVeV2PvgLQV8ecVUA2g3-VvdzMsedgIDUSpn8DByk,774 -django/contrib/sessions/locale/cy/LC_MESSAGES/django.po,sha256=zo18MXtkEdO1L0Q6ewFurx3lsEWTCdh0JpQJTmvw5bY,952 -django/contrib/sessions/locale/da/LC_MESSAGES/django.mo,sha256=7_YecCzfeYQp9zVYt2B7MtjhAAuVb0BcK2D5Qv_uAbg,681 -django/contrib/sessions/locale/da/LC_MESSAGES/django.po,sha256=qX_Oo7niVo57bazlIYFA6bnVmPBclUUTWvZFYNLaG04,880 -django/contrib/sessions/locale/de/LC_MESSAGES/django.mo,sha256=N3kTal0YK9z7Te3zYGLbJmoSB6oWaviWDLGdPlsPa9g,721 -django/contrib/sessions/locale/de/LC_MESSAGES/django.po,sha256=0qnfDeCUQN2buKn6R0MvwhQP05XWxSu-xgvfxvnJe3k,844 -django/contrib/sessions/locale/dsb/LC_MESSAGES/django.mo,sha256=RABl3WZmY6gLh4IqmTUhoBEXygDzjp_5lLF1MU9U5fA,810 -django/contrib/sessions/locale/dsb/LC_MESSAGES/django.po,sha256=cItKs5tASYHzDxfTg0A_dgBQounpzoGyOEFn18E_W_g,934 -django/contrib/sessions/locale/el/LC_MESSAGES/django.mo,sha256=QbTbmcfgc8_4r5hFrIghDhk2XQ4f8_emKmqupMG2ah0,809 -django/contrib/sessions/locale/el/LC_MESSAGES/django.po,sha256=HeaEbpVmFhhrZt2NsZteYaYoeo8FYKZF0IoNJwtzZkc,971 -django/contrib/sessions/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/sessions/locale/en/LC_MESSAGES/django.po,sha256=afaM-IIUZtcRZduojUTS8tT0w7C4Ya9lXgReOvq_iF0,804 -django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.mo,sha256=FgY1K6IVyQjMjXqVZxcsyWW_Tu5ckfrbmIfNYq5P-_E,693 -django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.po,sha256=cMV15gJq8jNSUzkhn7uyOf2JYMFx7BNH1oFYa1vISnc,853 -django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.mo,sha256=T5NQCTYkpERfP9yKbUvixT0VdBt1zGmGB8ITlkVc420,707 -django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.po,sha256=1ks_VE1qpEfPcyKg0HybkTG0-DTttTHTfUPhQCR53sw,849 -django/contrib/sessions/locale/eo/LC_MESSAGES/django.mo,sha256=eBvYQbZS_WxVV3QCSZAOyHNIljC2ZXxVc4mktUuXVjI,727 -django/contrib/sessions/locale/eo/LC_MESSAGES/django.po,sha256=Ru9xicyTgHWVHh26hO2nQNFRQmwBnYKEagsS8TZRv3E,917 -django/contrib/sessions/locale/es/LC_MESSAGES/django.mo,sha256=jbHSvHjO2OCLlBD66LefocKOEbefWbPhj-l3NugiWuc,734 -django/contrib/sessions/locale/es/LC_MESSAGES/django.po,sha256=fY5WXeONEXHeuBlH0LkvzdZ2CSgbvLZ8BJc429aIbhI,909 -django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.mo,sha256=_8icF2dMUWj4WW967rc5npgndXBAdJrIiz_VKf5D-Rw,694 -django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.po,sha256=AnmvjeOA7EBTJ6wMOkCl8JRLVYRU8KS0egPijcKutns,879 -django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.mo,sha256=UP7ia0gV9W-l0Qq5AS4ZPadJtml8iuzzlS5C9guMgh8,754 -django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.po,sha256=_XeiiRWvDaGjofamsRHr5up_EQvcw0w-GLLeWK27Af8,878 -django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.mo,sha256=MDM0K3xMvyf8ymvAurHYuacpxfG_YfJFyNnp1uuc6yY,756 -django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.po,sha256=Y7VNa16F_yyK7_XJvF36rR2XNW8aBJK4UDweufyXpxE,892 -django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.mo,sha256=59fZBDut-htCj38ZUoqPjhXJPjZBz-xpU9__QFr3kLs,486 -django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.po,sha256=zWjgB0AmsmhX2tjk1PgldttqY56Czz8epOVCaYWXTLU,761 -django/contrib/sessions/locale/et/LC_MESSAGES/django.mo,sha256=aL1jZWourEC7jtjsuBZHD-Gw9lpL6L1SoqjTtzguxD0,737 -django/contrib/sessions/locale/et/LC_MESSAGES/django.po,sha256=VNBYohAOs59jYWkjVMY-v2zwVy5AKrtBbFRJZLwdCFg,899 -django/contrib/sessions/locale/eu/LC_MESSAGES/django.mo,sha256=M9piOB_t-ZnfN6pX-jeY0yWh2S_5cCuo1oGiy7X65A4,728 -django/contrib/sessions/locale/eu/LC_MESSAGES/django.po,sha256=bHdSoknoH0_dy26e93tWVdO4TT7rnCPXlSLPsYAhwyw,893 -django/contrib/sessions/locale/fa/LC_MESSAGES/django.mo,sha256=6DdJcqaYuBnhpFFHR42w-RqML0eQPFMAUEEDY0Redy8,755 -django/contrib/sessions/locale/fa/LC_MESSAGES/django.po,sha256=rklhNf0UFl2bM6mt7x9lWvfzPH4XWGbrW9Gc2w-9rzg,922 -django/contrib/sessions/locale/fi/LC_MESSAGES/django.mo,sha256=oAugvlTEvJmG8KsZw09WcfnifYY5oHnGo4lxcxqKeaY,721 -django/contrib/sessions/locale/fi/LC_MESSAGES/django.po,sha256=BVVrjbZZtLGAuZ9HK63p769CbjZFZMlS4BewSMfNMKU,889 -django/contrib/sessions/locale/fr/LC_MESSAGES/django.mo,sha256=aDGYdzx2eInF6IZ-UzPDEJkuYVPnvwVND3qVuSfJNWw,692 -django/contrib/sessions/locale/fr/LC_MESSAGES/django.po,sha256=hARxGdtBOzEZ_iVyzkNvcKlgyM8fOkdXTH3upj2XFYM,893 -django/contrib/sessions/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/sessions/locale/fy/LC_MESSAGES/django.po,sha256=U-VEY4WbmIkmrnPK4Mv-B-pbdtDzusBCVmE8iHyvzFU,751 -django/contrib/sessions/locale/ga/LC_MESSAGES/django.mo,sha256=zTrydRCRDiUQwF4tQ3cN1-5w36i6KptagsdA5_SaGy0,747 -django/contrib/sessions/locale/ga/LC_MESSAGES/django.po,sha256=Qpk1JaUWiHSEPdgBk-O_KfvGzwlZ4IAA6c6-nsJe400,958 -django/contrib/sessions/locale/gd/LC_MESSAGES/django.mo,sha256=Yi8blY_fUD5YTlnUD6YXZvv1qjm4QDriO6CJIUe1wIk,791 -django/contrib/sessions/locale/gd/LC_MESSAGES/django.po,sha256=fEa40AUqA5vh743Zqv0FO2WxSFXGYk4IzUR4BoaP-C4,890 -django/contrib/sessions/locale/gl/LC_MESSAGES/django.mo,sha256=lC8uu-mKxt48DLzRvaxz-mOqR0ZfvEuaBI1Hi_nuMpo,692 -django/contrib/sessions/locale/gl/LC_MESSAGES/django.po,sha256=L34leIfwmRJoqX0jfefbNHz0CmON5cSaRXeh7pmFqCY,943 -django/contrib/sessions/locale/he/LC_MESSAGES/django.mo,sha256=qhgjSWfGAOgl-i7iwzSrJttx88xcj1pB0iLkEK64mJU,809 -django/contrib/sessions/locale/he/LC_MESSAGES/django.po,sha256=KvQG6wOpokM-2JkhWnB2UUQacy5Ie1402K_pH2zUOu0,1066 -django/contrib/sessions/locale/hi/LC_MESSAGES/django.mo,sha256=naqxOjfAnNKy3qqnUG-4LGf9arLRJpjyWWmSj5tEfao,759 -django/contrib/sessions/locale/hi/LC_MESSAGES/django.po,sha256=WnTGvOz9YINMcUJg2BYCaHceZLKaTfsba_0AZtRNP38,951 -django/contrib/sessions/locale/hr/LC_MESSAGES/django.mo,sha256=axyJAmXmadpFxIhu8rroVD8NsGGadQemh9-_ZDo7L1U,819 -django/contrib/sessions/locale/hr/LC_MESSAGES/django.po,sha256=3G-qOYXBO-eMWWsa5LwTCW9M1oF0hlWgEz7hAK8hJqI,998 -django/contrib/sessions/locale/hsb/LC_MESSAGES/django.mo,sha256=_OXpOlCt4KU0i65Iw4LMjSsyn__E9wH20l9vDNBSEzw,805 -django/contrib/sessions/locale/hsb/LC_MESSAGES/django.po,sha256=yv3vX_UCDrdl07GQ79Mnytwgz2oTvySYOG9enzMpFJA,929 -django/contrib/sessions/locale/hu/LC_MESSAGES/django.mo,sha256=ik40LnsWkKYEUioJB9e11EX9XZ-qWMa-S7haxGhM-iI,727 -django/contrib/sessions/locale/hu/LC_MESSAGES/django.po,sha256=1-UWEEsFxRwmshP2x4pJbitWIGZ1YMeDDxnAX-XGNxc,884 -django/contrib/sessions/locale/hy/LC_MESSAGES/django.mo,sha256=x6VQWGdidRJFUJme-6jf1pcitktcQHQ7fhmw2UBej1Q,815 -django/contrib/sessions/locale/hy/LC_MESSAGES/django.po,sha256=eRMa3_A2Vx195mx2lvza1v-wcEcEeMrU63f0bgPPFjc,893 -django/contrib/sessions/locale/ia/LC_MESSAGES/django.mo,sha256=-o4aQPNJeqSDRSLqcKuYvJuKNBbFqDJDe3IzHgSgZeQ,744 -django/contrib/sessions/locale/ia/LC_MESSAGES/django.po,sha256=PULLDd3QOIU03kgradgQzT6IicoPhLPlUvFgRl-tGbA,869 -django/contrib/sessions/locale/id/LC_MESSAGES/django.mo,sha256=mOaIF0NGOO0-dt-nhHL-i3cfvt9-JKTbyUkFWPqDS9Y,705 -django/contrib/sessions/locale/id/LC_MESSAGES/django.po,sha256=EA6AJno3CaFOO-dEU9VQ_GEI-RAXS0v0uFqn1RJGjEs,914 -django/contrib/sessions/locale/io/LC_MESSAGES/django.mo,sha256=_rqAY6reegqmxmWc-pW8_kDaG9zflZuD-PGOVFsjRHo,683 -django/contrib/sessions/locale/io/LC_MESSAGES/django.po,sha256=tbKMxGuB6mh_m0ex9rO9KkTy6qyuRW2ERrQsGwmPiaw,840 -django/contrib/sessions/locale/is/LC_MESSAGES/django.mo,sha256=3QeMl-MCnBie9Sc_aQ1I7BrBhkbuArpoSJP95UEs4lg,706 -django/contrib/sessions/locale/is/LC_MESSAGES/django.po,sha256=LADIFJv8L5vgDJxiQUmKPSN64zzzrIKImh8wpLBEVWQ,853 -django/contrib/sessions/locale/it/LC_MESSAGES/django.mo,sha256=qTY3O-0FbbpZ5-BR5xOJWP0rlnIkBZf-oSawW_YJWlk,726 -django/contrib/sessions/locale/it/LC_MESSAGES/django.po,sha256=hEv0iTGLuUvEBk-lF-w7a9P3ifC0-eiodNtuSc7cXhg,869 -django/contrib/sessions/locale/ja/LC_MESSAGES/django.mo,sha256=hbv9FzWzXRIGRh_Kf_FLQB34xfmPU_9RQKn9u1kJqGU,757 -django/contrib/sessions/locale/ja/LC_MESSAGES/django.po,sha256=ppGx5ekOWGgDF3vzyrWsqnFUZ-sVZZhiOhvAzl_8v54,920 -django/contrib/sessions/locale/ka/LC_MESSAGES/django.mo,sha256=VZ-ysrDbea_-tMV-1xtlTeW62IAy2RWR94V3Y1iSh4U,803 -django/contrib/sessions/locale/ka/LC_MESSAGES/django.po,sha256=hqiWUiATlrc7qISF7ndlelIrFwc61kzhKje9l-DY6V4,955 -django/contrib/sessions/locale/kab/LC_MESSAGES/django.mo,sha256=W_yE0NDPJrVznA2Qb89VuprJNwyxSg59ovvjkQe6mAs,743 -django/contrib/sessions/locale/kab/LC_MESSAGES/django.po,sha256=FJeEuv4P3NT_PpWHEUsQVSWXu65nYkJ6Z2AlbSKb0ZA,821 -django/contrib/sessions/locale/kk/LC_MESSAGES/django.mo,sha256=FROGz_MuIhsIU5_-EYV38cHnRZrc3-OxxkBeK0ax9Rk,810 -django/contrib/sessions/locale/kk/LC_MESSAGES/django.po,sha256=P-oHO3Oi3V_RjWHjEAHdTrDfTwKP2xh3yJh7BlXL1VQ,1029 -django/contrib/sessions/locale/km/LC_MESSAGES/django.mo,sha256=VOuKsIG2DEeCA5JdheuMIeJlpmAhKrI6lD4KWYqIIPk,929 -django/contrib/sessions/locale/km/LC_MESSAGES/django.po,sha256=09i6Nd_rUK7UqFpJ70LMXTR6xS0NuGETRLe0CopMVBk,1073 -django/contrib/sessions/locale/kn/LC_MESSAGES/django.mo,sha256=TMZ71RqNR6zI20BeozyLa9cjYrWlvfIajGDfpnHd3pQ,810 -django/contrib/sessions/locale/kn/LC_MESSAGES/django.po,sha256=whdM8P74jkAAHvjgJN8Q77dYd9sIsf_135ID8KBu-a8,990 -django/contrib/sessions/locale/ko/LC_MESSAGES/django.mo,sha256=MAgc0EkV0IrWjC6bSvKiyRlGXtgjhZF-ltTuyAFNDUk,653 -django/contrib/sessions/locale/ko/LC_MESSAGES/django.po,sha256=Fn9KkX9fEOKu2WjUYsP_xHEBbdoDeFHSoE096ctnFFc,874 -django/contrib/sessions/locale/ky/LC_MESSAGES/django.mo,sha256=ME7YUgKOYQz9FF_IdrqHImieEONDrkcn4T3HxTZKSV0,742 -django/contrib/sessions/locale/ky/LC_MESSAGES/django.po,sha256=JZHTs9wYmlWzilRMyp-jZWFSzGxWtPiQefPmLL9yhtM,915 -django/contrib/sessions/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/sessions/locale/lb/LC_MESSAGES/django.po,sha256=3igeAnQjDg6D7ItBkQQhyBoFJOZlBxT7NoZiExwD-Fo,749 -django/contrib/sessions/locale/lt/LC_MESSAGES/django.mo,sha256=L9w8-qxlDlCqR_2P0PZegfhok_I61n0mJ1koJxzufy4,786 -django/contrib/sessions/locale/lt/LC_MESSAGES/django.po,sha256=dEefLGtg5flFr_v4vHS5HhK1kxx9WYWTw98cvEn132M,1023 -django/contrib/sessions/locale/lv/LC_MESSAGES/django.mo,sha256=exEzDUNwNS0GLsUkKPu_SfqBxU7T6VRA_T2schIQZ88,753 -django/contrib/sessions/locale/lv/LC_MESSAGES/django.po,sha256=fBgQEbsGg1ECVm1PFDrS2sfKs2eqmsqrSYzx9ELotNQ,909 -django/contrib/sessions/locale/mk/LC_MESSAGES/django.mo,sha256=4oTWp8-qzUQBiqG32hNieABgT3O17q2C4iEhcFtAxLA,816 -django/contrib/sessions/locale/mk/LC_MESSAGES/django.po,sha256=afApb5YRhPXUWR8yF_TTym73u0ov7lWiwRda1-uNiLY,988 -django/contrib/sessions/locale/ml/LC_MESSAGES/django.mo,sha256=tff5TsHILSV1kAAB3bzHQZDB9fgMglZJTofzCunGBzc,854 -django/contrib/sessions/locale/ml/LC_MESSAGES/django.po,sha256=eRkeupt42kUey_9vJmlH8USshnXPZ8M7aYHq88u-5iY,1016 -django/contrib/sessions/locale/mn/LC_MESSAGES/django.mo,sha256=CcCH2ggVYrD29Q11ZMthcscBno2ePkQDbZfoYquTRPM,784 -django/contrib/sessions/locale/mn/LC_MESSAGES/django.po,sha256=nvcjbJzXiDvWFXrM5CxgOQIq8XucsZEUVdYkY8LnCRE,992 -django/contrib/sessions/locale/mr/LC_MESSAGES/django.mo,sha256=rFOGgJ9q9AUlEV_XT-Sycs9eaDtD9so7ZNBTkI-E-Ew,768 -django/contrib/sessions/locale/mr/LC_MESSAGES/django.po,sha256=ZMojWauBzqXR7YSTJ5eAVAX4Xqbv6WEoYOpNL4GQaqU,907 -django/contrib/sessions/locale/ms/LC_MESSAGES/django.mo,sha256=rFi4D_ZURYUPjs5AqJ66bW70yL7AekAKWnrZRBvGPiE,649 -django/contrib/sessions/locale/ms/LC_MESSAGES/django.po,sha256=nZuJ_D0JZUzmGensLa7tSgzbBo05qgQcuHmte2oU6WQ,786 -django/contrib/sessions/locale/my/LC_MESSAGES/django.mo,sha256=8zzzyfJYok969YuAwDUaa6YhxaSi3wcXy3HRNXDb_70,872 -django/contrib/sessions/locale/my/LC_MESSAGES/django.po,sha256=mfs0zRBI0tugyyEfXBZzZ_FMIohydq6EYPZGra678pw,997 -django/contrib/sessions/locale/nb/LC_MESSAGES/django.mo,sha256=hfJ1NCFgcAAtUvNEpaZ9b31PyidHxDGicifUWANIbM8,717 -django/contrib/sessions/locale/nb/LC_MESSAGES/django.po,sha256=yXr6oYuiu01oELdQKuztQFWz8x5C2zS5OzEfU9MHJsU,908 -django/contrib/sessions/locale/ne/LC_MESSAGES/django.mo,sha256=slFgMrqGVtLRHdGorLGPpB09SM92_WnbnRR0rlpNlPQ,802 -django/contrib/sessions/locale/ne/LC_MESSAGES/django.po,sha256=1vyoiGnnaB8f9SFz8PGfzpw6V_NoL78DQwjjnB6fS98,978 -django/contrib/sessions/locale/nl/LC_MESSAGES/django.mo,sha256=84BTlTyxa409moKbQMFyJisI65w22p09qjJHBAmQe-g,692 -django/contrib/sessions/locale/nl/LC_MESSAGES/django.po,sha256=smRr-QPGm6h6hdXxghggWES8b2NnL7yDQ07coUypa8g,909 -django/contrib/sessions/locale/nn/LC_MESSAGES/django.mo,sha256=cytH72J3yS1PURcgyrD8R2PV5d3SbPE73IAqOMBPPVg,667 -django/contrib/sessions/locale/nn/LC_MESSAGES/django.po,sha256=y9l60yy_W3qjxWzxgJg5VgEH9KAIHIQb5hv7mgnep9w,851 -django/contrib/sessions/locale/os/LC_MESSAGES/django.mo,sha256=xVux1Ag45Jo9HQBbkrRzcWrNjqP09nMQl16jIh0YVlo,732 -django/contrib/sessions/locale/os/LC_MESSAGES/django.po,sha256=1hG5Vsz2a2yW05_Z9cTNrBKtK9VRPZuQdx4KJ_0n98o,892 -django/contrib/sessions/locale/pa/LC_MESSAGES/django.mo,sha256=qEx4r_ONwXK1-qYD5uxxXEQPqK5I6rf38QZoUSm7UVA,771 -django/contrib/sessions/locale/pa/LC_MESSAGES/django.po,sha256=M7fmVGP8DtZGEuTV3iJhuWWqILVUTDZvUey_mrP4_fM,918 -django/contrib/sessions/locale/pl/LC_MESSAGES/django.mo,sha256=F9CQb7gQ1ltP6B82JNKu8IAsTdHK5TNke0rtDIgNz3c,828 -django/contrib/sessions/locale/pl/LC_MESSAGES/django.po,sha256=C_MJBB-vwTZbx-t4-mzun-RxHhdOVv04b6xrWdnTv8E,1084 -django/contrib/sessions/locale/pt/LC_MESSAGES/django.mo,sha256=dlJF7hF4GjLmQPdAJhtf-FCKX26XsOmZlChOcxxIqPk,738 -django/contrib/sessions/locale/pt/LC_MESSAGES/django.po,sha256=cOycrw3HCHjSYBadpalyrg5LdRTlqZCTyMh93GOQ8O0,896 -django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.mo,sha256=XHNF5D8oXIia3e3LYwxd46a2JOgDc_ykvc8yuo21fT0,757 -django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.po,sha256=K_zxKaUKngWPFpvHgXOcymJEsiONSw-OrVrroRXmUUk,924 -django/contrib/sessions/locale/ro/LC_MESSAGES/django.mo,sha256=WR9I9Gum_pq7Qg2Gzhf-zAv43OwR_uDtsbhtx4Ta5gE,776 -django/contrib/sessions/locale/ro/LC_MESSAGES/django.po,sha256=fEgVxL_0Llnjspu9EsXBf8AVL0DGdfF7NgV88G7WN1E,987 -django/contrib/sessions/locale/ru/LC_MESSAGES/django.mo,sha256=n-8vXR5spEbdfyeWOYWC_6kBbAppNoRrWYgqKFY6gJA,913 -django/contrib/sessions/locale/ru/LC_MESSAGES/django.po,sha256=sNqNGdoof6eXzFlh4YIp1O54MdDOAFDjD3GvAFsNP8k,1101 -django/contrib/sessions/locale/sk/LC_MESSAGES/django.mo,sha256=Yntm624Wt410RwuNPU1c-WwQoyrRrBs69VlKMlNUHeQ,766 -django/contrib/sessions/locale/sk/LC_MESSAGES/django.po,sha256=wt7BJk6RpFogJ2Wwa9Mh0mJi9YMpNYKTUSDuDuv1Ong,975 -django/contrib/sessions/locale/sl/LC_MESSAGES/django.mo,sha256=EE6mB8BiYRyAxK6qzurRWcaYVs96FO_4rERYQdtIt3k,770 -django/contrib/sessions/locale/sl/LC_MESSAGES/django.po,sha256=KTjBWyvaNCHbpV9K6vbnavwxxXqf2DlIqVPv7MVFcO8,928 -django/contrib/sessions/locale/sq/LC_MESSAGES/django.mo,sha256=eRaTy3WOC76EYLtMSD4xtJj2h8eE4W-TS4VvCVxI5bw,683 -django/contrib/sessions/locale/sq/LC_MESSAGES/django.po,sha256=9pzp7834LQKafe5fJzC4OKsAd6XfgtEQl6K6hVLaBQM,844 -django/contrib/sessions/locale/sr/LC_MESSAGES/django.mo,sha256=ZDBOYmWIoSyDeT0nYIIFeMtW5jwpr257CbdTZlkVeRQ,855 -django/contrib/sessions/locale/sr/LC_MESSAGES/django.po,sha256=OXQOYeac0ghuzLrwaErJGr1FczuORTu2yroFX5hvRnk,1027 -django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=f3x9f9hTOsJltghjzJMdd8ueDwzxJex6zTXsU-_Hf_Y,757 -django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.po,sha256=HKjo7hjSAvgrIvlI0SkgF3zxz8TtKWyBT51UGNhDwek,946 -django/contrib/sessions/locale/sv/LC_MESSAGES/django.mo,sha256=SGbr0K_5iAMA22MfseAldMDgLSEBrI56pCtyV8tMAPc,707 -django/contrib/sessions/locale/sv/LC_MESSAGES/django.po,sha256=vraY3915wBYGeYu9Ro0-TlBeLWqGZP1fbckLv8y47Ys,853 -django/contrib/sessions/locale/sw/LC_MESSAGES/django.mo,sha256=Edhqp8yuBnrGtJqPO7jxobeXN4uU5wKSLrOsFO1F23k,743 -django/contrib/sessions/locale/sw/LC_MESSAGES/django.po,sha256=iY4rN4T-AA2FBQA7DiWWFvrclqKiDYQefqwwVw61-f8,858 -django/contrib/sessions/locale/ta/LC_MESSAGES/django.mo,sha256=qLIThhFQbJKc1_UVr7wVIm1rJfK2rO5m84BCB_oKq7s,801 -django/contrib/sessions/locale/ta/LC_MESSAGES/django.po,sha256=bYqtYf9XgP9IKKFJXh0u64JhRhDvPPUliI1J-NeRpKE,945 -django/contrib/sessions/locale/te/LC_MESSAGES/django.mo,sha256=kteZeivEckt4AmAeKgmgouMQo1qqSQrI8M42B16gMnQ,786 -django/contrib/sessions/locale/te/LC_MESSAGES/django.po,sha256=dQgiNS52RHrL6bV9CEO7Jk9lk3YUQrUBDCg_bP2OSZc,980 -django/contrib/sessions/locale/tg/LC_MESSAGES/django.mo,sha256=N6AiKfV47QTlO5Z_r4SQZXVLtouu-NVSwWkePgD17Tc,747 -django/contrib/sessions/locale/tg/LC_MESSAGES/django.po,sha256=wvvDNu060yqlTxy3swM0x3v6QpvCB9DkfNm0Q-kb9Xk,910 -django/contrib/sessions/locale/th/LC_MESSAGES/django.mo,sha256=D41vbkoYMdYPj3587p-c5yytLVi9pE5xvRZEYhZrxPs,814 -django/contrib/sessions/locale/th/LC_MESSAGES/django.po,sha256=43704TUv4ysKhL8T5MowZwlyv1JZrPyVGrpdIyb3r40,988 -django/contrib/sessions/locale/tk/LC_MESSAGES/django.mo,sha256=pT_hpKCwFT60GUXzD_4z8JOhmh1HRnkZj-QSouVEgUA,699 -django/contrib/sessions/locale/tk/LC_MESSAGES/django.po,sha256=trqXxfyIbh4V4szol0pXETmEWRxAAKywPZ9EzVMVE-I,865 -django/contrib/sessions/locale/tr/LC_MESSAGES/django.mo,sha256=STDnYOeO1d9nSCVf7pSkMq8R7z1aeqq-xAuIYjsofuE,685 -django/contrib/sessions/locale/tr/LC_MESSAGES/django.po,sha256=XYKo0_P5xitYehvjMzEw2MTp_Nza-cIXEECV3dA6BmY,863 -django/contrib/sessions/locale/tt/LC_MESSAGES/django.mo,sha256=Q-FGu_ljTsxXO_EWu7zCzGwoqFXkeoTzWSlvx85VLGc,806 -django/contrib/sessions/locale/tt/LC_MESSAGES/django.po,sha256=UC85dFs_1836noZTuZEzPqAjQMFfSvj7oGmEWOGcfCA,962 -django/contrib/sessions/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/sessions/locale/udm/LC_MESSAGES/django.po,sha256=CPml2Fn9Ax_qO5brCFDLPBoTiNdvsvJb1btQ0COwUfY,737 -django/contrib/sessions/locale/ug/LC_MESSAGES/django.mo,sha256=HMwjTByc3HrhFvCt_iOioYZE7JEKLzNlb2DTu6TCgto,748 -django/contrib/sessions/locale/ug/LC_MESSAGES/django.po,sha256=QEdIUuvVMFbOPSCYs6k-61rBwmTUXFCcR1pKn53dXtQ,864 -django/contrib/sessions/locale/uk/LC_MESSAGES/django.mo,sha256=jzNrLuFghQMCHNRQ0ihnKMCicgear0yWiTOLnvdPszw,841 -django/contrib/sessions/locale/uk/LC_MESSAGES/django.po,sha256=4K2geuGjRpJCtNfGPMhYWZlGxUy5xzIoDKA2jL2iGos,1171 -django/contrib/sessions/locale/ur/LC_MESSAGES/django.mo,sha256=FkGIiHegr8HR8zjVyJ9TTW1T9WYtAL5Mg77nRKnKqWk,729 -django/contrib/sessions/locale/ur/LC_MESSAGES/django.po,sha256=qR4QEBTP6CH09XFCzsPSPg2Dv0LqzbRV_I67HO2OUwk,879 -django/contrib/sessions/locale/uz/LC_MESSAGES/django.mo,sha256=asPu0RhMB_Ui1li-OTVL4qIXnM9XpjsYyx5yJldDYBY,744 -django/contrib/sessions/locale/uz/LC_MESSAGES/django.po,sha256=KsHuLgGJt-KDH0h6ND7JLP2dDJAdLVHSlau4DkkfqA8,880 -django/contrib/sessions/locale/vi/LC_MESSAGES/django.mo,sha256=KriTpT-Hgr10DMnY5Bmbd4isxmSFLmav8vg2tuL2Bb8,679 -django/contrib/sessions/locale/vi/LC_MESSAGES/django.po,sha256=M7S46Q0Q961ykz_5FCAN8SXQ54w8tp4rZeZpy6bPtXs,909 -django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=zsbhIMocgB8Yn1XEBxbIIbBh8tLifvvYNlhe5U61ch8,722 -django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.po,sha256=tPshgXjEv6pME4N082ztamJhd5whHB2_IV_egdP-LlQ,889 -django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=l6mWJJ_Lbfn3GsvmblZMtyXzgzqgIgroAOCg3DdzQyI,676 -django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.po,sha256=MRV_86xy4ILP46qZtxkHGJwWEvXwF5XAvJ16LNMdx3Q,904 -django/contrib/sessions/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sessions/management/__pycache__/__init__.cpython-310.pyc,, -django/contrib/sessions/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sessions/management/commands/__pycache__/__init__.cpython-310.pyc,, -django/contrib/sessions/management/commands/__pycache__/clearsessions.cpython-310.pyc,, -django/contrib/sessions/management/commands/clearsessions.py,sha256=pAiO5o7zgButVlYAV93bPnmiwzWP7V5N7-xPtxSkjJg,661 -django/contrib/sessions/middleware.py,sha256=ziZex9xiqxBYl9SC91i4QIDYuoenz4OoKaNO7sXu8kQ,3483 -django/contrib/sessions/migrations/0001_initial.py,sha256=KqQ44jk-5RNcTdqUv95l_UnoMA8cP5O-0lrjoJ8vabk,1148 -django/contrib/sessions/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sessions/migrations/__pycache__/0001_initial.cpython-310.pyc,, -django/contrib/sessions/migrations/__pycache__/__init__.cpython-310.pyc,, -django/contrib/sessions/models.py,sha256=BguwuQSDzpeTNXhteYRAcspg1rop431tjFeZUVWZNYc,1250 -django/contrib/sessions/serializers.py,sha256=S9oDsUAjFv2MTlLQA6AoehggKyHXpu6-Qnrqybhgvkg,106 -django/contrib/sitemaps/__init__.py,sha256=hZuWQsKCQHfgPOx1GQPETMzTT9oqzcpp2wDMfGiLhp8,6923 -django/contrib/sitemaps/__pycache__/__init__.cpython-310.pyc,, -django/contrib/sitemaps/__pycache__/apps.cpython-310.pyc,, -django/contrib/sitemaps/__pycache__/views.cpython-310.pyc,, -django/contrib/sitemaps/apps.py,sha256=xYE-mAs37nL8ZAnv052LhUKVUwGYKB3xyPy4t8pwOpw,249 -django/contrib/sitemaps/templates/sitemap.xml,sha256=L092SHTtwtmNJ_Lj_jLrzHhfI0-OKKIw5fpyOfr4qRs,683 -django/contrib/sitemaps/templates/sitemap_index.xml,sha256=SQf9avfFmnT8j-nLEc8lVQQcdhiy_qhnqjssIMti3oU,360 -django/contrib/sitemaps/views.py,sha256=WoBVQN0jHzjrhuB-_tMdbC8S1Hb9TAnVyL1Kk3CcGM4,4657 -django/contrib/sites/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sites/__pycache__/__init__.cpython-310.pyc,, -django/contrib/sites/__pycache__/admin.cpython-310.pyc,, -django/contrib/sites/__pycache__/apps.cpython-310.pyc,, -django/contrib/sites/__pycache__/checks.cpython-310.pyc,, -django/contrib/sites/__pycache__/management.cpython-310.pyc,, -django/contrib/sites/__pycache__/managers.cpython-310.pyc,, -django/contrib/sites/__pycache__/middleware.cpython-310.pyc,, -django/contrib/sites/__pycache__/models.cpython-310.pyc,, -django/contrib/sites/__pycache__/requests.cpython-310.pyc,, -django/contrib/sites/__pycache__/shortcuts.cpython-310.pyc,, -django/contrib/sites/admin.py,sha256=IWvGDQUTDPEUsd-uuxfHxJq4syGtddNKUdkP0nmVUMA,214 -django/contrib/sites/apps.py,sha256=uBLHUyQoSuo1Q7NwLTwlvsTuRU1MXwj4t6lRUnIBdwk,562 -django/contrib/sites/checks.py,sha256=AydGM1G1L9mvmTbNMTXRbZzPbHpIiknkRzLh5uFQLLI,366 -django/contrib/sites/locale/af/LC_MESSAGES/django.mo,sha256=A10bZFMs-wUetVfF5UrFwmuiKnN4ZnlrR4Rx8U4Ut1A,786 -django/contrib/sites/locale/af/LC_MESSAGES/django.po,sha256=O0-ZRvmXvV_34kONuqakuXV5OmYbQ569K1Puj3qQNac,907 -django/contrib/sites/locale/ar/LC_MESSAGES/django.mo,sha256=kLoytp2jvhWn6p1c8kNVua2sYAMnrpS4xnbluHD22Vs,947 -django/contrib/sites/locale/ar/LC_MESSAGES/django.po,sha256=HYA3pA29GktzXBP-soUEn9VP2vkZuhVIXVA8TNPCHCs,1135 -django/contrib/sites/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=-ltwY57Th6LNqU3bgOPPP7qWtII5c6rj8Dv8eY7PZ84,918 -django/contrib/sites/locale/ar_DZ/LC_MESSAGES/django.po,sha256=KRTjZ2dFRWVPmE_hC5Hq8eDv3GQs3yQKCgV5ISFmEKk,1079 -django/contrib/sites/locale/ast/LC_MESSAGES/django.mo,sha256=eEvaeiGnZFBPGzKLlRz4M9AHemgJVAb-yNpbpxRqtd0,774 -django/contrib/sites/locale/ast/LC_MESSAGES/django.po,sha256=huBohKzLpdaJRFMFXXSDhDCUOqVqyWXfxb8_lLOkUd0,915 -django/contrib/sites/locale/az/LC_MESSAGES/django.mo,sha256=CjAGI4qGoXN95q4LpCLXLKvaNB33Ocf5SfXdurFBkas,773 -django/contrib/sites/locale/az/LC_MESSAGES/django.po,sha256=E84kNPFhgHmIfYT0uzCnTPGwPkAqKzqwFvJB7pETbVo,933 -django/contrib/sites/locale/be/LC_MESSAGES/django.mo,sha256=HGh78mI50ZldBtQ8jId26SI-lSHv4ZLcveRN2J8VzH8,983 -django/contrib/sites/locale/be/LC_MESSAGES/django.po,sha256=W5FhVJKcmd3WHl2Lpd5NJUsc7_sE_1Pipk3CVPoGPa4,1152 -django/contrib/sites/locale/bg/LC_MESSAGES/django.mo,sha256=a2R52umIQIhnzFaFYSRhQ6nBlywE8RGMj2FUOFmyb0A,904 -django/contrib/sites/locale/bg/LC_MESSAGES/django.po,sha256=awB8RMS-qByhNB6eH2f0Oyxb3SH8waLhrZ--rokGfaI,1118 -django/contrib/sites/locale/bn/LC_MESSAGES/django.mo,sha256=cI3a9_L-OC7gtdyRNaGX7A5w0Za0M4ERnYB7rSNkuRU,925 -django/contrib/sites/locale/bn/LC_MESSAGES/django.po,sha256=8ZxYF16bgtTZSZRZFok6IJxUV02vIztoVx2qXqwO8NM,1090 -django/contrib/sites/locale/br/LC_MESSAGES/django.mo,sha256=rI_dIznbwnadZbxOPtQxZ1pGYePNwcNNXt05iiPkchU,1107 -django/contrib/sites/locale/br/LC_MESSAGES/django.po,sha256=7Ein5Xw73DNGGtdd595Bx6ixfSD-dBXZNBUU44pSLuQ,1281 -django/contrib/sites/locale/bs/LC_MESSAGES/django.mo,sha256=bDeqQNme586LnQRQdvOWaLGZssjOoECef3vMq_OCXno,692 -django/contrib/sites/locale/bs/LC_MESSAGES/django.po,sha256=xRTWInDNiLxikjwsjgW_pYjhy24zOro90-909ns9fig,923 -django/contrib/sites/locale/ca/LC_MESSAGES/django.mo,sha256=lEUuQEpgDY3bVWzRONrPzYlojRoNduT16_oYDkkbdfk,791 -django/contrib/sites/locale/ca/LC_MESSAGES/django.po,sha256=aORAoVn69iG1ynmEfnkBzBO-UZOzzbkPVOU-ZvfMtZg,996 -django/contrib/sites/locale/ckb/LC_MESSAGES/django.mo,sha256=Chp4sX73l_RFw4aaf9x67vEO1_cM8eh5c0URKBgMU-Q,843 -django/contrib/sites/locale/ckb/LC_MESSAGES/django.po,sha256=2NPav4574kEwTS_nZTUoVbYxJFzsaC5MdQUCD9iqC6E,1007 -django/contrib/sites/locale/cs/LC_MESSAGES/django.mo,sha256=mnXnpU7sLDTJ3OrIUTnGarPYsupNIUPV4ex_BPWU8fk,827 -django/contrib/sites/locale/cs/LC_MESSAGES/django.po,sha256=ONzFlwzmt7p5jdp6111qQkkevckRrd7GNS0lkDPKu-4,1035 -django/contrib/sites/locale/cy/LC_MESSAGES/django.mo,sha256=70pOie0K__hkmM9oBUaQfVwHjK8Cl48E26kRQL2mtew,835 -django/contrib/sites/locale/cy/LC_MESSAGES/django.po,sha256=FAZrVc72x-4R1A-1qYOBwADoXngC_F6FO8nRjr5-Z6g,1013 -django/contrib/sites/locale/da/LC_MESSAGES/django.mo,sha256=FTOyV1DIH9sMldyjgPw98d2HCotoO4zJ_KY_C9DCB7Y,753 -django/contrib/sites/locale/da/LC_MESSAGES/django.po,sha256=Po1Z6u52CFCyz9hLfK009pMbZzZgHrBse0ViX8wCYm8,957 -django/contrib/sites/locale/de/LC_MESSAGES/django.mo,sha256=5Q6X0_bDQ1ZRpkTy7UpPNzrhmQsB9Q0P1agB7koRyzs,792 -django/contrib/sites/locale/de/LC_MESSAGES/django.po,sha256=aD0wBinqtDUPvBbwtHrLEhFdoVRx1nOh17cJFuWhN3U,980 -django/contrib/sites/locale/dsb/LC_MESSAGES/django.mo,sha256=pPpWYsYp81MTrqCsGF0QnGktZNIll70bdBwSkuVE8go,868 -django/contrib/sites/locale/dsb/LC_MESSAGES/django.po,sha256=IA3G8AKJls20gzfxnrfPzivMNpL8A0zBQBg7OyzrP6g,992 -django/contrib/sites/locale/el/LC_MESSAGES/django.mo,sha256=G9o1zLGysUePGzZRicQ2aIIrc2UXMLTQmdpbrUMfWBU,878 -django/contrib/sites/locale/el/LC_MESSAGES/django.po,sha256=RBi_D-_znYuV6LXfTlSOf1Mvuyl96fIyEoiZ-lgeyWs,1133 -django/contrib/sites/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/sites/locale/en/LC_MESSAGES/django.po,sha256=tSjfrNZ_FqLHsXjm5NuTyo5-JpdlPLsPZjFqF2APhy8,817 -django/contrib/sites/locale/en_AU/LC_MESSAGES/django.mo,sha256=G--2j_CR99JjRgVIX2Y_5pDfO7IgIkvK4kYHZtGzpxU,753 -django/contrib/sites/locale/en_AU/LC_MESSAGES/django.po,sha256=Giw634r94MJT1Q3qgqM7gZakQCasRM9Dm7MDkb9JOc8,913 -django/contrib/sites/locale/en_GB/LC_MESSAGES/django.mo,sha256=FbSh7msJdrHsXr0EtDMuODFzSANG_HJ3iBlW8ePpqFs,639 -django/contrib/sites/locale/en_GB/LC_MESSAGES/django.po,sha256=Ib-DIuTWlrN3kg99kLCuqWJVtt1NWaFD4UbDFK6d4KY,862 -django/contrib/sites/locale/eo/LC_MESSAGES/django.mo,sha256=N4KkH12OHxic3pp1okeBhpfDx8XxxpULk3UC219vjWU,792 -django/contrib/sites/locale/eo/LC_MESSAGES/django.po,sha256=ymXSJaFJWGBO903ObqR-ows-p4T3KyUplc_p_3r1uk8,1043 -django/contrib/sites/locale/es/LC_MESSAGES/django.mo,sha256=qLN1uoCdslxdYWgdjgSBi7szllP-mQZtHbuZnNOthsQ,804 -django/contrib/sites/locale/es/LC_MESSAGES/django.po,sha256=QClia2zY39269VSQzkQsLwwukthN6u2JBsjbLNxA1VQ,1066 -django/contrib/sites/locale/es_AR/LC_MESSAGES/django.mo,sha256=_O4rVk7IM2BBlZvjDP2SvTOo8WWqthQi5exQzt027-s,776 -django/contrib/sites/locale/es_AR/LC_MESSAGES/django.po,sha256=RwyNylXbyxdSXn6qRDXd99-GaEPlmr6TicHTUW0boaQ,969 -django/contrib/sites/locale/es_CO/LC_MESSAGES/django.mo,sha256=a4Xje2M26wyIx6Wlg6puHo_OXjiDEy7b0FquT9gbThA,825 -django/contrib/sites/locale/es_CO/LC_MESSAGES/django.po,sha256=9bnRhVD099JzkheO80l65dufjuawsj9aSFgFu5A-lnM,949 -django/contrib/sites/locale/es_MX/LC_MESSAGES/django.mo,sha256=AtGta5jBL9XNBvfSpsCcnDtDhvcb89ALl4hNjSPxibM,809 -django/contrib/sites/locale/es_MX/LC_MESSAGES/django.po,sha256=TnkpQp-7swH-x9cytUJe-QJRd2n_pYMVo0ltDw9Pu8o,991 -django/contrib/sites/locale/es_VE/LC_MESSAGES/django.mo,sha256=59fZBDut-htCj38ZUoqPjhXJPjZBz-xpU9__QFr3kLs,486 -django/contrib/sites/locale/es_VE/LC_MESSAGES/django.po,sha256=8PWXy2L1l67wDIi98Q45j7OpVITr0Lt4zwitAnB-d_o,791 -django/contrib/sites/locale/et/LC_MESSAGES/django.mo,sha256=I2E-49UQsG-F26OeAfnKlfUdA3YCkUSV8ffA-GMSkE0,788 -django/contrib/sites/locale/et/LC_MESSAGES/django.po,sha256=mEfD6EyQ15PPivb5FTlkabt3Lo_XGtomI9XzHrrh34Y,992 -django/contrib/sites/locale/eu/LC_MESSAGES/django.mo,sha256=1HTAFI3DvTAflLJsN7NVtSd4XOTlfoeLGFyYCOX69Ec,807 -django/contrib/sites/locale/eu/LC_MESSAGES/django.po,sha256=NWxdE5-mF6Ak4nPRpCFEgAMIsVDe9YBEZl81v9kEuX8,1023 -django/contrib/sites/locale/fa/LC_MESSAGES/django.mo,sha256=odtsOpZ6noNqwDb18HDc2e6nz3NMsa-wrTN-9dk7d9w,872 -django/contrib/sites/locale/fa/LC_MESSAGES/django.po,sha256=-DirRvcTqcpIy90QAUiCSoNkCDRifqpWSzLriJ4cwQU,1094 -django/contrib/sites/locale/fi/LC_MESSAGES/django.mo,sha256=I5DUeLk1ChUC32q5uzriABCLLJpJKNbEK4BfqylPQzg,786 -django/contrib/sites/locale/fi/LC_MESSAGES/django.po,sha256=LH2sFIKM3YHPoz9zIu10z1DFv1svXphBdOhXNy4a17s,929 -django/contrib/sites/locale/fr/LC_MESSAGES/django.mo,sha256=W7Ne5HqgnRcl42njzbUaDSY059jdhwvr0tgZzecVWD8,756 -django/contrib/sites/locale/fr/LC_MESSAGES/django.po,sha256=u24rHDJ47AoBgcmBwI1tIescAgbjFxov6y906H_uhK0,999 -django/contrib/sites/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/sites/locale/fy/LC_MESSAGES/django.po,sha256=Yh6Lw0QI2Me0zCtlyXraFLjERKqklB6-IJLDTjH_jTs,781 -django/contrib/sites/locale/ga/LC_MESSAGES/django.mo,sha256=RKnHbMHTD4CAxNU6SXQ6jCbgzqDIZZuGOFcdX_baCA4,814 -django/contrib/sites/locale/ga/LC_MESSAGES/django.po,sha256=fqY_eHIE04JxXXyi5ZECLMzcfyG0ZXasxG6ZIErkcrQ,1058 -django/contrib/sites/locale/gd/LC_MESSAGES/django.mo,sha256=df4XIGGD6FIyMUXsb-SoSqNfBFAsRXf4qYtolh_C964,858 -django/contrib/sites/locale/gd/LC_MESSAGES/django.po,sha256=NPKp7A5-y-MR7r8r4WqtcVQJEHCIOP5mLTd0cIfUsug,957 -django/contrib/sites/locale/gl/LC_MESSAGES/django.mo,sha256=tiRYDFC1_V2n1jkEQqhjjQBdZzFkhxzNfHIzG2l3PX4,728 -django/contrib/sites/locale/gl/LC_MESSAGES/django.po,sha256=DNY_rv6w6VrAu3hMUwx3cgLLyH4PFfgaJ9dSKfLBrpI,979 -django/contrib/sites/locale/he/LC_MESSAGES/django.mo,sha256=L3bganfG4gHqp2WXGh4rfWmmbaIxHaGc7-ypAqjSL_E,820 -django/contrib/sites/locale/he/LC_MESSAGES/django.po,sha256=iO3OZwz2aiuAzugkKp5Hxonwdg3kKjBurxR685J2ZMk,1082 -django/contrib/sites/locale/hi/LC_MESSAGES/django.mo,sha256=J4oIS1vJnCvdCCUD4tlTUVyTe4Xn0gKcWedfhH4C0t0,665 -django/contrib/sites/locale/hi/LC_MESSAGES/django.po,sha256=INBrm37jL3okBHuzX8MSN1vMptj77a-4kwQkAyt8w_8,890 -django/contrib/sites/locale/hr/LC_MESSAGES/django.mo,sha256=KjDUhEaOuYSMexcURu2UgfkatN2rrUcAbCUbcpVSInk,876 -django/contrib/sites/locale/hr/LC_MESSAGES/django.po,sha256=-nFMFkVuDoKYDFV_zdNULOqQlnqtiCG57aakN5hqlmg,1055 -django/contrib/sites/locale/hsb/LC_MESSAGES/django.mo,sha256=RyHVb7u9aRn5BXmWzR1gApbZlOioPDJ59ufR1Oo3e8Y,863 -django/contrib/sites/locale/hsb/LC_MESSAGES/django.po,sha256=Aq54y5Gb14bIt28oDDrFltnSOk31Z2YalwaJMDMXfWc,987 -django/contrib/sites/locale/hu/LC_MESSAGES/django.mo,sha256=P--LN84U2BeZAvRVR-OiWl4R02cTTBi2o8XR2yHIwIU,796 -django/contrib/sites/locale/hu/LC_MESSAGES/django.po,sha256=b0VhyFdNaZZR5MH1vFsLL69FmICN8Dz-sTRk0PdK49E,953 -django/contrib/sites/locale/hy/LC_MESSAGES/django.mo,sha256=Hs9XwRHRkHicLWt_NvWvr7nMocmY-Kc8XphhVSAMQRc,906 -django/contrib/sites/locale/hy/LC_MESSAGES/django.po,sha256=MU4hXXGfjXKfYcjxDYzFfsEUIelz5ZzyQLkeSrUQKa0,1049 -django/contrib/sites/locale/ia/LC_MESSAGES/django.mo,sha256=gRMs-W5EiY26gqzwnDXEMbeb1vs0bYZ2DC2a9VCciew,809 -django/contrib/sites/locale/ia/LC_MESSAGES/django.po,sha256=HXZzn9ACIqfR2YoyvpK2FjZ7QuEq_RVZ1kSC4nxMgeg,934 -django/contrib/sites/locale/id/LC_MESSAGES/django.mo,sha256=__2E_2TmVUcbf1ygxtS1lHvkhv8L0mdTAtJpBsdH24Y,791 -django/contrib/sites/locale/id/LC_MESSAGES/django.po,sha256=e5teAHiMjLR8RDlg8q99qtW-K81ltcIiBIdb1MZw2sE,1000 -django/contrib/sites/locale/io/LC_MESSAGES/django.mo,sha256=W-NP0b-zR1oWUZnHZ6fPu5AC2Q6o7nUNoxssgeguUBo,760 -django/contrib/sites/locale/io/LC_MESSAGES/django.po,sha256=G4GUUz3rxoBjWTs-j5RFCvv52AEHiwrCBwom5hYeBSE,914 -django/contrib/sites/locale/is/LC_MESSAGES/django.mo,sha256=lkJgTzDjh5PNfIJpOS2DxKmwVUs9Sl5XwFHv4YdCB30,812 -django/contrib/sites/locale/is/LC_MESSAGES/django.po,sha256=1DVgAcHSZVyDd5xn483oqICIG4ooyZY8ko7A3aDogKM,976 -django/contrib/sites/locale/it/LC_MESSAGES/django.mo,sha256=6NQjjtDMudnAgnDCkemOXinzX0J-eAE5gSq1F8kjusY,795 -django/contrib/sites/locale/it/LC_MESSAGES/django.po,sha256=zxavlLMmp1t1rCDsgrw12kVgxiK5EyR_mOalSu8-ws8,984 -django/contrib/sites/locale/ja/LC_MESSAGES/django.mo,sha256=RNuCS6wv8uK5TmXkSH_7SjsbUFkf24spZfTsvfoTKro,814 -django/contrib/sites/locale/ja/LC_MESSAGES/django.po,sha256=e-cj92VOVc5ycIY6NwyFh5bO7Q9q5vp5CG4dOzd_eWQ,982 -django/contrib/sites/locale/ka/LC_MESSAGES/django.mo,sha256=m8GTqr9j0ijn0YJhvnsYwlk5oYcASKbHg_5hLqZ91TI,993 -django/contrib/sites/locale/ka/LC_MESSAGES/django.po,sha256=1upohcHrQH9T34b6lW09MTtFkk5WswdYOLs2vMAJIuE,1160 -django/contrib/sites/locale/kab/LC_MESSAGES/django.mo,sha256=Utdj5gH5YPeaYMjeMzF-vjqYvYTCipre2qCBkEJSc-Y,808 -django/contrib/sites/locale/kab/LC_MESSAGES/django.po,sha256=d78Z-YanYZkyP5tpasj8oAa5RimVEmce6dlq5vDSscA,886 -django/contrib/sites/locale/kk/LC_MESSAGES/django.mo,sha256=T2dTZ83vBRfQb2dRaKOrhvO00BHQu_2bu0O0k7RsvGA,895 -django/contrib/sites/locale/kk/LC_MESSAGES/django.po,sha256=HvdSFqsumyNurDJ6NKVLjtDdSIg0KZN2v29dM748GtU,1062 -django/contrib/sites/locale/km/LC_MESSAGES/django.mo,sha256=Q7pn5E4qN957j20-iCHgrfI-p8sm3Tc8O2DWeuH0By8,701 -django/contrib/sites/locale/km/LC_MESSAGES/django.po,sha256=TOs76vlCMYOZrdHgXPWZhQH1kTBQTpzsDJ8N4kbJQ7E,926 -django/contrib/sites/locale/kn/LC_MESSAGES/django.mo,sha256=_jl_4_39oe940UMyb15NljGOd45kkCeVNpJy6JvGWTE,673 -django/contrib/sites/locale/kn/LC_MESSAGES/django.po,sha256=cMPXF2DeiQuErhyFMe4i7swxMoqoz1sqtBEXf4Ghx1c,921 -django/contrib/sites/locale/ko/LC_MESSAGES/django.mo,sha256=OSr4OPZCkJqp2ymg32reatGzafM5Qq8fY4D4Dl21Cqk,744 -django/contrib/sites/locale/ko/LC_MESSAGES/django.po,sha256=Lekvcfi1xH8QVwFeSbKU3i26w71ALRy5rbPi3xS03Bw,1052 -django/contrib/sites/locale/ky/LC_MESSAGES/django.mo,sha256=IYxp8jG5iyN81h7YJqOiSQdOH7DnwOiIvelKZfzP6ZA,811 -django/contrib/sites/locale/ky/LC_MESSAGES/django.po,sha256=rxPdgQoBtGQSi5diOy3MXyoM4ffpwdWCc4WE3pjIHEI,927 -django/contrib/sites/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/sites/locale/lb/LC_MESSAGES/django.po,sha256=1yRdK9Zyh7kcWG7wUexuF9-zxEaKLS2gG3ggVOHbRJ8,779 -django/contrib/sites/locale/lt/LC_MESSAGES/django.mo,sha256=bK6PJtd7DaOgDukkzuqos5ktgdjSF_ffL9IJTQY839s,869 -django/contrib/sites/locale/lt/LC_MESSAGES/django.po,sha256=T-vdVqs9KCz9vMs9FfushgZN9z7LQOT-C86D85H2X8c,1195 -django/contrib/sites/locale/lv/LC_MESSAGES/django.mo,sha256=t9bQiVqpAmXrq8QijN4Lh0n6EGUGQjnuH7hDcu21z4c,823 -django/contrib/sites/locale/lv/LC_MESSAGES/django.po,sha256=vMaEtXGosD3AcTomiuctbOpjLes8TRBnumLe8DC4yq4,1023 -django/contrib/sites/locale/mk/LC_MESSAGES/django.mo,sha256=_YXasRJRWjYmmiEWCrAoqnrKuHHPBG_v_EYTUe16Nfo,885 -django/contrib/sites/locale/mk/LC_MESSAGES/django.po,sha256=AgdIjiSpN0P5o5rr5Ie4sFhnmS5d4doB1ffk91lmOvY,1062 -django/contrib/sites/locale/ml/LC_MESSAGES/django.mo,sha256=axNQVBY0nbR7hYa5bzNtdxB17AUOs2WXhu0Rg--FA3Q,1007 -django/contrib/sites/locale/ml/LC_MESSAGES/django.po,sha256=Sg7hHfK8OMs05ebtTv8gxS6_2kZv-OODwf7okP95Jtk,1169 -django/contrib/sites/locale/mn/LC_MESSAGES/django.mo,sha256=w2sqJRAe0wyz_IuCZ_Ocubs_VHL6wV1BcutWPz0dseQ,867 -django/contrib/sites/locale/mn/LC_MESSAGES/django.po,sha256=Zh_Eao0kLZsrQ8wkL1f-pRrsAtNJOspu45uStq5t8Mo,1127 -django/contrib/sites/locale/mr/LC_MESSAGES/django.mo,sha256=CudEHmP5qNvQ-BfEBOoYMh0qGVw80m-wgeu7eh7zaCQ,884 -django/contrib/sites/locale/mr/LC_MESSAGES/django.po,sha256=FtdCo3O-35EIuOP5OOQU8afWDCbn4ge2lmxjVAYtbGU,1023 -django/contrib/sites/locale/ms/LC_MESSAGES/django.mo,sha256=GToJlS8yDNEy-D3-p7p8ZlWEZYHlSzZAcVIH5nQEkkI,727 -django/contrib/sites/locale/ms/LC_MESSAGES/django.po,sha256=_4l4DCIqSWZtZZNyfzpBA0V-CbAaHe9Ckz06VLbTjFo,864 -django/contrib/sites/locale/my/LC_MESSAGES/django.mo,sha256=jN59e9wRheZYx1A4t_BKc7Hx11J5LJg2wQRd21aQv08,961 -django/contrib/sites/locale/my/LC_MESSAGES/django.po,sha256=EhqYIW5-rX33YjsDsBwfiFb3BK6fZKVc3CRYeJpZX1E,1086 -django/contrib/sites/locale/nb/LC_MESSAGES/django.mo,sha256=AaiHGcmcciy5IMBPVAShcc1OQOETJvBCv7GYHMcIQMA,793 -django/contrib/sites/locale/nb/LC_MESSAGES/django.po,sha256=936zoN1sPSiiq7GuH01umrw8W6BtymYEU3bCfOQyfWE,1000 -django/contrib/sites/locale/ne/LC_MESSAGES/django.mo,sha256=n96YovpBax3T5VZSmIfGmd7Zakn9FJShJs5rvUX7Kf0,863 -django/contrib/sites/locale/ne/LC_MESSAGES/django.po,sha256=B14rhDd8GAaIjxd1sYjxO2pZfS8gAwZ1C-kCdVkRXho,1078 -django/contrib/sites/locale/nl/LC_MESSAGES/django.mo,sha256=ghu-tNPNZuE4sVRDWDVmmmVNPYZLWYm_UPJRqh8wmec,735 -django/contrib/sites/locale/nl/LC_MESSAGES/django.po,sha256=1DCQNzMRhy4vW-KkmlPGy58UR27Np5ilmYhmjaq-8_k,1030 -django/contrib/sites/locale/nn/LC_MESSAGES/django.mo,sha256=eSW8kwbzm2HsE9s9IRCsAo9juimVQjcfdd8rtl3TQJM,731 -django/contrib/sites/locale/nn/LC_MESSAGES/django.po,sha256=OOyvE7iji9hwvz8Z_OxWoKw2e3ptk3dqeqlriXgilSc,915 -django/contrib/sites/locale/os/LC_MESSAGES/django.mo,sha256=Su06FkWMOPzBxoung3bEju_EnyAEAXROoe33imO65uQ,806 -django/contrib/sites/locale/os/LC_MESSAGES/django.po,sha256=4i4rX6aXDUKjq64T02iStqV2V2erUsSVnTivh2XtQeY,963 -django/contrib/sites/locale/pa/LC_MESSAGES/django.mo,sha256=tOHiisOtZrTyIFoo4Ipn_XFH9hhu-ubJLMdOML5ZUgk,684 -django/contrib/sites/locale/pa/LC_MESSAGES/django.po,sha256=ztGyuqvzxRfNjqDG0rMLCu_oQ8V3Dxdsx0WZoYUyNv8,912 -django/contrib/sites/locale/pl/LC_MESSAGES/django.mo,sha256=lo5K262sZmo-hXvcHoBsEDqX8oJEPSxJY5EfRIqHZh0,903 -django/contrib/sites/locale/pl/LC_MESSAGES/django.po,sha256=-kQ49UvXITMy1vjJoN_emuazV_EjNDQnZDERXWNoKvw,1181 -django/contrib/sites/locale/pt/LC_MESSAGES/django.mo,sha256=PrcFQ04lFJ7mIYThXbW6acmDigEFIoLAC0PYk5hfaJs,797 -django/contrib/sites/locale/pt/LC_MESSAGES/django.po,sha256=Aj8hYI9W5nk5uxKHj1oE-b9bxmmuoeXLKaJDPfI2x2o,993 -django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.mo,sha256=BsFfarOR6Qk67fB-tTWgGhuOReJSgjwJBkIzZsv28vo,824 -django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.po,sha256=jfvgelpWn2VQqYe2_CE39SLTsscCckvjuZo6dWII28c,1023 -django/contrib/sites/locale/ro/LC_MESSAGES/django.mo,sha256=oGsZw4_uYpaH6adMxnAuifJgHeZ_ytRZ4rFhiNfRQkQ,857 -django/contrib/sites/locale/ro/LC_MESSAGES/django.po,sha256=tWbWVbjFFELNzSXX4_5ltmzEeEJsY3pKwgEOjgV_W_8,1112 -django/contrib/sites/locale/ru/LC_MESSAGES/django.mo,sha256=bIZJWMpm2O5S6RC_2cfkrp5NXaTU2GWSsMr0wHVEmcw,1016 -django/contrib/sites/locale/ru/LC_MESSAGES/django.po,sha256=jHy5GR05ZSjLmAwaVNq3m0WdhO9GYxge3rDBziqesA8,1300 -django/contrib/sites/locale/sk/LC_MESSAGES/django.mo,sha256=-EYdm14ZjoR8bd7Rv2b5G7UJVSKmZa1ItLsdATR3-Cg,822 -django/contrib/sites/locale/sk/LC_MESSAGES/django.po,sha256=VSRlsq8uk-hP0JI94iWsGX8Al76vvGK4N1xIoFtoRQM,1070 -django/contrib/sites/locale/sl/LC_MESSAGES/django.mo,sha256=JmkpTKJGWgnBM3CqOUriGvrDnvg2YWabIU2kbYAOM4s,845 -django/contrib/sites/locale/sl/LC_MESSAGES/django.po,sha256=qWrWrSz5r3UOVraX08ILt3TTmfyTDGKbJKbTlN9YImU,1059 -django/contrib/sites/locale/sq/LC_MESSAGES/django.mo,sha256=DMLN1ZDJeDnslavjcKloXSXn6IvangVliVP3O6U8dAY,769 -django/contrib/sites/locale/sq/LC_MESSAGES/django.po,sha256=zg3ALcMNZErAS_xFxmtv6TmXZ0vxobX5AzCwOSRSwc8,930 -django/contrib/sites/locale/sr/LC_MESSAGES/django.mo,sha256=8kfi9IPdB2reF8C_eC2phaP6qonboHPwes_w3UgNtzw,935 -django/contrib/sites/locale/sr/LC_MESSAGES/django.po,sha256=A7xaen8H1W4uMBRAqCXT_0KQMoA2-45AUNDfGo9FydI,1107 -django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=jMXiq18efq0wErJAQfJR1fCnkYcEb7OYXg8sv6kzP0s,815 -django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.po,sha256=9jkWYcZCTfQr2UZtyvhWDAmEHBrzunJUZcx7FlrFOis,1004 -django/contrib/sites/locale/sv/LC_MESSAGES/django.mo,sha256=1AttMJ2KbQQgJVH9e9KuCKC0UqDHvWSPcKkbPkSLphQ,768 -django/contrib/sites/locale/sv/LC_MESSAGES/django.po,sha256=N7wqrcFb5ZNX83q1ZCkpkP94Lb3ZIBUATDssNT8F51c,1028 -django/contrib/sites/locale/sw/LC_MESSAGES/django.mo,sha256=cWjjDdFXBGmpUm03UDtgdDrREa2r75oMsXiEPT_Bx3g,781 -django/contrib/sites/locale/sw/LC_MESSAGES/django.po,sha256=oOKNdztQQU0sd6XmLI-n3ONmTL7jx3Q0z1YD8673Wi8,901 -django/contrib/sites/locale/ta/LC_MESSAGES/django.mo,sha256=CLO41KsSKqBrgtrHi6fmXaBk-_Y2l4KBLDJctZuZyWY,714 -django/contrib/sites/locale/ta/LC_MESSAGES/django.po,sha256=YsTITHg7ikkNcsP29tDgkZrUdtO0s9PrV1XPu4mgqCw,939 -django/contrib/sites/locale/te/LC_MESSAGES/django.mo,sha256=GmIWuVyIOcoQoAmr2HxCwBDE9JUYEktzYig93H_4v50,687 -django/contrib/sites/locale/te/LC_MESSAGES/django.po,sha256=jbncxU9H3EjXxWPsEoCKJhKi392XXTGvWyuenqLDxps,912 -django/contrib/sites/locale/tg/LC_MESSAGES/django.mo,sha256=wiWRlf3AN5zlFMNyP_rSDZS7M5rHQJ2DTUHARtXjim8,863 -django/contrib/sites/locale/tg/LC_MESSAGES/django.po,sha256=VBGZfJIw40JZe15ghsk-n3qUVX0VH2nFQQhpBy_lk1Y,1026 -django/contrib/sites/locale/th/LC_MESSAGES/django.mo,sha256=dQOp4JoP3gvfsxqEQ73L6F8FgH1YtAA9hYY-Uz5sv6Y,898 -django/contrib/sites/locale/th/LC_MESSAGES/django.po,sha256=auZBoKKKCHZbbh0PaUr9YKiWB1TEYZoj4bE7efAonV8,1077 -django/contrib/sites/locale/tk/LC_MESSAGES/django.mo,sha256=YhzSiVb_NdG1s7G1-SGGd4R3uweZQgnTs3G8Lv9r5z0,755 -django/contrib/sites/locale/tk/LC_MESSAGES/django.po,sha256=sigmzH3Ni2vJwLJ7ba8EeB4wnDXsg8rQRFExZAGycF4,917 -django/contrib/sites/locale/tr/LC_MESSAGES/django.mo,sha256=ryf01jcvvBMGPKkdViieDuor-Lr2KRXZeFF1gPupCOA,758 -django/contrib/sites/locale/tr/LC_MESSAGES/django.po,sha256=L9tsnwxw1BEJD-Nm3m1RAS7ekgdmyC0ETs_mr7tQw1E,1043 -django/contrib/sites/locale/tt/LC_MESSAGES/django.mo,sha256=gmmjXeEQUlBpfDmouhxE-qpEtv-iWdQSobYL5MWprZc,706 -django/contrib/sites/locale/tt/LC_MESSAGES/django.po,sha256=yj49TjwcZ4YrGqnJrKh3neKydlTgwYduto9KsmxI_eI,930 -django/contrib/sites/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/sites/locale/udm/LC_MESSAGES/django.po,sha256=vrLZ0XJF63CO3IucbQpd12lxuoM9S8tTUv6cpu3g81c,767 -django/contrib/sites/locale/ug/LC_MESSAGES/django.mo,sha256=EBWMPAJLaxkIPQ5hm_nMRxs7Y0SEEgu6zcDM4jBUAt8,868 -django/contrib/sites/locale/ug/LC_MESSAGES/django.po,sha256=9a0kmoIxg-KMu5faIjcRgWehr3Ild-stVZsBdDrzHV0,1030 -django/contrib/sites/locale/uk/LC_MESSAGES/django.mo,sha256=H4806mPqOoHJFm549F7drzsfkvAXWKmn1w_WVwQx9rk,960 -django/contrib/sites/locale/uk/LC_MESSAGES/django.po,sha256=CJZTOaurDXwpgBiwXx3W7juaF0EctEImPhJdDn8j1xU,1341 -django/contrib/sites/locale/ur/LC_MESSAGES/django.mo,sha256=s6QL8AB_Mp9haXS4n1r9b0YhEUECPxUyPrHTMI3agts,654 -django/contrib/sites/locale/ur/LC_MESSAGES/django.po,sha256=R9tv3qtett8CUGackoHrc5XADeygVKAE0Fz8YzK2PZ4,885 -django/contrib/sites/locale/uz/LC_MESSAGES/django.mo,sha256=OsuqnLEDl9gUAwsmM2s1KH7VD74ID-k7JXcjGhjFlEY,799 -django/contrib/sites/locale/uz/LC_MESSAGES/django.po,sha256=RoaOwLDjkqqIJTuxpuY7eMLo42n6FoYAYutCfMaDk4I,935 -django/contrib/sites/locale/vi/LC_MESSAGES/django.mo,sha256=YOaKcdrN1238Zdm81jUkc2cpxjInAbdnhsSqHP_jQsI,762 -django/contrib/sites/locale/vi/LC_MESSAGES/django.po,sha256=AHcqR2p0fdscLvzbJO_a-CzMzaeRL4LOw4HB9K3noVQ,989 -django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=7D9_pDY5lBRpo1kfzIQL-PNvIg-ofCm7cBHE1-JWlMk,779 -django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.po,sha256=xI_N00xhV8dWDp4fg5Mmj9ivOBBdHP79T3-JYXPyc5M,946 -django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=C4ZEuruq2Qnj7Zk-ZUfPWjLHcbNaC0V9MlDs8Go9Ieo,736 -django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.po,sha256=wGZCUT4Yg8FJLZZ6C_mf5Lly3YkPIhbTBiyTmj5emj8,1055 -django/contrib/sites/management.py,sha256=AElGktvFhWXJtlJwOKpUlIeuv2thkNM8F6boliML84U,1646 -django/contrib/sites/managers.py,sha256=uqD_Cu3P4NCp7VVdGn0NvHfhsZB05MLmiPmgot-ygz4,1994 -django/contrib/sites/middleware.py,sha256=qYcVHsHOg0VxQNS4saoLHkdF503nJR-D7Z01vE0SvUM,309 -django/contrib/sites/migrations/0001_initial.py,sha256=8fY63Z5DwbKQ1HtvAajKDhBLEufigRTsoRazyEf5RU4,1361 -django/contrib/sites/migrations/0002_alter_domain_unique.py,sha256=llK7IKQKnFCK5viHLew2ZMdV9e1sHy0H1blszEu_NKs,549 -django/contrib/sites/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sites/migrations/__pycache__/0001_initial.cpython-310.pyc,, -django/contrib/sites/migrations/__pycache__/0002_alter_domain_unique.cpython-310.pyc,, -django/contrib/sites/migrations/__pycache__/__init__.cpython-310.pyc,, -django/contrib/sites/models.py,sha256=0DWVfDGMYqTZgs_LP6hlVxY3ztbwPzulE9Dos8z6M3Q,3695 -django/contrib/sites/requests.py,sha256=baABc6fmTejNmk8M3fcoQ1cuI2qpJzF8Y47A1xSt8gY,641 -django/contrib/sites/shortcuts.py,sha256=nekVQADJROFYwKCD7flmWDMQ9uLAaaKztHVKl5emuWc,573 -django/contrib/staticfiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/staticfiles/__pycache__/__init__.cpython-310.pyc,, -django/contrib/staticfiles/__pycache__/apps.cpython-310.pyc,, -django/contrib/staticfiles/__pycache__/checks.cpython-310.pyc,, -django/contrib/staticfiles/__pycache__/finders.cpython-310.pyc,, -django/contrib/staticfiles/__pycache__/handlers.cpython-310.pyc,, -django/contrib/staticfiles/__pycache__/storage.cpython-310.pyc,, -django/contrib/staticfiles/__pycache__/testing.cpython-310.pyc,, -django/contrib/staticfiles/__pycache__/urls.cpython-310.pyc,, -django/contrib/staticfiles/__pycache__/utils.cpython-310.pyc,, -django/contrib/staticfiles/__pycache__/views.cpython-310.pyc,, -django/contrib/staticfiles/apps.py,sha256=8G9HetU3WBNDfXKfzYfyXjZ--X3loBkkQSB7xfleIl4,504 -django/contrib/staticfiles/checks.py,sha256=FPzYotgRzxqWYDnjIK78bgQAfBSFqeJB04RDVMxlhng,846 -django/contrib/staticfiles/finders.py,sha256=3wnvQkVaO5fwxpOQu5YJasf7SbdvgdJvgzZwf9RtMaY,13547 -django/contrib/staticfiles/handlers.py,sha256=lrPInj8EN9-rxzZxRCF9yeMXtNmlsDC9o9-qJdfFAs0,4043 -django/contrib/staticfiles/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/staticfiles/management/__pycache__/__init__.cpython-310.pyc,, -django/contrib/staticfiles/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/staticfiles/management/commands/__pycache__/__init__.cpython-310.pyc,, -django/contrib/staticfiles/management/commands/__pycache__/collectstatic.cpython-310.pyc,, -django/contrib/staticfiles/management/commands/__pycache__/findstatic.cpython-310.pyc,, -django/contrib/staticfiles/management/commands/__pycache__/runserver.cpython-310.pyc,, -django/contrib/staticfiles/management/commands/collectstatic.py,sha256=FgsNoKY8pa9A4sQytvnyd19qzFYtOkYQ_wBtgDEQLi8,15105 -django/contrib/staticfiles/management/commands/findstatic.py,sha256=P12GF-68bI1csVtjL0J2DwKcEX8JNBeFHmkRgbplnuI,1643 -django/contrib/staticfiles/management/commands/runserver.py,sha256=U_7oCY8LJX5Jn1xlMv-qF4EQoUvlT0ldB5E_0sJmRtw,1373 -django/contrib/staticfiles/storage.py,sha256=7bUaxdgW1OZBnKetXyeplFCUmWcWP2OBC9SxQQ0LVhg,21176 -django/contrib/staticfiles/testing.py,sha256=4X-EtOfXnwkJAyFT8qe4H4sbVTKgM65klLUtY81KHiE,463 -django/contrib/staticfiles/urls.py,sha256=owDM_hdyPeRmxYxZisSMoplwnzWrptI_W8-3K2f7ITA,498 -django/contrib/staticfiles/utils.py,sha256=iPXHA0yMXu37PQwCrq9zjhSzjZf_zEBXJ-dHGsqZoX8,2279 -django/contrib/staticfiles/views.py,sha256=mX70oejBU2FPZ9_idkI0EiRBkTjKcCD7JJ34gYxhM2M,1262 -django/contrib/syndication/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/syndication/__pycache__/__init__.cpython-310.pyc,, -django/contrib/syndication/__pycache__/apps.cpython-310.pyc,, -django/contrib/syndication/__pycache__/views.cpython-310.pyc,, -django/contrib/syndication/apps.py,sha256=7IpHoihPWtOcA6S4O6VoG0XRlqEp3jsfrNf-D-eluic,203 -django/contrib/syndication/views.py,sha256=wOMBfSAgQPpXHmBePze90AG5nc1JoQ0TX2euZKZD6iY,9377 -django/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/__pycache__/__init__.cpython-310.pyc,, -django/core/__pycache__/asgi.cpython-310.pyc,, -django/core/__pycache__/exceptions.cpython-310.pyc,, -django/core/__pycache__/paginator.cpython-310.pyc,, -django/core/__pycache__/signals.cpython-310.pyc,, -django/core/__pycache__/signing.cpython-310.pyc,, -django/core/__pycache__/validators.cpython-310.pyc,, -django/core/__pycache__/wsgi.cpython-310.pyc,, -django/core/asgi.py,sha256=N2L3GS6F6oL-yD9Tu2otspCi2UhbRQ90LEx3ExOP1m0,386 -django/core/cache/__init__.py,sha256=Z1LsL-TNTNVU5X3CLeHeK4Fbfar76n4zwBr4aC9kxuI,1929 -django/core/cache/__pycache__/__init__.cpython-310.pyc,, -django/core/cache/__pycache__/utils.cpython-310.pyc,, -django/core/cache/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/cache/backends/__pycache__/__init__.cpython-310.pyc,, -django/core/cache/backends/__pycache__/base.cpython-310.pyc,, -django/core/cache/backends/__pycache__/db.cpython-310.pyc,, -django/core/cache/backends/__pycache__/dummy.cpython-310.pyc,, -django/core/cache/backends/__pycache__/filebased.cpython-310.pyc,, -django/core/cache/backends/__pycache__/locmem.cpython-310.pyc,, -django/core/cache/backends/__pycache__/memcached.cpython-310.pyc,, -django/core/cache/backends/__pycache__/redis.cpython-310.pyc,, -django/core/cache/backends/base.py,sha256=trQVVOyBDc8PhDJT-p3ZCgFCImausGKZ2Tc3VRRtSsg,14292 -django/core/cache/backends/db.py,sha256=jrzgzVS0wso8XV9BXquzZPRnHM0d-lIOns_evqPYz_I,11373 -django/core/cache/backends/dummy.py,sha256=fQbFiL72DnVKP9UU4WDsZYaxYKx7FlMOJhtP8aky2ic,1043 -django/core/cache/backends/filebased.py,sha256=-zAJIiABjm25BcpZYJcitSFMkbu0wEYrbBD-SoEb3t0,5795 -django/core/cache/backends/locmem.py,sha256=R9g5g9KG6ak9G12R4RaMnVq7el5i9JXufovshNRMMIc,4036 -django/core/cache/backends/memcached.py,sha256=cB5QRCdr9uocB-tWA1FMBQtWQRqHSRpE7UcIMYI86gI,6776 -django/core/cache/backends/redis.py,sha256=9l35mLpnHDmHxb-uXXcj-VADfmXMY6Nz-z3-pGMLyKc,8010 -django/core/cache/utils.py,sha256=3ZLYgUDD6iLiLMC6vjXKfUQigsoU23ffpJx8e71M4XA,397 -django/core/checks/__init__.py,sha256=n7PPaSV3vubLuB0pperaV1fvaI9ZJ1nEI_CaYyaSSOc,1249 -django/core/checks/__pycache__/__init__.cpython-310.pyc,, -django/core/checks/__pycache__/async_checks.cpython-310.pyc,, -django/core/checks/__pycache__/caches.cpython-310.pyc,, -django/core/checks/__pycache__/commands.cpython-310.pyc,, -django/core/checks/__pycache__/database.cpython-310.pyc,, -django/core/checks/__pycache__/files.cpython-310.pyc,, -django/core/checks/__pycache__/messages.cpython-310.pyc,, -django/core/checks/__pycache__/model_checks.cpython-310.pyc,, -django/core/checks/__pycache__/registry.cpython-310.pyc,, -django/core/checks/__pycache__/templates.cpython-310.pyc,, -django/core/checks/__pycache__/translation.cpython-310.pyc,, -django/core/checks/__pycache__/urls.cpython-310.pyc,, -django/core/checks/async_checks.py,sha256=A9p_jebELrf4fiD6jJtBM6Gvm8cMb03sSuW9Ncx3-vU,403 -django/core/checks/caches.py,sha256=hbcIFD_grXUQR2lGAzzlCX6qMJfkXj02ZDJElgdT5Yg,2643 -django/core/checks/commands.py,sha256=lAgWKYHpUnXaE_-Zs_0LxKKZjM-JmU1UClF-RYWue8I,965 -django/core/checks/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/checks/compatibility/__pycache__/__init__.cpython-310.pyc,, -django/core/checks/compatibility/__pycache__/django_4_0.cpython-310.pyc,, -django/core/checks/compatibility/django_4_0.py,sha256=2s7lm9LZ0NrhaYSrw1Y5mMkL5BC68SS-TyD-TKczbEI,657 -django/core/checks/database.py,sha256=sBj-8o4DmpG5QPy1KXgXtZ0FZ0T9xdlT4XBIc70wmEQ,341 -django/core/checks/files.py,sha256=W4yYHiWrqi0d_G6tDWTw79pr2dgJY41rOv7mRpbtp2Q,522 -django/core/checks/messages.py,sha256=vIJtvmeafgwFzwcXaoRBWkcL_t2gLTLjstWSw5xCtjQ,2241 -django/core/checks/model_checks.py,sha256=8aK5uit9yP_lDfdXBJPlz_r-46faP_gIOXLszXqLQqY,8830 -django/core/checks/registry.py,sha256=wjv8H14QNQFQ1LxH7B2-ACE-mt9oM3IWG3R61zIZ-Zw,3482 -django/core/checks/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/checks/security/__pycache__/__init__.cpython-310.pyc,, -django/core/checks/security/__pycache__/base.cpython-310.pyc,, -django/core/checks/security/__pycache__/csrf.cpython-310.pyc,, -django/core/checks/security/__pycache__/sessions.cpython-310.pyc,, -django/core/checks/security/base.py,sha256=I0Gm446twRIhbRopEmKsdsYW_NdI7_nK_ZV28msRPEo,9140 -django/core/checks/security/csrf.py,sha256=hmFJ4m9oxDGwhDAWedmtpnIYQcI8Mxcge1D6CCoOBbc,2055 -django/core/checks/security/sessions.py,sha256=Qyb93CJeQBM5LLhhrqor4KQJR2tSpFklS-p7WltXcHc,2554 -django/core/checks/templates.py,sha256=leQ8nyjQBzofWFTo6YH9NkLmt582OlG2p8sFw00sbew,296 -django/core/checks/translation.py,sha256=it7VjXf10-HBdCc3z55_lSxwok9qEncdojRBG74d4FA,1990 -django/core/checks/urls.py,sha256=-H945kSYVe_am-2XJI_T4c2V34lySfA6ZHnEEW8USJ8,4917 -django/core/exceptions.py,sha256=BmB6cOsdasVC4UDLQxpLqbmp073ETwx4mbg12EE5HmY,6565 -django/core/files/__init__.py,sha256=Rhz5Jm9BM6gy_nf5yMtswN1VsTIILYUL7Z-5edjh_HI,60 -django/core/files/__pycache__/__init__.cpython-310.pyc,, -django/core/files/__pycache__/base.cpython-310.pyc,, -django/core/files/__pycache__/images.cpython-310.pyc,, -django/core/files/__pycache__/locks.cpython-310.pyc,, -django/core/files/__pycache__/move.cpython-310.pyc,, -django/core/files/__pycache__/temp.cpython-310.pyc,, -django/core/files/__pycache__/uploadedfile.cpython-310.pyc,, -django/core/files/__pycache__/uploadhandler.cpython-310.pyc,, -django/core/files/__pycache__/utils.cpython-310.pyc,, -django/core/files/base.py,sha256=MKNxxgiuwHHwGifpydBgjfZpTzdF7VxCQnVV-w8bqhg,4845 -django/core/files/images.py,sha256=Yms--hugUWcpsZJJJ0-UwkIe3PVZ4LjMFz4O7Ew9FBE,2644 -django/core/files/locks.py,sha256=mp96hc8nMob8cMESiASFWUTUn_afW8A4ag_viWz0ojU,3614 -django/core/files/move.py,sha256=Xv8ejaYIITJzLN2NlCE0MhFqalBYUIZiyYbjMIblkAo,2919 -django/core/files/storage/__init__.py,sha256=EosmC1_WLaAFOuapjyoKFNudQiyRIW8C2hx90oQaVD4,622 -django/core/files/storage/__pycache__/__init__.cpython-310.pyc,, -django/core/files/storage/__pycache__/base.cpython-310.pyc,, -django/core/files/storage/__pycache__/filesystem.cpython-310.pyc,, -django/core/files/storage/__pycache__/handler.cpython-310.pyc,, -django/core/files/storage/__pycache__/memory.cpython-310.pyc,, -django/core/files/storage/__pycache__/mixins.cpython-310.pyc,, -django/core/files/storage/base.py,sha256=83MumBD3zLS_tegimD51Oh9yQsIL4cYbW9dduhRnHqI,8296 -django/core/files/storage/filesystem.py,sha256=pGTwLU3oNn0yLbG7YtOrtIGCiEkDVDxoZ3xVu-xbjNc,9598 -django/core/files/storage/handler.py,sha256=ntOJZ2nf2VUaUY7tKH0mndORFiGKSdh_16o3OtilIBI,1507 -django/core/files/storage/memory.py,sha256=eUDRB7B1uTVb1a70zeasIlV33T3kfFcF9cyvz94S4k8,9875 -django/core/files/storage/mixins.py,sha256=j_Y3unzk9Ccmx-QQjj4AoC3MUhXIw5nFbDYF3Qn_Fh0,700 -django/core/files/temp.py,sha256=I463R2HuqzAzrpIi5FA3vT8S8m2ZdSYZXOcC932FO1w,2503 -django/core/files/uploadedfile.py,sha256=6hBjxmx8P0fxmZQbtj4OTsXtUk9GdIA7IUcv_KwSI08,4189 -django/core/files/uploadhandler.py,sha256=tMzeS-FJOMQBYQm2ORsLwltwZZrdOizyJSmdFjer_Sw,7180 -django/core/files/utils.py,sha256=tBT8c8wCObMmiVF4BpBpCV5_hhgMKxe2poiunwFpIcw,2602 -django/core/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/handlers/__pycache__/__init__.cpython-310.pyc,, -django/core/handlers/__pycache__/asgi.cpython-310.pyc,, -django/core/handlers/__pycache__/base.cpython-310.pyc,, -django/core/handlers/__pycache__/exception.cpython-310.pyc,, -django/core/handlers/__pycache__/wsgi.cpython-310.pyc,, -django/core/handlers/asgi.py,sha256=-lHVt6z6ioCs0CgGIrsPVXvpqqdaH-Lc3Xb99RdSbu4,13839 -django/core/handlers/base.py,sha256=j7ScIbMLKYa52HqwHYhIfMWWAG749natcsBsVQsvBjc,14813 -django/core/handlers/exception.py,sha256=Qa03HgQpLx7nqp5emF0bwdiemE0X7U9FfuLfoOHMf_4,5922 -django/core/handlers/wsgi.py,sha256=81DErgzHAaZcw2UivrKqwS69QpoRF8tm0ASEc4v3uQ4,7315 -django/core/mail/__init__.py,sha256=XJ1IZhgWtpwHC5N9HBz4OwEUJGhWDR6FyXJik-Wvjuo,5049 -django/core/mail/__pycache__/__init__.cpython-310.pyc,, -django/core/mail/__pycache__/message.cpython-310.pyc,, -django/core/mail/__pycache__/utils.cpython-310.pyc,, -django/core/mail/backends/__init__.py,sha256=VJ_9dBWKA48MXBZXVUaTy9NhgfRonapA6UAjVFEPKD8,37 -django/core/mail/backends/__pycache__/__init__.cpython-310.pyc,, -django/core/mail/backends/__pycache__/base.cpython-310.pyc,, -django/core/mail/backends/__pycache__/console.cpython-310.pyc,, -django/core/mail/backends/__pycache__/dummy.cpython-310.pyc,, -django/core/mail/backends/__pycache__/filebased.cpython-310.pyc,, -django/core/mail/backends/__pycache__/locmem.cpython-310.pyc,, -django/core/mail/backends/__pycache__/smtp.cpython-310.pyc,, -django/core/mail/backends/base.py,sha256=Cljbb7nil40Dfpob2R8iLmlO0Yv_wlOCBA9hF2Z6W54,1683 -django/core/mail/backends/console.py,sha256=H6lWE18H8uSxj7LB1SGTqQ7UFpk9gWLZYq6reowixLU,1427 -django/core/mail/backends/dummy.py,sha256=sI7tAa3MfG43UHARduttBvEAYYfiLasgF39jzaZPu9E,234 -django/core/mail/backends/filebased.py,sha256=AbEBL9tXr6WIhuSQvm3dHoCpuMoDTSIkx6qFb4GMUe4,2353 -django/core/mail/backends/locmem.py,sha256=95yAcfid-4akp2Eq1DkNrHiYF2-0pKR2N7VCPxMu_50,913 -django/core/mail/backends/smtp.py,sha256=vYF03edaHedkcZqoKaSL38B2BFwuzA_uPXeMdPrDFBo,5803 -django/core/mail/message.py,sha256=XgTe2M1ikBYy12Z_ryvwvLj0aWmWMu4SzXUZ6EW5CgQ,18739 -django/core/mail/utils.py,sha256=Wf-pdSdv0WLREYzI7EVWr59K6o7tfb3d2HSbAyE3SOE,506 -django/core/management/__init__.py,sha256=gkXgKuqIpyFauk2-kgOgU-IDxcw8TjAKM_MU-erraE0,17407 -django/core/management/__pycache__/__init__.cpython-310.pyc,, -django/core/management/__pycache__/base.cpython-310.pyc,, -django/core/management/__pycache__/color.cpython-310.pyc,, -django/core/management/__pycache__/sql.cpython-310.pyc,, -django/core/management/__pycache__/templates.cpython-310.pyc,, -django/core/management/__pycache__/utils.cpython-310.pyc,, -django/core/management/base.py,sha256=46XkLThPUXL5wHFlnZyRs2S4sTmo6wudVeZeqA-hy0s,24771 -django/core/management/color.py,sha256=KXdNATK5AvxVK8wtKH2GTWApnLGCZ_1NKewTsLWCBc0,3168 -django/core/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/management/commands/__pycache__/__init__.cpython-310.pyc,, -django/core/management/commands/__pycache__/check.cpython-310.pyc,, -django/core/management/commands/__pycache__/compilemessages.cpython-310.pyc,, -django/core/management/commands/__pycache__/createcachetable.cpython-310.pyc,, -django/core/management/commands/__pycache__/dbshell.cpython-310.pyc,, -django/core/management/commands/__pycache__/diffsettings.cpython-310.pyc,, -django/core/management/commands/__pycache__/dumpdata.cpython-310.pyc,, -django/core/management/commands/__pycache__/flush.cpython-310.pyc,, -django/core/management/commands/__pycache__/inspectdb.cpython-310.pyc,, -django/core/management/commands/__pycache__/loaddata.cpython-310.pyc,, -django/core/management/commands/__pycache__/makemessages.cpython-310.pyc,, -django/core/management/commands/__pycache__/makemigrations.cpython-310.pyc,, -django/core/management/commands/__pycache__/migrate.cpython-310.pyc,, -django/core/management/commands/__pycache__/optimizemigration.cpython-310.pyc,, -django/core/management/commands/__pycache__/runserver.cpython-310.pyc,, -django/core/management/commands/__pycache__/sendtestemail.cpython-310.pyc,, -django/core/management/commands/__pycache__/shell.cpython-310.pyc,, -django/core/management/commands/__pycache__/showmigrations.cpython-310.pyc,, -django/core/management/commands/__pycache__/sqlflush.cpython-310.pyc,, -django/core/management/commands/__pycache__/sqlmigrate.cpython-310.pyc,, -django/core/management/commands/__pycache__/sqlsequencereset.cpython-310.pyc,, -django/core/management/commands/__pycache__/squashmigrations.cpython-310.pyc,, -django/core/management/commands/__pycache__/startapp.cpython-310.pyc,, -django/core/management/commands/__pycache__/startproject.cpython-310.pyc,, -django/core/management/commands/__pycache__/test.cpython-310.pyc,, -django/core/management/commands/__pycache__/testserver.cpython-310.pyc,, -django/core/management/commands/check.py,sha256=X68B4VTS8i-3LPY0TjuQOc9AM5m9HOMBNPGbzv3FDfA,2832 -django/core/management/commands/compilemessages.py,sha256=-SIJnmyXjYu3tRdt-wnx7CQZV3uvREGhOL1qxLjU908,7010 -django/core/management/commands/createcachetable.py,sha256=bdKfxftffjoKQgSJfCBJRgVCwzhqnUn88MvAMPNTits,4656 -django/core/management/commands/dbshell.py,sha256=iBag6uDbB_Wad_Wzh1hbM2egS-8VOrmJwmWyHRYWF8M,1762 -django/core/management/commands/diffsettings.py,sha256=NNL_J0P3HRzAZd9XcW7Eo_iE_lNliIpKtdcarDbBRpc,3554 -django/core/management/commands/dumpdata.py,sha256=eGPBqrzdk4YZpyRaIUQWKfxe7qprKBYY_jC8DcuJILw,11180 -django/core/management/commands/flush.py,sha256=1LRuBYcWCqIKa23IHLEdtIZzgUGGDGw0YSb6RTX1SaE,3651 -django/core/management/commands/inspectdb.py,sha256=ToowhnCysdmzDQyKxsPwu4NR60928fGKH782x6tgLxU,17308 -django/core/management/commands/loaddata.py,sha256=8odpvT9UxaJuHA7ze5dDUHzFeq-dhdbH9Lk19JY3QZo,16008 -django/core/management/commands/makemessages.py,sha256=mvoERglPw76D33wFCW5z88mS0OuyO9Bi5Gpk78Lkmf8,28695 -django/core/management/commands/makemigrations.py,sha256=5v7NSJ3CIgJ1Mw2dbRBC_VkozmZu_LqvZgR7LCaKPWI,22539 -django/core/management/commands/migrate.py,sha256=DuC5kfZV2hyR2CGv5G7nUcm4eTxhw99QAznlz5GPHXs,21349 -django/core/management/commands/optimizemigration.py,sha256=yRKoXPTN_MmB3CAbBd5l3D50cek0A8VrlPoyLyNNk98,5244 -django/core/management/commands/runserver.py,sha256=fRMCU4ognBvav9b31n8mEo-ubUlHXwDdikVRxHWJ0qI,7539 -django/core/management/commands/sendtestemail.py,sha256=sF5TUMbD_tlGBnUsn9t-oFVGNSyeiWRIrgyPbJE88cs,1518 -django/core/management/commands/shell.py,sha256=5d3_PV3vZg7C6Lq-NwybJKqivzIRTns7s8GVcLKLB1E,9169 -django/core/management/commands/showmigrations.py,sha256=24s51EzwIhL6lIpumivpaixQTDGx7I1qJ0wKFNGaEMU,6847 -django/core/management/commands/sqlflush.py,sha256=7KiAXzUqqE3IeGresT-kVzyk_i8XP2NTsIBmYt30D3Y,1031 -django/core/management/commands/sqlmigrate.py,sha256=r1NZquOZ2aW2bPhFJQYTT7IDsh2kNGZIRJmdIT3r8FQ,3310 -django/core/management/commands/sqlsequencereset.py,sha256=cdnbbd7y81CAYK9KX-V6Ho8KJIO_mVtG3V6tftIBp6g,1101 -django/core/management/commands/squashmigrations.py,sha256=tab7zNB9asV-Dz_EaV8_DO8OLOc1oNnD5XcdGYHQr00,10882 -django/core/management/commands/startapp.py,sha256=Dhllhaf1q3EKVnyBLhJ9QsWf6JmjAtYnVLruHsmMlcQ,503 -django/core/management/commands/startproject.py,sha256=Iv7KOco1GkzGqUEME_LCx5vGi4JfY8-lzdkazDqF7k8,789 -django/core/management/commands/test.py,sha256=UXxsInhGqrcsMMiHk6uBvAwMMzCZDwJl5_Ql3L6lkx8,2367 -django/core/management/commands/testserver.py,sha256=aiS0tCe6uXp9hjcE1LUfZ118xAcMa28ImHL4ynQSqO8,2238 -django/core/management/sql.py,sha256=fP6Bvq4NrQB_9Tb6XsYeCg57xs2Ck6uaCXq0ojFOSvA,1851 -django/core/management/templates.py,sha256=vmddJ9owkojUvVjQliTx7yY3CO_hcBfy_YhIdQGSdTo,15435 -django/core/management/utils.py,sha256=3UGXgrDi5HwUQGU1i5wQiGHBF-kt8yJ0uGyFmu5mGKE,5636 -django/core/paginator.py,sha256=YFR2EE0W2cLhEuXSWI67c33DreVVSxlz9xRjqGs50zc,7905 -django/core/serializers/__init__.py,sha256=gaH58ip_2dyUFDlfOPenMkVJftQQOBvXqCcZBjAKwTA,8772 -django/core/serializers/__pycache__/__init__.cpython-310.pyc,, -django/core/serializers/__pycache__/base.cpython-310.pyc,, -django/core/serializers/__pycache__/json.cpython-310.pyc,, -django/core/serializers/__pycache__/jsonl.cpython-310.pyc,, -django/core/serializers/__pycache__/python.cpython-310.pyc,, -django/core/serializers/__pycache__/pyyaml.cpython-310.pyc,, -django/core/serializers/__pycache__/xml_serializer.cpython-310.pyc,, -django/core/serializers/base.py,sha256=6LnbPCb4wbDYsE3svEztt2AlS5hZx3NmIdM_0uRijh0,12631 -django/core/serializers/json.py,sha256=AB24RCDiQpooon37EkJLlf0mczzjvM0b1oCcBDtPeVE,3757 -django/core/serializers/jsonl.py,sha256=iW5uUBdeZpkgER4foGhpvrk246l0Q_oQD4rhV1Qwyyo,2258 -django/core/serializers/python.py,sha256=Tr5RYdiy3CgMnT1voVSlvLujOZObeEehUXfwHWPVsyg,8094 -django/core/serializers/pyyaml.py,sha256=RxM3tyX-9IcueeSb-lwUsK7H0Heq7e1kyQU0QfrP21c,3061 -django/core/serializers/xml_serializer.py,sha256=ceGm66IeqC2kM_XC786_jwn0Nwl4j7Uv0i_SJxTib7Y,18556 -django/core/servers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/servers/__pycache__/__init__.cpython-310.pyc,, -django/core/servers/__pycache__/basehttp.cpython-310.pyc,, -django/core/servers/basehttp.py,sha256=0XtDP4SDBGovGKe6oXBba6-qgBJK2lw1umB8RXSOtUo,9995 -django/core/signals.py,sha256=5vh1e7IgPN78WXPo7-hEMPN9tQcqJSZHu0WCibNgd-E,151 -django/core/signing.py,sha256=5-uDACJ8WxTJmwfwPoXRIO4nSr2v4032aTVwPaPLxWA,8772 -django/core/validators.py,sha256=02XDCZs1rm75CoVjj9lFnrgFlHGgDMGKoKrVeMOlnsk,22484 -django/core/wsgi.py,sha256=2sYMSe3IBrENeQT7rys-04CRmf8hW2Q2CjlkBUIyjHk,388 -django/db/__init__.py,sha256=CBuehITrkVMn02P63M0GY1MnZuC0GefA1MAoxlVo3b4,1533 -django/db/__pycache__/__init__.cpython-310.pyc,, -django/db/__pycache__/transaction.cpython-310.pyc,, -django/db/__pycache__/utils.cpython-310.pyc,, -django/db/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/__pycache__/__init__.cpython-310.pyc,, -django/db/backends/__pycache__/ddl_references.cpython-310.pyc,, -django/db/backends/__pycache__/signals.cpython-310.pyc,, -django/db/backends/__pycache__/utils.cpython-310.pyc,, -django/db/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/base/__pycache__/__init__.cpython-310.pyc,, -django/db/backends/base/__pycache__/base.cpython-310.pyc,, -django/db/backends/base/__pycache__/client.cpython-310.pyc,, -django/db/backends/base/__pycache__/creation.cpython-310.pyc,, -django/db/backends/base/__pycache__/features.cpython-310.pyc,, -django/db/backends/base/__pycache__/introspection.cpython-310.pyc,, -django/db/backends/base/__pycache__/operations.cpython-310.pyc,, -django/db/backends/base/__pycache__/schema.cpython-310.pyc,, -django/db/backends/base/__pycache__/validation.cpython-310.pyc,, -django/db/backends/base/base.py,sha256=EggBYM3OZwXKWnYjTad61X0SgezvOC60ucxDF69qNSU,28598 -django/db/backends/base/client.py,sha256=90Ffs6zZYCli3tJjwsPH8TItZ8tz1Pp-zhQa-EpsNqc,937 -django/db/backends/base/creation.py,sha256=AFQL_xz48jYzZTdHl3r3d_2v_xGyJMMENXmEUcbRv48,15847 -django/db/backends/base/features.py,sha256=uz75VB8Jy0h9RuIWiODAKgVdw5D0optaOV6KJeI4OhY,16100 -django/db/backends/base/introspection.py,sha256=CJG3MUmR-wJpNm-gNWuMRMNknWp3ZdZ9DRUbKxcnwuo,7900 -django/db/backends/base/operations.py,sha256=oBBjIbP6ZD8_mYGN7RHCBO3pmoSNZOYDGzRAr0hTJq4,30169 -django/db/backends/base/schema.py,sha256=ytvviES5kN8GnvqOWpqDoR4O5VDF_klcQ79iKDnwYAQ,82323 -django/db/backends/base/validation.py,sha256=2zpI11hyUJr0I0cA1xmvoFwQVdZ-7_1T2F11TpQ0Rkk,1067 -django/db/backends/ddl_references.py,sha256=dUlkGLGdjOnacR_8PaweA5XSwgD8wojMTJUVOCOKVLY,8619 -django/db/backends/dummy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/dummy/__pycache__/__init__.cpython-310.pyc,, -django/db/backends/dummy/__pycache__/base.cpython-310.pyc,, -django/db/backends/dummy/__pycache__/features.cpython-310.pyc,, -django/db/backends/dummy/base.py,sha256=keUxD7V-XsfD8b1zcbkP-vQgy7NbIJOePd810QRyJM4,2217 -django/db/backends/dummy/features.py,sha256=Pg8_jND-aoJomTaBBXU3hJEjzpB-rLs6VwpoKkOYuQg,181 -django/db/backends/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/mysql/__pycache__/__init__.cpython-310.pyc,, -django/db/backends/mysql/__pycache__/base.cpython-310.pyc,, -django/db/backends/mysql/__pycache__/client.cpython-310.pyc,, -django/db/backends/mysql/__pycache__/compiler.cpython-310.pyc,, -django/db/backends/mysql/__pycache__/creation.cpython-310.pyc,, -django/db/backends/mysql/__pycache__/features.cpython-310.pyc,, -django/db/backends/mysql/__pycache__/introspection.cpython-310.pyc,, -django/db/backends/mysql/__pycache__/operations.cpython-310.pyc,, -django/db/backends/mysql/__pycache__/schema.cpython-310.pyc,, -django/db/backends/mysql/__pycache__/validation.cpython-310.pyc,, -django/db/backends/mysql/base.py,sha256=mYH0HTP9VD0ImztdiW5fGfnaFr4LzAqDx0FtGsAJ25Y,16864 -django/db/backends/mysql/client.py,sha256=IpwdI-H5r-QUoM8ZvPXHykNxKb2wevcUx8HvxTn_otU,2988 -django/db/backends/mysql/compiler.py,sha256=oX6DtScmxnIX2NsIZeRmD28Q3uC-wYiwYAevuuMxwHE,3094 -django/db/backends/mysql/creation.py,sha256=8BV8YHk3qEq555nH3NHukxpZZgxtvXFvkv7XvkRlhKA,3449 -django/db/backends/mysql/features.py,sha256=l-Xkk1RCE8G_gjVzSngVqlNMmkj1VUF6Eh9QNhdTXis,11370 -django/db/backends/mysql/introspection.py,sha256=AY06ZLynWypYTEGAsR-t4F9Uj7Fb0Hqi-QNW1YwRnEQ,14498 -django/db/backends/mysql/operations.py,sha256=3gyu66ZsaMl3cPUvauwcxd5f4ny3qy77oRajDMcwstk,18330 -django/db/backends/mysql/schema.py,sha256=6jSaORTUarIukP5myMw6QSVaqzCyKIRrKVYncBnjNZY,11239 -django/db/backends/mysql/validation.py,sha256=XERj0lPEihKThPvzoVJmNpWdPOun64cRF3gHv-zmCGk,3093 -django/db/backends/oracle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/oracle/__pycache__/__init__.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/base.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/client.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/creation.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/features.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/functions.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/introspection.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/operations.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/oracledb_any.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/schema.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/utils.cpython-310.pyc,, -django/db/backends/oracle/__pycache__/validation.cpython-310.pyc,, -django/db/backends/oracle/base.py,sha256=WjSulNsQlbCE8IA0VpC7Njl_uW1_20CYJ2bAbjfUqLk,26107 -django/db/backends/oracle/client.py,sha256=DfDURfno8Sek13M8r5S2t2T8VUutx2hBT9DZRfow9VQ,784 -django/db/backends/oracle/creation.py,sha256=-JsWjyVV_VCNnUf1QJYXIsfXnEmnVwzhdZxq22loUY4,20986 -django/db/backends/oracle/features.py,sha256=pVrfyxyQaM9oqLj9xZA0q1SZPz-_g38zAg88iAwUp5w,9585 -django/db/backends/oracle/functions.py,sha256=2OoBYyY1Lb4B5hYbkRHjd8YY_artr3QeGu2hlojC-vc,812 -django/db/backends/oracle/introspection.py,sha256=MjjO-PqpcfiUd9WkLqiC8XGgbC4gocvymqQ1bh-ceKk,15474 -django/db/backends/oracle/operations.py,sha256=n6Y4XMSbF0WHwsshhpFh6l652bG-8ZY3XTce8EpHHIc,30189 -django/db/backends/oracle/oracledb_any.py,sha256=khvvdziN8LPa6r0QjZwty2YMcGXLCIZKU8iuIsPyjDI,446 -django/db/backends/oracle/schema.py,sha256=iGTXfEIYtiMAq0y8LH80CnpEFmnLo6JMHaWTJBu5kEw,10753 -django/db/backends/oracle/utils.py,sha256=C9gumfPZAToaBg3HgsUoH5EU-_goM8ZrL_7VI5yw098,2753 -django/db/backends/oracle/validation.py,sha256=cq-Bvy5C0_rmkgng0SSQ4s74FKg2yTM1N782Gfz86nY,860 -django/db/backends/postgresql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/postgresql/__pycache__/__init__.cpython-310.pyc,, -django/db/backends/postgresql/__pycache__/base.cpython-310.pyc,, -django/db/backends/postgresql/__pycache__/client.cpython-310.pyc,, -django/db/backends/postgresql/__pycache__/compiler.cpython-310.pyc,, -django/db/backends/postgresql/__pycache__/creation.cpython-310.pyc,, -django/db/backends/postgresql/__pycache__/features.cpython-310.pyc,, -django/db/backends/postgresql/__pycache__/introspection.cpython-310.pyc,, -django/db/backends/postgresql/__pycache__/operations.cpython-310.pyc,, -django/db/backends/postgresql/__pycache__/psycopg_any.cpython-310.pyc,, -django/db/backends/postgresql/__pycache__/schema.cpython-310.pyc,, -django/db/backends/postgresql/base.py,sha256=1ztHLo0_MVteU_WoEOXoDWoDEDBfpmjHoNDzRQOKr6c,23486 -django/db/backends/postgresql/client.py,sha256=BxpiOYe2hzg4tWjPKHDJxa8zdr6S7CN9YiaOhTDJUOo,2044 -django/db/backends/postgresql/compiler.py,sha256=8FyO0VLtLNtuHB-dfh_vUEj5uKIPHMbXfKQ8RxWmvc0,1947 -django/db/backends/postgresql/creation.py,sha256=pZYCzq893jcMd8jhnUH2suBaOC9LrkTtpBn9gdpqxTY,3886 -django/db/backends/postgresql/features.py,sha256=b9OqKidAbIV4VHqGJj8gudhO2pLRmqvnyWPy-Yji4u8,6221 -django/db/backends/postgresql/introspection.py,sha256=0j4Y5ZAuSk8iaMbDBjUF9zHTcL3C5WibIiJygOvZMP8,11604 -django/db/backends/postgresql/operations.py,sha256=Ht2ZWPD7p-cp2do4to-XnvV4LM-9SyTubMz6DqwU4TI,15940 -django/db/backends/postgresql/psycopg_any.py,sha256=X2aU-MHfDNbXaKT2-2VC3mhiAVxYth_uMJPKoAPLsKQ,3885 -django/db/backends/postgresql/schema.py,sha256=N-c5Q2EXuTdYoelNXDnkQ8apFcpYT6YFRdhnh5pFBYU,14749 -django/db/backends/signals.py,sha256=Yl14KjYJijTt1ypIZirp90lS7UTJ8UogPFI_DwbcsSc,66 -django/db/backends/sqlite3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/sqlite3/__pycache__/__init__.cpython-310.pyc,, -django/db/backends/sqlite3/__pycache__/_functions.cpython-310.pyc,, -django/db/backends/sqlite3/__pycache__/base.cpython-310.pyc,, -django/db/backends/sqlite3/__pycache__/client.cpython-310.pyc,, -django/db/backends/sqlite3/__pycache__/creation.cpython-310.pyc,, -django/db/backends/sqlite3/__pycache__/features.cpython-310.pyc,, -django/db/backends/sqlite3/__pycache__/introspection.cpython-310.pyc,, -django/db/backends/sqlite3/__pycache__/operations.cpython-310.pyc,, -django/db/backends/sqlite3/__pycache__/schema.cpython-310.pyc,, -django/db/backends/sqlite3/_functions.py,sha256=4rwADvq4dJu8EAzUXPnrmN_lDcfg_Xf0w7DRHgj8faw,14559 -django/db/backends/sqlite3/base.py,sha256=SN7kSxlsfQ41MMWqleg_gmZh6mYaysZ6Tr7WO0nRQ5w,15131 -django/db/backends/sqlite3/client.py,sha256=Eb_-P1w0aTbZGVNYkv7KA1ku5Il1N2RQov2lc3v0nho,321 -django/db/backends/sqlite3/creation.py,sha256=Ib9pfwA53G4wZpLZgh7EvdipoSdvhg-wxKSP2ZowwFM,6849 -django/db/backends/sqlite3/features.py,sha256=3Yg219ztakA8mWnG6RmpL3KlXLA1Fj5n31UMKVotBAM,6775 -django/db/backends/sqlite3/introspection.py,sha256=PBG8ysOJ_yK9H97S5x1eJq7QG3Pho7x1i81rKRzOyTA,17485 -django/db/backends/sqlite3/operations.py,sha256=XTcIjTJFK-PNDgmWUh6gxt5As8jKz6dLUNTW0DSPlUw,17167 -django/db/backends/sqlite3/schema.py,sha256=ljCADvyT_KhNC5bQ413v4cf6I9-n1i7T3853CyrLbYw,20749 -django/db/backends/utils.py,sha256=wFyQVfVs1AxR48yQIVQ-ll1sC9GUeCxdP-aavYL0lrs,11137 -django/db/migrations/__init__.py,sha256=Oa4RvfEa6hITCqdcqwXYC66YknFKyluuy7vtNbSc-L4,97 -django/db/migrations/__pycache__/__init__.cpython-310.pyc,, -django/db/migrations/__pycache__/autodetector.cpython-310.pyc,, -django/db/migrations/__pycache__/exceptions.cpython-310.pyc,, -django/db/migrations/__pycache__/executor.cpython-310.pyc,, -django/db/migrations/__pycache__/graph.cpython-310.pyc,, -django/db/migrations/__pycache__/loader.cpython-310.pyc,, -django/db/migrations/__pycache__/migration.cpython-310.pyc,, -django/db/migrations/__pycache__/optimizer.cpython-310.pyc,, -django/db/migrations/__pycache__/questioner.cpython-310.pyc,, -django/db/migrations/__pycache__/recorder.cpython-310.pyc,, -django/db/migrations/__pycache__/serializer.cpython-310.pyc,, -django/db/migrations/__pycache__/state.cpython-310.pyc,, -django/db/migrations/__pycache__/utils.cpython-310.pyc,, -django/db/migrations/__pycache__/writer.cpython-310.pyc,, -django/db/migrations/autodetector.py,sha256=jeKHhbdpHZ4tGOdID9RLFlf2LCiz7FwRC8JLvO-F9h4,86243 -django/db/migrations/exceptions.py,sha256=SotQF7ZKgJpd9KN-gKDL8wCJAKSEgbZToM_vtUAnqHw,1204 -django/db/migrations/executor.py,sha256=jx9J5WdS0X48UqxHkWKd2JYBUxds46Gn03ZZNAo8pTE,19038 -django/db/migrations/graph.py,sha256=vt7Pc45LuiXR8aRCrXP5Umm6VDCCTs2LAr5NXh-rxcE,13055 -django/db/migrations/loader.py,sha256=cVeJi7PwDc2Nxzgg3K_CrhK9H2HAtaXb1tG1PyDcSEA,16877 -django/db/migrations/migration.py,sha256=itZASGGepJYCY2Uv5AmLrxOgjEH1tycGV0bv3EtRjQE,9767 -django/db/migrations/operations/__init__.py,sha256=ZaABCS7A48o90bDjqtTt3ceZFwxpmnx2p1W5Qf_jsKM,1008 -django/db/migrations/operations/__pycache__/__init__.cpython-310.pyc,, -django/db/migrations/operations/__pycache__/base.cpython-310.pyc,, -django/db/migrations/operations/__pycache__/fields.cpython-310.pyc,, -django/db/migrations/operations/__pycache__/models.cpython-310.pyc,, -django/db/migrations/operations/__pycache__/special.cpython-310.pyc,, -django/db/migrations/operations/base.py,sha256=IPBwWk-8j44IZw6FvXC9RVXqecbF0OhK-R_LMYwhNd4,5562 -django/db/migrations/operations/fields.py,sha256=OAGpT0youYLL7LcxcpO-N5fhzGlx0r_wK1ZitM7qmAE,12900 -django/db/migrations/operations/models.py,sha256=Q9JCI3tIHjLQnGMe5pg1ZSMBwmc3PISOI-MyTtV20IU,47864 -django/db/migrations/operations/special.py,sha256=CMLfqR4rO8AhDMNscOXjblKuvNA3vWFzg-6M_7xZnX4,7966 -django/db/migrations/optimizer.py,sha256=c0JZ5FGltD_gmh20e5SR6A21q_De6rUKfkAJKwmX4Ks,3255 -django/db/migrations/questioner.py,sha256=BsQQyBDJIoMzza7d4jdxMsZeV0p4a22P5MlC0i5e3mM,13568 -django/db/migrations/recorder.py,sha256=HviA3DydJPqpE8gowv1lAnIdLMTSRpRXuLFn53r-Q1Y,3827 -django/db/migrations/serializer.py,sha256=oPznMQhNezYzUb-R1U79iIAp4DtZocFvjK--B0Bbyv4,14133 -django/db/migrations/state.py,sha256=HUZqL5U64dqkwfVZBDXd0v6Vn8mka92BMdLkCRAB7Jg,41924 -django/db/migrations/utils.py,sha256=pdrzumGDhgytc5KVWdZov7cQtBt3jRASLqbmBxSRSvg,4401 -django/db/migrations/writer.py,sha256=OWRUgtTrBLndIUeNxL3-6gI5ORPdIWG_Jy9Iluizs0M,11613 -django/db/models/__init__.py,sha256=ikjLHt8fOsj60DMX1Q9knCULL6zaZNuVLPlaP93afao,3085 -django/db/models/__pycache__/__init__.cpython-310.pyc,, -django/db/models/__pycache__/aggregates.cpython-310.pyc,, -django/db/models/__pycache__/base.cpython-310.pyc,, -django/db/models/__pycache__/constants.cpython-310.pyc,, -django/db/models/__pycache__/constraints.cpython-310.pyc,, -django/db/models/__pycache__/deletion.cpython-310.pyc,, -django/db/models/__pycache__/enums.cpython-310.pyc,, -django/db/models/__pycache__/expressions.cpython-310.pyc,, -django/db/models/__pycache__/indexes.cpython-310.pyc,, -django/db/models/__pycache__/lookups.cpython-310.pyc,, -django/db/models/__pycache__/manager.cpython-310.pyc,, -django/db/models/__pycache__/options.cpython-310.pyc,, -django/db/models/__pycache__/query.cpython-310.pyc,, -django/db/models/__pycache__/query_utils.cpython-310.pyc,, -django/db/models/__pycache__/signals.cpython-310.pyc,, -django/db/models/__pycache__/utils.cpython-310.pyc,, -django/db/models/aggregates.py,sha256=SpORbuN9OM3bsUSAjOFBslsOcrEc2r2BojchZLfmfto,8340 -django/db/models/base.py,sha256=ow3WrapGVzXW2YicJgjMqZa4wVCSm0WDwrcBTyzx3sM,100950 -django/db/models/constants.py,sha256=ndnj9TOTKW0p4YcIPLOLEbsH6mOgFi6B1-rIzr_iwwU,210 -django/db/models/constraints.py,sha256=MvW_ssFwG-VkHv_WOIZWXxXqAyddxt6KRPuInbZFbPk,29733 -django/db/models/deletion.py,sha256=RcsL4nRQcZLYIg8AMjN6uXFuRSVtswMEJYa3wRkYuYM,20943 -django/db/models/enums.py,sha256=mgBBX7bFzuPYgkPR9hvy4FZOtbZE5gfbhHWsvrIhONQ,3527 -django/db/models/expressions.py,sha256=vwpECa59AhJ2irzQ306o-Z2amPWxVsa_usBqahTEODM,73717 -django/db/models/fields/__init__.py,sha256=KLDa5Kz0_AIX0QBI6MOH9QRnjnchfmLuiBNcfxPOMpw,98730 -django/db/models/fields/__pycache__/__init__.cpython-310.pyc,, -django/db/models/fields/__pycache__/composite.cpython-310.pyc,, -django/db/models/fields/__pycache__/files.cpython-310.pyc,, -django/db/models/fields/__pycache__/generated.cpython-310.pyc,, -django/db/models/fields/__pycache__/json.cpython-310.pyc,, -django/db/models/fields/__pycache__/mixins.cpython-310.pyc,, -django/db/models/fields/__pycache__/proxy.cpython-310.pyc,, -django/db/models/fields/__pycache__/related.cpython-310.pyc,, -django/db/models/fields/__pycache__/related_descriptors.cpython-310.pyc,, -django/db/models/fields/__pycache__/related_lookups.cpython-310.pyc,, -django/db/models/fields/__pycache__/reverse_related.cpython-310.pyc,, -django/db/models/fields/__pycache__/tuple_lookups.cpython-310.pyc,, -django/db/models/fields/composite.py,sha256=SfCqHlM9VF5t8uQvcwLd8yDT3cRuQs3enAa6uhKr1xI,5731 -django/db/models/fields/files.py,sha256=nLiRiY9bcVEwE8s5J6yxo2HqN3HreDHPDNHfaW3qLrs,20206 -django/db/models/fields/generated.py,sha256=hzCBUpS1fvoimEI_D7WtoLk6AryGw0TRdyk-UkYBDJE,7655 -django/db/models/fields/json.py,sha256=vgNOlxOrTamKle_irilf8Oj1eGMADDDtT6rdat5ljGM,23893 -django/db/models/fields/mixins.py,sha256=8HrdKIq0eG9vVstJwkK-2g2wdwyvcEVWBzP3S0hzeWY,2478 -django/db/models/fields/proxy.py,sha256=eFHyl4gRTqocjgd6nID9UlQuOIppBA57Vcr71UReTAs,515 -django/db/models/fields/related.py,sha256=MkYgvgKGgiXdUT3-f6atxdSBbv8WALk-VTpTtP4sUeI,79037 -django/db/models/fields/related_descriptors.py,sha256=6nc3iqXo3NS30dSK-H39oweMXSFwpNOVFQTb4GEqON4,66627 -django/db/models/fields/related_lookups.py,sha256=bcwLH0tflmcx2168veYOUDVZ31u7-UFtETUG91BddeE,6076 -django/db/models/fields/reverse_related.py,sha256=EAiX26xVCrTcGj_OjBC_e6sjEXE4-FyVxnESECO8jvc,12908 -django/db/models/fields/tuple_lookups.py,sha256=ldGBihS4YDGeZfEsQw6vyhUsyD5Ab3xcYpJpt_cyadY,13011 -django/db/models/functions/__init__.py,sha256=jz3DukwiIczpJJpajmwLTIJdi-DQfHxYKLMh0D08X3g,2714 -django/db/models/functions/__pycache__/__init__.cpython-310.pyc,, -django/db/models/functions/__pycache__/comparison.cpython-310.pyc,, -django/db/models/functions/__pycache__/datetime.cpython-310.pyc,, -django/db/models/functions/__pycache__/json.cpython-310.pyc,, -django/db/models/functions/__pycache__/math.cpython-310.pyc,, -django/db/models/functions/__pycache__/mixins.cpython-310.pyc,, -django/db/models/functions/__pycache__/text.cpython-310.pyc,, -django/db/models/functions/__pycache__/window.cpython-310.pyc,, -django/db/models/functions/comparison.py,sha256=ampNkaAtm6Ux2iEU9sT3wumbdB39R6Aa9TNIE8F2fxQ,6810 -django/db/models/functions/datetime.py,sha256=IxDj0X1IUkzbIFbyDmjQZ0PL7eIO2rMn1kU47JlSl1E,13614 -django/db/models/functions/json.py,sha256=RPRvMqCcXDMtIoK7rw2mHbdq4Ay3Z5sXRzQoj-k491I,4668 -django/db/models/functions/math.py,sha256=NugCfaC8Y_VhpEr62HMeDX3O934NnuBPsk3mi5I_DmE,6140 -django/db/models/functions/mixins.py,sha256=UqpHYyF33JSEWYdggezTtWkrMkPKFEfW6enIkujzgaQ,2382 -django/db/models/functions/text.py,sha256=aBnl-5-l3qw8wa7hFIOcHCoUOLGtlk6SFFY4PYZGMtU,11528 -django/db/models/functions/window.py,sha256=g4fryay1tLQCpZRfmPQhrTiuib4RvPqtwFdodlLbi98,2841 -django/db/models/indexes.py,sha256=HYCD06Is7-f0aIGkXdWNeEXzfBoSY6ECNCiVbe8tlwk,11935 -django/db/models/lookups.py,sha256=tefhdR_HrvYF3IPnXVxUKLprQLwXzXPaTrvdxIkK1U4,29048 -django/db/models/manager.py,sha256=n97p4q0ttwmI1XcF9dAl8Pfg5Zs8iudufhWebQ7Xau0,6866 -django/db/models/options.py,sha256=xQFZqckdo9SHdoc86cYvW-nWSAQqjyGDeSerBxVNelk,39469 -django/db/models/query.py,sha256=kasWb7MuoCRNWGjbigACZsWXyaBc9pmUk9IoEGCmDM4,105452 -django/db/models/query_utils.py,sha256=QvLLPS18f6ZJEx53FAfvur4JAX5yElFlD1Tr6HpekCk,17545 -django/db/models/signals.py,sha256=mG6hxVWugr_m0ugTU2XAEMiqlu2FJ4CBuGa34dLJvEQ,1622 -django/db/models/sql/__init__.py,sha256=BGZ1GSn03dTOO8PYx6vF1-ImE3g1keZsQ74AHJoQwmQ,241 -django/db/models/sql/__pycache__/__init__.cpython-310.pyc,, -django/db/models/sql/__pycache__/compiler.cpython-310.pyc,, -django/db/models/sql/__pycache__/constants.cpython-310.pyc,, -django/db/models/sql/__pycache__/datastructures.cpython-310.pyc,, -django/db/models/sql/__pycache__/query.cpython-310.pyc,, -django/db/models/sql/__pycache__/subqueries.cpython-310.pyc,, -django/db/models/sql/__pycache__/where.cpython-310.pyc,, -django/db/models/sql/compiler.py,sha256=vgZRDD5_9SPDRsi117RxQFeNU5zlxm4s3MnKqRuvfvA,92285 -django/db/models/sql/constants.py,sha256=xXZKLd59Od-A3hI3X6iDmIBq1Ry0R9Ckta-TLFY3GNg,599 -django/db/models/sql/datastructures.py,sha256=tDcVdWqVZgpzcMgEVBVBNyR21-UCoV2bd6o0AkgeUGs,8271 -django/db/models/sql/query.py,sha256=_CEcIMK6BamaDvhOLNfwgABvQVM_aXmG6y8oQ_GzAPY,118951 -django/db/models/sql/subqueries.py,sha256=q7NFOnsEUtE5dW5IkD9-IxS5qfQf2dL3XmB-1fQOqhA,6150 -django/db/models/sql/where.py,sha256=QHcEVXpToaQBcN1A1gWrKl9xtYBALIXheyxeI0O2iLg,12317 -django/db/models/utils.py,sha256=vzojL0uUQHuOm2KxTJ19DHGnQ1pBXbnWaTlzR0vVimI,2182 -django/db/transaction.py,sha256=whcgZIBEnVNaPrxdxevhjs3K16KWN6yJAnIXNP8-uLw,12506 -django/db/utils.py,sha256=RKtSSyVJmM5__SAs1pY0njX6hLVRy1WIBggYo1zP4RI,9279 -django/dispatch/__init__.py,sha256=qP203zNwjaolUFnXLNZHnuBn7HNzyw9_JkODECRKZbc,286 -django/dispatch/__pycache__/__init__.cpython-310.pyc,, -django/dispatch/__pycache__/dispatcher.cpython-310.pyc,, -django/dispatch/dispatcher.py,sha256=OHaB-_kl1GeVwKh_bIMbHNFmH2yVN4qfSQz2aAVXfME,17777 -django/dispatch/license.txt,sha256=VABMS2BpZOvBY68W0EYHwW5Cj4p4oCb-y1P3DAn0qU8,1743 -django/forms/__init__.py,sha256=S6ckOMmvUX-vVST6AC-M8BzsfVQwuEUAdHWabMN-OGI,368 -django/forms/__pycache__/__init__.cpython-310.pyc,, -django/forms/__pycache__/boundfield.cpython-310.pyc,, -django/forms/__pycache__/fields.cpython-310.pyc,, -django/forms/__pycache__/forms.cpython-310.pyc,, -django/forms/__pycache__/formsets.cpython-310.pyc,, -django/forms/__pycache__/models.cpython-310.pyc,, -django/forms/__pycache__/renderers.cpython-310.pyc,, -django/forms/__pycache__/utils.cpython-310.pyc,, -django/forms/__pycache__/widgets.cpython-310.pyc,, -django/forms/boundfield.py,sha256=K28bu_Gs8LsYxVZVmQdftuAME-Zqkw_yAIsKrXmLR48,13271 -django/forms/fields.py,sha256=yU9NRyGU_IXSEBbFRIteWatYU-WN5zCQEpQPYUWRI4o,49982 -django/forms/forms.py,sha256=2Y2NhbwY2cQiz8zSxdfjO5JO_jZVo8Yn9H2OMYisSXo,16132 -django/forms/formsets.py,sha256=X4otFCXoQgIEII2bTnprrEu4cHC-bpQ9t18Pth8p9MM,21338 -django/forms/jinja2/django/forms/attrs.html,sha256=TD0lNK-ohDjb_bWg1Kosdn4kU01B_M0_C19dp9kYJqo,165 -django/forms/jinja2/django/forms/div.html,sha256=WaOqY1hQe1l6vnc3TdlBmQnQRsofIoNDvGAfg2-X1lU,514 -django/forms/jinja2/django/forms/errors/dict/default.html,sha256=1DLQf0Czjr5V4cghQOyJr3v34G2ClF0RAOc-H7GwXUE,49 -django/forms/jinja2/django/forms/errors/dict/text.txt,sha256=E7eqEWc6q2_kLyc9k926klRe2mPp4O2VqG-2_MliYaU,113 -django/forms/jinja2/django/forms/errors/dict/ul.html,sha256=65EYJOqDAn7-ca7FtjrcdbXygLE-RA_IJQTltO7qS1Q,137 -django/forms/jinja2/django/forms/errors/list/default.html,sha256=q41d4u6XcxDL06gRAVdU021kM_iFLIt5BuYa-HATOWE,49 -django/forms/jinja2/django/forms/errors/list/text.txt,sha256=VVbLrGMHcbs1hK9-2v2Y6SIoH9qRMtlKzM6qzLVAFyE,52 -django/forms/jinja2/django/forms/errors/list/ul.html,sha256=vK5_FeE7w5XBIW2GUlJinteEsMIo0-5rZ3dtV-8LGNg,187 -django/forms/jinja2/django/forms/field.html,sha256=IfeDkBp7yHZDnyD-jVwehX1G15wvfbTkxHkjpUC_dcc,507 -django/forms/jinja2/django/forms/formsets/div.html,sha256=uq10XZdQ1WSt6kJFoKxtluvnCKE4L3oYcLkPraF4ovs,86 -django/forms/jinja2/django/forms/formsets/p.html,sha256=HzEX7XdSDt9owDkYJvBdFIETeU9RDbXc1e4R2YEt6ec,84 -django/forms/jinja2/django/forms/formsets/table.html,sha256=L9B4E8lR0roTr7dBoMiUlekuMbO-3y4_b4NHm6Oy_Vg,88 -django/forms/jinja2/django/forms/formsets/ul.html,sha256=ANvMWb6EeFAtLPDTr61IeI3-YHtAYZCT_zmm-_y-5Oc,85 -django/forms/jinja2/django/forms/label.html,sha256=trXo6yF4ezDv-y-8y1yJnP7sSByw0TTppgZLcrmfR6M,147 -django/forms/jinja2/django/forms/p.html,sha256=NsTxSuqV58iOT7_3EvWRkY1zVYCdhzLBrtde1V47QTA,740 -django/forms/jinja2/django/forms/table.html,sha256=RoJweFtjCPwkFhAAlPT7i_sSCDxo1xMs3NH0uFIla20,881 -django/forms/jinja2/django/forms/ul.html,sha256=svUpAmU5EhhGVHKs8qXixJN-3SzPft8CXoG3-4gegs8,779 -django/forms/jinja2/django/forms/widgets/attrs.html,sha256=_J2P-AOpHFhIwaqCNcrJFxEY4s-KPdy0Wcq0KlarIG0,172 -django/forms/jinja2/django/forms/widgets/checkbox.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/checkbox_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 -django/forms/jinja2/django/forms/widgets/checkbox_select.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 -django/forms/jinja2/django/forms/widgets/clearable_file_input.html,sha256=1dv4xtik6um_mzK1skURF_n4G1t1yluziQu2UWa6fX8,559 -django/forms/jinja2/django/forms/widgets/color.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/date.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/datetime.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/email.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/file.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/hidden.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/input.html,sha256=u12fZde-ugkEAAkPAtAfSxwGQmYBkXkssWohOUs-xoE,172 -django/forms/jinja2/django/forms/widgets/input_option.html,sha256=PyRNn9lmE9Da0-RK37zW4yJZUSiJWgIPCU9ou5oUC28,219 -django/forms/jinja2/django/forms/widgets/multiple_hidden.html,sha256=T54-n1ZeUlTd-svM3C4tLF42umKM0R5A7fdfsdthwkA,54 -django/forms/jinja2/django/forms/widgets/multiple_input.html,sha256=voM3dqu69R0Z202TmCgMFM6toJp7FgFPVvbWY9WKEAU,395 -django/forms/jinja2/django/forms/widgets/multiwidget.html,sha256=pr-MxRyucRxn_HvBGZvbc3JbFyrAolbroxvA4zmPz2Y,86 -django/forms/jinja2/django/forms/widgets/number.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/password.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/radio.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 -django/forms/jinja2/django/forms/widgets/radio_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 -django/forms/jinja2/django/forms/widgets/search.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/select.html,sha256=ESyDzbLTtM7-OG34EuSUnvxCtyP5IrQsZh0jGFrIdEA,365 -django/forms/jinja2/django/forms/widgets/select_date.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/jinja2/django/forms/widgets/select_option.html,sha256=tNa1D3G8iy2ZcWeKyI-mijjDjRmMaqSo-jnAR_VS3Qc,110 -django/forms/jinja2/django/forms/widgets/splitdatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/jinja2/django/forms/widgets/splithiddendatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/jinja2/django/forms/widgets/tel.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/text.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/textarea.html,sha256=Av1Y-hpXUU2AjrhnUivgZFKNBLdwCSZSeuSmCqmCkDA,145 -django/forms/jinja2/django/forms/widgets/time.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/url.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/models.py,sha256=iTw-csqlUkObA465IZ1jkd8cUi61Gbb0Jp3Z5UqIhiA,61213 -django/forms/renderers.py,sha256=cr376RSNhqkOJlhJU0bJOUjbUDiLQ-6yFdcejxvRY7w,3285 -django/forms/templates/django/forms/attrs.html,sha256=UFPgCXXCAkbumxZE1NM-aJVE4VCe2RjCrHLNseibv3I,165 -django/forms/templates/django/forms/div.html,sha256=PgJSGlEXXLmh58WLH49cxvUaWI8bxE0ioTf-MY89uF8,525 -django/forms/templates/django/forms/errors/dict/default.html,sha256=tFtwfHlkOY_XaKjoUPsWshiSWT5olxm3kDElND-GQtQ,48 -django/forms/templates/django/forms/errors/dict/text.txt,sha256=E7eqEWc6q2_kLyc9k926klRe2mPp4O2VqG-2_MliYaU,113 -django/forms/templates/django/forms/errors/dict/ul.html,sha256=65EYJOqDAn7-ca7FtjrcdbXygLE-RA_IJQTltO7qS1Q,137 -django/forms/templates/django/forms/errors/list/default.html,sha256=Kmx1nwrzQ49MaP80Gd17GC5TQH4B7doWa3I3azXvoHA,48 -django/forms/templates/django/forms/errors/list/text.txt,sha256=VVbLrGMHcbs1hK9-2v2Y6SIoH9qRMtlKzM6qzLVAFyE,52 -django/forms/templates/django/forms/errors/list/ul.html,sha256=hPgaIuN9n1pvdybEs6zKK_OkFihIMbTb5ykcTQlASEw,186 -django/forms/templates/django/forms/field.html,sha256=_TsLfCjYj1uzlkjy9qJdqyrZevtgH08BfMebilrdeMU,502 -django/forms/templates/django/forms/formsets/div.html,sha256=lmIRSTBuGczEd2lj-UfDS9zAlVv8ntpmRo-boDDRwEg,84 -django/forms/templates/django/forms/formsets/p.html,sha256=qkoHKem-gb3iqvTtROBcHNJqI-RoUwLHUvJC6EoHg-I,82 -django/forms/templates/django/forms/formsets/table.html,sha256=N0G9GETzJfV16wUesvdrNMDwc8Fhh6durrmkHUPeDZY,86 -django/forms/templates/django/forms/formsets/ul.html,sha256=bGQpjbpKwMahyiIP4-2p3zg3yJP-pN1A48yCqhHdw7o,83 -django/forms/templates/django/forms/label.html,sha256=0bJCdIj8G5e2Gaw3QUR0ZMdwVavC80YwxS5E0ShkzmE,122 -django/forms/templates/django/forms/p.html,sha256=NhXyxIJCngGT7xK2nA4_vpEWWiaIcIUKGVOmMcnjRy4,751 -django/forms/templates/django/forms/table.html,sha256=ELTypjKfqSluAJk6-no0m2_Rve3c6HJoWV3hQ_xfnto,892 -django/forms/templates/django/forms/ul.html,sha256=vPmRsKnLcofRZJq23XHxnBs8PLs6jD4_Pw1ULbtSxPg,790 -django/forms/templates/django/forms/widgets/attrs.html,sha256=9ylIPv5EZg-rx2qPLgobRkw6Zq_WJSM8kt106PpSYa0,172 -django/forms/templates/django/forms/widgets/checkbox.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/checkbox_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 -django/forms/templates/django/forms/widgets/checkbox_select.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 -django/forms/templates/django/forms/widgets/clearable_file_input.html,sha256=1dv4xtik6um_mzK1skURF_n4G1t1yluziQu2UWa6fX8,559 -django/forms/templates/django/forms/widgets/color.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/date.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/datetime.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/email.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/file.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/hidden.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/input.html,sha256=dwzzrLocGLZQIaGe-_X8k7z87jV6AFtn28LilnUnUH0,189 -django/forms/templates/django/forms/widgets/input_option.html,sha256=PyRNn9lmE9Da0-RK37zW4yJZUSiJWgIPCU9ou5oUC28,219 -django/forms/templates/django/forms/widgets/multiple_hidden.html,sha256=T54-n1ZeUlTd-svM3C4tLF42umKM0R5A7fdfsdthwkA,54 -django/forms/templates/django/forms/widgets/multiple_input.html,sha256=jxEWRqV32a73340eQ0uIn672Xz5jW9qm3V_srByLEd0,426 -django/forms/templates/django/forms/widgets/multiwidget.html,sha256=slk4AgCdXnVmFvavhjVcsza0quTOP2LG50D8wna0dw0,117 -django/forms/templates/django/forms/widgets/number.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/password.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/radio.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 -django/forms/templates/django/forms/widgets/radio_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 -django/forms/templates/django/forms/widgets/search.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/select.html,sha256=7U0RzjeESG87ENzQjPRUF71gvKvGjVVvXcpsW2-BTR4,384 -django/forms/templates/django/forms/widgets/select_date.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/templates/django/forms/widgets/select_option.html,sha256=N_psd0JYCqNhx2eh2oyvkF2KU2dv7M9mtMw_4BLYq8A,127 -django/forms/templates/django/forms/widgets/splitdatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/templates/django/forms/widgets/splithiddendatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/templates/django/forms/widgets/tel.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/text.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/textarea.html,sha256=Av1Y-hpXUU2AjrhnUivgZFKNBLdwCSZSeuSmCqmCkDA,145 -django/forms/templates/django/forms/widgets/time.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/url.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/utils.py,sha256=fpG-AByrNerAqkDT6alV83zPDs3gs84LFDW61b9ys0E,7974 -django/forms/widgets.py,sha256=BOMbGYN8_VmBWoOkns9Oau4O2yWeyr38P8amNwisLs8,41244 -django/http/__init__.py,sha256=uVUz0ov-emc29hbD78QKKka_R1L4mpDDPhkyfkx4jzQ,1200 -django/http/__pycache__/__init__.cpython-310.pyc,, -django/http/__pycache__/cookie.cpython-310.pyc,, -django/http/__pycache__/multipartparser.cpython-310.pyc,, -django/http/__pycache__/request.cpython-310.pyc,, -django/http/__pycache__/response.cpython-310.pyc,, -django/http/cookie.py,sha256=t7yGORGClUnCYVKQqyLBlEYsxQLLHn9crsMSWqK_Eic,679 -django/http/multipartparser.py,sha256=mrVXa2yenSbSOOlhIrgbfWS-3qlhvVtDEflSgTAKtsk,27830 -django/http/request.py,sha256=t8Hk52HY0ImmqhQd8zPh-PsYg6C_dipxdIx0WnpW4Bw,27524 -django/http/response.py,sha256=SO6iaoCreSca5UU84FlPBelGOdk_LJyTdoVtotIS51Y,25955 -django/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/middleware/__pycache__/__init__.cpython-310.pyc,, -django/middleware/__pycache__/cache.cpython-310.pyc,, -django/middleware/__pycache__/clickjacking.cpython-310.pyc,, -django/middleware/__pycache__/common.cpython-310.pyc,, -django/middleware/__pycache__/csrf.cpython-310.pyc,, -django/middleware/__pycache__/gzip.cpython-310.pyc,, -django/middleware/__pycache__/http.cpython-310.pyc,, -django/middleware/__pycache__/locale.cpython-310.pyc,, -django/middleware/__pycache__/security.cpython-310.pyc,, -django/middleware/cache.py,sha256=KOlg-Knjx_17KtXr-vx2DEpWvpzojk3yFUSsMHUIYo4,8487 -django/middleware/clickjacking.py,sha256=rIm2VlbblLWrMTRYJ1JBIui5xshAM-2mpyJf989xOgY,1724 -django/middleware/common.py,sha256=9jJWVzLZITjEw5tWyW_DjEg7gtkzUYwwkJPWHkepaIc,7666 -django/middleware/csrf.py,sha256=Kz1sjE6gad3dLXiKz29p7OQzuuTlhmXN-SuT6F8VCWM,19489 -django/middleware/gzip.py,sha256=jsJeYv0-A4iD6-1Pd3Hehl2ZtshpE4WeBTei-4PwciA,2945 -django/middleware/http.py,sha256=RqXN9Kp6GEh8j_ub7YXRi6W2_CKZTZEyAPpFUzeNPBs,1616 -django/middleware/locale.py,sha256=CV8aerSUWmO6cJQ6IrD5BzT3YlOxYNIqFraCqr8DoY4,3442 -django/middleware/security.py,sha256=yqawglqNcPrITIUvQhSpn3BD899It4fhyOyJCTImlXE,2599 -django/shortcuts.py,sha256=O9UrrZmXjVfdzC3DXW6dDyZwXE4YG4BRpftDE8D1QF0,6506 -django/template/__init__.py,sha256=-hvAhcRO8ydLdjTJJFr6LYoBVCsJq561ebRqE9kYBJs,1845 -django/template/__pycache__/__init__.cpython-310.pyc,, -django/template/__pycache__/autoreload.cpython-310.pyc,, -django/template/__pycache__/base.cpython-310.pyc,, -django/template/__pycache__/context.cpython-310.pyc,, -django/template/__pycache__/context_processors.cpython-310.pyc,, -django/template/__pycache__/defaultfilters.cpython-310.pyc,, -django/template/__pycache__/defaulttags.cpython-310.pyc,, -django/template/__pycache__/engine.cpython-310.pyc,, -django/template/__pycache__/exceptions.cpython-310.pyc,, -django/template/__pycache__/library.cpython-310.pyc,, -django/template/__pycache__/loader.cpython-310.pyc,, -django/template/__pycache__/loader_tags.cpython-310.pyc,, -django/template/__pycache__/response.cpython-310.pyc,, -django/template/__pycache__/smartif.cpython-310.pyc,, -django/template/__pycache__/utils.cpython-310.pyc,, -django/template/autoreload.py,sha256=hBanYQNDNEdgpty89I2mP_bxD-MyaeXWRmgX3K6a8Zg,2063 -django/template/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/template/backends/__pycache__/__init__.cpython-310.pyc,, -django/template/backends/__pycache__/base.cpython-310.pyc,, -django/template/backends/__pycache__/django.cpython-310.pyc,, -django/template/backends/__pycache__/dummy.cpython-310.pyc,, -django/template/backends/__pycache__/jinja2.cpython-310.pyc,, -django/template/backends/__pycache__/utils.cpython-310.pyc,, -django/template/backends/base.py,sha256=IniOWzwfJHhrg0azO55fhZ3d1cghNjvsrgaMkV7o6x4,2801 -django/template/backends/django.py,sha256=wbOUhTVQyz2HvrTVG1GJUknDPJtuBFDuXbm15xf7jO4,5963 -django/template/backends/dummy.py,sha256=M62stG_knf7AdVp42ZWWddkNv6g6ck_sc1nRR6Sc_xA,1751 -django/template/backends/jinja2.py,sha256=U9WBznoElT-REbITG7DnZgR7SA_Awf1gWS9vc0yrEfs,4036 -django/template/backends/utils.py,sha256=z5X_lxKa9qL4KFDVeai-FmsewU3KLgVHO8y-gHLiVts,424 -django/template/base.py,sha256=0vOGKZlXbdHsFCkdsaH9XFSmgUDJoDTzDOLf7ebBdRg,41002 -django/template/context.py,sha256=7FnF26wDyXjcXUDdFpBm-UFFsiNiwa5hod4nEaLstj8,9448 -django/template/context_processors.py,sha256=PMIuGUE1iljf5L8oXggIdvvFOhCLJpASdwd39BMdjBE,2480 -django/template/defaultfilters.py,sha256=BxaTQcUOmE4C_-FLhCQkATQS0S0z7jGfSaouGPl3T5A,28438 -django/template/defaulttags.py,sha256=EV4jJrScjDwzBJN2nJhBLMYn5bI2tBj5XpWU58wdumk,49669 -django/template/engine.py,sha256=gpk2HUxFfxVhw5onriW1uHVAec6JhVHqMcObNESXwO4,7773 -django/template/exceptions.py,sha256=rqG3_qZq31tUHbmtZD-MIu0StChqwaFejFFpR4u7th4,1342 -django/template/library.py,sha256=VBLQd0tmUlxfZTtOMziRY3Y6706kRtRtqP_J0sUSamY,16683 -django/template/loader.py,sha256=PVFUUtC5WgiRVVTilhQ6NFZnvjly6sP9s7anFmMoKdo,2054 -django/template/loader_tags.py,sha256=7_1LTeoQHGwsrML0whwUug6g6bR3ijhmwiMRH7Xs0CQ,13234 -django/template/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/template/loaders/__pycache__/__init__.cpython-310.pyc,, -django/template/loaders/__pycache__/app_directories.cpython-310.pyc,, -django/template/loaders/__pycache__/base.cpython-310.pyc,, -django/template/loaders/__pycache__/cached.cpython-310.pyc,, -django/template/loaders/__pycache__/filesystem.cpython-310.pyc,, -django/template/loaders/__pycache__/locmem.cpython-310.pyc,, -django/template/loaders/app_directories.py,sha256=sQpVXKYpnKr9Rl1YStNca-bGIQHcOkSnmm1l2qRGFVE,312 -django/template/loaders/base.py,sha256=Y5V4g0ly9GuNe7BQxaJSMENJnvxzXJm7XhSTxzfFM0s,1636 -django/template/loaders/cached.py,sha256=bDwkWYPgbvprU_u9f9w9oNYpSW_j9b7so_mlKzp9-N4,3716 -django/template/loaders/filesystem.py,sha256=f4silD7WWhv3K9QySMgW7dlGGNwwYAcHCMSTFpwiiXY,1506 -django/template/loaders/locmem.py,sha256=t9p0GYF2VHf4XG6Gggp0KBmHkdIuSKuLdiVXMVb2iHs,672 -django/template/response.py,sha256=UAU-aM7mn6cbGOIJuurn4EE5ITdcAqSFgKD5RXFms4w,5584 -django/template/smartif.py,sha256=TLbvSZa_M4B80M2X108FK2TFjHoA8RG9bfxB0PLKNck,6410 -django/template/utils.py,sha256=9Cp3AVmWg0xvVvsL2HAYw4LDP1nJea3fTWeaojX7gpg,3571 -django/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/templatetags/__pycache__/__init__.cpython-310.pyc,, -django/templatetags/__pycache__/cache.cpython-310.pyc,, -django/templatetags/__pycache__/i18n.cpython-310.pyc,, -django/templatetags/__pycache__/l10n.cpython-310.pyc,, -django/templatetags/__pycache__/static.cpython-310.pyc,, -django/templatetags/__pycache__/tz.cpython-310.pyc,, -django/templatetags/cache.py,sha256=WaYvWUn5ZTERwjouvkm-c5L5LRLc-GpSWl19wFod_bk,3551 -django/templatetags/i18n.py,sha256=UrS-aE3XCEK_oX18kmH8gSgA10MGHMeMTLOAESDtufI,19961 -django/templatetags/l10n.py,sha256=GB5_u3ymAtzxUtAY8QLb_pcZrzie9ZxEca-1NuKIXBY,1563 -django/templatetags/static.py,sha256=W4Rqt3DN_YtXe6EoqO-GLy7WR7xd7z0JsoX-VT0vvjc,4730 -django/templatetags/tz.py,sha256=0uSwEcqywsn1FrdOtyIjSsSCCEqzW0CDVebP-tzIBiY,5357 -django/test/__init__.py,sha256=X12C98lKN5JW1-wms7B6OaMTo-Li90waQpjfJE1V3AE,834 -django/test/__pycache__/__init__.cpython-310.pyc,, -django/test/__pycache__/client.cpython-310.pyc,, -django/test/__pycache__/html.cpython-310.pyc,, -django/test/__pycache__/runner.cpython-310.pyc,, -django/test/__pycache__/selenium.cpython-310.pyc,, -django/test/__pycache__/signals.cpython-310.pyc,, -django/test/__pycache__/testcases.cpython-310.pyc,, -django/test/__pycache__/utils.cpython-310.pyc,, -django/test/client.py,sha256=SIjYoG2U1oD4Vfed9FXopcIJ_Gg44yeSMqT8RKVaZEE,55809 -django/test/html.py,sha256=W97B8kAeeY3tqWrttffWkI0bK-j-vn69l-79WCsMu9A,8869 -django/test/runner.py,sha256=fQvXdmfREscThS4_xGSBlr_yLd3PUfA5SGYVYvjgj2I,43032 -django/test/selenium.py,sha256=DtQxR_MqglIfkR5dMQXeNiC3l_vmgxllRuHBz_LKZNY,9685 -django/test/signals.py,sha256=qiQBLO_rjVITdLDV4WiDVqfdGGGa5BLV4jLOn0XHJFw,7368 -django/test/testcases.py,sha256=MAs0OJV7hue-wGpEy30PKT0we5-cbLoLlY1Asv7cbAM,68421 -django/test/utils.py,sha256=fQmrEuIyFm87WutJgeERXojZtTySNVULgtRKBARWCYE,32702 -django/urls/__init__.py,sha256=BHyBIOD3E4_3Ng27SpXnRmqO3IzUqvBLCE4TTfs4wNs,1079 -django/urls/__pycache__/__init__.cpython-310.pyc,, -django/urls/__pycache__/base.cpython-310.pyc,, -django/urls/__pycache__/conf.cpython-310.pyc,, -django/urls/__pycache__/converters.cpython-310.pyc,, -django/urls/__pycache__/exceptions.cpython-310.pyc,, -django/urls/__pycache__/resolvers.cpython-310.pyc,, -django/urls/__pycache__/utils.cpython-310.pyc,, -django/urls/base.py,sha256=Zx0VSoVkq-bwiC7izLEYf43yZ6uD9fs4E6UmJEHuyvQ,6191 -django/urls/conf.py,sha256=TFZCdC1G8KftDuB_I7smC7UH1QGKkm5o1uNAIKP2B7M,3426 -django/urls/converters.py,sha256=OTsqmA3uCrmY7Xh94HUaOjGCBttNIKKOJRfPYBm5twM,1782 -django/urls/exceptions.py,sha256=alLNjkORtAxneC00g4qnRpG5wouOHvJvGbymdpKtG_I,115 -django/urls/resolvers.py,sha256=5p7SVNVhh9FmuFke5IquHKPO3jSA29N_eiXzsMpi2xE,31518 -django/urls/utils.py,sha256=d1KSc6JVR-5Z8axg_yDgYKtkqObdbJwWNkhcB8x44Rs,2179 -django/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/utils/__pycache__/__init__.cpython-310.pyc,, -django/utils/__pycache__/_os.cpython-310.pyc,, -django/utils/__pycache__/archive.cpython-310.pyc,, -django/utils/__pycache__/asyncio.cpython-310.pyc,, -django/utils/__pycache__/autoreload.cpython-310.pyc,, -django/utils/__pycache__/cache.cpython-310.pyc,, -django/utils/__pycache__/choices.cpython-310.pyc,, -django/utils/__pycache__/connection.cpython-310.pyc,, -django/utils/__pycache__/crypto.cpython-310.pyc,, -django/utils/__pycache__/datastructures.cpython-310.pyc,, -django/utils/__pycache__/dateformat.cpython-310.pyc,, -django/utils/__pycache__/dateparse.cpython-310.pyc,, -django/utils/__pycache__/dates.cpython-310.pyc,, -django/utils/__pycache__/deconstruct.cpython-310.pyc,, -django/utils/__pycache__/decorators.cpython-310.pyc,, -django/utils/__pycache__/deprecation.cpython-310.pyc,, -django/utils/__pycache__/duration.cpython-310.pyc,, -django/utils/__pycache__/encoding.cpython-310.pyc,, -django/utils/__pycache__/feedgenerator.cpython-310.pyc,, -django/utils/__pycache__/formats.cpython-310.pyc,, -django/utils/__pycache__/functional.cpython-310.pyc,, -django/utils/__pycache__/hashable.cpython-310.pyc,, -django/utils/__pycache__/html.cpython-310.pyc,, -django/utils/__pycache__/http.cpython-310.pyc,, -django/utils/__pycache__/inspect.cpython-310.pyc,, -django/utils/__pycache__/ipv6.cpython-310.pyc,, -django/utils/__pycache__/itercompat.cpython-310.pyc,, -django/utils/__pycache__/log.cpython-310.pyc,, -django/utils/__pycache__/lorem_ipsum.cpython-310.pyc,, -django/utils/__pycache__/module_loading.cpython-310.pyc,, -django/utils/__pycache__/numberformat.cpython-310.pyc,, -django/utils/__pycache__/regex_helper.cpython-310.pyc,, -django/utils/__pycache__/safestring.cpython-310.pyc,, -django/utils/__pycache__/termcolors.cpython-310.pyc,, -django/utils/__pycache__/text.cpython-310.pyc,, -django/utils/__pycache__/timesince.cpython-310.pyc,, -django/utils/__pycache__/timezone.cpython-310.pyc,, -django/utils/__pycache__/tree.cpython-310.pyc,, -django/utils/__pycache__/version.cpython-310.pyc,, -django/utils/__pycache__/xmlutils.cpython-310.pyc,, -django/utils/_os.py,sha256=Q0d96RWFaQr6YqG00GulGqQ9M2Oni5WIjf_y4JnEWn8,2323 -django/utils/archive.py,sha256=HOBIOtVUzxNe_scK0gl-gu1yeQGU8X4VkYIdyCwkFuA,8087 -django/utils/asyncio.py,sha256=0glOg3eGmms-gUv04ZgDvZt19IZbdPBC64PnaKqeGDc,1138 -django/utils/autoreload.py,sha256=S4Gfud4xl0pW6Gd-0E7La5pjFC7cWqy8h0wwE-W56QY,24429 -django/utils/cache.py,sha256=xyazhD17lfCRXbWHnNWbI1WMHvwyXLUupRzG670y8gU,16583 -django/utils/choices.py,sha256=OgXb_QqEjzf_ODgEzZqkL5yGJLHVQtwh9FAUPvKoUWQ,4202 -django/utils/connection.py,sha256=2kqA6M_EObbZg6QKMXhX6p4YXG9RiPTUHwwN3mumhDY,2554 -django/utils/crypto.py,sha256=91KEDCMKAh3kKAMxUv2eQQKMEj-EgbMWRE2lVjmAzgY,2662 -django/utils/datastructures.py,sha256=mEt2-kg3zOQ24fW7ltxZDFaatZZyTSeJP9WAGWOg6UM,10267 -django/utils/dateformat.py,sha256=FvIRPWcVlSTQfVnPARPbV1BtQ1OX3Z3i49Iiyx9JuDI,10118 -django/utils/dateparse.py,sha256=oWTWbJax4NP1uY7tCGPSgnyAkoGxnXf1snEh-kfCkiQ,5356 -django/utils/dates.py,sha256=zHUHeOkxuo53rTvHG3dWMLRfVyfaMLBIt5xmA4E_Ids,2179 -django/utils/deconstruct.py,sha256=R3ks8L-Cif9-qyNwy-2R6KWf9UmcGDSiMGX-N6CbLOA,2126 -django/utils/decorators.py,sha256=NzaeY0m6u-HXXwRkbGvdX0IiZ8wNDYV8fDR8w42Roec,8328 -django/utils/deprecation.py,sha256=aNLOljxbMxDHWWr6Sy1ul2VV90Fzugc6e6YZGw0FfEo,4876 -django/utils/duration.py,sha256=HK5E36F1GGdPchCqHsmloYhrHX_ByyITvOHyuxtElSE,1230 -django/utils/encoding.py,sha256=DLjcAjvBxrz5Jr5d8T2XnEUccseRVHTTXOm-zf-FVD4,8793 -django/utils/feedgenerator.py,sha256=hyzzlLrh6uSJhfhRJF2944Sb0HimXRGria76u5tlSkY,18089 -django/utils/formats.py,sha256=FmPUj3dfL2gCH2ijcWtcesYKbsi2-EbHGLGyHvGOJA0,10255 -django/utils/functional.py,sha256=URFZkoTNJmOlm_ay9872-_lEgV1ewunZS9GKSJRg-e8,14541 -django/utils/hashable.py,sha256=HzcLr4YPZGls_TLt0aQra7cCHcFp-hpTEOcOJ_DTQj0,738 -django/utils/html.py,sha256=pA_7ho-cs4crCkA0tNt348kSFutKZKndpHJEgL4-MMM,17222 -django/utils/http.py,sha256=xlxAp4EEEt4Axc2tWaVdtNedNsZaBhBozWqnCdErkXw,13547 -django/utils/inspect.py,sha256=utTOblKvpF1VhziK14LoUDtAjMP9xVX9q5a-Q3YKd2o,2318 -django/utils/ipv6.py,sha256=VN3hdrlGKo6TQLTa6Kvgz27KzTkdYMOBJmuc8QTXbpU,1823 -django/utils/itercompat.py,sha256=mXmO77Sd3P_0VN6ox4kAorZ2vo2CjKRiFBuDbIqu1os,532 -django/utils/log.py,sha256=5qHhornekS3LJLFEr095hu4wqL4bfPqdjKKhzx7vMFw,8186 -django/utils/lorem_ipsum.py,sha256=yUtBgKhshftIpPg04pc1IrLpOBydZIf7g0isFCIJZqk,5473 -django/utils/module_loading.py,sha256=-a7qOb5rpp-Lw_51vyIPSdb7R40B16Er1Zc1C_a6ibY,3820 -django/utils/numberformat.py,sha256=8LqSMmfxaN0PYSTTES6UT_ATerfDYQn7Ya4NI70gMaU,3781 -django/utils/regex_helper.py,sha256=FsGQkHjDNJmYnCDPT2f3b07hdp4RRNTMB_KgSRe-8hs,12772 -django/utils/safestring.py,sha256=pfrpF3uJeAWcF-0naIPRr6QjDomUB8yc4k1gSN-zERA,2178 -django/utils/termcolors.py,sha256=vvQbUH7GsFofGRSiKQwx4YvgE4yZMtAGRVz9QPDfisA,7386 -django/utils/text.py,sha256=rYP3BmzdFUPErRZwrBzXlyrMh-P_gLot9qwoQQ0HU-E,14268 -django/utils/timesince.py,sha256=j9B_wSnsdS3ZXn9pt9GImOJDpgO61YMr_jtnUpZDx0g,4914 -django/utils/timezone.py,sha256=Wg4eIhEHAsOMEKlzfSS_aYPf-h70DYqOqnmRDG1TbbE,7295 -django/utils/translation/__init__.py,sha256=IzuMZHXY059T4hOcsqQjDmSOT2itEQb8OBsNi88aURA,8878 -django/utils/translation/__pycache__/__init__.cpython-310.pyc,, -django/utils/translation/__pycache__/reloader.cpython-310.pyc,, -django/utils/translation/__pycache__/template.cpython-310.pyc,, -django/utils/translation/__pycache__/trans_null.cpython-310.pyc,, -django/utils/translation/__pycache__/trans_real.cpython-310.pyc,, -django/utils/translation/reloader.py,sha256=oVM0xenn3fraUomMEFucvwlbr5UGYUijWnUn6FL55Zc,1114 -django/utils/translation/template.py,sha256=TOfPNT62RnUbUG64a_6d_VQ7tsDC1_F1TCopw_HwlcA,10549 -django/utils/translation/trans_null.py,sha256=niy_g1nztS2bPsINqK7_g0HcpI_w6hL-c8_hqpC7U7s,1287 -django/utils/translation/trans_real.py,sha256=nt-w0rGgdcynyljdBGPqhMaDsdtvR_IyZiAvO4J2LS4,22273 -django/utils/tree.py,sha256=v8sNUsnsG2Loi9xBIIk0GmV5yN7VWOGTzbmk8BOEs6E,4394 -django/utils/version.py,sha256=YJ41J-BggYvEJNpTS8pU5x7utd-327YAjusfdTkTMrI,3737 -django/utils/xmlutils.py,sha256=LsggeI4vhln3An_YXNBk2cCwKLQgMe-O_3L--j3o3GM,1172 -django/views/__init__.py,sha256=GIq6CKUBCbGpQVyK4xIoaAUDPrmRvbBPSX_KSHk0Bb4,63 -django/views/__pycache__/__init__.cpython-310.pyc,, -django/views/__pycache__/csrf.cpython-310.pyc,, -django/views/__pycache__/debug.cpython-310.pyc,, -django/views/__pycache__/defaults.cpython-310.pyc,, -django/views/__pycache__/i18n.cpython-310.pyc,, -django/views/__pycache__/static.cpython-310.pyc,, -django/views/csrf.py,sha256=PwZPfYD-zI0SL19etlwAcpD4LOMp8Flu1qPGgHlrsBg,3425 -django/views/debug.py,sha256=4oMlptUiQdp1oMeC3aQY6z-6r_F91iuEg1YKrZUsLc8,25670 -django/views/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/views/decorators/__pycache__/__init__.cpython-310.pyc,, -django/views/decorators/__pycache__/cache.cpython-310.pyc,, -django/views/decorators/__pycache__/clickjacking.cpython-310.pyc,, -django/views/decorators/__pycache__/common.cpython-310.pyc,, -django/views/decorators/__pycache__/csrf.cpython-310.pyc,, -django/views/decorators/__pycache__/debug.cpython-310.pyc,, -django/views/decorators/__pycache__/gzip.cpython-310.pyc,, -django/views/decorators/__pycache__/http.cpython-310.pyc,, -django/views/decorators/__pycache__/vary.cpython-310.pyc,, -django/views/decorators/cache.py,sha256=4cWEWW88qPv57St9Wwmv0aK0vVxD-7aevFOQc8z4pQs,2821 -django/views/decorators/clickjacking.py,sha256=3w8djeDoQUK67uDfIzi9jdlds_ZdekwDMIV2IM8NBWk,2555 -django/views/decorators/common.py,sha256=Kcj1Q-aPTBLGMW_kkeUleRiYiEZCg7uoP_UexklyyQA,739 -django/views/decorators/csrf.py,sha256=q9lXnlNkbm7Hlg4FRx1pesf64sNpCIC52mCqY7xduZo,2324 -django/views/decorators/debug.py,sha256=jvKimgFDSVzCN3RWA1X5Ry7BSADFA21K3A2RjUsJy7E,5256 -django/views/decorators/gzip.py,sha256=PtpSGd8BePa1utGqvKMFzpLtZJxpV2_Jej8llw5bCJY,253 -django/views/decorators/http.py,sha256=vaoIxGGIn6kychggji7CmdmVl5JXvNs-7FUUVNv5w9Y,6533 -django/views/decorators/vary.py,sha256=DGR1eA8mSaXM8kgMJta4XnzCznJIrW1_KDMrd4aqCTM,1201 -django/views/defaults.py,sha256=BXT36auw8XF5ZwqdU0akzX5ITFBWhuy8idT8YGkCo_I,4718 -django/views/generic/__init__.py,sha256=VwQKUbBFJktiq5J2fo3qRNzRc0STfcMRPChlLPYAkkE,886 -django/views/generic/__pycache__/__init__.cpython-310.pyc,, -django/views/generic/__pycache__/base.cpython-310.pyc,, -django/views/generic/__pycache__/dates.cpython-310.pyc,, -django/views/generic/__pycache__/detail.cpython-310.pyc,, -django/views/generic/__pycache__/edit.cpython-310.pyc,, -django/views/generic/__pycache__/list.cpython-310.pyc,, -django/views/generic/base.py,sha256=p5HbLA01-FQSqC3hSGIg7jQk23khBMn9ssg4d9GHui4,9275 -django/views/generic/dates.py,sha256=xTAGETRksrGbGreC6Y7CAHMjMQLAgOoxPfxocPGrMqQ,26921 -django/views/generic/detail.py,sha256=XTkGIGWpaGxbudMvGOrFKC6p8sl_EKhn13IA5g_1z8w,7022 -django/views/generic/edit.py,sha256=uyRw11siRsNRXz0id4A2crJeDGUncQ8Ce4fiWbDgtDg,9040 -django/views/generic/list.py,sha256=KyVxf8MXaQg2uYG3vmIVQXhSkq7PiTM6sTkJlYKy1mE,8009 -django/views/i18n.py,sha256=EVTwiUOVetsRqzxs3HSwiuC7Wa_e-CYBDq26m_Nexk8,9020 -django/views/static.py,sha256=dfEj3tr0tBN6fW02T0z43fszVSj1DB6Gxe-C3V4VYPo,4055 -django/views/templates/csrf_403.html,sha256=lrD9CeNoW5UOC1cay8RJzydMMWF12BMMSpz5UDufNAk,2856 -django/views/templates/default_urlconf.html,sha256=P8dRIQu9i-K38Gsk-OP7nAMR4vGtMd2-Pw6cWjKnhN8,12521 -django/views/templates/directory_index.html,sha256=0CGI4FUy9n_Yo2e7U2vWeKCLsUgizBmoqHseNQxxe04,653 -django/views/templates/i18n_catalog.js,sha256=WTPJxawKwdORo12g9I_mUn4YSU6Xx-DCx6E06yKBKZQ,2785 -django/views/templates/technical_404.html,sha256=da7h7kPnDufG3D1KM5JzySVHEm4mTYx3UxV8KdPSz_c,2816 -django/views/templates/technical_500.html,sha256=pHmxLtEwFNAw4zt3k97ty5dvYq9q0E0p1nFF1pRYdpI,18138 -django/views/templates/technical_500.txt,sha256=b0ihE_FS7YtfAFOXU_yk0-CTgUmZ4ZkWVfkFHdEQXQI,3712 diff --git a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/REQUESTED b/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/WHEEL deleted file mode 100644 index 79d5c89..0000000 --- a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.45.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/entry_points.txt b/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/entry_points.txt deleted file mode 100644 index eaeb88e..0000000 --- a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -django-admin = django.core.management:execute_from_command_line diff --git a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/top_level.txt deleted file mode 100644 index d3e4ba5..0000000 --- a/.venv/lib/python3.10/site-packages/Django-5.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -django diff --git a/.venv/lib/python3.10/site-packages/PIL/AvifImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/AvifImagePlugin.py deleted file mode 100644 index b2c5ab1..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/AvifImagePlugin.py +++ /dev/null @@ -1,292 +0,0 @@ -from __future__ import annotations - -import os -from io import BytesIO -from typing import IO - -from . import ExifTags, Image, ImageFile - -try: - from . import _avif - - SUPPORTED = True -except ImportError: - SUPPORTED = False - -# Decoder options as module globals, until there is a way to pass parameters -# to Image.open (see https://github.com/python-pillow/Pillow/issues/569) -DECODE_CODEC_CHOICE = "auto" -# Decoding is only affected by this for libavif **0.8.4** or greater. -DEFAULT_MAX_THREADS = 0 - - -def get_codec_version(codec_name: str) -> str | None: - versions = _avif.codec_versions() - for version in versions.split(", "): - if version.split(" [")[0] == codec_name: - return version.split(":")[-1].split(" ")[0] - return None - - -def _accept(prefix: bytes) -> bool | str: - if prefix[4:8] != b"ftyp": - return False - major_brand = prefix[8:12] - if major_brand in ( - # coding brands - b"avif", - b"avis", - # We accept files with AVIF container brands; we can't yet know if - # the ftyp box has the correct compatible brands, but if it doesn't - # then the plugin will raise a SyntaxError which Pillow will catch - # before moving on to the next plugin that accepts the file. - # - # Also, because this file might not actually be an AVIF file, we - # don't raise an error if AVIF support isn't properly compiled. - b"mif1", - b"msf1", - ): - if not SUPPORTED: - return ( - "image file could not be identified because AVIF support not installed" - ) - return True - return False - - -def _get_default_max_threads() -> int: - if DEFAULT_MAX_THREADS: - return DEFAULT_MAX_THREADS - if hasattr(os, "sched_getaffinity"): - return len(os.sched_getaffinity(0)) - else: - return os.cpu_count() or 1 - - -class AvifImageFile(ImageFile.ImageFile): - format = "AVIF" - format_description = "AVIF image" - __frame = -1 - - def _open(self) -> None: - if not SUPPORTED: - msg = "image file could not be opened because AVIF support not installed" - raise SyntaxError(msg) - - if DECODE_CODEC_CHOICE != "auto" and not _avif.decoder_codec_available( - DECODE_CODEC_CHOICE - ): - msg = "Invalid opening codec" - raise ValueError(msg) - self._decoder = _avif.AvifDecoder( - self.fp.read(), - DECODE_CODEC_CHOICE, - _get_default_max_threads(), - ) - - # Get info from decoder - self._size, self.n_frames, self._mode, icc, exif, exif_orientation, xmp = ( - self._decoder.get_info() - ) - self.is_animated = self.n_frames > 1 - - if icc: - self.info["icc_profile"] = icc - if xmp: - self.info["xmp"] = xmp - - if exif_orientation != 1 or exif: - exif_data = Image.Exif() - if exif: - exif_data.load(exif) - original_orientation = exif_data.get(ExifTags.Base.Orientation, 1) - else: - original_orientation = 1 - if exif_orientation != original_orientation: - exif_data[ExifTags.Base.Orientation] = exif_orientation - exif = exif_data.tobytes() - if exif: - self.info["exif"] = exif - self.seek(0) - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - - # Set tile - self.__frame = frame - self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 0, self.mode)] - - def load(self) -> Image.core.PixelAccess | None: - if self.tile: - # We need to load the image data for this frame - data, timescale, pts_in_timescales, duration_in_timescales = ( - self._decoder.get_frame(self.__frame) - ) - self.info["timestamp"] = round(1000 * (pts_in_timescales / timescale)) - self.info["duration"] = round(1000 * (duration_in_timescales / timescale)) - - if self.fp and self._exclusive_fp: - self.fp.close() - self.fp = BytesIO(data) - - return super().load() - - def load_seek(self, pos: int) -> None: - pass - - def tell(self) -> int: - return self.__frame - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, save_all=True) - - -def _save( - im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False -) -> None: - info = im.encoderinfo.copy() - if save_all: - append_images = list(info.get("append_images", [])) - else: - append_images = [] - - total = 0 - for ims in [im] + append_images: - total += getattr(ims, "n_frames", 1) - - quality = info.get("quality", 75) - if not isinstance(quality, int) or quality < 0 or quality > 100: - msg = "Invalid quality setting" - raise ValueError(msg) - - duration = info.get("duration", 0) - subsampling = info.get("subsampling", "4:2:0") - speed = info.get("speed", 6) - max_threads = info.get("max_threads", _get_default_max_threads()) - codec = info.get("codec", "auto") - if codec != "auto" and not _avif.encoder_codec_available(codec): - msg = "Invalid saving codec" - raise ValueError(msg) - range_ = info.get("range", "full") - tile_rows_log2 = info.get("tile_rows", 0) - tile_cols_log2 = info.get("tile_cols", 0) - alpha_premultiplied = bool(info.get("alpha_premultiplied", False)) - autotiling = bool(info.get("autotiling", tile_rows_log2 == tile_cols_log2 == 0)) - - icc_profile = info.get("icc_profile", im.info.get("icc_profile")) - exif_orientation = 1 - if exif := info.get("exif"): - if isinstance(exif, Image.Exif): - exif_data = exif - else: - exif_data = Image.Exif() - exif_data.load(exif) - if ExifTags.Base.Orientation in exif_data: - exif_orientation = exif_data.pop(ExifTags.Base.Orientation) - exif = exif_data.tobytes() if exif_data else b"" - elif isinstance(exif, Image.Exif): - exif = exif_data.tobytes() - - xmp = info.get("xmp") - - if isinstance(xmp, str): - xmp = xmp.encode("utf-8") - - advanced = info.get("advanced") - if advanced is not None: - if isinstance(advanced, dict): - advanced = advanced.items() - try: - advanced = tuple(advanced) - except TypeError: - invalid = True - else: - invalid = any(not isinstance(v, tuple) or len(v) != 2 for v in advanced) - if invalid: - msg = ( - "advanced codec options must be a dict of key-value string " - "pairs or a series of key-value two-tuples" - ) - raise ValueError(msg) - - # Setup the AVIF encoder - enc = _avif.AvifEncoder( - im.size, - subsampling, - quality, - speed, - max_threads, - codec, - range_, - tile_rows_log2, - tile_cols_log2, - alpha_premultiplied, - autotiling, - icc_profile or b"", - exif or b"", - exif_orientation, - xmp or b"", - advanced, - ) - - # Add each frame - frame_idx = 0 - frame_duration = 0 - cur_idx = im.tell() - is_single_frame = total == 1 - try: - for ims in [im] + append_images: - # Get number of frames in this image - nfr = getattr(ims, "n_frames", 1) - - for idx in range(nfr): - ims.seek(idx) - - # Make sure image mode is supported - frame = ims - rawmode = ims.mode - if ims.mode not in {"RGB", "RGBA"}: - rawmode = "RGBA" if ims.has_transparency_data else "RGB" - frame = ims.convert(rawmode) - - # Update frame duration - if isinstance(duration, (list, tuple)): - frame_duration = duration[frame_idx] - else: - frame_duration = duration - - # Append the frame to the animation encoder - enc.add( - frame.tobytes("raw", rawmode), - frame_duration, - frame.size, - rawmode, - is_single_frame, - ) - - # Update frame index - frame_idx += 1 - - if not save_all: - break - - finally: - im.seek(cur_idx) - - # Get the final output from the encoder - data = enc.finish() - if data is None: - msg = "cannot write file as AVIF (encoder returned None)" - raise OSError(msg) - - fp.write(data) - - -Image.register_open(AvifImageFile.format, AvifImageFile, _accept) -if SUPPORTED: - Image.register_save(AvifImageFile.format, _save) - Image.register_save_all(AvifImageFile.format, _save_all) - Image.register_extensions(AvifImageFile.format, [".avif", ".avifs"]) - Image.register_mime(AvifImageFile.format, "image/avif") diff --git a/.venv/lib/python3.10/site-packages/PIL/BdfFontFile.py b/.venv/lib/python3.10/site-packages/PIL/BdfFontFile.py deleted file mode 100644 index f175e2f..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/BdfFontFile.py +++ /dev/null @@ -1,122 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# bitmap distribution font (bdf) file parser -# -# history: -# 1996-05-16 fl created (as bdf2pil) -# 1997-08-25 fl converted to FontFile driver -# 2001-05-25 fl removed bogus __init__ call -# 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) -# 2003-04-22 fl more robustification (from Graham Dumpleton) -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1997-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -""" -Parse X Bitmap Distribution Format (BDF) -""" -from __future__ import annotations - -from typing import BinaryIO - -from . import FontFile, Image - - -def bdf_char( - f: BinaryIO, -) -> ( - tuple[ - str, - int, - tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]], - Image.Image, - ] - | None -): - # skip to STARTCHAR - while True: - s = f.readline() - if not s: - return None - if s.startswith(b"STARTCHAR"): - break - id = s[9:].strip().decode("ascii") - - # load symbol properties - props = {} - while True: - s = f.readline() - if not s or s.startswith(b"BITMAP"): - break - i = s.find(b" ") - props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") - - # load bitmap - bitmap = bytearray() - while True: - s = f.readline() - if not s or s.startswith(b"ENDCHAR"): - break - bitmap += s[:-1] - - # The word BBX - # followed by the width in x (BBw), height in y (BBh), - # and x and y displacement (BBxoff0, BByoff0) - # of the lower left corner from the origin of the character. - width, height, x_disp, y_disp = (int(p) for p in props["BBX"].split()) - - # The word DWIDTH - # followed by the width in x and y of the character in device pixels. - dwx, dwy = (int(p) for p in props["DWIDTH"].split()) - - bbox = ( - (dwx, dwy), - (x_disp, -y_disp - height, width + x_disp, -y_disp), - (0, 0, width, height), - ) - - try: - im = Image.frombytes("1", (width, height), bitmap, "hex", "1") - except ValueError: - # deal with zero-width characters - im = Image.new("1", (width, height)) - - return id, int(props["ENCODING"]), bbox, im - - -class BdfFontFile(FontFile.FontFile): - """Font file plugin for the X11 BDF format.""" - - def __init__(self, fp: BinaryIO) -> None: - super().__init__() - - s = fp.readline() - if not s.startswith(b"STARTFONT 2.1"): - msg = "not a valid BDF file" - raise SyntaxError(msg) - - props = {} - comments = [] - - while True: - s = fp.readline() - if not s or s.startswith(b"ENDPROPERTIES"): - break - i = s.find(b" ") - props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") - if s[:i] in [b"COMMENT", b"COPYRIGHT"]: - if s.find(b"LogicalFontDescription") < 0: - comments.append(s[i + 1 : -1].decode("ascii")) - - while True: - c = bdf_char(fp) - if not c: - break - id, ch, (xy, dst, src), im = c - if 0 <= ch < len(self.glyph): - self.glyph[ch] = xy, dst, src, im diff --git a/.venv/lib/python3.10/site-packages/PIL/BlpImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/BlpImagePlugin.py deleted file mode 100644 index f7be774..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/BlpImagePlugin.py +++ /dev/null @@ -1,497 +0,0 @@ -""" -Blizzard Mipmap Format (.blp) -Jerome Leclanche - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ - -BLP1 files, used mostly in Warcraft III, are not fully supported. -All types of BLP2 files used in World of Warcraft are supported. - -The BLP file structure consists of a header, up to 16 mipmaps of the -texture - -Texture sizes must be powers of two, though the two dimensions do -not have to be equal; 512x256 is valid, but 512x200 is not. -The first mipmap (mipmap #0) is the full size image; each subsequent -mipmap halves both dimensions. The final mipmap should be 1x1. - -BLP files come in many different flavours: -* JPEG-compressed (type == 0) - only supported for BLP1. -* RAW images (type == 1, encoding == 1). Each mipmap is stored as an - array of 8-bit values, one per pixel, left to right, top to bottom. - Each value is an index to the palette. -* DXT-compressed (type == 1, encoding == 2): -- DXT1 compression is used if alpha_encoding == 0. - - An additional alpha bit is used if alpha_depth == 1. - - DXT3 compression is used if alpha_encoding == 1. - - DXT5 compression is used if alpha_encoding == 7. -""" - -from __future__ import annotations - -import abc -import os -import struct -from enum import IntEnum -from io import BytesIO -from typing import IO - -from . import Image, ImageFile - - -class Format(IntEnum): - JPEG = 0 - - -class Encoding(IntEnum): - UNCOMPRESSED = 1 - DXT = 2 - UNCOMPRESSED_RAW_BGRA = 3 - - -class AlphaEncoding(IntEnum): - DXT1 = 0 - DXT3 = 1 - DXT5 = 7 - - -def unpack_565(i: int) -> tuple[int, int, int]: - return ((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3 - - -def decode_dxt1( - data: bytes, alpha: bool = False -) -> tuple[bytearray, bytearray, bytearray, bytearray]: - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 8 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block_index in range(blocks): - # Decode next 8-byte block. - idx = block_index * 8 - color0, color1, bits = struct.unpack_from("> 2 - - a = 0xFF - if control == 0: - r, g, b = r0, g0, b0 - elif control == 1: - r, g, b = r1, g1, b1 - elif control == 2: - if color0 > color1: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - else: - r = (r0 + r1) // 2 - g = (g0 + g1) // 2 - b = (b0 + b1) // 2 - elif control == 3: - if color0 > color1: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - else: - r, g, b, a = 0, 0, 0, 0 - - if alpha: - ret[j].extend([r, g, b, a]) - else: - ret[j].extend([r, g, b]) - - return ret - - -def decode_dxt3(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]: - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block_index in range(blocks): - idx = block_index * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - bits = struct.unpack_from("<8B", block) - color0, color1 = struct.unpack_from(">= 4 - else: - high = True - a &= 0xF - a *= 17 # We get a value between 0 and 15 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -def decode_dxt5(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]: - """ - input: one "row" of data (i.e. will produce 4 * width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block_index in range(blocks): - idx = block_index * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 - elif alphacode_index == 15: - alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) - else: # alphacode_index >= 18 and alphacode_index <= 45 - alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 - - if alphacode == 0: - a = a0 - elif alphacode == 1: - a = a1 - elif a0 > a1: - a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 - elif alphacode == 6: - a = 0 - elif alphacode == 7: - a = 255 - else: - a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -class BLPFormatError(NotImplementedError): - pass - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith((b"BLP1", b"BLP2")) - - -class BlpImageFile(ImageFile.ImageFile): - """ - Blizzard Mipmap Format - """ - - format = "BLP" - format_description = "Blizzard Mipmap Format" - - def _open(self) -> None: - self.magic = self.fp.read(4) - if not _accept(self.magic): - msg = f"Bad BLP magic {repr(self.magic)}" - raise BLPFormatError(msg) - - compression = struct.unpack(" tuple[int, int]: - try: - self._read_header() - self._load() - except struct.error as e: - msg = "Truncated BLP file" - raise OSError(msg) from e - return -1, 0 - - @abc.abstractmethod - def _load(self) -> None: - pass - - def _read_header(self) -> None: - self._offsets = struct.unpack("<16I", self._safe_read(16 * 4)) - self._lengths = struct.unpack("<16I", self._safe_read(16 * 4)) - - def _safe_read(self, length: int) -> bytes: - assert self.fd is not None - return ImageFile._safe_read(self.fd, length) - - def _read_palette(self) -> list[tuple[int, int, int, int]]: - ret = [] - for i in range(256): - try: - b, g, r, a = struct.unpack("<4B", self._safe_read(4)) - except struct.error: - break - ret.append((b, g, r, a)) - return ret - - def _read_bgra( - self, palette: list[tuple[int, int, int, int]], alpha: bool - ) -> bytearray: - data = bytearray() - _data = BytesIO(self._safe_read(self._lengths[0])) - while True: - try: - (offset,) = struct.unpack(" None: - self._compression, self._encoding, alpha = self.args - - if self._compression == Format.JPEG: - self._decode_jpeg_stream() - - elif self._compression == 1: - if self._encoding in (4, 5): - palette = self._read_palette() - data = self._read_bgra(palette, alpha) - self.set_as_raw(data) - else: - msg = f"Unsupported BLP encoding {repr(self._encoding)}" - raise BLPFormatError(msg) - else: - msg = f"Unsupported BLP compression {repr(self._encoding)}" - raise BLPFormatError(msg) - - def _decode_jpeg_stream(self) -> None: - from .JpegImagePlugin import JpegImageFile - - (jpeg_header_size,) = struct.unpack(" None: - self._compression, self._encoding, alpha, self._alpha_encoding = self.args - - palette = self._read_palette() - - assert self.fd is not None - self.fd.seek(self._offsets[0]) - - if self._compression == 1: - # Uncompressed or DirectX compression - - if self._encoding == Encoding.UNCOMPRESSED: - data = self._read_bgra(palette, alpha) - - elif self._encoding == Encoding.DXT: - data = bytearray() - if self._alpha_encoding == AlphaEncoding.DXT1: - linesize = (self.state.xsize + 3) // 4 * 8 - for yb in range((self.state.ysize + 3) // 4): - for d in decode_dxt1(self._safe_read(linesize), alpha): - data += d - - elif self._alpha_encoding == AlphaEncoding.DXT3: - linesize = (self.state.xsize + 3) // 4 * 16 - for yb in range((self.state.ysize + 3) // 4): - for d in decode_dxt3(self._safe_read(linesize)): - data += d - - elif self._alpha_encoding == AlphaEncoding.DXT5: - linesize = (self.state.xsize + 3) // 4 * 16 - for yb in range((self.state.ysize + 3) // 4): - for d in decode_dxt5(self._safe_read(linesize)): - data += d - else: - msg = f"Unsupported alpha encoding {repr(self._alpha_encoding)}" - raise BLPFormatError(msg) - else: - msg = f"Unknown BLP encoding {repr(self._encoding)}" - raise BLPFormatError(msg) - - else: - msg = f"Unknown BLP compression {repr(self._compression)}" - raise BLPFormatError(msg) - - self.set_as_raw(data) - - -class BLPEncoder(ImageFile.PyEncoder): - _pushes_fd = True - - def _write_palette(self) -> bytes: - data = b"" - assert self.im is not None - palette = self.im.getpalette("RGBA", "RGBA") - for i in range(len(palette) // 4): - r, g, b, a = palette[i * 4 : (i + 1) * 4] - data += struct.pack("<4B", b, g, r, a) - while len(data) < 256 * 4: - data += b"\x00" * 4 - return data - - def encode(self, bufsize: int) -> tuple[int, int, bytes]: - palette_data = self._write_palette() - - offset = 20 + 16 * 4 * 2 + len(palette_data) - data = struct.pack("<16I", offset, *((0,) * 15)) - - assert self.im is not None - w, h = self.im.size - data += struct.pack("<16I", w * h, *((0,) * 15)) - - data += palette_data - - for y in range(h): - for x in range(w): - data += struct.pack(" None: - if im.mode != "P": - msg = "Unsupported BLP image mode" - raise ValueError(msg) - - magic = b"BLP1" if im.encoderinfo.get("blp_version") == "BLP1" else b"BLP2" - fp.write(magic) - - assert im.palette is not None - fp.write(struct.pack(" mode, rawmode - 1: ("P", "P;1"), - 4: ("P", "P;4"), - 8: ("P", "P"), - 16: ("RGB", "BGR;15"), - 24: ("RGB", "BGR"), - 32: ("RGB", "BGRX"), -} - -USE_RAW_ALPHA = False - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"BM") - - -def _dib_accept(prefix: bytes) -> bool: - return i32(prefix) in [12, 40, 52, 56, 64, 108, 124] - - -# ============================================================================= -# Image plugin for the Windows BMP format. -# ============================================================================= -class BmpImageFile(ImageFile.ImageFile): - """Image plugin for the Windows Bitmap format (BMP)""" - - # ------------------------------------------------------------- Description - format_description = "Windows Bitmap" - format = "BMP" - - # -------------------------------------------------- BMP Compression values - COMPRESSIONS = {"RAW": 0, "RLE8": 1, "RLE4": 2, "BITFIELDS": 3, "JPEG": 4, "PNG": 5} - for k, v in COMPRESSIONS.items(): - vars()[k] = v - - def _bitmap(self, header: int = 0, offset: int = 0) -> None: - """Read relevant info about the BMP""" - read, seek = self.fp.read, self.fp.seek - if header: - seek(header) - # read bmp header size @offset 14 (this is part of the header size) - file_info: dict[str, bool | int | tuple[int, ...]] = { - "header_size": i32(read(4)), - "direction": -1, - } - - # -------------------- If requested, read header at a specific position - # read the rest of the bmp header, without its size - assert isinstance(file_info["header_size"], int) - header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4) - - # ------------------------------- Windows Bitmap v2, IBM OS/2 Bitmap v1 - # ----- This format has different offsets because of width/height types - # 12: BITMAPCOREHEADER/OS21XBITMAPHEADER - if file_info["header_size"] == 12: - file_info["width"] = i16(header_data, 0) - file_info["height"] = i16(header_data, 2) - file_info["planes"] = i16(header_data, 4) - file_info["bits"] = i16(header_data, 6) - file_info["compression"] = self.COMPRESSIONS["RAW"] - file_info["palette_padding"] = 3 - - # --------------------------------------------- Windows Bitmap v3 to v5 - # 40: BITMAPINFOHEADER - # 52: BITMAPV2HEADER - # 56: BITMAPV3HEADER - # 64: BITMAPCOREHEADER2/OS22XBITMAPHEADER - # 108: BITMAPV4HEADER - # 124: BITMAPV5HEADER - elif file_info["header_size"] in (40, 52, 56, 64, 108, 124): - file_info["y_flip"] = header_data[7] == 0xFF - file_info["direction"] = 1 if file_info["y_flip"] else -1 - file_info["width"] = i32(header_data, 0) - file_info["height"] = ( - i32(header_data, 4) - if not file_info["y_flip"] - else 2**32 - i32(header_data, 4) - ) - file_info["planes"] = i16(header_data, 8) - file_info["bits"] = i16(header_data, 10) - file_info["compression"] = i32(header_data, 12) - # byte size of pixel data - file_info["data_size"] = i32(header_data, 16) - file_info["pixels_per_meter"] = ( - i32(header_data, 20), - i32(header_data, 24), - ) - file_info["colors"] = i32(header_data, 28) - file_info["palette_padding"] = 4 - assert isinstance(file_info["pixels_per_meter"], tuple) - self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) - if file_info["compression"] == self.COMPRESSIONS["BITFIELDS"]: - masks = ["r_mask", "g_mask", "b_mask"] - if len(header_data) >= 48: - if len(header_data) >= 52: - masks.append("a_mask") - else: - file_info["a_mask"] = 0x0 - for idx, mask in enumerate(masks): - file_info[mask] = i32(header_data, 36 + idx * 4) - else: - # 40 byte headers only have the three components in the - # bitfields masks, ref: - # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx - # See also - # https://github.com/python-pillow/Pillow/issues/1293 - # There is a 4th component in the RGBQuad, in the alpha - # location, but it is listed as a reserved component, - # and it is not generally an alpha channel - file_info["a_mask"] = 0x0 - for mask in masks: - file_info[mask] = i32(read(4)) - assert isinstance(file_info["r_mask"], int) - assert isinstance(file_info["g_mask"], int) - assert isinstance(file_info["b_mask"], int) - assert isinstance(file_info["a_mask"], int) - file_info["rgb_mask"] = ( - file_info["r_mask"], - file_info["g_mask"], - file_info["b_mask"], - ) - file_info["rgba_mask"] = ( - file_info["r_mask"], - file_info["g_mask"], - file_info["b_mask"], - file_info["a_mask"], - ) - else: - msg = f"Unsupported BMP header type ({file_info['header_size']})" - raise OSError(msg) - - # ------------------ Special case : header is reported 40, which - # ---------------------- is shorter than real size for bpp >= 16 - assert isinstance(file_info["width"], int) - assert isinstance(file_info["height"], int) - self._size = file_info["width"], file_info["height"] - - # ------- If color count was not found in the header, compute from bits - assert isinstance(file_info["bits"], int) - file_info["colors"] = ( - file_info["colors"] - if file_info.get("colors", 0) - else (1 << file_info["bits"]) - ) - assert isinstance(file_info["colors"], int) - if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8: - offset += 4 * file_info["colors"] - - # ---------------------- Check bit depth for unusual unsupported values - self._mode, raw_mode = BIT2MODE.get(file_info["bits"], ("", "")) - if not self.mode: - msg = f"Unsupported BMP pixel depth ({file_info['bits']})" - raise OSError(msg) - - # ---------------- Process BMP with Bitfields compression (not palette) - decoder_name = "raw" - if file_info["compression"] == self.COMPRESSIONS["BITFIELDS"]: - SUPPORTED: dict[int, list[tuple[int, ...]]] = { - 32: [ - (0xFF0000, 0xFF00, 0xFF, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0x0), - (0xFF000000, 0xFF00, 0xFF, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0xFF), - (0xFF, 0xFF00, 0xFF0000, 0xFF000000), - (0xFF0000, 0xFF00, 0xFF, 0xFF000000), - (0xFF000000, 0xFF00, 0xFF, 0xFF0000), - (0x0, 0x0, 0x0, 0x0), - ], - 24: [(0xFF0000, 0xFF00, 0xFF)], - 16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)], - } - MASK_MODES = { - (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX", - (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR", - (32, (0xFF000000, 0xFF00, 0xFF, 0x0)): "BGXR", - (32, (0xFF000000, 0xFF0000, 0xFF00, 0xFF)): "ABGR", - (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", - (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", - (32, (0xFF000000, 0xFF00, 0xFF, 0xFF0000)): "BGAR", - (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", - (24, (0xFF0000, 0xFF00, 0xFF)): "BGR", - (16, (0xF800, 0x7E0, 0x1F)): "BGR;16", - (16, (0x7C00, 0x3E0, 0x1F)): "BGR;15", - } - if file_info["bits"] in SUPPORTED: - if ( - file_info["bits"] == 32 - and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]] - ): - assert isinstance(file_info["rgba_mask"], tuple) - raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])] - self._mode = "RGBA" if "A" in raw_mode else self.mode - elif ( - file_info["bits"] in (24, 16) - and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]] - ): - assert isinstance(file_info["rgb_mask"], tuple) - raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])] - else: - msg = "Unsupported BMP bitfields layout" - raise OSError(msg) - else: - msg = "Unsupported BMP bitfields layout" - raise OSError(msg) - elif file_info["compression"] == self.COMPRESSIONS["RAW"]: - if file_info["bits"] == 32 and ( - header == 22 or USE_RAW_ALPHA # 32-bit .cur offset - ): - raw_mode, self._mode = "BGRA", "RGBA" - elif file_info["compression"] in ( - self.COMPRESSIONS["RLE8"], - self.COMPRESSIONS["RLE4"], - ): - decoder_name = "bmp_rle" - else: - msg = f"Unsupported BMP compression ({file_info['compression']})" - raise OSError(msg) - - # --------------- Once the header is processed, process the palette/LUT - if self.mode == "P": # Paletted for 1, 4 and 8 bit images - # ---------------------------------------------------- 1-bit images - if not (0 < file_info["colors"] <= 65536): - msg = f"Unsupported BMP Palette size ({file_info['colors']})" - raise OSError(msg) - else: - assert isinstance(file_info["palette_padding"], int) - padding = file_info["palette_padding"] - palette = read(padding * file_info["colors"]) - grayscale = True - indices = ( - (0, 255) - if file_info["colors"] == 2 - else list(range(file_info["colors"])) - ) - - # ----------------- Check if grayscale and ignore palette if so - for ind, val in enumerate(indices): - rgb = palette[ind * padding : ind * padding + 3] - if rgb != o8(val) * 3: - grayscale = False - - # ------- If all colors are gray, white or black, ditch palette - if grayscale: - self._mode = "1" if file_info["colors"] == 2 else "L" - raw_mode = self.mode - else: - self._mode = "P" - self.palette = ImagePalette.raw( - "BGRX" if padding == 4 else "BGR", palette - ) - - # ---------------------------- Finally set the tile data for the plugin - self.info["compression"] = file_info["compression"] - args: list[Any] = [raw_mode] - if decoder_name == "bmp_rle": - args.append(file_info["compression"] == self.COMPRESSIONS["RLE4"]) - else: - assert isinstance(file_info["width"], int) - args.append(((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3)) - args.append(file_info["direction"]) - self.tile = [ - ImageFile._Tile( - decoder_name, - (0, 0, file_info["width"], file_info["height"]), - offset or self.fp.tell(), - tuple(args), - ) - ] - - def _open(self) -> None: - """Open file, check magic number and read header""" - # read 14 bytes: magic number, filesize, reserved, header final offset - head_data = self.fp.read(14) - # choke if the file does not have the required magic bytes - if not _accept(head_data): - msg = "Not a BMP file" - raise SyntaxError(msg) - # read the start position of the BMP image data (u32) - offset = i32(head_data, 10) - # load bitmap information (offset=raster info) - self._bitmap(offset=offset) - - -class BmpRleDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - rle4 = self.args[1] - data = bytearray() - x = 0 - dest_length = self.state.xsize * self.state.ysize - while len(data) < dest_length: - pixels = self.fd.read(1) - byte = self.fd.read(1) - if not pixels or not byte: - break - num_pixels = pixels[0] - if num_pixels: - # encoded mode - if x + num_pixels > self.state.xsize: - # Too much data for row - num_pixels = max(0, self.state.xsize - x) - if rle4: - first_pixel = o8(byte[0] >> 4) - second_pixel = o8(byte[0] & 0x0F) - for index in range(num_pixels): - if index % 2 == 0: - data += first_pixel - else: - data += second_pixel - else: - data += byte * num_pixels - x += num_pixels - else: - if byte[0] == 0: - # end of line - while len(data) % self.state.xsize != 0: - data += b"\x00" - x = 0 - elif byte[0] == 1: - # end of bitmap - break - elif byte[0] == 2: - # delta - bytes_read = self.fd.read(2) - if len(bytes_read) < 2: - break - right, up = self.fd.read(2) - data += b"\x00" * (right + up * self.state.xsize) - x = len(data) % self.state.xsize - else: - # absolute mode - if rle4: - # 2 pixels per byte - byte_count = byte[0] // 2 - bytes_read = self.fd.read(byte_count) - for byte_read in bytes_read: - data += o8(byte_read >> 4) - data += o8(byte_read & 0x0F) - else: - byte_count = byte[0] - bytes_read = self.fd.read(byte_count) - data += bytes_read - if len(bytes_read) < byte_count: - break - x += byte[0] - - # align to 16-bit word boundary - if self.fd.tell() % 2 != 0: - self.fd.seek(1, os.SEEK_CUR) - rawmode = "L" if self.mode == "L" else "P" - self.set_as_raw(bytes(data), rawmode, (0, self.args[-1])) - return -1, 0 - - -# ============================================================================= -# Image plugin for the DIB format (BMP alias) -# ============================================================================= -class DibImageFile(BmpImageFile): - format = "DIB" - format_description = "Windows Bitmap" - - def _open(self) -> None: - self._bitmap() - - -# -# -------------------------------------------------------------------- -# Write BMP file - - -SAVE = { - "1": ("1", 1, 2), - "L": ("L", 8, 256), - "P": ("P", 8, 256), - "RGB": ("BGR", 24, 0), - "RGBA": ("BGRA", 32, 0), -} - - -def _dib_save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, False) - - -def _save( - im: Image.Image, fp: IO[bytes], filename: str | bytes, bitmap_header: bool = True -) -> None: - try: - rawmode, bits, colors = SAVE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as BMP" - raise OSError(msg) from e - - info = im.encoderinfo - - dpi = info.get("dpi", (96, 96)) - - # 1 meter == 39.3701 inches - ppm = tuple(int(x * 39.3701 + 0.5) for x in dpi) - - stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3) - header = 40 # or 64 for OS/2 version 2 - image = stride * im.size[1] - - if im.mode == "1": - palette = b"".join(o8(i) * 4 for i in (0, 255)) - elif im.mode == "L": - palette = b"".join(o8(i) * 4 for i in range(256)) - elif im.mode == "P": - palette = im.im.getpalette("RGB", "BGRX") - colors = len(palette) // 4 - else: - palette = None - - # bitmap header - if bitmap_header: - offset = 14 + header + colors * 4 - file_size = offset + image - if file_size > 2**32 - 1: - msg = "File size is too large for the BMP format" - raise ValueError(msg) - fp.write( - b"BM" # file type (magic) - + o32(file_size) # file size - + o32(0) # reserved - + o32(offset) # image data offset - ) - - # bitmap info header - fp.write( - o32(header) # info header size - + o32(im.size[0]) # width - + o32(im.size[1]) # height - + o16(1) # planes - + o16(bits) # depth - + o32(0) # compression (0=uncompressed) - + o32(image) # size of bitmap - + o32(ppm[0]) # resolution - + o32(ppm[1]) # resolution - + o32(colors) # colors used - + o32(colors) # colors important - ) - - fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) - - if palette: - fp.write(palette) - - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))] - ) - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(BmpImageFile.format, BmpImageFile, _accept) -Image.register_save(BmpImageFile.format, _save) - -Image.register_extension(BmpImageFile.format, ".bmp") - -Image.register_mime(BmpImageFile.format, "image/bmp") - -Image.register_decoder("bmp_rle", BmpRleDecoder) - -Image.register_open(DibImageFile.format, DibImageFile, _dib_accept) -Image.register_save(DibImageFile.format, _dib_save) - -Image.register_extension(DibImageFile.format, ".dib") - -Image.register_mime(DibImageFile.format, "image/bmp") diff --git a/.venv/lib/python3.10/site-packages/PIL/BufrStubImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/BufrStubImagePlugin.py deleted file mode 100644 index 8c5da14..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/BufrStubImagePlugin.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# BUFR stub adapter -# -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -from typing import IO - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific BUFR image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith((b"BUFR", b"ZCZC")) - - -class BufrStubImageFile(ImageFile.StubImageFile): - format = "BUFR" - format_description = "BUFR" - - def _open(self) -> None: - if not _accept(self.fp.read(4)): - msg = "Not a BUFR file" - raise SyntaxError(msg) - - self.fp.seek(-4, os.SEEK_CUR) - - # make something up - self._mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self) -> ImageFile.StubHandler | None: - return _handler - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "BUFR save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) -Image.register_save(BufrStubImageFile.format, _save) - -Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/.venv/lib/python3.10/site-packages/PIL/ContainerIO.py b/.venv/lib/python3.10/site-packages/PIL/ContainerIO.py deleted file mode 100644 index ec9e66c..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ContainerIO.py +++ /dev/null @@ -1,173 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a class to read from a container file -# -# History: -# 1995-06-18 fl Created -# 1995-09-07 fl Added readline(), readlines() -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1995 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -from collections.abc import Iterable -from typing import IO, AnyStr, NoReturn - - -class ContainerIO(IO[AnyStr]): - """ - A file object that provides read access to a part of an existing - file (for example a TAR file). - """ - - def __init__(self, file: IO[AnyStr], offset: int, length: int) -> None: - """ - Create file object. - - :param file: Existing file. - :param offset: Start of region, in bytes. - :param length: Size of region, in bytes. - """ - self.fh: IO[AnyStr] = file - self.pos = 0 - self.offset = offset - self.length = length - self.fh.seek(offset) - - ## - # Always false. - - def isatty(self) -> bool: - return False - - def seekable(self) -> bool: - return True - - def seek(self, offset: int, mode: int = io.SEEK_SET) -> int: - """ - Move file pointer. - - :param offset: Offset in bytes. - :param mode: Starting position. Use 0 for beginning of region, 1 - for current offset, and 2 for end of region. You cannot move - the pointer outside the defined region. - :returns: Offset from start of region, in bytes. - """ - if mode == 1: - self.pos = self.pos + offset - elif mode == 2: - self.pos = self.length + offset - else: - self.pos = offset - # clamp - self.pos = max(0, min(self.pos, self.length)) - self.fh.seek(self.offset + self.pos) - return self.pos - - def tell(self) -> int: - """ - Get current file pointer. - - :returns: Offset from start of region, in bytes. - """ - return self.pos - - def readable(self) -> bool: - return True - - def read(self, n: int = -1) -> AnyStr: - """ - Read data. - - :param n: Number of bytes to read. If omitted, zero or negative, - read until end of region. - :returns: An 8-bit string. - """ - if n > 0: - n = min(n, self.length - self.pos) - else: - n = self.length - self.pos - if n <= 0: # EOF - return b"" if "b" in self.fh.mode else "" # type: ignore[return-value] - self.pos = self.pos + n - return self.fh.read(n) - - def readline(self, n: int = -1) -> AnyStr: - """ - Read a line of text. - - :param n: Number of bytes to read. If omitted, zero or negative, - read until end of line. - :returns: An 8-bit string. - """ - s: AnyStr = b"" if "b" in self.fh.mode else "" # type: ignore[assignment] - newline_character = b"\n" if "b" in self.fh.mode else "\n" - while True: - c = self.read(1) - if not c: - break - s = s + c - if c == newline_character or len(s) == n: - break - return s - - def readlines(self, n: int | None = -1) -> list[AnyStr]: - """ - Read multiple lines of text. - - :param n: Number of lines to read. If omitted, zero, negative or None, - read until end of region. - :returns: A list of 8-bit strings. - """ - lines = [] - while True: - s = self.readline() - if not s: - break - lines.append(s) - if len(lines) == n: - break - return lines - - def writable(self) -> bool: - return False - - def write(self, b: AnyStr) -> NoReturn: - raise NotImplementedError() - - def writelines(self, lines: Iterable[AnyStr]) -> NoReturn: - raise NotImplementedError() - - def truncate(self, size: int | None = None) -> int: - raise NotImplementedError() - - def __enter__(self) -> ContainerIO[AnyStr]: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def __iter__(self) -> ContainerIO[AnyStr]: - return self - - def __next__(self) -> AnyStr: - line = self.readline() - if not line: - msg = "end of region" - raise StopIteration(msg) - return line - - def fileno(self) -> int: - return self.fh.fileno() - - def flush(self) -> None: - self.fh.flush() - - def close(self) -> None: - self.fh.close() diff --git a/.venv/lib/python3.10/site-packages/PIL/CurImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/CurImagePlugin.py deleted file mode 100644 index b817dbc..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/CurImagePlugin.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Windows Cursor support for PIL -# -# notes: -# uses BmpImagePlugin.py to read the bitmap data. -# -# history: -# 96-05-27 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import BmpImagePlugin, Image, ImageFile -from ._binary import i16le as i16 -from ._binary import i32le as i32 - -# -# -------------------------------------------------------------------- - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"\0\0\2\0") - - -## -# Image plugin for Windows Cursor files. - - -class CurImageFile(BmpImagePlugin.BmpImageFile): - format = "CUR" - format_description = "Windows Cursor" - - def _open(self) -> None: - offset = self.fp.tell() - - # check magic - s = self.fp.read(6) - if not _accept(s): - msg = "not a CUR file" - raise SyntaxError(msg) - - # pick the largest cursor in the file - m = b"" - for i in range(i16(s, 4)): - s = self.fp.read(16) - if not m: - m = s - elif s[0] > m[0] and s[1] > m[1]: - m = s - if not m: - msg = "No cursors were found" - raise TypeError(msg) - - # load as bitmap - self._bitmap(i32(m, 12) + offset) - - # patch up the bitmap height - self._size = self.size[0], self.size[1] // 2 - d, e, o, a = self.tile[0] - self.tile[0] = ImageFile._Tile(d, (0, 0) + self.size, o, a) - - -# -# -------------------------------------------------------------------- - -Image.register_open(CurImageFile.format, CurImageFile, _accept) - -Image.register_extension(CurImageFile.format, ".cur") diff --git a/.venv/lib/python3.10/site-packages/PIL/DcxImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/DcxImagePlugin.py deleted file mode 100644 index aea661b..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/DcxImagePlugin.py +++ /dev/null @@ -1,83 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# DCX file handling -# -# DCX is a container file format defined by Intel, commonly used -# for fax applications. Each DCX file consists of a directory -# (a list of file offsets) followed by a set of (usually 1-bit) -# PCX files. -# -# History: -# 1995-09-09 fl Created -# 1996-03-20 fl Properly derived from PcxImageFile. -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 2002-07-30 fl Fixed file handling -# -# Copyright (c) 1997-98 by Secret Labs AB. -# Copyright (c) 1995-96 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image -from ._binary import i32le as i32 -from ._util import DeferredError -from .PcxImagePlugin import PcxImageFile - -MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 4 and i32(prefix) == MAGIC - - -## -# Image plugin for the Intel DCX format. - - -class DcxImageFile(PcxImageFile): - format = "DCX" - format_description = "Intel DCX" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - # Header - s = self.fp.read(4) - if not _accept(s): - msg = "not a DCX file" - raise SyntaxError(msg) - - # Component directory - self._offset = [] - for i in range(1024): - offset = i32(self.fp.read(4)) - if not offset: - break - self._offset.append(offset) - - self._fp = self.fp - self.frame = -1 - self.n_frames = len(self._offset) - self.is_animated = self.n_frames > 1 - self.seek(0) - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if isinstance(self._fp, DeferredError): - raise self._fp.ex - self.frame = frame - self.fp = self._fp - self.fp.seek(self._offset[frame]) - PcxImageFile._open(self) - - def tell(self) -> int: - return self.frame - - -Image.register_open(DcxImageFile.format, DcxImageFile, _accept) - -Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/.venv/lib/python3.10/site-packages/PIL/DdsImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/DdsImagePlugin.py deleted file mode 100644 index 2630781..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/DdsImagePlugin.py +++ /dev/null @@ -1,624 +0,0 @@ -""" -A Pillow loader for .dds files (S3TC-compressed aka DXTC) -Jerome Leclanche - -Documentation: -https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: -https://creativecommons.org/publicdomain/zero/1.0/ -""" - -from __future__ import annotations - -import io -import struct -import sys -from enum import IntEnum, IntFlag -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o32le as o32 - -# Magic ("DDS ") -DDS_MAGIC = 0x20534444 - - -# DDS flags -class DDSD(IntFlag): - CAPS = 0x1 - HEIGHT = 0x2 - WIDTH = 0x4 - PITCH = 0x8 - PIXELFORMAT = 0x1000 - MIPMAPCOUNT = 0x20000 - LINEARSIZE = 0x80000 - DEPTH = 0x800000 - - -# DDS caps -class DDSCAPS(IntFlag): - COMPLEX = 0x8 - TEXTURE = 0x1000 - MIPMAP = 0x400000 - - -class DDSCAPS2(IntFlag): - CUBEMAP = 0x200 - CUBEMAP_POSITIVEX = 0x400 - CUBEMAP_NEGATIVEX = 0x800 - CUBEMAP_POSITIVEY = 0x1000 - CUBEMAP_NEGATIVEY = 0x2000 - CUBEMAP_POSITIVEZ = 0x4000 - CUBEMAP_NEGATIVEZ = 0x8000 - VOLUME = 0x200000 - - -# Pixel Format -class DDPF(IntFlag): - ALPHAPIXELS = 0x1 - ALPHA = 0x2 - FOURCC = 0x4 - PALETTEINDEXED8 = 0x20 - RGB = 0x40 - LUMINANCE = 0x20000 - - -# dxgiformat.h -class DXGI_FORMAT(IntEnum): - UNKNOWN = 0 - R32G32B32A32_TYPELESS = 1 - R32G32B32A32_FLOAT = 2 - R32G32B32A32_UINT = 3 - R32G32B32A32_SINT = 4 - R32G32B32_TYPELESS = 5 - R32G32B32_FLOAT = 6 - R32G32B32_UINT = 7 - R32G32B32_SINT = 8 - R16G16B16A16_TYPELESS = 9 - R16G16B16A16_FLOAT = 10 - R16G16B16A16_UNORM = 11 - R16G16B16A16_UINT = 12 - R16G16B16A16_SNORM = 13 - R16G16B16A16_SINT = 14 - R32G32_TYPELESS = 15 - R32G32_FLOAT = 16 - R32G32_UINT = 17 - R32G32_SINT = 18 - R32G8X24_TYPELESS = 19 - D32_FLOAT_S8X24_UINT = 20 - R32_FLOAT_X8X24_TYPELESS = 21 - X32_TYPELESS_G8X24_UINT = 22 - R10G10B10A2_TYPELESS = 23 - R10G10B10A2_UNORM = 24 - R10G10B10A2_UINT = 25 - R11G11B10_FLOAT = 26 - R8G8B8A8_TYPELESS = 27 - R8G8B8A8_UNORM = 28 - R8G8B8A8_UNORM_SRGB = 29 - R8G8B8A8_UINT = 30 - R8G8B8A8_SNORM = 31 - R8G8B8A8_SINT = 32 - R16G16_TYPELESS = 33 - R16G16_FLOAT = 34 - R16G16_UNORM = 35 - R16G16_UINT = 36 - R16G16_SNORM = 37 - R16G16_SINT = 38 - R32_TYPELESS = 39 - D32_FLOAT = 40 - R32_FLOAT = 41 - R32_UINT = 42 - R32_SINT = 43 - R24G8_TYPELESS = 44 - D24_UNORM_S8_UINT = 45 - R24_UNORM_X8_TYPELESS = 46 - X24_TYPELESS_G8_UINT = 47 - R8G8_TYPELESS = 48 - R8G8_UNORM = 49 - R8G8_UINT = 50 - R8G8_SNORM = 51 - R8G8_SINT = 52 - R16_TYPELESS = 53 - R16_FLOAT = 54 - D16_UNORM = 55 - R16_UNORM = 56 - R16_UINT = 57 - R16_SNORM = 58 - R16_SINT = 59 - R8_TYPELESS = 60 - R8_UNORM = 61 - R8_UINT = 62 - R8_SNORM = 63 - R8_SINT = 64 - A8_UNORM = 65 - R1_UNORM = 66 - R9G9B9E5_SHAREDEXP = 67 - R8G8_B8G8_UNORM = 68 - G8R8_G8B8_UNORM = 69 - BC1_TYPELESS = 70 - BC1_UNORM = 71 - BC1_UNORM_SRGB = 72 - BC2_TYPELESS = 73 - BC2_UNORM = 74 - BC2_UNORM_SRGB = 75 - BC3_TYPELESS = 76 - BC3_UNORM = 77 - BC3_UNORM_SRGB = 78 - BC4_TYPELESS = 79 - BC4_UNORM = 80 - BC4_SNORM = 81 - BC5_TYPELESS = 82 - BC5_UNORM = 83 - BC5_SNORM = 84 - B5G6R5_UNORM = 85 - B5G5R5A1_UNORM = 86 - B8G8R8A8_UNORM = 87 - B8G8R8X8_UNORM = 88 - R10G10B10_XR_BIAS_A2_UNORM = 89 - B8G8R8A8_TYPELESS = 90 - B8G8R8A8_UNORM_SRGB = 91 - B8G8R8X8_TYPELESS = 92 - B8G8R8X8_UNORM_SRGB = 93 - BC6H_TYPELESS = 94 - BC6H_UF16 = 95 - BC6H_SF16 = 96 - BC7_TYPELESS = 97 - BC7_UNORM = 98 - BC7_UNORM_SRGB = 99 - AYUV = 100 - Y410 = 101 - Y416 = 102 - NV12 = 103 - P010 = 104 - P016 = 105 - OPAQUE_420 = 106 - YUY2 = 107 - Y210 = 108 - Y216 = 109 - NV11 = 110 - AI44 = 111 - IA44 = 112 - P8 = 113 - A8P8 = 114 - B4G4R4A4_UNORM = 115 - P208 = 130 - V208 = 131 - V408 = 132 - SAMPLER_FEEDBACK_MIN_MIP_OPAQUE = 189 - SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE = 190 - - -class D3DFMT(IntEnum): - UNKNOWN = 0 - R8G8B8 = 20 - A8R8G8B8 = 21 - X8R8G8B8 = 22 - R5G6B5 = 23 - X1R5G5B5 = 24 - A1R5G5B5 = 25 - A4R4G4B4 = 26 - R3G3B2 = 27 - A8 = 28 - A8R3G3B2 = 29 - X4R4G4B4 = 30 - A2B10G10R10 = 31 - A8B8G8R8 = 32 - X8B8G8R8 = 33 - G16R16 = 34 - A2R10G10B10 = 35 - A16B16G16R16 = 36 - A8P8 = 40 - P8 = 41 - L8 = 50 - A8L8 = 51 - A4L4 = 52 - V8U8 = 60 - L6V5U5 = 61 - X8L8V8U8 = 62 - Q8W8V8U8 = 63 - V16U16 = 64 - A2W10V10U10 = 67 - D16_LOCKABLE = 70 - D32 = 71 - D15S1 = 73 - D24S8 = 75 - D24X8 = 77 - D24X4S4 = 79 - D16 = 80 - D32F_LOCKABLE = 82 - D24FS8 = 83 - D32_LOCKABLE = 84 - S8_LOCKABLE = 85 - L16 = 81 - VERTEXDATA = 100 - INDEX16 = 101 - INDEX32 = 102 - Q16W16V16U16 = 110 - R16F = 111 - G16R16F = 112 - A16B16G16R16F = 113 - R32F = 114 - G32R32F = 115 - A32B32G32R32F = 116 - CxV8U8 = 117 - A1 = 118 - A2B10G10R10_XR_BIAS = 119 - BINARYBUFFER = 199 - - UYVY = i32(b"UYVY") - R8G8_B8G8 = i32(b"RGBG") - YUY2 = i32(b"YUY2") - G8R8_G8B8 = i32(b"GRGB") - DXT1 = i32(b"DXT1") - DXT2 = i32(b"DXT2") - DXT3 = i32(b"DXT3") - DXT4 = i32(b"DXT4") - DXT5 = i32(b"DXT5") - DX10 = i32(b"DX10") - BC4S = i32(b"BC4S") - BC4U = i32(b"BC4U") - BC5S = i32(b"BC5S") - BC5U = i32(b"BC5U") - ATI1 = i32(b"ATI1") - ATI2 = i32(b"ATI2") - MULTI2_ARGB8 = i32(b"MET1") - - -# Backward compatibility layer -module = sys.modules[__name__] -for item in DDSD: - assert item.name is not None - setattr(module, f"DDSD_{item.name}", item.value) -for item1 in DDSCAPS: - assert item1.name is not None - setattr(module, f"DDSCAPS_{item1.name}", item1.value) -for item2 in DDSCAPS2: - assert item2.name is not None - setattr(module, f"DDSCAPS2_{item2.name}", item2.value) -for item3 in DDPF: - assert item3.name is not None - setattr(module, f"DDPF_{item3.name}", item3.value) - -DDS_FOURCC = DDPF.FOURCC -DDS_RGB = DDPF.RGB -DDS_RGBA = DDPF.RGB | DDPF.ALPHAPIXELS -DDS_LUMINANCE = DDPF.LUMINANCE -DDS_LUMINANCEA = DDPF.LUMINANCE | DDPF.ALPHAPIXELS -DDS_ALPHA = DDPF.ALPHA -DDS_PAL8 = DDPF.PALETTEINDEXED8 - -DDS_HEADER_FLAGS_TEXTURE = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PIXELFORMAT -DDS_HEADER_FLAGS_MIPMAP = DDSD.MIPMAPCOUNT -DDS_HEADER_FLAGS_VOLUME = DDSD.DEPTH -DDS_HEADER_FLAGS_PITCH = DDSD.PITCH -DDS_HEADER_FLAGS_LINEARSIZE = DDSD.LINEARSIZE - -DDS_HEIGHT = DDSD.HEIGHT -DDS_WIDTH = DDSD.WIDTH - -DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS.TEXTURE -DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS.COMPLEX | DDSCAPS.MIPMAP -DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS.COMPLEX - -DDS_CUBEMAP_POSITIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEX -DDS_CUBEMAP_NEGATIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEX -DDS_CUBEMAP_POSITIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEY -DDS_CUBEMAP_NEGATIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEY -DDS_CUBEMAP_POSITIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEZ -DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEZ - -DXT1_FOURCC = D3DFMT.DXT1 -DXT3_FOURCC = D3DFMT.DXT3 -DXT5_FOURCC = D3DFMT.DXT5 - -DXGI_FORMAT_R8G8B8A8_TYPELESS = DXGI_FORMAT.R8G8B8A8_TYPELESS -DXGI_FORMAT_R8G8B8A8_UNORM = DXGI_FORMAT.R8G8B8A8_UNORM -DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = DXGI_FORMAT.R8G8B8A8_UNORM_SRGB -DXGI_FORMAT_BC5_TYPELESS = DXGI_FORMAT.BC5_TYPELESS -DXGI_FORMAT_BC5_UNORM = DXGI_FORMAT.BC5_UNORM -DXGI_FORMAT_BC5_SNORM = DXGI_FORMAT.BC5_SNORM -DXGI_FORMAT_BC6H_UF16 = DXGI_FORMAT.BC6H_UF16 -DXGI_FORMAT_BC6H_SF16 = DXGI_FORMAT.BC6H_SF16 -DXGI_FORMAT_BC7_TYPELESS = DXGI_FORMAT.BC7_TYPELESS -DXGI_FORMAT_BC7_UNORM = DXGI_FORMAT.BC7_UNORM -DXGI_FORMAT_BC7_UNORM_SRGB = DXGI_FORMAT.BC7_UNORM_SRGB - - -class DdsImageFile(ImageFile.ImageFile): - format = "DDS" - format_description = "DirectDraw Surface" - - def _open(self) -> None: - if not _accept(self.fp.read(4)): - msg = "not a DDS file" - raise SyntaxError(msg) - (header_size,) = struct.unpack(" None: - pass - - -class DdsRgbDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - bitcount, masks = self.args - - # Some masks will be padded with zeros, e.g. R 0b11 G 0b1100 - # Calculate how many zeros each mask is padded with - mask_offsets = [] - # And the maximum value of each channel without the padding - mask_totals = [] - for mask in masks: - offset = 0 - if mask != 0: - while mask >> (offset + 1) << (offset + 1) == mask: - offset += 1 - mask_offsets.append(offset) - mask_totals.append(mask >> offset) - - data = bytearray() - bytecount = bitcount // 8 - dest_length = self.state.xsize * self.state.ysize * len(masks) - while len(data) < dest_length: - value = int.from_bytes(self.fd.read(bytecount), "little") - for i, mask in enumerate(masks): - masked_value = value & mask - # Remove the zero padding, and scale it to 8 bits - data += o8( - int(((masked_value >> mask_offsets[i]) / mask_totals[i]) * 255) - ) - self.set_as_raw(data) - return -1, 0 - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode not in ("RGB", "RGBA", "L", "LA"): - msg = f"cannot write mode {im.mode} as DDS" - raise OSError(msg) - - flags = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PIXELFORMAT - bitcount = len(im.getbands()) * 8 - pixel_format = im.encoderinfo.get("pixel_format") - args: tuple[int] | str - if pixel_format: - codec_name = "bcn" - flags |= DDSD.LINEARSIZE - pitch = (im.width + 3) * 4 - rgba_mask = [0, 0, 0, 0] - pixel_flags = DDPF.FOURCC - if pixel_format == "DXT1": - fourcc = D3DFMT.DXT1 - args = (1,) - elif pixel_format == "DXT3": - fourcc = D3DFMT.DXT3 - args = (2,) - elif pixel_format == "DXT5": - fourcc = D3DFMT.DXT5 - args = (3,) - else: - fourcc = D3DFMT.DX10 - if pixel_format == "BC2": - args = (2,) - dxgi_format = DXGI_FORMAT.BC2_TYPELESS - elif pixel_format == "BC3": - args = (3,) - dxgi_format = DXGI_FORMAT.BC3_TYPELESS - elif pixel_format == "BC5": - args = (5,) - dxgi_format = DXGI_FORMAT.BC5_TYPELESS - if im.mode != "RGB": - msg = "only RGB mode can be written as BC5" - raise OSError(msg) - else: - msg = f"cannot write pixel format {pixel_format}" - raise OSError(msg) - else: - codec_name = "raw" - flags |= DDSD.PITCH - pitch = (im.width * bitcount + 7) // 8 - - alpha = im.mode[-1] == "A" - if im.mode[0] == "L": - pixel_flags = DDPF.LUMINANCE - args = im.mode - if alpha: - rgba_mask = [0x000000FF, 0x000000FF, 0x000000FF] - else: - rgba_mask = [0xFF000000, 0xFF000000, 0xFF000000] - else: - pixel_flags = DDPF.RGB - args = im.mode[::-1] - rgba_mask = [0x00FF0000, 0x0000FF00, 0x000000FF] - - if alpha: - r, g, b, a = im.split() - im = Image.merge("RGBA", (a, r, g, b)) - if alpha: - pixel_flags |= DDPF.ALPHAPIXELS - rgba_mask.append(0xFF000000 if alpha else 0) - - fourcc = D3DFMT.UNKNOWN - fp.write( - o32(DDS_MAGIC) - + struct.pack( - "<7I", - 124, # header size - flags, # flags - im.height, - im.width, - pitch, - 0, # depth - 0, # mipmaps - ) - + struct.pack("11I", *((0,) * 11)) # reserved - # pfsize, pfflags, fourcc, bitcount - + struct.pack("<4I", 32, pixel_flags, fourcc, bitcount) - + struct.pack("<4I", *rgba_mask) # dwRGBABitMask - + struct.pack("<5I", DDSCAPS.TEXTURE, 0, 0, 0, 0) - ) - if fourcc == D3DFMT.DX10: - fp.write( - # dxgi_format, 2D resource, misc, array size, straight alpha - struct.pack("<5I", dxgi_format, 3, 0, 0, 1) - ) - ImageFile._save(im, fp, [ImageFile._Tile(codec_name, (0, 0) + im.size, 0, args)]) - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"DDS ") - - -Image.register_open(DdsImageFile.format, DdsImageFile, _accept) -Image.register_decoder("dds_rgb", DdsRgbDecoder) -Image.register_save(DdsImageFile.format, _save) -Image.register_extension(DdsImageFile.format, ".dds") diff --git a/.venv/lib/python3.10/site-packages/PIL/EpsImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/EpsImagePlugin.py deleted file mode 100644 index 5e2ddad..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/EpsImagePlugin.py +++ /dev/null @@ -1,476 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# EPS file handling -# -# History: -# 1995-09-01 fl Created (0.1) -# 1996-05-18 fl Don't choke on "atend" fields, Ghostscript interface (0.2) -# 1996-08-22 fl Don't choke on floating point BoundingBox values -# 1996-08-23 fl Handle files from Macintosh (0.3) -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) -# 2003-09-07 fl Check gs.close status (from Federico Di Gregorio) (0.5) -# 2014-05-07 e Handling of EPS with binary preview and fixed resolution -# resizing -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import re -import subprocess -import sys -import tempfile -from typing import IO - -from . import Image, ImageFile -from ._binary import i32le as i32 - -# -------------------------------------------------------------------- - - -split = re.compile(r"^%%([^:]*):[ \t]*(.*)[ \t]*$") -field = re.compile(r"^%[%!\w]([^:]*)[ \t]*$") - -gs_binary: str | bool | None = None -gs_windows_binary = None - - -def has_ghostscript() -> bool: - global gs_binary, gs_windows_binary - if gs_binary is None: - if sys.platform.startswith("win"): - if gs_windows_binary is None: - import shutil - - for binary in ("gswin32c", "gswin64c", "gs"): - if shutil.which(binary) is not None: - gs_windows_binary = binary - break - else: - gs_windows_binary = False - gs_binary = gs_windows_binary - else: - try: - subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL) - gs_binary = "gs" - except OSError: - gs_binary = False - return gs_binary is not False - - -def Ghostscript( - tile: list[ImageFile._Tile], - size: tuple[int, int], - fp: IO[bytes], - scale: int = 1, - transparency: bool = False, -) -> Image.core.ImagingCore: - """Render an image using Ghostscript""" - global gs_binary - if not has_ghostscript(): - msg = "Unable to locate Ghostscript on paths" - raise OSError(msg) - assert isinstance(gs_binary, str) - - # Unpack decoder tile - args = tile[0].args - assert isinstance(args, tuple) - length, bbox = args - - # Hack to support hi-res rendering - scale = int(scale) or 1 - width = size[0] * scale - height = size[1] * scale - # resolution is dependent on bbox and size - res_x = 72.0 * width / (bbox[2] - bbox[0]) - res_y = 72.0 * height / (bbox[3] - bbox[1]) - - out_fd, outfile = tempfile.mkstemp() - os.close(out_fd) - - infile_temp = None - if hasattr(fp, "name") and os.path.exists(fp.name): - infile = fp.name - else: - in_fd, infile_temp = tempfile.mkstemp() - os.close(in_fd) - infile = infile_temp - - # Ignore length and offset! - # Ghostscript can read it - # Copy whole file to read in Ghostscript - with open(infile_temp, "wb") as f: - # fetch length of fp - fp.seek(0, io.SEEK_END) - fsize = fp.tell() - # ensure start position - # go back - fp.seek(0) - lengthfile = fsize - while lengthfile > 0: - s = fp.read(min(lengthfile, 100 * 1024)) - if not s: - break - lengthfile -= len(s) - f.write(s) - - if transparency: - # "RGBA" - device = "pngalpha" - else: - # "pnmraw" automatically chooses between - # PBM ("1"), PGM ("L"), and PPM ("RGB"). - device = "pnmraw" - - # Build Ghostscript command - command = [ - gs_binary, - "-q", # quiet mode - f"-g{width:d}x{height:d}", # set output geometry (pixels) - f"-r{res_x:f}x{res_y:f}", # set input DPI (dots per inch) - "-dBATCH", # exit after processing - "-dNOPAUSE", # don't pause between pages - "-dSAFER", # safe mode - f"-sDEVICE={device}", - f"-sOutputFile={outfile}", # output file - # adjust for image origin - "-c", - f"{-bbox[0]} {-bbox[1]} translate", - "-f", - infile, # input file - # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) - "-c", - "showpage", - ] - - # push data through Ghostscript - try: - startupinfo = None - if sys.platform.startswith("win"): - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - subprocess.check_call(command, startupinfo=startupinfo) - with Image.open(outfile) as out_im: - out_im.load() - return out_im.im.copy() - finally: - try: - os.unlink(outfile) - if infile_temp: - os.unlink(infile_temp) - except OSError: - pass - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"%!PS") or ( - len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5 - ) - - -## -# Image plugin for Encapsulated PostScript. This plugin supports only -# a few variants of this format. - - -class EpsImageFile(ImageFile.ImageFile): - """EPS File Parser for the Python Imaging Library""" - - format = "EPS" - format_description = "Encapsulated Postscript" - - mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} - - def _open(self) -> None: - (length, offset) = self._find_offset(self.fp) - - # go to offset - start of "%!PS" - self.fp.seek(offset) - - self._mode = "RGB" - - # When reading header comments, the first comment is used. - # When reading trailer comments, the last comment is used. - bounding_box: list[int] | None = None - imagedata_size: tuple[int, int] | None = None - - byte_arr = bytearray(255) - bytes_mv = memoryview(byte_arr) - bytes_read = 0 - reading_header_comments = True - reading_trailer_comments = False - trailer_reached = False - - def check_required_header_comments() -> None: - """ - The EPS specification requires that some headers exist. - This should be checked when the header comments formally end, - when image data starts, or when the file ends, whichever comes first. - """ - if "PS-Adobe" not in self.info: - msg = 'EPS header missing "%!PS-Adobe" comment' - raise SyntaxError(msg) - if "BoundingBox" not in self.info: - msg = 'EPS header missing "%%BoundingBox" comment' - raise SyntaxError(msg) - - def read_comment(s: str) -> bool: - nonlocal bounding_box, reading_trailer_comments - try: - m = split.match(s) - except re.error as e: - msg = "not an EPS file" - raise SyntaxError(msg) from e - - if not m: - return False - - k, v = m.group(1, 2) - self.info[k] = v - if k == "BoundingBox": - if v == "(atend)": - reading_trailer_comments = True - elif not bounding_box or (trailer_reached and reading_trailer_comments): - try: - # Note: The DSC spec says that BoundingBox - # fields should be integers, but some drivers - # put floating point values there anyway. - bounding_box = [int(float(i)) for i in v.split()] - except Exception: - pass - return True - - while True: - byte = self.fp.read(1) - if byte == b"": - # if we didn't read a byte we must be at the end of the file - if bytes_read == 0: - if reading_header_comments: - check_required_header_comments() - break - elif byte in b"\r\n": - # if we read a line ending character, ignore it and parse what - # we have already read. if we haven't read any other characters, - # continue reading - if bytes_read == 0: - continue - else: - # ASCII/hexadecimal lines in an EPS file must not exceed - # 255 characters, not including line ending characters - if bytes_read >= 255: - # only enforce this for lines starting with a "%", - # otherwise assume it's binary data - if byte_arr[0] == ord("%"): - msg = "not an EPS file" - raise SyntaxError(msg) - else: - if reading_header_comments: - check_required_header_comments() - reading_header_comments = False - # reset bytes_read so we can keep reading - # data until the end of the line - bytes_read = 0 - byte_arr[bytes_read] = byte[0] - bytes_read += 1 - continue - - if reading_header_comments: - # Load EPS header - - # if this line doesn't start with a "%", - # or does start with "%%EndComments", - # then we've reached the end of the header/comments - if byte_arr[0] != ord("%") or bytes_mv[:13] == b"%%EndComments": - check_required_header_comments() - reading_header_comments = False - continue - - s = str(bytes_mv[:bytes_read], "latin-1") - if not read_comment(s): - m = field.match(s) - if m: - k = m.group(1) - if k.startswith("PS-Adobe"): - self.info["PS-Adobe"] = k[9:] - else: - self.info[k] = "" - elif s[0] == "%": - # handle non-DSC PostScript comments that some - # tools mistakenly put in the Comments section - pass - else: - msg = "bad EPS header" - raise OSError(msg) - elif bytes_mv[:11] == b"%ImageData:": - # Check for an "ImageData" descriptor - # https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577413_pgfId-1035096 - - # If we've already read an "ImageData" descriptor, - # don't read another one. - if imagedata_size: - bytes_read = 0 - continue - - # Values: - # columns - # rows - # bit depth (1 or 8) - # mode (1: L, 2: LAB, 3: RGB, 4: CMYK) - # number of padding channels - # block size (number of bytes per row per channel) - # binary/ascii (1: binary, 2: ascii) - # data start identifier (the image data follows after a single line - # consisting only of this quoted value) - image_data_values = byte_arr[11:bytes_read].split(None, 7) - columns, rows, bit_depth, mode_id = ( - int(value) for value in image_data_values[:4] - ) - - if bit_depth == 1: - self._mode = "1" - elif bit_depth == 8: - try: - self._mode = self.mode_map[mode_id] - except ValueError: - break - else: - break - - # Parse the columns and rows after checking the bit depth and mode - # in case the bit depth and/or mode are invalid. - imagedata_size = columns, rows - elif bytes_mv[:5] == b"%%EOF": - break - elif trailer_reached and reading_trailer_comments: - # Load EPS trailer - s = str(bytes_mv[:bytes_read], "latin-1") - read_comment(s) - elif bytes_mv[:9] == b"%%Trailer": - trailer_reached = True - bytes_read = 0 - - # A "BoundingBox" is always required, - # even if an "ImageData" descriptor size exists. - if not bounding_box: - msg = "cannot determine EPS bounding box" - raise OSError(msg) - - # An "ImageData" size takes precedence over the "BoundingBox". - self._size = imagedata_size or ( - bounding_box[2] - bounding_box[0], - bounding_box[3] - bounding_box[1], - ) - - self.tile = [ - ImageFile._Tile("eps", (0, 0) + self.size, offset, (length, bounding_box)) - ] - - def _find_offset(self, fp: IO[bytes]) -> tuple[int, int]: - s = fp.read(4) - - if s == b"%!PS": - # for HEAD without binary preview - fp.seek(0, io.SEEK_END) - length = fp.tell() - offset = 0 - elif i32(s) == 0xC6D3D0C5: - # FIX for: Some EPS file not handled correctly / issue #302 - # EPS can contain binary data - # or start directly with latin coding - # more info see: - # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf - s = fp.read(8) - offset = i32(s) - length = i32(s, 4) - else: - msg = "not an EPS file" - raise SyntaxError(msg) - - return length, offset - - def load( - self, scale: int = 1, transparency: bool = False - ) -> Image.core.PixelAccess | None: - # Load EPS via Ghostscript - if self.tile: - self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency) - self._mode = self.im.mode - self._size = self.im.size - self.tile = [] - return Image.Image.load(self) - - def load_seek(self, pos: int) -> None: - # we can't incrementally load, so force ImageFile.parser to - # use our custom load method by defining this method. - pass - - -# -------------------------------------------------------------------- - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes, eps: int = 1) -> None: - """EPS Writer for the Python Imaging Library.""" - - # make sure image data is available - im.load() - - # determine PostScript image mode - if im.mode == "L": - operator = (8, 1, b"image") - elif im.mode == "RGB": - operator = (8, 3, b"false 3 colorimage") - elif im.mode == "CMYK": - operator = (8, 4, b"false 4 colorimage") - else: - msg = "image mode is not supported" - raise ValueError(msg) - - if eps: - # write EPS header - fp.write(b"%!PS-Adobe-3.0 EPSF-3.0\n") - fp.write(b"%%Creator: PIL 0.1 EpsEncode\n") - # fp.write("%%CreationDate: %s"...) - fp.write(b"%%%%BoundingBox: 0 0 %d %d\n" % im.size) - fp.write(b"%%Pages: 1\n") - fp.write(b"%%EndComments\n") - fp.write(b"%%Page: 1 1\n") - fp.write(b"%%ImageData: %d %d " % im.size) - fp.write(b'%d %d 0 1 1 "%s"\n' % operator) - - # image header - fp.write(b"gsave\n") - fp.write(b"10 dict begin\n") - fp.write(b"/buf %d string def\n" % (im.size[0] * operator[1])) - fp.write(b"%d %d scale\n" % im.size) - fp.write(b"%d %d 8\n" % im.size) # <= bits - fp.write(b"[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) - fp.write(b"{ currentfile buf readhexstring pop } bind\n") - fp.write(operator[2] + b"\n") - if hasattr(fp, "flush"): - fp.flush() - - ImageFile._save(im, fp, [ImageFile._Tile("eps", (0, 0) + im.size)]) - - fp.write(b"\n%%%%EndBinary\n") - fp.write(b"grestore end\n") - if hasattr(fp, "flush"): - fp.flush() - - -# -------------------------------------------------------------------- - - -Image.register_open(EpsImageFile.format, EpsImageFile, _accept) - -Image.register_save(EpsImageFile.format, _save) - -Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) - -Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/.venv/lib/python3.10/site-packages/PIL/ExifTags.py b/.venv/lib/python3.10/site-packages/PIL/ExifTags.py deleted file mode 100644 index 2280d5c..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ExifTags.py +++ /dev/null @@ -1,382 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# EXIF tags -# -# Copyright (c) 2003 by Secret Labs AB -# -# See the README file for information on usage and redistribution. -# - -""" -This module provides constants and clear-text names for various -well-known EXIF tags. -""" -from __future__ import annotations - -from enum import IntEnum - - -class Base(IntEnum): - # possibly incomplete - InteropIndex = 0x0001 - ProcessingSoftware = 0x000B - NewSubfileType = 0x00FE - SubfileType = 0x00FF - ImageWidth = 0x0100 - ImageLength = 0x0101 - BitsPerSample = 0x0102 - Compression = 0x0103 - PhotometricInterpretation = 0x0106 - Thresholding = 0x0107 - CellWidth = 0x0108 - CellLength = 0x0109 - FillOrder = 0x010A - DocumentName = 0x010D - ImageDescription = 0x010E - Make = 0x010F - Model = 0x0110 - StripOffsets = 0x0111 - Orientation = 0x0112 - SamplesPerPixel = 0x0115 - RowsPerStrip = 0x0116 - StripByteCounts = 0x0117 - MinSampleValue = 0x0118 - MaxSampleValue = 0x0119 - XResolution = 0x011A - YResolution = 0x011B - PlanarConfiguration = 0x011C - PageName = 0x011D - FreeOffsets = 0x0120 - FreeByteCounts = 0x0121 - GrayResponseUnit = 0x0122 - GrayResponseCurve = 0x0123 - T4Options = 0x0124 - T6Options = 0x0125 - ResolutionUnit = 0x0128 - PageNumber = 0x0129 - TransferFunction = 0x012D - Software = 0x0131 - DateTime = 0x0132 - Artist = 0x013B - HostComputer = 0x013C - Predictor = 0x013D - WhitePoint = 0x013E - PrimaryChromaticities = 0x013F - ColorMap = 0x0140 - HalftoneHints = 0x0141 - TileWidth = 0x0142 - TileLength = 0x0143 - TileOffsets = 0x0144 - TileByteCounts = 0x0145 - SubIFDs = 0x014A - InkSet = 0x014C - InkNames = 0x014D - NumberOfInks = 0x014E - DotRange = 0x0150 - TargetPrinter = 0x0151 - ExtraSamples = 0x0152 - SampleFormat = 0x0153 - SMinSampleValue = 0x0154 - SMaxSampleValue = 0x0155 - TransferRange = 0x0156 - ClipPath = 0x0157 - XClipPathUnits = 0x0158 - YClipPathUnits = 0x0159 - Indexed = 0x015A - JPEGTables = 0x015B - OPIProxy = 0x015F - JPEGProc = 0x0200 - JpegIFOffset = 0x0201 - JpegIFByteCount = 0x0202 - JpegRestartInterval = 0x0203 - JpegLosslessPredictors = 0x0205 - JpegPointTransforms = 0x0206 - JpegQTables = 0x0207 - JpegDCTables = 0x0208 - JpegACTables = 0x0209 - YCbCrCoefficients = 0x0211 - YCbCrSubSampling = 0x0212 - YCbCrPositioning = 0x0213 - ReferenceBlackWhite = 0x0214 - XMLPacket = 0x02BC - RelatedImageFileFormat = 0x1000 - RelatedImageWidth = 0x1001 - RelatedImageLength = 0x1002 - Rating = 0x4746 - RatingPercent = 0x4749 - ImageID = 0x800D - CFARepeatPatternDim = 0x828D - BatteryLevel = 0x828F - Copyright = 0x8298 - ExposureTime = 0x829A - FNumber = 0x829D - IPTCNAA = 0x83BB - ImageResources = 0x8649 - ExifOffset = 0x8769 - InterColorProfile = 0x8773 - ExposureProgram = 0x8822 - SpectralSensitivity = 0x8824 - GPSInfo = 0x8825 - ISOSpeedRatings = 0x8827 - OECF = 0x8828 - Interlace = 0x8829 - TimeZoneOffset = 0x882A - SelfTimerMode = 0x882B - SensitivityType = 0x8830 - StandardOutputSensitivity = 0x8831 - RecommendedExposureIndex = 0x8832 - ISOSpeed = 0x8833 - ISOSpeedLatitudeyyy = 0x8834 - ISOSpeedLatitudezzz = 0x8835 - ExifVersion = 0x9000 - DateTimeOriginal = 0x9003 - DateTimeDigitized = 0x9004 - OffsetTime = 0x9010 - OffsetTimeOriginal = 0x9011 - OffsetTimeDigitized = 0x9012 - ComponentsConfiguration = 0x9101 - CompressedBitsPerPixel = 0x9102 - ShutterSpeedValue = 0x9201 - ApertureValue = 0x9202 - BrightnessValue = 0x9203 - ExposureBiasValue = 0x9204 - MaxApertureValue = 0x9205 - SubjectDistance = 0x9206 - MeteringMode = 0x9207 - LightSource = 0x9208 - Flash = 0x9209 - FocalLength = 0x920A - Noise = 0x920D - ImageNumber = 0x9211 - SecurityClassification = 0x9212 - ImageHistory = 0x9213 - TIFFEPStandardID = 0x9216 - MakerNote = 0x927C - UserComment = 0x9286 - SubsecTime = 0x9290 - SubsecTimeOriginal = 0x9291 - SubsecTimeDigitized = 0x9292 - AmbientTemperature = 0x9400 - Humidity = 0x9401 - Pressure = 0x9402 - WaterDepth = 0x9403 - Acceleration = 0x9404 - CameraElevationAngle = 0x9405 - XPTitle = 0x9C9B - XPComment = 0x9C9C - XPAuthor = 0x9C9D - XPKeywords = 0x9C9E - XPSubject = 0x9C9F - FlashPixVersion = 0xA000 - ColorSpace = 0xA001 - ExifImageWidth = 0xA002 - ExifImageHeight = 0xA003 - RelatedSoundFile = 0xA004 - ExifInteroperabilityOffset = 0xA005 - FlashEnergy = 0xA20B - SpatialFrequencyResponse = 0xA20C - FocalPlaneXResolution = 0xA20E - FocalPlaneYResolution = 0xA20F - FocalPlaneResolutionUnit = 0xA210 - SubjectLocation = 0xA214 - ExposureIndex = 0xA215 - SensingMethod = 0xA217 - FileSource = 0xA300 - SceneType = 0xA301 - CFAPattern = 0xA302 - CustomRendered = 0xA401 - ExposureMode = 0xA402 - WhiteBalance = 0xA403 - DigitalZoomRatio = 0xA404 - FocalLengthIn35mmFilm = 0xA405 - SceneCaptureType = 0xA406 - GainControl = 0xA407 - Contrast = 0xA408 - Saturation = 0xA409 - Sharpness = 0xA40A - DeviceSettingDescription = 0xA40B - SubjectDistanceRange = 0xA40C - ImageUniqueID = 0xA420 - CameraOwnerName = 0xA430 - BodySerialNumber = 0xA431 - LensSpecification = 0xA432 - LensMake = 0xA433 - LensModel = 0xA434 - LensSerialNumber = 0xA435 - CompositeImage = 0xA460 - CompositeImageCount = 0xA461 - CompositeImageExposureTimes = 0xA462 - Gamma = 0xA500 - PrintImageMatching = 0xC4A5 - DNGVersion = 0xC612 - DNGBackwardVersion = 0xC613 - UniqueCameraModel = 0xC614 - LocalizedCameraModel = 0xC615 - CFAPlaneColor = 0xC616 - CFALayout = 0xC617 - LinearizationTable = 0xC618 - BlackLevelRepeatDim = 0xC619 - BlackLevel = 0xC61A - BlackLevelDeltaH = 0xC61B - BlackLevelDeltaV = 0xC61C - WhiteLevel = 0xC61D - DefaultScale = 0xC61E - DefaultCropOrigin = 0xC61F - DefaultCropSize = 0xC620 - ColorMatrix1 = 0xC621 - ColorMatrix2 = 0xC622 - CameraCalibration1 = 0xC623 - CameraCalibration2 = 0xC624 - ReductionMatrix1 = 0xC625 - ReductionMatrix2 = 0xC626 - AnalogBalance = 0xC627 - AsShotNeutral = 0xC628 - AsShotWhiteXY = 0xC629 - BaselineExposure = 0xC62A - BaselineNoise = 0xC62B - BaselineSharpness = 0xC62C - BayerGreenSplit = 0xC62D - LinearResponseLimit = 0xC62E - CameraSerialNumber = 0xC62F - LensInfo = 0xC630 - ChromaBlurRadius = 0xC631 - AntiAliasStrength = 0xC632 - ShadowScale = 0xC633 - DNGPrivateData = 0xC634 - MakerNoteSafety = 0xC635 - CalibrationIlluminant1 = 0xC65A - CalibrationIlluminant2 = 0xC65B - BestQualityScale = 0xC65C - RawDataUniqueID = 0xC65D - OriginalRawFileName = 0xC68B - OriginalRawFileData = 0xC68C - ActiveArea = 0xC68D - MaskedAreas = 0xC68E - AsShotICCProfile = 0xC68F - AsShotPreProfileMatrix = 0xC690 - CurrentICCProfile = 0xC691 - CurrentPreProfileMatrix = 0xC692 - ColorimetricReference = 0xC6BF - CameraCalibrationSignature = 0xC6F3 - ProfileCalibrationSignature = 0xC6F4 - AsShotProfileName = 0xC6F6 - NoiseReductionApplied = 0xC6F7 - ProfileName = 0xC6F8 - ProfileHueSatMapDims = 0xC6F9 - ProfileHueSatMapData1 = 0xC6FA - ProfileHueSatMapData2 = 0xC6FB - ProfileToneCurve = 0xC6FC - ProfileEmbedPolicy = 0xC6FD - ProfileCopyright = 0xC6FE - ForwardMatrix1 = 0xC714 - ForwardMatrix2 = 0xC715 - PreviewApplicationName = 0xC716 - PreviewApplicationVersion = 0xC717 - PreviewSettingsName = 0xC718 - PreviewSettingsDigest = 0xC719 - PreviewColorSpace = 0xC71A - PreviewDateTime = 0xC71B - RawImageDigest = 0xC71C - OriginalRawFileDigest = 0xC71D - SubTileBlockSize = 0xC71E - RowInterleaveFactor = 0xC71F - ProfileLookTableDims = 0xC725 - ProfileLookTableData = 0xC726 - OpcodeList1 = 0xC740 - OpcodeList2 = 0xC741 - OpcodeList3 = 0xC74E - NoiseProfile = 0xC761 - - -"""Maps EXIF tags to tag names.""" -TAGS = { - **{i.value: i.name for i in Base}, - 0x920C: "SpatialFrequencyResponse", - 0x9214: "SubjectLocation", - 0x9215: "ExposureIndex", - 0x828E: "CFAPattern", - 0x920B: "FlashEnergy", - 0x9216: "TIFF/EPStandardID", -} - - -class GPS(IntEnum): - GPSVersionID = 0x00 - GPSLatitudeRef = 0x01 - GPSLatitude = 0x02 - GPSLongitudeRef = 0x03 - GPSLongitude = 0x04 - GPSAltitudeRef = 0x05 - GPSAltitude = 0x06 - GPSTimeStamp = 0x07 - GPSSatellites = 0x08 - GPSStatus = 0x09 - GPSMeasureMode = 0x0A - GPSDOP = 0x0B - GPSSpeedRef = 0x0C - GPSSpeed = 0x0D - GPSTrackRef = 0x0E - GPSTrack = 0x0F - GPSImgDirectionRef = 0x10 - GPSImgDirection = 0x11 - GPSMapDatum = 0x12 - GPSDestLatitudeRef = 0x13 - GPSDestLatitude = 0x14 - GPSDestLongitudeRef = 0x15 - GPSDestLongitude = 0x16 - GPSDestBearingRef = 0x17 - GPSDestBearing = 0x18 - GPSDestDistanceRef = 0x19 - GPSDestDistance = 0x1A - GPSProcessingMethod = 0x1B - GPSAreaInformation = 0x1C - GPSDateStamp = 0x1D - GPSDifferential = 0x1E - GPSHPositioningError = 0x1F - - -"""Maps EXIF GPS tags to tag names.""" -GPSTAGS = {i.value: i.name for i in GPS} - - -class Interop(IntEnum): - InteropIndex = 0x0001 - InteropVersion = 0x0002 - RelatedImageFileFormat = 0x1000 - RelatedImageWidth = 0x1001 - RelatedImageHeight = 0x1002 - - -class IFD(IntEnum): - Exif = 0x8769 - GPSInfo = 0x8825 - MakerNote = 0x927C - Makernote = 0x927C # Deprecated - Interop = 0xA005 - IFD1 = -1 - - -class LightSource(IntEnum): - Unknown = 0x00 - Daylight = 0x01 - Fluorescent = 0x02 - Tungsten = 0x03 - Flash = 0x04 - Fine = 0x09 - Cloudy = 0x0A - Shade = 0x0B - DaylightFluorescent = 0x0C - DayWhiteFluorescent = 0x0D - CoolWhiteFluorescent = 0x0E - WhiteFluorescent = 0x0F - StandardLightA = 0x11 - StandardLightB = 0x12 - StandardLightC = 0x13 - D55 = 0x14 - D65 = 0x15 - D75 = 0x16 - D50 = 0x17 - ISO = 0x18 - Other = 0xFF diff --git a/.venv/lib/python3.10/site-packages/PIL/FitsImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/FitsImagePlugin.py deleted file mode 100644 index a3fdc0e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/FitsImagePlugin.py +++ /dev/null @@ -1,152 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# FITS file handling -# -# Copyright (c) 1998-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import gzip -import math - -from . import Image, ImageFile - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"SIMPLE") - - -class FitsImageFile(ImageFile.ImageFile): - format = "FITS" - format_description = "FITS" - - def _open(self) -> None: - assert self.fp is not None - - headers: dict[bytes, bytes] = {} - header_in_progress = False - decoder_name = "" - while True: - header = self.fp.read(80) - if not header: - msg = "Truncated FITS file" - raise OSError(msg) - keyword = header[:8].strip() - if keyword in (b"SIMPLE", b"XTENSION"): - header_in_progress = True - elif headers and not header_in_progress: - # This is now a data unit - break - elif keyword == b"END": - # Seek to the end of the header unit - self.fp.seek(math.ceil(self.fp.tell() / 2880) * 2880) - if not decoder_name: - decoder_name, offset, args = self._parse_headers(headers) - - header_in_progress = False - continue - - if decoder_name: - # Keep going to read past the headers - continue - - value = header[8:].split(b"/")[0].strip() - if value.startswith(b"="): - value = value[1:].strip() - if not headers and (not _accept(keyword) or value != b"T"): - msg = "Not a FITS file" - raise SyntaxError(msg) - headers[keyword] = value - - if not decoder_name: - msg = "No image data" - raise ValueError(msg) - - offset += self.fp.tell() - 80 - self.tile = [ImageFile._Tile(decoder_name, (0, 0) + self.size, offset, args)] - - def _get_size( - self, headers: dict[bytes, bytes], prefix: bytes - ) -> tuple[int, int] | None: - naxis = int(headers[prefix + b"NAXIS"]) - if naxis == 0: - return None - - if naxis == 1: - return 1, int(headers[prefix + b"NAXIS1"]) - else: - return int(headers[prefix + b"NAXIS1"]), int(headers[prefix + b"NAXIS2"]) - - def _parse_headers( - self, headers: dict[bytes, bytes] - ) -> tuple[str, int, tuple[str | int, ...]]: - prefix = b"" - decoder_name = "raw" - offset = 0 - if ( - headers.get(b"XTENSION") == b"'BINTABLE'" - and headers.get(b"ZIMAGE") == b"T" - and headers[b"ZCMPTYPE"] == b"'GZIP_1 '" - ): - no_prefix_size = self._get_size(headers, prefix) or (0, 0) - number_of_bits = int(headers[b"BITPIX"]) - offset = no_prefix_size[0] * no_prefix_size[1] * (number_of_bits // 8) - - prefix = b"Z" - decoder_name = "fits_gzip" - - size = self._get_size(headers, prefix) - if not size: - return "", 0, () - - self._size = size - - number_of_bits = int(headers[prefix + b"BITPIX"]) - if number_of_bits == 8: - self._mode = "L" - elif number_of_bits == 16: - self._mode = "I;16" - elif number_of_bits == 32: - self._mode = "I" - elif number_of_bits in (-32, -64): - self._mode = "F" - - args: tuple[str | int, ...] - if decoder_name == "raw": - args = (self.mode, 0, -1) - else: - args = (number_of_bits,) - return decoder_name, offset, args - - -class FitsGzipDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - value = gzip.decompress(self.fd.read()) - - rows = [] - offset = 0 - number_of_bits = min(self.args[0] // 8, 4) - for y in range(self.state.ysize): - row = bytearray() - for x in range(self.state.xsize): - row += value[offset + (4 - number_of_bits) : offset + 4] - offset += 4 - rows.append(row) - self.set_as_raw(bytes([pixel for row in rows[::-1] for pixel in row])) - return -1, 0 - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(FitsImageFile.format, FitsImageFile, _accept) -Image.register_decoder("fits_gzip", FitsGzipDecoder) - -Image.register_extensions(FitsImageFile.format, [".fit", ".fits"]) diff --git a/.venv/lib/python3.10/site-packages/PIL/FliImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/FliImagePlugin.py deleted file mode 100644 index 7c5bfee..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/FliImagePlugin.py +++ /dev/null @@ -1,178 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# FLI/FLC file handling. -# -# History: -# 95-09-01 fl Created -# 97-01-03 fl Fixed parser, setup decoder tile -# 98-07-15 fl Renamed offset attribute to avoid name clash -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 -from ._util import DeferredError - -# -# decoder - - -def _accept(prefix: bytes) -> bool: - return ( - len(prefix) >= 6 - and i16(prefix, 4) in [0xAF11, 0xAF12] - and i16(prefix, 14) in [0, 3] # flags - ) - - -## -# Image plugin for the FLI/FLC animation format. Use the seek -# method to load individual frames. - - -class FliImageFile(ImageFile.ImageFile): - format = "FLI" - format_description = "Autodesk FLI/FLC Animation" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - # HEAD - s = self.fp.read(128) - if not (_accept(s) and s[20:22] == b"\x00\x00"): - msg = "not an FLI/FLC file" - raise SyntaxError(msg) - - # frames - self.n_frames = i16(s, 6) - self.is_animated = self.n_frames > 1 - - # image characteristics - self._mode = "P" - self._size = i16(s, 8), i16(s, 10) - - # animation speed - duration = i32(s, 16) - magic = i16(s, 4) - if magic == 0xAF11: - duration = (duration * 1000) // 70 - self.info["duration"] = duration - - # look for palette - palette = [(a, a, a) for a in range(256)] - - s = self.fp.read(16) - - self.__offset = 128 - - if i16(s, 4) == 0xF100: - # prefix chunk; ignore it - self.__offset = self.__offset + i32(s) - self.fp.seek(self.__offset) - s = self.fp.read(16) - - if i16(s, 4) == 0xF1FA: - # look for palette chunk - number_of_subchunks = i16(s, 6) - chunk_size: int | None = None - for _ in range(number_of_subchunks): - if chunk_size is not None: - self.fp.seek(chunk_size - 6, os.SEEK_CUR) - s = self.fp.read(6) - chunk_type = i16(s, 4) - if chunk_type in (4, 11): - self._palette(palette, 2 if chunk_type == 11 else 0) - break - chunk_size = i32(s) - if not chunk_size: - break - - self.palette = ImagePalette.raw( - "RGB", b"".join(o8(r) + o8(g) + o8(b) for (r, g, b) in palette) - ) - - # set things up to decode first frame - self.__frame = -1 - self._fp = self.fp - self.__rewind = self.fp.tell() - self.seek(0) - - def _palette(self, palette: list[tuple[int, int, int]], shift: int) -> None: - # load palette - - i = 0 - for e in range(i16(self.fp.read(2))): - s = self.fp.read(2) - i = i + s[0] - n = s[1] - if n == 0: - n = 256 - s = self.fp.read(n * 3) - for n in range(0, len(s), 3): - r = s[n] << shift - g = s[n + 1] << shift - b = s[n + 2] << shift - palette[i] = (r, g, b) - i += 1 - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0) - - for f in range(self.__frame + 1, frame + 1): - self._seek(f) - - def _seek(self, frame: int) -> None: - if isinstance(self._fp, DeferredError): - raise self._fp.ex - if frame == 0: - self.__frame = -1 - self._fp.seek(self.__rewind) - self.__offset = 128 - else: - # ensure that the previous frame was loaded - self.load() - - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - self.__frame = frame - - # move to next frame - self.fp = self._fp - self.fp.seek(self.__offset) - - s = self.fp.read(4) - if not s: - msg = "missing frame size" - raise EOFError(msg) - - framesize = i32(s) - - self.decodermaxblock = framesize - self.tile = [ImageFile._Tile("fli", (0, 0) + self.size, self.__offset)] - - self.__offset += framesize - - def tell(self) -> int: - return self.__frame - - -# -# registry - -Image.register_open(FliImageFile.format, FliImageFile, _accept) - -Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/.venv/lib/python3.10/site-packages/PIL/FontFile.py b/.venv/lib/python3.10/site-packages/PIL/FontFile.py deleted file mode 100644 index 1e0c1c1..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/FontFile.py +++ /dev/null @@ -1,134 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# base class for raster font file parsers -# -# history: -# 1997-06-05 fl created -# 1997-08-19 fl restrict image width -# -# Copyright (c) 1997-1998 by Secret Labs AB -# Copyright (c) 1997-1998 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -from typing import BinaryIO - -from . import Image, _binary - -WIDTH = 800 - - -def puti16( - fp: BinaryIO, values: tuple[int, int, int, int, int, int, int, int, int, int] -) -> None: - """Write network order (big-endian) 16-bit sequence""" - for v in values: - if v < 0: - v += 65536 - fp.write(_binary.o16be(v)) - - -class FontFile: - """Base class for raster font file handlers.""" - - bitmap: Image.Image | None = None - - def __init__(self) -> None: - self.info: dict[bytes, bytes | int] = {} - self.glyph: list[ - tuple[ - tuple[int, int], - tuple[int, int, int, int], - tuple[int, int, int, int], - Image.Image, - ] - | None - ] = [None] * 256 - - def __getitem__(self, ix: int) -> ( - tuple[ - tuple[int, int], - tuple[int, int, int, int], - tuple[int, int, int, int], - Image.Image, - ] - | None - ): - return self.glyph[ix] - - def compile(self) -> None: - """Create metrics and bitmap""" - - if self.bitmap: - return - - # create bitmap large enough to hold all data - h = w = maxwidth = 0 - lines = 1 - for glyph in self.glyph: - if glyph: - d, dst, src, im = glyph - h = max(h, src[3] - src[1]) - w = w + (src[2] - src[0]) - if w > WIDTH: - lines += 1 - w = src[2] - src[0] - maxwidth = max(maxwidth, w) - - xsize = maxwidth - ysize = lines * h - - if xsize == 0 and ysize == 0: - return - - self.ysize = h - - # paste glyphs into bitmap - self.bitmap = Image.new("1", (xsize, ysize)) - self.metrics: list[ - tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]] - | None - ] = [None] * 256 - x = y = 0 - for i in range(256): - glyph = self[i] - if glyph: - d, dst, src, im = glyph - xx = src[2] - src[0] - x0, y0 = x, y - x = x + xx - if x > WIDTH: - x, y = 0, y + h - x0, y0 = x, y - x = xx - s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 - self.bitmap.paste(im.crop(src), s) - self.metrics[i] = d, dst, s - - def save(self, filename: str) -> None: - """Save font""" - - self.compile() - - # font data - if not self.bitmap: - msg = "No bitmap created" - raise ValueError(msg) - self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") - - # font metrics - with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: - fp.write(b"PILfont\n") - fp.write(f";;;;;;{self.ysize};\n".encode("ascii")) # HACK!!! - fp.write(b"DATA\n") - for id in range(256): - m = self.metrics[id] - if not m: - puti16(fp, (0,) * 10) - else: - puti16(fp, m[0] + m[1] + m[2]) diff --git a/.venv/lib/python3.10/site-packages/PIL/FpxImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/FpxImagePlugin.py deleted file mode 100644 index fd992cd..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/FpxImagePlugin.py +++ /dev/null @@ -1,257 +0,0 @@ -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library. -# $Id$ -# -# FlashPix support for PIL -# -# History: -# 97-01-25 fl Created (reads uncompressed RGB images only) -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import olefile - -from . import Image, ImageFile -from ._binary import i32le as i32 - -# we map from colour field tuples to (mode, rawmode) descriptors -MODES = { - # opacity - (0x00007FFE,): ("A", "L"), - # monochrome - (0x00010000,): ("L", "L"), - (0x00018000, 0x00017FFE): ("RGBA", "LA"), - # photo YCC - (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), - (0x00028000, 0x00028001, 0x00028002, 0x00027FFE): ("RGBA", "YCCA;P"), - # standard RGB (NIFRGB) - (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), - (0x00038000, 0x00038001, 0x00038002, 0x00037FFE): ("RGBA", "RGBA"), -} - - -# -# -------------------------------------------------------------------- - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(olefile.MAGIC) - - -## -# Image plugin for the FlashPix images. - - -class FpxImageFile(ImageFile.ImageFile): - format = "FPX" - format_description = "FlashPix" - - def _open(self) -> None: - # - # read the OLE directory and see if this is a likely - # to be a FlashPix file - - try: - self.ole = olefile.OleFileIO(self.fp) - except OSError as e: - msg = "not an FPX file; invalid OLE file" - raise SyntaxError(msg) from e - - root = self.ole.root - if not root or root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": - msg = "not an FPX file; bad root CLSID" - raise SyntaxError(msg) - - self._open_index(1) - - def _open_index(self, index: int = 1) -> None: - # - # get the Image Contents Property Set - - prop = self.ole.getproperties( - [f"Data Object Store {index:06d}", "\005Image Contents"] - ) - - # size (highest resolution) - - assert isinstance(prop[0x1000002], int) - assert isinstance(prop[0x1000003], int) - self._size = prop[0x1000002], prop[0x1000003] - - size = max(self.size) - i = 1 - while size > 64: - size = size // 2 - i += 1 - self.maxid = i - 1 - - # mode. instead of using a single field for this, flashpix - # requires you to specify the mode for each channel in each - # resolution subimage, and leaves it to the decoder to make - # sure that they all match. for now, we'll cheat and assume - # that this is always the case. - - id = self.maxid << 16 - - s = prop[0x2000002 | id] - - if not isinstance(s, bytes) or (bands := i32(s, 4)) > 4: - msg = "Invalid number of bands" - raise OSError(msg) - - # note: for now, we ignore the "uncalibrated" flag - colors = tuple(i32(s, 8 + i * 4) & 0x7FFFFFFF for i in range(bands)) - - self._mode, self.rawmode = MODES[colors] - - # load JPEG tables, if any - self.jpeg = {} - for i in range(256): - id = 0x3000001 | (i << 16) - if id in prop: - self.jpeg[i] = prop[id] - - self._open_subimage(1, self.maxid) - - def _open_subimage(self, index: int = 1, subimage: int = 0) -> None: - # - # setup tile descriptors for a given subimage - - stream = [ - f"Data Object Store {index:06d}", - f"Resolution {subimage:04d}", - "Subimage 0000 Header", - ] - - fp = self.ole.openstream(stream) - - # skip prefix - fp.read(28) - - # header stream - s = fp.read(36) - - size = i32(s, 4), i32(s, 8) - # tilecount = i32(s, 12) - tilesize = i32(s, 16), i32(s, 20) - # channels = i32(s, 24) - offset = i32(s, 28) - length = i32(s, 32) - - if size != self.size: - msg = "subimage mismatch" - raise OSError(msg) - - # get tile descriptors - fp.seek(28 + offset) - s = fp.read(i32(s, 12) * length) - - x = y = 0 - xsize, ysize = size - xtile, ytile = tilesize - self.tile = [] - - for i in range(0, len(s), length): - x1 = min(xsize, x + xtile) - y1 = min(ysize, y + ytile) - - compression = i32(s, i + 8) - - if compression == 0: - self.tile.append( - ImageFile._Tile( - "raw", - (x, y, x1, y1), - i32(s, i) + 28, - self.rawmode, - ) - ) - - elif compression == 1: - # FIXME: the fill decoder is not implemented - self.tile.append( - ImageFile._Tile( - "fill", - (x, y, x1, y1), - i32(s, i) + 28, - (self.rawmode, s[12:16]), - ) - ) - - elif compression == 2: - internal_color_conversion = s[14] - jpeg_tables = s[15] - rawmode = self.rawmode - - if internal_color_conversion: - # The image is stored as usual (usually YCbCr). - if rawmode == "RGBA": - # For "RGBA", data is stored as YCbCrA based on - # negative RGB. The following trick works around - # this problem : - jpegmode, rawmode = "YCbCrK", "CMYK" - else: - jpegmode = None # let the decoder decide - - else: - # The image is stored as defined by rawmode - jpegmode = rawmode - - self.tile.append( - ImageFile._Tile( - "jpeg", - (x, y, x1, y1), - i32(s, i) + 28, - (rawmode, jpegmode), - ) - ) - - # FIXME: jpeg tables are tile dependent; the prefix - # data must be placed in the tile descriptor itself! - - if jpeg_tables: - self.tile_prefix = self.jpeg[jpeg_tables] - - else: - msg = "unknown/invalid compression" - raise OSError(msg) - - x = x + xtile - if x >= xsize: - x, y = 0, y + ytile - if y >= ysize: - break # isn't really required - - self.stream = stream - self._fp = self.fp - self.fp = None - - def load(self) -> Image.core.PixelAccess | None: - if not self.fp: - self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"]) - - return ImageFile.ImageFile.load(self) - - def close(self) -> None: - self.ole.close() - super().close() - - def __exit__(self, *args: object) -> None: - self.ole.close() - super().__exit__() - - -# -# -------------------------------------------------------------------- - - -Image.register_open(FpxImageFile.format, FpxImageFile, _accept) - -Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/.venv/lib/python3.10/site-packages/PIL/FtexImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/FtexImagePlugin.py deleted file mode 100644 index d60e75b..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/FtexImagePlugin.py +++ /dev/null @@ -1,114 +0,0 @@ -""" -A Pillow loader for .ftc and .ftu files (FTEX) -Jerome Leclanche - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ - -Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 - -The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a -packed custom format called FTEX. This file format uses file extensions FTC -and FTU. -* FTC files are compressed textures (using standard texture compression). -* FTU files are not compressed. -Texture File Format -The FTC and FTU texture files both use the same format. This -has the following structure: -{header} -{format_directory} -{data} -Where: -{header} = { - u32:magic, - u32:version, - u32:width, - u32:height, - u32:mipmap_count, - u32:format_count -} - -* The "magic" number is "FTEX". -* "width" and "height" are the dimensions of the texture. -* "mipmap_count" is the number of mipmaps in the texture. -* "format_count" is the number of texture formats (different versions of the -same texture) in this file. - -{format_directory} = format_count * { u32:format, u32:where } - -The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB -uncompressed textures. -The texture data for a format starts at the position "where" in the file. - -Each set of texture data in the file has the following structure: -{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } -* "mipmap_size" is the number of bytes in that mip level. For compressed -textures this is the size of the texture data compressed with DXT1. For 24 bit -uncompressed textures, this is 3 * width * height. Following this are the image -bytes for that mipmap level. - -Note: All data is stored in little-Endian (Intel) byte order. -""" - -from __future__ import annotations - -import struct -from enum import IntEnum -from io import BytesIO - -from . import Image, ImageFile - -MAGIC = b"FTEX" - - -class Format(IntEnum): - DXT1 = 0 - UNCOMPRESSED = 1 - - -class FtexImageFile(ImageFile.ImageFile): - format = "FTEX" - format_description = "Texture File Format (IW2:EOC)" - - def _open(self) -> None: - if not _accept(self.fp.read(4)): - msg = "not an FTEX file" - raise SyntaxError(msg) - struct.unpack(" None: - pass - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(MAGIC) - - -Image.register_open(FtexImageFile.format, FtexImageFile, _accept) -Image.register_extensions(FtexImageFile.format, [".ftc", ".ftu"]) diff --git a/.venv/lib/python3.10/site-packages/PIL/GbrImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/GbrImagePlugin.py deleted file mode 100644 index f319d7e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/GbrImagePlugin.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# The Python Imaging Library -# -# load a GIMP brush file -# -# History: -# 96-03-14 fl Created -# 16-01-08 es Version 2 -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# Copyright (c) Eric Soroos 2016. -# -# See the README file for information on usage and redistribution. -# -# -# See https://github.com/GNOME/gimp/blob/mainline/devel-docs/gbr.txt for -# format documentation. -# -# This code Interprets version 1 and 2 .gbr files. -# Version 1 files are obsolete, and should not be used for new -# brushes. -# Version 2 files are saved by GIMP v2.8 (at least) -# Version 3 files have a format specifier of 18 for 16bit floats in -# the color depth field. This is currently unsupported by Pillow. -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i32be as i32 - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) - - -## -# Image plugin for the GIMP brush format. - - -class GbrImageFile(ImageFile.ImageFile): - format = "GBR" - format_description = "GIMP brush file" - - def _open(self) -> None: - header_size = i32(self.fp.read(4)) - if header_size < 20: - msg = "not a GIMP brush" - raise SyntaxError(msg) - version = i32(self.fp.read(4)) - if version not in (1, 2): - msg = f"Unsupported GIMP brush version: {version}" - raise SyntaxError(msg) - - width = i32(self.fp.read(4)) - height = i32(self.fp.read(4)) - color_depth = i32(self.fp.read(4)) - if width <= 0 or height <= 0: - msg = "not a GIMP brush" - raise SyntaxError(msg) - if color_depth not in (1, 4): - msg = f"Unsupported GIMP brush color depth: {color_depth}" - raise SyntaxError(msg) - - if version == 1: - comment_length = header_size - 20 - else: - comment_length = header_size - 28 - magic_number = self.fp.read(4) - if magic_number != b"GIMP": - msg = "not a GIMP brush, bad magic number" - raise SyntaxError(msg) - self.info["spacing"] = i32(self.fp.read(4)) - - comment = self.fp.read(comment_length)[:-1] - - if color_depth == 1: - self._mode = "L" - else: - self._mode = "RGBA" - - self._size = width, height - - self.info["comment"] = comment - - # Image might not be small - Image._decompression_bomb_check(self.size) - - # Data is an uncompressed block of w * h * bytes/pixel - self._data_size = width * height * color_depth - - def load(self) -> Image.core.PixelAccess | None: - if self._im is None: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self._data_size)) - return Image.Image.load(self) - - -# -# registry - - -Image.register_open(GbrImageFile.format, GbrImageFile, _accept) -Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/.venv/lib/python3.10/site-packages/PIL/GdImageFile.py b/.venv/lib/python3.10/site-packages/PIL/GdImageFile.py deleted file mode 100644 index 891225c..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/GdImageFile.py +++ /dev/null @@ -1,102 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# GD file handling -# -# History: -# 1996-04-12 fl Created -# -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - - -""" -.. note:: - This format cannot be automatically recognized, so the - class is not registered for use with :py:func:`PIL.Image.open()`. To open a - gd file, use the :py:func:`PIL.GdImageFile.open()` function instead. - -.. warning:: - THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This - implementation is provided for convenience and demonstrational - purposes only. -""" -from __future__ import annotations - -from typing import IO - -from . import ImageFile, ImagePalette, UnidentifiedImageError -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._typing import StrOrBytesPath - - -class GdImageFile(ImageFile.ImageFile): - """ - Image plugin for the GD uncompressed format. Note that this format - is not supported by the standard :py:func:`PIL.Image.open()` function. To use - this plugin, you have to import the :py:mod:`PIL.GdImageFile` module and - use the :py:func:`PIL.GdImageFile.open()` function. - """ - - format = "GD" - format_description = "GD uncompressed images" - - def _open(self) -> None: - # Header - assert self.fp is not None - - s = self.fp.read(1037) - - if i16(s) not in [65534, 65535]: - msg = "Not a valid GD 2.x .gd file" - raise SyntaxError(msg) - - self._mode = "P" - self._size = i16(s, 2), i16(s, 4) - - true_color = s[6] - true_color_offset = 2 if true_color else 0 - - # transparency index - tindex = i32(s, 7 + true_color_offset) - if tindex < 256: - self.info["transparency"] = tindex - - self.palette = ImagePalette.raw( - "RGBX", s[7 + true_color_offset + 6 : 7 + true_color_offset + 6 + 256 * 4] - ) - - self.tile = [ - ImageFile._Tile( - "raw", - (0, 0) + self.size, - 7 + true_color_offset + 6 + 256 * 4, - "L", - ) - ] - - -def open(fp: StrOrBytesPath | IO[bytes], mode: str = "r") -> GdImageFile: - """ - Load texture from a GD image file. - - :param fp: GD file name, or an opened file handle. - :param mode: Optional mode. In this version, if the mode argument - is given, it must be "r". - :returns: An image instance. - :raises OSError: If the image could not be read. - """ - if mode != "r": - msg = "bad mode" - raise ValueError(msg) - - try: - return GdImageFile(fp) - except SyntaxError as e: - msg = "cannot identify this image file" - raise UnidentifiedImageError(msg) from e diff --git a/.venv/lib/python3.10/site-packages/PIL/GifImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/GifImagePlugin.py deleted file mode 100644 index 4392c4c..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/GifImagePlugin.py +++ /dev/null @@ -1,1207 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# GIF file handling -# -# History: -# 1995-09-01 fl Created -# 1996-12-14 fl Added interlace support -# 1996-12-30 fl Added animation support -# 1997-01-05 fl Added write support, fixed local colour map bug -# 1997-02-23 fl Make sure to load raster data in getdata() -# 1997-07-05 fl Support external decoder (0.4) -# 1998-07-09 fl Handle all modes when saving (0.5) -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) -# 2001-04-17 fl Added palette optimization (0.7) -# 2002-06-06 fl Added transparency support for save (0.8) -# 2004-02-24 fl Disable interlacing for small images -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1995-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import itertools -import math -import os -import subprocess -from enum import IntEnum -from functools import cached_property -from typing import IO, Any, Literal, NamedTuple, Union - -from . import ( - Image, - ImageChops, - ImageFile, - ImageMath, - ImageOps, - ImagePalette, - ImageSequence, -) -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 -from ._util import DeferredError - -TYPE_CHECKING = False -if TYPE_CHECKING: - from . import _imaging - from ._typing import Buffer - - -class LoadingStrategy(IntEnum): - """.. versionadded:: 9.1.0""" - - RGB_AFTER_FIRST = 0 - RGB_AFTER_DIFFERENT_PALETTE_ONLY = 1 - RGB_ALWAYS = 2 - - -#: .. versionadded:: 9.1.0 -LOADING_STRATEGY = LoadingStrategy.RGB_AFTER_FIRST - -# -------------------------------------------------------------------- -# Identify/read GIF files - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith((b"GIF87a", b"GIF89a")) - - -## -# Image plugin for GIF images. This plugin supports both GIF87 and -# GIF89 images. - - -class GifImageFile(ImageFile.ImageFile): - format = "GIF" - format_description = "Compuserve GIF" - _close_exclusive_fp_after_loading = False - - global_palette = None - - def data(self) -> bytes | None: - s = self.fp.read(1) - if s and s[0]: - return self.fp.read(s[0]) - return None - - def _is_palette_needed(self, p: bytes) -> bool: - for i in range(0, len(p), 3): - if not (i // 3 == p[i] == p[i + 1] == p[i + 2]): - return True - return False - - def _open(self) -> None: - # Screen - s = self.fp.read(13) - if not _accept(s): - msg = "not a GIF file" - raise SyntaxError(msg) - - self.info["version"] = s[:6] - self._size = i16(s, 6), i16(s, 8) - flags = s[10] - bits = (flags & 7) + 1 - - if flags & 128: - # get global palette - self.info["background"] = s[11] - # check if palette contains colour indices - p = self.fp.read(3 << bits) - if self._is_palette_needed(p): - p = ImagePalette.raw("RGB", p) - self.global_palette = self.palette = p - - self._fp = self.fp # FIXME: hack - self.__rewind = self.fp.tell() - self._n_frames: int | None = None - self._seek(0) # get ready to read first frame - - @property - def n_frames(self) -> int: - if self._n_frames is None: - current = self.tell() - try: - while True: - self._seek(self.tell() + 1, False) - except EOFError: - self._n_frames = self.tell() + 1 - self.seek(current) - return self._n_frames - - @cached_property - def is_animated(self) -> bool: - if self._n_frames is not None: - return self._n_frames != 1 - - current = self.tell() - if current: - return True - - try: - self._seek(1, False) - is_animated = True - except EOFError: - is_animated = False - - self.seek(current) - return is_animated - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if frame < self.__frame: - self._im = None - self._seek(0) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - msg = "no more images in GIF file" - raise EOFError(msg) from e - - def _seek(self, frame: int, update_image: bool = True) -> None: - if isinstance(self._fp, DeferredError): - raise self._fp.ex - if frame == 0: - # rewind - self.__offset = 0 - self.dispose: _imaging.ImagingCore | None = None - self.__frame = -1 - self._fp.seek(self.__rewind) - self.disposal_method = 0 - if "comment" in self.info: - del self.info["comment"] - else: - # ensure that the previous frame was loaded - if self.tile and update_image: - self.load() - - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - - self.fp = self._fp - if self.__offset: - # backup to last frame - self.fp.seek(self.__offset) - while self.data(): - pass - self.__offset = 0 - - s = self.fp.read(1) - if not s or s == b";": - msg = "no more images in GIF file" - raise EOFError(msg) - - palette: ImagePalette.ImagePalette | Literal[False] | None = None - - info: dict[str, Any] = {} - frame_transparency = None - interlace = None - frame_dispose_extent = None - while True: - if not s: - s = self.fp.read(1) - if not s or s == b";": - break - - elif s == b"!": - # - # extensions - # - s = self.fp.read(1) - block = self.data() - if s[0] == 249 and block is not None: - # - # graphic control extension - # - flags = block[0] - if flags & 1: - frame_transparency = block[3] - info["duration"] = i16(block, 1) * 10 - - # disposal method - find the value of bits 4 - 6 - dispose_bits = 0b00011100 & flags - dispose_bits = dispose_bits >> 2 - if dispose_bits: - # only set the dispose if it is not - # unspecified. I'm not sure if this is - # correct, but it seems to prevent the last - # frame from looking odd for some animations - self.disposal_method = dispose_bits - elif s[0] == 254: - # - # comment extension - # - comment = b"" - - # Read this comment block - while block: - comment += block - block = self.data() - - if "comment" in info: - # If multiple comment blocks in frame, separate with \n - info["comment"] += b"\n" + comment - else: - info["comment"] = comment - s = None - continue - elif s[0] == 255 and frame == 0 and block is not None: - # - # application extension - # - info["extension"] = block, self.fp.tell() - if block.startswith(b"NETSCAPE2.0"): - block = self.data() - if block and len(block) >= 3 and block[0] == 1: - self.info["loop"] = i16(block, 1) - while self.data(): - pass - - elif s == b",": - # - # local image - # - s = self.fp.read(9) - - # extent - x0, y0 = i16(s, 0), i16(s, 2) - x1, y1 = x0 + i16(s, 4), y0 + i16(s, 6) - if (x1 > self.size[0] or y1 > self.size[1]) and update_image: - self._size = max(x1, self.size[0]), max(y1, self.size[1]) - Image._decompression_bomb_check(self._size) - frame_dispose_extent = x0, y0, x1, y1 - flags = s[8] - - interlace = (flags & 64) != 0 - - if flags & 128: - bits = (flags & 7) + 1 - p = self.fp.read(3 << bits) - if self._is_palette_needed(p): - palette = ImagePalette.raw("RGB", p) - else: - palette = False - - # image data - bits = self.fp.read(1)[0] - self.__offset = self.fp.tell() - break - s = None - - if interlace is None: - msg = "image not found in GIF frame" - raise EOFError(msg) - - self.__frame = frame - if not update_image: - return - - self.tile = [] - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - - self._frame_palette = palette if palette is not None else self.global_palette - self._frame_transparency = frame_transparency - if frame == 0: - if self._frame_palette: - if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: - self._mode = "RGBA" if frame_transparency is not None else "RGB" - else: - self._mode = "P" - else: - self._mode = "L" - - if palette: - self.palette = palette - elif self.global_palette: - from copy import copy - - self.palette = copy(self.global_palette) - else: - self.palette = None - else: - if self.mode == "P": - if ( - LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY - or palette - ): - if "transparency" in self.info: - self.im.putpalettealpha(self.info["transparency"], 0) - self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG) - self._mode = "RGBA" - del self.info["transparency"] - else: - self._mode = "RGB" - self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) - - def _rgb(color: int) -> tuple[int, int, int]: - if self._frame_palette: - if color * 3 + 3 > len(self._frame_palette.palette): - color = 0 - return tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]) - else: - return (color, color, color) - - self.dispose = None - self.dispose_extent = frame_dispose_extent - if self.dispose_extent and self.disposal_method >= 2: - try: - if self.disposal_method == 2: - # replace with background colour - - # only dispose the extent in this frame - x0, y0, x1, y1 = self.dispose_extent - dispose_size = (x1 - x0, y1 - y0) - - Image._decompression_bomb_check(dispose_size) - - # by convention, attempt to use transparency first - dispose_mode = "P" - color = self.info.get("transparency", frame_transparency) - if color is not None: - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGBA" - color = _rgb(color) + (0,) - else: - color = self.info.get("background", 0) - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGB" - color = _rgb(color) - self.dispose = Image.core.fill(dispose_mode, dispose_size, color) - else: - # replace with previous contents - if self._im is not None: - # only dispose the extent in this frame - self.dispose = self._crop(self.im, self.dispose_extent) - elif frame_transparency is not None: - x0, y0, x1, y1 = self.dispose_extent - dispose_size = (x1 - x0, y1 - y0) - - Image._decompression_bomb_check(dispose_size) - dispose_mode = "P" - color = frame_transparency - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGBA" - color = _rgb(frame_transparency) + (0,) - self.dispose = Image.core.fill( - dispose_mode, dispose_size, color - ) - except AttributeError: - pass - - if interlace is not None: - transparency = -1 - if frame_transparency is not None: - if frame == 0: - if LOADING_STRATEGY != LoadingStrategy.RGB_ALWAYS: - self.info["transparency"] = frame_transparency - elif self.mode not in ("RGB", "RGBA"): - transparency = frame_transparency - self.tile = [ - ImageFile._Tile( - "gif", - (x0, y0, x1, y1), - self.__offset, - (bits, interlace, transparency), - ) - ] - - if info.get("comment"): - self.info["comment"] = info["comment"] - for k in ["duration", "extension"]: - if k in info: - self.info[k] = info[k] - elif k in self.info: - del self.info[k] - - def load_prepare(self) -> None: - temp_mode = "P" if self._frame_palette else "L" - self._prev_im = None - if self.__frame == 0: - if self._frame_transparency is not None: - self.im = Image.core.fill( - temp_mode, self.size, self._frame_transparency - ) - elif self.mode in ("RGB", "RGBA"): - self._prev_im = self.im - if self._frame_palette: - self.im = Image.core.fill("P", self.size, self._frame_transparency or 0) - self.im.putpalette("RGB", *self._frame_palette.getdata()) - else: - self._im = None - if not self._prev_im and self._im is not None and self.size != self.im.size: - expanded_im = Image.core.fill(self.im.mode, self.size) - if self._frame_palette: - expanded_im.putpalette("RGB", *self._frame_palette.getdata()) - expanded_im.paste(self.im, (0, 0) + self.im.size) - - self.im = expanded_im - self._mode = temp_mode - self._frame_palette = None - - super().load_prepare() - - def load_end(self) -> None: - if self.__frame == 0: - if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: - if self._frame_transparency is not None: - self.im.putpalettealpha(self._frame_transparency, 0) - self._mode = "RGBA" - else: - self._mode = "RGB" - self.im = self.im.convert(self.mode, Image.Dither.FLOYDSTEINBERG) - return - if not self._prev_im: - return - if self.size != self._prev_im.size: - if self._frame_transparency is not None: - expanded_im = Image.core.fill("RGBA", self.size) - else: - expanded_im = Image.core.fill("P", self.size) - expanded_im.putpalette("RGB", "RGB", self.im.getpalette()) - expanded_im = expanded_im.convert("RGB") - expanded_im.paste(self._prev_im, (0, 0) + self._prev_im.size) - - self._prev_im = expanded_im - assert self._prev_im is not None - if self._frame_transparency is not None: - self.im.putpalettealpha(self._frame_transparency, 0) - frame_im = self.im.convert("RGBA") - else: - frame_im = self.im.convert("RGB") - - assert self.dispose_extent is not None - frame_im = self._crop(frame_im, self.dispose_extent) - - self.im = self._prev_im - self._mode = self.im.mode - if frame_im.mode == "RGBA": - self.im.paste(frame_im, self.dispose_extent, frame_im) - else: - self.im.paste(frame_im, self.dispose_extent) - - def tell(self) -> int: - return self.__frame - - -# -------------------------------------------------------------------- -# Write GIF files - - -RAWMODE = {"1": "L", "L": "L", "P": "P"} - - -def _normalize_mode(im: Image.Image) -> Image.Image: - """ - Takes an image (or frame), returns an image in a mode that is appropriate - for saving in a Gif. - - It may return the original image, or it may return an image converted to - palette or 'L' mode. - - :param im: Image object - :returns: Image object - """ - if im.mode in RAWMODE: - im.load() - return im - if Image.getmodebase(im.mode) == "RGB": - im = im.convert("P", palette=Image.Palette.ADAPTIVE) - assert im.palette is not None - if im.palette.mode == "RGBA": - for rgba in im.palette.colors: - if rgba[3] == 0: - im.info["transparency"] = im.palette.colors[rgba] - break - return im - return im.convert("L") - - -_Palette = Union[bytes, bytearray, list[int], ImagePalette.ImagePalette] - - -def _normalize_palette( - im: Image.Image, palette: _Palette | None, info: dict[str, Any] -) -> Image.Image: - """ - Normalizes the palette for image. - - Sets the palette to the incoming palette, if provided. - - Ensures that there's a palette for L mode images - - Optimizes the palette if necessary/desired. - - :param im: Image object - :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo - :returns: Image object - """ - source_palette = None - if palette: - # a bytes palette - if isinstance(palette, (bytes, bytearray, list)): - source_palette = bytearray(palette[:768]) - if isinstance(palette, ImagePalette.ImagePalette): - source_palette = bytearray(palette.palette) - - if im.mode == "P": - if not source_palette: - im_palette = im.getpalette(None) - assert im_palette is not None - source_palette = bytearray(im_palette) - else: # L-mode - if not source_palette: - source_palette = bytearray(i // 3 for i in range(768)) - im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette) - assert source_palette is not None - - if palette: - used_palette_colors: list[int | None] = [] - assert im.palette is not None - for i in range(0, len(source_palette), 3): - source_color = tuple(source_palette[i : i + 3]) - index = im.palette.colors.get(source_color) - if index in used_palette_colors: - index = None - used_palette_colors.append(index) - for i, index in enumerate(used_palette_colors): - if index is None: - for j in range(len(used_palette_colors)): - if j not in used_palette_colors: - used_palette_colors[i] = j - break - dest_map: list[int] = [] - for index in used_palette_colors: - assert index is not None - dest_map.append(index) - im = im.remap_palette(dest_map) - else: - optimized_palette_colors = _get_optimize(im, info) - if optimized_palette_colors is not None: - im = im.remap_palette(optimized_palette_colors, source_palette) - if "transparency" in info: - try: - info["transparency"] = optimized_palette_colors.index( - info["transparency"] - ) - except ValueError: - del info["transparency"] - return im - - assert im.palette is not None - im.palette.palette = source_palette - return im - - -def _write_single_frame( - im: Image.Image, - fp: IO[bytes], - palette: _Palette | None, -) -> None: - im_out = _normalize_mode(im) - for k, v in im_out.info.items(): - if isinstance(k, str): - im.encoderinfo.setdefault(k, v) - im_out = _normalize_palette(im_out, palette, im.encoderinfo) - - for s in _get_global_header(im_out, im.encoderinfo): - fp.write(s) - - # local image header - flags = 0 - if get_interlace(im): - flags = flags | 64 - _write_local_header(fp, im, (0, 0), flags) - - im_out.encoderconfig = (8, get_interlace(im)) - ImageFile._save( - im_out, fp, [ImageFile._Tile("gif", (0, 0) + im.size, 0, RAWMODE[im_out.mode])] - ) - - fp.write(b"\0") # end of image data - - -def _getbbox( - base_im: Image.Image, im_frame: Image.Image -) -> tuple[Image.Image, tuple[int, int, int, int] | None]: - palette_bytes = [ - bytes(im.palette.palette) if im.palette else b"" for im in (base_im, im_frame) - ] - if palette_bytes[0] != palette_bytes[1]: - im_frame = im_frame.convert("RGBA") - base_im = base_im.convert("RGBA") - delta = ImageChops.subtract_modulo(im_frame, base_im) - return delta, delta.getbbox(alpha_only=False) - - -class _Frame(NamedTuple): - im: Image.Image - bbox: tuple[int, int, int, int] | None - encoderinfo: dict[str, Any] - - -def _write_multiple_frames( - im: Image.Image, fp: IO[bytes], palette: _Palette | None -) -> bool: - duration = im.encoderinfo.get("duration") - disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) - - im_frames: list[_Frame] = [] - previous_im: Image.Image | None = None - frame_count = 0 - background_im = None - for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): - for im_frame in ImageSequence.Iterator(imSequence): - # a copy is required here since seek can still mutate the image - im_frame = _normalize_mode(im_frame.copy()) - if frame_count == 0: - for k, v in im_frame.info.items(): - if k == "transparency": - continue - if isinstance(k, str): - im.encoderinfo.setdefault(k, v) - - encoderinfo = im.encoderinfo.copy() - if "transparency" in im_frame.info: - encoderinfo.setdefault("transparency", im_frame.info["transparency"]) - im_frame = _normalize_palette(im_frame, palette, encoderinfo) - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - elif duration is None and "duration" in im_frame.info: - encoderinfo["duration"] = im_frame.info["duration"] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - frame_count += 1 - - diff_frame = None - if im_frames and previous_im: - # delta frame - delta, bbox = _getbbox(previous_im, im_frame) - if not bbox: - # This frame is identical to the previous frame - if encoderinfo.get("duration"): - im_frames[-1].encoderinfo["duration"] += encoderinfo["duration"] - continue - if im_frames[-1].encoderinfo.get("disposal") == 2: - # To appear correctly in viewers using a convention, - # only consider transparency, and not background color - color = im.encoderinfo.get( - "transparency", im.info.get("transparency") - ) - if color is not None: - if background_im is None: - background = _get_background(im_frame, color) - background_im = Image.new("P", im_frame.size, background) - first_palette = im_frames[0].im.palette - assert first_palette is not None - background_im.putpalette(first_palette, first_palette.mode) - bbox = _getbbox(background_im, im_frame)[1] - else: - bbox = (0, 0) + im_frame.size - elif encoderinfo.get("optimize") and im_frame.mode != "1": - if "transparency" not in encoderinfo: - assert im_frame.palette is not None - try: - encoderinfo["transparency"] = ( - im_frame.palette._new_color_index(im_frame) - ) - except ValueError: - pass - if "transparency" in encoderinfo: - # When the delta is zero, fill the image with transparency - diff_frame = im_frame.copy() - fill = Image.new("P", delta.size, encoderinfo["transparency"]) - if delta.mode == "RGBA": - r, g, b, a = delta.split() - mask = ImageMath.lambda_eval( - lambda args: args["convert"]( - args["max"]( - args["max"]( - args["max"](args["r"], args["g"]), args["b"] - ), - args["a"], - ) - * 255, - "1", - ), - r=r, - g=g, - b=b, - a=a, - ) - else: - if delta.mode == "P": - # Convert to L without considering palette - delta_l = Image.new("L", delta.size) - delta_l.putdata(delta.getdata()) - delta = delta_l - mask = ImageMath.lambda_eval( - lambda args: args["convert"](args["im"] * 255, "1"), - im=delta, - ) - diff_frame.paste(fill, mask=ImageOps.invert(mask)) - else: - bbox = None - previous_im = im_frame - im_frames.append(_Frame(diff_frame or im_frame, bbox, encoderinfo)) - - if len(im_frames) == 1: - if "duration" in im.encoderinfo: - # Since multiple frames will not be written, use the combined duration - im.encoderinfo["duration"] = im_frames[0].encoderinfo["duration"] - return False - - for frame_data in im_frames: - im_frame = frame_data.im - if not frame_data.bbox: - # global header - for s in _get_global_header(im_frame, frame_data.encoderinfo): - fp.write(s) - offset = (0, 0) - else: - # compress difference - if not palette: - frame_data.encoderinfo["include_color_table"] = True - - if frame_data.bbox != (0, 0) + im_frame.size: - im_frame = im_frame.crop(frame_data.bbox) - offset = frame_data.bbox[:2] - _write_frame_data(fp, im_frame, offset, frame_data.encoderinfo) - return True - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, save_all=True) - - -def _save( - im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False -) -> None: - # header - if "palette" in im.encoderinfo or "palette" in im.info: - palette = im.encoderinfo.get("palette", im.info.get("palette")) - else: - palette = None - im.encoderinfo.setdefault("optimize", True) - - if not save_all or not _write_multiple_frames(im, fp, palette): - _write_single_frame(im, fp, palette) - - fp.write(b";") # end of file - - if hasattr(fp, "flush"): - fp.flush() - - -def get_interlace(im: Image.Image) -> int: - interlace = im.encoderinfo.get("interlace", 1) - - # workaround for @PIL153 - if min(im.size) < 16: - interlace = 0 - - return interlace - - -def _write_local_header( - fp: IO[bytes], im: Image.Image, offset: tuple[int, int], flags: int -) -> None: - try: - transparency = im.encoderinfo["transparency"] - except KeyError: - transparency = None - - if "duration" in im.encoderinfo: - duration = int(im.encoderinfo["duration"] / 10) - else: - duration = 0 - - disposal = int(im.encoderinfo.get("disposal", 0)) - - if transparency is not None or duration != 0 or disposal: - packed_flag = 1 if transparency is not None else 0 - packed_flag |= disposal << 2 - - fp.write( - b"!" - + o8(249) # extension intro - + o8(4) # length - + o8(packed_flag) # packed fields - + o16(duration) # duration - + o8(transparency or 0) # transparency index - + o8(0) - ) - - include_color_table = im.encoderinfo.get("include_color_table") - if include_color_table: - palette_bytes = _get_palette_bytes(im) - color_table_size = _get_color_table_size(palette_bytes) - if color_table_size: - flags = flags | 128 # local color table flag - flags = flags | color_table_size - - fp.write( - b"," - + o16(offset[0]) # offset - + o16(offset[1]) - + o16(im.size[0]) # size - + o16(im.size[1]) - + o8(flags) # flags - ) - if include_color_table and color_table_size: - fp.write(_get_header_palette(palette_bytes)) - fp.write(o8(8)) # bits - - -def _save_netpbm(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # Unused by default. - # To use, uncomment the register_save call at the end of the file. - # - # If you need real GIF compression and/or RGB quantization, you - # can use the external NETPBM/PBMPLUS utilities. See comments - # below for information on how to enable this. - tempfile = im._dump() - - try: - with open(filename, "wb") as f: - if im.mode != "RGB": - subprocess.check_call( - ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL - ) - else: - # Pipe ppmquant output into ppmtogif - # "ppmquant 256 %s | ppmtogif > %s" % (tempfile, filename) - quant_cmd = ["ppmquant", "256", tempfile] - togif_cmd = ["ppmtogif"] - quant_proc = subprocess.Popen( - quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL - ) - togif_proc = subprocess.Popen( - togif_cmd, - stdin=quant_proc.stdout, - stdout=f, - stderr=subprocess.DEVNULL, - ) - - # Allow ppmquant to receive SIGPIPE if ppmtogif exits - assert quant_proc.stdout is not None - quant_proc.stdout.close() - - retcode = quant_proc.wait() - if retcode: - raise subprocess.CalledProcessError(retcode, quant_cmd) - - retcode = togif_proc.wait() - if retcode: - raise subprocess.CalledProcessError(retcode, togif_cmd) - finally: - try: - os.unlink(tempfile) - except OSError: - pass - - -# Force optimization so that we can test performance against -# cases where it took lots of memory and time previously. -_FORCE_OPTIMIZE = False - - -def _get_optimize(im: Image.Image, info: dict[str, Any]) -> list[int] | None: - """ - Palette optimization is a potentially expensive operation. - - This function determines if the palette should be optimized using - some heuristics, then returns the list of palette entries in use. - - :param im: Image object - :param info: encoderinfo - :returns: list of indexes of palette entries in use, or None - """ - if im.mode in ("P", "L") and info and info.get("optimize"): - # Potentially expensive operation. - - # The palette saves 3 bytes per color not used, but palette - # lengths are restricted to 3*(2**N) bytes. Max saving would - # be 768 -> 6 bytes if we went all the way down to 2 colors. - # * If we're over 128 colors, we can't save any space. - # * If there aren't any holes, it's not worth collapsing. - # * If we have a 'large' image, the palette is in the noise. - - # create the new palette if not every color is used - optimise = _FORCE_OPTIMIZE or im.mode == "L" - if optimise or im.width * im.height < 512 * 512: - # check which colors are used - used_palette_colors = [] - for i, count in enumerate(im.histogram()): - if count: - used_palette_colors.append(i) - - if optimise or max(used_palette_colors) >= len(used_palette_colors): - return used_palette_colors - - assert im.palette is not None - num_palette_colors = len(im.palette.palette) // Image.getmodebands( - im.palette.mode - ) - current_palette_size = 1 << (num_palette_colors - 1).bit_length() - if ( - # check that the palette would become smaller when saved - len(used_palette_colors) <= current_palette_size // 2 - # check that the palette is not already the smallest possible size - and current_palette_size > 2 - ): - return used_palette_colors - return None - - -def _get_color_table_size(palette_bytes: bytes) -> int: - # calculate the palette size for the header - if not palette_bytes: - return 0 - elif len(palette_bytes) < 9: - return 1 - else: - return math.ceil(math.log(len(palette_bytes) // 3, 2)) - 1 - - -def _get_header_palette(palette_bytes: bytes) -> bytes: - """ - Returns the palette, null padded to the next power of 2 (*3) bytes - suitable for direct inclusion in the GIF header - - :param palette_bytes: Unpadded palette bytes, in RGBRGB form - :returns: Null padded palette - """ - color_table_size = _get_color_table_size(palette_bytes) - - # add the missing amount of bytes - # the palette has to be 2< 0: - palette_bytes += o8(0) * 3 * actual_target_size_diff - return palette_bytes - - -def _get_palette_bytes(im: Image.Image) -> bytes: - """ - Gets the palette for inclusion in the gif header - - :param im: Image object - :returns: Bytes, len<=768 suitable for inclusion in gif header - """ - if not im.palette: - return b"" - - palette = bytes(im.palette.palette) - if im.palette.mode == "RGBA": - palette = b"".join(palette[i * 4 : i * 4 + 3] for i in range(len(palette) // 3)) - return palette - - -def _get_background( - im: Image.Image, - info_background: int | tuple[int, int, int] | tuple[int, int, int, int] | None, -) -> int: - background = 0 - if info_background: - if isinstance(info_background, tuple): - # WebPImagePlugin stores an RGBA value in info["background"] - # So it must be converted to the same format as GifImagePlugin's - # info["background"] - a global color table index - assert im.palette is not None - try: - background = im.palette.getcolor(info_background, im) - except ValueError as e: - if str(e) not in ( - # If all 256 colors are in use, - # then there is no need for the background color - "cannot allocate more than 256 colors", - # Ignore non-opaque WebP background - "cannot add non-opaque RGBA color to RGB palette", - ): - raise - else: - background = info_background - return background - - -def _get_global_header(im: Image.Image, info: dict[str, Any]) -> list[bytes]: - """Return a list of strings representing a GIF header""" - - # Header Block - # https://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp - - version = b"87a" - if im.info.get("version") == b"89a" or ( - info - and ( - "transparency" in info - or info.get("loop") is not None - or info.get("duration") - or info.get("comment") - ) - ): - version = b"89a" - - background = _get_background(im, info.get("background")) - - palette_bytes = _get_palette_bytes(im) - color_table_size = _get_color_table_size(palette_bytes) - - header = [ - b"GIF" # signature - + version # version - + o16(im.size[0]) # canvas width - + o16(im.size[1]), # canvas height - # Logical Screen Descriptor - # size of global color table + global color table flag - o8(color_table_size + 128), # packed fields - # background + reserved/aspect - o8(background) + o8(0), - # Global Color Table - _get_header_palette(palette_bytes), - ] - if info.get("loop") is not None: - header.append( - b"!" - + o8(255) # extension intro - + o8(11) - + b"NETSCAPE2.0" - + o8(3) - + o8(1) - + o16(info["loop"]) # number of loops - + o8(0) - ) - if info.get("comment"): - comment_block = b"!" + o8(254) # extension intro - - comment = info["comment"] - if isinstance(comment, str): - comment = comment.encode() - for i in range(0, len(comment), 255): - subblock = comment[i : i + 255] - comment_block += o8(len(subblock)) + subblock - - comment_block += o8(0) - header.append(comment_block) - return header - - -def _write_frame_data( - fp: IO[bytes], - im_frame: Image.Image, - offset: tuple[int, int], - params: dict[str, Any], -) -> None: - try: - im_frame.encoderinfo = params - - # local image header - _write_local_header(fp, im_frame, offset, 0) - - ImageFile._save( - im_frame, - fp, - [ImageFile._Tile("gif", (0, 0) + im_frame.size, 0, RAWMODE[im_frame.mode])], - ) - - fp.write(b"\0") # end of image data - finally: - del im_frame.encoderinfo - - -# -------------------------------------------------------------------- -# Legacy GIF utilities - - -def getheader( - im: Image.Image, palette: _Palette | None = None, info: dict[str, Any] | None = None -) -> tuple[list[bytes], list[int] | None]: - """ - Legacy Method to get Gif data from image. - - Warning:: May modify image data. - - :param im: Image object - :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo - :returns: tuple of(list of header items, optimized palette) - - """ - if info is None: - info = {} - - used_palette_colors = _get_optimize(im, info) - - if "background" not in info and "background" in im.info: - info["background"] = im.info["background"] - - im_mod = _normalize_palette(im, palette, info) - im.palette = im_mod.palette - im.im = im_mod.im - header = _get_global_header(im, info) - - return header, used_palette_colors - - -def getdata( - im: Image.Image, offset: tuple[int, int] = (0, 0), **params: Any -) -> list[bytes]: - """ - Legacy Method - - Return a list of strings representing this image. - The first string is a local image header, the rest contains - encoded image data. - - To specify duration, add the time in milliseconds, - e.g. ``getdata(im_frame, duration=1000)`` - - :param im: Image object - :param offset: Tuple of (x, y) pixels. Defaults to (0, 0) - :param \\**params: e.g. duration or other encoder info parameters - :returns: List of bytes containing GIF encoded frame data - - """ - from io import BytesIO - - class Collector(BytesIO): - data = [] - - def write(self, data: Buffer) -> int: - self.data.append(data) - return len(data) - - im.load() # make sure raster data is available - - fp = Collector() - - _write_frame_data(fp, im, offset, params) - - return fp.data - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(GifImageFile.format, GifImageFile, _accept) -Image.register_save(GifImageFile.format, _save) -Image.register_save_all(GifImageFile.format, _save_all) -Image.register_extension(GifImageFile.format, ".gif") -Image.register_mime(GifImageFile.format, "image/gif") - -# -# Uncomment the following line if you wish to use NETPBM/PBMPLUS -# instead of the built-in "uncompressed" GIF encoder - -# Image.register_save(GifImageFile.format, _save_netpbm) diff --git a/.venv/lib/python3.10/site-packages/PIL/GimpGradientFile.py b/.venv/lib/python3.10/site-packages/PIL/GimpGradientFile.py deleted file mode 100644 index ec62f8e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/GimpGradientFile.py +++ /dev/null @@ -1,149 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read (and render) GIMP gradient files -# -# History: -# 97-08-23 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -""" -Stuff to translate curve segments to palette values (derived from -the corresponding code in GIMP, written by Federico Mena Quintero. -See the GIMP distribution for more information.) -""" -from __future__ import annotations - -from math import log, pi, sin, sqrt -from typing import IO, Callable - -from ._binary import o8 - -EPSILON = 1e-10 -"""""" # Enable auto-doc for data member - - -def linear(middle: float, pos: float) -> float: - if pos <= middle: - if middle < EPSILON: - return 0.0 - else: - return 0.5 * pos / middle - else: - pos = pos - middle - middle = 1.0 - middle - if middle < EPSILON: - return 1.0 - else: - return 0.5 + 0.5 * pos / middle - - -def curved(middle: float, pos: float) -> float: - return pos ** (log(0.5) / log(max(middle, EPSILON))) - - -def sine(middle: float, pos: float) -> float: - return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 - - -def sphere_increasing(middle: float, pos: float) -> float: - return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) - - -def sphere_decreasing(middle: float, pos: float) -> float: - return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) - - -SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] -"""""" # Enable auto-doc for data member - - -class GradientFile: - gradient: ( - list[ - tuple[ - float, - float, - float, - list[float], - list[float], - Callable[[float, float], float], - ] - ] - | None - ) = None - - def getpalette(self, entries: int = 256) -> tuple[bytes, str]: - assert self.gradient is not None - palette = [] - - ix = 0 - x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] - - for i in range(entries): - x = i / (entries - 1) - - while x1 < x: - ix += 1 - x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] - - w = x1 - x0 - - if w < EPSILON: - scale = segment(0.5, 0.5) - else: - scale = segment((xm - x0) / w, (x - x0) / w) - - # expand to RGBA - r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) - g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) - b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) - a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) - - # add to palette - palette.append(r + g + b + a) - - return b"".join(palette), "RGBA" - - -class GimpGradientFile(GradientFile): - """File handler for GIMP's gradient format.""" - - def __init__(self, fp: IO[bytes]) -> None: - if not fp.readline().startswith(b"GIMP Gradient"): - msg = "not a GIMP gradient file" - raise SyntaxError(msg) - - line = fp.readline() - - # GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files do - if line.startswith(b"Name: "): - line = fp.readline().strip() - - count = int(line) - - self.gradient = [] - - for i in range(count): - s = fp.readline().split() - w = [float(x) for x in s[:11]] - - x0, x1 = w[0], w[2] - xm = w[1] - rgb0 = w[3:7] - rgb1 = w[7:11] - - segment = SEGMENTS[int(s[11])] - cspace = int(s[12]) - - if cspace != 0: - msg = "cannot handle HSV colour space" - raise OSError(msg) - - self.gradient.append((x0, x1, xm, rgb0, rgb1, segment)) diff --git a/.venv/lib/python3.10/site-packages/PIL/GimpPaletteFile.py b/.venv/lib/python3.10/site-packages/PIL/GimpPaletteFile.py deleted file mode 100644 index 379ffd7..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/GimpPaletteFile.py +++ /dev/null @@ -1,72 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read GIMP palette files -# -# History: -# 1997-08-23 fl Created -# 2004-09-07 fl Support GIMP 2.0 palette files. -# -# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. -# Copyright (c) Fredrik Lundh 1997-2004. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re -from io import BytesIO -from typing import IO - - -class GimpPaletteFile: - """File handler for GIMP's palette format.""" - - rawmode = "RGB" - - def _read(self, fp: IO[bytes], limit: bool = True) -> None: - if not fp.readline().startswith(b"GIMP Palette"): - msg = "not a GIMP palette file" - raise SyntaxError(msg) - - palette: list[int] = [] - i = 0 - while True: - if limit and i == 256 + 3: - break - - i += 1 - s = fp.readline() - if not s: - break - - # skip fields and comment lines - if re.match(rb"\w+:|#", s): - continue - if limit and len(s) > 100: - msg = "bad palette file" - raise SyntaxError(msg) - - v = s.split(maxsplit=3) - if len(v) < 3: - msg = "bad palette entry" - raise ValueError(msg) - - palette += (int(v[i]) for i in range(3)) - if limit and len(palette) == 768: - break - - self.palette = bytes(palette) - - def __init__(self, fp: IO[bytes]) -> None: - self._read(fp) - - @classmethod - def frombytes(cls, data: bytes) -> GimpPaletteFile: - self = cls.__new__(cls) - self._read(BytesIO(data), False) - return self - - def getpalette(self) -> tuple[bytes, str]: - return self.palette, self.rawmode diff --git a/.venv/lib/python3.10/site-packages/PIL/GribStubImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/GribStubImagePlugin.py deleted file mode 100644 index 439fc5a..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/GribStubImagePlugin.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# GRIB stub adapter -# -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -from typing import IO - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific GRIB image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"GRIB") and prefix[7] == 1 - - -class GribStubImageFile(ImageFile.StubImageFile): - format = "GRIB" - format_description = "GRIB" - - def _open(self) -> None: - if not _accept(self.fp.read(8)): - msg = "Not a GRIB file" - raise SyntaxError(msg) - - self.fp.seek(-8, os.SEEK_CUR) - - # make something up - self._mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self) -> ImageFile.StubHandler | None: - return _handler - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "GRIB save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) -Image.register_save(GribStubImageFile.format, _save) - -Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/.venv/lib/python3.10/site-packages/PIL/Hdf5StubImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/Hdf5StubImagePlugin.py deleted file mode 100644 index 76e640f..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/Hdf5StubImagePlugin.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# HDF5 stub adapter -# -# Copyright (c) 2000-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -from typing import IO - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific HDF5 image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"\x89HDF\r\n\x1a\n") - - -class HDF5StubImageFile(ImageFile.StubImageFile): - format = "HDF5" - format_description = "HDF5" - - def _open(self) -> None: - if not _accept(self.fp.read(8)): - msg = "Not an HDF file" - raise SyntaxError(msg) - - self.fp.seek(-8, os.SEEK_CUR) - - # make something up - self._mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self) -> ImageFile.StubHandler | None: - return _handler - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "HDF5 save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) -Image.register_save(HDF5StubImageFile.format, _save) - -Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/.venv/lib/python3.10/site-packages/PIL/IcnsImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/IcnsImagePlugin.py deleted file mode 100644 index 5a88429..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/IcnsImagePlugin.py +++ /dev/null @@ -1,411 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# macOS icns file decoder, based on icns.py by Bob Ippolito. -# -# history: -# 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. -# 2020-04-04 Allow saving on all operating systems. -# -# Copyright (c) 2004 by Bob Ippolito. -# Copyright (c) 2004 by Secret Labs. -# Copyright (c) 2004 by Fredrik Lundh. -# Copyright (c) 2014 by Alastair Houghton. -# Copyright (c) 2020 by Pan Jing. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import struct -import sys -from typing import IO - -from . import Image, ImageFile, PngImagePlugin, features -from ._deprecate import deprecate - -enable_jpeg2k = features.check_codec("jpg_2000") -if enable_jpeg2k: - from . import Jpeg2KImagePlugin - -MAGIC = b"icns" -HEADERSIZE = 8 - - -def nextheader(fobj: IO[bytes]) -> tuple[bytes, int]: - return struct.unpack(">4sI", fobj.read(HEADERSIZE)) - - -def read_32t( - fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] -) -> dict[str, Image.Image]: - # The 128x128 icon seems to have an extra header for some reason. - (start, length) = start_length - fobj.seek(start) - sig = fobj.read(4) - if sig != b"\x00\x00\x00\x00": - msg = "Unknown signature, expecting 0x00000000" - raise SyntaxError(msg) - return read_32(fobj, (start + 4, length - 4), size) - - -def read_32( - fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] -) -> dict[str, Image.Image]: - """ - Read a 32bit RGB icon resource. Seems to be either uncompressed or - an RLE packbits-like scheme. - """ - (start, length) = start_length - fobj.seek(start) - pixel_size = (size[0] * size[2], size[1] * size[2]) - sizesq = pixel_size[0] * pixel_size[1] - if length == sizesq * 3: - # uncompressed ("RGBRGBGB") - indata = fobj.read(length) - im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) - else: - # decode image - im = Image.new("RGB", pixel_size, None) - for band_ix in range(3): - data = [] - bytesleft = sizesq - while bytesleft > 0: - byte = fobj.read(1) - if not byte: - break - byte_int = byte[0] - if byte_int & 0x80: - blocksize = byte_int - 125 - byte = fobj.read(1) - for i in range(blocksize): - data.append(byte) - else: - blocksize = byte_int + 1 - data.append(fobj.read(blocksize)) - bytesleft -= blocksize - if bytesleft <= 0: - break - if bytesleft != 0: - msg = f"Error reading channel [{repr(bytesleft)} left]" - raise SyntaxError(msg) - band = Image.frombuffer("L", pixel_size, b"".join(data), "raw", "L", 0, 1) - im.im.putband(band.im, band_ix) - return {"RGB": im} - - -def read_mk( - fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] -) -> dict[str, Image.Image]: - # Alpha masks seem to be uncompressed - start = start_length[0] - fobj.seek(start) - pixel_size = (size[0] * size[2], size[1] * size[2]) - sizesq = pixel_size[0] * pixel_size[1] - band = Image.frombuffer("L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1) - return {"A": band} - - -def read_png_or_jpeg2000( - fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] -) -> dict[str, Image.Image]: - (start, length) = start_length - fobj.seek(start) - sig = fobj.read(12) - - im: Image.Image - if sig.startswith(b"\x89PNG\x0d\x0a\x1a\x0a"): - fobj.seek(start) - im = PngImagePlugin.PngImageFile(fobj) - Image._decompression_bomb_check(im.size) - return {"RGBA": im} - elif ( - sig.startswith((b"\xff\x4f\xff\x51", b"\x0d\x0a\x87\x0a")) - or sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" - ): - if not enable_jpeg2k: - msg = ( - "Unsupported icon subimage format (rebuild PIL " - "with JPEG 2000 support to fix this)" - ) - raise ValueError(msg) - # j2k, jpc or j2c - fobj.seek(start) - jp2kstream = fobj.read(length) - f = io.BytesIO(jp2kstream) - im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) - Image._decompression_bomb_check(im.size) - if im.mode != "RGBA": - im = im.convert("RGBA") - return {"RGBA": im} - else: - msg = "Unsupported icon subimage format" - raise ValueError(msg) - - -class IcnsFile: - SIZES = { - (512, 512, 2): [(b"ic10", read_png_or_jpeg2000)], - (512, 512, 1): [(b"ic09", read_png_or_jpeg2000)], - (256, 256, 2): [(b"ic14", read_png_or_jpeg2000)], - (256, 256, 1): [(b"ic08", read_png_or_jpeg2000)], - (128, 128, 2): [(b"ic13", read_png_or_jpeg2000)], - (128, 128, 1): [ - (b"ic07", read_png_or_jpeg2000), - (b"it32", read_32t), - (b"t8mk", read_mk), - ], - (64, 64, 1): [(b"icp6", read_png_or_jpeg2000)], - (32, 32, 2): [(b"ic12", read_png_or_jpeg2000)], - (48, 48, 1): [(b"ih32", read_32), (b"h8mk", read_mk)], - (32, 32, 1): [ - (b"icp5", read_png_or_jpeg2000), - (b"il32", read_32), - (b"l8mk", read_mk), - ], - (16, 16, 2): [(b"ic11", read_png_or_jpeg2000)], - (16, 16, 1): [ - (b"icp4", read_png_or_jpeg2000), - (b"is32", read_32), - (b"s8mk", read_mk), - ], - } - - def __init__(self, fobj: IO[bytes]) -> None: - """ - fobj is a file-like object as an icns resource - """ - # signature : (start, length) - self.dct = {} - self.fobj = fobj - sig, filesize = nextheader(fobj) - if not _accept(sig): - msg = "not an icns file" - raise SyntaxError(msg) - i = HEADERSIZE - while i < filesize: - sig, blocksize = nextheader(fobj) - if blocksize <= 0: - msg = "invalid block header" - raise SyntaxError(msg) - i += HEADERSIZE - blocksize -= HEADERSIZE - self.dct[sig] = (i, blocksize) - fobj.seek(blocksize, io.SEEK_CUR) - i += blocksize - - def itersizes(self) -> list[tuple[int, int, int]]: - sizes = [] - for size, fmts in self.SIZES.items(): - for fmt, reader in fmts: - if fmt in self.dct: - sizes.append(size) - break - return sizes - - def bestsize(self) -> tuple[int, int, int]: - sizes = self.itersizes() - if not sizes: - msg = "No 32bit icon resources found" - raise SyntaxError(msg) - return max(sizes) - - def dataforsize(self, size: tuple[int, int, int]) -> dict[str, Image.Image]: - """ - Get an icon resource as {channel: array}. Note that - the arrays are bottom-up like windows bitmaps and will likely - need to be flipped or transposed in some way. - """ - dct = {} - for code, reader in self.SIZES[size]: - desc = self.dct.get(code) - if desc is not None: - dct.update(reader(self.fobj, desc, size)) - return dct - - def getimage( - self, size: tuple[int, int] | tuple[int, int, int] | None = None - ) -> Image.Image: - if size is None: - size = self.bestsize() - elif len(size) == 2: - size = (size[0], size[1], 1) - channels = self.dataforsize(size) - - im = channels.get("RGBA") - if im: - return im - - im = channels["RGB"].copy() - try: - im.putalpha(channels["A"]) - except KeyError: - pass - return im - - -## -# Image plugin for Mac OS icons. - - -class IcnsImageFile(ImageFile.ImageFile): - """ - PIL image support for Mac OS .icns files. - Chooses the best resolution, but will possibly load - a different size image if you mutate the size attribute - before calling 'load'. - - The info dictionary has a key 'sizes' that is a list - of sizes that the icns file has. - """ - - format = "ICNS" - format_description = "Mac OS icns resource" - - def _open(self) -> None: - self.icns = IcnsFile(self.fp) - self._mode = "RGBA" - self.info["sizes"] = self.icns.itersizes() - self.best_size = self.icns.bestsize() - self.size = ( - self.best_size[0] * self.best_size[2], - self.best_size[1] * self.best_size[2], - ) - - @property # type: ignore[override] - def size(self) -> tuple[int, int] | tuple[int, int, int]: - return self._size - - @size.setter - def size(self, value: tuple[int, int] | tuple[int, int, int]) -> None: - if len(value) == 3: - deprecate("Setting size to (width, height, scale)", 12, "load(scale)") - if value in self.info["sizes"]: - self._size = value # type: ignore[assignment] - return - else: - # Check that a matching size exists, - # or that there is a scale that would create a size that matches - for size in self.info["sizes"]: - simple_size = size[0] * size[2], size[1] * size[2] - scale = simple_size[0] // value[0] - if simple_size[1] / value[1] == scale: - self._size = value - return - msg = "This is not one of the allowed sizes of this image" - raise ValueError(msg) - - def load(self, scale: int | None = None) -> Image.core.PixelAccess | None: - if scale is not None or len(self.size) == 3: - if scale is None and len(self.size) == 3: - scale = self.size[2] - assert scale is not None - width, height = self.size[:2] - self.size = width * scale, height * scale - self.best_size = width, height, scale - - px = Image.Image.load(self) - if self._im is not None and self.im.size == self.size: - # Already loaded - return px - self.load_prepare() - # This is likely NOT the best way to do it, but whatever. - im = self.icns.getimage(self.best_size) - - # If this is a PNG or JPEG 2000, it won't be loaded yet - px = im.load() - - self.im = im.im - self._mode = im.mode - self.size = im.size - - return px - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - """ - Saves the image as a series of PNG files, - that are then combined into a .icns file. - """ - if hasattr(fp, "flush"): - fp.flush() - - sizes = { - b"ic07": 128, - b"ic08": 256, - b"ic09": 512, - b"ic10": 1024, - b"ic11": 32, - b"ic12": 64, - b"ic13": 256, - b"ic14": 512, - } - provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} - size_streams = {} - for size in set(sizes.values()): - image = ( - provided_images[size] - if size in provided_images - else im.resize((size, size)) - ) - - temp = io.BytesIO() - image.save(temp, "png") - size_streams[size] = temp.getvalue() - - entries = [] - for type, size in sizes.items(): - stream = size_streams[size] - entries.append((type, HEADERSIZE + len(stream), stream)) - - # Header - fp.write(MAGIC) - file_length = HEADERSIZE # Header - file_length += HEADERSIZE + 8 * len(entries) # TOC - file_length += sum(entry[1] for entry in entries) - fp.write(struct.pack(">i", file_length)) - - # TOC - fp.write(b"TOC ") - fp.write(struct.pack(">i", HEADERSIZE + len(entries) * HEADERSIZE)) - for entry in entries: - fp.write(entry[0]) - fp.write(struct.pack(">i", entry[1])) - - # Data - for entry in entries: - fp.write(entry[0]) - fp.write(struct.pack(">i", entry[1])) - fp.write(entry[2]) - - if hasattr(fp, "flush"): - fp.flush() - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(MAGIC) - - -Image.register_open(IcnsImageFile.format, IcnsImageFile, _accept) -Image.register_extension(IcnsImageFile.format, ".icns") - -Image.register_save(IcnsImageFile.format, _save) -Image.register_mime(IcnsImageFile.format, "image/icns") - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 IcnsImagePlugin.py [file]") - sys.exit() - - with open(sys.argv[1], "rb") as fp: - imf = IcnsImageFile(fp) - for size in imf.info["sizes"]: - width, height, scale = imf.size = size - imf.save(f"out-{width}-{height}-{scale}.png") - with Image.open(sys.argv[1]) as im: - im.save("out.png") - if sys.platform == "windows": - os.startfile("out.png") diff --git a/.venv/lib/python3.10/site-packages/PIL/IcoImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/IcoImagePlugin.py deleted file mode 100644 index 55c57f2..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/IcoImagePlugin.py +++ /dev/null @@ -1,381 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Windows Icon support for PIL -# -# History: -# 96-05-27 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - -# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis -# . -# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki -# -# Icon format references: -# * https://en.wikipedia.org/wiki/ICO_(file_format) -# * https://msdn.microsoft.com/en-us/library/ms997538.aspx -from __future__ import annotations - -import warnings -from io import BytesIO -from math import ceil, log -from typing import IO, NamedTuple - -from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o16le as o16 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -_MAGIC = b"\0\0\1\0" - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - fp.write(_MAGIC) # (2+2) - bmp = im.encoderinfo.get("bitmap_format") == "bmp" - sizes = im.encoderinfo.get( - "sizes", - [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], - ) - frames = [] - provided_ims = [im] + im.encoderinfo.get("append_images", []) - width, height = im.size - for size in sorted(set(sizes)): - if size[0] > width or size[1] > height or size[0] > 256 or size[1] > 256: - continue - - for provided_im in provided_ims: - if provided_im.size != size: - continue - frames.append(provided_im) - if bmp: - bits = BmpImagePlugin.SAVE[provided_im.mode][1] - bits_used = [bits] - for other_im in provided_ims: - if other_im.size != size: - continue - bits = BmpImagePlugin.SAVE[other_im.mode][1] - if bits not in bits_used: - # Another image has been supplied for this size - # with a different bit depth - frames.append(other_im) - bits_used.append(bits) - break - else: - # TODO: invent a more convenient method for proportional scalings - frame = provided_im.copy() - frame.thumbnail(size, Image.Resampling.LANCZOS, reducing_gap=None) - frames.append(frame) - fp.write(o16(len(frames))) # idCount(2) - offset = fp.tell() + len(frames) * 16 - for frame in frames: - width, height = frame.size - # 0 means 256 - fp.write(o8(width if width < 256 else 0)) # bWidth(1) - fp.write(o8(height if height < 256 else 0)) # bHeight(1) - - bits, colors = BmpImagePlugin.SAVE[frame.mode][1:] if bmp else (32, 0) - fp.write(o8(colors)) # bColorCount(1) - fp.write(b"\0") # bReserved(1) - fp.write(b"\0\0") # wPlanes(2) - fp.write(o16(bits)) # wBitCount(2) - - image_io = BytesIO() - if bmp: - frame.save(image_io, "dib") - - if bits != 32: - and_mask = Image.new("1", size) - ImageFile._save( - and_mask, - image_io, - [ImageFile._Tile("raw", (0, 0) + size, 0, ("1", 0, -1))], - ) - else: - frame.save(image_io, "png") - image_io.seek(0) - image_bytes = image_io.read() - if bmp: - image_bytes = image_bytes[:8] + o32(height * 2) + image_bytes[12:] - bytes_len = len(image_bytes) - fp.write(o32(bytes_len)) # dwBytesInRes(4) - fp.write(o32(offset)) # dwImageOffset(4) - current = fp.tell() - fp.seek(offset) - fp.write(image_bytes) - offset = offset + bytes_len - fp.seek(current) - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(_MAGIC) - - -class IconHeader(NamedTuple): - width: int - height: int - nb_color: int - reserved: int - planes: int - bpp: int - size: int - offset: int - dim: tuple[int, int] - square: int - color_depth: int - - -class IcoFile: - def __init__(self, buf: IO[bytes]) -> None: - """ - Parse image from file-like object containing ico file data - """ - - # check magic - s = buf.read(6) - if not _accept(s): - msg = "not an ICO file" - raise SyntaxError(msg) - - self.buf = buf - self.entry = [] - - # Number of items in file - self.nb_items = i16(s, 4) - - # Get headers for each item - for i in range(self.nb_items): - s = buf.read(16) - - # See Wikipedia - width = s[0] or 256 - height = s[1] or 256 - - # No. of colors in image (0 if >=8bpp) - nb_color = s[2] - bpp = i16(s, 6) - icon_header = IconHeader( - width=width, - height=height, - nb_color=nb_color, - reserved=s[3], - planes=i16(s, 4), - bpp=i16(s, 6), - size=i32(s, 8), - offset=i32(s, 12), - dim=(width, height), - square=width * height, - # See Wikipedia notes about color depth. - # We need this just to differ images with equal sizes - color_depth=bpp or (nb_color != 0 and ceil(log(nb_color, 2))) or 256, - ) - - self.entry.append(icon_header) - - self.entry = sorted(self.entry, key=lambda x: x.color_depth) - # ICO images are usually squares - self.entry = sorted(self.entry, key=lambda x: x.square, reverse=True) - - def sizes(self) -> set[tuple[int, int]]: - """ - Get a set of all available icon sizes and color depths. - """ - return {(h.width, h.height) for h in self.entry} - - def getentryindex(self, size: tuple[int, int], bpp: int | bool = False) -> int: - for i, h in enumerate(self.entry): - if size == h.dim and (bpp is False or bpp == h.color_depth): - return i - return 0 - - def getimage(self, size: tuple[int, int], bpp: int | bool = False) -> Image.Image: - """ - Get an image from the icon - """ - return self.frame(self.getentryindex(size, bpp)) - - def frame(self, idx: int) -> Image.Image: - """ - Get an image from frame idx - """ - - header = self.entry[idx] - - self.buf.seek(header.offset) - data = self.buf.read(8) - self.buf.seek(header.offset) - - im: Image.Image - if data[:8] == PngImagePlugin._MAGIC: - # png frame - im = PngImagePlugin.PngImageFile(self.buf) - Image._decompression_bomb_check(im.size) - else: - # XOR + AND mask bmp frame - im = BmpImagePlugin.DibImageFile(self.buf) - Image._decompression_bomb_check(im.size) - - # change tile dimension to only encompass XOR image - im._size = (im.size[0], int(im.size[1] / 2)) - d, e, o, a = im.tile[0] - im.tile[0] = ImageFile._Tile(d, (0, 0) + im.size, o, a) - - # figure out where AND mask image starts - if header.bpp == 32: - # 32-bit color depth icon image allows semitransparent areas - # PIL's DIB format ignores transparency bits, recover them. - # The DIB is packed in BGRX byte order where X is the alpha - # channel. - - # Back up to start of bmp data - self.buf.seek(o) - # extract every 4th byte (eg. 3,7,11,15,...) - alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] - - # convert to an 8bpp grayscale image - try: - mask = Image.frombuffer( - "L", # 8bpp - im.size, # (w, h) - alpha_bytes, # source chars - "raw", # raw decoder - ("L", 0, -1), # 8bpp inverted, unpadded, reversed - ) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - mask = None - else: - raise - else: - # get AND image from end of bitmap - w = im.size[0] - if (w % 32) > 0: - # bitmap row data is aligned to word boundaries - w += 32 - (im.size[0] % 32) - - # the total mask data is - # padded row size * height / bits per char - - total_bytes = int((w * im.size[1]) / 8) - and_mask_offset = header.offset + header.size - total_bytes - - self.buf.seek(and_mask_offset) - mask_data = self.buf.read(total_bytes) - - # convert raw data to image - try: - mask = Image.frombuffer( - "1", # 1 bpp - im.size, # (w, h) - mask_data, # source chars - "raw", # raw decoder - ("1;I", int(w / 8), -1), # 1bpp inverted, padded, reversed - ) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - mask = None - else: - raise - - # now we have two images, im is XOR image and mask is AND image - - # apply mask image as alpha channel - if mask: - im = im.convert("RGBA") - im.putalpha(mask) - - return im - - -## -# Image plugin for Windows Icon files. - - -class IcoImageFile(ImageFile.ImageFile): - """ - PIL read-only image support for Microsoft Windows .ico files. - - By default the largest resolution image in the file will be loaded. This - can be changed by altering the 'size' attribute before calling 'load'. - - The info dictionary has a key 'sizes' that is a list of the sizes available - in the icon file. - - Handles classic, XP and Vista icon formats. - - When saving, PNG compression is used. Support for this was only added in - Windows Vista. If you are unable to view the icon in Windows, convert the - image to "RGBA" mode before saving. - - This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis - . - https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki - """ - - format = "ICO" - format_description = "Windows Icon" - - def _open(self) -> None: - self.ico = IcoFile(self.fp) - self.info["sizes"] = self.ico.sizes() - self.size = self.ico.entry[0].dim - self.load() - - @property - def size(self) -> tuple[int, int]: - return self._size - - @size.setter - def size(self, value: tuple[int, int]) -> None: - if value not in self.info["sizes"]: - msg = "This is not one of the allowed sizes of this image" - raise ValueError(msg) - self._size = value - - def load(self) -> Image.core.PixelAccess | None: - if self._im is not None and self.im.size == self.size: - # Already loaded - return Image.Image.load(self) - im = self.ico.getimage(self.size) - # if tile is PNG, it won't really be loaded yet - im.load() - self.im = im.im - self._mode = im.mode - if im.palette: - self.palette = im.palette - if im.size != self.size: - warnings.warn("Image was not the expected size") - - index = self.ico.getentryindex(self.size) - sizes = list(self.info["sizes"]) - sizes[index] = im.size - self.info["sizes"] = set(sizes) - - self.size = im.size - return None - - def load_seek(self, pos: int) -> None: - # Flag the ImageFile.Parser so that it - # just does all the decode at the end. - pass - - -# -# -------------------------------------------------------------------- - - -Image.register_open(IcoImageFile.format, IcoImageFile, _accept) -Image.register_save(IcoImageFile.format, _save) -Image.register_extension(IcoImageFile.format, ".ico") - -Image.register_mime(IcoImageFile.format, "image/x-icon") diff --git a/.venv/lib/python3.10/site-packages/PIL/ImImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/ImImagePlugin.py deleted file mode 100644 index 71b9996..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImImagePlugin.py +++ /dev/null @@ -1,389 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IFUNC IM file handling for PIL -# -# history: -# 1995-09-01 fl Created. -# 1997-01-03 fl Save palette images -# 1997-01-08 fl Added sequence support -# 1997-01-23 fl Added P and RGB save support -# 1997-05-31 fl Read floating point images -# 1997-06-22 fl Save floating point images -# 1997-08-27 fl Read and save 1-bit images -# 1998-06-25 fl Added support for RGB+LUT images -# 1998-07-02 fl Added support for YCC images -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 1998-12-29 fl Added I;16 support -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) -# 2003-09-26 fl Added LA/PA support -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2001 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -import re -from typing import IO, Any - -from . import Image, ImageFile, ImagePalette -from ._util import DeferredError - -# -------------------------------------------------------------------- -# Standard tags - -COMMENT = "Comment" -DATE = "Date" -EQUIPMENT = "Digitalization equipment" -FRAMES = "File size (no of images)" -LUT = "Lut" -NAME = "Name" -SCALE = "Scale (x,y)" -SIZE = "Image size (x*y)" -MODE = "Image type" - -TAGS = { - COMMENT: 0, - DATE: 0, - EQUIPMENT: 0, - FRAMES: 0, - LUT: 0, - NAME: 0, - SCALE: 0, - SIZE: 0, - MODE: 0, -} - -OPEN = { - # ifunc93/p3cfunc formats - "0 1 image": ("1", "1"), - "L 1 image": ("1", "1"), - "Greyscale image": ("L", "L"), - "Grayscale image": ("L", "L"), - "RGB image": ("RGB", "RGB;L"), - "RLB image": ("RGB", "RLB"), - "RYB image": ("RGB", "RLB"), - "B1 image": ("1", "1"), - "B2 image": ("P", "P;2"), - "B4 image": ("P", "P;4"), - "X 24 image": ("RGB", "RGB"), - "L 32 S image": ("I", "I;32"), - "L 32 F image": ("F", "F;32"), - # old p3cfunc formats - "RGB3 image": ("RGB", "RGB;T"), - "RYB3 image": ("RGB", "RYB;T"), - # extensions - "LA image": ("LA", "LA;L"), - "PA image": ("LA", "PA;L"), - "RGBA image": ("RGBA", "RGBA;L"), - "RGBX image": ("RGB", "RGBX;L"), - "CMYK image": ("CMYK", "CMYK;L"), - "YCC image": ("YCbCr", "YCbCr;L"), -} - -# ifunc95 extensions -for i in ["8", "8S", "16", "16S", "32", "32F"]: - OPEN[f"L {i} image"] = ("F", f"F;{i}") - OPEN[f"L*{i} image"] = ("F", f"F;{i}") -for i in ["16", "16L", "16B"]: - OPEN[f"L {i} image"] = (f"I;{i}", f"I;{i}") - OPEN[f"L*{i} image"] = (f"I;{i}", f"I;{i}") -for i in ["32S"]: - OPEN[f"L {i} image"] = ("I", f"I;{i}") - OPEN[f"L*{i} image"] = ("I", f"I;{i}") -for j in range(2, 33): - OPEN[f"L*{j} image"] = ("F", f"F;{j}") - - -# -------------------------------------------------------------------- -# Read IM directory - -split = re.compile(rb"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") - - -def number(s: Any) -> float: - try: - return int(s) - except ValueError: - return float(s) - - -## -# Image plugin for the IFUNC IM file format. - - -class ImImageFile(ImageFile.ImageFile): - format = "IM" - format_description = "IFUNC Image Memory" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - # Quick rejection: if there's not an LF among the first - # 100 bytes, this is (probably) not a text header. - - if b"\n" not in self.fp.read(100): - msg = "not an IM file" - raise SyntaxError(msg) - self.fp.seek(0) - - n = 0 - - # Default values - self.info[MODE] = "L" - self.info[SIZE] = (512, 512) - self.info[FRAMES] = 1 - - self.rawmode = "L" - - while True: - s = self.fp.read(1) - - # Some versions of IFUNC uses \n\r instead of \r\n... - if s == b"\r": - continue - - if not s or s == b"\0" or s == b"\x1a": - break - - # FIXME: this may read whole file if not a text file - s = s + self.fp.readline() - - if len(s) > 100: - msg = "not an IM file" - raise SyntaxError(msg) - - if s.endswith(b"\r\n"): - s = s[:-2] - elif s.endswith(b"\n"): - s = s[:-1] - - try: - m = split.match(s) - except re.error as e: - msg = "not an IM file" - raise SyntaxError(msg) from e - - if m: - k, v = m.group(1, 2) - - # Don't know if this is the correct encoding, - # but a decent guess (I guess) - k = k.decode("latin-1", "replace") - v = v.decode("latin-1", "replace") - - # Convert value as appropriate - if k in [FRAMES, SCALE, SIZE]: - v = v.replace("*", ",") - v = tuple(map(number, v.split(","))) - if len(v) == 1: - v = v[0] - elif k == MODE and v in OPEN: - v, self.rawmode = OPEN[v] - - # Add to dictionary. Note that COMMENT tags are - # combined into a list of strings. - if k == COMMENT: - if k in self.info: - self.info[k].append(v) - else: - self.info[k] = [v] - else: - self.info[k] = v - - if k in TAGS: - n += 1 - - else: - msg = f"Syntax error in IM header: {s.decode('ascii', 'replace')}" - raise SyntaxError(msg) - - if not n: - msg = "Not an IM file" - raise SyntaxError(msg) - - # Basic attributes - self._size = self.info[SIZE] - self._mode = self.info[MODE] - - # Skip forward to start of image data - while s and not s.startswith(b"\x1a"): - s = self.fp.read(1) - if not s: - msg = "File truncated" - raise SyntaxError(msg) - - if LUT in self.info: - # convert lookup table to palette or lut attribute - palette = self.fp.read(768) - greyscale = 1 # greyscale palette - linear = 1 # linear greyscale palette - for i in range(256): - if palette[i] == palette[i + 256] == palette[i + 512]: - if palette[i] != i: - linear = 0 - else: - greyscale = 0 - if self.mode in ["L", "LA", "P", "PA"]: - if greyscale: - if not linear: - self.lut = list(palette[:256]) - else: - if self.mode in ["L", "P"]: - self._mode = self.rawmode = "P" - elif self.mode in ["LA", "PA"]: - self._mode = "PA" - self.rawmode = "PA;L" - self.palette = ImagePalette.raw("RGB;L", palette) - elif self.mode == "RGB": - if not greyscale or not linear: - self.lut = list(palette) - - self.frame = 0 - - self.__offset = offs = self.fp.tell() - - self._fp = self.fp # FIXME: hack - - if self.rawmode.startswith("F;"): - # ifunc95 formats - try: - # use bit decoder (if necessary) - bits = int(self.rawmode[2:]) - if bits not in [8, 16, 32]: - self.tile = [ - ImageFile._Tile( - "bit", (0, 0) + self.size, offs, (bits, 8, 3, 0, -1) - ) - ] - return - except ValueError: - pass - - if self.rawmode in ["RGB;T", "RYB;T"]: - # Old LabEye/3PC files. Would be very surprised if anyone - # ever stumbled upon such a file ;-) - size = self.size[0] * self.size[1] - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offs, ("G", 0, -1)), - ImageFile._Tile("raw", (0, 0) + self.size, offs + size, ("R", 0, -1)), - ImageFile._Tile( - "raw", (0, 0) + self.size, offs + 2 * size, ("B", 0, -1) - ), - ] - else: - # LabEye/IFUNC files - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1)) - ] - - @property - def n_frames(self) -> int: - return self.info[FRAMES] - - @property - def is_animated(self) -> bool: - return self.info[FRAMES] > 1 - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if isinstance(self._fp, DeferredError): - raise self._fp.ex - - self.frame = frame - - if self.mode == "1": - bits = 1 - else: - bits = 8 * len(self.mode) - - size = ((self.size[0] * bits + 7) // 8) * self.size[1] - offs = self.__offset + frame * size - - self.fp = self._fp - - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1)) - ] - - def tell(self) -> int: - return self.frame - - -# -# -------------------------------------------------------------------- -# Save IM files - - -SAVE = { - # mode: (im type, raw mode) - "1": ("0 1", "1"), - "L": ("Greyscale", "L"), - "LA": ("LA", "LA;L"), - "P": ("Greyscale", "P"), - "PA": ("LA", "PA;L"), - "I": ("L 32S", "I;32S"), - "I;16": ("L 16", "I;16"), - "I;16L": ("L 16L", "I;16L"), - "I;16B": ("L 16B", "I;16B"), - "F": ("L 32F", "F;32F"), - "RGB": ("RGB", "RGB;L"), - "RGBA": ("RGBA", "RGBA;L"), - "RGBX": ("RGBX", "RGBX;L"), - "CMYK": ("CMYK", "CMYK;L"), - "YCbCr": ("YCC", "YCbCr;L"), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - image_type, rawmode = SAVE[im.mode] - except KeyError as e: - msg = f"Cannot save {im.mode} images as IM" - raise ValueError(msg) from e - - frames = im.encoderinfo.get("frames", 1) - - fp.write(f"Image type: {image_type} image\r\n".encode("ascii")) - if filename: - # Each line must be 100 characters or less, - # or: SyntaxError("not an IM file") - # 8 characters are used for "Name: " and "\r\n" - # Keep just the filename, ditch the potentially overlong path - if isinstance(filename, bytes): - filename = filename.decode("ascii") - name, ext = os.path.splitext(os.path.basename(filename)) - name = "".join([name[: 92 - len(ext)], ext]) - - fp.write(f"Name: {name}\r\n".encode("ascii")) - fp.write(f"Image size (x*y): {im.size[0]}*{im.size[1]}\r\n".encode("ascii")) - fp.write(f"File size (no of images): {frames}\r\n".encode("ascii")) - if im.mode in ["P", "PA"]: - fp.write(b"Lut: 1\r\n") - fp.write(b"\000" * (511 - fp.tell()) + b"\032") - if im.mode in ["P", "PA"]: - im_palette = im.im.getpalette("RGB", "RGB;L") - colors = len(im_palette) // 3 - palette = b"" - for i in range(3): - palette += im_palette[colors * i : colors * (i + 1)] - palette += b"\x00" * (256 - colors) - fp.write(palette) # 768 bytes - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, -1))] - ) - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(ImImageFile.format, ImImageFile) -Image.register_save(ImImageFile.format, _save) - -Image.register_extension(ImImageFile.format, ".im") diff --git a/.venv/lib/python3.10/site-packages/PIL/Image.py b/.venv/lib/python3.10/site-packages/PIL/Image.py deleted file mode 100644 index ded40bc..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/Image.py +++ /dev/null @@ -1,4237 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# the Image class wrapper -# -# partial release history: -# 1995-09-09 fl Created -# 1996-03-11 fl PIL release 0.0 (proof of concept) -# 1996-04-30 fl PIL release 0.1b1 -# 1999-07-28 fl PIL release 1.0 final -# 2000-06-07 fl PIL release 1.1 -# 2000-10-20 fl PIL release 1.1.1 -# 2001-05-07 fl PIL release 1.1.2 -# 2002-03-15 fl PIL release 1.1.3 -# 2003-05-10 fl PIL release 1.1.4 -# 2005-03-28 fl PIL release 1.1.5 -# 2006-12-02 fl PIL release 1.1.6 -# 2009-11-15 fl PIL release 1.1.7 -# -# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-2009 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -from __future__ import annotations - -import abc -import atexit -import builtins -import io -import logging -import math -import os -import re -import struct -import sys -import tempfile -import warnings -from collections.abc import Callable, Iterator, MutableMapping, Sequence -from enum import IntEnum -from types import ModuleType -from typing import IO, Any, Literal, Protocol, cast - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -from . import ( - ExifTags, - ImageMode, - TiffTags, - UnidentifiedImageError, - __version__, - _plugins, -) -from ._binary import i32le, o32be, o32le -from ._deprecate import deprecate -from ._util import DeferredError, is_path - -ElementTree: ModuleType | None -try: - from defusedxml import ElementTree -except ImportError: - ElementTree = None - -logger = logging.getLogger(__name__) - - -class DecompressionBombWarning(RuntimeWarning): - pass - - -class DecompressionBombError(Exception): - pass - - -WARN_POSSIBLE_FORMATS: bool = False - -# Limit to around a quarter gigabyte for a 24-bit (3 bpp) image -MAX_IMAGE_PIXELS: int | None = int(1024 * 1024 * 1024 // 4 // 3) - - -try: - # If the _imaging C module is not present, Pillow will not load. - # Note that other modules should not refer to _imaging directly; - # import Image and use the Image.core variable instead. - # Also note that Image.core is not a publicly documented interface, - # and should be considered private and subject to change. - from . import _imaging as core - - if __version__ != getattr(core, "PILLOW_VERSION", None): - msg = ( - "The _imaging extension was built for another version of Pillow or PIL:\n" - f"Core version: {getattr(core, 'PILLOW_VERSION', None)}\n" - f"Pillow version: {__version__}" - ) - raise ImportError(msg) - -except ImportError as v: - core = DeferredError.new(ImportError("The _imaging C module is not installed.")) - # Explanations for ways that we know we might have an import error - if str(v).startswith("Module use of python"): - # The _imaging C module is present, but not compiled for - # the right version (windows only). Print a warning, if - # possible. - warnings.warn( - "The _imaging extension was built for another version of Python.", - RuntimeWarning, - ) - elif str(v).startswith("The _imaging extension"): - warnings.warn(str(v), RuntimeWarning) - # Fail here anyway. Don't let people run with a mostly broken Pillow. - # see docs/porting.rst - raise - - -def isImageType(t: Any) -> TypeGuard[Image]: - """ - Checks if an object is an image object. - - .. warning:: - - This function is for internal use only. - - :param t: object to check if it's an image - :returns: True if the object is an image - """ - deprecate("Image.isImageType(im)", 12, "isinstance(im, Image.Image)") - return hasattr(t, "im") - - -# -# Constants - - -# transpose -class Transpose(IntEnum): - FLIP_LEFT_RIGHT = 0 - FLIP_TOP_BOTTOM = 1 - ROTATE_90 = 2 - ROTATE_180 = 3 - ROTATE_270 = 4 - TRANSPOSE = 5 - TRANSVERSE = 6 - - -# transforms (also defined in Imaging.h) -class Transform(IntEnum): - AFFINE = 0 - EXTENT = 1 - PERSPECTIVE = 2 - QUAD = 3 - MESH = 4 - - -# resampling filters (also defined in Imaging.h) -class Resampling(IntEnum): - NEAREST = 0 - BOX = 4 - BILINEAR = 2 - HAMMING = 5 - BICUBIC = 3 - LANCZOS = 1 - - -_filters_support = { - Resampling.BOX: 0.5, - Resampling.BILINEAR: 1.0, - Resampling.HAMMING: 1.0, - Resampling.BICUBIC: 2.0, - Resampling.LANCZOS: 3.0, -} - - -# dithers -class Dither(IntEnum): - NONE = 0 - ORDERED = 1 # Not yet implemented - RASTERIZE = 2 # Not yet implemented - FLOYDSTEINBERG = 3 # default - - -# palettes/quantizers -class Palette(IntEnum): - WEB = 0 - ADAPTIVE = 1 - - -class Quantize(IntEnum): - MEDIANCUT = 0 - MAXCOVERAGE = 1 - FASTOCTREE = 2 - LIBIMAGEQUANT = 3 - - -module = sys.modules[__name__] -for enum in (Transpose, Transform, Resampling, Dither, Palette, Quantize): - for item in enum: - setattr(module, item.name, item.value) - - -if hasattr(core, "DEFAULT_STRATEGY"): - DEFAULT_STRATEGY = core.DEFAULT_STRATEGY - FILTERED = core.FILTERED - HUFFMAN_ONLY = core.HUFFMAN_ONLY - RLE = core.RLE - FIXED = core.FIXED - - -# -------------------------------------------------------------------- -# Registries - -TYPE_CHECKING = False -if TYPE_CHECKING: - import mmap - from xml.etree.ElementTree import Element - - from IPython.lib.pretty import PrettyPrinter - - from . import ImageFile, ImageFilter, ImagePalette, ImageQt, TiffImagePlugin - from ._typing import CapsuleType, NumpyArray, StrOrBytesPath, TypeGuard -ID: list[str] = [] -OPEN: dict[ - str, - tuple[ - Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], - Callable[[bytes], bool | str] | None, - ], -] = {} -MIME: dict[str, str] = {} -SAVE: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} -SAVE_ALL: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} -EXTENSION: dict[str, str] = {} -DECODERS: dict[str, type[ImageFile.PyDecoder]] = {} -ENCODERS: dict[str, type[ImageFile.PyEncoder]] = {} - -# -------------------------------------------------------------------- -# Modes - -_ENDIAN = "<" if sys.byteorder == "little" else ">" - - -def _conv_type_shape(im: Image) -> tuple[tuple[int, ...], str]: - m = ImageMode.getmode(im.mode) - shape: tuple[int, ...] = (im.height, im.width) - extra = len(m.bands) - if extra != 1: - shape += (extra,) - return shape, m.typestr - - -MODES = [ - "1", - "CMYK", - "F", - "HSV", - "I", - "I;16", - "I;16B", - "I;16L", - "I;16N", - "L", - "LA", - "La", - "LAB", - "P", - "PA", - "RGB", - "RGBA", - "RGBa", - "RGBX", - "YCbCr", -] - -# raw modes that may be memory mapped. NOTE: if you change this, you -# may have to modify the stride calculation in map.c too! -_MAPMODES = ("L", "P", "RGBX", "RGBA", "CMYK", "I;16", "I;16L", "I;16B") - - -def getmodebase(mode: str) -> str: - """ - Gets the "base" mode for given mode. This function returns "L" for - images that contain grayscale data, and "RGB" for images that - contain color data. - - :param mode: Input mode. - :returns: "L" or "RGB". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basemode - - -def getmodetype(mode: str) -> str: - """ - Gets the storage type mode. Given a mode, this function returns a - single-layer mode suitable for storing individual bands. - - :param mode: Input mode. - :returns: "L", "I", or "F". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basetype - - -def getmodebandnames(mode: str) -> tuple[str, ...]: - """ - Gets a list of individual band names. Given a mode, this function returns - a tuple containing the names of individual bands (use - :py:method:`~PIL.Image.getmodetype` to get the mode used to store each - individual band. - - :param mode: Input mode. - :returns: A tuple containing band names. The length of the tuple - gives the number of bands in an image of the given mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).bands - - -def getmodebands(mode: str) -> int: - """ - Gets the number of individual bands for this mode. - - :param mode: Input mode. - :returns: The number of bands in this mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return len(ImageMode.getmode(mode).bands) - - -# -------------------------------------------------------------------- -# Helpers - -_initialized = 0 - - -def preinit() -> None: - """ - Explicitly loads BMP, GIF, JPEG, PPM and PPM file format drivers. - - It is called when opening or saving images. - """ - - global _initialized - if _initialized >= 1: - return - - try: - from . import BmpImagePlugin - - assert BmpImagePlugin - except ImportError: - pass - try: - from . import GifImagePlugin - - assert GifImagePlugin - except ImportError: - pass - try: - from . import JpegImagePlugin - - assert JpegImagePlugin - except ImportError: - pass - try: - from . import PpmImagePlugin - - assert PpmImagePlugin - except ImportError: - pass - try: - from . import PngImagePlugin - - assert PngImagePlugin - except ImportError: - pass - - _initialized = 1 - - -def init() -> bool: - """ - Explicitly initializes the Python Imaging Library. This function - loads all available file format drivers. - - It is called when opening or saving images if :py:meth:`~preinit()` is - insufficient, and by :py:meth:`~PIL.features.pilinfo`. - """ - - global _initialized - if _initialized >= 2: - return False - - parent_name = __name__.rpartition(".")[0] - for plugin in _plugins: - try: - logger.debug("Importing %s", plugin) - __import__(f"{parent_name}.{plugin}", globals(), locals(), []) - except ImportError as e: - logger.debug("Image: failed to import %s: %s", plugin, e) - - if OPEN or SAVE: - _initialized = 2 - return True - return False - - -# -------------------------------------------------------------------- -# Codec factories (used by tobytes/frombytes and ImageFile.load) - - -def _getdecoder( - mode: str, decoder_name: str, args: Any, extra: tuple[Any, ...] = () -) -> core.ImagingDecoder | ImageFile.PyDecoder: - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - decoder = DECODERS[decoder_name] - except KeyError: - pass - else: - return decoder(mode, *args + extra) - - try: - # get decoder - decoder = getattr(core, f"{decoder_name}_decoder") - except AttributeError as e: - msg = f"decoder {decoder_name} not available" - raise OSError(msg) from e - return decoder(mode, *args + extra) - - -def _getencoder( - mode: str, encoder_name: str, args: Any, extra: tuple[Any, ...] = () -) -> core.ImagingEncoder | ImageFile.PyEncoder: - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - encoder = ENCODERS[encoder_name] - except KeyError: - pass - else: - return encoder(mode, *args + extra) - - try: - # get encoder - encoder = getattr(core, f"{encoder_name}_encoder") - except AttributeError as e: - msg = f"encoder {encoder_name} not available" - raise OSError(msg) from e - return encoder(mode, *args + extra) - - -# -------------------------------------------------------------------- -# Simple expression analyzer - - -class ImagePointTransform: - """ - Used with :py:meth:`~PIL.Image.Image.point` for single band images with more than - 8 bits, this represents an affine transformation, where the value is multiplied by - ``scale`` and ``offset`` is added. - """ - - def __init__(self, scale: float, offset: float) -> None: - self.scale = scale - self.offset = offset - - def __neg__(self) -> ImagePointTransform: - return ImagePointTransform(-self.scale, -self.offset) - - def __add__(self, other: ImagePointTransform | float) -> ImagePointTransform: - if isinstance(other, ImagePointTransform): - return ImagePointTransform( - self.scale + other.scale, self.offset + other.offset - ) - return ImagePointTransform(self.scale, self.offset + other) - - __radd__ = __add__ - - def __sub__(self, other: ImagePointTransform | float) -> ImagePointTransform: - return self + -other - - def __rsub__(self, other: ImagePointTransform | float) -> ImagePointTransform: - return other + -self - - def __mul__(self, other: ImagePointTransform | float) -> ImagePointTransform: - if isinstance(other, ImagePointTransform): - return NotImplemented - return ImagePointTransform(self.scale * other, self.offset * other) - - __rmul__ = __mul__ - - def __truediv__(self, other: ImagePointTransform | float) -> ImagePointTransform: - if isinstance(other, ImagePointTransform): - return NotImplemented - return ImagePointTransform(self.scale / other, self.offset / other) - - -def _getscaleoffset( - expr: Callable[[ImagePointTransform], ImagePointTransform | float], -) -> tuple[float, float]: - a = expr(ImagePointTransform(1, 0)) - return (a.scale, a.offset) if isinstance(a, ImagePointTransform) else (0, a) - - -# -------------------------------------------------------------------- -# Implementation wrapper - - -class SupportsGetData(Protocol): - def getdata( - self, - ) -> tuple[Transform, Sequence[int]]: ... - - -class Image: - """ - This class represents an image object. To create - :py:class:`~PIL.Image.Image` objects, use the appropriate factory - functions. There's hardly ever any reason to call the Image constructor - directly. - - * :py:func:`~PIL.Image.open` - * :py:func:`~PIL.Image.new` - * :py:func:`~PIL.Image.frombytes` - """ - - format: str | None = None - format_description: str | None = None - _close_exclusive_fp_after_loading = True - - def __init__(self) -> None: - # FIXME: take "new" parameters / other image? - self._im: core.ImagingCore | DeferredError | None = None - self._mode = "" - self._size = (0, 0) - self.palette: ImagePalette.ImagePalette | None = None - self.info: dict[str | tuple[int, int], Any] = {} - self.readonly = 0 - self._exif: Exif | None = None - - @property - def im(self) -> core.ImagingCore: - if isinstance(self._im, DeferredError): - raise self._im.ex - assert self._im is not None - return self._im - - @im.setter - def im(self, im: core.ImagingCore) -> None: - self._im = im - - @property - def width(self) -> int: - return self.size[0] - - @property - def height(self) -> int: - return self.size[1] - - @property - def size(self) -> tuple[int, int]: - return self._size - - @property - def mode(self) -> str: - return self._mode - - @property - def readonly(self) -> int: - return (self._im and self._im.readonly) or self._readonly - - @readonly.setter - def readonly(self, readonly: int) -> None: - self._readonly = readonly - - def _new(self, im: core.ImagingCore) -> Image: - new = Image() - new.im = im - new._mode = im.mode - new._size = im.size - if im.mode in ("P", "PA"): - if self.palette: - new.palette = self.palette.copy() - else: - from . import ImagePalette - - new.palette = ImagePalette.ImagePalette() - new.info = self.info.copy() - return new - - # Context manager support - def __enter__(self): - return self - - def __exit__(self, *args): - from . import ImageFile - - if isinstance(self, ImageFile.ImageFile): - if getattr(self, "_exclusive_fp", False): - self._close_fp() - self.fp = None - - def close(self) -> None: - """ - This operation will destroy the image core and release its memory. - The image data will be unusable afterward. - - This function is required to close images that have multiple frames or - have not had their file read and closed by the - :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for - more information. - """ - if getattr(self, "map", None): - if sys.platform == "win32" and hasattr(sys, "pypy_version_info"): - self.map.close() - self.map: mmap.mmap | None = None - - # Instead of simply setting to None, we're setting up a - # deferred error that will better explain that the core image - # object is gone. - self._im = DeferredError(ValueError("Operation on closed image")) - - def _copy(self) -> None: - self.load() - self.im = self.im.copy() - self.readonly = 0 - - def _ensure_mutable(self) -> None: - if self.readonly: - self._copy() - else: - self.load() - - def _dump( - self, file: str | None = None, format: str | None = None, **options: Any - ) -> str: - suffix = "" - if format: - suffix = f".{format}" - - if not file: - f, filename = tempfile.mkstemp(suffix) - os.close(f) - else: - filename = file - if not filename.endswith(suffix): - filename = filename + suffix - - self.load() - - if not format or format == "PPM": - self.im.save_ppm(filename) - else: - self.save(filename, format, **options) - - return filename - - def __eq__(self, other: object) -> bool: - if self.__class__ is not other.__class__: - return False - assert isinstance(other, Image) - return ( - self.mode == other.mode - and self.size == other.size - and self.info == other.info - and self.getpalette() == other.getpalette() - and self.tobytes() == other.tobytes() - ) - - def __repr__(self) -> str: - return ( - f"<{self.__class__.__module__}.{self.__class__.__name__} " - f"image mode={self.mode} size={self.size[0]}x{self.size[1]} " - f"at 0x{id(self):X}>" - ) - - def _repr_pretty_(self, p: PrettyPrinter, cycle: bool) -> None: - """IPython plain text display support""" - - # Same as __repr__ but without unpredictable id(self), - # to keep Jupyter notebook `text/plain` output stable. - p.text( - f"<{self.__class__.__module__}.{self.__class__.__name__} " - f"image mode={self.mode} size={self.size[0]}x{self.size[1]}>" - ) - - def _repr_image(self, image_format: str, **kwargs: Any) -> bytes | None: - """Helper function for iPython display hook. - - :param image_format: Image format. - :returns: image as bytes, saved into the given format. - """ - b = io.BytesIO() - try: - self.save(b, image_format, **kwargs) - except Exception: - return None - return b.getvalue() - - def _repr_png_(self) -> bytes | None: - """iPython display hook support for PNG format. - - :returns: PNG version of the image as bytes - """ - return self._repr_image("PNG", compress_level=1) - - def _repr_jpeg_(self) -> bytes | None: - """iPython display hook support for JPEG format. - - :returns: JPEG version of the image as bytes - """ - return self._repr_image("JPEG") - - @property - def __array_interface__(self) -> dict[str, str | bytes | int | tuple[int, ...]]: - # numpy array interface support - new: dict[str, str | bytes | int | tuple[int, ...]] = {"version": 3} - if self.mode == "1": - # Binary images need to be extended from bits to bytes - # See: https://github.com/python-pillow/Pillow/issues/350 - new["data"] = self.tobytes("raw", "L") - else: - new["data"] = self.tobytes() - new["shape"], new["typestr"] = _conv_type_shape(self) - return new - - def __arrow_c_schema__(self) -> object: - self.load() - return self.im.__arrow_c_schema__() - - def __arrow_c_array__( - self, requested_schema: object | None = None - ) -> tuple[object, object]: - self.load() - return (self.im.__arrow_c_schema__(), self.im.__arrow_c_array__()) - - def __getstate__(self) -> list[Any]: - im_data = self.tobytes() # load image first - return [self.info, self.mode, self.size, self.getpalette(), im_data] - - def __setstate__(self, state: list[Any]) -> None: - Image.__init__(self) - info, mode, size, palette, data = state[:5] - self.info = info - self._mode = mode - self._size = size - self.im = core.new(mode, size) - if mode in ("L", "LA", "P", "PA") and palette: - self.putpalette(palette) - self.frombytes(data) - - def tobytes(self, encoder_name: str = "raw", *args: Any) -> bytes: - """ - Return image as a bytes object. - - .. warning:: - - This method returns the raw image data from the internal - storage. For compressed image data (e.g. PNG, JPEG) use - :meth:`~.save`, with a BytesIO parameter for in-memory - data. - - :param encoder_name: What encoder to use. The default is to - use the standard "raw" encoder. - - A list of C encoders can be seen under - codecs section of the function array in - :file:`_imaging.c`. Python encoders are - registered within the relevant plugins. - :param args: Extra arguments to the encoder. - :returns: A :py:class:`bytes` object. - """ - - encoder_args: Any = args - if len(encoder_args) == 1 and isinstance(encoder_args[0], tuple): - # may pass tuple instead of argument list - encoder_args = encoder_args[0] - - if encoder_name == "raw" and encoder_args == (): - encoder_args = self.mode - - self.load() - - if self.width == 0 or self.height == 0: - return b"" - - # unpack data - e = _getencoder(self.mode, encoder_name, encoder_args) - e.setimage(self.im) - - bufsize = max(65536, self.size[0] * 4) # see RawEncode.c - - output = [] - while True: - bytes_consumed, errcode, data = e.encode(bufsize) - output.append(data) - if errcode: - break - if errcode < 0: - msg = f"encoder error {errcode} in tobytes" - raise RuntimeError(msg) - - return b"".join(output) - - def tobitmap(self, name: str = "image") -> bytes: - """ - Returns the image converted to an X11 bitmap. - - .. note:: This method only works for mode "1" images. - - :param name: The name prefix to use for the bitmap variables. - :returns: A string containing an X11 bitmap. - :raises ValueError: If the mode is not "1" - """ - - self.load() - if self.mode != "1": - msg = "not a bitmap" - raise ValueError(msg) - data = self.tobytes("xbm") - return b"".join( - [ - f"#define {name}_width {self.size[0]}\n".encode("ascii"), - f"#define {name}_height {self.size[1]}\n".encode("ascii"), - f"static char {name}_bits[] = {{\n".encode("ascii"), - data, - b"};", - ] - ) - - def frombytes( - self, - data: bytes | bytearray | SupportsArrayInterface, - decoder_name: str = "raw", - *args: Any, - ) -> None: - """ - Loads this image with pixel data from a bytes object. - - This method is similar to the :py:func:`~PIL.Image.frombytes` function, - but loads data into this image instead of creating a new image object. - """ - - if self.width == 0 or self.height == 0: - return - - decoder_args: Any = args - if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): - # may pass tuple instead of argument list - decoder_args = decoder_args[0] - - # default format - if decoder_name == "raw" and decoder_args == (): - decoder_args = self.mode - - # unpack data - d = _getdecoder(self.mode, decoder_name, decoder_args) - d.setimage(self.im) - s = d.decode(data) - - if s[0] >= 0: - msg = "not enough image data" - raise ValueError(msg) - if s[1] != 0: - msg = "cannot decode image data" - raise ValueError(msg) - - def load(self) -> core.PixelAccess | None: - """ - Allocates storage for the image and loads the pixel data. In - normal cases, you don't need to call this method, since the - Image class automatically loads an opened image when it is - accessed for the first time. - - If the file associated with the image was opened by Pillow, then this - method will close it. The exception to this is if the image has - multiple frames, in which case the file will be left open for seek - operations. See :ref:`file-handling` for more information. - - :returns: An image access object. - :rtype: :py:class:`.PixelAccess` - """ - if self._im is not None and self.palette and self.palette.dirty: - # realize palette - mode, arr = self.palette.getdata() - self.im.putpalette(self.palette.mode, mode, arr) - self.palette.dirty = 0 - self.palette.rawmode = None - if "transparency" in self.info and mode in ("LA", "PA"): - if isinstance(self.info["transparency"], int): - self.im.putpalettealpha(self.info["transparency"], 0) - else: - self.im.putpalettealphas(self.info["transparency"]) - self.palette.mode = "RGBA" - else: - self.palette.palette = self.im.getpalette( - self.palette.mode, self.palette.mode - ) - - if self._im is not None: - return self.im.pixel_access(self.readonly) - return None - - def verify(self) -> None: - """ - Verifies the contents of a file. For data read from a file, this - method attempts to determine if the file is broken, without - actually decoding the image data. If this method finds any - problems, it raises suitable exceptions. If you need to load - the image after using this method, you must reopen the image - file. - """ - pass - - def convert( - self, - mode: str | None = None, - matrix: tuple[float, ...] | None = None, - dither: Dither | None = None, - palette: Palette = Palette.WEB, - colors: int = 256, - ) -> Image: - """ - Returns a converted copy of this image. For the "P" mode, this - method translates pixels through the palette. If mode is - omitted, a mode is chosen so that all information in the image - and the palette can be represented without a palette. - - This supports all possible conversions between "L", "RGB" and "CMYK". The - ``matrix`` argument only supports "L" and "RGB". - - When translating a color image to grayscale (mode "L"), - the library uses the ITU-R 601-2 luma transform:: - - L = R * 299/1000 + G * 587/1000 + B * 114/1000 - - The default method of converting a grayscale ("L") or "RGB" - image into a bilevel (mode "1") image uses Floyd-Steinberg - dither to approximate the original image luminosity levels. If - dither is ``None``, all values larger than 127 are set to 255 (white), - all other values to 0 (black). To use other thresholds, use the - :py:meth:`~PIL.Image.Image.point` method. - - When converting from "RGBA" to "P" without a ``matrix`` argument, - this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, - and ``dither`` and ``palette`` are ignored. - - When converting from "PA", if an "RGBA" palette is present, the alpha - channel from the image will be used instead of the values from the palette. - - :param mode: The requested mode. See: :ref:`concept-modes`. - :param matrix: An optional conversion matrix. If given, this - should be 4- or 12-tuple containing floating point values. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). Note that this is not used when ``matrix`` is supplied. - :param palette: Palette to use when converting from mode "RGB" - to "P". Available palettes are :data:`Palette.WEB` or - :data:`Palette.ADAPTIVE`. - :param colors: Number of colors to use for the :data:`Palette.ADAPTIVE` - palette. Defaults to 256. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - - self.load() - - has_transparency = "transparency" in self.info - if not mode and self.mode == "P": - # determine default mode - if self.palette: - mode = self.palette.mode - else: - mode = "RGB" - if mode == "RGB" and has_transparency: - mode = "RGBA" - if not mode or (mode == self.mode and not matrix): - return self.copy() - - if matrix: - # matrix conversion - if mode not in ("L", "RGB"): - msg = "illegal conversion" - raise ValueError(msg) - im = self.im.convert_matrix(mode, matrix) - new_im = self._new(im) - if has_transparency and self.im.bands == 3: - transparency = new_im.info["transparency"] - - def convert_transparency( - m: tuple[float, ...], v: tuple[int, int, int] - ) -> int: - value = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 - return max(0, min(255, int(value))) - - if mode == "L": - transparency = convert_transparency(matrix, transparency) - elif len(mode) == 3: - transparency = tuple( - convert_transparency(matrix[i * 4 : i * 4 + 4], transparency) - for i in range(len(transparency)) - ) - new_im.info["transparency"] = transparency - return new_im - - if mode == "P" and self.mode == "RGBA": - return self.quantize(colors) - - trns = None - delete_trns = False - # transparency handling - if has_transparency: - if (self.mode in ("1", "L", "I", "I;16") and mode in ("LA", "RGBA")) or ( - self.mode == "RGB" and mode in ("La", "LA", "RGBa", "RGBA") - ): - # Use transparent conversion to promote from transparent - # color to an alpha channel. - new_im = self._new( - self.im.convert_transparent(mode, self.info["transparency"]) - ) - del new_im.info["transparency"] - return new_im - elif self.mode in ("L", "RGB", "P") and mode in ("L", "RGB", "P"): - t = self.info["transparency"] - if isinstance(t, bytes): - # Dragons. This can't be represented by a single color - warnings.warn( - "Palette images with Transparency expressed in bytes should be " - "converted to RGBA images" - ) - delete_trns = True - else: - # get the new transparency color. - # use existing conversions - trns_im = new(self.mode, (1, 1)) - if self.mode == "P": - assert self.palette is not None - trns_im.putpalette(self.palette, self.palette.mode) - if isinstance(t, tuple): - err = "Couldn't allocate a palette color for transparency" - assert trns_im.palette is not None - try: - t = trns_im.palette.getcolor(t, self) - except ValueError as e: - if str(e) == "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - t = None - else: - raise ValueError(err) from e - if t is None: - trns = None - else: - trns_im.putpixel((0, 0), t) - - if mode in ("L", "RGB"): - trns_im = trns_im.convert(mode) - else: - # can't just retrieve the palette number, got to do it - # after quantization. - trns_im = trns_im.convert("RGB") - trns = trns_im.getpixel((0, 0)) - - elif self.mode == "P" and mode in ("LA", "PA", "RGBA"): - t = self.info["transparency"] - delete_trns = True - - if isinstance(t, bytes): - self.im.putpalettealphas(t) - elif isinstance(t, int): - self.im.putpalettealpha(t, 0) - else: - msg = "Transparency for P mode should be bytes or int" - raise ValueError(msg) - - if mode == "P" and palette == Palette.ADAPTIVE: - im = self.im.quantize(colors) - new_im = self._new(im) - from . import ImagePalette - - new_im.palette = ImagePalette.ImagePalette( - "RGB", new_im.im.getpalette("RGB") - ) - if delete_trns: - # This could possibly happen if we requantize to fewer colors. - # The transparency would be totally off in that case. - del new_im.info["transparency"] - if trns is not None: - try: - new_im.info["transparency"] = new_im.palette.getcolor( - cast(tuple[int, ...], trns), # trns was converted to RGB - new_im, - ) - except Exception: - # if we can't make a transparent color, don't leave the old - # transparency hanging around to mess us up. - del new_im.info["transparency"] - warnings.warn("Couldn't allocate palette entry for transparency") - return new_im - - if "LAB" in (self.mode, mode): - im = self - if mode == "LAB": - if im.mode not in ("RGB", "RGBA", "RGBX"): - im = im.convert("RGBA") - other_mode = im.mode - else: - other_mode = mode - if other_mode in ("RGB", "RGBA", "RGBX"): - from . import ImageCms - - srgb = ImageCms.createProfile("sRGB") - lab = ImageCms.createProfile("LAB") - profiles = [lab, srgb] if im.mode == "LAB" else [srgb, lab] - transform = ImageCms.buildTransform( - profiles[0], profiles[1], im.mode, mode - ) - return transform.apply(im) - - # colorspace conversion - if dither is None: - dither = Dither.FLOYDSTEINBERG - - try: - im = self.im.convert(mode, dither) - except ValueError: - try: - # normalize source image and try again - modebase = getmodebase(self.mode) - if modebase == self.mode: - raise - im = self.im.convert(modebase) - im = im.convert(mode, dither) - except KeyError as e: - msg = "illegal conversion" - raise ValueError(msg) from e - - new_im = self._new(im) - if mode == "P" and palette != Palette.ADAPTIVE: - from . import ImagePalette - - new_im.palette = ImagePalette.ImagePalette("RGB", im.getpalette("RGB")) - if delete_trns: - # crash fail if we leave a bytes transparency in an rgb/l mode. - del new_im.info["transparency"] - if trns is not None: - if new_im.mode == "P" and new_im.palette: - try: - new_im.info["transparency"] = new_im.palette.getcolor( - cast(tuple[int, ...], trns), new_im # trns was converted to RGB - ) - except ValueError as e: - del new_im.info["transparency"] - if str(e) != "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - warnings.warn( - "Couldn't allocate palette entry for transparency" - ) - else: - new_im.info["transparency"] = trns - return new_im - - def quantize( - self, - colors: int = 256, - method: int | None = None, - kmeans: int = 0, - palette: Image | None = None, - dither: Dither = Dither.FLOYDSTEINBERG, - ) -> Image: - """ - Convert the image to 'P' mode with the specified number - of colors. - - :param colors: The desired number of colors, <= 256 - :param method: :data:`Quantize.MEDIANCUT` (median cut), - :data:`Quantize.MAXCOVERAGE` (maximum coverage), - :data:`Quantize.FASTOCTREE` (fast octree), - :data:`Quantize.LIBIMAGEQUANT` (libimagequant; check support - using :py:func:`PIL.features.check_feature` with - ``feature="libimagequant"``). - - By default, :data:`Quantize.MEDIANCUT` will be used. - - The exception to this is RGBA images. :data:`Quantize.MEDIANCUT` - and :data:`Quantize.MAXCOVERAGE` do not support RGBA images, so - :data:`Quantize.FASTOCTREE` is used by default instead. - :param kmeans: Integer greater than or equal to zero. - :param palette: Quantize to the palette of given - :py:class:`PIL.Image.Image`. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). - :returns: A new image - """ - - self.load() - - if method is None: - # defaults: - method = Quantize.MEDIANCUT - if self.mode == "RGBA": - method = Quantize.FASTOCTREE - - if self.mode == "RGBA" and method not in ( - Quantize.FASTOCTREE, - Quantize.LIBIMAGEQUANT, - ): - # Caller specified an invalid mode. - msg = ( - "Fast Octree (method == 2) and libimagequant (method == 3) " - "are the only valid methods for quantizing RGBA images" - ) - raise ValueError(msg) - - if palette: - # use palette from reference image - palette.load() - if palette.mode != "P": - msg = "bad mode for palette image" - raise ValueError(msg) - if self.mode not in {"RGB", "L"}: - msg = "only RGB or L mode images can be quantized to a palette" - raise ValueError(msg) - im = self.im.convert("P", dither, palette.im) - new_im = self._new(im) - assert palette.palette is not None - new_im.palette = palette.palette.copy() - return new_im - - if kmeans < 0: - msg = "kmeans must not be negative" - raise ValueError(msg) - - im = self._new(self.im.quantize(colors, method, kmeans)) - - from . import ImagePalette - - mode = im.im.getpalettemode() - palette_data = im.im.getpalette(mode, mode)[: colors * len(mode)] - im.palette = ImagePalette.ImagePalette(mode, palette_data) - - return im - - def copy(self) -> Image: - """ - Copies this image. Use this method if you wish to paste things - into an image, but still retain the original. - - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - self.load() - return self._new(self.im.copy()) - - __copy__ = copy - - def crop(self, box: tuple[float, float, float, float] | None = None) -> Image: - """ - Returns a rectangular region from this image. The box is a - 4-tuple defining the left, upper, right, and lower pixel - coordinate. See :ref:`coordinate-system`. - - Note: Prior to Pillow 3.4.0, this was a lazy operation. - - :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if box is None: - return self.copy() - - if box[2] < box[0]: - msg = "Coordinate 'right' is less than 'left'" - raise ValueError(msg) - elif box[3] < box[1]: - msg = "Coordinate 'lower' is less than 'upper'" - raise ValueError(msg) - - self.load() - return self._new(self._crop(self.im, box)) - - def _crop( - self, im: core.ImagingCore, box: tuple[float, float, float, float] - ) -> core.ImagingCore: - """ - Returns a rectangular region from the core image object im. - - This is equivalent to calling im.crop((x0, y0, x1, y1)), but - includes additional sanity checks. - - :param im: a core image object - :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. - :returns: A core image object. - """ - - x0, y0, x1, y1 = map(int, map(round, box)) - - absolute_values = (abs(x1 - x0), abs(y1 - y0)) - - _decompression_bomb_check(absolute_values) - - return im.crop((x0, y0, x1, y1)) - - def draft( - self, mode: str | None, size: tuple[int, int] | None - ) -> tuple[str, tuple[int, int, float, float]] | None: - """ - Configures the image file loader so it returns a version of the - image that as closely as possible matches the given mode and - size. For example, you can use this method to convert a color - JPEG to grayscale while loading it. - - If any changes are made, returns a tuple with the chosen ``mode`` and - ``box`` with coordinates of the original image within the altered one. - - Note that this method modifies the :py:class:`~PIL.Image.Image` object - in place. If the image has already been loaded, this method has no - effect. - - Note: This method is not implemented for most images. It is - currently implemented only for JPEG and MPO images. - - :param mode: The requested mode. - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - """ - pass - - def _expand(self, xmargin: int, ymargin: int | None = None) -> Image: - if ymargin is None: - ymargin = xmargin - self.load() - return self._new(self.im.expand(xmargin, ymargin)) - - def filter(self, filter: ImageFilter.Filter | type[ImageFilter.Filter]) -> Image: - """ - Filters this image using the given filter. For a list of - available filters, see the :py:mod:`~PIL.ImageFilter` module. - - :param filter: Filter kernel. - :returns: An :py:class:`~PIL.Image.Image` object.""" - - from . import ImageFilter - - self.load() - - if callable(filter): - filter = filter() - if not hasattr(filter, "filter"): - msg = "filter argument should be ImageFilter.Filter instance or class" - raise TypeError(msg) - - multiband = isinstance(filter, ImageFilter.MultibandFilter) - if self.im.bands == 1 or multiband: - return self._new(filter.filter(self.im)) - - ims = [ - self._new(filter.filter(self.im.getband(c))) for c in range(self.im.bands) - ] - return merge(self.mode, ims) - - def getbands(self) -> tuple[str, ...]: - """ - Returns a tuple containing the name of each band in this image. - For example, ``getbands`` on an RGB image returns ("R", "G", "B"). - - :returns: A tuple containing band names. - :rtype: tuple - """ - return ImageMode.getmode(self.mode).bands - - def getbbox(self, *, alpha_only: bool = True) -> tuple[int, int, int, int] | None: - """ - Calculates the bounding box of the non-zero regions in the - image. - - :param alpha_only: Optional flag, defaulting to ``True``. - If ``True`` and the image has an alpha channel, trim transparent pixels. - Otherwise, trim pixels when all channels are zero. - Keyword-only argument. - :returns: The bounding box is returned as a 4-tuple defining the - left, upper, right, and lower pixel coordinate. See - :ref:`coordinate-system`. If the image is completely empty, this - method returns None. - - """ - - self.load() - return self.im.getbbox(alpha_only) - - def getcolors( - self, maxcolors: int = 256 - ) -> list[tuple[int, tuple[int, ...]]] | list[tuple[int, float]] | None: - """ - Returns a list of colors used in this image. - - The colors will be in the image's mode. For example, an RGB image will - return a tuple of (red, green, blue) color values, and a P image will - return the index of the color in the palette. - - :param maxcolors: Maximum number of colors. If this number is - exceeded, this method returns None. The default limit is - 256 colors. - :returns: An unsorted list of (count, pixel) values. - """ - - self.load() - if self.mode in ("1", "L", "P"): - h = self.im.histogram() - out: list[tuple[int, float]] = [(h[i], i) for i in range(256) if h[i]] - if len(out) > maxcolors: - return None - return out - return self.im.getcolors(maxcolors) - - def getdata(self, band: int | None = None) -> core.ImagingCore: - """ - Returns the contents of this image as a sequence object - containing pixel values. The sequence object is flattened, so - that values for line one follow directly after the values of - line zero, and so on. - - Note that the sequence object returned by this method is an - internal PIL data type, which only supports certain sequence - operations. To convert it to an ordinary sequence (e.g. for - printing), use ``list(im.getdata())``. - - :param band: What band to return. The default is to return - all bands. To return a single band, pass in the index - value (e.g. 0 to get the "R" band from an "RGB" image). - :returns: A sequence-like object. - """ - - self.load() - if band is not None: - return self.im.getband(band) - return self.im # could be abused - - def getextrema(self) -> tuple[float, float] | tuple[tuple[int, int], ...]: - """ - Gets the minimum and maximum pixel values for each band in - the image. - - :returns: For a single-band image, a 2-tuple containing the - minimum and maximum pixel value. For a multi-band image, - a tuple containing one 2-tuple for each band. - """ - - self.load() - if self.im.bands > 1: - return tuple(self.im.getband(i).getextrema() for i in range(self.im.bands)) - return self.im.getextrema() - - def getxmp(self) -> dict[str, Any]: - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - - def get_name(tag: str) -> str: - return re.sub("^{[^}]+}", "", tag) - - def get_value(element: Element) -> str | dict[str, Any] | None: - value: dict[str, Any] = {get_name(k): v for k, v in element.attrib.items()} - children = list(element) - if children: - for child in children: - name = get_name(child.tag) - child_value = get_value(child) - if name in value: - if not isinstance(value[name], list): - value[name] = [value[name]] - value[name].append(child_value) - else: - value[name] = child_value - elif value: - if element.text: - value["text"] = element.text - else: - return element.text - return value - - if ElementTree is None: - warnings.warn("XMP data cannot be read without defusedxml dependency") - return {} - if "xmp" not in self.info: - return {} - root = ElementTree.fromstring(self.info["xmp"].rstrip(b"\x00")) - return {get_name(root.tag): get_value(root)} - - def getexif(self) -> Exif: - """ - Gets EXIF data from the image. - - :returns: an :py:class:`~PIL.Image.Exif` object. - """ - if self._exif is None: - self._exif = Exif() - elif self._exif._loaded: - return self._exif - self._exif._loaded = True - - exif_info = self.info.get("exif") - if exif_info is None: - if "Raw profile type exif" in self.info: - exif_info = bytes.fromhex( - "".join(self.info["Raw profile type exif"].split("\n")[3:]) - ) - elif hasattr(self, "tag_v2"): - self._exif.bigtiff = self.tag_v2._bigtiff - self._exif.endian = self.tag_v2._endian - self._exif.load_from_fp(self.fp, self.tag_v2._offset) - if exif_info is not None: - self._exif.load(exif_info) - - # XMP tags - if ExifTags.Base.Orientation not in self._exif: - xmp_tags = self.info.get("XML:com.adobe.xmp") - if not xmp_tags and (xmp_tags := self.info.get("xmp")): - xmp_tags = xmp_tags.decode("utf-8") - if xmp_tags: - match = re.search(r'tiff:Orientation(="|>)([0-9])', xmp_tags) - if match: - self._exif[ExifTags.Base.Orientation] = int(match[2]) - - return self._exif - - def _reload_exif(self) -> None: - if self._exif is None or not self._exif._loaded: - return - self._exif._loaded = False - self.getexif() - - def get_child_images(self) -> list[ImageFile.ImageFile]: - from . import ImageFile - - deprecate("Image.Image.get_child_images", 13) - return ImageFile.ImageFile.get_child_images(self) # type: ignore[arg-type] - - def getim(self) -> CapsuleType: - """ - Returns a capsule that points to the internal image memory. - - :returns: A capsule object. - """ - - self.load() - return self.im.ptr - - def getpalette(self, rawmode: str | None = "RGB") -> list[int] | None: - """ - Returns the image palette as a list. - - :param rawmode: The mode in which to return the palette. ``None`` will - return the palette in its current mode. - - .. versionadded:: 9.1.0 - - :returns: A list of color values [r, g, b, ...], or None if the - image has no palette. - """ - - self.load() - try: - mode = self.im.getpalettemode() - except ValueError: - return None # no palette - if rawmode is None: - rawmode = mode - return list(self.im.getpalette(mode, rawmode)) - - @property - def has_transparency_data(self) -> bool: - """ - Determine if an image has transparency data, whether in the form of an - alpha channel, a palette with an alpha channel, or a "transparency" key - in the info dictionary. - - Note the image might still appear solid, if all of the values shown - within are opaque. - - :returns: A boolean. - """ - if ( - self.mode in ("LA", "La", "PA", "RGBA", "RGBa") - or "transparency" in self.info - ): - return True - if self.mode == "P": - assert self.palette is not None - return self.palette.mode.endswith("A") - return False - - def apply_transparency(self) -> None: - """ - If a P mode image has a "transparency" key in the info dictionary, - remove the key and instead apply the transparency to the palette. - Otherwise, the image is unchanged. - """ - if self.mode != "P" or "transparency" not in self.info: - return - - from . import ImagePalette - - palette = self.getpalette("RGBA") - assert palette is not None - transparency = self.info["transparency"] - if isinstance(transparency, bytes): - for i, alpha in enumerate(transparency): - palette[i * 4 + 3] = alpha - else: - palette[transparency * 4 + 3] = 0 - self.palette = ImagePalette.ImagePalette("RGBA", bytes(palette)) - self.palette.dirty = 1 - - del self.info["transparency"] - - def getpixel( - self, xy: tuple[int, int] | list[int] - ) -> float | tuple[int, ...] | None: - """ - Returns the pixel value at a given position. - - :param xy: The coordinate, given as (x, y). See - :ref:`coordinate-system`. - :returns: The pixel value. If the image is a multi-layer image, - this method returns a tuple. - """ - - self.load() - return self.im.getpixel(tuple(xy)) - - def getprojection(self) -> tuple[list[int], list[int]]: - """ - Get projection to x and y axes - - :returns: Two sequences, indicating where there are non-zero - pixels along the X-axis and the Y-axis, respectively. - """ - - self.load() - x, y = self.im.getprojection() - return list(x), list(y) - - def histogram( - self, mask: Image | None = None, extrema: tuple[float, float] | None = None - ) -> list[int]: - """ - Returns a histogram for the image. The histogram is returned as a - list of pixel counts, one for each pixel value in the source - image. Counts are grouped into 256 bins for each band, even if - the image has more than 8 bits per band. If the image has more - than one band, the histograms for all bands are concatenated (for - example, the histogram for an "RGB" image contains 768 values). - - A bilevel image (mode "1") is treated as a grayscale ("L") image - by this method. - - If a mask is provided, the method returns a histogram for those - parts of the image where the mask image is non-zero. The mask - image must have the same size as the image, and be either a - bi-level image (mode "1") or a grayscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A list containing pixel counts. - """ - self.load() - if mask: - mask.load() - return self.im.histogram((0, 0), mask.im) - if self.mode in ("I", "F"): - return self.im.histogram( - extrema if extrema is not None else self.getextrema() - ) - return self.im.histogram() - - def entropy( - self, mask: Image | None = None, extrema: tuple[float, float] | None = None - ) -> float: - """ - Calculates and returns the entropy for the image. - - A bilevel image (mode "1") is treated as a grayscale ("L") - image by this method. - - If a mask is provided, the method employs the histogram for - those parts of the image where the mask image is non-zero. - The mask image must have the same size as the image, and be - either a bi-level image (mode "1") or a grayscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A float value representing the image entropy - """ - self.load() - if mask: - mask.load() - return self.im.entropy((0, 0), mask.im) - if self.mode in ("I", "F"): - return self.im.entropy( - extrema if extrema is not None else self.getextrema() - ) - return self.im.entropy() - - def paste( - self, - im: Image | str | float | tuple[float, ...], - box: Image | tuple[int, int, int, int] | tuple[int, int] | None = None, - mask: Image | None = None, - ) -> None: - """ - Pastes another image into this image. The box argument is either - a 2-tuple giving the upper left corner, a 4-tuple defining the - left, upper, right, and lower pixel coordinate, or None (same as - (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size - of the pasted image must match the size of the region. - - If the modes don't match, the pasted image is converted to the mode of - this image (see the :py:meth:`~PIL.Image.Image.convert` method for - details). - - Instead of an image, the source can be a integer or tuple - containing pixel values. The method then fills the region - with the given color. When creating RGB images, you can - also use color strings as supported by the ImageColor module. - - If a mask is given, this method updates only the regions - indicated by the mask. You can use either "1", "L", "LA", "RGBA" - or "RGBa" images (if present, the alpha band is used as mask). - Where the mask is 255, the given image is copied as is. Where - the mask is 0, the current value is preserved. Intermediate - values will mix the two images together, including their alpha - channels if they have them. - - See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to - combine images with respect to their alpha channels. - - :param im: Source image or pixel value (integer, float or tuple). - :param box: An optional 4-tuple giving the region to paste into. - If a 2-tuple is used instead, it's treated as the upper left - corner. If omitted or None, the source is pasted into the - upper left corner. - - If an image is given as the second argument and there is no - third, the box defaults to (0, 0), and the second argument - is interpreted as a mask image. - :param mask: An optional mask image. - """ - - if isinstance(box, Image): - if mask is not None: - msg = "If using second argument as mask, third argument must be None" - raise ValueError(msg) - # abbreviated paste(im, mask) syntax - mask = box - box = None - - if box is None: - box = (0, 0) - - if len(box) == 2: - # upper left corner given; get size from image or mask - if isinstance(im, Image): - size = im.size - elif isinstance(mask, Image): - size = mask.size - else: - # FIXME: use self.size here? - msg = "cannot determine region size; use 4-item box" - raise ValueError(msg) - box += (box[0] + size[0], box[1] + size[1]) - - source: core.ImagingCore | str | float | tuple[float, ...] - if isinstance(im, str): - from . import ImageColor - - source = ImageColor.getcolor(im, self.mode) - elif isinstance(im, Image): - im.load() - if self.mode != im.mode: - if self.mode != "RGB" or im.mode not in ("LA", "RGBA", "RGBa"): - # should use an adapter for this! - im = im.convert(self.mode) - source = im.im - else: - source = im - - self._ensure_mutable() - - if mask: - mask.load() - self.im.paste(source, box, mask.im) - else: - self.im.paste(source, box) - - def alpha_composite( - self, im: Image, dest: Sequence[int] = (0, 0), source: Sequence[int] = (0, 0) - ) -> None: - """'In-place' analog of Image.alpha_composite. Composites an image - onto this image. - - :param im: image to composite over this one - :param dest: Optional 2 tuple (left, top) specifying the upper - left corner in this (destination) image. - :param source: Optional 2 (left, top) tuple for the upper left - corner in the overlay source image, or 4 tuple (left, top, right, - bottom) for the bounds of the source rectangle - - Performance Note: Not currently implemented in-place in the core layer. - """ - - if not isinstance(source, (list, tuple)): - msg = "Source must be a list or tuple" - raise ValueError(msg) - if not isinstance(dest, (list, tuple)): - msg = "Destination must be a list or tuple" - raise ValueError(msg) - - if len(source) == 4: - overlay_crop_box = tuple(source) - elif len(source) == 2: - overlay_crop_box = tuple(source) + im.size - else: - msg = "Source must be a sequence of length 2 or 4" - raise ValueError(msg) - - if not len(dest) == 2: - msg = "Destination must be a sequence of length 2" - raise ValueError(msg) - if min(source) < 0: - msg = "Source must be non-negative" - raise ValueError(msg) - - # over image, crop if it's not the whole image. - if overlay_crop_box == (0, 0) + im.size: - overlay = im - else: - overlay = im.crop(overlay_crop_box) - - # target for the paste - box = tuple(dest) + (dest[0] + overlay.width, dest[1] + overlay.height) - - # destination image. don't copy if we're using the whole image. - if box == (0, 0) + self.size: - background = self - else: - background = self.crop(box) - - result = alpha_composite(background, overlay) - self.paste(result, box) - - def point( - self, - lut: ( - Sequence[float] - | NumpyArray - | Callable[[int], float] - | Callable[[ImagePointTransform], ImagePointTransform | float] - | ImagePointHandler - ), - mode: str | None = None, - ) -> Image: - """ - Maps this image through a lookup table or function. - - :param lut: A lookup table, containing 256 (or 65536 if - self.mode=="I" and mode == "L") values per band in the - image. A function can be used instead, it should take a - single argument. The function is called once for each - possible pixel value, and the resulting table is applied to - all bands of the image. - - It may also be an :py:class:`~PIL.Image.ImagePointHandler` - object:: - - class Example(Image.ImagePointHandler): - def point(self, im: Image) -> Image: - # Return result - :param mode: Output mode (default is same as input). This can only be used if - the source image has mode "L" or "P", and the output has mode "1" or the - source image mode is "I" and the output mode is "L". - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - self.load() - - if isinstance(lut, ImagePointHandler): - return lut.point(self) - - if callable(lut): - # if it isn't a list, it should be a function - if self.mode in ("I", "I;16", "F"): - # check if the function can be used with point_transform - # UNDONE wiredfool -- I think this prevents us from ever doing - # a gamma function point transform on > 8bit images. - scale, offset = _getscaleoffset(lut) # type: ignore[arg-type] - return self._new(self.im.point_transform(scale, offset)) - # for other modes, convert the function to a table - flatLut = [lut(i) for i in range(256)] * self.im.bands # type: ignore[arg-type] - else: - flatLut = lut - - if self.mode == "F": - # FIXME: _imaging returns a confusing error message for this case - msg = "point operation not supported for this mode" - raise ValueError(msg) - - if mode != "F": - flatLut = [round(i) for i in flatLut] - return self._new(self.im.point(flatLut, mode)) - - def putalpha(self, alpha: Image | int) -> None: - """ - Adds or replaces the alpha layer in this image. If the image - does not have an alpha layer, it's converted to "LA" or "RGBA". - The new layer must be either "L" or "1". - - :param alpha: The new alpha layer. This can either be an "L" or "1" - image having the same size as this image, or an integer. - """ - - self._ensure_mutable() - - if self.mode not in ("LA", "PA", "RGBA"): - # attempt to promote self to a matching alpha mode - try: - mode = getmodebase(self.mode) + "A" - try: - self.im.setmode(mode) - except (AttributeError, ValueError) as e: - # do things the hard way - im = self.im.convert(mode) - if im.mode not in ("LA", "PA", "RGBA"): - msg = "alpha channel could not be added" - raise ValueError(msg) from e # sanity check - self.im = im - self._mode = self.im.mode - except KeyError as e: - msg = "illegal image mode" - raise ValueError(msg) from e - - if self.mode in ("LA", "PA"): - band = 1 - else: - band = 3 - - if isinstance(alpha, Image): - # alpha layer - if alpha.mode not in ("1", "L"): - msg = "illegal image mode" - raise ValueError(msg) - alpha.load() - if alpha.mode == "1": - alpha = alpha.convert("L") - else: - # constant alpha - try: - self.im.fillband(band, alpha) - except (AttributeError, ValueError): - # do things the hard way - alpha = new("L", self.size, alpha) - else: - return - - self.im.putband(alpha.im, band) - - def putdata( - self, - data: Sequence[float] | Sequence[Sequence[int]] | core.ImagingCore | NumpyArray, - scale: float = 1.0, - offset: float = 0.0, - ) -> None: - """ - Copies pixel data from a flattened sequence object into the image. The - values should start at the upper left corner (0, 0), continue to the - end of the line, followed directly by the first value of the second - line, and so on. Data will be read until either the image or the - sequence ends. The scale and offset values are used to adjust the - sequence values: **pixel = value*scale + offset**. - - :param data: A flattened sequence object. - :param scale: An optional scale value. The default is 1.0. - :param offset: An optional offset value. The default is 0.0. - """ - - self._ensure_mutable() - - self.im.putdata(data, scale, offset) - - def putpalette( - self, - data: ImagePalette.ImagePalette | bytes | Sequence[int], - rawmode: str = "RGB", - ) -> None: - """ - Attaches a palette to this image. The image must be a "P", "PA", "L" - or "LA" image. - - The palette sequence must contain at most 256 colors, made up of one - integer value for each channel in the raw mode. - For example, if the raw mode is "RGB", then it can contain at most 768 - values, made up of red, green and blue values for the corresponding pixel - index in the 256 colors. - If the raw mode is "RGBA", then it can contain at most 1024 values, - containing red, green, blue and alpha values. - - Alternatively, an 8-bit string may be used instead of an integer sequence. - - :param data: A palette sequence (either a list or a string). - :param rawmode: The raw mode of the palette. Either "RGB", "RGBA", or a mode - that can be transformed to "RGB" or "RGBA" (e.g. "R", "BGR;15", "RGBA;L"). - """ - from . import ImagePalette - - if self.mode not in ("L", "LA", "P", "PA"): - msg = "illegal image mode" - raise ValueError(msg) - if isinstance(data, ImagePalette.ImagePalette): - if data.rawmode is not None: - palette = ImagePalette.raw(data.rawmode, data.palette) - else: - palette = ImagePalette.ImagePalette(palette=data.palette) - palette.dirty = 1 - else: - if not isinstance(data, bytes): - data = bytes(data) - palette = ImagePalette.raw(rawmode, data) - self._mode = "PA" if "A" in self.mode else "P" - self.palette = palette - self.palette.mode = "RGBA" if "A" in rawmode else "RGB" - self.load() # install new palette - - def putpixel( - self, xy: tuple[int, int], value: float | tuple[int, ...] | list[int] - ) -> None: - """ - Modifies the pixel at the given position. The color is given as - a single numerical value for single-band images, and a tuple for - multi-band images. In addition to this, RGB and RGBA tuples are - accepted for P and PA images. - - Note that this method is relatively slow. For more extensive changes, - use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` - module instead. - - See: - - * :py:meth:`~PIL.Image.Image.paste` - * :py:meth:`~PIL.Image.Image.putdata` - * :py:mod:`~PIL.ImageDraw` - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :param value: The pixel value. - """ - - if self.readonly: - self._copy() - self.load() - - if ( - self.mode in ("P", "PA") - and isinstance(value, (list, tuple)) - and len(value) in [3, 4] - ): - # RGB or RGBA value for a P or PA image - if self.mode == "PA": - alpha = value[3] if len(value) == 4 else 255 - value = value[:3] - assert self.palette is not None - palette_index = self.palette.getcolor(tuple(value), self) - value = (palette_index, alpha) if self.mode == "PA" else palette_index - return self.im.putpixel(xy, value) - - def remap_palette( - self, dest_map: list[int], source_palette: bytes | bytearray | None = None - ) -> Image: - """ - Rewrites the image to reorder the palette. - - :param dest_map: A list of indexes into the original palette. - e.g. ``[1,0]`` would swap a two item palette, and ``list(range(256))`` - is the identity transform. - :param source_palette: Bytes or None. - :returns: An :py:class:`~PIL.Image.Image` object. - - """ - from . import ImagePalette - - if self.mode not in ("L", "P"): - msg = "illegal image mode" - raise ValueError(msg) - - bands = 3 - palette_mode = "RGB" - if source_palette is None: - if self.mode == "P": - self.load() - palette_mode = self.im.getpalettemode() - if palette_mode == "RGBA": - bands = 4 - source_palette = self.im.getpalette(palette_mode, palette_mode) - else: # L-mode - source_palette = bytearray(i // 3 for i in range(768)) - elif len(source_palette) > 768: - bands = 4 - palette_mode = "RGBA" - - palette_bytes = b"" - new_positions = [0] * 256 - - # pick only the used colors from the palette - for i, oldPosition in enumerate(dest_map): - palette_bytes += source_palette[ - oldPosition * bands : oldPosition * bands + bands - ] - new_positions[oldPosition] = i - - # replace the palette color id of all pixel with the new id - - # Palette images are [0..255], mapped through a 1 or 3 - # byte/color map. We need to remap the whole image - # from palette 1 to palette 2. New_positions is - # an array of indexes into palette 1. Palette 2 is - # palette 1 with any holes removed. - - # We're going to leverage the convert mechanism to use the - # C code to remap the image from palette 1 to palette 2, - # by forcing the source image into 'L' mode and adding a - # mapping 'L' mode palette, then converting back to 'L' - # sans palette thus converting the image bytes, then - # assigning the optimized RGB palette. - - # perf reference, 9500x4000 gif, w/~135 colors - # 14 sec prepatch, 1 sec postpatch with optimization forced. - - mapping_palette = bytearray(new_positions) - - m_im = self.copy() - m_im._mode = "P" - - m_im.palette = ImagePalette.ImagePalette( - palette_mode, palette=mapping_palette * bands - ) - # possibly set palette dirty, then - # m_im.putpalette(mapping_palette, 'L') # converts to 'P' - # or just force it. - # UNDONE -- this is part of the general issue with palettes - m_im.im.putpalette(palette_mode, palette_mode + ";L", m_im.palette.tobytes()) - - m_im = m_im.convert("L") - - m_im.putpalette(palette_bytes, palette_mode) - m_im.palette = ImagePalette.ImagePalette(palette_mode, palette=palette_bytes) - - if "transparency" in self.info: - try: - m_im.info["transparency"] = dest_map.index(self.info["transparency"]) - except ValueError: - if "transparency" in m_im.info: - del m_im.info["transparency"] - - return m_im - - def _get_safe_box( - self, - size: tuple[int, int], - resample: Resampling, - box: tuple[float, float, float, float], - ) -> tuple[int, int, int, int]: - """Expands the box so it includes adjacent pixels - that may be used by resampling with the given resampling filter. - """ - filter_support = _filters_support[resample] - 0.5 - scale_x = (box[2] - box[0]) / size[0] - scale_y = (box[3] - box[1]) / size[1] - support_x = filter_support * scale_x - support_y = filter_support * scale_y - - return ( - max(0, int(box[0] - support_x)), - max(0, int(box[1] - support_y)), - min(self.size[0], math.ceil(box[2] + support_x)), - min(self.size[1], math.ceil(box[3] + support_y)), - ) - - def resize( - self, - size: tuple[int, int] | list[int] | NumpyArray, - resample: int | None = None, - box: tuple[float, float, float, float] | None = None, - reducing_gap: float | None = None, - ) -> Image: - """ - Returns a resized copy of this image. - - :param size: The requested size in pixels, as a tuple or array: - (width, height). - :param resample: An optional resampling filter. This can be - one of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, - :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, - :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. - If the image has mode "1" or "P", it is always set to - :py:data:`Resampling.NEAREST`. If the image mode is "BGR;15", - "BGR;16" or "BGR;24", then the default filter is - :py:data:`Resampling.NEAREST`. Otherwise, the default filter is - :py:data:`Resampling.BICUBIC`. See: :ref:`concept-filters`. - :param box: An optional 4-tuple of floats providing - the source image region to be scaled. - The values must be within (0, 0, width, height) rectangle. - If omitted or None, the entire source is used. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce`. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is None (no optimization). - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if resample is None: - bgr = self.mode.startswith("BGR;") - resample = Resampling.NEAREST if bgr else Resampling.BICUBIC - elif resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - Resampling.LANCZOS, - Resampling.BOX, - Resampling.HAMMING, - ): - msg = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.LANCZOS, "Image.Resampling.LANCZOS"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - (Resampling.BOX, "Image.Resampling.BOX"), - (Resampling.HAMMING, "Image.Resampling.HAMMING"), - ) - ] - msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" - raise ValueError(msg) - - if reducing_gap is not None and reducing_gap < 1.0: - msg = "reducing_gap must be 1.0 or greater" - raise ValueError(msg) - - if box is None: - box = (0, 0) + self.size - - size = tuple(size) - if self.size == size and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ("1", "P"): - resample = Resampling.NEAREST - - if self.mode in ["LA", "RGBA"] and resample != Resampling.NEAREST: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.resize(size, resample, box) - return im.convert(self.mode) - - self.load() - - if reducing_gap is not None and resample != Resampling.NEAREST: - factor_x = int((box[2] - box[0]) / size[0] / reducing_gap) or 1 - factor_y = int((box[3] - box[1]) / size[1] / reducing_gap) or 1 - if factor_x > 1 or factor_y > 1: - reduce_box = self._get_safe_box(size, cast(Resampling, resample), box) - factor = (factor_x, factor_y) - self = ( - self.reduce(factor, box=reduce_box) - if callable(self.reduce) - else Image.reduce(self, factor, box=reduce_box) - ) - box = ( - (box[0] - reduce_box[0]) / factor_x, - (box[1] - reduce_box[1]) / factor_y, - (box[2] - reduce_box[0]) / factor_x, - (box[3] - reduce_box[1]) / factor_y, - ) - - return self._new(self.im.resize(size, resample, box)) - - def reduce( - self, - factor: int | tuple[int, int], - box: tuple[int, int, int, int] | None = None, - ) -> Image: - """ - Returns a copy of the image reduced ``factor`` times. - If the size of the image is not dividable by ``factor``, - the resulting size will be rounded up. - - :param factor: A greater than 0 integer or tuple of two integers - for width and height separately. - :param box: An optional 4-tuple of ints providing - the source image region to be reduced. - The values must be within ``(0, 0, width, height)`` rectangle. - If omitted or ``None``, the entire source is used. - """ - if not isinstance(factor, (list, tuple)): - factor = (factor, factor) - - if box is None: - box = (0, 0) + self.size - - if factor == (1, 1) and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ["LA", "RGBA"]: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.reduce(factor, box) - return im.convert(self.mode) - - self.load() - - return self._new(self.im.reduce(factor, box)) - - def rotate( - self, - angle: float, - resample: Resampling = Resampling.NEAREST, - expand: int | bool = False, - center: tuple[float, float] | None = None, - translate: tuple[int, int] | None = None, - fillcolor: float | tuple[float, ...] | str | None = None, - ) -> Image: - """ - Returns a rotated copy of this image. This method returns a - copy of this image, rotated the given number of degrees counter - clockwise around its centre. - - :param angle: In degrees counter clockwise. - :param resample: An optional resampling filter. This can be - one of :py:data:`Resampling.NEAREST` (use nearest neighbour), - :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`Resampling.BICUBIC` (cubic spline - interpolation in a 4x4 environment). If omitted, or if the image has - mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. - See :ref:`concept-filters`. - :param expand: Optional expansion flag. If true, expands the output - image to make it large enough to hold the entire rotated image. - If false or omitted, make the output image the same size as the - input image. Note that the expand flag assumes rotation around - the center and no translation. - :param center: Optional center of rotation (a 2-tuple). Origin is - the upper left corner. Default is the center of the image. - :param translate: An optional post-rotate translation (a 2-tuple). - :param fillcolor: An optional color for area outside the rotated image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - angle = angle % 360.0 - - # Fast paths regardless of filter, as long as we're not - # translating or changing the center. - if not (center or translate): - if angle == 0: - return self.copy() - if angle == 180: - return self.transpose(Transpose.ROTATE_180) - if angle in (90, 270) and (expand or self.width == self.height): - return self.transpose( - Transpose.ROTATE_90 if angle == 90 else Transpose.ROTATE_270 - ) - - # Calculate the affine matrix. Note that this is the reverse - # transformation (from destination image to source) because we - # want to interpolate the (discrete) destination pixel from - # the local area around the (floating) source pixel. - - # The matrix we actually want (note that it operates from the right): - # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) - # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) - # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) - - # The reverse matrix is thus: - # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) - # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) - # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) - - # In any case, the final translation may be updated at the end to - # compensate for the expand flag. - - w, h = self.size - - if translate is None: - post_trans = (0, 0) - else: - post_trans = translate - if center is None: - center = (w / 2, h / 2) - - angle = -math.radians(angle) - matrix = [ - round(math.cos(angle), 15), - round(math.sin(angle), 15), - 0.0, - round(-math.sin(angle), 15), - round(math.cos(angle), 15), - 0.0, - ] - - def transform(x: float, y: float, matrix: list[float]) -> tuple[float, float]: - (a, b, c, d, e, f) = matrix - return a * x + b * y + c, d * x + e * y + f - - matrix[2], matrix[5] = transform( - -center[0] - post_trans[0], -center[1] - post_trans[1], matrix - ) - matrix[2] += center[0] - matrix[5] += center[1] - - if expand: - # calculate output size - xx = [] - yy = [] - for x, y in ((0, 0), (w, 0), (w, h), (0, h)): - transformed_x, transformed_y = transform(x, y, matrix) - xx.append(transformed_x) - yy.append(transformed_y) - nw = math.ceil(max(xx)) - math.floor(min(xx)) - nh = math.ceil(max(yy)) - math.floor(min(yy)) - - # We multiply a translation matrix from the right. Because of its - # special form, this is the same as taking the image of the - # translation vector as new translation vector. - matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) - w, h = nw, nh - - return self.transform( - (w, h), Transform.AFFINE, matrix, resample, fillcolor=fillcolor - ) - - def save( - self, fp: StrOrBytesPath | IO[bytes], format: str | None = None, **params: Any - ) -> None: - """ - Saves this image under the given filename. If no format is - specified, the format to use is determined from the filename - extension, if possible. - - Keyword options can be used to provide additional instructions - to the writer. If a writer doesn't recognise an option, it is - silently ignored. The available options are described in the - :doc:`image format documentation - <../handbook/image-file-formats>` for each writer. - - You can use a file object instead of a filename. In this case, - you must always specify the format. The file object must - implement the ``seek``, ``tell``, and ``write`` - methods, and be opened in binary mode. - - :param fp: A filename (string), os.PathLike object or file object. - :param format: Optional format override. If omitted, the - format to use is determined from the filename extension. - If a file object was used instead of a filename, this - parameter should always be used. - :param params: Extra parameters to the image writer. These can also be - set on the image itself through ``encoderinfo``. This is useful when - saving multiple images:: - - # Saving XMP data to a single image - from PIL import Image - red = Image.new("RGB", (1, 1), "#f00") - red.save("out.mpo", xmp=b"test") - - # Saving XMP data to the second frame of an image - from PIL import Image - black = Image.new("RGB", (1, 1)) - red = Image.new("RGB", (1, 1), "#f00") - red.encoderinfo = {"xmp": b"test"} - black.save("out.mpo", save_all=True, append_images=[red]) - :returns: None - :exception ValueError: If the output format could not be determined - from the file name. Use the format option to solve this. - :exception OSError: If the file could not be written. The file - may have been created, and may contain partial data. - """ - - filename: str | bytes = "" - open_fp = False - if is_path(fp): - filename = os.fspath(fp) - open_fp = True - elif fp == sys.stdout: - try: - fp = sys.stdout.buffer - except AttributeError: - pass - if not filename and hasattr(fp, "name") and is_path(fp.name): - # only set the name for metadata purposes - filename = os.fspath(fp.name) - - preinit() - - filename_ext = os.path.splitext(filename)[1].lower() - ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext - - if not format: - if ext not in EXTENSION: - init() - try: - format = EXTENSION[ext] - except KeyError as e: - msg = f"unknown file extension: {ext}" - raise ValueError(msg) from e - - from . import ImageFile - - # may mutate self! - if isinstance(self, ImageFile.ImageFile) and os.path.abspath( - filename - ) == os.path.abspath(self.filename): - self._ensure_mutable() - else: - self.load() - - save_all = params.pop("save_all", None) - self.encoderinfo = {**getattr(self, "encoderinfo", {}), **params} - self.encoderconfig: tuple[Any, ...] = () - - if format.upper() not in SAVE: - init() - if save_all or ( - save_all is None - and params.get("append_images") - and format.upper() in SAVE_ALL - ): - save_handler = SAVE_ALL[format.upper()] - else: - save_handler = SAVE[format.upper()] - - created = False - if open_fp: - created = not os.path.exists(filename) - if params.get("append", False): - # Open also for reading ("+"), because TIFF save_all - # writer needs to go back and edit the written data. - fp = builtins.open(filename, "r+b") - else: - fp = builtins.open(filename, "w+b") - else: - fp = cast(IO[bytes], fp) - - try: - save_handler(self, fp, filename) - except Exception: - if open_fp: - fp.close() - if created: - try: - os.remove(filename) - except PermissionError: - pass - raise - finally: - try: - del self.encoderinfo - except AttributeError: - pass - if open_fp: - fp.close() - - def seek(self, frame: int) -> None: - """ - Seeks to the given frame in this sequence file. If you seek - beyond the end of the sequence, the method raises an - ``EOFError`` exception. When a sequence file is opened, the - library automatically seeks to frame 0. - - See :py:meth:`~PIL.Image.Image.tell`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :param frame: Frame number, starting at 0. - :exception EOFError: If the call attempts to seek beyond the end - of the sequence. - """ - - # overridden by file handlers - if frame != 0: - msg = "no more images in file" - raise EOFError(msg) - - def show(self, title: str | None = None) -> None: - """ - Displays this image. This method is mainly intended for debugging purposes. - - This method calls :py:func:`PIL.ImageShow.show` internally. You can use - :py:func:`PIL.ImageShow.register` to override its default behaviour. - - The image is first saved to a temporary file. By default, it will be in - PNG format. - - On Unix, the image is then opened using the **xdg-open**, **display**, - **gm**, **eog** or **xv** utility, depending on which one can be found. - - On macOS, the image is opened with the native Preview application. - - On Windows, the image is opened with the standard PNG display utility. - - :param title: Optional title to use for the image window, where possible. - """ - - _show(self, title=title) - - def split(self) -> tuple[Image, ...]: - """ - Split this image into individual bands. This method returns a - tuple of individual image bands from an image. For example, - splitting an "RGB" image creates three new images each - containing a copy of one of the original bands (red, green, - blue). - - If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` - method can be more convenient and faster. - - :returns: A tuple containing bands. - """ - - self.load() - if self.im.bands == 1: - return (self.copy(),) - return tuple(map(self._new, self.im.split())) - - def getchannel(self, channel: int | str) -> Image: - """ - Returns an image containing a single channel of the source image. - - :param channel: What channel to return. Could be index - (0 for "R" channel of "RGB") or channel name - ("A" for alpha channel of "RGBA"). - :returns: An image in "L" mode. - - .. versionadded:: 4.3.0 - """ - self.load() - - if isinstance(channel, str): - try: - channel = self.getbands().index(channel) - except ValueError as e: - msg = f'The image has no channel "{channel}"' - raise ValueError(msg) from e - - return self._new(self.im.getband(channel)) - - def tell(self) -> int: - """ - Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :returns: Frame number, starting with 0. - """ - return 0 - - def thumbnail( - self, - size: tuple[float, float], - resample: Resampling = Resampling.BICUBIC, - reducing_gap: float | None = 2.0, - ) -> None: - """ - Make this image into a thumbnail. This method modifies the - image to contain a thumbnail version of itself, no larger than - the given size. This method calculates an appropriate thumbnail - size to preserve the aspect of the image, calls the - :py:meth:`~PIL.Image.Image.draft` method to configure the file reader - (where applicable), and finally resizes the image. - - Note that this function modifies the :py:class:`~PIL.Image.Image` - object in place. If you need to use the full resolution image as well, - apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original - image. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param resample: Optional resampling filter. This can be one - of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, - :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, - :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. - If omitted, it defaults to :py:data:`Resampling.BICUBIC`. - (was :py:data:`Resampling.NEAREST` prior to version 2.5.0). - See: :ref:`concept-filters`. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce` or - :py:meth:`~PIL.Image.Image.draft` for JPEG images. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is 2.0 (very close to fair resampling - while still being faster in many cases). - :returns: None - """ - - provided_size = tuple(map(math.floor, size)) - - def preserve_aspect_ratio() -> tuple[int, int] | None: - def round_aspect(number: float, key: Callable[[int], float]) -> int: - return max(min(math.floor(number), math.ceil(number), key=key), 1) - - x, y = provided_size - if x >= self.width and y >= self.height: - return None - - aspect = self.width / self.height - if x / y >= aspect: - x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y)) - else: - y = round_aspect( - x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n) - ) - return x, y - - preserved_size = preserve_aspect_ratio() - if preserved_size is None: - return - final_size = preserved_size - - box = None - if reducing_gap is not None: - res = self.draft( - None, (int(size[0] * reducing_gap), int(size[1] * reducing_gap)) - ) - if res is not None: - box = res[1] - - if self.size != final_size: - im = self.resize(final_size, resample, box=box, reducing_gap=reducing_gap) - - self.im = im.im - self._size = final_size - self._mode = self.im.mode - - self.readonly = 0 - - # FIXME: the different transform methods need further explanation - # instead of bloating the method docs, add a separate chapter. - def transform( - self, - size: tuple[int, int], - method: Transform | ImageTransformHandler | SupportsGetData, - data: Sequence[Any] | None = None, - resample: int = Resampling.NEAREST, - fill: int = 1, - fillcolor: float | tuple[float, ...] | str | None = None, - ) -> Image: - """ - Transforms this image. This method creates a new image with the - given size, and the same mode as the original, and copies data - to the new image using the given transform. - - :param size: The output size in pixels, as a 2-tuple: - (width, height). - :param method: The transformation method. This is one of - :py:data:`Transform.EXTENT` (cut out a rectangular subregion), - :py:data:`Transform.AFFINE` (affine transform), - :py:data:`Transform.PERSPECTIVE` (perspective transform), - :py:data:`Transform.QUAD` (map a quadrilateral to a rectangle), or - :py:data:`Transform.MESH` (map a number of source quadrilaterals - in one operation). - - It may also be an :py:class:`~PIL.Image.ImageTransformHandler` - object:: - - class Example(Image.ImageTransformHandler): - def transform(self, size, data, resample, fill=1): - # Return result - - Implementations of :py:class:`~PIL.Image.ImageTransformHandler` - for some of the :py:class:`Transform` methods are provided - in :py:mod:`~PIL.ImageTransform`. - - It may also be an object with a ``method.getdata`` method - that returns a tuple supplying new ``method`` and ``data`` values:: - - class Example: - def getdata(self): - method = Image.Transform.EXTENT - data = (0, 0, 100, 100) - return method, data - :param data: Extra data to the transformation method. - :param resample: Optional resampling filter. It can be one of - :py:data:`Resampling.NEAREST` (use nearest neighbour), - :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`Resampling.BICUBIC` (cubic spline - interpolation in a 4x4 environment). If omitted, or if the image - has mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. - See: :ref:`concept-filters`. - :param fill: If ``method`` is an - :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of - the arguments passed to it. Otherwise, it is unused. - :param fillcolor: Optional fill color for the area outside the - transform in the output image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if self.mode in ("LA", "RGBA") and resample != Resampling.NEAREST: - return ( - self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - .transform(size, method, data, resample, fill, fillcolor) - .convert(self.mode) - ) - - if isinstance(method, ImageTransformHandler): - return method.transform(size, self, resample=resample, fill=fill) - - if hasattr(method, "getdata"): - # compatibility w. old-style transform objects - method, data = method.getdata() - - if data is None: - msg = "missing method data" - raise ValueError(msg) - - im = new(self.mode, size, fillcolor) - if self.mode == "P" and self.palette: - im.palette = self.palette.copy() - im.info = self.info.copy() - if method == Transform.MESH: - # list of quads - for box, quad in data: - im.__transformer( - box, self, Transform.QUAD, quad, resample, fillcolor is None - ) - else: - im.__transformer( - (0, 0) + size, self, method, data, resample, fillcolor is None - ) - - return im - - def __transformer( - self, - box: tuple[int, int, int, int], - image: Image, - method: Transform, - data: Sequence[float], - resample: int = Resampling.NEAREST, - fill: bool = True, - ) -> None: - w = box[2] - box[0] - h = box[3] - box[1] - - if method == Transform.AFFINE: - data = data[:6] - - elif method == Transform.EXTENT: - # convert extent to an affine transform - x0, y0, x1, y1 = data - xs = (x1 - x0) / w - ys = (y1 - y0) / h - method = Transform.AFFINE - data = (xs, 0, x0, 0, ys, y0) - - elif method == Transform.PERSPECTIVE: - data = data[:8] - - elif method == Transform.QUAD: - # quadrilateral warp. data specifies the four corners - # given as NW, SW, SE, and NE. - nw = data[:2] - sw = data[2:4] - se = data[4:6] - ne = data[6:8] - x0, y0 = nw - As = 1.0 / w - At = 1.0 / h - data = ( - x0, - (ne[0] - x0) * As, - (sw[0] - x0) * At, - (se[0] - sw[0] - ne[0] + x0) * As * At, - y0, - (ne[1] - y0) * As, - (sw[1] - y0) * At, - (se[1] - sw[1] - ne[1] + y0) * As * At, - ) - - else: - msg = "unknown transformation method" - raise ValueError(msg) - - if resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - ): - if resample in (Resampling.BOX, Resampling.HAMMING, Resampling.LANCZOS): - unusable: dict[int, str] = { - Resampling.BOX: "Image.Resampling.BOX", - Resampling.HAMMING: "Image.Resampling.HAMMING", - Resampling.LANCZOS: "Image.Resampling.LANCZOS", - } - msg = unusable[resample] + f" ({resample}) cannot be used." - else: - msg = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - ) - ] - msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" - raise ValueError(msg) - - image.load() - - self.load() - - if image.mode in ("1", "P"): - resample = Resampling.NEAREST - - self.im.transform(box, image.im, method, data, resample, fill) - - def transpose(self, method: Transpose) -> Image: - """ - Transpose image (flip or rotate in 90 degree steps) - - :param method: One of :py:data:`Transpose.FLIP_LEFT_RIGHT`, - :py:data:`Transpose.FLIP_TOP_BOTTOM`, :py:data:`Transpose.ROTATE_90`, - :py:data:`Transpose.ROTATE_180`, :py:data:`Transpose.ROTATE_270`, - :py:data:`Transpose.TRANSPOSE` or :py:data:`Transpose.TRANSVERSE`. - :returns: Returns a flipped or rotated copy of this image. - """ - - self.load() - return self._new(self.im.transpose(method)) - - def effect_spread(self, distance: int) -> Image: - """ - Randomly spread pixels in an image. - - :param distance: Distance to spread pixels. - """ - self.load() - return self._new(self.im.effect_spread(distance)) - - def toqimage(self) -> ImageQt.ImageQt: - """Returns a QImage copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.toqimage(self) - - def toqpixmap(self) -> ImageQt.QPixmap: - """Returns a QPixmap copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.toqpixmap(self) - - -# -------------------------------------------------------------------- -# Abstract handlers. - - -class ImagePointHandler(abc.ABC): - """ - Used as a mixin by point transforms - (for use with :py:meth:`~PIL.Image.Image.point`) - """ - - @abc.abstractmethod - def point(self, im: Image) -> Image: - pass - - -class ImageTransformHandler(abc.ABC): - """ - Used as a mixin by geometry transforms - (for use with :py:meth:`~PIL.Image.Image.transform`) - """ - - @abc.abstractmethod - def transform( - self, - size: tuple[int, int], - image: Image, - **options: Any, - ) -> Image: - pass - - -# -------------------------------------------------------------------- -# Factories - - -def _check_size(size: Any) -> None: - """ - Common check to enforce type and sanity check on size tuples - - :param size: Should be a 2 tuple of (width, height) - :returns: None, or raises a ValueError - """ - - if not isinstance(size, (list, tuple)): - msg = "Size must be a list or tuple" - raise ValueError(msg) - if len(size) != 2: - msg = "Size must be a sequence of length 2" - raise ValueError(msg) - if size[0] < 0 or size[1] < 0: - msg = "Width and height must be >= 0" - raise ValueError(msg) - - -def new( - mode: str, - size: tuple[int, int] | list[int], - color: float | tuple[float, ...] | str | None = 0, -) -> Image: - """ - Creates a new image with the given mode and size. - - :param mode: The mode to use for the new image. See: - :ref:`concept-modes`. - :param size: A 2-tuple, containing (width, height) in pixels. - :param color: What color to use for the image. Default is black. - If given, this should be a single integer or floating point value - for single-band modes, and a tuple for multi-band modes (one value - per band). When creating RGB or HSV images, you can also use color - strings as supported by the ImageColor module. If the color is - None, the image is not initialised. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - - _check_size(size) - - if color is None: - # don't initialize - return Image()._new(core.new(mode, size)) - - if isinstance(color, str): - # css3-style specifier - - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - - im = Image() - if ( - mode == "P" - and isinstance(color, (list, tuple)) - and all(isinstance(i, int) for i in color) - ): - color_ints: tuple[int, ...] = cast(tuple[int, ...], tuple(color)) - if len(color_ints) == 3 or len(color_ints) == 4: - # RGB or RGBA value for a P image - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette() - color = im.palette.getcolor(color_ints) - return im._new(core.fill(mode, size, color)) - - -def frombytes( - mode: str, - size: tuple[int, int], - data: bytes | bytearray | SupportsArrayInterface, - decoder_name: str = "raw", - *args: Any, -) -> Image: - """ - Creates a copy of an image memory from pixel data in a buffer. - - In its simplest form, this function takes three arguments - (mode, size, and unpacked pixel data). - - You can also use any pixel decoder supported by PIL. For more - information on available decoders, see the section - :ref:`Writing Your Own File Codec `. - - Note that this function decodes pixel data only, not entire images. - If you have an entire image in a string, wrap it in a - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load - it. - - :param mode: The image mode. See: :ref:`concept-modes`. - :param size: The image size. - :param data: A byte buffer containing raw data for the given mode. - :param decoder_name: What decoder to use. - :param args: Additional parameters for the given decoder. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - _check_size(size) - - im = new(mode, size) - if im.width != 0 and im.height != 0: - decoder_args: Any = args - if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): - # may pass tuple instead of argument list - decoder_args = decoder_args[0] - - if decoder_name == "raw" and decoder_args == (): - decoder_args = mode - - im.frombytes(data, decoder_name, decoder_args) - return im - - -def frombuffer( - mode: str, - size: tuple[int, int], - data: bytes | SupportsArrayInterface, - decoder_name: str = "raw", - *args: Any, -) -> Image: - """ - Creates an image memory referencing pixel data in a byte buffer. - - This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data - in the byte buffer, where possible. This means that changes to the - original buffer object are reflected in this image). Not all modes can - share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". - - Note that this function decodes pixel data only, not entire images. - If you have an entire image file in a string, wrap it in a - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. - - The default parameters used for the "raw" decoder differs from that used for - :py:func:`~PIL.Image.frombytes`. This is a bug, and will probably be fixed in a - future release. The current release issues a warning if you do this; to disable - the warning, you should provide the full set of parameters. See below for details. - - :param mode: The image mode. See: :ref:`concept-modes`. - :param size: The image size. - :param data: A bytes or other buffer object containing raw - data for the given mode. - :param decoder_name: What decoder to use. - :param args: Additional parameters for the given decoder. For the - default encoder ("raw"), it's recommended that you provide the - full set of parameters:: - - frombuffer(mode, size, data, "raw", mode, 0, 1) - - :returns: An :py:class:`~PIL.Image.Image` object. - - .. versionadded:: 1.1.4 - """ - - _check_size(size) - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if decoder_name == "raw": - if args == (): - args = mode, 0, 1 - if args[0] in _MAPMODES: - im = new(mode, (0, 0)) - im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) - if mode == "P": - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette("RGB", im.im.getpalette("RGB")) - im.readonly = 1 - return im - - return frombytes(mode, size, data, decoder_name, args) - - -class SupportsArrayInterface(Protocol): - """ - An object that has an ``__array_interface__`` dictionary. - """ - - @property - def __array_interface__(self) -> dict[str, Any]: - raise NotImplementedError() - - -class SupportsArrowArrayInterface(Protocol): - """ - An object that has an ``__arrow_c_array__`` method corresponding to the arrow c - data interface. - """ - - def __arrow_c_array__( - self, requested_schema: "PyCapsule" = None # type: ignore[name-defined] # noqa: F821, UP037 - ) -> tuple["PyCapsule", "PyCapsule"]: # type: ignore[name-defined] # noqa: F821, UP037 - raise NotImplementedError() - - -def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: - """ - Creates an image memory from an object exporting the array interface - (using the buffer protocol):: - - from PIL import Image - import numpy as np - a = np.zeros((5, 5)) - im = Image.fromarray(a) - - If ``obj`` is not contiguous, then the ``tobytes`` method is called - and :py:func:`~PIL.Image.frombuffer` is used. - - In the case of NumPy, be aware that Pillow modes do not always correspond - to NumPy dtypes. Pillow modes only offer 1-bit pixels, 8-bit pixels, - 32-bit signed integer pixels, and 32-bit floating point pixels. - - Pillow images can also be converted to arrays:: - - from PIL import Image - import numpy as np - im = Image.open("hopper.jpg") - a = np.asarray(im) - - When converting Pillow images to arrays however, only pixel values are - transferred. This means that P and PA mode images will lose their palette. - - :param obj: Object with array interface - :param mode: Optional mode to use when reading ``obj``. Will be determined from - type if ``None``. - - This will not be used to convert the data after reading, but will be used to - change how the data is read:: - - from PIL import Image - import numpy as np - a = np.full((1, 1), 300) - im = Image.fromarray(a, mode="L") - im.getpixel((0, 0)) # 44 - im = Image.fromarray(a, mode="RGB") - im.getpixel((0, 0)) # (44, 1, 0) - - See: :ref:`concept-modes` for general information about modes. - :returns: An image object. - - .. versionadded:: 1.1.6 - """ - arr = obj.__array_interface__ - shape = arr["shape"] - ndim = len(shape) - strides = arr.get("strides", None) - if mode is None: - try: - typekey = (1, 1) + shape[2:], arr["typestr"] - except KeyError as e: - msg = "Cannot handle this data type" - raise TypeError(msg) from e - try: - mode, rawmode = _fromarray_typemap[typekey] - except KeyError as e: - typekey_shape, typestr = typekey - msg = f"Cannot handle this data type: {typekey_shape}, {typestr}" - raise TypeError(msg) from e - else: - rawmode = mode - if mode in ["1", "L", "I", "P", "F"]: - ndmax = 2 - elif mode == "RGB": - ndmax = 3 - else: - ndmax = 4 - if ndim > ndmax: - msg = f"Too many dimensions: {ndim} > {ndmax}." - raise ValueError(msg) - - size = 1 if ndim == 1 else shape[1], shape[0] - if strides is not None: - if hasattr(obj, "tobytes"): - obj = obj.tobytes() - elif hasattr(obj, "tostring"): - obj = obj.tostring() - else: - msg = "'strides' requires either tobytes() or tostring()" - raise ValueError(msg) - - return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) - - -def fromarrow( - obj: SupportsArrowArrayInterface, mode: str, size: tuple[int, int] -) -> Image: - """Creates an image with zero-copy shared memory from an object exporting - the arrow_c_array interface protocol:: - - from PIL import Image - import pyarrow as pa - arr = pa.array([0]*(5*5*4), type=pa.uint8()) - im = Image.fromarrow(arr, 'RGBA', (5, 5)) - - If the data representation of the ``obj`` is not compatible with - Pillow internal storage, a ValueError is raised. - - Pillow images can also be converted to Arrow objects:: - - from PIL import Image - import pyarrow as pa - im = Image.open('hopper.jpg') - arr = pa.array(im) - - As with array support, when converting Pillow images to arrays, - only pixel values are transferred. This means that P and PA mode - images will lose their palette. - - :param obj: Object with an arrow_c_array interface - :param mode: Image mode. - :param size: Image size. This must match the storage of the arrow object. - :returns: An Image object - - Note that according to the Arrow spec, both the producer and the - consumer should consider the exported array to be immutable, as - unsynchronized updates will potentially cause inconsistent data. - - See: :ref:`arrow-support` for more detailed information - - .. versionadded:: 11.2.1 - - """ - if not hasattr(obj, "__arrow_c_array__"): - msg = "arrow_c_array interface not found" - raise ValueError(msg) - - (schema_capsule, array_capsule) = obj.__arrow_c_array__() - _im = core.new_arrow(mode, size, schema_capsule, array_capsule) - if _im: - return Image()._new(_im) - - msg = "new_arrow returned None without an exception" - raise ValueError(msg) - - -def fromqimage(im: ImageQt.QImage) -> ImageFile.ImageFile: - """Creates an image instance from a QImage image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.fromqimage(im) - - -def fromqpixmap(im: ImageQt.QPixmap) -> ImageFile.ImageFile: - """Creates an image instance from a QPixmap image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.fromqpixmap(im) - - -_fromarray_typemap = { - # (shape, typestr) => mode, rawmode - # first two members of shape are set to one - ((1, 1), "|b1"): ("1", "1;8"), - ((1, 1), "|u1"): ("L", "L"), - ((1, 1), "|i1"): ("I", "I;8"), - ((1, 1), "u2"): ("I", "I;16B"), - ((1, 1), "i2"): ("I", "I;16BS"), - ((1, 1), "u4"): ("I", "I;32B"), - ((1, 1), "i4"): ("I", "I;32BS"), - ((1, 1), "f4"): ("F", "F;32BF"), - ((1, 1), "f8"): ("F", "F;64BF"), - ((1, 1, 2), "|u1"): ("LA", "LA"), - ((1, 1, 3), "|u1"): ("RGB", "RGB"), - ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), - # shortcuts: - ((1, 1), f"{_ENDIAN}i4"): ("I", "I"), - ((1, 1), f"{_ENDIAN}f4"): ("F", "F"), -} - - -def _decompression_bomb_check(size: tuple[int, int]) -> None: - if MAX_IMAGE_PIXELS is None: - return - - pixels = max(1, size[0]) * max(1, size[1]) - - if pixels > 2 * MAX_IMAGE_PIXELS: - msg = ( - f"Image size ({pixels} pixels) exceeds limit of {2 * MAX_IMAGE_PIXELS} " - "pixels, could be decompression bomb DOS attack." - ) - raise DecompressionBombError(msg) - - if pixels > MAX_IMAGE_PIXELS: - warnings.warn( - f"Image size ({pixels} pixels) exceeds limit of {MAX_IMAGE_PIXELS} pixels, " - "could be decompression bomb DOS attack.", - DecompressionBombWarning, - ) - - -def open( - fp: StrOrBytesPath | IO[bytes], - mode: Literal["r"] = "r", - formats: list[str] | tuple[str, ...] | None = None, -) -> ImageFile.ImageFile: - """ - Opens and identifies the given image file. - - This is a lazy operation; this function identifies the file, but - the file remains open and the actual image data is not read from - the file until you try to process the data (or call the - :py:meth:`~PIL.Image.Image.load` method). See - :py:func:`~PIL.Image.new`. See :ref:`file-handling`. - - :param fp: A filename (string), os.PathLike object or a file object. - The file object must implement ``file.read``, - ``file.seek``, and ``file.tell`` methods, - and be opened in binary mode. The file object will also seek to zero - before reading. - :param mode: The mode. If given, this argument must be "r". - :param formats: A list or tuple of formats to attempt to load the file in. - This can be used to restrict the set of formats checked. - Pass ``None`` to try all supported formats. You can print the set of - available formats by running ``python3 -m PIL`` or using - the :py:func:`PIL.features.pilinfo` function. - :returns: An :py:class:`~PIL.Image.Image` object. - :exception FileNotFoundError: If the file cannot be found. - :exception PIL.UnidentifiedImageError: If the image cannot be opened and - identified. - :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` - instance is used for ``fp``. - :exception TypeError: If ``formats`` is not ``None``, a list or a tuple. - """ - - if mode != "r": - msg = f"bad mode {repr(mode)}" # type: ignore[unreachable] - raise ValueError(msg) - elif isinstance(fp, io.StringIO): - msg = ( # type: ignore[unreachable] - "StringIO cannot be used to open an image. " - "Binary data must be used instead." - ) - raise ValueError(msg) - - if formats is None: - formats = ID - elif not isinstance(formats, (list, tuple)): - msg = "formats must be a list or tuple" # type: ignore[unreachable] - raise TypeError(msg) - - exclusive_fp = False - filename: str | bytes = "" - if is_path(fp): - filename = os.fspath(fp) - - if filename: - fp = builtins.open(filename, "rb") - exclusive_fp = True - else: - fp = cast(IO[bytes], fp) - - try: - fp.seek(0) - except (AttributeError, io.UnsupportedOperation): - fp = io.BytesIO(fp.read()) - exclusive_fp = True - - prefix = fp.read(16) - - preinit() - - warning_messages: list[str] = [] - - def _open_core( - fp: IO[bytes], - filename: str | bytes, - prefix: bytes, - formats: list[str] | tuple[str, ...], - ) -> ImageFile.ImageFile | None: - for i in formats: - i = i.upper() - if i not in OPEN: - init() - try: - factory, accept = OPEN[i] - result = not accept or accept(prefix) - if isinstance(result, str): - warning_messages.append(result) - elif result: - fp.seek(0) - im = factory(fp, filename) - _decompression_bomb_check(im.size) - return im - except (SyntaxError, IndexError, TypeError, struct.error) as e: - if WARN_POSSIBLE_FORMATS: - warning_messages.append(i + " opening failed. " + str(e)) - except BaseException: - if exclusive_fp: - fp.close() - raise - return None - - im = _open_core(fp, filename, prefix, formats) - - if im is None and formats is ID: - checked_formats = ID.copy() - if init(): - im = _open_core( - fp, - filename, - prefix, - tuple(format for format in formats if format not in checked_formats), - ) - - if im: - im._exclusive_fp = exclusive_fp - return im - - if exclusive_fp: - fp.close() - for message in warning_messages: - warnings.warn(message) - msg = "cannot identify image file %r" % (filename if filename else fp) - raise UnidentifiedImageError(msg) - - -# -# Image processing. - - -def alpha_composite(im1: Image, im2: Image) -> Image: - """ - Alpha composite im2 over im1. - - :param im1: The first image. Must have mode RGBA. - :param im2: The second image. Must have mode RGBA, and the same size as - the first image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - im1.load() - im2.load() - return im1._new(core.alpha_composite(im1.im, im2.im)) - - -def blend(im1: Image, im2: Image, alpha: float) -> Image: - """ - Creates a new image by interpolating between two input images, using - a constant alpha:: - - out = image1 * (1.0 - alpha) + image2 * alpha - - :param im1: The first image. - :param im2: The second image. Must have the same mode and size as - the first image. - :param alpha: The interpolation alpha factor. If alpha is 0.0, a - copy of the first image is returned. If alpha is 1.0, a copy of - the second image is returned. There are no restrictions on the - alpha value. If necessary, the result is clipped to fit into - the allowed output range. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - im1.load() - im2.load() - return im1._new(core.blend(im1.im, im2.im, alpha)) - - -def composite(image1: Image, image2: Image, mask: Image) -> Image: - """ - Create composite image by blending images using a transparency mask. - - :param image1: The first image. - :param image2: The second image. Must have the same mode and - size as the first image. - :param mask: A mask image. This image can have mode - "1", "L", or "RGBA", and must have the same size as the - other two images. - """ - - image = image2.copy() - image.paste(image1, None, mask) - return image - - -def eval(image: Image, *args: Callable[[int], float]) -> Image: - """ - Applies the function (which should take one argument) to each pixel - in the given image. If the image has more than one band, the same - function is applied to each band. Note that the function is - evaluated once for each possible pixel value, so you cannot use - random components or other generators. - - :param image: The input image. - :param function: A function object, taking one integer argument. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - return image.point(args[0]) - - -def merge(mode: str, bands: Sequence[Image]) -> Image: - """ - Merge a set of single band images into a new multiband image. - - :param mode: The mode to use for the output image. See: - :ref:`concept-modes`. - :param bands: A sequence containing one single-band image for - each band in the output image. All bands must have the - same size. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if getmodebands(mode) != len(bands) or "*" in mode: - msg = "wrong number of bands" - raise ValueError(msg) - for band in bands[1:]: - if band.mode != getmodetype(mode): - msg = "mode mismatch" - raise ValueError(msg) - if band.size != bands[0].size: - msg = "size mismatch" - raise ValueError(msg) - for band in bands: - band.load() - return bands[0]._new(core.merge(mode, *[b.im for b in bands])) - - -# -------------------------------------------------------------------- -# Plugin registry - - -def register_open( - id: str, - factory: ( - Callable[[IO[bytes], str | bytes], ImageFile.ImageFile] - | type[ImageFile.ImageFile] - ), - accept: Callable[[bytes], bool | str] | None = None, -) -> None: - """ - Register an image file plugin. This function should not be used - in application code. - - :param id: An image format identifier. - :param factory: An image file factory method. - :param accept: An optional function that can be used to quickly - reject images having another format. - """ - id = id.upper() - if id not in ID: - ID.append(id) - OPEN[id] = factory, accept - - -def register_mime(id: str, mimetype: str) -> None: - """ - Registers an image MIME type by populating ``Image.MIME``. This function - should not be used in application code. - - ``Image.MIME`` provides a mapping from image format identifiers to mime - formats, but :py:meth:`~PIL.ImageFile.ImageFile.get_format_mimetype` can - provide a different result for specific images. - - :param id: An image format identifier. - :param mimetype: The image MIME type for this format. - """ - MIME[id.upper()] = mimetype - - -def register_save( - id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] -) -> None: - """ - Registers an image save function. This function should not be - used in application code. - - :param id: An image format identifier. - :param driver: A function to save images in this format. - """ - SAVE[id.upper()] = driver - - -def register_save_all( - id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] -) -> None: - """ - Registers an image function to save all the frames - of a multiframe format. This function should not be - used in application code. - - :param id: An image format identifier. - :param driver: A function to save images in this format. - """ - SAVE_ALL[id.upper()] = driver - - -def register_extension(id: str, extension: str) -> None: - """ - Registers an image extension. This function should not be - used in application code. - - :param id: An image format identifier. - :param extension: An extension used for this format. - """ - EXTENSION[extension.lower()] = id.upper() - - -def register_extensions(id: str, extensions: list[str]) -> None: - """ - Registers image extensions. This function should not be - used in application code. - - :param id: An image format identifier. - :param extensions: A list of extensions used for this format. - """ - for extension in extensions: - register_extension(id, extension) - - -def registered_extensions() -> dict[str, str]: - """ - Returns a dictionary containing all file extensions belonging - to registered plugins - """ - init() - return EXTENSION - - -def register_decoder(name: str, decoder: type[ImageFile.PyDecoder]) -> None: - """ - Registers an image decoder. This function should not be - used in application code. - - :param name: The name of the decoder - :param decoder: An ImageFile.PyDecoder object - - .. versionadded:: 4.1.0 - """ - DECODERS[name] = decoder - - -def register_encoder(name: str, encoder: type[ImageFile.PyEncoder]) -> None: - """ - Registers an image encoder. This function should not be - used in application code. - - :param name: The name of the encoder - :param encoder: An ImageFile.PyEncoder object - - .. versionadded:: 4.1.0 - """ - ENCODERS[name] = encoder - - -# -------------------------------------------------------------------- -# Simple display support. - - -def _show(image: Image, **options: Any) -> None: - from . import ImageShow - - ImageShow.show(image, **options) - - -# -------------------------------------------------------------------- -# Effects - - -def effect_mandelbrot( - size: tuple[int, int], extent: tuple[float, float, float, float], quality: int -) -> Image: - """ - Generate a Mandelbrot set covering the given extent. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param extent: The extent to cover, as a 4-tuple: - (x0, y0, x1, y1). - :param quality: Quality. - """ - return Image()._new(core.effect_mandelbrot(size, extent, quality)) - - -def effect_noise(size: tuple[int, int], sigma: float) -> Image: - """ - Generate Gaussian noise centered around 128. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param sigma: Standard deviation of noise. - """ - return Image()._new(core.effect_noise(size, sigma)) - - -def linear_gradient(mode: str) -> Image: - """ - Generate 256x256 linear gradient from black to white, top to bottom. - - :param mode: Input mode. - """ - return Image()._new(core.linear_gradient(mode)) - - -def radial_gradient(mode: str) -> Image: - """ - Generate 256x256 radial gradient from black to white, centre to edge. - - :param mode: Input mode. - """ - return Image()._new(core.radial_gradient(mode)) - - -# -------------------------------------------------------------------- -# Resources - - -def _apply_env_variables(env: dict[str, str] | None = None) -> None: - env_dict = env if env is not None else os.environ - - for var_name, setter in [ - ("PILLOW_ALIGNMENT", core.set_alignment), - ("PILLOW_BLOCK_SIZE", core.set_block_size), - ("PILLOW_BLOCKS_MAX", core.set_blocks_max), - ]: - if var_name not in env_dict: - continue - - var = env_dict[var_name].lower() - - units = 1 - for postfix, mul in [("k", 1024), ("m", 1024 * 1024)]: - if var.endswith(postfix): - units = mul - var = var[: -len(postfix)] - - try: - var_int = int(var) * units - except ValueError: - warnings.warn(f"{var_name} is not int") - continue - - try: - setter(var_int) - except ValueError as e: - warnings.warn(f"{var_name}: {e}") - - -_apply_env_variables() -atexit.register(core.clear_cache) - - -if TYPE_CHECKING: - _ExifBase = MutableMapping[int, Any] -else: - _ExifBase = MutableMapping - - -class Exif(_ExifBase): - """ - This class provides read and write access to EXIF image data:: - - from PIL import Image - im = Image.open("exif.png") - exif = im.getexif() # Returns an instance of this class - - Information can be read and written, iterated over or deleted:: - - print(exif[274]) # 1 - exif[274] = 2 - for k, v in exif.items(): - print("Tag", k, "Value", v) # Tag 274 Value 2 - del exif[274] - - To access information beyond IFD0, :py:meth:`~PIL.Image.Exif.get_ifd` - returns a dictionary:: - - from PIL import ExifTags - im = Image.open("exif_gps.jpg") - exif = im.getexif() - gps_ifd = exif.get_ifd(ExifTags.IFD.GPSInfo) - print(gps_ifd) - - Other IFDs include ``ExifTags.IFD.Exif``, ``ExifTags.IFD.MakerNote``, - ``ExifTags.IFD.Interop`` and ``ExifTags.IFD.IFD1``. - - :py:mod:`~PIL.ExifTags` also has enum classes to provide names for data:: - - print(exif[ExifTags.Base.Software]) # PIL - print(gps_ifd[ExifTags.GPS.GPSDateStamp]) # 1999:99:99 99:99:99 - """ - - endian: str | None = None - bigtiff = False - _loaded = False - - def __init__(self) -> None: - self._data: dict[int, Any] = {} - self._hidden_data: dict[int, Any] = {} - self._ifds: dict[int, dict[int, Any]] = {} - self._info: TiffImagePlugin.ImageFileDirectory_v2 | None = None - self._loaded_exif: bytes | None = None - - def _fixup(self, value: Any) -> Any: - try: - if len(value) == 1 and isinstance(value, tuple): - return value[0] - except Exception: - pass - return value - - def _fixup_dict(self, src_dict: dict[int, Any]) -> dict[int, Any]: - # Helper function - # returns a dict with any single item tuples/lists as individual values - return {k: self._fixup(v) for k, v in src_dict.items()} - - def _get_ifd_dict( - self, offset: int, group: int | None = None - ) -> dict[int, Any] | None: - try: - # an offset pointer to the location of the nested embedded IFD. - # It should be a long, but may be corrupted. - self.fp.seek(offset) - except (KeyError, TypeError): - return None - else: - from . import TiffImagePlugin - - info = TiffImagePlugin.ImageFileDirectory_v2(self.head, group=group) - info.load(self.fp) - return self._fixup_dict(dict(info)) - - def _get_head(self) -> bytes: - version = b"\x2b" if self.bigtiff else b"\x2a" - if self.endian == "<": - head = b"II" + version + b"\x00" + o32le(8) - else: - head = b"MM\x00" + version + o32be(8) - if self.bigtiff: - head += o32le(8) if self.endian == "<" else o32be(8) - head += b"\x00\x00\x00\x00" - return head - - def load(self, data: bytes) -> None: - # Extract EXIF information. This is highly experimental, - # and is likely to be replaced with something better in a future - # version. - - # The EXIF record consists of a TIFF file embedded in a JPEG - # application marker (!). - if data == self._loaded_exif: - return - self._loaded_exif = data - self._data.clear() - self._hidden_data.clear() - self._ifds.clear() - while data and data.startswith(b"Exif\x00\x00"): - data = data[6:] - if not data: - self._info = None - return - - self.fp: IO[bytes] = io.BytesIO(data) - self.head = self.fp.read(8) - # process dictionary - from . import TiffImagePlugin - - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - self.endian = self._info._endian - self.fp.seek(self._info.next) - self._info.load(self.fp) - - def load_from_fp(self, fp: IO[bytes], offset: int | None = None) -> None: - self._loaded_exif = None - self._data.clear() - self._hidden_data.clear() - self._ifds.clear() - - # process dictionary - from . import TiffImagePlugin - - self.fp = fp - if offset is not None: - self.head = self._get_head() - else: - self.head = self.fp.read(8) - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - if self.endian is None: - self.endian = self._info._endian - if offset is None: - offset = self._info.next - self.fp.tell() - self.fp.seek(offset) - self._info.load(self.fp) - - def _get_merged_dict(self) -> dict[int, Any]: - merged_dict = dict(self) - - # get EXIF extension - if ExifTags.IFD.Exif in self: - ifd = self._get_ifd_dict(self[ExifTags.IFD.Exif], ExifTags.IFD.Exif) - if ifd: - merged_dict.update(ifd) - - # GPS - if ExifTags.IFD.GPSInfo in self: - merged_dict[ExifTags.IFD.GPSInfo] = self._get_ifd_dict( - self[ExifTags.IFD.GPSInfo], ExifTags.IFD.GPSInfo - ) - - return merged_dict - - def tobytes(self, offset: int = 8) -> bytes: - from . import TiffImagePlugin - - head = self._get_head() - ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) - for tag, ifd_dict in self._ifds.items(): - if tag not in self: - ifd[tag] = ifd_dict - for tag, value in self.items(): - if tag in [ - ExifTags.IFD.Exif, - ExifTags.IFD.GPSInfo, - ] and not isinstance(value, dict): - value = self.get_ifd(tag) - if ( - tag == ExifTags.IFD.Exif - and ExifTags.IFD.Interop in value - and not isinstance(value[ExifTags.IFD.Interop], dict) - ): - value = value.copy() - value[ExifTags.IFD.Interop] = self.get_ifd(ExifTags.IFD.Interop) - ifd[tag] = value - return b"Exif\x00\x00" + head + ifd.tobytes(offset) - - def get_ifd(self, tag: int) -> dict[int, Any]: - if tag not in self._ifds: - if tag == ExifTags.IFD.IFD1: - if self._info is not None and self._info.next != 0: - ifd = self._get_ifd_dict(self._info.next) - if ifd is not None: - self._ifds[tag] = ifd - elif tag in [ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo]: - offset = self._hidden_data.get(tag, self.get(tag)) - if offset is not None: - ifd = self._get_ifd_dict(offset, tag) - if ifd is not None: - self._ifds[tag] = ifd - elif tag in [ExifTags.IFD.Interop, ExifTags.IFD.MakerNote]: - if ExifTags.IFD.Exif not in self._ifds: - self.get_ifd(ExifTags.IFD.Exif) - tag_data = self._ifds[ExifTags.IFD.Exif][tag] - if tag == ExifTags.IFD.MakerNote: - from .TiffImagePlugin import ImageFileDirectory_v2 - - if tag_data.startswith(b"FUJIFILM"): - ifd_offset = i32le(tag_data, 8) - ifd_data = tag_data[ifd_offset:] - - makernote = {} - for i in range(struct.unpack(" 4: - (offset,) = struct.unpack("H", tag_data[:2])[0]): - ifd_tag, typ, count, data = struct.unpack( - ">HHL4s", tag_data[i * 12 + 2 : (i + 1) * 12 + 2] - ) - if ifd_tag == 0x1101: - # CameraInfo - (offset,) = struct.unpack(">L", data) - self.fp.seek(offset) - - camerainfo: dict[str, int | bytes] = { - "ModelID": self.fp.read(4) - } - - self.fp.read(4) - # Seconds since 2000 - camerainfo["TimeStamp"] = i32le(self.fp.read(12)) - - self.fp.read(4) - camerainfo["InternalSerialNumber"] = self.fp.read(4) - - self.fp.read(12) - parallax = self.fp.read(4) - handler = ImageFileDirectory_v2._load_dispatch[ - TiffTags.FLOAT - ][1] - camerainfo["Parallax"] = handler( - ImageFileDirectory_v2(), parallax, False - )[0] - - self.fp.read(4) - camerainfo["Category"] = self.fp.read(2) - - makernote = {0x1101: camerainfo} - self._ifds[tag] = makernote - else: - # Interop - ifd = self._get_ifd_dict(tag_data, tag) - if ifd is not None: - self._ifds[tag] = ifd - ifd = self._ifds.setdefault(tag, {}) - if tag == ExifTags.IFD.Exif and self._hidden_data: - ifd = { - k: v - for (k, v) in ifd.items() - if k not in (ExifTags.IFD.Interop, ExifTags.IFD.MakerNote) - } - return ifd - - def hide_offsets(self) -> None: - for tag in (ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo): - if tag in self: - self._hidden_data[tag] = self[tag] - del self[tag] - - def __str__(self) -> str: - if self._info is not None: - # Load all keys into self._data - for tag in self._info: - self[tag] - - return str(self._data) - - def __len__(self) -> int: - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return len(keys) - - def __getitem__(self, tag: int) -> Any: - if self._info is not None and tag not in self._data and tag in self._info: - self._data[tag] = self._fixup(self._info[tag]) - del self._info[tag] - return self._data[tag] - - def __contains__(self, tag: object) -> bool: - return tag in self._data or (self._info is not None and tag in self._info) - - def __setitem__(self, tag: int, value: Any) -> None: - if self._info is not None and tag in self._info: - del self._info[tag] - self._data[tag] = value - - def __delitem__(self, tag: int) -> None: - if self._info is not None and tag in self._info: - del self._info[tag] - else: - del self._data[tag] - - def __iter__(self) -> Iterator[int]: - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return iter(keys) diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageChops.py b/.venv/lib/python3.10/site-packages/PIL/ImageChops.py deleted file mode 100644 index 29a5c99..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageChops.py +++ /dev/null @@ -1,311 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard channel operations -# -# History: -# 1996-03-24 fl Created -# 1996-08-13 fl Added logical operations (for "1" images) -# 2000-10-12 fl Added offset method (from Image.py) -# -# Copyright (c) 1997-2000 by Secret Labs AB -# Copyright (c) 1996-2000 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from __future__ import annotations - -from . import Image - - -def constant(image: Image.Image, value: int) -> Image.Image: - """Fill a channel with a given gray level. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.new("L", image.size, value) - - -def duplicate(image: Image.Image) -> Image.Image: - """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return image.copy() - - -def invert(image: Image.Image) -> Image.Image: - """ - Invert an image (channel). :: - - out = MAX - image - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image.load() - return image._new(image.im.chop_invert()) - - -def lighter(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Compares the two images, pixel by pixel, and returns a new image containing - the lighter values. :: - - out = max(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_lighter(image2.im)) - - -def darker(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Compares the two images, pixel by pixel, and returns a new image containing - the darker values. :: - - out = min(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_darker(image2.im)) - - -def difference(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Returns the absolute value of the pixel-by-pixel difference between the two - images. :: - - out = abs(image1 - image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_difference(image2.im)) - - -def multiply(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other. - - If you multiply an image with a solid black image, the result is black. If - you multiply with a solid white image, the image is unaffected. :: - - out = image1 * image2 / MAX - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_multiply(image2.im)) - - -def screen(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two inverted images on top of each other. :: - - out = MAX - ((MAX - image1) * (MAX - image2) / MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_screen(image2.im)) - - -def soft_light(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Soft Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_soft_light(image2.im)) - - -def hard_light(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Hard Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_hard_light(image2.im)) - - -def overlay(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Overlay algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_overlay(image2.im)) - - -def add( - image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 -) -> Image.Image: - """ - Adds two images, dividing the result by scale and adding the - offset. If omitted, scale defaults to 1.0, and offset to 0.0. :: - - out = ((image1 + image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add(image2.im, scale, offset)) - - -def subtract( - image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 -) -> Image.Image: - """ - Subtracts two images, dividing the result by scale and adding the offset. - If omitted, scale defaults to 1.0, and offset to 0.0. :: - - out = ((image1 - image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) - - -def add_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Add two images, without clipping the result. :: - - out = ((image1 + image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add_modulo(image2.im)) - - -def subtract_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Subtract two images, without clipping the result. :: - - out = ((image1 - image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract_modulo(image2.im)) - - -def logical_and(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical AND between two images. - - Both of the images must have mode "1". If you would like to perform a - logical AND on an image with a mode other than "1", try - :py:meth:`~PIL.ImageChops.multiply` instead, using a black-and-white mask - as the second image. :: - - out = ((image1 and image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_and(image2.im)) - - -def logical_or(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical OR between two images. - - Both of the images must have mode "1". :: - - out = ((image1 or image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_or(image2.im)) - - -def logical_xor(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical XOR between two images. - - Both of the images must have mode "1". :: - - out = ((bool(image1) != bool(image2)) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_xor(image2.im)) - - -def blend(image1: Image.Image, image2: Image.Image, alpha: float) -> Image.Image: - """Blend images using constant transparency weight. Alias for - :py:func:`PIL.Image.blend`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.blend(image1, image2, alpha) - - -def composite( - image1: Image.Image, image2: Image.Image, mask: Image.Image -) -> Image.Image: - """Create composite using transparency mask. Alias for - :py:func:`PIL.Image.composite`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.composite(image1, image2, mask) - - -def offset(image: Image.Image, xoffset: int, yoffset: int | None = None) -> Image.Image: - """Returns a copy of the image where data has been offset by the given - distances. Data wraps around the edges. If ``yoffset`` is omitted, it - is assumed to be equal to ``xoffset``. - - :param image: Input image. - :param xoffset: The horizontal distance. - :param yoffset: The vertical distance. If omitted, both - distances are set to the same value. - :rtype: :py:class:`~PIL.Image.Image` - """ - - if yoffset is None: - yoffset = xoffset - image.load() - return image._new(image.im.offset(xoffset, yoffset)) diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageCms.py b/.venv/lib/python3.10/site-packages/PIL/ImageCms.py deleted file mode 100644 index fdfbee7..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageCms.py +++ /dev/null @@ -1,1125 +0,0 @@ -# The Python Imaging Library. -# $Id$ - -# Optional color management support, based on Kevin Cazabon's PyCMS -# library. - -# Originally released under LGPL. Graciously donated to PIL in -# March 2009, for distribution under the standard PIL license - -# History: - -# 2009-03-08 fl Added to PIL. - -# Copyright (C) 2002-2003 Kevin Cazabon -# Copyright (c) 2009 by Fredrik Lundh -# Copyright (c) 2013 by Eric Soroos - -# See the README file for information on usage and redistribution. See -# below for the original description. -from __future__ import annotations - -import operator -import sys -from enum import IntEnum, IntFlag -from functools import reduce -from typing import Any, Literal, SupportsFloat, SupportsInt, Union - -from . import Image, __version__ -from ._deprecate import deprecate -from ._typing import SupportsRead - -try: - from . import _imagingcms as core - - _CmsProfileCompatible = Union[ - str, SupportsRead[bytes], core.CmsProfile, "ImageCmsProfile" - ] -except ImportError as ex: - # Allow error import for doc purposes, but error out when accessing - # anything in core. - from ._util import DeferredError - - core = DeferredError.new(ex) - -_DESCRIPTION = """ -pyCMS - - a Python / PIL interface to the littleCMS ICC Color Management System - Copyright (C) 2002-2003 Kevin Cazabon - kevin@cazabon.com - https://www.cazabon.com - - pyCMS home page: https://www.cazabon.com/pyCMS - littleCMS home page: https://www.littlecms.com - (littleCMS is Copyright (C) 1998-2001 Marti Maria) - - Originally released under LGPL. Graciously donated to PIL in - March 2009, for distribution under the standard PIL license - - The pyCMS.py module provides a "clean" interface between Python/PIL and - pyCMSdll, taking care of some of the more complex handling of the direct - pyCMSdll functions, as well as error-checking and making sure that all - relevant data is kept together. - - While it is possible to call pyCMSdll functions directly, it's not highly - recommended. - - Version History: - - 1.0.0 pil Oct 2013 Port to LCMS 2. - - 0.1.0 pil mod March 10, 2009 - - Renamed display profile to proof profile. The proof - profile is the profile of the device that is being - simulated, not the profile of the device which is - actually used to display/print the final simulation - (that'd be the output profile) - also see LCMSAPI.txt - input colorspace -> using 'renderingIntent' -> proof - colorspace -> using 'proofRenderingIntent' -> output - colorspace - - Added LCMS FLAGS support. - Added FLAGS["SOFTPROOFING"] as default flag for - buildProofTransform (otherwise the proof profile/intent - would be ignored). - - 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms - - 0.0.2 alpha Jan 6, 2002 - - Added try/except statements around type() checks of - potential CObjects... Python won't let you use type() - on them, and raises a TypeError (stupid, if you ask - me!) - - Added buildProofTransformFromOpenProfiles() function. - Additional fixes in DLL, see DLL code for details. - - 0.0.1 alpha first public release, Dec. 26, 2002 - - Known to-do list with current version (of Python interface, not pyCMSdll): - - none - -""" - -_VERSION = "1.0.0 pil" - - -def __getattr__(name: str) -> Any: - if name == "DESCRIPTION": - deprecate("PIL.ImageCms.DESCRIPTION", 12) - return _DESCRIPTION - elif name == "VERSION": - deprecate("PIL.ImageCms.VERSION", 12) - return _VERSION - elif name == "FLAGS": - deprecate("PIL.ImageCms.FLAGS", 12, "PIL.ImageCms.Flags") - return _FLAGS - msg = f"module '{__name__}' has no attribute '{name}'" - raise AttributeError(msg) - - -# --------------------------------------------------------------------. - - -# -# intent/direction values - - -class Intent(IntEnum): - PERCEPTUAL = 0 - RELATIVE_COLORIMETRIC = 1 - SATURATION = 2 - ABSOLUTE_COLORIMETRIC = 3 - - -class Direction(IntEnum): - INPUT = 0 - OUTPUT = 1 - PROOF = 2 - - -# -# flags - - -class Flags(IntFlag): - """Flags and documentation are taken from ``lcms2.h``.""" - - NONE = 0 - NOCACHE = 0x0040 - """Inhibit 1-pixel cache""" - NOOPTIMIZE = 0x0100 - """Inhibit optimizations""" - NULLTRANSFORM = 0x0200 - """Don't transform anyway""" - GAMUTCHECK = 0x1000 - """Out of Gamut alarm""" - SOFTPROOFING = 0x4000 - """Do softproofing""" - BLACKPOINTCOMPENSATION = 0x2000 - NOWHITEONWHITEFIXUP = 0x0004 - """Don't fix scum dot""" - HIGHRESPRECALC = 0x0400 - """Use more memory to give better accuracy""" - LOWRESPRECALC = 0x0800 - """Use less memory to minimize resources""" - # this should be 8BITS_DEVICELINK, but that is not a valid name in Python: - USE_8BITS_DEVICELINK = 0x0008 - """Create 8 bits devicelinks""" - GUESSDEVICECLASS = 0x0020 - """Guess device class (for ``transform2devicelink``)""" - KEEP_SEQUENCE = 0x0080 - """Keep profile sequence for devicelink creation""" - FORCE_CLUT = 0x0002 - """Force CLUT optimization""" - CLUT_POST_LINEARIZATION = 0x0001 - """create postlinearization tables if possible""" - CLUT_PRE_LINEARIZATION = 0x0010 - """create prelinearization tables if possible""" - NONEGATIVES = 0x8000 - """Prevent negative numbers in floating point transforms""" - COPY_ALPHA = 0x04000000 - """Alpha channels are copied on ``cmsDoTransform()``""" - NODEFAULTRESOURCEDEF = 0x01000000 - - _GRIDPOINTS_1 = 1 << 16 - _GRIDPOINTS_2 = 2 << 16 - _GRIDPOINTS_4 = 4 << 16 - _GRIDPOINTS_8 = 8 << 16 - _GRIDPOINTS_16 = 16 << 16 - _GRIDPOINTS_32 = 32 << 16 - _GRIDPOINTS_64 = 64 << 16 - _GRIDPOINTS_128 = 128 << 16 - - @staticmethod - def GRIDPOINTS(n: int) -> Flags: - """ - Fine-tune control over number of gridpoints - - :param n: :py:class:`int` in range ``0 <= n <= 255`` - """ - return Flags.NONE | ((n & 0xFF) << 16) - - -_MAX_FLAG = reduce(operator.or_, Flags) - - -_FLAGS = { - "MATRIXINPUT": 1, - "MATRIXOUTPUT": 2, - "MATRIXONLY": (1 | 2), - "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot - # Don't create prelinearization tables on precalculated transforms - # (internal use): - "NOPRELINEARIZATION": 16, - "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) - "NOTCACHE": 64, # Inhibit 1-pixel cache - "NOTPRECALC": 256, - "NULLTRANSFORM": 512, # Don't transform anyway - "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy - "LOWRESPRECALC": 2048, # Use less memory to minimize resources - "WHITEBLACKCOMPENSATION": 8192, - "BLACKPOINTCOMPENSATION": 8192, - "GAMUTCHECK": 4096, # Out of Gamut alarm - "SOFTPROOFING": 16384, # Do softproofing - "PRESERVEBLACK": 32768, # Black preservation - "NODEFAULTRESOURCEDEF": 16777216, # CRD special - "GRIDPOINTS": lambda n: (n & 0xFF) << 16, # Gridpoints -} - - -# --------------------------------------------------------------------. -# Experimental PIL-level API -# --------------------------------------------------------------------. - -## -# Profile. - - -class ImageCmsProfile: - def __init__(self, profile: str | SupportsRead[bytes] | core.CmsProfile) -> None: - """ - :param profile: Either a string representing a filename, - a file like object containing a profile or a - low-level profile object - - """ - - if isinstance(profile, str): - if sys.platform == "win32": - profile_bytes_path = profile.encode() - try: - profile_bytes_path.decode("ascii") - except UnicodeDecodeError: - with open(profile, "rb") as f: - self._set(core.profile_frombytes(f.read())) - return - self._set(core.profile_open(profile), profile) - elif hasattr(profile, "read"): - self._set(core.profile_frombytes(profile.read())) - elif isinstance(profile, core.CmsProfile): - self._set(profile) - else: - msg = "Invalid type for Profile" # type: ignore[unreachable] - raise TypeError(msg) - - def _set(self, profile: core.CmsProfile, filename: str | None = None) -> None: - self.profile = profile - self.filename = filename - self.product_name = None # profile.product_name - self.product_info = None # profile.product_info - - def tobytes(self) -> bytes: - """ - Returns the profile in a format suitable for embedding in - saved images. - - :returns: a bytes object containing the ICC profile. - """ - - return core.profile_tobytes(self.profile) - - -class ImageCmsTransform(Image.ImagePointHandler): - """ - Transform. This can be used with the procedural API, or with the standard - :py:func:`~PIL.Image.Image.point` method. - - Will return the output profile in the ``output.info['icc_profile']``. - """ - - def __init__( - self, - input: ImageCmsProfile, - output: ImageCmsProfile, - input_mode: str, - output_mode: str, - intent: Intent = Intent.PERCEPTUAL, - proof: ImageCmsProfile | None = None, - proof_intent: Intent = Intent.ABSOLUTE_COLORIMETRIC, - flags: Flags = Flags.NONE, - ): - supported_modes = ( - "RGB", - "RGBA", - "RGBX", - "CMYK", - "I;16", - "I;16L", - "I;16B", - "YCbCr", - "LAB", - "L", - "1", - ) - for mode in (input_mode, output_mode): - if mode not in supported_modes: - deprecate( - mode, - 12, - { - "L;16": "I;16 or I;16L", - "L:16B": "I;16B", - "YCCA": "YCbCr", - "YCC": "YCbCr", - }.get(mode), - ) - if proof is None: - self.transform = core.buildTransform( - input.profile, output.profile, input_mode, output_mode, intent, flags - ) - else: - self.transform = core.buildProofTransform( - input.profile, - output.profile, - proof.profile, - input_mode, - output_mode, - intent, - proof_intent, - flags, - ) - # Note: inputMode and outputMode are for pyCMS compatibility only - self.input_mode = self.inputMode = input_mode - self.output_mode = self.outputMode = output_mode - - self.output_profile = output - - def point(self, im: Image.Image) -> Image.Image: - return self.apply(im) - - def apply(self, im: Image.Image, imOut: Image.Image | None = None) -> Image.Image: - if imOut is None: - imOut = Image.new(self.output_mode, im.size, None) - self.transform.apply(im.getim(), imOut.getim()) - imOut.info["icc_profile"] = self.output_profile.tobytes() - return imOut - - def apply_in_place(self, im: Image.Image) -> Image.Image: - if im.mode != self.output_mode: - msg = "mode mismatch" - raise ValueError(msg) # wrong output mode - self.transform.apply(im.getim(), im.getim()) - im.info["icc_profile"] = self.output_profile.tobytes() - return im - - -def get_display_profile(handle: SupportsInt | None = None) -> ImageCmsProfile | None: - """ - (experimental) Fetches the profile for the current display device. - - :returns: ``None`` if the profile is not known. - """ - - if sys.platform != "win32": - return None - - from . import ImageWin # type: ignore[unused-ignore, unreachable] - - if isinstance(handle, ImageWin.HDC): - profile = core.get_display_profile_win32(int(handle), 1) - else: - profile = core.get_display_profile_win32(int(handle or 0)) - if profile is None: - return None - return ImageCmsProfile(profile) - - -# --------------------------------------------------------------------. -# pyCMS compatible layer -# --------------------------------------------------------------------. - - -class PyCMSError(Exception): - """(pyCMS) Exception class. - This is used for all errors in the pyCMS API.""" - - pass - - -def profileToProfile( - im: Image.Image, - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - renderingIntent: Intent = Intent.PERCEPTUAL, - outputMode: str | None = None, - inPlace: bool = False, - flags: Flags = Flags.NONE, -) -> Image.Image | None: - """ - (pyCMS) Applies an ICC transformation to a given image, mapping from - ``inputProfile`` to ``outputProfile``. - - If the input or output profiles specified are not valid filenames, a - :exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and - ``outputMode != im.mode``, a :exc:`PyCMSError` will be raised. - If an error occurs during application of the profiles, - a :exc:`PyCMSError` will be raised. - If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS), - a :exc:`PyCMSError` will be raised. - - This function applies an ICC transformation to im from ``inputProfile``'s - color space to ``outputProfile``'s color space using the specified rendering - intent to decide how to handle out-of-gamut colors. - - ``outputMode`` can be used to specify that a color mode conversion is to - be done using these profiles, but the specified profiles must be able - to handle that mode. I.e., if converting im from RGB to CMYK using - profiles, the input profile must handle RGB data, and the output - profile must handle CMYK data. - - :param im: An open :py:class:`~PIL.Image.Image` object (i.e. Image.new(...) - or Image.open(...), etc.) - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this image, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - profile you wish to use for this image, or a profile object - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param outputMode: A valid PIL mode for the output image (i.e. "RGB", - "CMYK", etc.). Note: if rendering the image "inPlace", outputMode - MUST be the same mode as the input, or omitted completely. If - omitted, the outputMode will be the same as the mode of the input - image (im.mode) - :param inPlace: Boolean. If ``True``, the original image is modified in-place, - and ``None`` is returned. If ``False`` (default), a new - :py:class:`~PIL.Image.Image` object is returned with the transform applied. - :param flags: Integer (0-...) specifying additional flags - :returns: Either None or a new :py:class:`~PIL.Image.Image` object, depending on - the value of ``inPlace`` - :exception PyCMSError: - """ - - if outputMode is None: - outputMode = im.mode - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - transform = ImageCmsTransform( - inputProfile, - outputProfile, - im.mode, - outputMode, - renderingIntent, - flags=flags, - ) - if inPlace: - transform.apply_in_place(im) - imOut = None - else: - imOut = transform.apply(im) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def getOpenProfile( - profileFilename: str | SupportsRead[bytes] | core.CmsProfile, -) -> ImageCmsProfile: - """ - (pyCMS) Opens an ICC profile file. - - The PyCMSProfile object can be passed back into pyCMS for use in creating - transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). - - If ``profileFilename`` is not a valid filename for an ICC profile, - a :exc:`PyCMSError` will be raised. - - :param profileFilename: String, as a valid filename path to the ICC profile - you wish to open, or a file-like object. - :returns: A CmsProfile class object. - :exception PyCMSError: - """ - - try: - return ImageCmsProfile(profileFilename) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildTransform( - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - inMode: str, - outMode: str, - renderingIntent: Intent = Intent.PERCEPTUAL, - flags: Flags = Flags.NONE, -) -> ImageCmsTransform: - """ - (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the - ``outputProfile``. Use applyTransform to apply the transform to a given - image. - - If the input or output profiles specified are not valid filenames, a - :exc:`PyCMSError` will be raised. If an error occurs during creation - of the transform, a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`PyCMSError` will be raised. - - This function builds and returns an ICC transform from the ``inputProfile`` - to the ``outputProfile`` using the ``renderingIntent`` to determine what to do - with out-of-gamut colors. It will ONLY work for converting images that - are in ``inMode`` to images that are in ``outMode`` color format (PIL mode, - i.e. "RGB", "RGBA", "CMYK", etc.). - - Building the transform is a fair part of the overhead in - ImageCms.profileToProfile(), so if you're planning on converting multiple - images using the same input/output settings, this can save you time. - Once you have a transform object, it can be used with - ImageCms.applyProfile() to convert images without the need to re-compute - the lookup table for the transform. - - The reason pyCMS returns a class object rather than a handle directly - to the transform is that it needs to keep track of the PIL input/output - modes that the transform is meant for. These attributes are stored in - the ``inMode`` and ``outMode`` attributes of the object (which can be - manually overridden if you really want to, but I don't know of any - time that would be of use, or would even work). - - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - profile you wish to use for this transform, or a profile object - :param inMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param outMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param flags: Integer (0-...) specifying additional flags - :returns: A CmsTransform class object. - :exception PyCMSError: - """ - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - return ImageCmsTransform( - inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags - ) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildProofTransform( - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - proofProfile: _CmsProfileCompatible, - inMode: str, - outMode: str, - renderingIntent: Intent = Intent.PERCEPTUAL, - proofRenderingIntent: Intent = Intent.ABSOLUTE_COLORIMETRIC, - flags: Flags = Flags.SOFTPROOFING, -) -> ImageCmsTransform: - """ - (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the - ``outputProfile``, but tries to simulate the result that would be - obtained on the ``proofProfile`` device. - - If the input, output, or proof profiles specified are not valid - filenames, a :exc:`PyCMSError` will be raised. - - If an error occurs during creation of the transform, - a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`PyCMSError` will be raised. - - This function builds and returns an ICC transform from the ``inputProfile`` - to the ``outputProfile``, but tries to simulate the result that would be - obtained on the ``proofProfile`` device using ``renderingIntent`` and - ``proofRenderingIntent`` to determine what to do with out-of-gamut - colors. This is known as "soft-proofing". It will ONLY work for - converting images that are in ``inMode`` to images that are in outMode - color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). - - Usage of the resulting transform object is exactly the same as with - ImageCms.buildTransform(). - - Proof profiling is generally used when using an output device to get a - good idea of what the final printed/displayed image would look like on - the ``proofProfile`` device when it's quicker and easier to use the - output device for judging color. Generally, this means that the - output device is a monitor, or a dye-sub printer (etc.), and the simulated - device is something more expensive, complicated, or time consuming - (making it difficult to make a real print for color judgement purposes). - - Soft-proofing basically functions by adjusting the colors on the - output device to match the colors of the device being simulated. However, - when the simulated device has a much wider gamut than the output - device, you may obtain marginal results. - - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - (monitor, usually) profile you wish to use for this transform, or a - profile object - :param proofProfile: String, as a valid filename path to the ICC proof - profile you wish to use for this transform, or a profile object - :param inMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param outMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the input->proof (simulated) transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param proofRenderingIntent: Integer (0-3) specifying the rendering intent - you wish to use for proof->output transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param flags: Integer (0-...) specifying additional flags - :returns: A CmsTransform class object. - :exception PyCMSError: - """ - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - if not isinstance(proofProfile, ImageCmsProfile): - proofProfile = ImageCmsProfile(proofProfile) - return ImageCmsTransform( - inputProfile, - outputProfile, - inMode, - outMode, - renderingIntent, - proofProfile, - proofRenderingIntent, - flags, - ) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -buildTransformFromOpenProfiles = buildTransform -buildProofTransformFromOpenProfiles = buildProofTransform - - -def applyTransform( - im: Image.Image, transform: ImageCmsTransform, inPlace: bool = False -) -> Image.Image | None: - """ - (pyCMS) Applies a transform to a given image. - - If ``im.mode != transform.input_mode``, a :exc:`PyCMSError` is raised. - - If ``inPlace`` is ``True`` and ``transform.input_mode != transform.output_mode``, a - :exc:`PyCMSError` is raised. - - If ``im.mode``, ``transform.input_mode`` or ``transform.output_mode`` is not - supported by pyCMSdll or the profiles you used for the transform, a - :exc:`PyCMSError` is raised. - - If an error occurs while the transform is being applied, - a :exc:`PyCMSError` is raised. - - This function applies a pre-calculated transform (from - ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) - to an image. The transform can be used for multiple images, saving - considerable calculation time if doing the same conversion multiple times. - - If you want to modify im in-place instead of receiving a new image as - the return value, set ``inPlace`` to ``True``. This can only be done if - ``transform.input_mode`` and ``transform.output_mode`` are the same, because we - can't change the mode in-place (the buffer sizes for some modes are - different). The default behavior is to return a new :py:class:`~PIL.Image.Image` - object of the same dimensions in mode ``transform.output_mode``. - - :param im: An :py:class:`~PIL.Image.Image` object, and ``im.mode`` must be the same - as the ``input_mode`` supported by the transform. - :param transform: A valid CmsTransform class object - :param inPlace: Bool. If ``True``, ``im`` is modified in place and ``None`` is - returned, if ``False``, a new :py:class:`~PIL.Image.Image` object with the - transform applied is returned (and ``im`` is not changed). The default is - ``False``. - :returns: Either ``None``, or a new :py:class:`~PIL.Image.Image` object, - depending on the value of ``inPlace``. The profile will be returned in - the image's ``info['icc_profile']``. - :exception PyCMSError: - """ - - try: - if inPlace: - transform.apply_in_place(im) - imOut = None - else: - imOut = transform.apply(im) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def createProfile( - colorSpace: Literal["LAB", "XYZ", "sRGB"], colorTemp: SupportsFloat = 0 -) -> core.CmsProfile: - """ - (pyCMS) Creates a profile. - - If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, - a :exc:`PyCMSError` is raised. - - If using LAB and ``colorTemp`` is not a positive integer, - a :exc:`PyCMSError` is raised. - - If an error occurs while creating the profile, - a :exc:`PyCMSError` is raised. - - Use this function to create common profiles on-the-fly instead of - having to supply a profile on disk and knowing the path to it. It - returns a normal CmsProfile object that can be passed to - ImageCms.buildTransformFromOpenProfiles() to create a transform to apply - to images. - - :param colorSpace: String, the color space of the profile you wish to - create. - Currently only "LAB", "XYZ", and "sRGB" are supported. - :param colorTemp: Positive number for the white point for the profile, in - degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 - illuminant if omitted (5000k). colorTemp is ONLY applied to LAB - profiles, and is ignored for XYZ and sRGB. - :returns: A CmsProfile class object - :exception PyCMSError: - """ - - if colorSpace not in ["LAB", "XYZ", "sRGB"]: - msg = ( - f"Color space not supported for on-the-fly profile creation ({colorSpace})" - ) - raise PyCMSError(msg) - - if colorSpace == "LAB": - try: - colorTemp = float(colorTemp) - except (TypeError, ValueError) as e: - msg = f'Color temperature must be numeric, "{colorTemp}" not valid' - raise PyCMSError(msg) from e - - try: - return core.createProfile(colorSpace, colorTemp) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileName(profile: _CmsProfileCompatible) -> str: - """ - - (pyCMS) Gets the internal product name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised If an error occurs while trying - to obtain the name tag, a :exc:`PyCMSError` is raised. - - Use this function to obtain the INTERNAL name of the profile (stored - in an ICC tag in the profile itself), usually the one used when the - profile was originally created. Sometimes this tag also contains - additional information supplied by the creator. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal name of the profile as stored - in an ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # do it in python, not c. - # // name was "%s - %s" (model, manufacturer) || Description , - # // but if the Model and Manufacturer were the same or the model - # // was long, Just the model, in 1.x - model = profile.profile.model - manufacturer = profile.profile.manufacturer - - if not (model or manufacturer): - return (profile.profile.profile_description or "") + "\n" - if not manufacturer or (model and len(model) > 30): - return f"{model}\n" - return f"{model} - {manufacturer}\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileInfo(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the internal product information for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the info tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - info tag. This often contains details about the profile, and how it - was created, as supplied by the creator. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # add an extra newline to preserve pyCMS compatibility - # Python, not C. the white point bits weren't working well, - # so skipping. - # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint - description = profile.profile.profile_description - cpright = profile.profile.copyright - elements = [element for element in (description, cpright) if element] - return "\r\n\r\n".join(elements) + "\r\n\r\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileCopyright(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the copyright for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the copyright tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - copyright tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.copyright or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileManufacturer(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the manufacturer for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the manufacturer tag, a - :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - manufacturer tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.manufacturer or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileModel(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the model for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the model tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - model tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.model or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileDescription(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the description for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the description tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - description tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in an - ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.profile_description or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getDefaultIntent(profile: _CmsProfileCompatible) -> int: - """ - (pyCMS) Gets the default intent name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the default intent, a - :exc:`PyCMSError` is raised. - - Use this function to determine the default (and usually best optimized) - rendering intent for this profile. Most profiles support multiple - rendering intents, but are intended mostly for one type of conversion. - If you wish to use a different intent than returned, use - ImageCms.isIntentSupported() to verify it will work first. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: Integer 0-3 specifying the default rendering intent for this - profile. - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return profile.profile.rendering_intent - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def isIntentSupported( - profile: _CmsProfileCompatible, intent: Intent, direction: Direction -) -> Literal[-1, 1]: - """ - (pyCMS) Checks if a given intent is supported. - - Use this function to verify that you can use your desired - ``intent`` with ``profile``, and that ``profile`` can be used for the - input/output/proof profile as you desire. - - Some profiles are created specifically for one "direction", can cannot - be used for others. Some profiles can only be used for certain - rendering intents, so it's best to either verify this before trying - to create a transform with them (using this function), or catch the - potential :exc:`PyCMSError` that will occur if they don't - support the modes you select. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :param intent: Integer (0-3) specifying the rendering intent you wish to - use with this profile - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param direction: Integer specifying if the profile is to be used for - input, output, or proof - - INPUT = 0 (or use ImageCms.Direction.INPUT) - OUTPUT = 1 (or use ImageCms.Direction.OUTPUT) - PROOF = 2 (or use ImageCms.Direction.PROOF) - - :returns: 1 if the intent/direction are supported, -1 if they are not. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # FIXME: I get different results for the same data w. different - # compilers. Bug in LittleCMS or in the binding? - if profile.profile.is_intent_supported(intent, direction): - return 1 - else: - return -1 - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def versions() -> tuple[str, str | None, str, str]: - """ - (pyCMS) Fetches versions. - """ - - deprecate( - "PIL.ImageCms.versions()", - 12, - '(PIL.features.version("littlecms2"), sys.version, PIL.__version__)', - ) - return _VERSION, core.littlecms_version, sys.version.split()[0], __version__ diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageColor.py b/.venv/lib/python3.10/site-packages/PIL/ImageColor.py deleted file mode 100644 index 9a15a8e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageColor.py +++ /dev/null @@ -1,320 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# map CSS3-style colour description strings to RGB -# -# History: -# 2002-10-24 fl Added support for CSS-style color strings -# 2002-12-15 fl Added RGBA support -# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 -# 2004-07-19 fl Fixed gray/grey spelling issues -# 2009-03-05 fl Fixed rounding error in grayscale calculation -# -# Copyright (c) 2002-2004 by Secret Labs AB -# Copyright (c) 2002-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re -from functools import lru_cache - -from . import Image - - -@lru_cache -def getrgb(color: str) -> tuple[int, int, int] | tuple[int, int, int, int]: - """ - Convert a color string to an RGB or RGBA tuple. If the string cannot be - parsed, this function raises a :py:exc:`ValueError` exception. - - .. versionadded:: 1.1.4 - - :param color: A color string - :return: ``(red, green, blue[, alpha])`` - """ - if len(color) > 100: - msg = "color specifier is too long" - raise ValueError(msg) - color = color.lower() - - rgb = colormap.get(color, None) - if rgb: - if isinstance(rgb, tuple): - return rgb - rgb_tuple = getrgb(rgb) - assert len(rgb_tuple) == 3 - colormap[color] = rgb_tuple - return rgb_tuple - - # check for known string formats - if re.match("#[a-f0-9]{3}$", color): - return int(color[1] * 2, 16), int(color[2] * 2, 16), int(color[3] * 2, 16) - - if re.match("#[a-f0-9]{4}$", color): - return ( - int(color[1] * 2, 16), - int(color[2] * 2, 16), - int(color[3] * 2, 16), - int(color[4] * 2, 16), - ) - - if re.match("#[a-f0-9]{6}$", color): - return int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16) - - if re.match("#[a-f0-9]{8}$", color): - return ( - int(color[1:3], 16), - int(color[3:5], 16), - int(color[5:7], 16), - int(color[7:9], 16), - ) - - m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) - if m: - return int(m.group(1)), int(m.group(2)), int(m.group(3)) - - m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) - if m: - return ( - int((int(m.group(1)) * 255) / 100.0 + 0.5), - int((int(m.group(2)) * 255) / 100.0 + 0.5), - int((int(m.group(3)) * 255) / 100.0 + 0.5), - ) - - m = re.match( - r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hls_to_rgb - - rgb_floats = hls_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(3)) / 100.0, - float(m.group(2)) / 100.0, - ) - return ( - int(rgb_floats[0] * 255 + 0.5), - int(rgb_floats[1] * 255 + 0.5), - int(rgb_floats[2] * 255 + 0.5), - ) - - m = re.match( - r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hsv_to_rgb - - rgb_floats = hsv_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(2)) / 100.0, - float(m.group(3)) / 100.0, - ) - return ( - int(rgb_floats[0] * 255 + 0.5), - int(rgb_floats[1] * 255 + 0.5), - int(rgb_floats[2] * 255 + 0.5), - ) - - m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) - if m: - return int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)) - msg = f"unknown color specifier: {repr(color)}" - raise ValueError(msg) - - -@lru_cache -def getcolor(color: str, mode: str) -> int | tuple[int, ...]: - """ - Same as :py:func:`~PIL.ImageColor.getrgb` for most modes. However, if - ``mode`` is HSV, converts the RGB value to a HSV value, or if ``mode`` is - not color or a palette image, converts the RGB value to a grayscale value. - If the string cannot be parsed, this function raises a :py:exc:`ValueError` - exception. - - .. versionadded:: 1.1.4 - - :param color: A color string - :param mode: Convert result to this mode - :return: ``graylevel, (graylevel, alpha) or (red, green, blue[, alpha])`` - """ - # same as getrgb, but converts the result to the given mode - rgb, alpha = getrgb(color), 255 - if len(rgb) == 4: - alpha = rgb[3] - rgb = rgb[:3] - - if mode == "HSV": - from colorsys import rgb_to_hsv - - r, g, b = rgb - h, s, v = rgb_to_hsv(r / 255, g / 255, b / 255) - return int(h * 255), int(s * 255), int(v * 255) - elif Image.getmodebase(mode) == "L": - r, g, b = rgb - # ITU-R Recommendation 601-2 for nonlinear RGB - # scaled to 24 bits to match the convert's implementation. - graylevel = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 - if mode[-1] == "A": - return graylevel, alpha - return graylevel - elif mode[-1] == "A": - return rgb + (alpha,) - return rgb - - -colormap: dict[str, str | tuple[int, int, int]] = { - # X11 colour table from https://drafts.csswg.org/css-color-4/, with - # gray/grey spelling issues fixed. This is a superset of HTML 4.0 - # colour names used in CSS 1. - "aliceblue": "#f0f8ff", - "antiquewhite": "#faebd7", - "aqua": "#00ffff", - "aquamarine": "#7fffd4", - "azure": "#f0ffff", - "beige": "#f5f5dc", - "bisque": "#ffe4c4", - "black": "#000000", - "blanchedalmond": "#ffebcd", - "blue": "#0000ff", - "blueviolet": "#8a2be2", - "brown": "#a52a2a", - "burlywood": "#deb887", - "cadetblue": "#5f9ea0", - "chartreuse": "#7fff00", - "chocolate": "#d2691e", - "coral": "#ff7f50", - "cornflowerblue": "#6495ed", - "cornsilk": "#fff8dc", - "crimson": "#dc143c", - "cyan": "#00ffff", - "darkblue": "#00008b", - "darkcyan": "#008b8b", - "darkgoldenrod": "#b8860b", - "darkgray": "#a9a9a9", - "darkgrey": "#a9a9a9", - "darkgreen": "#006400", - "darkkhaki": "#bdb76b", - "darkmagenta": "#8b008b", - "darkolivegreen": "#556b2f", - "darkorange": "#ff8c00", - "darkorchid": "#9932cc", - "darkred": "#8b0000", - "darksalmon": "#e9967a", - "darkseagreen": "#8fbc8f", - "darkslateblue": "#483d8b", - "darkslategray": "#2f4f4f", - "darkslategrey": "#2f4f4f", - "darkturquoise": "#00ced1", - "darkviolet": "#9400d3", - "deeppink": "#ff1493", - "deepskyblue": "#00bfff", - "dimgray": "#696969", - "dimgrey": "#696969", - "dodgerblue": "#1e90ff", - "firebrick": "#b22222", - "floralwhite": "#fffaf0", - "forestgreen": "#228b22", - "fuchsia": "#ff00ff", - "gainsboro": "#dcdcdc", - "ghostwhite": "#f8f8ff", - "gold": "#ffd700", - "goldenrod": "#daa520", - "gray": "#808080", - "grey": "#808080", - "green": "#008000", - "greenyellow": "#adff2f", - "honeydew": "#f0fff0", - "hotpink": "#ff69b4", - "indianred": "#cd5c5c", - "indigo": "#4b0082", - "ivory": "#fffff0", - "khaki": "#f0e68c", - "lavender": "#e6e6fa", - "lavenderblush": "#fff0f5", - "lawngreen": "#7cfc00", - "lemonchiffon": "#fffacd", - "lightblue": "#add8e6", - "lightcoral": "#f08080", - "lightcyan": "#e0ffff", - "lightgoldenrodyellow": "#fafad2", - "lightgreen": "#90ee90", - "lightgray": "#d3d3d3", - "lightgrey": "#d3d3d3", - "lightpink": "#ffb6c1", - "lightsalmon": "#ffa07a", - "lightseagreen": "#20b2aa", - "lightskyblue": "#87cefa", - "lightslategray": "#778899", - "lightslategrey": "#778899", - "lightsteelblue": "#b0c4de", - "lightyellow": "#ffffe0", - "lime": "#00ff00", - "limegreen": "#32cd32", - "linen": "#faf0e6", - "magenta": "#ff00ff", - "maroon": "#800000", - "mediumaquamarine": "#66cdaa", - "mediumblue": "#0000cd", - "mediumorchid": "#ba55d3", - "mediumpurple": "#9370db", - "mediumseagreen": "#3cb371", - "mediumslateblue": "#7b68ee", - "mediumspringgreen": "#00fa9a", - "mediumturquoise": "#48d1cc", - "mediumvioletred": "#c71585", - "midnightblue": "#191970", - "mintcream": "#f5fffa", - "mistyrose": "#ffe4e1", - "moccasin": "#ffe4b5", - "navajowhite": "#ffdead", - "navy": "#000080", - "oldlace": "#fdf5e6", - "olive": "#808000", - "olivedrab": "#6b8e23", - "orange": "#ffa500", - "orangered": "#ff4500", - "orchid": "#da70d6", - "palegoldenrod": "#eee8aa", - "palegreen": "#98fb98", - "paleturquoise": "#afeeee", - "palevioletred": "#db7093", - "papayawhip": "#ffefd5", - "peachpuff": "#ffdab9", - "peru": "#cd853f", - "pink": "#ffc0cb", - "plum": "#dda0dd", - "powderblue": "#b0e0e6", - "purple": "#800080", - "rebeccapurple": "#663399", - "red": "#ff0000", - "rosybrown": "#bc8f8f", - "royalblue": "#4169e1", - "saddlebrown": "#8b4513", - "salmon": "#fa8072", - "sandybrown": "#f4a460", - "seagreen": "#2e8b57", - "seashell": "#fff5ee", - "sienna": "#a0522d", - "silver": "#c0c0c0", - "skyblue": "#87ceeb", - "slateblue": "#6a5acd", - "slategray": "#708090", - "slategrey": "#708090", - "snow": "#fffafa", - "springgreen": "#00ff7f", - "steelblue": "#4682b4", - "tan": "#d2b48c", - "teal": "#008080", - "thistle": "#d8bfd8", - "tomato": "#ff6347", - "turquoise": "#40e0d0", - "violet": "#ee82ee", - "wheat": "#f5deb3", - "white": "#ffffff", - "whitesmoke": "#f5f5f5", - "yellow": "#ffff00", - "yellowgreen": "#9acd32", -} diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageDraw.py b/.venv/lib/python3.10/site-packages/PIL/ImageDraw.py deleted file mode 100644 index e6c7b02..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageDraw.py +++ /dev/null @@ -1,1231 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# drawing interface operations -# -# History: -# 1996-04-13 fl Created (experimental) -# 1996-08-07 fl Filled polygons, ellipses. -# 1996-08-13 fl Added text support -# 1998-06-28 fl Handle I and F images -# 1998-12-29 fl Added arc; use arc primitive to draw ellipses -# 1999-01-10 fl Added shape stuff (experimental) -# 1999-02-06 fl Added bitmap support -# 1999-02-11 fl Changed all primitives to take options -# 1999-02-20 fl Fixed backwards compatibility -# 2000-10-12 fl Copy on write, when necessary -# 2001-02-18 fl Use default ink for bitmap/text also in fill mode -# 2002-10-24 fl Added support for CSS-style color strings -# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing -# 2002-12-11 fl Refactored low-level drawing API (work in progress) -# 2004-08-26 fl Made Draw() a factory function, added getdraw() support -# 2004-09-04 fl Added width support to line primitive -# 2004-09-10 fl Added font mode handling -# 2006-06-19 fl Added font bearing support (getmask2) -# -# Copyright (c) 1997-2006 by Secret Labs AB -# Copyright (c) 1996-2006 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import math -import struct -from collections.abc import Sequence -from types import ModuleType -from typing import Any, AnyStr, Callable, Union, cast - -from . import Image, ImageColor -from ._deprecate import deprecate -from ._typing import Coords - -# experimental access to the outline API -Outline: Callable[[], Image.core._Outline] = Image.core.outline - -TYPE_CHECKING = False -if TYPE_CHECKING: - from . import ImageDraw2, ImageFont - -_Ink = Union[float, tuple[int, ...], str] - -""" -A simple 2D drawing interface for PIL images. -

-Application code should use the Draw factory, instead of -directly. -""" - - -class ImageDraw: - font: ( - ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | None - ) = None - - def __init__(self, im: Image.Image, mode: str | None = None) -> None: - """ - Create a drawing instance. - - :param im: The image to draw in. - :param mode: Optional mode to use for color values. For RGB - images, this argument can be RGB or RGBA (to blend the - drawing into the image). For all other modes, this argument - must be the same as the image mode. If omitted, the mode - defaults to the mode of the image. - """ - im.load() - if im.readonly: - im._copy() # make it writeable - blend = 0 - if mode is None: - mode = im.mode - if mode != im.mode: - if mode == "RGBA" and im.mode == "RGB": - blend = 1 - else: - msg = "mode mismatch" - raise ValueError(msg) - if mode == "P": - self.palette = im.palette - else: - self.palette = None - self._image = im - self.im = im.im - self.draw = Image.core.draw(self.im, blend) - self.mode = mode - if mode in ("I", "F"): - self.ink = self.draw.draw_ink(1) - else: - self.ink = self.draw.draw_ink(-1) - if mode in ("1", "P", "I", "F"): - # FIXME: fix Fill2 to properly support matte for I+F images - self.fontmode = "1" - else: - self.fontmode = "L" # aliasing is okay for other modes - self.fill = False - - def getfont( - self, - ) -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont: - """ - Get the current default font. - - To set the default font for this ImageDraw instance:: - - from PIL import ImageDraw, ImageFont - draw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") - - To set the default font for all future ImageDraw instances:: - - from PIL import ImageDraw, ImageFont - ImageDraw.ImageDraw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") - - If the current default font is ``None``, - it is initialized with ``ImageFont.load_default()``. - - :returns: An image font.""" - if not self.font: - # FIXME: should add a font repository - from . import ImageFont - - self.font = ImageFont.load_default() - return self.font - - def _getfont( - self, font_size: float | None - ) -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont: - if font_size is not None: - from . import ImageFont - - return ImageFont.load_default(font_size) - else: - return self.getfont() - - def _getink( - self, ink: _Ink | None, fill: _Ink | None = None - ) -> tuple[int | None, int | None]: - result_ink = None - result_fill = None - if ink is None and fill is None: - if self.fill: - result_fill = self.ink - else: - result_ink = self.ink - else: - if ink is not None: - if isinstance(ink, str): - ink = ImageColor.getcolor(ink, self.mode) - if self.palette and isinstance(ink, tuple): - ink = self.palette.getcolor(ink, self._image) - result_ink = self.draw.draw_ink(ink) - if fill is not None: - if isinstance(fill, str): - fill = ImageColor.getcolor(fill, self.mode) - if self.palette and isinstance(fill, tuple): - fill = self.palette.getcolor(fill, self._image) - result_fill = self.draw.draw_ink(fill) - return result_ink, result_fill - - def arc( - self, - xy: Coords, - start: float, - end: float, - fill: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw an arc.""" - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_arc(xy, start, end, ink, width) - - def bitmap( - self, xy: Sequence[int], bitmap: Image.Image, fill: _Ink | None = None - ) -> None: - """Draw a bitmap.""" - bitmap.load() - ink, fill = self._getink(fill) - if ink is None: - ink = fill - if ink is not None: - self.draw.draw_bitmap(xy, bitmap.im, ink) - - def chord( - self, - xy: Coords, - start: float, - end: float, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a chord.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_chord(xy, start, end, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_chord(xy, start, end, ink, 0, width) - - def ellipse( - self, - xy: Coords, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw an ellipse.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_ellipse(xy, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_ellipse(xy, ink, 0, width) - - def circle( - self, - xy: Sequence[float], - radius: float, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a circle given center coordinates and a radius.""" - ellipse_xy = (xy[0] - radius, xy[1] - radius, xy[0] + radius, xy[1] + radius) - self.ellipse(ellipse_xy, fill, outline, width) - - def line( - self, - xy: Coords, - fill: _Ink | None = None, - width: int = 0, - joint: str | None = None, - ) -> None: - """Draw a line, or a connected sequence of line segments.""" - ink = self._getink(fill)[0] - if ink is not None: - self.draw.draw_lines(xy, ink, width) - if joint == "curve" and width > 4: - points: Sequence[Sequence[float]] - if isinstance(xy[0], (list, tuple)): - points = cast(Sequence[Sequence[float]], xy) - else: - points = [ - cast(Sequence[float], tuple(xy[i : i + 2])) - for i in range(0, len(xy), 2) - ] - for i in range(1, len(points) - 1): - point = points[i] - angles = [ - math.degrees(math.atan2(end[0] - start[0], start[1] - end[1])) - % 360 - for start, end in ( - (points[i - 1], point), - (point, points[i + 1]), - ) - ] - if angles[0] == angles[1]: - # This is a straight line, so no joint is required - continue - - def coord_at_angle( - coord: Sequence[float], angle: float - ) -> tuple[float, ...]: - x, y = coord - angle -= 90 - distance = width / 2 - 1 - return tuple( - p + (math.floor(p_d) if p_d > 0 else math.ceil(p_d)) - for p, p_d in ( - (x, distance * math.cos(math.radians(angle))), - (y, distance * math.sin(math.radians(angle))), - ) - ) - - flipped = ( - angles[1] > angles[0] and angles[1] - 180 > angles[0] - ) or (angles[1] < angles[0] and angles[1] + 180 > angles[0]) - coords = [ - (point[0] - width / 2 + 1, point[1] - width / 2 + 1), - (point[0] + width / 2 - 1, point[1] + width / 2 - 1), - ] - if flipped: - start, end = (angles[1] + 90, angles[0] + 90) - else: - start, end = (angles[0] - 90, angles[1] - 90) - self.pieslice(coords, start - 90, end - 90, fill) - - if width > 8: - # Cover potential gaps between the line and the joint - if flipped: - gap_coords = [ - coord_at_angle(point, angles[0] + 90), - point, - coord_at_angle(point, angles[1] + 90), - ] - else: - gap_coords = [ - coord_at_angle(point, angles[0] - 90), - point, - coord_at_angle(point, angles[1] - 90), - ] - self.line(gap_coords, fill, width=3) - - def shape( - self, - shape: Image.core._Outline, - fill: _Ink | None = None, - outline: _Ink | None = None, - ) -> None: - """(Experimental) Draw a shape.""" - shape.close() - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_outline(shape, fill_ink, 1) - if ink is not None and ink != fill_ink: - self.draw.draw_outline(shape, ink, 0) - - def pieslice( - self, - xy: Coords, - start: float, - end: float, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a pieslice.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_pieslice(xy, start, end, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_pieslice(xy, start, end, ink, 0, width) - - def point(self, xy: Coords, fill: _Ink | None = None) -> None: - """Draw one or more individual pixels.""" - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_points(xy, ink) - - def polygon( - self, - xy: Coords, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a polygon.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_polygon(xy, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - if width == 1: - self.draw.draw_polygon(xy, ink, 0, width) - elif self.im is not None: - # To avoid expanding the polygon outwards, - # use the fill as a mask - mask = Image.new("1", self.im.size) - mask_ink = self._getink(1)[0] - - fill_im = mask.copy() - draw = Draw(fill_im) - draw.draw.draw_polygon(xy, mask_ink, 1) - - ink_im = mask.copy() - draw = Draw(ink_im) - width = width * 2 - 1 - draw.draw.draw_polygon(xy, mask_ink, 0, width) - - mask.paste(ink_im, mask=fill_im) - - im = Image.new(self.mode, self.im.size) - draw = Draw(im) - draw.draw.draw_polygon(xy, ink, 0, width) - self.im.paste(im.im, (0, 0) + im.size, mask.im) - - def regular_polygon( - self, - bounding_circle: Sequence[Sequence[float] | float], - n_sides: int, - rotation: float = 0, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a regular polygon.""" - xy = _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation) - self.polygon(xy, fill, outline, width) - - def rectangle( - self, - xy: Coords, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a rectangle.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_rectangle(xy, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_rectangle(xy, ink, 0, width) - - def rounded_rectangle( - self, - xy: Coords, - radius: float = 0, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - *, - corners: tuple[bool, bool, bool, bool] | None = None, - ) -> None: - """Draw a rounded rectangle.""" - if isinstance(xy[0], (list, tuple)): - (x0, y0), (x1, y1) = cast(Sequence[Sequence[float]], xy) - else: - x0, y0, x1, y1 = cast(Sequence[float], xy) - if x1 < x0: - msg = "x1 must be greater than or equal to x0" - raise ValueError(msg) - if y1 < y0: - msg = "y1 must be greater than or equal to y0" - raise ValueError(msg) - if corners is None: - corners = (True, True, True, True) - - d = radius * 2 - - x0 = round(x0) - y0 = round(y0) - x1 = round(x1) - y1 = round(y1) - full_x, full_y = False, False - if all(corners): - full_x = d >= x1 - x0 - 1 - if full_x: - # The two left and two right corners are joined - d = x1 - x0 - full_y = d >= y1 - y0 - 1 - if full_y: - # The two top and two bottom corners are joined - d = y1 - y0 - if full_x and full_y: - # If all corners are joined, that is a circle - return self.ellipse(xy, fill, outline, width) - - if d == 0 or not any(corners): - # If the corners have no curve, - # or there are no corners, - # that is a rectangle - return self.rectangle(xy, fill, outline, width) - - r = int(d // 2) - ink, fill_ink = self._getink(outline, fill) - - def draw_corners(pieslice: bool) -> None: - parts: tuple[tuple[tuple[float, float, float, float], int, int], ...] - if full_x: - # Draw top and bottom halves - parts = ( - ((x0, y0, x0 + d, y0 + d), 180, 360), - ((x0, y1 - d, x0 + d, y1), 0, 180), - ) - elif full_y: - # Draw left and right halves - parts = ( - ((x0, y0, x0 + d, y0 + d), 90, 270), - ((x1 - d, y0, x1, y0 + d), 270, 90), - ) - else: - # Draw four separate corners - parts = tuple( - part - for i, part in enumerate( - ( - ((x0, y0, x0 + d, y0 + d), 180, 270), - ((x1 - d, y0, x1, y0 + d), 270, 360), - ((x1 - d, y1 - d, x1, y1), 0, 90), - ((x0, y1 - d, x0 + d, y1), 90, 180), - ) - ) - if corners[i] - ) - for part in parts: - if pieslice: - self.draw.draw_pieslice(*(part + (fill_ink, 1))) - else: - self.draw.draw_arc(*(part + (ink, width))) - - if fill_ink is not None: - draw_corners(True) - - if full_x: - self.draw.draw_rectangle((x0, y0 + r + 1, x1, y1 - r - 1), fill_ink, 1) - elif x1 - r - 1 > x0 + r + 1: - self.draw.draw_rectangle((x0 + r + 1, y0, x1 - r - 1, y1), fill_ink, 1) - if not full_x and not full_y: - left = [x0, y0, x0 + r, y1] - if corners[0]: - left[1] += r + 1 - if corners[3]: - left[3] -= r + 1 - self.draw.draw_rectangle(left, fill_ink, 1) - - right = [x1 - r, y0, x1, y1] - if corners[1]: - right[1] += r + 1 - if corners[2]: - right[3] -= r + 1 - self.draw.draw_rectangle(right, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - draw_corners(False) - - if not full_x: - top = [x0, y0, x1, y0 + width - 1] - if corners[0]: - top[0] += r + 1 - if corners[1]: - top[2] -= r + 1 - self.draw.draw_rectangle(top, ink, 1) - - bottom = [x0, y1 - width + 1, x1, y1] - if corners[3]: - bottom[0] += r + 1 - if corners[2]: - bottom[2] -= r + 1 - self.draw.draw_rectangle(bottom, ink, 1) - if not full_y: - left = [x0, y0, x0 + width - 1, y1] - if corners[0]: - left[1] += r + 1 - if corners[3]: - left[3] -= r + 1 - self.draw.draw_rectangle(left, ink, 1) - - right = [x1 - width + 1, y0, x1, y1] - if corners[1]: - right[1] += r + 1 - if corners[2]: - right[3] -= r + 1 - self.draw.draw_rectangle(right, ink, 1) - - def _multiline_check(self, text: AnyStr) -> bool: - split_character = "\n" if isinstance(text, str) else b"\n" - - return split_character in text - - def text( - self, - xy: tuple[float, float], - text: AnyStr, - fill: _Ink | None = None, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - anchor: str | None = None, - spacing: float = 4, - align: str = "left", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - stroke_fill: _Ink | None = None, - embedded_color: bool = False, - *args: Any, - **kwargs: Any, - ) -> None: - """Draw text.""" - if embedded_color and self.mode not in ("RGB", "RGBA"): - msg = "Embedded color supported only in RGB and RGBA modes" - raise ValueError(msg) - - if font is None: - font = self._getfont(kwargs.get("font_size")) - - if self._multiline_check(text): - return self.multiline_text( - xy, - text, - fill, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - stroke_fill, - embedded_color, - ) - - def getink(fill: _Ink | None) -> int: - ink, fill_ink = self._getink(fill) - if ink is None: - assert fill_ink is not None - return fill_ink - return ink - - def draw_text(ink: int, stroke_width: float = 0) -> None: - mode = self.fontmode - if stroke_width == 0 and embedded_color: - mode = "RGBA" - coord = [] - for i in range(2): - coord.append(int(xy[i])) - start = (math.modf(xy[0])[0], math.modf(xy[1])[0]) - try: - mask, offset = font.getmask2( # type: ignore[union-attr,misc] - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - stroke_filled=True, - anchor=anchor, - ink=ink, - start=start, - *args, - **kwargs, - ) - coord = [coord[0] + offset[0], coord[1] + offset[1]] - except AttributeError: - try: - mask = font.getmask( # type: ignore[misc] - text, - mode, - direction, - features, - language, - stroke_width, - anchor, - ink, - start=start, - *args, - **kwargs, - ) - except TypeError: - mask = font.getmask(text) - if mode == "RGBA": - # font.getmask2(mode="RGBA") returns color in RGB bands and mask in A - # extract mask and set text alpha - color, mask = mask, mask.getband(3) - ink_alpha = struct.pack("i", ink)[3] - color.fillband(3, ink_alpha) - x, y = coord - if self.im is not None: - self.im.paste( - color, (x, y, x + mask.size[0], y + mask.size[1]), mask - ) - else: - self.draw.draw_bitmap(coord, mask, ink) - - ink = getink(fill) - if ink is not None: - stroke_ink = None - if stroke_width: - stroke_ink = getink(stroke_fill) if stroke_fill is not None else ink - - if stroke_ink is not None: - # Draw stroked text - draw_text(stroke_ink, stroke_width) - - # Draw normal text - if ink != stroke_ink: - draw_text(ink) - else: - # Only draw normal text - draw_text(ink) - - def _prepare_multiline_text( - self, - xy: tuple[float, float], - text: AnyStr, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ), - anchor: str | None, - spacing: float, - align: str, - direction: str | None, - features: list[str] | None, - language: str | None, - stroke_width: float, - embedded_color: bool, - font_size: float | None, - ) -> tuple[ - ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont, - str, - list[tuple[tuple[float, float], AnyStr]], - ]: - if direction == "ttb": - msg = "ttb direction is unsupported for multiline text" - raise ValueError(msg) - - if anchor is None: - anchor = "la" - elif len(anchor) != 2: - msg = "anchor must be a 2 character string" - raise ValueError(msg) - elif anchor[1] in "tb": - msg = "anchor not supported for multiline text" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - - widths = [] - max_width: float = 0 - lines = text.split("\n" if isinstance(text, str) else b"\n") - line_spacing = ( - self.textbbox((0, 0), "A", font, stroke_width=stroke_width)[3] - + stroke_width - + spacing - ) - - for line in lines: - line_width = self.textlength( - line, - font, - direction=direction, - features=features, - language=language, - embedded_color=embedded_color, - ) - widths.append(line_width) - max_width = max(max_width, line_width) - - top = xy[1] - if anchor[1] == "m": - top -= (len(lines) - 1) * line_spacing / 2.0 - elif anchor[1] == "d": - top -= (len(lines) - 1) * line_spacing - - parts = [] - for idx, line in enumerate(lines): - left = xy[0] - width_difference = max_width - widths[idx] - - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter - if align in ("left", "justify"): - pass - elif align == "center": - left += width_difference / 2.0 - elif align == "right": - left += width_difference - else: - msg = 'align must be "left", "center", "right" or "justify"' - raise ValueError(msg) - - if align == "justify" and width_difference != 0: - words = line.split(" " if isinstance(text, str) else b" ") - word_widths = [ - self.textlength( - word, - font, - direction=direction, - features=features, - language=language, - embedded_color=embedded_color, - ) - for word in words - ] - width_difference = max_width - sum(word_widths) - for i, word in enumerate(words): - parts.append(((left, top), word)) - left += word_widths[i] + width_difference / (len(words) - 1) - else: - parts.append(((left, top), line)) - - top += line_spacing - - return font, anchor, parts - - def multiline_text( - self, - xy: tuple[float, float], - text: AnyStr, - fill: _Ink | None = None, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - anchor: str | None = None, - spacing: float = 4, - align: str = "left", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - stroke_fill: _Ink | None = None, - embedded_color: bool = False, - *, - font_size: float | None = None, - ) -> None: - font, anchor, lines = self._prepare_multiline_text( - xy, - text, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - embedded_color, - font_size, - ) - - for xy, line in lines: - self.text( - xy, - line, - fill, - font, - anchor, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - stroke_fill=stroke_fill, - embedded_color=embedded_color, - ) - - def textlength( - self, - text: AnyStr, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - embedded_color: bool = False, - *, - font_size: float | None = None, - ) -> float: - """Get the length of a given string, in pixels with 1/64 precision.""" - if self._multiline_check(text): - msg = "can't measure length of multiline text" - raise ValueError(msg) - if embedded_color and self.mode not in ("RGB", "RGBA"): - msg = "Embedded color supported only in RGB and RGBA modes" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - mode = "RGBA" if embedded_color else self.fontmode - return font.getlength(text, mode, direction, features, language) - - def textbbox( - self, - xy: tuple[float, float], - text: AnyStr, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - anchor: str | None = None, - spacing: float = 4, - align: str = "left", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - embedded_color: bool = False, - *, - font_size: float | None = None, - ) -> tuple[float, float, float, float]: - """Get the bounding box of a given string, in pixels.""" - if embedded_color and self.mode not in ("RGB", "RGBA"): - msg = "Embedded color supported only in RGB and RGBA modes" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - - if self._multiline_check(text): - return self.multiline_textbbox( - xy, - text, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - embedded_color, - ) - - mode = "RGBA" if embedded_color else self.fontmode - bbox = font.getbbox( - text, mode, direction, features, language, stroke_width, anchor - ) - return bbox[0] + xy[0], bbox[1] + xy[1], bbox[2] + xy[0], bbox[3] + xy[1] - - def multiline_textbbox( - self, - xy: tuple[float, float], - text: AnyStr, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - anchor: str | None = None, - spacing: float = 4, - align: str = "left", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - embedded_color: bool = False, - *, - font_size: float | None = None, - ) -> tuple[float, float, float, float]: - font, anchor, lines = self._prepare_multiline_text( - xy, - text, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - embedded_color, - font_size, - ) - - bbox: tuple[float, float, float, float] | None = None - - for xy, line in lines: - bbox_line = self.textbbox( - xy, - line, - font, - anchor, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - embedded_color=embedded_color, - ) - if bbox is None: - bbox = bbox_line - else: - bbox = ( - min(bbox[0], bbox_line[0]), - min(bbox[1], bbox_line[1]), - max(bbox[2], bbox_line[2]), - max(bbox[3], bbox_line[3]), - ) - - if bbox is None: - return xy[0], xy[1], xy[0], xy[1] - return bbox - - -def Draw(im: Image.Image, mode: str | None = None) -> ImageDraw: - """ - A simple 2D drawing interface for PIL images. - - :param im: The image to draw in. - :param mode: Optional mode to use for color values. For RGB - images, this argument can be RGB or RGBA (to blend the - drawing into the image). For all other modes, this argument - must be the same as the image mode. If omitted, the mode - defaults to the mode of the image. - """ - try: - return getattr(im, "getdraw")(mode) - except AttributeError: - return ImageDraw(im, mode) - - -def getdraw( - im: Image.Image | None = None, hints: list[str] | None = None -) -> tuple[ImageDraw2.Draw | None, ModuleType]: - """ - :param im: The image to draw in. - :param hints: An optional list of hints. Deprecated. - :returns: A (drawing context, drawing resource factory) tuple. - """ - if hints is not None: - deprecate("'hints' parameter", 12) - from . import ImageDraw2 - - draw = ImageDraw2.Draw(im) if im is not None else None - return draw, ImageDraw2 - - -def floodfill( - image: Image.Image, - xy: tuple[int, int], - value: float | tuple[int, ...], - border: float | tuple[int, ...] | None = None, - thresh: float = 0, -) -> None: - """ - .. warning:: This method is experimental. - - Fills a bounded region with a given color. - - :param image: Target image. - :param xy: Seed position (a 2-item coordinate tuple). See - :ref:`coordinate-system`. - :param value: Fill color. - :param border: Optional border value. If given, the region consists of - pixels with a color different from the border color. If not given, - the region consists of pixels having the same color as the seed - pixel. - :param thresh: Optional threshold value which specifies a maximum - tolerable difference of a pixel value from the 'background' in - order for it to be replaced. Useful for filling regions of - non-homogeneous, but similar, colors. - """ - # based on an implementation by Eric S. Raymond - # amended by yo1995 @20180806 - pixel = image.load() - assert pixel is not None - x, y = xy - try: - background = pixel[x, y] - if _color_diff(value, background) <= thresh: - return # seed point already has fill color - pixel[x, y] = value - except (ValueError, IndexError): - return # seed point outside image - edge = {(x, y)} - # use a set to keep record of current and previous edge pixels - # to reduce memory consumption - full_edge = set() - while edge: - new_edge = set() - for x, y in edge: # 4 adjacent method - for s, t in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): - # If already processed, or if a coordinate is negative, skip - if (s, t) in full_edge or s < 0 or t < 0: - continue - try: - p = pixel[s, t] - except (ValueError, IndexError): - pass - else: - full_edge.add((s, t)) - if border is None: - fill = _color_diff(p, background) <= thresh - else: - fill = p not in (value, border) - if fill: - pixel[s, t] = value - new_edge.add((s, t)) - full_edge = edge # discard pixels processed - edge = new_edge - - -def _compute_regular_polygon_vertices( - bounding_circle: Sequence[Sequence[float] | float], n_sides: int, rotation: float -) -> list[tuple[float, float]]: - """ - Generate a list of vertices for a 2D regular polygon. - - :param bounding_circle: The bounding circle is a sequence defined - by a point and radius. The polygon is inscribed in this circle. - (e.g. ``bounding_circle=(x, y, r)`` or ``((x, y), r)``) - :param n_sides: Number of sides - (e.g. ``n_sides=3`` for a triangle, ``6`` for a hexagon) - :param rotation: Apply an arbitrary rotation to the polygon - (e.g. ``rotation=90``, applies a 90 degree rotation) - :return: List of regular polygon vertices - (e.g. ``[(25, 50), (50, 50), (50, 25), (25, 25)]``) - - How are the vertices computed? - 1. Compute the following variables - - theta: Angle between the apothem & the nearest polygon vertex - - side_length: Length of each polygon edge - - centroid: Center of bounding circle (1st, 2nd elements of bounding_circle) - - polygon_radius: Polygon radius (last element of bounding_circle) - - angles: Location of each polygon vertex in polar grid - (e.g. A square with 0 degree rotation => [225.0, 315.0, 45.0, 135.0]) - - 2. For each angle in angles, get the polygon vertex at that angle - The vertex is computed using the equation below. - X= xcos(φ) + ysin(φ) - Y= −xsin(φ) + ycos(φ) - - Note: - φ = angle in degrees - x = 0 - y = polygon_radius - - The formula above assumes rotation around the origin. - In our case, we are rotating around the centroid. - To account for this, we use the formula below - X = xcos(φ) + ysin(φ) + centroid_x - Y = −xsin(φ) + ycos(φ) + centroid_y - """ - # 1. Error Handling - # 1.1 Check `n_sides` has an appropriate value - if not isinstance(n_sides, int): - msg = "n_sides should be an int" # type: ignore[unreachable] - raise TypeError(msg) - if n_sides < 3: - msg = "n_sides should be an int > 2" - raise ValueError(msg) - - # 1.2 Check `bounding_circle` has an appropriate value - if not isinstance(bounding_circle, (list, tuple)): - msg = "bounding_circle should be a sequence" - raise TypeError(msg) - - if len(bounding_circle) == 3: - if not all(isinstance(i, (int, float)) for i in bounding_circle): - msg = "bounding_circle should only contain numeric data" - raise ValueError(msg) - - *centroid, polygon_radius = cast(list[float], list(bounding_circle)) - elif len(bounding_circle) == 2 and isinstance(bounding_circle[0], (list, tuple)): - if not all( - isinstance(i, (int, float)) for i in bounding_circle[0] - ) or not isinstance(bounding_circle[1], (int, float)): - msg = "bounding_circle should only contain numeric data" - raise ValueError(msg) - - if len(bounding_circle[0]) != 2: - msg = "bounding_circle centre should contain 2D coordinates (e.g. (x, y))" - raise ValueError(msg) - - centroid = cast(list[float], list(bounding_circle[0])) - polygon_radius = cast(float, bounding_circle[1]) - else: - msg = ( - "bounding_circle should contain 2D coordinates " - "and a radius (e.g. (x, y, r) or ((x, y), r) )" - ) - raise ValueError(msg) - - if polygon_radius <= 0: - msg = "bounding_circle radius should be > 0" - raise ValueError(msg) - - # 1.3 Check `rotation` has an appropriate value - if not isinstance(rotation, (int, float)): - msg = "rotation should be an int or float" # type: ignore[unreachable] - raise ValueError(msg) - - # 2. Define Helper Functions - def _apply_rotation(point: list[float], degrees: float) -> tuple[float, float]: - return ( - round( - point[0] * math.cos(math.radians(360 - degrees)) - - point[1] * math.sin(math.radians(360 - degrees)) - + centroid[0], - 2, - ), - round( - point[1] * math.cos(math.radians(360 - degrees)) - + point[0] * math.sin(math.radians(360 - degrees)) - + centroid[1], - 2, - ), - ) - - def _compute_polygon_vertex(angle: float) -> tuple[float, float]: - start_point = [polygon_radius, 0] - return _apply_rotation(start_point, angle) - - def _get_angles(n_sides: int, rotation: float) -> list[float]: - angles = [] - degrees = 360 / n_sides - # Start with the bottom left polygon vertex - current_angle = (270 - 0.5 * degrees) + rotation - for _ in range(n_sides): - angles.append(current_angle) - current_angle += degrees - if current_angle > 360: - current_angle -= 360 - return angles - - # 3. Variable Declarations - angles = _get_angles(n_sides, rotation) - - # 4. Compute Vertices - return [_compute_polygon_vertex(angle) for angle in angles] - - -def _color_diff( - color1: float | tuple[int, ...], color2: float | tuple[int, ...] -) -> float: - """ - Uses 1-norm distance to calculate difference between two values. - """ - first = color1 if isinstance(color1, tuple) else (color1,) - second = color2 if isinstance(color2, tuple) else (color2,) - - return sum(abs(first[i] - second[i]) for i in range(len(second))) diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageDraw2.py b/.venv/lib/python3.10/site-packages/PIL/ImageDraw2.py deleted file mode 100644 index 3d68658..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageDraw2.py +++ /dev/null @@ -1,243 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# WCK-style drawing interface operations -# -# History: -# 2003-12-07 fl created -# 2005-05-15 fl updated; added to PIL as ImageDraw2 -# 2005-05-15 fl added text support -# 2005-05-20 fl added arc/chord/pieslice support -# -# Copyright (c) 2003-2005 by Secret Labs AB -# Copyright (c) 2003-2005 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -""" -(Experimental) WCK-style drawing interface operations - -.. seealso:: :py:mod:`PIL.ImageDraw` -""" -from __future__ import annotations - -from typing import Any, AnyStr, BinaryIO - -from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath -from ._typing import Coords, StrOrBytesPath - - -class Pen: - """Stores an outline color and width.""" - - def __init__(self, color: str, width: int = 1, opacity: int = 255) -> None: - self.color = ImageColor.getrgb(color) - self.width = width - - -class Brush: - """Stores a fill color""" - - def __init__(self, color: str, opacity: int = 255) -> None: - self.color = ImageColor.getrgb(color) - - -class Font: - """Stores a TrueType font and color""" - - def __init__( - self, color: str, file: StrOrBytesPath | BinaryIO, size: float = 12 - ) -> None: - # FIXME: add support for bitmap fonts - self.color = ImageColor.getrgb(color) - self.font = ImageFont.truetype(file, size) - - -class Draw: - """ - (Experimental) WCK-style drawing interface - """ - - def __init__( - self, - image: Image.Image | str, - size: tuple[int, int] | list[int] | None = None, - color: float | tuple[float, ...] | str | None = None, - ) -> None: - if isinstance(image, str): - if size is None: - msg = "If image argument is mode string, size must be a list or tuple" - raise ValueError(msg) - image = Image.new(image, size, color) - self.draw = ImageDraw.Draw(image) - self.image = image - self.transform: tuple[float, float, float, float, float, float] | None = None - - def flush(self) -> Image.Image: - return self.image - - def render( - self, - op: str, - xy: Coords, - pen: Pen | Brush | None, - brush: Brush | Pen | None = None, - **kwargs: Any, - ) -> None: - # handle color arguments - outline = fill = None - width = 1 - if isinstance(pen, Pen): - outline = pen.color - width = pen.width - elif isinstance(brush, Pen): - outline = brush.color - width = brush.width - if isinstance(brush, Brush): - fill = brush.color - elif isinstance(pen, Brush): - fill = pen.color - # handle transformation - if self.transform: - path = ImagePath.Path(xy) - path.transform(self.transform) - xy = path - # render the item - if op in ("arc", "line"): - kwargs.setdefault("fill", outline) - else: - kwargs.setdefault("fill", fill) - kwargs.setdefault("outline", outline) - if op == "line": - kwargs.setdefault("width", width) - getattr(self.draw, op)(xy, **kwargs) - - def settransform(self, offset: tuple[float, float]) -> None: - """Sets a transformation offset.""" - (xoffset, yoffset) = offset - self.transform = (1, 0, xoffset, 0, 1, yoffset) - - def arc( - self, - xy: Coords, - pen: Pen | Brush | None, - start: float, - end: float, - *options: Any, - ) -> None: - """ - Draws an arc (a portion of a circle outline) between the start and end - angles, inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc` - """ - self.render("arc", xy, pen, *options, start=start, end=end) - - def chord( - self, - xy: Coords, - pen: Pen | Brush | None, - start: float, - end: float, - *options: Any, - ) -> None: - """ - Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points - with a straight line. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord` - """ - self.render("chord", xy, pen, *options, start=start, end=end) - - def ellipse(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: - """ - Draws an ellipse inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.ellipse` - """ - self.render("ellipse", xy, pen, *options) - - def line(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: - """ - Draws a line between the coordinates in the ``xy`` list. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.line` - """ - self.render("line", xy, pen, *options) - - def pieslice( - self, - xy: Coords, - pen: Pen | Brush | None, - start: float, - end: float, - *options: Any, - ) -> None: - """ - Same as arc, but also draws straight lines between the end points and the - center of the bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice` - """ - self.render("pieslice", xy, pen, *options, start=start, end=end) - - def polygon(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: - """ - Draws a polygon. - - The polygon outline consists of straight lines between the given - coordinates, plus a straight line between the last and the first - coordinate. - - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.polygon` - """ - self.render("polygon", xy, pen, *options) - - def rectangle(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: - """ - Draws a rectangle. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.rectangle` - """ - self.render("rectangle", xy, pen, *options) - - def text(self, xy: tuple[float, float], text: AnyStr, font: Font) -> None: - """ - Draws the string at the given position. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.text` - """ - if self.transform: - path = ImagePath.Path(xy) - path.transform(self.transform) - xy = path - self.draw.text(xy, text, font=font.font, fill=font.color) - - def textbbox( - self, xy: tuple[float, float], text: AnyStr, font: Font - ) -> tuple[float, float, float, float]: - """ - Returns bounding box (in pixels) of given text. - - :return: ``(left, top, right, bottom)`` bounding box - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textbbox` - """ - if self.transform: - path = ImagePath.Path(xy) - path.transform(self.transform) - xy = path - return self.draw.textbbox(xy, text, font=font.font) - - def textlength(self, text: AnyStr, font: Font) -> float: - """ - Returns length (in pixels) of given text. - This is the amount by which following text should be offset. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textlength` - """ - return self.draw.textlength(text, font=font.font) diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageEnhance.py b/.venv/lib/python3.10/site-packages/PIL/ImageEnhance.py deleted file mode 100644 index 0e7e6dd..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageEnhance.py +++ /dev/null @@ -1,113 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# image enhancement classes -# -# For a background, see "Image Processing By Interpolation and -# Extrapolation", Paul Haeberli and Douglas Voorhies. Available -# at http://www.graficaobscura.com/interp/index.html -# -# History: -# 1996-03-23 fl Created -# 2009-06-16 fl Fixed mean calculation -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFilter, ImageStat - - -class _Enhance: - image: Image.Image - degenerate: Image.Image - - def enhance(self, factor: float) -> Image.Image: - """ - Returns an enhanced image. - - :param factor: A floating point value controlling the enhancement. - Factor 1.0 always returns a copy of the original image, - lower factors mean less color (brightness, contrast, - etc), and higher values more. There are no restrictions - on this value. - :rtype: :py:class:`~PIL.Image.Image` - """ - return Image.blend(self.degenerate, self.image, factor) - - -class Color(_Enhance): - """Adjust image color balance. - - This class can be used to adjust the colour balance of an image, in - a manner similar to the controls on a colour TV set. An enhancement - factor of 0.0 gives a black and white image. A factor of 1.0 gives - the original image. - """ - - def __init__(self, image: Image.Image) -> None: - self.image = image - self.intermediate_mode = "L" - if "A" in image.getbands(): - self.intermediate_mode = "LA" - - if self.intermediate_mode != image.mode: - image = image.convert(self.intermediate_mode).convert(image.mode) - self.degenerate = image - - -class Contrast(_Enhance): - """Adjust image contrast. - - This class can be used to control the contrast of an image, similar - to the contrast control on a TV set. An enhancement factor of 0.0 - gives a solid gray image. A factor of 1.0 gives the original image. - """ - - def __init__(self, image: Image.Image) -> None: - self.image = image - if image.mode != "L": - image = image.convert("L") - mean = int(ImageStat.Stat(image).mean[0] + 0.5) - self.degenerate = Image.new("L", image.size, mean) - if self.degenerate.mode != self.image.mode: - self.degenerate = self.degenerate.convert(self.image.mode) - - if "A" in self.image.getbands(): - self.degenerate.putalpha(self.image.getchannel("A")) - - -class Brightness(_Enhance): - """Adjust image brightness. - - This class can be used to control the brightness of an image. An - enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the - original image. - """ - - def __init__(self, image: Image.Image) -> None: - self.image = image - self.degenerate = Image.new(image.mode, image.size, 0) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) - - -class Sharpness(_Enhance): - """Adjust image sharpness. - - This class can be used to adjust the sharpness of an image. An - enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the - original image, and a factor of 2.0 gives a sharpened image. - """ - - def __init__(self, image: Image.Image) -> None: - self.image = image - self.degenerate = image.filter(ImageFilter.SMOOTH) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageFile.py b/.venv/lib/python3.10/site-packages/PIL/ImageFile.py deleted file mode 100644 index bcb7d46..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageFile.py +++ /dev/null @@ -1,921 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# base class for image file handlers -# -# history: -# 1995-09-09 fl Created -# 1996-03-11 fl Fixed load mechanism. -# 1996-04-15 fl Added pcx/xbm decoders. -# 1996-04-30 fl Added encoders. -# 1996-12-14 fl Added load helpers -# 1997-01-11 fl Use encode_to_file where possible -# 1997-08-27 fl Flush output in _save -# 1998-03-05 fl Use memory mapping for some modes -# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" -# 1999-05-31 fl Added image parser -# 2000-10-12 fl Set readonly flag on memory-mapped images -# 2002-03-20 fl Use better messages for common decoder errors -# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available -# 2003-10-30 fl Added StubImageFile class -# 2004-02-25 fl Made incremental parser more robust -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1995-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import abc -import io -import itertools -import logging -import os -import struct -from typing import IO, Any, NamedTuple, cast - -from . import ExifTags, Image -from ._deprecate import deprecate -from ._util import DeferredError, is_path - -TYPE_CHECKING = False -if TYPE_CHECKING: - from ._typing import StrOrBytesPath - -logger = logging.getLogger(__name__) - -MAXBLOCK = 65536 - -SAFEBLOCK = 1024 * 1024 - -LOAD_TRUNCATED_IMAGES = False -"""Whether or not to load truncated image files. User code may change this.""" - -ERRORS = { - -1: "image buffer overrun error", - -2: "decoding error", - -3: "unknown error", - -8: "bad configuration", - -9: "out of memory error", -} -""" -Dict of known error codes returned from :meth:`.PyDecoder.decode`, -:meth:`.PyEncoder.encode` :meth:`.PyEncoder.encode_to_pyfd` and -:meth:`.PyEncoder.encode_to_file`. -""" - - -# -# -------------------------------------------------------------------- -# Helpers - - -def _get_oserror(error: int, *, encoder: bool) -> OSError: - try: - msg = Image.core.getcodecstatus(error) - except AttributeError: - msg = ERRORS.get(error) - if not msg: - msg = f"{'encoder' if encoder else 'decoder'} error {error}" - msg += f" when {'writing' if encoder else 'reading'} image file" - return OSError(msg) - - -def raise_oserror(error: int) -> OSError: - deprecate( - "raise_oserror", - 12, - action="It is only useful for translating error codes returned by a codec's " - "decode() method, which ImageFile already does automatically.", - ) - raise _get_oserror(error, encoder=False) - - -def _tilesort(t: _Tile) -> int: - # sort on offset - return t[2] - - -class _Tile(NamedTuple): - codec_name: str - extents: tuple[int, int, int, int] | None - offset: int = 0 - args: tuple[Any, ...] | str | None = None - - -# -# -------------------------------------------------------------------- -# ImageFile base class - - -class ImageFile(Image.Image): - """Base class for image file format handlers.""" - - def __init__( - self, fp: StrOrBytesPath | IO[bytes], filename: str | bytes | None = None - ) -> None: - super().__init__() - - self._min_frame = 0 - - self.custom_mimetype: str | None = None - - self.tile: list[_Tile] = [] - """ A list of tile descriptors """ - - self.readonly = 1 # until we know better - - self.decoderconfig: tuple[Any, ...] = () - self.decodermaxblock = MAXBLOCK - - if is_path(fp): - # filename - self.fp = open(fp, "rb") - self.filename = os.fspath(fp) - self._exclusive_fp = True - else: - # stream - self.fp = cast(IO[bytes], fp) - self.filename = filename if filename is not None else "" - # can be overridden - self._exclusive_fp = False - - try: - try: - self._open() - except ( - IndexError, # end of data - TypeError, # end of data (ord) - KeyError, # unsupported mode - EOFError, # got header but not the first frame - struct.error, - ) as v: - raise SyntaxError(v) from v - - if not self.mode or self.size[0] <= 0 or self.size[1] <= 0: - msg = "not identified by this driver" - raise SyntaxError(msg) - except BaseException: - # close the file only if we have opened it this constructor - if self._exclusive_fp: - self.fp.close() - raise - - def _open(self) -> None: - pass - - def _close_fp(self): - if getattr(self, "_fp", False) and not isinstance(self._fp, DeferredError): - if self._fp != self.fp: - self._fp.close() - self._fp = DeferredError(ValueError("Operation on closed image")) - if self.fp: - self.fp.close() - - def close(self) -> None: - """ - Closes the file pointer, if possible. - - This operation will destroy the image core and release its memory. - The image data will be unusable afterward. - - This function is required to close images that have multiple frames or - have not had their file read and closed by the - :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for - more information. - """ - try: - self._close_fp() - self.fp = None - except Exception as msg: - logger.debug("Error closing: %s", msg) - - super().close() - - def get_child_images(self) -> list[ImageFile]: - child_images = [] - exif = self.getexif() - ifds = [] - if ExifTags.Base.SubIFDs in exif: - subifd_offsets = exif[ExifTags.Base.SubIFDs] - if subifd_offsets: - if not isinstance(subifd_offsets, tuple): - subifd_offsets = (subifd_offsets,) - for subifd_offset in subifd_offsets: - ifds.append((exif._get_ifd_dict(subifd_offset), subifd_offset)) - ifd1 = exif.get_ifd(ExifTags.IFD.IFD1) - if ifd1 and ifd1.get(ExifTags.Base.JpegIFOffset): - assert exif._info is not None - ifds.append((ifd1, exif._info.next)) - - offset = None - for ifd, ifd_offset in ifds: - assert self.fp is not None - current_offset = self.fp.tell() - if offset is None: - offset = current_offset - - fp = self.fp - if ifd is not None: - thumbnail_offset = ifd.get(ExifTags.Base.JpegIFOffset) - if thumbnail_offset is not None: - thumbnail_offset += getattr(self, "_exif_offset", 0) - self.fp.seek(thumbnail_offset) - - length = ifd.get(ExifTags.Base.JpegIFByteCount) - assert isinstance(length, int) - data = self.fp.read(length) - fp = io.BytesIO(data) - - with Image.open(fp) as im: - from . import TiffImagePlugin - - if thumbnail_offset is None and isinstance( - im, TiffImagePlugin.TiffImageFile - ): - im._frame_pos = [ifd_offset] - im._seek(0) - im.load() - child_images.append(im) - - if offset is not None: - assert self.fp is not None - self.fp.seek(offset) - return child_images - - def get_format_mimetype(self) -> str | None: - if self.custom_mimetype: - return self.custom_mimetype - if self.format is not None: - return Image.MIME.get(self.format.upper()) - return None - - def __getstate__(self) -> list[Any]: - return super().__getstate__() + [self.filename] - - def __setstate__(self, state: list[Any]) -> None: - self.tile = [] - self.filename = state[5] - super().__setstate__(state) - - def verify(self) -> None: - """Check file integrity""" - - # raise exception if something's wrong. must be called - # directly after open, and closes file when finished. - if self._exclusive_fp: - self.fp.close() - self.fp = None - - def load(self) -> Image.core.PixelAccess | None: - """Load image data based on tile list""" - - if not self.tile and self._im is None: - msg = "cannot load this image" - raise OSError(msg) - - pixel = Image.Image.load(self) - if not self.tile: - return pixel - - self.map: mmap.mmap | None = None - use_mmap = self.filename and len(self.tile) == 1 - - readonly = 0 - - # look for read/seek overrides - if hasattr(self, "load_read"): - read = self.load_read - # don't use mmap if there are custom read/seek functions - use_mmap = False - else: - read = self.fp.read - - if hasattr(self, "load_seek"): - seek = self.load_seek - use_mmap = False - else: - seek = self.fp.seek - - if use_mmap: - # try memory mapping - decoder_name, extents, offset, args = self.tile[0] - if isinstance(args, str): - args = (args, 0, 1) - if ( - decoder_name == "raw" - and isinstance(args, tuple) - and len(args) >= 3 - and args[0] == self.mode - and args[0] in Image._MAPMODES - ): - try: - # use mmap, if possible - import mmap - - with open(self.filename) as fp: - self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) - if offset + self.size[1] * args[1] > self.map.size(): - msg = "buffer is not large enough" - raise OSError(msg) - self.im = Image.core.map_buffer( - self.map, self.size, decoder_name, offset, args - ) - readonly = 1 - # After trashing self.im, - # we might need to reload the palette data. - if self.palette: - self.palette.dirty = 1 - except (AttributeError, OSError, ImportError): - self.map = None - - self.load_prepare() - err_code = -3 # initialize to unknown error - if not self.map: - # sort tiles in file order - self.tile.sort(key=_tilesort) - - # FIXME: This is a hack to handle TIFF's JpegTables tag. - prefix = getattr(self, "tile_prefix", b"") - - # Remove consecutive duplicates that only differ by their offset - self.tile = [ - list(tiles)[-1] - for _, tiles in itertools.groupby( - self.tile, lambda tile: (tile[0], tile[1], tile[3]) - ) - ] - for i, (decoder_name, extents, offset, args) in enumerate(self.tile): - seek(offset) - decoder = Image._getdecoder( - self.mode, decoder_name, args, self.decoderconfig - ) - try: - decoder.setimage(self.im, extents) - if decoder.pulls_fd: - decoder.setfd(self.fp) - err_code = decoder.decode(b"")[1] - else: - b = prefix - while True: - read_bytes = self.decodermaxblock - if i + 1 < len(self.tile): - next_offset = self.tile[i + 1].offset - if next_offset > offset: - read_bytes = next_offset - offset - try: - s = read(read_bytes) - except (IndexError, struct.error) as e: - # truncated png/gif - if LOAD_TRUNCATED_IMAGES: - break - else: - msg = "image file is truncated" - raise OSError(msg) from e - - if not s: # truncated jpeg - if LOAD_TRUNCATED_IMAGES: - break - else: - msg = ( - "image file is truncated " - f"({len(b)} bytes not processed)" - ) - raise OSError(msg) - - b = b + s - n, err_code = decoder.decode(b) - if n < 0: - break - b = b[n:] - finally: - # Need to cleanup here to prevent leaks - decoder.cleanup() - - self.tile = [] - self.readonly = readonly - - self.load_end() - - if self._exclusive_fp and self._close_exclusive_fp_after_loading: - self.fp.close() - self.fp = None - - if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: - # still raised if decoder fails to return anything - raise _get_oserror(err_code, encoder=False) - - return Image.Image.load(self) - - def load_prepare(self) -> None: - # create image memory if necessary - if self._im is None: - self.im = Image.core.new(self.mode, self.size) - # create palette (optional) - if self.mode == "P": - Image.Image.load(self) - - def load_end(self) -> None: - # may be overridden - pass - - # may be defined for contained formats - # def load_seek(self, pos: int) -> None: - # pass - - # may be defined for blocked formats (e.g. PNG) - # def load_read(self, read_bytes: int) -> bytes: - # pass - - def _seek_check(self, frame: int) -> bool: - if ( - frame < self._min_frame - # Only check upper limit on frames if additional seek operations - # are not required to do so - or ( - not (hasattr(self, "_n_frames") and self._n_frames is None) - and frame >= getattr(self, "n_frames") + self._min_frame - ) - ): - msg = "attempt to seek outside sequence" - raise EOFError(msg) - - return self.tell() != frame - - -class StubHandler(abc.ABC): - def open(self, im: StubImageFile) -> None: - pass - - @abc.abstractmethod - def load(self, im: StubImageFile) -> Image.Image: - pass - - -class StubImageFile(ImageFile, metaclass=abc.ABCMeta): - """ - Base class for stub image loaders. - - A stub loader is an image loader that can identify files of a - certain format, but relies on external code to load the file. - """ - - @abc.abstractmethod - def _open(self) -> None: - pass - - def load(self) -> Image.core.PixelAccess | None: - loader = self._load() - if loader is None: - msg = f"cannot find loader for this {self.format} file" - raise OSError(msg) - image = loader.load(self) - assert image is not None - # become the other object (!) - self.__class__ = image.__class__ # type: ignore[assignment] - self.__dict__ = image.__dict__ - return image.load() - - @abc.abstractmethod - def _load(self) -> StubHandler | None: - """(Hook) Find actual image loader.""" - pass - - -class Parser: - """ - Incremental image parser. This class implements the standard - feed/close consumer interface. - """ - - incremental = None - image: Image.Image | None = None - data: bytes | None = None - decoder: Image.core.ImagingDecoder | PyDecoder | None = None - offset = 0 - finished = 0 - - def reset(self) -> None: - """ - (Consumer) Reset the parser. Note that you can only call this - method immediately after you've created a parser; parser - instances cannot be reused. - """ - assert self.data is None, "cannot reuse parsers" - - def feed(self, data: bytes) -> None: - """ - (Consumer) Feed data to the parser. - - :param data: A string buffer. - :exception OSError: If the parser failed to parse the image file. - """ - # collect data - - if self.finished: - return - - if self.data is None: - self.data = data - else: - self.data = self.data + data - - # parse what we have - if self.decoder: - if self.offset > 0: - # skip header - skip = min(len(self.data), self.offset) - self.data = self.data[skip:] - self.offset = self.offset - skip - if self.offset > 0 or not self.data: - return - - n, e = self.decoder.decode(self.data) - - if n < 0: - # end of stream - self.data = None - self.finished = 1 - if e < 0: - # decoding error - self.image = None - raise _get_oserror(e, encoder=False) - else: - # end of image - return - self.data = self.data[n:] - - elif self.image: - # if we end up here with no decoder, this file cannot - # be incrementally parsed. wait until we've gotten all - # available data - pass - - else: - # attempt to open this file - try: - with io.BytesIO(self.data) as fp: - im = Image.open(fp) - except OSError: - pass # not enough data - else: - flag = hasattr(im, "load_seek") or hasattr(im, "load_read") - if flag or len(im.tile) != 1: - # custom load code, or multiple tiles - self.decode = None - else: - # initialize decoder - im.load_prepare() - d, e, o, a = im.tile[0] - im.tile = [] - self.decoder = Image._getdecoder(im.mode, d, a, im.decoderconfig) - self.decoder.setimage(im.im, e) - - # calculate decoder offset - self.offset = o - if self.offset <= len(self.data): - self.data = self.data[self.offset :] - self.offset = 0 - - self.image = im - - def __enter__(self) -> Parser: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def close(self) -> Image.Image: - """ - (Consumer) Close the stream. - - :returns: An image object. - :exception OSError: If the parser failed to parse the image file either - because it cannot be identified or cannot be - decoded. - """ - # finish decoding - if self.decoder: - # get rid of what's left in the buffers - self.feed(b"") - self.data = self.decoder = None - if not self.finished: - msg = "image was incomplete" - raise OSError(msg) - if not self.image: - msg = "cannot parse this image" - raise OSError(msg) - if self.data: - # incremental parsing not possible; reopen the file - # not that we have all data - with io.BytesIO(self.data) as fp: - try: - self.image = Image.open(fp) - finally: - self.image.load() - return self.image - - -# -------------------------------------------------------------------- - - -def _save(im: Image.Image, fp: IO[bytes], tile: list[_Tile], bufsize: int = 0) -> None: - """Helper to save image based on tile list - - :param im: Image object. - :param fp: File object. - :param tile: Tile list. - :param bufsize: Optional buffer size - """ - - im.load() - if not hasattr(im, "encoderconfig"): - im.encoderconfig = () - tile.sort(key=_tilesort) - # FIXME: make MAXBLOCK a configuration parameter - # It would be great if we could have the encoder specify what it needs - # But, it would need at least the image size in most cases. RawEncode is - # a tricky case. - bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c - try: - fh = fp.fileno() - fp.flush() - _encode_tile(im, fp, tile, bufsize, fh) - except (AttributeError, io.UnsupportedOperation) as exc: - _encode_tile(im, fp, tile, bufsize, None, exc) - if hasattr(fp, "flush"): - fp.flush() - - -def _encode_tile( - im: Image.Image, - fp: IO[bytes], - tile: list[_Tile], - bufsize: int, - fh: int | None, - exc: BaseException | None = None, -) -> None: - for encoder_name, extents, offset, args in tile: - if offset > 0: - fp.seek(offset) - encoder = Image._getencoder(im.mode, encoder_name, args, im.encoderconfig) - try: - encoder.setimage(im.im, extents) - if encoder.pushes_fd: - encoder.setfd(fp) - errcode = encoder.encode_to_pyfd()[1] - else: - if exc: - # compress to Python file-compatible object - while True: - errcode, data = encoder.encode(bufsize)[1:] - fp.write(data) - if errcode: - break - else: - # slight speedup: compress to real file object - assert fh is not None - errcode = encoder.encode_to_file(fh, bufsize) - if errcode < 0: - raise _get_oserror(errcode, encoder=True) from exc - finally: - encoder.cleanup() - - -def _safe_read(fp: IO[bytes], size: int) -> bytes: - """ - Reads large blocks in a safe way. Unlike fp.read(n), this function - doesn't trust the user. If the requested size is larger than - SAFEBLOCK, the file is read block by block. - - :param fp: File handle. Must implement a read method. - :param size: Number of bytes to read. - :returns: A string containing size bytes of data. - - Raises an OSError if the file is truncated and the read cannot be completed - - """ - if size <= 0: - return b"" - if size <= SAFEBLOCK: - data = fp.read(size) - if len(data) < size: - msg = "Truncated File Read" - raise OSError(msg) - return data - blocks: list[bytes] = [] - remaining_size = size - while remaining_size > 0: - block = fp.read(min(remaining_size, SAFEBLOCK)) - if not block: - break - blocks.append(block) - remaining_size -= len(block) - if sum(len(block) for block in blocks) < size: - msg = "Truncated File Read" - raise OSError(msg) - return b"".join(blocks) - - -class PyCodecState: - def __init__(self) -> None: - self.xsize = 0 - self.ysize = 0 - self.xoff = 0 - self.yoff = 0 - - def extents(self) -> tuple[int, int, int, int]: - return self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize - - -class PyCodec: - fd: IO[bytes] | None - - def __init__(self, mode: str, *args: Any) -> None: - self.im: Image.core.ImagingCore | None = None - self.state = PyCodecState() - self.fd = None - self.mode = mode - self.init(args) - - def init(self, args: tuple[Any, ...]) -> None: - """ - Override to perform codec specific initialization - - :param args: Tuple of arg items from the tile entry - :returns: None - """ - self.args = args - - def cleanup(self) -> None: - """ - Override to perform codec specific cleanup - - :returns: None - """ - pass - - def setfd(self, fd: IO[bytes]) -> None: - """ - Called from ImageFile to set the Python file-like object - - :param fd: A Python file-like object - :returns: None - """ - self.fd = fd - - def setimage( - self, - im: Image.core.ImagingCore, - extents: tuple[int, int, int, int] | None = None, - ) -> None: - """ - Called from ImageFile to set the core output image for the codec - - :param im: A core image object - :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle - for this tile - :returns: None - """ - - # following c code - self.im = im - - if extents: - (x0, y0, x1, y1) = extents - else: - (x0, y0, x1, y1) = (0, 0, 0, 0) - - if x0 == 0 and x1 == 0: - self.state.xsize, self.state.ysize = self.im.size - else: - self.state.xoff = x0 - self.state.yoff = y0 - self.state.xsize = x1 - x0 - self.state.ysize = y1 - y0 - - if self.state.xsize <= 0 or self.state.ysize <= 0: - msg = "Size cannot be negative" - raise ValueError(msg) - - if ( - self.state.xsize + self.state.xoff > self.im.size[0] - or self.state.ysize + self.state.yoff > self.im.size[1] - ): - msg = "Tile cannot extend outside image" - raise ValueError(msg) - - -class PyDecoder(PyCodec): - """ - Python implementation of a format decoder. Override this class and - add the decoding logic in the :meth:`decode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pulls_fd = False - - @property - def pulls_fd(self) -> bool: - return self._pulls_fd - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - """ - Override to perform the decoding process. - - :param buffer: A bytes object with the data to be decoded. - :returns: A tuple of ``(bytes consumed, errcode)``. - If finished with decoding return -1 for the bytes consumed. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - msg = "unavailable in base decoder" - raise NotImplementedError(msg) - - def set_as_raw( - self, data: bytes, rawmode: str | None = None, extra: tuple[Any, ...] = () - ) -> None: - """ - Convenience method to set the internal image from a stream of raw data - - :param data: Bytes to be set - :param rawmode: The rawmode to be used for the decoder. - If not specified, it will default to the mode of the image - :param extra: Extra arguments for the decoder. - :returns: None - """ - - if not rawmode: - rawmode = self.mode - d = Image._getdecoder(self.mode, "raw", rawmode, extra) - assert self.im is not None - d.setimage(self.im, self.state.extents()) - s = d.decode(data) - - if s[0] >= 0: - msg = "not enough image data" - raise ValueError(msg) - if s[1] != 0: - msg = "cannot decode image data" - raise ValueError(msg) - - -class PyEncoder(PyCodec): - """ - Python implementation of a format encoder. Override this class and - add the decoding logic in the :meth:`encode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pushes_fd = False - - @property - def pushes_fd(self) -> bool: - return self._pushes_fd - - def encode(self, bufsize: int) -> tuple[int, int, bytes]: - """ - Override to perform the encoding process. - - :param bufsize: Buffer size. - :returns: A tuple of ``(bytes encoded, errcode, bytes)``. - If finished with encoding return 1 for the error code. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - msg = "unavailable in base encoder" - raise NotImplementedError(msg) - - def encode_to_pyfd(self) -> tuple[int, int]: - """ - If ``pushes_fd`` is ``True``, then this method will be used, - and ``encode()`` will only be called once. - - :returns: A tuple of ``(bytes consumed, errcode)``. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - if not self.pushes_fd: - return 0, -8 # bad configuration - bytes_consumed, errcode, data = self.encode(0) - if data: - assert self.fd is not None - self.fd.write(data) - return bytes_consumed, errcode - - def encode_to_file(self, fh: int, bufsize: int) -> int: - """ - :param fh: File handle. - :param bufsize: Buffer size. - - :returns: If finished successfully, return 0. - Otherwise, return an error code. Err codes are from - :data:`.ImageFile.ERRORS`. - """ - errcode = 0 - while errcode == 0: - status, errcode, buf = self.encode(bufsize) - if status > 0: - os.write(fh, buf[status:]) - return errcode diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageFilter.py b/.venv/lib/python3.10/site-packages/PIL/ImageFilter.py deleted file mode 100644 index b9ed54a..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageFilter.py +++ /dev/null @@ -1,604 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard filters -# -# History: -# 1995-11-27 fl Created -# 2002-06-08 fl Added rank and mode filters -# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2002 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import abc -import functools -from collections.abc import Sequence -from types import ModuleType -from typing import Any, Callable, cast - -TYPE_CHECKING = False -if TYPE_CHECKING: - from . import _imaging - from ._typing import NumpyArray - - -class Filter(abc.ABC): - @abc.abstractmethod - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - pass - - -class MultibandFilter(Filter): - pass - - -class BuiltinFilter(MultibandFilter): - filterargs: tuple[Any, ...] - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - if image.mode == "P": - msg = "cannot filter palette images" - raise ValueError(msg) - return image.filter(*self.filterargs) - - -class Kernel(BuiltinFilter): - """ - Create a convolution kernel. This only supports 3x3 and 5x5 integer and floating - point kernels. - - Kernels can only be applied to "L" and "RGB" images. - - :param size: Kernel size, given as (width, height). This must be (3,3) or (5,5). - :param kernel: A sequence containing kernel weights. The kernel will be flipped - vertically before being applied to the image. - :param scale: Scale factor. If given, the result for each pixel is divided by this - value. The default is the sum of the kernel weights. - :param offset: Offset. If given, this value is added to the result, after it has - been divided by the scale factor. - """ - - name = "Kernel" - - def __init__( - self, - size: tuple[int, int], - kernel: Sequence[float], - scale: float | None = None, - offset: float = 0, - ) -> None: - if scale is None: - # default scale is sum of kernel - scale = functools.reduce(lambda a, b: a + b, kernel) - if size[0] * size[1] != len(kernel): - msg = "not enough coefficients in kernel" - raise ValueError(msg) - self.filterargs = size, scale, offset, kernel - - -class RankFilter(Filter): - """ - Create a rank filter. The rank filter sorts all pixels in - a window of the given size, and returns the ``rank``'th value. - - :param size: The kernel size, in pixels. - :param rank: What pixel value to pick. Use 0 for a min filter, - ``size * size / 2`` for a median filter, ``size * size - 1`` - for a max filter, etc. - """ - - name = "Rank" - - def __init__(self, size: int, rank: int) -> None: - self.size = size - self.rank = rank - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - if image.mode == "P": - msg = "cannot filter palette images" - raise ValueError(msg) - image = image.expand(self.size // 2, self.size // 2) - return image.rankfilter(self.size, self.rank) - - -class MedianFilter(RankFilter): - """ - Create a median filter. Picks the median pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Median" - - def __init__(self, size: int = 3) -> None: - self.size = size - self.rank = size * size // 2 - - -class MinFilter(RankFilter): - """ - Create a min filter. Picks the lowest pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Min" - - def __init__(self, size: int = 3) -> None: - self.size = size - self.rank = 0 - - -class MaxFilter(RankFilter): - """ - Create a max filter. Picks the largest pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Max" - - def __init__(self, size: int = 3) -> None: - self.size = size - self.rank = size * size - 1 - - -class ModeFilter(Filter): - """ - Create a mode filter. Picks the most frequent pixel value in a box with the - given size. Pixel values that occur only once or twice are ignored; if no - pixel value occurs more than twice, the original pixel value is preserved. - - :param size: The kernel size, in pixels. - """ - - name = "Mode" - - def __init__(self, size: int = 3) -> None: - self.size = size - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - return image.modefilter(self.size) - - -class GaussianBlur(MultibandFilter): - """Blurs the image with a sequence of extended box filters, which - approximates a Gaussian kernel. For details on accuracy see - - - :param radius: Standard deviation of the Gaussian kernel. Either a sequence of two - numbers for x and y, or a single number for both. - """ - - name = "GaussianBlur" - - def __init__(self, radius: float | Sequence[float] = 2) -> None: - self.radius = radius - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - xy = self.radius - if isinstance(xy, (int, float)): - xy = (xy, xy) - if xy == (0, 0): - return image.copy() - return image.gaussian_blur(xy) - - -class BoxBlur(MultibandFilter): - """Blurs the image by setting each pixel to the average value of the pixels - in a square box extending radius pixels in each direction. - Supports float radius of arbitrary size. Uses an optimized implementation - which runs in linear time relative to the size of the image - for any radius value. - - :param radius: Size of the box in a direction. Either a sequence of two numbers for - x and y, or a single number for both. - - Radius 0 does not blur, returns an identical image. - Radius 1 takes 1 pixel in each direction, i.e. 9 pixels in total. - """ - - name = "BoxBlur" - - def __init__(self, radius: float | Sequence[float]) -> None: - xy = radius if isinstance(radius, (tuple, list)) else (radius, radius) - if xy[0] < 0 or xy[1] < 0: - msg = "radius must be >= 0" - raise ValueError(msg) - self.radius = radius - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - xy = self.radius - if isinstance(xy, (int, float)): - xy = (xy, xy) - if xy == (0, 0): - return image.copy() - return image.box_blur(xy) - - -class UnsharpMask(MultibandFilter): - """Unsharp mask filter. - - See Wikipedia's entry on `digital unsharp masking`_ for an explanation of - the parameters. - - :param radius: Blur Radius - :param percent: Unsharp strength, in percent - :param threshold: Threshold controls the minimum brightness change that - will be sharpened - - .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking - - """ - - name = "UnsharpMask" - - def __init__( - self, radius: float = 2, percent: int = 150, threshold: int = 3 - ) -> None: - self.radius = radius - self.percent = percent - self.threshold = threshold - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - return image.unsharp_mask(self.radius, self.percent, self.threshold) - - -class BLUR(BuiltinFilter): - name = "Blur" - # fmt: off - filterargs = (5, 5), 16, 0, ( - 1, 1, 1, 1, 1, - 1, 0, 0, 0, 1, - 1, 0, 0, 0, 1, - 1, 0, 0, 0, 1, - 1, 1, 1, 1, 1, - ) - # fmt: on - - -class CONTOUR(BuiltinFilter): - name = "Contour" - # fmt: off - filterargs = (3, 3), 1, 255, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class DETAIL(BuiltinFilter): - name = "Detail" - # fmt: off - filterargs = (3, 3), 6, 0, ( - 0, -1, 0, - -1, 10, -1, - 0, -1, 0, - ) - # fmt: on - - -class EDGE_ENHANCE(BuiltinFilter): - name = "Edge-enhance" - # fmt: off - filterargs = (3, 3), 2, 0, ( - -1, -1, -1, - -1, 10, -1, - -1, -1, -1, - ) - # fmt: on - - -class EDGE_ENHANCE_MORE(BuiltinFilter): - name = "Edge-enhance More" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 9, -1, - -1, -1, -1, - ) - # fmt: on - - -class EMBOSS(BuiltinFilter): - name = "Emboss" - # fmt: off - filterargs = (3, 3), 1, 128, ( - -1, 0, 0, - 0, 1, 0, - 0, 0, 0, - ) - # fmt: on - - -class FIND_EDGES(BuiltinFilter): - name = "Find Edges" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class SHARPEN(BuiltinFilter): - name = "Sharpen" - # fmt: off - filterargs = (3, 3), 16, 0, ( - -2, -2, -2, - -2, 32, -2, - -2, -2, -2, - ) - # fmt: on - - -class SMOOTH(BuiltinFilter): - name = "Smooth" - # fmt: off - filterargs = (3, 3), 13, 0, ( - 1, 1, 1, - 1, 5, 1, - 1, 1, 1, - ) - # fmt: on - - -class SMOOTH_MORE(BuiltinFilter): - name = "Smooth More" - # fmt: off - filterargs = (5, 5), 100, 0, ( - 1, 1, 1, 1, 1, - 1, 5, 5, 5, 1, - 1, 5, 44, 5, 1, - 1, 5, 5, 5, 1, - 1, 1, 1, 1, 1, - ) - # fmt: on - - -class Color3DLUT(MultibandFilter): - """Three-dimensional color lookup table. - - Transforms 3-channel pixels using the values of the channels as coordinates - in the 3D lookup table and interpolating the nearest elements. - - This method allows you to apply almost any color transformation - in constant time by using pre-calculated decimated tables. - - .. versionadded:: 5.2.0 - - :param size: Size of the table. One int or tuple of (int, int, int). - Minimal size in any dimension is 2, maximum is 65. - :param table: Flat lookup table. A list of ``channels * size**3`` - float elements or a list of ``size**3`` channels-sized - tuples with floats. Channels are changed first, - then first dimension, then second, then third. - Value 0.0 corresponds lowest value of output, 1.0 highest. - :param channels: Number of channels in the table. Could be 3 or 4. - Default is 3. - :param target_mode: A mode for the result image. Should have not less - than ``channels`` channels. Default is ``None``, - which means that mode wouldn't be changed. - """ - - name = "Color 3D LUT" - - def __init__( - self, - size: int | tuple[int, int, int], - table: Sequence[float] | Sequence[Sequence[int]] | NumpyArray, - channels: int = 3, - target_mode: str | None = None, - **kwargs: bool, - ) -> None: - if channels not in (3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - self.size = size = self._check_size(size) - self.channels = channels - self.mode = target_mode - - # Hidden flag `_copy_table=False` could be used to avoid extra copying - # of the table if the table is specially made for the constructor. - copy_table = kwargs.get("_copy_table", True) - items = size[0] * size[1] * size[2] - wrong_size = False - - numpy: ModuleType | None = None - if hasattr(table, "shape"): - try: - import numpy - except ImportError: - pass - - if numpy and isinstance(table, numpy.ndarray): - numpy_table: NumpyArray = table - if copy_table: - numpy_table = numpy_table.copy() - - if numpy_table.shape in [ - (items * channels,), - (items, channels), - (size[2], size[1], size[0], channels), - ]: - table = numpy_table.reshape(items * channels) - else: - wrong_size = True - - else: - if copy_table: - table = list(table) - - # Convert to a flat list - if table and isinstance(table[0], (list, tuple)): - raw_table = cast(Sequence[Sequence[int]], table) - flat_table: list[int] = [] - for pixel in raw_table: - if len(pixel) != channels: - msg = ( - "The elements of the table should " - f"have a length of {channels}." - ) - raise ValueError(msg) - flat_table.extend(pixel) - table = flat_table - - if wrong_size or len(table) != items * channels: - msg = ( - "The table should have either channels * size**3 float items " - "or size**3 items of channels-sized tuples with floats. " - f"Table should be: {channels}x{size[0]}x{size[1]}x{size[2]}. " - f"Actual length: {len(table)}" - ) - raise ValueError(msg) - self.table = table - - @staticmethod - def _check_size(size: Any) -> tuple[int, int, int]: - try: - _, _, _ = size - except ValueError as e: - msg = "Size should be either an integer or a tuple of three integers." - raise ValueError(msg) from e - except TypeError: - size = (size, size, size) - size = tuple(int(x) for x in size) - for size_1d in size: - if not 2 <= size_1d <= 65: - msg = "Size should be in [2, 65] range." - raise ValueError(msg) - return size - - @classmethod - def generate( - cls, - size: int | tuple[int, int, int], - callback: Callable[[float, float, float], tuple[float, ...]], - channels: int = 3, - target_mode: str | None = None, - ) -> Color3DLUT: - """Generates new LUT using provided callback. - - :param size: Size of the table. Passed to the constructor. - :param callback: Function with three parameters which correspond - three color channels. Will be called ``size**3`` - times with values from 0.0 to 1.0 and should return - a tuple with ``channels`` elements. - :param channels: The number of channels which should return callback. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - size_1d, size_2d, size_3d = cls._check_size(size) - if channels not in (3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - - table: list[float] = [0] * (size_1d * size_2d * size_3d * channels) - idx_out = 0 - for b in range(size_3d): - for g in range(size_2d): - for r in range(size_1d): - table[idx_out : idx_out + channels] = callback( - r / (size_1d - 1), g / (size_2d - 1), b / (size_3d - 1) - ) - idx_out += channels - - return cls( - (size_1d, size_2d, size_3d), - table, - channels=channels, - target_mode=target_mode, - _copy_table=False, - ) - - def transform( - self, - callback: Callable[..., tuple[float, ...]], - with_normals: bool = False, - channels: int | None = None, - target_mode: str | None = None, - ) -> Color3DLUT: - """Transforms the table values using provided callback and returns - a new LUT with altered values. - - :param callback: A function which takes old lookup table values - and returns a new set of values. The number - of arguments which function should take is - ``self.channels`` or ``3 + self.channels`` - if ``with_normals`` flag is set. - Should return a tuple of ``self.channels`` or - ``channels`` elements if it is set. - :param with_normals: If true, ``callback`` will be called with - coordinates in the color cube as the first - three arguments. Otherwise, ``callback`` - will be called only with actual color values. - :param channels: The number of channels in the resulting lookup table. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - if channels not in (None, 3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - ch_in = self.channels - ch_out = channels or ch_in - size_1d, size_2d, size_3d = self.size - - table: list[float] = [0] * (size_1d * size_2d * size_3d * ch_out) - idx_in = 0 - idx_out = 0 - for b in range(size_3d): - for g in range(size_2d): - for r in range(size_1d): - values = self.table[idx_in : idx_in + ch_in] - if with_normals: - values = callback( - r / (size_1d - 1), - g / (size_2d - 1), - b / (size_3d - 1), - *values, - ) - else: - values = callback(*values) - table[idx_out : idx_out + ch_out] = values - idx_in += ch_in - idx_out += ch_out - - return type(self)( - self.size, - table, - channels=ch_out, - target_mode=target_mode or self.mode, - _copy_table=False, - ) - - def __repr__(self) -> str: - r = [ - f"{self.__class__.__name__} from {self.table.__class__.__name__}", - "size={:d}x{:d}x{:d}".format(*self.size), - f"channels={self.channels:d}", - ] - if self.mode: - r.append(f"target_mode={self.mode}") - return "<{}>".format(" ".join(r)) - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - from . import Image - - return image.color_lut_3d( - self.mode or image.mode, - Image.Resampling.BILINEAR, - self.channels, - self.size, - self.table, - ) diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageFont.py b/.venv/lib/python3.10/site-packages/PIL/ImageFont.py deleted file mode 100644 index ebe510b..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageFont.py +++ /dev/null @@ -1,1339 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PIL raster font management -# -# History: -# 1996-08-07 fl created (experimental) -# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 -# 1999-02-06 fl rewrote most font management stuff in C -# 1999-03-17 fl take pth files into account in load_path (from Richard Jones) -# 2001-02-17 fl added freetype support -# 2001-05-09 fl added TransposedFont wrapper class -# 2002-03-04 fl make sure we have a "L" or "1" font -# 2002-12-04 fl skip non-directory entries in the system path -# 2003-04-29 fl add embedded default font -# 2003-09-27 fl added support for truetype charmap encodings -# -# Todo: -# Adapt to PILFONT2 format (16-bit fonts, compressed, single file) -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from __future__ import annotations - -import base64 -import os -import sys -import warnings -from enum import IntEnum -from io import BytesIO -from types import ModuleType -from typing import IO, Any, BinaryIO, TypedDict, cast - -from . import Image, features -from ._typing import StrOrBytesPath -from ._util import DeferredError, is_path - -TYPE_CHECKING = False -if TYPE_CHECKING: - from . import ImageFile - from ._imaging import ImagingFont - from ._imagingft import Font - - -class Axis(TypedDict): - minimum: int | None - default: int | None - maximum: int | None - name: bytes | None - - -class Layout(IntEnum): - BASIC = 0 - RAQM = 1 - - -MAX_STRING_LENGTH = 1_000_000 - - -core: ModuleType | DeferredError -try: - from . import _imagingft as core -except ImportError as ex: - core = DeferredError.new(ex) - - -def _string_length_check(text: str | bytes | bytearray) -> None: - if MAX_STRING_LENGTH is not None and len(text) > MAX_STRING_LENGTH: - msg = "too many characters in string" - raise ValueError(msg) - - -# FIXME: add support for pilfont2 format (see FontFile.py) - -# -------------------------------------------------------------------- -# Font metrics format: -# "PILfont" LF -# fontdescriptor LF -# (optional) key=value... LF -# "DATA" LF -# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) -# -# To place a character, cut out srcbox and paste at dstbox, -# relative to the character position. Then move the character -# position according to dx, dy. -# -------------------------------------------------------------------- - - -class ImageFont: - """PIL font wrapper""" - - font: ImagingFont - - def _load_pilfont(self, filename: str) -> None: - with open(filename, "rb") as fp: - image: ImageFile.ImageFile | None = None - root = os.path.splitext(filename)[0] - - for ext in (".png", ".gif", ".pbm"): - if image: - image.close() - try: - fullname = root + ext - image = Image.open(fullname) - except Exception: - pass - else: - if image and image.mode in ("1", "L"): - break - else: - if image: - image.close() - - msg = f"cannot find glyph data file {root}.{{gif|pbm|png}}" - raise OSError(msg) - - self.file = fullname - - self._load_pilfont_data(fp, image) - image.close() - - def _load_pilfont_data(self, file: IO[bytes], image: Image.Image) -> None: - # read PILfont header - if file.readline() != b"PILfont\n": - msg = "Not a PILfont file" - raise SyntaxError(msg) - file.readline().split(b";") - self.info = [] # FIXME: should be a dictionary - while True: - s = file.readline() - if not s or s == b"DATA\n": - break - self.info.append(s) - - # read PILfont metrics - data = file.read(256 * 20) - - # check image - if image.mode not in ("1", "L"): - msg = "invalid font image mode" - raise TypeError(msg) - - image.load() - - self.font = Image.core.font(image.im, data) - - def getmask( - self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any - ) -> Image.core.ImagingCore: - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - _string_length_check(text) - Image._decompression_bomb_check(self.font.getsize(text)) - return self.font.getmask(text, mode) - - def getbbox( - self, text: str | bytes | bytearray, *args: Any, **kwargs: Any - ) -> tuple[int, int, int, int]: - """ - Returns bounding box (in pixels) of given text. - - .. versionadded:: 9.2.0 - - :param text: Text to render. - - :return: ``(left, top, right, bottom)`` bounding box - """ - _string_length_check(text) - width, height = self.font.getsize(text) - return 0, 0, width, height - - def getlength( - self, text: str | bytes | bytearray, *args: Any, **kwargs: Any - ) -> int: - """ - Returns length (in pixels) of given text. - This is the amount by which following text should be offset. - - .. versionadded:: 9.2.0 - """ - _string_length_check(text) - width, height = self.font.getsize(text) - return width - - -## -# Wrapper for FreeType fonts. Application code should use the -# truetype factory function to create font objects. - - -class FreeTypeFont: - """FreeType font wrapper (requires _imagingft service)""" - - font: Font - font_bytes: bytes - - def __init__( - self, - font: StrOrBytesPath | BinaryIO, - size: float = 10, - index: int = 0, - encoding: str = "", - layout_engine: Layout | None = None, - ) -> None: - # FIXME: use service provider instead - - if isinstance(core, DeferredError): - raise core.ex - - if size <= 0: - msg = f"font size must be greater than 0, not {size}" - raise ValueError(msg) - - self.path = font - self.size = size - self.index = index - self.encoding = encoding - - try: - from packaging.version import parse as parse_version - except ImportError: - pass - else: - if freetype_version := features.version_module("freetype2"): - if parse_version(freetype_version) < parse_version("2.9.1"): - warnings.warn( - "Support for FreeType 2.9.0 is deprecated and will be removed " - "in Pillow 12 (2025-10-15). Please upgrade to FreeType 2.9.1 " - "or newer, preferably FreeType 2.10.4 which fixes " - "CVE-2020-15999.", - DeprecationWarning, - ) - - if layout_engine not in (Layout.BASIC, Layout.RAQM): - layout_engine = Layout.BASIC - if core.HAVE_RAQM: - layout_engine = Layout.RAQM - elif layout_engine == Layout.RAQM and not core.HAVE_RAQM: - warnings.warn( - "Raqm layout was requested, but Raqm is not available. " - "Falling back to basic layout." - ) - layout_engine = Layout.BASIC - - self.layout_engine = layout_engine - - def load_from_bytes(f: IO[bytes]) -> None: - self.font_bytes = f.read() - self.font = core.getfont( - "", size, index, encoding, self.font_bytes, layout_engine - ) - - if is_path(font): - font = os.fspath(font) - if sys.platform == "win32": - font_bytes_path = font if isinstance(font, bytes) else font.encode() - try: - font_bytes_path.decode("ascii") - except UnicodeDecodeError: - # FreeType cannot load fonts with non-ASCII characters on Windows - # So load it into memory first - with open(font, "rb") as f: - load_from_bytes(f) - return - self.font = core.getfont( - font, size, index, encoding, layout_engine=layout_engine - ) - else: - load_from_bytes(cast(IO[bytes], font)) - - def __getstate__(self) -> list[Any]: - return [self.path, self.size, self.index, self.encoding, self.layout_engine] - - def __setstate__(self, state: list[Any]) -> None: - path, size, index, encoding, layout_engine = state - FreeTypeFont.__init__(self, path, size, index, encoding, layout_engine) - - def getname(self) -> tuple[str | None, str | None]: - """ - :return: A tuple of the font family (e.g. Helvetica) and the font style - (e.g. Bold) - """ - return self.font.family, self.font.style - - def getmetrics(self) -> tuple[int, int]: - """ - :return: A tuple of the font ascent (the distance from the baseline to - the highest outline point) and descent (the distance from the - baseline to the lowest outline point, a negative value) - """ - return self.font.ascent, self.font.descent - - def getlength( - self, - text: str | bytes, - mode: str = "", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - ) -> float: - """ - Returns length (in pixels with 1/64 precision) of given text when rendered - in font with provided direction, features, and language. - - This is the amount by which following text should be offset. - Text bounding box may extend past the length in some fonts, - e.g. when using italics or accents. - - The result is returned as a float; it is a whole number if using basic layout. - - Note that the sum of two lengths may not equal the length of a concatenated - string due to kerning. If you need to adjust for kerning, include the following - character and subtract its length. - - For example, instead of :: - - hello = font.getlength("Hello") - world = font.getlength("World") - hello_world = hello + world # not adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # may fail - - use :: - - hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning - world = font.getlength("World") - hello_world = hello + world # adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # True - - or disable kerning with (requires libraqm) :: - - hello = draw.textlength("Hello", font, features=["-kern"]) - world = draw.textlength("World", font, features=["-kern"]) - hello_world = hello + world # kerning is disabled, no need to adjust - assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"]) - - .. versionadded:: 8.0.0 - - :param text: Text to measure. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :return: Either width for horizontal text, or height for vertical text. - """ - _string_length_check(text) - return self.font.getlength(text, mode, direction, features, language) / 64 - - def getbbox( - self, - text: str | bytes, - mode: str = "", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - anchor: str | None = None, - ) -> tuple[float, float, float, float]: - """ - Returns bounding box (in pixels) of given text relative to given anchor - when rendered in font with provided direction, features, and language. - - Use :py:meth:`getlength()` to get the offset of following text with - 1/64 pixel precision. The bounding box includes extra margins for - some fonts, e.g. italics or accents. - - .. versionadded:: 8.0.0 - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :param stroke_width: The width of the text stroke. - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - :return: ``(left, top, right, bottom)`` bounding box - """ - _string_length_check(text) - size, offset = self.font.getsize( - text, mode, direction, features, language, anchor - ) - left, top = offset[0] - stroke_width, offset[1] - stroke_width - width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width - return left, top, left + width, top + height - - def getmask( - self, - text: str | bytes, - mode: str = "", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - anchor: str | None = None, - ink: int = 0, - start: tuple[float, float] | None = None, - ) -> Image.core.ImagingCore: - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :param start: Tuple of horizontal and vertical offset, as text may render - differently when starting at fractional coordinates. - - .. versionadded:: 9.4.0 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - return self.getmask2( - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - anchor=anchor, - ink=ink, - start=start, - )[0] - - def getmask2( - self, - text: str | bytes, - mode: str = "", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - anchor: str | None = None, - ink: int = 0, - start: tuple[float, float] | None = None, - *args: Any, - **kwargs: Any, - ) -> tuple[Image.core.ImagingCore, tuple[int, int]]: - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :param start: Tuple of horizontal and vertical offset, as text may render - differently when starting at fractional coordinates. - - .. versionadded:: 9.4.0 - - :return: A tuple of an internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module, and the text offset, the - gap between the starting coordinate and the first marking - """ - _string_length_check(text) - if start is None: - start = (0, 0) - - def fill(width: int, height: int) -> Image.core.ImagingCore: - size = (width, height) - Image._decompression_bomb_check(size) - return Image.core.fill("RGBA" if mode == "RGBA" else "L", size) - - return self.font.render( - text, - fill, - mode, - direction, - features, - language, - stroke_width, - kwargs.get("stroke_filled", False), - anchor, - ink, - start, - ) - - def font_variant( - self, - font: StrOrBytesPath | BinaryIO | None = None, - size: float | None = None, - index: int | None = None, - encoding: str | None = None, - layout_engine: Layout | None = None, - ) -> FreeTypeFont: - """ - Create a copy of this FreeTypeFont object, - using any specified arguments to override the settings. - - Parameters are identical to the parameters used to initialize this - object. - - :return: A FreeTypeFont object. - """ - if font is None: - try: - font = BytesIO(self.font_bytes) - except AttributeError: - font = self.path - return FreeTypeFont( - font=font, - size=self.size if size is None else size, - index=self.index if index is None else index, - encoding=self.encoding if encoding is None else encoding, - layout_engine=layout_engine or self.layout_engine, - ) - - def get_variation_names(self) -> list[bytes]: - """ - :returns: A list of the named styles in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - names = self.font.getvarnames() - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - return [name.replace(b"\x00", b"") for name in names] - - def set_variation_by_name(self, name: str | bytes) -> None: - """ - :param name: The name of the style. - :exception OSError: If the font is not a variation font. - """ - names = self.get_variation_names() - if not isinstance(name, bytes): - name = name.encode() - index = names.index(name) + 1 - - if index == getattr(self, "_last_variation_index", None): - # When the same name is set twice in a row, - # there is an 'unknown freetype error' - # https://savannah.nongnu.org/bugs/?56186 - return - self._last_variation_index = index - - self.font.setvarname(index) - - def get_variation_axes(self) -> list[Axis]: - """ - :returns: A list of the axes in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - axes = self.font.getvaraxes() - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - for axis in axes: - if axis["name"]: - axis["name"] = axis["name"].replace(b"\x00", b"") - return axes - - def set_variation_by_axes(self, axes: list[float]) -> None: - """ - :param axes: A list of values for each axis. - :exception OSError: If the font is not a variation font. - """ - try: - self.font.setvaraxes(axes) - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - - -class TransposedFont: - """Wrapper for writing rotated or mirrored text""" - - def __init__( - self, font: ImageFont | FreeTypeFont, orientation: Image.Transpose | None = None - ): - """ - Wrapper that creates a transposed font from any existing font - object. - - :param font: A font object. - :param orientation: An optional orientation. If given, this should - be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM, - Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or - Image.Transpose.ROTATE_270. - """ - self.font = font - self.orientation = orientation # any 'transpose' argument, or None - - def getmask( - self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any - ) -> Image.core.ImagingCore: - im = self.font.getmask(text, mode, *args, **kwargs) - if self.orientation is not None: - return im.transpose(self.orientation) - return im - - def getbbox( - self, text: str | bytes, *args: Any, **kwargs: Any - ) -> tuple[int, int, float, float]: - # TransposedFont doesn't support getmask2, move top-left point to (0, 0) - # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont - left, top, right, bottom = self.font.getbbox(text, *args, **kwargs) - width = right - left - height = bottom - top - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - return 0, 0, height, width - return 0, 0, width, height - - def getlength(self, text: str | bytes, *args: Any, **kwargs: Any) -> float: - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - msg = "text length is undefined for text rotated by 90 or 270 degrees" - raise ValueError(msg) - return self.font.getlength(text, *args, **kwargs) - - -def load(filename: str) -> ImageFont: - """ - Load a font file. This function loads a font object from the given - bitmap font file, and returns the corresponding font object. For loading TrueType - or OpenType fonts instead, see :py:func:`~PIL.ImageFont.truetype`. - - :param filename: Name of font file. - :return: A font object. - :exception OSError: If the file could not be read. - """ - f = ImageFont() - f._load_pilfont(filename) - return f - - -def truetype( - font: StrOrBytesPath | BinaryIO, - size: float = 10, - index: int = 0, - encoding: str = "", - layout_engine: Layout | None = None, -) -> FreeTypeFont: - """ - Load a TrueType or OpenType font from a file or file-like object, - and create a font object. This function loads a font object from the given - file or file-like object, and creates a font object for a font of the given - size. For loading bitmap fonts instead, see :py:func:`~PIL.ImageFont.load` - and :py:func:`~PIL.ImageFont.load_path`. - - Pillow uses FreeType to open font files. On Windows, be aware that FreeType - will keep the file open as long as the FreeTypeFont object exists. Windows - limits the number of files that can be open in C at once to 512, so if many - fonts are opened simultaneously and that limit is approached, an - ``OSError`` may be thrown, reporting that FreeType "cannot open resource". - A workaround would be to copy the file(s) into memory, and open that instead. - - This function requires the _imagingft service. - - :param font: A filename or file-like object containing a TrueType font. - If the file is not found in this filename, the loader may also - search in other directories, such as: - - * The :file:`fonts/` directory on Windows, - * :file:`/Library/Fonts/`, :file:`/System/Library/Fonts/` - and :file:`~/Library/Fonts/` on macOS. - * :file:`~/.local/share/fonts`, :file:`/usr/local/share/fonts`, - and :file:`/usr/share/fonts` on Linux; or those specified by - the ``XDG_DATA_HOME`` and ``XDG_DATA_DIRS`` environment variables - for user-installed and system-wide fonts, respectively. - - :param size: The requested size, in pixels. - :param index: Which font face to load (default is first available face). - :param encoding: Which font encoding to use (default is Unicode). Possible - encodings include (see the FreeType documentation for more - information): - - * "unic" (Unicode) - * "symb" (Microsoft Symbol) - * "ADOB" (Adobe Standard) - * "ADBE" (Adobe Expert) - * "ADBC" (Adobe Custom) - * "armn" (Apple Roman) - * "sjis" (Shift JIS) - * "gb " (PRC) - * "big5" - * "wans" (Extended Wansung) - * "joha" (Johab) - * "lat1" (Latin-1) - - This specifies the character set to use. It does not alter the - encoding of any text provided in subsequent operations. - :param layout_engine: Which layout engine to use, if available: - :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`. - If it is available, Raqm layout will be used by default. - Otherwise, basic layout will be used. - - Raqm layout is recommended for all non-English text. If Raqm layout - is not required, basic layout will have better performance. - - You can check support for Raqm layout using - :py:func:`PIL.features.check_feature` with ``feature="raqm"``. - - .. versionadded:: 4.2.0 - :return: A font object. - :exception OSError: If the file could not be read. - :exception ValueError: If the font size is not greater than zero. - """ - - def freetype(font: StrOrBytesPath | BinaryIO) -> FreeTypeFont: - return FreeTypeFont(font, size, index, encoding, layout_engine) - - try: - return freetype(font) - except OSError: - if not is_path(font): - raise - ttf_filename = os.path.basename(font) - - dirs = [] - if sys.platform == "win32": - # check the windows font repository - # NOTE: must use uppercase WINDIR, to work around bugs in - # 1.5.2's os.environ.get() - windir = os.environ.get("WINDIR") - if windir: - dirs.append(os.path.join(windir, "fonts")) - elif sys.platform in ("linux", "linux2"): - data_home = os.environ.get("XDG_DATA_HOME") - if not data_home: - # The freedesktop spec defines the following default directory for - # when XDG_DATA_HOME is unset or empty. This user-level directory - # takes precedence over system-level directories. - data_home = os.path.expanduser("~/.local/share") - xdg_dirs = [data_home] - - data_dirs = os.environ.get("XDG_DATA_DIRS") - if not data_dirs: - # Similarly, defaults are defined for the system-level directories - data_dirs = "/usr/local/share:/usr/share" - xdg_dirs += data_dirs.split(":") - - dirs += [os.path.join(xdg_dir, "fonts") for xdg_dir in xdg_dirs] - elif sys.platform == "darwin": - dirs += [ - "/Library/Fonts", - "/System/Library/Fonts", - os.path.expanduser("~/Library/Fonts"), - ] - - ext = os.path.splitext(ttf_filename)[1] - first_font_with_a_different_extension = None - for directory in dirs: - for walkroot, walkdir, walkfilenames in os.walk(directory): - for walkfilename in walkfilenames: - if ext and walkfilename == ttf_filename: - return freetype(os.path.join(walkroot, walkfilename)) - elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: - fontpath = os.path.join(walkroot, walkfilename) - if os.path.splitext(fontpath)[1] == ".ttf": - return freetype(fontpath) - if not ext and first_font_with_a_different_extension is None: - first_font_with_a_different_extension = fontpath - if first_font_with_a_different_extension: - return freetype(first_font_with_a_different_extension) - raise - - -def load_path(filename: str | bytes) -> ImageFont: - """ - Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a - bitmap font along the Python path. - - :param filename: Name of font file. - :return: A font object. - :exception OSError: If the file could not be read. - """ - if not isinstance(filename, str): - filename = filename.decode("utf-8") - for directory in sys.path: - try: - return load(os.path.join(directory, filename)) - except OSError: - pass - msg = f'cannot find font file "{filename}" in sys.path' - if os.path.exists(filename): - msg += f', did you mean ImageFont.load("{filename}") instead?' - - raise OSError(msg) - - -def load_default_imagefont() -> ImageFont: - f = ImageFont() - f._load_pilfont_data( - # courB08 - BytesIO( - base64.b64decode( - b""" -UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA -BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL -AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA -AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB -ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A -BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB -//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA -AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH -AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA -ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv -AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ -/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 -AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA -AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG -AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA -BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA -AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA -2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF -AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// -+gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA -////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA -BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv -AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA -AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA -AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA -BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// -//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA -AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF -AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB -mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn -AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA -AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 -AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA -Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB -//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA -AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ -AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC -DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ -AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ -+wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 -AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ -///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG -AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA -BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA -Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC -eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG -AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// -+gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA -////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA -BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT -AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A -AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA -Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA -Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// -//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA -AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ -AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA -LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 -AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA -AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 -AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA -AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG -AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA -EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK -AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA -pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG -AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// -+QAGAAIAzgAKANUAEw== -""" - ) - ), - Image.open( - BytesIO( - base64.b64decode( - b""" -iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u -Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 -M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g -LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F -IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA -Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 -NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx -in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 -SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY -AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt -y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG -ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY -lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H -/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 -AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 -c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ -/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw -pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv -oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR -evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA -AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// -Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR -w7IkEbzhVQAAAABJRU5ErkJggg== -""" - ) - ) - ), - ) - return f - - -def load_default(size: float | None = None) -> FreeTypeFont | ImageFont: - """If FreeType support is available, load a version of Aileron Regular, - https://dotcolon.net/font/aileron, with a more limited character set. - - Otherwise, load a "better than nothing" font. - - .. versionadded:: 1.1.4 - - :param size: The font size of Aileron Regular. - - .. versionadded:: 10.1.0 - - :return: A font object. - """ - if isinstance(core, ModuleType) or size is not None: - return truetype( - BytesIO( - base64.b64decode( - b""" -AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA -AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA -MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh -tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk -OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/ -2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ -AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI -BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA -AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ -AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk -QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB -kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC -ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA -EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg -JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y -AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q -AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq -QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB// -//4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT -FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT -U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA -AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9 -ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO -AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ -gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG -oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz -qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA -DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA -P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA -LfAAMABwAAEyMnMxcjJzOmRgpagkYKWgHl+vr6AAAAAAIARgAAAf4CsgAbAB8AAAEHMxUjByM3Iwc -jNyM1MzcjNTM3MwczNzMHMxUrAQczAZgdZXEvOi9bLzovWmYdZXEvOi9bLzovWp9bHlsBn4w429vb -2ziMONvb29s4jAAAAAMANf+mAg4DDAAfACYALAAAJRQGBxUjNS4BJzMeARcRLgE0Njc1MxUeARcjJ -icVHgEBFBYXNQ4BExU+ATU0Ag5xWDpgcgRcBz41Xl9oVTpVYwpcC1ttXP6cLTQuM5szOrVRZwlOTQ -ZqVzZECAEAGlukZAlOTQdrUG8O7iNlAQgxNhDlCDj+8/YGOjReAAAAAAUAKf/yArsCvAAHAAsAFQA -dACcAABIyFhQGIiY0EyMBMwQiBhUUFjI2NTQSMhYUBiImNDYiBhUUFjI2NTR5iFBQiFCVVwHAV/5c -OiMjOiPmiFBQiFCxOiMjOiMCvFaSVlaS/ZoCsjIzMC80NC8w/uNWklZWkhozMC80NC8wAAAAAgBA/ -/ICbgLAACIALgAAARUjEQYjIiY1NDY3LgE1NDYzMhcVJiMiBhUUFhcWOwE1MxUFFBYzMjc1IyIHDg -ECbmBcYYOOVkg7R4hsQjY4Q0RNRD4SLDxW/pJUXzksPCkUUk0BgUb+zBVUZ0BkDw5RO1huCkULQzp -COAMBcHDHRz0J/AIHRQAAAAEAKwHlAIUC3wADAAATIycze0YKWgHl+gAAAAABAGT/sAEXAwwACQAA -EzMGEBcjLgE0Nt06dXU6OUBAAwzG/jDGVePs4wAAAAEAHv+wANEDDAAJAAATMx4BFAYHIzYQHjo5Q -EA5OnUDDFXj7ONVxgHQAAAAAQBVAFIB2wHbAA4AAAE3FwcXBycHJzcnNxcnMwEtmxOfcTJjYzJxnx -ObCj4BKD07KYolmZkliik7PbMAAQBQAFUB9AIlAAsAAAEjFSM1IzUzNTMVMwH0tTq1tTq1AR/Kyjj -OzgAAAAAB/+H/iACMAGQABAAANwcjNzOMWlFOXVrS3AAAAQAgAP8A8gE3AAMAABMjNTPy0tIA/zgA -AQAl//IApQByAAcAADYyFhQGIiY0STgkJDgkciQ4JCQ4AAAAAf/7/+IBNALQAAMAABcjEzM5Pvs+H -gLuAAAAAAIAKf/yAhsCwAADAAcAABIgECA2IBAgKQHy/g5gATL+zgLA/TJEAkYAAAAAAQCCAAABlg -KyAAgAAAERIxEHNTc2MwGWVr6SIygCsv1OAldxW1sWAAEAPAAAAg4CwAAZAAA3IRUhNRM+ATU0JiM -iDwEjNz4BMzIWFRQGB7kBUv4x+kI2QTt+EAFWAQp8aGVtSl5GRjEA/0RVLzlLmAoKa3FsUkNxXQAA -AAEALf/yAhYCwAAqAAABHgEVFAYjIi8BMxceATMyNjU0KwE1MzI2NTQmIyIGDwEjNz4BMzIWFRQGA -YxBSZJo2RUBVgEHV0JBUaQREUBUQzc5TQcBVgEKfGhfcEMBbxJbQl1x0AoKRkZHPn9GSD80QUVCCg -pfbGBPOlgAAAACACEAAAIkArIACgAPAAAlIxUjNSE1ATMRMyMRBg8BAiRXVv6qAVZWV60dHLCurq4 -rAdn+QgFLMibzAAABADn/8gIZArIAHQAAATIWFRQGIyIvATMXFjMyNjU0JiMiByMTIRUhBzc2ATNv -d5Fl1RQBVgIad0VSTkVhL1IwAYj+vh8rMAHHgGdtgcUKCoFXTU5bYgGRRvAuHQAAAAACACv/8gITA -sAAFwAjAAABMhYVFAYjIhE0NjMyFh8BIycmIyIDNzYTMjY1NCYjIgYVFBYBLmp7imr0l3RZdAgBXA -IYZ5wKJzU6QVNJSz5SUAHSgWltiQFGxcNlVQoKdv7sPiz+ZF1LTmJbU0lhAAAAAQAyAAACGgKyAAY -AAAEVASMBITUCGv6oXAFL/oECsij9dgJsRgAAAAMALP/xAhgCwAAWACAALAAAAR4BFRQGIyImNTQ2 -Ny4BNTQ2MhYVFAYmIgYVFBYyNjU0AzI2NTQmIyIGFRQWAZQ5S5BmbIpPOjA7ecp5P2F8Q0J8RIVJS -0pLTEtOAW0TXTxpZ2ZqPF0SE1A3VWVlVTdQ/UU0N0RENzT9/ko+Ok1NOj1LAAIAMf/yAhkCwAAXAC -MAAAEyERQGIyImLwEzFxYzMhMHBiMiJjU0NhMyNjU0JiMiBhUUFgEl9Jd0WXQIAVwCGGecCic1SWp -7imo+UlBAQVNJAsD+usXDZVUKCnYBFD4sgWltif5kW1NJYV1LTmIAAAACACX/8gClAiAABwAPAAAS -MhYUBiImNBIyFhQGIiY0STgkJDgkJDgkJDgkAiAkOCQkOP52JDgkJDgAAAAC/+H/iAClAiAABwAMA -AASMhYUBiImNBMHIzczSTgkJDgkaFpSTl4CICQ4JCQ4/mba5gAAAQBnAB4B+AH0AAYAAAENARUlNS -UB+P6qAVb+bwGRAbCmpkbJRMkAAAIAUAC7AfQBuwADAAcAAAEhNSERITUhAfT+XAGk/lwBpAGDOP8 -AOAABAEQAHgHVAfQABgAAARUFNS0BNQHV/m8BVv6qAStEyUSmpkYAAAAAAgAj//IB1ALAABgAIAAA -ATIWFRQHDgEHIz4BNz4BNTQmIyIGByM+ARIyFhQGIiY0AQRibmktIAJWBSEqNig+NTlHBFoDezQ4J -CQ4JALAZ1BjaS03JS1DMD5LLDQ/SUVgcv2yJDgkJDgAAAAAAgA2/5gDFgKYADYAQgAAAQMGFRQzMj -Y1NCYjIg4CFRQWMzI2NxcGIyImNTQ+AjMyFhUUBiMiJwcGIyImNTQ2MzIfATcHNzYmIyIGFRQzMjY -Cej8EJjJJlnBAfGQ+oHtAhjUYg5OPx0h2k06Os3xRWQsVLjY5VHtdPBwJETcJDyUoOkZEJz8B0f74 -EQ8kZl6EkTFZjVOLlyknMVm1pmCiaTq4lX6CSCknTVRmmR8wPdYnQzxuSWVGAAIAHQAAAncCsgAHA -AoAACUjByMTMxMjATMDAcj+UVz4dO5d/sjPZPT0ArL9TgE6ATQAAAADAGQAAAJMArIAEAAbACcAAA -EeARUUBgcGKwERMzIXFhUUJRUzMjc2NTQnJiMTPgE1NCcmKwEVMzIBvkdHZkwiNt7LOSGq/oeFHBt -hahIlSTM+cB8Yj5UWAW8QT0VYYgwFArIEF5Fv1eMED2NfDAL93AU+N24PBP0AAAAAAQAv//ICjwLA -ABsAAAEyFh8BIycmIyIGFRQWMzI/ATMHDgEjIiY1NDYBdX+PCwFWAiKiaHx5ZaIiAlYBCpWBk6a0A -sCAagoKpqN/gaOmCgplhcicn8sAAAIAZAAAAp8CsgAMABkAAAEeARUUBgcGKwERMzITPgE1NCYnJi -sBETMyAY59lJp8IzXN0jUVWmdjWRs5d3I4Aq4QqJWUug8EArL9mQ+PeHGHDgX92gAAAAABAGQAAAI -vArIACwAAJRUhESEVIRUhFSEVAi/+NQHB/pUBTf6zRkYCskbwRvAAAAABAGQAAAIlArIACQAAExUh -FSERIxEhFboBQ/69VgHBAmzwRv7KArJGAAAAAAEAL//yAo8CwAAfAAABMxEjNQcGIyImNTQ2MzIWH -wEjJyYjIgYVFBYzMjY1IwGP90wfPnWTprSSf48LAVYCIqJofHllVG+hAU3+s3hARsicn8uAagoKpq -N/gaN1XAAAAAEAZAAAAowCsgALAAABESMRIREjETMRIRECjFb+hFZWAXwCsv1OAS7+0gKy/sQBPAA -AAAABAGQAAAC6ArIAAwAAMyMRM7pWVgKyAAABADf/8gHoArIAEwAAAREUBw4BIyImLwEzFxYzMjc2 -NREB6AIFcGpgbQIBVgIHfXQKAQKy/lYxIltob2EpKYyEFD0BpwAAAAABAGQAAAJ0ArIACwAACQEjA -wcVIxEzEQEzATsBJ3ntQlZWAVVlAWH+nwEnR+ACsv6RAW8AAQBkAAACLwKyAAUAACUVIREzEQIv/j -VWRkYCsv2UAAABAGQAAAMUArIAFAAAAREjETQ3BgcDIwMmJxYVESMRMxsBAxRWAiMxemx8NxsCVo7 -MywKy/U4BY7ZLco7+nAFmoFxLtP6dArL9lwJpAAAAAAEAZAAAAoACsgANAAAhIwEWFREjETMBJjUR -MwKAhP67A1aEAUUDVAJeeov+pwKy/aJ5jAFZAAAAAgAv//ICuwLAAAkAEwAAEiAWFRQGICY1NBIyN -jU0JiIGFRTbATSsrP7MrNrYenrYegLAxaKhxsahov47nIeIm5uIhwACAGQAAAJHArIADgAYAAABHg -EVFAYHBisBESMRMzITNjQnJisBETMyAZRUX2VOHzuAVtY7GlxcGDWIiDUCrgtnVlVpCgT+5gKy/rU -V1BUF/vgAAAACAC//zAK9AsAAEgAcAAAlFhcHJiMiBwYjIiY1NDYgFhUUJRQWMjY1NCYiBgI9PUMx -UDcfKh8omqysATSs/dR62Hp62HpICTg7NgkHxqGixcWitbWHnJyHiJubAAIAZAAAAlgCsgAXACMAA -CUWFyMmJyYnJisBESMRMzIXHgEVFAYHFiUzMjc+ATU0JyYrAQIqDCJfGQwNWhAhglbiOx9QXEY1Tv -6bhDATMj1lGSyMtYgtOXR0BwH+1wKyBApbU0BSESRAAgVAOGoQBAABADT/8gIoAsAAJQAAATIWFyM -uASMiBhUUFhceARUUBiMiJiczHgEzMjY1NCYnLgE1NDYBOmd2ClwGS0E6SUNRdW+HZnKKC1wPWkQ9 -Uk1cZGuEAsBwXUJHNjQ3OhIbZVZZbm5kREo+NT5DFRdYUFdrAAAAAAEAIgAAAmQCsgAHAAABIxEjE -SM1IQJk9lb2AkICbP2UAmxGAAEAXv/yAmQCsgAXAAABERQHDgEiJicmNREzERQXHgEyNjc2NRECZA -IIgfCBCAJWAgZYmlgGAgKy/k0qFFxzc1wUKgGz/lUrEkRQUEQSKwGrAAAAAAEAIAAAAnoCsgAGAAA -hIwMzGwEzAYJ07l3N1FwCsv2PAnEAAAEAGgAAA7ECsgAMAAABAyMLASMDMxsBMxsBA7HAcZyicrZi -kaB0nJkCsv1OAlP9rQKy/ZsCW/2kAmYAAAEAGQAAAm8CsgALAAAhCwEjEwMzGwEzAxMCCsrEY/bkY -re+Y/D6AST+3AFcAVb+5gEa/q3+oQAAAQATAAACUQKyAAgAAAERIxEDMxsBMwFdVvRjwLphARD+8A -EQAaL+sQFPAAABAC4AAAI5ArIACQAAJRUhNQEhNSEVAQI5/fUBof57Aen+YUZGQgIqRkX92QAAAAA -BAGL/sAEFAwwABwAAARUjETMVIxEBBWlpowMMOP0UOANcAAAB//v/4gE0AtAAAwAABSMDMwE0Pvs+ -HgLuAAAAAQAi/7AAxQMMAAcAABcjNTMRIzUzxaNpaaNQOALsOAABAFAA1wH0AmgABgAAJQsBIxMzE -wGwjY1GsESw1wFZ/qcBkf5vAAAAAQAy/6oBwv/iAAMAAAUhNSEBwv5wAZBWOAAAAAEAKQJEALYCsg -ADAAATIycztjhVUAJEbgAAAAACACT/8gHQAiAAHQAlAAAhJwcGIyImNTQ2OwE1NCcmIyIHIz4BMzI -XFh0BFBcnMjY9ASYVFAF6CR0wVUtgkJoiAgdgaQlaBm1Zrg4DCuQ9R+5MOSFQR1tbDiwUUXBUXowf -J8c9SjRORzYSgVwAAAAAAgBK//ICRQLfABEAHgAAATIWFRQGIyImLwEVIxEzETc2EzI2NTQmIyIGH -QEUFgFUcYCVbiNJEyNWVigySElcU01JXmECIJd4i5QTEDRJAt/+3jkq/hRuZV55ZWsdX14AAQAe// -IB9wIgABgAAAEyFhcjJiMiBhUUFjMyNjczDgEjIiY1NDYBF152DFocbEJXU0A1Rw1aE3pbaoKQAiB -oWH5qZm1tPDlaXYuLgZcAAAACAB7/8gIZAt8AEQAeAAABESM1BwYjIiY1NDYzMhYfAREDMjY9ATQm -IyIGFRQWAhlWKDJacYCVbiNJEyOnSV5hQUlcUwLf/SFVOSqXeIuUExA0ARb9VWVrHV9ebmVeeQACA -B7/8gH9AiAAFQAbAAABFAchHgEzMjY3Mw4BIyImNTQ2MzIWJyIGByEmAf0C/oAGUkA1SwlaD4FXbI -WObmt45UBVBwEqDQEYFhNjWD84W16Oh3+akU9aU60AAAEAFQAAARoC8gAWAAATBh0BMxUjESMRIzU -zNTQ3PgEzMhcVJqcDbW1WOTkDB0k8Hx5oAngVITRC/jQBzEIsJRs5PwVHEwAAAAIAHv8uAhkCIAAi -AC8AAAERFAcOASMiLwEzFx4BMzI2NzY9AQcGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZAQSEd -NwRAVcBBU5DTlUDASgyWnGAlW4jSRMjp0leYUFJXFMCEv5wSh1zeq8KCTI8VU0ZIQk5Kpd4i5QTED -RJ/iJlax1fXm5lXnkAAQBKAAACCgLkABcAAAEWFREjETQnLgEHDgEdASMRMxE3NjMyFgIIAlYCBDs -6RVRWViE5UVViAYUbQP7WASQxGzI7AQJyf+kC5P7TPSxUAAACAD4AAACsAsAABwALAAASMhYUBiIm -NBMjETNeLiAgLiBiVlYCwCAuICAu/WACEgAC//P/LgCnAsAABwAVAAASMhYUBiImNBcRFAcGIyInN -RY3NjURWS4gIC4gYgMLcRwNSgYCAsAgLiAgLo79wCUbZAJGBzMOHgJEAAAAAQBKAAACCALfAAsAAC -EnBxUjETMREzMHEwGTwTJWVvdu9/rgN6kC3/4oAQv6/ugAAQBG//wA3gLfAA8AABMRFBceATcVBiM -iJicmNRGcAQIcIxkkKi4CAQLf/bkhERoSBD4EJC8SNAJKAAAAAQBKAAADEAIgACQAAAEWFREjETQn -JiMiFREjETQnJiMiFREjETMVNzYzMhYXNzYzMhYDCwVWBAxedFYEDF50VlYiJko7ThAvJkpEVAGfI -jn+vAEcQyRZ1v76ARxDJFnW/voCEk08HzYtRB9HAAAAAAEASgAAAgoCIAAWAAABFhURIxE0JyYjIg -YdASMRMxU3NjMyFgIIAlYCCXBEVVZWITlRVWIBhRtA/tYBJDEbbHR/6QISWz0sVAAAAAACAB7/8gI -sAiAABwARAAASIBYUBiAmNBIyNjU0JiIGFRSlAQCHh/8Ah7ieWlqeWgIgn/Cfn/D+s3ZfYHV1YF8A -AgBK/zwCRQIgABEAHgAAATIWFRQGIyImLwERIxEzFTc2EzI2NTQmIyIGHQEUFgFUcYCVbiNJEyNWV -igySElcU01JXmECIJd4i5QTEDT+8wLWVTkq/hRuZV55ZWsdX14AAgAe/zwCGQIgABEAHgAAAREjEQ -cGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZVigyWnGAlW4jSRMjp0leYUFJXFMCEv0qARk5Kpd -4i5QTEDRJ/iJlax1fXm5lXnkAAQBKAAABPgIeAA0AAAEyFxUmBhURIxEzFTc2ARoWDkdXVlYwIwIe -B0EFVlf+0gISU0cYAAEAGP/yAa0CIAAjAAATMhYXIyYjIgYVFBYXHgEVFAYjIiYnMxYzMjY1NCYnL -gE1NDbkV2MJWhNdKy04PF1XbVhWbgxaE2ktOjlEUllkAiBaS2MrJCUoEBlPQkhOVFZoKCUmLhIWSE -BIUwAAAAEAFP/4ARQCiQAXAAATERQXHgE3FQYjIiYnJjURIzUzNTMVMxWxAQMmMx8qMjMEAUdHVmM -BzP7PGw4mFgY/BSwxDjQBNUJ7e0IAAAABAEL/8gICAhIAFwAAAREjNQcGIyImJyY1ETMRFBceATMy -Nj0BAgJWITlRT2EKBVYEBkA1RFECEv3uWj4qTToiOQE+/tIlJC43c4DpAAAAAAEAAQAAAfwCEgAGA -AABAyMDMxsBAfzJaclfop8CEv3uAhL+LQHTAAABAAEAAAMLAhIADAAAAQMjCwEjAzMbATMbAQMLqW -Z2dmapY3t0a3Z7AhL97gG+/kICEv5AAcD+QwG9AAAB//oAAAHWAhIACwAAARMjJwcjEwMzFzczARq -8ZIuKY763ZoWFYwEO/vLV1QEMAQbNzQAAAQAB/y4B+wISABEAAAEDDgEjIic1FjMyNj8BAzMbAQH7 -2iFZQB8NDRIpNhQH02GenQIS/cFVUAJGASozEwIt/i4B0gABABQAAAGxAg4ACQAAJRUhNQEhNSEVA -QGx/mMBNP7iAYL+zkREQgGIREX+ewAAAAABAED/sAEOAwwALAAAASMiBhUUFxYVFAYHHgEVFAcGFR -QWOwEVIyImNTQ3NjU0JzU2NTQnJjU0NjsBAQ4MKiMLDS4pKS4NCyMqDAtERAwLUlILDERECwLUGBk -WTlsgKzUFBTcrIFtOFhkYOC87GFVMIkUIOAhFIkxVGDsvAAAAAAEAYP84AJoDIAADAAAXIxEzmjo6 -yAPoAAEAIf+wAO8DDAAsAAATFQYVFBcWFRQGKwE1MzI2NTQnJjU0NjcuATU0NzY1NCYrATUzMhYVF -AcGFRTvUgsMREQLDCojCw0uKSkuDQsjKgwLREQMCwF6OAhFIkxVGDsvOBgZFk5bICs1BQU3KyBbTh -YZGDgvOxhVTCJFAAABAE0A3wH2AWQAEwAAATMUIyImJyYjIhUjNDMyFhcWMzIBvjhuGywtQR0xOG4 -bLC1BHTEBZIURGCNMhREYIwAAAwAk/94DIgLoAAcAEQApAAAAIBYQBiAmECQgBhUUFiA2NTQlMhYX -IyYjIgYUFjMyNjczDgEjIiY1NDYBAQFE3d3+vN0CB/7wubkBELn+xVBnD1wSWDo+QTcqOQZcEmZWX -HN2Aujg/rbg4AFKpr+Mjb6+jYxbWEldV5ZZNShLVn5na34AAgB4AFIB9AGeAAUACwAAAQcXIyc3Mw -cXIyc3AUqJiUmJifOJiUmJiQGepqampqampqYAAAIAHAHSAQ4CwAAHAA8AABIyFhQGIiY0NiIGFBY -yNjRgakREakSTNCEhNCECwEJqQkJqCiM4IyM4AAAAAAIAUAAAAfQCCwALAA8AAAEzFSMVIzUjNTM1 -MxMhNSEBP7W1OrW1OrX+XAGkAVs4tLQ4sP31OAAAAQB0AkQBAQKyAAMAABMjNzOsOD1QAkRuAAAAA -AEAIADsAKoBdgAHAAASMhYUBiImNEg6KCg6KAF2KDooKDoAAAIAOQBSAbUBngAFAAsAACUHIzcnMw -UHIzcnMwELiUmJiUkBM4lJiYlJ+KampqampqYAAAABADYB5QDhAt8ABAAAEzczByM2Xk1OXQHv8Po -AAQAWAeUAwQLfAAQAABMHIzczwV5NTl0C1fD6AAIANgHlAYsC3wAEAAkAABM3MwcjPwEzByM2Xk1O -XapeTU5dAe/w+grw+gAAAgAWAeUBawLfAAQACQAAEwcjNzMXByM3M8FeTU5dql5NTl0C1fD6CvD6A -AADACX/8gI1AHIABwAPABcAADYyFhQGIiY0NjIWFAYiJjQ2MhYUBiImNEk4JCQ4JOw4JCQ4JOw4JC -Q4JHIkOCQkOCQkOCQkOCQkOCQkOAAAAAEAeABSAUoBngAFAAABBxcjJzcBSomJSYmJAZ6mpqamAAA -AAAEAOQBSAQsBngAFAAAlByM3JzMBC4lJiYlJ+KampgAAAf9qAAABgQKyAAMAACsBATM/VwHAVwKy -AAAAAAIAFAHIAdwClAAHABQAABMVIxUjNSM1BRUjNwcjJxcjNTMXN9pKMkoByDICKzQqATJLKysCl -CmjoykBy46KiY3Lm5sAAQAVAAABvALyABgAAAERIxEjESMRIzUzNTQ3NjMyFxUmBgcGHQEBvFbCVj -k5AxHHHx5iVgcDAg798gHM/jQBzEIOJRuWBUcIJDAVIRYAAAABABX//AHkAvIAJQAAJR4BNxUGIyI -mJyY1ESYjIgcGHQEzFSMRIxEjNTM1NDc2MzIXERQBowIcIxkkKi4CAR4nXgwDbW1WLy8DEbNdOmYa -EQQ/BCQvEjQCFQZWFSEWQv40AcxCDiUblhP9uSEAAAAAAAAWAQ4AAQAAAAAAAAATACgAAQAAAAAAA -QAHAEwAAQAAAAAAAgAHAGQAAQAAAAAAAwAaAKIAAQAAAAAABAAHAM0AAQAAAAAABQA8AU8AAQAAAA -AABgAPAawAAQAAAAAACAALAdQAAQAAAAAACQALAfgAAQAAAAAACwAXAjQAAQAAAAAADAAXAnwAAwA -BBAkAAAAmAAAAAwABBAkAAQAOADwAAwABBAkAAgAOAFQAAwABBAkAAwA0AGwAAwABBAkABAAOAL0A -AwABBAkABQB4ANUAAwABBAkABgAeAYwAAwABBAkACAAWAbwAAwABBAkACQAWAeAAAwABBAkACwAuA -gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm -lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV -ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy -AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA -HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg -B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk -AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41 -ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA -HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3 -JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB -odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs -AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA -AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB -QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA -xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A -TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A -LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA -AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ -ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG -AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE -AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE -kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ -PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA -AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA -AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA -ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD -/4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA -AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA -BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA -AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ -ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA -gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC -YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA -AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ== -""" - ) - ), - 10 if size is None else size, - layout_engine=Layout.BASIC, - ) - return load_default_imagefont() diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageGrab.py b/.venv/lib/python3.10/site-packages/PIL/ImageGrab.py deleted file mode 100644 index 4da14f8..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageGrab.py +++ /dev/null @@ -1,194 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# screen grabber -# -# History: -# 2001-04-26 fl created -# 2001-09-17 fl use builtin driver, if present -# 2002-11-19 fl added grabclipboard support -# -# Copyright (c) 2001-2002 by Secret Labs AB -# Copyright (c) 2001-2002 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import shutil -import subprocess -import sys -import tempfile - -from . import Image - -TYPE_CHECKING = False -if TYPE_CHECKING: - from . import ImageWin - - -def grab( - bbox: tuple[int, int, int, int] | None = None, - include_layered_windows: bool = False, - all_screens: bool = False, - xdisplay: str | None = None, - window: int | ImageWin.HWND | None = None, -) -> Image.Image: - im: Image.Image - if xdisplay is None: - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - args = ["screencapture"] - if bbox: - left, top, right, bottom = bbox - args += ["-R", f"{left},{top},{right-left},{bottom-top}"] - subprocess.call(args + ["-x", filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_resized = im.resize((right - left, bottom - top)) - im.close() - return im_resized - return im - elif sys.platform == "win32": - if window is not None: - all_screens = -1 - offset, size, data = Image.core.grabscreen_win32( - include_layered_windows, - all_screens, - int(window) if window is not None else 0, - ) - im = Image.frombytes( - "RGB", - size, - data, - # RGB, 32-bit line padding, origin lower left corner - "raw", - "BGR", - (size[0] * 3 + 3) & -4, - -1, - ) - if bbox: - x0, y0 = offset - left, top, right, bottom = bbox - im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) - return im - # Cast to Optional[str] needed for Windows and macOS. - display_name: str | None = xdisplay - try: - if not Image.core.HAVE_XCB: - msg = "Pillow was built without XCB support" - raise OSError(msg) - size, data = Image.core.grabscreen_x11(display_name) - except OSError: - if display_name is None and sys.platform not in ("darwin", "win32"): - if shutil.which("gnome-screenshot"): - args = ["gnome-screenshot", "-f"] - elif shutil.which("spectacle"): - args = ["spectacle", "-n", "-b", "-f", "-o"] - else: - raise - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - subprocess.call(args + [filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_cropped = im.crop(bbox) - im.close() - return im_cropped - return im - else: - raise - else: - im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1) - if bbox: - im = im.crop(bbox) - return im - - -def grabclipboard() -> Image.Image | list[str] | None: - if sys.platform == "darwin": - p = subprocess.run( - ["osascript", "-e", "get the clipboard as «class PNGf»"], - capture_output=True, - ) - if p.returncode != 0: - return None - - import binascii - - data = io.BytesIO(binascii.unhexlify(p.stdout[11:-3])) - return Image.open(data) - elif sys.platform == "win32": - fmt, data = Image.core.grabclipboard_win32() - if fmt == "file": # CF_HDROP - import struct - - o = struct.unpack_from("I", data)[0] - if data[16] != 0: - files = data[o:].decode("utf-16le").split("\0") - else: - files = data[o:].decode("mbcs").split("\0") - return files[: files.index("")] - if isinstance(data, bytes): - data = io.BytesIO(data) - if fmt == "png": - from . import PngImagePlugin - - return PngImagePlugin.PngImageFile(data) - elif fmt == "DIB": - from . import BmpImagePlugin - - return BmpImagePlugin.DibImageFile(data) - return None - else: - if os.getenv("WAYLAND_DISPLAY"): - session_type = "wayland" - elif os.getenv("DISPLAY"): - session_type = "x11" - else: # Session type check failed - session_type = None - - if shutil.which("wl-paste") and session_type in ("wayland", None): - args = ["wl-paste", "-t", "image"] - elif shutil.which("xclip") and session_type in ("x11", None): - args = ["xclip", "-selection", "clipboard", "-t", "image/png", "-o"] - else: - msg = "wl-paste or xclip is required for ImageGrab.grabclipboard() on Linux" - raise NotImplementedError(msg) - - p = subprocess.run(args, capture_output=True) - if p.returncode != 0: - err = p.stderr - for silent_error in [ - # wl-paste, when the clipboard is empty - b"Nothing is copied", - # Ubuntu/Debian wl-paste, when the clipboard is empty - b"No selection", - # Ubuntu/Debian wl-paste, when an image isn't available - b"No suitable type of content copied", - # wl-paste or Ubuntu/Debian xclip, when an image isn't available - b" not available", - # xclip, when an image isn't available - b"cannot convert ", - # xclip, when the clipboard isn't initialized - b"xclip: Error: There is no owner for the ", - ]: - if silent_error in err: - return None - msg = f"{args[0]} error" - if err: - msg += f": {err.strip().decode()}" - raise ChildProcessError(msg) - - data = io.BytesIO(p.stdout) - im = Image.open(data) - im.load() - return im diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageMath.py b/.venv/lib/python3.10/site-packages/PIL/ImageMath.py deleted file mode 100644 index 484797f..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageMath.py +++ /dev/null @@ -1,368 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# a simple math add-on for the Python Imaging Library -# -# History: -# 1999-02-15 fl Original PIL Plus release -# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 -# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 -# -# Copyright (c) 1999-2005 by Secret Labs AB -# Copyright (c) 2005 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import builtins -from types import CodeType -from typing import Any, Callable - -from . import Image, _imagingmath -from ._deprecate import deprecate - - -class _Operand: - """Wraps an image operand, providing standard operators""" - - def __init__(self, im: Image.Image): - self.im = im - - def __fixup(self, im1: _Operand | float) -> Image.Image: - # convert image to suitable mode - if isinstance(im1, _Operand): - # argument was an image. - if im1.im.mode in ("1", "L"): - return im1.im.convert("I") - elif im1.im.mode in ("I", "F"): - return im1.im - else: - msg = f"unsupported mode: {im1.im.mode}" - raise ValueError(msg) - else: - # argument was a constant - if isinstance(im1, (int, float)) and self.im.mode in ("1", "L", "I"): - return Image.new("I", self.im.size, im1) - else: - return Image.new("F", self.im.size, im1) - - def apply( - self, - op: str, - im1: _Operand | float, - im2: _Operand | float | None = None, - mode: str | None = None, - ) -> _Operand: - im_1 = self.__fixup(im1) - if im2 is None: - # unary operation - out = Image.new(mode or im_1.mode, im_1.size, None) - try: - op = getattr(_imagingmath, f"{op}_{im_1.mode}") - except AttributeError as e: - msg = f"bad operand type for '{op}'" - raise TypeError(msg) from e - _imagingmath.unop(op, out.getim(), im_1.getim()) - else: - # binary operation - im_2 = self.__fixup(im2) - if im_1.mode != im_2.mode: - # convert both arguments to floating point - if im_1.mode != "F": - im_1 = im_1.convert("F") - if im_2.mode != "F": - im_2 = im_2.convert("F") - if im_1.size != im_2.size: - # crop both arguments to a common size - size = ( - min(im_1.size[0], im_2.size[0]), - min(im_1.size[1], im_2.size[1]), - ) - if im_1.size != size: - im_1 = im_1.crop((0, 0) + size) - if im_2.size != size: - im_2 = im_2.crop((0, 0) + size) - out = Image.new(mode or im_1.mode, im_1.size, None) - try: - op = getattr(_imagingmath, f"{op}_{im_1.mode}") - except AttributeError as e: - msg = f"bad operand type for '{op}'" - raise TypeError(msg) from e - _imagingmath.binop(op, out.getim(), im_1.getim(), im_2.getim()) - return _Operand(out) - - # unary operators - def __bool__(self) -> bool: - # an image is "true" if it contains at least one non-zero pixel - return self.im.getbbox() is not None - - def __abs__(self) -> _Operand: - return self.apply("abs", self) - - def __pos__(self) -> _Operand: - return self - - def __neg__(self) -> _Operand: - return self.apply("neg", self) - - # binary operators - def __add__(self, other: _Operand | float) -> _Operand: - return self.apply("add", self, other) - - def __radd__(self, other: _Operand | float) -> _Operand: - return self.apply("add", other, self) - - def __sub__(self, other: _Operand | float) -> _Operand: - return self.apply("sub", self, other) - - def __rsub__(self, other: _Operand | float) -> _Operand: - return self.apply("sub", other, self) - - def __mul__(self, other: _Operand | float) -> _Operand: - return self.apply("mul", self, other) - - def __rmul__(self, other: _Operand | float) -> _Operand: - return self.apply("mul", other, self) - - def __truediv__(self, other: _Operand | float) -> _Operand: - return self.apply("div", self, other) - - def __rtruediv__(self, other: _Operand | float) -> _Operand: - return self.apply("div", other, self) - - def __mod__(self, other: _Operand | float) -> _Operand: - return self.apply("mod", self, other) - - def __rmod__(self, other: _Operand | float) -> _Operand: - return self.apply("mod", other, self) - - def __pow__(self, other: _Operand | float) -> _Operand: - return self.apply("pow", self, other) - - def __rpow__(self, other: _Operand | float) -> _Operand: - return self.apply("pow", other, self) - - # bitwise - def __invert__(self) -> _Operand: - return self.apply("invert", self) - - def __and__(self, other: _Operand | float) -> _Operand: - return self.apply("and", self, other) - - def __rand__(self, other: _Operand | float) -> _Operand: - return self.apply("and", other, self) - - def __or__(self, other: _Operand | float) -> _Operand: - return self.apply("or", self, other) - - def __ror__(self, other: _Operand | float) -> _Operand: - return self.apply("or", other, self) - - def __xor__(self, other: _Operand | float) -> _Operand: - return self.apply("xor", self, other) - - def __rxor__(self, other: _Operand | float) -> _Operand: - return self.apply("xor", other, self) - - def __lshift__(self, other: _Operand | float) -> _Operand: - return self.apply("lshift", self, other) - - def __rshift__(self, other: _Operand | float) -> _Operand: - return self.apply("rshift", self, other) - - # logical - def __eq__(self, other: _Operand | float) -> _Operand: # type: ignore[override] - return self.apply("eq", self, other) - - def __ne__(self, other: _Operand | float) -> _Operand: # type: ignore[override] - return self.apply("ne", self, other) - - def __lt__(self, other: _Operand | float) -> _Operand: - return self.apply("lt", self, other) - - def __le__(self, other: _Operand | float) -> _Operand: - return self.apply("le", self, other) - - def __gt__(self, other: _Operand | float) -> _Operand: - return self.apply("gt", self, other) - - def __ge__(self, other: _Operand | float) -> _Operand: - return self.apply("ge", self, other) - - -# conversions -def imagemath_int(self: _Operand) -> _Operand: - return _Operand(self.im.convert("I")) - - -def imagemath_float(self: _Operand) -> _Operand: - return _Operand(self.im.convert("F")) - - -# logical -def imagemath_equal(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("eq", self, other, mode="I") - - -def imagemath_notequal(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("ne", self, other, mode="I") - - -def imagemath_min(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("min", self, other) - - -def imagemath_max(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("max", self, other) - - -def imagemath_convert(self: _Operand, mode: str) -> _Operand: - return _Operand(self.im.convert(mode)) - - -ops = { - "int": imagemath_int, - "float": imagemath_float, - "equal": imagemath_equal, - "notequal": imagemath_notequal, - "min": imagemath_min, - "max": imagemath_max, - "convert": imagemath_convert, -} - - -def lambda_eval( - expression: Callable[[dict[str, Any]], Any], - options: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Returns the result of an image function. - - :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band - images, use the :py:meth:`~PIL.Image.Image.split` method or - :py:func:`~PIL.Image.merge` function. - - :param expression: A function that receives a dictionary. - :param options: Values to add to the function's dictionary. Deprecated. - You can instead use one or more keyword arguments. - :param **kw: Values to add to the function's dictionary. - :return: The expression result. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - """ - - if options: - deprecate( - "ImageMath.lambda_eval options", - 12, - "ImageMath.lambda_eval keyword arguments", - ) - - args: dict[str, Any] = ops.copy() - args.update(options) - args.update(kw) - for k, v in args.items(): - if isinstance(v, Image.Image): - args[k] = _Operand(v) - - out = expression(args) - try: - return out.im - except AttributeError: - return out - - -def unsafe_eval( - expression: str, - options: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Evaluates an image expression. This uses Python's ``eval()`` function to process - the expression string, and carries the security risks of doing so. It is not - recommended to process expressions without considering this. - :py:meth:`~lambda_eval` is a more secure alternative. - - :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band - images, use the :py:meth:`~PIL.Image.Image.split` method or - :py:func:`~PIL.Image.merge` function. - - :param expression: A string containing a Python-style expression. - :param options: Values to add to the evaluation context. Deprecated. - You can instead use one or more keyword arguments. - :param **kw: Values to add to the evaluation context. - :return: The evaluated expression. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - """ - - if options: - deprecate( - "ImageMath.unsafe_eval options", - 12, - "ImageMath.unsafe_eval keyword arguments", - ) - - # build execution namespace - args: dict[str, Any] = ops.copy() - for k in list(options.keys()) + list(kw.keys()): - if "__" in k or hasattr(builtins, k): - msg = f"'{k}' not allowed" - raise ValueError(msg) - - args.update(options) - args.update(kw) - for k, v in args.items(): - if isinstance(v, Image.Image): - args[k] = _Operand(v) - - compiled_code = compile(expression, "", "eval") - - def scan(code: CodeType) -> None: - for const in code.co_consts: - if type(const) is type(compiled_code): - scan(const) - - for name in code.co_names: - if name not in args and name != "abs": - msg = f"'{name}' not allowed" - raise ValueError(msg) - - scan(compiled_code) - out = builtins.eval(expression, {"__builtins": {"abs": abs}}, args) - try: - return out.im - except AttributeError: - return out - - -def eval( - expression: str, - _dict: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Evaluates an image expression. - - Deprecated. Use lambda_eval() or unsafe_eval() instead. - - :param expression: A string containing a Python-style expression. - :param _dict: Values to add to the evaluation context. You - can either use a dictionary, or one or more keyword - arguments. - :return: The evaluated expression. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - - .. deprecated:: 10.3.0 - """ - - deprecate( - "ImageMath.eval", - 12, - "ImageMath.lambda_eval or ImageMath.unsafe_eval", - ) - return unsafe_eval(expression, _dict, **kw) diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageMode.py b/.venv/lib/python3.10/site-packages/PIL/ImageMode.py deleted file mode 100644 index 92a08d2..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageMode.py +++ /dev/null @@ -1,92 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard mode descriptors -# -# History: -# 2006-03-20 fl Added -# -# Copyright (c) 2006 by Secret Labs AB. -# Copyright (c) 2006 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import sys -from functools import lru_cache -from typing import NamedTuple - -from ._deprecate import deprecate - - -class ModeDescriptor(NamedTuple): - """Wrapper for mode strings.""" - - mode: str - bands: tuple[str, ...] - basemode: str - basetype: str - typestr: str - - def __str__(self) -> str: - return self.mode - - -@lru_cache -def getmode(mode: str) -> ModeDescriptor: - """Gets a mode descriptor for the given mode.""" - endian = "<" if sys.byteorder == "little" else ">" - - modes = { - # core modes - # Bits need to be extended to bytes - "1": ("L", "L", ("1",), "|b1"), - "L": ("L", "L", ("L",), "|u1"), - "I": ("L", "I", ("I",), f"{endian}i4"), - "F": ("L", "F", ("F",), f"{endian}f4"), - "P": ("P", "L", ("P",), "|u1"), - "RGB": ("RGB", "L", ("R", "G", "B"), "|u1"), - "RGBX": ("RGB", "L", ("R", "G", "B", "X"), "|u1"), - "RGBA": ("RGB", "L", ("R", "G", "B", "A"), "|u1"), - "CMYK": ("RGB", "L", ("C", "M", "Y", "K"), "|u1"), - "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr"), "|u1"), - # UNDONE - unsigned |u1i1i1 - "LAB": ("RGB", "L", ("L", "A", "B"), "|u1"), - "HSV": ("RGB", "L", ("H", "S", "V"), "|u1"), - # extra experimental modes - "RGBa": ("RGB", "L", ("R", "G", "B", "a"), "|u1"), - "BGR;15": ("RGB", "L", ("B", "G", "R"), "|u1"), - "BGR;16": ("RGB", "L", ("B", "G", "R"), "|u1"), - "BGR;24": ("RGB", "L", ("B", "G", "R"), "|u1"), - "LA": ("L", "L", ("L", "A"), "|u1"), - "La": ("L", "L", ("L", "a"), "|u1"), - "PA": ("RGB", "L", ("P", "A"), "|u1"), - } - if mode in modes: - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - base_mode, base_type, bands, type_str = modes[mode] - return ModeDescriptor(mode, bands, base_mode, base_type, type_str) - - mapping_modes = { - # I;16 == I;16L, and I;32 == I;32L - "I;16": "u2", - "I;16BS": ">i2", - "I;16N": f"{endian}u2", - "I;16NS": f"{endian}i2", - "I;32": "u4", - "I;32L": "i4", - "I;32LS": " -from __future__ import annotations - -import re - -from . import Image, _imagingmorph - -LUT_SIZE = 1 << 9 - -# fmt: off -ROTATION_MATRIX = [ - 6, 3, 0, - 7, 4, 1, - 8, 5, 2, -] -MIRROR_MATRIX = [ - 2, 1, 0, - 5, 4, 3, - 8, 7, 6, -] -# fmt: on - - -class LutBuilder: - """A class for building a MorphLut from a descriptive language - - The input patterns is a list of a strings sequences like these:: - - 4:(... - .1. - 111)->1 - - (whitespaces including linebreaks are ignored). The option 4 - describes a series of symmetry operations (in this case a - 4-rotation), the pattern is described by: - - - . or X - Ignore - - 1 - Pixel is on - - 0 - Pixel is off - - The result of the operation is described after "->" string. - - The default is to return the current pixel value, which is - returned if no other match is found. - - Operations: - - - 4 - 4 way rotation - - N - Negate - - 1 - Dummy op for no other operation (an op must always be given) - - M - Mirroring - - Example:: - - lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) - lut = lb.build_lut() - - """ - - def __init__( - self, patterns: list[str] | None = None, op_name: str | None = None - ) -> None: - if patterns is not None: - self.patterns = patterns - else: - self.patterns = [] - self.lut: bytearray | None = None - if op_name is not None: - known_patterns = { - "corner": ["1:(... ... ...)->0", "4:(00. 01. ...)->1"], - "dilation4": ["4:(... .0. .1.)->1"], - "dilation8": ["4:(... .0. .1.)->1", "4:(... .0. ..1)->1"], - "erosion4": ["4:(... .1. .0.)->0"], - "erosion8": ["4:(... .1. .0.)->0", "4:(... .1. ..0)->0"], - "edge": [ - "1:(... ... ...)->0", - "4:(.0. .1. ...)->1", - "4:(01. .1. ...)->1", - ], - } - if op_name not in known_patterns: - msg = f"Unknown pattern {op_name}!" - raise Exception(msg) - - self.patterns = known_patterns[op_name] - - def add_patterns(self, patterns: list[str]) -> None: - self.patterns += patterns - - def build_default_lut(self) -> None: - symbols = [0, 1] - m = 1 << 4 # pos of current pixel - self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) - - def get_lut(self) -> bytearray | None: - return self.lut - - def _string_permute(self, pattern: str, permutation: list[int]) -> str: - """string_permute takes a pattern and a permutation and returns the - string permuted according to the permutation list. - """ - assert len(permutation) == 9 - return "".join(pattern[p] for p in permutation) - - def _pattern_permute( - self, basic_pattern: str, options: str, basic_result: int - ) -> list[tuple[str, int]]: - """pattern_permute takes a basic pattern and its result and clones - the pattern according to the modifications described in the $options - parameter. It returns a list of all cloned patterns.""" - patterns = [(basic_pattern, basic_result)] - - # rotations - if "4" in options: - res = patterns[-1][1] - for i in range(4): - patterns.append( - (self._string_permute(patterns[-1][0], ROTATION_MATRIX), res) - ) - # mirror - if "M" in options: - n = len(patterns) - for pattern, res in patterns[:n]: - patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res)) - - # negate - if "N" in options: - n = len(patterns) - for pattern, res in patterns[:n]: - # Swap 0 and 1 - pattern = pattern.replace("0", "Z").replace("1", "0").replace("Z", "1") - res = 1 - int(res) - patterns.append((pattern, res)) - - return patterns - - def build_lut(self) -> bytearray: - """Compile all patterns into a morphology lut. - - TBD :Build based on (file) morphlut:modify_lut - """ - self.build_default_lut() - assert self.lut is not None - patterns = [] - - # Parse and create symmetries of the patterns strings - for p in self.patterns: - m = re.search(r"(\w*):?\s*\((.+?)\)\s*->\s*(\d)", p.replace("\n", "")) - if not m: - msg = 'Syntax error in pattern "' + p + '"' - raise Exception(msg) - options = m.group(1) - pattern = m.group(2) - result = int(m.group(3)) - - # Get rid of spaces - pattern = pattern.replace(" ", "").replace("\n", "") - - patterns += self._pattern_permute(pattern, options, result) - - # compile the patterns into regular expressions for speed - compiled_patterns = [] - for pattern in patterns: - p = pattern[0].replace(".", "X").replace("X", "[01]") - compiled_patterns.append((re.compile(p), pattern[1])) - - # Step through table and find patterns that match. - # Note that all the patterns are searched. The last one - # caught overrides - for i in range(LUT_SIZE): - # Build the bit pattern - bitpattern = bin(i)[2:] - bitpattern = ("0" * (9 - len(bitpattern)) + bitpattern)[::-1] - - for pattern, r in compiled_patterns: - if pattern.match(bitpattern): - self.lut[i] = [0, 1][r] - - return self.lut - - -class MorphOp: - """A class for binary morphological operators""" - - def __init__( - self, - lut: bytearray | None = None, - op_name: str | None = None, - patterns: list[str] | None = None, - ) -> None: - """Create a binary morphological operator""" - self.lut = lut - if op_name is not None: - self.lut = LutBuilder(op_name=op_name).build_lut() - elif patterns is not None: - self.lut = LutBuilder(patterns=patterns).build_lut() - - def apply(self, image: Image.Image) -> tuple[int, Image.Image]: - """Run a single morphological operation on an image - - Returns a tuple of the number of changed pixels and the - morphed image""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - outimage = Image.new(image.mode, image.size, None) - count = _imagingmorph.apply(bytes(self.lut), image.getim(), outimage.getim()) - return count, outimage - - def match(self, image: Image.Image) -> list[tuple[int, int]]: - """Get a list of coordinates matching the morphological operation on - an image. - - Returns a list of tuples of (x,y) coordinates - of all matching pixels. See :ref:`coordinate-system`.""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - return _imagingmorph.match(bytes(self.lut), image.getim()) - - def get_on_pixels(self, image: Image.Image) -> list[tuple[int, int]]: - """Get a list of all turned on pixels in a binary image - - Returns a list of tuples of (x,y) coordinates - of all matching pixels. See :ref:`coordinate-system`.""" - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - return _imagingmorph.get_on_pixels(image.getim()) - - def load_lut(self, filename: str) -> None: - """Load an operator from an mrl file""" - with open(filename, "rb") as f: - self.lut = bytearray(f.read()) - - if len(self.lut) != LUT_SIZE: - self.lut = None - msg = "Wrong size operator file!" - raise Exception(msg) - - def save_lut(self, filename: str) -> None: - """Save an operator to an mrl file""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - with open(filename, "wb") as f: - f.write(self.lut) - - def set_lut(self, lut: bytearray | None) -> None: - """Set the lut from an external source""" - self.lut = lut diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageOps.py b/.venv/lib/python3.10/site-packages/PIL/ImageOps.py deleted file mode 100644 index da28854..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageOps.py +++ /dev/null @@ -1,745 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard image operations -# -# History: -# 2001-10-20 fl Created -# 2001-10-23 fl Added autocontrast operator -# 2001-12-18 fl Added Kevin's fit operator -# 2004-03-14 fl Fixed potential division by zero in equalize -# 2005-05-05 fl Fixed equalize for low number of values -# -# Copyright (c) 2001-2004 by Secret Labs AB -# Copyright (c) 2001-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import functools -import operator -import re -from collections.abc import Sequence -from typing import Literal, Protocol, cast, overload - -from . import ExifTags, Image, ImagePalette - -# -# helpers - - -def _border(border: int | tuple[int, ...]) -> tuple[int, int, int, int]: - if isinstance(border, tuple): - if len(border) == 2: - left, top = right, bottom = border - elif len(border) == 4: - left, top, right, bottom = border - else: - left = top = right = bottom = border - return left, top, right, bottom - - -def _color(color: str | int | tuple[int, ...], mode: str) -> int | tuple[int, ...]: - if isinstance(color, str): - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - return color - - -def _lut(image: Image.Image, lut: list[int]) -> Image.Image: - if image.mode == "P": - # FIXME: apply to lookup table, not image data - msg = "mode P support coming soon" - raise NotImplementedError(msg) - elif image.mode in ("L", "RGB"): - if image.mode == "RGB" and len(lut) == 256: - lut = lut + lut + lut - return image.point(lut) - else: - msg = f"not supported for mode {image.mode}" - raise OSError(msg) - - -# -# actions - - -def autocontrast( - image: Image.Image, - cutoff: float | tuple[float, float] = 0, - ignore: int | Sequence[int] | None = None, - mask: Image.Image | None = None, - preserve_tone: bool = False, -) -> Image.Image: - """ - Maximize (normalize) image contrast. This function calculates a - histogram of the input image (or mask region), removes ``cutoff`` percent of the - lightest and darkest pixels from the histogram, and remaps the image - so that the darkest pixel becomes black (0), and the lightest - becomes white (255). - - :param image: The image to process. - :param cutoff: The percent to cut off from the histogram on the low and - high ends. Either a tuple of (low, high), or a single - number for both. - :param ignore: The background pixel value (use None for no background). - :param mask: Histogram used in contrast operation is computed using pixels - within the mask. If no mask is given the entire image is used - for histogram computation. - :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. - - .. versionadded:: 8.2.0 - - :return: An image. - """ - if preserve_tone: - histogram = image.convert("L").histogram(mask) - else: - histogram = image.histogram(mask) - - lut = [] - for layer in range(0, len(histogram), 256): - h = histogram[layer : layer + 256] - if ignore is not None: - # get rid of outliers - if isinstance(ignore, int): - h[ignore] = 0 - else: - for ix in ignore: - h[ix] = 0 - if cutoff: - # cut off pixels from both ends of the histogram - if not isinstance(cutoff, tuple): - cutoff = (cutoff, cutoff) - # get number of pixels - n = 0 - for ix in range(256): - n = n + h[ix] - # remove cutoff% pixels from the low end - cut = int(n * cutoff[0] // 100) - for lo in range(256): - if cut > h[lo]: - cut = cut - h[lo] - h[lo] = 0 - else: - h[lo] -= cut - cut = 0 - if cut <= 0: - break - # remove cutoff% samples from the high end - cut = int(n * cutoff[1] // 100) - for hi in range(255, -1, -1): - if cut > h[hi]: - cut = cut - h[hi] - h[hi] = 0 - else: - h[hi] -= cut - cut = 0 - if cut <= 0: - break - # find lowest/highest samples after preprocessing - for lo in range(256): - if h[lo]: - break - for hi in range(255, -1, -1): - if h[hi]: - break - if hi <= lo: - # don't bother - lut.extend(list(range(256))) - else: - scale = 255.0 / (hi - lo) - offset = -lo * scale - for ix in range(256): - ix = int(ix * scale + offset) - if ix < 0: - ix = 0 - elif ix > 255: - ix = 255 - lut.append(ix) - return _lut(image, lut) - - -def colorize( - image: Image.Image, - black: str | tuple[int, ...], - white: str | tuple[int, ...], - mid: str | int | tuple[int, ...] | None = None, - blackpoint: int = 0, - whitepoint: int = 255, - midpoint: int = 127, -) -> Image.Image: - """ - Colorize grayscale image. - This function calculates a color wedge which maps all black pixels in - the source image to the first color and all white pixels to the - second color. If ``mid`` is specified, it uses three-color mapping. - The ``black`` and ``white`` arguments should be RGB tuples or color names; - optionally you can use three-color mapping by also specifying ``mid``. - Mapping positions for any of the colors can be specified - (e.g. ``blackpoint``), where these parameters are the integer - value corresponding to where the corresponding color should be mapped. - These parameters must have logical order, such that - ``blackpoint <= midpoint <= whitepoint`` (if ``mid`` is specified). - - :param image: The image to colorize. - :param black: The color to use for black input pixels. - :param white: The color to use for white input pixels. - :param mid: The color to use for midtone input pixels. - :param blackpoint: an int value [0, 255] for the black mapping. - :param whitepoint: an int value [0, 255] for the white mapping. - :param midpoint: an int value [0, 255] for the midtone mapping. - :return: An image. - """ - - # Initial asserts - assert image.mode == "L" - if mid is None: - assert 0 <= blackpoint <= whitepoint <= 255 - else: - assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 - - # Define colors from arguments - rgb_black = cast(Sequence[int], _color(black, "RGB")) - rgb_white = cast(Sequence[int], _color(white, "RGB")) - rgb_mid = cast(Sequence[int], _color(mid, "RGB")) if mid is not None else None - - # Empty lists for the mapping - red = [] - green = [] - blue = [] - - # Create the low-end values - for i in range(blackpoint): - red.append(rgb_black[0]) - green.append(rgb_black[1]) - blue.append(rgb_black[2]) - - # Create the mapping (2-color) - if rgb_mid is None: - range_map = range(whitepoint - blackpoint) - - for i in range_map: - red.append( - rgb_black[0] + i * (rgb_white[0] - rgb_black[0]) // len(range_map) - ) - green.append( - rgb_black[1] + i * (rgb_white[1] - rgb_black[1]) // len(range_map) - ) - blue.append( - rgb_black[2] + i * (rgb_white[2] - rgb_black[2]) // len(range_map) - ) - - # Create the mapping (3-color) - else: - range_map1 = range(midpoint - blackpoint) - range_map2 = range(whitepoint - midpoint) - - for i in range_map1: - red.append( - rgb_black[0] + i * (rgb_mid[0] - rgb_black[0]) // len(range_map1) - ) - green.append( - rgb_black[1] + i * (rgb_mid[1] - rgb_black[1]) // len(range_map1) - ) - blue.append( - rgb_black[2] + i * (rgb_mid[2] - rgb_black[2]) // len(range_map1) - ) - for i in range_map2: - red.append(rgb_mid[0] + i * (rgb_white[0] - rgb_mid[0]) // len(range_map2)) - green.append( - rgb_mid[1] + i * (rgb_white[1] - rgb_mid[1]) // len(range_map2) - ) - blue.append(rgb_mid[2] + i * (rgb_white[2] - rgb_mid[2]) // len(range_map2)) - - # Create the high-end values - for i in range(256 - whitepoint): - red.append(rgb_white[0]) - green.append(rgb_white[1]) - blue.append(rgb_white[2]) - - # Return converted image - image = image.convert("RGB") - return _lut(image, red + green + blue) - - -def contain( - image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a resized version of the image, set to the maximum width and height - within the requested size, while maintaining the original aspect ratio. - - :param image: The image to resize. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :return: An image. - """ - - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio != dest_ratio: - if im_ratio > dest_ratio: - new_height = round(image.height / image.width * size[0]) - if new_height != size[1]: - size = (size[0], new_height) - else: - new_width = round(image.width / image.height * size[1]) - if new_width != size[0]: - size = (new_width, size[1]) - return image.resize(size, resample=method) - - -def cover( - image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a resized version of the image, so that the requested size is - covered, while maintaining the original aspect ratio. - - :param image: The image to resize. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :return: An image. - """ - - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio != dest_ratio: - if im_ratio < dest_ratio: - new_height = round(image.height / image.width * size[0]) - if new_height != size[1]: - size = (size[0], new_height) - else: - new_width = round(image.width / image.height * size[1]) - if new_width != size[0]: - size = (new_width, size[1]) - return image.resize(size, resample=method) - - -def pad( - image: Image.Image, - size: tuple[int, int], - method: int = Image.Resampling.BICUBIC, - color: str | int | tuple[int, ...] | None = None, - centering: tuple[float, float] = (0.5, 0.5), -) -> Image.Image: - """ - Returns a resized and padded version of the image, expanded to fill the - requested aspect ratio and size. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :param color: The background color of the padded image. - :param centering: Control the position of the original image within the - padded version. - - (0.5, 0.5) will keep the image centered - (0, 0) will keep the image aligned to the top left - (1, 1) will keep the image aligned to the bottom - right - :return: An image. - """ - - resized = contain(image, size, method) - if resized.size == size: - out = resized - else: - out = Image.new(image.mode, size, color) - if resized.palette: - palette = resized.getpalette() - if palette is not None: - out.putpalette(palette) - if resized.width != size[0]: - x = round((size[0] - resized.width) * max(0, min(centering[0], 1))) - out.paste(resized, (x, 0)) - else: - y = round((size[1] - resized.height) * max(0, min(centering[1], 1))) - out.paste(resized, (0, y)) - return out - - -def crop(image: Image.Image, border: int = 0) -> Image.Image: - """ - Remove border from image. The same amount of pixels are removed - from all four sides. This function works on all image modes. - - .. seealso:: :py:meth:`~PIL.Image.Image.crop` - - :param image: The image to crop. - :param border: The number of pixels to remove. - :return: An image. - """ - left, top, right, bottom = _border(border) - return image.crop((left, top, image.size[0] - right, image.size[1] - bottom)) - - -def scale( - image: Image.Image, factor: float, resample: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a rescaled image by a specific factor given in parameter. - A factor greater than 1 expands the image, between 0 and 1 contracts the - image. - - :param image: The image to rescale. - :param factor: The expansion factor, as a float. - :param resample: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - if factor == 1: - return image.copy() - elif factor <= 0: - msg = "the factor must be greater than 0" - raise ValueError(msg) - else: - size = (round(factor * image.width), round(factor * image.height)) - return image.resize(size, resample) - - -class SupportsGetMesh(Protocol): - """ - An object that supports the ``getmesh`` method, taking an image as an - argument, and returning a list of tuples. Each tuple contains two tuples, - the source box as a tuple of 4 integers, and a tuple of 8 integers for the - final quadrilateral, in order of top left, bottom left, bottom right, top - right. - """ - - def getmesh( - self, image: Image.Image - ) -> list[ - tuple[tuple[int, int, int, int], tuple[int, int, int, int, int, int, int, int]] - ]: ... - - -def deform( - image: Image.Image, - deformer: SupportsGetMesh, - resample: int = Image.Resampling.BILINEAR, -) -> Image.Image: - """ - Deform the image. - - :param image: The image to deform. - :param deformer: A deformer object. Any object that implements a - ``getmesh`` method can be used. - :param resample: An optional resampling filter. Same values possible as - in the PIL.Image.transform function. - :return: An image. - """ - return image.transform( - image.size, Image.Transform.MESH, deformer.getmesh(image), resample - ) - - -def equalize(image: Image.Image, mask: Image.Image | None = None) -> Image.Image: - """ - Equalize the image histogram. This function applies a non-linear - mapping to the input image, in order to create a uniform - distribution of grayscale values in the output image. - - :param image: The image to equalize. - :param mask: An optional mask. If given, only the pixels selected by - the mask are included in the analysis. - :return: An image. - """ - if image.mode == "P": - image = image.convert("RGB") - h = image.histogram(mask) - lut = [] - for b in range(0, len(h), 256): - histo = [_f for _f in h[b : b + 256] if _f] - if len(histo) <= 1: - lut.extend(list(range(256))) - else: - step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 - if not step: - lut.extend(list(range(256))) - else: - n = step // 2 - for i in range(256): - lut.append(n // step) - n = n + h[i + b] - return _lut(image, lut) - - -def expand( - image: Image.Image, - border: int | tuple[int, ...] = 0, - fill: str | int | tuple[int, ...] = 0, -) -> Image.Image: - """ - Add border to the image - - :param image: The image to expand. - :param border: Border width, in pixels. - :param fill: Pixel fill value (a color value). Default is 0 (black). - :return: An image. - """ - left, top, right, bottom = _border(border) - width = left + image.size[0] + right - height = top + image.size[1] + bottom - color = _color(fill, image.mode) - if image.palette: - palette = ImagePalette.ImagePalette(palette=image.getpalette()) - if isinstance(color, tuple) and (len(color) == 3 or len(color) == 4): - color = palette.getcolor(color) - else: - palette = None - out = Image.new(image.mode, (width, height), color) - if palette: - out.putpalette(palette.palette) - out.paste(image, (left, top)) - return out - - -def fit( - image: Image.Image, - size: tuple[int, int], - method: int = Image.Resampling.BICUBIC, - bleed: float = 0.0, - centering: tuple[float, float] = (0.5, 0.5), -) -> Image.Image: - """ - Returns a resized and cropped version of the image, cropped to the - requested aspect ratio and size. - - This function was contributed by Kevin Cazabon. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :param bleed: Remove a border around the outside of the image from all - four edges. The value is a decimal percentage (use 0.01 for - one percent). The default value is 0 (no border). - Cannot be greater than or equal to 0.5. - :param centering: Control the cropping position. Use (0.5, 0.5) for - center cropping (e.g. if cropping the width, take 50% off - of the left side, and therefore 50% off the right side). - (0.0, 0.0) will crop from the top left corner (i.e. if - cropping the width, take all of the crop off of the right - side, and if cropping the height, take all of it off the - bottom). (1.0, 0.0) will crop from the bottom left - corner, etc. (i.e. if cropping the width, take all of the - crop off the left side, and if cropping the height take - none from the top, and therefore all off the bottom). - :return: An image. - """ - - # by Kevin Cazabon, Feb 17/2000 - # kevin@cazabon.com - # https://www.cazabon.com - - centering_x, centering_y = centering - - if not 0.0 <= centering_x <= 1.0: - centering_x = 0.5 - if not 0.0 <= centering_y <= 1.0: - centering_y = 0.5 - - if not 0.0 <= bleed < 0.5: - bleed = 0.0 - - # calculate the area to use for resizing and cropping, subtracting - # the 'bleed' around the edges - - # number of pixels to trim off on Top and Bottom, Left and Right - bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) - - live_size = ( - image.size[0] - bleed_pixels[0] * 2, - image.size[1] - bleed_pixels[1] * 2, - ) - - # calculate the aspect ratio of the live_size - live_size_ratio = live_size[0] / live_size[1] - - # calculate the aspect ratio of the output image - output_ratio = size[0] / size[1] - - # figure out if the sides or top/bottom will be cropped off - if live_size_ratio == output_ratio: - # live_size is already the needed ratio - crop_width = live_size[0] - crop_height = live_size[1] - elif live_size_ratio >= output_ratio: - # live_size is wider than what's needed, crop the sides - crop_width = output_ratio * live_size[1] - crop_height = live_size[1] - else: - # live_size is taller than what's needed, crop the top and bottom - crop_width = live_size[0] - crop_height = live_size[0] / output_ratio - - # make the crop - crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering_x - crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering_y - - crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) - - # resize the image and return it - return image.resize(size, method, box=crop) - - -def flip(image: Image.Image) -> Image.Image: - """ - Flip the image vertically (top to bottom). - - :param image: The image to flip. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_TOP_BOTTOM) - - -def grayscale(image: Image.Image) -> Image.Image: - """ - Convert the image to grayscale. - - :param image: The image to convert. - :return: An image. - """ - return image.convert("L") - - -def invert(image: Image.Image) -> Image.Image: - """ - Invert (negate) the image. - - :param image: The image to invert. - :return: An image. - """ - lut = list(range(255, -1, -1)) - return image.point(lut) if image.mode == "1" else _lut(image, lut) - - -def mirror(image: Image.Image) -> Image.Image: - """ - Flip image horizontally (left to right). - - :param image: The image to mirror. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -def posterize(image: Image.Image, bits: int) -> Image.Image: - """ - Reduce the number of bits for each color channel. - - :param image: The image to posterize. - :param bits: The number of bits to keep for each channel (1-8). - :return: An image. - """ - mask = ~(2 ** (8 - bits) - 1) - lut = [i & mask for i in range(256)] - return _lut(image, lut) - - -def solarize(image: Image.Image, threshold: int = 128) -> Image.Image: - """ - Invert all pixel values above a threshold. - - :param image: The image to solarize. - :param threshold: All pixels above this grayscale level are inverted. - :return: An image. - """ - lut = [] - for i in range(256): - if i < threshold: - lut.append(i) - else: - lut.append(255 - i) - return _lut(image, lut) - - -@overload -def exif_transpose(image: Image.Image, *, in_place: Literal[True]) -> None: ... - - -@overload -def exif_transpose( - image: Image.Image, *, in_place: Literal[False] = False -) -> Image.Image: ... - - -def exif_transpose(image: Image.Image, *, in_place: bool = False) -> Image.Image | None: - """ - If an image has an EXIF Orientation tag, other than 1, transpose the image - accordingly, and remove the orientation data. - - :param image: The image to transpose. - :param in_place: Boolean. Keyword-only argument. - If ``True``, the original image is modified in-place, and ``None`` is returned. - If ``False`` (default), a new :py:class:`~PIL.Image.Image` object is returned - with the transposition applied. If there is no transposition, a copy of the - image will be returned. - """ - image.load() - image_exif = image.getexif() - orientation = image_exif.get(ExifTags.Base.Orientation, 1) - method = { - 2: Image.Transpose.FLIP_LEFT_RIGHT, - 3: Image.Transpose.ROTATE_180, - 4: Image.Transpose.FLIP_TOP_BOTTOM, - 5: Image.Transpose.TRANSPOSE, - 6: Image.Transpose.ROTATE_270, - 7: Image.Transpose.TRANSVERSE, - 8: Image.Transpose.ROTATE_90, - }.get(orientation) - if method is not None: - if in_place: - image.im = image.im.transpose(method) - image._size = image.im.size - else: - transposed_image = image.transpose(method) - exif_image = image if in_place else transposed_image - - exif = exif_image.getexif() - if ExifTags.Base.Orientation in exif: - del exif[ExifTags.Base.Orientation] - if "exif" in exif_image.info: - exif_image.info["exif"] = exif.tobytes() - elif "Raw profile type exif" in exif_image.info: - exif_image.info["Raw profile type exif"] = exif.tobytes().hex() - for key in ("XML:com.adobe.xmp", "xmp"): - if key in exif_image.info: - for pattern in ( - r'tiff:Orientation="([0-9])"', - r"([0-9])", - ): - value = exif_image.info[key] - if isinstance(value, str): - value = re.sub(pattern, "", value) - elif isinstance(value, tuple): - value = tuple( - re.sub(pattern.encode(), b"", v) for v in value - ) - else: - value = re.sub(pattern.encode(), b"", value) - exif_image.info[key] = value - if not in_place: - return transposed_image - elif not in_place: - return image.copy() - return None diff --git a/.venv/lib/python3.10/site-packages/PIL/ImagePalette.py b/.venv/lib/python3.10/site-packages/PIL/ImagePalette.py deleted file mode 100644 index 1036971..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImagePalette.py +++ /dev/null @@ -1,286 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# image palette object -# -# History: -# 1996-03-11 fl Rewritten. -# 1997-01-03 fl Up and running. -# 1997-08-23 fl Added load hack -# 2001-04-16 fl Fixed randint shadow bug in random() -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import array -from collections.abc import Sequence -from typing import IO - -from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile - -TYPE_CHECKING = False -if TYPE_CHECKING: - from . import Image - - -class ImagePalette: - """ - Color palette for palette mapped images - - :param mode: The mode to use for the palette. See: - :ref:`concept-modes`. Defaults to "RGB" - :param palette: An optional palette. If given, it must be a bytearray, - an array or a list of ints between 0-255. The list must consist of - all channels for one color followed by the next color (e.g. RGBRGBRGB). - Defaults to an empty palette. - """ - - def __init__( - self, - mode: str = "RGB", - palette: Sequence[int] | bytes | bytearray | None = None, - ) -> None: - self.mode = mode - self.rawmode: str | None = None # if set, palette contains raw data - self.palette = palette or bytearray() - self.dirty: int | None = None - - @property - def palette(self) -> Sequence[int] | bytes | bytearray: - return self._palette - - @palette.setter - def palette(self, palette: Sequence[int] | bytes | bytearray) -> None: - self._colors: dict[tuple[int, ...], int] | None = None - self._palette = palette - - @property - def colors(self) -> dict[tuple[int, ...], int]: - if self._colors is None: - mode_len = len(self.mode) - self._colors = {} - for i in range(0, len(self.palette), mode_len): - color = tuple(self.palette[i : i + mode_len]) - if color in self._colors: - continue - self._colors[color] = i // mode_len - return self._colors - - @colors.setter - def colors(self, colors: dict[tuple[int, ...], int]) -> None: - self._colors = colors - - def copy(self) -> ImagePalette: - new = ImagePalette() - - new.mode = self.mode - new.rawmode = self.rawmode - if self.palette is not None: - new.palette = self.palette[:] - new.dirty = self.dirty - - return new - - def getdata(self) -> tuple[str, Sequence[int] | bytes | bytearray]: - """ - Get palette contents in format suitable for the low-level - ``im.putpalette`` primitive. - - .. warning:: This method is experimental. - """ - if self.rawmode: - return self.rawmode, self.palette - return self.mode, self.tobytes() - - def tobytes(self) -> bytes: - """Convert palette to bytes. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(self.palette, bytes): - return self.palette - arr = array.array("B", self.palette) - return arr.tobytes() - - # Declare tostring as an alias for tobytes - tostring = tobytes - - def _new_color_index( - self, image: Image.Image | None = None, e: Exception | None = None - ) -> int: - if not isinstance(self.palette, bytearray): - self._palette = bytearray(self.palette) - index = len(self.palette) // 3 - special_colors: tuple[int | tuple[int, ...] | None, ...] = () - if image: - special_colors = ( - image.info.get("background"), - image.info.get("transparency"), - ) - while index in special_colors: - index += 1 - if index >= 256: - if image: - # Search for an unused index - for i, count in reversed(list(enumerate(image.histogram()))): - if count == 0 and i not in special_colors: - index = i - break - if index >= 256: - msg = "cannot allocate more than 256 colors" - raise ValueError(msg) from e - return index - - def getcolor( - self, - color: tuple[int, ...], - image: Image.Image | None = None, - ) -> int: - """Given an rgb tuple, allocate palette entry. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(color, tuple): - if self.mode == "RGB": - if len(color) == 4: - if color[3] != 255: - msg = "cannot add non-opaque RGBA color to RGB palette" - raise ValueError(msg) - color = color[:3] - elif self.mode == "RGBA": - if len(color) == 3: - color += (255,) - try: - return self.colors[color] - except KeyError as e: - # allocate new color slot - index = self._new_color_index(image, e) - assert isinstance(self._palette, bytearray) - self.colors[color] = index - if index * 3 < len(self.palette): - self._palette = ( - self._palette[: index * 3] - + bytes(color) - + self._palette[index * 3 + 3 :] - ) - else: - self._palette += bytes(color) - self.dirty = 1 - return index - else: - msg = f"unknown color specifier: {repr(color)}" # type: ignore[unreachable] - raise ValueError(msg) - - def save(self, fp: str | IO[str]) -> None: - """Save palette to text file. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(fp, str): - fp = open(fp, "w") - fp.write("# Palette\n") - fp.write(f"# Mode: {self.mode}\n") - for i in range(256): - fp.write(f"{i}") - for j in range(i * len(self.mode), (i + 1) * len(self.mode)): - try: - fp.write(f" {self.palette[j]}") - except IndexError: - fp.write(" 0") - fp.write("\n") - fp.close() - - -# -------------------------------------------------------------------- -# Internal - - -def raw(rawmode: str, data: Sequence[int] | bytes | bytearray) -> ImagePalette: - palette = ImagePalette() - palette.rawmode = rawmode - palette.palette = data - palette.dirty = 1 - return palette - - -# -------------------------------------------------------------------- -# Factories - - -def make_linear_lut(black: int, white: float) -> list[int]: - if black == 0: - return [int(white * i // 255) for i in range(256)] - - msg = "unavailable when black is non-zero" - raise NotImplementedError(msg) # FIXME - - -def make_gamma_lut(exp: float) -> list[int]: - return [int(((i / 255.0) ** exp) * 255.0 + 0.5) for i in range(256)] - - -def negative(mode: str = "RGB") -> ImagePalette: - palette = list(range(256 * len(mode))) - palette.reverse() - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def random(mode: str = "RGB") -> ImagePalette: - from random import randint - - palette = [randint(0, 255) for _ in range(256 * len(mode))] - return ImagePalette(mode, palette) - - -def sepia(white: str = "#fff0c0") -> ImagePalette: - bands = [make_linear_lut(0, band) for band in ImageColor.getrgb(white)] - return ImagePalette("RGB", [bands[i % 3][i // 3] for i in range(256 * 3)]) - - -def wedge(mode: str = "RGB") -> ImagePalette: - palette = list(range(256 * len(mode))) - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def load(filename: str) -> tuple[bytes, str]: - # FIXME: supports GIMP gradients only - - with open(filename, "rb") as fp: - paletteHandlers: list[ - type[ - GimpPaletteFile.GimpPaletteFile - | GimpGradientFile.GimpGradientFile - | PaletteFile.PaletteFile - ] - ] = [ - GimpPaletteFile.GimpPaletteFile, - GimpGradientFile.GimpGradientFile, - PaletteFile.PaletteFile, - ] - for paletteHandler in paletteHandlers: - try: - fp.seek(0) - lut = paletteHandler(fp).getpalette() - if lut: - break - except (SyntaxError, ValueError): - pass - else: - msg = "cannot load palette" - raise OSError(msg) - - return lut # data, rawmode diff --git a/.venv/lib/python3.10/site-packages/PIL/ImagePath.py b/.venv/lib/python3.10/site-packages/PIL/ImagePath.py deleted file mode 100644 index 77e8a60..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImagePath.py +++ /dev/null @@ -1,20 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# path interface -# -# History: -# 1996-11-04 fl Created -# 2002-04-14 fl Added documentation stub class -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image - -Path = Image.core.path diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageQt.py b/.venv/lib/python3.10/site-packages/PIL/ImageQt.py deleted file mode 100644 index df7a57b..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageQt.py +++ /dev/null @@ -1,220 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a simple Qt image interface. -# -# history: -# 2006-06-03 fl: created -# 2006-06-04 fl: inherit from QImage instead of wrapping it -# 2006-06-05 fl: removed toimage helper; move string support to ImageQt -# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) -# -# Copyright (c) 2006 by Secret Labs AB -# Copyright (c) 2006 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import sys -from io import BytesIO -from typing import Any, Callable, Union - -from . import Image -from ._util import is_path - -TYPE_CHECKING = False -if TYPE_CHECKING: - import PyQt6 - import PySide6 - - from . import ImageFile - - QBuffer: type - QByteArray = Union[PyQt6.QtCore.QByteArray, PySide6.QtCore.QByteArray] - QIODevice = Union[PyQt6.QtCore.QIODevice, PySide6.QtCore.QIODevice] - QImage = Union[PyQt6.QtGui.QImage, PySide6.QtGui.QImage] - QPixmap = Union[PyQt6.QtGui.QPixmap, PySide6.QtGui.QPixmap] - -qt_version: str | None -qt_versions = [ - ["6", "PyQt6"], - ["side6", "PySide6"], -] - -# If a version has already been imported, attempt it first -qt_versions.sort(key=lambda version: version[1] in sys.modules, reverse=True) -for version, qt_module in qt_versions: - try: - qRgba: Callable[[int, int, int, int], int] - if qt_module == "PyQt6": - from PyQt6.QtCore import QBuffer, QIODevice - from PyQt6.QtGui import QImage, QPixmap, qRgba - elif qt_module == "PySide6": - from PySide6.QtCore import QBuffer, QIODevice - from PySide6.QtGui import QImage, QPixmap, qRgba - except (ImportError, RuntimeError): - continue - qt_is_installed = True - qt_version = version - break -else: - qt_is_installed = False - qt_version = None - - -def rgb(r: int, g: int, b: int, a: int = 255) -> int: - """(Internal) Turns an RGB color into a Qt compatible color integer.""" - # use qRgb to pack the colors, and then turn the resulting long - # into a negative integer with the same bitpattern. - return qRgba(r, g, b, a) & 0xFFFFFFFF - - -def fromqimage(im: QImage | QPixmap) -> ImageFile.ImageFile: - """ - :param im: QImage or PIL ImageQt object - """ - buffer = QBuffer() - qt_openmode: object - if qt_version == "6": - try: - qt_openmode = getattr(QIODevice, "OpenModeFlag") - except AttributeError: - qt_openmode = getattr(QIODevice, "OpenMode") - else: - qt_openmode = QIODevice - buffer.open(getattr(qt_openmode, "ReadWrite")) - # preserve alpha channel with png - # otherwise ppm is more friendly with Image.open - if im.hasAlphaChannel(): - im.save(buffer, "png") - else: - im.save(buffer, "ppm") - - b = BytesIO() - b.write(buffer.data()) - buffer.close() - b.seek(0) - - return Image.open(b) - - -def fromqpixmap(im: QPixmap) -> ImageFile.ImageFile: - return fromqimage(im) - - -def align8to32(bytes: bytes, width: int, mode: str) -> bytes: - """ - converts each scanline of data from 8 bit to 32 bit aligned - """ - - bits_per_pixel = {"1": 1, "L": 8, "P": 8, "I;16": 16}[mode] - - # calculate bytes per line and the extra padding if needed - bits_per_line = bits_per_pixel * width - full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8) - bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0) - - extra_padding = -bytes_per_line % 4 - - # already 32 bit aligned by luck - if not extra_padding: - return bytes - - new_data = [ - bytes[i * bytes_per_line : (i + 1) * bytes_per_line] + b"\x00" * extra_padding - for i in range(len(bytes) // bytes_per_line) - ] - - return b"".join(new_data) - - -def _toqclass_helper(im: Image.Image | str | QByteArray) -> dict[str, Any]: - data = None - colortable = None - exclusive_fp = False - - # handle filename, if given instead of image name - if hasattr(im, "toUtf8"): - # FIXME - is this really the best way to do this? - im = str(im.toUtf8(), "utf-8") - if is_path(im): - im = Image.open(im) - exclusive_fp = True - assert isinstance(im, Image.Image) - - qt_format = getattr(QImage, "Format") if qt_version == "6" else QImage - if im.mode == "1": - format = getattr(qt_format, "Format_Mono") - elif im.mode == "L": - format = getattr(qt_format, "Format_Indexed8") - colortable = [rgb(i, i, i) for i in range(256)] - elif im.mode == "P": - format = getattr(qt_format, "Format_Indexed8") - palette = im.getpalette() - assert palette is not None - colortable = [rgb(*palette[i : i + 3]) for i in range(0, len(palette), 3)] - elif im.mode == "RGB": - # Populate the 4th channel with 255 - im = im.convert("RGBA") - - data = im.tobytes("raw", "BGRA") - format = getattr(qt_format, "Format_RGB32") - elif im.mode == "RGBA": - data = im.tobytes("raw", "BGRA") - format = getattr(qt_format, "Format_ARGB32") - elif im.mode == "I;16": - im = im.point(lambda i: i * 256) - - format = getattr(qt_format, "Format_Grayscale16") - else: - if exclusive_fp: - im.close() - msg = f"unsupported image mode {repr(im.mode)}" - raise ValueError(msg) - - size = im.size - __data = data or align8to32(im.tobytes(), size[0], im.mode) - if exclusive_fp: - im.close() - return {"data": __data, "size": size, "format": format, "colortable": colortable} - - -if qt_is_installed: - - class ImageQt(QImage): # type: ignore[misc] - def __init__(self, im: Image.Image | str | QByteArray) -> None: - """ - An PIL image wrapper for Qt. This is a subclass of PyQt's QImage - class. - - :param im: A PIL Image object, or a file name (given either as - Python string or a PyQt string object). - """ - im_data = _toqclass_helper(im) - # must keep a reference, or Qt will crash! - # All QImage constructors that take data operate on an existing - # buffer, so this buffer has to hang on for the life of the image. - # Fixes https://github.com/python-pillow/Pillow/issues/1370 - self.__data = im_data["data"] - super().__init__( - self.__data, - im_data["size"][0], - im_data["size"][1], - im_data["format"], - ) - if im_data["colortable"]: - self.setColorTable(im_data["colortable"]) - - -def toqimage(im: Image.Image | str | QByteArray) -> ImageQt: - return ImageQt(im) - - -def toqpixmap(im: Image.Image | str | QByteArray) -> QPixmap: - qimage = toqimage(im) - pixmap = getattr(QPixmap, "fromImage")(qimage) - if qt_version == "6": - pixmap.detach() - return pixmap diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageSequence.py b/.venv/lib/python3.10/site-packages/PIL/ImageSequence.py deleted file mode 100644 index a6fc340..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageSequence.py +++ /dev/null @@ -1,86 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# sequence support classes -# -# history: -# 1997-02-20 fl Created -# -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1997 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -## -from __future__ import annotations - -from typing import Callable - -from . import Image - - -class Iterator: - """ - This class implements an iterator object that can be used to loop - over an image sequence. - - You can use the ``[]`` operator to access elements by index. This operator - will raise an :py:exc:`IndexError` if you try to access a nonexistent - frame. - - :param im: An image object. - """ - - def __init__(self, im: Image.Image) -> None: - if not hasattr(im, "seek"): - msg = "im must have seek method" - raise AttributeError(msg) - self.im = im - self.position = getattr(self.im, "_min_frame", 0) - - def __getitem__(self, ix: int) -> Image.Image: - try: - self.im.seek(ix) - return self.im - except EOFError as e: - msg = "end of sequence" - raise IndexError(msg) from e - - def __iter__(self) -> Iterator: - return self - - def __next__(self) -> Image.Image: - try: - self.im.seek(self.position) - self.position += 1 - return self.im - except EOFError as e: - msg = "end of sequence" - raise StopIteration(msg) from e - - -def all_frames( - im: Image.Image | list[Image.Image], - func: Callable[[Image.Image], Image.Image] | None = None, -) -> list[Image.Image]: - """ - Applies a given function to all frames in an image or a list of images. - The frames are returned as a list of separate images. - - :param im: An image, or a list of images. - :param func: The function to apply to all of the image frames. - :returns: A list of images. - """ - if not isinstance(im, list): - im = [im] - - ims = [] - for imSequence in im: - current = imSequence.tell() - - ims += [im_frame.copy() for im_frame in Iterator(imSequence)] - - imSequence.seek(current) - return [func(im) for im in ims] if func else ims diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageShow.py b/.venv/lib/python3.10/site-packages/PIL/ImageShow.py deleted file mode 100644 index dd240fb..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageShow.py +++ /dev/null @@ -1,360 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# im.show() drivers -# -# History: -# 2008-04-06 fl Created -# -# Copyright (c) Secret Labs AB 2008. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import abc -import os -import shutil -import subprocess -import sys -from shlex import quote -from typing import Any - -from . import Image - -_viewers = [] - - -def register(viewer: type[Viewer] | Viewer, order: int = 1) -> None: - """ - The :py:func:`register` function is used to register additional viewers:: - - from PIL import ImageShow - ImageShow.register(MyViewer()) # MyViewer will be used as a last resort - ImageShow.register(MySecondViewer(), 0) # MySecondViewer will be prioritised - ImageShow.register(ImageShow.XVViewer(), 0) # XVViewer will be prioritised - - :param viewer: The viewer to be registered. - :param order: - Zero or a negative integer to prepend this viewer to the list, - a positive integer to append it. - """ - if isinstance(viewer, type) and issubclass(viewer, Viewer): - viewer = viewer() - if order > 0: - _viewers.append(viewer) - else: - _viewers.insert(0, viewer) - - -def show(image: Image.Image, title: str | None = None, **options: Any) -> bool: - r""" - Display a given image. - - :param image: An image object. - :param title: Optional title. Not all viewers can display the title. - :param \**options: Additional viewer options. - :returns: ``True`` if a suitable viewer was found, ``False`` otherwise. - """ - for viewer in _viewers: - if viewer.show(image, title=title, **options): - return True - return False - - -class Viewer: - """Base class for viewers.""" - - # main api - - def show(self, image: Image.Image, **options: Any) -> int: - """ - The main function for displaying an image. - Converts the given image to the target format and displays it. - """ - - if not ( - image.mode in ("1", "RGBA") - or (self.format == "PNG" and image.mode in ("I;16", "LA")) - ): - base = Image.getmodebase(image.mode) - if image.mode != base: - image = image.convert(base) - - return self.show_image(image, **options) - - # hook methods - - format: str | None = None - """The format to convert the image into.""" - options: dict[str, Any] = {} - """Additional options used to convert the image.""" - - def get_format(self, image: Image.Image) -> str | None: - """Return format name, or ``None`` to save as PGM/PPM.""" - return self.format - - def get_command(self, file: str, **options: Any) -> str: - """ - Returns the command used to display the file. - Not implemented in the base class. - """ - msg = "unavailable in base viewer" - raise NotImplementedError(msg) - - def save_image(self, image: Image.Image) -> str: - """Save to temporary file and return filename.""" - return image._dump(format=self.get_format(image), **self.options) - - def show_image(self, image: Image.Image, **options: Any) -> int: - """Display the given image.""" - return self.show_file(self.save_image(image), **options) - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - os.system(self.get_command(path, **options)) # nosec - return 1 - - -# -------------------------------------------------------------------- - - -class WindowsViewer(Viewer): - """The default viewer on Windows is the default system application for PNG files.""" - - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - def get_command(self, file: str, **options: Any) -> str: - return ( - f'start "Pillow" /WAIT "{file}" ' - "&& ping -n 4 127.0.0.1 >NUL " - f'&& del /f "{file}"' - ) - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen( - self.get_command(path, **options), - shell=True, - creationflags=getattr(subprocess, "CREATE_NO_WINDOW"), - ) # nosec - return 1 - - -if sys.platform == "win32": - register(WindowsViewer) - - -class MacViewer(Viewer): - """The default viewer on macOS using ``Preview.app``.""" - - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - def get_command(self, file: str, **options: Any) -> str: - # on darwin open returns immediately resulting in the temp - # file removal while app is opening - command = "open -a Preview.app" - command = f"({command} {quote(file)}; sleep 20; rm -f {quote(file)})&" - return command - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.call(["open", "-a", "Preview.app", path]) - executable = sys.executable or shutil.which("python3") - if executable: - subprocess.Popen( - [ - executable, - "-c", - "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])", - path, - ] - ) - return 1 - - -if sys.platform == "darwin": - register(MacViewer) - - -class UnixViewer(abc.ABC, Viewer): - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - @abc.abstractmethod - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - pass - - def get_command(self, file: str, **options: Any) -> str: - command = self.get_command_ex(file, **options)[0] - return f"{command} {quote(file)}" - - -class XDGViewer(UnixViewer): - """ - The freedesktop.org ``xdg-open`` command. - """ - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - command = executable = "xdg-open" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen(["xdg-open", path]) - return 1 - - -class DisplayViewer(UnixViewer): - """ - The ImageMagick ``display`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex( - self, file: str, title: str | None = None, **options: Any - ) -> tuple[str, str]: - command = executable = "display" - if title: - command += f" -title {quote(title)}" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - args = ["display"] - title = options.get("title") - if title: - args += ["-title", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -class GmDisplayViewer(UnixViewer): - """The GraphicsMagick ``gm display`` command.""" - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - executable = "gm" - command = "gm display" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen(["gm", "display", path]) - return 1 - - -class EogViewer(UnixViewer): - """The GNOME Image Viewer ``eog`` command.""" - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - executable = "eog" - command = "eog -n" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen(["eog", "-n", path]) - return 1 - - -class XVViewer(UnixViewer): - """ - The X Viewer ``xv`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex( - self, file: str, title: str | None = None, **options: Any - ) -> tuple[str, str]: - # note: xv is pretty outdated. most modern systems have - # imagemagick's display command instead. - command = executable = "xv" - if title: - command += f" -name {quote(title)}" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - args = ["xv"] - title = options.get("title") - if title: - args += ["-name", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -if sys.platform not in ("win32", "darwin"): # unixoids - if shutil.which("xdg-open"): - register(XDGViewer) - if shutil.which("display"): - register(DisplayViewer) - if shutil.which("gm"): - register(GmDisplayViewer) - if shutil.which("eog"): - register(EogViewer) - if shutil.which("xv"): - register(XVViewer) - - -class IPythonViewer(Viewer): - """The viewer for IPython frontends.""" - - def show_image(self, image: Image.Image, **options: Any) -> int: - ipython_display(image) - return 1 - - -try: - from IPython.display import display as ipython_display -except ImportError: - pass -else: - register(IPythonViewer) - - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 ImageShow.py imagefile [title]") - sys.exit() - - with Image.open(sys.argv[1]) as im: - print(show(im, *sys.argv[2:])) diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageStat.py b/.venv/lib/python3.10/site-packages/PIL/ImageStat.py deleted file mode 100644 index 8bc5045..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageStat.py +++ /dev/null @@ -1,160 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# global image statistics -# -# History: -# 1996-04-05 fl Created -# 1997-05-21 fl Added mask; added rms, var, stddev attributes -# 1997-08-05 fl Added median -# 1998-07-05 hk Fixed integer overflow error -# -# Notes: -# This class shows how to implement delayed evaluation of attributes. -# To get a certain value, simply access the corresponding attribute. -# The __getattr__ dispatcher takes care of the rest. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996-97. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import math -from functools import cached_property - -from . import Image - - -class Stat: - def __init__( - self, image_or_list: Image.Image | list[int], mask: Image.Image | None = None - ) -> None: - """ - Calculate statistics for the given image. If a mask is included, - only the regions covered by that mask are included in the - statistics. You can also pass in a previously calculated histogram. - - :param image: A PIL image, or a precalculated histogram. - - .. note:: - - For a PIL image, calculations rely on the - :py:meth:`~PIL.Image.Image.histogram` method. The pixel counts are - grouped into 256 bins, even if the image has more than 8 bits per - channel. So ``I`` and ``F`` mode images have a maximum ``mean``, - ``median`` and ``rms`` of 255, and cannot have an ``extrema`` maximum - of more than 255. - - :param mask: An optional mask. - """ - if isinstance(image_or_list, Image.Image): - self.h = image_or_list.histogram(mask) - elif isinstance(image_or_list, list): - self.h = image_or_list - else: - msg = "first argument must be image or list" # type: ignore[unreachable] - raise TypeError(msg) - self.bands = list(range(len(self.h) // 256)) - - @cached_property - def extrema(self) -> list[tuple[int, int]]: - """ - Min/max values for each band in the image. - - .. note:: - This relies on the :py:meth:`~PIL.Image.Image.histogram` method, and - simply returns the low and high bins used. This is correct for - images with 8 bits per channel, but fails for other modes such as - ``I`` or ``F``. Instead, use :py:meth:`~PIL.Image.Image.getextrema` to - return per-band extrema for the image. This is more correct and - efficient because, for non-8-bit modes, the histogram method uses - :py:meth:`~PIL.Image.Image.getextrema` to determine the bins used. - """ - - def minmax(histogram: list[int]) -> tuple[int, int]: - res_min, res_max = 255, 0 - for i in range(256): - if histogram[i]: - res_min = i - break - for i in range(255, -1, -1): - if histogram[i]: - res_max = i - break - return res_min, res_max - - return [minmax(self.h[i:]) for i in range(0, len(self.h), 256)] - - @cached_property - def count(self) -> list[int]: - """Total number of pixels for each band in the image.""" - return [sum(self.h[i : i + 256]) for i in range(0, len(self.h), 256)] - - @cached_property - def sum(self) -> list[float]: - """Sum of all pixels for each band in the image.""" - - v = [] - for i in range(0, len(self.h), 256): - layer_sum = 0.0 - for j in range(256): - layer_sum += j * self.h[i + j] - v.append(layer_sum) - return v - - @cached_property - def sum2(self) -> list[float]: - """Squared sum of all pixels for each band in the image.""" - - v = [] - for i in range(0, len(self.h), 256): - sum2 = 0.0 - for j in range(256): - sum2 += (j**2) * float(self.h[i + j]) - v.append(sum2) - return v - - @cached_property - def mean(self) -> list[float]: - """Average (arithmetic mean) pixel level for each band in the image.""" - return [self.sum[i] / self.count[i] for i in self.bands] - - @cached_property - def median(self) -> list[int]: - """Median pixel level for each band in the image.""" - - v = [] - for i in self.bands: - s = 0 - half = self.count[i] // 2 - b = i * 256 - for j in range(256): - s = s + self.h[b + j] - if s > half: - break - v.append(j) - return v - - @cached_property - def rms(self) -> list[float]: - """RMS (root-mean-square) for each band in the image.""" - return [math.sqrt(self.sum2[i] / self.count[i]) for i in self.bands] - - @cached_property - def var(self) -> list[float]: - """Variance for each band in the image.""" - return [ - (self.sum2[i] - (self.sum[i] ** 2.0) / self.count[i]) / self.count[i] - for i in self.bands - ] - - @cached_property - def stddev(self) -> list[float]: - """Standard deviation for each band in the image.""" - return [math.sqrt(self.var[i]) for i in self.bands] - - -Global = Stat # compatibility diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageTk.py b/.venv/lib/python3.10/site-packages/PIL/ImageTk.py deleted file mode 100644 index 3a4cb81..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageTk.py +++ /dev/null @@ -1,266 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Tk display interface -# -# History: -# 96-04-08 fl Created -# 96-09-06 fl Added getimage method -# 96-11-01 fl Rewritten, removed image attribute and crop method -# 97-05-09 fl Use PyImagingPaste method instead of image type -# 97-05-12 fl Minor tweaks to match the IFUNC95 interface -# 97-05-17 fl Support the "pilbitmap" booster patch -# 97-06-05 fl Added file= and data= argument to image constructors -# 98-03-09 fl Added width and height methods to Image classes -# 98-07-02 fl Use default mode for "P" images without palette attribute -# 98-07-02 fl Explicitly destroy Tkinter image objects -# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) -# 99-07-26 fl Automatically hook into Tkinter (if possible) -# 99-08-15 fl Hook uses _imagingtk instead of _imaging -# -# Copyright (c) 1997-1999 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import tkinter -from io import BytesIO -from typing import Any - -from . import Image, ImageFile - -TYPE_CHECKING = False -if TYPE_CHECKING: - from ._typing import CapsuleType - -# -------------------------------------------------------------------- -# Check for Tkinter interface hooks - - -def _get_image_from_kw(kw: dict[str, Any]) -> ImageFile.ImageFile | None: - source = None - if "file" in kw: - source = kw.pop("file") - elif "data" in kw: - source = BytesIO(kw.pop("data")) - if not source: - return None - return Image.open(source) - - -def _pyimagingtkcall( - command: str, photo: PhotoImage | tkinter.PhotoImage, ptr: CapsuleType -) -> None: - tk = photo.tk - try: - tk.call(command, photo, repr(ptr)) - except tkinter.TclError: - # activate Tkinter hook - # may raise an error if it cannot attach to Tkinter - from . import _imagingtk - - _imagingtk.tkinit(tk.interpaddr()) - tk.call(command, photo, repr(ptr)) - - -# -------------------------------------------------------------------- -# PhotoImage - - -class PhotoImage: - """ - A Tkinter-compatible photo image. This can be used - everywhere Tkinter expects an image object. If the image is an RGBA - image, pixels having alpha 0 are treated as transparent. - - The constructor takes either a PIL image, or a mode and a size. - Alternatively, you can use the ``file`` or ``data`` options to initialize - the photo image object. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. - :param size: If the first argument is a mode string, this defines the size - of the image. - :keyword file: A filename to load the image from (using - ``Image.open(file)``). - :keyword data: An 8-bit string containing image data (as loaded from an - image file). - """ - - def __init__( - self, - image: Image.Image | str | None = None, - size: tuple[int, int] | None = None, - **kw: Any, - ) -> None: - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - if image is None: - msg = "Image is required" - raise ValueError(msg) - elif isinstance(image, str): - mode = image - image = None - - if size is None: - msg = "If first argument is mode, size is required" - raise ValueError(msg) - else: - # got an image instead of a mode - mode = image.mode - if mode == "P": - # palette mapped data - image.apply_transparency() - image.load() - mode = image.palette.mode if image.palette else "RGB" - size = image.size - kw["width"], kw["height"] = size - - if mode not in ["1", "L", "RGB", "RGBA"]: - mode = Image.getmodebase(mode) - - self.__mode = mode - self.__size = size - self.__photo = tkinter.PhotoImage(**kw) - self.tk = self.__photo.tk - if image: - self.paste(image) - - def __del__(self) -> None: - try: - name = self.__photo.name - except AttributeError: - return - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def __str__(self) -> str: - """ - Get the Tkinter photo image identifier. This method is automatically - called by Tkinter whenever a PhotoImage object is passed to a Tkinter - method. - - :return: A Tkinter photo image identifier (a string). - """ - return str(self.__photo) - - def width(self) -> int: - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self) -> int: - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def paste(self, im: Image.Image) -> None: - """ - Paste a PIL image into the photo image. Note that this can - be very slow if the photo image is displayed. - - :param im: A PIL image. The size must match the target region. If the - mode does not match, the image is converted to the mode of - the bitmap image. - """ - # convert to blittable - ptr = im.getim() - image = im.im - if not image.isblock() or im.mode != self.__mode: - block = Image.core.new_block(self.__mode, im.size) - image.convert2(block, image) # convert directly between buffers - ptr = block.ptr - - _pyimagingtkcall("PyImagingPhoto", self.__photo, ptr) - - -# -------------------------------------------------------------------- -# BitmapImage - - -class BitmapImage: - """ - A Tkinter-compatible bitmap image. This can be used everywhere Tkinter - expects an image object. - - The given image must have mode "1". Pixels having value 0 are treated as - transparent. Options, if any, are passed on to Tkinter. The most commonly - used option is ``foreground``, which is used to specify the color for the - non-transparent parts. See the Tkinter documentation for information on - how to specify colours. - - :param image: A PIL image. - """ - - def __init__(self, image: Image.Image | None = None, **kw: Any) -> None: - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - if image is None: - msg = "Image is required" - raise ValueError(msg) - self.__mode = image.mode - self.__size = image.size - - self.__photo = tkinter.BitmapImage(data=image.tobitmap(), **kw) - - def __del__(self) -> None: - try: - name = self.__photo.name - except AttributeError: - return - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def width(self) -> int: - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self) -> int: - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def __str__(self) -> str: - """ - Get the Tkinter bitmap image identifier. This method is automatically - called by Tkinter whenever a BitmapImage object is passed to a Tkinter - method. - - :return: A Tkinter bitmap image identifier (a string). - """ - return str(self.__photo) - - -def getimage(photo: PhotoImage) -> Image.Image: - """Copies the contents of a PhotoImage to a PIL image memory.""" - im = Image.new("RGBA", (photo.width(), photo.height())) - - _pyimagingtkcall("PyImagingPhotoGet", photo, im.getim()) - - return im diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageTransform.py b/.venv/lib/python3.10/site-packages/PIL/ImageTransform.py deleted file mode 100644 index fb144ff..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageTransform.py +++ /dev/null @@ -1,136 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# transform wrappers -# -# History: -# 2002-04-08 fl Created -# -# Copyright (c) 2002 by Secret Labs AB -# Copyright (c) 2002 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from collections.abc import Sequence -from typing import Any - -from . import Image - - -class Transform(Image.ImageTransformHandler): - """Base class for other transforms defined in :py:mod:`~PIL.ImageTransform`.""" - - method: Image.Transform - - def __init__(self, data: Sequence[Any]) -> None: - self.data = data - - def getdata(self) -> tuple[Image.Transform, Sequence[int]]: - return self.method, self.data - - def transform( - self, - size: tuple[int, int], - image: Image.Image, - **options: Any, - ) -> Image.Image: - """Perform the transform. Called from :py:meth:`.Image.transform`.""" - # can be overridden - method, data = self.getdata() - return image.transform(size, method, data, **options) - - -class AffineTransform(Transform): - """ - Define an affine image transform. - - This function takes a 6-tuple (a, b, c, d, e, f) which contain the first - two rows from the inverse of an affine transform matrix. For each pixel - (x, y) in the output image, the new value is taken from a position (a x + - b y + c, d x + e y + f) in the input image, rounded to nearest pixel. - - This function can be used to scale, translate, rotate, and shear the - original image. - - See :py:meth:`.Image.transform` - - :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows - from the inverse of an affine transform matrix. - """ - - method = Image.Transform.AFFINE - - -class PerspectiveTransform(Transform): - """ - Define a perspective image transform. - - This function takes an 8-tuple (a, b, c, d, e, f, g, h). For each pixel - (x, y) in the output image, the new value is taken from a position - ((a x + b y + c) / (g x + h y + 1), (d x + e y + f) / (g x + h y + 1)) in - the input image, rounded to nearest pixel. - - This function can be used to scale, translate, rotate, and shear the - original image. - - See :py:meth:`.Image.transform` - - :param matrix: An 8-tuple (a, b, c, d, e, f, g, h). - """ - - method = Image.Transform.PERSPECTIVE - - -class ExtentTransform(Transform): - """ - Define a transform to extract a subregion from an image. - - Maps a rectangle (defined by two corners) from the image to a rectangle of - the given size. The resulting image will contain data sampled from between - the corners, such that (x0, y0) in the input image will end up at (0,0) in - the output image, and (x1, y1) at size. - - This method can be used to crop, stretch, shrink, or mirror an arbitrary - rectangle in the current image. It is slightly slower than crop, but about - as fast as a corresponding resize operation. - - See :py:meth:`.Image.transform` - - :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the - input image's coordinate system. See :ref:`coordinate-system`. - """ - - method = Image.Transform.EXTENT - - -class QuadTransform(Transform): - """ - Define a quad image transform. - - Maps a quadrilateral (a region defined by four corners) from the image to a - rectangle of the given size. - - See :py:meth:`.Image.transform` - - :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the - upper left, lower left, lower right, and upper right corner of the - source quadrilateral. - """ - - method = Image.Transform.QUAD - - -class MeshTransform(Transform): - """ - Define a mesh image transform. A mesh transform consists of one or more - individual quad transforms. - - See :py:meth:`.Image.transform` - - :param data: A list of (bbox, quad) tuples. - """ - - method = Image.Transform.MESH diff --git a/.venv/lib/python3.10/site-packages/PIL/ImageWin.py b/.venv/lib/python3.10/site-packages/PIL/ImageWin.py deleted file mode 100644 index 98c28f2..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImageWin.py +++ /dev/null @@ -1,247 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Windows DIB display interface -# -# History: -# 1996-05-20 fl Created -# 1996-09-20 fl Fixed subregion exposure -# 1997-09-21 fl Added draw primitive (for tzPrint) -# 2003-05-21 fl Added experimental Window/ImageWindow classes -# 2003-09-05 fl Added fromstring/tostring methods -# -# Copyright (c) Secret Labs AB 1997-2003. -# Copyright (c) Fredrik Lundh 1996-2003. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image - - -class HDC: - """ - Wraps an HDC integer. The resulting object can be passed to the - :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` - methods. - """ - - def __init__(self, dc: int) -> None: - self.dc = dc - - def __int__(self) -> int: - return self.dc - - -class HWND: - """ - Wraps an HWND integer. The resulting object can be passed to the - :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` - methods, instead of a DC. - """ - - def __init__(self, wnd: int) -> None: - self.wnd = wnd - - def __int__(self) -> int: - return self.wnd - - -class Dib: - """ - A Windows bitmap with the given mode and size. The mode can be one of "1", - "L", "P", or "RGB". - - If the display requires a palette, this constructor creates a suitable - palette and associates it with the image. For an "L" image, 128 graylevels - are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together - with 20 graylevels. - - To make sure that palettes work properly under Windows, you must call the - ``palette`` method upon certain events from Windows. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. The mode can be one of "1", - "L", "P", or "RGB". - :param size: If the first argument is a mode string, this - defines the size of the image. - """ - - def __init__( - self, image: Image.Image | str, size: tuple[int, int] | None = None - ) -> None: - if isinstance(image, str): - mode = image - image = "" - if size is None: - msg = "If first argument is mode, size is required" - raise ValueError(msg) - else: - mode = image.mode - size = image.size - if mode not in ["1", "L", "P", "RGB"]: - mode = Image.getmodebase(mode) - self.image = Image.core.display(mode, size) - self.mode = mode - self.size = size - if image: - assert not isinstance(image, str) - self.paste(image) - - def expose(self, handle: int | HDC | HWND) -> None: - """ - Copy the bitmap contents to a device context. - - :param handle: Device context (HDC), cast to a Python integer, or an - HDC or HWND instance. In PythonWin, you can use - ``CDC.GetHandleAttrib()`` to get a suitable handle. - """ - handle_int = int(handle) - if isinstance(handle, HWND): - dc = self.image.getdc(handle_int) - try: - self.image.expose(dc) - finally: - self.image.releasedc(handle_int, dc) - else: - self.image.expose(handle_int) - - def draw( - self, - handle: int | HDC | HWND, - dst: tuple[int, int, int, int], - src: tuple[int, int, int, int] | None = None, - ) -> None: - """ - Same as expose, but allows you to specify where to draw the image, and - what part of it to draw. - - The destination and source areas are given as 4-tuple rectangles. If - the source is omitted, the entire image is copied. If the source and - the destination have different sizes, the image is resized as - necessary. - """ - if src is None: - src = (0, 0) + self.size - handle_int = int(handle) - if isinstance(handle, HWND): - dc = self.image.getdc(handle_int) - try: - self.image.draw(dc, dst, src) - finally: - self.image.releasedc(handle_int, dc) - else: - self.image.draw(handle_int, dst, src) - - def query_palette(self, handle: int | HDC | HWND) -> int: - """ - Installs the palette associated with the image in the given device - context. - - This method should be called upon **QUERYNEWPALETTE** and - **PALETTECHANGED** events from Windows. If this method returns a - non-zero value, one or more display palette entries were changed, and - the image should be redrawn. - - :param handle: Device context (HDC), cast to a Python integer, or an - HDC or HWND instance. - :return: The number of entries that were changed (if one or more entries, - this indicates that the image should be redrawn). - """ - handle_int = int(handle) - if isinstance(handle, HWND): - handle = self.image.getdc(handle_int) - try: - result = self.image.query_palette(handle) - finally: - self.image.releasedc(handle, handle) - else: - result = self.image.query_palette(handle_int) - return result - - def paste( - self, im: Image.Image, box: tuple[int, int, int, int] | None = None - ) -> None: - """ - Paste a PIL image into the bitmap image. - - :param im: A PIL image. The size must match the target region. - If the mode does not match, the image is converted to the - mode of the bitmap image. - :param box: A 4-tuple defining the left, upper, right, and - lower pixel coordinate. See :ref:`coordinate-system`. If - None is given instead of a tuple, all of the image is - assumed. - """ - im.load() - if self.mode != im.mode: - im = im.convert(self.mode) - if box: - self.image.paste(im.im, box) - else: - self.image.paste(im.im) - - def frombytes(self, buffer: bytes) -> None: - """ - Load display memory contents from byte data. - - :param buffer: A buffer containing display data (usually - data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) - """ - self.image.frombytes(buffer) - - def tobytes(self) -> bytes: - """ - Copy display memory contents to bytes object. - - :return: A bytes object containing display data. - """ - return self.image.tobytes() - - -class Window: - """Create a Window with the given title size.""" - - def __init__( - self, title: str = "PIL", width: int | None = None, height: int | None = None - ) -> None: - self.hwnd = Image.core.createwindow( - title, self.__dispatcher, width or 0, height or 0 - ) - - def __dispatcher(self, action: str, *args: int) -> None: - getattr(self, f"ui_handle_{action}")(*args) - - def ui_handle_clear(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: - pass - - def ui_handle_damage(self, x0: int, y0: int, x1: int, y1: int) -> None: - pass - - def ui_handle_destroy(self) -> None: - pass - - def ui_handle_repair(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: - pass - - def ui_handle_resize(self, width: int, height: int) -> None: - pass - - def mainloop(self) -> None: - Image.core.eventloop() - - -class ImageWindow(Window): - """Create an image window which displays the given image.""" - - def __init__(self, image: Image.Image | Dib, title: str = "PIL") -> None: - if not isinstance(image, Dib): - image = Dib(image) - self.image = image - width, height = image.size - super().__init__(title, width=width, height=height) - - def ui_handle_repair(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: - self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/.venv/lib/python3.10/site-packages/PIL/ImtImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/ImtImagePlugin.py deleted file mode 100644 index c4eccee..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/ImtImagePlugin.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IM Tools support for PIL -# -# history: -# 1996-05-27 fl Created (read 8-bit images only) -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) -# -# Copyright (c) Secret Labs AB 1997-2001. -# Copyright (c) Fredrik Lundh 1996-2001. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re - -from . import Image, ImageFile - -# -# -------------------------------------------------------------------- - -field = re.compile(rb"([a-z]*) ([^ \r\n]*)") - - -## -# Image plugin for IM Tools images. - - -class ImtImageFile(ImageFile.ImageFile): - format = "IMT" - format_description = "IM Tools" - - def _open(self) -> None: - # Quick rejection: if there's not a LF among the first - # 100 bytes, this is (probably) not a text header. - - assert self.fp is not None - - buffer = self.fp.read(100) - if b"\n" not in buffer: - msg = "not an IM file" - raise SyntaxError(msg) - - xsize = ysize = 0 - - while True: - if buffer: - s = buffer[:1] - buffer = buffer[1:] - else: - s = self.fp.read(1) - if not s: - break - - if s == b"\x0c": - # image data begins - self.tile = [ - ImageFile._Tile( - "raw", - (0, 0) + self.size, - self.fp.tell() - len(buffer), - self.mode, - ) - ] - - break - - else: - # read key/value pair - if b"\n" not in buffer: - buffer += self.fp.read(100) - lines = buffer.split(b"\n") - s += lines.pop(0) - buffer = b"\n".join(lines) - if len(s) == 1 or len(s) > 100: - break - if s[0] == ord(b"*"): - continue # comment - - m = field.match(s) - if not m: - break - k, v = m.group(1, 2) - if k == b"width": - xsize = int(v) - self._size = xsize, ysize - elif k == b"height": - ysize = int(v) - self._size = xsize, ysize - elif k == b"pixel" and v == b"n8": - self._mode = "L" - - -# -# -------------------------------------------------------------------- - -Image.register_open(ImtImageFile.format, ImtImageFile) - -# -# no extension registered (".im" is simply too common) diff --git a/.venv/lib/python3.10/site-packages/PIL/IptcImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/IptcImagePlugin.py deleted file mode 100644 index 60ab7c8..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/IptcImagePlugin.py +++ /dev/null @@ -1,249 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IPTC/NAA file handling -# -# history: -# 1995-10-01 fl Created -# 1998-03-09 fl Cleaned up and added to PIL -# 2002-06-18 fl Added getiptcinfo helper -# -# Copyright (c) Secret Labs AB 1997-2002. -# Copyright (c) Fredrik Lundh 1995. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from collections.abc import Sequence -from io import BytesIO -from typing import cast - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._deprecate import deprecate - -COMPRESSION = {1: "raw", 5: "jpeg"} - - -def __getattr__(name: str) -> bytes: - if name == "PAD": - deprecate("IptcImagePlugin.PAD", 12) - return b"\0\0\0\0" - msg = f"module '{__name__}' has no attribute '{name}'" - raise AttributeError(msg) - - -# -# Helpers - - -def _i(c: bytes) -> int: - return i32((b"\0\0\0\0" + c)[-4:]) - - -def _i8(c: int | bytes) -> int: - return c if isinstance(c, int) else c[0] - - -def i(c: bytes) -> int: - """.. deprecated:: 10.2.0""" - deprecate("IptcImagePlugin.i", 12) - return _i(c) - - -def dump(c: Sequence[int | bytes]) -> None: - """.. deprecated:: 10.2.0""" - deprecate("IptcImagePlugin.dump", 12) - for i in c: - print(f"{_i8(i):02x}", end=" ") - print() - - -## -# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields -# from TIFF and JPEG files, use the getiptcinfo function. - - -class IptcImageFile(ImageFile.ImageFile): - format = "IPTC" - format_description = "IPTC/NAA" - - def getint(self, key: tuple[int, int]) -> int: - return _i(self.info[key]) - - def field(self) -> tuple[tuple[int, int] | None, int]: - # - # get a IPTC field header - s = self.fp.read(5) - if not s.strip(b"\x00"): - return None, 0 - - tag = s[1], s[2] - - # syntax - if s[0] != 0x1C or tag[0] not in [1, 2, 3, 4, 5, 6, 7, 8, 9, 240]: - msg = "invalid IPTC/NAA file" - raise SyntaxError(msg) - - # field size - size = s[3] - if size > 132: - msg = "illegal field length in IPTC/NAA file" - raise OSError(msg) - elif size == 128: - size = 0 - elif size > 128: - size = _i(self.fp.read(size - 128)) - else: - size = i16(s, 3) - - return tag, size - - def _open(self) -> None: - # load descriptive fields - while True: - offset = self.fp.tell() - tag, size = self.field() - if not tag or tag == (8, 10): - break - if size: - tagdata = self.fp.read(size) - else: - tagdata = None - if tag in self.info: - if isinstance(self.info[tag], list): - self.info[tag].append(tagdata) - else: - self.info[tag] = [self.info[tag], tagdata] - else: - self.info[tag] = tagdata - - # mode - layers = self.info[(3, 60)][0] - component = self.info[(3, 60)][1] - if (3, 65) in self.info: - id = self.info[(3, 65)][0] - 1 - else: - id = 0 - if layers == 1 and not component: - self._mode = "L" - elif layers == 3 and component: - self._mode = "RGB"[id] - elif layers == 4 and component: - self._mode = "CMYK"[id] - - # size - self._size = self.getint((3, 20)), self.getint((3, 30)) - - # compression - try: - compression = COMPRESSION[self.getint((3, 120))] - except KeyError as e: - msg = "Unknown IPTC image compression" - raise OSError(msg) from e - - # tile - if tag == (8, 10): - self.tile = [ - ImageFile._Tile("iptc", (0, 0) + self.size, offset, compression) - ] - - def load(self) -> Image.core.PixelAccess | None: - if len(self.tile) != 1 or self.tile[0][0] != "iptc": - return ImageFile.ImageFile.load(self) - - offset, compression = self.tile[0][2:] - - self.fp.seek(offset) - - # Copy image data to temporary file - o = BytesIO() - if compression == "raw": - # To simplify access to the extracted file, - # prepend a PPM header - o.write(b"P5\n%d %d\n255\n" % self.size) - while True: - type, size = self.field() - if type != (8, 10): - break - while size > 0: - s = self.fp.read(min(size, 8192)) - if not s: - break - o.write(s) - size -= len(s) - - with Image.open(o) as _im: - _im.load() - self.im = _im.im - return None - - -Image.register_open(IptcImageFile.format, IptcImageFile) - -Image.register_extension(IptcImageFile.format, ".iim") - - -def getiptcinfo( - im: ImageFile.ImageFile, -) -> dict[tuple[int, int], bytes | list[bytes]] | None: - """ - Get IPTC information from TIFF, JPEG, or IPTC file. - - :param im: An image containing IPTC data. - :returns: A dictionary containing IPTC information, or None if - no IPTC information block was found. - """ - from . import JpegImagePlugin, TiffImagePlugin - - data = None - - info: dict[tuple[int, int], bytes | list[bytes]] = {} - if isinstance(im, IptcImageFile): - # return info dictionary right away - for k, v in im.info.items(): - if isinstance(k, tuple): - info[k] = v - return info - - elif isinstance(im, JpegImagePlugin.JpegImageFile): - # extract the IPTC/NAA resource - photoshop = im.info.get("photoshop") - if photoshop: - data = photoshop.get(0x0404) - - elif isinstance(im, TiffImagePlugin.TiffImageFile): - # get raw data from the IPTC/NAA tag (PhotoShop tags the data - # as 4-byte integers, so we cannot use the get method...) - try: - data = im.tag_v2[TiffImagePlugin.IPTC_NAA_CHUNK] - except KeyError: - pass - - if data is None: - return None # no properties - - # create an IptcImagePlugin object without initializing it - class FakeImage: - pass - - fake_im = FakeImage() - fake_im.__class__ = IptcImageFile # type: ignore[assignment] - iptc_im = cast(IptcImageFile, fake_im) - - # parse the IPTC information chunk - iptc_im.info = {} - iptc_im.fp = BytesIO(data) - - try: - iptc_im._open() - except (IndexError, KeyError): - pass # expected failure - - for k, v in iptc_im.info.items(): - if isinstance(k, tuple): - info[k] = v - return info diff --git a/.venv/lib/python3.10/site-packages/PIL/Jpeg2KImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/Jpeg2KImagePlugin.py deleted file mode 100644 index e0f4eca..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/Jpeg2KImagePlugin.py +++ /dev/null @@ -1,442 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# JPEG2000 file handling -# -# History: -# 2014-03-12 ajh Created -# 2021-06-30 rogermb Extract dpi information from the 'resc' header box -# -# Copyright (c) 2014 Coriolis Systems Limited -# Copyright (c) 2014 Alastair Houghton -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import struct -from collections.abc import Callable -from typing import IO, cast - -from . import Image, ImageFile, ImagePalette, _binary - - -class BoxReader: - """ - A small helper class to read fields stored in JPEG2000 header boxes - and to easily step into and read sub-boxes. - """ - - def __init__(self, fp: IO[bytes], length: int = -1) -> None: - self.fp = fp - self.has_length = length >= 0 - self.length = length - self.remaining_in_box = -1 - - def _can_read(self, num_bytes: int) -> bool: - if self.has_length and self.fp.tell() + num_bytes > self.length: - # Outside box: ensure we don't read past the known file length - return False - if self.remaining_in_box >= 0: - # Inside box contents: ensure read does not go past box boundaries - return num_bytes <= self.remaining_in_box - else: - return True # No length known, just read - - def _read_bytes(self, num_bytes: int) -> bytes: - if not self._can_read(num_bytes): - msg = "Not enough data in header" - raise SyntaxError(msg) - - data = self.fp.read(num_bytes) - if len(data) < num_bytes: - msg = f"Expected to read {num_bytes} bytes but only got {len(data)}." - raise OSError(msg) - - if self.remaining_in_box > 0: - self.remaining_in_box -= num_bytes - return data - - def read_fields(self, field_format: str) -> tuple[int | bytes, ...]: - size = struct.calcsize(field_format) - data = self._read_bytes(size) - return struct.unpack(field_format, data) - - def read_boxes(self) -> BoxReader: - size = self.remaining_in_box - data = self._read_bytes(size) - return BoxReader(io.BytesIO(data), size) - - def has_next_box(self) -> bool: - if self.has_length: - return self.fp.tell() + self.remaining_in_box < self.length - else: - return True - - def next_box_type(self) -> bytes: - # Skip the rest of the box if it has not been read - if self.remaining_in_box > 0: - self.fp.seek(self.remaining_in_box, os.SEEK_CUR) - self.remaining_in_box = -1 - - # Read the length and type of the next box - lbox, tbox = cast(tuple[int, bytes], self.read_fields(">I4s")) - if lbox == 1: - lbox = cast(int, self.read_fields(">Q")[0]) - hlen = 16 - else: - hlen = 8 - - if lbox < hlen or not self._can_read(lbox - hlen): - msg = "Invalid header length" - raise SyntaxError(msg) - - self.remaining_in_box = lbox - hlen - return tbox - - -def _parse_codestream(fp: IO[bytes]) -> tuple[tuple[int, int], str]: - """Parse the JPEG 2000 codestream to extract the size and component - count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" - - hdr = fp.read(2) - lsiz = _binary.i16be(hdr) - siz = hdr + fp.read(lsiz - 2) - lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from( - ">HHIIIIIIIIH", siz - ) - - size = (xsiz - xosiz, ysiz - yosiz) - if csiz == 1: - ssiz = struct.unpack_from(">B", siz, 38) - if (ssiz[0] & 0x7F) + 1 > 8: - mode = "I;16" - else: - mode = "L" - elif csiz == 2: - mode = "LA" - elif csiz == 3: - mode = "RGB" - elif csiz == 4: - mode = "RGBA" - else: - msg = "unable to determine J2K image mode" - raise SyntaxError(msg) - - return size, mode - - -def _res_to_dpi(num: int, denom: int, exp: int) -> float | None: - """Convert JPEG2000's (numerator, denominator, exponent-base-10) resolution, - calculated as (num / denom) * 10^exp and stored in dots per meter, - to floating-point dots per inch.""" - if denom == 0: - return None - return (254 * num * (10**exp)) / (10000 * denom) - - -def _parse_jp2_header( - fp: IO[bytes], -) -> tuple[ - tuple[int, int], - str, - str | None, - tuple[float, float] | None, - ImagePalette.ImagePalette | None, -]: - """Parse the JP2 header box to extract size, component count, - color space information, and optionally DPI information, - returning a (size, mode, mimetype, dpi) tuple.""" - - # Find the JP2 header box - reader = BoxReader(fp) - header = None - mimetype = None - while reader.has_next_box(): - tbox = reader.next_box_type() - - if tbox == b"jp2h": - header = reader.read_boxes() - break - elif tbox == b"ftyp": - if reader.read_fields(">4s")[0] == b"jpx ": - mimetype = "image/jpx" - assert header is not None - - size = None - mode = None - bpc = None - nc = None - dpi = None # 2-tuple of DPI info, or None - palette = None - - while header.has_next_box(): - tbox = header.next_box_type() - - if tbox == b"ihdr": - height, width, nc, bpc = header.read_fields(">IIHB") - assert isinstance(height, int) - assert isinstance(width, int) - assert isinstance(bpc, int) - size = (width, height) - if nc == 1 and (bpc & 0x7F) > 8: - mode = "I;16" - elif nc == 1: - mode = "L" - elif nc == 2: - mode = "LA" - elif nc == 3: - mode = "RGB" - elif nc == 4: - mode = "RGBA" - elif tbox == b"colr" and nc == 4: - meth, _, _, enumcs = header.read_fields(">BBBI") - if meth == 1 and enumcs == 12: - mode = "CMYK" - elif tbox == b"pclr" and mode in ("L", "LA"): - ne, npc = header.read_fields(">HB") - assert isinstance(ne, int) - assert isinstance(npc, int) - max_bitdepth = 0 - for bitdepth in header.read_fields(">" + ("B" * npc)): - assert isinstance(bitdepth, int) - if bitdepth > max_bitdepth: - max_bitdepth = bitdepth - if max_bitdepth <= 8: - palette = ImagePalette.ImagePalette("RGBA" if npc == 4 else "RGB") - for i in range(ne): - color: list[int] = [] - for value in header.read_fields(">" + ("B" * npc)): - assert isinstance(value, int) - color.append(value) - palette.getcolor(tuple(color)) - mode = "P" if mode == "L" else "PA" - elif tbox == b"res ": - res = header.read_boxes() - while res.has_next_box(): - tres = res.next_box_type() - if tres == b"resc": - vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB") - assert isinstance(vrcn, int) - assert isinstance(vrcd, int) - assert isinstance(hrcn, int) - assert isinstance(hrcd, int) - assert isinstance(vrce, int) - assert isinstance(hrce, int) - hres = _res_to_dpi(hrcn, hrcd, hrce) - vres = _res_to_dpi(vrcn, vrcd, vrce) - if hres is not None and vres is not None: - dpi = (hres, vres) - break - - if size is None or mode is None: - msg = "Malformed JP2 header" - raise SyntaxError(msg) - - return size, mode, mimetype, dpi, palette - - -## -# Image plugin for JPEG2000 images. - - -class Jpeg2KImageFile(ImageFile.ImageFile): - format = "JPEG2000" - format_description = "JPEG 2000 (ISO 15444)" - - def _open(self) -> None: - sig = self.fp.read(4) - if sig == b"\xff\x4f\xff\x51": - self.codec = "j2k" - self._size, self._mode = _parse_codestream(self.fp) - self._parse_comment() - else: - sig = sig + self.fp.read(8) - - if sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a": - self.codec = "jp2" - header = _parse_jp2_header(self.fp) - self._size, self._mode, self.custom_mimetype, dpi, self.palette = header - if dpi is not None: - self.info["dpi"] = dpi - if self.fp.read(12).endswith(b"jp2c\xff\x4f\xff\x51"): - hdr = self.fp.read(2) - length = _binary.i16be(hdr) - self.fp.seek(length - 2, os.SEEK_CUR) - self._parse_comment() - else: - msg = "not a JPEG 2000 file" - raise SyntaxError(msg) - - self._reduce = 0 - self.layers = 0 - - fd = -1 - length = -1 - - try: - fd = self.fp.fileno() - length = os.fstat(fd).st_size - except Exception: - fd = -1 - try: - pos = self.fp.tell() - self.fp.seek(0, io.SEEK_END) - length = self.fp.tell() - self.fp.seek(pos) - except Exception: - length = -1 - - self.tile = [ - ImageFile._Tile( - "jpeg2k", - (0, 0) + self.size, - 0, - (self.codec, self._reduce, self.layers, fd, length), - ) - ] - - def _parse_comment(self) -> None: - while True: - marker = self.fp.read(2) - if not marker: - break - typ = marker[1] - if typ in (0x90, 0xD9): - # Start of tile or end of codestream - break - hdr = self.fp.read(2) - length = _binary.i16be(hdr) - if typ == 0x64: - # Comment - self.info["comment"] = self.fp.read(length - 2)[2:] - break - else: - self.fp.seek(length - 2, os.SEEK_CUR) - - @property # type: ignore[override] - def reduce( - self, - ) -> ( - Callable[[int | tuple[int, int], tuple[int, int, int, int] | None], Image.Image] - | int - ): - # https://github.com/python-pillow/Pillow/issues/4343 found that the - # new Image 'reduce' method was shadowed by this plugin's 'reduce' - # property. This attempts to allow for both scenarios - return self._reduce or super().reduce - - @reduce.setter - def reduce(self, value: int) -> None: - self._reduce = value - - def load(self) -> Image.core.PixelAccess | None: - if self.tile and self._reduce: - power = 1 << self._reduce - adjust = power >> 1 - self._size = ( - int((self.size[0] + adjust) / power), - int((self.size[1] + adjust) / power), - ) - - # Update the reduce and layers settings - t = self.tile[0] - assert isinstance(t[3], tuple) - t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4]) - self.tile = [ImageFile._Tile(t[0], (0, 0) + self.size, t[2], t3)] - - return ImageFile.ImageFile.load(self) - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith( - (b"\xff\x4f\xff\x51", b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a") - ) - - -# ------------------------------------------------------------ -# Save support - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # Get the keyword arguments - info = im.encoderinfo - - if isinstance(filename, str): - filename = filename.encode() - if filename.endswith(b".j2k") or info.get("no_jp2", False): - kind = "j2k" - else: - kind = "jp2" - - offset = info.get("offset", None) - tile_offset = info.get("tile_offset", None) - tile_size = info.get("tile_size", None) - quality_mode = info.get("quality_mode", "rates") - quality_layers = info.get("quality_layers", None) - if quality_layers is not None and not ( - isinstance(quality_layers, (list, tuple)) - and all( - isinstance(quality_layer, (int, float)) for quality_layer in quality_layers - ) - ): - msg = "quality_layers must be a sequence of numbers" - raise ValueError(msg) - - num_resolutions = info.get("num_resolutions", 0) - cblk_size = info.get("codeblock_size", None) - precinct_size = info.get("precinct_size", None) - irreversible = info.get("irreversible", False) - progression = info.get("progression", "LRCP") - cinema_mode = info.get("cinema_mode", "no") - mct = info.get("mct", 0) - signed = info.get("signed", False) - comment = info.get("comment") - if isinstance(comment, str): - comment = comment.encode() - plt = info.get("plt", False) - - fd = -1 - if hasattr(fp, "fileno"): - try: - fd = fp.fileno() - except Exception: - fd = -1 - - im.encoderconfig = ( - offset, - tile_offset, - tile_size, - quality_mode, - quality_layers, - num_resolutions, - cblk_size, - precinct_size, - irreversible, - progression, - cinema_mode, - mct, - signed, - fd, - comment, - plt, - ) - - ImageFile._save(im, fp, [ImageFile._Tile("jpeg2k", (0, 0) + im.size, 0, kind)]) - - -# ------------------------------------------------------------ -# Registry stuff - - -Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) -Image.register_save(Jpeg2KImageFile.format, _save) - -Image.register_extensions( - Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"] -) - -Image.register_mime(Jpeg2KImageFile.format, "image/jp2") diff --git a/.venv/lib/python3.10/site-packages/PIL/JpegImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/JpegImagePlugin.py deleted file mode 100644 index 9695288..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/JpegImagePlugin.py +++ /dev/null @@ -1,905 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# JPEG (JFIF) file handling -# -# See "Digital Compression and Coding of Continuous-Tone Still Images, -# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) -# -# History: -# 1995-09-09 fl Created -# 1995-09-13 fl Added full parser -# 1996-03-25 fl Added hack to use the IJG command line utilities -# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug -# 1996-05-28 fl Added draft support, JFIF version (0.1) -# 1996-12-30 fl Added encoder options, added progression property (0.2) -# 1997-08-27 fl Save mode 1 images as BW (0.3) -# 1998-07-12 fl Added YCbCr to draft and save methods (0.4) -# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) -# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) -# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) -# 2003-04-25 fl Added experimental EXIF decoder (0.5) -# 2003-06-06 fl Added experimental EXIF GPSinfo decoder -# 2003-09-13 fl Extract COM markers -# 2009-09-06 fl Added icc_profile support (from Florian Hoech) -# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) -# 2009-03-08 fl Added subsampling support (from Justin Huff). -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import array -import io -import math -import os -import struct -import subprocess -import sys -import tempfile -import warnings -from typing import IO, Any - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._binary import o16be as o16 -from ._deprecate import deprecate -from .JpegPresets import presets - -TYPE_CHECKING = False -if TYPE_CHECKING: - from .MpoImagePlugin import MpoImageFile - -# -# Parser - - -def Skip(self: JpegImageFile, marker: int) -> None: - n = i16(self.fp.read(2)) - 2 - ImageFile._safe_read(self.fp, n) - - -def APP(self: JpegImageFile, marker: int) -> None: - # - # Application marker. Store these in the APP dictionary. - # Also look for well-known application markers. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - - app = f"APP{marker & 15}" - - self.app[app] = s # compatibility - self.applist.append((app, s)) - - if marker == 0xFFE0 and s.startswith(b"JFIF"): - # extract JFIF information - self.info["jfif"] = version = i16(s, 5) # version - self.info["jfif_version"] = divmod(version, 256) - # extract JFIF properties - try: - jfif_unit = s[7] - jfif_density = i16(s, 8), i16(s, 10) - except Exception: - pass - else: - if jfif_unit == 1: - self.info["dpi"] = jfif_density - elif jfif_unit == 2: # cm - # 1 dpcm = 2.54 dpi - self.info["dpi"] = tuple(d * 2.54 for d in jfif_density) - self.info["jfif_unit"] = jfif_unit - self.info["jfif_density"] = jfif_density - elif marker == 0xFFE1 and s.startswith(b"Exif\0\0"): - # extract EXIF information - if "exif" in self.info: - self.info["exif"] += s[6:] - else: - self.info["exif"] = s - self._exif_offset = self.fp.tell() - n + 6 - elif marker == 0xFFE1 and s.startswith(b"http://ns.adobe.com/xap/1.0/\x00"): - self.info["xmp"] = s.split(b"\x00", 1)[1] - elif marker == 0xFFE2 and s.startswith(b"FPXR\0"): - # extract FlashPix information (incomplete) - self.info["flashpix"] = s # FIXME: value will change - elif marker == 0xFFE2 and s.startswith(b"ICC_PROFILE\0"): - # Since an ICC profile can be larger than the maximum size of - # a JPEG marker (64K), we need provisions to split it into - # multiple markers. The format defined by the ICC specifies - # one or more APP2 markers containing the following data: - # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) - # Marker sequence number 1, 2, etc (1 byte) - # Number of markers Total of APP2's used (1 byte) - # Profile data (remainder of APP2 data) - # Decoders should use the marker sequence numbers to - # reassemble the profile, rather than assuming that the APP2 - # markers appear in the correct sequence. - self.icclist.append(s) - elif marker == 0xFFED and s.startswith(b"Photoshop 3.0\x00"): - # parse the image resource block - offset = 14 - photoshop = self.info.setdefault("photoshop", {}) - while s[offset : offset + 4] == b"8BIM": - try: - offset += 4 - # resource code - code = i16(s, offset) - offset += 2 - # resource name (usually empty) - name_len = s[offset] - # name = s[offset+1:offset+1+name_len] - offset += 1 + name_len - offset += offset & 1 # align - # resource data block - size = i32(s, offset) - offset += 4 - data = s[offset : offset + size] - if code == 0x03ED: # ResolutionInfo - photoshop[code] = { - "XResolution": i32(data, 0) / 65536, - "DisplayedUnitsX": i16(data, 4), - "YResolution": i32(data, 8) / 65536, - "DisplayedUnitsY": i16(data, 12), - } - else: - photoshop[code] = data - offset += size - offset += offset & 1 # align - except struct.error: - break # insufficient data - - elif marker == 0xFFEE and s.startswith(b"Adobe"): - self.info["adobe"] = i16(s, 5) - # extract Adobe custom properties - try: - adobe_transform = s[11] - except IndexError: - pass - else: - self.info["adobe_transform"] = adobe_transform - elif marker == 0xFFE2 and s.startswith(b"MPF\0"): - # extract MPO information - self.info["mp"] = s[4:] - # offset is current location minus buffer size - # plus constant header size - self.info["mpoffset"] = self.fp.tell() - n + 4 - - -def COM(self: JpegImageFile, marker: int) -> None: - # - # Comment marker. Store these in the APP dictionary. - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - - self.info["comment"] = s - self.app["COM"] = s # compatibility - self.applist.append(("COM", s)) - - -def SOF(self: JpegImageFile, marker: int) -> None: - # - # Start of frame marker. Defines the size and mode of the - # image. JPEG is colour blind, so we use some simple - # heuristics to map the number of layers to an appropriate - # mode. Note that this could be made a bit brighter, by - # looking for JFIF and Adobe APP markers. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - self._size = i16(s, 3), i16(s, 1) - - self.bits = s[0] - if self.bits != 8: - msg = f"cannot handle {self.bits}-bit layers" - raise SyntaxError(msg) - - self.layers = s[5] - if self.layers == 1: - self._mode = "L" - elif self.layers == 3: - self._mode = "RGB" - elif self.layers == 4: - self._mode = "CMYK" - else: - msg = f"cannot handle {self.layers}-layer images" - raise SyntaxError(msg) - - if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: - self.info["progressive"] = self.info["progression"] = 1 - - if self.icclist: - # fixup icc profile - self.icclist.sort() # sort by sequence number - if self.icclist[0][13] == len(self.icclist): - profile = [p[14:] for p in self.icclist] - icc_profile = b"".join(profile) - else: - icc_profile = None # wrong number of fragments - self.info["icc_profile"] = icc_profile - self.icclist = [] - - for i in range(6, len(s), 3): - t = s[i : i + 3] - # 4-tuples: id, vsamp, hsamp, qtable - self.layer.append((t[0], t[1] // 16, t[1] & 15, t[2])) - - -def DQT(self: JpegImageFile, marker: int) -> None: - # - # Define quantization table. Note that there might be more - # than one table in each marker. - - # FIXME: The quantization tables can be used to estimate the - # compression quality. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - while len(s): - v = s[0] - precision = 1 if (v // 16 == 0) else 2 # in bytes - qt_length = 1 + precision * 64 - if len(s) < qt_length: - msg = "bad quantization table marker" - raise SyntaxError(msg) - data = array.array("B" if precision == 1 else "H", s[1:qt_length]) - if sys.byteorder == "little" and precision > 1: - data.byteswap() # the values are always big-endian - self.quantization[v & 15] = [data[i] for i in zigzag_index] - s = s[qt_length:] - - -# -# JPEG marker table - -MARKER = { - 0xFFC0: ("SOF0", "Baseline DCT", SOF), - 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), - 0xFFC2: ("SOF2", "Progressive DCT", SOF), - 0xFFC3: ("SOF3", "Spatial lossless", SOF), - 0xFFC4: ("DHT", "Define Huffman table", Skip), - 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), - 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), - 0xFFC7: ("SOF7", "Differential spatial", SOF), - 0xFFC8: ("JPG", "Extension", None), - 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), - 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), - 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), - 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), - 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), - 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), - 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), - 0xFFD0: ("RST0", "Restart 0", None), - 0xFFD1: ("RST1", "Restart 1", None), - 0xFFD2: ("RST2", "Restart 2", None), - 0xFFD3: ("RST3", "Restart 3", None), - 0xFFD4: ("RST4", "Restart 4", None), - 0xFFD5: ("RST5", "Restart 5", None), - 0xFFD6: ("RST6", "Restart 6", None), - 0xFFD7: ("RST7", "Restart 7", None), - 0xFFD8: ("SOI", "Start of image", None), - 0xFFD9: ("EOI", "End of image", None), - 0xFFDA: ("SOS", "Start of scan", Skip), - 0xFFDB: ("DQT", "Define quantization table", DQT), - 0xFFDC: ("DNL", "Define number of lines", Skip), - 0xFFDD: ("DRI", "Define restart interval", Skip), - 0xFFDE: ("DHP", "Define hierarchical progression", SOF), - 0xFFDF: ("EXP", "Expand reference component", Skip), - 0xFFE0: ("APP0", "Application segment 0", APP), - 0xFFE1: ("APP1", "Application segment 1", APP), - 0xFFE2: ("APP2", "Application segment 2", APP), - 0xFFE3: ("APP3", "Application segment 3", APP), - 0xFFE4: ("APP4", "Application segment 4", APP), - 0xFFE5: ("APP5", "Application segment 5", APP), - 0xFFE6: ("APP6", "Application segment 6", APP), - 0xFFE7: ("APP7", "Application segment 7", APP), - 0xFFE8: ("APP8", "Application segment 8", APP), - 0xFFE9: ("APP9", "Application segment 9", APP), - 0xFFEA: ("APP10", "Application segment 10", APP), - 0xFFEB: ("APP11", "Application segment 11", APP), - 0xFFEC: ("APP12", "Application segment 12", APP), - 0xFFED: ("APP13", "Application segment 13", APP), - 0xFFEE: ("APP14", "Application segment 14", APP), - 0xFFEF: ("APP15", "Application segment 15", APP), - 0xFFF0: ("JPG0", "Extension 0", None), - 0xFFF1: ("JPG1", "Extension 1", None), - 0xFFF2: ("JPG2", "Extension 2", None), - 0xFFF3: ("JPG3", "Extension 3", None), - 0xFFF4: ("JPG4", "Extension 4", None), - 0xFFF5: ("JPG5", "Extension 5", None), - 0xFFF6: ("JPG6", "Extension 6", None), - 0xFFF7: ("JPG7", "Extension 7", None), - 0xFFF8: ("JPG8", "Extension 8", None), - 0xFFF9: ("JPG9", "Extension 9", None), - 0xFFFA: ("JPG10", "Extension 10", None), - 0xFFFB: ("JPG11", "Extension 11", None), - 0xFFFC: ("JPG12", "Extension 12", None), - 0xFFFD: ("JPG13", "Extension 13", None), - 0xFFFE: ("COM", "Comment", COM), -} - - -def _accept(prefix: bytes) -> bool: - # Magic number was taken from https://en.wikipedia.org/wiki/JPEG - return prefix.startswith(b"\xff\xd8\xff") - - -## -# Image plugin for JPEG and JFIF images. - - -class JpegImageFile(ImageFile.ImageFile): - format = "JPEG" - format_description = "JPEG (ISO 10918)" - - def _open(self) -> None: - s = self.fp.read(3) - - if not _accept(s): - msg = "not a JPEG file" - raise SyntaxError(msg) - s = b"\xff" - - # Create attributes - self.bits = self.layers = 0 - self._exif_offset = 0 - - # JPEG specifics (internal) - self.layer: list[tuple[int, int, int, int]] = [] - self._huffman_dc: dict[Any, Any] = {} - self._huffman_ac: dict[Any, Any] = {} - self.quantization: dict[int, list[int]] = {} - self.app: dict[str, bytes] = {} # compatibility - self.applist: list[tuple[str, bytes]] = [] - self.icclist: list[bytes] = [] - - while True: - i = s[0] - if i == 0xFF: - s = s + self.fp.read(1) - i = i16(s) - else: - # Skip non-0xFF junk - s = self.fp.read(1) - continue - - if i in MARKER: - name, description, handler = MARKER[i] - if handler is not None: - handler(self, i) - if i == 0xFFDA: # start of scan - rawmode = self.mode - if self.mode == "CMYK": - rawmode = "CMYK;I" # assume adobe conventions - self.tile = [ - ImageFile._Tile("jpeg", (0, 0) + self.size, 0, (rawmode, "")) - ] - # self.__offset = self.fp.tell() - break - s = self.fp.read(1) - elif i in {0, 0xFFFF}: - # padded marker or junk; move on - s = b"\xff" - elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) - s = self.fp.read(1) - else: - msg = "no marker found" - raise SyntaxError(msg) - - self._read_dpi_from_exif() - - def __getattr__(self, name: str) -> Any: - if name in ("huffman_ac", "huffman_dc"): - deprecate(name, 12) - return getattr(self, "_" + name) - raise AttributeError(name) - - def __getstate__(self) -> list[Any]: - return super().__getstate__() + [self.layers, self.layer] - - def __setstate__(self, state: list[Any]) -> None: - self.layers, self.layer = state[6:] - super().__setstate__(state) - - def load_read(self, read_bytes: int) -> bytes: - """ - internal: read more image data - For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker - so libjpeg can finish decoding - """ - s = self.fp.read(read_bytes) - - if not s and ImageFile.LOAD_TRUNCATED_IMAGES and not hasattr(self, "_ended"): - # Premature EOF. - # Pretend file is finished adding EOI marker - self._ended = True - return b"\xff\xd9" - - return s - - def draft( - self, mode: str | None, size: tuple[int, int] | None - ) -> tuple[str, tuple[int, int, float, float]] | None: - if len(self.tile) != 1: - return None - - # Protect from second call - if self.decoderconfig: - return None - - d, e, o, a = self.tile[0] - scale = 1 - original_size = self.size - - assert isinstance(a, tuple) - if a[0] == "RGB" and mode in ["L", "YCbCr"]: - self._mode = mode - a = mode, "" - - if size: - scale = min(self.size[0] // size[0], self.size[1] // size[1]) - for s in [8, 4, 2, 1]: - if scale >= s: - break - assert e is not None - e = ( - e[0], - e[1], - (e[2] - e[0] + s - 1) // s + e[0], - (e[3] - e[1] + s - 1) // s + e[1], - ) - self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s) - scale = s - - self.tile = [ImageFile._Tile(d, e, o, a)] - self.decoderconfig = (scale, 0) - - box = (0, 0, original_size[0] / scale, original_size[1] / scale) - return self.mode, box - - def load_djpeg(self) -> None: - # ALTERNATIVE: handle JPEGs via the IJG command line utilities - - f, path = tempfile.mkstemp() - os.close(f) - if os.path.exists(self.filename): - subprocess.check_call(["djpeg", "-outfile", path, self.filename]) - else: - try: - os.unlink(path) - except OSError: - pass - - msg = "Invalid Filename" - raise ValueError(msg) - - try: - with Image.open(path) as _im: - _im.load() - self.im = _im.im - finally: - try: - os.unlink(path) - except OSError: - pass - - self._mode = self.im.mode - self._size = self.im.size - - self.tile = [] - - def _getexif(self) -> dict[int, Any] | None: - return _getexif(self) - - def _read_dpi_from_exif(self) -> None: - # If DPI isn't in JPEG header, fetch from EXIF - if "dpi" in self.info or "exif" not in self.info: - return - try: - exif = self.getexif() - resolution_unit = exif[0x0128] - x_resolution = exif[0x011A] - try: - dpi = float(x_resolution[0]) / x_resolution[1] - except TypeError: - dpi = x_resolution - if math.isnan(dpi): - msg = "DPI is not a number" - raise ValueError(msg) - if resolution_unit == 3: # cm - # 1 dpcm = 2.54 dpi - dpi *= 2.54 - self.info["dpi"] = dpi, dpi - except ( - struct.error, # truncated EXIF - KeyError, # dpi not included - SyntaxError, # invalid/unreadable EXIF - TypeError, # dpi is an invalid float - ValueError, # dpi is an invalid float - ZeroDivisionError, # invalid dpi rational value - ): - self.info["dpi"] = 72, 72 - - def _getmp(self) -> dict[int, Any] | None: - return _getmp(self) - - -def _getexif(self: JpegImageFile) -> dict[int, Any] | None: - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - -def _getmp(self: JpegImageFile) -> dict[int, Any] | None: - # Extract MP information. This method was inspired by the "highly - # experimental" _getexif version that's been in use for years now, - # itself based on the ImageFileDirectory class in the TIFF plugin. - - # The MP record essentially consists of a TIFF file embedded in a JPEG - # application marker. - try: - data = self.info["mp"] - except KeyError: - return None - file_contents = io.BytesIO(data) - head = file_contents.read(8) - endianness = ">" if head.startswith(b"\x4d\x4d\x00\x2a") else "<" - # process dictionary - from . import TiffImagePlugin - - try: - info = TiffImagePlugin.ImageFileDirectory_v2(head) - file_contents.seek(info.next) - info.load(file_contents) - mp = dict(info) - except Exception as e: - msg = "malformed MP Index (unreadable directory)" - raise SyntaxError(msg) from e - # it's an error not to have a number of images - try: - quant = mp[0xB001] - except KeyError as e: - msg = "malformed MP Index (no number of images)" - raise SyntaxError(msg) from e - # get MP entries - mpentries = [] - try: - rawmpentries = mp[0xB002] - for entrynum in range(quant): - unpackedentry = struct.unpack_from( - f"{endianness}LLLHH", rawmpentries, entrynum * 16 - ) - labels = ("Attribute", "Size", "DataOffset", "EntryNo1", "EntryNo2") - mpentry = dict(zip(labels, unpackedentry)) - mpentryattr = { - "DependentParentImageFlag": bool(mpentry["Attribute"] & (1 << 31)), - "DependentChildImageFlag": bool(mpentry["Attribute"] & (1 << 30)), - "RepresentativeImageFlag": bool(mpentry["Attribute"] & (1 << 29)), - "Reserved": (mpentry["Attribute"] & (3 << 27)) >> 27, - "ImageDataFormat": (mpentry["Attribute"] & (7 << 24)) >> 24, - "MPType": mpentry["Attribute"] & 0x00FFFFFF, - } - if mpentryattr["ImageDataFormat"] == 0: - mpentryattr["ImageDataFormat"] = "JPEG" - else: - msg = "unsupported picture format in MPO" - raise SyntaxError(msg) - mptypemap = { - 0x000000: "Undefined", - 0x010001: "Large Thumbnail (VGA Equivalent)", - 0x010002: "Large Thumbnail (Full HD Equivalent)", - 0x020001: "Multi-Frame Image (Panorama)", - 0x020002: "Multi-Frame Image: (Disparity)", - 0x020003: "Multi-Frame Image: (Multi-Angle)", - 0x030000: "Baseline MP Primary Image", - } - mpentryattr["MPType"] = mptypemap.get(mpentryattr["MPType"], "Unknown") - mpentry["Attribute"] = mpentryattr - mpentries.append(mpentry) - mp[0xB002] = mpentries - except KeyError as e: - msg = "malformed MP Index (bad MP Entry)" - raise SyntaxError(msg) from e - # Next we should try and parse the individual image unique ID list; - # we don't because I've never seen this actually used in a real MPO - # file and so can't test it. - return mp - - -# -------------------------------------------------------------------- -# stuff to save JPEG files - -RAWMODE = { - "1": "L", - "L": "L", - "RGB": "RGB", - "RGBX": "RGB", - "CMYK": "CMYK;I", # assume adobe conventions - "YCbCr": "YCbCr", -} - -# fmt: off -zigzag_index = ( - 0, 1, 5, 6, 14, 15, 27, 28, - 2, 4, 7, 13, 16, 26, 29, 42, - 3, 8, 12, 17, 25, 30, 41, 43, - 9, 11, 18, 24, 31, 40, 44, 53, - 10, 19, 23, 32, 39, 45, 52, 54, - 20, 22, 33, 38, 46, 51, 55, 60, - 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63, -) - -samplings = { - (1, 1, 1, 1, 1, 1): 0, - (2, 1, 1, 1, 1, 1): 1, - (2, 2, 1, 1, 1, 1): 2, -} -# fmt: on - - -def get_sampling(im: Image.Image) -> int: - # There's no subsampling when images have only 1 layer - # (grayscale images) or when they are CMYK (4 layers), - # so set subsampling to the default value. - # - # NOTE: currently Pillow can't encode JPEG to YCCK format. - # If YCCK support is added in the future, subsampling code will have - # to be updated (here and in JpegEncode.c) to deal with 4 layers. - if not isinstance(im, JpegImageFile) or im.layers in (1, 4): - return -1 - sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] - return samplings.get(sampling, -1) - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.width == 0 or im.height == 0: - msg = "cannot write empty image as JPEG" - raise ValueError(msg) - - try: - rawmode = RAWMODE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as JPEG" - raise OSError(msg) from e - - info = im.encoderinfo - - dpi = [round(x) for x in info.get("dpi", (0, 0))] - - quality = info.get("quality", -1) - subsampling = info.get("subsampling", -1) - qtables = info.get("qtables") - - if quality == "keep": - quality = -1 - subsampling = "keep" - qtables = "keep" - elif quality in presets: - preset = presets[quality] - quality = -1 - subsampling = preset.get("subsampling", -1) - qtables = preset.get("quantization") - elif not isinstance(quality, int): - msg = "Invalid quality setting" - raise ValueError(msg) - else: - if subsampling in presets: - subsampling = presets[subsampling].get("subsampling", -1) - if isinstance(qtables, str) and qtables in presets: - qtables = presets[qtables].get("quantization") - - if subsampling == "4:4:4": - subsampling = 0 - elif subsampling == "4:2:2": - subsampling = 1 - elif subsampling == "4:2:0": - subsampling = 2 - elif subsampling == "4:1:1": - # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. - # Set 4:2:0 if someone is still using that value. - subsampling = 2 - elif subsampling == "keep": - if im.format != "JPEG": - msg = "Cannot use 'keep' when original image is not a JPEG" - raise ValueError(msg) - subsampling = get_sampling(im) - - def validate_qtables( - qtables: ( - str | tuple[list[int], ...] | list[list[int]] | dict[int, list[int]] | None - ), - ) -> list[list[int]] | None: - if qtables is None: - return qtables - if isinstance(qtables, str): - try: - lines = [ - int(num) - for line in qtables.splitlines() - for num in line.split("#", 1)[0].split() - ] - except ValueError as e: - msg = "Invalid quantization table" - raise ValueError(msg) from e - else: - qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)] - if isinstance(qtables, (tuple, list, dict)): - if isinstance(qtables, dict): - qtables = [ - qtables[key] for key in range(len(qtables)) if key in qtables - ] - elif isinstance(qtables, tuple): - qtables = list(qtables) - if not (0 < len(qtables) < 5): - msg = "None or too many quantization tables" - raise ValueError(msg) - for idx, table in enumerate(qtables): - try: - if len(table) != 64: - msg = "Invalid quantization table" - raise TypeError(msg) - table_array = array.array("H", table) - except TypeError as e: - msg = "Invalid quantization table" - raise ValueError(msg) from e - else: - qtables[idx] = list(table_array) - return qtables - - if qtables == "keep": - if im.format != "JPEG": - msg = "Cannot use 'keep' when original image is not a JPEG" - raise ValueError(msg) - qtables = getattr(im, "quantization", None) - qtables = validate_qtables(qtables) - - extra = info.get("extra", b"") - - MAX_BYTES_IN_MARKER = 65533 - xmp = info.get("xmp") - if xmp: - overhead_len = 29 # b"http://ns.adobe.com/xap/1.0/\x00" - max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len - if len(xmp) > max_data_bytes_in_marker: - msg = "XMP data is too long" - raise ValueError(msg) - size = o16(2 + overhead_len + len(xmp)) - extra += b"\xff\xe1" + size + b"http://ns.adobe.com/xap/1.0/\x00" + xmp - - icc_profile = info.get("icc_profile") - if icc_profile: - overhead_len = 14 # b"ICC_PROFILE\0" + o8(i) + o8(len(markers)) - max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len - markers = [] - while icc_profile: - markers.append(icc_profile[:max_data_bytes_in_marker]) - icc_profile = icc_profile[max_data_bytes_in_marker:] - i = 1 - for marker in markers: - size = o16(2 + overhead_len + len(marker)) - extra += ( - b"\xff\xe2" - + size - + b"ICC_PROFILE\0" - + o8(i) - + o8(len(markers)) - + marker - ) - i += 1 - - comment = info.get("comment", im.info.get("comment")) - - # "progressive" is the official name, but older documentation - # says "progression" - # FIXME: issue a warning if the wrong form is used (post-1.1.7) - progressive = info.get("progressive", False) or info.get("progression", False) - - optimize = info.get("optimize", False) - - exif = info.get("exif", b"") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - if len(exif) > MAX_BYTES_IN_MARKER: - msg = "EXIF data is too long" - raise ValueError(msg) - - # get keyword arguments - im.encoderconfig = ( - quality, - progressive, - info.get("smooth", 0), - optimize, - info.get("keep_rgb", False), - info.get("streamtype", 0), - dpi, - subsampling, - info.get("restart_marker_blocks", 0), - info.get("restart_marker_rows", 0), - qtables, - comment, - extra, - exif, - ) - - # if we optimize, libjpeg needs a buffer big enough to hold the whole image - # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is - # channels*size, this is a value that's been used in a django patch. - # https://github.com/matthewwithanm/django-imagekit/issues/50 - bufsize = 0 - if optimize or progressive: - # CMYK can be bigger - if im.mode == "CMYK": - bufsize = 4 * im.size[0] * im.size[1] - # keep sets quality to -1, but the actual value may be high. - elif quality >= 95 or quality == -1: - bufsize = 2 * im.size[0] * im.size[1] - else: - bufsize = im.size[0] * im.size[1] - if exif: - bufsize += len(exif) + 5 - if extra: - bufsize += len(extra) + 1 - else: - # The EXIF info needs to be written as one block, + APP1, + one spare byte. - # Ensure that our buffer is big enough. Same with the icc_profile block. - bufsize = max(bufsize, len(exif) + 5, len(extra) + 1) - - ImageFile._save( - im, fp, [ImageFile._Tile("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize - ) - - -def _save_cjpeg(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # ALTERNATIVE: handle JPEGs via the IJG command line utilities. - tempfile = im._dump() - subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) - try: - os.unlink(tempfile) - except OSError: - pass - - -## -# Factory for making JPEG and MPO instances -def jpeg_factory( - fp: IO[bytes], filename: str | bytes | None = None -) -> JpegImageFile | MpoImageFile: - im = JpegImageFile(fp, filename) - try: - mpheader = im._getmp() - if mpheader is not None and mpheader[45057] > 1: - for segment, content in im.applist: - if segment == "APP1" and b' hdrgm:Version="' in content: - # Ultra HDR images are not yet supported - return im - # It's actually an MPO - from .MpoImagePlugin import MpoImageFile - - # Don't reload everything, just convert it. - im = MpoImageFile.adopt(im, mpheader) - except (TypeError, IndexError): - # It is really a JPEG - pass - except SyntaxError: - warnings.warn( - "Image appears to be a malformed MPO file, it will be " - "interpreted as a base JPEG file" - ) - return im - - -# --------------------------------------------------------------------- -# Registry stuff - -Image.register_open(JpegImageFile.format, jpeg_factory, _accept) -Image.register_save(JpegImageFile.format, _save) - -Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) - -Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/.venv/lib/python3.10/site-packages/PIL/JpegPresets.py b/.venv/lib/python3.10/site-packages/PIL/JpegPresets.py deleted file mode 100644 index d0e64a3..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/JpegPresets.py +++ /dev/null @@ -1,242 +0,0 @@ -""" -JPEG quality settings equivalent to the Photoshop settings. -Can be used when saving JPEG files. - -The following presets are available by default: -``web_low``, ``web_medium``, ``web_high``, ``web_very_high``, ``web_maximum``, -``low``, ``medium``, ``high``, ``maximum``. -More presets can be added to the :py:data:`presets` dict if needed. - -To apply the preset, specify:: - - quality="preset_name" - -To apply only the quantization table:: - - qtables="preset_name" - -To apply only the subsampling setting:: - - subsampling="preset_name" - -Example:: - - im.save("image_name.jpg", quality="web_high") - -Subsampling ------------ - -Subsampling is the practice of encoding images by implementing less resolution -for chroma information than for luma information. -(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling) - -Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and -4:2:0. - -You can get the subsampling of a JPEG with the -:func:`.JpegImagePlugin.get_sampling` function. - -In JPEG compressed data a JPEG marker is used instead of an EXIF tag. -(ref.: https://exiv2.org/tags.html) - - -Quantization tables -------------------- - -They are values use by the DCT (Discrete cosine transform) to remove -*unnecessary* information from the image (the lossy part of the compression). -(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, -https://en.wikipedia.org/wiki/JPEG#Quantization) - -You can get the quantization tables of a JPEG with:: - - im.quantization - -This will return a dict with a number of lists. You can pass this dict -directly as the qtables argument when saving a JPEG. - -The quantization table format in presets is a list with sublists. These formats -are interchangeable. - -Libjpeg ref.: -https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html - -""" - -from __future__ import annotations - -# fmt: off -presets = { - 'web_low': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [20, 16, 25, 39, 50, 46, 62, 68, - 16, 18, 23, 38, 38, 53, 65, 68, - 25, 23, 31, 38, 53, 65, 68, 68, - 39, 38, 38, 53, 65, 68, 68, 68, - 50, 38, 53, 65, 68, 68, 68, 68, - 46, 53, 65, 68, 68, 68, 68, 68, - 62, 65, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68], - [21, 25, 32, 38, 54, 68, 68, 68, - 25, 28, 24, 38, 54, 68, 68, 68, - 32, 24, 32, 43, 66, 68, 68, 68, - 38, 38, 43, 53, 68, 68, 68, 68, - 54, 54, 66, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68] - ]}, - 'web_medium': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [16, 11, 11, 16, 23, 27, 31, 30, - 11, 12, 12, 15, 20, 23, 23, 30, - 11, 12, 13, 16, 23, 26, 35, 47, - 16, 15, 16, 23, 26, 37, 47, 64, - 23, 20, 23, 26, 39, 51, 64, 64, - 27, 23, 26, 37, 51, 64, 64, 64, - 31, 23, 35, 47, 64, 64, 64, 64, - 30, 30, 47, 64, 64, 64, 64, 64], - [17, 15, 17, 21, 20, 26, 38, 48, - 15, 19, 18, 17, 20, 26, 35, 43, - 17, 18, 20, 22, 26, 30, 46, 53, - 21, 17, 22, 28, 30, 39, 53, 64, - 20, 20, 26, 30, 39, 48, 64, 64, - 26, 26, 30, 39, 48, 63, 64, 64, - 38, 35, 46, 53, 64, 64, 64, 64, - 48, 43, 53, 64, 64, 64, 64, 64] - ]}, - 'web_high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [6, 4, 4, 6, 9, 11, 12, 16, - 4, 5, 5, 6, 8, 10, 12, 12, - 4, 5, 5, 6, 10, 12, 14, 19, - 6, 6, 6, 11, 12, 15, 19, 28, - 9, 8, 10, 12, 16, 20, 27, 31, - 11, 10, 12, 15, 20, 27, 31, 31, - 12, 12, 14, 19, 27, 31, 31, 31, - 16, 12, 19, 28, 31, 31, 31, 31], - [7, 7, 13, 24, 26, 31, 31, 31, - 7, 12, 16, 21, 31, 31, 31, 31, - 13, 16, 17, 31, 31, 31, 31, 31, - 24, 21, 31, 31, 31, 31, 31, 31, - 26, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31] - ]}, - 'web_very_high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 4, 5, 7, 9, - 2, 2, 2, 4, 5, 7, 9, 12, - 3, 3, 4, 5, 8, 10, 12, 12, - 4, 4, 5, 7, 10, 12, 12, 12, - 5, 5, 7, 9, 12, 12, 12, 12, - 6, 6, 9, 12, 12, 12, 12, 12], - [3, 3, 5, 9, 13, 15, 15, 15, - 3, 4, 6, 11, 14, 12, 12, 12, - 5, 6, 9, 14, 12, 12, 12, 12, - 9, 11, 14, 12, 12, 12, 12, 12, - 13, 14, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'web_maximum': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 2, 2, - 1, 1, 1, 1, 1, 2, 2, 3, - 1, 1, 1, 1, 2, 2, 3, 3, - 1, 1, 1, 2, 2, 3, 3, 3, - 1, 1, 2, 2, 3, 3, 3, 3], - [1, 1, 1, 2, 2, 3, 3, 3, - 1, 1, 1, 2, 3, 3, 3, 3, - 1, 1, 1, 3, 3, 3, 3, 3, - 2, 2, 3, 3, 3, 3, 3, 3, - 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3] - ]}, - 'low': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [18, 14, 14, 21, 30, 35, 34, 17, - 14, 16, 16, 19, 26, 23, 12, 12, - 14, 16, 17, 21, 23, 12, 12, 12, - 21, 19, 21, 23, 12, 12, 12, 12, - 30, 26, 23, 12, 12, 12, 12, 12, - 35, 23, 12, 12, 12, 12, 12, 12, - 34, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12], - [20, 19, 22, 27, 20, 20, 17, 17, - 19, 25, 23, 14, 14, 12, 12, 12, - 22, 23, 14, 14, 12, 12, 12, 12, - 27, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'medium': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [12, 8, 8, 12, 17, 21, 24, 17, - 8, 9, 9, 11, 15, 19, 12, 12, - 8, 9, 10, 12, 19, 12, 12, 12, - 12, 11, 12, 21, 12, 12, 12, 12, - 17, 15, 19, 12, 12, 12, 12, 12, - 21, 19, 12, 12, 12, 12, 12, 12, - 24, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12], - [13, 11, 13, 16, 20, 20, 17, 17, - 11, 14, 14, 14, 14, 12, 12, 12, - 13, 14, 14, 14, 12, 12, 12, 12, - 16, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [6, 4, 4, 6, 9, 11, 12, 16, - 4, 5, 5, 6, 8, 10, 12, 12, - 4, 5, 5, 6, 10, 12, 12, 12, - 6, 6, 6, 11, 12, 12, 12, 12, - 9, 8, 10, 12, 12, 12, 12, 12, - 11, 10, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 16, 12, 12, 12, 12, 12, 12, 12], - [7, 7, 13, 24, 20, 20, 17, 17, - 7, 12, 16, 14, 14, 12, 12, 12, - 13, 16, 14, 14, 12, 12, 12, 12, - 24, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'maximum': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 4, 5, 7, 9, - 2, 2, 2, 4, 5, 7, 9, 12, - 3, 3, 4, 5, 8, 10, 12, 12, - 4, 4, 5, 7, 10, 12, 12, 12, - 5, 5, 7, 9, 12, 12, 12, 12, - 6, 6, 9, 12, 12, 12, 12, 12], - [3, 3, 5, 9, 13, 15, 15, 15, - 3, 4, 6, 10, 14, 12, 12, 12, - 5, 6, 9, 14, 12, 12, 12, 12, - 9, 10, 14, 12, 12, 12, 12, 12, - 13, 14, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12] - ]}, -} -# fmt: on diff --git a/.venv/lib/python3.10/site-packages/PIL/McIdasImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/McIdasImagePlugin.py deleted file mode 100644 index b4460a9..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/McIdasImagePlugin.py +++ /dev/null @@ -1,80 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Basic McIdas support for PIL -# -# History: -# 1997-05-05 fl Created (8-bit images only) -# 2009-03-08 fl Added 16/32-bit support. -# -# Thanks to Richard Jones and Craig Swank for specs and samples. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import struct - -from . import Image, ImageFile - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"\x00\x00\x00\x00\x00\x00\x00\x04") - - -## -# Image plugin for McIdas area images. - - -class McIdasImageFile(ImageFile.ImageFile): - format = "MCIDAS" - format_description = "McIdas area file" - - def _open(self) -> None: - # parse area file directory - assert self.fp is not None - - s = self.fp.read(256) - if not _accept(s) or len(s) != 256: - msg = "not an McIdas area file" - raise SyntaxError(msg) - - self.area_descriptor_raw = s - self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) - - # get mode - if w[11] == 1: - mode = rawmode = "L" - elif w[11] == 2: - # FIXME: add memory map support - mode = "I" - rawmode = "I;16B" - elif w[11] == 4: - # FIXME: add memory map support - mode = "I" - rawmode = "I;32B" - else: - msg = "unsupported McIdas format" - raise SyntaxError(msg) - - self._mode = mode - self._size = w[10], w[9] - - offset = w[34] + w[15] - stride = w[15] + w[10] * w[11] * w[14] - - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride, 1)) - ] - - -# -------------------------------------------------------------------- -# registry - -Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) - -# no default extension diff --git a/.venv/lib/python3.10/site-packages/PIL/MicImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/MicImagePlugin.py deleted file mode 100644 index 9ce38c4..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/MicImagePlugin.py +++ /dev/null @@ -1,102 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Microsoft Image Composer support for PIL -# -# Notes: -# uses TiffImagePlugin.py to read the actual image streams -# -# History: -# 97-01-20 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import olefile - -from . import Image, TiffImagePlugin - -# -# -------------------------------------------------------------------- - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(olefile.MAGIC) - - -## -# Image plugin for Microsoft's Image Composer file format. - - -class MicImageFile(TiffImagePlugin.TiffImageFile): - format = "MIC" - format_description = "Microsoft Image Composer" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - # read the OLE directory and see if this is a likely - # to be a Microsoft Image Composer file - - try: - self.ole = olefile.OleFileIO(self.fp) - except OSError as e: - msg = "not an MIC file; invalid OLE file" - raise SyntaxError(msg) from e - - # find ACI subfiles with Image members (maybe not the - # best way to identify MIC files, but what the... ;-) - - self.images = [ - path - for path in self.ole.listdir() - if path[1:] and path[0].endswith(".ACI") and path[1] == "Image" - ] - - # if we didn't find any images, this is probably not - # an MIC file. - if not self.images: - msg = "not an MIC file; no image entries" - raise SyntaxError(msg) - - self.frame = -1 - self._n_frames = len(self.images) - self.is_animated = self._n_frames > 1 - - self.__fp = self.fp - self.seek(0) - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - filename = self.images[frame] - self.fp = self.ole.openstream(filename) - - TiffImagePlugin.TiffImageFile._open(self) - - self.frame = frame - - def tell(self) -> int: - return self.frame - - def close(self) -> None: - self.__fp.close() - self.ole.close() - super().close() - - def __exit__(self, *args: object) -> None: - self.__fp.close() - self.ole.close() - super().__exit__() - - -# -# -------------------------------------------------------------------- - -Image.register_open(MicImageFile.format, MicImageFile, _accept) - -Image.register_extension(MicImageFile.format, ".mic") diff --git a/.venv/lib/python3.10/site-packages/PIL/MpegImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/MpegImagePlugin.py deleted file mode 100644 index 5aa00d0..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/MpegImagePlugin.py +++ /dev/null @@ -1,88 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# MPEG file handling -# -# History: -# 95-09-09 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i8 -from ._typing import SupportsRead - -# -# Bitstream parser - - -class BitStream: - def __init__(self, fp: SupportsRead[bytes]) -> None: - self.fp = fp - self.bits = 0 - self.bitbuffer = 0 - - def next(self) -> int: - return i8(self.fp.read(1)) - - def peek(self, bits: int) -> int: - while self.bits < bits: - c = self.next() - if c < 0: - self.bits = 0 - continue - self.bitbuffer = (self.bitbuffer << 8) + c - self.bits += 8 - return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 - - def skip(self, bits: int) -> None: - while self.bits < bits: - self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) - self.bits += 8 - self.bits = self.bits - bits - - def read(self, bits: int) -> int: - v = self.peek(bits) - self.bits = self.bits - bits - return v - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"\x00\x00\x01\xb3") - - -## -# Image plugin for MPEG streams. This plugin can identify a stream, -# but it cannot read it. - - -class MpegImageFile(ImageFile.ImageFile): - format = "MPEG" - format_description = "MPEG" - - def _open(self) -> None: - assert self.fp is not None - - s = BitStream(self.fp) - if s.read(32) != 0x1B3: - msg = "not an MPEG file" - raise SyntaxError(msg) - - self._mode = "RGB" - self._size = s.read(12), s.read(12) - - -# -------------------------------------------------------------------- -# Registry stuff - -Image.register_open(MpegImageFile.format, MpegImageFile, _accept) - -Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) - -Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/.venv/lib/python3.10/site-packages/PIL/MpoImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/MpoImagePlugin.py deleted file mode 100644 index f7393ea..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/MpoImagePlugin.py +++ /dev/null @@ -1,195 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# MPO file handling -# -# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the -# Camera & Imaging Products Association) -# -# The multi-picture object combines multiple JPEG images (with a modified EXIF -# data format) into a single file. While it can theoretically be used much like -# a GIF animation, it is commonly used to represent 3D photographs and is (as -# of this writing) the most commonly used format by 3D cameras. -# -# History: -# 2014-03-13 Feneric Created -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import itertools -import os -import struct -from typing import IO, Any, cast - -from . import ( - Image, - ImageFile, - ImageSequence, - JpegImagePlugin, - TiffImagePlugin, -) -from ._binary import o32le -from ._util import DeferredError - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - JpegImagePlugin._save(im, fp, filename) - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - append_images = im.encoderinfo.get("append_images", []) - if not append_images and not getattr(im, "is_animated", False): - _save(im, fp, filename) - return - - mpf_offset = 28 - offsets: list[int] = [] - for imSequence in itertools.chain([im], append_images): - for im_frame in ImageSequence.Iterator(imSequence): - if not offsets: - # APP2 marker - im_frame.encoderinfo["extra"] = ( - b"\xff\xe2" + struct.pack(">H", 6 + 82) + b"MPF\0" + b" " * 82 - ) - exif = im_frame.encoderinfo.get("exif") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - im_frame.encoderinfo["exif"] = exif - if exif: - mpf_offset += 4 + len(exif) - - JpegImagePlugin._save(im_frame, fp, filename) - offsets.append(fp.tell()) - else: - im_frame.save(fp, "JPEG") - offsets.append(fp.tell() - offsets[-1]) - - ifd = TiffImagePlugin.ImageFileDirectory_v2() - ifd[0xB000] = b"0100" - ifd[0xB001] = len(offsets) - - mpentries = b"" - data_offset = 0 - for i, size in enumerate(offsets): - if i == 0: - mptype = 0x030000 # Baseline MP Primary Image - else: - mptype = 0x000000 # Undefined - mpentries += struct.pack(" None: - self.fp.seek(0) # prep the fp in order to pass the JPEG test - JpegImagePlugin.JpegImageFile._open(self) - self._after_jpeg_open() - - def _after_jpeg_open(self, mpheader: dict[int, Any] | None = None) -> None: - self.mpinfo = mpheader if mpheader is not None else self._getmp() - if self.mpinfo is None: - msg = "Image appears to be a malformed MPO file" - raise ValueError(msg) - self.n_frames = self.mpinfo[0xB001] - self.__mpoffsets = [ - mpent["DataOffset"] + self.info["mpoffset"] for mpent in self.mpinfo[0xB002] - ] - self.__mpoffsets[0] = 0 - # Note that the following assertion will only be invalid if something - # gets broken within JpegImagePlugin. - assert self.n_frames == len(self.__mpoffsets) - del self.info["mpoffset"] # no longer needed - self.is_animated = self.n_frames > 1 - self._fp = self.fp # FIXME: hack - self._fp.seek(self.__mpoffsets[0]) # get ready to read first frame - self.__frame = 0 - self.offset = 0 - # for now we can only handle reading and individual frame extraction - self.readonly = 1 - - def load_seek(self, pos: int) -> None: - if isinstance(self._fp, DeferredError): - raise self._fp.ex - self._fp.seek(pos) - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if isinstance(self._fp, DeferredError): - raise self._fp.ex - self.fp = self._fp - self.offset = self.__mpoffsets[frame] - - original_exif = self.info.get("exif") - if "exif" in self.info: - del self.info["exif"] - - self.fp.seek(self.offset + 2) # skip SOI marker - if not self.fp.read(2): - msg = "No data found for frame" - raise ValueError(msg) - self.fp.seek(self.offset) - JpegImagePlugin.JpegImageFile._open(self) - if self.info.get("exif") != original_exif: - self._reload_exif() - - self.tile = [ - ImageFile._Tile("jpeg", (0, 0) + self.size, self.offset, self.tile[0][-1]) - ] - self.__frame = frame - - def tell(self) -> int: - return self.__frame - - @staticmethod - def adopt( - jpeg_instance: JpegImagePlugin.JpegImageFile, - mpheader: dict[int, Any] | None = None, - ) -> MpoImageFile: - """ - Transform the instance of JpegImageFile into - an instance of MpoImageFile. - After the call, the JpegImageFile is extended - to be an MpoImageFile. - - This is essentially useful when opening a JPEG - file that reveals itself as an MPO, to avoid - double call to _open. - """ - jpeg_instance.__class__ = MpoImageFile - mpo_instance = cast(MpoImageFile, jpeg_instance) - mpo_instance._after_jpeg_open(mpheader) - return mpo_instance - - -# --------------------------------------------------------------------- -# Registry stuff - -# Note that since MPO shares a factory with JPEG, we do not need to do a -# separate registration for it here. -# Image.register_open(MpoImageFile.format, -# JpegImagePlugin.jpeg_factory, _accept) -Image.register_save(MpoImageFile.format, _save) -Image.register_save_all(MpoImageFile.format, _save_all) - -Image.register_extension(MpoImageFile.format, ".mpo") - -Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/.venv/lib/python3.10/site-packages/PIL/MspImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/MspImagePlugin.py deleted file mode 100644 index 277087a..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/MspImagePlugin.py +++ /dev/null @@ -1,200 +0,0 @@ -# -# The Python Imaging Library. -# -# MSP file handling -# -# This is the format used by the Paint program in Windows 1 and 2. -# -# History: -# 95-09-05 fl Created -# 97-01-03 fl Read/write MSP images -# 17-02-21 es Fixed RLE interpretation -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-97. -# Copyright (c) Eric Soroos 2017. -# -# See the README file for information on usage and redistribution. -# -# More info on this format: https://archive.org/details/gg243631 -# Page 313: -# Figure 205. Windows Paint Version 1: "DanM" Format -# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 -# -# See also: https://www.fileformat.info/format/mspaint/egff.htm -from __future__ import annotations - -import io -import struct -from typing import IO - -from . import Image, ImageFile -from ._binary import i16le as i16 -from ._binary import o16le as o16 - -# -# read MSP files - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith((b"DanM", b"LinS")) - - -## -# Image plugin for Windows MSP images. This plugin supports both -# uncompressed (Windows 1.0). - - -class MspImageFile(ImageFile.ImageFile): - format = "MSP" - format_description = "Windows Paint" - - def _open(self) -> None: - # Header - assert self.fp is not None - - s = self.fp.read(32) - if not _accept(s): - msg = "not an MSP file" - raise SyntaxError(msg) - - # Header checksum - checksum = 0 - for i in range(0, 32, 2): - checksum = checksum ^ i16(s, i) - if checksum != 0: - msg = "bad MSP checksum" - raise SyntaxError(msg) - - self._mode = "1" - self._size = i16(s, 4), i16(s, 6) - - if s.startswith(b"DanM"): - self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 32, "1")] - else: - self.tile = [ImageFile._Tile("MSP", (0, 0) + self.size, 32)] - - -class MspDecoder(ImageFile.PyDecoder): - # The algo for the MSP decoder is from - # https://www.fileformat.info/format/mspaint/egff.htm - # cc-by-attribution -- That page references is taken from the - # Encyclopedia of Graphics File Formats and is licensed by - # O'Reilly under the Creative Common/Attribution license - # - # For RLE encoded files, the 32byte header is followed by a scan - # line map, encoded as one 16bit word of encoded byte length per - # line. - # - # NOTE: the encoded length of the line can be 0. This was not - # handled in the previous version of this encoder, and there's no - # mention of how to handle it in the documentation. From the few - # examples I've seen, I've assumed that it is a fill of the - # background color, in this case, white. - # - # - # Pseudocode of the decoder: - # Read a BYTE value as the RunType - # If the RunType value is zero - # Read next byte as the RunCount - # Read the next byte as the RunValue - # Write the RunValue byte RunCount times - # If the RunType value is non-zero - # Use this value as the RunCount - # Read and write the next RunCount bytes literally - # - # e.g.: - # 0x00 03 ff 05 00 01 02 03 04 - # would yield the bytes: - # 0xff ff ff 00 01 02 03 04 - # - # which are then interpreted as a bit packed mode '1' image - - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - - img = io.BytesIO() - blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8)) - try: - self.fd.seek(32) - rowmap = struct.unpack_from( - f"<{self.state.ysize}H", self.fd.read(self.state.ysize * 2) - ) - except struct.error as e: - msg = "Truncated MSP file in row map" - raise OSError(msg) from e - - for x, rowlen in enumerate(rowmap): - try: - if rowlen == 0: - img.write(blank_line) - continue - row = self.fd.read(rowlen) - if len(row) != rowlen: - msg = f"Truncated MSP file, expected {rowlen} bytes on row {x}" - raise OSError(msg) - idx = 0 - while idx < rowlen: - runtype = row[idx] - idx += 1 - if runtype == 0: - (runcount, runval) = struct.unpack_from("Bc", row, idx) - img.write(runval * runcount) - idx += 2 - else: - runcount = runtype - img.write(row[idx : idx + runcount]) - idx += runcount - - except struct.error as e: - msg = f"Corrupted MSP file in row {x}" - raise OSError(msg) from e - - self.set_as_raw(img.getvalue(), "1") - - return -1, 0 - - -Image.register_decoder("MSP", MspDecoder) - - -# -# write MSP files (uncompressed only) - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode != "1": - msg = f"cannot write mode {im.mode} as MSP" - raise OSError(msg) - - # create MSP header - header = [0] * 16 - - header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 - header[2], header[3] = im.size - header[4], header[5] = 1, 1 - header[6], header[7] = 1, 1 - header[8], header[9] = im.size - - checksum = 0 - for h in header: - checksum = checksum ^ h - header[12] = checksum # FIXME: is this the right field? - - # header - for h in header: - fp.write(o16(h)) - - # image body - ImageFile._save(im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 32, "1")]) - - -# -# registry - -Image.register_open(MspImageFile.format, MspImageFile, _accept) -Image.register_save(MspImageFile.format, _save) - -Image.register_extension(MspImageFile.format, ".msp") diff --git a/.venv/lib/python3.10/site-packages/PIL/PSDraw.py b/.venv/lib/python3.10/site-packages/PIL/PSDraw.py deleted file mode 100644 index 7fd4c5c..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PSDraw.py +++ /dev/null @@ -1,237 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# Simple PostScript graphics interface -# -# History: -# 1996-04-20 fl Created -# 1999-01-10 fl Added gsave/grestore to image method -# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) -# -# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. -# Copyright (c) 1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import sys -from typing import IO - -from . import EpsImagePlugin - -TYPE_CHECKING = False - - -## -# Simple PostScript graphics interface. - - -class PSDraw: - """ - Sets up printing to the given file. If ``fp`` is omitted, - ``sys.stdout.buffer`` is assumed. - """ - - def __init__(self, fp: IO[bytes] | None = None) -> None: - if not fp: - fp = sys.stdout.buffer - self.fp = fp - - def begin_document(self, id: str | None = None) -> None: - """Set up printing of a document. (Write PostScript DSC header.)""" - # FIXME: incomplete - self.fp.write( - b"%!PS-Adobe-3.0\n" - b"save\n" - b"/showpage { } def\n" - b"%%EndComments\n" - b"%%BeginDocument\n" - ) - # self.fp.write(ERROR_PS) # debugging! - self.fp.write(EDROFF_PS) - self.fp.write(VDI_PS) - self.fp.write(b"%%EndProlog\n") - self.isofont: dict[bytes, int] = {} - - def end_document(self) -> None: - """Ends printing. (Write PostScript DSC footer.)""" - self.fp.write(b"%%EndDocument\nrestore showpage\n%%End\n") - if hasattr(self.fp, "flush"): - self.fp.flush() - - def setfont(self, font: str, size: int) -> None: - """ - Selects which font to use. - - :param font: A PostScript font name - :param size: Size in points. - """ - font_bytes = bytes(font, "UTF-8") - if font_bytes not in self.isofont: - # reencode font - self.fp.write( - b"/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font_bytes, font_bytes) - ) - self.isofont[font_bytes] = 1 - # rough - self.fp.write(b"/F0 %d /PSDraw-%s F\n" % (size, font_bytes)) - - def line(self, xy0: tuple[int, int], xy1: tuple[int, int]) -> None: - """ - Draws a line between the two points. Coordinates are given in - PostScript point coordinates (72 points per inch, (0, 0) is the lower - left corner of the page). - """ - self.fp.write(b"%d %d %d %d Vl\n" % (*xy0, *xy1)) - - def rectangle(self, box: tuple[int, int, int, int]) -> None: - """ - Draws a rectangle. - - :param box: A tuple of four integers, specifying left, bottom, width and - height. - """ - self.fp.write(b"%d %d M 0 %d %d Vr\n" % box) - - def text(self, xy: tuple[int, int], text: str) -> None: - """ - Draws text at the given position. You must use - :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. - """ - text_bytes = bytes(text, "UTF-8") - text_bytes = b"\\(".join(text_bytes.split(b"(")) - text_bytes = b"\\)".join(text_bytes.split(b")")) - self.fp.write(b"%d %d M (%s) S\n" % (xy + (text_bytes,))) - - if TYPE_CHECKING: - from . import Image - - def image( - self, box: tuple[int, int, int, int], im: Image.Image, dpi: int | None = None - ) -> None: - """Draw a PIL image, centered in the given box.""" - # default resolution depends on mode - if not dpi: - if im.mode == "1": - dpi = 200 # fax - else: - dpi = 100 # grayscale - # image size (on paper) - x = im.size[0] * 72 / dpi - y = im.size[1] * 72 / dpi - # max allowed size - xmax = float(box[2] - box[0]) - ymax = float(box[3] - box[1]) - if x > xmax: - y = y * xmax / x - x = xmax - if y > ymax: - x = x * ymax / y - y = ymax - dx = (xmax - x) / 2 + box[0] - dy = (ymax - y) / 2 + box[1] - self.fp.write(b"gsave\n%f %f translate\n" % (dx, dy)) - if (x, y) != im.size: - # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) - sx = x / im.size[0] - sy = y / im.size[1] - self.fp.write(b"%f %f scale\n" % (sx, sy)) - EpsImagePlugin._save(im, self.fp, "", 0) - self.fp.write(b"\ngrestore\n") - - -# -------------------------------------------------------------------- -# PostScript driver - -# -# EDROFF.PS -- PostScript driver for Edroff 2 -# -# History: -# 94-01-25 fl: created (edroff 2.04) -# -# Copyright (c) Fredrik Lundh 1994. -# - - -EDROFF_PS = b"""\ -/S { show } bind def -/P { moveto show } bind def -/M { moveto } bind def -/X { 0 rmoveto } bind def -/Y { 0 exch rmoveto } bind def -/E { findfont - dup maxlength dict begin - { - 1 index /FID ne { def } { pop pop } ifelse - } forall - /Encoding exch def - dup /FontName exch def - currentdict end definefont pop -} bind def -/F { findfont exch scalefont dup setfont - [ exch /setfont cvx ] cvx bind def -} bind def -""" - -# -# VDI.PS -- PostScript driver for VDI meta commands -# -# History: -# 94-01-25 fl: created (edroff 2.04) -# -# Copyright (c) Fredrik Lundh 1994. -# - -VDI_PS = b"""\ -/Vm { moveto } bind def -/Va { newpath arcn stroke } bind def -/Vl { moveto lineto stroke } bind def -/Vc { newpath 0 360 arc closepath } bind def -/Vr { exch dup 0 rlineto - exch dup 0 exch rlineto - exch neg 0 rlineto - 0 exch neg rlineto - setgray fill } bind def -/Tm matrix def -/Ve { Tm currentmatrix pop - translate scale newpath 0 0 .5 0 360 arc closepath - Tm setmatrix -} bind def -/Vf { currentgray exch setgray fill setgray } bind def -""" - -# -# ERROR.PS -- Error handler -# -# History: -# 89-11-21 fl: created (pslist 1.10) -# - -ERROR_PS = b"""\ -/landscape false def -/errorBUF 200 string def -/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def -errordict begin /handleerror { - initmatrix /Courier findfont 10 scalefont setfont - newpath 72 720 moveto $error begin /newerror false def - (PostScript Error) show errorNL errorNL - (Error: ) show - /errorname load errorBUF cvs show errorNL errorNL - (Command: ) show - /command load dup type /stringtype ne { errorBUF cvs } if show - errorNL errorNL - (VMstatus: ) show - vmstatus errorBUF cvs show ( bytes available, ) show - errorBUF cvs show ( bytes used at level ) show - errorBUF cvs show errorNL errorNL - (Operand stargck: ) show errorNL /ostargck load { - dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL - } forall errorNL - (Execution stargck: ) show errorNL /estargck load { - dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL - } forall - end showpage -} def end -""" diff --git a/.venv/lib/python3.10/site-packages/PIL/PaletteFile.py b/.venv/lib/python3.10/site-packages/PIL/PaletteFile.py deleted file mode 100644 index 2a26e5d..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PaletteFile.py +++ /dev/null @@ -1,54 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read simple, teragon-style palette files -# -# History: -# 97-08-23 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from typing import IO - -from ._binary import o8 - - -class PaletteFile: - """File handler for Teragon-style palette files.""" - - rawmode = "RGB" - - def __init__(self, fp: IO[bytes]) -> None: - palette = [o8(i) * 3 for i in range(256)] - - while True: - s = fp.readline() - - if not s: - break - if s.startswith(b"#"): - continue - if len(s) > 100: - msg = "bad palette file" - raise SyntaxError(msg) - - v = [int(x) for x in s.split()] - try: - [i, r, g, b] = v - except ValueError: - [i, r] = v - g = b = r - - if 0 <= i <= 255: - palette[i] = o8(r) + o8(g) + o8(b) - - self.palette = b"".join(palette) - - def getpalette(self) -> tuple[bytes, str]: - return self.palette, self.rawmode diff --git a/.venv/lib/python3.10/site-packages/PIL/PalmImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/PalmImagePlugin.py deleted file mode 100644 index 15f7129..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PalmImagePlugin.py +++ /dev/null @@ -1,217 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# - -## -# Image plugin for Palm pixmap images (output only). -## -from __future__ import annotations - -from typing import IO - -from . import Image, ImageFile -from ._binary import o8 -from ._binary import o16be as o16b - -# fmt: off -_Palm8BitColormapValues = ( - (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), - (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), - (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), - (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153), - (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255), - (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255), - (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204), - (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153), - (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153), - (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255), - (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204), - (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204), - (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153), - (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255), - (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255), - (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204), - (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153), - (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153), - (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255), - (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204), - (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204), - (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153), - (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255), - (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255), - (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204), - (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153), - (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153), - (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102), - (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51), - (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51), - (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), - (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102), - (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102), - (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51), - (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0), - (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0), - (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102), - (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51), - (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51), - (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0), - (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102), - (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102), - (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51), - (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0), - (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0), - (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102), - (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51), - (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51), - (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0), - (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102), - (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102), - (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51), - (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0), - (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17), - (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119), - (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221), - (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128), - (0, 128, 0), (0, 128, 128), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)) -# fmt: on - - -# so build a prototype image to be used for palette resampling -def build_prototype_image() -> Image.Image: - image = Image.new("L", (1, len(_Palm8BitColormapValues))) - image.putdata(list(range(len(_Palm8BitColormapValues)))) - palettedata: tuple[int, ...] = () - for colormapValue in _Palm8BitColormapValues: - palettedata += colormapValue - palettedata += (0, 0, 0) * (256 - len(_Palm8BitColormapValues)) - image.putpalette(palettedata) - return image - - -Palm8BitColormapImage = build_prototype_image() - -# OK, we now have in Palm8BitColormapImage, -# a "P"-mode image with the right palette -# -# -------------------------------------------------------------------- - -_FLAGS = {"custom-colormap": 0x4000, "is-compressed": 0x8000, "has-transparent": 0x2000} - -_COMPRESSION_TYPES = {"none": 0xFF, "rle": 0x01, "scanline": 0x00} - - -# -# -------------------------------------------------------------------- - -## -# (Internal) Image save plugin for the Palm format. - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode == "P": - rawmode = "P" - bpp = 8 - version = 1 - - elif im.mode == "L": - if im.encoderinfo.get("bpp") in (1, 2, 4): - # this is 8-bit grayscale, so we shift it to get the high-order bits, - # and invert it because - # Palm does grayscale from white (0) to black (1) - bpp = im.encoderinfo["bpp"] - maxval = (1 << bpp) - 1 - shift = 8 - bpp - im = im.point(lambda x: maxval - (x >> shift)) - elif im.info.get("bpp") in (1, 2, 4): - # here we assume that even though the inherent mode is 8-bit grayscale, - # only the lower bpp bits are significant. - # We invert them to match the Palm. - bpp = im.info["bpp"] - maxval = (1 << bpp) - 1 - im = im.point(lambda x: maxval - (x & maxval)) - else: - msg = f"cannot write mode {im.mode} as Palm" - raise OSError(msg) - - # we ignore the palette here - im._mode = "P" - rawmode = f"P;{bpp}" - version = 1 - - elif im.mode == "1": - # monochrome -- write it inverted, as is the Palm standard - rawmode = "1;I" - bpp = 1 - version = 0 - - else: - msg = f"cannot write mode {im.mode} as Palm" - raise OSError(msg) - - # - # make sure image data is available - im.load() - - # write header - - cols = im.size[0] - rows = im.size[1] - - rowbytes = int((cols + (16 // bpp - 1)) / (16 // bpp)) * 2 - transparent_index = 0 - compression_type = _COMPRESSION_TYPES["none"] - - flags = 0 - if im.mode == "P": - flags |= _FLAGS["custom-colormap"] - colormap = im.im.getpalette() - colors = len(colormap) // 3 - colormapsize = 4 * colors + 2 - else: - colormapsize = 0 - - if "offset" in im.info: - offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 - else: - offset = 0 - - fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) - fp.write(o8(bpp)) - fp.write(o8(version)) - fp.write(o16b(offset)) - fp.write(o8(transparent_index)) - fp.write(o8(compression_type)) - fp.write(o16b(0)) # reserved by Palm - - # now write colormap if necessary - - if colormapsize: - fp.write(o16b(colors)) - for i in range(colors): - fp.write(o8(i)) - fp.write(colormap[3 * i : 3 * i + 3]) - - # now convert data to raw form - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, rowbytes, 1))] - ) - - if hasattr(fp, "flush"): - fp.flush() - - -# -# -------------------------------------------------------------------- - -Image.register_save("Palm", _save) - -Image.register_extension("Palm", ".palm") - -Image.register_mime("Palm", "image/palm") diff --git a/.venv/lib/python3.10/site-packages/PIL/PcdImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/PcdImagePlugin.py deleted file mode 100644 index 3aa2499..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PcdImagePlugin.py +++ /dev/null @@ -1,64 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PCD file handling -# -# History: -# 96-05-10 fl Created -# 96-05-27 fl Added draft mode (128x192, 256x384) -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile - -## -# Image plugin for PhotoCD images. This plugin only reads the 768x512 -# image from the file; higher resolutions are encoded in a proprietary -# encoding. - - -class PcdImageFile(ImageFile.ImageFile): - format = "PCD" - format_description = "Kodak PhotoCD" - - def _open(self) -> None: - # rough - assert self.fp is not None - - self.fp.seek(2048) - s = self.fp.read(2048) - - if not s.startswith(b"PCD_"): - msg = "not a PCD file" - raise SyntaxError(msg) - - orientation = s[1538] & 3 - self.tile_post_rotate = None - if orientation == 1: - self.tile_post_rotate = 90 - elif orientation == 3: - self.tile_post_rotate = -90 - - self._mode = "RGB" - self._size = 768, 512 # FIXME: not correct for rotated images! - self.tile = [ImageFile._Tile("pcd", (0, 0) + self.size, 96 * 2048)] - - def load_end(self) -> None: - if self.tile_post_rotate: - # Handle rotated PCDs - self.im = self.im.rotate(self.tile_post_rotate) - self._size = self.im.size - - -# -# registry - -Image.register_open(PcdImageFile.format, PcdImageFile) - -Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/.venv/lib/python3.10/site-packages/PIL/PcfFontFile.py b/.venv/lib/python3.10/site-packages/PIL/PcfFontFile.py deleted file mode 100644 index 0d1968b..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PcfFontFile.py +++ /dev/null @@ -1,254 +0,0 @@ -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library -# $Id$ -# -# portable compiled font file parser -# -# history: -# 1997-08-19 fl created -# 2003-09-13 fl fixed loading of unicode fonts -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1997-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -from typing import BinaryIO, Callable - -from . import FontFile, Image -from ._binary import i8 -from ._binary import i16be as b16 -from ._binary import i16le as l16 -from ._binary import i32be as b32 -from ._binary import i32le as l32 - -# -------------------------------------------------------------------- -# declarations - -PCF_MAGIC = 0x70636601 # "\x01fcp" - -PCF_PROPERTIES = 1 << 0 -PCF_ACCELERATORS = 1 << 1 -PCF_METRICS = 1 << 2 -PCF_BITMAPS = 1 << 3 -PCF_INK_METRICS = 1 << 4 -PCF_BDF_ENCODINGS = 1 << 5 -PCF_SWIDTHS = 1 << 6 -PCF_GLYPH_NAMES = 1 << 7 -PCF_BDF_ACCELERATORS = 1 << 8 - -BYTES_PER_ROW: list[Callable[[int], int]] = [ - lambda bits: ((bits + 7) >> 3), - lambda bits: ((bits + 15) >> 3) & ~1, - lambda bits: ((bits + 31) >> 3) & ~3, - lambda bits: ((bits + 63) >> 3) & ~7, -] - - -def sz(s: bytes, o: int) -> bytes: - return s[o : s.index(b"\0", o)] - - -class PcfFontFile(FontFile.FontFile): - """Font file plugin for the X11 PCF format.""" - - name = "name" - - def __init__(self, fp: BinaryIO, charset_encoding: str = "iso8859-1"): - self.charset_encoding = charset_encoding - - magic = l32(fp.read(4)) - if magic != PCF_MAGIC: - msg = "not a PCF file" - raise SyntaxError(msg) - - super().__init__() - - count = l32(fp.read(4)) - self.toc = {} - for i in range(count): - type = l32(fp.read(4)) - self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) - - self.fp = fp - - self.info = self._load_properties() - - metrics = self._load_metrics() - bitmaps = self._load_bitmaps(metrics) - encoding = self._load_encoding() - - # - # create glyph structure - - for ch, ix in enumerate(encoding): - if ix is not None: - ( - xsize, - ysize, - left, - right, - width, - ascent, - descent, - attributes, - ) = metrics[ix] - self.glyph[ch] = ( - (width, 0), - (left, descent - ysize, xsize + left, descent), - (0, 0, xsize, ysize), - bitmaps[ix], - ) - - def _getformat( - self, tag: int - ) -> tuple[BinaryIO, int, Callable[[bytes], int], Callable[[bytes], int]]: - format, size, offset = self.toc[tag] - - fp = self.fp - fp.seek(offset) - - format = l32(fp.read(4)) - - if format & 4: - i16, i32 = b16, b32 - else: - i16, i32 = l16, l32 - - return fp, format, i16, i32 - - def _load_properties(self) -> dict[bytes, bytes | int]: - # - # font properties - - properties = {} - - fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) - - nprops = i32(fp.read(4)) - - # read property description - p = [(i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))) for _ in range(nprops)] - - if nprops & 3: - fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad - - data = fp.read(i32(fp.read(4))) - - for k, s, v in p: - property_value: bytes | int = sz(data, v) if s else v - properties[sz(data, k)] = property_value - - return properties - - def _load_metrics(self) -> list[tuple[int, int, int, int, int, int, int, int]]: - # - # font metrics - - metrics: list[tuple[int, int, int, int, int, int, int, int]] = [] - - fp, format, i16, i32 = self._getformat(PCF_METRICS) - - append = metrics.append - - if (format & 0xFF00) == 0x100: - # "compressed" metrics - for i in range(i16(fp.read(2))): - left = i8(fp.read(1)) - 128 - right = i8(fp.read(1)) - 128 - width = i8(fp.read(1)) - 128 - ascent = i8(fp.read(1)) - 128 - descent = i8(fp.read(1)) - 128 - xsize = right - left - ysize = ascent + descent - append((xsize, ysize, left, right, width, ascent, descent, 0)) - - else: - # "jumbo" metrics - for i in range(i32(fp.read(4))): - left = i16(fp.read(2)) - right = i16(fp.read(2)) - width = i16(fp.read(2)) - ascent = i16(fp.read(2)) - descent = i16(fp.read(2)) - attributes = i16(fp.read(2)) - xsize = right - left - ysize = ascent + descent - append((xsize, ysize, left, right, width, ascent, descent, attributes)) - - return metrics - - def _load_bitmaps( - self, metrics: list[tuple[int, int, int, int, int, int, int, int]] - ) -> list[Image.Image]: - # - # bitmap data - - fp, format, i16, i32 = self._getformat(PCF_BITMAPS) - - nbitmaps = i32(fp.read(4)) - - if nbitmaps != len(metrics): - msg = "Wrong number of bitmaps" - raise OSError(msg) - - offsets = [i32(fp.read(4)) for _ in range(nbitmaps)] - - bitmap_sizes = [i32(fp.read(4)) for _ in range(4)] - - # byteorder = format & 4 # non-zero => MSB - bitorder = format & 8 # non-zero => MSB - padindex = format & 3 - - bitmapsize = bitmap_sizes[padindex] - offsets.append(bitmapsize) - - data = fp.read(bitmapsize) - - pad = BYTES_PER_ROW[padindex] - mode = "1;R" - if bitorder: - mode = "1" - - bitmaps = [] - for i in range(nbitmaps): - xsize, ysize = metrics[i][:2] - b, e = offsets[i : i + 2] - bitmaps.append( - Image.frombytes("1", (xsize, ysize), data[b:e], "raw", mode, pad(xsize)) - ) - - return bitmaps - - def _load_encoding(self) -> list[int | None]: - fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) - - first_col, last_col = i16(fp.read(2)), i16(fp.read(2)) - first_row, last_row = i16(fp.read(2)), i16(fp.read(2)) - - i16(fp.read(2)) # default - - nencoding = (last_col - first_col + 1) * (last_row - first_row + 1) - - # map character code to bitmap index - encoding: list[int | None] = [None] * min(256, nencoding) - - encoding_offsets = [i16(fp.read(2)) for _ in range(nencoding)] - - for i in range(first_col, len(encoding)): - try: - encoding_offset = encoding_offsets[ - ord(bytearray([i]).decode(self.charset_encoding)) - ] - if encoding_offset != 0xFFFF: - encoding[i] = encoding_offset - except UnicodeDecodeError: - # character is not supported in selected encoding - pass - - return encoding diff --git a/.venv/lib/python3.10/site-packages/PIL/PcxImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/PcxImagePlugin.py deleted file mode 100644 index 299405a..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PcxImagePlugin.py +++ /dev/null @@ -1,229 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PCX file handling -# -# This format was originally used by ZSoft's popular PaintBrush -# program for the IBM PC. It is also supported by many MS-DOS and -# Windows applications, including the Windows PaintBrush program in -# Windows 3. -# -# history: -# 1995-09-01 fl Created -# 1996-05-20 fl Fixed RGB support -# 1997-01-03 fl Fixed 2-bit and 4-bit support -# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) -# 1999-02-07 fl Added write support -# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust -# 2002-07-30 fl Seek from to current position, not beginning of file -# 2003-06-03 fl Extract DPI settings (info["dpi"]) -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import logging -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -logger = logging.getLogger(__name__) - - -def _accept(prefix: bytes) -> bool: - return prefix[0] == 10 and prefix[1] in [0, 2, 3, 5] - - -## -# Image plugin for Paintbrush images. - - -class PcxImageFile(ImageFile.ImageFile): - format = "PCX" - format_description = "Paintbrush" - - def _open(self) -> None: - # header - assert self.fp is not None - - s = self.fp.read(128) - if not _accept(s): - msg = "not a PCX file" - raise SyntaxError(msg) - - # image - bbox = i16(s, 4), i16(s, 6), i16(s, 8) + 1, i16(s, 10) + 1 - if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: - msg = "bad PCX image size" - raise SyntaxError(msg) - logger.debug("BBox: %s %s %s %s", *bbox) - - # format - version = s[1] - bits = s[3] - planes = s[65] - provided_stride = i16(s, 66) - logger.debug( - "PCX version %s, bits %s, planes %s, stride %s", - version, - bits, - planes, - provided_stride, - ) - - self.info["dpi"] = i16(s, 12), i16(s, 14) - - if bits == 1 and planes == 1: - mode = rawmode = "1" - - elif bits == 1 and planes in (2, 4): - mode = "P" - rawmode = f"P;{planes}L" - self.palette = ImagePalette.raw("RGB", s[16:64]) - - elif version == 5 and bits == 8 and planes == 1: - mode = rawmode = "L" - # FIXME: hey, this doesn't work with the incremental loader !!! - self.fp.seek(-769, io.SEEK_END) - s = self.fp.read(769) - if len(s) == 769 and s[0] == 12: - # check if the palette is linear grayscale - for i in range(256): - if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3: - mode = rawmode = "P" - break - if mode == "P": - self.palette = ImagePalette.raw("RGB", s[1:]) - self.fp.seek(128) - - elif version == 5 and bits == 8 and planes == 3: - mode = "RGB" - rawmode = "RGB;L" - - else: - msg = "unknown PCX mode" - raise OSError(msg) - - self._mode = mode - self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] - - # Don't trust the passed in stride. - # Calculate the approximate position for ourselves. - # CVE-2020-35653 - stride = (self._size[0] * bits + 7) // 8 - - # While the specification states that this must be even, - # not all images follow this - if provided_stride != stride: - stride += stride % 2 - - bbox = (0, 0) + self.size - logger.debug("size: %sx%s", *self.size) - - self.tile = [ - ImageFile._Tile("pcx", bbox, self.fp.tell(), (rawmode, planes * stride)) - ] - - -# -------------------------------------------------------------------- -# save PCX files - - -SAVE = { - # mode: (version, bits, planes, raw mode) - "1": (2, 1, 1, "1"), - "L": (5, 8, 1, "L"), - "P": (5, 8, 1, "P"), - "RGB": (5, 8, 3, "RGB;L"), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - version, bits, planes, rawmode = SAVE[im.mode] - except KeyError as e: - msg = f"Cannot save {im.mode} images as PCX" - raise ValueError(msg) from e - - # bytes per plane - stride = (im.size[0] * bits + 7) // 8 - # stride should be even - stride += stride % 2 - # Stride needs to be kept in sync with the PcxEncode.c version. - # Ideally it should be passed in in the state, but the bytes value - # gets overwritten. - - logger.debug( - "PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", - im.size[0], - bits, - stride, - ) - - # under windows, we could determine the current screen size with - # "Image.core.display_mode()[1]", but I think that's overkill... - - screen = im.size - - dpi = 100, 100 - - # PCX header - fp.write( - o8(10) - + o8(version) - + o8(1) - + o8(bits) - + o16(0) - + o16(0) - + o16(im.size[0] - 1) - + o16(im.size[1] - 1) - + o16(dpi[0]) - + o16(dpi[1]) - + b"\0" * 24 - + b"\xff" * 24 - + b"\0" - + o8(planes) - + o16(stride) - + o16(1) - + o16(screen[0]) - + o16(screen[1]) - + b"\0" * 54 - ) - - assert fp.tell() == 128 - - ImageFile._save( - im, fp, [ImageFile._Tile("pcx", (0, 0) + im.size, 0, (rawmode, bits * planes))] - ) - - if im.mode == "P": - # colour palette - fp.write(o8(12)) - palette = im.im.getpalette("RGB", "RGB") - palette += b"\x00" * (768 - len(palette)) - fp.write(palette) # 768 bytes - elif im.mode == "L": - # grayscale palette - fp.write(o8(12)) - for i in range(256): - fp.write(o8(i) * 3) - - -# -------------------------------------------------------------------- -# registry - - -Image.register_open(PcxImageFile.format, PcxImageFile, _accept) -Image.register_save(PcxImageFile.format, _save) - -Image.register_extension(PcxImageFile.format, ".pcx") - -Image.register_mime(PcxImageFile.format, "image/x-pcx") diff --git a/.venv/lib/python3.10/site-packages/PIL/PdfImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/PdfImagePlugin.py deleted file mode 100644 index e9c20dd..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PdfImagePlugin.py +++ /dev/null @@ -1,311 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PDF (Acrobat) file handling -# -# History: -# 1996-07-16 fl Created -# 1997-01-18 fl Fixed header -# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. -# 2004-02-24 fl Fixes for 1 and P images. -# -# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. -# Copyright (c) 1996-1997 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -## -# Image plugin for PDF images (output only). -## -from __future__ import annotations - -import io -import math -import os -import time -from typing import IO, Any - -from . import Image, ImageFile, ImageSequence, PdfParser, __version__, features - -# -# -------------------------------------------------------------------- - -# object ids: -# 1. catalogue -# 2. pages -# 3. image -# 4. page -# 5. page contents - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, save_all=True) - - -## -# (Internal) Image save plugin for the PDF format. - - -def _write_image( - im: Image.Image, - filename: str | bytes, - existing_pdf: PdfParser.PdfParser, - image_refs: list[PdfParser.IndirectReference], -) -> tuple[PdfParser.IndirectReference, str]: - # FIXME: Should replace ASCIIHexDecode with RunLengthDecode - # (packbits) or LZWDecode (tiff/lzw compression). Note that - # PDF 1.2 also supports Flatedecode (zip compression). - - params = None - decode = None - - # - # Get image characteristics - - width, height = im.size - - dict_obj: dict[str, Any] = {"BitsPerComponent": 8} - if im.mode == "1": - if features.check("libtiff"): - decode_filter = "CCITTFaxDecode" - dict_obj["BitsPerComponent"] = 1 - params = PdfParser.PdfArray( - [ - PdfParser.PdfDict( - { - "K": -1, - "BlackIs1": True, - "Columns": width, - "Rows": height, - } - ) - ] - ) - else: - decode_filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "L": - decode_filter = "DCTDecode" - # params = f"<< /Predictor 15 /Columns {width-2} >>" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "LA": - decode_filter = "JPXDecode" - # params = f"<< /Predictor 15 /Columns {width-2} >>" - procset = "ImageB" # grayscale - dict_obj["SMaskInData"] = 1 - elif im.mode == "P": - decode_filter = "ASCIIHexDecode" - palette = im.getpalette() - assert palette is not None - dict_obj["ColorSpace"] = [ - PdfParser.PdfName("Indexed"), - PdfParser.PdfName("DeviceRGB"), - len(palette) // 3 - 1, - PdfParser.PdfBinary(palette), - ] - procset = "ImageI" # indexed color - - if "transparency" in im.info: - smask = im.convert("LA").getchannel("A") - smask.encoderinfo = {} - - image_ref = _write_image(smask, filename, existing_pdf, image_refs)[0] - dict_obj["SMask"] = image_ref - elif im.mode == "RGB": - decode_filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceRGB") - procset = "ImageC" # color images - elif im.mode == "RGBA": - decode_filter = "JPXDecode" - procset = "ImageC" # color images - dict_obj["SMaskInData"] = 1 - elif im.mode == "CMYK": - decode_filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceCMYK") - procset = "ImageC" # color images - decode = [1, 0, 1, 0, 1, 0, 1, 0] - else: - msg = f"cannot save mode {im.mode}" - raise ValueError(msg) - - # - # image - - op = io.BytesIO() - - if decode_filter == "ASCIIHexDecode": - ImageFile._save(im, op, [ImageFile._Tile("hex", (0, 0) + im.size, 0, im.mode)]) - elif decode_filter == "CCITTFaxDecode": - im.save( - op, - "TIFF", - compression="group4", - # use a single strip - strip_size=math.ceil(width / 8) * height, - ) - elif decode_filter == "DCTDecode": - Image.SAVE["JPEG"](im, op, filename) - elif decode_filter == "JPXDecode": - del dict_obj["BitsPerComponent"] - Image.SAVE["JPEG2000"](im, op, filename) - else: - msg = f"unsupported PDF filter ({decode_filter})" - raise ValueError(msg) - - stream = op.getvalue() - filter: PdfParser.PdfArray | PdfParser.PdfName - if decode_filter == "CCITTFaxDecode": - stream = stream[8:] - filter = PdfParser.PdfArray([PdfParser.PdfName(decode_filter)]) - else: - filter = PdfParser.PdfName(decode_filter) - - image_ref = image_refs.pop(0) - existing_pdf.write_obj( - image_ref, - stream=stream, - Type=PdfParser.PdfName("XObject"), - Subtype=PdfParser.PdfName("Image"), - Width=width, # * 72.0 / x_resolution, - Height=height, # * 72.0 / y_resolution, - Filter=filter, - Decode=decode, - DecodeParms=params, - **dict_obj, - ) - - return image_ref, procset - - -def _save( - im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False -) -> None: - is_appending = im.encoderinfo.get("append", False) - filename_str = filename.decode() if isinstance(filename, bytes) else filename - if is_appending: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename_str, mode="r+b") - else: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename_str, mode="w+b") - - dpi = im.encoderinfo.get("dpi") - if dpi: - x_resolution = dpi[0] - y_resolution = dpi[1] - else: - x_resolution = y_resolution = im.encoderinfo.get("resolution", 72.0) - - info = { - "title": ( - None if is_appending else os.path.splitext(os.path.basename(filename))[0] - ), - "author": None, - "subject": None, - "keywords": None, - "creator": None, - "producer": None, - "creationDate": None if is_appending else time.gmtime(), - "modDate": None if is_appending else time.gmtime(), - } - for k, default in info.items(): - v = im.encoderinfo.get(k) if k in im.encoderinfo else default - if v: - existing_pdf.info[k[0].upper() + k[1:]] = v - - # - # make sure image data is available - im.load() - - existing_pdf.start_writing() - existing_pdf.write_header() - existing_pdf.write_comment(f"created by Pillow {__version__} PDF driver") - - # - # pages - ims = [im] - if save_all: - append_images = im.encoderinfo.get("append_images", []) - for append_im in append_images: - append_im.encoderinfo = im.encoderinfo.copy() - ims.append(append_im) - number_of_pages = 0 - image_refs = [] - page_refs = [] - contents_refs = [] - for im in ims: - im_number_of_pages = 1 - if save_all: - im_number_of_pages = getattr(im, "n_frames", 1) - number_of_pages += im_number_of_pages - for i in range(im_number_of_pages): - image_refs.append(existing_pdf.next_object_id(0)) - if im.mode == "P" and "transparency" in im.info: - image_refs.append(existing_pdf.next_object_id(0)) - - page_refs.append(existing_pdf.next_object_id(0)) - contents_refs.append(existing_pdf.next_object_id(0)) - existing_pdf.pages.append(page_refs[-1]) - - # - # catalog and list of pages - existing_pdf.write_catalog() - - page_number = 0 - for im_sequence in ims: - im_pages: ImageSequence.Iterator | list[Image.Image] = ( - ImageSequence.Iterator(im_sequence) if save_all else [im_sequence] - ) - for im in im_pages: - image_ref, procset = _write_image(im, filename, existing_pdf, image_refs) - - # - # page - - existing_pdf.write_page( - page_refs[page_number], - Resources=PdfParser.PdfDict( - ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], - XObject=PdfParser.PdfDict(image=image_ref), - ), - MediaBox=[ - 0, - 0, - im.width * 72.0 / x_resolution, - im.height * 72.0 / y_resolution, - ], - Contents=contents_refs[page_number], - ) - - # - # page contents - - page_contents = b"q %f 0 0 %f 0 0 cm /image Do Q\n" % ( - im.width * 72.0 / x_resolution, - im.height * 72.0 / y_resolution, - ) - - existing_pdf.write_obj(contents_refs[page_number], stream=page_contents) - - page_number += 1 - - # - # trailer - existing_pdf.write_xref_and_trailer() - if hasattr(fp, "flush"): - fp.flush() - existing_pdf.close() - - -# -# -------------------------------------------------------------------- - - -Image.register_save("PDF", _save) -Image.register_save_all("PDF", _save_all) - -Image.register_extension("PDF", ".pdf") - -Image.register_mime("PDF", "application/pdf") diff --git a/.venv/lib/python3.10/site-packages/PIL/PdfParser.py b/.venv/lib/python3.10/site-packages/PIL/PdfParser.py deleted file mode 100644 index 73d8c21..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PdfParser.py +++ /dev/null @@ -1,1074 +0,0 @@ -from __future__ import annotations - -import calendar -import codecs -import collections -import mmap -import os -import re -import time -import zlib -from typing import IO, Any, NamedTuple, Union - - -# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set -# on page 656 -def encode_text(s: str) -> bytes: - return codecs.BOM_UTF16_BE + s.encode("utf_16_be") - - -PDFDocEncoding = { - 0x16: "\u0017", - 0x18: "\u02d8", - 0x19: "\u02c7", - 0x1A: "\u02c6", - 0x1B: "\u02d9", - 0x1C: "\u02dd", - 0x1D: "\u02db", - 0x1E: "\u02da", - 0x1F: "\u02dc", - 0x80: "\u2022", - 0x81: "\u2020", - 0x82: "\u2021", - 0x83: "\u2026", - 0x84: "\u2014", - 0x85: "\u2013", - 0x86: "\u0192", - 0x87: "\u2044", - 0x88: "\u2039", - 0x89: "\u203a", - 0x8A: "\u2212", - 0x8B: "\u2030", - 0x8C: "\u201e", - 0x8D: "\u201c", - 0x8E: "\u201d", - 0x8F: "\u2018", - 0x90: "\u2019", - 0x91: "\u201a", - 0x92: "\u2122", - 0x93: "\ufb01", - 0x94: "\ufb02", - 0x95: "\u0141", - 0x96: "\u0152", - 0x97: "\u0160", - 0x98: "\u0178", - 0x99: "\u017d", - 0x9A: "\u0131", - 0x9B: "\u0142", - 0x9C: "\u0153", - 0x9D: "\u0161", - 0x9E: "\u017e", - 0xA0: "\u20ac", -} - - -def decode_text(b: bytes) -> str: - if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: - return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be") - else: - return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) - - -class PdfFormatError(RuntimeError): - """An error that probably indicates a syntactic or semantic error in the - PDF file structure""" - - pass - - -def check_format_condition(condition: bool, error_message: str) -> None: - if not condition: - raise PdfFormatError(error_message) - - -class IndirectReferenceTuple(NamedTuple): - object_id: int - generation: int - - -class IndirectReference(IndirectReferenceTuple): - def __str__(self) -> str: - return f"{self.object_id} {self.generation} R" - - def __bytes__(self) -> bytes: - return self.__str__().encode("us-ascii") - - def __eq__(self, other: object) -> bool: - if self.__class__ is not other.__class__: - return False - assert isinstance(other, IndirectReference) - return other.object_id == self.object_id and other.generation == self.generation - - def __ne__(self, other: object) -> bool: - return not (self == other) - - def __hash__(self) -> int: - return hash((self.object_id, self.generation)) - - -class IndirectObjectDef(IndirectReference): - def __str__(self) -> str: - return f"{self.object_id} {self.generation} obj" - - -class XrefTable: - def __init__(self) -> None: - self.existing_entries: dict[int, tuple[int, int]] = ( - {} - ) # object ID => (offset, generation) - self.new_entries: dict[int, tuple[int, int]] = ( - {} - ) # object ID => (offset, generation) - self.deleted_entries = {0: 65536} # object ID => generation - self.reading_finished = False - - def __setitem__(self, key: int, value: tuple[int, int]) -> None: - if self.reading_finished: - self.new_entries[key] = value - else: - self.existing_entries[key] = value - if key in self.deleted_entries: - del self.deleted_entries[key] - - def __getitem__(self, key: int) -> tuple[int, int]: - try: - return self.new_entries[key] - except KeyError: - return self.existing_entries[key] - - def __delitem__(self, key: int) -> None: - if key in self.new_entries: - generation = self.new_entries[key][1] + 1 - del self.new_entries[key] - self.deleted_entries[key] = generation - elif key in self.existing_entries: - generation = self.existing_entries[key][1] + 1 - self.deleted_entries[key] = generation - elif key in self.deleted_entries: - generation = self.deleted_entries[key] - else: - msg = f"object ID {key} cannot be deleted because it doesn't exist" - raise IndexError(msg) - - def __contains__(self, key: int) -> bool: - return key in self.existing_entries or key in self.new_entries - - def __len__(self) -> int: - return len( - set(self.existing_entries.keys()) - | set(self.new_entries.keys()) - | set(self.deleted_entries.keys()) - ) - - def keys(self) -> set[int]: - return ( - set(self.existing_entries.keys()) - set(self.deleted_entries.keys()) - ) | set(self.new_entries.keys()) - - def write(self, f: IO[bytes]) -> int: - keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) - deleted_keys = sorted(set(self.deleted_entries.keys())) - startxref = f.tell() - f.write(b"xref\n") - while keys: - # find a contiguous sequence of object IDs - prev: int | None = None - for index, key in enumerate(keys): - if prev is None or prev + 1 == key: - prev = key - else: - contiguous_keys = keys[:index] - keys = keys[index:] - break - else: - contiguous_keys = keys - keys = [] - f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) - for object_id in contiguous_keys: - if object_id in self.new_entries: - f.write(b"%010d %05d n \n" % self.new_entries[object_id]) - else: - this_deleted_object_id = deleted_keys.pop(0) - check_format_condition( - object_id == this_deleted_object_id, - f"expected the next deleted object ID to be {object_id}, " - f"instead found {this_deleted_object_id}", - ) - try: - next_in_linked_list = deleted_keys[0] - except IndexError: - next_in_linked_list = 0 - f.write( - b"%010d %05d f \n" - % (next_in_linked_list, self.deleted_entries[object_id]) - ) - return startxref - - -class PdfName: - name: bytes - - def __init__(self, name: PdfName | bytes | str) -> None: - if isinstance(name, PdfName): - self.name = name.name - elif isinstance(name, bytes): - self.name = name - else: - self.name = name.encode("us-ascii") - - def name_as_str(self) -> str: - return self.name.decode("us-ascii") - - def __eq__(self, other: object) -> bool: - return ( - isinstance(other, PdfName) and other.name == self.name - ) or other == self.name - - def __hash__(self) -> int: - return hash(self.name) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({repr(self.name)})" - - @classmethod - def from_pdf_stream(cls, data: bytes) -> PdfName: - return cls(PdfParser.interpret_name(data)) - - allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"} - - def __bytes__(self) -> bytes: - result = bytearray(b"/") - for b in self.name: - if b in self.allowed_chars: - result.append(b) - else: - result.extend(b"#%02X" % b) - return bytes(result) - - -class PdfArray(list[Any]): - def __bytes__(self) -> bytes: - return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" - - -TYPE_CHECKING = False -if TYPE_CHECKING: - _DictBase = collections.UserDict[Union[str, bytes], Any] -else: - _DictBase = collections.UserDict - - -class PdfDict(_DictBase): - def __setattr__(self, key: str, value: Any) -> None: - if key == "data": - collections.UserDict.__setattr__(self, key, value) - else: - self[key.encode("us-ascii")] = value - - def __getattr__(self, key: str) -> str | time.struct_time: - try: - value = self[key.encode("us-ascii")] - except KeyError as e: - raise AttributeError(key) from e - if isinstance(value, bytes): - value = decode_text(value) - if key.endswith("Date"): - if value.startswith("D:"): - value = value[2:] - - relationship = "Z" - if len(value) > 17: - relationship = value[14] - offset = int(value[15:17]) * 60 - if len(value) > 20: - offset += int(value[18:20]) - - format = "%Y%m%d%H%M%S"[: len(value) - 2] - value = time.strptime(value[: len(format) + 2], format) - if relationship in ["+", "-"]: - offset *= 60 - if relationship == "+": - offset *= -1 - value = time.gmtime(calendar.timegm(value) + offset) - return value - - def __bytes__(self) -> bytes: - out = bytearray(b"<<") - for key, value in self.items(): - if value is None: - continue - value = pdf_repr(value) - out.extend(b"\n") - out.extend(bytes(PdfName(key))) - out.extend(b" ") - out.extend(value) - out.extend(b"\n>>") - return bytes(out) - - -class PdfBinary: - def __init__(self, data: list[int] | bytes) -> None: - self.data = data - - def __bytes__(self) -> bytes: - return b"<%s>" % b"".join(b"%02X" % b for b in self.data) - - -class PdfStream: - def __init__(self, dictionary: PdfDict, buf: bytes) -> None: - self.dictionary = dictionary - self.buf = buf - - def decode(self) -> bytes: - try: - filter = self.dictionary[b"Filter"] - except KeyError: - return self.buf - if filter == b"FlateDecode": - try: - expected_length = self.dictionary[b"DL"] - except KeyError: - expected_length = self.dictionary[b"Length"] - return zlib.decompress(self.buf, bufsize=int(expected_length)) - else: - msg = f"stream filter {repr(filter)} unknown/unsupported" - raise NotImplementedError(msg) - - -def pdf_repr(x: Any) -> bytes: - if x is True: - return b"true" - elif x is False: - return b"false" - elif x is None: - return b"null" - elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)): - return bytes(x) - elif isinstance(x, (int, float)): - return str(x).encode("us-ascii") - elif isinstance(x, time.struct_time): - return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" - elif isinstance(x, dict): - return bytes(PdfDict(x)) - elif isinstance(x, list): - return bytes(PdfArray(x)) - elif isinstance(x, str): - return pdf_repr(encode_text(x)) - elif isinstance(x, bytes): - # XXX escape more chars? handle binary garbage - x = x.replace(b"\\", b"\\\\") - x = x.replace(b"(", b"\\(") - x = x.replace(b")", b"\\)") - return b"(" + x + b")" - else: - return bytes(x) - - -class PdfParser: - """Based on - https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf - Supports PDF up to 1.4 - """ - - def __init__( - self, - filename: str | None = None, - f: IO[bytes] | None = None, - buf: bytes | bytearray | None = None, - start_offset: int = 0, - mode: str = "rb", - ) -> None: - if buf and f: - msg = "specify buf or f or filename, but not both buf and f" - raise RuntimeError(msg) - self.filename = filename - self.buf: bytes | bytearray | mmap.mmap | None = buf - self.f = f - self.start_offset = start_offset - self.should_close_buf = False - self.should_close_file = False - if filename is not None and f is None: - self.f = f = open(filename, mode) - self.should_close_file = True - if f is not None: - self.buf = self.get_buf_from_file(f) - self.should_close_buf = True - if not filename and hasattr(f, "name"): - self.filename = f.name - self.cached_objects: dict[IndirectReference, Any] = {} - self.root_ref: IndirectReference | None - self.info_ref: IndirectReference | None - self.pages_ref: IndirectReference | None - self.last_xref_section_offset: int | None - if self.buf: - self.read_pdf_info() - else: - self.file_size_total = self.file_size_this = 0 - self.root = PdfDict() - self.root_ref = None - self.info = PdfDict() - self.info_ref = None - self.page_tree_root = PdfDict() - self.pages: list[IndirectReference] = [] - self.orig_pages: list[IndirectReference] = [] - self.pages_ref = None - self.last_xref_section_offset = None - self.trailer_dict: dict[bytes, Any] = {} - self.xref_table = XrefTable() - self.xref_table.reading_finished = True - if f: - self.seek_end() - - def __enter__(self) -> PdfParser: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def start_writing(self) -> None: - self.close_buf() - self.seek_end() - - def close_buf(self) -> None: - if isinstance(self.buf, mmap.mmap): - self.buf.close() - self.buf = None - - def close(self) -> None: - if self.should_close_buf: - self.close_buf() - if self.f is not None and self.should_close_file: - self.f.close() - self.f = None - - def seek_end(self) -> None: - assert self.f is not None - self.f.seek(0, os.SEEK_END) - - def write_header(self) -> None: - assert self.f is not None - self.f.write(b"%PDF-1.4\n") - - def write_comment(self, s: str) -> None: - assert self.f is not None - self.f.write(f"% {s}\n".encode()) - - def write_catalog(self) -> IndirectReference: - assert self.f is not None - self.del_root() - self.root_ref = self.next_object_id(self.f.tell()) - self.pages_ref = self.next_object_id(0) - self.rewrite_pages() - self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) - self.write_obj( - self.pages_ref, - Type=PdfName(b"Pages"), - Count=len(self.pages), - Kids=self.pages, - ) - return self.root_ref - - def rewrite_pages(self) -> None: - pages_tree_nodes_to_delete = [] - for i, page_ref in enumerate(self.orig_pages): - page_info = self.cached_objects[page_ref] - del self.xref_table[page_ref.object_id] - pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) - if page_ref not in self.pages: - # the page has been deleted - continue - # make dict keys into strings for passing to write_page - stringified_page_info = {} - for key, value in page_info.items(): - # key should be a PdfName - stringified_page_info[key.name_as_str()] = value - stringified_page_info["Parent"] = self.pages_ref - new_page_ref = self.write_page(None, **stringified_page_info) - for j, cur_page_ref in enumerate(self.pages): - if cur_page_ref == page_ref: - # replace the page reference with the new one - self.pages[j] = new_page_ref - # delete redundant Pages tree nodes from xref table - for pages_tree_node_ref in pages_tree_nodes_to_delete: - while pages_tree_node_ref: - pages_tree_node = self.cached_objects[pages_tree_node_ref] - if pages_tree_node_ref.object_id in self.xref_table: - del self.xref_table[pages_tree_node_ref.object_id] - pages_tree_node_ref = pages_tree_node.get(b"Parent", None) - self.orig_pages = [] - - def write_xref_and_trailer( - self, new_root_ref: IndirectReference | None = None - ) -> None: - assert self.f is not None - if new_root_ref: - self.del_root() - self.root_ref = new_root_ref - if self.info: - self.info_ref = self.write_obj(None, self.info) - start_xref = self.xref_table.write(self.f) - num_entries = len(self.xref_table) - trailer_dict: dict[str | bytes, Any] = { - b"Root": self.root_ref, - b"Size": num_entries, - } - if self.last_xref_section_offset is not None: - trailer_dict[b"Prev"] = self.last_xref_section_offset - if self.info: - trailer_dict[b"Info"] = self.info_ref - self.last_xref_section_offset = start_xref - self.f.write( - b"trailer\n" - + bytes(PdfDict(trailer_dict)) - + b"\nstartxref\n%d\n%%%%EOF" % start_xref - ) - - def write_page( - self, ref: int | IndirectReference | None, *objs: Any, **dict_obj: Any - ) -> IndirectReference: - obj_ref = self.pages[ref] if isinstance(ref, int) else ref - if "Type" not in dict_obj: - dict_obj["Type"] = PdfName(b"Page") - if "Parent" not in dict_obj: - dict_obj["Parent"] = self.pages_ref - return self.write_obj(obj_ref, *objs, **dict_obj) - - def write_obj( - self, ref: IndirectReference | None, *objs: Any, **dict_obj: Any - ) -> IndirectReference: - assert self.f is not None - f = self.f - if ref is None: - ref = self.next_object_id(f.tell()) - else: - self.xref_table[ref.object_id] = (f.tell(), ref.generation) - f.write(bytes(IndirectObjectDef(*ref))) - stream = dict_obj.pop("stream", None) - if stream is not None: - dict_obj["Length"] = len(stream) - if dict_obj: - f.write(pdf_repr(dict_obj)) - for obj in objs: - f.write(pdf_repr(obj)) - if stream is not None: - f.write(b"stream\n") - f.write(stream) - f.write(b"\nendstream\n") - f.write(b"endobj\n") - return ref - - def del_root(self) -> None: - if self.root_ref is None: - return - del self.xref_table[self.root_ref.object_id] - del self.xref_table[self.root[b"Pages"].object_id] - - @staticmethod - def get_buf_from_file(f: IO[bytes]) -> bytes | mmap.mmap: - if hasattr(f, "getbuffer"): - return f.getbuffer() - elif hasattr(f, "getvalue"): - return f.getvalue() - else: - try: - return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - except ValueError: # cannot mmap an empty file - return b"" - - def read_pdf_info(self) -> None: - assert self.buf is not None - self.file_size_total = len(self.buf) - self.file_size_this = self.file_size_total - self.start_offset - self.read_trailer() - check_format_condition( - self.trailer_dict.get(b"Root") is not None, "Root is missing" - ) - self.root_ref = self.trailer_dict[b"Root"] - assert self.root_ref is not None - self.info_ref = self.trailer_dict.get(b"Info", None) - self.root = PdfDict(self.read_indirect(self.root_ref)) - if self.info_ref is None: - self.info = PdfDict() - else: - self.info = PdfDict(self.read_indirect(self.info_ref)) - check_format_condition(b"Type" in self.root, "/Type missing in Root") - check_format_condition( - self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog" - ) - check_format_condition( - self.root.get(b"Pages") is not None, "/Pages missing in Root" - ) - check_format_condition( - isinstance(self.root[b"Pages"], IndirectReference), - "/Pages in Root is not an indirect reference", - ) - self.pages_ref = self.root[b"Pages"] - assert self.pages_ref is not None - self.page_tree_root = self.read_indirect(self.pages_ref) - self.pages = self.linearize_page_tree(self.page_tree_root) - # save the original list of page references - # in case the user modifies, adds or deletes some pages - # and we need to rewrite the pages and their list - self.orig_pages = self.pages[:] - - def next_object_id(self, offset: int | None = None) -> IndirectReference: - try: - # TODO: support reuse of deleted objects - reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) - except ValueError: - reference = IndirectReference(1, 0) - if offset is not None: - self.xref_table[reference.object_id] = (offset, 0) - return reference - - delimiter = rb"[][()<>{}/%]" - delimiter_or_ws = rb"[][()<>{}/%\000\011\012\014\015\040]" - whitespace = rb"[\000\011\012\014\015\040]" - whitespace_or_hex = rb"[\000\011\012\014\015\0400-9a-fA-F]" - whitespace_optional = whitespace + b"*" - whitespace_mandatory = whitespace + b"+" - # No "\012" aka "\n" or "\015" aka "\r": - whitespace_optional_no_nl = rb"[\000\011\014\040]*" - newline_only = rb"[\r\n]+" - newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl - re_trailer_end = re.compile( - whitespace_mandatory - + rb"trailer" - + whitespace_optional - + rb"<<(.*>>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional - + rb"$", - re.DOTALL, - ) - re_trailer_prev = re.compile( - whitespace_optional - + rb"trailer" - + whitespace_optional - + rb"<<(.*?>>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional, - re.DOTALL, - ) - - def read_trailer(self) -> None: - assert self.buf is not None - search_start_offset = len(self.buf) - 16384 - if search_start_offset < self.start_offset: - search_start_offset = self.start_offset - m = self.re_trailer_end.search(self.buf, search_start_offset) - check_format_condition(m is not None, "trailer end not found") - # make sure we found the LAST trailer - last_match = m - while m: - last_match = m - m = self.re_trailer_end.search(self.buf, m.start() + 16) - if not m: - m = last_match - assert m is not None - trailer_data = m.group(1) - self.last_xref_section_offset = int(m.group(2)) - self.trailer_dict = self.interpret_trailer(trailer_data) - self.xref_table = XrefTable() - self.read_xref_table(xref_section_offset=self.last_xref_section_offset) - if b"Prev" in self.trailer_dict: - self.read_prev_trailer(self.trailer_dict[b"Prev"]) - - def read_prev_trailer(self, xref_section_offset: int) -> None: - assert self.buf is not None - trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) - m = self.re_trailer_prev.search( - self.buf[trailer_offset : trailer_offset + 16384] - ) - check_format_condition(m is not None, "previous trailer not found") - assert m is not None - trailer_data = m.group(1) - check_format_condition( - int(m.group(2)) == xref_section_offset, - "xref section offset in previous trailer doesn't match what was expected", - ) - trailer_dict = self.interpret_trailer(trailer_data) - if b"Prev" in trailer_dict: - self.read_prev_trailer(trailer_dict[b"Prev"]) - - re_whitespace_optional = re.compile(whitespace_optional) - re_name = re.compile( - whitespace_optional - + rb"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" - + delimiter_or_ws - + rb")" - ) - re_dict_start = re.compile(whitespace_optional + rb"<<") - re_dict_end = re.compile(whitespace_optional + rb">>" + whitespace_optional) - - @classmethod - def interpret_trailer(cls, trailer_data: bytes) -> dict[bytes, Any]: - trailer = {} - offset = 0 - while True: - m = cls.re_name.match(trailer_data, offset) - if not m: - m = cls.re_dict_end.match(trailer_data, offset) - check_format_condition( - m is not None and m.end() == len(trailer_data), - "name not found in trailer, remaining data: " - + repr(trailer_data[offset:]), - ) - break - key = cls.interpret_name(m.group(1)) - assert isinstance(key, bytes) - value, value_offset = cls.get_value(trailer_data, m.end()) - trailer[key] = value - if value_offset is None: - break - offset = value_offset - check_format_condition( - b"Size" in trailer and isinstance(trailer[b"Size"], int), - "/Size not in trailer or not an integer", - ) - check_format_condition( - b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), - "/Root not in trailer or not an indirect reference", - ) - return trailer - - re_hashes_in_name = re.compile(rb"([^#]*)(#([0-9a-fA-F]{2}))?") - - @classmethod - def interpret_name(cls, raw: bytes, as_text: bool = False) -> str | bytes: - name = b"" - for m in cls.re_hashes_in_name.finditer(raw): - if m.group(3): - name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) - else: - name += m.group(1) - if as_text: - return name.decode("utf-8") - else: - return bytes(name) - - re_null = re.compile(whitespace_optional + rb"null(?=" + delimiter_or_ws + rb")") - re_true = re.compile(whitespace_optional + rb"true(?=" + delimiter_or_ws + rb")") - re_false = re.compile(whitespace_optional + rb"false(?=" + delimiter_or_ws + rb")") - re_int = re.compile( - whitespace_optional + rb"([-+]?[0-9]+)(?=" + delimiter_or_ws + rb")" - ) - re_real = re.compile( - whitespace_optional - + rb"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" - + delimiter_or_ws - + rb")" - ) - re_array_start = re.compile(whitespace_optional + rb"\[") - re_array_end = re.compile(whitespace_optional + rb"]") - re_string_hex = re.compile( - whitespace_optional + rb"<(" + whitespace_or_hex + rb"*)>" - ) - re_string_lit = re.compile(whitespace_optional + rb"\(") - re_indirect_reference = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"R(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_start = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"obj(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_end = re.compile( - whitespace_optional + rb"endobj(?=" + delimiter_or_ws + rb")" - ) - re_comment = re.compile( - rb"(" + whitespace_optional + rb"%[^\r\n]*" + newline + rb")*" - ) - re_stream_start = re.compile(whitespace_optional + rb"stream\r?\n") - re_stream_end = re.compile( - whitespace_optional + rb"endstream(?=" + delimiter_or_ws + rb")" - ) - - @classmethod - def get_value( - cls, - data: bytes | bytearray | mmap.mmap, - offset: int, - expect_indirect: IndirectReference | None = None, - max_nesting: int = -1, - ) -> tuple[Any, int | None]: - if max_nesting == 0: - return None, None - m = cls.re_comment.match(data, offset) - if m: - offset = m.end() - m = cls.re_indirect_def_start.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object definition: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object definition: generation must be non-negative", - ) - check_format_condition( - expect_indirect is None - or expect_indirect - == IndirectReference(int(m.group(1)), int(m.group(2))), - "indirect object definition different than expected", - ) - object, object_offset = cls.get_value( - data, m.end(), max_nesting=max_nesting - 1 - ) - if object_offset is None: - return object, None - m = cls.re_indirect_def_end.match(data, object_offset) - check_format_condition( - m is not None, "indirect object definition end not found" - ) - assert m is not None - return object, m.end() - check_format_condition( - not expect_indirect, "indirect object definition not found" - ) - m = cls.re_indirect_reference.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object reference: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object reference: generation must be non-negative", - ) - return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() - m = cls.re_dict_start.match(data, offset) - if m: - offset = m.end() - result: dict[Any, Any] = {} - m = cls.re_dict_end.match(data, offset) - current_offset: int | None = offset - while not m: - assert current_offset is not None - key, current_offset = cls.get_value( - data, current_offset, max_nesting=max_nesting - 1 - ) - if current_offset is None: - return result, None - value, current_offset = cls.get_value( - data, current_offset, max_nesting=max_nesting - 1 - ) - result[key] = value - if current_offset is None: - return result, None - m = cls.re_dict_end.match(data, current_offset) - current_offset = m.end() - m = cls.re_stream_start.match(data, current_offset) - if m: - stream_len = result.get(b"Length") - if stream_len is None or not isinstance(stream_len, int): - msg = f"bad or missing Length in stream dict ({stream_len})" - raise PdfFormatError(msg) - stream_data = data[m.end() : m.end() + stream_len] - m = cls.re_stream_end.match(data, m.end() + stream_len) - check_format_condition(m is not None, "stream end not found") - assert m is not None - current_offset = m.end() - return PdfStream(PdfDict(result), stream_data), current_offset - return PdfDict(result), current_offset - m = cls.re_array_start.match(data, offset) - if m: - offset = m.end() - results = [] - m = cls.re_array_end.match(data, offset) - current_offset = offset - while not m: - assert current_offset is not None - value, current_offset = cls.get_value( - data, current_offset, max_nesting=max_nesting - 1 - ) - results.append(value) - if current_offset is None: - return results, None - m = cls.re_array_end.match(data, current_offset) - return results, m.end() - m = cls.re_null.match(data, offset) - if m: - return None, m.end() - m = cls.re_true.match(data, offset) - if m: - return True, m.end() - m = cls.re_false.match(data, offset) - if m: - return False, m.end() - m = cls.re_name.match(data, offset) - if m: - return PdfName(cls.interpret_name(m.group(1))), m.end() - m = cls.re_int.match(data, offset) - if m: - return int(m.group(1)), m.end() - m = cls.re_real.match(data, offset) - if m: - # XXX Decimal instead of float??? - return float(m.group(1)), m.end() - m = cls.re_string_hex.match(data, offset) - if m: - # filter out whitespace - hex_string = bytearray( - b for b in m.group(1) if b in b"0123456789abcdefABCDEF" - ) - if len(hex_string) % 2 == 1: - # append a 0 if the length is not even - yes, at the end - hex_string.append(ord(b"0")) - return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() - m = cls.re_string_lit.match(data, offset) - if m: - return cls.get_literal_string(data, m.end()) - # return None, offset # fallback (only for debugging) - msg = f"unrecognized object: {repr(data[offset : offset + 32])}" - raise PdfFormatError(msg) - - re_lit_str_token = re.compile( - rb"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))" - ) - escaped_chars = { - b"n": b"\n", - b"r": b"\r", - b"t": b"\t", - b"b": b"\b", - b"f": b"\f", - b"(": b"(", - b")": b")", - b"\\": b"\\", - ord(b"n"): b"\n", - ord(b"r"): b"\r", - ord(b"t"): b"\t", - ord(b"b"): b"\b", - ord(b"f"): b"\f", - ord(b"("): b"(", - ord(b")"): b")", - ord(b"\\"): b"\\", - } - - @classmethod - def get_literal_string( - cls, data: bytes | bytearray | mmap.mmap, offset: int - ) -> tuple[bytes, int]: - nesting_depth = 0 - result = bytearray() - for m in cls.re_lit_str_token.finditer(data, offset): - result.extend(data[offset : m.start()]) - if m.group(1): - result.extend(cls.escaped_chars[m.group(1)[1]]) - elif m.group(2): - result.append(int(m.group(2)[1:], 8)) - elif m.group(3): - pass - elif m.group(5): - result.extend(b"\n") - elif m.group(6): - result.extend(b"(") - nesting_depth += 1 - elif m.group(7): - if nesting_depth == 0: - return bytes(result), m.end() - result.extend(b")") - nesting_depth -= 1 - offset = m.end() - msg = "unfinished literal string" - raise PdfFormatError(msg) - - re_xref_section_start = re.compile(whitespace_optional + rb"xref" + newline) - re_xref_subsection_start = re.compile( - whitespace_optional - + rb"([0-9]+)" - + whitespace_mandatory - + rb"([0-9]+)" - + whitespace_optional - + newline_only - ) - re_xref_entry = re.compile(rb"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") - - def read_xref_table(self, xref_section_offset: int) -> int: - assert self.buf is not None - subsection_found = False - m = self.re_xref_section_start.match( - self.buf, xref_section_offset + self.start_offset - ) - check_format_condition(m is not None, "xref section start not found") - assert m is not None - offset = m.end() - while True: - m = self.re_xref_subsection_start.match(self.buf, offset) - if not m: - check_format_condition( - subsection_found, "xref subsection start not found" - ) - break - subsection_found = True - offset = m.end() - first_object = int(m.group(1)) - num_objects = int(m.group(2)) - for i in range(first_object, first_object + num_objects): - m = self.re_xref_entry.match(self.buf, offset) - check_format_condition(m is not None, "xref entry not found") - assert m is not None - offset = m.end() - is_free = m.group(3) == b"f" - if not is_free: - generation = int(m.group(2)) - new_entry = (int(m.group(1)), generation) - if i not in self.xref_table: - self.xref_table[i] = new_entry - return offset - - def read_indirect(self, ref: IndirectReference, max_nesting: int = -1) -> Any: - offset, generation = self.xref_table[ref[0]] - check_format_condition( - generation == ref[1], - f"expected to find generation {ref[1]} for object ID {ref[0]} in xref " - f"table, instead found generation {generation} at offset {offset}", - ) - assert self.buf is not None - value = self.get_value( - self.buf, - offset + self.start_offset, - expect_indirect=IndirectReference(*ref), - max_nesting=max_nesting, - )[0] - self.cached_objects[ref] = value - return value - - def linearize_page_tree( - self, node: PdfDict | None = None - ) -> list[IndirectReference]: - page_node = node if node is not None else self.page_tree_root - check_format_condition( - page_node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages" - ) - pages = [] - for kid in page_node[b"Kids"]: - kid_object = self.read_indirect(kid) - if kid_object[b"Type"] == b"Page": - pages.append(kid) - else: - pages.extend(self.linearize_page_tree(node=kid_object)) - return pages diff --git a/.venv/lib/python3.10/site-packages/PIL/PixarImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/PixarImagePlugin.py deleted file mode 100644 index d2b6d0a..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PixarImagePlugin.py +++ /dev/null @@ -1,72 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PIXAR raster support for PIL -# -# history: -# 97-01-29 fl Created -# -# notes: -# This is incomplete; it is based on a few samples created with -# Photoshop 2.5 and 3.0, and a summary description provided by -# Greg Coats . Hopefully, "L" and -# "RGBA" support will be added in future versions. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i16le as i16 - -# -# helpers - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"\200\350\000\000") - - -## -# Image plugin for PIXAR raster images. - - -class PixarImageFile(ImageFile.ImageFile): - format = "PIXAR" - format_description = "PIXAR raster image" - - def _open(self) -> None: - # assuming a 4-byte magic label - assert self.fp is not None - - s = self.fp.read(4) - if not _accept(s): - msg = "not a PIXAR file" - raise SyntaxError(msg) - - # read rest of header - s = s + self.fp.read(508) - - self._size = i16(s, 418), i16(s, 416) - - # get channel/depth descriptions - mode = i16(s, 424), i16(s, 426) - - if mode == (14, 2): - self._mode = "RGB" - # FIXME: to be continued... - - # create tile descriptor (assuming "dumped") - self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 1024, self.mode)] - - -# -# -------------------------------------------------------------------- - -Image.register_open(PixarImageFile.format, PixarImageFile, _accept) - -Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/.venv/lib/python3.10/site-packages/PIL/PngImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/PngImagePlugin.py deleted file mode 100644 index f3815a1..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PngImagePlugin.py +++ /dev/null @@ -1,1548 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PNG support code -# -# See "PNG (Portable Network Graphics) Specification, version 1.0; -# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). -# -# history: -# 1996-05-06 fl Created (couldn't resist it) -# 1996-12-14 fl Upgraded, added read and verify support (0.2) -# 1996-12-15 fl Separate PNG stream parser -# 1996-12-29 fl Added write support, added getchunks -# 1996-12-30 fl Eliminated circular references in decoder (0.3) -# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) -# 2001-02-08 fl Added transparency support (from Zircon) (0.5) -# 2001-04-16 fl Don't close data source in "open" method (0.6) -# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) -# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) -# 2004-09-20 fl Added PngInfo chunk container -# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) -# 2008-08-13 fl Added tRNS support for RGB images -# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) -# 2009-03-08 fl Added zTXT support (from Lowell Alleman) -# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) -# -# Copyright (c) 1997-2009 by Secret Labs AB -# Copyright (c) 1996 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import itertools -import logging -import re -import struct -import warnings -import zlib -from collections.abc import Callable -from enum import IntEnum -from typing import IO, Any, NamedTuple, NoReturn, cast - -from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._binary import o16be as o16 -from ._binary import o32be as o32 -from ._util import DeferredError - -TYPE_CHECKING = False -if TYPE_CHECKING: - from . import _imaging - -logger = logging.getLogger(__name__) - -is_cid = re.compile(rb"\w\w\w\w").match - - -_MAGIC = b"\211PNG\r\n\032\n" - - -_MODES = { - # supported bits/color combinations, and corresponding modes/rawmodes - # Grayscale - (1, 0): ("1", "1"), - (2, 0): ("L", "L;2"), - (4, 0): ("L", "L;4"), - (8, 0): ("L", "L"), - (16, 0): ("I;16", "I;16B"), - # Truecolour - (8, 2): ("RGB", "RGB"), - (16, 2): ("RGB", "RGB;16B"), - # Indexed-colour - (1, 3): ("P", "P;1"), - (2, 3): ("P", "P;2"), - (4, 3): ("P", "P;4"), - (8, 3): ("P", "P"), - # Grayscale with alpha - (8, 4): ("LA", "LA"), - (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available - # Truecolour with alpha - (8, 6): ("RGBA", "RGBA"), - (16, 6): ("RGBA", "RGBA;16B"), -} - - -_simple_palette = re.compile(b"^\xff*\x00\xff*$") - -MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK -""" -Maximum decompressed size for a iTXt or zTXt chunk. -Eliminates decompression bombs where compressed chunks can expand 1000x. -See :ref:`Text in PNG File Format`. -""" -MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK -""" -Set the maximum total text chunk size. -See :ref:`Text in PNG File Format`. -""" - - -# APNG frame disposal modes -class Disposal(IntEnum): - OP_NONE = 0 - """ - No disposal is done on this frame before rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_BACKGROUND = 1 - """ - This frame’s modified region is cleared to fully transparent black before rendering - the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_PREVIOUS = 2 - """ - This frame’s modified region is reverted to the previous frame’s contents before - rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - - -# APNG frame blend modes -class Blend(IntEnum): - OP_SOURCE = 0 - """ - All color components of this frame, including alpha, overwrite the previous output - image contents. - See :ref:`Saving APNG sequences`. - """ - OP_OVER = 1 - """ - This frame should be alpha composited with the previous output image contents. - See :ref:`Saving APNG sequences`. - """ - - -def _safe_zlib_decompress(s: bytes) -> bytes: - dobj = zlib.decompressobj() - plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) - if dobj.unconsumed_tail: - msg = "Decompressed data too large for PngImagePlugin.MAX_TEXT_CHUNK" - raise ValueError(msg) - return plaintext - - -def _crc32(data: bytes, seed: int = 0) -> int: - return zlib.crc32(data, seed) & 0xFFFFFFFF - - -# -------------------------------------------------------------------- -# Support classes. Suitable for PNG and related formats like MNG etc. - - -class ChunkStream: - def __init__(self, fp: IO[bytes]) -> None: - self.fp: IO[bytes] | None = fp - self.queue: list[tuple[bytes, int, int]] | None = [] - - def read(self) -> tuple[bytes, int, int]: - """Fetch a new chunk. Returns header information.""" - cid = None - - assert self.fp is not None - if self.queue: - cid, pos, length = self.queue.pop() - self.fp.seek(pos) - else: - s = self.fp.read(8) - cid = s[4:] - pos = self.fp.tell() - length = i32(s) - - if not is_cid(cid): - if not ImageFile.LOAD_TRUNCATED_IMAGES: - msg = f"broken PNG file (chunk {repr(cid)})" - raise SyntaxError(msg) - - return cid, pos, length - - def __enter__(self) -> ChunkStream: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def close(self) -> None: - self.queue = self.fp = None - - def push(self, cid: bytes, pos: int, length: int) -> None: - assert self.queue is not None - self.queue.append((cid, pos, length)) - - def call(self, cid: bytes, pos: int, length: int) -> bytes: - """Call the appropriate chunk handler""" - - logger.debug("STREAM %r %s %s", cid, pos, length) - return getattr(self, f"chunk_{cid.decode('ascii')}")(pos, length) - - def crc(self, cid: bytes, data: bytes) -> None: - """Read and verify checksum""" - - # Skip CRC checks for ancillary chunks if allowed to load truncated - # images - # 5th byte of first char is 1 [specs, section 5.4] - if ImageFile.LOAD_TRUNCATED_IMAGES and (cid[0] >> 5 & 1): - self.crc_skip(cid, data) - return - - assert self.fp is not None - try: - crc1 = _crc32(data, _crc32(cid)) - crc2 = i32(self.fp.read(4)) - if crc1 != crc2: - msg = f"broken PNG file (bad header checksum in {repr(cid)})" - raise SyntaxError(msg) - except struct.error as e: - msg = f"broken PNG file (incomplete checksum in {repr(cid)})" - raise SyntaxError(msg) from e - - def crc_skip(self, cid: bytes, data: bytes) -> None: - """Read checksum""" - - assert self.fp is not None - self.fp.read(4) - - def verify(self, endchunk: bytes = b"IEND") -> list[bytes]: - # Simple approach; just calculate checksum for all remaining - # blocks. Must be called directly after open. - - cids = [] - - assert self.fp is not None - while True: - try: - cid, pos, length = self.read() - except struct.error as e: - msg = "truncated PNG file" - raise OSError(msg) from e - - if cid == endchunk: - break - self.crc(cid, ImageFile._safe_read(self.fp, length)) - cids.append(cid) - - return cids - - -class iTXt(str): - """ - Subclass of string to allow iTXt chunks to look like strings while - keeping their extra information - - """ - - lang: str | bytes | None - tkey: str | bytes | None - - @staticmethod - def __new__( - cls, text: str, lang: str | None = None, tkey: str | None = None - ) -> iTXt: - """ - :param cls: the class to use when creating the instance - :param text: value for this key - :param lang: language code - :param tkey: UTF-8 version of the key name - """ - - self = str.__new__(cls, text) - self.lang = lang - self.tkey = tkey - return self - - -class PngInfo: - """ - PNG chunk container (for use with save(pnginfo=)) - - """ - - def __init__(self) -> None: - self.chunks: list[tuple[bytes, bytes, bool]] = [] - - def add(self, cid: bytes, data: bytes, after_idat: bool = False) -> None: - """Appends an arbitrary chunk. Use with caution. - - :param cid: a byte string, 4 bytes long. - :param data: a byte string of the encoded data - :param after_idat: for use with private chunks. Whether the chunk - should be written after IDAT - - """ - - self.chunks.append((cid, data, after_idat)) - - def add_itxt( - self, - key: str | bytes, - value: str | bytes, - lang: str | bytes = "", - tkey: str | bytes = "", - zip: bool = False, - ) -> None: - """Appends an iTXt chunk. - - :param key: latin-1 encodable text key name - :param value: value for this key - :param lang: language code - :param tkey: UTF-8 version of the key name - :param zip: compression flag - - """ - - if not isinstance(key, bytes): - key = key.encode("latin-1", "strict") - if not isinstance(value, bytes): - value = value.encode("utf-8", "strict") - if not isinstance(lang, bytes): - lang = lang.encode("utf-8", "strict") - if not isinstance(tkey, bytes): - tkey = tkey.encode("utf-8", "strict") - - if zip: - self.add( - b"iTXt", - key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value), - ) - else: - self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + value) - - def add_text( - self, key: str | bytes, value: str | bytes | iTXt, zip: bool = False - ) -> None: - """Appends a text chunk. - - :param key: latin-1 encodable text key name - :param value: value for this key, text or an - :py:class:`PIL.PngImagePlugin.iTXt` instance - :param zip: compression flag - - """ - if isinstance(value, iTXt): - return self.add_itxt( - key, - value, - value.lang if value.lang is not None else b"", - value.tkey if value.tkey is not None else b"", - zip=zip, - ) - - # The tEXt chunk stores latin-1 text - if not isinstance(value, bytes): - try: - value = value.encode("latin-1", "strict") - except UnicodeError: - return self.add_itxt(key, value, zip=zip) - - if not isinstance(key, bytes): - key = key.encode("latin-1", "strict") - - if zip: - self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) - else: - self.add(b"tEXt", key + b"\0" + value) - - -# -------------------------------------------------------------------- -# PNG image stream (IHDR/IEND) - - -class _RewindState(NamedTuple): - info: dict[str | tuple[int, int], Any] - tile: list[ImageFile._Tile] - seq_num: int | None - - -class PngStream(ChunkStream): - def __init__(self, fp: IO[bytes]) -> None: - super().__init__(fp) - - # local copies of Image attributes - self.im_info: dict[str | tuple[int, int], Any] = {} - self.im_text: dict[str, str | iTXt] = {} - self.im_size = (0, 0) - self.im_mode = "" - self.im_tile: list[ImageFile._Tile] = [] - self.im_palette: tuple[str, bytes] | None = None - self.im_custom_mimetype: str | None = None - self.im_n_frames: int | None = None - self._seq_num: int | None = None - self.rewind_state = _RewindState({}, [], None) - - self.text_memory = 0 - - def check_text_memory(self, chunklen: int) -> None: - self.text_memory += chunklen - if self.text_memory > MAX_TEXT_MEMORY: - msg = ( - "Too much memory used in text chunks: " - f"{self.text_memory}>MAX_TEXT_MEMORY" - ) - raise ValueError(msg) - - def save_rewind(self) -> None: - self.rewind_state = _RewindState( - self.im_info.copy(), - self.im_tile, - self._seq_num, - ) - - def rewind(self) -> None: - self.im_info = self.rewind_state.info.copy() - self.im_tile = self.rewind_state.tile - self._seq_num = self.rewind_state.seq_num - - def chunk_iCCP(self, pos: int, length: int) -> bytes: - # ICC profile - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - i = s.find(b"\0") - logger.debug("iCCP profile name %r", s[:i]) - comp_method = s[i + 1] - logger.debug("Compression method %s", comp_method) - if comp_method != 0: - msg = f"Unknown compression method {comp_method} in iCCP chunk" - raise SyntaxError(msg) - try: - icc_profile = _safe_zlib_decompress(s[i + 2 :]) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - icc_profile = None - else: - raise - except zlib.error: - icc_profile = None # FIXME - self.im_info["icc_profile"] = icc_profile - return s - - def chunk_IHDR(self, pos: int, length: int) -> bytes: - # image header - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if length < 13: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated IHDR chunk" - raise ValueError(msg) - self.im_size = i32(s, 0), i32(s, 4) - try: - self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] - except Exception: - pass - if s[12]: - self.im_info["interlace"] = 1 - if s[11]: - msg = "unknown filter category" - raise SyntaxError(msg) - return s - - def chunk_IDAT(self, pos: int, length: int) -> NoReturn: - # image data - if "bbox" in self.im_info: - tile = [ImageFile._Tile("zip", self.im_info["bbox"], pos, self.im_rawmode)] - else: - if self.im_n_frames is not None: - self.im_info["default_image"] = True - tile = [ImageFile._Tile("zip", (0, 0) + self.im_size, pos, self.im_rawmode)] - self.im_tile = tile - self.im_idat = length - msg = "image data found" - raise EOFError(msg) - - def chunk_IEND(self, pos: int, length: int) -> NoReturn: - msg = "end of PNG image" - raise EOFError(msg) - - def chunk_PLTE(self, pos: int, length: int) -> bytes: - # palette - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if self.im_mode == "P": - self.im_palette = "RGB", s - return s - - def chunk_tRNS(self, pos: int, length: int) -> bytes: - # transparency - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if self.im_mode == "P": - if _simple_palette.match(s): - # tRNS contains only one full-transparent entry, - # other entries are full opaque - i = s.find(b"\0") - if i >= 0: - self.im_info["transparency"] = i - else: - # otherwise, we have a byte string with one alpha value - # for each palette entry - self.im_info["transparency"] = s - elif self.im_mode in ("1", "L", "I;16"): - self.im_info["transparency"] = i16(s) - elif self.im_mode == "RGB": - self.im_info["transparency"] = i16(s), i16(s, 2), i16(s, 4) - return s - - def chunk_gAMA(self, pos: int, length: int) -> bytes: - # gamma setting - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - self.im_info["gamma"] = i32(s) / 100000.0 - return s - - def chunk_cHRM(self, pos: int, length: int) -> bytes: - # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 - # WP x,y, Red x,y, Green x,y Blue x,y - - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - raw_vals = struct.unpack(f">{len(s) // 4}I", s) - self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals) - return s - - def chunk_sRGB(self, pos: int, length: int) -> bytes: - # srgb rendering intent, 1 byte - # 0 perceptual - # 1 relative colorimetric - # 2 saturation - # 3 absolute colorimetric - - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if length < 1: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated sRGB chunk" - raise ValueError(msg) - self.im_info["srgb"] = s[0] - return s - - def chunk_pHYs(self, pos: int, length: int) -> bytes: - # pixels per unit - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if length < 9: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated pHYs chunk" - raise ValueError(msg) - px, py = i32(s, 0), i32(s, 4) - unit = s[8] - if unit == 1: # meter - dpi = px * 0.0254, py * 0.0254 - self.im_info["dpi"] = dpi - elif unit == 0: - self.im_info["aspect"] = px, py - return s - - def chunk_tEXt(self, pos: int, length: int) -> bytes: - # text - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - try: - k, v = s.split(b"\0", 1) - except ValueError: - # fallback for broken tEXt tags - k = s - v = b"" - if k: - k_str = k.decode("latin-1", "strict") - v_str = v.decode("latin-1", "replace") - - self.im_info[k_str] = v if k == b"exif" else v_str - self.im_text[k_str] = v_str - self.check_text_memory(len(v_str)) - - return s - - def chunk_zTXt(self, pos: int, length: int) -> bytes: - # compressed text - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - try: - k, v = s.split(b"\0", 1) - except ValueError: - k = s - v = b"" - if v: - comp_method = v[0] - else: - comp_method = 0 - if comp_method != 0: - msg = f"Unknown compression method {comp_method} in zTXt chunk" - raise SyntaxError(msg) - try: - v = _safe_zlib_decompress(v[1:]) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - v = b"" - else: - raise - except zlib.error: - v = b"" - - if k: - k_str = k.decode("latin-1", "strict") - v_str = v.decode("latin-1", "replace") - - self.im_info[k_str] = self.im_text[k_str] = v_str - self.check_text_memory(len(v_str)) - - return s - - def chunk_iTXt(self, pos: int, length: int) -> bytes: - # international text - assert self.fp is not None - r = s = ImageFile._safe_read(self.fp, length) - try: - k, r = r.split(b"\0", 1) - except ValueError: - return s - if len(r) < 2: - return s - cf, cm, r = r[0], r[1], r[2:] - try: - lang, tk, v = r.split(b"\0", 2) - except ValueError: - return s - if cf != 0: - if cm == 0: - try: - v = _safe_zlib_decompress(v) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - else: - raise - except zlib.error: - return s - else: - return s - if k == b"XML:com.adobe.xmp": - self.im_info["xmp"] = v - try: - k_str = k.decode("latin-1", "strict") - lang_str = lang.decode("utf-8", "strict") - tk_str = tk.decode("utf-8", "strict") - v_str = v.decode("utf-8", "strict") - except UnicodeError: - return s - - self.im_info[k_str] = self.im_text[k_str] = iTXt(v_str, lang_str, tk_str) - self.check_text_memory(len(v_str)) - - return s - - def chunk_eXIf(self, pos: int, length: int) -> bytes: - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - self.im_info["exif"] = b"Exif\x00\x00" + s - return s - - # APNG chunks - def chunk_acTL(self, pos: int, length: int) -> bytes: - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if length < 8: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "APNG contains truncated acTL chunk" - raise ValueError(msg) - if self.im_n_frames is not None: - self.im_n_frames = None - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - n_frames = i32(s) - if n_frames == 0 or n_frames > 0x80000000: - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - self.im_n_frames = n_frames - self.im_info["loop"] = i32(s, 4) - self.im_custom_mimetype = "image/apng" - return s - - def chunk_fcTL(self, pos: int, length: int) -> bytes: - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if length < 26: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "APNG contains truncated fcTL chunk" - raise ValueError(msg) - seq = i32(s) - if (self._seq_num is None and seq != 0) or ( - self._seq_num is not None and self._seq_num != seq - 1 - ): - msg = "APNG contains frame sequence errors" - raise SyntaxError(msg) - self._seq_num = seq - width, height = i32(s, 4), i32(s, 8) - px, py = i32(s, 12), i32(s, 16) - im_w, im_h = self.im_size - if px + width > im_w or py + height > im_h: - msg = "APNG contains invalid frames" - raise SyntaxError(msg) - self.im_info["bbox"] = (px, py, px + width, py + height) - delay_num, delay_den = i16(s, 20), i16(s, 22) - if delay_den == 0: - delay_den = 100 - self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 - self.im_info["disposal"] = s[24] - self.im_info["blend"] = s[25] - return s - - def chunk_fdAT(self, pos: int, length: int) -> bytes: - assert self.fp is not None - if length < 4: - if ImageFile.LOAD_TRUNCATED_IMAGES: - s = ImageFile._safe_read(self.fp, length) - return s - msg = "APNG contains truncated fDAT chunk" - raise ValueError(msg) - s = ImageFile._safe_read(self.fp, 4) - seq = i32(s) - if self._seq_num != seq - 1: - msg = "APNG contains frame sequence errors" - raise SyntaxError(msg) - self._seq_num = seq - return self.chunk_IDAT(pos + 4, length - 4) - - -# -------------------------------------------------------------------- -# PNG reader - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(_MAGIC) - - -## -# Image plugin for PNG images. - - -class PngImageFile(ImageFile.ImageFile): - format = "PNG" - format_description = "Portable network graphics" - - def _open(self) -> None: - if not _accept(self.fp.read(8)): - msg = "not a PNG file" - raise SyntaxError(msg) - self._fp = self.fp - self.__frame = 0 - - # - # Parse headers up to the first IDAT or fDAT chunk - - self.private_chunks: list[tuple[bytes, bytes] | tuple[bytes, bytes, bool]] = [] - self.png: PngStream | None = PngStream(self.fp) - - while True: - # - # get next chunk - - cid, pos, length = self.png.read() - - try: - s = self.png.call(cid, pos, length) - except EOFError: - break - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s)) - - self.png.crc(cid, s) - - # - # Copy relevant attributes from the PngStream. An alternative - # would be to let the PngStream class modify these attributes - # directly, but that introduces circular references which are - # difficult to break if things go wrong in the decoder... - # (believe me, I've tried ;-) - - self._mode = self.png.im_mode - self._size = self.png.im_size - self.info = self.png.im_info - self._text: dict[str, str | iTXt] | None = None - self.tile = self.png.im_tile - self.custom_mimetype = self.png.im_custom_mimetype - self.n_frames = self.png.im_n_frames or 1 - self.default_image = self.info.get("default_image", False) - - if self.png.im_palette: - rawmode, data = self.png.im_palette - self.palette = ImagePalette.raw(rawmode, data) - - if cid == b"fdAT": - self.__prepare_idat = length - 4 - else: - self.__prepare_idat = length # used by load_prepare() - - if self.png.im_n_frames is not None: - self._close_exclusive_fp_after_loading = False - self.png.save_rewind() - self.__rewind_idat = self.__prepare_idat - self.__rewind = self._fp.tell() - if self.default_image: - # IDAT chunk contains default image and not first animation frame - self.n_frames += 1 - self._seek(0) - self.is_animated = self.n_frames > 1 - - @property - def text(self) -> dict[str, str | iTXt]: - # experimental - if self._text is None: - # iTxt, tEXt and zTXt chunks may appear at the end of the file - # So load the file to ensure that they are read - if self.is_animated: - frame = self.__frame - # for APNG, seek to the final frame before loading - self.seek(self.n_frames - 1) - self.load() - if self.is_animated: - self.seek(frame) - assert self._text is not None - return self._text - - def verify(self) -> None: - """Verify PNG file""" - - if self.fp is None: - msg = "verify must be called directly after open" - raise RuntimeError(msg) - - # back up to beginning of IDAT block - self.fp.seek(self.tile[0][2] - 8) - - assert self.png is not None - self.png.verify() - self.png.close() - - if self._exclusive_fp: - self.fp.close() - self.fp = None - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0, True) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - msg = "no more images in APNG file" - raise EOFError(msg) from e - - def _seek(self, frame: int, rewind: bool = False) -> None: - assert self.png is not None - if isinstance(self._fp, DeferredError): - raise self._fp.ex - - self.dispose: _imaging.ImagingCore | None - dispose_extent = None - if frame == 0: - if rewind: - self._fp.seek(self.__rewind) - self.png.rewind() - self.__prepare_idat = self.__rewind_idat - self._im = None - self.info = self.png.im_info - self.tile = self.png.im_tile - self.fp = self._fp - self._prev_im = None - self.dispose = None - self.default_image = self.info.get("default_image", False) - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - dispose_extent = self.info.get("bbox") - self.__frame = 0 - else: - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - - # ensure previous frame was loaded - self.load() - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - self._prev_im = self.im.copy() - - self.fp = self._fp - - # advance to the next frame - if self.__prepare_idat: - ImageFile._safe_read(self.fp, self.__prepare_idat) - self.__prepare_idat = 0 - frame_start = False - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - msg = "No more images in APNG file" - raise EOFError(msg) - if cid == b"fcTL": - if frame_start: - # there must be at least one fdAT chunk between fcTL chunks - msg = "APNG missing frame data" - raise SyntaxError(msg) - frame_start = True - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - if frame_start: - self.__prepare_idat = length - break - ImageFile._safe_read(self.fp, length) - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - ImageFile._safe_read(self.fp, length) - - self.__frame = frame - self.tile = self.png.im_tile - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - dispose_extent = self.info.get("bbox") - - if not self.tile: - msg = "image not found in APNG frame" - raise EOFError(msg) - if dispose_extent: - self.dispose_extent: tuple[float, float, float, float] = dispose_extent - - # setup frame disposal (actual disposal done when needed in the next _seek()) - if self._prev_im is None and self.dispose_op == Disposal.OP_PREVIOUS: - self.dispose_op = Disposal.OP_BACKGROUND - - self.dispose = None - if self.dispose_op == Disposal.OP_PREVIOUS: - if self._prev_im: - self.dispose = self._prev_im.copy() - self.dispose = self._crop(self.dispose, self.dispose_extent) - elif self.dispose_op == Disposal.OP_BACKGROUND: - self.dispose = Image.core.fill(self.mode, self.size) - self.dispose = self._crop(self.dispose, self.dispose_extent) - - def tell(self) -> int: - return self.__frame - - def load_prepare(self) -> None: - """internal: prepare to read PNG file""" - - if self.info.get("interlace"): - self.decoderconfig = self.decoderconfig + (1,) - - self.__idat = self.__prepare_idat # used by load_read() - ImageFile.ImageFile.load_prepare(self) - - def load_read(self, read_bytes: int) -> bytes: - """internal: read more image data""" - - assert self.png is not None - while self.__idat == 0: - # end of chunk, skip forward to next one - - self.fp.read(4) # CRC - - cid, pos, length = self.png.read() - - if cid not in [b"IDAT", b"DDAT", b"fdAT"]: - self.png.push(cid, pos, length) - return b"" - - if cid == b"fdAT": - try: - self.png.call(cid, pos, length) - except EOFError: - pass - self.__idat = length - 4 # sequence_num has already been read - else: - self.__idat = length # empty chunks are allowed - - # read more data from this chunk - if read_bytes <= 0: - read_bytes = self.__idat - else: - read_bytes = min(read_bytes, self.__idat) - - self.__idat = self.__idat - read_bytes - - return self.fp.read(read_bytes) - - def load_end(self) -> None: - """internal: finished reading image data""" - assert self.png is not None - if self.__idat != 0: - self.fp.read(self.__idat) - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - break - elif cid == b"fcTL" and self.is_animated: - # start of the next frame, stop reading - self.__prepare_idat = 0 - self.png.push(cid, pos, length) - break - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - try: - ImageFile._safe_read(self.fp, length) - except OSError as e: - if ImageFile.LOAD_TRUNCATED_IMAGES: - break - else: - raise e - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s, True)) - self._text = self.png.im_text - if not self.is_animated: - self.png.close() - self.png = None - else: - if self._prev_im and self.blend_op == Blend.OP_OVER: - updated = self._crop(self.im, self.dispose_extent) - if self.im.mode == "RGB" and "transparency" in self.info: - mask = updated.convert_transparent( - "RGBA", self.info["transparency"] - ) - else: - if self.im.mode == "P" and "transparency" in self.info: - t = self.info["transparency"] - if isinstance(t, bytes): - updated.putpalettealphas(t) - elif isinstance(t, int): - updated.putpalettealpha(t) - mask = updated.convert("RGBA") - self._prev_im.paste(updated, self.dispose_extent, mask) - self.im = self._prev_im - - def _getexif(self) -> dict[int, Any] | None: - if "exif" not in self.info: - self.load() - if "exif" not in self.info and "Raw profile type exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def getexif(self) -> Image.Exif: - if "exif" not in self.info: - self.load() - - return super().getexif() - - -# -------------------------------------------------------------------- -# PNG writer - -_OUTMODES = { - # supported PIL modes, and corresponding rawmode, bit depth and color type - "1": ("1", b"\x01", b"\x00"), - "L;1": ("L;1", b"\x01", b"\x00"), - "L;2": ("L;2", b"\x02", b"\x00"), - "L;4": ("L;4", b"\x04", b"\x00"), - "L": ("L", b"\x08", b"\x00"), - "LA": ("LA", b"\x08", b"\x04"), - "I": ("I;16B", b"\x10", b"\x00"), - "I;16": ("I;16B", b"\x10", b"\x00"), - "I;16B": ("I;16B", b"\x10", b"\x00"), - "P;1": ("P;1", b"\x01", b"\x03"), - "P;2": ("P;2", b"\x02", b"\x03"), - "P;4": ("P;4", b"\x04", b"\x03"), - "P": ("P", b"\x08", b"\x03"), - "RGB": ("RGB", b"\x08", b"\x02"), - "RGBA": ("RGBA", b"\x08", b"\x06"), -} - - -def putchunk(fp: IO[bytes], cid: bytes, *data: bytes) -> None: - """Write a PNG chunk (including CRC field)""" - - byte_data = b"".join(data) - - fp.write(o32(len(byte_data)) + cid) - fp.write(byte_data) - crc = _crc32(byte_data, _crc32(cid)) - fp.write(o32(crc)) - - -class _idat: - # wrap output from the encoder in IDAT chunks - - def __init__(self, fp: IO[bytes], chunk: Callable[..., None]) -> None: - self.fp = fp - self.chunk = chunk - - def write(self, data: bytes) -> None: - self.chunk(self.fp, b"IDAT", data) - - -class _fdat: - # wrap encoder output in fdAT chunks - - def __init__(self, fp: IO[bytes], chunk: Callable[..., None], seq_num: int) -> None: - self.fp = fp - self.chunk = chunk - self.seq_num = seq_num - - def write(self, data: bytes) -> None: - self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) - self.seq_num += 1 - - -class _Frame(NamedTuple): - im: Image.Image - bbox: tuple[int, int, int, int] | None - encoderinfo: dict[str, Any] - - -def _write_multiple_frames( - im: Image.Image, - fp: IO[bytes], - chunk: Callable[..., None], - mode: str, - rawmode: str, - default_image: Image.Image | None, - append_images: list[Image.Image], -) -> Image.Image | None: - duration = im.encoderinfo.get("duration") - loop = im.encoderinfo.get("loop", im.info.get("loop", 0)) - disposal = im.encoderinfo.get("disposal", im.info.get("disposal", Disposal.OP_NONE)) - blend = im.encoderinfo.get("blend", im.info.get("blend", Blend.OP_SOURCE)) - - if default_image: - chain = itertools.chain(append_images) - else: - chain = itertools.chain([im], append_images) - - im_frames: list[_Frame] = [] - frame_count = 0 - for im_seq in chain: - for im_frame in ImageSequence.Iterator(im_seq): - if im_frame.mode == mode: - im_frame = im_frame.copy() - else: - im_frame = im_frame.convert(mode) - encoderinfo = im.encoderinfo.copy() - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - elif duration is None and "duration" in im_frame.info: - encoderinfo["duration"] = im_frame.info["duration"] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - if isinstance(blend, (list, tuple)): - encoderinfo["blend"] = blend[frame_count] - frame_count += 1 - - if im_frames: - previous = im_frames[-1] - prev_disposal = previous.encoderinfo.get("disposal") - prev_blend = previous.encoderinfo.get("blend") - if prev_disposal == Disposal.OP_PREVIOUS and len(im_frames) < 2: - prev_disposal = Disposal.OP_BACKGROUND - - if prev_disposal == Disposal.OP_BACKGROUND: - base_im = previous.im.copy() - dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0)) - bbox = previous.bbox - if bbox: - dispose = dispose.crop(bbox) - else: - bbox = (0, 0) + im.size - base_im.paste(dispose, bbox) - elif prev_disposal == Disposal.OP_PREVIOUS: - base_im = im_frames[-2].im - else: - base_im = previous.im - delta = ImageChops.subtract_modulo( - im_frame.convert("RGBA"), base_im.convert("RGBA") - ) - bbox = delta.getbbox(alpha_only=False) - if ( - not bbox - and prev_disposal == encoderinfo.get("disposal") - and prev_blend == encoderinfo.get("blend") - and "duration" in encoderinfo - ): - previous.encoderinfo["duration"] += encoderinfo["duration"] - continue - else: - bbox = None - im_frames.append(_Frame(im_frame, bbox, encoderinfo)) - - if len(im_frames) == 1 and not default_image: - return im_frames[0].im - - # animation control - chunk( - fp, - b"acTL", - o32(len(im_frames)), # 0: num_frames - o32(loop), # 4: num_plays - ) - - # default image IDAT (if it exists) - if default_image: - if im.mode != mode: - im = im.convert(mode) - ImageFile._save( - im, - cast(IO[bytes], _idat(fp, chunk)), - [ImageFile._Tile("zip", (0, 0) + im.size, 0, rawmode)], - ) - - seq_num = 0 - for frame, frame_data in enumerate(im_frames): - im_frame = frame_data.im - if not frame_data.bbox: - bbox = (0, 0) + im_frame.size - else: - bbox = frame_data.bbox - im_frame = im_frame.crop(bbox) - size = im_frame.size - encoderinfo = frame_data.encoderinfo - frame_duration = int(round(encoderinfo.get("duration", 0))) - frame_disposal = encoderinfo.get("disposal", disposal) - frame_blend = encoderinfo.get("blend", blend) - # frame control - chunk( - fp, - b"fcTL", - o32(seq_num), # sequence_number - o32(size[0]), # width - o32(size[1]), # height - o32(bbox[0]), # x_offset - o32(bbox[1]), # y_offset - o16(frame_duration), # delay_numerator - o16(1000), # delay_denominator - o8(frame_disposal), # dispose_op - o8(frame_blend), # blend_op - ) - seq_num += 1 - # frame data - if frame == 0 and not default_image: - # first frame must be in IDAT chunks for backwards compatibility - ImageFile._save( - im_frame, - cast(IO[bytes], _idat(fp, chunk)), - [ImageFile._Tile("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - else: - fdat_chunks = _fdat(fp, chunk, seq_num) - ImageFile._save( - im_frame, - cast(IO[bytes], fdat_chunks), - [ImageFile._Tile("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - seq_num = fdat_chunks.seq_num - return None - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, save_all=True) - - -def _save( - im: Image.Image, - fp: IO[bytes], - filename: str | bytes, - chunk: Callable[..., None] = putchunk, - save_all: bool = False, -) -> None: - # save an image to disk (called by the save method) - - if save_all: - default_image = im.encoderinfo.get( - "default_image", im.info.get("default_image") - ) - modes = set() - sizes = set() - append_images = im.encoderinfo.get("append_images", []) - for im_seq in itertools.chain([im], append_images): - for im_frame in ImageSequence.Iterator(im_seq): - modes.add(im_frame.mode) - sizes.add(im_frame.size) - for mode in ("RGBA", "RGB", "P"): - if mode in modes: - break - else: - mode = modes.pop() - size = tuple(max(frame_size[i] for frame_size in sizes) for i in range(2)) - else: - size = im.size - mode = im.mode - - outmode = mode - if mode == "P": - # - # attempt to minimize storage requirements for palette images - if "bits" in im.encoderinfo: - # number of bits specified by user - colors = min(1 << im.encoderinfo["bits"], 256) - else: - # check palette contents - if im.palette: - colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 1) - else: - colors = 256 - - if colors <= 16: - if colors <= 2: - bits = 1 - elif colors <= 4: - bits = 2 - else: - bits = 4 - outmode += f";{bits}" - - # encoder options - im.encoderconfig = ( - im.encoderinfo.get("optimize", False), - im.encoderinfo.get("compress_level", -1), - im.encoderinfo.get("compress_type", -1), - im.encoderinfo.get("dictionary", b""), - ) - - # get the corresponding PNG mode - try: - rawmode, bit_depth, color_type = _OUTMODES[outmode] - except KeyError as e: - msg = f"cannot write mode {mode} as PNG" - raise OSError(msg) from e - - # - # write minimal PNG file - - fp.write(_MAGIC) - - chunk( - fp, - b"IHDR", - o32(size[0]), # 0: size - o32(size[1]), - bit_depth, - color_type, - b"\0", # 10: compression - b"\0", # 11: filter category - b"\0", # 12: interlace flag - ) - - chunks = [b"cHRM", b"cICP", b"gAMA", b"sBIT", b"sRGB", b"tIME"] - - icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - # ICC profile - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - name = b"ICC Profile" - data = name + b"\0\0" + zlib.compress(icc) - chunk(fp, b"iCCP", data) - - # You must either have sRGB or iCCP. - # Disallow sRGB chunks when an iCCP-chunk has been emitted. - chunks.remove(b"sRGB") - - info = im.encoderinfo.get("pnginfo") - if info: - chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - elif cid in chunks_multiple_allowed: - chunk(fp, cid, data) - elif cid[1:2].islower(): - # Private chunk - after_idat = len(info_chunk) == 3 and info_chunk[2] - if not after_idat: - chunk(fp, cid, data) - - if im.mode == "P": - palette_byte_number = colors * 3 - palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] - while len(palette_bytes) < palette_byte_number: - palette_bytes += b"\0" - chunk(fp, b"PLTE", palette_bytes) - - transparency = im.encoderinfo.get("transparency", im.info.get("transparency", None)) - - if transparency or transparency == 0: - if im.mode == "P": - # limit to actual palette size - alpha_bytes = colors - if isinstance(transparency, bytes): - chunk(fp, b"tRNS", transparency[:alpha_bytes]) - else: - transparency = max(0, min(255, transparency)) - alpha = b"\xff" * transparency + b"\0" - chunk(fp, b"tRNS", alpha[:alpha_bytes]) - elif im.mode in ("1", "L", "I", "I;16"): - transparency = max(0, min(65535, transparency)) - chunk(fp, b"tRNS", o16(transparency)) - elif im.mode == "RGB": - red, green, blue = transparency - chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) - else: - if "transparency" in im.encoderinfo: - # don't bother with transparency if it's an RGBA - # and it's in the info dict. It's probably just stale. - msg = "cannot use transparency for this mode" - raise OSError(msg) - else: - if im.mode == "P" and im.im.getpalettemode() == "RGBA": - alpha = im.im.getpalette("RGBA", "A") - alpha_bytes = colors - chunk(fp, b"tRNS", alpha[:alpha_bytes]) - - dpi = im.encoderinfo.get("dpi") - if dpi: - chunk( - fp, - b"pHYs", - o32(int(dpi[0] / 0.0254 + 0.5)), - o32(int(dpi[1] / 0.0254 + 0.5)), - b"\x01", - ) - - if info: - chunks = [b"bKGD", b"hIST"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - - exif = im.encoderinfo.get("exif") - if exif: - if isinstance(exif, Image.Exif): - exif = exif.tobytes(8) - if exif.startswith(b"Exif\x00\x00"): - exif = exif[6:] - chunk(fp, b"eXIf", exif) - - single_im: Image.Image | None = im - if save_all: - single_im = _write_multiple_frames( - im, fp, chunk, mode, rawmode, default_image, append_images - ) - if single_im: - ImageFile._save( - single_im, - cast(IO[bytes], _idat(fp, chunk)), - [ImageFile._Tile("zip", (0, 0) + single_im.size, 0, rawmode)], - ) - - if info: - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid[1:2].islower(): - # Private chunk - after_idat = len(info_chunk) == 3 and info_chunk[2] - if after_idat: - chunk(fp, cid, data) - - chunk(fp, b"IEND", b"") - - if hasattr(fp, "flush"): - fp.flush() - - -# -------------------------------------------------------------------- -# PNG chunk converter - - -def getchunks(im: Image.Image, **params: Any) -> list[tuple[bytes, bytes, bytes]]: - """Return a list of PNG chunks representing this image.""" - from io import BytesIO - - chunks = [] - - def append(fp: IO[bytes], cid: bytes, *data: bytes) -> None: - byte_data = b"".join(data) - crc = o32(_crc32(byte_data, _crc32(cid))) - chunks.append((cid, byte_data, crc)) - - fp = BytesIO() - - try: - im.encoderinfo = params - _save(im, fp, "", append) - finally: - del im.encoderinfo - - return chunks - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(PngImageFile.format, PngImageFile, _accept) -Image.register_save(PngImageFile.format, _save) -Image.register_save_all(PngImageFile.format, _save_all) - -Image.register_extensions(PngImageFile.format, [".png", ".apng"]) - -Image.register_mime(PngImageFile.format, "image/png") diff --git a/.venv/lib/python3.10/site-packages/PIL/PpmImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/PpmImagePlugin.py deleted file mode 100644 index 03afa2d..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PpmImagePlugin.py +++ /dev/null @@ -1,375 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PPM support for PIL -# -# History: -# 96-03-24 fl Created -# 98-03-06 fl Write RGBA images (as RGB, that is) -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import math -from typing import IO - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d" - -MODES = { - # standard - b"P1": "1", - b"P2": "L", - b"P3": "RGB", - b"P4": "1", - b"P5": "L", - b"P6": "RGB", - # extensions - b"P0CMYK": "CMYK", - b"Pf": "F", - # PIL extensions (for test purposes only) - b"PyP": "P", - b"PyRGBA": "RGBA", - b"PyCMYK": "CMYK", -} - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"P") and prefix[1] in b"0123456fy" - - -## -# Image plugin for PBM, PGM, and PPM images. - - -class PpmImageFile(ImageFile.ImageFile): - format = "PPM" - format_description = "Pbmplus image" - - def _read_magic(self) -> bytes: - assert self.fp is not None - - magic = b"" - # read until whitespace or longest available magic number - for _ in range(6): - c = self.fp.read(1) - if not c or c in b_whitespace: - break - magic += c - return magic - - def _read_token(self) -> bytes: - assert self.fp is not None - - token = b"" - while len(token) <= 10: # read until next whitespace or limit of 10 characters - c = self.fp.read(1) - if not c: - break - elif c in b_whitespace: # token ended - if not token: - # skip whitespace at start - continue - break - elif c == b"#": - # ignores rest of the line; stops at CR, LF or EOF - while self.fp.read(1) not in b"\r\n": - pass - continue - token += c - if not token: - # Token was not even 1 byte - msg = "Reached EOF while reading header" - raise ValueError(msg) - elif len(token) > 10: - msg = f"Token too long in file header: {token.decode()}" - raise ValueError(msg) - return token - - def _open(self) -> None: - assert self.fp is not None - - magic_number = self._read_magic() - try: - mode = MODES[magic_number] - except KeyError: - msg = "not a PPM file" - raise SyntaxError(msg) - self._mode = mode - - if magic_number in (b"P1", b"P4"): - self.custom_mimetype = "image/x-portable-bitmap" - elif magic_number in (b"P2", b"P5"): - self.custom_mimetype = "image/x-portable-graymap" - elif magic_number in (b"P3", b"P6"): - self.custom_mimetype = "image/x-portable-pixmap" - - self._size = int(self._read_token()), int(self._read_token()) - - decoder_name = "raw" - if magic_number in (b"P1", b"P2", b"P3"): - decoder_name = "ppm_plain" - - args: str | tuple[str | int, ...] - if mode == "1": - args = "1;I" - elif mode == "F": - scale = float(self._read_token()) - if scale == 0.0 or not math.isfinite(scale): - msg = "scale must be finite and non-zero" - raise ValueError(msg) - self.info["scale"] = abs(scale) - - rawmode = "F;32F" if scale < 0 else "F;32BF" - args = (rawmode, 0, -1) - else: - maxval = int(self._read_token()) - if not 0 < maxval < 65536: - msg = "maxval must be greater than 0 and less than 65536" - raise ValueError(msg) - if maxval > 255 and mode == "L": - self._mode = "I" - - rawmode = mode - if decoder_name != "ppm_plain": - # If maxval matches a bit depth, use the raw decoder directly - if maxval == 65535 and mode == "L": - rawmode = "I;16B" - elif maxval != 255: - decoder_name = "ppm" - - args = rawmode if decoder_name == "raw" else (rawmode, maxval) - self.tile = [ - ImageFile._Tile(decoder_name, (0, 0) + self.size, self.fp.tell(), args) - ] - - -# -# -------------------------------------------------------------------- - - -class PpmPlainDecoder(ImageFile.PyDecoder): - _pulls_fd = True - _comment_spans: bool - - def _read_block(self) -> bytes: - assert self.fd is not None - - return self.fd.read(ImageFile.SAFEBLOCK) - - def _find_comment_end(self, block: bytes, start: int = 0) -> int: - a = block.find(b"\n", start) - b = block.find(b"\r", start) - return min(a, b) if a * b > 0 else max(a, b) # lowest nonnegative index (or -1) - - def _ignore_comments(self, block: bytes) -> bytes: - if self._comment_spans: - # Finish current comment - while block: - comment_end = self._find_comment_end(block) - if comment_end != -1: - # Comment ends in this block - # Delete tail of comment - block = block[comment_end + 1 :] - break - else: - # Comment spans whole block - # So read the next block, looking for the end - block = self._read_block() - - # Search for any further comments - self._comment_spans = False - while True: - comment_start = block.find(b"#") - if comment_start == -1: - # No comment found - break - comment_end = self._find_comment_end(block, comment_start) - if comment_end != -1: - # Comment ends in this block - # Delete comment - block = block[:comment_start] + block[comment_end + 1 :] - else: - # Comment continues to next block(s) - block = block[:comment_start] - self._comment_spans = True - break - return block - - def _decode_bitonal(self) -> bytearray: - """ - This is a separate method because in the plain PBM format, all data tokens are - exactly one byte, so the inter-token whitespace is optional. - """ - data = bytearray() - total_bytes = self.state.xsize * self.state.ysize - - while len(data) != total_bytes: - block = self._read_block() # read next block - if not block: - # eof - break - - block = self._ignore_comments(block) - - tokens = b"".join(block.split()) - for token in tokens: - if token not in (48, 49): - msg = b"Invalid token for this mode: %s" % bytes([token]) - raise ValueError(msg) - data = (data + tokens)[:total_bytes] - invert = bytes.maketrans(b"01", b"\xff\x00") - return data.translate(invert) - - def _decode_blocks(self, maxval: int) -> bytearray: - data = bytearray() - max_len = 10 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - total_bytes = self.state.xsize * self.state.ysize * bands * out_byte_count - - half_token = b"" - while len(data) != total_bytes: - block = self._read_block() # read next block - if not block: - if half_token: - block = bytearray(b" ") # flush half_token - else: - # eof - break - - block = self._ignore_comments(block) - - if half_token: - block = half_token + block # stitch half_token to new block - half_token = b"" - - tokens = block.split() - - if block and not block[-1:].isspace(): # block might split token - half_token = tokens.pop() # save half token for later - if len(half_token) > max_len: # prevent buildup of half_token - msg = ( - b"Token too long found in data: %s" % half_token[: max_len + 1] - ) - raise ValueError(msg) - - for token in tokens: - if len(token) > max_len: - msg = b"Token too long found in data: %s" % token[: max_len + 1] - raise ValueError(msg) - value = int(token) - if value < 0: - msg_str = f"Channel value is negative: {value}" - raise ValueError(msg_str) - if value > maxval: - msg_str = f"Channel value too large for this mode: {value}" - raise ValueError(msg_str) - value = round(value / maxval * out_max) - data += o32(value) if self.mode == "I" else o8(value) - if len(data) == total_bytes: # finished! - break - return data - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - self._comment_spans = False - if self.mode == "1": - data = self._decode_bitonal() - rawmode = "1;8" - else: - maxval = self.args[-1] - data = self._decode_blocks(maxval) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), rawmode) - return -1, 0 - - -class PpmDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - - data = bytearray() - maxval = self.args[-1] - in_byte_count = 1 if maxval < 256 else 2 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - dest_length = self.state.xsize * self.state.ysize * bands * out_byte_count - while len(data) < dest_length: - pixels = self.fd.read(in_byte_count * bands) - if len(pixels) < in_byte_count * bands: - # eof - break - for b in range(bands): - value = ( - pixels[b] if in_byte_count == 1 else i16(pixels, b * in_byte_count) - ) - value = min(out_max, round(value / maxval * out_max)) - data += o32(value) if self.mode == "I" else o8(value) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), rawmode) - return -1, 0 - - -# -# -------------------------------------------------------------------- - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode == "1": - rawmode, head = "1;I", b"P4" - elif im.mode == "L": - rawmode, head = "L", b"P5" - elif im.mode in ("I", "I;16"): - rawmode, head = "I;16B", b"P5" - elif im.mode in ("RGB", "RGBA"): - rawmode, head = "RGB", b"P6" - elif im.mode == "F": - rawmode, head = "F;32F", b"Pf" - else: - msg = f"cannot write mode {im.mode} as PPM" - raise OSError(msg) - fp.write(head + b"\n%d %d\n" % im.size) - if head == b"P6": - fp.write(b"255\n") - elif head == b"P5": - if rawmode == "L": - fp.write(b"255\n") - else: - fp.write(b"65535\n") - elif head == b"Pf": - fp.write(b"-1.0\n") - row_order = -1 if im.mode == "F" else 1 - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, row_order))] - ) - - -# -# -------------------------------------------------------------------- - - -Image.register_open(PpmImageFile.format, PpmImageFile, _accept) -Image.register_save(PpmImageFile.format, _save) - -Image.register_decoder("ppm", PpmDecoder) -Image.register_decoder("ppm_plain", PpmPlainDecoder) - -Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm", ".pfm"]) - -Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/.venv/lib/python3.10/site-packages/PIL/PsdImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/PsdImagePlugin.py deleted file mode 100644 index f49aaee..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/PsdImagePlugin.py +++ /dev/null @@ -1,333 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# Adobe PSD 2.5/3.0 file handling -# -# History: -# 1995-09-01 fl Created -# 1997-01-03 fl Read most PSD images -# 1997-01-18 fl Fixed P and CMYK support -# 2001-10-21 fl Added seek/tell support (for layers) -# -# Copyright (c) 1997-2001 by Secret Labs AB. -# Copyright (c) 1995-2001 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -from functools import cached_property -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i8 -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import si16be as si16 -from ._binary import si32be as si32 -from ._util import DeferredError - -MODES = { - # (photoshop mode, bits) -> (pil mode, required channels) - (0, 1): ("1", 1), - (0, 8): ("L", 1), - (1, 8): ("L", 1), - (2, 8): ("P", 1), - (3, 8): ("RGB", 3), - (4, 8): ("CMYK", 4), - (7, 8): ("L", 1), # FIXME: multilayer - (8, 8): ("L", 1), # duotone - (9, 8): ("LAB", 3), -} - - -# --------------------------------------------------------------------. -# read PSD images - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"8BPS") - - -## -# Image plugin for Photoshop images. - - -class PsdImageFile(ImageFile.ImageFile): - format = "PSD" - format_description = "Adobe Photoshop" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - read = self.fp.read - - # - # header - - s = read(26) - if not _accept(s) or i16(s, 4) != 1: - msg = "not a PSD file" - raise SyntaxError(msg) - - psd_bits = i16(s, 22) - psd_channels = i16(s, 12) - psd_mode = i16(s, 24) - - mode, channels = MODES[(psd_mode, psd_bits)] - - if channels > psd_channels: - msg = "not enough channels" - raise OSError(msg) - if mode == "RGB" and psd_channels == 4: - mode = "RGBA" - channels = 4 - - self._mode = mode - self._size = i32(s, 18), i32(s, 14) - - # - # color mode data - - size = i32(read(4)) - if size: - data = read(size) - if mode == "P" and size == 768: - self.palette = ImagePalette.raw("RGB;L", data) - - # - # image resources - - self.resources = [] - - size = i32(read(4)) - if size: - # load resources - end = self.fp.tell() + size - while self.fp.tell() < end: - read(4) # signature - id = i16(read(2)) - name = read(i8(read(1))) - if not (len(name) & 1): - read(1) # padding - data = read(i32(read(4))) - if len(data) & 1: - read(1) # padding - self.resources.append((id, name, data)) - if id == 1039: # ICC profile - self.info["icc_profile"] = data - - # - # layer and mask information - - self._layers_position = None - - size = i32(read(4)) - if size: - end = self.fp.tell() + size - size = i32(read(4)) - if size: - self._layers_position = self.fp.tell() - self._layers_size = size - self.fp.seek(end) - self._n_frames: int | None = None - - # - # image descriptor - - self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) - - # keep the file open - self._fp = self.fp - self.frame = 1 - self._min_frame = 1 - - @cached_property - def layers( - self, - ) -> list[tuple[str, str, tuple[int, int, int, int], list[ImageFile._Tile]]]: - layers = [] - if self._layers_position is not None: - if isinstance(self._fp, DeferredError): - raise self._fp.ex - self._fp.seek(self._layers_position) - _layer_data = io.BytesIO(ImageFile._safe_read(self._fp, self._layers_size)) - layers = _layerinfo(_layer_data, self._layers_size) - self._n_frames = len(layers) - return layers - - @property - def n_frames(self) -> int: - if self._n_frames is None: - self._n_frames = len(self.layers) - return self._n_frames - - @property - def is_animated(self) -> bool: - return len(self.layers) > 1 - - def seek(self, layer: int) -> None: - if not self._seek_check(layer): - return - if isinstance(self._fp, DeferredError): - raise self._fp.ex - - # seek to given layer (1..max) - _, mode, _, tile = self.layers[layer - 1] - self._mode = mode - self.tile = tile - self.frame = layer - self.fp = self._fp - - def tell(self) -> int: - # return layer number (0=image, 1..max=layers) - return self.frame - - -def _layerinfo( - fp: IO[bytes], ct_bytes: int -) -> list[tuple[str, str, tuple[int, int, int, int], list[ImageFile._Tile]]]: - # read layerinfo block - layers = [] - - def read(size: int) -> bytes: - return ImageFile._safe_read(fp, size) - - ct = si16(read(2)) - - # sanity check - if ct_bytes < (abs(ct) * 20): - msg = "Layer block too short for number of layers requested" - raise SyntaxError(msg) - - for _ in range(abs(ct)): - # bounding box - y0 = si32(read(4)) - x0 = si32(read(4)) - y1 = si32(read(4)) - x1 = si32(read(4)) - - # image info - bands = [] - ct_types = i16(read(2)) - if ct_types > 4: - fp.seek(ct_types * 6 + 12, io.SEEK_CUR) - size = i32(read(4)) - fp.seek(size, io.SEEK_CUR) - continue - - for _ in range(ct_types): - type = i16(read(2)) - - if type == 65535: - b = "A" - else: - b = "RGBA"[type] - - bands.append(b) - read(4) # size - - # figure out the image mode - bands.sort() - if bands == ["R"]: - mode = "L" - elif bands == ["B", "G", "R"]: - mode = "RGB" - elif bands == ["A", "B", "G", "R"]: - mode = "RGBA" - else: - mode = "" # unknown - - # skip over blend flags and extra information - read(12) # filler - name = "" - size = i32(read(4)) # length of the extra data field - if size: - data_end = fp.tell() + size - - length = i32(read(4)) - if length: - fp.seek(length - 16, io.SEEK_CUR) - - length = i32(read(4)) - if length: - fp.seek(length, io.SEEK_CUR) - - length = i8(read(1)) - if length: - # Don't know the proper encoding, - # Latin-1 should be a good guess - name = read(length).decode("latin-1", "replace") - - fp.seek(data_end) - layers.append((name, mode, (x0, y0, x1, y1))) - - # get tiles - layerinfo = [] - for i, (name, mode, bbox) in enumerate(layers): - tile = [] - for m in mode: - t = _maketile(fp, m, bbox, 1) - if t: - tile.extend(t) - layerinfo.append((name, mode, bbox, tile)) - - return layerinfo - - -def _maketile( - file: IO[bytes], mode: str, bbox: tuple[int, int, int, int], channels: int -) -> list[ImageFile._Tile]: - tiles = [] - read = file.read - - compression = i16(read(2)) - - xsize = bbox[2] - bbox[0] - ysize = bbox[3] - bbox[1] - - offset = file.tell() - - if compression == 0: - # - # raw compression - for channel in range(channels): - layer = mode[channel] - if mode == "CMYK": - layer += ";I" - tiles.append(ImageFile._Tile("raw", bbox, offset, layer)) - offset = offset + xsize * ysize - - elif compression == 1: - # - # packbits compression - i = 0 - bytecount = read(channels * ysize * 2) - offset = file.tell() - for channel in range(channels): - layer = mode[channel] - if mode == "CMYK": - layer += ";I" - tiles.append(ImageFile._Tile("packbits", bbox, offset, layer)) - for y in range(ysize): - offset = offset + i16(bytecount, i) - i += 2 - - file.seek(offset) - - if offset & 1: - read(1) # padding - - return tiles - - -# -------------------------------------------------------------------- -# registry - - -Image.register_open(PsdImageFile.format, PsdImageFile, _accept) - -Image.register_extension(PsdImageFile.format, ".psd") - -Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop") diff --git a/.venv/lib/python3.10/site-packages/PIL/QoiImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/QoiImagePlugin.py deleted file mode 100644 index df55224..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/QoiImagePlugin.py +++ /dev/null @@ -1,115 +0,0 @@ -# -# The Python Imaging Library. -# -# QOI support for PIL -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os - -from . import Image, ImageFile -from ._binary import i32be as i32 - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"qoif") - - -class QoiImageFile(ImageFile.ImageFile): - format = "QOI" - format_description = "Quite OK Image" - - def _open(self) -> None: - if not _accept(self.fp.read(4)): - msg = "not a QOI file" - raise SyntaxError(msg) - - self._size = i32(self.fp.read(4)), i32(self.fp.read(4)) - - channels = self.fp.read(1)[0] - self._mode = "RGB" if channels == 3 else "RGBA" - - self.fp.seek(1, os.SEEK_CUR) # colorspace - self.tile = [ImageFile._Tile("qoi", (0, 0) + self._size, self.fp.tell())] - - -class QoiDecoder(ImageFile.PyDecoder): - _pulls_fd = True - _previous_pixel: bytes | bytearray | None = None - _previously_seen_pixels: dict[int, bytes | bytearray] = {} - - def _add_to_previous_pixels(self, value: bytes | bytearray) -> None: - self._previous_pixel = value - - r, g, b, a = value - hash_value = (r * 3 + g * 5 + b * 7 + a * 11) % 64 - self._previously_seen_pixels[hash_value] = value - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - - self._previously_seen_pixels = {} - self._add_to_previous_pixels(bytearray((0, 0, 0, 255))) - - data = bytearray() - bands = Image.getmodebands(self.mode) - dest_length = self.state.xsize * self.state.ysize * bands - while len(data) < dest_length: - byte = self.fd.read(1)[0] - value: bytes | bytearray - if byte == 0b11111110 and self._previous_pixel: # QOI_OP_RGB - value = bytearray(self.fd.read(3)) + self._previous_pixel[3:] - elif byte == 0b11111111: # QOI_OP_RGBA - value = self.fd.read(4) - else: - op = byte >> 6 - if op == 0: # QOI_OP_INDEX - op_index = byte & 0b00111111 - value = self._previously_seen_pixels.get( - op_index, bytearray((0, 0, 0, 0)) - ) - elif op == 1 and self._previous_pixel: # QOI_OP_DIFF - value = bytearray( - ( - (self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2) - % 256, - (self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2) - % 256, - (self._previous_pixel[2] + (byte & 0b00000011) - 2) % 256, - self._previous_pixel[3], - ) - ) - elif op == 2 and self._previous_pixel: # QOI_OP_LUMA - second_byte = self.fd.read(1)[0] - diff_green = (byte & 0b00111111) - 32 - diff_red = ((second_byte & 0b11110000) >> 4) - 8 - diff_blue = (second_byte & 0b00001111) - 8 - - value = bytearray( - tuple( - (self._previous_pixel[i] + diff_green + diff) % 256 - for i, diff in enumerate((diff_red, 0, diff_blue)) - ) - ) - value += self._previous_pixel[3:] - elif op == 3 and self._previous_pixel: # QOI_OP_RUN - run_length = (byte & 0b00111111) + 1 - value = self._previous_pixel - if bands == 3: - value = value[:3] - data += value * run_length - continue - self._add_to_previous_pixels(value) - - if bands == 3: - value = value[:3] - data += value - self.set_as_raw(data) - return -1, 0 - - -Image.register_open(QoiImageFile.format, QoiImageFile, _accept) -Image.register_decoder("qoi", QoiDecoder) -Image.register_extension(QoiImageFile.format, ".qoi") diff --git a/.venv/lib/python3.10/site-packages/PIL/SgiImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/SgiImagePlugin.py deleted file mode 100644 index 44254b7..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/SgiImagePlugin.py +++ /dev/null @@ -1,247 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# SGI image file handling -# -# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. -# -# -# -# History: -# 2017-22-07 mb Add RLE decompression -# 2016-16-10 mb Add save method without compression -# 1995-09-10 fl Created -# -# Copyright (c) 2016 by Mickael Bonfill. -# Copyright (c) 2008 by Karsten Hiddemann. -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1995 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -import struct -from typing import IO - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 2 and i16(prefix) == 474 - - -MODES = { - (1, 1, 1): "L", - (1, 2, 1): "L", - (2, 1, 1): "L;16B", - (2, 2, 1): "L;16B", - (1, 3, 3): "RGB", - (2, 3, 3): "RGB;16B", - (1, 3, 4): "RGBA", - (2, 3, 4): "RGBA;16B", -} - - -## -# Image plugin for SGI images. -class SgiImageFile(ImageFile.ImageFile): - format = "SGI" - format_description = "SGI Image File Format" - - def _open(self) -> None: - # HEAD - assert self.fp is not None - - headlen = 512 - s = self.fp.read(headlen) - - if not _accept(s): - msg = "Not an SGI image file" - raise ValueError(msg) - - # compression : verbatim or RLE - compression = s[2] - - # bpc : 1 or 2 bytes (8bits or 16bits) - bpc = s[3] - - # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) - dimension = i16(s, 4) - - # xsize : width - xsize = i16(s, 6) - - # ysize : height - ysize = i16(s, 8) - - # zsize : channels count - zsize = i16(s, 10) - - # layout - layout = bpc, dimension, zsize - - # determine mode from bits/zsize - rawmode = "" - try: - rawmode = MODES[layout] - except KeyError: - pass - - if rawmode == "": - msg = "Unsupported SGI image mode" - raise ValueError(msg) - - self._size = xsize, ysize - self._mode = rawmode.split(";")[0] - if self.mode == "RGB": - self.custom_mimetype = "image/rgb" - - # orientation -1 : scanlines begins at the bottom-left corner - orientation = -1 - - # decoder info - if compression == 0: - pagesize = xsize * ysize * bpc - if bpc == 2: - self.tile = [ - ImageFile._Tile( - "SGI16", - (0, 0) + self.size, - headlen, - (self.mode, 0, orientation), - ) - ] - else: - self.tile = [] - offset = headlen - for layer in self.mode: - self.tile.append( - ImageFile._Tile( - "raw", (0, 0) + self.size, offset, (layer, 0, orientation) - ) - ) - offset += pagesize - elif compression == 1: - self.tile = [ - ImageFile._Tile( - "sgi_rle", (0, 0) + self.size, headlen, (rawmode, orientation, bpc) - ) - ] - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode not in {"RGB", "RGBA", "L"}: - msg = "Unsupported SGI image mode" - raise ValueError(msg) - - # Get the keyword arguments - info = im.encoderinfo - - # Byte-per-pixel precision, 1 = 8bits per pixel - bpc = info.get("bpc", 1) - - if bpc not in (1, 2): - msg = "Unsupported number of bytes per pixel" - raise ValueError(msg) - - # Flip the image, since the origin of SGI file is the bottom-left corner - orientation = -1 - # Define the file as SGI File Format - magic_number = 474 - # Run-Length Encoding Compression - Unsupported at this time - rle = 0 - - # Number of dimensions (x,y,z) - dim = 3 - # X Dimension = width / Y Dimension = height - x, y = im.size - if im.mode == "L" and y == 1: - dim = 1 - elif im.mode == "L": - dim = 2 - # Z Dimension: Number of channels - z = len(im.mode) - - if dim in {1, 2}: - z = 1 - - # assert we've got the right number of bands. - if len(im.getbands()) != z: - msg = f"incorrect number of bands in SGI write: {z} vs {len(im.getbands())}" - raise ValueError(msg) - - # Minimum Byte value - pinmin = 0 - # Maximum Byte value (255 = 8bits per pixel) - pinmax = 255 - # Image name (79 characters max, truncated below in write) - img_name = os.path.splitext(os.path.basename(filename))[0] - if isinstance(img_name, str): - img_name = img_name.encode("ascii", "ignore") - # Standard representation of pixel in the file - colormap = 0 - fp.write(struct.pack(">h", magic_number)) - fp.write(o8(rle)) - fp.write(o8(bpc)) - fp.write(struct.pack(">H", dim)) - fp.write(struct.pack(">H", x)) - fp.write(struct.pack(">H", y)) - fp.write(struct.pack(">H", z)) - fp.write(struct.pack(">l", pinmin)) - fp.write(struct.pack(">l", pinmax)) - fp.write(struct.pack("4s", b"")) # dummy - fp.write(struct.pack("79s", img_name)) # truncates to 79 chars - fp.write(struct.pack("s", b"")) # force null byte after img_name - fp.write(struct.pack(">l", colormap)) - fp.write(struct.pack("404s", b"")) # dummy - - rawmode = "L" - if bpc == 2: - rawmode = "L;16B" - - for channel in im.split(): - fp.write(channel.tobytes("raw", rawmode, 0, orientation)) - - if hasattr(fp, "flush"): - fp.flush() - - -class SGI16Decoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - assert self.im is not None - - rawmode, stride, orientation = self.args - pagesize = self.state.xsize * self.state.ysize - zsize = len(self.mode) - self.fd.seek(512) - - for band in range(zsize): - channel = Image.new("L", (self.state.xsize, self.state.ysize)) - channel.frombytes( - self.fd.read(2 * pagesize), "raw", "L;16B", stride, orientation - ) - self.im.putband(channel.im, band) - - return -1, 0 - - -# -# registry - - -Image.register_decoder("SGI16", SGI16Decoder) -Image.register_open(SgiImageFile.format, SgiImageFile, _accept) -Image.register_save(SgiImageFile.format, _save) -Image.register_mime(SgiImageFile.format, "image/sgi") - -Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) - -# End of file diff --git a/.venv/lib/python3.10/site-packages/PIL/SpiderImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/SpiderImagePlugin.py deleted file mode 100644 index 868019e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/SpiderImagePlugin.py +++ /dev/null @@ -1,331 +0,0 @@ -# -# The Python Imaging Library. -# -# SPIDER image file handling -# -# History: -# 2004-08-02 Created BB -# 2006-03-02 added save method -# 2006-03-13 added support for stack images -# -# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. -# Copyright (c) 2004 by William Baxter. -# Copyright (c) 2004 by Secret Labs AB. -# Copyright (c) 2004 by Fredrik Lundh. -# - -## -# Image plugin for the Spider image format. This format is used -# by the SPIDER software, in processing image data from electron -# microscopy and tomography. -## - -# -# SpiderImagePlugin.py -# -# The Spider image format is used by SPIDER software, in processing -# image data from electron microscopy and tomography. -# -# Spider home page: -# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html -# -# Details about the Spider image format: -# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html -# -from __future__ import annotations - -import os -import struct -import sys -from typing import IO, Any, cast - -from . import Image, ImageFile -from ._util import DeferredError - -TYPE_CHECKING = False - - -def isInt(f: Any) -> int: - try: - i = int(f) - if f - i == 0: - return 1 - else: - return 0 - except (ValueError, OverflowError): - return 0 - - -iforms = [1, 3, -11, -12, -21, -22] - - -# There is no magic number to identify Spider files, so just check a -# series of header locations to see if they have reasonable values. -# Returns no. of bytes in the header, if it is a valid Spider header, -# otherwise returns 0 - - -def isSpiderHeader(t: tuple[float, ...]) -> int: - h = (99,) + t # add 1 value so can use spider header index start=1 - # header values 1,2,5,12,13,22,23 should be integers - for i in [1, 2, 5, 12, 13, 22, 23]: - if not isInt(h[i]): - return 0 - # check iform - iform = int(h[5]) - if iform not in iforms: - return 0 - # check other header values - labrec = int(h[13]) # no. records in file header - labbyt = int(h[22]) # total no. of bytes in header - lenbyt = int(h[23]) # record length in bytes - if labbyt != (labrec * lenbyt): - return 0 - # looks like a valid header - return labbyt - - -def isSpiderImage(filename: str) -> int: - with open(filename, "rb") as fp: - f = fp.read(92) # read 23 * 4 bytes - t = struct.unpack(">23f", f) # try big-endian first - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - t = struct.unpack("<23f", f) # little-endian - hdrlen = isSpiderHeader(t) - return hdrlen - - -class SpiderImageFile(ImageFile.ImageFile): - format = "SPIDER" - format_description = "Spider 2D image" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - # check header - n = 27 * 4 # read 27 float values - f = self.fp.read(n) - - try: - self.bigendian = 1 - t = struct.unpack(">27f", f) # try big-endian first - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - self.bigendian = 0 - t = struct.unpack("<27f", f) # little-endian - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - msg = "not a valid Spider file" - raise SyntaxError(msg) - except struct.error as e: - msg = "not a valid Spider file" - raise SyntaxError(msg) from e - - h = (99,) + t # add 1 value : spider header index starts at 1 - iform = int(h[5]) - if iform != 1: - msg = "not a Spider 2D image" - raise SyntaxError(msg) - - self._size = int(h[12]), int(h[2]) # size in pixels (width, height) - self.istack = int(h[24]) - self.imgnumber = int(h[27]) - - if self.istack == 0 and self.imgnumber == 0: - # stk=0, img=0: a regular 2D image - offset = hdrlen - self._nimages = 1 - elif self.istack > 0 and self.imgnumber == 0: - # stk>0, img=0: Opening the stack for the first time - self.imgbytes = int(h[12]) * int(h[2]) * 4 - self.hdrlen = hdrlen - self._nimages = int(h[26]) - # Point to the first image in the stack - offset = hdrlen * 2 - self.imgnumber = 1 - elif self.istack == 0 and self.imgnumber > 0: - # stk=0, img>0: an image within the stack - offset = hdrlen + self.stkoffset - self.istack = 2 # So Image knows it's still a stack - else: - msg = "inconsistent stack header values" - raise SyntaxError(msg) - - if self.bigendian: - self.rawmode = "F;32BF" - else: - self.rawmode = "F;32F" - self._mode = "F" - - self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, offset, self.rawmode)] - self._fp = self.fp # FIXME: hack - - @property - def n_frames(self) -> int: - return self._nimages - - @property - def is_animated(self) -> bool: - return self._nimages > 1 - - # 1st image index is zero (although SPIDER imgnumber starts at 1) - def tell(self) -> int: - if self.imgnumber < 1: - return 0 - else: - return self.imgnumber - 1 - - def seek(self, frame: int) -> None: - if self.istack == 0: - msg = "attempt to seek in a non-stack file" - raise EOFError(msg) - if not self._seek_check(frame): - return - if isinstance(self._fp, DeferredError): - raise self._fp.ex - self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) - self.fp = self._fp - self.fp.seek(self.stkoffset) - self._open() - - # returns a byte image after rescaling to 0..255 - def convert2byte(self, depth: int = 255) -> Image.Image: - extrema = self.getextrema() - assert isinstance(extrema[0], float) - minimum, maximum = cast(tuple[float, float], extrema) - m: float = 1 - if maximum != minimum: - m = depth / (maximum - minimum) - b = -m * minimum - return self.point(lambda i: i * m + b).convert("L") - - if TYPE_CHECKING: - from . import ImageTk - - # returns a ImageTk.PhotoImage object, after rescaling to 0..255 - def tkPhotoImage(self) -> ImageTk.PhotoImage: - from . import ImageTk - - return ImageTk.PhotoImage(self.convert2byte(), palette=256) - - -# -------------------------------------------------------------------- -# Image series - - -# given a list of filenames, return a list of images -def loadImageSeries(filelist: list[str] | None = None) -> list[Image.Image] | None: - """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage""" - if filelist is None or len(filelist) < 1: - return None - - byte_imgs = [] - for img in filelist: - if not os.path.exists(img): - print(f"unable to find {img}") - continue - try: - with Image.open(img) as im: - assert isinstance(im, SpiderImageFile) - byte_im = im.convert2byte() - except Exception: - if not isSpiderImage(img): - print(f"{img} is not a Spider image file") - continue - byte_im.info["filename"] = img - byte_imgs.append(byte_im) - return byte_imgs - - -# -------------------------------------------------------------------- -# For saving images in Spider format - - -def makeSpiderHeader(im: Image.Image) -> list[bytes]: - nsam, nrow = im.size - lenbyt = nsam * 4 # There are labrec records in the header - labrec = int(1024 / lenbyt) - if 1024 % lenbyt != 0: - labrec += 1 - labbyt = labrec * lenbyt - nvalues = int(labbyt / 4) - if nvalues < 23: - return [] - - hdr = [0.0] * nvalues - - # NB these are Fortran indices - hdr[1] = 1.0 # nslice (=1 for an image) - hdr[2] = float(nrow) # number of rows per slice - hdr[3] = float(nrow) # number of records in the image - hdr[5] = 1.0 # iform for 2D image - hdr[12] = float(nsam) # number of pixels per line - hdr[13] = float(labrec) # number of records in file header - hdr[22] = float(labbyt) # total number of bytes in header - hdr[23] = float(lenbyt) # record length in bytes - - # adjust for Fortran indexing - hdr = hdr[1:] - hdr.append(0.0) - # pack binary data into a string - return [struct.pack("f", v) for v in hdr] - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode != "F": - im = im.convert("F") - - hdr = makeSpiderHeader(im) - if len(hdr) < 256: - msg = "Error creating Spider header" - raise OSError(msg) - - # write the SPIDER header - fp.writelines(hdr) - - rawmode = "F;32NF" # 32-bit native floating point - ImageFile._save(im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, rawmode)]) - - -def _save_spider(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # get the filename extension and register it with Image - filename_ext = os.path.splitext(filename)[1] - ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext - Image.register_extension(SpiderImageFile.format, ext) - _save(im, fp, filename) - - -# -------------------------------------------------------------------- - - -Image.register_open(SpiderImageFile.format, SpiderImageFile) -Image.register_save(SpiderImageFile.format, _save_spider) - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 SpiderImagePlugin.py [infile] [outfile]") - sys.exit() - - filename = sys.argv[1] - if not isSpiderImage(filename): - print("input image must be in Spider format") - sys.exit() - - with Image.open(filename) as im: - print(f"image: {im}") - print(f"format: {im.format}") - print(f"size: {im.size}") - print(f"mode: {im.mode}") - print("max, min: ", end=" ") - print(im.getextrema()) - - if len(sys.argv) > 2: - outfile = sys.argv[2] - - # perform some image operation - im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - print( - f"saving a flipped version of {os.path.basename(filename)} " - f"as {outfile} " - ) - im.save(outfile, SpiderImageFile.format) diff --git a/.venv/lib/python3.10/site-packages/PIL/SunImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/SunImagePlugin.py deleted file mode 100644 index 8912379..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/SunImagePlugin.py +++ /dev/null @@ -1,145 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Sun image file handling -# -# History: -# 1995-09-10 fl Created -# 1996-05-28 fl Fixed 32-bit alignment -# 1998-12-29 fl Import ImagePalette module -# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1995-1996 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile, ImagePalette -from ._binary import i32be as i32 - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 4 and i32(prefix) == 0x59A66A95 - - -## -# Image plugin for Sun raster files. - - -class SunImageFile(ImageFile.ImageFile): - format = "SUN" - format_description = "Sun Raster File" - - def _open(self) -> None: - # The Sun Raster file header is 32 bytes in length - # and has the following format: - - # typedef struct _SunRaster - # { - # DWORD MagicNumber; /* Magic (identification) number */ - # DWORD Width; /* Width of image in pixels */ - # DWORD Height; /* Height of image in pixels */ - # DWORD Depth; /* Number of bits per pixel */ - # DWORD Length; /* Size of image data in bytes */ - # DWORD Type; /* Type of raster file */ - # DWORD ColorMapType; /* Type of color map */ - # DWORD ColorMapLength; /* Size of the color map in bytes */ - # } SUNRASTER; - - assert self.fp is not None - - # HEAD - s = self.fp.read(32) - if not _accept(s): - msg = "not an SUN raster file" - raise SyntaxError(msg) - - offset = 32 - - self._size = i32(s, 4), i32(s, 8) - - depth = i32(s, 12) - # data_length = i32(s, 16) # unreliable, ignore. - file_type = i32(s, 20) - palette_type = i32(s, 24) # 0: None, 1: RGB, 2: Raw/arbitrary - palette_length = i32(s, 28) - - if depth == 1: - self._mode, rawmode = "1", "1;I" - elif depth == 4: - self._mode, rawmode = "L", "L;4" - elif depth == 8: - self._mode = rawmode = "L" - elif depth == 24: - if file_type == 3: - self._mode, rawmode = "RGB", "RGB" - else: - self._mode, rawmode = "RGB", "BGR" - elif depth == 32: - if file_type == 3: - self._mode, rawmode = "RGB", "RGBX" - else: - self._mode, rawmode = "RGB", "BGRX" - else: - msg = "Unsupported Mode/Bit Depth" - raise SyntaxError(msg) - - if palette_length: - if palette_length > 1024: - msg = "Unsupported Color Palette Length" - raise SyntaxError(msg) - - if palette_type != 1: - msg = "Unsupported Palette Type" - raise SyntaxError(msg) - - offset = offset + palette_length - self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) - if self.mode == "L": - self._mode = "P" - rawmode = rawmode.replace("L", "P") - - # 16 bit boundaries on stride - stride = ((self.size[0] * depth + 15) // 16) * 2 - - # file type: Type is the version (or flavor) of the bitmap - # file. The following values are typically found in the Type - # field: - # 0000h Old - # 0001h Standard - # 0002h Byte-encoded - # 0003h RGB format - # 0004h TIFF format - # 0005h IFF format - # FFFFh Experimental - - # Old and standard are the same, except for the length tag. - # byte-encoded is run-length-encoded - # RGB looks similar to standard, but RGB byte order - # TIFF and IFF mean that they were converted from T/IFF - # Experimental means that it's something else. - # (https://www.fileformat.info/format/sunraster/egff.htm) - - if file_type in (0, 1, 3, 4, 5): - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride)) - ] - elif file_type == 2: - self.tile = [ - ImageFile._Tile("sun_rle", (0, 0) + self.size, offset, rawmode) - ] - else: - msg = "Unsupported Sun Raster file type" - raise SyntaxError(msg) - - -# -# registry - - -Image.register_open(SunImageFile.format, SunImageFile, _accept) - -Image.register_extension(SunImageFile.format, ".ras") diff --git a/.venv/lib/python3.10/site-packages/PIL/TarIO.py b/.venv/lib/python3.10/site-packages/PIL/TarIO.py deleted file mode 100644 index 86490a4..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/TarIO.py +++ /dev/null @@ -1,61 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# read files from within a tar file -# -# History: -# 95-06-18 fl Created -# 96-05-28 fl Open files in binary mode -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-96. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io - -from . import ContainerIO - - -class TarIO(ContainerIO.ContainerIO[bytes]): - """A file object that provides read access to a given member of a TAR file.""" - - def __init__(self, tarfile: str, file: str) -> None: - """ - Create file object. - - :param tarfile: Name of TAR file. - :param file: Name of member file. - """ - self.fh = open(tarfile, "rb") - - while True: - s = self.fh.read(512) - if len(s) != 512: - self.fh.close() - - msg = "unexpected end of tar file" - raise OSError(msg) - - name = s[:100].decode("utf-8") - i = name.find("\0") - if i == 0: - self.fh.close() - - msg = "cannot find subfile" - raise OSError(msg) - if i > 0: - name = name[:i] - - size = int(s[124:135], 8) - - if file == name: - break - - self.fh.seek((size + 511) & (~511), io.SEEK_CUR) - - # Open region - super().__init__(self.fh, self.fh.tell(), size) diff --git a/.venv/lib/python3.10/site-packages/PIL/TgaImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/TgaImagePlugin.py deleted file mode 100644 index 90d5b5c..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/TgaImagePlugin.py +++ /dev/null @@ -1,264 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TGA file handling -# -# History: -# 95-09-01 fl created (reads 24-bit files only) -# 97-01-04 fl support more TGA versions, including compressed images -# 98-07-04 fl fixed orientation and alpha layer bugs -# 98-09-11 fl fixed orientation for runlength decoder -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import warnings -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -# -# -------------------------------------------------------------------- -# Read RGA file - - -MODES = { - # map imagetype/depth to rawmode - (1, 8): "P", - (3, 1): "1", - (3, 8): "L", - (3, 16): "LA", - (2, 16): "BGRA;15Z", - (2, 24): "BGR", - (2, 32): "BGRA", -} - - -## -# Image plugin for Targa files. - - -class TgaImageFile(ImageFile.ImageFile): - format = "TGA" - format_description = "Targa" - - def _open(self) -> None: - # process header - assert self.fp is not None - - s = self.fp.read(18) - - id_len = s[0] - - colormaptype = s[1] - imagetype = s[2] - - depth = s[16] - - flags = s[17] - - self._size = i16(s, 12), i16(s, 14) - - # validate header fields - if ( - colormaptype not in (0, 1) - or self.size[0] <= 0 - or self.size[1] <= 0 - or depth not in (1, 8, 16, 24, 32) - ): - msg = "not a TGA file" - raise SyntaxError(msg) - - # image mode - if imagetype in (3, 11): - self._mode = "L" - if depth == 1: - self._mode = "1" # ??? - elif depth == 16: - self._mode = "LA" - elif imagetype in (1, 9): - self._mode = "P" if colormaptype else "L" - elif imagetype in (2, 10): - self._mode = "RGB" if depth == 24 else "RGBA" - else: - msg = "unknown TGA mode" - raise SyntaxError(msg) - - # orientation - orientation = flags & 0x30 - self._flip_horizontally = orientation in [0x10, 0x30] - if orientation in [0x20, 0x30]: - orientation = 1 - elif orientation in [0, 0x10]: - orientation = -1 - else: - msg = "unknown TGA orientation" - raise SyntaxError(msg) - - self.info["orientation"] = orientation - - if imagetype & 8: - self.info["compression"] = "tga_rle" - - if id_len: - self.info["id_section"] = self.fp.read(id_len) - - if colormaptype: - # read palette - start, size, mapdepth = i16(s, 3), i16(s, 5), s[7] - if mapdepth == 16: - self.palette = ImagePalette.raw( - "BGRA;15Z", bytes(2 * start) + self.fp.read(2 * size) - ) - self.palette.mode = "RGBA" - elif mapdepth == 24: - self.palette = ImagePalette.raw( - "BGR", bytes(3 * start) + self.fp.read(3 * size) - ) - elif mapdepth == 32: - self.palette = ImagePalette.raw( - "BGRA", bytes(4 * start) + self.fp.read(4 * size) - ) - else: - msg = "unknown TGA map depth" - raise SyntaxError(msg) - - # setup tile descriptor - try: - rawmode = MODES[(imagetype & 7, depth)] - if imagetype & 8: - # compressed - self.tile = [ - ImageFile._Tile( - "tga_rle", - (0, 0) + self.size, - self.fp.tell(), - (rawmode, orientation, depth), - ) - ] - else: - self.tile = [ - ImageFile._Tile( - "raw", - (0, 0) + self.size, - self.fp.tell(), - (rawmode, 0, orientation), - ) - ] - except KeyError: - pass # cannot decode - - def load_end(self) -> None: - if self._flip_horizontally: - self.im = self.im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -# -# -------------------------------------------------------------------- -# Write TGA file - - -SAVE = { - "1": ("1", 1, 0, 3), - "L": ("L", 8, 0, 3), - "LA": ("LA", 16, 0, 3), - "P": ("P", 8, 1, 1), - "RGB": ("BGR", 24, 0, 2), - "RGBA": ("BGRA", 32, 0, 2), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - rawmode, bits, colormaptype, imagetype = SAVE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as TGA" - raise OSError(msg) from e - - if "rle" in im.encoderinfo: - rle = im.encoderinfo["rle"] - else: - compression = im.encoderinfo.get("compression", im.info.get("compression")) - rle = compression == "tga_rle" - if rle: - imagetype += 8 - - id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) - id_len = len(id_section) - if id_len > 255: - id_len = 255 - id_section = id_section[:255] - warnings.warn("id_section has been trimmed to 255 characters") - - if colormaptype: - palette = im.im.getpalette("RGB", "BGR") - colormaplength, colormapentry = len(palette) // 3, 24 - else: - colormaplength, colormapentry = 0, 0 - - if im.mode in ("LA", "RGBA"): - flags = 8 - else: - flags = 0 - - orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1)) - if orientation > 0: - flags = flags | 0x20 - - fp.write( - o8(id_len) - + o8(colormaptype) - + o8(imagetype) - + o16(0) # colormapfirst - + o16(colormaplength) - + o8(colormapentry) - + o16(0) - + o16(0) - + o16(im.size[0]) - + o16(im.size[1]) - + o8(bits) - + o8(flags) - ) - - if id_section: - fp.write(id_section) - - if colormaptype: - fp.write(palette) - - if rle: - ImageFile._save( - im, - fp, - [ImageFile._Tile("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))], - ) - else: - ImageFile._save( - im, - fp, - [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))], - ) - - # write targa version 2 footer - fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(TgaImageFile.format, TgaImageFile) -Image.register_save(TgaImageFile.format, _save) - -Image.register_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"]) - -Image.register_mime(TgaImageFile.format, "image/x-tga") diff --git a/.venv/lib/python3.10/site-packages/PIL/TiffImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/TiffImagePlugin.py deleted file mode 100644 index 88af916..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/TiffImagePlugin.py +++ /dev/null @@ -1,2338 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TIFF file handling -# -# TIFF is a flexible, if somewhat aged, image file format originally -# defined by Aldus. Although TIFF supports a wide variety of pixel -# layouts and compression methods, the name doesn't really stand for -# "thousands of incompatible file formats," it just feels that way. -# -# To read TIFF data from a stream, the stream must be seekable. For -# progressive decoding, make sure to use TIFF files where the tag -# directory is placed first in the file. -# -# History: -# 1995-09-01 fl Created -# 1996-05-04 fl Handle JPEGTABLES tag -# 1996-05-18 fl Fixed COLORMAP support -# 1997-01-05 fl Fixed PREDICTOR support -# 1997-08-27 fl Added support for rational tags (from Perry Stoll) -# 1998-01-10 fl Fixed seek/tell (from Jan Blom) -# 1998-07-15 fl Use private names for internal variables -# 1999-06-13 fl Rewritten for PIL 1.0 (1.0) -# 2000-10-11 fl Additional fixes for Python 2.0 (1.1) -# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) -# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) -# 2001-12-18 fl Added workaround for broken Matrox library -# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) -# 2003-05-19 fl Check FILLORDER tag -# 2003-09-26 fl Added RGBa support -# 2004-02-24 fl Added DPI support; fixed rational write support -# 2005-02-07 fl Added workaround for broken Corel Draw 10 files -# 2006-01-09 fl Added support for float/double tags (from Russell Nelson) -# -# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import itertools -import logging -import math -import os -import struct -import warnings -from collections.abc import Iterator, MutableMapping -from fractions import Fraction -from numbers import Number, Rational -from typing import IO, Any, Callable, NoReturn, cast - -from . import ExifTags, Image, ImageFile, ImageOps, ImagePalette, TiffTags -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._deprecate import deprecate -from ._typing import StrOrBytesPath -from ._util import DeferredError, is_path -from .TiffTags import TYPES - -TYPE_CHECKING = False -if TYPE_CHECKING: - from ._typing import Buffer, IntegralLike - -logger = logging.getLogger(__name__) - -# Set these to true to force use of libtiff for reading or writing. -READ_LIBTIFF = False -WRITE_LIBTIFF = False -STRIP_SIZE = 65536 - -II = b"II" # little-endian (Intel style) -MM = b"MM" # big-endian (Motorola style) - -# -# -------------------------------------------------------------------- -# Read TIFF files - -# a few tag names, just to make the code below a bit more readable -OSUBFILETYPE = 255 -IMAGEWIDTH = 256 -IMAGELENGTH = 257 -BITSPERSAMPLE = 258 -COMPRESSION = 259 -PHOTOMETRIC_INTERPRETATION = 262 -FILLORDER = 266 -IMAGEDESCRIPTION = 270 -STRIPOFFSETS = 273 -SAMPLESPERPIXEL = 277 -ROWSPERSTRIP = 278 -STRIPBYTECOUNTS = 279 -X_RESOLUTION = 282 -Y_RESOLUTION = 283 -PLANAR_CONFIGURATION = 284 -RESOLUTION_UNIT = 296 -TRANSFERFUNCTION = 301 -SOFTWARE = 305 -DATE_TIME = 306 -ARTIST = 315 -PREDICTOR = 317 -COLORMAP = 320 -TILEWIDTH = 322 -TILELENGTH = 323 -TILEOFFSETS = 324 -TILEBYTECOUNTS = 325 -SUBIFD = 330 -EXTRASAMPLES = 338 -SAMPLEFORMAT = 339 -JPEGTABLES = 347 -YCBCRSUBSAMPLING = 530 -REFERENCEBLACKWHITE = 532 -COPYRIGHT = 33432 -IPTC_NAA_CHUNK = 33723 # newsphoto properties -PHOTOSHOP_CHUNK = 34377 # photoshop properties -ICCPROFILE = 34675 -EXIFIFD = 34665 -XMP = 700 -JPEGQUALITY = 65537 # pseudo-tag by libtiff - -# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java -IMAGEJ_META_DATA_BYTE_COUNTS = 50838 -IMAGEJ_META_DATA = 50839 - -COMPRESSION_INFO = { - # Compression => pil compression name - 1: "raw", - 2: "tiff_ccitt", - 3: "group3", - 4: "group4", - 5: "tiff_lzw", - 6: "tiff_jpeg", # obsolete - 7: "jpeg", - 8: "tiff_adobe_deflate", - 32771: "tiff_raw_16", # 16-bit padding - 32773: "packbits", - 32809: "tiff_thunderscan", - 32946: "tiff_deflate", - 34676: "tiff_sgilog", - 34677: "tiff_sgilog24", - 34925: "lzma", - 50000: "zstd", - 50001: "webp", -} - -COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()} - -OPEN_INFO = { - # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, - # ExtraSamples) => mode, rawmode - (II, 0, (1,), 1, (1,), ()): ("1", "1;I"), - (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"), - (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"), - (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"), - (II, 1, (1,), 1, (1,), ()): ("1", "1"), - (MM, 1, (1,), 1, (1,), ()): ("1", "1"), - (II, 1, (1,), 2, (1,), ()): ("1", "1;R"), - (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"), - (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"), - (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"), - (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), - (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), - (II, 1, (1,), 1, (2,), ()): ("L", "L;2"), - (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"), - (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"), - (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"), - (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"), - (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"), - (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), - (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), - (II, 1, (1,), 1, (4,), ()): ("L", "L;4"), - (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"), - (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"), - (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"), - (II, 0, (1,), 1, (8,), ()): ("L", "L;I"), - (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"), - (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"), - (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"), - (II, 1, (1,), 1, (8,), ()): ("L", "L"), - (MM, 1, (1,), 1, (8,), ()): ("L", "L"), - (II, 1, (2,), 1, (8,), ()): ("L", "L"), - (MM, 1, (2,), 1, (8,), ()): ("L", "L"), - (II, 1, (1,), 2, (8,), ()): ("L", "L;R"), - (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"), - (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"), - (II, 0, (1,), 1, (16,), ()): ("I;16", "I;16"), - (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), - (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), - (II, 1, (1,), 2, (16,), ()): ("I;16", "I;16R"), - (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"), - (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"), - (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"), - (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"), - (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"), - (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"), - (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"), - (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"), - (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"), - (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), - (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), - (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), - (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), - (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples - (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples - (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 - (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 - (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"), - (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "RGBX;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "RGBX;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"), - (II, 3, (1,), 1, (1,), ()): ("P", "P;1"), - (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"), - (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"), - (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"), - (II, 3, (1,), 1, (2,), ()): ("P", "P;2"), - (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"), - (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"), - (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"), - (II, 3, (1,), 1, (4,), ()): ("P", "P;4"), - (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"), - (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"), - (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"), - (II, 3, (1,), 1, (8,), ()): ("P", "P"), - (MM, 3, (1,), 1, (8,), ()): ("P", "P"), - (II, 3, (1,), 1, (8, 8), (0,)): ("P", "PX"), - (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), - (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), - (II, 3, (1,), 2, (8,), ()): ("P", "P;R"), - (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"), - (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), - (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), - (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), - (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), - (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (II, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16L"), - (MM, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16B"), - (II, 6, (1,), 1, (8,), ()): ("L", "L"), - (MM, 6, (1,), 1, (8,), ()): ("L", "L"), - # JPEG compressed images handled by LibTiff and auto-converted to RGBX - # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel - (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), - (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), - (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), - (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), -} - -MAX_SAMPLESPERPIXEL = max(len(key_tp[4]) for key_tp in OPEN_INFO) - -PREFIXES = [ - b"MM\x00\x2a", # Valid TIFF header with big-endian byte order - b"II\x2a\x00", # Valid TIFF header with little-endian byte order - b"MM\x2a\x00", # Invalid TIFF header, assume big-endian - b"II\x00\x2a", # Invalid TIFF header, assume little-endian - b"MM\x00\x2b", # BigTIFF with big-endian byte order - b"II\x2b\x00", # BigTIFF with little-endian byte order -] - -if not getattr(Image.core, "libtiff_support_custom_tags", True): - deprecate("Support for LibTIFF earlier than version 4", 12) - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(tuple(PREFIXES)) - - -def _limit_rational( - val: float | Fraction | IFDRational, max_val: int -) -> tuple[IntegralLike, IntegralLike]: - inv = abs(val) > 1 - n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) - return n_d[::-1] if inv else n_d - - -def _limit_signed_rational( - val: IFDRational, max_val: int, min_val: int -) -> tuple[IntegralLike, IntegralLike]: - frac = Fraction(val) - n_d: tuple[IntegralLike, IntegralLike] = frac.numerator, frac.denominator - - if min(float(i) for i in n_d) < min_val: - n_d = _limit_rational(val, abs(min_val)) - - n_d_float = tuple(float(i) for i in n_d) - if max(n_d_float) > max_val: - n_d = _limit_rational(n_d_float[0] / n_d_float[1], max_val) - - return n_d - - -## -# Wrapper for TIFF IFDs. - -_load_dispatch = {} -_write_dispatch = {} - - -def _delegate(op: str) -> Any: - def delegate( - self: IFDRational, *args: tuple[float, ...] - ) -> bool | float | Fraction: - return getattr(self._val, op)(*args) - - return delegate - - -class IFDRational(Rational): - """Implements a rational class where 0/0 is a legal value to match - the in the wild use of exif rationals. - - e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used - """ - - """ If the denominator is 0, store this as a float('nan'), otherwise store - as a fractions.Fraction(). Delegate as appropriate - - """ - - __slots__ = ("_numerator", "_denominator", "_val") - - def __init__( - self, value: float | Fraction | IFDRational, denominator: int = 1 - ) -> None: - """ - :param value: either an integer numerator, a - float/rational/other number, or an IFDRational - :param denominator: Optional integer denominator - """ - self._val: Fraction | float - if isinstance(value, IFDRational): - self._numerator = value.numerator - self._denominator = value.denominator - self._val = value._val - return - - if isinstance(value, Fraction): - self._numerator = value.numerator - self._denominator = value.denominator - else: - if TYPE_CHECKING: - self._numerator = cast(IntegralLike, value) - else: - self._numerator = value - self._denominator = denominator - - if denominator == 0: - self._val = float("nan") - elif denominator == 1: - self._val = Fraction(value) - elif int(value) == value: - self._val = Fraction(int(value), denominator) - else: - self._val = Fraction(value / denominator) - - @property - def numerator(self) -> IntegralLike: - return self._numerator - - @property - def denominator(self) -> int: - return self._denominator - - def limit_rational(self, max_denominator: int) -> tuple[IntegralLike, int]: - """ - - :param max_denominator: Integer, the maximum denominator value - :returns: Tuple of (numerator, denominator) - """ - - if self.denominator == 0: - return self.numerator, self.denominator - - assert isinstance(self._val, Fraction) - f = self._val.limit_denominator(max_denominator) - return f.numerator, f.denominator - - def __repr__(self) -> str: - return str(float(self._val)) - - def __hash__(self) -> int: # type: ignore[override] - return self._val.__hash__() - - def __eq__(self, other: object) -> bool: - val = self._val - if isinstance(other, IFDRational): - other = other._val - if isinstance(other, float): - val = float(val) - return val == other - - def __getstate__(self) -> list[float | Fraction | IntegralLike]: - return [self._val, self._numerator, self._denominator] - - def __setstate__(self, state: list[float | Fraction | IntegralLike]) -> None: - IFDRational.__init__(self, 0) - _val, _numerator, _denominator = state - assert isinstance(_val, (float, Fraction)) - self._val = _val - if TYPE_CHECKING: - self._numerator = cast(IntegralLike, _numerator) - else: - self._numerator = _numerator - assert isinstance(_denominator, int) - self._denominator = _denominator - - """ a = ['add','radd', 'sub', 'rsub', 'mul', 'rmul', - 'truediv', 'rtruediv', 'floordiv', 'rfloordiv', - 'mod','rmod', 'pow','rpow', 'pos', 'neg', - 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'bool', - 'ceil', 'floor', 'round'] - print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) - """ - - __add__ = _delegate("__add__") - __radd__ = _delegate("__radd__") - __sub__ = _delegate("__sub__") - __rsub__ = _delegate("__rsub__") - __mul__ = _delegate("__mul__") - __rmul__ = _delegate("__rmul__") - __truediv__ = _delegate("__truediv__") - __rtruediv__ = _delegate("__rtruediv__") - __floordiv__ = _delegate("__floordiv__") - __rfloordiv__ = _delegate("__rfloordiv__") - __mod__ = _delegate("__mod__") - __rmod__ = _delegate("__rmod__") - __pow__ = _delegate("__pow__") - __rpow__ = _delegate("__rpow__") - __pos__ = _delegate("__pos__") - __neg__ = _delegate("__neg__") - __abs__ = _delegate("__abs__") - __trunc__ = _delegate("__trunc__") - __lt__ = _delegate("__lt__") - __gt__ = _delegate("__gt__") - __le__ = _delegate("__le__") - __ge__ = _delegate("__ge__") - __bool__ = _delegate("__bool__") - __ceil__ = _delegate("__ceil__") - __floor__ = _delegate("__floor__") - __round__ = _delegate("__round__") - # Python >= 3.11 - if hasattr(Fraction, "__int__"): - __int__ = _delegate("__int__") - - -_LoaderFunc = Callable[["ImageFileDirectory_v2", bytes, bool], Any] - - -def _register_loader(idx: int, size: int) -> Callable[[_LoaderFunc], _LoaderFunc]: - def decorator(func: _LoaderFunc) -> _LoaderFunc: - from .TiffTags import TYPES - - if func.__name__.startswith("load_"): - TYPES[idx] = func.__name__[5:].replace("_", " ") - _load_dispatch[idx] = size, func # noqa: F821 - return func - - return decorator - - -def _register_writer(idx: int) -> Callable[[Callable[..., Any]], Callable[..., Any]]: - def decorator(func: Callable[..., Any]) -> Callable[..., Any]: - _write_dispatch[idx] = func # noqa: F821 - return func - - return decorator - - -def _register_basic(idx_fmt_name: tuple[int, str, str]) -> None: - from .TiffTags import TYPES - - idx, fmt, name = idx_fmt_name - TYPES[idx] = name - size = struct.calcsize(f"={fmt}") - - def basic_handler( - self: ImageFileDirectory_v2, data: bytes, legacy_api: bool = True - ) -> tuple[Any, ...]: - return self._unpack(f"{len(data) // size}{fmt}", data) - - _load_dispatch[idx] = size, basic_handler # noqa: F821 - _write_dispatch[idx] = lambda self, *values: ( # noqa: F821 - b"".join(self._pack(fmt, value) for value in values) - ) - - -if TYPE_CHECKING: - _IFDv2Base = MutableMapping[int, Any] -else: - _IFDv2Base = MutableMapping - - -class ImageFileDirectory_v2(_IFDv2Base): - """This class represents a TIFF tag directory. To speed things up, we - don't decode tags unless they're asked for. - - Exposes a dictionary interface of the tags in the directory:: - - ifd = ImageFileDirectory_v2() - ifd[key] = 'Some Data' - ifd.tagtype[key] = TiffTags.ASCII - print(ifd[key]) - 'Some Data' - - Individual values are returned as the strings or numbers, sequences are - returned as tuples of the values. - - The tiff metadata type of each item is stored in a dictionary of - tag types in - :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types - are read from a tiff file, guessed from the type added, or added - manually. - - Data Structures: - - * ``self.tagtype = {}`` - - * Key: numerical TIFF tag number - * Value: integer corresponding to the data type from - :py:data:`.TiffTags.TYPES` - - .. versionadded:: 3.0.0 - - 'Internal' data structures: - - * ``self._tags_v2 = {}`` - - * Key: numerical TIFF tag number - * Value: decoded data, as tuple for multiple values - - * ``self._tagdata = {}`` - - * Key: numerical TIFF tag number - * Value: undecoded byte string from file - - * ``self._tags_v1 = {}`` - - * Key: numerical TIFF tag number - * Value: decoded data in the v1 format - - Tags will be found in the private attributes ``self._tagdata``, and in - ``self._tags_v2`` once decoded. - - ``self.legacy_api`` is a value for internal use, and shouldn't be changed - from outside code. In cooperation with - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api`` - is true, then decoded tags will be populated into both ``_tags_v1`` and - ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF - save routine. Tags should be read from ``_tags_v1`` if - ``legacy_api == true``. - - """ - - _load_dispatch: dict[int, tuple[int, _LoaderFunc]] = {} - _write_dispatch: dict[int, Callable[..., Any]] = {} - - def __init__( - self, - ifh: bytes = b"II\x2a\x00\x00\x00\x00\x00", - prefix: bytes | None = None, - group: int | None = None, - ) -> None: - """Initialize an ImageFileDirectory. - - To construct an ImageFileDirectory from a real file, pass the 8-byte - magic header to the constructor. To only set the endianness, pass it - as the 'prefix' keyword argument. - - :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets - endianness. - :param prefix: Override the endianness of the file. - """ - if not _accept(ifh): - msg = f"not a TIFF file (header {repr(ifh)} not valid)" - raise SyntaxError(msg) - self._prefix = prefix if prefix is not None else ifh[:2] - if self._prefix == MM: - self._endian = ">" - elif self._prefix == II: - self._endian = "<" - else: - msg = "not a TIFF IFD" - raise SyntaxError(msg) - self._bigtiff = ifh[2] == 43 - self.group = group - self.tagtype: dict[int, int] = {} - """ Dictionary of tag types """ - self.reset() - self.next = ( - self._unpack("Q", ifh[8:])[0] - if self._bigtiff - else self._unpack("L", ifh[4:])[0] - ) - self._legacy_api = False - - prefix = property(lambda self: self._prefix) - offset = property(lambda self: self._offset) - - @property - def legacy_api(self) -> bool: - return self._legacy_api - - @legacy_api.setter - def legacy_api(self, value: bool) -> NoReturn: - msg = "Not allowing setting of legacy api" - raise Exception(msg) - - def reset(self) -> None: - self._tags_v1: dict[int, Any] = {} # will remain empty if legacy_api is false - self._tags_v2: dict[int, Any] = {} # main tag storage - self._tagdata: dict[int, bytes] = {} - self.tagtype = {} # added 2008-06-05 by Florian Hoech - self._next = None - self._offset: int | None = None - - def __str__(self) -> str: - return str(dict(self)) - - def named(self) -> dict[str, Any]: - """ - :returns: dict of name|key: value - - Returns the complete tag dictionary, with named tags where possible. - """ - return { - TiffTags.lookup(code, self.group).name: value - for code, value in self.items() - } - - def __len__(self) -> int: - return len(set(self._tagdata) | set(self._tags_v2)) - - def __getitem__(self, tag: int) -> Any: - if tag not in self._tags_v2: # unpack on the fly - data = self._tagdata[tag] - typ = self.tagtype[tag] - size, handler = self._load_dispatch[typ] - self[tag] = handler(self, data, self.legacy_api) # check type - val = self._tags_v2[tag] - if self.legacy_api and not isinstance(val, (tuple, bytes)): - val = (val,) - return val - - def __contains__(self, tag: object) -> bool: - return tag in self._tags_v2 or tag in self._tagdata - - def __setitem__(self, tag: int, value: Any) -> None: - self._setitem(tag, value, self.legacy_api) - - def _setitem(self, tag: int, value: Any, legacy_api: bool) -> None: - basetypes = (Number, bytes, str) - - info = TiffTags.lookup(tag, self.group) - values = [value] if isinstance(value, basetypes) else value - - if tag not in self.tagtype: - if info.type: - self.tagtype[tag] = info.type - else: - self.tagtype[tag] = TiffTags.UNDEFINED - if all(isinstance(v, IFDRational) for v in values): - for v in values: - assert isinstance(v, IFDRational) - if v < 0: - self.tagtype[tag] = TiffTags.SIGNED_RATIONAL - break - else: - self.tagtype[tag] = TiffTags.RATIONAL - elif all(isinstance(v, int) for v in values): - short = True - signed_short = True - long = True - for v in values: - assert isinstance(v, int) - if short and not (0 <= v < 2**16): - short = False - if signed_short and not (-(2**15) < v < 2**15): - signed_short = False - if long and v < 0: - long = False - if short: - self.tagtype[tag] = TiffTags.SHORT - elif signed_short: - self.tagtype[tag] = TiffTags.SIGNED_SHORT - elif long: - self.tagtype[tag] = TiffTags.LONG - else: - self.tagtype[tag] = TiffTags.SIGNED_LONG - elif all(isinstance(v, float) for v in values): - self.tagtype[tag] = TiffTags.DOUBLE - elif all(isinstance(v, str) for v in values): - self.tagtype[tag] = TiffTags.ASCII - elif all(isinstance(v, bytes) for v in values): - self.tagtype[tag] = TiffTags.BYTE - - if self.tagtype[tag] == TiffTags.UNDEFINED: - values = [ - v.encode("ascii", "replace") if isinstance(v, str) else v - for v in values - ] - elif self.tagtype[tag] == TiffTags.RATIONAL: - values = [float(v) if isinstance(v, int) else v for v in values] - - is_ifd = self.tagtype[tag] == TiffTags.LONG and isinstance(values, dict) - if not is_ifd: - values = tuple( - info.cvt_enum(value) if isinstance(value, str) else value - for value in values - ) - - dest = self._tags_v1 if legacy_api else self._tags_v2 - - # Three branches: - # Spec'd length == 1, Actual length 1, store as element - # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. - # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. - # Don't mess with the legacy api, since it's frozen. - if not is_ifd and ( - (info.length == 1) - or self.tagtype[tag] == TiffTags.BYTE - or (info.length is None and len(values) == 1 and not legacy_api) - ): - # Don't mess with the legacy api, since it's frozen. - if legacy_api and self.tagtype[tag] in [ - TiffTags.RATIONAL, - TiffTags.SIGNED_RATIONAL, - ]: # rationals - values = (values,) - try: - (dest[tag],) = values - except ValueError: - # We've got a builtin tag with 1 expected entry - warnings.warn( - f"Metadata Warning, tag {tag} had too many entries: " - f"{len(values)}, expected 1" - ) - dest[tag] = values[0] - - else: - # Spec'd length > 1 or undefined - # Unspec'd, and length > 1 - dest[tag] = values - - def __delitem__(self, tag: int) -> None: - self._tags_v2.pop(tag, None) - self._tags_v1.pop(tag, None) - self._tagdata.pop(tag, None) - - def __iter__(self) -> Iterator[int]: - return iter(set(self._tagdata) | set(self._tags_v2)) - - def _unpack(self, fmt: str, data: bytes) -> tuple[Any, ...]: - return struct.unpack(self._endian + fmt, data) - - def _pack(self, fmt: str, *values: Any) -> bytes: - return struct.pack(self._endian + fmt, *values) - - list( - map( - _register_basic, - [ - (TiffTags.SHORT, "H", "short"), - (TiffTags.LONG, "L", "long"), - (TiffTags.SIGNED_BYTE, "b", "signed byte"), - (TiffTags.SIGNED_SHORT, "h", "signed short"), - (TiffTags.SIGNED_LONG, "l", "signed long"), - (TiffTags.FLOAT, "f", "float"), - (TiffTags.DOUBLE, "d", "double"), - (TiffTags.IFD, "L", "long"), - (TiffTags.LONG8, "Q", "long8"), - ], - ) - ) - - @_register_loader(1, 1) # Basic type, except for the legacy API. - def load_byte(self, data: bytes, legacy_api: bool = True) -> bytes: - return data - - @_register_writer(1) # Basic type, except for the legacy API. - def write_byte(self, data: bytes | int | IFDRational) -> bytes: - if isinstance(data, IFDRational): - data = int(data) - if isinstance(data, int): - data = bytes((data,)) - return data - - @_register_loader(2, 1) - def load_string(self, data: bytes, legacy_api: bool = True) -> str: - if data.endswith(b"\0"): - data = data[:-1] - return data.decode("latin-1", "replace") - - @_register_writer(2) - def write_string(self, value: str | bytes | int) -> bytes: - # remerge of https://github.com/python-pillow/Pillow/pull/1416 - if isinstance(value, int): - value = str(value) - if not isinstance(value, bytes): - value = value.encode("ascii", "replace") - return value + b"\0" - - @_register_loader(5, 8) - def load_rational( - self, data: bytes, legacy_api: bool = True - ) -> tuple[tuple[int, int] | IFDRational, ...]: - vals = self._unpack(f"{len(data) // 4}L", data) - - def combine(a: int, b: int) -> tuple[int, int] | IFDRational: - return (a, b) if legacy_api else IFDRational(a, b) - - return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) - - @_register_writer(5) - def write_rational(self, *values: IFDRational) -> bytes: - return b"".join( - self._pack("2L", *_limit_rational(frac, 2**32 - 1)) for frac in values - ) - - @_register_loader(7, 1) - def load_undefined(self, data: bytes, legacy_api: bool = True) -> bytes: - return data - - @_register_writer(7) - def write_undefined(self, value: bytes | int | IFDRational) -> bytes: - if isinstance(value, IFDRational): - value = int(value) - if isinstance(value, int): - value = str(value).encode("ascii", "replace") - return value - - @_register_loader(10, 8) - def load_signed_rational( - self, data: bytes, legacy_api: bool = True - ) -> tuple[tuple[int, int] | IFDRational, ...]: - vals = self._unpack(f"{len(data) // 4}l", data) - - def combine(a: int, b: int) -> tuple[int, int] | IFDRational: - return (a, b) if legacy_api else IFDRational(a, b) - - return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) - - @_register_writer(10) - def write_signed_rational(self, *values: IFDRational) -> bytes: - return b"".join( - self._pack("2l", *_limit_signed_rational(frac, 2**31 - 1, -(2**31))) - for frac in values - ) - - def _ensure_read(self, fp: IO[bytes], size: int) -> bytes: - ret = fp.read(size) - if len(ret) != size: - msg = ( - "Corrupt EXIF data. " - f"Expecting to read {size} bytes but only got {len(ret)}. " - ) - raise OSError(msg) - return ret - - def load(self, fp: IO[bytes]) -> None: - self.reset() - self._offset = fp.tell() - - try: - tag_count = ( - self._unpack("Q", self._ensure_read(fp, 8)) - if self._bigtiff - else self._unpack("H", self._ensure_read(fp, 2)) - )[0] - for i in range(tag_count): - tag, typ, count, data = ( - self._unpack("HHQ8s", self._ensure_read(fp, 20)) - if self._bigtiff - else self._unpack("HHL4s", self._ensure_read(fp, 12)) - ) - - tagname = TiffTags.lookup(tag, self.group).name - typname = TYPES.get(typ, "unknown") - msg = f"tag: {tagname} ({tag}) - type: {typname} ({typ})" - - try: - unit_size, handler = self._load_dispatch[typ] - except KeyError: - logger.debug("%s - unsupported type %s", msg, typ) - continue # ignore unsupported type - size = count * unit_size - if size > (8 if self._bigtiff else 4): - here = fp.tell() - (offset,) = self._unpack("Q" if self._bigtiff else "L", data) - msg += f" Tag Location: {here} - Data Location: {offset}" - fp.seek(offset) - data = ImageFile._safe_read(fp, size) - fp.seek(here) - else: - data = data[:size] - - if len(data) != size: - warnings.warn( - "Possibly corrupt EXIF data. " - f"Expecting to read {size} bytes but only got {len(data)}." - f" Skipping tag {tag}" - ) - logger.debug(msg) - continue - - if not data: - logger.debug(msg) - continue - - self._tagdata[tag] = data - self.tagtype[tag] = typ - - msg += " - value: " - msg += f"" if size > 32 else repr(data) - - logger.debug(msg) - - (self.next,) = ( - self._unpack("Q", self._ensure_read(fp, 8)) - if self._bigtiff - else self._unpack("L", self._ensure_read(fp, 4)) - ) - except OSError as msg: - warnings.warn(str(msg)) - return - - def _get_ifh(self) -> bytes: - ifh = self._prefix + self._pack("H", 43 if self._bigtiff else 42) - if self._bigtiff: - ifh += self._pack("HH", 8, 0) - ifh += self._pack("Q", 16) if self._bigtiff else self._pack("L", 8) - - return ifh - - def tobytes(self, offset: int = 0) -> bytes: - # FIXME What about tagdata? - result = self._pack("Q" if self._bigtiff else "H", len(self._tags_v2)) - - entries: list[tuple[int, int, int, bytes, bytes]] = [] - - fmt = "Q" if self._bigtiff else "L" - fmt_size = 8 if self._bigtiff else 4 - offset += ( - len(result) + len(self._tags_v2) * (20 if self._bigtiff else 12) + fmt_size - ) - stripoffsets = None - - # pass 1: convert tags to binary format - # always write tags in ascending order - for tag, value in sorted(self._tags_v2.items()): - if tag == STRIPOFFSETS: - stripoffsets = len(entries) - typ = self.tagtype[tag] - logger.debug("Tag %s, Type: %s, Value: %s", tag, typ, repr(value)) - is_ifd = typ == TiffTags.LONG and isinstance(value, dict) - if is_ifd: - ifd = ImageFileDirectory_v2(self._get_ifh(), group=tag) - values = self._tags_v2[tag] - for ifd_tag, ifd_value in values.items(): - ifd[ifd_tag] = ifd_value - data = ifd.tobytes(offset) - else: - values = value if isinstance(value, tuple) else (value,) - data = self._write_dispatch[typ](self, *values) - - tagname = TiffTags.lookup(tag, self.group).name - typname = "ifd" if is_ifd else TYPES.get(typ, "unknown") - msg = f"save: {tagname} ({tag}) - type: {typname} ({typ}) - value: " - msg += f"" if len(data) >= 16 else str(values) - logger.debug(msg) - - # count is sum of lengths for string and arbitrary data - if is_ifd: - count = 1 - elif typ in [TiffTags.BYTE, TiffTags.ASCII, TiffTags.UNDEFINED]: - count = len(data) - else: - count = len(values) - # figure out if data fits into the entry - if len(data) <= fmt_size: - entries.append((tag, typ, count, data.ljust(fmt_size, b"\0"), b"")) - else: - entries.append((tag, typ, count, self._pack(fmt, offset), data)) - offset += (len(data) + 1) // 2 * 2 # pad to word - - # update strip offset data to point beyond auxiliary data - if stripoffsets is not None: - tag, typ, count, value, data = entries[stripoffsets] - if data: - size, handler = self._load_dispatch[typ] - values = [val + offset for val in handler(self, data, self.legacy_api)] - data = self._write_dispatch[typ](self, *values) - else: - value = self._pack(fmt, self._unpack(fmt, value)[0] + offset) - entries[stripoffsets] = tag, typ, count, value, data - - # pass 2: write entries to file - for tag, typ, count, value, data in entries: - logger.debug("%s %s %s %s %s", tag, typ, count, repr(value), repr(data)) - result += self._pack( - "HHQ8s" if self._bigtiff else "HHL4s", tag, typ, count, value - ) - - # -- overwrite here for multi-page -- - result += self._pack(fmt, 0) # end of entries - - # pass 3: write auxiliary data to file - for tag, typ, count, value, data in entries: - result += data - if len(data) & 1: - result += b"\0" - - return result - - def save(self, fp: IO[bytes]) -> int: - if fp.tell() == 0: # skip TIFF header on subsequent pages - fp.write(self._get_ifh()) - - offset = fp.tell() - result = self.tobytes(offset) - fp.write(result) - return offset + len(result) - - -ImageFileDirectory_v2._load_dispatch = _load_dispatch -ImageFileDirectory_v2._write_dispatch = _write_dispatch -for idx, name in TYPES.items(): - name = name.replace(" ", "_") - setattr(ImageFileDirectory_v2, f"load_{name}", _load_dispatch[idx][1]) - setattr(ImageFileDirectory_v2, f"write_{name}", _write_dispatch[idx]) -del _load_dispatch, _write_dispatch, idx, name - - -# Legacy ImageFileDirectory support. -class ImageFileDirectory_v1(ImageFileDirectory_v2): - """This class represents the **legacy** interface to a TIFF tag directory. - - Exposes a dictionary interface of the tags in the directory:: - - ifd = ImageFileDirectory_v1() - ifd[key] = 'Some Data' - ifd.tagtype[key] = TiffTags.ASCII - print(ifd[key]) - ('Some Data',) - - Also contains a dictionary of tag types as read from the tiff image file, - :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. - - Values are returned as a tuple. - - .. deprecated:: 3.0.0 - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, **kwargs) - self._legacy_api = True - - tags = property(lambda self: self._tags_v1) - tagdata = property(lambda self: self._tagdata) - - # defined in ImageFileDirectory_v2 - tagtype: dict[int, int] - """Dictionary of tag types""" - - @classmethod - def from_v2(cls, original: ImageFileDirectory_v2) -> ImageFileDirectory_v1: - """Returns an - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - instance with the same data as is contained in the original - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - instance. - - :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - - """ - - ifd = cls(prefix=original.prefix) - ifd._tagdata = original._tagdata - ifd.tagtype = original.tagtype - ifd.next = original.next # an indicator for multipage tiffs - return ifd - - def to_v2(self) -> ImageFileDirectory_v2: - """Returns an - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - instance with the same data as is contained in the original - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - instance. - - :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - - """ - - ifd = ImageFileDirectory_v2(prefix=self.prefix) - ifd._tagdata = dict(self._tagdata) - ifd.tagtype = dict(self.tagtype) - ifd._tags_v2 = dict(self._tags_v2) - return ifd - - def __contains__(self, tag: object) -> bool: - return tag in self._tags_v1 or tag in self._tagdata - - def __len__(self) -> int: - return len(set(self._tagdata) | set(self._tags_v1)) - - def __iter__(self) -> Iterator[int]: - return iter(set(self._tagdata) | set(self._tags_v1)) - - def __setitem__(self, tag: int, value: Any) -> None: - for legacy_api in (False, True): - self._setitem(tag, value, legacy_api) - - def __getitem__(self, tag: int) -> Any: - if tag not in self._tags_v1: # unpack on the fly - data = self._tagdata[tag] - typ = self.tagtype[tag] - size, handler = self._load_dispatch[typ] - for legacy in (False, True): - self._setitem(tag, handler(self, data, legacy), legacy) - val = self._tags_v1[tag] - if not isinstance(val, (tuple, bytes)): - val = (val,) - return val - - -# undone -- switch this pointer -ImageFileDirectory = ImageFileDirectory_v1 - - -## -# Image plugin for TIFF files. - - -class TiffImageFile(ImageFile.ImageFile): - format = "TIFF" - format_description = "Adobe TIFF" - _close_exclusive_fp_after_loading = False - - def __init__( - self, - fp: StrOrBytesPath | IO[bytes], - filename: str | bytes | None = None, - ) -> None: - self.tag_v2: ImageFileDirectory_v2 - """ Image file directory (tag dictionary) """ - - self.tag: ImageFileDirectory_v1 - """ Legacy tag entries """ - - super().__init__(fp, filename) - - def _open(self) -> None: - """Open the first image in a TIFF file""" - - # Header - ifh = self.fp.read(8) - if ifh[2] == 43: - ifh += self.fp.read(8) - - self.tag_v2 = ImageFileDirectory_v2(ifh) - - # setup frame pointers - self.__first = self.__next = self.tag_v2.next - self.__frame = -1 - self._fp = self.fp - self._frame_pos: list[int] = [] - self._n_frames: int | None = None - - logger.debug("*** TiffImageFile._open ***") - logger.debug("- __first: %s", self.__first) - logger.debug("- ifh: %s", repr(ifh)) # Use repr to avoid str(bytes) - - # and load the first frame - self._seek(0) - - @property - def n_frames(self) -> int: - current_n_frames = self._n_frames - if current_n_frames is None: - current = self.tell() - self._seek(len(self._frame_pos)) - while self._n_frames is None: - self._seek(self.tell() + 1) - self.seek(current) - assert self._n_frames is not None - return self._n_frames - - def seek(self, frame: int) -> None: - """Select a given frame as current image""" - if not self._seek_check(frame): - return - self._seek(frame) - if self._im is not None and ( - self.im.size != self._tile_size or self.im.mode != self.mode - ): - # The core image will no longer be used - self._im = None - - def _seek(self, frame: int) -> None: - if isinstance(self._fp, DeferredError): - raise self._fp.ex - self.fp = self._fp - - while len(self._frame_pos) <= frame: - if not self.__next: - msg = "no more images in TIFF file" - raise EOFError(msg) - logger.debug( - "Seeking to frame %s, on frame %s, __next %s, location: %s", - frame, - self.__frame, - self.__next, - self.fp.tell(), - ) - if self.__next >= 2**63: - msg = "Unable to seek to frame" - raise ValueError(msg) - self.fp.seek(self.__next) - self._frame_pos.append(self.__next) - logger.debug("Loading tags, location: %s", self.fp.tell()) - self.tag_v2.load(self.fp) - if self.tag_v2.next in self._frame_pos: - # This IFD has already been processed - # Declare this to be the end of the image - self.__next = 0 - else: - self.__next = self.tag_v2.next - if self.__next == 0: - self._n_frames = frame + 1 - if len(self._frame_pos) == 1: - self.is_animated = self.__next != 0 - self.__frame += 1 - self.fp.seek(self._frame_pos[frame]) - self.tag_v2.load(self.fp) - if XMP in self.tag_v2: - self.info["xmp"] = self.tag_v2[XMP] - elif "xmp" in self.info: - del self.info["xmp"] - self._reload_exif() - # fill the legacy tag/ifd entries - self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) - self.__frame = frame - self._setup() - - def tell(self) -> int: - """Return the current frame number""" - return self.__frame - - def get_photoshop_blocks(self) -> dict[int, dict[str, bytes]]: - """ - Returns a dictionary of Photoshop "Image Resource Blocks". - The keys are the image resource ID. For more information, see - https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727 - - :returns: Photoshop "Image Resource Blocks" in a dictionary. - """ - blocks = {} - val = self.tag_v2.get(ExifTags.Base.ImageResources) - if val: - while val.startswith(b"8BIM"): - id = i16(val[4:6]) - n = math.ceil((val[6] + 1) / 2) * 2 - size = i32(val[6 + n : 10 + n]) - data = val[10 + n : 10 + n + size] - blocks[id] = {"data": data} - - val = val[math.ceil((10 + n + size) / 2) * 2 :] - return blocks - - def load(self) -> Image.core.PixelAccess | None: - if self.tile and self.use_load_libtiff: - return self._load_libtiff() - return super().load() - - def load_prepare(self) -> None: - if self._im is None: - Image._decompression_bomb_check(self._tile_size) - self.im = Image.core.new(self.mode, self._tile_size) - ImageFile.ImageFile.load_prepare(self) - - def load_end(self) -> None: - # allow closing if we're on the first frame, there's no next - # This is the ImageFile.load path only, libtiff specific below. - if not self.is_animated: - self._close_exclusive_fp_after_loading = True - - # load IFD data from fp before it is closed - exif = self.getexif() - for key in TiffTags.TAGS_V2_GROUPS: - if key not in exif: - continue - exif.get_ifd(key) - - ImageOps.exif_transpose(self, in_place=True) - if ExifTags.Base.Orientation in self.tag_v2: - del self.tag_v2[ExifTags.Base.Orientation] - - def _load_libtiff(self) -> Image.core.PixelAccess | None: - """Overload method triggered when we detect a compressed tiff - Calls out to libtiff""" - - Image.Image.load(self) - - self.load_prepare() - - if not len(self.tile) == 1: - msg = "Not exactly one tile" - raise OSError(msg) - - # (self._compression, (extents tuple), - # 0, (rawmode, self._compression, fp)) - extents = self.tile[0][1] - args = self.tile[0][3] - - # To be nice on memory footprint, if there's a - # file descriptor, use that instead of reading - # into a string in python. - try: - fp = hasattr(self.fp, "fileno") and self.fp.fileno() - # flush the file descriptor, prevents error on pypy 2.4+ - # should also eliminate the need for fp.tell - # in _seek - if hasattr(self.fp, "flush"): - self.fp.flush() - except OSError: - # io.BytesIO have a fileno, but returns an OSError if - # it doesn't use a file descriptor. - fp = False - - if fp: - assert isinstance(args, tuple) - args_list = list(args) - args_list[2] = fp - args = tuple(args_list) - - decoder = Image._getdecoder(self.mode, "libtiff", args, self.decoderconfig) - try: - decoder.setimage(self.im, extents) - except ValueError as e: - msg = "Couldn't set the image" - raise OSError(msg) from e - - close_self_fp = self._exclusive_fp and not self.is_animated - if hasattr(self.fp, "getvalue"): - # We've got a stringio like thing passed in. Yay for all in memory. - # The decoder needs the entire file in one shot, so there's not - # a lot we can do here other than give it the entire file. - # unless we could do something like get the address of the - # underlying string for stringio. - # - # Rearranging for supporting byteio items, since they have a fileno - # that returns an OSError if there's no underlying fp. Easier to - # deal with here by reordering. - logger.debug("have getvalue. just sending in a string from getvalue") - n, err = decoder.decode(self.fp.getvalue()) - elif fp: - # we've got a actual file on disk, pass in the fp. - logger.debug("have fileno, calling fileno version of the decoder.") - if not close_self_fp: - self.fp.seek(0) - # Save and restore the file position, because libtiff will move it - # outside of the Python runtime, and that will confuse - # io.BufferedReader and possible others. - # NOTE: This must use os.lseek(), and not fp.tell()/fp.seek(), - # because the buffer read head already may not equal the actual - # file position, and fp.seek() may just adjust it's internal - # pointer and not actually seek the OS file handle. - pos = os.lseek(fp, 0, os.SEEK_CUR) - # 4 bytes, otherwise the trace might error out - n, err = decoder.decode(b"fpfp") - os.lseek(fp, pos, os.SEEK_SET) - else: - # we have something else. - logger.debug("don't have fileno or getvalue. just reading") - self.fp.seek(0) - # UNDONE -- so much for that buffer size thing. - n, err = decoder.decode(self.fp.read()) - - self.tile = [] - self.readonly = 0 - - self.load_end() - - if close_self_fp: - self.fp.close() - self.fp = None # might be shared - - if err < 0: - msg = f"decoder error {err}" - raise OSError(msg) - - return Image.Image.load(self) - - def _setup(self) -> None: - """Setup this image object based on current tags""" - - if 0xBC01 in self.tag_v2: - msg = "Windows Media Photo files not yet supported" - raise OSError(msg) - - # extract relevant tags - self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)] - self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1) - - # photometric is a required tag, but not everyone is reading - # the specification - photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0) - - # old style jpeg compression images most certainly are YCbCr - if self._compression == "tiff_jpeg": - photo = 6 - - fillorder = self.tag_v2.get(FILLORDER, 1) - - logger.debug("*** Summary ***") - logger.debug("- compression: %s", self._compression) - logger.debug("- photometric_interpretation: %s", photo) - logger.debug("- planar_configuration: %s", self._planar_configuration) - logger.debug("- fill_order: %s", fillorder) - logger.debug("- YCbCr subsampling: %s", self.tag_v2.get(YCBCRSUBSAMPLING)) - - # size - try: - xsize = self.tag_v2[IMAGEWIDTH] - ysize = self.tag_v2[IMAGELENGTH] - except KeyError as e: - msg = "Missing dimensions" - raise TypeError(msg) from e - if not isinstance(xsize, int) or not isinstance(ysize, int): - msg = "Invalid dimensions" - raise ValueError(msg) - self._tile_size = xsize, ysize - orientation = self.tag_v2.get(ExifTags.Base.Orientation) - if orientation in (5, 6, 7, 8): - self._size = ysize, xsize - else: - self._size = xsize, ysize - - logger.debug("- size: %s", self.size) - - sample_format = self.tag_v2.get(SAMPLEFORMAT, (1,)) - if len(sample_format) > 1 and max(sample_format) == min(sample_format) == 1: - # SAMPLEFORMAT is properly per band, so an RGB image will - # be (1,1,1). But, we don't support per band pixel types, - # and anything more than one band is a uint8. So, just - # take the first element. Revisit this if adding support - # for more exotic images. - sample_format = (1,) - - bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) - extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) - if photo in (2, 6, 8): # RGB, YCbCr, LAB - bps_count = 3 - elif photo == 5: # CMYK - bps_count = 4 - else: - bps_count = 1 - bps_count += len(extra_tuple) - bps_actual_count = len(bps_tuple) - samples_per_pixel = self.tag_v2.get( - SAMPLESPERPIXEL, - 3 if self._compression == "tiff_jpeg" and photo in (2, 6) else 1, - ) - - if samples_per_pixel > MAX_SAMPLESPERPIXEL: - # DOS check, samples_per_pixel can be a Long, and we extend the tuple below - logger.error( - "More samples per pixel than can be decoded: %s", samples_per_pixel - ) - msg = "Invalid value for samples per pixel" - raise SyntaxError(msg) - - if samples_per_pixel < bps_actual_count: - # If a file has more values in bps_tuple than expected, - # remove the excess. - bps_tuple = bps_tuple[:samples_per_pixel] - elif samples_per_pixel > bps_actual_count and bps_actual_count == 1: - # If a file has only one value in bps_tuple, when it should have more, - # presume it is the same number of bits for all of the samples. - bps_tuple = bps_tuple * samples_per_pixel - - if len(bps_tuple) != samples_per_pixel: - msg = "unknown data organization" - raise SyntaxError(msg) - - # mode: check photometric interpretation and bits per pixel - key = ( - self.tag_v2.prefix, - photo, - sample_format, - fillorder, - bps_tuple, - extra_tuple, - ) - logger.debug("format key: %s", key) - try: - self._mode, rawmode = OPEN_INFO[key] - except KeyError as e: - logger.debug("- unsupported format") - msg = "unknown pixel mode" - raise SyntaxError(msg) from e - - logger.debug("- raw mode: %s", rawmode) - logger.debug("- pil mode: %s", self.mode) - - self.info["compression"] = self._compression - - xres = self.tag_v2.get(X_RESOLUTION, 1) - yres = self.tag_v2.get(Y_RESOLUTION, 1) - - if xres and yres: - resunit = self.tag_v2.get(RESOLUTION_UNIT) - if resunit == 2: # dots per inch - self.info["dpi"] = (xres, yres) - elif resunit == 3: # dots per centimeter. convert to dpi - self.info["dpi"] = (xres * 2.54, yres * 2.54) - elif resunit is None: # used to default to 1, but now 2) - self.info["dpi"] = (xres, yres) - # For backward compatibility, - # we also preserve the old behavior - self.info["resolution"] = xres, yres - else: # No absolute unit of measurement - self.info["resolution"] = xres, yres - - # build tile descriptors - x = y = layer = 0 - self.tile = [] - self.use_load_libtiff = READ_LIBTIFF or self._compression != "raw" - if self.use_load_libtiff: - # Decoder expects entire file as one tile. - # There's a buffer size limit in load (64k) - # so large g4 images will fail if we use that - # function. - # - # Setup the one tile for the whole image, then - # use the _load_libtiff function. - - # libtiff handles the fillmode for us, so 1;IR should - # actually be 1;I. Including the R double reverses the - # bits, so stripes of the image are reversed. See - # https://github.com/python-pillow/Pillow/issues/279 - if fillorder == 2: - # Replace fillorder with fillorder=1 - key = key[:3] + (1,) + key[4:] - logger.debug("format key: %s", key) - # this should always work, since all the - # fillorder==2 modes have a corresponding - # fillorder=1 mode - self._mode, rawmode = OPEN_INFO[key] - # YCbCr images with new jpeg compression with pixels in one plane - # unpacked straight into RGB values - if ( - photo == 6 - and self._compression == "jpeg" - and self._planar_configuration == 1 - ): - rawmode = "RGB" - # libtiff always returns the bytes in native order. - # we're expecting image byte order. So, if the rawmode - # contains I;16, we need to convert from native to image - # byte order. - elif rawmode == "I;16": - rawmode = "I;16N" - elif rawmode.endswith((";16B", ";16L")): - rawmode = rawmode[:-1] + "N" - - # Offset in the tile tuple is 0, we go from 0,0 to - # w,h, and we only do this once -- eds - a = (rawmode, self._compression, False, self.tag_v2.offset) - self.tile.append(ImageFile._Tile("libtiff", (0, 0, xsize, ysize), 0, a)) - - elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: - # striped image - if STRIPOFFSETS in self.tag_v2: - offsets = self.tag_v2[STRIPOFFSETS] - h = self.tag_v2.get(ROWSPERSTRIP, ysize) - w = xsize - else: - # tiled image - offsets = self.tag_v2[TILEOFFSETS] - tilewidth = self.tag_v2.get(TILEWIDTH) - h = self.tag_v2.get(TILELENGTH) - if not isinstance(tilewidth, int) or not isinstance(h, int): - msg = "Invalid tile dimensions" - raise ValueError(msg) - w = tilewidth - - if w == xsize and h == ysize and self._planar_configuration != 2: - # Every tile covers the image. Only use the last offset - offsets = offsets[-1:] - - for offset in offsets: - if x + w > xsize: - stride = w * sum(bps_tuple) / 8 # bytes per line - else: - stride = 0 - - tile_rawmode = rawmode - if self._planar_configuration == 2: - # each band on it's own layer - tile_rawmode = rawmode[layer] - # adjust stride width accordingly - stride /= bps_count - - args = (tile_rawmode, int(stride), 1) - self.tile.append( - ImageFile._Tile( - self._compression, - (x, y, min(x + w, xsize), min(y + h, ysize)), - offset, - args, - ) - ) - x += w - if x >= xsize: - x, y = 0, y + h - if y >= ysize: - y = 0 - layer += 1 - else: - logger.debug("- unsupported data organization") - msg = "unknown data organization" - raise SyntaxError(msg) - - # Fix up info. - if ICCPROFILE in self.tag_v2: - self.info["icc_profile"] = self.tag_v2[ICCPROFILE] - - # fixup palette descriptor - - if self.mode in ["P", "PA"]: - palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] - self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) - - -# -# -------------------------------------------------------------------- -# Write TIFF files - -# little endian is default except for image modes with -# explicit big endian byte-order - -SAVE_INFO = { - # mode => rawmode, byteorder, photometrics, - # sampleformat, bitspersample, extra - "1": ("1", II, 1, 1, (1,), None), - "L": ("L", II, 1, 1, (8,), None), - "LA": ("LA", II, 1, 1, (8, 8), 2), - "P": ("P", II, 3, 1, (8,), None), - "PA": ("PA", II, 3, 1, (8, 8), 2), - "I": ("I;32S", II, 1, 2, (32,), None), - "I;16": ("I;16", II, 1, 1, (16,), None), - "I;16S": ("I;16S", II, 1, 2, (16,), None), - "F": ("F;32F", II, 1, 3, (32,), None), - "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), - "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), - "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2), - "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), - "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), - "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), - "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), - "I;16B": ("I;16B", MM, 1, 1, (16,), None), - "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), - "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as TIFF" - raise OSError(msg) from e - - encoderinfo = im.encoderinfo - encoderconfig = im.encoderconfig - - ifd = ImageFileDirectory_v2(prefix=prefix) - if encoderinfo.get("big_tiff"): - ifd._bigtiff = True - - try: - compression = encoderinfo["compression"] - except KeyError: - compression = im.info.get("compression") - if isinstance(compression, int): - # compression value may be from BMP. Ignore it - compression = None - if compression is None: - compression = "raw" - elif compression == "tiff_jpeg": - # OJPEG is obsolete, so use new-style JPEG compression instead - compression = "jpeg" - elif compression == "tiff_deflate": - compression = "tiff_adobe_deflate" - - libtiff = WRITE_LIBTIFF or compression != "raw" - - # required for color libtiff images - ifd[PLANAR_CONFIGURATION] = 1 - - ifd[IMAGEWIDTH] = im.size[0] - ifd[IMAGELENGTH] = im.size[1] - - # write any arbitrary tags passed in as an ImageFileDirectory - if "tiffinfo" in encoderinfo: - info = encoderinfo["tiffinfo"] - elif "exif" in encoderinfo: - info = encoderinfo["exif"] - if isinstance(info, bytes): - exif = Image.Exif() - exif.load(info) - info = exif - else: - info = {} - logger.debug("Tiffinfo Keys: %s", list(info)) - if isinstance(info, ImageFileDirectory_v1): - info = info.to_v2() - for key in info: - if isinstance(info, Image.Exif) and key in TiffTags.TAGS_V2_GROUPS: - ifd[key] = info.get_ifd(key) - else: - ifd[key] = info.get(key) - try: - ifd.tagtype[key] = info.tagtype[key] - except Exception: - pass # might not be an IFD. Might not have populated type - - legacy_ifd = {} - if hasattr(im, "tag"): - legacy_ifd = im.tag.to_v2() - - supplied_tags = {**legacy_ifd, **getattr(im, "tag_v2", {})} - for tag in ( - # IFD offset that may not be correct in the saved image - EXIFIFD, - # Determined by the image format and should not be copied from legacy_ifd. - SAMPLEFORMAT, - ): - if tag in supplied_tags: - del supplied_tags[tag] - - # additions written by Greg Couch, gregc@cgl.ucsf.edu - # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com - if hasattr(im, "tag_v2"): - # preserve tags from original TIFF image file - for key in ( - RESOLUTION_UNIT, - X_RESOLUTION, - Y_RESOLUTION, - IPTC_NAA_CHUNK, - PHOTOSHOP_CHUNK, - XMP, - ): - if key in im.tag_v2: - if key == IPTC_NAA_CHUNK and im.tag_v2.tagtype[key] not in ( - TiffTags.BYTE, - TiffTags.UNDEFINED, - ): - del supplied_tags[key] - else: - ifd[key] = im.tag_v2[key] - ifd.tagtype[key] = im.tag_v2.tagtype[key] - - # preserve ICC profile (should also work when saving other formats - # which support profiles as TIFF) -- 2008-06-06 Florian Hoech - icc = encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - ifd[ICCPROFILE] = icc - - for key, name in [ - (IMAGEDESCRIPTION, "description"), - (X_RESOLUTION, "resolution"), - (Y_RESOLUTION, "resolution"), - (X_RESOLUTION, "x_resolution"), - (Y_RESOLUTION, "y_resolution"), - (RESOLUTION_UNIT, "resolution_unit"), - (SOFTWARE, "software"), - (DATE_TIME, "date_time"), - (ARTIST, "artist"), - (COPYRIGHT, "copyright"), - ]: - if name in encoderinfo: - ifd[key] = encoderinfo[name] - - dpi = encoderinfo.get("dpi") - if dpi: - ifd[RESOLUTION_UNIT] = 2 - ifd[X_RESOLUTION] = dpi[0] - ifd[Y_RESOLUTION] = dpi[1] - - if bits != (1,): - ifd[BITSPERSAMPLE] = bits - if len(bits) != 1: - ifd[SAMPLESPERPIXEL] = len(bits) - if extra is not None: - ifd[EXTRASAMPLES] = extra - if format != 1: - ifd[SAMPLEFORMAT] = format - - if PHOTOMETRIC_INTERPRETATION not in ifd: - ifd[PHOTOMETRIC_INTERPRETATION] = photo - elif im.mode in ("1", "L") and ifd[PHOTOMETRIC_INTERPRETATION] == 0: - if im.mode == "1": - inverted_im = im.copy() - px = inverted_im.load() - if px is not None: - for y in range(inverted_im.height): - for x in range(inverted_im.width): - px[x, y] = 0 if px[x, y] == 255 else 255 - im = inverted_im - else: - im = ImageOps.invert(im) - - if im.mode in ["P", "PA"]: - lut = im.im.getpalette("RGB", "RGB;L") - colormap = [] - colors = len(lut) // 3 - for i in range(3): - colormap += [v * 256 for v in lut[colors * i : colors * (i + 1)]] - colormap += [0] * (256 - colors) - ifd[COLORMAP] = colormap - # data orientation - w, h = ifd[IMAGEWIDTH], ifd[IMAGELENGTH] - stride = len(bits) * ((w * bits[0] + 7) // 8) - if ROWSPERSTRIP not in ifd: - # aim for given strip size (64 KB by default) when using libtiff writer - if libtiff: - im_strip_size = encoderinfo.get("strip_size", STRIP_SIZE) - rows_per_strip = 1 if stride == 0 else min(im_strip_size // stride, h) - # JPEG encoder expects multiple of 8 rows - if compression == "jpeg": - rows_per_strip = min(((rows_per_strip + 7) // 8) * 8, h) - else: - rows_per_strip = h - if rows_per_strip == 0: - rows_per_strip = 1 - ifd[ROWSPERSTRIP] = rows_per_strip - strip_byte_counts = 1 if stride == 0 else stride * ifd[ROWSPERSTRIP] - strips_per_image = (h + ifd[ROWSPERSTRIP] - 1) // ifd[ROWSPERSTRIP] - if strip_byte_counts >= 2**16: - ifd.tagtype[STRIPBYTECOUNTS] = TiffTags.LONG - ifd[STRIPBYTECOUNTS] = (strip_byte_counts,) * (strips_per_image - 1) + ( - stride * h - strip_byte_counts * (strips_per_image - 1), - ) - ifd[STRIPOFFSETS] = tuple( - range(0, strip_byte_counts * strips_per_image, strip_byte_counts) - ) # this is adjusted by IFD writer - # no compression by default: - ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) - - if im.mode == "YCbCr": - for tag, default_value in { - YCBCRSUBSAMPLING: (1, 1), - REFERENCEBLACKWHITE: (0, 255, 128, 255, 128, 255), - }.items(): - ifd.setdefault(tag, default_value) - - blocklist = [TILEWIDTH, TILELENGTH, TILEOFFSETS, TILEBYTECOUNTS] - if libtiff: - if "quality" in encoderinfo: - quality = encoderinfo["quality"] - if not isinstance(quality, int) or quality < 0 or quality > 100: - msg = "Invalid quality setting" - raise ValueError(msg) - if compression != "jpeg": - msg = "quality setting only supported for 'jpeg' compression" - raise ValueError(msg) - ifd[JPEGQUALITY] = quality - - logger.debug("Saving using libtiff encoder") - logger.debug("Items: %s", sorted(ifd.items())) - _fp = 0 - if hasattr(fp, "fileno"): - try: - fp.seek(0) - _fp = fp.fileno() - except io.UnsupportedOperation: - pass - - # optional types for non core tags - types = {} - # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library - # based on the data in the strip. - # OSUBFILETYPE is deprecated. - # The other tags expect arrays with a certain length (fixed or depending on - # BITSPERSAMPLE, etc), passing arrays with a different length will result in - # segfaults. Block these tags until we add extra validation. - # SUBIFD may also cause a segfault. - blocklist += [ - OSUBFILETYPE, - REFERENCEBLACKWHITE, - STRIPBYTECOUNTS, - STRIPOFFSETS, - TRANSFERFUNCTION, - SUBIFD, - ] - - # bits per sample is a single short in the tiff directory, not a list. - atts: dict[int, Any] = {BITSPERSAMPLE: bits[0]} - # Merge the ones that we have with (optional) more bits from - # the original file, e.g x,y resolution so that we can - # save(load('')) == original file. - for tag, value in itertools.chain(ifd.items(), supplied_tags.items()): - # Libtiff can only process certain core items without adding - # them to the custom dictionary. - # Custom items are supported for int, float, unicode, string and byte - # values. Other types and tuples require a tagtype. - if tag not in TiffTags.LIBTIFF_CORE: - if not getattr(Image.core, "libtiff_support_custom_tags", False): - continue - - if tag in TiffTags.TAGS_V2_GROUPS: - types[tag] = TiffTags.LONG8 - elif tag in ifd.tagtype: - types[tag] = ifd.tagtype[tag] - elif not (isinstance(value, (int, float, str, bytes))): - continue - else: - type = TiffTags.lookup(tag).type - if type: - types[tag] = type - if tag not in atts and tag not in blocklist: - if isinstance(value, str): - atts[tag] = value.encode("ascii", "replace") + b"\0" - elif isinstance(value, IFDRational): - atts[tag] = float(value) - else: - atts[tag] = value - - if SAMPLEFORMAT in atts and len(atts[SAMPLEFORMAT]) == 1: - atts[SAMPLEFORMAT] = atts[SAMPLEFORMAT][0] - - logger.debug("Converted items: %s", sorted(atts.items())) - - # libtiff always expects the bytes in native order. - # we're storing image byte order. So, if the rawmode - # contains I;16, we need to convert from native to image - # byte order. - if im.mode in ("I;16B", "I;16"): - rawmode = "I;16N" - - # Pass tags as sorted list so that the tags are set in a fixed order. - # This is required by libtiff for some tags. For example, the JPEGQUALITY - # pseudo tag requires that the COMPRESS tag was already set. - tags = list(atts.items()) - tags.sort() - a = (rawmode, compression, _fp, filename, tags, types) - encoder = Image._getencoder(im.mode, "libtiff", a, encoderconfig) - encoder.setimage(im.im, (0, 0) + im.size) - while True: - errcode, data = encoder.encode(ImageFile.MAXBLOCK)[1:] - if not _fp: - fp.write(data) - if errcode: - break - if errcode < 0: - msg = f"encoder error {errcode} when writing image file" - raise OSError(msg) - - else: - for tag in blocklist: - del ifd[tag] - offset = ifd.save(fp) - - ImageFile._save( - im, - fp, - [ImageFile._Tile("raw", (0, 0) + im.size, offset, (rawmode, stride, 1))], - ) - - # -- helper for multi-page save -- - if "_debug_multipage" in encoderinfo: - # just to access o32 and o16 (using correct byte order) - setattr(im, "_debug_multipage", ifd) - - -class AppendingTiffWriter(io.BytesIO): - fieldSizes = [ - 0, # None - 1, # byte - 1, # ascii - 2, # short - 4, # long - 8, # rational - 1, # sbyte - 1, # undefined - 2, # sshort - 4, # slong - 8, # srational - 4, # float - 8, # double - 4, # ifd - 2, # unicode - 4, # complex - 8, # long8 - ] - - Tags = { - 273, # StripOffsets - 288, # FreeOffsets - 324, # TileOffsets - 519, # JPEGQTables - 520, # JPEGDCTables - 521, # JPEGACTables - } - - def __init__(self, fn: StrOrBytesPath | IO[bytes], new: bool = False) -> None: - self.f: IO[bytes] - if is_path(fn): - self.name = fn - self.close_fp = True - try: - self.f = open(fn, "w+b" if new else "r+b") - except OSError: - self.f = open(fn, "w+b") - else: - self.f = cast(IO[bytes], fn) - self.close_fp = False - self.beginning = self.f.tell() - self.setup() - - def setup(self) -> None: - # Reset everything. - self.f.seek(self.beginning, os.SEEK_SET) - - self.whereToWriteNewIFDOffset: int | None = None - self.offsetOfNewPage = 0 - - self.IIMM = iimm = self.f.read(4) - self._bigtiff = b"\x2b" in iimm - if not iimm: - # empty file - first page - self.isFirst = True - return - - self.isFirst = False - if iimm not in PREFIXES: - msg = "Invalid TIFF file header" - raise RuntimeError(msg) - - self.setEndian("<" if iimm.startswith(II) else ">") - - if self._bigtiff: - self.f.seek(4, os.SEEK_CUR) - self.skipIFDs() - self.goToEnd() - - def finalize(self) -> None: - if self.isFirst: - return - - # fix offsets - self.f.seek(self.offsetOfNewPage) - - iimm = self.f.read(4) - if not iimm: - # Make it easy to finish a frame without committing to a new one. - return - - if iimm != self.IIMM: - msg = "IIMM of new page doesn't match IIMM of first page" - raise RuntimeError(msg) - - if self._bigtiff: - self.f.seek(4, os.SEEK_CUR) - ifd_offset = self._read(8 if self._bigtiff else 4) - ifd_offset += self.offsetOfNewPage - assert self.whereToWriteNewIFDOffset is not None - self.f.seek(self.whereToWriteNewIFDOffset) - self._write(ifd_offset, 8 if self._bigtiff else 4) - self.f.seek(ifd_offset) - self.fixIFD() - - def newFrame(self) -> None: - # Call this to finish a frame. - self.finalize() - self.setup() - - def __enter__(self) -> AppendingTiffWriter: - return self - - def __exit__(self, *args: object) -> None: - if self.close_fp: - self.close() - - def tell(self) -> int: - return self.f.tell() - self.offsetOfNewPage - - def seek(self, offset: int, whence: int = io.SEEK_SET) -> int: - """ - :param offset: Distance to seek. - :param whence: Whether the distance is relative to the start, - end or current position. - :returns: The resulting position, relative to the start. - """ - if whence == os.SEEK_SET: - offset += self.offsetOfNewPage - - self.f.seek(offset, whence) - return self.tell() - - def goToEnd(self) -> None: - self.f.seek(0, os.SEEK_END) - pos = self.f.tell() - - # pad to 16 byte boundary - pad_bytes = 16 - pos % 16 - if 0 < pad_bytes < 16: - self.f.write(bytes(pad_bytes)) - self.offsetOfNewPage = self.f.tell() - - def setEndian(self, endian: str) -> None: - self.endian = endian - self.longFmt = f"{self.endian}L" - self.shortFmt = f"{self.endian}H" - self.tagFormat = f"{self.endian}HH" + ("Q" if self._bigtiff else "L") - - def skipIFDs(self) -> None: - while True: - ifd_offset = self._read(8 if self._bigtiff else 4) - if ifd_offset == 0: - self.whereToWriteNewIFDOffset = self.f.tell() - ( - 8 if self._bigtiff else 4 - ) - break - - self.f.seek(ifd_offset) - num_tags = self._read(8 if self._bigtiff else 2) - self.f.seek(num_tags * (20 if self._bigtiff else 12), os.SEEK_CUR) - - def write(self, data: Buffer, /) -> int: - return self.f.write(data) - - def _fmt(self, field_size: int) -> str: - try: - return {2: "H", 4: "L", 8: "Q"}[field_size] - except KeyError: - msg = "offset is not supported" - raise RuntimeError(msg) - - def _read(self, field_size: int) -> int: - (value,) = struct.unpack( - self.endian + self._fmt(field_size), self.f.read(field_size) - ) - return value - - def readShort(self) -> int: - return self._read(2) - - def readLong(self) -> int: - return self._read(4) - - @staticmethod - def _verify_bytes_written(bytes_written: int | None, expected: int) -> None: - if bytes_written is not None and bytes_written != expected: - msg = f"wrote only {bytes_written} bytes but wanted {expected}" - raise RuntimeError(msg) - - def _rewriteLast( - self, value: int, field_size: int, new_field_size: int = 0 - ) -> None: - self.f.seek(-field_size, os.SEEK_CUR) - if not new_field_size: - new_field_size = field_size - bytes_written = self.f.write( - struct.pack(self.endian + self._fmt(new_field_size), value) - ) - self._verify_bytes_written(bytes_written, new_field_size) - - def rewriteLastShortToLong(self, value: int) -> None: - self._rewriteLast(value, 2, 4) - - def rewriteLastShort(self, value: int) -> None: - return self._rewriteLast(value, 2) - - def rewriteLastLong(self, value: int) -> None: - return self._rewriteLast(value, 4) - - def _write(self, value: int, field_size: int) -> None: - bytes_written = self.f.write( - struct.pack(self.endian + self._fmt(field_size), value) - ) - self._verify_bytes_written(bytes_written, field_size) - - def writeShort(self, value: int) -> None: - self._write(value, 2) - - def writeLong(self, value: int) -> None: - self._write(value, 4) - - def close(self) -> None: - self.finalize() - if self.close_fp: - self.f.close() - - def fixIFD(self) -> None: - num_tags = self._read(8 if self._bigtiff else 2) - - for i in range(num_tags): - tag, field_type, count = struct.unpack( - self.tagFormat, self.f.read(12 if self._bigtiff else 8) - ) - - field_size = self.fieldSizes[field_type] - total_size = field_size * count - fmt_size = 8 if self._bigtiff else 4 - is_local = total_size <= fmt_size - if not is_local: - offset = self._read(fmt_size) + self.offsetOfNewPage - self._rewriteLast(offset, fmt_size) - - if tag in self.Tags: - cur_pos = self.f.tell() - - logger.debug( - "fixIFD: %s (%d) - type: %s (%d) - type size: %d - count: %d", - TiffTags.lookup(tag).name, - tag, - TYPES.get(field_type, "unknown"), - field_type, - field_size, - count, - ) - - if is_local: - self._fixOffsets(count, field_size) - self.f.seek(cur_pos + fmt_size) - else: - self.f.seek(offset) - self._fixOffsets(count, field_size) - self.f.seek(cur_pos) - - elif is_local: - # skip the locally stored value that is not an offset - self.f.seek(fmt_size, os.SEEK_CUR) - - def _fixOffsets(self, count: int, field_size: int) -> None: - for i in range(count): - offset = self._read(field_size) - offset += self.offsetOfNewPage - - new_field_size = 0 - if self._bigtiff and field_size in (2, 4) and offset >= 2**32: - # offset is now too large - we must convert long to long8 - new_field_size = 8 - elif field_size == 2 and offset >= 2**16: - # offset is now too large - we must convert short to long - new_field_size = 4 - if new_field_size: - if count != 1: - msg = "not implemented" - raise RuntimeError(msg) # XXX TODO - - # simple case - the offset is just one and therefore it is - # local (not referenced with another offset) - self._rewriteLast(offset, field_size, new_field_size) - # Move back past the new offset, past 'count', and before 'field_type' - rewind = -new_field_size - 4 - 2 - self.f.seek(rewind, os.SEEK_CUR) - self.writeShort(new_field_size) # rewrite the type - self.f.seek(2 - rewind, os.SEEK_CUR) - else: - self._rewriteLast(offset, field_size) - - def fixOffsets( - self, count: int, isShort: bool = False, isLong: bool = False - ) -> None: - if isShort: - field_size = 2 - elif isLong: - field_size = 4 - else: - field_size = 0 - return self._fixOffsets(count, field_size) - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - append_images = list(im.encoderinfo.get("append_images", [])) - if not hasattr(im, "n_frames") and not append_images: - return _save(im, fp, filename) - - cur_idx = im.tell() - try: - with AppendingTiffWriter(fp) as tf: - for ims in [im] + append_images: - if not hasattr(ims, "encoderinfo"): - ims.encoderinfo = {} - if not hasattr(ims, "encoderconfig"): - ims.encoderconfig = () - nfr = getattr(ims, "n_frames", 1) - - for idx in range(nfr): - ims.seek(idx) - ims.load() - _save(ims, tf, filename) - tf.newFrame() - finally: - im.seek(cur_idx) - - -# -# -------------------------------------------------------------------- -# Register - -Image.register_open(TiffImageFile.format, TiffImageFile, _accept) -Image.register_save(TiffImageFile.format, _save) -Image.register_save_all(TiffImageFile.format, _save_all) - -Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"]) - -Image.register_mime(TiffImageFile.format, "image/tiff") diff --git a/.venv/lib/python3.10/site-packages/PIL/TiffTags.py b/.venv/lib/python3.10/site-packages/PIL/TiffTags.py deleted file mode 100644 index 86adaa4..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/TiffTags.py +++ /dev/null @@ -1,562 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TIFF tags -# -# This module provides clear-text names for various well-known -# TIFF tags. the TIFF codec works just fine without it. -# -# Copyright (c) Secret Labs AB 1999. -# -# See the README file for information on usage and redistribution. -# - -## -# This module provides constants and clear-text names for various -# well-known TIFF tags. -## -from __future__ import annotations - -from typing import NamedTuple - - -class _TagInfo(NamedTuple): - value: int | None - name: str - type: int | None - length: int | None - enum: dict[str, int] - - -class TagInfo(_TagInfo): - __slots__: list[str] = [] - - def __new__( - cls, - value: int | None = None, - name: str = "unknown", - type: int | None = None, - length: int | None = None, - enum: dict[str, int] | None = None, - ) -> TagInfo: - return super().__new__(cls, value, name, type, length, enum or {}) - - def cvt_enum(self, value: str) -> int | str: - # Using get will call hash(value), which can be expensive - # for some types (e.g. Fraction). Since self.enum is rarely - # used, it's usually better to test it first. - return self.enum.get(value, value) if self.enum else value - - -def lookup(tag: int, group: int | None = None) -> TagInfo: - """ - :param tag: Integer tag number - :param group: Which :py:data:`~PIL.TiffTags.TAGS_V2_GROUPS` to look in - - .. versionadded:: 8.3.0 - - :returns: Taginfo namedtuple, From the ``TAGS_V2`` info if possible, - otherwise just populating the value and name from ``TAGS``. - If the tag is not recognized, "unknown" is returned for the name - - """ - - if group is not None: - info = TAGS_V2_GROUPS[group].get(tag) if group in TAGS_V2_GROUPS else None - else: - info = TAGS_V2.get(tag) - return info or TagInfo(tag, TAGS.get(tag, "unknown")) - - -## -# Map tag numbers to tag info. -# -# id: (Name, Type, Length[, enum_values]) -# -# The length here differs from the length in the tiff spec. For -# numbers, the tiff spec is for the number of fields returned. We -# agree here. For string-like types, the tiff spec uses the length of -# field in bytes. In Pillow, we are using the number of expected -# fields, in general 1 for string-like types. - - -BYTE = 1 -ASCII = 2 -SHORT = 3 -LONG = 4 -RATIONAL = 5 -SIGNED_BYTE = 6 -UNDEFINED = 7 -SIGNED_SHORT = 8 -SIGNED_LONG = 9 -SIGNED_RATIONAL = 10 -FLOAT = 11 -DOUBLE = 12 -IFD = 13 -LONG8 = 16 - -_tags_v2: dict[int, tuple[str, int, int] | tuple[str, int, int, dict[str, int]]] = { - 254: ("NewSubfileType", LONG, 1), - 255: ("SubfileType", SHORT, 1), - 256: ("ImageWidth", LONG, 1), - 257: ("ImageLength", LONG, 1), - 258: ("BitsPerSample", SHORT, 0), - 259: ( - "Compression", - SHORT, - 1, - { - "Uncompressed": 1, - "CCITT 1d": 2, - "Group 3 Fax": 3, - "Group 4 Fax": 4, - "LZW": 5, - "JPEG": 6, - "PackBits": 32773, - }, - ), - 262: ( - "PhotometricInterpretation", - SHORT, - 1, - { - "WhiteIsZero": 0, - "BlackIsZero": 1, - "RGB": 2, - "RGB Palette": 3, - "Transparency Mask": 4, - "CMYK": 5, - "YCbCr": 6, - "CieLAB": 8, - "CFA": 32803, # TIFF/EP, Adobe DNG - "LinearRaw": 32892, # Adobe DNG - }, - ), - 263: ("Threshholding", SHORT, 1), - 264: ("CellWidth", SHORT, 1), - 265: ("CellLength", SHORT, 1), - 266: ("FillOrder", SHORT, 1), - 269: ("DocumentName", ASCII, 1), - 270: ("ImageDescription", ASCII, 1), - 271: ("Make", ASCII, 1), - 272: ("Model", ASCII, 1), - 273: ("StripOffsets", LONG, 0), - 274: ("Orientation", SHORT, 1), - 277: ("SamplesPerPixel", SHORT, 1), - 278: ("RowsPerStrip", LONG, 1), - 279: ("StripByteCounts", LONG, 0), - 280: ("MinSampleValue", SHORT, 0), - 281: ("MaxSampleValue", SHORT, 0), - 282: ("XResolution", RATIONAL, 1), - 283: ("YResolution", RATIONAL, 1), - 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), - 285: ("PageName", ASCII, 1), - 286: ("XPosition", RATIONAL, 1), - 287: ("YPosition", RATIONAL, 1), - 288: ("FreeOffsets", LONG, 1), - 289: ("FreeByteCounts", LONG, 1), - 290: ("GrayResponseUnit", SHORT, 1), - 291: ("GrayResponseCurve", SHORT, 0), - 292: ("T4Options", LONG, 1), - 293: ("T6Options", LONG, 1), - 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), - 297: ("PageNumber", SHORT, 2), - 301: ("TransferFunction", SHORT, 0), - 305: ("Software", ASCII, 1), - 306: ("DateTime", ASCII, 1), - 315: ("Artist", ASCII, 1), - 316: ("HostComputer", ASCII, 1), - 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), - 318: ("WhitePoint", RATIONAL, 2), - 319: ("PrimaryChromaticities", RATIONAL, 6), - 320: ("ColorMap", SHORT, 0), - 321: ("HalftoneHints", SHORT, 2), - 322: ("TileWidth", LONG, 1), - 323: ("TileLength", LONG, 1), - 324: ("TileOffsets", LONG, 0), - 325: ("TileByteCounts", LONG, 0), - 330: ("SubIFDs", LONG, 0), - 332: ("InkSet", SHORT, 1), - 333: ("InkNames", ASCII, 1), - 334: ("NumberOfInks", SHORT, 1), - 336: ("DotRange", SHORT, 0), - 337: ("TargetPrinter", ASCII, 1), - 338: ("ExtraSamples", SHORT, 0), - 339: ("SampleFormat", SHORT, 0), - 340: ("SMinSampleValue", DOUBLE, 0), - 341: ("SMaxSampleValue", DOUBLE, 0), - 342: ("TransferRange", SHORT, 6), - 347: ("JPEGTables", UNDEFINED, 1), - # obsolete JPEG tags - 512: ("JPEGProc", SHORT, 1), - 513: ("JPEGInterchangeFormat", LONG, 1), - 514: ("JPEGInterchangeFormatLength", LONG, 1), - 515: ("JPEGRestartInterval", SHORT, 1), - 517: ("JPEGLosslessPredictors", SHORT, 0), - 518: ("JPEGPointTransforms", SHORT, 0), - 519: ("JPEGQTables", LONG, 0), - 520: ("JPEGDCTables", LONG, 0), - 521: ("JPEGACTables", LONG, 0), - 529: ("YCbCrCoefficients", RATIONAL, 3), - 530: ("YCbCrSubSampling", SHORT, 2), - 531: ("YCbCrPositioning", SHORT, 1), - 532: ("ReferenceBlackWhite", RATIONAL, 6), - 700: ("XMP", BYTE, 0), - 33432: ("Copyright", ASCII, 1), - 33723: ("IptcNaaInfo", UNDEFINED, 1), - 34377: ("PhotoshopInfo", BYTE, 0), - # FIXME add more tags here - 34665: ("ExifIFD", LONG, 1), - 34675: ("ICCProfile", UNDEFINED, 1), - 34853: ("GPSInfoIFD", LONG, 1), - 36864: ("ExifVersion", UNDEFINED, 1), - 37724: ("ImageSourceData", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - # MPInfo - 45056: ("MPFVersion", UNDEFINED, 1), - 45057: ("NumberOfImages", LONG, 1), - 45058: ("MPEntry", UNDEFINED, 1), - 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check - 45060: ("TotalFrames", LONG, 1), - 45313: ("MPIndividualNum", LONG, 1), - 45569: ("PanOrientation", LONG, 1), - 45570: ("PanOverlap_H", RATIONAL, 1), - 45571: ("PanOverlap_V", RATIONAL, 1), - 45572: ("BaseViewpointNum", LONG, 1), - 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), - 45574: ("BaselineLength", RATIONAL, 1), - 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), - 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), - 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), - 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), - 45579: ("YawAngle", SIGNED_RATIONAL, 1), - 45580: ("PitchAngle", SIGNED_RATIONAL, 1), - 45581: ("RollAngle", SIGNED_RATIONAL, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), - 50780: ("BestQualityScale", RATIONAL, 1), - 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one - 50839: ("ImageJMetaData", UNDEFINED, 1), # see Issue #2006 -} -_tags_v2_groups = { - # ExifIFD - 34665: { - 36864: ("ExifVersion", UNDEFINED, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - }, - # GPSInfoIFD - 34853: { - 0: ("GPSVersionID", BYTE, 4), - 1: ("GPSLatitudeRef", ASCII, 2), - 2: ("GPSLatitude", RATIONAL, 3), - 3: ("GPSLongitudeRef", ASCII, 2), - 4: ("GPSLongitude", RATIONAL, 3), - 5: ("GPSAltitudeRef", BYTE, 1), - 6: ("GPSAltitude", RATIONAL, 1), - 7: ("GPSTimeStamp", RATIONAL, 3), - 8: ("GPSSatellites", ASCII, 0), - 9: ("GPSStatus", ASCII, 2), - 10: ("GPSMeasureMode", ASCII, 2), - 11: ("GPSDOP", RATIONAL, 1), - 12: ("GPSSpeedRef", ASCII, 2), - 13: ("GPSSpeed", RATIONAL, 1), - 14: ("GPSTrackRef", ASCII, 2), - 15: ("GPSTrack", RATIONAL, 1), - 16: ("GPSImgDirectionRef", ASCII, 2), - 17: ("GPSImgDirection", RATIONAL, 1), - 18: ("GPSMapDatum", ASCII, 0), - 19: ("GPSDestLatitudeRef", ASCII, 2), - 20: ("GPSDestLatitude", RATIONAL, 3), - 21: ("GPSDestLongitudeRef", ASCII, 2), - 22: ("GPSDestLongitude", RATIONAL, 3), - 23: ("GPSDestBearingRef", ASCII, 2), - 24: ("GPSDestBearing", RATIONAL, 1), - 25: ("GPSDestDistanceRef", ASCII, 2), - 26: ("GPSDestDistance", RATIONAL, 1), - 27: ("GPSProcessingMethod", UNDEFINED, 0), - 28: ("GPSAreaInformation", UNDEFINED, 0), - 29: ("GPSDateStamp", ASCII, 11), - 30: ("GPSDifferential", SHORT, 1), - }, - # InteroperabilityIFD - 40965: {1: ("InteropIndex", ASCII, 1), 2: ("InteropVersion", UNDEFINED, 1)}, -} - -# Legacy Tags structure -# these tags aren't included above, but were in the previous versions -TAGS: dict[int | tuple[int, int], str] = { - 347: "JPEGTables", - 700: "XMP", - # Additional Exif Info - 32932: "Wang Annotation", - 33434: "ExposureTime", - 33437: "FNumber", - 33445: "MD FileTag", - 33446: "MD ScalePixel", - 33447: "MD ColorTable", - 33448: "MD LabName", - 33449: "MD SampleInfo", - 33450: "MD PrepDate", - 33451: "MD PrepTime", - 33452: "MD FileUnits", - 33550: "ModelPixelScaleTag", - 33723: "IptcNaaInfo", - 33918: "INGR Packet Data Tag", - 33919: "INGR Flag Registers", - 33920: "IrasB Transformation Matrix", - 33922: "ModelTiepointTag", - 34264: "ModelTransformationTag", - 34377: "PhotoshopInfo", - 34735: "GeoKeyDirectoryTag", - 34736: "GeoDoubleParamsTag", - 34737: "GeoAsciiParamsTag", - 34850: "ExposureProgram", - 34852: "SpectralSensitivity", - 34855: "ISOSpeedRatings", - 34856: "OECF", - 34864: "SensitivityType", - 34865: "StandardOutputSensitivity", - 34866: "RecommendedExposureIndex", - 34867: "ISOSpeed", - 34868: "ISOSpeedLatitudeyyy", - 34869: "ISOSpeedLatitudezzz", - 34908: "HylaFAX FaxRecvParams", - 34909: "HylaFAX FaxSubAddress", - 34910: "HylaFAX FaxRecvTime", - 36864: "ExifVersion", - 36867: "DateTimeOriginal", - 36868: "DateTimeDigitized", - 37121: "ComponentsConfiguration", - 37122: "CompressedBitsPerPixel", - 37724: "ImageSourceData", - 37377: "ShutterSpeedValue", - 37378: "ApertureValue", - 37379: "BrightnessValue", - 37380: "ExposureBiasValue", - 37381: "MaxApertureValue", - 37382: "SubjectDistance", - 37383: "MeteringMode", - 37384: "LightSource", - 37385: "Flash", - 37386: "FocalLength", - 37396: "SubjectArea", - 37500: "MakerNote", - 37510: "UserComment", - 37520: "SubSec", - 37521: "SubSecTimeOriginal", - 37522: "SubsecTimeDigitized", - 40960: "FlashPixVersion", - 40961: "ColorSpace", - 40962: "PixelXDimension", - 40963: "PixelYDimension", - 40964: "RelatedSoundFile", - 40965: "InteroperabilityIFD", - 41483: "FlashEnergy", - 41484: "SpatialFrequencyResponse", - 41486: "FocalPlaneXResolution", - 41487: "FocalPlaneYResolution", - 41488: "FocalPlaneResolutionUnit", - 41492: "SubjectLocation", - 41493: "ExposureIndex", - 41495: "SensingMethod", - 41728: "FileSource", - 41729: "SceneType", - 41730: "CFAPattern", - 41985: "CustomRendered", - 41986: "ExposureMode", - 41987: "WhiteBalance", - 41988: "DigitalZoomRatio", - 41989: "FocalLengthIn35mmFilm", - 41990: "SceneCaptureType", - 41991: "GainControl", - 41992: "Contrast", - 41993: "Saturation", - 41994: "Sharpness", - 41995: "DeviceSettingDescription", - 41996: "SubjectDistanceRange", - 42016: "ImageUniqueID", - 42032: "CameraOwnerName", - 42033: "BodySerialNumber", - 42034: "LensSpecification", - 42035: "LensMake", - 42036: "LensModel", - 42037: "LensSerialNumber", - 42112: "GDAL_METADATA", - 42113: "GDAL_NODATA", - 42240: "Gamma", - 50215: "Oce Scanjob Description", - 50216: "Oce Application Selector", - 50217: "Oce Identification Number", - 50218: "Oce ImageLogic Characteristics", - # Adobe DNG - 50706: "DNGVersion", - 50707: "DNGBackwardVersion", - 50708: "UniqueCameraModel", - 50709: "LocalizedCameraModel", - 50710: "CFAPlaneColor", - 50711: "CFALayout", - 50712: "LinearizationTable", - 50713: "BlackLevelRepeatDim", - 50714: "BlackLevel", - 50715: "BlackLevelDeltaH", - 50716: "BlackLevelDeltaV", - 50717: "WhiteLevel", - 50718: "DefaultScale", - 50719: "DefaultCropOrigin", - 50720: "DefaultCropSize", - 50721: "ColorMatrix1", - 50722: "ColorMatrix2", - 50723: "CameraCalibration1", - 50724: "CameraCalibration2", - 50725: "ReductionMatrix1", - 50726: "ReductionMatrix2", - 50727: "AnalogBalance", - 50728: "AsShotNeutral", - 50729: "AsShotWhiteXY", - 50730: "BaselineExposure", - 50731: "BaselineNoise", - 50732: "BaselineSharpness", - 50733: "BayerGreenSplit", - 50734: "LinearResponseLimit", - 50735: "CameraSerialNumber", - 50736: "LensInfo", - 50737: "ChromaBlurRadius", - 50738: "AntiAliasStrength", - 50740: "DNGPrivateData", - 50778: "CalibrationIlluminant1", - 50779: "CalibrationIlluminant2", - 50784: "Alias Layer Metadata", -} - -TAGS_V2: dict[int, TagInfo] = {} -TAGS_V2_GROUPS: dict[int, dict[int, TagInfo]] = {} - - -def _populate() -> None: - for k, v in _tags_v2.items(): - # Populate legacy structure. - TAGS[k] = v[0] - if len(v) == 4: - for sk, sv in v[3].items(): - TAGS[(k, sv)] = sk - - TAGS_V2[k] = TagInfo(k, *v) - - for group, tags in _tags_v2_groups.items(): - TAGS_V2_GROUPS[group] = {k: TagInfo(k, *v) for k, v in tags.items()} - - -_populate() -## -# Map type numbers to type names -- defined in ImageFileDirectory. - -TYPES: dict[int, str] = {} - -# -# These tags are handled by default in libtiff, without -# adding to the custom dictionary. From tif_dir.c, searching for -# case TIFFTAG in the _TIFFVSetField function: -# Line: item. -# 148: case TIFFTAG_SUBFILETYPE: -# 151: case TIFFTAG_IMAGEWIDTH: -# 154: case TIFFTAG_IMAGELENGTH: -# 157: case TIFFTAG_BITSPERSAMPLE: -# 181: case TIFFTAG_COMPRESSION: -# 202: case TIFFTAG_PHOTOMETRIC: -# 205: case TIFFTAG_THRESHHOLDING: -# 208: case TIFFTAG_FILLORDER: -# 214: case TIFFTAG_ORIENTATION: -# 221: case TIFFTAG_SAMPLESPERPIXEL: -# 228: case TIFFTAG_ROWSPERSTRIP: -# 238: case TIFFTAG_MINSAMPLEVALUE: -# 241: case TIFFTAG_MAXSAMPLEVALUE: -# 244: case TIFFTAG_SMINSAMPLEVALUE: -# 247: case TIFFTAG_SMAXSAMPLEVALUE: -# 250: case TIFFTAG_XRESOLUTION: -# 256: case TIFFTAG_YRESOLUTION: -# 262: case TIFFTAG_PLANARCONFIG: -# 268: case TIFFTAG_XPOSITION: -# 271: case TIFFTAG_YPOSITION: -# 274: case TIFFTAG_RESOLUTIONUNIT: -# 280: case TIFFTAG_PAGENUMBER: -# 284: case TIFFTAG_HALFTONEHINTS: -# 288: case TIFFTAG_COLORMAP: -# 294: case TIFFTAG_EXTRASAMPLES: -# 298: case TIFFTAG_MATTEING: -# 305: case TIFFTAG_TILEWIDTH: -# 316: case TIFFTAG_TILELENGTH: -# 327: case TIFFTAG_TILEDEPTH: -# 333: case TIFFTAG_DATATYPE: -# 344: case TIFFTAG_SAMPLEFORMAT: -# 361: case TIFFTAG_IMAGEDEPTH: -# 364: case TIFFTAG_SUBIFD: -# 376: case TIFFTAG_YCBCRPOSITIONING: -# 379: case TIFFTAG_YCBCRSUBSAMPLING: -# 383: case TIFFTAG_TRANSFERFUNCTION: -# 389: case TIFFTAG_REFERENCEBLACKWHITE: -# 393: case TIFFTAG_INKNAMES: - -# Following pseudo-tags are also handled by default in libtiff: -# TIFFTAG_JPEGQUALITY 65537 - -# some of these are not in our TAGS_V2 dict and were included from tiff.h - -# This list also exists in encode.c -LIBTIFF_CORE = { - 255, - 256, - 257, - 258, - 259, - 262, - 263, - 266, - 274, - 277, - 278, - 280, - 281, - 340, - 341, - 282, - 283, - 284, - 286, - 287, - 296, - 297, - 321, - 320, - 338, - 32995, - 322, - 323, - 32998, - 32996, - 339, - 32997, - 330, - 531, - 530, - 301, - 532, - 333, - # as above - 269, # this has been in our tests forever, and works - 65537, -} - -LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes -LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff -LIBTIFF_CORE.remove(323) # Tiled images -LIBTIFF_CORE.remove(333) # Ink Names either - -# Note to advanced users: There may be combinations of these -# parameters and values that when added properly, will work and -# produce valid tiff images that may work in your application. -# It is safe to add and remove tags from this set from Pillow's point -# of view so long as you test against libtiff. diff --git a/.venv/lib/python3.10/site-packages/PIL/WalImageFile.py b/.venv/lib/python3.10/site-packages/PIL/WalImageFile.py deleted file mode 100644 index 87e3287..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/WalImageFile.py +++ /dev/null @@ -1,127 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# WAL file handling -# -# History: -# 2003-04-23 fl created -# -# Copyright (c) 2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -""" -This reader is based on the specification available from: -https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml -and has been tested with a few sample files found using google. - -.. note:: - This format cannot be automatically recognized, so the reader - is not registered for use with :py:func:`PIL.Image.open()`. - To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead. -""" -from __future__ import annotations - -from typing import IO - -from . import Image, ImageFile -from ._binary import i32le as i32 -from ._typing import StrOrBytesPath - - -class WalImageFile(ImageFile.ImageFile): - format = "WAL" - format_description = "Quake2 Texture" - - def _open(self) -> None: - self._mode = "P" - - # read header fields - header = self.fp.read(32 + 24 + 32 + 12) - self._size = i32(header, 32), i32(header, 36) - Image._decompression_bomb_check(self.size) - - # load pixel data - offset = i32(header, 40) - self.fp.seek(offset) - - # strings are null-terminated - self.info["name"] = header[:32].split(b"\0", 1)[0] - next_name = header[56 : 56 + 32].split(b"\0", 1)[0] - if next_name: - self.info["next_name"] = next_name - - def load(self) -> Image.core.PixelAccess | None: - if self._im is None: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self.size[0] * self.size[1])) - self.putpalette(quake2palette) - return Image.Image.load(self) - - -def open(filename: StrOrBytesPath | IO[bytes]) -> WalImageFile: - """ - Load texture from a Quake2 WAL texture file. - - By default, a Quake2 standard palette is attached to the texture. - To override the palette, use the :py:func:`PIL.Image.Image.putpalette()` method. - - :param filename: WAL file name, or an opened file handle. - :returns: An image instance. - """ - return WalImageFile(filename) - - -quake2palette = ( - # default palette taken from piffo 0.93 by Hans Häggström - b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" - b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" - b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" - b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" - b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" - b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" - b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" - b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" - b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" - b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" - b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" - b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" - b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" - b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" - b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" - b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" - b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" - b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" - b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" - b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" - b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" - b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" - b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" - b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" - b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" - b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" - b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" - b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" - b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" - b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" - b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" - b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" - b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" - b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" - b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" - b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" - b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" - b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" - b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" - b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" - b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" - b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" - b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" - b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" - b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" - b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" - b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" - b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" -) diff --git a/.venv/lib/python3.10/site-packages/PIL/WebPImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/WebPImagePlugin.py deleted file mode 100644 index 1716a18..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/WebPImagePlugin.py +++ /dev/null @@ -1,320 +0,0 @@ -from __future__ import annotations - -from io import BytesIO -from typing import IO, Any - -from . import Image, ImageFile - -try: - from . import _webp - - SUPPORTED = True -except ImportError: - SUPPORTED = False - - -_VP8_MODES_BY_IDENTIFIER = { - b"VP8 ": "RGB", - b"VP8X": "RGBA", - b"VP8L": "RGBA", # lossless -} - - -def _accept(prefix: bytes) -> bool | str: - is_riff_file_format = prefix.startswith(b"RIFF") - is_webp_file = prefix[8:12] == b"WEBP" - is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER - - if is_riff_file_format and is_webp_file and is_valid_vp8_mode: - if not SUPPORTED: - return ( - "image file could not be identified because WEBP support not installed" - ) - return True - return False - - -class WebPImageFile(ImageFile.ImageFile): - format = "WEBP" - format_description = "WebP image" - __loaded = 0 - __logical_frame = 0 - - def _open(self) -> None: - # Use the newer AnimDecoder API to parse the (possibly) animated file, - # and access muxed chunks like ICC/EXIF/XMP. - self._decoder = _webp.WebPAnimDecoder(self.fp.read()) - - # Get info from decoder - self._size, loop_count, bgcolor, frame_count, mode = self._decoder.get_info() - self.info["loop"] = loop_count - bg_a, bg_r, bg_g, bg_b = ( - (bgcolor >> 24) & 0xFF, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 8) & 0xFF, - bgcolor & 0xFF, - ) - self.info["background"] = (bg_r, bg_g, bg_b, bg_a) - self.n_frames = frame_count - self.is_animated = self.n_frames > 1 - self._mode = "RGB" if mode == "RGBX" else mode - self.rawmode = mode - - # Attempt to read ICC / EXIF / XMP chunks from file - icc_profile = self._decoder.get_chunk("ICCP") - exif = self._decoder.get_chunk("EXIF") - xmp = self._decoder.get_chunk("XMP ") - if icc_profile: - self.info["icc_profile"] = icc_profile - if exif: - self.info["exif"] = exif - if xmp: - self.info["xmp"] = xmp - - # Initialize seek state - self._reset(reset=False) - - def _getexif(self) -> dict[int, Any] | None: - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - - # Set logical frame to requested position - self.__logical_frame = frame - - def _reset(self, reset: bool = True) -> None: - if reset: - self._decoder.reset() - self.__physical_frame = 0 - self.__loaded = -1 - self.__timestamp = 0 - - def _get_next(self) -> tuple[bytes, int, int]: - # Get next frame - ret = self._decoder.get_next() - self.__physical_frame += 1 - - # Check if an error occurred - if ret is None: - self._reset() # Reset just to be safe - self.seek(0) - msg = "failed to decode next frame in WebP file" - raise EOFError(msg) - - # Compute duration - data, timestamp = ret - duration = timestamp - self.__timestamp - self.__timestamp = timestamp - - # libwebp gives frame end, adjust to start of frame - timestamp -= duration - return data, timestamp, duration - - def _seek(self, frame: int) -> None: - if self.__physical_frame == frame: - return # Nothing to do - if frame < self.__physical_frame: - self._reset() # Rewind to beginning - while self.__physical_frame < frame: - self._get_next() # Advance to the requested frame - - def load(self) -> Image.core.PixelAccess | None: - if self.__loaded != self.__logical_frame: - self._seek(self.__logical_frame) - - # We need to load the image data for this frame - data, timestamp, duration = self._get_next() - self.info["timestamp"] = timestamp - self.info["duration"] = duration - self.__loaded = self.__logical_frame - - # Set tile - if self.fp and self._exclusive_fp: - self.fp.close() - self.fp = BytesIO(data) - self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 0, self.rawmode)] - - return super().load() - - def load_seek(self, pos: int) -> None: - pass - - def tell(self) -> int: - return self.__logical_frame - - -def _convert_frame(im: Image.Image) -> Image.Image: - # Make sure image mode is supported - if im.mode not in ("RGBX", "RGBA", "RGB"): - im = im.convert("RGBA" if im.has_transparency_data else "RGB") - return im - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - encoderinfo = im.encoderinfo.copy() - append_images = list(encoderinfo.get("append_images", [])) - - # If total frame count is 1, then save using the legacy API, which - # will preserve non-alpha modes - total = 0 - for ims in [im] + append_images: - total += getattr(ims, "n_frames", 1) - if total == 1: - _save(im, fp, filename) - return - - background: int | tuple[int, ...] = (0, 0, 0, 0) - if "background" in encoderinfo: - background = encoderinfo["background"] - elif "background" in im.info: - background = im.info["background"] - if isinstance(background, int): - # GifImagePlugin stores a global color table index in - # info["background"]. So it must be converted to an RGBA value - palette = im.getpalette() - if palette: - r, g, b = palette[background * 3 : (background + 1) * 3] - background = (r, g, b, 255) - else: - background = (background, background, background, 255) - - duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) - loop = im.encoderinfo.get("loop", 0) - minimize_size = im.encoderinfo.get("minimize_size", False) - kmin = im.encoderinfo.get("kmin", None) - kmax = im.encoderinfo.get("kmax", None) - allow_mixed = im.encoderinfo.get("allow_mixed", False) - verbose = False - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - alpha_quality = im.encoderinfo.get("alpha_quality", 100) - method = im.encoderinfo.get("method", 0) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", "") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - xmp = im.encoderinfo.get("xmp", "") - if allow_mixed: - lossless = False - - # Sensible keyframe defaults are from gif2webp.c script - if kmin is None: - kmin = 9 if lossless else 3 - if kmax is None: - kmax = 17 if lossless else 5 - - # Validate background color - if ( - not isinstance(background, (list, tuple)) - or len(background) != 4 - or not all(0 <= v < 256 for v in background) - ): - msg = f"Background color is not an RGBA tuple clamped to (0-255): {background}" - raise OSError(msg) - - # Convert to packed uint - bg_r, bg_g, bg_b, bg_a = background - background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) - - # Setup the WebP animation encoder - enc = _webp.WebPAnimEncoder( - im.size, - background, - loop, - minimize_size, - kmin, - kmax, - allow_mixed, - verbose, - ) - - # Add each frame - frame_idx = 0 - timestamp = 0 - cur_idx = im.tell() - try: - for ims in [im] + append_images: - # Get number of frames in this image - nfr = getattr(ims, "n_frames", 1) - - for idx in range(nfr): - ims.seek(idx) - - frame = _convert_frame(ims) - - # Append the frame to the animation encoder - enc.add( - frame.getim(), - round(timestamp), - lossless, - quality, - alpha_quality, - method, - ) - - # Update timestamp and frame index - if isinstance(duration, (list, tuple)): - timestamp += duration[frame_idx] - else: - timestamp += duration - frame_idx += 1 - - finally: - im.seek(cur_idx) - - # Force encoder to flush frames - enc.add(None, round(timestamp), lossless, quality, alpha_quality, 0) - - # Get the final output from the encoder - data = enc.assemble(icc_profile, exif, xmp) - if data is None: - msg = "cannot write file as WebP (encoder returned None)" - raise OSError(msg) - - fp.write(data) - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - alpha_quality = im.encoderinfo.get("alpha_quality", 100) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", b"") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - if exif.startswith(b"Exif\x00\x00"): - exif = exif[6:] - xmp = im.encoderinfo.get("xmp", "") - method = im.encoderinfo.get("method", 4) - exact = 1 if im.encoderinfo.get("exact") else 0 - - im = _convert_frame(im) - - data = _webp.WebPEncode( - im.getim(), - lossless, - float(quality), - float(alpha_quality), - icc_profile, - method, - exact, - exif, - xmp, - ) - if data is None: - msg = "cannot write file as WebP (encoder returned None)" - raise OSError(msg) - - fp.write(data) - - -Image.register_open(WebPImageFile.format, WebPImageFile, _accept) -if SUPPORTED: - Image.register_save(WebPImageFile.format, _save) - Image.register_save_all(WebPImageFile.format, _save_all) - Image.register_extension(WebPImageFile.format, ".webp") - Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/.venv/lib/python3.10/site-packages/PIL/WmfImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/WmfImagePlugin.py deleted file mode 100644 index f709d02..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/WmfImagePlugin.py +++ /dev/null @@ -1,186 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# WMF stub codec -# -# history: -# 1996-12-14 fl Created -# 2004-02-22 fl Turned into a stub driver -# 2004-02-23 fl Added EMF support -# -# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -# WMF/EMF reference documentation: -# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf -# http://wvware.sourceforge.net/caolan/index.html -# http://wvware.sourceforge.net/caolan/ora-wmf.html -from __future__ import annotations - -from typing import IO - -from . import Image, ImageFile -from ._binary import i16le as word -from ._binary import si16le as short -from ._binary import si32le as _long - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific WMF image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -if hasattr(Image.core, "drawwmf"): - # install default handler (windows only) - - class WmfHandler(ImageFile.StubHandler): - def open(self, im: ImageFile.StubImageFile) -> None: - im._mode = "RGB" - self.bbox = im.info["wmf_bbox"] - - def load(self, im: ImageFile.StubImageFile) -> Image.Image: - im.fp.seek(0) # rewind - return Image.frombytes( - "RGB", - im.size, - Image.core.drawwmf(im.fp.read(), im.size, self.bbox), - "raw", - "BGR", - (im.size[0] * 3 + 3) & -4, - -1, - ) - - register_handler(WmfHandler()) - -# -# -------------------------------------------------------------------- -# Read WMF file - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith((b"\xd7\xcd\xc6\x9a\x00\x00", b"\x01\x00\x00\x00")) - - -## -# Image plugin for Windows metafiles. - - -class WmfStubImageFile(ImageFile.StubImageFile): - format = "WMF" - format_description = "Windows Metafile" - - def _open(self) -> None: - # check placable header - s = self.fp.read(80) - - if s.startswith(b"\xd7\xcd\xc6\x9a\x00\x00"): - # placeable windows metafile - - # get units per inch - inch = word(s, 14) - if inch == 0: - msg = "Invalid inch" - raise ValueError(msg) - self._inch: tuple[float, float] = inch, inch - - # get bounding box - x0 = short(s, 6) - y0 = short(s, 8) - x1 = short(s, 10) - y1 = short(s, 12) - - # normalize size to 72 dots per inch - self.info["dpi"] = 72 - size = ( - (x1 - x0) * self.info["dpi"] // inch, - (y1 - y0) * self.info["dpi"] // inch, - ) - - self.info["wmf_bbox"] = x0, y0, x1, y1 - - # sanity check (standard metafile header) - if s[22:26] != b"\x01\x00\t\x00": - msg = "Unsupported WMF file format" - raise SyntaxError(msg) - - elif s.startswith(b"\x01\x00\x00\x00") and s[40:44] == b" EMF": - # enhanced metafile - - # get bounding box - x0 = _long(s, 8) - y0 = _long(s, 12) - x1 = _long(s, 16) - y1 = _long(s, 20) - - # get frame (in 0.01 millimeter units) - frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) - - size = x1 - x0, y1 - y0 - - # calculate dots per inch from bbox and frame - xdpi = 2540.0 * (x1 - x0) / (frame[2] - frame[0]) - ydpi = 2540.0 * (y1 - y0) / (frame[3] - frame[1]) - - self.info["wmf_bbox"] = x0, y0, x1, y1 - - if xdpi == ydpi: - self.info["dpi"] = xdpi - else: - self.info["dpi"] = xdpi, ydpi - self._inch = xdpi, ydpi - - else: - msg = "Unsupported file format" - raise SyntaxError(msg) - - self._mode = "RGB" - self._size = size - - loader = self._load() - if loader: - loader.open(self) - - def _load(self) -> ImageFile.StubHandler | None: - return _handler - - def load( - self, dpi: float | tuple[float, float] | None = None - ) -> Image.core.PixelAccess | None: - if dpi is not None: - self.info["dpi"] = dpi - x0, y0, x1, y1 = self.info["wmf_bbox"] - if not isinstance(dpi, tuple): - dpi = dpi, dpi - self._size = ( - int((x1 - x0) * dpi[0] / self._inch[0]), - int((y1 - y0) * dpi[1] / self._inch[1]), - ) - return super().load() - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "WMF save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -# -------------------------------------------------------------------- -# Registry stuff - - -Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) -Image.register_save(WmfStubImageFile.format, _save) - -Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"]) diff --git a/.venv/lib/python3.10/site-packages/PIL/XVThumbImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/XVThumbImagePlugin.py deleted file mode 100644 index cde2838..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/XVThumbImagePlugin.py +++ /dev/null @@ -1,83 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XV Thumbnail file handler by Charles E. "Gene" Cash -# (gcash@magicnet.net) -# -# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, -# available from ftp://ftp.cis.upenn.edu/pub/xv/ -# -# history: -# 98-08-15 cec created (b/w only) -# 98-12-09 cec added color palette -# 98-12-28 fl added to PIL (with only a few very minor modifications) -# -# To do: -# FIXME: make save work (this requires quantization support) -# -from __future__ import annotations - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -_MAGIC = b"P7 332" - -# standard color palette for thumbnails (RGB332) -PALETTE = b"" -for r in range(8): - for g in range(8): - for b in range(4): - PALETTE = PALETTE + ( - o8((r * 255) // 7) + o8((g * 255) // 7) + o8((b * 255) // 3) - ) - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(_MAGIC) - - -## -# Image plugin for XV thumbnail images. - - -class XVThumbImageFile(ImageFile.ImageFile): - format = "XVThumb" - format_description = "XV thumbnail image" - - def _open(self) -> None: - # check magic - assert self.fp is not None - - if not _accept(self.fp.read(6)): - msg = "not an XV thumbnail file" - raise SyntaxError(msg) - - # Skip to beginning of next line - self.fp.readline() - - # skip info comments - while True: - s = self.fp.readline() - if not s: - msg = "Unexpected EOF reading XV thumbnail file" - raise SyntaxError(msg) - if s[0] != 35: # ie. when not a comment: '#' - break - - # parse header line (already read) - s = s.strip().split() - - self._mode = "P" - self._size = int(s[0]), int(s[1]) - - self.palette = ImagePalette.raw("RGB", PALETTE) - - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, self.fp.tell(), self.mode) - ] - - -# -------------------------------------------------------------------- - -Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/.venv/lib/python3.10/site-packages/PIL/XbmImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/XbmImagePlugin.py deleted file mode 100644 index 1e57aa1..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/XbmImagePlugin.py +++ /dev/null @@ -1,98 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XBM File handling -# -# History: -# 1995-09-08 fl Created -# 1996-11-01 fl Added save support -# 1997-07-07 fl Made header parser more tolerant -# 1997-07-22 fl Fixed yet another parser bug -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) -# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) -# 2004-02-24 fl Allow some whitespace before first #define -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re -from typing import IO - -from . import Image, ImageFile - -# XBM header -xbm_head = re.compile( - rb"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" - b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" - b"(?P" - b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" - b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" - b")?" - rb"[\000-\377]*_bits\[]" -) - - -def _accept(prefix: bytes) -> bool: - return prefix.lstrip().startswith(b"#define") - - -## -# Image plugin for X11 bitmaps. - - -class XbmImageFile(ImageFile.ImageFile): - format = "XBM" - format_description = "X11 Bitmap" - - def _open(self) -> None: - assert self.fp is not None - - m = xbm_head.match(self.fp.read(512)) - - if not m: - msg = "not a XBM file" - raise SyntaxError(msg) - - xsize = int(m.group("width")) - ysize = int(m.group("height")) - - if m.group("hotspot"): - self.info["hotspot"] = (int(m.group("xhot")), int(m.group("yhot"))) - - self._mode = "1" - self._size = xsize, ysize - - self.tile = [ImageFile._Tile("xbm", (0, 0) + self.size, m.end())] - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode != "1": - msg = f"cannot write mode {im.mode} as XBM" - raise OSError(msg) - - fp.write(f"#define im_width {im.size[0]}\n".encode("ascii")) - fp.write(f"#define im_height {im.size[1]}\n".encode("ascii")) - - hotspot = im.encoderinfo.get("hotspot") - if hotspot: - fp.write(f"#define im_x_hot {hotspot[0]}\n".encode("ascii")) - fp.write(f"#define im_y_hot {hotspot[1]}\n".encode("ascii")) - - fp.write(b"static char im_bits[] = {\n") - - ImageFile._save(im, fp, [ImageFile._Tile("xbm", (0, 0) + im.size)]) - - fp.write(b"};\n") - - -Image.register_open(XbmImageFile.format, XbmImageFile, _accept) -Image.register_save(XbmImageFile.format, _save) - -Image.register_extension(XbmImageFile.format, ".xbm") - -Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/.venv/lib/python3.10/site-packages/PIL/XpmImagePlugin.py b/.venv/lib/python3.10/site-packages/PIL/XpmImagePlugin.py deleted file mode 100644 index 3c932c4..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/XpmImagePlugin.py +++ /dev/null @@ -1,125 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XPM File handling -# -# History: -# 1996-12-29 fl Created -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) -# -# Copyright (c) Secret Labs AB 1997-2001. -# Copyright (c) Fredrik Lundh 1996-2001. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -# XPM header -xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') - - -def _accept(prefix: bytes) -> bool: - return prefix.startswith(b"/* XPM */") - - -## -# Image plugin for X11 pixel maps. - - -class XpmImageFile(ImageFile.ImageFile): - format = "XPM" - format_description = "X11 Pixel Map" - - def _open(self) -> None: - if not _accept(self.fp.read(9)): - msg = "not an XPM file" - raise SyntaxError(msg) - - # skip forward to next string - while True: - s = self.fp.readline() - if not s: - msg = "broken XPM file" - raise SyntaxError(msg) - m = xpm_head.match(s) - if m: - break - - self._size = int(m.group(1)), int(m.group(2)) - - pal = int(m.group(3)) - bpp = int(m.group(4)) - - if pal > 256 or bpp != 1: - msg = "cannot read this XPM file" - raise ValueError(msg) - - # - # load palette description - - palette = [b"\0\0\0"] * 256 - - for _ in range(pal): - s = self.fp.readline() - if s.endswith(b"\r\n"): - s = s[:-2] - elif s.endswith((b"\r", b"\n")): - s = s[:-1] - - c = s[1] - s = s[2:-2].split() - - for i in range(0, len(s), 2): - if s[i] == b"c": - # process colour key - rgb = s[i + 1] - if rgb == b"None": - self.info["transparency"] = c - elif rgb.startswith(b"#"): - # FIXME: handle colour names (see ImagePalette.py) - rgb = int(rgb[1:], 16) - palette[c] = ( - o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255) - ) - else: - # unknown colour - msg = "cannot read this XPM file" - raise ValueError(msg) - break - - else: - # missing colour key - msg = "cannot read this XPM file" - raise ValueError(msg) - - self._mode = "P" - self.palette = ImagePalette.raw("RGB", b"".join(palette)) - - self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, self.fp.tell(), "P")] - - def load_read(self, read_bytes: int) -> bytes: - # - # load all image data in one chunk - - xsize, ysize = self.size - - s = [self.fp.readline()[1 : xsize + 1].ljust(xsize) for i in range(ysize)] - - return b"".join(s) - - -# -# Registry - - -Image.register_open(XpmImageFile.format, XpmImageFile, _accept) - -Image.register_extension(XpmImageFile.format, ".xpm") - -Image.register_mime(XpmImageFile.format, "image/xpm") diff --git a/.venv/lib/python3.10/site-packages/PIL/__init__.py b/.venv/lib/python3.10/site-packages/PIL/__init__.py deleted file mode 100644 index 6e4c23f..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/__init__.py +++ /dev/null @@ -1,87 +0,0 @@ -"""Pillow (Fork of the Python Imaging Library) - -Pillow is the friendly PIL fork by Jeffrey A. Clark and contributors. - https://github.com/python-pillow/Pillow/ - -Pillow is forked from PIL 1.1.7. - -PIL is the Python Imaging Library by Fredrik Lundh and contributors. -Copyright (c) 1999 by Secret Labs AB. - -Use PIL.__version__ for this Pillow version. - -;-) -""" - -from __future__ import annotations - -from . import _version - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -__version__ = _version.__version__ -del _version - - -_plugins = [ - "AvifImagePlugin", - "BlpImagePlugin", - "BmpImagePlugin", - "BufrStubImagePlugin", - "CurImagePlugin", - "DcxImagePlugin", - "DdsImagePlugin", - "EpsImagePlugin", - "FitsImagePlugin", - "FliImagePlugin", - "FpxImagePlugin", - "FtexImagePlugin", - "GbrImagePlugin", - "GifImagePlugin", - "GribStubImagePlugin", - "Hdf5StubImagePlugin", - "IcnsImagePlugin", - "IcoImagePlugin", - "ImImagePlugin", - "ImtImagePlugin", - "IptcImagePlugin", - "JpegImagePlugin", - "Jpeg2KImagePlugin", - "McIdasImagePlugin", - "MicImagePlugin", - "MpegImagePlugin", - "MpoImagePlugin", - "MspImagePlugin", - "PalmImagePlugin", - "PcdImagePlugin", - "PcxImagePlugin", - "PdfImagePlugin", - "PixarImagePlugin", - "PngImagePlugin", - "PpmImagePlugin", - "PsdImagePlugin", - "QoiImagePlugin", - "SgiImagePlugin", - "SpiderImagePlugin", - "SunImagePlugin", - "TgaImagePlugin", - "TiffImagePlugin", - "WebPImagePlugin", - "WmfImagePlugin", - "XbmImagePlugin", - "XpmImagePlugin", - "XVThumbImagePlugin", -] - - -class UnidentifiedImageError(OSError): - """ - Raised in :py:meth:`PIL.Image.open` if an image cannot be opened and identified. - - If a PNG image raises this error, setting :data:`.ImageFile.LOAD_TRUNCATED_IMAGES` - to true may allow the image to be opened after all. The setting will ignore missing - data and checksum failures. - """ - - pass diff --git a/.venv/lib/python3.10/site-packages/PIL/__main__.py b/.venv/lib/python3.10/site-packages/PIL/__main__.py deleted file mode 100644 index 043156e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/__main__.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import annotations - -import sys - -from .features import pilinfo - -pilinfo(supported_formats="--report" not in sys.argv) diff --git a/.venv/lib/python3.10/site-packages/PIL/_avif.pyi b/.venv/lib/python3.10/site-packages/PIL/_avif.pyi deleted file mode 100644 index e27843e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_avif.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/.venv/lib/python3.10/site-packages/PIL/_binary.py b/.venv/lib/python3.10/site-packages/PIL/_binary.py deleted file mode 100644 index 4594ccc..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_binary.py +++ /dev/null @@ -1,112 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Binary input/output support routines. -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1995-2003 by Fredrik Lundh -# Copyright (c) 2012 by Brian Crowell -# -# See the README file for information on usage and redistribution. -# - - -"""Binary input/output support routines.""" -from __future__ import annotations - -from struct import pack, unpack_from - - -def i8(c: bytes) -> int: - return c[0] - - -def o8(i: int) -> bytes: - return bytes((i & 255,)) - - -# Input, le = little endian, be = big endian -def i16le(c: bytes, o: int = 0) -> int: - """ - Converts a 2-bytes (16 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 2-bytes (16 bits) string to a signed integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 2-bytes (16 bits) string to a signed integer, big endian. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(">h", c, o)[0] - - -def i32le(c: bytes, o: int = 0) -> int: - """ - Converts a 4-bytes (32 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 4-bytes (32 bits) string to a signed integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 4-bytes (32 bits) string to a signed integer, big endian. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(">i", c, o)[0] - - -def i16be(c: bytes, o: int = 0) -> int: - return unpack_from(">H", c, o)[0] - - -def i32be(c: bytes, o: int = 0) -> int: - return unpack_from(">I", c, o)[0] - - -# Output, le = little endian, be = big endian -def o16le(i: int) -> bytes: - return pack(" bytes: - return pack(" bytes: - return pack(">H", i) - - -def o32be(i: int) -> bytes: - return pack(">I", i) diff --git a/.venv/lib/python3.10/site-packages/PIL/_deprecate.py b/.venv/lib/python3.10/site-packages/PIL/_deprecate.py deleted file mode 100644 index 9f9d8bb..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_deprecate.py +++ /dev/null @@ -1,71 +0,0 @@ -from __future__ import annotations - -import warnings - -from . import __version__ - - -def deprecate( - deprecated: str, - when: int | None, - replacement: str | None = None, - *, - action: str | None = None, - plural: bool = False, -) -> None: - """ - Deprecations helper. - - :param deprecated: Name of thing to be deprecated. - :param when: Pillow major version to be removed in. - :param replacement: Name of replacement. - :param action: Instead of "replacement", give a custom call to action - e.g. "Upgrade to new thing". - :param plural: if the deprecated thing is plural, needing "are" instead of "is". - - Usually of the form: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). - Use [replacement] instead." - - You can leave out the replacement sentence: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd)" - - Or with another call to action: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). - [action]." - """ - - is_ = "are" if plural else "is" - - if when is None: - removed = "a future version" - elif when <= int(__version__.split(".")[0]): - msg = f"{deprecated} {is_} deprecated and should be removed." - raise RuntimeError(msg) - elif when == 12: - removed = "Pillow 12 (2025-10-15)" - elif when == 13: - removed = "Pillow 13 (2026-10-15)" - else: - msg = f"Unknown removal version: {when}. Update {__name__}?" - raise ValueError(msg) - - if replacement and action: - msg = "Use only one of 'replacement' and 'action'" - raise ValueError(msg) - - if replacement: - action = f". Use {replacement} instead." - elif action: - action = f". {action.rstrip('.')}." - else: - action = "" - - warnings.warn( - f"{deprecated} {is_} deprecated and will be removed in {removed}{action}", - DeprecationWarning, - stacklevel=3, - ) diff --git a/.venv/lib/python3.10/site-packages/PIL/_imaging.cpython-310-x86_64-linux-gnu.so b/.venv/lib/python3.10/site-packages/PIL/_imaging.cpython-310-x86_64-linux-gnu.so deleted file mode 100755 index 1ca5893..0000000 Binary files a/.venv/lib/python3.10/site-packages/PIL/_imaging.cpython-310-x86_64-linux-gnu.so and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/PIL/_imaging.pyi b/.venv/lib/python3.10/site-packages/PIL/_imaging.pyi deleted file mode 100644 index 998bc52..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_imaging.pyi +++ /dev/null @@ -1,31 +0,0 @@ -from typing import Any - -class ImagingCore: - def __getitem__(self, index: int) -> float: ... - def __getattr__(self, name: str) -> Any: ... - -class ImagingFont: - def __getattr__(self, name: str) -> Any: ... - -class ImagingDraw: - def __getattr__(self, name: str) -> Any: ... - -class PixelAccess: - def __getitem__(self, xy: tuple[int, int]) -> float | tuple[int, ...]: ... - def __setitem__( - self, xy: tuple[int, int], color: float | tuple[int, ...] - ) -> None: ... - -class ImagingDecoder: - def __getattr__(self, name: str) -> Any: ... - -class ImagingEncoder: - def __getattr__(self, name: str) -> Any: ... - -class _Outline: - def close(self) -> None: ... - def __getattr__(self, name: str) -> Any: ... - -def font(image: ImagingCore, glyphdata: bytes) -> ImagingFont: ... -def outline() -> _Outline: ... -def __getattr__(name: str) -> Any: ... diff --git a/.venv/lib/python3.10/site-packages/PIL/_imagingcms.cpython-310-x86_64-linux-gnu.so b/.venv/lib/python3.10/site-packages/PIL/_imagingcms.cpython-310-x86_64-linux-gnu.so deleted file mode 100755 index 04f5941..0000000 Binary files a/.venv/lib/python3.10/site-packages/PIL/_imagingcms.cpython-310-x86_64-linux-gnu.so and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/PIL/_imagingcms.pyi b/.venv/lib/python3.10/site-packages/PIL/_imagingcms.pyi deleted file mode 100644 index ddcf93a..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_imagingcms.pyi +++ /dev/null @@ -1,143 +0,0 @@ -import datetime -import sys -from typing import Literal, SupportsFloat, TypedDict - -from ._typing import CapsuleType - -littlecms_version: str | None - -_Tuple3f = tuple[float, float, float] -_Tuple2x3f = tuple[_Tuple3f, _Tuple3f] -_Tuple3x3f = tuple[_Tuple3f, _Tuple3f, _Tuple3f] - -class _IccMeasurementCondition(TypedDict): - observer: int - backing: _Tuple3f - geo: str - flare: float - illuminant_type: str - -class _IccViewingCondition(TypedDict): - illuminant: _Tuple3f - surround: _Tuple3f - illuminant_type: str - -class CmsProfile: - @property - def rendering_intent(self) -> int: ... - @property - def creation_date(self) -> datetime.datetime | None: ... - @property - def copyright(self) -> str | None: ... - @property - def target(self) -> str | None: ... - @property - def manufacturer(self) -> str | None: ... - @property - def model(self) -> str | None: ... - @property - def profile_description(self) -> str | None: ... - @property - def screening_description(self) -> str | None: ... - @property - def viewing_condition(self) -> str | None: ... - @property - def version(self) -> float: ... - @property - def icc_version(self) -> int: ... - @property - def attributes(self) -> int: ... - @property - def header_flags(self) -> int: ... - @property - def header_manufacturer(self) -> str: ... - @property - def header_model(self) -> str: ... - @property - def device_class(self) -> str: ... - @property - def connection_space(self) -> str: ... - @property - def xcolor_space(self) -> str: ... - @property - def profile_id(self) -> bytes: ... - @property - def is_matrix_shaper(self) -> bool: ... - @property - def technology(self) -> str | None: ... - @property - def colorimetric_intent(self) -> str | None: ... - @property - def perceptual_rendering_intent_gamut(self) -> str | None: ... - @property - def saturation_rendering_intent_gamut(self) -> str | None: ... - @property - def red_colorant(self) -> _Tuple2x3f | None: ... - @property - def green_colorant(self) -> _Tuple2x3f | None: ... - @property - def blue_colorant(self) -> _Tuple2x3f | None: ... - @property - def red_primary(self) -> _Tuple2x3f | None: ... - @property - def green_primary(self) -> _Tuple2x3f | None: ... - @property - def blue_primary(self) -> _Tuple2x3f | None: ... - @property - def media_white_point_temperature(self) -> float | None: ... - @property - def media_white_point(self) -> _Tuple2x3f | None: ... - @property - def media_black_point(self) -> _Tuple2x3f | None: ... - @property - def luminance(self) -> _Tuple2x3f | None: ... - @property - def chromatic_adaptation(self) -> tuple[_Tuple3x3f, _Tuple3x3f] | None: ... - @property - def chromaticity(self) -> _Tuple3x3f | None: ... - @property - def colorant_table(self) -> list[str] | None: ... - @property - def colorant_table_out(self) -> list[str] | None: ... - @property - def intent_supported(self) -> dict[int, tuple[bool, bool, bool]] | None: ... - @property - def clut(self) -> dict[int, tuple[bool, bool, bool]] | None: ... - @property - def icc_measurement_condition(self) -> _IccMeasurementCondition | None: ... - @property - def icc_viewing_condition(self) -> _IccViewingCondition | None: ... - def is_intent_supported(self, intent: int, direction: int, /) -> int: ... - -class CmsTransform: - def apply(self, id_in: CapsuleType, id_out: CapsuleType) -> int: ... - -def profile_open(profile: str, /) -> CmsProfile: ... -def profile_frombytes(profile: bytes, /) -> CmsProfile: ... -def profile_tobytes(profile: CmsProfile, /) -> bytes: ... -def buildTransform( - input_profile: CmsProfile, - output_profile: CmsProfile, - in_mode: str, - out_mode: str, - rendering_intent: int = 0, - cms_flags: int = 0, - /, -) -> CmsTransform: ... -def buildProofTransform( - input_profile: CmsProfile, - output_profile: CmsProfile, - proof_profile: CmsProfile, - in_mode: str, - out_mode: str, - rendering_intent: int = 0, - proof_intent: int = 0, - cms_flags: int = 0, - /, -) -> CmsTransform: ... -def createProfile( - color_space: Literal["LAB", "XYZ", "sRGB"], color_temp: SupportsFloat = 0.0, / -) -> CmsProfile: ... - -if sys.platform == "win32": - def get_display_profile_win32(handle: int = 0, is_dc: int = 0, /) -> str | None: ... diff --git a/.venv/lib/python3.10/site-packages/PIL/_imagingft.cpython-310-x86_64-linux-gnu.so b/.venv/lib/python3.10/site-packages/PIL/_imagingft.cpython-310-x86_64-linux-gnu.so deleted file mode 100755 index b88e7c8..0000000 Binary files a/.venv/lib/python3.10/site-packages/PIL/_imagingft.cpython-310-x86_64-linux-gnu.so and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/PIL/_imagingft.pyi b/.venv/lib/python3.10/site-packages/PIL/_imagingft.pyi deleted file mode 100644 index 1cb1429..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_imagingft.pyi +++ /dev/null @@ -1,69 +0,0 @@ -from typing import Any, Callable - -from . import ImageFont, _imaging - -class Font: - @property - def family(self) -> str | None: ... - @property - def style(self) -> str | None: ... - @property - def ascent(self) -> int: ... - @property - def descent(self) -> int: ... - @property - def height(self) -> int: ... - @property - def x_ppem(self) -> int: ... - @property - def y_ppem(self) -> int: ... - @property - def glyphs(self) -> int: ... - def render( - self, - string: str | bytes, - fill: Callable[[int, int], _imaging.ImagingCore], - mode: str, - dir: str | None, - features: list[str] | None, - lang: str | None, - stroke_width: float, - stroke_filled: bool, - anchor: str | None, - foreground_ink_long: int, - start: tuple[float, float], - /, - ) -> tuple[_imaging.ImagingCore, tuple[int, int]]: ... - def getsize( - self, - string: str | bytes | bytearray, - mode: str, - dir: str | None, - features: list[str] | None, - lang: str | None, - anchor: str | None, - /, - ) -> tuple[tuple[int, int], tuple[int, int]]: ... - def getlength( - self, - string: str | bytes, - mode: str, - dir: str | None, - features: list[str] | None, - lang: str | None, - /, - ) -> float: ... - def getvarnames(self) -> list[bytes]: ... - def getvaraxes(self) -> list[ImageFont.Axis]: ... - def setvarname(self, instance_index: int, /) -> None: ... - def setvaraxes(self, axes: list[float], /) -> None: ... - -def getfont( - filename: str | bytes, - size: float, - index: int, - encoding: str, - font_bytes: bytes, - layout_engine: int, -) -> Font: ... -def __getattr__(name: str) -> Any: ... diff --git a/.venv/lib/python3.10/site-packages/PIL/_imagingmath.cpython-310-x86_64-linux-gnu.so b/.venv/lib/python3.10/site-packages/PIL/_imagingmath.cpython-310-x86_64-linux-gnu.so deleted file mode 100755 index d8800d2..0000000 Binary files a/.venv/lib/python3.10/site-packages/PIL/_imagingmath.cpython-310-x86_64-linux-gnu.so and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/PIL/_imagingmath.pyi b/.venv/lib/python3.10/site-packages/PIL/_imagingmath.pyi deleted file mode 100644 index e27843e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_imagingmath.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/.venv/lib/python3.10/site-packages/PIL/_imagingmorph.cpython-310-x86_64-linux-gnu.so b/.venv/lib/python3.10/site-packages/PIL/_imagingmorph.cpython-310-x86_64-linux-gnu.so deleted file mode 100755 index f60a059..0000000 Binary files a/.venv/lib/python3.10/site-packages/PIL/_imagingmorph.cpython-310-x86_64-linux-gnu.so and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/PIL/_imagingmorph.pyi b/.venv/lib/python3.10/site-packages/PIL/_imagingmorph.pyi deleted file mode 100644 index e27843e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_imagingmorph.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/.venv/lib/python3.10/site-packages/PIL/_imagingtk.cpython-310-x86_64-linux-gnu.so b/.venv/lib/python3.10/site-packages/PIL/_imagingtk.cpython-310-x86_64-linux-gnu.so deleted file mode 100755 index 2645c98..0000000 Binary files a/.venv/lib/python3.10/site-packages/PIL/_imagingtk.cpython-310-x86_64-linux-gnu.so and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/PIL/_imagingtk.pyi b/.venv/lib/python3.10/site-packages/PIL/_imagingtk.pyi deleted file mode 100644 index e27843e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_imagingtk.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/.venv/lib/python3.10/site-packages/PIL/_tkinter_finder.py b/.venv/lib/python3.10/site-packages/PIL/_tkinter_finder.py deleted file mode 100644 index 9c01430..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_tkinter_finder.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Find compiled module linking to Tcl / Tk libraries""" - -from __future__ import annotations - -import sys -import tkinter - -tk = getattr(tkinter, "_tkinter") - -try: - if hasattr(sys, "pypy_find_executable"): - TKINTER_LIB = tk.tklib_cffi.__file__ - else: - TKINTER_LIB = tk.__file__ -except AttributeError: - # _tkinter may be compiled directly into Python, in which case __file__ is - # not available. load_tkinter_funcs will check the binary first in any case. - TKINTER_LIB = None - -tk_version = str(tkinter.TkVersion) diff --git a/.venv/lib/python3.10/site-packages/PIL/_typing.py b/.venv/lib/python3.10/site-packages/PIL/_typing.py deleted file mode 100644 index 373938e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_typing.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import annotations - -import os -import sys -from collections.abc import Sequence -from typing import Any, Protocol, TypeVar, Union - -TYPE_CHECKING = False -if TYPE_CHECKING: - from numbers import _IntegralLike as IntegralLike - - try: - import numpy.typing as npt - - NumpyArray = npt.NDArray[Any] # requires numpy>=1.21 - except (ImportError, AttributeError): - pass - -if sys.version_info >= (3, 13): - from types import CapsuleType -else: - CapsuleType = object - -if sys.version_info >= (3, 12): - from collections.abc import Buffer -else: - Buffer = Any - -if sys.version_info >= (3, 10): - from typing import TypeGuard -else: - try: - from typing_extensions import TypeGuard - except ImportError: - - class TypeGuard: # type: ignore[no-redef] - def __class_getitem__(cls, item: Any) -> type[bool]: - return bool - - -Coords = Union[Sequence[float], Sequence[Sequence[float]]] - - -_T_co = TypeVar("_T_co", covariant=True) - - -class SupportsRead(Protocol[_T_co]): - def read(self, length: int = ..., /) -> _T_co: ... - - -StrOrBytesPath = Union[str, bytes, os.PathLike[str], os.PathLike[bytes]] - - -__all__ = ["Buffer", "IntegralLike", "StrOrBytesPath", "SupportsRead", "TypeGuard"] diff --git a/.venv/lib/python3.10/site-packages/PIL/_util.py b/.venv/lib/python3.10/site-packages/PIL/_util.py deleted file mode 100644 index 8ef0d36..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_util.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -import os -from typing import Any, NoReturn - -from ._typing import StrOrBytesPath, TypeGuard - - -def is_path(f: Any) -> TypeGuard[StrOrBytesPath]: - return isinstance(f, (bytes, str, os.PathLike)) - - -class DeferredError: - def __init__(self, ex: BaseException): - self.ex = ex - - def __getattr__(self, elt: str) -> NoReturn: - raise self.ex - - @staticmethod - def new(ex: BaseException) -> Any: - """ - Creates an object that raises the wrapped exception ``ex`` when used, - and casts it to :py:obj:`~typing.Any` type. - """ - return DeferredError(ex) diff --git a/.venv/lib/python3.10/site-packages/PIL/_version.py b/.venv/lib/python3.10/site-packages/PIL/_version.py deleted file mode 100644 index 9380e99..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_version.py +++ /dev/null @@ -1,4 +0,0 @@ -# Master version for Pillow -from __future__ import annotations - -__version__ = "11.2.1" diff --git a/.venv/lib/python3.10/site-packages/PIL/_webp.cpython-310-x86_64-linux-gnu.so b/.venv/lib/python3.10/site-packages/PIL/_webp.cpython-310-x86_64-linux-gnu.so deleted file mode 100755 index 3b4b019..0000000 Binary files a/.venv/lib/python3.10/site-packages/PIL/_webp.cpython-310-x86_64-linux-gnu.so and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/PIL/_webp.pyi b/.venv/lib/python3.10/site-packages/PIL/_webp.pyi deleted file mode 100644 index e27843e..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/_webp.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/.venv/lib/python3.10/site-packages/PIL/features.py b/.venv/lib/python3.10/site-packages/PIL/features.py deleted file mode 100644 index 573f1d4..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/features.py +++ /dev/null @@ -1,361 +0,0 @@ -from __future__ import annotations - -import collections -import os -import sys -import warnings -from typing import IO - -import PIL - -from . import Image -from ._deprecate import deprecate - -modules = { - "pil": ("PIL._imaging", "PILLOW_VERSION"), - "tkinter": ("PIL._tkinter_finder", "tk_version"), - "freetype2": ("PIL._imagingft", "freetype2_version"), - "littlecms2": ("PIL._imagingcms", "littlecms_version"), - "webp": ("PIL._webp", "webpdecoder_version"), - "avif": ("PIL._avif", "libavif_version"), -} - - -def check_module(feature: str) -> bool: - """ - Checks if a module is available. - - :param feature: The module to check for. - :returns: ``True`` if available, ``False`` otherwise. - :raises ValueError: If the module is not defined in this version of Pillow. - """ - if feature not in modules: - msg = f"Unknown module {feature}" - raise ValueError(msg) - - module, ver = modules[feature] - - try: - __import__(module) - return True - except ModuleNotFoundError: - return False - except ImportError as ex: - warnings.warn(str(ex)) - return False - - -def version_module(feature: str) -> str | None: - """ - :param feature: The module to check for. - :returns: - The loaded version number as a string, or ``None`` if unknown or not available. - :raises ValueError: If the module is not defined in this version of Pillow. - """ - if not check_module(feature): - return None - - module, ver = modules[feature] - - return getattr(__import__(module, fromlist=[ver]), ver) - - -def get_supported_modules() -> list[str]: - """ - :returns: A list of all supported modules. - """ - return [f for f in modules if check_module(f)] - - -codecs = { - "jpg": ("jpeg", "jpeglib"), - "jpg_2000": ("jpeg2k", "jp2klib"), - "zlib": ("zip", "zlib"), - "libtiff": ("libtiff", "libtiff"), -} - - -def check_codec(feature: str) -> bool: - """ - Checks if a codec is available. - - :param feature: The codec to check for. - :returns: ``True`` if available, ``False`` otherwise. - :raises ValueError: If the codec is not defined in this version of Pillow. - """ - if feature not in codecs: - msg = f"Unknown codec {feature}" - raise ValueError(msg) - - codec, lib = codecs[feature] - - return f"{codec}_encoder" in dir(Image.core) - - -def version_codec(feature: str) -> str | None: - """ - :param feature: The codec to check for. - :returns: - The version number as a string, or ``None`` if not available. - Checked at compile time for ``jpg``, run-time otherwise. - :raises ValueError: If the codec is not defined in this version of Pillow. - """ - if not check_codec(feature): - return None - - codec, lib = codecs[feature] - - version = getattr(Image.core, f"{lib}_version") - - if feature == "libtiff": - return version.split("\n")[0].split("Version ")[1] - - return version - - -def get_supported_codecs() -> list[str]: - """ - :returns: A list of all supported codecs. - """ - return [f for f in codecs if check_codec(f)] - - -features: dict[str, tuple[str, str | bool, str | None]] = { - "webp_anim": ("PIL._webp", True, None), - "webp_mux": ("PIL._webp", True, None), - "transp_webp": ("PIL._webp", True, None), - "raqm": ("PIL._imagingft", "HAVE_RAQM", "raqm_version"), - "fribidi": ("PIL._imagingft", "HAVE_FRIBIDI", "fribidi_version"), - "harfbuzz": ("PIL._imagingft", "HAVE_HARFBUZZ", "harfbuzz_version"), - "libjpeg_turbo": ("PIL._imaging", "HAVE_LIBJPEGTURBO", "libjpeg_turbo_version"), - "mozjpeg": ("PIL._imaging", "HAVE_MOZJPEG", "libjpeg_turbo_version"), - "zlib_ng": ("PIL._imaging", "HAVE_ZLIBNG", "zlib_ng_version"), - "libimagequant": ("PIL._imaging", "HAVE_LIBIMAGEQUANT", "imagequant_version"), - "xcb": ("PIL._imaging", "HAVE_XCB", None), -} - - -def check_feature(feature: str) -> bool | None: - """ - Checks if a feature is available. - - :param feature: The feature to check for. - :returns: ``True`` if available, ``False`` if unavailable, ``None`` if unknown. - :raises ValueError: If the feature is not defined in this version of Pillow. - """ - if feature not in features: - msg = f"Unknown feature {feature}" - raise ValueError(msg) - - module, flag, ver = features[feature] - - if isinstance(flag, bool): - deprecate(f'check_feature("{feature}")', 12) - try: - imported_module = __import__(module, fromlist=["PIL"]) - if isinstance(flag, bool): - return flag - return getattr(imported_module, flag) - except ModuleNotFoundError: - return None - except ImportError as ex: - warnings.warn(str(ex)) - return None - - -def version_feature(feature: str) -> str | None: - """ - :param feature: The feature to check for. - :returns: The version number as a string, or ``None`` if not available. - :raises ValueError: If the feature is not defined in this version of Pillow. - """ - if not check_feature(feature): - return None - - module, flag, ver = features[feature] - - if ver is None: - return None - - return getattr(__import__(module, fromlist=[ver]), ver) - - -def get_supported_features() -> list[str]: - """ - :returns: A list of all supported features. - """ - supported_features = [] - for f, (module, flag, _) in features.items(): - if flag is True: - for feature, (feature_module, _) in modules.items(): - if feature_module == module: - if check_module(feature): - supported_features.append(f) - break - elif check_feature(f): - supported_features.append(f) - return supported_features - - -def check(feature: str) -> bool | None: - """ - :param feature: A module, codec, or feature name. - :returns: - ``True`` if the module, codec, or feature is available, - ``False`` or ``None`` otherwise. - """ - - if feature in modules: - return check_module(feature) - if feature in codecs: - return check_codec(feature) - if feature in features: - return check_feature(feature) - warnings.warn(f"Unknown feature '{feature}'.", stacklevel=2) - return False - - -def version(feature: str) -> str | None: - """ - :param feature: - The module, codec, or feature to check for. - :returns: - The version number as a string, or ``None`` if unknown or not available. - """ - if feature in modules: - return version_module(feature) - if feature in codecs: - return version_codec(feature) - if feature in features: - return version_feature(feature) - return None - - -def get_supported() -> list[str]: - """ - :returns: A list of all supported modules, features, and codecs. - """ - - ret = get_supported_modules() - ret.extend(get_supported_features()) - ret.extend(get_supported_codecs()) - return ret - - -def pilinfo(out: IO[str] | None = None, supported_formats: bool = True) -> None: - """ - Prints information about this installation of Pillow. - This function can be called with ``python3 -m PIL``. - It can also be called with ``python3 -m PIL.report`` or ``python3 -m PIL --report`` - to have "supported_formats" set to ``False``, omitting the list of all supported - image file formats. - - :param out: - The output stream to print to. Defaults to ``sys.stdout`` if ``None``. - :param supported_formats: - If ``True``, a list of all supported image file formats will be printed. - """ - - if out is None: - out = sys.stdout - - Image.init() - - print("-" * 68, file=out) - print(f"Pillow {PIL.__version__}", file=out) - py_version_lines = sys.version.splitlines() - print(f"Python {py_version_lines[0].strip()}", file=out) - for py_version in py_version_lines[1:]: - print(f" {py_version.strip()}", file=out) - print("-" * 68, file=out) - print(f"Python executable is {sys.executable or 'unknown'}", file=out) - if sys.prefix != sys.base_prefix: - print(f"Environment Python files loaded from {sys.prefix}", file=out) - print(f"System Python files loaded from {sys.base_prefix}", file=out) - print("-" * 68, file=out) - print( - f"Python Pillow modules loaded from {os.path.dirname(Image.__file__)}", - file=out, - ) - print( - f"Binary Pillow modules loaded from {os.path.dirname(Image.core.__file__)}", - file=out, - ) - print("-" * 68, file=out) - - for name, feature in [ - ("pil", "PIL CORE"), - ("tkinter", "TKINTER"), - ("freetype2", "FREETYPE2"), - ("littlecms2", "LITTLECMS2"), - ("webp", "WEBP"), - ("avif", "AVIF"), - ("jpg", "JPEG"), - ("jpg_2000", "OPENJPEG (JPEG2000)"), - ("zlib", "ZLIB (PNG/ZIP)"), - ("libtiff", "LIBTIFF"), - ("raqm", "RAQM (Bidirectional Text)"), - ("libimagequant", "LIBIMAGEQUANT (Quantization method)"), - ("xcb", "XCB (X protocol)"), - ]: - if check(name): - v: str | None = None - if name == "jpg": - libjpeg_turbo_version = version_feature("libjpeg_turbo") - if libjpeg_turbo_version is not None: - v = "mozjpeg" if check_feature("mozjpeg") else "libjpeg-turbo" - v += " " + libjpeg_turbo_version - if v is None: - v = version(name) - if v is not None: - version_static = name in ("pil", "jpg") - if name == "littlecms2": - # this check is also in src/_imagingcms.c:setup_module() - version_static = tuple(int(x) for x in v.split(".")) < (2, 7) - t = "compiled for" if version_static else "loaded" - if name == "zlib": - zlib_ng_version = version_feature("zlib_ng") - if zlib_ng_version is not None: - v += ", compiled for zlib-ng " + zlib_ng_version - elif name == "raqm": - for f in ("fribidi", "harfbuzz"): - v2 = version_feature(f) - if v2 is not None: - v += f", {f} {v2}" - print("---", feature, "support ok,", t, v, file=out) - else: - print("---", feature, "support ok", file=out) - else: - print("***", feature, "support not installed", file=out) - print("-" * 68, file=out) - - if supported_formats: - extensions = collections.defaultdict(list) - for ext, i in Image.EXTENSION.items(): - extensions[i].append(ext) - - for i in sorted(Image.ID): - line = f"{i}" - if i in Image.MIME: - line = f"{line} {Image.MIME[i]}" - print(line, file=out) - - if i in extensions: - print( - "Extensions: {}".format(", ".join(sorted(extensions[i]))), file=out - ) - - features = [] - if i in Image.OPEN: - features.append("open") - if i in Image.SAVE: - features.append("save") - if i in Image.SAVE_ALL: - features.append("save_all") - if i in Image.DECODERS: - features.append("decode") - if i in Image.ENCODERS: - features.append("encode") - - print("Features: {}".format(", ".join(features)), file=out) - print("-" * 68, file=out) diff --git a/.venv/lib/python3.10/site-packages/PIL/py.typed b/.venv/lib/python3.10/site-packages/PIL/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/PIL/report.py b/.venv/lib/python3.10/site-packages/PIL/report.py deleted file mode 100644 index d2815e8..0000000 --- a/.venv/lib/python3.10/site-packages/PIL/report.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import annotations - -from .features import pilinfo - -pilinfo(supported_formats=False) diff --git a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/AUTHORS.rst b/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/AUTHORS.rst deleted file mode 100644 index 88e2b6a..0000000 --- a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/AUTHORS.rst +++ /dev/null @@ -1,7 +0,0 @@ -Authors -======= - -``pyjwt`` is currently written and maintained by `Jose Padilla `_. -Originally written and maintained by `Jeff Lindsay `_. - -A full list of contributors can be found on GitHub’s `overview `_. diff --git a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/LICENSE b/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/LICENSE deleted file mode 100644 index fd0ecbc..0000000 --- a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-2022 José Padilla - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/METADATA b/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/METADATA deleted file mode 100644 index 5af31fe..0000000 --- a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/METADATA +++ /dev/null @@ -1,97 +0,0 @@ -Metadata-Version: 2.1 -Name: PyJWT -Version: 2.9.0 -Summary: JSON Web Token implementation in Python -Home-page: https://github.com/jpadilla/pyjwt -Author: Jose Padilla -Author-email: hello@jpadilla.com -License: MIT -Keywords: json,jwt,security,signing,token,web -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Utilities -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: AUTHORS.rst -Provides-Extra: crypto -Requires-Dist: cryptography >=3.4.0 ; extra == 'crypto' -Provides-Extra: dev -Requires-Dist: sphinx ; extra == 'dev' -Requires-Dist: sphinx-rtd-theme ; extra == 'dev' -Requires-Dist: zope.interface ; extra == 'dev' -Requires-Dist: cryptography >=3.4.0 ; extra == 'dev' -Requires-Dist: pytest <7.0.0,>=6.0.0 ; extra == 'dev' -Requires-Dist: coverage[toml] ==5.0.4 ; extra == 'dev' -Requires-Dist: pre-commit ; extra == 'dev' -Provides-Extra: docs -Requires-Dist: sphinx ; extra == 'docs' -Requires-Dist: sphinx-rtd-theme ; extra == 'docs' -Requires-Dist: zope.interface ; extra == 'docs' -Provides-Extra: tests -Requires-Dist: pytest <7.0.0,>=6.0.0 ; extra == 'tests' -Requires-Dist: coverage[toml] ==5.0.4 ; extra == 'tests' - -PyJWT -===== - -.. image:: https://github.com/jpadilla/pyjwt/workflows/CI/badge.svg - :target: https://github.com/jpadilla/pyjwt/actions?query=workflow%3ACI - -.. image:: https://img.shields.io/pypi/v/pyjwt.svg - :target: https://pypi.python.org/pypi/pyjwt - -.. image:: https://codecov.io/gh/jpadilla/pyjwt/branch/master/graph/badge.svg - :target: https://codecov.io/gh/jpadilla/pyjwt - -.. image:: https://readthedocs.org/projects/pyjwt/badge/?version=stable - :target: https://pyjwt.readthedocs.io/en/stable/ - -A Python implementation of `RFC 7519 `_. Original implementation was written by `@progrium `_. - -Installing ----------- - -Install with **pip**: - -.. code-block:: console - - $ pip install PyJWT - - -Usage ------ - -.. code-block:: pycon - - >>> import jwt - >>> encoded = jwt.encode({"some": "payload"}, "secret", algorithm="HS256") - >>> print(encoded) - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg - >>> jwt.decode(encoded, "secret", algorithms=["HS256"]) - {'some': 'payload'} - -Documentation -------------- - -View the full docs online at https://pyjwt.readthedocs.io/en/stable/ - - -Tests ------ - -You can run tests from the project root after cloning with: - -.. code-block:: console - - $ tox diff --git a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/RECORD b/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/RECORD deleted file mode 100644 index 81da119..0000000 --- a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/RECORD +++ /dev/null @@ -1,32 +0,0 @@ -PyJWT-2.9.0.dist-info/AUTHORS.rst,sha256=klzkNGECnu2_VY7At89_xLBF3vUSDruXk3xwgUBxzwc,322 -PyJWT-2.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -PyJWT-2.9.0.dist-info/LICENSE,sha256=eXp6ICMdTEM-nxkR2xcx0GtYKLmPSZgZoDT3wPVvXOU,1085 -PyJWT-2.9.0.dist-info/METADATA,sha256=YRmm4Pcq065Rja5Gzuh80YA2groQSgOR8I1Cx0MF8EM,3048 -PyJWT-2.9.0.dist-info/RECORD,, -PyJWT-2.9.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91 -PyJWT-2.9.0.dist-info/top_level.txt,sha256=RP5DHNyJbMq2ka0FmfTgoSaQzh7e3r5XuCWCO8a00k8,4 -jwt/__init__.py,sha256=TlvdnR8JPnAKjXE3Yt4qSA4AApcb0_9fh4RppJfnMcU,1670 -jwt/__pycache__/__init__.cpython-310.pyc,, -jwt/__pycache__/algorithms.cpython-310.pyc,, -jwt/__pycache__/api_jwk.cpython-310.pyc,, -jwt/__pycache__/api_jws.cpython-310.pyc,, -jwt/__pycache__/api_jwt.cpython-310.pyc,, -jwt/__pycache__/exceptions.cpython-310.pyc,, -jwt/__pycache__/help.cpython-310.pyc,, -jwt/__pycache__/jwk_set_cache.cpython-310.pyc,, -jwt/__pycache__/jwks_client.cpython-310.pyc,, -jwt/__pycache__/types.cpython-310.pyc,, -jwt/__pycache__/utils.cpython-310.pyc,, -jwt/__pycache__/warnings.cpython-310.pyc,, -jwt/algorithms.py,sha256=5MLQ2WIhHPiN--67afLk4yXOLsYfx2OiNeLVORZT3G8,29851 -jwt/api_jwk.py,sha256=6F1r7rmm8V5qEnBKA_xMjS9R7VoANe1_BL1oD2FrAjE,4451 -jwt/api_jws.py,sha256=1cBVJuYxo6UrDU6UH4VTA2EqctBj1x7mNlnNb-Ocn4g,11425 -jwt/api_jwt.py,sha256=gsmF7wVxKFfsDBjrMq-M2UiyUBzl6U6YwaEqNdN1zkM,12875 -jwt/exceptions.py,sha256=xaWnosa-cREyXMyb7PYmLfQv9weZ7Q9XUYMiLJvN0hA,1101 -jwt/help.py,sha256=Jrp84fG43sCwmSIaDtY08I6ZR2VE7NhrTff89tYSE40,1749 -jwt/jwk_set_cache.py,sha256=hBKmN-giU7-G37L_XKgc_OZu2ah4wdbj1ZNG_GkoSE8,959 -jwt/jwks_client.py,sha256=9W8JVyGByQgoLbBN1u5iY1_jlgfnnukeOBTpqaM_9SE,4222 -jwt/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jwt/types.py,sha256=VnhGv_VFu5a7_mrPoSCB7HaNLrJdhM8Sq1sSfEg0gLU,99 -jwt/utils.py,sha256=efS6RKCALEBeBw-uZj8VtzfZFFcECTd28q9ndNn9huw,3544 -jwt/warnings.py,sha256=50XWOnyNsIaqzUJTk6XHNiIDykiL763GYA92MjTKmok,59 diff --git a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/WHEEL deleted file mode 100644 index 1a9c535..0000000 --- a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (72.1.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/top_level.txt deleted file mode 100644 index 27ccc9b..0000000 --- a/.venv/lib/python3.10/site-packages/PyJWT-2.9.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -jwt diff --git a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/LICENSE b/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/LICENSE deleted file mode 100644 index 2f1b8e1..0000000 --- a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2017-2021 Ingy döt Net -Copyright (c) 2006-2016 Kirill Simonov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/METADATA b/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/METADATA deleted file mode 100644 index db029b7..0000000 --- a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/METADATA +++ /dev/null @@ -1,46 +0,0 @@ -Metadata-Version: 2.1 -Name: PyYAML -Version: 6.0.2 -Summary: YAML parser and emitter for Python -Home-page: https://pyyaml.org/ -Download-URL: https://pypi.org/project/PyYAML/ -Author: Kirill Simonov -Author-email: xi@resolvent.net -License: MIT -Project-URL: Bug Tracker, https://github.com/yaml/pyyaml/issues -Project-URL: CI, https://github.com/yaml/pyyaml/actions -Project-URL: Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation -Project-URL: Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core -Project-URL: Source Code, https://github.com/yaml/pyyaml -Platform: Any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Cython -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Text Processing :: Markup -Requires-Python: >=3.8 -License-File: LICENSE - -YAML is a data serialization format designed for human readability -and interaction with scripting languages. PyYAML is a YAML parser -and emitter for Python. - -PyYAML features a complete YAML 1.1 parser, Unicode support, pickle -support, capable extension API, and sensible error messages. PyYAML -supports standard YAML tags and provides Python-specific tags that -allow to represent an arbitrary Python object. - -PyYAML is applicable for a broad range of tasks from complex -configuration files to object serialization and persistence. diff --git a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/RECORD b/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/RECORD deleted file mode 100644 index a0f0067..0000000 --- a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/RECORD +++ /dev/null @@ -1,43 +0,0 @@ -PyYAML-6.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -PyYAML-6.0.2.dist-info/LICENSE,sha256=jTko-dxEkP1jVwfLiOsmvXZBAqcoKVQwfT5RZ6V36KQ,1101 -PyYAML-6.0.2.dist-info/METADATA,sha256=9-odFB5seu4pGPcEv7E8iyxNF51_uKnaNGjLAhz2lto,2060 -PyYAML-6.0.2.dist-info/RECORD,, -PyYAML-6.0.2.dist-info/WHEEL,sha256=baMMpUvyD0gnRdCe6fvqCg8rft4FNTdLqZQ01WfKJmc,152 -PyYAML-6.0.2.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 -_yaml/__init__.py,sha256=04Ae_5osxahpJHa3XBZUAf4wi6XX32gR8D6X6p64GEA,1402 -_yaml/__pycache__/__init__.cpython-310.pyc,, -yaml/__init__.py,sha256=N35S01HMesFTe0aRRMWkPj0Pa8IEbHpE9FK7cr5Bdtw,12311 -yaml/__pycache__/__init__.cpython-310.pyc,, -yaml/__pycache__/composer.cpython-310.pyc,, -yaml/__pycache__/constructor.cpython-310.pyc,, -yaml/__pycache__/cyaml.cpython-310.pyc,, -yaml/__pycache__/dumper.cpython-310.pyc,, -yaml/__pycache__/emitter.cpython-310.pyc,, -yaml/__pycache__/error.cpython-310.pyc,, -yaml/__pycache__/events.cpython-310.pyc,, -yaml/__pycache__/loader.cpython-310.pyc,, -yaml/__pycache__/nodes.cpython-310.pyc,, -yaml/__pycache__/parser.cpython-310.pyc,, -yaml/__pycache__/reader.cpython-310.pyc,, -yaml/__pycache__/representer.cpython-310.pyc,, -yaml/__pycache__/resolver.cpython-310.pyc,, -yaml/__pycache__/scanner.cpython-310.pyc,, -yaml/__pycache__/serializer.cpython-310.pyc,, -yaml/__pycache__/tokens.cpython-310.pyc,, -yaml/_yaml.cpython-310-x86_64-linux-gnu.so,sha256=20HV-cVpIFuOuVUTmQ1-PQIbyt0n8ctfXq7JCMIfbrU,2383664 -yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883 -yaml/constructor.py,sha256=kNgkfaeLUkwQYY_Q6Ff1Tz2XVw_pG1xVE9Ak7z-viLA,28639 -yaml/cyaml.py,sha256=6ZrAG9fAYvdVe2FK_w0hmXoG7ZYsoYUwapG8CiC72H0,3851 -yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837 -yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006 -yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533 -yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445 -yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061 -yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440 -yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495 -yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794 -yaml/representer.py,sha256=IuWP-cAW9sHKEnS0gCqSa894k1Bg4cgTxaDwIcbRQ-Y,14190 -yaml/resolver.py,sha256=9L-VYfm4mWHxUD1Vg4X7rjDRK_7VZd6b92wzq7Y2IKY,9004 -yaml/scanner.py,sha256=YEM3iLZSaQwXcQRg2l2R4MdT0zGP2F9eHkKGKnHyWQY,51279 -yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165 -yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573 diff --git a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/WHEEL deleted file mode 100644 index 661c896..0000000 --- a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.44.0) -Root-Is-Purelib: false -Tag: cp310-cp310-manylinux_2_17_x86_64 -Tag: cp310-cp310-manylinux2014_x86_64 - diff --git a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/top_level.txt deleted file mode 100644 index e6475e9..0000000 --- a/.venv/lib/python3.10/site-packages/PyYAML-6.0.2.dist-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -_yaml -yaml diff --git a/.venv/lib/python3.10/site-packages/_distutils_hack/__init__.py b/.venv/lib/python3.10/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index f707416..0000000 --- a/.venv/lib/python3.10/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,132 +0,0 @@ -import sys -import os -import re -import importlib -import warnings - - -is_pypy = '__pypy__' in sys.builtin_module_names - - -warnings.filterwarnings('ignore', - r'.+ distutils\b.+ deprecated', - DeprecationWarning) - - -def warn_distutils_present(): - if 'distutils' not in sys.modules: - return - if is_pypy and sys.version_info < (3, 7): - # PyPy for 3.6 unconditionally imports distutils, so bypass the warning - # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 - return - warnings.warn( - "Distutils was imported before Setuptools, but importing Setuptools " - "also replaces the `distutils` module in `sys.modules`. This may lead " - "to undesirable behaviors or errors. To avoid these issues, avoid " - "using distutils directly, ensure that setuptools is installed in the " - "traditional way (e.g. not an editable install), and/or make sure " - "that setuptools is always imported before distutils.") - - -def clear_distutils(): - if 'distutils' not in sys.modules: - return - warnings.warn("Setuptools is replacing distutils.") - mods = [name for name in sys.modules if re.match(r'distutils\b', name)] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib') - return which == 'local' - - -def ensure_local_distutils(): - clear_distutils() - - # With the DistutilsMetaFinder in place, - # perform an import to cause distutils to be - # loaded from setuptools._distutils. Ref #2906. - add_shim() - importlib.import_module('distutils') - remove_shim() - - # check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - - -def do_override(): - """ - Ensure that the local copy of distutils is preferred over stdlib. - - See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 - for more motivation. - """ - if enabled(): - warn_distutils_present() - ensure_local_distutils() - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - if path is not None: - return - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - import importlib.abc - import importlib.util - - class DistutilsLoader(importlib.abc.Loader): - - def create_module(self, spec): - return importlib.import_module('setuptools._distutils') - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader('distutils', DistutilsLoader()) - - def spec_for_pip(self): - """ - Ensure stdlib distutils when running under pip. - See pypa/pip#8761 for rationale. - """ - if self.pip_imported_during_build(): - return - clear_distutils() - self.spec_for_distutils = lambda: None - - @staticmethod - def pip_imported_during_build(): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - return any( - frame.f_globals['__file__'].endswith('setup.py') - for frame, line in traceback.walk_stack(None) - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass diff --git a/.venv/lib/python3.10/site-packages/_distutils_hack/override.py b/.venv/lib/python3.10/site-packages/_distutils_hack/override.py deleted file mode 100644 index 2cc433a..0000000 --- a/.venv/lib/python3.10/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/.venv/lib/python3.10/site-packages/_yaml/__init__.py b/.venv/lib/python3.10/site-packages/_yaml/__init__.py deleted file mode 100644 index 7baa8c4..0000000 --- a/.venv/lib/python3.10/site-packages/_yaml/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# This is a stub package designed to roughly emulate the _yaml -# extension module, which previously existed as a standalone module -# and has been moved into the `yaml` package namespace. -# It does not perfectly mimic its old counterpart, but should get -# close enough for anyone who's relying on it even when they shouldn't. -import yaml - -# in some circumstances, the yaml module we imoprted may be from a different version, so we need -# to tread carefully when poking at it here (it may not have the attributes we expect) -if not getattr(yaml, '__with_libyaml__', False): - from sys import version_info - - exc = ModuleNotFoundError if version_info >= (3, 6) else ImportError - raise exc("No module named '_yaml'") -else: - from yaml._yaml import * - import warnings - warnings.warn( - 'The _yaml extension module is now located at yaml._yaml' - ' and its location is subject to change. To use the' - ' LibYAML-based parser and emitter, import from `yaml`:' - ' `from yaml import CLoader as Loader, CDumper as Dumper`.', - DeprecationWarning - ) - del warnings - # Don't `del yaml` here because yaml is actually an existing - # namespace member of _yaml. - -__name__ = '_yaml' -# If the module is top-level (i.e. not a part of any specific package) -# then the attribute should be set to ''. -# https://docs.python.org/3.8/library/types.html -__package__ = '' diff --git a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/LICENSE b/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/LICENSE deleted file mode 100644 index 5f4f225..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Django Software Foundation and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of Django nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/METADATA b/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/METADATA deleted file mode 100644 index a9ffa93..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/METADATA +++ /dev/null @@ -1,246 +0,0 @@ -Metadata-Version: 2.1 -Name: asgiref -Version: 3.8.1 -Summary: ASGI specs, helper code, and adapters -Home-page: https://github.com/django/asgiref/ -Author: Django Software Foundation -Author-email: foundation@djangoproject.com -License: BSD-3-Clause -Project-URL: Documentation, https://asgi.readthedocs.io/ -Project-URL: Further Documentation, https://docs.djangoproject.com/en/stable/topics/async/#async-adapter-functions -Project-URL: Changelog, https://github.com/django/asgiref/blob/master/CHANGELOG.txt -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Internet :: WWW/HTTP -Requires-Python: >=3.8 -License-File: LICENSE -Requires-Dist: typing-extensions >=4 ; python_version < "3.11" -Provides-Extra: tests -Requires-Dist: pytest ; extra == 'tests' -Requires-Dist: pytest-asyncio ; extra == 'tests' -Requires-Dist: mypy >=0.800 ; extra == 'tests' - -asgiref -======= - -.. image:: https://github.com/django/asgiref/actions/workflows/tests.yml/badge.svg - :target: https://github.com/django/asgiref/actions/workflows/tests.yml - -.. image:: https://img.shields.io/pypi/v/asgiref.svg - :target: https://pypi.python.org/pypi/asgiref - -ASGI is a standard for Python asynchronous web apps and servers to communicate -with each other, and positioned as an asynchronous successor to WSGI. You can -read more at https://asgi.readthedocs.io/en/latest/ - -This package includes ASGI base libraries, such as: - -* Sync-to-async and async-to-sync function wrappers, ``asgiref.sync`` -* Server base classes, ``asgiref.server`` -* A WSGI-to-ASGI adapter, in ``asgiref.wsgi`` - - -Function wrappers ------------------ - -These allow you to wrap or decorate async or sync functions to call them from -the other style (so you can call async functions from a synchronous thread, -or vice-versa). - -In particular: - -* AsyncToSync lets a synchronous subthread stop and wait while the async - function is called on the main thread's event loop, and then control is - returned to the thread when the async function is finished. - -* SyncToAsync lets async code call a synchronous function, which is run in - a threadpool and control returned to the async coroutine when the synchronous - function completes. - -The idea is to make it easier to call synchronous APIs from async code and -asynchronous APIs from synchronous code so it's easier to transition code from -one style to the other. In the case of Channels, we wrap the (synchronous) -Django view system with SyncToAsync to allow it to run inside the (asynchronous) -ASGI server. - -Note that exactly what threads things run in is very specific, and aimed to -keep maximum compatibility with old synchronous code. See -"Synchronous code & Threads" below for a full explanation. By default, -``sync_to_async`` will run all synchronous code in the program in the same -thread for safety reasons; you can disable this for more performance with -``@sync_to_async(thread_sensitive=False)``, but make sure that your code does -not rely on anything bound to threads (like database connections) when you do. - - -Threadlocal replacement ------------------------ - -This is a drop-in replacement for ``threading.local`` that works with both -threads and asyncio Tasks. Even better, it will proxy values through from a -task-local context to a thread-local context when you use ``sync_to_async`` -to run things in a threadpool, and vice-versa for ``async_to_sync``. - -If you instead want true thread- and task-safety, you can set -``thread_critical`` on the Local object to ensure this instead. - - -Server base classes -------------------- - -Includes a ``StatelessServer`` class which provides all the hard work of -writing a stateless server (as in, does not handle direct incoming sockets -but instead consumes external streams or sockets to work out what is happening). - -An example of such a server would be a chatbot server that connects out to -a central chat server and provides a "connection scope" per user chatting to -it. There's only one actual connection, but the server has to separate things -into several scopes for easier writing of the code. - -You can see an example of this being used in `frequensgi `_. - - -WSGI-to-ASGI adapter --------------------- - -Allows you to wrap a WSGI application so it appears as a valid ASGI application. - -Simply wrap it around your WSGI application like so:: - - asgi_application = WsgiToAsgi(wsgi_application) - -The WSGI application will be run in a synchronous threadpool, and the wrapped -ASGI application will be one that accepts ``http`` class messages. - -Please note that not all extended features of WSGI may be supported (such as -file handles for incoming POST bodies). - - -Dependencies ------------- - -``asgiref`` requires Python 3.8 or higher. - - -Contributing ------------- - -Please refer to the -`main Channels contributing docs `_. - - -Testing -''''''' - -To run tests, make sure you have installed the ``tests`` extra with the package:: - - cd asgiref/ - pip install -e .[tests] - pytest - - -Building the documentation -'''''''''''''''''''''''''' - -The documentation uses `Sphinx `_:: - - cd asgiref/docs/ - pip install sphinx - -To build the docs, you can use the default tools:: - - sphinx-build -b html . _build/html # or `make html`, if you've got make set up - cd _build/html - python -m http.server - -...or you can use ``sphinx-autobuild`` to run a server and rebuild/reload -your documentation changes automatically:: - - pip install sphinx-autobuild - sphinx-autobuild . _build/html - - -Releasing -''''''''' - -To release, first add details to CHANGELOG.txt and update the version number in ``asgiref/__init__.py``. - -Then, build and push the packages:: - - python -m build - twine upload dist/* - rm -r build/ dist/ - - -Implementation Details ----------------------- - -Synchronous code & threads -'''''''''''''''''''''''''' - -The ``asgiref.sync`` module provides two wrappers that let you go between -asynchronous and synchronous code at will, while taking care of the rough edges -for you. - -Unfortunately, the rough edges are numerous, and the code has to work especially -hard to keep things in the same thread as much as possible. Notably, the -restrictions we are working with are: - -* All synchronous code called through ``SyncToAsync`` and marked with - ``thread_sensitive`` should run in the same thread as each other (and if the - outer layer of the program is synchronous, the main thread) - -* If a thread already has a running async loop, ``AsyncToSync`` can't run things - on that loop if it's blocked on synchronous code that is above you in the - call stack. - -The first compromise you get to might be that ``thread_sensitive`` code should -just run in the same thread and not spawn in a sub-thread, fulfilling the first -restriction, but that immediately runs you into the second restriction. - -The only real solution is to essentially have a variant of ThreadPoolExecutor -that executes any ``thread_sensitive`` code on the outermost synchronous -thread - either the main thread, or a single spawned subthread. - -This means you now have two basic states: - -* If the outermost layer of your program is synchronous, then all async code - run through ``AsyncToSync`` will run in a per-call event loop in arbitrary - sub-threads, while all ``thread_sensitive`` code will run in the main thread. - -* If the outermost layer of your program is asynchronous, then all async code - runs on the main thread's event loop, and all ``thread_sensitive`` synchronous - code will run in a single shared sub-thread. - -Crucially, this means that in both cases there is a thread which is a shared -resource that all ``thread_sensitive`` code must run on, and there is a chance -that this thread is currently blocked on its own ``AsyncToSync`` call. Thus, -``AsyncToSync`` needs to act as an executor for thread code while it's blocking. - -The ``CurrentThreadExecutor`` class provides this functionality; rather than -simply waiting on a Future, you can call its ``run_until_future`` method and -it will run submitted code until that Future is done. This means that code -inside the call can then run code on your thread. - - -Maintenance and Security ------------------------- - -To report security issues, please contact security@djangoproject.com. For GPG -signatures and more security process information, see -https://docs.djangoproject.com/en/dev/internals/security/. - -To report bugs or request new features, please open a new GitHub issue. - -This repository is part of the Channels project. For the shepherd and maintenance team, please see the -`main Channels readme `_. diff --git a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/RECORD b/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/RECORD deleted file mode 100644 index db63aca..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/RECORD +++ /dev/null @@ -1,27 +0,0 @@ -asgiref-3.8.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -asgiref-3.8.1.dist-info/LICENSE,sha256=uEZBXRtRTpwd_xSiLeuQbXlLxUbKYSn5UKGM0JHipmk,1552 -asgiref-3.8.1.dist-info/METADATA,sha256=Cbu67XPstSkMxAdA4puvY-FAzN9OrT_AasH7IuK6DaM,9259 -asgiref-3.8.1.dist-info/RECORD,, -asgiref-3.8.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92 -asgiref-3.8.1.dist-info/top_level.txt,sha256=bokQjCzwwERhdBiPdvYEZa4cHxT4NCeAffQNUqJ8ssg,8 -asgiref/__init__.py,sha256=kZzGpxWKY4rWDQrrrlM7bN7YKRAjy17Wv4w__djvVYU,22 -asgiref/__pycache__/__init__.cpython-310.pyc,, -asgiref/__pycache__/compatibility.cpython-310.pyc,, -asgiref/__pycache__/current_thread_executor.cpython-310.pyc,, -asgiref/__pycache__/local.cpython-310.pyc,, -asgiref/__pycache__/server.cpython-310.pyc,, -asgiref/__pycache__/sync.cpython-310.pyc,, -asgiref/__pycache__/testing.cpython-310.pyc,, -asgiref/__pycache__/timeout.cpython-310.pyc,, -asgiref/__pycache__/typing.cpython-310.pyc,, -asgiref/__pycache__/wsgi.cpython-310.pyc,, -asgiref/compatibility.py,sha256=DhY1SOpOvOw0Y1lSEjCqg-znRUQKecG3LTaV48MZi68,1606 -asgiref/current_thread_executor.py,sha256=EuowbT0oL_P4Fq8KTXNUyEgk3-k4Yh4E8F_anEVdeBI,3977 -asgiref/local.py,sha256=bNeER_QIfw2-PAPYanqAZq6yAAEJ-aio7e9o8Up-mgI,4808 -asgiref/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -asgiref/server.py,sha256=egTQhZo1k4G0F7SSBQNp_VOekpGcjBJZU2kkCoiGC_M,6005 -asgiref/sync.py,sha256=Why0YQV84vSp7IBBr-JDbxYCua-InLgBjuiCMlj9WgI,21444 -asgiref/testing.py,sha256=QgZgXKrwdq5xzhZqynr1msWOiTS3Kpastj7wHU2ePRY,3481 -asgiref/timeout.py,sha256=LtGL-xQpG8JHprdsEUCMErJ0kNWj4qwWZhEHJ3iKu4s,3627 -asgiref/typing.py,sha256=rLF3y_9OgvlQMaDm8yMw8QTgsO9Mv9YAc6Cj8xjvWo0,6264 -asgiref/wsgi.py,sha256=fxBLgUE_0PEVgcp13ticz6GHf3q-aKWcB5eFPhd6yxo,6753 diff --git a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/WHEEL deleted file mode 100644 index bab98d6..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.43.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/top_level.txt deleted file mode 100644 index ddf99d3..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref-3.8.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -asgiref diff --git a/.venv/lib/python3.10/site-packages/asgiref/__init__.py b/.venv/lib/python3.10/site-packages/asgiref/__init__.py deleted file mode 100644 index e4e78c0..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "3.8.1" diff --git a/.venv/lib/python3.10/site-packages/asgiref/compatibility.py b/.venv/lib/python3.10/site-packages/asgiref/compatibility.py deleted file mode 100644 index 3a2a63e..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref/compatibility.py +++ /dev/null @@ -1,48 +0,0 @@ -import inspect - -from .sync import iscoroutinefunction - - -def is_double_callable(application): - """ - Tests to see if an application is a legacy-style (double-callable) application. - """ - # Look for a hint on the object first - if getattr(application, "_asgi_single_callable", False): - return False - if getattr(application, "_asgi_double_callable", False): - return True - # Uninstanted classes are double-callable - if inspect.isclass(application): - return True - # Instanted classes depend on their __call__ - if hasattr(application, "__call__"): - # We only check to see if its __call__ is a coroutine function - - # if it's not, it still might be a coroutine function itself. - if iscoroutinefunction(application.__call__): - return False - # Non-classes we just check directly - return not iscoroutinefunction(application) - - -def double_to_single_callable(application): - """ - Transforms a double-callable ASGI application into a single-callable one. - """ - - async def new_application(scope, receive, send): - instance = application(scope) - return await instance(receive, send) - - return new_application - - -def guarantee_single_callable(application): - """ - Takes either a single- or double-callable application and always returns it - in single-callable style. Use this to add backwards compatibility for ASGI - 2.0 applications to your server/test harness/etc. - """ - if is_double_callable(application): - application = double_to_single_callable(application) - return application diff --git a/.venv/lib/python3.10/site-packages/asgiref/current_thread_executor.py b/.venv/lib/python3.10/site-packages/asgiref/current_thread_executor.py deleted file mode 100644 index 67a7926..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref/current_thread_executor.py +++ /dev/null @@ -1,115 +0,0 @@ -import queue -import sys -import threading -from concurrent.futures import Executor, Future -from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union - -if sys.version_info >= (3, 10): - from typing import ParamSpec -else: - from typing_extensions import ParamSpec - -_T = TypeVar("_T") -_P = ParamSpec("_P") -_R = TypeVar("_R") - - -class _WorkItem: - """ - Represents an item needing to be run in the executor. - Copied from ThreadPoolExecutor (but it's private, so we're not going to rely on importing it) - """ - - def __init__( - self, - future: "Future[_R]", - fn: Callable[_P, _R], - *args: _P.args, - **kwargs: _P.kwargs, - ): - self.future = future - self.fn = fn - self.args = args - self.kwargs = kwargs - - def run(self) -> None: - __traceback_hide__ = True # noqa: F841 - if not self.future.set_running_or_notify_cancel(): - return - try: - result = self.fn(*self.args, **self.kwargs) - except BaseException as exc: - self.future.set_exception(exc) - # Break a reference cycle with the exception 'exc' - self = None # type: ignore[assignment] - else: - self.future.set_result(result) - - -class CurrentThreadExecutor(Executor): - """ - An Executor that actually runs code in the thread it is instantiated in. - Passed to other threads running async code, so they can run sync code in - the thread they came from. - """ - - def __init__(self) -> None: - self._work_thread = threading.current_thread() - self._work_queue: queue.Queue[Union[_WorkItem, "Future[Any]"]] = queue.Queue() - self._broken = False - - def run_until_future(self, future: "Future[Any]") -> None: - """ - Runs the code in the work queue until a result is available from the future. - Should be run from the thread the executor is initialised in. - """ - # Check we're in the right thread - if threading.current_thread() != self._work_thread: - raise RuntimeError( - "You cannot run CurrentThreadExecutor from a different thread" - ) - future.add_done_callback(self._work_queue.put) - # Keep getting and running work items until we get the future we're waiting for - # back via the future's done callback. - try: - while True: - # Get a work item and run it - work_item = self._work_queue.get() - if work_item is future: - return - assert isinstance(work_item, _WorkItem) - work_item.run() - del work_item - finally: - self._broken = True - - def _submit( - self, - fn: Callable[_P, _R], - *args: _P.args, - **kwargs: _P.kwargs, - ) -> "Future[_R]": - # Check they're not submitting from the same thread - if threading.current_thread() == self._work_thread: - raise RuntimeError( - "You cannot submit onto CurrentThreadExecutor from its own thread" - ) - # Check they're not too late or the executor errored - if self._broken: - raise RuntimeError("CurrentThreadExecutor already quit or is broken") - # Add to work queue - f: "Future[_R]" = Future() - work_item = _WorkItem(f, fn, *args, **kwargs) - self._work_queue.put(work_item) - # Return the future - return f - - # Python 3.9+ has a new signature for submit with a "/" after `fn`, to enforce - # it to be a positional argument. If we ignore[override] mypy on 3.9+ will be - # happy but 3.8 will say that the ignore comment is unused, even when - # defining them differently based on sys.version_info. - # We should be able to remove this when we drop support for 3.8. - if not TYPE_CHECKING: - - def submit(self, fn, *args, **kwargs): - return self._submit(fn, *args, **kwargs) diff --git a/.venv/lib/python3.10/site-packages/asgiref/local.py b/.venv/lib/python3.10/site-packages/asgiref/local.py deleted file mode 100644 index a8b9459..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref/local.py +++ /dev/null @@ -1,128 +0,0 @@ -import asyncio -import contextlib -import contextvars -import threading -from typing import Any, Dict, Union - - -class _CVar: - """Storage utility for Local.""" - - def __init__(self) -> None: - self._data: "contextvars.ContextVar[Dict[str, Any]]" = contextvars.ContextVar( - "asgiref.local" - ) - - def __getattr__(self, key): - storage_object = self._data.get({}) - try: - return storage_object[key] - except KeyError: - raise AttributeError(f"{self!r} object has no attribute {key!r}") - - def __setattr__(self, key: str, value: Any) -> None: - if key == "_data": - return super().__setattr__(key, value) - - storage_object = self._data.get({}) - storage_object[key] = value - self._data.set(storage_object) - - def __delattr__(self, key: str) -> None: - storage_object = self._data.get({}) - if key in storage_object: - del storage_object[key] - self._data.set(storage_object) - else: - raise AttributeError(f"{self!r} object has no attribute {key!r}") - - -class Local: - """Local storage for async tasks. - - This is a namespace object (similar to `threading.local`) where data is - also local to the current async task (if there is one). - - In async threads, local means in the same sense as the `contextvars` - module - i.e. a value set in an async frame will be visible: - - - to other async code `await`-ed from this frame. - - to tasks spawned using `asyncio` utilities (`create_task`, `wait_for`, - `gather` and probably others). - - to code scheduled in a sync thread using `sync_to_async` - - In "sync" threads (a thread with no async event loop running), the - data is thread-local, but additionally shared with async code executed - via the `async_to_sync` utility, which schedules async code in a new thread - and copies context across to that thread. - - If `thread_critical` is True, then the local will only be visible per-thread, - behaving exactly like `threading.local` if the thread is sync, and as - `contextvars` if the thread is async. This allows genuinely thread-sensitive - code (such as DB handles) to be kept stricly to their initial thread and - disable the sharing across `sync_to_async` and `async_to_sync` wrapped calls. - - Unlike plain `contextvars` objects, this utility is threadsafe. - """ - - def __init__(self, thread_critical: bool = False) -> None: - self._thread_critical = thread_critical - self._thread_lock = threading.RLock() - - self._storage: "Union[threading.local, _CVar]" - - if thread_critical: - # Thread-local storage - self._storage = threading.local() - else: - # Contextvar storage - self._storage = _CVar() - - @contextlib.contextmanager - def _lock_storage(self): - # Thread safe access to storage - if self._thread_critical: - try: - # this is a test for are we in a async or sync - # thread - will raise RuntimeError if there is - # no current loop - asyncio.get_running_loop() - except RuntimeError: - # We are in a sync thread, the storage is - # just the plain thread local (i.e, "global within - # this thread" - it doesn't matter where you are - # in a call stack you see the same storage) - yield self._storage - else: - # We are in an async thread - storage is still - # local to this thread, but additionally should - # behave like a context var (is only visible with - # the same async call stack) - - # Ensure context exists in the current thread - if not hasattr(self._storage, "cvar"): - self._storage.cvar = _CVar() - - # self._storage is a thread local, so the members - # can't be accessed in another thread (we don't - # need any locks) - yield self._storage.cvar - else: - # Lock for thread_critical=False as other threads - # can access the exact same storage object - with self._thread_lock: - yield self._storage - - def __getattr__(self, key): - with self._lock_storage() as storage: - return getattr(storage, key) - - def __setattr__(self, key, value): - if key in ("_local", "_storage", "_thread_critical", "_thread_lock"): - return super().__setattr__(key, value) - with self._lock_storage() as storage: - setattr(storage, key, value) - - def __delattr__(self, key): - with self._lock_storage() as storage: - delattr(storage, key) diff --git a/.venv/lib/python3.10/site-packages/asgiref/py.typed b/.venv/lib/python3.10/site-packages/asgiref/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/asgiref/server.py b/.venv/lib/python3.10/site-packages/asgiref/server.py deleted file mode 100644 index 43c28c6..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref/server.py +++ /dev/null @@ -1,157 +0,0 @@ -import asyncio -import logging -import time -import traceback - -from .compatibility import guarantee_single_callable - -logger = logging.getLogger(__name__) - - -class StatelessServer: - """ - Base server class that handles basic concepts like application instance - creation/pooling, exception handling, and similar, for stateless protocols - (i.e. ones without actual incoming connections to the process) - - Your code should override the handle() method, doing whatever it needs to, - and calling get_or_create_application_instance with a unique `scope_id` - and `scope` for the scope it wants to get. - - If an application instance is found with the same `scope_id`, you are - given its input queue, otherwise one is made for you with the scope provided - and you are given that fresh new input queue. Either way, you should do - something like: - - input_queue = self.get_or_create_application_instance( - "user-123456", - {"type": "testprotocol", "user_id": "123456", "username": "andrew"}, - ) - input_queue.put_nowait(message) - - If you try and create an application instance and there are already - `max_application` instances, the oldest/least recently used one will be - reclaimed and shut down to make space. - - Application coroutines that error will be found periodically (every 100ms - by default) and have their exceptions printed to the console. Override - application_exception() if you want to do more when this happens. - - If you override run(), make sure you handle things like launching the - application checker. - """ - - application_checker_interval = 0.1 - - def __init__(self, application, max_applications=1000): - # Parameters - self.application = application - self.max_applications = max_applications - # Initialisation - self.application_instances = {} - - ### Mainloop and handling - - def run(self): - """ - Runs the asyncio event loop with our handler loop. - """ - event_loop = asyncio.get_event_loop() - asyncio.ensure_future(self.application_checker()) - try: - event_loop.run_until_complete(self.handle()) - except KeyboardInterrupt: - logger.info("Exiting due to Ctrl-C/interrupt") - - async def handle(self): - raise NotImplementedError("You must implement handle()") - - async def application_send(self, scope, message): - """ - Receives outbound sends from applications and handles them. - """ - raise NotImplementedError("You must implement application_send()") - - ### Application instance management - - def get_or_create_application_instance(self, scope_id, scope): - """ - Creates an application instance and returns its queue. - """ - if scope_id in self.application_instances: - self.application_instances[scope_id]["last_used"] = time.time() - return self.application_instances[scope_id]["input_queue"] - # See if we need to delete an old one - while len(self.application_instances) > self.max_applications: - self.delete_oldest_application_instance() - # Make an instance of the application - input_queue = asyncio.Queue() - application_instance = guarantee_single_callable(self.application) - # Run it, and stash the future for later checking - future = asyncio.ensure_future( - application_instance( - scope=scope, - receive=input_queue.get, - send=lambda message: self.application_send(scope, message), - ), - ) - self.application_instances[scope_id] = { - "input_queue": input_queue, - "future": future, - "scope": scope, - "last_used": time.time(), - } - return input_queue - - def delete_oldest_application_instance(self): - """ - Finds and deletes the oldest application instance - """ - oldest_time = min( - details["last_used"] for details in self.application_instances.values() - ) - for scope_id, details in self.application_instances.items(): - if details["last_used"] == oldest_time: - self.delete_application_instance(scope_id) - # Return to make sure we only delete one in case two have - # the same oldest time - return - - def delete_application_instance(self, scope_id): - """ - Removes an application instance (makes sure its task is stopped, - then removes it from the current set) - """ - details = self.application_instances[scope_id] - del self.application_instances[scope_id] - if not details["future"].done(): - details["future"].cancel() - - async def application_checker(self): - """ - Goes through the set of current application instance Futures and cleans up - any that are done/prints exceptions for any that errored. - """ - while True: - await asyncio.sleep(self.application_checker_interval) - for scope_id, details in list(self.application_instances.items()): - if details["future"].done(): - exception = details["future"].exception() - if exception: - await self.application_exception(exception, details) - try: - del self.application_instances[scope_id] - except KeyError: - # Exception handling might have already got here before us. That's fine. - pass - - async def application_exception(self, exception, application_details): - """ - Called whenever an application coroutine has an exception. - """ - logging.error( - "Exception inside application: %s\n%s%s", - exception, - "".join(traceback.format_tb(exception.__traceback__)), - f" {exception}", - ) diff --git a/.venv/lib/python3.10/site-packages/asgiref/sync.py b/.venv/lib/python3.10/site-packages/asgiref/sync.py deleted file mode 100644 index 4427fc2..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref/sync.py +++ /dev/null @@ -1,613 +0,0 @@ -import asyncio -import asyncio.coroutines -import contextvars -import functools -import inspect -import os -import sys -import threading -import warnings -import weakref -from concurrent.futures import Future, ThreadPoolExecutor -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Coroutine, - Dict, - Generic, - List, - Optional, - TypeVar, - Union, - overload, -) - -from .current_thread_executor import CurrentThreadExecutor -from .local import Local - -if sys.version_info >= (3, 10): - from typing import ParamSpec -else: - from typing_extensions import ParamSpec - -if TYPE_CHECKING: - # This is not available to import at runtime - from _typeshed import OptExcInfo - -_F = TypeVar("_F", bound=Callable[..., Any]) -_P = ParamSpec("_P") -_R = TypeVar("_R") - - -def _restore_context(context: contextvars.Context) -> None: - # Check for changes in contextvars, and set them to the current - # context for downstream consumers - for cvar in context: - cvalue = context.get(cvar) - try: - if cvar.get() != cvalue: - cvar.set(cvalue) - except LookupError: - cvar.set(cvalue) - - -# Python 3.12 deprecates asyncio.iscoroutinefunction() as an alias for -# inspect.iscoroutinefunction(), whilst also removing the _is_coroutine marker. -# The latter is replaced with the inspect.markcoroutinefunction decorator. -# Until 3.12 is the minimum supported Python version, provide a shim. - -if hasattr(inspect, "markcoroutinefunction"): - iscoroutinefunction = inspect.iscoroutinefunction - markcoroutinefunction: Callable[[_F], _F] = inspect.markcoroutinefunction -else: - iscoroutinefunction = asyncio.iscoroutinefunction # type: ignore[assignment] - - def markcoroutinefunction(func: _F) -> _F: - func._is_coroutine = asyncio.coroutines._is_coroutine # type: ignore - return func - - -class ThreadSensitiveContext: - """Async context manager to manage context for thread sensitive mode - - This context manager controls which thread pool executor is used when in - thread sensitive mode. By default, a single thread pool executor is shared - within a process. - - The ThreadSensitiveContext() context manager may be used to specify a - thread pool per context. - - This context manager is re-entrant, so only the outer-most call to - ThreadSensitiveContext will set the context. - - Usage: - - >>> import time - >>> async with ThreadSensitiveContext(): - ... await sync_to_async(time.sleep, 1)() - """ - - def __init__(self): - self.token = None - - async def __aenter__(self): - try: - SyncToAsync.thread_sensitive_context.get() - except LookupError: - self.token = SyncToAsync.thread_sensitive_context.set(self) - - return self - - async def __aexit__(self, exc, value, tb): - if not self.token: - return - - executor = SyncToAsync.context_to_thread_executor.pop(self, None) - if executor: - executor.shutdown() - SyncToAsync.thread_sensitive_context.reset(self.token) - - -class AsyncToSync(Generic[_P, _R]): - """ - Utility class which turns an awaitable that only works on the thread with - the event loop into a synchronous callable that works in a subthread. - - If the call stack contains an async loop, the code runs there. - Otherwise, the code runs in a new loop in a new thread. - - Either way, this thread then pauses and waits to run any thread_sensitive - code called from further down the call stack using SyncToAsync, before - finally exiting once the async task returns. - """ - - # Keeps a reference to the CurrentThreadExecutor in local context, so that - # any sync_to_async inside the wrapped code can find it. - executors: "Local" = Local() - - # When we can't find a CurrentThreadExecutor from the context, such as - # inside create_task, we'll look it up here from the running event loop. - loop_thread_executors: "Dict[asyncio.AbstractEventLoop, CurrentThreadExecutor]" = {} - - def __init__( - self, - awaitable: Union[ - Callable[_P, Coroutine[Any, Any, _R]], - Callable[_P, Awaitable[_R]], - ], - force_new_loop: bool = False, - ): - if not callable(awaitable) or ( - not iscoroutinefunction(awaitable) - and not iscoroutinefunction(getattr(awaitable, "__call__", awaitable)) - ): - # Python does not have very reliable detection of async functions - # (lots of false negatives) so this is just a warning. - warnings.warn( - "async_to_sync was passed a non-async-marked callable", stacklevel=2 - ) - self.awaitable = awaitable - try: - self.__self__ = self.awaitable.__self__ # type: ignore[union-attr] - except AttributeError: - pass - self.force_new_loop = force_new_loop - self.main_event_loop = None - try: - self.main_event_loop = asyncio.get_running_loop() - except RuntimeError: - # There's no event loop in this thread. - pass - - def __call__(self, *args: _P.args, **kwargs: _P.kwargs) -> _R: - __traceback_hide__ = True # noqa: F841 - - if not self.force_new_loop and not self.main_event_loop: - # There's no event loop in this thread. Look for the threadlocal if - # we're inside SyncToAsync - main_event_loop_pid = getattr( - SyncToAsync.threadlocal, "main_event_loop_pid", None - ) - # We make sure the parent loop is from the same process - if - # they've forked, this is not going to be valid any more (#194) - if main_event_loop_pid and main_event_loop_pid == os.getpid(): - self.main_event_loop = getattr( - SyncToAsync.threadlocal, "main_event_loop", None - ) - - # You can't call AsyncToSync from a thread with a running event loop - try: - event_loop = asyncio.get_running_loop() - except RuntimeError: - pass - else: - if event_loop.is_running(): - raise RuntimeError( - "You cannot use AsyncToSync in the same thread as an async event loop - " - "just await the async function directly." - ) - - # Make a future for the return information - call_result: "Future[_R]" = Future() - - # Make a CurrentThreadExecutor we'll use to idle in this thread - we - # need one for every sync frame, even if there's one above us in the - # same thread. - old_executor = getattr(self.executors, "current", None) - current_executor = CurrentThreadExecutor() - self.executors.current = current_executor - - # Wrapping context in list so it can be reassigned from within - # `main_wrap`. - context = [contextvars.copy_context()] - - # Get task context so that parent task knows which task to propagate - # an asyncio.CancelledError to. - task_context = getattr(SyncToAsync.threadlocal, "task_context", None) - - loop = None - # Use call_soon_threadsafe to schedule a synchronous callback on the - # main event loop's thread if it's there, otherwise make a new loop - # in this thread. - try: - awaitable = self.main_wrap( - call_result, - sys.exc_info(), - task_context, - context, - *args, - **kwargs, - ) - - if not (self.main_event_loop and self.main_event_loop.is_running()): - # Make our own event loop - in a new thread - and run inside that. - loop = asyncio.new_event_loop() - self.loop_thread_executors[loop] = current_executor - loop_executor = ThreadPoolExecutor(max_workers=1) - loop_future = loop_executor.submit( - self._run_event_loop, loop, awaitable - ) - if current_executor: - # Run the CurrentThreadExecutor until the future is done - current_executor.run_until_future(loop_future) - # Wait for future and/or allow for exception propagation - loop_future.result() - else: - # Call it inside the existing loop - self.main_event_loop.call_soon_threadsafe( - self.main_event_loop.create_task, awaitable - ) - if current_executor: - # Run the CurrentThreadExecutor until the future is done - current_executor.run_until_future(call_result) - finally: - # Clean up any executor we were running - if loop is not None: - del self.loop_thread_executors[loop] - _restore_context(context[0]) - # Restore old current thread executor state - self.executors.current = old_executor - - # Wait for results from the future. - return call_result.result() - - def _run_event_loop(self, loop, coro): - """ - Runs the given event loop (designed to be called in a thread). - """ - asyncio.set_event_loop(loop) - try: - loop.run_until_complete(coro) - finally: - try: - # mimic asyncio.run() behavior - # cancel unexhausted async generators - tasks = asyncio.all_tasks(loop) - for task in tasks: - task.cancel() - - async def gather(): - await asyncio.gather(*tasks, return_exceptions=True) - - loop.run_until_complete(gather()) - for task in tasks: - if task.cancelled(): - continue - if task.exception() is not None: - loop.call_exception_handler( - { - "message": "unhandled exception during loop shutdown", - "exception": task.exception(), - "task": task, - } - ) - if hasattr(loop, "shutdown_asyncgens"): - loop.run_until_complete(loop.shutdown_asyncgens()) - finally: - loop.close() - asyncio.set_event_loop(self.main_event_loop) - - def __get__(self, parent: Any, objtype: Any) -> Callable[_P, _R]: - """ - Include self for methods - """ - func = functools.partial(self.__call__, parent) - return functools.update_wrapper(func, self.awaitable) - - async def main_wrap( - self, - call_result: "Future[_R]", - exc_info: "OptExcInfo", - task_context: "Optional[List[asyncio.Task[Any]]]", - context: List[contextvars.Context], - *args: _P.args, - **kwargs: _P.kwargs, - ) -> None: - """ - Wraps the awaitable with something that puts the result into the - result/exception future. - """ - - __traceback_hide__ = True # noqa: F841 - - if context is not None: - _restore_context(context[0]) - - current_task = asyncio.current_task() - if current_task is not None and task_context is not None: - task_context.append(current_task) - - try: - # If we have an exception, run the function inside the except block - # after raising it so exc_info is correctly populated. - if exc_info[1]: - try: - raise exc_info[1] - except BaseException: - result = await self.awaitable(*args, **kwargs) - else: - result = await self.awaitable(*args, **kwargs) - except BaseException as e: - call_result.set_exception(e) - else: - call_result.set_result(result) - finally: - if current_task is not None and task_context is not None: - task_context.remove(current_task) - context[0] = contextvars.copy_context() - - -class SyncToAsync(Generic[_P, _R]): - """ - Utility class which turns a synchronous callable into an awaitable that - runs in a threadpool. It also sets a threadlocal inside the thread so - calls to AsyncToSync can escape it. - - If thread_sensitive is passed, the code will run in the same thread as any - outer code. This is needed for underlying Python code that is not - threadsafe (for example, code which handles SQLite database connections). - - If the outermost program is async (i.e. SyncToAsync is outermost), then - this will be a dedicated single sub-thread that all sync code runs in, - one after the other. If the outermost program is sync (i.e. AsyncToSync is - outermost), this will just be the main thread. This is achieved by idling - with a CurrentThreadExecutor while AsyncToSync is blocking its sync parent, - rather than just blocking. - - If executor is passed in, that will be used instead of the loop's default executor. - In order to pass in an executor, thread_sensitive must be set to False, otherwise - a TypeError will be raised. - """ - - # Storage for main event loop references - threadlocal = threading.local() - - # Single-thread executor for thread-sensitive code - single_thread_executor = ThreadPoolExecutor(max_workers=1) - - # Maintain a contextvar for the current execution context. Optionally used - # for thread sensitive mode. - thread_sensitive_context: "contextvars.ContextVar[ThreadSensitiveContext]" = ( - contextvars.ContextVar("thread_sensitive_context") - ) - - # Contextvar that is used to detect if the single thread executor - # would be awaited on while already being used in the same context - deadlock_context: "contextvars.ContextVar[bool]" = contextvars.ContextVar( - "deadlock_context" - ) - - # Maintaining a weak reference to the context ensures that thread pools are - # erased once the context goes out of scope. This terminates the thread pool. - context_to_thread_executor: "weakref.WeakKeyDictionary[ThreadSensitiveContext, ThreadPoolExecutor]" = ( - weakref.WeakKeyDictionary() - ) - - def __init__( - self, - func: Callable[_P, _R], - thread_sensitive: bool = True, - executor: Optional["ThreadPoolExecutor"] = None, - ) -> None: - if ( - not callable(func) - or iscoroutinefunction(func) - or iscoroutinefunction(getattr(func, "__call__", func)) - ): - raise TypeError("sync_to_async can only be applied to sync functions.") - self.func = func - functools.update_wrapper(self, func) - self._thread_sensitive = thread_sensitive - markcoroutinefunction(self) - if thread_sensitive and executor is not None: - raise TypeError("executor must not be set when thread_sensitive is True") - self._executor = executor - try: - self.__self__ = func.__self__ # type: ignore - except AttributeError: - pass - - async def __call__(self, *args: _P.args, **kwargs: _P.kwargs) -> _R: - __traceback_hide__ = True # noqa: F841 - loop = asyncio.get_running_loop() - - # Work out what thread to run the code in - if self._thread_sensitive: - current_thread_executor = getattr(AsyncToSync.executors, "current", None) - if current_thread_executor: - # If we have a parent sync thread above somewhere, use that - executor = current_thread_executor - elif self.thread_sensitive_context.get(None): - # If we have a way of retrieving the current context, attempt - # to use a per-context thread pool executor - thread_sensitive_context = self.thread_sensitive_context.get() - - if thread_sensitive_context in self.context_to_thread_executor: - # Re-use thread executor in current context - executor = self.context_to_thread_executor[thread_sensitive_context] - else: - # Create new thread executor in current context - executor = ThreadPoolExecutor(max_workers=1) - self.context_to_thread_executor[thread_sensitive_context] = executor - elif loop in AsyncToSync.loop_thread_executors: - # Re-use thread executor for running loop - executor = AsyncToSync.loop_thread_executors[loop] - elif self.deadlock_context.get(False): - raise RuntimeError( - "Single thread executor already being used, would deadlock" - ) - else: - # Otherwise, we run it in a fixed single thread - executor = self.single_thread_executor - self.deadlock_context.set(True) - else: - # Use the passed in executor, or the loop's default if it is None - executor = self._executor - - context = contextvars.copy_context() - child = functools.partial(self.func, *args, **kwargs) - func = context.run - task_context: List[asyncio.Task[Any]] = [] - - # Run the code in the right thread - exec_coro = loop.run_in_executor( - executor, - functools.partial( - self.thread_handler, - loop, - sys.exc_info(), - task_context, - func, - child, - ), - ) - ret: _R - try: - ret = await asyncio.shield(exec_coro) - except asyncio.CancelledError: - cancel_parent = True - try: - task = task_context[0] - task.cancel() - try: - await task - cancel_parent = False - except asyncio.CancelledError: - pass - except IndexError: - pass - if exec_coro.done(): - raise - if cancel_parent: - exec_coro.cancel() - ret = await exec_coro - finally: - _restore_context(context) - self.deadlock_context.set(False) - - return ret - - def __get__( - self, parent: Any, objtype: Any - ) -> Callable[_P, Coroutine[Any, Any, _R]]: - """ - Include self for methods - """ - func = functools.partial(self.__call__, parent) - return functools.update_wrapper(func, self.func) - - def thread_handler(self, loop, exc_info, task_context, func, *args, **kwargs): - """ - Wraps the sync application with exception handling. - """ - - __traceback_hide__ = True # noqa: F841 - - # Set the threadlocal for AsyncToSync - self.threadlocal.main_event_loop = loop - self.threadlocal.main_event_loop_pid = os.getpid() - self.threadlocal.task_context = task_context - - # Run the function - # If we have an exception, run the function inside the except block - # after raising it so exc_info is correctly populated. - if exc_info[1]: - try: - raise exc_info[1] - except BaseException: - return func(*args, **kwargs) - else: - return func(*args, **kwargs) - - -@overload -def async_to_sync( - *, - force_new_loop: bool = False, -) -> Callable[ - [Union[Callable[_P, Coroutine[Any, Any, _R]], Callable[_P, Awaitable[_R]]]], - Callable[_P, _R], -]: - ... - - -@overload -def async_to_sync( - awaitable: Union[ - Callable[_P, Coroutine[Any, Any, _R]], - Callable[_P, Awaitable[_R]], - ], - *, - force_new_loop: bool = False, -) -> Callable[_P, _R]: - ... - - -def async_to_sync( - awaitable: Optional[ - Union[ - Callable[_P, Coroutine[Any, Any, _R]], - Callable[_P, Awaitable[_R]], - ] - ] = None, - *, - force_new_loop: bool = False, -) -> Union[ - Callable[ - [Union[Callable[_P, Coroutine[Any, Any, _R]], Callable[_P, Awaitable[_R]]]], - Callable[_P, _R], - ], - Callable[_P, _R], -]: - if awaitable is None: - return lambda f: AsyncToSync( - f, - force_new_loop=force_new_loop, - ) - return AsyncToSync( - awaitable, - force_new_loop=force_new_loop, - ) - - -@overload -def sync_to_async( - *, - thread_sensitive: bool = True, - executor: Optional["ThreadPoolExecutor"] = None, -) -> Callable[[Callable[_P, _R]], Callable[_P, Coroutine[Any, Any, _R]]]: - ... - - -@overload -def sync_to_async( - func: Callable[_P, _R], - *, - thread_sensitive: bool = True, - executor: Optional["ThreadPoolExecutor"] = None, -) -> Callable[_P, Coroutine[Any, Any, _R]]: - ... - - -def sync_to_async( - func: Optional[Callable[_P, _R]] = None, - *, - thread_sensitive: bool = True, - executor: Optional["ThreadPoolExecutor"] = None, -) -> Union[ - Callable[[Callable[_P, _R]], Callable[_P, Coroutine[Any, Any, _R]]], - Callable[_P, Coroutine[Any, Any, _R]], -]: - if func is None: - return lambda f: SyncToAsync( - f, - thread_sensitive=thread_sensitive, - executor=executor, - ) - return SyncToAsync( - func, - thread_sensitive=thread_sensitive, - executor=executor, - ) diff --git a/.venv/lib/python3.10/site-packages/asgiref/testing.py b/.venv/lib/python3.10/site-packages/asgiref/testing.py deleted file mode 100644 index aa7cff1..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref/testing.py +++ /dev/null @@ -1,103 +0,0 @@ -import asyncio -import contextvars -import time - -from .compatibility import guarantee_single_callable -from .timeout import timeout as async_timeout - - -class ApplicationCommunicator: - """ - Runs an ASGI application in a test mode, allowing sending of - messages to it and retrieval of messages it sends. - """ - - def __init__(self, application, scope): - self.application = guarantee_single_callable(application) - self.scope = scope - self.input_queue = asyncio.Queue() - self.output_queue = asyncio.Queue() - # Clear context - this ensures that context vars set in the testing scope - # are not "leaked" into the application which would normally begin with - # an empty context. In Python >= 3.11 this could also be written as: - # asyncio.create_task(..., context=contextvars.Context()) - self.future = contextvars.Context().run( - asyncio.create_task, - self.application(scope, self.input_queue.get, self.output_queue.put), - ) - - async def wait(self, timeout=1): - """ - Waits for the application to stop itself and returns any exceptions. - """ - try: - async with async_timeout(timeout): - try: - await self.future - self.future.result() - except asyncio.CancelledError: - pass - finally: - if not self.future.done(): - self.future.cancel() - try: - await self.future - except asyncio.CancelledError: - pass - - def stop(self, exceptions=True): - if not self.future.done(): - self.future.cancel() - elif exceptions: - # Give a chance to raise any exceptions - self.future.result() - - def __del__(self): - # Clean up on deletion - try: - self.stop(exceptions=False) - except RuntimeError: - # Event loop already stopped - pass - - async def send_input(self, message): - """ - Sends a single message to the application - """ - # Give it the message - await self.input_queue.put(message) - - async def receive_output(self, timeout=1): - """ - Receives a single message from the application, with optional timeout. - """ - # Make sure there's not an exception to raise from the task - if self.future.done(): - self.future.result() - # Wait and receive the message - try: - async with async_timeout(timeout): - return await self.output_queue.get() - except asyncio.TimeoutError as e: - # See if we have another error to raise inside - if self.future.done(): - self.future.result() - else: - self.future.cancel() - try: - await self.future - except asyncio.CancelledError: - pass - raise e - - async def receive_nothing(self, timeout=0.1, interval=0.01): - """ - Checks that there is no message to receive in the given time. - """ - # `interval` has precedence over `timeout` - start = time.monotonic() - while time.monotonic() - start < timeout: - if not self.output_queue.empty(): - return False - await asyncio.sleep(interval) - return self.output_queue.empty() diff --git a/.venv/lib/python3.10/site-packages/asgiref/timeout.py b/.venv/lib/python3.10/site-packages/asgiref/timeout.py deleted file mode 100644 index fd5381d..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref/timeout.py +++ /dev/null @@ -1,118 +0,0 @@ -# This code is originally sourced from the aio-libs project "async_timeout", -# under the Apache 2.0 license. You may see the original project at -# https://github.com/aio-libs/async-timeout - -# It is vendored here to reduce chain-dependencies on this library, and -# modified slightly to remove some features we don't use. - - -import asyncio -import warnings -from types import TracebackType -from typing import Any # noqa -from typing import Optional, Type - - -class timeout: - """timeout context manager. - - Useful in cases when you want to apply timeout logic around block - of code or in cases when asyncio.wait_for is not suitable. For example: - - >>> with timeout(0.001): - ... async with aiohttp.get('https://github.com') as r: - ... await r.text() - - - timeout - value in seconds or None to disable timeout logic - loop - asyncio compatible event loop - """ - - def __init__( - self, - timeout: Optional[float], - *, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - self._timeout = timeout - if loop is None: - loop = asyncio.get_running_loop() - else: - warnings.warn( - """The loop argument to timeout() is deprecated.""", DeprecationWarning - ) - self._loop = loop - self._task = None # type: Optional[asyncio.Task[Any]] - self._cancelled = False - self._cancel_handler = None # type: Optional[asyncio.Handle] - self._cancel_at = None # type: Optional[float] - - def __enter__(self) -> "timeout": - return self._do_enter() - - def __exit__( - self, - exc_type: Type[BaseException], - exc_val: BaseException, - exc_tb: TracebackType, - ) -> Optional[bool]: - self._do_exit(exc_type) - return None - - async def __aenter__(self) -> "timeout": - return self._do_enter() - - async def __aexit__( - self, - exc_type: Type[BaseException], - exc_val: BaseException, - exc_tb: TracebackType, - ) -> None: - self._do_exit(exc_type) - - @property - def expired(self) -> bool: - return self._cancelled - - @property - def remaining(self) -> Optional[float]: - if self._cancel_at is not None: - return max(self._cancel_at - self._loop.time(), 0.0) - else: - return None - - def _do_enter(self) -> "timeout": - # Support Tornado 5- without timeout - # Details: https://github.com/python/asyncio/issues/392 - if self._timeout is None: - return self - - self._task = asyncio.current_task(self._loop) - if self._task is None: - raise RuntimeError( - "Timeout context manager should be used " "inside a task" - ) - - if self._timeout <= 0: - self._loop.call_soon(self._cancel_task) - return self - - self._cancel_at = self._loop.time() + self._timeout - self._cancel_handler = self._loop.call_at(self._cancel_at, self._cancel_task) - return self - - def _do_exit(self, exc_type: Type[BaseException]) -> None: - if exc_type is asyncio.CancelledError and self._cancelled: - self._cancel_handler = None - self._task = None - raise asyncio.TimeoutError - if self._timeout is not None and self._cancel_handler is not None: - self._cancel_handler.cancel() - self._cancel_handler = None - self._task = None - return None - - def _cancel_task(self) -> None: - if self._task is not None: - self._task.cancel() - self._cancelled = True diff --git a/.venv/lib/python3.10/site-packages/asgiref/typing.py b/.venv/lib/python3.10/site-packages/asgiref/typing.py deleted file mode 100644 index 71c25ed..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref/typing.py +++ /dev/null @@ -1,278 +0,0 @@ -import sys -from typing import ( - Any, - Awaitable, - Callable, - Dict, - Iterable, - Literal, - Optional, - Protocol, - Tuple, - Type, - TypedDict, - Union, -) - -if sys.version_info >= (3, 11): - from typing import NotRequired -else: - from typing_extensions import NotRequired - -__all__ = ( - "ASGIVersions", - "HTTPScope", - "WebSocketScope", - "LifespanScope", - "WWWScope", - "Scope", - "HTTPRequestEvent", - "HTTPResponseStartEvent", - "HTTPResponseBodyEvent", - "HTTPResponseTrailersEvent", - "HTTPResponsePathsendEvent", - "HTTPServerPushEvent", - "HTTPDisconnectEvent", - "WebSocketConnectEvent", - "WebSocketAcceptEvent", - "WebSocketReceiveEvent", - "WebSocketSendEvent", - "WebSocketResponseStartEvent", - "WebSocketResponseBodyEvent", - "WebSocketDisconnectEvent", - "WebSocketCloseEvent", - "LifespanStartupEvent", - "LifespanShutdownEvent", - "LifespanStartupCompleteEvent", - "LifespanStartupFailedEvent", - "LifespanShutdownCompleteEvent", - "LifespanShutdownFailedEvent", - "ASGIReceiveEvent", - "ASGISendEvent", - "ASGIReceiveCallable", - "ASGISendCallable", - "ASGI2Protocol", - "ASGI2Application", - "ASGI3Application", - "ASGIApplication", -) - - -class ASGIVersions(TypedDict): - spec_version: str - version: Union[Literal["2.0"], Literal["3.0"]] - - -class HTTPScope(TypedDict): - type: Literal["http"] - asgi: ASGIVersions - http_version: str - method: str - scheme: str - path: str - raw_path: bytes - query_string: bytes - root_path: str - headers: Iterable[Tuple[bytes, bytes]] - client: Optional[Tuple[str, int]] - server: Optional[Tuple[str, Optional[int]]] - state: NotRequired[Dict[str, Any]] - extensions: Optional[Dict[str, Dict[object, object]]] - - -class WebSocketScope(TypedDict): - type: Literal["websocket"] - asgi: ASGIVersions - http_version: str - scheme: str - path: str - raw_path: bytes - query_string: bytes - root_path: str - headers: Iterable[Tuple[bytes, bytes]] - client: Optional[Tuple[str, int]] - server: Optional[Tuple[str, Optional[int]]] - subprotocols: Iterable[str] - state: NotRequired[Dict[str, Any]] - extensions: Optional[Dict[str, Dict[object, object]]] - - -class LifespanScope(TypedDict): - type: Literal["lifespan"] - asgi: ASGIVersions - state: NotRequired[Dict[str, Any]] - - -WWWScope = Union[HTTPScope, WebSocketScope] -Scope = Union[HTTPScope, WebSocketScope, LifespanScope] - - -class HTTPRequestEvent(TypedDict): - type: Literal["http.request"] - body: bytes - more_body: bool - - -class HTTPResponseDebugEvent(TypedDict): - type: Literal["http.response.debug"] - info: Dict[str, object] - - -class HTTPResponseStartEvent(TypedDict): - type: Literal["http.response.start"] - status: int - headers: Iterable[Tuple[bytes, bytes]] - trailers: bool - - -class HTTPResponseBodyEvent(TypedDict): - type: Literal["http.response.body"] - body: bytes - more_body: bool - - -class HTTPResponseTrailersEvent(TypedDict): - type: Literal["http.response.trailers"] - headers: Iterable[Tuple[bytes, bytes]] - more_trailers: bool - - -class HTTPResponsePathsendEvent(TypedDict): - type: Literal["http.response.pathsend"] - path: str - - -class HTTPServerPushEvent(TypedDict): - type: Literal["http.response.push"] - path: str - headers: Iterable[Tuple[bytes, bytes]] - - -class HTTPDisconnectEvent(TypedDict): - type: Literal["http.disconnect"] - - -class WebSocketConnectEvent(TypedDict): - type: Literal["websocket.connect"] - - -class WebSocketAcceptEvent(TypedDict): - type: Literal["websocket.accept"] - subprotocol: Optional[str] - headers: Iterable[Tuple[bytes, bytes]] - - -class WebSocketReceiveEvent(TypedDict): - type: Literal["websocket.receive"] - bytes: Optional[bytes] - text: Optional[str] - - -class WebSocketSendEvent(TypedDict): - type: Literal["websocket.send"] - bytes: Optional[bytes] - text: Optional[str] - - -class WebSocketResponseStartEvent(TypedDict): - type: Literal["websocket.http.response.start"] - status: int - headers: Iterable[Tuple[bytes, bytes]] - - -class WebSocketResponseBodyEvent(TypedDict): - type: Literal["websocket.http.response.body"] - body: bytes - more_body: bool - - -class WebSocketDisconnectEvent(TypedDict): - type: Literal["websocket.disconnect"] - code: int - - -class WebSocketCloseEvent(TypedDict): - type: Literal["websocket.close"] - code: int - reason: Optional[str] - - -class LifespanStartupEvent(TypedDict): - type: Literal["lifespan.startup"] - - -class LifespanShutdownEvent(TypedDict): - type: Literal["lifespan.shutdown"] - - -class LifespanStartupCompleteEvent(TypedDict): - type: Literal["lifespan.startup.complete"] - - -class LifespanStartupFailedEvent(TypedDict): - type: Literal["lifespan.startup.failed"] - message: str - - -class LifespanShutdownCompleteEvent(TypedDict): - type: Literal["lifespan.shutdown.complete"] - - -class LifespanShutdownFailedEvent(TypedDict): - type: Literal["lifespan.shutdown.failed"] - message: str - - -ASGIReceiveEvent = Union[ - HTTPRequestEvent, - HTTPDisconnectEvent, - WebSocketConnectEvent, - WebSocketReceiveEvent, - WebSocketDisconnectEvent, - LifespanStartupEvent, - LifespanShutdownEvent, -] - - -ASGISendEvent = Union[ - HTTPResponseStartEvent, - HTTPResponseBodyEvent, - HTTPResponseTrailersEvent, - HTTPServerPushEvent, - HTTPDisconnectEvent, - WebSocketAcceptEvent, - WebSocketSendEvent, - WebSocketResponseStartEvent, - WebSocketResponseBodyEvent, - WebSocketCloseEvent, - LifespanStartupCompleteEvent, - LifespanStartupFailedEvent, - LifespanShutdownCompleteEvent, - LifespanShutdownFailedEvent, -] - - -ASGIReceiveCallable = Callable[[], Awaitable[ASGIReceiveEvent]] -ASGISendCallable = Callable[[ASGISendEvent], Awaitable[None]] - - -class ASGI2Protocol(Protocol): - def __init__(self, scope: Scope) -> None: - ... - - async def __call__( - self, receive: ASGIReceiveCallable, send: ASGISendCallable - ) -> None: - ... - - -ASGI2Application = Type[ASGI2Protocol] -ASGI3Application = Callable[ - [ - Scope, - ASGIReceiveCallable, - ASGISendCallable, - ], - Awaitable[None], -] -ASGIApplication = Union[ASGI2Application, ASGI3Application] diff --git a/.venv/lib/python3.10/site-packages/asgiref/wsgi.py b/.venv/lib/python3.10/site-packages/asgiref/wsgi.py deleted file mode 100644 index 65af427..0000000 --- a/.venv/lib/python3.10/site-packages/asgiref/wsgi.py +++ /dev/null @@ -1,166 +0,0 @@ -from io import BytesIO -from tempfile import SpooledTemporaryFile - -from asgiref.sync import AsyncToSync, sync_to_async - - -class WsgiToAsgi: - """ - Wraps a WSGI application to make it into an ASGI application. - """ - - def __init__(self, wsgi_application): - self.wsgi_application = wsgi_application - - async def __call__(self, scope, receive, send): - """ - ASGI application instantiation point. - We return a new WsgiToAsgiInstance here with the WSGI app - and the scope, ready to respond when it is __call__ed. - """ - await WsgiToAsgiInstance(self.wsgi_application)(scope, receive, send) - - -class WsgiToAsgiInstance: - """ - Per-socket instance of a wrapped WSGI application - """ - - def __init__(self, wsgi_application): - self.wsgi_application = wsgi_application - self.response_started = False - self.response_content_length = None - - async def __call__(self, scope, receive, send): - if scope["type"] != "http": - raise ValueError("WSGI wrapper received a non-HTTP scope") - self.scope = scope - with SpooledTemporaryFile(max_size=65536) as body: - # Alright, wait for the http.request messages - while True: - message = await receive() - if message["type"] != "http.request": - raise ValueError("WSGI wrapper received a non-HTTP-request message") - body.write(message.get("body", b"")) - if not message.get("more_body"): - break - body.seek(0) - # Wrap send so it can be called from the subthread - self.sync_send = AsyncToSync(send) - # Call the WSGI app - await self.run_wsgi_app(body) - - def build_environ(self, scope, body): - """ - Builds a scope and request body into a WSGI environ object. - """ - script_name = scope.get("root_path", "").encode("utf8").decode("latin1") - path_info = scope["path"].encode("utf8").decode("latin1") - if path_info.startswith(script_name): - path_info = path_info[len(script_name) :] - environ = { - "REQUEST_METHOD": scope["method"], - "SCRIPT_NAME": script_name, - "PATH_INFO": path_info, - "QUERY_STRING": scope["query_string"].decode("ascii"), - "SERVER_PROTOCOL": "HTTP/%s" % scope["http_version"], - "wsgi.version": (1, 0), - "wsgi.url_scheme": scope.get("scheme", "http"), - "wsgi.input": body, - "wsgi.errors": BytesIO(), - "wsgi.multithread": True, - "wsgi.multiprocess": True, - "wsgi.run_once": False, - } - # Get server name and port - required in WSGI, not in ASGI - if "server" in scope: - environ["SERVER_NAME"] = scope["server"][0] - environ["SERVER_PORT"] = str(scope["server"][1]) - else: - environ["SERVER_NAME"] = "localhost" - environ["SERVER_PORT"] = "80" - - if scope.get("client") is not None: - environ["REMOTE_ADDR"] = scope["client"][0] - - # Go through headers and make them into environ entries - for name, value in self.scope.get("headers", []): - name = name.decode("latin1") - if name == "content-length": - corrected_name = "CONTENT_LENGTH" - elif name == "content-type": - corrected_name = "CONTENT_TYPE" - else: - corrected_name = "HTTP_%s" % name.upper().replace("-", "_") - # HTTPbis say only ASCII chars are allowed in headers, but we latin1 just in case - value = value.decode("latin1") - if corrected_name in environ: - value = environ[corrected_name] + "," + value - environ[corrected_name] = value - return environ - - def start_response(self, status, response_headers, exc_info=None): - """ - WSGI start_response callable. - """ - # Don't allow re-calling once response has begun - if self.response_started: - raise exc_info[1].with_traceback(exc_info[2]) - # Don't allow re-calling without exc_info - if hasattr(self, "response_start") and exc_info is None: - raise ValueError( - "You cannot call start_response a second time without exc_info" - ) - # Extract status code - status_code, _ = status.split(" ", 1) - status_code = int(status_code) - # Extract headers - headers = [ - (name.lower().encode("ascii"), value.encode("ascii")) - for name, value in response_headers - ] - # Extract content-length - self.response_content_length = None - for name, value in response_headers: - if name.lower() == "content-length": - self.response_content_length = int(value) - # Build and send response start message. - self.response_start = { - "type": "http.response.start", - "status": status_code, - "headers": headers, - } - - @sync_to_async - def run_wsgi_app(self, body): - """ - Called in a subthread to run the WSGI app. We encapsulate like - this so that the start_response callable is called in the same thread. - """ - # Translate the scope and incoming request body into a WSGI environ - environ = self.build_environ(self.scope, body) - # Run the WSGI app - bytes_sent = 0 - for output in self.wsgi_application(environ, self.start_response): - # If this is the first response, include the response headers - if not self.response_started: - self.response_started = True - self.sync_send(self.response_start) - # If the application supplies a Content-Length header - if self.response_content_length is not None: - # The server should not transmit more bytes to the client than the header allows - bytes_allowed = self.response_content_length - bytes_sent - if len(output) > bytes_allowed: - output = output[:bytes_allowed] - self.sync_send( - {"type": "http.response.body", "body": output, "more_body": True} - ) - bytes_sent += len(output) - # The server should stop iterating over the response when enough data has been sent - if bytes_sent == self.response_content_length: - break - # Close connection - if not self.response_started: - self.response_started = True - self.sync_send(self.response_start) - self.sync_send({"type": "http.response.body"}) diff --git a/.venv/lib/python3.10/site-packages/attr/__init__.py b/.venv/lib/python3.10/site-packages/attr/__init__.py deleted file mode 100644 index 5c6e065..0000000 --- a/.venv/lib/python3.10/site-packages/attr/__init__.py +++ /dev/null @@ -1,104 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Classes Without Boilerplate -""" - -from functools import partial -from typing import Callable, Literal, Protocol - -from . import converters, exceptions, filters, setters, validators -from ._cmp import cmp_using -from ._config import get_run_validators, set_run_validators -from ._funcs import asdict, assoc, astuple, has, resolve_types -from ._make import ( - NOTHING, - Attribute, - Converter, - Factory, - _Nothing, - attrib, - attrs, - evolve, - fields, - fields_dict, - make_class, - validate, -) -from ._next_gen import define, field, frozen, mutable -from ._version_info import VersionInfo - - -s = attributes = attrs -ib = attr = attrib -dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) - - -class AttrsInstance(Protocol): - pass - - -NothingType = Literal[_Nothing.NOTHING] - -__all__ = [ - "NOTHING", - "Attribute", - "AttrsInstance", - "Converter", - "Factory", - "NothingType", - "asdict", - "assoc", - "astuple", - "attr", - "attrib", - "attributes", - "attrs", - "cmp_using", - "converters", - "define", - "evolve", - "exceptions", - "field", - "fields", - "fields_dict", - "filters", - "frozen", - "get_run_validators", - "has", - "ib", - "make_class", - "mutable", - "resolve_types", - "s", - "set_run_validators", - "setters", - "validate", - "validators", -] - - -def _make_getattr(mod_name: str) -> Callable: - """ - Create a metadata proxy for packaging information that uses *mod_name* in - its warnings and errors. - """ - - def __getattr__(name: str) -> str: - if name not in ("__version__", "__version_info__"): - msg = f"module {mod_name} has no attribute {name}" - raise AttributeError(msg) - - from importlib.metadata import metadata - - meta = metadata("attrs") - - if name == "__version_info__": - return VersionInfo._from_version_string(meta["version"]) - - return meta["version"] - - return __getattr__ - - -__getattr__ = _make_getattr(__name__) diff --git a/.venv/lib/python3.10/site-packages/attr/__init__.pyi b/.venv/lib/python3.10/site-packages/attr/__init__.pyi deleted file mode 100644 index 133e501..0000000 --- a/.venv/lib/python3.10/site-packages/attr/__init__.pyi +++ /dev/null @@ -1,389 +0,0 @@ -import enum -import sys - -from typing import ( - Any, - Callable, - Generic, - Literal, - Mapping, - Protocol, - Sequence, - TypeVar, - overload, -) - -# `import X as X` is required to make these public -from . import converters as converters -from . import exceptions as exceptions -from . import filters as filters -from . import setters as setters -from . import validators as validators -from ._cmp import cmp_using as cmp_using -from ._typing_compat import AttrsInstance_ -from ._version_info import VersionInfo -from attrs import ( - define as define, - field as field, - mutable as mutable, - frozen as frozen, - _EqOrderType, - _ValidatorType, - _ConverterType, - _ReprArgType, - _OnSetAttrType, - _OnSetAttrArgType, - _FieldTransformer, - _ValidatorArgType, -) - -if sys.version_info >= (3, 10): - from typing import TypeGuard, TypeAlias -else: - from typing_extensions import TypeGuard, TypeAlias - -if sys.version_info >= (3, 11): - from typing import dataclass_transform -else: - from typing_extensions import dataclass_transform - -__version__: str -__version_info__: VersionInfo -__title__: str -__description__: str -__url__: str -__uri__: str -__author__: str -__email__: str -__license__: str -__copyright__: str - -_T = TypeVar("_T") -_C = TypeVar("_C", bound=type) - -_FilterType = Callable[["Attribute[_T]", _T], bool] - -# We subclass this here to keep the protocol's qualified name clean. -class AttrsInstance(AttrsInstance_, Protocol): - pass - -_A = TypeVar("_A", bound=type[AttrsInstance]) - -class _Nothing(enum.Enum): - NOTHING = enum.auto() - -NOTHING = _Nothing.NOTHING -NothingType: TypeAlias = Literal[_Nothing.NOTHING] - -# NOTE: Factory lies about its return type to make this possible: -# `x: List[int] # = Factory(list)` -# Work around mypy issue #4554 in the common case by using an overload. - -@overload -def Factory(factory: Callable[[], _T]) -> _T: ... -@overload -def Factory( - factory: Callable[[Any], _T], - takes_self: Literal[True], -) -> _T: ... -@overload -def Factory( - factory: Callable[[], _T], - takes_self: Literal[False], -) -> _T: ... - -In = TypeVar("In") -Out = TypeVar("Out") - -class Converter(Generic[In, Out]): - @overload - def __init__(self, converter: Callable[[In], Out]) -> None: ... - @overload - def __init__( - self, - converter: Callable[[In, AttrsInstance, Attribute], Out], - *, - takes_self: Literal[True], - takes_field: Literal[True], - ) -> None: ... - @overload - def __init__( - self, - converter: Callable[[In, Attribute], Out], - *, - takes_field: Literal[True], - ) -> None: ... - @overload - def __init__( - self, - converter: Callable[[In, AttrsInstance], Out], - *, - takes_self: Literal[True], - ) -> None: ... - -class Attribute(Generic[_T]): - name: str - default: _T | None - validator: _ValidatorType[_T] | None - repr: _ReprArgType - cmp: _EqOrderType - eq: _EqOrderType - order: _EqOrderType - hash: bool | None - init: bool - converter: Converter | None - metadata: dict[Any, Any] - type: type[_T] | None - kw_only: bool - on_setattr: _OnSetAttrType - alias: str | None - - def evolve(self, **changes: Any) -> "Attribute[Any]": ... - -# NOTE: We had several choices for the annotation to use for type arg: -# 1) Type[_T] -# - Pros: Handles simple cases correctly -# - Cons: Might produce less informative errors in the case of conflicting -# TypeVars e.g. `attr.ib(default='bad', type=int)` -# 2) Callable[..., _T] -# - Pros: Better error messages than #1 for conflicting TypeVars -# - Cons: Terrible error messages for validator checks. -# e.g. attr.ib(type=int, validator=validate_str) -# -> error: Cannot infer function type argument -# 3) type (and do all of the work in the mypy plugin) -# - Pros: Simple here, and we could customize the plugin with our own errors. -# - Cons: Would need to write mypy plugin code to handle all the cases. -# We chose option #1. - -# `attr` lies about its return type to make the following possible: -# attr() -> Any -# attr(8) -> int -# attr(validator=) -> Whatever the callable expects. -# This makes this type of assignments possible: -# x: int = attr(8) -# -# This form catches explicit None or no default but with no other arguments -# returns Any. -@overload -def attrib( - default: None = ..., - validator: None = ..., - repr: _ReprArgType = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - type: None = ..., - converter: None = ..., - factory: None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., -) -> Any: ... - -# This form catches an explicit None or no default and infers the type from the -# other arguments. -@overload -def attrib( - default: None = ..., - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - type: type[_T] | None = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., -) -> _T: ... - -# This form catches an explicit default argument. -@overload -def attrib( - default: _T, - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - type: type[_T] | None = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., -) -> _T: ... - -# This form covers type=non-Type: e.g. forward references (str), Any -@overload -def attrib( - default: _T | None = ..., - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - type: object = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., -) -> Any: ... -@overload -@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) -def attrs( - maybe_cls: _C, - these: dict[str, Any] | None = ..., - repr_ns: str | None = ..., - repr: bool = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - auto_detect: bool = ..., - collect_by_mro: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., - unsafe_hash: bool | None = ..., -) -> _C: ... -@overload -@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) -def attrs( - maybe_cls: None = ..., - these: dict[str, Any] | None = ..., - repr_ns: str | None = ..., - repr: bool = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - auto_detect: bool = ..., - collect_by_mro: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., - unsafe_hash: bool | None = ..., -) -> Callable[[_C], _C]: ... -def fields(cls: type[AttrsInstance]) -> Any: ... -def fields_dict(cls: type[AttrsInstance]) -> dict[str, Attribute[Any]]: ... -def validate(inst: AttrsInstance) -> None: ... -def resolve_types( - cls: _A, - globalns: dict[str, Any] | None = ..., - localns: dict[str, Any] | None = ..., - attribs: list[Attribute[Any]] | None = ..., - include_extras: bool = ..., -) -> _A: ... - -# TODO: add support for returning a proper attrs class from the mypy plugin -# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', -# [attr.ib()])` is valid -def make_class( - name: str, - attrs: list[str] | tuple[str, ...] | dict[str, Any], - bases: tuple[type, ...] = ..., - class_body: dict[str, Any] | None = ..., - repr_ns: str | None = ..., - repr: bool = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - collect_by_mro: bool = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., -) -> type: ... - -# _funcs -- - -# TODO: add support for returning TypedDict from the mypy plugin -# FIXME: asdict/astuple do not honor their factory args. Waiting on one of -# these: -# https://github.com/python/mypy/issues/4236 -# https://github.com/python/typing/issues/253 -# XXX: remember to fix attrs.asdict/astuple too! -def asdict( - inst: AttrsInstance, - recurse: bool = ..., - filter: _FilterType[Any] | None = ..., - dict_factory: type[Mapping[Any, Any]] = ..., - retain_collection_types: bool = ..., - value_serializer: Callable[[type, Attribute[Any], Any], Any] | None = ..., - tuple_keys: bool | None = ..., -) -> dict[str, Any]: ... - -# TODO: add support for returning NamedTuple from the mypy plugin -def astuple( - inst: AttrsInstance, - recurse: bool = ..., - filter: _FilterType[Any] | None = ..., - tuple_factory: type[Sequence[Any]] = ..., - retain_collection_types: bool = ..., -) -> tuple[Any, ...]: ... -def has(cls: type) -> TypeGuard[type[AttrsInstance]]: ... -def assoc(inst: _T, **changes: Any) -> _T: ... -def evolve(inst: _T, **changes: Any) -> _T: ... - -# _config -- - -def set_run_validators(run: bool) -> None: ... -def get_run_validators() -> bool: ... - -# aliases -- - -s = attributes = attrs -ib = attr = attrib -dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/.venv/lib/python3.10/site-packages/attr/_cmp.py b/.venv/lib/python3.10/site-packages/attr/_cmp.py deleted file mode 100644 index 09bab49..0000000 --- a/.venv/lib/python3.10/site-packages/attr/_cmp.py +++ /dev/null @@ -1,160 +0,0 @@ -# SPDX-License-Identifier: MIT - - -import functools -import types - -from ._make import __ne__ - - -_operation_names = {"eq": "==", "lt": "<", "le": "<=", "gt": ">", "ge": ">="} - - -def cmp_using( - eq=None, - lt=None, - le=None, - gt=None, - ge=None, - require_same_type=True, - class_name="Comparable", -): - """ - Create a class that can be passed into `attrs.field`'s ``eq``, ``order``, - and ``cmp`` arguments to customize field comparison. - - The resulting class will have a full set of ordering methods if at least - one of ``{lt, le, gt, ge}`` and ``eq`` are provided. - - Args: - eq (typing.Callable | None): - Callable used to evaluate equality of two objects. - - lt (typing.Callable | None): - Callable used to evaluate whether one object is less than another - object. - - le (typing.Callable | None): - Callable used to evaluate whether one object is less than or equal - to another object. - - gt (typing.Callable | None): - Callable used to evaluate whether one object is greater than - another object. - - ge (typing.Callable | None): - Callable used to evaluate whether one object is greater than or - equal to another object. - - require_same_type (bool): - When `True`, equality and ordering methods will return - `NotImplemented` if objects are not of the same type. - - class_name (str | None): Name of class. Defaults to "Comparable". - - See `comparison` for more details. - - .. versionadded:: 21.1.0 - """ - - body = { - "__slots__": ["value"], - "__init__": _make_init(), - "_requirements": [], - "_is_comparable_to": _is_comparable_to, - } - - # Add operations. - num_order_functions = 0 - has_eq_function = False - - if eq is not None: - has_eq_function = True - body["__eq__"] = _make_operator("eq", eq) - body["__ne__"] = __ne__ - - if lt is not None: - num_order_functions += 1 - body["__lt__"] = _make_operator("lt", lt) - - if le is not None: - num_order_functions += 1 - body["__le__"] = _make_operator("le", le) - - if gt is not None: - num_order_functions += 1 - body["__gt__"] = _make_operator("gt", gt) - - if ge is not None: - num_order_functions += 1 - body["__ge__"] = _make_operator("ge", ge) - - type_ = types.new_class( - class_name, (object,), {}, lambda ns: ns.update(body) - ) - - # Add same type requirement. - if require_same_type: - type_._requirements.append(_check_same_type) - - # Add total ordering if at least one operation was defined. - if 0 < num_order_functions < 4: - if not has_eq_function: - # functools.total_ordering requires __eq__ to be defined, - # so raise early error here to keep a nice stack. - msg = "eq must be define is order to complete ordering from lt, le, gt, ge." - raise ValueError(msg) - type_ = functools.total_ordering(type_) - - return type_ - - -def _make_init(): - """ - Create __init__ method. - """ - - def __init__(self, value): - """ - Initialize object with *value*. - """ - self.value = value - - return __init__ - - -def _make_operator(name, func): - """ - Create operator method. - """ - - def method(self, other): - if not self._is_comparable_to(other): - return NotImplemented - - result = func(self.value, other.value) - if result is NotImplemented: - return NotImplemented - - return result - - method.__name__ = f"__{name}__" - method.__doc__ = ( - f"Return a {_operation_names[name]} b. Computed by attrs." - ) - - return method - - -def _is_comparable_to(self, other): - """ - Check whether `other` is comparable to `self`. - """ - return all(func(self, other) for func in self._requirements) - - -def _check_same_type(self, other): - """ - Return True if *self* and *other* are of the same type, False otherwise. - """ - return other.value.__class__ is self.value.__class__ diff --git a/.venv/lib/python3.10/site-packages/attr/_cmp.pyi b/.venv/lib/python3.10/site-packages/attr/_cmp.pyi deleted file mode 100644 index cc7893b..0000000 --- a/.venv/lib/python3.10/site-packages/attr/_cmp.pyi +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Any, Callable - -_CompareWithType = Callable[[Any, Any], bool] - -def cmp_using( - eq: _CompareWithType | None = ..., - lt: _CompareWithType | None = ..., - le: _CompareWithType | None = ..., - gt: _CompareWithType | None = ..., - ge: _CompareWithType | None = ..., - require_same_type: bool = ..., - class_name: str = ..., -) -> type: ... diff --git a/.venv/lib/python3.10/site-packages/attr/_compat.py b/.venv/lib/python3.10/site-packages/attr/_compat.py deleted file mode 100644 index 22fcd78..0000000 --- a/.venv/lib/python3.10/site-packages/attr/_compat.py +++ /dev/null @@ -1,94 +0,0 @@ -# SPDX-License-Identifier: MIT - -import inspect -import platform -import sys -import threading - -from collections.abc import Mapping, Sequence # noqa: F401 -from typing import _GenericAlias - - -PYPY = platform.python_implementation() == "PyPy" -PY_3_9_PLUS = sys.version_info[:2] >= (3, 9) -PY_3_10_PLUS = sys.version_info[:2] >= (3, 10) -PY_3_11_PLUS = sys.version_info[:2] >= (3, 11) -PY_3_12_PLUS = sys.version_info[:2] >= (3, 12) -PY_3_13_PLUS = sys.version_info[:2] >= (3, 13) -PY_3_14_PLUS = sys.version_info[:2] >= (3, 14) - - -if PY_3_14_PLUS: # pragma: no cover - import annotationlib - - _get_annotations = annotationlib.get_annotations - -else: - - def _get_annotations(cls): - """ - Get annotations for *cls*. - """ - return cls.__dict__.get("__annotations__", {}) - - -class _AnnotationExtractor: - """ - Extract type annotations from a callable, returning None whenever there - is none. - """ - - __slots__ = ["sig"] - - def __init__(self, callable): - try: - self.sig = inspect.signature(callable) - except (ValueError, TypeError): # inspect failed - self.sig = None - - def get_first_param_type(self): - """ - Return the type annotation of the first argument if it's not empty. - """ - if not self.sig: - return None - - params = list(self.sig.parameters.values()) - if params and params[0].annotation is not inspect.Parameter.empty: - return params[0].annotation - - return None - - def get_return_type(self): - """ - Return the return type if it's not empty. - """ - if ( - self.sig - and self.sig.return_annotation is not inspect.Signature.empty - ): - return self.sig.return_annotation - - return None - - -# Thread-local global to track attrs instances which are already being repr'd. -# This is needed because there is no other (thread-safe) way to pass info -# about the instances that are already being repr'd through the call stack -# in order to ensure we don't perform infinite recursion. -# -# For instance, if an instance contains a dict which contains that instance, -# we need to know that we're already repr'ing the outside instance from within -# the dict's repr() call. -# -# This lives here rather than in _make.py so that the functions in _make.py -# don't have a direct reference to the thread-local in their globals dict. -# If they have such a reference, it breaks cloudpickle. -repr_context = threading.local() - - -def get_generic_base(cl): - """If this is a generic class (A[str]), return the generic base for it.""" - if cl.__class__ is _GenericAlias: - return cl.__origin__ - return None diff --git a/.venv/lib/python3.10/site-packages/attr/_config.py b/.venv/lib/python3.10/site-packages/attr/_config.py deleted file mode 100644 index 4b25772..0000000 --- a/.venv/lib/python3.10/site-packages/attr/_config.py +++ /dev/null @@ -1,31 +0,0 @@ -# SPDX-License-Identifier: MIT - -__all__ = ["get_run_validators", "set_run_validators"] - -_run_validators = True - - -def set_run_validators(run): - """ - Set whether or not validators are run. By default, they are run. - - .. deprecated:: 21.3.0 It will not be removed, but it also will not be - moved to new ``attrs`` namespace. Use `attrs.validators.set_disabled()` - instead. - """ - if not isinstance(run, bool): - msg = "'run' must be bool." - raise TypeError(msg) - global _run_validators - _run_validators = run - - -def get_run_validators(): - """ - Return whether or not validators are run. - - .. deprecated:: 21.3.0 It will not be removed, but it also will not be - moved to new ``attrs`` namespace. Use `attrs.validators.get_disabled()` - instead. - """ - return _run_validators diff --git a/.venv/lib/python3.10/site-packages/attr/_funcs.py b/.venv/lib/python3.10/site-packages/attr/_funcs.py deleted file mode 100644 index c39fb8a..0000000 --- a/.venv/lib/python3.10/site-packages/attr/_funcs.py +++ /dev/null @@ -1,468 +0,0 @@ -# SPDX-License-Identifier: MIT - - -import copy - -from ._compat import PY_3_9_PLUS, get_generic_base -from ._make import _OBJ_SETATTR, NOTHING, fields -from .exceptions import AttrsAttributeNotFoundError - - -def asdict( - inst, - recurse=True, - filter=None, - dict_factory=dict, - retain_collection_types=False, - value_serializer=None, -): - """ - Return the *attrs* attribute values of *inst* as a dict. - - Optionally recurse into other *attrs*-decorated classes. - - Args: - inst: Instance of an *attrs*-decorated class. - - recurse (bool): Recurse into classes that are also *attrs*-decorated. - - filter (~typing.Callable): - A callable whose return code determines whether an attribute or - element is included (`True`) or dropped (`False`). Is called with - the `attrs.Attribute` as the first argument and the value as the - second argument. - - dict_factory (~typing.Callable): - A callable to produce dictionaries from. For example, to produce - ordered dictionaries instead of normal Python dictionaries, pass in - ``collections.OrderedDict``. - - retain_collection_types (bool): - Do not convert to `list` when encountering an attribute whose type - is `tuple` or `set`. Only meaningful if *recurse* is `True`. - - value_serializer (typing.Callable | None): - A hook that is called for every attribute or dict key/value. It - receives the current instance, field and value and must return the - (updated) value. The hook is run *after* the optional *filter* has - been applied. - - Returns: - Return type of *dict_factory*. - - Raises: - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - .. versionadded:: 16.0.0 *dict_factory* - .. versionadded:: 16.1.0 *retain_collection_types* - .. versionadded:: 20.3.0 *value_serializer* - .. versionadded:: 21.3.0 - If a dict has a collection for a key, it is serialized as a tuple. - """ - attrs = fields(inst.__class__) - rv = dict_factory() - for a in attrs: - v = getattr(inst, a.name) - if filter is not None and not filter(a, v): - continue - - if value_serializer is not None: - v = value_serializer(inst, a, v) - - if recurse is True: - if has(v.__class__): - rv[a.name] = asdict( - v, - recurse=True, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - elif isinstance(v, (tuple, list, set, frozenset)): - cf = v.__class__ if retain_collection_types is True else list - items = [ - _asdict_anything( - i, - is_key=False, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - for i in v - ] - try: - rv[a.name] = cf(items) - except TypeError: - if not issubclass(cf, tuple): - raise - # Workaround for TypeError: cf.__new__() missing 1 required - # positional argument (which appears, for a namedturle) - rv[a.name] = cf(*items) - elif isinstance(v, dict): - df = dict_factory - rv[a.name] = df( - ( - _asdict_anything( - kk, - is_key=True, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - _asdict_anything( - vv, - is_key=False, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - ) - for kk, vv in v.items() - ) - else: - rv[a.name] = v - else: - rv[a.name] = v - return rv - - -def _asdict_anything( - val, - is_key, - filter, - dict_factory, - retain_collection_types, - value_serializer, -): - """ - ``asdict`` only works on attrs instances, this works on anything. - """ - if getattr(val.__class__, "__attrs_attrs__", None) is not None: - # Attrs class. - rv = asdict( - val, - recurse=True, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - elif isinstance(val, (tuple, list, set, frozenset)): - if retain_collection_types is True: - cf = val.__class__ - elif is_key: - cf = tuple - else: - cf = list - - rv = cf( - [ - _asdict_anything( - i, - is_key=False, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - for i in val - ] - ) - elif isinstance(val, dict): - df = dict_factory - rv = df( - ( - _asdict_anything( - kk, - is_key=True, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - _asdict_anything( - vv, - is_key=False, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - ) - for kk, vv in val.items() - ) - else: - rv = val - if value_serializer is not None: - rv = value_serializer(None, None, rv) - - return rv - - -def astuple( - inst, - recurse=True, - filter=None, - tuple_factory=tuple, - retain_collection_types=False, -): - """ - Return the *attrs* attribute values of *inst* as a tuple. - - Optionally recurse into other *attrs*-decorated classes. - - Args: - inst: Instance of an *attrs*-decorated class. - - recurse (bool): - Recurse into classes that are also *attrs*-decorated. - - filter (~typing.Callable): - A callable whose return code determines whether an attribute or - element is included (`True`) or dropped (`False`). Is called with - the `attrs.Attribute` as the first argument and the value as the - second argument. - - tuple_factory (~typing.Callable): - A callable to produce tuples from. For example, to produce lists - instead of tuples. - - retain_collection_types (bool): - Do not convert to `list` or `dict` when encountering an attribute - which type is `tuple`, `dict` or `set`. Only meaningful if - *recurse* is `True`. - - Returns: - Return type of *tuple_factory* - - Raises: - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - .. versionadded:: 16.2.0 - """ - attrs = fields(inst.__class__) - rv = [] - retain = retain_collection_types # Very long. :/ - for a in attrs: - v = getattr(inst, a.name) - if filter is not None and not filter(a, v): - continue - if recurse is True: - if has(v.__class__): - rv.append( - astuple( - v, - recurse=True, - filter=filter, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - ) - elif isinstance(v, (tuple, list, set, frozenset)): - cf = v.__class__ if retain is True else list - items = [ - ( - astuple( - j, - recurse=True, - filter=filter, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(j.__class__) - else j - ) - for j in v - ] - try: - rv.append(cf(items)) - except TypeError: - if not issubclass(cf, tuple): - raise - # Workaround for TypeError: cf.__new__() missing 1 required - # positional argument (which appears, for a namedturle) - rv.append(cf(*items)) - elif isinstance(v, dict): - df = v.__class__ if retain is True else dict - rv.append( - df( - ( - ( - astuple( - kk, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(kk.__class__) - else kk - ), - ( - astuple( - vv, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(vv.__class__) - else vv - ), - ) - for kk, vv in v.items() - ) - ) - else: - rv.append(v) - else: - rv.append(v) - - return rv if tuple_factory is list else tuple_factory(rv) - - -def has(cls): - """ - Check whether *cls* is a class with *attrs* attributes. - - Args: - cls (type): Class to introspect. - - Raises: - TypeError: If *cls* is not a class. - - Returns: - bool: - """ - attrs = getattr(cls, "__attrs_attrs__", None) - if attrs is not None: - return True - - # No attrs, maybe it's a specialized generic (A[str])? - generic_base = get_generic_base(cls) - if generic_base is not None: - generic_attrs = getattr(generic_base, "__attrs_attrs__", None) - if generic_attrs is not None: - # Stick it on here for speed next time. - cls.__attrs_attrs__ = generic_attrs - return generic_attrs is not None - return False - - -def assoc(inst, **changes): - """ - Copy *inst* and apply *changes*. - - This is different from `evolve` that applies the changes to the arguments - that create the new instance. - - `evolve`'s behavior is preferable, but there are `edge cases`_ where it - doesn't work. Therefore `assoc` is deprecated, but will not be removed. - - .. _`edge cases`: https://github.com/python-attrs/attrs/issues/251 - - Args: - inst: Instance of a class with *attrs* attributes. - - changes: Keyword changes in the new copy. - - Returns: - A copy of inst with *changes* incorporated. - - Raises: - attrs.exceptions.AttrsAttributeNotFoundError: - If *attr_name* couldn't be found on *cls*. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - .. deprecated:: 17.1.0 - Use `attrs.evolve` instead if you can. This function will not be - removed du to the slightly different approach compared to - `attrs.evolve`, though. - """ - new = copy.copy(inst) - attrs = fields(inst.__class__) - for k, v in changes.items(): - a = getattr(attrs, k, NOTHING) - if a is NOTHING: - msg = f"{k} is not an attrs attribute on {new.__class__}." - raise AttrsAttributeNotFoundError(msg) - _OBJ_SETATTR(new, k, v) - return new - - -def resolve_types( - cls, globalns=None, localns=None, attribs=None, include_extras=True -): - """ - Resolve any strings and forward annotations in type annotations. - - This is only required if you need concrete types in :class:`Attribute`'s - *type* field. In other words, you don't need to resolve your types if you - only use them for static type checking. - - With no arguments, names will be looked up in the module in which the class - was created. If this is not what you want, for example, if the name only - exists inside a method, you may pass *globalns* or *localns* to specify - other dictionaries in which to look up these names. See the docs of - `typing.get_type_hints` for more details. - - Args: - cls (type): Class to resolve. - - globalns (dict | None): Dictionary containing global variables. - - localns (dict | None): Dictionary containing local variables. - - attribs (list | None): - List of attribs for the given class. This is necessary when calling - from inside a ``field_transformer`` since *cls* is not an *attrs* - class yet. - - include_extras (bool): - Resolve more accurately, if possible. Pass ``include_extras`` to - ``typing.get_hints``, if supported by the typing module. On - supported Python versions (3.9+), this resolves the types more - accurately. - - Raises: - TypeError: If *cls* is not a class. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class and you didn't pass any attribs. - - NameError: If types cannot be resolved because of missing variables. - - Returns: - *cls* so you can use this function also as a class decorator. Please - note that you have to apply it **after** `attrs.define`. That means the - decorator has to come in the line **before** `attrs.define`. - - .. versionadded:: 20.1.0 - .. versionadded:: 21.1.0 *attribs* - .. versionadded:: 23.1.0 *include_extras* - """ - # Since calling get_type_hints is expensive we cache whether we've - # done it already. - if getattr(cls, "__attrs_types_resolved__", None) != cls: - import typing - - kwargs = {"globalns": globalns, "localns": localns} - - if PY_3_9_PLUS: - kwargs["include_extras"] = include_extras - - hints = typing.get_type_hints(cls, **kwargs) - for field in fields(cls) if attribs is None else attribs: - if field.name in hints: - # Since fields have been frozen we must work around it. - _OBJ_SETATTR(field, "type", hints[field.name]) - # We store the class we resolved so that subclasses know they haven't - # been resolved. - cls.__attrs_types_resolved__ = cls - - # Return the class so you can use it as a decorator too. - return cls diff --git a/.venv/lib/python3.10/site-packages/attr/_make.py b/.venv/lib/python3.10/site-packages/attr/_make.py deleted file mode 100644 index e84d979..0000000 --- a/.venv/lib/python3.10/site-packages/attr/_make.py +++ /dev/null @@ -1,3123 +0,0 @@ -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -import abc -import contextlib -import copy -import enum -import inspect -import itertools -import linecache -import sys -import types -import unicodedata - -from collections.abc import Callable, Mapping -from functools import cached_property -from typing import Any, NamedTuple, TypeVar - -# We need to import _compat itself in addition to the _compat members to avoid -# having the thread-local in the globals here. -from . import _compat, _config, setters -from ._compat import ( - PY_3_10_PLUS, - PY_3_11_PLUS, - PY_3_13_PLUS, - _AnnotationExtractor, - _get_annotations, - get_generic_base, -) -from .exceptions import ( - DefaultAlreadySetError, - FrozenInstanceError, - NotAnAttrsClassError, - UnannotatedAttributeError, -) - - -# This is used at least twice, so cache it here. -_OBJ_SETATTR = object.__setattr__ -_INIT_FACTORY_PAT = "__attr_factory_%s" -_CLASSVAR_PREFIXES = ( - "typing.ClassVar", - "t.ClassVar", - "ClassVar", - "typing_extensions.ClassVar", -) -# we don't use a double-underscore prefix because that triggers -# name mangling when trying to create a slot for the field -# (when slots=True) -_HASH_CACHE_FIELD = "_attrs_cached_hash" - -_EMPTY_METADATA_SINGLETON = types.MappingProxyType({}) - -# Unique object for unequivocal getattr() defaults. -_SENTINEL = object() - -_DEFAULT_ON_SETATTR = setters.pipe(setters.convert, setters.validate) - - -class _Nothing(enum.Enum): - """ - Sentinel to indicate the lack of a value when `None` is ambiguous. - - If extending attrs, you can use ``typing.Literal[NOTHING]`` to show - that a value may be ``NOTHING``. - - .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False. - .. versionchanged:: 22.2.0 ``NOTHING`` is now an ``enum.Enum`` variant. - """ - - NOTHING = enum.auto() - - def __repr__(self): - return "NOTHING" - - def __bool__(self): - return False - - -NOTHING = _Nothing.NOTHING -""" -Sentinel to indicate the lack of a value when `None` is ambiguous. - -When using in 3rd party code, use `attrs.NothingType` for type annotations. -""" - - -class _CacheHashWrapper(int): - """ - An integer subclass that pickles / copies as None - - This is used for non-slots classes with ``cache_hash=True``, to avoid - serializing a potentially (even likely) invalid hash value. Since `None` - is the default value for uncalculated hashes, whenever this is copied, - the copy's value for the hash should automatically reset. - - See GH #613 for more details. - """ - - def __reduce__(self, _none_constructor=type(None), _args=()): # noqa: B008 - return _none_constructor, _args - - -def attrib( - default=NOTHING, - validator=None, - repr=True, - cmp=None, - hash=None, - init=True, - metadata=None, - type=None, - converter=None, - factory=None, - kw_only=False, - eq=None, - order=None, - on_setattr=None, - alias=None, -): - """ - Create a new field / attribute on a class. - - Identical to `attrs.field`, except it's not keyword-only. - - Consider using `attrs.field` in new code (``attr.ib`` will *never* go away, - though). - - .. warning:: - - Does **nothing** unless the class is also decorated with - `attr.s` (or similar)! - - - .. versionadded:: 15.2.0 *convert* - .. versionadded:: 16.3.0 *metadata* - .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. - .. versionchanged:: 17.1.0 - *hash* is `None` and therefore mirrors *eq* by default. - .. versionadded:: 17.3.0 *type* - .. deprecated:: 17.4.0 *convert* - .. versionadded:: 17.4.0 - *converter* as a replacement for the deprecated *convert* to achieve - consistency with other noun-based arguments. - .. versionadded:: 18.1.0 - ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. - .. versionadded:: 18.2.0 *kw_only* - .. versionchanged:: 19.2.0 *convert* keyword argument removed. - .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. - .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. - .. versionadded:: 19.2.0 *eq* and *order* - .. versionadded:: 20.1.0 *on_setattr* - .. versionchanged:: 20.3.0 *kw_only* backported to Python 2 - .. versionchanged:: 21.1.0 - *eq*, *order*, and *cmp* also accept a custom callable - .. versionchanged:: 21.1.0 *cmp* undeprecated - .. versionadded:: 22.2.0 *alias* - """ - eq, eq_key, order, order_key = _determine_attrib_eq_order( - cmp, eq, order, True - ) - - if hash is not None and hash is not True and hash is not False: - msg = "Invalid value for hash. Must be True, False, or None." - raise TypeError(msg) - - if factory is not None: - if default is not NOTHING: - msg = ( - "The `default` and `factory` arguments are mutually exclusive." - ) - raise ValueError(msg) - if not callable(factory): - msg = "The `factory` argument must be a callable." - raise ValueError(msg) - default = Factory(factory) - - if metadata is None: - metadata = {} - - # Apply syntactic sugar by auto-wrapping. - if isinstance(on_setattr, (list, tuple)): - on_setattr = setters.pipe(*on_setattr) - - if validator and isinstance(validator, (list, tuple)): - validator = and_(*validator) - - if converter and isinstance(converter, (list, tuple)): - converter = pipe(*converter) - - return _CountingAttr( - default=default, - validator=validator, - repr=repr, - cmp=None, - hash=hash, - init=init, - converter=converter, - metadata=metadata, - type=type, - kw_only=kw_only, - eq=eq, - eq_key=eq_key, - order=order, - order_key=order_key, - on_setattr=on_setattr, - alias=alias, - ) - - -def _compile_and_eval( - script: str, - globs: dict[str, Any] | None, - locs: Mapping[str, object] | None = None, - filename: str = "", -) -> None: - """ - Evaluate the script with the given global (globs) and local (locs) - variables. - """ - bytecode = compile(script, filename, "exec") - eval(bytecode, globs, locs) - - -def _linecache_and_compile( - script: str, - filename: str, - globs: dict[str, Any] | None, - locals: Mapping[str, object] | None = None, -) -> dict[str, Any]: - """ - Cache the script with _linecache_, compile it and return the _locals_. - """ - - locs = {} if locals is None else locals - - # In order of debuggers like PDB being able to step through the code, - # we add a fake linecache entry. - count = 1 - base_filename = filename - while True: - linecache_tuple = ( - len(script), - None, - script.splitlines(True), - filename, - ) - old_val = linecache.cache.setdefault(filename, linecache_tuple) - if old_val == linecache_tuple: - break - - filename = f"{base_filename[:-1]}-{count}>" - count += 1 - - _compile_and_eval(script, globs, locs, filename) - - return locs - - -def _make_attr_tuple_class(cls_name: str, attr_names: list[str]) -> type: - """ - Create a tuple subclass to hold `Attribute`s for an `attrs` class. - - The subclass is a bare tuple with properties for names. - - class MyClassAttributes(tuple): - __slots__ = () - x = property(itemgetter(0)) - """ - attr_class_name = f"{cls_name}Attributes" - body = {} - for i, attr_name in enumerate(attr_names): - - def getter(self, i=i): - return self[i] - - body[attr_name] = property(getter) - return type(attr_class_name, (tuple,), body) - - -# Tuple class for extracted attributes from a class definition. -# `base_attrs` is a subset of `attrs`. -class _Attributes(NamedTuple): - attrs: type - base_attrs: list[Attribute] - base_attrs_map: dict[str, type] - - -def _is_class_var(annot): - """ - Check whether *annot* is a typing.ClassVar. - - The string comparison hack is used to avoid evaluating all string - annotations which would put attrs-based classes at a performance - disadvantage compared to plain old classes. - """ - annot = str(annot) - - # Annotation can be quoted. - if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): - annot = annot[1:-1] - - return annot.startswith(_CLASSVAR_PREFIXES) - - -def _has_own_attribute(cls, attrib_name): - """ - Check whether *cls* defines *attrib_name* (and doesn't just inherit it). - """ - return attrib_name in cls.__dict__ - - -def _collect_base_attrs( - cls, taken_attr_names -) -> tuple[list[Attribute], dict[str, type]]: - """ - Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. - """ - base_attrs = [] - base_attr_map = {} # A dictionary of base attrs to their classes. - - # Traverse the MRO and collect attributes. - for base_cls in reversed(cls.__mro__[1:-1]): - for a in getattr(base_cls, "__attrs_attrs__", []): - if a.inherited or a.name in taken_attr_names: - continue - - a = a.evolve(inherited=True) # noqa: PLW2901 - base_attrs.append(a) - base_attr_map[a.name] = base_cls - - # For each name, only keep the freshest definition i.e. the furthest at the - # back. base_attr_map is fine because it gets overwritten with every new - # instance. - filtered = [] - seen = set() - for a in reversed(base_attrs): - if a.name in seen: - continue - filtered.insert(0, a) - seen.add(a.name) - - return filtered, base_attr_map - - -def _collect_base_attrs_broken(cls, taken_attr_names): - """ - Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. - - N.B. *taken_attr_names* will be mutated. - - Adhere to the old incorrect behavior. - - Notably it collects from the front and considers inherited attributes which - leads to the buggy behavior reported in #428. - """ - base_attrs = [] - base_attr_map = {} # A dictionary of base attrs to their classes. - - # Traverse the MRO and collect attributes. - for base_cls in cls.__mro__[1:-1]: - for a in getattr(base_cls, "__attrs_attrs__", []): - if a.name in taken_attr_names: - continue - - a = a.evolve(inherited=True) # noqa: PLW2901 - taken_attr_names.add(a.name) - base_attrs.append(a) - base_attr_map[a.name] = base_cls - - return base_attrs, base_attr_map - - -def _transform_attrs( - cls, these, auto_attribs, kw_only, collect_by_mro, field_transformer -) -> _Attributes: - """ - Transform all `_CountingAttr`s on a class into `Attribute`s. - - If *these* is passed, use that and don't look for them on the class. - - If *collect_by_mro* is True, collect them in the correct MRO order, - otherwise use the old -- incorrect -- order. See #428. - - Return an `_Attributes`. - """ - cd = cls.__dict__ - anns = _get_annotations(cls) - - if these is not None: - ca_list = list(these.items()) - elif auto_attribs is True: - ca_names = { - name - for name, attr in cd.items() - if attr.__class__ is _CountingAttr - } - ca_list = [] - annot_names = set() - for attr_name, type in anns.items(): - if _is_class_var(type): - continue - annot_names.add(attr_name) - a = cd.get(attr_name, NOTHING) - - if a.__class__ is not _CountingAttr: - a = attrib(a) - ca_list.append((attr_name, a)) - - unannotated = ca_names - annot_names - if unannotated: - raise UnannotatedAttributeError( - "The following `attr.ib`s lack a type annotation: " - + ", ".join( - sorted(unannotated, key=lambda n: cd.get(n).counter) - ) - + "." - ) - else: - ca_list = sorted( - ( - (name, attr) - for name, attr in cd.items() - if attr.__class__ is _CountingAttr - ), - key=lambda e: e[1].counter, - ) - - fca = Attribute.from_counting_attr - own_attrs = [ - fca(attr_name, ca, anns.get(attr_name)) for attr_name, ca in ca_list - ] - - if collect_by_mro: - base_attrs, base_attr_map = _collect_base_attrs( - cls, {a.name for a in own_attrs} - ) - else: - base_attrs, base_attr_map = _collect_base_attrs_broken( - cls, {a.name for a in own_attrs} - ) - - if kw_only: - own_attrs = [a.evolve(kw_only=True) for a in own_attrs] - base_attrs = [a.evolve(kw_only=True) for a in base_attrs] - - attrs = base_attrs + own_attrs - - if field_transformer is not None: - attrs = tuple(field_transformer(cls, attrs)) - - # Check attr order after executing the field_transformer. - # Mandatory vs non-mandatory attr order only matters when they are part of - # the __init__ signature and when they aren't kw_only (which are moved to - # the end and can be mandatory or non-mandatory in any order, as they will - # be specified as keyword args anyway). Check the order of those attrs: - had_default = False - for a in (a for a in attrs if a.init is not False and a.kw_only is False): - if had_default is True and a.default is NOTHING: - msg = f"No mandatory attributes allowed after an attribute with a default value or factory. Attribute in question: {a!r}" - raise ValueError(msg) - - if had_default is False and a.default is not NOTHING: - had_default = True - - # Resolve default field alias after executing field_transformer. - # This allows field_transformer to differentiate between explicit vs - # default aliases and supply their own defaults. - for a in attrs: - if not a.alias: - # Evolve is very slow, so we hold our nose and do it dirty. - _OBJ_SETATTR.__get__(a)("alias", _default_init_alias_for(a.name)) - - # Create AttrsClass *after* applying the field_transformer since it may - # add or remove attributes! - attr_names = [a.name for a in attrs] - AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) - - return _Attributes(AttrsClass(attrs), base_attrs, base_attr_map) - - -def _make_cached_property_getattr(cached_properties, original_getattr, cls): - lines = [ - # Wrapped to get `__class__` into closure cell for super() - # (It will be replaced with the newly constructed class after construction). - "def wrapper(_cls):", - " __class__ = _cls", - " def __getattr__(self, item, cached_properties=cached_properties, original_getattr=original_getattr, _cached_setattr_get=_cached_setattr_get):", - " func = cached_properties.get(item)", - " if func is not None:", - " result = func(self)", - " _setter = _cached_setattr_get(self)", - " _setter(item, result)", - " return result", - ] - if original_getattr is not None: - lines.append( - " return original_getattr(self, item)", - ) - else: - lines.extend( - [ - " try:", - " return super().__getattribute__(item)", - " except AttributeError:", - " if not hasattr(super(), '__getattr__'):", - " raise", - " return super().__getattr__(item)", - " original_error = f\"'{self.__class__.__name__}' object has no attribute '{item}'\"", - " raise AttributeError(original_error)", - ] - ) - - lines.extend( - [ - " return __getattr__", - "__getattr__ = wrapper(_cls)", - ] - ) - - unique_filename = _generate_unique_filename(cls, "getattr") - - glob = { - "cached_properties": cached_properties, - "_cached_setattr_get": _OBJ_SETATTR.__get__, - "original_getattr": original_getattr, - } - - return _linecache_and_compile( - "\n".join(lines), unique_filename, glob, locals={"_cls": cls} - )["__getattr__"] - - -def _frozen_setattrs(self, name, value): - """ - Attached to frozen classes as __setattr__. - """ - if isinstance(self, BaseException) and name in ( - "__cause__", - "__context__", - "__traceback__", - "__suppress_context__", - "__notes__", - ): - BaseException.__setattr__(self, name, value) - return - - raise FrozenInstanceError - - -def _frozen_delattrs(self, name): - """ - Attached to frozen classes as __delattr__. - """ - if isinstance(self, BaseException) and name in ("__notes__",): - BaseException.__delattr__(self, name) - return - - raise FrozenInstanceError - - -def evolve(*args, **changes): - """ - Create a new instance, based on the first positional argument with - *changes* applied. - - .. tip:: - - On Python 3.13 and later, you can also use `copy.replace` instead. - - Args: - - inst: - Instance of a class with *attrs* attributes. *inst* must be passed - as a positional argument. - - changes: - Keyword changes in the new copy. - - Returns: - A copy of inst with *changes* incorporated. - - Raises: - TypeError: - If *attr_name* couldn't be found in the class ``__init__``. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - .. versionadded:: 17.1.0 - .. deprecated:: 23.1.0 - It is now deprecated to pass the instance using the keyword argument - *inst*. It will raise a warning until at least April 2024, after which - it will become an error. Always pass the instance as a positional - argument. - .. versionchanged:: 24.1.0 - *inst* can't be passed as a keyword argument anymore. - """ - try: - (inst,) = args - except ValueError: - msg = ( - f"evolve() takes 1 positional argument, but {len(args)} were given" - ) - raise TypeError(msg) from None - - cls = inst.__class__ - attrs = fields(cls) - for a in attrs: - if not a.init: - continue - attr_name = a.name # To deal with private attributes. - init_name = a.alias - if init_name not in changes: - changes[init_name] = getattr(inst, attr_name) - - return cls(**changes) - - -class _ClassBuilder: - """ - Iteratively build *one* class. - """ - - __slots__ = ( - "_add_method_dunders", - "_attr_names", - "_attrs", - "_base_attr_map", - "_base_names", - "_cache_hash", - "_cls", - "_cls_dict", - "_delete_attribs", - "_frozen", - "_has_custom_setattr", - "_has_post_init", - "_has_pre_init", - "_is_exc", - "_on_setattr", - "_pre_init_has_args", - "_repr_added", - "_script_snippets", - "_slots", - "_weakref_slot", - "_wrote_own_setattr", - ) - - def __init__( - self, - cls: type, - these, - slots, - frozen, - weakref_slot, - getstate_setstate, - auto_attribs, - kw_only, - cache_hash, - is_exc, - collect_by_mro, - on_setattr, - has_custom_setattr, - field_transformer, - ): - attrs, base_attrs, base_map = _transform_attrs( - cls, - these, - auto_attribs, - kw_only, - collect_by_mro, - field_transformer, - ) - - self._cls = cls - self._cls_dict = dict(cls.__dict__) if slots else {} - self._attrs = attrs - self._base_names = {a.name for a in base_attrs} - self._base_attr_map = base_map - self._attr_names = tuple(a.name for a in attrs) - self._slots = slots - self._frozen = frozen - self._weakref_slot = weakref_slot - self._cache_hash = cache_hash - self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False)) - self._pre_init_has_args = False - if self._has_pre_init: - # Check if the pre init method has more arguments than just `self` - # We want to pass arguments if pre init expects arguments - pre_init_func = cls.__attrs_pre_init__ - pre_init_signature = inspect.signature(pre_init_func) - self._pre_init_has_args = len(pre_init_signature.parameters) > 1 - self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) - self._delete_attribs = not bool(these) - self._is_exc = is_exc - self._on_setattr = on_setattr - - self._has_custom_setattr = has_custom_setattr - self._wrote_own_setattr = False - - self._cls_dict["__attrs_attrs__"] = self._attrs - - if frozen: - self._cls_dict["__setattr__"] = _frozen_setattrs - self._cls_dict["__delattr__"] = _frozen_delattrs - - self._wrote_own_setattr = True - elif on_setattr in ( - _DEFAULT_ON_SETATTR, - setters.validate, - setters.convert, - ): - has_validator = has_converter = False - for a in attrs: - if a.validator is not None: - has_validator = True - if a.converter is not None: - has_converter = True - - if has_validator and has_converter: - break - if ( - ( - on_setattr == _DEFAULT_ON_SETATTR - and not (has_validator or has_converter) - ) - or (on_setattr == setters.validate and not has_validator) - or (on_setattr == setters.convert and not has_converter) - ): - # If class-level on_setattr is set to convert + validate, but - # there's no field to convert or validate, pretend like there's - # no on_setattr. - self._on_setattr = None - - if getstate_setstate: - ( - self._cls_dict["__getstate__"], - self._cls_dict["__setstate__"], - ) = self._make_getstate_setstate() - - # tuples of script, globs, hook - self._script_snippets: list[ - tuple[str, dict, Callable[[dict, dict], Any]] - ] = [] - self._repr_added = False - - # We want to only do this check once; in 99.9% of cases these - # exist. - if not hasattr(self._cls, "__module__") or not hasattr( - self._cls, "__qualname__" - ): - self._add_method_dunders = self._add_method_dunders_safe - else: - self._add_method_dunders = self._add_method_dunders_unsafe - - def __repr__(self): - return f"<_ClassBuilder(cls={self._cls.__name__})>" - - def _eval_snippets(self) -> None: - """ - Evaluate any registered snippets in one go. - """ - script = "\n".join([snippet[0] for snippet in self._script_snippets]) - globs = {} - for _, snippet_globs, _ in self._script_snippets: - globs.update(snippet_globs) - - locs = _linecache_and_compile( - script, - _generate_unique_filename(self._cls, "methods"), - globs, - ) - - for _, _, hook in self._script_snippets: - hook(self._cls_dict, locs) - - def build_class(self): - """ - Finalize class based on the accumulated configuration. - - Builder cannot be used after calling this method. - """ - self._eval_snippets() - if self._slots is True: - cls = self._create_slots_class() - else: - cls = self._patch_original_class() - if PY_3_10_PLUS: - cls = abc.update_abstractmethods(cls) - - # The method gets only called if it's not inherited from a base class. - # _has_own_attribute does NOT work properly for classmethods. - if ( - getattr(cls, "__attrs_init_subclass__", None) - and "__attrs_init_subclass__" not in cls.__dict__ - ): - cls.__attrs_init_subclass__() - - return cls - - def _patch_original_class(self): - """ - Apply accumulated methods and return the class. - """ - cls = self._cls - base_names = self._base_names - - # Clean class of attribute definitions (`attr.ib()`s). - if self._delete_attribs: - for name in self._attr_names: - if ( - name not in base_names - and getattr(cls, name, _SENTINEL) is not _SENTINEL - ): - # An AttributeError can happen if a base class defines a - # class variable and we want to set an attribute with the - # same name by using only a type annotation. - with contextlib.suppress(AttributeError): - delattr(cls, name) - - # Attach our dunder methods. - for name, value in self._cls_dict.items(): - setattr(cls, name, value) - - # If we've inherited an attrs __setattr__ and don't write our own, - # reset it to object's. - if not self._wrote_own_setattr and getattr( - cls, "__attrs_own_setattr__", False - ): - cls.__attrs_own_setattr__ = False - - if not self._has_custom_setattr: - cls.__setattr__ = _OBJ_SETATTR - - return cls - - def _create_slots_class(self): - """ - Build and return a new class with a `__slots__` attribute. - """ - cd = { - k: v - for k, v in self._cls_dict.items() - if k not in (*tuple(self._attr_names), "__dict__", "__weakref__") - } - - # If our class doesn't have its own implementation of __setattr__ - # (either from the user or by us), check the bases, if one of them has - # an attrs-made __setattr__, that needs to be reset. We don't walk the - # MRO because we only care about our immediate base classes. - # XXX: This can be confused by subclassing a slotted attrs class with - # XXX: a non-attrs class and subclass the resulting class with an attrs - # XXX: class. See `test_slotted_confused` for details. For now that's - # XXX: OK with us. - if not self._wrote_own_setattr: - cd["__attrs_own_setattr__"] = False - - if not self._has_custom_setattr: - for base_cls in self._cls.__bases__: - if base_cls.__dict__.get("__attrs_own_setattr__", False): - cd["__setattr__"] = _OBJ_SETATTR - break - - # Traverse the MRO to collect existing slots - # and check for an existing __weakref__. - existing_slots = {} - weakref_inherited = False - for base_cls in self._cls.__mro__[1:-1]: - if base_cls.__dict__.get("__weakref__", None) is not None: - weakref_inherited = True - existing_slots.update( - { - name: getattr(base_cls, name) - for name in getattr(base_cls, "__slots__", []) - } - ) - - base_names = set(self._base_names) - - names = self._attr_names - if ( - self._weakref_slot - and "__weakref__" not in getattr(self._cls, "__slots__", ()) - and "__weakref__" not in names - and not weakref_inherited - ): - names += ("__weakref__",) - - cached_properties = { - name: cached_prop.func - for name, cached_prop in cd.items() - if isinstance(cached_prop, cached_property) - } - - # Collect methods with a `__class__` reference that are shadowed in the new class. - # To know to update them. - additional_closure_functions_to_update = [] - if cached_properties: - class_annotations = _get_annotations(self._cls) - for name, func in cached_properties.items(): - # Add cached properties to names for slotting. - names += (name,) - # Clear out function from class to avoid clashing. - del cd[name] - additional_closure_functions_to_update.append(func) - annotation = inspect.signature(func).return_annotation - if annotation is not inspect.Parameter.empty: - class_annotations[name] = annotation - - original_getattr = cd.get("__getattr__") - if original_getattr is not None: - additional_closure_functions_to_update.append(original_getattr) - - cd["__getattr__"] = _make_cached_property_getattr( - cached_properties, original_getattr, self._cls - ) - - # We only add the names of attributes that aren't inherited. - # Setting __slots__ to inherited attributes wastes memory. - slot_names = [name for name in names if name not in base_names] - - # There are slots for attributes from current class - # that are defined in parent classes. - # As their descriptors may be overridden by a child class, - # we collect them here and update the class dict - reused_slots = { - slot: slot_descriptor - for slot, slot_descriptor in existing_slots.items() - if slot in slot_names - } - slot_names = [name for name in slot_names if name not in reused_slots] - cd.update(reused_slots) - if self._cache_hash: - slot_names.append(_HASH_CACHE_FIELD) - - cd["__slots__"] = tuple(slot_names) - - cd["__qualname__"] = self._cls.__qualname__ - - # Create new class based on old class and our methods. - cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) - - # The following is a fix for - # . - # If a method mentions `__class__` or uses the no-arg super(), the - # compiler will bake a reference to the class in the method itself - # as `method.__closure__`. Since we replace the class with a - # clone, we rewrite these references so it keeps working. - for item in itertools.chain( - cls.__dict__.values(), additional_closure_functions_to_update - ): - if isinstance(item, (classmethod, staticmethod)): - # Class- and staticmethods hide their functions inside. - # These might need to be rewritten as well. - closure_cells = getattr(item.__func__, "__closure__", None) - elif isinstance(item, property): - # Workaround for property `super()` shortcut (PY3-only). - # There is no universal way for other descriptors. - closure_cells = getattr(item.fget, "__closure__", None) - else: - closure_cells = getattr(item, "__closure__", None) - - if not closure_cells: # Catch None or the empty list. - continue - for cell in closure_cells: - try: - match = cell.cell_contents is self._cls - except ValueError: # noqa: PERF203 - # ValueError: Cell is empty - pass - else: - if match: - cell.cell_contents = cls - return cls - - def add_repr(self, ns): - script, globs = _make_repr_script(self._attrs, ns) - - def _attach_repr(cls_dict, globs): - cls_dict["__repr__"] = self._add_method_dunders(globs["__repr__"]) - - self._script_snippets.append((script, globs, _attach_repr)) - self._repr_added = True - return self - - def add_str(self): - if not self._repr_added: - msg = "__str__ can only be generated if a __repr__ exists." - raise ValueError(msg) - - def __str__(self): - return self.__repr__() - - self._cls_dict["__str__"] = self._add_method_dunders(__str__) - return self - - def _make_getstate_setstate(self): - """ - Create custom __setstate__ and __getstate__ methods. - """ - # __weakref__ is not writable. - state_attr_names = tuple( - an for an in self._attr_names if an != "__weakref__" - ) - - def slots_getstate(self): - """ - Automatically created by attrs. - """ - return {name: getattr(self, name) for name in state_attr_names} - - hash_caching_enabled = self._cache_hash - - def slots_setstate(self, state): - """ - Automatically created by attrs. - """ - __bound_setattr = _OBJ_SETATTR.__get__(self) - if isinstance(state, tuple): - # Backward compatibility with attrs instances pickled with - # attrs versions before v22.2.0 which stored tuples. - for name, value in zip(state_attr_names, state): - __bound_setattr(name, value) - else: - for name in state_attr_names: - if name in state: - __bound_setattr(name, state[name]) - - # The hash code cache is not included when the object is - # serialized, but it still needs to be initialized to None to - # indicate that the first call to __hash__ should be a cache - # miss. - if hash_caching_enabled: - __bound_setattr(_HASH_CACHE_FIELD, None) - - return slots_getstate, slots_setstate - - def make_unhashable(self): - self._cls_dict["__hash__"] = None - return self - - def add_hash(self): - script, globs = _make_hash_script( - self._cls, - self._attrs, - frozen=self._frozen, - cache_hash=self._cache_hash, - ) - - def attach_hash(cls_dict: dict, locs: dict) -> None: - cls_dict["__hash__"] = self._add_method_dunders(locs["__hash__"]) - - self._script_snippets.append((script, globs, attach_hash)) - - return self - - def add_init(self): - script, globs, annotations = _make_init_script( - self._cls, - self._attrs, - self._has_pre_init, - self._pre_init_has_args, - self._has_post_init, - self._frozen, - self._slots, - self._cache_hash, - self._base_attr_map, - self._is_exc, - self._on_setattr, - attrs_init=False, - ) - - def _attach_init(cls_dict, globs): - init = globs["__init__"] - init.__annotations__ = annotations - cls_dict["__init__"] = self._add_method_dunders(init) - - self._script_snippets.append((script, globs, _attach_init)) - - return self - - def add_replace(self): - self._cls_dict["__replace__"] = self._add_method_dunders( - lambda self, **changes: evolve(self, **changes) - ) - return self - - def add_match_args(self): - self._cls_dict["__match_args__"] = tuple( - field.name - for field in self._attrs - if field.init and not field.kw_only - ) - - def add_attrs_init(self): - script, globs, annotations = _make_init_script( - self._cls, - self._attrs, - self._has_pre_init, - self._pre_init_has_args, - self._has_post_init, - self._frozen, - self._slots, - self._cache_hash, - self._base_attr_map, - self._is_exc, - self._on_setattr, - attrs_init=True, - ) - - def _attach_attrs_init(cls_dict, globs): - init = globs["__attrs_init__"] - init.__annotations__ = annotations - cls_dict["__attrs_init__"] = self._add_method_dunders(init) - - self._script_snippets.append((script, globs, _attach_attrs_init)) - - return self - - def add_eq(self): - cd = self._cls_dict - - script, globs = _make_eq_script(self._attrs) - - def _attach_eq(cls_dict, globs): - cls_dict["__eq__"] = self._add_method_dunders(globs["__eq__"]) - - self._script_snippets.append((script, globs, _attach_eq)) - - cd["__ne__"] = __ne__ - - return self - - def add_order(self): - cd = self._cls_dict - - cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( - self._add_method_dunders(meth) - for meth in _make_order(self._cls, self._attrs) - ) - - return self - - def add_setattr(self): - sa_attrs = {} - for a in self._attrs: - on_setattr = a.on_setattr or self._on_setattr - if on_setattr and on_setattr is not setters.NO_OP: - sa_attrs[a.name] = a, on_setattr - - if not sa_attrs: - return self - - if self._has_custom_setattr: - # We need to write a __setattr__ but there already is one! - msg = "Can't combine custom __setattr__ with on_setattr hooks." - raise ValueError(msg) - - # docstring comes from _add_method_dunders - def __setattr__(self, name, val): - try: - a, hook = sa_attrs[name] - except KeyError: - nval = val - else: - nval = hook(self, a, val) - - _OBJ_SETATTR(self, name, nval) - - self._cls_dict["__attrs_own_setattr__"] = True - self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) - self._wrote_own_setattr = True - - return self - - def _add_method_dunders_unsafe(self, method: Callable) -> Callable: - """ - Add __module__ and __qualname__ to a *method*. - """ - method.__module__ = self._cls.__module__ - - method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" - - method.__doc__ = ( - f"Method generated by attrs for class {self._cls.__qualname__}." - ) - - return method - - def _add_method_dunders_safe(self, method: Callable) -> Callable: - """ - Add __module__ and __qualname__ to a *method* if possible. - """ - with contextlib.suppress(AttributeError): - method.__module__ = self._cls.__module__ - - with contextlib.suppress(AttributeError): - method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" - - with contextlib.suppress(AttributeError): - method.__doc__ = f"Method generated by attrs for class {self._cls.__qualname__}." - - return method - - -def _determine_attrs_eq_order(cmp, eq, order, default_eq): - """ - Validate the combination of *cmp*, *eq*, and *order*. Derive the effective - values of eq and order. If *eq* is None, set it to *default_eq*. - """ - if cmp is not None and any((eq is not None, order is not None)): - msg = "Don't mix `cmp` with `eq' and `order`." - raise ValueError(msg) - - # cmp takes precedence due to bw-compatibility. - if cmp is not None: - return cmp, cmp - - # If left None, equality is set to the specified default and ordering - # mirrors equality. - if eq is None: - eq = default_eq - - if order is None: - order = eq - - if eq is False and order is True: - msg = "`order` can only be True if `eq` is True too." - raise ValueError(msg) - - return eq, order - - -def _determine_attrib_eq_order(cmp, eq, order, default_eq): - """ - Validate the combination of *cmp*, *eq*, and *order*. Derive the effective - values of eq and order. If *eq* is None, set it to *default_eq*. - """ - if cmp is not None and any((eq is not None, order is not None)): - msg = "Don't mix `cmp` with `eq' and `order`." - raise ValueError(msg) - - def decide_callable_or_boolean(value): - """ - Decide whether a key function is used. - """ - if callable(value): - value, key = True, value - else: - key = None - return value, key - - # cmp takes precedence due to bw-compatibility. - if cmp is not None: - cmp, cmp_key = decide_callable_or_boolean(cmp) - return cmp, cmp_key, cmp, cmp_key - - # If left None, equality is set to the specified default and ordering - # mirrors equality. - if eq is None: - eq, eq_key = default_eq, None - else: - eq, eq_key = decide_callable_or_boolean(eq) - - if order is None: - order, order_key = eq, eq_key - else: - order, order_key = decide_callable_or_boolean(order) - - if eq is False and order is True: - msg = "`order` can only be True if `eq` is True too." - raise ValueError(msg) - - return eq, eq_key, order, order_key - - -def _determine_whether_to_implement( - cls, flag, auto_detect, dunders, default=True -): - """ - Check whether we should implement a set of methods for *cls*. - - *flag* is the argument passed into @attr.s like 'init', *auto_detect* the - same as passed into @attr.s and *dunders* is a tuple of attribute names - whose presence signal that the user has implemented it themselves. - - Return *default* if no reason for either for or against is found. - """ - if flag is True or flag is False: - return flag - - if flag is None and auto_detect is False: - return default - - # Logically, flag is None and auto_detect is True here. - for dunder in dunders: - if _has_own_attribute(cls, dunder): - return False - - return default - - -def attrs( - maybe_cls=None, - these=None, - repr_ns=None, - repr=None, - cmp=None, - hash=None, - init=None, - slots=False, - frozen=False, - weakref_slot=True, - str=False, - auto_attribs=False, - kw_only=False, - cache_hash=False, - auto_exc=False, - eq=None, - order=None, - auto_detect=False, - collect_by_mro=False, - getstate_setstate=None, - on_setattr=None, - field_transformer=None, - match_args=True, - unsafe_hash=None, -): - r""" - A class decorator that adds :term:`dunder methods` according to the - specified attributes using `attr.ib` or the *these* argument. - - Consider using `attrs.define` / `attrs.frozen` in new code (``attr.s`` will - *never* go away, though). - - Args: - repr_ns (str): - When using nested classes, there was no way in Python 2 to - automatically detect that. This argument allows to set a custom - name for a more meaningful ``repr`` output. This argument is - pointless in Python 3 and is therefore deprecated. - - .. caution:: - Refer to `attrs.define` for the rest of the parameters, but note that they - can have different defaults. - - Notably, leaving *on_setattr* as `None` will **not** add any hooks. - - .. versionadded:: 16.0.0 *slots* - .. versionadded:: 16.1.0 *frozen* - .. versionadded:: 16.3.0 *str* - .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. - .. versionchanged:: 17.1.0 - *hash* supports `None` as value which is also the default now. - .. versionadded:: 17.3.0 *auto_attribs* - .. versionchanged:: 18.1.0 - If *these* is passed, no attributes are deleted from the class body. - .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. - .. versionadded:: 18.2.0 *weakref_slot* - .. deprecated:: 18.2.0 - ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a - `DeprecationWarning` if the classes compared are subclasses of - each other. ``__eq`` and ``__ne__`` never tried to compared subclasses - to each other. - .. versionchanged:: 19.2.0 - ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider - subclasses comparable anymore. - .. versionadded:: 18.2.0 *kw_only* - .. versionadded:: 18.2.0 *cache_hash* - .. versionadded:: 19.1.0 *auto_exc* - .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. - .. versionadded:: 19.2.0 *eq* and *order* - .. versionadded:: 20.1.0 *auto_detect* - .. versionadded:: 20.1.0 *collect_by_mro* - .. versionadded:: 20.1.0 *getstate_setstate* - .. versionadded:: 20.1.0 *on_setattr* - .. versionadded:: 20.3.0 *field_transformer* - .. versionchanged:: 21.1.0 - ``init=False`` injects ``__attrs_init__`` - .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__`` - .. versionchanged:: 21.1.0 *cmp* undeprecated - .. versionadded:: 21.3.0 *match_args* - .. versionadded:: 22.2.0 - *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). - .. deprecated:: 24.1.0 *repr_ns* - .. versionchanged:: 24.1.0 - Instances are not compared as tuples of attributes anymore, but using a - big ``and`` condition. This is faster and has more correct behavior for - uncomparable values like `math.nan`. - .. versionadded:: 24.1.0 - If a class has an *inherited* classmethod called - ``__attrs_init_subclass__``, it is executed after the class is created. - .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. - """ - if repr_ns is not None: - import warnings - - warnings.warn( - DeprecationWarning( - "The `repr_ns` argument is deprecated and will be removed in or after August 2025." - ), - stacklevel=2, - ) - - eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) - - # unsafe_hash takes precedence due to PEP 681. - if unsafe_hash is not None: - hash = unsafe_hash - - if isinstance(on_setattr, (list, tuple)): - on_setattr = setters.pipe(*on_setattr) - - def wrap(cls): - is_frozen = frozen or _has_frozen_base_class(cls) - is_exc = auto_exc is True and issubclass(cls, BaseException) - has_own_setattr = auto_detect and _has_own_attribute( - cls, "__setattr__" - ) - - if has_own_setattr and is_frozen: - msg = "Can't freeze a class with a custom __setattr__." - raise ValueError(msg) - - builder = _ClassBuilder( - cls, - these, - slots, - is_frozen, - weakref_slot, - _determine_whether_to_implement( - cls, - getstate_setstate, - auto_detect, - ("__getstate__", "__setstate__"), - default=slots, - ), - auto_attribs, - kw_only, - cache_hash, - is_exc, - collect_by_mro, - on_setattr, - has_own_setattr, - field_transformer, - ) - - if _determine_whether_to_implement( - cls, repr, auto_detect, ("__repr__",) - ): - builder.add_repr(repr_ns) - - if str is True: - builder.add_str() - - eq = _determine_whether_to_implement( - cls, eq_, auto_detect, ("__eq__", "__ne__") - ) - if not is_exc and eq is True: - builder.add_eq() - if not is_exc and _determine_whether_to_implement( - cls, order_, auto_detect, ("__lt__", "__le__", "__gt__", "__ge__") - ): - builder.add_order() - - if not frozen: - builder.add_setattr() - - nonlocal hash - if ( - hash is None - and auto_detect is True - and _has_own_attribute(cls, "__hash__") - ): - hash = False - - if hash is not True and hash is not False and hash is not None: - # Can't use `hash in` because 1 == True for example. - msg = "Invalid value for hash. Must be True, False, or None." - raise TypeError(msg) - - if hash is False or (hash is None and eq is False) or is_exc: - # Don't do anything. Should fall back to __object__'s __hash__ - # which is by id. - if cache_hash: - msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." - raise TypeError(msg) - elif hash is True or ( - hash is None and eq is True and is_frozen is True - ): - # Build a __hash__ if told so, or if it's safe. - builder.add_hash() - else: - # Raise TypeError on attempts to hash. - if cache_hash: - msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." - raise TypeError(msg) - builder.make_unhashable() - - if _determine_whether_to_implement( - cls, init, auto_detect, ("__init__",) - ): - builder.add_init() - else: - builder.add_attrs_init() - if cache_hash: - msg = "Invalid value for cache_hash. To use hash caching, init must be True." - raise TypeError(msg) - - if PY_3_13_PLUS and not _has_own_attribute(cls, "__replace__"): - builder.add_replace() - - if ( - PY_3_10_PLUS - and match_args - and not _has_own_attribute(cls, "__match_args__") - ): - builder.add_match_args() - - return builder.build_class() - - # maybe_cls's type depends on the usage of the decorator. It's a class - # if it's used as `@attrs` but `None` if used as `@attrs()`. - if maybe_cls is None: - return wrap - - return wrap(maybe_cls) - - -_attrs = attrs -""" -Internal alias so we can use it in functions that take an argument called -*attrs*. -""" - - -def _has_frozen_base_class(cls): - """ - Check whether *cls* has a frozen ancestor by looking at its - __setattr__. - """ - return cls.__setattr__ is _frozen_setattrs - - -def _generate_unique_filename(cls: type, func_name: str) -> str: - """ - Create a "filename" suitable for a function being generated. - """ - return ( - f"" - ) - - -def _make_hash_script( - cls: type, attrs: list[Attribute], frozen: bool, cache_hash: bool -) -> tuple[str, dict]: - attrs = tuple( - a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) - ) - - tab = " " - - type_hash = hash(_generate_unique_filename(cls, "hash")) - # If eq is custom generated, we need to include the functions in globs - globs = {} - - hash_def = "def __hash__(self" - hash_func = "hash((" - closing_braces = "))" - if not cache_hash: - hash_def += "):" - else: - hash_def += ", *" - - hash_def += ", _cache_wrapper=__import__('attr._make')._make._CacheHashWrapper):" - hash_func = "_cache_wrapper(" + hash_func - closing_braces += ")" - - method_lines = [hash_def] - - def append_hash_computation_lines(prefix, indent): - """ - Generate the code for actually computing the hash code. - Below this will either be returned directly or used to compute - a value which is then cached, depending on the value of cache_hash - """ - - method_lines.extend( - [ - indent + prefix + hash_func, - indent + f" {type_hash},", - ] - ) - - for a in attrs: - if a.eq_key: - cmp_name = f"_{a.name}_key" - globs[cmp_name] = a.eq_key - method_lines.append( - indent + f" {cmp_name}(self.{a.name})," - ) - else: - method_lines.append(indent + f" self.{a.name},") - - method_lines.append(indent + " " + closing_braces) - - if cache_hash: - method_lines.append(tab + f"if self.{_HASH_CACHE_FIELD} is None:") - if frozen: - append_hash_computation_lines( - f"object.__setattr__(self, '{_HASH_CACHE_FIELD}', ", tab * 2 - ) - method_lines.append(tab * 2 + ")") # close __setattr__ - else: - append_hash_computation_lines( - f"self.{_HASH_CACHE_FIELD} = ", tab * 2 - ) - method_lines.append(tab + f"return self.{_HASH_CACHE_FIELD}") - else: - append_hash_computation_lines("return ", tab) - - script = "\n".join(method_lines) - return script, globs - - -def _add_hash(cls: type, attrs: list[Attribute]): - """ - Add a hash method to *cls*. - """ - script, globs = _make_hash_script( - cls, attrs, frozen=False, cache_hash=False - ) - _compile_and_eval( - script, globs, filename=_generate_unique_filename(cls, "__hash__") - ) - cls.__hash__ = globs["__hash__"] - return cls - - -def __ne__(self, other): - """ - Check equality and either forward a NotImplemented or - return the result negated. - """ - result = self.__eq__(other) - if result is NotImplemented: - return NotImplemented - - return not result - - -def _make_eq_script(attrs: list) -> tuple[str, dict]: - """ - Create __eq__ method for *cls* with *attrs*. - """ - attrs = [a for a in attrs if a.eq] - - lines = [ - "def __eq__(self, other):", - " if other.__class__ is not self.__class__:", - " return NotImplemented", - ] - - globs = {} - if attrs: - lines.append(" return (") - for a in attrs: - if a.eq_key: - cmp_name = f"_{a.name}_key" - # Add the key function to the global namespace - # of the evaluated function. - globs[cmp_name] = a.eq_key - lines.append( - f" {cmp_name}(self.{a.name}) == {cmp_name}(other.{a.name})" - ) - else: - lines.append(f" self.{a.name} == other.{a.name}") - if a is not attrs[-1]: - lines[-1] = f"{lines[-1]} and" - lines.append(" )") - else: - lines.append(" return True") - - script = "\n".join(lines) - - return script, globs - - -def _make_order(cls, attrs): - """ - Create ordering methods for *cls* with *attrs*. - """ - attrs = [a for a in attrs if a.order] - - def attrs_to_tuple(obj): - """ - Save us some typing. - """ - return tuple( - key(value) if key else value - for value, key in ( - (getattr(obj, a.name), a.order_key) for a in attrs - ) - ) - - def __lt__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) < attrs_to_tuple(other) - - return NotImplemented - - def __le__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) <= attrs_to_tuple(other) - - return NotImplemented - - def __gt__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) > attrs_to_tuple(other) - - return NotImplemented - - def __ge__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) >= attrs_to_tuple(other) - - return NotImplemented - - return __lt__, __le__, __gt__, __ge__ - - -def _add_eq(cls, attrs=None): - """ - Add equality methods to *cls* with *attrs*. - """ - if attrs is None: - attrs = cls.__attrs_attrs__ - - script, globs = _make_eq_script(attrs) - _compile_and_eval( - script, globs, filename=_generate_unique_filename(cls, "__eq__") - ) - cls.__eq__ = globs["__eq__"] - cls.__ne__ = __ne__ - - return cls - - -def _make_repr_script(attrs, ns) -> tuple[str, dict]: - """ - Create the source and globs for a __repr__ and return it. - """ - # Figure out which attributes to include, and which function to use to - # format them. The a.repr value can be either bool or a custom - # callable. - attr_names_with_reprs = tuple( - (a.name, (repr if a.repr is True else a.repr), a.init) - for a in attrs - if a.repr is not False - ) - globs = { - name + "_repr": r for name, r, _ in attr_names_with_reprs if r != repr - } - globs["_compat"] = _compat - globs["AttributeError"] = AttributeError - globs["NOTHING"] = NOTHING - attribute_fragments = [] - for name, r, i in attr_names_with_reprs: - accessor = ( - "self." + name if i else 'getattr(self, "' + name + '", NOTHING)' - ) - fragment = ( - "%s={%s!r}" % (name, accessor) - if r == repr - else "%s={%s_repr(%s)}" % (name, name, accessor) - ) - attribute_fragments.append(fragment) - repr_fragment = ", ".join(attribute_fragments) - - if ns is None: - cls_name_fragment = '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}' - else: - cls_name_fragment = ns + ".{self.__class__.__name__}" - - lines = [ - "def __repr__(self):", - " try:", - " already_repring = _compat.repr_context.already_repring", - " except AttributeError:", - " already_repring = {id(self),}", - " _compat.repr_context.already_repring = already_repring", - " else:", - " if id(self) in already_repring:", - " return '...'", - " else:", - " already_repring.add(id(self))", - " try:", - f" return f'{cls_name_fragment}({repr_fragment})'", - " finally:", - " already_repring.remove(id(self))", - ] - - return "\n".join(lines), globs - - -def _add_repr(cls, ns=None, attrs=None): - """ - Add a repr method to *cls*. - """ - if attrs is None: - attrs = cls.__attrs_attrs__ - - script, globs = _make_repr_script(attrs, ns) - _compile_and_eval( - script, globs, filename=_generate_unique_filename(cls, "__repr__") - ) - cls.__repr__ = globs["__repr__"] - return cls - - -def fields(cls): - """ - Return the tuple of *attrs* attributes for a class. - - The tuple also allows accessing the fields by their names (see below for - examples). - - Args: - cls (type): Class to introspect. - - Raises: - TypeError: If *cls* is not a class. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - Returns: - tuple (with name accessors) of `attrs.Attribute` - - .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields - by name. - .. versionchanged:: 23.1.0 Add support for generic classes. - """ - generic_base = get_generic_base(cls) - - if generic_base is None and not isinstance(cls, type): - msg = "Passed object must be a class." - raise TypeError(msg) - - attrs = getattr(cls, "__attrs_attrs__", None) - - if attrs is None: - if generic_base is not None: - attrs = getattr(generic_base, "__attrs_attrs__", None) - if attrs is not None: - # Even though this is global state, stick it on here to speed - # it up. We rely on `cls` being cached for this to be - # efficient. - cls.__attrs_attrs__ = attrs - return attrs - msg = f"{cls!r} is not an attrs-decorated class." - raise NotAnAttrsClassError(msg) - - return attrs - - -def fields_dict(cls): - """ - Return an ordered dictionary of *attrs* attributes for a class, whose keys - are the attribute names. - - Args: - cls (type): Class to introspect. - - Raises: - TypeError: If *cls* is not a class. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - Returns: - dict[str, attrs.Attribute]: Dict of attribute name to definition - - .. versionadded:: 18.1.0 - """ - if not isinstance(cls, type): - msg = "Passed object must be a class." - raise TypeError(msg) - attrs = getattr(cls, "__attrs_attrs__", None) - if attrs is None: - msg = f"{cls!r} is not an attrs-decorated class." - raise NotAnAttrsClassError(msg) - return {a.name: a for a in attrs} - - -def validate(inst): - """ - Validate all attributes on *inst* that have a validator. - - Leaves all exceptions through. - - Args: - inst: Instance of a class with *attrs* attributes. - """ - if _config._run_validators is False: - return - - for a in fields(inst.__class__): - v = a.validator - if v is not None: - v(inst, a, getattr(inst, a.name)) - - -def _is_slot_attr(a_name, base_attr_map): - """ - Check if the attribute name comes from a slot class. - """ - cls = base_attr_map.get(a_name) - return cls and "__slots__" in cls.__dict__ - - -def _make_init_script( - cls, - attrs, - pre_init, - pre_init_has_args, - post_init, - frozen, - slots, - cache_hash, - base_attr_map, - is_exc, - cls_on_setattr, - attrs_init, -) -> tuple[str, dict, dict]: - has_cls_on_setattr = ( - cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP - ) - - if frozen and has_cls_on_setattr: - msg = "Frozen classes can't use on_setattr." - raise ValueError(msg) - - needs_cached_setattr = cache_hash or frozen - filtered_attrs = [] - attr_dict = {} - for a in attrs: - if not a.init and a.default is NOTHING: - continue - - filtered_attrs.append(a) - attr_dict[a.name] = a - - if a.on_setattr is not None: - if frozen is True: - msg = "Frozen classes can't use on_setattr." - raise ValueError(msg) - - needs_cached_setattr = True - elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP: - needs_cached_setattr = True - - script, globs, annotations = _attrs_to_init_script( - filtered_attrs, - frozen, - slots, - pre_init, - pre_init_has_args, - post_init, - cache_hash, - base_attr_map, - is_exc, - needs_cached_setattr, - has_cls_on_setattr, - "__attrs_init__" if attrs_init else "__init__", - ) - if cls.__module__ in sys.modules: - # This makes typing.get_type_hints(CLS.__init__) resolve string types. - globs.update(sys.modules[cls.__module__].__dict__) - - globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) - - if needs_cached_setattr: - # Save the lookup overhead in __init__ if we need to circumvent - # setattr hooks. - globs["_cached_setattr_get"] = _OBJ_SETATTR.__get__ - - return script, globs, annotations - - -def _setattr(attr_name: str, value_var: str, has_on_setattr: bool) -> str: - """ - Use the cached object.setattr to set *attr_name* to *value_var*. - """ - return f"_setattr('{attr_name}', {value_var})" - - -def _setattr_with_converter( - attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter -) -> str: - """ - Use the cached object.setattr to set *attr_name* to *value_var*, but run - its converter first. - """ - return f"_setattr('{attr_name}', {converter._fmt_converter_call(attr_name, value_var)})" - - -def _assign(attr_name: str, value: str, has_on_setattr: bool) -> str: - """ - Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise - relegate to _setattr. - """ - if has_on_setattr: - return _setattr(attr_name, value, True) - - return f"self.{attr_name} = {value}" - - -def _assign_with_converter( - attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter -) -> str: - """ - Unless *attr_name* has an on_setattr hook, use normal assignment after - conversion. Otherwise relegate to _setattr_with_converter. - """ - if has_on_setattr: - return _setattr_with_converter(attr_name, value_var, True, converter) - - return f"self.{attr_name} = {converter._fmt_converter_call(attr_name, value_var)}" - - -def _determine_setters( - frozen: bool, slots: bool, base_attr_map: dict[str, type] -): - """ - Determine the correct setter functions based on whether a class is frozen - and/or slotted. - """ - if frozen is True: - if slots is True: - return (), _setattr, _setattr_with_converter - - # Dict frozen classes assign directly to __dict__. - # But only if the attribute doesn't come from an ancestor slot - # class. - # Note _inst_dict will be used again below if cache_hash is True - - def fmt_setter( - attr_name: str, value_var: str, has_on_setattr: bool - ) -> str: - if _is_slot_attr(attr_name, base_attr_map): - return _setattr(attr_name, value_var, has_on_setattr) - - return f"_inst_dict['{attr_name}'] = {value_var}" - - def fmt_setter_with_converter( - attr_name: str, - value_var: str, - has_on_setattr: bool, - converter: Converter, - ) -> str: - if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): - return _setattr_with_converter( - attr_name, value_var, has_on_setattr, converter - ) - - return f"_inst_dict['{attr_name}'] = {converter._fmt_converter_call(attr_name, value_var)}" - - return ( - ("_inst_dict = self.__dict__",), - fmt_setter, - fmt_setter_with_converter, - ) - - # Not frozen -- we can just assign directly. - return (), _assign, _assign_with_converter - - -def _attrs_to_init_script( - attrs: list[Attribute], - is_frozen: bool, - is_slotted: bool, - call_pre_init: bool, - pre_init_has_args: bool, - call_post_init: bool, - does_cache_hash: bool, - base_attr_map: dict[str, type], - is_exc: bool, - needs_cached_setattr: bool, - has_cls_on_setattr: bool, - method_name: str, -) -> tuple[str, dict, dict]: - """ - Return a script of an initializer for *attrs*, a dict of globals, and - annotations for the initializer. - - The globals are required by the generated script. - """ - lines = ["self.__attrs_pre_init__()"] if call_pre_init else [] - - if needs_cached_setattr: - lines.append( - # Circumvent the __setattr__ descriptor to save one lookup per - # assignment. Note _setattr will be used again below if - # does_cache_hash is True. - "_setattr = _cached_setattr_get(self)" - ) - - extra_lines, fmt_setter, fmt_setter_with_converter = _determine_setters( - is_frozen, is_slotted, base_attr_map - ) - lines.extend(extra_lines) - - args = [] - kw_only_args = [] - attrs_to_validate = [] - - # This is a dictionary of names to validator and converter callables. - # Injecting this into __init__ globals lets us avoid lookups. - names_for_globals = {} - annotations = {"return": None} - - for a in attrs: - if a.validator: - attrs_to_validate.append(a) - - attr_name = a.name - has_on_setattr = a.on_setattr is not None or ( - a.on_setattr is not setters.NO_OP and has_cls_on_setattr - ) - # a.alias is set to maybe-mangled attr_name in _ClassBuilder if not - # explicitly provided - arg_name = a.alias - - has_factory = isinstance(a.default, Factory) - maybe_self = "self" if has_factory and a.default.takes_self else "" - - if a.converter is not None and not isinstance(a.converter, Converter): - converter = Converter(a.converter) - else: - converter = a.converter - - if a.init is False: - if has_factory: - init_factory_name = _INIT_FACTORY_PAT % (a.name,) - if converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, - init_factory_name + f"({maybe_self})", - has_on_setattr, - converter, - ) - ) - names_for_globals[converter._get_global_name(a.name)] = ( - converter.converter - ) - else: - lines.append( - fmt_setter( - attr_name, - init_factory_name + f"({maybe_self})", - has_on_setattr, - ) - ) - names_for_globals[init_factory_name] = a.default.factory - elif converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, - f"attr_dict['{attr_name}'].default", - has_on_setattr, - converter, - ) - ) - names_for_globals[converter._get_global_name(a.name)] = ( - converter.converter - ) - else: - lines.append( - fmt_setter( - attr_name, - f"attr_dict['{attr_name}'].default", - has_on_setattr, - ) - ) - elif a.default is not NOTHING and not has_factory: - arg = f"{arg_name}=attr_dict['{attr_name}'].default" - if a.kw_only: - kw_only_args.append(arg) - else: - args.append(arg) - - if converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr, converter - ) - ) - names_for_globals[converter._get_global_name(a.name)] = ( - converter.converter - ) - else: - lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) - - elif has_factory: - arg = f"{arg_name}=NOTHING" - if a.kw_only: - kw_only_args.append(arg) - else: - args.append(arg) - lines.append(f"if {arg_name} is not NOTHING:") - - init_factory_name = _INIT_FACTORY_PAT % (a.name,) - if converter is not None: - lines.append( - " " - + fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr, converter - ) - ) - lines.append("else:") - lines.append( - " " - + fmt_setter_with_converter( - attr_name, - init_factory_name + "(" + maybe_self + ")", - has_on_setattr, - converter, - ) - ) - names_for_globals[converter._get_global_name(a.name)] = ( - converter.converter - ) - else: - lines.append( - " " + fmt_setter(attr_name, arg_name, has_on_setattr) - ) - lines.append("else:") - lines.append( - " " - + fmt_setter( - attr_name, - init_factory_name + "(" + maybe_self + ")", - has_on_setattr, - ) - ) - names_for_globals[init_factory_name] = a.default.factory - else: - if a.kw_only: - kw_only_args.append(arg_name) - else: - args.append(arg_name) - - if converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr, converter - ) - ) - names_for_globals[converter._get_global_name(a.name)] = ( - converter.converter - ) - else: - lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) - - if a.init is True: - if a.type is not None and converter is None: - annotations[arg_name] = a.type - elif converter is not None and converter._first_param_type: - # Use the type from the converter if present. - annotations[arg_name] = converter._first_param_type - - if attrs_to_validate: # we can skip this if there are no validators. - names_for_globals["_config"] = _config - lines.append("if _config._run_validators is True:") - for a in attrs_to_validate: - val_name = "__attr_validator_" + a.name - attr_name = "__attr_" + a.name - lines.append(f" {val_name}(self, {attr_name}, self.{a.name})") - names_for_globals[val_name] = a.validator - names_for_globals[attr_name] = a - - if call_post_init: - lines.append("self.__attrs_post_init__()") - - # Because this is set only after __attrs_post_init__ is called, a crash - # will result if post-init tries to access the hash code. This seemed - # preferable to setting this beforehand, in which case alteration to field - # values during post-init combined with post-init accessing the hash code - # would result in silent bugs. - if does_cache_hash: - if is_frozen: - if is_slotted: - init_hash_cache = f"_setattr('{_HASH_CACHE_FIELD}', None)" - else: - init_hash_cache = f"_inst_dict['{_HASH_CACHE_FIELD}'] = None" - else: - init_hash_cache = f"self.{_HASH_CACHE_FIELD} = None" - lines.append(init_hash_cache) - - # For exceptions we rely on BaseException.__init__ for proper - # initialization. - if is_exc: - vals = ",".join(f"self.{a.name}" for a in attrs if a.init) - - lines.append(f"BaseException.__init__(self, {vals})") - - args = ", ".join(args) - pre_init_args = args - if kw_only_args: - # leading comma & kw_only args - args += f"{', ' if args else ''}*, {', '.join(kw_only_args)}" - pre_init_kw_only_args = ", ".join( - [ - f"{kw_arg_name}={kw_arg_name}" - # We need to remove the defaults from the kw_only_args. - for kw_arg_name in (kwa.split("=")[0] for kwa in kw_only_args) - ] - ) - pre_init_args += ", " if pre_init_args else "" - pre_init_args += pre_init_kw_only_args - - if call_pre_init and pre_init_has_args: - # If pre init method has arguments, pass same arguments as `__init__`. - lines[0] = f"self.__attrs_pre_init__({pre_init_args})" - - # Python <3.12 doesn't allow backslashes in f-strings. - NL = "\n " - return ( - f"""def {method_name}(self, {args}): - {NL.join(lines) if lines else "pass"} -""", - names_for_globals, - annotations, - ) - - -def _default_init_alias_for(name: str) -> str: - """ - The default __init__ parameter name for a field. - - This performs private-name adjustment via leading-unscore stripping, - and is the default value of Attribute.alias if not provided. - """ - - return name.lstrip("_") - - -class Attribute: - """ - *Read-only* representation of an attribute. - - .. warning:: - - You should never instantiate this class yourself. - - The class has *all* arguments of `attr.ib` (except for ``factory`` which is - only syntactic sugar for ``default=Factory(...)`` plus the following: - - - ``name`` (`str`): The name of the attribute. - - ``alias`` (`str`): The __init__ parameter name of the attribute, after - any explicit overrides and default private-attribute-name handling. - - ``inherited`` (`bool`): Whether or not that attribute has been inherited - from a base class. - - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The - callables that are used for comparing and ordering objects by this - attribute, respectively. These are set by passing a callable to - `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also - :ref:`comparison customization `. - - Instances of this class are frequently used for introspection purposes - like: - - - `fields` returns a tuple of them. - - Validators get them passed as the first argument. - - The :ref:`field transformer ` hook receives a list of - them. - - The ``alias`` property exposes the __init__ parameter name of the field, - with any overrides and default private-attribute handling applied. - - - .. versionadded:: 20.1.0 *inherited* - .. versionadded:: 20.1.0 *on_setattr* - .. versionchanged:: 20.2.0 *inherited* is not taken into account for - equality checks and hashing anymore. - .. versionadded:: 21.1.0 *eq_key* and *order_key* - .. versionadded:: 22.2.0 *alias* - - For the full version history of the fields, see `attr.ib`. - """ - - # These slots must NOT be reordered because we use them later for - # instantiation. - __slots__ = ( # noqa: RUF023 - "name", - "default", - "validator", - "repr", - "eq", - "eq_key", - "order", - "order_key", - "hash", - "init", - "metadata", - "type", - "converter", - "kw_only", - "inherited", - "on_setattr", - "alias", - ) - - def __init__( - self, - name, - default, - validator, - repr, - cmp, # XXX: unused, remove along with other cmp code. - hash, - init, - inherited, - metadata=None, - type=None, - converter=None, - kw_only=False, - eq=None, - eq_key=None, - order=None, - order_key=None, - on_setattr=None, - alias=None, - ): - eq, eq_key, order, order_key = _determine_attrib_eq_order( - cmp, eq_key or eq, order_key or order, True - ) - - # Cache this descriptor here to speed things up later. - bound_setattr = _OBJ_SETATTR.__get__(self) - - # Despite the big red warning, people *do* instantiate `Attribute` - # themselves. - bound_setattr("name", name) - bound_setattr("default", default) - bound_setattr("validator", validator) - bound_setattr("repr", repr) - bound_setattr("eq", eq) - bound_setattr("eq_key", eq_key) - bound_setattr("order", order) - bound_setattr("order_key", order_key) - bound_setattr("hash", hash) - bound_setattr("init", init) - bound_setattr("converter", converter) - bound_setattr( - "metadata", - ( - types.MappingProxyType(dict(metadata)) # Shallow copy - if metadata - else _EMPTY_METADATA_SINGLETON - ), - ) - bound_setattr("type", type) - bound_setattr("kw_only", kw_only) - bound_setattr("inherited", inherited) - bound_setattr("on_setattr", on_setattr) - bound_setattr("alias", alias) - - def __setattr__(self, name, value): - raise FrozenInstanceError - - @classmethod - def from_counting_attr(cls, name: str, ca: _CountingAttr, type=None): - # type holds the annotated value. deal with conflicts: - if type is None: - type = ca.type - elif ca.type is not None: - msg = f"Type annotation and type argument cannot both be present for '{name}'." - raise ValueError(msg) - return cls( - name, - ca._default, - ca._validator, - ca.repr, - None, - ca.hash, - ca.init, - False, - ca.metadata, - type, - ca.converter, - ca.kw_only, - ca.eq, - ca.eq_key, - ca.order, - ca.order_key, - ca.on_setattr, - ca.alias, - ) - - # Don't use attrs.evolve since fields(Attribute) doesn't work - def evolve(self, **changes): - """ - Copy *self* and apply *changes*. - - This works similarly to `attrs.evolve` but that function does not work - with :class:`attrs.Attribute`. - - It is mainly meant to be used for `transform-fields`. - - .. versionadded:: 20.3.0 - """ - new = copy.copy(self) - - new._setattrs(changes.items()) - - return new - - # Don't use _add_pickle since fields(Attribute) doesn't work - def __getstate__(self): - """ - Play nice with pickle. - """ - return tuple( - getattr(self, name) if name != "metadata" else dict(self.metadata) - for name in self.__slots__ - ) - - def __setstate__(self, state): - """ - Play nice with pickle. - """ - self._setattrs(zip(self.__slots__, state)) - - def _setattrs(self, name_values_pairs): - bound_setattr = _OBJ_SETATTR.__get__(self) - for name, value in name_values_pairs: - if name != "metadata": - bound_setattr(name, value) - else: - bound_setattr( - name, - ( - types.MappingProxyType(dict(value)) - if value - else _EMPTY_METADATA_SINGLETON - ), - ) - - -_a = [ - Attribute( - name=name, - default=NOTHING, - validator=None, - repr=True, - cmp=None, - eq=True, - order=False, - hash=(name != "metadata"), - init=True, - inherited=False, - alias=_default_init_alias_for(name), - ) - for name in Attribute.__slots__ -] - -Attribute = _add_hash( - _add_eq( - _add_repr(Attribute, attrs=_a), - attrs=[a for a in _a if a.name != "inherited"], - ), - attrs=[a for a in _a if a.hash and a.name != "inherited"], -) - - -class _CountingAttr: - """ - Intermediate representation of attributes that uses a counter to preserve - the order in which the attributes have been defined. - - *Internal* data structure of the attrs library. Running into is most - likely the result of a bug like a forgotten `@attr.s` decorator. - """ - - __slots__ = ( - "_default", - "_validator", - "alias", - "converter", - "counter", - "eq", - "eq_key", - "hash", - "init", - "kw_only", - "metadata", - "on_setattr", - "order", - "order_key", - "repr", - "type", - ) - __attrs_attrs__ = ( - *tuple( - Attribute( - name=name, - alias=_default_init_alias_for(name), - default=NOTHING, - validator=None, - repr=True, - cmp=None, - hash=True, - init=True, - kw_only=False, - eq=True, - eq_key=None, - order=False, - order_key=None, - inherited=False, - on_setattr=None, - ) - for name in ( - "counter", - "_default", - "repr", - "eq", - "order", - "hash", - "init", - "on_setattr", - "alias", - ) - ), - Attribute( - name="metadata", - alias="metadata", - default=None, - validator=None, - repr=True, - cmp=None, - hash=False, - init=True, - kw_only=False, - eq=True, - eq_key=None, - order=False, - order_key=None, - inherited=False, - on_setattr=None, - ), - ) - cls_counter = 0 - - def __init__( - self, - default, - validator, - repr, - cmp, - hash, - init, - converter, - metadata, - type, - kw_only, - eq, - eq_key, - order, - order_key, - on_setattr, - alias, - ): - _CountingAttr.cls_counter += 1 - self.counter = _CountingAttr.cls_counter - self._default = default - self._validator = validator - self.converter = converter - self.repr = repr - self.eq = eq - self.eq_key = eq_key - self.order = order - self.order_key = order_key - self.hash = hash - self.init = init - self.metadata = metadata - self.type = type - self.kw_only = kw_only - self.on_setattr = on_setattr - self.alias = alias - - def validator(self, meth): - """ - Decorator that adds *meth* to the list of validators. - - Returns *meth* unchanged. - - .. versionadded:: 17.1.0 - """ - if self._validator is None: - self._validator = meth - else: - self._validator = and_(self._validator, meth) - return meth - - def default(self, meth): - """ - Decorator that allows to set the default for an attribute. - - Returns *meth* unchanged. - - Raises: - DefaultAlreadySetError: If default has been set before. - - .. versionadded:: 17.1.0 - """ - if self._default is not NOTHING: - raise DefaultAlreadySetError - - self._default = Factory(meth, takes_self=True) - - return meth - - -_CountingAttr = _add_eq(_add_repr(_CountingAttr)) - - -class Factory: - """ - Stores a factory callable. - - If passed as the default value to `attrs.field`, the factory is used to - generate a new value. - - Args: - factory (typing.Callable): - A callable that takes either none or exactly one mandatory - positional argument depending on *takes_self*. - - takes_self (bool): - Pass the partially initialized instance that is being initialized - as a positional argument. - - .. versionadded:: 17.1.0 *takes_self* - """ - - __slots__ = ("factory", "takes_self") - - def __init__(self, factory, takes_self=False): - self.factory = factory - self.takes_self = takes_self - - def __getstate__(self): - """ - Play nice with pickle. - """ - return tuple(getattr(self, name) for name in self.__slots__) - - def __setstate__(self, state): - """ - Play nice with pickle. - """ - for name, value in zip(self.__slots__, state): - setattr(self, name, value) - - -_f = [ - Attribute( - name=name, - default=NOTHING, - validator=None, - repr=True, - cmp=None, - eq=True, - order=False, - hash=True, - init=True, - inherited=False, - ) - for name in Factory.__slots__ -] - -Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) - - -class Converter: - """ - Stores a converter callable. - - Allows for the wrapped converter to take additional arguments. The - arguments are passed in the order they are documented. - - Args: - converter (Callable): A callable that converts the passed value. - - takes_self (bool): - Pass the partially initialized instance that is being initialized - as a positional argument. (default: `False`) - - takes_field (bool): - Pass the field definition (an :class:`Attribute`) into the - converter as a positional argument. (default: `False`) - - .. versionadded:: 24.1.0 - """ - - __slots__ = ( - "__call__", - "_first_param_type", - "_global_name", - "converter", - "takes_field", - "takes_self", - ) - - def __init__(self, converter, *, takes_self=False, takes_field=False): - self.converter = converter - self.takes_self = takes_self - self.takes_field = takes_field - - ex = _AnnotationExtractor(converter) - self._first_param_type = ex.get_first_param_type() - - if not (self.takes_self or self.takes_field): - self.__call__ = lambda value, _, __: self.converter(value) - elif self.takes_self and not self.takes_field: - self.__call__ = lambda value, instance, __: self.converter( - value, instance - ) - elif not self.takes_self and self.takes_field: - self.__call__ = lambda value, __, field: self.converter( - value, field - ) - else: - self.__call__ = lambda value, instance, field: self.converter( - value, instance, field - ) - - rt = ex.get_return_type() - if rt is not None: - self.__call__.__annotations__["return"] = rt - - @staticmethod - def _get_global_name(attr_name: str) -> str: - """ - Return the name that a converter for an attribute name *attr_name* - would have. - """ - return f"__attr_converter_{attr_name}" - - def _fmt_converter_call(self, attr_name: str, value_var: str) -> str: - """ - Return a string that calls the converter for an attribute name - *attr_name* and the value in variable named *value_var* according to - `self.takes_self` and `self.takes_field`. - """ - if not (self.takes_self or self.takes_field): - return f"{self._get_global_name(attr_name)}({value_var})" - - if self.takes_self and self.takes_field: - return f"{self._get_global_name(attr_name)}({value_var}, self, attr_dict['{attr_name}'])" - - if self.takes_self: - return f"{self._get_global_name(attr_name)}({value_var}, self)" - - return f"{self._get_global_name(attr_name)}({value_var}, attr_dict['{attr_name}'])" - - def __getstate__(self): - """ - Return a dict containing only converter and takes_self -- the rest gets - computed when loading. - """ - return { - "converter": self.converter, - "takes_self": self.takes_self, - "takes_field": self.takes_field, - } - - def __setstate__(self, state): - """ - Load instance from state. - """ - self.__init__(**state) - - -_f = [ - Attribute( - name=name, - default=NOTHING, - validator=None, - repr=True, - cmp=None, - eq=True, - order=False, - hash=True, - init=True, - inherited=False, - ) - for name in ("converter", "takes_self", "takes_field") -] - -Converter = _add_hash( - _add_eq(_add_repr(Converter, attrs=_f), attrs=_f), attrs=_f -) - - -def make_class( - name, attrs, bases=(object,), class_body=None, **attributes_arguments -): - r""" - A quick way to create a new class called *name* with *attrs*. - - .. note:: - - ``make_class()`` is a thin wrapper around `attr.s`, not `attrs.define` - which means that it doesn't come with some of the improved defaults. - - For example, if you want the same ``on_setattr`` behavior as in - `attrs.define`, you have to pass the hooks yourself: ``make_class(..., - on_setattr=setters.pipe(setters.convert, setters.validate)`` - - .. warning:: - - It is *your* duty to ensure that the class name and the attribute names - are valid identifiers. ``make_class()`` will *not* validate them for - you. - - Args: - name (str): The name for the new class. - - attrs (list | dict): - A list of names or a dictionary of mappings of names to `attr.ib`\ - s / `attrs.field`\ s. - - The order is deduced from the order of the names or attributes - inside *attrs*. Otherwise the order of the definition of the - attributes is used. - - bases (tuple[type, ...]): Classes that the new class will subclass. - - class_body (dict): - An optional dictionary of class attributes for the new class. - - attributes_arguments: Passed unmodified to `attr.s`. - - Returns: - type: A new class with *attrs*. - - .. versionadded:: 17.1.0 *bases* - .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. - .. versionchanged:: 23.2.0 *class_body* - .. versionchanged:: 25.2.0 Class names can now be unicode. - """ - # Class identifiers are converted into the normal form NFKC while parsing - name = unicodedata.normalize("NFKC", name) - - if isinstance(attrs, dict): - cls_dict = attrs - elif isinstance(attrs, (list, tuple)): - cls_dict = {a: attrib() for a in attrs} - else: - msg = "attrs argument must be a dict or a list." - raise TypeError(msg) - - pre_init = cls_dict.pop("__attrs_pre_init__", None) - post_init = cls_dict.pop("__attrs_post_init__", None) - user_init = cls_dict.pop("__init__", None) - - body = {} - if class_body is not None: - body.update(class_body) - if pre_init is not None: - body["__attrs_pre_init__"] = pre_init - if post_init is not None: - body["__attrs_post_init__"] = post_init - if user_init is not None: - body["__init__"] = user_init - - type_ = types.new_class(name, bases, {}, lambda ns: ns.update(body)) - - # For pickling to work, the __module__ variable needs to be set to the - # frame where the class is created. Bypass this step in environments where - # sys._getframe is not defined (Jython for example) or sys._getframe is not - # defined for arguments greater than 0 (IronPython). - with contextlib.suppress(AttributeError, ValueError): - type_.__module__ = sys._getframe(1).f_globals.get( - "__name__", "__main__" - ) - - # We do it here for proper warnings with meaningful stacklevel. - cmp = attributes_arguments.pop("cmp", None) - ( - attributes_arguments["eq"], - attributes_arguments["order"], - ) = _determine_attrs_eq_order( - cmp, - attributes_arguments.get("eq"), - attributes_arguments.get("order"), - True, - ) - - cls = _attrs(these=cls_dict, **attributes_arguments)(type_) - # Only add type annotations now or "_attrs()" will complain: - cls.__annotations__ = { - k: v.type for k, v in cls_dict.items() if v.type is not None - } - return cls - - -# These are required by within this module so we define them here and merely -# import into .validators / .converters. - - -@attrs(slots=True, unsafe_hash=True) -class _AndValidator: - """ - Compose many validators to a single one. - """ - - _validators = attrib() - - def __call__(self, inst, attr, value): - for v in self._validators: - v(inst, attr, value) - - -def and_(*validators): - """ - A validator that composes multiple validators into one. - - When called on a value, it runs all wrapped validators. - - Args: - validators (~collections.abc.Iterable[typing.Callable]): - Arbitrary number of validators. - - .. versionadded:: 17.1.0 - """ - vals = [] - for validator in validators: - vals.extend( - validator._validators - if isinstance(validator, _AndValidator) - else [validator] - ) - - return _AndValidator(tuple(vals)) - - -def pipe(*converters): - """ - A converter that composes multiple converters into one. - - When called on a value, it runs all wrapped converters, returning the - *last* value. - - Type annotations will be inferred from the wrapped converters', if they - have any. - - converters (~collections.abc.Iterable[typing.Callable]): - Arbitrary number of converters. - - .. versionadded:: 20.1.0 - """ - - return_instance = any(isinstance(c, Converter) for c in converters) - - if return_instance: - - def pipe_converter(val, inst, field): - for c in converters: - val = ( - c(val, inst, field) if isinstance(c, Converter) else c(val) - ) - - return val - - else: - - def pipe_converter(val): - for c in converters: - val = c(val) - - return val - - if not converters: - # If the converter list is empty, pipe_converter is the identity. - A = TypeVar("A") - pipe_converter.__annotations__.update({"val": A, "return": A}) - else: - # Get parameter type from first converter. - t = _AnnotationExtractor(converters[0]).get_first_param_type() - if t: - pipe_converter.__annotations__["val"] = t - - last = converters[-1] - if not PY_3_11_PLUS and isinstance(last, Converter): - last = last.__call__ - - # Get return type from last converter. - rt = _AnnotationExtractor(last).get_return_type() - if rt: - pipe_converter.__annotations__["return"] = rt - - if return_instance: - return Converter(pipe_converter, takes_self=True, takes_field=True) - return pipe_converter diff --git a/.venv/lib/python3.10/site-packages/attr/_next_gen.py b/.venv/lib/python3.10/site-packages/attr/_next_gen.py deleted file mode 100644 index 9290664..0000000 --- a/.venv/lib/python3.10/site-packages/attr/_next_gen.py +++ /dev/null @@ -1,623 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -These are keyword-only APIs that call `attr.s` and `attr.ib` with different -default values. -""" - -from functools import partial - -from . import setters -from ._funcs import asdict as _asdict -from ._funcs import astuple as _astuple -from ._make import ( - _DEFAULT_ON_SETATTR, - NOTHING, - _frozen_setattrs, - attrib, - attrs, -) -from .exceptions import UnannotatedAttributeError - - -def define( - maybe_cls=None, - *, - these=None, - repr=None, - unsafe_hash=None, - hash=None, - init=None, - slots=True, - frozen=False, - weakref_slot=True, - str=False, - auto_attribs=None, - kw_only=False, - cache_hash=False, - auto_exc=True, - eq=None, - order=False, - auto_detect=True, - getstate_setstate=None, - on_setattr=None, - field_transformer=None, - match_args=True, -): - r""" - A class decorator that adds :term:`dunder methods` according to - :term:`fields ` specified using :doc:`type annotations `, - `field()` calls, or the *these* argument. - - Since *attrs* patches or replaces an existing class, you cannot use - `object.__init_subclass__` with *attrs* classes, because it runs too early. - As a replacement, you can define ``__attrs_init_subclass__`` on your class. - It will be called by *attrs* classes that subclass it after they're - created. See also :ref:`init-subclass`. - - Args: - slots (bool): - Create a :term:`slotted class ` that's more - memory-efficient. Slotted classes are generally superior to the - default dict classes, but have some gotchas you should know about, - so we encourage you to read the :term:`glossary entry `. - - auto_detect (bool): - Instead of setting the *init*, *repr*, *eq*, and *hash* arguments - explicitly, assume they are set to True **unless any** of the - involved methods for one of the arguments is implemented in the - *current* class (meaning, it is *not* inherited from some base - class). - - So, for example by implementing ``__eq__`` on a class yourself, - *attrs* will deduce ``eq=False`` and will create *neither* - ``__eq__`` *nor* ``__ne__`` (but Python classes come with a - sensible ``__ne__`` by default, so it *should* be enough to only - implement ``__eq__`` in most cases). - - Passing True or False` to *init*, *repr*, *eq*, or *hash* - overrides whatever *auto_detect* would determine. - - auto_exc (bool): - If the class subclasses `BaseException` (which implicitly includes - any subclass of any exception), the following happens to behave - like a well-behaved Python exception class: - - - the values for *eq*, *order*, and *hash* are ignored and the - instances compare and hash by the instance's ids [#]_ , - - all attributes that are either passed into ``__init__`` or have a - default value are additionally available as a tuple in the - ``args`` attribute, - - the value of *str* is ignored leaving ``__str__`` to base - classes. - - .. [#] - Note that *attrs* will *not* remove existing implementations of - ``__hash__`` or the equality methods. It just won't add own - ones. - - on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): - A callable that is run whenever the user attempts to set an - attribute (either by assignment like ``i.x = 42`` or by using - `setattr` like ``setattr(i, "x", 42)``). It receives the same - arguments as validators: the instance, the attribute that is being - modified, and the new value. - - If no exception is raised, the attribute is set to the return value - of the callable. - - If a list of callables is passed, they're automatically wrapped in - an `attrs.setters.pipe`. - - If left None, the default behavior is to run converters and - validators whenever an attribute is set. - - init (bool): - Create a ``__init__`` method that initializes the *attrs* - attributes. Leading underscores are stripped for the argument name, - unless an alias is set on the attribute. - - .. seealso:: - `init` shows advanced ways to customize the generated - ``__init__`` method, including executing code before and after. - - repr(bool): - Create a ``__repr__`` method with a human readable representation - of *attrs* attributes. - - str (bool): - Create a ``__str__`` method that is identical to ``__repr__``. This - is usually not necessary except for `Exception`\ s. - - eq (bool | None): - If True or None (default), add ``__eq__`` and ``__ne__`` methods - that check two instances for equality. - - .. seealso:: - `comparison` describes how to customize the comparison behavior - going as far comparing NumPy arrays. - - order (bool | None): - If True, add ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` - methods that behave like *eq* above and allow instances to be - ordered. - - They compare the instances as if they were tuples of their *attrs* - attributes if and only if the types of both classes are - *identical*. - - If `None` mirror value of *eq*. - - .. seealso:: `comparison` - - unsafe_hash (bool | None): - If None (default), the ``__hash__`` method is generated according - how *eq* and *frozen* are set. - - 1. If *both* are True, *attrs* will generate a ``__hash__`` for - you. - 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set - to None, marking it unhashable (which it is). - 3. If *eq* is False, ``__hash__`` will be left untouched meaning - the ``__hash__`` method of the base class will be used. If the - base class is `object`, this means it will fall back to id-based - hashing. - - Although not recommended, you can decide for yourself and force - *attrs* to create one (for example, if the class is immutable even - though you didn't freeze it programmatically) by passing True or - not. Both of these cases are rather special and should be used - carefully. - - .. seealso:: - - - Our documentation on `hashing`, - - Python's documentation on `object.__hash__`, - - and the `GitHub issue that led to the default \ behavior - `_ for more - details. - - hash (bool | None): - Deprecated alias for *unsafe_hash*. *unsafe_hash* takes precedence. - - cache_hash (bool): - Ensure that the object's hash code is computed only once and stored - on the object. If this is set to True, hashing must be either - explicitly or implicitly enabled for this class. If the hash code - is cached, avoid any reassignments of fields involved in hash code - computation or mutations of the objects those fields point to after - object creation. If such changes occur, the behavior of the - object's hash code is undefined. - - frozen (bool): - Make instances immutable after initialization. If someone attempts - to modify a frozen instance, `attrs.exceptions.FrozenInstanceError` - is raised. - - .. note:: - - 1. This is achieved by installing a custom ``__setattr__`` - method on your class, so you can't implement your own. - - 2. True immutability is impossible in Python. - - 3. This *does* have a minor a runtime performance `impact - ` when initializing new instances. In other - words: ``__init__`` is slightly slower with ``frozen=True``. - - 4. If a class is frozen, you cannot modify ``self`` in - ``__attrs_post_init__`` or a self-written ``__init__``. You - can circumvent that limitation by using - ``object.__setattr__(self, "attribute_name", value)``. - - 5. Subclasses of a frozen class are frozen too. - - kw_only (bool): - Make all attributes keyword-only in the generated ``__init__`` (if - *init* is False, this parameter is ignored). - - weakref_slot (bool): - Make instances weak-referenceable. This has no effect unless - *slots* is True. - - field_transformer (~typing.Callable | None): - A function that is called with the original class object and all - fields right before *attrs* finalizes the class. You can use this, - for example, to automatically add converters or validators to - fields based on their types. - - .. seealso:: `transform-fields` - - match_args (bool): - If True (default), set ``__match_args__`` on the class to support - :pep:`634` (*Structural Pattern Matching*). It is a tuple of all - non-keyword-only ``__init__`` parameter names on Python 3.10 and - later. Ignored on older Python versions. - - collect_by_mro (bool): - If True, *attrs* collects attributes from base classes correctly - according to the `method resolution order - `_. If False, *attrs* - will mimic the (wrong) behavior of `dataclasses` and :pep:`681`. - - See also `issue #428 - `_. - - getstate_setstate (bool | None): - .. note:: - - This is usually only interesting for slotted classes and you - should probably just set *auto_detect* to True. - - If True, ``__getstate__`` and ``__setstate__`` are generated and - attached to the class. This is necessary for slotted classes to be - pickleable. If left None, it's True by default for slotted classes - and False for dict classes. - - If *auto_detect* is True, and *getstate_setstate* is left None, and - **either** ``__getstate__`` or ``__setstate__`` is detected - directly on the class (meaning: not inherited), it is set to False - (this is usually what you want). - - auto_attribs (bool | None): - If True, look at type annotations to determine which attributes to - use, like `dataclasses`. If False, it will only look for explicit - :func:`field` class attributes, like classic *attrs*. - - If left None, it will guess: - - 1. If any attributes are annotated and no unannotated - `attrs.field`\ s are found, it assumes *auto_attribs=True*. - 2. Otherwise it assumes *auto_attribs=False* and tries to collect - `attrs.field`\ s. - - If *attrs* decides to look at type annotations, **all** fields - **must** be annotated. If *attrs* encounters a field that is set to - a :func:`field` / `attr.ib` but lacks a type annotation, an - `attrs.exceptions.UnannotatedAttributeError` is raised. Use - ``field_name: typing.Any = field(...)`` if you don't want to set a - type. - - .. warning:: - - For features that use the attribute name to create decorators - (for example, :ref:`validators `), you still *must* - assign :func:`field` / `attr.ib` to them. Otherwise Python will - either not find the name or try to use the default value to - call, for example, ``validator`` on it. - - Attributes annotated as `typing.ClassVar`, and attributes that are - neither annotated nor set to an `field()` are **ignored**. - - these (dict[str, object]): - A dictionary of name to the (private) return value of `field()` - mappings. This is useful to avoid the definition of your attributes - within the class body because you can't (for example, if you want - to add ``__repr__`` methods to Django models) or don't want to. - - If *these* is not `None`, *attrs* will *not* search the class body - for attributes and will *not* remove any attributes from it. - - The order is deduced from the order of the attributes inside - *these*. - - Arguably, this is a rather obscure feature. - - .. versionadded:: 20.1.0 - .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``. - .. versionadded:: 22.2.0 - *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). - .. versionchanged:: 24.1.0 - Instances are not compared as tuples of attributes anymore, but using a - big ``and`` condition. This is faster and has more correct behavior for - uncomparable values like `math.nan`. - .. versionadded:: 24.1.0 - If a class has an *inherited* classmethod called - ``__attrs_init_subclass__``, it is executed after the class is created. - .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. - .. versionadded:: 24.3.0 - Unless already present, a ``__replace__`` method is automatically - created for `copy.replace` (Python 3.13+ only). - - .. note:: - - The main differences to the classic `attr.s` are: - - - Automatically detect whether or not *auto_attribs* should be `True` - (c.f. *auto_attribs* parameter). - - Converters and validators run when attributes are set by default -- - if *frozen* is `False`. - - *slots=True* - - Usually, this has only upsides and few visible effects in everyday - programming. But it *can* lead to some surprising behaviors, so - please make sure to read :term:`slotted classes`. - - - *auto_exc=True* - - *auto_detect=True* - - *order=False* - - Some options that were only relevant on Python 2 or were kept around - for backwards-compatibility have been removed. - - """ - - def do_it(cls, auto_attribs): - return attrs( - maybe_cls=cls, - these=these, - repr=repr, - hash=hash, - unsafe_hash=unsafe_hash, - init=init, - slots=slots, - frozen=frozen, - weakref_slot=weakref_slot, - str=str, - auto_attribs=auto_attribs, - kw_only=kw_only, - cache_hash=cache_hash, - auto_exc=auto_exc, - eq=eq, - order=order, - auto_detect=auto_detect, - collect_by_mro=True, - getstate_setstate=getstate_setstate, - on_setattr=on_setattr, - field_transformer=field_transformer, - match_args=match_args, - ) - - def wrap(cls): - """ - Making this a wrapper ensures this code runs during class creation. - - We also ensure that frozen-ness of classes is inherited. - """ - nonlocal frozen, on_setattr - - had_on_setattr = on_setattr not in (None, setters.NO_OP) - - # By default, mutable classes convert & validate on setattr. - if frozen is False and on_setattr is None: - on_setattr = _DEFAULT_ON_SETATTR - - # However, if we subclass a frozen class, we inherit the immutability - # and disable on_setattr. - for base_cls in cls.__bases__: - if base_cls.__setattr__ is _frozen_setattrs: - if had_on_setattr: - msg = "Frozen classes can't use on_setattr (frozen-ness was inherited)." - raise ValueError(msg) - - on_setattr = setters.NO_OP - break - - if auto_attribs is not None: - return do_it(cls, auto_attribs) - - try: - return do_it(cls, True) - except UnannotatedAttributeError: - return do_it(cls, False) - - # maybe_cls's type depends on the usage of the decorator. It's a class - # if it's used as `@attrs` but `None` if used as `@attrs()`. - if maybe_cls is None: - return wrap - - return wrap(maybe_cls) - - -mutable = define -frozen = partial(define, frozen=True, on_setattr=None) - - -def field( - *, - default=NOTHING, - validator=None, - repr=True, - hash=None, - init=True, - metadata=None, - type=None, - converter=None, - factory=None, - kw_only=False, - eq=None, - order=None, - on_setattr=None, - alias=None, -): - """ - Create a new :term:`field` / :term:`attribute` on a class. - - .. warning:: - - Does **nothing** unless the class is also decorated with - `attrs.define` (or similar)! - - Args: - default: - A value that is used if an *attrs*-generated ``__init__`` is used - and no value is passed while instantiating or the attribute is - excluded using ``init=False``. - - If the value is an instance of `attrs.Factory`, its callable will - be used to construct a new value (useful for mutable data types - like lists or dicts). - - If a default is not set (or set manually to `attrs.NOTHING`), a - value *must* be supplied when instantiating; otherwise a - `TypeError` will be raised. - - .. seealso:: `defaults` - - factory (~typing.Callable): - Syntactic sugar for ``default=attr.Factory(factory)``. - - validator (~typing.Callable | list[~typing.Callable]): - Callable that is called by *attrs*-generated ``__init__`` methods - after the instance has been initialized. They receive the - initialized instance, the :func:`~attrs.Attribute`, and the passed - value. - - The return value is *not* inspected so the validator has to throw - an exception itself. - - If a `list` is passed, its items are treated as validators and must - all pass. - - Validators can be globally disabled and re-enabled using - `attrs.validators.get_disabled` / `attrs.validators.set_disabled`. - - The validator can also be set using decorator notation as shown - below. - - .. seealso:: :ref:`validators` - - repr (bool | ~typing.Callable): - Include this attribute in the generated ``__repr__`` method. If - True, include the attribute; if False, omit it. By default, the - built-in ``repr()`` function is used. To override how the attribute - value is formatted, pass a ``callable`` that takes a single value - and returns a string. Note that the resulting string is used as-is, - which means it will be used directly *instead* of calling - ``repr()`` (the default). - - eq (bool | ~typing.Callable): - If True (default), include this attribute in the generated - ``__eq__`` and ``__ne__`` methods that check two instances for - equality. To override how the attribute value is compared, pass a - callable that takes a single value and returns the value to be - compared. - - .. seealso:: `comparison` - - order (bool | ~typing.Callable): - If True (default), include this attributes in the generated - ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. To - override how the attribute value is ordered, pass a callable that - takes a single value and returns the value to be ordered. - - .. seealso:: `comparison` - - hash (bool | None): - Include this attribute in the generated ``__hash__`` method. If - None (default), mirror *eq*'s value. This is the correct behavior - according the Python spec. Setting this value to anything else - than None is *discouraged*. - - .. seealso:: `hashing` - - init (bool): - Include this attribute in the generated ``__init__`` method. - - It is possible to set this to False and set a default value. In - that case this attributed is unconditionally initialized with the - specified default value or factory. - - .. seealso:: `init` - - converter (typing.Callable | Converter): - A callable that is called by *attrs*-generated ``__init__`` methods - to convert attribute's value to the desired format. - - If a vanilla callable is passed, it is given the passed-in value as - the only positional argument. It is possible to receive additional - arguments by wrapping the callable in a `Converter`. - - Either way, the returned value will be used as the new value of the - attribute. The value is converted before being passed to the - validator, if any. - - .. seealso:: :ref:`converters` - - metadata (dict | None): - An arbitrary mapping, to be used by third-party code. - - .. seealso:: `extending-metadata`. - - type (type): - The type of the attribute. Nowadays, the preferred method to - specify the type is using a variable annotation (see :pep:`526`). - This argument is provided for backwards-compatibility and for usage - with `make_class`. Regardless of the approach used, the type will - be stored on ``Attribute.type``. - - Please note that *attrs* doesn't do anything with this metadata by - itself. You can use it as part of your own code or for `static type - checking `. - - kw_only (bool): - Make this attribute keyword-only in the generated ``__init__`` (if - ``init`` is False, this parameter is ignored). - - on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): - Allows to overwrite the *on_setattr* setting from `attr.s`. If left - None, the *on_setattr* value from `attr.s` is used. Set to - `attrs.setters.NO_OP` to run **no** `setattr` hooks for this - attribute -- regardless of the setting in `define()`. - - alias (str | None): - Override this attribute's parameter name in the generated - ``__init__`` method. If left None, default to ``name`` stripped - of leading underscores. See `private-attributes`. - - .. versionadded:: 20.1.0 - .. versionchanged:: 21.1.0 - *eq*, *order*, and *cmp* also accept a custom callable - .. versionadded:: 22.2.0 *alias* - .. versionadded:: 23.1.0 - The *type* parameter has been re-added; mostly for `attrs.make_class`. - Please note that type checkers ignore this metadata. - - .. seealso:: - - `attr.ib` - """ - return attrib( - default=default, - validator=validator, - repr=repr, - hash=hash, - init=init, - metadata=metadata, - type=type, - converter=converter, - factory=factory, - kw_only=kw_only, - eq=eq, - order=order, - on_setattr=on_setattr, - alias=alias, - ) - - -def asdict(inst, *, recurse=True, filter=None, value_serializer=None): - """ - Same as `attr.asdict`, except that collections types are always retained - and dict is always used as *dict_factory*. - - .. versionadded:: 21.3.0 - """ - return _asdict( - inst=inst, - recurse=recurse, - filter=filter, - value_serializer=value_serializer, - retain_collection_types=True, - ) - - -def astuple(inst, *, recurse=True, filter=None): - """ - Same as `attr.astuple`, except that collections types are always retained - and `tuple` is always used as the *tuple_factory*. - - .. versionadded:: 21.3.0 - """ - return _astuple( - inst=inst, recurse=recurse, filter=filter, retain_collection_types=True - ) diff --git a/.venv/lib/python3.10/site-packages/attr/_typing_compat.pyi b/.venv/lib/python3.10/site-packages/attr/_typing_compat.pyi deleted file mode 100644 index ca7b71e..0000000 --- a/.venv/lib/python3.10/site-packages/attr/_typing_compat.pyi +++ /dev/null @@ -1,15 +0,0 @@ -from typing import Any, ClassVar, Protocol - -# MYPY is a special constant in mypy which works the same way as `TYPE_CHECKING`. -MYPY = False - -if MYPY: - # A protocol to be able to statically accept an attrs class. - class AttrsInstance_(Protocol): - __attrs_attrs__: ClassVar[Any] - -else: - # For type checkers without plug-in support use an empty protocol that - # will (hopefully) be combined into a union. - class AttrsInstance_(Protocol): - pass diff --git a/.venv/lib/python3.10/site-packages/attr/_version_info.py b/.venv/lib/python3.10/site-packages/attr/_version_info.py deleted file mode 100644 index 51a1312..0000000 --- a/.venv/lib/python3.10/site-packages/attr/_version_info.py +++ /dev/null @@ -1,86 +0,0 @@ -# SPDX-License-Identifier: MIT - - -from functools import total_ordering - -from ._funcs import astuple -from ._make import attrib, attrs - - -@total_ordering -@attrs(eq=False, order=False, slots=True, frozen=True) -class VersionInfo: - """ - A version object that can be compared to tuple of length 1--4: - - >>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2) - True - >>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1) - True - >>> vi = attr.VersionInfo(19, 2, 0, "final") - >>> vi < (19, 1, 1) - False - >>> vi < (19,) - False - >>> vi == (19, 2,) - True - >>> vi == (19, 2, 1) - False - - .. versionadded:: 19.2 - """ - - year = attrib(type=int) - minor = attrib(type=int) - micro = attrib(type=int) - releaselevel = attrib(type=str) - - @classmethod - def _from_version_string(cls, s): - """ - Parse *s* and return a _VersionInfo. - """ - v = s.split(".") - if len(v) == 3: - v.append("final") - - return cls( - year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3] - ) - - def _ensure_tuple(self, other): - """ - Ensure *other* is a tuple of a valid length. - - Returns a possibly transformed *other* and ourselves as a tuple of - the same length as *other*. - """ - - if self.__class__ is other.__class__: - other = astuple(other) - - if not isinstance(other, tuple): - raise NotImplementedError - - if not (1 <= len(other) <= 4): - raise NotImplementedError - - return astuple(self)[: len(other)], other - - def __eq__(self, other): - try: - us, them = self._ensure_tuple(other) - except NotImplementedError: - return NotImplemented - - return us == them - - def __lt__(self, other): - try: - us, them = self._ensure_tuple(other) - except NotImplementedError: - return NotImplemented - - # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't - # have to do anything special with releaselevel for now. - return us < them diff --git a/.venv/lib/python3.10/site-packages/attr/_version_info.pyi b/.venv/lib/python3.10/site-packages/attr/_version_info.pyi deleted file mode 100644 index 45ced08..0000000 --- a/.venv/lib/python3.10/site-packages/attr/_version_info.pyi +++ /dev/null @@ -1,9 +0,0 @@ -class VersionInfo: - @property - def year(self) -> int: ... - @property - def minor(self) -> int: ... - @property - def micro(self) -> int: ... - @property - def releaselevel(self) -> str: ... diff --git a/.venv/lib/python3.10/site-packages/attr/converters.py b/.venv/lib/python3.10/site-packages/attr/converters.py deleted file mode 100644 index 0a79dee..0000000 --- a/.venv/lib/python3.10/site-packages/attr/converters.py +++ /dev/null @@ -1,162 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful converters. -""" - -import typing - -from ._compat import _AnnotationExtractor -from ._make import NOTHING, Converter, Factory, pipe - - -__all__ = [ - "default_if_none", - "optional", - "pipe", - "to_bool", -] - - -def optional(converter): - """ - A converter that allows an attribute to be optional. An optional attribute - is one which can be set to `None`. - - Type annotations will be inferred from the wrapped converter's, if it has - any. - - Args: - converter (typing.Callable): - the converter that is used for non-`None` values. - - .. versionadded:: 17.1.0 - """ - - if isinstance(converter, Converter): - - def optional_converter(val, inst, field): - if val is None: - return None - return converter(val, inst, field) - - else: - - def optional_converter(val): - if val is None: - return None - return converter(val) - - xtr = _AnnotationExtractor(converter) - - t = xtr.get_first_param_type() - if t: - optional_converter.__annotations__["val"] = typing.Optional[t] - - rt = xtr.get_return_type() - if rt: - optional_converter.__annotations__["return"] = typing.Optional[rt] - - if isinstance(converter, Converter): - return Converter(optional_converter, takes_self=True, takes_field=True) - - return optional_converter - - -def default_if_none(default=NOTHING, factory=None): - """ - A converter that allows to replace `None` values by *default* or the result - of *factory*. - - Args: - default: - Value to be used if `None` is passed. Passing an instance of - `attrs.Factory` is supported, however the ``takes_self`` option is - *not*. - - factory (typing.Callable): - A callable that takes no parameters whose result is used if `None` - is passed. - - Raises: - TypeError: If **neither** *default* or *factory* is passed. - - TypeError: If **both** *default* and *factory* are passed. - - ValueError: - If an instance of `attrs.Factory` is passed with - ``takes_self=True``. - - .. versionadded:: 18.2.0 - """ - if default is NOTHING and factory is None: - msg = "Must pass either `default` or `factory`." - raise TypeError(msg) - - if default is not NOTHING and factory is not None: - msg = "Must pass either `default` or `factory` but not both." - raise TypeError(msg) - - if factory is not None: - default = Factory(factory) - - if isinstance(default, Factory): - if default.takes_self: - msg = "`takes_self` is not supported by default_if_none." - raise ValueError(msg) - - def default_if_none_converter(val): - if val is not None: - return val - - return default.factory() - - else: - - def default_if_none_converter(val): - if val is not None: - return val - - return default - - return default_if_none_converter - - -def to_bool(val): - """ - Convert "boolean" strings (for example, from environment variables) to real - booleans. - - Values mapping to `True`: - - - ``True`` - - ``"true"`` / ``"t"`` - - ``"yes"`` / ``"y"`` - - ``"on"`` - - ``"1"`` - - ``1`` - - Values mapping to `False`: - - - ``False`` - - ``"false"`` / ``"f"`` - - ``"no"`` / ``"n"`` - - ``"off"`` - - ``"0"`` - - ``0`` - - Raises: - ValueError: For any other value. - - .. versionadded:: 21.3.0 - """ - if isinstance(val, str): - val = val.lower() - - if val in (True, "true", "t", "yes", "y", "on", "1", 1): - return True - if val in (False, "false", "f", "no", "n", "off", "0", 0): - return False - - msg = f"Cannot convert value to bool: {val!r}" - raise ValueError(msg) diff --git a/.venv/lib/python3.10/site-packages/attr/converters.pyi b/.venv/lib/python3.10/site-packages/attr/converters.pyi deleted file mode 100644 index 12bd0c4..0000000 --- a/.venv/lib/python3.10/site-packages/attr/converters.pyi +++ /dev/null @@ -1,19 +0,0 @@ -from typing import Callable, Any, overload - -from attrs import _ConverterType, _CallableConverterType - -@overload -def pipe(*validators: _CallableConverterType) -> _CallableConverterType: ... -@overload -def pipe(*validators: _ConverterType) -> _ConverterType: ... -@overload -def optional(converter: _CallableConverterType) -> _CallableConverterType: ... -@overload -def optional(converter: _ConverterType) -> _ConverterType: ... -@overload -def default_if_none(default: Any) -> _CallableConverterType: ... -@overload -def default_if_none( - *, factory: Callable[[], Any] -) -> _CallableConverterType: ... -def to_bool(val: str | int | bool) -> bool: ... diff --git a/.venv/lib/python3.10/site-packages/attr/exceptions.py b/.venv/lib/python3.10/site-packages/attr/exceptions.py deleted file mode 100644 index 3b7abb8..0000000 --- a/.venv/lib/python3.10/site-packages/attr/exceptions.py +++ /dev/null @@ -1,95 +0,0 @@ -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from typing import ClassVar - - -class FrozenError(AttributeError): - """ - A frozen/immutable instance or attribute have been attempted to be - modified. - - It mirrors the behavior of ``namedtuples`` by using the same error message - and subclassing `AttributeError`. - - .. versionadded:: 20.1.0 - """ - - msg = "can't set attribute" - args: ClassVar[tuple[str]] = [msg] - - -class FrozenInstanceError(FrozenError): - """ - A frozen instance has been attempted to be modified. - - .. versionadded:: 16.1.0 - """ - - -class FrozenAttributeError(FrozenError): - """ - A frozen attribute has been attempted to be modified. - - .. versionadded:: 20.1.0 - """ - - -class AttrsAttributeNotFoundError(ValueError): - """ - An *attrs* function couldn't find an attribute that the user asked for. - - .. versionadded:: 16.2.0 - """ - - -class NotAnAttrsClassError(ValueError): - """ - A non-*attrs* class has been passed into an *attrs* function. - - .. versionadded:: 16.2.0 - """ - - -class DefaultAlreadySetError(RuntimeError): - """ - A default has been set when defining the field and is attempted to be reset - using the decorator. - - .. versionadded:: 17.1.0 - """ - - -class UnannotatedAttributeError(RuntimeError): - """ - A class with ``auto_attribs=True`` has a field without a type annotation. - - .. versionadded:: 17.3.0 - """ - - -class PythonTooOldError(RuntimeError): - """ - It was attempted to use an *attrs* feature that requires a newer Python - version. - - .. versionadded:: 18.2.0 - """ - - -class NotCallableError(TypeError): - """ - A field requiring a callable has been set with a value that is not - callable. - - .. versionadded:: 19.2.0 - """ - - def __init__(self, msg, value): - super(TypeError, self).__init__(msg, value) - self.msg = msg - self.value = value - - def __str__(self): - return str(self.msg) diff --git a/.venv/lib/python3.10/site-packages/attr/exceptions.pyi b/.venv/lib/python3.10/site-packages/attr/exceptions.pyi deleted file mode 100644 index f268011..0000000 --- a/.venv/lib/python3.10/site-packages/attr/exceptions.pyi +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Any - -class FrozenError(AttributeError): - msg: str = ... - -class FrozenInstanceError(FrozenError): ... -class FrozenAttributeError(FrozenError): ... -class AttrsAttributeNotFoundError(ValueError): ... -class NotAnAttrsClassError(ValueError): ... -class DefaultAlreadySetError(RuntimeError): ... -class UnannotatedAttributeError(RuntimeError): ... -class PythonTooOldError(RuntimeError): ... - -class NotCallableError(TypeError): - msg: str = ... - value: Any = ... - def __init__(self, msg: str, value: Any) -> None: ... diff --git a/.venv/lib/python3.10/site-packages/attr/filters.py b/.venv/lib/python3.10/site-packages/attr/filters.py deleted file mode 100644 index 689b170..0000000 --- a/.venv/lib/python3.10/site-packages/attr/filters.py +++ /dev/null @@ -1,72 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful filters for `attrs.asdict` and `attrs.astuple`. -""" - -from ._make import Attribute - - -def _split_what(what): - """ - Returns a tuple of `frozenset`s of classes and attributes. - """ - return ( - frozenset(cls for cls in what if isinstance(cls, type)), - frozenset(cls for cls in what if isinstance(cls, str)), - frozenset(cls for cls in what if isinstance(cls, Attribute)), - ) - - -def include(*what): - """ - Create a filter that only allows *what*. - - Args: - what (list[type, str, attrs.Attribute]): - What to include. Can be a type, a name, or an attribute. - - Returns: - Callable: - A callable that can be passed to `attrs.asdict`'s and - `attrs.astuple`'s *filter* argument. - - .. versionchanged:: 23.1.0 Accept strings with field names. - """ - cls, names, attrs = _split_what(what) - - def include_(attribute, value): - return ( - value.__class__ in cls - or attribute.name in names - or attribute in attrs - ) - - return include_ - - -def exclude(*what): - """ - Create a filter that does **not** allow *what*. - - Args: - what (list[type, str, attrs.Attribute]): - What to exclude. Can be a type, a name, or an attribute. - - Returns: - Callable: - A callable that can be passed to `attrs.asdict`'s and - `attrs.astuple`'s *filter* argument. - - .. versionchanged:: 23.3.0 Accept field name string as input argument - """ - cls, names, attrs = _split_what(what) - - def exclude_(attribute, value): - return not ( - value.__class__ in cls - or attribute.name in names - or attribute in attrs - ) - - return exclude_ diff --git a/.venv/lib/python3.10/site-packages/attr/filters.pyi b/.venv/lib/python3.10/site-packages/attr/filters.pyi deleted file mode 100644 index 974abdc..0000000 --- a/.venv/lib/python3.10/site-packages/attr/filters.pyi +++ /dev/null @@ -1,6 +0,0 @@ -from typing import Any - -from . import Attribute, _FilterType - -def include(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... -def exclude(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... diff --git a/.venv/lib/python3.10/site-packages/attr/py.typed b/.venv/lib/python3.10/site-packages/attr/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/attr/setters.py b/.venv/lib/python3.10/site-packages/attr/setters.py deleted file mode 100644 index 78b0839..0000000 --- a/.venv/lib/python3.10/site-packages/attr/setters.py +++ /dev/null @@ -1,79 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly used hooks for on_setattr. -""" - -from . import _config -from .exceptions import FrozenAttributeError - - -def pipe(*setters): - """ - Run all *setters* and return the return value of the last one. - - .. versionadded:: 20.1.0 - """ - - def wrapped_pipe(instance, attrib, new_value): - rv = new_value - - for setter in setters: - rv = setter(instance, attrib, rv) - - return rv - - return wrapped_pipe - - -def frozen(_, __, ___): - """ - Prevent an attribute to be modified. - - .. versionadded:: 20.1.0 - """ - raise FrozenAttributeError - - -def validate(instance, attrib, new_value): - """ - Run *attrib*'s validator on *new_value* if it has one. - - .. versionadded:: 20.1.0 - """ - if _config._run_validators is False: - return new_value - - v = attrib.validator - if not v: - return new_value - - v(instance, attrib, new_value) - - return new_value - - -def convert(instance, attrib, new_value): - """ - Run *attrib*'s converter -- if it has one -- on *new_value* and return the - result. - - .. versionadded:: 20.1.0 - """ - c = attrib.converter - if c: - # This can be removed once we drop 3.8 and use attrs.Converter instead. - from ._make import Converter - - if not isinstance(c, Converter): - return c(new_value) - - return c(new_value, instance, attrib) - - return new_value - - -# Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. -# Sphinx's autodata stopped working, so the docstring is inlined in the API -# docs. -NO_OP = object() diff --git a/.venv/lib/python3.10/site-packages/attr/setters.pyi b/.venv/lib/python3.10/site-packages/attr/setters.pyi deleted file mode 100644 index 73abf36..0000000 --- a/.venv/lib/python3.10/site-packages/attr/setters.pyi +++ /dev/null @@ -1,20 +0,0 @@ -from typing import Any, NewType, NoReturn, TypeVar - -from . import Attribute -from attrs import _OnSetAttrType - -_T = TypeVar("_T") - -def frozen( - instance: Any, attribute: Attribute[Any], new_value: Any -) -> NoReturn: ... -def pipe(*setters: _OnSetAttrType) -> _OnSetAttrType: ... -def validate(instance: Any, attribute: Attribute[_T], new_value: _T) -> _T: ... - -# convert is allowed to return Any, because they can be chained using pipe. -def convert( - instance: Any, attribute: Attribute[Any], new_value: Any -) -> Any: ... - -_NoOpType = NewType("_NoOpType", object) -NO_OP: _NoOpType diff --git a/.venv/lib/python3.10/site-packages/attr/validators.py b/.venv/lib/python3.10/site-packages/attr/validators.py deleted file mode 100644 index e7b7552..0000000 --- a/.venv/lib/python3.10/site-packages/attr/validators.py +++ /dev/null @@ -1,710 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful validators. -""" - -import operator -import re - -from contextlib import contextmanager -from re import Pattern - -from ._config import get_run_validators, set_run_validators -from ._make import _AndValidator, and_, attrib, attrs -from .converters import default_if_none -from .exceptions import NotCallableError - - -__all__ = [ - "and_", - "deep_iterable", - "deep_mapping", - "disabled", - "ge", - "get_disabled", - "gt", - "in_", - "instance_of", - "is_callable", - "le", - "lt", - "matches_re", - "max_len", - "min_len", - "not_", - "optional", - "or_", - "set_disabled", -] - - -def set_disabled(disabled): - """ - Globally disable or enable running validators. - - By default, they are run. - - Args: - disabled (bool): If `True`, disable running all validators. - - .. warning:: - - This function is not thread-safe! - - .. versionadded:: 21.3.0 - """ - set_run_validators(not disabled) - - -def get_disabled(): - """ - Return a bool indicating whether validators are currently disabled or not. - - Returns: - bool:`True` if validators are currently disabled. - - .. versionadded:: 21.3.0 - """ - return not get_run_validators() - - -@contextmanager -def disabled(): - """ - Context manager that disables running validators within its context. - - .. warning:: - - This context manager is not thread-safe! - - .. versionadded:: 21.3.0 - """ - set_run_validators(False) - try: - yield - finally: - set_run_validators(True) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _InstanceOfValidator: - type = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not isinstance(value, self.type): - msg = f"'{attr.name}' must be {self.type!r} (got {value!r} that is a {value.__class__!r})." - raise TypeError( - msg, - attr, - self.type, - value, - ) - - def __repr__(self): - return f"" - - -def instance_of(type): - """ - A validator that raises a `TypeError` if the initializer is called with a - wrong type for this particular attribute (checks are performed using - `isinstance` therefore it's also valid to pass a tuple of types). - - Args: - type (type | tuple[type]): The type to check for. - - Raises: - TypeError: - With a human readable error message, the attribute (of type - `attrs.Attribute`), the expected type, and the value it got. - """ - return _InstanceOfValidator(type) - - -@attrs(repr=False, frozen=True, slots=True) -class _MatchesReValidator: - pattern = attrib() - match_func = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not self.match_func(value): - msg = f"'{attr.name}' must match regex {self.pattern.pattern!r} ({value!r} doesn't)" - raise ValueError( - msg, - attr, - self.pattern, - value, - ) - - def __repr__(self): - return f"" - - -def matches_re(regex, flags=0, func=None): - r""" - A validator that raises `ValueError` if the initializer is called with a - string that doesn't match *regex*. - - Args: - regex (str, re.Pattern): - A regex string or precompiled pattern to match against - - flags (int): - Flags that will be passed to the underlying re function (default 0) - - func (typing.Callable): - Which underlying `re` function to call. Valid options are - `re.fullmatch`, `re.search`, and `re.match`; the default `None` - means `re.fullmatch`. For performance reasons, the pattern is - always precompiled using `re.compile`. - - .. versionadded:: 19.2.0 - .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern. - """ - valid_funcs = (re.fullmatch, None, re.search, re.match) - if func not in valid_funcs: - msg = "'func' must be one of {}.".format( - ", ".join( - sorted((e and e.__name__) or "None" for e in set(valid_funcs)) - ) - ) - raise ValueError(msg) - - if isinstance(regex, Pattern): - if flags: - msg = "'flags' can only be used with a string pattern; pass flags to re.compile() instead" - raise TypeError(msg) - pattern = regex - else: - pattern = re.compile(regex, flags) - - if func is re.match: - match_func = pattern.match - elif func is re.search: - match_func = pattern.search - else: - match_func = pattern.fullmatch - - return _MatchesReValidator(pattern, match_func) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _OptionalValidator: - validator = attrib() - - def __call__(self, inst, attr, value): - if value is None: - return - - self.validator(inst, attr, value) - - def __repr__(self): - return f"" - - -def optional(validator): - """ - A validator that makes an attribute optional. An optional attribute is one - which can be set to `None` in addition to satisfying the requirements of - the sub-validator. - - Args: - validator - (typing.Callable | tuple[typing.Callable] | list[typing.Callable]): - A validator (or validators) that is used for non-`None` values. - - .. versionadded:: 15.1.0 - .. versionchanged:: 17.1.0 *validator* can be a list of validators. - .. versionchanged:: 23.1.0 *validator* can also be a tuple of validators. - """ - if isinstance(validator, (list, tuple)): - return _OptionalValidator(_AndValidator(validator)) - - return _OptionalValidator(validator) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _InValidator: - options = attrib() - _original_options = attrib(hash=False) - - def __call__(self, inst, attr, value): - try: - in_options = value in self.options - except TypeError: # e.g. `1 in "abc"` - in_options = False - - if not in_options: - msg = f"'{attr.name}' must be in {self._original_options!r} (got {value!r})" - raise ValueError( - msg, - attr, - self._original_options, - value, - ) - - def __repr__(self): - return f"" - - -def in_(options): - """ - A validator that raises a `ValueError` if the initializer is called with a - value that does not belong in the *options* provided. - - The check is performed using ``value in options``, so *options* has to - support that operation. - - To keep the validator hashable, dicts, lists, and sets are transparently - transformed into a `tuple`. - - Args: - options: Allowed options. - - Raises: - ValueError: - With a human readable error message, the attribute (of type - `attrs.Attribute`), the expected options, and the value it got. - - .. versionadded:: 17.1.0 - .. versionchanged:: 22.1.0 - The ValueError was incomplete until now and only contained the human - readable error message. Now it contains all the information that has - been promised since 17.1.0. - .. versionchanged:: 24.1.0 - *options* that are a list, dict, or a set are now transformed into a - tuple to keep the validator hashable. - """ - repr_options = options - if isinstance(options, (list, dict, set)): - options = tuple(options) - - return _InValidator(options, repr_options) - - -@attrs(repr=False, slots=False, unsafe_hash=True) -class _IsCallableValidator: - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not callable(value): - message = ( - "'{name}' must be callable " - "(got {value!r} that is a {actual!r})." - ) - raise NotCallableError( - msg=message.format( - name=attr.name, value=value, actual=value.__class__ - ), - value=value, - ) - - def __repr__(self): - return "" - - -def is_callable(): - """ - A validator that raises a `attrs.exceptions.NotCallableError` if the - initializer is called with a value for this particular attribute that is - not callable. - - .. versionadded:: 19.1.0 - - Raises: - attrs.exceptions.NotCallableError: - With a human readable error message containing the attribute - (`attrs.Attribute`) name, and the value it got. - """ - return _IsCallableValidator() - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _DeepIterable: - member_validator = attrib(validator=is_callable()) - iterable_validator = attrib( - default=None, validator=optional(is_callable()) - ) - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if self.iterable_validator is not None: - self.iterable_validator(inst, attr, value) - - for member in value: - self.member_validator(inst, attr, member) - - def __repr__(self): - iterable_identifier = ( - "" - if self.iterable_validator is None - else f" {self.iterable_validator!r}" - ) - return ( - f"" - ) - - -def deep_iterable(member_validator, iterable_validator=None): - """ - A validator that performs deep validation of an iterable. - - Args: - member_validator: Validator to apply to iterable members. - - iterable_validator: - Validator to apply to iterable itself (optional). - - Raises - TypeError: if any sub-validators fail - - .. versionadded:: 19.1.0 - """ - if isinstance(member_validator, (list, tuple)): - member_validator = and_(*member_validator) - return _DeepIterable(member_validator, iterable_validator) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _DeepMapping: - key_validator = attrib(validator=is_callable()) - value_validator = attrib(validator=is_callable()) - mapping_validator = attrib(default=None, validator=optional(is_callable())) - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if self.mapping_validator is not None: - self.mapping_validator(inst, attr, value) - - for key in value: - self.key_validator(inst, attr, key) - self.value_validator(inst, attr, value[key]) - - def __repr__(self): - return f"" - - -def deep_mapping(key_validator, value_validator, mapping_validator=None): - """ - A validator that performs deep validation of a dictionary. - - Args: - key_validator: Validator to apply to dictionary keys. - - value_validator: Validator to apply to dictionary values. - - mapping_validator: - Validator to apply to top-level mapping attribute (optional). - - .. versionadded:: 19.1.0 - - Raises: - TypeError: if any sub-validators fail - """ - return _DeepMapping(key_validator, value_validator, mapping_validator) - - -@attrs(repr=False, frozen=True, slots=True) -class _NumberValidator: - bound = attrib() - compare_op = attrib() - compare_func = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not self.compare_func(value, self.bound): - msg = f"'{attr.name}' must be {self.compare_op} {self.bound}: {value}" - raise ValueError(msg) - - def __repr__(self): - return f"" - - -def lt(val): - """ - A validator that raises `ValueError` if the initializer is called with a - number larger or equal to *val*. - - The validator uses `operator.lt` to compare the values. - - Args: - val: Exclusive upper bound for values. - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, "<", operator.lt) - - -def le(val): - """ - A validator that raises `ValueError` if the initializer is called with a - number greater than *val*. - - The validator uses `operator.le` to compare the values. - - Args: - val: Inclusive upper bound for values. - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, "<=", operator.le) - - -def ge(val): - """ - A validator that raises `ValueError` if the initializer is called with a - number smaller than *val*. - - The validator uses `operator.ge` to compare the values. - - Args: - val: Inclusive lower bound for values - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, ">=", operator.ge) - - -def gt(val): - """ - A validator that raises `ValueError` if the initializer is called with a - number smaller or equal to *val*. - - The validator uses `operator.ge` to compare the values. - - Args: - val: Exclusive lower bound for values - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, ">", operator.gt) - - -@attrs(repr=False, frozen=True, slots=True) -class _MaxLengthValidator: - max_length = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if len(value) > self.max_length: - msg = f"Length of '{attr.name}' must be <= {self.max_length}: {len(value)}" - raise ValueError(msg) - - def __repr__(self): - return f"" - - -def max_len(length): - """ - A validator that raises `ValueError` if the initializer is called - with a string or iterable that is longer than *length*. - - Args: - length (int): Maximum length of the string or iterable - - .. versionadded:: 21.3.0 - """ - return _MaxLengthValidator(length) - - -@attrs(repr=False, frozen=True, slots=True) -class _MinLengthValidator: - min_length = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if len(value) < self.min_length: - msg = f"Length of '{attr.name}' must be >= {self.min_length}: {len(value)}" - raise ValueError(msg) - - def __repr__(self): - return f"" - - -def min_len(length): - """ - A validator that raises `ValueError` if the initializer is called - with a string or iterable that is shorter than *length*. - - Args: - length (int): Minimum length of the string or iterable - - .. versionadded:: 22.1.0 - """ - return _MinLengthValidator(length) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _SubclassOfValidator: - type = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not issubclass(value, self.type): - msg = f"'{attr.name}' must be a subclass of {self.type!r} (got {value!r})." - raise TypeError( - msg, - attr, - self.type, - value, - ) - - def __repr__(self): - return f"" - - -def _subclass_of(type): - """ - A validator that raises a `TypeError` if the initializer is called with a - wrong type for this particular attribute (checks are performed using - `issubclass` therefore it's also valid to pass a tuple of types). - - Args: - type (type | tuple[type, ...]): The type(s) to check for. - - Raises: - TypeError: - With a human readable error message, the attribute (of type - `attrs.Attribute`), the expected type, and the value it got. - """ - return _SubclassOfValidator(type) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _NotValidator: - validator = attrib() - msg = attrib( - converter=default_if_none( - "not_ validator child '{validator!r}' " - "did not raise a captured error" - ) - ) - exc_types = attrib( - validator=deep_iterable( - member_validator=_subclass_of(Exception), - iterable_validator=instance_of(tuple), - ), - ) - - def __call__(self, inst, attr, value): - try: - self.validator(inst, attr, value) - except self.exc_types: - pass # suppress error to invert validity - else: - raise ValueError( - self.msg.format( - validator=self.validator, - exc_types=self.exc_types, - ), - attr, - self.validator, - value, - self.exc_types, - ) - - def __repr__(self): - return f"" - - -def not_(validator, *, msg=None, exc_types=(ValueError, TypeError)): - """ - A validator that wraps and logically 'inverts' the validator passed to it. - It will raise a `ValueError` if the provided validator *doesn't* raise a - `ValueError` or `TypeError` (by default), and will suppress the exception - if the provided validator *does*. - - Intended to be used with existing validators to compose logic without - needing to create inverted variants, for example, ``not_(in_(...))``. - - Args: - validator: A validator to be logically inverted. - - msg (str): - Message to raise if validator fails. Formatted with keys - ``exc_types`` and ``validator``. - - exc_types (tuple[type, ...]): - Exception type(s) to capture. Other types raised by child - validators will not be intercepted and pass through. - - Raises: - ValueError: - With a human readable error message, the attribute (of type - `attrs.Attribute`), the validator that failed to raise an - exception, the value it got, and the expected exception types. - - .. versionadded:: 22.2.0 - """ - try: - exc_types = tuple(exc_types) - except TypeError: - exc_types = (exc_types,) - return _NotValidator(validator, msg, exc_types) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _OrValidator: - validators = attrib() - - def __call__(self, inst, attr, value): - for v in self.validators: - try: - v(inst, attr, value) - except Exception: # noqa: BLE001, PERF203, S112 - continue - else: - return - - msg = f"None of {self.validators!r} satisfied for value {value!r}" - raise ValueError(msg) - - def __repr__(self): - return f"" - - -def or_(*validators): - """ - A validator that composes multiple validators into one. - - When called on a value, it runs all wrapped validators until one of them is - satisfied. - - Args: - validators (~collections.abc.Iterable[typing.Callable]): - Arbitrary number of validators. - - Raises: - ValueError: - If no validator is satisfied. Raised with a human-readable error - message listing all the wrapped validators and the value that - failed all of them. - - .. versionadded:: 24.1.0 - """ - vals = [] - for v in validators: - vals.extend(v.validators if isinstance(v, _OrValidator) else [v]) - - return _OrValidator(tuple(vals)) diff --git a/.venv/lib/python3.10/site-packages/attr/validators.pyi b/.venv/lib/python3.10/site-packages/attr/validators.pyi deleted file mode 100644 index a0fdda7..0000000 --- a/.venv/lib/python3.10/site-packages/attr/validators.pyi +++ /dev/null @@ -1,86 +0,0 @@ -from types import UnionType -from typing import ( - Any, - AnyStr, - Callable, - Container, - ContextManager, - Iterable, - Mapping, - Match, - Pattern, - TypeVar, - overload, -) - -from attrs import _ValidatorType -from attrs import _ValidatorArgType - -_T = TypeVar("_T") -_T1 = TypeVar("_T1") -_T2 = TypeVar("_T2") -_T3 = TypeVar("_T3") -_I = TypeVar("_I", bound=Iterable) -_K = TypeVar("_K") -_V = TypeVar("_V") -_M = TypeVar("_M", bound=Mapping) - -def set_disabled(run: bool) -> None: ... -def get_disabled() -> bool: ... -def disabled() -> ContextManager[None]: ... - -# To be more precise on instance_of use some overloads. -# If there are more than 3 items in the tuple then we fall back to Any -@overload -def instance_of(type: type[_T]) -> _ValidatorType[_T]: ... -@overload -def instance_of(type: tuple[type[_T]]) -> _ValidatorType[_T]: ... -@overload -def instance_of( - type: tuple[type[_T1], type[_T2]], -) -> _ValidatorType[_T1 | _T2]: ... -@overload -def instance_of( - type: tuple[type[_T1], type[_T2], type[_T3]], -) -> _ValidatorType[_T1 | _T2 | _T3]: ... -@overload -def instance_of(type: tuple[type, ...]) -> _ValidatorType[Any]: ... -@overload -def instance_of(type: UnionType) -> _ValidatorType[Any]: ... -def optional( - validator: ( - _ValidatorType[_T] - | list[_ValidatorType[_T]] - | tuple[_ValidatorType[_T]] - ), -) -> _ValidatorType[_T | None]: ... -def in_(options: Container[_T]) -> _ValidatorType[_T]: ... -def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... -def matches_re( - regex: Pattern[AnyStr] | AnyStr, - flags: int = ..., - func: Callable[[AnyStr, AnyStr, int], Match[AnyStr] | None] | None = ..., -) -> _ValidatorType[AnyStr]: ... -def deep_iterable( - member_validator: _ValidatorArgType[_T], - iterable_validator: _ValidatorType[_I] | None = ..., -) -> _ValidatorType[_I]: ... -def deep_mapping( - key_validator: _ValidatorType[_K], - value_validator: _ValidatorType[_V], - mapping_validator: _ValidatorType[_M] | None = ..., -) -> _ValidatorType[_M]: ... -def is_callable() -> _ValidatorType[_T]: ... -def lt(val: _T) -> _ValidatorType[_T]: ... -def le(val: _T) -> _ValidatorType[_T]: ... -def ge(val: _T) -> _ValidatorType[_T]: ... -def gt(val: _T) -> _ValidatorType[_T]: ... -def max_len(length: int) -> _ValidatorType[_T]: ... -def min_len(length: int) -> _ValidatorType[_T]: ... -def not_( - validator: _ValidatorType[_T], - *, - msg: str | None = None, - exc_types: type[Exception] | Iterable[type[Exception]] = ..., -) -> _ValidatorType[_T]: ... -def or_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... diff --git a/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/METADATA b/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/METADATA deleted file mode 100644 index 029afee..0000000 --- a/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/METADATA +++ /dev/null @@ -1,232 +0,0 @@ -Metadata-Version: 2.4 -Name: attrs -Version: 25.3.0 -Summary: Classes Without Boilerplate -Project-URL: Documentation, https://www.attrs.org/ -Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html -Project-URL: GitHub, https://github.com/python-attrs/attrs -Project-URL: Funding, https://github.com/sponsors/hynek -Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi -Author-email: Hynek Schlawack -License-Expression: MIT -License-File: LICENSE -Keywords: attribute,boilerplate,class -Classifier: Development Status :: 5 - Production/Stable -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Typing :: Typed -Requires-Python: >=3.8 -Provides-Extra: benchmark -Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'benchmark' -Requires-Dist: hypothesis; extra == 'benchmark' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'benchmark' -Requires-Dist: pympler; extra == 'benchmark' -Requires-Dist: pytest-codspeed; extra == 'benchmark' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'benchmark' -Requires-Dist: pytest-xdist[psutil]; extra == 'benchmark' -Requires-Dist: pytest>=4.3.0; extra == 'benchmark' -Provides-Extra: cov -Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'cov' -Requires-Dist: coverage[toml]>=5.3; extra == 'cov' -Requires-Dist: hypothesis; extra == 'cov' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'cov' -Requires-Dist: pympler; extra == 'cov' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'cov' -Requires-Dist: pytest-xdist[psutil]; extra == 'cov' -Requires-Dist: pytest>=4.3.0; extra == 'cov' -Provides-Extra: dev -Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'dev' -Requires-Dist: hypothesis; extra == 'dev' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'dev' -Requires-Dist: pre-commit-uv; extra == 'dev' -Requires-Dist: pympler; extra == 'dev' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'dev' -Requires-Dist: pytest-xdist[psutil]; extra == 'dev' -Requires-Dist: pytest>=4.3.0; extra == 'dev' -Provides-Extra: docs -Requires-Dist: cogapp; extra == 'docs' -Requires-Dist: furo; extra == 'docs' -Requires-Dist: myst-parser; extra == 'docs' -Requires-Dist: sphinx; extra == 'docs' -Requires-Dist: sphinx-notfound-page; extra == 'docs' -Requires-Dist: sphinxcontrib-towncrier; extra == 'docs' -Requires-Dist: towncrier; extra == 'docs' -Provides-Extra: tests -Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests' -Requires-Dist: hypothesis; extra == 'tests' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests' -Requires-Dist: pympler; extra == 'tests' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests' -Requires-Dist: pytest-xdist[psutil]; extra == 'tests' -Requires-Dist: pytest>=4.3.0; extra == 'tests' -Provides-Extra: tests-mypy -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests-mypy' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests-mypy' -Description-Content-Type: text/markdown - -

- - attrs - -

- - -*attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)). -[Trusted by NASA](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-achievement) for Mars missions since 2020! - -Its main goal is to help you to write **concise** and **correct** software without slowing down your code. - - -## Sponsors - -*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek). -Especially those generously supporting us at the *The Organization* tier and higher: - - - -

- - - - - - - - - - - -

- - - -

- Please consider joining them to help make attrs’s maintenance more sustainable! -

- - - -## Example - -*attrs* gives you a class decorator and a way to declaratively define the attributes on that class: - - - -```pycon ->>> from attrs import asdict, define, make_class, Factory - ->>> @define -... class SomeClass: -... a_number: int = 42 -... list_of_numbers: list[int] = Factory(list) -... -... def hard_math(self, another_number): -... return self.a_number + sum(self.list_of_numbers) * another_number - - ->>> sc = SomeClass(1, [1, 2, 3]) ->>> sc -SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) - ->>> sc.hard_math(3) -19 ->>> sc == SomeClass(1, [1, 2, 3]) -True ->>> sc != SomeClass(2, [3, 2, 1]) -True - ->>> asdict(sc) -{'a_number': 1, 'list_of_numbers': [1, 2, 3]} - ->>> SomeClass() -SomeClass(a_number=42, list_of_numbers=[]) - ->>> C = make_class("C", ["a", "b"]) ->>> C("foo", "bar") -C(a='foo', b='bar') -``` - -After *declaring* your attributes, *attrs* gives you: - -- a concise and explicit overview of the class's attributes, -- a nice human-readable `__repr__`, -- equality-checking methods, -- an initializer, -- and much more, - -*without* writing dull boilerplate code again and again and *without* runtime performance penalties. - ---- - -This example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0. -The classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**. - -Check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation! - - -### Hate Type Annotations!? - -No problem! -Types are entirely **optional** with *attrs*. -Simply assign `attrs.field()` to the attributes instead of annotating them with types: - -```python -from attrs import define, field - -@define -class SomeClass: - a_number = field(default=42) - list_of_numbers = field(factory=list) -``` - - -## Data Classes - -On the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*). -In practice it does a lot more and is more flexible. -For instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger. - -For more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice. - - -## Project Information - -- [**Changelog**](https://www.attrs.org/en/stable/changelog.html) -- [**Documentation**](https://www.attrs.org/) -- [**PyPI**](https://pypi.org/project/attrs/) -- [**Source Code**](https://github.com/python-attrs/attrs) -- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md) -- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs) -- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs) - - -### *attrs* for Enterprise - -Available as part of the [Tidelift Subscription](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek). - -The maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. -Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. - -## Release Information - -### Changes - -- Restore support for generator-based `field_transformer`s. - [#1417](https://github.com/python-attrs/attrs/issues/1417) - - - ---- - -[Full changelog →](https://www.attrs.org/en/stable/changelog.html) diff --git a/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/RECORD b/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/RECORD deleted file mode 100644 index 727b55b..0000000 --- a/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/RECORD +++ /dev/null @@ -1,55 +0,0 @@ -attr/__init__.py,sha256=fOYIvt1eGSqQre4uCS3sJWKZ0mwAuC8UD6qba5OS9_U,2057 -attr/__init__.pyi,sha256=QIXnnHPoucmDWkbpNsWTP-cgJ1bn8le7DjyRa_wYdew,11281 -attr/__pycache__/__init__.cpython-310.pyc,, -attr/__pycache__/_cmp.cpython-310.pyc,, -attr/__pycache__/_compat.cpython-310.pyc,, -attr/__pycache__/_config.cpython-310.pyc,, -attr/__pycache__/_funcs.cpython-310.pyc,, -attr/__pycache__/_make.cpython-310.pyc,, -attr/__pycache__/_next_gen.cpython-310.pyc,, -attr/__pycache__/_version_info.cpython-310.pyc,, -attr/__pycache__/converters.cpython-310.pyc,, -attr/__pycache__/exceptions.cpython-310.pyc,, -attr/__pycache__/filters.cpython-310.pyc,, -attr/__pycache__/setters.cpython-310.pyc,, -attr/__pycache__/validators.cpython-310.pyc,, -attr/_cmp.py,sha256=3Nn1TjxllUYiX_nJoVnEkXoDk0hM1DYKj5DE7GZe4i0,4117 -attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368 -attr/_compat.py,sha256=4hlXbWhdDjQCDK6FKF1EgnZ3POiHgtpp54qE0nxaGHg,2704 -attr/_config.py,sha256=dGq3xR6fgZEF6UBt_L0T-eUHIB4i43kRmH0P28sJVw8,843 -attr/_funcs.py,sha256=5-tUKJtp3h5El55EcDl6GWXFp68fT8D8U7uCRN6497I,15854 -attr/_make.py,sha256=lBUPPmxiA1BeHzB6OlHoCEh--tVvM1ozXO8eXOa6g4c,96664 -attr/_next_gen.py,sha256=7FRkbtl_N017SuBhf_Vw3mw2c2pGZhtCGOzadgz7tp4,24395 -attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 -attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 -attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 -attr/converters.py,sha256=GlDeOzPeTFgeBBLbj9G57Ez5lAk68uhSALRYJ_exe84,3861 -attr/converters.pyi,sha256=orU2bff-VjQa2kMDyvnMQV73oJT2WRyQuw4ZR1ym1bE,643 -attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 -attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 -attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795 -attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208 -attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attr/setters.py,sha256=5-dcT63GQK35ONEzSgfXCkbB7pPkaR-qv15mm4PVSzQ,1617 -attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584 -attr/validators.py,sha256=WaB1HLAHHqRHWsrv_K9H-sJ7ESil3H3Cmv2d8TtVZx4,20046 -attr/validators.pyi,sha256=s2WhKPqskxbsckJfKk8zOuuB088GfgpyxcCYSNFLqNU,2603 -attrs-25.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -attrs-25.3.0.dist-info/METADATA,sha256=W38cREj7s1wqNf1fg4hVwZmL1xh0AdSp4IhtTMROinw,10993 -attrs-25.3.0.dist-info/RECORD,, -attrs-25.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 -attrs-25.3.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 -attrs/__init__.py,sha256=qeQJZ4O08yczSn840v9bYOaZyRE81WsVi-QCrY3krCU,1107 -attrs/__init__.pyi,sha256=nZmInocjM7tHV4AQw0vxO_fo6oJjL_PonlV9zKKW8DY,7931 -attrs/__pycache__/__init__.cpython-310.pyc,, -attrs/__pycache__/converters.cpython-310.pyc,, -attrs/__pycache__/exceptions.cpython-310.pyc,, -attrs/__pycache__/filters.cpython-310.pyc,, -attrs/__pycache__/setters.cpython-310.pyc,, -attrs/__pycache__/validators.cpython-310.pyc,, -attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 -attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 -attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 -attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 -attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/WHEEL deleted file mode 100644 index 12228d4..0000000 --- a/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.27.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/licenses/LICENSE b/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/licenses/LICENSE deleted file mode 100644 index 2bd6453..0000000 --- a/.venv/lib/python3.10/site-packages/attrs-25.3.0.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Hynek Schlawack and the attrs contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/attrs/__init__.py b/.venv/lib/python3.10/site-packages/attrs/__init__.py deleted file mode 100644 index e8023ff..0000000 --- a/.venv/lib/python3.10/site-packages/attrs/__init__.py +++ /dev/null @@ -1,69 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr import ( - NOTHING, - Attribute, - AttrsInstance, - Converter, - Factory, - NothingType, - _make_getattr, - assoc, - cmp_using, - define, - evolve, - field, - fields, - fields_dict, - frozen, - has, - make_class, - mutable, - resolve_types, - validate, -) -from attr._next_gen import asdict, astuple - -from . import converters, exceptions, filters, setters, validators - - -__all__ = [ - "NOTHING", - "Attribute", - "AttrsInstance", - "Converter", - "Factory", - "NothingType", - "__author__", - "__copyright__", - "__description__", - "__doc__", - "__email__", - "__license__", - "__title__", - "__url__", - "__version__", - "__version_info__", - "asdict", - "assoc", - "astuple", - "cmp_using", - "converters", - "define", - "evolve", - "exceptions", - "field", - "fields", - "fields_dict", - "filters", - "frozen", - "has", - "make_class", - "mutable", - "resolve_types", - "setters", - "validate", - "validators", -] - -__getattr__ = _make_getattr(__name__) diff --git a/.venv/lib/python3.10/site-packages/attrs/__init__.pyi b/.venv/lib/python3.10/site-packages/attrs/__init__.pyi deleted file mode 100644 index 648fa7a..0000000 --- a/.venv/lib/python3.10/site-packages/attrs/__init__.pyi +++ /dev/null @@ -1,263 +0,0 @@ -import sys - -from typing import ( - Any, - Callable, - Mapping, - Sequence, - overload, - TypeVar, -) - -# Because we need to type our own stuff, we have to make everything from -# attr explicitly public too. -from attr import __author__ as __author__ -from attr import __copyright__ as __copyright__ -from attr import __description__ as __description__ -from attr import __email__ as __email__ -from attr import __license__ as __license__ -from attr import __title__ as __title__ -from attr import __url__ as __url__ -from attr import __version__ as __version__ -from attr import __version_info__ as __version_info__ -from attr import assoc as assoc -from attr import Attribute as Attribute -from attr import AttrsInstance as AttrsInstance -from attr import cmp_using as cmp_using -from attr import converters as converters -from attr import Converter as Converter -from attr import evolve as evolve -from attr import exceptions as exceptions -from attr import Factory as Factory -from attr import fields as fields -from attr import fields_dict as fields_dict -from attr import filters as filters -from attr import has as has -from attr import make_class as make_class -from attr import NOTHING as NOTHING -from attr import resolve_types as resolve_types -from attr import setters as setters -from attr import validate as validate -from attr import validators as validators -from attr import attrib, asdict as asdict, astuple as astuple -from attr import NothingType as NothingType - -if sys.version_info >= (3, 11): - from typing import dataclass_transform -else: - from typing_extensions import dataclass_transform - -_T = TypeVar("_T") -_C = TypeVar("_C", bound=type) - -_EqOrderType = bool | Callable[[Any], Any] -_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] -_CallableConverterType = Callable[[Any], Any] -_ConverterType = _CallableConverterType | Converter[Any, Any] -_ReprType = Callable[[Any], str] -_ReprArgType = bool | _ReprType -_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] -_OnSetAttrArgType = _OnSetAttrType | list[_OnSetAttrType] | setters._NoOpType -_FieldTransformer = Callable[ - [type, list["Attribute[Any]"]], list["Attribute[Any]"] -] -# FIXME: in reality, if multiple validators are passed they must be in a list -# or tuple, but those are invariant and so would prevent subtypes of -# _ValidatorType from working when passed in a list or tuple. -_ValidatorArgType = _ValidatorType[_T] | Sequence[_ValidatorType[_T]] - -@overload -def field( - *, - default: None = ..., - validator: None = ..., - repr: _ReprArgType = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - converter: None = ..., - factory: None = ..., - kw_only: bool = ..., - eq: bool | None = ..., - order: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., - type: type | None = ..., -) -> Any: ... - -# This form catches an explicit None or no default and infers the type from the -# other arguments. -@overload -def field( - *, - default: None = ..., - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., - type: type | None = ..., -) -> _T: ... - -# This form catches an explicit default argument. -@overload -def field( - *, - default: _T, - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., - type: type | None = ..., -) -> _T: ... - -# This form covers type=non-Type: e.g. forward references (str), Any -@overload -def field( - *, - default: _T | None = ..., - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., - type: type | None = ..., -) -> Any: ... -@overload -@dataclass_transform(field_specifiers=(attrib, field)) -def define( - maybe_cls: _C, - *, - these: dict[str, Any] | None = ..., - repr: bool = ..., - unsafe_hash: bool | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: bool | None = ..., - order: bool | None = ..., - auto_detect: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., -) -> _C: ... -@overload -@dataclass_transform(field_specifiers=(attrib, field)) -def define( - maybe_cls: None = ..., - *, - these: dict[str, Any] | None = ..., - repr: bool = ..., - unsafe_hash: bool | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: bool | None = ..., - order: bool | None = ..., - auto_detect: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., -) -> Callable[[_C], _C]: ... - -mutable = define - -@overload -@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) -def frozen( - maybe_cls: _C, - *, - these: dict[str, Any] | None = ..., - repr: bool = ..., - unsafe_hash: bool | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: bool | None = ..., - order: bool | None = ..., - auto_detect: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., -) -> _C: ... -@overload -@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) -def frozen( - maybe_cls: None = ..., - *, - these: dict[str, Any] | None = ..., - repr: bool = ..., - unsafe_hash: bool | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: bool | None = ..., - order: bool | None = ..., - auto_detect: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., -) -> Callable[[_C], _C]: ... diff --git a/.venv/lib/python3.10/site-packages/attrs/converters.py b/.venv/lib/python3.10/site-packages/attrs/converters.py deleted file mode 100644 index 7821f6c..0000000 --- a/.venv/lib/python3.10/site-packages/attrs/converters.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr.converters import * # noqa: F403 diff --git a/.venv/lib/python3.10/site-packages/attrs/exceptions.py b/.venv/lib/python3.10/site-packages/attrs/exceptions.py deleted file mode 100644 index 3323f9d..0000000 --- a/.venv/lib/python3.10/site-packages/attrs/exceptions.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr.exceptions import * # noqa: F403 diff --git a/.venv/lib/python3.10/site-packages/attrs/filters.py b/.venv/lib/python3.10/site-packages/attrs/filters.py deleted file mode 100644 index 3080f48..0000000 --- a/.venv/lib/python3.10/site-packages/attrs/filters.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr.filters import * # noqa: F403 diff --git a/.venv/lib/python3.10/site-packages/attrs/py.typed b/.venv/lib/python3.10/site-packages/attrs/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/attrs/setters.py b/.venv/lib/python3.10/site-packages/attrs/setters.py deleted file mode 100644 index f3d73bb..0000000 --- a/.venv/lib/python3.10/site-packages/attrs/setters.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr.setters import * # noqa: F403 diff --git a/.venv/lib/python3.10/site-packages/attrs/validators.py b/.venv/lib/python3.10/site-packages/attrs/validators.py deleted file mode 100644 index 037e124..0000000 --- a/.venv/lib/python3.10/site-packages/attrs/validators.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr.validators import * # noqa: F403 diff --git a/.venv/lib/python3.10/site-packages/corsheaders/__init__.py b/.venv/lib/python3.10/site-packages/corsheaders/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/corsheaders/apps.py b/.venv/lib/python3.10/site-packages/corsheaders/apps.py deleted file mode 100644 index 0692d19..0000000 --- a/.venv/lib/python3.10/site-packages/corsheaders/apps.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import annotations - -from django.apps import AppConfig -from django.core.checks import Tags -from django.core.checks import register - -from corsheaders.checks import check_settings - - -class CorsHeadersAppConfig(AppConfig): - name = "corsheaders" - verbose_name = "django-cors-headers" - - def ready(self) -> None: - register(Tags.security)(check_settings) diff --git a/.venv/lib/python3.10/site-packages/corsheaders/checks.py b/.venv/lib/python3.10/site-packages/corsheaders/checks.py deleted file mode 100644 index d25dc5f..0000000 --- a/.venv/lib/python3.10/site-packages/corsheaders/checks.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import annotations - -import re -from collections.abc import Sequence -from typing import Any -from urllib.parse import urlsplit - -from django.conf import settings -from django.core.checks import CheckMessage -from django.core.checks import Error - -from corsheaders.conf import conf - -re_type = type(re.compile("")) - - -def check_settings(**kwargs: Any) -> list[CheckMessage]: - errors: list[CheckMessage] = [] - - if not is_sequence(conf.CORS_ALLOW_HEADERS, str): - errors.append( - Error( - "CORS_ALLOW_HEADERS should be a sequence of strings.", - id="corsheaders.E001", - ) - ) - - if not is_sequence(conf.CORS_ALLOW_METHODS, str): - errors.append( - Error( - "CORS_ALLOW_METHODS should be a sequence of strings.", - id="corsheaders.E002", - ) - ) - - if not isinstance(conf.CORS_ALLOW_CREDENTIALS, bool): - errors.append( # type: ignore [unreachable] - Error("CORS_ALLOW_CREDENTIALS should be a bool.", id="corsheaders.E003") - ) - - if not isinstance(conf.CORS_ALLOW_PRIVATE_NETWORK, bool): - errors.append( # type: ignore [unreachable] - Error( - "CORS_ALLOW_PRIVATE_NETWORK should be a bool.", - id="corsheaders.E015", - ) - ) - - if ( - not isinstance(conf.CORS_PREFLIGHT_MAX_AGE, int) # type: ignore [redundant-expr] - or conf.CORS_PREFLIGHT_MAX_AGE < 0 - ): - errors.append( - Error( - ( - "CORS_PREFLIGHT_MAX_AGE should be an integer greater than " - + "or equal to zero." - ), - id="corsheaders.E004", - ) - ) - - if not isinstance(conf.CORS_ALLOW_ALL_ORIGINS, bool): - if hasattr(settings, "CORS_ALLOW_ALL_ORIGINS"): # type: ignore [unreachable] - allow_all_alias = "CORS_ALLOW_ALL_ORIGINS" - else: - allow_all_alias = "CORS_ORIGIN_ALLOW_ALL" - errors.append( - Error( - f"{allow_all_alias} should be a bool.", - id="corsheaders.E005", - ) - ) - - if hasattr(settings, "CORS_ALLOWED_ORIGINS"): - allowed_origins_alias = "CORS_ALLOWED_ORIGINS" - else: - allowed_origins_alias = "CORS_ORIGIN_WHITELIST" - - if not is_sequence(conf.CORS_ALLOWED_ORIGINS, str): - errors.append( - Error( - f"{allowed_origins_alias} should be a sequence of strings.", - id="corsheaders.E006", - ) - ) - else: - special_origin_values = ( - # From 'security sensitive' contexts - "null", - # From files on Chrome on Android - # https://bugs.chromium.org/p/chromium/issues/detail?id=991107 - "file://", - ) - for origin in conf.CORS_ALLOWED_ORIGINS: - if origin in special_origin_values: - continue - parsed = urlsplit(origin) - if parsed.scheme == "" or parsed.netloc == "": - errors.append( - Error( - "Origin {} in {} is missing scheme or netloc".format( - repr(origin), allowed_origins_alias - ), - id="corsheaders.E013", - hint=( - "Add a scheme (e.g. https://) or netloc (e.g. " - + "example.com)." - ), - ) - ) - else: - # Only do this check in this case because if the scheme is not - # provided, netloc ends up in path - for part in ("path", "query", "fragment"): - if getattr(parsed, part) != "": - errors.append( - Error( - "Origin {} in {} should not have {}".format( - repr(origin), allowed_origins_alias, part - ), - id="corsheaders.E014", - ) - ) - - if hasattr(settings, "CORS_ALLOWED_ORIGIN_REGEXES"): - allowed_regexes_alias = "CORS_ALLOWED_ORIGIN_REGEXES" - else: - allowed_regexes_alias = "CORS_ORIGIN_REGEX_WHITELIST" - if not is_sequence(conf.CORS_ALLOWED_ORIGIN_REGEXES, (str, re_type)): - errors.append( - Error( - "{} should be a sequence of strings and/or compiled regexes.".format( - allowed_regexes_alias - ), - id="corsheaders.E007", - ) - ) - - if not is_sequence(conf.CORS_EXPOSE_HEADERS, str): - errors.append( - Error("CORS_EXPOSE_HEADERS should be a sequence.", id="corsheaders.E008") - ) - - if not isinstance(conf.CORS_URLS_REGEX, (str, re_type)): - errors.append( - Error("CORS_URLS_REGEX should be a string or regex.", id="corsheaders.E009") - ) - - if hasattr(settings, "CORS_MODEL"): - errors.append( - Error( - ( - "The CORS_MODEL setting has been removed - see " - + "django-cors-headers' HISTORY." - ), - id="corsheaders.E012", - ) - ) - - if hasattr(settings, "CORS_REPLACE_HTTPS_REFERER"): - errors.append( - Error( - ( - "The CORS_REPLACE_HTTPS_REFERER setting has been removed" - + " - see django-cors-headers' CHANGELOG." - ), - id="corsheaders.E013", - ) - ) - - return errors - - -def is_sequence(thing: Any, type_or_types: type[Any] | tuple[type[Any], ...]) -> bool: - return isinstance(thing, Sequence) and all( - isinstance(x, type_or_types) for x in thing - ) diff --git a/.venv/lib/python3.10/site-packages/corsheaders/conf.py b/.venv/lib/python3.10/site-packages/corsheaders/conf.py deleted file mode 100644 index c15dd2c..0000000 --- a/.venv/lib/python3.10/site-packages/corsheaders/conf.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import annotations - -from collections.abc import Sequence -from re import Pattern -from typing import Union -from typing import cast - -from django.conf import settings - -from corsheaders.defaults import default_headers -from corsheaders.defaults import default_methods - - -class Settings: - """ - Shadow Django's settings with a little logic - """ - - @property - def CORS_ALLOW_HEADERS(self) -> Sequence[str]: - return getattr(settings, "CORS_ALLOW_HEADERS", default_headers) - - @property - def CORS_ALLOW_METHODS(self) -> Sequence[str]: - return getattr(settings, "CORS_ALLOW_METHODS", default_methods) - - @property - def CORS_ALLOW_CREDENTIALS(self) -> bool: - return getattr(settings, "CORS_ALLOW_CREDENTIALS", False) - - @property - def CORS_ALLOW_PRIVATE_NETWORK(self) -> bool: - return getattr(settings, "CORS_ALLOW_PRIVATE_NETWORK", False) - - @property - def CORS_PREFLIGHT_MAX_AGE(self) -> int: - return getattr(settings, "CORS_PREFLIGHT_MAX_AGE", 86400) - - @property - def CORS_ALLOW_ALL_ORIGINS(self) -> bool: - return getattr( - settings, - "CORS_ALLOW_ALL_ORIGINS", - getattr(settings, "CORS_ORIGIN_ALLOW_ALL", False), - ) - - @property - def CORS_ALLOWED_ORIGINS(self) -> list[str] | tuple[str]: - value = getattr( - settings, - "CORS_ALLOWED_ORIGINS", - getattr(settings, "CORS_ORIGIN_WHITELIST", ()), - ) - return cast(Union[list[str], tuple[str]], value) - - @property - def CORS_ALLOWED_ORIGIN_REGEXES(self) -> Sequence[str | Pattern[str]]: - return getattr( - settings, - "CORS_ALLOWED_ORIGIN_REGEXES", - getattr(settings, "CORS_ORIGIN_REGEX_WHITELIST", ()), - ) - - @property - def CORS_EXPOSE_HEADERS(self) -> Sequence[str]: - return getattr(settings, "CORS_EXPOSE_HEADERS", ()) - - @property - def CORS_URLS_REGEX(self) -> str | Pattern[str]: - return getattr(settings, "CORS_URLS_REGEX", r"^.*$") - - -conf = Settings() diff --git a/.venv/lib/python3.10/site-packages/corsheaders/defaults.py b/.venv/lib/python3.10/site-packages/corsheaders/defaults.py deleted file mode 100644 index 943b9c0..0000000 --- a/.venv/lib/python3.10/site-packages/corsheaders/defaults.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import annotations - -# Kept here for backwards compatibility - -default_headers = ( - "accept", - "authorization", - "content-type", - "user-agent", - "x-csrftoken", - "x-requested-with", -) - -default_methods = ( - "DELETE", - "GET", - "OPTIONS", - "PATCH", - "POST", - "PUT", -) diff --git a/.venv/lib/python3.10/site-packages/corsheaders/middleware.py b/.venv/lib/python3.10/site-packages/corsheaders/middleware.py deleted file mode 100644 index c558719..0000000 --- a/.venv/lib/python3.10/site-packages/corsheaders/middleware.py +++ /dev/null @@ -1,169 +0,0 @@ -from __future__ import annotations - -import re -from collections.abc import Awaitable -from typing import Callable -from urllib.parse import SplitResult -from urllib.parse import urlsplit - -from asgiref.sync import iscoroutinefunction -from asgiref.sync import markcoroutinefunction -from django.http import HttpRequest -from django.http import HttpResponse -from django.http.response import HttpResponseBase -from django.utils.cache import patch_vary_headers - -from corsheaders.conf import conf -from corsheaders.signals import check_request_enabled - -ACCESS_CONTROL_ALLOW_ORIGIN = "access-control-allow-origin" -ACCESS_CONTROL_EXPOSE_HEADERS = "access-control-expose-headers" -ACCESS_CONTROL_ALLOW_CREDENTIALS = "access-control-allow-credentials" -ACCESS_CONTROL_ALLOW_HEADERS = "access-control-allow-headers" -ACCESS_CONTROL_ALLOW_METHODS = "access-control-allow-methods" -ACCESS_CONTROL_MAX_AGE = "access-control-max-age" -ACCESS_CONTROL_REQUEST_PRIVATE_NETWORK = "access-control-request-private-network" -ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK = "access-control-allow-private-network" - - -class CorsMiddleware: - sync_capable = True - async_capable = True - - def __init__( - self, - get_response: ( - Callable[[HttpRequest], HttpResponseBase] - | Callable[[HttpRequest], Awaitable[HttpResponseBase]] - ), - ) -> None: - self.get_response = get_response - self.async_mode = iscoroutinefunction(self.get_response) - - if self.async_mode: - # Mark the class as async-capable, but do the actual switch - - # inside __call__ to avoid swapping out dunder methods - markcoroutinefunction(self) - - def __call__( - self, request: HttpRequest - ) -> HttpResponseBase | Awaitable[HttpResponseBase]: - if self.async_mode: - return self.__acall__(request) - response: HttpResponseBase | None = self.check_preflight(request) - if response is None: - result = self.get_response(request) - assert isinstance(result, HttpResponseBase) - response = result - self.add_response_headers(request, response) - return response - - async def __acall__(self, request: HttpRequest) -> HttpResponseBase: - response = self.check_preflight(request) - if response is None: - result = self.get_response(request) - assert not isinstance(result, HttpResponseBase) - response = await result - self.add_response_headers(request, response) - return response - - def check_preflight(self, request: HttpRequest) -> HttpResponseBase | None: - """ - Generate a response for CORS preflight requests. - """ - request._cors_enabled = self.is_enabled(request) # type: ignore [attr-defined] - if ( - request._cors_enabled # type: ignore [attr-defined] - and request.method == "OPTIONS" - and "access-control-request-method" in request.headers - ): - return HttpResponse(headers={"content-length": "0"}) - return None - - def add_response_headers( - self, request: HttpRequest, response: HttpResponseBase - ) -> HttpResponseBase: - """ - Add the respective CORS headers - """ - enabled = getattr(request, "_cors_enabled", None) - if enabled is None: - enabled = self.is_enabled(request) - - if not enabled: - return response - - patch_vary_headers(response, ("origin",)) - - origin = request.headers.get("origin") - if not origin: - return response - - try: - url = urlsplit(origin) - except ValueError: - return response - - if ( - not conf.CORS_ALLOW_ALL_ORIGINS - and not self.origin_found_in_white_lists(origin, url) - and not self.check_signal(request) - ): - return response - - if conf.CORS_ALLOW_ALL_ORIGINS and not conf.CORS_ALLOW_CREDENTIALS: - response[ACCESS_CONTROL_ALLOW_ORIGIN] = "*" - else: - response[ACCESS_CONTROL_ALLOW_ORIGIN] = origin - - if conf.CORS_ALLOW_CREDENTIALS: - response[ACCESS_CONTROL_ALLOW_CREDENTIALS] = "true" - - if len(conf.CORS_EXPOSE_HEADERS): - response[ACCESS_CONTROL_EXPOSE_HEADERS] = ", ".join( - conf.CORS_EXPOSE_HEADERS - ) - - if request.method == "OPTIONS": - response[ACCESS_CONTROL_ALLOW_HEADERS] = ", ".join(conf.CORS_ALLOW_HEADERS) - response[ACCESS_CONTROL_ALLOW_METHODS] = ", ".join(conf.CORS_ALLOW_METHODS) - if conf.CORS_PREFLIGHT_MAX_AGE: - response[ACCESS_CONTROL_MAX_AGE] = str(conf.CORS_PREFLIGHT_MAX_AGE) - - if ( - conf.CORS_ALLOW_PRIVATE_NETWORK - and request.headers.get(ACCESS_CONTROL_REQUEST_PRIVATE_NETWORK) == "true" - ): - response[ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK] = "true" - - return response - - def origin_found_in_white_lists(self, origin: str, url: SplitResult) -> bool: - return ( - (origin == "null" and origin in conf.CORS_ALLOWED_ORIGINS) - or self._url_in_whitelist(url) - or self.regex_domain_match(origin) - ) - - def regex_domain_match(self, origin: str) -> bool: - return any( - re.match(domain_pattern, origin) - for domain_pattern in conf.CORS_ALLOWED_ORIGIN_REGEXES - ) - - def is_enabled(self, request: HttpRequest) -> bool: - return bool( - re.match(conf.CORS_URLS_REGEX, request.path_info) - ) or self.check_signal(request) - - def check_signal(self, request: HttpRequest) -> bool: - signal_responses = check_request_enabled.send(sender=None, request=request) - return any(return_value for function, return_value in signal_responses) - - def _url_in_whitelist(self, url: SplitResult) -> bool: - origins = [urlsplit(o) for o in conf.CORS_ALLOWED_ORIGINS] - return any( - origin.scheme == url.scheme and origin.netloc == url.netloc - for origin in origins - ) diff --git a/.venv/lib/python3.10/site-packages/corsheaders/py.typed b/.venv/lib/python3.10/site-packages/corsheaders/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/corsheaders/signals.py b/.venv/lib/python3.10/site-packages/corsheaders/signals.py deleted file mode 100644 index 9e7160e..0000000 --- a/.venv/lib/python3.10/site-packages/corsheaders/signals.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import annotations - -from django.dispatch import Signal - -# If any attached handler returns Truthy, CORS will be allowed for the request. -# This can be used to build custom logic into the request handling when the -# configuration doesn't work. -check_request_enabled = Signal() diff --git a/.venv/lib/python3.10/site-packages/distutils-precedence.pth b/.venv/lib/python3.10/site-packages/distutils-precedence.pth deleted file mode 100644 index 6de4198..0000000 --- a/.venv/lib/python3.10/site-packages/distutils-precedence.pth +++ /dev/null @@ -1 +0,0 @@ -import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'stdlib') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/.venv/lib/python3.10/site-packages/django/__init__.py b/.venv/lib/python3.10/site-packages/django/__init__.py deleted file mode 100644 index bb07331..0000000 --- a/.venv/lib/python3.10/site-packages/django/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -from django.utils.version import get_version - -VERSION = (5, 2, 0, "final", 0) - -__version__ = get_version(VERSION) - - -def setup(set_prefix=True): - """ - Configure the settings (this happens as a side effect of accessing the - first setting), configure logging and populate the app registry. - Set the thread-local urlresolvers script prefix if `set_prefix` is True. - """ - from django.apps import apps - from django.conf import settings - from django.urls import set_script_prefix - from django.utils.log import configure_logging - - configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) - if set_prefix: - set_script_prefix( - "/" if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME - ) - apps.populate(settings.INSTALLED_APPS) diff --git a/.venv/lib/python3.10/site-packages/django/__main__.py b/.venv/lib/python3.10/site-packages/django/__main__.py deleted file mode 100644 index 7415143..0000000 --- a/.venv/lib/python3.10/site-packages/django/__main__.py +++ /dev/null @@ -1,10 +0,0 @@ -""" -Invokes django-admin when the django module is run as a script. - -Example: python -m django check -""" - -from django.core import management - -if __name__ == "__main__": - management.execute_from_command_line() diff --git a/.venv/lib/python3.10/site-packages/django/apps/__init__.py b/.venv/lib/python3.10/site-packages/django/apps/__init__.py deleted file mode 100644 index 96674be..0000000 --- a/.venv/lib/python3.10/site-packages/django/apps/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .config import AppConfig -from .registry import apps - -__all__ = ["AppConfig", "apps"] diff --git a/.venv/lib/python3.10/site-packages/django/apps/config.py b/.venv/lib/python3.10/site-packages/django/apps/config.py deleted file mode 100644 index 28e50e5..0000000 --- a/.venv/lib/python3.10/site-packages/django/apps/config.py +++ /dev/null @@ -1,274 +0,0 @@ -import inspect -import os -from importlib import import_module - -from django.core.exceptions import ImproperlyConfigured -from django.utils.functional import cached_property -from django.utils.module_loading import import_string, module_has_submodule - -APPS_MODULE_NAME = "apps" -MODELS_MODULE_NAME = "models" - - -class AppConfig: - """Class representing a Django application and its configuration.""" - - def __init__(self, app_name, app_module): - # Full Python path to the application e.g. 'django.contrib.admin'. - self.name = app_name - - # Root module for the application e.g. . - self.module = app_module - - # Reference to the Apps registry that holds this AppConfig. Set by the - # registry when it registers the AppConfig instance. - self.apps = None - - # The following attributes could be defined at the class level in a - # subclass, hence the test-and-set pattern. - - # Last component of the Python path to the application e.g. 'admin'. - # This value must be unique across a Django project. - if not hasattr(self, "label"): - self.label = app_name.rpartition(".")[2] - if not self.label.isidentifier(): - raise ImproperlyConfigured( - "The app label '%s' is not a valid Python identifier." % self.label - ) - - # Human-readable name for the application e.g. "Admin". - if not hasattr(self, "verbose_name"): - self.verbose_name = self.label.title() - - # Filesystem path to the application directory e.g. - # '/path/to/django/contrib/admin'. - if not hasattr(self, "path"): - self.path = self._path_from_module(app_module) - - # Module containing models e.g. . Set by import_models(). - # None if the application doesn't have a models module. - self.models_module = None - - # Mapping of lowercase model names to model classes. Initially set to - # None to prevent accidental access before import_models() runs. - self.models = None - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self.label) - - @cached_property - def default_auto_field(self): - from django.conf import settings - - return settings.DEFAULT_AUTO_FIELD - - @property - def _is_default_auto_field_overridden(self): - return self.__class__.default_auto_field is not AppConfig.default_auto_field - - def _path_from_module(self, module): - """Attempt to determine app's filesystem path from its module.""" - # See #21874 for extended discussion of the behavior of this method in - # various cases. - # Convert to list because __path__ may not support indexing. - paths = list(getattr(module, "__path__", [])) - if len(paths) != 1: - filename = getattr(module, "__file__", None) - if filename is not None: - paths = [os.path.dirname(filename)] - else: - # For unknown reasons, sometimes the list returned by __path__ - # contains duplicates that must be removed (#25246). - paths = list(set(paths)) - if len(paths) > 1: - raise ImproperlyConfigured( - "The app module %r has multiple filesystem locations (%r); " - "you must configure this app with an AppConfig subclass " - "with a 'path' class attribute." % (module, paths) - ) - elif not paths: - raise ImproperlyConfigured( - "The app module %r has no filesystem location, " - "you must configure this app with an AppConfig subclass " - "with a 'path' class attribute." % module - ) - return paths[0] - - @classmethod - def create(cls, entry): - """ - Factory that creates an app config from an entry in INSTALLED_APPS. - """ - # create() eventually returns app_config_class(app_name, app_module). - app_config_class = None - app_name = None - app_module = None - - # If import_module succeeds, entry points to the app module. - try: - app_module = import_module(entry) - except Exception: - pass - else: - # If app_module has an apps submodule that defines a single - # AppConfig subclass, use it automatically. - # To prevent this, an AppConfig subclass can declare a class - # variable default = False. - # If the apps module defines more than one AppConfig subclass, - # the default one can declare default = True. - if module_has_submodule(app_module, APPS_MODULE_NAME): - mod_path = "%s.%s" % (entry, APPS_MODULE_NAME) - mod = import_module(mod_path) - # Check if there's exactly one AppConfig candidate, - # excluding those that explicitly define default = False. - app_configs = [ - (name, candidate) - for name, candidate in inspect.getmembers(mod, inspect.isclass) - if ( - issubclass(candidate, cls) - and candidate is not cls - and getattr(candidate, "default", True) - ) - ] - if len(app_configs) == 1: - app_config_class = app_configs[0][1] - else: - # Check if there's exactly one AppConfig subclass, - # among those that explicitly define default = True. - app_configs = [ - (name, candidate) - for name, candidate in app_configs - if getattr(candidate, "default", False) - ] - if len(app_configs) > 1: - candidates = [repr(name) for name, _ in app_configs] - raise RuntimeError( - "%r declares more than one default AppConfig: " - "%s." % (mod_path, ", ".join(candidates)) - ) - elif len(app_configs) == 1: - app_config_class = app_configs[0][1] - - # Use the default app config class if we didn't find anything. - if app_config_class is None: - app_config_class = cls - app_name = entry - - # If import_string succeeds, entry is an app config class. - if app_config_class is None: - try: - app_config_class = import_string(entry) - except Exception: - pass - # If both import_module and import_string failed, it means that entry - # doesn't have a valid value. - if app_module is None and app_config_class is None: - # If the last component of entry starts with an uppercase letter, - # then it was likely intended to be an app config class; if not, - # an app module. Provide a nice error message in both cases. - mod_path, _, cls_name = entry.rpartition(".") - if mod_path and cls_name[0].isupper(): - # We could simply re-trigger the string import exception, but - # we're going the extra mile and providing a better error - # message for typos in INSTALLED_APPS. - # This may raise ImportError, which is the best exception - # possible if the module at mod_path cannot be imported. - mod = import_module(mod_path) - candidates = [ - repr(name) - for name, candidate in inspect.getmembers(mod, inspect.isclass) - if issubclass(candidate, cls) and candidate is not cls - ] - msg = "Module '%s' does not contain a '%s' class." % ( - mod_path, - cls_name, - ) - if candidates: - msg += " Choices are: %s." % ", ".join(candidates) - raise ImportError(msg) - else: - # Re-trigger the module import exception. - import_module(entry) - - # Check for obvious errors. (This check prevents duck typing, but - # it could be removed if it became a problem in practice.) - if not issubclass(app_config_class, AppConfig): - raise ImproperlyConfigured("'%s' isn't a subclass of AppConfig." % entry) - - # Obtain app name here rather than in AppClass.__init__ to keep - # all error checking for entries in INSTALLED_APPS in one place. - if app_name is None: - try: - app_name = app_config_class.name - except AttributeError: - raise ImproperlyConfigured("'%s' must supply a name attribute." % entry) - - # Ensure app_name points to a valid module. - try: - app_module = import_module(app_name) - except ImportError: - raise ImproperlyConfigured( - "Cannot import '%s'. Check that '%s.%s.name' is correct." - % ( - app_name, - app_config_class.__module__, - app_config_class.__qualname__, - ) - ) - - # Entry is a path to an app config class. - return app_config_class(app_name, app_module) - - def get_model(self, model_name, require_ready=True): - """ - Return the model with the given case-insensitive model_name. - - Raise LookupError if no model exists with this name. - """ - if require_ready: - self.apps.check_models_ready() - else: - self.apps.check_apps_ready() - try: - return self.models[model_name.lower()] - except KeyError: - raise LookupError( - "App '%s' doesn't have a '%s' model." % (self.label, model_name) - ) - - def get_models(self, include_auto_created=False, include_swapped=False): - """ - Return an iterable of models. - - By default, the following models aren't included: - - - auto-created models for many-to-many relations without - an explicit intermediate table, - - models that have been swapped out. - - Set the corresponding keyword argument to True to include such models. - Keyword arguments aren't documented; they're a private API. - """ - self.apps.check_models_ready() - for model in self.models.values(): - if model._meta.auto_created and not include_auto_created: - continue - if model._meta.swapped and not include_swapped: - continue - yield model - - def import_models(self): - # Dictionary of models for this app, primarily maintained in the - # 'all_models' attribute of the Apps this AppConfig is attached to. - self.models = self.apps.all_models[self.label] - - if module_has_submodule(self.module, MODELS_MODULE_NAME): - models_module_name = "%s.%s" % (self.name, MODELS_MODULE_NAME) - self.models_module = import_module(models_module_name) - - def ready(self): - """ - Override this method in subclasses to run code when Django starts. - """ diff --git a/.venv/lib/python3.10/site-packages/django/apps/registry.py b/.venv/lib/python3.10/site-packages/django/apps/registry.py deleted file mode 100644 index 92de607..0000000 --- a/.venv/lib/python3.10/site-packages/django/apps/registry.py +++ /dev/null @@ -1,437 +0,0 @@ -import functools -import sys -import threading -import warnings -from collections import Counter, defaultdict -from functools import partial - -from django.core.exceptions import AppRegistryNotReady, ImproperlyConfigured - -from .config import AppConfig - - -class Apps: - """ - A registry that stores the configuration of installed applications. - - It also keeps track of models, e.g. to provide reverse relations. - """ - - def __init__(self, installed_apps=()): - # installed_apps is set to None when creating the main registry - # because it cannot be populated at that point. Other registries must - # provide a list of installed apps and are populated immediately. - if installed_apps is None and hasattr(sys.modules[__name__], "apps"): - raise RuntimeError("You must supply an installed_apps argument.") - - # Mapping of app labels => model names => model classes. Every time a - # model is imported, ModelBase.__new__ calls apps.register_model which - # creates an entry in all_models. All imported models are registered, - # regardless of whether they're defined in an installed application - # and whether the registry has been populated. Since it isn't possible - # to reimport a module safely (it could reexecute initialization code) - # all_models is never overridden or reset. - self.all_models = defaultdict(dict) - - # Mapping of labels to AppConfig instances for installed apps. - self.app_configs = {} - - # Stack of app_configs. Used to store the current state in - # set_available_apps and set_installed_apps. - self.stored_app_configs = [] - - # Whether the registry is populated. - self.apps_ready = self.models_ready = self.ready = False - # For the autoreloader. - self.ready_event = threading.Event() - - # Lock for thread-safe population. - self._lock = threading.RLock() - self.loading = False - - # Maps ("app_label", "modelname") tuples to lists of functions to be - # called when the corresponding model is ready. Used by this class's - # `lazy_model_operation()` and `do_pending_operations()` methods. - self._pending_operations = defaultdict(list) - - # Populate apps and models, unless it's the main registry. - if installed_apps is not None: - self.populate(installed_apps) - - def populate(self, installed_apps=None): - """ - Load application configurations and models. - - Import each application module and then each model module. - - It is thread-safe and idempotent, but not reentrant. - """ - if self.ready: - return - - # populate() might be called by two threads in parallel on servers - # that create threads before initializing the WSGI callable. - with self._lock: - if self.ready: - return - - # An RLock prevents other threads from entering this section. The - # compare and set operation below is atomic. - if self.loading: - # Prevent reentrant calls to avoid running AppConfig.ready() - # methods twice. - raise RuntimeError("populate() isn't reentrant") - self.loading = True - - # Phase 1: initialize app configs and import app modules. - for entry in installed_apps: - if isinstance(entry, AppConfig): - app_config = entry - else: - app_config = AppConfig.create(entry) - if app_config.label in self.app_configs: - raise ImproperlyConfigured( - "Application labels aren't unique, " - "duplicates: %s" % app_config.label - ) - - self.app_configs[app_config.label] = app_config - app_config.apps = self - - # Check for duplicate app names. - counts = Counter( - app_config.name for app_config in self.app_configs.values() - ) - duplicates = [name for name, count in counts.most_common() if count > 1] - if duplicates: - raise ImproperlyConfigured( - "Application names aren't unique, " - "duplicates: %s" % ", ".join(duplicates) - ) - - self.apps_ready = True - - # Phase 2: import models modules. - for app_config in self.app_configs.values(): - app_config.import_models() - - self.clear_cache() - - self.models_ready = True - - # Phase 3: run ready() methods of app configs. - for app_config in self.get_app_configs(): - app_config.ready() - - self.ready = True - self.ready_event.set() - - def check_apps_ready(self): - """Raise an exception if all apps haven't been imported yet.""" - if not self.apps_ready: - from django.conf import settings - - # If "not ready" is due to unconfigured settings, accessing - # INSTALLED_APPS raises a more helpful ImproperlyConfigured - # exception. - settings.INSTALLED_APPS - raise AppRegistryNotReady("Apps aren't loaded yet.") - - def check_models_ready(self): - """Raise an exception if all models haven't been imported yet.""" - if not self.models_ready: - raise AppRegistryNotReady("Models aren't loaded yet.") - - def get_app_configs(self): - """Import applications and return an iterable of app configs.""" - self.check_apps_ready() - return self.app_configs.values() - - def get_app_config(self, app_label): - """ - Import applications and returns an app config for the given label. - - Raise LookupError if no application exists with this label. - """ - self.check_apps_ready() - try: - return self.app_configs[app_label] - except KeyError: - message = "No installed app with label '%s'." % app_label - for app_config in self.get_app_configs(): - if app_config.name == app_label: - message += " Did you mean '%s'?" % app_config.label - break - raise LookupError(message) - - # This method is performance-critical at least for Django's test suite. - @functools.cache - def get_models(self, include_auto_created=False, include_swapped=False): - """ - Return a list of all installed models. - - By default, the following models aren't included: - - - auto-created models for many-to-many relations without - an explicit intermediate table, - - models that have been swapped out. - - Set the corresponding keyword argument to True to include such models. - """ - self.check_models_ready() - - result = [] - for app_config in self.app_configs.values(): - result.extend(app_config.get_models(include_auto_created, include_swapped)) - return result - - def get_model(self, app_label, model_name=None, require_ready=True): - """ - Return the model matching the given app_label and model_name. - - As a shortcut, app_label may be in the form .. - - model_name is case-insensitive. - - Raise LookupError if no application exists with this label, or no - model exists with this name in the application. Raise ValueError if - called with a single argument that doesn't contain exactly one dot. - """ - if require_ready: - self.check_models_ready() - else: - self.check_apps_ready() - - if model_name is None: - app_label, model_name = app_label.split(".") - - app_config = self.get_app_config(app_label) - - if not require_ready and app_config.models is None: - app_config.import_models() - - return app_config.get_model(model_name, require_ready=require_ready) - - def register_model(self, app_label, model): - # Since this method is called when models are imported, it cannot - # perform imports because of the risk of import loops. It mustn't - # call get_app_config(). - model_name = model._meta.model_name - app_models = self.all_models[app_label] - if model_name in app_models: - if ( - model.__name__ == app_models[model_name].__name__ - and model.__module__ == app_models[model_name].__module__ - ): - warnings.warn( - "Model '%s.%s' was already registered. Reloading models is not " - "advised as it can lead to inconsistencies, most notably with " - "related models." % (app_label, model_name), - RuntimeWarning, - stacklevel=2, - ) - else: - raise RuntimeError( - "Conflicting '%s' models in application '%s': %s and %s." - % (model_name, app_label, app_models[model_name], model) - ) - app_models[model_name] = model - self.do_pending_operations(model) - self.clear_cache() - - def is_installed(self, app_name): - """ - Check whether an application with this name exists in the registry. - - app_name is the full name of the app e.g. 'django.contrib.admin'. - """ - self.check_apps_ready() - return any(ac.name == app_name for ac in self.app_configs.values()) - - def get_containing_app_config(self, object_name): - """ - Look for an app config containing a given object. - - object_name is the dotted Python path to the object. - - Return the app config for the inner application in case of nesting. - Return None if the object isn't in any registered app config. - """ - self.check_apps_ready() - candidates = [] - for app_config in self.app_configs.values(): - if object_name.startswith(app_config.name): - subpath = object_name.removeprefix(app_config.name) - if subpath == "" or subpath[0] == ".": - candidates.append(app_config) - if candidates: - return sorted(candidates, key=lambda ac: -len(ac.name))[0] - - def get_registered_model(self, app_label, model_name): - """ - Similar to get_model(), but doesn't require that an app exists with - the given app_label. - - It's safe to call this method at import time, even while the registry - is being populated. - """ - model = self.all_models[app_label].get(model_name.lower()) - if model is None: - raise LookupError("Model '%s.%s' not registered." % (app_label, model_name)) - return model - - @functools.cache - def get_swappable_settings_name(self, to_string): - """ - For a given model string (e.g. "auth.User"), return the name of the - corresponding settings name if it refers to a swappable model. If the - referred model is not swappable, return None. - - This method is decorated with @functools.cache because it's performance - critical when it comes to migrations. Since the swappable settings don't - change after Django has loaded the settings, there is no reason to get - the respective settings attribute over and over again. - """ - to_string = to_string.lower() - for model in self.get_models(include_swapped=True): - swapped = model._meta.swapped - # Is this model swapped out for the model given by to_string? - if swapped and swapped.lower() == to_string: - return model._meta.swappable - # Is this model swappable and the one given by to_string? - if model._meta.swappable and model._meta.label_lower == to_string: - return model._meta.swappable - return None - - def set_available_apps(self, available): - """ - Restrict the set of installed apps used by get_app_config[s]. - - available must be an iterable of application names. - - set_available_apps() must be balanced with unset_available_apps(). - - Primarily used for performance optimization in TransactionTestCase. - - This method is safe in the sense that it doesn't trigger any imports. - """ - available = set(available) - installed = {app_config.name for app_config in self.get_app_configs()} - if not available.issubset(installed): - raise ValueError( - "Available apps isn't a subset of installed apps, extra apps: %s" - % ", ".join(available - installed) - ) - - self.stored_app_configs.append(self.app_configs) - self.app_configs = { - label: app_config - for label, app_config in self.app_configs.items() - if app_config.name in available - } - self.clear_cache() - - def unset_available_apps(self): - """Cancel a previous call to set_available_apps().""" - self.app_configs = self.stored_app_configs.pop() - self.clear_cache() - - def set_installed_apps(self, installed): - """ - Enable a different set of installed apps for get_app_config[s]. - - installed must be an iterable in the same format as INSTALLED_APPS. - - set_installed_apps() must be balanced with unset_installed_apps(), - even if it exits with an exception. - - Primarily used as a receiver of the setting_changed signal in tests. - - This method may trigger new imports, which may add new models to the - registry of all imported models. They will stay in the registry even - after unset_installed_apps(). Since it isn't possible to replay - imports safely (e.g. that could lead to registering listeners twice), - models are registered when they're imported and never removed. - """ - if not self.ready: - raise AppRegistryNotReady("App registry isn't ready yet.") - self.stored_app_configs.append(self.app_configs) - self.app_configs = {} - self.apps_ready = self.models_ready = self.loading = self.ready = False - self.clear_cache() - self.populate(installed) - - def unset_installed_apps(self): - """Cancel a previous call to set_installed_apps().""" - self.app_configs = self.stored_app_configs.pop() - self.apps_ready = self.models_ready = self.ready = True - self.clear_cache() - - def clear_cache(self): - """ - Clear all internal caches, for methods that alter the app registry. - - This is mostly used in tests. - """ - self.get_swappable_settings_name.cache_clear() - # Call expire cache on each model. This will purge - # the relation tree and the fields cache. - self.get_models.cache_clear() - if self.ready: - # Circumvent self.get_models() to prevent that the cache is refilled. - # This particularly prevents that an empty value is cached while cloning. - for app_config in self.app_configs.values(): - for model in app_config.get_models(include_auto_created=True): - model._meta._expire_cache() - - def lazy_model_operation(self, function, *model_keys): - """ - Take a function and a number of ("app_label", "modelname") tuples, and - when all the corresponding models have been imported and registered, - call the function with the model classes as its arguments. - - The function passed to this method must accept exactly n models as - arguments, where n=len(model_keys). - """ - # Base case: no arguments, just execute the function. - if not model_keys: - function() - # Recursive case: take the head of model_keys, wait for the - # corresponding model class to be imported and registered, then apply - # that argument to the supplied function. Pass the resulting partial - # to lazy_model_operation() along with the remaining model args and - # repeat until all models are loaded and all arguments are applied. - else: - next_model, *more_models = model_keys - - # This will be executed after the class corresponding to next_model - # has been imported and registered. The `func` attribute provides - # duck-type compatibility with partials. - def apply_next_model(model): - next_function = partial(apply_next_model.func, model) - self.lazy_model_operation(next_function, *more_models) - - apply_next_model.func = function - - # If the model has already been imported and registered, partially - # apply it to the function now. If not, add it to the list of - # pending operations for the model, where it will be executed with - # the model class as its sole argument once the model is ready. - try: - model_class = self.get_registered_model(*next_model) - except LookupError: - self._pending_operations[next_model].append(apply_next_model) - else: - apply_next_model(model_class) - - def do_pending_operations(self, model): - """ - Take a newly-prepared model and pass it to each function waiting for - it. This is called at the very end of Apps.register_model(). - """ - key = model._meta.app_label, model._meta.model_name - for function in self._pending_operations.pop(key, []): - function(model) - - -apps = Apps(installed_apps=None) diff --git a/.venv/lib/python3.10/site-packages/django/conf/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/__init__.py deleted file mode 100644 index 5568d7c..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/__init__.py +++ /dev/null @@ -1,272 +0,0 @@ -""" -Settings and configuration for Django. - -Read values from the module specified by the DJANGO_SETTINGS_MODULE environment -variable, and then from django.conf.global_settings; see the global_settings.py -for a list of all possible variables. -""" - -import importlib -import os -import time -import traceback -import warnings -from pathlib import Path - -import django -from django.conf import global_settings -from django.core.exceptions import ImproperlyConfigured -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.functional import LazyObject, empty - -ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE" -DEFAULT_STORAGE_ALIAS = "default" -STATICFILES_STORAGE_ALIAS = "staticfiles" - -# RemovedInDjango60Warning. -FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG = ( - "The FORMS_URLFIELD_ASSUME_HTTPS transitional setting is deprecated." -) - - -class SettingsReference(str): - """ - String subclass which references a current settings value. It's treated as - the value in memory but serializes to a settings.NAME attribute reference. - """ - - def __new__(self, value, setting_name): - return str.__new__(self, value) - - def __init__(self, value, setting_name): - self.setting_name = setting_name - - -class LazySettings(LazyObject): - """ - A lazy proxy for either global Django settings or a custom settings object. - The user can manually configure settings prior to using them. Otherwise, - Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE. - """ - - def _setup(self, name=None): - """ - Load the settings module pointed to by the environment variable. This - is used the first time settings are needed, if the user hasn't - configured settings manually. - """ - settings_module = os.environ.get(ENVIRONMENT_VARIABLE) - if not settings_module: - desc = ("setting %s" % name) if name else "settings" - raise ImproperlyConfigured( - "Requested %s, but settings are not configured. " - "You must either define the environment variable %s " - "or call settings.configure() before accessing settings." - % (desc, ENVIRONMENT_VARIABLE) - ) - - self._wrapped = Settings(settings_module) - - def __repr__(self): - # Hardcode the class name as otherwise it yields 'Settings'. - if self._wrapped is empty: - return "" - return '' % { - "settings_module": self._wrapped.SETTINGS_MODULE, - } - - def __getattr__(self, name): - """Return the value of a setting and cache it in self.__dict__.""" - if (_wrapped := self._wrapped) is empty: - self._setup(name) - _wrapped = self._wrapped - val = getattr(_wrapped, name) - - # Special case some settings which require further modification. - # This is done here for performance reasons so the modified value is cached. - if name in {"MEDIA_URL", "STATIC_URL"} and val is not None: - val = self._add_script_prefix(val) - elif name == "SECRET_KEY" and not val: - raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.") - - self.__dict__[name] = val - return val - - def __setattr__(self, name, value): - """ - Set the value of setting. Clear all cached values if _wrapped changes - (@override_settings does this) or clear single values when set. - """ - if name == "_wrapped": - self.__dict__.clear() - else: - self.__dict__.pop(name, None) - super().__setattr__(name, value) - - def __delattr__(self, name): - """Delete a setting and clear it from cache if needed.""" - super().__delattr__(name) - self.__dict__.pop(name, None) - - def configure(self, default_settings=global_settings, **options): - """ - Called to manually configure the settings. The 'default_settings' - parameter sets where to retrieve any unspecified values from (its - argument must support attribute access (__getattr__)). - """ - if self._wrapped is not empty: - raise RuntimeError("Settings already configured.") - holder = UserSettingsHolder(default_settings) - for name, value in options.items(): - if not name.isupper(): - raise TypeError("Setting %r must be uppercase." % name) - setattr(holder, name, value) - self._wrapped = holder - - @staticmethod - def _add_script_prefix(value): - """ - Add SCRIPT_NAME prefix to relative paths. - - Useful when the app is being served at a subpath and manually prefixing - subpath to STATIC_URL and MEDIA_URL in settings is inconvenient. - """ - # Don't apply prefix to absolute paths and URLs. - if value.startswith(("http://", "https://", "/")): - return value - from django.urls import get_script_prefix - - return "%s%s" % (get_script_prefix(), value) - - @property - def configured(self): - """Return True if the settings have already been configured.""" - return self._wrapped is not empty - - def _show_deprecation_warning(self, message, category): - stack = traceback.extract_stack() - # Show a warning if the setting is used outside of Django. - # Stack index: -1 this line, -2 the property, -3 the - # LazyObject __getattribute__(), -4 the caller. - filename, _, _, _ = stack[-4] - if not filename.startswith(os.path.dirname(django.__file__)): - warnings.warn(message, category, stacklevel=2) - - -class Settings: - def __init__(self, settings_module): - # update this dict from global settings (but only for ALL_CAPS settings) - for setting in dir(global_settings): - if setting.isupper(): - setattr(self, setting, getattr(global_settings, setting)) - - # store the settings module in case someone later cares - self.SETTINGS_MODULE = settings_module - - mod = importlib.import_module(self.SETTINGS_MODULE) - - tuple_settings = ( - "ALLOWED_HOSTS", - "INSTALLED_APPS", - "TEMPLATE_DIRS", - "LOCALE_PATHS", - "SECRET_KEY_FALLBACKS", - ) - self._explicit_settings = set() - for setting in dir(mod): - if setting.isupper(): - setting_value = getattr(mod, setting) - - if setting in tuple_settings and not isinstance( - setting_value, (list, tuple) - ): - raise ImproperlyConfigured( - "The %s setting must be a list or a tuple." % setting - ) - setattr(self, setting, setting_value) - self._explicit_settings.add(setting) - - if self.is_overridden("FORMS_URLFIELD_ASSUME_HTTPS"): - warnings.warn( - FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG, - RemovedInDjango60Warning, - ) - - if hasattr(time, "tzset") and self.TIME_ZONE: - # When we can, attempt to validate the timezone. If we can't find - # this file, no check happens and it's harmless. - zoneinfo_root = Path("/usr/share/zoneinfo") - zone_info_file = zoneinfo_root.joinpath(*self.TIME_ZONE.split("/")) - if zoneinfo_root.exists() and not zone_info_file.exists(): - raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE) - # Move the time zone info into os.environ. See ticket #2315 for why - # we don't do this unconditionally (breaks Windows). - os.environ["TZ"] = self.TIME_ZONE - time.tzset() - - def is_overridden(self, setting): - return setting in self._explicit_settings - - def __repr__(self): - return '<%(cls)s "%(settings_module)s">' % { - "cls": self.__class__.__name__, - "settings_module": self.SETTINGS_MODULE, - } - - -class UserSettingsHolder: - """Holder for user configured settings.""" - - # SETTINGS_MODULE doesn't make much sense in the manually configured - # (standalone) case. - SETTINGS_MODULE = None - - def __init__(self, default_settings): - """ - Requests for configuration variables not in this class are satisfied - from the module specified in default_settings (if possible). - """ - self.__dict__["_deleted"] = set() - self.default_settings = default_settings - - def __getattr__(self, name): - if not name.isupper() or name in self._deleted: - raise AttributeError - return getattr(self.default_settings, name) - - def __setattr__(self, name, value): - self._deleted.discard(name) - if name == "FORMS_URLFIELD_ASSUME_HTTPS": - warnings.warn( - FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG, - RemovedInDjango60Warning, - ) - super().__setattr__(name, value) - - def __delattr__(self, name): - self._deleted.add(name) - if hasattr(self, name): - super().__delattr__(name) - - def __dir__(self): - return sorted( - s - for s in [*self.__dict__, *dir(self.default_settings)] - if s not in self._deleted - ) - - def is_overridden(self, setting): - deleted = setting in self._deleted - set_locally = setting in self.__dict__ - set_on_default = getattr( - self.default_settings, "is_overridden", lambda s: False - )(setting) - return deleted or set_locally or set_on_default - - def __repr__(self): - return "<%(cls)s>" % { - "cls": self.__class__.__name__, - } - - -settings = LazySettings() diff --git a/.venv/lib/python3.10/site-packages/django/conf/app_template/__init__.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/app_template/__init__.py-tpl deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/app_template/admin.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/app_template/admin.py-tpl deleted file mode 100644 index 8c38f3f..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/app_template/admin.py-tpl +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/.venv/lib/python3.10/site-packages/django/conf/app_template/apps.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/app_template/apps.py-tpl deleted file mode 100644 index b705352..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/app_template/apps.py-tpl +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class {{ camel_case_app_name }}Config(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = '{{ app_name }}' diff --git a/.venv/lib/python3.10/site-packages/django/conf/app_template/migrations/__init__.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/app_template/migrations/__init__.py-tpl deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/app_template/models.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/app_template/models.py-tpl deleted file mode 100644 index 71a8362..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/app_template/models.py-tpl +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/.venv/lib/python3.10/site-packages/django/conf/app_template/tests.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/app_template/tests.py-tpl deleted file mode 100644 index 7ce503c..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/app_template/tests.py-tpl +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/.venv/lib/python3.10/site-packages/django/conf/app_template/views.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/app_template/views.py-tpl deleted file mode 100644 index 91ea44a..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/app_template/views.py-tpl +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/.venv/lib/python3.10/site-packages/django/conf/global_settings.py b/.venv/lib/python3.10/site-packages/django/conf/global_settings.py deleted file mode 100644 index f4535ac..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/global_settings.py +++ /dev/null @@ -1,669 +0,0 @@ -""" -Default Django settings. Override these with settings in the module pointed to -by the DJANGO_SETTINGS_MODULE environment variable. -""" - - -# This is defined here as a do-nothing function because we can't import -# django.utils.translation -- that module depends on the settings. -def gettext_noop(s): - return s - - -#################### -# CORE # -#################### - -DEBUG = False - -# Whether the framework should propagate raw exceptions rather than catching -# them. This is useful under some testing situations and should never be used -# on a live site. -DEBUG_PROPAGATE_EXCEPTIONS = False - -# People who get code error notifications. In the format -# [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')] -ADMINS = [] - -# List of IP addresses, as strings, that: -# * See debug comments, when DEBUG is true -# * Receive x-headers -INTERNAL_IPS = [] - -# Hosts/domain names that are valid for this site. -# "*" matches anything, ".example.com" matches example.com and all subdomains -ALLOWED_HOSTS = [] - -# Local time zone for this installation. All choices can be found here: -# https://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all -# systems may support all possibilities). When USE_TZ is True, this is -# interpreted as the default user time zone. -TIME_ZONE = "America/Chicago" - -# If you set this to True, Django will use timezone-aware datetimes. -USE_TZ = True - -# Language code for this installation. Valid choices can be found here: -# https://www.iana.org/assignments/language-subtag-registry/ -# If LANGUAGE_CODE is not listed in LANGUAGES (below), the project must -# provide the necessary translations and locale definitions. -LANGUAGE_CODE = "en-us" - -# Languages we provide translations for, out of the box. -LANGUAGES = [ - ("af", gettext_noop("Afrikaans")), - ("ar", gettext_noop("Arabic")), - ("ar-dz", gettext_noop("Algerian Arabic")), - ("ast", gettext_noop("Asturian")), - ("az", gettext_noop("Azerbaijani")), - ("bg", gettext_noop("Bulgarian")), - ("be", gettext_noop("Belarusian")), - ("bn", gettext_noop("Bengali")), - ("br", gettext_noop("Breton")), - ("bs", gettext_noop("Bosnian")), - ("ca", gettext_noop("Catalan")), - ("ckb", gettext_noop("Central Kurdish (Sorani)")), - ("cs", gettext_noop("Czech")), - ("cy", gettext_noop("Welsh")), - ("da", gettext_noop("Danish")), - ("de", gettext_noop("German")), - ("dsb", gettext_noop("Lower Sorbian")), - ("el", gettext_noop("Greek")), - ("en", gettext_noop("English")), - ("en-au", gettext_noop("Australian English")), - ("en-gb", gettext_noop("British English")), - ("eo", gettext_noop("Esperanto")), - ("es", gettext_noop("Spanish")), - ("es-ar", gettext_noop("Argentinian Spanish")), - ("es-co", gettext_noop("Colombian Spanish")), - ("es-mx", gettext_noop("Mexican Spanish")), - ("es-ni", gettext_noop("Nicaraguan Spanish")), - ("es-ve", gettext_noop("Venezuelan Spanish")), - ("et", gettext_noop("Estonian")), - ("eu", gettext_noop("Basque")), - ("fa", gettext_noop("Persian")), - ("fi", gettext_noop("Finnish")), - ("fr", gettext_noop("French")), - ("fy", gettext_noop("Frisian")), - ("ga", gettext_noop("Irish")), - ("gd", gettext_noop("Scottish Gaelic")), - ("gl", gettext_noop("Galician")), - ("he", gettext_noop("Hebrew")), - ("hi", gettext_noop("Hindi")), - ("hr", gettext_noop("Croatian")), - ("hsb", gettext_noop("Upper Sorbian")), - ("hu", gettext_noop("Hungarian")), - ("hy", gettext_noop("Armenian")), - ("ia", gettext_noop("Interlingua")), - ("id", gettext_noop("Indonesian")), - ("ig", gettext_noop("Igbo")), - ("io", gettext_noop("Ido")), - ("is", gettext_noop("Icelandic")), - ("it", gettext_noop("Italian")), - ("ja", gettext_noop("Japanese")), - ("ka", gettext_noop("Georgian")), - ("kab", gettext_noop("Kabyle")), - ("kk", gettext_noop("Kazakh")), - ("km", gettext_noop("Khmer")), - ("kn", gettext_noop("Kannada")), - ("ko", gettext_noop("Korean")), - ("ky", gettext_noop("Kyrgyz")), - ("lb", gettext_noop("Luxembourgish")), - ("lt", gettext_noop("Lithuanian")), - ("lv", gettext_noop("Latvian")), - ("mk", gettext_noop("Macedonian")), - ("ml", gettext_noop("Malayalam")), - ("mn", gettext_noop("Mongolian")), - ("mr", gettext_noop("Marathi")), - ("ms", gettext_noop("Malay")), - ("my", gettext_noop("Burmese")), - ("nb", gettext_noop("Norwegian Bokmål")), - ("ne", gettext_noop("Nepali")), - ("nl", gettext_noop("Dutch")), - ("nn", gettext_noop("Norwegian Nynorsk")), - ("os", gettext_noop("Ossetic")), - ("pa", gettext_noop("Punjabi")), - ("pl", gettext_noop("Polish")), - ("pt", gettext_noop("Portuguese")), - ("pt-br", gettext_noop("Brazilian Portuguese")), - ("ro", gettext_noop("Romanian")), - ("ru", gettext_noop("Russian")), - ("sk", gettext_noop("Slovak")), - ("sl", gettext_noop("Slovenian")), - ("sq", gettext_noop("Albanian")), - ("sr", gettext_noop("Serbian")), - ("sr-latn", gettext_noop("Serbian Latin")), - ("sv", gettext_noop("Swedish")), - ("sw", gettext_noop("Swahili")), - ("ta", gettext_noop("Tamil")), - ("te", gettext_noop("Telugu")), - ("tg", gettext_noop("Tajik")), - ("th", gettext_noop("Thai")), - ("tk", gettext_noop("Turkmen")), - ("tr", gettext_noop("Turkish")), - ("tt", gettext_noop("Tatar")), - ("udm", gettext_noop("Udmurt")), - ("ug", gettext_noop("Uyghur")), - ("uk", gettext_noop("Ukrainian")), - ("ur", gettext_noop("Urdu")), - ("uz", gettext_noop("Uzbek")), - ("vi", gettext_noop("Vietnamese")), - ("zh-hans", gettext_noop("Simplified Chinese")), - ("zh-hant", gettext_noop("Traditional Chinese")), -] - -# Languages using BiDi (right-to-left) layout -LANGUAGES_BIDI = ["he", "ar", "ar-dz", "ckb", "fa", "ug", "ur"] - -# If you set this to False, Django will make some optimizations so as not -# to load the internationalization machinery. -USE_I18N = True -LOCALE_PATHS = [] - -# Settings for language cookie -LANGUAGE_COOKIE_NAME = "django_language" -LANGUAGE_COOKIE_AGE = None -LANGUAGE_COOKIE_DOMAIN = None -LANGUAGE_COOKIE_PATH = "/" -LANGUAGE_COOKIE_SECURE = False -LANGUAGE_COOKIE_HTTPONLY = False -LANGUAGE_COOKIE_SAMESITE = None - -# Not-necessarily-technical managers of the site. They get broken link -# notifications and other various emails. -MANAGERS = ADMINS - -# Default charset to use for all HttpResponse objects, if a MIME type isn't -# manually specified. It's used to construct the Content-Type header. -DEFAULT_CHARSET = "utf-8" - -# Email address that error messages come from. -SERVER_EMAIL = "root@localhost" - -# Database connection info. If left empty, will default to the dummy backend. -DATABASES = {} - -# Classes used to implement DB routing behavior. -DATABASE_ROUTERS = [] - -# The email backend to use. For possible shortcuts see django.core.mail. -# The default is to use the SMTP backend. -# Third-party backends can be specified by providing a Python path -# to a module that defines an EmailBackend class. -EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" - -# Host for sending email. -EMAIL_HOST = "localhost" - -# Port for sending email. -EMAIL_PORT = 25 - -# Whether to send SMTP 'Date' header in the local time zone or in UTC. -EMAIL_USE_LOCALTIME = False - -# Optional SMTP authentication information for EMAIL_HOST. -EMAIL_HOST_USER = "" -EMAIL_HOST_PASSWORD = "" -EMAIL_USE_TLS = False -EMAIL_USE_SSL = False -EMAIL_SSL_CERTFILE = None -EMAIL_SSL_KEYFILE = None -EMAIL_TIMEOUT = None - -# List of strings representing installed apps. -INSTALLED_APPS = [] - -TEMPLATES = [] - -# Default form rendering class. -FORM_RENDERER = "django.forms.renderers.DjangoTemplates" - -# RemovedInDjango60Warning: It's a transitional setting helpful in early -# adoption of "https" as the new default value of forms.URLField.assume_scheme. -# Set to True to assume "https" during the Django 5.x release cycle. -FORMS_URLFIELD_ASSUME_HTTPS = False - -# Default email address to use for various automated correspondence from -# the site managers. -DEFAULT_FROM_EMAIL = "webmaster@localhost" - -# Subject-line prefix for email messages send with django.core.mail.mail_admins -# or ...mail_managers. Make sure to include the trailing space. -EMAIL_SUBJECT_PREFIX = "[Django] " - -# Whether to append trailing slashes to URLs. -APPEND_SLASH = True - -# Whether to prepend the "www." subdomain to URLs that don't have it. -PREPEND_WWW = False - -# Override the server-derived value of SCRIPT_NAME -FORCE_SCRIPT_NAME = None - -# List of compiled regular expression objects representing User-Agent strings -# that are not allowed to visit any page, systemwide. Use this for bad -# robots/crawlers. Here are a few examples: -# import re -# DISALLOWED_USER_AGENTS = [ -# re.compile(r'^NaverBot.*'), -# re.compile(r'^EmailSiphon.*'), -# re.compile(r'^SiteSucker.*'), -# re.compile(r'^sohu-search'), -# ] -DISALLOWED_USER_AGENTS = [] - -ABSOLUTE_URL_OVERRIDES = {} - -# List of compiled regular expression objects representing URLs that need not -# be reported by BrokenLinkEmailsMiddleware. Here are a few examples: -# import re -# IGNORABLE_404_URLS = [ -# re.compile(r'^/apple-touch-icon.*\.png$'), -# re.compile(r'^/favicon.ico$'), -# re.compile(r'^/robots.txt$'), -# re.compile(r'^/phpmyadmin/'), -# re.compile(r'\.(cgi|php|pl)$'), -# ] -IGNORABLE_404_URLS = [] - -# A secret key for this particular Django installation. Used in secret-key -# hashing algorithms. Set this in your settings, or Django will complain -# loudly. -SECRET_KEY = "" - -# List of secret keys used to verify the validity of signatures. This allows -# secret key rotation. -SECRET_KEY_FALLBACKS = [] - -STORAGES = { - "default": { - "BACKEND": "django.core.files.storage.FileSystemStorage", - }, - "staticfiles": { - "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage", - }, -} - -# Absolute filesystem path to the directory that will hold user-uploaded files. -# Example: "/var/www/example.com/media/" -MEDIA_ROOT = "" - -# URL that handles the media served from MEDIA_ROOT. -# Examples: "http://example.com/media/", "http://media.example.com/" -MEDIA_URL = "" - -# Absolute path to the directory static files should be collected to. -# Example: "/var/www/example.com/static/" -STATIC_ROOT = None - -# URL that handles the static files served from STATIC_ROOT. -# Example: "http://example.com/static/", "http://static.example.com/" -STATIC_URL = None - -# List of upload handler classes to be applied in order. -FILE_UPLOAD_HANDLERS = [ - "django.core.files.uploadhandler.MemoryFileUploadHandler", - "django.core.files.uploadhandler.TemporaryFileUploadHandler", -] - -# Maximum size, in bytes, of a request before it will be streamed to the -# file system instead of into memory. -FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB - -# Maximum size in bytes of request data (excluding file uploads) that will be -# read before a SuspiciousOperation (RequestDataTooBig) is raised. -DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB - -# Maximum number of GET/POST parameters that will be read before a -# SuspiciousOperation (TooManyFieldsSent) is raised. -DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000 - -# Maximum number of files encoded in a multipart upload that will be read -# before a SuspiciousOperation (TooManyFilesSent) is raised. -DATA_UPLOAD_MAX_NUMBER_FILES = 100 - -# Directory in which upload streamed files will be temporarily saved. A value of -# `None` will make Django use the operating system's default temporary directory -# (i.e. "/tmp" on *nix systems). -FILE_UPLOAD_TEMP_DIR = None - -# The numeric mode to set newly-uploaded files to. The value should be a mode -# you'd pass directly to os.chmod; see -# https://docs.python.org/library/os.html#files-and-directories. -FILE_UPLOAD_PERMISSIONS = 0o644 - -# The numeric mode to assign to newly-created directories, when uploading files. -# The value should be a mode as you'd pass to os.chmod; -# see https://docs.python.org/library/os.html#files-and-directories. -FILE_UPLOAD_DIRECTORY_PERMISSIONS = None - -# Python module path where user will place custom format definition. -# The directory where this setting is pointing should contain subdirectories -# named as the locales, containing a formats.py file -# (i.e. "myproject.locale" for myproject/locale/en/formats.py etc. use) -FORMAT_MODULE_PATH = None - -# Default formatting for date objects. See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "N j, Y" - -# Default formatting for datetime objects. See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATETIME_FORMAT = "N j, Y, P" - -# Default formatting for time objects. See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -TIME_FORMAT = "P" - -# Default formatting for date objects when only the year and month are relevant. -# See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -YEAR_MONTH_FORMAT = "F Y" - -# Default formatting for date objects when only the month and day are relevant. -# See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -MONTH_DAY_FORMAT = "F j" - -# Default short formatting for date objects. See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -SHORT_DATE_FORMAT = "m/d/Y" - -# Default short formatting for datetime objects. -# See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -SHORT_DATETIME_FORMAT = "m/d/Y P" - -# Default formats to be used when parsing dates from input boxes, in order -# See all available format string here: -# https://docs.python.org/library/datetime.html#strftime-behavior -# * Note that these format strings are different from the ones to display dates -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' - "%b %d %Y", # 'Oct 25 2006' - "%b %d, %Y", # 'Oct 25, 2006' - "%d %b %Y", # '25 Oct 2006' - "%d %b, %Y", # '25 Oct, 2006' - "%B %d %Y", # 'October 25 2006' - "%B %d, %Y", # 'October 25, 2006' - "%d %B %Y", # '25 October 2006' - "%d %B, %Y", # '25 October, 2006' -] - -# Default formats to be used when parsing times from input boxes, in order -# See all available format string here: -# https://docs.python.org/library/datetime.html#strftime-behavior -# * Note that these format strings are different from the ones to display dates -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' -] - -# Default formats to be used when parsing dates and times from input boxes, -# in order -# See all available format string here: -# https://docs.python.org/library/datetime.html#strftime-behavior -# * Note that these format strings are different from the ones to display dates -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' -] - -# First day of week, to be used on calendars -# 0 means Sunday, 1 means Monday... -FIRST_DAY_OF_WEEK = 0 - -# Decimal separator symbol -DECIMAL_SEPARATOR = "." - -# Boolean that sets whether to add thousand separator when formatting numbers -USE_THOUSAND_SEPARATOR = False - -# Number of digits that will be together, when splitting them by -# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands... -NUMBER_GROUPING = 0 - -# Thousand separator symbol -THOUSAND_SEPARATOR = "," - -# The tablespaces to use for each model when not specified otherwise. -DEFAULT_TABLESPACE = "" -DEFAULT_INDEX_TABLESPACE = "" - -# Default primary key field type. -DEFAULT_AUTO_FIELD = "django.db.models.AutoField" - -# Default X-Frame-Options header value -X_FRAME_OPTIONS = "DENY" - -USE_X_FORWARDED_HOST = False -USE_X_FORWARDED_PORT = False - -# The Python dotted path to the WSGI application that Django's internal server -# (runserver) will use. If `None`, the return value of -# 'django.core.wsgi.get_wsgi_application' is used, thus preserving the same -# behavior as previous versions of Django. Otherwise this should point to an -# actual WSGI application object. -WSGI_APPLICATION = None - -# If your Django app is behind a proxy that sets a header to specify secure -# connections, AND that proxy ensures that user-submitted headers with the -# same name are ignored (so that people can't spoof it), set this value to -# a tuple of (header_name, header_value). For any requests that come in with -# that header/value, request.is_secure() will return True. -# WARNING! Only set this if you fully understand what you're doing. Otherwise, -# you may be opening yourself up to a security risk. -SECURE_PROXY_SSL_HEADER = None - -############## -# MIDDLEWARE # -############## - -# List of middleware to use. Order is important; in the request phase, these -# middleware will be applied in the order given, and in the response -# phase the middleware will be applied in reverse order. -MIDDLEWARE = [] - -############ -# SESSIONS # -############ - -# Cache to store session data if using the cache session backend. -SESSION_CACHE_ALIAS = "default" -# Cookie name. This can be whatever you want. -SESSION_COOKIE_NAME = "sessionid" -# Age of cookie, in seconds (default: 2 weeks). -SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 -# A string like "example.com", or None for standard domain cookie. -SESSION_COOKIE_DOMAIN = None -# Whether the session cookie should be secure (https:// only). -SESSION_COOKIE_SECURE = False -# The path of the session cookie. -SESSION_COOKIE_PATH = "/" -# Whether to use the HttpOnly flag. -SESSION_COOKIE_HTTPONLY = True -# Whether to set the flag restricting cookie leaks on cross-site requests. -# This can be 'Lax', 'Strict', 'None', or False to disable the flag. -SESSION_COOKIE_SAMESITE = "Lax" -# Whether to save the session data on every request. -SESSION_SAVE_EVERY_REQUEST = False -# Whether a user's session cookie expires when the web browser is closed. -SESSION_EXPIRE_AT_BROWSER_CLOSE = False -# The module to store session data -SESSION_ENGINE = "django.contrib.sessions.backends.db" -# Directory to store session files if using the file session module. If None, -# the backend will use a sensible default. -SESSION_FILE_PATH = None -# class to serialize session data -SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer" - -######### -# CACHE # -######### - -# The cache backends to use. -CACHES = { - "default": { - "BACKEND": "django.core.cache.backends.locmem.LocMemCache", - } -} -CACHE_MIDDLEWARE_KEY_PREFIX = "" -CACHE_MIDDLEWARE_SECONDS = 600 -CACHE_MIDDLEWARE_ALIAS = "default" - -################## -# AUTHENTICATION # -################## - -AUTH_USER_MODEL = "auth.User" - -AUTHENTICATION_BACKENDS = ["django.contrib.auth.backends.ModelBackend"] - -LOGIN_URL = "/accounts/login/" - -LOGIN_REDIRECT_URL = "/accounts/profile/" - -LOGOUT_REDIRECT_URL = None - -# The number of seconds a password reset link is valid for (default: 3 days). -PASSWORD_RESET_TIMEOUT = 60 * 60 * 24 * 3 - -# the first hasher in this list is the preferred algorithm. any -# password using different algorithms will be converted automatically -# upon login -PASSWORD_HASHERS = [ - "django.contrib.auth.hashers.PBKDF2PasswordHasher", - "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher", - "django.contrib.auth.hashers.Argon2PasswordHasher", - "django.contrib.auth.hashers.BCryptSHA256PasswordHasher", - "django.contrib.auth.hashers.ScryptPasswordHasher", -] - -AUTH_PASSWORD_VALIDATORS = [] - -########### -# SIGNING # -########### - -SIGNING_BACKEND = "django.core.signing.TimestampSigner" - -######## -# CSRF # -######## - -# Dotted path to callable to be used as view when a request is -# rejected by the CSRF middleware. -CSRF_FAILURE_VIEW = "django.views.csrf.csrf_failure" - -# Settings for CSRF cookie. -CSRF_COOKIE_NAME = "csrftoken" -CSRF_COOKIE_AGE = 60 * 60 * 24 * 7 * 52 -CSRF_COOKIE_DOMAIN = None -CSRF_COOKIE_PATH = "/" -CSRF_COOKIE_SECURE = False -CSRF_COOKIE_HTTPONLY = False -CSRF_COOKIE_SAMESITE = "Lax" -CSRF_HEADER_NAME = "HTTP_X_CSRFTOKEN" -CSRF_TRUSTED_ORIGINS = [] -CSRF_USE_SESSIONS = False - -############ -# MESSAGES # -############ - -# Class to use as messages backend -MESSAGE_STORAGE = "django.contrib.messages.storage.fallback.FallbackStorage" - -# Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within -# django.contrib.messages to avoid imports in this settings file. - -########### -# LOGGING # -########### - -# The callable to use to configure logging -LOGGING_CONFIG = "logging.config.dictConfig" - -# Custom logging configuration. -LOGGING = {} - -# Default exception reporter class used in case none has been -# specifically assigned to the HttpRequest instance. -DEFAULT_EXCEPTION_REPORTER = "django.views.debug.ExceptionReporter" - -# Default exception reporter filter class used in case none has been -# specifically assigned to the HttpRequest instance. -DEFAULT_EXCEPTION_REPORTER_FILTER = "django.views.debug.SafeExceptionReporterFilter" - -########### -# TESTING # -########### - -# The name of the class to use to run the test suite -TEST_RUNNER = "django.test.runner.DiscoverRunner" - -# Apps that don't need to be serialized at test database creation time -# (only apps with migrations are to start with) -TEST_NON_SERIALIZED_APPS = [] - -############ -# FIXTURES # -############ - -# The list of directories to search for fixtures -FIXTURE_DIRS = [] - -############### -# STATICFILES # -############### - -# A list of locations of additional static files -STATICFILES_DIRS = [] - -# List of finder classes that know how to find static files in -# various locations. -STATICFILES_FINDERS = [ - "django.contrib.staticfiles.finders.FileSystemFinder", - "django.contrib.staticfiles.finders.AppDirectoriesFinder", - # 'django.contrib.staticfiles.finders.DefaultStorageFinder', -] - -############## -# MIGRATIONS # -############## - -# Migration module overrides for apps, by app label. -MIGRATION_MODULES = {} - -################# -# SYSTEM CHECKS # -################# - -# List of all issues generated by system checks that should be silenced. Light -# issues like warnings, infos or debugs will not generate a message. Silencing -# serious issues like errors and criticals does not result in hiding the -# message, but Django will not stop you from e.g. running server. -SILENCED_SYSTEM_CHECKS = [] - -####################### -# SECURITY MIDDLEWARE # -####################### -SECURE_CONTENT_TYPE_NOSNIFF = True -SECURE_CROSS_ORIGIN_OPENER_POLICY = "same-origin" -SECURE_HSTS_INCLUDE_SUBDOMAINS = False -SECURE_HSTS_PRELOAD = False -SECURE_HSTS_SECONDS = 0 -SECURE_REDIRECT_EXEMPT = [] -SECURE_REFERRER_POLICY = "same-origin" -SECURE_SSL_HOST = None -SECURE_SSL_REDIRECT = False diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/__init__.py deleted file mode 100644 index 6ac7bd3..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/__init__.py +++ /dev/null @@ -1,629 +0,0 @@ -""" -LANG_INFO is a dictionary structure to provide meta information about languages. - -About name_local: capitalize it as if your language name was appearing -inside a sentence in your language. -The 'fallback' key can be used to specify a special fallback logic which doesn't -follow the traditional 'fr-ca' -> 'fr' fallback logic. -""" - -LANG_INFO = { - "af": { - "bidi": False, - "code": "af", - "name": "Afrikaans", - "name_local": "Afrikaans", - }, - "ar": { - "bidi": True, - "code": "ar", - "name": "Arabic", - "name_local": "العربيّة", - }, - "ar-dz": { - "bidi": True, - "code": "ar-dz", - "name": "Algerian Arabic", - "name_local": "العربية الجزائرية", - }, - "ast": { - "bidi": False, - "code": "ast", - "name": "Asturian", - "name_local": "asturianu", - }, - "az": { - "bidi": True, - "code": "az", - "name": "Azerbaijani", - "name_local": "Azərbaycanca", - }, - "be": { - "bidi": False, - "code": "be", - "name": "Belarusian", - "name_local": "беларуская", - }, - "bg": { - "bidi": False, - "code": "bg", - "name": "Bulgarian", - "name_local": "български", - }, - "bn": { - "bidi": False, - "code": "bn", - "name": "Bengali", - "name_local": "বাংলা", - }, - "br": { - "bidi": False, - "code": "br", - "name": "Breton", - "name_local": "brezhoneg", - }, - "bs": { - "bidi": False, - "code": "bs", - "name": "Bosnian", - "name_local": "bosanski", - }, - "ca": { - "bidi": False, - "code": "ca", - "name": "Catalan", - "name_local": "català", - }, - "ckb": { - "bidi": True, - "code": "ckb", - "name": "Central Kurdish (Sorani)", - "name_local": "کوردی", - }, - "cs": { - "bidi": False, - "code": "cs", - "name": "Czech", - "name_local": "česky", - }, - "cy": { - "bidi": False, - "code": "cy", - "name": "Welsh", - "name_local": "Cymraeg", - }, - "da": { - "bidi": False, - "code": "da", - "name": "Danish", - "name_local": "dansk", - }, - "de": { - "bidi": False, - "code": "de", - "name": "German", - "name_local": "Deutsch", - }, - "dsb": { - "bidi": False, - "code": "dsb", - "name": "Lower Sorbian", - "name_local": "dolnoserbski", - }, - "el": { - "bidi": False, - "code": "el", - "name": "Greek", - "name_local": "Ελληνικά", - }, - "en": { - "bidi": False, - "code": "en", - "name": "English", - "name_local": "English", - }, - "en-au": { - "bidi": False, - "code": "en-au", - "name": "Australian English", - "name_local": "Australian English", - }, - "en-gb": { - "bidi": False, - "code": "en-gb", - "name": "British English", - "name_local": "British English", - }, - "eo": { - "bidi": False, - "code": "eo", - "name": "Esperanto", - "name_local": "Esperanto", - }, - "es": { - "bidi": False, - "code": "es", - "name": "Spanish", - "name_local": "español", - }, - "es-ar": { - "bidi": False, - "code": "es-ar", - "name": "Argentinian Spanish", - "name_local": "español de Argentina", - }, - "es-co": { - "bidi": False, - "code": "es-co", - "name": "Colombian Spanish", - "name_local": "español de Colombia", - }, - "es-mx": { - "bidi": False, - "code": "es-mx", - "name": "Mexican Spanish", - "name_local": "español de Mexico", - }, - "es-ni": { - "bidi": False, - "code": "es-ni", - "name": "Nicaraguan Spanish", - "name_local": "español de Nicaragua", - }, - "es-ve": { - "bidi": False, - "code": "es-ve", - "name": "Venezuelan Spanish", - "name_local": "español de Venezuela", - }, - "et": { - "bidi": False, - "code": "et", - "name": "Estonian", - "name_local": "eesti", - }, - "eu": { - "bidi": False, - "code": "eu", - "name": "Basque", - "name_local": "Basque", - }, - "fa": { - "bidi": True, - "code": "fa", - "name": "Persian", - "name_local": "فارسی", - }, - "fi": { - "bidi": False, - "code": "fi", - "name": "Finnish", - "name_local": "suomi", - }, - "fr": { - "bidi": False, - "code": "fr", - "name": "French", - "name_local": "français", - }, - "fy": { - "bidi": False, - "code": "fy", - "name": "Frisian", - "name_local": "frysk", - }, - "ga": { - "bidi": False, - "code": "ga", - "name": "Irish", - "name_local": "Gaeilge", - }, - "gd": { - "bidi": False, - "code": "gd", - "name": "Scottish Gaelic", - "name_local": "Gàidhlig", - }, - "gl": { - "bidi": False, - "code": "gl", - "name": "Galician", - "name_local": "galego", - }, - "he": { - "bidi": True, - "code": "he", - "name": "Hebrew", - "name_local": "עברית", - }, - "hi": { - "bidi": False, - "code": "hi", - "name": "Hindi", - "name_local": "हिंदी", - }, - "hr": { - "bidi": False, - "code": "hr", - "name": "Croatian", - "name_local": "Hrvatski", - }, - "hsb": { - "bidi": False, - "code": "hsb", - "name": "Upper Sorbian", - "name_local": "hornjoserbsce", - }, - "hu": { - "bidi": False, - "code": "hu", - "name": "Hungarian", - "name_local": "Magyar", - }, - "hy": { - "bidi": False, - "code": "hy", - "name": "Armenian", - "name_local": "հայերեն", - }, - "ia": { - "bidi": False, - "code": "ia", - "name": "Interlingua", - "name_local": "Interlingua", - }, - "io": { - "bidi": False, - "code": "io", - "name": "Ido", - "name_local": "ido", - }, - "id": { - "bidi": False, - "code": "id", - "name": "Indonesian", - "name_local": "Bahasa Indonesia", - }, - "ig": { - "bidi": False, - "code": "ig", - "name": "Igbo", - "name_local": "Asụsụ Ìgbò", - }, - "is": { - "bidi": False, - "code": "is", - "name": "Icelandic", - "name_local": "Íslenska", - }, - "it": { - "bidi": False, - "code": "it", - "name": "Italian", - "name_local": "italiano", - }, - "ja": { - "bidi": False, - "code": "ja", - "name": "Japanese", - "name_local": "日本語", - }, - "ka": { - "bidi": False, - "code": "ka", - "name": "Georgian", - "name_local": "ქართული", - }, - "kab": { - "bidi": False, - "code": "kab", - "name": "Kabyle", - "name_local": "taqbaylit", - }, - "kk": { - "bidi": False, - "code": "kk", - "name": "Kazakh", - "name_local": "Қазақ", - }, - "km": { - "bidi": False, - "code": "km", - "name": "Khmer", - "name_local": "Khmer", - }, - "kn": { - "bidi": False, - "code": "kn", - "name": "Kannada", - "name_local": "Kannada", - }, - "ko": { - "bidi": False, - "code": "ko", - "name": "Korean", - "name_local": "한국어", - }, - "ky": { - "bidi": False, - "code": "ky", - "name": "Kyrgyz", - "name_local": "Кыргызча", - }, - "lb": { - "bidi": False, - "code": "lb", - "name": "Luxembourgish", - "name_local": "Lëtzebuergesch", - }, - "lt": { - "bidi": False, - "code": "lt", - "name": "Lithuanian", - "name_local": "Lietuviškai", - }, - "lv": { - "bidi": False, - "code": "lv", - "name": "Latvian", - "name_local": "latviešu", - }, - "mk": { - "bidi": False, - "code": "mk", - "name": "Macedonian", - "name_local": "Македонски", - }, - "ml": { - "bidi": False, - "code": "ml", - "name": "Malayalam", - "name_local": "മലയാളം", - }, - "mn": { - "bidi": False, - "code": "mn", - "name": "Mongolian", - "name_local": "Mongolian", - }, - "mr": { - "bidi": False, - "code": "mr", - "name": "Marathi", - "name_local": "मराठी", - }, - "ms": { - "bidi": False, - "code": "ms", - "name": "Malay", - "name_local": "Bahasa Melayu", - }, - "my": { - "bidi": False, - "code": "my", - "name": "Burmese", - "name_local": "မြန်မာဘာသာ", - }, - "nb": { - "bidi": False, - "code": "nb", - "name": "Norwegian Bokmal", - "name_local": "norsk (bokmål)", - }, - "ne": { - "bidi": False, - "code": "ne", - "name": "Nepali", - "name_local": "नेपाली", - }, - "nl": { - "bidi": False, - "code": "nl", - "name": "Dutch", - "name_local": "Nederlands", - }, - "nn": { - "bidi": False, - "code": "nn", - "name": "Norwegian Nynorsk", - "name_local": "norsk (nynorsk)", - }, - "no": { - "bidi": False, - "code": "no", - "name": "Norwegian", - "name_local": "norsk", - }, - "os": { - "bidi": False, - "code": "os", - "name": "Ossetic", - "name_local": "Ирон", - }, - "pa": { - "bidi": False, - "code": "pa", - "name": "Punjabi", - "name_local": "Punjabi", - }, - "pl": { - "bidi": False, - "code": "pl", - "name": "Polish", - "name_local": "polski", - }, - "pt": { - "bidi": False, - "code": "pt", - "name": "Portuguese", - "name_local": "Português", - }, - "pt-br": { - "bidi": False, - "code": "pt-br", - "name": "Brazilian Portuguese", - "name_local": "Português Brasileiro", - }, - "ro": { - "bidi": False, - "code": "ro", - "name": "Romanian", - "name_local": "Română", - }, - "ru": { - "bidi": False, - "code": "ru", - "name": "Russian", - "name_local": "Русский", - }, - "sk": { - "bidi": False, - "code": "sk", - "name": "Slovak", - "name_local": "slovensky", - }, - "sl": { - "bidi": False, - "code": "sl", - "name": "Slovenian", - "name_local": "Slovenščina", - }, - "sq": { - "bidi": False, - "code": "sq", - "name": "Albanian", - "name_local": "shqip", - }, - "sr": { - "bidi": False, - "code": "sr", - "name": "Serbian", - "name_local": "српски", - }, - "sr-latn": { - "bidi": False, - "code": "sr-latn", - "name": "Serbian Latin", - "name_local": "srpski (latinica)", - }, - "sv": { - "bidi": False, - "code": "sv", - "name": "Swedish", - "name_local": "svenska", - }, - "sw": { - "bidi": False, - "code": "sw", - "name": "Swahili", - "name_local": "Kiswahili", - }, - "ta": { - "bidi": False, - "code": "ta", - "name": "Tamil", - "name_local": "தமிழ்", - }, - "te": { - "bidi": False, - "code": "te", - "name": "Telugu", - "name_local": "తెలుగు", - }, - "tg": { - "bidi": False, - "code": "tg", - "name": "Tajik", - "name_local": "тоҷикӣ", - }, - "th": { - "bidi": False, - "code": "th", - "name": "Thai", - "name_local": "ภาษาไทย", - }, - "tk": { - "bidi": False, - "code": "tk", - "name": "Turkmen", - "name_local": "Türkmençe", - }, - "tr": { - "bidi": False, - "code": "tr", - "name": "Turkish", - "name_local": "Türkçe", - }, - "tt": { - "bidi": False, - "code": "tt", - "name": "Tatar", - "name_local": "Татарча", - }, - "udm": { - "bidi": False, - "code": "udm", - "name": "Udmurt", - "name_local": "Удмурт", - }, - "ug": { - "bidi": True, - "code": "ug", - "name": "Uyghur", - "name_local": "ئۇيغۇرچە", - }, - "uk": { - "bidi": False, - "code": "uk", - "name": "Ukrainian", - "name_local": "Українська", - }, - "ur": { - "bidi": True, - "code": "ur", - "name": "Urdu", - "name_local": "اردو", - }, - "uz": { - "bidi": False, - "code": "uz", - "name": "Uzbek", - "name_local": "oʻzbek tili", - }, - "vi": { - "bidi": False, - "code": "vi", - "name": "Vietnamese", - "name_local": "Tiếng Việt", - }, - "zh-cn": { - "fallback": ["zh-hans"], - }, - "zh-hans": { - "bidi": False, - "code": "zh-hans", - "name": "Simplified Chinese", - "name_local": "简体中文", - }, - "zh-hant": { - "bidi": False, - "code": "zh-hant", - "name": "Traditional Chinese", - "name_local": "繁體中文", - }, - "zh-hk": { - "fallback": ["zh-hant"], - }, - "zh-mo": { - "fallback": ["zh-hant"], - }, - "zh-my": { - "fallback": ["zh-hans"], - }, - "zh-sg": { - "fallback": ["zh-hans"], - }, - "zh-tw": { - "fallback": ["zh-hant"], - }, -} diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index dfd34bc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/af/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index 5f6cbaf..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,1345 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2019-2020,2022-2025 -# Stephen Cox , 2011-2012 -# unklphil , 2014,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: F Wolff , 2019-2020,2022-2025\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabies" - -msgid "Algerian Arabic" -msgstr "Algeriese Arabies" - -msgid "Asturian" -msgstr "Asturies" - -msgid "Azerbaijani" -msgstr "Aserbeidjans" - -msgid "Bulgarian" -msgstr "Bulgaars" - -msgid "Belarusian" -msgstr "Wit-Russies" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Bretons" - -msgid "Bosnian" -msgstr "Bosnies" - -msgid "Catalan" -msgstr "Katalaans" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Tsjeggies" - -msgid "Welsh" -msgstr "Wallies" - -msgid "Danish" -msgstr "Deens" - -msgid "German" -msgstr "Duits" - -msgid "Lower Sorbian" -msgstr "Neder-Sorbies" - -msgid "Greek" -msgstr "Grieks" - -msgid "English" -msgstr "Engels" - -msgid "Australian English" -msgstr "Australiese Engels" - -msgid "British English" -msgstr "Britse Engels" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spaans" - -msgid "Argentinian Spanish" -msgstr "Argentynse Spaans" - -msgid "Colombian Spanish" -msgstr "Kolombiaanse Spaans" - -msgid "Mexican Spanish" -msgstr "Meksikaanse Spaans" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguaanse Spaans" - -msgid "Venezuelan Spanish" -msgstr "Venezolaanse Spaans" - -msgid "Estonian" -msgstr "Estnies" - -msgid "Basque" -msgstr "Baskies" - -msgid "Persian" -msgstr "Persies" - -msgid "Finnish" -msgstr "Fins" - -msgid "French" -msgstr "Fraans" - -msgid "Frisian" -msgstr "Fries" - -msgid "Irish" -msgstr "Iers" - -msgid "Scottish Gaelic" -msgstr "Skots-Gaelies" - -msgid "Galician" -msgstr "Galicies" - -msgid "Hebrew" -msgstr "Hebreeus" - -msgid "Hindi" -msgstr "Hindoe" - -msgid "Croatian" -msgstr "Kroaties" - -msgid "Upper Sorbian" -msgstr "Opper-Sorbies" - -msgid "Hungarian" -msgstr "Hongaars" - -msgid "Armenian" -msgstr "Armeens" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesies" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Yslands" - -msgid "Italian" -msgstr "Italiaans" - -msgid "Japanese" -msgstr "Japannees" - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kabyle" -msgstr "Kabilies" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreaans" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxemburgs" - -msgid "Lithuanian" -msgstr "Litaus" - -msgid "Latvian" -msgstr "Lets" - -msgid "Macedonian" -msgstr "Macedonies" - -msgid "Malayalam" -msgstr "Malabaars" - -msgid "Mongolian" -msgstr "Mongools" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Maleisies" - -msgid "Burmese" -msgstr "Birmaans" - -msgid "Norwegian Bokmål" -msgstr "Noorweegse Bokmål" - -msgid "Nepali" -msgstr "Nepalees" - -msgid "Dutch" -msgstr "Nederlands" - -msgid "Norwegian Nynorsk" -msgstr "Noorweegse Nynorsk" - -msgid "Ossetic" -msgstr "Osseties" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Pools" - -msgid "Portuguese" -msgstr "Portugees" - -msgid "Brazilian Portuguese" -msgstr "Brasiliaanse Portugees" - -msgid "Romanian" -msgstr "Roemeens" - -msgid "Russian" -msgstr "Russiese" - -msgid "Slovak" -msgstr "Slowaaks" - -msgid "Slovenian" -msgstr "Sloweens" - -msgid "Albanian" -msgstr "Albanees" - -msgid "Serbian" -msgstr "Serwies" - -msgid "Serbian Latin" -msgstr "Serwies Latyns" - -msgid "Swedish" -msgstr "Sweeds" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Teloegoe" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turks" - -msgid "Tatar" -msgstr "Tataars" - -msgid "Udmurt" -msgstr "Oedmoerts" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "Oekraïens" - -msgid "Urdu" -msgstr "Oerdoe" - -msgid "Uzbek" -msgstr "Oesbekies " - -msgid "Vietnamese" -msgstr "Viëtnamees" - -msgid "Simplified Chinese" -msgstr "Vereenvoudigde Sjinees" - -msgid "Traditional Chinese" -msgstr "Tradisionele Sjinees" - -msgid "Messages" -msgstr "Boodskappe" - -msgid "Site Maps" -msgstr "Werfkaarte" - -msgid "Static Files" -msgstr "Statiese lêers" - -msgid "Syndication" -msgstr "Sindikasie" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Daai bladsynommer is nie ’n heelgetal nie" - -msgid "That page number is less than 1" -msgstr "Daai bladsynommer is minder as 1" - -msgid "That page contains no results" -msgstr "Daai bladsy bevat geen resultate nie" - -msgid "Enter a valid value." -msgstr "Gee ’n geldige waarde." - -msgid "Enter a valid domain name." -msgstr "Gee ’n geldige domeinnaam." - -msgid "Enter a valid URL." -msgstr "Gee ’n geldige URL." - -msgid "Enter a valid integer." -msgstr "Gee ’n geldige heelgetal." - -msgid "Enter a valid email address." -msgstr "Gee ’n geldige e-posadres." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Gee ’n geldige “slak” wat bestaan ​​uit letters, syfers, onderstreep of " -"koppelteken." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Gee ’n geldige “slak” wat bestaan ​​uit Unicode-letters, syfers, onderstreep " -"of koppelteken." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Gee ’n geldige %(protocol)s-adres" - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 of IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Gee slegs syfers wat deur kommas geskei is." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Maak seker dat hierdie waarde %(limit_value)s is (dit is %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Maak seker dat hierdie waarde kleiner of gelyk is aan %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Maak seker dat hierdie waarde groter of gelyk is aan %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Maak seker dat hierdie waarde ’n veelvoud is van stapgrootte %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Maak seker dié waarde is 'n veelvoud van stapgrootte %(limit_value)s, " -"beginnende by %(offset)s, bv. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, ens. " - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Maak seker hierdie waarde het ten minste %(limit_value)d karakter (dit het " -"%(show_value)d)." -msgstr[1] "" -"Maak seker hierdie waarde het ten minste %(limit_value)d karakters (dit het " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Maak seker hierdie waarde het op die meeste %(limit_value)d karakter (dit " -"het %(show_value)d)." -msgstr[1] "" -"Maak seker hierdie waarde het op die meeste %(limit_value)d karakters (dit " -"het %(show_value)d)." - -msgid "Enter a number." -msgstr "Gee ’n getal." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Maak seker dat daar nie meer as %(max)s syfer in totaal is nie." -msgstr[1] "Maak seker dat daar nie meer as %(max)s syfers in totaal is nie." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Maak seker dat daar nie meer as %(max)s desimale plek is nie." -msgstr[1] "Maak seker dat daar nie meer as %(max)s desimale plekke is nie." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Maak seker dat daar nie meer as %(max)s syfer voor die desimale punt is nie." -msgstr[1] "" -"Maak seker dat daar nie meer as %(max)s syfers voor die desimale punt is nie." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Lêeruitbreiding “%(extension)s” word nie toegelaat nie. Toegelate " -"uitbreidings is: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Nul-karakters word nie toegelaat nie." - -msgid "and" -msgstr "en" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s met hierdie %(field_labels)s bestaan alreeds." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Beperking “%(name)s” word verbreek." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Waarde %(value)r is nie ’n geldige keuse nie." - -msgid "This field cannot be null." -msgstr "Hierdie veld kan nie nil wees nie." - -msgid "This field cannot be blank." -msgstr "Hierdie veld kan nie leeg wees nie." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s met hierdie %(field_label)s bestaan ​​alreeds." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s moet uniek wees per %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Veld van tipe: %(field_type)s " - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” waarde moet óf True óf False wees." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Die waarde “%(value)s” moet True, False of None wees." - -msgid "Boolean (Either True or False)" -msgstr "Boole (True of False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (hoogstens %(max_length)s karakters)" - -msgid "String (unlimited)" -msgstr "String (onbeperk)" - -msgid "Comma-separated integers" -msgstr "Heelgetalle geskei met kommas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Die waarde “%(value)s” het ’n ongeldige datumformaat. Dit moet in die " -"formaat JJJJ-MM-DD wees." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Die waarde “%(value)s” het die korrekte formaat (JJJJ-MM-DD), maar dit is ’n " -"ongeldige datum." - -msgid "Date (without time)" -msgstr "Datum (sonder die tyd)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Die waarde “%(value)s” se formaat is ongeldig. Dit moet in die formaat JJJJ-" -"MM-DD HH:MM[:ss[.uuuuuu]][TZ] wees." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Die waarde “%(value)s” het die korrekte formaat (JJJJ-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]) maar dit is ’n ongeldige datum/tyd." - -msgid "Date (with time)" -msgstr "Datum (met die tyd)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s”-waarde moet ’n desimale getal wees." - -msgid "Decimal number" -msgstr "Desimale getal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Die waarde “%(value)s” het ’n ongeldige formaat. Dit moet in die formaat " -"[DD] [HH:[MM:]]ss[.uuuuuu] wees." - -msgid "Duration" -msgstr "Duur" - -msgid "Email address" -msgstr "E-posadres" - -msgid "File path" -msgstr "Lêerpad" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Die waarde “%(value)s” moet ’n dryfpuntgetal wees." - -msgid "Floating point number" -msgstr "Dryfpuntgetal" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Die waarde “%(value)s” moet ’n heelgetal wees." - -msgid "Integer" -msgstr "Heelgetal" - -msgid "Big (8 byte) integer" -msgstr "Groot (8 greep) heelgetal" - -msgid "Small integer" -msgstr "Klein heelgetal" - -msgid "IPv4 address" -msgstr "IPv4-adres" - -msgid "IP address" -msgstr "IP-adres" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s”-waarde moet een wees uit None, True of False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boole (True, False, of None)" - -msgid "Positive big integer" -msgstr "Positiewe groot heelgetal" - -msgid "Positive integer" -msgstr "Positiewe heelgetal" - -msgid "Positive small integer" -msgstr "Klein positiewe heelgetal" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (tot en met %(max_length)s karakters)" - -msgid "Text" -msgstr "Teks" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s”-waarde het ’n ongeldige formaat. Dit moet geformateer word as HH:" -"MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Die waarde “%(value)s” het die regte formaat (HH:MM[:ss[.uuuuuu]]) maar is " -"nie ’n geldige tyd nie." - -msgid "Time" -msgstr "Tyd" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Rou binêre data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” is nie ’n geldige UUID nie." - -msgid "Universally unique identifier" -msgstr "Universeel unieke identifiseerder" - -msgid "File" -msgstr "Lêer" - -msgid "Image" -msgstr "Prent" - -msgid "A JSON object" -msgstr "’n JSON-objek" - -msgid "Value must be valid JSON." -msgstr "Waarde moet geldige JSON wees." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s-objek met %(field)s %(value)r is nie ’n geldige keuse nie." - -msgid "Foreign Key (type determined by related field)" -msgstr "Vreemde sleutel (tipe bepaal deur verwante veld)" - -msgid "One-to-one relationship" -msgstr "Een-tot-een-verhouding" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-verwantskap" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-verwantskappe" - -msgid "Many-to-many relationship" -msgstr "Baie-tot-baie-verwantskap" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Dié veld is verpligtend." - -msgid "Enter a whole number." -msgstr "Tik ’n heelgetal in." - -msgid "Enter a valid date." -msgstr "Tik ’n geldige datum in." - -msgid "Enter a valid time." -msgstr "Tik ’n geldige tyd in." - -msgid "Enter a valid date/time." -msgstr "Tik ’n geldige datum/tyd in." - -msgid "Enter a valid duration." -msgstr "Tik ’n geldige tydsduur in." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Die aantal dae moet tussen {min_days} en {max_days} wees." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Geen lêer is ingedien nie. Maak seker die koderingtipe op die vorm is reg." - -msgid "No file was submitted." -msgstr "Geen lêer is ingedien nie." - -msgid "The submitted file is empty." -msgstr "Die ingediende lêer is leeg." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Maak seker hierdie lêernaam het hoogstens %(max)d karakter (dit het " -"%(length)d)." -msgstr[1] "" -"Maak seker hierdie lêernaam het hoogstens %(max)d karakters (dit het " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Dien die lêer in óf merk die Maak skoon-boksie, nie altwee nie." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Laai ’n geldige prent. Die lêer wat jy opgelaai het, is nie ’n prent nie of " -"dit is ’n korrupte prent." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Kies ’n geldige keuse. %(value)s is nie een van die beskikbare keuses nie." - -msgid "Enter a list of values." -msgstr "Tik ’n lys waardes in." - -msgid "Enter a complete value." -msgstr "Tik ’n volledige waarde in." - -msgid "Enter a valid UUID." -msgstr "Tik ’n geldig UUID in." - -msgid "Enter a valid JSON." -msgstr "Gee geldige JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Versteekte veld %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Dien asseblief hoogstens %(num)d vorm in." -msgstr[1] "Dien asseblief hoogstens %(num)d vorms in." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Dien asseblief ten minste %(num)d vorm in." -msgstr[1] "Dien asseblief ten minste %(num)d vorms in." - -msgid "Order" -msgstr "Orde" - -msgid "Delete" -msgstr "Verwyder" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Korrigeer die dubbele data vir %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Korrigeer die dubbele data vir %(field)s, dit moet uniek wees." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Korrigeer die dubbele data vir %(field_name)s, dit moet uniek wees vir die " -"%(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Korrigeer die dubbele waardes hieronder." - -msgid "The inline value did not match the parent instance." -msgstr "Die waarde inlyn pas nie by die ouerobjek nie." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Kies ’n geldige keuse. Daardie keuse is nie een van die beskikbare keuses " -"nie." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” is nie ’n geldige waarde nie." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kon nie in die tydsone %(current_timezone)s vertolk word nie; " -"dit is dalk dubbelsinnig, of bestaan dalk nie." - -msgid "Clear" -msgstr "Maak skoon" - -msgid "Currently" -msgstr "Tans" - -msgid "Change" -msgstr "Verander" - -msgid "Unknown" -msgstr "Onbekend" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nee" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nee,miskien" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d greep" -msgstr[1] "%(size)d grepe" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "nm." - -msgid "a.m." -msgstr "vm." - -msgid "PM" -msgstr "NM" - -msgid "AM" -msgstr "VM" - -msgid "midnight" -msgstr "middernag" - -msgid "noon" -msgstr "middag" - -msgid "Monday" -msgstr "Maandag" - -msgid "Tuesday" -msgstr "Dinsdag" - -msgid "Wednesday" -msgstr "Woensdag" - -msgid "Thursday" -msgstr "Donderdag" - -msgid "Friday" -msgstr "Vrydag" - -msgid "Saturday" -msgstr "Saterdag" - -msgid "Sunday" -msgstr "Sondag" - -msgid "Mon" -msgstr "Ma" - -msgid "Tue" -msgstr "Di" - -msgid "Wed" -msgstr "Wo" - -msgid "Thu" -msgstr "Do" - -msgid "Fri" -msgstr "Vr" - -msgid "Sat" -msgstr "Sa" - -msgid "Sun" -msgstr "So" - -msgid "January" -msgstr "Januarie" - -msgid "February" -msgstr "Februarie" - -msgid "March" -msgstr "Maart" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Junie" - -msgid "July" -msgstr "Julie" - -msgid "August" -msgstr "Augustus" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mrt" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mei" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sept" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "des" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Maart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junie" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julie" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Des." - -msgctxt "alt. month" -msgid "January" -msgstr "Januarie" - -msgctxt "alt. month" -msgid "February" -msgstr "Februarie" - -msgctxt "alt. month" -msgid "March" -msgstr "Maart" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mei" - -msgctxt "alt. month" -msgid "June" -msgstr "Junie" - -msgctxt "alt. month" -msgid "July" -msgstr "Julie" - -msgctxt "alt. month" -msgid "August" -msgstr "Augustus" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Desember" - -msgid "This is not a valid IPv6 address." -msgstr "Hierdie is nie ’n geldige IPv6-adres nie." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "of" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d jaar" -msgstr[1] "%(num)d jaar" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d maand" -msgstr[1] "%(num)d maande" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d week" -msgstr[1] "%(num)d weke" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dae" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uur" -msgstr[1] "%(num)d uur" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuut" -msgstr[1] "%(num)d minute" - -msgid "Forbidden" -msgstr "Verbode" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verifikasie het misluk. Versoek is laat val." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"U sien hierdie boodskap omdat dié HTTPS-werf vereis dat u webblaaier ’n " -"“Referer header” moet stuur, maar dit is nie gestuur nie. Hierdie header is " -"vir sekuriteitsredes nodig om te verseker dat u blaaier nie deur derde " -"partye gekaap is nie." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"As “Referer headers” in u blaaier gedeaktiveer is, heraktiveer hulle asb. " -"ten minste vir dié werf, of vir HTTPS-verbindings, of vir “same-origin”-" -"versoeke." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Indien u die -etiket gebruik " -"of die “Referrer-Policy: no-referrer” header gebruik, verwyder hulle asb. " -"Die CSRF-beskerming vereis die “Referer” header om streng kontrole van die " -"verwysende bladsy te doen. Indien u besorg is oor privaatheid, gebruik " -"alternatiewe soos vir skakels na derdepartywebwerwe." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"U sien hierdie boodskap omdat dié werf ’n CSRF-koekie benodig wanneer vorms " -"ingedien word. Dié koekie word vir sekuriteitsredes benodig om te te " -"verseker dat u blaaier nie deur derde partye gekaap word nie." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Indien koekies in u blaaier gedeaktiveer is, aktiveerder hulle asb. ten " -"minste vir dié werf, of vir “same-origin”-versoeke." - -msgid "More information is available with DEBUG=True." -msgstr "Meer inligting is beskikbaar met DEBUG=True." - -msgid "No year specified" -msgstr "Geen jaar gespesifiseer nie" - -msgid "Date out of range" -msgstr "Datum buite omvang" - -msgid "No month specified" -msgstr "Geen maand gespesifiseer nie" - -msgid "No day specified" -msgstr "Geen dag gespesifiseer nie" - -msgid "No week specified" -msgstr "Geen week gespesifiseer nie" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Geen %(verbose_name_plural)s beskikbaar nie" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Toekomstige %(verbose_name_plural)s is nie beskikbaar nie, omdat " -"%(class_name)s.allow_future vals is." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ongeldige datumstring “%(datestr)s” gegewe die formaat “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Geen %(verbose_name)s gevind vir die soektog" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Bladsy is nie “last” nie, en dit kan nie omgeskakel word na ’n heelgetal nie." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ongeldige bladsy (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Leë lys en “%(class_name)s.allow_empty” is vals." - -msgid "Directory indexes are not allowed here." -msgstr "Gidsindekse word nie hier toegelaat nie." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” bestaan nie." - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks van %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Die installasie was suksesvol! Geluk!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Sien die vrystellingsnotas vir Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"U sien dié bladsy omdat DEBUG=True in die settings-lêer is en geen URL’e " -"opgestel is nie." - -msgid "Django Documentation" -msgstr "Django-dokumentasie" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "Kom aan die gang met Django" - -msgid "Django Community" -msgstr "Django-gemeenskap" - -msgid "Connect, get help, or contribute" -msgstr "Kontak, kry hulp om dra by" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index f0a0412..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index 25a491b..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,1389 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2015-2016,2020-2021 -# Bashar Al-Abdulhadi, 2014 -# Eyad Toma , 2013-2014 -# Jannis Leidel , 2011 -# Mariusz Felisiak , 2021 -# Muaaz Alsaied, 2020 -# Omar Al-Ithawi , 2020 -# Ossama Khayat , 2011 -# Tony xD , 2020 -# صفا الفليج , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-24 16:27+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Afrikaans" -msgstr "الإفريقية" - -msgid "Arabic" -msgstr "العربيّة" - -msgid "Algerian Arabic" -msgstr "عربي جزائري" - -msgid "Asturian" -msgstr "الأسترية" - -msgid "Azerbaijani" -msgstr "الأذربيجانية" - -msgid "Bulgarian" -msgstr "البلغاريّة" - -msgid "Belarusian" -msgstr "البيلاروسية" - -msgid "Bengali" -msgstr "البنغاليّة" - -msgid "Breton" -msgstr "البريتونية" - -msgid "Bosnian" -msgstr "البوسنيّة" - -msgid "Catalan" -msgstr "الكتلانيّة" - -msgid "Czech" -msgstr "التشيكيّة" - -msgid "Welsh" -msgstr "الويلز" - -msgid "Danish" -msgstr "الدنماركيّة" - -msgid "German" -msgstr "الألمانيّة" - -msgid "Lower Sorbian" -msgstr "الصربية السفلى" - -msgid "Greek" -msgstr "اليونانيّة" - -msgid "English" -msgstr "الإنجليزيّة" - -msgid "Australian English" -msgstr "الإنجليزية الإسترالية" - -msgid "British English" -msgstr "الإنجليزيّة البريطانيّة" - -msgid "Esperanto" -msgstr "الاسبرانتو" - -msgid "Spanish" -msgstr "الإسبانيّة" - -msgid "Argentinian Spanish" -msgstr "الأسبانية الأرجنتينية" - -msgid "Colombian Spanish" -msgstr "الكولومبية الإسبانية" - -msgid "Mexican Spanish" -msgstr "الأسبانية المكسيكية" - -msgid "Nicaraguan Spanish" -msgstr "الإسبانية النيكاراغوية" - -msgid "Venezuelan Spanish" -msgstr "الإسبانية الفنزويلية" - -msgid "Estonian" -msgstr "الإستونيّة" - -msgid "Basque" -msgstr "الباسك" - -msgid "Persian" -msgstr "الفارسيّة" - -msgid "Finnish" -msgstr "الفنلنديّة" - -msgid "French" -msgstr "الفرنسيّة" - -msgid "Frisian" -msgstr "الفريزيّة" - -msgid "Irish" -msgstr "الإيرلنديّة" - -msgid "Scottish Gaelic" -msgstr "الغيلية الأسكتلندية" - -msgid "Galician" -msgstr "الجليقيّة" - -msgid "Hebrew" -msgstr "العبريّة" - -msgid "Hindi" -msgstr "الهندية" - -msgid "Croatian" -msgstr "الكرواتيّة" - -msgid "Upper Sorbian" -msgstr "الصربية العليا" - -msgid "Hungarian" -msgstr "الهنغاريّة" - -msgid "Armenian" -msgstr "الأرمنية" - -msgid "Interlingua" -msgstr "اللغة الوسيطة" - -msgid "Indonesian" -msgstr "الإندونيسيّة" - -msgid "Igbo" -msgstr "الإيبو" - -msgid "Ido" -msgstr "ايدو" - -msgid "Icelandic" -msgstr "الآيسلنديّة" - -msgid "Italian" -msgstr "الإيطاليّة" - -msgid "Japanese" -msgstr "اليابانيّة" - -msgid "Georgian" -msgstr "الجورجيّة" - -msgid "Kabyle" -msgstr "القبائل" - -msgid "Kazakh" -msgstr "الكازاخستانية" - -msgid "Khmer" -msgstr "الخمر" - -msgid "Kannada" -msgstr "الهنديّة (كنّادا)" - -msgid "Korean" -msgstr "الكوريّة" - -msgid "Kyrgyz" -msgstr "قيرغيز" - -msgid "Luxembourgish" -msgstr "اللوكسمبرجية" - -msgid "Lithuanian" -msgstr "اللتوانيّة" - -msgid "Latvian" -msgstr "اللاتفيّة" - -msgid "Macedonian" -msgstr "المقدونيّة" - -msgid "Malayalam" -msgstr "المايالام" - -msgid "Mongolian" -msgstr "المنغوليّة" - -msgid "Marathi" -msgstr "المهاراتية" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "البورمية" - -msgid "Norwegian Bokmål" -msgstr "النرويجية" - -msgid "Nepali" -msgstr "النيبالية" - -msgid "Dutch" -msgstr "الهولنديّة" - -msgid "Norwegian Nynorsk" -msgstr "النينورسك نرويجيّة" - -msgid "Ossetic" -msgstr "الأوسيتيكية" - -msgid "Punjabi" -msgstr "البنجابيّة" - -msgid "Polish" -msgstr "البولنديّة" - -msgid "Portuguese" -msgstr "البرتغاليّة" - -msgid "Brazilian Portuguese" -msgstr "البرتغاليّة البرازيليّة" - -msgid "Romanian" -msgstr "الرومانيّة" - -msgid "Russian" -msgstr "الروسيّة" - -msgid "Slovak" -msgstr "السلوفاكيّة" - -msgid "Slovenian" -msgstr "السلوفانيّة" - -msgid "Albanian" -msgstr "الألبانيّة" - -msgid "Serbian" -msgstr "الصربيّة" - -msgid "Serbian Latin" -msgstr "اللاتينيّة الصربيّة" - -msgid "Swedish" -msgstr "السويديّة" - -msgid "Swahili" -msgstr "السواحلية" - -msgid "Tamil" -msgstr "التاميل" - -msgid "Telugu" -msgstr "التيلوغو" - -msgid "Tajik" -msgstr "طاجيك" - -msgid "Thai" -msgstr "التايلنديّة" - -msgid "Turkmen" -msgstr "تركمان" - -msgid "Turkish" -msgstr "التركيّة" - -msgid "Tatar" -msgstr "التتاريية" - -msgid "Udmurt" -msgstr "الأدمرتية" - -msgid "Ukrainian" -msgstr "الأكرانيّة" - -msgid "Urdu" -msgstr "الأوردو" - -msgid "Uzbek" -msgstr "الأوزبكي" - -msgid "Vietnamese" -msgstr "الفيتناميّة" - -msgid "Simplified Chinese" -msgstr "الصينيّة المبسطة" - -msgid "Traditional Chinese" -msgstr "الصينيّة التقليدية" - -msgid "Messages" -msgstr "الرسائل" - -msgid "Site Maps" -msgstr "خرائط الموقع" - -msgid "Static Files" -msgstr "الملفات الثابتة" - -msgid "Syndication" -msgstr "توظيف النشر" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "رقم الصفحة هذا ليس عدداً طبيعياً" - -msgid "That page number is less than 1" -msgstr "رقم الصفحة أقل من 1" - -msgid "That page contains no results" -msgstr "هذه الصفحة لا تحتوي على نتائج" - -msgid "Enter a valid value." -msgstr "أدخِل قيمة صحيحة." - -msgid "Enter a valid URL." -msgstr "أدخِل رابطًا صحيحًا." - -msgid "Enter a valid integer." -msgstr "أدخِل عدداً طبيعياً." - -msgid "Enter a valid email address." -msgstr "أدخِل عنوان بريد إلكتروني صحيح." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "أدخل اختصار 'slug' صحيح يتكوّن من أحرف، أرقام، شرطات سفلية وعاديّة." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"أدخل اختصار 'slug' صحيح يتكون من أحرف Unicode أو أرقام أو شرطات سفلية أو " -"واصلات." - -msgid "Enter a valid IPv4 address." -msgstr "أدخِل عنوان IPv4 صحيح." - -msgid "Enter a valid IPv6 address." -msgstr "أدخِل عنوان IPv6 صحيح." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "أدخِل عنوان IPv4 أو عنوان IPv6 صحيح." - -msgid "Enter only digits separated by commas." -msgstr "أدخِل فقط أرقامًا تفصلها الفواصل." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "تحقق من أن هذه القيمة هي %(limit_value)s (إنها %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "تحقق من أن تكون هذه القيمة أقل من %(limit_value)s أو مساوية لها." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "تحقق من أن تكون هذه القيمة أكثر من %(limit_value)s أو مساوية لها." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[1] "" -"تأكد أن هذه القيمة تحتوي على حرف أو رمز %(limit_value)d على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[2] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف و رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[3] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[4] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[5] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[1] "" -"تأكد أن هذه القيمة تحتوي على حرف أو رمز %(limit_value)d على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[2] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف و رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[3] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[4] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[5] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." - -msgid "Enter a number." -msgstr "أدخل رقماً." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[1] "تحقق من أن تدخل رقم %(max)s لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s رقمين لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s أرقام لا أكثر." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[1] "تحقق من أن تدخل خانة %(max)s عشرية لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s خانتين عشريتين لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[1] "تحقق من أن تدخل رقم %(max)s قبل الفاصل العشري لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s رقمين قبل الفاصل العشري لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"امتداد الملف “%(extension)s” غير مسموح به. الامتدادات المسموح بها هي:" -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "الأحرف الخالية غير مسموح بها." - -msgid "and" -msgstr "و" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s بهذا %(field_labels)s موجود سلفاً." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "القيمة %(value)r ليست خيارا صحيحاً." - -msgid "This field cannot be null." -msgstr "لا يمكن تعيين null كقيمة لهذا الحقل." - -msgid "This field cannot be blank." -msgstr "لا يمكن ترك هذا الحقل فارغاً." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "النموذج %(model_name)s والحقل %(field_label)s موجود مسبقاً." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s يجب أن يكون فريد لـ %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "حقل نوع: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "قيمة '%(value)s' يجب أن تكون True أو False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "قيمة “%(value)s” يجب أن تكون True , False أو None." - -msgid "Boolean (Either True or False)" -msgstr "ثنائي (إما True أو False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "سلسلة نص (%(max_length)s كحد أقصى)" - -msgid "Comma-separated integers" -msgstr "أرقام صحيحة مفصولة بفواصل" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"قيمة '%(value)s' ليست من بُنية تاريخ صحيحة. القيمة يجب ان تكون من البُنية YYYY-" -"MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "قيمة '%(value)s' من بُنية صحيحة (YYYY-MM-DD) لكنها تحوي تاريخ غير صحيح." - -msgid "Date (without time)" -msgstr "التاريخ (دون الوقت)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"قيمة '%(value)s' ليست من بُنية صحيحة. القيمة يجب ان تكون من البُنية YYYY-MM-DD " -"HH:MM[:ss[.uuuuuu]][TZ] ." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"قيمة '%(value)s' من بُنية صحيحة (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) لكنها " -"تحوي وقت و تاريخ غير صحيحين." - -msgid "Date (with time)" -msgstr "التاريخ (مع الوقت)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "قيمة '%(value)s' يجب ان تكون عدد عشري." - -msgid "Decimal number" -msgstr "رقم عشري" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"قيمة '%(value)s' ليست بنسق صحيح. القيمة يجب ان تكون من التنسيق ([DD] " -"[[HH:]MM:]ss[.uuuuuu])" - -msgid "Duration" -msgstr "المدّة" - -msgid "Email address" -msgstr "عنوان بريد إلكتروني" - -msgid "File path" -msgstr "مسار الملف" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "قيمة '%(value)s' يجب ان تكون عدد تعويم." - -msgid "Floating point number" -msgstr "رقم فاصلة عائمة" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "قيمة '%(value)s' يجب ان تكون عدد طبيعي." - -msgid "Integer" -msgstr "عدد صحيح" - -msgid "Big (8 byte) integer" -msgstr "عدد صحيح كبير (8 بايت)" - -msgid "Small integer" -msgstr "عدد صحيح صغير" - -msgid "IPv4 address" -msgstr "عنوان IPv4" - -msgid "IP address" -msgstr "عنوان IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "قيمة '%(value)s' يجب ان تكون None أو True أو False." - -msgid "Boolean (Either True, False or None)" -msgstr "ثنائي (إما True أو False أو None)" - -msgid "Positive big integer" -msgstr "عدد صحيح موجب كبير" - -msgid "Positive integer" -msgstr "عدد صحيح موجب" - -msgid "Positive small integer" -msgstr "عدد صحيح صغير موجب" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (حتى %(max_length)s)" - -msgid "Text" -msgstr "نص" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"قيمة '%(value)s' ليست بنسق صحيح. القيمة يجب ان تكون من التنسيق\n" -"HH:MM[:ss[.uuuuuu]]" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"قيمة '%(value)s' من بُنية صحيحة (HH:MM[:ss[.uuuuuu]]) لكنها تحوي وقت غير صحيح." - -msgid "Time" -msgstr "وقت" - -msgid "URL" -msgstr "رابط" - -msgid "Raw binary data" -msgstr "البيانات الثنائية الخام" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "القيمة \"%(value)s\" ليست UUID صالح." - -msgid "Universally unique identifier" -msgstr "معرّف فريد عالمياً" - -msgid "File" -msgstr "ملف" - -msgid "Image" -msgstr "صورة" - -msgid "A JSON object" -msgstr "كائن JSON" - -msgid "Value must be valid JSON." -msgstr "يجب أن تكون قيمة JSON صالحة." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "النموذج %(model)s ذو الحقل و القيمة %(field)s %(value)r غير موجود." - -msgid "Foreign Key (type determined by related field)" -msgstr "الحقل المرتبط (تم تحديد النوع وفقاً للحقل المرتبط)" - -msgid "One-to-one relationship" -msgstr "علاقة واحد إلى واحد" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s علاقة" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s علاقات" - -msgid "Many-to-many relationship" -msgstr "علاقة متعدد إلى متعدد" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "هذا الحقل مطلوب." - -msgid "Enter a whole number." -msgstr "أدخل رقما صحيحا." - -msgid "Enter a valid date." -msgstr "أدخل تاريخاً صحيحاً." - -msgid "Enter a valid time." -msgstr "أدخل وقتاً صحيحاً." - -msgid "Enter a valid date/time." -msgstr "أدخل تاريخاً/وقتاً صحيحاً." - -msgid "Enter a valid duration." -msgstr "أدخل مدّة صحيحة" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "يجب أن يكون عدد الأيام بين {min_days} و {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "لم يتم ارسال ملف، الرجاء التأكد من نوع ترميز الاستمارة." - -msgid "No file was submitted." -msgstr "لم يتم إرسال اي ملف." - -msgid "The submitted file is empty." -msgstr "الملف الذي قمت بإرساله فارغ." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[1] "" -"تأكد أن إسم هذا الملف يحتوي على حرف %(max)d على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[2] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرفين على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[3] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[4] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[5] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "رجاءً أرسل ملف أو صح علامة صح عند مربع اختيار \"فارغ\"، وليس كلاهما." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"قم برفع صورة صحيحة، الملف الذي قمت برفعه إما أنه ليس ملفا لصورة أو أنه ملف " -"معطوب." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "انتق خياراً صحيحاً. %(value)s ليس أحد الخيارات المتاحة." - -msgid "Enter a list of values." -msgstr "أدخل قائمة من القيم." - -msgid "Enter a complete value." -msgstr "إدخال قيمة كاملة." - -msgid "Enter a valid UUID." -msgstr "أدخل قيمة UUID صحيحة." - -msgid "Enter a valid JSON." -msgstr "أدخل مدخل JSON صالح." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(الحقل الخفي %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"بيانات نموذج الإدارة مفقودة أو تم العبث بها. الحقول المفقودة: " -"%(field_names)s. قد تحتاج إلى تقديم تقرير خطأ إذا استمرت المشكلة." - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "الرجاء إرسال %d إستمارة على الأكثر." -msgstr[1] "الرجاء إرسال %d إستمارة على الأكثر." -msgstr[2] "الرجاء إرسال %d إستمارة على الأكثر." -msgstr[3] "الرجاء إرسال %d إستمارة على الأكثر." -msgstr[4] "الرجاء إرسال %d إستمارة على الأكثر." -msgstr[5] "الرجاء إرسال %d إستمارة على الأكثر." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "الرجاء إرسال %d إستمارة على الأقل." -msgstr[1] "الرجاء إرسال %d إستمارة على الأقل." -msgstr[2] "الرجاء إرسال %d إستمارة على الأقل." -msgstr[3] "الرجاء إرسال %d إستمارة على الأقل." -msgstr[4] "الرجاء إرسال %d إستمارة على الأقل." -msgstr[5] "الرجاء إرسال %d إستمارة على الأقل." - -msgid "Order" -msgstr "الترتيب" - -msgid "Delete" -msgstr "احذف" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "رجاء صحّح بيانات %(field)s المتكررة." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "رجاء صحّح بيانات %(field)s المتكررة والتي يجب أن تكون مُميّزة." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"رجاء صحّح بيانات %(field_name)s المتكررة والتي يجب أن تكون مُميّزة لـ%(lookup)s " -"في %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "رجاءً صحّح القيم المُكرّرة أدناه." - -msgid "The inline value did not match the parent instance." -msgstr "لا تتطابق القيمة المضمنة مع المثيل الأصلي." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "انتق خياراً صحيحاً. اختيارك ليس أحد الخيارات المتاحة." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" ليست قيمة صالحة." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s لا يمكن تفسيرها في المنطقة الزمنية %(current_timezone)s; قد " -"تكون غامضة أو أنها غير موجودة." - -msgid "Clear" -msgstr "تفريغ" - -msgid "Currently" -msgstr "حالياً" - -msgid "Change" -msgstr "عدّل" - -msgid "Unknown" -msgstr "مجهول" - -msgid "Yes" -msgstr "نعم" - -msgid "No" -msgstr "لا" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "نعم,لا,ربما" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d بايت" -msgstr[1] "بايت واحد" -msgstr[2] "بايتان" -msgstr[3] "%(size)d بايتان" -msgstr[4] "%(size)d بايت" -msgstr[5] "%(size)d بايت" - -#, python-format -msgid "%s KB" -msgstr "%s ك.ب" - -#, python-format -msgid "%s MB" -msgstr "%s م.ب" - -#, python-format -msgid "%s GB" -msgstr "%s ج.ب" - -#, python-format -msgid "%s TB" -msgstr "%s ت.ب" - -#, python-format -msgid "%s PB" -msgstr "%s ب.ب" - -msgid "p.m." -msgstr "م" - -msgid "a.m." -msgstr "ص" - -msgid "PM" -msgstr "م" - -msgid "AM" -msgstr "ص" - -msgid "midnight" -msgstr "منتصف الليل" - -msgid "noon" -msgstr "ظهراً" - -msgid "Monday" -msgstr "الاثنين" - -msgid "Tuesday" -msgstr "الثلاثاء" - -msgid "Wednesday" -msgstr "الأربعاء" - -msgid "Thursday" -msgstr "الخميس" - -msgid "Friday" -msgstr "الجمعة" - -msgid "Saturday" -msgstr "السبت" - -msgid "Sunday" -msgstr "الأحد" - -msgid "Mon" -msgstr "إثنين" - -msgid "Tue" -msgstr "ثلاثاء" - -msgid "Wed" -msgstr "أربعاء" - -msgid "Thu" -msgstr "خميس" - -msgid "Fri" -msgstr "جمعة" - -msgid "Sat" -msgstr "سبت" - -msgid "Sun" -msgstr "أحد" - -msgid "January" -msgstr "يناير" - -msgid "February" -msgstr "فبراير" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "إبريل" - -msgid "May" -msgstr "مايو" - -msgid "June" -msgstr "يونيو" - -msgid "July" -msgstr "يوليو" - -msgid "August" -msgstr "أغسطس" - -msgid "September" -msgstr "سبتمبر" - -msgid "October" -msgstr "أكتوبر" - -msgid "November" -msgstr "نوفمبر" - -msgid "December" -msgstr "ديسمبر" - -msgid "jan" -msgstr "يناير" - -msgid "feb" -msgstr "فبراير" - -msgid "mar" -msgstr "مارس" - -msgid "apr" -msgstr "إبريل" - -msgid "may" -msgstr "مايو" - -msgid "jun" -msgstr "يونيو" - -msgid "jul" -msgstr "يوليو" - -msgid "aug" -msgstr "أغسطس" - -msgid "sep" -msgstr "سبتمبر" - -msgid "oct" -msgstr "أكتوبر" - -msgid "nov" -msgstr "نوفمبر" - -msgid "dec" -msgstr "ديسمبر" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "يناير" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "فبراير" - -msgctxt "abbrev. month" -msgid "March" -msgstr "مارس" - -msgctxt "abbrev. month" -msgid "April" -msgstr "إبريل" - -msgctxt "abbrev. month" -msgid "May" -msgstr "مايو" - -msgctxt "abbrev. month" -msgid "June" -msgstr "يونيو" - -msgctxt "abbrev. month" -msgid "July" -msgstr "يوليو" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "أغسطس" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "سبتمبر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "أكتوبر" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "نوفمبر" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ديسمبر" - -msgctxt "alt. month" -msgid "January" -msgstr "يناير" - -msgctxt "alt. month" -msgid "February" -msgstr "فبراير" - -msgctxt "alt. month" -msgid "March" -msgstr "مارس" - -msgctxt "alt. month" -msgid "April" -msgstr "أبريل" - -msgctxt "alt. month" -msgid "May" -msgstr "مايو" - -msgctxt "alt. month" -msgid "June" -msgstr "يونيو" - -msgctxt "alt. month" -msgid "July" -msgstr "يوليو" - -msgctxt "alt. month" -msgid "August" -msgstr "أغسطس" - -msgctxt "alt. month" -msgid "September" -msgstr "سبتمبر" - -msgctxt "alt. month" -msgid "October" -msgstr "أكتوبر" - -msgctxt "alt. month" -msgid "November" -msgstr "نوفمبر" - -msgctxt "alt. month" -msgid "December" -msgstr "ديسمبر" - -msgid "This is not a valid IPv6 address." -msgstr "هذا ليس عنوان IPv6 صحيح." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "أو" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "، " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d سنة" -msgstr[1] "%(num)d سنة" -msgstr[2] "%(num)d سنتين" -msgstr[3] "%(num)d سنوات" -msgstr[4] "%(num)d سنوات" -msgstr[5] "%(num)d سنوات" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d شهر" -msgstr[1] "%(num)d شهر" -msgstr[2] "%(num)d شهرين" -msgstr[3] "%(num)d أشهر" -msgstr[4] "%(num)d أشهر" -msgstr[5] "%(num)d أشهر" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d أسبوع" -msgstr[1] "%(num)d أسبوع" -msgstr[2] "%(num)d أسبوعين" -msgstr[3] "%(num)d أسابيع" -msgstr[4] "%(num)d أسابيع" -msgstr[5] "%(num)d أسابيع" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d يوم" -msgstr[1] "%(num)d يوم" -msgstr[2] "%(num)d يومين" -msgstr[3] "%(num)d أيام" -msgstr[4] "%(num)d يوم" -msgstr[5] "%(num)d أيام" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ساعة" -msgstr[1] "%(num)d ساعة" -msgstr[2] "%(num)d ساعتين" -msgstr[3] "%(num)d ساعات" -msgstr[4] "%(num)d ساعة" -msgstr[5] "%(num)d ساعات" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d دقيقة" -msgstr[1] "%(num)d دقيقة" -msgstr[2] "%(num)d دقيقتين" -msgstr[3] "%(num)d دقائق" -msgstr[4] "%(num)d دقيقة" -msgstr[5] "%(num)d دقيقة" - -msgid "Forbidden" -msgstr "ممنوع" - -msgid "CSRF verification failed. Request aborted." -msgstr "تم الفشل للتحقق من CSRF. تم إنهاء الطلب." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"أنت ترى هذه الرسالة لأن موقع HTTPS هذا يتطلب إرسال “Referer header” بواسطة " -"متصفح الويب الخاص بك، ولكن لم يتم إرسال أي منها. هذا مطلوب لأسباب أمنية، " -"لضمان عدم اختطاف متصفحك من قبل أطراف ثالثة." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"إذا قمت بتكوين المستعرض لتعطيل رؤوس “Referer” ، فيرجى إعادة تمكينها ، على " -"الأقل لهذا الموقع ، أو لاتصالات HTTPS ، أو لطلبات “same-origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"إذا كنت تستخدم العلامة أو " -"تضمين رأس “Referrer-Policy: no-referrer”، يرجى إزالتها. تتطلب حماية CSRF أن " -"يقوم رأس “Referer” بإجراء فحص صارم للمراجع. إذا كنت قلقًا بشأن الخصوصية ، " -"فاستخدم بدائل مثل للروابط إلى مواقع الجهات الخارجية." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"أنت ترى هذه الرسالة لأن هذا الموقع يتطلب كعكة CSRF عند تقديم النماذج. ملف " -"الكعكة هذا مطلوب لأسباب أمنية في تعريف الإرتباط، لضمان أنه لم يتم اختطاف " -"المتصفح من قبل أطراف أخرى." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"إذا قمت بضبط المتصفح لتعطيل الكوكيز الرجاء إعادة تغعيلها، على الأقل بالنسبة " -"لهذا الموقع، أو للطلبات من “same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "يتوفر مزيد من المعلومات عند ضبط الخيار DEBUG=True." - -msgid "No year specified" -msgstr "لم تحدد السنة" - -msgid "Date out of range" -msgstr "التاريخ خارج النطاق" - -msgid "No month specified" -msgstr "لم تحدد الشهر" - -msgid "No day specified" -msgstr "لم تحدد اليوم" - -msgid "No week specified" -msgstr "لم تحدد الأسبوع" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "لا يوجد %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"التاريخ بالمستقبل %(verbose_name_plural)s غير متوفر لأن قيمة %(class_name)s." -"allow_future هي False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "نسق تاريخ غير صحيح \"%(datestr)s\" محدد بالشكل ''%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "لم يعثر على أي %(verbose_name)s مطابقة لهذا الإستعلام" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "الصفحة ليست \"الأخيرة\"، كما لا يمكن تحويل القيمة إلى رقم طبيعي." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "صفحة خاطئة (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"قائمة فارغة و\n" -"\"%(class_name)s.allow_empty\"\n" -"قيمته False." - -msgid "Directory indexes are not allowed here." -msgstr "لا يسمح لفهارس الدليل هنا." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "”%(path)s“ غير موجود" - -#, python-format -msgid "Index of %(directory)s" -msgstr "فهرس لـ %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "تمت عملية التنصيب بنجاح! تهانينا!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"استعراض ملاحظات الإصدار لجانغو %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"تظهر لك هذه الصفحة لأن DEBUG=True في ملف settings خاصتك كما أنك لم تقم بإعداد الروابط URLs." - -msgid "Django Documentation" -msgstr "وثائق تعليمات جانغو" - -msgid "Topics, references, & how-to’s" -msgstr "المواضيع و المراجع و التعليمات" - -msgid "Tutorial: A Polling App" -msgstr "برنامج تعليمي: تطبيق تصويت" - -msgid "Get started with Django" -msgstr "إبدأ مع جانغو" - -msgid "Django Community" -msgstr "مجتمع جانغو" - -msgid "Connect, get help, or contribute" -msgstr "اتصل بنا أو احصل على مساعدة أو ساهم" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ar/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ar/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ar/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ar/formats.py deleted file mode 100644 index 8008ce6..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ar/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F، Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d‏/m‏/Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index 3c0e324..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index b32da34..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,1397 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jihad Bahmaid Al-Halki, 2022 -# Riterix , 2019-2020 -# Riterix , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:23-0500\n" -"PO-Revision-Date: 2022-07-25 06:49+0000\n" -"Last-Translator: Jihad Bahmaid Al-Halki\n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Afrikaans" -msgstr "الإفريقية" - -msgid "Arabic" -msgstr "العربية" - -msgid "Algerian Arabic" -msgstr "العربية الجزائرية" - -msgid "Asturian" -msgstr "الأسترية" - -msgid "Azerbaijani" -msgstr "الأذربيجانية" - -msgid "Bulgarian" -msgstr "البلغارية" - -msgid "Belarusian" -msgstr "البيلاروسية" - -msgid "Bengali" -msgstr "البنغالية" - -msgid "Breton" -msgstr "البريتونية" - -msgid "Bosnian" -msgstr "البوسنية" - -msgid "Catalan" -msgstr "الكتلانية" - -msgid "Czech" -msgstr "التشيكية" - -msgid "Welsh" -msgstr "الويلز" - -msgid "Danish" -msgstr "الدنماركية" - -msgid "German" -msgstr "الألمانية" - -msgid "Lower Sorbian" -msgstr "الصربية السفلى" - -msgid "Greek" -msgstr "اليونانية" - -msgid "English" -msgstr "الإنجليزية" - -msgid "Australian English" -msgstr "الإنجليزية الإسترالية" - -msgid "British English" -msgstr "الإنجليزية البريطانية" - -msgid "Esperanto" -msgstr "الاسبرانتو" - -msgid "Spanish" -msgstr "الإسبانية" - -msgid "Argentinian Spanish" -msgstr "الأسبانية الأرجنتينية" - -msgid "Colombian Spanish" -msgstr "الكولومبية الإسبانية" - -msgid "Mexican Spanish" -msgstr "الأسبانية المكسيكية" - -msgid "Nicaraguan Spanish" -msgstr "الإسبانية النيكاراغوية" - -msgid "Venezuelan Spanish" -msgstr "الإسبانية الفنزويلية" - -msgid "Estonian" -msgstr "الإستونية" - -msgid "Basque" -msgstr "الباسك" - -msgid "Persian" -msgstr "الفارسية" - -msgid "Finnish" -msgstr "الفنلندية" - -msgid "French" -msgstr "الفرنسية" - -msgid "Frisian" -msgstr "الفريزية" - -msgid "Irish" -msgstr "الإيرلندية" - -msgid "Scottish Gaelic" -msgstr "الغيلية الأسكتلندية" - -msgid "Galician" -msgstr "الجليقية" - -msgid "Hebrew" -msgstr "العبرية" - -msgid "Hindi" -msgstr "الهندية" - -msgid "Croatian" -msgstr "الكرواتية" - -msgid "Upper Sorbian" -msgstr "الصربية العليا" - -msgid "Hungarian" -msgstr "الهنغارية" - -msgid "Armenian" -msgstr "الأرمنية" - -msgid "Interlingua" -msgstr "اللغة الوسيطة" - -msgid "Indonesian" -msgstr "الإندونيسية" - -msgid "Igbo" -msgstr "إيبو" - -msgid "Ido" -msgstr "ايدو" - -msgid "Icelandic" -msgstr "الآيسلندية" - -msgid "Italian" -msgstr "الإيطالية" - -msgid "Japanese" -msgstr "اليابانية" - -msgid "Georgian" -msgstr "الجورجية" - -msgid "Kabyle" -msgstr "القبائلية" - -msgid "Kazakh" -msgstr "الكازاخستانية" - -msgid "Khmer" -msgstr "الخمر" - -msgid "Kannada" -msgstr "الهندية (كنّادا)" - -msgid "Korean" -msgstr "الكورية" - -msgid "Kyrgyz" -msgstr "القيرغيزية" - -msgid "Luxembourgish" -msgstr "اللوكسمبرجية" - -msgid "Lithuanian" -msgstr "اللتوانية" - -msgid "Latvian" -msgstr "اللاتفية" - -msgid "Macedonian" -msgstr "المقدونية" - -msgid "Malayalam" -msgstr "المايالام" - -msgid "Mongolian" -msgstr "المنغولية" - -msgid "Marathi" -msgstr "المهاراتية" - -msgid "Malay" -msgstr "ملاي" - -msgid "Burmese" -msgstr "البورمية" - -msgid "Norwegian Bokmål" -msgstr "النرويجية" - -msgid "Nepali" -msgstr "النيبالية" - -msgid "Dutch" -msgstr "الهولندية" - -msgid "Norwegian Nynorsk" -msgstr "النينورسك نرويجية" - -msgid "Ossetic" -msgstr "الأوسيتيكية" - -msgid "Punjabi" -msgstr "البنجابية" - -msgid "Polish" -msgstr "البولندية" - -msgid "Portuguese" -msgstr "البرتغالية" - -msgid "Brazilian Portuguese" -msgstr "البرتغالية البرازيلية" - -msgid "Romanian" -msgstr "الرومانية" - -msgid "Russian" -msgstr "الروسية" - -msgid "Slovak" -msgstr "السلوفاكية" - -msgid "Slovenian" -msgstr "السلوفانية" - -msgid "Albanian" -msgstr "الألبانية" - -msgid "Serbian" -msgstr "الصربية" - -msgid "Serbian Latin" -msgstr "اللاتينية الصربية" - -msgid "Swedish" -msgstr "السويدية" - -msgid "Swahili" -msgstr "السواحلية" - -msgid "Tamil" -msgstr "التاميل" - -msgid "Telugu" -msgstr "التيلوغو" - -msgid "Tajik" -msgstr "الطاجيكية" - -msgid "Thai" -msgstr "التايلندية" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "التركية" - -msgid "Tatar" -msgstr "التتاريية" - -msgid "Udmurt" -msgstr "الأدمرتية" - -msgid "Ukrainian" -msgstr "الأكرانية" - -msgid "Urdu" -msgstr "الأوردو" - -msgid "Uzbek" -msgstr "الأوزبكية" - -msgid "Vietnamese" -msgstr "الفيتنامية" - -msgid "Simplified Chinese" -msgstr "الصينية المبسطة" - -msgid "Traditional Chinese" -msgstr "الصينية التقليدية" - -msgid "Messages" -msgstr "الرسائل" - -msgid "Site Maps" -msgstr "خرائط الموقع" - -msgid "Static Files" -msgstr "الملفات الثابتة" - -msgid "Syndication" -msgstr "توظيف النشر" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "رقم الصفحة ليس عددًا صحيحًا" - -msgid "That page number is less than 1" -msgstr "رقم الصفحة أقل من 1" - -msgid "That page contains no results" -msgstr "هذه الصفحة لا تحتوي على نتائج" - -msgid "Enter a valid value." -msgstr "أدخل قيمة صحيحة." - -msgid "Enter a valid URL." -msgstr "أدخل رابطاً صحيحاً." - -msgid "Enter a valid integer." -msgstr "أدخل رقم صالح." - -msgid "Enter a valid email address." -msgstr "أدخل عنوان بريد إلكتروني صحيح." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"أدخل “slug” صالحة تتكون من أحرف أو أرقام أو الشرطة السفلية أو الواصلات." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"أدخل “slug” صالحة تتكون من أحرف Unicode أو الأرقام أو الشرطة السفلية أو " -"الواصلات." - -msgid "Enter a valid IPv4 address." -msgstr "أدخل عنوان IPv4 صحيح." - -msgid "Enter a valid IPv6 address." -msgstr "أدخل عنوان IPv6 صحيح." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "أدخل عنوان IPv4 أو عنوان IPv6 صحيح." - -msgid "Enter only digits separated by commas." -msgstr "أدخل أرقاما فقط مفصول بينها بفواصل." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "تحقق من أن هذه القيمة هي %(limit_value)s (إنها %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "تحقق من أن تكون هذه القيمة أقل من %(limit_value)s أو مساوية لها." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "تحقق من أن تكون هذه القيمة أكثر من %(limit_value)s أو مساوية لها." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[1] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[2] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[3] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[4] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[5] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[1] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[2] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[3] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[4] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[5] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." - -msgid "Enter a number." -msgstr "أدخل رقماً." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[1] "تحقق من أن تدخل رقم %(max)s لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s رقمين لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s أرقام لا أكثر." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[1] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[1] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"امتداد الملف “%(extension)s” غير مسموح به. الامتدادات المسموح بها هي:" -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "لا يُسمح بالأحرف الخالية." - -msgid "and" -msgstr "و" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s بهذا %(field_labels)s موجود سلفاً." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "القيمة %(value)r ليست خيارا صحيحاً." - -msgid "This field cannot be null." -msgstr "لا يمكن ترك هذا الحقل خالي." - -msgid "This field cannot be blank." -msgstr "لا يمكن ترك هذا الحقل فارغاً." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "النموذج %(model_name)s والحقل %(field_label)s موجود مسبقاً." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s يجب أن يكون فريد لـ %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "حقل نوع: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "يجب أن تكون القيمة “%(value)s” إما True أو False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "يجب أن تكون القيمة “%(value)s” إما True أو False أو None." - -msgid "Boolean (Either True or False)" -msgstr "ثنائي (إما True أو False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "سلسلة نص (%(max_length)s كحد أقصى)" - -msgid "Comma-separated integers" -msgstr "أرقام صحيحة مفصولة بفواصل" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"تحتوي القيمة “%(value)s” على تنسيق تاريخ غير صالح. يجب أن يكون بتنسيق YYYY-" -"MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"تحتوي القيمة “%(value)s” على التنسيق الصحيح (YYYY-MM-DD) ولكنه تاريخ غير " -"صالح." - -msgid "Date (without time)" -msgstr "التاريخ (دون الوقت)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"تحتوي القيمة “%(value)s” على تنسيق غير صالح. يجب أن يكون بتنسيق YYYY-MM-DD " -"HH: MM [: ss [.uuuuuu]] [TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"تحتوي القيمة “%(value)s” على التنسيق الصحيح (YYYY-MM-DD HH: MM [: ss [." -"uuuuuu]] [TZ]) ولكنها تعد تاريخًا / وقتًا غير صالحين." - -msgid "Date (with time)" -msgstr "التاريخ (مع الوقت)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "يجب أن تكون القيمة “%(value)s” رقمًا عشريًا." - -msgid "Decimal number" -msgstr "رقم عشري" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"تحتوي القيمة “%(value)s” على تنسيق غير صالح. يجب أن يكون بتنسيق [DD] [[HH:] " -"MM:] ss [.uuuuuu]." - -msgid "Duration" -msgstr "المدّة" - -msgid "Email address" -msgstr "عنوان بريد إلكتروني" - -msgid "File path" -msgstr "مسار الملف" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "يجب أن تكون القيمة “%(value)s” قيمة عائمة." - -msgid "Floating point number" -msgstr "رقم فاصلة عائمة" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "يجب أن تكون القيمة “%(value)s” عددًا صحيحًا." - -msgid "Integer" -msgstr "عدد صحيح" - -msgid "Big (8 byte) integer" -msgstr "عدد صحيح كبير (8 بايت)" - -msgid "Small integer" -msgstr "عدد صحيح صغير" - -msgid "IPv4 address" -msgstr "عنوان IPv4" - -msgid "IP address" -msgstr "عنوان IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "يجب أن تكون القيمة “%(value)s” إما None أو True أو False." - -msgid "Boolean (Either True, False or None)" -msgstr "ثنائي (إما True أو False أو None)" - -msgid "Positive big integer" -msgstr "عدد صحيح كبير موجب" - -msgid "Positive integer" -msgstr "عدد صحيح موجب" - -msgid "Positive small integer" -msgstr "عدد صحيح صغير موجب" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (حتى %(max_length)s)" - -msgid "Text" -msgstr "نص" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"تحتوي القيمة “%(value)s” على تنسيق غير صالح. يجب أن يكون بتنسيق HH: MM [: ss " -"[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"تحتوي القيمة “%(value)s” على التنسيق الصحيح (HH: MM [: ss [.uuuuuu]]) ولكنه " -"وقت غير صالح." - -msgid "Time" -msgstr "وقت" - -msgid "URL" -msgstr "رابط" - -msgid "Raw binary data" -msgstr "البيانات الثنائية الخام" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” ليس UUID صالحًا." - -msgid "Universally unique identifier" -msgstr "المعرف الفريد العالمي (UUID)" - -msgid "File" -msgstr "ملف" - -msgid "Image" -msgstr "صورة" - -msgid "A JSON object" -msgstr "كائن JSON" - -msgid "Value must be valid JSON." -msgstr "يجب أن تكون قيمة JSON صالحة." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "النموذج %(model)s ذو الحقل و القيمة %(field)s %(value)r غير موجود." - -msgid "Foreign Key (type determined by related field)" -msgstr "الحقل المرتبط (تم تحديد النوع وفقاً للحقل المرتبط)" - -msgid "One-to-one relationship" -msgstr "علاقة واحد إلى واحد" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s علاقة" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s علاقات" - -msgid "Many-to-many relationship" -msgstr "علاقة متعدد إلى متعدد" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "هذا الحقل مطلوب." - -msgid "Enter a whole number." -msgstr "أدخل رقما صحيحا." - -msgid "Enter a valid date." -msgstr "أدخل تاريخاً صحيحاً." - -msgid "Enter a valid time." -msgstr "أدخل وقتاً صحيحاً." - -msgid "Enter a valid date/time." -msgstr "أدخل تاريخاً/وقتاً صحيحاً." - -msgid "Enter a valid duration." -msgstr "أدخل مدّة صحيحة" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "يجب أن يتراوح عدد الأيام بين {min_days} و {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "لم يتم ارسال ملف، الرجاء التأكد من نوع ترميز الاستمارة." - -msgid "No file was submitted." -msgstr "لم يتم إرسال اي ملف." - -msgid "The submitted file is empty." -msgstr "الملف الذي قمت بإرساله فارغ." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[1] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[2] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[3] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[4] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[5] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"رجاءً أرسل ملف أو صح علامة صح عند مربع اختيار \\\"فارغ\\\"، وليس كلاهما." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"قم برفع صورة صحيحة، الملف الذي قمت برفعه إما أنه ليس ملفا لصورة أو أنه ملف " -"معطوب." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "انتق خياراً صحيحاً. %(value)s ليس أحد الخيارات المتاحة." - -msgid "Enter a list of values." -msgstr "أدخل قائمة من القيم." - -msgid "Enter a complete value." -msgstr "إدخال قيمة كاملة." - -msgid "Enter a valid UUID." -msgstr "أدخل قيمة UUID صحيحة." - -msgid "Enter a valid JSON." -msgstr "ادخل كائن JSON صالح." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(الحقل الخفي %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"نموذج بيانات الإدارة مفقود أو تم العبث به. %(field_names)sمن الحقول مفقود. " -"قد تحتاج إلى رفع تقرير بالمشكلة إن استمرت الحالة." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -msgid "Order" -msgstr "الترتيب" - -msgid "Delete" -msgstr "احذف" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "رجاء صحّح بيانات %(field)s المتكررة." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "رجاء صحّح بيانات %(field)s المتكررة والتي يجب أن تكون مُميّزة." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"رجاء صحّح بيانات %(field_name)s المتكررة والتي يجب أن تكون مُميّزة لـ%(lookup)s " -"في %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "رجاءً صحّح القيم المُكرّرة أدناه." - -msgid "The inline value did not match the parent instance." -msgstr "القيمة المضمنة لا تتطابق مع المثيل الأصلي." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "انتق خياراً صحيحاً. اختيارك ليس أحد الخيارات المتاحة." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” ليست قيمة صالحة." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"لا يمكن تفسير٪ %(datetime)s في المنطقة الزمنية٪ %(current_timezone)s؛ قد " -"تكون غامضة أو غير موجودة." - -msgid "Clear" -msgstr "تفريغ" - -msgid "Currently" -msgstr "حالياً" - -msgid "Change" -msgstr "عدّل" - -msgid "Unknown" -msgstr "مجهول" - -msgid "Yes" -msgstr "نعم" - -msgid "No" -msgstr "لا" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "نعم,لا,ربما" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d بايت" -msgstr[1] "%(size)d بايت واحد " -msgstr[2] "%(size)d بايتان" -msgstr[3] "%(size)d بايت" -msgstr[4] "%(size)d بايت" -msgstr[5] "%(size)d بايت" - -#, python-format -msgid "%s KB" -msgstr "%s ك.ب" - -#, python-format -msgid "%s MB" -msgstr "%s م.ب" - -#, python-format -msgid "%s GB" -msgstr "%s ج.ب" - -#, python-format -msgid "%s TB" -msgstr "%s ت.ب" - -#, python-format -msgid "%s PB" -msgstr "%s ب.ب" - -msgid "p.m." -msgstr "م" - -msgid "a.m." -msgstr "ص" - -msgid "PM" -msgstr "م" - -msgid "AM" -msgstr "ص" - -msgid "midnight" -msgstr "منتصف الليل" - -msgid "noon" -msgstr "ظهراً" - -msgid "Monday" -msgstr "الاثنين" - -msgid "Tuesday" -msgstr "الثلاثاء" - -msgid "Wednesday" -msgstr "الأربعاء" - -msgid "Thursday" -msgstr "الخميس" - -msgid "Friday" -msgstr "الجمعة" - -msgid "Saturday" -msgstr "السبت" - -msgid "Sunday" -msgstr "الأحد" - -msgid "Mon" -msgstr "إثنين" - -msgid "Tue" -msgstr "ثلاثاء" - -msgid "Wed" -msgstr "أربعاء" - -msgid "Thu" -msgstr "خميس" - -msgid "Fri" -msgstr "جمعة" - -msgid "Sat" -msgstr "سبت" - -msgid "Sun" -msgstr "أحد" - -msgid "January" -msgstr "جانفي" - -msgid "February" -msgstr "فيفري" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "أفريل" - -msgid "May" -msgstr "ماي" - -msgid "June" -msgstr "جوان" - -msgid "July" -msgstr "جويليه" - -msgid "August" -msgstr "أوت" - -msgid "September" -msgstr "سبتمبر" - -msgid "October" -msgstr "أكتوبر" - -msgid "November" -msgstr "نوفمبر" - -msgid "December" -msgstr "ديسمبر" - -msgid "jan" -msgstr "جانفي" - -msgid "feb" -msgstr "فيفري" - -msgid "mar" -msgstr "مارس" - -msgid "apr" -msgstr "أفريل" - -msgid "may" -msgstr "ماي" - -msgid "jun" -msgstr "جوان" - -msgid "jul" -msgstr "جويليه" - -msgid "aug" -msgstr "أوت" - -msgid "sep" -msgstr "سبتمبر" - -msgid "oct" -msgstr "أكتوبر" - -msgid "nov" -msgstr "نوفمبر" - -msgid "dec" -msgstr "ديسمبر" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "جانفي" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "فيفري" - -msgctxt "abbrev. month" -msgid "March" -msgstr "مارس" - -msgctxt "abbrev. month" -msgid "April" -msgstr "أفريل" - -msgctxt "abbrev. month" -msgid "May" -msgstr "ماي" - -msgctxt "abbrev. month" -msgid "June" -msgstr "جوان" - -msgctxt "abbrev. month" -msgid "July" -msgstr "جويليه" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "أوت" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "سبتمبر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "أكتوبر" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "نوفمبر" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ديسمبر" - -msgctxt "alt. month" -msgid "January" -msgstr "جانفي" - -msgctxt "alt. month" -msgid "February" -msgstr "فيفري" - -msgctxt "alt. month" -msgid "March" -msgstr "مارس" - -msgctxt "alt. month" -msgid "April" -msgstr "أفريل" - -msgctxt "alt. month" -msgid "May" -msgstr "ماي" - -msgctxt "alt. month" -msgid "June" -msgstr "جوان" - -msgctxt "alt. month" -msgid "July" -msgstr "جويليه" - -msgctxt "alt. month" -msgid "August" -msgstr "أوت" - -msgctxt "alt. month" -msgid "September" -msgstr "سبتمبر" - -msgctxt "alt. month" -msgid "October" -msgstr "أكتوبر" - -msgctxt "alt. month" -msgid "November" -msgstr "نوفمبر" - -msgctxt "alt. month" -msgid "December" -msgstr "ديسمبر" - -msgid "This is not a valid IPv6 address." -msgstr "هذا ليس عنوان IPv6 صحيح." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "أو" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "، " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -msgid "Forbidden" -msgstr "ممنوع" - -msgid "CSRF verification failed. Request aborted." -msgstr "تم الفشل للتحقق من CSRF. تم إنهاء الطلب." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"أنت ترى هذه الرسالة لأن موقع HTTPS هذا يتطلب \"عنوان مرجعي\" ليتم إرساله " -"بواسطة متصفح الويب الخاص بك ، ولكن لم يتم إرسال أي شيء. هذا العنوان مطلوب " -"لأسباب أمنية ، لضمان عدم اختراق متصفحك من قبل أطراف أخرى." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"إذا قمت بتكوين المستعرض الخاص بك لتعطيل رؤوس “Referer” ، فالرجاء إعادة " -"تمكينها ، على الأقل لهذا الموقع ، أو لاتصالات HTTPS ، أو لطلبات “same-" -"origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"إذا كنت تستخدم العلامة أو تتضمن رأس “Referrer-Policy: no-referrer” ، فيرجى إزالتها. تتطلب حماية " -"CSRF رأس “Referer” القيام بالتحقق من “strict referer”. إذا كنت مهتمًا " -"بالخصوصية ، فاستخدم بدائل مثل للروابط إلى مواقع " -"الجهات الخارجية." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"تشاهد هذه الرسالة لأن هذا الموقع يتطلب ملف تعريف ارتباط CSRF Cookie عند " -"إرسال النماذج. ملف تعريف ارتباط Cookie هذا مطلوب لأسباب أمنية ، لضمان عدم " -"اختطاف متصفحك من قبل أطراف ثالثة." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"إذا قمت بتكوين المستعرض الخاص بك لتعطيل ملفات تعريف الارتباط Cookies ، يرجى " -"إعادة تمكينها ، على الأقل لهذا الموقع ، أو لطلبات “same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "يتوفر مزيد من المعلومات عند ضبط الخيار DEBUG=True." - -msgid "No year specified" -msgstr "لم تحدد السنة" - -msgid "Date out of range" -msgstr "تاريخ خارج النطاق" - -msgid "No month specified" -msgstr "لم تحدد الشهر" - -msgid "No day specified" -msgstr "لم تحدد اليوم" - -msgid "No week specified" -msgstr "لم تحدد الأسبوع" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "لا يوجد %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"التاريخ بالمستقبل %(verbose_name_plural)s غير متوفر لأن قيمة %(class_name)s." -"allow_future هي False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "سلسلة تاريخ غير صالحة “%(datestr)s” شكل معين “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "لم يعثر على أي %(verbose_name)s مطابقة لهذا الإستعلام" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "الصفحة ليست \"الأخيرة\" ، ولا يمكن تحويلها إلى عدد صحيح." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "صفحة خاطئة (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "القائمة فارغة و “%(class_name)s.allow_empty” هي False." - -msgid "Directory indexes are not allowed here." -msgstr "لا يسمح لفهارس الدليل هنا." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” غير موجود" - -#, python-format -msgid "Index of %(directory)s" -msgstr "فهرس لـ %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "تمَّت عملية التثبيت بنجاح! تهانينا!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"عرض ملاحظات الإصدار ل جانغو " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"تشاهد هذه الصفحة لأن DEBUG = True موجود في ملف الإعدادات الخاص بك ولم تقم بتكوين أي " -"عناوين URL." - -msgid "Django Documentation" -msgstr "توثيق جانغو" - -msgid "Topics, references, & how-to’s" -msgstr "الموضوعات ، المراجع، & الكيفية" - -msgid "Tutorial: A Polling App" -msgstr "البرنامج التعليمي: تطبيق الاقتراع" - -msgid "Get started with Django" -msgstr "الخطوات الأولى مع جانغو" - -msgid "Django Community" -msgstr "مجتمع جانغو" - -msgid "Connect, get help, or contribute" -msgstr "الاتصال، الحصول على المساعدة أو المساهمة" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/formats.py deleted file mode 100644 index cbd361d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ar_DZ/formats.py +++ /dev/null @@ -1,29 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j F Y" -SHORT_DATETIME_FORMAT = "j F Y H:i" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y/%m/%d", # '2006/10/25' -] -TIME_INPUT_FORMATS = [ - "%H:%M", # '14:30 - "%H:%M:%S", # '14:30:59' -] -DATETIME_INPUT_FORMATS = [ - "%Y/%m/%d %H:%M", # '2006/10/25 14:30' - "%Y/%m/%d %H:%M:%S", # '2006/10/25 14:30:59' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index 31733b2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index 417f18d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,1237 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikáans" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Azerbaixanu" - -msgid "Bulgarian" -msgstr "Búlgaru" - -msgid "Belarusian" -msgstr "Bielorrusu" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "Bretón" - -msgid "Bosnian" -msgstr "Bosniu" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Czech" -msgstr "Checu" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Danés" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Griegu" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Inglés británicu" - -msgid "Esperanto" -msgstr "Esperantu" - -msgid "Spanish" -msgstr "Castellán" - -msgid "Argentinian Spanish" -msgstr "Español arxentín" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Español mexicanu" - -msgid "Nicaraguan Spanish" -msgstr "Español nicaraguanu" - -msgid "Venezuelan Spanish" -msgstr "Español venezolanu" - -msgid "Estonian" -msgstr "Estoniu" - -msgid "Basque" -msgstr "Vascu" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisón" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Gallegu" - -msgid "Hebrew" -msgstr "Hebréu" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Húngaru" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesiu" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italianu" - -msgid "Japanese" -msgstr "Xaponés" - -msgid "Georgian" -msgstr "Xeorxanu" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Canarés" - -msgid "Korean" -msgstr "Coreanu" - -msgid "Luxembourgish" -msgstr "Luxemburgués" - -msgid "Lithuanian" -msgstr "Lituanu" - -msgid "Latvian" -msgstr "Letón" - -msgid "Macedonian" -msgstr "Macedoniu" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "Birmanu" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nepalí" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk noruegu" - -msgid "Ossetic" -msgstr "Osetiu" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polacu" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués brasileñu" - -msgid "Romanian" -msgstr "Rumanu" - -msgid "Russian" -msgstr "Rusu" - -msgid "Slovak" -msgstr "Eslovacu" - -msgid "Slovenian" -msgstr "Eslovenu" - -msgid "Albanian" -msgstr "Albanu" - -msgid "Serbian" -msgstr "Serbiu" - -msgid "Serbian Latin" -msgstr "Serbiu llatín" - -msgid "Swedish" -msgstr "Suecu" - -msgid "Swahili" -msgstr "Suaḥili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Thai" -msgstr "Tailandés" - -msgid "Turkish" -msgstr "Turcu" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurtu" - -msgid "Ukrainian" -msgstr "Ucranianu" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chinu simplificáu" - -msgid "Traditional Chinese" -msgstr "Chinu tradicional" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Introduz un valor válidu." - -msgid "Enter a valid URL." -msgstr "Introduz una URL válida." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Introduz una direición de corréu válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Introduz una direición IPv4 válida." - -msgid "Enter a valid IPv6 address." -msgstr "Introduz una direición IPv6 válida." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Introduz una direición IPv4 o IPv6 válida." - -msgid "Enter only digits separated by commas." -msgstr "Introduz namái díxitos separtaos per comes." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Asegúrate qu'esti valor ye %(limit_value)s (ye %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrate qu'esti valor ye menor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrate qu'esti valor ye mayor o igual a %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrate qu'esti valor tien polo menos %(limit_value)d caráuter (tien " -"%(show_value)d)." -msgstr[1] "" -"Asegúrate qu'esti valor tien polo menos %(limit_value)d caráuteres (tien " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrate qu'esti valor tien como muncho %(limit_value)d caráuter (tien " -"%(show_value)d)." -msgstr[1] "" -"Asegúrate qu'esti valor tien como muncho %(limit_value)d caráuteres (tien " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Introduz un númberu." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrate que nun hai más de %(max)s díxitu en total." -msgstr[1] "Asegúrate que nun hai más de %(max)s díxitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrate que nun hai más de %(max)s allugamientu decimal." -msgstr[1] "Asegúrate que nun hai más de %(max)s allugamientos decimales." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrate que nun hai más de %(max)s díxitu enantes del puntu decimal." -msgstr[1] "" -"Asegúrate que nun hai más de %(max)s díxitos enantes del puntu decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Esti campu nun pue ser nulu." - -msgid "This field cannot be blank." -msgstr "Esti campu nun pue tar baleru." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s con esti %(field_label)s yá esiste." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campu de la triba: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boleanu (tamién True o False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (fasta %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Enteros separtaos per coma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Data (ensin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Data (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Númberu decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Direición de corréu" - -msgid "File path" -msgstr "Camín del ficheru" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Númberu de puntu flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Enteru" - -msgid "Big (8 byte) integer" -msgstr "Enteru big (8 byte)" - -msgid "IPv4 address" -msgstr "Direición IPv4" - -msgid "IP address" -msgstr "Direición IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boleanu (tamién True, False o None)" - -msgid "Positive integer" -msgstr "Enteru positivu" - -msgid "Positive small integer" -msgstr "Enteru pequeñu positivu" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (fasta %(max_length)s)" - -msgid "Small integer" -msgstr "Enteru pequeñu" - -msgid "Text" -msgstr "Testu" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos binarios crudos" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Ficheru" - -msgid "Image" -msgstr "Imaxe" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave foriata (triba determinada pol campu rellacionáu)" - -msgid "One-to-one relationship" -msgstr "Rellación a ún" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Rellación a munchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Requierse esti campu." - -msgid "Enter a whole number." -msgstr "Introduz un númberu completu" - -msgid "Enter a valid date." -msgstr "Introduz una data válida." - -msgid "Enter a valid time." -msgstr "Introduz una hora válida." - -msgid "Enter a valid date/time." -msgstr "Introduz una data/hora válida." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nun s'unvió'l ficheru. Comprueba la triba de cifráu nel formulariu." - -msgid "No file was submitted." -msgstr "No file was submitted." - -msgid "The submitted file is empty." -msgstr "El ficheru dunviáu ta baleru." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrate qu'esti nome de ficheru tien polo menos %(max)d caráuter (tien " -"%(length)d)." -msgstr[1] "" -"Asegúrate qu'esti nome de ficheru tien polo menos %(max)d caráuteres (tien " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Por favor, dunvia un ficheru o conseña la caxella , non dambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Xubi una imaxe válida. El ficheru que xubiesti o nun yera una imaxe, o taba " -"toriada." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Esbilla una escoyeta válida. %(value)s nun una ún de les escoyetes " -"disponibles." - -msgid "Enter a list of values." -msgstr "Introduz una llista valores." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campu anubríu %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Por favor, dunvia %d o menos formularios." -msgstr[1] "Por favor, dunvia %d o menos formularios." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Orde" - -msgid "Delete" -msgstr "Desanciar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, igua'l datu duplicáu de %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor, igua'l datu duplicáu pa %(field)s, el cual tien de ser únicu." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor, igua'l datu duplicáu de %(field_name)s el cual tien de ser únicu " -"pal %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, igua los valores duplicaos embaxo" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Esbilla una escoyeta válida. Esa escoyeta nun ye una de les escoyetes " -"disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Llimpiar" - -msgid "Currently" -msgstr "Anguaño" - -msgid "Change" -msgstr "Camudar" - -msgid "Unknown" -msgstr "Desconocíu" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "Non" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "sí,non,quiciabes" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "Media nueche" - -msgid "noon" -msgstr "Meudía" - -msgid "Monday" -msgstr "Llunes" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Miércoles" - -msgid "Thursday" -msgstr "Xueves" - -msgid "Friday" -msgstr "Vienres" - -msgid "Saturday" -msgstr "Sábadu" - -msgid "Sunday" -msgstr "Domingu" - -msgid "Mon" -msgstr "LLu" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mie" - -msgid "Thu" -msgstr "Xue" - -msgid "Fri" -msgstr "Vie" - -msgid "Sat" -msgstr "Sáb" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Xineru" - -msgid "February" -msgstr "Febreru" - -msgid "March" -msgstr "Marzu" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayu" - -msgid "June" -msgstr "Xunu" - -msgid "July" -msgstr "Xunetu" - -msgid "August" -msgstr "Agostu" - -msgid "September" -msgstr "Setiembre" - -msgid "October" -msgstr "Ochobre" - -msgid "November" -msgstr "Payares" - -msgid "December" -msgstr "Avientu" - -msgid "jan" -msgstr "xin" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "xun" - -msgid "jul" -msgstr "xnt" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "och" - -msgid "nov" -msgstr "pay" - -msgid "dec" -msgstr "avi" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Xin." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "May." - -msgctxt "abbrev. month" -msgid "June" -msgstr "Xun." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Xnt." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Och." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Pay." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Avi." - -msgctxt "alt. month" -msgid "January" -msgstr "Xineru" - -msgctxt "alt. month" -msgid "February" -msgstr "Febreru" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzu" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayu" - -msgctxt "alt. month" -msgid "June" -msgstr "Xunu" - -msgctxt "alt. month" -msgid "July" -msgstr "Xunetu" - -msgctxt "alt. month" -msgid "August" -msgstr "Agostu" - -msgctxt "alt. month" -msgid "September" -msgstr "Setiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Ochobre" - -msgctxt "alt. month" -msgid "November" -msgstr "Payares" - -msgctxt "alt. month" -msgid "December" -msgstr "Avientu" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d añu" -msgstr[1] "%d años" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d meses" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d selmana" -msgstr[1] "%d selmanes" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d día" -msgstr[1] "%d díes" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d hores" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minutu" -msgstr[1] "%d minutos" - -msgid "0 minutes" -msgstr "0 minutos" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Nun s'especificó l'añu" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Nun s'especificó'l mes" - -msgid "No day specified" -msgstr "Nun s'especificó'l día" - -msgid "No week specified" -msgstr "Nun s'especificó la selmana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ensin %(verbose_name_plural)s disponible" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Nun ta disponible'l %(verbose_name_plural)s futuru porque %(class_name)s." -"allow_future ye False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nun s'alcontró %(verbose_name)s que concase cola gueta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Páxina inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Nun tán almitíos equí los indexaos de direutoriu." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índiz de %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 441b0ca..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/az/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index 72734bb..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,1347 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Emin Mastizada , 2018,2020 -# Emin Mastizada , 2015-2016 -# Metin Amiroff , 2011 -# Nicat Məmmədov , 2022 -# Nijat Mammadov, 2024 -# Sevdimali , 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Sevdimali , 2024\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Ərəb" - -msgid "Algerian Arabic" -msgstr "Əlcəzair Ərəbcəsi" - -msgid "Asturian" -msgstr "Asturiya" - -msgid "Azerbaijani" -msgstr "Azərbaycan" - -msgid "Bulgarian" -msgstr "Bolqar" - -msgid "Belarusian" -msgstr "Belarus" - -msgid "Bengali" -msgstr "Benqal" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosniya" - -msgid "Catalan" -msgstr "Katalon" - -msgid "Central Kurdish (Sorani)" -msgstr "Mərkəzi Kürd dili (Sorani)" - -msgid "Czech" -msgstr "Çex" - -msgid "Welsh" -msgstr "Uels" - -msgid "Danish" -msgstr "Danimarka" - -msgid "German" -msgstr "Alman" - -msgid "Lower Sorbian" -msgstr "Aşağı Sorb" - -msgid "Greek" -msgstr "Yunan" - -msgid "English" -msgstr "İngilis" - -msgid "Australian English" -msgstr "Avstraliya İngiliscəsi" - -msgid "British English" -msgstr "Britaniya İngiliscəsi" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "İspan" - -msgid "Argentinian Spanish" -msgstr "Argentina İspancası" - -msgid "Colombian Spanish" -msgstr "Kolumbia İspancası" - -msgid "Mexican Spanish" -msgstr "Meksika İspancası" - -msgid "Nicaraguan Spanish" -msgstr "Nikaraqua İspancası" - -msgid "Venezuelan Spanish" -msgstr "Venesuela İspancası" - -msgid "Estonian" -msgstr "Eston" - -msgid "Basque" -msgstr "Bask" - -msgid "Persian" -msgstr "Fars" - -msgid "Finnish" -msgstr "Fin" - -msgid "French" -msgstr "Fransız" - -msgid "Frisian" -msgstr "Fris" - -msgid "Irish" -msgstr "İrland" - -msgid "Scottish Gaelic" -msgstr "Şotland Keltcəsi" - -msgid "Galician" -msgstr "Qalisiya" - -msgid "Hebrew" -msgstr "İvrit" - -msgid "Hindi" -msgstr "Hind" - -msgid "Croatian" -msgstr "Xorvat" - -msgid "Upper Sorbian" -msgstr "Yuxarı Sorb" - -msgid "Hungarian" -msgstr "Macar" - -msgid "Armenian" -msgstr "Erməni" - -msgid "Interlingua" -msgstr "İnterlinqua" - -msgid "Indonesian" -msgstr "İndoneziya dili" - -msgid "Igbo" -msgstr "İqbo" - -msgid "Ido" -msgstr "İdo" - -msgid "Icelandic" -msgstr "İsland" - -msgid "Italian" -msgstr "İtalyan" - -msgid "Japanese" -msgstr "Yapon" - -msgid "Georgian" -msgstr "Gürcü" - -msgid "Kabyle" -msgstr "Kabile" - -msgid "Kazakh" -msgstr "Qazax" - -msgid "Khmer" -msgstr "Xmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreya" - -msgid "Kyrgyz" -msgstr "Qırğız" - -msgid "Luxembourgish" -msgstr "Lüksemburq" - -msgid "Lithuanian" -msgstr "Litva" - -msgid "Latvian" -msgstr "Latış" - -msgid "Macedonian" -msgstr "Makedon" - -msgid "Malayalam" -msgstr "Malayam" - -msgid "Mongolian" -msgstr "Monqol" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malay" - -msgid "Burmese" -msgstr "Birman" - -msgid "Norwegian Bokmål" -msgstr "Norveç Bukmolcası" - -msgid "Nepali" -msgstr "Nepal" - -msgid "Dutch" -msgstr "Niderland" - -msgid "Norwegian Nynorsk" -msgstr "Norveç Nyunorskcası" - -msgid "Ossetic" -msgstr "Osetin" - -msgid "Punjabi" -msgstr "Pəncab" - -msgid "Polish" -msgstr "Polyak" - -msgid "Portuguese" -msgstr "Portuqal" - -msgid "Brazilian Portuguese" -msgstr "Braziliya Portuqalcası" - -msgid "Romanian" -msgstr "Rumın" - -msgid "Russian" -msgstr "Rus" - -msgid "Slovak" -msgstr "Slovak" - -msgid "Slovenian" -msgstr "Sloven" - -msgid "Albanian" -msgstr "Alban" - -msgid "Serbian" -msgstr "Serb" - -msgid "Serbian Latin" -msgstr "Serb (Latın)" - -msgid "Swedish" -msgstr "İsveç" - -msgid "Swahili" -msgstr "Suahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Teluqu" - -msgid "Tajik" -msgstr "Tacik" - -msgid "Thai" -msgstr "Tay" - -msgid "Turkmen" -msgstr "Türkmən" - -msgid "Turkish" -msgstr "Türk" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uyğur" - -msgid "Ukrainian" -msgstr "Ukrayn" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Özbək" - -msgid "Vietnamese" -msgstr "Vyetnam" - -msgid "Simplified Chinese" -msgstr "Sadələşdirilmiş Çin dili" - -msgid "Traditional Chinese" -msgstr "Ənənəvi Çin dili" - -msgid "Messages" -msgstr "Mesajlar" - -msgid "Site Maps" -msgstr "Sayt Xəritələri" - -msgid "Static Files" -msgstr "Statik Fayllar" - -msgid "Syndication" -msgstr "Sindikasiya" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Səhifə nömrəsi rəqəm deyil" - -msgid "That page number is less than 1" -msgstr "Səhifə nömrəsi 1-dən balacadır" - -msgid "That page contains no results" -msgstr "O səhifədə nəticə yoxdur" - -msgid "Enter a valid value." -msgstr "Düzgün dəyər daxil edin." - -msgid "Enter a valid domain name." -msgstr "Düzgün domen adı daxil edin." - -msgid "Enter a valid URL." -msgstr "Düzgün URL daxil edin." - -msgid "Enter a valid integer." -msgstr "Düzgün rəqəm daxil edin." - -msgid "Enter a valid email address." -msgstr "Düzgün e-poçt ünvanı daxil edin." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Hərflərdən, rəqəmlərdən, alt-xətlərdən və ya defislərdən ibarət düzgün " -"qısaltma (“slug”) daxil edin." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Unicode hərflərdən, rəqəmlərdən, alt-xətlərdən və ya defislərdən ibarət " -"düzgün qısaltma (“slug”) daxil edin." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Düzgün %(protocol)s adres daxil edin." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 və ya IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Vergüllə ayırmaqla yalnız rəqəmlər daxil edin." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Əmin olun ki, bu dəyər %(limit_value)s-dir/dır (bu %(show_value)s-dir/dır)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Bu qiymətin %(limit_value)s-(y)a/ə bərabər və ya ondan kiçik olduğunu " -"yoxlayın." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Bu qiymətin %(limit_value)s-(y)a/ə bərabər və ya ondan böyük olduğunu " -"yoxlayın." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Bu dəyərin %(limit_value)s addım ölçüsünün mərtəbələri olduğundan əmin olun." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Bu dəyərin %(offset)s dəyərindən başlayaraq %(limit_value)s addım ölçüsü " -"mərtəbəsi olduğundan əmin olun. Məs: %(offset)s, %(valid_value1)s, " -"%(valid_value2)s və s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"simvol var)" -msgstr[1] "" -"Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"simvol var)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"simvol var)" -msgstr[1] "" -"Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"simvol var)" - -msgid "Enter a number." -msgstr "Ədəd daxil edin." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Toplamda %(max)s rəqəmdən çox olmadığına əmin olun." -msgstr[1] "Toplamda %(max)s rəqəmdən çox olmadığına əmin olun." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Onluq hissənin %(max)s rəqəmdən çox olmadığına əmin olun." -msgstr[1] "Onluq hissənin %(max)s rəqəmdən çox olmadığına əmin olun." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Onluq hissədən əvvəl %(max)s rəqəmdən çox olmadığına əmin olun." -msgstr[1] "Onluq hissədən əvvəl %(max)s rəqəmdən çox olmadığına əmin olun." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"“%(extension)s” fayl uzantısına icazə verilmir. İcazə verilən fayl " -"uzantıları: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null simvollara icazə verilmir." - -msgid "and" -msgstr "və" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s ilə %(model_name)s artıq mövcuddur." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "“%(name)s” məhdudiyyəti pozuldu." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r dəyəri doğru seçim deyil." - -msgid "This field cannot be null." -msgstr "Bu sahə boş qala bilməz." - -msgid "This field cannot be blank." -msgstr "Bu sahə ağ qala bilməz." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s bu %(field_label)s sahə ilə artıq mövcuddur." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s dəyəri %(date_field_label)s %(lookup_type)s üçün unikal " -"olmalıdır." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Sahənin tipi: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” dəyəri ya True, ya da False olmalıdır." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” dəyəri True, False və ya None olmalıdır." - -msgid "Boolean (Either True or False)" -msgstr "Bul (ya Doğru, ya Yalan)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Sətir (%(max_length)s simvola kimi)" - -msgid "String (unlimited)" -msgstr "Sətir (limitsiz)" - -msgid "Comma-separated integers" -msgstr "Vergüllə ayrılmış tam ədədlər" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” dəyəri səhv tarix formatındadır. Formatı YYYY-MM-DD olmalıdır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” dəyəri düzgün formatdadır (YYYY-MM-DD), amma bu tarix xətalıdır." - -msgid "Date (without time)" -msgstr "Tarix (saatsız)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” dəyərinin formatı səhvdir. Formatı YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ] olmalıdır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” dəyərinin formatı düzgündür (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"amma bu tarix xətalıdır." - -msgid "Date (with time)" -msgstr "Tarix (vaxt ilə)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” dəyəri onluq kəsrli (decimal) rəqəm olmalıdır." - -msgid "Decimal number" -msgstr "Rasional ədəd" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” dəyərinin formatı səhvdir. Formatı [DD] [HH:[MM:]]ss[.uuuuuu] " -"olmalıdır." - -msgid "Duration" -msgstr "Müddət" - -msgid "Email address" -msgstr "E-poçt" - -msgid "File path" -msgstr "Faylın ünvanı" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” dəyəri float olmalıdır." - -msgid "Floating point number" -msgstr "Sürüşən vergüllü ədəd" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” dəyəri tam rəqəm olmalıdır." - -msgid "Integer" -msgstr "Tam ədəd" - -msgid "Big (8 byte) integer" -msgstr "Böyük (8 bayt) tam ədəd" - -msgid "Small integer" -msgstr "Kiçik tam ədəd" - -msgid "IPv4 address" -msgstr "IPv4 ünvanı" - -msgid "IP address" -msgstr "IP ünvan" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” dəyəri None, True və ya False olmalıdır." - -msgid "Boolean (Either True, False or None)" -msgstr "Bul (Ya True, ya False, ya da None)" - -msgid "Positive big integer" -msgstr "Müsbət böyük rəqəm" - -msgid "Positive integer" -msgstr "Müsbət tam ədəd" - -msgid "Positive small integer" -msgstr "Müsbət tam kiçik ədəd" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Əzmə (%(max_length)s simvola kimi)" - -msgid "Text" -msgstr "Mətn" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” dəyərinin formatı səhvdir. Formatı HH:MM[:ss[.uuuuuu]] olmalıdır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” dəyəri düzgün formatdadır (HH:MM[:ss[.uuuuuu]]), amma vaxtı " -"xətalıdır." - -msgid "Time" -msgstr "Vaxt" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Düz ikili (binary) məlumat" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” keçərli UUID deyil." - -msgid "Universally unique identifier" -msgstr "Universal təkrarolunmaz identifikator" - -msgid "File" -msgstr "Fayl" - -msgid "Image" -msgstr "Şəkil" - -msgid "A JSON object" -msgstr "JSON obyekti" - -msgid "Value must be valid JSON." -msgstr "Dəyər düzgün JSON olmalıdır." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s dəyəri %(value)r olan %(model)s mövcud deyil." - -msgid "Foreign Key (type determined by related field)" -msgstr "Xarici açar (bağlı olduğu sahəyə uyğun tipi alır)" - -msgid "One-to-one relationship" -msgstr "Birin-birə münasibət" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s əlaqəsi" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s əlaqələri" - -msgid "Many-to-many relationship" -msgstr "Çoxun-çoxa münasibət" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Bu sahə vacibdir." - -msgid "Enter a whole number." -msgstr "Tam ədəd daxil edin." - -msgid "Enter a valid date." -msgstr "Düzgün tarix daxil edin." - -msgid "Enter a valid time." -msgstr "Düzgün vaxt daxil edin." - -msgid "Enter a valid date/time." -msgstr "Düzgün tarix/vaxt daxil edin." - -msgid "Enter a valid duration." -msgstr "Keçərli müddət daxil edin." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Günlərin sayı {min_days} ilə {max_days} arasında olmalıdır." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Fayl göndərilməyib. Vərəqənin (\"form\") şifrələmə tipini yoxlayın." - -msgid "No file was submitted." -msgstr "Fayl göndərilməyib." - -msgid "The submitted file is empty." -msgstr "Göndərilən fayl boşdur." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Bu fayl adının ən çox %(max)d simvol olduğuna əmin olun (%(length)d var)." -msgstr[1] "" -"Bu fayl adının ən çox %(max)d simvol olduğuna əmin olun (%(length)d var)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Ya fayl göndərin, ya da xanaya quş qoymayın, hər ikisini də birdən etməyin." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Düzgün şəkil göndərin. Göndərdiyiniz fayl ya şəkil deyil, ya da şəkildə " -"problem var." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Düzgün seçim edin. %(value)s seçimlər arasında yoxdur." - -msgid "Enter a list of values." -msgstr "Qiymətlərin siyahısını daxil edin." - -msgid "Enter a complete value." -msgstr "Tam dəyər daxil edin." - -msgid "Enter a valid UUID." -msgstr "Keçərli UUID daxil et." - -msgid "Enter a valid JSON." -msgstr "Etibarlı bir JSON daxil edin." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Gizli %(name)s sahəsi) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm datası ya əskikdir, ya da dəyişdirilib. Çatışmayan xanalar: " -"%(field_names)s. Problem davam edərsə, səhv hesabatı təqdim etməli ola " -"bilərsiniz." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Zəhmət olmasa ən çox %(num)d forma təsdiqləyin." -msgstr[1] "Zəhmət olmasa ən çox %(num)d forma təsdiqləyin." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Zəhmət olmasa ən az %(num)d forma təsdiqləyin." -msgstr[1] "Zəhmət olmasa ən az %(num)d forma təsdiqləyin." - -msgid "Order" -msgstr "Sırala" - -msgid "Delete" -msgstr "Sil" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin, onların hamısı " -"fərqli olmalıdır." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin, onlar " -"%(date_field)s %(lookup)s-a görə fərqli olmalıdır." - -msgid "Please correct the duplicate values below." -msgstr "Aşağıda təkrarlanan qiymətlərə düzəliş edin." - -msgid "The inline value did not match the parent instance." -msgstr "Sətiriçi dəyər ana nüsxəyə uyğun deyil." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Düzgün seçim edin. Bu seçim mümkün deyil." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” düzgün dəyər deyil." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s vaxtı %(current_timezone)s zaman qurşağında ifadə oluna bilmir; " -"ya qeyri-müəyyənlik, ya da mövcud olmaya bilər." - -msgid "Clear" -msgstr "Təmizlə" - -msgid "Currently" -msgstr "Hal-hazırda" - -msgid "Change" -msgstr "Dəyiş" - -msgid "Unknown" -msgstr "Məlum deyil" - -msgid "Yes" -msgstr "Hə" - -msgid "No" -msgstr "Yox" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "hə,yox,bəlkə" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bayt" -msgstr[1] "%(size)d bayt" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s QB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "g.s." - -msgid "a.m." -msgstr "g.ə." - -msgid "PM" -msgstr "GS" - -msgid "AM" -msgstr "GƏ" - -msgid "midnight" -msgstr "gecə yarısı" - -msgid "noon" -msgstr "günorta" - -msgid "Monday" -msgstr "Bazar ertəsi" - -msgid "Tuesday" -msgstr "Çərşənbə axşamı" - -msgid "Wednesday" -msgstr "Çərşənbə" - -msgid "Thursday" -msgstr "Cümə axşamı" - -msgid "Friday" -msgstr "Cümə" - -msgid "Saturday" -msgstr "Şənbə" - -msgid "Sunday" -msgstr "Bazar" - -msgid "Mon" -msgstr "B.e" - -msgid "Tue" -msgstr "Ç.a" - -msgid "Wed" -msgstr "Çrş" - -msgid "Thu" -msgstr "C.a" - -msgid "Fri" -msgstr "Cüm" - -msgid "Sat" -msgstr "Şnb" - -msgid "Sun" -msgstr "Bzr" - -msgid "January" -msgstr "Yanvar" - -msgid "February" -msgstr "Fevral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Aprel" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "İyun" - -msgid "July" -msgstr "İyul" - -msgid "August" -msgstr "Avqust" - -msgid "September" -msgstr "Sentyabr" - -msgid "October" -msgstr "Oktyabr" - -msgid "November" -msgstr "Noyabr" - -msgid "December" -msgstr "Dekabr" - -msgid "jan" -msgstr "ynv" - -msgid "feb" -msgstr "fvr" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "iyn" - -msgid "jul" -msgstr "iyl" - -msgid "aug" -msgstr "avq" - -msgid "sep" -msgstr "snt" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "noy" - -msgid "dec" -msgstr "dek" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Yan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Fev." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprel" - -msgctxt "abbrev. month" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month" -msgid "June" -msgstr "İyun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "İyul" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Avq." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sen." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Noy." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dek." - -msgctxt "alt. month" -msgid "January" -msgstr "Yanvar" - -msgctxt "alt. month" -msgid "February" -msgstr "Fevral" - -msgctxt "alt. month" -msgid "March" -msgstr "Mart" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprel" - -msgctxt "alt. month" -msgid "May" -msgstr "May" - -msgctxt "alt. month" -msgid "June" -msgstr "İyun" - -msgctxt "alt. month" -msgid "July" -msgstr "İyul" - -msgctxt "alt. month" -msgid "August" -msgstr "Avqust" - -msgctxt "alt. month" -msgid "September" -msgstr "Sentyabr" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktyabr" - -msgctxt "alt. month" -msgid "November" -msgstr "Noyabr" - -msgctxt "alt. month" -msgid "December" -msgstr "Dekabr" - -msgid "This is not a valid IPv6 address." -msgstr "Bu doğru IPv6 ünvanı deyil." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "və ya" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d il" -msgstr[1] "%(num)d il" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ay" -msgstr[1] "%(num)d ay" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d həftə" -msgstr[1] "%(num)d həftə" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d saat" -msgstr[1] "%(num)d saat" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d dəqiqə" -msgstr[1] "%(num)d dəqiqə" - -msgid "Forbidden" -msgstr "Qadağan" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF təsdiqləmə alınmadı. Sorğu ləğv edildi." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Bu mesajı ona görə görürsünüz ki, bu HTTPS saytı sizin səyyah tərəfindən " -"“Referer header”in göndərilməsini tələb etdiyi halda heç nə " -"göndərilməmişdir. Bu başlıq sizin veb-səyyahınızın kənar şəxlər tərəfindən " -"ələ keçirilmədiyindən əmin olmaq üçün tələb olunur." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Əgər səyyahınızın “Referer” başlığını göndərməsini söndürmüsünüzsə, lütfən " -"bu sayt üçün, HTTPS əlaqələr üçün və ya “same-origin” sorğular üçün aktiv " -"edin." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Əgər etiketini və ya " -"“Referrer-Policy: no-referrer” başlığını işlədirsinizsə, lütfən silin. CSRF " -"qoruma dəqiq yönləndirən yoxlaması üçün “Referer” başlığını tələb edir. Əgər " -"məxfilik üçün düşünürsünüzsə, üçüncü tərəf sayt keçidləri üçün kimi bir alternativ işlədin." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Bu sayt formaları göndərmək üçün CSRF çərəzini işlədir. Bu çərəz " -"səyyahınızın üçüncü biri tərəfindən hack-lənmədiyinə əmin olmaq üçün " -"istifadə edilir. " - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Əgər səyyahınızda çərəzlər söndürülübsə, lütfən bu sayt və ya “same-origin” " -"sorğular üçün aktiv edin." - -msgid "More information is available with DEBUG=True." -msgstr "Daha ətraflı məlumat DEBUG=True ilə mövcuddur." - -msgid "No year specified" -msgstr "İl göstərilməyib" - -msgid "Date out of range" -msgstr "Tarix aralığın xaricindədir" - -msgid "No month specified" -msgstr "Ay göstərilməyib" - -msgid "No day specified" -msgstr "Gün göstərilməyib" - -msgid "No week specified" -msgstr "Həftə göstərilməyib" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s seçmək mümkün deyil" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Gələcək %(verbose_name_plural)s seçmək mümkün deyil, çünki %(class_name)s." -"allow_future Yalan kimi qeyd olunub." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "“%(format)s” formatına görə “%(datestr)s” tarixi düzgün deyil" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Sorğuya uyğun %(verbose_name)s tapılmadı" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Səhifə həm “axırıncı” deyil, həm də tam ədədə çevrilə bilmir." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Yanlış səhifə (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Siyahı boşdur və “%(class_name)s.allow_empty” dəyəri False-dur." - -msgid "Directory indexes are not allowed here." -msgstr "Ünvan indekslərinə icazə verilmir." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” mövcud deyil" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s-nin indeksi" - -msgid "The install worked successfully! Congratulations!" -msgstr "Quruluş uğurla tamamlandı! Təbriklər!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django %(version)s üçün buraxılış " -"qeydlərinə baxın" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Tənzimləmə faylınızda DEBUG=True və heç bir URL qurmadığınız üçün bu səhifəni " -"görürsünüz." - -msgid "Django Documentation" -msgstr "Django Dokumentasiya" - -msgid "Topics, references, & how-to’s" -msgstr "Mövzular, istinadlar və nümunələr" - -msgid "Tutorial: A Polling App" -msgstr "Məşğələ: Səsvermə Tətbiqi" - -msgid "Get started with Django" -msgstr "Django ilə başla" - -msgid "Django Community" -msgstr "Django İcması" - -msgid "Connect, get help, or contribute" -msgstr "Qoşul, kömək al və dəstək ol" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/az/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/az/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/az/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/az/formats.py deleted file mode 100644 index 253b6dd..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/az/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j E Y, G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index 9c04ff1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/be/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index a817206..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,1391 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2014-2015 -# znotdead , 2016-2017,2019-2021,2023-2024 -# Bobsans , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: znotdead , " -"2016-2017,2019-2021,2023-2024\n" -"Language-Team: Belarusian (http://app.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Afrikaans" -msgstr "Афрыкаанс" - -msgid "Arabic" -msgstr "Арабская" - -msgid "Algerian Arabic" -msgstr "Алжырская арабская" - -msgid "Asturian" -msgstr "Астурыйская" - -msgid "Azerbaijani" -msgstr "Азэрбайджанская" - -msgid "Bulgarian" -msgstr "Баўгарская" - -msgid "Belarusian" -msgstr "Беларуская" - -msgid "Bengali" -msgstr "Бэнґальская" - -msgid "Breton" -msgstr "Брэтонская" - -msgid "Bosnian" -msgstr "Басьнійская" - -msgid "Catalan" -msgstr "Каталёнская" - -msgid "Central Kurdish (Sorani)" -msgstr "Цэнтральнакурдская (сарані)" - -msgid "Czech" -msgstr "Чэская" - -msgid "Welsh" -msgstr "Валійская" - -msgid "Danish" -msgstr "Дацкая" - -msgid "German" -msgstr "Нямецкая" - -msgid "Lower Sorbian" -msgstr "Ніжнелужыцкая" - -msgid "Greek" -msgstr "Грэцкая" - -msgid "English" -msgstr "Анґельская" - -msgid "Australian English" -msgstr "Анґельская (Аўстралія)" - -msgid "British English" -msgstr "Анґельская (Брытанская)" - -msgid "Esperanto" -msgstr "Эспэранта" - -msgid "Spanish" -msgstr "Гішпанская" - -msgid "Argentinian Spanish" -msgstr "Гішпанская (Арґентына)" - -msgid "Colombian Spanish" -msgstr "Гішпанская (Калумбія)" - -msgid "Mexican Spanish" -msgstr "Гішпанская (Мэксыка)" - -msgid "Nicaraguan Spanish" -msgstr "Гішпанская (Нікараґуа)" - -msgid "Venezuelan Spanish" -msgstr "Іспанская (Вэнэсуэла)" - -msgid "Estonian" -msgstr "Эстонская" - -msgid "Basque" -msgstr "Басконская" - -msgid "Persian" -msgstr "Фарсі" - -msgid "Finnish" -msgstr "Фінская" - -msgid "French" -msgstr "Француская" - -msgid "Frisian" -msgstr "Фрызкая" - -msgid "Irish" -msgstr "Ірляндзкая" - -msgid "Scottish Gaelic" -msgstr "Гэльская шатляндзкая" - -msgid "Galician" -msgstr "Ґальская" - -msgid "Hebrew" -msgstr "Габрэйская" - -msgid "Hindi" -msgstr "Гінды" - -msgid "Croatian" -msgstr "Харвацкая" - -msgid "Upper Sorbian" -msgstr "Верхнелужыцкая" - -msgid "Hungarian" -msgstr "Вугорская" - -msgid "Armenian" -msgstr "Армянскі" - -msgid "Interlingua" -msgstr "Інтэрлінгва" - -msgid "Indonesian" -msgstr "Інданэзійская" - -msgid "Igbo" -msgstr "Ігба" - -msgid "Ido" -msgstr "Іда" - -msgid "Icelandic" -msgstr "Ісьляндзкая" - -msgid "Italian" -msgstr "Італьянская" - -msgid "Japanese" -msgstr "Японская" - -msgid "Georgian" -msgstr "Грузінская" - -msgid "Kabyle" -msgstr "Кабільскі" - -msgid "Kazakh" -msgstr "Казаская" - -msgid "Khmer" -msgstr "Кхмерская" - -msgid "Kannada" -msgstr "Каннада" - -msgid "Korean" -msgstr "Карэйская" - -msgid "Kyrgyz" -msgstr "Кіргізская" - -msgid "Luxembourgish" -msgstr "Люксэмбургская" - -msgid "Lithuanian" -msgstr "Літоўская" - -msgid "Latvian" -msgstr "Латыская" - -msgid "Macedonian" -msgstr "Македонская" - -msgid "Malayalam" -msgstr "Малаялам" - -msgid "Mongolian" -msgstr "Манґольская" - -msgid "Marathi" -msgstr "Маратхі" - -msgid "Malay" -msgstr "Малайская" - -msgid "Burmese" -msgstr "Бірманская" - -msgid "Norwegian Bokmål" -msgstr "Нарвэская букмал" - -msgid "Nepali" -msgstr "Нэпальская" - -msgid "Dutch" -msgstr "Галяндзкая" - -msgid "Norwegian Nynorsk" -msgstr "Нарвэская нюнорск" - -msgid "Ossetic" -msgstr "Асяцінская" - -msgid "Punjabi" -msgstr "Панджабі" - -msgid "Polish" -msgstr "Польская" - -msgid "Portuguese" -msgstr "Партуґальская" - -msgid "Brazilian Portuguese" -msgstr "Партуґальская (Бразылія)" - -msgid "Romanian" -msgstr "Румынская" - -msgid "Russian" -msgstr "Расейская" - -msgid "Slovak" -msgstr "Славацкая" - -msgid "Slovenian" -msgstr "Славенская" - -msgid "Albanian" -msgstr "Альбанская" - -msgid "Serbian" -msgstr "Сэрбская" - -msgid "Serbian Latin" -msgstr "Сэрбская (лацінка)" - -msgid "Swedish" -msgstr "Швэдзкая" - -msgid "Swahili" -msgstr "Суахілі" - -msgid "Tamil" -msgstr "Тамільская" - -msgid "Telugu" -msgstr "Тэлуґу" - -msgid "Tajik" -msgstr "Таджыкскі" - -msgid "Thai" -msgstr "Тайская" - -msgid "Turkmen" -msgstr "Туркменская" - -msgid "Turkish" -msgstr "Турэцкая" - -msgid "Tatar" -msgstr "Татарская" - -msgid "Udmurt" -msgstr "Удмурцкая" - -msgid "Uyghur" -msgstr "Уйгурскі" - -msgid "Ukrainian" -msgstr "Украінская" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "Узбецкі" - -msgid "Vietnamese" -msgstr "Віетнамская" - -msgid "Simplified Chinese" -msgstr "Кітайская (спрошчаная)" - -msgid "Traditional Chinese" -msgstr "Кітайская (звычайная)" - -msgid "Messages" -msgstr "Паведамленні" - -msgid "Site Maps" -msgstr "Мапы сайту" - -msgid "Static Files" -msgstr "Cтатычныя файлы" - -msgid "Syndication" -msgstr "Сындыкацыя" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Лік гэтай старонкі не з'яўляецца цэлым лікам" - -msgid "That page number is less than 1" -msgstr "Лік старонкі менш чым 1" - -msgid "That page contains no results" -msgstr "Гэтая старонка не мае ніякіх вынікаў" - -msgid "Enter a valid value." -msgstr "Пазначце правільнае значэньне." - -msgid "Enter a valid domain name." -msgstr "Пазначце сапраўднае даменнае имя." - -msgid "Enter a valid URL." -msgstr "Пазначце чынную спасылку." - -msgid "Enter a valid integer." -msgstr "Увядзіце цэлы лік." - -msgid "Enter a valid email address." -msgstr "Увядзіце сапраўдны адрас электроннай пошты." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Значэнне павінна быць толькі з літараў, личбаў, знакаў падкрэслівання ці " -"злучкі." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Значэнне павінна быць толькі з літараў стандарту Unicode, личбаў, знакаў " -"падкрэслівання ці злучкі." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Пазначце сапраўдны %(protocol)s адрас." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 або IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Набярыце лічбы, падзеленыя коскамі." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Упэўніцеся, што гэтае значэньне — %(limit_value)s (зараз яно — " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Значэньне мусіць быць меншым або роўным %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Значэньне мусіць быць большым або роўным %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Пераканайцеся, што гэта значэнне кратнае памеру кроку %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Пераканайцеся, што гэта значэнне кратнае памеру кроку %(limit_value)s, " -"пачынаючы з %(offset)s, напрыклад. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, і гэтак далей." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвал (зараз " -"%(show_value)d)." -msgstr[1] "" -"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвала (зараз " -"%(show_value)d)." -msgstr[2] "" -"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвалаў (зараз " -"%(show_value)d)." -msgstr[3] "" -"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвалаў (зараз " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвал (зараз " -"%(show_value)d)." -msgstr[1] "" -"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвала (зараз " -"%(show_value)d)." -msgstr[2] "" -"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвалаў (зараз " -"%(show_value)d)." -msgstr[3] "" -"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвалаў (зараз " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Набярыце лік." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Упэўніцеся, што набралі ня болей за %(max)s лічбу." -msgstr[1] "Упэўніцеся, што набралі ня болей за %(max)s лічбы." -msgstr[2] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў." -msgstr[3] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Упэўніцеся, што набралі ня болей за %(max)s лічбу пасьля коскі." -msgstr[1] "Упэўніцеся, што набралі ня болей за %(max)s лічбы пасьля коскі." -msgstr[2] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў пасьля коскі." -msgstr[3] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў пасьля коскі." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Упэўніцеся, што набралі ня болей за %(max)s лічбу да коскі." -msgstr[1] "Упэўніцеся, што набралі ня болей за %(max)s лічбы да коскі." -msgstr[2] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў да коскі." -msgstr[3] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў да коскі." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Пашырэнне файла “%(extension)s” не дапускаецца. Дапушчальныя пашырэння: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null сімвалы не дапускаюцца." - -msgid "and" -msgstr "і" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s з такім %(field_labels)s ужо існуе." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Абмежаванне \"%(name)s\" парушана." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Значэнне %(value)r не з'яўляецца правільным выбарам." - -msgid "This field cannot be null." -msgstr "Поле ня можа мець значэньне «null»." - -msgid "This field cannot be blank." -msgstr "Трэба запоўніць поле." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s з такім %(field_label)s ужо існуе." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s павінна быць унікальна для %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Палі віду: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Значэньне “%(value)s” павінна быць True альбо False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Значэньне “%(value)s” павінна быць True, False альбо None." - -msgid "Boolean (Either True or False)" -msgstr "Ляґічнае («сапраўдна» або «не сапраўдна»)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Радок (ня болей за %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Радок (неабмежаваны)" - -msgid "Comma-separated integers" -msgstr "Цэлыя лікі, падзеленыя коскаю" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Значэнне “%(value)s” мае няправільны фармат. Яно павінна быць у фармаце ГГГГ-" -"ММ-ДД." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Значэнне “%(value)s” мае правільны фармат(ГГГГ-ММ-ДД) але гэта несапраўдная " -"дата." - -msgid "Date (without time)" -msgstr "Дата (бяз часу)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Значэнне “%(value)s” мае няправільны фармат. Яно павінна быць у фармаце ГГГГ-" -"ММ-ДД ГГ:ХХ[:сс[.мммммм]][ЧА], дзе ЧА — часавы абсяг." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Значэнне “%(value)s” мае правільны фармат (ГГГГ-ММ-ДД ГГ:ХХ[:сс[.мммммм]]" -"[ЧА], дзе ЧА — часавы абсяг) але гэта несапраўдныя дата/час." - -msgid "Date (with time)" -msgstr "Дата (разам з часам)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Значэньне “%(value)s” павінна быць дзесятковым лікам." - -msgid "Decimal number" -msgstr "Дзесятковы лік" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Значэньне “%(value)s” мае няправільны фармат. Яно павінна быць у фармаце " -"[ДД] [ГГ:[ХХ:]]сс[.мммммм]." - -msgid "Duration" -msgstr "Працягласць" - -msgid "Email address" -msgstr "Адрас эл. пошты" - -msgid "File path" -msgstr "Шлях да файла" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Значэньне “%(value)s” павінна быць дробным лікам." - -msgid "Floating point number" -msgstr "Лік зь пераноснай коскаю" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Значэньне “%(value)s” павінна быць цэлым лікам." - -msgid "Integer" -msgstr "Цэлы лік" - -msgid "Big (8 byte) integer" -msgstr "Вялікі (8 байтаў) цэлы" - -msgid "Small integer" -msgstr "Малы цэлы лік" - -msgid "IPv4 address" -msgstr "Адрас IPv4" - -msgid "IP address" -msgstr "Адрас IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Значэньне “%(value)s” павінна быць None, True альбо False." - -msgid "Boolean (Either True, False or None)" -msgstr "Ляґічнае («сапраўдна», «не сапраўдна» ці «нічога»)" - -msgid "Positive big integer" -msgstr "Дадатны вялікі цэлы лік" - -msgid "Positive integer" -msgstr "Дадатны цэлы лік" - -msgid "Positive small integer" -msgstr "Дадатны малы цэлы лік" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Бірка (ня болей за %(max_length)s)" - -msgid "Text" -msgstr "Тэкст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Значэньне “%(value)s” мае няправільны фармат. Яно павінна быць у фармаце ГГ:" -"ХХ[:сс[.мммммм]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Значэнне “%(value)s” мае правільны фармат (ГГ:ХХ[:сс[.мммммм]]) але гэта " -"несапраўдны час." - -msgid "Time" -msgstr "Час" - -msgid "URL" -msgstr "Сеціўная спасылка" - -msgid "Raw binary data" -msgstr "Неапрацаваныя бінарныя зьвесткі" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” не з'яўляецца дапушчальным UUID." - -msgid "Universally unique identifier" -msgstr "Універсальны непаўторны ідэнтыфікатар" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Выява" - -msgid "A JSON object" -msgstr "Аб'ект JSON" - -msgid "Value must be valid JSON." -msgstr "Значэньне павінна быць сапраўдным JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Экземпляр %(model)s з %(field)s %(value)r не iснуе." - -msgid "Foreign Key (type determined by related field)" -msgstr "Вонкавы ключ (від вызначаецца паводле зьвязанага поля)" - -msgid "One-to-one relationship" -msgstr "Сувязь «адзін да аднаго»" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Сувязь %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Сувязi %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Сувязь «некалькі да некалькіх»" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Поле трэба запоўніць." - -msgid "Enter a whole number." -msgstr "Набярыце ўвесь лік." - -msgid "Enter a valid date." -msgstr "Пазначце чынную дату." - -msgid "Enter a valid time." -msgstr "Пазначце чынны час." - -msgid "Enter a valid date/time." -msgstr "Пазначце чынныя час і дату." - -msgid "Enter a valid duration." -msgstr "Увядзіце сапраўдны тэрмін." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Колькасць дзён павінна быць паміж {min_days} i {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Файл не даслалі. Зірніце кадоўку блянку." - -msgid "No file was submitted." -msgstr "Файл не даслалі." - -msgid "The submitted file is empty." -msgstr "Дасланы файл — парожні." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвал (зараз " -"%(length)d)." -msgstr[1] "" -"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвала (зараз " -"%(length)d)." -msgstr[2] "" -"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвалаў (зараз " -"%(length)d)." -msgstr[3] "" -"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвалаў (зараз " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Трэба або даслаць файл, або абраць «Ачысьціць», але нельга рабіць гэта " -"адначасова." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Запампаваць чынны малюнак. Запампавалі або не выяву, або пашкоджаную выяву." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Абярыце дазволенае. %(value)s няма ў даступных значэньнях." - -msgid "Enter a list of values." -msgstr "Упішыце сьпіс значэньняў." - -msgid "Enter a complete value." -msgstr "Калі ласка, увядзіце поўнае значэньне." - -msgid "Enter a valid UUID." -msgstr "Увядзіце сапраўдны UUID." - -msgid "Enter a valid JSON." -msgstr "Пазначце сапраўдны JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Схаванае поле %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Дадзеныя формы ManagementForm адсутнічаюць ці былі падменены. Адсутнічаюць " -"палі: %(field_names)s. Магчыма, вам спатрэбіцца падаць справаздачу пра " -"памылку, калі праблема захоўваецца." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Калі ласка, адпраўце не болей чым %(num)d формаў." -msgstr[1] "Калі ласка, адпраўце не болей чым %(num)d формаў." -msgstr[2] "Калі ласка, адпраўце не болей чым %(num)d формаў." -msgstr[3] "Калі ласка, адпраўце не болей чым %(num)d формаў." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Калі ласка, адпраўце не менш чым %(num)d формаў." -msgstr[1] "Калі ласка, адпраўце не менш чым %(num)d формаў." -msgstr[2] "Калі ласка, адпраўце не менш чым %(num)d формаў." -msgstr[3] "Калі ласка, адпраўце не менш чым %(num)d формаў." - -msgid "Order" -msgstr "Парадак" - -msgid "Delete" -msgstr "Выдаліць" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "У полі «%(field)s» выпраўце зьвесткі, якія паўтараюцца." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Выпраўце зьвесткі ў полі «%(field)s»: нельга, каб яны паўтараліся." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Выпраўце зьвесткі ў полі «%(field_name)s»: нельга каб зьвесткі ў " -"«%(date_field)s» для «%(lookup)s» паўтараліся." - -msgid "Please correct the duplicate values below." -msgstr "Выпраўце зьвесткі, якія паўтараюцца (гл. ніжэй)." - -msgid "The inline value did not match the parent instance." -msgstr "Убудаванае значэнне не супадае з бацькоўскім значэннем." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Абярыце дазволенае. Абранага няма ў даступных значэньнях." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” не сапраўднае значэнне." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"У часавым абсягу %(current_timezone)s нельга зразумець дату %(datetime)s: " -"яна можа быць неадназначнаю або яе можа не існаваць." - -msgid "Clear" -msgstr "Ачысьціць" - -msgid "Currently" -msgstr "Зараз" - -msgid "Change" -msgstr "Зьмяніць" - -msgid "Unknown" -msgstr "Невядома" - -msgid "Yes" -msgstr "Так" - -msgid "No" -msgstr "Не" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "так,не,магчыма" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байты" -msgstr[2] "%(size)d байтаў" -msgstr[3] "%(size)d байтаў" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ҐБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "папаўдні" - -msgid "a.m." -msgstr "папоўначы" - -msgid "PM" -msgstr "папаўдні" - -msgid "AM" -msgstr "папоўначы" - -msgid "midnight" -msgstr "поўнач" - -msgid "noon" -msgstr "поўдзень" - -msgid "Monday" -msgstr "Панядзелак" - -msgid "Tuesday" -msgstr "Аўторак" - -msgid "Wednesday" -msgstr "Серада" - -msgid "Thursday" -msgstr "Чацьвер" - -msgid "Friday" -msgstr "Пятніца" - -msgid "Saturday" -msgstr "Субота" - -msgid "Sunday" -msgstr "Нядзеля" - -msgid "Mon" -msgstr "Пн" - -msgid "Tue" -msgstr "Аў" - -msgid "Wed" -msgstr "Ср" - -msgid "Thu" -msgstr "Чц" - -msgid "Fri" -msgstr "Пт" - -msgid "Sat" -msgstr "Сб" - -msgid "Sun" -msgstr "Нд" - -msgid "January" -msgstr "студзеня" - -msgid "February" -msgstr "лютага" - -msgid "March" -msgstr "сакавік" - -msgid "April" -msgstr "красавіка" - -msgid "May" -msgstr "траўня" - -msgid "June" -msgstr "чэрвеня" - -msgid "July" -msgstr "ліпеня" - -msgid "August" -msgstr "жніўня" - -msgid "September" -msgstr "верасьня" - -msgid "October" -msgstr "кастрычніка" - -msgid "November" -msgstr "лістапада" - -msgid "December" -msgstr "сьнежня" - -msgid "jan" -msgstr "сту" - -msgid "feb" -msgstr "лют" - -msgid "mar" -msgstr "сак" - -msgid "apr" -msgstr "кра" - -msgid "may" -msgstr "тра" - -msgid "jun" -msgstr "чэр" - -msgid "jul" -msgstr "ліп" - -msgid "aug" -msgstr "жні" - -msgid "sep" -msgstr "вер" - -msgid "oct" -msgstr "кас" - -msgid "nov" -msgstr "ліс" - -msgid "dec" -msgstr "сьн" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Сту." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Люты" - -msgctxt "abbrev. month" -msgid "March" -msgstr "сакавік" - -msgctxt "abbrev. month" -msgid "April" -msgstr "красавіка" - -msgctxt "abbrev. month" -msgid "May" -msgstr "траўня" - -msgctxt "abbrev. month" -msgid "June" -msgstr "чэрвеня" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ліпеня" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Жні." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Вер." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Кас." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ліс." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Сьн." - -msgctxt "alt. month" -msgid "January" -msgstr "студзеня" - -msgctxt "alt. month" -msgid "February" -msgstr "лютага" - -msgctxt "alt. month" -msgid "March" -msgstr "сакавік" - -msgctxt "alt. month" -msgid "April" -msgstr "красавіка" - -msgctxt "alt. month" -msgid "May" -msgstr "траўня" - -msgctxt "alt. month" -msgid "June" -msgstr "чэрвеня" - -msgctxt "alt. month" -msgid "July" -msgstr "ліпеня" - -msgctxt "alt. month" -msgid "August" -msgstr "жніўня" - -msgctxt "alt. month" -msgid "September" -msgstr "верасьня" - -msgctxt "alt. month" -msgid "October" -msgstr "кастрычніка" - -msgctxt "alt. month" -msgid "November" -msgstr "лістапада" - -msgctxt "alt. month" -msgid "December" -msgstr "сьнежня" - -msgid "This is not a valid IPv6 address." -msgstr "Гэта ня правільны адрас IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "або" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d год" -msgstr[1] "%(num)d гадоў" -msgstr[2] "%(num)d гадоў" -msgstr[3] "%(num)d гадоў" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месяц" -msgstr[1] "%(num)d месяцаў" -msgstr[2] "%(num)d месяцаў" -msgstr[3] "%(num)d месяцаў" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d тыдзень" -msgstr[1] "%(num)d тыдняў" -msgstr[2] "%(num)d тыдняў" -msgstr[3] "%(num)d тыдняў" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d дзень" -msgstr[1] "%(num)d дзён" -msgstr[2] "%(num)d дзён" -msgstr[3] "%(num)d дзён" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d гадзіна" -msgstr[1] "%(num)d гадзін" -msgstr[2] "%(num)d гадзін" -msgstr[3] "%(num)d гадзін" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d хвіліна" -msgstr[1] "%(num)d хвілін" -msgstr[2] "%(num)d хвілін" -msgstr[3] "%(num)d хвілін" - -msgid "Forbidden" -msgstr "Забаронена" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-праверка не атрымалася. Запыт спынены." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Вы бачыце гэта паведамленне, таму што гэты HTTPS-сайт патрабуе каб Referer " -"загаловак быў адасланы вашым аглядальнікам, але гэтага не адбылося. Гэты " -"загаловак неабходны для бяспекі, каб пераканацца, што ваш аглядальнік не " -"ўзаламаны трэцімі асобамі." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Калі вы сканфігуравалі ваш браўзэр так, каб ён не працаваў з “Referer” " -"загалоўкамі, калі ласка дазвольце іх хаця б для гэтага сайту, ці для HTTPS " -"злучэнняў, ці для 'same-origin' запытаў." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Калі вы выкарыстоўваеце тэг " -"ці дадалі загаловак “Referrer-Policy: no-referrer”, калі ласка выдаліце іх. " -"CSRF абароне неабходны “Referer” загаловак для строгай праверкі. Калі Вы " -"турбуецеся аб прыватнасці, выкарыстоўвайце альтэрнатывы, напрыклад , для спасылкі на сайты трэціх асоб." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Вы бачыце гэта паведамленне, таму што гэты сайт патрабуе CSRF кукі для " -"адсылкі формы. Гэтыя кукі неабходныя для бяспекі, каб пераканацца, што ваш " -"браўзэр не ўзламаны трэцімі асобамі." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Калі вы сканфігуравалі ваш браўзэр так, каб ён не працаваў з кукамі, калі " -"ласка дазвольце іх хаця б для гэтага сайту ці для “same-origin” запытаў." - -msgid "More information is available with DEBUG=True." -msgstr "Больш падрабязная інфармацыя даступная з DEBUG=True." - -msgid "No year specified" -msgstr "Не пазначылі год" - -msgid "Date out of range" -msgstr "Дата выходзіць за межы дыяпазону" - -msgid "No month specified" -msgstr "Не пазначылі месяц" - -msgid "No day specified" -msgstr "Не пазначылі дзень" - -msgid "No week specified" -msgstr "Не пазначылі тыдзень" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Няма доступу да %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Няма доступу да %(verbose_name_plural)s, якія будуць, бо «%(class_name)s." -"allow_future» мае значэньне «не сапраўдна»." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Радок даты “%(datestr)s” не адпавядае выгляду “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Па запыце не знайшлі ніводнага %(verbose_name)s" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Нумар бачыны ня мае значэньня “last” і яго нельга ператварыць у цэлы лік." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Няправільная старонка (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"Сьпіс парожні, але “%(class_name)s.allow_empty” мае значэньне «не " -"сапраўдна», што забараняе паказваць парожнія сьпісы." - -msgid "Directory indexes are not allowed here." -msgstr "Не дазваляецца глядзець сьпіс файлаў каталёґа." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” не існуе" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Файлы каталёґа «%(directory)s»" - -msgid "The install worked successfully! Congratulations!" -msgstr "Усталяванне прайшло паспяхова! Віншаванні!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Паглядзець заўвагі да выпуску для Джангі " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Вы бачыце гэту старонку таму што DEBUG=True у вашым файле налад і вы не " -"сканфігурыравалі ніякіх URL." - -msgid "Django Documentation" -msgstr "Дакументацыя Джангі" - -msgid "Topics, references, & how-to’s" -msgstr "Тэмы, спасылкі, & як зрабіць" - -msgid "Tutorial: A Polling App" -msgstr "Падручнік: Дадатак для галасавання" - -msgid "Get started with Django" -msgstr "Пачніце з Джангаю" - -msgid "Django Community" -msgstr "Джанга супольнасць" - -msgid "Connect, get help, or contribute" -msgstr "Злучайцеся, атрымлівайце дапамогу, ці спрыяйце" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index f6bd12b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index 52cc913..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,1353 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022-2024 -# Boris Chervenkov , 2012 -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# Lyuboslav Petrov , 2014 -# Mariusz Felisiak , 2023 -# Todor Lubenov , 2013-2015 -# Venelin Stoykov , 2015-2017 -# vestimir , 2014 -# Alexander Atanasov , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: arneatec , 2022-2024\n" -"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "африкаански" - -msgid "Arabic" -msgstr "арабски език" - -msgid "Algerian Arabic" -msgstr "алжирски арабски" - -msgid "Asturian" -msgstr "Астурийски" - -msgid "Azerbaijani" -msgstr "Азербайджански език" - -msgid "Bulgarian" -msgstr "български език" - -msgid "Belarusian" -msgstr "Беларуски" - -msgid "Bengali" -msgstr "бенгалски език" - -msgid "Breton" -msgstr "Бретон" - -msgid "Bosnian" -msgstr "босненски език" - -msgid "Catalan" -msgstr "каталански" - -msgid "Central Kurdish (Sorani)" -msgstr "Кюрдски, централен (Сорани)" - -msgid "Czech" -msgstr "чешки" - -msgid "Welsh" -msgstr "уелски" - -msgid "Danish" -msgstr "датски" - -msgid "German" -msgstr "немски" - -msgid "Lower Sorbian" -msgstr "долносорбски" - -msgid "Greek" -msgstr "гръцки" - -msgid "English" -msgstr "английски" - -msgid "Australian English" -msgstr "австралийски английски" - -msgid "British English" -msgstr "британски английски" - -msgid "Esperanto" -msgstr "есперанто" - -msgid "Spanish" -msgstr "испански" - -msgid "Argentinian Spanish" -msgstr "кастилски" - -msgid "Colombian Spanish" -msgstr "колумбийски испански" - -msgid "Mexican Spanish" -msgstr "мексикански испански" - -msgid "Nicaraguan Spanish" -msgstr "никарагуански испански" - -msgid "Venezuelan Spanish" -msgstr "венецуелски испански" - -msgid "Estonian" -msgstr "естонски" - -msgid "Basque" -msgstr "баски" - -msgid "Persian" -msgstr "персийски" - -msgid "Finnish" -msgstr "финландски" - -msgid "French" -msgstr "френски" - -msgid "Frisian" -msgstr "фризийски" - -msgid "Irish" -msgstr "ирландски" - -msgid "Scottish Gaelic" -msgstr "шотландски галски" - -msgid "Galician" -msgstr "галицейски" - -msgid "Hebrew" -msgstr "иврит" - -msgid "Hindi" -msgstr "хинди" - -msgid "Croatian" -msgstr "хърватски" - -msgid "Upper Sorbian" -msgstr "горносорбски" - -msgid "Hungarian" -msgstr "унгарски" - -msgid "Armenian" -msgstr "арменски" - -msgid "Interlingua" -msgstr "интерлингва" - -msgid "Indonesian" -msgstr "индонезийски" - -msgid "Igbo" -msgstr "игбо" - -msgid "Ido" -msgstr "идо" - -msgid "Icelandic" -msgstr "исландски" - -msgid "Italian" -msgstr "италиански" - -msgid "Japanese" -msgstr "японски" - -msgid "Georgian" -msgstr "грузински" - -msgid "Kabyle" -msgstr "кабилски" - -msgid "Kazakh" -msgstr "казахски" - -msgid "Khmer" -msgstr "кхмерски" - -msgid "Kannada" -msgstr "каннада" - -msgid "Korean" -msgstr "корейски" - -msgid "Kyrgyz" -msgstr "киргизки" - -msgid "Luxembourgish" -msgstr "люксембургски" - -msgid "Lithuanian" -msgstr "литовски" - -msgid "Latvian" -msgstr "латвийски" - -msgid "Macedonian" -msgstr "македонски" - -msgid "Malayalam" -msgstr "малаялам" - -msgid "Mongolian" -msgstr "монголски" - -msgid "Marathi" -msgstr "марати" - -msgid "Malay" -msgstr "малайски" - -msgid "Burmese" -msgstr "бирмански" - -msgid "Norwegian Bokmål" -msgstr "норвежки букмол" - -msgid "Nepali" -msgstr "непалски" - -msgid "Dutch" -msgstr "нидерландски" - -msgid "Norwegian Nynorsk" -msgstr "съвременен норвежки" - -msgid "Ossetic" -msgstr "осетски" - -msgid "Punjabi" -msgstr "панджабски" - -msgid "Polish" -msgstr "полски" - -msgid "Portuguese" -msgstr "португалски" - -msgid "Brazilian Portuguese" -msgstr "бразилски португалски" - -msgid "Romanian" -msgstr "румънски" - -msgid "Russian" -msgstr "руски" - -msgid "Slovak" -msgstr "словашки" - -msgid "Slovenian" -msgstr "словенски" - -msgid "Albanian" -msgstr "албански" - -msgid "Serbian" -msgstr "сръбски" - -msgid "Serbian Latin" -msgstr "сръбски - латиница" - -msgid "Swedish" -msgstr "шведски" - -msgid "Swahili" -msgstr "суахили" - -msgid "Tamil" -msgstr "тамилски" - -msgid "Telugu" -msgstr "телугу" - -msgid "Tajik" -msgstr "таджикски" - -msgid "Thai" -msgstr "тайландски" - -msgid "Turkmen" -msgstr "туркменски" - -msgid "Turkish" -msgstr "турски" - -msgid "Tatar" -msgstr "татарски" - -msgid "Udmurt" -msgstr "удмурт" - -msgid "Uyghur" -msgstr "Уйгурски" - -msgid "Ukrainian" -msgstr "украински" - -msgid "Urdu" -msgstr "урду" - -msgid "Uzbek" -msgstr "узбекски" - -msgid "Vietnamese" -msgstr "виетнамски" - -msgid "Simplified Chinese" -msgstr "китайски" - -msgid "Traditional Chinese" -msgstr "традиционен китайски" - -msgid "Messages" -msgstr "Съобщения" - -msgid "Site Maps" -msgstr "Карти на сайта" - -msgid "Static Files" -msgstr "Статични файлове" - -msgid "Syndication" -msgstr "Синдикация" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Номерът на страницата не е цяло число" - -msgid "That page number is less than 1" -msgstr "Номерът на страницата е по-малък от 1" - -msgid "That page contains no results" -msgstr "В тази страница няма резултати" - -msgid "Enter a valid value." -msgstr "Въведете валидна стойност. " - -msgid "Enter a valid domain name." -msgstr "Въведете валидно име на домейн." - -msgid "Enter a valid URL." -msgstr "Въведете валиден URL адрес." - -msgid "Enter a valid integer." -msgstr "Въведете валидно целочислено число." - -msgid "Enter a valid email address." -msgstr "Въведете валиден имейл адрес." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Въведете валиден 'слъг', състоящ се от букви, цифри, тирета или долни тирета." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Въведете валиден 'слъг', състоящ се от Уникод букви, цифри, тирета или долни " -"тирета." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Въведете валиден %(protocol)s адрес." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 или IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Въведете само еднозначни числа, разделени със запетая. " - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Уверете се, че тази стойност е %(limit_value)s (тя е %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Уверете се, че тази стойност е по-малка или равна на %(limit_value)s ." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Уверете се, че тази стойност е по-голяма или равна на %(limit_value)s ." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Уверете се, че стойността е кратна на стъпката %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Въведете стойност, кратна на стъпката %(limit_value)s, започвайки от " -"%(offset)s, например %(offset)s, %(valid_value1)s, %(valid_value2)s, и т.н." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Уверете се, че тази стойност е най-малко %(limit_value)d знака (тя има " -"%(show_value)d )." -msgstr[1] "" -"Уверете се, че тази стойност е най-малко %(limit_value)d знака (тя има " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Уверете се, тази стойност има най-много %(limit_value)d знака (тя има " -"%(show_value)d)." -msgstr[1] "" -"Уверете се, че тази стойност има най-много %(limit_value)d знака (тя има " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Въведете число." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Уверете се, че има не повече от %(max)s цифри общо." -msgstr[1] "Уверете се, че има не повече от %(max)s цифри общо." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Уверете се, че има не повече от%(max)s знак след десетичната запетая." -msgstr[1] "" -"Уверете се, че има не повече от %(max)s знака след десетичната запетая." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Уверете се, че има не повече от %(max)s цифра преди десетичната запетая." -msgstr[1] "" -"Уверете се, че има не повече от %(max)s цифри преди десетичната запетая." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Не са разрешени файлове с раширение \"%(extension)s\". Позволените " -"разширения са: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Празни знаци не са разрешени." - -msgid "and" -msgstr "и" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s с този %(field_labels)s вече съществува." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Ограничението “%(name)s” е нарушено." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Стойността %(value)r не е валиден избор." - -msgid "This field cannot be null." -msgstr "Това поле не може да има празна стойност." - -msgid "This field cannot be blank." -msgstr "Това поле не може да е празно." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s с този %(field_label)s вече съществува." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s трябва да е уникално за %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Поле от тип: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Стойността на \"%(value)s\" трябва да бъде или True, или False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Стойност \"%(value)s\" трябва да бъде или True, или False или None." - -msgid "Boolean (Either True or False)" -msgstr "Булево (True или False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Символен низ (до %(max_length)s символа)" - -msgid "String (unlimited)" -msgstr "Стринг (неограничен)" - -msgid "Comma-separated integers" -msgstr "Цели числа, разделени с запетая" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Стойността \"%(value)s\" е с невалиден формат за дата. Тя трябва да бъде в " -"ГГГГ-ММ-ДД формат." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Стойността \"%(value)s\" е в правилния формат (ГГГГ-ММ-ДД), но самата дата е " -"невалидна." - -msgid "Date (without time)" -msgstr "Дата (без час)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Стойността '%(value)s' е с невалиден формат. Трябва да бъде във формат ГГГГ-" -"ММ-ДД ЧЧ:ММ[:сс[.uuuuuu]][TZ]" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Стойността '%(value)s' е с правилен формат ( ГГГГ-ММ-ДД ЧЧ:ММ[:сс[.μμμμμμ]]" -"[TZ]), но датата/часът са невалидни" - -msgid "Date (with time)" -msgstr "Дата (и час)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Стойността \"%(value)s\" трябва да е десетично число." - -msgid "Decimal number" -msgstr "Десетична дроб" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Стойността “%(value)s” е с невалиден формат. Трябва да бъде във формат [ДД] " -"[[ЧЧ:]ММ:]сс[.uuuuuu] format." - -msgid "Duration" -msgstr "Продължителност" - -msgid "Email address" -msgstr "Имейл адрес" - -msgid "File path" -msgstr "Път към файл" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Стойността '%(value)s' трябва да е число с плаваща запетая." - -msgid "Floating point number" -msgstr "Число с плаваща запетая" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Стойността \"%(value)s\" трябва да е цяло число." - -msgid "Integer" -msgstr "Цяло число" - -msgid "Big (8 byte) integer" -msgstr "Голямо (8 байта) цяло число" - -msgid "Small integer" -msgstr "2 байта цяло число" - -msgid "IPv4 address" -msgstr "IPv4 адрес" - -msgid "IP address" -msgstr "IP адрес" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Стойността '%(value)s' трябва да бъде None, True или False." - -msgid "Boolean (Either True, False or None)" -msgstr "булев (възможните стойности са True, False или None)" - -msgid "Positive big integer" -msgstr "Положително голямо цяло число." - -msgid "Positive integer" -msgstr "Положително цяло число" - -msgid "Positive small integer" -msgstr "Положително 2 байта цяло число" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слъг (до %(max_length)s )" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Стойността \"%(value)s\" е с невалиден формат. Тя трябва да бъде в ЧЧ:ММ [:" -"сс[.μμμμμμ]]" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Стойността \"%(value)s\" е в правилния формат (ЧЧ:ММ [:сс[.μμμμμμ]]), но " -"часът е невалиден." - -msgid "Time" -msgstr "Време" - -msgid "URL" -msgstr "URL адрес" - -msgid "Raw binary data" -msgstr "сурови двоични данни" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" не е валиден UUID." - -msgid "Universally unique identifier" -msgstr "Универсално уникален идентификатор" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Изображение" - -msgid "A JSON object" -msgstr "Обект във формат JSON" - -msgid "Value must be valid JSON." -msgstr "Стойността трябва да е валиден JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Инстанция на %(model)s с %(field)s %(value)r не съществува." - -msgid "Foreign Key (type determined by related field)" -msgstr "Външен ключ (тип, определен от свързаното поле)" - -msgid "One-to-one relationship" -msgstr "едно-към-едно релация " - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s релация" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s релации" - -msgid "Many-to-many relationship" -msgstr "Много-към-много релация" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Това поле е задължително." - -msgid "Enter a whole number." -msgstr "Въведете цяло число. " - -msgid "Enter a valid date." -msgstr "Въведете валидна дата." - -msgid "Enter a valid time." -msgstr "Въведете валиден час." - -msgid "Enter a valid date/time." -msgstr "Въведете валидна дата/час. " - -msgid "Enter a valid duration." -msgstr "Въведете валидна продължителност." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Броят на дните трябва да е между {min_days} и {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Няма изпратен файл. Проверете типа кодиране на формата. " - -msgid "No file was submitted." -msgstr "Няма изпратен файл." - -msgid "The submitted file is empty." -msgstr "Изпратеният файл е празен. " - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "Уверете се, това име е най-много %(max)d знака (то има %(length)d)." -msgstr[1] "" -"Уверете се, че това файлово име има най-много %(max)d знаци (има " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Моля, или пратете файл или маркирайте полето за изчистване, но не и двете." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Качете валидно изображение. Файлът, който сте качили или не е изображение, " -"или е повреден. " - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Направете валиден избор. %(value)s не е един от възможните избори." - -msgid "Enter a list of values." -msgstr "Въведете списък от стойности" - -msgid "Enter a complete value." -msgstr "Въведете пълна стойност." - -msgid "Enter a valid UUID." -msgstr "Въведете валиден UUID." - -msgid "Enter a valid JSON." -msgstr "Въведете валиден JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Скрито поле %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm данните липсват или са променяни неправомерно. Липсващи " -"полета: %(field_names)s. Трябва да изпратите уведомление за бъг, ако този " -"проблем продължава." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Моля изпратете не повече от %(num)d формуляр." -msgstr[1] "Моля изпратете не повече от %(num)d формуляра." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Моля изпратете поне %(num)d формуляр." -msgstr[1] "Моля изпратете поне %(num)d формуляра." - -msgid "Order" -msgstr "Ред" - -msgid "Delete" -msgstr "Изтрий" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Моля, коригирайте дублираните данни за %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Моля, коригирайте дублираните данни за %(field)s, които трябва да са " -"уникални." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Моля, коригирайте дублиранитe данни за %(field_name)s , които трябва да са " -"уникални за %(lookup)s в %(date_field)s ." - -msgid "Please correct the duplicate values below." -msgstr "Моля, коригирайте повтарящите се стойности по-долу." - -msgid "The inline value did not match the parent instance." -msgstr "Стойността в реда не отговаря на родителската инстанция." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Направете валиден избор. Този не е един от възможните избори. " - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” не е валидна стойност." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s не може да се интерпретира в часова зона %(current_timezone)s; " -"вероятно стойността е нееднозначна или не съществува изобщо." - -msgid "Clear" -msgstr "Изчисти" - -msgid "Currently" -msgstr "Сега" - -msgid "Change" -msgstr "Промени" - -msgid "Unknown" -msgstr "Неизвестно" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "да,не,може би" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d, байт" -msgstr[1] "%(size)d байта" - -#, python-format -msgid "%s KB" -msgstr "%s KБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "след обяд" - -msgid "a.m." -msgstr "преди обяд" - -msgid "PM" -msgstr "след обяд" - -msgid "AM" -msgstr "преди обяд" - -msgid "midnight" -msgstr "полунощ" - -msgid "noon" -msgstr "обяд" - -msgid "Monday" -msgstr "понеделник" - -msgid "Tuesday" -msgstr "вторник" - -msgid "Wednesday" -msgstr "сряда" - -msgid "Thursday" -msgstr "четвъртък" - -msgid "Friday" -msgstr "петък" - -msgid "Saturday" -msgstr "събота" - -msgid "Sunday" -msgstr "неделя" - -msgid "Mon" -msgstr "Пон" - -msgid "Tue" -msgstr "Вт" - -msgid "Wed" -msgstr "Ср" - -msgid "Thu" -msgstr "Чет" - -msgid "Fri" -msgstr "Пет" - -msgid "Sat" -msgstr "Съб" - -msgid "Sun" -msgstr "Нед" - -msgid "January" -msgstr "Януари" - -msgid "February" -msgstr "Февруари" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Април" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Юни" - -msgid "July" -msgstr "Юли" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Септември" - -msgid "October" -msgstr "Октомври" - -msgid "November" -msgstr "Ноември" - -msgid "December" -msgstr "Декември" - -msgid "jan" -msgstr "ян" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "юни" - -msgid "jul" -msgstr "юли" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сеп" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноем" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ян." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апр." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Юни" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Юли" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Септ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноем." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "Януари" - -msgctxt "alt. month" -msgid "February" -msgstr "Февруари" - -msgctxt "alt. month" -msgid "March" -msgstr "Март" - -msgctxt "alt. month" -msgid "April" -msgstr "Април" - -msgctxt "alt. month" -msgid "May" -msgstr "Май" - -msgctxt "alt. month" -msgid "June" -msgstr "Юни" - -msgctxt "alt. month" -msgid "July" -msgstr "Юли" - -msgctxt "alt. month" -msgid "August" -msgstr "Август" - -msgctxt "alt. month" -msgid "September" -msgstr "Септември" - -msgctxt "alt. month" -msgid "October" -msgstr "Октомври" - -msgctxt "alt. month" -msgid "November" -msgstr "Ноември" - -msgctxt "alt. month" -msgid "December" -msgstr "Декември" - -msgid "This is not a valid IPv6 address." -msgstr "Въведете валиден IPv6 адрес." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "или" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d години" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месец" -msgstr[1] "%(num)d месеца" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d седмица" -msgstr[1] "%(num)d седмици" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d ден" -msgstr[1] "%(num)d дни" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d час" -msgstr[1] "%(num)d часа" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минута" -msgstr[1] "%(num)d минути" - -msgid "Forbidden" -msgstr "Забранен" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF проверката се провали. Заявката прекратена." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Вие виждате това съобщение, защото този HTTPS сайт изисква да бъде изпратен " -"'Referer header' от вашият уеб браузър, но такъв не бе изпратен. Този " -"header е задължителен от съображения за сигурност, за да се гарантира, че " -"вашият браузър не е компрометиран от трети страни." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ако сте настроили вашия браузър да деактивира 'Referer' headers, моля да ги " -"активирате отново, поне за този сайт, или за HTTPS връзки, или за 'same-" -"origin' заявки." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ако използвате таг или " -"включвате “Referrer-Policy: no-referrer” header, моля премахнете ги. CSRF " -"защитата изисква “Referer” header, за да извърши стриктна проверка на " -"изпращача. Ако сте притеснени за поверителността, използвайте алтернативи " -"като за връзки към сайтове на трети страни." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Вие виждате това съобщение, защото този сайт изисква CSRF бисквитка, когато " -"се подават формуляри. Тази бисквитка е задължителна от съображения за " -"сигурност, за да се гарантира, че вашият браузър не е компрометиран от трети " -"страни." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ако сте конфигурирали браузъра си да забрани бисквитките, моля да ги " -"активирате отново, поне за този сайт, или за \"same-origin\" заявки." - -msgid "More information is available with DEBUG=True." -msgstr "Повече информация е на разположение с DEBUG=True." - -msgid "No year specified" -msgstr "Не е посочена година" - -msgid "Date out of range" -msgstr "Датата е в невалиден диапазон" - -msgid "No month specified" -msgstr "Не е посочен месец" - -msgid "No day specified" -msgstr "Не е посочен ден" - -msgid "No week specified" -msgstr "Не е посочена седмица" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Няма достъпни %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Бъдещo %(verbose_name_plural)s е недостъпно, тъй като %(class_name)s." -"allow_future е False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Невалидна текстова стойност на датата “%(datestr)s” при зададен формат " -"“%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Няма %(verbose_name)s, съвпадащи със заявката" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Страницата не е \"последна\", нито може да се преобразува в цяло число." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Невалидна страница (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Празен списък и \"%(class_name)s.allow_empty\" e False." - -msgid "Directory indexes are not allowed here." -msgstr "Тук не е позволено индексиране на директория." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" не съществува" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Индекс %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Инсталацията Ви заработи успешно! Поздравления!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Разгледайте release notes за Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Вие виждате тази страница, защото DEBUG=True е във вашия файл с настройки и не сте " -"конфигурирали никакви URL-и." - -msgid "Django Documentation" -msgstr "Django документация" - -msgid "Topics, references, & how-to’s" -msgstr "Теми, наръчници, & друга документация" - -msgid "Tutorial: A Polling App" -msgstr "Урок: Приложение за анкета" - -msgid "Get started with Django" -msgstr "Започнете с Django" - -msgid "Django Community" -msgstr "Django общност" - -msgid "Connect, get help, or contribute" -msgstr "Свържете се, получете помощ или допринесете" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bg/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/bg/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bg/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/bg/formats.py deleted file mode 100644 index ee90c5b..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/bg/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" -TIME_FORMAT = "H:i" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = " " # Non-breaking space -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index ef52f36..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index b554f7a..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1218 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# M Nasimul Haque , 2013 -# Tahmid Rafi , 2012-2013 -# Tahmid Rafi , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "আফ্রিকার অন্যতম সরকারি ভাষা" - -msgid "Arabic" -msgstr "আরবী" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "আজারবাইজানি" - -msgid "Bulgarian" -msgstr "বুলগেরিয়ান" - -msgid "Belarusian" -msgstr "বেলারুশীয়" - -msgid "Bengali" -msgstr "বাংলা" - -msgid "Breton" -msgstr "ব্রেটন" - -msgid "Bosnian" -msgstr "বসনিয়ান" - -msgid "Catalan" -msgstr "ক্যাটালান" - -msgid "Czech" -msgstr "চেক" - -msgid "Welsh" -msgstr "ওয়েল্স" - -msgid "Danish" -msgstr "ড্যানিশ" - -msgid "German" -msgstr "জার্মান" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "গ্রিক" - -msgid "English" -msgstr "ইংলিশ" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "বৃটিশ ইংলিশ" - -msgid "Esperanto" -msgstr "আন্তর্জাতিক ভাষা" - -msgid "Spanish" -msgstr "স্প্যানিশ" - -msgid "Argentinian Spanish" -msgstr "আর্জেন্টিনিয়ান স্প্যানিশ" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "মেক্সিকান স্প্যানিশ" - -msgid "Nicaraguan Spanish" -msgstr "নিকারাগুয়ান স্প্যানিশ" - -msgid "Venezuelan Spanish" -msgstr "ভেনেজুয়েলার স্প্যানিশ" - -msgid "Estonian" -msgstr "এস্তোনিয়ান" - -msgid "Basque" -msgstr "বাস্ক" - -msgid "Persian" -msgstr "ফারসি" - -msgid "Finnish" -msgstr "ফিনিশ" - -msgid "French" -msgstr "ফ্রেঞ্চ" - -msgid "Frisian" -msgstr "ফ্রিজ্ল্যানডের ভাষা" - -msgid "Irish" -msgstr "আইরিশ" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "গ্যালিসিয়ান" - -msgid "Hebrew" -msgstr "হিব্রু" - -msgid "Hindi" -msgstr "হিন্দী" - -msgid "Croatian" -msgstr "ক্রোয়েশিয়ান" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "হাঙ্গেরিয়ান" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "ইন্দোনেশিয়ান" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "আইসল্যান্ডিক" - -msgid "Italian" -msgstr "ইটালিয়ান" - -msgid "Japanese" -msgstr "জাপানিজ" - -msgid "Georgian" -msgstr "জর্জিয়ান" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "কাজাখ" - -msgid "Khmer" -msgstr "খমার" - -msgid "Kannada" -msgstr "কান্নাড়া" - -msgid "Korean" -msgstr "কোরিয়ান" - -msgid "Luxembourgish" -msgstr "লুক্সেমবার্গীয়" - -msgid "Lithuanian" -msgstr "লিথুয়ানিয়ান" - -msgid "Latvian" -msgstr "লাটভিয়ান" - -msgid "Macedonian" -msgstr "ম্যাসাডোনিয়ান" - -msgid "Malayalam" -msgstr "মালায়ালম" - -msgid "Mongolian" -msgstr "মঙ্গোলিয়ান" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "বার্মিজ" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "নেপালি" - -msgid "Dutch" -msgstr "ডাচ" - -msgid "Norwegian Nynorsk" -msgstr "নরওয়েজীয়ান নিনর্স্ক" - -msgid "Ossetic" -msgstr "অসেটিক" - -msgid "Punjabi" -msgstr "পাঞ্জাবী" - -msgid "Polish" -msgstr "পোলিশ" - -msgid "Portuguese" -msgstr "পর্তুগীজ" - -msgid "Brazilian Portuguese" -msgstr "ব্রাজিলিয়ান পর্তুগীজ" - -msgid "Romanian" -msgstr "রোমানিয়ান" - -msgid "Russian" -msgstr "রাশান" - -msgid "Slovak" -msgstr "স্লোভাক" - -msgid "Slovenian" -msgstr "স্লোভেনিয়ান" - -msgid "Albanian" -msgstr "আলবেনীয়ান" - -msgid "Serbian" -msgstr "সার্বিয়ান" - -msgid "Serbian Latin" -msgstr "সার্বিয়ান ল্যাটিন" - -msgid "Swedish" -msgstr "সুইডিশ" - -msgid "Swahili" -msgstr "সোয়াহিলি" - -msgid "Tamil" -msgstr "তামিল" - -msgid "Telugu" -msgstr "তেলেগু" - -msgid "Thai" -msgstr "থাই" - -msgid "Turkish" -msgstr "তুর্কি" - -msgid "Tatar" -msgstr "তাতারদেশীয়" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ইউক্রেনিয়ান" - -msgid "Urdu" -msgstr "উর্দু" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "ভিয়েতনামিজ" - -msgid "Simplified Chinese" -msgstr "সরলীকৃত চাইনীজ" - -msgid "Traditional Chinese" -msgstr "প্রচলিত চাইনীজ" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "একটি বৈধ মান দিন।" - -msgid "Enter a valid URL." -msgstr "বৈধ URL দিন" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "একটি বৈধ ইমেইল ঠিকানা লিখুন." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "একটি বৈধ IPv4 ঠিকানা দিন।" - -msgid "Enter a valid IPv6 address." -msgstr "একটি বৈধ IPv6 ঠিকানা টাইপ করুন।" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "একটি বৈধ IPv4 অথবা IPv6 ঠিকানা টাইপ করুন।" - -msgid "Enter only digits separated by commas." -msgstr "শুধুমাত্র কমা দিয়ে সংখ্যা দিন।" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "সংখ্যাটির মান %(limit_value)s হতে হবে (এটা এখন %(show_value)s আছে)।" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "সংখ্যাটির মান %(limit_value)s এর চেয়ে ছোট বা সমান হতে হবে।" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "সংখ্যাটির মান %(limit_value)s এর চেয়ে বড় বা সমান হতে হবে।" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "একটি সংখ্যা প্রবেশ করান।" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "এবং" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "এর মান null হতে পারবে না।" - -msgid "This field cannot be blank." -msgstr "এই ফিল্ডের মান ফাঁকা হতে পারে না" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s সহ %(model_name)s আরেকটি রয়েছে।" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "ফিল্ডের ধরণ: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "বুলিয়ান (হয় True অথবা False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "স্ট্রিং (সর্বোচ্চ %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "কমা দিয়ে আলাদা করা ইন্টিজার" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "তারিখ (সময় বাদে)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "তারিখ (সময় সহ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "দশমিক সংখ্যা" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "ইমেইল ঠিকানা" - -msgid "File path" -msgstr "ফাইল পথ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "ফ্লোটিং পয়েন্ট সংখ্যা" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "ইন্টিজার" - -msgid "Big (8 byte) integer" -msgstr "বিগ (৮ বাইট) ইন্টিজার" - -msgid "IPv4 address" -msgstr "IPv4 ঠিকানা" - -msgid "IP address" -msgstr "আইপি ঠিকানা" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "বুলিয়ান (হয় True, False অথবা None)" - -msgid "Positive integer" -msgstr "পজিটিভ ইন্টিজার" - -msgid "Positive small integer" -msgstr "পজিটিভ স্মল ইন্টিজার" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "স্লাগ (সর্বোচ্চ %(max_length)s)" - -msgid "Small integer" -msgstr "স্মল ইন্টিজার" - -msgid "Text" -msgstr "টেক্সট" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "সময়" - -msgid "URL" -msgstr "ইউআরএল (URL)" - -msgid "Raw binary data" -msgstr "র বাইনারি ডাটা" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "ফাইল" - -msgid "Image" -msgstr "ইমেজ" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "ফরেন কি (টাইপ রিলেটেড ফিল্ড দ্বারা নির্ণীত হবে)" - -msgid "One-to-one relationship" -msgstr "ওয়ান-টু-ওয়ান রিলেশানশিপ" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "ম্যানি-টু-ম্যানি রিলেশানশিপ" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "এটি আবশ্যক।" - -msgid "Enter a whole number." -msgstr "একটি পূর্ণসংখ্যা দিন" - -msgid "Enter a valid date." -msgstr "বৈধ তারিখ দিন।" - -msgid "Enter a valid time." -msgstr "বৈধ সময় দিন।" - -msgid "Enter a valid date/time." -msgstr "বৈধ তারিখ/সময় দিন।" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "কোন ফাইল দেয়া হয়নি। ফর্মের এনকোডিং ঠিক আছে কিনা দেখুন।" - -msgid "No file was submitted." -msgstr "কোন ফাইল দেয়া হয়নি।" - -msgid "The submitted file is empty." -msgstr "ফাইলটি খালি।" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"একটি ফাইল সাবমিট করুন অথবা ক্লিয়ার চেকবক্সটি চেক করে দিন, যে কোন একটি করুন।" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"সঠিক ছবি আপলোড করুন। যে ফাইলটি আপলোড করা হয়েছে তা হয় ছবি নয় অথবা নষ্ট হয়ে " -"যাওয়া ছবি।" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "%(value)s বৈধ নয়। অনুগ্রহ করে আরেকটি সিলেক্ট করুন।" - -msgid "Enter a list of values." -msgstr "কয়েকটি মানের তালিকা দিন।" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ক্রম" - -msgid "Delete" -msgstr "মুছুন" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "এটি বৈধ নয়। অনুগ্রহ করে আরেকটি সিলেক্ট করুন।" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "পরিষ্কার করুন" - -msgid "Currently" -msgstr "এই মুহুর্তে" - -msgid "Change" -msgstr "পরিবর্তন" - -msgid "Unknown" -msgstr "অজানা" - -msgid "Yes" -msgstr "হ্যাঁ" - -msgid "No" -msgstr "না" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "হ্যাঁ,না,হয়তো" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d বাইট" -msgstr[1] "%(size)d বাইট" - -#, python-format -msgid "%s KB" -msgstr "%s কিলোবাইট" - -#, python-format -msgid "%s MB" -msgstr "%s মেগাবাইট" - -#, python-format -msgid "%s GB" -msgstr "%s গিগাবাইট" - -#, python-format -msgid "%s TB" -msgstr "%s টেরাবাইট" - -#, python-format -msgid "%s PB" -msgstr "%s পেটাবাইট" - -msgid "p.m." -msgstr "অপরাহ্ন" - -msgid "a.m." -msgstr "পূর্বাহ্ন" - -msgid "PM" -msgstr "অপরাহ্ন" - -msgid "AM" -msgstr "পূর্বাহ্ন" - -msgid "midnight" -msgstr "মধ্যরাত" - -msgid "noon" -msgstr "দুপুর" - -msgid "Monday" -msgstr "সোমবার" - -msgid "Tuesday" -msgstr "মঙ্গলবার" - -msgid "Wednesday" -msgstr "বুধবার" - -msgid "Thursday" -msgstr "বৃহস্পতিবার" - -msgid "Friday" -msgstr "শুক্রবার" - -msgid "Saturday" -msgstr "শনিবার" - -msgid "Sunday" -msgstr "রবিবার" - -msgid "Mon" -msgstr "সোম" - -msgid "Tue" -msgstr "মঙ্গল" - -msgid "Wed" -msgstr "বুধ" - -msgid "Thu" -msgstr "বৃহঃ" - -msgid "Fri" -msgstr "শুক্র" - -msgid "Sat" -msgstr "শনি" - -msgid "Sun" -msgstr "রবি" - -msgid "January" -msgstr "জানুয়ারি" - -msgid "February" -msgstr "ফেব্রুয়ারি" - -msgid "March" -msgstr "মার্চ" - -msgid "April" -msgstr "এপ্রিল" - -msgid "May" -msgstr "মে" - -msgid "June" -msgstr "জুন" - -msgid "July" -msgstr "জুলাই" - -msgid "August" -msgstr "আগস্ট" - -msgid "September" -msgstr "সেপ্টেম্বর" - -msgid "October" -msgstr "অক্টোবর" - -msgid "November" -msgstr "নভেম্বর" - -msgid "December" -msgstr "ডিসেম্বর" - -msgid "jan" -msgstr "জান." - -msgid "feb" -msgstr "ফেব." - -msgid "mar" -msgstr "মার্চ" - -msgid "apr" -msgstr "এপ্রি." - -msgid "may" -msgstr "মে" - -msgid "jun" -msgstr "জুন" - -msgid "jul" -msgstr "জুল." - -msgid "aug" -msgstr "আগ." - -msgid "sep" -msgstr "সেপ্টে." - -msgid "oct" -msgstr "অক্টো." - -msgid "nov" -msgstr "নভে." - -msgid "dec" -msgstr "ডিসে." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "জানু." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ফেব্রু." - -msgctxt "abbrev. month" -msgid "March" -msgstr "মার্চ" - -msgctxt "abbrev. month" -msgid "April" -msgstr "এপ্রিল" - -msgctxt "abbrev. month" -msgid "May" -msgstr "মে" - -msgctxt "abbrev. month" -msgid "June" -msgstr "জুন" - -msgctxt "abbrev. month" -msgid "July" -msgstr "জুলাই" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "আগ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "সেপ্ট." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "অক্টো." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "নভে." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ডিসে." - -msgctxt "alt. month" -msgid "January" -msgstr "জানুয়ারি" - -msgctxt "alt. month" -msgid "February" -msgstr "ফেব্রুয়ারি" - -msgctxt "alt. month" -msgid "March" -msgstr "মার্চ" - -msgctxt "alt. month" -msgid "April" -msgstr "এপ্রিল" - -msgctxt "alt. month" -msgid "May" -msgstr "মে" - -msgctxt "alt. month" -msgid "June" -msgstr "জুন" - -msgctxt "alt. month" -msgid "July" -msgstr "জুলাই" - -msgctxt "alt. month" -msgid "August" -msgstr "আগস্ট" - -msgctxt "alt. month" -msgid "September" -msgstr "সেপ্টেম্বর" - -msgctxt "alt. month" -msgid "October" -msgstr "অক্টোবর" - -msgctxt "alt. month" -msgid "November" -msgstr "নভেম্বর" - -msgctxt "alt. month" -msgid "December" -msgstr "ডিসেম্বর" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "অথবা" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "0 মিনিট" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "কোন বছর উল্লেখ করা হয়নি" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "কোন মাস উল্লেখ করা হয়নি" - -msgid "No day specified" -msgstr "কোন দিন উল্লেখ করা হয়নি" - -msgid "No week specified" -msgstr "কোন সপ্তাহ উল্লেখ করা হয়নি" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "কোন %(verbose_name_plural)s নেই" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "কুয়েরি ম্যাচ করে এমন কোন %(verbose_name)s পাওয়া যায় নি" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "ডিরেক্টরি ইনডেক্স অনুমোদিত নয়" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s এর ইনডেক্স" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bn/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/bn/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bn/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/bn/formats.py deleted file mode 100644 index 9d1bb09..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/bn/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F, Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M, Y" -# SHORT_DATETIME_FORMAT = -FIRST_DAY_OF_WEEK = 6 # Saturday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # 25/10/2016 - "%d/%m/%y", # 25/10/16 - "%d-%m-%Y", # 25-10-2016 - "%d-%m-%y", # 25-10-16 -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # 14:30:59 - "%H:%M", # 14:30 -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # 25/10/2006 14:30:59 - "%d/%m/%Y %H:%M", # 25/10/2006 14:30 -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index d864abe..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/br/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index 3b1a759..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,1297 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Ewen , 2021 -# Fulup , 2012,2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-18 21:19+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -msgid "Afrikaans" -msgstr "Afrikaneg" - -msgid "Arabic" -msgstr "Arabeg" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Astureg" - -msgid "Azerbaijani" -msgstr "Azeri" - -msgid "Bulgarian" -msgstr "Bulgareg" - -msgid "Belarusian" -msgstr "Belaruseg" - -msgid "Bengali" -msgstr "Bengaleg" - -msgid "Breton" -msgstr "Brezhoneg" - -msgid "Bosnian" -msgstr "Bosneg" - -msgid "Catalan" -msgstr "Katalaneg" - -msgid "Czech" -msgstr "Tchekeg" - -msgid "Welsh" -msgstr "Kembraeg" - -msgid "Danish" -msgstr "Daneg" - -msgid "German" -msgstr "Alamaneg" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Gresianeg" - -msgid "English" -msgstr "Saozneg" - -msgid "Australian English" -msgstr "Saozneg Aostralia" - -msgid "British English" -msgstr "Saozneg Breizh-Veur" - -msgid "Esperanto" -msgstr "Esperanteg" - -msgid "Spanish" -msgstr "Spagnoleg" - -msgid "Argentinian Spanish" -msgstr "Spagnoleg Arc'hantina" - -msgid "Colombian Spanish" -msgstr "Spagnoleg Kolombia" - -msgid "Mexican Spanish" -msgstr "Spagnoleg Mec'hiko" - -msgid "Nicaraguan Spanish" -msgstr "Spagnoleg Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Spagnoleg Venezuela" - -msgid "Estonian" -msgstr "Estoneg" - -msgid "Basque" -msgstr "Euskareg" - -msgid "Persian" -msgstr "Perseg" - -msgid "Finnish" -msgstr "Finneg" - -msgid "French" -msgstr "Galleg" - -msgid "Frisian" -msgstr "Frizeg" - -msgid "Irish" -msgstr "Iwerzhoneg" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Galizeg" - -msgid "Hebrew" -msgstr "Hebraeg" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroateg" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Hungareg" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezeg" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandeg" - -msgid "Italian" -msgstr "Italianeg" - -msgid "Japanese" -msgstr "Japaneg" - -msgid "Georgian" -msgstr "Jorjianeg" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "kazak" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannata" - -msgid "Korean" -msgstr "Koreaneg" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luksembourgeg" - -msgid "Lithuanian" -msgstr "Lituaneg" - -msgid "Latvian" -msgstr "Latveg" - -msgid "Macedonian" -msgstr "Makedoneg" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongoleg" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Burmeg" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "nepaleg" - -msgid "Dutch" -msgstr "Nederlandeg" - -msgid "Norwegian Nynorsk" -msgstr "Norvegeg Nynorsk" - -msgid "Ossetic" -msgstr "Oseteg" - -msgid "Punjabi" -msgstr "Punjabeg" - -msgid "Polish" -msgstr "Poloneg" - -msgid "Portuguese" -msgstr "Portugaleg" - -msgid "Brazilian Portuguese" -msgstr "Portugaleg Brazil" - -msgid "Romanian" -msgstr "Roumaneg" - -msgid "Russian" -msgstr "Rusianeg" - -msgid "Slovak" -msgstr "Slovakeg" - -msgid "Slovenian" -msgstr "Sloveneg" - -msgid "Albanian" -msgstr "Albaneg" - -msgid "Serbian" -msgstr "Serbeg" - -msgid "Serbian Latin" -msgstr "Serbeg e lizherennoù latin" - -msgid "Swedish" -msgstr "Svedeg" - -msgid "Swahili" -msgstr "swahileg" - -msgid "Tamil" -msgstr "Tamileg" - -msgid "Telugu" -msgstr "Telougou" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turkeg" - -msgid "Tatar" -msgstr "tatar" - -msgid "Udmurt" -msgstr "Oudmourteg" - -msgid "Ukrainian" -msgstr "Ukraineg" - -msgid "Urdu" -msgstr "Ourdou" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnameg" - -msgid "Simplified Chinese" -msgstr "Sinaeg eeunaet" - -msgid "Traditional Chinese" -msgstr "Sinaeg hengounel" - -msgid "Messages" -msgstr "Kemennadenn" - -msgid "Site Maps" -msgstr "Tresoù al lec'hienn" - -msgid "Static Files" -msgstr "Restroù statek" - -msgid "Syndication" -msgstr "Sindikadur" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "An niver a bajenn mañ a zo bihanoc'h eget 1." - -msgid "That page contains no results" -msgstr "N'eus disoc'h er pajenn-mañ." - -msgid "Enter a valid value." -msgstr "Merkit un talvoud reizh" - -msgid "Enter a valid URL." -msgstr "Merkit un URL reizh" - -msgid "Enter a valid integer." -msgstr "Merkit un niver anterin reizh." - -msgid "Enter a valid email address." -msgstr "Merkit ur chomlec'h postel reizh" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Merkit ur chomlec'h IPv4 reizh." - -msgid "Enter a valid IPv6 address." -msgstr "Merkit ur chomlec'h IPv6 reizh." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Merkit ur chomlec'h IPv4 pe IPv6 reizh." - -msgid "Enter only digits separated by commas." -msgstr "Merkañ hepken sifroù dispartiet dre skejoù." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Bezit sur ez eo an talvoud-mañ %(limit_value)s (evit ar mare ez eo " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Gwiriit mat emañ an talvoud-mañ a-is pe par da %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Gwiriit mat emañ an talvoud-mañ a-us pe par da %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "Enter a number." -msgstr "Merkit un niver." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "ha" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "N'hall ket ar vaezienn chom goullo" - -msgid "This field cannot be blank." -msgstr "N'hall ket ar vaezienn chom goullo" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Bez' ez eus c'hoazh eus ur %(model_name)s gant ar %(field_label)s-mañ." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Seurt maezienn : %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boulean (gwir pe gaou)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "neudennad arouezennoù (betek %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Niveroù anterin dispartiet dre ur skej" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Deizad (hep eur)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Deizad (gant an eur)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Niver dekvedennel" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Chomlec'h postel" - -msgid "File path" -msgstr "Treug war-du ar restr" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Niver gant skej nij" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Anterin" - -msgid "Big (8 byte) integer" -msgstr "Anterin bras (8 okted)" - -msgid "Small integer" -msgstr "Niver anterin bihan" - -msgid "IPv4 address" -msgstr "Chomlec'h IPv4" - -msgid "IP address" -msgstr "Chomlec'h IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boulean (gwir pe gaou pe netra)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Niver anterin pozitivel" - -msgid "Positive small integer" -msgstr "Niver anterin bihan pozitivel" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (betek %(max_length)s arouez.)" - -msgid "Text" -msgstr "Testenn" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Eur" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Restr" - -msgid "Image" -msgstr "Skeudenn" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Alc'hwez estren (seurt termenet dre ar vaezienn liammet)" - -msgid "One-to-one relationship" -msgstr "Darempred unan-ouzh-unan" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Darempred lies-ouzh-lies" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Rekis eo leuniañ ar vaezienn." - -msgid "Enter a whole number." -msgstr "Merkit un niver anterin." - -msgid "Enter a valid date." -msgstr "Merkit un deiziad reizh" - -msgid "Enter a valid time." -msgstr "Merkit un eur reizh" - -msgid "Enter a valid date/time." -msgstr "Merkit un eur/deiziad reizh" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "N'eus ket kaset restr ebet. Gwiriit ar seurt enkodañ evit ar restr" - -msgid "No file was submitted." -msgstr "N'eus bet kaset restr ebet." - -msgid "The submitted file is empty." -msgstr "Goullo eo ar restr kaset." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Kasit ur restr pe askit al log riñsañ; an eil pe egile" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Enpozhiit ur skeudenn reizh. Ar seurt bet enporzhiet ganeoc'h a oa foeltret " -"pe ne oa ket ur skeudenn" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Dizuit un dibab reizh. %(value)s n'emañ ket e-touez an dibaboù posupl." - -msgid "Enter a list of values." -msgstr "Merkit ur roll talvoudoù" - -msgid "Enter a complete value." -msgstr "Merkañ un talvoud klok" - -msgid "Enter a valid UUID." -msgstr "" - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "Order" -msgstr "Urzh" - -msgid "Delete" -msgstr "Diverkañ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Reizhit ar roadennoù e doubl e %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Reizhit ar roadennoù e doubl e %(field)s, na zle bezañ enni nemet talvoudoù " -"dzho o-unan." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Reizhit ar roadennoù e doubl e %(field_name)s a rank bezañ ennañ talvodoù en " -"o-unan evit lodenn %(lookup)s %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Reizhañ ar roadennoù e doubl zo a-is" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Diuzit un dibab reizh. N'emañ ket an dibab-mañ e-touez ar re bosupl." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Riñsañ" - -msgid "Currently" -msgstr "Evit ar mare" - -msgid "Change" -msgstr "Kemmañ" - -msgid "Unknown" -msgstr "Dianav" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Ket" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ya,ket,marteze" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d okted" -msgstr[1] "%(size)d okted" -msgstr[2] "%(size)d okted" -msgstr[3] "%(size)d okted" -msgstr[4] "%(size)d okted" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "g.m." - -msgid "a.m." -msgstr "mintin" - -msgid "PM" -msgstr "G.M." - -msgid "AM" -msgstr "Mintin" - -msgid "midnight" -msgstr "hanternoz" - -msgid "noon" -msgstr "kreisteiz" - -msgid "Monday" -msgstr "Lun" - -msgid "Tuesday" -msgstr "Meurzh" - -msgid "Wednesday" -msgstr "Merc'her" - -msgid "Thursday" -msgstr "Yaou" - -msgid "Friday" -msgstr "Gwener" - -msgid "Saturday" -msgstr "Sadorn" - -msgid "Sunday" -msgstr "Sul" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Meu" - -msgid "Wed" -msgstr "Mer" - -msgid "Thu" -msgstr "Yao" - -msgid "Fri" -msgstr "Gwe" - -msgid "Sat" -msgstr "Sad" - -msgid "Sun" -msgstr "Sul" - -msgid "January" -msgstr "Genver" - -msgid "February" -msgstr "C'hwevrer" - -msgid "March" -msgstr "Meurzh" - -msgid "April" -msgstr "Ebrel" - -msgid "May" -msgstr "Mae" - -msgid "June" -msgstr "Mezheven" - -msgid "July" -msgstr "Gouere" - -msgid "August" -msgstr "Eost" - -msgid "September" -msgstr "Gwengolo" - -msgid "October" -msgstr "Here" - -msgid "November" -msgstr "Du" - -msgid "December" -msgstr "Kerzu" - -msgid "jan" -msgstr "Gen" - -msgid "feb" -msgstr "C'hwe" - -msgid "mar" -msgstr "Meu" - -msgid "apr" -msgstr "Ebr" - -msgid "may" -msgstr "Mae" - -msgid "jun" -msgstr "Mez" - -msgid "jul" -msgstr "Gou" - -msgid "aug" -msgstr "Eos" - -msgid "sep" -msgstr "Gwe" - -msgid "oct" -msgstr "Her" - -msgid "nov" -msgstr "Du" - -msgid "dec" -msgstr "Kzu" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Gen." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "C'hwe." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Meu." - -msgctxt "abbrev. month" -msgid "April" -msgstr "Ebr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mae" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Mez." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Gou." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Eos." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Gwe." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Her." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Du" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Kzu" - -msgctxt "alt. month" -msgid "January" -msgstr "Genver" - -msgctxt "alt. month" -msgid "February" -msgstr "C'hwevrer" - -msgctxt "alt. month" -msgid "March" -msgstr "Meurzh" - -msgctxt "alt. month" -msgid "April" -msgstr "Ebrel" - -msgctxt "alt. month" -msgid "May" -msgstr "Mae" - -msgctxt "alt. month" -msgid "June" -msgstr "Mezheven" - -msgctxt "alt. month" -msgid "July" -msgstr "Gouere" - -msgctxt "alt. month" -msgid "August" -msgstr "Eost" - -msgctxt "alt. month" -msgid "September" -msgstr "Gwengolo" - -msgctxt "alt. month" -msgid "October" -msgstr "Here" - -msgctxt "alt. month" -msgid "November" -msgstr "Du" - -msgctxt "alt. month" -msgid "December" -msgstr "Kerzu" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "pe" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "Forbidden" -msgstr "Difennet" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "N'eus bet resisaet bloavezh ebet" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "N'eus bet resisaet miz ebet" - -msgid "No day specified" -msgstr "N'eus bet resisaet deiz ebet" - -msgid "No week specified" -msgstr "N'eus bet resisaet sizhun ebet" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "N'eus %(verbose_name_plural)s ebet da gaout." - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"En dazont ne vo ket a %(verbose_name_plural)s rak faos eo %(class_name)s." -"allow_future." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" -"N'eus bet kavet traezenn %(verbose_name)s ebet o klotaén gant ar goulenn" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "N'haller ket diskwel endalc'had ar c'havlec'h-mañ." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Meneger %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index 064cc5d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index a985b84..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,1238 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Filip Dupanović , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "arapski" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Azerbejdžanski" - -msgid "Bulgarian" -msgstr "bugarski" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "bengalski" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "bosanski" - -msgid "Catalan" -msgstr "katalonski" - -msgid "Czech" -msgstr "češki" - -msgid "Welsh" -msgstr "velški" - -msgid "Danish" -msgstr "danski" - -msgid "German" -msgstr "njemački" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "grčki" - -msgid "English" -msgstr "engleski" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Britanski engleski" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "španski" - -msgid "Argentinian Spanish" -msgstr "Argentinski španski" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Meksički španski" - -msgid "Nicaraguan Spanish" -msgstr "Nikuaraganski španski" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "estonski" - -msgid "Basque" -msgstr "baskijski" - -msgid "Persian" -msgstr "persijski" - -msgid "Finnish" -msgstr "finski" - -msgid "French" -msgstr "francuski" - -msgid "Frisian" -msgstr "frišanski" - -msgid "Irish" -msgstr "irski" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "galski" - -msgid "Hebrew" -msgstr "hebrejski" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "hrvatski" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "mađarski" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Indonežanski" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "islandski" - -msgid "Italian" -msgstr "italijanski" - -msgid "Japanese" -msgstr "japanski" - -msgid "Georgian" -msgstr "gruzijski" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "kambođanski" - -msgid "Kannada" -msgstr "kanada" - -msgid "Korean" -msgstr "korejski" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "litvanski" - -msgid "Latvian" -msgstr "latvijski" - -msgid "Macedonian" -msgstr "makedonski" - -msgid "Malayalam" -msgstr "Malajalamski" - -msgid "Mongolian" -msgstr "Mongolski" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "holandski" - -msgid "Norwegian Nynorsk" -msgstr "Norveški novi" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Pandžabi" - -msgid "Polish" -msgstr "poljski" - -msgid "Portuguese" -msgstr "portugalski" - -msgid "Brazilian Portuguese" -msgstr "brazilski portugalski" - -msgid "Romanian" -msgstr "rumunski" - -msgid "Russian" -msgstr "ruski" - -msgid "Slovak" -msgstr "slovački" - -msgid "Slovenian" -msgstr "slovenački" - -msgid "Albanian" -msgstr "albanski" - -msgid "Serbian" -msgstr "srpski" - -msgid "Serbian Latin" -msgstr "srpski latinski" - -msgid "Swedish" -msgstr "švedski" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "tamilski" - -msgid "Telugu" -msgstr "telugu" - -msgid "Thai" -msgstr "tajlandski" - -msgid "Turkish" -msgstr "turski" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ukrajinski" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "vijetnamežanski" - -msgid "Simplified Chinese" -msgstr "novokineski" - -msgid "Traditional Chinese" -msgstr "starokineski" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Unesite ispravnu vrijednost." - -msgid "Enter a valid URL." -msgstr "Unesite ispravan URL." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Unesite ispravnu IPv4 adresu." - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Unesite samo brojke razdvojene zapetama." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Pobrinite se da je ova vrijednost %(limit_value)s (trenutno je " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ova vrijednost mora da bude manja ili jednaka %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ova vrijednost mora biti veća ili jednaka %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Enter a number." -msgstr "Unesite broj." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "i" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Ovo polje ne može ostati prazno." - -msgid "This field cannot be blank." -msgstr "Ovo polje ne može biti prazno." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s sa ovom vrijednošću %(field_label)s već postoji." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Polje tipa: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Bulova vrijednost (True ili False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (najviše %(max_length)s znakova)" - -msgid "Comma-separated integers" -msgstr "Cijeli brojevi razdvojeni zapetama" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Datum (bez vremena)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Datum (sa vremenom)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Decimalni broj" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Email adresa" - -msgid "File path" -msgstr "Putanja fajla" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Broj sa pokrenom zapetom" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Cijeo broj" - -msgid "Big (8 byte) integer" -msgstr "Big (8 bajtni) integer" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "IP adresa" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Bulova vrijednost (True, False ili None)" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Vrijeme" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Strani ključ (tip određen povezanim poljem)" - -msgid "One-to-one relationship" -msgstr "Jedan-na-jedan odnos" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Više-na-više odsnos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Ovo polje se mora popuniti." - -msgid "Enter a whole number." -msgstr "Unesite cijeo broj." - -msgid "Enter a valid date." -msgstr "Unesite ispravan datum." - -msgid "Enter a valid time." -msgstr "Unesite ispravno vrijeme" - -msgid "Enter a valid date/time." -msgstr "Unesite ispravan datum/vrijeme." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Fajl nije prebačen. Provjerite tip enkodiranja formulara." - -msgid "No file was submitted." -msgstr "Fajl nije prebačen." - -msgid "The submitted file is empty." -msgstr "Prebačen fajl je prazan." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Prebacite ispravan fajl. Fajl koji je prebačen ili nije slika, ili je " -"oštećen." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"%(value)s nije među ponuđenim vrijednostima. Odaberite jednu od ponuđenih." - -msgid "Enter a list of values." -msgstr "Unesite listu vrijednosti." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Order" -msgstr "Redoslijed" - -msgid "Delete" -msgstr "Obriši" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ispravite dupli sadržaj za polja: %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ispravite dupli sadržaj za polja: %(field)s, koji mora da bude jedinstven." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ispravite dupli sadržaj za polja: %(field_name)s, koji mora da bude " -"jedinstven za %(lookup)s u %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Ispravite duple vrijednosti dole." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Odabrana vrijednost nije među ponuđenima. Odaberite jednu od ponuđenih." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Očisti" - -msgid "Currently" -msgstr "Trenutno" - -msgid "Change" -msgstr "Izmjeni" - -msgid "Unknown" -msgstr "Nepoznato" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "da,ne,možda" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "po p." - -msgid "a.m." -msgstr "prije p." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "ponoć" - -msgid "noon" -msgstr "podne" - -msgid "Monday" -msgstr "ponedjeljak" - -msgid "Tuesday" -msgstr "utorak" - -msgid "Wednesday" -msgstr "srijeda" - -msgid "Thursday" -msgstr "četvrtak" - -msgid "Friday" -msgstr "petak" - -msgid "Saturday" -msgstr "subota" - -msgid "Sunday" -msgstr "nedjelja" - -msgid "Mon" -msgstr "pon." - -msgid "Tue" -msgstr "uto." - -msgid "Wed" -msgstr "sri." - -msgid "Thu" -msgstr "čet." - -msgid "Fri" -msgstr "pet." - -msgid "Sat" -msgstr "sub." - -msgid "Sun" -msgstr "ned." - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "mart" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "septembar" - -msgid "October" -msgstr "oktobar" - -msgid "November" -msgstr "novembar" - -msgid "December" -msgstr "decembar" - -msgid "jan" -msgstr "jan." - -msgid "feb" -msgstr "feb." - -msgid "mar" -msgstr "mar." - -msgid "apr" -msgstr "apr." - -msgid "may" -msgstr "maj." - -msgid "jun" -msgstr "jun." - -msgid "jul" -msgstr "jul." - -msgid "aug" -msgstr "aug." - -msgid "sep" -msgstr "sep." - -msgid "oct" -msgstr "okt." - -msgid "nov" -msgstr "nov." - -msgid "dec" -msgstr "dec." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "august" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "septembar" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "oktobar" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "novembar" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "decembar" - -msgctxt "alt. month" -msgid "January" -msgstr "januar" - -msgctxt "alt. month" -msgid "February" -msgstr "februar" - -msgctxt "alt. month" -msgid "March" -msgstr "mart" - -msgctxt "alt. month" -msgid "April" -msgstr "april" - -msgctxt "alt. month" -msgid "May" -msgstr "maj" - -msgctxt "alt. month" -msgid "June" -msgstr "juni" - -msgctxt "alt. month" -msgid "July" -msgstr "juli" - -msgctxt "alt. month" -msgid "August" -msgstr "august" - -msgctxt "alt. month" -msgid "September" -msgstr "septembar" - -msgctxt "alt. month" -msgid "October" -msgstr "oktobar" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembar" - -msgctxt "alt. month" -msgid "December" -msgstr "decembar" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ili" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Godina nije naznačena" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Mjesec nije naznačen" - -msgid "No day specified" -msgstr "Dan nije naznačen" - -msgid "No week specified" -msgstr "Sedmica nije naznačena" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bs/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/bs/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/bs/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/bs/formats.py deleted file mode 100644 index a15e709..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/bs/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. N Y." -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j. N. Y. G:i T" -YEAR_MONTH_FORMAT = "F Y." -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "Y M j" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 208f4a4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index 01e4dda..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,1340 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2012,2015-2017,2021-2022 -# Carles Barrobés , 2011-2012,2014,2020 -# duub qnnp, 2015 -# Emilio Carrion, 2022 -# Gil Obradors Via , 2019 -# Gil Obradors Via , 2019 -# Jannis Leidel , 2011 -# Manel Clos , 2020 -# Manuel Miranda , 2015 -# Mariusz Felisiak , 2021 -# Roger Pons , 2015 -# Santiago Lamora , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:23-0500\n" -"PO-Revision-Date: 2022-07-25 06:49+0000\n" -"Last-Translator: Emilio Carrion\n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikans" - -msgid "Arabic" -msgstr "àrab" - -msgid "Algerian Arabic" -msgstr "àrab argelià" - -msgid "Asturian" -msgstr "Asturià" - -msgid "Azerbaijani" -msgstr "azerbaijanès" - -msgid "Bulgarian" -msgstr "búlgar" - -msgid "Belarusian" -msgstr "Bielorús" - -msgid "Bengali" -msgstr "bengalí" - -msgid "Breton" -msgstr "Bretó" - -msgid "Bosnian" -msgstr "bosnià" - -msgid "Catalan" -msgstr "català" - -msgid "Czech" -msgstr "txec" - -msgid "Welsh" -msgstr "gal·lès" - -msgid "Danish" -msgstr "danès" - -msgid "German" -msgstr "alemany" - -msgid "Lower Sorbian" -msgstr "baix serbi" - -msgid "Greek" -msgstr "grec" - -msgid "English" -msgstr "anglès" - -msgid "Australian English" -msgstr "Anglès d'Austràlia" - -msgid "British English" -msgstr "anglès britànic" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "castellà" - -msgid "Argentinian Spanish" -msgstr "castellà d'Argentina" - -msgid "Colombian Spanish" -msgstr "castellà de Colombia" - -msgid "Mexican Spanish" -msgstr "castellà de Mèxic" - -msgid "Nicaraguan Spanish" -msgstr "castellà de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "castellà de Veneçuela" - -msgid "Estonian" -msgstr "estonià" - -msgid "Basque" -msgstr "èuscar" - -msgid "Persian" -msgstr "persa" - -msgid "Finnish" -msgstr "finlandès" - -msgid "French" -msgstr "francès" - -msgid "Frisian" -msgstr "frisi" - -msgid "Irish" -msgstr "irlandès" - -msgid "Scottish Gaelic" -msgstr "Gaèlic escocès" - -msgid "Galician" -msgstr "gallec" - -msgid "Hebrew" -msgstr "hebreu" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "croat" - -msgid "Upper Sorbian" -msgstr "alt serbi" - -msgid "Hungarian" -msgstr "hongarès" - -msgid "Armenian" -msgstr "Armeni" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "indonesi" - -msgid "Igbo" -msgstr "lgbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "islandès" - -msgid "Italian" -msgstr "italià" - -msgid "Japanese" -msgstr "japonès" - -msgid "Georgian" -msgstr "georgià" - -msgid "Kabyle" -msgstr "Cabilenc" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "khmer" - -msgid "Kannada" -msgstr "kannarès" - -msgid "Korean" -msgstr "coreà" - -msgid "Kyrgyz" -msgstr "Kyrgyz" - -msgid "Luxembourgish" -msgstr "Luxemburguès" - -msgid "Lithuanian" -msgstr "lituà" - -msgid "Latvian" -msgstr "letó" - -msgid "Macedonian" -msgstr "macedoni" - -msgid "Malayalam" -msgstr "malaiàlam " - -msgid "Mongolian" -msgstr "mongol" - -msgid "Marathi" -msgstr "Maratí" - -msgid "Malay" -msgstr "Malai" - -msgid "Burmese" -msgstr "Burmès" - -msgid "Norwegian Bokmål" -msgstr "Bokmål noruec" - -msgid "Nepali" -msgstr "nepalès" - -msgid "Dutch" -msgstr "holandès" - -msgid "Norwegian Nynorsk" -msgstr "noruec nynorsk" - -msgid "Ossetic" -msgstr "ossètic" - -msgid "Punjabi" -msgstr "panjabi" - -msgid "Polish" -msgstr "polonès" - -msgid "Portuguese" -msgstr "portuguès" - -msgid "Brazilian Portuguese" -msgstr "portuguès de brasil" - -msgid "Romanian" -msgstr "romanès" - -msgid "Russian" -msgstr "rus" - -msgid "Slovak" -msgstr "eslovac" - -msgid "Slovenian" -msgstr "eslovè" - -msgid "Albanian" -msgstr "albanès" - -msgid "Serbian" -msgstr "serbi" - -msgid "Serbian Latin" -msgstr "serbi llatí" - -msgid "Swedish" -msgstr "suec" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "tàmil" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "tailandès" - -msgid "Turkmen" -msgstr "Turkmen" - -msgid "Turkish" -msgstr "turc" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "ucraïnès" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "Uzbek" - -msgid "Vietnamese" -msgstr "vietnamita" - -msgid "Simplified Chinese" -msgstr "xinès simplificat" - -msgid "Traditional Chinese" -msgstr "xinès tradicional" - -msgid "Messages" -msgstr "Missatges" - -msgid "Site Maps" -msgstr "Mapes del lloc" - -msgid "Static Files" -msgstr "Arxius estàtics" - -msgid "Syndication" -msgstr "Sindicació" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Aquest número de plana no és un enter" - -msgid "That page number is less than 1" -msgstr "El nombre de plana és inferior a 1" - -msgid "That page contains no results" -msgstr "La plana no conté cap resultat" - -msgid "Enter a valid value." -msgstr "Introduïu un valor vàlid." - -msgid "Enter a valid URL." -msgstr "Introduïu una URL vàlida." - -msgid "Enter a valid integer." -msgstr "Introduïu un enter vàlid." - -msgid "Enter a valid email address." -msgstr "Introdueix una adreça de correu electrònic vàlida" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Introduïu un 'slug' vàlid, consistent en lletres, números, guions o guions " -"baixos." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Introduïu un 'slug' vàlid format per lletres Unicode, números, guions o " -"guions baixos." - -msgid "Enter a valid IPv4 address." -msgstr "Introduïu una adreça IPv4 vàlida." - -msgid "Enter a valid IPv6 address." -msgstr "Entreu una adreça IPv6 vàlida." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Entreu una adreça IPv4 o IPv6 vàlida." - -msgid "Enter only digits separated by commas." -msgstr "Introduïu només dígits separats per comes." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Assegureu-vos que aquest valor sigui %(limit_value)s (és %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Assegureu-vos que aquest valor sigui menor o igual que %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Assegureu-vos que aquest valor sigui més gran o igual que %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -" \n" -"Asseguri's que aquest valor sigui un múltiple de %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assegureu-vos que aquest valor té almenys %(limit_value)d caràcter (en té " -"%(show_value)d)." -msgstr[1] "" -"Assegureu-vos que el valor tingui almenys %(limit_value)d caràcters (en té " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assegureu-vos que aquest valor té com a molt %(limit_value)d caràcter (en té " -"%(show_value)d)." -msgstr[1] "" -"Assegureu-vos que aquest valor tingui com a molt %(limit_value)d caràcters " -"(en té %(show_value)d)." - -msgid "Enter a number." -msgstr "Introduïu un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Assegureu-vos que no hi ha més de %(max)s dígit en total." -msgstr[1] "Assegureu-vos que no hi hagi més de %(max)s dígits en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Assegureu-vos que no hi ha més de %(max)s decimal." -msgstr[1] "Assegureu-vos que no hi hagi més de %(max)s decimals." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Assegureu-vos que no hi ha més de %(max)s dígit abans de la coma decimal." -msgstr[1] "" -"Assegureu-vos que no hi hagi més de %(max)s dígits abans de la coma decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"L'extensió d'arxiu “%(extension)s” no està permesa. Les extensions permeses " -"són: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "No es permeten caràcters nuls." - -msgid "and" -msgstr "i" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Ja existeix %(model_name)s amb aquest %(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "La restricció %(name)s no es compleix." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "El valor %(value)r no és una opció vàlida." - -msgid "This field cannot be null." -msgstr "Aquest camp no pot ser nul." - -msgid "This field cannot be blank." -msgstr "Aquest camp no pot estar en blanc." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ja existeix %(model_name)s amb aquest %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s ha de ser únic per a %(date_field_label)s i %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Camp del tipus: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "El valor '%(value)s' ha de ser \"True\" o \"False\"." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "El valor '%(value)s' ha de ser cert, fals o buid." - -msgid "Boolean (Either True or False)" -msgstr "Booleà (Cert o Fals)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (de fins a %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Enters separats per comes" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"El valor '%(value)s' no té un format de data vàlid. Ha de tenir el format " -"YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"El valor '%(value)s' té el format correcte (YYYY-MM-DD) però no és una data " -"vàlida." - -msgid "Date (without time)" -msgstr "Data (sense hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"El valor '%(value)s' no té un format vàlid. Ha de tenir el format YYYY-MM-DD " -"HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"El valor '%(value)s' té el format correcte (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) però no és una data/hora vàlida." - -msgid "Date (with time)" -msgstr "Data (amb hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "El valor '%(value)s' ha de ser un nombre decimal." - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"'El valor %(value)s' té un format invàlid. Ha d'estar en el format [DD] [HH:" -"[MM:]]ss[.uuuuuu] ." - -msgid "Duration" -msgstr "Durada" - -msgid "Email address" -msgstr "Adreça de correu electrònic" - -msgid "File path" -msgstr "Ruta del fitxer" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "El valor '%(value)s' ha de ser un número decimal." - -msgid "Floating point number" -msgstr "Número de coma flotant" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "El valor '%(value)s' ha de ser un nombre enter." - -msgid "Integer" -msgstr "Enter" - -msgid "Big (8 byte) integer" -msgstr "Enter gran (8 bytes)" - -msgid "Small integer" -msgstr "Enter petit" - -msgid "IPv4 address" -msgstr "Adreça IPv4" - -msgid "IP address" -msgstr "Adreça IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "El valor '%(value)s' ha de ser None, True o False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleà (Cert, Fals o Cap ('None'))" - -msgid "Positive big integer" -msgstr "Enter gran positiu" - -msgid "Positive integer" -msgstr "Enter positiu" - -msgid "Positive small integer" -msgstr "Enter petit positiu" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (fins a %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"El valor '%(value)s' no té un format vàlid. Ha de tenir el format HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"El valor '%(value)s' té el format correcte (HH:MM[:ss[.uuuuuu]]) però no és " -"una hora vàlida." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dades binàries" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "'%(value)s' no és un UUID vàlid." - -msgid "Universally unique identifier" -msgstr "Identificador únic universal" - -msgid "File" -msgstr "Arxiu" - -msgid "Image" -msgstr "Imatge" - -msgid "A JSON object" -msgstr "Un objecte JSON" - -msgid "Value must be valid JSON." -msgstr "El valor ha de ser JSON vàlid." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "La instància de %(model)s amb %(field)s %(value)r no existeix." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clau forana (tipus determinat pel camp relacionat)" - -msgid "One-to-one relationship" -msgstr "Relació un-a-un" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "relació %(from)s-%(to)s " - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "relacions %(from)s-%(to)s " - -msgid "Many-to-many relationship" -msgstr "Relació molts-a-molts" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Aquest camp és obligatori." - -msgid "Enter a whole number." -msgstr "Introduïu un número enter." - -msgid "Enter a valid date." -msgstr "Introduïu una data vàlida." - -msgid "Enter a valid time." -msgstr "Introduïu una hora vàlida." - -msgid "Enter a valid date/time." -msgstr "Introduïu una data/hora vàlides." - -msgid "Enter a valid duration." -msgstr "Introduïu una durada vàlida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "El número de dies ha de ser entre {min_days} i {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No s'ha enviat cap fitxer. Comproveu el tipus de codificació del formulari." - -msgid "No file was submitted." -msgstr "No s'ha enviat cap fitxer." - -msgid "The submitted file is empty." -msgstr "El fitxer enviat està buit." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Aquest nom d'arxiu hauria de tenir com a molt %(max)d caràcter (en té " -"%(length)d)." -msgstr[1] "" -"Aquest nom d'arxiu hauria de tenir com a molt %(max)d caràcters (en té " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Si us plau, envieu un fitxer o marqueu la casella de selecció \"netejar\", " -"no ambdós." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Carregueu una imatge vàlida. El fitxer que heu carregat no era una imatge o " -"estava corrupte." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Esculliu una opció vàlida. %(value)s no és una de les opcions vàlides." - -msgid "Enter a list of values." -msgstr "Introduïu una llista de valors." - -msgid "Enter a complete value." -msgstr "Introduïu un valor complet." - -msgid "Enter a valid UUID." -msgstr "Intruduïu un UUID vàlid." - -msgid "Enter a valid JSON." -msgstr "Introduïu un JSON vàlid." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Camp ocult %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Les dades de ManagementForm no hi són o han estat modificades. Camps que " -"falten: %(field_names)s. . Necessitaràs omplir una incidència si el problema " -"persisteix." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Enviau com a màxim %(num)d formulari, si us plau." -msgstr[1] "Enviau com a màxim %(num)d formularis, si us plau." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Enviau com a mínim %(num)d formulari, si us plau." -msgstr[1] "Enviau com a mínim %(num)d formularis, si us plau." - -msgid "Order" -msgstr "Ordre" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Si us plau, corregiu la dada duplicada per a %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Si us plau, corregiu la dada duplicada per a %(field)s, la qual ha de ser " -"única." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Si us plau, corregiu la dada duplicada per a %(field_name)s, la qual ha de " -"ser única per a %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Si us plau, corregiu els valors duplicats a sota." - -msgid "The inline value did not match the parent instance." -msgstr "El valor en línia no coincideix amb la instància mare ." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Esculliu una opció vàlida. La opció triada no és una de les opcions " -"disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" no és un valor vàlid" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"No s'ha pogut interpretar %(datetime)s a la zona horària " -"%(current_timezone)s; potser és ambigua o no existeix." - -msgid "Clear" -msgstr "Netejar" - -msgid "Currently" -msgstr "Actualment" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconegut" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sí,no,potser" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "mitjanit" - -msgid "noon" -msgstr "migdia" - -msgid "Monday" -msgstr "Dilluns" - -msgid "Tuesday" -msgstr "Dimarts" - -msgid "Wednesday" -msgstr "Dimecres" - -msgid "Thursday" -msgstr "Dijous" - -msgid "Friday" -msgstr "Divendres" - -msgid "Saturday" -msgstr "Dissabte" - -msgid "Sunday" -msgstr "Diumenge" - -msgid "Mon" -msgstr "dl." - -msgid "Tue" -msgstr "dt." - -msgid "Wed" -msgstr "dc." - -msgid "Thu" -msgstr "dj." - -msgid "Fri" -msgstr "dv." - -msgid "Sat" -msgstr "ds." - -msgid "Sun" -msgstr "dg." - -msgid "January" -msgstr "gener" - -msgid "February" -msgstr "febrer" - -msgid "March" -msgstr "març" - -msgid "April" -msgstr "abril" - -msgid "May" -msgstr "maig" - -msgid "June" -msgstr "juny" - -msgid "July" -msgstr "juliol" - -msgid "August" -msgstr "agost" - -msgid "September" -msgstr "setembre" - -msgid "October" -msgstr "octubre" - -msgid "November" -msgstr "novembre" - -msgid "December" -msgstr "desembre" - -msgid "jan" -msgstr "gen." - -msgid "feb" -msgstr "feb." - -msgid "mar" -msgstr "març" - -msgid "apr" -msgstr "abr." - -msgid "may" -msgstr "maig" - -msgid "jun" -msgstr "juny" - -msgid "jul" -msgstr "jul." - -msgid "aug" -msgstr "ago." - -msgid "sep" -msgstr "set." - -msgid "oct" -msgstr "oct." - -msgid "nov" -msgstr "nov." - -msgid "dec" -msgstr "des." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Gen." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Març" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maig" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juny" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Jul." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Des." - -msgctxt "alt. month" -msgid "January" -msgstr "gener" - -msgctxt "alt. month" -msgid "February" -msgstr "febrer" - -msgctxt "alt. month" -msgid "March" -msgstr "març" - -msgctxt "alt. month" -msgid "April" -msgstr "abril" - -msgctxt "alt. month" -msgid "May" -msgstr "maig" - -msgctxt "alt. month" -msgid "June" -msgstr "juny" - -msgctxt "alt. month" -msgid "July" -msgstr "juliol" - -msgctxt "alt. month" -msgid "August" -msgstr "agost" - -msgctxt "alt. month" -msgid "September" -msgstr "setembre" - -msgctxt "alt. month" -msgid "October" -msgstr "octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "novembre" - -msgctxt "alt. month" -msgid "December" -msgstr "desembre" - -msgid "This is not a valid IPv6 address." -msgstr "Aquesta no és una adreça IPv6 vàlida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d any" -msgstr[1] "%(num)d anys" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d mesos" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d setmana" -msgstr[1] "%(num)d setmanes" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dies" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d hores" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuts" - -msgid "Forbidden" -msgstr "Prohibit" - -msgid "CSRF verification failed. Request aborted." -msgstr "La verificació de CSRF ha fallat. Petició abortada." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Esteu veient aquest missatge perquè aquest lloc HTTPS requereix que el " -"vostre navegador enviï una capçalera “Referer\", i no n'ha arribada cap. " -"Aquesta capçalera es requereix per motius de seguretat, per garantir que el " -"vostre navegador no està sent segrestat per tercers." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Si heu configurat el vostre navegador per deshabilitar capçaleres “Referer" -"\", sisplau torneu-les a habilitar, com a mínim per a aquest lloc, o per a " -"connexions HTTPs, o per a peticions amb el mateix orígen." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Si utilitzeu l'etiqueta o " -"incloeu la capçalera “Referer-Policy: no-referrer\" , si us plau elimineu-" -"la. La protecció CSRF requereix la capçalera “Referer\" per a fer una " -"comprovació estricta. Si esteu preocupats quant a la privacitat, utilitzeu " -"alternatives com per enllaços a aplicacions de " -"tercers." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Estàs veient aquest missatge perquè aquest lloc requereix una galeta CSRF " -"quan s'envien formularis. Aquesta galeta es requereix per motius de " -"seguretat, per garantir que el teu navegador no està sent infiltrat per " -"tercers." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Si has configurat el teu navegador per deshabilitar galetes, sisplau torna-" -"les a habilitar, com a mínim per a aquest lloc, o per a peticions amb el " -"mateix orígen." - -msgid "More information is available with DEBUG=True." -msgstr "Més informació disponible amb DEBUG=True." - -msgid "No year specified" -msgstr "No s'ha especificat any" - -msgid "Date out of range" -msgstr "Data fora de rang" - -msgid "No month specified" -msgstr "No s'ha especificat mes" - -msgid "No day specified" -msgstr "No s'ha especificat dia" - -msgid "No week specified" -msgstr "No s'ha especificat setmana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Cap %(verbose_name_plural)s disponible" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Futurs %(verbose_name_plural)s no disponibles perquè %(class_name)s." -"allow_future és Fals." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Cadena invàlida de data '%(datestr)s' donat el format '%(format)s'" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No s'ha trobat cap %(verbose_name)s que coincideixi amb la petició" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "La pàgina no és 'last', ni es pot convertir en un enter" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Pàgina invàlida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Llista buida i '%(class_name)s.allow_empty' és Fals." - -msgid "Directory indexes are not allowed here." -msgstr "Aquí no es permeten índex de directori." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" no existeix" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índex de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "La instal·lació ha estat un èxit! Enhorabona!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Visualitza notes de llançament per Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Esteu veient aquesta pàgina perquè el paràmetre DEBUG=Trueconsta al fitxer de configuració i no teniu cap " -"URL configurada." - -msgid "Django Documentation" -msgstr "Documentació de Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temes, referències, & Com es fa" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Una aplicació enquesta" - -msgid "Get started with Django" -msgstr "Primers passos amb Django" - -msgid "Django Community" -msgstr "Comunitat Django" - -msgid "Connect, get help, or contribute" -msgstr "Connecta, obté ajuda, o col·labora" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ca/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ca/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ca/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ca/formats.py deleted file mode 100644 index e616299..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ca/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j E \d\e Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = r"j E \d\e Y \a \l\e\s G:i" -YEAR_MONTH_FORMAT = r"F \d\e\l Y" -MONTH_DAY_FORMAT = r"j E" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y G:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '31/12/2009' - "%d/%m/%y", # '31/12/09' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index 39b9108..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index 1caebbc..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,1332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bawar Jalal, 2021 -# Bawar Jalal, 2020-2021 -# Bawar Jalal, 2020 -# Kosar Tofiq Saeed , 2020-2021 -# Swara , 2022-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Swara , 2022-2024\n" -"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "ئەفریقی" - -msgid "Arabic" -msgstr "عەرەبی" - -msgid "Algerian Arabic" -msgstr "عەرەبیی جەزائیری" - -msgid "Asturian" -msgstr "ئاستوری" - -msgid "Azerbaijani" -msgstr "ئازەربایجانی" - -msgid "Bulgarian" -msgstr "بولگاری" - -msgid "Belarusian" -msgstr "بیلاڕوسی" - -msgid "Bengali" -msgstr "بەنگالی" - -msgid "Breton" -msgstr "بریتۆنی" - -msgid "Bosnian" -msgstr "بۆسنێیی" - -msgid "Catalan" -msgstr "کاتالانی" - -msgid "Central Kurdish (Sorani)" -msgstr "کوردی" - -msgid "Czech" -msgstr "چیکی" - -msgid "Welsh" -msgstr "وێڵزی" - -msgid "Danish" -msgstr "دانیمارکی" - -msgid "German" -msgstr "ئەڵمانی" - -msgid "Lower Sorbian" -msgstr "سۆربیانی خواروو" - -msgid "Greek" -msgstr "یۆنانی" - -msgid "English" -msgstr "ئینگلیزی" - -msgid "Australian English" -msgstr "ئینگلیزی ئوستورالی" - -msgid "British English" -msgstr "ئینگلیزی بەریتانی" - -msgid "Esperanto" -msgstr "ئێسپەرانتەویی" - -msgid "Spanish" -msgstr "ئیسپانی" - -msgid "Argentinian Spanish" -msgstr "ئیسپانیی ئەرجەنتینی" - -msgid "Colombian Spanish" -msgstr "ئیسپانیی کۆڵۆمبی" - -msgid "Mexican Spanish" -msgstr "ئیسپانیی مەکسیکی" - -msgid "Nicaraguan Spanish" -msgstr "ئیسپانیی نیکاراگوایی" - -msgid "Venezuelan Spanish" -msgstr "ئیسپانیی فەنزوێلایی" - -msgid "Estonian" -msgstr "ئیستۆنی" - -msgid "Basque" -msgstr "باسکۆیی" - -msgid "Persian" -msgstr "فارسی" - -msgid "Finnish" -msgstr "فینلەندی" - -msgid "French" -msgstr "فەڕەنسی" - -msgid "Frisian" -msgstr "فریسی" - -msgid "Irish" -msgstr "ئیرلەندی" - -msgid "Scottish Gaelic" -msgstr "گالیکی سکۆتلەندی" - -msgid "Galician" -msgstr "گالیسیایی" - -msgid "Hebrew" -msgstr "ئیسرائیلی" - -msgid "Hindi" -msgstr "هیندی" - -msgid "Croatian" -msgstr "کڕواتی" - -msgid "Upper Sorbian" -msgstr "سڕبی سەروو" - -msgid "Hungarian" -msgstr "هەنگاری" - -msgid "Armenian" -msgstr "ئەرمەنی" - -msgid "Interlingua" -msgstr "ئینتەرلینگوایی" - -msgid "Indonesian" -msgstr "ئیندۆنیزی" - -msgid "Igbo" -msgstr "ئیگبۆیی" - -msgid "Ido" -msgstr "ئیدۆیی" - -msgid "Icelandic" -msgstr "ئایسلەندی" - -msgid "Italian" -msgstr "ئیتاڵی" - -msgid "Japanese" -msgstr "یابانی" - -msgid "Georgian" -msgstr "جۆرجی" - -msgid "Kabyle" -msgstr "کابایلی" - -msgid "Kazakh" -msgstr "کازاخی" - -msgid "Khmer" -msgstr "خەمیری" - -msgid "Kannada" -msgstr "کانێدایی" - -msgid "Korean" -msgstr "کۆری" - -msgid "Kyrgyz" -msgstr "کیرگزستانی" - -msgid "Luxembourgish" -msgstr "لۆکسەمبۆرگی" - -msgid "Lithuanian" -msgstr "لیتوانی" - -msgid "Latvian" -msgstr "لاتیڤی" - -msgid "Macedonian" -msgstr "مەسەدۆنی" - -msgid "Malayalam" -msgstr "مەلایالامی" - -msgid "Mongolian" -msgstr "مەنگۆلی" - -msgid "Marathi" -msgstr "ماراسی" - -msgid "Malay" -msgstr "مالایی" - -msgid "Burmese" -msgstr "بورمایی" - -msgid "Norwegian Bokmål" -msgstr "بۆکامۆلی نەرویجی" - -msgid "Nepali" -msgstr "نیپاڵی" - -msgid "Dutch" -msgstr "هۆڵەندی" - -msgid "Norwegian Nynorsk" -msgstr "نینۆرسکی نەرویجی" - -msgid "Ossetic" -msgstr "ئۆسیتی" - -msgid "Punjabi" -msgstr "پونجابی" - -msgid "Polish" -msgstr "پۆڵۆنی" - -msgid "Portuguese" -msgstr "پورتوگالی" - -msgid "Brazilian Portuguese" -msgstr "پورتوگالیی بەڕازیلی" - -msgid "Romanian" -msgstr "ڕۆمانیایی" - -msgid "Russian" -msgstr "ڕووسی" - -msgid "Slovak" -msgstr "سلۆڤاکی" - -msgid "Slovenian" -msgstr "سلۆڤینیایی" - -msgid "Albanian" -msgstr "ئەلبانی" - -msgid "Serbian" -msgstr "سڕبی" - -msgid "Serbian Latin" -msgstr "سڕبیی لاتین" - -msgid "Swedish" -msgstr "سویدی" - -msgid "Swahili" -msgstr "سواهیلی" - -msgid "Tamil" -msgstr "تامیلی" - -msgid "Telugu" -msgstr "تێلوگویی" - -msgid "Tajik" -msgstr "تاجیکی" - -msgid "Thai" -msgstr "تایلاندی" - -msgid "Turkmen" -msgstr "تورکمانی" - -msgid "Turkish" -msgstr "تورکی" - -msgid "Tatar" -msgstr "تاتاری" - -msgid "Udmurt" -msgstr "ئودمورتی" - -msgid "Uyghur" -msgstr "ئۆیغور" - -msgid "Ukrainian" -msgstr "ئۆکرانی" - -msgid "Urdu" -msgstr "ئوردویی" - -msgid "Uzbek" -msgstr "ئۆزبەکی" - -msgid "Vietnamese" -msgstr "ڤێتنامی" - -msgid "Simplified Chinese" -msgstr "چینی سادەکراو" - -msgid "Traditional Chinese" -msgstr "چینی کلاسیکی" - -msgid "Messages" -msgstr "پەیامەکان" - -msgid "Site Maps" -msgstr "نەخشەکانی پێگە" - -msgid "Static Files" -msgstr "فایلە نەگۆڕەکان" - -msgid "Syndication" -msgstr "هاوبەشکردن" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "ئەو ژمارەی پەڕەیە ژمارەی تەواو نییە" - -msgid "That page number is less than 1" -msgstr "ئەو ژمارەی پەڕەیە لە 1 کەمترە" - -msgid "That page contains no results" -msgstr "ئەو پەڕەیە هیچ ئەنجامێکی تێدا نییە" - -msgid "Enter a valid value." -msgstr "نرخێکی دروست لەناودابنێ." - -msgid "Enter a valid domain name." -msgstr "پاوەن/دۆمەینی دروست بنوسە." - -msgid "Enter a valid URL." -msgstr "URL ی دروست لەناودابنێ." - -msgid "Enter a valid integer." -msgstr "ژمارەیەکی تەواو لەناودابنێ" - -msgid "Enter a valid email address." -msgstr "ناونیشانێکی ئیمەیڵی دروست لەناودابنێ" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "\"سلەگ\"ێکی دروست بنوسە کە پێکهاتووە لە پیت، ژمارە، ژێرهێڵ یان هێڵ." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"\"سلەگ\"ێکی دروست بنوسە کە پێکهاتووە لە پیتی یونیکۆد، ژمارە، هێڵی ژێرەوە، " -"یان هێما." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "ناونیشانی %(protocol)s دروست بنوسە." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 یان IPv6" - -msgid "Enter only digits separated by commas." -msgstr "تەنها ژمارە لەناودابنێ بە فاریزە جیاکرابێتەوە." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "دڵنیاببە ئەم نرخە %(limit_value)sە (ئەوە %(show_value)sە). " - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "دڵنیاببە ئەم نرخە کەمترە یاخود یەکسانە بە %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "دڵنیاببە ئەم نرخە گەورەترە یاخود یەکسانە بە %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "دڵنیابە کە ئەم بەهایە چەندانێکە لە قەبارەی هەنگاوی%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"دڵنیابە ئەم بەهایە چەند هێندەیەکی قەبارەی هەنگاوەکانە %(limit_value)s, " -"دەستپێدەکات لە %(offset)s، بۆ نموونە %(offset)s، %(valid_value1)s، " -"%(valid_value2)s، هتد." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"دڵنیابە ئەم بەهایە لانیکەم %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." -msgstr[1] "" -"دڵنیابە ئەم بەهایە لانیکەم %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"دڵنیابە ئەم بەهایە لانی زۆر %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." -msgstr[1] "" -"دڵنیابە ئەم بەهایە لانی زۆر %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." - -msgid "Enter a number." -msgstr "ژمارەیەک بنوسە." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارە نیە." -msgstr[1] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارە نیە." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارەی دەیی نیە." -msgstr[1] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارەی دەیی نیە." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "دڵنیابە لەوەی زیاتر نیە لە %(max)s ژمارە پێش خاڵی ژمارەی دەیی." -msgstr[1] "دڵنیابە لەوەی زیاتر نیە لە %(max)s ژمارە پێش خاڵی ژمارەی دەیی." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"پەڕگەپاشبەندی “%(extension)s” ڕێگەپێنەدراوە. پاشبنەدە ڕێگەپێدراوەکان: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "نوسەی بەتاڵ ڕێگەپێنەدراوە." - -msgid "and" -msgstr "و" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s لەگەڵ %(field_labels)s پێشتر تۆمارکراوە." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "سنوردارکردنی “%(name)s” پێشێلکراوە." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "بەهای %(value)r هەڵبژاردەیەکی دروست نیە." - -msgid "This field cannot be null." -msgstr "ئەم خانەیە نابێت پووچ بێت." - -msgid "This field cannot be blank." -msgstr "ئەم خانەیە نابێت بەتاڵ بێت." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s لەگەڵ %(field_label)s پێشتر تۆمارکراوە." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s دەبێت بێهاوتا بێت بۆ %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "خانە لە جۆری: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "بەهای “%(value)s” دەبێت دروست یان چەوت بێت." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "بەهای “%(value)s” دەبێت یان دروست، یان چەوت یان هیچ بێت." - -msgid "Boolean (Either True or False)" -msgstr "بولی (یان دروست یان چەوت)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "ڕیزبەند (تا %(max_length)s)" - -msgid "String (unlimited)" -msgstr "ڕیز(بێسنوور)" - -msgid "Comma-separated integers" -msgstr "ژمارە تەواوەکان بە کۆما جیاکراونەتەوە" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"بەهای “%(value)s” شێوازی بەروارێکی نادروستی هەیە. دەبێت بەشێوازی YYYY-MM-DD " -"بێت." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"بەهای “%(value)s” شێوازێکی تەواوی هەیە (YYYY-MM-DD) بەڵام بەروارێکی هەڵەیە." - -msgid "Date (without time)" -msgstr "بەروار (بەبێ کات)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"بەهای “%(value)s” شێوازێکی نادروستی هەیە. دەبێت بەشێوەی YYYY-MM-DD HH:MM[:" -"ss[.uuuuuu]][TZ] بێت." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"بەهای “%(value)s” شێوازێکی دروستی هەیە (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"بەروار/کاتێکی نادروستە." - -msgid "Date (with time)" -msgstr "بەروار (لەگەڵ کات)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "بەهای “%(value)s” دەبێت ژمارەیەکی دەیی بێت." - -msgid "Decimal number" -msgstr "ژمارەی دەیی" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"بەهای “%(value)s” شێوازێکی هەڵەی هەیە. دەبێت بەشێوەی [DD] [[HH:]MM:]ss[." -"uuuuuu] format بێت." - -msgid "Duration" -msgstr "ماوە" - -msgid "Email address" -msgstr "ناونیشانی ئیمەیڵ" - -msgid "File path" -msgstr "ڕێڕەوی پەڕگە" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "بەهای “%(value)s” دەبێت ژمارەی کەرتی بێت." - -msgid "Floating point number" -msgstr "خاڵی ژمارەی کەرتی" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "بەهای “%(value)s” دەبێت ژمارەی تەواو بێت." - -msgid "Integer" -msgstr "ژمارەی تەواو" - -msgid "Big (8 byte) integer" -msgstr "(8بایت) ژمارەی تەواوی گەورە" - -msgid "Small integer" -msgstr "ژمارەی تەواوی بچوک" - -msgid "IPv4 address" -msgstr "ناونیشانی IPv4" - -msgid "IP address" -msgstr "ناونیشانی ئای پی" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "بەهای “%(value)s” دەبێت یان هیچ، یان دروست یان چەوت بێت." - -msgid "Boolean (Either True, False or None)" -msgstr "بولی (یان دروست یان چەوت یان هیچ)" - -msgid "Positive big integer" -msgstr "ژمارەی تەواوی گەورەی ئەرێنی" - -msgid "Positive integer" -msgstr "ژمارەی تەواوی ئەرێنی" - -msgid "Positive small integer" -msgstr "ژمارەی تەواوی بچوکی ئەرێنی" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "سلەگ (تا %(max_length)s)" - -msgid "Text" -msgstr "نوسین" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"بەهای “%(value)s” شێوازێکی هەڵەی هەیە. دەبێت بەشێوەی HH:MM[:ss[.uuuuuu]] بێت." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” بەهاکە شێوازێکی دروستی هەیە (HH:MM[:ss[.uuuuuu]]) بەڵام کاتێکی " -"نادروستە." - -msgid "Time" -msgstr "کات" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "داتای دووانەیی خاو" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s ” UUIDێکی دروستی نیە." - -msgid "Universally unique identifier" -msgstr "ناسێنەرێکی بێهاوتای گشتگیر" - -msgid "File" -msgstr "پەڕگە" - -msgid "Image" -msgstr "وێنە" - -msgid "A JSON object" -msgstr "ئۆبجێکتێکی JSON" - -msgid "Value must be valid JSON." -msgstr "بەها پێویستە JSONی دروست بێت." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s هاوشێوەیە لەگەڵ %(field)s %(value)r نیە." - -msgid "Foreign Key (type determined by related field)" -msgstr "کلیلی دەرەکی(جۆر بەپێی خانەی پەیوەندیدار دیاری دەکرێت)" - -msgid "One-to-one relationship" -msgstr "پەیوەندیی یەک-بۆ-یەک" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s پەیوەندی" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s پەیوەندییەکان" - -msgid "Many-to-many relationship" -msgstr "پەیوەندیی گشت-بۆ-گشت" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":؟.!" - -msgid "This field is required." -msgstr "ئەم خانەیە داواکراوە." - -msgid "Enter a whole number." -msgstr "ژمارەیەکی تەواو بنوسە." - -msgid "Enter a valid date." -msgstr "بەرواری دروست بنوسە." - -msgid "Enter a valid time." -msgstr "تکایە کاتێکی ڕاست بنووسە." - -msgid "Enter a valid date/time." -msgstr "بەروار/کاتی دروست بنوسە." - -msgid "Enter a valid duration." -msgstr "بەهای دروستی ماوە بنوسە." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "ژمارەی ڕۆژەکان دەبێت لەنێوان {min_days} و {max_days} بێت." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "هیچ پەڕگەیەک نەنێردراوە. جۆری کۆدکردنی پەڕگەکە لەسەر فۆرمەکە بپشکنە." - -msgid "No file was submitted." -msgstr "هیچ پەڕگەیەک نەنێردراوە." - -msgid "The submitted file is empty." -msgstr "پەڕگەی نێردراو بەتاڵە." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "دڵنیابە کە ناوی پەڕگە زیاتر لە %(max)d نوسەی نیە (%(length)d هەیە)." -msgstr[1] "دڵنیابە کە ناوی پەڕگە زیاتر لە %(max)d نوسەی نیە (%(length)d هەیە)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"تکایە یان پەڕگەیەک بنێرە یان چوارچێوەی پشکنین هەڵبژێرە، نەک هەردووکیان." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"وێنەی دروست هەڵبژێرە. ئەو پەڕگەی بەرزتکردۆوە یان وێنە نیە یان وێنەیەکی خراپ " -"بووە." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"هەڵبژاردەیەکی دروست دیاری بکە. %(value)s یەکێک نیە لە هەڵبژاردە بەردەستەکان." - -msgid "Enter a list of values." -msgstr "لیستی بەهاکان بنوسە." - -msgid "Enter a complete value." -msgstr "تەواوی بەهایەک بنوسە." - -msgid "Enter a valid UUID." -msgstr "بەهای دروستی UUID بنوسە." - -msgid "Enter a valid JSON." -msgstr "JSONی دروست بنوسە." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(خانەی شاراوە %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"داتاکانی فۆڕمی بەڕێوەبردن نەماوە یان دەستکاری کراون. خانە وونبووەکان: " -"%(field_names)s. لەوانەیە پێویستت بە تۆمارکردنی ڕاپۆرتی هەڵە بێت ئەگەر " -"کێشەکە بەردەوام بوو." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "تکایە لانی زۆر %(num)d فۆرم بنێرە." -msgstr[1] "تکایە لانی زۆر %(num)d فۆرم بنێرە." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "تکایە لانی کەم %(num)d فۆرم بنێرە." -msgstr[1] "تکایە لانی کەم %(num)d فۆرم بنێرە." - -msgid "Order" -msgstr "ڕیز" - -msgid "Delete" -msgstr "سڕینەوە" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "تکایە داتا دووبارەکراوەکان چاکبکەرەوە بۆ %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"تکایە ئەو داتا دووبارەکراوەکانە چاکبکەرەوە بۆ %(field)s، کە دەبێت بێهاوتابن." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"تکایە ئەو داتا دووبارەکراوەکان چاکبکەرەوە بۆ %(field_name)s کە دەبێت بێهاوتا " -"بن بۆ %(lookup)s لە%(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "تکایە بەها دووبارەکانی خوارەوە ڕاست بکەرەوە." - -msgid "The inline value did not match the parent instance." -msgstr "بەهای ناوهێڵ هاوشێوەی نمونەی باوانەکەی نیە." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "هەڵبژاردەی دروست دیاری بکە. هەڵبژاردە لە هەڵبژاردە بەردەستەکان نیە." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” بەهایەکی دروست نیە." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s نەتوانرا لە ناوچەی کاتدا لێکبدرێتەوە %(current_timezone)s؛ " -"لەوانەیە ناڕوون بێت یان لەوانەیە بوونی نەبێت." - -msgid "Clear" -msgstr "پاککردنەوە" - -msgid "Currently" -msgstr "ئێستا" - -msgid "Change" -msgstr "گۆڕین" - -msgid "Unknown" -msgstr "نەزانراو" - -msgid "Yes" -msgstr "بەڵێ" - -msgid "No" -msgstr "نەخێر" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "بەڵێ،نەخێر،لەوانەیە" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)dبایت" -msgstr[1] "%(size)d بایت" - -#, python-format -msgid "%s KB" -msgstr "%s کب" - -#, python-format -msgid "%s MB" -msgstr "%s مب" - -#, python-format -msgid "%s GB" -msgstr "%s گب" - -#, python-format -msgid "%s TB" -msgstr "%s تب" - -#, python-format -msgid "%s PB" -msgstr "%s پب" - -msgid "p.m." -msgstr "پ.ن" - -msgid "a.m." -msgstr "پ.ن" - -msgid "PM" -msgstr "د.ن" - -msgid "AM" -msgstr "پ.ن" - -msgid "midnight" -msgstr "نیوەشەو" - -msgid "noon" -msgstr "نیوەڕۆ" - -msgid "Monday" -msgstr "دووشەممە" - -msgid "Tuesday" -msgstr "سێشەممە" - -msgid "Wednesday" -msgstr "چوارشەممە" - -msgid "Thursday" -msgstr "پێنجشەممە" - -msgid "Friday" -msgstr "هەینی" - -msgid "Saturday" -msgstr "شەممە" - -msgid "Sunday" -msgstr "یەکشەممە" - -msgid "Mon" -msgstr "دوو" - -msgid "Tue" -msgstr "سێ" - -msgid "Wed" -msgstr "چوار" - -msgid "Thu" -msgstr "پێنج" - -msgid "Fri" -msgstr "هەین" - -msgid "Sat" -msgstr "شەم" - -msgid "Sun" -msgstr "یەک" - -msgid "January" -msgstr "ڕێبەندان" - -msgid "February" -msgstr "ڕەشەمە" - -msgid "March" -msgstr "نەورۆز" - -msgid "April" -msgstr "گوڵان" - -msgid "May" -msgstr "جۆزەردان" - -msgid "June" -msgstr "پوشپەڕ" - -msgid "July" -msgstr "گەلاوێژ" - -msgid "August" -msgstr "خەرمانان" - -msgid "September" -msgstr "ڕەزبەر" - -msgid "October" -msgstr "گەڵاڕێزان" - -msgid "November" -msgstr "سەرماوەرز" - -msgid "December" -msgstr "بەفرانبار" - -msgid "jan" -msgstr "‎ڕێبەندان" - -msgid "feb" -msgstr "ڕەشەمە" - -msgid "mar" -msgstr "نەورۆز" - -msgid "apr" -msgstr "گوڵان" - -msgid "may" -msgstr "‎جۆزەردان" - -msgid "jun" -msgstr "پوشپەڕ" - -msgid "jul" -msgstr "‎گەلاوێژ" - -msgid "aug" -msgstr "خەرمانان" - -msgid "sep" -msgstr "‎ڕەزبەر" - -msgid "oct" -msgstr "‎گەڵاڕێزان" - -msgid "nov" -msgstr "‎سەرماوەرز" - -msgid "dec" -msgstr "‎بەفرانبار" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "‎ڕێبەندان" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ڕەشەمە" - -msgctxt "abbrev. month" -msgid "March" -msgstr "نەورۆز" - -msgctxt "abbrev. month" -msgid "April" -msgstr "گوڵان" - -msgctxt "abbrev. month" -msgid "May" -msgstr "جۆزەردان" - -msgctxt "abbrev. month" -msgid "June" -msgstr "پوشپەڕ" - -msgctxt "abbrev. month" -msgid "July" -msgstr "گەلاوێژ" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "خەرمانان" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ڕەزبەر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "‎گەڵاڕێزان" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "‎سەرماوەرز" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "‎بەفرانبار" - -msgctxt "alt. month" -msgid "January" -msgstr "ڕێبەندان" - -msgctxt "alt. month" -msgid "February" -msgstr "ڕەشەمە" - -msgctxt "alt. month" -msgid "March" -msgstr "نەورۆز" - -msgctxt "alt. month" -msgid "April" -msgstr "گوڵان" - -msgctxt "alt. month" -msgid "May" -msgstr "جۆزەردان" - -msgctxt "alt. month" -msgid "June" -msgstr "پوشپەڕ" - -msgctxt "alt. month" -msgid "July" -msgstr "گەلاوێژ" - -msgctxt "alt. month" -msgid "August" -msgstr "خەرمانان" - -msgctxt "alt. month" -msgid "September" -msgstr "ڕەزبەر" - -msgctxt "alt. month" -msgid "October" -msgstr "گەڵاڕێزان" - -msgctxt "alt. month" -msgid "November" -msgstr "سەرماوەرز" - -msgctxt "alt. month" -msgid "December" -msgstr "بەفرانبار" - -msgid "This is not a valid IPv6 address." -msgstr "ئەمە ناونیشانی IPv6 دروست نیە." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." - -msgid "or" -msgstr "یان" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "، " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "‫%(num)d ساڵ" -msgstr[1] "‫%(num)d ساڵ" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "‫%(num)d مانگ" -msgstr[1] "‫%(num)d مانگ" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "‫%(num)d هەفتە" -msgstr[1] "‫%(num)d هەفتە" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "‫%(num)d ڕۆژ" -msgstr[1] "‫%(num)d ڕۆژ" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "‫%(num)d کاتژمێر" -msgstr[1] "‫%(num)d کاتژمێر" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "‫%(num)d خولەک" -msgstr[1] "‫%(num)d خولەک" - -msgid "Forbidden" -msgstr "ڕێپێنەدراو" - -msgid "CSRF verification failed. Request aborted." -msgstr "پشتڕاستکردنەوەی CSRF شکستی هێنا. داواکاری هەڵوەشاوەتەوە." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"تۆ ئەم پەیامە دەبینیت چونکە ئەم ماڵپەڕە HTTPS پێویستی بە \"سەردێڕی " -"ئاماژەدەر\" هەیە کە لەلایەن وێبگەڕەکەتەوە بنێردرێت، بەڵام هیچیان نەنێردراوە. " -"ئەم سەردێڕە بۆ هۆکاری ئاسایش پێویستە، بۆ دڵنیابوون لەوەی کە وێبگەڕەکەت " -"لەلایەن لایەنی سێیەمەوە دەستی بەسەردا ناگیرێت." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"ئەگەر ڕێکخستنی شەکرۆکەی ئەم وێبگەڕەت بۆ “Referer” ناچالاککردووە، تکایە " -"چالاکی بکەرەوە، لانیکەم بۆ ئەم ماڵپەڕە، یان بۆ پەیوەندییەکانی HTTPS، یاخود " -"بۆ داواکانی \"Same-origin\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"ئەگەر تۆ تاگی بەکاردەهێنێت " -"یان سەرپەڕەی “Referrer-Policy: no-referrer” لەخۆدەگرێت، تکایە بیانسڕەوە. " -"پاراستنی CSRFەکە پێویستی بە سەرپەڕەی “Referer”هەیە بۆ ئەنجامدانی پشکنینی " -"گەڕاندنەوەی توندوتۆڵ. ئەگەر خەمی تایبەتمەندیت هەیە، بەدیلەکانی وەکو بۆ بەستنەوەی ماڵپەڕەکانی لایەنی سێیەم." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"تۆ ئەم پەیامە دەبینیت چونکە ئەم ماڵپەڕە پێویستی بە شەکرۆکەی CSRF هەیە لە " -"کاتی ناردنی فۆڕمەکاندا. ئەم شەکرۆکەیە بۆ هۆکاری ئاسایش پێویستە، بۆ دڵنیابوون " -"لەوەی کە وێبگەڕەکەت لەلایەن لایەنی سێیەمەوە دەستی بەسەردا ناگیرێت." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"ئەگەر ڕێکخستنی شەکرۆکەی ئەم وێبگەڕەت ناچالاککردووە، تکایە چالاکی بکەرەوە، " -"لانیکەم بۆ ئەم ماڵپەڕە، یان بۆ داواکانی \"Same-origin\"" - -msgid "More information is available with DEBUG=True." -msgstr "زانیاریی زیاتر بەردەستە لەگەڵ DEBUG=True." - -msgid "No year specified" -msgstr "هیچ ساڵێک دیاری نەکراوە" - -msgid "Date out of range" -msgstr "بەروار لە دەرەوەی بواردایە" - -msgid "No month specified" -msgstr "هیچ مانگێک دیاری نەکراوە" - -msgid "No day specified" -msgstr "هیچ ڕۆژێک دیاری نەکراوە" - -msgid "No week specified" -msgstr "هیچ حەفتەیەک دیاری نەکراوە" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "هیچ %(verbose_name_plural)s بەردەست نییە" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"لەداهاتوودا %(verbose_name_plural)s بەردەست نیە چونکە %(class_name)s." -"allow_future چەوتە." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "ڕیزبەندی بەروار نادروستە “%(datestr)s” شێوازی “%(format)s” پێ بدە" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "هیچ %(verbose_name)s هاوتای داواکارییەکە نیە" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "لاپەڕە “کۆتا” نییە، هەروەها ناتوانرێت بگۆڕدرێت بۆ ژمارەی تەواو." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "لاپەڕەی نادروستە (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "لیستی بەتاڵ و “%(class_name)s.allow_empty” چەوتە." - -msgid "Directory indexes are not allowed here." -msgstr "لێرەدا نوانەی بوخچەکان ڕێگەپێدراو نیە." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” بوونی نیە" - -#, python-format -msgid "Index of %(directory)s" -msgstr "نوانەی %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "دامەزراندن بەسەرکەوتوویی کاریکرد! پیرۆزە!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"سەیری تێبینیەکانی بڵاوکردنەوە بکە بۆ جانگۆی " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"ئەم لاپەڕەیە دەبینیت چونکە DEBUG=True لەناو پەڕگەی ڕێکخستنەکانتە و بۆ هیچ URLێک " -"ڕێکنەخراوە." - -msgid "Django Documentation" -msgstr "بەڵگەنامەکردنی جانگۆ" - -msgid "Topics, references, & how-to’s" -msgstr "بابەتەکان, سەرچاوەکان, & چۆنێتی" - -msgid "Tutorial: A Polling App" -msgstr "فێرکاریی: ئاپێکی ڕاپرسی" - -msgid "Get started with Django" -msgstr "دەستپێبکە لەگەڵ جانگۆ" - -msgid "Django Community" -msgstr "کۆمەڵگەی جانگۆ" - -msgid "Connect, get help, or contribute" -msgstr "پەیوەندی بکە، یارمەتی وەربگرە، یان بەشداری بکە" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/formats.py deleted file mode 100644 index 162c840..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ckb/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j F Y، کاتژمێر G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y/n/j" -SHORT_DATETIME_FORMAT = "Y/n/j،‏ G:i" -FIRST_DAY_OF_WEEK = 6 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index 95086e3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index 14f5ef9..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,1388 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# Jan Papež , 2012,2024 -# Jiří Podhorecký , 2024 -# Jiří Podhorecký , 2022 -# Jirka Vejrazka , 2011 -# Jiří Podhorecký , 2020 -# Tomáš Ehrlich , 2015 -# Vláďa Macek , 2012-2014 -# Vláďa Macek , 2015-2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 06:49+0000\n" -"Last-Translator: Jan Papež , 2012,2024\n" -"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -msgid "Afrikaans" -msgstr "afrikánsky" - -msgid "Arabic" -msgstr "arabsky" - -msgid "Algerian Arabic" -msgstr "alžírskou arabštinou" - -msgid "Asturian" -msgstr "asturštinou" - -msgid "Azerbaijani" -msgstr "ázerbájdžánsky" - -msgid "Bulgarian" -msgstr "bulharsky" - -msgid "Belarusian" -msgstr "bělorusky" - -msgid "Bengali" -msgstr "bengálsky" - -msgid "Breton" -msgstr "bretonsky" - -msgid "Bosnian" -msgstr "bosensky" - -msgid "Catalan" -msgstr "katalánsky" - -msgid "Central Kurdish (Sorani)" -msgstr "Střední kurdština (soranština)" - -msgid "Czech" -msgstr "česky" - -msgid "Welsh" -msgstr "velšsky" - -msgid "Danish" -msgstr "dánsky" - -msgid "German" -msgstr "německy" - -msgid "Lower Sorbian" -msgstr "dolnolužickou srbštinou" - -msgid "Greek" -msgstr "řecky" - -msgid "English" -msgstr "anglicky" - -msgid "Australian English" -msgstr "australskou angličtinou" - -msgid "British English" -msgstr "britskou angličtinou" - -msgid "Esperanto" -msgstr "esperantsky" - -msgid "Spanish" -msgstr "španělsky" - -msgid "Argentinian Spanish" -msgstr "argentinskou španělštinou" - -msgid "Colombian Spanish" -msgstr "kolumbijskou španělštinou" - -msgid "Mexican Spanish" -msgstr "mexickou španělštinou" - -msgid "Nicaraguan Spanish" -msgstr "nikaragujskou španělštinou" - -msgid "Venezuelan Spanish" -msgstr "venezuelskou španělštinou" - -msgid "Estonian" -msgstr "estonsky" - -msgid "Basque" -msgstr "baskicky" - -msgid "Persian" -msgstr "persky" - -msgid "Finnish" -msgstr "finsky" - -msgid "French" -msgstr "francouzsky" - -msgid "Frisian" -msgstr "frísky" - -msgid "Irish" -msgstr "irsky" - -msgid "Scottish Gaelic" -msgstr "skotskou keltštinou" - -msgid "Galician" -msgstr "galicijsky" - -msgid "Hebrew" -msgstr "hebrejsky" - -msgid "Hindi" -msgstr "hindsky" - -msgid "Croatian" -msgstr "chorvatsky" - -msgid "Upper Sorbian" -msgstr "hornolužickou srbštinou" - -msgid "Hungarian" -msgstr "maďarsky" - -msgid "Armenian" -msgstr "arménštinou" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indonésky" - -msgid "Igbo" -msgstr "igboštinou" - -msgid "Ido" -msgstr "idem" - -msgid "Icelandic" -msgstr "islandsky" - -msgid "Italian" -msgstr "italsky" - -msgid "Japanese" -msgstr "japonsky" - -msgid "Georgian" -msgstr "gruzínštinou" - -msgid "Kabyle" -msgstr "kabylštinou" - -msgid "Kazakh" -msgstr "kazašsky" - -msgid "Khmer" -msgstr "khmersky" - -msgid "Kannada" -msgstr "kannadsky" - -msgid "Korean" -msgstr "korejsky" - -msgid "Kyrgyz" -msgstr "kyrgyzštinou" - -msgid "Luxembourgish" -msgstr "lucembursky" - -msgid "Lithuanian" -msgstr "litevsky" - -msgid "Latvian" -msgstr "lotyšsky" - -msgid "Macedonian" -msgstr "makedonsky" - -msgid "Malayalam" -msgstr "malajálamsky" - -msgid "Mongolian" -msgstr "mongolsky" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malajštinou" - -msgid "Burmese" -msgstr "barmštinou" - -msgid "Norwegian Bokmål" -msgstr "bokmål norštinou" - -msgid "Nepali" -msgstr "nepálsky" - -msgid "Dutch" -msgstr "nizozemsky" - -msgid "Norwegian Nynorsk" -msgstr "norsky (Nynorsk)" - -msgid "Ossetic" -msgstr "osetštinou" - -msgid "Punjabi" -msgstr "paňdžábsky" - -msgid "Polish" -msgstr "polsky" - -msgid "Portuguese" -msgstr "portugalsky" - -msgid "Brazilian Portuguese" -msgstr "brazilskou portugalštinou" - -msgid "Romanian" -msgstr "rumunsky" - -msgid "Russian" -msgstr "rusky" - -msgid "Slovak" -msgstr "slovensky" - -msgid "Slovenian" -msgstr "slovinsky" - -msgid "Albanian" -msgstr "albánsky" - -msgid "Serbian" -msgstr "srbsky" - -msgid "Serbian Latin" -msgstr "srbsky (latinkou)" - -msgid "Swedish" -msgstr "švédsky" - -msgid "Swahili" -msgstr "svahilsky" - -msgid "Tamil" -msgstr "tamilsky" - -msgid "Telugu" -msgstr "telužsky" - -msgid "Tajik" -msgstr "Tádžik" - -msgid "Thai" -msgstr "thajsky" - -msgid "Turkmen" -msgstr "turkmenštinou" - -msgid "Turkish" -msgstr "turecky" - -msgid "Tatar" -msgstr "tatarsky" - -msgid "Udmurt" -msgstr "udmurtsky" - -msgid "Uyghur" -msgstr "Ujgurština" - -msgid "Ukrainian" -msgstr "ukrajinsky" - -msgid "Urdu" -msgstr "urdsky" - -msgid "Uzbek" -msgstr "uzbecky" - -msgid "Vietnamese" -msgstr "vietnamsky" - -msgid "Simplified Chinese" -msgstr "čínsky (zjednodušeně)" - -msgid "Traditional Chinese" -msgstr "čínsky (tradičně)" - -msgid "Messages" -msgstr "Zprávy" - -msgid "Site Maps" -msgstr "Mapy webu" - -msgid "Static Files" -msgstr "Statické soubory" - -msgid "Syndication" -msgstr "Syndikace" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Číslo stránky není celé číslo." - -msgid "That page number is less than 1" -msgstr "Číslo stránky je menší než 1" - -msgid "That page contains no results" -msgstr "Stránka je bez výsledků" - -msgid "Enter a valid value." -msgstr "Zadejte platnou hodnotu." - -msgid "Enter a valid domain name." -msgstr "Zadejte platný název domény." - -msgid "Enter a valid URL." -msgstr "Zadejte platnou adresu URL." - -msgid "Enter a valid integer." -msgstr "Zadejte platné celé číslo." - -msgid "Enter a valid email address." -msgstr "Zadejte platnou e-mailovou adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Vložte platný identifikátor složený pouze z písmen, čísel, podtržítek a " -"pomlček." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Zadejte platný identifikátor složený pouze z písmen, čísel, podtržítek a " -"pomlček typu Unicode." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Zadejte platnou %(protocol)s adresu." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 nebo IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Zadejte pouze číslice oddělené čárkami." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Hodnota musí být %(limit_value)s (nyní je %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Hodnota musí být menší nebo rovna %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Hodnota musí být větší nebo rovna %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Ujistěte se, že tato hodnota je násobkem velikosti kroku %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Zajistěte, aby tato hodnota byla %(limit_value)s násobkem velikosti kroku , " -"počínaje %(offset)s, např. %(offset)s, %(valid_value1)s, %(valid_value2)s, a " -"tak dále." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Tato hodnota má mít nejméně %(limit_value)d znak (nyní má %(show_value)d)." -msgstr[1] "" -"Tato hodnota má mít nejméně %(limit_value)d znaky (nyní má %(show_value)d)." -msgstr[2] "" -"Tato hodnota má mít nejméně %(limit_value)d znaku (nyní má %(show_value)d)." -msgstr[3] "" -"Tato hodnota má mít nejméně %(limit_value)d znaků (nyní má %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Tato hodnota má mít nejvýše %(limit_value)d znak (nyní má %(show_value)d)." -msgstr[1] "" -"Tato hodnota má mít nejvýše %(limit_value)d znaky (nyní má %(show_value)d)." -msgstr[2] "" -"Tato hodnota má mít nejvýše %(limit_value)d znaků (nyní má %(show_value)d)." -msgstr[3] "" -"Tato hodnota má mít nejvýše %(limit_value)d znaků (nyní má %(show_value)d)." - -msgid "Enter a number." -msgstr "Zadejte číslo." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslici." -msgstr[1] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslice." -msgstr[2] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslic." -msgstr[3] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslic." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Ujistěte se, že pole neobsahuje více než %(max)s desetinné místo." -msgstr[1] "Ujistěte se, že pole neobsahuje více než %(max)s desetinná místa." -msgstr[2] "Ujistěte se, že pole neobsahuje více než %(max)s desetinných míst." -msgstr[3] "Ujistěte se, že pole neobsahuje více než %(max)s desetinných míst." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Ujistěte se, že hodnota neobsahuje více než %(max)s místo před desetinnou " -"čárkou (tečkou)." -msgstr[1] "" -"Ujistěte se, že hodnota neobsahuje více než %(max)s místa před desetinnou " -"čárkou (tečkou)." -msgstr[2] "" -"Ujistěte se, že hodnota neobsahuje více než %(max)s míst před desetinnou " -"čárkou (tečkou)." -msgstr[3] "" -"Ujistěte se, že hodnota neobsahuje více než %(max)s míst před desetinnou " -"čárkou (tečkou)." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Přípona souboru \"%(extension)s\" není povolena. Povolené jsou tyto: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Nulové znaky nejsou povoleny." - -msgid "and" -msgstr "a" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" -"Položka %(model_name)s s touto kombinací hodnot v polích %(field_labels)s " -"již existuje." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Omezení \"%(name)s\" je porušeno." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Hodnota %(value)r není platná možnost." - -msgid "This field cannot be null." -msgstr "Pole nemůže být null." - -msgid "This field cannot be blank." -msgstr "Pole nemůže být prázdné." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" -"Položka %(model_name)s s touto hodnotou v poli %(field_label)s již existuje." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Pole %(field_label)s musí být unikátní testem %(lookup_type)s pro pole " -"%(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Pole typu: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Hodnota \"%(value)s\" musí být buď True nebo False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Hodnota \"%(value)s\" musí být buď True, False nebo None." - -msgid "Boolean (Either True or False)" -msgstr "Pravdivost (buď Ano (True), nebo Ne (False))" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Řetězec (max. %(max_length)s znaků)" - -msgid "String (unlimited)" -msgstr "Řetězec (neomezený)" - -msgid "Comma-separated integers" -msgstr "Celá čísla oddělená čárkou" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "Hodnota \"%(value)s\" není platné datum. Musí být ve tvaru RRRR-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Ačkoli hodnota \"%(value)s\" je ve správném tvaru (RRRR-MM-DD), jde o " -"neplatné datum." - -msgid "Date (without time)" -msgstr "Datum (bez času)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Hodnota \"%(value)s\" je v neplatném tvaru, který má být RRRR-MM-DD HH:MM[:" -"SS[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Ačkoli hodnota \"%(value)s\" je ve správném tvaru (RRRR-MM-DD HH:MM[:SS[." -"uuuuuu]][TZ]), jde o neplatné datum a čas." - -msgid "Date (with time)" -msgstr "Datum (s časem)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Hodnota \"%(value)s\" musí být desítkové číslo." - -msgid "Decimal number" -msgstr "Desetinné číslo" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Hodnota \"%(value)s\" je v neplatném tvaru, který má být [DD] [HH:[MM:]]ss[." -"uuuuuu]." - -msgid "Duration" -msgstr "Doba trvání" - -msgid "Email address" -msgstr "E-mailová adresa" - -msgid "File path" -msgstr "Cesta k souboru" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Hodnota \"%(value)s\" musí být reálné číslo." - -msgid "Floating point number" -msgstr "Číslo s pohyblivou řádovou čárkou" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Hodnota \"%(value)s\" musí být celé číslo." - -msgid "Integer" -msgstr "Celé číslo" - -msgid "Big (8 byte) integer" -msgstr "Velké číslo (8 bajtů)" - -msgid "Small integer" -msgstr "Malé celé číslo" - -msgid "IPv4 address" -msgstr "Adresa IPv4" - -msgid "IP address" -msgstr "Adresa IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Hodnota \"%(value)s\" musí být buď None, True nebo False." - -msgid "Boolean (Either True, False or None)" -msgstr "Pravdivost (buď Ano (True), Ne (False) nebo Nic (None))" - -msgid "Positive big integer" -msgstr "Velké kladné celé číslo" - -msgid "Positive integer" -msgstr "Kladné celé číslo" - -msgid "Positive small integer" -msgstr "Kladné malé celé číslo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Identifikátor (nejvýše %(max_length)s znaků)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Hodnota \"%(value)s\" je v neplatném tvaru, který má být HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Ačkoli hodnota \"%(value)s\" je ve správném tvaru (HH:MM[:ss[.uuuuuu]]), jde " -"o neplatný čas." - -msgid "Time" -msgstr "Čas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Přímá binární data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" není platná hodnota typu UUID." - -msgid "Universally unique identifier" -msgstr "Všeobecně jedinečný identifikátor" - -msgid "File" -msgstr "Soubor" - -msgid "Image" -msgstr "Obrázek" - -msgid "A JSON object" -msgstr "Objekt typu JSON" - -msgid "Value must be valid JSON." -msgstr "Hodnota musí být platná struktura typu JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"Položka typu %(model)s s hodnotou %(field)s rovnou %(value)r neexistuje." - -msgid "Foreign Key (type determined by related field)" -msgstr "Cizí klíč (typ určen pomocí souvisejícího pole)" - -msgid "One-to-one relationship" -msgstr "Vazba jedna-jedna" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Vazba z %(from)s do %(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Vazby z %(from)s do %(to)s" - -msgid "Many-to-many relationship" -msgstr "Vazba mnoho-mnoho" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?!" - -msgid "This field is required." -msgstr "Toto pole je třeba vyplnit." - -msgid "Enter a whole number." -msgstr "Zadejte celé číslo." - -msgid "Enter a valid date." -msgstr "Zadejte platné datum." - -msgid "Enter a valid time." -msgstr "Zadejte platný čas." - -msgid "Enter a valid date/time." -msgstr "Zadejte platné datum a čas." - -msgid "Enter a valid duration." -msgstr "Zadejte platnou délku trvání." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Počet dní musí být mezi {min_days} a {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Soubor nebyl odeslán. Zkontrolujte parametr \"encoding type\" formuláře." - -msgid "No file was submitted." -msgstr "Žádný soubor nebyl odeslán." - -msgid "The submitted file is empty." -msgstr "Odeslaný soubor je prázdný." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Tento název souboru má mít nejvýše %(max)d znak (nyní má %(length)d)." -msgstr[1] "" -"Tento název souboru má mít nejvýše %(max)d znaky (nyní má %(length)d)." -msgstr[2] "" -"Tento název souboru má mít nejvýše %(max)d znaku (nyní má %(length)d)." -msgstr[3] "" -"Tento název souboru má mít nejvýše %(max)d znaků (nyní má %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Musíte vybrat cestu k souboru nebo vymazat výběr, ne obojí." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Nahrajte platný obrázek. Odeslaný soubor buď nebyl obrázek nebo byl poškozen." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Vyberte platnou možnost, \"%(value)s\" není k dispozici." - -msgid "Enter a list of values." -msgstr "Zadejte seznam hodnot." - -msgid "Enter a complete value." -msgstr "Zadejte úplnou hodnotu." - -msgid "Enter a valid UUID." -msgstr "Zadejte platné UUID." - -msgid "Enter a valid JSON." -msgstr "Zadejte platnou strukturu typu JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skryté pole %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Data objektu ManagementForm chybí nebo s nimi bylo nedovoleně manipulováno. " -"Chybějící pole: %(field_names)s. Pokud problém přetrvává, budete možná muset " -"problém ohlásit." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Odešlete prosím nejvíce %(num)d formulář." -msgstr[1] "Odešlete prosím nejvíce %(num)d formuláře." -msgstr[2] "Odešlete prosím nejvíce %(num)d formulářů." -msgstr[3] "Odešlete prosím nejvíce %(num)d formulářů." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Odešlete prosím alespoň %(num)d formulář." -msgstr[1] "Odešlete prosím alespoň %(num)d formuláře." -msgstr[2] "Odešlete prosím alespoň %(num)d formulářů." -msgstr[3] "Odešlete prosím alespoň %(num)d formulářů." - -msgid "Order" -msgstr "Pořadí" - -msgid "Delete" -msgstr "Odstranit" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Opravte duplicitní data v poli %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Opravte duplicitní data v poli %(field)s, které musí být unikátní." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Opravte duplicitní data v poli %(field_name)s, které musí být unikátní " -"testem %(lookup)s pole %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Odstraňte duplicitní hodnoty níže." - -msgid "The inline value did not match the parent instance." -msgstr "Hodnota typu inline neodpovídá rodičovské položce." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Vyberte platnou možnost. Tato není k dispozici." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" není platná hodnota." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Hodnotu %(datetime)s nelze interpretovat v časové zóně %(current_timezone)s; " -"může být nejednoznačná nebo nemusí existovat." - -msgid "Clear" -msgstr "Zrušit" - -msgid "Currently" -msgstr "Aktuálně" - -msgid "Change" -msgstr "Změnit" - -msgid "Unknown" -msgstr "Neznámé" - -msgid "Yes" -msgstr "Ano" - -msgid "No" -msgstr "Ne" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ano,ne,možná" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajty" -msgstr[2] "%(size)d bajtů" -msgstr[3] "%(size)d bajtů" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "odp." - -msgid "a.m." -msgstr "dop." - -msgid "PM" -msgstr "odp." - -msgid "AM" -msgstr "dop." - -msgid "midnight" -msgstr "půlnoc" - -msgid "noon" -msgstr "poledne" - -msgid "Monday" -msgstr "pondělí" - -msgid "Tuesday" -msgstr "úterý" - -msgid "Wednesday" -msgstr "středa" - -msgid "Thursday" -msgstr "čtvrtek" - -msgid "Friday" -msgstr "pátek" - -msgid "Saturday" -msgstr "sobota" - -msgid "Sunday" -msgstr "neděle" - -msgid "Mon" -msgstr "po" - -msgid "Tue" -msgstr "út" - -msgid "Wed" -msgstr "st" - -msgid "Thu" -msgstr "čt" - -msgid "Fri" -msgstr "pá" - -msgid "Sat" -msgstr "so" - -msgid "Sun" -msgstr "ne" - -msgid "January" -msgstr "leden" - -msgid "February" -msgstr "únor" - -msgid "March" -msgstr "březen" - -msgid "April" -msgstr "duben" - -msgid "May" -msgstr "květen" - -msgid "June" -msgstr "červen" - -msgid "July" -msgstr "červenec" - -msgid "August" -msgstr "srpen" - -msgid "September" -msgstr "září" - -msgid "October" -msgstr "říjen" - -msgid "November" -msgstr "listopad" - -msgid "December" -msgstr "prosinec" - -msgid "jan" -msgstr "led" - -msgid "feb" -msgstr "úno" - -msgid "mar" -msgstr "bře" - -msgid "apr" -msgstr "dub" - -msgid "may" -msgstr "kvě" - -msgid "jun" -msgstr "čen" - -msgid "jul" -msgstr "čec" - -msgid "aug" -msgstr "srp" - -msgid "sep" -msgstr "zář" - -msgid "oct" -msgstr "říj" - -msgid "nov" -msgstr "lis" - -msgid "dec" -msgstr "pro" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Led." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Úno." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Bře." - -msgctxt "abbrev. month" -msgid "April" -msgstr "Dub." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Kvě." - -msgctxt "abbrev. month" -msgid "June" -msgstr "Čer." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Čec." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Srp." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Zář." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Říj." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Lis." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Pro." - -msgctxt "alt. month" -msgid "January" -msgstr "ledna" - -msgctxt "alt. month" -msgid "February" -msgstr "února" - -msgctxt "alt. month" -msgid "March" -msgstr "března" - -msgctxt "alt. month" -msgid "April" -msgstr "dubna" - -msgctxt "alt. month" -msgid "May" -msgstr "května" - -msgctxt "alt. month" -msgid "June" -msgstr "června" - -msgctxt "alt. month" -msgid "July" -msgstr "července" - -msgctxt "alt. month" -msgid "August" -msgstr "srpna" - -msgctxt "alt. month" -msgid "September" -msgstr "září" - -msgctxt "alt. month" -msgid "October" -msgstr "října" - -msgctxt "alt. month" -msgid "November" -msgstr "listopadu" - -msgctxt "alt. month" -msgid "December" -msgstr "prosince" - -msgid "This is not a valid IPv6 address." -msgstr "Toto není platná adresa typu IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "nebo" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rok" -msgstr[1] "%(num)d roky" -msgstr[2] "%(num)d roku" -msgstr[3] "%(num)d let" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d měsíc" -msgstr[1] "%(num)d měsíce" -msgstr[2] "%(num)d měsíců" -msgstr[3] "%(num)d měsíců" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d týden" -msgstr[1] "%(num)d týdny" -msgstr[2] "%(num)d týdne" -msgstr[3] "%(num)d týdnů" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d den" -msgstr[1] "%(num)d dny" -msgstr[2] "%(num)d dní" -msgstr[3] "%(num)d dní" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodina" -msgstr[1] "%(num)d hodiny" -msgstr[2] "%(num)d hodiny" -msgstr[3] "%(num)d hodin" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuty" -msgstr[2] "%(num)d minut" -msgstr[3] "%(num)d minut" - -msgid "Forbidden" -msgstr "Nepřístupné (Forbidden)" - -msgid "CSRF verification failed. Request aborted." -msgstr "Selhalo ověření typu CSRF. Požadavek byl zadržen." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Tuto zprávu vidíte, protože tento web na protokolu HTTPS vyžaduje, aby váš " -"prohlížeč zaslal v požadavku záhlaví \"Referer\", k čemuž nedošlo. Záhlaví " -"je požadováno z bezpečnostních důvodů pro kontrolu toho, že prohlížeče se " -"nezmocnila třetí strana." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Pokud má váš prohlížeč záhlaví \"Referer\" vypnuté, žádáme vás o jeho " -"zapnutí, alespoň pro tento web nebo pro spojení typu HTTPS nebo pro " -"požadavky typu \"stejný původ\" (same origin)." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Pokud používáte značku nebo " -"záhlaví \"Referrer-Policy: no-referrer\", odeberte je. Ochrana typu CSRF " -"vyžaduje, aby záhlaví zajišťovalo striktní hlídání refereru. Pokud je pro " -"vás soukromí důležité, použijte k odkazům na cizí weby alternativní možnosti " -"jako například ." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Tato zpráva se zobrazuje, protože tento web při odesílání formulářů požaduje " -"v souboru cookie údaj CSRF, a to z bezpečnostních důvodů, aby se zajistilo, " -"že se vašeho prohlížeče nezmocnil někdo další." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Pokud má váš prohlížeč soubory cookie vypnuté, žádáme vás o jejich zapnutí, " -"alespoň pro tento web nebo pro požadavky typu \"stejný původ\" (same origin)." - -msgid "More information is available with DEBUG=True." -msgstr "V případě zapnutí volby DEBUG=True bude k dispozici více informací." - -msgid "No year specified" -msgstr "Nebyl specifikován rok" - -msgid "Date out of range" -msgstr "Datum je mimo rozsah" - -msgid "No month specified" -msgstr "Nebyl specifikován měsíc" - -msgid "No day specified" -msgstr "Nebyl specifikován den" - -msgid "No week specified" -msgstr "Nebyl specifikován týden" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s nejsou k dispozici" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s s budoucím datem nejsou k dipozici protoze " -"%(class_name)s.allow_future je False" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Datum \"%(datestr)s\" neodpovídá formátu \"%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nepodařilo se nalézt žádný objekt %(verbose_name)s" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Požadavek na stránku nemohl být konvertován na celé číslo, ani není \"last\"." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Neplatná stránka (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "List je prázdný a \"%(class_name)s.allow_empty\" je nastaveno na False" - -msgid "Directory indexes are not allowed here." -msgstr "Indexy adresářů zde nejsou povoleny." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "Cesta \"%(path)s\" neexistuje" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index adresáře %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalace proběhla úspěšně, gratulujeme!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Zobrazit poznámky k vydání frameworku Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Tuto zprávu vidíte, protože máte v nastavení Djanga zapnutý vývojový režim " -"DEBUG=True a zatím nemáte " -"nastavena žádná URL." - -msgid "Django Documentation" -msgstr "Dokumentace frameworku Django" - -msgid "Topics, references, & how-to’s" -msgstr "Témata, odkazy & how-to" - -msgid "Tutorial: A Polling App" -msgstr "Tutoriál: Hlasovací aplikace" - -msgid "Get started with Django" -msgstr "Začínáme s frameworkem Django" - -msgid "Django Community" -msgstr "Komunita kolem frameworku Django" - -msgid "Connect, get help, or contribute" -msgstr "Propojte se, získejte pomoc, podílejte se" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/cs/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/cs/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/cs/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/cs/formats.py deleted file mode 100644 index e4a7ab9..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/cs/formats.py +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. E Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j. E Y G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y G:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '05.01.2006' - "%d.%m.%y", # '05.01.06' - "%d. %m. %Y", # '5. 1. 2006' - "%d. %m. %y", # '5. 1. 06' - # "%d. %B %Y", # '25. October 2006' - # "%d. %b. %Y", # '25. Oct. 2006' -] -# Kept ISO formats as one is in first position -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '04:30:59' - "%H.%M", # '04.30' - "%H:%M", # '04:30' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '05.01.2006 04:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '05.01.2006 04:30:59.000200' - "%d.%m.%Y %H.%M", # '05.01.2006 04.30' - "%d.%m.%Y %H:%M", # '05.01.2006 04:30' - "%d. %m. %Y %H:%M:%S", # '05. 01. 2006 04:30:59' - "%d. %m. %Y %H:%M:%S.%f", # '05. 01. 2006 04:30:59.000200' - "%d. %m. %Y %H.%M", # '05. 01. 2006 04.30' - "%d. %m. %Y %H:%M", # '05. 01. 2006 04:30' - "%Y-%m-%d %H.%M", # '2006-01-05 04.30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index ea5b45c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index 16383ce..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,1278 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2012,2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -msgid "Afrikaans" -msgstr "Affricaneg" - -msgid "Arabic" -msgstr "Arabeg" - -msgid "Asturian" -msgstr "Astwrieg" - -msgid "Azerbaijani" -msgstr "Azerbaijanaidd" - -msgid "Bulgarian" -msgstr "Bwlgareg" - -msgid "Belarusian" -msgstr "Belarwseg" - -msgid "Bengali" -msgstr "Bengaleg" - -msgid "Breton" -msgstr "Llydaweg" - -msgid "Bosnian" -msgstr "Bosnieg" - -msgid "Catalan" -msgstr "Catalaneg" - -msgid "Czech" -msgstr "Tsieceg" - -msgid "Welsh" -msgstr "Cymraeg" - -msgid "Danish" -msgstr "Daneg" - -msgid "German" -msgstr "Almaeneg" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Groegedd" - -msgid "English" -msgstr "Saesneg" - -msgid "Australian English" -msgstr "Saesneg Awstralia" - -msgid "British English" -msgstr "Saesneg Prydain" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Sbaeneg" - -msgid "Argentinian Spanish" -msgstr "Sbaeneg Ariannin" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Sbaeneg Mecsico" - -msgid "Nicaraguan Spanish" -msgstr "Sbaeneg Nicaragwa" - -msgid "Venezuelan Spanish" -msgstr "Sbaeneg Feneswela" - -msgid "Estonian" -msgstr "Estoneg" - -msgid "Basque" -msgstr "Basgeg" - -msgid "Persian" -msgstr "Persieg" - -msgid "Finnish" -msgstr "Ffinneg" - -msgid "French" -msgstr "Ffrangeg" - -msgid "Frisian" -msgstr "Ffrisieg" - -msgid "Irish" -msgstr "Gwyddeleg" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Galisieg" - -msgid "Hebrew" -msgstr "Hebraeg" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croasieg" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Hwngareg" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indoneseg" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandeg" - -msgid "Italian" -msgstr "Eidaleg" - -msgid "Japanese" -msgstr "Siapanëeg" - -msgid "Georgian" -msgstr "Georgeg" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Casacstanaidd" - -msgid "Khmer" -msgstr "Chmereg" - -msgid "Kannada" -msgstr "Canadeg" - -msgid "Korean" -msgstr "Corëeg" - -msgid "Luxembourgish" -msgstr "Lwcsembergeg" - -msgid "Lithuanian" -msgstr "Lithwaneg" - -msgid "Latvian" -msgstr "Latfieg" - -msgid "Macedonian" -msgstr "Macedoneg" - -msgid "Malayalam" -msgstr "Malaialam" - -msgid "Mongolian" -msgstr "Mongoleg" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Burmese" -msgstr "Byrmaneg" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nepaleg" - -msgid "Dutch" -msgstr "Iseldireg" - -msgid "Norwegian Nynorsk" -msgstr "Ninorsk Norwyeg" - -msgid "Ossetic" -msgstr "Osetieg" - -msgid "Punjabi" -msgstr "Pwnjabi" - -msgid "Polish" -msgstr "Pwyleg" - -msgid "Portuguese" -msgstr "Portiwgaleg" - -msgid "Brazilian Portuguese" -msgstr "Portiwgaleg Brasil" - -msgid "Romanian" -msgstr "Romaneg" - -msgid "Russian" -msgstr "Rwsieg" - -msgid "Slovak" -msgstr "Slofaceg" - -msgid "Slovenian" -msgstr "Slofeneg" - -msgid "Albanian" -msgstr "Albaneg" - -msgid "Serbian" -msgstr "Serbeg" - -msgid "Serbian Latin" -msgstr "Lladin Serbiaidd" - -msgid "Swedish" -msgstr "Swedeg" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telwgw" - -msgid "Thai" -msgstr "Tai" - -msgid "Turkish" -msgstr "Twrceg" - -msgid "Tatar" -msgstr "Tatareg" - -msgid "Udmurt" -msgstr "Wdmwrteg" - -msgid "Ukrainian" -msgstr "Wcreineg" - -msgid "Urdu" -msgstr "Wrdw" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Fietnameg" - -msgid "Simplified Chinese" -msgstr "Tsieinëeg Syml" - -msgid "Traditional Chinese" -msgstr "Tseinëeg Traddodiadol" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "Mapiau Safle" - -msgid "Static Files" -msgstr "Ffeiliau Statig" - -msgid "Syndication" -msgstr "Syndicetiad" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Rhowch werth dilys." - -msgid "Enter a valid URL." -msgstr "Rhowch URL dilys." - -msgid "Enter a valid integer." -msgstr "Rhowch gyfanrif dilys." - -msgid "Enter a valid email address." -msgstr "Rhowch gyfeiriad ebost dilys." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Rhowch gyfeiriad IPv4 dilys." - -msgid "Enter a valid IPv6 address." -msgstr "Rhowch gyfeiriad IPv6 dilys." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Rhowch gyfeiriad IPv4 neu IPv6 dilys." - -msgid "Enter only digits separated by commas." -msgstr "Rhowch ddigidau wedi'i gwahanu gan gomas yn unig." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Sicrhewch taw y gwerth yw %(limit_value)s (%(show_value)s yw ar hyn o bryd)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Sicrhewch fod y gwerth hwn yn fwy neu'n llai na %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Sicrhewch fod y gwerth yn fwy na neu'n gyfartal â %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[1] "" -"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[2] "" -"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[3] "" -"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[1] "" -"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[2] "" -"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[3] "" -"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Rhowch rif." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Sicrhewch nad oes mwy nag %(max)s digid i gyd." -msgstr[1] "Sicrhewch nad oes mwy na %(max)s ddigid i gyd." -msgstr[2] "Sicrhewch nad oes mwy na %(max)s digid i gyd." -msgstr[3] "Sicrhewch nad oes mwy na %(max)s digid i gyd." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Sicrhewch nad oes mwy nag %(max)s lle degol." -msgstr[1] "Sicrhewch nad oes mwy na %(max)s le degol." -msgstr[2] "Sicrhewch nad oes mwy na %(max)s lle degol." -msgstr[3] "Sicrhewch nad oes mwy na %(max)s lle degol." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Sicrhewch nad oes mwy nag %(max)s digid cyn y pwynt degol." -msgstr[1] "Sicrhewch nad oes mwy na %(max)s ddigid cyn y pwynt degol." -msgstr[2] "Sicrhewch nad oes mwy na %(max)s digid cyn y pwynt degol." -msgstr[3] "Sicrhewch nad oes mwy na %(max)s digid cyn y pwynt degol." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "a" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Mae %(model_name)s gyda'r %(field_labels)s hyn yn bodoli'n barod." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Nid yw gwerth %(value)r yn ddewis dilys." - -msgid "This field cannot be null." -msgstr "Ni all y maes hwn fod yn 'null'." - -msgid "This field cannot be blank." -msgstr "Ni all y maes hwn fod yn wag." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Mae %(model_name)s gyda'r %(field_label)s hwn yn bodoli'n barod." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Maes o fath: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boleaidd (Unai True neu False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (hyd at %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Cyfanrifau wedi'u gwahanu gan gomas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Dyddiad (heb amser)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Dyddiad (gydag amser)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Rhif degol" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Cyfeiriad ebost" - -msgid "File path" -msgstr "Llwybr ffeil" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Rhif pwynt symudol" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "cyfanrif" - -msgid "Big (8 byte) integer" -msgstr "Cyfanrif mawr (8 beit)" - -msgid "IPv4 address" -msgstr "Cyfeiriad IPv4" - -msgid "IP address" -msgstr "cyfeiriad IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boleaidd (Naill ai True, False neu None)" - -msgid "Positive integer" -msgstr "Cyfanrif positif" - -msgid "Positive small integer" -msgstr "Cyfanrif bach positif" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Malwen (hyd at %(max_length)s)" - -msgid "Small integer" -msgstr "Cyfanrif bach" - -msgid "Text" -msgstr "Testun" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Amser" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Data deuol crai" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Ffeil" - -msgid "Image" -msgstr "Delwedd" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Allwedd Estron (math yn ddibynol ar y maes cysylltiedig)" - -msgid "One-to-one relationship" -msgstr "Perthynas un-i-un" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Perthynas llawer-i-lawer" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Mae angen y maes hwn." - -msgid "Enter a whole number." -msgstr "Rhowch cyfanrif." - -msgid "Enter a valid date." -msgstr "Rhif ddyddiad dilys." - -msgid "Enter a valid time." -msgstr "Rhowch amser dilys." - -msgid "Enter a valid date/time." -msgstr "Rhowch ddyddiad/amser dilys." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ni anfonwyd ffeil. Gwiriwch math yr amgodiad ar y ffurflen." - -msgid "No file was submitted." -msgstr "Ni anfonwyd ffeil." - -msgid "The submitted file is empty." -msgstr "Mae'r ffeil yn wag." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)." -msgstr[1] "" -"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)." -msgstr[2] "" -"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)." -msgstr[3] "" -"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Nail ai cyflwynwych ffeil neu dewisiwch y blwch gwiriad, ond nid y ddau." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Llwythwch ddelwedd dilys. Doedd y ddelwedd a lwythwyd ddim yn ddelwedd " -"dilys, neu roedd yn ddelwedd llygredig." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Dewiswch ddewisiad dilys. Nid yw %(value)s yn un o'r dewisiadau sydd ar gael." - -msgid "Enter a list of values." -msgstr "Rhowch restr o werthoedd." - -msgid "Enter a complete value." -msgstr "Rhowch werth cyflawn." - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Maes cudd %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Mae data ManagementForm ar goll neu mae rhywun wedi ymyrryd ynddo" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Cyflwynwch %d neu lai o ffurflenni." -msgstr[1] "Cyflwynwch %d neu lai o ffurflenni." -msgstr[2] "Cyflwynwch %d neu lai o ffurflenni." -msgstr[3] "Cyflwynwch %d neu lai o ffurflenni." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Cyflwynwch %d neu fwy o ffurflenni." -msgstr[1] "Cyflwynwch %d neu fwy o ffurflenni." -msgstr[2] "Cyflwynwch %d neu fwy o ffurflenni." -msgstr[3] "Cyflwynwch %d neu fwy o ffurflenni." - -msgid "Order" -msgstr "Trefn" - -msgid "Delete" -msgstr "Dileu" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Cywirwch y data dyblyg ar gyfer %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Cywirwch y data dyblyg ar gyfer %(field)s, sydd yn gorfod bod yn unigryw." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Cywirwch y data dyblyg ar gyfer %(field_name)s sydd yn gorfod bod yn unigryw " -"ar gyfer %(lookup)s yn %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Cywirwch y gwerthoedd dyblyg isod." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Dewiswch ddewisiad dilys. Nid yw'r dewisiad yn un o'r dewisiadau sydd ar " -"gael." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Clirio" - -msgid "Currently" -msgstr "Ar hyn o bryd" - -msgid "Change" -msgstr "Newid" - -msgid "Unknown" -msgstr "Anhysbys" - -msgid "Yes" -msgstr "Ie" - -msgid "No" -msgstr "Na" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ie,na,efallai" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d beit" -msgstr[1] "%(size)d beit" -msgstr[2] "%(size)d beit" -msgstr[3] "%(size)d beit" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "y.h." - -msgid "a.m." -msgstr "y.b." - -msgid "PM" -msgstr "YH" - -msgid "AM" -msgstr "YB" - -msgid "midnight" -msgstr "canol nos" - -msgid "noon" -msgstr "canol dydd" - -msgid "Monday" -msgstr "Dydd Llun" - -msgid "Tuesday" -msgstr "Dydd Mawrth" - -msgid "Wednesday" -msgstr "Dydd Mercher" - -msgid "Thursday" -msgstr "Dydd Iau" - -msgid "Friday" -msgstr "Dydd Gwener" - -msgid "Saturday" -msgstr "Dydd Sadwrn" - -msgid "Sunday" -msgstr "Dydd Sul" - -msgid "Mon" -msgstr "Llu" - -msgid "Tue" -msgstr "Maw" - -msgid "Wed" -msgstr "Mer" - -msgid "Thu" -msgstr "Iau" - -msgid "Fri" -msgstr "Gwe" - -msgid "Sat" -msgstr "Sad" - -msgid "Sun" -msgstr "Sul" - -msgid "January" -msgstr "Ionawr" - -msgid "February" -msgstr "Chwefror" - -msgid "March" -msgstr "Mawrth" - -msgid "April" -msgstr "Ebrill" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Mehefin" - -msgid "July" -msgstr "Gorffenaf" - -msgid "August" -msgstr "Awst" - -msgid "September" -msgstr "Medi" - -msgid "October" -msgstr "Hydref" - -msgid "November" -msgstr "Tachwedd" - -msgid "December" -msgstr "Rhagfyr" - -msgid "jan" -msgstr "ion" - -msgid "feb" -msgstr "chw" - -msgid "mar" -msgstr "maw" - -msgid "apr" -msgstr "ebr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "meh" - -msgid "jul" -msgstr "gor" - -msgid "aug" -msgstr "aws" - -msgid "sep" -msgstr "med" - -msgid "oct" -msgstr "hyd" - -msgid "nov" -msgstr "tach" - -msgid "dec" -msgstr "rhag" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ion." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Chwe." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mawrth" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Ebrill" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Meh." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Gorff." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Awst" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Medi" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Hydr." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Tach." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Rhag." - -msgctxt "alt. month" -msgid "January" -msgstr "Ionawr" - -msgctxt "alt. month" -msgid "February" -msgstr "Chwefror" - -msgctxt "alt. month" -msgid "March" -msgstr "Mawrth" - -msgctxt "alt. month" -msgid "April" -msgstr "Ebrill" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Mehefin" - -msgctxt "alt. month" -msgid "July" -msgstr "Gorffenaf" - -msgctxt "alt. month" -msgid "August" -msgstr "Awst" - -msgctxt "alt. month" -msgid "September" -msgstr "Medi" - -msgctxt "alt. month" -msgid "October" -msgstr "Hydref" - -msgctxt "alt. month" -msgid "November" -msgstr "Tachwedd" - -msgctxt "alt. month" -msgid "December" -msgstr "Rhagfyr" - -msgid "This is not a valid IPv6 address." -msgstr "Nid yw hwn yn gyfeiriad IPv6 dilys." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "neu" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d blwyddyn" -msgstr[1] "%d flynedd" -msgstr[2] "%d blwyddyn" -msgstr[3] "%d blwyddyn" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mis" -msgstr[1] "%d fis" -msgstr[2] "%d mis" -msgstr[3] "%d mis" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d wythnos" -msgstr[1] "%d wythnos" -msgstr[2] "%d wythnos" -msgstr[3] "%d wythnos" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d diwrnod" -msgstr[1] "%d ddiwrnod" -msgstr[2] "%d diwrnod" -msgstr[3] "%d diwrnod" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d awr" -msgstr[1] "%d awr" -msgstr[2] "%d awr" -msgstr[3] "%d awr" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d munud" -msgstr[1] "%d funud" -msgstr[2] "%d munud" -msgstr[3] "%d munud" - -msgid "0 minutes" -msgstr "0 munud" - -msgid "Forbidden" -msgstr "Gwaharddedig" - -msgid "CSRF verification failed. Request aborted." -msgstr "Gwirio CSRF wedi methu. Ataliwyd y cais." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Dangosir y neges hwn oherwydd bod angen cwci CSRF ar y safle hwn pan yn " -"anfon ffurflenni. Mae angen y cwci ar gyfer diogelwch er mwyn sicrhau nad " -"oes trydydd parti yn herwgipio eich porwr." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Mae mwy o wybodaeth ar gael gyda DEBUG=True" - -msgid "No year specified" -msgstr "Dim blwyddyn wedi’i bennu" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Dim mis wedi’i bennu" - -msgid "No day specified" -msgstr "Dim diwrnod wedi’i bennu" - -msgid "No week specified" -msgstr "Dim wythnos wedi’i bennu" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Dim %(verbose_name_plural)s ar gael" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s i'r dyfodol ddim ar gael oherwydd mae %(class_name)s." -"allow_future yn 'False'. " - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Ni ganfuwyd %(verbose_name)s yn cydweddu â'r ymholiad" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Tudalen annilys (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Ni ganiateir mynegai cyfeiriaduron yma." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Mynegai %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/cy/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/cy/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/cy/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/cy/formats.py deleted file mode 100644 index eaef6a6..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/cy/formats.py +++ /dev/null @@ -1,33 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" # '25 Hydref 2006' -TIME_FORMAT = "P" # '2:30 y.b.' -DATETIME_FORMAT = "j F Y, P" # '25 Hydref 2006, 2:30 y.b.' -YEAR_MONTH_FORMAT = "F Y" # 'Hydref 2006' -MONTH_DAY_FORMAT = "j F" # '25 Hydref' -SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' -SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 y.b.' -FIRST_DAY_OF_WEEK = 1 # 'Dydd Llun' - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index 4037a05..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/da/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index 8cfa10f..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,1341 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Christian Joergensen , 2012 -# Danni Randeris , 2014 -# Erik Ramsgaard Wognsen , 2020-2025 -# Erik Ramsgaard Wognsen , 2013-2019 -# Finn Gruwier Larsen, 2011 -# Jannis Leidel , 2011 -# jonaskoelker , 2012 -# Mads Chr. Olesen , 2013 -# valberg , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Erik Ramsgaard Wognsen , 2020-2025\n" -"Language-Team: Danish (http://app.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikaans" - -msgid "Arabic" -msgstr "arabisk" - -msgid "Algerian Arabic" -msgstr "algerisk arabisk" - -msgid "Asturian" -msgstr "Asturisk" - -msgid "Azerbaijani" -msgstr "azerbaidjansk" - -msgid "Bulgarian" -msgstr "bulgarsk" - -msgid "Belarusian" -msgstr "hviderussisk" - -msgid "Bengali" -msgstr "bengalsk" - -msgid "Breton" -msgstr "bretonsk" - -msgid "Bosnian" -msgstr "bosnisk" - -msgid "Catalan" -msgstr "catalansk" - -msgid "Central Kurdish (Sorani)" -msgstr "Centralkurdisk (Sorani)" - -msgid "Czech" -msgstr "tjekkisk" - -msgid "Welsh" -msgstr "walisisk" - -msgid "Danish" -msgstr "dansk" - -msgid "German" -msgstr "tysk" - -msgid "Lower Sorbian" -msgstr "nedresorbisk" - -msgid "Greek" -msgstr "græsk" - -msgid "English" -msgstr "engelsk" - -msgid "Australian English" -msgstr "australsk engelsk" - -msgid "British English" -msgstr "britisk engelsk" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "spansk" - -msgid "Argentinian Spanish" -msgstr "argentinsk spansk" - -msgid "Colombian Spanish" -msgstr "colombiansk spansk" - -msgid "Mexican Spanish" -msgstr "mexikansk spansk" - -msgid "Nicaraguan Spanish" -msgstr "nicaraguansk spansk" - -msgid "Venezuelan Spanish" -msgstr "venezuelansk spansk" - -msgid "Estonian" -msgstr "estisk" - -msgid "Basque" -msgstr "baskisk" - -msgid "Persian" -msgstr "persisk" - -msgid "Finnish" -msgstr "finsk" - -msgid "French" -msgstr "fransk" - -msgid "Frisian" -msgstr "frisisk" - -msgid "Irish" -msgstr "irsk" - -msgid "Scottish Gaelic" -msgstr "skotsk gælisk" - -msgid "Galician" -msgstr "galicisk" - -msgid "Hebrew" -msgstr "hebraisk" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "kroatisk" - -msgid "Upper Sorbian" -msgstr "øvresorbisk" - -msgid "Hungarian" -msgstr "ungarsk" - -msgid "Armenian" -msgstr "armensk" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indonesisk" - -msgid "Igbo" -msgstr "igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "islandsk" - -msgid "Italian" -msgstr "italiensk" - -msgid "Japanese" -msgstr "japansk" - -msgid "Georgian" -msgstr "georgisk" - -msgid "Kabyle" -msgstr "kabylsk" - -msgid "Kazakh" -msgstr "kasakhisk" - -msgid "Khmer" -msgstr "khmer" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "koreansk" - -msgid "Kyrgyz" -msgstr "kirgisisk" - -msgid "Luxembourgish" -msgstr "luxembourgisk" - -msgid "Lithuanian" -msgstr "litauisk" - -msgid "Latvian" -msgstr "lettisk" - -msgid "Macedonian" -msgstr "makedonsk" - -msgid "Malayalam" -msgstr "malayalam" - -msgid "Mongolian" -msgstr "mongolsk" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malajisk" - -msgid "Burmese" -msgstr "burmesisk" - -msgid "Norwegian Bokmål" -msgstr "norsk bokmål" - -msgid "Nepali" -msgstr "nepalesisk" - -msgid "Dutch" -msgstr "hollandsk" - -msgid "Norwegian Nynorsk" -msgstr "norsk nynorsk" - -msgid "Ossetic" -msgstr "ossetisk" - -msgid "Punjabi" -msgstr "punjabi" - -msgid "Polish" -msgstr "polsk" - -msgid "Portuguese" -msgstr "portugisisk" - -msgid "Brazilian Portuguese" -msgstr "brasiliansk portugisisk" - -msgid "Romanian" -msgstr "rumænsk" - -msgid "Russian" -msgstr "russisk" - -msgid "Slovak" -msgstr "slovakisk" - -msgid "Slovenian" -msgstr "slovensk" - -msgid "Albanian" -msgstr "albansk" - -msgid "Serbian" -msgstr "serbisk" - -msgid "Serbian Latin" -msgstr "serbisk (latin)" - -msgid "Swedish" -msgstr "svensk" - -msgid "Swahili" -msgstr "swahili" - -msgid "Tamil" -msgstr "tamil" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadsjikisk" - -msgid "Thai" -msgstr "thai" - -msgid "Turkmen" -msgstr "turkmensk" - -msgid "Turkish" -msgstr "tyrkisk" - -msgid "Tatar" -msgstr "tatarisk" - -msgid "Udmurt" -msgstr "udmurtisk" - -msgid "Uyghur" -msgstr "uygurisk" - -msgid "Ukrainian" -msgstr "ukrainsk" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "usbekisk" - -msgid "Vietnamese" -msgstr "vietnamesisk" - -msgid "Simplified Chinese" -msgstr "forenklet kinesisk" - -msgid "Traditional Chinese" -msgstr "traditionelt kinesisk" - -msgid "Messages" -msgstr "Meddelelser" - -msgid "Site Maps" -msgstr "Site Maps" - -msgid "Static Files" -msgstr "Static Files" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Det sidetal er ikke et heltal" - -msgid "That page number is less than 1" -msgstr "Det sidetal er mindre end 1" - -msgid "That page contains no results" -msgstr "Den side indeholder ingen resultater" - -msgid "Enter a valid value." -msgstr "Indtast en gyldig værdi." - -msgid "Enter a valid domain name." -msgstr "Indtast et gyldigt domænenavn." - -msgid "Enter a valid URL." -msgstr "Indtast en gyldig URL." - -msgid "Enter a valid integer." -msgstr "Indtast et gyldigt heltal." - -msgid "Enter a valid email address." -msgstr "Indtast en gyldig e-mail-adresse." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Indtast en gyldig “slug” bestående af bogstaver, cifre, understreger eller " -"bindestreger." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Indtast en gyldig “slug” bestående af Unicode-bogstaver, cifre, understreger " -"eller bindestreger." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Indtast en gyldig %(protocol)s-adresse." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 eller IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Indtast kun cifre adskilt af kommaer." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Denne værdi skal være %(limit_value)s (den er %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Denne værdi skal være mindre end eller lig %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Denne værdi skal være større end eller lig %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Denne værdi skal være et multiplum af trinstørrelse %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Denne værdi skal være et multiplum af trinstørrelse %(limit_value)s, " -"startende fra %(offset)s, fx %(offset)s, %(valid_value1)s, %(valid_value2)s, " -"osv." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Denne værdi skal have mindst %(limit_value)d tegn (den har %(show_value)d)." -msgstr[1] "" -"Denne værdi skal have mindst %(limit_value)d tegn (den har %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Denne værdi må højst have %(limit_value)d tegn (den har %(show_value)d)." -msgstr[1] "" -"Denne værdi må højst have %(limit_value)d tegn (den har %(show_value)d)." - -msgid "Enter a number." -msgstr "Indtast et tal." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Der må maksimalt være %(max)s ciffer i alt." -msgstr[1] "Der må maksimalt være %(max)s cifre i alt." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Der må maksimalt være %(max)s decimal." -msgstr[1] "Der må maksimalt være %(max)s decimaler." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Der må maksimalt være %(max)s ciffer før kommaet." -msgstr[1] "Der må maksimalt være %(max)s cifre før kommaet." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Filendelse “%(extension)s” er ikke tilladt. Tilladte filendelser er: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null-tegn er ikke tilladte." - -msgid "and" -msgstr "og" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s med dette %(field_labels)s eksisterer allerede." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Begrænsning “%(name)s” er overtrådt." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Værdien %(value)r er ikke et gyldigt valg." - -msgid "This field cannot be null." -msgstr "Dette felt kan ikke være null." - -msgid "This field cannot be blank." -msgstr "Dette felt kan ikke være tomt." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s med dette %(field_label)s eksisterer allerede." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s skal være unik for %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Felt af type: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s”-værdien skal være enten True eller False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s”-værdien skal være enten True, False eller None." - -msgid "Boolean (Either True or False)" -msgstr "Boolsk (enten True eller False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Streng (op til %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Streng (ubegrænset)" - -msgid "Comma-separated integers" -msgstr "Kommaseparerede heltal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s”-værdien har et ugyldigt datoformat. Den skal være i formatet " -"ÅÅÅÅ-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s”-værdien har det korrekte format (ÅÅÅÅ-MM-DD) men er en ugyldig " -"dato." - -msgid "Date (without time)" -msgstr "Dato (uden tid)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s”-værdien har et ugyldigt format. Den skal være i formatet ÅÅÅÅ-MM-" -"DD TT:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s”-værdien har det korrekte format (ÅÅÅÅ-MM-DD TT:MM[:ss[.uuuuuu]]" -"[TZ]) men er en ugyldig dato/tid." - -msgid "Date (with time)" -msgstr "Dato (med tid)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s”-værdien skal være et decimaltal." - -msgid "Decimal number" -msgstr "Decimaltal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s”-værdien har et ugyldigt format. Den skal være i formatet [DD] " -"[[TT:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Varighed" - -msgid "Email address" -msgstr "E-mail-adresse" - -msgid "File path" -msgstr "Sti" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s”-værdien skal være et kommatal." - -msgid "Floating point number" -msgstr "Flydende-komma-tal" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s”-værdien skal være et heltal." - -msgid "Integer" -msgstr "Heltal" - -msgid "Big (8 byte) integer" -msgstr "Stort heltal (8 byte)" - -msgid "Small integer" -msgstr "Lille heltal" - -msgid "IPv4 address" -msgstr "IPv4-adresse" - -msgid "IP address" -msgstr "IP-adresse" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s”-værdien skal være enten None, True eller False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolsk (True, False eller None)" - -msgid "Positive big integer" -msgstr "Positivt stort heltal" - -msgid "Positive integer" -msgstr "Positivt heltal" - -msgid "Positive small integer" -msgstr "Positivt lille heltal" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "\"Slug\" (op til %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s”-værdien har et ugyldigt format. Den skal være i formatet TT:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s”-værdien har det korrekte format (TT:MM[:ss[.uuuuuu]]) men er et " -"ugyldigt tidspunkt." - -msgid "Time" -msgstr "Tid" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Rå binære data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” er ikke et gyldigt UUID." - -msgid "Universally unique identifier" -msgstr "Universelt unik identifikator" - -msgid "File" -msgstr "Fil" - -msgid "Image" -msgstr "Billede" - -msgid "A JSON object" -msgstr "Et JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Værdien skal være gyldig JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s-instans med %(field)s %(value)r er ikke et gyldigt valg." - -msgid "Foreign Key (type determined by related field)" -msgstr "Fremmednøgle (type bestemt af relateret felt)" - -msgid "One-to-one relationship" -msgstr "En-til-en-relation" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-relation" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-relationer" - -msgid "Many-to-many relationship" -msgstr "Mange-til-mange-relation" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Dette felt er påkrævet." - -msgid "Enter a whole number." -msgstr "Indtast et heltal." - -msgid "Enter a valid date." -msgstr "Indtast en gyldig dato." - -msgid "Enter a valid time." -msgstr "Indtast en gyldig tid." - -msgid "Enter a valid date/time." -msgstr "Indtast gyldig dato/tid." - -msgid "Enter a valid duration." -msgstr "Indtast en gyldig varighed." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Antallet af dage skal være mellem {min_days} og {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ingen fil blev indsendt. Kontroller kodningstypen i formularen." - -msgid "No file was submitted." -msgstr "Ingen fil blev indsendt." - -msgid "The submitted file is empty." -msgstr "Den indsendte fil er tom." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "Dette filnavn må højst have %(max)d tegn (det har %(length)d)." -msgstr[1] "Dette filnavn må højst have %(max)d tegn (det har %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Du skal enten indsende en fil eller afmarkere afkrydsningsfeltet, ikke begge " -"dele." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Indsend en billedfil. Filen, du indsendte, var enten ikke et billede eller " -"en defekt billedfil." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Marker en gyldig valgmulighed. %(value)s er ikke en af de tilgængelige " -"valgmuligheder." - -msgid "Enter a list of values." -msgstr "Indtast en liste af værdier." - -msgid "Enter a complete value." -msgstr "Indtast en komplet værdi." - -msgid "Enter a valid UUID." -msgstr "Indtast et gyldigt UUID." - -msgid "Enter a valid JSON." -msgstr "Indtast gyldig JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skjult felt %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-data mangler eller er blevet pillet ved. Manglende felter: " -"%(field_names)s. Du kan få behov for at oprette en fejlrapport hvis " -"problemet varer ved." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Indsend venligst højst %(num)d formular." -msgstr[1] "Indsend venligst højst %(num)d formularer." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Indsend venligst mindst %(num)d formular." -msgstr[1] "Indsend venligst mindst %(num)d formularer." - -msgid "Order" -msgstr "Rækkefølge" - -msgid "Delete" -msgstr "Slet" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ret venligst duplikerede data for %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Ret venligst de duplikerede data for %(field)s, som skal være unik." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ret venligst de duplikerede data for %(field_name)s, som skal være unik for " -"%(lookup)s i %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Ret venligst de duplikerede data herunder." - -msgid "The inline value did not match the parent instance." -msgstr "Den indlejrede værdi passede ikke med forældreinstansen." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Marker en gyldig valgmulighed. Det valg, du har foretaget, er ikke blandt de " -"tilgængelige valgmuligheder." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” er ikke en gyldig værdi." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kunne ikke fortolkes i tidszonen %(current_timezone)s; den kan " -"være tvetydig eller den eksisterer måske ikke." - -msgid "Clear" -msgstr "Afmarkér" - -msgid "Currently" -msgstr "Aktuelt" - -msgid "Change" -msgstr "Ret" - -msgid "Unknown" -msgstr "Ukendt" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nej" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nej,måske" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "midnat" - -msgid "noon" -msgstr "middag" - -msgid "Monday" -msgstr "mandag" - -msgid "Tuesday" -msgstr "tirsdag" - -msgid "Wednesday" -msgstr "onsdag" - -msgid "Thursday" -msgstr "torsdag" - -msgid "Friday" -msgstr "fredag" - -msgid "Saturday" -msgstr "lørdag" - -msgid "Sunday" -msgstr "søndag" - -msgid "Mon" -msgstr "man" - -msgid "Tue" -msgstr "tir" - -msgid "Wed" -msgstr "ons" - -msgid "Thu" -msgstr "tor" - -msgid "Fri" -msgstr "fre" - -msgid "Sat" -msgstr "lør" - -msgid "Sun" -msgstr "søn" - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "marts" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sept" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "marts" - -msgctxt "abbrev. month" -msgid "April" -msgstr "april" - -msgctxt "abbrev. month" -msgid "May" -msgstr "maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec." - -msgctxt "alt. month" -msgid "January" -msgstr "januar" - -msgctxt "alt. month" -msgid "February" -msgstr "februar" - -msgctxt "alt. month" -msgid "March" -msgstr "marts" - -msgctxt "alt. month" -msgid "April" -msgstr "april" - -msgctxt "alt. month" -msgid "May" -msgstr "maj" - -msgctxt "alt. month" -msgid "June" -msgstr "juni" - -msgctxt "alt. month" -msgid "July" -msgstr "juli" - -msgctxt "alt. month" -msgid "August" -msgstr "august" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "december" - -msgid "This is not a valid IPv6 address." -msgstr "Dette er ikke en gyldig IPv6-adresse." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "eller" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d måned" -msgstr[1] "%(num)d måneder" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d uge" -msgstr[1] "%(num)d uger" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dage" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timer" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minutter" - -msgid "Forbidden" -msgstr "Forbudt" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verifikationen mislykkedes. Forespørgslen blev afbrudt." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Du ser denne besked fordi denne HTTPS-webside kræver at din browser sender " -"en “Referer header”, som ikke blev sendt. Denne header er påkrævet af " -"sikkerhedsmæssige grunde for at sikre at din browser ikke bliver kapret af " -"tredjepart." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Hvis du har opsat din browser til ikke at sende “Referer” headere, beder vi " -"dig slå dem til igen, i hvert fald for denne webside, eller for HTTPS-" -"forbindelser, eller for “same-origin”-forespørgsler." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Hvis du bruger tagget eller " -"inkluderer headeren “Referrer-Policy: no-referrer”, så fjern dem venligst. " -"CSRF-beskyttelsen afhænger af at “Referer”-headeren udfører stringent " -"referer-kontrol. Hvis du er bekymret om privatliv, så brug alternativer så " -"som for links til tredjepartswebsider." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Du ser denne besked fordi denne webside kræver en CSRF-cookie, når du sender " -"formularer. Denne cookie er påkrævet af sikkerhedsmæssige grunde for at " -"sikre at din browser ikke bliver kapret af tredjepart." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Hvis du har slået cookies fra i din browser, beder vi dig slå dem til igen, " -"i hvert fald for denne webside, eller for “same-origin”-forespørgsler." - -msgid "More information is available with DEBUG=True." -msgstr "Mere information er tilgængeligt med DEBUG=True." - -msgid "No year specified" -msgstr "Intet år specificeret" - -msgid "Date out of range" -msgstr "Dato uden for rækkevidde" - -msgid "No month specified" -msgstr "Ingen måned specificeret" - -msgid "No day specified" -msgstr "Ingen dag specificeret" - -msgid "No week specified" -msgstr "Ingen uge specificeret" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ingen %(verbose_name_plural)s til rådighed" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Fremtidige %(verbose_name_plural)s ikke tilgængelige, fordi %(class_name)s ." -"allow_future er falsk." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ugyldig datostreng “%(datestr)s” givet format “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Ingen %(verbose_name)s fundet matcher forespørgslen" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Side er ikke “sidste”, og kan heller ikke konverteres til en int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ugyldig side (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tom liste og “%(class_name)s.allow_empty” er falsk." - -msgid "Directory indexes are not allowed here." -msgstr "Mappeindekser er ikke tilladte her" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” eksisterer ikke" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks for %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Installationen virkede! Tillykke!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Vis udgivelsesnoter for Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Du ser denne side fordi du har DEBUG=True i din settings-fil og ikke har opsat nogen " -"URL'er." - -msgid "Django Documentation" -msgstr "Django-dokumentation" - -msgid "Topics, references, & how-to’s" -msgstr "Emner, referencer & how-to’s" - -msgid "Tutorial: A Polling App" -msgstr "Gennemgang: En afstemnings-app" - -msgid "Get started with Django" -msgstr "Kom i gang med Django" - -msgid "Django Community" -msgstr "Django-fællesskabet" - -msgid "Connect, get help, or contribute" -msgstr "Forbind, få hjælp eller bidrag" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/da/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/da/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/da/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/da/formats.py deleted file mode 100644 index 5829208..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/da/formats.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index e3ef1cb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/de/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 90037a2..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,1356 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2011-2012 -# Florian Apolloner , 2011 -# Daniel Roschka , 2016 -# Florian Apolloner , 2018,2020-2023 -# jnns, 2011,2013 -# Jannis Leidel , 2013-2018,2020 -# jnns, 2016 -# Markus Holtermann , 2023 -# Markus Holtermann , 2013,2015 -# Raphael Michel , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 06:49+0000\n" -"Last-Translator: Markus Holtermann , 2023\n" -"Language-Team: German (http://app.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabisch" - -msgid "Algerian Arabic" -msgstr "Algerisches Arabisch" - -msgid "Asturian" -msgstr "Asturisch" - -msgid "Azerbaijani" -msgstr "Aserbaidschanisch" - -msgid "Bulgarian" -msgstr "Bulgarisch" - -msgid "Belarusian" -msgstr "Weißrussisch" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Bretonisch" - -msgid "Bosnian" -msgstr "Bosnisch" - -msgid "Catalan" -msgstr "Katalanisch" - -msgid "Central Kurdish (Sorani)" -msgstr "Zentralkurdisch (Sorani)" - -msgid "Czech" -msgstr "Tschechisch" - -msgid "Welsh" -msgstr "Walisisch" - -msgid "Danish" -msgstr "Dänisch" - -msgid "German" -msgstr "Deutsch" - -msgid "Lower Sorbian" -msgstr "Niedersorbisch" - -msgid "Greek" -msgstr "Griechisch" - -msgid "English" -msgstr "Englisch" - -msgid "Australian English" -msgstr "Australisches Englisch" - -msgid "British English" -msgstr "Britisches Englisch" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanisch" - -msgid "Argentinian Spanish" -msgstr "Argentinisches Spanisch" - -msgid "Colombian Spanish" -msgstr "Kolumbianisches Spanisch" - -msgid "Mexican Spanish" -msgstr "Mexikanisches Spanisch" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguanisches Spanisch" - -msgid "Venezuelan Spanish" -msgstr "Venezolanisches Spanisch" - -msgid "Estonian" -msgstr "Estnisch" - -msgid "Basque" -msgstr "Baskisch" - -msgid "Persian" -msgstr "Persisch" - -msgid "Finnish" -msgstr "Finnisch" - -msgid "French" -msgstr "Französisch" - -msgid "Frisian" -msgstr "Friesisch" - -msgid "Irish" -msgstr "Irisch" - -msgid "Scottish Gaelic" -msgstr "Schottisch-Gälisch" - -msgid "Galician" -msgstr "Galicisch" - -msgid "Hebrew" -msgstr "Hebräisch" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatisch" - -msgid "Upper Sorbian" -msgstr "Obersorbisch" - -msgid "Hungarian" -msgstr "Ungarisch" - -msgid "Armenian" -msgstr "Armenisch" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesisch" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Isländisch" - -msgid "Italian" -msgstr "Italienisch" - -msgid "Japanese" -msgstr "Japanisch" - -msgid "Georgian" -msgstr "Georgisch" - -msgid "Kabyle" -msgstr "Kabylisch" - -msgid "Kazakh" -msgstr "Kasachisch" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreanisch" - -msgid "Kyrgyz" -msgstr "Kirgisisch" - -msgid "Luxembourgish" -msgstr "Luxemburgisch" - -msgid "Lithuanian" -msgstr "Litauisch" - -msgid "Latvian" -msgstr "Lettisch" - -msgid "Macedonian" -msgstr "Mazedonisch" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolisch" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malaiisch" - -msgid "Burmese" -msgstr "Birmanisch" - -msgid "Norwegian Bokmål" -msgstr "Norwegisch (Bokmål)" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Niederländisch" - -msgid "Norwegian Nynorsk" -msgstr "Norwegisch (Nynorsk)" - -msgid "Ossetic" -msgstr "Ossetisch" - -msgid "Punjabi" -msgstr "Panjabi" - -msgid "Polish" -msgstr "Polnisch" - -msgid "Portuguese" -msgstr "Portugiesisch" - -msgid "Brazilian Portuguese" -msgstr "Brasilianisches Portugiesisch" - -msgid "Romanian" -msgstr "Rumänisch" - -msgid "Russian" -msgstr "Russisch" - -msgid "Slovak" -msgstr "Slowakisch" - -msgid "Slovenian" -msgstr "Slowenisch" - -msgid "Albanian" -msgstr "Albanisch" - -msgid "Serbian" -msgstr "Serbisch" - -msgid "Serbian Latin" -msgstr "Serbisch (Latein)" - -msgid "Swedish" -msgstr "Schwedisch" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamilisch" - -msgid "Telugu" -msgstr "Telugisch" - -msgid "Tajik" -msgstr "Tadschikisch" - -msgid "Thai" -msgstr "Thailändisch" - -msgid "Turkmen" -msgstr "Turkmenisch" - -msgid "Turkish" -msgstr "Türkisch" - -msgid "Tatar" -msgstr "Tatarisch" - -msgid "Udmurt" -msgstr "Udmurtisch" - -msgid "Uyghur" -msgstr "Uigurisch" - -msgid "Ukrainian" -msgstr "Ukrainisch" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Usbekisch" - -msgid "Vietnamese" -msgstr "Vietnamesisch" - -msgid "Simplified Chinese" -msgstr "Vereinfachtes Chinesisch" - -msgid "Traditional Chinese" -msgstr "Traditionelles Chinesisch" - -msgid "Messages" -msgstr "Mitteilungen" - -msgid "Site Maps" -msgstr "Sitemaps" - -msgid "Static Files" -msgstr "Statische Dateien" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Diese Seitennummer ist keine Ganzzahl" - -msgid "That page number is less than 1" -msgstr "Diese Seitennummer ist kleiner als 1" - -msgid "That page contains no results" -msgstr "Diese Seite enthält keine Ergebnisse" - -msgid "Enter a valid value." -msgstr "Bitte einen gültigen Wert eingeben." - -msgid "Enter a valid URL." -msgstr "Bitte eine gültige Adresse eingeben." - -msgid "Enter a valid integer." -msgstr "Bitte eine gültige Ganzzahl eingeben." - -msgid "Enter a valid email address." -msgstr "Bitte gültige E-Mail-Adresse eingeben." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Bitte ein gültiges Kürzel, bestehend aus Buchstaben, Ziffern, Unterstrichen " -"und Bindestrichen, eingeben." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Bitte ein gültiges Kürzel eingeben, bestehend aus Buchstaben (Unicode), " -"Ziffern, Unter- und Bindestrichen." - -msgid "Enter a valid IPv4 address." -msgstr "Bitte eine gültige IPv4-Adresse eingeben." - -msgid "Enter a valid IPv6 address." -msgstr "Bitte eine gültige IPv6-Adresse eingeben." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Bitte eine gültige IPv4- oder IPv6-Adresse eingeben" - -msgid "Enter only digits separated by commas." -msgstr "Bitte nur durch Komma getrennte Ziffern eingeben." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Bitte sicherstellen, dass der Wert %(limit_value)s ist. (Er ist " -"%(show_value)s.)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Dieser Wert muss kleiner oder gleich %(limit_value)s sein." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Dieser Wert muss größer oder gleich %(limit_value)s sein." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Dieser Wert muss ein Vielfaches von %(limit_value)s sein." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Dieser Wert muss ein Vielfaches von %(limit_value)s sein und bei %(offset)s " -"beginnen, z.B. %(offset)s, %(valid_value1)s, %(valid_value2)s, und so weiter." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bitte sicherstellen, dass der Wert aus mindestens %(limit_value)d Zeichen " -"besteht. (Er besteht aus %(show_value)d Zeichen.)" -msgstr[1] "" -"Bitte sicherstellen, dass der Wert aus mindestens %(limit_value)d Zeichen " -"besteht. (Er besteht aus %(show_value)d Zeichen.)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bitte sicherstellen, dass der Wert aus höchstens %(limit_value)d Zeichen " -"besteht. (Er besteht aus %(show_value)d Zeichen.)" -msgstr[1] "" -"Bitte sicherstellen, dass der Wert aus höchstens %(limit_value)d Zeichen " -"besteht. (Er besteht aus %(show_value)d Zeichen.)" - -msgid "Enter a number." -msgstr "Bitte eine Zahl eingeben." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffer enthält." -msgstr[1] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffern enthält." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Dezimalstelle enthält." -msgstr[1] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Dezimalstellen enthält." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffer vor dem Komma " -"enthält." -msgstr[1] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffern vor dem Komma " -"enthält." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Dateiendung „%(extension)s“ ist nicht erlaubt. Erlaubte Dateiendungen sind: " -"„%(allowed_extensions)s“." - -msgid "Null characters are not allowed." -msgstr "Nullzeichen sind nicht erlaubt." - -msgid "and" -msgstr "und" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s mit diesem %(field_labels)s existiert bereits." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Bedingung „%(name)s“ ist nicht erfüllt." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Wert %(value)r ist keine gültige Option." - -msgid "This field cannot be null." -msgstr "Dieses Feld darf nicht null sein." - -msgid "This field cannot be blank." -msgstr "Dieses Feld darf nicht leer sein." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s mit diesem %(field_label)s existiert bereits." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s muss für %(date_field_label)s %(lookup_type)s eindeutig sein." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Feldtyp: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Wert „%(value)s“ muss entweder True oder False sein." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Wert „%(value)s“ muss True, False oder None sein." - -msgid "Boolean (Either True or False)" -msgstr "Boolescher Wert (True oder False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Zeichenkette (bis zu %(max_length)s Zeichen)" - -msgid "String (unlimited)" -msgstr "Zeichenkette (unlimitiert)" - -msgid "Comma-separated integers" -msgstr "Kommaseparierte Liste von Ganzzahlen" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Wert „%(value)s“ hat ein ungültiges Datumsformat. Es muss YYYY-MM-DD " -"entsprechen." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Wert „%(value)s“ hat das korrekte Format (YYYY-MM-DD) aber ein ungültiges " -"Datum." - -msgid "Date (without time)" -msgstr "Datum (ohne Uhrzeit)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Wert „%(value)s“ hat ein ungültiges Format. Es muss YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] entsprechen." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Wert „%(value)s“ hat das korrekte Format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) aber eine ungültige Zeit-/Datumsangabe." - -msgid "Date (with time)" -msgstr "Datum (mit Uhrzeit)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Wert „%(value)s“ muss eine Dezimalzahl sein." - -msgid "Decimal number" -msgstr "Dezimalzahl" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Wert „%(value)s“ hat ein ungültiges Format. Es muss der Form [DD] [HH:" -"[MM:]]ss[.uuuuuu] entsprechen." - -msgid "Duration" -msgstr "Zeitspanne" - -msgid "Email address" -msgstr "E-Mail-Adresse" - -msgid "File path" -msgstr "Dateipfad" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Wert „%(value)s“ muss eine Fließkommazahl sein." - -msgid "Floating point number" -msgstr "Gleitkommazahl" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Wert „%(value)s“ muss eine Ganzzahl sein." - -msgid "Integer" -msgstr "Ganzzahl" - -msgid "Big (8 byte) integer" -msgstr "Große Ganzzahl (8 Byte)" - -msgid "Small integer" -msgstr "Kleine Ganzzahl" - -msgid "IPv4 address" -msgstr "IPv4-Adresse" - -msgid "IP address" -msgstr "IP-Adresse" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Wert „%(value)s“ muss entweder None, True oder False sein." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolescher Wert (True, False oder None)" - -msgid "Positive big integer" -msgstr "Positive große Ganzzahl" - -msgid "Positive integer" -msgstr "Positive Ganzzahl" - -msgid "Positive small integer" -msgstr "Positive kleine Ganzzahl" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Kürzel (bis zu %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Wert „%(value)s“ hat ein ungültiges Format. Es muss HH:MM[:ss[.uuuuuu]] " -"entsprechen." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Wert „%(value)s“ hat das korrekte Format (HH:MM[:ss[.uuuuuu]]), aber ist " -"eine ungültige Zeitangabe." - -msgid "Time" -msgstr "Zeit" - -msgid "URL" -msgstr "Adresse (URL)" - -msgid "Raw binary data" -msgstr "Binärdaten" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Wert „%(value)s“ ist keine gültige UUID." - -msgid "Universally unique identifier" -msgstr "Universally Unique Identifier" - -msgid "File" -msgstr "Datei" - -msgid "Image" -msgstr "Bild" - -msgid "A JSON object" -msgstr "Ein JSON-Objekt" - -msgid "Value must be valid JSON." -msgstr "Wert muss gültiges JSON sein." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Objekt vom Typ %(model)s mit %(field)s %(value)r existiert nicht." - -msgid "Foreign Key (type determined by related field)" -msgstr "Fremdschlüssel (Typ definiert durch verknüpftes Feld)" - -msgid "One-to-one relationship" -msgstr "1:1-Beziehung" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-Beziehung" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-Beziehungen" - -msgid "Many-to-many relationship" -msgstr "n:m-Beziehung" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Dieses Feld ist zwingend erforderlich." - -msgid "Enter a whole number." -msgstr "Bitte eine ganze Zahl eingeben." - -msgid "Enter a valid date." -msgstr "Bitte ein gültiges Datum eingeben." - -msgid "Enter a valid time." -msgstr "Bitte eine gültige Uhrzeit eingeben." - -msgid "Enter a valid date/time." -msgstr "Bitte ein gültiges Datum und Uhrzeit eingeben." - -msgid "Enter a valid duration." -msgstr "Bitte eine gültige Zeitspanne eingeben." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Die Anzahl der Tage muss zwischen {min_days} und {max_days} sein." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Es wurde keine Datei übertragen. Überprüfen Sie das Encoding des Formulars." - -msgid "No file was submitted." -msgstr "Es wurde keine Datei übertragen." - -msgid "The submitted file is empty." -msgstr "Die übertragene Datei ist leer." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Bitte sicherstellen, dass der Dateiname aus höchstens %(max)d Zeichen " -"besteht. (Er besteht aus %(length)d Zeichen.)" -msgstr[1] "" -"Bitte sicherstellen, dass der Dateiname aus höchstens %(max)d Zeichen " -"besteht. (Er besteht aus %(length)d Zeichen.)" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Bitte wählen Sie entweder eine Datei aus oder wählen Sie „Löschen“, nicht " -"beides." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Bitte ein gültiges Bild hochladen. Die hochgeladene Datei ist kein Bild oder " -"ist defekt." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Bitte eine gültige Auswahl treffen. %(value)s ist keine gültige Auswahl." - -msgid "Enter a list of values." -msgstr "Bitte eine Liste mit Werten eingeben." - -msgid "Enter a complete value." -msgstr "Bitte einen vollständigen Wert eingeben." - -msgid "Enter a valid UUID." -msgstr "Bitte eine gültige UUID eingeben." - -msgid "Enter a valid JSON." -msgstr "Bitte ein gültiges JSON-Objekt eingeben." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Verstecktes Feld %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Daten für das Management-Formular fehlen oder wurden manipuliert. Fehlende " -"Felder: %(field_names)s. Bitte erstellen Sie einen Bug-Report falls der " -"Fehler dauerhaft besteht." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Bitte höchstens %(num)d Forumlar abschicken." -msgstr[1] "Bitte höchstens %(num)d Formulare abschicken." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Bitte mindestends %(num)d Formular abschicken." -msgstr[1] "Bitte mindestens %(num)d Formulare abschicken." - -msgid "Order" -msgstr "Reihenfolge" - -msgid "Delete" -msgstr "Löschen" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Bitte die doppelten Daten für %(field)s korrigieren." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Bitte die doppelten Daten für %(field)s korrigieren, das eindeutig sein muss." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Bitte die doppelten Daten für %(field_name)s korrigieren, da es für " -"%(lookup)s in %(date_field)s eindeutig sein muss." - -msgid "Please correct the duplicate values below." -msgstr "Bitte die unten aufgeführten doppelten Werte korrigieren." - -msgid "The inline value did not match the parent instance." -msgstr "Der Inline-Wert passt nicht zur übergeordneten Instanz." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Bitte eine gültige Auswahl treffen. Dies ist keine gültige Auswahl." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "„%(pk)s“ ist kein gültiger Wert." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s konnte mit der Zeitzone %(current_timezone)s nicht eindeutig " -"interpretiert werden, da es doppeldeutig oder eventuell inkorrekt ist." - -msgid "Clear" -msgstr "Zurücksetzen" - -msgid "Currently" -msgstr "Derzeit" - -msgid "Change" -msgstr "Ändern" - -msgid "Unknown" -msgstr "Unbekannt" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nein" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "Ja,Nein,Vielleicht" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d Byte" -msgstr[1] "%(size)d Bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "nachm." - -msgid "a.m." -msgstr "vorm." - -msgid "PM" -msgstr "nachm." - -msgid "AM" -msgstr "vorm." - -msgid "midnight" -msgstr "Mitternacht" - -msgid "noon" -msgstr "Mittag" - -msgid "Monday" -msgstr "Montag" - -msgid "Tuesday" -msgstr "Dienstag" - -msgid "Wednesday" -msgstr "Mittwoch" - -msgid "Thursday" -msgstr "Donnerstag" - -msgid "Friday" -msgstr "Freitag" - -msgid "Saturday" -msgstr "Samstag" - -msgid "Sunday" -msgstr "Sonntag" - -msgid "Mon" -msgstr "Mo" - -msgid "Tue" -msgstr "Di" - -msgid "Wed" -msgstr "Mi" - -msgid "Thu" -msgstr "Do" - -msgid "Fri" -msgstr "Fr" - -msgid "Sat" -msgstr "Sa" - -msgid "Sun" -msgstr "So" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "März" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Dezember" - -msgid "jan" -msgstr "Jan" - -msgid "feb" -msgstr "Feb" - -msgid "mar" -msgstr "Mär" - -msgid "apr" -msgstr "Apr" - -msgid "may" -msgstr "Mai" - -msgid "jun" -msgstr "Jun" - -msgid "jul" -msgstr "Jul" - -msgid "aug" -msgstr "Aug" - -msgid "sep" -msgstr "Sep" - -msgid "oct" -msgstr "Okt" - -msgid "nov" -msgstr "Nov" - -msgid "dec" -msgstr "Dez" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "März" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dez." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "März" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Juli" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Dezember" - -msgid "This is not a valid IPv6 address." -msgstr "Dies ist keine gültige IPv6-Adresse." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "oder" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d Jahr" -msgstr[1] "%(num)d Jahre" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d Monat" -msgstr[1] "%(num)d Monate" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d Woche" -msgstr[1] "%(num)d Wochen" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d Tag" -msgstr[1] "%(num)d Tage" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d Stunde" -msgstr[1] "%(num)d Stunden" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d Minute" -msgstr[1] "%(num)d Minuten" - -msgid "Forbidden" -msgstr "Verboten" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-Verifizierung fehlgeschlagen. Anfrage abgebrochen." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Sie sehen diese Fehlermeldung, da diese HTTPS-Seite einen „Referer“-Header " -"von Ihrem Webbrowser erwartet, aber keinen erhalten hat. Dieser Header ist " -"aus Sicherheitsgründen notwendig, um sicherzustellen, dass Ihr Webbrowser " -"nicht von Dritten missbraucht wird." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Falls Sie Ihren Webbrowser so konfiguriert haben, dass „Referer“-Header " -"nicht gesendet werden, müssen Sie diese Funktion mindestens für diese Seite, " -"für sichere HTTPS-Verbindungen oder für „Same-Origin“-Verbindungen " -"reaktivieren." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Wenn der Tag „“ oder der " -"„Referrer-Policy: no-referrer“-Header verwendet wird, entfernen Sie sie " -"bitte. Der „Referer“-Header wird zur korrekten CSRF-Verifizierung benötigt. " -"Falls es datenschutzrechtliche Gründe gibt, benutzen Sie bitte Alternativen " -"wie „“ für Links zu Drittseiten." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Sie sehen Diese Nachricht, da diese Seite einen CSRF-Cookie beim Verarbeiten " -"von Formulardaten benötigt. Dieses Cookie ist aus Sicherheitsgründen " -"notwendig, um sicherzustellen, dass Ihr Webbrowser nicht von Dritten " -"missbraucht wird." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Falls Sie Cookies in Ihren Webbrowser deaktiviert haben, müssen Sie sie " -"mindestens für diese Seite oder für „Same-Origin“-Verbindungen reaktivieren." - -msgid "More information is available with DEBUG=True." -msgstr "Mehr Information ist verfügbar mit DEBUG=True." - -msgid "No year specified" -msgstr "Kein Jahr angegeben" - -msgid "Date out of range" -msgstr "Datum außerhalb des zulässigen Bereichs" - -msgid "No month specified" -msgstr "Kein Monat angegeben" - -msgid "No day specified" -msgstr "Kein Tag angegeben" - -msgid "No week specified" -msgstr "Keine Woche angegeben" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Keine %(verbose_name_plural)s verfügbar" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"In der Zukunft liegende %(verbose_name_plural)s sind nicht verfügbar, da " -"%(class_name)s.allow_future auf False gesetzt ist." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ungültiges Datum „%(datestr)s“ für das Format „%(format)s“" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Konnte keine %(verbose_name)s mit diesen Parametern finden." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Weder ist dies die letzte Seite („last“) noch konnte sie in einen " -"ganzzahligen Wert umgewandelt werden." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ungültige Seite (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Leere Liste und „%(class_name)s.allow_empty“ ist False." - -msgid "Directory indexes are not allowed here." -msgstr "Dateilisten sind untersagt." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ ist nicht vorhanden" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Verzeichnis %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Die Installation war erfolgreich. Herzlichen Glückwunsch!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Versionshinweise für Django " -"%(version)s anzeigen" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Diese Seite ist sichtbar weil in der Settings-Datei DEBUG = True steht und die URLs noch nicht konfiguriert " -"sind." - -msgid "Django Documentation" -msgstr "Django-Dokumentation" - -msgid "Topics, references, & how-to’s" -msgstr "Themen, Referenz, & Kurzanleitungen" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Eine Umfrage-App" - -msgid "Get started with Django" -msgstr "Los geht's mit Django" - -msgid "Django Community" -msgstr "Django-Community" - -msgid "Connect, get help, or contribute" -msgstr "Nimm Kontakt auf, erhalte Hilfe oder arbeite an Django mit" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/de/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/de/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/de/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/de/formats.py deleted file mode 100644 index 45953ce..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/de/formats.py +++ /dev/null @@ -1,29 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - # "%d. %B %Y", # '25. October 2006' - # "%d. %b. %Y", # '25. Oct. 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/de_CH/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/de_CH/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/de_CH/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/de_CH/formats.py deleted file mode 100644 index f42dd48..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/de_CH/formats.py +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - # "%d. %B %Y", # '25. October 2006' - # "%d. %b. %Y", # '25. Oct. 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' -] - -# these are the separators for non-monetary numbers. For monetary numbers, -# the DECIMAL_SEPARATOR is a . (decimal point) and the THOUSAND_SEPARATOR is a -# ' (single quote). -# For details, please refer to the documentation and the following link: -# https://www.bk.admin.ch/bk/de/home/dokumentation/sprachen/hilfsmittel-textredaktion/schreibweisungen.html -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index c7bf58d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index 2a37c92..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,1392 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016-2025\n" -"Language-Team: Lower Sorbian (http://app.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "Afrikaans" -msgstr "Afrikaanšćina" - -msgid "Arabic" -msgstr "Arabšćina" - -msgid "Algerian Arabic" -msgstr "Algeriska arabšćina" - -msgid "Asturian" -msgstr "Asturišćina" - -msgid "Azerbaijani" -msgstr "Azerbajdžanišćina" - -msgid "Bulgarian" -msgstr "Bulgaršćina" - -msgid "Belarusian" -msgstr "Běłorušćina" - -msgid "Bengali" -msgstr "Bengalšćina" - -msgid "Breton" -msgstr "Bretońšćina" - -msgid "Bosnian" -msgstr "Bosnišćina" - -msgid "Catalan" -msgstr "Katalańšćina" - -msgid "Central Kurdish (Sorani)" -msgstr "Centralna kurdišćina (Sorani)" - -msgid "Czech" -msgstr "Češćina" - -msgid "Welsh" -msgstr "Kymrišćina" - -msgid "Danish" -msgstr "Dańšćina" - -msgid "German" -msgstr "Nimšćina" - -msgid "Lower Sorbian" -msgstr "Dolnoserbšćina" - -msgid "Greek" -msgstr "Grichišćina" - -msgid "English" -msgstr "Engelšćina" - -msgid "Australian English" -msgstr "Awstralska engelšćina" - -msgid "British English" -msgstr "Britiska engelšćina" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Špańšćina" - -msgid "Argentinian Spanish" -msgstr "Argentinska špańšćina" - -msgid "Colombian Spanish" -msgstr "Kolumbiska špańšćina" - -msgid "Mexican Spanish" -msgstr "Mexikańska špańšćina" - -msgid "Nicaraguan Spanish" -msgstr "Nikaraguaska špańšćina" - -msgid "Venezuelan Spanish" -msgstr "Venezolaniska špańšćina" - -msgid "Estonian" -msgstr "Estnišćina" - -msgid "Basque" -msgstr "Baskišćina" - -msgid "Persian" -msgstr "Persišćina" - -msgid "Finnish" -msgstr "Finšćina" - -msgid "French" -msgstr "Francojšćina" - -msgid "Frisian" -msgstr "Frizišćina" - -msgid "Irish" -msgstr "Iršćina" - -msgid "Scottish Gaelic" -msgstr "Šotiska gelišćina" - -msgid "Galician" -msgstr "Galicišćina" - -msgid "Hebrew" -msgstr "Hebrejšćina" - -msgid "Hindi" -msgstr "Hindišćina" - -msgid "Croatian" -msgstr "Chorwatšćina" - -msgid "Upper Sorbian" -msgstr "Górnoserbšćina" - -msgid "Hungarian" -msgstr "Hungoršćina" - -msgid "Armenian" -msgstr "Armeńšćina" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonešćina" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandšćina" - -msgid "Italian" -msgstr "Italšćina" - -msgid "Japanese" -msgstr "Japańšćina" - -msgid "Georgian" -msgstr "Georgišćina" - -msgid "Kabyle" -msgstr "Kabylšćina" - -msgid "Kazakh" -msgstr "Kazachšćina" - -msgid "Khmer" -msgstr "Rěc Khmerow" - -msgid "Kannada" -msgstr "Kannadišćina" - -msgid "Korean" -msgstr "Korejańšćina" - -msgid "Kyrgyz" -msgstr "Kirgišćina" - -msgid "Luxembourgish" -msgstr "Luxemburgšćina" - -msgid "Lithuanian" -msgstr "Litawšćina" - -msgid "Latvian" -msgstr "Letišćina" - -msgid "Macedonian" -msgstr "Makedońšćina" - -msgid "Malayalam" -msgstr "Malajalam" - -msgid "Mongolian" -msgstr "Mongolšćina" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malayzišćina" - -msgid "Burmese" -msgstr "Myanmaršćina" - -msgid "Norwegian Bokmål" -msgstr "Norwegski Bokmål" - -msgid "Nepali" -msgstr "Nepalšćina" - -msgid "Dutch" -msgstr "¨Nižozemšćina" - -msgid "Norwegian Nynorsk" -msgstr "Norwegski Nynorsk" - -msgid "Ossetic" -msgstr "Osetšćina" - -msgid "Punjabi" -msgstr "Pundžabi" - -msgid "Polish" -msgstr "Pólšćina" - -msgid "Portuguese" -msgstr "Portugišćina" - -msgid "Brazilian Portuguese" -msgstr "Brazilska portugišćina" - -msgid "Romanian" -msgstr "Rumunšćina" - -msgid "Russian" -msgstr "Rušćina" - -msgid "Slovak" -msgstr "Słowakšćina" - -msgid "Slovenian" -msgstr "Słowjeńšćina" - -msgid "Albanian" -msgstr "Albanšćina" - -msgid "Serbian" -msgstr "Serbišćina" - -msgid "Serbian Latin" -msgstr "Serbišćina, łatyńska" - -msgid "Swedish" -msgstr "Šwedšćina" - -msgid "Swahili" -msgstr "Suahelšćina" - -msgid "Tamil" -msgstr "Tamilšćina" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tadźikišćina" - -msgid "Thai" -msgstr "Thaišćina" - -msgid "Turkmen" -msgstr "Turkmeńšćina" - -msgid "Turkish" -msgstr "Turkojšćina" - -msgid "Tatar" -msgstr "Tataršćina" - -msgid "Udmurt" -msgstr "Udmurtšćina" - -msgid "Uyghur" -msgstr "Ujguršćina" - -msgid "Ukrainian" -msgstr "Ukrainšćina" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbekšćina" - -msgid "Vietnamese" -msgstr "Vietnamšćina" - -msgid "Simplified Chinese" -msgstr "Zjadnorjona chinšćina" - -msgid "Traditional Chinese" -msgstr "Tradicionelna chinšćina" - -msgid "Messages" -msgstr "Powěsći" - -msgid "Site Maps" -msgstr "Wopśimjeśowy pśeglěd sedła" - -msgid "Static Files" -msgstr "Statiske dataje" - -msgid "Syndication" -msgstr "Syndikacija" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Toś ten numer boka njejo ceła licba" - -msgid "That page number is less than 1" -msgstr "Numer boka jo mjeńšy ako 1" - -msgid "That page contains no results" -msgstr "Toś ten bok njewopśimujo wuslědki" - -msgid "Enter a valid value." -msgstr "Zapódajśo płaśiwu gódnotu." - -msgid "Enter a valid domain name." -msgstr "Zapódajśo płaśiwe domenowe mě." - -msgid "Enter a valid URL." -msgstr "Zapódajśo płaśiwy URL." - -msgid "Enter a valid integer." -msgstr "Zapódajśo płaśiwu cełu licbu." - -msgid "Enter a valid email address." -msgstr "Zapódajśo płaśiwu e-mailowu adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Zapódajśo płaśiwe „adresowe mě“, kótarež jano wopśimujo pismiki, licby, " -"pódsmužki abo wězawki." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Zapódajśo płaśiwe „adresowe mě“, kótarež jano wopśimujo unicodowe pismiki, " -"licby, pódmužki abo wězawki." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Zapódajśo płaśiwu %(protocol)s-adresu." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 abo IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Zapódajśo jano cyfry źělone pśez komy." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Zawěsććo toś tu gódnotu jo %(limit_value)s (jo %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Zawěsććo, až toś ta gódnota jo mjeńša ako abo to samske ako %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Zawěsććo, až toś ta gódnota jo wětša ako abo to samske ako %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Zawěsććo, až toś gódnota jo wjelesere kšacoweje wjelikosći %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Zawěsććo, až toś ta gódnota jo wjele wót kšacoweje wjelikosći " -"%(limit_value)s, zachopinajucy z %(offset)s, na pś. %(offset)s, " -"%(valid_value1)s, %(valid_value2)s a tak dalej." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamuško (ma " -"%(show_value)d)." -msgstr[1] "" -"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamušce (ma " -"%(show_value)d)." -msgstr[2] "" -"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamuška (ma " -"%(show_value)d)." -msgstr[3] "" -"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamuškow (ma " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamuško (ma " -"%(show_value)d)." -msgstr[1] "" -"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamušce (ma " -"%(show_value)d)." -msgstr[2] "" -"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamuška (ma " -"%(show_value)d)." -msgstr[3] "" -"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamuškow (ma " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Zapódajśo licbu." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Zawěsććo, až njejo wěcej ako %(max)s cyfry dogromady." -msgstr[1] "Zawěsććo, až njejo wěcej ako %(max)s cyfrowu dogromady." -msgstr[2] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow dogromady." -msgstr[3] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow dogromady." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Zawěsććo, až njejo wěcej ako %(max)s decimalnego městna." -msgstr[1] "Zawěsććo, až njejo wěcej ako %(max)s decimalneju městnowu." -msgstr[2] "Zawěsććo, až njejo wěcej ako %(max)s decimalnych městnow." -msgstr[3] "Zawěsććo, až njejo wěcej ako %(max)s decimalnych městnow." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Zawěsććo, až njejo wěcej ako %(max)s cyfry pśed decimalneju komu." -msgstr[1] "Zawěsććo, až njejo wěcej ako %(max)s cyfrowu pśed decimalneju komu." -msgstr[2] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow pśed decimalneju komu." -msgstr[3] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow pśed decimalneju komu." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Datajowy sufiks „%(extension)s“ njejo dowólony. Dowólone sufikse su: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Znamuška nul njejsu dowólone." - -msgid "and" -msgstr "a" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s z toś tym %(field_labels)s južo eksistěrujo." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Wobranicowanje \"%(name)s\" jo pśestupjone." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Gódnota %(value)r njejo płaśiwa wóleńska móžnosć." - -msgid "This field cannot be null." -msgstr "Toś to pólo njamóžo nul byś." - -msgid "This field cannot be blank." -msgstr "Toś to pólo njamóžo prozne byś." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s z toś tym %(field_label)s južo eksistěrujo." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s musy za %(date_field_label)s %(lookup_type)s jadnorazowy byś." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Typ póla: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Gódnota „%(value)s“ musy pak True pak False byś." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Gódnota „%(value)s“ musy pak True, False pak None byś." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (pak True pak False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Znamuškowy rjeśazk (až %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Znamuškowy rjeśazk (njewobgranicowany)" - -msgid "Comma-separated integers" -msgstr "Pśez komu źělone cełe licby" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Gódnota „%(value)s“ ma njepłaśiwy datumowy format. Musy we formaśe DD.MM." -"YYYY byś." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Gódnota „%(value)s“ ma korektny format (DD.MM.YYYY), ale jo njepłaśiwy datum." - -msgid "Date (without time)" -msgstr "Datum (bźez casa)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Gódnota „%(value)s“ ma njepłaśiwy format. Musy w formaśe DD.MM.YYYY HH:MM[:" -"ss[.uuuuuu]][TZ] byś." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Gódnota „%(value)s“ ma korektny format (DD.MM.YYYY HH:MM[:ss[.uuuuuu]][TZ]), " -"ale jo njepłaśiwy datum/cas." - -msgid "Date (with time)" -msgstr "Datum (z casom)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Gódnota „%(value)s“ musy decimalna licba byś." - -msgid "Decimal number" -msgstr "Decimalna licba" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Gódnota „%(value)s“ ma njepłaśiwy format. Musy we formaśe [DD] " -"[[HH:]MM:]ss[.uuuuuu] byś." - -msgid "Duration" -msgstr "Traśe" - -msgid "Email address" -msgstr "E-mailowa adresa" - -msgid "File path" -msgstr "Datajowa sćažka" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Gódnota „%(value)s“ musy typ float měś." - -msgid "Floating point number" -msgstr "Licba běžeceje komy" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Gódnota „%(value)s“ musy ceła licba byś." - -msgid "Integer" -msgstr "Integer" - -msgid "Big (8 byte) integer" -msgstr "Big (8 bajtow) integer" - -msgid "Small integer" -msgstr "Mała ceła licba" - -msgid "IPv4 address" -msgstr "IPv4-adresa" - -msgid "IP address" -msgstr "IP-adresa" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Gódnota „%(value)s“ musy pak None, True pak False byś." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (pak True, False pak None)" - -msgid "Positive big integer" -msgstr "Pozitiwna wjelika ceła licba" - -msgid "Positive integer" -msgstr "Pozitiwna ceła licba" - -msgid "Positive small integer" -msgstr "Pozitiwna mała ceła licba" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Adresowe mě (až %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Gódnota „%(value)s“ ma njepłaśiwy format. Musy w formaśe HH:MM[:ss[." -"uuuuuu]] byś." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Gódnota „%(value)s“ ma korektny format (HH:MM[:ss[.uuuuuu]]), ale jo " -"njepłaśiwy cas." - -msgid "Time" -msgstr "Cas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Gropne binarne daty" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "„%(value)s“ njejo płaśiwy UUID." - -msgid "Universally unique identifier" -msgstr "Uniwerselnje jadnorazowy identifikator" - -msgid "File" -msgstr "Dataja" - -msgid "Image" -msgstr "Woraz" - -msgid "A JSON object" -msgstr "JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Gódnota musy płaśiwy JSON byś." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "Instanca %(model)s z %(field)s %(value)r njejo płaśiwa wólba." - -msgid "Foreign Key (type determined by related field)" -msgstr "Cuzy kluc (typ póstaja se pśez wótpowědne pólo)" - -msgid "One-to-one relationship" -msgstr "Póśěg jaden jaden" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Póśěg %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Póśěgi %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Póśěg wjele wjele" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Toś to pólo jo trěbne." - -msgid "Enter a whole number." -msgstr "Zapódajśo cełu licbu." - -msgid "Enter a valid date." -msgstr "Zapódajśo płaśiwy datum." - -msgid "Enter a valid time." -msgstr "Zapódajśo płaśiwy cas." - -msgid "Enter a valid date/time." -msgstr "Zapódajśo płaśiwy datum/cas." - -msgid "Enter a valid duration." -msgstr "Zapódaśe płaśiwe traśe." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Licba dnjow musy mjazy {min_days} a {max_days} byś." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Dataja njejo se wótpósłała. Pśeglědujśo koděrowański typ na formularje. " - -msgid "No file was submitted." -msgstr "Žedna dataja jo se wótpósłała." - -msgid "The submitted file is empty." -msgstr "Wótpósłana dataja jo prozna." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamuško (ma " -"%(length)d)." -msgstr[1] "" -"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamušce (ma " -"%(length)d)." -msgstr[2] "" -"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamuška (ma " -"%(length)d)." -msgstr[3] "" -"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamuškow (ma " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Pšosym pak wótpósćelśo dataju pak stajśo kokulku do kontrolnego kašćika, " -"njecyńśo wobej." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Nagrajśo płaśiwy wobraz. Dataja, kótaruž sćo nagrał, pak njejo wobraz był " -"pak jo wobškóźony wobraz." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Wubjeŕśo płaśiwu wóleńsku móžnosć. %(value)s njejo jadna z k dispoziciji " -"stojecych wóleńskich móžnosćow." - -msgid "Enter a list of values." -msgstr "Zapódajśo lisćinu gódnotow." - -msgid "Enter a complete value." -msgstr "Zapódajśo dopołnu gódnotu." - -msgid "Enter a valid UUID." -msgstr "Zapódajśo płaśiwy UUID." - -msgid "Enter a valid JSON." -msgstr "Zapódajśo płaśiwy JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Schowane pólo %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Daty ManagementForm feluju abo su wobškóźone. Felujuce póla: " -"%(field_names)s. Móžośo zmólkowu rozpšawu pisaś, jolic problem dalej " -"eksistěrujo." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Pšosym wótposćelśo maksimalnje %(num)d formular." -msgstr[1] "Pšosym wótposćelśo maksimalnje %(num)d formulara." -msgstr[2] "Pšosym wótposćelśo maksimalnje %(num)d formulary." -msgstr[3] "Pšosym wótposćelśo maksimalnje %(num)d formularow." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Pšosym wótposćelśo minimalnje %(num)d formular." -msgstr[1] "Pšosym wótposćelśo minimalnje %(num)d formulara." -msgstr[2] "Pšosym wótposćelśo minimalnje %(num)d formulary." -msgstr[3] "Pšosym wótposćelśo minimalnje %(num)d formularow." - -msgid "Order" -msgstr "Rěd" - -msgid "Delete" -msgstr "Lašowaś" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Pšosym korigěrujśo dwójne daty za %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Pšosym korigěrujśo dwójne daty za %(field)s, kótarež muse jadnorazowe byś." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Pšosym korigěrujśo dwójne daty za %(field_name)s, kótarež muse za %(lookup)s " -"w %(date_field)s jadnorazowe byś." - -msgid "Please correct the duplicate values below." -msgstr "Pšosym korigěrujśo slědujuce dwójne gódnoty." - -msgid "The inline value did not match the parent instance." -msgstr "Gódnota inline nadrědowanej instance njewótpowědujo." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Wubjeŕśo płaśiwu wóleńsku móžnosć. Toś ta wóleńska móžnosć njejo žedna z " -"wóleńskich móžnosćow." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "„%(pk)s“ njejo płaśiwa gódnota." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s njedajo se w casowej conje %(current_timezone)s " -"interpretěrowaś; jo dwójozmysłowy abo snaź njeeksistěrujo." - -msgid "Clear" -msgstr "Lašowaś" - -msgid "Currently" -msgstr "Tuchylu" - -msgid "Change" -msgstr "Změniś" - -msgid "Unknown" -msgstr "Njeznaty" - -msgid "Yes" -msgstr "Jo" - -msgid "No" -msgstr "Ně" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "jo,ně,snaź" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajta" -msgstr[2] "%(size)d bajty" -msgstr[3] "%(size)d bajtow" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "wótpołdnja" - -msgid "a.m." -msgstr "dopołdnja" - -msgid "PM" -msgstr "wótpołdnja" - -msgid "AM" -msgstr "dopołdnja" - -msgid "midnight" -msgstr "połnoc" - -msgid "noon" -msgstr "połdnjo" - -msgid "Monday" -msgstr "Pónjeźele" - -msgid "Tuesday" -msgstr "Wałtora" - -msgid "Wednesday" -msgstr "Srjoda" - -msgid "Thursday" -msgstr "Stwórtk" - -msgid "Friday" -msgstr "Pětk" - -msgid "Saturday" -msgstr "Sobota" - -msgid "Sunday" -msgstr "Njeźela" - -msgid "Mon" -msgstr "Pón" - -msgid "Tue" -msgstr "Wał" - -msgid "Wed" -msgstr "Srj" - -msgid "Thu" -msgstr "Stw" - -msgid "Fri" -msgstr "Pět" - -msgid "Sat" -msgstr "Sob" - -msgid "Sun" -msgstr "Nje" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Měrc" - -msgid "April" -msgstr "Apryl" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Junij" - -msgid "July" -msgstr "Julij" - -msgid "August" -msgstr "Awgust" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "Nowember" - -msgid "December" -msgstr "December" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "měr" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "awg" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "now" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Měrc" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Apryl" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junij" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julij" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Awg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Now." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "Měrc" - -msgctxt "alt. month" -msgid "April" -msgstr "Apryl" - -msgctxt "alt. month" -msgid "May" -msgstr "Maj" - -msgctxt "alt. month" -msgid "June" -msgstr "Junij" - -msgctxt "alt. month" -msgid "July" -msgstr "Julij" - -msgctxt "alt. month" -msgid "August" -msgstr "Awgust" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "Nowember" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "To njejo płaśiwa IPv6-adresa." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "abo" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d lěto" -msgstr[1] "%(num)d lěśe" -msgstr[2] "%(num)d lěta" -msgstr[3] "%(num)d lět" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mjasec" -msgstr[1] "%(num)d mjaseca" -msgstr[2] "%(num)d mjasece" -msgstr[3] "%(num)dmjasecow" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tyźeń" -msgstr[1] "%(num)d tyźenja" -msgstr[2] "%(num)d tyźenje" -msgstr[3] "%(num)d tyźenjow" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d źeń " -msgstr[1] "%(num)d dnja" -msgstr[2] "%(num)d dny" -msgstr[3] "%(num)d dnjow" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d góźina" -msgstr[1] "%(num)d góźinje" -msgstr[2] "%(num)d góźiny" -msgstr[3] "%(num)d góźin" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuśe" -msgstr[2] "%(num)d minuty" -msgstr[3] "%(num)d minutow" - -msgid "Forbidden" -msgstr "Zakazany" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-pśeglědanje njejo se raźiło. Napšašowanje jo se pśetergnuło." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Wiźiśo toś tu powěźeńku, dokulaž toś to HTTPS-sedło trjeba \"Referer " -"header\", aby se pśez waš webwobglědowak słało, ale žedna njejo se pósłała. " -"Toś ta głowa jo trěbna z pśicynow wěstoty, aby so zawěsćiło, až waš " -"wobglědowak njekaprujo se wót tśeśich." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Jolic sćo swój wobglědowak tak konfigurěrował, aby se głowy 'Referer' " -"znjemóžnili, zmóžniśo je pšosym zasej, nanejmjenjej za toś to sedło, za " -"HTTPS-zwiski abo za napšašowanja 'same-origin'." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Jolic woznamjenje wužywaśo " -"abo głowu „Referrer-Policy: no-referrer“ zapśimujośo, wótwónoźćo je. CSRF-" -"šćit pomina se głowu „Referer“, aby striktnu kontrolu referera pśewjasć. " -"Jolic se wó swóju priwatnosć staraśo, wužywajśo alternatiwy ako za wótkazy k sedłam tśeśich." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Wiźiśo toś tu powěźeńku, dokulaž toś to HTTPS-sedło trjeba CSRF-cookie, aby " -"formulary wótpósłało. Toś ten cookie jo trěbna z pśicynow wěstoty, aby so " -"zawěsćiło, až waš wobglědowak njekaprujo se wót tśeśich." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Jolic sćo swój wobglědowak tak konfigurěrował, aby cookieje znjemóžnili, " -"zmóžniśo je pšosym zasej, nanejmjenjej za toś to sedło abo za napšašowanja " -"„same-origin“." - -msgid "More information is available with DEBUG=True." -msgstr "Dalšne informacije su k dispoziciji z DEBUG=True." - -msgid "No year specified" -msgstr "Žedno lěto pódane" - -msgid "Date out of range" -msgstr "Datum zwenka wobcerka" - -msgid "No month specified" -msgstr "Žeden mjasec pódany" - -msgid "No day specified" -msgstr "Žeden źeń pódany" - -msgid "No week specified" -msgstr "Žeden tyźeń pódany" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Žedne %(verbose_name_plural)s k dispoziciji" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Pśichodne %(verbose_name_plural)s njejo k dispoziciji, dokulaž " -"%(class_name)s.allow_future jo False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Njepłaśiwy „%(format)s“ za datumowy znamuškowy rjeśazk „%(datestr)s“ pódany" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Žedno %(verbose_name)s namakane, kótarež wótpowědujo napšašowanjeju." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Bok njejo „last“, ani njedajo se do „int“ konwertěrowaś." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Njepłaśiwy bok (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Prozna lisćina a „%(class_name)s.allow_empty“ jo False." - -msgid "Directory indexes are not allowed here." -msgstr "Zapisowe indekse njejsu how dowólone." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ njeeksistěrujo" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacija jo była wuspěšna! Gratulacija!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Wersijowe informacije za Django " -"%(version)s pokazaś" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Wiźiśo toś ten bok, dokulaž DEBUG=True jo w swójej dataji nastajenjow a njejsćo " -"konfigurěrował URL." - -msgid "Django Documentation" -msgstr "Dokumentacija Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temy, reference a rozpokazanja" - -msgid "Tutorial: A Polling App" -msgstr "Rozpokazanje: Napšašowańske nałoženje" - -msgid "Get started with Django" -msgstr "Prědne kšace z Django" - -msgid "Django Community" -msgstr "Zgromaźeństwo Django" - -msgid "Connect, get help, or contribute" -msgstr "Zwězajśo, wobsarajśo se pomoc abo źěłajśo sobu" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index 1b07550..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/el/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index 003a36c..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,1332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Apostolis Bessas , 2013 -# Dimitris Glezos , 2011,2013,2017 -# Fotis Athineos , 2021 -# Giannis Meletakis , 2015 -# Jannis Leidel , 2011 -# Nick Mavrakis , 2017-2020 -# Nikolas Demiridis , 2014 -# Nick Mavrakis , 2016 -# Pãnoș , 2014 -# Pãnoș , 2016 -# Serafeim Papastefanos , 2016 -# Stavros Korokithakis , 2014,2016 -# Yorgos Pagles , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-18 21:19+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Αφρικάνς" - -msgid "Arabic" -msgstr "Αραβικά" - -msgid "Algerian Arabic" -msgstr "Αραβικά Αλγερίας" - -msgid "Asturian" -msgstr "Αστούριας" - -msgid "Azerbaijani" -msgstr "Γλώσσα Αζερμπαϊτζάν" - -msgid "Bulgarian" -msgstr "Βουλγαρικά" - -msgid "Belarusian" -msgstr "Λευκορώσικα" - -msgid "Bengali" -msgstr "Μπενγκάλι" - -msgid "Breton" -msgstr "Βρετονικά" - -msgid "Bosnian" -msgstr "Βοσνιακά" - -msgid "Catalan" -msgstr "Καταλανικά" - -msgid "Czech" -msgstr "Τσέχικα" - -msgid "Welsh" -msgstr "Ουαλικά" - -msgid "Danish" -msgstr "Δανέζικα" - -msgid "German" -msgstr "Γερμανικά" - -msgid "Lower Sorbian" -msgstr "Κάτω Σορβικά" - -msgid "Greek" -msgstr "Ελληνικά" - -msgid "English" -msgstr "Αγγλικά" - -msgid "Australian English" -msgstr "Αγγλικά Αυστραλίας" - -msgid "British English" -msgstr "Αγγλικά Βρετανίας" - -msgid "Esperanto" -msgstr "Εσπεράντο" - -msgid "Spanish" -msgstr "Ισπανικά" - -msgid "Argentinian Spanish" -msgstr "Ισπανικά Αργεντινής" - -msgid "Colombian Spanish" -msgstr "Ισπανικά Κολομβίας" - -msgid "Mexican Spanish" -msgstr "Μεξικανική διάλεκτος Ισπανικών" - -msgid "Nicaraguan Spanish" -msgstr "Ισπανικά Νικαράγουας " - -msgid "Venezuelan Spanish" -msgstr "Ισπανικά Βενεζουέλας" - -msgid "Estonian" -msgstr "Εσθονικά" - -msgid "Basque" -msgstr "Βάσκικα" - -msgid "Persian" -msgstr "Περσικά" - -msgid "Finnish" -msgstr "Φινλανδικά" - -msgid "French" -msgstr "Γαλλικά" - -msgid "Frisian" -msgstr "Frisian" - -msgid "Irish" -msgstr "Ιρλανδικά" - -msgid "Scottish Gaelic" -msgstr "Σκωτσέζικα Γαελικά" - -msgid "Galician" -msgstr "Γαελικά" - -msgid "Hebrew" -msgstr "Εβραϊκά" - -msgid "Hindi" -msgstr "Ινδικά" - -msgid "Croatian" -msgstr "Κροατικά" - -msgid "Upper Sorbian" -msgstr "Άνω Σορβικά" - -msgid "Hungarian" -msgstr "Ουγγρικά" - -msgid "Armenian" -msgstr "Αρμενικά" - -msgid "Interlingua" -msgstr "Ιντερλίνγκουα" - -msgid "Indonesian" -msgstr "Ινδονησιακά" - -msgid "Igbo" -msgstr "Ίγκμπο" - -msgid "Ido" -msgstr "Ίντο" - -msgid "Icelandic" -msgstr "Ισλανδικά" - -msgid "Italian" -msgstr "Ιταλικά" - -msgid "Japanese" -msgstr "Γιαπωνέζικα" - -msgid "Georgian" -msgstr "Γεωργιανά" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Καζακστά" - -msgid "Khmer" -msgstr "Χμερ" - -msgid "Kannada" -msgstr "Κανάντα" - -msgid "Korean" -msgstr "Κορεάτικα" - -msgid "Kyrgyz" -msgstr "Κιργιζικά" - -msgid "Luxembourgish" -msgstr "Λουξεμβουργιανά" - -msgid "Lithuanian" -msgstr "Λιθουανικά" - -msgid "Latvian" -msgstr "Λεττονικά" - -msgid "Macedonian" -msgstr "Μακεδονικά" - -msgid "Malayalam" -msgstr "Μαλαγιαλάμ" - -msgid "Mongolian" -msgstr "Μογγολικά" - -msgid "Marathi" -msgstr "Μαράθι" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Βιρμανικά" - -msgid "Norwegian Bokmål" -msgstr "Νορβηγικά Μποκμάλ" - -msgid "Nepali" -msgstr "Νεπαλέζικα" - -msgid "Dutch" -msgstr "Ολλανδικά" - -msgid "Norwegian Nynorsk" -msgstr "Νορβηγική διάλεκτος Nynorsk - Νεονορβηγική" - -msgid "Ossetic" -msgstr "Οσσετικά" - -msgid "Punjabi" -msgstr "Πουντζάμπι" - -msgid "Polish" -msgstr "Πολωνικά" - -msgid "Portuguese" -msgstr "Πορτογαλικά" - -msgid "Brazilian Portuguese" -msgstr "Πορτογαλικά - διάλεκτος Βραζιλίας" - -msgid "Romanian" -msgstr "Ρουμανικά" - -msgid "Russian" -msgstr "Ρωσικά" - -msgid "Slovak" -msgstr "Σλοβακικά" - -msgid "Slovenian" -msgstr "Σλοβενικά" - -msgid "Albanian" -msgstr "Αλβανικά" - -msgid "Serbian" -msgstr "Σερβικά" - -msgid "Serbian Latin" -msgstr "Σέρβικα Λατινικά" - -msgid "Swedish" -msgstr "Σουηδικά" - -msgid "Swahili" -msgstr "Σουαχίλι" - -msgid "Tamil" -msgstr "Διάλεκτος Ταμίλ" - -msgid "Telugu" -msgstr "Τελούγκου" - -msgid "Tajik" -msgstr "Τατζικικά" - -msgid "Thai" -msgstr "Ταϊλάνδης" - -msgid "Turkmen" -msgstr "Τουρκμενικά" - -msgid "Turkish" -msgstr "Τουρκικά" - -msgid "Tatar" -msgstr "Ταταρικά" - -msgid "Udmurt" -msgstr "Ουντμουρτικά" - -msgid "Ukrainian" -msgstr "Ουκρανικά" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Ουζμπεκικά" - -msgid "Vietnamese" -msgstr "Βιετναμέζικα" - -msgid "Simplified Chinese" -msgstr "Απλοποιημένα Κινέζικα" - -msgid "Traditional Chinese" -msgstr "Παραδοσιακά Κινέζικα" - -msgid "Messages" -msgstr "Μηνύματα" - -msgid "Site Maps" -msgstr "Χάρτες Ιστότοπου" - -msgid "Static Files" -msgstr "Στατικά Αρχεία" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Ο αριθμός αυτής της σελίδας δεν είναι ακέραιος" - -msgid "That page number is less than 1" -msgstr "Ο αριθμός αυτής της σελίδας είναι μικρότερος του 1" - -msgid "That page contains no results" -msgstr "Η σελίδα αυτή δεν περιέχει αποτελέσματα" - -msgid "Enter a valid value." -msgstr "Εισάγετε μια έγκυρη τιμή." - -msgid "Enter a valid URL." -msgstr "Εισάγετε ένα έγκυρο URL." - -msgid "Enter a valid integer." -msgstr "Εισάγετε έναν έγκυρο ακέραιο." - -msgid "Enter a valid email address." -msgstr "Εισάγετε μια έγκυρη διεύθυνση ηλ. ταχυδρομείου." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Εισάγετε ένα 'slug' που να αποτελείται από γράμματα, αριθμούς, παύλες ή κάτω " -"παύλες." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Εισάγετε ένα 'slug' που να αποτελείται από Unicode γράμματα, παύλες ή κάτω " -"παύλες." - -msgid "Enter a valid IPv4 address." -msgstr "Εισάγετε μια έγκυρη IPv4 διεύθυνση." - -msgid "Enter a valid IPv6 address." -msgstr "Εισάγετε μία έγκυρη IPv6 διεύθυνση" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Εισάγετε μία έγκυρη IPv4 ή IPv6 διεύθυνση" - -msgid "Enter only digits separated by commas." -msgstr "Εισάγετε μόνο ψηφία χωρισμένα με κόμματα." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Βεβαιωθείτε ότι η τιμή είναι %(limit_value)s (η τιμή που καταχωρήσατε είναι " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Βεβαιωθείτε ότι η τιμή είναι μικρότερη ή ίση από %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Βεβαιωθείτε ότι η τιμή είναι μεγαλύτερη ή ίση από %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Βεβαιωθείται πως η τιμή αυτή έχει τουλάχιστον %(limit_value)d χαρακτήρες " -"(έχει %(show_value)d)." -msgstr[1] "" -"Βεβαιωθείτε πως η τιμή έχει τουλάχιστον %(limit_value)d χαρακτήρες (έχει " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Βεβαιωθείται πως η τιμή αυτή έχει τοπολύ %(limit_value)d χαρακτήρες (έχει " -"%(show_value)d)." -msgstr[1] "" -"Βεβαιωθείτε πως η τιμή έχει το πολύ %(limit_value)d χαρακτήρες (έχει " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Εισάγετε έναν αριθμό." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -"Σιγουρευτείτε οτι τα σύνολο των ψηφίων δεν είναι παραπάνω από %(max)s" -msgstr[1] "" -"Σιγουρευτείτε οτι τα σύνολο των ψηφίων δεν είναι παραπάνω από %(max)s" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Σιγουρευτείτε ότι το δεκαδικό ψηφίο δεν είναι παραπάνω από %(max)s." -msgstr[1] "Σιγουρευτείτε ότι τα δεκαδικά ψηφία δεν είναι παραπάνω από %(max)s." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Βεβαιωθείτε ότι δεν υπάρχουν πάνω από %(max)s ψηφία πριν την υποδιαστολή." -msgstr[1] "" -"Βεβαιωθείτε ότι δεν υπάρχουν πάνω από %(max)s ψηφία πριν την υποδιαστολή." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Η επέκταση '%(extension)s' του αρχείου δεν επιτρέπεται. Οι επιτρεπόμενες " -"επεκτάσεις είναι: '%(allowed_extensions)s'." - -msgid "Null characters are not allowed." -msgstr "Δεν επιτρέπονται null (μηδενικοί) χαρακτήρες" - -msgid "and" -msgstr "και" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s με αυτή την %(field_labels)s υπάρχει ήδη." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Η τιμή %(value)r δεν είναι έγκυρη επιλογή." - -msgid "This field cannot be null." -msgstr "Το πεδίο αυτό δεν μπορεί να είναι μηδενικό (null)." - -msgid "This field cannot be blank." -msgstr "Το πεδίο αυτό δεν μπορεί να είναι κενό." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s με αυτό το %(field_label)s υπάρχει ήδη." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s πρέπει να είναι μοναδική για %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Πεδίο τύπου: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Η τιμή '%(value)s' πρέπει να είναι True ή False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Η τιμή '%(value)s' πρέπει να είναι True, False, ή None." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Είτε Αληθές ή Ψευδές)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Συμβολοσειρά (μέχρι %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Ακέραιοι χωρισμένοι με κόμματα" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Η τιμή του '%(value)s' έχει μια λανθασμένη μορφή ημερομηνίας. Η ημερομηνία " -"θα πρέπει να είναι στην μορφή YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Η τιμή '%(value)s' είναι στην σωστή μορφή (YYYY-MM-DD) αλλά είναι μια " -"λανθασμένη ημερομηνία." - -msgid "Date (without time)" -msgstr "Ημερομηνία (χωρίς την ώρα)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Η τιμή του '%(value)s' έχει μια λανθασμένη μορφή. Η ημερομηνία/ώρα θα πρέπει " -"να είναι στην μορφή YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Η τιμή '%(value)s' έχει τη σωστή μορφή (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"αλλά δεν αντιστοιχεί σε σωστή ημερομηνία και ώρα." - -msgid "Date (with time)" -msgstr "Ημερομηνία (με ώρα)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Η τιμή '%(value)s' πρέπει να είναι δεκαδικός αριθμός." - -msgid "Decimal number" -msgstr "Δεκαδικός αριθμός" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Η τιμή '%(value)s' έχει εσφαλμένη μορφή. Πρέπει να είναι της μορφής [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Διάρκεια" - -msgid "Email address" -msgstr "Ηλεκτρονική διεύθυνση" - -msgid "File path" -msgstr "Τοποθεσία αρχείου" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Η '%(value)s' τιμή πρέπει να είναι δεκαδικός." - -msgid "Floating point number" -msgstr "Αριθμός κινητής υποδιαστολής" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Η τιμή '%(value)s' πρέπει να είναι ακέραιος." - -msgid "Integer" -msgstr "Ακέραιος" - -msgid "Big (8 byte) integer" -msgstr "Μεγάλος ακέραιος - big integer (8 bytes)" - -msgid "Small integer" -msgstr "Μικρός ακέραιος" - -msgid "IPv4 address" -msgstr "Διεύθυνση IPv4" - -msgid "IP address" -msgstr "IP διεύθυνση" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Η τιμή '%(value)s' πρέπει να είναι None, True ή False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Αληθές, Ψευδές, ή τίποτα)" - -msgid "Positive big integer" -msgstr "Μεγάλος θετικός ακέραιος" - -msgid "Positive integer" -msgstr "Θετικός ακέραιος" - -msgid "Positive small integer" -msgstr "Θετικός μικρός ακέραιος" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (μέχρι %(max_length)s)" - -msgid "Text" -msgstr "Κείμενο" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Η τιμή '%(value)s' έχει εσφαλμένη μορφή. Πρέπει να είναι της μορφής HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Η τιμή '%(value)s' έχει τη σωστή μορφή (HH:MM[:ss[.uuuuuu]]) αλλά δεν " -"αντιστοιχή σε σωστή ώρα." - -msgid "Time" -msgstr "Ώρα" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Δυαδικά δεδομένα" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "'%(value)s' δεν είναι ένα έγκυρο UUID." - -msgid "Universally unique identifier" -msgstr "Καθολικά μοναδικό αναγνωριστικό" - -msgid "File" -msgstr "Αρχείο" - -msgid "Image" -msgstr "Εικόνα" - -msgid "A JSON object" -msgstr "Ένα αντικείμενο JSON" - -msgid "Value must be valid JSON." -msgstr "Η τιμή πρέπει να είναι έγκυρο JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"Το μοντέλο %(model)s με την τιμή %(value)r του πεδίου %(field)s δεν υπάρχει." - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (ο τύπος καθορίζεται από το πεδίο του συσχετισμού)" - -msgid "One-to-one relationship" -msgstr "Σχέση ένα-προς-ένα" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "σχέση %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "σχέσεις %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Σχέση πολλά-προς-πολλά" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Αυτό το πεδίο είναι απαραίτητο." - -msgid "Enter a whole number." -msgstr "Εισάγετε έναν ακέραιο αριθμό." - -msgid "Enter a valid date." -msgstr "Εισάγετε μια έγκυρη ημερομηνία." - -msgid "Enter a valid time." -msgstr "Εισάγετε μια έγκυρη ώρα." - -msgid "Enter a valid date/time." -msgstr "Εισάγετε μια έγκυρη ημερομηνία/ώρα." - -msgid "Enter a valid duration." -msgstr "Εισάγετε μια έγκυρη διάρκεια." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Ο αριθμός των ημερών πρέπει να είναι μεταξύ {min_days} και {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Δεν έχει υποβληθεί κάποιο αρχείο. Ελέγξτε τον τύπο κωδικοποίησης στη φόρμα." - -msgid "No file was submitted." -msgstr "Δεν υποβλήθηκε κάποιο αρχείο." - -msgid "The submitted file is empty." -msgstr "Το αρχείο που υποβλήθηκε είναι κενό." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Βεβαιωθείται πως το όνομα του αρχείου έχει το πολύ %(max)d χαρακτήρα (το " -"παρόν έχει %(length)d)." -msgstr[1] "" -"Βεβαιωθείται πως το όνομα του αρχείου έχει το πολύ %(max)d χαρακτήρα (το " -"παρόν έχει %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Βεβαιωθείτε ότι είτε έχετε επιλέξει ένα αρχείο για αποστολή είτε έχετε " -"επιλέξει την εκκαθάριση του πεδίου. Δεν είναι δυνατή η επιλογή και των δύο " -"ταυτοχρόνως." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Βεβαιωθείτε ότι το αρχείο που έχετε επιλέξει για αποστολή είναι αρχείο " -"εικόνας. Το τρέχον είτε δεν ήταν εικόνα είτε έχει υποστεί φθορά." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Βεβαιωθείτε ότι έχετε επιλέξει μία έγκυρη επιλογή. Η τιμή %(value)s δεν " -"είναι διαθέσιμη προς επιλογή." - -msgid "Enter a list of values." -msgstr "Εισάγετε μια λίστα τιμών." - -msgid "Enter a complete value." -msgstr "Εισάγετε μια πλήρης τιμή" - -msgid "Enter a valid UUID." -msgstr "Εισάγετε μια έγκυρη UUID." - -msgid "Enter a valid JSON." -msgstr "Εισάγετε ένα έγκυρο JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Κρυφό πεδίο %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Παρακαλώ υποβάλλετε το πολύ %d φόρμα." -msgstr[1] "Παρακαλώ υποβάλλετε το πολύ %d φόρμες." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Παρακαλώ υποβάλλετε τουλάχιστον %d φόρμα." -msgstr[1] "Παρακαλώ υποβάλλετε τουλάχιστον %d φόρμες." - -msgid "Order" -msgstr "Ταξινόμηση" - -msgid "Delete" -msgstr "Διαγραφή" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Στο %(field)s έχετε ξαναεισάγει τα ίδια δεδομένα." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Στο %(field)s έχετε ξαναεισάγει τα ίδια δεδομένα. Θα πρέπει να εμφανίζονται " -"μία φορά. " - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Στο %(field_name)s έχετε ξαναεισάγει τα ίδια δεδομένα. Θα πρέπει να " -"εμφανίζονται μία φορά για το %(lookup)s στο %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Έχετε ξαναεισάγει την ίδια τιμη. Βεβαιωθείτε ότι είναι μοναδική." - -msgid "The inline value did not match the parent instance." -msgstr "Η τιμή δεν είναι ίση με την αντίστοιχη τιμή του γονικού object." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Επιλέξτε μια έγκυρη επιλογή. Η επιλογή αυτή δεν είναι μία από τις διαθέσιμες " -"επιλογές." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" δεν είναι έγκυρη τιμή." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Η ημερομηνία %(datetime)s δεν μπόρεσε να μετατραπεί στην ζώνη ώρας " -"%(current_timezone)s. Ίσως να είναι ασαφής ή να μην υπάρχει." - -msgid "Clear" -msgstr "Εκκαθάριση" - -msgid "Currently" -msgstr "Τώρα" - -msgid "Change" -msgstr "Επεξεργασία" - -msgid "Unknown" -msgstr "Άγνωστο" - -msgid "Yes" -msgstr "Ναι" - -msgid "No" -msgstr "Όχι" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ναι,όχι,ίσως" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bytes" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "μμ." - -msgid "a.m." -msgstr "πμ." - -msgid "PM" -msgstr "ΜΜ" - -msgid "AM" -msgstr "ΠΜ" - -msgid "midnight" -msgstr "μεσάνυχτα" - -msgid "noon" -msgstr "μεσημέρι" - -msgid "Monday" -msgstr "Δευτέρα" - -msgid "Tuesday" -msgstr "Τρίτη" - -msgid "Wednesday" -msgstr "Τετάρτη" - -msgid "Thursday" -msgstr "Πέμπτη" - -msgid "Friday" -msgstr "Παρασκευή" - -msgid "Saturday" -msgstr "Σάββατο" - -msgid "Sunday" -msgstr "Κυριακή" - -msgid "Mon" -msgstr "Δευ" - -msgid "Tue" -msgstr "Τρί" - -msgid "Wed" -msgstr "Τετ" - -msgid "Thu" -msgstr "Πέμ" - -msgid "Fri" -msgstr "Παρ" - -msgid "Sat" -msgstr "Σαβ" - -msgid "Sun" -msgstr "Κυρ" - -msgid "January" -msgstr "Ιανουάριος" - -msgid "February" -msgstr "Φεβρουάριος" - -msgid "March" -msgstr "Μάρτιος" - -msgid "April" -msgstr "Απρίλιος" - -msgid "May" -msgstr "Μάιος" - -msgid "June" -msgstr "Ιούνιος" - -msgid "July" -msgstr "Ιούλιος" - -msgid "August" -msgstr "Αύγουστος" - -msgid "September" -msgstr "Σεπτέμβριος" - -msgid "October" -msgstr "Οκτώβριος" - -msgid "November" -msgstr "Νοέμβριος" - -msgid "December" -msgstr "Δεκέμβριος" - -msgid "jan" -msgstr "Ιαν" - -msgid "feb" -msgstr "Φεβ" - -msgid "mar" -msgstr "Μάρ" - -msgid "apr" -msgstr "Απρ" - -msgid "may" -msgstr "Μάι" - -msgid "jun" -msgstr "Ιούν" - -msgid "jul" -msgstr "Ιούλ" - -msgid "aug" -msgstr "Αύγ" - -msgid "sep" -msgstr "Σεπ" - -msgid "oct" -msgstr "Οκτ" - -msgid "nov" -msgstr "Νοέ" - -msgid "dec" -msgstr "Δεκ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ιαν." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Φεβ." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Μάρτιος" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Απρίλ." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Μάιος" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Ιούν." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Ιούλ." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Αύγ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Σεπτ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Οκτ." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Νοέμ." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Δεκ." - -msgctxt "alt. month" -msgid "January" -msgstr "Ιανουαρίου" - -msgctxt "alt. month" -msgid "February" -msgstr "Φεβρουαρίου" - -msgctxt "alt. month" -msgid "March" -msgstr "Μαρτίου" - -msgctxt "alt. month" -msgid "April" -msgstr "Απριλίου" - -msgctxt "alt. month" -msgid "May" -msgstr "Μαΐου" - -msgctxt "alt. month" -msgid "June" -msgstr "Ιουνίου" - -msgctxt "alt. month" -msgid "July" -msgstr "Ιουλίου" - -msgctxt "alt. month" -msgid "August" -msgstr "Αυγούστου" - -msgctxt "alt. month" -msgid "September" -msgstr "Σεπτεμβρίου" - -msgctxt "alt. month" -msgid "October" -msgstr "Οκτωβρίου" - -msgctxt "alt. month" -msgid "November" -msgstr "Νοεμβρίου" - -msgctxt "alt. month" -msgid "December" -msgstr "Δεκεμβρίου" - -msgid "This is not a valid IPv6 address." -msgstr "Αυτή δεν είναι έγκυρη διεύθυνση IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ή" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "Απαγορευμένο" - -msgid "CSRF verification failed. Request aborted." -msgstr "Η πιστοποίηση CSRF απέτυχε. Το αίτημα ματαιώθηκε." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Αν οι 'Referer' headers είναι απενεργοποιημένοι στον browser σας από εσάς, " -"παρακαλούμε να τους ξανά-ενεργοποιήσετε, τουλάχιστον για αυτό το site ή για " -"τις συνδέσεις HTTPS ή για τα 'same-origin' requests." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Αν χρησιμοποιείτε την ετικέτα ή συμπεριλαμβάνετε την κεφαλίδα (header) 'Referrer-Policy: no-referrer', " -"παρακαλούμε αφαιρέστε τα. Η προστασία CSRF απαιτεί την κεφαλίδα 'Referer' να " -"κάνει αυστηρό έλεγχο στον referer. Αν κύριο μέλημα σας είναι η ιδιωτικότητα, " -"σκεφτείτε να χρησιμοποιήσετε εναλλακτικές μεθόδους όπως για συνδέσμους από άλλες ιστοσελίδες." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Βλέπετε αυτό το μήνυμα επειδή αυτή η σελίδα απαιτεί ένα CSRF cookie, όταν " -"κατατίθενται φόρμες. Αυτό το cookie είναι απαραίτητο για λόγους ασφαλείας, " -"για να εξασφαλιστεί ότι ο browser δεν έχει γίνει hijacked από τρίτους." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Αν τα cookies είναι απενεργοποιημένα στον browser σας από εσάς, παρακαλούμε " -"να τα ξανά-ενεργοποιήσετε, τουλάχιστον για αυτό το site ή για τα 'same-" -"origin' requests." - -msgid "More information is available with DEBUG=True." -msgstr "Περισσότερες πληροφορίες είναι διαθέσιμες με DEBUG=True." - -msgid "No year specified" -msgstr "Δεν έχει οριστεί χρονιά" - -msgid "Date out of range" -msgstr "Ημερομηνία εκτός εύρους" - -msgid "No month specified" -msgstr "Δεν έχει οριστεί μήνας" - -msgid "No day specified" -msgstr "Δεν έχει οριστεί μέρα" - -msgid "No week specified" -msgstr "Δεν έχει οριστεί εβδομάδα" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Δεν υπάρχουν διαθέσιμα %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Μελλοντικά %(verbose_name_plural)s δεν είναι διαθέσιμα διότι δεν έχει τεθεί " -"το %(class_name)s.allow_future." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Λανθασμένη μορφή ημερομηνίας '%(datestr)s' για την επιλεγμένη μορφή " -"'%(format)s'" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Δεν βρέθηκαν %(verbose_name)s που να ικανοποιούν την αναζήτηση." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Η σελίδα δεν έχει την τιμή 'last' υποδηλώνοντας την τελευταία σελίδα, ούτε " -"μπορεί να μετατραπεί σε ακέραιο." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Άκυρη σελίδα (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Άδεια λίστα και το \"%(class_name)s.allow_empty\" είναι False." - -msgid "Directory indexes are not allowed here." -msgstr "Τα ευρετήρια καταλόγων δεν επιτρέπονται εδώ." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "Το \"%(path)s\" δεν υπάρχει" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Ευρετήριο του %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Η εγκατάσταση δούλεψε με επιτυχία! Συγχαρητήρια!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Δείτε τις σημειώσεις κυκλοφορίας για το " -"Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Βλέπετε αυτό το μήνυμα επειδή έχετε DEBUG=True στο αρχείο settings και δεν έχετε ρυθμίσει κανένα URL στο " -"αρχείο urls.py. Στρωθείτε στην δουλειά!" - -msgid "Django Documentation" -msgstr "Εγχειρίδιο Django" - -msgid "Topics, references, & how-to’s" -msgstr "Θέματα, αναφορές & \"πως να...\"" - -msgid "Tutorial: A Polling App" -msgstr "Εγχειρίδιο: Ένα App Ψηφοφορίας" - -msgid "Get started with Django" -msgstr "Ξεκινήστε με το Django" - -msgid "Django Community" -msgstr "Κοινότητα Django" - -msgid "Connect, get help, or contribute" -msgstr "Συνδεθείτε, λάβετε βοήθεια, ή συνεισφέρετε" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/el/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/el/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/el/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/el/formats.py deleted file mode 100644 index 25c8ef7..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/el/formats.py +++ /dev/null @@ -1,34 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d/m/Y" -TIME_FORMAT = "P" -DATETIME_FORMAT = "d/m/Y P" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y P" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%Y-%m-%d", # '2006-10-25' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 0d4c976..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index 766d973..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,1614 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: conf/global_settings.py:54 -msgid "Afrikaans" -msgstr "" - -#: conf/global_settings.py:55 -msgid "Arabic" -msgstr "" - -#: conf/global_settings.py:56 -msgid "Algerian Arabic" -msgstr "" - -#: conf/global_settings.py:57 -msgid "Asturian" -msgstr "" - -#: conf/global_settings.py:58 -msgid "Azerbaijani" -msgstr "" - -#: conf/global_settings.py:59 -msgid "Bulgarian" -msgstr "" - -#: conf/global_settings.py:60 -msgid "Belarusian" -msgstr "" - -#: conf/global_settings.py:61 -msgid "Bengali" -msgstr "" - -#: conf/global_settings.py:62 -msgid "Breton" -msgstr "" - -#: conf/global_settings.py:63 -msgid "Bosnian" -msgstr "" - -#: conf/global_settings.py:64 -msgid "Catalan" -msgstr "" - -#: conf/global_settings.py:65 -msgid "Central Kurdish (Sorani)" -msgstr "" - -#: conf/global_settings.py:66 -msgid "Czech" -msgstr "" - -#: conf/global_settings.py:67 -msgid "Welsh" -msgstr "" - -#: conf/global_settings.py:68 -msgid "Danish" -msgstr "" - -#: conf/global_settings.py:69 -msgid "German" -msgstr "" - -#: conf/global_settings.py:70 -msgid "Lower Sorbian" -msgstr "" - -#: conf/global_settings.py:71 -msgid "Greek" -msgstr "" - -#: conf/global_settings.py:72 -msgid "English" -msgstr "" - -#: conf/global_settings.py:73 -msgid "Australian English" -msgstr "" - -#: conf/global_settings.py:74 -msgid "British English" -msgstr "" - -#: conf/global_settings.py:75 -msgid "Esperanto" -msgstr "" - -#: conf/global_settings.py:76 -msgid "Spanish" -msgstr "" - -#: conf/global_settings.py:77 -msgid "Argentinian Spanish" -msgstr "" - -#: conf/global_settings.py:78 -msgid "Colombian Spanish" -msgstr "" - -#: conf/global_settings.py:79 -msgid "Mexican Spanish" -msgstr "" - -#: conf/global_settings.py:80 -msgid "Nicaraguan Spanish" -msgstr "" - -#: conf/global_settings.py:81 -msgid "Venezuelan Spanish" -msgstr "" - -#: conf/global_settings.py:82 -msgid "Estonian" -msgstr "" - -#: conf/global_settings.py:83 -msgid "Basque" -msgstr "" - -#: conf/global_settings.py:84 -msgid "Persian" -msgstr "" - -#: conf/global_settings.py:85 -msgid "Finnish" -msgstr "" - -#: conf/global_settings.py:86 -msgid "French" -msgstr "" - -#: conf/global_settings.py:87 -msgid "Frisian" -msgstr "" - -#: conf/global_settings.py:88 -msgid "Irish" -msgstr "" - -#: conf/global_settings.py:89 -msgid "Scottish Gaelic" -msgstr "" - -#: conf/global_settings.py:90 -msgid "Galician" -msgstr "" - -#: conf/global_settings.py:91 -msgid "Hebrew" -msgstr "" - -#: conf/global_settings.py:92 -msgid "Hindi" -msgstr "" - -#: conf/global_settings.py:93 -msgid "Croatian" -msgstr "" - -#: conf/global_settings.py:94 -msgid "Upper Sorbian" -msgstr "" - -#: conf/global_settings.py:95 -msgid "Hungarian" -msgstr "" - -#: conf/global_settings.py:96 -msgid "Armenian" -msgstr "" - -#: conf/global_settings.py:97 -msgid "Interlingua" -msgstr "" - -#: conf/global_settings.py:98 -msgid "Indonesian" -msgstr "" - -#: conf/global_settings.py:99 -msgid "Igbo" -msgstr "" - -#: conf/global_settings.py:100 -msgid "Ido" -msgstr "" - -#: conf/global_settings.py:101 -msgid "Icelandic" -msgstr "" - -#: conf/global_settings.py:102 -msgid "Italian" -msgstr "" - -#: conf/global_settings.py:103 -msgid "Japanese" -msgstr "" - -#: conf/global_settings.py:104 -msgid "Georgian" -msgstr "" - -#: conf/global_settings.py:105 -msgid "Kabyle" -msgstr "" - -#: conf/global_settings.py:106 -msgid "Kazakh" -msgstr "" - -#: conf/global_settings.py:107 -msgid "Khmer" -msgstr "" - -#: conf/global_settings.py:108 -msgid "Kannada" -msgstr "" - -#: conf/global_settings.py:109 -msgid "Korean" -msgstr "" - -#: conf/global_settings.py:110 -msgid "Kyrgyz" -msgstr "" - -#: conf/global_settings.py:111 -msgid "Luxembourgish" -msgstr "" - -#: conf/global_settings.py:112 -msgid "Lithuanian" -msgstr "" - -#: conf/global_settings.py:113 -msgid "Latvian" -msgstr "" - -#: conf/global_settings.py:114 -msgid "Macedonian" -msgstr "" - -#: conf/global_settings.py:115 -msgid "Malayalam" -msgstr "" - -#: conf/global_settings.py:116 -msgid "Mongolian" -msgstr "" - -#: conf/global_settings.py:117 -msgid "Marathi" -msgstr "" - -#: conf/global_settings.py:118 -msgid "Malay" -msgstr "" - -#: conf/global_settings.py:119 -msgid "Burmese" -msgstr "" - -#: conf/global_settings.py:120 -msgid "Norwegian Bokmål" -msgstr "" - -#: conf/global_settings.py:121 -msgid "Nepali" -msgstr "" - -#: conf/global_settings.py:122 -msgid "Dutch" -msgstr "" - -#: conf/global_settings.py:123 -msgid "Norwegian Nynorsk" -msgstr "" - -#: conf/global_settings.py:124 -msgid "Ossetic" -msgstr "" - -#: conf/global_settings.py:125 -msgid "Punjabi" -msgstr "" - -#: conf/global_settings.py:126 -msgid "Polish" -msgstr "" - -#: conf/global_settings.py:127 -msgid "Portuguese" -msgstr "" - -#: conf/global_settings.py:128 -msgid "Brazilian Portuguese" -msgstr "" - -#: conf/global_settings.py:129 -msgid "Romanian" -msgstr "" - -#: conf/global_settings.py:130 -msgid "Russian" -msgstr "" - -#: conf/global_settings.py:131 -msgid "Slovak" -msgstr "" - -#: conf/global_settings.py:132 -msgid "Slovenian" -msgstr "" - -#: conf/global_settings.py:133 -msgid "Albanian" -msgstr "" - -#: conf/global_settings.py:134 -msgid "Serbian" -msgstr "" - -#: conf/global_settings.py:135 -msgid "Serbian Latin" -msgstr "" - -#: conf/global_settings.py:136 -msgid "Swedish" -msgstr "" - -#: conf/global_settings.py:137 -msgid "Swahili" -msgstr "" - -#: conf/global_settings.py:138 -msgid "Tamil" -msgstr "" - -#: conf/global_settings.py:139 -msgid "Telugu" -msgstr "" - -#: conf/global_settings.py:140 -msgid "Tajik" -msgstr "" - -#: conf/global_settings.py:141 -msgid "Thai" -msgstr "" - -#: conf/global_settings.py:142 -msgid "Turkmen" -msgstr "" - -#: conf/global_settings.py:143 -msgid "Turkish" -msgstr "" - -#: conf/global_settings.py:144 -msgid "Tatar" -msgstr "" - -#: conf/global_settings.py:145 -msgid "Udmurt" -msgstr "" - -#: conf/global_settings.py:146 -msgid "Uyghur" -msgstr "" - -#: conf/global_settings.py:147 -msgid "Ukrainian" -msgstr "" - -#: conf/global_settings.py:148 -msgid "Urdu" -msgstr "" - -#: conf/global_settings.py:149 -msgid "Uzbek" -msgstr "" - -#: conf/global_settings.py:150 -msgid "Vietnamese" -msgstr "" - -#: conf/global_settings.py:151 -msgid "Simplified Chinese" -msgstr "" - -#: conf/global_settings.py:152 -msgid "Traditional Chinese" -msgstr "" - -#: contrib/messages/apps.py:16 -msgid "Messages" -msgstr "" - -#: contrib/sitemaps/apps.py:8 -msgid "Site Maps" -msgstr "" - -#: contrib/staticfiles/apps.py:9 -msgid "Static Files" -msgstr "" - -#: contrib/syndication/apps.py:7 -msgid "Syndication" -msgstr "" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -#: core/paginator.py:30 -msgid "…" -msgstr "" - -#: core/paginator.py:32 -msgid "That page number is not an integer" -msgstr "" - -#: core/paginator.py:33 -msgid "That page number is less than 1" -msgstr "" - -#: core/paginator.py:34 -msgid "That page contains no results" -msgstr "" - -#: core/validators.py:21 -msgid "Enter a valid value." -msgstr "" - -#: core/validators.py:69 -msgid "Enter a valid domain name." -msgstr "" - -#: core/validators.py:152 forms/fields.py:775 -msgid "Enter a valid URL." -msgstr "" - -#: core/validators.py:199 -msgid "Enter a valid integer." -msgstr "" - -#: core/validators.py:210 -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -#: core/validators.py:288 -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -#: core/validators.py:296 -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -#: core/validators.py:308 core/validators.py:317 core/validators.py:331 -#: db/models/fields/__init__.py:2220 -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "" - -#: core/validators.py:310 -msgid "IPv4" -msgstr "" - -#: core/validators.py:319 utils/ipv6.py:43 -msgid "IPv6" -msgstr "" - -#: core/validators.py:333 -msgid "IPv4 or IPv6" -msgstr "" - -#: core/validators.py:374 -msgid "Enter only digits separated by commas." -msgstr "" - -#: core/validators.py:380 -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#: core/validators.py:415 -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#: core/validators.py:424 -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#: core/validators.py:433 -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#: core/validators.py:440 -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#: core/validators.py:472 -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:490 -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:513 forms/fields.py:366 forms/fields.py:405 -msgid "Enter a number." -msgstr "" - -#: core/validators.py:515 -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:520 -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:525 -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:596 -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -#: core/validators.py:658 -msgid "Null characters are not allowed." -msgstr "" - -#: db/models/base.py:1600 forms/models.py:908 -msgid "and" -msgstr "" - -#: db/models/base.py:1602 -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#: db/models/constraints.py:22 -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#: db/models/fields/__init__.py:134 -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -#: db/models/fields/__init__.py:135 -msgid "This field cannot be null." -msgstr "" - -#: db/models/fields/__init__.py:136 -msgid "This field cannot be blank." -msgstr "" - -#: db/models/fields/__init__.py:137 -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#: db/models/fields/__init__.py:141 -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#: db/models/fields/__init__.py:180 -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#: db/models/fields/__init__.py:1162 -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#: db/models/fields/__init__.py:1163 -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -#: db/models/fields/__init__.py:1165 -msgid "Boolean (Either True or False)" -msgstr "" - -#: db/models/fields/__init__.py:1215 -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -#: db/models/fields/__init__.py:1217 -msgid "String (unlimited)" -msgstr "" - -#: db/models/fields/__init__.py:1326 -msgid "Comma-separated integers" -msgstr "" - -#: db/models/fields/__init__.py:1427 -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#: db/models/fields/__init__.py:1431 db/models/fields/__init__.py:1566 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -#: db/models/fields/__init__.py:1435 -msgid "Date (without time)" -msgstr "" - -#: db/models/fields/__init__.py:1562 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#: db/models/fields/__init__.py:1570 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -#: db/models/fields/__init__.py:1575 -msgid "Date (with time)" -msgstr "" - -#: db/models/fields/__init__.py:1702 -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -#: db/models/fields/__init__.py:1704 -msgid "Decimal number" -msgstr "" - -#: db/models/fields/__init__.py:1864 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -#: db/models/fields/__init__.py:1868 -msgid "Duration" -msgstr "" - -#: db/models/fields/__init__.py:1920 -msgid "Email address" -msgstr "" - -#: db/models/fields/__init__.py:1945 -msgid "File path" -msgstr "" - -#: db/models/fields/__init__.py:2023 -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -#: db/models/fields/__init__.py:2025 -msgid "Floating point number" -msgstr "" - -#: db/models/fields/__init__.py:2065 -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -#: db/models/fields/__init__.py:2067 -msgid "Integer" -msgstr "" - -#: db/models/fields/__init__.py:2163 -msgid "Big (8 byte) integer" -msgstr "" - -#: db/models/fields/__init__.py:2180 -msgid "Small integer" -msgstr "" - -#: db/models/fields/__init__.py:2188 -msgid "IPv4 address" -msgstr "" - -#: db/models/fields/__init__.py:2219 -msgid "IP address" -msgstr "" - -#: db/models/fields/__init__.py:2310 db/models/fields/__init__.py:2311 -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -#: db/models/fields/__init__.py:2313 -msgid "Boolean (Either True, False or None)" -msgstr "" - -#: db/models/fields/__init__.py:2364 -msgid "Positive big integer" -msgstr "" - -#: db/models/fields/__init__.py:2379 -msgid "Positive integer" -msgstr "" - -#: db/models/fields/__init__.py:2394 -msgid "Positive small integer" -msgstr "" - -#: db/models/fields/__init__.py:2410 -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -#: db/models/fields/__init__.py:2446 -msgid "Text" -msgstr "" - -#: db/models/fields/__init__.py:2526 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#: db/models/fields/__init__.py:2530 -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -#: db/models/fields/__init__.py:2534 -msgid "Time" -msgstr "" - -#: db/models/fields/__init__.py:2642 -msgid "URL" -msgstr "" - -#: db/models/fields/__init__.py:2666 -msgid "Raw binary data" -msgstr "" - -#: db/models/fields/__init__.py:2731 -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -#: db/models/fields/__init__.py:2733 -msgid "Universally unique identifier" -msgstr "" - -#: db/models/fields/files.py:244 -msgid "File" -msgstr "" - -#: db/models/fields/files.py:420 -msgid "Image" -msgstr "" - -#: db/models/fields/json.py:24 -msgid "A JSON object" -msgstr "" - -#: db/models/fields/json.py:26 -msgid "Value must be valid JSON." -msgstr "" - -#: db/models/fields/related.py:978 -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -#: db/models/fields/related.py:981 -msgid "Foreign Key (type determined by related field)" -msgstr "" - -#: db/models/fields/related.py:1275 -msgid "One-to-one relationship" -msgstr "" - -#: db/models/fields/related.py:1332 -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#: db/models/fields/related.py:1334 -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -#: db/models/fields/related.py:1382 -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the label -#: forms/boundfield.py:185 -msgid ":?.!" -msgstr "" - -#: forms/fields.py:95 -msgid "This field is required." -msgstr "" - -#: forms/fields.py:315 -msgid "Enter a whole number." -msgstr "" - -#: forms/fields.py:486 forms/fields.py:1267 -msgid "Enter a valid date." -msgstr "" - -#: forms/fields.py:509 forms/fields.py:1268 -msgid "Enter a valid time." -msgstr "" - -#: forms/fields.py:536 -msgid "Enter a valid date/time." -msgstr "" - -#: forms/fields.py:570 -msgid "Enter a valid duration." -msgstr "" - -#: forms/fields.py:571 -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -#: forms/fields.py:640 -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -#: forms/fields.py:641 -msgid "No file was submitted." -msgstr "" - -#: forms/fields.py:642 -msgid "The submitted file is empty." -msgstr "" - -#: forms/fields.py:644 -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -#: forms/fields.py:649 -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -#: forms/fields.py:717 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#: forms/fields.py:889 forms/fields.py:975 forms/models.py:1592 -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -#: forms/fields.py:977 forms/fields.py:1096 forms/models.py:1590 -msgid "Enter a list of values." -msgstr "" - -#: forms/fields.py:1097 -msgid "Enter a complete value." -msgstr "" - -#: forms/fields.py:1339 -msgid "Enter a valid UUID." -msgstr "" - -#: forms/fields.py:1369 -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -#: forms/forms.py:97 -msgid ":" -msgstr "" - -#: forms/forms.py:239 -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#: forms/formsets.py:61 -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#: forms/formsets.py:65 -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: forms/formsets.py:70 -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: forms/formsets.py:484 forms/formsets.py:491 -msgid "Order" -msgstr "" - -#: forms/formsets.py:499 -msgid "Delete" -msgstr "" - -#: forms/models.py:901 -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#: forms/models.py:906 -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#: forms/models.py:913 -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -#: forms/models.py:922 -msgid "Please correct the duplicate values below." -msgstr "" - -#: forms/models.py:1359 -msgid "The inline value did not match the parent instance." -msgstr "" - -#: forms/models.py:1450 -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#: forms/models.py:1594 -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#: forms/utils.py:229 -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -#: forms/widgets.py:527 -msgid "Clear" -msgstr "" - -#: forms/widgets.py:528 -msgid "Currently" -msgstr "" - -#: forms/widgets.py:529 -msgid "Change" -msgstr "" - -#: forms/widgets.py:866 -msgid "Unknown" -msgstr "" - -#: forms/widgets.py:867 -msgid "Yes" -msgstr "" - -#: forms/widgets.py:868 -msgid "No" -msgstr "" - -#. Translators: Please do not add spaces around commas. -#: template/defaultfilters.py:873 -msgid "yes,no,maybe" -msgstr "" - -#: template/defaultfilters.py:903 template/defaultfilters.py:920 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: template/defaultfilters.py:922 -#, python-format -msgid "%s KB" -msgstr "" - -#: template/defaultfilters.py:924 -#, python-format -msgid "%s MB" -msgstr "" - -#: template/defaultfilters.py:926 -#, python-format -msgid "%s GB" -msgstr "" - -#: template/defaultfilters.py:928 -#, python-format -msgid "%s TB" -msgstr "" - -#: template/defaultfilters.py:930 -#, python-format -msgid "%s PB" -msgstr "" - -#: utils/dateformat.py:74 -msgid "p.m." -msgstr "" - -#: utils/dateformat.py:75 -msgid "a.m." -msgstr "" - -#: utils/dateformat.py:80 -msgid "PM" -msgstr "" - -#: utils/dateformat.py:81 -msgid "AM" -msgstr "" - -#: utils/dateformat.py:153 -msgid "midnight" -msgstr "" - -#: utils/dateformat.py:155 -msgid "noon" -msgstr "" - -#: utils/dates.py:7 -msgid "Monday" -msgstr "" - -#: utils/dates.py:8 -msgid "Tuesday" -msgstr "" - -#: utils/dates.py:9 -msgid "Wednesday" -msgstr "" - -#: utils/dates.py:10 -msgid "Thursday" -msgstr "" - -#: utils/dates.py:11 -msgid "Friday" -msgstr "" - -#: utils/dates.py:12 -msgid "Saturday" -msgstr "" - -#: utils/dates.py:13 -msgid "Sunday" -msgstr "" - -#: utils/dates.py:16 -msgid "Mon" -msgstr "" - -#: utils/dates.py:17 -msgid "Tue" -msgstr "" - -#: utils/dates.py:18 -msgid "Wed" -msgstr "" - -#: utils/dates.py:19 -msgid "Thu" -msgstr "" - -#: utils/dates.py:20 -msgid "Fri" -msgstr "" - -#: utils/dates.py:21 -msgid "Sat" -msgstr "" - -#: utils/dates.py:22 -msgid "Sun" -msgstr "" - -#: utils/dates.py:25 -msgid "January" -msgstr "" - -#: utils/dates.py:26 -msgid "February" -msgstr "" - -#: utils/dates.py:27 -msgid "March" -msgstr "" - -#: utils/dates.py:28 -msgid "April" -msgstr "" - -#: utils/dates.py:29 -msgid "May" -msgstr "" - -#: utils/dates.py:30 -msgid "June" -msgstr "" - -#: utils/dates.py:31 -msgid "July" -msgstr "" - -#: utils/dates.py:32 -msgid "August" -msgstr "" - -#: utils/dates.py:33 -msgid "September" -msgstr "" - -#: utils/dates.py:34 -msgid "October" -msgstr "" - -#: utils/dates.py:35 -msgid "November" -msgstr "" - -#: utils/dates.py:36 -msgid "December" -msgstr "" - -#: utils/dates.py:39 -msgid "jan" -msgstr "" - -#: utils/dates.py:40 -msgid "feb" -msgstr "" - -#: utils/dates.py:41 -msgid "mar" -msgstr "" - -#: utils/dates.py:42 -msgid "apr" -msgstr "" - -#: utils/dates.py:43 -msgid "may" -msgstr "" - -#: utils/dates.py:44 -msgid "jun" -msgstr "" - -#: utils/dates.py:45 -msgid "jul" -msgstr "" - -#: utils/dates.py:46 -msgid "aug" -msgstr "" - -#: utils/dates.py:47 -msgid "sep" -msgstr "" - -#: utils/dates.py:48 -msgid "oct" -msgstr "" - -#: utils/dates.py:49 -msgid "nov" -msgstr "" - -#: utils/dates.py:50 -msgid "dec" -msgstr "" - -#: utils/dates.py:53 -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -#: utils/dates.py:54 -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -#: utils/dates.py:55 -msgctxt "abbrev. month" -msgid "March" -msgstr "" - -#: utils/dates.py:56 -msgctxt "abbrev. month" -msgid "April" -msgstr "" - -#: utils/dates.py:57 -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -#: utils/dates.py:58 -msgctxt "abbrev. month" -msgid "June" -msgstr "" - -#: utils/dates.py:59 -msgctxt "abbrev. month" -msgid "July" -msgstr "" - -#: utils/dates.py:60 -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -#: utils/dates.py:61 -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -#: utils/dates.py:62 -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -#: utils/dates.py:63 -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -#: utils/dates.py:64 -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -#: utils/dates.py:67 -msgctxt "alt. month" -msgid "January" -msgstr "" - -#: utils/dates.py:68 -msgctxt "alt. month" -msgid "February" -msgstr "" - -#: utils/dates.py:69 -msgctxt "alt. month" -msgid "March" -msgstr "" - -#: utils/dates.py:70 -msgctxt "alt. month" -msgid "April" -msgstr "" - -#: utils/dates.py:71 -msgctxt "alt. month" -msgid "May" -msgstr "" - -#: utils/dates.py:72 -msgctxt "alt. month" -msgid "June" -msgstr "" - -#: utils/dates.py:73 -msgctxt "alt. month" -msgid "July" -msgstr "" - -#: utils/dates.py:74 -msgctxt "alt. month" -msgid "August" -msgstr "" - -#: utils/dates.py:75 -msgctxt "alt. month" -msgid "September" -msgstr "" - -#: utils/dates.py:76 -msgctxt "alt. month" -msgid "October" -msgstr "" - -#: utils/dates.py:77 -msgctxt "alt. month" -msgid "November" -msgstr "" - -#: utils/dates.py:78 -msgctxt "alt. month" -msgid "December" -msgstr "" - -#: utils/ipv6.py:20 -msgid "This is not a valid IPv6 address." -msgstr "" - -#: utils/text.py:67 -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -#: utils/text.py:278 -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -#: utils/text.py:297 utils/timesince.py:135 -msgid ", " -msgstr "" - -#: utils/timesince.py:8 -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#: utils/timesince.py:9 -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#: utils/timesince.py:10 -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#: utils/timesince.py:11 -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#: utils/timesince.py:12 -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#: utils/timesince.py:13 -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -#: views/csrf.py:29 -msgid "Forbidden" -msgstr "" - -#: views/csrf.py:30 -msgid "CSRF verification failed. Request aborted." -msgstr "" - -#: views/csrf.py:34 -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -#: views/csrf.py:40 -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -#: views/csrf.py:45 -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -#: views/csrf.py:54 -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -#: views/csrf.py:60 -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -#: views/csrf.py:66 -msgid "More information is available with DEBUG=True." -msgstr "" - -#: views/generic/dates.py:44 -msgid "No year specified" -msgstr "" - -#: views/generic/dates.py:64 views/generic/dates.py:115 -#: views/generic/dates.py:214 -msgid "Date out of range" -msgstr "" - -#: views/generic/dates.py:94 -msgid "No month specified" -msgstr "" - -#: views/generic/dates.py:147 -msgid "No day specified" -msgstr "" - -#: views/generic/dates.py:194 -msgid "No week specified" -msgstr "" - -#: views/generic/dates.py:353 views/generic/dates.py:384 -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#: views/generic/dates.py:680 -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#: views/generic/dates.py:720 -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#: views/generic/detail.py:56 -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -#: views/generic/list.py:70 -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#: views/generic/list.py:77 -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#: views/generic/list.py:173 -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -#: views/static.py:49 -msgid "Directory indexes are not allowed here." -msgstr "" - -#: views/static.py:51 -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#: views/static.py:68 views/templates/directory_index.html:8 -#: views/templates/directory_index.html:11 -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -#: views/templates/default_urlconf.html:7 -#: views/templates/default_urlconf.html:204 -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#: views/templates/default_urlconf.html:206 -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#: views/templates/default_urlconf.html:208 -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" - -#: views/templates/default_urlconf.html:217 -msgid "Django Documentation" -msgstr "" - -#: views/templates/default_urlconf.html:218 -msgid "Topics, references, & how-to’s" -msgstr "" - -#: views/templates/default_urlconf.html:226 -msgid "Tutorial: A Polling App" -msgstr "" - -#: views/templates/default_urlconf.html:227 -msgid "Get started with Django" -msgstr "" - -#: views/templates/default_urlconf.html:235 -msgid "Django Community" -msgstr "" - -#: views/templates/default_urlconf.html:236 -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/en/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/en/formats.py deleted file mode 100644 index f9d143b..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/en/formats.py +++ /dev/null @@ -1,65 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date - -# Formatting for date objects. -DATE_FORMAT = "N j, Y" -# Formatting for time objects. -TIME_FORMAT = "P" -# Formatting for datetime objects. -DATETIME_FORMAT = "N j, Y, P" -# Formatting for date objects when only the year and month are relevant. -YEAR_MONTH_FORMAT = "F Y" -# Formatting for date objects when only the month and day are relevant. -MONTH_DAY_FORMAT = "F j" -# Short formatting for date objects. -SHORT_DATE_FORMAT = "m/d/Y" -# Short formatting for datetime objects. -SHORT_DATETIME_FORMAT = "m/d/Y P" -# First day of week, to be used on calendars. -# 0 means Sunday, 1 means Monday... -FIRST_DAY_OF_WEEK = 0 - -# Formats to be used when parsing dates from input boxes, in order. -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Note that these format strings are different from the ones to display dates. -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' - "%b %d %Y", # 'Oct 25 2006' - "%b %d, %Y", # 'Oct 25, 2006' - "%d %b %Y", # '25 Oct 2006' - "%d %b, %Y", # '25 Oct, 2006' - "%B %d %Y", # 'October 25 2006' - "%B %d, %Y", # 'October 25, 2006' - "%d %B %Y", # '25 October 2006' - "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' -] - -# Decimal separator symbol. -DECIMAL_SEPARATOR = "." -# Thousand separator symbol. -THOUSAND_SEPARATOR = "," -# Number of digits that will be together, when splitting them by -# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands. -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index d31b977..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index a0a3ed8..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,1299 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2014 -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-18 21:19+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabic" - -msgid "Algerian Arabic" -msgstr "Algerian Arabic" - -msgid "Asturian" -msgstr "Asturian" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bulgarian" -msgstr "Bulgarian" - -msgid "Belarusian" -msgstr "Belarusian" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosnian" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Czech" -msgstr "Czech" - -msgid "Welsh" -msgstr "Welsh" - -msgid "Danish" -msgstr "Danish" - -msgid "German" -msgstr "German" - -msgid "Lower Sorbian" -msgstr "Lower Sorbian" - -msgid "Greek" -msgstr "Greek" - -msgid "English" -msgstr "English" - -msgid "Australian English" -msgstr "Australian English" - -msgid "British English" -msgstr "British English" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanish" - -msgid "Argentinian Spanish" -msgstr "Argentinian Spanish" - -msgid "Colombian Spanish" -msgstr "Colombian Spanish" - -msgid "Mexican Spanish" -msgstr "Mexican Spanish" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguan Spanish" - -msgid "Venezuelan Spanish" -msgstr "Venezuelan Spanish" - -msgid "Estonian" -msgstr "Estonian" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Persian" - -msgid "Finnish" -msgstr "Finnish" - -msgid "French" -msgstr "French" - -msgid "Frisian" -msgstr "Frisian" - -msgid "Irish" -msgstr "Irish" - -msgid "Scottish Gaelic" -msgstr "Scottish Gaelic" - -msgid "Galician" -msgstr "Galician" - -msgid "Hebrew" -msgstr "Hebrew" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croatian" - -msgid "Upper Sorbian" -msgstr "Upper Sorbian" - -msgid "Hungarian" -msgstr "Hungarian" - -msgid "Armenian" -msgstr "Armenian" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesian" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Icelandic" - -msgid "Italian" -msgstr "Italian" - -msgid "Japanese" -msgstr "Japanese" - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Korean" - -msgid "Kyrgyz" -msgstr "Kyrgyz" - -msgid "Luxembourgish" -msgstr "Luxembourgish" - -msgid "Lithuanian" -msgstr "Lithuanian" - -msgid "Latvian" -msgstr "Latvian" - -msgid "Macedonian" -msgstr "Macedonian" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolian" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Burmese" - -msgid "Norwegian Bokmål" -msgstr "Norwegian Bokmål" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Dutch" - -msgid "Norwegian Nynorsk" -msgstr "Norwegian Nynorsk" - -msgid "Ossetic" -msgstr "Ossetic" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polish" - -msgid "Portuguese" -msgstr "Portuguese" - -msgid "Brazilian Portuguese" -msgstr "Brazilian Portuguese" - -msgid "Romanian" -msgstr "Romanian" - -msgid "Russian" -msgstr "Russian" - -msgid "Slovak" -msgstr "Slovak" - -msgid "Slovenian" -msgstr "Slovenian" - -msgid "Albanian" -msgstr "Albanian" - -msgid "Serbian" -msgstr "Serbian" - -msgid "Serbian Latin" -msgstr "Serbian Latin" - -msgid "Swedish" -msgstr "Swedish" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmen" - -msgid "Turkish" -msgstr "Turkish" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Ukrainian" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbek" - -msgid "Vietnamese" -msgstr "Vietnamese" - -msgid "Simplified Chinese" -msgstr "Simplified Chinese" - -msgid "Traditional Chinese" -msgstr "Traditional Chinese" - -msgid "Messages" -msgstr "Messages" - -msgid "Site Maps" -msgstr "Site Maps" - -msgid "Static Files" -msgstr "Static Files" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "That page number is not an integer" - -msgid "That page number is less than 1" -msgstr "That page number is less than 1" - -msgid "That page contains no results" -msgstr "That page contains no results" - -msgid "Enter a valid value." -msgstr "Enter a valid value." - -msgid "Enter a valid URL." -msgstr "Enter a valid URL." - -msgid "Enter a valid integer." -msgstr "Enter a valid integer." - -msgid "Enter a valid email address." -msgstr "Enter a valid email address." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." - -msgid "Enter a valid IPv4 address." -msgstr "Enter a valid IPv4 address." - -msgid "Enter a valid IPv6 address." -msgstr "Enter a valid IPv6 address." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Enter a valid IPv4 or IPv6 address." - -msgid "Enter only digits separated by commas." -msgstr "Enter only digits separated by commas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Ensure this value is %(limit_value)s (it is %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ensure this value is less than or equal to %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ensure this value is greater than or equal to %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgstr[1] "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgstr[1] "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Enter a number." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Ensure that there are no more than %(max)s digit in total." -msgstr[1] "Ensure that there are no more than %(max)s digits in total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Ensure that there are no more than %(max)s decimal place." -msgstr[1] "Ensure that there are no more than %(max)s decimal places." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgstr[1] "" -"Ensure that there are no more than %(max)s digits before the decimal point." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null characters are not allowed." - -msgid "and" -msgstr "and" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s with this %(field_labels)s already exists." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Value %(value)r is not a valid choice." - -msgid "This field cannot be null." -msgstr "This field cannot be null." - -msgid "This field cannot be blank." -msgstr "This field cannot be blank." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s with this %(field_label)s already exists." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Field of type: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” value must be either True or False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” value must be either True, False, or None." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Either True or False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (up to %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Comma-separated integers" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." - -msgid "Date (without time)" -msgstr "Date (without time)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." - -msgid "Date (with time)" -msgstr "Date (with time)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” value must be a decimal number." - -msgid "Decimal number" -msgstr "Decimal number" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." - -msgid "Duration" -msgstr "Duration" - -msgid "Email address" -msgstr "Email address" - -msgid "File path" -msgstr "File path" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” value must be a float." - -msgid "Floating point number" -msgstr "Floating point number" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” value must be an integer." - -msgid "Integer" -msgstr "Integer" - -msgid "Big (8 byte) integer" -msgstr "Big (8 byte) integer" - -msgid "Small integer" -msgstr "Small integer" - -msgid "IPv4 address" -msgstr "IPv4 address" - -msgid "IP address" -msgstr "IP address" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” value must be either None, True or False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Either True, False or None)" - -msgid "Positive big integer" -msgstr "Positive big integer" - -msgid "Positive integer" -msgstr "Positive integer" - -msgid "Positive small integer" -msgstr "Positive small integer" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (up to %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." - -msgid "Time" -msgstr "Time" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Raw binary data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” is not a valid UUID." - -msgid "Universally unique identifier" -msgstr "Universally unique identifier" - -msgid "File" -msgstr "File" - -msgid "Image" -msgstr "Image" - -msgid "A JSON object" -msgstr "A JSON object" - -msgid "Value must be valid JSON." -msgstr "Value must be valid JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s instance with %(field)s %(value)r does not exist." - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (type determined by related field)" - -msgid "One-to-one relationship" -msgstr "One-to-one relationship" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s relationship" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s relationships" - -msgid "Many-to-many relationship" -msgstr "Many-to-many relationship" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "This field is required." - -msgid "Enter a whole number." -msgstr "Enter a whole number." - -msgid "Enter a valid date." -msgstr "Enter a valid date." - -msgid "Enter a valid time." -msgstr "Enter a valid time." - -msgid "Enter a valid date/time." -msgstr "Enter a valid date/time." - -msgid "Enter a valid duration." -msgstr "Enter a valid duration." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "The number of days must be between {min_days} and {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "No file was submitted. Check the encoding type on the form." - -msgid "No file was submitted." -msgstr "No file was submitted." - -msgid "The submitted file is empty." -msgstr "The submitted file is empty." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Ensure this filename has at most %(max)d character (it has %(length)d)." -msgstr[1] "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Please either submit a file or check the clear checkbox, not both." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Select a valid choice. %(value)s is not one of the available choices." - -msgid "Enter a list of values." -msgstr "Enter a list of values." - -msgid "Enter a complete value." -msgstr "Enter a complete value." - -msgid "Enter a valid UUID." -msgstr "Enter a valid UUID." - -msgid "Enter a valid JSON." -msgstr "Enter a valid JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Hidden field %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Please submit at most %d form." -msgstr[1] "Please submit at most %d forms." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Please submit at least %d form." -msgstr[1] "Please submit at least %d forms." - -msgid "Order" -msgstr "Order" - -msgid "Delete" -msgstr "Delete" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Please correct the duplicate data for %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Please correct the duplicate data for %(field)s, which must be unique." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Please correct the duplicate values below." - -msgid "The inline value did not match the parent instance." -msgstr "The inline value did not match the parent instance." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Select a valid choice. That choice is not one of the available choices." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” is not a valid value." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." - -msgid "Clear" -msgstr "Clear" - -msgid "Currently" -msgstr "Currently" - -msgid "Change" -msgstr "Change" - -msgid "Unknown" -msgstr "Unknown" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "yes,no,maybe" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "midnight" - -msgid "noon" -msgstr "noon" - -msgid "Monday" -msgstr "Monday" - -msgid "Tuesday" -msgstr "Tuesday" - -msgid "Wednesday" -msgstr "Wednesday" - -msgid "Thursday" -msgstr "Thursday" - -msgid "Friday" -msgstr "Friday" - -msgid "Saturday" -msgstr "Saturday" - -msgid "Sunday" -msgstr "Sunday" - -msgid "Mon" -msgstr "Mon" - -msgid "Tue" -msgstr "Tue" - -msgid "Wed" -msgstr "Wed" - -msgid "Thu" -msgstr "Thu" - -msgid "Fri" -msgstr "Fri" - -msgid "Sat" -msgstr "Sat" - -msgid "Sun" -msgstr "Sun" - -msgid "January" -msgstr "January" - -msgid "February" -msgstr "February" - -msgid "March" -msgstr "March" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "June" - -msgid "July" -msgstr "July" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "October" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "December" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "March" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month" -msgid "June" -msgstr "June" - -msgctxt "abbrev. month" -msgid "July" -msgstr "July" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "January" - -msgctxt "alt. month" -msgid "February" -msgstr "February" - -msgctxt "alt. month" -msgid "March" -msgstr "March" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "May" - -msgctxt "alt. month" -msgid "June" -msgstr "June" - -msgctxt "alt. month" -msgid "July" -msgstr "July" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "October" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "This is not a valid IPv6 address." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "or" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "Forbidden" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF verification failed. Request aborted." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." - -msgid "More information is available with DEBUG=True." -msgstr "More information is available with DEBUG=True." - -msgid "No year specified" -msgstr "No year specified" - -msgid "Date out of range" -msgstr "Date out of range" - -msgid "No month specified" -msgstr "No month specified" - -msgid "No day specified" -msgstr "No day specified" - -msgid "No week specified" -msgstr "No week specified" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No %(verbose_name_plural)s available" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Invalid date string “%(datestr)s” given format “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No %(verbose_name)s found matching the query" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Page is not “last”, nor can it be converted to an int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Invalid page (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Empty list and “%(class_name)s.allow_empty” is False." - -msgid "Directory indexes are not allowed here." -msgstr "Directory indexes are not allowed here." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” does not exist" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index of %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "The install worked successfully! Congratulations!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"View release notes for Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." - -msgid "Django Documentation" -msgstr "Django Documentation" - -msgid "Topics, references, & how-to’s" -msgstr "Topics, references, & how-to’s" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: A Polling App" - -msgid "Get started with Django" -msgstr "Get started with Django" - -msgid "Django Community" -msgstr "Django Community" - -msgid "Connect, get help, or contribute" -msgstr "Connect, get help, or contribute" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/formats.py deleted file mode 100644 index caa6f72..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/en_AU/formats.py +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j M Y" # '25 Oct 2006' -TIME_FORMAT = "P" # '2:30 p.m.' -DATETIME_FORMAT = "j M Y, P" # '25 Oct 2006, 2:30 p.m.' -YEAR_MONTH_FORMAT = "F Y" # 'October 2006' -MONTH_DAY_FORMAT = "j F" # '25 October' -SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' -SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 p.m.' -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - # "%b %d %Y", # 'Oct 25 2006' - # "%b %d, %Y", # 'Oct 25, 2006' - # "%d %b %Y", # '25 Oct 2006' - # "%d %b, %Y", # '25 Oct, 2006' - # "%B %d %Y", # 'October 25 2006' - # "%B %d, %Y", # 'October 25, 2006' - # "%d %B %Y", # '25 October 2006' - # "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_CA/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/en_CA/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_CA/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/en_CA/formats.py deleted file mode 100644 index b34551d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/en_CA/formats.py +++ /dev/null @@ -1,31 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date - -DATE_FORMAT = "j M Y" # 25 Oct 2006 -TIME_FORMAT = "P" # 2:30 p.m. -DATETIME_FORMAT = "j M Y, P" # 25 Oct 2006, 2:30 p.m. -YEAR_MONTH_FORMAT = "F Y" # October 2006 -MONTH_DAY_FORMAT = "j F" # 25 October -SHORT_DATE_FORMAT = "Y-m-d" -SHORT_DATETIME_FORMAT = "Y-m-d P" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-05-15' - "%y-%m-%d", # '06-05-15' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-05-15 14:30:57' - "%y-%m-%d %H:%M:%S", # '06-05-15 14:30:57' - "%Y-%m-%d %H:%M:%S.%f", # '2006-05-15 14:30:57.000200' - "%y-%m-%d %H:%M:%S.%f", # '06-05-15 14:30:57.000200' - "%Y-%m-%d %H:%M", # '2006-05-15 14:30' - "%y-%m-%d %H:%M", # '06-05-15 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index bc4b2cc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index 348adb0..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,1221 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# jon_atkinson , 2011-2012 -# Ross Poulton , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "Arabic" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bulgarian" -msgstr "Bulgarian" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "Bosnian" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Czech" -msgstr "Czech" - -msgid "Welsh" -msgstr "Welsh" - -msgid "Danish" -msgstr "Danish" - -msgid "German" -msgstr "German" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Greek" - -msgid "English" -msgstr "English" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "British English" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanish" - -msgid "Argentinian Spanish" -msgstr "Argentinian Spanish" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Mexican Spanish" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguan Spanish" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "Estonian" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Persian" - -msgid "Finnish" -msgstr "Finnish" - -msgid "French" -msgstr "French" - -msgid "Frisian" -msgstr "Frisian" - -msgid "Irish" -msgstr "Irish" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Galician" - -msgid "Hebrew" -msgstr "Hebrew" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croatian" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Hungarian" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Indonesian" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Icelandic" - -msgid "Italian" -msgstr "Italian" - -msgid "Japanese" -msgstr "Japanese" - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Korean" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "Lithuanian" - -msgid "Latvian" -msgstr "Latvian" - -msgid "Macedonian" -msgstr "Macedonian" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolian" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Dutch" - -msgid "Norwegian Nynorsk" -msgstr "Norwegian Nynorsk" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polish" - -msgid "Portuguese" -msgstr "Portuguese" - -msgid "Brazilian Portuguese" -msgstr "Brazilian Portuguese" - -msgid "Romanian" -msgstr "Romanian" - -msgid "Russian" -msgstr "Russian" - -msgid "Slovak" -msgstr "Slovak" - -msgid "Slovenian" -msgstr "Slovenian" - -msgid "Albanian" -msgstr "Albanian" - -msgid "Serbian" -msgstr "Serbian" - -msgid "Serbian Latin" -msgstr "Serbian Latin" - -msgid "Swedish" -msgstr "Swedish" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkish" -msgstr "Turkish" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "Ukrainian" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamese" - -msgid "Simplified Chinese" -msgstr "Simplified Chinese" - -msgid "Traditional Chinese" -msgstr "Traditional Chinese" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Enter a valid value." - -msgid "Enter a valid URL." -msgstr "Enter a valid URL." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Enter a valid IPv4 address." - -msgid "Enter a valid IPv6 address." -msgstr "Enter a valid IPv6 address." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Enter a valid IPv4 or IPv6 address." - -msgid "Enter only digits separated by commas." -msgstr "Enter only digits separated by commas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Ensure this value is %(limit_value)s (it is %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ensure this value is less than or equal to %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ensure this value is greater than or equal to %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Enter a number." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "and" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "This field cannot be null." - -msgid "This field cannot be blank." -msgstr "This field cannot be blank." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s with this %(field_label)s already exists." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Field of type: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Either True or False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (up to %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Comma-separated integers" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Date (without time)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Date (with time)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Decimal number" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Email address" - -msgid "File path" -msgstr "File path" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Floating point number" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Integer" - -msgid "Big (8 byte) integer" -msgstr "Big (8 byte) integer" - -msgid "IPv4 address" -msgstr "IPv4 address" - -msgid "IP address" -msgstr "IP address" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Either True, False or None)" - -msgid "Positive integer" -msgstr "Positive integer" - -msgid "Positive small integer" -msgstr "Positive small integer" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (up to %(max_length)s)" - -msgid "Small integer" -msgstr "Small integer" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Time" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "File" - -msgid "Image" -msgstr "Image" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (type determined by related field)" - -msgid "One-to-one relationship" -msgstr "One-to-one relationship" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Many-to-many relationship" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "This field is required." - -msgid "Enter a whole number." -msgstr "Enter a whole number." - -msgid "Enter a valid date." -msgstr "Enter a valid date." - -msgid "Enter a valid time." -msgstr "Enter a valid time." - -msgid "Enter a valid date/time." -msgstr "Enter a valid date/time." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "No file was submitted. Check the encoding type on the form." - -msgid "No file was submitted." -msgstr "No file was submitted." - -msgid "The submitted file is empty." -msgstr "The submitted file is empty." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Please either submit a file or check the clear checkbox, not both." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Select a valid choice. %(value)s is not one of the available choices." - -msgid "Enter a list of values." -msgstr "Enter a list of values." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Order" - -msgid "Delete" -msgstr "Delete" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Please correct the duplicate data for %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Please correct the duplicate data for %(field)s, which must be unique." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Please correct the duplicate values below." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Select a valid choice. That choice is not one of the available choices." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Clear" - -msgid "Currently" -msgstr "Currently" - -msgid "Change" -msgstr "Change" - -msgid "Unknown" -msgstr "Unknown" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "yes,no,maybe" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "midnight" - -msgid "noon" -msgstr "noon" - -msgid "Monday" -msgstr "Monday" - -msgid "Tuesday" -msgstr "Tuesday" - -msgid "Wednesday" -msgstr "Wednesday" - -msgid "Thursday" -msgstr "Thursday" - -msgid "Friday" -msgstr "Friday" - -msgid "Saturday" -msgstr "Saturday" - -msgid "Sunday" -msgstr "Sunday" - -msgid "Mon" -msgstr "Mon" - -msgid "Tue" -msgstr "Tue" - -msgid "Wed" -msgstr "Wed" - -msgid "Thu" -msgstr "Thu" - -msgid "Fri" -msgstr "Fri" - -msgid "Sat" -msgstr "Sat" - -msgid "Sun" -msgstr "Sun" - -msgid "January" -msgstr "January" - -msgid "February" -msgstr "February" - -msgid "March" -msgstr "March" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "June" - -msgid "July" -msgstr "July" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "October" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "December" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "March" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month" -msgid "June" -msgstr "June" - -msgctxt "abbrev. month" -msgid "July" -msgstr "July" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "January" - -msgctxt "alt. month" -msgid "February" -msgstr "February" - -msgctxt "alt. month" -msgid "March" -msgstr "March" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "May" - -msgctxt "alt. month" -msgid "June" -msgstr "June" - -msgctxt "alt. month" -msgid "July" -msgstr "July" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "October" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "or" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "No year specified" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "No month specified" - -msgid "No day specified" -msgstr "No day specified" - -msgid "No week specified" -msgstr "No week specified" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No %(verbose_name_plural)s available" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No %(verbose_name)s found matching the query" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Directory indexes are not allowed here." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index of %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/formats.py deleted file mode 100644 index bc90da5..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/en_GB/formats.py +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j M Y" # '25 Oct 2006' -TIME_FORMAT = "P" # '2:30 p.m.' -DATETIME_FORMAT = "j M Y, P" # '25 Oct 2006, 2:30 p.m.' -YEAR_MONTH_FORMAT = "F Y" # 'October 2006' -MONTH_DAY_FORMAT = "j F" # '25 October' -SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' -SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 p.m.' -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - # "%b %d %Y", # 'Oct 25 2006' - # "%b %d, %Y", # 'Oct 25, 2006' - # "%d %b %Y", # '25 Oct 2006' - # "%d %b, %Y", # '25 Oct, 2006' - # "%B %d %Y", # 'October 25 2006' - # "%B %d, %Y", # 'October 25, 2006' - # "%d %B %Y", # '25 October 2006' - # "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_IE/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/en_IE/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/en_IE/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/en_IE/formats.py deleted file mode 100644 index 81b8324..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/en_IE/formats.py +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j M Y" # '25 Oct 2006' -TIME_FORMAT = "H:i" # '14:30' -DATETIME_FORMAT = "j M Y, H:i" # '25 Oct 2006, 14:30' -YEAR_MONTH_FORMAT = "F Y" # 'October 2006' -MONTH_DAY_FORMAT = "j F" # '25 October' -SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' -SHORT_DATETIME_FORMAT = "d/m/Y H:i" # '25/10/2006 14:30' -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%d %b %Y", # '25 Oct 2006' - "%d %b, %Y", # '25 Oct, 2006' - "%d %B %Y", # '25 October 2006' - "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index 05260e5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index 66a2f38..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,1331 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Batist D 🐍 , 2012-2013 -# Batist D 🐍 , 2013-2019 -# batisteo , 2011 -# Dinu Gherman , 2011 -# kristjan , 2011 -# Matthieu Desplantes , 2021 -# Meiyer , 2022 -# Nikolay Korotkiy , 2017-2018 -# Robin van der Vliet , 2019 -# Adamo Mesha , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:23-0500\n" -"PO-Revision-Date: 2022-05-25 06:49+0000\n" -"Last-Translator: Meiyer , 2022\n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikansa" - -msgid "Arabic" -msgstr "Araba" - -msgid "Algerian Arabic" -msgstr "Alĝeria araba" - -msgid "Asturian" -msgstr "Asturia" - -msgid "Azerbaijani" -msgstr "Azerbajĝana" - -msgid "Bulgarian" -msgstr "Bulgara" - -msgid "Belarusian" -msgstr "Belorusa" - -msgid "Bengali" -msgstr "Bengala" - -msgid "Breton" -msgstr "Bretona" - -msgid "Bosnian" -msgstr "Bosnia" - -msgid "Catalan" -msgstr "Kataluna" - -msgid "Czech" -msgstr "Ĉeĥa" - -msgid "Welsh" -msgstr "Kimra" - -msgid "Danish" -msgstr "Dana" - -msgid "German" -msgstr "Germana" - -msgid "Lower Sorbian" -msgstr "Malsuprasaroba" - -msgid "Greek" -msgstr "Greka" - -msgid "English" -msgstr "Angla" - -msgid "Australian English" -msgstr "Angla (Aŭstralia)" - -msgid "British English" -msgstr "Angla (Brita)" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Hispana" - -msgid "Argentinian Spanish" -msgstr "Hispana (Argentinio)" - -msgid "Colombian Spanish" -msgstr "Hispana (Kolombio)" - -msgid "Mexican Spanish" -msgstr "Hispana (Meksiko)" - -msgid "Nicaraguan Spanish" -msgstr "Hispana (Nikaragvo)" - -msgid "Venezuelan Spanish" -msgstr "Hispana (Venezuelo)" - -msgid "Estonian" -msgstr "Estona" - -msgid "Basque" -msgstr "Eŭska" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finna" - -msgid "French" -msgstr "Franca" - -msgid "Frisian" -msgstr "Frisa" - -msgid "Irish" -msgstr "Irlanda" - -msgid "Scottish Gaelic" -msgstr "Skota gaela" - -msgid "Galician" -msgstr "Galega" - -msgid "Hebrew" -msgstr "Hebrea" - -msgid "Hindi" -msgstr "Hinda" - -msgid "Croatian" -msgstr "Kroata" - -msgid "Upper Sorbian" -msgstr "Suprasoraba" - -msgid "Hungarian" -msgstr "Hungara" - -msgid "Armenian" -msgstr "Armena" - -msgid "Interlingua" -msgstr "Interlingvaa" - -msgid "Indonesian" -msgstr "Indoneza" - -msgid "Igbo" -msgstr "Igba" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islanda" - -msgid "Italian" -msgstr "Itala" - -msgid "Japanese" -msgstr "Japana" - -msgid "Georgian" -msgstr "Kartvela" - -msgid "Kabyle" -msgstr "Kabila" - -msgid "Kazakh" -msgstr "Kazaĥa" - -msgid "Khmer" -msgstr "Kmera" - -msgid "Kannada" -msgstr "Kanara" - -msgid "Korean" -msgstr "Korea" - -msgid "Kyrgyz" -msgstr "Kirgiza" - -msgid "Luxembourgish" -msgstr "Luksemburga" - -msgid "Lithuanian" -msgstr "Litova" - -msgid "Latvian" -msgstr "Latva" - -msgid "Macedonian" -msgstr "Makedona" - -msgid "Malayalam" -msgstr "Malajala" - -msgid "Mongolian" -msgstr "Mongola" - -msgid "Marathi" -msgstr "Marata" - -msgid "Malay" -msgstr "Malaja" - -msgid "Burmese" -msgstr "Birma" - -msgid "Norwegian Bokmål" -msgstr "Norvega (bokmål)" - -msgid "Nepali" -msgstr "Nepala" - -msgid "Dutch" -msgstr "Nederlanda" - -msgid "Norwegian Nynorsk" -msgstr "Norvega (nynorsk)" - -msgid "Ossetic" -msgstr "Oseta" - -msgid "Punjabi" -msgstr "Panĝaba" - -msgid "Polish" -msgstr "Pola" - -msgid "Portuguese" -msgstr "Portugala" - -msgid "Brazilian Portuguese" -msgstr "Portugala (Brazilo)" - -msgid "Romanian" -msgstr "Rumana" - -msgid "Russian" -msgstr "Rusa" - -msgid "Slovak" -msgstr "Slovaka" - -msgid "Slovenian" -msgstr "Slovena" - -msgid "Albanian" -msgstr "Albana" - -msgid "Serbian" -msgstr "Serba" - -msgid "Serbian Latin" -msgstr "Serba (latina)" - -msgid "Swedish" -msgstr "Sveda" - -msgid "Swahili" -msgstr "Svahila" - -msgid "Tamil" -msgstr "Tamila" - -msgid "Telugu" -msgstr "Telugua" - -msgid "Tajik" -msgstr "Taĝika" - -msgid "Thai" -msgstr "Taja" - -msgid "Turkmen" -msgstr "Turkmena" - -msgid "Turkish" -msgstr "Turka" - -msgid "Tatar" -msgstr "Tatara" - -msgid "Udmurt" -msgstr "Udmurta" - -msgid "Ukrainian" -msgstr "Ukraina" - -msgid "Urdu" -msgstr "Urdua" - -msgid "Uzbek" -msgstr "Uzbeka" - -msgid "Vietnamese" -msgstr "Vjetnama" - -msgid "Simplified Chinese" -msgstr "Ĉina (simpligite)" - -msgid "Traditional Chinese" -msgstr "Ĉina (tradicie)" - -msgid "Messages" -msgstr "Mesaĝoj" - -msgid "Site Maps" -msgstr "Retejaj mapoj" - -msgid "Static Files" -msgstr "Statikaj dosieroj" - -msgid "Syndication" -msgstr "Abonrilato" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Tia paĝnumero ne estas entjero" - -msgid "That page number is less than 1" -msgstr "La paĝnumero estas malpli ol 1" - -msgid "That page contains no results" -msgstr "Tiu paĝo ne enhavas rezultojn" - -msgid "Enter a valid value." -msgstr "Enigu ĝustan valoron." - -msgid "Enter a valid URL." -msgstr "Enigu ĝustan retadreson." - -msgid "Enter a valid integer." -msgstr "Enigu ĝustaforman entjeron." - -msgid "Enter a valid email address." -msgstr "Enigu ĝustaforman retpoŝtan adreson." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Enigu ĝustan “ĵetonvorton” konsistantan el latinaj literoj, ciferoj, " -"substrekoj, aŭ dividstrekoj." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Enigu ĝustan “ĵetonvorton” konsistantan el Unikodaj literoj, ciferoj, " -"substrekoj, aŭ dividstrekoj." - -msgid "Enter a valid IPv4 address." -msgstr "Enigu ĝustaforman IPv4-adreson." - -msgid "Enter a valid IPv6 address." -msgstr "Enigu ĝustaforman IPv6-adreson." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Enigu ĝustaforman IPv4- aŭ IPv6-adreson." - -msgid "Enter only digits separated by commas." -msgstr "Enigu nur ciferojn apartigitajn per komoj." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Certigu ke ĉi tiu valoro estas %(limit_value)s (ĝi estas %(show_value)s). " - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Certigu ke ĉi tiu valoro estas malpli ol aŭ egala al %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Certigu ke ĉi tiu valoro estas pli ol aŭ egala al %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Certigu ke ĉi tiu valoro estas oblo de paŝo-grando %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Certigu, ke tiu valoro havas %(limit_value)d signon (ĝi havas " -"%(show_value)d)." -msgstr[1] "" -"Certigu ke ĉi tiu valoro enhavas almenaŭ %(limit_value)d signojn (ĝi havas " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Certigu, ke tio valuto maksimume havas %(limit_value)d karakterojn (ĝi havas " -"%(show_value)d)." -msgstr[1] "" -"Certigu ke ĉi tiu valoro maksimume enhavas %(limit_value)d signojn (ĝi havas " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Enigu nombron." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Certigu ke ne estas pli ol %(max)s cifero entute." -msgstr[1] "Certigu ke ne estas pli ol %(max)s ciferoj entute." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Certigu, ke ne estas pli ol %(max)s dekumaj lokoj." -msgstr[1] "Certigu, ke ne estas pli ol %(max)s dekumaj lokoj." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Certigu ke ne estas pli ol %(max)s ciferoj antaŭ la dekuma punkto." -msgstr[1] "Certigu ke ne estas pli ol %(max)s ciferoj antaŭ la dekuma punkto." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Sufikso “%(extension)s” de dosiernomo ne estas permesita. Eblaj sufiksoj " -"estas: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Nulsignoj ne estas permesitaj." - -msgid "and" -msgstr "kaj" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s kun tiuj %(field_labels)s jam ekzistas." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Limigo “%(name)s” estas malobservita." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valoro %(value)r ne estas ebla elekto." - -msgid "This field cannot be null." -msgstr "Tiu ĉi kampo ne povas esti senvalora (null)." - -msgid "This field cannot be blank." -msgstr "Tiu ĉi kampo ne povas esti malplena." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s kun tiu %(field_label)s jam ekzistas." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s devas esti unika por %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Kampo de tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "La valoro “%(value)s” devas esti aŭ Vera (True) aŭ Malvera (False)." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" -"La valoro “%(value)s” devas esti Vera (True), Malvera (False), aŭ Nenia " -"(None)." - -msgid "Boolean (Either True or False)" -msgstr "Bulea (Vera aŭ Malvera)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Ĉeno (ĝis %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Perkome disigitaj entjeroj" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"La valoro “%(value)s” havas malĝustan datformaton. Ĝi devas esti en la " -"formato JJJJ-MM-TT." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"La valoro “%(value)s” havas la ĝustan formaton (JJJJ-MM-TT), sed ĝi estas " -"neekzistanta dato." - -msgid "Date (without time)" -msgstr "Dato (sen horo)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"La valoro “%(value)s” havas malĝustan formaton. Ĝi devas esti en la formato " -"JJJJ-MM-TT HH:MM[:ss[.µµµµµµ]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"La valoro “%(value)s” havas la ĝustan formaton (JJJJ-MM-TT HH:MM[:ss[." -"µµµµµµ]][TZ]), sed ĝi estas neekzistanta dato/tempo." - -msgid "Date (with time)" -msgstr "Dato (kun horo)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "La valoro “%(value)s” devas esti dekuma frakcio." - -msgid "Decimal number" -msgstr "Dekuma nombro" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"La valoro “%(value)s” havas malĝustan formaton. Ĝi devas esti en la formato " -"[TT] [[HH:]MM:]ss[.µµµµµµ]." - -msgid "Duration" -msgstr "Daŭro" - -msgid "Email address" -msgstr "Retpoŝtadreso" - -msgid "File path" -msgstr "Dosierindiko" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "La valoro “%(value)s” devas esti glitpunkta nombro." - -msgid "Floating point number" -msgstr "Glitpunkta nombro" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "La valoro “%(value)s” devas esti entjero." - -msgid "Integer" -msgstr "Entjero" - -msgid "Big (8 byte) integer" -msgstr "Granda (8–bitoka) entjero" - -msgid "Small integer" -msgstr "Malgranda entjero" - -msgid "IPv4 address" -msgstr "IPv4-adreso" - -msgid "IP address" -msgstr "IP-adreso" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" -"La valoro “%(value)s” devas esti Nenia (None), Vera (True), aŭ Malvera " -"(False)." - -msgid "Boolean (Either True, False or None)" -msgstr "Buleo (Vera, Malvera, aŭ Nenia)" - -msgid "Positive big integer" -msgstr "Pozitiva granda entjero" - -msgid "Positive integer" -msgstr "Pozitiva entjero" - -msgid "Positive small integer" -msgstr "Pozitiva malgranda entjero" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Ĵetonvorto (ĝis %(max_length)s)" - -msgid "Text" -msgstr "Teksto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"La valoro “%(value)s” havas malĝustan formaton. Ĝi devas esti en la formato " -"HH:MM[:ss[.µµµµµµ]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"La valoro “%(value)s” havas la (HH:MM[:ss[.µµµµµµ]]), sed tio estas " -"neekzistanta tempo." - -msgid "Time" -msgstr "Horo" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Kruda duuma datumo" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” ne estas ĝustaforma UUID." - -msgid "Universally unique identifier" -msgstr "Universale unika identigilo" - -msgid "File" -msgstr "Dosiero" - -msgid "Image" -msgstr "Bildo" - -msgid "A JSON object" -msgstr "JSON-objekto" - -msgid "Value must be valid JSON." -msgstr "La valoro devas esti ĝustaforma JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Ekzemplero de %(model)s kun %(field)s egala al %(value)r ne ekzistas." - -msgid "Foreign Key (type determined by related field)" -msgstr "Fremda ŝlosilo (tipo determinita per rilata kampo)" - -msgid "One-to-one relationship" -msgstr "Unu-al-unu rilato" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s rilato" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s rilatoj" - -msgid "Many-to-many relationship" -msgstr "Mult-al-multa rilato" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ĉi tiu kampo estas deviga." - -msgid "Enter a whole number." -msgstr "Enigu plenan nombron." - -msgid "Enter a valid date." -msgstr "Enigu ĝustan daton." - -msgid "Enter a valid time." -msgstr "Enigu ĝustan horon." - -msgid "Enter a valid date/time." -msgstr "Enigu ĝustan daton/tempon." - -msgid "Enter a valid duration." -msgstr "Enigu ĝustan daŭron." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "La nombro de tagoj devas esti inter {min_days} kaj {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Neniu dosiero estis alŝutita. Kontrolu la kodoprezentan tipon en la " -"formularo." - -msgid "No file was submitted." -msgstr "Neniu dosiero estis alŝutita." - -msgid "The submitted file is empty." -msgstr "La alŝutita dosiero estas malplena." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Certigu, ke tio dosiernomo maksimume havas %(max)d karakteron (ĝi havas " -"%(length)d)." -msgstr[1] "" -"Certigu ke la dosiernomo maksimume havas %(max)d signojn (ĝi havas " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Bonvolu aŭ alŝuti dosieron, aŭ elekti la vakigan markobutonon, sed ne ambaŭ." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Alŝutu ĝustaforman bildon. La alŝutita dosiero ne estas bildo aŭ estas " -"difektita bildo." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Elektu ekzistantan opcion. %(value)s ne estas el la eblaj elektoj." - -msgid "Enter a list of values." -msgstr "Enigu liston de valoroj." - -msgid "Enter a complete value." -msgstr "Enigu kompletan valoron." - -msgid "Enter a valid UUID." -msgstr "Enigu ĝustaforman UUID." - -msgid "Enter a valid JSON." -msgstr "Enigu ĝustaforman JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Kaŝita kampo %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"La datumoj de la mastruma ManagementForm mankas aŭ estis malice modifitaj. " -"Mankas la kampoj: %(field_names)s. Se la problemo plu okazas, vi poveble " -"devintus raporti cimon." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Bonvolu forsendi maksimume %(num)d formularon." -msgstr[1] "Bonvolu forsendi maksimume %(num)d formularojn." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Bonvolu forsendi almenaŭ %(num)d formularon." -msgstr[1] "Bonvolu forsendi almenaŭ %(num)d formularojn." - -msgid "Order" -msgstr "Ordo" - -msgid "Delete" -msgstr "Forigi" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Bonvolu ĝustigi la duoblan datumon por %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Bonvolu ĝustigi la duoblan datumon por %(field)s, kiu devas esti unika." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Bonvolu ĝustigi la duoblan datumon por %(field_name)s, kiu devas esti unika " -"por la %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Bonvolu ĝustigi la duoblan valoron sube." - -msgid "The inline value did not match the parent instance." -msgstr "La enteksta valoro ne egalas la patran ekzempleron." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Elektu ekzistantan opcion. Ĉi tiu opcio ne estas el la eblaj elektoj." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” estas neakceptebla valoro." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Ne eblis interpreti %(datetime)s en la tempo-zono %(current_timezone)s. Ĝi " -"eble estas ambigua aŭ ne ekzistas en tiu tempo-zono." - -msgid "Clear" -msgstr "Vakigi" - -msgid "Currently" -msgstr "Nuntempe" - -msgid "Change" -msgstr "Ŝanĝi" - -msgid "Unknown" -msgstr "Nekonate" - -msgid "Yes" -msgstr "Jes" - -msgid "No" -msgstr "Ne" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "jes,ne,eble" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bitoko" -msgstr[1] "%(size)d bitokoj" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "ptm" - -msgid "a.m." -msgstr "atm" - -msgid "PM" -msgstr "PTM" - -msgid "AM" -msgstr "ATM" - -msgid "midnight" -msgstr "noktomezo" - -msgid "noon" -msgstr "tagmezo" - -msgid "Monday" -msgstr "lundo" - -msgid "Tuesday" -msgstr "mardo" - -msgid "Wednesday" -msgstr "merkredo" - -msgid "Thursday" -msgstr "ĵaŭdo" - -msgid "Friday" -msgstr "vendredo" - -msgid "Saturday" -msgstr "sabato" - -msgid "Sunday" -msgstr "dimanĉo" - -msgid "Mon" -msgstr "lun" - -msgid "Tue" -msgstr "mar" - -msgid "Wed" -msgstr "mer" - -msgid "Thu" -msgstr "ĵaŭ" - -msgid "Fri" -msgstr "ven" - -msgid "Sat" -msgstr "sab" - -msgid "Sun" -msgstr "dim" - -msgid "January" -msgstr "januaro" - -msgid "February" -msgstr "februaro" - -msgid "March" -msgstr "marto" - -msgid "April" -msgstr "aprilo" - -msgid "May" -msgstr "majo" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "aŭgusto" - -msgid "September" -msgstr "septembro" - -msgid "October" -msgstr "oktobro" - -msgid "November" -msgstr "novembro" - -msgid "December" -msgstr "decembro" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aŭg" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "apr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "majo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "jun." - -msgctxt "abbrev. month" -msgid "July" -msgstr "jul." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aŭg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januaro" - -msgctxt "alt. month" -msgid "February" -msgstr "Februaro" - -msgctxt "alt. month" -msgid "March" -msgstr "Marto" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprilo" - -msgctxt "alt. month" -msgid "May" -msgstr "Majo" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Aŭgusto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septembro" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktobro" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembro" - -msgctxt "alt. month" -msgid "December" -msgstr "Decembro" - -msgid "This is not a valid IPv6 address." -msgstr "Tio ne estas ĝustaforma IPv6-adreso." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "aŭ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d jaro" -msgstr[1] "%(num)d jaroj" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d monato" -msgstr[1] "%(num)d monatoj" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semajno" -msgstr[1] "%(num)d semajnoj" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d tago" -msgstr[1] "%(num)d tagoj" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d horo" -msgstr[1] "%(num)d horoj" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutoj" - -msgid "Forbidden" -msgstr "Malpermesita" - -msgid "CSRF verification failed. Request aborted." -msgstr "Kontrolo de CSRF malsukcesis. Peto ĉesigita." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Vi vidas tiun ĉi mesaĝon ĉar ĉi-tiu HTTPS-retejo postulas ricevi la " -"kapinstrukcion “Referer” de via retumilo, sed neniu estis sendita. Tia " -"kapinstrukcio estas bezonata pro sekurecaj kialoj, por certigi ke via " -"retumilo ne agas laŭ nedezirataj instrukcioj de maliculoj." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Se la agordoj de via retumilo malebligas la kapinstrukciojn “Referer”, " -"bonvolu ebligi ilin por tiu ĉi retejo, aŭ por HTTPS-konektoj, aŭ por petoj " -"el sama fonto (“same-origin”)." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Se vi uzas la etikedon aŭ " -"sendas la kapinstrukcion “Referrer-Policy: no-referrer”, bonvolu forigi " -"ilin. La protekto kontraŭ CSRF postulas la ĉeeston de la kapinstrukcio " -"“Referer”, kaj strikte kontrolas la referencantan fonton. Se vi zorgas pri " -"privateco, uzu alternativojn kiajn por ligiloj al " -"eksteraj retejoj." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Vi vidas tiun ĉi mesaĝon ĉar ĉi-tiu retejo postulas ke CSRF-kuketo estu " -"sendita kune kun la formularoj. Tia kuketo estas bezonata pro sekurecaj " -"kialoj, por certigi ke via retumilo ne agas laŭ nedezirataj instrukcioj de " -"maliculoj." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Se la agordoj de via retumilo malebligas kuketojn, bonvolu ebligi ilin por " -"tiu ĉi retejo aŭ por petoj el sama fonto (“same-origin”)." - -msgid "More information is available with DEBUG=True." -msgstr "Pliaj informoj estas videblaj kun DEBUG=True." - -msgid "No year specified" -msgstr "Neniu jaro indikita" - -msgid "Date out of range" -msgstr "Dato ne en la intervalo" - -msgid "No month specified" -msgstr "Neniu monato indikita" - -msgid "No day specified" -msgstr "Neniu tago indikita" - -msgid "No week specified" -msgstr "Neniu semajno indikita" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Neniuj %(verbose_name_plural)s estas disponeblaj" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Estontaj %(verbose_name_plural)s ne disponeblas ĉar %(class_name)s." -"allow_future estas Malvera." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Erarforma dato-ĉeno “%(datestr)s” se uzi la formaton “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Neniu %(verbose_name)s trovita kongrua kun la informpeto" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Paĝo ne estas “lasta”, nek eblas konverti ĝin en entjeron." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Malĝusta paĝo (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"La listo estas malplena dum “%(class_name)s.allow_empty” estas Malvera." - -msgid "Directory indexes are not allowed here." -msgstr "Dosierujaj indeksoj ne estas permesitaj ĉi tie." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” ne ekzistas" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indekso de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "La instalado sukcesis! Gratulojn!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Vidu eldonajn notojn por Dĵango %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Vi vidas ĉi tiun paĝon ĉar DEBUG = " -"True estas en via agorda dosiero kaj vi ne agordis ajnan URL." - -msgid "Django Documentation" -msgstr "Dĵanga dokumentaro" - -msgid "Topics, references, & how-to’s" -msgstr "Temoj, referencoj, kaj instruiloj" - -msgid "Tutorial: A Polling App" -msgstr "Instruilo: apo pri enketoj" - -msgid "Get started with Django" -msgstr "Komencu kun Dĵango" - -msgid "Django Community" -msgstr "Dĵanga komunumo" - -msgid "Connect, get help, or contribute" -msgstr "Konektiĝu, ricevu helpon aŭ kontribuu" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/eo/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/eo/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/eo/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/eo/formats.py deleted file mode 100644 index d1346d1..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/eo/formats.py +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j\-\a \d\e F Y" # '26-a de julio 1887' -TIME_FORMAT = "H:i" # '18:59' -DATETIME_FORMAT = r"j\-\a \d\e F Y\, \j\e H:i" # '26-a de julio 1887, je 18:59' -YEAR_MONTH_FORMAT = r"F \d\e Y" # 'julio de 1887' -MONTH_DAY_FORMAT = r"j\-\a \d\e F" # '26-a de julio' -SHORT_DATE_FORMAT = "Y-m-d" # '1887-07-26' -SHORT_DATETIME_FORMAT = "Y-m-d H:i" # '1887-07-26 18:59' -FIRST_DAY_OF_WEEK = 1 # Monday (lundo) - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '1887-07-26' - "%y-%m-%d", # '87-07-26' - "%Y %m %d", # '1887 07 26' - "%Y.%m.%d", # '1887.07.26' - "%d-a de %b %Y", # '26-a de jul 1887' - "%d %b %Y", # '26 jul 1887' - "%d-a de %B %Y", # '26-a de julio 1887' - "%d %B %Y", # '26 julio 1887' - "%d %m %Y", # '26 07 1887' - "%d/%m/%Y", # '26/07/1887' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '18:59:00' - "%H:%M", # '18:59' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '1887-07-26 18:59:00' - "%Y-%m-%d %H:%M", # '1887-07-26 18:59' - "%Y.%m.%d %H:%M:%S", # '1887.07.26 18:59:00' - "%Y.%m.%d %H:%M", # '1887.07.26 18:59' - "%d/%m/%Y %H:%M:%S", # '26/07/1887 18:59:00' - "%d/%m/%Y %H:%M", # '26/07/1887 18:59' - "%y-%m-%d %H:%M:%S", # '87-07-26 18:59:00' - "%y-%m-%d %H:%M", # '87-07-26 18:59' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 20ea819..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 77ec5f4..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,1412 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 -# Abe Estrada, 2013 -# Abe Estrada, 2013 -# albertoalcolea , 2014 -# albertoalcolea , 2014 -# Amanda Copete, 2017 -# Amanda Copete, 2017 -# Antoni Aloy , 2011-2014,2017,2019 -# Claude Paroz , 2020 -# Diego Andres Sanabria Martin , 2012 -# Diego Schulz , 2012 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2014,2020 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2015-2016 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2014 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2020 -# Ernesto Rico Schmidt , 2017 -# Ernesto Rico Schmidt , 2017 -# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 -# Ignacio José Lizarán Rus , 2019 -# Igor Támara , 2015 -# Jannis Leidel , 2011 -# Jorge Andres Bravo Meza, 2024 -# José Luis , 2016 -# José Luis , 2016 -# Josue Naaman Nistal Guerra , 2014 -# Leonardo J. Caballero G. , 2011,2013 -# Luigy, 2019 -# Luigy, 2019 -# Marc Garcia , 2011 -# Mariusz Felisiak , 2021 -# mpachas , 2022 -# monobotsoft , 2012 -# Natalia, 2024 -# ntrrgc , 2013 -# ntrrgc , 2013 -# Pablo, 2015 -# Pablo, 2015 -# Sebastián Magrí, 2013 -# Sebastián Magrí, 2013 -# Uriel Medina , 2020-2021,2023 -# Veronicabh , 2015 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Jorge Andres Bravo Meza, 2024\n" -"Language-Team: Spanish (http://app.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? " -"1 : 2;\n" - -msgid "Afrikaans" -msgstr "Africano" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "Árabe argelino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerbaiyán" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorruso" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "Bretón" - -msgid "Bosnian" -msgstr "Bosnio" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdo central (Sorani)" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Danés" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "Bajo sorbio" - -msgid "Greek" -msgstr "Griego" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "Inglés australiano" - -msgid "British English" -msgstr "Inglés británico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español de Argentina" - -msgid "Colombian Spanish" -msgstr "Español de Colombia" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Español de Venezuela" - -msgid "Estonian" -msgstr "Estonio" - -msgid "Basque" -msgstr "Vasco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisón" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "Gaélico Escocés" - -msgid "Galician" -msgstr "Gallego" - -msgid "Hebrew" -msgstr "Hebreo" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Alto sorbio" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "Armenio" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesio" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonés" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "Cabilio" - -msgid "Kazakh" -msgstr "Kazajo" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "Kirguís" - -msgid "Luxembourgish" -msgstr "Luxenburgués" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letón" - -msgid "Macedonian" -msgstr "Macedonio" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Maratí" - -msgid "Malay" -msgstr "Malayo" - -msgid "Burmese" -msgstr "Birmano" - -msgid "Norwegian Bokmål" -msgstr "Bokmål noruego" - -msgid "Nepali" -msgstr "Nepalí" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk" - -msgid "Ossetic" -msgstr "Osetio" - -msgid "Punjabi" -msgstr "Panyabí" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués de Brasil" - -msgid "Romanian" -msgstr "Rumano" - -msgid "Russian" -msgstr "Ruso" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanés" - -msgid "Serbian" -msgstr "Serbio" - -msgid "Serbian Latin" -msgstr "Serbio latino" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suajili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tayiko" - -msgid "Thai" -msgstr "Tailandés" - -msgid "Turkmen" -msgstr "Turcomanos" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tártaro" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uigur" - -msgid "Ukrainian" -msgstr "Ucraniano" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeko" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chino simplificado" - -msgid "Traditional Chinese" -msgstr "Chino tradicional" - -msgid "Messages" -msgstr "Mensajes" - -msgid "Site Maps" -msgstr "Mapas del sitio" - -msgid "Static Files" -msgstr "Archivos estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Este número de página no es un entero" - -msgid "That page number is less than 1" -msgstr "Este número de página es menor que 1" - -msgid "That page contains no results" -msgstr "Esa página no contiene resultados" - -msgid "Enter a valid value." -msgstr "Introduzca un valor válido." - -msgid "Enter a valid domain name." -msgstr "Ingrese un nombre de dominio válido." - -msgid "Enter a valid URL." -msgstr "Introduzca una URL válida." - -msgid "Enter a valid integer." -msgstr "Introduzca un número entero válido." - -msgid "Enter a valid email address." -msgstr "Introduzca una dirección de correo electrónico válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Introduzca un 'slug' válido, consistente en letras, números, guiones bajos o " -"medios." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Introduzca un 'slug' válido, consistente en letras, números, guiones bajos o " -"medios de Unicode." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Ingrese una dirección de %(protocol)s válida." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 o IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Introduzca sólo dígitos separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Asegúrese de que este valor es %(limit_value)s (actualmente es " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor es menor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor es mayor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Asegúrese de que este valor es múltiplo de %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Asegúrese de que este valor sea un múltiplo del tamaño del " -"paso%(limit_value)s, comenzando en%(offset)s, p.ej. %(offset)s, " -"%(valid_value1)s, %(valid_value2)s, etcétera." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga al menos %(limit_value)d caracter (tiene " -"%(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga al menos %(limit_value)d carácter(es) " -"(tiene%(show_value)d)." -msgstr[2] "" -"Asegúrese de que este valor tenga al menos %(limit_value)d carácter(es) " -"(tiene%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga menos de %(limit_value)d caracter (tiene " -"%(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga menos de %(limit_value)d caracteres (tiene " -"%(show_value)d)." -msgstr[2] "" -"Asegúrese de que este valor tenga menos de %(limit_value)d caracteres (tiene " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Introduzca un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrese de que no hay más de %(max)s dígito en total." -msgstr[1] "Asegúrese de que no haya más de %(max)s dígitos en total." -msgstr[2] "Asegúrese de que no haya más de %(max)s dígitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrese de que no haya más de %(max)s dígito decimal." -msgstr[1] "Asegúrese de que no haya más de %(max)s dígitos decimales." -msgstr[2] "Asegúrese de que no haya más de %(max)s dígitos decimales." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrese de que no haya más de %(max)s dígito antes del punto decimal" -msgstr[1] "" -"Asegúrese de que no haya más de %(max)s dígitos antes del punto decimal." -msgstr[2] "" -"Asegúrese de que no haya más de %(max)s dígitos antes del punto decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"La extensión de archivo “%(extension)s” no esta permitida. Las extensiones " -"permitidas son: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Los caracteres nulos no están permitidos." - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s con este %(field_labels)s ya existe." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "No se cumple la restricción \"%(name)s\"." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valor %(value)r no es una opción válida." - -msgid "This field cannot be null." -msgstr "Este campo no puede ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo no puede estar vacío." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ya existe %(model_name)s con este %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s debe ser único para %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo de tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s”: el valor debe ser Verdadero o Falso." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s”: el valor debe ser Verdadero, Falso o Nulo." - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Verdadero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (máximo %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Cadena (ilimitado)" - -msgid "Comma-separated integers" -msgstr "Enteros separados por coma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” : el valor tiene un formato de fecha inválido. Debería estar en " -"el formato YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” : el valor tiene el formato correcto (YYYY-MM-DD) pero es una " -"fecha inválida." - -msgid "Date (without time)" -msgstr "Fecha (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s”: el valor tiene un formato inválido. Debería estar en el formato " -"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s”: el valor tiene el formato correcto (YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]) pero es una fecha inválida." - -msgid "Date (with time)" -msgstr "Fecha (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s”: el valor debe ser un número decimal." - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s”: el valor tiene un formato inválido. Debería estar en el formato " -"[DD] [[HH:]MM:]ss[.uuuuuu]" - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Correo electrónico" - -msgid "File path" -msgstr "Ruta de fichero" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s”: el valor debería ser un número de coma flotante." - -msgid "Floating point number" -msgstr "Número en coma flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s”: el valor debería ser un numero entero" - -msgid "Integer" -msgstr "Entero" - -msgid "Big (8 byte) integer" -msgstr "Entero grande (8 bytes)" - -msgid "Small integer" -msgstr "Entero corto" - -msgid "IPv4 address" -msgstr "Dirección IPv4" - -msgid "IP address" -msgstr "Dirección IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s”: el valor debería ser None, Verdadero o Falso." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadero, Falso o Nulo)" - -msgid "Positive big integer" -msgstr "Entero grande positivo" - -msgid "Positive integer" -msgstr "Entero positivo" - -msgid "Positive small integer" -msgstr "Entero positivo corto" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (hasta %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s”: el valor tiene un formato inválido. Debería estar en el formato " -"HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” : el valor tiene el formato correcto (HH:MM[:ss[.uuuuuu]]) pero " -"es un tiempo inválido." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos binarios en bruto" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” no es un UUID válido." - -msgid "Universally unique identifier" -msgstr "Identificador universal único" - -msgid "File" -msgstr "Archivo" - -msgid "Image" -msgstr "Imagen" - -msgid "A JSON object" -msgstr "Un objeto JSON" - -msgid "Value must be valid JSON." -msgstr "El valor debe ser un objeto JSON válido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "La instancia de %(model)s con %(field)s %(value)r no existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave foránea (tipo determinado por el campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación uno-a-uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "relación %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "relaciones %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relación muchos-a-muchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo es obligatorio." - -msgid "Enter a whole number." -msgstr "Introduzca un número entero." - -msgid "Enter a valid date." -msgstr "Introduzca una fecha válida." - -msgid "Enter a valid time." -msgstr "Introduzca una hora válida." - -msgid "Enter a valid date/time." -msgstr "Introduzca una fecha/hora válida." - -msgid "Enter a valid duration." -msgstr "Introduzca una duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "El número de días debe estar entre {min_days} y {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No se ha enviado ningún fichero. Compruebe el tipo de codificación en el " -"formulario." - -msgid "No file was submitted." -msgstr "No se ha enviado ningún fichero" - -msgid "The submitted file is empty." -msgstr "El fichero enviado está vacío." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracter " -"(tiene %(length)d)." -msgstr[1] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d " -"carácter(es) (tiene %(length)d)." -msgstr[2] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d " -"carácter(es) (tiene %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Por favor envíe un fichero o marque la casilla de limpiar, pero no ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se " -"trataba de una imagen corrupta." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Escoja una opción válida. %(value)s no es una de las opciones disponibles." - -msgid "Enter a list of values." -msgstr "Introduzca una lista de valores." - -msgid "Enter a complete value." -msgstr "Introduzca un valor completo." - -msgid "Enter a valid UUID." -msgstr "Introduzca un UUID válido." - -msgid "Enter a valid JSON." -msgstr "Ingresa un JSON válido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) *%(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Los datos de ManagementForm faltan o han sido alterados. Campos que faltan: " -"%(field_names)s. Es posible que deba presentar un informe de error si el " -"problema persiste." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Por favor, envíe %(num)d formulario como máximo." -msgstr[1] "Por favor, envíe %(num)d formularios como máximo." -msgstr[2] "Por favor, envíe %(num)d formularios como máximo." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Por favor, envíe %(num)d formulario como mínimo." -msgstr[1] "Por favor, envíe %(num)d formularios como mínimo." -msgstr[2] "Por favor, envíe %(num)d formularios como mínimo." - -msgid "Order" -msgstr "Orden" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija el dato duplicado para %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor corrija el dato duplicado para %(field)s, ya que debe ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor corrija los datos duplicados para %(field_name)s ya que debe ser " -"único para %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija los valores duplicados abajo." - -msgid "The inline value did not match the parent instance." -msgstr "El valor en línea no coincide con la instancia padre." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Escoja una opción válida. Esa opción no está entre las disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” no es un valor válido." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s no pudo ser interpretado en la zona horaria " -"%(current_timezone)s; podría ser ambiguo o no existir." - -msgid "Clear" -msgstr "Limpiar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sí,no,quizás" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoche" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "lunes" - -msgid "Tuesday" -msgstr "martes" - -msgid "Wednesday" -msgstr "miércoles" - -msgid "Thursday" -msgstr "jueves" - -msgid "Friday" -msgstr "viernes" - -msgid "Saturday" -msgstr "sábado" - -msgid "Sunday" -msgstr "domingo" - -msgid "Mon" -msgstr "lun" - -msgid "Tue" -msgstr "mar" - -msgid "Wed" -msgstr "mié" - -msgid "Thu" -msgstr "jue" - -msgid "Fri" -msgstr "vie" - -msgid "Sat" -msgstr "sáb" - -msgid "Sun" -msgstr "dom" - -msgid "January" -msgstr "enero" - -msgid "February" -msgstr "febrero" - -msgid "March" -msgstr "marzo" - -msgid "April" -msgstr "abril" - -msgid "May" -msgstr "mayo" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "agosto" - -msgid "September" -msgstr "septiembre" - -msgid "October" -msgstr "octubre" - -msgid "November" -msgstr "noviembre" - -msgid "December" -msgstr "diciembre" - -msgid "jan" -msgstr "ene" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ene." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dic." - -msgctxt "alt. month" -msgid "January" -msgstr "enero" - -msgctxt "alt. month" -msgid "February" -msgstr "febrero" - -msgctxt "alt. month" -msgid "March" -msgstr "marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "abril" - -msgctxt "alt. month" -msgid "May" -msgstr "mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "junio" - -msgctxt "alt. month" -msgid "July" -msgstr "julio" - -msgctxt "alt. month" -msgid "August" -msgstr "agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "septiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "noviembre" - -msgctxt "alt. month" -msgid "December" -msgstr "diciembre" - -msgid "This is not a valid IPv6 address." -msgstr "No es una dirección IPv6 válida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d año" -msgstr[1] "%(num)d años" -msgstr[2] "%(num)d años" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" -msgstr[2] "%(num)d días" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -msgid "Forbidden" -msgstr "Prohibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "La verificación CSRF ha fallado. Solicitud abortada." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Estás viendo este mensaje porque este sitio HTTPS requiere que tu navegador " -"web envíe un \"encabezado de referencia\", pero no se envió ninguno. Este " -"encabezado es necesario por razones de seguridad, para garantizar que su " -"navegador no sea secuestrado por terceros." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Si ha configurado su navegador para deshabilitar los encabezados " -"\"Referer\", vuelva a habilitarlos, al menos para este sitio, o para " -"conexiones HTTPS, o para solicitudes del \"mismo origen\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Si esta utilizando la etiqueta o incluyendo el encabezado \"Referrer-Policy: no-referrer\", " -"elimínelos. La protección CSRF requiere que el encabezado \"Referer\" " -"realice una comprobación estricta del referente. Si le preocupa la " -"privacidad, utilice alternativas como para los " -"enlaces a sitios de terceros." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Estás viendo este mensaje porqué esta web requiere una cookie CSRF cuando se " -"envían formularios. Esta cookie se necesita por razones de seguridad, para " -"asegurar que tu navegador no ha sido comprometido por terceras partes." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Si ha configurado su navegador para deshabilitar las cookies, vuelva a " -"habilitarlas, al menos para este sitio o para solicitudes del \"mismo " -"origen\"." - -msgid "More information is available with DEBUG=True." -msgstr "Más información disponible si se establece DEBUG=True." - -msgid "No year specified" -msgstr "No se ha indicado el año" - -msgid "Date out of range" -msgstr "Fecha fuera de rango" - -msgid "No month specified" -msgstr "No se ha indicado el mes" - -msgid "No day specified" -msgstr "No se ha indicado el día" - -msgid "No week specified" -msgstr "No se ha indicado la semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No %(verbose_name_plural)s disponibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Los futuros %(verbose_name_plural)s no están disponibles porque " -"%(class_name)s.allow_future es Falso." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Cadena de fecha no valida “%(datestr)s” dado el formato “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "La página no es la \"última\", ni se puede convertir a un entero." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista vacía y “%(class_name)s.allow_empty” es Falso" - -msgid "Directory indexes are not allowed here." -msgstr "Los índices de directorio no están permitidos." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” no existe" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "¡La instalación funcionó con éxito! ¡Felicitaciones!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Ve la notas de la versión de Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Estás viendo esta página porque DEBUG=True está en su archivo de configuración y no ha " -"configurado ninguna URL." - -msgid "Django Documentation" -msgstr "Documentación de Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temas, referencias, & como hacer" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Una aplicación de encuesta" - -msgid "Get started with Django" -msgstr "Comienza con Django" - -msgid "Django Community" -msgstr "Comunidad Django" - -msgid "Connect, get help, or contribute" -msgstr "Conéctate, obtén ayuda o contribuye" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es/formats.py deleted file mode 100644 index f2716bb..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '31/12/2009' - "%d/%m/%y", # '31/12/09' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index c4130b7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 543a7d2..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,1378 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# lardissone , 2014 -# Natalia, 2023 -# poli , 2014 -# Ramiro Morales, 2013-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Ramiro Morales, 2013-2025\n" -"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikáans" - -msgid "Arabic" -msgstr "árabe" - -msgid "Algerian Arabic" -msgstr "Árabe de Argelia" - -msgid "Asturian" -msgstr "asturiano" - -msgid "Azerbaijani" -msgstr "azerbaiyán" - -msgid "Bulgarian" -msgstr "búlgaro" - -msgid "Belarusian" -msgstr "bielorruso" - -msgid "Bengali" -msgstr "bengalí" - -msgid "Breton" -msgstr "bretón" - -msgid "Bosnian" -msgstr "bosnio" - -msgid "Catalan" -msgstr "catalán" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdo central (Sorani)" - -msgid "Czech" -msgstr "checo" - -msgid "Welsh" -msgstr "galés" - -msgid "Danish" -msgstr "danés" - -msgid "German" -msgstr "alemán" - -msgid "Lower Sorbian" -msgstr "bajo sorabo" - -msgid "Greek" -msgstr "griego" - -msgid "English" -msgstr "inglés" - -msgid "Australian English" -msgstr "inglés australiano" - -msgid "British English" -msgstr "inglés británico" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "español" - -msgid "Argentinian Spanish" -msgstr "español (Argentina)" - -msgid "Colombian Spanish" -msgstr "español (Colombia)" - -msgid "Mexican Spanish" -msgstr "español (México)" - -msgid "Nicaraguan Spanish" -msgstr "español (Nicaragua)" - -msgid "Venezuelan Spanish" -msgstr "español (Venezuela)" - -msgid "Estonian" -msgstr "estonio" - -msgid "Basque" -msgstr "vasco" - -msgid "Persian" -msgstr "persa" - -msgid "Finnish" -msgstr "finlandés" - -msgid "French" -msgstr "francés" - -msgid "Frisian" -msgstr "frisón" - -msgid "Irish" -msgstr "irlandés" - -msgid "Scottish Gaelic" -msgstr "gaélico escocés" - -msgid "Galician" -msgstr "gallego" - -msgid "Hebrew" -msgstr "hebreo" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "croata" - -msgid "Upper Sorbian" -msgstr "alto sorabo" - -msgid "Hungarian" -msgstr "húngaro" - -msgid "Armenian" -msgstr "armenio" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "indonesio" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandés" - -msgid "Italian" -msgstr "italiano" - -msgid "Japanese" -msgstr "japonés" - -msgid "Georgian" -msgstr "georgiano" - -msgid "Kabyle" -msgstr "cabilio" - -msgid "Kazakh" -msgstr "kazajo" - -msgid "Khmer" -msgstr "jémer" - -msgid "Kannada" -msgstr "canarés" - -msgid "Korean" -msgstr "coreano" - -msgid "Kyrgyz" -msgstr "kirguís" - -msgid "Luxembourgish" -msgstr "luxemburgués" - -msgid "Lithuanian" -msgstr "lituano" - -msgid "Latvian" -msgstr "letón" - -msgid "Macedonian" -msgstr "macedonio" - -msgid "Malayalam" -msgstr "malabar" - -msgid "Mongolian" -msgstr "mongol" - -msgid "Marathi" -msgstr "maratí" - -msgid "Malay" -msgstr "malayo" - -msgid "Burmese" -msgstr "burmés" - -msgid "Norwegian Bokmål" -msgstr "bokmål noruego" - -msgid "Nepali" -msgstr "nepalés" - -msgid "Dutch" -msgstr "holandés" - -msgid "Norwegian Nynorsk" -msgstr "nynorsk" - -msgid "Ossetic" -msgstr "osetio" - -msgid "Punjabi" -msgstr "panyabí" - -msgid "Polish" -msgstr "polaco" - -msgid "Portuguese" -msgstr "portugués" - -msgid "Brazilian Portuguese" -msgstr "portugués de Brasil" - -msgid "Romanian" -msgstr "rumano" - -msgid "Russian" -msgstr "ruso" - -msgid "Slovak" -msgstr "eslovaco" - -msgid "Slovenian" -msgstr "esloveno" - -msgid "Albanian" -msgstr "albanés" - -msgid "Serbian" -msgstr "serbio" - -msgid "Serbian Latin" -msgstr "latín de Serbia" - -msgid "Swedish" -msgstr "sueco" - -msgid "Swahili" -msgstr "suajili" - -msgid "Tamil" -msgstr "tamil" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tayiko" - -msgid "Thai" -msgstr "tailandés" - -msgid "Turkmen" -msgstr "turcomano" - -msgid "Turkish" -msgstr "turco" - -msgid "Tatar" -msgstr "tártaro" - -msgid "Udmurt" -msgstr "udmurto" - -msgid "Uyghur" -msgstr "Uigur" - -msgid "Ukrainian" -msgstr "ucraniano" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "uzbeko" - -msgid "Vietnamese" -msgstr "vietnamita" - -msgid "Simplified Chinese" -msgstr "chino simplificado" - -msgid "Traditional Chinese" -msgstr "chino tradicional" - -msgid "Messages" -msgstr "Mensajes" - -msgid "Site Maps" -msgstr "Mapas de sitio" - -msgid "Static Files" -msgstr "Archivos estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "El número de página no es un entero" - -msgid "That page number is less than 1" -msgstr "El número de página es menor a 1" - -msgid "That page contains no results" -msgstr "Esa página no contiene resultados" - -msgid "Enter a valid value." -msgstr "Introduzca un valor válido." - -msgid "Enter a valid domain name." -msgstr "Introduzca un nombre de dominio válido." - -msgid "Enter a valid URL." -msgstr "Introduzca una URL válida." - -msgid "Enter a valid integer." -msgstr "Introduzca un valor numérico entero válido." - -msgid "Enter a valid email address." -msgstr "Introduzca una dirección de email válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "Introduzca un “slug” válido compuesto por letras, números o guiones." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Introduzca un “slug” compuesto por letras Unicode, números, guiones bajos o " -"guiones." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Introduzca una dirección de %(protocol)s válida." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 o IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Introduzca sólo dígitos separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Asegúrese de que este valor sea %(limit_value)s (actualmente es " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Asegúrese de que este valor sea múltiplo de %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Confirme que este valor sea un múltiplo del tamaño del paso %(limit_value)s, " -"empezando por %(offset)s, por ejemplo %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, y así sucesivamente." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " -"(tiene %(show_value)d)." -msgstr[2] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." -msgstr[2] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -msgid "Enter a number." -msgstr "Introduzca un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrese de que no exista en total mas de %(max)s dígito." -msgstr[1] "Asegúrese de que no existan en total mas de %(max)s dígitos." -msgstr[2] "Asegúrese de que no existan en total mas de %(max)s dígitos." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrese de que no exista mas de %(max)s lugar decimal." -msgstr[1] "Asegúrese de que no existan mas de %(max)s lugares decimales." -msgstr[2] "Asegúrese de que no existan mas de %(max)s lugares decimales." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrese de que no exista mas de %(max)s dígito antes del punto decimal." -msgstr[1] "" -"Asegúrese de que no existan mas de %(max)s dígitos antes del punto decimal." -msgstr[2] "" -"Asegúrese de que no existan mas de %(max)s dígitos antes del punto decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"La extensión de archivo “%(extension)s” no está permitida. Las extensiones " -"aceptadas son: “%(allowed_extensions)s”." - -msgid "Null characters are not allowed." -msgstr "No se admiten caracteres nulos." - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Ya existe un/a %(model_name)s con este/a %(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "No se cumple la restricción “%(name)s”." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "El valor %(value)r no es una opción válida." - -msgid "This field cannot be null." -msgstr "Este campo no puede ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo no puede estar en blanco." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s debe ser único/a para un %(lookup_type)s " -"%(date_field_label)s determinado." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "El valor de “%(value)s” debe ser Verdadero o Falso." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "El valor de “%(value)s” debe ser Verdadero, Falso o None." - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Verdadero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (máximo %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Cadena (ilimitado)" - -msgid "Comma-separated integers" -msgstr "Enteros separados por comas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"El valor de “%(value)s” tiene un formato de fecha inválido. Debe usar el " -"formato AAAA-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"El valor de “%(value)s” tiene un formato de fecha correcto (AAAA-MM-DD) pero " -"representa una fecha inválida." - -msgid "Date (without time)" -msgstr "Fecha (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"El valor de “%(value)s” tiene un formato inválido. Debe usar el formato AAAA-" -"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"El valor de “%(value)s” tiene un formato correcto (AAAA-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]) pero representa una fecha/hora inválida." - -msgid "Date (with time)" -msgstr "Fecha (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "El valor de “%(value)s” debe ser un número decimal." - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"El valor de “%(value)s” tiene un formato inválido. Debe usar el formato [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Dirección de correo electrónico" - -msgid "File path" -msgstr "Ruta de archivo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "El valor de “%(value)s” debe ser un número de coma flotante." - -msgid "Floating point number" -msgstr "Número de coma flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "El valor de “%(value)s” debe ser un número entero." - -msgid "Integer" -msgstr "Entero" - -msgid "Big (8 byte) integer" -msgstr "Entero grande (8 bytes)" - -msgid "Small integer" -msgstr "Entero pequeño" - -msgid "IPv4 address" -msgstr "Dirección IPv4" - -msgid "IP address" -msgstr "Dirección IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "El valor de “%(value)s” debe ser None, Verdadero o Falso." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadero, Falso o Nulo)" - -msgid "Positive big integer" -msgstr "Entero grande positivo" - -msgid "Positive integer" -msgstr "Entero positivo" - -msgid "Positive small integer" -msgstr "Entero pequeño positivo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (de hasta %(max_length)s caracteres)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"El valor de “%(value)s” tiene un formato inválido. Debe usar el formato HH:" -"MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"El valor de “%(value)s” tiene un formato correcto (HH:MM[:ss[.uuuuuu]]) pero " -"representa una hora inválida." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos binarios crudos" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” no es un UUID válido." - -msgid "Universally unique identifier" -msgstr "Identificador universalmente único" - -msgid "File" -msgstr "Archivo" - -msgid "Image" -msgstr "Imagen" - -msgid "A JSON object" -msgstr "Un objeto JSON" - -msgid "Value must be valid JSON." -msgstr "El valor debe ser JSON válido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" -"La instancia de %(model)s con %(field)s %(value)r no es una opción válida." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave foránea (el tipo está determinado por el campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación uno-a-uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "relación %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "relaciones %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relación muchos-a-muchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo es obligatorio." - -msgid "Enter a whole number." -msgstr "Introduzca un número entero." - -msgid "Enter a valid date." -msgstr "Introduzca una fecha válida." - -msgid "Enter a valid time." -msgstr "Introduzca un valor de hora válido." - -msgid "Enter a valid date/time." -msgstr "Introduzca un valor de fecha/hora válido." - -msgid "Enter a valid duration." -msgstr "Introduzca una duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "La cantidad de días debe tener valores entre {min_days} y {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No se envió un archivo. Verifique el tipo de codificación en el formulario." - -msgid "No file was submitted." -msgstr "No se envió ningún archivo." - -msgid "The submitted file is empty." -msgstr "El archivo enviado está vacío." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d carácter " -"(tiene %(length)d)." -msgstr[1] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " -"(tiene %(length)d)." -msgstr[2] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " -"(tiene %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Por favor envíe un archivo o active el checkbox, pero no ambas cosas." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Seleccione una imagen válida. El archivo que ha seleccionado no es una " -"imagen o es un archivo de imagen corrupto." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Seleccione una opción válida. %(value)s no es una de las opciones " -"disponibles." - -msgid "Enter a list of values." -msgstr "Introduzca una lista de valores." - -msgid "Enter a complete value." -msgstr "Introduzca un valor completo." - -msgid "Enter a valid UUID." -msgstr "Introduzca un UUID válido." - -msgid "Enter a valid JSON." -msgstr "Introduzca JSON válido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Los datos de ManagementForm faltan o han sido alterados. Campos faltantes: " -"%(field_names)s. Si el problema persiste es posible que deba reportarlo como " -"un error." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Por favor envíe un máximo de %(num)d formulario." -msgstr[1] "Por favor envíe un máximo de %(num)d formularios." -msgstr[2] "Por favor envíe un máximo de %(num)d formularios." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Por favor envíe %(num)d o mas formularios." -msgstr[1] "Por favor envíe %(num)d o mas formularios." -msgstr[2] "Por favor envíe %(num)d o mas formularios." - -msgid "Order" -msgstr "Ordenar" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija la información duplicada en %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor corrija la información duplicada en %(field)s, que debe ser única." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor corrija la información duplicada en %(field_name)s que debe ser " -"única para el %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija los valores duplicados detallados mas abajo." - -msgid "The inline value did not match the parent instance." -msgstr "El valor inline no coincide con el de la instancia padre." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Seleccione una opción válida. La opción seleccionada no es una de las " -"disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” no es un valor válido." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s no puede ser interpretado en la zona horaria " -"%(current_timezone)s; ya que podría ser ambiguo o podría no existir." - -msgid "Clear" -msgstr "Eliminar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "si,no,talvez" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoche" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "lunes" - -msgid "Tuesday" -msgstr "martes" - -msgid "Wednesday" -msgstr "miércoles" - -msgid "Thursday" -msgstr "jueves" - -msgid "Friday" -msgstr "viernes" - -msgid "Saturday" -msgstr "sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mie" - -msgid "Thu" -msgstr "Jue" - -msgid "Fri" -msgstr "Vie" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "enero" - -msgid "February" -msgstr "febrero" - -msgid "March" -msgstr "marzo" - -msgid "April" -msgstr "abril" - -msgid "May" -msgstr "mayo" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "agosto" - -msgid "September" -msgstr "setiembre" - -msgid "October" -msgstr "octubre" - -msgid "November" -msgstr "noviembre" - -msgid "December" -msgstr "diciembre" - -msgid "jan" -msgstr "ene" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Enero" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dic." - -msgctxt "alt. month" -msgid "January" -msgstr "enero" - -msgctxt "alt. month" -msgid "February" -msgstr "febrero" - -msgctxt "alt. month" -msgid "March" -msgstr "marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "abril" - -msgctxt "alt. month" -msgid "May" -msgstr "mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "junio" - -msgctxt "alt. month" -msgid "July" -msgstr "julio" - -msgctxt "alt. month" -msgid "August" -msgstr "agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "setiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "noviembre" - -msgctxt "alt. month" -msgid "December" -msgstr "diciembre" - -msgid "This is not a valid IPv6 address." -msgstr "Esta no es una dirección IPv6 válida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d año" -msgstr[1] "%(num)d años" -msgstr[2] "%(num)d años" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" -msgstr[2] "%(num)d días" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -msgid "Forbidden" -msgstr "Prohibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verificación CSRF fallida. Petición abortada." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Ud. está viendo este mensaje porque este sitio HTTPS tiene como " -"requerimiento que su navegador web envíe un encabezado “Referer” pero el " -"mismo no ha enviado uno. El hecho de que este encabezado sea obligatorio es " -"una medida de seguridad para comprobar que su navegador no está siendo " -"controlado por terceros." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Si ha configurado su browser para deshabilitar las cabeceras “Referer”, por " -"favor activelas al menos para este sitio, o para conexiones HTTPS o para " -"peticiones generadas desde el mismo origen." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Si está usando la etiqueta " -"o está incluyendo el encabezado “Referrer-Policy: no-referrer” por favor " -"quitelos. La protección CSRF necesita el encabezado “Referer” para realizar " -"una comprobación estricta de los referers. Si le preocupa la privacidad " -"tiene alternativas tales como usar en los enlaces a " -"sitios de terceros." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Ud. está viendo este mensaje porque este sitio tiene como requerimiento el " -"uso de una 'cookie' CSRF cuando se envíen formularios. El hecho de que esta " -"'cookie' sea obligatoria es una medida de seguridad para comprobar que su " -"browser no está siendo controlado por terceros." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Si ha configurado su browser para deshabilitar “cookies”, por favor " -"activelas al menos para este sitio o para peticiones generadas desde el " -"mismo origen." - -msgid "More information is available with DEBUG=True." -msgstr "Hay mas información disponible. Para ver la misma use DEBUG=True." - -msgid "No year specified" -msgstr "No se ha especificado el valor año" - -msgid "Date out of range" -msgstr "Fecha fuera de rango" - -msgid "No month specified" -msgstr "No se ha especificado el valor mes" - -msgid "No day specified" -msgstr "No se ha especificado el valor día" - -msgid "No week specified" -msgstr "No se ha especificado el valor semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No hay %(verbose_name_plural)s disponibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"No hay %(verbose_name_plural)s futuros disponibles porque %(class_name)s." -"allow_future tiene el valor False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Cadena de fecha inválida “%(datestr)s”, formato “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No se han encontrado %(verbose_name)s que coincidan con la consulta " - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Página debe tener el valor “last” o un valor número entero." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista vacía y “%(class_name)s.allow_empty” tiene el valor False." - -msgid "Directory indexes are not allowed here." -msgstr "" -"No está habilitada la generación de listados de directorios en esta " -"ubicación." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” no existe" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Listado de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "La instalación ha sido exitosa. ¡Felicitaciones!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Ver las release notes de Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Está viendo esta página porque el archivo de configuración contiene DEBUG=True y no ha configurado " -"ninguna URL." - -msgid "Django Documentation" -msgstr "Documentación de Django" - -msgid "Topics, references, & how-to’s" -msgstr "Tópicos, referencia & how-to’s" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Una app de encuesta" - -msgid "Get started with Django" -msgstr "Comience a aprender Django" - -msgid "Django Community" -msgstr "Comunidad Django" - -msgid "Connect, get help, or contribute" -msgstr "Conéctese, consiga ayuda o contribuya" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/formats.py deleted file mode 100644 index 601b458..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es_AR/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j N Y" -TIME_FORMAT = r"H:i" -DATETIME_FORMAT = r"j N Y H:i" -YEAR_MONTH_FORMAT = r"F Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = r"d/m/Y" -SHORT_DATETIME_FORMAT = r"d/m/Y H:i" -FIRST_DAY_OF_WEEK = 0 # 0: Sunday, 1: Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '31/12/2009' - "%d/%m/%y", # '31/12/09' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index 678fdc7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index 9f839fe..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,1258 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Carlos Muñoz , 2015 -# Claude Paroz , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikáans" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerí" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorruso" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "Bretón" - -msgid "Bosnian" -msgstr "Bosnio" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Danés" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Griego" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "Inglés Australiano" - -msgid "British English" -msgstr "Inglés Británico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español de Argentina" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Español venezolano" - -msgid "Estonian" -msgstr "Estonio" - -msgid "Basque" -msgstr "Vasco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisón" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Gallego" - -msgid "Hebrew" -msgstr "Hebreo" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesio" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonés" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kazajo" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreano" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxenburgués" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letón" - -msgid "Macedonian" -msgstr "Macedonio" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Maratí" - -msgid "Burmese" -msgstr "Birmano" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nepalí" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk" - -msgid "Ossetic" -msgstr "Osetio" - -msgid "Punjabi" -msgstr "Panyabí" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués brasileño" - -msgid "Romanian" -msgstr "Rumano" - -msgid "Russian" -msgstr "Ruso" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanés" - -msgid "Serbian" -msgstr "Serbio" - -msgid "Serbian Latin" -msgstr "Serbio latino" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suajili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tailandés" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tártaro" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Ucraniano" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chino simplificado" - -msgid "Traditional Chinese" -msgstr "Chino tradicional" - -msgid "Messages" -msgstr "Mensajes" - -msgid "Site Maps" -msgstr "Mapas del sitio" - -msgid "Static Files" -msgstr "Archivos estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Ingrese un valor válido." - -msgid "Enter a valid URL." -msgstr "Ingrese una URL válida." - -msgid "Enter a valid integer." -msgstr "Ingrese un entero válido." - -msgid "Enter a valid email address." -msgstr "Ingrese una dirección de correo electrónico válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Ingrese una dirección IPv4 válida." - -msgid "Enter a valid IPv6 address." -msgstr "Ingrese una dirección IPv6 válida." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Ingrese una dirección IPv4 o IPv6 válida." - -msgid "Enter only digits separated by commas." -msgstr "Ingrese solo números separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Asegúrese de que este valor es %(limit_value)s (es %(show_value)s )." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -msgid "Enter a number." -msgstr "Ingrese un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrese de que no hayan mas de %(max)s dígito en total." -msgstr[1] "Asegúrese de que no hayan mas de %(max)s dígitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrese de que no hayan más de %(max)s decimal." -msgstr[1] "Asegúrese de que no hayan más de %(max)s decimales." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrese de que no hayan más de %(max)s dígito antes del punto decimal." -msgstr[1] "" -"Asegúrese de que no hayan más de %(max)s dígitos antes del punto decimal" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Ya existe un/a %(model_name)s con este/a %(field_labels)s." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valor %(value)r no es una opción válida." - -msgid "This field cannot be null." -msgstr "Este campo no puede ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo no puede estar en blanco." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s debe ser único para %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Tipo de campo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Verdadero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (máximo %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Enteros separados por comas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Fecha (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Fecha (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Dirección de correo electrónico" - -msgid "File path" -msgstr "Ruta de archivo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Número de punto flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Entero" - -msgid "Big (8 byte) integer" -msgstr "Entero grande (8 bytes)" - -msgid "IPv4 address" -msgstr "Dirección IPv4" - -msgid "IP address" -msgstr "Dirección IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadero, Falso o Nulo)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Entero positivo" - -msgid "Positive small integer" -msgstr "Entero positivo pequeño" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (hasta %(max_length)s)" - -msgid "Small integer" -msgstr "Entero pequeño" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos de binarios brutos" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Archivo" - -msgid "Image" -msgstr "Imagen" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "La instancia del %(model)s con %(field)s %(value)r no existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Llave foránea (tipo determinado por el campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación uno-a-uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Relación muchos-a-muchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo es obligatorio." - -msgid "Enter a whole number." -msgstr "Ingrese un número entero." - -msgid "Enter a valid date." -msgstr "Ingrese una fecha válida." - -msgid "Enter a valid time." -msgstr "Ingrese una hora válida." - -msgid "Enter a valid date/time." -msgstr "Ingrese una fecha/hora válida." - -msgid "Enter a valid duration." -msgstr "Ingrese una duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No se ha enviado ningún fichero. Compruebe el tipo de codificación en el " -"formulario." - -msgid "No file was submitted." -msgstr "No se ha enviado ningún fichero." - -msgid "The submitted file is empty." -msgstr "El fichero enviado está vacío." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d carácter " -"(tiene %(length)d)." -msgstr[1] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " -"(tiene %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Por favor envíe un fichero o marque la casilla de limpiar, pero no ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se " -"trataba de una imagen corrupta." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Escoja una opción válida. %(value)s no es una de las opciones disponibles." - -msgid "Enter a list of values." -msgstr "Ingrese una lista de valores." - -msgid "Enter a complete value." -msgstr "Ingrese un valor completo." - -msgid "Enter a valid UUID." -msgstr "Ingrese un UUID válido." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) *%(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Los datos de ManagementForm faltan o han sido manipulados" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Por favor, envíe %d o menos formularios." -msgstr[1] "Por favor, envíe %d o menos formularios." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Por favor, envíe %d o mas formularios." -msgstr[1] "Por favor, envíe %d o mas formularios." - -msgid "Order" -msgstr "Orden" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija el dato duplicado para %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor corrija el dato duplicado para %(field)s, este debe ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor corrija los datos duplicados para %(field_name)s este debe ser " -"único para %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija los valores duplicados abajo." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Escoja una opción válida. Esa opción no está entre las disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Limpiar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Cambiar" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sí,no,quizás" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoche" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "Lunes" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Miércoles" - -msgid "Thursday" -msgstr "Jueves" - -msgid "Friday" -msgstr "Viernes" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mié" - -msgid "Thu" -msgstr "Jue" - -msgid "Fri" -msgstr "Vie" - -msgid "Sat" -msgstr "Sáb" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgid "jan" -msgstr "ene" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ene." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dic." - -msgctxt "alt. month" -msgid "January" -msgstr "Enero" - -msgctxt "alt. month" -msgid "February" -msgstr "Febrero" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "Noviembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Diciembre" - -msgid "This is not a valid IPv6 address." -msgstr "Esta no es una dirección IPv6 válida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d año" -msgstr[1] "%d años" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d meses" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semana" -msgstr[1] "%d semanas" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d día" -msgstr[1] "%d días" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d horas" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutos" - -msgid "Forbidden" -msgstr "Prohibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verificación CSRF fallida. Solicitud abortada." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Estás viendo este mensaje porqué esta web requiere una cookie CSRF cuando se " -"envían formularios. Esta cookie se necesita por razones de seguridad, para " -"asegurar que tu navegador no ha sido comprometido por terceras partes." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Se puede ver más información si se establece DEBUG=True." - -msgid "No year specified" -msgstr "No se ha indicado el año" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "No se ha indicado el mes" - -msgid "No day specified" -msgstr "No se ha indicado el día" - -msgid "No week specified" -msgstr "No se ha indicado la semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No %(verbose_name_plural)s disponibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Los futuros %(verbose_name_plural)s no están disponibles porque " -"%(class_name)s.allow_future es Falso." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Los índices de directorio no están permitidos." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/formats.py deleted file mode 100644 index 056d0ad..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es_CO/formats.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 1 -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%Y%m%d", # '20061025' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index 42f2691..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index 93b81a4..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,1279 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abe Estrada, 2011-2013 -# Claude Paroz , 2020 -# Gustavo López Hernández, 2022 -# Jesús Bautista , 2019-2020 -# Sergio Benitez , 2021 -# zodman , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:23-0500\n" -"PO-Revision-Date: 2022-07-25 06:49+0000\n" -"Last-Translator: Gustavo López Hernández\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikáans" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "Árabe argelino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "bielorruso" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "bretón" - -msgid "Bosnian" -msgstr "Bosnio" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Danés" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "Bajo sorbio" - -msgid "Greek" -msgstr "Griego" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "Inglés australiano" - -msgid "British English" -msgstr "Inglés británico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español de Argentina" - -msgid "Colombian Spanish" -msgstr "Español Colombiano" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de nicaragua" - -msgid "Venezuelan Spanish" -msgstr "español de Venezuela" - -msgid "Estonian" -msgstr "Estonio" - -msgid "Basque" -msgstr "Vasco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisón" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "Gaélico escocés" - -msgid "Galician" -msgstr "Gallego" - -msgid "Hebrew" -msgstr "Hebreo" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Alto sorbio" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "Armenio" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesio" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonés" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "Cabilio" - -msgid "Kazakh" -msgstr "Kazajstán" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "luxemburgués" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letón" - -msgid "Macedonian" -msgstr "Macedonio" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "burmés" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nepal" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Noruego Nynorsk" - -msgid "Ossetic" -msgstr "osetio" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués de Brasil" - -msgid "Romanian" -msgstr "Rumano" - -msgid "Russian" -msgstr "Ruso" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanés" - -msgid "Serbian" -msgstr "Serbio" - -msgid "Serbian Latin" -msgstr "Latin Serbio" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tailandés" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "udmurto" - -msgid "Ukrainian" -msgstr "Ucraniano" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chino simplificado" - -msgid "Traditional Chinese" -msgstr "Chino tradicional" - -msgid "Messages" -msgstr "Mensajes" - -msgid "Site Maps" -msgstr "Mapas del sitio" - -msgid "Static Files" -msgstr "Archivos Estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Ese número de página no es un número entero" - -msgid "That page number is less than 1" -msgstr "Ese número de página es menor que 1" - -msgid "That page contains no results" -msgstr "Esa página no contiene resultados" - -msgid "Enter a valid value." -msgstr "Introduzca un valor válido." - -msgid "Enter a valid URL." -msgstr "Ingrese una URL válida." - -msgid "Enter a valid integer." -msgstr "Ingrese un entero válido." - -msgid "Enter a valid email address." -msgstr "Introduzca una dirección de correo electrónico válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Introduzca un \"slug\" válido que conste de letras, números, guiones bajos o " -"guiones." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Introduzca un \"slug\" válido que conste de letras Unicode, números, guiones " -"bajos o guiones." - -msgid "Enter a valid IPv4 address." -msgstr "Introduzca una dirección IPv4 válida." - -msgid "Enter a valid IPv6 address." -msgstr "Introduzca una dirección IPv6 válida." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Introduzca una dirección IPv4 o IPv6 válida." - -msgid "Enter only digits separated by commas." -msgstr "Introduzca sólo números separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Asegúrese de que este valor es %(limit_value)s (es %(show_value)s )." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -msgid "Enter a number." -msgstr "Introduzca un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrese de que no hay más de %(max)s dígito en total." -msgstr[1] "Asegúrese de que no hay más de %(max)s dígitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Caracteres nulos no están permitidos." - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "El valor %(value)r no es una opción válida." - -msgid "This field cannot be null." -msgstr "Este campo no puede ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo no puede estar en blanco." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "El valor \"%(value)s\" debe ser Verdadero o Falso. " - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Verdadero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (máximo %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Enteros separados por comas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” : el valor tiene un formato de fecha inválido. Debería estar en " -"el formato YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” : el valor tiene el formato correcto (YYYY-MM-DD) pero es una " -"fecha inválida." - -msgid "Date (without time)" -msgstr "Fecha (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"'%(value)s' tiene un formato de fecha no válido. Este valor debe estar en el " -"formato AAAA-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Fecha (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Dirección de correo electrónico" - -msgid "File path" -msgstr "Ruta de archivo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "El valor \"%(value)s\" debe ser flotante." - -msgid "Floating point number" -msgstr "Número de punto flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Entero" - -msgid "Big (8 byte) integer" -msgstr "Entero grande (8 bytes)" - -msgid "Small integer" -msgstr "Entero pequeño" - -msgid "IPv4 address" -msgstr "Dirección IPv4" - -msgid "IP address" -msgstr "Dirección IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadero, Falso o Nulo)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Entero positivo" - -msgid "Positive small integer" -msgstr "Entero positivo pequeño" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (hasta %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Los datos en bruto" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Archivo" - -msgid "Image" -msgstr "Imagen" - -msgid "A JSON object" -msgstr "Un objeto JSON" - -msgid "Value must be valid JSON." -msgstr "El valor debe ser JSON válido" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "La instancia de %(model)s con %(field)s %(value)r no existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave foránea (el tipo está determinado por el campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación uno-a-uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relación %(from)s - %(to)s " - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relaciones %(from)s - %(to)s" - -msgid "Many-to-many relationship" -msgstr "Relación muchos-a-muchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo es obligatorio." - -msgid "Enter a whole number." -msgstr "Introduzca un número entero." - -msgid "Enter a valid date." -msgstr "Introduzca una fecha válida." - -msgid "Enter a valid time." -msgstr "Introduzca una hora válida." - -msgid "Enter a valid date/time." -msgstr "Introduzca una fecha/hora válida." - -msgid "Enter a valid duration." -msgstr "Introduzca una duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "La cantidad de días debe tener valores entre {min_days} y {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No se envió un archivo. Verifique el tipo de codificación en el formulario." - -msgid "No file was submitted." -msgstr "No se envió ningún archivo." - -msgid "The submitted file is empty." -msgstr "El archivo enviado está vacío." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Por favor envíe un archivo o marque la casilla, no ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Seleccione una imagen válida. El archivo que ha seleccionado no es una " -"imagen o es un un archivo de imagen corrupto." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Seleccione una opción válida. %(value)s no es una de las opciones " -"disponibles." - -msgid "Enter a list of values." -msgstr "Introduzca una lista de valores." - -msgid "Enter a complete value." -msgstr "Ingrese un valor completo." - -msgid "Enter a valid UUID." -msgstr "Ingrese un UUID válido." - -msgid "Enter a valid JSON." -msgstr "Ingresa un JSON válido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Ordenar" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija la información duplicada en %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor corrija la información duplicada en %(field)s, que debe ser única." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor corrija la información duplicada en %(field_name)s que debe ser " -"única para el %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija los valores duplicados detallados mas abajo." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Seleccione una opción válida. La opción seleccionada no es una de las " -"disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Borrar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sí,no,tal vez" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoche" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "Lunes" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Miércoles" - -msgid "Thursday" -msgstr "Jueves" - -msgid "Friday" -msgstr "Viernes" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mie" - -msgid "Thu" -msgstr "Jue" - -msgid "Fri" -msgstr "Vie" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgid "jan" -msgstr "ene" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ene." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dic." - -msgctxt "alt. month" -msgid "January" -msgstr "Enero" - -msgctxt "alt. month" -msgid "February" -msgstr "Febrero" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "Noviembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Diciembre" - -msgid "This is not a valid IPv6 address." -msgstr "Esta no es una dirección IPv6 válida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "Prohibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "No se ha especificado el valor año" - -msgid "Date out of range" -msgstr "Fecha fuera de rango" - -msgid "No month specified" -msgstr "No se ha especificado el valor mes" - -msgid "No day specified" -msgstr "No se ha especificado el valor dia" - -msgid "No week specified" -msgstr "No se ha especificado el valor semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No hay %(verbose_name_plural)s disponibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"No hay %(verbose_name_plural)s futuros disponibles porque %(class_name)s." -"allow_future tiene el valor False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No se han encontrado %(verbose_name)s que coincidan con la consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "La página no es \"last\", ni puede ser convertido a un int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Los índices del directorio no están permitidos." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "¡La instalación funcionó con éxito! ¡Felicidades!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "Documentación de Django" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "Comunidad de Django" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/formats.py deleted file mode 100644 index d675d79..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es_MX/formats.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday: ISO 8601 -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%Y%m%d", # '20061025' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "." # ',' is also official (less common): NOM-008-SCFI-2002 -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_NI/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es_NI/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_NI/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es_NI/formats.py deleted file mode 100644 index 0c8112a..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es_NI/formats.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday: ISO 8601 -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%Y%m%d", # '20061025' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_PR/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es_PR/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_PR/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/es_PR/formats.py deleted file mode 100644 index d50fe5d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es_PR/formats.py +++ /dev/null @@ -1,27 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 0 # Sunday - -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '31/12/2009' - "%d/%m/%y", # '31/12/09' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] - -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index f7efb3e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index bd0a904..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,1260 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Eduardo , 2017 -# Leonardo J. Caballero G. , 2016 -# Sebastián Magrí, 2011 -# Yoel Acevedo, 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" -"language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikáans" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerí" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorruso" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "Bretón" - -msgid "Bosnian" -msgstr "Bosnio" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Danés" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "Sorbio Inferior" - -msgid "Greek" -msgstr "Griego" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "Inglés Australiano" - -msgid "British English" -msgstr "Inglés Británico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español de Argentina" - -msgid "Colombian Spanish" -msgstr "Español de Colombia" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Español de Venezuela" - -msgid "Estonian" -msgstr "Estonio" - -msgid "Basque" -msgstr "Vazco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finlandés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisio" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "Gaélico Escocés" - -msgid "Galician" -msgstr "Galés" - -msgid "Hebrew" -msgstr "Hebreo" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Sorbio Superior" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesio" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonés" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kazajo" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Canarés" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxenburgués" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Latvio" - -msgid "Macedonian" -msgstr "Macedonio" - -msgid "Malayalam" -msgstr "Malayala" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Maratí" - -msgid "Burmese" -msgstr "Birmano" - -msgid "Norwegian Bokmål" -msgstr "Noruego" - -msgid "Nepali" -msgstr "Nepalí" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk" - -msgid "Ossetic" -msgstr "Osetio" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués de Brasil" - -msgid "Romanian" -msgstr "Ruman" - -msgid "Russian" -msgstr "Ruso" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Eslovenio" - -msgid "Albanian" -msgstr "Albano" - -msgid "Serbian" -msgstr "Serbi" - -msgid "Serbian Latin" -msgstr "Latín Serbio" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suajili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tailandés" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tártaro" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Ucranio" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chino simplificado" - -msgid "Traditional Chinese" -msgstr "Chino tradicional" - -msgid "Messages" -msgstr "Mensajes" - -msgid "Site Maps" -msgstr "Mapas del sitio" - -msgid "Static Files" -msgstr "Archivos estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -msgid "That page number is not an integer" -msgstr "Ese número de página no es un número entero" - -msgid "That page number is less than 1" -msgstr "Ese número de página es menor que 1" - -msgid "That page contains no results" -msgstr "Esa página no contiene resultados" - -msgid "Enter a valid value." -msgstr "Introduzca un valor válido." - -msgid "Enter a valid URL." -msgstr "Introduzca una URL válida." - -msgid "Enter a valid integer." -msgstr "Ingrese un valor válido." - -msgid "Enter a valid email address." -msgstr "Ingrese una dirección de correo electrónico válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Introduzca una dirección IPv4 válida." - -msgid "Enter a valid IPv6 address." -msgstr "Ingrese una dirección IPv6 válida." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Ingrese una dirección IPv4 o IPv6 válida." - -msgid "Enter only digits separated by commas." -msgstr "Introduzca solo dígitos separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Asegúrese de que este valor %(limit_value)s (ahora es %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor es menor o igual que %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor es mayor o igual que %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -msgid "Enter a number." -msgstr "Introduzca un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrese de que no hayan más de %(max)s dígito en total." -msgstr[1] "Asegúrese de que no hayan más de %(max)s dígitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrese de que no hayan más de %(max)s decimal." -msgstr[1] "Asegúrese de que no hayan más de %(max)s decimales." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrese de que no hayan más de %(max)s dígito antes del punto decimal." -msgstr[1] "" -"Asegúrese de que no hayan más de %(max)s dígitos antes del punto decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s con este %(field_labels)s ya existe." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valor %(value)r no es una opción válida." - -msgid "This field cannot be null." -msgstr "Este campo no puede ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo no puede estar en blanco." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s con esta %(field_label)s ya existe." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s debe ser único para %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Tipo de campo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Verdadero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (máximo %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Enteros separados por comas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Fecha (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Fecha (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Dirección de correo electrónico" - -msgid "File path" -msgstr "Ruta de archivo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Número de punto flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Entero" - -msgid "Big (8 byte) integer" -msgstr "Entero grande (8 bytes)" - -msgid "IPv4 address" -msgstr "Dirección IPv4" - -msgid "IP address" -msgstr "Dirección IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadero, Falso o Nulo)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Entero positivo" - -msgid "Positive small integer" -msgstr "Entero positivo pequeño" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (hasta %(max_length)s)" - -msgid "Small integer" -msgstr "Entero pequeño" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos de binarios brutos" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Archivo" - -msgid "Image" -msgstr "Imagen" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "la instancia del %(model)s con %(field)s %(value)r no existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave foránea (tipo determinado por el campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación uno a uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relación %(from)s - %(to)s " - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relaciones %(from)s - %(to)s" - -msgid "Many-to-many relationship" -msgstr "Relación muchos a muchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo es obligatorio." - -msgid "Enter a whole number." -msgstr "Introduzca un número completo." - -msgid "Enter a valid date." -msgstr "Introduzca una fecha válida." - -msgid "Enter a valid time." -msgstr "Introduzca una hora válida." - -msgid "Enter a valid date/time." -msgstr "Introduzca una hora y fecha válida." - -msgid "Enter a valid duration." -msgstr "Ingrese una duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No se envió archivo alguno. Revise el tipo de codificación del formulario." - -msgid "No file was submitted." -msgstr "No se envió ningún archivo." - -msgid "The submitted file is empty." -msgstr "El archivo enviado está vacío." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d carácter " -"(tiene %(length)d)." -msgstr[1] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " -"(tiene %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Por favor provea un archivo o active el selector de limpiar, no ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se " -"trataba de una imagen corrupta." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Escoja una opción válida. %(value)s no es una de las opciones disponibles." - -msgid "Enter a list of values." -msgstr "Ingrese una lista de valores." - -msgid "Enter a complete value." -msgstr "Ingrese un valor completo." - -msgid "Enter a valid UUID." -msgstr "Ingrese un UUID válido." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Los datos de ManagementForm faltan o han sido manipulados" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Por favor, envíe %d o un menor número de formularios." -msgstr[1] "Por favor, envíe %d o un menor número de formularios." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Por favor, envíe %d o más formularios." -msgstr[1] "Por favor, envíe %d o más formularios." - -msgid "Order" -msgstr "Orden" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija el dato duplicado para %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor, corrija el dato duplicado para %(field)s, este debe ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor, corrija los datos duplicados para %(field_name)s este debe ser " -"único para %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija los valores duplicados abajo." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Escoja una opción válida. Esa opción no está entre las opciones disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Limpiar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Cambiar" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sí,no,quizás" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoche" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "Lunes" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Miércoles" - -msgid "Thursday" -msgstr "Jueves" - -msgid "Friday" -msgstr "Viernes" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mié" - -msgid "Thu" -msgstr "Jue" - -msgid "Fri" -msgstr "Vie" - -msgid "Sat" -msgstr "Sáb" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgid "jan" -msgstr "ene" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ene." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dic." - -msgctxt "alt. month" -msgid "January" -msgstr "Enero" - -msgctxt "alt. month" -msgid "February" -msgstr "Febrero" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "Noviembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Diciembre" - -msgid "This is not a valid IPv6 address." -msgstr "Esta no es una dirección IPv6 válida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d año" -msgstr[1] "%d años" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d meses" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semana" -msgstr[1] "%d semanas" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d día" -msgstr[1] "%d días" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d horas" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutos" - -msgid "Forbidden" -msgstr "Prohibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verificación CSRF fallida. Solicitud abortada." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Estás viendo este mensaje porqué esta web requiere una cookie CSRF cuando se " -"envían formularios. Esta cookie se necesita por razones de seguridad, para " -"asegurar que tu navegador no ha sido comprometido por terceras partes." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Se puede ver más información si se establece DEBUG=True." - -msgid "No year specified" -msgstr "No se ha indicado el año" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "No se ha indicado el mes" - -msgid "No day specified" -msgstr "No se ha indicado el día" - -msgid "No week specified" -msgstr "No se ha indicado la semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No %(verbose_name_plural)s disponibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Los futuros %(verbose_name_plural)s no están disponibles porque " -"%(class_name)s.allow_future es Falso." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Los índices de directorio no están permitidos." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index d109d42..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/et/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index 5f3e154..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,1341 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# eallik , 2011 -# Erlend Eelmets , 2020 -# Jannis Leidel , 2011 -# Janno Liivak , 2013-2015 -# madisvain , 2011 -# Martin , 2014-2015,2021-2025 -# Martin , 2016-2017,2019-2020 -# Marti Raudsepp , 2014,2016 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Martin , 2014-2015,2021-2025\n" -"Language-Team: Estonian (http://app.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikaani" - -msgid "Arabic" -msgstr "araabia" - -msgid "Algerian Arabic" -msgstr "Alžeeria Araabia" - -msgid "Asturian" -msgstr "astuuria" - -msgid "Azerbaijani" -msgstr "aserbaidžaani" - -msgid "Bulgarian" -msgstr "bulgaaria" - -msgid "Belarusian" -msgstr "valgevene" - -msgid "Bengali" -msgstr "bengali" - -msgid "Breton" -msgstr "bretooni" - -msgid "Bosnian" -msgstr "bosnia" - -msgid "Catalan" -msgstr "katalaani" - -msgid "Central Kurdish (Sorani)" -msgstr "Keskkurdi keel (sorani)" - -msgid "Czech" -msgstr "tšehhi" - -msgid "Welsh" -msgstr "uelsi" - -msgid "Danish" -msgstr "taani" - -msgid "German" -msgstr "saksa" - -msgid "Lower Sorbian" -msgstr "alamsorbi" - -msgid "Greek" -msgstr "kreeka" - -msgid "English" -msgstr "inglise" - -msgid "Australian English" -msgstr "austraalia inglise" - -msgid "British English" -msgstr "briti inglise" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "hispaania" - -msgid "Argentinian Spanish" -msgstr "argentiina hispaani" - -msgid "Colombian Spanish" -msgstr "kolumbia hispaania" - -msgid "Mexican Spanish" -msgstr "mehhiko hispaania" - -msgid "Nicaraguan Spanish" -msgstr "nikaraagua hispaania" - -msgid "Venezuelan Spanish" -msgstr "venetsueela hispaania" - -msgid "Estonian" -msgstr "eesti" - -msgid "Basque" -msgstr "baski" - -msgid "Persian" -msgstr "pärsia" - -msgid "Finnish" -msgstr "soome" - -msgid "French" -msgstr "prantsuse" - -msgid "Frisian" -msgstr "friisi" - -msgid "Irish" -msgstr "iiri" - -msgid "Scottish Gaelic" -msgstr "šoti gaeli" - -msgid "Galician" -msgstr "galiitsia" - -msgid "Hebrew" -msgstr "heebrea" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "horvaatia" - -msgid "Upper Sorbian" -msgstr "ülemsorbi" - -msgid "Hungarian" -msgstr "ungari" - -msgid "Armenian" -msgstr "armeenia" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indoneesi" - -msgid "Igbo" -msgstr "ibo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandi" - -msgid "Italian" -msgstr "itaalia" - -msgid "Japanese" -msgstr "jaapani" - -msgid "Georgian" -msgstr "gruusia" - -msgid "Kabyle" -msgstr "Kabiili" - -msgid "Kazakh" -msgstr "kasahhi" - -msgid "Khmer" -msgstr "khmeri" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "korea" - -msgid "Kyrgyz" -msgstr "kirgiisi" - -msgid "Luxembourgish" -msgstr "letseburgi" - -msgid "Lithuanian" -msgstr "leedu" - -msgid "Latvian" -msgstr "läti" - -msgid "Macedonian" -msgstr "makedoonia" - -msgid "Malayalam" -msgstr "malaia" - -msgid "Mongolian" -msgstr "mongoolia" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malai" - -msgid "Burmese" -msgstr "birma" - -msgid "Norwegian Bokmål" -msgstr "norra bokmål" - -msgid "Nepali" -msgstr "nepali" - -msgid "Dutch" -msgstr "hollandi" - -msgid "Norwegian Nynorsk" -msgstr "norra (nynorsk)" - -msgid "Ossetic" -msgstr "osseetia" - -msgid "Punjabi" -msgstr "pandžab" - -msgid "Polish" -msgstr "poola" - -msgid "Portuguese" -msgstr "portugali" - -msgid "Brazilian Portuguese" -msgstr "brasiilia portugali" - -msgid "Romanian" -msgstr "rumeenia" - -msgid "Russian" -msgstr "vene" - -msgid "Slovak" -msgstr "slovaki" - -msgid "Slovenian" -msgstr "sloveeni" - -msgid "Albanian" -msgstr "albaania" - -msgid "Serbian" -msgstr "serbia" - -msgid "Serbian Latin" -msgstr "serbia (ladina)" - -msgid "Swedish" -msgstr "rootsi" - -msgid "Swahili" -msgstr "suahiili" - -msgid "Tamil" -msgstr "tamiili" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadžiki" - -msgid "Thai" -msgstr "tai" - -msgid "Turkmen" -msgstr "türkmeeni" - -msgid "Turkish" -msgstr "türgi" - -msgid "Tatar" -msgstr "tatari" - -msgid "Udmurt" -msgstr "udmurdi" - -msgid "Uyghur" -msgstr "Uiguuri" - -msgid "Ukrainian" -msgstr "ukrania" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "Usbeki" - -msgid "Vietnamese" -msgstr "vietnami" - -msgid "Simplified Chinese" -msgstr "lihtsustatud hiina" - -msgid "Traditional Chinese" -msgstr "traditsiooniline hiina" - -msgid "Messages" -msgstr "Sõnumid" - -msgid "Site Maps" -msgstr "Saidikaardid" - -msgid "Static Files" -msgstr "Staatilised failid" - -msgid "Syndication" -msgstr "Sündikeerimine" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "See lehe number ei ole täisarv" - -msgid "That page number is less than 1" -msgstr "See lehe number on väiksem kui 1" - -msgid "That page contains no results" -msgstr "See leht ei sisalda tulemusi" - -msgid "Enter a valid value." -msgstr "Sisestage korrektne väärtus." - -msgid "Enter a valid domain name." -msgstr "Sisestage korrektne domeeninimi." - -msgid "Enter a valid URL." -msgstr "Sisestage korrektne URL." - -msgid "Enter a valid integer." -msgstr "Sisestage korrektne täisarv." - -msgid "Enter a valid email address." -msgstr "Sisestage korrektne e-posti aadress." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Sisestage korrektne “nälk”, mis koosneb tähtedest, numbritest, " -"alakriipsudest või sidekriipsudest." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Sisestage korrektne “nälk”, mis koosneb Unicode tähtedest, numbritest, ala- " -"või sidekriipsudest." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Sisestage korrektne %(protocol)s aadress." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 või IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Sisestage ainult komaga eraldatud numbreid." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Veendu, et see väärtus on %(limit_value)s (hetkel on %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Veendu, et see väärtus on väiksem või võrdne kui %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Veendu, et see väärtus on suurem või võrdne kui %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Veendu, et see väärtus on arvu %(limit_value)s kordne." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Väärtuses peab olema vähemalt %(limit_value)d tähemärk (praegu on " -"%(show_value)d)." -msgstr[1] "" -"Väärtuses peab olema vähemalt %(limit_value)d tähemärki (praegu on " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Väärtuses võib olla kõige rohkem %(limit_value)d tähemärk (praegu on " -"%(show_value)d)." -msgstr[1] "" -"Väärtuses võib olla kõige rohkem %(limit_value)d tähemärki (praegu on " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Sisestage arv." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Veenduge, et kogu numbrikohtade arv ei oleks suurem kui %(max)s." -msgstr[1] "Veenduge, et kogu numbrikohtade arv ei oleks suurem kui %(max)s." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Veenduge, et komakohtade arv ei oleks suurem kui %(max)s." -msgstr[1] "Veenduge, et komakohtade arv ei oleks suurem kui %(max)s." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Veenduge, et komast vasakul olevaid numbreid ei oleks rohkem kui %(max)s." -msgstr[1] "" -"Veenduge, et komast vasakul olevaid numbreid ei oleks rohkem kui %(max)s." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Faililaiend “%(extension)s” pole lubatud. Lubatud laiendid on: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Tühjad tähemärgid ei ole lubatud." - -msgid "and" -msgstr "ja" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s väljaga %(field_labels)s on juba olemas." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Kitsendust “%(name)s” on rikutud." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Väärtus %(value)r ei ole kehtiv valik." - -msgid "This field cannot be null." -msgstr "See lahter ei tohi olla tühi." - -msgid "This field cannot be blank." -msgstr "See väli ei saa olla tühi." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Sellise %(field_label)s-väljaga %(model_name)s on juba olemas." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s peab olema unikaalne %(date_field_label)s %(lookup_type)s " -"suhtes." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Lahter tüüpi: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” väärtus peab olema Tõene või Väär." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” väärtus peab olema Tõene, Väär või Tühi." - -msgid "Boolean (Either True or False)" -msgstr "Tõeväärtus (Kas tõene või väär)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (kuni %(max_length)s märki)" - -msgid "String (unlimited)" -msgstr "String (piiramatu)" - -msgid "Comma-separated integers" -msgstr "Komaga eraldatud täisarvud" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” väärtusel on vale kuupäevaformaat. See peab olema kujul AAAA-KK-" -"PP." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” väärtusel on õige formaat (AAAA-KK-PP), kuid kuupäev on vale." - -msgid "Date (without time)" -msgstr "Kuupäev (kellaajata)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” väärtusel on vale formaat. Peab olema formaadis AAAA-KK-PP HH:" -"MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” väärtusel on õige formaat (AAAA-KK-PP HH:MM[:ss[.uuuuuu]][TZ]), " -"kuid kuupäev/kellaaeg on vale." - -msgid "Date (with time)" -msgstr "Kuupäev (kellaajaga)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” väärtus peab olema kümnendarv." - -msgid "Decimal number" -msgstr "Kümnendmurd" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” väärtusel on vale formaat. Peab olema formaadis [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Kestus" - -msgid "Email address" -msgstr "E-posti aadress" - -msgid "File path" -msgstr "Faili asukoht" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” väärtus peab olema ujukomaarv." - -msgid "Floating point number" -msgstr "Ujukomaarv" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” väärtus peab olema täisarv." - -msgid "Integer" -msgstr "Täisarv" - -msgid "Big (8 byte) integer" -msgstr "Suur (8 baiti) täisarv" - -msgid "Small integer" -msgstr "Väike täisarv" - -msgid "IPv4 address" -msgstr "IPv4 aadress" - -msgid "IP address" -msgstr "IP aadress" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” väärtus peab olema kas Tühi, Tõene või Väär." - -msgid "Boolean (Either True, False or None)" -msgstr "Tõeväärtus (Kas tõene, väär või tühi)" - -msgid "Positive big integer" -msgstr "Positiivne suur täisarv" - -msgid "Positive integer" -msgstr "Positiivne täisarv" - -msgid "Positive small integer" -msgstr "Positiivne väikene täisarv" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Nälk (kuni %(max_length)s märki)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” väärtusel on vale formaat. Peab olema formaadis HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” väärtusel on õige formaat (HH:MM[:ss[.uuuuuu]]), kuid kellaaeg " -"on vale." - -msgid "Time" -msgstr "Aeg" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Töötlemata binaarandmed" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” ei ole korrektne UUID." - -msgid "Universally unique identifier" -msgstr "Universaalne unikaalne identifikaator" - -msgid "File" -msgstr "Fail" - -msgid "Image" -msgstr "Pilt" - -msgid "A JSON object" -msgstr "JSON objekt" - -msgid "Value must be valid JSON." -msgstr "Väärtus peab olema korrektne JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s isendit %(field)s %(value)r ei ole kehtiv valik." - -msgid "Foreign Key (type determined by related field)" -msgstr "Välisvõti (tüübi määrab seotud väli) " - -msgid "One-to-one relationship" -msgstr "Üks-ühele seos" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s seos" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s seosed" - -msgid "Many-to-many relationship" -msgstr "Mitu-mitmele seos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "See lahter on nõutav." - -msgid "Enter a whole number." -msgstr "Sisestage täisarv." - -msgid "Enter a valid date." -msgstr "Sisestage korrektne kuupäev." - -msgid "Enter a valid time." -msgstr "Sisestage korrektne kellaaeg." - -msgid "Enter a valid date/time." -msgstr "Sisestage korrektne kuupäev ja kellaaeg." - -msgid "Enter a valid duration." -msgstr "Sisestage korrektne kestus." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Päevade arv peab jääma vahemikku {min_days} kuni {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ühtegi faili ei saadetud. Kontrollige vormi kodeeringutüüpi." - -msgid "No file was submitted." -msgstr "Ühtegi faili ei saadetud." - -msgid "The submitted file is empty." -msgstr "Saadetud fail on tühi." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Veenduge, et faili nimes poleks rohkem kui %(max)d märk (praegu on " -"%(length)d)." -msgstr[1] "" -"Veenduge, et faili nimes poleks rohkem kui %(max)d märki (praegu on " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Palun laadige fail või märgistage 'tühjenda' kast, mitte mõlemat." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Laadige korrektne pilt. Fail, mille laadisite, ei olnud kas pilt või oli " -"fail vigane." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Valige korrektne väärtus. %(value)s ei ole valitav." - -msgid "Enter a list of values." -msgstr "Sisestage väärtuste nimekiri." - -msgid "Enter a complete value." -msgstr "Sisestage täielik väärtus." - -msgid "Enter a valid UUID." -msgstr "Sisestage korrektne UUID." - -msgid "Enter a valid JSON." -msgstr "Sisestage korrektne JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Peidetud väli %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Palun kinnitage kõige rohkem %(num)d vormi." -msgstr[1] "Palun kinnitage kõige rohkem %(num)d vormi." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Palun kinnitage vähemalt %(num)d vormi." -msgstr[1] "Palun kinnitage vähemalt %(num)d vormi." - -msgid "Order" -msgstr "Järjestus" - -msgid "Delete" -msgstr "Kustuta" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Palun parandage duplikaat-andmed lahtris %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Palun parandage duplikaat-andmed lahtris %(field)s, mis peab olema unikaalne." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Palun parandage allolevad duplikaat-väärtused" - -msgid "The inline value did not match the parent instance." -msgstr "Pesastatud väärtus ei sobi ülemobjektiga." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Valige korrektne väärtus. Valitud väärtus ei ole valitav." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” ei ole korrektne väärtus." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s ei saanud tõlgendada ajavööndis %(current_timezone)s; see on " -"kas mitmetähenduslik või seda ei eksisteeri." - -msgid "Clear" -msgstr "Tühjenda" - -msgid "Currently" -msgstr "Hetkel" - -msgid "Change" -msgstr "Muuda" - -msgid "Unknown" -msgstr "Tundmatu" - -msgid "Yes" -msgstr "Jah" - -msgid "No" -msgstr "Ei" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "jah,ei,võib-olla" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bait" -msgstr[1] "%(size)d baiti" - -#, python-format -msgid "%s KB" -msgstr "%s kB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.l." - -msgid "a.m." -msgstr "e.l." - -msgid "PM" -msgstr "PL" - -msgid "AM" -msgstr "EL" - -msgid "midnight" -msgstr "südaöö" - -msgid "noon" -msgstr "keskpäev" - -msgid "Monday" -msgstr "esmaspäev" - -msgid "Tuesday" -msgstr "teisipäev" - -msgid "Wednesday" -msgstr "kolmapäev" - -msgid "Thursday" -msgstr "neljapäev" - -msgid "Friday" -msgstr "reede" - -msgid "Saturday" -msgstr "laupäev" - -msgid "Sunday" -msgstr "pühapäev" - -msgid "Mon" -msgstr "esmasp." - -msgid "Tue" -msgstr "teisip." - -msgid "Wed" -msgstr "kolmap." - -msgid "Thu" -msgstr "neljap." - -msgid "Fri" -msgstr "reede" - -msgid "Sat" -msgstr "laup." - -msgid "Sun" -msgstr "pühap." - -msgid "January" -msgstr "jaanuar" - -msgid "February" -msgstr "veebruar" - -msgid "March" -msgstr "märts" - -msgid "April" -msgstr "aprill" - -msgid "May" -msgstr "mai" - -msgid "June" -msgstr "juuni" - -msgid "July" -msgstr "juuli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktoober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "detsember" - -msgid "jan" -msgstr "jaan" - -msgid "feb" -msgstr "veeb" - -msgid "mar" -msgstr "märts" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sept" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dets" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jaan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "veeb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mär." - -msgctxt "abbrev. month" -msgid "April" -msgstr "apr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "juuni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juuli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dets." - -msgctxt "alt. month" -msgid "January" -msgstr "jaanuar" - -msgctxt "alt. month" -msgid "February" -msgstr "veebruar" - -msgctxt "alt. month" -msgid "March" -msgstr "märts" - -msgctxt "alt. month" -msgid "April" -msgstr "aprill" - -msgctxt "alt. month" -msgid "May" -msgstr "mai" - -msgctxt "alt. month" -msgid "June" -msgstr "juuni" - -msgctxt "alt. month" -msgid "July" -msgstr "juuli" - -msgctxt "alt. month" -msgid "August" -msgstr "august" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "oktoober" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "detsember" - -msgid "This is not a valid IPv6 address." -msgstr "See ei ole korrektne IPv6 aadress." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "või" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d aasta" -msgstr[1] "%(num)d aastat" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d kuu" -msgstr[1] "%(num)d kuud" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nädal" -msgstr[1] "%(num)d nädalat" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d päev" -msgstr[1] "%(num)d päeva" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d tund" -msgstr[1] "%(num)d tundi" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minutit" - -msgid "Forbidden" -msgstr "Keelatud" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF verifitseerimine ebaõnnestus. Päring katkestati." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Näete seda sõnumit, kuna käesolev HTTPS leht nõuab “Viitaja päise” saatmist " -"teie brauserile, kuid seda ei saadetud. Seda päist on vaja " -"turvakaalutlustel, kindlustamaks et teie brauserit ei ole kolmandate " -"osapoolte poolt üle võetud." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Kui olete oma brauseri seadistustes välja lülitanud “Viitaja” päised siis " -"lülitage need taas sisse vähemalt antud lehe jaoks või HTTPS üheduste jaoks " -"või “sama-allika” päringute jaoks." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Kui kasutate silti või " -"saadate päist “Referrer-Policy: no-referrer”, siis palun eemaldage need. " -"CSRF kaitse vajab range viitaja kontrolliks päist “Referer”. Kui privaatsus " -"on probleemiks, kasutage alternatiive nagu " -"linkidele, mis viivad kolmandate poolte lehtedele." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Näete seda teadet, kuna see leht vajab CSRF küpsist vormide postitamiseks. " -"Seda küpsist on vaja turvakaalutlustel, kindlustamaks et teie brauserit ei " -"ole kolmandate osapoolte poolt üle võetud." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Kui olete oma brauseris küpsised keelanud, siis palun lubage need vähemalt " -"selle lehe jaoks või “sama-allika” päringute jaoks." - -msgid "More information is available with DEBUG=True." -msgstr "Saadaval on rohkem infot kasutades DEBUG=True" - -msgid "No year specified" -msgstr "Aasta on valimata" - -msgid "Date out of range" -msgstr "Kuupäev vahemikust väljas" - -msgid "No month specified" -msgstr "Kuu on valimata" - -msgid "No day specified" -msgstr "Päev on valimata" - -msgid "No week specified" -msgstr "Nädal on valimata" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ei leitud %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Tulevane %(verbose_name_plural)s pole saadaval, sest %(class_name)s." -"allow_future on False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Vigane kuupäeva sõne “%(datestr)s” lähtudes formaadist “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Päringule vastavat %(verbose_name)s ei leitud" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Lehekülg pole “viimane” ja ei saa teda konvertida täisarvuks." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Vigane leht (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tühi list ja “%(class_name)s.allow_empty” on Väär." - -msgid "Directory indexes are not allowed here." -msgstr "Kausta sisuloendid ei ole siin lubatud." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” ei eksisteeri" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s sisuloend" - -msgid "The install worked successfully! Congratulations!" -msgstr "Paigaldamine õnnestus! Palju õnne!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Vaata release notes Djangole %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Näete seda lehte, kuna teil on määratud DEBUG=True Django seadete failis ja te ei ole ühtki " -"URLi seadistanud." - -msgid "Django Documentation" -msgstr "Django dokumentatsioon" - -msgid "Topics, references, & how-to’s" -msgstr "Teemad, viited, & õpetused" - -msgid "Tutorial: A Polling App" -msgstr "Õpetus: Küsitlusrakendus" - -msgid "Get started with Django" -msgstr "Alusta Djangoga" - -msgid "Django Community" -msgstr "Django Kogukond" - -msgid "Connect, get help, or contribute" -msgstr "Suhelge, küsige abi või panustage" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/et/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/et/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/et/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/et/formats.py deleted file mode 100644 index 3b2d9ba..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/et/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "G:i" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = " " # Non-breaking space -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index 031ad43..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index f3e91a8..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,1313 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aitzol Naberan , 2013,2016 -# Ander Martinez , 2013-2014 -# Eneko Illarramendi , 2017-2019,2021-2022,2024 -# Jannis Leidel , 2011 -# jazpillaga , 2011 -# julen, 2011-2012 -# julen, 2013,2015 -# Mikel Maldonado , 2021 -# totorika93 , 2012 -# 67feb0cba3962a6c9f09eb0e43697461_528661a , 2013 -# Urtzi Odriozola , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Eneko Illarramendi , " -"2017-2019,2021-2022,2024\n" -"Language-Team: Basque (http://app.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabiera" - -msgid "Algerian Arabic" -msgstr "Algeriar Arabiera" - -msgid "Asturian" -msgstr "Asturiera" - -msgid "Azerbaijani" -msgstr "Azerbaijanera" - -msgid "Bulgarian" -msgstr "Bulgariera" - -msgid "Belarusian" -msgstr "Bielorrusiera" - -msgid "Bengali" -msgstr "Bengalera" - -msgid "Breton" -msgstr "Bretoia" - -msgid "Bosnian" -msgstr "Bosniera" - -msgid "Catalan" -msgstr "Katalana" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Txekiera" - -msgid "Welsh" -msgstr "Galesa" - -msgid "Danish" -msgstr "Daniera" - -msgid "German" -msgstr "Alemana" - -msgid "Lower Sorbian" -msgstr "Behe-sorbiera" - -msgid "Greek" -msgstr "Greziera" - -msgid "English" -msgstr "Ingelesa" - -msgid "Australian English" -msgstr "Australiar ingelesa" - -msgid "British English" -msgstr "Ingelesa" - -msgid "Esperanto" -msgstr "Esperantoa" - -msgid "Spanish" -msgstr "Gaztelania" - -msgid "Argentinian Spanish" -msgstr "Gaztelania (Argentina)" - -msgid "Colombian Spanish" -msgstr "Gaztelania (Kolonbia)" - -msgid "Mexican Spanish" -msgstr "Gaztelania (Mexiko)" - -msgid "Nicaraguan Spanish" -msgstr "Gaztelania (Nikaragua)" - -msgid "Venezuelan Spanish" -msgstr "Gaztelania (Venezuela)" - -msgid "Estonian" -msgstr "Estoniera" - -msgid "Basque" -msgstr "Euskara" - -msgid "Persian" -msgstr "Persiera" - -msgid "Finnish" -msgstr "Finlandiera" - -msgid "French" -msgstr "Frantsesa" - -msgid "Frisian" -msgstr "Frisiera" - -msgid "Irish" -msgstr "Irlandako gaelikoa" - -msgid "Scottish Gaelic" -msgstr "Eskoziako gaelikoa" - -msgid "Galician" -msgstr "Galiziera" - -msgid "Hebrew" -msgstr "Hebreera" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroaziera" - -msgid "Upper Sorbian" -msgstr "Goi-sorbiera" - -msgid "Hungarian" -msgstr "Hungariera" - -msgid "Armenian" -msgstr "Armeniera" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesiera" - -msgid "Igbo" -msgstr "Igboera" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandiera" - -msgid "Italian" -msgstr "Italiera" - -msgid "Japanese" -msgstr "Japoniera" - -msgid "Georgian" -msgstr "Georgiera" - -msgid "Kabyle" -msgstr "Kabylera" - -msgid "Kazakh" -msgstr "Kazakhera" - -msgid "Khmer" -msgstr "Khmerera" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreera" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxenburgera" - -msgid "Lithuanian" -msgstr "Lituaniera" - -msgid "Latvian" -msgstr "Letoniera" - -msgid "Macedonian" -msgstr "Mazedoniera" - -msgid "Malayalam" -msgstr "Malabarera" - -msgid "Mongolian" -msgstr "Mongoliera" - -msgid "Marathi" -msgstr "Marathera" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Birmaniera" - -msgid "Norwegian Bokmål" -msgstr "Bokmåla (Norvegia)" - -msgid "Nepali" -msgstr "Nepalera" - -msgid "Dutch" -msgstr "Nederlandera" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk (Norvegia)" - -msgid "Ossetic" -msgstr "Osetiera" - -msgid "Punjabi" -msgstr "Punjabera" - -msgid "Polish" -msgstr "Poloniera" - -msgid "Portuguese" -msgstr "Portugesa" - -msgid "Brazilian Portuguese" -msgstr "Portugesa (Brazil)" - -msgid "Romanian" -msgstr "Errumaniera" - -msgid "Russian" -msgstr "Errusiera" - -msgid "Slovak" -msgstr "Eslovakiera" - -msgid "Slovenian" -msgstr "Esloveniera" - -msgid "Albanian" -msgstr "Albaniera" - -msgid "Serbian" -msgstr "Serbiera" - -msgid "Serbian Latin" -msgstr "Serbiera" - -msgid "Swedish" -msgstr "Suediera" - -msgid "Swahili" -msgstr "Swahilia" - -msgid "Tamil" -msgstr "Tamilera" - -msgid "Telugu" -msgstr "Telugua" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Thailandiera" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turkiera" - -msgid "Tatar" -msgstr "Tatarera" - -msgid "Udmurt" -msgstr "Udmurtera" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "Ukrainera" - -msgid "Urdu" -msgstr "Urdua" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamera" - -msgid "Simplified Chinese" -msgstr "Txinera (sinpletua)" - -msgid "Traditional Chinese" -msgstr "Txinera (tradizionala)" - -msgid "Messages" -msgstr "Mezuak" - -msgid "Site Maps" -msgstr "Sitemap-ak" - -msgid "Static Files" -msgstr "Fitxategi estatikoak" - -msgid "Syndication" -msgstr "Sindikazioa" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Orrialde hori ez da zenbaki bat" - -msgid "That page number is less than 1" -msgstr "Orrialde zenbaki hori 1 baino txikiagoa da" - -msgid "That page contains no results" -msgstr "Orrialde horrek ez du emaitzarik" - -msgid "Enter a valid value." -msgstr "Idatzi baleko balio bat." - -msgid "Enter a valid domain name." -msgstr "" - -msgid "Enter a valid URL." -msgstr "Idatzi baleko URL bat." - -msgid "Enter a valid integer." -msgstr "Idatzi baleko zenbaki bat." - -msgid "Enter a valid email address." -msgstr "Idatzi baleko helbide elektroniko bat." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "" - -msgid "IPv4" -msgstr "" - -msgid "IPv6" -msgstr "" - -msgid "IPv4 or IPv6" -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Idatzi komaz bereizitako digitoak soilik." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Ziurtatu balio hau gutxienez %(limit_value)s dela (orain %(show_value)s da)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ziurtatu balio hau %(limit_value)s baino txikiagoa edo berdina dela." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ziurtatu balio hau %(limit_value)s baino handiagoa edo berdina dela." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ziurtatu balio honek gutxienez karaktere %(limit_value)d duela " -"(%(show_value)d ditu)." -msgstr[1] "" -"Ziurtatu balio honek gutxienez %(limit_value)d karaktere dituela " -"(%(show_value)d ditu)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ziurtatu balio honek gehienez karaktere %(limit_value)d duela " -"(%(show_value)d ditu)." -msgstr[1] "" -"Ziurtatu balio honek gehienez %(limit_value)d karaktere dituela " -"(%(show_value)d ditu)." - -msgid "Enter a number." -msgstr "Idatzi zenbaki bat." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Ziurtatu digitu %(max)s baino gehiago ez dagoela guztira." -msgstr[1] "Ziurtatu %(max)s digitu baino gehiago ez dagoela guztira." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Ziurtatu ez dagoela digitu %(max)s baino gehiago komaren atzetik." -msgstr[1] "Ziurtatu ez dagoela %(max)s digitu baino gehiago komaren atzetik." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Ziurtatu ez dagoela digitu %(max)s baino gehiago komaren aurretik." -msgstr[1] "Ziurtatu ez dagoela %(max)s digitu baino gehiago komaren aurretik." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Null karaktereak ez daude baimenduta." - -msgid "and" -msgstr "eta" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s hauek dauzkan %(model_name)s dagoeneko existitzen da." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r balioa ez da baleko aukera bat." - -msgid "This field cannot be null." -msgstr "Eremu hau ezin daiteke hutsa izan (null)." - -msgid "This field cannot be blank." -msgstr "Eremu honek ezin du hutsik egon." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s hori daukan %(model_name)s dagoeneko existitzen da." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Eremuaren mota: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "\"%(value)s\" blioa True edo False izan behar da." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\" balioa, True, False edo None izan behar da." - -msgid "Boolean (Either True or False)" -msgstr "Boolearra (True edo False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String-a (%(max_length)s gehienez)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Komaz bereiztutako zenbaki osoak" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"\"%(value)s\" balioa data formatu okerra dauka. UUUU-HH-EE formatua izan " -"behar da." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"\"%(value)s\" balioa formatu egokia dauka (UUUU-HH-EE), baina data okerra." - -msgid "Date (without time)" -msgstr "Data (ordurik gabe)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Data (orduarekin)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "\"%(value)s\" balioa zenbaki hamartarra izan behar da." - -msgid "Decimal number" -msgstr "Zenbaki hamartarra" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"\"%(value)s\" balioa formatu okerra dauka. [EE][[OO:]MM:]ss[.uuuuuu] " -"formatua izan behar du." - -msgid "Duration" -msgstr "Iraupena" - -msgid "Email address" -msgstr "Helbide elektronikoa" - -msgid "File path" -msgstr "Fitxategiaren bidea" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "\"%(value)s\" float izan behar da." - -msgid "Floating point number" -msgstr "Koma higikorreko zenbakia (float)" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "\"%(value)s\" zenbaki osoa izan behar da." - -msgid "Integer" -msgstr "Zenbaki osoa" - -msgid "Big (8 byte) integer" -msgstr "Zenbaki osoa (handia 8 byte)" - -msgid "Small integer" -msgstr "Osoko txikia" - -msgid "IPv4 address" -msgstr "IPv4 sare-helbidea" - -msgid "IP address" -msgstr "IP helbidea" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"%(value)s\" None, True edo False izan behar da." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolearra (True, False edo None)" - -msgid "Positive big integer" -msgstr "Zenbaki positivo osoa-handia" - -msgid "Positive integer" -msgstr "Osoko positiboa" - -msgid "Positive small integer" -msgstr "Osoko positibo txikia" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (gehienez %(max_length)s)" - -msgid "Text" -msgstr "Testua" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Ordua" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datu bitar gordinak" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "\"Universally unique identifier\"" - -msgid "File" -msgstr "Fitxategia" - -msgid "Image" -msgstr "Irudia" - -msgid "A JSON object" -msgstr "JSON objektu bat" - -msgid "Value must be valid JSON." -msgstr "Balioa baliozko JSON bat izan behar da." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"%(field)s %(value)r edukidun %(model)s modeloko instantziarik ez da " -"exiistitzen." - -msgid "Foreign Key (type determined by related field)" -msgstr "1-N (mota erlazionatutako eremuaren arabera)" - -msgid "One-to-one relationship" -msgstr "Bat-bat erlazioa" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s erlazioa" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s erlazioak" - -msgid "Many-to-many relationship" -msgstr "M:N erlazioa" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Eremu hau beharrezkoa da." - -msgid "Enter a whole number." -msgstr "Idatzi zenbaki oso bat." - -msgid "Enter a valid date." -msgstr "Idatzi baleko data bat." - -msgid "Enter a valid time." -msgstr "Idatzi baleko ordu bat." - -msgid "Enter a valid date/time." -msgstr "Idatzi baleko data/ordu bat." - -msgid "Enter a valid duration." -msgstr "Idatzi baleko iraupen bat." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Egun kopuruak {min_days} eta {max_days} artean egon behar du." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ez da fitxategirik bidali. Egiaztatu formularioaren kodeketa-mota." - -msgid "No file was submitted." -msgstr "Ez da fitxategirik bidali." - -msgid "The submitted file is empty." -msgstr "Bidalitako fitxategia hutsik dago." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Ziurtatu fitxategi izen honek gehienez karaktere %(max)d duela (%(length)d " -"ditu)." -msgstr[1] "" -"Ziurtatu fitxategi izen honek gehienez %(max)d karaktere dituela (%(length)d " -"ditu)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Mesedez, igo fitxategi bat edo egin klik garbitu botoian, ez biak." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Igo baleko irudi bat. Zuk igotako fitxategia ez da irudi bat edo akatsen bat " -"du." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Hautatu baleko aukera bat. %(value)s ez dago erabilgarri." - -msgid "Enter a list of values." -msgstr "Idatzi balio-zerrenda bat." - -msgid "Enter a complete value." -msgstr "Sartu balio osoa." - -msgid "Enter a valid UUID." -msgstr "Idatzi baleko UUID bat." - -msgid "Enter a valid JSON." -msgstr "Sartu baliozko JSON bat" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(%(name)s eremu ezkutua) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Ordena" - -msgid "Delete" -msgstr "Ezabatu" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Zuzendu bikoiztketa %(field)s eremuan." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Zuzendu bikoizketa %(field)s eremuan. Bakarra izan behar da." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Zuzendu bakarra izan behar den%(field_name)s eremuarentzako bikoiztutako " -"data %(lookup)s egiteko %(date_field)s eremuan" - -msgid "Please correct the duplicate values below." -msgstr "Zuzendu hurrengo balio bikoiztuak." - -msgid "The inline value did not match the parent instance." -msgstr "Barneko balioa eta gurasoaren instantzia ez datoz bat." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Hautatu aukera zuzen bat. Hautatutakoa ez da zuzena." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Garbitu" - -msgid "Currently" -msgstr "Orain" - -msgid "Change" -msgstr "Aldatu" - -msgid "Unknown" -msgstr "Ezezaguna" - -msgid "Yes" -msgstr "Bai" - -msgid "No" -msgstr "Ez" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "bai,ez,agian" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "byte %(size)d " -msgstr[1] "%(size)d byte" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "gauerdia" - -msgid "noon" -msgstr "eguerdia" - -msgid "Monday" -msgstr "astelehena" - -msgid "Tuesday" -msgstr "asteartea" - -msgid "Wednesday" -msgstr "asteazkena" - -msgid "Thursday" -msgstr "osteguna" - -msgid "Friday" -msgstr "ostirala" - -msgid "Saturday" -msgstr "larunbata" - -msgid "Sunday" -msgstr "igandea" - -msgid "Mon" -msgstr "al" - -msgid "Tue" -msgstr "ar" - -msgid "Wed" -msgstr "az" - -msgid "Thu" -msgstr "og" - -msgid "Fri" -msgstr "ol" - -msgid "Sat" -msgstr "lr" - -msgid "Sun" -msgstr "ig" - -msgid "January" -msgstr "urtarrila" - -msgid "February" -msgstr "otsaila" - -msgid "March" -msgstr "martxoa" - -msgid "April" -msgstr "apirila" - -msgid "May" -msgstr "maiatza" - -msgid "June" -msgstr "ekaina" - -msgid "July" -msgstr "uztaila" - -msgid "August" -msgstr "abuztua" - -msgid "September" -msgstr "iraila" - -msgid "October" -msgstr "urria" - -msgid "November" -msgstr "azaroa" - -msgid "December" -msgstr "abendua" - -msgid "jan" -msgstr "urt" - -msgid "feb" -msgstr "ots" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "api" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "eka" - -msgid "jul" -msgstr "uzt" - -msgid "aug" -msgstr "abu" - -msgid "sep" -msgstr "ira" - -msgid "oct" -msgstr "urr" - -msgid "nov" -msgstr "aza" - -msgid "dec" -msgstr "abe" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "urt." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ots." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "api." - -msgctxt "abbrev. month" -msgid "May" -msgstr "mai." - -msgctxt "abbrev. month" -msgid "June" -msgstr "eka." - -msgctxt "abbrev. month" -msgid "July" -msgstr "uzt." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "abu." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ira." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "urr." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "aza." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "abe." - -msgctxt "alt. month" -msgid "January" -msgstr "urtarrila" - -msgctxt "alt. month" -msgid "February" -msgstr "otsaila" - -msgctxt "alt. month" -msgid "March" -msgstr "martxoa" - -msgctxt "alt. month" -msgid "April" -msgstr "apirila" - -msgctxt "alt. month" -msgid "May" -msgstr "maiatza" - -msgctxt "alt. month" -msgid "June" -msgstr "ekaina" - -msgctxt "alt. month" -msgid "July" -msgstr "uztaila" - -msgctxt "alt. month" -msgid "August" -msgstr "abuztua" - -msgctxt "alt. month" -msgid "September" -msgstr "iraila" - -msgctxt "alt. month" -msgid "October" -msgstr "urria" - -msgctxt "alt. month" -msgid "November" -msgstr "azaroa" - -msgctxt "alt. month" -msgid "December" -msgstr "abendua" - -msgid "This is not a valid IPv6 address." -msgstr "Hau ez da baleko IPv6 helbide bat." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "edo" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "urte %(num)d" -msgstr[1] "%(num)d urte" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "hilabete %(num)d" -msgstr[1] "%(num)d hilabete" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "aste %(num)d" -msgstr[1] "%(num)d aste" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "egun %(num)d" -msgstr[1] "%(num)d egun" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "ordu %(num)d" -msgstr[1] "%(num)d ordu" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "minutu %(num)d" -msgstr[1] "%(num)d minutu" - -msgid "Forbidden" -msgstr "Debekatuta" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF egiaztapenak huts egin du. Eskaera abortatu da." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Formularioa bidaltzean gune honek CSRF cookie bat behar duelako ikusten duzu " -"mezu hau. Cookie hau beharrezkoa da segurtasun arrazoiengatik, zure " -"nabigatzailea beste batek ordezkatzen ez duela ziurtatzeko." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Informazio gehiago erabilgarri dago DEBUG=True ezarrita." - -msgid "No year specified" -msgstr "Ez da urterik zehaztu" - -msgid "Date out of range" -msgstr "Data baliozko tartetik kanpo" - -msgid "No month specified" -msgstr "Ez da hilabeterik zehaztu" - -msgid "No day specified" -msgstr "Ez da egunik zehaztu" - -msgid "No week specified" -msgstr "Ez da asterik zehaztu" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ez dago %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Etorkizuneko %(verbose_name_plural)s ez dago aukeran %(class_name)s." -"allow_future False delako" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Bilaketarekin bat datorren %(verbose_name)s-rik ez dago" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Orri baliogabea (%(page_number)s):%(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Direktorio zerrendak ez daude baimenduak." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" ez da existitzen" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s zerrenda" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalazioak arrakastaz funtzionatu du! Zorionak!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Ikusi Django %(version)s-ren argitaratze " -"oharrak" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Zure settings fitxategian DEBUG=True jarrita eta URLrik konfiguratu gabe duzulako " -"ari zara ikusten orrialde hau." - -msgid "Django Documentation" -msgstr "Django dokumentazioa" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "Tutoriala: Galdetegi aplikazioa" - -msgid "Get started with Django" -msgstr "Hasi Djangorekin" - -msgid "Django Community" -msgstr "Django Komunitatea" - -msgid "Connect, get help, or contribute" -msgstr "Konektatu, lortu laguntza edo lagundu" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/eu/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/eu/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/eu/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/eu/formats.py deleted file mode 100644 index 61b16fb..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/eu/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"Y\k\o N j\a" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"Y\k\o N j\a, H:i" -YEAR_MONTH_FORMAT = r"Y\k\o F" -MONTH_DAY_FORMAT = r"F\r\e\n j\a" -SHORT_DATE_FORMAT = "Y-m-d" -SHORT_DATETIME_FORMAT = "Y-m-d H:i" -FIRST_DAY_OF_WEEK = 1 # Astelehena - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index c131325..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index 440cf8e..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,1343 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ahmad Hosseini , 2020 -# alirezamastery , 2021 -# ali salehi, 2023 -# Ali Vakilzade , 2015 -# Arash Fazeli , 2012 -# Eric Hamiter , 2019 -# Eshagh , 2022 -# Farshad Asadpour, 2021 -# Jannis Leidel , 2011 -# Mariusz Felisiak , 2021 -# Mazdak Badakhshan , 2014 -# Milad Hazrati , 2019 -# MJafar Mashhadi , 2018 -# Mohammad Hossein Mojtahedi , 2013,2019 -# Pouya Abbassi, 2016 -# Pouya Abbassi, 2016 -# rahim agh , 2020-2021 -# Reza Mohammadi , 2013-2016 -# Saeed , 2011 -# Sina Cheraghi , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 06:49+0000\n" -"Last-Translator: ali salehi, 2023\n" -"Language-Team: Persian (http://app.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Afrikaans" -msgstr "آفریکانس" - -msgid "Arabic" -msgstr "عربی" - -msgid "Algerian Arabic" -msgstr "عربی الجزایری" - -msgid "Asturian" -msgstr "آستوری" - -msgid "Azerbaijani" -msgstr "آذربایجانی" - -msgid "Bulgarian" -msgstr "بلغاری" - -msgid "Belarusian" -msgstr "بلاروس" - -msgid "Bengali" -msgstr "بنگالی" - -msgid "Breton" -msgstr "برتون" - -msgid "Bosnian" -msgstr "بوسنیایی" - -msgid "Catalan" -msgstr "کاتالونیایی" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "چکی" - -msgid "Welsh" -msgstr "ویلزی" - -msgid "Danish" -msgstr "دانمارکی" - -msgid "German" -msgstr "آلمانی" - -msgid "Lower Sorbian" -msgstr "صربستانی پایین" - -msgid "Greek" -msgstr "یونانی" - -msgid "English" -msgstr "انگلیسی" - -msgid "Australian English" -msgstr "انگلیسی استرالیایی" - -msgid "British English" -msgstr "انگلیسی بریتیش" - -msgid "Esperanto" -msgstr "اسپرانتو" - -msgid "Spanish" -msgstr "اسپانیایی" - -msgid "Argentinian Spanish" -msgstr "اسپانیایی آرژانتینی" - -msgid "Colombian Spanish" -msgstr "اسپانیایی کلمبیایی" - -msgid "Mexican Spanish" -msgstr "اسپانیولی مکزیکی" - -msgid "Nicaraguan Spanish" -msgstr "نیکاراگوئه اسپانیایی" - -msgid "Venezuelan Spanish" -msgstr "ونزوئلا اسپانیایی" - -msgid "Estonian" -msgstr "استونی" - -msgid "Basque" -msgstr "باسکی" - -msgid "Persian" -msgstr "فارسی" - -msgid "Finnish" -msgstr "فنلاندی" - -msgid "French" -msgstr "فرانسوی" - -msgid "Frisian" -msgstr "فریزی" - -msgid "Irish" -msgstr "ایرلندی" - -msgid "Scottish Gaelic" -msgstr "گیلیک اسکاتلندی" - -msgid "Galician" -msgstr "گالیسیایی" - -msgid "Hebrew" -msgstr "عبری" - -msgid "Hindi" -msgstr "هندی" - -msgid "Croatian" -msgstr "کرواتی" - -msgid "Upper Sorbian" -msgstr "صربستانی بالا" - -msgid "Hungarian" -msgstr "مجاری" - -msgid "Armenian" -msgstr "ارمنی" - -msgid "Interlingua" -msgstr "اینترلینگوا" - -msgid "Indonesian" -msgstr "اندونزیایی" - -msgid "Igbo" -msgstr "ایگبو" - -msgid "Ido" -msgstr "ایدو" - -msgid "Icelandic" -msgstr "ایسلندی" - -msgid "Italian" -msgstr "ایتالیایی" - -msgid "Japanese" -msgstr "ژاپنی" - -msgid "Georgian" -msgstr "گرجی" - -msgid "Kabyle" -msgstr "قبایلی" - -msgid "Kazakh" -msgstr "قزاقستان" - -msgid "Khmer" -msgstr "خمری" - -msgid "Kannada" -msgstr "کناده‌ای" - -msgid "Korean" -msgstr "کره‌ای" - -msgid "Kyrgyz" -msgstr "قرقیزی" - -msgid "Luxembourgish" -msgstr "لوگزامبورگی" - -msgid "Lithuanian" -msgstr "لیتوانی" - -msgid "Latvian" -msgstr "لتونیایی" - -msgid "Macedonian" -msgstr "مقدونی" - -msgid "Malayalam" -msgstr "مالایایی" - -msgid "Mongolian" -msgstr "مغولی" - -msgid "Marathi" -msgstr "مِراتی" - -msgid "Malay" -msgstr "Malay" - -msgid "Burmese" -msgstr "برمه‌ای" - -msgid "Norwegian Bokmål" -msgstr "نروژی" - -msgid "Nepali" -msgstr "نپالی" - -msgid "Dutch" -msgstr "هلندی" - -msgid "Norwegian Nynorsk" -msgstr "نروژی Nynorsk" - -msgid "Ossetic" -msgstr "آسی" - -msgid "Punjabi" -msgstr "پنجابی" - -msgid "Polish" -msgstr "لهستانی" - -msgid "Portuguese" -msgstr "پرتغالی" - -msgid "Brazilian Portuguese" -msgstr "پرتغالیِ برزیل" - -msgid "Romanian" -msgstr "رومانی" - -msgid "Russian" -msgstr "روسی" - -msgid "Slovak" -msgstr "اسلواکی" - -msgid "Slovenian" -msgstr "اسلووِنی" - -msgid "Albanian" -msgstr "آلبانیایی" - -msgid "Serbian" -msgstr "صربی" - -msgid "Serbian Latin" -msgstr "صربی لاتین" - -msgid "Swedish" -msgstr "سوئدی" - -msgid "Swahili" -msgstr "سواحیلی" - -msgid "Tamil" -msgstr "تامیلی" - -msgid "Telugu" -msgstr "تلوگویی" - -msgid "Tajik" -msgstr "تاجیک" - -msgid "Thai" -msgstr "تایلندی" - -msgid "Turkmen" -msgstr "ترکمن" - -msgid "Turkish" -msgstr "ترکی" - -msgid "Tatar" -msgstr "تاتار" - -msgid "Udmurt" -msgstr "ادمورت" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "اکراینی" - -msgid "Urdu" -msgstr "اردو" - -msgid "Uzbek" -msgstr "ازبکی" - -msgid "Vietnamese" -msgstr "ویتنامی" - -msgid "Simplified Chinese" -msgstr "چینی ساده‌شده" - -msgid "Traditional Chinese" -msgstr "چینی سنتی" - -msgid "Messages" -msgstr "پیغام‌ها" - -msgid "Site Maps" -msgstr "نقشه‌های وب‌گاه" - -msgid "Static Files" -msgstr "پرونده‌های استاتیک" - -msgid "Syndication" -msgstr "پیوند" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "شمارهٔ صفحه یک عدد طبیعی نیست" - -msgid "That page number is less than 1" -msgstr "شمارهٔ صفحه کوچکتر از ۱ است" - -msgid "That page contains no results" -msgstr "این صفحه خالی از اطلاعات است" - -msgid "Enter a valid value." -msgstr "یک مقدار معتبر وارد کنید." - -msgid "Enter a valid URL." -msgstr "یک نشانی اینترنتی معتبر وارد کنید." - -msgid "Enter a valid integer." -msgstr "یک عدد معتبر وارد کنید." - -msgid "Enter a valid email address." -msgstr "یک ایمیل آدرس معتبر وارد کنید." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"یک \"اسلاگ\" معتبر متشکل از حروف، اعداد، خط زیر یا خط فاصله، وارد کنید. " - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"یک \"اسلاگ\" معتبر وارد کنید که شامل حروف یونیکد، اعداد، خط زیر یا خط فاصله " -"باشد." - -msgid "Enter a valid IPv4 address." -msgstr "یک نشانی IPv4 معتبر وارد کنید." - -msgid "Enter a valid IPv6 address." -msgstr "یک آدرس معتبر IPv6 وارد کنید." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "IPv4 یا IPv6 آدرس معتبر وارد کنید." - -msgid "Enter only digits separated by commas." -msgstr "فقط ارقام جدا شده با کاما وارد کنید." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "مطمئن شوید مقدار %(limit_value)s است. (اکنون %(show_value)s می باشد)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "مطمئن شوید این مقدار کوچکتر و یا مساوی %(limit_value)s است." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "مطمئن شوید این مقدار بزرگتر و یا مساوی %(limit_value)s است." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"طول این مقدار باید حداقل %(limit_value)d کاراکتر باشد (طولش %(show_value)d " -"است)." -msgstr[1] "" -"طول این مقدار باید حداقل %(limit_value)d کاراکتر باشد (طولش %(show_value)d " -"است)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"طول این مقدار باید حداکثر %(limit_value)d کاراکتر باشد (طولش %(show_value)d " -"است)." -msgstr[1] "" -"طول این مقدار باید حداکثر %(limit_value)d کاراکتر باشد (طولش %(show_value)d " -"است)." - -msgid "Enter a number." -msgstr "یک عدد وارد کنید." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "نباید در مجموع بیش از %(max)s رقم داشته باشد." -msgstr[1] "نباید در مجموع بیش از %(max)s رقم داشته باشد." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "نباید بیش از %(max)s رقم اعشار داشته باشد." -msgstr[1] "نباید بیش از %(max)s رقم اعشار داشته باشد." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "نباید بیش از %(max)s رقم قبل ممیز داشته باشد." -msgstr[1] "نباید بیش از %(max)s رقم قبل ممیز داشته باشد." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"استفاده از پرونده با پسوند '%(extension)s' مجاز نیست. پسوند‌های مجاز عبارتند " -"از: '%(allowed_extensions)s'" - -msgid "Null characters are not allowed." -msgstr "کاراکترهای تهی مجاز نیستند." - -msgid "and" -msgstr "و" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "‏%(model_name)s با این %(field_labels)s وجود دارد." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "مقدار %(value)r انتخاب معتبری نیست. " - -msgid "This field cannot be null." -msgstr "این فیلد نمی تواند پوچ باشد." - -msgid "This field cannot be blank." -msgstr "این فیلد نمی تواند خالی باشد." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s با این %(field_label)s از قبل موجود است." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"‏%(field_label)s باید برای %(lookup_type)s %(date_field_label)s یکتا باشد." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "فیلد با نوع: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "مقدار «%(value)s» باید True یا False باشد." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "مقدار «%(value)s» باید True یا False یا None باشد." - -msgid "Boolean (Either True or False)" -msgstr "بولی (درست یا غلط)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "رشته (تا %(max_length)s)" - -msgid "String (unlimited)" -msgstr "رشته (بی نهایت)" - -msgid "Comma-separated integers" -msgstr "اعداد صحیح جدا-شده با ویلگول" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"مقدار «%(value)s» در قالب نادرستی وارد شده است. تاریخ باید در قالب YYYY-MM-" -"DD باشد." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"مقدار تاریخ «%(value)s» با اینکه در قالب درستی (YYYY-MM-DD) است ولی تاریخ " -"ناممکنی را نشان می‌دهد." - -msgid "Date (without time)" -msgstr "تاریخ (بدون زمان)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"مقدار \"%(value)s\" یک قالب نامعتبر دارد. باید در قالب YYYY-MM-DD HH:MM[:" -"ss[.uuuuuu]][TZ] باشد." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"مقدار \"%(value)s\" یک قالب معتبر دارد (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"اما یک تاریخ/زمان نامعتبر است." - -msgid "Date (with time)" -msgstr "تاریخ (با زمان)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "مقدار '%(value)s' باید عدد دسیمال باشد." - -msgid "Decimal number" -msgstr "عدد دهدهی" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"مقدار «%(value)s» در قالب نادرستی وارد شده است. باید در قالب ‎[DD] [HH:" -"[MM:]]ss[.uuuuuu]‎ باشد." - -msgid "Duration" -msgstr "بازهٔ زمانی" - -msgid "Email address" -msgstr "نشانی پست الکترونیکی" - -msgid "File path" -msgstr "مسیر پرونده" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "مقدار «%(value)s» باید عدد اعشاری فلوت باشد." - -msgid "Floating point number" -msgstr "عدد اعشاری" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "مقدار «%(value)s» باید عدد حقیقی باشد." - -msgid "Integer" -msgstr "عدد صحیح" - -msgid "Big (8 byte) integer" -msgstr "بزرگ (8 بایت) عدد صحیح" - -msgid "Small integer" -msgstr "عدد صحیح کوچک" - -msgid "IPv4 address" -msgstr "IPv4 آدرس" - -msgid "IP address" -msgstr "نشانی IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "مقدار «%(value)s» باید True یا False یا None باشد." - -msgid "Boolean (Either True, False or None)" -msgstr "‌بولی (درست، نادرست یا پوچ)" - -msgid "Positive big integer" -msgstr "عدد صحیح مثبت" - -msgid "Positive integer" -msgstr "عدد صحیح مثبت" - -msgid "Positive small integer" -msgstr "مثبت عدد صحیح کوچک" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "تیتر (حداکثر %(max_length)s)" - -msgid "Text" -msgstr "متن" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"مقدار «%(value)s» در قالب نادرستی وارد شده است. باید در قالب HH:MM[:ss[." -"uuuuuu]]‎ باشد." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"مقدار «%(value)s» با اینکه در قالب درستی (HH:MM[:ss[.uuuuuu]]‎) است ولی زمان " -"ناممکنی را نشان می‌دهد." - -msgid "Time" -msgstr "زمان" - -msgid "URL" -msgstr "نشانی اینترنتی" - -msgid "Raw binary data" -msgstr "دادهٔ دودویی خام" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" یک UUID معتبر نیست." - -msgid "Universally unique identifier" -msgstr "شناسه منحصر به فرد سراسری" - -msgid "File" -msgstr "پرونده" - -msgid "Image" -msgstr "تصویر" - -msgid "A JSON object" -msgstr "یک شیء JSON" - -msgid "Value must be valid JSON." -msgstr "مقدار، باید یک JSON معتبر باشد." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s با %(field)s %(value)r وجود ندارد." - -msgid "Foreign Key (type determined by related field)" -msgstr "کلید خارجی ( نوع بر اساس فیلد رابط مشخص میشود )" - -msgid "One-to-one relationship" -msgstr "رابطه یک به یک " - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "رابطه %(from)s به %(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "روابط %(from)s به %(to)s" - -msgid "Many-to-many relationship" -msgstr "رابطه چند به چند" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":؟.!" - -msgid "This field is required." -msgstr "این فیلد لازم است." - -msgid "Enter a whole number." -msgstr "به طور کامل یک عدد وارد کنید." - -msgid "Enter a valid date." -msgstr "یک تاریخ معتبر وارد کنید." - -msgid "Enter a valid time." -msgstr "یک زمان معتبر وارد کنید." - -msgid "Enter a valid date/time." -msgstr "یک تاریخ/زمان معتبر وارد کنید." - -msgid "Enter a valid duration." -msgstr "یک بازهٔ زمانی معتبر وارد کنید." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "عدد روز باید بین {min_days} و {max_days} باشد." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "پرونده‌ای ارسال نشده است. نوع کدگذاری فرم را بررسی کنید." - -msgid "No file was submitted." -msgstr "پرونده‌ای ارسال نشده است." - -msgid "The submitted file is empty." -msgstr "پروندهٔ ارسال‌شده خالیست." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"طول عنوان پرونده باید حداقل %(max)d کاراکتر باشد (طولش %(length)d است)." -msgstr[1] "" -"طول عنوان پرونده باید حداقل %(max)d کاراکتر باشد (طولش %(length)d است)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "لطفا یا فایل ارسال کنید یا دکمه پاک کردن را علامت بزنید، نه هردو." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"یک تصویر معتبر بارگذاری کنید. پرونده‌ای که بارگذاری کردید یا تصویر نبوده و یا " -"تصویری مخدوش بوده است." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "یک گزینهٔ معتبر انتخاب کنید. %(value)s از گزینه‌های موجود نیست." - -msgid "Enter a list of values." -msgstr "فهرستی از مقادیر وارد کنید." - -msgid "Enter a complete value." -msgstr "یک مقدار کامل وارد کنید." - -msgid "Enter a valid UUID." -msgstr "یک UUID معتبر وارد کنید." - -msgid "Enter a valid JSON." -msgstr "یک JSON معتبر وارد کنید" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(فیلد پنهان %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"اطلاعات ManagementForm مفقود یا دستکاری شده است. ردیف های مفقود شده: " -"%(field_names)s. اگر این مشکل ادامه داشت، آن را گزارش کنید." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ترتیب:" - -msgid "Delete" -msgstr "حذف" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "لطفا محتوی تکراری برای %(field)s را اصلاح کنید." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "لطفا محتوی تکراری برای %(field)s را که باید یکتا باشد اصلاح کنید." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"لطفا اطلاعات تکراری %(field_name)s را اصلاح کنید که باید در %(lookup)s " -"یکتا باشد %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "لطفا مقدار تکراری را اصلاح کنید." - -msgid "The inline value did not match the parent instance." -msgstr "مقدار درون خطی موجود با نمونه والد آن مطابقت ندارد." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "یک گزینهٔ معتبر انتخاب کنید. آن گزینه از گزینه‌های موجود نیست." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" یک مقدار معتبر نیست." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)sدر محدوده زمانی %(current_timezone)s، قابل تفسیر نیست؛ ممکن است " -"نامشخص باشد یا اصلاً وجود نداشته باشد." - -msgid "Clear" -msgstr "پاک کردن" - -msgid "Currently" -msgstr "در حال حاضر" - -msgid "Change" -msgstr "تغییر" - -msgid "Unknown" -msgstr "ناشناخته" - -msgid "Yes" -msgstr "بله" - -msgid "No" -msgstr "خیر" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "بله،خیر،شاید" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d بایت" -msgstr[1] "%(size)d بایت" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "ب.ظ." - -msgid "a.m." -msgstr "صبح" - -msgid "PM" -msgstr "بعد از ظهر" - -msgid "AM" -msgstr "صبح" - -msgid "midnight" -msgstr "نیمه شب" - -msgid "noon" -msgstr "ظهر" - -msgid "Monday" -msgstr "دوشنبه" - -msgid "Tuesday" -msgstr "سه شنبه" - -msgid "Wednesday" -msgstr "چهارشنبه" - -msgid "Thursday" -msgstr "پنجشنبه" - -msgid "Friday" -msgstr "جمعه" - -msgid "Saturday" -msgstr "شنبه" - -msgid "Sunday" -msgstr "یکشنبه" - -msgid "Mon" -msgstr "دوشنبه" - -msgid "Tue" -msgstr "سه‌شنبه" - -msgid "Wed" -msgstr "چهارشنبه" - -msgid "Thu" -msgstr "پنجشنبه" - -msgid "Fri" -msgstr "جمعه" - -msgid "Sat" -msgstr "شنبه" - -msgid "Sun" -msgstr "یکشنبه" - -msgid "January" -msgstr "ژانویه" - -msgid "February" -msgstr "فوریه" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "آوریل" - -msgid "May" -msgstr "مه" - -msgid "June" -msgstr "ژوئن" - -msgid "July" -msgstr "ژوئیه" - -msgid "August" -msgstr "اوت" - -msgid "September" -msgstr "سپتامبر" - -msgid "October" -msgstr "اکتبر" - -msgid "November" -msgstr "نوامبر" - -msgid "December" -msgstr "دسامبر" - -msgid "jan" -msgstr "ژانویه" - -msgid "feb" -msgstr "فوریه" - -msgid "mar" -msgstr "مارس" - -msgid "apr" -msgstr "آوریل" - -msgid "may" -msgstr "مه" - -msgid "jun" -msgstr "ژوئن" - -msgid "jul" -msgstr "ژوئیه" - -msgid "aug" -msgstr "اوت" - -msgid "sep" -msgstr "سپتامبر" - -msgid "oct" -msgstr "اکتبر" - -msgid "nov" -msgstr "نوامبر" - -msgid "dec" -msgstr "دسامبر" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "ژانویه" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "فوریه" - -msgctxt "abbrev. month" -msgid "March" -msgstr "مارس" - -msgctxt "abbrev. month" -msgid "April" -msgstr "آوریل" - -msgctxt "abbrev. month" -msgid "May" -msgstr "مه" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ژوئن" - -msgctxt "abbrev. month" -msgid "July" -msgstr "جولای" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "اوت" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "سپتامبر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "اکتبر" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "نوامبر" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "دسامبر" - -msgctxt "alt. month" -msgid "January" -msgstr "ژانویه" - -msgctxt "alt. month" -msgid "February" -msgstr "فوریه" - -msgctxt "alt. month" -msgid "March" -msgstr "مارس" - -msgctxt "alt. month" -msgid "April" -msgstr "آوریل" - -msgctxt "alt. month" -msgid "May" -msgstr "مه" - -msgctxt "alt. month" -msgid "June" -msgstr "ژوئن" - -msgctxt "alt. month" -msgid "July" -msgstr "جولای" - -msgctxt "alt. month" -msgid "August" -msgstr "اوت" - -msgctxt "alt. month" -msgid "September" -msgstr "سپتامبر" - -msgctxt "alt. month" -msgid "October" -msgstr "اکتبر" - -msgctxt "alt. month" -msgid "November" -msgstr "نوامبر" - -msgctxt "alt. month" -msgid "December" -msgstr "دسامبر" - -msgid "This is not a valid IPv6 address." -msgstr "این مقدار آدرس IPv6 معتبری نیست." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "یا" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "،" - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d سال" -msgstr[1] "%(num)d سال" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ماه" -msgstr[1] "%(num)d ماه" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d هفته" -msgstr[1] "%(num)d هفته" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d روز" -msgstr[1] "%(num)d روز" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ساعت" -msgstr[1] "%(num)d ساعت" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d دقیقه" -msgstr[1] "%(num)d دقیقه" - -msgid "Forbidden" -msgstr "ممنوع" - -msgid "CSRF verification failed. Request aborted." -msgstr "‏CSRF تأیید نشد. درخواست لغو شد." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"شما این پیغام را مشاهده میکنید برای اینکه این HTTPS site نیازمند یک " -"\"Referer header\" برای ارسال توسط مرورگر شما دارد،‌اما مقداری ارسال " -"نمیشود . این هدر الزامی میباشد برای امنیت ، در واقع برای اینکه مرورگر شما " -"مطمین شود hijack به عنوان نفر سوم (third parties) در میان نیست" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"اگر در مرورگر خود سر تیتر \"Referer\" را غیرفعال کرده‌اید، لطفاً آن را فعال " -"کنید، یا حداقل برای این وب‌گاه یا برای ارتباطات HTTPS و یا برای درخواست‌های " -"\"Same-origin\" فعال کنید." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"اگر شما از تگ استفاده " -"می‌کنید یا سر تیتر \"Referrer-Policy: no-referrer\" را اضافه کرده‌اید، لطفاً " -"آن را حذف کنید. محافظ CSRF به سرتیتر \"Referer\" نیاز دارد تا بتواند بررسی " -"سخت‌گیرانه ارجاع دهنده را انجام دهد. اگر ملاحظاتی در مورد حریم خصوصی دارید از " -"روش‎‌های جایگزین مانند برای ارجاع دادن به وب‌گاه‌های " -"شخص ثالث استفاده کنید." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"شما این پیام را میبینید چون این سایت نیازمند کوکی «جعل درخواست میان وبگاهی " -"(CSRF)» است. این کوکی برای امنیت شما ضروری است. با این کوکی می‌توانیم از " -"اینکه شخص ثالثی کنترل مرورگرتان را به دست نگرفته است اطمینان پیدا کنیم." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"اگر مرورگر خود را تنظیم کرده‌اید که کوکی غیرفعال باشد، لطفاً مجدداً آن را فعال " -"کنید؛ حداقل برای این وب‌گاه یا برای درخواست‌های \"same-origin\"." - -msgid "More information is available with DEBUG=True." -msgstr "اطلاعات بیشتر با DEBUG=True ارائه خواهد شد." - -msgid "No year specified" -msgstr "هیچ سالی مشخص نشده است" - -msgid "Date out of range" -msgstr "تاریخ غیرمجاز است" - -msgid "No month specified" -msgstr "هیچ ماهی مشخص نشده است" - -msgid "No day specified" -msgstr "هیچ روزی مشخص نشده است" - -msgid "No week specified" -msgstr "هیچ هفته‌ای مشخص نشده است" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "هیچ %(verbose_name_plural)s موجود نیست" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"آینده %(verbose_name_plural)s امکان پذیر نیست زیرا مقدار %(class_name)s." -"allow_future برابر False تنظیم شده است." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "نوشته تاریخ \"%(datestr)s\" در قالب \"%(format)s\" نامعتبر است" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "هیچ %(verbose_name)s ای مطابق جستجو پیدا نشد." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "صفحه \"آخرین\" نیست یا شماره صفحه قابل ترجمه به یک عدد صحیح نیست." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "صفحه‌ی اشتباه (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "لیست خالی و \"%(class_name)s.allow_empty\" برابر False است." - -msgid "Directory indexes are not allowed here." -msgstr "شاخص دایرکتوری اینجا قابل قبول نیست." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" وجود ندارد " - -#, python-format -msgid "Index of %(directory)s" -msgstr "فهرست %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "نصب درست کار کرد. تبریک می گویم!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"نمایش release notes برای نسخه %(version)s " -"جنگو" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"شما این صفحه را به این دلیل مشاهده می کنید که DEBUG=True در فایل تنظیمات شما وجود دارد و شما هیچ URL " -"تنظیم نکرده اید." - -msgid "Django Documentation" -msgstr "مستندات جنگو" - -msgid "Topics, references, & how-to’s" -msgstr "سرفصل‌ها، منابع و دستورالعمل‌ها" - -msgid "Tutorial: A Polling App" -msgstr "آموزش گام به گام: برنامکی برای رأی‌گیری" - -msgid "Get started with Django" -msgstr "شروع به کار با جنگو" - -msgid "Django Community" -msgstr "جامعهٔ جنگو" - -msgid "Connect, get help, or contribute" -msgstr "متصل شوید، کمک بگیرید یا مشارکت کنید" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fa/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fa/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fa/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fa/formats.py deleted file mode 100644 index e7019bc..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fa/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j F Y، ساعت G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y/n/j" -SHORT_DATETIME_FORMAT = "Y/n/j،‏ G:i" -FIRST_DAY_OF_WEEK = 6 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index 9f2e77d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index 9eefc88..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,1341 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2017-2018,2020-2022,2025 -# Antti Kaihola , 2011 -# Jannis Leidel , 2011 -# Jiri Grönroos , 2021,2023 -# Lasse Liehu-Inui , 2015 -# Mika Mäkelä , 2018 -# Klaus Dahlén, 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Aarni Koskela, 2015,2017-2018,2020-2022,2025\n" -"Language-Team: Finnish (http://app.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikaans" - -msgid "Arabic" -msgstr "arabia" - -msgid "Algerian Arabic" -msgstr "Algerian arabia" - -msgid "Asturian" -msgstr "asturian kieli" - -msgid "Azerbaijani" -msgstr "azeri" - -msgid "Bulgarian" -msgstr "bulgaria" - -msgid "Belarusian" -msgstr "valkovenäjän kieli" - -msgid "Bengali" -msgstr "bengali" - -msgid "Breton" -msgstr "bretoni" - -msgid "Bosnian" -msgstr "bosnia" - -msgid "Catalan" -msgstr "katalaani" - -msgid "Central Kurdish (Sorani)" -msgstr "Keskikurdi (sorani)" - -msgid "Czech" -msgstr "tšekki" - -msgid "Welsh" -msgstr "wales" - -msgid "Danish" -msgstr "tanska" - -msgid "German" -msgstr "saksa" - -msgid "Lower Sorbian" -msgstr "Alasorbi" - -msgid "Greek" -msgstr "kreikka" - -msgid "English" -msgstr "englanti" - -msgid "Australian English" -msgstr "australianenglanti" - -msgid "British English" -msgstr "brittienglanti" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "espanja" - -msgid "Argentinian Spanish" -msgstr "Argentiinan espanja" - -msgid "Colombian Spanish" -msgstr "Kolumbian espanja" - -msgid "Mexican Spanish" -msgstr "Meksikon espanja" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguan espanja" - -msgid "Venezuelan Spanish" -msgstr "Venezuelan espanja" - -msgid "Estonian" -msgstr "viro" - -msgid "Basque" -msgstr "baski" - -msgid "Persian" -msgstr "persia" - -msgid "Finnish" -msgstr "suomi" - -msgid "French" -msgstr "ranska" - -msgid "Frisian" -msgstr "friisi" - -msgid "Irish" -msgstr "irlanti" - -msgid "Scottish Gaelic" -msgstr "skottilainen gaeli" - -msgid "Galician" -msgstr "galicia" - -msgid "Hebrew" -msgstr "heprea" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "kroatia" - -msgid "Upper Sorbian" -msgstr "Yläsorbi" - -msgid "Hungarian" -msgstr "unkari" - -msgid "Armenian" -msgstr "armenian kieli" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indonesia" - -msgid "Igbo" -msgstr "igbo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islanti" - -msgid "Italian" -msgstr "italia" - -msgid "Japanese" -msgstr "japani" - -msgid "Georgian" -msgstr "georgia" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "kazakin kieli" - -msgid "Khmer" -msgstr "khmerin kieli" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "korea" - -msgid "Kyrgyz" -msgstr "kirgiisi" - -msgid "Luxembourgish" -msgstr "luxemburgin kieli" - -msgid "Lithuanian" -msgstr "liettua" - -msgid "Latvian" -msgstr "latvia" - -msgid "Macedonian" -msgstr "makedonia" - -msgid "Malayalam" -msgstr "malajalam" - -msgid "Mongolian" -msgstr "mongolia" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malaiji" - -msgid "Burmese" -msgstr "burman kieli" - -msgid "Norwegian Bokmål" -msgstr "norja (bokmål)" - -msgid "Nepali" -msgstr "nepalin kieli" - -msgid "Dutch" -msgstr "hollanti" - -msgid "Norwegian Nynorsk" -msgstr "norja (uusnorja)" - -msgid "Ossetic" -msgstr "osseetin kieli" - -msgid "Punjabi" -msgstr "punjabin kieli" - -msgid "Polish" -msgstr "puola" - -msgid "Portuguese" -msgstr "portugali" - -msgid "Brazilian Portuguese" -msgstr "brasilian portugali" - -msgid "Romanian" -msgstr "romania" - -msgid "Russian" -msgstr "venäjä" - -msgid "Slovak" -msgstr "slovakia" - -msgid "Slovenian" -msgstr "slovenia" - -msgid "Albanian" -msgstr "albaani" - -msgid "Serbian" -msgstr "serbia" - -msgid "Serbian Latin" -msgstr "serbian latina" - -msgid "Swedish" -msgstr "ruotsi" - -msgid "Swahili" -msgstr "swahili" - -msgid "Tamil" -msgstr "tamili" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadžikki" - -msgid "Thai" -msgstr "thain kieli" - -msgid "Turkmen" -msgstr "turkmeeni" - -msgid "Turkish" -msgstr "turkki" - -msgid "Tatar" -msgstr "tataarin kieli" - -msgid "Udmurt" -msgstr "udmurtti" - -msgid "Uyghur" -msgstr "uiguuri" - -msgid "Ukrainian" -msgstr "ukraina" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "uzbekki" - -msgid "Vietnamese" -msgstr "vietnam" - -msgid "Simplified Chinese" -msgstr "kiina (yksinkertaistettu)" - -msgid "Traditional Chinese" -msgstr "kiina (perinteinen)" - -msgid "Messages" -msgstr "Viestit" - -msgid "Site Maps" -msgstr "Sivukartat" - -msgid "Static Files" -msgstr "Staattiset tiedostot" - -msgid "Syndication" -msgstr "Syndikointi" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Annettu sivunumero ei ole kokonaisluku" - -msgid "That page number is less than 1" -msgstr "Annettu sivunumero on alle 1" - -msgid "That page contains no results" -msgstr "Annetulla sivulla ei ole tuloksia" - -msgid "Enter a valid value." -msgstr "Syötä oikea arvo." - -msgid "Enter a valid domain name." -msgstr "Syötä kelvollinen domainnimi." - -msgid "Enter a valid URL." -msgstr "Syötä oikea URL-osoite." - -msgid "Enter a valid integer." -msgstr "Syötä kelvollinen kokonaisluku." - -msgid "Enter a valid email address." -msgstr "Syötä kelvollinen sähköpostiosoite." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Anna lyhytnimi joka koostuu vain kirjaimista, numeroista sekä ala- ja " -"tavuviivoista." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Anna lyhytnimi joka koostuu vain Unicode-kirjaimista, numeroista sekä ala- " -"ja tavuviivoista." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Syötä kelvollinen %(protocol)s-osoite." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4- tai IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Vain pilkulla erotetut numeromerkit kelpaavat tässä." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Tämän arvon on oltava %(limit_value)s (nyt %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Tämän arvon on oltava enintään %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Tämän luvun on oltava vähintään %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Tämän arvon tulee olla askelkoon %(limit_value)smonikerta. " - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Tämän arvon tulee olla arvon %(limit_value)smonikerta, alkaen luvusta " -"%(offset)s, eli esim. %(offset)s, %(valid_value1)s, %(valid_value2)s, jne." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Varmista, että tämä arvo on vähintään %(limit_value)d merkin pituinen (tällä " -"hetkellä %(show_value)d)." -msgstr[1] "" -"Tämän arvon tulee olla vähintään %(limit_value)d merkkiä pitkä (tällä " -"hetkellä %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Varmista, että tämä arvo on enintään %(limit_value)d merkin pituinen (tällä " -"hetkellä %(show_value)d)." -msgstr[1] "" -"Tämän arvon tulee olla enintään %(limit_value)d merkkiä pitkä (tällä " -"hetkellä %(show_value)d)." - -msgid "Enter a number." -msgstr "Syötä luku." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Tässä luvussa voi olla yhteensä enintään %(max)s numero." -msgstr[1] "Tässä luvussa voi olla yhteensä enintään %(max)s numeroa." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Tässä luvussa saa olla enintään %(max)s desimaali." -msgstr[1] "Tässä luvussa saa olla enintään %(max)s desimaalia." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Tässä luvussa saa olla enintään %(max)s numero ennen desimaalipilkkua." -msgstr[1] "" -"Tässä luvussa saa olla enintään %(max)s numeroa ennen desimaalipilkkua." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Pääte \"%(extension)s\" ei ole sallittu. Sallittuja päätteitä ovat " -"\"%(allowed_extensions)s\"." - -msgid "Null characters are not allowed." -msgstr "Tyhjiä merkkejä (null) ei sallita." - -msgid "and" -msgstr "ja" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s jolla on nämä %(field_labels)s on jo olemassa." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Rajoitetta \"%(name)s\" loukataan." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Arvo %(value)r ei kelpaa." - -msgid "This field cannot be null." -msgstr "Tämän kentän arvo ei voi olla \"null\"." - -msgid "This field cannot be blank." -msgstr "Tämä kenttä ei voi olla tyhjä." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s jolla on tämä %(field_label)s, on jo olemassa." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"\"%(field_label)s\"-kentän on oltava uniikki suhteessa: %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Kenttä tyyppiä: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "%(value)s-arvo pitää olla joko tosi tai epätosi." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "%(value)s-arvo pitää olla joko tosi, epätosi tai ei mitään." - -msgid "Boolean (Either True or False)" -msgstr "Totuusarvo: joko tosi (True) tai epätosi (False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Merkkijono (enintään %(max_length)s merkkiä)" - -msgid "String (unlimited)" -msgstr "Merkkijono (rajoittamaton)" - -msgid "Comma-separated integers" -msgstr "Pilkulla erotetut kokonaisluvut" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"%(value)s-arvo on väärässä päivämäärämuodossa. Sen tulee olla VVVV-KK-PP -" -"muodossa." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"%(value)s-arvo on oikeassa päivämäärämuodossa (VVVV-KK-PP), muttei ole " -"kelvollinen päivämäärä." - -msgid "Date (without time)" -msgstr "Päivämäärä (ilman kellonaikaa)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"%(value)s-arvon muoto ei kelpaa. Se tulee olla VVVV-KK-PP TT:MM[:ss[.uuuuuu]]" -"[TZ] -muodossa." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"%(value)s-arvon muoto on oikea (VVVV-KK-PP TT:MM[:ss[.uuuuuu]][TZ]), mutta " -"päivämäärä/aika ei ole kelvollinen." - -msgid "Date (with time)" -msgstr "Päivämäärä ja kellonaika" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "%(value)s-arvo tulee olla desimaaliluku." - -msgid "Decimal number" -msgstr "Desimaaliluku" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "%(value)s-arvo pitää olla muodossa [PP] TT:MM[:ss[.uuuuuu]]." - -msgid "Duration" -msgstr "Kesto" - -msgid "Email address" -msgstr "Sähköpostiosoite" - -msgid "File path" -msgstr "Tiedostopolku" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "%(value)s-arvo tulee olla liukuluku." - -msgid "Floating point number" -msgstr "Liukuluku" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "%(value)s-arvo tulee olla kokonaisluku." - -msgid "Integer" -msgstr "Kokonaisluku" - -msgid "Big (8 byte) integer" -msgstr "Suuri (8-tavuinen) kokonaisluku" - -msgid "Small integer" -msgstr "Pieni kokonaisluku" - -msgid "IPv4 address" -msgstr "IPv4-osoite" - -msgid "IP address" -msgstr "IP-osoite" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "%(value)s-arvo tulee olla joko ei mitään, tosi tai epätosi." - -msgid "Boolean (Either True, False or None)" -msgstr "Totuusarvo: joko tosi (True), epätosi (False) tai ei mikään (None)" - -msgid "Positive big integer" -msgstr "Suuri positiivinen kokonaisluku" - -msgid "Positive integer" -msgstr "Positiivinen kokonaisluku" - -msgid "Positive small integer" -msgstr "Pieni positiivinen kokonaisluku" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Lyhytnimi (enintään %(max_length)s merkkiä)" - -msgid "Text" -msgstr "Tekstiä" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "%(value)s-arvo pitää olla muodossa TT:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"%(value)s-arvo on oikeassa muodossa (TT:MM[:ss[.uuuuuu]]), mutta kellonaika " -"ei kelpaa." - -msgid "Time" -msgstr "Kellonaika" - -msgid "URL" -msgstr "URL-osoite" - -msgid "Raw binary data" -msgstr "Raaka binaaridata" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "%(value)s ei ole kelvollinen UUID." - -msgid "Universally unique identifier" -msgstr "UUID-tunnus" - -msgid "File" -msgstr "Tiedosto" - -msgid "Image" -msgstr "Kuva" - -msgid "A JSON object" -msgstr "JSON-tietue" - -msgid "Value must be valid JSON." -msgstr "Arvon pitää olla kelvollista JSONia." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Vierasavain (tyyppi määräytyy liittyvän kentän mukaan)" - -msgid "One-to-one relationship" -msgstr "Yksi-yhteen -relaatio" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s -suhde" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s -suhteet" - -msgid "Many-to-many relationship" -msgstr "Moni-moneen -relaatio" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Tämä kenttä vaaditaan." - -msgid "Enter a whole number." -msgstr "Syötä kokonaisluku." - -msgid "Enter a valid date." -msgstr "Syötä oikea päivämäärä." - -msgid "Enter a valid time." -msgstr "Syötä oikea kellonaika." - -msgid "Enter a valid date/time." -msgstr "Syötä oikea pvm/kellonaika." - -msgid "Enter a valid duration." -msgstr "Syötä oikea kesto." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Päivien määrä täytyy olla välillä {min_days} ja {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Tiedostoa ei lähetetty. Tarkista lomakkeen koodaus (encoding)." - -msgid "No file was submitted." -msgstr "Yhtään tiedostoa ei ole lähetetty." - -msgid "The submitted file is empty." -msgstr "Lähetetty tiedosto on tyhjä." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Varmista, että tämä tiedostonimi on enintään %(max)d merkin pituinen (tällä " -"hetkellä %(length)d)." -msgstr[1] "" -"Tämän tiedostonimen pituus tulee olla enintään %(max)d merkkiä pitkä (tällä " -"hetkellä %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Voit joko lähettää tai poistaa tiedoston, muttei kumpaakin samalla." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vioittunut." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Valitse oikea vaihtoehto. %(value)s ei ole vaihtoehtojen joukossa." - -msgid "Enter a list of values." -msgstr "Syötä lista." - -msgid "Enter a complete value." -msgstr "Syötä kokonainen arvo." - -msgid "Enter a valid UUID." -msgstr "Syötä oikea UUID." - -msgid "Enter a valid JSON." -msgstr "Syötä oikea JSON-arvo." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Piilokenttä %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-tiedot puuttuvat tai niitä on muutettu. Puuttuvat kentät ovat " -"%(field_names)s. Jos ongelma toistuu, voi olla että joudut raportoimaan " -"tämän bugina." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Lähetä enintään%(num)d lomake." -msgstr[1] "Lähetä enintään %(num)d lomaketta." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Lähetä vähintään %(num)d lomake." -msgstr[1] "Lähetä vähintään %(num)d lomaketta. " - -msgid "Order" -msgstr "Järjestys" - -msgid "Delete" -msgstr "Poista" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Korjaa kaksoisarvo kentälle %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Ole hyvä ja korjaa uniikin kentän %(field)s kaksoisarvo." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Korjaa alla olevat kaksoisarvot." - -msgid "The inline value did not match the parent instance." -msgstr "Liittyvä arvo ei vastannut vanhempaa instanssia." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Valitse oikea vaihtoehto. Valintasi ei löydy vaihtoehtojen joukosta." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" ei ole kelvollinen arvo." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s -arvoa ei pystytty lukemaan aikavyöhykkeellä " -"%(current_timezone)s; se saattaa olla moniarvoinen tai määrittämätön." - -msgid "Clear" -msgstr "Poista" - -msgid "Currently" -msgstr "Tällä hetkellä" - -msgid "Change" -msgstr "Muokkaa" - -msgid "Unknown" -msgstr "Tuntematon" - -msgid "Yes" -msgstr "Kyllä" - -msgid "No" -msgstr "Ei" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "kyllä,ei,ehkä" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d tavu" -msgstr[1] "%(size)d tavua" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "ip" - -msgid "a.m." -msgstr "ap" - -msgid "PM" -msgstr "IP" - -msgid "AM" -msgstr "AP" - -msgid "midnight" -msgstr "keskiyö" - -msgid "noon" -msgstr "keskipäivä" - -msgid "Monday" -msgstr "maanantai" - -msgid "Tuesday" -msgstr "tiistai" - -msgid "Wednesday" -msgstr "keskiviikko" - -msgid "Thursday" -msgstr "torstai" - -msgid "Friday" -msgstr "perjantai" - -msgid "Saturday" -msgstr "lauantai" - -msgid "Sunday" -msgstr "sunnuntai" - -msgid "Mon" -msgstr "ma" - -msgid "Tue" -msgstr "ti" - -msgid "Wed" -msgstr "ke" - -msgid "Thu" -msgstr "to" - -msgid "Fri" -msgstr "pe" - -msgid "Sat" -msgstr "la" - -msgid "Sun" -msgstr "su" - -msgid "January" -msgstr "tammikuu" - -msgid "February" -msgstr "helmikuu" - -msgid "March" -msgstr "maaliskuu" - -msgid "April" -msgstr "huhtikuu" - -msgid "May" -msgstr "toukokuu" - -msgid "June" -msgstr "kesäkuu" - -msgid "July" -msgstr "heinäkuu" - -msgid "August" -msgstr "elokuu" - -msgid "September" -msgstr "syyskuu" - -msgid "October" -msgstr "lokakuu" - -msgid "November" -msgstr "marraskuu" - -msgid "December" -msgstr "joulukuu" - -msgid "jan" -msgstr "tam" - -msgid "feb" -msgstr "hel" - -msgid "mar" -msgstr "maa" - -msgid "apr" -msgstr "huh" - -msgid "may" -msgstr "tou" - -msgid "jun" -msgstr "kes" - -msgid "jul" -msgstr "hei" - -msgid "aug" -msgstr "elo" - -msgid "sep" -msgstr "syy" - -msgid "oct" -msgstr "lok" - -msgid "nov" -msgstr "mar" - -msgid "dec" -msgstr "jou" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "tammi" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "helmi" - -msgctxt "abbrev. month" -msgid "March" -msgstr "maalis" - -msgctxt "abbrev. month" -msgid "April" -msgstr "huhti" - -msgctxt "abbrev. month" -msgid "May" -msgstr "touko" - -msgctxt "abbrev. month" -msgid "June" -msgstr "kesä" - -msgctxt "abbrev. month" -msgid "July" -msgstr "heinä" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "elo" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "syys" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "loka" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "marras" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "joulu" - -msgctxt "alt. month" -msgid "January" -msgstr "tammikuuta" - -msgctxt "alt. month" -msgid "February" -msgstr "helmikuuta" - -msgctxt "alt. month" -msgid "March" -msgstr "maaliskuuta" - -msgctxt "alt. month" -msgid "April" -msgstr "huhtikuuta" - -msgctxt "alt. month" -msgid "May" -msgstr "toukokuuta" - -msgctxt "alt. month" -msgid "June" -msgstr "kesäkuuta" - -msgctxt "alt. month" -msgid "July" -msgstr "heinäkuuta" - -msgctxt "alt. month" -msgid "August" -msgstr "elokuuta" - -msgctxt "alt. month" -msgid "September" -msgstr "syyskuuta" - -msgctxt "alt. month" -msgid "October" -msgstr "lokakuuta" - -msgctxt "alt. month" -msgid "November" -msgstr "marraskuuta" - -msgctxt "alt. month" -msgid "December" -msgstr "joulukuuta" - -msgid "This is not a valid IPv6 address." -msgstr "Tämä ei ole kelvollinen IPv6-osoite." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "tai" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d vuosi" -msgstr[1] "%(num)d vuotta" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d kuukausi" -msgstr[1] "%(num)d kuukautta " - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d viikko" -msgstr[1] "%(num)d viikkoa" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d päivä" -msgstr[1] "%(num)d päivää" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d tunti" -msgstr[1] "%(num)d tuntia" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuutti" -msgstr[1] "%(num)d minuuttia" - -msgid "Forbidden" -msgstr "Kielletty" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-vahvistus epäonnistui. Pyyntö hylätty." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Näet tämän viestin, koska tämä HTTPS-sivusto vaatii selaintasi lähettämään " -"Referer-otsakkeen, mutta sitä ei vastaanotettu. Otsake vaaditaan " -"turvallisuussyistä, varmistamaan etteivät kolmannet osapuolet ole ottaneet " -"selaintasi haltuun." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Jos olet konfiguroinut selaimesi olemaan lähettämättä Referer-otsaketta, ole " -"hyvä ja kytke otsake takaisin päälle ainakin tälle sivulle, HTTPS-" -"yhteyksille tai saman lähteen (\"same-origin\") pyynnöille." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Jos käytät -tagia tai " -"\"Referrer-Policy: no-referrer\" -otsaketta, ole hyvä ja poista ne. CSRF-" -"suojaus vaatii Referer-otsakkeen tehdäkseen tarkan referer-tarkistuksen. Jos " -"vaadit yksityisyyttä, käytä vaihtoehtoja kuten linkittääksesi kolmannen osapuolen sivuille." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Näet tämän viestin, koska tämä sivusto vaatii CSRF-evästeen " -"vastaanottaessaan lomaketietoja. Eväste vaaditaan turvallisuussyistä, " -"varmistamaan etteivät kolmannet osapuolet ole ottaneet selaintasi haltuun." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Jos olet konfiguroinut selaimesi olemaan vastaanottamatta tai lähettämättä " -"evästeitä, ole hyvä ja kytke evästeet takaisin päälle ainakin tälle sivulle " -"tai saman lähteen (\"same-origin\") pyynnöille." - -msgid "More information is available with DEBUG=True." -msgstr "Lisätietoja `DEBUG=True`-konfiguraatioasetuksella." - -msgid "No year specified" -msgstr "Vuosi puuttuu" - -msgid "Date out of range" -msgstr "Päivämäärä ei alueella" - -msgid "No month specified" -msgstr "Kuukausi puuttuu" - -msgid "No day specified" -msgstr "Päivä puuttuu" - -msgid "No week specified" -msgstr "Viikko puuttuu" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s: yhtään kohdetta ei löydy" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s: tulevia kohteita ei löydy, koska %(class_name)s." -"allow_future:n arvo on False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Päivämäärä '%(datestr)s' ei ole muotoa '%(format)s'" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Hakua vastaavaa %(verbose_name)s -kohdetta ei löytynyt" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Sivunumero ei ole 'last' (viimeinen) eikä näytä luvulta." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Epäkelpo sivu (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista on tyhjä, ja '%(class_name)s.allow_empty':n arvo on False." - -msgid "Directory indexes are not allowed here." -msgstr "Hakemistolistauksia ei sallita täällä." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" ei ole olemassa" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Hakemistolistaus: %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Asennus toimi! Onneksi olkoon!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Katso Djangon version %(version)s julkaisutiedot" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Näet tämän viestin, koska asetuksissasi on DEBUG = True etkä ole konfiguroinut yhtään URL-" -"osoitetta." - -msgid "Django Documentation" -msgstr "Django-dokumentaatio" - -msgid "Topics, references, & how-to’s" -msgstr "Aiheet, viittaukset & how-tot" - -msgid "Tutorial: A Polling App" -msgstr "Tutoriaali: kyselyapplikaatio" - -msgid "Get started with Django" -msgstr "Miten päästä alkuun Djangolla" - -msgid "Django Community" -msgstr "Django-yhteisö" - -msgid "Connect, get help, or contribute" -msgstr "Verkostoidu, saa apua tai jatkokehitä" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fi/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fi/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fi/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fi/formats.py deleted file mode 100644 index d9fb6d2..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fi/formats.py +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. E Y" -TIME_FORMAT = "G.i" -DATETIME_FORMAT = r"j. E Y \k\e\l\l\o G.i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.n.Y" -SHORT_DATETIME_FORMAT = "j.n.Y G.i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '20.3.2014' - "%d.%m.%y", # '20.3.14' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H.%M.%S", # '20.3.2014 14.30.59' - "%d.%m.%Y %H.%M.%S.%f", # '20.3.2014 14.30.59.000200' - "%d.%m.%Y %H.%M", # '20.3.2014 14.30' - "%d.%m.%y %H.%M.%S", # '20.3.14 14.30.59' - "%d.%m.%y %H.%M.%S.%f", # '20.3.14 14.30.59.000200' - "%d.%m.%y %H.%M", # '20.3.14 14.30' -] -TIME_INPUT_FORMATS = [ - "%H.%M.%S", # '14.30.59' - "%H.%M.%S.%f", # '14.30.59.000200' - "%H.%M", # '14.30' -] - -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # Non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 108dbf0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index 34351cc..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1395 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bruno Brouard , 2021 -# Simon Charette , 2012 -# Claude Paroz , 2013-2025 -# Claude Paroz , 2011 -# Jannis Leidel , 2011 -# Jean-Baptiste Mora, 2014 -# Larlet David , 2011 -# Marie-Cécile Gohier , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Claude Paroz , 2013-2025\n" -"Language-Team: French (http://app.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabe" - -msgid "Algerian Arabic" -msgstr "Arabe algérien" - -msgid "Asturian" -msgstr "Asturien" - -msgid "Azerbaijani" -msgstr "Azéri" - -msgid "Bulgarian" -msgstr "Bulgare" - -msgid "Belarusian" -msgstr "Biélorusse" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosniaque" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurde central (sorani)" - -msgid "Czech" -msgstr "Tchèque" - -msgid "Welsh" -msgstr "Gallois" - -msgid "Danish" -msgstr "Danois" - -msgid "German" -msgstr "Allemand" - -msgid "Lower Sorbian" -msgstr "Bas-sorabe" - -msgid "Greek" -msgstr "Grec" - -msgid "English" -msgstr "Anglais" - -msgid "Australian English" -msgstr "Anglais australien" - -msgid "British English" -msgstr "Anglais britannique" - -msgid "Esperanto" -msgstr "Espéranto" - -msgid "Spanish" -msgstr "Espagnol" - -msgid "Argentinian Spanish" -msgstr "Espagnol argentin" - -msgid "Colombian Spanish" -msgstr "Espagnol colombien" - -msgid "Mexican Spanish" -msgstr "Espagnol mexicain" - -msgid "Nicaraguan Spanish" -msgstr "Espagnol nicaraguayen" - -msgid "Venezuelan Spanish" -msgstr "Espagnol vénézuélien" - -msgid "Estonian" -msgstr "Estonien" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Perse" - -msgid "Finnish" -msgstr "Finlandais" - -msgid "French" -msgstr "Français" - -msgid "Frisian" -msgstr "Frison" - -msgid "Irish" -msgstr "Irlandais" - -msgid "Scottish Gaelic" -msgstr "Gaélique écossais" - -msgid "Galician" -msgstr "Galicien" - -msgid "Hebrew" -msgstr "Hébreu" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croate" - -msgid "Upper Sorbian" -msgstr "Haut-sorabe" - -msgid "Hungarian" -msgstr "Hongrois" - -msgid "Armenian" -msgstr "Arménien" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonésien" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandais" - -msgid "Italian" -msgstr "Italien" - -msgid "Japanese" -msgstr "Japonais" - -msgid "Georgian" -msgstr "Géorgien" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Coréen" - -msgid "Kyrgyz" -msgstr "Kirghiz" - -msgid "Luxembourgish" -msgstr "Luxembourgeois" - -msgid "Lithuanian" -msgstr "Lituanien" - -msgid "Latvian" -msgstr "Letton" - -msgid "Macedonian" -msgstr "Macédonien" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongole" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malais" - -msgid "Burmese" -msgstr "Birman" - -msgid "Norwegian Bokmål" -msgstr "Norvégien bokmål" - -msgid "Nepali" -msgstr "Népalais" - -msgid "Dutch" -msgstr "Néerlandais" - -msgid "Norwegian Nynorsk" -msgstr "Norvégien nynorsk" - -msgid "Ossetic" -msgstr "Ossète" - -msgid "Punjabi" -msgstr "Penjabi" - -msgid "Polish" -msgstr "Polonais" - -msgid "Portuguese" -msgstr "Portugais" - -msgid "Brazilian Portuguese" -msgstr "Portugais brésilien" - -msgid "Romanian" -msgstr "Roumain" - -msgid "Russian" -msgstr "Russe" - -msgid "Slovak" -msgstr "Slovaque" - -msgid "Slovenian" -msgstr "Slovène" - -msgid "Albanian" -msgstr "Albanais" - -msgid "Serbian" -msgstr "Serbe" - -msgid "Serbian Latin" -msgstr "Serbe latin" - -msgid "Swedish" -msgstr "Suédois" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamoul" - -msgid "Telugu" -msgstr "Télougou" - -msgid "Tajik" -msgstr "Tadjik" - -msgid "Thai" -msgstr "Thaï" - -msgid "Turkmen" -msgstr "Turkmène" - -msgid "Turkish" -msgstr "Turc" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Oudmourte" - -msgid "Uyghur" -msgstr "Ouïghour" - -msgid "Ukrainian" -msgstr "Ukrainien" - -msgid "Urdu" -msgstr "Ourdou" - -msgid "Uzbek" -msgstr "Ouzbek" - -msgid "Vietnamese" -msgstr "Vietnamien" - -msgid "Simplified Chinese" -msgstr "Chinois simplifié" - -msgid "Traditional Chinese" -msgstr "Chinois traditionnel" - -msgid "Messages" -msgstr "Messages" - -msgid "Site Maps" -msgstr "Plans des sites" - -msgid "Static Files" -msgstr "Fichiers statiques" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Ce numéro de page n’est pas un nombre entier" - -msgid "That page number is less than 1" -msgstr "Ce numéro de page est plus petit que 1" - -msgid "That page contains no results" -msgstr "Cette page ne contient aucun résultat" - -msgid "Enter a valid value." -msgstr "Saisissez une valeur valide." - -msgid "Enter a valid domain name." -msgstr "Saisissez un nom de domaine valide." - -msgid "Enter a valid URL." -msgstr "Saisissez une URL valide." - -msgid "Enter a valid integer." -msgstr "Saisissez un nombre entier valide." - -msgid "Enter a valid email address." -msgstr "Saisissez une adresse de courriel valide." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas (_) " -"et des traits d’union." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Ce champ ne doit contenir que des caractères Unicode, des nombres, des " -"tirets bas (_) et des traits d’union." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Saisissez une adresse %(protocol)s valide." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ou IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Saisissez uniquement des chiffres séparés par des virgules." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Assurez-vous que cette valeur est %(limit_value)s (actuellement " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Assurez-vous que cette valeur est inférieure ou égale à %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Assurez-vous que cette valeur est supérieure ou égale à %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Assurez-vous que cette valeur est un multiple de la taille de pas " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Assurez-vous que cette valeur est un multiple de la taille de pas " -"%(limit_value)s, débutant à %(offset)s, par ex. %(offset)s, " -"%(valid_value1)s, %(valid_value2)s, etc." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assurez-vous que cette valeur comporte au moins %(limit_value)d caractère " -"(actuellement %(show_value)d)." -msgstr[1] "" -"Assurez-vous que cette valeur comporte au moins %(limit_value)d caractères " -"(actuellement %(show_value)d)." -msgstr[2] "" -"Assurez-vous que cette valeur comporte au moins %(limit_value)d caractères " -"(actuellement %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assurez-vous que cette valeur comporte au plus %(limit_value)d caractère " -"(actuellement %(show_value)d)." -msgstr[1] "" -"Assurez-vous que cette valeur comporte au plus %(limit_value)d caractères " -"(actuellement %(show_value)d)." -msgstr[2] "" -"Assurez-vous que cette valeur comporte au plus %(limit_value)d caractères " -"(actuellement %(show_value)d)." - -msgid "Enter a number." -msgstr "Saisissez un nombre." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Assurez-vous qu'il n'y a pas plus de %(max)s chiffre au total." -msgstr[1] "Assurez-vous qu’il n’y a pas plus de %(max)s chiffres au total." -msgstr[2] "Assurez-vous qu’il n’y a pas plus de %(max)s chiffres au total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Assurez-vous qu'il n'y a pas plus de %(max)s chiffre après la virgule." -msgstr[1] "" -"Assurez-vous qu’il n’y a pas plus de %(max)s chiffres après la virgule." -msgstr[2] "" -"Assurez-vous qu’il n’y a pas plus de %(max)s chiffres après la virgule." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Assurez-vous qu'il n'y a pas plus de %(max)s chiffre avant la virgule." -msgstr[1] "" -"Assurez-vous qu’il n’y a pas plus de %(max)s chiffres avant la virgule." -msgstr[2] "" -"Assurez-vous qu’il n’y a pas plus de %(max)s chiffres avant la virgule." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"L'extension de fichier « %(extension)s » n’est pas autorisée. Les extensions " -"autorisées sont : %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Le caractère nul n’est pas autorisé." - -msgid "and" -msgstr "et" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Un objet %(model_name)s avec ces champs %(field_labels)s existe déjà." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "La contrainte « %(name)s » n’est pas respectée." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "La valeur « %(value)r » n’est pas un choix valide." - -msgid "This field cannot be null." -msgstr "Ce champ ne peut pas contenir la valeur nulle." - -msgid "This field cannot be blank." -msgstr "Ce champ ne peut pas être vide." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Un objet %(model_name)s avec ce champ %(field_label)s existe déjà." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s doit être unique pour la partie %(lookup_type)s de " -"%(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Champ de type : %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "La valeur « %(value)s » doit être soit True (vrai), soit False (faux)." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" -"La valeur « %(value)s » doit être True (vrai), False (faux) ou None (vide)." - -msgid "Boolean (Either True or False)" -msgstr "Booléen (soit True (vrai) ou False (faux))" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Chaîne de caractères (jusqu'à %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Chaîne de caractères (illimitée)" - -msgid "Comma-separated integers" -msgstr "Des entiers séparés par une virgule" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Le format de date de la valeur « %(value)s » n’est pas valide. Le format " -"correct est AAAA-MM-JJ." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Le format de date de la valeur « %(value)s » est correct (AAAA-MM-JJ), mais " -"la date n’est pas valide." - -msgid "Date (without time)" -msgstr "Date (sans l’heure)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Le format de la valeur « %(value)s » n’est pas valide. Le format correct est " -"AAAA-MM-JJ HH:MM[:ss[.uuuuuu]][FH]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Le format de date de la valeur « %(value)s » est correct (AAAA-MM-JJ HH:MM[:" -"ss[.uuuuuu]][FH]), mais la date ou l’heure n’est pas valide." - -msgid "Date (with time)" -msgstr "Date (avec l’heure)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "La valeur « %(value)s » doit être un nombre décimal." - -msgid "Decimal number" -msgstr "Nombre décimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Le format de la valeur « %(value)s » n’est pas valide. Le format correct est " -"[JJ] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Durée" - -msgid "Email address" -msgstr "Adresse électronique" - -msgid "File path" -msgstr "Chemin vers le fichier" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "La valeur « %(value)s » doit être un nombre à virgule flottante." - -msgid "Floating point number" -msgstr "Nombre à virgule flottante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "La valeur « %(value)s » doit être un nombre entier." - -msgid "Integer" -msgstr "Entier" - -msgid "Big (8 byte) integer" -msgstr "Grand entier (8 octets)" - -msgid "Small integer" -msgstr "Petit nombre entier" - -msgid "IPv4 address" -msgstr "Adresse IPv4" - -msgid "IP address" -msgstr "Adresse IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" -"La valeur « %(value)s » doit être None (vide), True (vrai) ou False (faux)." - -msgid "Boolean (Either True, False or None)" -msgstr "Booléen (soit None (vide), True (vrai) ou False (faux))" - -msgid "Positive big integer" -msgstr "Grand nombre entier positif" - -msgid "Positive integer" -msgstr "Nombre entier positif" - -msgid "Positive small integer" -msgstr "Petit nombre entier positif" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (jusqu'à %(max_length)s car.)" - -msgid "Text" -msgstr "Texte" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Le format de la valeur « %(value)s » n’est pas valide. Le format correct est " -"HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Le format de la valeur « %(value)s » est correct (HH:MM[:ss[.uuuuuu]]), mais " -"l’heure n’est pas valide." - -msgid "Time" -msgstr "Heure" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Données binaires brutes" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "La valeur « %(value)s » n’est pas un UUID valide." - -msgid "Universally unique identifier" -msgstr "Identifiant unique universel" - -msgid "File" -msgstr "Fichier" - -msgid "Image" -msgstr "Image" - -msgid "A JSON object" -msgstr "Un objet JSON" - -msgid "Value must be valid JSON." -msgstr "La valeur doit respecter la syntaxe JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" -"L’instance %(model)s avec %(value)r dans %(field)s n'est pas un choix valide." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clé étrangère (type défini par le champ lié)" - -msgid "One-to-one relationship" -msgstr "Relation un à un" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relation %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relations %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relation plusieurs à plusieurs" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ce champ est obligatoire." - -msgid "Enter a whole number." -msgstr "Saisissez un nombre entier." - -msgid "Enter a valid date." -msgstr "Saisissez une date valide." - -msgid "Enter a valid time." -msgstr "Saisissez une heure valide." - -msgid "Enter a valid date/time." -msgstr "Saisissez une date et une heure valides." - -msgid "Enter a valid duration." -msgstr "Saisissez une durée valide." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Le nombre de jours doit être entre {min_days} et {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Aucun fichier n’a été soumis. Vérifiez le type d’encodage du formulaire." - -msgid "No file was submitted." -msgstr "Aucun fichier n’a été soumis." - -msgid "The submitted file is empty." -msgstr "Le fichier soumis est vide." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Assurez-vous que ce nom de fichier comporte au plus %(max)d caractère " -"(actuellement %(length)d)." -msgstr[1] "" -"Assurez-vous que ce nom de fichier comporte au plus %(max)d caractères " -"(actuellement %(length)d)." -msgstr[2] "" -"Assurez-vous que ce nom de fichier comporte au plus %(max)d caractères " -"(actuellement %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Envoyez un fichier ou cochez la case d’effacement, mais pas les deux." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Téléversez une image valide. Le fichier que vous avez transféré n’est pas " -"une image ou bien est corrompu." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Sélectionnez un choix valide. %(value)s n’en fait pas partie." - -msgid "Enter a list of values." -msgstr "Saisissez une liste de valeurs." - -msgid "Enter a complete value." -msgstr "Saisissez une valeur complète." - -msgid "Enter a valid UUID." -msgstr "Saisissez un UUID valide." - -msgid "Enter a valid JSON." -msgstr "Saisissez du contenu JSON valide." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr " :" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(champ masqué %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Des données du formulaire ManagementForm sont manquantes ou ont été " -"manipulées. Champs manquants : %(field_names)s. Vous pourriez créer un " -"rapport de bogue si le problème persiste." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Veuillez soumettre au plus %(num)d formulaire." -msgstr[1] "Veuillez soumettre au plus %(num)d formulaires." -msgstr[2] "Veuillez soumettre au plus %(num)d formulaires." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Veuillez soumettre au moins %(num)d formulaire." -msgstr[1] "Veuillez soumettre au moins %(num)d formulaires." -msgstr[2] "Veuillez soumettre au moins %(num)d formulaires." - -msgid "Order" -msgstr "Ordre" - -msgid "Delete" -msgstr "Supprimer" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Corrigez les données en double dans %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Corrigez les données en double dans %(field)s qui doit contenir des valeurs " -"uniques." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Corrigez les données en double dans %(field_name)s qui doit contenir des " -"valeurs uniques pour la partie %(lookup)s de %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Corrigez les valeurs en double ci-dessous." - -msgid "The inline value did not match the parent instance." -msgstr "La valeur en ligne ne correspond pas à l’instance parente." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Sélectionnez un choix valide. Ce choix ne fait pas partie de ceux " -"disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "« %(pk)s » n’est pas une valeur correcte." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"La valeur %(datetime)s n’a pas pu être interprétée dans le fuseau horaire " -"%(current_timezone)s ; elle est peut-être ambigüe ou elle n’existe pas." - -msgid "Clear" -msgstr "Effacer" - -msgid "Currently" -msgstr "Actuellement" - -msgid "Change" -msgstr "Modifier" - -msgid "Unknown" -msgstr "Inconnu" - -msgid "Yes" -msgstr "Oui" - -msgid "No" -msgstr "Non" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "oui,non,peut-être" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d octet" -msgstr[1] "%(size)d octets" -msgstr[2] "%(size)d octets" - -#, python-format -msgid "%s KB" -msgstr "%s Kio" - -#, python-format -msgid "%s MB" -msgstr "%s Mio" - -#, python-format -msgid "%s GB" -msgstr "%s Gio" - -#, python-format -msgid "%s TB" -msgstr "%s Tio" - -#, python-format -msgid "%s PB" -msgstr "%s Pio" - -msgid "p.m." -msgstr "après-midi" - -msgid "a.m." -msgstr "matin" - -msgid "PM" -msgstr "Après-midi" - -msgid "AM" -msgstr "Matin" - -msgid "midnight" -msgstr "minuit" - -msgid "noon" -msgstr "midi" - -msgid "Monday" -msgstr "lundi" - -msgid "Tuesday" -msgstr "mardi" - -msgid "Wednesday" -msgstr "mercredi" - -msgid "Thursday" -msgstr "jeudi" - -msgid "Friday" -msgstr "vendredi" - -msgid "Saturday" -msgstr "samedi" - -msgid "Sunday" -msgstr "dimanche" - -msgid "Mon" -msgstr "lun" - -msgid "Tue" -msgstr "mar" - -msgid "Wed" -msgstr "mer" - -msgid "Thu" -msgstr "jeu" - -msgid "Fri" -msgstr "ven" - -msgid "Sat" -msgstr "sam" - -msgid "Sun" -msgstr "dim" - -msgid "January" -msgstr "janvier" - -msgid "February" -msgstr "février" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "avril" - -msgid "May" -msgstr "mai" - -msgid "June" -msgstr "juin" - -msgid "July" -msgstr "juillet" - -msgid "August" -msgstr "août" - -msgid "September" -msgstr "septembre" - -msgid "October" -msgstr "octobre" - -msgid "November" -msgstr "novembre" - -msgid "December" -msgstr "décembre" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "fév" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "avr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jui" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aoû" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "déc" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "fév." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mars" - -msgctxt "abbrev. month" -msgid "April" -msgstr "avr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "juin" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juil." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "août" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "déc." - -msgctxt "alt. month" -msgid "January" -msgstr "Janvier" - -msgctxt "alt. month" -msgid "February" -msgstr "Février" - -msgctxt "alt. month" -msgid "March" -msgstr "Mars" - -msgctxt "alt. month" -msgid "April" -msgstr "Avril" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Juin" - -msgctxt "alt. month" -msgid "July" -msgstr "Juillet" - -msgctxt "alt. month" -msgid "August" -msgstr "Août" - -msgctxt "alt. month" -msgid "September" -msgstr "Septembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Octobre" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Décembre" - -msgid "This is not a valid IPv6 address." -msgstr "Ceci n’est pas une adresse IPv6 valide." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ou" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d année" -msgstr[1] "%(num)d ans" -msgstr[2] "%(num)d ans" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mois" -msgstr[1] "%(num)d mois" -msgstr[2] "%(num)d mois" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semaine" -msgstr[1] "%(num)d semaines" -msgstr[2] "%(num)d semaines" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d jour" -msgstr[1] "%(num)d jours" -msgstr[2] "%(num)d jours" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d heure" -msgstr[1] "%(num)d heures" -msgstr[2] "%(num)d heures" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minute" -msgstr[1] "%(num)d minutes" -msgstr[2] "%(num)d minutes" - -msgid "Forbidden" -msgstr "Interdit" - -msgid "CSRF verification failed. Request aborted." -msgstr "La vérification CSRF a échoué. La requête a été interrompue." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Vous voyez ce message parce que ce site HTTPS exige que le navigateur web " -"envoie un en-tête « Referer », ce qu’il n'a pas fait. Cet en-tête est exigé " -"pour des raisons de sécurité, afin de s’assurer que le navigateur n’ait pas " -"été piraté par un intervenant externe." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Si vous avez désactivé l’envoi des en-têtes « Referer » par votre " -"navigateur, veuillez les réactiver, au moins pour ce site ou pour les " -"connexions HTTPS, ou encore pour les requêtes de même origine (« same-" -"origin »)." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Si vous utilisez la balise " -"ou que vous incluez l’en-tête « Referrer-Policy: no-referrer », il est " -"préférable de les enlever. La protection CSRF exige que l’en-tête " -"``Referer`` effectue un contrôle de référant strict. Si vous vous souciez de " -"la confidentialité, utilisez des alternatives comme " -"pour les liens vers des sites tiers." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Vous voyez ce message parce que ce site exige la présence d’un cookie CSRF " -"lors de l’envoi de formulaires. Ce cookie est nécessaire pour des raisons de " -"sécurité, afin de s’assurer que le navigateur n’ait pas été piraté par un " -"intervenant externe." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Si vous avez désactivé l’envoi des cookies par votre navigateur, veuillez " -"les réactiver au moins pour ce site ou pour les requêtes de même origine (« " -"same-origin »)." - -msgid "More information is available with DEBUG=True." -msgstr "" -"Des informations plus détaillées sont affichées lorsque la variable DEBUG " -"vaut True." - -msgid "No year specified" -msgstr "Aucune année indiquée" - -msgid "Date out of range" -msgstr "Date hors limites" - -msgid "No month specified" -msgstr "Aucun mois indiqué" - -msgid "No day specified" -msgstr "Aucun jour indiqué" - -msgid "No week specified" -msgstr "Aucune semaine indiquée" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Pas de %(verbose_name_plural)s disponible" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Pas de %(verbose_name_plural)s disponible dans le futur car %(class_name)s." -"allow_future est faux (False)." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Le format « %(format)s » appliqué à la chaîne date « %(datestr)s » n’est pas " -"valide" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Aucun objet %(verbose_name)s trouvé en réponse à la requête" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"La page n’est pas la « dernière », elle ne peut pas non plus être convertie " -"en nombre entier." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Page non valide (%(page_number)s) : %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Liste vide et « %(class_name)s.allow_empty » est faux (False)." - -msgid "Directory indexes are not allowed here." -msgstr "Il n’est pas autorisé d’afficher le contenu de ce répertoire." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "« %(path)s » n’existe pas" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "L’installation s’est déroulée avec succès. Félicitations !" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Afficher les notes de publication de " -"Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Vous voyez cette page parce que votre fichier de réglages contient DEBUG=True et que vous n’avez pas " -"encore configuré d’URL." - -msgid "Django Documentation" -msgstr "Documentation de Django" - -msgid "Topics, references, & how-to’s" -msgstr "Thématiques, références et guides pratiques" - -msgid "Tutorial: A Polling App" -msgstr "Tutoriel : une application de sondage" - -msgid "Get started with Django" -msgstr "Premiers pas avec Django" - -msgid "Django Community" -msgstr "Communauté Django" - -msgid "Connect, get help, or contribute" -msgstr "Se connecter, obtenir de l’aide ou contribuer" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fr/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fr/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fr/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fr/formats.py deleted file mode 100644 index 338d8ad..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fr/formats.py +++ /dev/null @@ -1,27 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fr_BE/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fr_BE/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fr_BE/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fr_BE/formats.py deleted file mode 100644 index 84f0657..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fr_BE/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fr_CA/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fr_CA/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fr_CA/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fr_CA/formats.py deleted file mode 100644 index 4f1a017..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fr_CA/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" # 31 janvier 2024 -TIME_FORMAT = "H\xa0h\xa0i" # 13 h 40 -DATETIME_FORMAT = "j F Y, H\xa0h\xa0i" # 31 janvier 2024, 13 h 40 -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y-m-d" -SHORT_DATETIME_FORMAT = "Y-m-d H\xa0h\xa0i" -FIRST_DAY_OF_WEEK = 0 # Dimanche - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-05-15' - "%y-%m-%d", # '06-05-15' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-05-15 14:30:57' - "%y-%m-%d %H:%M:%S", # '06-05-15 14:30:57' - "%Y-%m-%d %H:%M:%S.%f", # '2006-05-15 14:30:57.000200' - "%y-%m-%d %H:%M:%S.%f", # '06-05-15 14:30:57.000200' - "%Y-%m-%d %H:%M", # '2006-05-15 14:30' - "%y-%m-%d %H:%M", # '06-05-15 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fr_CH/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fr_CH/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fr_CH/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fr_CH/formats.py deleted file mode 100644 index 84f0657..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fr_CH/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index 2eff5df..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index 172f283..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,1218 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Western Frisian (http://www.transifex.com/django/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "" - -msgid "Catalan" -msgstr "" - -msgid "Czech" -msgstr "" - -msgid "Welsh" -msgstr "" - -msgid "Danish" -msgstr "" - -msgid "German" -msgstr "" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "" - -msgid "English" -msgstr "" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "" - -msgid "Argentinian Spanish" -msgstr "" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "" - -msgid "Basque" -msgstr "" - -msgid "Persian" -msgstr "" - -msgid "Finnish" -msgstr "" - -msgid "French" -msgstr "" - -msgid "Frisian" -msgstr "" - -msgid "Irish" -msgstr "" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "" - -msgid "Hebrew" -msgstr "" - -msgid "Hindi" -msgstr "" - -msgid "Croatian" -msgstr "" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "" - -msgid "Italian" -msgstr "" - -msgid "Japanese" -msgstr "" - -msgid "Georgian" -msgstr "" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "" - -msgid "Korean" -msgstr "" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "" - -msgid "Latvian" -msgstr "" - -msgid "Macedonian" -msgstr "" - -msgid "Malayalam" -msgstr "" - -msgid "Mongolian" -msgstr "" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "" - -msgid "Norwegian Nynorsk" -msgstr "" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "" - -msgid "Polish" -msgstr "" - -msgid "Portuguese" -msgstr "" - -msgid "Brazilian Portuguese" -msgstr "" - -msgid "Romanian" -msgstr "" - -msgid "Russian" -msgstr "" - -msgid "Slovak" -msgstr "" - -msgid "Slovenian" -msgstr "" - -msgid "Albanian" -msgstr "" - -msgid "Serbian" -msgstr "" - -msgid "Serbian Latin" -msgstr "" - -msgid "Swedish" -msgstr "" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "" - -msgid "Telugu" -msgstr "" - -msgid "Thai" -msgstr "" - -msgid "Turkish" -msgstr "" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "" - -msgid "Simplified Chinese" -msgstr "" - -msgid "Traditional Chinese" -msgstr "" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Jou in falide wearde." - -msgid "Enter a valid URL." -msgstr "Jou in falide URL." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Jou in falide IPv4-adres." - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Jou allinnich sifers, skieden troch komma's." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Jou in nûmer." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Dit fjild kin net leech wêze." - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s mei dit %(field_label)s bestiet al." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "" - -msgid "File path" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "" - -msgid "URL" -msgstr "" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Dit fjild is fereaske." - -msgid "Enter a whole number." -msgstr "Jou in folslein nûmer." - -msgid "Enter a valid date." -msgstr "Jou in falide datum." - -msgid "Enter a valid time." -msgstr "Jou in falide tiid." - -msgid "Enter a valid date/time." -msgstr "Jou in falide datum.tiid." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Der is gjin bestân yntsjinne. Kontrolearje it kodearringstype op it " -"formulier." - -msgid "No file was submitted." -msgstr "Der is gjin bestân yntsjinne." - -msgid "The submitted file is empty." -msgstr "It yntsjinne bestân is leech." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Laad in falide ôfbylding op. It bestân dy't jo opladen hawwe wie net in " -"ôfbylding of in skansearre ôfbylding." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Selektearje in falide kar. %(value)s is net ien fan de beskikbere karren." - -msgid "Enter a list of values." -msgstr "Jou in list mei weardes." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Oarder" - -msgid "Delete" -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Selektearje in falide kar. Dizze kar is net ien fan de beskikbere karren." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Currently" -msgstr "" - -msgid "Change" -msgstr "" - -msgid "Unknown" -msgstr "" - -msgid "Yes" -msgstr "" - -msgid "No" -msgstr "" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "" - -#, python-format -msgid "%s MB" -msgstr "" - -#, python-format -msgid "%s GB" -msgstr "" - -#, python-format -msgid "%s TB" -msgstr "" - -#, python-format -msgid "%s PB" -msgstr "" - -msgid "p.m." -msgstr "" - -msgid "a.m." -msgstr "" - -msgid "PM" -msgstr "" - -msgid "AM" -msgstr "" - -msgid "midnight" -msgstr "" - -msgid "noon" -msgstr "" - -msgid "Monday" -msgstr "" - -msgid "Tuesday" -msgstr "" - -msgid "Wednesday" -msgstr "" - -msgid "Thursday" -msgstr "" - -msgid "Friday" -msgstr "" - -msgid "Saturday" -msgstr "" - -msgid "Sunday" -msgstr "" - -msgid "Mon" -msgstr "" - -msgid "Tue" -msgstr "" - -msgid "Wed" -msgstr "" - -msgid "Thu" -msgstr "" - -msgid "Fri" -msgstr "" - -msgid "Sat" -msgstr "" - -msgid "Sun" -msgstr "" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgid "jan" -msgstr "" - -msgid "feb" -msgstr "" - -msgid "mar" -msgstr "" - -msgid "apr" -msgstr "" - -msgid "may" -msgstr "" - -msgid "jun" -msgstr "" - -msgid "jul" -msgstr "" - -msgid "aug" -msgstr "" - -msgid "sep" -msgstr "" - -msgid "oct" -msgstr "" - -msgid "nov" -msgstr "" - -msgid "dec" -msgstr "" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -msgctxt "abbrev. month" -msgid "March" -msgstr "" - -msgctxt "abbrev. month" -msgid "April" -msgstr "" - -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -msgctxt "abbrev. month" -msgid "June" -msgstr "" - -msgctxt "abbrev. month" -msgid "July" -msgstr "" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -msgctxt "alt. month" -msgid "January" -msgstr "" - -msgctxt "alt. month" -msgid "February" -msgstr "" - -msgctxt "alt. month" -msgid "March" -msgstr "" - -msgctxt "alt. month" -msgid "April" -msgstr "" - -msgctxt "alt. month" -msgid "May" -msgstr "" - -msgctxt "alt. month" -msgid "June" -msgstr "" - -msgctxt "alt. month" -msgid "July" -msgstr "" - -msgctxt "alt. month" -msgid "August" -msgstr "" - -msgctxt "alt. month" -msgid "September" -msgstr "" - -msgctxt "alt. month" -msgid "October" -msgstr "" - -msgctxt "alt. month" -msgid "November" -msgstr "" - -msgctxt "alt. month" -msgid "December" -msgstr "" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "" - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fy/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fy/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/fy/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/fy/formats.py deleted file mode 100644 index 3825be4..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/fy/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -# DATE_FORMAT = -# TIME_FORMAT = -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -# MONTH_DAY_FORMAT = -# SHORT_DATE_FORMAT = -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -# DECIMAL_SEPARATOR = -# THOUSAND_SEPARATOR = -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index e55658a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index 21a1e19..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,1426 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# John Moylan , 2013 -# John Stafford , 2013 -# Seán de Búrca , 2011 -# Luke Blaney , 2019 -# Michael Thornhill , 2011-2012,2015 -# Séamus Ó Cúile , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 06:49+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -msgid "Afrikaans" -msgstr "Afracáinis" - -msgid "Arabic" -msgstr "Araibis" - -msgid "Algerian Arabic" -msgstr "Araibis na hAilgéire" - -msgid "Asturian" -msgstr "Astúiris" - -msgid "Azerbaijani" -msgstr "Asarbaiseáinis" - -msgid "Bulgarian" -msgstr "Bulgáiris" - -msgid "Belarusian" -msgstr "Bealarúisis" - -msgid "Bengali" -msgstr "Beangáilis" - -msgid "Breton" -msgstr "Briotánach" - -msgid "Bosnian" -msgstr "Boisnis" - -msgid "Catalan" -msgstr "Catalóinis" - -msgid "Central Kurdish (Sorani)" -msgstr "Coirdis Láir (Sorani)" - -msgid "Czech" -msgstr "Seicis" - -msgid "Welsh" -msgstr "Breatnais" - -msgid "Danish" -msgstr "Danmhairgis " - -msgid "German" -msgstr "Gearmáinis" - -msgid "Lower Sorbian" -msgstr "Sorbais Íochtarach" - -msgid "Greek" -msgstr "Gréigis" - -msgid "English" -msgstr "Béarla" - -msgid "Australian English" -msgstr "Béarla Astrálach" - -msgid "British English" -msgstr "Béarla na Breataine" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spáinnis" - -msgid "Argentinian Spanish" -msgstr "Spáinnis na hAirgintíne" - -msgid "Colombian Spanish" -msgstr "Spáinnis na Colóime" - -msgid "Mexican Spanish" -msgstr "Spáinnis Mheicsiceo " - -msgid "Nicaraguan Spanish" -msgstr "Spáinnis Nicearagua" - -msgid "Venezuelan Spanish" -msgstr "Spáinnis Veiniséalach" - -msgid "Estonian" -msgstr "Eastóinis" - -msgid "Basque" -msgstr "Bascais" - -msgid "Persian" -msgstr "Peirsis" - -msgid "Finnish" -msgstr "Fionlainnis" - -msgid "French" -msgstr "Fraincis" - -msgid "Frisian" -msgstr "Freaslainnis" - -msgid "Irish" -msgstr "Gaeilge" - -msgid "Scottish Gaelic" -msgstr "Gaeilge na hAlban" - -msgid "Galician" -msgstr "Gailísis" - -msgid "Hebrew" -msgstr "Eabhrais" - -msgid "Hindi" -msgstr "Hiondúis" - -msgid "Croatian" -msgstr "Cróitis" - -msgid "Upper Sorbian" -msgstr "Sorbian Uachtarach" - -msgid "Hungarian" -msgstr "Ungáiris" - -msgid "Armenian" -msgstr "Airméinis" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indinéisis" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Íoslainnis" - -msgid "Italian" -msgstr "Iodáilis" - -msgid "Japanese" -msgstr "Seapáinis" - -msgid "Georgian" -msgstr "Seoirsis" - -msgid "Kabyle" -msgstr "Cabaill" - -msgid "Kazakh" -msgstr "Casaicis" - -msgid "Khmer" -msgstr "Ciméiris" - -msgid "Kannada" -msgstr "Cannadais" - -msgid "Korean" -msgstr "Cóiréis" - -msgid "Kyrgyz" -msgstr "Chirgeastáin" - -msgid "Luxembourgish" -msgstr "Lucsamburgach" - -msgid "Lithuanian" -msgstr "Liotuáinis" - -msgid "Latvian" -msgstr "Laitvis" - -msgid "Macedonian" -msgstr "Macadóinis" - -msgid "Malayalam" -msgstr "Mailéalaimis" - -msgid "Mongolian" -msgstr "Mongóilis" - -msgid "Marathi" -msgstr "Maraitis" - -msgid "Malay" -msgstr "Malaeis" - -msgid "Burmese" -msgstr "Burmais" - -msgid "Norwegian Bokmål" -msgstr "Ioruais Bokmål" - -msgid "Nepali" -msgstr "Neipeailis" - -msgid "Dutch" -msgstr "Ollainnis" - -msgid "Norwegian Nynorsk" -msgstr "Ioruais Nynorsk" - -msgid "Ossetic" -msgstr "Oiséitis" - -msgid "Punjabi" -msgstr "Puinseáibis" - -msgid "Polish" -msgstr "Polainnis" - -msgid "Portuguese" -msgstr "Portaingéilis" - -msgid "Brazilian Portuguese" -msgstr "Portaingéilis na Brasaíle" - -msgid "Romanian" -msgstr "Rómáinis" - -msgid "Russian" -msgstr "Rúisis" - -msgid "Slovak" -msgstr "Slóvaicis" - -msgid "Slovenian" -msgstr "Slóivéinis" - -msgid "Albanian" -msgstr "Albáinis" - -msgid "Serbian" -msgstr "Seirbis" - -msgid "Serbian Latin" -msgstr "Seirbis (Laidineach)" - -msgid "Swedish" -msgstr "Sualainnis" - -msgid "Swahili" -msgstr "Svahaílis" - -msgid "Tamil" -msgstr "Tamailis" - -msgid "Telugu" -msgstr "Teileagúis" - -msgid "Tajik" -msgstr "Táidsíc" - -msgid "Thai" -msgstr "Téalainnis" - -msgid "Turkmen" -msgstr "Tuircméinis" - -msgid "Turkish" -msgstr "Tuircis" - -msgid "Tatar" -msgstr "Tatairis" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uighur" - -msgid "Ukrainian" -msgstr "Úcráinis" - -msgid "Urdu" -msgstr "Urdais" - -msgid "Uzbek" -msgstr "Úisbéicis" - -msgid "Vietnamese" -msgstr "Vítneamais" - -msgid "Simplified Chinese" -msgstr "Sínis Simplithe" - -msgid "Traditional Chinese" -msgstr "Sínis Traidisiúnta" - -msgid "Messages" -msgstr "Teachtaireachtaí" - -msgid "Site Maps" -msgstr "Léarscáileanna Suímh" - -msgid "Static Files" -msgstr "Comhaid Statach" - -msgid "Syndication" -msgstr "Sindeacáitiú" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Ní slánuimhir í an uimhir leathanaigh sin" - -msgid "That page number is less than 1" -msgstr "Tá uimhir an leathanaigh sin níos lú ná 1" - -msgid "That page contains no results" -msgstr "Níl aon torthaí ar an leathanach sin" - -msgid "Enter a valid value." -msgstr "Iontráil luach bailí" - -msgid "Enter a valid domain name." -msgstr "Cuir isteach ainm fearainn bailí." - -msgid "Enter a valid URL." -msgstr "Iontráil URL bailí." - -msgid "Enter a valid integer." -msgstr "Cuir isteach slánuimhir bhailí." - -msgid "Enter a valid email address." -msgstr "Cuir isteach seoladh ríomhphoist bailí." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Cuir isteach “sluga” bailí ar a bhfuil litreacha, uimhreacha, foscórthaí nó " -"fleiscíní." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Cuir isteach “sluga” bailí ar a bhfuil litreacha Unicode, uimhreacha, fo-" -"scóranna, nó fleiscíní." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Cuir isteach seoladh bailí %(protocol)s." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 nó IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Ná hiontráil ach digití atá deighilte le camóga." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Cinntigh go bhfuil an luach seo %(limit_value)s (tá sé %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Cinntigh go bhfuil an luach seo níos lú ná nó cothrom le %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Cinntigh go bhfuil an luach seo níos mó ná nó cothrom le %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Cinntigh gur iolraí de chéimmhéid %(limit_value)s an luach seo." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Cinntigh gur iolraí de chéimmhéid %(limit_value)s an luach seo, ag tosú ó " -"%(offset)s, m.sh. %(offset)s, %(valid_value1)s, %(valid_value2)s, agus mar " -"sin de." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[1] "" -"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[2] "" -"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[3] "" -"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[4] "" -"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " -"%(show_value)d aige)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[1] "" -"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[2] "" -"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[3] "" -"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[4] "" -"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " -"%(show_value)d aige)." - -msgid "Enter a number." -msgstr "Iontráil uimhir." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." -msgstr[1] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." -msgstr[2] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." -msgstr[3] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." -msgstr[4] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Cinntigh nach bhfuil níos mó ná %(max)s ionad deachúlach ann." -msgstr[1] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." -msgstr[2] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." -msgstr[3] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." -msgstr[4] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Cinntigh nach bhfuil níos mó ná %(max)s digit ann roimh an bpointe deachúil." -msgstr[1] "" -"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." -msgstr[2] "" -"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." -msgstr[3] "" -"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." -msgstr[4] "" -"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Ní cheadaítear iarmhír chomhaid “%(extension)s”. Is iad seo a leanas " -"eisínteachtaí ceadaithe: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Ní cheadaítear carachtair null." - -msgid "and" -msgstr "agus" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Tá %(model_name)s leis an %(field_labels)s seo ann cheana." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Tá srian “%(name)s” sáraithe." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Ní rogha bhailí é luach %(value)r." - -msgid "This field cannot be null." -msgstr "Ní cheadaítear luach nialasach sa réimse seo." - -msgid "This field cannot be blank." -msgstr "Ní cheadaítear luach nialasach sa réimse seo." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Tá %(model_name)s leis an %(field_label)s seo ann cheana." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Caithfidh %(field_label)s a bheith uathúil le haghaidh %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Réimse de Cineál: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Caithfidh luach “%(value)s” a bheith Fíor nó Bréagach." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Caithfidh luach “%(value)s” a bheith Fíor, Bréagach, nó Neamhní." - -msgid "Boolean (Either True or False)" -msgstr "Boole" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Teaghrán (suas go %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Teaghrán (gan teorainn)" - -msgid "Comma-separated integers" -msgstr "Slánuimhireacha camóg-scartha" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Tá formáid dáta neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith i " -"bhformáid BBBB-MM-LL." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Tá an fhormáid cheart ag luach “%(value)s” (BBBB-MM-DD) ach is dáta " -"neamhbhailí é." - -msgid "Date (without time)" -msgstr "Dáta (gan am)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Tá formáid neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith san " -"fhormáid BBBB-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Tá an fhormáid cheart ag luach “%(value)s” (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) ach is dáta/am neamhbhailí é." - -msgid "Date (with time)" -msgstr "Dáta (le am)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Caithfidh luach “%(value)s” a bheith ina uimhir dheachúil." - -msgid "Decimal number" -msgstr "Uimhir deachúlach" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Tá formáid neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith i " -"bhformáid [DD] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Fad" - -msgid "Email address" -msgstr "R-phost" - -msgid "File path" -msgstr "Conair comhaid" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Caithfidh luach “%(value)s” a bheith ina shnámhán." - -msgid "Floating point number" -msgstr "Snámhphointe" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Caithfidh luach “%(value)s” a bheith ina shlánuimhir." - -msgid "Integer" -msgstr "Slánuimhir" - -msgid "Big (8 byte) integer" -msgstr "Mór (8 byte) slánuimhi" - -msgid "Small integer" -msgstr "Slánuimhir beag" - -msgid "IPv4 address" -msgstr "Seoladh IPv4" - -msgid "IP address" -msgstr "Seoladh IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Ní mór luach “%(value)s” a bheith Easpa, Fíor nó Bréagach." - -msgid "Boolean (Either True, False or None)" -msgstr "Boole (Fíor, Bréagach nó Dada)" - -msgid "Positive big integer" -msgstr "Slánuimhir mhór dhearfach" - -msgid "Positive integer" -msgstr "Slánuimhir dearfach" - -msgid "Positive small integer" -msgstr "Slánuimhir beag dearfach" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (suas go %(max_length)s)" - -msgid "Text" -msgstr "Téacs" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Tá formáid neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith i " -"bhformáid HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Tá an fhormáid cheart ag luach “%(value)s” (HH:MM[:ss[.uuuuuu]]) ach is am " -"neamhbhailí é." - -msgid "Time" -msgstr "Am" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Sonraí dénártha amh" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Ní UUID bailí é “%(value)s”." - -msgid "Universally unique identifier" -msgstr "Aitheantóir uathúil uilíoch" - -msgid "File" -msgstr "Comhaid" - -msgid "Image" -msgstr "Íomhá" - -msgid "A JSON object" -msgstr "Réad JSON" - -msgid "Value must be valid JSON." -msgstr "Caithfidh an luach a bheith bailí JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Níl sampla %(model)s le %(field)s %(value)r ann." - -msgid "Foreign Key (type determined by related field)" -msgstr "Eochair Eachtracha (cineál a chinnfear de réir réimse a bhaineann)" - -msgid "One-to-one relationship" -msgstr "Duine-le-duine caidreamh" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s caidreamh" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s caidrimh" - -msgid "Many-to-many relationship" -msgstr "Go leor le go leor caidreamh" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Tá an réimse seo riachtanach." - -msgid "Enter a whole number." -msgstr "Iontráil slánuimhir." - -msgid "Enter a valid date." -msgstr "Iontráil dáta bailí." - -msgid "Enter a valid time." -msgstr "Iontráil am bailí." - -msgid "Enter a valid date/time." -msgstr "Iontráil dáta/am bailí." - -msgid "Enter a valid duration." -msgstr "Cuir isteach ré bailí." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Caithfidh líon na laethanta a bheith idir {min_days} agus {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Níor seoladh comhad. Deimhnigh cineál an ionchódaithe ar an bhfoirm." - -msgid "No file was submitted." -msgstr "Níor seoladh aon chomhad." - -msgid "The submitted file is empty." -msgstr "Tá an comhad a seoladh folamh." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " -"%(length)d aige)." -msgstr[1] "" -"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " -"%(length)d aige)." -msgstr[2] "" -"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " -"%(length)d aige)." -msgstr[3] "" -"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " -"%(length)d aige)." -msgstr[4] "" -"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " -"%(length)d aige)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Cuir ceachtar isteach comhad nó an ticbhosca soiléir, ní féidir an dá " -"sheiceáil." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Uasluchtaigh íomhá bhailí. Níorbh íomhá é an comhad a d'uasluchtaigh tú, nó " -"b'íomhá thruaillithe é." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Déan rogha bhailí. Ní ceann de na roghanna é %(value)s." - -msgid "Enter a list of values." -msgstr "Cuir liosta de luachanna isteach." - -msgid "Enter a complete value." -msgstr "Cuir isteach luach iomlán." - -msgid "Enter a valid UUID." -msgstr "Cuir isteach UUID bailí." - -msgid "Enter a valid JSON." -msgstr "Cuir isteach JSON bailí." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Réimse folaithe %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Tá sonraí ManagementForm in easnamh nó ar cuireadh isteach orthu. Réimsí ar " -"iarraidh: %(field_names)s. Seans go mbeidh ort tuairisc fhabht a chomhdú má " -"leanann an cheist." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Cuir isteach %(num)d foirm ar a mhéad." -msgstr[1] "Cuir isteach %(num)d foirm ar a mhéad." -msgstr[2] "Cuir isteach %(num)d foirm ar a mhéad." -msgstr[3] "Cuir isteach %(num)d foirm ar a mhéad." -msgstr[4] "Cuir isteach %(num)d foirm ar a mhéad." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Cuir isteach ar a laghad %(num)d foirm." -msgstr[1] "Cuir isteach %(num)d foirm ar a laghad." -msgstr[2] "Cuir isteach %(num)d foirm ar a laghad." -msgstr[3] "Cuir isteach %(num)d foirm ar a laghad." -msgstr[4] "Cuir isteach %(num)d foirm ar a laghad." - -msgid "Order" -msgstr "Ord" - -msgid "Delete" -msgstr "Scrios" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Le do thoil ceartaigh an sonra dúbail le %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ceart le do thoil na sonraí a dhúbailt le haghaidh %(field)s, chaithfidh a " -"bheith uathúil." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ceart le do thoil na sonraí a dhúbailt le haghaidh %(field_name)s ní mór a " -"bheith uaithúil le haghaidh an %(lookup)s i %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Le do thoil ceartaigh na luachanna dúbail thíos." - -msgid "The inline value did not match the parent instance." -msgstr "Níor mheaitseáil an luach inlíne leis an gcás tuismitheora." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Déan rogha bhailí. Ní ceann de na roghanna é do roghasa." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "Ní luach bailí é “%(pk)s”." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Níorbh fhéidir %(datetime)s a léirmhíniú i gcrios ama %(current_timezone)s; " -"d'fhéadfadh sé a bheith débhríoch nó b'fhéidir nach bhfuil sé ann." - -msgid "Clear" -msgstr "Glan" - -msgid "Currently" -msgstr "Faoi láthair" - -msgid "Change" -msgstr "Athraigh" - -msgid "Unknown" -msgstr "Anaithnid" - -msgid "Yes" -msgstr "Tá" - -msgid "No" -msgstr "Níl" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "tá,níl,b'fhéidir" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bheart" -msgstr[1] "%(size)d bheart" -msgstr[2] "%(size)d bheart" -msgstr[3] "%(size)d mbeart" -msgstr[4] "%(size)d beart" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "i.n." - -msgid "a.m." -msgstr "r.n." - -msgid "PM" -msgstr "IN" - -msgid "AM" -msgstr "RN" - -msgid "midnight" -msgstr "meán oíche" - -msgid "noon" -msgstr "nóin" - -msgid "Monday" -msgstr "Dé Luain" - -msgid "Tuesday" -msgstr "Dé Máirt" - -msgid "Wednesday" -msgstr "Dé Céadaoin" - -msgid "Thursday" -msgstr "Déardaoin" - -msgid "Friday" -msgstr "Dé hAoine" - -msgid "Saturday" -msgstr "Dé Sathairn" - -msgid "Sunday" -msgstr "Dé Domhnaigh" - -msgid "Mon" -msgstr "L" - -msgid "Tue" -msgstr "M" - -msgid "Wed" -msgstr "C" - -msgid "Thu" -msgstr "D" - -msgid "Fri" -msgstr "A" - -msgid "Sat" -msgstr "S" - -msgid "Sun" -msgstr "D" - -msgid "January" -msgstr "Eanáir" - -msgid "February" -msgstr "Feabhra" - -msgid "March" -msgstr "Márta" - -msgid "April" -msgstr "Aibreán" - -msgid "May" -msgstr "Bealtaine" - -msgid "June" -msgstr "Meitheamh" - -msgid "July" -msgstr "Iúil" - -msgid "August" -msgstr "Lúnasa" - -msgid "September" -msgstr "Meán Fómhair" - -msgid "October" -msgstr "Deireadh Fómhair" - -msgid "November" -msgstr "Samhain" - -msgid "December" -msgstr "Nollaig" - -msgid "jan" -msgstr "ean" - -msgid "feb" -msgstr "feabh" - -msgid "mar" -msgstr "márta" - -msgid "apr" -msgstr "aib" - -msgid "may" -msgstr "beal" - -msgid "jun" -msgstr "meith" - -msgid "jul" -msgstr "iúil" - -msgid "aug" -msgstr "lún" - -msgid "sep" -msgstr "mfómh" - -msgid "oct" -msgstr "dfómh" - -msgid "nov" -msgstr "samh" - -msgid "dec" -msgstr "noll" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ean." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feabh." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Márta" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aib." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Beal." - -msgctxt "abbrev. month" -msgid "June" -msgstr "Meith." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Iúil" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Lún." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "MFómh." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "DFómh." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Samh." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Noll." - -msgctxt "alt. month" -msgid "January" -msgstr "Mí Eanáir" - -msgctxt "alt. month" -msgid "February" -msgstr "Mí Feabhra" - -msgctxt "alt. month" -msgid "March" -msgstr "Mí na Márta" - -msgctxt "alt. month" -msgid "April" -msgstr "Mí Aibreáin" - -msgctxt "alt. month" -msgid "May" -msgstr "Mí na Bealtaine" - -msgctxt "alt. month" -msgid "June" -msgstr "Mí an Mheithimh" - -msgctxt "alt. month" -msgid "July" -msgstr "Mí Iúil" - -msgctxt "alt. month" -msgid "August" -msgstr "Mí Lúnasa" - -msgctxt "alt. month" -msgid "September" -msgstr "Mí Mheán Fómhair" - -msgctxt "alt. month" -msgid "October" -msgstr "Mí Dheireadh Fómhair" - -msgctxt "alt. month" -msgid "November" -msgstr "Mí na Samhna" - -msgctxt "alt. month" -msgid "December" -msgstr "Mí na Nollag" - -msgid "This is not a valid IPv6 address." -msgstr "Ní seoladh IPv6 bailí é seo." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "nó" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d bhliain" -msgstr[1] "%(num)d bliain" -msgstr[2] "%(num)d bliain" -msgstr[3] "%(num)d bliain" -msgstr[4] "%(num)d bliain" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mí" -msgstr[1] "%(num)d míonna" -msgstr[2] "%(num)d míonna" -msgstr[3] "%(num)d míonna" -msgstr[4] "%(num)d míonna" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d seachtain" -msgstr[1] "%(num)d seachtainí" -msgstr[2] "%(num)d seachtainí" -msgstr[3] "%(num)d seachtainí" -msgstr[4] "%(num)d seachtainí" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d lá" -msgstr[1] "%(num)d laethanta" -msgstr[2] "%(num)d laethanta" -msgstr[3] "%(num)d laethanta" -msgstr[4] "%(num)d laethanta" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uair" -msgstr[1] "%(num)d huaireanta" -msgstr[2] "%(num)d huaireanta" -msgstr[3] "%(num)d huaireanta" -msgstr[4] "%(num)d huaireanta" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d nóiméad" -msgstr[1] "%(num)d nóiméad" -msgstr[2] "%(num)d nóiméad" -msgstr[3] "%(num)d nóiméad" -msgstr[4] "%(num)d nóiméad" - -msgid "Forbidden" -msgstr "Toirmiscthe" - -msgid "CSRF verification failed. Request aborted." -msgstr "Theip ar fhíorú CSRF. Cuireadh deireadh leis an iarratas." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Tá an teachtaireacht seo á fheiceáil agat toisc go bhfuil “ceanntásc " -"tarchuir” ag teastáil ón suíomh HTTPS seo le bheith seolta ag do bhrabhsálaí " -"gréasáin, ach níor seoladh aon cheann. Tá an ceanntásc seo ag teastáil ar " -"chúiseanna slándála, lena chinntiú nach bhfuil do bhrabhsálaí á fuadach ag " -"tríú páirtithe." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Má tá do bhrabhsálaí cumraithe agat chun ceanntásca “Tagairtí” a dhíchumasú, " -"le do thoil déan iad a athchumasú, le do thoil don suíomh seo, nó do naisc " -"HTTPS, nó d’iarratais “ar an mbunús céanna”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Má tá an chlib 1 á úsáid agat nó má tá an ceanntásc “Polasaí Atreoraithe: " -"gan atreorú” san áireamh, bain amach iad le do thoil. Éilíonn an chosaint " -"CSRF go bhfuil an ceanntásc “Tagairtí” chun seiceáil docht atreoraithe a " -"dhéanamh. Má tá imní ort faoi phríobháideachas, bain úsáid as roghanna eile " -"amhail le haghaidh naisc chuig láithreáin tríú " -"páirtí." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Tá an teachtaireacht seo á fheiceáil agat toisc go bhfuil fianán CSRF ag " -"teastáil ón suíomh seo agus foirmeacha á gcur isteach agat. Tá an fianán seo " -"ag teastáil ar chúiseanna slándála, lena chinntiú nach bhfuil do bhrabhsálaí " -"á fuadach ag tríú páirtithe." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Má tá do bhrabhsálaí cumraithe agat chun fianáin a dhíchumasú, le do thoil " -"athchumasaigh iad, le do thoil, le haghaidh an tsuímh seo ar a laghad, nó le " -"haghaidh iarratais “ar an mbunús céanna”." - -msgid "More information is available with DEBUG=True." -msgstr "Tá tuilleadh eolais ar fáil le DEBUG=True." - -msgid "No year specified" -msgstr "Bliain gan sonrú" - -msgid "Date out of range" -msgstr "Dáta as raon" - -msgid "No month specified" -msgstr "Mí gan sonrú" - -msgid "No day specified" -msgstr "Lá gan sonrú" - -msgid "No week specified" -msgstr "Seachtain gan sonrú" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Gan %(verbose_name_plural)s ar fáil" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Níl %(verbose_name_plural)s sa todhchaí ar fáil mar tá %(class_name)s." -"allow_future Bréagach." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Teaghrán dáta neamhbhailí “%(datestr)s” tugtha formáid “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Níl bhfuarthas %(verbose_name)s le hadhaigh an iarratas" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Níl an leathanach “deireadh”, agus ní féidir é a thiontú go slánuimhir." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Leathanach neamhbhailí (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tá liosta folamh agus “%(class_name)s.allow_empty” bréagach." - -msgid "Directory indexes are not allowed here." -msgstr "Níl innéacsanna chomhadlann cheadaítear anseo." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "Níl “%(path)s” ann" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Innéacs de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "D'éirigh leis an suiteáil! Comhghairdeachas!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Féach ar nótaí scaoilte le haghaidh Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Tá an leathanach seo á fheiceáil agat toisc go bhfuil DEBUG=True i do chomhad socruithe agus nach bhfuil aon " -"URL cumraithe agat." - -msgid "Django Documentation" -msgstr "Doiciméadú Django" - -msgid "Topics, references, & how-to’s" -msgstr "Ábhair, tagairtí, & conas atá" - -msgid "Tutorial: A Polling App" -msgstr "Teagaisc: A Vótaíocht Aip" - -msgid "Get started with Django" -msgstr "Tosaigh le Django" - -msgid "Django Community" -msgstr "Pobal Django" - -msgid "Connect, get help, or contribute" -msgstr "Ceangail, faigh cúnamh, nó ranníoc" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ga/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ga/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ga/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ga/formats.py deleted file mode 100644 index 7cde1a5..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ga/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index f177bbd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index ba28564..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,1386 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Bauer, 2014 -# GunChleoc, 2015-2017,2021 -# GunChleoc, 2015 -# GunChleoc, 2014-2015 -# Michael Bauer, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-20 14:00+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -msgid "Afrikaans" -msgstr "Afraganais" - -msgid "Arabic" -msgstr "Arabais" - -msgid "Algerian Arabic" -msgstr "Arabais Aildireach" - -msgid "Asturian" -msgstr "Astùrais" - -msgid "Azerbaijani" -msgstr "Asarbaideànais" - -msgid "Bulgarian" -msgstr "Bulgarais" - -msgid "Belarusian" -msgstr "Bealaruisis" - -msgid "Bengali" -msgstr "Beangailis" - -msgid "Breton" -msgstr "Breatnais" - -msgid "Bosnian" -msgstr "Bosnais" - -msgid "Catalan" -msgstr "Catalanais" - -msgid "Czech" -msgstr "Seacais" - -msgid "Welsh" -msgstr "Cuimris" - -msgid "Danish" -msgstr "Danmhairgis" - -msgid "German" -msgstr "Gearmailtis" - -msgid "Lower Sorbian" -msgstr "Sòrbais Ìochdarach" - -msgid "Greek" -msgstr "Greugais" - -msgid "English" -msgstr "Beurla" - -msgid "Australian English" -msgstr "Beurla Astràilia" - -msgid "British English" -msgstr "Beurla Bhreatainn" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spàinntis" - -msgid "Argentinian Spanish" -msgstr "Spàinntis na h-Argantaine" - -msgid "Colombian Spanish" -msgstr "Spàinntis Choloimbia" - -msgid "Mexican Spanish" -msgstr "Spàinntis Mheagsagach" - -msgid "Nicaraguan Spanish" -msgstr "Spàinntis Niocaragua" - -msgid "Venezuelan Spanish" -msgstr "Spàinntis na Bheiniseala" - -msgid "Estonian" -msgstr "Eastoinis" - -msgid "Basque" -msgstr "Basgais" - -msgid "Persian" -msgstr "Farsaidh" - -msgid "Finnish" -msgstr "Fionnlannais" - -msgid "French" -msgstr "Fraingis" - -msgid "Frisian" -msgstr "Frìsis" - -msgid "Irish" -msgstr "Gaeilge" - -msgid "Scottish Gaelic" -msgstr "Gàidhlig" - -msgid "Galician" -msgstr "Gailìsis" - -msgid "Hebrew" -msgstr "Eabhra" - -msgid "Hindi" -msgstr "Hindis" - -msgid "Croatian" -msgstr "Cròthaisis" - -msgid "Upper Sorbian" -msgstr "Sòrbais Uachdarach" - -msgid "Hungarian" -msgstr "Ungairis" - -msgid "Armenian" -msgstr "Airmeinis" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Innd-Innsis" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Innis Tìlis" - -msgid "Italian" -msgstr "Eadailtis" - -msgid "Japanese" -msgstr "Seapanais" - -msgid "Georgian" -msgstr "Cairtbheilis" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Casachais" - -msgid "Khmer" -msgstr "Cmèar" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Coirèanais" - -msgid "Kyrgyz" -msgstr "Cìorgasais" - -msgid "Luxembourgish" -msgstr "Lugsamburgais" - -msgid "Lithuanian" -msgstr "Liotuainis" - -msgid "Latvian" -msgstr "Laitbheis" - -msgid "Macedonian" -msgstr "Masadonais" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolais" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malaidhis" - -msgid "Burmese" -msgstr "Burmais" - -msgid "Norwegian Bokmål" -msgstr "Nirribhis (Bokmål)" - -msgid "Nepali" -msgstr "Neapàlais" - -msgid "Dutch" -msgstr "Duitsis" - -msgid "Norwegian Nynorsk" -msgstr "Nirribhis (Nynorsk)" - -msgid "Ossetic" -msgstr "Ossetic" - -msgid "Punjabi" -msgstr "Panjabi" - -msgid "Polish" -msgstr "Pòlainnis" - -msgid "Portuguese" -msgstr "Portagailis" - -msgid "Brazilian Portuguese" -msgstr "Portagailis Bhraisileach" - -msgid "Romanian" -msgstr "Romàinis" - -msgid "Russian" -msgstr "Ruisis" - -msgid "Slovak" -msgstr "Slòbhacais" - -msgid "Slovenian" -msgstr "Slòbhainis" - -msgid "Albanian" -msgstr "Albàinis" - -msgid "Serbian" -msgstr "Sèirbis" - -msgid "Serbian Latin" -msgstr "Sèirbis (Laideann)" - -msgid "Swedish" -msgstr "Suainis" - -msgid "Swahili" -msgstr "Kiswahili" - -msgid "Tamil" -msgstr "Taimilis" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Taidigis" - -msgid "Thai" -msgstr "Tàidh" - -msgid "Turkmen" -msgstr "Turcmanais" - -msgid "Turkish" -msgstr "Turcais" - -msgid "Tatar" -msgstr "Tatarais" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Ucràinis" - -msgid "Urdu" -msgstr "Ùrdu" - -msgid "Uzbek" -msgstr "Usbagais" - -msgid "Vietnamese" -msgstr "Bhiet-Namais" - -msgid "Simplified Chinese" -msgstr "Sìnis Shimplichte" - -msgid "Traditional Chinese" -msgstr "Sìnis Thradaiseanta" - -msgid "Messages" -msgstr "Teachdaireachdan" - -msgid "Site Maps" -msgstr "Mapaichean-làraich" - -msgid "Static Files" -msgstr "Faidhlichean stadastaireachd" - -msgid "Syndication" -msgstr "Siondacaideadh" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Chan eil àireamh na duilleige seo 'na àireamh slàn" - -msgid "That page number is less than 1" -msgstr "Tha àireamh na duilleige seo nas lugha na 1" - -msgid "That page contains no results" -msgstr "Chan eil toradh aig an duilleag seo" - -msgid "Enter a valid value." -msgstr "Cuir a-steach luach dligheach." - -msgid "Enter a valid URL." -msgstr "Cuir a-steach URL dligheach." - -msgid "Enter a valid integer." -msgstr "Cuir a-steach àireamh slàin dhligheach." - -msgid "Enter a valid email address." -msgstr "Cuir a-steach seòladh puist-d dligheach." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Cuir a-steach “sluga” dligheach anns nach eil ach litrichean, àireamhan, fo-" -"loidhnichean is tàthanan." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Cuir a-steach “sluga” dligheach anns nach eil ach litrichean Unicode, " -"àireamhan, fo-loidhnichean is tàthanan." - -msgid "Enter a valid IPv4 address." -msgstr "Cuir a-steach seòladh IPv4 dligheach." - -msgid "Enter a valid IPv6 address." -msgstr "Cuir a-steach seòladh IPv6 dligheach." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Cuir a-steach seòladh IPv4 no IPv6 dligheach." - -msgid "Enter only digits separated by commas." -msgstr "Na cuir a-steach ach àireamhan ’gan sgaradh le cromagan." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Dèan cinnteach gu bheil an luach seo %(limit_value)s (’s e %(show_value)s a " -"th’ ann)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Dèan cinnteach gu bheil an luach seo nas lugha na no co-ionnan ri " -"%(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Dèan cinnteach gu bheil an luach seo nas motha na no co-ionnan ri " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ " -"char as lugha (tha %(show_value)d aige an-dràsta)." -msgstr[1] "" -"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ " -"char as lugha (tha %(show_value)d aige an-dràsta)." -msgstr[2] "" -"Dèan cinnteach gu bheil %(limit_value)d caractaran aig an luach seo air a’ " -"char as lugha (tha %(show_value)d aige an-dràsta)." -msgstr[3] "" -"Dèan cinnteach gu bheil %(limit_value)d caractar aig an luach seo air a’ " -"char as lugha (tha %(show_value)d aige an-dràsta)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ " -"char as motha (tha %(show_value)d aige an-dràsta)." -msgstr[1] "" -"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ " -"char as motha (tha %(show_value)d aige an-dràsta)." -msgstr[2] "" -"Dèan cinnteach gu bheil %(limit_value)d caractaran aig an luach seo air a’ " -"char as motha (tha %(show_value)d aige an-dràsta)." -msgstr[3] "" -"Dèan cinnteach gu bheil %(limit_value)d caractar aig an luach seo air a’ " -"char as motha (tha %(show_value)d aige an-dràsta)." - -msgid "Enter a number." -msgstr "Cuir a-steach àireamh." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann gu h-iomlan." -msgstr[1] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann gu h-iomlan." -msgstr[2] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamhan ann gu h-iomlan." -msgstr[3] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann gu h-iomlan." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Dèan cinnteach nach eil barrachd air %(max)s ionad deicheach ann." -msgstr[1] "Dèan cinnteach nach eil barrachd air %(max)s ionad deicheach ann." -msgstr[2] "Dèan cinnteach nach eil barrachd air %(max)s ionadan deicheach ann." -msgstr[3] "Dèan cinnteach nach eil barrachd air %(max)s ionad deicheach ann." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann ron phuing " -"dheicheach." -msgstr[1] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann ron phuing " -"dheicheach." -msgstr[2] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamhan ann ron phuing " -"dheicheach." -msgstr[3] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann ron phuing " -"dheicheach." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Chan eil an leudachan faidhle “%(extension)s” ceadaichte. Seo na leudachain " -"a tha ceadaichte: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Chan eil caractaran null ceadaichte." - -msgid "and" -msgstr "agus" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Tha %(model_name)s lis a’ %(field_labels)s seo ann mar-thà." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Chan eil an luach %(value)r ’na roghainn dhligheach." - -msgid "This field cannot be null." -msgstr "Chan fhaod an raon seo a bhith ’na neoni." - -msgid "This field cannot be blank." -msgstr "Chan fhaod an raon seo a bhith bàn." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Tha %(model_name)s leis a’ %(field_label)s seo ann mar-thà." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Chan fhaod %(field_label)s a bhith ann ach aon turas airson " -"%(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Raon dhen t-seòrsa: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Feumaidh “%(value)s” a bhith True no False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Feumaidh “%(value)s” a bhith True, False no None." - -msgid "Boolean (Either True or False)" -msgstr "Booleach (True no False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Sreang (suas ri %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Àireamhan slàna sgaraichte le cromagan" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Tha fòrmat cinn-là mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith " -"san fhòrmat BBBB-MM-LL." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Tha fòrmat mar bu chòir (BBBB-MM-LL) aig an luach “%(value)s” ach tha an " -"ceann-là mì-dligheach." - -msgid "Date (without time)" -msgstr "Ceann-là (gun àm)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Tha fòrmat mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith san " -"fhòrmat BBBB-MM-LL HH:MM[:dd[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Tha fòrmat mar bu chòir (BBBB-MM-LL HH:MM[:dd[.uuuuuu]][TZ]) aig an luach " -"“%(value)s” ach tha an ceann-là/an t-àm mì-dligheach." - -msgid "Date (with time)" -msgstr "Ceann-là (le àm)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Feumaidh “%(value)s” a bhith ’na àireamh dheicheach." - -msgid "Decimal number" -msgstr "Àireamh dheicheach" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Tha fòrmat mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith san " -"fhòrmat [DD] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Faid" - -msgid "Email address" -msgstr "Seòladh puist-d" - -msgid "File path" -msgstr "Slighe an fhaidhle" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Feumaidh “%(value)s” a bhith ’na àireamh floda." - -msgid "Floating point number" -msgstr "Àireamh le puing floda" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Feumaidh “%(value)s” a bhith ’na àireamh shlàn." - -msgid "Integer" -msgstr "Àireamh shlàn" - -msgid "Big (8 byte) integer" -msgstr "Mòr-àireamh shlàn (8 baidht)" - -msgid "Small integer" -msgstr "Beag-àireamh slàn" - -msgid "IPv4 address" -msgstr "Seòladh IPv4" - -msgid "IP address" -msgstr "Seòladh IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Feumaidh “%(value)s” a bhith None, True no False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleach (True, False no None)" - -msgid "Positive big integer" -msgstr "Àireamh shlàn dhearbh" - -msgid "Positive integer" -msgstr "Àireamh shlàn dhearbh" - -msgid "Positive small integer" -msgstr "Beag-àireamh shlàn dhearbh" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Sluga (suas ri %(max_length)s)" - -msgid "Text" -msgstr "Teacsa" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Tha fòrmat mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith san " -"fhòrmat HH:MM[:dd[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Tha fòrmat mar bu chòir (HH:MM[:dd[.uuuuuu]]) aig an luach “%(value)s” ach " -"tha an t-àm mì-dligheach." - -msgid "Time" -msgstr "Àm" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dàta bìnearaidh amh" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Chan eil “%(value)s” ’na UUID dligheach." - -msgid "Universally unique identifier" -msgstr "Aithnichear àraidh gu h-uile-choitcheann" - -msgid "File" -msgstr "Faidhle" - -msgid "Image" -msgstr "Dealbh" - -msgid "A JSON object" -msgstr "Oibseact JSON" - -msgid "Value must be valid JSON." -msgstr "Feumaidh an luach a bhith ’na JSON dligheach." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Chan eil ionstans dhe %(model)s le %(field)s %(value)r ann." - -msgid "Foreign Key (type determined by related field)" -msgstr "Iuchair chèin (thèid a sheòrsa a mhìneachadh leis an raon dàimheach)" - -msgid "One-to-one relationship" -msgstr "Dàimh aonan gu aonan" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Dàimh %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Dàimhean %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Dàimh iomadh rud gu iomadh rud" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Tha an raon seo riatanach." - -msgid "Enter a whole number." -msgstr "Cuir a-steach àireamh shlàn." - -msgid "Enter a valid date." -msgstr "Cuir a-steach ceann-là dligheach." - -msgid "Enter a valid time." -msgstr "Cuir a-steach àm dligheach." - -msgid "Enter a valid date/time." -msgstr "Cuir a-steach ceann-là ’s àm dligheach." - -msgid "Enter a valid duration." -msgstr "Cuir a-steach faid dhligheach." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" -"Feumaidh an àireamh de làithean a bhith eadar {min_days} is {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Cha deach faidhle a chur a-null. Dearbhaich seòrsa a’ chòdachaidh air an " -"fhoirm." - -msgid "No file was submitted." -msgstr "Cha deach faidhle a chur a-null." - -msgid "The submitted file is empty." -msgstr "Tha am faidhle a chaidh a chur a-null falamh." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Dèan cinnteach nach eil barrachd air %(max)d charactar ann an ainm an " -"fhaidhle (tha %(length)d aige)." -msgstr[1] "" -"Dèan cinnteach nach eil barrachd air %(max)d charactar ann an ainm an " -"fhaidhle (tha %(length)d aige)." -msgstr[2] "" -"Dèan cinnteach nach eil barrachd air %(max)d caractaran ann an ainm an " -"fhaidhle (tha %(length)d aige)." -msgstr[3] "" -"Dèan cinnteach nach eil barrachd air %(max)d caractar ann an ainm an " -"fhaidhle (tha %(length)d aige)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Cuir a-null faidhle no cuir cromag sa bhogsa fhalamh, na dèan an dà chuidh " -"dhiubh." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Luchdaich suas dealbh dligheach. Cha robh am faidhle a luchdaich thu suas " -"’na dhealbh no bha an dealbh coirbte." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Tagh rud dligheach. Chan eil %(value)s ’na roghainn dhut." - -msgid "Enter a list of values." -msgstr "Cuir a-steach liosta de luachan." - -msgid "Enter a complete value." -msgstr "Cuir a-steach luach slàn." - -msgid "Enter a valid UUID." -msgstr "Cuir a-steach UUID dligheach." - -msgid "Enter a valid JSON." -msgstr "Cuir a-steach JSON dligheach." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Raon falaichte %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Tha dàta an fhoirm stiùiridh a dhìth no chaidh beantainn ris. Seo na " -"raointean a tha a dhìth: %(field_names)s. Ma mhaireas an duilgheadas, saoil " -"an cuir thu aithris air buga thugainn?" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Na cuir a-null barrachd air %d fhoirm." -msgstr[1] "Na cuir a-null barrachd air %d fhoirm." -msgstr[2] "Na cuir a-null barrachd air %d foirmean." -msgstr[3] "Na cuir a-null barrachd air %d foirm." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Cuir a-null %d fhoirm air a char as lugha." -msgstr[1] "Cuir a-null %d fhoirm air a char as lugha." -msgstr[2] "Cuir a-null %d foirmichean air a char as lugha." -msgstr[3] "Cuir a-null %d foirm air a char as lugha." - -msgid "Order" -msgstr "Òrdugh" - -msgid "Delete" -msgstr "Sguab às" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ceartaich an dàta dùblaichte airson %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ceartaich an dàta dùblaichte airson %(field)s, chan fhaod gach nì a bhith " -"ann ach aon turas." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ceartaich an dàta dùblaichte airson %(field_name)s nach fhaod a bhith ann " -"ach aon turas airson %(lookup)s ann an %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Ceartaich na luachan dùblaichte gu h-ìosal." - -msgid "The inline value did not match the parent instance." -msgstr "" -"Chan eil an luach am broinn na loidhne a’ freagairt ris an ionstans-pàraint." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Tagh rud dligheach. Chan eil an rud seo ’na roghainn dhut." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "Chan e luach dligheach a tha ann an “%(pk)s”." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Cha chiall dha %(datetime)s san roinn-tìde %(current_timezone)s; dh’fhaoidte " -"gu bheil e dà-sheaghach no nach eil e ann." - -msgid "Clear" -msgstr "Falamhaich" - -msgid "Currently" -msgstr "An-dràsta" - -msgid "Change" -msgstr "Atharraich" - -msgid "Unknown" -msgstr "Chan eil fhios" - -msgid "Yes" -msgstr "Tha" - -msgid "No" -msgstr "Chan eil" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "yes,no,maybe" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d baidht" -msgstr[1] "%(size)d baidht" -msgstr[2] "%(size)d baidht" -msgstr[3] "%(size)d baidht" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "f" - -msgid "a.m." -msgstr "m" - -msgid "PM" -msgstr "f" - -msgid "AM" -msgstr "m" - -msgid "midnight" -msgstr "meadhan-oidhche" - -msgid "noon" -msgstr "meadhan-latha" - -msgid "Monday" -msgstr "DiLuain" - -msgid "Tuesday" -msgstr "DiMàirt" - -msgid "Wednesday" -msgstr "DiCiadain" - -msgid "Thursday" -msgstr "DiarDaoin" - -msgid "Friday" -msgstr "DihAoine" - -msgid "Saturday" -msgstr "DiSathairne" - -msgid "Sunday" -msgstr "DiDòmhnaich" - -msgid "Mon" -msgstr "DiL" - -msgid "Tue" -msgstr "DiM" - -msgid "Wed" -msgstr "DiC" - -msgid "Thu" -msgstr "Dia" - -msgid "Fri" -msgstr "Dih" - -msgid "Sat" -msgstr "DiS" - -msgid "Sun" -msgstr "DiD" - -msgid "January" -msgstr "Am Faoilleach" - -msgid "February" -msgstr "An Gearran" - -msgid "March" -msgstr "Am Màrt" - -msgid "April" -msgstr "An Giblean" - -msgid "May" -msgstr "An Cèitean" - -msgid "June" -msgstr "An t-Ògmhios" - -msgid "July" -msgstr "An t-Iuchar" - -msgid "August" -msgstr "An Lùnastal" - -msgid "September" -msgstr "An t-Sultain" - -msgid "October" -msgstr "An Dàmhair" - -msgid "November" -msgstr "An t-Samhain" - -msgid "December" -msgstr "An Dùbhlachd" - -msgid "jan" -msgstr "faoi" - -msgid "feb" -msgstr "gearr" - -msgid "mar" -msgstr "màrt" - -msgid "apr" -msgstr "gibl" - -msgid "may" -msgstr "cèit" - -msgid "jun" -msgstr "ògmh" - -msgid "jul" -msgstr "iuch" - -msgid "aug" -msgstr "lùna" - -msgid "sep" -msgstr "sult" - -msgid "oct" -msgstr "dàmh" - -msgid "nov" -msgstr "samh" - -msgid "dec" -msgstr "dùbh" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Faoi" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Gearr" - -msgctxt "abbrev. month" -msgid "March" -msgstr "Màrt" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Gibl" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Cèit" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Ògmh" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Iuch" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Lùna" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sult" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Dàmh" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Samh" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dùbh" - -msgctxt "alt. month" -msgid "January" -msgstr "Am Faoilleach" - -msgctxt "alt. month" -msgid "February" -msgstr "An Gearran" - -msgctxt "alt. month" -msgid "March" -msgstr "Am Màrt" - -msgctxt "alt. month" -msgid "April" -msgstr "An Giblean" - -msgctxt "alt. month" -msgid "May" -msgstr "An Cèitean" - -msgctxt "alt. month" -msgid "June" -msgstr "An t-Ògmhios" - -msgctxt "alt. month" -msgid "July" -msgstr "An t-Iuchar" - -msgctxt "alt. month" -msgid "August" -msgstr "An Lùnastal" - -msgctxt "alt. month" -msgid "September" -msgstr "An t-Sultain" - -msgctxt "alt. month" -msgid "October" -msgstr "An Dàmhair" - -msgctxt "alt. month" -msgid "November" -msgstr "An t-Samhain" - -msgctxt "alt. month" -msgid "December" -msgstr "An Dùbhlachd" - -msgid "This is not a valid IPv6 address." -msgstr "Chan eil seo ’na sheòladh IPv6 dligheach." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "no" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d bliadhna" -msgstr[1] "%(num)d bhliadhna" -msgstr[2] "%(num)d bliadhnaichean" -msgstr[3] "%(num)d bliadhna" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mhìos" -msgstr[1] "%(num)d mhìos" -msgstr[2] "%(num)d mìosan" -msgstr[3] "%(num)d mìos" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d seachdain" -msgstr[1] "%(num)d sheachdain" -msgstr[2] "%(num)d seachdainean" -msgstr[3] "%(num)d seachdain" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d latha" -msgstr[1] "%(num)d latha" -msgstr[2] "%(num)d làithean" -msgstr[3] "%(num)d latha" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uair a thìde" -msgstr[1] "%(num)d uair a thìde" -msgstr[2] "%(num)d uairean a thìde" -msgstr[3] "%(num)d uair a thìde" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d mhionaid" -msgstr[1] "%(num)d mhionaid" -msgstr[2] "%(num)d mionaidean" -msgstr[3] "%(num)d mionaid" - -msgid "Forbidden" -msgstr "Toirmisgte" - -msgid "CSRF verification failed. Request aborted." -msgstr "Dh’fhàillig le dearbhadh CSRF. chaidh sgur dhen iarrtas." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Chì thu an teachdaireachd seo air sgàth ’s gu bheil an làrach-lìn HTTPS seo " -"ag iarraidh air a’ bhrabhsair-lìn agad gun cuir e bann-cinn “Referer” thuice " -"ach cha deach gin a chur a-null. Tha feum air a’ bhann-chinn seo a chum " -"tèarainteachd ach nach cleachd treas-phàrtaidh am brabhsair agad gu droch-" -"rùnach." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ma rèitich thu am brabhsair agad ach an cuir e bannan-cinn “Referer” à " -"comas, cuir an comas iad a-rithist, co-dhiù airson na làraich seo no airson " -"ceanglaichean HTTPS no airson iarrtasan “same-origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ma tha thu a’ cleachdadh taga no a’ gabhail a-staigh bann-cinn “'Referrer-Policy: no-referrer” feuch " -"an doir thu air falbh iad. Iarraidh an dìon CSRF bann-cinn “Referer” gus na " -"referers a dhearbhadh gu teann. Ma tha thu iomagaineach a thaobh do " -"prìobhaideachd, cleachd roghainnean eile mar airson " -"ceangal gu làraichean-lìn threas-phàrtaidhean." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Chì thu an teachdaireachd seo air sgàth ’s gu bheil an làrach-lìn seo ag " -"iarraidh briosgaid CSRF nuair a chuireas tu foirm a-null. Tha feum air a’ " -"bhriosgaid seo a chum tèarainteachd ach nach cleachd treas-phàrtaidh am " -"brabhsair agad gu droch-rùnach." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ma rèitich thu am brabhsair agad ach an cuir e briosgaidean à comas, cuir an " -"comas iad a-rithist, co-dhiù airson na làraich seo no airson iarrtasan “same-" -"origin”." - -msgid "More information is available with DEBUG=True." -msgstr "Gheibh thu barrachd fiosrachaidh le DEBUG=True." - -msgid "No year specified" -msgstr "Cha deach bliadhna a shònrachadh" - -msgid "Date out of range" -msgstr "Tha ceann-là taobh thar na rainse" - -msgid "No month specified" -msgstr "Cha deach mìos a shònrachadh" - -msgid "No day specified" -msgstr "Cha deach latha a shònrachadh" - -msgid "No week specified" -msgstr "Cha deach seachdain a shònrachadh" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Chan eil %(verbose_name_plural)s ri fhaighinn" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Chan eil %(verbose_name_plural)s san àm ri teachd ri fhaighinn air sgàth ’s " -"gun deach %(class_name)s.allow_future a shuidheachadh air False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Sreang cinn-là “%(datestr)s” mì-dhligheach airson an fhòrmait “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Cha deach %(verbose_name)s a lorg a fhreagras dhan cheist" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Chan eil an duilleag ’na “last” is cha ghabh a h-iompachadh gu àireamh shlàn." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Duilleag mhì-dhligheach (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"Tha liosta fhalamh ann agus chaidh “%(class_name)s.allow_empty” a " -"shuidheachadh air False." - -msgid "Directory indexes are not allowed here." -msgstr "Chan eil clàran-amais pasgain falamh ceadaichte an-seo." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "Chan eil “%(path)s” ann" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Clàr-amais dhe %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Chaidh a stàladh! Meal do naidheachd!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Seall na nòtaichean sgaoilidh airson Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Chì thu an duilleag seo on a tha DEBUG=True ann am faidhle nan roghainnean agad agus cha do rèitich " -"thu URL sam bith fhathast." - -msgid "Django Documentation" -msgstr "Docamaideadh Django" - -msgid "Topics, references, & how-to’s" -msgstr "Cuspairean, iomraidhean ⁊ treòraichean" - -msgid "Tutorial: A Polling App" -msgstr "Oideachadh: Aplacaid cunntais-bheachd" - -msgid "Get started with Django" -msgstr "Dèan toiseach-tòiseachaidh le Django" - -msgid "Django Community" -msgstr "Coimhearsnachd Django" - -msgid "Connect, get help, or contribute" -msgstr "Dèan ceangal, faigh taic no cuidich" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/gd/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/gd/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/gd/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/gd/formats.py deleted file mode 100644 index 5ef6774..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/gd/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "h:ia" -DATETIME_FORMAT = "j F Y h:ia" -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -SHORT_DATETIME_FORMAT = "j M Y h:ia" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index 4a9d164..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index 7ebeab2..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,1356 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# fasouto , 2011-2012 -# fonso , 2011,2013 -# fonso , 2013 -# fasouto , 2017 -# Jannis Leidel , 2011 -# Leandro Regueiro , 2013 -# 948a55bc37dd6d642f1875bb84258fff_07a28cc , 2012 -# X Bello , 2023-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: X Bello , 2023-2024\n" -"Language-Team: Galician (http://app.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Africáner" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "Árabe Arxelino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerí" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorruso" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "Bretón" - -msgid "Bosnian" -msgstr "Bosníaco" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdo Central (Sorani)" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Dinamarqués" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "Baixo Sorabo" - -msgid "Greek" -msgstr "Grego" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "Inglés australiano" - -msgid "British English" -msgstr "inglés británico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español da Arxentina" - -msgid "Colombian Spanish" -msgstr "Español de Colombia" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Español de Venezuela" - -msgid "Estonian" -msgstr "Estoniano" - -msgid "Basque" -msgstr "Vasco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisón" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "Gaélico Escocés" - -msgid "Galician" -msgstr "Galego" - -msgid "Hebrew" -msgstr "Hebreo" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Alto Sorabo" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "Armenio" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesio" - -msgid "Igbo" -msgstr "Ibo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Xaponés" - -msgid "Georgian" -msgstr "Xeorxiano" - -msgid "Kabyle" -msgstr "Cabilio" - -msgid "Kazakh" -msgstr "Casaco" - -msgid "Khmer" -msgstr "Camboxano" - -msgid "Kannada" -msgstr "Canará" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "Kirguiz" - -msgid "Luxembourgish" -msgstr "Luxemburgués" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letón" - -msgid "Macedonian" -msgstr "Macedonio" - -msgid "Malayalam" -msgstr "Mala" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malaio" - -msgid "Burmese" -msgstr "Birmano" - -msgid "Norwegian Bokmål" -msgstr "Bokmål Noruegués" - -msgid "Nepali" -msgstr "Nepalés" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Noruegués (nynorsk)" - -msgid "Ossetic" -msgstr "Osetio" - -msgid "Punjabi" -msgstr "Panxabiano" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués do Brasil" - -msgid "Romanian" -msgstr "Romanés" - -msgid "Russian" -msgstr "Ruso" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanés" - -msgid "Serbian" -msgstr "Serbio" - -msgid "Serbian Latin" -msgstr "Serbio (alfabeto latino)" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suahili" - -msgid "Tamil" -msgstr "Támil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Taxico" - -msgid "Thai" -msgstr "Tai" - -msgid "Turkmen" -msgstr "Turcomá" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tártaro" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uigur" - -msgid "Ukrainian" -msgstr "Ucraíno" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeco" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chinés simplificado" - -msgid "Traditional Chinese" -msgstr "Chinés tradicional" - -msgid "Messages" -msgstr "Mensaxes" - -msgid "Site Maps" -msgstr "Mapas do sitio" - -msgid "Static Files" -msgstr "Arquivos Estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Ese número de páxina non é un enteiro" - -msgid "That page number is less than 1" -msgstr "Ese número de páxina é menor que 1" - -msgid "That page contains no results" -msgstr "Esa páxina non contén resultados" - -msgid "Enter a valid value." -msgstr "Insira un valor válido." - -msgid "Enter a valid domain name." -msgstr "Introduza un nome de dominio válido." - -msgid "Enter a valid URL." -msgstr "Insira un URL válido." - -msgid "Enter a valid integer." -msgstr "Introduza un enteiro válido." - -msgid "Enter a valid email address." -msgstr "Insira un enderezo de correo electrónico válido." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Insira un “slug” valido composto por letras, números, guións baixos ou " -"medios." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Insira un “slug” valido composto por letras Unicode, números, guións baixos " -"ou medios." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Introduza unha dirección %(protocol)s válida." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ou IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Insira só díxitos separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Asegúrese de que este valor é %(limit_value)s (agora é %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegure que este valor é menor ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegure que este valor é maior ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Asegúrese de que este valor é un múltiplo do tamaño do paso %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Asegúrese de que este valor é un múltiplo do tamaño do paso %(limit_value)s, " -"comezando por %(offset)s, p. ex. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, e sucesivos." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor ten polo menos %(limit_value)d caracter (agora " -"ten %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor ten polo menos %(limit_value)d caracteres (agora " -"ten %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor ten como moito %(limit_value)d caracter (agora " -"ten %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor ten como moito %(limit_value)d caracteres (agora " -"ten %(show_value)d)." - -msgid "Enter a number." -msgstr "Insira un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegure que non hai mais de %(max)s díxito en total." -msgstr[1] "Asegure que non hai mais de %(max)s díxitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrese de que non hai máis de %(max)s lugar decimal." -msgstr[1] "Asegúrese de que non hai máis de %(max)s lugares decimais." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrese de que no hai máis de %(max)s díxito antes do punto decimal." -msgstr[1] "" -"Asegúrese de que non hai máis de %(max)s díxitos antes do punto decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Non se permite a extensión “%(extension)s”. As extensións permitidas son: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Non se permiten caracteres nulos." - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Xa existe un %(model_name)s con este %(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Viólase a restricción “%(name)s”." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "O valor %(value)r non é unha opción válida." - -msgid "This field cannot be null." -msgstr "Este campo non pode ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo non pode estar baleiro." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" -"Xa existe un modelo %(model_name)s coa etiqueta de campo %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s ten que ser único para %(lookup_type)s en " -"%(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo de tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "O valor “%(value)s” ten que ser ou True ou False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "O valor “%(value)s” ten que ser True, False ou None." - -msgid "Boolean (Either True or False)" -msgstr "Valor booleano (verdadeiro ou falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadea (máximo %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Texto (sin límite)" - -msgid "Comma-separated integers" -msgstr "Números enteiros separados por comas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"O valor “%(value)s” ten un formato inválido de data. Debe estar no formato " -"AAAA-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"O valor “%(value)s” ten o formato correcto (AAAA-MM-DD) pero non é unha data " -"válida." - -msgid "Date (without time)" -msgstr "Data (sen a hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"O valor “%(value)s” ten un formato non válido. Debe de ter o formato AAAA-MM-" -"DD HH:MM[:ss[.uuuuuu]][TZ]. " - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"O valor “%(value)s” ten o formato correcto (AAAA-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) pero non é unha data/hora válida." - -msgid "Date (with time)" -msgstr "Data (coa hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” ten que ser un número en formato decimal." - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"O valor “%(value)s” ten un formato non válido. Debe de ter o formato [DD] " -"[[HH:]MM:]ss[.uuuuuu]. " - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Enderezo electrónico" - -msgid "File path" -msgstr "Ruta de ficheiro" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "O valor “%(value)s” ten que ser un número en coma flotante." - -msgid "Floating point number" -msgstr "Número en coma flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "O valor “%(value)s” ten que ser un número enteiro." - -msgid "Integer" -msgstr "Número enteiro" - -msgid "Big (8 byte) integer" -msgstr "Enteiro grande (8 bytes)" - -msgid "Small integer" -msgstr "Enteiro pequeno" - -msgid "IPv4 address" -msgstr "Enderezo IPv4" - -msgid "IP address" -msgstr "Enderezo IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "O valor “%(value)s” ten que ser None, True ou False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (verdadeiro, falso ou ningún)" - -msgid "Positive big integer" -msgstr "Número enteiro positivo grande" - -msgid "Positive integer" -msgstr "Numero enteiro positivo" - -msgid "Positive small integer" -msgstr "Enteiro pequeno positivo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (ata %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"O valor “%(value)s” ten un formato non válido. Ten que ter o formato HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"O valor “%(value)s” ten o formato correcto (HH:MM[:ss[.uuuuuu]]) pero non é " -"unha hora válida." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos binarios en crú" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” non é un UUID válido." - -msgid "Universally unique identifier" -msgstr "Identificador único universal" - -msgid "File" -msgstr "Ficheiro" - -msgid "Image" -msgstr "Imaxe" - -msgid "A JSON object" -msgstr "Un obxeto JSON" - -msgid "Value must be valid JSON." -msgstr "O valor ten que ser JSON válido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "A instancia de %(model)s co %(field)s %(value)r non existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave Foránea (tipo determinado por un campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación un a un" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relación %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relacións %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relación moitos a moitos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Requírese este campo." - -msgid "Enter a whole number." -msgstr "Insira un número enteiro." - -msgid "Enter a valid date." -msgstr "Insira unha data válida." - -msgid "Enter a valid time." -msgstr "Insira unha hora válida." - -msgid "Enter a valid date/time." -msgstr "Insira unha data/hora válida." - -msgid "Enter a valid duration." -msgstr "Introduza unha duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "O número de días ten que estar entre {min_days} e {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Non se enviou ficheiro ningún. Comprobe o tipo de codificación do formulario." - -msgid "No file was submitted." -msgstr "Non se enviou ficheiro ningún." - -msgid "The submitted file is empty." -msgstr "O ficheiro enviado está baleiro." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrese de que este nome de arquivo ten como moito %(max)d caracter (agora " -"ten %(length)d)." -msgstr[1] "" -"Asegúrese de que este nome de arquivo ten como moito %(max)d caracteres " -"(agora ten %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Ou ben envíe un ficheiro, ou ben marque a casilla de eliminar, pero non " -"ambas as dúas cousas." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Suba unha imaxe válida. O ficheiro subido non era unha imaxe ou esta estaba " -"corrupta." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Escolla unha opción válida. %(value)s non se atopa entre as opcións " -"dispoñibles." - -msgid "Enter a list of values." -msgstr "Insira unha lista de valores." - -msgid "Enter a complete value." -msgstr "Introduza un valor completo." - -msgid "Enter a valid UUID." -msgstr "Insira un UUID válido." - -msgid "Enter a valid JSON." -msgstr "Introduza un JSON válido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s." - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Faltan datos ou foron manipulados de ManagementForm. Campos afectados: " -"%(field_names)s. Debería abrir un informe de bug si o problema é persistente." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Por favor envíe como moito %(num)d formulario." -msgstr[1] "Por favor envíe como moito %(num)d formularios." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Por favor envíe polo menos %(num)d formulario." -msgstr[1] "Pro favor envíe polo menos %(num)d formularios." - -msgid "Order" -msgstr "Orde" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Corrixa os datos duplicados no campo %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Corrixa os datos duplicados no campo %(field)s, que debe ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Corrixa os datos duplicados no campo %(field_name)s, que debe ser único para " -"a busca %(lookup)s no campo %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Corrixa os valores duplicados de abaixo." - -msgid "The inline value did not match the parent instance." -msgstr "O valor na liña non coincide ca instancia nai." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Escolla unha opción válida. Esta opción non se atopa entre as opcións " -"dispoñíbeis" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” non é un valor válido." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s non se puido interpretar na zona hora horaria " -"%(current_timezone)s; pode ser ambiguo ou non existir." - -msgid "Clear" -msgstr "Limpar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Descoñecido" - -msgid "Yes" -msgstr "Si" - -msgid "No" -msgstr "Non" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "si,non,quizais" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoite" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "Luns" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Mércores" - -msgid "Thursday" -msgstr "Xoves" - -msgid "Friday" -msgstr "Venres" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "lun" - -msgid "Tue" -msgstr "mar" - -msgid "Wed" -msgstr "mér" - -msgid "Thu" -msgstr "xov" - -msgid "Fri" -msgstr "ven" - -msgid "Sat" -msgstr "sáb" - -msgid "Sun" -msgstr "dom" - -msgid "January" -msgstr "Xaneiro" - -msgid "February" -msgstr "Febreiro" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Xuño" - -msgid "July" -msgstr "Xullo" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Decembro" - -msgid "jan" -msgstr "xan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "xuñ" - -msgid "jul" -msgstr "xul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "out" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Xan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maio" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Xuño" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Xullo" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Out." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Xaneiro" - -msgctxt "alt. month" -msgid "February" -msgstr "Febreiro" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Maio" - -msgctxt "alt. month" -msgid "June" -msgstr "Xuño" - -msgctxt "alt. month" -msgid "July" -msgstr "Xullo" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Setembro" - -msgctxt "alt. month" -msgid "October" -msgstr "Outubro" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembro" - -msgctxt "alt. month" -msgid "December" -msgstr "Decembro" - -msgid "This is not a valid IPv6 address." -msgstr "Isto non é un enderezo IPv6 válido." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ou" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" - -msgid "Forbidden" -msgstr "Denegado" - -msgid "CSRF verification failed. Request aborted." -msgstr "Fallóu a verificación CSRF. Abortouse a petición." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Está vendo esta mensaxe porque este sitio HTTPS require que o navegador " -"envíe un \"Referer header\", pero non envióu ningún. Este encabezamento é " -"necesario por razóns de seguridade, para asegurar que o navegador non está " -"sendo suplantado por terceiros." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Se ten o navegador configurado para deshabilitar os encabezamentos " -"\"Referer\", por favor habilíteos polo menos para este sitio, ou para " -"conexións HTTPS, ou para peticións de \"mesmo-orixe\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Si está usando a etiqueta " -"ou incluíndo o encabezado “Referrer-Policy: no-referrer”, por favor quíteos. " -"A protección CSRF require o encabezado “Referer” para facer a comprobación " -"estricta de referer. Si lle preocupa a privacidade, use alternativas como para enlazar con sitios de terceiros." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Está vendo esta mensaxe porque este sitio HTTPS require unha cookie CSRF ó " -"enviar formularios. Esta cookie é necesaria por razóns de seguridade, para " -"asegurar que o navegador non está sendo suplantado por terceiros." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Se ten o navegador configurado para deshabilitar as cookies, por favor " -"habilíteas, polo menos para este sitio, ou para peticións de “same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "Pode ver máis información se establece DEBUG=True." - -msgid "No year specified" -msgstr "Non se especificou ningún ano" - -msgid "Date out of range" -msgstr "Data fora de rango" - -msgid "No month specified" -msgstr "Non se especificou ningún mes" - -msgid "No day specified" -msgstr "Non se especificou ningún día" - -msgid "No week specified" -msgstr "Non se especificou ningunha semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Non hai %(verbose_name_plural)s dispoñibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Non hai dispoñibles %(verbose_name_plural)s futuros/as porque %(class_name)s." -"allow_futuro é False" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "A data “%(datestr)s” non é válida para o formato “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Non se atopou ningún/ha %(verbose_name)s que coincidise coa consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "A páxina non é “last” nin se pode converter a int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Páxina non válida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "A lista está baleira pero “%(class_name)s.allow_empty” é False." - -msgid "Directory indexes are not allowed here." -msgstr "Os índices de directorio non están permitidos aquí." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” non existe" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "A instalación foi un éxito! Noraboa!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Ver as notas de publicación para Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Está vendo esta páxina porque no arquivo de axustes ten DEBUG=True e non hai ningunha URL " -"configurada." - -msgid "Django Documentation" -msgstr "Documentación de Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temas, referencias, & guías de uso" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: aplicación de enquisas" - -msgid "Get started with Django" -msgstr "Comenzar con Django" - -msgid "Django Community" -msgstr "Comunidade de Django" - -msgid "Connect, get help, or contribute" -msgstr "Conectar, conseguir axuda, ou contribuir" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/gl/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/gl/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/gl/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/gl/formats.py deleted file mode 100644 index 7372935..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/gl/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \á\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d-m-Y" -SHORT_DATETIME_FORMAT = "d-m-Y, H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index 4d73921..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/he/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index 330c513..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,1340 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 534b44a19bf18d20b71ecc4eb77c572f_db336e9 , 2011-2012 -# Jannis Leidel , 2011 -# Meir Kriheli , 2011-2015,2017,2019-2020,2023,2025 -# Menachem G., 2021 -# Menachem G., 2021 -# אורי רודברג , 2021 -# Yaron Shahrabani , 2021 -# אורי רודברג , 2020,2022-2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Meir Kriheli , " -"2011-2015,2017,2019-2020,2023,2025\n" -"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -msgid "Afrikaans" -msgstr "אפריקאנס" - -msgid "Arabic" -msgstr "ערבית" - -msgid "Algerian Arabic" -msgstr "ערבית אלג'ירית" - -msgid "Asturian" -msgstr "אסטורית" - -msgid "Azerbaijani" -msgstr "אזרית" - -msgid "Bulgarian" -msgstr "בולגרית" - -msgid "Belarusian" -msgstr "בֶּלָרוּסִית" - -msgid "Bengali" -msgstr "בנגאלית" - -msgid "Breton" -msgstr "בְּרֶטוֹנִית" - -msgid "Bosnian" -msgstr "בוסנית" - -msgid "Catalan" -msgstr "קאטלונית" - -msgid "Central Kurdish (Sorani)" -msgstr "כורדית מרכזית (סוראני)" - -msgid "Czech" -msgstr "צ'כית" - -msgid "Welsh" -msgstr "וולשית" - -msgid "Danish" -msgstr "דנית" - -msgid "German" -msgstr "גרמנית" - -msgid "Lower Sorbian" -msgstr "סורבית תחתונה" - -msgid "Greek" -msgstr "יוונית" - -msgid "English" -msgstr "אנגלית" - -msgid "Australian English" -msgstr "אנגלית אוסטרלית" - -msgid "British English" -msgstr "אנגלית בריטית" - -msgid "Esperanto" -msgstr "אספרנטו" - -msgid "Spanish" -msgstr "ספרדית" - -msgid "Argentinian Spanish" -msgstr "ספרדית ארגנטינית" - -msgid "Colombian Spanish" -msgstr "ספרדית קולומביאנית" - -msgid "Mexican Spanish" -msgstr "ספרדית מקסיקנית" - -msgid "Nicaraguan Spanish" -msgstr "ספרדית ניקרגואה" - -msgid "Venezuelan Spanish" -msgstr "ספרדית ונצואלית" - -msgid "Estonian" -msgstr "אסטונית" - -msgid "Basque" -msgstr "בסקית" - -msgid "Persian" -msgstr "פרסית" - -msgid "Finnish" -msgstr "פינית" - -msgid "French" -msgstr "צרפתית" - -msgid "Frisian" -msgstr "פריזית" - -msgid "Irish" -msgstr "אירית" - -msgid "Scottish Gaelic" -msgstr "גאלית סקוטית" - -msgid "Galician" -msgstr "גאליציאנית" - -msgid "Hebrew" -msgstr "עברית" - -msgid "Hindi" -msgstr "הינדי" - -msgid "Croatian" -msgstr "קרואטית" - -msgid "Upper Sorbian" -msgstr "סורבית עילית" - -msgid "Hungarian" -msgstr "הונגרית" - -msgid "Armenian" -msgstr "ארמנית" - -msgid "Interlingua" -msgstr "אינטרלינגואה" - -msgid "Indonesian" -msgstr "אינדונזית" - -msgid "Igbo" -msgstr "איגבו" - -msgid "Ido" -msgstr "אידו" - -msgid "Icelandic" -msgstr "איסלנדית" - -msgid "Italian" -msgstr "איטלקית" - -msgid "Japanese" -msgstr "יפנית" - -msgid "Georgian" -msgstr "גיאורגית" - -msgid "Kabyle" -msgstr "קבילה" - -msgid "Kazakh" -msgstr "קזחית" - -msgid "Khmer" -msgstr "חמר" - -msgid "Kannada" -msgstr "קאנאדה" - -msgid "Korean" -msgstr "קוריאנית" - -msgid "Kyrgyz" -msgstr "קירגיזית" - -msgid "Luxembourgish" -msgstr "לוקסמבורגית" - -msgid "Lithuanian" -msgstr "ליטאית" - -msgid "Latvian" -msgstr "לטבית" - -msgid "Macedonian" -msgstr "מקדונית" - -msgid "Malayalam" -msgstr "מלאיאלאם" - -msgid "Mongolian" -msgstr "מונגולי" - -msgid "Marathi" -msgstr "מראטהי" - -msgid "Malay" -msgstr "מלאית" - -msgid "Burmese" -msgstr "בּוּרְמֶזִית" - -msgid "Norwegian Bokmål" -msgstr "נורבגית ספרותית" - -msgid "Nepali" -msgstr "נפאלית" - -msgid "Dutch" -msgstr "הולנדית" - -msgid "Norwegian Nynorsk" -msgstr "נורבגית חדשה" - -msgid "Ossetic" -msgstr "אוסטית" - -msgid "Punjabi" -msgstr "פנג'אבי" - -msgid "Polish" -msgstr "פולנית" - -msgid "Portuguese" -msgstr "פורטוגזית" - -msgid "Brazilian Portuguese" -msgstr "פורטוגזית ברזילאית" - -msgid "Romanian" -msgstr "רומנית" - -msgid "Russian" -msgstr "רוסית" - -msgid "Slovak" -msgstr "סלובקית" - -msgid "Slovenian" -msgstr "סלובנית" - -msgid "Albanian" -msgstr "אלבנית" - -msgid "Serbian" -msgstr "סרבית" - -msgid "Serbian Latin" -msgstr "סרבית לטינית" - -msgid "Swedish" -msgstr "שוודית" - -msgid "Swahili" -msgstr "סווהילי" - -msgid "Tamil" -msgstr "טמילית" - -msgid "Telugu" -msgstr "טלגו" - -msgid "Tajik" -msgstr "טג'יקית" - -msgid "Thai" -msgstr "תאילנדית" - -msgid "Turkmen" -msgstr "טורקמנית" - -msgid "Turkish" -msgstr "טורקית" - -msgid "Tatar" -msgstr "טטרית" - -msgid "Udmurt" -msgstr "אודמורטית" - -msgid "Uyghur" -msgstr "אויגורית" - -msgid "Ukrainian" -msgstr "אוקראינית" - -msgid "Urdu" -msgstr "אורדו" - -msgid "Uzbek" -msgstr "אוזבקית" - -msgid "Vietnamese" -msgstr "וייטנאמית" - -msgid "Simplified Chinese" -msgstr "סינית פשוטה" - -msgid "Traditional Chinese" -msgstr "סינית מסורתית" - -msgid "Messages" -msgstr "הודעות" - -msgid "Site Maps" -msgstr "מפות אתר" - -msgid "Static Files" -msgstr "קבצים סטטיים" - -msgid "Syndication" -msgstr "הפצת תכנים" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "מספר העמוד אינו מספר שלם" - -msgid "That page number is less than 1" -msgstr "מספר העמוד קטן מ־1" - -msgid "That page contains no results" -msgstr "עמוד זה אינו מכיל תוצאות" - -msgid "Enter a valid value." -msgstr "יש להזין ערך חוקי." - -msgid "Enter a valid domain name." -msgstr "יש להזין שם מתחם חוקי." - -msgid "Enter a valid URL." -msgstr "יש להזין URL חוקי." - -msgid "Enter a valid integer." -msgstr "יש להזין מספר שלם חוקי." - -msgid "Enter a valid email address." -msgstr "נא להזין כתובת דוא\"ל חוקית" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"יש להזין 'slug' חוקי המכיל אותיות לטיניות, ספרות, קווים תחתונים או מקפים." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"יש להזין 'slug' חוקי המכיל אותיות יוניקוד, ספרות, קווים תחתונים או מקפים." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "יש להזין כתובת %(protocol)s חוקית." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 או IPv6" - -msgid "Enter only digits separated by commas." -msgstr "יש להזין רק ספרות מופרדות בפסיקים." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "יש לוודא שערך זה הינו %(limit_value)s (כרגע %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "יש לוודא שערך זה פחות מ או שווה ל־%(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "יש לוודא שערך זה גדול מ או שווה ל־%(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "יש לוודא שערך זה מהווה מכפלה של %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"יש לוודא שערך זה מהווה מכפלה של צעד בגודל %(limit_value)s, החל מ־%(offset)s, " -"לדוגמה: %(offset)s, %(valid_value1)s, %(valid_value2)s וכו'." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"נא לוודא שערך זה מכיל תו %(limit_value)d לכל הפחות (מכיל %(show_value)d)." -msgstr[1] "" -"נא לוודא שערך זה מכיל %(limit_value)d תווים לכל הפחות (מכיל %(show_value)d)." -msgstr[2] "" -"נא לוודא שערך זה מכיל %(limit_value)d תווים לכל הפחות (מכיל %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"נא לוודא שערך זה מכיל תו %(limit_value)d לכל היותר (מכיל %(show_value)d)." -msgstr[1] "" -"נא לוודא שערך זה מכיל %(limit_value)d תווים לכל היותר (מכיל %(show_value)d)." -msgstr[2] "" -"נא לוודא שערך זה מכיל %(limit_value)d תווים לכל היותר (מכיל %(show_value)d)." - -msgid "Enter a number." -msgstr "נא להזין מספר." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "נא לוודא שאין יותר מספרה %(max)s בסה\"כ." -msgstr[1] "נא לוודא שאין יותר מ־%(max)s ספרות בסה\"כ." -msgstr[2] "נא לוודא שאין יותר מ־%(max)s ספרות בסה\"כ." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "נא לוודא שאין יותר מספרה %(max)s אחרי הנקודה." -msgstr[1] "נא לוודא שאין יותר מ־%(max)s ספרות אחרי הנקודה." -msgstr[2] "נא לוודא שאין יותר מ־%(max)s ספרות אחרי הנקודה." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "נא לוודא שאין יותר מספרה %(max)s לפני הנקודה העשרונית" -msgstr[1] "נא לוודא שאין יותר מ־%(max)s ספרות לפני הנקודה העשרונית" -msgstr[2] "נא לוודא שאין יותר מ־%(max)s ספרות לפני הנקודה העשרונית" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"סיומת הקובץ \"%(extension)s\" אסורה. הסיומות המותרות הן: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "תווי NULL אינם מותרים. " - -msgid "and" -msgstr "ו" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s·עם·%(field_labels)s·אלו קיימים כבר." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "המגבלה \"%(name)s\" הופרה." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "ערך %(value)r אינו אפשרות חוקית." - -msgid "This field cannot be null." -msgstr "שדה זה אינו יכול להיות ריק." - -msgid "This field cannot be blank." -msgstr "שדה זה אינו יכול להיות ריק." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s·עם·%(field_label)s·זה קיימת כבר." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s חייב להיות ייחודי עבור %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "שדה מסוג: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "הערך \"%(value)s\" חייב להיות True או False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\" חייב להיות אחד מ־True‏, False, או None." - -msgid "Boolean (Either True or False)" -msgstr "בוליאני (אמת או שקר)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "מחרוזת (עד %(max_length)s תווים)" - -msgid "String (unlimited)" -msgstr "מחרוזת (ללא הגבלה)." - -msgid "Comma-separated integers" -msgstr "מספרים שלמים מופרדים בפסיקים" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"הערך \"%(value)s\" מכיל פורמט תאריך לא חוקי. חייב להיות בפורמט YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "הערך \"%(value)s\" בפורמט הנכון (YYYY-MM-DD), אך אינו תאריך חוקי." - -msgid "Date (without time)" -msgstr "תאריך (ללא שעה)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"הערך \"%(value)s\" מכיל פורמט לא חוקי. הוא חייב להיות בפורמטYYYY-MM-DD HH:" -"MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"הערך \"%(value)s\" בפורמט הנכון (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) אך אינו " -"מהווה תאריך/שעה חוקיים." - -msgid "Date (with time)" -msgstr "תאריך (כולל שעה)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "הערך \"%(value)s\" חייב להיות מספר עשרוני." - -msgid "Decimal number" -msgstr "מספר עשרוני" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"הערך \"%(value)s\" מכיל פורמט לא חוקי. הוא חייב להיות בפורמט [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "משך" - -msgid "Email address" -msgstr "כתובת דוא\"ל" - -msgid "File path" -msgstr "נתיב קובץ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” חייב להיות מספר נקודה צפה." - -msgid "Floating point number" -msgstr "מספר עשרוני" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "הערך '%(value)s' חייב להיות מספר שלם." - -msgid "Integer" -msgstr "מספר שלם" - -msgid "Big (8 byte) integer" -msgstr "מספר שלם גדול (8 בתים)" - -msgid "Small integer" -msgstr "מספר שלם קטן" - -msgid "IPv4 address" -msgstr "כתובת IPv4" - -msgid "IP address" -msgstr "כתובת IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"%(value)s\" חייב להיות אחד מ־None‏, True, או False." - -msgid "Boolean (Either True, False or None)" -msgstr "בוליאני (אמת, שקר או כלום)" - -msgid "Positive big integer" -msgstr "מספר שלם גדול וחיובי" - -msgid "Positive integer" -msgstr "מספר שלם חיובי" - -msgid "Positive small integer" -msgstr "מספר שלם חיובי קטן" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (עד %(max_length)s תווים)" - -msgid "Text" -msgstr "טקסט" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"הערך “%(value)s” מכיל פורמט לא חוקי. הוא חייב להיות בפורמט HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"הערך “%(value)s” בפורמט הנכון (HH:MM[:ss[.uuuuuu]]) אך אינו מהווה שעה חוקית." - -msgid "Time" -msgstr "זמן" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "מידע בינארי גולמי" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" אינו UUID חוקי." - -msgid "Universally unique identifier" -msgstr "מזהה ייחודי אוניברסלי" - -msgid "File" -msgstr "קובץ" - -msgid "Image" -msgstr "תמונה" - -msgid "A JSON object" -msgstr "אובייקט JSON" - -msgid "Value must be valid JSON." -msgstr "הערך חייב להיות JSON חוקי." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (הסוג נקבע לפי השדה המקושר)" - -msgid "One-to-one relationship" -msgstr "יחס של אחד לאחד" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "קשר %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "קשרי %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "יחס של רבים לרבים" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "יש להזין תוכן בשדה זה." - -msgid "Enter a whole number." -msgstr "נא להזין מספר שלם." - -msgid "Enter a valid date." -msgstr "יש להזין תאריך חוקי." - -msgid "Enter a valid time." -msgstr "יש להזין שעה חוקית." - -msgid "Enter a valid date/time." -msgstr "יש להזין תאריך ושעה חוקיים." - -msgid "Enter a valid duration." -msgstr "יש להזין משך חוקי." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "מספר הימים חייב להיות בין {min_days} ל־{max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "לא נשלח שום קובץ. נא לבדוק את סוג הקידוד של הטופס." - -msgid "No file was submitted." -msgstr "לא נשלח שום קובץ" - -msgid "The submitted file is empty." -msgstr "הקובץ שנשלח ריק." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "נא לוודא ששם קובץ זה מכיל תו %(max)d לכל היותר (מכיל %(length)d)." -msgstr[1] "" -"נא לוודא ששם קובץ זה מכיל %(max)d תווים לכל היותר (מכיל %(length)d)." -msgstr[2] "" -"נא לוודא ששם קובץ זה מכיל %(max)d תווים לכל היותר (מכיל %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "נא לשים קובץ או סימן את התיבה לניקוי, לא שניהם." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "נא להעלות תמונה חוקית. הקובץ שהעלת אינו תמונה או מכיל תמונה מקולקלת." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "יש לבחור אפשרות חוקית. %(value)s אינו בין האפשרויות הזמינות." - -msgid "Enter a list of values." -msgstr "יש להזין רשימת ערכים" - -msgid "Enter a complete value." -msgstr "יש להזין ערך שלם." - -msgid "Enter a valid UUID." -msgstr "יש להזין UUID חוקי." - -msgid "Enter a valid JSON." -msgstr "נא להזין JSON חוקי." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(שדה מוסתר %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"המידע של ManagementForm חסר או שובש. שדות חסרים: %(field_names)s. יתכן " -"שתצטרך להגיש דיווח באג אם הבעיה נמשכת." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "נא לשלוח טופס %(num)d לכל היותר." -msgstr[1] "נא לשלוח %(num)d טפסים לכל היותר." -msgstr[2] "נא לשלוח %(num)d טפסים לכל היותר." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "נא לשלוח טופס %(num)dאו יותר." -msgstr[1] "נא לשלוח %(num)d טפסים או יותר." -msgstr[2] "נא לשלוח %(num)d טפסים או יותר." - -msgid "Order" -msgstr "מיון" - -msgid "Delete" -msgstr "מחיקה" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "נא לתקן את הערכים הכפולים ל%(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "נא לתקן את הערכים הכפולים ל%(field)s, שערכים בו חייבים להיות ייחודיים." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"נא לתקן את הערכים הכפולים %(field_name)s, שחייבים להיות ייחודיים ל%(lookup)s " -"של %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "נא לתקן את הערכים הכפולים למטה." - -msgid "The inline value did not match the parent instance." -msgstr "הערך הפנימי אינו תואם לאב." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "יש לבחור אפשרות חוקית; אפשרות זו אינה אחת מהזמינות." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" אינו ערך חוקי." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"לא ניתן לפרש את %(datetime)s באזור הזמן %(current_timezone)s; הוא עשוי להיות " -"דו־משמעי או לא קיים." - -msgid "Clear" -msgstr "לסלק" - -msgid "Currently" -msgstr "עכשיו" - -msgid "Change" -msgstr "שינוי" - -msgid "Unknown" -msgstr "לא ידוע" - -msgid "Yes" -msgstr "כן" - -msgid "No" -msgstr "לא" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "כן,לא,אולי" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "בית %(size)d " -msgstr[1] "%(size)d בתים" -msgstr[2] "%(size)d בתים" - -#, python-format -msgid "%s KB" -msgstr "%s ק\"ב" - -#, python-format -msgid "%s MB" -msgstr "%s מ\"ב" - -#, python-format -msgid "%s GB" -msgstr "%s ג\"ב" - -#, python-format -msgid "%s TB" -msgstr "%s ט\"ב" - -#, python-format -msgid "%s PB" -msgstr "%s פ\"ב" - -msgid "p.m." -msgstr "אחר הצהריים" - -msgid "a.m." -msgstr "בבוקר" - -msgid "PM" -msgstr "אחר הצהריים" - -msgid "AM" -msgstr "בבוקר" - -msgid "midnight" -msgstr "חצות" - -msgid "noon" -msgstr "12 בצהריים" - -msgid "Monday" -msgstr "שני" - -msgid "Tuesday" -msgstr "שלישי" - -msgid "Wednesday" -msgstr "רביעי" - -msgid "Thursday" -msgstr "חמישי" - -msgid "Friday" -msgstr "שישי" - -msgid "Saturday" -msgstr "שבת" - -msgid "Sunday" -msgstr "ראשון" - -msgid "Mon" -msgstr "שני" - -msgid "Tue" -msgstr "שלישי" - -msgid "Wed" -msgstr "רביעי" - -msgid "Thu" -msgstr "חמישי" - -msgid "Fri" -msgstr "שישי" - -msgid "Sat" -msgstr "שבת" - -msgid "Sun" -msgstr "ראשון" - -msgid "January" -msgstr "ינואר" - -msgid "February" -msgstr "פברואר" - -msgid "March" -msgstr "מרץ" - -msgid "April" -msgstr "אפריל" - -msgid "May" -msgstr "מאי" - -msgid "June" -msgstr "יוני" - -msgid "July" -msgstr "יולי" - -msgid "August" -msgstr "אוגוסט" - -msgid "September" -msgstr "ספטמבר" - -msgid "October" -msgstr "אוקטובר" - -msgid "November" -msgstr "נובמבר" - -msgid "December" -msgstr "דצמבר" - -msgid "jan" -msgstr "ינו" - -msgid "feb" -msgstr "פבר" - -msgid "mar" -msgstr "מרץ" - -msgid "apr" -msgstr "אפר" - -msgid "may" -msgstr "מאי" - -msgid "jun" -msgstr "יונ" - -msgid "jul" -msgstr "יול" - -msgid "aug" -msgstr "אוג" - -msgid "sep" -msgstr "ספט" - -msgid "oct" -msgstr "אוק" - -msgid "nov" -msgstr "נוב" - -msgid "dec" -msgstr "דצמ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "יאנ'" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "פבר'" - -msgctxt "abbrev. month" -msgid "March" -msgstr "מרץ" - -msgctxt "abbrev. month" -msgid "April" -msgstr "אפריל" - -msgctxt "abbrev. month" -msgid "May" -msgstr "מאי" - -msgctxt "abbrev. month" -msgid "June" -msgstr "יוני" - -msgctxt "abbrev. month" -msgid "July" -msgstr "יולי" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "אוג'" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ספט'" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "אוק'" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "נוב'" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "דצמ'" - -msgctxt "alt. month" -msgid "January" -msgstr "ינואר" - -msgctxt "alt. month" -msgid "February" -msgstr "פברואר" - -msgctxt "alt. month" -msgid "March" -msgstr "מרץ" - -msgctxt "alt. month" -msgid "April" -msgstr "אפריל" - -msgctxt "alt. month" -msgid "May" -msgstr "מאי" - -msgctxt "alt. month" -msgid "June" -msgstr "יוני" - -msgctxt "alt. month" -msgid "July" -msgstr "יולי" - -msgctxt "alt. month" -msgid "August" -msgstr "אוגוסט" - -msgctxt "alt. month" -msgid "September" -msgstr "ספטמבר" - -msgctxt "alt. month" -msgid "October" -msgstr "אוקטובר" - -msgctxt "alt. month" -msgid "November" -msgstr "נובמבר" - -msgctxt "alt. month" -msgid "December" -msgstr "דצמבר" - -msgid "This is not a valid IPv6 address." -msgstr "זו אינה כתובת IPv6 חוקית." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s‮…" - -msgid "or" -msgstr "או" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "שנה" -msgstr[1] "שנתיים" -msgstr[2] "%(num)d שנים" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "חודש" -msgstr[1] "חודשיים" -msgstr[2] "%(num)d חודשים" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "שבוע" -msgstr[1] "שבועיים" -msgstr[2] "%(num)d שבועות" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "יום" -msgstr[1] "יומיים" -msgstr[2] "%(num)d ימים" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "שעה" -msgstr[1] "שעתיים" -msgstr[2] "%(num)d שעות" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "דקה" -msgstr[1] "%(num)d דקות" -msgstr[2] "%(num)d דקות" - -msgid "Forbidden" -msgstr "אסור" - -msgid "CSRF verification failed. Request aborted." -msgstr "אימות CSRF נכשל. הבקשה בוטלה." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"הודעה זו מופיעה מאחר ואתר ה־HTTPS הזה דורש מהדפדפן שלך לשלוח \"Referer " -"header\", אך הוא לא נשלח. זה נדרש מסיבות אבטחה, כדי להבטיח שהדפדפן שלך לא " -"נחטף ע\"י צד שלישי." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"אם ביטלת \"Referer\" headers בדפדפן שלך, נא לאפשר אותם מחדש, לפחות עבור אתר " -"זה, חיבורי HTTPS או בקשות \"same-origin\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"אם השתמשת בתגאו הוספת header " -"של “Referrer-Policy: no-referrer”, נא להסיר אותם. הגנת ה־CSRF דורשת " -"‎“Referer” header לבדיקת ה־referer. אם פרטיות מדאיגה אותך, ניתן להשתמש " -"בתחליפים כמו לקישור אל אתרי צד שלישי." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"הודעה זו מופיעה מאחר ואתר זה דורש עוגיית CSRF כאשר שולחים טפסים. עוגיה זו " -"נדרשת מסיבות אבטחה, כדי לוודא שהדפדפן שלך לא נחטף על ידי אחרים." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"אם ביטלת עוגיות בדפדפן שלך, נא לאפשר אותם מחדש לפחות עבור אתר זה או בקשות " -"“same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "מידע נוסף זמין עם " - -msgid "No year specified" -msgstr "לא צוינה שנה" - -msgid "Date out of range" -msgstr "תאריך מחוץ לטווח" - -msgid "No month specified" -msgstr "לא צוין חודש" - -msgid "No day specified" -msgstr "לא צוין יום" - -msgid "No week specified" -msgstr "לא צוין שבוע" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "לא נמצאו %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"לא נמצאו %(verbose_name_plural)s בזמן עתיד מאחר ש-%(class_name)s." -"allow_future מוגדר False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "מחרוזת תאריך %(datestr)s אינה חוקית בפורמט %(format)s." - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "לא נמצא/ה %(verbose_name)s התואם/ת לשאילתה" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "העמוד אינו \"last\" או לא ניתן להמרה למספר שם." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "עמוד לא חוקי (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "רשימה ריקה ו־“%(class_name)s.allow_empty” הוא False." - -msgid "Directory indexes are not allowed here." -msgstr "אינדקסים על תיקיה אסורים כאן." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" אינו קיים" - -#, python-format -msgid "Index of %(directory)s" -msgstr "אינדקס של %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "ההתקנה עברה בהצלחה! מזל טוב!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"ראו הערות השחרור עבור Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"עמוד זה מופיע בעקבות המצאות DEBUG=True בקובץ ההגדרות שלך ולא הגדרת שום URLs." - -msgid "Django Documentation" -msgstr "תיעוד Django" - -msgid "Topics, references, & how-to’s" -msgstr "נושאים, הפניות ומדריכים לביצוע" - -msgid "Tutorial: A Polling App" -msgstr "מדריך ללומד: יישום לסקרים." - -msgid "Get started with Django" -msgstr "התחילו לעבוד עם Django" - -msgid "Django Community" -msgstr "קהילת Django" - -msgid "Connect, get help, or contribute" -msgstr "יצירת קשר, קבלת עזרה או השתתפות" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/he/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/he/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/he/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/he/formats.py deleted file mode 100644 index 2cf9286..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/he/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j בF Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j בF Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j בF" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index 2d535fb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index 20da376..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,1254 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# alkuma , 2013 -# Bharat Toge, 2022 -# Chandan kumar , 2012 -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# Pratik , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:23-0500\n" -"PO-Revision-Date: 2022-07-25 06:49+0000\n" -"Last-Translator: Bharat Toge\n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "अफ़्रीकांस" - -msgid "Arabic" -msgstr "अरबी" - -msgid "Algerian Arabic" -msgstr "अल्जीरियाई अरब" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "आज़रबाइजानी" - -msgid "Bulgarian" -msgstr "बलगारियन" - -msgid "Belarusian" -msgstr "बेलारूसी" - -msgid "Bengali" -msgstr "बंगाली" - -msgid "Breton" -msgstr "ब्रेटन" - -msgid "Bosnian" -msgstr "बोस्नियन" - -msgid "Catalan" -msgstr "कटलान" - -msgid "Czech" -msgstr "च्चेक" - -msgid "Welsh" -msgstr "वेल्श" - -msgid "Danish" -msgstr "दानिश" - -msgid "German" -msgstr "जर्मन" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "ग्रीक" - -msgid "English" -msgstr "अंग्रेज़ी " - -msgid "Australian English" -msgstr "ऑस्ट्रेलियाई अंग्रेज़ी " - -msgid "British English" -msgstr "ब्रिटिश अंग्रेजी" - -msgid "Esperanto" -msgstr "एस्परेन्तो" - -msgid "Spanish" -msgstr "स्पानिश" - -msgid "Argentinian Spanish" -msgstr "अर्जेंटीना स्पैनिश " - -msgid "Colombian Spanish" -msgstr "कोलंबियाई स्पेनी" - -msgid "Mexican Spanish" -msgstr "मेक्सिकन स्पैनिश" - -msgid "Nicaraguan Spanish" -msgstr "निकारागुआ स्पैनिश" - -msgid "Venezuelan Spanish" -msgstr "वेनेज़ुएलाई स्पेनिश" - -msgid "Estonian" -msgstr "एस्टोनियन" - -msgid "Basque" -msgstr "बास्क" - -msgid "Persian" -msgstr "पारसी" - -msgid "Finnish" -msgstr "फ़िन्निश" - -msgid "French" -msgstr "फ्रेंच" - -msgid "Frisian" -msgstr "फ्रिसियन" - -msgid "Irish" -msgstr "आयरिश" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "गलिशियन" - -msgid "Hebrew" -msgstr "हि‍ब्रू" - -msgid "Hindi" -msgstr "हिंदी" - -msgid "Croatian" -msgstr "क्रोयेशियन" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "हंगेरियन" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "इंतर्लिंगुआ" - -msgid "Indonesian" -msgstr "इन्डोनेशियन " - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "आयिस्लान्डिक" - -msgid "Italian" -msgstr "इटैलियन" - -msgid "Japanese" -msgstr "जपानी" - -msgid "Georgian" -msgstr "ज्योर्जियन" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "कज़ाख" - -msgid "Khmer" -msgstr "ख्मेर" - -msgid "Kannada" -msgstr "कन्‍नड़" - -msgid "Korean" -msgstr "कोरियन" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "लक्संबर्गी" - -msgid "Lithuanian" -msgstr "लिथुवेनियन" - -msgid "Latvian" -msgstr "लात्वियन" - -msgid "Macedonian" -msgstr "मेसिडोनियन" - -msgid "Malayalam" -msgstr "मलयालम" - -msgid "Mongolian" -msgstr "मंगोलियन" - -msgid "Marathi" -msgstr "मराठी" - -msgid "Malay" -msgstr "मलय भाषा" - -msgid "Burmese" -msgstr "बर्मीज़" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "नेपाली" - -msgid "Dutch" -msgstr "डच" - -msgid "Norwegian Nynorsk" -msgstr "नार्वेजियन नायनॉर्स्क" - -msgid "Ossetic" -msgstr "ओस्सेटिक" - -msgid "Punjabi" -msgstr "पंजाबी" - -msgid "Polish" -msgstr "पोलिश" - -msgid "Portuguese" -msgstr "पुर्तगाली" - -msgid "Brazilian Portuguese" -msgstr "ब्रजिलियन पुर्तगाली" - -msgid "Romanian" -msgstr "रोमानियन" - -msgid "Russian" -msgstr "रूसी" - -msgid "Slovak" -msgstr "स्लोवाक" - -msgid "Slovenian" -msgstr "स्लोवेनियन" - -msgid "Albanian" -msgstr "अल्बेनियन्" - -msgid "Serbian" -msgstr "सर्बियन" - -msgid "Serbian Latin" -msgstr "सर्बियाई लैटिन" - -msgid "Swedish" -msgstr "स्वीडिश" - -msgid "Swahili" -msgstr "स्वाहिली" - -msgid "Tamil" -msgstr "तमिल" - -msgid "Telugu" -msgstr "तेलुगु" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "थाई" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "तुर्किश" - -msgid "Tatar" -msgstr "तातार" - -msgid "Udmurt" -msgstr "उद्मर्त" - -msgid "Ukrainian" -msgstr "यूक्रानियन" - -msgid "Urdu" -msgstr "उर्दू" - -msgid "Uzbek" -msgstr "उज़्बेक" - -msgid "Vietnamese" -msgstr "वियतनामी" - -msgid "Simplified Chinese" -msgstr "सरल चीनी" - -msgid "Traditional Chinese" -msgstr "पारम्परिक चीनी" - -msgid "Messages" -msgstr "संदेश" - -msgid "Site Maps" -msgstr "साइट मैप" - -msgid "Static Files" -msgstr "स्थिर फ़ाइलें" - -msgid "Syndication" -msgstr "सिंडिकेशन" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "यह पृष्ठ संख्या पूर्णांक नहीं है" - -msgid "That page number is less than 1" -msgstr "यह पृष्ठ संख्या 1 से कम है " - -msgid "That page contains no results" -msgstr "उस पृष्ठ पर कोई परिणाम नहीं हैं" - -msgid "Enter a valid value." -msgstr "एक मान्य मूल्य दर्ज करें" - -msgid "Enter a valid URL." -msgstr "वैध यू.आर.एल भरें ।" - -msgid "Enter a valid integer." -msgstr "एक मान्य पूर्ण संख्या दर्ज करें" - -msgid "Enter a valid email address." -msgstr "वैध डाक पता प्रविष्ट करें।" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "वैध आइ.पि वी 4 पता भरें ।" - -msgid "Enter a valid IPv6 address." -msgstr "वैध IPv6 पता दर्ज करें." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "वैध IPv4 या IPv6 पता दर्ज करें." - -msgid "Enter only digits separated by commas." -msgstr "अल्पविराम अंक मात्र ही भरें ।" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"सुनिश्चित करें कि यह मान %(limit_value)s (यह\n" -" %(show_value)s है) है ।" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "सुनिश्चित करें कि यह मान %(limit_value)s से कम या बराबर है ।" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "सुनिश्चित करें यह मान %(limit_value)s से बड़ा या बराबर है ।" - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "एक संख्या दर्ज करें ।" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "और" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "यह मूल्य खाली नहीं हो सकता ।" - -msgid "This field cannot be blank." -msgstr "इस फ़ील्ड रिक्त नहीं हो सकता है." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "इस %(field_label)s के साथ एक %(model_name)s पहले से ही उपस्थित है ।" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "फील्ड के प्रकार: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "बूलियन (सही अथ‌वा गलत)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "स्ट्रिंग (अधिकतम लम्बाई %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "अल्पविराम सीमांकित संख्या" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "तिथि (बिना समय)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "तिथि (समय के साथ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "दशमलव संख्या" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "अवधि" - -msgid "Email address" -msgstr "ईमेल पता" - -msgid "File path" -msgstr "संचिका पथ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "चल बिन्दु संख्या" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "पूर्णांक" - -msgid "Big (8 byte) integer" -msgstr "बड़ा (8 बाइट) पूर्णांक " - -msgid "Small integer" -msgstr "छोटा पूर्णांक" - -msgid "IPv4 address" -msgstr "IPv4 पता" - -msgid "IP address" -msgstr "आइ.पि पता" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "बूलियन (सही, गलत या कुछ नहीं)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "धनात्मक पूर्णांक" - -msgid "Positive small integer" -msgstr "धनात्मक छोटा पूर्णांक" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "स्लग (%(max_length)s तक)" - -msgid "Text" -msgstr "पाठ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "समय" - -msgid "URL" -msgstr "यू.आर.एल" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "फाइल" - -msgid "Image" -msgstr "छवि" - -msgid "A JSON object" -msgstr "एक JSON डेटा object" - -msgid "Value must be valid JSON." -msgstr "दर्ज किया गया डेटा वैध JSON होना अनिवार्य है" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "विदेशी कुंजी (संबंधित क्षेत्र के द्वारा प्रकार निर्धारित)" - -msgid "One-to-one relationship" -msgstr "एक-एक संबंध" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "बहुत से कई संबंध" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "यह क्षेत्र अपेक्षित हैं" - -msgid "Enter a whole number." -msgstr "एक पूर्ण संख्या दर्ज करें ।" - -msgid "Enter a valid date." -msgstr "वैध तिथि भरें ।" - -msgid "Enter a valid time." -msgstr "वैध समय भरें ।" - -msgid "Enter a valid date/time." -msgstr "वैध तिथि/समय भरें ।" - -msgid "Enter a valid duration." -msgstr "एक वैध अवधी दर्ज करें" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "दिनों की संख्या {min_days} और {max_days} के बीच होना अनिवार्य है " - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "कोई संचिका निवेदित नहीं हुई । कृपया कूटलेखन की जाँच करें ।" - -msgid "No file was submitted." -msgstr "कोई संचिका निवेदित नहीं हुई ।" - -msgid "The submitted file is empty." -msgstr "निवेदित संचिका खाली है ।" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "कृपया या फ़ाइल प्रस्तुत करे या साफ जांचपेटी की जाँच करे,दोनों नहीं ." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "वैध चित्र निवेदन करें । आप के द्वारा निवेदित संचिका अमान्य अथवा दूषित है ।" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "मान्य इच्छा चयन करें । %(value)s लभ्य इच्छाओं में उप्लब्ध नहीं हैं ।" - -msgid "Enter a list of values." -msgstr "मूल्य सूची दर्ज करें ।" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "एक वैध UUID भरें " - -msgid "Enter a valid JSON." -msgstr "एक वैध JSON भरें " - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "छाटें" - -msgid "Delete" -msgstr "मिटाएँ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "कृपया %(field)s के लिए डुप्लिकेट डेटा को सही करे." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "कृपया %(field)s के डुप्लिकेट डेटा जो अद्वितीय होना चाहिए को सही करें." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"कृपया %(field_name)s के लिए डुप्लिकेट डेटा को सही करे जो %(date_field)s में " -"%(lookup)s के लिए अद्वितीय होना चाहिए." - -msgid "Please correct the duplicate values below." -msgstr "कृपया डुप्लिकेट मानों को सही करें." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "मान्य विकल्प चयन करें । यह विकल्प उपस्थित विकल्पों में नहीं है ।" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "रिक्त करें" - -msgid "Currently" -msgstr "फिलहाल" - -msgid "Change" -msgstr "बदलें" - -msgid "Unknown" -msgstr "अनजान" - -msgid "Yes" -msgstr "हाँ" - -msgid "No" -msgstr "नहीं" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "हाँ,नहीं,शायद" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d बाइट" -msgstr[1] "%(size)d बाइट" - -#, python-format -msgid "%s KB" -msgstr "%s केबी " - -#, python-format -msgid "%s MB" -msgstr "%s मेबी " - -#, python-format -msgid "%s GB" -msgstr "%s जीबी " - -#, python-format -msgid "%s TB" -msgstr "%s टीबी" - -#, python-format -msgid "%s PB" -msgstr "%s पीबी" - -msgid "p.m." -msgstr "बजे" - -msgid "a.m." -msgstr "बजे" - -msgid "PM" -msgstr "बजे" - -msgid "AM" -msgstr "बजे" - -msgid "midnight" -msgstr "मध्यरात्री" - -msgid "noon" -msgstr "दोपहर" - -msgid "Monday" -msgstr "सोम‌वार" - -msgid "Tuesday" -msgstr "मंगलवार" - -msgid "Wednesday" -msgstr "बुधवार" - -msgid "Thursday" -msgstr "गुरूवार" - -msgid "Friday" -msgstr "शुक्रवार" - -msgid "Saturday" -msgstr "शनिवार" - -msgid "Sunday" -msgstr "रविवार" - -msgid "Mon" -msgstr "सोम" - -msgid "Tue" -msgstr "मंगल" - -msgid "Wed" -msgstr "बुध" - -msgid "Thu" -msgstr "गुरू" - -msgid "Fri" -msgstr "शुक्र" - -msgid "Sat" -msgstr "शनि" - -msgid "Sun" -msgstr "रवि" - -msgid "January" -msgstr "जनवरी" - -msgid "February" -msgstr "फ़रवरी" - -msgid "March" -msgstr "मार्च" - -msgid "April" -msgstr "अप्रैल" - -msgid "May" -msgstr "मई" - -msgid "June" -msgstr "जून" - -msgid "July" -msgstr "जुलाई" - -msgid "August" -msgstr "अगस्त" - -msgid "September" -msgstr "सितमबर" - -msgid "October" -msgstr "अक्टूबर" - -msgid "November" -msgstr "नवमबर" - -msgid "December" -msgstr "दिसमबर" - -msgid "jan" -msgstr "जन" - -msgid "feb" -msgstr "फ़र" - -msgid "mar" -msgstr "मा" - -msgid "apr" -msgstr "अप्र" - -msgid "may" -msgstr "मई" - -msgid "jun" -msgstr "जून" - -msgid "jul" -msgstr "जुल" - -msgid "aug" -msgstr "अग" - -msgid "sep" -msgstr "सित" - -msgid "oct" -msgstr "अक्ट" - -msgid "nov" -msgstr "नव" - -msgid "dec" -msgstr "दिस्" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "जनवरी." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "फ़रवरी." - -msgctxt "abbrev. month" -msgid "March" -msgstr "मार्च" - -msgctxt "abbrev. month" -msgid "April" -msgstr "अप्रैल" - -msgctxt "abbrev. month" -msgid "May" -msgstr "मई" - -msgctxt "abbrev. month" -msgid "June" -msgstr "जून" - -msgctxt "abbrev. month" -msgid "July" -msgstr "जुलाई" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "अग." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "सितम्बर." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "अक्टूबर" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "नवम्बर." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "दिसम्बर" - -msgctxt "alt. month" -msgid "January" -msgstr "जनवरी" - -msgctxt "alt. month" -msgid "February" -msgstr "फरवरी" - -msgctxt "alt. month" -msgid "March" -msgstr "मार्च" - -msgctxt "alt. month" -msgid "April" -msgstr "अप्रैल" - -msgctxt "alt. month" -msgid "May" -msgstr "मई" - -msgctxt "alt. month" -msgid "June" -msgstr "जून" - -msgctxt "alt. month" -msgid "July" -msgstr "जुलाई" - -msgctxt "alt. month" -msgid "August" -msgstr "अगस्त" - -msgctxt "alt. month" -msgid "September" -msgstr "सितंबर" - -msgctxt "alt. month" -msgid "October" -msgstr "अक्टूबर" - -msgctxt "alt. month" -msgid "November" -msgstr "नवंबर" - -msgctxt "alt. month" -msgid "December" -msgstr "दिसंबर" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "अथवा" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF सत्यापन असफल रहा. Request निरस्त की गई " - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "कोई साल निर्दिष्ट नहीं किया गया " - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "कोई महीने निर्दिष्ट नहीं किया गया " - -msgid "No day specified" -msgstr "कोई दिन निर्दिष्ट नहीं किया गया " - -msgid "No week specified" -msgstr "कोई सप्ताह निर्दिष्ट नहीं किया गया " - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s उपलब्ध नहीं है" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"भविष्य %(verbose_name_plural)s उपलब्ध नहीं है क्योंकि %(class_name)s.allow_future " -"गलत है." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr " इस प्रश्न %(verbose_name)s से मेल नहीं खाते है" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "अवैध पन्ना (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "निर्देशिका अनुक्रमित की अनुमति यहाँ नहीं है." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s का अनुक्रमणिका" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hi/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/hi/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hi/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/hi/formats.py deleted file mode 100644 index ac078ec..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/hi/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d-m-Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index f7afa5d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index 574a7ab..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1274 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# aljosa , 2011,2013 -# Berislav Lopac , 2013 -# Bojan Mihelač , 2012 -# Boni Đukić , 2017 -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2015-2016 -# Nino , 2013 -# senko , 2012 -# Ylodi , 2011 -# zmasek , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arapski" - -msgid "Asturian" -msgstr "Asturijski" - -msgid "Azerbaijani" -msgstr "Azarbejdžanac" - -msgid "Bulgarian" -msgstr "Unesite ispravnu IPv4 adresu." - -msgid "Belarusian" -msgstr "Bjeloruski" - -msgid "Bengali" -msgstr "Bengalski" - -msgid "Breton" -msgstr "Bretonski" - -msgid "Bosnian" -msgstr "Bošnjački" - -msgid "Catalan" -msgstr "Katalanski" - -msgid "Czech" -msgstr "Češki" - -msgid "Welsh" -msgstr "Velški" - -msgid "Danish" -msgstr "Danski" - -msgid "German" -msgstr "Njemački" - -msgid "Lower Sorbian" -msgstr "Donjolužičkosrpski" - -msgid "Greek" -msgstr "Grčki" - -msgid "English" -msgstr "Engleski" - -msgid "Australian English" -msgstr "Australski engleski" - -msgid "British English" -msgstr "Britanski engleski" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Španjolski" - -msgid "Argentinian Spanish" -msgstr "Argentinski španjolski" - -msgid "Colombian Spanish" -msgstr "Kolumbijski španjolski" - -msgid "Mexican Spanish" -msgstr "Meksički španjolski" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragvanski Španjolski" - -msgid "Venezuelan Spanish" -msgstr "Venezuelanski Španjolski" - -msgid "Estonian" -msgstr "Estonski" - -msgid "Basque" -msgstr "Baskijski" - -msgid "Persian" -msgstr "Perzijski" - -msgid "Finnish" -msgstr "Finski" - -msgid "French" -msgstr "Francuski" - -msgid "Frisian" -msgstr "Frizijski" - -msgid "Irish" -msgstr "Irski" - -msgid "Scottish Gaelic" -msgstr "Škotski gaelski" - -msgid "Galician" -msgstr "Galičanski" - -msgid "Hebrew" -msgstr "Hebrejski" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Hrvatski" - -msgid "Upper Sorbian" -msgstr "Gornjolužičkosrpski" - -msgid "Hungarian" -msgstr "Mađarski" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezijski" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandski" - -msgid "Italian" -msgstr "Talijanski" - -msgid "Japanese" -msgstr "Japanski" - -msgid "Georgian" -msgstr "Gruzijski" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kazaški" - -msgid "Khmer" -msgstr "Kambođanski" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreanski" - -msgid "Luxembourgish" -msgstr "Luksemburški" - -msgid "Lithuanian" -msgstr "Litvanski" - -msgid "Latvian" -msgstr "Latvijski" - -msgid "Macedonian" -msgstr "Makedonski" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolski" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Burmese" -msgstr "Burmanski" - -msgid "Norwegian Bokmål" -msgstr "Bokmål" - -msgid "Nepali" -msgstr "Nepalski" - -msgid "Dutch" -msgstr "Nizozemski" - -msgid "Norwegian Nynorsk" -msgstr "Norveški Nynorsk" - -msgid "Ossetic" -msgstr "Osetski" - -msgid "Punjabi" -msgstr "Pendžabljanin" - -msgid "Polish" -msgstr "Poljski" - -msgid "Portuguese" -msgstr "Portugalski" - -msgid "Brazilian Portuguese" -msgstr "Brazilski portugalski" - -msgid "Romanian" -msgstr "Rumunjski" - -msgid "Russian" -msgstr "Ruski" - -msgid "Slovak" -msgstr "Slovački" - -msgid "Slovenian" -msgstr "Slovenski" - -msgid "Albanian" -msgstr "Albanski" - -msgid "Serbian" -msgstr "Srpski" - -msgid "Serbian Latin" -msgstr "Latinski srpski" - -msgid "Swedish" -msgstr "Švedski" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamilski" - -msgid "Telugu" -msgstr "Teluški" - -msgid "Thai" -msgstr "Thai (tajlandski)" - -msgid "Turkish" -msgstr "Turski" - -msgid "Tatar" -msgstr "Tatarski" - -msgid "Udmurt" -msgstr "Udmurtski" - -msgid "Ukrainian" -msgstr "Ukrajinski" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vijetnamski" - -msgid "Simplified Chinese" -msgstr "Pojednostavljeni kineski" - -msgid "Traditional Chinese" -msgstr "Tradicionalni kineski" - -msgid "Messages" -msgstr "Poruke" - -msgid "Site Maps" -msgstr "Mape stranica" - -msgid "Static Files" -msgstr "Statične datoteke" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Broj stranice nije cijeli broj" - -msgid "That page number is less than 1" -msgstr "Broj stranice je manji od 1" - -msgid "That page contains no results" -msgstr "Stranica ne sadrži rezultate" - -msgid "Enter a valid value." -msgstr "Unesite ispravnu vrijednost." - -msgid "Enter a valid URL." -msgstr "Unesite ispravan URL." - -msgid "Enter a valid integer." -msgstr "Unesite vrijednost u obliku cijelog broja." - -msgid "Enter a valid email address." -msgstr "Unesite ispravnu e-mail adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Unesite ispravnu IPv4 adresu." - -msgid "Enter a valid IPv6 address." -msgstr "Unesite ispravnu IPv6 adresu." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Unesite ispravnu IPv4 ili IPv6 adresu." - -msgid "Enter only digits separated by commas." -msgstr "Unesite samo brojeve razdvojene zarezom." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Osigurajte da ova vrijednost ima %(limit_value)s (trenutno je " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Osigurajte da je ova vrijednost manja ili jednaka %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Osigurajte da je ova vrijednost veća ili jednaka %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Osigurajte da ova vrijednost ima najmanje %(limit_value)d znak (trenutno ima " -"%(show_value)d)." -msgstr[1] "" -"Osigurajte da ova vrijednost ima najmanje %(limit_value)d znakova (trenutno " -"ima %(show_value)d)." -msgstr[2] "" -"Osigurajte da ova vrijednost ima najmanje %(limit_value)d znakova (trenutno " -"ima %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Osigurajte da ova vrijednost ima najviše %(limit_value)d znak (trenutno ima " -"%(show_value)d)." -msgstr[1] "" -"Osigurajte da ova vrijednost ima najviše %(limit_value)d znakova (trenutno " -"ima %(show_value)d)." -msgstr[2] "" -"Osigurajte da ova vrijednost ima najviše %(limit_value)d znakova (trenutno " -"ima %(show_value)d)." - -msgid "Enter a number." -msgstr "Unesite broj." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Osigurajte da nema više od ukupno %(max)s numeričkog znaka." -msgstr[1] "Osigurajte da nema više od ukupno %(max)s numerička znaka." -msgstr[2] "Osigurajte da nema više od ukupno %(max)s numeričkih znakova." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Osigurajte da nema više od ukupno %(max)s decimalnog mjesta." -msgstr[1] "Osigurajte da nema više od ukupno %(max)s decimalna mjesta." -msgstr[2] "Osigurajte da nema više od ukupno %(max)s decimalnih mjesta." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Osigurajte da nema više od ukupno %(max)s numberičkog znaka prije decimalne " -"točke." -msgstr[1] "" -"Osigurajte da nema više od ukupno %(max)s numberička znaka prije decimalne " -"točke." -msgstr[2] "" -"Osigurajte da nema više od ukupno %(max)s numberičkih znakova prije " -"decimalne točke." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "i" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s sa navedenim %(field_labels)s već postoji." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Vrijednost %(value)r nije jedna od raspoloživih opcija." - -msgid "This field cannot be null." -msgstr "Ovo polje ne može biti null." - -msgid "This field cannot be blank." -msgstr "Ovo polje ne može biti prazno." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s sa navedenim %(field_label)s već postoji." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s mora biti jedinstven pojam za %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Polje tipa: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (True ili False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Slova (do %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Cijeli brojevi odvojeni zarezom" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Datum (bez vremena/sati)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Datum (sa vremenom/satima)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Decimalni broj" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Trajanje" - -msgid "Email address" -msgstr "E-mail adresa" - -msgid "File path" -msgstr "Put do datoteke" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Broj s pomičnim zarezom (floating point number)" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Cijeli broj" - -msgid "Big (8 byte) integer" -msgstr "Big (8 byte) integer" - -msgid "IPv4 address" -msgstr "IPv4 adresa" - -msgid "IP address" -msgstr "IP adresa" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (True, False ili None)" - -msgid "Positive integer" -msgstr "Pozitivan cijeli broj" - -msgid "Positive small integer" -msgstr "Pozitivan mali cijeli broj" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "'Slug' (do %(max_length)s)" - -msgid "Small integer" -msgstr "Mali broj" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Vrijeme" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Binarni podaci" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Datoteka" - -msgid "Image" -msgstr "Slika" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s instanca sa %(field)s %(value)r ne postoji." - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (type determined by related field)" - -msgid "One-to-one relationship" -msgstr "One-to-one relationship" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s veza" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s veze" - -msgid "Many-to-many relationship" -msgstr "Many-to-many relationship" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Unos za ovo polje je obavezan." - -msgid "Enter a whole number." -msgstr "Unesite cijeli broj." - -msgid "Enter a valid date." -msgstr "Unesite ispravan datum." - -msgid "Enter a valid time." -msgstr "Unesite ispravno vrijeme." - -msgid "Enter a valid date/time." -msgstr "Unesite ispravan datum/vrijeme." - -msgid "Enter a valid duration." -msgstr "Unesite ispravno trajanje." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Datoteka nije poslana. Provjerite 'encoding type' forme." - -msgid "No file was submitted." -msgstr "Datoteka nije poslana." - -msgid "The submitted file is empty." -msgstr "Poslana datoteka je prazna." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Osigurajte da naziv datoteke ima najviše %(max)d znak (ima %(length)d)." -msgstr[1] "" -"Osigurajte da naziv datoteke ima najviše %(max)d znakova (ima %(length)d)." -msgstr[2] "" -"Osigurajte da naziv datoteke ima najviše %(max)d znakova (ima %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Molimo Vas da pošaljete ili datoteku ili označite izbor, a ne oboje." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Upload-ajte ispravnu sliku. Datoteka koju ste upload-ali ili nije slika ili " -"je oštečena." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Odaberite iz ponuđenog. %(value)s nije ponuđen kao opcija." - -msgid "Enter a list of values." -msgstr "Unesite listu vrijednosti." - -msgid "Enter a complete value." -msgstr "Unesite kompletnu vrijednost." - -msgid "Enter a valid UUID." -msgstr "Unesite ispravan UUID." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skriveno polje %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm podaci nedostaju ili su promijenjeni" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Molimo unesite %d obrazac." -msgstr[1] "Molimo unesite %d ili manje obrazaca." -msgstr[2] "Molimo unesite %d ili manje obrazaca." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Molimo unesite %d ili više obrazaca." -msgstr[1] "Molimo unesite %d ili više obrazaca." -msgstr[2] "Molimo unesite %d ili više obrazaca." - -msgid "Order" -msgstr "Redoslijed:" - -msgid "Delete" -msgstr "Izbriši" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ispravite duplicirane podatke za %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Molimo ispravite duplicirane podatke za %(field)s, koji moraju biti " -"jedinstveni." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Molimo ispravite duplicirane podatke za %(field_name)s koji moraju biti " -"jedinstveni za %(lookup)s u %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Molimo ispravite duplicirane vrijednosti ispod." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Izaberite ispravnu opciju. Ta opcija nije jedna od dostupnih opcija." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Isprazni" - -msgid "Currently" -msgstr "Trenutno" - -msgid "Change" -msgstr "Promijeni" - -msgid "Unknown" -msgstr "Nepoznat pojam" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "da,ne,možda" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d byte-a" -msgstr[2] "%(size)d byte-a" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "popodne" - -msgid "a.m." -msgstr "ujutro" - -msgid "PM" -msgstr "popodne" - -msgid "AM" -msgstr "ujutro" - -msgid "midnight" -msgstr "ponoć" - -msgid "noon" -msgstr "podne" - -msgid "Monday" -msgstr "Ponedjeljak" - -msgid "Tuesday" -msgstr "Utorak" - -msgid "Wednesday" -msgstr "Srijeda" - -msgid "Thursday" -msgstr "Četvrtak" - -msgid "Friday" -msgstr "Petak" - -msgid "Saturday" -msgstr "Subota" - -msgid "Sunday" -msgstr "Nedjelja" - -msgid "Mon" -msgstr "Pon" - -msgid "Tue" -msgstr "Uto" - -msgid "Wed" -msgstr "Sri" - -msgid "Thu" -msgstr "Čet" - -msgid "Fri" -msgstr "Pet" - -msgid "Sat" -msgstr "Sub" - -msgid "Sun" -msgstr "Ned" - -msgid "January" -msgstr "Siječanj" - -msgid "February" -msgstr "Veljača" - -msgid "March" -msgstr "Ožujak" - -msgid "April" -msgstr "Travanj" - -msgid "May" -msgstr "Svibanj" - -msgid "June" -msgstr "Lipanj" - -msgid "July" -msgstr "Srpanj" - -msgid "August" -msgstr "Kolovoz" - -msgid "September" -msgstr "Rujan" - -msgid "October" -msgstr "Listopad" - -msgid "November" -msgstr "Studeni" - -msgid "December" -msgstr "Prosinac" - -msgid "jan" -msgstr "sij." - -msgid "feb" -msgstr "velj." - -msgid "mar" -msgstr "ožu." - -msgid "apr" -msgstr "tra." - -msgid "may" -msgstr "svi." - -msgid "jun" -msgstr "lip." - -msgid "jul" -msgstr "srp." - -msgid "aug" -msgstr "kol." - -msgid "sep" -msgstr "ruj." - -msgid "oct" -msgstr "lis." - -msgid "nov" -msgstr "stu." - -msgid "dec" -msgstr "pro." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Sij." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Velj." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Ožu." - -msgctxt "abbrev. month" -msgid "April" -msgstr "Tra." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Svi." - -msgctxt "abbrev. month" -msgid "June" -msgstr "Lip." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Srp." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Kol." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Ruj." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Lis." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Stu." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Pro." - -msgctxt "alt. month" -msgid "January" -msgstr "siječnja" - -msgctxt "alt. month" -msgid "February" -msgstr "veljače" - -msgctxt "alt. month" -msgid "March" -msgstr "ožujka" - -msgctxt "alt. month" -msgid "April" -msgstr "travnja" - -msgctxt "alt. month" -msgid "May" -msgstr "svibnja" - -msgctxt "alt. month" -msgid "June" -msgstr "lipnja" - -msgctxt "alt. month" -msgid "July" -msgstr "srpnja" - -msgctxt "alt. month" -msgid "August" -msgstr "kolovoza" - -msgctxt "alt. month" -msgid "September" -msgstr "rujna" - -msgctxt "alt. month" -msgid "October" -msgstr "listopada" - -msgctxt "alt. month" -msgid "November" -msgstr "studenoga" - -msgctxt "alt. month" -msgid "December" -msgstr "prosinca" - -msgid "This is not a valid IPv6 address." -msgstr "To nije ispravna IPv6 adresa." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ili" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d godina" -msgstr[1] "%d godina" -msgstr[2] "%d godina" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mjesec" -msgstr[1] "%d mjeseci" -msgstr[2] "%d mjeseci" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d tjedan" -msgstr[1] "%d tjedna" -msgstr[2] "%d tjedana" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dana" -msgstr[1] "%d dana" -msgstr[2] "%d dana" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d sat" -msgstr[1] "%d sati" -msgstr[2] "%d sati" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minutu" -msgstr[1] "%d minute" -msgstr[2] "%d minuta" - -msgid "0 minutes" -msgstr "0 minuta" - -msgid "Forbidden" -msgstr "Zabranjeno" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF verifikacija nije uspjela. Zahtjev je prekinut." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Ova poruka vam se prikazuje jer stranica na kojoj se nalazite zahtjeva CSRF " -"kolačić prilikom slanja forme. Navedeni kolačić je obavezan iz sigurnosnih " -"razloga, kako bi se osiguralo da vaš internetski preglednik ne bude otet od " -"strane trećih osoba." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Dodatne informacije su dostupne sa postavkom DEBUG=True." - -msgid "No year specified" -msgstr "Nije navedena godina" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Nije naveden mjesec" - -msgid "No day specified" -msgstr "Nije naveden dan" - -msgid "No week specified" -msgstr "Tjedan nije određen" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nije dostupno: %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s nije dostupno jer je %(class_name)s.allow_future " -"False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "%(verbose_name)s - pretragom nisu pronađeni rezultati za upit" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nevažeća stranica (%(page_number)s):%(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Sadržaji direktorija ovdje nisu dozvoljeni." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Sadržaj direktorija %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hr/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/hr/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hr/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/hr/formats.py deleted file mode 100644 index a2dc457..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/hr/formats.py +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. E Y." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. E Y. H:i" -YEAR_MONTH_FORMAT = "F Y." -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.m.Y." -SHORT_DATETIME_FORMAT = "j.m.Y. H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d.%m.%Y.", # '25.10.2006.' - "%d.%m.%y.", # '25.10.06.' - "%d. %m. %Y.", # '25. 10. 2006.' - "%d. %m. %y.", # '25. 10. 06.' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y. %H:%M:%S", # '25.10.2006. 14:30:59' - "%d.%m.%Y. %H:%M:%S.%f", # '25.10.2006. 14:30:59.000200' - "%d.%m.%Y. %H:%M", # '25.10.2006. 14:30' - "%d.%m.%y. %H:%M:%S", # '25.10.06. 14:30:59' - "%d.%m.%y. %H:%M:%S.%f", # '25.10.06. 14:30:59.000200' - "%d.%m.%y. %H:%M", # '25.10.06. 14:30' - "%d. %m. %Y. %H:%M:%S", # '25. 10. 2006. 14:30:59' - "%d. %m. %Y. %H:%M:%S.%f", # '25. 10. 2006. 14:30:59.000200' - "%d. %m. %Y. %H:%M", # '25. 10. 2006. 14:30' - "%d. %m. %y. %H:%M:%S", # '25. 10. 06. 14:30:59' - "%d. %m. %y. %H:%M:%S.%f", # '25. 10. 06. 14:30:59.000200' - "%d. %m. %y. %H:%M", # '25. 10. 06. 14:30' -] - -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index b4738a0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index 5766e31..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,1384 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016-2025\n" -"Language-Team: Upper Sorbian (http://app.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "Afrikaans" -msgstr "Afrikaanšćina" - -msgid "Arabic" -msgstr "Arabšćina" - -msgid "Algerian Arabic" -msgstr "Algeriska arabšćina" - -msgid "Asturian" -msgstr "Asturišćina" - -msgid "Azerbaijani" -msgstr "Azerbajdźanšćina" - -msgid "Bulgarian" -msgstr "Bołharšćina" - -msgid "Belarusian" -msgstr "Běłorušćina" - -msgid "Bengali" -msgstr "Bengalšćina" - -msgid "Breton" -msgstr "Bretonšćina" - -msgid "Bosnian" -msgstr "Bosnišćina" - -msgid "Catalan" -msgstr "Katalanšćina" - -msgid "Central Kurdish (Sorani)" -msgstr "Centralna kurdišćina (Sorani)" - -msgid "Czech" -msgstr "Čěšćina" - -msgid "Welsh" -msgstr "Walizišćina" - -msgid "Danish" -msgstr "Danšćina" - -msgid "German" -msgstr "Němčina" - -msgid "Lower Sorbian" -msgstr "Delnjoserbšćina" - -msgid "Greek" -msgstr "Grjekšćina" - -msgid "English" -msgstr "Jendźelšćina" - -msgid "Australian English" -msgstr "Awstralska jendźelšćina" - -msgid "British English" -msgstr "Britiska jendźelšćina" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Španišćina" - -msgid "Argentinian Spanish" -msgstr "Argentinska španišćina" - -msgid "Colombian Spanish" -msgstr "Kolumbiska španišćina" - -msgid "Mexican Spanish" -msgstr "Mexiska španišćina" - -msgid "Nicaraguan Spanish" -msgstr "Nikaraguaska španišćina" - -msgid "Venezuelan Spanish" -msgstr "Venezuelska španišćina" - -msgid "Estonian" -msgstr "Estišćina" - -msgid "Basque" -msgstr "Baskišćina" - -msgid "Persian" -msgstr "Persišćina" - -msgid "Finnish" -msgstr "Finšćina" - -msgid "French" -msgstr "Francošćina" - -msgid "Frisian" -msgstr "Frizišćina" - -msgid "Irish" -msgstr "Irišćina" - -msgid "Scottish Gaelic" -msgstr "Šotiska gaelšćina" - -msgid "Galician" -msgstr "Galicišćina" - -msgid "Hebrew" -msgstr "Hebrejšćina" - -msgid "Hindi" -msgstr "Hindišćina" - -msgid "Croatian" -msgstr "Chorwatšćina" - -msgid "Upper Sorbian" -msgstr "Hornjoserbšćina" - -msgid "Hungarian" -msgstr "Madźaršćina" - -msgid "Armenian" -msgstr "Armenšćina" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezišćina" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandšćina" - -msgid "Italian" -msgstr "Italšćina" - -msgid "Japanese" -msgstr "Japanšćina" - -msgid "Georgian" -msgstr "Georgišćina" - -msgid "Kabyle" -msgstr "Kabylšćina" - -msgid "Kazakh" -msgstr "Kazachšćina" - -msgid "Khmer" -msgstr "Khmeršćina" - -msgid "Kannada" -msgstr "Kannadšćina" - -msgid "Korean" -msgstr "Korejšćina" - -msgid "Kyrgyz" -msgstr "Kirgišćina" - -msgid "Luxembourgish" -msgstr "Luxemburgšćina" - -msgid "Lithuanian" -msgstr "Litawšćina" - -msgid "Latvian" -msgstr "Letišćina" - -msgid "Macedonian" -msgstr "Makedonšćina" - -msgid "Malayalam" -msgstr "Malajalam" - -msgid "Mongolian" -msgstr "Mongolšćina" - -msgid "Marathi" -msgstr "Marathišćina" - -msgid "Malay" -msgstr "Malajšćina" - -msgid "Burmese" -msgstr "Myanmaršćina" - -msgid "Norwegian Bokmål" -msgstr "Norwegski bokmål" - -msgid "Nepali" -msgstr "Nepalšćina" - -msgid "Dutch" -msgstr "Nižozemšćina" - -msgid "Norwegian Nynorsk" -msgstr "Norwegski nynorsk" - -msgid "Ossetic" -msgstr "Osetšćina" - -msgid "Punjabi" -msgstr "Pundźabišćina" - -msgid "Polish" -msgstr "Pólšćina" - -msgid "Portuguese" -msgstr "Portugalšćina" - -msgid "Brazilian Portuguese" -msgstr "Brazilska portugalšćina" - -msgid "Romanian" -msgstr "Rumunšćina" - -msgid "Russian" -msgstr "Rušćina" - -msgid "Slovak" -msgstr "Słowakšćina" - -msgid "Slovenian" -msgstr "Słowjenšćina" - -msgid "Albanian" -msgstr "Albanšćina" - -msgid "Serbian" -msgstr "Serbišćina" - -msgid "Serbian Latin" -msgstr "Serbšćina, łaćonska" - -msgid "Swedish" -msgstr "Šwedšćina" - -msgid "Swahili" -msgstr "Suahelšćina" - -msgid "Tamil" -msgstr "Tamilšćina" - -msgid "Telugu" -msgstr "Telugušćina" - -msgid "Tajik" -msgstr "Tadźikišćina" - -msgid "Thai" -msgstr "Thaišćina" - -msgid "Turkmen" -msgstr "Turkmenšćina" - -msgid "Turkish" -msgstr "Turkowšćina" - -msgid "Tatar" -msgstr "Tataršćina" - -msgid "Udmurt" -msgstr "Udmurtšćina" - -msgid "Uyghur" -msgstr "Ujguršćina" - -msgid "Ukrainian" -msgstr "Ukrainšćina" - -msgid "Urdu" -msgstr "Urdušćina" - -msgid "Uzbek" -msgstr "Uzbekšćina" - -msgid "Vietnamese" -msgstr "Vietnamšćina" - -msgid "Simplified Chinese" -msgstr "Zjednorjene chinšćina" - -msgid "Traditional Chinese" -msgstr "Tradicionalna chinšćina" - -msgid "Messages" -msgstr "Powěsće" - -msgid "Site Maps" -msgstr "Přehlady sydła" - -msgid "Static Files" -msgstr "Statiske dataje" - -msgid "Syndication" -msgstr "Syndikacija" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Tute čisko strony cyła ličba njeje." - -msgid "That page number is less than 1" -msgstr "Tute čisło strony je mjeńše hač 1." - -msgid "That page contains no results" -msgstr "Tuta strona wuslědki njewobsahuje" - -msgid "Enter a valid value." -msgstr "Zapodajće płaćiwu hódnotu." - -msgid "Enter a valid domain name." -msgstr "Zapodajće płaćiwe domenowe mjeno." - -msgid "Enter a valid URL." -msgstr "Zapodajće płaćiwy URL." - -msgid "Enter a valid integer." -msgstr "Zapodajće płaćiwu cyłu ličbu." - -msgid "Enter a valid email address." -msgstr "Zapodajće płaćiwu e-mejlowu adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Zapodajće płaćiwe adresowe mjeno, kotrež jenož pismiki, ličby, podsmužki abo " -"wjazawki wobsahuje." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Zapodajće płaćiwe „adresowe mjeno“, kotrež jenož pismiki, ličby, podsmužki " -"abo wjazawki wobsahuje." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Zapodajće płaćiwu %(protocol)s-adresu." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 abo IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Zapodajće jenož přez komy dźělene cyfry," - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Zawěsćće, zo tuta hódnota je %(limit_value)s (je %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Zawěsćće, zo hódnota je mjeńša hač abo runja %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Zawěsćće, zo tuta hódnota je wjetša hač abo runja %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Zawěsćće, zo tuta hódnota je množina kročeloweje wulkosće %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Zawěsćće, zo tuta hódnota je mnoho króć kročeloweje wulkosće " -"%(limit_value)s, započinajo z %(offset)s, na př. %(offset)s, " -"%(valid_value1)s, %(valid_value2)s a tak dale." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zawěsćće, zo tuta hódnota ma znajmjeńša %(limit_value)d znamješko (ma " -"%(show_value)d)." -msgstr[1] "" -"Zawěsćće, zo tuta hódnota ma znajmjeńša %(limit_value)d znamješce (ma " -"%(show_value)d)." -msgstr[2] "" -"Zawěsćće, zo tuta hódnota ma znajmjeńša %(limit_value)d znamješka (ma " -"%(show_value)d)." -msgstr[3] "" -"Zawěsćće, zo tuta hódnota ma znajmjeńša %(limit_value)d znamješkow (ma " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zawěsćće, zo tuta hódnota ma maksimalnje %(limit_value)d znamješko (ima " -"%(show_value)d)." -msgstr[1] "" -"Zawěsćće, zo tuta hódnota ma maksimalnje %(limit_value)d znamješce (ima " -"%(show_value)d)." -msgstr[2] "" -"Zawěsćće, zo tuta hódnota ma maksimalnje %(limit_value)d znamješka (ima " -"%(show_value)d)." -msgstr[3] "" -"Zawěsćće, zo tuta hódnota ma maksimalnje %(limit_value)d znamješkow (ima " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Zapodajće ličbu." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Zawěsćće, zo njeje wjace hač %(max)s cyfry dohromady." -msgstr[1] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow dohromady." -msgstr[2] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow dohromady." -msgstr[3] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow dohromady." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Zawěsćće, zo njeje wjace hač %(max)s decimalneho městna." -msgstr[1] "Zawěsćće, zo njeje wjace hač %(max)s decimalneju městnow." -msgstr[2] "Zawěsćće, zo njeje wjace hač %(max)s decimalnych městnow." -msgstr[3] "Zawěsćće, zo njeje wjace hač %(max)s decimalnych městnow." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Zawěsćće, zo njeje wjace hač %(max)s cyfry před decimalnej komu." -msgstr[1] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow před decimalnej komu." -msgstr[2] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow před decimalnej komu." -msgstr[3] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow před decimalnej komu." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Datajowy sufiks ' %(extension)s' dowoleny njeje. Dowolene sufiksy su: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Prózdne znamješka dowolene njejsu." - -msgid "and" -msgstr "a" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s z tutym %(field_labels)s hižo eksistuje." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Wobmjezowanje \"%(name)s\" je překročene." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Hódnota %(value)r płaćiwa wólba njeje." - -msgid "This field cannot be null." -msgstr "Tute polo njesmě nul być." - -msgid "This field cannot be blank." -msgstr "Tute polo njesmě prózdne być." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s z tutym %(field_label)s hižo eksistuje." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s dyrbi za %(date_field_label)s %(lookup_type)s jónkróćne być." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Polo typa: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Hódnota „%(value)s“ dyrbi pak True pak False być." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Hódnota „%(value)s“ dyrbi pak True, False pak None być." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (pak True pak False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Znamješkowy rjećazk (hač %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Znamješkowy rjećazk (njewobmjezowany)" - -msgid "Comma-separated integers" -msgstr "Cyłe ličby dźělene přez komu" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Hódnota „%(value)s“ ma njepłaćiwy datumowy format. Dyrbi we formaće DD.MM." -"YYYY być." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Hódnota „%(value)s“ ma korektny format (DD.MM.YYYY), ale je njepłaćiwy datum." - -msgid "Date (without time)" -msgstr "Datum (bjez časa)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Hódnota „%(value)s“ ma njepłaćiwy format. Dyrbi we formaće DD.MM.YYYY HH:MM[:" -"ss[.uuuuuu]][TZ] być." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Hódnota „%(value)s“ ma korektny format (DD.MM.YYYY HH:MM[:ss[.uuuuuu]][TZ]), " -"ale je njepłaćiwy datum/čas." - -msgid "Date (with time)" -msgstr "Datum (z časom)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Hódnota „%(value)s“ dyrbi decimalna ličba być." - -msgid "Decimal number" -msgstr "Decimalna ličba" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Hódnota „%(value)s“ ma njepłaćiwy format. Dyrbi w formaće [DD] [HH:[MM:]]ss[." -"uuuuuu] być." - -msgid "Duration" -msgstr "Traće" - -msgid "Email address" -msgstr "E-mejlowa adresa" - -msgid "File path" -msgstr "Datajowa šćežka" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Hódnota „%(value)s“ dyrbi decimalna ličba być." - -msgid "Floating point number" -msgstr "Komowa ličba typa float" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Hódnota „%(value)s“ dyrbi integer być." - -msgid "Integer" -msgstr "Integer" - -msgid "Big (8 byte) integer" -msgstr "Big (8 byte) integer" - -msgid "Small integer" -msgstr "Mała cyła ličba" - -msgid "IPv4 address" -msgstr "IPv4-adresa" - -msgid "IP address" -msgstr "IP-adresa" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Hódnota „%(value)s“ dyrbi pak None, True pak False być." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (pak True, False pak None)" - -msgid "Positive big integer" -msgstr "Pozitiwna wulka cyła ličba" - -msgid "Positive integer" -msgstr "Pozitiwna cyła ličba" - -msgid "Positive small integer" -msgstr "Pozitiwna mała cyła ličba" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Adresowe mjeno (hač %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Hódnota „%(value)s“ ma njepłaćiwy format. Dyrbi we formaće HH:MM[:ss[." -"uuuuuu]] być." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Hódnota „%(value)s“ ma korektny format (HH:MM[:ss[.uuuuuu]]), ale je " -"njepłaćiwy čas." - -msgid "Time" -msgstr "Čas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Hrube binarne daty" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "„%(value)s“ płaćiwy UUID njeje." - -msgid "Universally unique identifier" -msgstr "Uniwerselnje jónkróćny identifikator" - -msgid "File" -msgstr "Dataja" - -msgid "Image" -msgstr "Wobraz" - -msgid "A JSON object" -msgstr "JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Hódnota dyrbi płaćiwy JSON być." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "Instanca %(model)s z %(field)s %(value)r płaćiwa wólba njeje." - -msgid "Foreign Key (type determined by related field)" -msgstr "Cuzy kluč (typ so přez wotpowědne polo postaja)" - -msgid "One-to-one relationship" -msgstr "Poćah jedyn jedyn" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Poćah %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Poćahi %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Poćah wjele wjele" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Tute polo je trěbne." - -msgid "Enter a whole number." -msgstr "Zapodajće cyłu ličbu." - -msgid "Enter a valid date." -msgstr "Zapodajće płaćiwy datum." - -msgid "Enter a valid time." -msgstr "Zapodajće płaćiwy čas." - -msgid "Enter a valid date/time." -msgstr "Zapodajće płaćiwy datum/čas." - -msgid "Enter a valid duration." -msgstr "Zapodajće płaćiwe traće." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Ličba dnjow dyrbi mjez {min_days} a {max_days} być." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Žana dataja je so pósłała. Přepruwujće kodowanski typ we formularje." - -msgid "No file was submitted." -msgstr "Žana dataja je so pósłała." - -msgid "The submitted file is empty." -msgstr "Pósłana dataja je prózdna." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Zawěsćće, zo tute datajowe mjeno ma maksimalnje %(max)d znamješko (ma " -"%(length)d)." -msgstr[1] "" -"Zawěsćće, zo tute datajowe mjeno ma maksimalnje %(max)d znamješce (ma " -"%(length)d)." -msgstr[2] "" -"Zawěsćće, zo tute datajowe mjeno ma maksimalnje %(max)d znamješka (ma " -"%(length)d)." -msgstr[3] "" -"Zawěsćće, zo tute datajowe mjeno ma maksimalnje %(max)d znamješkow (ma " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Prošu zapodajće dataju abo stajće hóčku do kontrolneho kašćika, nic wobě." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Nahrajće płaćiwy wobraz. Dataja, kotruž sće nahrał, pak njebě wobraz pak bě " -"wobškodźeny wobraz. " - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Wubjerće płaćiwu wolensku móžnosć. %(value)s žana k dispoziciji stejacych " -"wolenskich móžnosćow njeje. " - -msgid "Enter a list of values." -msgstr "Zapodajće lisćinu hódnotow." - -msgid "Enter a complete value." -msgstr "Zapodajće dospołnu hódnotu." - -msgid "Enter a valid UUID." -msgstr "Zapodajće płaćiwy UUID." - -msgid "Enter a valid JSON." -msgstr "Zapodajće płaćiwy JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Schowane polo field %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Daty ManagementForm faluja abo su skepsane. Falowace pola: %(field_names)s. " -"Móžeće zmylkowu rozprawu spisać, jeli problem dale eksistuje." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Prošu wotposćelće maksimalnje %(num)d formular." -msgstr[1] "Prošu wotposćelće maksimalnje %(num)d formularaj." -msgstr[2] "Prošu wotposćelće maksimalnje %(num)d formulary." -msgstr[3] "Prošu wotposćelće maksimalnje %(num)d formularow." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Prošu zapodajće znajmjeńša %(num)d formu." -msgstr[1] "Prošu zapodajće znajmjeńša %(num)d formje." -msgstr[2] "Prošu zapodajće znajmjeńša %(num)d formy." -msgstr[3] "Prošu zapodajće znajmjeńša %(num)d formow." - -msgid "Order" -msgstr "Porjad" - -msgid "Delete" -msgstr "Zhašeć" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Prošu porjedźće dwójne daty za %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Prošu porjedźće dwójne daty za %(field)s, kotrež dyrbja jónkróćne być." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Prošu porjedźće dwójne daty za %(field_name)s, kotrež dyrbja za %(lookup)s w " -"%(date_field)s jónkróćne być." - -msgid "Please correct the duplicate values below." -msgstr "Prošu porjedźće slědowace dwójne hódnoty." - -msgid "The inline value did not match the parent instance." -msgstr "Hódnota inline nadrjadowanej instancy njewotpowěduje." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Wubjerće płaćiwu wolensku móžnosć. Tuta wolenska móžnosć jedna z k " -"dispoziciji stejacych wolenskich móžnosćow njeje." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" płaćiwa hódnota njeje." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s njeda so w časowym pasmje %(current_timezone)s interpretować; " -"je snano dwuzmyslny abo njeeksistuje." - -msgid "Clear" -msgstr "Zhašeć" - -msgid "Currently" -msgstr "Tuchwilu" - -msgid "Change" -msgstr "Změnić" - -msgid "Unknown" -msgstr "Njeznaty" - -msgid "Yes" -msgstr "Haj" - -msgid "No" -msgstr "Ně" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "haj,ně,snano" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajtaj" -msgstr[2] "%(size)d bajty" -msgstr[3] "%(size)d bajtow" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "popołdnju" - -msgid "a.m." -msgstr "dopołdnja" - -msgid "PM" -msgstr "popołdnju" - -msgid "AM" -msgstr "dopołdnja" - -msgid "midnight" -msgstr "połnoc" - -msgid "noon" -msgstr "připołdnjo" - -msgid "Monday" -msgstr "Póndźela" - -msgid "Tuesday" -msgstr "Wutora" - -msgid "Wednesday" -msgstr "Srjeda" - -msgid "Thursday" -msgstr "Štwórtk" - -msgid "Friday" -msgstr "Pjatk" - -msgid "Saturday" -msgstr "Sobota" - -msgid "Sunday" -msgstr "Njedźela" - -msgid "Mon" -msgstr "Pón" - -msgid "Tue" -msgstr "Wut" - -msgid "Wed" -msgstr "Srj" - -msgid "Thu" -msgstr "Štw" - -msgid "Fri" -msgstr "Pja" - -msgid "Sat" -msgstr "Sob" - -msgid "Sun" -msgstr "Nje" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Měrc" - -msgid "April" -msgstr "Apryl" - -msgid "May" -msgstr "Meja" - -msgid "June" -msgstr "Junij" - -msgid "July" -msgstr "Julij" - -msgid "August" -msgstr "Awgust" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "Nowember" - -msgid "December" -msgstr "December" - -msgid "jan" -msgstr "jan." - -msgid "feb" -msgstr "feb." - -msgid "mar" -msgstr "měr." - -msgid "apr" -msgstr "apr." - -msgid "may" -msgstr "mej." - -msgid "jun" -msgstr "jun." - -msgid "jul" -msgstr "jul." - -msgid "aug" -msgstr "awg." - -msgid "sep" -msgstr "sep." - -msgid "oct" -msgstr "okt." - -msgid "nov" -msgstr "now." - -msgid "dec" -msgstr "dec." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Měrc" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Apryl" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Meja" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junij" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julij" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Awg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Now." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "Měrc" - -msgctxt "alt. month" -msgid "April" -msgstr "Apryl" - -msgctxt "alt. month" -msgid "May" -msgstr "Meja" - -msgctxt "alt. month" -msgid "June" -msgstr "Junij" - -msgctxt "alt. month" -msgid "July" -msgstr "Julij" - -msgctxt "alt. month" -msgid "August" -msgstr "Awgust" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "Nowember" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "To płaćiwa IPv6-adresa njeje." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "abo" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d lěto" -msgstr[1] "%(num)dlěće" -msgstr[2] "%(num)d lěta" -msgstr[3] "%(num)d lět" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d měsac" -msgstr[1] "%(num)d měsacaj" -msgstr[2] "%(num)d měsacy" -msgstr[3] "%(num)d měsacow" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tydźeń" -msgstr[1] "%(num)d njedźeli" -msgstr[2] "%(num)d njedźele" -msgstr[3] "%(num)d njedźel" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dźeń" -msgstr[1] "%(num)d dnjej" -msgstr[2] "%(num)d dny" -msgstr[3] "%(num)d dnjow" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodźina" -msgstr[1] "%(num)d hodźinje" -msgstr[2] "%(num)d hodźiny" -msgstr[3] "%(num)d hodźin" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d mjeńšina" -msgstr[1] "%(num)d mjeńšinje" -msgstr[2] "%(num)d mjeńšiny" -msgstr[3] "%(num)d mjeńšin" - -msgid "Forbidden" -msgstr "Zakazany" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-přepruwowanje je so nimokuliło. Naprašowanje je so přetorhnyło." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Widźiće tutu zdźělenku, dokelž tute HTTPS-sydło \"Referer header\" trjeba, " -"kotryž so ma na waš webwobhladowak pósłać, ale žadyn njeje so pósłał. Tutón " -"header je z wěstotnych přičinow trěbny, zo by so zawěsćiło, zo waš " -"wobhladowak so wot třećich njekapruje." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Jei sće swój wobhladowak tak konfigurował, zo su hłowy „Referer“ " -"znjemóžnjene, zmóžńće je, znajmjeńša za tute sydło abo za HTTPS-zwiski abo " -"za naprašowanja „sameorigin“." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Jeli značku wužiwaće abo hłowu „Referrer-Policy: no-referrer“ zapřijimaće, " -"wotstrońće je prošu. CSRF-škit trjeba hłowu „Referer“ , zo by striktnu " -"kontrolu referer přewjedźe. Jeli so wo priwatnosć staraće, wužiwajće " -"alternatiwy kaž za wotkazy k sydłam třećich." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Widźiće tutu zdźělenku, dokelž tute sydło CSRF-plack trjeba, hdyž so " -"formulary wotesyłaja. Tutón plack je z přičinow wěstoty trěbny, zo by so waš " -"wobhladowak wot třećich njekapruje." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Jeli sće swój wobhladowak tak konfigurował, zo su placki znjemóžnjene, " -"zmóžńće je zaso, znajmjeńša za tute sydło abo za naprašowanja „same-origin“." - -msgid "More information is available with DEBUG=True." -msgstr "Z DEBUG=True su dalše informacije k dispoziciji." - -msgid "No year specified" -msgstr "Žane lěto podate" - -msgid "Date out of range" -msgstr "Datum zwonka wobłuka" - -msgid "No month specified" -msgstr "Žadyn měsac podaty" - -msgid "No day specified" -msgstr "Žadyn dźeń podaty" - -msgid "No week specified" -msgstr "Žadyn tydźeń podaty" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Žadyn %(verbose_name_plural)s k dispoziciji njeje" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Přichodowe %(verbose_name_plural)s k dispoziciji njejsu, dokelž hódnota " -"%(class_name)s.allow_future je False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Njepłaćiwy „%(format)s“ za datumowy znamješkowy rjaćazk „%(datestr)s“ podaty" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Žane %(verbose_name)s namakane, kotrež naprašowanju wotpowěduje" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Strona „last“ njeje, ani njeda so do int konwertować." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Njepłaćiwa strona (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Prózdna lisćina a „%(class_name)s.allow_empty“ je False." - -msgid "Directory indexes are not allowed here." -msgstr "Zapisowe indeksy tu dowolone njejsu." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ njeeksistuje" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacija bě wuspěšna! Zbožopřeće!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Čitajće wersijowe informacije za Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Widźiće tutu stronu, dokelž DEBUG=True je we wašej dataji nastajenjow a njejsće URL " -"skonfigurował." - -msgid "Django Documentation" -msgstr "Dokumentacija Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temy, referency a nawody" - -msgid "Tutorial: A Polling App" -msgstr "Nawod: Naprašowanske nałoženje" - -msgid "Get started with Django" -msgstr "Prěnje kroki z Django" - -msgid "Django Community" -msgstr "Zhromadźenstwo Django" - -msgid "Connect, get help, or contribute" -msgstr "Zwjazać, pomoc wobstarać abo přinošować" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index 1cb8408..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index 15ab931..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,1365 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Akos Zsolt Hochrein , 2018 -# András Veres-Szentkirályi, 2016-2021,2023 -# Attila Nagy <>, 2012 -# Balázs Meskó , 2024 -# Balázs R, 2023,2025 -# Dóra Szendrei , 2017 -# Istvan Farkas , 2019 -# Jannis Leidel , 2011 -# János R, 2011-2012,2014 -# János R, 2022 -# Máté Őry , 2013 -# Szilveszter Farkas , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Balázs R, 2023,2025\n" -"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arab" - -msgid "Algerian Arabic" -msgstr "algériai arab" - -msgid "Asturian" -msgstr "Asztúriai" - -msgid "Azerbaijani" -msgstr "azerbajdzsáni" - -msgid "Bulgarian" -msgstr "Bolgár" - -msgid "Belarusian" -msgstr "Belarusz" - -msgid "Bengali" -msgstr "Bengáli" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosnyák" - -msgid "Catalan" -msgstr "Katalán" - -msgid "Central Kurdish (Sorani)" -msgstr "Közép-kurd (szoráni)" - -msgid "Czech" -msgstr "Cseh" - -msgid "Welsh" -msgstr "Walesi" - -msgid "Danish" -msgstr "Dán" - -msgid "German" -msgstr "Német" - -msgid "Lower Sorbian" -msgstr "Alsószorb" - -msgid "Greek" -msgstr "Görög" - -msgid "English" -msgstr "Angol" - -msgid "Australian English" -msgstr "Ausztráliai angol" - -msgid "British English" -msgstr "Brit angol" - -msgid "Esperanto" -msgstr "Eszperantó" - -msgid "Spanish" -msgstr "Spanyol" - -msgid "Argentinian Spanish" -msgstr "Argentin spanyol" - -msgid "Colombian Spanish" -msgstr "Kolumbiai spanyol" - -msgid "Mexican Spanish" -msgstr "Mexikói spanyol" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguai spanyol" - -msgid "Venezuelan Spanish" -msgstr "Venezuelai spanyol" - -msgid "Estonian" -msgstr "Észt" - -msgid "Basque" -msgstr "Baszk " - -msgid "Persian" -msgstr "Perzsa" - -msgid "Finnish" -msgstr "Finn" - -msgid "French" -msgstr "Francia" - -msgid "Frisian" -msgstr "Fríz" - -msgid "Irish" -msgstr "Ír" - -msgid "Scottish Gaelic" -msgstr "Skót gael" - -msgid "Galician" -msgstr "Gall" - -msgid "Hebrew" -msgstr "Héber" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Horvát" - -msgid "Upper Sorbian" -msgstr "Felsőszorb" - -msgid "Hungarian" -msgstr "Magyar" - -msgid "Armenian" -msgstr "Örmény" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonéz" - -msgid "Igbo" -msgstr "igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Izlandi" - -msgid "Italian" -msgstr "Olasz" - -msgid "Japanese" -msgstr "Japán" - -msgid "Georgian" -msgstr "Grúz" - -msgid "Kabyle" -msgstr "Kabil" - -msgid "Kazakh" -msgstr "Kazak" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreai" - -msgid "Kyrgyz" -msgstr "kirgiz" - -msgid "Luxembourgish" -msgstr "Luxemburgi" - -msgid "Lithuanian" -msgstr "Litván" - -msgid "Latvian" -msgstr "Lett" - -msgid "Macedonian" -msgstr "Macedón" - -msgid "Malayalam" -msgstr "Malajálam" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Maráthi" - -msgid "Malay" -msgstr "Maláj" - -msgid "Burmese" -msgstr "Burmai" - -msgid "Norwegian Bokmål" -msgstr "Bokmål norvég" - -msgid "Nepali" -msgstr "Nepáli" - -msgid "Dutch" -msgstr "Holland" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk norvég" - -msgid "Ossetic" -msgstr "Oszét" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Lengyel" - -msgid "Portuguese" -msgstr "Portugál" - -msgid "Brazilian Portuguese" -msgstr "Brazíliai portugál" - -msgid "Romanian" -msgstr "Román" - -msgid "Russian" -msgstr "Orosz" - -msgid "Slovak" -msgstr "Szlovák" - -msgid "Slovenian" -msgstr "Szlovén" - -msgid "Albanian" -msgstr "Albán" - -msgid "Serbian" -msgstr "Szerb" - -msgid "Serbian Latin" -msgstr "Latin betűs szerb" - -msgid "Swedish" -msgstr "Svéd" - -msgid "Swahili" -msgstr "Szuahéli" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tádzsik" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Türkmén" - -msgid "Turkish" -msgstr "Török" - -msgid "Tatar" -msgstr "Tatár" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Ujgur" - -msgid "Ukrainian" -msgstr "Ukrán" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "Üzbég" - -msgid "Vietnamese" -msgstr "Vietnámi" - -msgid "Simplified Chinese" -msgstr "Egyszerű kínai" - -msgid "Traditional Chinese" -msgstr "Hagyományos kínai" - -msgid "Messages" -msgstr "Üzenetek" - -msgid "Site Maps" -msgstr "Oldaltérképek" - -msgid "Static Files" -msgstr "Statikus fájlok" - -msgid "Syndication" -msgstr "Szindikáció" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Az oldalszám nem egész szám." - -msgid "That page number is less than 1" -msgstr "Az oldalszám kisebb, mint 1" - -msgid "That page contains no results" -msgstr "Az oldal nem tartalmaz találatokat" - -msgid "Enter a valid value." -msgstr "Adjon meg egy érvényes értéket." - -msgid "Enter a valid domain name." -msgstr "Adjon meg egy érvényes domain nevet." - -msgid "Enter a valid URL." -msgstr "Adjon meg egy érvényes URL-t." - -msgid "Enter a valid integer." -msgstr "Adjon meg egy érvényes számot." - -msgid "Enter a valid email address." -msgstr "Írjon be egy érvényes e-mail címet." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Kérjük adjon meg egy érvényes \"domain-darabkát\", amely csak ékezet nélküli " -"betűkből, számokból, aláhúzásból és kötőjelből áll." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Kérjük adjon meg egy érvényes \"domain-darabkát\", amely csak betűkből, " -"számokból, aláhúzásból és kötőjelből áll." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Adjon meg egy érvényes %(protocol)s címet." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 vagy IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Csak számokat adjon meg, vesszővel elválasztva." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Bizonyosodjon meg arról, hogy az érték %(limit_value)s (jelenleg: " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Bizonyosodjon meg arról, hogy az érték %(limit_value)s, vagy kisebb." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Bizonyosodjon meg arról, hogy az érték %(limit_value)s, vagy nagyobb." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Bizonyosodjon meg arról, hogy az érték %(limit_value)s többszöröse." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Az érték %(limit_value)s többszörösével kell hogy eltérjen %(offset)s-hoz " -"képest, pl. %(offset)s, %(valid_value1)s, %(valid_value2)s, és így tovább. " - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bizonyosodjon meg arról, hogy ez az érték legalább %(limit_value)d karaktert " -"tartalmaz (jelenlegi hossza: %(show_value)d)." -msgstr[1] "" -"Bizonyosodjon meg arról, hogy ez az érték legalább %(limit_value)d karaktert " -"tartalmaz (jelenlegi hossza: %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bizonyosodjon meg arról, hogy ez az érték legfeljebb %(limit_value)d " -"karaktert tartalmaz (jelenlegi hossza: %(show_value)d)." -msgstr[1] "" -"Bizonyosodjon meg arról, hogy ez az érték legfeljebb %(limit_value)d " -"karaktert tartalmaz (jelenlegi hossza: %(show_value)d)." - -msgid "Enter a number." -msgstr "Adj meg egy számot." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Bizonyosodjon meg arról, hogy legfeljebb %(max)s számjegyből áll." -msgstr[1] "Bizonyosodjon meg arról, hogy legfeljebb %(max)s számjegyből áll." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Bizonyosodjon meg arról, hogy legfeljebb %(max)s tizedesjegyből áll." -msgstr[1] "" -"Bizonyosodjon meg arról, hogy legfeljebb %(max)s tizedesjegyből áll." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Bizonyosodjon meg arról, hogy legfeljebb %(max)s számjegy van a " -"tizedesvessző előtt." -msgstr[1] "" -"Bizonyosodjon meg arról, hogy legfeljebb %(max)s számjegy van a " -"tizedesvessző előtt." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"A(z) \"%(extension)s\" kiterjesztés nincs engedélyezve. Az engedélyezett " -"fájltípusok: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null karakterek használata nem megengedett." - -msgid "and" -msgstr "és" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Már létezik %(model_name)s ilyennel: %(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "„%(name)s” megszorítás megsértve." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r érték érvénytelen." - -msgid "This field cannot be null." -msgstr "Ez a mező nem lehet nulla." - -msgid "This field cannot be blank." -msgstr "Ez a mező nem lehet üres." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Már létezik %(model_name)s ilyennel: %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s egyedi kell hogy legyen %(lookup_type)s alapján a(z) " -"%(date_field_label)s mezőn." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Mezőtípus: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "A(z) \"%(value)s\" értéke csak True vagy False lehet." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "A(z) \"%(value)s\" értéke csak True, False vagy üres lehet." - -msgid "Boolean (Either True or False)" -msgstr "Logikai (True vagy False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Karakterlánc (%(max_length)s hosszig)" - -msgid "String (unlimited)" -msgstr "Karakterlánc (korlátlan hosszúságú)" - -msgid "Comma-separated integers" -msgstr "Vesszővel elválasztott egészek" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"A(z) \"%(value)s\" érvénytelen dátumformátumot tartalmaz. A dátumnak ÉÉÉÉ-HH-" -"NN formában kell lennie." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"A(z) \"%(value)s\" értéke formára (ÉÉÉÉ-HH-NN) megfelel ugyan, de " -"érvénytelen dátumot tartalmaz." - -msgid "Date (without time)" -msgstr "Dátum (idő nélkül)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"A(z) \"%(value)s\" érvénytelen dátumformátumot tartalmaz. A dátumnak ÉÉÉÉ-HH-" -"NN ÓÓ:PP[:mm[.uuuuuu]][TZ] formában kell lennie." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"A(z) \"%(value)s\" értéke formára (ÉÉÉÉ-HH-NN ÓÓ:PP[:mm[:uuuuuu]][TZ]) " -"megfelel ugyan, de érvénytelen dátumot vagy időt tartalmaz." - -msgid "Date (with time)" -msgstr "Dátum (idővel)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "A(z) \"%(value)s\" értékének tizes számrendszerű számnak kell lennie." - -msgid "Decimal number" -msgstr "Tizes számrendszerű (decimális) szám" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"A(z) \"%(value)s\" érvénytelen idő formátumot tartalmaz. Az időnek ÓÓ:PP[:" -"mm[.uuuuuu]] formában kell lennie." - -msgid "Duration" -msgstr "Időtartam" - -msgid "Email address" -msgstr "E-mail cím" - -msgid "File path" -msgstr "Elérési út" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "A(z) \"%(value)s\" értékének lebegőpontos számnak kell lennie." - -msgid "Floating point number" -msgstr "Lebegőpontos szám" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "A(z) \"%(value)s\" értékének egész számnak kell lennie." - -msgid "Integer" -msgstr "Egész" - -msgid "Big (8 byte) integer" -msgstr "Nagy egész szám (8 bájtos)" - -msgid "Small integer" -msgstr "Kis egész" - -msgid "IPv4 address" -msgstr "IPv4 cím" - -msgid "IP address" -msgstr "IP cím" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Az \"%(value)s\" értéke csak üres, True, vagy False lehet." - -msgid "Boolean (Either True, False or None)" -msgstr "Logikai (True, False vagy None)" - -msgid "Positive big integer" -msgstr "Pozitív nagy egész" - -msgid "Positive integer" -msgstr "Pozitív egész" - -msgid "Positive small integer" -msgstr "Pozitív kis egész" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "URL-barát cím (%(max_length)s hosszig)" - -msgid "Text" -msgstr "Szöveg" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"A(z) \"%(value)s\" érvénytelen idő formátumot tartalmaz. Az időnek ÓÓ:PP[:" -"mm[.uuuuuu]] formában kell lennie." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"A(z) \"%(value)s\" értéke formára (ÓÓ:PP[:mm[:uuuuuu]][TZ]) megfelel ugyan, " -"de érvénytelen időt tartalmaz." - -msgid "Time" -msgstr "Idő" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Nyers bináris adat" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "A(z) \"%(value)s\" értéke nem érvényes UUID érték." - -msgid "Universally unique identifier" -msgstr "Univerzálisan egyedi azonosító" - -msgid "File" -msgstr "Fájl" - -msgid "Image" -msgstr "Kép" - -msgid "A JSON object" -msgstr "Egy JSON objektum" - -msgid "Value must be valid JSON." -msgstr "Az érték érvényes JSON kell legyen." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Idegen kulcs (típusa a kapcsolódó mezőtől függ)" - -msgid "One-to-one relationship" -msgstr "Egy-egy kapcsolat" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s kapcsolat" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s kapcsolatok" - -msgid "Many-to-many relationship" -msgstr "Több-több kapcsolat" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ennek a mezőnek a megadása kötelező." - -msgid "Enter a whole number." -msgstr "Adjon meg egy egész számot." - -msgid "Enter a valid date." -msgstr "Adjon meg egy érvényes dátumot." - -msgid "Enter a valid time." -msgstr "Adjon meg egy érvényes időt." - -msgid "Enter a valid date/time." -msgstr "Adjon meg egy érvényes dátumot/időt." - -msgid "Enter a valid duration." -msgstr "Adjon meg egy érvényes időtartamot." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "A napok számának {min_days} és {max_days} közé kell esnie." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nem küldött el fájlt. Ellenőrizze a kódolás típusát az űrlapon." - -msgid "No file was submitted." -msgstr "Semmilyen fájl sem került feltöltésre." - -msgid "The submitted file is empty." -msgstr "A küldött fájl üres." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Bizonyosodjon meg arról, hogy a fájlnév legfeljebb %(max)d karakterből áll " -"(jelenlegi hossza: %(length)d)." -msgstr[1] "" -"Bizonyosodjon meg arról, hogy a fájlnév legfeljebb %(max)d karakterből áll " -"(jelenlegi hossza: %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Küldjön egy új fájlt, vagy jelölje be a törlés négyzetet, de ne mindkettőt " -"egyszerre." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Töltsön fel egy érvényes képfájlt. A feltöltött fájl nem kép volt, vagy " -"megsérült." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Válasszon érvényes elemet. '%(value)s' nincs az elérhető lehetőségek között." - -msgid "Enter a list of values." -msgstr "Adja meg értékek egy listáját." - -msgid "Enter a complete value." -msgstr "Adjon meg egy teljes értéket." - -msgid "Enter a valid UUID." -msgstr "Adjon meg egy érvényes UUID-t." - -msgid "Enter a valid JSON." -msgstr "Adjon meg egy érvényes JSON-t." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Rejtett mező: %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm adatok hiányoznak vagy hamisításra kerültek. A hiányzó mezők: " -"%(field_names)s. Ha ez többször is előfordul, érdemes bejelenteni hibaként." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Legfeljebb %(num)d űrlapot küldjön be." -msgstr[1] "Legfeljebb %(num)d űrlapot küldjön be." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Legalább %(num)d űrlapot küldjön be." -msgstr[1] "Legalább %(num)d űrlapot küldjön be." - -msgid "Order" -msgstr "Sorrend" - -msgid "Delete" -msgstr "Törlés" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Javítsa a mezőhöz tartozó duplikált adatokat: %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Javítsa a mezőhöz tartozó duplikált adatokat: %(field)s (egyedinek kell " -"lenniük)." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Javítsa a mezőhöz tartozó duplikált adatokat: %(field_name)s (egyedinek kell " -"lenniük %(lookup)s alapján a dátum mezőn: %(date_field)s)." - -msgid "Please correct the duplicate values below." -msgstr "Javítsa az alábbi duplikált értékeket." - -msgid "The inline value did not match the parent instance." -msgstr "A beágyazott érték nem egyezik meg a szülő példányéval." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Válasszon érvényes elemet. Az Ön választása nincs az elérhető lehetőségek " -"között." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "Érvénytelen érték: \"%(pk)s\"" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"A(z) %(datetime)s nem értelmezhető a(z) %(current_timezone)s időzónában; " -"vagy bizonytalan, vagy nem létezik." - -msgid "Clear" -msgstr "Törlés" - -msgid "Currently" -msgstr "Jelenleg" - -msgid "Change" -msgstr "Módosítás" - -msgid "Unknown" -msgstr "Ismeretlen" - -msgid "Yes" -msgstr "Igen" - -msgid "No" -msgstr "Nem" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "igen,nem,talán" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bájt" -msgstr[1] "%(size)d bájt" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "du" - -msgid "a.m." -msgstr "de" - -msgid "PM" -msgstr "DU" - -msgid "AM" -msgstr "DE" - -msgid "midnight" -msgstr "éjfél" - -msgid "noon" -msgstr "dél" - -msgid "Monday" -msgstr "hétfő" - -msgid "Tuesday" -msgstr "kedd" - -msgid "Wednesday" -msgstr "szerda" - -msgid "Thursday" -msgstr "csütörtök" - -msgid "Friday" -msgstr "péntek" - -msgid "Saturday" -msgstr "szombat" - -msgid "Sunday" -msgstr "vasárnap" - -msgid "Mon" -msgstr "hét" - -msgid "Tue" -msgstr "kedd" - -msgid "Wed" -msgstr "sze" - -msgid "Thu" -msgstr "csüt" - -msgid "Fri" -msgstr "pén" - -msgid "Sat" -msgstr "szo" - -msgid "Sun" -msgstr "vas" - -msgid "January" -msgstr "január" - -msgid "February" -msgstr "február" - -msgid "March" -msgstr "március" - -msgid "April" -msgstr "április" - -msgid "May" -msgstr "május" - -msgid "June" -msgstr "június" - -msgid "July" -msgstr "július" - -msgid "August" -msgstr "augusztus" - -msgid "September" -msgstr "szeptember" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "már" - -msgid "apr" -msgstr "ápr" - -msgid "may" -msgstr "máj" - -msgid "jun" -msgstr "jún" - -msgid "jul" -msgstr "júl" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sze" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "febr." - -msgctxt "abbrev. month" -msgid "March" -msgstr "márc." - -msgctxt "abbrev. month" -msgid "April" -msgstr "ápr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "máj." - -msgctxt "abbrev. month" -msgid "June" -msgstr "jún." - -msgctxt "abbrev. month" -msgid "July" -msgstr "júl." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "szept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec." - -msgctxt "alt. month" -msgid "January" -msgstr "január" - -msgctxt "alt. month" -msgid "February" -msgstr "február" - -msgctxt "alt. month" -msgid "March" -msgstr "március" - -msgctxt "alt. month" -msgid "April" -msgstr "április" - -msgctxt "alt. month" -msgid "May" -msgstr "május" - -msgctxt "alt. month" -msgid "June" -msgstr "június" - -msgctxt "alt. month" -msgid "July" -msgstr "július" - -msgctxt "alt. month" -msgid "August" -msgstr "augusztus" - -msgctxt "alt. month" -msgid "September" -msgstr "szeptember" - -msgctxt "alt. month" -msgid "October" -msgstr "október" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "december" - -msgid "This is not a valid IPv6 address." -msgstr "Ez nem egy érvényes IPv6 cím." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "vagy" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d év" -msgstr[1] "%(num)d év" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d hónap" -msgstr[1] "%(num)d hónap" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hét" -msgstr[1] "%(num)d hét" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d nap" -msgstr[1] "%(num)d nap" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d óra" -msgstr[1] "%(num)d óra" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d perc" -msgstr[1] "%(num)d perc" - -msgid "Forbidden" -msgstr "Hozzáférés megtagadva" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF ellenőrzés sikertelen. Kérés kiszolgálása megszakítva." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Ezt az üzenetet azért látja, mert ezen a HTTPS oldalon kötelező a \"Referer " -"header\", amelyet a böngészőnek kellene küldenie, de nem tette. Ez az adat " -"biztonsági okokból kötelező, ez biztosítja, hogy a böngészőt nem irányítja " -"át egy harmadik fél." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ha a böngészője úgy van beállítva, hogy letilja a \"Referer\" adatokat, " -"kérjük engedélyezze őket ehhez az oldalhoz, vagy a HTTPS kapcsolatokhoz, " -"vagy a \"same-origin\" kérésekhez." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ha a címkét használja, vagy " -"a “Referrer-Policy: no-referrer” fejlécet, kérjük távolítsa el ezeket. A " -"CSRF védelemnek szüksége van a \"Referer\" fejléc adatra a szigorú " -"ellenőrzéshez. Ha aggódik az adatainak biztonsága miatt, használjon " -"alternatívákat, mint például az , a külső oldalakra " -"mutató linkek esetén. " - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Azért látja ezt az üzenetet, mert ez a weboldal elvárja a CSRF cookie " -"elküldését űrlapoknál. Erre a cookie-ra biztonsági okból van szükség annak " -"kiszűrésére, hogy harmadik fél eltérítse az ön böngészőjét." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ha kikapcsolta a cookie-kat a böngészőjében, kérjük engedélyezze őket újra, " -"legalább erre az oldalra, vagy a \"same-origin\" típusú kérésekre." - -msgid "More information is available with DEBUG=True." -msgstr "További információ DEBUG=True beállítással érhető el." - -msgid "No year specified" -msgstr "Nincs év megadva" - -msgid "Date out of range" -msgstr "A dátum a megengedett tartományon kívül esik." - -msgid "No month specified" -msgstr "Nincs hónap megadva" - -msgid "No day specified" -msgstr "Nincs nap megadva" - -msgid "No week specified" -msgstr "Nincs hét megadva" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nincsenek elérhető %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Jövőbeli %(verbose_name_plural)s nem elérhetők, mert %(class_name)s." -"allow_future értéke False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"A megadott dátum \"%(datestr)s\" érvénytelen a következő formátumban: " -"\"%(format)s\"." - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nincs a keresési feltételeknek megfelelő %(verbose_name)s" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Az oldalszám nem \"utolsó\", vagy nem lehet számmá alakítani." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Érvénytelen oldal (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Üres lista, de a \"%(class_name)s.allow_empty\" értéke hamis." - -msgid "Directory indexes are not allowed here." -msgstr "A könyvtárak listázása itt nincs engedélyezve." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "A(z) \"%(path)s\" útvonal nem létezik" - -#, python-format -msgid "Index of %(directory)s" -msgstr "A %(directory)s könyvtár tartalma" - -msgid "The install worked successfully! Congratulations!" -msgstr "A telepítés sikeresen végződött! Gratulálunk!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"A Django %(version)s kiadási megjegyzéseinek " -"megtekintése" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Azért látod ezt az oldalt, mert a DEBUG=True szerepel a settings fájlban, és még nem " -"került beállításra egy URL sem." - -msgid "Django Documentation" -msgstr "Django Dokumentáció" - -msgid "Topics, references, & how-to’s" -msgstr "Témák, hivatkozások, & leírások" - -msgid "Tutorial: A Polling App" -msgstr "Gyakorlat: egy szavazó app" - -msgid "Get started with Django" -msgstr "Első lépések a Djangóval" - -msgid "Django Community" -msgstr "Django Közösség" - -msgid "Connect, get help, or contribute" -msgstr "Lépj kapcsolatba, kérj segítséget, vagy járulj hozzá" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hu/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/hu/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hu/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/hu/formats.py deleted file mode 100644 index c17f2c7..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/hu/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "Y. F j." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "Y. F j. H:i" -YEAR_MONTH_FORMAT = "Y. F" -MONTH_DAY_FORMAT = "F j." -SHORT_DATE_FORMAT = "Y.m.d." -SHORT_DATETIME_FORMAT = "Y.m.d. H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y.%m.%d.", # '2006.10.25.' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M", # '14:30' -] -DATETIME_INPUT_FORMATS = [ - "%Y.%m.%d. %H:%M:%S", # '2006.10.25. 14:30:59' - "%Y.%m.%d. %H:%M:%S.%f", # '2006.10.25. 14:30:59.000200' - "%Y.%m.%d. %H:%M", # '2006.10.25. 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = " " # Non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index 9dcc472..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/hy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index e4860e2..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,1237 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Սմբատ Պետրոսյան , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Աֆրիկաանս" - -msgid "Arabic" -msgstr "Արաբերեն" - -msgid "Asturian" -msgstr "Աստուրերեն" - -msgid "Azerbaijani" -msgstr "Ադրբեջաներեն" - -msgid "Bulgarian" -msgstr "Բուլղարերեն" - -msgid "Belarusian" -msgstr "Բելոռուսերեն" - -msgid "Bengali" -msgstr "Բենգալերեն" - -msgid "Breton" -msgstr "Բրետոներեն" - -msgid "Bosnian" -msgstr "Բոսնիերեն" - -msgid "Catalan" -msgstr "Կատալաներեն" - -msgid "Czech" -msgstr "Չեխերեն" - -msgid "Welsh" -msgstr "Վալլիերեն" - -msgid "Danish" -msgstr "Դանիերեն" - -msgid "German" -msgstr "Գերմաներեն" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Հունարեն" - -msgid "English" -msgstr "Անգլերեն" - -msgid "Australian English" -msgstr "Ավստրալական Անգլերեն" - -msgid "British English" -msgstr "Բրիտանական Անգլերեն" - -msgid "Esperanto" -msgstr "Էսպերանտո" - -msgid "Spanish" -msgstr "Իսպաներեն" - -msgid "Argentinian Spanish" -msgstr "Արգենտինական իսպաներեն" - -msgid "Colombian Spanish" -msgstr "Կոլումբիական իսպաներեն" - -msgid "Mexican Spanish" -msgstr "Մեքսիկական իսպաներեն" - -msgid "Nicaraguan Spanish" -msgstr "Նիկարագուական իսպաներեն" - -msgid "Venezuelan Spanish" -msgstr "Վենեսուելլական իսպաներեն" - -msgid "Estonian" -msgstr "Էստոներեն" - -msgid "Basque" -msgstr "Բասկերեն" - -msgid "Persian" -msgstr "Պարսկերեն" - -msgid "Finnish" -msgstr "Ֆիներեն" - -msgid "French" -msgstr "Ֆրանսերեն" - -msgid "Frisian" -msgstr "Ֆրիզերեն" - -msgid "Irish" -msgstr "Իռլանդերեն" - -msgid "Scottish Gaelic" -msgstr "Գելական շոտլանդերեն" - -msgid "Galician" -msgstr "Գալիսերեն" - -msgid "Hebrew" -msgstr "Եբրայերեն" - -msgid "Hindi" -msgstr "Հինդի" - -msgid "Croatian" -msgstr "Խորվաթերեն" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Հունգարերեն" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Ինտերլինգուա" - -msgid "Indonesian" -msgstr "Ինդոնեզերեն" - -msgid "Ido" -msgstr "Իդո" - -msgid "Icelandic" -msgstr "Իսլանդերեն" - -msgid "Italian" -msgstr "Իտալերեն" - -msgid "Japanese" -msgstr "Ճապոներեն" - -msgid "Georgian" -msgstr "Վրացերեն" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Ղազախերեն" - -msgid "Khmer" -msgstr "Քեմերերեն" - -msgid "Kannada" -msgstr "Կանադա" - -msgid "Korean" -msgstr "Կորեերեն" - -msgid "Luxembourgish" -msgstr "Լյուքսեմբուրգերեն" - -msgid "Lithuanian" -msgstr "Լիտվերեն" - -msgid "Latvian" -msgstr "Լատիշերեն" - -msgid "Macedonian" -msgstr "Մակեդոներեն" - -msgid "Malayalam" -msgstr "Մալայալամ" - -msgid "Mongolian" -msgstr "Մոնղոլերեն" - -msgid "Marathi" -msgstr "Մարատխի" - -msgid "Burmese" -msgstr "Բիրմաներեն" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Նեպալերեն" - -msgid "Dutch" -msgstr "Հոլանդերեն" - -msgid "Norwegian Nynorsk" -msgstr "Նորվեգերեն (Նյունորսկ)" - -msgid "Ossetic" -msgstr "Օսերեն" - -msgid "Punjabi" -msgstr "Փանջաբի" - -msgid "Polish" -msgstr "Լեհերեն" - -msgid "Portuguese" -msgstr "Պորտուգալերեն" - -msgid "Brazilian Portuguese" -msgstr "Բրազիլական պորտուգալերեն" - -msgid "Romanian" -msgstr "Ռումիներեն" - -msgid "Russian" -msgstr "Ռուսերեն" - -msgid "Slovak" -msgstr "Սլովակերեն" - -msgid "Slovenian" -msgstr "Սլովեներեն" - -msgid "Albanian" -msgstr "Ալբաներեն" - -msgid "Serbian" -msgstr "Սերբերեն" - -msgid "Serbian Latin" -msgstr "Սերբերեն (լատինատառ)" - -msgid "Swedish" -msgstr "Շվեդերեն" - -msgid "Swahili" -msgstr "Սվահիլի" - -msgid "Tamil" -msgstr "Թամիլերեն" - -msgid "Telugu" -msgstr "Թելուգու" - -msgid "Thai" -msgstr "Թայերեն" - -msgid "Turkish" -msgstr "Թուրքերեն" - -msgid "Tatar" -msgstr "Թաթարերեն" - -msgid "Udmurt" -msgstr "Ումուրտերեն" - -msgid "Ukrainian" -msgstr "Ուկրաիներեն" - -msgid "Urdu" -msgstr "Ուրդու" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Վիետնամերեն" - -msgid "Simplified Chinese" -msgstr "Հեշտացված չինարեն" - -msgid "Traditional Chinese" -msgstr "Ավանդական չինարեն" - -msgid "Messages" -msgstr "Հաղորդագրություններ" - -msgid "Site Maps" -msgstr "Կայքի քարտեզ" - -msgid "Static Files" -msgstr "Ստատիկ ֆայլեր\t" - -msgid "Syndication" -msgstr "Նորություններ" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Մուտքագրեք ճիշտ արժեք" - -msgid "Enter a valid URL." -msgstr "Մուտքագրեք ճիշտ URL" - -msgid "Enter a valid integer." -msgstr "Մուտքագրեք ամբողջ թիվ" - -msgid "Enter a valid email address." -msgstr "Մուտքագրեք ճիշտ էլեկտրոնային փոստի հասցե" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Մուտքագրեք ճիշտ IPv4 հասցե" - -msgid "Enter a valid IPv6 address." -msgstr "Մուտքագրեք ճիշտ IPv6 հասցե" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Մուտքագրեք ճիշտ IPv4 կամ IPv6 հասցե" - -msgid "Enter only digits separated by commas." -msgstr "Մուտքագրեք միայն ստորակետով բաժանված թվեր" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Համոզվեք, որ այս արժեքը %(limit_value)s (հիմա այն — %(show_value)s)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Համոզվեք, որ այս արժեքը փոքր է, կամ հավասար %(limit_value)s" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Համոզվեք, որ այս արժեքը մեծ է, համ հավասար %(limit_value)s" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Համոզվեք, որ արժեքը պարունակում է ամենաքիչը %(limit_value)d նիշ (այն " -"պարունակում է %(show_value)d)." -msgstr[1] "" -"Համոզվեք, որ արժեքը պարունակում է ամենաքիչը %(limit_value)d նիշ (այն " -"պարունակում է %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Համոզվեք, որ արժեքը պարունակում է ամենաքիչը %(limit_value)d նիշ (այն " -"պարունակում է %(show_value)d)." -msgstr[1] "" -"Համոզվեք, որ արժեքը պարունակում է ամենաքիչը %(limit_value)d նիշ (այն " -"պարունակում է %(show_value)d)." - -msgid "Enter a number." -msgstr "Մուտքագրեք թիվ" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Համոզվեք, որ թվերի քանակը մեծ չէ %(max)s -ից" -msgstr[1] "Համոզվեք, որ թվերի քանակը մեծ չէ %(max)s -ից" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Համոզվեք, որ ստորակետից հետո թվերի քանակը մեծ չէ %(max)s -ից" -msgstr[1] "Համոզվեք, որ ստորակետից հետո թվերի քանակը մեծ չէ %(max)s -ից" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Համոզվեք, որ ստորակետից առաջ թվերի քանակը մեծ չէ %(max)s -ից" -msgstr[1] "Համոզվեք, որ ստորակետից առաջ թվերի քանակը մեծ չէ %(max)s -ից" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "և" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" -"%(field_labels)s դաշտերի այս արժեքով %(model_name)s արդեն գոյություն ունի" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r արժեքը չի մտնում թույլատրված տարբերակների մեջ" - -msgid "This field cannot be null." -msgstr "Այս դաշտը չի կարող ունենալ NULL արժեք " - -msgid "This field cannot be blank." -msgstr "Այս դաշտը չի կարող լինել դատարկ" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s դաշտի այս արժեքով %(model_name)s արդեն գոյություն ունի" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"«%(field_label)s» դաշտի արժեքը պետք է լինի միակը %(date_field_label)s " -"%(lookup_type)s համար" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s տիպի դաշտ" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Տրամաբանական (True կամ False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Տող (մինչև %(max_length)s երկարությամբ)" - -msgid "Comma-separated integers" -msgstr "Ստորակետով բաժանված ամբողջ թվեր" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Ամսաթիվ (առանց ժամանակի)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Ամսաթիվ (և ժամանակ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Տասնորդական թիվ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Տևողություն" - -msgid "Email address" -msgstr "Email հասցե" - -msgid "File path" -msgstr "Ֆայլի ճանապարհ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Floating point թիվ" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Ամբողջ" - -msgid "Big (8 byte) integer" -msgstr "Մեծ (8 բայթ) ամբողջ թիվ" - -msgid "IPv4 address" -msgstr "IPv4 հասցե" - -msgid "IP address" -msgstr "IP հասցե" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Տրամաբանական (Either True, False կամ None)" - -msgid "Positive integer" -msgstr "Դրական ամբողջ թիվ" - -msgid "Positive small integer" -msgstr "Դրայան փոքր ամբողջ թիվ" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (մինչև %(max_length)s նիշ)" - -msgid "Small integer" -msgstr "Փոքր ամբողջ թիվ" - -msgid "Text" -msgstr "Տեքստ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Ժամանակ" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Երկուական տվյալներ" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Ֆայլ" - -msgid "Image" -msgstr "Պատկեր" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -" %(field)s դաշտի %(value)r արժեք ունեցող %(model)s օրինակ գոյություն չունի" - -msgid "Foreign Key (type determined by related field)" -msgstr "Արտաքին բանալի (տեսակը որոշվում է հարակից դաշտից)" - -msgid "One-to-one relationship" -msgstr "Մեկը մեկին կապ" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Մի քանիսը մի քանիսին կապ" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Այս դաշտը պարտադիր է" - -msgid "Enter a whole number." -msgstr "Մուտքագրեք ամբողջ թիվ" - -msgid "Enter a valid date." -msgstr "Մուտքագրեք ճիշտ ամսաթիվ" - -msgid "Enter a valid time." -msgstr "Մուտքագրեք ճիշտ ժամանակ" - -msgid "Enter a valid date/time." -msgstr "Մուտքագրեք ճիշտ ամսաթիվ/ժամանակ" - -msgid "Enter a valid duration." -msgstr "Մուտքագրեք ճիշտ տևողություն" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ոչ մի ֆայլ չի ուղարկվել։ Ստուգեք ձևաթղթի կոդավորում տեսակը" - -msgid "No file was submitted." -msgstr "Ոչ մի ֆայլ չի ուղարկվել" - -msgid "The submitted file is empty." -msgstr "Ուղարկված ֆայլը դատարկ է" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Համոզվեք, որ ֆայլի անունը պարունակում է ամենաշատը %(max)d նիշ (այն " -"պարունակում է %(length)d)" -msgstr[1] "" -"Համոզվեք, որ ֆայլի անունը պարունակում է ամենաշատը %(max)d նիշ (այն " -"պարունակում է %(length)d)" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Ուղարկեք ֆայլ, կամ ակտիվացրեք մաքրելու նշման վանդակը, ոչ թե երկուսը միասին" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "Ուղարկեք ճիշտ պատկեր․ Ուղարկված ֆայլը պատկեր չէ, կամ վնասված է" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Ընտրեք ճիշտ տարբերակ։ %(value)s արժեքը չի մտնում ճիշտ արժեքների մեջ" - -msgid "Enter a list of values." -msgstr "Մուտքագրեք արժեքների ցուցակ" - -msgid "Enter a complete value." -msgstr "Մուտքագրեք ամբողջական արժեք" - -msgid "Enter a valid UUID." -msgstr "Մուտքագրեք ճիշտ UUID" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Թաքցված դաշտ %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Կառավարման ձևաթղթի տվյալները բացակայում են, կամ վնասված են" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Ուղարկեք %d կամ քիչ ձևաթղթեր" -msgstr[1] "Ուղարկեք %d կամ քիչ ձևաթղթեր" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Ուղարկեք %d կամ շատ ձևաթղթեր" -msgstr[1] "Ուղարկեք %d կամ շատ ձևաթղթեր" - -msgid "Order" -msgstr "Հերթականություն" - -msgid "Delete" -msgstr "Հեռացնել" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ուղղեք %(field)s դաշտի կրկնվող տվյալները" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Ուղղեք %(field)s դաշտի կրկնվող տվյալները, որոնք պետք է լինեն եզակի" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ուղղեք %(field_name)s դաշտի կրկնվող տվյալները, որոնք պետք է լինեն եզակի " -"%(date_field)s-ում %(lookup)s֊ի համար" - -msgid "Please correct the duplicate values below." -msgstr "Ուղղեք կրկնվող տվյալները" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Ընտրեք ճիշտ տարբերակ։ Այս արժեքը չի մտնում ճիշտ արժեքների մեջ" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Մաքրել" - -msgid "Currently" -msgstr "Տվյալ պահին" - -msgid "Change" -msgstr "Փոխել" - -msgid "Unknown" -msgstr "Անհայտ" - -msgid "Yes" -msgstr "Այո" - -msgid "No" -msgstr "Ոչ" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "այո,ոչ,միգուցե" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d բայթ" -msgstr[1] "%(size)d բայթ" - -#, python-format -msgid "%s KB" -msgstr "%s ԿԲ" - -#, python-format -msgid "%s MB" -msgstr "%s ՄԲ" - -#, python-format -msgid "%s GB" -msgstr "%s ԳԲ" - -#, python-format -msgid "%s TB" -msgstr "%s ՏԲ" - -#, python-format -msgid "%s PB" -msgstr "%s ՊԲ" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "կեսգիշեր" - -msgid "noon" -msgstr "կեսօր" - -msgid "Monday" -msgstr "Երկուշաբթի" - -msgid "Tuesday" -msgstr "Երեքշաբթի" - -msgid "Wednesday" -msgstr "Չորեքշաբթի" - -msgid "Thursday" -msgstr "Հինգշաբթի" - -msgid "Friday" -msgstr "Ուրբաթ" - -msgid "Saturday" -msgstr "Շաբաթ" - -msgid "Sunday" -msgstr "Կիրակի" - -msgid "Mon" -msgstr "Երկ" - -msgid "Tue" -msgstr "Երք" - -msgid "Wed" -msgstr "Չրք" - -msgid "Thu" -msgstr "Հնգ" - -msgid "Fri" -msgstr "Ուրբ" - -msgid "Sat" -msgstr "Շբթ" - -msgid "Sun" -msgstr "Կիր" - -msgid "January" -msgstr "Հունվար" - -msgid "February" -msgstr "Փետրվար" - -msgid "March" -msgstr "Մարտ" - -msgid "April" -msgstr "Ապրիլ" - -msgid "May" -msgstr "Մայիս" - -msgid "June" -msgstr "Հունիս" - -msgid "July" -msgstr "Հուլիս" - -msgid "August" -msgstr "Օգոստոս" - -msgid "September" -msgstr "Սեպտեմբեր" - -msgid "October" -msgstr "Հոկտեմբեր" - -msgid "November" -msgstr "Նոյեմբեր" - -msgid "December" -msgstr "Դեկտեմբեր" - -msgid "jan" -msgstr "հուն" - -msgid "feb" -msgstr "փետ" - -msgid "mar" -msgstr "մար" - -msgid "apr" -msgstr "ապր" - -msgid "may" -msgstr "մայ" - -msgid "jun" -msgstr "հուն" - -msgid "jul" -msgstr "հուլ" - -msgid "aug" -msgstr "օգտ" - -msgid "sep" -msgstr "սեպ" - -msgid "oct" -msgstr "հոկ" - -msgid "nov" -msgstr "նոյ" - -msgid "dec" -msgstr "դեկ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Հուն․" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Փետ․" - -msgctxt "abbrev. month" -msgid "March" -msgstr "Մարտ" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Մարտ" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Մայիս" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Հունիս" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Հուլիս" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Օգոստ․" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Սեպտ․" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Հոկտ․" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Նոյ․" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Դեկ․" - -msgctxt "alt. month" -msgid "January" -msgstr "Հունվար" - -msgctxt "alt. month" -msgid "February" -msgstr "Փետրվար" - -msgctxt "alt. month" -msgid "March" -msgstr "Մարտ" - -msgctxt "alt. month" -msgid "April" -msgstr "Ապրիլ" - -msgctxt "alt. month" -msgid "May" -msgstr "Մայիս" - -msgctxt "alt. month" -msgid "June" -msgstr "Հունիս" - -msgctxt "alt. month" -msgid "July" -msgstr "Հուլիս" - -msgctxt "alt. month" -msgid "August" -msgstr "Օգոստոս" - -msgctxt "alt. month" -msgid "September" -msgstr "Սեպտեմբեր" - -msgctxt "alt. month" -msgid "October" -msgstr "Հոկտեմբեր" - -msgctxt "alt. month" -msgid "November" -msgstr "Նոյեմբեր" - -msgctxt "alt. month" -msgid "December" -msgstr "Դեկտեմբեր" - -msgid "This is not a valid IPv6 address." -msgstr "Սա ճիշտ IPv6 հասցե չէ" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "կամ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d տարի" -msgstr[1] "%d տարի" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d ամիս" -msgstr[1] "%d ամիս" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d շաբաթ" -msgstr[1] "%d շաբաթ" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d օր" -msgstr[1] "%d օր" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ժամ" -msgstr[1] "%d ժամ" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d րոպե" -msgstr[1] "%d րոպե" - -msgid "0 minutes" -msgstr "0 րոպե" - -msgid "Forbidden" -msgstr "Արգելված" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF ստուգման սխալ․ Հարցումն ընդհատված է" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Դուք տեսնում եք այս հաղորդագրությունը, քանի որ այս կայքը ձևաթերթերը " -"ուղարկելու համար պահանջում է CSRF cookie։ Այն անհրաժեշտ է անվտանգության " -"նկատառումներից ելնելով, համոզվելու համար, որ ձեր բրաուզերը չի գտնվում երրորդ " -"անձանց կառավարման տակ։" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Ավելի մանրամասն տեղեկությունը հասանելի է DEBUG=True֊ի ժամանակ" - -msgid "No year specified" -msgstr "Տարին նշված չէ" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Ամիսը նշված չէ" - -msgid "No day specified" -msgstr "Օրը նշված չէ" - -msgid "No week specified" -msgstr "Շաբաթը նշված չէ" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ոչ մի %(verbose_name_plural)s հասանելի չէ" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Ապագա %(verbose_name_plural)s հասանելի չեն, քանի որ %(class_name)s." -"allow_future ունի False արժեք" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Հարցմանը համապատասխանող ոչ մի %(verbose_name)s չի գտնվել" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Սխալ էջ (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Կատալոգների ինդեքսավորումը թույլատրված չէ այստեղ" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s֊ի ինդեքսը" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ia/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index e22136f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index adb852f..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,1289 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2012,2014,2016,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-18 21:19+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikaans" - -msgid "Arabic" -msgstr "arabe" - -msgid "Algerian Arabic" -msgstr "Arabe algerian" - -msgid "Asturian" -msgstr "asturiano" - -msgid "Azerbaijani" -msgstr "azeri" - -msgid "Bulgarian" -msgstr "bulgaro" - -msgid "Belarusian" -msgstr "bielorusso" - -msgid "Bengali" -msgstr "bengali" - -msgid "Breton" -msgstr "breton" - -msgid "Bosnian" -msgstr "bosniaco" - -msgid "Catalan" -msgstr "catalano" - -msgid "Czech" -msgstr "tcheco" - -msgid "Welsh" -msgstr "gallese" - -msgid "Danish" -msgstr "danese" - -msgid "German" -msgstr "germano" - -msgid "Lower Sorbian" -msgstr "sorabo inferior" - -msgid "Greek" -msgstr "greco" - -msgid "English" -msgstr "anglese" - -msgid "Australian English" -msgstr "anglese australian" - -msgid "British English" -msgstr "anglese britannic" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "espaniol" - -msgid "Argentinian Spanish" -msgstr "espaniol argentin" - -msgid "Colombian Spanish" -msgstr "espaniol colombian" - -msgid "Mexican Spanish" -msgstr "espaniol mexican" - -msgid "Nicaraguan Spanish" -msgstr "espaniol nicaraguan" - -msgid "Venezuelan Spanish" -msgstr "espaniol venzuelan" - -msgid "Estonian" -msgstr "estoniano" - -msgid "Basque" -msgstr "basco" - -msgid "Persian" -msgstr "persiano" - -msgid "Finnish" -msgstr "finnese" - -msgid "French" -msgstr "francese" - -msgid "Frisian" -msgstr "frison" - -msgid "Irish" -msgstr "irlandese" - -msgid "Scottish Gaelic" -msgstr "gaelico scotese" - -msgid "Galician" -msgstr "galiciano" - -msgid "Hebrew" -msgstr "hebreo" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "croato" - -msgid "Upper Sorbian" -msgstr "sorabo superior" - -msgid "Hungarian" -msgstr "hungaro" - -msgid "Armenian" -msgstr "Armenio" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indonesiano" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandese" - -msgid "Italian" -msgstr "italiano" - -msgid "Japanese" -msgstr "japonese" - -msgid "Georgian" -msgstr "georgiano" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "kazakh" - -msgid "Khmer" -msgstr "khmer" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "coreano" - -msgid "Kyrgyz" -msgstr "Kyrgyz" - -msgid "Luxembourgish" -msgstr "luxemburgese" - -msgid "Lithuanian" -msgstr "lituano" - -msgid "Latvian" -msgstr "letton" - -msgid "Macedonian" -msgstr "macedone" - -msgid "Malayalam" -msgstr "malayalam" - -msgid "Mongolian" -msgstr "mongolico" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "burmese" - -msgid "Norwegian Bokmål" -msgstr "norvegianio bokmål" - -msgid "Nepali" -msgstr "nepali" - -msgid "Dutch" -msgstr "hollandese" - -msgid "Norwegian Nynorsk" -msgstr "norvegiano, nynorsk" - -msgid "Ossetic" -msgstr "ossetico" - -msgid "Punjabi" -msgstr "punjabi" - -msgid "Polish" -msgstr "polonese" - -msgid "Portuguese" -msgstr "portugese" - -msgid "Brazilian Portuguese" -msgstr "portugese brasilian" - -msgid "Romanian" -msgstr "romaniano" - -msgid "Russian" -msgstr "russo" - -msgid "Slovak" -msgstr "slovaco" - -msgid "Slovenian" -msgstr "sloveno" - -msgid "Albanian" -msgstr "albanese" - -msgid "Serbian" -msgstr "serbo" - -msgid "Serbian Latin" -msgstr "serbo latin" - -msgid "Swedish" -msgstr "svedese" - -msgid "Swahili" -msgstr "swahili" - -msgid "Tamil" -msgstr "tamil" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "Tadzhik" - -msgid "Thai" -msgstr "thailandese" - -msgid "Turkmen" -msgstr "Turkmen" - -msgid "Turkish" -msgstr "turco" - -msgid "Tatar" -msgstr "tartaro" - -msgid "Udmurt" -msgstr "udmurto" - -msgid "Ukrainian" -msgstr "ukrainiano" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "Uzbek" - -msgid "Vietnamese" -msgstr "vietnamese" - -msgid "Simplified Chinese" -msgstr "chinese simplificate" - -msgid "Traditional Chinese" -msgstr "chinese traditional" - -msgid "Messages" -msgstr "Messages" - -msgid "Site Maps" -msgstr "Mappas de sito" - -msgid "Static Files" -msgstr "Files static" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Le numero de pagina non es un numero integre" - -msgid "That page number is less than 1" -msgstr "Le numero de pagina es minus de 1" - -msgid "That page contains no results" -msgstr "Le pagina non contine resultatos" - -msgid "Enter a valid value." -msgstr "Specifica un valor valide." - -msgid "Enter a valid URL." -msgstr "Specifica un URL valide." - -msgid "Enter a valid integer." -msgstr "Specifica un numero integre valide." - -msgid "Enter a valid email address." -msgstr "Specifica un adresse de e-mail valide." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Scribe un denotation (\"slug\") valide, consistente de litteras, numeros, " -"tractos de sublineamento o tractos de union." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Scribe un denotation (\"slug\") valide, consistente de litteras Unicode, " -"numeros, tractos de sublineamento o tractos de union." - -msgid "Enter a valid IPv4 address." -msgstr "Specifica un adresse IPv4 valide." - -msgid "Enter a valid IPv6 address." -msgstr "Specifica un adresse IPv6 valide." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Specifica un adresse IPv4 o IPv6 valide." - -msgid "Enter only digits separated by commas." -msgstr "Scribe solmente digitos separate per commas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Assecura te que iste valor es %(limit_value)s (illo es %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Assecura te que iste valor es inferior o equal a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Assecura te que iste valor es superior o equal a %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assecura te que iste valor ha al minus %(limit_value)d character (illo ha " -"%(show_value)d)." -msgstr[1] "" -"Assecura te que iste valor ha al minus %(limit_value)d characteres (illo ha " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assecura te que iste valor ha al plus %(limit_value)d character (illo ha " -"%(show_value)d)." -msgstr[1] "" -"Assecura te que iste valor ha al plus %(limit_value)d characteres (illo ha " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Specifica un numero." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Assecura te que il non ha plus de %(max)s digito in total." -msgstr[1] "Assecura te que il non ha plus de %(max)s digitos in total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Assecura te que il non ha plus de %(max)s cifra post le comma decimal." -msgstr[1] "" -"Assecura te que il non ha plus de %(max)s cifras post le comma decimal." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Assecura te que il non ha plus de %(max)s cifra ante le comma decimal." -msgstr[1] "" -"Assecura te que il non ha plus de %(max)s cifras ante le comma decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Le extension de nomine de file “%(extension)s” non es permittite. Le " -"extensiones permittite es: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Characteres nulle non es permittite." - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Jam existe %(model_name)s con iste %(field_labels)s." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Le valor %(value)r non es un option valide." - -msgid "This field cannot be null." -msgstr "Iste campo non pote esser nulle." - -msgid "This field cannot be blank." -msgstr "Iste campo non pote esser vacue." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s con iste %(field_label)s jam existe." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s debe esser unic pro %(lookup_type)s de %(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo de typo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Le valor “%(value)s” debe esser o True/Ver o False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Le valor “%(value)s” debe esser True/Ver, False o None/Necun." - -msgid "Boolean (Either True or False)" -msgstr "Booleano (ver o false)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Catena (longitude maxime: %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Numeros integre separate per commas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Le valor “%(value)s” ha un formato de data invalide. Debe esser in formato " -"AAAA-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Le valor “%(value)s” ha le formato correcte (AAAA-MM-DD) ma es un data " -"invalide." - -msgid "Date (without time)" -msgstr "Data (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Le valor “%(value)s” es in un formato invalide. Debe esser in formato AAAA-" -"MM-DD HH:MM[:ss[.uuuuuu]][FH]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Le valor “%(value)s” es in le formato correcte (YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][FH]) ma es un data/hora invalide." - -msgid "Date (with time)" -msgstr "Data (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Le valor “%(value)s” debe esser un numero decimal." - -msgid "Decimal number" -msgstr "Numero decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Le valor “%(value)s” es in un formato invalide. Debe esser in formato [DD] " -"[HH:[MM:]]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Duration" - -msgid "Email address" -msgstr "Adresse de e-mail" - -msgid "File path" -msgstr "Cammino de file" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Le valor “%(value)s” debe esser un numero a comma flottante." - -msgid "Floating point number" -msgstr "Numero a comma flottante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Le valor “%(value)s” debe esser un numero integre." - -msgid "Integer" -msgstr "Numero integre" - -msgid "Big (8 byte) integer" -msgstr "Numero integre grande (8 bytes)" - -msgid "Small integer" -msgstr "Parve numero integre" - -msgid "IPv4 address" -msgstr "Adresse IPv4" - -msgid "IP address" -msgstr "Adresse IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Le valor “%(value)s” debe esser None/Nulle, True/Ver o False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (ver, false o nulle)" - -msgid "Positive big integer" -msgstr "Grande numero integre positive" - -msgid "Positive integer" -msgstr "Numero integre positive" - -msgid "Positive small integer" -msgstr "Parve numero integre positive" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Denotation (longitude maxime: %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Le valor “%(value)s” es in un formato invalide. Debe esser in formato HH:MM[:" -"ss[.uuuuuu]] ." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Le valor “%(value)s” es in le formato correcte (HH:MM[:ss[.uuuuuu]]) ma es " -"un hora invalide." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos binari crude" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” non es un UUID valide." - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "File" - -msgid "Image" -msgstr "Imagine" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Le instantia de %(model)s con %(field)s %(value)r non existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave estranier (typo determinate per le campo associate)" - -msgid "One-to-one relationship" -msgstr "Relation un a un" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relation %(from)s a %(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relationes %(from)s a %(to)s" - -msgid "Many-to-many relationship" -msgstr "Relation multes a multes" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Iste campo es obligatori." - -msgid "Enter a whole number." -msgstr "Specifica un numero integre." - -msgid "Enter a valid date." -msgstr "Specifica un data valide." - -msgid "Enter a valid time." -msgstr "Specifica un hora valide." - -msgid "Enter a valid date/time." -msgstr "Specifica un data e hora valide." - -msgid "Enter a valid duration." -msgstr "Specifica un duration valide." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Nulle file esseva submittite. Verifica le typo de codification in le " -"formulario." - -msgid "No file was submitted." -msgstr "Nulle file esseva submittite." - -msgid "The submitted file is empty." -msgstr "Le file submittite es vacue." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Assecura te que iste valor ha al plus %(max)d character (illo ha %(length)d)." -msgstr[1] "" -"Assecura te que iste valor ha al plus %(max)d characteres (illo ha " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Per favor o submitte un file o marca le quadrato \"rader\", non ambes." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Per favor incarga un imagine valide. Le file que tu incargava o non esseva " -"un imagine o esseva un imagine corrumpite." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Selige un option valide. %(value)s non es inter le optiones disponibile." - -msgid "Enter a list of values." -msgstr "Scribe un lista de valores." - -msgid "Enter a complete value." -msgstr "Specifica un valor complete." - -msgid "Enter a valid UUID." -msgstr "Specifica un UUID valide." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo celate %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Ordine" - -msgid "Delete" -msgstr "Deler" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Per favor corrige le datos duplicate pro %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Per favor corrige le datos duplicate pro %(field)s, que debe esser unic." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Per favor corrige le datos duplicate pro %(field_name)s, que debe esser unic " -"pro le %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Per favor corrige le sequente valores duplicate." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Per favor selige un option valide. Iste option non es inter le optiones " -"disponibile." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Rader" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Cambiar" - -msgid "Unknown" -msgstr "Incognite" - -msgid "Yes" -msgstr "Si" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "si,no,forsan" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "pm." - -msgid "a.m." -msgstr "am." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medienocte" - -msgid "noon" -msgstr "mediedie" - -msgid "Monday" -msgstr "lunedi" - -msgid "Tuesday" -msgstr "martedi" - -msgid "Wednesday" -msgstr "mercuridi" - -msgid "Thursday" -msgstr "jovedi" - -msgid "Friday" -msgstr "venerdi" - -msgid "Saturday" -msgstr "sabbato" - -msgid "Sunday" -msgstr "dominica" - -msgid "Mon" -msgstr "lun" - -msgid "Tue" -msgstr "mar" - -msgid "Wed" -msgstr "mer" - -msgid "Thu" -msgstr "jov" - -msgid "Fri" -msgstr "ven" - -msgid "Sat" -msgstr "sab" - -msgid "Sun" -msgstr "dom" - -msgid "January" -msgstr "januario" - -msgid "February" -msgstr "februario" - -msgid "March" -msgstr "martio" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maio" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "augusto" - -msgid "September" -msgstr "septembre" - -msgid "October" -msgstr "octobre" - -msgid "November" -msgstr "novembre" - -msgid "December" -msgstr "decembre" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maio" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januario" - -msgctxt "alt. month" -msgid "February" -msgstr "Februario" - -msgctxt "alt. month" -msgid "March" -msgstr "Martio" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Maio" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Augusto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Octobre" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Decembre" - -msgid "This is not a valid IPv6 address." -msgstr "Isto non es un adresse IPv6 valide." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "Prohibite" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verification CSRF fallite. Requesta abortate." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Tu vide iste message perque iste sito require un cookie CSRF durante le " -"submission de formularios. Iste cookie es requirite pro motivos de " -"securitate, pro assecurar que tu navigator non es sequestrate per tertie " -"personas." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Plus information es disponibile con DEBUG=True." - -msgid "No year specified" -msgstr "Nulle anno specificate" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Nulle mense specificate" - -msgid "No day specified" -msgstr "Nulle die specificate" - -msgid "No week specified" -msgstr "Nulle septimana specificate" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Il non ha %(verbose_name_plural)s disponibile" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"In le futuro, %(verbose_name_plural)s non essera disponibile perque " -"%(class_name)s.allow_future es False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nulle %(verbose_name)s trovate que corresponde al consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Pagina invalide (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Le indices de directorio non es permittite hic." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indice de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/id/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index 74e20b0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/id/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index 30d7a36..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,1338 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adiyat Mubarak , 2017 -# Bayu Satiyo , 2024 -# Claude Paroz , 2018 -# Fery Setiawan , 2015-2019,2021-2024 -# Jannis Leidel , 2011 -# M Asep Indrayana , 2015 -# oon arfiandwi (OonID) , 2016,2020 -# rodin , 2011 -# rodin , 2013-2016 -# sag​e , 2018-2019 -# Sutrisno Efendi , 2015,2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Fery Setiawan , 2015-2019,2021-2024\n" -"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arab" - -msgid "Algerian Arabic" -msgstr "Arab Aljazair" - -msgid "Asturian" -msgstr "Asturia" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bulgarian" -msgstr "Bulgaria" - -msgid "Belarusian" -msgstr "Belarusia" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosnia" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdi Tengah (Sorani)" - -msgid "Czech" -msgstr "Ceska" - -msgid "Welsh" -msgstr "Wales" - -msgid "Danish" -msgstr "Denmark" - -msgid "German" -msgstr "Jerman" - -msgid "Lower Sorbian" -msgstr "Sorbian Bawah" - -msgid "Greek" -msgstr "Yunani" - -msgid "English" -msgstr "Inggris" - -msgid "Australian English" -msgstr "Inggris Australia" - -msgid "British English" -msgstr "Inggris Britania" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanyol" - -msgid "Argentinian Spanish" -msgstr "Spanyol Argentina" - -msgid "Colombian Spanish" -msgstr "Spanyol Kolombia" - -msgid "Mexican Spanish" -msgstr "Spanyol Meksiko" - -msgid "Nicaraguan Spanish" -msgstr "Spanyol Nikaragua" - -msgid "Venezuelan Spanish" -msgstr "Spanyol Venezuela" - -msgid "Estonian" -msgstr "Estonia" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Persia" - -msgid "Finnish" -msgstr "Finlandia" - -msgid "French" -msgstr "Perancis" - -msgid "Frisian" -msgstr "Frisia" - -msgid "Irish" -msgstr "Irlandia" - -msgid "Scottish Gaelic" -msgstr "Skolandia Gaelik" - -msgid "Galician" -msgstr "Galicia" - -msgid "Hebrew" -msgstr "Ibrani" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroasia" - -msgid "Upper Sorbian" -msgstr "Sorbian Atas" - -msgid "Hungarian" -msgstr "Hungaria" - -msgid "Armenian" -msgstr "Armenia" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesia" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandia" - -msgid "Italian" -msgstr "Italia" - -msgid "Japanese" -msgstr "Jepang" - -msgid "Georgian" -msgstr "Georgia" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Kazakhstan" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Korea" - -msgid "Kyrgyz" -msgstr "Kirgis" - -msgid "Luxembourgish" -msgstr "Luksemburg" - -msgid "Lithuanian" -msgstr "Lithuania" - -msgid "Latvian" -msgstr "Latvia" - -msgid "Macedonian" -msgstr "Makedonia" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolia" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malaysia" - -msgid "Burmese" -msgstr "Burma" - -msgid "Norwegian Bokmål" -msgstr "Norwegia Bokmål" - -msgid "Nepali" -msgstr "Nepal" - -msgid "Dutch" -msgstr "Belanda" - -msgid "Norwegian Nynorsk" -msgstr "Norwegia Nynorsk" - -msgid "Ossetic" -msgstr "Ossetic" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polandia" - -msgid "Portuguese" -msgstr "Portugis" - -msgid "Brazilian Portuguese" -msgstr "Portugis Brazil" - -msgid "Romanian" -msgstr "Romania" - -msgid "Russian" -msgstr "Rusia" - -msgid "Slovak" -msgstr "Slovakia" - -msgid "Slovenian" -msgstr "Slovenia" - -msgid "Albanian" -msgstr "Albania" - -msgid "Serbian" -msgstr "Serbia" - -msgid "Serbian Latin" -msgstr "Serbia Latin" - -msgid "Swedish" -msgstr "Swedia" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "Thailand" - -msgid "Turkmen" -msgstr "Turkmenistan" - -msgid "Turkish" -msgstr "Turki" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uyghur" - -msgid "Ukrainian" -msgstr "Ukrainia" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbek" - -msgid "Vietnamese" -msgstr "Vietnam" - -msgid "Simplified Chinese" -msgstr "Tiongkok Sederhana" - -msgid "Traditional Chinese" -msgstr "Tiongkok Tradisionil" - -msgid "Messages" -msgstr "Pesan" - -msgid "Site Maps" -msgstr "Peta Situs" - -msgid "Static Files" -msgstr "Berkas Statis" - -msgid "Syndication" -msgstr "Sindikasi" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Nomor halaman itu bukan sebuah integer" - -msgid "That page number is less than 1" -msgstr "Nomor halaman itu kurang dari 1" - -msgid "That page contains no results" -msgstr "Tidak ada hasil untuk halaman tersebut" - -msgid "Enter a valid value." -msgstr "Masukkan nilai yang valid." - -msgid "Enter a valid domain name." -msgstr "Masukkan nama domain yang sah." - -msgid "Enter a valid URL." -msgstr "Masukkan URL yang valid." - -msgid "Enter a valid integer." -msgstr "Masukan sebuah bilangan bulat yang benar" - -msgid "Enter a valid email address." -msgstr "Masukkan alamat email yang valid." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Masukkan “slug” valid yang terdiri dari huruf, angka, garis bawah, atau " -"tanda hubung." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Masukkan sebuah “slug” valid yang terdiri dari huruf, angka, garis bawah, " -"atau penghubung Unicode." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Masukkan alamat %(protocol)s yang sah." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 atau IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Hanya masukkan angka yang dipisahkan dengan koma." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Pastikan nilai ini %(limit_value)s (saat ini %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Pastikan nilai ini lebih kecil dari atau sama dengan %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Pastikan nilai ini lebih besar dari atau sama dengan %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Pastikan nilai ini adalah kelipatan dari ukuran langkah %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Pastikan nilai ini merupakan kelipatan ukuran langkah %(limit_value)s, " -"dimulai dari %(offset)s, misalnya %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, dan seterusnya." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Pastikan nilai ini mengandung paling sedikit %(limit_value)d karakter " -"(sekarang %(show_value)d karakter)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Pastikan nilai ini mengandung paling banyak %(limit_value)d karakter " -"(sekarang %(show_value)d karakter)." - -msgid "Enter a number." -msgstr "Masukkan sebuah bilangan." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Pastikan jumlah angka pada bilangan tidak melebihi %(max)s angka." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Pastikan bilangan tidak memiliki lebih dari %(max)s angka desimal." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Pastikan jumlah angka sebelum desimal pada bilangan tidak memiliki lebih " -"dari %(max)s angka." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Ekstensi berkas “%(extension)s” tidak diizinkan. Ekstensi diizinkan adalah: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Karakter null tidak diizinkan." - -msgid "and" -msgstr "dan" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s dengan %(field_labels)s ini tidak ada." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Batasan “%(name)s” dilanggar." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Nilai %(value)r bukan pilihan yang valid." - -msgid "This field cannot be null." -msgstr "Field ini tidak boleh null." - -msgid "This field cannot be blank." -msgstr "Field ini tidak boleh kosong." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s dengan %(field_label)s telah ada." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s haruslah unik untuk %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Field dengan tipe: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Nilai “%(value)s” harus berupa True atau False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Nilai “%(value)s” harus berupa True, False, atau None." - -msgid "Boolean (Either True or False)" -msgstr "Nilai Boolean (Salah satu dari True atau False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (maksimum %(max_length)s)" - -msgid "String (unlimited)" -msgstr "String (tidak terbatas)" - -msgid "Comma-separated integers" -msgstr "Bilangan asli yang dipisahkan dengan koma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Nilai “%(value)s” mempunyai format tanggal yang tidak valid. Tanggal harus " -"dalam format YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Nilai “%(value)s” memiliki format yang benar (YYYY-MM-DD), tetapi tanggalnya " -"tidak valid." - -msgid "Date (without time)" -msgstr "Tanggal (tanpa waktu)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Nilai “%(value)s” memiliki format yang tidak valid. Tanggal dan waktu harus " -"dalam format YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Nilai “%(value)s” memiliki format yang benar (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]), tetapi tanggal/waktunya tidak valid." - -msgid "Date (with time)" -msgstr "Tanggal (dengan waktu)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Nilai “%(value)s” harus berupa bilangan desimal." - -msgid "Decimal number" -msgstr "Bilangan desimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Nilai “%(value)s” mempunyai format yang tidak valid. Waktu harus dalam " -"format [DD] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Durasi" - -msgid "Email address" -msgstr "Alamat email" - -msgid "File path" -msgstr "Lokasi berkas" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Nilai “%(value)s” harus berupa bilangan real." - -msgid "Floating point number" -msgstr "Bilangan 'floating point'" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Nilai “%(value)s” harus berupa integer." - -msgid "Integer" -msgstr "Bilangan Asli" - -msgid "Big (8 byte) integer" -msgstr "Bilangan asli raksasa (8 byte)" - -msgid "Small integer" -msgstr "Bilangan asli kecil" - -msgid "IPv4 address" -msgstr "Alamat IPv4" - -msgid "IP address" -msgstr "Alamat IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Nilai “%(value)s” harus berupa None, True, atau False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Salah satu dari True, False, atau None)" - -msgid "Positive big integer" -msgstr "Integer besar positif" - -msgid "Positive integer" -msgstr "Bilangan asli positif" - -msgid "Positive small integer" -msgstr "Bilangan asli kecil positif" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (hingga %(max_length)s karakter)" - -msgid "Text" -msgstr "Teks" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Nilai “%(value)s” mempunyai format yang tidak valid. Waktu harus dalam " -"format HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Nilai “%(value)s” mempunyai format yang benar (HH:MM[:ss[.uuuuuu]]), tetapi " -"nilai waktunya tidak valid." - -msgid "Time" -msgstr "Waktu" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Data biner mentah" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” bukan UUID yang valid." - -msgid "Universally unique identifier" -msgstr "Pengenal unik secara universal" - -msgid "File" -msgstr "Berkas" - -msgid "Image" -msgstr "Gambar" - -msgid "A JSON object" -msgstr "Objek JSON" - -msgid "Value must be valid JSON." -msgstr "Nilai harus JSON yang valid." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Kunci Asing (tipe tergantung dari bidang yang berkaitan)" - -msgid "One-to-one relationship" -msgstr "Hubungan satu-ke-satu" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Hubungan %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Hubungan %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Hubungan banyak-ke-banyak" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Bidang ini tidak boleh kosong." - -msgid "Enter a whole number." -msgstr "Masukkan keseluruhan angka bilangan." - -msgid "Enter a valid date." -msgstr "Masukkan tanggal yang valid." - -msgid "Enter a valid time." -msgstr "Masukkan waktu yang valid." - -msgid "Enter a valid date/time." -msgstr "Masukkan tanggal/waktu yang valid." - -msgid "Enter a valid duration." -msgstr "Masukan durasi waktu yang benar." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Jumlah hari harus di antara {min_days} dan {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Tidak ada berkas yang dikirimkan. Periksa tipe pengaksaraan formulir." - -msgid "No file was submitted." -msgstr "Tidak ada berkas yang dikirimkan." - -msgid "The submitted file is empty." -msgstr "Berkas yang dikirimkan kosong." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Pastikan nama berkas ini mengandung paling banyak %(max)d karakter (sekarang " -"%(length)d karakter)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Pilih antara mengirimkan berkas atau menghapus tanda centang pada kotak " -"centang" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Unggah gambar yang valid. Berkas yang Anda unggah bukan merupakan berkas " -"gambar atau gambarnya rusak." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Masukkan pilihan yang valid. %(value)s bukan salah satu dari pilihan yang " -"tersedia." - -msgid "Enter a list of values." -msgstr "Masukkan beberapa nilai." - -msgid "Enter a complete value." -msgstr "Masukkan nilai yang komplet." - -msgid "Enter a valid UUID." -msgstr "Masukan UUID yang benar." - -msgid "Enter a valid JSON." -msgstr "Masukkan JSON yang valid." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Bidang tersembunyi %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Data ManagementForm telah hilang atau telah dirusak. Bidang yang hilang: " -"%(field_names)s. Anda mungkin butuh memberkaskan laporan kesalahan jika " -"masalah masih ada." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Harap ajukan paling banyak %(num)d formulir." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Harap ajukan setidaknya %(num)d formulir." - -msgid "Order" -msgstr "Urutan" - -msgid "Delete" -msgstr "Hapus" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Perbaiki data ganda untuk %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Perbaiki data ganda untuk %(field)s yang nilainya harus unik." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Perbaiki data ganda untuk %(field_name)s yang nilainya harus unik untuk " -"pencarian %(lookup)s pada %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Perbaiki nilai ganda di bawah ini." - -msgid "The inline value did not match the parent instance." -msgstr "Nilai sebaris tidak cocok dengan instance induk." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Masukkan pilihan yang valid. Pilihan tersebut bukan salah satu dari pilihan " -"yang tersedia." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” bukan nilai yang valid." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s tidak dapat diterjemahkan dalam zona waktu " -"%(current_timezone)s; mungkin nilainya ambigu atau tidak ada." - -msgid "Clear" -msgstr "Hapus" - -msgid "Currently" -msgstr "Saat ini" - -msgid "Change" -msgstr "Ubah" - -msgid "Unknown" -msgstr "Tidak diketahui" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Tidak" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ya,tidak,mungkin" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bita" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m" - -msgid "a.m." -msgstr "a.m" - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "tengah malam" - -msgid "noon" -msgstr "siang" - -msgid "Monday" -msgstr "Senin" - -msgid "Tuesday" -msgstr "Selasa" - -msgid "Wednesday" -msgstr "Rabu" - -msgid "Thursday" -msgstr "Kamis" - -msgid "Friday" -msgstr "Jumat" - -msgid "Saturday" -msgstr "Sabtu" - -msgid "Sunday" -msgstr "Minggu" - -msgid "Mon" -msgstr "Sen" - -msgid "Tue" -msgstr "Sel" - -msgid "Wed" -msgstr "Rab" - -msgid "Thu" -msgstr "Kam" - -msgid "Fri" -msgstr "Jum" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Min" - -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Maret" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "Agustus" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mei" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "agu" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "des" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Maret" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Agu" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Des." - -msgctxt "alt. month" -msgid "January" -msgstr "Januari" - -msgctxt "alt. month" -msgid "February" -msgstr "Februari" - -msgctxt "alt. month" -msgid "March" -msgstr "Maret" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mei" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Juli" - -msgctxt "alt. month" -msgid "August" -msgstr "Agustus" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Desember" - -msgid "This is not a valid IPv6 address." -msgstr "Ini bukan alamat IPv6 yang valid." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "atau" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d tahun" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d bulan" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d minggu" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d hari" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d jam" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d menit" - -msgid "Forbidden" -msgstr "Terlarang" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verifikasi CSRF gagal, Permintaan dibatalkan." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Anda melihat pesan ini karena jaringan HTTPS ini membutuhkan “Referer " -"header” untuk dikirim oleh peramban jaringan anda, tetapi tidak ada yg " -"dikirim. Kepala ini diwajibkan untuk alasan keamanan, untuk memastikan bahwa " -"peramban anda tidak sedang dibajak oleh pihak ketiga." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Jika Anda menonaktifkan header 'Referrer' pada konfigurasi peramban Anda, " -"mohon aktfikan kembali, setidaknya untuk situs ini, untuk koneksi HTTPS, " -"atau untuk request 'same-origin'." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Jika Anda menggunakan tag " -"atau menyertakan bagian kepala 'Referrer-Policy: no-referrer', harap hapus " -"hal tersebut. Perlindungan CSRF membutuhkan bagian kepala 'Referrer' untuk " -"melakukan pemeriksaan pengarahan ketat. Jika Anda khawatir mengenai privasi, " -"gunakan cara lain seperti untuk tautan ke situs " -"pihak ketiga." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Anda melihat pesan ini karena situs ini membutuhkan sebuah kuki CSRF ketika " -"mengirimkan formulir. Kuki ini dibutuhkan untuk alasan keamanan, untuk " -"memastikan bahwa peramban Anda tidak sedang dibajak oleh pihak ketiga." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Jika Anda telah mengatur peramban Anda untuk menonaktifkan kuki, maka " -"aktifkanlah kembali, setidaknya untuk website ini, atau untuk request 'same-" -"origin'." - -msgid "More information is available with DEBUG=True." -msgstr "Informasi lebih lanjut tersedia dengan DEBUG=True" - -msgid "No year specified" -msgstr "Tidak ada tahun dipilih" - -msgid "Date out of range" -msgstr "Tanggal di luar kisaran" - -msgid "No month specified" -msgstr "Tidak ada bulan dipilih" - -msgid "No day specified" -msgstr "Tidak ada hari dipilih" - -msgid "No week specified" -msgstr "Tidak ada minggu dipilih" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Tidak ada %(verbose_name_plural)s tersedia" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s di masa depan tidak tersedia karena %(class_name)s." -"allow_future bernilai False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Nilai tanggal tidak valid “%(datestr)s” untuk format “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Tidak ada %(verbose_name)s yang cocok dengan kueri" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Laman bukan yang “terakhir” dan juga tidak dapat dikonversikan ke sebuah " -"integer." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Laman tidak valid (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Daftar kosong dan '%(class_name)s.allow_empty' bernilai False." - -msgid "Directory indexes are not allowed here." -msgstr "Indeks direktori tidak diizinkan di sini." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” tidak ada" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Daftar isi %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Selamat! Instalasi berjalan lancar!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Lihat catatan rilis untuk Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Anda sedang melihat halaman ini karena DEBUG=True berada di berkas pengaturan Anda dan Anda " -"belum mengonfigurasi URL apa pun." - -msgid "Django Documentation" -msgstr "Dokumentasi Django" - -msgid "Topics, references, & how-to’s" -msgstr "Topik, referensi, & cara pemakaian" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Sebuah Aplikasi Jajak Pendapat" - -msgid "Get started with Django" -msgstr "Memulai dengan Django" - -msgid "Django Community" -msgstr "Komunitas Django" - -msgid "Connect, get help, or contribute" -msgstr "Terhubung, minta bantuan, atau berkontribusi" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/id/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/id/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/id/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/id/formats.py deleted file mode 100644 index 91a2559..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/id/formats.py +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j N Y" -DATETIME_FORMAT = "j N Y, G.i" -TIME_FORMAT = "G.i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d-m-Y" -SHORT_DATETIME_FORMAT = "d-m-Y G.i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d-%m-%Y", # '25-10-2009' - "%d/%m/%Y", # '25/10/2009' - "%d-%m-%y", # '25-10-09' - "%d/%m/%y", # '25/10/09' - "%d %b %Y", # '25 Oct 2006', - "%d %B %Y", # '25 October 2006' - "%m/%d/%y", # '10/25/06' - "%m/%d/%Y", # '10/25/2009' -] - -TIME_INPUT_FORMATS = [ - "%H.%M.%S", # '14.30.59' - "%H.%M", # '14.30' -] - -DATETIME_INPUT_FORMATS = [ - "%d-%m-%Y %H.%M.%S", # '25-10-2009 14.30.59' - "%d-%m-%Y %H.%M.%S.%f", # '25-10-2009 14.30.59.000200' - "%d-%m-%Y %H.%M", # '25-10-2009 14.30' - "%d-%m-%y %H.%M.%S", # '25-10-09' 14.30.59' - "%d-%m-%y %H.%M.%S.%f", # '25-10-09' 14.30.59.000200' - "%d-%m-%y %H.%M", # '25-10-09' 14.30' - "%m/%d/%y %H.%M.%S", # '10/25/06 14.30.59' - "%m/%d/%y %H.%M.%S.%f", # '10/25/06 14.30.59.000200' - "%m/%d/%y %H.%M", # '10/25/06 14.30' - "%m/%d/%Y %H.%M.%S", # '25/10/2009 14.30.59' - "%m/%d/%Y %H.%M.%S.%f", # '25/10/2009 14.30.59.000200' - "%m/%d/%Y %H.%M", # '25/10/2009 14.30' -] - -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ig/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ig/LC_MESSAGES/django.mo deleted file mode 100644 index 8e689c8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ig/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ig/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ig/LC_MESSAGES/django.po deleted file mode 100644 index 19e47ed..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ig/LC_MESSAGES/django.po +++ /dev/null @@ -1,1271 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Kelechi Precious Nwachukwu , 2020 -# Mariusz Felisiak , 2020 -# Okpala Olisa , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-30 12:26+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Igbo (http://www.transifex.com/django/django/language/ig/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ig\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabici" - -msgid "Algerian Arabic" -msgstr "Arabici ndị Algeria " - -msgid "Asturian" -msgstr "Asturian" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bulgarian" -msgstr "Bulgaria" - -msgid "Belarusian" -msgstr "Belarusia" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosnian" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Czech" -msgstr "Czech" - -msgid "Welsh" -msgstr "Welsh" - -msgid "Danish" -msgstr "Danishi" - -msgid "German" -msgstr "Germani" - -msgid "Lower Sorbian" -msgstr "Sorbian nke Ala" - -msgid "Greek" -msgstr "Greeki" - -msgid "English" -msgstr "Bekee" - -msgid "Australian English" -msgstr "Bekee ndị Australia" - -msgid "British English" -msgstr "Bekee ndị Britain" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanishi" - -msgid "Argentinian Spanish" -msgstr "Spanishi ndị Argentina" - -msgid "Colombian Spanish" -msgstr "Spanishi ndị Colombia " - -msgid "Mexican Spanish" -msgstr "Spanishi ndị Mexico " - -msgid "Nicaraguan Spanish" -msgstr "Spanishi ndị Nicaraguan" - -msgid "Venezuelan Spanish" -msgstr "Spanishi ndị Venezuela " - -msgid "Estonian" -msgstr "Estonian" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Persian" - -msgid "Finnish" -msgstr "Finnishi" - -msgid "French" -msgstr "Fụrenchị" - -msgid "Frisian" -msgstr "Frisian" - -msgid "Irish" -msgstr "Irishi" - -msgid "Scottish Gaelic" -msgstr "Scottish Gaelici" - -msgid "Galician" -msgstr "Galiciani" - -msgid "Hebrew" -msgstr "Hibru" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croatian" - -msgid "Upper Sorbian" -msgstr "Sorbian nke Elu" - -msgid "Hungarian" -msgstr "Hungarian" - -msgid "Armenian" -msgstr "Armeniani" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesian" - -msgid "Igbo" -msgstr "ìgbò" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Icelandici" - -msgid "Italian" -msgstr "Italian" - -msgid "Japanese" -msgstr "Japanisi " - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Korean" - -msgid "Kyrgyz" -msgstr "Kyrgyz" - -msgid "Luxembourgish" -msgstr "Luxembourgish" - -msgid "Lithuanian" -msgstr "Lithuanian" - -msgid "Latvian" -msgstr "Latvian" - -msgid "Macedonian" -msgstr "Macedonian" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolian" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Burmese" -msgstr "Burmese" - -msgid "Norwegian Bokmål" -msgstr "Bokmål ndị Norway" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Dutch" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk ndị Norway " - -msgid "Ossetic" -msgstr "Ossetici" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polishi" - -msgid "Portuguese" -msgstr "Portuguisi" - -msgid "Brazilian Portuguese" -msgstr "Portuguese ndị Brazil" - -msgid "Romanian" -msgstr "Romaniani" - -msgid "Russian" -msgstr "Russiani" - -msgid "Slovak" -msgstr "Slovaki" - -msgid "Slovenian" -msgstr "Sloveniani" - -msgid "Albanian" -msgstr "Albaniani" - -msgid "Serbian" -msgstr "Serbiani" - -msgid "Serbian Latin" -msgstr "Serbian Latini" - -msgid "Swedish" -msgstr "Swedishi" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmen" - -msgid "Turkish" -msgstr "Turkishi" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Ukrainiani" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeki" - -msgid "Vietnamese" -msgstr "Vietnamesi" - -msgid "Simplified Chinese" -msgstr "Chinisi Ndị Mfe" - -msgid "Traditional Chinese" -msgstr "Odịnala Chinisi" - -msgid "Messages" -msgstr "Ozi" - -msgid "Site Maps" -msgstr "Maapụ Saịtị" - -msgid "Static Files" -msgstr "Faịlụ Nkwụsiri ike" - -msgid "Syndication" -msgstr "Nyefee Njikwa" - -msgid "That page number is not an integer" -msgstr "Nọmba peeji ahụ abụghị onu ogugu" - -msgid "That page number is less than 1" -msgstr "Nọmba peeji ahụ erughị 1" - -msgid "That page contains no results" -msgstr "Peeji ahụ enweghị nsonaazụ ọ bụla" - -msgid "Enter a valid value." -msgstr "Tinye uru zuru oke." - -msgid "Enter a valid URL." -msgstr "Tinye URL zuru oke." - -msgid "Enter a valid integer." -msgstr "Tinye nọmba zuru oke." - -msgid "Enter a valid email address." -msgstr "Tinye adreesị ozi ịntanetị n'zuru oke." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Tinye “slug” zuru oke nke mejupụtara mkpụrụedemede, ọnụọgụ, underscores ma ọ " -"bụ hyphens." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Tinye “slug” zuru oke nke mejupụtara Unicode mkpụrụedemede, ọnụọgụ, " -"underscores ma ọ bụ hyphens." - -msgid "Enter a valid IPv4 address." -msgstr "Tinye adreesị IPv4 zuru oke." - -msgid "Enter a valid IPv6 address." -msgstr "Tinye adreesị IPv6 zuru oke." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Tinye adreesị IPv4 ma obu IPv6 zuru oke." - -msgid "Enter only digits separated by commas." -msgstr "Tinye naanị ọnụọgụ kewapụrụ site na comma." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Gbaa mbọ hụ na %(limit_value)s (ọ bụ %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Gbaa mbọ hụ na orughị ma ọ bụ hara nhata %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Gbaa mbọ hụ na okarịa ma ọ bụ hara nhata%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Gbaa mbọ hụ na a nwere opekata mpe %(limit_value)d odide (o nwere " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Gbaa mbọ hụ na a nwere kacha %(limit_value)d odide (o nwere%(show_value)d)." - -msgid "Enter a number." -msgstr "Tinye nọmba." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Gbaa mbọ hụ na ọ dighi karịrị %(max)s nọmba na mkpokọta." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Gbaa mbọ hụ na ọ dighi karịrị %(max)s na ebe ntụpọ." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Gbaa mbọ hụ na ọ dighi karịrị %(max)s nọmba tupu akụkụ ebe ntụpọ." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Ndọtị Faịlị “%(extension)s”anaghị anabata. Ndọtị nke kwere n'nabata bu: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Anabataghị ihe odide n'enweghị isi." - -msgid "and" -msgstr "na" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s ya na nke a %(field_labels)s dị adị." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Nọmba %(value)r abụghị ezigbo nhọrọ." - -msgid "This field cannot be null." -msgstr "Ebe a enweghị ike ịbụ ihe efu." - -msgid "This field cannot be blank." -msgstr "Ebe a enweghị ike ịbụ ohere efu." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s ya na nke a %(field_label)s dị adi." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s ga-abụ ihe pụrụ iche maka %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Ebe a nke ụdị: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” uru a ga-abụrịrị Eziokwu ma ọ bụ Ugha." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s”uru a ga-abụrịrị Eziokwu, Ugha, ma ọ bụ Onweghị." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Eziokwu ma o bụ Ugha)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (ruo %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Rikom-kewapụrụ nomba" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị YYYY-MM-" -"DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s”uru a nwere usoro ziri ezi (YYYY-MM-DD) mana ọ bụ ụbọchị n'abaghị " -"uru." - -msgid "Date (without time)" -msgstr "Ubọchị (na-enweghị oge)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị YYYY-MM-" -"DD HH:MM[:ss[.uuuuuu]][TZ] usoro. " - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s”uru a nwere usoro ziri ezi (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ])mana ọ bụ ụbọchị n'abaghị uru." - -msgid "Date (with time)" -msgstr "Ubọchị (na oge)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” uru a ga-abụrịrị nọmba ntụpọ." - -msgid "Decimal number" -msgstr "Nọmba ntụpọ." - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s”uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị [DD] " -"[[HH:]MM:]ss[.uuuuuu]usoro." - -msgid "Duration" -msgstr "Oge ole" - -msgid "Email address" -msgstr "Adreesị ozi ịntanetị" - -msgid "File path" -msgstr "Uzọ Faịlụ di" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s”uru a ga-abụrịrị float." - -msgid "Floating point number" -msgstr "Nọmba ebe floating no " - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” uru a ga-abụrịrị onu ogugu" - -msgid "Integer" -msgstr "Onu ogugu" - -msgid "Big (8 byte) integer" -msgstr "Onu ogugu (8 byte) nnukwu" - -msgid "IPv4 address" -msgstr "Adreesị IPv4" - -msgid "IP address" -msgstr "Adreesị IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s”uru a ga-abụrịrị na Odighị, Eziokwu ma ọ bụ.Ugha." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Ihe a ga abụriri eziokwu, ụgha ma ọ bu na onweghi)" - -msgid "Positive big integer" -msgstr "Nnukwu nomba nke oma" - -msgid "Positive integer" -msgstr "Nọmba nke oma" - -msgid "Positive small integer" -msgstr "Obere nọmba nke oma" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (ruo %(max_length)s)" - -msgid "Small integer" -msgstr "Onu ogugu nke obere" - -msgid "Text" -msgstr "Ederede" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị HH:MM[:" -"ss[.uuuuuu]]usoro." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” uru a nwere usoro ziri ezi (HH:MM[:ss[.uuuuuu]]) mana ọ bu oge " -"n'abaghị uru." - -msgid "Time" -msgstr "Oge" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Raw binary data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s”abụghị UUID n’kwesịrị ekwesị." - -msgid "Universally unique identifier" -msgstr "Universally unique identifier" - -msgid "File" -msgstr "Faịlụ" - -msgid "Image" -msgstr "Foto" - -msgid "A JSON object" -msgstr "Ihe JSON" - -msgid "Value must be valid JSON." -msgstr "Uru a ga-abụrịrị JSON n’kwesịrị ekwesị." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s dịka %(field)s %(value)r adịghị adị." - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (ụdị kpebiri site na mpaghara metụtara)" - -msgid "One-to-one relationship" -msgstr "Mmekọrịta otu-na-otu" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s mmekọrịta" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s mmekọrịta" - -msgid "Many-to-many relationship" -msgstr "Mmekọrịta otutu-na-otutu" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ebe a kwesiri ekwesi." - -msgid "Enter a whole number." -msgstr "Tinye nọmba onu ogugu." - -msgid "Enter a valid date." -msgstr "Tinye ụbọchị zuru oke." - -msgid "Enter a valid time." -msgstr "Tinye oge zuru oke." - -msgid "Enter a valid date/time." -msgstr "Tinye ụbọchị / oge zuru oke" - -msgid "Enter a valid duration." -msgstr "Tinye oge onuno zuru oke." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Onu ogugu ubochi a gha aburiri n’agbata {min_days} na {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Onweghi faịlụ a debanyere. Lee ụdị encoding a ntinye na ederede." - -msgid "No file was submitted." -msgstr "E nweghị faịlụ e watara" - -msgid "The submitted file is empty." -msgstr "O nweghị ihe dị n'ime faịlụ e wetara" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Gbaa mbọ hụ na aha faịlụ a nwere kacha %(max)d odide (o nwere %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Biko nyefee faịlụ a ma ọ bụ tinye akara na igbe akara, ọ bụghị ha abụọ." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Bugote foto n’zuru oke. Faịlụ a ị bugoro abụghị foto ma ọ bụ foto rụrụ arụ." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Họrọ ezigbo nhọrọ. %(value)sabụghị otu nhọrọ n'ime nke dịnụ." - -msgid "Enter a list of values." -msgstr "Tinye ndepụta nke ụkpụrụ." - -msgid "Enter a complete value." -msgstr "Tinye uru zuru okè" - -msgid "Enter a valid UUID." -msgstr "Tinye UUID kwesịrị ekwesị" - -msgid "Enter a valid JSON." -msgstr "Tinye JSON kwesịrị ekwesị" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Ebe ezoro ezo%(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Data ManagementForm na-efu efu ma ọ bụ a kpara ya aka" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Biko nyefee %d ma ọ bụ fomụ di ole na ole." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Biko nyefee%d ma ọ bụ fomụ karịrị otu ahụ" - -msgid "Order" -msgstr "Usoro" - -msgid "Delete" -msgstr "Hichapụ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Biko dozie data oji abuo a maka %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Biko dozie data oji abuo a maka %(field)s, nke gha diriri iche." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Biko dozie data oji abuo a maka %(field_name)s nke gha diriri iche maka " -"%(lookup)s n'ime %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Biko dozie uru oji abuo nke no n'okpuru." - -msgid "The inline value did not match the parent instance." -msgstr "Uru inline a adabaghị na parent instance." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Họrọ ezigbo nhọrọ. Nhọrọ a abụghị otu nhọrọ dịnụ." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "%(pk)sabụghi uru kwesịrị ekwesị" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s enweghị ike ịkọwa na mpaghara oge %(current_timezone)s; onwere " -"ike iju anya ma obu ọ gaghị adị." - -msgid "Clear" -msgstr "Kpochapu" - -msgid "Currently" -msgstr "Ugbu a" - -msgid "Change" -msgstr "Gbanwee" - -msgid "Unknown" -msgstr "Ihe N’amaghi" - -msgid "Yes" -msgstr "Ee" - -msgid "No" -msgstr "Mba" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ee, mba, nwere ike" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "etiti Abalị" - -msgid "noon" -msgstr "Ehihie" - -msgid "Monday" -msgstr "Mọnde" - -msgid "Tuesday" -msgstr "Tiuzdee" - -msgid "Wednesday" -msgstr "Wenezdee" - -msgid "Thursday" -msgstr "Tọọzdee" - -msgid "Friday" -msgstr "Fraịdee" - -msgid "Saturday" -msgstr "Satọdee" - -msgid "Sunday" -msgstr "Mbọsi Uka" - -msgid "Mon" -msgstr "Mọnde" - -msgid "Tue" -msgstr "Tiu" - -msgid "Wed" -msgstr "Wen" - -msgid "Thu" -msgstr "Tọọ" - -msgid "Fri" -msgstr "Fraị" - -msgid "Sat" -msgstr "Sat" - -msgid "Sun" -msgstr "Ụka" - -msgid "January" -msgstr "Jenụwarị" - -msgid "February" -msgstr "Febrụwarị" - -msgid "March" -msgstr "Maachị" - -msgid "April" -msgstr "Eprel" - -msgid "May" -msgstr "Mee" - -msgid "June" -msgstr "Juun" - -msgid "July" -msgstr "Julaị" - -msgid "August" -msgstr "Ọgọọst" - -msgid "September" -msgstr "Septemba" - -msgid "October" -msgstr "Ọktoba" - -msgid "November" -msgstr "Novemba" - -msgid "December" -msgstr "Disemba" - -msgid "jan" -msgstr "jen" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "maa" - -msgid "apr" -msgstr "epr" - -msgid "may" -msgstr "mee" - -msgid "jun" -msgstr "juu" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ọgọ" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "ọkt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dis" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jenụwarị" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Maachị" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Eprel" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mee" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julaị" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ọgọ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Ọkt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dis." - -msgctxt "alt. month" -msgid "January" -msgstr "Jenụwarị" - -msgctxt "alt. month" -msgid "February" -msgstr "Febrụwarị" - -msgctxt "alt. month" -msgid "March" -msgstr "Maachị" - -msgctxt "alt. month" -msgid "April" -msgstr "Eprel" - -msgctxt "alt. month" -msgid "May" -msgstr "Mee" - -msgctxt "alt. month" -msgid "June" -msgstr "Juun" - -msgctxt "alt. month" -msgid "July" -msgstr "Julaị" - -msgctxt "alt. month" -msgid "August" -msgstr "Ọgọọst" - -msgctxt "alt. month" -msgid "September" -msgstr "Septemba" - -msgctxt "alt. month" -msgid "October" -msgstr "Ọktoba" - -msgctxt "alt. month" -msgid "November" -msgstr "Novemba" - -msgctxt "alt. month" -msgid "December" -msgstr "Disemba" - -msgid "This is not a valid IPv6 address." -msgstr "Nke a abaghị adresị IPv6 zuru oke." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ma obu" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d afọ" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%dọnwa" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d izu" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d ụbọchị" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d awa" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d nkeji" - -msgid "Forbidden" -msgstr "Amachibidoro" - -msgid "CSRF verification failed. Request aborted." -msgstr "Nyocha CSRF emeghị nke ọma. Ajuju atọrọ.." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"I na-ahụ ozi a n'ihi na saịtị HTTPS a chọrọ “Onye isi okwu” ka ihe nchọgharị " -"weebụ gị zitere gị, mana onweghi nke zitere. Achọrọ isi ihe a maka ebumnuche " -"nchekwa, iji jide n’aka na ndị ọzọ anaghị egbochi ihe nchọgharị gị." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ọ bụrụ na ihazila ihe nchọgharị gị iji gbanyụọ ndị na-eji “ndị nnọchianya”, " -"biko jisie iketiachi ya, ma ọ dịkarịa maka saịtị a, ma ọ bụ maka njikọ " -"HTTPS, ma ọ bụ maka a arịrịọ “otu ụdị”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ọ bụrụ na ị na-eji akara " -"mmado ma ọ bụ gụnyere isi nke \"Iwu-Onye na gba ama: neweghị onye na-gba ama" -"\", biko wepu ha. Nchedo CSRF chọrọ ka isi “onye na gba ama” wee mee nyocha " -"ike nlele nke gbara ama. Ọ bụrụ na ihe gbasara gị gbasara nzuzo, jiri ụzọ " -"ọzọ dị ka njikọ maka saịtị ndị ọzọ." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"I na-ahụ ozi a n'ihi na saịtị a chọrọ CSRF cookie mgbe ị na-edobe akwụkwọ. " -"Achọrọ cookie a maka ebumnuche nchekwa, iji hụ na ndị ọzọ anaghị egbochi ihe " -"nchọgharị gị." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ọ bụrụ na ịhazila ihe nchọgharị gị iji gbanyụọ kuki, biko tiachi ya ka o na " -"ruo oru, opekata mpe maka saịtị a, ma ọ bụ maka “otu ụdị\"." - -msgid "More information is available with DEBUG=True." -msgstr "Ihe omuma ndi ozo di na DEBUG = Eziokwu." - -msgid "No year specified" -msgstr "Ọ dịghị afọ akọwapụtara" - -msgid "Date out of range" -msgstr "Ubọchị a puru na usoro" - -msgid "No month specified" -msgstr "Onweghị ọnwa akọwapụtara" - -msgid "No day specified" -msgstr "Onweghi ụbọchị akọwapụtara" - -msgid "No week specified" -msgstr "Onweghi izu akọwapụtara" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr " %(verbose_name_plural)sadịghị" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Ọdịnihu %(verbose_name_plural)s adịghị adị n'ihi %(class_name)s.allow_future " -"bu ugha." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "String ụbọchị nabaghị uru “%(datestr)s” Ntọala enyere “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Mba %(verbose_name)s hụrụ ihe dabara na ajụjụ a" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Peeji a a-abụghị “nke ikpeazụ”, a pụghị ịgbanwe ya na int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Peeji na-abaghị uru (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tọgbọ chakoo ndepụta na “%(class_name)s.allow_empty” bụ Ugha." - -msgid "Directory indexes are not allowed here." -msgstr "Anaghị anabata directory indexes ebe a." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” a dịghị" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index of %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" -"Django: usoro Ntanetị maka ndị na-achọkarị izu okè ya na oge edetu imecha." - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Lee akwukwo e bipụtara maka Django" -"%(version)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Nwụnye ahụ dabara nke ọma! Ị mere nke ọma!" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"I na-ahụ peeji a n'ihi na DEBUG=True dị na faili setting gị mana ịhazibeghị URL ọ bụla." - -msgid "Django Documentation" -msgstr "Akwụkwọ Ederede Django" - -msgid "Topics, references, & how-to’s" -msgstr "Isiokwu, ntụaka, & otu esi-mee" - -msgid "Tutorial: A Polling App" -msgstr "Nkuzi: App Ntuli Aka" - -msgid "Get started with Django" -msgstr "Bido na Django" - -msgid "Django Community" -msgstr "Obodo Django" - -msgid "Connect, get help, or contribute" -msgstr "Jikọọ, nweta enyemaka, ma ọ bụ tinye aka." diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ig/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ig/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ig/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ig/formats.py deleted file mode 100644 index cb0b4de..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ig/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "P" -DATETIME_FORMAT = "j F Y P" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y", # '25.10.06' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/io/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index 79b81f4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/io/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index d14d544..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,1231 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viko Bartero , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "العربية" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Azərbaycanca" - -msgid "Bulgarian" -msgstr "български" - -msgid "Belarusian" -msgstr "беларуская" - -msgid "Bengali" -msgstr "বাংলা" - -msgid "Breton" -msgstr "Brezhoneg" - -msgid "Bosnian" -msgstr "босански" - -msgid "Catalan" -msgstr "Català" - -msgid "Czech" -msgstr "čeština" - -msgid "Welsh" -msgstr "Cymraeg" - -msgid "Danish" -msgstr "dansk" - -msgid "German" -msgstr "Deutsch" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Ελληνικά" - -msgid "English" -msgstr "English" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "British English" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español de Argentina" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Español de Venezuela" - -msgid "Estonian" -msgstr "Eesti" - -msgid "Basque" -msgstr "Euskara" - -msgid "Persian" -msgstr "فارسی" - -msgid "Finnish" -msgstr "Suomi" - -msgid "French" -msgstr "Français" - -msgid "Frisian" -msgstr "Frysk" - -msgid "Irish" -msgstr "Gaeilge" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Galego" - -msgid "Hebrew" -msgstr "עברית" - -msgid "Hindi" -msgstr "हिन्दी" - -msgid "Croatian" -msgstr "hrvatski" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Magyar" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Bahasa Indonesia" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Íslenska" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "日本語" - -msgid "Georgian" -msgstr "ქართული" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Қазақша" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannaḍa" - -msgid "Korean" -msgstr "한국어" - -msgid "Luxembourgish" -msgstr "Lëtzebuergesch" - -msgid "Lithuanian" -msgstr "Lietuvių" - -msgid "Latvian" -msgstr "Latviešu" - -msgid "Macedonian" -msgstr "Македонски" - -msgid "Malayalam" -msgstr "മലയാളം" - -msgid "Mongolian" -msgstr "Монгол" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "Burmese" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "नेपाली" - -msgid "Dutch" -msgstr "Nederlands" - -msgid "Norwegian Nynorsk" -msgstr "Norsk nynorsk" - -msgid "Ossetic" -msgstr "Ossetic" - -msgid "Punjabi" -msgstr "ਪੰਜਾਬੀ" - -msgid "Polish" -msgstr "Polski" - -msgid "Portuguese" -msgstr "Português" - -msgid "Brazilian Portuguese" -msgstr "Português do Brasil" - -msgid "Romanian" -msgstr "Română" - -msgid "Russian" -msgstr "Русский" - -msgid "Slovak" -msgstr "Slovenčina" - -msgid "Slovenian" -msgstr "Slovenščina" - -msgid "Albanian" -msgstr "Shqip" - -msgid "Serbian" -msgstr "Српски / srpski" - -msgid "Serbian Latin" -msgstr "Serbian Latin" - -msgid "Swedish" -msgstr "Svenska" - -msgid "Swahili" -msgstr "Kiswahili" - -msgid "Tamil" -msgstr "தமிழ்" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Thai" -msgstr "ไทย" - -msgid "Turkish" -msgstr "Türkçe" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Удмурт" - -msgid "Ukrainian" -msgstr "Українська" - -msgid "Urdu" -msgstr "اُردُو" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Tiếng Việt" - -msgid "Simplified Chinese" -msgstr "简体中文" - -msgid "Traditional Chinese" -msgstr "繁體中文" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Skribez valida datumo." - -msgid "Enter a valid URL." -msgstr "Skribez valida URL." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Skribez valida e-posto adreso." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Skribez valida IPv4 adreso." - -msgid "Enter a valid IPv6 address." -msgstr "Skribez valida IPv6 adreso." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Skribez valida adreso IPv4 od IPv6." - -msgid "Enter only digits separated by commas." -msgstr "Skribez nur cifri separata per komi." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Verifikez ke ica datumo esas %(limit_value)s (olu esas %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Verifikez ke ica datumo esas minora kam od egala a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Verifikez ke ica datumo esas majora kam od egala a %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Verifikez ke ica datumo havas %(limit_value)d litero adminime (olu havas " -"%(show_value)d)." -msgstr[1] "" -"Verifikez ke ica datumo havas %(limit_value)d literi adminime (olu havas " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Verifikez ke ica datumo havas %(limit_value)d litero admaxime (olu havas " -"%(show_value)d)." -msgstr[1] "" -"Verifikez ke ica datumo havas %(limit_value)d literi admaxime (olu havas " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Skribez numero." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Ica feldo ne povas esar nula." - -msgid "This field cannot be blank." -msgstr "Ica feldo ne povas esar vakua." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "La %(model_name)s kun ica %(field_label)s ja existas." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Feldo de tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Booleano (True o False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (til %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Integri separata per komi" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Dato (sen horo)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Dato (kun horo)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Decimala numero" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "E-postala adreso" - -msgid "File path" -msgstr "Arkivo voyo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Glitkomo numero" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Integro" - -msgid "Big (8 byte) integer" -msgstr "Granda (8 byte) integro" - -msgid "IPv4 address" -msgstr "IPv4 adreso" - -msgid "IP address" -msgstr "IP adreso" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (True, False o None)" - -msgid "Positive integer" -msgstr "Positiva integro" - -msgid "Positive small integer" -msgstr "Positiva mikra integro" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (til %(max_length)s)" - -msgid "Small integer" -msgstr "Mikra integro" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Horo" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Kruda binara datumo" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Arkivo" - -msgid "Image" -msgstr "Imajo" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Exterklefo (la tipo esas determinata per la relatata feldo)" - -msgid "One-to-one relationship" -msgstr "Un-ad-un parenteso" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Multi-a-multi parenteso" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Ica feldo esas obligata." - -msgid "Enter a whole number." -msgstr "Skribez kompleta numero" - -msgid "Enter a valid date." -msgstr "Skribez valida dato." - -msgid "Enter a valid time." -msgstr "Skribez valida horo." - -msgid "Enter a valid date/time." -msgstr "Skribez valida dato/horo." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nula arkivo sendesis. Verifikez la kodexigo tipo en la formulario." - -msgid "No file was submitted." -msgstr "Nula arkivo sendesis." - -msgid "The submitted file is empty." -msgstr "La sendita arkivo esas vakua." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Verifikez ke ica dosiero nomo havas %(max)d skribsigno admaxime (olu havas " -"%(length)d)." -msgstr[1] "" -"Verifikez ke ica arkivo nomo havas %(max)d skribsigni admaxime (olu havas " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Sendez arkivo o markizez la vakua markbuxo, ne la du." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Kargez valida imajo. La arkivo qua vu kargis ne esis imajo od esis defektiva." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Selektez valida selekto. %(value)s ne esas un de la disponebla selekti." - -msgid "Enter a list of values." -msgstr "Skribez listo de datumi." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Okulta feldo %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Ordinar" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Koretigez duopligata datumi por %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Korektigez la duopligata datumi por %(field)s, qui mustas esar unika." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Korektigez la duopligata datumi por %(field_name)s qui mustas esar unika por " -"la %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Korektigez la duopligata datumi infre." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Selektez valida selekto. Ita selekto ne esas un de la disponebla selekti." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Vakuigar" - -msgid "Currently" -msgstr "Aktuale" - -msgid "Change" -msgstr "Modifikar" - -msgid "Unknown" -msgstr "Nekonocata" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "yes,no,forsan" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "noktomezo" - -msgid "noon" -msgstr "dimezo" - -msgid "Monday" -msgstr "Lundio" - -msgid "Tuesday" -msgstr "Mardio" - -msgid "Wednesday" -msgstr "Merkurdio" - -msgid "Thursday" -msgstr "Jovdio" - -msgid "Friday" -msgstr "Venerdio" - -msgid "Saturday" -msgstr "Saturdio" - -msgid "Sunday" -msgstr "Sundio" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mer" - -msgid "Thu" -msgstr "Jov" - -msgid "Fri" -msgstr "Ven" - -msgid "Sat" -msgstr "Sat" - -msgid "Sun" -msgstr "Sun" - -msgid "January" -msgstr "Januaro" - -msgid "February" -msgstr "Februaro" - -msgid "March" -msgstr "Marto" - -msgid "April" -msgstr "Aprilo" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septembro" - -msgid "October" -msgstr "Oktobro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Decembro" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marto" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprilo" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januaro" - -msgctxt "alt. month" -msgid "February" -msgstr "Februaro" - -msgctxt "alt. month" -msgid "March" -msgstr "Marto" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprilo" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septembro" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktobro" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembro" - -msgctxt "alt. month" -msgid "December" -msgstr "Decembro" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d yaro" -msgstr[1] "%d yari" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d monato" -msgstr[1] "%d monati" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semano" -msgstr[1] "%d semani" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dio" -msgstr[1] "%d dii" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d horo" -msgstr[1] "%d hori" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minuti" - -msgid "0 minutes" -msgstr "0 minuti" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "La yaro ne specizigesis" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "La monato ne specizigesis" - -msgid "No day specified" -msgstr "La dio ne specizigesis" - -msgid "No week specified" -msgstr "La semano ne specizigesis" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ne esas %(verbose_name_plural)s disponebla" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"La futura %(verbose_name_plural)s ne esas disponebla pro ke %(class_name)s." -"allow_future esas False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Onu ne permisas direktorio indexi hike." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indexi di %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index 951078f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/is/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index be73f3d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,1302 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# db999e1e0e51ac90b00482cb5db0f98b_32999f5 <3ec5202d5df408dd2f95d8c361fed970_5926>, 2011 -# Hafsteinn Einarsson , 2011-2012 -# Jannis Leidel , 2011 -# Matt R, 2018 -# saevarom , 2011 -# saevarom , 2013,2015 -# Thordur Sigurdsson , 2016-2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-18 21:19+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -msgid "Afrikaans" -msgstr "Afríkanska" - -msgid "Arabic" -msgstr "Arabíska" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Astúríska" - -msgid "Azerbaijani" -msgstr "Aserbaídsjíska" - -msgid "Bulgarian" -msgstr "Búlgarska" - -msgid "Belarusian" -msgstr "Hvítrússneska" - -msgid "Bengali" -msgstr "Bengalska" - -msgid "Breton" -msgstr "Bretónska" - -msgid "Bosnian" -msgstr "Bosníska" - -msgid "Catalan" -msgstr "Katalónska" - -msgid "Czech" -msgstr "Tékkneska" - -msgid "Welsh" -msgstr "Velska" - -msgid "Danish" -msgstr "Danska" - -msgid "German" -msgstr "Þýska" - -msgid "Lower Sorbian" -msgstr "Neðri sorbíska" - -msgid "Greek" -msgstr "Gríska" - -msgid "English" -msgstr "Enska" - -msgid "Australian English" -msgstr "Áströlsk enska" - -msgid "British English" -msgstr "Bresk enska" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spænska" - -msgid "Argentinian Spanish" -msgstr "Argentínsk spænska" - -msgid "Colombian Spanish" -msgstr "Kólumbísk spænska" - -msgid "Mexican Spanish" -msgstr "Mexíkósk spænska" - -msgid "Nicaraguan Spanish" -msgstr "Níkaragva spænska" - -msgid "Venezuelan Spanish" -msgstr "Venesúelsk spænska" - -msgid "Estonian" -msgstr "Eistneska" - -msgid "Basque" -msgstr "Baskneska" - -msgid "Persian" -msgstr "Persneska" - -msgid "Finnish" -msgstr "Finnska" - -msgid "French" -msgstr "Franska" - -msgid "Frisian" -msgstr "Frísneska" - -msgid "Irish" -msgstr "Írska" - -msgid "Scottish Gaelic" -msgstr "Skosk gelíska" - -msgid "Galician" -msgstr "Galíska" - -msgid "Hebrew" -msgstr "Hebreska" - -msgid "Hindi" -msgstr "Hindí" - -msgid "Croatian" -msgstr "Króatíska" - -msgid "Upper Sorbian" -msgstr "Efri sorbíska" - -msgid "Hungarian" -msgstr "Ungverska" - -msgid "Armenian" -msgstr "Armenska" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indónesíska" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Íslenska" - -msgid "Italian" -msgstr "Ítalska" - -msgid "Japanese" -msgstr "Japanska" - -msgid "Georgian" -msgstr "Georgíska" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kasakska" - -msgid "Khmer" -msgstr "Kmeríska" - -msgid "Kannada" -msgstr "Kannadanska" - -msgid "Korean" -msgstr "Kóreska" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Lúxemborgíska" - -msgid "Lithuanian" -msgstr "Litháenska" - -msgid "Latvian" -msgstr "Lettneska" - -msgid "Macedonian" -msgstr "Makedónska" - -msgid "Malayalam" -msgstr "Malajalamska" - -msgid "Mongolian" -msgstr "Mongólska" - -msgid "Marathi" -msgstr "Maratí" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Búrmíska" - -msgid "Norwegian Bokmål" -msgstr "Norskt bókmál" - -msgid "Nepali" -msgstr "Nepalska" - -msgid "Dutch" -msgstr "Hollenska" - -msgid "Norwegian Nynorsk" -msgstr "Nýnorska" - -msgid "Ossetic" -msgstr "Ossetíska" - -msgid "Punjabi" -msgstr "Púndjabíska" - -msgid "Polish" -msgstr "Pólska" - -msgid "Portuguese" -msgstr "Portúgalska" - -msgid "Brazilian Portuguese" -msgstr "Brasilísk portúgalska" - -msgid "Romanian" -msgstr "Rúmenska" - -msgid "Russian" -msgstr "Rússneska" - -msgid "Slovak" -msgstr "Slóvakíska" - -msgid "Slovenian" -msgstr "Slóvenska" - -msgid "Albanian" -msgstr "Albanska" - -msgid "Serbian" -msgstr "Serbneska" - -msgid "Serbian Latin" -msgstr "Serbnesk latína" - -msgid "Swedish" -msgstr "Sænska" - -msgid "Swahili" -msgstr "Svahílí" - -msgid "Tamil" -msgstr "Tamílska" - -msgid "Telugu" -msgstr "Telúgúska" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tælenska" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Tyrkneska" - -msgid "Tatar" -msgstr "Tataríska" - -msgid "Udmurt" -msgstr "Údmúrt" - -msgid "Ukrainian" -msgstr "Úkraínska" - -msgid "Urdu" -msgstr "Úrdú" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Víetnamska" - -msgid "Simplified Chinese" -msgstr "Einfölduð kínverska " - -msgid "Traditional Chinese" -msgstr "Hefðbundin kínverska" - -msgid "Messages" -msgstr "Skilaboð" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Þetta síðunúmer er ekki heiltala" - -msgid "That page number is less than 1" -msgstr "Þetta síðunúmer er minna en 1" - -msgid "That page contains no results" -msgstr "Þessi síða hefur engar niðurstöður" - -msgid "Enter a valid value." -msgstr "Sláðu inn gilt gildi." - -msgid "Enter a valid URL." -msgstr "Sláðu inn gilt veffang (URL)." - -msgid "Enter a valid integer." -msgstr "Sláðu inn gilda heiltölu." - -msgid "Enter a valid email address." -msgstr "Sláðu inn gilt netfang." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Settu inn gildan vefslóðartitil sem samanstendur af latneskum bókstöfum, " -"númerin, undirstrikum og bandstrikum." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Settu inn gildan vefslóðartitil sem má innihalda unicode bókstafi, " -"tölustafi, undirstrik og bandstrik." - -msgid "Enter a valid IPv4 address." -msgstr "Sláðu inn gilda IPv4 tölu." - -msgid "Enter a valid IPv6 address." -msgstr "Sláðu inn gilt IPv6 vistfang." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Sláðu inn gilt IPv4 eða IPv6 vistfang." - -msgid "Enter only digits separated by commas." -msgstr "Skrifaðu einungis tölur aðskildar með kommum." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Gakktu úr skugga um að gildi sé %(limit_value)s (það er %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Gakktu úr skugga um að gildið sé minna en eða jafnt og %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Gakktu úr skugga um að gildið sé stærra en eða jafnt og %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Gildið má minnst vera %(limit_value)d stafur að lengd (það er %(show_value)d " -"nú)" -msgstr[1] "" -"Gildið má minnst vera %(limit_value)d stafir að lengd (það er %(show_value)d " -"nú)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Gildið má mest vera %(limit_value)d stafur að lengd (það er %(show_value)d " -"nú)" -msgstr[1] "" -"Gildið má mest vera %(limit_value)d stafir að lengd (það er %(show_value)d " -"nú)" - -msgid "Enter a number." -msgstr "Sláðu inn tölu." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Gildið má ekki hafa fleiri en %(max)s tölu." -msgstr[1] "Gildið má ekki hafa fleiri en %(max)s tölur." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Gildið má ekki hafa meira en %(max)s tugatölustaf (decimal places)." -msgstr[1] "" -"Gildið má ekki hafa meira en %(max)s tugatölustafi (decimal places)." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Gildið má ekki hafa fleiri en %(max)s tölu fyrir tugabrotskil." -msgstr[1] "Gildið má ekki hafa fleiri en %(max)s tölur fyrir tugabrotskil." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Skrár með endingunni „%(extension)s“ eru ekki leyfðar. Leyfilegar endingar " -"eru: „%(allowed_extensions)s“„." - -msgid "Null characters are not allowed." -msgstr "Núlltákn eru ekki leyfileg." - -msgid "and" -msgstr "og" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s með þessi %(field_labels)s er nú þegar til." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Gildið %(value)r er ógilt." - -msgid "This field cannot be null." -msgstr "Þessi reitur getur ekki haft tómgildi (null)." - -msgid "This field cannot be blank." -msgstr "Þessi reitur má ekki vera tómur." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s með þetta %(field_label)s er nú þegar til." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s verður að vera einkvæmt fyrir %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Reitur af gerð: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "„%(value)s“ verður að vera annaðhvort satt eða ósatt." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "„%(value)s“ verður að vera eitt eftirtalinna: True, False eða None." - -msgid "Boolean (Either True or False)" -msgstr "Boole-gildi (True eða False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Strengur (mest %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Heiltölur aðgreindar með kommum" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"„%(value)s“ er ógilt dagsetningarsnið. Það verður að vera á sniðinu YYYY-MM-" -"DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "„%(value)s“ hefur rétt snið (YYYY-MM-DD) en dagsetningin er ógild." - -msgid "Date (without time)" -msgstr "Dagsetning (án tíma)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"„%(value)s“ hefur ógilt snið. Það verður að vera á sniðinu: YYYY-MM-DD HH:" -"MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"„%(value)s“ hefur rétt snið (YYYY-MM-DD HH:MM [:ss[.uuuuuu]][TZ]) en það er " -"ógild dagsetning/tími." - -msgid "Date (with time)" -msgstr "Dagsetning (með tíma)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "„%(value)s“ verður að vera heiltala." - -msgid "Decimal number" -msgstr "Tugatala" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"„%(value)s“ er á ógildu sniði. Það verður að vera á sniðinu [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Tímalengd" - -msgid "Email address" -msgstr "Netfang" - -msgid "File path" -msgstr "Skjalaslóð" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "„%(value)s“ verður að vera fleytitala." - -msgid "Floating point number" -msgstr "Fleytitala (floating point number)" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Gildi „%(value)s“ verður að vera heiltala." - -msgid "Integer" -msgstr "Heiltala" - -msgid "Big (8 byte) integer" -msgstr "Stór (8 bæta) heiltala" - -msgid "Small integer" -msgstr "Lítil heiltala" - -msgid "IPv4 address" -msgstr "IPv4 vistfang" - -msgid "IP address" -msgstr "IP tala" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "„%(value)s“ verður að vera eitt eftirtalinna: None, True eða False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boole-gildi (True, False eða None)" - -msgid "Positive big integer" -msgstr "Jákvæð stór heiltala" - -msgid "Positive integer" -msgstr "Jákvæð heiltala" - -msgid "Positive small integer" -msgstr "Jákvæð lítil heiltala" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slögg (allt að %(max_length)s)" - -msgid "Text" -msgstr "Texti" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"„%(value)s“ er á ógildu sniði. Það verður að vera á sniðinu HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"„%(value)s“ er á réttu sniði (HH:MM[:ss[.uuuuuu]]), en það er ógild " -"dagsetning/tími." - -msgid "Time" -msgstr "Tími" - -msgid "URL" -msgstr "Veffang" - -msgid "Raw binary data" -msgstr "Hrá tvíundargögn (binary data)" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "„%(value)s“ er ekki gilt UUID." - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Skrá" - -msgid "Image" -msgstr "Mynd" - -msgid "A JSON object" -msgstr "JSON hlutur" - -msgid "Value must be valid JSON." -msgstr "Gildi verður að vera gilt JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s hlutur með %(field)s %(value)r er ekki til." - -msgid "Foreign Key (type determined by related field)" -msgstr "Ytri lykill (Gerð ákveðin af skyldum reit)" - -msgid "One-to-one relationship" -msgstr "Einn-á-einn samband." - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s samband" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s sambönd" - -msgid "Many-to-many relationship" -msgstr "Margir-til-margra samband." - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Þennan reit þarf að fylla út." - -msgid "Enter a whole number." -msgstr "Sláðu inn heiltölu." - -msgid "Enter a valid date." -msgstr "Sláðu inn gilda dagsetningu." - -msgid "Enter a valid time." -msgstr "Sláðu inn gilda tímasetningu." - -msgid "Enter a valid date/time." -msgstr "Sláðu inn gilda dagsetningu ásamt tíma." - -msgid "Enter a valid duration." -msgstr "Sláðu inn gilt tímabil." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Fjöldi daga verður að vera á milli {min_days} og {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Engin skrá var send. Athugaðu kótunartegund á forminu (encoding type)." - -msgid "No file was submitted." -msgstr "Engin skrá var send." - -msgid "The submitted file is empty." -msgstr "Innsend skrá er tóm." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Skráarnafnið má mest vera %(max)d stafur að lengd (það er %(length)d nú)" -msgstr[1] "" -"Skráarnafnið má mest vera %(max)d stafir að lengd (það er %(length)d nú)" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Vinsamlegast sendu annað hvort inn skrá eða merktu í boxið, ekki bæði." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Halaðu upp gildri myndskrá. Skráin sem þú halaðir upp var annað hvort gölluð " -"eða ekki mynd." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Veldu gildan valmöguleika. %(value)s er ekki eitt af gildum valmöguleikum." - -msgid "Enter a list of values." -msgstr "Sláðu inn lista af gildum." - -msgid "Enter a complete value." -msgstr "Sláðu inn heilt gildi." - -msgid "Enter a valid UUID." -msgstr "Sláðu inn gilt UUID." - -msgid "Enter a valid JSON." -msgstr "Sláðu inn gilt JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Falinn reitur %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Vinsamlegast sendu ekki meira en %d form." -msgstr[1] "Vinsamlegast sendu ekki meira en %d form." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Vinsamlegast sendu að minnsta kosta %d form." -msgstr[1] "Vinsamlegast sendu að minnsta kosta %d form." - -msgid "Order" -msgstr "Röð" - -msgid "Delete" -msgstr "Eyða" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Vinsamlegast leiðréttu tvítekin gögn í reit %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Vinsamlegast lagfærðu gögn í reit %(field)s, sem verða að vera einstök." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Vinsamlegast leiðréttu tvítekin gögn í reit %(field_name)s sem verða að vera " -"einstök fyrir %(lookup)s í %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Vinsamlegast lagfærðu tvítöldu gögnin fyrir neðan." - -msgid "The inline value did not match the parent instance." -msgstr "Innra gildið passar ekki við eiganda." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Veldu gildan valmöguleika. Valið virðist ekki vera eitt af gildum " -"valmöguleikum." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "„%(pk)s“ er ekki gilt gildi." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s er ekki hægt að túlka í tímabelti %(current_timezone)s, það " -"getur verið óljóst eða að það er ekki til." - -msgid "Clear" -msgstr "Hreinsa" - -msgid "Currently" -msgstr "Eins og er:" - -msgid "Change" -msgstr "Breyta" - -msgid "Unknown" -msgstr "Óþekkt" - -msgid "Yes" -msgstr "Já" - -msgid "No" -msgstr "Nei" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "já,nei,kannski" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bæti" -msgstr[1] "%(size)d bæti" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "eftirmiðdegi" - -msgid "a.m." -msgstr "morgun" - -msgid "PM" -msgstr "Eftirmiðdegi" - -msgid "AM" -msgstr "Morgun" - -msgid "midnight" -msgstr "miðnætti" - -msgid "noon" -msgstr "hádegi" - -msgid "Monday" -msgstr "mánudagur" - -msgid "Tuesday" -msgstr "þriðjudagur" - -msgid "Wednesday" -msgstr "miðvikudagur" - -msgid "Thursday" -msgstr "fimmtudagur" - -msgid "Friday" -msgstr "föstudagur" - -msgid "Saturday" -msgstr "laugardagur" - -msgid "Sunday" -msgstr "sunnudagur" - -msgid "Mon" -msgstr "mán" - -msgid "Tue" -msgstr "þri" - -msgid "Wed" -msgstr "mið" - -msgid "Thu" -msgstr "fim" - -msgid "Fri" -msgstr "fös" - -msgid "Sat" -msgstr "lau" - -msgid "Sun" -msgstr "sun" - -msgid "January" -msgstr "janúar" - -msgid "February" -msgstr "febrúar" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "apríl" - -msgid "May" -msgstr "maí" - -msgid "June" -msgstr "júní" - -msgid "July" -msgstr "júlí" - -msgid "August" -msgstr "ágúst" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "nóvember" - -msgid "December" -msgstr "desember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maí" - -msgid "jun" -msgstr "jún" - -msgid "jul" -msgstr "júl" - -msgid "aug" -msgstr "ágú" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nóv" - -msgid "dec" -msgstr "des" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mars" - -msgctxt "abbrev. month" -msgid "April" -msgstr "apríl" - -msgctxt "abbrev. month" -msgid "May" -msgstr "maí" - -msgctxt "abbrev. month" -msgid "June" -msgstr "júní" - -msgctxt "abbrev. month" -msgid "July" -msgstr "júlí" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ág." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nóv." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "des." - -msgctxt "alt. month" -msgid "January" -msgstr "janúar" - -msgctxt "alt. month" -msgid "February" -msgstr "febrúar" - -msgctxt "alt. month" -msgid "March" -msgstr "mars" - -msgctxt "alt. month" -msgid "April" -msgstr "apríl" - -msgctxt "alt. month" -msgid "May" -msgstr "maí" - -msgctxt "alt. month" -msgid "June" -msgstr "júní" - -msgctxt "alt. month" -msgid "July" -msgstr "júlí" - -msgctxt "alt. month" -msgid "August" -msgstr "ágúst" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "október" - -msgctxt "alt. month" -msgid "November" -msgstr "nóvember" - -msgctxt "alt. month" -msgid "December" -msgstr "desember" - -msgid "This is not a valid IPv6 address." -msgstr "Þetta er ekki gilt IPv6 vistfang." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "eða" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF auðkenning tókst ekki." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ef þú hefur stillt vafrann þinn til að gera „Referer“ hausa óvirka þarftu að " -"virkja þá aftur. Að minnsta kosti fyrir þetta vefsvæði, eða HTTPS tengingar " -"eða „same-origin“ fyrirspurnir." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Þú ert að fá þessi skilaboð því þetta vefsvæði þarfnast að CSRF kaka (e. " -"cookie) sé send þegar form eru send. Þessi kaka er nauðsynleg af " -"öryggisástæðum til að ganga úr skugga um að utanaðkomandi aðili sé ekki að " -"senda fyrirspurnir úr vafranum þínum." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ef þú hefur stillt vafrann þinn til að gera kökur óvirkar þarftu að virkja " -"þær aftur. Að minnsta kosti fyrir þetta vefsvæði eða „same-origin“ " -"fyrirspurnir." - -msgid "More information is available with DEBUG=True." -msgstr "Meiri upplýsingar fást með DEBUG=True." - -msgid "No year specified" -msgstr "Ekkert ár tilgreint" - -msgid "Date out of range" -msgstr "Dagsetning utan tímabils" - -msgid "No month specified" -msgstr "Enginn mánuður tilgreindur" - -msgid "No day specified" -msgstr "Enginn dagur tilgreindur" - -msgid "No week specified" -msgstr "Engin vika tilgreind" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ekkert %(verbose_name_plural)s í boði" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Framtíðar %(verbose_name_plural)s ekki í boði því %(class_name)s." -"allow_future er Ósatt." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ógilt snið dagsetningar „%(datestr)s“ gefið sniðið „%(format)s“" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Ekkert %(verbose_name)s sem uppfyllir skilyrði" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Þetta er hvorki síðasta síða, né er hægt að breyta í heiltölu." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ógild síða (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tómur listi og „%(class_name)s.allow_empty“ er Ósatt." - -msgid "Directory indexes are not allowed here." -msgstr "Möppulistar eru ekki leyfðir hér." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ er ekki til" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Innihald %(directory)s " - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Þú sérð þessa síðu vegna þess að þú hefur DEBUG=True í stillingunum þínum og hefur ekki sett upp " -"neinar vefslóðir." - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/is/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/is/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/is/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/is/formats.py deleted file mode 100644 index d0f71cf..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/is/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -# DATETIME_FORMAT = -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.n.Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/it/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index 991efbd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/it/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index 0f04b1c..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,1387 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrea Guerra, 2024 -# 0d21a39e384d88c2313b89b5042c04cb, 2017 -# Carlo Miron , 2011 -# Carlo Miron , 2014 -# Carlo Miron , 2018-2019 -# Davide Targa , 2021 -# Denis Darii , 2011 -# Emanuele Di Giacomo, 2021 -# Flavio Curella , 2013,2016 -# Jannis Leidel , 2011 -# Themis Savvidis , 2013 -# Luciano De Falco Alfano, 2016 -# Marco Bonetti, 2014 -# Mirco Grillo , 2018,2020 -# Nicola Larosa , 2013 -# palmux , 2014-2015,2017,2021 -# Paolo Melchiorre , 2022-2023 -# Mattia Procopio , 2015 -# Riccardo Magliocchetti , 2017 -# Stefano Brentegani , 2014-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Andrea Guerra, 2024\n" -"Language-Team: Italian (http://app.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabo" - -msgid "Algerian Arabic" -msgstr "Arabo Algerino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azero" - -msgid "Bulgarian" -msgstr "Bulgaro" - -msgid "Belarusian" -msgstr "Bielorusso" - -msgid "Bengali" -msgstr "Bengalese" - -msgid "Breton" -msgstr "Bretone" - -msgid "Bosnian" -msgstr "Bosniaco" - -msgid "Catalan" -msgstr "Catalano" - -msgid "Central Kurdish (Sorani)" -msgstr "Curdo centrale (Sorani)" - -msgid "Czech" -msgstr "Ceco" - -msgid "Welsh" -msgstr "Gallese" - -msgid "Danish" -msgstr "Danese" - -msgid "German" -msgstr "Tedesco" - -msgid "Lower Sorbian" -msgstr "Sorabo inferiore" - -msgid "Greek" -msgstr "Greco" - -msgid "English" -msgstr "Inglese" - -msgid "Australian English" -msgstr "Inglese Australiano" - -msgid "British English" -msgstr "Inglese britannico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spagnolo" - -msgid "Argentinian Spanish" -msgstr "Spagnolo Argentino" - -msgid "Colombian Spanish" -msgstr "Spagnolo Colombiano" - -msgid "Mexican Spanish" -msgstr "Spagnolo Messicano" - -msgid "Nicaraguan Spanish" -msgstr "Spagnolo Nicaraguense" - -msgid "Venezuelan Spanish" -msgstr "Spagnolo venezuelano" - -msgid "Estonian" -msgstr "Estone" - -msgid "Basque" -msgstr "Basco" - -msgid "Persian" -msgstr "Persiano" - -msgid "Finnish" -msgstr "Finlandese" - -msgid "French" -msgstr "Francese" - -msgid "Frisian" -msgstr "Frisone" - -msgid "Irish" -msgstr "Irlandese" - -msgid "Scottish Gaelic" -msgstr "Gaelico Scozzese" - -msgid "Galician" -msgstr "Galiziano" - -msgid "Hebrew" -msgstr "Ebraico" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croato" - -msgid "Upper Sorbian" -msgstr "Sorabo superiore" - -msgid "Hungarian" -msgstr "Ungherese" - -msgid "Armenian" -msgstr "Armeno" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesiano" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandese" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Giapponese" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "Cabilo" - -msgid "Kazakh" -msgstr "Kazako" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "Kirghiso" - -msgid "Luxembourgish" -msgstr "Lussemburghese" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Lettone" - -msgid "Macedonian" -msgstr "Macedone" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolo" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malese" - -msgid "Burmese" -msgstr "Birmano" - -msgid "Norwegian Bokmål" -msgstr "Norvegese Bokmål" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Olandese" - -msgid "Norwegian Nynorsk" -msgstr "Norvegese Nynorsk" - -msgid "Ossetic" -msgstr "Ossetico" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polacco" - -msgid "Portuguese" -msgstr "Portoghese" - -msgid "Brazilian Portuguese" -msgstr "Brasiliano Portoghese" - -msgid "Romanian" -msgstr "Rumeno" - -msgid "Russian" -msgstr "Russo" - -msgid "Slovak" -msgstr "Slovacco" - -msgid "Slovenian" -msgstr "Sloveno" - -msgid "Albanian" -msgstr "Albanese" - -msgid "Serbian" -msgstr "Serbo" - -msgid "Serbian Latin" -msgstr "Serbo Latino" - -msgid "Swedish" -msgstr "Svedese" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "Tailandese" - -msgid "Turkmen" -msgstr "Turkmeno" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uiguro" - -msgid "Ukrainian" -msgstr "Ucraino" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeko" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Cinese semplificato" - -msgid "Traditional Chinese" -msgstr "Cinese tradizionale" - -msgid "Messages" -msgstr "Messaggi" - -msgid "Site Maps" -msgstr "Mappa del sito" - -msgid "Static Files" -msgstr "File statici" - -msgid "Syndication" -msgstr "Aggregazione" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Quel numero di pagina non è un integer" - -msgid "That page number is less than 1" -msgstr "Quel numero di pagina è minore di 1" - -msgid "That page contains no results" -msgstr "Quella pagina non presenta alcun risultato" - -msgid "Enter a valid value." -msgstr "Inserisci un valore valido." - -msgid "Enter a valid domain name." -msgstr "" - -msgid "Enter a valid URL." -msgstr "Inserisci un URL valido." - -msgid "Enter a valid integer." -msgstr "Inserire un numero intero valido." - -msgid "Enter a valid email address." -msgstr "Inserisci un indirizzo email valido." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Inserisci uno \"slug\" valido contenente lettere, cifre, sottolineati o " -"trattini." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Inserisci uno 'slug' valido contenente lettere, cifre, sottolineati o " -"trattini." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "" - -msgid "IPv4" -msgstr "" - -msgid "IPv6" -msgstr "" - -msgid "IPv4 or IPv6" -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Inserisci solo cifre separate da virgole." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Assicurati che questo valore sia %(limit_value)s (ora è %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Assicurati che questo valore sia minore o uguale a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Assicurati che questo valore sia maggiore o uguale a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Assicurarsi che questo valore sia un multiplo della dimensione di passo " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Assicurati che questo valore sia un multiplo della dimensione di passo " -"%(limit_value)s, iniziando da %(offset)s, p.es. %(offset)s, " -"%(valid_value1)s, %(valid_value2)s, e così via." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assicurati che questo valore contenga almeno %(limit_value)d carattere (ne " -"ha %(show_value)d)." -msgstr[1] "" -"Assicurati che questo valore contenga almeno %(limit_value)d caratteri (ne " -"ha %(show_value)d)." -msgstr[2] "" -"Assicurati che questo valore contenga almeno %(limit_value)d caratteri (ne " -"ha %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assicurati che questo valore non contenga più di %(limit_value)d carattere " -"(ne ha %(show_value)d)." -msgstr[1] "" -"Assicurati che questo valore non contenga più di %(limit_value)d caratteri " -"(ne ha %(show_value)d)." -msgstr[2] "" -"Assicurati che questo valore non contenga più di %(limit_value)d caratteri " -"(ne ha %(show_value)d)." - -msgid "Enter a number." -msgstr "Inserisci un numero." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Assicurati che non vi sia più di %(max)s cifra in totale." -msgstr[1] "Assicurati che non vi siano più di %(max)s cifre in totale." -msgstr[2] "Assicurati che non vi siano più di %(max)s cifre in totale." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Assicurati che non vi sia più di %(max)s cifra decimale." -msgstr[1] "Assicurati che non vi siano più di %(max)s cifre decimali." -msgstr[2] "Assicurati che non vi siano più di %(max)s cifre decimali." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Assicurati che non vi sia più di %(max)s cifra prima della virgola." -msgstr[1] "" -"Assicurati che non vi siano più di %(max)s cifre prima della virgola." -msgstr[2] "" -"Assicurati che non vi siano più di %(max)s cifre prima della virgola." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Il file con estensione \"%(extension)s\" non e' permesso. Le estensioni " -"permesse sono: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "I caratteri null non sono ammessi." - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s con questa %(field_labels)s esiste già." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Il vincolo “%(name)s” è stato violato." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Il valore %(value)r non è una scelta valida." - -msgid "This field cannot be null." -msgstr "Questo campo non può essere nullo." - -msgid "This field cannot be blank." -msgstr "Questo campo non può essere vuoto." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s con questo %(field_label)s esiste già." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s deve essere unico per %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo di tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Il valore \"%(value)s\" deve essere True oppure False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Il valore di \"%(value)s\" deve essere True, False o None" - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Vero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Stringa (fino a %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Stringa (illimitata)" - -msgid "Comma-separated integers" -msgstr "Interi separati da virgole" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Il valore \"%(value)s\" ha un formato di data non valido. Deve essere nel " -"formato AAAA-MM-GG." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Il valore di \"%(value)s\" ha il corretto formato (AAAA-MM-GG) ma non è una " -"data valida." - -msgid "Date (without time)" -msgstr "Data (senza ora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Il valore \"%(value)s\" ha un formato non valido. Deve essere nel formato " -"AAAA-MM-GG HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Il valore di \"%(value)s\" ha il formato corretto (AAAA-MM-GG HH:MM[:ss[." -"uuuuuu]][TZ]) ma non è una data/ora valida." - -msgid "Date (with time)" -msgstr "Data (con ora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Il valore \"%(value)s\" deve essere un numero decimale." - -msgid "Decimal number" -msgstr "Numero decimale" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Il valore \"%(value)s\" ha un formato non valido. Deve essere nel formato " -"[GG] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Durata" - -msgid "Email address" -msgstr "Indirizzo email" - -msgid "File path" -msgstr "Percorso file" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Il valore di \"%(value)s\" deve essere un numero a virgola mobile." - -msgid "Floating point number" -msgstr "Numero in virgola mobile" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Il valore \"%(value)s\" deve essere un intero." - -msgid "Integer" -msgstr "Intero" - -msgid "Big (8 byte) integer" -msgstr "Intero grande (8 byte)" - -msgid "Small integer" -msgstr "Piccolo intero" - -msgid "IPv4 address" -msgstr "Indirizzo IPv4" - -msgid "IP address" -msgstr "Indirizzo IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Il valore \"%(value)s\" deve essere None, True oppure False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (True, False o None)" - -msgid "Positive big integer" -msgstr "Intero positivo" - -msgid "Positive integer" -msgstr "Intero positivo" - -msgid "Positive small integer" -msgstr "Piccolo intero positivo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (fino a %(max_length)s)" - -msgid "Text" -msgstr "Testo" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Il valore di \"%(value)s\" ha un formato non valido. Deve essere nel formato " -"HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Il valore di \"%(value)s\" ha il corretto formato (HH:MM[:ss[.uuuuuu]]) ma " -"non è un orario valido." - -msgid "Time" -msgstr "Ora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dati binari grezzi" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" non è uno UUID valido." - -msgid "Universally unique identifier" -msgstr "Identificatore univoco universale" - -msgid "File" -msgstr "File" - -msgid "Image" -msgstr "Immagine" - -msgid "A JSON object" -msgstr "Un oggetto JSON" - -msgid "Value must be valid JSON." -msgstr "Il valore deve essere un JSON valido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (tipo determinato dal campo collegato)" - -msgid "One-to-one relationship" -msgstr "Relazione uno a uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "relazione %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "relazioni %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relazione molti a molti" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Questo campo è obbligatorio." - -msgid "Enter a whole number." -msgstr "Inserisci un numero intero." - -msgid "Enter a valid date." -msgstr "Inserisci una data valida." - -msgid "Enter a valid time." -msgstr "Inserisci un'ora valida." - -msgid "Enter a valid date/time." -msgstr "Inserisci una data/ora valida." - -msgid "Enter a valid duration." -msgstr "Inserisci una durata valida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Il numero di giorni deve essere compreso tra {min_days} e {max_days}" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Non è stato inviato alcun file. Verifica il tipo di codifica sul form." - -msgid "No file was submitted." -msgstr "Nessun file è stato inviato." - -msgid "The submitted file is empty." -msgstr "Il file inviato è vuoto." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Assicurati che questo nome di file non contenga più di %(max)d carattere (ne " -"ha %(length)d)." -msgstr[1] "" -"Assicurati che questo nome di file non contenga più di %(max)d caratteri (ne " -"ha %(length)d)." -msgstr[2] "" -"Assicurati che questo nome di file non contenga più di %(max)d caratteri (ne " -"ha %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"È possibile inviare un file o selezionare la casella \"svuota\", ma non " -"entrambi." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Carica un'immagine valida. Il file caricato non è un'immagine o è " -"un'immagine danneggiata." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Scegli un'opzione valida. %(value)s non è tra quelle disponibili." - -msgid "Enter a list of values." -msgstr "Inserisci una lista di valori." - -msgid "Enter a complete value." -msgstr "Inserisci un valore completo." - -msgid "Enter a valid UUID." -msgstr "Inserire un UUID valido." - -msgid "Enter a valid JSON." -msgstr "Inserisci un JSON valido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo nascosto %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Mancano i dati ManagementForm o sono stati manomessi. Campi mancanti: " -"%(field_names)s. Potrebbe essere necessario inviare una segnalazione di " -"errore se il problema persiste." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Si prega di inviare al massimo %(num)d form." -msgstr[1] "Si prega di inviare al massimo %(num)d form." -msgstr[2] "Si prega di inviare al massimo %(num)d form." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Si prega di inviare almeno %(num)d form." -msgstr[1] "Si prega di inviare almeno %(num)d form." -msgstr[2] "Si prega di inviare almeno %(num)d form." - -msgid "Order" -msgstr "Ordine" - -msgid "Delete" -msgstr "Cancella" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Si prega di correggere i dati duplicati di %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Si prega di correggere i dati duplicati di %(field)s, che deve essere unico." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Si prega di correggere i dati duplicati di %(field_name)s che deve essere " -"unico/a per %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Si prega di correggere i dati duplicati qui sotto." - -msgid "The inline value did not match the parent instance." -msgstr "Il valore inline non corrisponde all'istanza padre." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Scegli un'opzione valida. La scelta effettuata non compare tra quelle " -"disponibili." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" non è un valore valido." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -" %(datetime)s non può essere interpretato nel fuso orario " -"%(current_timezone)s: potrebbe essere ambiguo o non esistere." - -msgid "Clear" -msgstr "Svuota" - -msgid "Currently" -msgstr "Attualmente" - -msgid "Change" -msgstr "Cambia" - -msgid "Unknown" -msgstr "Sconosciuto" - -msgid "Yes" -msgstr "Sì" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sì,no,forse" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "mezzanotte" - -msgid "noon" -msgstr "mezzogiorno" - -msgid "Monday" -msgstr "Lunedì" - -msgid "Tuesday" -msgstr "Martedì" - -msgid "Wednesday" -msgstr "Mercoledì" - -msgid "Thursday" -msgstr "Giovedì" - -msgid "Friday" -msgstr "Venerdì" - -msgid "Saturday" -msgstr "Sabato" - -msgid "Sunday" -msgstr "Domenica" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mer" - -msgid "Thu" -msgstr "Gio" - -msgid "Fri" -msgstr "Ven" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Gennaio" - -msgid "February" -msgstr "Febbraio" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Aprile" - -msgid "May" -msgstr "Maggio" - -msgid "June" -msgstr "Giugno" - -msgid "July" -msgstr "Luglio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Settembre" - -msgid "October" -msgstr "Ottobre" - -msgid "November" -msgstr "Novembre" - -msgid "December" -msgstr "Dicembre" - -msgid "jan" -msgstr "gen" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mag" - -msgid "jun" -msgstr "giu" - -msgid "jul" -msgstr "lug" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "ott" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Gen." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprile" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maggio" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Giugno" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Luglio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Ott." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dic." - -msgctxt "alt. month" -msgid "January" -msgstr "Gennaio" - -msgctxt "alt. month" -msgid "February" -msgstr "Febbraio" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprile" - -msgctxt "alt. month" -msgid "May" -msgstr "Maggio" - -msgctxt "alt. month" -msgid "June" -msgstr "Giugno" - -msgctxt "alt. month" -msgid "July" -msgstr "Luglio" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Settembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Ottobre" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Dicembre" - -msgid "This is not a valid IPv6 address." -msgstr "Questo non è un indirizzo IPv6 valido." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d anno" -msgstr[1] "%(num)d anni" -msgstr[2] "%(num)d anni" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mese" -msgstr[1] "%(num)d mesi" -msgstr[2] "%(num)d mesi" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d settimana" -msgstr[1] "%(num)d settimane" -msgstr[2] "%(num)d settimane" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d giorno" -msgstr[1] "%(num)d giorni" -msgstr[2] "%(num)d giorni" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ora" -msgstr[1] "%(num)d ore" -msgstr[2] "%(num)d ore" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minuti" -msgstr[2] "%(num)d minuti" - -msgid "Forbidden" -msgstr "Proibito" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verifica CSRF fallita. Richiesta interrotta." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Vedi questo messaggio perchè questo sito HTTPS richiede l'invio da parte del " -"tuo browser del “Referer header”, che non è invece stato inviato. Questo " -"header è richiesto per motivi di sicurezza, per assicurare che il tuo " -"browser non sia stato sabotato da terzi." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Se hai configurato il tuo browser web per disattivare l'invio delle " -"intestazioni \"Referer\", riattiva questo invio, almeno per questo sito, o " -"per le connessioni HTTPS, o per le connessioni \"same-origin\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Se usi il tag o includi " -"header 'Referrer-Policy: no-referrer', per favore rimuovili. Per la " -"protezione CSRF è necessario eseguire un controllo rigoroso sull'header " -"'Referer'. Se ti preoccupano le ricadute sulla privacy, puoi ricorrere ad " -"alternative come per i link a siti di terze parti." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Stai vedendo questo messaggio perché questo sito richiede un cookie CSRF " -"quando invii dei form. Questo cookie è necessario per ragioni di sicurezza, " -"per assicurare che il tuo browser non sia stato dirottato da terze parti." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Se hai configurato il tuo browser web per disattivare l'invio dei cookies, " -"riattivalo almeno per questo sito, o per connessioni \"same-origin\"" - -msgid "More information is available with DEBUG=True." -msgstr "Maggiorni informazioni sono disponibili con DEBUG=True" - -msgid "No year specified" -msgstr "Anno non specificato" - -msgid "Date out of range" -msgstr "Data al di fuori dell'intervallo" - -msgid "No month specified" -msgstr "Mese non specificato" - -msgid "No day specified" -msgstr "Giorno non specificato" - -msgid "No week specified" -msgstr "Settimana non specificata" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nessun %(verbose_name_plural)s disponibile" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s futuri/e non disponibili/e poichè %(class_name)s." -"allow_future è False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Data non valida \"%(datestr)s\" con il formato \"%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Trovato nessun %(verbose_name)s corrispondente alla query" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "La pagina non è \"last\", né può essere convertita in un int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Pagina non valida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista vuota e \"%(class_name)s.allow_empty\" è False." - -msgid "Directory indexes are not allowed here." -msgstr "Indici di directory non sono consentiti qui." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" non esiste" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indice di %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Installazione completata con successo! Congratulazioni!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Leggi le note di rilascio per Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Stai vedendo questa pagina perché hai impostato DEBUG=True nel tuo file di configurazione e non hai " -"configurato nessun URL." - -msgid "Django Documentation" -msgstr "Documentazione di Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temi, riferimenti, & guide" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: un'app per sondaggi" - -msgid "Get started with Django" -msgstr "Iniziare con Django" - -msgid "Django Community" -msgstr "La Community di Django" - -msgid "Connect, get help, or contribute" -msgstr "Connettiti, chiedi aiuto, o contribuisci." diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/it/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/it/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/it/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/it/formats.py deleted file mode 100644 index bb9e027..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/it/formats.py +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" # 25 Ottobre 2006 -TIME_FORMAT = "H:i" # 14:30 -DATETIME_FORMAT = "l d F Y H:i" # Mercoledì 25 Ottobre 2006 14:30 -YEAR_MONTH_FORMAT = "F Y" # Ottobre 2006 -MONTH_DAY_FORMAT = "j F" # 25 Ottobre -SHORT_DATE_FORMAT = "d/m/Y" # 25/12/2009 -SHORT_DATETIME_FORMAT = "d/m/Y H:i" # 25/10/2009 14:30 -FIRST_DAY_OF_WEEK = 1 # Lunedì - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%Y/%m/%d", # '2006/10/25' - "%d-%m-%Y", # '25-10-2006' - "%Y-%m-%d", # '2006-10-25' - "%d-%m-%y", # '25-10-06' - "%d/%m/%y", # '25/10/06' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d-%m-%Y %H:%M:%S", # '25-10-2006 14:30:59' - "%d-%m-%Y %H:%M:%S.%f", # '25-10-2006 14:30:59.000200' - "%d-%m-%Y %H:%M", # '25-10-2006 14:30' - "%d-%m-%y %H:%M:%S", # '25-10-06 14:30:59' - "%d-%m-%y %H:%M:%S.%f", # '25-10-06 14:30:59.000200' - "%d-%m-%y %H:%M", # '25-10-06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index d7dad0a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index ca8a726..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,1331 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# xiu1 , 2016 -# tadasu , 2020 -# Goto Hayato , 2021 -# Goto Hayato , 2019 -# Hiroki Sawano, 2022 -# Jannis Leidel , 2011 -# Kamiyama Satoshi, 2021 -# Kentaro Matsuzaki , 2015 -# Masashi SHIBATA , 2017 -# Nikita K , 2019 -# Shinichi Katsumata , 2019 -# Shinya Okano , 2012-2019,2021,2023-2024 -# TANIGUCHI Taichi, 2022 -# Takuro Onoue , 2020 -# Takuya N , 2020 -# Tetsuya Morimoto , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Shinya Okano , " -"2012-2019,2021,2023-2024\n" -"Language-Team: Japanese (http://app.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "アフリカーンス語" - -msgid "Arabic" -msgstr "アラビア語" - -msgid "Algerian Arabic" -msgstr "アラビア語(アルジェリア)" - -msgid "Asturian" -msgstr "アストゥリアス語" - -msgid "Azerbaijani" -msgstr "アゼルバイジャン語" - -msgid "Bulgarian" -msgstr "ブルガリア語" - -msgid "Belarusian" -msgstr "ベラルーシ語" - -msgid "Bengali" -msgstr "ベンガル語" - -msgid "Breton" -msgstr "ブルトン語" - -msgid "Bosnian" -msgstr "ボスニア語" - -msgid "Catalan" -msgstr "カタロニア語" - -msgid "Central Kurdish (Sorani)" -msgstr "中央クルド語 (ソラニー語)" - -msgid "Czech" -msgstr "チェコ語" - -msgid "Welsh" -msgstr "ウェールズ語" - -msgid "Danish" -msgstr "デンマーク語" - -msgid "German" -msgstr "ドイツ語" - -msgid "Lower Sorbian" -msgstr "低地ソルブ語" - -msgid "Greek" -msgstr "ギリシャ語" - -msgid "English" -msgstr "英語(米国)" - -msgid "Australian English" -msgstr "英語(オーストラリア)" - -msgid "British English" -msgstr "英語(英国)" - -msgid "Esperanto" -msgstr "エスペラント語" - -msgid "Spanish" -msgstr "スペイン語" - -msgid "Argentinian Spanish" -msgstr "アルゼンチンスペイン語" - -msgid "Colombian Spanish" -msgstr "コロンビアスペイン語" - -msgid "Mexican Spanish" -msgstr "メキシコスペイン語" - -msgid "Nicaraguan Spanish" -msgstr "ニカラグアスペイン語" - -msgid "Venezuelan Spanish" -msgstr "ベネズエラスペイン語" - -msgid "Estonian" -msgstr "エストニア語" - -msgid "Basque" -msgstr "バスク語" - -msgid "Persian" -msgstr "ペルシア語" - -msgid "Finnish" -msgstr "フィンランド語" - -msgid "French" -msgstr "フランス語" - -msgid "Frisian" -msgstr "フリジア語" - -msgid "Irish" -msgstr "アイルランド語" - -msgid "Scottish Gaelic" -msgstr "ゲール語(スコットランド)" - -msgid "Galician" -msgstr "ガリシア語" - -msgid "Hebrew" -msgstr "ヘブライ語" - -msgid "Hindi" -msgstr "ヒンディー語" - -msgid "Croatian" -msgstr "クロアチア語" - -msgid "Upper Sorbian" -msgstr "高地ソルブ語" - -msgid "Hungarian" -msgstr "ハンガリー語" - -msgid "Armenian" -msgstr "アルメニア" - -msgid "Interlingua" -msgstr "インターリングア" - -msgid "Indonesian" -msgstr "インドネシア語" - -msgid "Igbo" -msgstr "イグボ語" - -msgid "Ido" -msgstr "イド語" - -msgid "Icelandic" -msgstr "アイスランド語" - -msgid "Italian" -msgstr "イタリア語" - -msgid "Japanese" -msgstr "日本語" - -msgid "Georgian" -msgstr "グルジア語" - -msgid "Kabyle" -msgstr "カビル語" - -msgid "Kazakh" -msgstr "カザフ語" - -msgid "Khmer" -msgstr "クメール語" - -msgid "Kannada" -msgstr "カンナダ語" - -msgid "Korean" -msgstr "韓国語" - -msgid "Kyrgyz" -msgstr "キルギス語" - -msgid "Luxembourgish" -msgstr "ルクセンブルグ語" - -msgid "Lithuanian" -msgstr "リトアニア語" - -msgid "Latvian" -msgstr "ラトビア語" - -msgid "Macedonian" -msgstr "マケドニア語" - -msgid "Malayalam" -msgstr "マラヤーラム語" - -msgid "Mongolian" -msgstr "モンゴル語" - -msgid "Marathi" -msgstr "マラーティー語" - -msgid "Malay" -msgstr "マレー語" - -msgid "Burmese" -msgstr "ビルマ語" - -msgid "Norwegian Bokmål" -msgstr "ノルウェーのブークモール" - -msgid "Nepali" -msgstr "ネパール語" - -msgid "Dutch" -msgstr "オランダ語" - -msgid "Norwegian Nynorsk" -msgstr "ノルウェーのニーノシュク" - -msgid "Ossetic" -msgstr "オセット語" - -msgid "Punjabi" -msgstr "パンジャブ語" - -msgid "Polish" -msgstr "ポーランド語" - -msgid "Portuguese" -msgstr "ポルトガル語" - -msgid "Brazilian Portuguese" -msgstr "ブラジルポルトガル語" - -msgid "Romanian" -msgstr "ルーマニア語" - -msgid "Russian" -msgstr "ロシア語" - -msgid "Slovak" -msgstr "スロバキア語" - -msgid "Slovenian" -msgstr "スロヴェニア語" - -msgid "Albanian" -msgstr "アルバニア語" - -msgid "Serbian" -msgstr "セルビア語" - -msgid "Serbian Latin" -msgstr "セルビア語ラテン文字" - -msgid "Swedish" -msgstr "スウェーデン語" - -msgid "Swahili" -msgstr "スワヒリ語" - -msgid "Tamil" -msgstr "タミル語" - -msgid "Telugu" -msgstr "テルグ語" - -msgid "Tajik" -msgstr "タジク語" - -msgid "Thai" -msgstr "タイ語" - -msgid "Turkmen" -msgstr "トルクメン語" - -msgid "Turkish" -msgstr "トルコ語" - -msgid "Tatar" -msgstr "タタール語" - -msgid "Udmurt" -msgstr "ウドムルト語" - -msgid "Uyghur" -msgstr "ウイグル語" - -msgid "Ukrainian" -msgstr "ウクライナ語" - -msgid "Urdu" -msgstr "ウルドゥー語" - -msgid "Uzbek" -msgstr "ウズベク語" - -msgid "Vietnamese" -msgstr "ベトナム語" - -msgid "Simplified Chinese" -msgstr "簡体字中国語" - -msgid "Traditional Chinese" -msgstr "繁体字中国語" - -msgid "Messages" -msgstr "メッセージ" - -msgid "Site Maps" -msgstr "サイトマップ" - -msgid "Static Files" -msgstr "静的ファイル" - -msgid "Syndication" -msgstr "シンジケーション" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "このページ番号は整数ではありません。" - -msgid "That page number is less than 1" -msgstr "ページ番号が 1 よりも小さいです。" - -msgid "That page contains no results" -msgstr "このページには結果が含まれていません。" - -msgid "Enter a valid value." -msgstr "値を正しく入力してください。" - -msgid "Enter a valid domain name." -msgstr "有効なドメイン名を入力してください。" - -msgid "Enter a valid URL." -msgstr "URLを正しく入力してください。" - -msgid "Enter a valid integer." -msgstr "整数を正しく入力してください。" - -msgid "Enter a valid email address." -msgstr "有効なメールアドレスを入力してください。" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"“slug” には半角の英数字、アンダースコア、ハイフン以外は使用できません。" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"ユニコード文字、数字、アンダースコアまたはハイフンで構成された、有効なスラグ" -"を入力してください。" - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "有効な%(protocol)sアドレスを入力してください。" - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4またはIPv6" - -msgid "Enter only digits separated by commas." -msgstr "カンマ区切りの数字だけを入力してください。" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"この値は %(limit_value)s でなければなりません(実際には %(show_value)s でし" -"た) 。" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "この値は %(limit_value)s 以下でなければなりません。" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "この値は %(limit_value)s 以上でなければなりません。" - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "この値は %(limit_value)s の倍数でなければなりません。" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"この値は%(offset)s から始まる %(limit_value)s の倍数でなければなりません。" -"例. %(offset)s%(valid_value1)s%(valid_value2)s など。" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"この値が少なくとも %(limit_value)d 文字以上であることを確認してください " -"(%(show_value)d 文字になっています)。" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"この値は %(limit_value)d 文字以下でなければなりません( %(show_value)d 文字に" -"なっています)。" - -msgid "Enter a number." -msgstr "数値を入力してください。" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "この値は合計 %(max)s 桁以内でなければなりません。" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "この値は小数点以下が合計 %(max)s 桁以内でなければなりません。" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "この値は小数点より前が合計 %(max)s 桁以内でなければなりません。" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"ファイル拡張子 “%(extension)s” は許可されていません。許可されている拡張子は " -"%(allowed_extensions)s です。" - -msgid "Null characters are not allowed." -msgstr "何か文字を入力してください。" - -msgid "and" -msgstr "と" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "この %(field_labels)s を持った %(model_name)s が既に存在します。" - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "制約 “%(name)s” に違反しています。" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r は有効な選択肢ではありません。" - -msgid "This field cannot be null." -msgstr "このフィールドには NULL を指定できません。" - -msgid "This field cannot be blank." -msgstr "このフィールドは空ではいけません。" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "この %(field_label)s を持った %(model_name)s が既に存在します。" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(date_field_label)s %(lookup_type)s では %(field_label)s がユニークである必" -"要があります。" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "タイプが %(field_type)s のフィールド" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” は True または False にしなければなりません。" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” は True 、 False または None の値でなければなりません。" - -msgid "Boolean (Either True or False)" -msgstr "ブール値 (真: True または偽: False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "文字列 ( %(max_length)s 字まで )" - -msgid "String (unlimited)" -msgstr "文字列 (無制限)" - -msgid "Comma-separated integers" -msgstr "カンマ区切りの整数" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” は無効な日付形式です。YYYY-MM-DD 形式にしなければなりません。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "“%(value)s” は有効な日付形式(YYYY-MM-DD)ですが、不正な日付です。" - -msgid "Date (without time)" -msgstr "日付" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” は無効な形式の値です。 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 形式で" -"なければなりません。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” は正しい形式 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) の値ですが、無" -"効な日時です。" - -msgid "Date (with time)" -msgstr "日時" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” は10進浮動小数値にしなければなりません。" - -msgid "Decimal number" -msgstr "10 進数 (小数可)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” は無効な形式の値です。 [DD] [HH:[MM:]]ss[.uuuuuu] 形式でなければ" -"なりません。" - -msgid "Duration" -msgstr "時間差分" - -msgid "Email address" -msgstr "メールアドレス" - -msgid "File path" -msgstr "ファイルの場所" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” は小数値にしなければなりません。" - -msgid "Floating point number" -msgstr "浮動小数点" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” は整数値にしなければなりません。" - -msgid "Integer" -msgstr "整数" - -msgid "Big (8 byte) integer" -msgstr "大きな(8バイト)整数" - -msgid "Small integer" -msgstr "小さな整数" - -msgid "IPv4 address" -msgstr "IPv4アドレス" - -msgid "IP address" -msgstr "IP アドレス" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” は None、True または False の値でなければなりません。" - -msgid "Boolean (Either True, False or None)" -msgstr "ブール値 (真: True 、偽: False または None)" - -msgid "Positive big integer" -msgstr "正の多倍長整数" - -msgid "Positive integer" -msgstr "正の整数" - -msgid "Positive small integer" -msgstr "小さな正の整数" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "スラグ(%(max_length)s文字以内)" - -msgid "Text" -msgstr "テキスト" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” は無効な形式の値です。 HH:MM[:ss[.uuuuuu]] 形式でなければなりませ" -"ん。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "“%(value)s” は正しい形式(HH:MM[:ss[.uuuuuu]])ですが、無効な時刻です。" - -msgid "Time" -msgstr "時刻" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "生のバイナリデータ" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” は有効なUUIDではありません。" - -msgid "Universally unique identifier" -msgstr "汎用一意識別子" - -msgid "File" -msgstr "ファイル" - -msgid "Image" -msgstr "画像" - -msgid "A JSON object" -msgstr "JSONオブジェクト" - -msgid "Value must be valid JSON." -msgstr "JSONとして正しい値にしてください。" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s が %(value)r である %(model)s のインスタンスは存在しません。" - -msgid "Foreign Key (type determined by related field)" -msgstr "外部キー(型は関連フィールドによって決まります)" - -msgid "One-to-one relationship" -msgstr "1対1の関連" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s の関連" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s の関連" - -msgid "Many-to-many relationship" -msgstr "多対多の関連" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "このフィールドは必須です。" - -msgid "Enter a whole number." -msgstr "整数を入力してください。" - -msgid "Enter a valid date." -msgstr "日付を正しく入力してください。" - -msgid "Enter a valid time." -msgstr "時間を正しく入力してください。" - -msgid "Enter a valid date/time." -msgstr "日時を正しく入力してください。" - -msgid "Enter a valid duration." -msgstr "時間差分を正しく入力してください。" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "日数は{min_days}から{max_days}の間でなければなりません。" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"ファイルが取得できませんでした。フォームのencoding typeを確認してください。" - -msgid "No file was submitted." -msgstr "ファイルが送信されていません。" - -msgid "The submitted file is empty." -msgstr "入力されたファイルは空です。" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"このファイル名は %(max)d 文字以下でなければなりません( %(length)d 文字になっ" -"ています)。" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"ファイルを投稿するか、クリアチェックボックスをチェックするかどちらかを選択し" -"てください。両方とも行ってはいけません。" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"画像をアップロードしてください。アップロードしたファイルは画像でないか、また" -"は壊れています。" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "正しく選択してください。 %(value)s は候補にありません。" - -msgid "Enter a list of values." -msgstr "リストを入力してください。" - -msgid "Enter a complete value." -msgstr "すべての値を入力してください。" - -msgid "Enter a valid UUID." -msgstr "UUIDを正しく入力してください。" - -msgid "Enter a valid JSON." -msgstr "JSONを正しく入力してください。" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(隠しフィールド %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm のデータが不足しているか改竄されています。不足するフィールドの" -"数: %(field_names)s 。問題が続くようならバグレポートを出す必要があるかもしれ" -"ません。" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "最大で %(num)d 個のフォームを送信してください。" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "少なくとも %(num)d 個のフォームを送信してください。" - -msgid "Order" -msgstr "並び変え" - -msgid "Delete" -msgstr "削除" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s の重複したデータを修正してください。" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s の重複したデータを修正してください。このフィールドはユニークである" -"必要があります。" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s の重複したデータを修正してください。%(date_field)s %(lookup)s " -"では %(field_name)s がユニークである必要があります。" - -msgid "Please correct the duplicate values below." -msgstr "下記の重複したデータを修正してください。" - -msgid "The inline value did not match the parent instance." -msgstr "インライン値が親のインスタンスに一致しません。" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "正しく選択してください。選択したものは候補にありません。" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” は無効な値です。" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s は %(current_timezone)s のタイムゾーンでは解釈できませんでした。" -"それは曖昧であるか、存在しない可能性があります。" - -msgid "Clear" -msgstr "クリア" - -msgid "Currently" -msgstr "現在" - -msgid "Change" -msgstr "変更" - -msgid "Unknown" -msgstr "不明" - -msgid "Yes" -msgstr "はい" - -msgid "No" -msgstr "いいえ" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "はい,いいえ,たぶん" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d バイト" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "0時" - -msgid "noon" -msgstr "12時" - -msgid "Monday" -msgstr "月曜日" - -msgid "Tuesday" -msgstr "火曜日" - -msgid "Wednesday" -msgstr "水曜日" - -msgid "Thursday" -msgstr "木曜日" - -msgid "Friday" -msgstr "金曜日" - -msgid "Saturday" -msgstr "土曜日" - -msgid "Sunday" -msgstr "日曜日" - -msgid "Mon" -msgstr "月" - -msgid "Tue" -msgstr "火" - -msgid "Wed" -msgstr "水" - -msgid "Thu" -msgstr "木" - -msgid "Fri" -msgstr "金" - -msgid "Sat" -msgstr "土" - -msgid "Sun" -msgstr "日" - -msgid "January" -msgstr "1月" - -msgid "February" -msgstr "2月" - -msgid "March" -msgstr "3月" - -msgid "April" -msgstr "4月" - -msgid "May" -msgstr "5月" - -msgid "June" -msgstr "6月" - -msgid "July" -msgstr "7月" - -msgid "August" -msgstr "8月" - -msgid "September" -msgstr "9月" - -msgid "October" -msgstr "10月" - -msgid "November" -msgstr "11月" - -msgid "December" -msgstr "12月" - -msgid "jan" -msgstr "1月" - -msgid "feb" -msgstr "2月" - -msgid "mar" -msgstr "3月" - -msgid "apr" -msgstr "4月" - -msgid "may" -msgstr "5月" - -msgid "jun" -msgstr "6月" - -msgid "jul" -msgstr "7月" - -msgid "aug" -msgstr "8月" - -msgid "sep" -msgstr "9月" - -msgid "oct" -msgstr "10月" - -msgid "nov" -msgstr "11月" - -msgid "dec" -msgstr "12月" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "1月" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "2月" - -msgctxt "abbrev. month" -msgid "March" -msgstr "3月" - -msgctxt "abbrev. month" -msgid "April" -msgstr "4月" - -msgctxt "abbrev. month" -msgid "May" -msgstr "5月" - -msgctxt "abbrev. month" -msgid "June" -msgstr "6月" - -msgctxt "abbrev. month" -msgid "July" -msgstr "7月" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "8月" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "9月" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "10月" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "11月" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "12月" - -msgctxt "alt. month" -msgid "January" -msgstr "1月" - -msgctxt "alt. month" -msgid "February" -msgstr "2月" - -msgctxt "alt. month" -msgid "March" -msgstr "3月" - -msgctxt "alt. month" -msgid "April" -msgstr "4月" - -msgctxt "alt. month" -msgid "May" -msgstr "5月" - -msgctxt "alt. month" -msgid "June" -msgstr "6月" - -msgctxt "alt. month" -msgid "July" -msgstr "7月" - -msgctxt "alt. month" -msgid "August" -msgstr "8月" - -msgctxt "alt. month" -msgid "September" -msgstr "9月" - -msgctxt "alt. month" -msgid "October" -msgstr "10月" - -msgctxt "alt. month" -msgid "November" -msgstr "11月" - -msgctxt "alt. month" -msgid "December" -msgstr "12月" - -msgid "This is not a valid IPv6 address." -msgstr "これは有効なIPv6アドレスではありません。" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "または" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d年" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)dヶ月" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d週間" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d日" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d時間" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d分" - -msgid "Forbidden" -msgstr "アクセス禁止" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF検証に失敗したため、リクエストは中断されました。" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"このメッセージが表示されている理由は、このHTTPSのサイトはウェブブラウザからリ" -"ファラーヘッダが送信されることを必須としていますが、送信されなかったためで" -"す。このヘッダはセキュリティ上の理由(使用中のブラウザが第三者によってハイ" -"ジャックされていないことを確認するため)で必要です。" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"もしブラウザのリファラーヘッダを無効に設定しているならば、HTTPS接続やsame-" -"originリクエストのために、少なくともこのサイトでは再度有効にしてください。" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"もし タグを使用しているか " -"“Referrer-Policy: no-referrer” ヘッダを含んでいる場合は削除してください。" -"CSRF プロテクションは、厳密に “Referer” ヘッダが必要です。プライバシーが気に" -"なる場合は などの代替で第三者サイトと接続してくださ" -"い。" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"このメッセージが表示されている理由は、このサイトはフォーム送信時にCSRFクッ" -"キーを必須としているためです。このクッキーはセキュリティ上の理由(使用中のブラ" -"ウザが第三者によってハイジャックされていないことを確認するため)で必要です。" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"もしブラウザのクッキーを無効に設定しているならば、same-originリクエストのため" -"に少なくともこのサイトでは再度有効にしてください。" - -msgid "More information is available with DEBUG=True." -msgstr "詳細な情報は DEBUG=True を設定すると利用できます。" - -msgid "No year specified" -msgstr "年が未指定です" - -msgid "Date out of range" -msgstr "日付が有効範囲外です" - -msgid "No month specified" -msgstr "月が未指定です" - -msgid "No day specified" -msgstr "日が未指定です" - -msgid "No week specified" -msgstr "週が未指定です" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s は利用できません" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(class_name)s.allow_futureがFalseであるため、未来の%(verbose_name_plural)sは" -"利用できません。" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "指定された形式 “%(format)s” では “%(datestr)s” は無効な日付文字列です" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "クエリーに一致する %(verbose_name)s は見つかりませんでした" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "ページが 「最後」ではないか、数値に変換できる値ではありません。" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "無効なページです (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "空の一覧かつ “%(class_name)s.allow_empty” が False です。" - -msgid "Directory indexes are not allowed here." -msgstr "ここではディレクトリインデックスが許可されていません。" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” が存在しません" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)sのディレクトリインデックス" - -msgid "The install worked successfully! Congratulations!" -msgstr "インストールは成功しました!おめでとうございます!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django%(version)sのリリースノートを見る。" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"このページは、設定ファイルでDEBUG=Trueが指定され、何もURLが設定されていない時に表示" -"されます。" - -msgid "Django Documentation" -msgstr "Django ドキュメント" - -msgid "Topics, references, & how-to’s" -msgstr "トピック、リファレンス、ハウツー" - -msgid "Tutorial: A Polling App" -msgstr "チュートリアル: 投票アプリケーション" - -msgid "Get started with Django" -msgstr "Djangoを始めよう" - -msgid "Django Community" -msgstr "Djangoのコミュニティ" - -msgid "Connect, get help, or contribute" -msgstr "つながり、助け合い、貢献しよう" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ja/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ja/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ja/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ja/formats.py deleted file mode 100644 index c0554d9..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ja/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "Y年n月j日" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "Y年n月j日G:i" -YEAR_MONTH_FORMAT = "Y年n月" -MONTH_DAY_FORMAT = "n月j日" -SHORT_DATE_FORMAT = "Y/m/d" -SHORT_DATETIME_FORMAT = "Y/m/d G:i" -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ka/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index 7cdc3c5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index 1f342b9..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,1239 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2013-2015 -# David A. , 2019 -# David A. , 2011 -# Jannis Leidel , 2011 -# Tornike Beradze , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Afrikaans" -msgstr "აფრიკაანსი" - -msgid "Arabic" -msgstr "არაბული" - -msgid "Asturian" -msgstr "ასტურიული" - -msgid "Azerbaijani" -msgstr "აზერბაიჯანული" - -msgid "Bulgarian" -msgstr "ბულგარული" - -msgid "Belarusian" -msgstr "ბელარუსული" - -msgid "Bengali" -msgstr "ბენგალიური" - -msgid "Breton" -msgstr "ბრეტონული" - -msgid "Bosnian" -msgstr "ბოსნიური" - -msgid "Catalan" -msgstr "კატალანური" - -msgid "Czech" -msgstr "ჩეხური" - -msgid "Welsh" -msgstr "უელსური" - -msgid "Danish" -msgstr "დანიური" - -msgid "German" -msgstr "გერმანული" - -msgid "Lower Sorbian" -msgstr "ქვემო სორბული" - -msgid "Greek" -msgstr "ბერძნული" - -msgid "English" -msgstr "ინგლისური" - -msgid "Australian English" -msgstr "ავსტრალიური ინგლისური" - -msgid "British English" -msgstr "ბრიტანეთის ინგლისური" - -msgid "Esperanto" -msgstr "ესპერანტო" - -msgid "Spanish" -msgstr "ესპანური" - -msgid "Argentinian Spanish" -msgstr "არგენტინის ესპანური" - -msgid "Colombian Spanish" -msgstr "კოლუმბიური ესპანური" - -msgid "Mexican Spanish" -msgstr "მექსიკური ესპანური" - -msgid "Nicaraguan Spanish" -msgstr "ნიკარაგუული ესპანური" - -msgid "Venezuelan Spanish" -msgstr "ვენესუელის ესპანური" - -msgid "Estonian" -msgstr "ესტონური" - -msgid "Basque" -msgstr "ბასკური" - -msgid "Persian" -msgstr "სპარსული" - -msgid "Finnish" -msgstr "ფინური" - -msgid "French" -msgstr "ფრანგული" - -msgid "Frisian" -msgstr "ფრისიული" - -msgid "Irish" -msgstr "ირლანდიური" - -msgid "Scottish Gaelic" -msgstr "შოტლანდიური-გელური" - -msgid "Galician" -msgstr "გალიციური" - -msgid "Hebrew" -msgstr "ებრაული" - -msgid "Hindi" -msgstr "ჰინდი" - -msgid "Croatian" -msgstr "ხორვატიული" - -msgid "Upper Sorbian" -msgstr "ზემო სორბიული" - -msgid "Hungarian" -msgstr "უნგრული" - -msgid "Armenian" -msgstr "სომხური" - -msgid "Interlingua" -msgstr "ინტერლინგუა" - -msgid "Indonesian" -msgstr "ინდონეზიური" - -msgid "Ido" -msgstr "იდო" - -msgid "Icelandic" -msgstr "ისლანდიური" - -msgid "Italian" -msgstr "იტალიური" - -msgid "Japanese" -msgstr "იაპონური" - -msgid "Georgian" -msgstr "ქართული" - -msgid "Kabyle" -msgstr "კაბილური" - -msgid "Kazakh" -msgstr "ყაზახური" - -msgid "Khmer" -msgstr "ხმერული" - -msgid "Kannada" -msgstr "კანნადა" - -msgid "Korean" -msgstr "კორეული" - -msgid "Luxembourgish" -msgstr "ლუქსემბურგული" - -msgid "Lithuanian" -msgstr "ლიტვური" - -msgid "Latvian" -msgstr "ლატვიური" - -msgid "Macedonian" -msgstr "მაკედონიური" - -msgid "Malayalam" -msgstr "მალაიზიური" - -msgid "Mongolian" -msgstr "მონღოლური" - -msgid "Marathi" -msgstr "მარათული" - -msgid "Burmese" -msgstr "ბირმული" - -msgid "Norwegian Bokmål" -msgstr "ნორვეგიული Bokmål" - -msgid "Nepali" -msgstr "ნეპალური" - -msgid "Dutch" -msgstr "ჰოლანდიური" - -msgid "Norwegian Nynorsk" -msgstr "ნორვეგიული-ნინორსკი" - -msgid "Ossetic" -msgstr "ოსური" - -msgid "Punjabi" -msgstr "პუნჯაბი" - -msgid "Polish" -msgstr "პოლონური" - -msgid "Portuguese" -msgstr "პორტუგალიური" - -msgid "Brazilian Portuguese" -msgstr "ბრაზილიური პორტუგალიური" - -msgid "Romanian" -msgstr "რუმინული" - -msgid "Russian" -msgstr "რუსული" - -msgid "Slovak" -msgstr "სლოვაკური" - -msgid "Slovenian" -msgstr "სლოვენიური" - -msgid "Albanian" -msgstr "ალბანური" - -msgid "Serbian" -msgstr "სერბული" - -msgid "Serbian Latin" -msgstr "სერბული (ლათინური)" - -msgid "Swedish" -msgstr "შვედური" - -msgid "Swahili" -msgstr "სუაჰილი" - -msgid "Tamil" -msgstr "თამილური" - -msgid "Telugu" -msgstr "ტელუგუ" - -msgid "Thai" -msgstr "ტაი" - -msgid "Turkish" -msgstr "თურქული" - -msgid "Tatar" -msgstr "თათრული" - -msgid "Udmurt" -msgstr "უდმურტული" - -msgid "Ukrainian" -msgstr "უკრაინული" - -msgid "Urdu" -msgstr "ურდუ" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "ვიეტნამური" - -msgid "Simplified Chinese" -msgstr "გამარტივებული ჩინური" - -msgid "Traditional Chinese" -msgstr "ტრადიციული ჩინური" - -msgid "Messages" -msgstr "შეტყობინებები" - -msgid "Site Maps" -msgstr "საიტის რუკები" - -msgid "Static Files" -msgstr "სტატიკური ფაილები" - -msgid "Syndication" -msgstr "სინდიკაცია" - -msgid "That page number is not an integer" -msgstr "გვერდის ნომერი არ არის მთელი რიცხვი" - -msgid "That page number is less than 1" -msgstr "გვერდის ნომერი ნაკლებია 1-ზე" - -msgid "That page contains no results" -msgstr "გვერდი არ შეიცავს მონაცემებს" - -msgid "Enter a valid value." -msgstr "შეიყვანეთ სწორი მნიშვნელობა." - -msgid "Enter a valid URL." -msgstr "შეიყვანეთ სწორი URL." - -msgid "Enter a valid integer." -msgstr "შეიყვანეთ სწორი მთელი რიცხვი." - -msgid "Enter a valid email address." -msgstr "შეიყვანეთ მართებული ელფოსტის მისამართი." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "შეიყვანეთ სწორი IPv4 მისამართი." - -msgid "Enter a valid IPv6 address." -msgstr "შეიყვანეთ მართებული IPv6 მისამართი." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "შეიყვანეთ მართებული IPv4 ან IPv6 მისამართი." - -msgid "Enter only digits separated by commas." -msgstr "შეიყვანეთ მხოლოდ მძიმეებით გამოყოფილი ციფრები." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "მნიშვნელობა უნდა იყოს %(limit_value)s (იგი არის %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "მნიშვნელობა უნდა იყოს %(limit_value)s-ზე ნაკლები ან ტოლი." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "მნიშვნელობა უნდა იყოს %(limit_value)s-ზე მეტი ან ტოლი." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"მნიშვნელობას უნდა ჰქონდეს სულ ცოტა %(limit_value)d სიმბოლო (მას აქვს " -"%(show_value)d)." -msgstr[1] "" -"მნიშვნელობას უნდა ჰქონდეს სულ ცოტა %(limit_value)d სიმბოლო (მას აქვს " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"მნიშვნელობას უნდა ჰქონდეს არაუმეტეს %(limit_value)d სიმბოლოსი (მას აქვს " -"%(show_value)d)." -msgstr[1] "" -"მნიშვნელობას უნდა ჰქონდეს არაუმეტეს %(limit_value)d სიმბოლოსი (მას აქვს " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "შეიყვანეთ რიცხვი." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "ციფრების სრული რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." -msgstr[1] "ციფრების სრული რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"ათობითი გამყოფის შემდეგ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." -msgstr[1] "" -"ათობითი გამყოფის შემდეგ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"ათობითი გამყოფის შემდეგ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." -msgstr[1] "" -"ათობითი გამყოფის წინ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Null მნიშვნელობები დაუშვებელია." - -msgid "and" -msgstr "და" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s ამ %(field_labels)s-ით უკვე არსებობს." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "მნიშვნელობა %(value)r არ არის დასაშვები." - -msgid "This field cannot be null." -msgstr "ეს ველი არ შეიძლება იყოს null." - -msgid "This field cannot be blank." -msgstr "ეს ველი არ შეიძლება იყოს ცარიელი." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s მოცემული %(field_label)s-ით უკვე არსებობს." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s უნდა იყოს უნიკალური %(date_field_label)s %(lookup_type)s-" -"სთვის." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "ველის ტიპი: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "ლოგიკური (True ან False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "სტრიქონი (%(max_length)s სიმბოლომდე)" - -msgid "Comma-separated integers" -msgstr "მძიმით გამოყოფილი მთელი რიცხვები" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "თარიღი (დროის გარეშე)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "თარიღი (დროსთან ერთად)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "ათობითი რიცხვი" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "ხანგრზლივობა" - -msgid "Email address" -msgstr "ელ. ფოსტის მისამართი" - -msgid "File path" -msgstr "გზა ფაილისაკენ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "რიცხვი მცოცავი წერტილით" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "მთელი" - -msgid "Big (8 byte) integer" -msgstr "დიდი მთელი (8-ბაიტიანი)" - -msgid "IPv4 address" -msgstr "IPv4 მისამართი" - -msgid "IP address" -msgstr "IP-მისამართი" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "ლოგიკური (True, False ან None)" - -msgid "Positive integer" -msgstr "დადებითი მთელი რიცხვი" - -msgid "Positive small integer" -msgstr "დადებითი პატარა მთელი რიცხვი" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "სლაგი (%(max_length)s-მდე)" - -msgid "Small integer" -msgstr "პატარა მთელი რიცხვი" - -msgid "Text" -msgstr "ტექსტი" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "დრო" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "დაუმუშავებელი ორობითი მონაცემები" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "უნივერსალური უნიკალური იდენტიფიკატორი." - -msgid "File" -msgstr "ფაილი" - -msgid "Image" -msgstr "გამოსახულება" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "გარე გასაღები (ტიპი განისაზღვრება დაკავშირებული ველის ტიპით)" - -msgid "One-to-one relationship" -msgstr "კავშირი ერთი-ერთტან" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "კავშირი მრავალი-მრავალთან" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "ეს ველი აუცილებელია." - -msgid "Enter a whole number." -msgstr "შეიყვანეთ მთელი რიცხვი" - -msgid "Enter a valid date." -msgstr "შეიყვანეთ სწორი თარიღი." - -msgid "Enter a valid time." -msgstr "შეიყვანეთ სწორი დრო." - -msgid "Enter a valid date/time." -msgstr "შეიყვანეთ სწორი თარიღი და დრო." - -msgid "Enter a valid duration." -msgstr "შეიყვანეთ სწორი დროის პერიოდი." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"ფაილი არ იყო გამოგზავნილი. შეამოწმეთ კოდირების ტიპი მოცემული ფორმისათვის." - -msgid "No file was submitted." -msgstr "ფაილი არ იყო გამოგზავნილი." - -msgid "The submitted file is empty." -msgstr "გამოგზავნილი ფაილი ცარიელია." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "ან გამოგზავნეთ ფაილი, ან მონიშნეთ \"წაშლის\" დროშა." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"ატვირთეთ დასაშვები გამოსახულება. თქვენს მიერ გამოგზავნილი ფაილი ან არ არის " -"გამოსახულება, ან დაზიანებულია." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "აირჩიეთ დასაშვები მნიშვნელობა. %(value)s დასაშვები არ არის." - -msgid "Enter a list of values." -msgstr "შეიყვანეთ მნიშვნელობების სია." - -msgid "Enter a complete value." -msgstr "შეიყვანეთ სრული მნიშვნელობა." - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(დამალული ველი %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "დალაგება" - -msgid "Delete" -msgstr "წავშალოთ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "გთხოვთ, შეასწოროთ დუბლირებული მონაცემები %(field)s-თვის." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"გთხოვთ, შეასწოროთ დუბლირებული მნიშვნელობა %(field)s ველისთვის, რომელიც უნდა " -"იყოს უნიკალური." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"გთხოვთ, შეასწოროთ დუბლირებული მნიშვნელობა %(field_name)s ველისთვის, რომელიც " -"უნდა იყოს უნიკალური %(lookup)s-ზე, %(date_field)s-თვის." - -msgid "Please correct the duplicate values below." -msgstr "გთხოვთ, შეასწოროთ დუბლირებული მნიშვნელობები." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "აირჩიეთ დასაშვები მნიშვნელობა. ეს არჩევანი დასაშვები არ არის." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "წაშლა" - -msgid "Currently" -msgstr "ამჟამად" - -msgid "Change" -msgstr "შეცვლა" - -msgid "Unknown" -msgstr "გაურკვეველი" - -msgid "Yes" -msgstr "კი" - -msgid "No" -msgstr "არა" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "კი,არა,შესაძლოა" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ბაიტი" -msgstr[1] "%(size)d ბაიტი" - -#, python-format -msgid "%s KB" -msgstr "%s კბ" - -#, python-format -msgid "%s MB" -msgstr "%s მბ" - -#, python-format -msgid "%s GB" -msgstr "%s გბ" - -#, python-format -msgid "%s TB" -msgstr "%s ტბ" - -#, python-format -msgid "%s PB" -msgstr "%s პბ" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "შუაღამე" - -msgid "noon" -msgstr "შუადღე" - -msgid "Monday" -msgstr "ორშაბათი" - -msgid "Tuesday" -msgstr "სამშაბათი" - -msgid "Wednesday" -msgstr "ოთხშაბათი" - -msgid "Thursday" -msgstr "ხუთშაბათი" - -msgid "Friday" -msgstr "პარასკევი" - -msgid "Saturday" -msgstr "შაბათი" - -msgid "Sunday" -msgstr "კვირა" - -msgid "Mon" -msgstr "ორშ" - -msgid "Tue" -msgstr "სამ" - -msgid "Wed" -msgstr "ოთხ" - -msgid "Thu" -msgstr "ხუთ" - -msgid "Fri" -msgstr "პარ" - -msgid "Sat" -msgstr "შაბ" - -msgid "Sun" -msgstr "კვრ" - -msgid "January" -msgstr "იანვარი" - -msgid "February" -msgstr "თებერვალი" - -msgid "March" -msgstr "მარტი" - -msgid "April" -msgstr "აპრილი" - -msgid "May" -msgstr "მაისი" - -msgid "June" -msgstr "ივნისი" - -msgid "July" -msgstr "ივლისი" - -msgid "August" -msgstr "აგვისტო" - -msgid "September" -msgstr "სექტემბერი" - -msgid "October" -msgstr "ოქტომბერი" - -msgid "November" -msgstr "ნოემბერი" - -msgid "December" -msgstr "დეკემბერი" - -msgid "jan" -msgstr "იან" - -msgid "feb" -msgstr "თებ" - -msgid "mar" -msgstr "მარ" - -msgid "apr" -msgstr "აპრ" - -msgid "may" -msgstr "მაი" - -msgid "jun" -msgstr "ივნ" - -msgid "jul" -msgstr "ივლ" - -msgid "aug" -msgstr "აგვ" - -msgid "sep" -msgstr "სექ" - -msgid "oct" -msgstr "ოქტ" - -msgid "nov" -msgstr "ნოე" - -msgid "dec" -msgstr "დეკ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "იან." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "თებ." - -msgctxt "abbrev. month" -msgid "March" -msgstr "მარ." - -msgctxt "abbrev. month" -msgid "April" -msgstr "აპრ." - -msgctxt "abbrev. month" -msgid "May" -msgstr "მაი" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ივნ." - -msgctxt "abbrev. month" -msgid "July" -msgstr "ივლ." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "აგვ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "სექტ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ოქტ." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "ნოემ." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "დეკ." - -msgctxt "alt. month" -msgid "January" -msgstr "იანვარი" - -msgctxt "alt. month" -msgid "February" -msgstr "თებერვალი" - -msgctxt "alt. month" -msgid "March" -msgstr "მარტი" - -msgctxt "alt. month" -msgid "April" -msgstr "აპრილი" - -msgctxt "alt. month" -msgid "May" -msgstr "მაისი" - -msgctxt "alt. month" -msgid "June" -msgstr "ივნისი" - -msgctxt "alt. month" -msgid "July" -msgstr "ივლისი" - -msgctxt "alt. month" -msgid "August" -msgstr "აგვისტო" - -msgctxt "alt. month" -msgid "September" -msgstr "სექტემბერი" - -msgctxt "alt. month" -msgid "October" -msgstr "ოქტომბერი" - -msgctxt "alt. month" -msgid "November" -msgstr "ნოემბერი" - -msgctxt "alt. month" -msgid "December" -msgstr "დეკემბერი" - -msgid "This is not a valid IPv6 address." -msgstr "ეს არ არის სწორი IPv6 მისამართი." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ან" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d წელი" -msgstr[1] "%d წელი" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d თვე" -msgstr[1] "%d თვე" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d კვირა" -msgstr[1] "%d კვირა" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d დღე" -msgstr[1] "%d დღე" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d საათი" -msgstr[1] "%d საათი" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d წუთი" -msgstr[1] "%d წუთი" - -msgid "0 minutes" -msgstr "0 წუთი" - -msgid "Forbidden" -msgstr "აკრძალული" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "მეტი ინფორმაცია მისაწვდომია DEBUG=True-ს მეშვეობით." - -msgid "No year specified" -msgstr "არ არის მითითებული წელი" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "არ არის მითითებული თვე" - -msgid "No day specified" -msgstr "არ არის მითითებული დღე" - -msgid "No week specified" -msgstr "არ არის მითითებული კვირა" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s არ არსებობს" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"მომავალი %(verbose_name_plural)s არ არსებობს იმიტომ, რომ %(class_name)s." -"allow_future არის False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "არ მოიძებნა არცერთი მოთხოვნის თანმხვედრი %(verbose_name)s" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s-ის იდექსი" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ka/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ka/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ka/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ka/formats.py deleted file mode 100644 index 661b71e..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ka/formats.py +++ /dev/null @@ -1,48 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "l, j F, Y" -TIME_FORMAT = "h:i a" -DATETIME_FORMAT = "j F, Y h:i a" -YEAR_MONTH_FORMAT = "F, Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j.M.Y" -SHORT_DATETIME_FORMAT = "j.M.Y H:i" -FIRST_DAY_OF_WEEK = 1 # (Monday) - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - # "%d %b %Y", # '25 Oct 2006' - # "%d %b, %Y", # '25 Oct, 2006' - # "%d %b. %Y", # '25 Oct. 2006' - # "%d %B %Y", # '25 October 2006' - # "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = " " -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/kab/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/kab/LC_MESSAGES/django.mo deleted file mode 100644 index 151ed67..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/kab/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po deleted file mode 100644 index b0f6fa2..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po +++ /dev/null @@ -1,1211 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" -"kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Tafrikanst" - -msgid "Arabic" -msgstr "Taɛṛabt" - -msgid "Asturian" -msgstr "Tasturyant" - -msgid "Azerbaijani" -msgstr "Tazeṛbayǧant" - -msgid "Bulgarian" -msgstr "Tabulgarit" - -msgid "Belarusian" -msgstr "Tabilurusit" - -msgid "Bengali" -msgstr "Tabelgalit" - -msgid "Breton" -msgstr "Tabrutunt" - -msgid "Bosnian" -msgstr "Tabusnit" - -msgid "Catalan" -msgstr "Takaṭalant" - -msgid "Czech" -msgstr "Tačikit" - -msgid "Welsh" -msgstr "Takusit" - -msgid "Danish" -msgstr "Tadanit" - -msgid "German" -msgstr "Talmanit" - -msgid "Lower Sorbian" -msgstr "Tasiṛbit n wadda" - -msgid "Greek" -msgstr "Tagrigit" - -msgid "English" -msgstr "Taglizit" - -msgid "Australian English" -msgstr "Taglizit n Ustralya" - -msgid "British English" -msgstr "Taglizit (UK)" - -msgid "Esperanto" -msgstr "Taspirantit" - -msgid "Spanish" -msgstr "Taspanit" - -msgid "Argentinian Spanish" -msgstr "Taspanit n Arjuntin" - -msgid "Colombian Spanish" -msgstr "Taspanit n Kulumbya" - -msgid "Mexican Spanish" -msgstr "Taspanit n Miksik" - -msgid "Nicaraguan Spanish" -msgstr "Taspanit n Nikaragwa" - -msgid "Venezuelan Spanish" -msgstr "Taspanit n Vinizwila" - -msgid "Estonian" -msgstr "Tastunit" - -msgid "Basque" -msgstr "Tabaskit" - -msgid "Persian" -msgstr "Tafarsit" - -msgid "Finnish" -msgstr "Tafinit" - -msgid "French" -msgstr "Tafṛansist" - -msgid "Frisian" -msgstr "" - -msgid "Irish" -msgstr "" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "" - -msgid "Hebrew" -msgstr "" - -msgid "Hindi" -msgstr "Tahendit" - -msgid "Croatian" -msgstr "Takarwasit" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Tahungarit" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Tandunizit" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Taslandit" - -msgid "Italian" -msgstr "Taṭelyanit" - -msgid "Japanese" -msgstr "" - -msgid "Georgian" -msgstr "Tajyuṛjit" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Takazaxt" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "Takannadat" - -msgid "Korean" -msgstr "Takurit" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "Talitwanit" - -msgid "Latvian" -msgstr "Talitunit" - -msgid "Macedonian" -msgstr "Tamasidunit" - -msgid "Malayalam" -msgstr "Tamayalamt" - -msgid "Mongolian" -msgstr "" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "Tabirmanit" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Tanipalit" - -msgid "Dutch" -msgstr "Tahulandit" - -msgid "Norwegian Nynorsk" -msgstr "" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Tabenjabit" - -msgid "Polish" -msgstr "Tapulandit" - -msgid "Portuguese" -msgstr "Tapurtugit" - -msgid "Brazilian Portuguese" -msgstr "" - -msgid "Romanian" -msgstr "Tarumanit" - -msgid "Russian" -msgstr "Tarusit" - -msgid "Slovak" -msgstr "Tasluvakt" - -msgid "Slovenian" -msgstr "" - -msgid "Albanian" -msgstr "Talbanit" - -msgid "Serbian" -msgstr "Tasiṛbit" - -msgid "Serbian Latin" -msgstr "" - -msgid "Swedish" -msgstr "Taswidit" - -msgid "Swahili" -msgstr "Taswahilit" - -msgid "Tamil" -msgstr "Taṭamult" - -msgid "Telugu" -msgstr "" - -msgid "Thai" -msgstr "" - -msgid "Turkish" -msgstr "Taṭurkit" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "" - -msgid "Simplified Chinese" -msgstr "" - -msgid "Traditional Chinese" -msgstr "" - -msgid "Messages" -msgstr "Iznan" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Sekcem azal ameɣtu." - -msgid "Enter a valid URL." -msgstr "" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Sekcem tansa imayl tameɣtut." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Sekcem tansa IPv4 tameɣtut." - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Sekcem amḍan." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "akked" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "" - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Azemz (s wakud)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Tanzagt" - -msgid "Email address" -msgstr "Tansa email" - -msgid "File path" -msgstr "Abrid n ufaylu" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Ummid" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "Tansa IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "Aḍris" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Akud" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Afaylu" - -msgid "Image" -msgstr "Tugna" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "" - -msgid "Enter a whole number." -msgstr "Sekcem amḍan ummid." - -msgid "Enter a valid date." -msgstr "" - -msgid "Enter a valid time." -msgstr "" - -msgid "Enter a valid date/time." -msgstr "" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -msgid "No file was submitted." -msgstr "Afaylu ur yettwazen ara." - -msgid "The submitted file is empty." -msgstr "" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "" - -msgid "Enter a complete value." -msgstr "Sekcem azal ummid." - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Amizwer" - -msgid "Delete" -msgstr "KKES" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Sfeḍ" - -msgid "Currently" -msgstr "Tura" - -msgid "Change" -msgstr "Beddel" - -msgid "Unknown" -msgstr "Arussin" - -msgid "Yes" -msgstr "Ih" - -msgid "No" -msgstr "Uhu" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "%s KAṬ" - -#, python-format -msgid "%s MB" -msgstr "%s MAṬ" - -#, python-format -msgid "%s GB" -msgstr "%s GAṬ" - -#, python-format -msgid "%s TB" -msgstr "%s TAṬ" - -#, python-format -msgid "%s PB" -msgstr "%s PAṬ" - -msgid "p.m." -msgstr "m.d." - -msgid "a.m." -msgstr "f.t." - -msgid "PM" -msgstr "MD" - -msgid "AM" -msgstr "FT" - -msgid "midnight" -msgstr "ttnaṣfa n yiḍ" - -msgid "noon" -msgstr "ttnaṣfa n uzal" - -msgid "Monday" -msgstr "Arim" - -msgid "Tuesday" -msgstr "Aram" - -msgid "Wednesday" -msgstr "Ahad" - -msgid "Thursday" -msgstr "Amhad" - -msgid "Friday" -msgstr "Sem" - -msgid "Saturday" -msgstr "Sed" - -msgid "Sunday" -msgstr "Acer" - -msgid "Mon" -msgstr "Ari" - -msgid "Tue" -msgstr "Ara" - -msgid "Wed" -msgstr "Aha" - -msgid "Thu" -msgstr "Amh" - -msgid "Fri" -msgstr "Sem" - -msgid "Sat" -msgstr "Sed" - -msgid "Sun" -msgstr "Ace" - -msgid "January" -msgstr "Yennayer" - -msgid "February" -msgstr "Fuṛaṛ" - -msgid "March" -msgstr "Meɣres" - -msgid "April" -msgstr "Yebrir" - -msgid "May" -msgstr "Mayyu" - -msgid "June" -msgstr "Yunyu" - -msgid "July" -msgstr "Yulyu" - -msgid "August" -msgstr "Ɣuct" - -msgid "September" -msgstr "Ctamber" - -msgid "October" -msgstr "Tuber" - -msgid "November" -msgstr "Wamber" - -msgid "December" -msgstr "Dujamber" - -msgid "jan" -msgstr "yen" - -msgid "feb" -msgstr "fuṛ" - -msgid "mar" -msgstr "meɣ" - -msgid "apr" -msgstr "yeb" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "yun" - -msgid "jul" -msgstr "yul" - -msgid "aug" -msgstr "ɣuc" - -msgid "sep" -msgstr "cte" - -msgid "oct" -msgstr "tub" - -msgid "nov" -msgstr "wam" - -msgid "dec" -msgstr "duj" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Yen." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Fuṛ." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Meɣres" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Yebrir" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayyu" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Yunyu" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Yulyu" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ɣuc." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Tub." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Wam." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Duj." - -msgctxt "alt. month" -msgid "January" -msgstr "Yennayer" - -msgctxt "alt. month" -msgid "February" -msgstr "Fuṛaṛ" - -msgctxt "alt. month" -msgid "March" -msgstr "Meɣres" - -msgctxt "alt. month" -msgid "April" -msgstr "Yebrir" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayyu" - -msgctxt "alt. month" -msgid "June" -msgstr "Yunyu" - -msgctxt "alt. month" -msgid "July" -msgstr "Yulyu" - -msgctxt "alt. month" -msgid "August" -msgstr "Ɣuct" - -msgctxt "alt. month" -msgid "September" -msgstr "Ctamber" - -msgctxt "alt. month" -msgid "October" -msgstr "Tuber" - -msgctxt "alt. month" -msgid "November" -msgstr "Wamber" - -msgctxt "alt. month" -msgid "December" -msgstr "Dujamber" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "neɣ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "0 n tisdatin" - -msgid "Forbidden" -msgstr "Yegdel" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "Bdu s Django" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index 38300b2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index 2858be0..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,1223 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Baurzhan Muftakhidinov , 2015 -# Zharzhan Kulmyrza , 2011 -# Leo Trubach , 2017 -# Nurlan Rakhimzhanov , 2011 -# yun_man_ger , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "Араб" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Әзірбайжан" - -msgid "Bulgarian" -msgstr "Болгар" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "Бенгал" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "Босния" - -msgid "Catalan" -msgstr "Каталан" - -msgid "Czech" -msgstr "Чех" - -msgid "Welsh" -msgstr "Валлий" - -msgid "Danish" -msgstr "Дания" - -msgid "German" -msgstr "Неміс" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Грек" - -msgid "English" -msgstr "Ағылшын" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Британдық ағылшын" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "Испан" - -msgid "Argentinian Spanish" -msgstr "Аргентиналық испан" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Мексикалық испан" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуа испан" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "Эстон" - -msgid "Basque" -msgstr "Баск" - -msgid "Persian" -msgstr "Парсы" - -msgid "Finnish" -msgstr "Фин" - -msgid "French" -msgstr "Француз" - -msgid "Frisian" -msgstr "Фриз" - -msgid "Irish" -msgstr "Ирландия" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Галиц" - -msgid "Hebrew" -msgstr "Иврит" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Кроат" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Венгрия" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Индонезия" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Исладия" - -msgid "Italian" -msgstr "Итальян" - -msgid "Japanese" -msgstr "Жапон" - -msgid "Georgian" -msgstr "Грузин" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Қазақша" - -msgid "Khmer" -msgstr "Кхмер" - -msgid "Kannada" -msgstr "Канада" - -msgid "Korean" -msgstr "Корей" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "Литва" - -msgid "Latvian" -msgstr "Латвия" - -msgid "Macedonian" -msgstr "Македон" - -msgid "Malayalam" -msgstr "Малаялам" - -msgid "Mongolian" -msgstr "Монғол" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "Голланд" - -msgid "Norwegian Nynorsk" -msgstr "Норвегиялық нюнор" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Пенджаб" - -msgid "Polish" -msgstr "Поляк" - -msgid "Portuguese" -msgstr "Португал" - -msgid "Brazilian Portuguese" -msgstr "Бразилиялық португал" - -msgid "Romanian" -msgstr "Роман" - -msgid "Russian" -msgstr "Орыс" - -msgid "Slovak" -msgstr "Словак" - -msgid "Slovenian" -msgstr "Словениялық" - -msgid "Albanian" -msgstr "Албан" - -msgid "Serbian" -msgstr "Серб" - -msgid "Serbian Latin" -msgstr "Сербиялық латын" - -msgid "Swedish" -msgstr "Швед" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "Тамиль" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Thai" -msgstr "Тай" - -msgid "Turkish" -msgstr "Түрік" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "Украин" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Вьетнам" - -msgid "Simplified Chinese" -msgstr "Жеңілдетілген қытай" - -msgid "Traditional Chinese" -msgstr "Дәстүрлі қытай" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Тура мәнін енгізіңіз." - -msgid "Enter a valid URL." -msgstr "Тура URL-ді енгізіңіз." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Тура IPv4 адресті енгізіңіз." - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Тек үтірлермен бөлінген цифрлерді енгізіңіз." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Бұл мәннің %(limit_value)s екендігін тексеріңіз (қазір ол %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Бұл мәннің мынадан %(limit_value)s кіші немесе тең екендігін тексеріңіз." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Бұл мәннің мынадан %(limit_value)s үлкен немесе тең екендігін тексеріңіз." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Сан енгізіңіз." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "және" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Бұл жолақ null болмау керек." - -msgid "This field cannot be blank." -msgstr "Бұл жолақ бос болмау керек." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s %(field_label)s жолақпен бұрыннан бар." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Жолақтын түрі: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (True немесе False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Жол (%(max_length)s символға дейін)" - -msgid "Comma-separated integers" -msgstr "Үтірмен бөлінген бүтін сандар" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Дата (уақытсыз)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Дата (уақытпен)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Ондық сан" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Email адрес" - -msgid "File path" -msgstr "Файл жолы" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Реал сан" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Бүтін сан" - -msgid "Big (8 byte) integer" -msgstr "Ұзын (8 байт) бүтін сан" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "IP мекенжайы" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Булеан (True, False немесе None)" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "Мәтін" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Уақыт" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (тип related field арқылы анықталады)" - -msgid "One-to-one relationship" -msgstr "One-to-one қатынас" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Many-to-many қатынас" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Бұл өрісті толтыру міндетті." - -msgid "Enter a whole number." -msgstr "Толық санды енгізіңіз." - -msgid "Enter a valid date." -msgstr "Дұрыс күнді енгізіңіз." - -msgid "Enter a valid time." -msgstr "Дұрыс уақытты енгізіңіз." - -msgid "Enter a valid date/time." -msgstr "Дұрыс күнді/уақытты енгізіңіз." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ешқандай файл жіберілмеді. Форманың кодтау түрін тексеріңіз." - -msgid "No file was submitted." -msgstr "Ешқандай файл жіберілмеді." - -msgid "The submitted file is empty." -msgstr "Бос файл жіберілді." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Файлды жіберіңіз немесе тазалауды белгіленіз, екеуін бірге емес." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Дұрыс сүретті жүктеңіз. Сіз жүктеген файл - сүрет емес немесе бұзылған сүрет." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Дұрыс тандау жасаңыз. %(value)s дұрыс тандау емес." - -msgid "Enter a list of values." -msgstr "Мәндер тізімін енгізіңіз." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Сұрыптау" - -msgid "Delete" -msgstr "Жою" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s жолақтағы қайталанған мәнді түзетіңіз." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "%(field)s жолақтағы мәнді түзетіңіз, ол бірегей болу керек." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s жолақтағы мәнді түзетіңіз. Ол %(date_field)s жолақтың ішінде " -"%(lookup)s үшін бірегей болу керек." - -msgid "Please correct the duplicate values below." -msgstr "Қайталанатын мәндерді түзетіңіз." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Дұрыс нұсқаны таңдаңыз. Бұл нұсқа дұрыс таңдаулардың арасында жоқ." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Тазалау" - -msgid "Currently" -msgstr "Ағымдағы" - -msgid "Change" -msgstr "Түзету" - -msgid "Unknown" -msgstr "Белгісіз" - -msgid "Yes" -msgstr "Иә" - -msgid "No" -msgstr "Жоқ" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "иә,жоқ,мүмкін" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байт" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "Т.Қ." - -msgid "a.m." -msgstr "Т.Ж." - -msgid "PM" -msgstr "ТҚ" - -msgid "AM" -msgstr "ТЖ" - -msgid "midnight" -msgstr "түнжарым" - -msgid "noon" -msgstr "түсқайта" - -msgid "Monday" -msgstr "Дүйсенбі" - -msgid "Tuesday" -msgstr "Сейсенбі" - -msgid "Wednesday" -msgstr "Сәрсенбі" - -msgid "Thursday" -msgstr "Бейсенбі" - -msgid "Friday" -msgstr "Жума" - -msgid "Saturday" -msgstr "Сенбі" - -msgid "Sunday" -msgstr "Жексенбі" - -msgid "Mon" -msgstr "Дб" - -msgid "Tue" -msgstr "Сб" - -msgid "Wed" -msgstr "Ср" - -msgid "Thu" -msgstr "Бс" - -msgid "Fri" -msgstr "Жм" - -msgid "Sat" -msgstr "Сн" - -msgid "Sun" -msgstr "Жк" - -msgid "January" -msgstr "Қаңтар" - -msgid "February" -msgstr "Ақпан" - -msgid "March" -msgstr "Наурыз" - -msgid "April" -msgstr "Сәуір" - -msgid "May" -msgstr "Мамыр" - -msgid "June" -msgstr "Маусым" - -msgid "July" -msgstr "Шілде" - -msgid "August" -msgstr "Тамыз" - -msgid "September" -msgstr "Қыркүйек" - -msgid "October" -msgstr "Қазан" - -msgid "November" -msgstr "Қараша" - -msgid "December" -msgstr "Желтоқсан" - -msgid "jan" -msgstr "қан" - -msgid "feb" -msgstr "ақп" - -msgid "mar" -msgstr "нау" - -msgid "apr" -msgstr "сәу" - -msgid "may" -msgstr "мам" - -msgid "jun" -msgstr "мау" - -msgid "jul" -msgstr "шіл" - -msgid "aug" -msgstr "там" - -msgid "sep" -msgstr "қыр" - -msgid "oct" -msgstr "қаз" - -msgid "nov" -msgstr "қар" - -msgid "dec" -msgstr "жел" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Қаң." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Ақп." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Наурыз" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Сәуір" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Мамыр" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Маусым" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Шілде" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Там." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Қыр." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Қаз." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Қар." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Жел." - -msgctxt "alt. month" -msgid "January" -msgstr "Қаңтар" - -msgctxt "alt. month" -msgid "February" -msgstr "Ақпан" - -msgctxt "alt. month" -msgid "March" -msgstr "Наурыз" - -msgctxt "alt. month" -msgid "April" -msgstr "Сәуір" - -msgctxt "alt. month" -msgid "May" -msgstr "Мамыр" - -msgctxt "alt. month" -msgid "June" -msgstr "Маусым" - -msgctxt "alt. month" -msgid "July" -msgstr "Шілде" - -msgctxt "alt. month" -msgid "August" -msgstr "Тамыз" - -msgctxt "alt. month" -msgid "September" -msgstr "Қыркүйек" - -msgctxt "alt. month" -msgid "October" -msgstr "Қазан" - -msgctxt "alt. month" -msgid "November" -msgstr "Қараша" - -msgctxt "alt. month" -msgid "December" -msgstr "Желтоқсан" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "немесе" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Жыл таңдалмаған" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Ай таңдалмаған" - -msgid "No day specified" -msgstr "Күн таңдалмаған" - -msgid "No week specified" -msgstr "Апта таңдалмаған" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s қол жеткізгісіз" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Болашақ %(verbose_name_plural)s қол жеткізгісіз, себебі %(class_name)s." -"allow_future False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "%(verbose_name)s табылған жоқ" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/km/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index 3de6c80..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/km/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index c706129..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,1196 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "ភាសាអារ៉ាប់" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "ភាសាបេឡារុស្ស" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "" - -msgid "Catalan" -msgstr "" - -msgid "Czech" -msgstr "ភាសាឆេក" - -msgid "Welsh" -msgstr "ភាសាអ៊ុយក្រែន" - -msgid "Danish" -msgstr "ភាសាដាណឺម៉ាក" - -msgid "German" -msgstr "ភាសាអាល្លឺម៉ង់" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "ភាសាហ្កែលិគ" - -msgid "English" -msgstr "ភាសាអង់គ្លេស" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "ភាសាអេស្ប៉ាញ" - -msgid "Argentinian Spanish" -msgstr "" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "" - -msgid "Basque" -msgstr "" - -msgid "Persian" -msgstr "" - -msgid "Finnish" -msgstr "ភាសាហ្វាំងឡង់" - -msgid "French" -msgstr "ភាសាបារាំង" - -msgid "Frisian" -msgstr "" - -msgid "Irish" -msgstr "" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "ភាសាហ្កែលិគ" - -msgid "Hebrew" -msgstr "ភាសាហេប្រិ" - -msgid "Hindi" -msgstr "" - -msgid "Croatian" -msgstr "" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ភាសាហុងគ្រី" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ភាសាអ៉ីស្លង់" - -msgid "Italian" -msgstr "ភាសាអ៊ីតាលី" - -msgid "Japanese" -msgstr "ភាសាជប៉ុន" - -msgid "Georgian" -msgstr "" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "" - -msgid "Korean" -msgstr "" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "" - -msgid "Latvian" -msgstr "" - -msgid "Macedonian" -msgstr "" - -msgid "Malayalam" -msgstr "" - -msgid "Mongolian" -msgstr "" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "ភាសាហ្វាំងឡង់" - -msgid "Norwegian Nynorsk" -msgstr "" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "" - -msgid "Polish" -msgstr "" - -msgid "Portuguese" -msgstr "" - -msgid "Brazilian Portuguese" -msgstr "" - -msgid "Romanian" -msgstr "ភាសារូម៉ានី" - -msgid "Russian" -msgstr "ភាសាรัរូស្ស៉ី" - -msgid "Slovak" -msgstr "ភាសាស្លូវ៉ាគី" - -msgid "Slovenian" -msgstr "ភាសាស្លូវ៉ានី" - -msgid "Albanian" -msgstr "" - -msgid "Serbian" -msgstr "" - -msgid "Serbian Latin" -msgstr "" - -msgid "Swedish" -msgstr "ភាសាស៊ុយអែដ" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "ភាសាតាមីល" - -msgid "Telugu" -msgstr "" - -msgid "Thai" -msgstr "" - -msgid "Turkish" -msgstr "ភាសាទួរគី" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ភាសាអ៊ុយក្រែន" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "" - -msgid "Simplified Chinese" -msgstr "ភាសាចិនសាមញ្ញ" - -msgid "Traditional Chinese" -msgstr "ភាសាចិនបុរាណ" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "" - -msgid "Enter a valid URL." -msgstr "" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "បំពេញតែលេខហើយផ្តាច់ចេញពីគ្នាដោយសញ្ញាក្បៀស។" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -msgid "Enter a number." -msgstr "" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "និង" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "ចាំបាច់បំពេញទិន្នន័យកន្លែងនេះ។" - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (អាច​ជា True រឺ False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "ចំនួនពិត(Integer) ដែលផ្តាច់ចេញពីគ្នាដោយ​ក្បៀស" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "កាល​បរិច្ឆេទ (Date) (មិនមានសរសេរម៉ោង)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "កាល​បរិច្ឆេទ (Date) (មានសរសេរម៉ោង)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "ចំនួនទសភាគ (Decimal)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "" - -msgid "File path" -msgstr "ផ្លូវទៅកាន់ឯកសារ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "ចំនួនពិត(Integer)" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "លេខ IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (អាចជា True​ រឺ False រឺ None)" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "អត្ថបទ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "ពេលវេលា" - -msgid "URL" -msgstr "អាស័យដ្ឋានគេហទំព័រ(URL)" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "ចាំបាច់បំពេញទិន្នន័យកន្លែងនេះ។" - -msgid "Enter a whole number." -msgstr "បំពេញចំនួនទាំងអស់។" - -msgid "Enter a valid date." -msgstr "" - -msgid "Enter a valid time." -msgstr "" - -msgid "Enter a valid date/time." -msgstr "" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "មិនមានឯកសារត្រូវបានជ្រើសរើស។ សូមពិនិត្យប្រភេទឯកសារម្តងទៀត។" - -msgid "No file was submitted." -msgstr "" - -msgid "The submitted file is empty." -msgstr "ពុំមានឯកសារ។​" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "រូបភាពដែលទាញយកមិនត្រឹមត្រូវ ប្រហែលជាមិនមែនជារូបភាព ឬក៏ជា រូបភាពខូច។" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "" - -msgid "Delete" -msgstr "លប់" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Currently" -msgstr "" - -msgid "Change" -msgstr "ផ្លាស់ប្តូរ" - -msgid "Unknown" -msgstr "មិន​ដឹង" - -msgid "Yes" -msgstr "យល់ព្រម" - -msgid "No" -msgstr "មិនយល់ព្រម" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "យល់ព្រម មិនយល់ព្រម​ ប្រហែល" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" - -#, python-format -msgid "%s KB" -msgstr "" - -#, python-format -msgid "%s MB" -msgstr "" - -#, python-format -msgid "%s GB" -msgstr "" - -#, python-format -msgid "%s TB" -msgstr "" - -#, python-format -msgid "%s PB" -msgstr "" - -msgid "p.m." -msgstr "" - -msgid "a.m." -msgstr "" - -msgid "PM" -msgstr "" - -msgid "AM" -msgstr "" - -msgid "midnight" -msgstr "" - -msgid "noon" -msgstr "" - -msgid "Monday" -msgstr "ច័ន្ទ" - -msgid "Tuesday" -msgstr "អង្គារ" - -msgid "Wednesday" -msgstr "ពុធ" - -msgid "Thursday" -msgstr "ព្រហស្បតិ៍" - -msgid "Friday" -msgstr "សុក្រ" - -msgid "Saturday" -msgstr "សៅរ៍" - -msgid "Sunday" -msgstr "អាទិត្យ" - -msgid "Mon" -msgstr "" - -msgid "Tue" -msgstr "" - -msgid "Wed" -msgstr "" - -msgid "Thu" -msgstr "" - -msgid "Fri" -msgstr "" - -msgid "Sat" -msgstr "" - -msgid "Sun" -msgstr "" - -msgid "January" -msgstr "មករា" - -msgid "February" -msgstr "កុម្ភៈ" - -msgid "March" -msgstr "មិនា" - -msgid "April" -msgstr "មេសា" - -msgid "May" -msgstr "ឧសភា" - -msgid "June" -msgstr "មិថុនា" - -msgid "July" -msgstr "កក្កដា" - -msgid "August" -msgstr "សីហា" - -msgid "September" -msgstr "កញ្ញា" - -msgid "October" -msgstr "តុលា" - -msgid "November" -msgstr "វិច្ឆិកា" - -msgid "December" -msgstr "ធ្នូ" - -msgid "jan" -msgstr "មករា" - -msgid "feb" -msgstr "កុម្ភះ" - -msgid "mar" -msgstr "មិនា" - -msgid "apr" -msgstr "មេសា" - -msgid "may" -msgstr "ឧសភា" - -msgid "jun" -msgstr "មិថុនា" - -msgid "jul" -msgstr "កក្កដា" - -msgid "aug" -msgstr "សីហា" - -msgid "sep" -msgstr "កញ្ញា" - -msgid "oct" -msgstr "តុលា" - -msgid "nov" -msgstr "វិច្ឆិកា" - -msgid "dec" -msgstr "ធ្នូ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -msgctxt "abbrev. month" -msgid "March" -msgstr "មិនា" - -msgctxt "abbrev. month" -msgid "April" -msgstr "មេសា" - -msgctxt "abbrev. month" -msgid "May" -msgstr "ឧសភា" - -msgctxt "abbrev. month" -msgid "June" -msgstr "មិថុនា" - -msgctxt "abbrev. month" -msgid "July" -msgstr "កក្កដា" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -msgctxt "alt. month" -msgid "January" -msgstr "មករា" - -msgctxt "alt. month" -msgid "February" -msgstr "កុម្ភៈ" - -msgctxt "alt. month" -msgid "March" -msgstr "មិនា" - -msgctxt "alt. month" -msgid "April" -msgstr "មេសា" - -msgctxt "alt. month" -msgid "May" -msgstr "ឧសភា" - -msgctxt "alt. month" -msgid "June" -msgstr "មិថុនា" - -msgctxt "alt. month" -msgid "July" -msgstr "កក្កដា" - -msgctxt "alt. month" -msgid "August" -msgstr "សីហា" - -msgctxt "alt. month" -msgid "September" -msgstr "កញ្ញា" - -msgctxt "alt. month" -msgid "October" -msgstr "តុលា" - -msgctxt "alt. month" -msgid "November" -msgstr "វិច្ឆិកា" - -msgctxt "alt. month" -msgid "December" -msgstr "ធ្នូ" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "" - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/km/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/km/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/km/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/km/formats.py deleted file mode 100644 index 5923437..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/km/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j ខែ F ឆ្នាំ Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j ខែ F ឆ្នាំ Y, G:i" -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -SHORT_DATETIME_FORMAT = "j M Y, G:i" -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index c926f57..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index f2ba2aa..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1232 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# karthikbgl , 2011-2012 -# Ramakrishna Yekulla , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "ಅರೇಬಿಕ್" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "ಆಜೆರ್ಬೈಜನಿ" - -msgid "Bulgarian" -msgstr "ಬಲ್ಗೇರಿಯನ್" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "ಬೆಂಗಾಲಿ" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "ಬೋಸ್ನಿಯನ್" - -msgid "Catalan" -msgstr "ಕೆಟಲಾನ್" - -msgid "Czech" -msgstr "ಝೆಕ್" - -msgid "Welsh" -msgstr "ವೆಲ್ಷ್" - -msgid "Danish" -msgstr "ಡ್ಯಾನಿಷ್" - -msgid "German" -msgstr "ಜರ್ಮನ್" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "ಗ್ರೀಕ್" - -msgid "English" -msgstr "ಇಂಗ್ಲಿಷ್" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "ಬ್ರಿಟೀಶ್ ಇಂಗ್ಲಿಷ್" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "ಸ್ಪ್ಯಾನಿಷ್" - -msgid "Argentinian Spanish" -msgstr "ಅರ್ಜೆಂಟಿನಿಯನ್ ಸ್ಪಾನಿಷ್" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "ಮೆಕ್ಸಿಕನ್ ಸ್ಪಾನಿಷ್" - -msgid "Nicaraguan Spanish" -msgstr "nicarguan ಸ್ಪಾನಿಷ್" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "ಎಷ್ಟೋನಿಯನ್" - -msgid "Basque" -msgstr "ಬಾಸ್ಕ್‍" - -msgid "Persian" -msgstr "ಪರ್ಶಿಯನ್" - -msgid "Finnish" -msgstr "ಫಿನ್ನಿಶ್" - -msgid "French" -msgstr "ಫ್ರೆಂಚ್" - -msgid "Frisian" -msgstr "ಫ್ರಿಸಿಯನ್" - -msgid "Irish" -msgstr "ಐರಿಶ್" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "ಗೆಲಿಶಿಯನ್" - -msgid "Hebrew" -msgstr "ಹೀಬ್ರೂ" - -msgid "Hindi" -msgstr "ಹಿಂದಿ" - -msgid "Croatian" -msgstr "ಕ್ರೊಯೇಶಿಯನ್" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ಹಂಗೇರಿಯನ್" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "ಇಂಡೋನಿಶಿಯನ್" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ಐಸ್‌ಲ್ಯಾಂಡಿಕ್" - -msgid "Italian" -msgstr "ಇಟಾಲಿಯನ್" - -msgid "Japanese" -msgstr "ಜಾಪನೀಸ್" - -msgid "Georgian" -msgstr "ಜಾರ್ಜೆಯನ್ " - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "ಖಮೇರ್" - -msgid "Kannada" -msgstr "ಕನ್ನಡ" - -msgid "Korean" -msgstr "ಕೊರಿಯನ್" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "ಲಿತುವಾನಿಯನ್ " - -msgid "Latvian" -msgstr "ಲಾಟ್ವಿಯನ್" - -msgid "Macedonian" -msgstr "ಮೆಸಡೊನಿಯನ್" - -msgid "Malayalam" -msgstr "ಮಲಯಾಳಂ" - -msgid "Mongolian" -msgstr "ಮಂಗೊಲಿಯನ್" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "ಡಚ್" - -msgid "Norwegian Nynorsk" -msgstr "ನಾರ್ವೇಜಿಯನ್ ನಿನೋರ್ಕ್" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "ಪಂಜಾಬಿ" - -msgid "Polish" -msgstr "ಪೋಲಿಷ್" - -msgid "Portuguese" -msgstr "ಪೋರ್ಚುಗೀಸ್" - -msgid "Brazilian Portuguese" -msgstr "ಬ್ರಜೀಲಿಯನ್ ಪೋರ್ಚುಗೀಸ್" - -msgid "Romanian" -msgstr "ರೋಮೇನಿಯನ್" - -msgid "Russian" -msgstr "ರಶಿಯನ್" - -msgid "Slovak" -msgstr "ಸ್ಲೋವಾಕ್" - -msgid "Slovenian" -msgstr "ಸ್ಲೋವೇನಿಯನ್" - -msgid "Albanian" -msgstr "ಅಲ್ಬೆನಿಯನ್ " - -msgid "Serbian" -msgstr "ಸರ್ಬಿಯನ್" - -msgid "Serbian Latin" -msgstr "ಸರ್ಬಿಯನ್ ಲ್ಯಾಟಿನ್" - -msgid "Swedish" -msgstr "ಸ್ವೀಡಿಷ್" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "ತಮಿಳು" - -msgid "Telugu" -msgstr "ತೆಲುಗು" - -msgid "Thai" -msgstr "ಥಾಯ್" - -msgid "Turkish" -msgstr "ಟರ್ಕಿಶ್" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ಉಕ್ರೇನಿಯನ್" - -msgid "Urdu" -msgstr "ಉರ್ದು" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "ವಿಯೆತ್ನಾಮೀಸ್" - -msgid "Simplified Chinese" -msgstr "ಸರಳೀಕೃತ ಚೈನೀಸ್" - -msgid "Traditional Chinese" -msgstr "ಸಂಪ್ರದಾಯಿಕ ಚೈನೀಸ್ " - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "ಸಿಂಧುವಾದ ಮೌಲ್ಯವನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid URL." -msgstr "ಸರಿಯಾದ ಒಂದು URL ಅನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "ಒಂದು ಸರಿಯಾದ IPv4 ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid IPv6 address." -msgstr "ಮಾನ್ಯವಾದ IPv6 ವಿಳಾಸ ದಾಖಲಿಸಿ" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "ಮಾನ್ಯವಾದ IPv4 ಅಥವಾ IPv6 ವಿಳಾಸ ದಾಖಲಿಸಿ" - -msgid "Enter only digits separated by commas." -msgstr "ಅಲ್ಪವಿರಾಮ(,)ಗಳಿಂದ ಬೇರ್ಪಟ್ಟ ಅಂಕೆಗಳನ್ನು ಮಾತ್ರ ಬರೆಯಿರಿ." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"ಈ ಮೌಲ್ಯವು %(limit_value)s ಆಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ (ಇದು %(show_value)s ಆಗಿದೆ)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"ಈ ಮೌಲ್ಯವು %(limit_value)s ಕ್ಕಿಂತ ಕಡಿಮೆಯ ಅಥವ ಸಮನಾದ ಮೌಲ್ಯವಾಗಿದೆ ಎಂದು ಖಾತ್ರಿ " -"ಮಾಡಿಕೊಳ್ಳಿ." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"ಈ ಮೌಲ್ಯವು %(limit_value)s ಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಅಥವ ಸಮನಾದ ಮೌಲ್ಯವಾಗಿದೆ ಎಂದು ಖಾತ್ರಿ " -"ಮಾಡಿಕೊಳ್ಳಿ." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "ಒಂದು ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "ಮತ್ತು" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "ಈ ಅಂಶವನ್ನು ಖಾಲಿ ಬಿಡುವಂತಿಲ್ಲ." - -msgid "This field cannot be blank." -msgstr "ಈ ಸ್ಥಳವು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" -"ಈ %(field_label)s ಅನ್ನು ಹೊಂದಿರುವ ಒಂದು %(model_name)s ಈಗಾಗಲೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "ಕ್ಷೇತ್ರದ ಬಗೆ: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "ಬೂಲಿಯನ್ (ಹೌದು ಅಥವ ಅಲ್ಲ)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "ಪದಪುಂಜ (%(max_length)s ವರೆಗೆ)" - -msgid "Comma-separated integers" -msgstr "ಅಲ್ಪವಿರಾಮ(,) ದಿಂದ ಬೇರ್ಪಟ್ಟ ಪೂರ್ಣಸಂಖ್ಯೆಗಳು" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "ದಿನಾಂಕ (ಸಮಯವಿಲ್ಲದೆ)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "ದಿನಾಂಕ (ಸಮಯದೊಂದಿಗೆ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "ದಶಮಾನ ಸಂಖ್ಯೆ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "" - -msgid "File path" -msgstr "ಕಡತದ ಸ್ಥಾನಪಥ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "ತೇಲುವ-ಬಿಂದು ಸಂಖ್ಯೆ" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "ಪೂರ್ಣಾಂಕ" - -msgid "Big (8 byte) integer" -msgstr "ಬೃಹತ್ (೮ ಬೈಟ್) ಪೂರ್ಣ ಸಂಖ್ಯೆ" - -msgid "IPv4 address" -msgstr "IPv4 ವಿಳಾಸ" - -msgid "IP address" -msgstr "IP ವಿಳಾಸ" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "ಬೂಲಿಯನ್ (ನಿಜ, ಸುಳ್ಳು ಅಥವ ಯಾವುದೂ ಅಲ್ಲ ಇವುಗಳಲ್ಲಿ ಒಂದು)" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "ಪಠ್ಯ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "ಸಮಯ" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "ಬಾಹ್ಯ ಕೀಲಿ (ಸಂಬಂಧಿತ ಸ್ಥಳದಿಂದ ಪ್ರಕಾರವನ್ನು ನಿರ್ಧರಿಸಲಾಗುತ್ತದೆ)" - -msgid "One-to-one relationship" -msgstr "ಒನ್-ಟು-ಒನ್ (ಪರಸ್ಪರ) ಸಂಬಂಧ" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "ಮೆನಿ-ಟು-ಮೆನಿ (ಸಾರ್ವಜನಿಕ) ಸಂಬಂಧ" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "ಈ ಸ್ಥಳವು ಅಗತ್ಯವಿರುತ್ತದೆ." - -msgid "Enter a whole number." -msgstr "ಪೂರ್ಣಾಂಕವೊಂದನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid date." -msgstr "ಸರಿಯಾದ ದಿನಾಂಕವನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid time." -msgstr "ಸರಿಯಾದ ಸಮಯವನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid date/time." -msgstr "ಸರಿಯಾದ ದಿನಾಂಕ/ಸಮಯವನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"ಯಾವದೇ ಕಡತವನ್ನೂ ಸಲ್ಲಿಸಲಾಗಿಲ್ಲ. ನಮೂನೆಯ ಮೇಲಿನ ಸಂಕೇತೀಕರಣ (ಎನ್ಕೋಡಿಂಗ್) ಬಗೆಯನ್ನು " -"ಪರೀಕ್ಷಿಸಿ." - -msgid "No file was submitted." -msgstr "ಯಾವದೇ ಕಡತವನ್ನೂ ಸಲ್ಲಿಸಲಾಗಿಲ್ಲ." - -msgid "The submitted file is empty." -msgstr "ಸಲ್ಲಿಸಲಾದ ಕಡತ ಖಾಲಿ ಇದೆ." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"ದಯವಿಟ್ಟು ಕಡತವನ್ನು ಸಲ್ಲಿಸಿ ಅಥವ ಅಳಿಸುವ ಗುರುತುಚೌಕವನ್ನು ಗುರುತು ಹಾಕಿ, ಎರಡನ್ನೂ ಒಟ್ಟಿಗೆ " -"ಮಾಡಬೇಡಿ." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"ಸರಿಯಾದ ಚಿತ್ರವನ್ನು ಸೇರಿಸಿ. ನೀವು ಸೇರಿಸಿದ ಕಡತವು ಚಿತ್ರವೇ ಅಲ್ಲ ಅಥವಾ ಅದು ಒಂದು ಹಾಳಾದ " -"ಚಿತ್ರವಾಗಿದೆ. " - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "ಸರಿಯಾದ ಒಂದು ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ. %(value)s ಎನ್ನುವುದು ಲಭ್ಯವಿರುವ ಆಯ್ಕೆಗಳಲ್ಲಿ ಇಲ್ಲ." - -msgid "Enter a list of values." -msgstr "ಮೌಲ್ಯಗಳ ಒಂದು ಪಟ್ಟಿಯನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ಕ್ರಮ" - -msgid "Delete" -msgstr "ಅಳಿಸಿಹಾಕಿ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s ಗಾಗಿ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮಾಹಿತಿಯನ್ನು ಸರಿಪಡಿಸಿ." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s ಗಾಗಿ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮಾಹಿತಿಯನ್ನು ಸರಿಪಡಿಸಿ, ಇದರ ಮೌಲ್ಯವು " -"ವಿಶಿಷ್ಟವಾಗಿರಬೇಕು." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s ಗಾಗಿ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮಾಹಿತಿಯನ್ನು ಸರಿಪಡಿಸಿ, %(date_field)s " -"ನಲ್ಲಿನ %(lookup)s ಗಾಗಿ ಇದರ ಮೌಲ್ಯವು ವಿಶಿಷ್ಟವಾಗಿರಬೇಕು." - -msgid "Please correct the duplicate values below." -msgstr "ದಯವಿಟ್ಟು ಈ ಕೆಳಗೆ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮೌಲ್ಯವನ್ನು ಸರಿಪಡಿಸಿ." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "ಸರಿಯಾದ ಒಂದು ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ. ಆ ಆಯ್ಕೆಯು ಲಭ್ಯವಿರುವ ಆಯ್ಕೆಗಳಲ್ಲಿ ಇಲ್ಲ." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "ಮುಕ್ತಗೊಳಿಸು" - -msgid "Currently" -msgstr "ಪ್ರಸಕ್ತ" - -msgid "Change" -msgstr "ಬದಲಾವಣೆ" - -msgid "Unknown" -msgstr "ಗೊತ್ತಿರದ" - -msgid "Yes" -msgstr "ಹೌದು" - -msgid "No" -msgstr "ಇಲ್ಲ" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ಹೌದು,ಇಲ್ಲ,ಇರಬಹುದು" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ಬೈಟ್‌ಗಳು" -msgstr[1] "%(size)d ಬೈಟ್‌ಗಳು" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "ಅಪರಾಹ್ನ" - -msgid "a.m." -msgstr "ಪೂರ್ವಾಹ್ನ" - -msgid "PM" -msgstr "ಅಪರಾಹ್ನ" - -msgid "AM" -msgstr "ಪೂರ್ವಾಹ್ನ" - -msgid "midnight" -msgstr "ಮಧ್ಯರಾತ್ರಿ" - -msgid "noon" -msgstr "ಮಧ್ಯಾಹ್ನ" - -msgid "Monday" -msgstr "ಸೋಮವಾರ" - -msgid "Tuesday" -msgstr "ಮಂಗಳವಾರ" - -msgid "Wednesday" -msgstr "ಬುಧವಾರ" - -msgid "Thursday" -msgstr "ಗುರುವಾರ" - -msgid "Friday" -msgstr "ಶುಕ್ರವಾರ" - -msgid "Saturday" -msgstr "ಶನಿವಾರ" - -msgid "Sunday" -msgstr "ರವಿವಾರ" - -msgid "Mon" -msgstr "ಸೋಮ" - -msgid "Tue" -msgstr "ಮಂಗಳ" - -msgid "Wed" -msgstr "ಬುಧ" - -msgid "Thu" -msgstr "ಗುರು" - -msgid "Fri" -msgstr "ಶುಕ್ರ" - -msgid "Sat" -msgstr "ಶನಿ" - -msgid "Sun" -msgstr "ರವಿ" - -msgid "January" -msgstr "ಜನವರಿ" - -msgid "February" -msgstr "ಫೆಬ್ರುವರಿ" - -msgid "March" -msgstr "ಮಾರ್ಚ್" - -msgid "April" -msgstr "ಎಪ್ರಿಲ್" - -msgid "May" -msgstr "ಮೇ" - -msgid "June" -msgstr "ಜೂನ್" - -msgid "July" -msgstr "ಜುಲೈ" - -msgid "August" -msgstr "ಆಗಸ್ಟ್" - -msgid "September" -msgstr "ಸೆಪ್ಟೆಂಬರ್" - -msgid "October" -msgstr "ಅಕ್ಟೋಬರ್" - -msgid "November" -msgstr "ನವೆಂಬರ್" - -msgid "December" -msgstr "ಡಿಸೆಂಬರ್" - -msgid "jan" -msgstr "ಜನವರಿ" - -msgid "feb" -msgstr "ಫೆಬ್ರವರಿ" - -msgid "mar" -msgstr "ಮಾರ್ಚ್" - -msgid "apr" -msgstr "ಏಪ್ರಿಲ್" - -msgid "may" -msgstr "ಮೇ" - -msgid "jun" -msgstr "ಜೂನ್" - -msgid "jul" -msgstr "ಜುಲೈ" - -msgid "aug" -msgstr "ಆಗಸ್ಟ್‍" - -msgid "sep" -msgstr "ಸೆಪ್ಟೆಂಬರ್" - -msgid "oct" -msgstr "ಅಕ್ಟೋಬರ್" - -msgid "nov" -msgstr "ನವೆಂಬರ್" - -msgid "dec" -msgstr "ಡಿಸೆಂಬರ್" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "ಜನ." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ಫೆಬ್ರ." - -msgctxt "abbrev. month" -msgid "March" -msgstr "ಮಾರ್ಚ್" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ಏಪ್ರಿಲ್" - -msgctxt "abbrev. month" -msgid "May" -msgstr "ಮೇ" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ಜೂನ್" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ಜುಲೈ" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ಆಗ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ಸೆಪ್ಟೆ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ಅಕ್ಟೋ." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "ನವೆಂ." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ಡಿಸೆಂ." - -msgctxt "alt. month" -msgid "January" -msgstr "ಜನವರಿ" - -msgctxt "alt. month" -msgid "February" -msgstr "ಫೆಬ್ರವರಿ" - -msgctxt "alt. month" -msgid "March" -msgstr "ಮಾರ್ಚ್" - -msgctxt "alt. month" -msgid "April" -msgstr "ಏಪ್ರಿಲ್" - -msgctxt "alt. month" -msgid "May" -msgstr "ಮೇ" - -msgctxt "alt. month" -msgid "June" -msgstr "ಜೂನ್" - -msgctxt "alt. month" -msgid "July" -msgstr "ಜುಲೈ" - -msgctxt "alt. month" -msgid "August" -msgstr "ಆಗಸ್ಟ್‍" - -msgctxt "alt. month" -msgid "September" -msgstr "ಸಪ್ಟೆಂಬರ್" - -msgctxt "alt. month" -msgid "October" -msgstr "ಅಕ್ಟೋಬರ್" - -msgctxt "alt. month" -msgid "November" -msgstr "ನವೆಂಬರ್" - -msgctxt "alt. month" -msgid "December" -msgstr "ಡಿಸೆಂಬರ್" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ಅಥವ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "ಯಾವುದೆ ವರ್ಷವನ್ನು ಸೂಚಿಲಾಗಿಲ್ಲ" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "ಯಾವುದೆ ತಿಂಗಳನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" - -msgid "No day specified" -msgstr "ಯಾವುದೆ ದಿನವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" - -msgid "No week specified" -msgstr "ಯಾವುದೆ ವಾರವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "ಯಾವುದೆ %(verbose_name_plural)s ಲಭ್ಯವಿಲ್ಲ" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"ಭವಿಷ್ಯದ %(verbose_name_plural)s ಲಭ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ %(class_name)s.allow_future " -"ಎನ್ನುವುದು ಅಸತ್ಯವಾಗಿದೆ (ಫಾಲ್ಸ್‍) ಆಗಿದೆ." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "ಮನವಿಗೆ ತಾಳೆಯಾಗುವ ಯಾವುದೆ %(verbose_name)s ಕಂಡುಬಂದಿಲ್ಲ" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/kn/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/kn/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/kn/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/kn/formats.py deleted file mode 100644 index d212fd5..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/kn/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "h:i A" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -# DECIMAL_SEPARATOR = -# THOUSAND_SEPARATOR = -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ko/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index 2852e21..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ko/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index 852e31c..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,1334 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BJ Jang , 2014 -# JunGu Kang , 2017 -# Jiyoon, Ha , 2016 -# darjeeling , 2024 -# DONGHO JEONG , 2020 -# Park Hyunwoo , 2017 -# Geonho Kim / Leo Kim , 2019 -# hoseung2 , 2017 -# Ian Y. Choi , 2015 -# Jaehong Kim , 2011 -# Jannis Leidel , 2011 -# Jay Oh , 2020 -# Le Tartuffe , 2014,2016 -# Jonghwa Seo , 2019 -# Jubeen Lee , 2020 -# JuneHyeon Bae , 2014 -# JunGu Kang , 2015 -# JunGu Kang , 2019 -# Kagami Sascha Rosylight , 2017 -# Mariusz Felisiak , 2021 -# Seho Noh , 2018 -# Seoeun(Sun☀️) Hong, 2023 -# 최소영, 2024 -# Subin Choi , 2016 -# Taesik Yoon , 2015 -# 정훈 이, 2021 -# 김영빈, 2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: 김영빈, 2025\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "아프리칸스어" - -msgid "Arabic" -msgstr "아랍어" - -msgid "Algerian Arabic" -msgstr "알제리 아랍어" - -msgid "Asturian" -msgstr "호주어" - -msgid "Azerbaijani" -msgstr "아제르바이잔어" - -msgid "Bulgarian" -msgstr "불가리어" - -msgid "Belarusian" -msgstr "벨라루스어" - -msgid "Bengali" -msgstr "방글라데시어" - -msgid "Breton" -msgstr "브르타뉴어" - -msgid "Bosnian" -msgstr "보스니아어" - -msgid "Catalan" -msgstr "카탈로니아어" - -msgid "Central Kurdish (Sorani)" -msgstr "중부 쿠르드어 (소라니어)" - -msgid "Czech" -msgstr "체코어" - -msgid "Welsh" -msgstr "웨일즈어" - -msgid "Danish" -msgstr "덴마크어" - -msgid "German" -msgstr "독일어" - -msgid "Lower Sorbian" -msgstr "저지 소르브어" - -msgid "Greek" -msgstr "그리스어" - -msgid "English" -msgstr "영어" - -msgid "Australian English" -msgstr "영어(호주)" - -msgid "British English" -msgstr "영어 (영국)" - -msgid "Esperanto" -msgstr "에스페란토어" - -msgid "Spanish" -msgstr "스페인어" - -msgid "Argentinian Spanish" -msgstr "아르헨티나 스페인어" - -msgid "Colombian Spanish" -msgstr "콜롬비아 스페인어" - -msgid "Mexican Spanish" -msgstr "멕시컨 스페인어" - -msgid "Nicaraguan Spanish" -msgstr "니카과라 스페인어" - -msgid "Venezuelan Spanish" -msgstr "베네수엘라 스페인어" - -msgid "Estonian" -msgstr "에스토니아어" - -msgid "Basque" -msgstr "바스크어" - -msgid "Persian" -msgstr "페르시아어" - -msgid "Finnish" -msgstr "핀란드어" - -msgid "French" -msgstr "프랑스어" - -msgid "Frisian" -msgstr "프리슬란트어" - -msgid "Irish" -msgstr "아일랜드어" - -msgid "Scottish Gaelic" -msgstr "스코틀랜드 게일어" - -msgid "Galician" -msgstr "갈리시아어" - -msgid "Hebrew" -msgstr "히브리어" - -msgid "Hindi" -msgstr "힌두어" - -msgid "Croatian" -msgstr "크로아티아어" - -msgid "Upper Sorbian" -msgstr "고지 소르브어" - -msgid "Hungarian" -msgstr "헝가리어" - -msgid "Armenian" -msgstr "아르메니아어" - -msgid "Interlingua" -msgstr "인테르링구아어" - -msgid "Indonesian" -msgstr "인도네시아어" - -msgid "Igbo" -msgstr "이그보어" - -msgid "Ido" -msgstr "이도어" - -msgid "Icelandic" -msgstr "아이슬란드어" - -msgid "Italian" -msgstr "이탈리아어" - -msgid "Japanese" -msgstr "일본어" - -msgid "Georgian" -msgstr "조지아어" - -msgid "Kabyle" -msgstr "커바일어" - -msgid "Kazakh" -msgstr "카자흐어" - -msgid "Khmer" -msgstr "크메르어" - -msgid "Kannada" -msgstr "칸나다어" - -msgid "Korean" -msgstr "한국어" - -msgid "Kyrgyz" -msgstr "키르키즈 공화국어" - -msgid "Luxembourgish" -msgstr "룩셈부르크" - -msgid "Lithuanian" -msgstr "리투아니아어" - -msgid "Latvian" -msgstr "라트비아어" - -msgid "Macedonian" -msgstr "마케도니아어" - -msgid "Malayalam" -msgstr "말라얄람어" - -msgid "Mongolian" -msgstr "몽고어" - -msgid "Marathi" -msgstr "마라티어" - -msgid "Malay" -msgstr "말레이시아어" - -msgid "Burmese" -msgstr "미얀마어" - -msgid "Norwegian Bokmål" -msgstr "노르웨이어(보크몰)" - -msgid "Nepali" -msgstr "네팔어" - -msgid "Dutch" -msgstr "네덜란드어" - -msgid "Norwegian Nynorsk" -msgstr "노르웨이어 (뉘노르스크)" - -msgid "Ossetic" -msgstr "오세티아어" - -msgid "Punjabi" -msgstr "펀자브어" - -msgid "Polish" -msgstr "폴란드어" - -msgid "Portuguese" -msgstr "포르투갈어" - -msgid "Brazilian Portuguese" -msgstr "브라질 포르투갈어" - -msgid "Romanian" -msgstr "루마니아어" - -msgid "Russian" -msgstr "러시아어" - -msgid "Slovak" -msgstr "슬로바키아어" - -msgid "Slovenian" -msgstr "슬로베니아어" - -msgid "Albanian" -msgstr "알바니아어" - -msgid "Serbian" -msgstr "세르비아어" - -msgid "Serbian Latin" -msgstr "세르비아어" - -msgid "Swedish" -msgstr "스웨덴어" - -msgid "Swahili" -msgstr "스와힐리어" - -msgid "Tamil" -msgstr "타밀어" - -msgid "Telugu" -msgstr "텔루구어" - -msgid "Tajik" -msgstr "타지크어" - -msgid "Thai" -msgstr "태국어" - -msgid "Turkmen" -msgstr "튀르크멘어" - -msgid "Turkish" -msgstr "터키어" - -msgid "Tatar" -msgstr "타타르" - -msgid "Udmurt" -msgstr "이제프스크" - -msgid "Uyghur" -msgstr "위구르" - -msgid "Ukrainian" -msgstr "우크라이나어" - -msgid "Urdu" -msgstr "우르드어" - -msgid "Uzbek" -msgstr "우즈베크어" - -msgid "Vietnamese" -msgstr "베트남어" - -msgid "Simplified Chinese" -msgstr "중국어 간체" - -msgid "Traditional Chinese" -msgstr "중국어 번체" - -msgid "Messages" -msgstr "메시지" - -msgid "Site Maps" -msgstr "사이트 맵" - -msgid "Static Files" -msgstr "정적 파일" - -msgid "Syndication" -msgstr "신디케이션" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "페이지 번호가 정수가 아닙니다." - -msgid "That page number is less than 1" -msgstr "페이지 번호가 1보다 작습니다." - -msgid "That page contains no results" -msgstr "해당 페이지에 결과가 없습니다." - -msgid "Enter a valid value." -msgstr "올바른 값을 입력하세요." - -msgid "Enter a valid domain name." -msgstr "유효한 도메인 이름을 입력하세요." - -msgid "Enter a valid URL." -msgstr "올바른 URL을 입력하세요." - -msgid "Enter a valid integer." -msgstr "올바른 정수를 입력하세요." - -msgid "Enter a valid email address." -msgstr "올바른 이메일 주소를 입력하세요." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "문자, 숫자, '_', '-'만 가능합니다." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"유니코드 문자, 숫자, 언더스코어 또는 하이픈으로 구성된 올바른 내용을 입력하세" -"요." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "유효한 %(protocol)s의 주소를 입력하세요." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 혹은 IPv6" - -msgid "Enter only digits separated by commas." -msgstr "콤마로 구분된 숫자만 입력하세요." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"%(limit_value)s 안의 값을 입력해 주세요. (입력하신 값은 %(show_value)s입니" -"다.)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "%(limit_value)s 이하의 값을 입력해 주세요." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "%(limit_value)s 이상의 값을 입력해 주세요." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "단계 크기 %(limit_value)s의 배수를 입력해 주세요." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"예를 들어 %(offset)s, %(valid_value1)s, %(valid_value2)s 등, %(offset)s에서 " -"시작하는 %(limit_value)s의 배수를 입력해 주세요." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"이 값이 최소 %(limit_value)d 개의 글자인지 확인하세요(입력값 %(show_value)d " -"자)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"이 값이 최대 %(limit_value)d 개의 글자인지 확인하세요(입력값 %(show_value)d " -"자)." - -msgid "Enter a number." -msgstr "숫자를 입력하세요." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "전체 자릿수가 %(max)s 개를 넘지 않도록 해주세요." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "전체 유효자리 개수가 %(max)s 개를 넘지 않도록 해주세요." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "전체 유효자리 개수가 %(max)s 개를 넘지 않도록 해주세요." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"파일 확장자 '%(extension)s'는 허용되지 않습니다. 허용된 확장자: " -"'%(allowed_extensions)s'." - -msgid "Null characters are not allowed." -msgstr "null 문자는 사용할 수 없습니다. " - -msgid "and" -msgstr "또한" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s의 %(field_labels)s 은/는 이미 존재합니다." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "%(name)s을(를) 위반하였습니다." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r 은/는 올바른 선택사항이 아닙니다." - -msgid "This field cannot be null." -msgstr "이 필드는 null 값을 사용할 수 없습니다. " - -msgid "This field cannot be blank." -msgstr "이 필드는 빈 칸으로 둘 수 없습니다." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s의 %(field_label)s은/는 이미 존재합니다." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s은/는 반드시 %(date_field_label)s %(lookup_type)s에 대해 유일" -"해야 합니다." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s 형식 필드" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "'%(value)s' 값은 반드시 True 또는 False 중 하나여야만 합니다." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "'%(value)s'값은 반드시 True, False, None 중 하나여야만 합니다." - -msgid "Boolean (Either True or False)" -msgstr "boolean(True 또는 False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "문자열(%(max_length)s 글자까지)" - -msgid "String (unlimited)" -msgstr "문자열 (무제한의)" - -msgid "Comma-separated integers" -msgstr "정수(콤마로 구분)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "'%(value)s' 값은 날짜 형식이 아닙니다. YYYY-MM-DD 형식이어야 합니다." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"'%(value)s' 값은 올바른 형식(YYYY-MM-DD)이지만 유효하지 않은 날짜입니다." - -msgid "Date (without time)" -msgstr "날짜(시간 제외)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"'%(value)s' 값은 올바르지 않은 형식입니다. YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ] 형식이어야 합니다." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"'%(value)s' 값은 올바른 형식이지만 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) 유효" -"하지 않은 날짜/시간입니다." - -msgid "Date (with time)" -msgstr "날짜(시간 포함)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "'%(value)s' 값은 10진수를 입력하여야 합니다." - -msgid "Decimal number" -msgstr "10진수" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"'%(value)s' 값은 올바르지 않은 형식입니다. [DD] [HH:[MM:]]ss[.uuuuuu] 형식이" -"어야 합니다." - -msgid "Duration" -msgstr "지속시간" - -msgid "Email address" -msgstr "이메일 주소" - -msgid "File path" -msgstr "파일 경로" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "\"%(value)s\" 값은 실수를 입력하여야 합니다." - -msgid "Floating point number" -msgstr "부동소수점 숫자" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "\"%(value)s\" 값은 정수를 입력하여야 합니다." - -msgid "Integer" -msgstr "정수" - -msgid "Big (8 byte) integer" -msgstr "큰 정수 (8 byte)" - -msgid "Small integer" -msgstr "작은 정수" - -msgid "IPv4 address" -msgstr "IPv4 주소" - -msgid "IP address" -msgstr "IP 주소" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"%(value)s\" 값은 반드시 None, True 또는 False이어야 합니다." - -msgid "Boolean (Either True, False or None)" -msgstr "boolean (True, False 또는 None)" - -msgid "Positive big integer" -msgstr "큰 양의 정수" - -msgid "Positive integer" -msgstr "양의 정수" - -msgid "Positive small integer" -msgstr "작은 양의 정수" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "슬러그(%(max_length)s 까지)" - -msgid "Text" -msgstr "텍스트" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"\"%(value)s\" 값의 형식이 올바르지 않습니다. HH:MM[:ss[.uuuuuu]] 형식이어야 " -"합니다." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"\"%(value)s\" 값이 올바른 형식(HH:MM[:ss[.uuuuuu]])이나, 유효하지 않은 시간 " -"값입니다." - -msgid "Time" -msgstr "시각" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Raw binary data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\"은 유효하지 않은 UUID입니다." - -msgid "Universally unique identifier" -msgstr "범용 고유 식별 수단(UUID)" - -msgid "File" -msgstr "파일" - -msgid "Image" -msgstr "이미지" - -msgid "A JSON object" -msgstr "JSON 객체" - -msgid "Value must be valid JSON." -msgstr "올바른 JSON 형식이여야 합니다." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "외래 키 (연관 필드에 의해 형식 결정)" - -msgid "One-to-one relationship" -msgstr "일대일 관계" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s 관계" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s 관계들" - -msgid "Many-to-many relationship" -msgstr "다대다 관계" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "필수 항목입니다." - -msgid "Enter a whole number." -msgstr "정수를 입력하세요." - -msgid "Enter a valid date." -msgstr "올바른 날짜를 입력하세요." - -msgid "Enter a valid time." -msgstr "올바른 시각을 입력하세요." - -msgid "Enter a valid date/time." -msgstr "올바른 날짜/시각을 입력하세요." - -msgid "Enter a valid duration." -msgstr "올바른 기간을 입력하세요." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "날짜는 {min_days}와 {max_days} 사이여야 합니다." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "등록된 파일이 없습니다. 인코딩 형식을 확인하세요." - -msgid "No file was submitted." -msgstr "파일이 전송되지 않았습니다." - -msgid "The submitted file is empty." -msgstr "입력하신 파일은 빈 파일입니다." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "파일이름의 길이가 최대 %(max)d 자인지 확인하세요(%(length)d 자)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"파일 업로드 또는 삭제 체크박스를 선택하세요. 동시에 둘 다 할 수는 없습니다." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"올바른 이미지를 업로드하세요. 업로드하신 파일은 이미지 파일이 아니거나 파일" -"이 깨져 있습니다." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "올바르게 선택해 주세요. %(value)s 이/가 선택가능항목에 없습니다." - -msgid "Enter a list of values." -msgstr "리스트를 입력하세요." - -msgid "Enter a complete value." -msgstr "완전한 값을 입력하세요." - -msgid "Enter a valid UUID." -msgstr "올바른 UUID를 입력하세요." - -msgid "Enter a valid JSON." -msgstr "올바른 JSON을 입력하세요." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(%(name)s hidden 필드) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm 데이터가 없거나 변경되었습니다. 현재 없는 필드: " -"%(field_names)s. 이런 이슈가 지속된다면 버그 리포트를 제출해주시기 바랍니다." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "최대 %(num)d개의 양식을 제출하세요." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "최소 %(num)d개의 양식을 제출하세요." - -msgid "Order" -msgstr "순서:" - -msgid "Delete" -msgstr "삭제" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s의 중복된 데이터를 고쳐주세요." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "%(field)s의 중복된 데이터를 고쳐주세요. 유일한 값이어야 합니다." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s의 값은 %(date_field)s의 %(lookup)s에 대해 유일해야 합니다. 중" -"복된 데이터를 고쳐주세요." - -msgid "Please correct the duplicate values below." -msgstr "아래의 중복된 값들을 고쳐주세요." - -msgid "The inline value did not match the parent instance." -msgstr "Inline 값이 부모 인스턴스와 일치하지 않습니다." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "올바르게 선택해 주세요. 선택하신 것이 선택가능항목에 없습니다." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" 은/는 유효한 값이 아닙니다." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s 은/는 %(current_timezone)s 시간대에서 해석될 수 없습니다; 정보" -"가 모호하거나 존재하지 않을 수 있습니다." - -msgid "Clear" -msgstr "취소" - -msgid "Currently" -msgstr "현재" - -msgid "Change" -msgstr "변경" - -msgid "Unknown" -msgstr "알 수 없습니다." - -msgid "Yes" -msgstr "예" - -msgid "No" -msgstr "아니오" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "예,아니오,아마도" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d 바이트" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "오후" - -msgid "a.m." -msgstr "오전" - -msgid "PM" -msgstr "오후" - -msgid "AM" -msgstr "오전" - -msgid "midnight" -msgstr "자정" - -msgid "noon" -msgstr "정오" - -msgid "Monday" -msgstr "월요일" - -msgid "Tuesday" -msgstr "화요일" - -msgid "Wednesday" -msgstr "수요일" - -msgid "Thursday" -msgstr "목요일" - -msgid "Friday" -msgstr "금요일" - -msgid "Saturday" -msgstr "토요일" - -msgid "Sunday" -msgstr "일요일" - -msgid "Mon" -msgstr "월요일" - -msgid "Tue" -msgstr "화요일" - -msgid "Wed" -msgstr "수요일" - -msgid "Thu" -msgstr "목요일" - -msgid "Fri" -msgstr "금요일" - -msgid "Sat" -msgstr "토요일" - -msgid "Sun" -msgstr "일요일" - -msgid "January" -msgstr "1월" - -msgid "February" -msgstr "2월" - -msgid "March" -msgstr "3월" - -msgid "April" -msgstr "4월" - -msgid "May" -msgstr "5월" - -msgid "June" -msgstr "6월" - -msgid "July" -msgstr "7월" - -msgid "August" -msgstr "8월" - -msgid "September" -msgstr "9월" - -msgid "October" -msgstr "10월" - -msgid "November" -msgstr "11월" - -msgid "December" -msgstr "12월" - -msgid "jan" -msgstr "1월" - -msgid "feb" -msgstr "2월" - -msgid "mar" -msgstr "3월" - -msgid "apr" -msgstr "4월" - -msgid "may" -msgstr "5월" - -msgid "jun" -msgstr "6월" - -msgid "jul" -msgstr "7월" - -msgid "aug" -msgstr "8월" - -msgid "sep" -msgstr "9월" - -msgid "oct" -msgstr "10월" - -msgid "nov" -msgstr "11월" - -msgid "dec" -msgstr "12월" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "1월" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "2월" - -msgctxt "abbrev. month" -msgid "March" -msgstr "3월" - -msgctxt "abbrev. month" -msgid "April" -msgstr "4월" - -msgctxt "abbrev. month" -msgid "May" -msgstr "5월" - -msgctxt "abbrev. month" -msgid "June" -msgstr "6월" - -msgctxt "abbrev. month" -msgid "July" -msgstr "7월" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "8월" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "9월" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "10월" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "11월" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "12월" - -msgctxt "alt. month" -msgid "January" -msgstr "1월" - -msgctxt "alt. month" -msgid "February" -msgstr "2월" - -msgctxt "alt. month" -msgid "March" -msgstr "3월" - -msgctxt "alt. month" -msgid "April" -msgstr "4월" - -msgctxt "alt. month" -msgid "May" -msgstr "5월" - -msgctxt "alt. month" -msgid "June" -msgstr "6월" - -msgctxt "alt. month" -msgid "July" -msgstr "7월" - -msgctxt "alt. month" -msgid "August" -msgstr "8월" - -msgctxt "alt. month" -msgid "September" -msgstr "9월" - -msgctxt "alt. month" -msgid "October" -msgstr "10월" - -msgctxt "alt. month" -msgid "November" -msgstr "11월" - -msgctxt "alt. month" -msgid "December" -msgstr "12월" - -msgid "This is not a valid IPv6 address." -msgstr "올바른 IPv6 주소가 아닙니다." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "또는" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d년" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d개월" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d주" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d일" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d시간" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d분" - -msgid "Forbidden" -msgstr "Forbidden" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF 검증에 실패했습니다. 요청을 중단하였습니다." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"이 메세지가 보이는 이유는 이 HTTPS 사이트가 당신의 웹 브라우저로부터 \"참조 " -"헤더\"를 요구하지만, 아무것도 받기 못하였기 때문입니다. 이 헤더는 보안상의 이" -"유로 필요하며, 당신의 웹 브라우저가 제3자에 의해 해킹당하고 있지 않다는 것을 " -"보장하기 위함입니다." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"만약 브라우저 설정에서 '참조' 헤더를 비활성화 시켰을 경우, 적어도 이 사이트" -"나 HTTPS 연결, '동일-출처' 요청에 대해서는 이를 다시 활성화 시키십시오. " - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"태그나 'Referrer-Policy: no-" -"referrer' 헤더를 포함하고 있다면, 제거해주시기 바랍니다. CSRF 방지를 위한 리" -"퍼러 검사를 위해 'Referer' 헤더가 필요합니다. 개인 정보에 대해 우려가 있는 경" -"우, 서드 파티 사이트에 대한 링크에 와 같은 대안을 사" -"용할 수 있습니다." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"이 메세지가 보이는 이유는 사이트가 폼을 제출할 때 CSRF 쿠키를 필요로 하기 때" -"문입니다. 이 쿠키는 보안상의 이유로 필요하며, 제3자에 의해 당신의 브라우저가 " -"해킹당하고 있지 않다는 것을 보장합니다." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"만약 브라우저 설정에서 쿠키를 비활성화 시켰을 경우, 적어도 이 사이트나 '동일-" -"출처' 요청에 대해서는 활성화 시키십시오." - -msgid "More information is available with DEBUG=True." -msgstr "DEBUG=True 로 더 많은 정보를 확인할 수 있습니다." - -msgid "No year specified" -msgstr "년도가 없습니다." - -msgid "Date out of range" -msgstr "유효 범위 밖의 날짜" - -msgid "No month specified" -msgstr "월이 없습니다." - -msgid "No day specified" -msgstr "날짜가 없습니다." - -msgid "No week specified" -msgstr "주가 없습니다." - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr " %(verbose_name_plural)s를 사용할 수 없습니다." - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Future 모듈 %(verbose_name_plural)s을 사용할 수 없습니다. %(class_name)s." -"allow_future가 False 입니다." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "날짜 문자열 '%(datestr)s'이 표준 형식 '%(format)s'과 다릅니다." - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "쿼리 결과에 %(verbose_name)s가 없습니다." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "'마지막' 페이지가 아니거나, 정수형으로 변환할 수 없습니다." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Invalid page (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "빈 리스트이고 '%(class_name)s.allow_empty'가 False입니다." - -msgid "Directory indexes are not allowed here." -msgstr "디렉토리 인덱스는 이곳에 사용할 수 없습니다." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" 이/가 존재하지 않습니다." - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index of %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "성공적으로 설치되었습니다! 축하합니다!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django %(version)s릴리스 노트 보기" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"이 페이지는 어떤 URL도 지정되지 않았고, settings 파일에 DEBUG=True가 설정되어 있을 때 표시됩니" -"다." - -msgid "Django Documentation" -msgstr "Django 문서" - -msgid "Topics, references, & how-to’s" -msgstr "주제, 레퍼런스, & 입문참조하다" - -msgid "Tutorial: A Polling App" -msgstr "튜토리얼: 폴링 애플리케이션" - -msgid "Get started with Django" -msgstr "Django와 함께 시작하기" - -msgid "Django Community" -msgstr "Django 커뮤니티" - -msgid "Connect, get help, or contribute" -msgstr "연결하고, 도움을 받거나 기여하기" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ko/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ko/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ko/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ko/formats.py deleted file mode 100644 index 1a0dffa..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ko/formats.py +++ /dev/null @@ -1,54 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "Y년 n월 j일" -TIME_FORMAT = "A g:i" -DATETIME_FORMAT = "Y년 n월 j일 g:i A" -YEAR_MONTH_FORMAT = "Y년 n월" -MONTH_DAY_FORMAT = "n월 j일" -SHORT_DATE_FORMAT = "Y-n-j" -SHORT_DATETIME_FORMAT = "Y-n-j H:i" -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' - # "%b %d %Y", # 'Oct 25 2006' - # "%b %d, %Y", # 'Oct 25, 2006' - # "%d %b %Y", # '25 Oct 2006' - # "%d %b, %Y", #'25 Oct, 2006' - # "%B %d %Y", # 'October 25 2006' - # "%B %d, %Y", #'October 25, 2006' - # "%d %B %Y", # '25 October 2006' - # "%d %B, %Y", # '25 October, 2006' - "%Y년 %m월 %d일", # '2006년 10월 25일', with localized suffix. -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' - "%H시 %M분 %S초", # '14시 30분 59초' - "%H시 %M분", # '14시 30분' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' - "%Y년 %m월 %d일 %H시 %M분 %S초", # '2006년 10월 25일 14시 30분 59초' - "%Y년 %m월 %d일 %H시 %M분", # '2006년 10월 25일 14시 30분' -] - -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ky/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index f99fc90..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ky/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 391196f..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,1279 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2021 -# Soyuzbek Orozbek uulu , 2020-2021 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-27 14:11+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Африканча" - -msgid "Arabic" -msgstr "Арабча" - -msgid "Algerian Arabic" -msgstr "Алжир арабчасы" - -msgid "Asturian" -msgstr "Австрийче" - -msgid "Azerbaijani" -msgstr "Азерче" - -msgid "Bulgarian" -msgstr "Болгарча" - -msgid "Belarusian" -msgstr "Белорусча" - -msgid "Bengali" -msgstr "Бенгалча" - -msgid "Breton" -msgstr "Бретончо" - -msgid "Bosnian" -msgstr "Босния" - -msgid "Catalan" -msgstr "Каталан" - -msgid "Czech" -msgstr "Чехче" - -msgid "Welsh" -msgstr "Валлий" - -msgid "Danish" -msgstr "Данчийче" - -msgid "German" -msgstr "Немисче" - -msgid "Lower Sorbian" -msgstr "Сорб" - -msgid "Greek" -msgstr "Грекче" - -msgid "English" -msgstr "Англисче" - -msgid "Australian English" -msgstr "Авс. Англисчеси" - -msgid "British English" -msgstr "Бр. Англ." - -msgid "Esperanto" -msgstr "Есперанто" - -msgid "Spanish" -msgstr "Испанча" - -msgid "Argentinian Spanish" -msgstr "Арг. исп" - -msgid "Colombian Spanish" -msgstr "Колумб Испанчасы" - -msgid "Mexican Spanish" -msgstr "Мекс. исп" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуа испанчасы" - -msgid "Venezuelan Spanish" -msgstr "Венесуела Испанчасы" - -msgid "Estonian" -msgstr "Эстон" - -msgid "Basque" -msgstr "Баск" - -msgid "Persian" -msgstr "Персче" - -msgid "Finnish" -msgstr "Финче" - -msgid "French" -msgstr "Французча" - -msgid "Frisian" -msgstr "Фризче" - -msgid "Irish" -msgstr "Ирланча" - -msgid "Scottish Gaelic" -msgstr "Шотланча" - -msgid "Galician" -msgstr "Галицианча" - -msgid "Hebrew" -msgstr "Жөөтчө" - -msgid "Hindi" -msgstr "Хиндче" - -msgid "Croatian" -msgstr "Хорватча" - -msgid "Upper Sorbian" -msgstr "Жогорку Сорбчо" - -msgid "Hungarian" -msgstr "Венгрче" - -msgid "Armenian" -msgstr "Арменче" - -msgid "Interlingua" -msgstr "Эл аралык" - -msgid "Indonesian" -msgstr "Индонезче" - -msgid "Igbo" -msgstr "Игбо" - -msgid "Ido" -msgstr "идо" - -msgid "Icelandic" -msgstr "Исландча" - -msgid "Italian" -msgstr "Итальянча" - -msgid "Japanese" -msgstr "Жапончо" - -msgid "Georgian" -msgstr "Грузинче" - -msgid "Kabyle" -msgstr "Кабилче" - -msgid "Kazakh" -msgstr "Казакча" - -msgid "Khmer" -msgstr "Кхмер" - -msgid "Kannada" -msgstr "Канадча" - -msgid "Korean" -msgstr "Корейче" - -msgid "Kyrgyz" -msgstr "Кыргызча" - -msgid "Luxembourgish" -msgstr "Люкцембургча" - -msgid "Lithuanian" -msgstr "Литвача" - -msgid "Latvian" -msgstr "Латвияча" - -msgid "Macedonian" -msgstr "Македончо" - -msgid "Malayalam" -msgstr "Малаяламча" - -msgid "Mongolian" -msgstr "Монголчо" - -msgid "Marathi" -msgstr "Марати" - -msgid "Malay" -msgstr "Малай" - -msgid "Burmese" -msgstr "Бурмача" - -msgid "Norwegian Bokmål" -msgstr "Норвег Бокмолчо" - -msgid "Nepali" -msgstr "Непалча" - -msgid "Dutch" -msgstr "Голландча" - -msgid "Norwegian Nynorsk" -msgstr "Норвегиялык нюнор" - -msgid "Ossetic" -msgstr "Оссетче" - -msgid "Punjabi" -msgstr "Пенжабча" - -msgid "Polish" -msgstr "Полякча" - -msgid "Portuguese" -msgstr "Португалча" - -msgid "Brazilian Portuguese" -msgstr "Бразилиялык португалчасы" - -msgid "Romanian" -msgstr "Румынча" - -msgid "Russian" -msgstr "Орусча" - -msgid "Slovak" -msgstr "Словакча" - -msgid "Slovenian" -msgstr "Словенияча" - -msgid "Albanian" -msgstr "Албанча" - -msgid "Serbian" -msgstr "Сербче" - -msgid "Serbian Latin" -msgstr "Серб латынчасы" - -msgid "Swedish" -msgstr "Шведче" - -msgid "Swahili" -msgstr "Свахилче" - -msgid "Tamil" -msgstr "Тамиль" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Tajik" -msgstr "Тажикче" - -msgid "Thai" -msgstr "Тайча" - -msgid "Turkmen" -msgstr "Түркмөнчө" - -msgid "Turkish" -msgstr "Түркчө" - -msgid "Tatar" -msgstr "Татарча" - -msgid "Udmurt" -msgstr "Удмурча" - -msgid "Ukrainian" -msgstr "Украинче" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "Өзбекче" - -msgid "Vietnamese" -msgstr "Вьетнамча" - -msgid "Simplified Chinese" -msgstr "Жеңилдетилген кытайча" - -msgid "Traditional Chinese" -msgstr "салттык кытайча" - -msgid "Messages" -msgstr "Билдирүүлөр" - -msgid "Site Maps" -msgstr "сайт картасы" - -msgid "Static Files" -msgstr "Туруктуу файлдар" - -msgid "Syndication" -msgstr "Синдикат" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Бул барактын номуру сан эмес" - -msgid "That page number is less than 1" -msgstr "Бул барактын номуру 1 ден кичине" - -msgid "That page contains no results" -msgstr "Бул баракта жыйынтык жок" - -msgid "Enter a valid value." -msgstr "Туура маани киргиз" - -msgid "Enter a valid URL." -msgstr "Туура URL киргиз" - -msgid "Enter a valid integer." -msgstr "Туура натурал сан тер." - -msgid "Enter a valid email address." -msgstr "Туура эдарек тер." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"ариптер, цифралар, дефис же астыңкы сызык камтыган туура слаг киргизиңиз." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Юникод символдор, цифралар, астыңкы сызыктар же дефис камтыган туурга слаг " -"киргизиңиз." - -msgid "Enter a valid IPv4 address." -msgstr "Туура IPv4 тер." - -msgid "Enter a valid IPv6 address." -msgstr "Туура IPv6 тер." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Туура IPv4 же IPv6 тер." - -msgid "Enter only digits separated by commas." -msgstr "Жалаң үтүр менен бөлүнгөн сан тер." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Бул маани %(limit_value)s ашпоосун текшериңиз (азыр %(show_value)s)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "%(limit_value)s карата кичине же барабар маани болгонун текшериңиз" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "%(limit_value)s карата чоң же барабар маани болгонун текшериңиз" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Бул маани жок дегенде %(limit_value)dсимвол камтыганын текшериңиз (азыркысы " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Бул маани эң көп %(limit_value)dсимвол камтыганын текшериңиз (азыркысы " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Сан киргизиңиз." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Жалпысынан %(max)sорундан ашпоосун текшериңиз." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Жалпысынан ондук сандын%(max)s ашпоосун текшериңиз." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Жалпысынан үтүргө чейин%(max)s ашпоосун текшериңиз." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"%(extension)sфайл кеңейтүүсү кабыл алынбайт. Кабыл алынгандар: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Боштук кабыл алынбайт" - -msgid "and" -msgstr "жана" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s бул %(field_labels)s менен мурдатан эле бар" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r мааниси туура эмес тандоо." - -msgid "This field cannot be null." -msgstr "Бул аймак жок маани албашы керек" - -msgid "This field cannot be blank." -msgstr "Бул аймак бош калбашы керек" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s бул %(field_label)s менен мурдатан эле бар" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s %(date_field_label)s %(lookup_type)s үчүн уникал болуусу " -"керек." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "аймактын түрү: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” мааниси же True же False болуусу керек." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” мааниси же True же False же None болуусу керек." - -msgid "Boolean (Either True or False)" -msgstr "Булен (Туура же Ката)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Сап (%(max_length)s чейин)" - -msgid "Comma-separated integers" -msgstr "үтүр менен бөлүнгөн сан" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” мааниси туура эмес форматта. Ал ЖЖЖЖ-АА-КК форматта болуусу " -"керек." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "%(value)sмааниси туура (ЖЖЖЖ-АА-КК) форматта бирок ал күн туура эмес." - -msgid "Date (without time)" -msgstr "Күн (убакытсыз)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” мааниси туура эмес форматта. Ал ЖЖЖЖ-АА-КК СС:ММ[сс[.дддддд]]" -"[УЗ] форматта болуусу керек." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” мааниси туура форматта (ЖЖЖЖ-АА-КК СС:ММ[сс[.дддддд]][УЗ] ) " -"бирок ал күн/убакыт туура эмес." - -msgid "Date (with time)" -msgstr "Күн(убакыттуу)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” мааниси ондук сан болушу керек." - -msgid "Decimal number" -msgstr "ондук сан" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” мааниси туура эмес форматта. Ал [КК][[CC:]MM:]cc[.дддддд] " -"форматта болуусу керек." - -msgid "Duration" -msgstr "Мөөнөт" - -msgid "Email address" -msgstr "электрондук дарек" - -msgid "File path" -msgstr "файл жайгашуусу" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” мааниси калкыган чекиттүү болуусу керек." - -msgid "Floating point number" -msgstr "калкыган чекит саны" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” мааниси натуралдык сан болуусу керек." - -msgid "Integer" -msgstr "Натурал сан" - -msgid "Big (8 byte) integer" -msgstr "Чоң ( 8 байт) натурал сан" - -msgid "Small integer" -msgstr "кичине натурал сан" - -msgid "IPv4 address" -msgstr "IPv4 дареги" - -msgid "IP address" -msgstr "IP дареги" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” мааниси же None же True же False болуусу керек." - -msgid "Boolean (Either True, False or None)" -msgstr "Булен(Туура же Жалган же Куру)" - -msgid "Positive big integer" -msgstr "Оң чоң натуралдык сан." - -msgid "Positive integer" -msgstr "оң сан" - -msgid "Positive small integer" -msgstr "кичине оң сан" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "слаг ( %(max_length)s чейин)" - -msgid "Text" -msgstr "сап" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” мааниси туура эмес форматта. Ал СС:ММ[:сс[.ддддддд]] форматта " -"болуусу керек." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” мааниси туура форматта (СС:ММ[:cc[.дддддд]]) бирок ал убакыт " -"туура эмес." - -msgid "Time" -msgstr "Убакыт" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "жалаң экилик берилиш" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” туура эмес UUID." - -msgid "Universally unique identifier" -msgstr "универсал уникал көрсөтүүчү" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Сүрөт" - -msgid "A JSON object" -msgstr "JSON обектиси" - -msgid "Value must be valid JSON." -msgstr "Маани туура JSON болушу керек." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s нерсеси %(field)s аймагы %(value)r маани менен табылбады." - -msgid "Foreign Key (type determined by related field)" -msgstr "Бөтөн Ачкыч (байланышкан аймак менен аныкталат)" - -msgid "One-to-one relationship" -msgstr "Бирге-бир байланышы" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s байланышы" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s байланыштары" - -msgid "Many-to-many relationship" -msgstr "көпкө-көп байланышы" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Бул талаа керектүү." - -msgid "Enter a whole number." -msgstr "Толук сан киргиз." - -msgid "Enter a valid date." -msgstr "туура күн киргиз." - -msgid "Enter a valid time." -msgstr "Туура убакыт киргиз." - -msgid "Enter a valid date/time." -msgstr "Туура күн/убакыт киргиз." - -msgid "Enter a valid duration." -msgstr "Туура мөөнөт киргиз." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Күндөрдүн саны {min_days} жана {max_days} арасында болуусу керек." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Файл жиберилген жок. Формдун бекитүү түрүн текшер." - -msgid "No file was submitted." -msgstr "Файл жиберилген жок." - -msgid "The submitted file is empty." -msgstr "Жиберилген файл бош." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Бул файлдын аты эң көп %(max)dсимвол ала алат. (азыркысы %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Сураныч же файл жибериңиз же тандоону бош калтырыңыз. Экөөн тең эмес." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "Туура сүрөт жөнөтүңүз. Сиз жүктөгөн же сүрөт эмес же бузулган сүрөт." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Туура тандоону танда. %(value)s мүмкүн болгон тандоо эмес." - -msgid "Enter a list of values." -msgstr "Туура маанилер тизмесин киргиз." - -msgid "Enter a complete value." -msgstr "Толук маани киргиз." - -msgid "Enter a valid UUID." -msgstr "Туура UUID киргиз." - -msgid "Enter a valid JSON." -msgstr "Туура JSON киргиз." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(жашырылган аймак %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm берилиши жетишпей атат же жасалма болуп атат. Жетишпеген " -"талаалар: %(field_names)s. Эгер көйгөй чечилбей атса сиз баг билдирүү " -"жөнөтсөңүз болот." - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Сураныч, эң көп %d форм жөнөтүңүз." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Сураныч, эң аз %dформ жөнөтүңүз." - -msgid "Order" -msgstr "Тартип" - -msgid "Delete" -msgstr "Өчүрүү" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s үчүн кайталанган маанилерди оңдоңуз." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s үчүн кайталанган маанилерди оңдоңуз алар уникал болуусу керек." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s %(date_field)s да %(lookup)s үчүн уникал болусу керек. " -"Берилиштерди оңдоңуз." - -msgid "Please correct the duplicate values below." -msgstr "Төмөндө кайталанган маанилерди оңдоңуз." - -msgid "The inline value did not match the parent instance." -msgstr "Катардагы маани энелик нерсеге туура келбей жатат." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Туура тандоо кылыңыз. Ал тандоо мүмкүнчүлүктөн сырткары." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr " “%(pk)s”туура эмес маани." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)sкүнү %(current_timezone)sубактысы боюнча чечмелене албай атат. " -"Ал экианжы же жок болушу мүмкүн." - -msgid "Clear" -msgstr "Тазалоо" - -msgid "Currently" -msgstr "Азыркы" - -msgid "Change" -msgstr "өзгөртүү" - -msgid "Unknown" -msgstr "Белгисиз" - -msgid "Yes" -msgstr "Ооба" - -msgid "No" -msgstr "Жок" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ооба, жок, балким" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)dбит" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s мегабайт" - -#, python-format -msgid "%s GB" -msgstr "%s гигабайт" - -#, python-format -msgid "%s TB" -msgstr "%s терабайт" - -#, python-format -msgid "%s PB" -msgstr "%s пикабайт" - -msgid "p.m." -msgstr "түштөн кийин" - -msgid "a.m." -msgstr "түшкө чейин" - -msgid "PM" -msgstr "Түштөн кийин" - -msgid "AM" -msgstr "Түшкө чейин" - -msgid "midnight" -msgstr "Түнүчү" - -msgid "noon" -msgstr "ай" - -msgid "Monday" -msgstr "Дүйшөмбү" - -msgid "Tuesday" -msgstr "Шейшемби" - -msgid "Wednesday" -msgstr "Шаршемби" - -msgid "Thursday" -msgstr "Бейшемби" - -msgid "Friday" -msgstr "Жума" - -msgid "Saturday" -msgstr "Ишемби" - -msgid "Sunday" -msgstr "Жекшемби" - -msgid "Mon" -msgstr "Дүйш" - -msgid "Tue" -msgstr "Шей" - -msgid "Wed" -msgstr "Шар" - -msgid "Thu" -msgstr "Бей" - -msgid "Fri" -msgstr "Жума" - -msgid "Sat" -msgstr "Ише" - -msgid "Sun" -msgstr "Жек" - -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgid "jan" -msgstr "янв" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "июн" - -msgid "jul" -msgstr "июл" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сен" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноя" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Янв." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апрель" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Июнь" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Июль" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Сен." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноя." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "Январь" - -msgctxt "alt. month" -msgid "February" -msgstr "Февраль" - -msgctxt "alt. month" -msgid "March" -msgstr "Март" - -msgctxt "alt. month" -msgid "April" -msgstr "Апрель" - -msgctxt "alt. month" -msgid "May" -msgstr "Май" - -msgctxt "alt. month" -msgid "June" -msgstr "Июнь" - -msgctxt "alt. month" -msgid "July" -msgstr "Июль" - -msgctxt "alt. month" -msgid "August" -msgstr "Август" - -msgctxt "alt. month" -msgid "September" -msgstr "Сентябрь" - -msgctxt "alt. month" -msgid "October" -msgstr "Октябрь" - -msgctxt "alt. month" -msgid "November" -msgstr "Ноябрь" - -msgctxt "alt. month" -msgid "December" -msgstr "Декабрь" - -msgid "This is not a valid IPv6 address." -msgstr "Бул туура эмес IPv6 дареги" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "же" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d жыл" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ай" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d апта" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d күн" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d саат" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d мүнөт" - -msgid "Forbidden" -msgstr "Тыйылган" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF текшерүү кыйрады. Суроо четке кагылды." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Браузер тараптан \"Referer header\" HTTPS сайтына жиберилбей калгандыгы үчүн " -"бул билдирүүнү көрүп турасыз. Бул хэдэр сиздин браузер үчүнчү жактан " -"чабуулга учурабаганын текшерүүгө коопсуздук үчүн керек." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Эгер сиз броузерден “Referer” хэдерин өчүрүп салсаңыз, аны күйгүзүп коюңуз. " -"Жок дегенде ушул сайт үчүн же жок дегенде HTTPS байланышуу үчүн. Же болбосо " -"“same-origin” суроолору үчүн." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Эгер сиз тегин же “Referrer-" -"Policy: no-referrer” хэдерин колдонуп жатсаңыз, аларды өчүрүп салыңыз. CSRF " -"коргоосу “Referer” хэдерин талап кылат. Эгер сиз коопсуздук жөнүндө " -"кабатырланып атсаңыз үчүнчү жактар үчүн шилтемесин " -"колдонуңуз." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Сиз бул билдирүүнү бул сайт форм жиберүүдө CSRF кукини талап кылгандыгы үчүн " -"көрүп жатасыз. Бул куки коопсуздуктан улам сиздин сайтыңыз үчүнчү жактан " -"чабуулга кабылбаганын текшерүү үчүн талап кылынат. " - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Эгер сиз броузерде кукиледи өчүрүп койсоңуз, аларды кайра күйгүзүп коюңуз. " -"Жок дегенде ушул сайтка же “same-origin” суроолоруна." - -msgid "More information is available with DEBUG=True." -msgstr "Сиз бул маалыматты DEBUG=True болгону үчүн көрүп жатасыз." - -msgid "No year specified" -msgstr "Жыл көрсөтүлгөн эмес" - -msgid "Date out of range" -msgstr "Күн чектен сырткары" - -msgid "No month specified" -msgstr "Ай көрсөтүлгөн эмес" - -msgid "No day specified" -msgstr "Апта күнү көрсөтүлгөн эмес" - -msgid "No week specified" -msgstr "Апта көрсөтүлгө эмес" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s жок" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s future си тейленбейт. Себеби %(class_name)s." -"allow_future си False маани алган." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Туура эмес күн сабы “%(datestr)s” берилген формат болсо “%(format)s”." - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "суроого эч бир %(verbose_name)s табылбады" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Барак акыркы эмес. Же натуралдык санга өткөрүлө албай атат." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Туура эмес (%(page_number)s) барак: %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Бош тизме жана “%(class_name)s.allow_empty” = False болуп калган." - -msgid "Directory indexes are not allowed here." -msgstr "Папка индекстери бул жерде иштей албайт." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” жашабайт" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s индексттери" - -msgid "The install worked successfully! Congratulations!" -msgstr "Орнотуу ийгиликтүү аяктады! Куттуу болсун!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Жанго %(version)s үчүн чыгарылыш " -"эскертмелерин кара." - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Сиз бул бетти сиздин тууралоо файлыңызда DEBUG=True жана эчбир урл тууралабагандыгыңыз үчүн көрүп " -"жататсыз." - -msgid "Django Documentation" -msgstr "Жанго Түшүндүрмөсү" - -msgid "Topics, references, & how-to’s" -msgstr "Темалар, Сурамжылар, & кантип.. тер" - -msgid "Tutorial: A Polling App" -msgstr "Колдонмо:" - -msgid "Get started with Django" -msgstr "Жангону башта" - -msgid "Django Community" -msgstr "Жанго жамааты" - -msgid "Connect, get help, or contribute" -msgstr "Туташ, жардам ал, же салым кош" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ky/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ky/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ky/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ky/formats.py deleted file mode 100644 index 25a0928..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ky/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y ж." -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j E Y ж. G:i" -YEAR_MONTH_FORMAT = "F Y ж." -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Дүйшөмбү, Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y", # '25.10.06' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/lb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index 2cf2c8b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/lb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index b0d4755..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,1213 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# sim0n , 2011,2013 -# sim0n , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Luxembourgish (http://www.transifex.com/django/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabesch" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "Bulgaresch" - -msgid "Belarusian" -msgstr "Wäissrussesch" - -msgid "Bengali" -msgstr "Bengalesch" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "Bosnesch" - -msgid "Catalan" -msgstr "Katalanesch" - -msgid "Czech" -msgstr "Tschechesch" - -msgid "Welsh" -msgstr "Walisesch" - -msgid "Danish" -msgstr "Dänesch" - -msgid "German" -msgstr "Däitsch" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Griichesch" - -msgid "English" -msgstr "Englesch" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Britesch Englesch" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "Spuenesch" - -msgid "Argentinian Spanish" -msgstr "Argentinesch Spuenesch" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Mexikanesch Spuenesch" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "Estonesch" - -msgid "Basque" -msgstr "Baskesch" - -msgid "Persian" -msgstr "Persesch" - -msgid "Finnish" -msgstr "Finnesch" - -msgid "French" -msgstr "Franséisch" - -msgid "Frisian" -msgstr "Frisesch" - -msgid "Irish" -msgstr "Iresch" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Galesch" - -msgid "Hebrew" -msgstr "Hebräesch" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatesch" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Ungaresch" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Indonesesch" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Islännesch" - -msgid "Italian" -msgstr "Italienesch" - -msgid "Japanese" -msgstr "Japanesch" - -msgid "Georgian" -msgstr "Georgesch" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kanadesch" - -msgid "Korean" -msgstr "Koreanesch" - -msgid "Luxembourgish" -msgstr "Lëtzebuergesch" - -msgid "Lithuanian" -msgstr "Lithuanesesch" - -msgid "Latvian" -msgstr "Lättesch" - -msgid "Macedonian" -msgstr "Macedonesch" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolesch" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "Hollännesch" - -msgid "Norwegian Nynorsk" -msgstr "Norwegesch Nynorsk" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polnesch" - -msgid "Portuguese" -msgstr "Portugisesch" - -msgid "Brazilian Portuguese" -msgstr "Brasilianesch Portugisesch" - -msgid "Romanian" -msgstr "Rumänesch" - -msgid "Russian" -msgstr "Russesch" - -msgid "Slovak" -msgstr "Slowakesch" - -msgid "Slovenian" -msgstr "Slowenesch" - -msgid "Albanian" -msgstr "Albanesch" - -msgid "Serbian" -msgstr "Serbesch" - -msgid "Serbian Latin" -msgstr "Serbesch Latäinesch" - -msgid "Swedish" -msgstr "Schwedesch" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkish" -msgstr "Tierkesch" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "Ukrainesch" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamesesch" - -msgid "Simplified Chinese" -msgstr "Einfach d'Chinesesch" - -msgid "Traditional Chinese" -msgstr "Traditionell d'Chinesesch" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Gëff en validen Wärt an." - -msgid "Enter a valid URL." -msgstr "Gëff eng valid URL an." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Gëff eng valid e-mail Adress an." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Gëff eng valid IPv4 Adress an." - -msgid "Enter a valid IPv6 address." -msgstr "Gëff eng valid IPv6 Adress an." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Gëff eng valid IPv4 oder IPv6 Adress an." - -msgid "Enter only digits separated by commas." -msgstr "" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "an" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "" - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Datum (ouni Zäit)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Datum (mat Zäit)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Dezimalzuel" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "E-mail Adress" - -msgid "File path" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Kommazuel" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Zuel" - -msgid "Big (8 byte) integer" -msgstr "Grouss (8 byte) Zuel" - -msgid "IPv4 address" -msgstr "IPv4 Adress" - -msgid "IP address" -msgstr "IP Adress" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive integer" -msgstr "Positiv Zuel" - -msgid "Positive small integer" -msgstr "Kleng positiv Zuel" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "Kleng Zuel" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Zäit" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Rei Binär Daten" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Fichier" - -msgid "Image" -msgstr "Bild" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "" - -msgid "Enter a whole number." -msgstr "" - -msgid "Enter a valid date." -msgstr "" - -msgid "Enter a valid time." -msgstr "" - -msgid "Enter a valid date/time." -msgstr "" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -msgid "No file was submitted." -msgstr "Et ass keng Datei geschéckt ginn." - -msgid "The submitted file is empty." -msgstr "" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "Gëff eng Lescht vun Wäerter an." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Sortéier" - -msgid "Delete" -msgstr "Läsch" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Maach eidel" - -msgid "Currently" -msgstr "Momentan" - -msgid "Change" -msgstr "Änner" - -msgid "Unknown" -msgstr "Onbekannt" - -msgid "Yes" -msgstr "Jo" - -msgid "No" -msgstr "Nee" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "jo,nee,vläit" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "" - -msgid "noon" -msgstr "" - -msgid "Monday" -msgstr "Méindeg" - -msgid "Tuesday" -msgstr "Dënschdeg" - -msgid "Wednesday" -msgstr "Mëttwoch" - -msgid "Thursday" -msgstr "Donneschdes" - -msgid "Friday" -msgstr "Freides" - -msgid "Saturday" -msgstr "Samschdes" - -msgid "Sunday" -msgstr "Sonndes" - -msgid "Mon" -msgstr "Mei" - -msgid "Tue" -msgstr "Dën" - -msgid "Wed" -msgstr "Mett" - -msgid "Thu" -msgstr "Don" - -msgid "Fri" -msgstr "Fre" - -msgid "Sat" -msgstr "Sam" - -msgid "Sun" -msgstr "Son" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "März" - -msgid "April" -msgstr "Abrell" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Dezember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mär" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "März" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abrell" - -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "März" - -msgctxt "alt. month" -msgid "April" -msgstr "Abrell" - -msgctxt "alt. month" -msgid "May" -msgstr "" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Juli" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "oder" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d Joer" -msgstr[1] "%d Joren" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d Mount" -msgstr[1] "%d Meint" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d Woch" -msgstr[1] "%d Wochen" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d Dag" -msgstr[1] "%d Deeg" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d Stonn" -msgstr[1] "%d Stonnen" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d Minutt" -msgstr[1] "%d Minutten" - -msgid "0 minutes" -msgstr "0 Minutten" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/lt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index ee14fec..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index 0c055a2..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,1324 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kostas , 2011 -# lauris , 2011 -# Mariusz Felisiak , 2021 -# Matas Dailyda , 2015-2019 -# naktinis , 2012 -# Nikolajus Krauklis , 2013 -# Povilas Balzaravičius , 2011-2012 -# Simonas Kazlauskas , 2012-2014 -# Vytautas Astrauskas , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-24 16:28+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Afrikaans" -msgstr "Afrikiečių" - -msgid "Arabic" -msgstr "Arabų" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Austrų" - -msgid "Azerbaijani" -msgstr "Azerbaidžaniečių" - -msgid "Bulgarian" -msgstr "Bulgarų" - -msgid "Belarusian" -msgstr "Gudų" - -msgid "Bengali" -msgstr "Bengalų" - -msgid "Breton" -msgstr "Bretonų" - -msgid "Bosnian" -msgstr "Bosnių" - -msgid "Catalan" -msgstr "Katalonų" - -msgid "Czech" -msgstr "Čekų" - -msgid "Welsh" -msgstr "Velso" - -msgid "Danish" -msgstr "Danų" - -msgid "German" -msgstr "Vokiečių" - -msgid "Lower Sorbian" -msgstr "Žemutinė Sorbų" - -msgid "Greek" -msgstr "Graikų" - -msgid "English" -msgstr "Anglų" - -msgid "Australian English" -msgstr "Australų Anlgų" - -msgid "British English" -msgstr "Britų Anglų" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Ispanų" - -msgid "Argentinian Spanish" -msgstr "Argentiniečių Ispanų" - -msgid "Colombian Spanish" -msgstr "Kolumbų Ispanų" - -msgid "Mexican Spanish" -msgstr "Meksikiečių Ispanų" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragvos Ispanijos" - -msgid "Venezuelan Spanish" -msgstr "Venesuelos Ispanų" - -msgid "Estonian" -msgstr "Estų" - -msgid "Basque" -msgstr "Baskų" - -msgid "Persian" -msgstr "Persų" - -msgid "Finnish" -msgstr "Suomių" - -msgid "French" -msgstr "Prancūzų" - -msgid "Frisian" -msgstr "Fryzų" - -msgid "Irish" -msgstr "Airių" - -msgid "Scottish Gaelic" -msgstr "Škotų Gėlų" - -msgid "Galician" -msgstr "Galų" - -msgid "Hebrew" -msgstr "Hebrajų" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatų" - -msgid "Upper Sorbian" -msgstr "Aukštutinė Sorbų" - -msgid "Hungarian" -msgstr "Vengrų" - -msgid "Armenian" -msgstr "Armėnų" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indoneziečių" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandų" - -msgid "Italian" -msgstr "Italų" - -msgid "Japanese" -msgstr "Japonų" - -msgid "Georgian" -msgstr "Gruzinų" - -msgid "Kabyle" -msgstr "Kabilų" - -msgid "Kazakh" -msgstr "Kazachų" - -msgid "Khmer" -msgstr "Khmerų" - -msgid "Kannada" -msgstr "Dravidų" - -msgid "Korean" -msgstr "Korėjiečių" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Liuksemburgų" - -msgid "Lithuanian" -msgstr "Lietuvių" - -msgid "Latvian" -msgstr "Latvių" - -msgid "Macedonian" -msgstr "Makedonų" - -msgid "Malayalam" -msgstr "Malajalių" - -msgid "Mongolian" -msgstr "Mongolų" - -msgid "Marathi" -msgstr "Marati" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Mjanmų" - -msgid "Norwegian Bokmål" -msgstr "Norvegų Bokmal" - -msgid "Nepali" -msgstr "Nepalų" - -msgid "Dutch" -msgstr "Olandų" - -msgid "Norwegian Nynorsk" -msgstr "Norvegų Nynorsk" - -msgid "Ossetic" -msgstr "Osetinų" - -msgid "Punjabi" -msgstr "Pandžabi" - -msgid "Polish" -msgstr "Lenkų" - -msgid "Portuguese" -msgstr "Protugalų" - -msgid "Brazilian Portuguese" -msgstr "Brazilijos Portugalų" - -msgid "Romanian" -msgstr "Rumunų" - -msgid "Russian" -msgstr "Rusų" - -msgid "Slovak" -msgstr "Slovakų" - -msgid "Slovenian" -msgstr "Slovėnų" - -msgid "Albanian" -msgstr "Albanų" - -msgid "Serbian" -msgstr "Serbų" - -msgid "Serbian Latin" -msgstr "Serbų Lotynų" - -msgid "Swedish" -msgstr "Švedų" - -msgid "Swahili" -msgstr "Svahili" - -msgid "Tamil" -msgstr "Tamilų" - -msgid "Telugu" -msgstr "Telugų" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tailando" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turkų" - -msgid "Tatar" -msgstr "Totorių" - -msgid "Udmurt" -msgstr "Udmurtų" - -msgid "Ukrainian" -msgstr "Ukrainiečių" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamiečių" - -msgid "Simplified Chinese" -msgstr "Supaprastinta kinų" - -msgid "Traditional Chinese" -msgstr "Tradicinė kinų" - -msgid "Messages" -msgstr "Žinutės" - -msgid "Site Maps" -msgstr "Tinklalapio struktūros" - -msgid "Static Files" -msgstr "Statiniai failai" - -msgid "Syndication" -msgstr "Sindikacija" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "To puslapio numeris nėra sveikasis skaičius." - -msgid "That page number is less than 1" -msgstr "To numerio puslapis yra mažesnis už 1" - -msgid "That page contains no results" -msgstr "Tas puslapis neturi jokių rezultatų" - -msgid "Enter a valid value." -msgstr "Įveskite tinkamą reikšmę." - -msgid "Enter a valid URL." -msgstr "Įveskite tinkamą URL adresą." - -msgid "Enter a valid integer." -msgstr "Įveskite tinkamą sveikąjį skaičių." - -msgid "Enter a valid email address." -msgstr "Įveskite teisingą el. pašto adresą." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Įveskite validų IPv4 adresą." - -msgid "Enter a valid IPv6 address." -msgstr "Įveskite validų IPv6 adresą." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Įveskite validų IPv4 arba IPv6 adresą." - -msgid "Enter only digits separated by commas." -msgstr "Įveskite skaitmenis atskirtus kableliais." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Įsitikinkite, kad reikšmę sudaro %(limit_value)s simbolių (dabar yra " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Įsitikinkite, kad reikšmė yra mažesnė arba lygi %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Įsitikinkite, kad reikšmė yra didesnė arba lygi %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklo " -"(dabartinis ilgis %(show_value)d)." -msgstr[1] "" -"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." -msgstr[2] "" -"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." -msgstr[3] "" -"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklo " -"(dabartinis ilgis %(show_value)d)." -msgstr[1] "" -"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." -msgstr[2] "" -"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." -msgstr[3] "" -"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." - -msgid "Enter a number." -msgstr "Įveskite skaičių." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmuo." -msgstr[1] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenys." -msgstr[2] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų." -msgstr[3] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmuo po kablelio." -msgstr[1] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenys po kablelio." -msgstr[2] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų po kablelio." -msgstr[3] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų po kablelio." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmuo prieš kablelį." -msgstr[1] "" -"Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenys prieš kablelį." -msgstr[2] "" -"Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų prieš kablelį." -msgstr[3] "" -"Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų prieš kablelį." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Nuliniai simboliai neleidžiami." - -msgid "and" -msgstr "ir" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s su šiais %(field_labels)s jau egzistuoja." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Reikšmės %(value)r rinktis negalima." - -msgid "This field cannot be null." -msgstr "Šis laukas negali būti null." - -msgid "This field cannot be blank." -msgstr "Lauką privaloma užpildyti." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s su šiuo %(field_label)s jau egzistuoja." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s privalo būti unikalus %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Lauko tipas: %(field_type)s " - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Loginė reikšmė (Tiesa arba Netiesa)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Eilutė (ilgis iki %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Kableliais atskirti sveikieji skaičiai" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Data (be laiko)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Data (su laiku)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Dešimtainis skaičius" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Trukmė" - -msgid "Email address" -msgstr "El. pašto adresas" - -msgid "File path" -msgstr "Kelias iki failo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Realus skaičius" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Sveikas skaičius" - -msgid "Big (8 byte) integer" -msgstr "Didelis (8 baitų) sveikas skaičius" - -msgid "Small integer" -msgstr "Nedidelis sveikasis skaičius" - -msgid "IPv4 address" -msgstr "IPv4 adresas" - -msgid "IP address" -msgstr "IP adresas" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Loginė reikšmė (Tiesa, Netiesa arba Nieko)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Teigiamas sveikasis skaičius" - -msgid "Positive small integer" -msgstr "Nedidelis teigiamas sveikasis skaičius" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Unikalus adresas (iki %(max_length)s ženklų)" - -msgid "Text" -msgstr "Tekstas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Laikas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Neapdorota informacija" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "Universaliai unikalus identifikatorius" - -msgid "File" -msgstr "Failas" - -msgid "Image" -msgstr "Paveiksliukas" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s objektas su %(field)s %(value)r neegzistuoja." - -msgid "Foreign Key (type determined by related field)" -msgstr "Išorinis raktas (tipas nustatomas susijusiame lauke)" - -msgid "One-to-one relationship" -msgstr "Sąryšis vienas su vienu" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s sąryšis" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s sąryšiai" - -msgid "Many-to-many relationship" -msgstr "Sąryšis daug su daug" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Šis laukas yra privalomas." - -msgid "Enter a whole number." -msgstr "Įveskite pilną skaičių." - -msgid "Enter a valid date." -msgstr "Įveskite tinkamą datą." - -msgid "Enter a valid time." -msgstr "Įveskite tinkamą laiką." - -msgid "Enter a valid date/time." -msgstr "Įveskite tinkamą datą/laiką." - -msgid "Enter a valid duration." -msgstr "Įveskite tinkamą trukmę." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Dienų skaičius turi būti tarp {min_days} ir {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nebuvo nurodytas failas. Patikrinkite formos koduotę." - -msgid "No file was submitted." -msgstr "Failas nebuvo nurodytas." - -msgid "The submitted file is empty." -msgstr "Nurodytas failas yra tuščias." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " -"ženklo (dabartinis ilgis %(length)d)." -msgstr[1] "" -"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " -"ženklų (dabartinis ilgis %(length)d)." -msgstr[2] "" -"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " -"ženklų (dabartinis ilgis %(length)d)." -msgstr[3] "" -"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " -"ženklų (dabartinis ilgis %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Nurodykite failą arba pažymėkite išvalyti. Abu pasirinkimai negalimi." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Atsiųskite tinkamą paveiksliuką. Failas, kurį siuntėte nebuvo paveiksliukas, " -"arba buvo sugadintas." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Nurodykite tinkamą reikšmę. %(value)s nėra galimas pasirinkimas." - -msgid "Enter a list of values." -msgstr "Įveskite reikšmių sarašą." - -msgid "Enter a complete value." -msgstr "Įveskite pilną reikšmę." - -msgid "Enter a valid UUID." -msgstr "Įveskite tinkamą UUID." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Paslėptas laukelis %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "Order" -msgstr "Nurodyti" - -msgid "Delete" -msgstr "Ištrinti" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Pataisykite pasikartojančius duomenis laukui %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Pataisykite pasikartojančius duomenis laukui %(field)s. Duomenys privalo " -"būti unikalūs." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Pataisykite pasikartojančius duomenis laukui %(field_name)s. Duomenys " -"privalo būti unikalūs %(lookup)s peržiūroms per %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Pataisykite žemiau esančias pasikartojančias reikšmes." - -msgid "The inline value did not match the parent instance." -msgstr "Reikšmė nesutapo su pirminiu objektu." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Pasirinkite tinkamą reikšmę. Parinkta reikšmė nėra galima." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Išvalyti" - -msgid "Currently" -msgstr "Šiuo metu" - -msgid "Change" -msgstr "Pakeisti" - -msgid "Unknown" -msgstr "Nežinomas" - -msgid "Yes" -msgstr "Taip" - -msgid "No" -msgstr "Ne" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "taip,ne,galbūt" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d baitas" -msgstr[1] "%(size)d baitai" -msgstr[2] "%(size)d baitai" -msgstr[3] "%(size)d baitai" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "vidurnaktis" - -msgid "noon" -msgstr "vidurdienis" - -msgid "Monday" -msgstr "Pirmadienis" - -msgid "Tuesday" -msgstr "Antradienis" - -msgid "Wednesday" -msgstr "Trečiadienis" - -msgid "Thursday" -msgstr "Ketvirtadienis" - -msgid "Friday" -msgstr "Penktadienis" - -msgid "Saturday" -msgstr "Šeštadienis" - -msgid "Sunday" -msgstr "Sekmadienis" - -msgid "Mon" -msgstr "Pr" - -msgid "Tue" -msgstr "A" - -msgid "Wed" -msgstr "T" - -msgid "Thu" -msgstr "K" - -msgid "Fri" -msgstr "P" - -msgid "Sat" -msgstr "Š" - -msgid "Sun" -msgstr "S" - -msgid "January" -msgstr "sausis" - -msgid "February" -msgstr "vasaris" - -msgid "March" -msgstr "kovas" - -msgid "April" -msgstr "balandis" - -msgid "May" -msgstr "gegužė" - -msgid "June" -msgstr "birželis" - -msgid "July" -msgstr "liepa" - -msgid "August" -msgstr "rugpjūtis" - -msgid "September" -msgstr "rugsėjis" - -msgid "October" -msgstr "spalis" - -msgid "November" -msgstr "lapkritis" - -msgid "December" -msgstr "gruodis" - -msgid "jan" -msgstr "sau" - -msgid "feb" -msgstr "vas" - -msgid "mar" -msgstr "kov" - -msgid "apr" -msgstr "bal" - -msgid "may" -msgstr "geg" - -msgid "jun" -msgstr "bir" - -msgid "jul" -msgstr "lie" - -msgid "aug" -msgstr "rugp" - -msgid "sep" -msgstr "rugs" - -msgid "oct" -msgstr "spa" - -msgid "nov" -msgstr "lap" - -msgid "dec" -msgstr "grd" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "saus." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "vas." - -msgctxt "abbrev. month" -msgid "March" -msgstr "kov." - -msgctxt "abbrev. month" -msgid "April" -msgstr "bal." - -msgctxt "abbrev. month" -msgid "May" -msgstr "geg." - -msgctxt "abbrev. month" -msgid "June" -msgstr "birž." - -msgctxt "abbrev. month" -msgid "July" -msgstr "liep." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "rugpj." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "rugs." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "spal." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "lapkr." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "gruod." - -msgctxt "alt. month" -msgid "January" -msgstr "sausio" - -msgctxt "alt. month" -msgid "February" -msgstr "vasario" - -msgctxt "alt. month" -msgid "March" -msgstr "kovo" - -msgctxt "alt. month" -msgid "April" -msgstr "balandžio" - -msgctxt "alt. month" -msgid "May" -msgstr "gegužės" - -msgctxt "alt. month" -msgid "June" -msgstr "birželio" - -msgctxt "alt. month" -msgid "July" -msgstr "liepos" - -msgctxt "alt. month" -msgid "August" -msgstr "rugpjūčio" - -msgctxt "alt. month" -msgid "September" -msgstr "rugsėjo" - -msgctxt "alt. month" -msgid "October" -msgstr "spalio" - -msgctxt "alt. month" -msgid "November" -msgstr "lapkričio" - -msgctxt "alt. month" -msgid "December" -msgstr "gruodžio" - -msgid "This is not a valid IPv6 address." -msgstr "Tai nėra teisingas IPv6 adresas." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "arba" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "Forbidden" -msgstr "Uždrausta" - -msgid "CSRF verification failed. Request aborted." -msgstr "Nepavyko CSRF patvirtinimas. Užklausa nutraukta." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Jūs matote šią žinutę nes šis puslapis reikalauja CSRF slapuko, kai " -"pateikiama forma. Slapukas reikalaujamas saugumo sumetimais, kad užtikrinti " -"jog jūsų naršyklė nėra užgrobiama trečiųjų asmenų." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Gauti daugiau informacijos galima su DEBUG=True nustatymu." - -msgid "No year specified" -msgstr "Nenurodyti metai" - -msgid "Date out of range" -msgstr "Data išeina iš ribų" - -msgid "No month specified" -msgstr "Nenurodytas mėnuo" - -msgid "No day specified" -msgstr "Nenurodyta diena" - -msgid "No week specified" -msgstr "Nenurodyta savaitė" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nėra %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Ateities %(verbose_name_plural)s nėra prieinami, nes %(class_name)s." -"allow_future yra False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Atitinkantis užklausą %(verbose_name)s nerastas" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Neegzistuojantis puslapis (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Aplankų indeksai čia neleidžiami." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s indeksas" - -msgid "The install worked successfully! Congratulations!" -msgstr "Diegimas pavyko! Sveikiname!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Žiūrėti Django %(version)s išleidimo " -"pastabas" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Jūs matote šią žinutę dėl to kad Django nustatymų faile įvesta DEBUG = True ir Jūs nenustatėte jokių URL'ų." - -msgid "Django Documentation" -msgstr "Django dokumentacija" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "Pamoka: Apklausos aplikacija" - -msgid "Get started with Django" -msgstr "Pradėti su Django" - -msgid "Django Community" -msgstr "Django Bendrija" - -msgid "Connect, get help, or contribute" -msgstr "Prisijunk, gauk pagalbą arba prisidėk" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/lt/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/lt/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/lt/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/lt/formats.py deleted file mode 100644 index a351b3c..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/lt/formats.py +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"Y \m. E j \d." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"Y \m. E j \d., H:i" -YEAR_MONTH_FORMAT = r"Y \m. F" -MONTH_DAY_FORMAT = r"E j \d." -SHORT_DATE_FORMAT = "Y-m-d" -SHORT_DATETIME_FORMAT = "Y-m-d H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' - "%H.%M.%S", # '14.30.59' - "%H.%M.%S.%f", # '14.30.59.000200' - "%H.%M", # '14.30' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y %H.%M.%S", # '25.10.06 14.30.59' - "%d.%m.%y %H.%M.%S.%f", # '25.10.06 14.30.59.000200' - "%d.%m.%y %H.%M", # '25.10.06 14.30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/lv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index 10ec9b2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/lv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index 161dc4d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,1367 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# edgars , 2011 -# Edgars Voroboks , 2023-2025 -# Edgars Voroboks , 2017,2022 -# Edgars Voroboks , 2017-2018 -# Jannis Leidel , 2011 -# krikulis , 2014 -# Māris Nartišs , 2016 -# Mariusz Felisiak , 2021 -# Mārtiņš Šulcs , 2018 -# Edgars Voroboks , 2018-2021 -# peterisb , 2016-2017 -# Pēteris Caune, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Edgars Voroboks , 2023-2025\n" -"Language-Team: Latvian (http://app.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -msgid "Afrikaans" -msgstr "afrikāņu" - -msgid "Arabic" -msgstr "arābu" - -msgid "Algerian Arabic" -msgstr "Alžīrijas arābu" - -msgid "Asturian" -msgstr "asturiešu" - -msgid "Azerbaijani" -msgstr "azerbaidžāņu" - -msgid "Bulgarian" -msgstr "bulgāru" - -msgid "Belarusian" -msgstr "baltkrievu" - -msgid "Bengali" -msgstr "bengāļu" - -msgid "Breton" -msgstr "bretoņu" - -msgid "Bosnian" -msgstr "bosniešu" - -msgid "Catalan" -msgstr "katalāņu" - -msgid "Central Kurdish (Sorani)" -msgstr "centrālā kurdu (sorani)" - -msgid "Czech" -msgstr "čehu" - -msgid "Welsh" -msgstr "velsiešu" - -msgid "Danish" -msgstr "dāņu" - -msgid "German" -msgstr "vācu" - -msgid "Lower Sorbian" -msgstr "apakšsorbu" - -msgid "Greek" -msgstr "grieķu" - -msgid "English" -msgstr "angļu" - -msgid "Australian English" -msgstr "Austrālijas angļu" - -msgid "British English" -msgstr "Lielbritānijas angļu" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "spāņu" - -msgid "Argentinian Spanish" -msgstr "Argentīnas spāņu" - -msgid "Colombian Spanish" -msgstr "Kolumbijas spāņu" - -msgid "Mexican Spanish" -msgstr "Meksikas spāņu" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragvas spāņu" - -msgid "Venezuelan Spanish" -msgstr "Venecuēlas spāņu" - -msgid "Estonian" -msgstr "igauņu" - -msgid "Basque" -msgstr "basku" - -msgid "Persian" -msgstr "persiešu" - -msgid "Finnish" -msgstr "somu" - -msgid "French" -msgstr "franču" - -msgid "Frisian" -msgstr "frīzu" - -msgid "Irish" -msgstr "īru" - -msgid "Scottish Gaelic" -msgstr "skotu gēlu" - -msgid "Galician" -msgstr "galīciešu" - -msgid "Hebrew" -msgstr "ebreju" - -msgid "Hindi" -msgstr "hindu" - -msgid "Croatian" -msgstr "horvātu" - -msgid "Upper Sorbian" -msgstr "augšsorbu" - -msgid "Hungarian" -msgstr "ungāru" - -msgid "Armenian" -msgstr "armēņu" - -msgid "Interlingua" -msgstr "modernā latīņu" - -msgid "Indonesian" -msgstr "indonēziešu" - -msgid "Igbo" -msgstr "igbo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandiešu" - -msgid "Italian" -msgstr "itāļu" - -msgid "Japanese" -msgstr "japāņu" - -msgid "Georgian" -msgstr "gruzīnu" - -msgid "Kabyle" -msgstr "kabiliešu" - -msgid "Kazakh" -msgstr "kazahu" - -msgid "Khmer" -msgstr "khmeru" - -msgid "Kannada" -msgstr "kannādiešu" - -msgid "Korean" -msgstr "korejiešu" - -msgid "Kyrgyz" -msgstr "kirgīzu" - -msgid "Luxembourgish" -msgstr "luksemburgiešu" - -msgid "Lithuanian" -msgstr "lietuviešu" - -msgid "Latvian" -msgstr "latviešu" - -msgid "Macedonian" -msgstr "maķedoniešu" - -msgid "Malayalam" -msgstr "malajalu" - -msgid "Mongolian" -msgstr "mongoļu" - -msgid "Marathi" -msgstr "maratiešu" - -msgid "Malay" -msgstr "malajiešu" - -msgid "Burmese" -msgstr "birmiešu" - -msgid "Norwegian Bokmål" -msgstr "norvēģu bokmål" - -msgid "Nepali" -msgstr "nepāliešu" - -msgid "Dutch" -msgstr "holandiešu" - -msgid "Norwegian Nynorsk" -msgstr "norvēģu nynorsk" - -msgid "Ossetic" -msgstr "osetiešu" - -msgid "Punjabi" -msgstr "pandžabu" - -msgid "Polish" -msgstr "poļu" - -msgid "Portuguese" -msgstr "portugāļu" - -msgid "Brazilian Portuguese" -msgstr "Brazīlijas portugāļu" - -msgid "Romanian" -msgstr "rumāņu" - -msgid "Russian" -msgstr "krievu" - -msgid "Slovak" -msgstr "slovāku" - -msgid "Slovenian" -msgstr "slovēņu" - -msgid "Albanian" -msgstr "albāņu" - -msgid "Serbian" -msgstr "serbu" - -msgid "Serbian Latin" -msgstr "serbu latīņu" - -msgid "Swedish" -msgstr "zviedru" - -msgid "Swahili" -msgstr "svahili" - -msgid "Tamil" -msgstr "tamilu" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadžiku" - -msgid "Thai" -msgstr "taizemiešu" - -msgid "Turkmen" -msgstr "turkmēņu" - -msgid "Turkish" -msgstr "turku" - -msgid "Tatar" -msgstr "tatāru" - -msgid "Udmurt" -msgstr "udmurtu" - -msgid "Uyghur" -msgstr "uiguru" - -msgid "Ukrainian" -msgstr "ukraiņu" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "Uzbeku" - -msgid "Vietnamese" -msgstr "vjetnamiešu" - -msgid "Simplified Chinese" -msgstr "vienkāršā ķīniešu" - -msgid "Traditional Chinese" -msgstr "tradicionālā ķīniešu" - -msgid "Messages" -msgstr "Ziņojumi" - -msgid "Site Maps" -msgstr "Lapas kartes" - -msgid "Static Files" -msgstr "Statiski faili" - -msgid "Syndication" -msgstr "Sindikācija" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Lapas numurs nav cipars" - -msgid "That page number is less than 1" -msgstr "Lapas numurs ir mazāks par 1" - -msgid "That page contains no results" -msgstr "Lapa nesatur rezultātu" - -msgid "Enter a valid value." -msgstr "Ievadiet korektu vērtību." - -msgid "Enter a valid domain name." -msgstr "Ievadiet derīgu domēna vārdu." - -msgid "Enter a valid URL." -msgstr "Ievadiet korektu URL adresi." - -msgid "Enter a valid integer." -msgstr "Ievadiet veselu skaitli." - -msgid "Enter a valid email address." -msgstr "Ievadiet korektu e-pasta adresi" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Ievadiet korektu \"identifikatora\" vērtību, kas satur tikai burtus, " -"ciparus, apakšsvītras vai defises." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Ievadiet korektu \"identifikatora\" vērtību, kas satur tikai Unikoda burtus, " -"ciparus, apakšsvītras vai defises." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Ievadiet derīgu %(protocol)s adresi." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 vai IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Ievadiet tikai numurus, atdalītus ar komatiem." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Nodrošiniet, ka vērtība ir %(limit_value)s (tā satur %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Šai vērtībai jabūt mazākai vai vienādai ar %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Vērtībai jābūt lielākai vai vienādai ar %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Vērtībai jābūt reizinājumam no %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Pārliecinieties, ka šī vērtība ir soļa lieluma %(limit_value)s reizinājums, " -"sākot no %(offset)s, piem. %(offset)s, %(valid_value1)s, %(valid_value2)s, " -"un tā tālāk." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Vērtībai jābūt vismaz %(limit_value)d zīmēm (tai ir %(show_value)d)." -msgstr[1] "" -"Vērtībai jābūt vismaz %(limit_value)d zīmei (tai ir %(show_value)d)." -msgstr[2] "" -"Vērtībai jābūt vismaz %(limit_value)d zīmēm (tai ir %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Vērtībai jābūt ne vairāk kā %(limit_value)d zīmēm (tai ir %(show_value)d)." -msgstr[1] "" -"Vērtībai jābūt ne vairāk kā %(limit_value)d zīmei (tai ir %(show_value)d)." -msgstr[2] "" -"Vērtībai jābūt ne vairāk kā %(limit_value)d zīmēm (tai ir %(show_value)d)." - -msgid "Enter a number." -msgstr "Ievadiet skaitli." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Pārliecinieties, ka kopā nav vairāk par %(max)s ciparu." -msgstr[1] "Pārliecinieties, ka kopā nav vairāk par %(max)s cipariem." -msgstr[2] "Pārliecinieties, ka kopā nav vairāk par %(max)s cipariem." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Pārliecinieties, ka aiz decimālās zīmes nav vairāk par %(max)s ciparu." -msgstr[1] "" -"Pārliecinieties, ka aiz decimālās zīmes nav vairāk par %(max)s cipariem." -msgstr[2] "" -"Pārliecinieties, ka aiz decimālās zīmes nav vairāk par %(max)s cipariem." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Pārliecinieties, ka pirms decimālās zīmes nav vairāk par %(max)s ciparu." -msgstr[1] "" -"Pārliecinieties, ka pirms decimālās zīmes nav vairāk par %(max)s cipariem." -msgstr[2] "" -"Pārliecinieties, ka pirms decimālās zīmes nav vairāk par %(max)s cipariem." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Faila paplašinājums “%(extension)s” nav atļauts. Atļautie paplašinājumi ir: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Nulles rakstzīmes nav atļautas." - -msgid "and" -msgstr "un" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s ar šādu lauka %(field_labels)s vērtību jau eksistē." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Ierobežojums “%(name)s” ir pārkāpts." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Vērtība %(value)r nav derīga izvēle." - -msgid "This field cannot be null." -msgstr "Šis lauks nevar būt tukšs, null." - -msgid "This field cannot be blank." -msgstr "Šis lauks nevar būt tukšs" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s ar šādu lauka %(field_label)s vērtību jau eksistē." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s jābūt unikālam %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Lauks ar tipu: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” vērtībai ir jābūt vai nu True, vai False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” vērtībai ir jābūt True, False vai None." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (vai nu True, vai False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Simbolu virkne (līdz pat %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Simbolu virkne (neierobežota)" - -msgid "Comma-separated integers" -msgstr "Ar komatu atdalīti veselie skaitļi" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” vērtība ir nepareizā formātā. Tai ir jābūt YYYY-MM-DD formātā." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” vērtība ir pareizā formātā (YYYY-MM-DD), bet tas nav derīgs " -"datums." - -msgid "Date (without time)" -msgstr "Datums (bez laika)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” vērtība ir nepareizā formātā. Tai ir jābūt YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] formātā." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” vērtība ir pareizā formātā (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]), " -"bet tas nav derīgs datums/laiks." - -msgid "Date (with time)" -msgstr "Datums (ar laiku)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” vērtībai ir jābūt decimālam skaitlim." - -msgid "Decimal number" -msgstr "Decimāls skaitlis" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” vērtība ir nepareizā formātā. Tai ir jābūt [DD] [[HH:]MM:]ss[." -"uuuuuu] formātā." - -msgid "Duration" -msgstr "Ilgums" - -msgid "Email address" -msgstr "E-pasta adrese" - -msgid "File path" -msgstr "Faila ceļš" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” vērtībai ir jābūt daļskaitlim." - -msgid "Floating point number" -msgstr "Peldošā komata skaitlis" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” vērtībai ir jābūt veselam skaitlim." - -msgid "Integer" -msgstr "Vesels skaitlis" - -msgid "Big (8 byte) integer" -msgstr "Liels (8 baitu) vesels skaitlis" - -msgid "Small integer" -msgstr "Mazs vesels skaitlis" - -msgid "IPv4 address" -msgstr "IPv4 adrese" - -msgid "IP address" -msgstr "IP adrese" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” vērtībai ir jābūt None, True vai False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (vai nu True, False, vai None)" - -msgid "Positive big integer" -msgstr "Liels pozitīvs vesels skaitlis" - -msgid "Positive integer" -msgstr "Naturāls skaitlis" - -msgid "Positive small integer" -msgstr "Mazs pozitīvs vesels skaitlis" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Identifikators (līdz %(max_length)s)" - -msgid "Text" -msgstr "Teksts" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” vērtība ir nepareizā formātā. Tai ir jābūt HH:MM[:ss[.uuuuuu]] " -"formātā." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” vērtība ir pareizā formātā (HH:MM[:ss[.uuuuuu]]), bet tas nav " -"derīgs laiks." - -msgid "Time" -msgstr "Laiks" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Bināri dati" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” nav derīgs UUID." - -msgid "Universally unique identifier" -msgstr "Universāli unikāls identifikators" - -msgid "File" -msgstr "Fails" - -msgid "Image" -msgstr "Attēls" - -msgid "A JSON object" -msgstr "JSON objekts" - -msgid "Value must be valid JSON." -msgstr "Vērtībai ir jābūt derīgam JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s instance ar %(field)s %(value)r nav derīga izvēle." - -msgid "Foreign Key (type determined by related field)" -msgstr "Ārējā atslēga (tipu nosaka lauks uz kuru attiecas)" - -msgid "One-to-one relationship" -msgstr "Attiecība viens pret vienu" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s attiecība" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s attiecības" - -msgid "Many-to-many relationship" -msgstr "Attiecība daudzi pret daudziem" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Šis lauks ir obligāts." - -msgid "Enter a whole number." -msgstr "Ievadiet veselu skaitli." - -msgid "Enter a valid date." -msgstr "Ievadiet korektu datumu." - -msgid "Enter a valid time." -msgstr "Ievadiet korektu laiku." - -msgid "Enter a valid date/time." -msgstr "Ievadiet korektu datumu/laiku." - -msgid "Enter a valid duration." -msgstr "Ievadiet korektu ilgumu." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Dienu skaitam jābūt no {min_days} līdz {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nav nosūtīts fails. Pārbaudiet formas kodējuma tipu." - -msgid "No file was submitted." -msgstr "Netika nosūtīts fails." - -msgid "The submitted file is empty." -msgstr "Jūsu nosūtītais fails ir tukšs." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Faila nosaukuma garumam jābūt ne vairāk kā %(max)d zīmēm (tas ir %(length)d)." -msgstr[1] "" -"Faila nosaukuma garumam jābūt ne vairāk kā %(max)d zīmei (tas ir %(length)d)." -msgstr[2] "" -"Faila nosaukuma garumam jābūt ne vairāk kā %(max)d zīmēm (tas ir %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Vai nu iesniedziet failu, vai atzīmējiet tukšo izvēles rūtiņu, bet ne abus." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Augšupielādējiet korektu attēlu. Fails, ko augšupielādējāt, vai nu nav " -"attēls, vai arī ir bojāts." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Izvēlieties korektu izvēli. %(value)s nav pieejamo izvēļu sarakstā." - -msgid "Enter a list of values." -msgstr "Ievadiet sarakstu ar vērtībām." - -msgid "Enter a complete value." -msgstr "Ievadiet pilnu vērtību." - -msgid "Enter a valid UUID." -msgstr "Ievadiet derīgu UUID." - -msgid "Enter a valid JSON." -msgstr "Ievadiet korektu JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Slēpts lauks %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm trūkst datu vai tie ir mainīti. Trūkstošie lauki: " -"%(field_names)s. Paziņojiet par kļūdu, ja problēma atkārtojas." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Lūdzu iesniedziet ne vairāk par %(num)d formām." -msgstr[1] "Lūdzu iesniedziet ne vairāk par %(num)d formu." -msgstr[2] "Lūdzu iesniedziet ne vairāk par %(num)d formām." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Lūdzu iesniedziet vismaz %(num)d formas." -msgstr[1] "Lūdzu iesniedziet vismaz %(num)d formu." -msgstr[2] "Lūdzu iesniedziet vismaz %(num)d formas." - -msgid "Order" -msgstr "Kārtība" - -msgid "Delete" -msgstr "Dzēst" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Lūdzu izlabojiet dublicētos datus priekš %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Lūdzu izlabojiet dublicētos datus laukam %(field)s, kam jābūt unikālam." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Lūdzu izlabojiet dublicētos datus laukam %(field_name)s, kam jābūt unikālam " -"priekš %(lookup)s iekš %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Lūdzu izlabojiet dublicētās vērtības zemāk." - -msgid "The inline value did not match the parent instance." -msgstr "Iekļautā vērtība nesakrita ar vecāka instanci." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Izvēlieties pareizu izvēli. Jūsu izvēle neietilpst pieejamo sarakstā." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” nav derīga vērtība." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s vērtība nevar tikt attēlota %(current_timezone)s laika zonā; tā " -"var būt neskaidra vai neeksistē." - -msgid "Clear" -msgstr "Notīrīt" - -msgid "Currently" -msgstr "Pašlaik" - -msgid "Change" -msgstr "Mainīt" - -msgid "Unknown" -msgstr "Nezināms" - -msgid "Yes" -msgstr "Jā" - -msgid "No" -msgstr "Nē" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "jā,nē,varbūt" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d baits" -msgstr[1] "%(size)d baiti" -msgstr[2] "%(size)d baitu" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "pusnakts" - -msgid "noon" -msgstr "dienasvidus" - -msgid "Monday" -msgstr "pirmdiena" - -msgid "Tuesday" -msgstr "otrdiena" - -msgid "Wednesday" -msgstr "trešdiena" - -msgid "Thursday" -msgstr "ceturtdiena" - -msgid "Friday" -msgstr "piektdiena" - -msgid "Saturday" -msgstr "sestdiena" - -msgid "Sunday" -msgstr "svētdiena" - -msgid "Mon" -msgstr "pr" - -msgid "Tue" -msgstr "ot" - -msgid "Wed" -msgstr "tr" - -msgid "Thu" -msgstr "ce" - -msgid "Fri" -msgstr "pk" - -msgid "Sat" -msgstr "se" - -msgid "Sun" -msgstr "sv" - -msgid "January" -msgstr "janvāris" - -msgid "February" -msgstr "februāris" - -msgid "March" -msgstr "marts" - -msgid "April" -msgstr "aprīlis" - -msgid "May" -msgstr "maijs" - -msgid "June" -msgstr "jūnijs" - -msgid "July" -msgstr "jūlijs" - -msgid "August" -msgstr "augusts" - -msgid "September" -msgstr "septembris" - -msgid "October" -msgstr "oktobris" - -msgid "November" -msgstr "novembris" - -msgid "December" -msgstr "decembris" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jūn" - -msgid "jul" -msgstr "jūl" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "marts" - -msgctxt "abbrev. month" -msgid "April" -msgstr "aprīlis" - -msgctxt "abbrev. month" -msgid "May" -msgstr "maijs" - -msgctxt "abbrev. month" -msgid "June" -msgstr "jūnijs" - -msgctxt "abbrev. month" -msgid "July" -msgstr "jūlijs" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec." - -msgctxt "alt. month" -msgid "January" -msgstr "janvāris" - -msgctxt "alt. month" -msgid "February" -msgstr "februāris" - -msgctxt "alt. month" -msgid "March" -msgstr "marts" - -msgctxt "alt. month" -msgid "April" -msgstr "aprīlis" - -msgctxt "alt. month" -msgid "May" -msgstr "maijs" - -msgctxt "alt. month" -msgid "June" -msgstr "jūnijs" - -msgctxt "alt. month" -msgid "July" -msgstr "jūlijs" - -msgctxt "alt. month" -msgid "August" -msgstr "augusts" - -msgctxt "alt. month" -msgid "September" -msgstr "septembris" - -msgctxt "alt. month" -msgid "October" -msgstr "oktobris" - -msgctxt "alt. month" -msgid "November" -msgstr "novembris" - -msgctxt "alt. month" -msgid "December" -msgstr "decembris" - -msgid "This is not a valid IPv6 address." -msgstr "Šī nav derīga IPv6 adrese." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "vai" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d gadi" -msgstr[1] "%(num)d gads" -msgstr[2] "%(num)d gadi" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mēneši" -msgstr[1] "%(num)d mēnesis" -msgstr[2] "%(num)d mēneši" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nedēļas" -msgstr[1] "%(num)d nedēļa" -msgstr[2] "%(num)d nedēļas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dienas" -msgstr[1] "%(num)d diena" -msgstr[2] "%(num)d dienas" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d stundas" -msgstr[1] "%(num)d stunda" -msgstr[2] "%(num)d stubdas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minūtes" -msgstr[1] "%(num)d minūte" -msgstr[2] "%(num)d minūtes" - -msgid "Forbidden" -msgstr "Aizliegts" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF pārbaude neizdevās. Pieprasījums pārtrauks." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Jūs redzat šo paziņojumu, jo jūsu pārlūkprogrammai ir jānosūta “Referer " -"header” šai HTTPS vietnei, taču tā netika nosūtīta. Šī galvene ir " -"nepieciešama drošības apsvērumu dēļ, lai pārliecinātos, ka jūsu " -"pārlūkprogrammas komunikācijas datus nepārtver trešās puses." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ja esat konfigurējis savu pārlūkprogrammu, lai atspējotu “Referer” headerus, " -"lūdzu, atkārtoti iespējojiet tos vismaz šai vietnei, HTTPS savienojumiem vai " -"“same-origin” pieprasījumiem." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ja jūs izmantojat tagu vai " -"iekļaujat “Referrer-Policy: no-referrer” headeri, lūdzu noņemiet tos. CSRF " -"aizsardzībai ir nepieciešams, lai “Referer” headerī tiktu veikta strikta " -"pārvirzītāja pārbaude. Ja jūs domājat par privātumu, tad izmantojiet tādas " -"alternatīvas kā priekš saitēm uz trešo pušu vietnēm." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Jūs redzat šo ziņojumu, jo, iesniedzot veidlapas, šai vietnei ir " -"nepieciešams CSRF sīkfails. Šis sīkfails ir vajadzīgs drošības apsvērumu " -"dēļ, lai pārliecinātos, ka trešās personas nepārņems kontroli pār jūsu " -"pārlūkprogrammu." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ja esat konfigurējis pārlūkprogrammu, lai atspējotu sīkdatnes, lūdzu, " -"atkārtoti iespējojiet tās vismaz šai vietnei vai “same-origin” " -"pieprasījumiem." - -msgid "More information is available with DEBUG=True." -msgstr "Vairāk informācijas ir pieejams ar DEBUG=True" - -msgid "No year specified" -msgstr "Nav norādīts gads" - -msgid "Date out of range" -msgstr "Datums ir ārpus diapazona" - -msgid "No month specified" -msgstr "Nav norādīts mēnesis" - -msgid "No day specified" -msgstr "Nav norādīta diena" - -msgid "No week specified" -msgstr "Nav norādīta nedēļa" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s nav pieejami" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Nākotne %(verbose_name_plural)s nav pieejama, jo %(class_name)s.allow_future " -"ir False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Nepareiza datuma rinda “%(datestr)s” norādītajā formātā “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Neviens %(verbose_name)s netika atrasts" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Lapa nav “pēdējā”, kā arī tā nevar tikt konvertēta par ciparu." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nepareiza lapa (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tukšs saraksts un \"%(class_name)s.allow_empty\" ir False." - -msgid "Directory indexes are not allowed here." -msgstr "Direktoriju indeksi nav atļauti." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" neeksistē" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s saturs" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalācija veiksmīga! Apsveicam!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Apskatīt laidiena piezīmes Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Jūs redziet šo lapu, jo DEBUG=True ir iestatījumu failā un Jūs neesiet " -"konfigurējis nevienu saiti." - -msgid "Django Documentation" -msgstr "Django Dokumentācija" - -msgid "Topics, references, & how-to’s" -msgstr "Tēmas, atsauces, & how-to" - -msgid "Tutorial: A Polling App" -msgstr "Apmācība: Balsošanas aplikācija" - -msgid "Get started with Django" -msgstr "Sāciet ar Django" - -msgid "Django Community" -msgstr "Django Komūna" - -msgid "Connect, get help, or contribute" -msgstr "Sazinieties, saņemiet palīdzību vai sniedziet ieguldījumu" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/lv/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/lv/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/lv/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/lv/formats.py deleted file mode 100644 index bb34444..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/lv/formats.py +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"Y. \g\a\d\a j. F" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"Y. \g\a\d\a j. F, H:i" -YEAR_MONTH_FORMAT = r"Y. \g. F" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = r"j.m.Y" -SHORT_DATETIME_FORMAT = "j.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' - "%H.%M.%S", # '14.30.59' - "%H.%M.%S.%f", # '14.30.59.000200' - "%H.%M", # '14.30' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y %H.%M.%S", # '25.10.06 14.30.59' - "%d.%m.%y %H.%M.%S.%f", # '25.10.06 14.30.59.000200' - "%d.%m.%y %H.%M", # '25.10.06 14.30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = " " # Non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index 798ca7e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/mk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index ecd62ce..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,1273 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bojan Drangovski , 2021 -# Claude Paroz , 2020 -# dekomote , 2015 -# Jannis Leidel , 2011 -# Vasil Vangelovski , 2016-2017 -# Vasil Vangelovski , 2013-2015 -# Vasil Vangelovski , 2011-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-05-12 22:47+0000\n" -"Last-Translator: Bojan Drangovski \n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgid "Afrikaans" -msgstr "Африканс" - -msgid "Arabic" -msgstr "Арапски" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Астуриски" - -msgid "Azerbaijani" -msgstr "Азербејџански" - -msgid "Bulgarian" -msgstr "Бугарски" - -msgid "Belarusian" -msgstr "Белоруски" - -msgid "Bengali" -msgstr "Бенгалски" - -msgid "Breton" -msgstr "Бретонски" - -msgid "Bosnian" -msgstr "Босански" - -msgid "Catalan" -msgstr "Каталански" - -msgid "Czech" -msgstr "Чешки" - -msgid "Welsh" -msgstr "Велшки" - -msgid "Danish" -msgstr "Дански" - -msgid "German" -msgstr "Германски" - -msgid "Lower Sorbian" -msgstr "Долно Лужичко-Српски" - -msgid "Greek" -msgstr "Грчки" - -msgid "English" -msgstr "Англиски" - -msgid "Australian English" -msgstr "Австралиски англиски" - -msgid "British English" -msgstr "Британски англиски" - -msgid "Esperanto" -msgstr "Есперанто" - -msgid "Spanish" -msgstr "Шпански" - -msgid "Argentinian Spanish" -msgstr "Аргентински шпански" - -msgid "Colombian Spanish" -msgstr "Колумбиски Шпански" - -msgid "Mexican Spanish" -msgstr "Мексикански шпански" - -msgid "Nicaraguan Spanish" -msgstr "Никарагва шпански" - -msgid "Venezuelan Spanish" -msgstr "Венецуела шпански" - -msgid "Estonian" -msgstr "Естонски" - -msgid "Basque" -msgstr "Баскиски" - -msgid "Persian" -msgstr "Персиски" - -msgid "Finnish" -msgstr "Фински" - -msgid "French" -msgstr "Француски" - -msgid "Frisian" -msgstr "Фризиски" - -msgid "Irish" -msgstr "Ирски" - -msgid "Scottish Gaelic" -msgstr "Шкотски Галски" - -msgid "Galician" -msgstr "Галски" - -msgid "Hebrew" -msgstr "Еврејски" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Хрватски" - -msgid "Upper Sorbian" -msgstr "Горно Лужичко-Српски" - -msgid "Hungarian" -msgstr "Унгарски" - -msgid "Armenian" -msgstr "Ерменски" - -msgid "Interlingua" -msgstr "Интерлингва" - -msgid "Indonesian" -msgstr "Индонезиски" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Идо" - -msgid "Icelandic" -msgstr "Исландски" - -msgid "Italian" -msgstr "Италијански" - -msgid "Japanese" -msgstr "Јапонски" - -msgid "Georgian" -msgstr "Грузиски" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Казахстански" - -msgid "Khmer" -msgstr "Кмер" - -msgid "Kannada" -msgstr "Канада" - -msgid "Korean" -msgstr "Корејски" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Луксембуршки" - -msgid "Lithuanian" -msgstr "Литвански" - -msgid "Latvian" -msgstr "Латвиски" - -msgid "Macedonian" -msgstr "Македонски" - -msgid "Malayalam" -msgstr "Малајалам" - -msgid "Mongolian" -msgstr "Монголски" - -msgid "Marathi" -msgstr "Марати" - -msgid "Burmese" -msgstr "Бурмански" - -msgid "Norwegian Bokmål" -msgstr "Норвешки Бокмел" - -msgid "Nepali" -msgstr "Непалски" - -msgid "Dutch" -msgstr "Холандски" - -msgid "Norwegian Nynorsk" -msgstr "Нинорск норвешки" - -msgid "Ossetic" -msgstr "Осетски" - -msgid "Punjabi" -msgstr "Пунџаби" - -msgid "Polish" -msgstr "Полски" - -msgid "Portuguese" -msgstr "Португалкски" - -msgid "Brazilian Portuguese" -msgstr "Бразилско португалски" - -msgid "Romanian" -msgstr "Романски" - -msgid "Russian" -msgstr "Руски" - -msgid "Slovak" -msgstr "Словачки" - -msgid "Slovenian" -msgstr "Словенечки" - -msgid "Albanian" -msgstr "Албански" - -msgid "Serbian" -msgstr "Српски" - -msgid "Serbian Latin" -msgstr "Српски Латиница" - -msgid "Swedish" -msgstr "Шведски" - -msgid "Swahili" -msgstr "Свахили" - -msgid "Tamil" -msgstr "Тамил" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Тајландски" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Турски" - -msgid "Tatar" -msgstr "Татарски" - -msgid "Udmurt" -msgstr "Удмурт" - -msgid "Ukrainian" -msgstr "Украински" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Виетнамски" - -msgid "Simplified Chinese" -msgstr "Поедноставен кинески" - -msgid "Traditional Chinese" -msgstr "Традиционален кинески" - -msgid "Messages" -msgstr "Пораки" - -msgid "Site Maps" -msgstr "Сајт мапи" - -msgid "Static Files" -msgstr "Статички датотеки" - -msgid "Syndication" -msgstr "Синдикација" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Тој број на страна не е цел број" - -msgid "That page number is less than 1" -msgstr "Тој број на страна е помал од 1" - -msgid "That page contains no results" -msgstr "Таа страна не содржи резултати" - -msgid "Enter a valid value." -msgstr "Внесете правилна вредност." - -msgid "Enter a valid URL." -msgstr "Внесете правилна веб адреса." - -msgid "Enter a valid integer." -msgstr "Внесете валиден цел број." - -msgid "Enter a valid email address." -msgstr "Внесете валидна email адреса." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Внесeте правилна IPv4 адреса." - -msgid "Enter a valid IPv6 address." -msgstr "Внесете валидна IPv6 адреса." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Внесете валидна IPv4 или IPv6 адреса." - -msgid "Enter only digits separated by commas." -msgstr "Внесете само цифри одделени со запирки." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Осигурајте се дека оваа вредност е %(limit_value)s (моментално е " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Осигурајте се дека оваа вредност е помала или еднаква со %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Осигурајте се дека оваа вредност е поголема или еднаква со %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Осигурајте се дека оваа вредност има најмалку %(limit_value)d карактер (има " -"%(show_value)d)." -msgstr[1] "" -"Осигурајте се дека оваа вредност има најмалку %(limit_value)d карактери (има " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Осигурајте се дека оваа вредност има најмногу %(limit_value)d карактер (има " -"%(show_value)d)." -msgstr[1] "" -"Осигурајте се дека оваа вредност има најмногу %(limit_value)d карактери (има " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Внесете број." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Осигурајте се дека вкупно нема повеќе од %(max)s цифра." -msgstr[1] "Осигурајте се дека вкупно нема повеќе од %(max)s цифри." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Осигурајте се дека нема повеќе од %(max)s децимално место." -msgstr[1] "Осигурајте се дека нема повеќе од %(max)s децимални места." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Осигурајте се дека нема повеќе одs %(max)s цифра пред децималната запирка." -msgstr[1] "" -"Осигурајте се дека нема повеќе од %(max)s цифри пред децималната запирка." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Null карактери не се дозволени." - -msgid "and" -msgstr "и" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s со ова %(field_labels)s веќе постојат." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Вредноста %(value)r не е валиден избор." - -msgid "This field cannot be null." -msgstr "Оваа вредност неможе да биде null." - -msgid "This field cannot be blank." -msgstr "Ова поле не може да биде празно" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s со %(field_label)s веќе постои." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s мора да биде уникатно за %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Поле од тип: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Вредноста '%(value)s' мора да биде точно или неточно." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Логичка (или точно или неточно)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Нишка од знаци (текст) (до %(max_length)s карактери)" - -msgid "Comma-separated integers" -msgstr "Целобројни вредности одделени со запирка" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Датум (без време)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Датум (со време)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Децимален број" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Траење" - -msgid "Email address" -msgstr "Адреса за е-пошта (email)" - -msgid "File path" -msgstr "Патека на датотека" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Децимален број подвижна запирка" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Цел број" - -msgid "Big (8 byte) integer" -msgstr "Голем (8 бајти) цел број" - -msgid "Small integer" -msgstr "Мал цел број" - -msgid "IPv4 address" -msgstr "IPv4 адреса" - -msgid "IP address" -msgstr "IP адреса" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Логичка вредност (точно,неточно или ништо)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Позитивен цел број" - -msgid "Positive small integer" -msgstr "Позитивен мал цел број" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Скратено име (до %(max_length)s знаци)" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Време" - -msgid "URL" -msgstr "URL (веб адреса)" - -msgid "Raw binary data" -msgstr "Сурови бинарни податоци" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Датотека" - -msgid "Image" -msgstr "Слика" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s инстанца со %(field)s %(value)r не постои." - -msgid "Foreign Key (type determined by related field)" -msgstr "Надворешен клуч (типот е одреден според поврзаното поле)" - -msgid "One-to-one relationship" -msgstr "Еден-према-еден релација" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s релација" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s релации" - -msgid "Many-to-many relationship" -msgstr "Повеќе-према-повеќе релација" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ова поле е задолжително." - -msgid "Enter a whole number." -msgstr "Внесете цел број." - -msgid "Enter a valid date." -msgstr "Внесете правилен датум." - -msgid "Enter a valid time." -msgstr "Внесете правилно време." - -msgid "Enter a valid date/time." -msgstr "Внесете правилен датум со време." - -msgid "Enter a valid duration." -msgstr "Внесете валидно времетрање." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Не беше пратена датотека. Проверете го типот на енкодирање на формата." - -msgid "No file was submitted." -msgstr "Не беше пратена датотека." - -msgid "The submitted file is empty." -msgstr "Пратената датотека е празна." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Осигурајте се дека ова име на датотека има најмногу %(max)d карактер (има " -"%(length)d)." -msgstr[1] "" -"Осигурајте се дека ова име на датотека има најмногу %(max)d карактери (има " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Или прикачете датотека или штиклирајте го полето за чистење, не двете од " -"еднаш." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Качете валидна слика. Датотеката која ја качивте или не беше слика или беше " -"расипана датотеката." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Внесете валиден избор. %(value)s не е еден од можните избори." - -msgid "Enter a list of values." -msgstr "Внесете листа на вредности." - -msgid "Enter a complete value." -msgstr "Внесете целосна вредност." - -msgid "Enter a valid UUID." -msgstr "Внесете валиден UUID (единствен идентификатор)." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Скриено поле %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Редослед" - -msgid "Delete" -msgstr "Избриши" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ве молам поправете ја дуплираната вредност за %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ве молам поправете ја дуплираната вредност за %(field)s, која мора да биде " -"уникатна." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ве молам поправете ја дуплираната вредност за %(field_name)s која мора да " -"биде уникатна за %(lookup)s во %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Ве молам поправете ги дуплираните вредности подолу." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Изберете правилно. Тоа не е еден од можните избори." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Исчисти" - -msgid "Currently" -msgstr "Моментално" - -msgid "Change" -msgstr "Измени" - -msgid "Unknown" -msgstr "Непознато" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "да,не,можеби" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d бајт" -msgstr[1] "%(size)d бајти" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "попладне" - -msgid "a.m." -msgstr "наутро" - -msgid "PM" -msgstr "попладне" - -msgid "AM" -msgstr "наутро" - -msgid "midnight" -msgstr "полноќ" - -msgid "noon" -msgstr "пладне" - -msgid "Monday" -msgstr "Понеделник" - -msgid "Tuesday" -msgstr "Вторник" - -msgid "Wednesday" -msgstr "Среда" - -msgid "Thursday" -msgstr "Четврток" - -msgid "Friday" -msgstr "Петок" - -msgid "Saturday" -msgstr "Сабота" - -msgid "Sunday" -msgstr "Недела" - -msgid "Mon" -msgstr "Пон" - -msgid "Tue" -msgstr "Вто" - -msgid "Wed" -msgstr "Сре" - -msgid "Thu" -msgstr "Чет" - -msgid "Fri" -msgstr "Пет" - -msgid "Sat" -msgstr "Саб" - -msgid "Sun" -msgstr "Нед" - -msgid "January" -msgstr "Јануари" - -msgid "February" -msgstr "Февруари" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Април" - -msgid "May" -msgstr "Мај" - -msgid "June" -msgstr "Јуни" - -msgid "July" -msgstr "Јули" - -msgid "August" -msgstr "август" - -msgid "September" -msgstr "Септември" - -msgid "October" -msgstr "Октомври" - -msgid "November" -msgstr "Ноември" - -msgid "December" -msgstr "Декември" - -msgid "jan" -msgstr "јан" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "мај" - -msgid "jun" -msgstr "јун" - -msgid "jul" -msgstr "јул" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сеп" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ное" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Јан." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Април" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Мај" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Јуни" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Јули" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Септ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ное." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "Јануари" - -msgctxt "alt. month" -msgid "February" -msgstr "Февруари" - -msgctxt "alt. month" -msgid "March" -msgstr "Март" - -msgctxt "alt. month" -msgid "April" -msgstr "Април" - -msgctxt "alt. month" -msgid "May" -msgstr "Мај" - -msgctxt "alt. month" -msgid "June" -msgstr "Јуни" - -msgctxt "alt. month" -msgid "July" -msgstr "Јули" - -msgctxt "alt. month" -msgid "August" -msgstr "Август" - -msgctxt "alt. month" -msgid "September" -msgstr "Септември" - -msgctxt "alt. month" -msgid "October" -msgstr "Октомври" - -msgctxt "alt. month" -msgid "November" -msgstr "Ноември" - -msgctxt "alt. month" -msgid "December" -msgstr "Декември" - -msgid "This is not a valid IPv6 address." -msgstr "Ова не е валидна IPv6 адреса." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "или" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d година" -msgstr[1] "%d години" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d месец" -msgstr[1] "%d месеци" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d недела" -msgstr[1] "%d недели" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d ден" -msgstr[1] "%d дена" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d час" -msgstr[1] "%d часови" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минута" -msgstr[1] "%d минути" - -msgid "Forbidden" -msgstr "Забрането" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF верификацијата не успеа. Барањето е прекинато." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Ја гледате оваа порака бидејќи овој сајт бара CSRF колаче (cookie) за да се " -"поднесуваат форми. Ова колаче е потребно од безбедносни причини, за да се " -"осигураме дека вашиот веб прелистувач не е грабнат и контролиран од трети " -"страни." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Повеќе информации се достапни со DEBUG = True." - -msgid "No year specified" -msgstr "Не е дадена година" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Не е даден месец" - -msgid "No day specified" -msgstr "Не е даден ден" - -msgid "No week specified" -msgstr "Не е дадена недела" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Нема достапни %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Идни %(verbose_name_plural)s не се достапни бидејќи %(class_name)s." -"allow_future е False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Нема %(verbose_name)s што се совпаѓа со пребарувањето" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Невалидна страна (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Индекси на директориуми не се дозволени тука." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Индекс на %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/mk/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/mk/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/mk/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/mk/formats.py deleted file mode 100644 index fbb577f..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/mk/formats.py +++ /dev/null @@ -1,40 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.m.Y" -SHORT_DATETIME_FORMAT = "j.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%d. %m. %Y", # '25. 10. 2006' - "%d. %m. %y", # '25. 10. 06' -] - -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d. %m. %Y %H:%M:%S", # '25. 10. 2006 14:30:59' - "%d. %m. %Y %H:%M:%S.%f", # '25. 10. 2006 14:30:59.000200' - "%d. %m. %Y %H:%M", # '25. 10. 2006 14:30' - "%d. %m. %y %H:%M:%S", # '25. 10. 06 14:30:59' - "%d. %m. %y %H:%M:%S.%f", # '25. 10. 06 14:30:59.000200' - "%d. %m. %y %H:%M", # '25. 10. 06 14:30' -] - -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ml/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index 17d15c6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ml/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index 7e1945d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,1274 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# c1007a0b890405f1fbddfacebc4c6ef7, 2013 -# Claude Paroz , 2020 -# Hrishikesh , 2019-2020 -# Jannis Leidel , 2011 -# Jaseem KM , 2019 -# Jeffy , 2012 -# Jibin Mathew , 2019 -# Mariusz Felisiak , 2021 -# Rag sagar , 2016 -# Rajeesh Nair , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-24 16:29+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "ആഫ്രിക്കാന്‍സ്" - -msgid "Arabic" -msgstr "അറബിൿ" - -msgid "Algerian Arabic" -msgstr "അൾഗേരിയൻ അറബിൿ" - -msgid "Asturian" -msgstr "ആസ്ടൂറിയൻ" - -msgid "Azerbaijani" -msgstr "അസര്‍ബൈജാനി" - -msgid "Bulgarian" -msgstr "ബള്‍ഗേറിയന്‍" - -msgid "Belarusian" -msgstr "ബെലറൂഷ്യന്‍" - -msgid "Bengali" -msgstr "ബംഗാളി" - -msgid "Breton" -msgstr "ബ്രെട്ടണ്‍" - -msgid "Bosnian" -msgstr "ബോസ്നിയന്‍" - -msgid "Catalan" -msgstr "കാറ്റലന്‍" - -msgid "Czech" -msgstr "ചെൿ" - -msgid "Welsh" -msgstr "വെല്‍ഷ്" - -msgid "Danish" -msgstr "ഡാനിഷ്" - -msgid "German" -msgstr "ജര്‍മന്‍" - -msgid "Lower Sorbian" -msgstr "ലോവർ സോർബിയൻ " - -msgid "Greek" -msgstr "ഗ്രീക്ക്" - -msgid "English" -msgstr "ഇംഗ്ലീഷ്" - -msgid "Australian English" -msgstr "ആസ്ട്രേലിയൻ ഇംഗ്ലീഷ്" - -msgid "British English" -msgstr "ബ്രിട്ടീഷ് ഇംഗ്ലീഷ്" - -msgid "Esperanto" -msgstr "എസ്പെരാന്റോ" - -msgid "Spanish" -msgstr "സ്പാനിഷ്" - -msgid "Argentinian Spanish" -msgstr "അര്‍ജന്റീനിയന്‍ സ്പാനിഷ്" - -msgid "Colombian Spanish" -msgstr "കൊളംബിയൻ സ്പാനിഷ്" - -msgid "Mexican Spanish" -msgstr "മെക്സിക്കന്‍ സ്പാനിഷ്" - -msgid "Nicaraguan Spanish" -msgstr "നിക്കരാഗ്വന്‍ സ്പാനിഷ്" - -msgid "Venezuelan Spanish" -msgstr "വെനിസ്വലന്‍ സ്പാനിഷ്" - -msgid "Estonian" -msgstr "എസ്ടോണിയന്‍ സ്പാനിഷ്" - -msgid "Basque" -msgstr "ബാസ്ക്യു" - -msgid "Persian" -msgstr "പേര്‍ഷ്യന്‍" - -msgid "Finnish" -msgstr "ഫിന്നിഷ്" - -msgid "French" -msgstr "ഫ്രെഞ്ച്" - -msgid "Frisian" -msgstr "ഫ്രിസിയന്‍" - -msgid "Irish" -msgstr "ഐറിഷ്" - -msgid "Scottish Gaelic" -msgstr "സ്കോട്ടിഷ് ഗൈലിൿ" - -msgid "Galician" -msgstr "ഗലിഷ്യന്‍" - -msgid "Hebrew" -msgstr "ഹീബ്രു" - -msgid "Hindi" -msgstr "ഹിന്ദി" - -msgid "Croatian" -msgstr "ക്രൊയേഷ്യന്‍" - -msgid "Upper Sorbian" -msgstr "അപ്പർ സോർബിയൻ " - -msgid "Hungarian" -msgstr "ഹംഗേറിയന്‍" - -msgid "Armenian" -msgstr "അർമേനിയൻ" - -msgid "Interlingua" -msgstr "ഇന്റര്‍ലിംഗ്വാ" - -msgid "Indonesian" -msgstr "ഇന്തൊനേഷ്യന്‍" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "ഈടോ" - -msgid "Icelandic" -msgstr "ഐസ്ലാന്‍ഡിൿ" - -msgid "Italian" -msgstr "ഇറ്റാലിയന്‍" - -msgid "Japanese" -msgstr "ജാപ്പനീസ്" - -msgid "Georgian" -msgstr "ജോര്‍ജിയന്‍" - -msgid "Kabyle" -msgstr "കാബയെൽ " - -msgid "Kazakh" -msgstr "കസാഖ്" - -msgid "Khmer" -msgstr "ഖ്മേര്‍" - -msgid "Kannada" -msgstr "കന്നഡ" - -msgid "Korean" -msgstr "കൊറിയന്‍" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "ലക്സംബര്‍ഗിഷ് " - -msgid "Lithuanian" -msgstr "ലിത്വാനിയന്‍" - -msgid "Latvian" -msgstr "ലാറ്റ്വിയന്‍" - -msgid "Macedonian" -msgstr "മാസിഡോണിയന്‍" - -msgid "Malayalam" -msgstr "മലയാളം" - -msgid "Mongolian" -msgstr "മംഗോളിയന്‍" - -msgid "Marathi" -msgstr "മറാത്തി" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "ബര്‍മീസ്" - -msgid "Norwegian Bokmål" -msgstr "നോർവേജിയൻ ബുക്ക്മൊൾ" - -msgid "Nepali" -msgstr "നേപ്പാളി" - -msgid "Dutch" -msgstr "ഡച്ച്" - -msgid "Norwegian Nynorsk" -msgstr "നോര്‍വീജിയന്‍ നിനോഷ്ക്" - -msgid "Ossetic" -msgstr "ഒസ്സെറ്റിക്" - -msgid "Punjabi" -msgstr "പഞ്ചാബി" - -msgid "Polish" -msgstr "പോളിഷ്" - -msgid "Portuguese" -msgstr "പോര്‍ചുഗീസ്" - -msgid "Brazilian Portuguese" -msgstr "ബ്രസീലിയന്‍ പോര്‍ച്ചുഗീസ്" - -msgid "Romanian" -msgstr "റൊമാനിയന്‍" - -msgid "Russian" -msgstr "റഷ്യന്‍" - -msgid "Slovak" -msgstr "സ്ലൊവാൿ" - -msgid "Slovenian" -msgstr "സ്ളൊവേനിയന്‍" - -msgid "Albanian" -msgstr "അല്‍ബേനിയന്‍" - -msgid "Serbian" -msgstr "സെര്‍ബിയന്‍" - -msgid "Serbian Latin" -msgstr "സെര്‍ബിയന്‍ ലാറ്റിന്‍" - -msgid "Swedish" -msgstr "സ്വീഡിഷ്" - -msgid "Swahili" -msgstr "സ്വാഹിലി" - -msgid "Tamil" -msgstr "തമിഴ്" - -msgid "Telugu" -msgstr "തെലുങ്ക്" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "തായ്" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "ടര്‍ക്കിഷ്" - -msgid "Tatar" -msgstr "തൊതാര്‍" - -msgid "Udmurt" -msgstr "ഉദ്മര്‍ത്" - -msgid "Ukrainian" -msgstr "യുക്രേനിയന്‍" - -msgid "Urdu" -msgstr "ഉര്‍ദു" - -msgid "Uzbek" -msgstr "ഉസ്ബെൿ" - -msgid "Vietnamese" -msgstr "വിയറ്റ്നാമീസ്" - -msgid "Simplified Chinese" -msgstr "സിമ്പ്ലിഫൈഡ് ചൈനീസ്" - -msgid "Traditional Chinese" -msgstr "പരമ്പരാഗത ചൈനീസ്" - -msgid "Messages" -msgstr "സന്ദേശങ്ങൾ" - -msgid "Site Maps" -msgstr "സൈറ്റ് മാപ്പുകൾ" - -msgid "Static Files" -msgstr " സ്റ്റാറ്റിൿ ഫയലുകൾ" - -msgid "Syndication" -msgstr "വിതരണം " - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "ആ പേജ് നമ്പർ ഒരു ഇന്റിജറല്ല" - -msgid "That page number is less than 1" -msgstr "ആ പേജ് നമ്പർ 1 നെ കാൾ ചെറുതാണ് " - -msgid "That page contains no results" -msgstr "ആ പേജിൽ റിസൾട്ടുകൾ ഒന്നും ഇല്ല " - -msgid "Enter a valid value." -msgstr "ശരിയായ വാല്യു നൽകുക." - -msgid "Enter a valid URL." -msgstr "ശരിയായ URL നല്‍കുക" - -msgid "Enter a valid integer." -msgstr "ശരിയായ ഇന്റിജർ നൽകുക." - -msgid "Enter a valid email address." -msgstr "ശരിയായ ഇമെയില്‍ വിലാസം നല്‍കുക." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"അക്ഷരങ്ങള്‍, അക്കങ്ങള്‍, അണ്ടര്‍സ്കോര്‍, ഹൈഫന്‍ എന്നിവ മാത്രം അടങ്ങിയ ശരിയായ ഒരു 'സ്ലഗ്ഗ്' നൽകുക. " - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"യൂണികോഡ് അക്ഷരങ്ങൾ, അക്കങ്ങൾ, ഹൈഫണുകൾ, അണ്ടർസ്കോറുക‌‌ൾ എന്നിവമാത്രം അടങ്ങിയ ശെരിയായ ‌ഒരു " -"“സ്ലഗ്” എഴുതുക ." - -msgid "Enter a valid IPv4 address." -msgstr "ശരിയായ IPv4 വിലാസം നൽകുക." - -msgid "Enter a valid IPv6 address." -msgstr "ശരിയായ ഒരു IPv6 വിലാസം നൽകുക." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "ശരിയായ ഒരു IPv4 വിലാസമോ IPv6 വിലാസമോ നൽകുക." - -msgid "Enter only digits separated by commas." -msgstr "കോമകൾ ഉപയോഗിച്ച് വേർതിരിച്ച രീതിയിലുള്ള അക്കങ്ങൾ മാത്രം നൽകുക." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "ഇത് %(limit_value)s ആവണം. (ഇപ്പോള്‍ %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "ഇത് %(limit_value)s-ഓ അതില്‍ കുറവോ ആവണം" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "ഇത് %(limit_value)s-ഓ അതില്‍ കൂടുതലോ ആവണം" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"ഈ വാല്യൂയിൽ %(limit_value)d ക്യാരക്ടർ എങ്കിലും ഉണ്ടെന്നു ഉറപ്പു വരുത്തുക(ഇതിൽ " -"%(show_value)d ഉണ്ട് )" -msgstr[1] "" -"ഈ വാല്യൂയിൽ %(limit_value)dക്യാരക്ടേർസ് എങ്കിലും ഉണ്ടെന്നു ഉറപ്പു വരുത്തുക(ഇതിൽ " -"%(show_value)d ഉണ്ട് )" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"ഈ വാല്യൂയിൽ %(limit_value)d ക്യാരക്ടർ 1 ഇൽ കൂടുതൽ ഇല്ലെന്നു ഉറപ്പു വരുത്തുക(ഇതിൽ 2 " -"%(show_value)d ഉണ്ട് )" -msgstr[1] "" -"ഈ വാല്യൂയിൽ %(limit_value)d ക്യാരക്ടർസ് 1 ഇൽ കൂടുതൽ ഇല്ലെന്നു ഉറപ്പു വരുത്തുക(ഇതിൽ 2 " -"%(show_value)d ഉണ്ട് )" - -msgid "Enter a number." -msgstr "ഒരു സംഖ്യ നല്കുക." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "%(max)s ഡിജിറ്റിൽ കൂടുതൽ ഇല്ല എന്ന് ഉറപ്പു വരുത്തുക ." -msgstr[1] "%(max)sഡിജിറ്റ്സിൽ കൂടുതൽ ഇല്ല എന്ന് ഉറപ്പു വരുത്തുക. " - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "%(max)sകൂടുതൽ ഡെസിമൽ പോയന്റില്ല എന്ന് ഉറപ്പു വരുത്തുക. " -msgstr[1] "%(max)sകൂടുതൽ ഡെസിമൽ പോയിന്റുകളില്ല എന്ന് ഉറപ്പു വരുത്തുക. " - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "%(max)sഡിജിറ്റ് ഡെസിമൽ പോയിന്റിനു മുൻപ് ഇല്ല എന്ന് ഉറപ്പു വരുത്തുക." -msgstr[1] "%(max)sഡിജിറ്റ്സ് ഡെസിമൽ പോയിന്റിനു മുൻപ് ഇല്ല എന്ന് ഉറപ്പു വരുത്തുക. " - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"“%(extension)s” എന്ന ഫയൽ എക്സ്റ്റൻഷൻ അനുവദനീയമല്ല. അനുവദനീയമായ എക്സ്റ്റൻഷനുകൾ ഇവയാണ്: " -"%(allowed_extensions)s" - -msgid "Null characters are not allowed." -msgstr "Null ക്യാരക്ടറുകൾ അനുവദനീയമല്ല." - -msgid "and" -msgstr "പിന്നെ" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)sഉള്ള %(model_name)sനിലവിലുണ്ട്." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r എന്ന വാല്യൂ ശെരിയായ ചോയ്സ് അല്ല. " - -msgid "This field cannot be null." -msgstr "ഈ കളം (ഫീല്‍ഡ്) ഒഴിച്ചിടരുത്." - -msgid "This field cannot be blank." -msgstr "ഈ കളം (ഫീല്‍ഡ്) ഒഴിച്ചിടരുത്." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s-ഓടു കൂടിയ %(model_name)s നിലവിലുണ്ട്." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(date_field_label)s %(lookup_type)s-നു %(field_label)s ആവര്‍ത്തിക്കാന്‍ പാടില്ല." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s എന്ന തരത്തിലുള്ള കളം (ഫീല്‍ഡ്)" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” മൂല്യം ഒന്നുകിൽ True, False എന്നിവയിലേതെങ്കിലുമേ ആവാൻ പാടുള്ളൂ." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" -"“%(value)s” മൂല്യം ഒന്നുകിൽ True, False അല്ലെങ്കിൽ None എന്നിവയിലേതെങ്കിലുമേ ആവാൻ " -"പാടുള്ളൂ." - -msgid "Boolean (Either True or False)" -msgstr "ശരിയോ തെറ്റോ (True അഥവാ False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "സ്ട്രിങ്ങ് (%(max_length)s വരെ നീളമുള്ളത്)" - -msgid "Comma-separated integers" -msgstr "കോമയിട്ട് വേര്‍തിരിച്ച സംഖ്യകള്‍" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "തീയതി (സമയം വേണ്ട)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "തീയതി (സമയത്തോടൊപ്പം)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "ദശാംശസംഖ്യ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "കാലയളവ്" - -msgid "Email address" -msgstr "ഇ-മെയില്‍ വിലാസം" - -msgid "File path" -msgstr "ഫയല്‍ സ്ഥാനം" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "ദശാംശസംഖ്യ" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "പൂര്‍ണ്ണസംഖ്യ" - -msgid "Big (8 byte) integer" -msgstr "8 ബൈറ്റ് പൂര്‍ണസംഖ്യ." - -msgid "Small integer" -msgstr "ഹ്രസ്വ പൂര്‍ണസംഖ്യ" - -msgid "IPv4 address" -msgstr "IPv4 വിലാസം" - -msgid "IP address" -msgstr "IP വിലാസം" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "ശരിയോ തെറ്റോ എന്നു മാത്രം (True, False, None എന്നിവയില്‍ ഏതെങ്കിലും ഒന്ന്)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "ധന പൂര്‍ണസംഖ്യ" - -msgid "Positive small integer" -msgstr "ധന ഹ്രസ്വ പൂര്‍ണസംഖ്യ" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "സ്ലഗ് (%(max_length)s വരെ)" - -msgid "Text" -msgstr "ടെക്സ്റ്റ്" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "സമയം" - -msgid "URL" -msgstr "URL(വെബ്-വിലാസം)" - -msgid "Raw binary data" -msgstr "റോ ബൈനറി ഡാറ്റ" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "എല്ലായിടത്തും യുണീക്കായ ഐഡന്റിഫൈയർ." - -msgid "File" -msgstr "ഫയല്‍" - -msgid "Image" -msgstr "ചിത്രം" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s%(value)r ഉള്ള%(model)s ഇൻസ്റ്റൻസ് നിലവിൽ ഇല്ല." - -msgid "Foreign Key (type determined by related field)" -msgstr "ഫോറിന്‍ കീ (ടൈപ്പ് ബന്ധപ്പെട്ട ഫീല്‍ഡില്‍ നിന്നും നിര്‍ണ്ണയിക്കുന്നതാണ്)" - -msgid "One-to-one relationship" -msgstr "വണ്‍-ടു-വണ്‍ ബന്ധം" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s റിലേഷൻഷിപ്‌." - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)sറിലേഷൻഷിപ്‌സ്. " - -msgid "Many-to-many relationship" -msgstr "മെനി-ടു-മെനി ബന്ധം" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "ഈ കള്ളി(ഫീല്‍ഡ്) നിര്‍ബന്ധമാണ്." - -msgid "Enter a whole number." -msgstr "ഒരു പൂര്‍ണസംഖ്യ നല്കുക." - -msgid "Enter a valid date." -msgstr "ശരിയായ തീയതി നല്കുക." - -msgid "Enter a valid time." -msgstr "ശരിയായ സമയം നല്കുക." - -msgid "Enter a valid date/time." -msgstr "ശരിയായ തീയതിയും സമയവും നല്കുക." - -msgid "Enter a valid duration." -msgstr "സാധുതയുള്ള കാലയളവ് നല്കുക." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "ദിവസങ്ങളുടെ എണ്ണം {min_days}, {max_days} എന്നിവയുടെ ഇടയിലായിരിക്കണം." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "ഫയലൊന്നും ലഭിച്ചിട്ടില്ല. ഫോമിലെ എന്‍-കോഡിംഗ് പരിശോധിക്കുക." - -msgid "No file was submitted." -msgstr "ഫയലൊന്നും ലഭിച്ചിട്ടില്ല." - -msgid "The submitted file is empty." -msgstr "ലഭിച്ച ഫയല്‍ ശൂന്യമാണ്." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"ഈ ഫയൽ നെയ്മിൽ%(max)dക്യാരക്ടറിൽ കൂടുതലില്ല എന്ന് ഉറപ്പു വരുത്തുക (അതിൽ %(length)dഉണ്ട്) . " -msgstr[1] "" -"ഈ ഫയൽ നെയ്മിൽ%(max)dക്യാരക്ടേഴ്‌സിൽ കൂടുതലില്ല എന്ന് ഉറപ്പു വരുത്തുക (അതിൽ %(length)dഉണ്ട്)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"ഒന്നുകില്‍ ഫയല്‍ സമര്‍പ്പിക്കണം, അല്ലെങ്കില്‍ ക്ളിയര്‍ എന്ന ചെക്ബോക്സ് ടിക് ചെയ്യണം. ദയവായി രണ്ടും " -"കൂടി ചെയ്യരുത്." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"ശരിയായ ചിത്രം അപ് ലോഡ് ചെയ്യുക. നിങ്ങള്‍ നല്കിയ ഫയല്‍ ഒന്നുകില്‍ ഒരു ചിത്രമല്ല, അല്ലെങ്കില്‍ " -"വികലമാണ്." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "യോഗ്യമായത് തെരഞ്ഞെടുക്കുക. %(value)s ലഭ്യമായവയില്‍ ഉള്‍പ്പെടുന്നില്ല." - -msgid "Enter a list of values." -msgstr "മൂല്യങ്ങളുടെ പട്ടിക(ലിസ്റ്റ്) നല്കുക." - -msgid "Enter a complete value." -msgstr "പൂർണ്ണമായ വാല്യൂ നല്കുക." - -msgid "Enter a valid UUID." -msgstr "സാധുവായ യു യു ഐ ഡി നല്കുക." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(ഹിഡൻ ഫീൽഡ് %(name)s)%(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ക്രമം" - -msgid "Delete" -msgstr "ഡിലീറ്റ്" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s-നായി നല്കുന്ന വിവരം ആവര്‍ത്തിച്ചത് ദയവായി തിരുത്തുക." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "%(field)s-നായി നല്കുന്ന വിവരം ആവര്‍ത്തിക്കാന്‍ പാടില്ല. ദയവായി തിരുത്തുക." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(date_field)s ലെ %(lookup)s നു വേണ്ടി %(field_name)s നു നല്കുന്ന വിവരം ആവര്‍ത്തിക്കാന്‍ " -"പാടില്ല. ദയവായി തിരുത്തുക." - -msgid "Please correct the duplicate values below." -msgstr "താഴെ കൊടുത്തവയില്‍ ആവര്‍ത്തനം ഒഴിവാക്കുക." - -msgid "The inline value did not match the parent instance." -msgstr "ഇൻലൈൻ വാല്യൂ, പാരെന്റ് ഇൻസ്റ്റൻസുമായി ചേരുന്നില്ല." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "യോഗ്യമായത് തെരഞ്ഞെടുക്കുക. നിങ്ങള്‍ നല്കിയത് ലഭ്യമായവയില്‍ ഉള്‍പ്പെടുന്നില്ല." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "കാലിയാക്കുക" - -msgid "Currently" -msgstr "നിലവിലുള്ളത്" - -msgid "Change" -msgstr "മാറ്റുക" - -msgid "Unknown" -msgstr "അജ്ഞാതം" - -msgid "Yes" -msgstr "അതെ" - -msgid "No" -msgstr "അല്ല" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ഉണ്ട്,ഇല്ല,ഉണ്ടായേക്കാം" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ബൈറ്റ്" -msgstr[1] "%(size)d ബൈറ്റുകള്‍" - -#, python-format -msgid "%s KB" -msgstr "%s കെ.ബി" - -#, python-format -msgid "%s MB" -msgstr "%s എം.ബി" - -#, python-format -msgid "%s GB" -msgstr "%s ജി.ബി" - -#, python-format -msgid "%s TB" -msgstr "%s ടി.ബി" - -#, python-format -msgid "%s PB" -msgstr "%s പി.ബി" - -msgid "p.m." -msgstr "പി. എം (ഉച്ചയ്ക്കു ശേഷം) " - -msgid "a.m." -msgstr "എ. എം (ഉച്ചയ്ക്കു മുമ്പ്)" - -msgid "PM" -msgstr "പി. എം (ഉച്ചയ്ക്കു ശേഷം) " - -msgid "AM" -msgstr "എ. എം (ഉച്ചയ്ക്കു മുമ്പ്)" - -msgid "midnight" -msgstr "അര്‍ധരാത്രി" - -msgid "noon" -msgstr "ഉച്ച" - -msgid "Monday" -msgstr "തിങ്കളാഴ്ച" - -msgid "Tuesday" -msgstr "ചൊവ്വാഴ്ച" - -msgid "Wednesday" -msgstr "ബുധനാഴ്ച" - -msgid "Thursday" -msgstr "വ്യാഴാഴ്ച" - -msgid "Friday" -msgstr "വെള്ളിയാഴ്ച" - -msgid "Saturday" -msgstr "ശനിയാഴ്ച" - -msgid "Sunday" -msgstr "ഞായറാഴ്ച" - -msgid "Mon" -msgstr "തിങ്കള്‍" - -msgid "Tue" -msgstr "ചൊവ്വ" - -msgid "Wed" -msgstr "ബുധന്‍" - -msgid "Thu" -msgstr "വ്യാഴം" - -msgid "Fri" -msgstr "വെള്ളി" - -msgid "Sat" -msgstr "ശനി" - -msgid "Sun" -msgstr "ഞായര്‍" - -msgid "January" -msgstr "ജനുവരി" - -msgid "February" -msgstr "ഫെബ്രുവരി" - -msgid "March" -msgstr "മാര്‍ച്ച്" - -msgid "April" -msgstr "ഏപ്രില്‍" - -msgid "May" -msgstr "മേയ്" - -msgid "June" -msgstr "ജൂണ്‍" - -msgid "July" -msgstr "ജൂലൈ" - -msgid "August" -msgstr "ആഗസ്ത്" - -msgid "September" -msgstr "സെപ്തംബര്‍" - -msgid "October" -msgstr "ഒക്ടോബര്‍" - -msgid "November" -msgstr "നവംബര്‍" - -msgid "December" -msgstr "ഡിസംബര്‍" - -msgid "jan" -msgstr "ജനു." - -msgid "feb" -msgstr "ഫെബ്രു." - -msgid "mar" -msgstr "മാര്‍ച്ച്" - -msgid "apr" -msgstr "ഏപ്രില്‍" - -msgid "may" -msgstr "മേയ്" - -msgid "jun" -msgstr "ജൂണ്‍" - -msgid "jul" -msgstr "ജൂലൈ" - -msgid "aug" -msgstr "ആഗസ്ത്" - -msgid "sep" -msgstr "സെപ്ടം." - -msgid "oct" -msgstr "ഒക്ടോ." - -msgid "nov" -msgstr "നവം." - -msgid "dec" -msgstr "ഡിസം." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "ജനു." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ഫെബ്രു." - -msgctxt "abbrev. month" -msgid "March" -msgstr "മാര്‍ച്ച്" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ഏപ്രില്‍" - -msgctxt "abbrev. month" -msgid "May" -msgstr "മേയ്" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ജൂണ്‍" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ജൂലൈ" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ആഗ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "സെപ്തം." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ഒക്ടോ." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "നവം." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ഡിസം." - -msgctxt "alt. month" -msgid "January" -msgstr "ജനുവരി" - -msgctxt "alt. month" -msgid "February" -msgstr "ഫെബ്രുവരി" - -msgctxt "alt. month" -msgid "March" -msgstr "മാര്‍ച്ച്" - -msgctxt "alt. month" -msgid "April" -msgstr "ഏപ്രില്‍" - -msgctxt "alt. month" -msgid "May" -msgstr "മേയ്" - -msgctxt "alt. month" -msgid "June" -msgstr "ജൂണ്‍" - -msgctxt "alt. month" -msgid "July" -msgstr "ജൂലൈ" - -msgctxt "alt. month" -msgid "August" -msgstr "ആഗസ്ത്" - -msgctxt "alt. month" -msgid "September" -msgstr "സെപ്തംബര്‍" - -msgctxt "alt. month" -msgid "October" -msgstr "ഒക്ടോബര്‍" - -msgctxt "alt. month" -msgid "November" -msgstr "നവംബര്‍" - -msgctxt "alt. month" -msgid "December" -msgstr "ഡിസംബര്‍" - -msgid "This is not a valid IPv6 address." -msgstr "ഇതു സാധുവായ IPv6 വിലാസമല്ല." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "അഥവാ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "വിലക്കപ്പെട്ടത്" - -msgid "CSRF verification failed. Request aborted." -msgstr "സി എസ് ആർ എഫ് പരിശോധന പരാജയപ്പെട്ടു. റിക്വെസ്റ്റ് റദ്ദാക്കി." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"ഫോം സമർപ്പിക്കുമ്പോൾ ഒരു CSRF കുക്കി ഈ സൈറ്റിൽ ആവശ്യമാണ് എന്നതിനാലാണ് നിങ്ങൾ ഈ സന്ദേശം " -"കാണുന്നത്. മറ്റുള്ളവരാരെങ്കിലും നിങ്ങളുടെ ബ്രൗസറിനെ നിയന്ത്രിക്കുന്നില്ല എന്ന് ഉറപ്പുവരുത്താനായി ഈ " -"കുക്കി ആവശ്യമാണ്. " - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Debug=True എന്നു കൊടുത്താൽ കൂടുതൽ കാര്യങ്ങൾ അറിയാൻ കഴിയും." - -msgid "No year specified" -msgstr "വര്‍ഷം പരാമര്‍ശിച്ചിട്ടില്ല" - -msgid "Date out of range" -msgstr "ഡാറ്റ പരിധിയുടെ പുറത്താണ്" - -msgid "No month specified" -msgstr "മാസം പരാമര്‍ശിച്ചിട്ടില്ല" - -msgid "No day specified" -msgstr "ദിവസം പരാമര്‍ശിച്ചിട്ടില്ല" - -msgid "No week specified" -msgstr "ആഴ്ച പരാമര്‍ശിച്ചിട്ടില്ല" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s ഒന്നും ലഭ്യമല്ല" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(class_name)s.allow_future ന് False എന്നു നല്കിയിട്ടുള്ളതിനാല്‍ Future " -"%(verbose_name_plural)s ഒന്നും ലഭ്യമല്ല." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "ചോദ്യത്തിനു ചേരുന്ന് %(verbose_name)s ഇല്ല" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "ഡയറക്ടറി സൂചികകള്‍ ഇവിടെ അനുവദനീയമല്ല." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s യുടെ സൂചിക" - -msgid "The install worked successfully! Congratulations!" -msgstr "ഇൻസ്ടാൾ ഭംഗിയായി നടന്നു! അഭിനന്ദനങ്ങൾ !" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "ജാംഗോ ഡോക്യുമെന്റേഷൻ" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "പരിശീലനം: ഒരു പോളിങ്ങ് ആപ്പ്" - -msgid "Get started with Django" -msgstr "ജാംഗോയുമായി പരിചയത്തിലാവുക" - -msgid "Django Community" -msgstr "ജാംഗോ കമ്യൂണിറ്റി" - -msgid "Connect, get help, or contribute" -msgstr "കൂട്ടുകൂടൂ, സഹായം തേടൂ, അല്ലെങ്കിൽ സഹകരിക്കൂ" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ml/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ml/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ml/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ml/formats.py deleted file mode 100644 index b1ca2ee..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ml/formats.py +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "N j, Y" -TIME_FORMAT = "P" -DATETIME_FORMAT = "N j, Y, P" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "F j" -SHORT_DATE_FORMAT = "m/d/Y" -SHORT_DATETIME_FORMAT = "m/d/Y P" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' - # "%b %d %Y", # 'Oct 25 2006' - # "%b %d, %Y", # 'Oct 25, 2006' - # "%d %b %Y", # '25 Oct 2006' - # "%d %b, %Y", # '25 Oct, 2006' - # "%B %d %Y", # 'October 25 2006' - # "%B %d, %Y", # 'October 25, 2006' - # "%d %B %Y", # '25 October 2006' - # "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index c35a525..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 47479f8..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1345 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ankhbayar , 2013 -# Bayarkhuu Bataa, 2014,2017-2018 -# Baskhuu Lodoikhuu , 2011 -# Jannis Leidel , 2011 -# jargalan , 2011 -# Tsolmon , 2011 -# Turmunkh Batkhuyag, 2023 -# Zorig, 2013-2014,2016,2018 -# Zorig, 2019 -# Анхбаяр Анхаа , 2013-2016,2018-2019 -# Баясгалан Цэвлээ , 2011,2015,2017 -# Ганзориг БП , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-25 06:49+0000\n" -"Last-Translator: Turmunkh Batkhuyag, 2023\n" -"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Африк" - -msgid "Arabic" -msgstr "Араб" - -msgid "Algerian Arabic" -msgstr "Алжир Араб" - -msgid "Asturian" -msgstr "Астури" - -msgid "Azerbaijani" -msgstr "Азербажан" - -msgid "Bulgarian" -msgstr "Болгар" - -msgid "Belarusian" -msgstr "Беларус" - -msgid "Bengali" -msgstr "Бенгал" - -msgid "Breton" -msgstr "Бэрэйтон " - -msgid "Bosnian" -msgstr "Босни" - -msgid "Catalan" -msgstr "Каталан" - -msgid "Central Kurdish (Sorani)" -msgstr "Төв Курд (Сорани)" - -msgid "Czech" -msgstr "Чех" - -msgid "Welsh" -msgstr "Уэльс" - -msgid "Danish" -msgstr "Дани" - -msgid "German" -msgstr "Герман" - -msgid "Lower Sorbian" -msgstr "Доод Сорбин" - -msgid "Greek" -msgstr "Грек" - -msgid "English" -msgstr "Англи" - -msgid "Australian English" -msgstr "Австрали Англи" - -msgid "British English" -msgstr "Британи Англи" - -msgid "Esperanto" -msgstr "Эсперанто" - -msgid "Spanish" -msgstr "Испани" - -msgid "Argentinian Spanish" -msgstr "Аргентинийн Испани" - -msgid "Colombian Spanish" -msgstr "Колумбийн Испаниар" - -msgid "Mexican Spanish" -msgstr "Мексикийн Испани" - -msgid "Nicaraguan Spanish" -msgstr "Никрагуан Испани" - -msgid "Venezuelan Spanish" -msgstr "Венесуэлийн Спани" - -msgid "Estonian" -msgstr "Эстони" - -msgid "Basque" -msgstr "Баск" - -msgid "Persian" -msgstr "Перс" - -msgid "Finnish" -msgstr "Финлянд" - -msgid "French" -msgstr "Франц" - -msgid "Frisian" -msgstr "Фриз" - -msgid "Irish" -msgstr "Ирланд" - -msgid "Scottish Gaelic" -msgstr "Шотландийн Гаелик" - -msgid "Galician" -msgstr "Галици" - -msgid "Hebrew" -msgstr "Еврэй" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Хорват" - -msgid "Upper Sorbian" -msgstr "Дээд Сорбин" - -msgid "Hungarian" -msgstr "Унгар" - -msgid "Armenian" -msgstr "Армен" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Индонези" - -msgid "Igbo" -msgstr "Игбо" - -msgid "Ido" -msgstr "Идо" - -msgid "Icelandic" -msgstr "Исланд" - -msgid "Italian" -msgstr "Итали" - -msgid "Japanese" -msgstr "Япон" - -msgid "Georgian" -msgstr "Гүрж" - -msgid "Kabyle" -msgstr "Кабилэ" - -msgid "Kazakh" -msgstr "Казак" - -msgid "Khmer" -msgstr "Кхмер" - -msgid "Kannada" -msgstr "Канад" - -msgid "Korean" -msgstr "Солонгос" - -msgid "Kyrgyz" -msgstr "Киргиз" - -msgid "Luxembourgish" -msgstr "Лүксенбүргиш" - -msgid "Lithuanian" -msgstr "Литва" - -msgid "Latvian" -msgstr "Латви" - -msgid "Macedonian" -msgstr "Македон" - -msgid "Malayalam" -msgstr "Малайз" - -msgid "Mongolian" -msgstr "Монгол" - -msgid "Marathi" -msgstr "маратхи" - -msgid "Malay" -msgstr "Малай" - -msgid "Burmese" -msgstr "Бирм" - -msgid "Norwegian Bokmål" -msgstr "Норвеги Бокмал" - -msgid "Nepali" -msgstr "Непал" - -msgid "Dutch" -msgstr "Голланд" - -msgid "Norwegian Nynorsk" -msgstr "Норвегийн нюнорск" - -msgid "Ossetic" -msgstr "Оссетик" - -msgid "Punjabi" -msgstr "Панжаби" - -msgid "Polish" -msgstr "Польш" - -msgid "Portuguese" -msgstr "Португал" - -msgid "Brazilian Portuguese" -msgstr "Бразилийн Португали" - -msgid "Romanian" -msgstr "Румын" - -msgid "Russian" -msgstr "Орос" - -msgid "Slovak" -msgstr "Словак" - -msgid "Slovenian" -msgstr "Словен" - -msgid "Albanian" -msgstr "Альбани" - -msgid "Serbian" -msgstr "Серби" - -msgid "Serbian Latin" -msgstr "Серби латин" - -msgid "Swedish" -msgstr "Щвед" - -msgid "Swahili" -msgstr "Савахил" - -msgid "Tamil" -msgstr "Тамил" - -msgid "Telugu" -msgstr "Тэлүгү" - -msgid "Tajik" -msgstr "Тажик" - -msgid "Thai" -msgstr "Тайланд" - -msgid "Turkmen" -msgstr "Турк хүн" - -msgid "Turkish" -msgstr "Турк" - -msgid "Tatar" -msgstr "Татар" - -msgid "Udmurt" -msgstr "Удмурт" - -msgid "Uyghur" -msgstr "Уйгур" - -msgid "Ukrainian" -msgstr "Украйн" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "Узбек" - -msgid "Vietnamese" -msgstr "Вьетнам" - -msgid "Simplified Chinese" -msgstr "Хятад (хялбаршуулсан) " - -msgid "Traditional Chinese" -msgstr "Хятад (уламжлалт)" - -msgid "Messages" -msgstr "Мэдээллүүд" - -msgid "Site Maps" -msgstr "Сайтын бүтэц" - -msgid "Static Files" -msgstr "Статик файлууд" - -msgid "Syndication" -msgstr "Нэгтгэл" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Хуудасны дугаар бүхэл тоо / Integer / биш байна" - -msgid "That page number is less than 1" -msgstr "Хуудасны дугаар 1-ээс байга байна" - -msgid "That page contains no results" -msgstr "Хуудас үр дүн агуулаагүй байна" - -msgid "Enter a valid value." -msgstr "Зөв утга оруулна уу." - -msgid "Enter a valid URL." -msgstr "Зөв, хүчинтэй хаяг (URL) оруулна уу." - -msgid "Enter a valid integer." -msgstr "Бүхэл тоо оруулна уу" - -msgid "Enter a valid email address." -msgstr "Зөв имэйл хаяг оруулна уу" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Үсэг, тоо, доогуур зураас эсвэл зурааснаас бүрдсэн хүчинтэй \"slug\" оруулна " -"уу." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Юникод үсэг, тоо, доогуур зураас, зурааснаас бүрдсэн хүчинтэй \"slug\" " -"оруулна уу." - -msgid "Enter a valid IPv4 address." -msgstr "Зөв IPv4 хаяг оруулна уу. " - -msgid "Enter a valid IPv6 address." -msgstr "Зөв IPv6 хаяг оруулна уу." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Зөв IPv4 эсвэл IPv6 хаяг оруулна уу." - -msgid "Enter only digits separated by commas." -msgstr "Зөвхөн таслалаар тусгаарлагдсан цифр оруулна уу." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Энэ утга хамгийн ихдээ %(limit_value)s байх ёстой. (одоо %(show_value)s " -"байна)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Энэ утга %(limit_value)s -с бага эсвэл тэнцүү байх ёстой." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Энэ утга %(limit_value)s -с их эсвэл тэнцүү байх нөхцлийг хангана уу." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Утга нь алхамын хэмжээнд %(limit_value)s-ээс олон байхыг " -"баталгаажуулна уу." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Энэ утга нь алхмын хэмжээнд %(limit_value)s, %(offset)s-с эхлэн %(offset)s, " -"%(valid_value1)s, %(valid_value2)s гэх мэт утга байхыг баталгаажуулна уу." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Хамгийн ихдээ %(limit_value)d тэмдэгт байх нөхцлийг хангана уу. " -"(%(show_value)d-ийн дагуу)" -msgstr[1] "" -"Хамгийн ихдээ %(limit_value)d тэмдэгт байх нөхцлийг хангана уу. " -"(%(show_value)d-ийн дагуу)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[1] "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Тоон утга оруулна уу." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "%(max)s -ээс ихгүй утга оруулна уу " -msgstr[1] "%(max)s -ээс ихгүй утга оруулна уу " - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Энд %(max)s -аас олонгүй бутархайн орон байх ёстой. " -msgstr[1] "Энд %(max)s -аас олонгүй бутархайн орон байх ёстой. " - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Энд бутархайн таслалаас өмнө %(max)s-аас олонгүй цифр байх ёстой." -msgstr[1] "Энд бутархайн таслалаас өмнө %(max)s-аас олонгүй цифр байх ёстой." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Файлын өргөтгөл “%(extension)s” зөвшөөрөгдөөгүй байна. Боломжит өргөтгөлүүд: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Хоосон тэмдэгт зөвшөөрөгдөхгүй." - -msgid "and" -msgstr "ба" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s талбар бүхий %(model_name)s аль хэдийн орсон байна." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "“%(name)s” хязгаарлалтыг зөрчсөн." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r буруу сонголт байна." - -msgid "This field cannot be null." -msgstr "Энэ хэсгийг хоосон орхиж болохгүй." - -msgid "This field cannot be blank." -msgstr "Энэ хэсэг хоосон байж болохгүй." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s-тэй %(model_name)s-ийг аль хэдийнэ оруулсан байна." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s талбарт давхардахгүй байх хэрэгтэй %(date_field_label)s " -"%(lookup_type)s оруулна." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Талбарийн төрөл нь : %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "\"“%(value)s” утга True эсвэл False байх ёстой.\"" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” утга True, False, эсвэл None байх ёстой." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Үнэн худлын аль нэг нь)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Бичвэр (%(max_length)s хүртэл)" - -msgid "String (unlimited)" -msgstr "Тэмдэг мөр (хязгааргүй)" - -msgid "Comma-separated integers" -msgstr "Таслалаар тусгаарлагдсан бүхэл тоо" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” утга нь буруу огнооны форматтай байна. Энэ нь YYYY-MM-DD " -"форматтай байх ёстой." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” утга зөв (YYYY-MM-DD) форматтай байна, гэхдээ буруу огноо байна." - -msgid "Date (without time)" -msgstr "Огноо (цаггүй)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” утга буруу форматтай байна. Энэ нь YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ] форматтай байх ёстой." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” утгын формат зөв байна (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"гэхдээ буруу огноо/цаг байна." - -msgid "Date (with time)" -msgstr "Огноо (цагтай)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” утга нь бодит тоо байх ёстой." - -msgid "Decimal number" -msgstr "Аравтын бутархайт тоо" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” утга буруу форматтай байна. Энэ нь [DD] [[HH:]MM:]ss[.uuuuuu] " -"форматтай байх ёстой." - -msgid "Duration" -msgstr "Үргэлжлэх хугацаа" - -msgid "Email address" -msgstr "Имэйл хаяг" - -msgid "File path" -msgstr "Файлын зам " - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” бутархай тоон утга байх ёстой." - -msgid "Floating point number" -msgstr "Хөвөгч таслалтай тоо" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” утга нь бүхэл тоо байх ёстой." - -msgid "Integer" -msgstr "Бүхэл тоо" - -msgid "Big (8 byte) integer" -msgstr "Том (8 байт) бүхэл тоо" - -msgid "Small integer" -msgstr "Бага тоон утна" - -msgid "IPv4 address" -msgstr "IPv4 хаяг" - -msgid "IP address" -msgstr "IP хаяг" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"“%(value)s” утга нь None, True эсвэл False байх ёстой.\"" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Үнэн, худал, эсвэл юу ч биш)" - -msgid "Positive big integer" -msgstr "Эерэг том бүхэл тоо" - -msgid "Positive integer" -msgstr "Бүхэл тоох утга" - -msgid "Positive small integer" -msgstr "Бага бүхэл тоон утга" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слаг (ихдээ %(max_length)s )" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” утга буруу форматтай байна. Энэ нь HH:MM[:ss[.uuuuuu]] форматтай " -"байх ёстой." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” утга зөв форматтай байна (HH:MM[:ss[.uuuuuu]]) гэхдээ буруу цаг " -"байна." - -msgid "Time" -msgstr "Цаг" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Бинари өгөгдөл" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” нь хүчинтэй UUID биш." - -msgid "Universally unique identifier" -msgstr "UUID" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Зураг" - -msgid "A JSON object" -msgstr "JSON объект " - -msgid "Value must be valid JSON." -msgstr "JSON утга байх боломжтой." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s %(value)r утгатай %(model)s байхгүй байна." - -msgid "Foreign Key (type determined by related field)" -msgstr "Гадаад түлхүүр (тодорхой төрлийн холбоос талбар)" - -msgid "One-to-one relationship" -msgstr "Нэг-нэг холбоос" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s холбоос" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s холбоосууд" - -msgid "Many-to-many relationship" -msgstr "Олон-олон холбоос" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Энэ талбарыг бөглөх шаардлагатай." - -msgid "Enter a whole number." -msgstr "Бүхэл тоон утга оруулна уу." - -msgid "Enter a valid date." -msgstr "Зөв огноо оруулна уу." - -msgid "Enter a valid time." -msgstr "Зөв цаг оруулна уу." - -msgid "Enter a valid date/time." -msgstr "Огноо/цаг-ыг зөв оруулна уу." - -msgid "Enter a valid duration." -msgstr "Үргэлжилэх хугацааг зөв оруулна уу." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Өдөрийн утга {min_days} ээс {max_days} ийн хооронд байх ёстой." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Файл оруулаагүй байна. Маягтаас кодлох төрлийг чагтал. " - -msgid "No file was submitted." -msgstr "Файл оруулаагүй байна." - -msgid "The submitted file is empty." -msgstr "Оруулсан файл хоосон байна. " - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[1] "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Нэг бол сонголтын чягтыг авах эсвэл файл оруулна уу. Зэрэг хэрэгжих " -"боломжгүй." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Зөв зураг оруулна уу. Таны оруулсан файл нэг бол зургийн файл биш эсвэл " -"гэмтсэн зураг байна." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Зөв сонголт хийнэ үү. %(value)s гэсэн сонголт байхгүй байна." - -msgid "Enter a list of values." -msgstr "Өгөгдхүүний жагсаалтаа оруулна уу." - -msgid "Enter a complete value." -msgstr "Бүрэн утга оруулна уу." - -msgid "Enter a valid UUID." -msgstr "Зөв UUID оруулна уу." - -msgid "Enter a valid JSON." -msgstr "JSON-ийн бүтцээр оруулна уу." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Нууц талбар%(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-ын өгөгдөл дутуу эсвэл өөрчилсөн байна. Дутуу талбарууд: " -"%(field_names)s. Хэрэв асуудал хэвээр байвал та алдааны тайлан гаргах " -"шаардлагатай байж магадгүй." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Та хамгийн ихдээ %(num)d форм илгээнэ үү." -msgstr[1] "Та хамгийн ихдээ %(num)d форм илгээнэ үү." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Та хамгийн багадаа %(num)d форм илгээнэ үү." -msgstr[1] "Та хамгийн багадаа %(num)d форм илгээнэ үү." - -msgid "Order" -msgstr "Эрэмбэлэх" - -msgid "Delete" -msgstr "Устгах" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s хэсэг дэх давхардсан утгыг засварлана уу. " - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s хэсэг дэх давхардсан утгыг засварлана уу. Түүний утгууд " -"давхардахгүй байх ёстой." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s хэсэг дэх давхардсан утгыг засварлана уу. %(date_field)s-н " -"%(lookup)s хувьд давхардахгүй байх ёстой." - -msgid "Please correct the duplicate values below." -msgstr "Доорх давхардсан утгуудыг засна уу." - -msgid "The inline value did not match the parent instance." -msgstr "Inline утга эцэг обекттой таарахгүй байна." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Зөв сонголт хийнэ үү. Энэ утга сонголтонд алга." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” нь шаардлага хангаагүй утга байна." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s нь %(current_timezone)s цагийн бүсэд хөрвүүлэх боломжгүй байна; " -"энэ нь хоёрдмол утгатай эсвэл байхгүй байж болно." - -msgid "Clear" -msgstr "Цэвэрлэх" - -msgid "Currently" -msgstr "Одоогийн" - -msgid "Change" -msgstr "Засах" - -msgid "Unknown" -msgstr "Тодорхойгүй" - -msgid "Yes" -msgstr "Тийм" - -msgid "No" -msgstr "Үгүй" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "тийм,үгүй,магадгүй" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байт" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "шөнө дунд" - -msgid "noon" -msgstr "үд дунд" - -msgid "Monday" -msgstr "Даваа гариг" - -msgid "Tuesday" -msgstr "Мягмар гариг" - -msgid "Wednesday" -msgstr "Лхагва гариг" - -msgid "Thursday" -msgstr "Пүрэв гариг" - -msgid "Friday" -msgstr "Баасан гариг" - -msgid "Saturday" -msgstr "Бямба гариг" - -msgid "Sunday" -msgstr "Ням гариг" - -msgid "Mon" -msgstr "Дав" - -msgid "Tue" -msgstr "Мяг" - -msgid "Wed" -msgstr "Лха" - -msgid "Thu" -msgstr "Пүр" - -msgid "Fri" -msgstr "Баа" - -msgid "Sat" -msgstr "Бям" - -msgid "Sun" -msgstr "Ням" - -msgid "January" -msgstr "1-р сар" - -msgid "February" -msgstr "2-р сар" - -msgid "March" -msgstr "3-р сар" - -msgid "April" -msgstr "4-р сар" - -msgid "May" -msgstr "5-р сар" - -msgid "June" -msgstr "6-р сар" - -msgid "July" -msgstr "7-р сар" - -msgid "August" -msgstr "8-р сар" - -msgid "September" -msgstr "9-р сар" - -msgid "October" -msgstr "10-р сар" - -msgid "November" -msgstr "11-р сар" - -msgid "December" -msgstr "12-р сар" - -msgid "jan" -msgstr "1-р сар" - -msgid "feb" -msgstr "2-р сар" - -msgid "mar" -msgstr "3-р сар" - -msgid "apr" -msgstr "4-р сар" - -msgid "may" -msgstr "5-р сар" - -msgid "jun" -msgstr "6-р сар" - -msgid "jul" -msgstr "7-р сар" - -msgid "aug" -msgstr "8-р сар " - -msgid "sep" -msgstr "9-р сар" - -msgid "oct" -msgstr "10-р сар" - -msgid "nov" -msgstr "11-р сар" - -msgid "dec" -msgstr "12-р сар" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "1-р сар." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "2-р сар." - -msgctxt "abbrev. month" -msgid "March" -msgstr "3-р сар." - -msgctxt "abbrev. month" -msgid "April" -msgstr "4-р сар." - -msgctxt "abbrev. month" -msgid "May" -msgstr "5-р сар." - -msgctxt "abbrev. month" -msgid "June" -msgstr "6-р сар." - -msgctxt "abbrev. month" -msgid "July" -msgstr "7-р сар." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "8-р сар." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "9-р сар." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "10-р сар." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "11-р сар." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "12-р сар." - -msgctxt "alt. month" -msgid "January" -msgstr "Хулгана" - -msgctxt "alt. month" -msgid "February" -msgstr "Үхэр" - -msgctxt "alt. month" -msgid "March" -msgstr "Бар" - -msgctxt "alt. month" -msgid "April" -msgstr "Туулай" - -msgctxt "alt. month" -msgid "May" -msgstr "Луу" - -msgctxt "alt. month" -msgid "June" -msgstr "Могой" - -msgctxt "alt. month" -msgid "July" -msgstr "Морь" - -msgctxt "alt. month" -msgid "August" -msgstr "Хонь" - -msgctxt "alt. month" -msgid "September" -msgstr "Бич" - -msgctxt "alt. month" -msgid "October" -msgstr "Тахиа" - -msgctxt "alt. month" -msgid "November" -msgstr "Нохой" - -msgctxt "alt. month" -msgid "December" -msgstr "Гахай" - -msgid "This is not a valid IPv6 address." -msgstr "Энэ буруу IPv6 хаяг байна." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "буюу" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d жил" -msgstr[1] "%(num)d жил" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d сар" -msgstr[1] "%(num)d сар" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d долоо хоног" -msgstr[1] "%(num)d долоо хоног" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d өдөр" -msgstr[1] "%(num)d өдөр" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d цаг" -msgstr[1] "%(num)d цаг" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минут" -msgstr[1] "%(num)d минут" - -msgid "Forbidden" -msgstr "Хориотой" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF дээр уналаа. Хүсэлт таслагдсан." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Та энэ мэдэгдлийг харж байгаа нь таны веб хөтөчөөс 'Referer header'-ийг " -"HTTPS хуудасд илгээх шаардлагатай байгаатай холбоотой. Энэ нь гуравдагч " -"этгээдээс хамгаалахын тулд шаардлагатай." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Хэрвээ та веб хөтөчөө 'Referer' толгойг идэвхигүй болгосон бол энэ хуудас, " -"HTTPS холболт эсвэл 'same-origin' хүсэлтэнд зориулж идэвхижүүлнэ үү." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Хэрвээ та таг ашиглаж " -"байгаа бол эсвэл 'Referrer-Policy: no-referrer' толгойг нэмсэн бол, " -"эдгээрийг устгана уу. CSRF хамгаалалт 'Referer' толгойг чанд шалгалт хийхийг " -"шаарддаг. Хэрвээ та аюулгүй байдлыг чухалчилж байгаа бол гуравдагч сайтыг " -"холбохдоо ашиглана уу." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Энэ хуудсанд форм илгээхийн тулд CSRF күүки шаардлагатай учир Та энэ " -"мэдэгдлийг харж байна. Энэ күүки нь гуравдагч этгээдээс хамгаалахын тулд " -"шаардлагатай." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Хэрвээ та веб хөтөчийн \"cookies\"-г хаасан бол энэ хуудас эсвэл 'same-" -"origin' хүсэлтэнд зориулж идэвхижүүлнэ үү." - -msgid "More information is available with DEBUG=True." -msgstr "DEBUG=True үед дэлгэрэнгүй мэдээлэл харах боломжтой." - -msgid "No year specified" -msgstr "Он тодорхойлоогүй байна" - -msgid "Date out of range" -msgstr "Хугацааны хязгаар хэтэрсэн байна" - -msgid "No month specified" -msgstr "Сар тодорхойлоогүй байна" - -msgid "No day specified" -msgstr "Өдөр тодорхойлоогүй байна" - -msgid "No week specified" -msgstr "Долоо хоног тодорхойлоогүй байна" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s боломжгүй" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(class_name)s.allow_future нь худлаа учраас %(verbose_name_plural)s нь " -"боломжгүй." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Буруу огноо. '%(datestr)s' огноо '%(format)s' хэлбэрт тохирохгүй байна." - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Шүүлтүүрт таарах %(verbose_name)s олдсонгүй " - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Хуудас \"сүүлчийн\" биш бөгөөд үүнийг int болгон хувиргах боломжгүй." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Буруу хуудас (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Хоосон жагсаалт ба “%(class_name)s.allow_empty” нь False байна." - -msgid "Directory indexes are not allowed here." -msgstr "Файлын жагсаалтыг энд зөвшөөрөөгүй." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” хуудас байхгүй байна." - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s ийн жагсаалт" - -msgid "The install worked successfully! Congratulations!" -msgstr "Амжилттай суулгалаа! Баяр хүргэе!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Джанго %(version)s хувирбарын тэмдэглэл харах " - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Таний тохиргооны файл дээр DEBUG=TRUE гэж тохируулсан мөн URLs дээр тохиргоо " -"хийгээгүй учраас энэ хуудасыг харж байна." - -msgid "Django Documentation" -msgstr "Джанго баримтжуулалт" - -msgid "Topics, references, & how-to’s" -msgstr "Сэдэв, лавлахууд болон зааврууд" - -msgid "Tutorial: A Polling App" -msgstr "Хичээл: Санал асуулга App" - -msgid "Get started with Django" -msgstr "Джанготой ажиллаж эхлэх" - -msgid "Django Community" -msgstr "Django Бүлгэм" - -msgid "Connect, get help, or contribute" -msgstr "Холбогдох, тусламж авах эсвэл хувь нэмрээ оруулах" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/mn/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/mn/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/mn/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/mn/formats.py deleted file mode 100644 index 589c24c..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/mn/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -# MONTH_DAY_FORMAT = -SHORT_DATE_FORMAT = "j M Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -# DECIMAL_SEPARATOR = -# THOUSAND_SEPARATOR = -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/mr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index 8cf9a70..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/mr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index fe4c6eb..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1280 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Omkar Parab, 2024 -# Suraj Kawade, 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-01-20 06:49+0000\n" -"Last-Translator: Omkar Parab, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "अफ्रिकान्स" - -msgid "Arabic" -msgstr "अरेबिक" - -msgid "Algerian Arabic" -msgstr "अल्जेरियन अरेबिक" - -msgid "Asturian" -msgstr "अस्टूरियन" - -msgid "Azerbaijani" -msgstr "अझरबैजानी" - -msgid "Bulgarian" -msgstr "बल्गेरियन" - -msgid "Belarusian" -msgstr "बेलारशियन" - -msgid "Bengali" -msgstr "बंगाली" - -msgid "Breton" -msgstr "ब्रेटन" - -msgid "Bosnian" -msgstr "बोस्नियन" - -msgid "Catalan" -msgstr "कॅटलान" - -msgid "Central Kurdish (Sorani)" -msgstr "मध्य कुर्दिश (सोरानी)" - -msgid "Czech" -msgstr "झेक" - -msgid "Welsh" -msgstr "वेल्श" - -msgid "Danish" -msgstr "डॅनिश" - -msgid "German" -msgstr "जर्मन" - -msgid "Lower Sorbian" -msgstr "लोअर सोर्बियन" - -msgid "Greek" -msgstr "ग्रीक" - -msgid "English" -msgstr "इंग्रजी" - -msgid "Australian English" -msgstr "ऑस्ट्रेलियन इंग्रजी" - -msgid "British English" -msgstr "ब्रिटिश इंग्रजी" - -msgid "Esperanto" -msgstr "एस्पेरॅन्टो" - -msgid "Spanish" -msgstr "स्पॅनिश " - -msgid "Argentinian Spanish" -msgstr "अर्जेन्टिनाची स्पॅनिश" - -msgid "Colombian Spanish" -msgstr "कोलंबियन स्पॅनिश" - -msgid "Mexican Spanish" -msgstr "मेक्सिकन स्पॅनिश" - -msgid "Nicaraguan Spanish" -msgstr "निकारागुआन स्पॅनिश" - -msgid "Venezuelan Spanish" -msgstr "व्हेनेझुएलन स्पॅनिश" - -msgid "Estonian" -msgstr "एस्टोनियन" - -msgid "Basque" -msgstr "बास्क" - -msgid "Persian" -msgstr "पर्शियन" - -msgid "Finnish" -msgstr "फिनिश" - -msgid "French" -msgstr "फ्रेंच" - -msgid "Frisian" -msgstr "फ्रिसियन" - -msgid "Irish" -msgstr "आयरिश" - -msgid "Scottish Gaelic" -msgstr "स्कॉटिश गेलिक" - -msgid "Galician" -msgstr "गॅलिशियन" - -msgid "Hebrew" -msgstr "हिब्रू" - -msgid "Hindi" -msgstr "हिंदी" - -msgid "Croatian" -msgstr "क्रोएशियन" - -msgid "Upper Sorbian" -msgstr "अप्पर सोर्बियन" - -msgid "Hungarian" -msgstr "हंगेरियन" - -msgid "Armenian" -msgstr "अर्मेनियन" - -msgid "Interlingua" -msgstr "इंटरलिंगुआ" - -msgid "Indonesian" -msgstr "इंडोनेशियन" - -msgid "Igbo" -msgstr "इग्बो" - -msgid "Ido" -msgstr "इदो" - -msgid "Icelandic" -msgstr "आयलँडिक" - -msgid "Italian" -msgstr "इटालियन" - -msgid "Japanese" -msgstr "जपानी" - -msgid "Georgian" -msgstr "जॉर्जियन" - -msgid "Kabyle" -msgstr "कबायल" - -msgid "Kazakh" -msgstr "कझाक" - -msgid "Khmer" -msgstr "ख्मेर" - -msgid "Kannada" -msgstr "कन्नड" - -msgid "Korean" -msgstr "कोरियन" - -msgid "Kyrgyz" -msgstr "किर्गिझ" - -msgid "Luxembourgish" -msgstr "लक्झेंबर्गिश" - -msgid "Lithuanian" -msgstr "लिथुआनियन" - -msgid "Latvian" -msgstr "लाटव्हिअन" - -msgid "Macedonian" -msgstr "मॅसेडोनिअन" - -msgid "Malayalam" -msgstr "मल्याळम" - -msgid "Mongolian" -msgstr "मंगोलियन" - -msgid "Marathi" -msgstr "मराठी" - -msgid "Malay" -msgstr "मलय" - -msgid "Burmese" -msgstr "बर्मीस" - -msgid "Norwegian Bokmål" -msgstr "नॉर्वेजियन बोकमाल" - -msgid "Nepali" -msgstr "नेपाळी" - -msgid "Dutch" -msgstr "डच" - -msgid "Norwegian Nynorsk" -msgstr "नॉर्वेजिअन निनॉर्स्क " - -msgid "Ossetic" -msgstr "ओस्सेटिक" - -msgid "Punjabi" -msgstr "पंजाबी" - -msgid "Polish" -msgstr "पॉलिश" - -msgid "Portuguese" -msgstr "पोर्तुगीज" - -msgid "Brazilian Portuguese" -msgstr "ब्रझिलियन पोर्तुगीज" - -msgid "Romanian" -msgstr "रोमेनियन" - -msgid "Russian" -msgstr "रशियन" - -msgid "Slovak" -msgstr "स्लोवाक" - -msgid "Slovenian" -msgstr "स्लोवेनियन" - -msgid "Albanian" -msgstr "अल्बेनियन" - -msgid "Serbian" -msgstr "सर्बियन" - -msgid "Serbian Latin" -msgstr "सर्बियन लॅटिन" - -msgid "Swedish" -msgstr "स्वीडिश" - -msgid "Swahili" -msgstr "स्वाहिली" - -msgid "Tamil" -msgstr "तमिळ" - -msgid "Telugu" -msgstr "तेलुगु" - -msgid "Tajik" -msgstr "ताजिक" - -msgid "Thai" -msgstr "थाई" - -msgid "Turkmen" -msgstr "तुर्कमेन" - -msgid "Turkish" -msgstr "तुर्की" - -msgid "Tatar" -msgstr "टाटर" - -msgid "Udmurt" -msgstr "उदमर्त" - -msgid "Uyghur" -msgstr "उईघुर" - -msgid "Ukrainian" -msgstr "युक्रेनियन" - -msgid "Urdu" -msgstr "उर्दू" - -msgid "Uzbek" -msgstr "उझबेक" - -msgid "Vietnamese" -msgstr "व्हिएतनामी" - -msgid "Simplified Chinese" -msgstr "सोपी चायनिज" - -msgid "Traditional Chinese" -msgstr "पारंपारिक चायनिज" - -msgid "Messages" -msgstr "संदेश" - -msgid "Site Maps" -msgstr "संकेतस्थळ नकाशे" - -msgid "Static Files" -msgstr "स्थिर फाइल्स" - -msgid "Syndication" -msgstr "सिंडिकेशन" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "तो पान क्रमांक पूर्णांक नाही." - -msgid "That page number is less than 1" -msgstr "तो पान क्रमांक 1 पेक्षा कमी आहे" - -msgid "That page contains no results" -msgstr "त्या पानावर कोणतेही परिणाम नाहीत." - -msgid "Enter a valid value." -msgstr "वैध मूल्य टाका." - -msgid "Enter a valid URL." -msgstr "एक योग्य युआरएल टाका करा." - -msgid "Enter a valid integer." -msgstr "योग्य पूर्णांक टाका." - -msgid "Enter a valid email address." -msgstr "योग्य विपत्र पत्ता टाका." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "अक्षरे, संख्या, अंडरस्कोर किंवा हायफनसह असलेला योग्य \"स्लग\" टाका." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "योग्य \"स्लग\" टाका ज्यामध्ये यूनिकोड अक्षरे, अंक, अंडरस्कोर किंवा हायफन असतात." - -msgid "Enter a valid IPv4 address." -msgstr "योग्य IPv4 पत्ता टाका." - -msgid "Enter a valid IPv6 address." -msgstr "योग्य IPv6 पत्ता टाका." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "योग्य IPv4 किंवा IPv6 पत्ता नमूद करा." - -msgid "Enter only digits separated by commas." -msgstr "स्वल्पविरामाने वेगळे केलेले अंकच फक्त नमूद करा." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "हे मूल्य%(limit_value)s(%(show_value)s) आहे याची खात्री करा." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "हे मूल्य %(limit_value)sया मर्यादेइतके किंवा त्यापेक्षा कमी आहे याची काळजी घ्या." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "हे मूल्य %(limit_value)sया मर्यादेइतके किंवा त्यापेक्षा जास्त आहे याची काळजी घ्या." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "हे मूल्य पायरी आकार %(limit_value)s चा गुणाकार असल्याची खात्री करा." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "अंक टाका." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "शून्य वर्णांना परवानगी नाही." - -msgid "and" -msgstr "आणि" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s सह %(field_labels)s हे अगोदरच अस्तित्वात आहे." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "\"%(name)s\" च्या मर्यादेचं उल्लंघन आहे." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Value %(value)r हा योग्य पर्याय नाही." - -msgid "This field cannot be null." -msgstr "हे क्षेत्र रिक्त असू शकत नाही." - -msgid "This field cannot be blank." -msgstr "हे क्षेत्र रिक्त असू शकत नाही." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s %(field_label)s ने अगोदरच अस्तित्वात आहे." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "क्षेत्राचा प्रकार: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” मूल्य सत्य किंवा असत्य असावा." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” मूल्य सत्य, असत्य किंवा कोणतेही नसावेत." - -msgid "Boolean (Either True or False)" -msgstr "बूलियन (सत्य किंवा असत्य)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "स्वल्पविरामाने वेगळे केलेले पूर्णांक" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "दिनांक (वेळेशिवाय)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "दिनांक (वेळेसह)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "कालावधी" - -msgid "Email address" -msgstr "विपत्र पत्ता" - -msgid "File path" -msgstr "दस्तऐवज मार्ग" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "पूर्णांक" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "Small integer" -msgstr "लहान पूर्णांक" - -msgid "IPv4 address" -msgstr "IPv4 पत्ता" - -msgid "IP address" -msgstr "IP पत्ता" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "बुलियन (एकतर खरे, असत्य किंवा काहीही नाही)" - -msgid "Positive big integer" -msgstr "सकारात्मक मोठा पूर्णांक" - -msgid "Positive integer" -msgstr "सकारात्मक पूर्णांक" - -msgid "Positive small integer" -msgstr "सकारात्मक लहान पूर्णांक" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Text" -msgstr "मजकूर" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "वेळ" - -msgid "URL" -msgstr "" - -msgid "Raw binary data" -msgstr "कच्चा बायनरी डेटा" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "सार्वत्रिक अद्वितीय ओळखकर्ता" - -msgid "File" -msgstr "फाइल" - -msgid "Image" -msgstr "चित्र " - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "मूल्य योग्य JSON असणे आवश्यक." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "हे क्षेत्र आवश्यक आहे." - -msgid "Enter a whole number." -msgstr "पूर्ण संख्या प्रविष्ट करा." - -msgid "Enter a valid date." -msgstr "योग्य दिनांक नमूद करा." - -msgid "Enter a valid time." -msgstr "योग्य वेळ नमूद करा." - -msgid "Enter a valid date/time." -msgstr "योग्य दिनांक/वेळ नमूद करा." - -msgid "Enter a valid duration." -msgstr "योग्य कालावधी नमूद करा." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "दिवसांची संख्या {min_days} आणि {max_days} च्या मधे असावी." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "कोणताही दस्तऐवज सुपूर्त केलेला नाही. अर्जावरील एन्कोडिंग प्रकार तपासा." - -msgid "No file was submitted." -msgstr "कोणताही दस्तऐवज सुपूर्त केलेला नाही." - -msgid "The submitted file is empty." -msgstr "सुपूर्त केलेला दस्तऐवज रिकामी आहे." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "कृपया एकतर फाइल सबमिट करा किंवा स्पष्ट चेकबॉक्स चेक करा, दोन्ही नाही." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "एक वैध प्रतिमा अपलोड करा. तुम्ही अपलोड केलेली फाइल चित्र किंवा दूषित चित्र नव्हते." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "मूल्यांची यादी नमूद करा." - -msgid "Enter a complete value." -msgstr "पूर्ण मूल्य नमूद करा." - -msgid "Enter a valid UUID." -msgstr "योग्य UUID नमूद करा." - -msgid "Enter a valid JSON." -msgstr "योग्य JSON नमूद करा." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "क्रम" - -msgid "Delete" -msgstr "घालवा" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "कृपया %(field)s साठी दुय्यम माहिती प्रत सुधारा." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "कृपया खालील नकली मूल्ये सुधारा." - -msgid "The inline value did not match the parent instance." -msgstr "इनलाइन मूल्य मूळ उदाहरणाशी जुळत नाही." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "तो पर्याय उपलब्ध पर्यायांपैकी एक नाही. योग्य पर्याय निवडा. " - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” हे वैध मूल्य नाही." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "साफ करा" - -msgid "Currently" -msgstr "सध्या" - -msgid "Change" -msgstr "बदला" - -msgid "Unknown" -msgstr "अज्ञात" - -msgid "Yes" -msgstr "होय" - -msgid "No" -msgstr "नाही" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "होय,नाही,कदाचित" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "%s केबी" - -#, python-format -msgid "%s MB" -msgstr "%s एमबी" - -#, python-format -msgid "%s GB" -msgstr "%s जीबी" - -#, python-format -msgid "%s TB" -msgstr "%s टिबी" - -#, python-format -msgid "%s PB" -msgstr "%s पीबी" - -msgid "p.m." -msgstr "म.उ." - -msgid "a.m." -msgstr "म.पू." - -msgid "PM" -msgstr "मउ" - -msgid "AM" -msgstr "मपू" - -msgid "midnight" -msgstr "मध्यरात्री" - -msgid "noon" -msgstr "दुपारी" - -msgid "Monday" -msgstr "सोमवार" - -msgid "Tuesday" -msgstr "मंगळवार" - -msgid "Wednesday" -msgstr "बुधवार" - -msgid "Thursday" -msgstr "गुरुवार" - -msgid "Friday" -msgstr "शुक्रवार" - -msgid "Saturday" -msgstr "शनिवार" - -msgid "Sunday" -msgstr "रविवार" - -msgid "Mon" -msgstr "सोम" - -msgid "Tue" -msgstr "मंगळ" - -msgid "Wed" -msgstr "बुध" - -msgid "Thu" -msgstr "गुरु" - -msgid "Fri" -msgstr "शुक्र" - -msgid "Sat" -msgstr "शनि" - -msgid "Sun" -msgstr "रवि" - -msgid "January" -msgstr "जानेवारी" - -msgid "February" -msgstr "फेब्रुवारी" - -msgid "March" -msgstr "मार्च" - -msgid "April" -msgstr "एप्रिल" - -msgid "May" -msgstr "मे" - -msgid "June" -msgstr "जून" - -msgid "July" -msgstr "जुलै" - -msgid "August" -msgstr "ऑगस्ट" - -msgid "September" -msgstr "सप्टेंबर" - -msgid "October" -msgstr "ऑक्टोबर" - -msgid "November" -msgstr "नोव्हेंबर" - -msgid "December" -msgstr "डिसेंबर" - -msgid "jan" -msgstr "जान" - -msgid "feb" -msgstr "फेब" - -msgid "mar" -msgstr "मार" - -msgid "apr" -msgstr "एप्रि" - -msgid "may" -msgstr "मे" - -msgid "jun" -msgstr "जून" - -msgid "jul" -msgstr "जुल" - -msgid "aug" -msgstr "ऑग" - -msgid "sep" -msgstr "सप" - -msgid "oct" -msgstr "ऑक्ट" - -msgid "nov" -msgstr "नोव्ह" - -msgid "dec" -msgstr "डिस" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "जान." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "फेब." - -msgctxt "abbrev. month" -msgid "March" -msgstr "मार्च" - -msgctxt "abbrev. month" -msgid "April" -msgstr "एप्रिल" - -msgctxt "abbrev. month" -msgid "May" -msgstr "मे" - -msgctxt "abbrev. month" -msgid "June" -msgstr "जून" - -msgctxt "abbrev. month" -msgid "July" -msgstr "जुलै" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ऑग." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "सप्ट." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ऑक्ट." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "नोव्ह." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "डिस." - -msgctxt "alt. month" -msgid "January" -msgstr "जानेवारी" - -msgctxt "alt. month" -msgid "February" -msgstr "फेब्रुवारी" - -msgctxt "alt. month" -msgid "March" -msgstr "मार्च" - -msgctxt "alt. month" -msgid "April" -msgstr "एप्रिल" - -msgctxt "alt. month" -msgid "May" -msgstr "मे" - -msgctxt "alt. month" -msgid "June" -msgstr "जून" - -msgctxt "alt. month" -msgid "July" -msgstr "जुलै" - -msgctxt "alt. month" -msgid "August" -msgstr "ऑगस्ट" - -msgctxt "alt. month" -msgid "September" -msgstr "सप्टेंबर" - -msgctxt "alt. month" -msgid "October" -msgstr "ऑक्टोबर" - -msgctxt "alt. month" -msgid "November" -msgstr "नोव्हेंबर" - -msgctxt "alt. month" -msgid "December" -msgstr "डिसेंबर" - -msgid "This is not a valid IPv6 address." -msgstr "हा योग्य IPv6 पत्ता नाही." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "किंवा" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "निषिद्ध" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF चाचणी अयशस्वी झाली. विनंती रद्द केली." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"तुम्हाला हा सनदेश दिसत आहे कारण या HTTPS संकेतस्थळाला तुमच्या वेब ब्राउझरद्वारे \"रेफरर " -"हेडर\" पाठवण्याची आवश्यकता आहे, परंतु कोणतेही पाठवले नाही. तुमचा ब्राउझर तृतीय पक्षांकडून " -"हायजॅक केला जात नाही याची खात्री करण्यासाठी सुरक्षिततेच्या दृष्टीने हे शीर्षलेख आवश्यक आहे." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"किमान या साइटसाठी किंवा HTTPS कनेक्शनसाठी किंवा “समान-मूळ” विनंत्यांसाठी, तुम्ही तुमचे " -"ब्राउझर “रेफरर” हेडर अक्षम केले असल्यास, कृपया ते पुन्हा-सक्षम करा." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"तुम्ही जोडणी वापरत असल्यास किंवा \"रेफरर-पॉलिसी: नो-रेफरर\" हेडर समाविष्ट करत " -"असल्यास, कृपया ते काढून टाका. CSRF संरक्षणासाठी \"रेफरर\" हेडर कठोर रेफरर तपासणी करणे " -"आवश्यक आहे. तुम्हाला गोपनीयतेबद्दल काळजी वाटत असल्यास, तृतीय-पक्ष स्थळाच्या दुव्यासाठी सारखे पर्याय वापरा." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"तुम्हाला हा संदेश दिसत आहे कारण अर्ज सुपूर्त करताना या स्थळाला CSRF कुकी आवश्यक आहे. तुमचा " -"ब्राउझर तृतीय पक्षांकडून हायजॅक केला जात नाही याची खात्री करण्यासाठी ही कुकी " -"सुरक्षिततेच्या कारणांसाठी आवश्यक आहे." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"किमान या साइटसाठी किंवा \"समान-मूळ\" विनंत्यांसाठी, कृपया अक्षम केलेल्या ब्राउझर कुकीज " -"पुन्हा सक्षम करा." - -msgid "More information is available with DEBUG=True." -msgstr "अधिक माहिती DEBUG=True सह उपलब्ध आहे." - -msgid "No year specified" -msgstr "कोणतेही वर्ष नमूद केलेले नाही" - -msgid "Date out of range" -msgstr "पल्ल्याच्या बाहेरची दिनांक" - -msgid "No month specified" -msgstr "कोणताही महिना निर्दिष्ट केलेला नाही" - -msgid "No day specified" -msgstr "कोणताही दिवस निर्दिष्ट केलेला नाही" - -msgid "No week specified" -msgstr "कोणताही आठवडा निर्दिष्ट केलेला नाही" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "कोणतेही %(verbose_name_plural)s उपलब्ध नाहीत" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "क्वेरीसह जुळणारे कोणतेही %(verbose_name)s सापडले नाही" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "अवैध पान (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "डिरेक्टरी निर्देशकांना येथे परवानगी नाही." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” अस्तित्वात नाही" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s चे निर्देशांक" - -msgid "The install worked successfully! Congratulations!" -msgstr "इंस्टॉलेशनने यशस्वीरित्या कार्य केले! अभिनंदन!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"डिजांगो %(version)s साठी प्रदर्शित संदेश पहा" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"तुम्ही हे पान पाहत आहात कारण तुमच्या सेटिंग्ज फाइलमध्ये DEBUG=True आहे आणि तुम्ही कोणतीही URL कॉन्फिगर केलेली नाही." - -msgid "Django Documentation" -msgstr "जांगो दस्तऐवजीकरण" - -msgid "Topics, references, & how-to’s" -msgstr "विषय, संदर्भ, आणि कसे करावे" - -msgid "Tutorial: A Polling App" -msgstr "शिकवणी: मतदान अ‍ॅप" - -msgid "Get started with Django" -msgstr "जॅंगो सोबत सुरवात करा" - -msgid "Django Community" -msgstr "जॅंगो समुदाय" - -msgid "Connect, get help, or contribute" -msgstr "जोडा, मदत मिळवा किंवा हातभार लावा" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ms/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index 9081340..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ms/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index 5884745..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,1286 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -# Mariusz Felisiak , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-12-06 07:43+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Bahasa Afrikaans" - -msgid "Arabic" -msgstr "Bahasa Arab" - -msgid "Algerian Arabic" -msgstr "Bahasa Arab Algeria" - -msgid "Asturian" -msgstr "Bahasa Asturia" - -msgid "Azerbaijani" -msgstr "Bahasa Azerbaijan" - -msgid "Bulgarian" -msgstr "Bahasa Bulgaria" - -msgid "Belarusian" -msgstr "Bahasa Belarus" - -msgid "Bengali" -msgstr "Bahasa Benggali" - -msgid "Breton" -msgstr "Bahasa Breton" - -msgid "Bosnian" -msgstr "Bahasa Bosnia" - -msgid "Catalan" -msgstr "Bahasa Catalonia" - -msgid "Czech" -msgstr "Bahasa Czech" - -msgid "Welsh" -msgstr "Bahasa Wales" - -msgid "Danish" -msgstr "Bahasa Denmark" - -msgid "German" -msgstr "Bahasa Jerman" - -msgid "Lower Sorbian" -msgstr "Bahasa Sorbian Rendah" - -msgid "Greek" -msgstr "Bahasa Yunani" - -msgid "English" -msgstr "Bahasa Inggeris" - -msgid "Australian English" -msgstr "Bahasa Inggeris Australia" - -msgid "British English" -msgstr "Bahasa Inggeris British" - -msgid "Esperanto" -msgstr "Bahasa Esperanto" - -msgid "Spanish" -msgstr "Bahasa Sepanyol" - -msgid "Argentinian Spanish" -msgstr "Bahasa Sepanyol Argentina" - -msgid "Colombian Spanish" -msgstr "Bahasa Sepanyol Kolumbia" - -msgid "Mexican Spanish" -msgstr "Bahasa Sepanyol Mexico" - -msgid "Nicaraguan Spanish" -msgstr "Bahasa Sepanyol Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Bahasa Sepanyol Venezuela" - -msgid "Estonian" -msgstr "Bahasa Estonia" - -msgid "Basque" -msgstr "Bahasa Bask" - -msgid "Persian" -msgstr "Bahasa Farsi" - -msgid "Finnish" -msgstr "Bahassa Finland" - -msgid "French" -msgstr "Bahasa Perancis" - -msgid "Frisian" -msgstr "Bahasa Frisia" - -msgid "Irish" -msgstr "Bahasa Ireland" - -msgid "Scottish Gaelic" -msgstr "Bahasa Gael Scotland" - -msgid "Galician" -msgstr "Bahasa Galisia" - -msgid "Hebrew" -msgstr "Bahasa Ibrani" - -msgid "Hindi" -msgstr "Bahasa Hindi" - -msgid "Croatian" -msgstr "Bahasa Kroatia" - -msgid "Upper Sorbian" -msgstr "Bahasa Sorbia Atasan" - -msgid "Hungarian" -msgstr "Bahasa Hungary" - -msgid "Armenian" -msgstr "Bahasa Armenia" - -msgid "Interlingua" -msgstr "Bahasa Interlingua" - -msgid "Indonesian" -msgstr "Bahasa Indonesia" - -msgid "Igbo" -msgstr "Bahasa Igbo" - -msgid "Ido" -msgstr "Bahasa Ido" - -msgid "Icelandic" -msgstr "Bahasa Iceland" - -msgid "Italian" -msgstr "Bahasa Itali" - -msgid "Japanese" -msgstr "Bahasa Jepun" - -msgid "Georgian" -msgstr "Bahasa Georgia" - -msgid "Kabyle" -msgstr "Bahasa Kabylia" - -msgid "Kazakh" -msgstr "Bahasa Kazakhstan" - -msgid "Khmer" -msgstr "Bahasa Kambodia" - -msgid "Kannada" -msgstr "Bahasa Kannada" - -msgid "Korean" -msgstr "Bahasa Korea" - -msgid "Kyrgyz" -msgstr "Bahasa Kyrgyzstan" - -msgid "Luxembourgish" -msgstr "Bahasa Luxemborg" - -msgid "Lithuanian" -msgstr "Bahasa Lithuania" - -msgid "Latvian" -msgstr "Bahasa Latvia" - -msgid "Macedonian" -msgstr "Bahasa Masedonia" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Bahasa Mongol" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Bahasa Melayu" - -msgid "Burmese" -msgstr "Bahasa Burma" - -msgid "Norwegian Bokmål" -msgstr "Bahasa Bokmal Norway" - -msgid "Nepali" -msgstr "Bahasa Nepal" - -msgid "Dutch" -msgstr "Belanda" - -msgid "Norwegian Nynorsk" -msgstr "Bahasa Nynorsk Norway" - -msgid "Ossetic" -msgstr "Bahasa Ossetic" - -msgid "Punjabi" -msgstr "Bahasa Punjab" - -msgid "Polish" -msgstr "Bahasa Poland" - -msgid "Portuguese" -msgstr "Bahasa Portugal" - -msgid "Brazilian Portuguese" -msgstr "Bahasa Portugal Brazil" - -msgid "Romanian" -msgstr "Bahasa Romania" - -msgid "Russian" -msgstr "Bahasa Rusia" - -msgid "Slovak" -msgstr "Bahasa Slovakia" - -msgid "Slovenian" -msgstr "Bahasa Slovenia" - -msgid "Albanian" -msgstr "Bahasa Albania" - -msgid "Serbian" -msgstr "Bahasa Serbia" - -msgid "Serbian Latin" -msgstr "Bahasa Latin Serbia" - -msgid "Swedish" -msgstr "Bahasa Sweden" - -msgid "Swahili" -msgstr "Bahasa Swahili" - -msgid "Tamil" -msgstr "Bahasa Tamil" - -msgid "Telugu" -msgstr "Bahasa Telugu" - -msgid "Tajik" -msgstr "Bahasa Tajik" - -msgid "Thai" -msgstr "Bahasa Siam" - -msgid "Turkmen" -msgstr "Bahasa Turkmenistan" - -msgid "Turkish" -msgstr "Bahasa Turki" - -msgid "Tatar" -msgstr "Bahasa Tatar" - -msgid "Udmurt" -msgstr "Bahasa Udmurt" - -msgid "Ukrainian" -msgstr "Bahasa Ukraine" - -msgid "Urdu" -msgstr "Bahasa Urdu" - -msgid "Uzbek" -msgstr "Bahasa Uzbekistan" - -msgid "Vietnamese" -msgstr "Bahasa Vietnam" - -msgid "Simplified Chinese" -msgstr "Bahasa Cina (Dipermudahkan)" - -msgid "Traditional Chinese" -msgstr "Bahasa Cina Tradisional" - -msgid "Messages" -msgstr "Mesej" - -msgid "Site Maps" -msgstr "Peta Laman" - -msgid "Static Files" -msgstr "Fail Statik" - -msgid "Syndication" -msgstr "Sindikasi" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Nombor ruangan itu bukanlah integer" - -msgid "That page number is less than 1" -msgstr "Nombor ruangan itu kurang daripada 1" - -msgid "That page contains no results" -msgstr "Ruangan itu tiada keputusan" - -msgid "Enter a valid value." -msgstr "Masukkan nilai yang sah." - -msgid "Enter a valid URL." -msgstr "Masukkan URL yang sah." - -msgid "Enter a valid integer." -msgstr "Masukkan integer yang sah." - -msgid "Enter a valid email address." -msgstr "Masukkan alamat emel yang sah." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Masukkan \"slug\" yang sah yang mengandungi huruf, nombor, garisan atau " -"tanda sempang." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Masukkan \"slug\" yang sah yang mengandungi huruf Unicode, nombor, garisan, " -"atau tanda sempang." - -msgid "Enter a valid IPv4 address." -msgstr "Masukkan alamat IPv4 yang sah." - -msgid "Enter a valid IPv6 address." -msgstr "Masukkan alamat IPv6 yang sah." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Masukkan alamat IPv4 atau IPv6 yang sah." - -msgid "Enter only digits separated by commas." -msgstr "Hanya masukkan digit yang dipisahkan oleh koma." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Pastikan nilai ini adalah %(limit_value)s (ia adalah %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Pastikan nilai ini kurang daripada atau sama dengan %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Pastikan nilai ini lebih daripada atau sama dengan %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Pastikan nilai ini mempunyai sekurang-kurangnya %(limit_value)d karater (ia " -"mempunyai %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Pastikan nilai ini mempunyai sepalingnya %(limit_value)d karakter (ia " -"mempunyai %(show_value)d)." - -msgid "Enter a number." -msgstr "Masukkan nombor." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Pastikan jumlah tidak melebihi %(max)s digit." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Pastikan titik perpuluhan tidak melebihi %(max)s." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Pastikan jumlah digit tidak melebihi %(max)s sebelum titik perpuluhan." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Sambungan fail \"%(extension)s\" tidak dibenarkan. Sambungan yang dibenarkan " -"adalah: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Karakter Null tidak dibenarkan." - -msgid "and" -msgstr "dan" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s dengan %(field_labels)s ini sudah wujud." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Nilai %(value)r bukan pilihan yang sah." - -msgid "This field cannot be null." -msgstr "Medan ini tidak boleh null." - -msgid "This field cannot be blank." -msgstr "Medan ini tidak boleh dibiarkan kosong." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s dengan %(field_label)s ini sudah wujud." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s mesti unik untuk %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Jenis medan: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Nilai \"%(value)s\" mesti samada True atau False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Nilai \"%(value)s\" mesti samada True, False, atau None." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Samada True atau False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (sehingga %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Integer dipisahkan dengan koma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Nilai \"%(value)s\" mempunyai format tarikh yang tidak sah. Format harus " -"berbentuk YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang betul (YYYY-MM-DD) tetapi ia " -"adalah tarikh yang tidak sah." - -msgid "Date (without time)" -msgstr "Tarikh (tanpa masa)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang tidak sah. Format harus berbentuk " -"YYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang betul (YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]) tetapi ia adalah tarikh/masa yang tidak sah." - -msgid "Date (with time)" -msgstr "Tarikh (dengan masa)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Nilai \"%(value)s\" mesti dalam bentuk nombor titik perpuluhan." - -msgid "Decimal number" -msgstr "Nombor titik perpuluhan" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang tidak sah. Format harus berbentuk " -"[DD] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Jangka-masa" - -msgid "Email address" -msgstr "Alama emel" - -msgid "File path" -msgstr "Laluan fail" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Nilai \"%(value)s\" mesti dalam bentuk titik terapung." - -msgid "Floating point number" -msgstr "Nombor titik terapung" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Nilai \"%(value)s\" mesti dalam bentuk integer." - -msgid "Integer" -msgstr "Integer" - -msgid "Big (8 byte) integer" -msgstr "Integer besar (8 bait)" - -msgid "Small integer" -msgstr "Integer kecil" - -msgid "IPv4 address" -msgstr "Alamat IPv4" - -msgid "IP address" -msgstr "Alamat IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Nilai \"%(value)s\" mesti samada None, True, atau False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (samada True, False, None)" - -msgid "Positive big integer" -msgstr "Integer besar positif" - -msgid "Positive integer" -msgstr "Integer positif" - -msgid "Positive small integer" -msgstr "Integer kecil positif" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (sehingga %(max_length)s)" - -msgid "Text" -msgstr "Teks" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang tidak sah. Format harus berbentuk " -"HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang betul (HH:MM[:ss[.uuuuuu]]) tetapi " -"ia mempunyai masa yang tidak sah." - -msgid "Time" -msgstr "Masa" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Data binari mentah" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "UUID \"%(value)s\" tidak sah." - -msgid "Universally unique identifier" -msgstr "Pengecam unik universal" - -msgid "File" -msgstr "Fail" - -msgid "Image" -msgstr "Imej" - -msgid "A JSON object" -msgstr "Objek JSON" - -msgid "Value must be valid JSON." -msgstr "Nilai harus dalam bentuk JSON yang sah." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s dengan %(field)s %(value)r tidak wujud." - -msgid "Foreign Key (type determined by related field)" -msgstr "Kunci Asing (jenis ditentukan oleh medan yang berkaitan)" - -msgid "One-to-one relationship" -msgstr "Hubungan satu-ke-satu" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Hubungan %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Hubungan %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Hubungan banyak-ke-banyak" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Medan ini diperlukan." - -msgid "Enter a whole number." -msgstr "Masukkan nombor bulat." - -msgid "Enter a valid date." -msgstr "Masukkan tarikh yang sah." - -msgid "Enter a valid time." -msgstr "Masukkan masa yang sah." - -msgid "Enter a valid date/time." -msgstr "Masukkan tarikh/masa yang sah." - -msgid "Enter a valid duration." -msgstr "Masukkan jangka-masa yang sah." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Jumlah hari mesti diantara {min_days} ke {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Tiada fail yang dihantar. Periksa jenis encoding pada borang." - -msgid "No file was submitted." -msgstr "Tiada fail yang dihantar." - -msgid "The submitted file is empty." -msgstr "Fail yang dihantar kosong." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Pastikan nama fial ini tidak melebihi %(max)d karakter (ia mempunyai " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Sila hantar fail atau tandakan pada kotak, bukan kedua-duanya sekali. " - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Muatnaik imej yang sah. Fail yang anda muatnaik samada bukan imej atau imej " -"yang rosak." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Pilih pilihan yang sah. %(value)s bukan pilihan yang tersedia." - -msgid "Enter a list of values." -msgstr "Masukkan senarai nilai." - -msgid "Enter a complete value." -msgstr "Masukkan nilai yang lengkap." - -msgid "Enter a valid UUID." -msgstr "Masukkan UUID yang sah." - -msgid "Enter a valid JSON." -msgstr "Masukkan JSON yang sah." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "%(error)s (Medan tersorok %(name)s)" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Data ManagementForm tidak dijumpai atau telah diusik. Medan yang hilang: " -"%(field_names)s. Anda mungkin perlu menghantar laporan pepijat sekiranya " -"masalah masih berterusan." - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Sila hantar tidak lebih dari %d borang." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Sila hantar sekurang-kurangnya %d borang." - -msgid "Order" -msgstr "Susunan" - -msgid "Delete" -msgstr "Padam" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Sila betulkan data duplikasi bagi %(field)s" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Sila betulkan data duplikasi bagi %(field)s, yang mana mestilah unik." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Sila betulkan data duplikasi bagi %(field_name)s yang mana mestilah unik " -"untuk %(lookup)s didalam %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Sila betulkan nilai-nilai duplikasi dibawah." - -msgid "The inline value did not match the parent instance." -msgstr "Nilai didalam barisan tidak sepadan dengan parent instance." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Pilih pilihan yang sah. Pilihan itu tidak ada didalam senarai pilihan." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" bukan nilai yang sah." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s tidak dapat diterjemahkan ke dalam zon masa " -"%(current_timezone)s; ia mungkin samar-samar atau tidak wujud." - -msgid "Clear" -msgstr "Kosongkan" - -msgid "Currently" -msgstr "Kini" - -msgid "Change" -msgstr "Tukar" - -msgid "Unknown" -msgstr "Tidak diketahui" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Tidak" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ya,tidak,mungkin" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bait" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "malam" - -msgid "a.m." -msgstr "pagi" - -msgid "PM" -msgstr "MALAM" - -msgid "AM" -msgstr "PAGI" - -msgid "midnight" -msgstr "tengah malam" - -msgid "noon" -msgstr "tengahari" - -msgid "Monday" -msgstr "Isnin" - -msgid "Tuesday" -msgstr "Selasa" - -msgid "Wednesday" -msgstr "Rabu" - -msgid "Thursday" -msgstr "Khamis" - -msgid "Friday" -msgstr "Jumaat" - -msgid "Saturday" -msgstr "Sabtu" - -msgid "Sunday" -msgstr "Ahad" - -msgid "Mon" -msgstr "Isn" - -msgid "Tue" -msgstr "Sel" - -msgid "Wed" -msgstr "Rab" - -msgid "Thu" -msgstr "Kha" - -msgid "Fri" -msgstr "Jum" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Aha" - -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Mac" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Jun" - -msgid "July" -msgstr "Julai" - -msgid "August" -msgstr "Ogos" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Disember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mei" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ogo" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dis" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb" - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mac" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Jun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julai" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ogo." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dis." - -msgctxt "alt. month" -msgid "January" -msgstr "Januari" - -msgctxt "alt. month" -msgid "February" -msgstr "Februari" - -msgctxt "alt. month" -msgid "March" -msgstr "Mac" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mei" - -msgctxt "alt. month" -msgid "June" -msgstr "Jun" - -msgctxt "alt. month" -msgid "July" -msgstr "Julai" - -msgctxt "alt. month" -msgid "August" -msgstr "Ogos" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Disember" - -msgid "This is not a valid IPv6 address." -msgstr "Alamat IPv6 ini tidak sah." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s ..." - -msgid "or" -msgstr "atau" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d tahun" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d bulan" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d minggu " - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d hari" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d jam" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minit" - -msgid "Forbidden" -msgstr "Dilarang" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verifikasi VSRF gagal. Permintaan dihentikan." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Anda melihat mesej ini kerana laman HTTPS ini memerlukan \"Referer header\" " -"dihantar ke pelayar sesawang anda, tetapi ia tidak dihantar. Header ini " -"diperlukan bagi tujuan keselamatan, agar dapat memastikan pelayar anda tidak " -"dirampas oleh pihak ketiga." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Sekiranya anda telah menetapkan pelayar anda untuk mematikan header \"Referer" -"\", sila hidupkannya semula, sekurang-kurangya bagi laman ini, atau bagi " -"sambungan HTTPS, atau bagi permintaan \"same-origin\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Sekiranya anda menggunakan tag atau memasukkan header \"Referer-Policy: no-referrer\", sila buangkan " -"ia. Perlindungan CSRF memerlukan header \"Referer\" untuk melakukan " -"penyemakan referer yang ketat. Sekiranya anda risau tentang privasi anda, " -"gunakan alternatif seperti bagi pautan laman pihak " -"ketiga." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Anda melihat mesej ini kerana laman ini memerlukan cookie CSRF apabila " -"menghantar borang. Cookie ini diperlukan bagi tujuan keselamatan, bagi " -"memastikan pelayar anda tidak dirampas oleh pihak ketiga." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Sekiranya anda telah menetapkan pelayar anda untuk tidak menerima cookie, " -"sila hidupkannya semula, sekurang-kurangnya bagi laman ini, atau bagi " -"permintaan \"same-origin\"." - -msgid "More information is available with DEBUG=True." -msgstr "Maklumat lanjut boleh didapati dengan menetapkan DEBUG=True." - -msgid "No year specified" -msgstr "Tiada tahun diberikan" - -msgid "Date out of range" -msgstr "Tarikh diluar julat" - -msgid "No month specified" -msgstr "Tiada bulan diberikan" - -msgid "No day specified" -msgstr "Tiada hari diberikan" - -msgid "No week specified" -msgstr "Tiada minggu diberikan" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s tiada" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s masa depan tiada kerana %(class_name)s.allow_future " -"adalah False. " - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"\"%(datestr)s\" tarikh yang diberikan tidak sah mengikut format \"%(format)s" -"\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Tiada %(verbose_name)s mengikut pertanyaan yang dimasukkan" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Ruangan ini bukan \"last\", dan tidak boleh ditukar kepada int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ruangan tidak sah (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Senarai kosong dan \"%(class_name)s.allow_empty\" adalah False." - -msgid "Directory indexes are not allowed here." -msgstr "Indeks Direktori tidak dibenarkan disini." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" tidak wujud" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Pemasangan berjaya dilakukan! Tahniah!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Lihat nota pelepasan bagi Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Anda melihat ruangan ini kerana DEBUG=True terdapat didalam fail tetapan anda dan anda tidak " -"menetapkan sebarang URL." - -msgid "Django Documentation" -msgstr "Dokumentasi Django" - -msgid "Topics, references, & how-to’s" -msgstr "Topik, rujukan, & bagaimana-cara" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: App Soal-Selidik" - -msgid "Get started with Django" -msgstr "Mulakan dengan Django" - -msgid "Django Community" -msgstr "Komuniti Django" - -msgid "Connect, get help, or contribute" -msgstr "Sambung, minta bantuan, atau sumbang" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ms/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ms/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ms/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ms/formats.py deleted file mode 100644 index d06719f..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ms/formats.py +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j M Y" # '25 Oct 2006' -TIME_FORMAT = "P" # '2:30 p.m.' -DATETIME_FORMAT = "j M Y, P" # '25 Oct 2006, 2:30 p.m.' -YEAR_MONTH_FORMAT = "F Y" # 'October 2006' -MONTH_DAY_FORMAT = "j F" # '25 October' -SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' -SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 p.m.' -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%d %b %Y", # '25 Oct 2006' - "%d %b, %Y", # '25 Oct, 2006' - "%d %B %Y", # '25 October 2006' - "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/my/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index 06d9129..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/my/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index a1c7e9a..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,1197 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2013,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "အာဖရိကန်" - -msgid "Arabic" -msgstr "အာရပ်" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "ဘူဂေးရီယန်" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "ဘင်းဂလီ" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "ဘော့်စ်နီယန်" - -msgid "Catalan" -msgstr "ကက်တလန်" - -msgid "Czech" -msgstr "ချက်" - -msgid "Welsh" -msgstr "ဝေးလ်" - -msgid "Danish" -msgstr "ဒိန်းမတ်" - -msgid "German" -msgstr "ဂျာမန်" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "ဂရိ" - -msgid "English" -msgstr "အင်္ဂလိပ်" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "ဗြိတိသျှအင်္ဂလိပ်" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "စပိန်" - -msgid "Argentinian Spanish" -msgstr "" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "" - -msgid "Basque" -msgstr "" - -msgid "Persian" -msgstr "" - -msgid "Finnish" -msgstr "" - -msgid "French" -msgstr "" - -msgid "Frisian" -msgstr "" - -msgid "Irish" -msgstr "" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "" - -msgid "Hebrew" -msgstr "" - -msgid "Hindi" -msgstr "" - -msgid "Croatian" -msgstr "" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "" - -msgid "Italian" -msgstr "" - -msgid "Japanese" -msgstr "" - -msgid "Georgian" -msgstr "" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "" - -msgid "Korean" -msgstr "" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "" - -msgid "Latvian" -msgstr "" - -msgid "Macedonian" -msgstr "" - -msgid "Malayalam" -msgstr "" - -msgid "Mongolian" -msgstr "" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "" - -msgid "Norwegian Nynorsk" -msgstr "" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "" - -msgid "Polish" -msgstr "" - -msgid "Portuguese" -msgstr "" - -msgid "Brazilian Portuguese" -msgstr "" - -msgid "Romanian" -msgstr "" - -msgid "Russian" -msgstr "" - -msgid "Slovak" -msgstr "" - -msgid "Slovenian" -msgstr "" - -msgid "Albanian" -msgstr "" - -msgid "Serbian" -msgstr "" - -msgid "Serbian Latin" -msgstr "" - -msgid "Swedish" -msgstr "" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "" - -msgid "Telugu" -msgstr "" - -msgid "Thai" -msgstr "" - -msgid "Turkish" -msgstr "" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "" - -msgid "Simplified Chinese" -msgstr "" - -msgid "Traditional Chinese" -msgstr "" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "" - -msgid "Enter a valid URL." -msgstr "" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -msgid "Enter a number." -msgstr "" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "နှင့်" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "" - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "အီးမေးလ်လိပ်စာ" - -msgid "File path" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "ကိန်းပြည့်" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "အိုင်ပီဗီ၄လိပ်စာ" - -msgid "IP address" -msgstr "အိုင်ပီလိပ်စာ" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "စာသား" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "" - -msgid "URL" -msgstr "ယူအာအယ်" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "ဖိုင်" - -msgid "Image" -msgstr "ပံု" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "" - -msgid "Enter a whole number." -msgstr "" - -msgid "Enter a valid date." -msgstr "" - -msgid "Enter a valid time." -msgstr "" - -msgid "Enter a valid date/time." -msgstr "" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -msgid "No file was submitted." -msgstr "" - -msgid "The submitted file is empty." -msgstr "" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "မှာကြား" - -msgid "Delete" -msgstr "ပယ်ဖျက်" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Currently" -msgstr "" - -msgid "Change" -msgstr "" - -msgid "Unknown" -msgstr "အမည်မသိ" - -msgid "Yes" -msgstr "ဟုတ်" - -msgid "No" -msgstr "မဟုတ်" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ဘိုက်များ" - -#, python-format -msgid "%s KB" -msgstr "%s ကီလိုဘိုက်" - -#, python-format -msgid "%s MB" -msgstr "%s မက်ဂါဘိုက်" - -#, python-format -msgid "%s GB" -msgstr "%s ဂစ်ဂါဘိုက်" - -#, python-format -msgid "%s TB" -msgstr "%s တီရာဘိုက်" - -#, python-format -msgid "%s PB" -msgstr "%s ပီတာဘိုက်" - -msgid "p.m." -msgstr "ညနေ" - -msgid "a.m." -msgstr "မနက်" - -msgid "PM" -msgstr "ညနေ" - -msgid "AM" -msgstr "မနက်" - -msgid "midnight" -msgstr "သန်းခေါင်" - -msgid "noon" -msgstr "မွန်းတည့်" - -msgid "Monday" -msgstr "တနင်္လာနေ့" - -msgid "Tuesday" -msgstr "" - -msgid "Wednesday" -msgstr "" - -msgid "Thursday" -msgstr "" - -msgid "Friday" -msgstr "" - -msgid "Saturday" -msgstr "" - -msgid "Sunday" -msgstr "" - -msgid "Mon" -msgstr "" - -msgid "Tue" -msgstr "" - -msgid "Wed" -msgstr "" - -msgid "Thu" -msgstr "" - -msgid "Fri" -msgstr "" - -msgid "Sat" -msgstr "" - -msgid "Sun" -msgstr "" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgid "jan" -msgstr "" - -msgid "feb" -msgstr "" - -msgid "mar" -msgstr "" - -msgid "apr" -msgstr "" - -msgid "may" -msgstr "" - -msgid "jun" -msgstr "" - -msgid "jul" -msgstr "" - -msgid "aug" -msgstr "" - -msgid "sep" -msgstr "" - -msgid "oct" -msgstr "" - -msgid "nov" -msgstr "" - -msgid "dec" -msgstr "" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -msgctxt "abbrev. month" -msgid "March" -msgstr "" - -msgctxt "abbrev. month" -msgid "April" -msgstr "" - -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -msgctxt "abbrev. month" -msgid "June" -msgstr "" - -msgctxt "abbrev. month" -msgid "July" -msgstr "" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -msgctxt "alt. month" -msgid "January" -msgstr "" - -msgctxt "alt. month" -msgid "February" -msgstr "" - -msgctxt "alt. month" -msgid "March" -msgstr "" - -msgctxt "alt. month" -msgid "April" -msgstr "" - -msgctxt "alt. month" -msgid "May" -msgstr "" - -msgctxt "alt. month" -msgid "June" -msgstr "" - -msgctxt "alt. month" -msgid "July" -msgstr "" - -msgctxt "alt. month" -msgid "August" -msgstr "" - -msgctxt "alt. month" -msgid "September" -msgstr "" - -msgctxt "alt. month" -msgid "October" -msgstr "" - -msgctxt "alt. month" -msgid "November" -msgstr "" - -msgctxt "alt. month" -msgid "December" -msgstr "" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "" - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index c4ebbae..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index cb2932b..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,1324 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Alexander Hansen , 2014 -# Eirik Krogstad , 2014 -# Jannis Leidel , 2011 -# jensadne , 2014-2015 -# Jon, 2015-2016 -# Jon, 2014 -# Jon, 2017-2022 -# Jon, 2013 -# Jon, 2011 -# Sigurd Gartmann , 2012 -# Tommy Strand , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-25 06:49+0000\n" -"Last-Translator: Jon, 2017-2022\n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabisk" - -msgid "Algerian Arabic" -msgstr "Algerisk arabisk" - -msgid "Asturian" -msgstr "Asturiansk" - -msgid "Azerbaijani" -msgstr "Aserbajdsjansk" - -msgid "Bulgarian" -msgstr "Bulgarsk" - -msgid "Belarusian" -msgstr "Hviterussisk" - -msgid "Bengali" -msgstr "Bengalsk" - -msgid "Breton" -msgstr "Bretonsk" - -msgid "Bosnian" -msgstr "Bosnisk" - -msgid "Catalan" -msgstr "Katalansk" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Tsjekkisk" - -msgid "Welsh" -msgstr "Walisisk" - -msgid "Danish" -msgstr "Dansk" - -msgid "German" -msgstr "Tysk" - -msgid "Lower Sorbian" -msgstr "Lavsorbisk" - -msgid "Greek" -msgstr "Gresk" - -msgid "English" -msgstr "Engelsk" - -msgid "Australian English" -msgstr "Engelsk (australsk)" - -msgid "British English" -msgstr "Engelsk (britisk)" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spansk" - -msgid "Argentinian Spanish" -msgstr "Argentinsk spansk" - -msgid "Colombian Spanish" -msgstr "Colombiansk spansk" - -msgid "Mexican Spanish" -msgstr "Meksikansk spansk" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguansk spansk" - -msgid "Venezuelan Spanish" -msgstr "Venezuelanske spansk" - -msgid "Estonian" -msgstr "Estisk" - -msgid "Basque" -msgstr "Baskisk" - -msgid "Persian" -msgstr "Persisk" - -msgid "Finnish" -msgstr "Finsk" - -msgid "French" -msgstr "Fransk" - -msgid "Frisian" -msgstr "Frisisk" - -msgid "Irish" -msgstr "Irsk" - -msgid "Scottish Gaelic" -msgstr "Skotsk-gælisk" - -msgid "Galician" -msgstr "Galisisk" - -msgid "Hebrew" -msgstr "Hebraisk" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatisk" - -msgid "Upper Sorbian" -msgstr "Høysorbisk" - -msgid "Hungarian" -msgstr "Ungarsk" - -msgid "Armenian" -msgstr "Armensk" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesisk" - -msgid "Igbo" -msgstr "Ibo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandsk" - -msgid "Italian" -msgstr "Italiensk" - -msgid "Japanese" -msgstr "Japansk" - -msgid "Georgian" -msgstr "Georgisk" - -msgid "Kabyle" -msgstr "Kabylsk" - -msgid "Kazakh" -msgstr "Kasakhisk" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreansk" - -msgid "Kyrgyz" -msgstr "Kirgisisk" - -msgid "Luxembourgish" -msgstr "Luxembourgsk" - -msgid "Lithuanian" -msgstr "Litauisk" - -msgid "Latvian" -msgstr "Latvisk" - -msgid "Macedonian" -msgstr "Makedonsk" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolsk" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malayisk" - -msgid "Burmese" -msgstr "Burmesisk" - -msgid "Norwegian Bokmål" -msgstr "Norsk (bokmål)" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Nederlandsk" - -msgid "Norwegian Nynorsk" -msgstr "Norsk (nynorsk)" - -msgid "Ossetic" -msgstr "Ossetisk" - -msgid "Punjabi" -msgstr "Panjabi" - -msgid "Polish" -msgstr "Polsk" - -msgid "Portuguese" -msgstr "Portugisisk" - -msgid "Brazilian Portuguese" -msgstr "Brasiliansk portugisisk" - -msgid "Romanian" -msgstr "Rumensk" - -msgid "Russian" -msgstr "Russisk" - -msgid "Slovak" -msgstr "Slovakisk" - -msgid "Slovenian" -msgstr "Slovensk" - -msgid "Albanian" -msgstr "Albansk" - -msgid "Serbian" -msgstr "Serbisk" - -msgid "Serbian Latin" -msgstr "Serbisk latin" - -msgid "Swedish" -msgstr "Svensk" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tadsjikisk" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmensk" - -msgid "Turkish" -msgstr "Tyrkisk" - -msgid "Tatar" -msgstr "Tatarisk" - -msgid "Udmurt" -msgstr "Udmurtisk" - -msgid "Ukrainian" -msgstr "Ukrainsk" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Usbekisk" - -msgid "Vietnamese" -msgstr "Vietnamesisk" - -msgid "Simplified Chinese" -msgstr "Forenklet kinesisk" - -msgid "Traditional Chinese" -msgstr "Tradisjonell kinesisk" - -msgid "Messages" -msgstr "Meldinger" - -msgid "Site Maps" -msgstr "Sidekart" - -msgid "Static Files" -msgstr "Statiske filer" - -msgid "Syndication" -msgstr "Syndikering" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Sidenummeret er ikke et heltall" - -msgid "That page number is less than 1" -msgstr "Sidenummeret er mindre enn 1" - -msgid "That page contains no results" -msgstr "Siden inneholder ingen resultater" - -msgid "Enter a valid value." -msgstr "Oppgi en gyldig verdi." - -msgid "Enter a valid URL." -msgstr "Oppgi en gyldig nettadresse." - -msgid "Enter a valid integer." -msgstr "Skriv inn et gyldig heltall." - -msgid "Enter a valid email address." -msgstr "Oppgi en gyldig e-postadresse" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Oppgi en gyldig \"slug\" bestående av bokstaver, nummer, understreker eller " -"bindestreker." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Oppgi en gyldig \"slug\" bestående av Unicode-bokstaver, nummer, " -"understreker eller bindestreker." - -msgid "Enter a valid IPv4 address." -msgstr "Oppgi en gyldig IPv4-adresse." - -msgid "Enter a valid IPv6 address." -msgstr "Oppgi en gyldig IPv6-adresse." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Oppgi en gyldig IPv4- eller IPv6-adresse." - -msgid "Enter only digits separated by commas." -msgstr "Oppgi kun tall adskilt med komma." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Verdien må være %(limit_value)s (den er %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Verdien må være mindre enn eller lik %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Verdien må være større enn eller lik %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Verdien må være et multiplum av trinnstørrelse %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sørg for denne verdien har minst %(limit_value)d tegn (den har " -"%(show_value)d)." -msgstr[1] "" -"Sørg for at denne verdien har minst %(limit_value)d tegn (den har " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sørg for denne verdien har %(limit_value)d tegn (den har nå %(show_value)d)." -msgstr[1] "" -"Sørg for at denne verdien har %(limit_value)d eller færre tegn (den har nå " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Oppgi et tall." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Sørg for at det er kun %(max)s tall." -msgstr[1] "Sørg for at det er %(max)s eller færre tall totalt." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Sørg for at det er kun %(max)s desimal." -msgstr[1] "Sørg for at det er %(max)s eller færre desimaler." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Sørg for at det kun %(max)s tall før desimalpunkt." -msgstr[1] "Sørg for at det er %(max)s eller færre tall før desimalpunkt." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Filendelsen \"%(extension)s\" er ikke tillatt. Tillatte filendelser er: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null-tegn er ikke tillatt." - -msgid "and" -msgstr "og" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s med denne %(field_labels)s finnes allerede." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Begrensning \"%(name)s\" er brutt." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Verdien %(value)r er ikke et gyldig valg." - -msgid "This field cannot be null." -msgstr "Feltet kan ikke være tomt." - -msgid "This field cannot be blank." -msgstr "Feltet kan ikke være blankt." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s med %(field_label)s finnes allerede." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s må være unik for %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Felt av typen: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "\"%(value)s\"-verdien må være enten True eller False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\"-verdien må være enten True, False, eller None." - -msgid "Boolean (Either True or False)" -msgstr "Boolsk (True eller False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Tekst (opp til %(max_length)s tegn)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Heltall adskilt med komma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"\"%(value)s\"-verdien har et ugyldig datoformat. Det må være på formen YYYY-" -"MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"\"%(value)s\"-verdien er på den korrekte formen (YYYY-MM-DD), men det er en " -"ugyldig dato." - -msgid "Date (without time)" -msgstr "Dato (uten tid)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"\"%(value)s\"-verdien har et ugyldig datoformat. Det må være på formen YYYY-" -"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"\"%(value)s\"-verdien er på den korrekte formen (YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]), men er ugyldig dato/tid." - -msgid "Date (with time)" -msgstr "Dato (med tid)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "\"%(value)s\"-verdien må være et desimaltall." - -msgid "Decimal number" -msgstr "Desimaltall" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"\"%(value)s\"-verdien har et ugyldig format. Det må være på formen [DD] [HH:" -"[MM:]]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Varighet" - -msgid "Email address" -msgstr "E-postadresse" - -msgid "File path" -msgstr "Filsti" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Verdien \"%(value)s\" må være et flyttall." - -msgid "Floating point number" -msgstr "Flyttall" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "\"%(value)s\"-verdien må være et heltall." - -msgid "Integer" -msgstr "Heltall" - -msgid "Big (8 byte) integer" -msgstr "Stort (8 byte) heltall" - -msgid "Small integer" -msgstr "Lite heltall" - -msgid "IPv4 address" -msgstr "IPv4-adresse" - -msgid "IP address" -msgstr "IP-adresse" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Verdien \"%(value)s\" må være enten None, True eller False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolsk (True, False eller None)" - -msgid "Positive big integer" -msgstr "Positivt stort heltall" - -msgid "Positive integer" -msgstr "Positivt heltall" - -msgid "Positive small integer" -msgstr "Positivt lite heltall" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (opp til %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"\"%(value)s\"-verdien har et ugyldig format. Det må være på formen HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Verdien \"%(value)s\" har riktig format (HH:MM[:ss[.uuuuuu]]), men er ikke " -"et gyldig klokkeslett." - -msgid "Time" -msgstr "Tid" - -msgid "URL" -msgstr "Nettadresse" - -msgid "Raw binary data" -msgstr "Rå binærdata" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" er ikke en gyldig UUID." - -msgid "Universally unique identifier" -msgstr "Universelt unik identifikator" - -msgid "File" -msgstr "Fil" - -msgid "Image" -msgstr "Bilde" - -msgid "A JSON object" -msgstr "Et JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Verdi må være gyldig JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s-instansen med %(field)s %(value)r finnes ikke." - -msgid "Foreign Key (type determined by related field)" -msgstr "Fremmednøkkel (type bestemmes av relatert felt)" - -msgid "One-to-one relationship" -msgstr "En-til-en-relasjon" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-relasjon" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-relasjoner" - -msgid "Many-to-many relationship" -msgstr "Mange-til-mange-relasjon" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Feltet er påkrevet." - -msgid "Enter a whole number." -msgstr "Oppgi et heltall." - -msgid "Enter a valid date." -msgstr "Oppgi en gyldig dato." - -msgid "Enter a valid time." -msgstr "Oppgi et gyldig tidspunkt." - -msgid "Enter a valid date/time." -msgstr "Oppgi gyldig dato og tidspunkt." - -msgid "Enter a valid duration." -msgstr "Oppgi en gyldig varighet." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Antall dager må være mellom {min_days} og {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ingen fil ble sendt. Sjekk «encoding»-typen på skjemaet." - -msgid "No file was submitted." -msgstr "Ingen fil ble sendt." - -msgid "The submitted file is empty." -msgstr "Filen er tom." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "Sørg for at filnavnet har %(max)d tegn (det har nå %(length)d)." -msgstr[1] "" -"Sørg for at filnavnet har færre enn %(max)d tegn (det har nå %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Vennligst last opp en ny fil eller marker fjern-boksen, ikke begge." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Last opp et gyldig bilde. Filen du lastet opp var ødelagt eller ikke et " -"bilde." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Velg et gyldig valg. %(value)s er ikke et av de tilgjengelige valgene." - -msgid "Enter a list of values." -msgstr "Oppgi en liste med verdier." - -msgid "Enter a complete value." -msgstr "Skriv inn en fullstendig verdi." - -msgid "Enter a valid UUID." -msgstr "Oppgi en gyldig UUID." - -msgid "Enter a valid JSON." -msgstr "Oppgi gyldig JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skjult felt %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-data mangler eller har blitt tuklet med. Felt som mangler: " -"%(field_names)s. Du må muligens rapportere en bug hvis problemet vedvarer." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Vennligst send inn maks %(num)d skjema." -msgstr[1] "Vennligst send inn maks %(num)d skjemaer." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Vennligst send inn minst %(num)d skjema." -msgstr[1] "Vennligst send inn minst %(num)d skjemaer." - -msgid "Order" -msgstr "Rekkefølge" - -msgid "Delete" -msgstr "Slett" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Vennligst korriger dupliserte data for %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Vennligst korriger dupliserte data for %(field)s, som må være unike." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Vennligst korriger dupliserte data for %(field_name)s, som må være unike for " -"%(lookup)s i %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Vennligst korriger de dupliserte verdiene nedenfor." - -msgid "The inline value did not match the parent instance." -msgstr "Inline-verdien var ikke i samsvar med foreldre-instansen." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Velg et gyldig valg. Valget er ikke av de tilgjengelige valgene." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" er ikke en gyldig verdi." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kunne ikke tolkes i tidssonen %(current_timezone)s, det kan " -"være tvetydig eller ikke eksistere." - -msgid "Clear" -msgstr "Fjern" - -msgid "Currently" -msgstr "Nåværende" - -msgid "Change" -msgstr "Endre" - -msgid "Unknown" -msgstr "Ukjent" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nei" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nei,kanskje" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d byte" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "midnatt" - -msgid "noon" -msgstr "12:00" - -msgid "Monday" -msgstr "mandag" - -msgid "Tuesday" -msgstr "tirsdag" - -msgid "Wednesday" -msgstr "onsdag" - -msgid "Thursday" -msgstr "torsdag" - -msgid "Friday" -msgstr "fredag" - -msgid "Saturday" -msgstr "lørdag" - -msgid "Sunday" -msgstr "søndag" - -msgid "Mon" -msgstr "man" - -msgid "Tue" -msgstr "tir" - -msgid "Wed" -msgstr "ons" - -msgid "Thu" -msgstr "tor" - -msgid "Fri" -msgstr "fre" - -msgid "Sat" -msgstr "lør" - -msgid "Sun" -msgstr "søn" - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "mai" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "desember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "des" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "apr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "jun." - -msgctxt "abbrev. month" -msgid "July" -msgstr "jul." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "des." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "Mars" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Juli" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Desember" - -msgid "This is not a valid IPv6 address." -msgstr "Dette er ikke en gyldig IPv6-adresse." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "eller" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d måned" -msgstr[1] "%(num)d måneder" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d uke" -msgstr[1] "%(num)d uker" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dager" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timer" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutt" -msgstr[1] "%(num)d minutter" - -msgid "Forbidden" -msgstr "Forbudt" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verifisering feilet. Forespørsel avbrutt." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Du ser denne meldingen fordi dette HTTPS-nettstedet krever en 'Referer'-" -"header til å bli sendt av nettleseren, men ingen ble sendt. Denne headeren " -"er nødvendig av sikkerhetsmessige årsaker, for å sikre at nettleseren din " -"ikke blir kapret av tredjeparter." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Hvis du har konfigurert nettleseren din til å deaktivere 'Referer'-headers, " -"kan du aktivere dem, i hvert fall for dette nettstedet, eller for HTTPS-" -"tilkoblinger, eller for 'same-origin'-forespørsler." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Hvis du bruker -taggen eller " -"inkluderer 'Referrer-Policy: no-referrer'-header, vennligst fjern dem. CSRF-" -"beskyttelsen krever 'Referer'-headeren for å utføre streng kontroll av " -"referanser. Hvis du er bekymret for personvern, bruk alternativer som for koblinger til tredjeparts nettsteder." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Du ser denne meldingen fordi denne nettsiden krever en CSRF-cookie når du " -"sender inn skjemaer. Denne informasjonskapselen er nødvendig av " -"sikkerhetsmessige årsaker, for å sikre at nettleseren din ikke blir kapret " -"av tredjeparter." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Hvis du har konfigurert nettleseren din til å deaktivere " -"informasjonskapsler, kan du aktivere dem, i hvert fall for dette nettstedet, " -"eller for 'same-origin'-forespørsler." - -msgid "More information is available with DEBUG=True." -msgstr "Mer informasjon er tilgjengelig med DEBUG=True." - -msgid "No year specified" -msgstr "År ikke spesifisert" - -msgid "Date out of range" -msgstr "Date utenfor rekkevidde" - -msgid "No month specified" -msgstr "Måned ikke spesifisert" - -msgid "No day specified" -msgstr "Dag ikke spesifisert" - -msgid "No week specified" -msgstr "Uke ikke spesifisert" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ingen %(verbose_name_plural)s tilgjengelig" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Fremtidig %(verbose_name_plural)s ikke tilgjengelig fordi %(class_name)s." -"allow_future er False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ugyldig datostreng \"%(datestr)s\" gitt formatet \"%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Fant ingen %(verbose_name)s som passet spørringen" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Siden er ikke \"last\", og kan heller ikke konverteres til et heltall." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ugyldig side (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tom liste og \"%(class_name)s.allow_empty\" er False." - -msgid "Directory indexes are not allowed here." -msgstr "Mappeinnhold er ikke tillatt her." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" finnes ikke" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Innhold i %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Installasjonen var vellykket! Gratulerer!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Se produktmerknader for Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Du ser denne siden fordi DEBUG=True er i din Django-innstillingsfil og du ikke " -"har konfigurert noen URL-er." - -msgid "Django Documentation" -msgstr "Django-dokumentasjon" - -msgid "Topics, references, & how-to’s" -msgstr "Temaer, referanser & how-tos" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: en polling-app" - -msgid "Get started with Django" -msgstr "Kom i gang med Django" - -msgid "Django Community" -msgstr "Django nettsamfunn" - -msgid "Connect, get help, or contribute" -msgstr "Koble, få hjelp eller bidra" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nb/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/nb/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nb/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/nb/formats.py deleted file mode 100644 index 0ddb8fe..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/nb/formats.py +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - # "%d. %b %Y", # '25. okt 2006' - # "%d %b %Y", # '25 okt 2006' - # "%d. %b. %Y", # '25. okt. 2006' - # "%d %b. %Y", # '25 okt. 2006' - # "%d. %B %Y", # '25. oktober 2006' - # "%d %B %Y", # '25 oktober 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ne/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index 2a10814..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ne/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index 6882466..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,1253 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Jannis Leidel , 2014 -# Paras Nath Chaudhary , 2012 -# Sagar Chalise , 2011-2012,2015,2018 -# Sagar Chalise , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "अफ्रिकन" - -msgid "Arabic" -msgstr "अरबिक" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "अस्टुरियन" - -msgid "Azerbaijani" -msgstr "अजरबैजानी" - -msgid "Bulgarian" -msgstr "बुल्गेरियाली" - -msgid "Belarusian" -msgstr "बेलारुसियन" - -msgid "Bengali" -msgstr "बंगाली" - -msgid "Breton" -msgstr "ब्रेटोन" - -msgid "Bosnian" -msgstr "बोस्नियाली" - -msgid "Catalan" -msgstr "क्याटालान" - -msgid "Czech" -msgstr "चेक" - -msgid "Welsh" -msgstr "वेल्स" - -msgid "Danish" -msgstr "डेनिस" - -msgid "German" -msgstr "जर्मन" - -msgid "Lower Sorbian" -msgstr "तल्लो सोर्बियन" - -msgid "Greek" -msgstr "ग्रिक" - -msgid "English" -msgstr "अंग्रेजी" - -msgid "Australian English" -msgstr "अस्ट्रेलियाली अंग्रेजी" - -msgid "British English" -msgstr "बेलायती अंग्रेजी" - -msgid "Esperanto" -msgstr "इस्परा्न्तो" - -msgid "Spanish" -msgstr "स्पेनिस" - -msgid "Argentinian Spanish" -msgstr "अर्जेन्टिनाली स्पेनिस" - -msgid "Colombian Spanish" -msgstr "कोलम्बियाली स्पेनिस" - -msgid "Mexican Spanish" -msgstr "मेक्सिकन स्पेनिस" - -msgid "Nicaraguan Spanish" -msgstr "निकारागुँवा स्पेनिस" - -msgid "Venezuelan Spanish" -msgstr "भेनेजुएला स्पेनिस" - -msgid "Estonian" -msgstr "इस्टोनियन" - -msgid "Basque" -msgstr "बास्क" - -msgid "Persian" -msgstr "फारसी" - -msgid "Finnish" -msgstr "फिन्निस" - -msgid "French" -msgstr "फ्रान्सेली" - -msgid "Frisian" -msgstr "फ्रिसियन" - -msgid "Irish" -msgstr "आयरिस" - -msgid "Scottish Gaelic" -msgstr "स्कटीस गैलिक" - -msgid "Galician" -msgstr "ग्यलिसियन" - -msgid "Hebrew" -msgstr "हिब्रु" - -msgid "Hindi" -msgstr "हिन्दि " - -msgid "Croatian" -msgstr "क्रोषियन" - -msgid "Upper Sorbian" -msgstr "माथिल्लो सोर्बियन " - -msgid "Hungarian" -msgstr "हन्गेरियन" - -msgid "Armenian" -msgstr "अर्मेनियन" - -msgid "Interlingua" -msgstr "ईन्टरलिन्गुवा" - -msgid "Indonesian" -msgstr "इन्डोनेसियाली" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "आइडु" - -msgid "Icelandic" -msgstr "आइसल्यान्डिक" - -msgid "Italian" -msgstr "ईटालियन" - -msgid "Japanese" -msgstr "जापनिज" - -msgid "Georgian" -msgstr "जर्जीयन" - -msgid "Kabyle" -msgstr "कबायल" - -msgid "Kazakh" -msgstr "कजाक" - -msgid "Khmer" -msgstr "ख्मेर" - -msgid "Kannada" -msgstr "कन्नड" - -msgid "Korean" -msgstr "कोरियाली" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "लक्जेमबर्गेली" - -msgid "Lithuanian" -msgstr "लिथुवानियाली" - -msgid "Latvian" -msgstr "लाट्भियन" - -msgid "Macedonian" -msgstr "म्यासेडोनियन" - -msgid "Malayalam" -msgstr "मलायलम" - -msgid "Mongolian" -msgstr "मंगोलियन" - -msgid "Marathi" -msgstr "मराठी" - -msgid "Burmese" -msgstr "बर्मेली" - -msgid "Norwegian Bokmål" -msgstr "नर्वे बक्मल" - -msgid "Nepali" -msgstr "नेपाली" - -msgid "Dutch" -msgstr "डच" - -msgid "Norwegian Nynorsk" -msgstr "नर्वेली न्योर्स्क" - -msgid "Ossetic" -msgstr "ओसेटिक" - -msgid "Punjabi" -msgstr "पञ्जावी" - -msgid "Polish" -msgstr "पोलिस" - -msgid "Portuguese" -msgstr "पुर्तगाली" - -msgid "Brazilian Portuguese" -msgstr "ब्राजिली पुर्तगाली" - -msgid "Romanian" -msgstr "रोमानियाली" - -msgid "Russian" -msgstr "रुसी" - -msgid "Slovak" -msgstr "सलोभाक" - -msgid "Slovenian" -msgstr "स्लोभेनियाली" - -msgid "Albanian" -msgstr "अल्बानियाली" - -msgid "Serbian" -msgstr "सर्वियाली" - -msgid "Serbian Latin" -msgstr "सर्वियाली ल्याटिन" - -msgid "Swedish" -msgstr "स्विडिस" - -msgid "Swahili" -msgstr "स्वाहिली" - -msgid "Tamil" -msgstr "तामिल" - -msgid "Telugu" -msgstr "तेलुगु" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "थाई" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "टर्किस" - -msgid "Tatar" -msgstr "टाटर" - -msgid "Udmurt" -msgstr "उद्मुर्ट" - -msgid "Ukrainian" -msgstr "युक्रेनि" - -msgid "Urdu" -msgstr "उर्दु" - -msgid "Uzbek" -msgstr "उज्बेक" - -msgid "Vietnamese" -msgstr "भियतनामी" - -msgid "Simplified Chinese" -msgstr "सरल चिनि" - -msgid "Traditional Chinese" -msgstr "प्राचिन चिनि" - -msgid "Messages" -msgstr "सुचनाहरु" - -msgid "Site Maps" -msgstr "साइट म्याप्स" - -msgid "Static Files" -msgstr "स्टेेटिक फाइलहरु" - -msgid "Syndication" -msgstr "सिन्डिकेसन" - -msgid "That page number is not an integer" -msgstr "पृष्ठ नं अंक होइन ।" - -msgid "That page number is less than 1" -msgstr "पृष्ठ नं १ भन्दा कम भयो ।" - -msgid "That page contains no results" -msgstr "पृष्ठमा नतिजा छैन ।" - -msgid "Enter a valid value." -msgstr "उपयुक्त मान राख्नुहोस ।" - -msgid "Enter a valid URL." -msgstr "उपयुक्त URL राख्नुहोस ।" - -msgid "Enter a valid integer." -msgstr "उपयुक्त अंक राख्नुहोस ।" - -msgid "Enter a valid email address." -msgstr "सही ई-मेल ठेगाना राख्नु होस ।" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "उपयुक्त IPv4 ठेगाना राख्नुहोस" - -msgid "Enter a valid IPv6 address." -msgstr "उपयुक्त IPv6 ठेगाना राख्नुहोस ।" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "उपयुक्त IPv4 वा IPv6 ठेगाना राख्नुहोस ।" - -msgid "Enter only digits separated by commas." -msgstr "कम्मा सहितका वर्ण मात्र राख्नुहोस ।" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "यो मान %(limit_value)s छ भन्ने निश्चित गर्नुहोस । (यो %(show_value)s हो ।)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "यो मान %(limit_value)s भन्दा कम अथवा बराबर छ भन्ने निश्चित गर्नुहोस ।" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "यो मान %(limit_value)s भन्दा बढी अथवा बराबर छ भन्ने निशचित गर्नुहोस ।" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"यो मान कम्तिमा पनि %(limit_value)d अक्षर छ भन्ने निश्चित गर्नुहोस । (यसमा " -"%(show_value)d छ ।)" -msgstr[1] "" -"यो मान कम्तिमा पनि %(limit_value)d अक्षरहरु छ भन्ने निश्चित गर्नुहोस । (यसमा " -"%(show_value)d छ ।)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"यो मान बढिमा पनि %(limit_value)d अक्षर छ भन्ने निश्चित गर्नुहोस । (यसमा " -"%(show_value)d छ ।)" -msgstr[1] "" -"यो मान बढिमा पनि %(limit_value)d अक्षरहरु छ भन्ने निश्चित गर्नुहोस । (यसमा " -"%(show_value)d छ ।)" - -msgid "Enter a number." -msgstr "संख्या राख्नुहोस ।" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "जम्मा %(max)s भन्दा बढी अक्षर नभएको निश्चित पार्नु होस ।" -msgstr[1] "जम्मा %(max)s भन्दा बढी अक्षरहरु नभएको निश्चित पार्नु होस ।" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "दशमलव पछि %(max)s भन्दा बढी अक्षर नभएको निश्चित पार्नु होस ।" -msgstr[1] "दशमलव पछि %(max)s भन्दा बढी अक्षरहरु नभएको निश्चित पार्नु होस ।" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "दशमलव अघि %(max)s भन्दा बढी अक्षर नभएको निश्चित पार्नु होस ।" -msgstr[1] "दशमलव अघि %(max)s भन्दा बढी अक्षरहरु नभएको निश्चित पार्नु होस ।" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "शून्य मान अनुमति छैन।" - -msgid "and" -msgstr "र" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s भएको %(model_name)s बनि सकेको छ । " - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r मान उपयुक्त छनोट होइन ।" - -msgid "This field cannot be null." -msgstr "यो फाँट शून्य हुन सक्दैन ।" - -msgid "This field cannot be blank." -msgstr "यो फाँट खाली हुन सक्दैन ।" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s भएको %(model_name)s पहिलै विद्धमान छ ।" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(date_field_label)s %(lookup_type)s को लागि %(field_label)s अनुपम हुनु पर्दछ ।" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "फाँटको प्रकार: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "बुलियन (True अथवा False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "वर्ण (%(max_length)s सम्म)" - -msgid "Comma-separated integers" -msgstr "कम्माले छुट्याइएका अंकहरु ।" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "मिति (समय रहित)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "मिति (समय सहित)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "दश्मलव संख्या" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "अवधि" - -msgid "Email address" -msgstr "ई-मेल ठेगाना" - -msgid "File path" -msgstr "फाइलको मार्ग" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "दश्मलव हुने संख्या" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "अंक" - -msgid "Big (8 byte) integer" -msgstr "ठूलो (८ बाइटको) अंक" - -msgid "IPv4 address" -msgstr "आइ.पी.भी४ ठेगाना" - -msgid "IP address" -msgstr "IP ठेगाना" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "बुलियन (True, False अथवा None)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "सकारात्मक पूर्णांक" - -msgid "Positive small integer" -msgstr "सानो जोड अङ्क" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "स्लग(%(max_length)s सम्म)" - -msgid "Small integer" -msgstr "सानो अङ्क" - -msgid "Text" -msgstr "पाठ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "समय" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "र बाइनरी डाटा" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "फाइल" - -msgid "Image" -msgstr "चित्र" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "फोरेन कि (प्रकार नातागत फाँटले जनाउछ)" - -msgid "One-to-one relationship" -msgstr "एक-देखि-एक नाता" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s सम्बन्ध" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s सम्बन्धहरु" - -msgid "Many-to-many relationship" -msgstr "अनेक-देखि-अनेक नाता" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "यो फाँट अनिवार्य छ ।" - -msgid "Enter a whole number." -msgstr "संख्या राख्नुहोस ।" - -msgid "Enter a valid date." -msgstr "उपयुक्त मिति राख्नुहोस ।" - -msgid "Enter a valid time." -msgstr "उपयुक्त समय राख्नुहोस ।" - -msgid "Enter a valid date/time." -msgstr "उपयुक्त मिति/समय राख्नुहोस ।" - -msgid "Enter a valid duration." -msgstr "उपयुक्त अवधि राख्नुहोस ।" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "दिन गन्ती {min_days} र {max_days} बीचमा हुनु पर्छ । " - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "कुनै फाईल पेश गरिएको छैन । फारममा ईनकोडिङको प्रकार जाँच गर्नुहोस । " - -msgid "No file was submitted." -msgstr "कुनै फाईल पेश गरिएको छैन ।" - -msgid "The submitted file is empty." -msgstr "पेश गरिएको फाइल खाली छ ।" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"यो फाइलको नाममा बाढीमा %(max)d अङ्क भएको निश्चित गर्नु होस । (यसमा %(length)d छ " -"।)" -msgstr[1] "" -"यो फाइलको नाममा बढी मा %(max)d अङ्कहरू भएको निश्चित गर्नु होस । (यसमा %(length)d " -"छ ।)" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "दुवै नछान्नुहोस, कि त फाइल पेश गर्नुहोस वा चेक बाकस मा छान्नुहोस ।" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"उपयुक्त चित्र अपलोड गर्नुहोस । तपाइले अपलोड गर्नु भएको फाइल चित्र होइन वा बिग्रेको चित्र " -"हो ।" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "उपयुक्त विकल्प छान्नुहोस । %(value)s प्रस्तावित विकल्प होइन ।" - -msgid "Enter a list of values." -msgstr "मानहरु राख्नुहोस" - -msgid "Enter a complete value." -msgstr "पुरा मान राख्नु होस ।" - -msgid "Enter a valid UUID." -msgstr "उपयुक्त UUID राख्नु होस ।" - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(लुकेका %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "म्यानेजमेन्ट फारम डाटा चलाइएको वा नभरेको पाइयो ।" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "कृपया %d अथवा सो भन्दा थोरै फारम बुझाउनु होस ।" -msgstr[1] "कृपया %d अथवा सो भन्दा थोरै फारमहरु बुझाउनु होस ।" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "कृपया %d अथवा सो भन्दा धेरै फारम बुझाउनु होस ।" -msgstr[1] "कृपया %d अथवा सो भन्दा धेरै फारमहरु बुझाउनु होस ।" - -msgid "Order" -msgstr "क्रम" - -msgid "Delete" -msgstr "मेट्नुहोस" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "कृपया %(field)s का लागि दोहोरिइका तथ्याङ्कहरु सच्याउनुहोस ।" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "कृपया %(field)s का लागि दोहोरिइका तथ्याङ्कहरु नौलो तथ्याङ्क सहित सच्याउनुहोस ।" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"कृपया %(field_name)s का लागि दोहोरिइका तथ्याङ्कहरु सच्याउनुहोस जसमा " -"%(date_field)sको %(lookup)s नौलो हुनुपर्दछ ।" - -msgid "Please correct the duplicate values below." -msgstr "कृपया तलका दोहोरिइका मानहरु सच्याउनुहोस ।" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "उपयुक्त विकल्प छान्नुहोस । छानिएको विकल्प प्रस्तावित विकल्प होइन ।" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "सबै खाली गर्नु होस ।" - -msgid "Currently" -msgstr "अहिले" - -msgid "Change" -msgstr "फेर्नुहोस" - -msgid "Unknown" -msgstr "अज्ञात" - -msgid "Yes" -msgstr "हुन्छ" - -msgid "No" -msgstr "होइन" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "हो,होइन,सायद" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d बाइट" -msgstr[1] "%(size)d बाइटहरु" - -#, python-format -msgid "%s KB" -msgstr "%s किलोबाइट" - -#, python-format -msgid "%s MB" -msgstr "%s मेगाबाइट" - -#, python-format -msgid "%s GB" -msgstr "%s गिगाबाइट" - -#, python-format -msgid "%s TB" -msgstr "%s टेराबाइट" - -#, python-format -msgid "%s PB" -msgstr "%s पिटाबाइट" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "मध्यरात" - -msgid "noon" -msgstr "मध्यान्ह" - -msgid "Monday" -msgstr "सोमवार" - -msgid "Tuesday" -msgstr "मंगलवार" - -msgid "Wednesday" -msgstr "बुधवार" - -msgid "Thursday" -msgstr "बिहीवार" - -msgid "Friday" -msgstr "शुक्रवार" - -msgid "Saturday" -msgstr "शनिवार" - -msgid "Sunday" -msgstr "आइतवार" - -msgid "Mon" -msgstr "सोम" - -msgid "Tue" -msgstr "मंगल" - -msgid "Wed" -msgstr "बुध" - -msgid "Thu" -msgstr "बिहि" - -msgid "Fri" -msgstr "शुक्र" - -msgid "Sat" -msgstr "शनि" - -msgid "Sun" -msgstr "आइत" - -msgid "January" -msgstr "जनवरी" - -msgid "February" -msgstr "फेब्रुअरी" - -msgid "March" -msgstr "मार्च" - -msgid "April" -msgstr "अप्रिल" - -msgid "May" -msgstr "मई" - -msgid "June" -msgstr "जुन" - -msgid "July" -msgstr "जुलै" - -msgid "August" -msgstr "अगस्त" - -msgid "September" -msgstr "सेप्टेम्बर" - -msgid "October" -msgstr "अक्टुवर" - -msgid "November" -msgstr "नभम्वर" - -msgid "December" -msgstr "डिसम्वर" - -msgid "jan" -msgstr "जनवरी" - -msgid "feb" -msgstr "फेब्रुअरी" - -msgid "mar" -msgstr "मार्च" - -msgid "apr" -msgstr "अप्रिल" - -msgid "may" -msgstr "मई" - -msgid "jun" -msgstr "जुन" - -msgid "jul" -msgstr "जुलै" - -msgid "aug" -msgstr "अग्सत" - -msgid "sep" -msgstr "सेप्तेम्बर" - -msgid "oct" -msgstr "अक्टुवर" - -msgid "nov" -msgstr "नभम्वर" - -msgid "dec" -msgstr "डिसम्वर" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "जनवरी" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "फेब्रुअरी" - -msgctxt "abbrev. month" -msgid "March" -msgstr "मार्च" - -msgctxt "abbrev. month" -msgid "April" -msgstr "अप्रिल" - -msgctxt "abbrev. month" -msgid "May" -msgstr "मई" - -msgctxt "abbrev. month" -msgid "June" -msgstr "जुन" - -msgctxt "abbrev. month" -msgid "July" -msgstr "जुलै" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "अगस्त" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "सेप्तेम्बर" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "अक्टुवर" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "नभम्वर" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "डिसम्वर" - -msgctxt "alt. month" -msgid "January" -msgstr "जनवरी" - -msgctxt "alt. month" -msgid "February" -msgstr "फेब्रुअरी" - -msgctxt "alt. month" -msgid "March" -msgstr "मार्च" - -msgctxt "alt. month" -msgid "April" -msgstr "अप्रिल" - -msgctxt "alt. month" -msgid "May" -msgstr "मई" - -msgctxt "alt. month" -msgid "June" -msgstr "जुन" - -msgctxt "alt. month" -msgid "July" -msgstr "जुलै" - -msgctxt "alt. month" -msgid "August" -msgstr "अगस्त" - -msgctxt "alt. month" -msgid "September" -msgstr "सेप्टेम्बर" - -msgctxt "alt. month" -msgid "October" -msgstr "अक्टुवर" - -msgctxt "alt. month" -msgid "November" -msgstr "नभम्वर" - -msgctxt "alt. month" -msgid "December" -msgstr "डिसम्वर" - -msgid "This is not a valid IPv6 address." -msgstr "यो उपयुक्त IPv6 ठेगाना होइन ।" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "अथवा" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d वर्ष" -msgstr[1] "%d वर्षहरु" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d महिना" -msgstr[1] "%d महिनाहरु" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d सप्ताह" -msgstr[1] "%d सप्ताहहरु" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d दिन" -msgstr[1] "%d दिनहरु" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d घण्टा" -msgstr[1] "%d घण्टाहरु" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d मिनट" -msgstr[1] "%d मिनटहरु" - -msgid "Forbidden" -msgstr "निषेधित" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF प्रमाणीकरण भएन । अनुरोध विफल ।" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "DEBUG=True ले ज्यादा सुचना प्रदान गर्दछ ।" - -msgid "No year specified" -msgstr "साल तोकिएको छैन ।" - -msgid "Date out of range" -msgstr "मिति मिलेन ।" - -msgid "No month specified" -msgstr "महिना तोकिएको छैन ।" - -msgid "No day specified" -msgstr "दिन तोकिएको छैन ।" - -msgid "No week specified" -msgstr "साता तोकिएको छैन ।" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s उपलब्ध छैन ।" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(class_name)s.allow_future 'False' हुनाले आगामी %(verbose_name_plural)s उपलब्ध " -"छैन ।" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "%(verbose_name)s भेटिएन ।" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "रद्द पृष्ठ (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "डाइरेक्टरी इन्डेक्सहरु यहाँ अनुमति छैन ।" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s को सूची" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "ज्याङ्गो : वेब साइट र एप्लिकेसन बनाउन सहयोगी औजार " - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"ज्याङ्गो %(version)s को परिवर्तन तथा विशेषता यहाँ हेर्नु होस" - -msgid "The install worked successfully! Congratulations!" -msgstr "बधाई छ । स्थापना भएको छ ।" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "ज्याङ्गो दस्तावेज ।" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "मतदान एप उदाहरण " - -msgid "Get started with Django" -msgstr "ज्याङ्गो सुरु गर्नु होस ।" - -msgid "Django Community" -msgstr "ज्याङ्गो समुदाय" - -msgid "Connect, get help, or contribute" -msgstr "सहयोग अथवा योगदान गरी जोडिनु होस" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index c240c49..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index 11b7a97..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,1357 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bas Peschier , 2011,2013 -# Blue , 2011-2012 -# Bouke Haarsma , 2013 -# Claude Paroz , 2014 -# Erik Romijn , 2013 -# Evelijn Saaltink , 2016 -# Harro van der Klauw , 2011-2012 -# Ilja Maas , 2015 -# jaap3 , 2024 -# Jannis Leidel , 2011 -# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2011-2012,2014 -# Michiel Overtoom , 2014 -# Meteor0id, 2019-2020 -# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2014-2015 -# Tino de Bruijn , 2013 -# Tonnes , 2017,2019-2020,2022-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: jaap3 , 2024\n" -"Language-Team: Dutch (http://app.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabisch" - -msgid "Algerian Arabic" -msgstr "Algerijns Arabisch" - -msgid "Asturian" -msgstr "Asturisch" - -msgid "Azerbaijani" -msgstr "Azerbeidzjaans" - -msgid "Bulgarian" -msgstr "Bulgaars" - -msgid "Belarusian" -msgstr "Wit-Russisch" - -msgid "Bengali" -msgstr "Bengaals" - -msgid "Breton" -msgstr "Bretons" - -msgid "Bosnian" -msgstr "Bosnisch" - -msgid "Catalan" -msgstr "Catalaans" - -msgid "Central Kurdish (Sorani)" -msgstr "Centraal-Koerdisch (Sorani)" - -msgid "Czech" -msgstr "Tsjechisch" - -msgid "Welsh" -msgstr "Welsh" - -msgid "Danish" -msgstr "Deens" - -msgid "German" -msgstr "Duits" - -msgid "Lower Sorbian" -msgstr "Nedersorbisch" - -msgid "Greek" -msgstr "Grieks" - -msgid "English" -msgstr "Engels" - -msgid "Australian English" -msgstr "Australisch-Engels" - -msgid "British English" -msgstr "Brits-Engels" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spaans" - -msgid "Argentinian Spanish" -msgstr "Argentijns Spaans" - -msgid "Colombian Spanish" -msgstr "Colombiaans Spaans" - -msgid "Mexican Spanish" -msgstr "Mexicaans Spaans" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguaans Spaans" - -msgid "Venezuelan Spanish" -msgstr "Venezolaans Spaans" - -msgid "Estonian" -msgstr "Ests" - -msgid "Basque" -msgstr "Baskisch" - -msgid "Persian" -msgstr "Perzisch" - -msgid "Finnish" -msgstr "Fins" - -msgid "French" -msgstr "Frans" - -msgid "Frisian" -msgstr "Fries" - -msgid "Irish" -msgstr "Iers" - -msgid "Scottish Gaelic" -msgstr "Schots-Gaelisch" - -msgid "Galician" -msgstr "Galicisch" - -msgid "Hebrew" -msgstr "Hebreeuws" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatisch" - -msgid "Upper Sorbian" -msgstr "Oppersorbisch" - -msgid "Hungarian" -msgstr "Hongaars" - -msgid "Armenian" -msgstr "Armeens" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesisch" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "IJslands" - -msgid "Italian" -msgstr "Italiaans" - -msgid "Japanese" -msgstr "Japans" - -msgid "Georgian" -msgstr "Georgisch" - -msgid "Kabyle" -msgstr "Kabylisch" - -msgid "Kazakh" -msgstr "Kazachs" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreaans" - -msgid "Kyrgyz" -msgstr "Kirgizisch" - -msgid "Luxembourgish" -msgstr "Luxemburgs" - -msgid "Lithuanian" -msgstr "Litouws" - -msgid "Latvian" -msgstr "Lets" - -msgid "Macedonian" -msgstr "Macedonisch" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongools" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Maleis" - -msgid "Burmese" -msgstr "Birmaans" - -msgid "Norwegian Bokmål" -msgstr "Noors Bokmål" - -msgid "Nepali" -msgstr "Nepalees" - -msgid "Dutch" -msgstr "Nederlands" - -msgid "Norwegian Nynorsk" -msgstr "Noors Nynorsk" - -msgid "Ossetic" -msgstr "Ossetisch" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Pools" - -msgid "Portuguese" -msgstr "Portugees" - -msgid "Brazilian Portuguese" -msgstr "Braziliaans Portugees" - -msgid "Romanian" -msgstr "Roemeens" - -msgid "Russian" -msgstr "Russisch" - -msgid "Slovak" -msgstr "Slovaaks" - -msgid "Slovenian" -msgstr "Sloveens" - -msgid "Albanian" -msgstr "Albanisch" - -msgid "Serbian" -msgstr "Servisch" - -msgid "Serbian Latin" -msgstr "Servisch Latijn" - -msgid "Swedish" -msgstr "Zweeds" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telegu" - -msgid "Tajik" -msgstr "Tadzjieks" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmeens" - -msgid "Turkish" -msgstr "Turks" - -msgid "Tatar" -msgstr "Tataars" - -msgid "Udmurt" -msgstr "Oedmoerts" - -msgid "Uyghur" -msgstr "Oeigoers" - -msgid "Ukrainian" -msgstr "Oekraïens" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Oezbeeks" - -msgid "Vietnamese" -msgstr "Vietnamees" - -msgid "Simplified Chinese" -msgstr "Vereenvoudigd Chinees" - -msgid "Traditional Chinese" -msgstr "Traditioneel Chinees" - -msgid "Messages" -msgstr "Berichten" - -msgid "Site Maps" -msgstr "Sitemaps" - -msgid "Static Files" -msgstr "Statische bestanden" - -msgid "Syndication" -msgstr "Syndicatie" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Dat paginanummer is geen geheel getal" - -msgid "That page number is less than 1" -msgstr "Dat paginanummer is kleiner dan 1" - -msgid "That page contains no results" -msgstr "Die pagina bevat geen resultaten" - -msgid "Enter a valid value." -msgstr "Voer een geldige waarde in." - -msgid "Enter a valid domain name." -msgstr "Voer een geldige domeinnaam in." - -msgid "Enter a valid URL." -msgstr "Voer een geldige URL in." - -msgid "Enter a valid integer." -msgstr "Voer een geldig geheel getal in." - -msgid "Enter a valid email address." -msgstr "Voer een geldig e-mailadres in." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Voer een geldige ‘slug’ in, bestaande uit letters, cijfers, liggende " -"streepjes en verbindingsstreepjes." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Voer een geldige ‘slug’ in, bestaande uit Unicode-letters, cijfers, liggende " -"streepjes en verbindingsstreepjes." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Voer een geldig %(protocol)s-adres in." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4- of IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Voer alleen cijfers in, gescheiden door komma's." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Zorg ervoor dat deze waarde gelijk is aan %(limit_value)s (het is nu " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Zorg ervoor dat deze waarde hoogstens %(limit_value)s is." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Zorg ervoor dat deze waarde minstens %(limit_value)s is." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Zorg ervoor dat deze waarde een veelvoud is van stapgrootte %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Zorg dat deze waarde een veelvoud is van stapgrootte %(limit_value)s, " -"beginnend bij %(offset)s, bv. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, enzovoort." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zorg dat deze waarde ten minste %(limit_value)d teken bevat (het zijn er nu " -"%(show_value)d)." -msgstr[1] "" -"Zorg dat deze waarde ten minste %(limit_value)d tekens bevat (het zijn er nu " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zorg dat deze waarde niet meer dan %(limit_value)d teken bevat (het zijn er " -"nu %(show_value)d)." -msgstr[1] "" -"Zorg dat deze waarde niet meer dan %(limit_value)d tekens bevat (het zijn er " -"nu %(show_value)d)." - -msgid "Enter a number." -msgstr "Voer een getal in." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Zorg dat er niet meer dan %(max)s cijfer is." -msgstr[1] "Zorg dat er niet meer dan %(max)s cijfers zijn." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Zorg dat er niet meer dan %(max)s cijfer achter de komma staat." -msgstr[1] "Zorg dat er niet meer dan %(max)s cijfers achter de komma staan." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Zorg dat er niet meer dan %(max)s cijfer voor de komma staat." -msgstr[1] "Zorg dat er niet meer dan %(max)s cijfers voor de komma staan." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Bestandsextensie ‘%(extension)s’ is niet toegestaan. Toegestane extensies " -"zijn: ‘%(allowed_extensions)s’." - -msgid "Null characters are not allowed." -msgstr "Null-tekens zijn niet toegestaan." - -msgid "and" -msgstr "en" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s met deze %(field_labels)s bestaat al." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Beperking ‘%(name)s’ is geschonden." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Waarde %(value)r is geen geldige keuze." - -msgid "This field cannot be null." -msgstr "Dit veld mag niet leeg zijn." - -msgid "This field cannot be blank." -msgstr "Dit veld kan niet leeg zijn" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Er bestaat al een %(model_name)s met eenzelfde %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s moet uniek zijn voor %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Veld van type: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Waarde van ‘%(value)s’ moet True of False zijn." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Waarde van ‘%(value)s’ moet True, False of None zijn." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (True of False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Tekenreeks (hooguit %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Tekenreeks (onbeperkt)" - -msgid "Comma-separated integers" -msgstr "Komma-gescheiden gehele getallen" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Waarde van ‘%(value)s’ heeft een ongeldige datumnotatie. De juiste notatie " -"is YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Waarde van ‘%(value)s’ heeft de juiste notatie (YYYY-MM-DD), maar het is een " -"ongeldige datum." - -msgid "Date (without time)" -msgstr "Datum (zonder tijd)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Waarde van ‘%(value)s’ heeft een ongeldige notatie. De juiste notatie is " -"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Waarde van ‘%(value)s’ heeft de juiste notatie (YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]), maar het is een ongeldige datum/tijd." - -msgid "Date (with time)" -msgstr "Datum (met tijd)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Waarde van ‘%(value)s’ moet een decimaal getal zijn." - -msgid "Decimal number" -msgstr "Decimaal getal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Waarde van ‘%(value)s’ heeft een ongeldige notatie. De juiste notatie is " -"[DD] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Tijdsduur" - -msgid "Email address" -msgstr "E-mailadres" - -msgid "File path" -msgstr "Bestandspad" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Waarde van ‘%(value)s’ moet een drijvende-kommagetal zijn." - -msgid "Floating point number" -msgstr "Drijvende-kommagetal" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Waarde van ‘%(value)s’ moet een geheel getal zijn." - -msgid "Integer" -msgstr "Geheel getal" - -msgid "Big (8 byte) integer" -msgstr "Groot (8 byte) geheel getal" - -msgid "Small integer" -msgstr "Klein geheel getal" - -msgid "IPv4 address" -msgstr "IPv4-adres" - -msgid "IP address" -msgstr "IP-adres" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Waarde van ‘%(value)s’ moet None, True of False zijn." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (True, False of None)" - -msgid "Positive big integer" -msgstr "Positief groot geheel getal" - -msgid "Positive integer" -msgstr "Positief geheel getal" - -msgid "Positive small integer" -msgstr "Positief klein geheel getal" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (max. lengte %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Waarde van ‘%(value)s’ heeft een ongeldige notatie. De juiste notatie is HH:" -"MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Waarde van ‘%(value)s’ heeft de juiste notatie (HH:MM[:ss[.uuuuuu]]), maar " -"het is een ongeldige tijd." - -msgid "Time" -msgstr "Tijd" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Onbewerkte binaire gegevens" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "‘%(value)s’ is geen geldige UUID." - -msgid "Universally unique identifier" -msgstr "Universally unique identifier" - -msgid "File" -msgstr "Bestand" - -msgid "Image" -msgstr "Afbeelding" - -msgid "A JSON object" -msgstr "Een JSON-object" - -msgid "Value must be valid JSON." -msgstr "Waarde moet geldige JSON zijn." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Refererende sleutel (type wordt bepaald door gerelateerde veld)" - -msgid "One-to-one relationship" -msgstr "Een-op-een-relatie" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-relatie" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-relaties" - -msgid "Many-to-many relationship" -msgstr "Veel-op-veel-relatie" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Dit veld is verplicht." - -msgid "Enter a whole number." -msgstr "Voer een geheel getal in." - -msgid "Enter a valid date." -msgstr "Voer een geldige datum in." - -msgid "Enter a valid time." -msgstr "Voer een geldige tijd in." - -msgid "Enter a valid date/time." -msgstr "Voer een geldige datum/tijd in." - -msgid "Enter a valid duration." -msgstr "Voer een geldige tijdsduur in." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Het aantal dagen moet tussen {min_days} en {max_days} liggen." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Er is geen bestand verstuurd. Controleer het coderingstype op het formulier." - -msgid "No file was submitted." -msgstr "Er is geen bestand verstuurd." - -msgid "The submitted file is empty." -msgstr "Het verstuurde bestand is leeg." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Zorg dat deze bestandsnaam niet meer dan %(max)d teken bevat (het zijn er nu " -"%(length)d)." -msgstr[1] "" -"Zorg dat deze bestandsnaam niet meer dan %(max)d tekens bevat (het zijn er " -"nu %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Upload een bestand of vink het vakje Wissen aan, niet allebei." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Upload een geldige afbeelding. Het geüploade bestand is geen of een " -"beschadigde afbeelding." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Selecteer een geldige keuze. %(value)s is geen beschikbare keuze." - -msgid "Enter a list of values." -msgstr "Voer een lijst met waarden in." - -msgid "Enter a complete value." -msgstr "Voer een volledige waarde in." - -msgid "Enter a valid UUID." -msgstr "Voer een geldige UUID in." - -msgid "Enter a valid JSON." -msgstr "Voer een geldige JSON in." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Verborgen veld %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-gegevens ontbreken of er is mee geknoeid. Ontbrekende velden: " -"%(field_names)s. Mogelijk dient u een bug te melden als het probleem " -"aanhoudt." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Verstuur maximaal %(num)d formulier." -msgstr[1] "Verstuur maximaal %(num)d formulieren." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Verstuur minimaal %(num)d formulier." -msgstr[1] "Verstuur minimaal %(num)d formulieren." - -msgid "Order" -msgstr "Volgorde" - -msgid "Delete" -msgstr "Verwijderen" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Corrigeer de dubbele gegevens voor %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Corrigeer de dubbele gegevens voor %(field)s, dat uniek moet zijn." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Corrigeer de dubbele gegevens voor %(field_name)s, dat uniek moet zijn voor " -"de %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Corrigeer de dubbele waarden hieronder." - -msgid "The inline value did not match the parent instance." -msgstr "De inline waarde komt niet overeen met de bovenliggende instantie." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Selecteer een geldige keuze. Deze keuze is niet beschikbaar." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "‘%(pk)s’ is geen geldige waarde." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kon niet worden geïnterpreteerd in tijdzone " -"%(current_timezone)s; mogelijk is deze dubbelzinnig of bestaat deze niet." - -msgid "Clear" -msgstr "Wissen" - -msgid "Currently" -msgstr "Huidige" - -msgid "Change" -msgstr "Wijzigen" - -msgid "Unknown" -msgstr "Onbekend" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nee" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nee,misschien" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "middernacht" - -msgid "noon" -msgstr "middag" - -msgid "Monday" -msgstr "maandag" - -msgid "Tuesday" -msgstr "dinsdag" - -msgid "Wednesday" -msgstr "woensdag" - -msgid "Thursday" -msgstr "donderdag" - -msgid "Friday" -msgstr "vrijdag" - -msgid "Saturday" -msgstr "zaterdag" - -msgid "Sunday" -msgstr "zondag" - -msgid "Mon" -msgstr "ma" - -msgid "Tue" -msgstr "di" - -msgid "Wed" -msgstr "wo" - -msgid "Thu" -msgstr "do" - -msgid "Fri" -msgstr "vr" - -msgid "Sat" -msgstr "za" - -msgid "Sun" -msgstr "zo" - -msgid "January" -msgstr "januari" - -msgid "February" -msgstr "februari" - -msgid "March" -msgstr "maart" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "mei" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "augustus" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mrt" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mei" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb" - -msgctxt "abbrev. month" -msgid "March" -msgstr "mrt" - -msgctxt "abbrev. month" -msgid "April" -msgstr "apr" - -msgctxt "abbrev. month" -msgid "May" -msgstr "mei" - -msgctxt "abbrev. month" -msgid "June" -msgstr "jun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "jul" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sep" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec" - -msgctxt "alt. month" -msgid "January" -msgstr "januari" - -msgctxt "alt. month" -msgid "February" -msgstr "februari" - -msgctxt "alt. month" -msgid "March" -msgstr "maart" - -msgctxt "alt. month" -msgid "April" -msgstr "april" - -msgctxt "alt. month" -msgid "May" -msgstr "mei" - -msgctxt "alt. month" -msgid "June" -msgstr "juni" - -msgctxt "alt. month" -msgid "July" -msgstr "juli" - -msgctxt "alt. month" -msgid "August" -msgstr "augustus" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "december" - -msgid "This is not a valid IPv6 address." -msgstr "Dit is geen geldig IPv6-adres." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "of" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d jaar" -msgstr[1] "%(num)d jaar" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d maand" -msgstr[1] "%(num)d maanden" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d week" -msgstr[1] "%(num)d weken" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagen" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uur" -msgstr[1] "%(num)d uur" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuut" -msgstr[1] "%(num)d minuten" - -msgid "Forbidden" -msgstr "Verboden" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verificatie mislukt. Aanvraag afgebroken." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"U ziet deze melding, omdat deze HTTPS-website vereist dat uw webbrowser een " -"‘Referer header’ meestuurt, maar deze ontbreekt. Deze header is om " -"veiligheidsredenen vereist om er zeker van te zijn dat uw browser niet door " -"derden wordt gekaapt." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Als u ‘Referer’-headers in uw browser hebt uitgeschakeld, schakel deze dan " -"weer in, op zijn minst voor deze website, of voor HTTPS-verbindingen, of " -"voor ‘same-origin’-aanvragen." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Als u de tag gebruikt of de " -"header ‘Referrer-Policy: no-referrer’ opneemt, verwijder deze dan. De CSRF-" -"bescherming vereist de ‘Referer’-header voor strenge referer-controle. Als u " -"bezorgd bent om privacy, gebruik dan alternatieven zoals voor koppelingen naar websites van derden." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"U ziet deze melding, omdat deze website vereist dat een CSRF-cookie wordt " -"meegestuurd bij het verzenden van formulieren. Dit cookie is om " -"veiligheidsredenen vereist om er zeker van te zijn dat uw browser niet door " -"derden wordt gekaapt." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Als u cookies in uw webbrowser hebt uitgeschakeld, schakel deze dan weer in, " -"op zijn minst voor deze website, of voor ‘same-origin’-aanvragen." - -msgid "More information is available with DEBUG=True." -msgstr "Meer informatie is beschikbaar met DEBUG=True." - -msgid "No year specified" -msgstr "Geen jaar opgegeven" - -msgid "Date out of range" -msgstr "Datum buiten bereik" - -msgid "No month specified" -msgstr "Geen maand opgegeven" - -msgid "No day specified" -msgstr "Geen dag opgegeven" - -msgid "No week specified" -msgstr "Geen week opgegeven" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Geen %(verbose_name_plural)s beschikbaar" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Geen toekomstige %(verbose_name_plural)s beschikbaar, omdat %(class_name)s." -"allow_future de waarde False (Onwaar) heeft." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ongeldige datumtekst ‘%(datestr)s’ op basis van notatie ‘%(format)s’" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Geen %(verbose_name)s gevonden die voldoet aan de query" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Pagina is niet ‘last’ en kan ook niet naar een geheel getal worden " -"geconverteerd." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ongeldige pagina (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lege lijst en ‘%(class_name)s.allow_empty’ is False." - -msgid "Directory indexes are not allowed here." -msgstr "Directoryindexen zijn hier niet toegestaan." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "‘%(path)s’ bestaat niet" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index van %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "De installatie is gelukt! Gefeliciteerd!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Uitgaveopmerkingen voor Django " -"%(version)s weergeven" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"U ziet deze pagina, omdat uw instellingenbestand DEBUG=True bevat en u geen URL's hebt geconfigureerd." - -msgid "Django Documentation" -msgstr "Django-documentatie" - -msgid "Topics, references, & how-to’s" -msgstr "Onderwerpen, referenties en instructies" - -msgid "Tutorial: A Polling App" -msgstr "Handleiding: een app voor peilingen" - -msgid "Get started with Django" -msgstr "Aan de slag met Django" - -msgid "Django Community" -msgstr "Django-gemeenschap" - -msgid "Connect, get help, or contribute" -msgstr "Contact met anderen, hulp verkrijgen of bijdragen" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nl/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/nl/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nl/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/nl/formats.py deleted file mode 100644 index e9f52b9..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/nl/formats.py +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" # '20 januari 2009' -TIME_FORMAT = "H:i" # '15:23' -DATETIME_FORMAT = "j F Y H:i" # '20 januari 2009 15:23' -YEAR_MONTH_FORMAT = "F Y" # 'januari 2009' -MONTH_DAY_FORMAT = "j F" # '20 januari' -SHORT_DATE_FORMAT = "j-n-Y" # '20-1-2009' -SHORT_DATETIME_FORMAT = "j-n-Y H:i" # '20-1-2009 15:23' -FIRST_DAY_OF_WEEK = 1 # Monday (in Dutch 'maandag') - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d-%m-%Y", # '20-01-2009' - "%d-%m-%y", # '20-01-09' - "%d/%m/%Y", # '20/01/2009' - "%d/%m/%y", # '20/01/09' - "%Y/%m/%d", # '2009/01/20' - # "%d %b %Y", # '20 jan 2009' - # "%d %b %y", # '20 jan 09' - # "%d %B %Y", # '20 januari 2009' - # "%d %B %y", # '20 januari 09' -] -# Kept ISO formats as one is in first position -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '15:23:35' - "%H:%M:%S.%f", # '15:23:35.000200' - "%H.%M:%S", # '15.23:35' - "%H.%M:%S.%f", # '15.23:35.000200' - "%H.%M", # '15.23' - "%H:%M", # '15:23' -] -DATETIME_INPUT_FORMATS = [ - # With time in %H:%M:%S : - "%d-%m-%Y %H:%M:%S", # '20-01-2009 15:23:35' - "%d-%m-%y %H:%M:%S", # '20-01-09 15:23:35' - "%Y-%m-%d %H:%M:%S", # '2009-01-20 15:23:35' - "%d/%m/%Y %H:%M:%S", # '20/01/2009 15:23:35' - "%d/%m/%y %H:%M:%S", # '20/01/09 15:23:35' - "%Y/%m/%d %H:%M:%S", # '2009/01/20 15:23:35' - # "%d %b %Y %H:%M:%S", # '20 jan 2009 15:23:35' - # "%d %b %y %H:%M:%S", # '20 jan 09 15:23:35' - # "%d %B %Y %H:%M:%S", # '20 januari 2009 15:23:35' - # "%d %B %y %H:%M:%S", # '20 januari 2009 15:23:35' - # With time in %H:%M:%S.%f : - "%d-%m-%Y %H:%M:%S.%f", # '20-01-2009 15:23:35.000200' - "%d-%m-%y %H:%M:%S.%f", # '20-01-09 15:23:35.000200' - "%Y-%m-%d %H:%M:%S.%f", # '2009-01-20 15:23:35.000200' - "%d/%m/%Y %H:%M:%S.%f", # '20/01/2009 15:23:35.000200' - "%d/%m/%y %H:%M:%S.%f", # '20/01/09 15:23:35.000200' - "%Y/%m/%d %H:%M:%S.%f", # '2009/01/20 15:23:35.000200' - # With time in %H.%M:%S : - "%d-%m-%Y %H.%M:%S", # '20-01-2009 15.23:35' - "%d-%m-%y %H.%M:%S", # '20-01-09 15.23:35' - "%d/%m/%Y %H.%M:%S", # '20/01/2009 15.23:35' - "%d/%m/%y %H.%M:%S", # '20/01/09 15.23:35' - # "%d %b %Y %H.%M:%S", # '20 jan 2009 15.23:35' - # "%d %b %y %H.%M:%S", # '20 jan 09 15.23:35' - # "%d %B %Y %H.%M:%S", # '20 januari 2009 15.23:35' - # "%d %B %y %H.%M:%S", # '20 januari 2009 15.23:35' - # With time in %H.%M:%S.%f : - "%d-%m-%Y %H.%M:%S.%f", # '20-01-2009 15.23:35.000200' - "%d-%m-%y %H.%M:%S.%f", # '20-01-09 15.23:35.000200' - "%d/%m/%Y %H.%M:%S.%f", # '20/01/2009 15.23:35.000200' - "%d/%m/%y %H.%M:%S.%f", # '20/01/09 15.23:35.000200' - # With time in %H:%M : - "%d-%m-%Y %H:%M", # '20-01-2009 15:23' - "%d-%m-%y %H:%M", # '20-01-09 15:23' - "%Y-%m-%d %H:%M", # '2009-01-20 15:23' - "%d/%m/%Y %H:%M", # '20/01/2009 15:23' - "%d/%m/%y %H:%M", # '20/01/09 15:23' - "%Y/%m/%d %H:%M", # '2009/01/20 15:23' - # "%d %b %Y %H:%M", # '20 jan 2009 15:23' - # "%d %b %y %H:%M", # '20 jan 09 15:23' - # "%d %B %Y %H:%M", # '20 januari 2009 15:23' - # "%d %B %y %H:%M", # '20 januari 2009 15:23' - # With time in %H.%M : - "%d-%m-%Y %H.%M", # '20-01-2009 15.23' - "%d-%m-%y %H.%M", # '20-01-09 15.23' - "%d/%m/%Y %H.%M", # '20/01/2009 15.23' - "%d/%m/%y %H.%M", # '20/01/09 15.23' - # "%d %b %Y %H.%M", # '20 jan 2009 15.23' - # "%d %b %y %H.%M", # '20 jan 09 15.23' - # "%d %B %Y %H.%M", # '20 januari 2009 15.23' - # "%d %B %y %H.%M", # '20 januari 2009 15.23' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index 7698eda..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index 04b872e..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1305 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# hgrimelid , 2011 -# Jannis Leidel , 2011 -# jensadne , 2013 -# Sigurd Gartmann , 2012 -# Sivert Olstad, 2021 -# velmont , 2012 -# Vibeke Uthaug, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-25 14:49+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabisk" - -msgid "Algerian Arabic" -msgstr "Arabisk (algersk)" - -msgid "Asturian" -msgstr "Asturiansk" - -msgid "Azerbaijani" -msgstr "Aserbajansk" - -msgid "Bulgarian" -msgstr "Bulgarsk" - -msgid "Belarusian" -msgstr "Kviterussisk" - -msgid "Bengali" -msgstr "Bengalsk" - -msgid "Breton" -msgstr "Bretonsk" - -msgid "Bosnian" -msgstr "Bosnisk" - -msgid "Catalan" -msgstr "Katalansk" - -msgid "Czech" -msgstr "Tsjekkisk" - -msgid "Welsh" -msgstr "Walisisk" - -msgid "Danish" -msgstr "Dansk" - -msgid "German" -msgstr "Tysk" - -msgid "Lower Sorbian" -msgstr "Lågsorbisk" - -msgid "Greek" -msgstr "Gresk" - -msgid "English" -msgstr "Engelsk" - -msgid "Australian English" -msgstr "Engelsk (australsk)" - -msgid "British English" -msgstr "Engelsk (britisk)" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spansk" - -msgid "Argentinian Spanish" -msgstr "Spansk (argentinsk)" - -msgid "Colombian Spanish" -msgstr "Spansk (kolombiansk)" - -msgid "Mexican Spanish" -msgstr "Spansk (meksikansk)" - -msgid "Nicaraguan Spanish" -msgstr "Spansk (nicaraguansk)" - -msgid "Venezuelan Spanish" -msgstr "Spansk (venezuelansk)" - -msgid "Estonian" -msgstr "Estisk" - -msgid "Basque" -msgstr "Baskisk" - -msgid "Persian" -msgstr "Persisk" - -msgid "Finnish" -msgstr "Finsk" - -msgid "French" -msgstr "Fransk" - -msgid "Frisian" -msgstr "Frisisk" - -msgid "Irish" -msgstr "Irsk" - -msgid "Scottish Gaelic" -msgstr "Skotsk-gaelisk" - -msgid "Galician" -msgstr "Galisisk" - -msgid "Hebrew" -msgstr "Hebraisk" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatisk" - -msgid "Upper Sorbian" -msgstr "Høgsorbisk" - -msgid "Hungarian" -msgstr "Ungarsk" - -msgid "Armenian" -msgstr "Armensk" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesisk" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandsk" - -msgid "Italian" -msgstr "Italiensk" - -msgid "Japanese" -msgstr "Japansk" - -msgid "Georgian" -msgstr "Georgisk" - -msgid "Kabyle" -msgstr "Kabylsk" - -msgid "Kazakh" -msgstr "Kasakhisk" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreansk" - -msgid "Kyrgyz" -msgstr "Kirgisisk" - -msgid "Luxembourgish" -msgstr "Luxembourgsk" - -msgid "Lithuanian" -msgstr "Litauisk" - -msgid "Latvian" -msgstr "Latvisk" - -msgid "Macedonian" -msgstr "Makedonsk" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolsk" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malayisk" - -msgid "Burmese" -msgstr "Burmesisk" - -msgid "Norwegian Bokmål" -msgstr "Norsk (bokmål)" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Nederlandsk" - -msgid "Norwegian Nynorsk" -msgstr "Norsk (nynorsk)" - -msgid "Ossetic" -msgstr "Ossetisk" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polsk" - -msgid "Portuguese" -msgstr "Portugisisk" - -msgid "Brazilian Portuguese" -msgstr "Brasiliansk portugisisk" - -msgid "Romanian" -msgstr "Rumensk" - -msgid "Russian" -msgstr "Russisk" - -msgid "Slovak" -msgstr "Slovakisk" - -msgid "Slovenian" -msgstr "Slovensk" - -msgid "Albanian" -msgstr "Albansk" - -msgid "Serbian" -msgstr "Serbisk" - -msgid "Serbian Latin" -msgstr "Serbisk latin" - -msgid "Swedish" -msgstr "Svensk" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tadsjikisk" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmensk" - -msgid "Turkish" -msgstr "Tyrkisk" - -msgid "Tatar" -msgstr "Tatarisk" - -msgid "Udmurt" -msgstr "Udmurtisk" - -msgid "Ukrainian" -msgstr "Ukrainsk" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Usbekisk" - -msgid "Vietnamese" -msgstr "Vietnamesisk" - -msgid "Simplified Chinese" -msgstr "Simplifisert kinesisk" - -msgid "Traditional Chinese" -msgstr "Tradisjonell kinesisk" - -msgid "Messages" -msgstr "Meldingar" - -msgid "Site Maps" -msgstr "Sidekart" - -msgid "Static Files" -msgstr "Statiske Filer" - -msgid "Syndication" -msgstr "Syndikering" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Sidenummeret er ikkje eit heiltal" - -msgid "That page number is less than 1" -msgstr "Sidenummeret er mindre enn 1" - -msgid "That page contains no results" -msgstr "Sida har ingen resultat" - -msgid "Enter a valid value." -msgstr "Oppgje ein gyldig verdi." - -msgid "Enter a valid URL." -msgstr "Oppgje ei gyldig nettadresse." - -msgid "Enter a valid integer." -msgstr "Oppgje eit gyldig heiltal." - -msgid "Enter a valid email address." -msgstr "Oppgje ei gyldig e-postadresse." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Oppgje ein gyldig \"slug\" som består av bokstavar, nummer, understrekar " -"eller bindestrekar." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Oppgje ein gyldig \"slug\" som består av Unicode bokstavar, nummer, " -"understrekar eller bindestrekar." - -msgid "Enter a valid IPv4 address." -msgstr "Oppgje ei gyldig IPv4-adresse." - -msgid "Enter a valid IPv6 address." -msgstr "Skriv inn ei gyldig IPv6-adresse." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Skriv inn ei gyldig IPv4- eller IPv6-adresse." - -msgid "Enter only digits separated by commas." -msgstr "Oppgje berre tall skild med komma." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Verdien må minimum ha %(limit_value)s teikn (den er %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Verdien må vere mindre enn eller lik %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Verdien må vere større enn eller lik %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "Verdien må ha minst %(limit_value)d teikn (den har %(show_value)d)." -msgstr[1] "Verdien må ha minst %(limit_value)d teikn (den har %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Verdien kan ikkje ha fleire enn %(limit_value)d teikn (den har " -"%(show_value)d)." -msgstr[1] "" -"Verdien kan ikkje ha fleire enn %(limit_value)d teikn (den har " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Oppgje eit tal." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Verdien kan ikkje ha meir enn %(max)s siffer totalt." -msgstr[1] "Verdien kan ikkje ha meir enn %(max)s siffer totalt." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Verdien kan ikkie ha meir enn %(max)s desimal." -msgstr[1] "Verdien kan ikkie ha meir enn %(max)s desimalar." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Verdien kan ikkje ha meir enn %(max)s siffer framanfor komma." -msgstr[1] "Verdien kan ikkje ha meir enn %(max)s siffer framanfor komma." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Filtypen “%(extension)s” er ikkje tillate. Tillate filtypar er: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null-teikn er ikkje tillate." - -msgid "and" -msgstr "og" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s med %(field_labels)s fins allereie." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Verdi %(value)r er eit ugyldig val." - -msgid "This field cannot be null." -msgstr "Feltet kan ikkje vere tomt." - -msgid "This field cannot be blank." -msgstr "Feltet kan ikkje vere tomt." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s med %(field_label)s fins allereie." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s må vere unik for %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Felt av typen: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Verdien “%(value)s” må vere anten True eller False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Verdien “%(value)s” må vere anten True, False, eller None." - -msgid "Boolean (Either True or False)" -msgstr "Boolsk (True eller False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Tekst (opp til %(max_length)s teikn)" - -msgid "Comma-separated integers" -msgstr "Heiltal skild med komma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Verdien “%(value)s” har eit ugyldig datoformat. Det må vere på formen YYYY-" -"MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Verdien “%(value)s” har rett format (YYYY-MM-DD) men er ein ugyldig dato." - -msgid "Date (without time)" -msgstr "Dato (utan tid)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Verdien “%(value)s” har eit ugyldig format. Det må vere på formen YYYY-MM-DD " -"HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Verdien “%(value)s” har rett format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) men " -"er ein ugyldig dato eller klokkeslett." - -msgid "Date (with time)" -msgstr "Dato (med tid)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Verdien “%(value)s” må vere eit desimaltal." - -msgid "Decimal number" -msgstr "Desimaltal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Verdien “%(value)s” har eit ugyldig format. Det må vere på formen [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Varigskap" - -msgid "Email address" -msgstr "E-postadresse" - -msgid "File path" -msgstr "Filsti" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Verdien “%(value)s” må vere eit flyttal." - -msgid "Floating point number" -msgstr "Flyttal" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Verdien “%(value)s” må vere eit heiltal." - -msgid "Integer" -msgstr "Heiltal" - -msgid "Big (8 byte) integer" -msgstr "Stort (8 bitar) heiltal" - -msgid "Small integer" -msgstr "Lite heiltal" - -msgid "IPv4 address" -msgstr "IPv4-adresse" - -msgid "IP address" -msgstr "IP-adresse" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Verdien “%(value)s” må vere anten None, True, eller False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolsk (True, False eller None)" - -msgid "Positive big integer" -msgstr "Positivt stort heiltal" - -msgid "Positive integer" -msgstr "Positivt heiltal" - -msgid "Positive small integer" -msgstr "Positivt lite heiltal" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (opp til %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Verdien “%(value)s” har eit ugyldig format. Det må vere på formen HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Verdien “%(value)s” har rett format (HH:MM[:ss[.uuuuuu]]), men er eit " -"ugyldig klokkeslett." - -msgid "Time" -msgstr "Tid" - -msgid "URL" -msgstr "Nettadresse" - -msgid "Raw binary data" -msgstr "Rå binærdata" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” er ikkje ein gyldig UUID." - -msgid "Universally unique identifier" -msgstr "Universelt unik identifikator." - -msgid "File" -msgstr "Fil" - -msgid "Image" -msgstr "Bilete" - -msgid "A JSON object" -msgstr "Eit JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Verdi må vere gyldig JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s-instans med %(field)s %(value)r eksisterer ikkje." - -msgid "Foreign Key (type determined by related field)" -msgstr "Fremmednøkkel (type bestemt av relatert felt)" - -msgid "One-to-one relationship" -msgstr "Ein-til-ein-forhold" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-relasjon" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-relasjonar" - -msgid "Many-to-many relationship" -msgstr "Mange-til-mange-forhold" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Feltet er påkravd." - -msgid "Enter a whole number." -msgstr "Oppgje eit heiltal." - -msgid "Enter a valid date." -msgstr "Oppgje ein gyldig dato." - -msgid "Enter a valid time." -msgstr "Oppgje eit gyldig tidspunkt." - -msgid "Enter a valid date/time." -msgstr "Oppgje gyldig dato og tidspunkt." - -msgid "Enter a valid duration." -msgstr "Oppgje ein gyldig varigskap." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Antal dagar må vere mellom {min_days} og {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Inga fil vart sendt. Sjekk \"encoding\"-typen på skjemaet." - -msgid "No file was submitted." -msgstr "Inga fil vart sendt." - -msgid "The submitted file is empty." -msgstr "Fila er tom." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Filnamnet kan ikkje ha fleire enn %(max)d teikn (det har %(length)d)." -msgstr[1] "" -"Filnamnet kan ikkje ha fleire enn %(max)d teikn (det har %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Last enten opp ei fil eller huk av i avkryssingsboksen." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Last opp eit gyldig bilete. Fila du lasta opp var ødelagt eller ikkje eit " -"bilete." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Velg eit gyldig valg. %(value)s er ikkje eit av dei tilgjengelege valga." - -msgid "Enter a list of values." -msgstr "Oppgje ei liste med verdiar." - -msgid "Enter a complete value." -msgstr "Oppgje ein fullstendig verdi." - -msgid "Enter a valid UUID." -msgstr "Oppgje ein gyldig UUID." - -msgid "Enter a valid JSON." -msgstr "Oppgje gyldig JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Gøymt felt %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm data manglar eller har blitt tukla med. Felt som manglar: " -"%(field_names)s. Du burde kanskje sende ein feilrapport dersom problemet " -"fortset. " - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Ver vennleg å ikkje sende inn fleire enn %d skjema. " -msgstr[1] "Ver vennleg å ikkje sende inn fleire enn %d skjema. " - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Ver vennleg å sende inn minst %d skjema. " -msgstr[1] "Ver vennleg å sende inn minst %d skjema. " - -msgid "Order" -msgstr "Rekkefølge" - -msgid "Delete" -msgstr "Slett" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Korriger dupliserte data for %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Korriger dupliserte data for %(field)s, som må vere unike." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Korriger dupliserte data for %(field_name)s, som må vere unike for " -"%(lookup)s i %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Korriger dei dupliserte verdiane nedanfor." - -msgid "The inline value did not match the parent instance." -msgstr "Inline verdien stemmer ikkje overeins med forelder-instansen.  " - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Velg eit gyldig valg. Valget er ikkje eit av dei tilgjengelege valga." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” er ikkje ein gyldig verdi." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kunne ikkje bli tolka i tidssona %(current_timezone)s; Verdien " -"er anten tvetydig eller ugyldig." - -msgid "Clear" -msgstr "Tøm" - -msgid "Currently" -msgstr "Noverande" - -msgid "Change" -msgstr "Endre" - -msgid "Unknown" -msgstr "Ukjend" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nei" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nei,kanskje" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "midnatt" - -msgid "noon" -msgstr "12:00" - -msgid "Monday" -msgstr "måndag" - -msgid "Tuesday" -msgstr "tysdag" - -msgid "Wednesday" -msgstr "onsdag" - -msgid "Thursday" -msgstr "torsdag" - -msgid "Friday" -msgstr "fredag" - -msgid "Saturday" -msgstr "laurdag" - -msgid "Sunday" -msgstr "søndag" - -msgid "Mon" -msgstr "man" - -msgid "Tue" -msgstr "tys" - -msgid "Wed" -msgstr "ons" - -msgid "Thu" -msgstr "tor" - -msgid "Fri" -msgstr "fre" - -msgid "Sat" -msgstr "lau" - -msgid "Sun" -msgstr "søn" - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "mai" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "desember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mars" - -msgid "apr" -msgstr "april" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "juni" - -msgid "jul" -msgstr "juli" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "des" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mars" - -msgctxt "abbrev. month" -msgid "April" -msgstr "april" - -msgctxt "abbrev. month" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "des." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "Mars" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Juli" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Desember" - -msgid "This is not a valid IPv6 address." -msgstr "Dette er ikkje ei gyldig IPv6-adresse." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "eller" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d månad" -msgstr[1] "%(num)d månader" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d veke" -msgstr[1] "%(num)d veker" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagar" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timar" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutt" -msgstr[1] "%(num)d minutt" - -msgid "Forbidden" -msgstr "Forbydd" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verifikasjon feila. Førespurnad avbrote." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Du ser denne meldinga på grunn av at det ikkje blei sendt nokon \"Referer\" " -"hovud frå din nettlesar, noko denne HTTPS-sida krev. Dette hovudet er eit " -"krav på grunn av sikkerheit, for å hindre at din nettlesar er kapra av " -"tredjepartar. " - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Dersom du har konfigurert nettlesaren din til å deaktiverere \"Referer\"-" -"hovud må du aktivere dei på nytt, i det minste for denne nettsida, eller for " -"HTTPS-tilkoplingar eller for førespurnadar av same opphav. " - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Dersom du brukar -taggen " -"eller inkludera \"Referrer-Policy: no-referrer\" hovud, ver vennleg å fjerne " -"dei. CSRF-vern krev \"Referer\" hovud for å gjennomføre strenge kontrollar " -"av referer. Dersom du har bekymringar for personvern bruk alternativ som for lenkjer til tredepartssider" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Du ser denne meldinga fordi denne nettsida krev ein CSRF informasjonskapsel " -"når du sender inn skjema. Denne informasjonskapselen er eit krav på grunn av " -"sikkerheit, for å forsikre at nettlesaren din ikkje er kapra av " -"tredjepartar. " - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Dersom du har konfigurert nettlesaren din til å deaktivere " -"informasjonskapslar, ver vennleg å aktiver dei på nytt, i det minste for " -"denne nettsida, eller for førespurnader av same opphav. " - -msgid "More information is available with DEBUG=True." -msgstr "Meir informasjon er tilgjengeleg med DEBUG=True." - -msgid "No year specified" -msgstr "Årstal ikkje spesifisert" - -msgid "Date out of range" -msgstr "Dato er utanfor rekkjevidde" - -msgid "No month specified" -msgstr "Månad ikkje spesifisert" - -msgid "No day specified" -msgstr "Dag ikkje spesifisert" - -msgid "No week specified" -msgstr "Veke ikkje spesifisert" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s tilgjengeleg" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Framtidig %(verbose_name_plural)s er ikkje tilgjengeleg fordi %(class_name)s." -"allow_future er sett til False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ugyldig datostreng \"%(datestr)s\" grunna format \"%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Fann ingen %(verbose_name)s som korresponderte med spørringa" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Sida er ikkje \"last\" og den kan heller ikkje konverterast til eit heiltal. " - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ugyldig side (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tom liste og \"%(class_name)s.allow_empty\" er False." - -msgid "Directory indexes are not allowed here." -msgstr "Mappeindeksar er ikkje tillate her." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" eksisterer ikkje" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks for %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Installasjonen var vellykka! Gratulerer!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Sjå utgjevingsnotat for Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Du ser denne sida fordi DEBUG=True er i innstillingsfila di og du ikkje har konfigurert noka " -"nettadresser." - -msgid "Django Documentation" -msgstr "Django-dokumentasjon" - -msgid "Topics, references, & how-to’s" -msgstr "Tema, referansar, & how-tos" - -msgid "Tutorial: A Polling App" -msgstr "Opplæring: Ein avstemmingsapp" - -msgid "Get started with Django" -msgstr "Kom i gang med Django" - -msgid "Django Community" -msgstr "Django Nettsamfunn" - -msgid "Connect, get help, or contribute" -msgstr "Koble, få hjelp, eller bidra" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nn/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/nn/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/nn/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/nn/formats.py deleted file mode 100644 index 0ddb8fe..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/nn/formats.py +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - # "%d. %b %Y", # '25. okt 2006' - # "%d %b %Y", # '25 okt 2006' - # "%d. %b. %Y", # '25. okt. 2006' - # "%d %b. %Y", # '25 okt. 2006' - # "%d. %B %Y", # '25. oktober 2006' - # "%d %B %Y", # '25 oktober 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/os/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index b17907e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/os/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index f3badb7..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,1235 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Африкаанс" - -msgid "Arabic" -msgstr "Араббаг" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Тӕтӕйраг" - -msgid "Bulgarian" -msgstr "Болгайраг" - -msgid "Belarusian" -msgstr "Беларусаг" - -msgid "Bengali" -msgstr "Бенгалаг" - -msgid "Breton" -msgstr "Бретойнаг" - -msgid "Bosnian" -msgstr "Босниаг" - -msgid "Catalan" -msgstr "Каталайнаг" - -msgid "Czech" -msgstr "Чехаг" - -msgid "Welsh" -msgstr "Уельсаг" - -msgid "Danish" -msgstr "Даниаг" - -msgid "German" -msgstr "Немыцаг" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Грекъаг" - -msgid "English" -msgstr "Англисаг" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Бритайнаг англисаг" - -msgid "Esperanto" -msgstr "Есперанто" - -msgid "Spanish" -msgstr "Испайнаг" - -msgid "Argentinian Spanish" -msgstr "Аргентинаг испайнаг" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Мексикайнаг Испайнаг" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуайаг испайнаг" - -msgid "Venezuelan Spanish" -msgstr "Венесуелаг испайнаг" - -msgid "Estonian" -msgstr "Эстойнаг" - -msgid "Basque" -msgstr "Баскаг" - -msgid "Persian" -msgstr "Персайнаг" - -msgid "Finnish" -msgstr "Финнаг" - -msgid "French" -msgstr "Францаг" - -msgid "Frisian" -msgstr "Фризаг" - -msgid "Irish" -msgstr "Ирландиаг" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Галициаг" - -msgid "Hebrew" -msgstr "Иврит" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Хорватаг" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Венгриаг" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Интерлингва" - -msgid "Indonesian" -msgstr "Индонезиаг" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Исландаг" - -msgid "Italian" -msgstr "Италиаг" - -msgid "Japanese" -msgstr "Япойнаг" - -msgid "Georgian" -msgstr "Гуырдзиаг" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Казахаг" - -msgid "Khmer" -msgstr "Хмераг" - -msgid "Kannada" -msgstr "Каннадаг" - -msgid "Korean" -msgstr "Корейаг" - -msgid "Luxembourgish" -msgstr "Люксембургаг" - -msgid "Lithuanian" -msgstr "Литвайаг" - -msgid "Latvian" -msgstr "Латвийаг" - -msgid "Macedonian" -msgstr "Мӕчъидон" - -msgid "Malayalam" -msgstr "Малайаг" - -msgid "Mongolian" -msgstr "Монголиаг" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "Бурмизаг" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Непалаг" - -msgid "Dutch" -msgstr "Нидерландаг" - -msgid "Norwegian Nynorsk" -msgstr "Норвегийаг Нинорск" - -msgid "Ossetic" -msgstr "Ирон" - -msgid "Punjabi" -msgstr "Пенджабаг" - -msgid "Polish" -msgstr "Полаг" - -msgid "Portuguese" -msgstr "Португалаг" - -msgid "Brazilian Portuguese" -msgstr "Бразилаг португалаг" - -msgid "Romanian" -msgstr "Румынаг" - -msgid "Russian" -msgstr "Уырыссаг" - -msgid "Slovak" -msgstr "Словакиаг" - -msgid "Slovenian" -msgstr "Словенаг" - -msgid "Albanian" -msgstr "Албайнаг" - -msgid "Serbian" -msgstr "Сербаг" - -msgid "Serbian Latin" -msgstr "Латинаг Сербаг" - -msgid "Swedish" -msgstr "Шведаг" - -msgid "Swahili" -msgstr "Суахили" - -msgid "Tamil" -msgstr "Тамилаг" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Thai" -msgstr "Тайаг" - -msgid "Turkish" -msgstr "Туркаг" - -msgid "Tatar" -msgstr "Тӕтӕйраг" - -msgid "Udmurt" -msgstr "Удмуртаг" - -msgid "Ukrainian" -msgstr "Украинаг" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Вьетнамаг" - -msgid "Simplified Chinese" -msgstr "Ӕнцонгонд Китайаг" - -msgid "Traditional Chinese" -msgstr "Традицион Китайаг" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Раст бӕрц бафысс." - -msgid "Enter a valid URL." -msgstr "Раст URL бафысс." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Раст email адрис бафысс." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Раст IPv4 адрис бафысс." - -msgid "Enter a valid IPv6 address." -msgstr "Раст IPv6 адрис бафысс." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Раст IPv4 кӕнӕ IPv6 адрис бафысс." - -msgid "Enter only digits separated by commas." -msgstr "Бафысс ӕрмӕст нымӕцтӕ, къӕдзгуытӕй дихгонд." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Ацы бӕрц хъуамӕ уа %(limit_value)s (у %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ацы бӕрц хъуамӕ уа %(limit_value)s, кӕнӕ цъусдӕр." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ацы бӕрц хъуамӕ уа %(limit_value)s, кӕнӕ цъусдӕр." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕ уӕддӕр уа (ис дзы " -"%(show_value)d)." -msgstr[1] "" -"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕйы уӕддӕр уа (ис дзы " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕйӕ фылдӕр ма уа (ис дзы " -"%(show_value)d)." -msgstr[1] "" -"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕйӕ фылдӕр ма уа (ис дзы " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Бафысс нымӕц." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Дӕ хъус бадар цӕмӕй иууыл иумӕ %(max)s цифрӕйӕ фылдӕр уой." -msgstr[1] "Дӕ хъус бадар цӕмӕй иууыл иумӕ %(max)s цифрӕйӕ фылдӕр уой." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Дӕ хъус бадар цӕмӕй дӕсон бынӕттӕ %(max)s-ӕй фылдӕр ма уой." -msgstr[1] "Дӕ хъус бадар цӕмӕй дӕсон бынӕттӕ %(max)s-ӕй фылдӕр ма уой." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Дӕ хъус бадар цӕмӕй дӕсон стъӕлфы размӕ %(max)s цифрӕйӕ фылдӕр ма уа." -msgstr[1] "" -"Дӕ хъус бадар цӕмӕй дӕсон стъӕлфы размӕ %(max)s цифрӕйӕ фылдӕр ма уа." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "ӕмӕ" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Ацы быдыр нул ма хъуамӕ уа." - -msgid "This field cannot be blank." -msgstr "Ацы быдыр афтид ма хъуамӕ уа." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s ацы %(field_label)s-имӕ нырид ис." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Быдыры хуыз: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Булон (Бӕлвырд кӕнӕ Мӕнг)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Рӕнхъ (%(max_length)s-ы йонг)" - -msgid "Comma-separated integers" -msgstr "Къӕдзыгӕй хицӕнгонд ӕгас нымӕцтӕ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Бон (ӕнӕ рӕстӕг)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Бон (ӕд рӕстӕг)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Дӕсон нымӕц" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Электрон посты адрис" - -msgid "File path" -msgstr "Файлы фӕт" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Уӕгъд стъӕлфимӕ нымӕц" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Ӕгас нымӕц" - -msgid "Big (8 byte) integer" -msgstr "Стыр (8 байты) ӕгас нымӕц" - -msgid "IPv4 address" -msgstr "IPv4 адрис" - -msgid "IP address" -msgstr "IP адрис" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Булон (Бӕлвырд, Мӕнг кӕнӕ Ницы)" - -msgid "Positive integer" -msgstr "Позитивон ӕгас нымӕц" - -msgid "Positive small integer" -msgstr "Позитивон гыццыл ӕгас нымӕц" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слаг (ӕппӕты фылдӕр %(max_length)s)" - -msgid "Small integer" -msgstr "Гыццыл ӕгас нымӕц" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Рӕстӕг" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Хом бинарон рардтӕ" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Ныв" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Ӕттагон Амонӕн (хӕстӕг быдырӕй бӕрӕггонд хуыз)" - -msgid "One-to-one relationship" -msgstr "Иуӕн-иу бастдзинад" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Бирӕйӕн-бирӕ бастдзинад" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Ацы быдыр ӕнӕмӕнг у." - -msgid "Enter a whole number." -msgstr "Бафысс ӕнӕхъӕн нымӕц." - -msgid "Enter a valid date." -msgstr "Раст бон бафысс." - -msgid "Enter a valid time." -msgstr "Раст рӕстӕг бафысс." - -msgid "Enter a valid date/time." -msgstr "Раст бон/рӕстӕг бафысс." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ницы файл уыд лӕвӕрд. Абӕрӕг кӕн формӕйы кодкӕнынады хуыз." - -msgid "No file was submitted." -msgstr "Ницы файл уыд лӕвӕрд." - -msgid "The submitted file is empty." -msgstr "Лӕвӕрд файл афтид у." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Дӕ хъус бадар цӕмӕй ацы файлы номы %(max)d дамгъӕйӕ фылдӕр ма уа(ис дзы " -"%(length)d)." -msgstr[1] "" -"Дӕ хъус бадар цӕмӕй ацы файлы номы %(max)d дамгъӕйӕ фылдӕр ма уа(ис дзы " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Дӕ хорзӕхӕй, кӕнӕ бадӕтт файл, кӕнӕ банысан кӕн сыгъдӕг чекбокс. Дыууӕ иумӕ " -"нӕ." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Раст ныв бавгӕн. Ды цы файл бавгӕдтай, уый кӕнӕ ныв нӕ уыд, кӕнӕ хӕлд ныв " -"уыд." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Раст фадат равзар. %(value)s фадӕтты ӕхсӕн нӕй." - -msgid "Enter a list of values." -msgstr "Бафысс мидисты номхыгъд." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Ӕмбӕхст быдыр %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Рад" - -msgid "Delete" -msgstr "Схафын" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Дӕ хорзӕхӕй, %(field)s-ы дывӕр рардтӕ сраст кӕн." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Дӕ хорзӕхӕй, %(field)s-ы дывӕр рардтӕ сраст кӕн. Хъуамӕ уникалон уа." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Дӕ хорзӕхӕй, %(field_name)s-ы дывӕр рардтӕ сраст кӕн. Хъуамӕ %(date_field)s-" -"ы %(lookup)s-ӕн уникалон уа. " - -msgid "Please correct the duplicate values below." -msgstr "Дӕ хорзӕхӕй, бындӕр цы дывӕр рардтӕ ис, уыдон сраст кӕн." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Раст фадат равзар. УКыцы фадат фадӕтты ӕхсӕн нӕй." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Сыгъдӕг" - -msgid "Currently" -msgstr "Ныр" - -msgid "Change" -msgstr "Фӕивын" - -msgid "Unknown" -msgstr "Ӕнӕбӕрӕг" - -msgid "Yes" -msgstr "О" - -msgid "No" -msgstr "Нӕ" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "о,нӕ,гӕнӕн ис" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байты" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "ӕ.ф." - -msgid "a.m." -msgstr "ӕ.р." - -msgid "PM" -msgstr "ӔФ" - -msgid "AM" -msgstr "ӔР" - -msgid "midnight" -msgstr "ӕмбисӕхсӕв" - -msgid "noon" -msgstr "ӕмбисбон" - -msgid "Monday" -msgstr "Къуырисӕр" - -msgid "Tuesday" -msgstr "Дыццӕг" - -msgid "Wednesday" -msgstr "Ӕртыццӕг" - -msgid "Thursday" -msgstr "Цыппӕрӕм" - -msgid "Friday" -msgstr "Майрӕмбон" - -msgid "Saturday" -msgstr "Сабат" - -msgid "Sunday" -msgstr "Хуыцаубон" - -msgid "Mon" -msgstr "Крс" - -msgid "Tue" -msgstr "Дцг" - -msgid "Wed" -msgstr "Ӕрт" - -msgid "Thu" -msgstr "Цпр" - -msgid "Fri" -msgstr "Мрб" - -msgid "Sat" -msgstr "Сбт" - -msgid "Sun" -msgstr "Хцб" - -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Мартъи" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgid "jan" -msgstr "янв" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "июн" - -msgid "jul" -msgstr "июл" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сен" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноя" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Янв." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Мартъи" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апрель" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Июнь" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Июль" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Сен." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноя." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "Январь" - -msgctxt "alt. month" -msgid "February" -msgstr "Февраль" - -msgctxt "alt. month" -msgid "March" -msgstr "Мартъи" - -msgctxt "alt. month" -msgid "April" -msgstr "Апрель" - -msgctxt "alt. month" -msgid "May" -msgstr "Май" - -msgctxt "alt. month" -msgid "June" -msgstr "Июнь" - -msgctxt "alt. month" -msgid "July" -msgstr "Июль" - -msgctxt "alt. month" -msgid "August" -msgstr "Август" - -msgctxt "alt. month" -msgid "September" -msgstr "Сентябрь" - -msgctxt "alt. month" -msgid "October" -msgstr "Октябрь" - -msgctxt "alt. month" -msgid "November" -msgstr "Ноябрь" - -msgctxt "alt. month" -msgid "December" -msgstr "Декабрь" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "кӕнӕ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d аз" -msgstr[1] "%d азы" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d мӕй" -msgstr[1] "%d мӕйы" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d къуыри" -msgstr[1] "%d къуырийы" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d бон" -msgstr[1] "%d боны" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d сахат" -msgstr[1] "%d сахаты" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минут" -msgstr[1] "%d минуты" - -msgid "0 minutes" -msgstr "0 минуты" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Аз амынд нӕ уыд" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Мӕй амынд нӕ уыд" - -msgid "No day specified" -msgstr "Бон амынд нӕ уыд" - -msgid "No week specified" -msgstr "Къуыри амынд нӕ уыд" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ницы %(verbose_name_plural)s ис" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Фидӕн %(verbose_name_plural)s-мӕ бавналӕн нӕй, уымӕн ӕмӕ %(class_name)s." -"allow_future Мӕнг у." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Домӕнӕн ницы %(verbose_name)s ӕмбӕлы" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Мӕнг фарс (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Ам директориты индекстӕ нӕй гӕнӕн." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s-ы индекс" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index a8fa88b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index d71b5f7..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,1213 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# A S Alam , 2011,2013,2015 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "ਅਫਰੀਕੀ" - -msgid "Arabic" -msgstr "ਅਰਬੀ" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "ਅਜ਼ਰਬਾਈਜਾਨੀ" - -msgid "Bulgarian" -msgstr "ਬੁਲਗਾਰੀਆਈ" - -msgid "Belarusian" -msgstr "ਬੇਲਾਰੂਸੀ" - -msgid "Bengali" -msgstr "ਬੰਗਾਲੀ" - -msgid "Breton" -msgstr "ਬਰੇਟੋਨ" - -msgid "Bosnian" -msgstr "ਬੋਸਨੀਆਈ" - -msgid "Catalan" -msgstr "ਕਾਟਾਲਾਨ" - -msgid "Czech" -msgstr "ਚੈੱਕ" - -msgid "Welsh" -msgstr "ਵੈਲਸ਼" - -msgid "Danish" -msgstr "ਡੈਨਿਸ਼" - -msgid "German" -msgstr "ਜਰਮਨ" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "ਗਰੀਕ" - -msgid "English" -msgstr "ਅੰਗਰੇਜ਼ੀ" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "ਬਰਤਾਨੀਵੀਂ ਅੰਗਰੇਜ਼ੀ" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "ਸਪੇਨੀ" - -msgid "Argentinian Spanish" -msgstr "ਅਰਜਨਟੀਨੀ ਸਪੇਨੀ" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "ਮੈਕਸੀਕਨ ਸਪੇਨੀ" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "ਈਸਟੋਨੀਆਈ" - -msgid "Basque" -msgstr "ਬਸਕਿਊ" - -msgid "Persian" -msgstr "ਪਰਸ਼ੀਆਈ" - -msgid "Finnish" -msgstr "ਫੈਨਿਸ਼" - -msgid "French" -msgstr "ਫਰੈਂਚ" - -msgid "Frisian" -msgstr "ਫ਼ਾਰਸੀ" - -msgid "Irish" -msgstr "ਆਈਰਸ਼" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "ਗਲੀਸੀਆਈ" - -msgid "Hebrew" -msgstr "ਹੈਬਰਿਊ" - -msgid "Hindi" -msgstr "ਹਿੰਦੀ" - -msgid "Croatian" -msgstr "ਕਰੋਆਟੀਆਈ" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ਹੰਗਰੀਆਈ" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "ਇੰਡੋਨੇਸ਼ੀਆਈ" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ਆਈਸਲੈਂਡਿਕ" - -msgid "Italian" -msgstr "ਇਤਾਲਵੀ" - -msgid "Japanese" -msgstr "ਜਾਪਾਨੀ" - -msgid "Georgian" -msgstr "ਜਾਰਜੀਆਈ" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "ਕਜ਼ਾਖ" - -msgid "Khmer" -msgstr "ਖਮੀਰ" - -msgid "Kannada" -msgstr "ਕੰਨੜ" - -msgid "Korean" -msgstr "ਕੋਰੀਆਈ" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "ਲੀਥੁਨੀਆਈ" - -msgid "Latvian" -msgstr "ਲਾਟਵੀਅਨ" - -msgid "Macedonian" -msgstr "ਮੈਕਡੋਨੀਆਈ" - -msgid "Malayalam" -msgstr "ਮਲਿਆਲਮ" - -msgid "Mongolian" -msgstr "ਮੰਗੋਲੀਆਈ" - -msgid "Marathi" -msgstr "ਮਰਾਠੀ" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "ਨੇਪਾਲੀ" - -msgid "Dutch" -msgstr "ਡੱਚ" - -msgid "Norwegian Nynorsk" -msgstr "ਨਾਰਵੇਗੀਅਨ ਨਯਨੋਰਸਕ" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "ਪੰਜਾਬੀ" - -msgid "Polish" -msgstr "ਪੋਲੈਂਡੀ" - -msgid "Portuguese" -msgstr "ਪੁਰਤਗਾਲੀ" - -msgid "Brazilian Portuguese" -msgstr "ਬਰਾਜ਼ੀਲੀ ਪੁਰਤਗਾਲੀ" - -msgid "Romanian" -msgstr "ਰੋਮਾਨੀਆਈ" - -msgid "Russian" -msgstr "ਰੂਸੀ" - -msgid "Slovak" -msgstr "ਸਲੋਵਾਕ" - -msgid "Slovenian" -msgstr "ਸਲੋਵੀਨੀਆਈ" - -msgid "Albanian" -msgstr "ਅਲਬੀਨੀਆਈ" - -msgid "Serbian" -msgstr "ਸਰਬੀਆਈ" - -msgid "Serbian Latin" -msgstr "ਸਰਬੀਆਈ ਲੈਟਿਨ" - -msgid "Swedish" -msgstr "ਸਵੀਡਨੀ" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "ਤਾਮਿਲ" - -msgid "Telugu" -msgstr "ਤੇਲਗੂ" - -msgid "Thai" -msgstr "ਥਾਈ" - -msgid "Turkish" -msgstr "ਤੁਰਕ" - -msgid "Tatar" -msgstr "ਤਤਾਰ" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ਯੂਕਰੇਨੀ" - -msgid "Urdu" -msgstr "ਉਰਦੂ" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "ਵੀਅਤਨਾਮੀ" - -msgid "Simplified Chinese" -msgstr "ਸਧਾਰਨ ਚੀਨੀ" - -msgid "Traditional Chinese" -msgstr "ਮੂਲ ਚੀਨੀ" - -msgid "Messages" -msgstr "ਸੁਨੇਹੇ" - -msgid "Site Maps" -msgstr "ਸਾਈਟ ਖਾਕੇ" - -msgid "Static Files" -msgstr "ਸਥਿਰ ਫਾਈਲਾਂ" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "ਠੀਕ ਮੁੱਲ ਦਿਓ" - -msgid "Enter a valid URL." -msgstr "ਠੀਕ URL ਦਿਉ।" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "ਢੁੱਕਵਾਂ ਈਮੇਲ ਸਿਰਨਾਵਾਂ ਦਿਉ ਜੀ।" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "ਨੰਬਰ ਦਿਓ।" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "ਅਤੇ" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "" - -msgid "This field cannot be blank." -msgstr "ਇਹ ਖੇਤਰ ਖਾਲੀ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "ਖੇਤਰ ਦੀ ਕਿਸਮ: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "ਮਿਤੀ (ਬਿਨਾਂ ਸਮਾਂ)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "ਮਿਤੀ (ਸਮੇਂ ਨਾਲ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "ਦਸ਼ਮਲਵ ਅੰਕ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "ਅੰਤਰਾਲ" - -msgid "Email address" -msgstr "ਈਮੇਲ ਐਡਰੈੱਸ" - -msgid "File path" -msgstr "ਫਾਇਲ ਪਾਥ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "ਅੰਕ" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "IPv4 ਸਿਰਨਾਵਾਂ" - -msgid "IP address" -msgstr "IP ਐਡਰੈੱਸ" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "ਟੈਕਸਟ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "ਸਮਾਂ" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "ਫਾਇਲ" - -msgid "Image" -msgstr "ਚਿੱਤਰ" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "ਇੱਕ-ਤੋਂ-ਇੱਕ ਸਬੰਧ" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "ਕਈ-ਤੋਂ-ਕਈ ਸਬੰਧ" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "ਇਹ ਖੇਤਰ ਲਾਜ਼ਮੀ ਹੈ।" - -msgid "Enter a whole number." -msgstr "ਪੂਰਨ ਨੰਬਰ ਦਿਉ।" - -msgid "Enter a valid date." -msgstr "ਠੀਕ ਮਿਤੀ ਦਿਓ।" - -msgid "Enter a valid time." -msgstr "ਠੀਕ ਸਮਾਂ ਦਿਓ।" - -msgid "Enter a valid date/time." -msgstr "ਠੀਕ ਮਿਤੀ/ਸਮਾਂ ਦਿਓ।" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -msgid "No file was submitted." -msgstr "ਕੋਈ ਫਾਇਲ ਨਹੀਂ ਭੇਜੀ।" - -msgid "The submitted file is empty." -msgstr "ਦਿੱਤੀ ਫਾਇਲ ਖਾਲੀ ਹੈ।" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "ਮੁੱਲ ਦੀ ਲਿਸਟ ਦਿਓ।" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ਲੜੀ" - -msgid "Delete" -msgstr "ਹਟਾਓ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "ਸਾਫ਼ ਕਰੋ" - -msgid "Currently" -msgstr "ਮੌਜੂਦਾ" - -msgid "Change" -msgstr "ਬਦਲੋ" - -msgid "Unknown" -msgstr "ਅਣਜਾਣ" - -msgid "Yes" -msgstr "ਹਾਂ" - -msgid "No" -msgstr "ਨਹੀਂ" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ਹਾਂ,ਨਹੀਂ,ਸ਼ਾਇਦ" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ਬਾਈਟ" -msgstr[1] "%(size)d ਬਾਈਟ" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "ਸ਼ਾਮ" - -msgid "AM" -msgstr "ਸਵੇਰ" - -msgid "midnight" -msgstr "ਅੱਧੀ-ਰਾਤ" - -msgid "noon" -msgstr "ਨੂਨ" - -msgid "Monday" -msgstr "ਸੋਮਵਾਰ" - -msgid "Tuesday" -msgstr "ਮੰਗਲਵਾਰ" - -msgid "Wednesday" -msgstr "ਬੁੱਧਵਾਰ" - -msgid "Thursday" -msgstr "ਵੀਰਵਾਰ" - -msgid "Friday" -msgstr "ਸ਼ੁੱਕਰਵਾਰ" - -msgid "Saturday" -msgstr "ਸ਼ਨਿੱਚਰਵਾਰ" - -msgid "Sunday" -msgstr "ਐਤਵਾਰ" - -msgid "Mon" -msgstr "ਸੋਮ" - -msgid "Tue" -msgstr "ਮੰਗ" - -msgid "Wed" -msgstr "ਬੁੱਧ" - -msgid "Thu" -msgstr "ਵੀਰ" - -msgid "Fri" -msgstr "ਸ਼ੁੱਕ" - -msgid "Sat" -msgstr "ਸ਼ਨਿੱ" - -msgid "Sun" -msgstr "ਐਤ" - -msgid "January" -msgstr "ਜਨਵਰੀ" - -msgid "February" -msgstr "ਫਰਵਰੀ" - -msgid "March" -msgstr "ਮਾਰਚ" - -msgid "April" -msgstr "ਅਪਰੈਲ" - -msgid "May" -msgstr "ਮਈ" - -msgid "June" -msgstr "ਜੂਨ" - -msgid "July" -msgstr "ਜੁਲਾਈ" - -msgid "August" -msgstr "ਅਗਸਤ" - -msgid "September" -msgstr "ਸਤੰਬਰ" - -msgid "October" -msgstr "ਅਕਤੂਬਰ" - -msgid "November" -msgstr "ਨਵੰਬਰ" - -msgid "December" -msgstr "ਦਸੰਬਰ" - -msgid "jan" -msgstr "ਜਨ" - -msgid "feb" -msgstr "ਫਰ" - -msgid "mar" -msgstr "ਮਾਰ" - -msgid "apr" -msgstr "ਅਪ" - -msgid "may" -msgstr "ਮਈ" - -msgid "jun" -msgstr "ਜੂਨ" - -msgid "jul" -msgstr "ਜੁਲ" - -msgid "aug" -msgstr "ਅਗ" - -msgid "sep" -msgstr "ਸਤੰ" - -msgid "oct" -msgstr "ਅਕ" - -msgid "nov" -msgstr "ਨਵੰ" - -msgid "dec" -msgstr "ਦਸੰ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "ਜਨ" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ਫਰ" - -msgctxt "abbrev. month" -msgid "March" -msgstr "ਮਾਰ" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ਅਪ" - -msgctxt "abbrev. month" -msgid "May" -msgstr "ਮਈ" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ਜੂਨ" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ਜੁਲ" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ਅਗ" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ਸਤੰ" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ਅਕਤੂ" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "ਨਵੰ" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ਦਸੰ" - -msgctxt "alt. month" -msgid "January" -msgstr "ਜਨਵਰੀ" - -msgctxt "alt. month" -msgid "February" -msgstr "ਫਰਵਰੀ" - -msgctxt "alt. month" -msgid "March" -msgstr "ਮਾਰਚ" - -msgctxt "alt. month" -msgid "April" -msgstr "ਅਪਰੈਲ" - -msgctxt "alt. month" -msgid "May" -msgstr "ਮਈ" - -msgctxt "alt. month" -msgid "June" -msgstr "ਜੂਨ" - -msgctxt "alt. month" -msgid "July" -msgstr "ਜੁਲਾਈ" - -msgctxt "alt. month" -msgid "August" -msgstr "ਅਗਸਤ" - -msgctxt "alt. month" -msgid "September" -msgstr "ਸਤੰਬਰ" - -msgctxt "alt. month" -msgid "October" -msgstr "ਅਕਤੂਬਰ" - -msgctxt "alt. month" -msgid "November" -msgstr "ਨਵੰਬਰ" - -msgctxt "alt. month" -msgid "December" -msgstr "ਦਸੰਬਰ" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ਜਾਂ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d ਸਾਲ" -msgstr[1] "%d ਸਾਲ" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d ਮਹੀਨਾ" -msgstr[1] "%d ਮਹੀਨੇ" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d ਹਫ਼ਤਾ" -msgstr[1] "%d ਹਫ਼ਤੇ" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d ਦਿਨ" -msgstr[1] "%d ਦਿਨ" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ਘੰਟਾ" -msgstr[1] "%d ਘੰਟੇ" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d ਮਿੰਟ" -msgstr[1] "%d ਮਿੰਟ" - -msgid "0 minutes" -msgstr "0 ਮਿੰਟ" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "ਕੋਈ ਸਾਲ ਨਹੀਂ ਦਿੱਤਾ" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "ਕੋਈ ਮਹੀਨਾ ਨਹੀਂ ਦਿੱਤਾ" - -msgid "No day specified" -msgstr "ਕੋਈ ਦਿਨ ਨਹੀਂ ਦਿੱਤਾ" - -msgid "No week specified" -msgstr "ਕੋਈ ਹਫ਼ਤਾ ਨਹੀਂ ਦਿੱਤਾ" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s ਦਾ ਇੰਡੈਕਸ" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index 221182a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index e34285c..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,1424 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 8ffa075ab2f53c280beb2c066769d1ac_169beb5 <462ee687bbf3107fab5af73e8cc690d0_217822>, 2014 -# Adam Stachowicz , 2015 -# angularcircle, 2011,2013 -# angularcircle, 2011,2013 -# angularcircle, 2014 -# Dariusz Paluch , 2015 -# Darek, 2022 -# Jannis Leidel , 2011 -# Janusz Harkot , 2014-2015 -# Kacper Krupa , 2013 -# Karol , 2012 -# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 -# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 -# Łukasz Rekucki (lqc) , 2011 -# Maciej Olko , 2016-2021 -# Maciej Olko , 2023-2024 -# Maciej Olko , 2015 -# Mariusz Felisiak , 2020-2021,2023-2025 -# Michał Pasternak , 2013 -# c10516f0462e552b4c3672569f0745a7_cc5cca2 <841826256cd8f47d0e443806a8e56601_19204>, 2012 -# Piotr Meuś , 2014 -# c10516f0462e552b4c3672569f0745a7_cc5cca2 <841826256cd8f47d0e443806a8e56601_19204>, 2012 -# Quadric , 2014 -# Radek Czajka , 2013 -# Radek Czajka , 2013 -# Roman Barczyński, 2012 -# 8ffa075ab2f53c280beb2c066769d1ac_169beb5 <462ee687bbf3107fab5af73e8cc690d0_217822>, 2014 -# Tomasz Kajtoch , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Mariusz Felisiak , " -"2020-2021,2023-2025\n" -"Language-Team: Polish (http://app.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " -"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " -"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -msgid "Afrikaans" -msgstr "afrykanerski" - -msgid "Arabic" -msgstr "arabski" - -msgid "Algerian Arabic" -msgstr "algierski arabski" - -msgid "Asturian" -msgstr "asturyjski" - -msgid "Azerbaijani" -msgstr "azerski" - -msgid "Bulgarian" -msgstr "bułgarski" - -msgid "Belarusian" -msgstr "białoruski" - -msgid "Bengali" -msgstr "bengalski" - -msgid "Breton" -msgstr "bretoński" - -msgid "Bosnian" -msgstr "bośniacki" - -msgid "Catalan" -msgstr "kataloński" - -msgid "Central Kurdish (Sorani)" -msgstr "sorani" - -msgid "Czech" -msgstr "czeski" - -msgid "Welsh" -msgstr "walijski" - -msgid "Danish" -msgstr "duński" - -msgid "German" -msgstr "niemiecki" - -msgid "Lower Sorbian" -msgstr "dolnołużycki" - -msgid "Greek" -msgstr "grecki" - -msgid "English" -msgstr "angielski" - -msgid "Australian English" -msgstr "australijski angielski" - -msgid "British English" -msgstr "brytyjski angielski" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "hiszpański" - -msgid "Argentinian Spanish" -msgstr "hiszpański argentyński" - -msgid "Colombian Spanish" -msgstr "hiszpański kolumbijski" - -msgid "Mexican Spanish" -msgstr "hiszpański meksykański" - -msgid "Nicaraguan Spanish" -msgstr "hiszpański nikaraguański" - -msgid "Venezuelan Spanish" -msgstr "hiszpański wenezuelski" - -msgid "Estonian" -msgstr "estoński" - -msgid "Basque" -msgstr "baskijski" - -msgid "Persian" -msgstr "perski" - -msgid "Finnish" -msgstr "fiński" - -msgid "French" -msgstr "francuski" - -msgid "Frisian" -msgstr "fryzyjski" - -msgid "Irish" -msgstr "irlandzki" - -msgid "Scottish Gaelic" -msgstr "Szkocki gaelicki" - -msgid "Galician" -msgstr "galicyjski" - -msgid "Hebrew" -msgstr "hebrajski" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "chorwacki" - -msgid "Upper Sorbian" -msgstr "górnołużycki" - -msgid "Hungarian" -msgstr "węgierski" - -msgid "Armenian" -msgstr "ormiański" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indonezyjski" - -msgid "Igbo" -msgstr "igbo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandzki" - -msgid "Italian" -msgstr "włoski" - -msgid "Japanese" -msgstr "japoński" - -msgid "Georgian" -msgstr "gruziński" - -msgid "Kabyle" -msgstr "kabylski" - -msgid "Kazakh" -msgstr "kazachski" - -msgid "Khmer" -msgstr "khmerski" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "koreański" - -msgid "Kyrgyz" -msgstr "kirgiski" - -msgid "Luxembourgish" -msgstr "luksemburski" - -msgid "Lithuanian" -msgstr "litewski" - -msgid "Latvian" -msgstr "łotewski" - -msgid "Macedonian" -msgstr "macedoński" - -msgid "Malayalam" -msgstr "malajski" - -msgid "Mongolian" -msgstr "mongolski" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malajski" - -msgid "Burmese" -msgstr "birmański" - -msgid "Norwegian Bokmål" -msgstr "norweski (bokmål)" - -msgid "Nepali" -msgstr "nepalski" - -msgid "Dutch" -msgstr "holenderski" - -msgid "Norwegian Nynorsk" -msgstr "norweski (nynorsk)" - -msgid "Ossetic" -msgstr "osetyjski" - -msgid "Punjabi" -msgstr "pendżabski" - -msgid "Polish" -msgstr "polski" - -msgid "Portuguese" -msgstr "portugalski" - -msgid "Brazilian Portuguese" -msgstr "portugalski brazylijski" - -msgid "Romanian" -msgstr "rumuński" - -msgid "Russian" -msgstr "rosyjski" - -msgid "Slovak" -msgstr "słowacki" - -msgid "Slovenian" -msgstr "słoweński" - -msgid "Albanian" -msgstr "albański" - -msgid "Serbian" -msgstr "serbski" - -msgid "Serbian Latin" -msgstr "serbski (łaciński)" - -msgid "Swedish" -msgstr "szwedzki" - -msgid "Swahili" -msgstr "suahili" - -msgid "Tamil" -msgstr "tamilski" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadżycki" - -msgid "Thai" -msgstr "tajski" - -msgid "Turkmen" -msgstr "turkmeński" - -msgid "Turkish" -msgstr "turecki" - -msgid "Tatar" -msgstr "tatarski" - -msgid "Udmurt" -msgstr "udmurcki" - -msgid "Uyghur" -msgstr "ujgurski" - -msgid "Ukrainian" -msgstr "ukraiński" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "uzbecki" - -msgid "Vietnamese" -msgstr "wietnamski" - -msgid "Simplified Chinese" -msgstr "chiński uproszczony" - -msgid "Traditional Chinese" -msgstr "chiński tradycyjny" - -msgid "Messages" -msgstr "Wiadomości" - -msgid "Site Maps" -msgstr "Mapy stron" - -msgid "Static Files" -msgstr "Pliki statyczne" - -msgid "Syndication" -msgstr "Syndykacja treści" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Ten numer strony nie jest liczbą całkowitą" - -msgid "That page number is less than 1" -msgstr "Ten numer strony jest mniejszy niż 1" - -msgid "That page contains no results" -msgstr "Ta strona nie zawiera wyników" - -msgid "Enter a valid value." -msgstr "Wpisz poprawną wartość." - -msgid "Enter a valid domain name." -msgstr "Wpisz poprawną nazwę domeny." - -msgid "Enter a valid URL." -msgstr "Wpisz poprawny URL." - -msgid "Enter a valid integer." -msgstr "Wprowadź poprawną liczbę całkowitą." - -msgid "Enter a valid email address." -msgstr "Wprowadź poprawny adres email." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Wpisz poprawny „slug” zawierający litery, cyfry, podkreślenia i myślniki." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Wpisz poprawny „slug” zawierający litery Unicode, cyfry, podkreślenia i " -"myślniki." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Wpisz poprawny adres %(protocol)s. " - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 lub IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Wpisz tylko cyfry oddzielone przecinkami." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Upewnij się, że ta wartość jest %(limit_value)s (jest %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Upewnij się, że ta wartość jest mniejsza lub równa %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Upewnij się, że ta wartość jest większa lub równa %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Upewnij się, że ta wartość jest wielokrotnością wielkości " -"kroku%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Upewnij się, że ta wartość jest wielokrotnością %(limit_value)s, zaczynają " -"od %(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s i tak " -"dalej." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znak (obecnie ma " -"%(show_value)d)." -msgstr[1] "" -"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znaki (obecnie ma " -"%(show_value)d)." -msgstr[2] "" -"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znaków (obecnie " -"ma %(show_value)d)." -msgstr[3] "" -"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znaków (obecnie " -"ma %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znak (obecnie ma " -"%(show_value)d)." -msgstr[1] "" -"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znaki (obecnie ma " -"%(show_value)d)." -msgstr[2] "" -"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znaków (obecnie ma " -"%(show_value)d)." -msgstr[3] "" -"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znaków (obecnie ma " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Wpisz liczbę." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfry." -msgstr[1] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfry." -msgstr[2] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfr." -msgstr[3] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfr." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfrę po przecinku." -msgstr[1] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfry po przecinku." -msgstr[2] "Upewnij się, że liczba ma nie więcej niż %(max)s cyfr po przecinku." -msgstr[3] "Upewnij się, że liczba ma nie więcej niż %(max)s cyfr po przecinku." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfrę przed przecinkiem." -msgstr[1] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfry przed przecinkiem." -msgstr[2] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfr przed przecinkiem." -msgstr[3] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfr przed przecinkiem." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Rozszerzenie pliku „%(extension)s” jest niedozwolone. Dozwolone rozszerzenia " -"to: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Znaki null są niedozwolone." - -msgid "and" -msgstr "i" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" -"Istnieje już instancja modelu %(model_name)s mająca takie same pole/pola " -"%(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Ograniczenie \"%(name)s\" zostało naruszone." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Wartość %(value)r nie jest poprawnym wyborem." - -msgid "This field cannot be null." -msgstr "To pole nie może być puste." - -msgid "This field cannot be blank." -msgstr "To pole nie może być puste." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Istnieje już %(model_name)s z tą wartością pola %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Wartość pola %(field_label)s musi być unikatowa dla %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Pole typu: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Wartością „%(value)s” musi być True albo False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Wartością „%(value)s” musi być True, False lub None." - -msgid "Boolean (Either True or False)" -msgstr "Wartość logiczna (True lub False – prawda lub fałsz)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Ciąg znaków (do %(max_length)s znaków)" - -msgid "String (unlimited)" -msgstr "Ciąg znaków (bez limitu)" - -msgid "Comma-separated integers" -msgstr "Liczby całkowite rozdzielone przecinkami" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Wartość „%(value)s” ma nieprawidłowy format daty. Musi być ona w formacie " -"YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Wartość „%(value)s” ma prawidłowy format (YYYY-MM-DD), ale jest " -"nieprawidłową datą." - -msgid "Date (without time)" -msgstr "Data (bez godziny)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Wartość „%(value)s” ma nieprawidłowy format. Musi być ona w formacie YYYY-MM-" -"DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Wartość „%(value)s” ma prawidłowy format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]), ale jest nieprawidłową datą/godziną." - -msgid "Date (with time)" -msgstr "Data (z godziną)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Wartością „%(value)s” musi być liczba dziesiętna." - -msgid "Decimal number" -msgstr "Liczba dziesiętna" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Wartość „%(value)s” ma błędny format. Poprawny format to [DD] [HH:[MM:]]ss[." -"uuuuuu]." - -msgid "Duration" -msgstr "Czas trwania" - -msgid "Email address" -msgstr "Adres e-mail" - -msgid "File path" -msgstr "Ścieżka do pliku" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Wartością „%(value)s” musi być liczba zmiennoprzecinkowa." - -msgid "Floating point number" -msgstr "Liczba zmiennoprzecinkowa" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Wartością „%(value)s” musi być liczba całkowita." - -msgid "Integer" -msgstr "Liczba całkowita" - -msgid "Big (8 byte) integer" -msgstr "Duża liczba całkowita (8 bajtów)" - -msgid "Small integer" -msgstr "Mała liczba całkowita" - -msgid "IPv4 address" -msgstr "adres IPv4" - -msgid "IP address" -msgstr "Adres IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Wartością „%(value)s” musi być None, True lub False." - -msgid "Boolean (Either True, False or None)" -msgstr "Wartość logiczna (True, False, None – prawda, fałsz lub nic)" - -msgid "Positive big integer" -msgstr "Dodatnia duża liczba całkowita" - -msgid "Positive integer" -msgstr "Dodatnia liczba całkowita" - -msgid "Positive small integer" -msgstr "Dodatnia mała liczba całkowita" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (do %(max_length)s znaków)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Wartość „%(value)s” ma nieprawidłowy format. Musi być ona w formacie HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Wartość „%(value)s” ma prawidłowy format (HH:MM[:ss[.uuuuuu]]), ale jest " -"nieprawidłową wartością czasu." - -msgid "Time" -msgstr "Czas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dane w postaci binarnej" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Wartość „%(value)s” nie jest poprawnym UUID-em." - -msgid "Universally unique identifier" -msgstr "Uniwersalnie unikalny identyfikator" - -msgid "File" -msgstr "Plik" - -msgid "Image" -msgstr "Plik graficzny" - -msgid "A JSON object" -msgstr "Obiekt JSON" - -msgid "Value must be valid JSON." -msgstr "Wartość musi być poprawnym JSON-em." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "Instancja %(model)s z %(field)s %(value)r nie jest poprawnym wyborem." - -msgid "Foreign Key (type determined by related field)" -msgstr "Klucz obcy (typ określony przez pole powiązane)" - -msgid "One-to-one relationship" -msgstr "Powiązanie jeden do jednego" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "powiązanie %(from)s do %(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "powiązania %(from)s do %(to)s" - -msgid "Many-to-many relationship" -msgstr "Powiązanie wiele-do-wielu" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "To pole jest wymagane." - -msgid "Enter a whole number." -msgstr "Wpisz liczbę całkowitą." - -msgid "Enter a valid date." -msgstr "Wpisz poprawną datę." - -msgid "Enter a valid time." -msgstr "Wpisz poprawną godzinę." - -msgid "Enter a valid date/time." -msgstr "Wpisz poprawną datę/godzinę." - -msgid "Enter a valid duration." -msgstr "Wpisz poprawny czas trwania." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Liczba dni musi wynosić między {min_days} a {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nie wysłano żadnego pliku. Sprawdź typ kodowania formularza." - -msgid "No file was submitted." -msgstr "Żaden plik nie został przesłany." - -msgid "The submitted file is empty." -msgstr "Wysłany plik jest pusty." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znak (obecnie ma " -"%(length)d)." -msgstr[1] "" -"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znaki (obecnie ma " -"%(length)d)." -msgstr[2] "" -"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znaków (obecnie ma " -"%(length)d)." -msgstr[3] "" -"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znaków (obecnie ma " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Prześlij plik lub zaznacz by usunąć, ale nie oba na raz." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Prześlij poprawny plik graficzny. Aktualnie przesłany plik nie jest " -"grafiką lub jest uszkodzony." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Wybierz poprawną wartość. %(value)s nie jest żadną z dostępnych opcji." - -msgid "Enter a list of values." -msgstr "Podaj listę wartości." - -msgid "Enter a complete value." -msgstr "Wprowadź kompletną wartość." - -msgid "Enter a valid UUID." -msgstr "Wpisz poprawny UUID." - -msgid "Enter a valid JSON." -msgstr "Wpisz poprawny JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Ukryte pole %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Brakuje danych ManagementForm lub zostały one naruszone. Brakujące pola: " -"%(field_names)s. Złóż zgłoszenie błędu, jeśli problem się powtarza." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Proszę wysłać co najwyżej %(num)dformularz." -msgstr[1] "Proszę wysłać co najwyżej %(num)d formularze." -msgstr[2] "Proszę wysłać co najwyżej %(num)dformularzy." -msgstr[3] "Proszę wysłać co najwyżej %(num)dformularzy." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Proszę wysłać co najmniej %(num)d formularz." -msgstr[1] "Proszę wysłać co najmniej %(num)dformularze." -msgstr[2] "Proszę wysłać co najmniej %(num)d formularzy." -msgstr[3] "Proszę wysłać co najmniej %(num)d formularzy." - -msgid "Order" -msgstr "Kolejność" - -msgid "Delete" -msgstr "Usuń" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Popraw zduplikowane dane w %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Popraw zduplikowane dane w %(field)s, które muszą być unikalne." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Popraw zduplikowane dane w %(field_name)s, które wymaga unikalności dla " -"%(lookup)s w polu %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Popraw poniższe zduplikowane wartości." - -msgid "The inline value did not match the parent instance." -msgstr "Wartość inline nie pasuje do obiektu rodzica." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Wybierz poprawną wartość. Podana nie jest jednym z dostępnych wyborów." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "„%(pk)s” nie jest poprawną wartością." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s nie mógł zostać zinterpretowany w strefie czasowej " -"%(current_timezone)s; może być niejednoznaczny lub może nie istnieć." - -msgid "Clear" -msgstr "Wyczyść" - -msgid "Currently" -msgstr "Teraz" - -msgid "Change" -msgstr "Zmień" - -msgid "Unknown" -msgstr "Nieznany" - -msgid "Yes" -msgstr "Tak" - -msgid "No" -msgstr "Nie" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "tak,nie,może" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajty" -msgstr[2] "%(size)d bajtów" -msgstr[3] "%(size)d bajtów" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "po południu" - -msgid "a.m." -msgstr "rano" - -msgid "PM" -msgstr "po południu" - -msgid "AM" -msgstr "rano" - -msgid "midnight" -msgstr "północ" - -msgid "noon" -msgstr "południe" - -msgid "Monday" -msgstr "Poniedziałek" - -msgid "Tuesday" -msgstr "Wtorek" - -msgid "Wednesday" -msgstr "Środa" - -msgid "Thursday" -msgstr "Czwartek" - -msgid "Friday" -msgstr "Piątek" - -msgid "Saturday" -msgstr "Sobota" - -msgid "Sunday" -msgstr "Niedziela" - -msgid "Mon" -msgstr "Pon" - -msgid "Tue" -msgstr "Wt" - -msgid "Wed" -msgstr "Śr" - -msgid "Thu" -msgstr "Czw" - -msgid "Fri" -msgstr "Pt" - -msgid "Sat" -msgstr "So" - -msgid "Sun" -msgstr "Nd" - -msgid "January" -msgstr "Styczeń" - -msgid "February" -msgstr "Luty" - -msgid "March" -msgstr "Marzec" - -msgid "April" -msgstr "Kwiecień" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Czerwiec" - -msgid "July" -msgstr "Lipiec" - -msgid "August" -msgstr "Sierpień" - -msgid "September" -msgstr "Wrzesień" - -msgid "October" -msgstr "Październik" - -msgid "November" -msgstr "Listopad" - -msgid "December" -msgstr "Grudzień" - -msgid "jan" -msgstr "sty" - -msgid "feb" -msgstr "lut" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "kwi" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "cze" - -msgid "jul" -msgstr "lip" - -msgid "aug" -msgstr "sie" - -msgid "sep" -msgstr "wrz" - -msgid "oct" -msgstr "paź" - -msgid "nov" -msgstr "lis" - -msgid "dec" -msgstr "gru" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Sty." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Lut." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "Kwi." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Cze." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Lip." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Sie." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Wrz." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Paź." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Lis." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Gru" - -msgctxt "alt. month" -msgid "January" -msgstr "stycznia" - -msgctxt "alt. month" -msgid "February" -msgstr "lutego" - -msgctxt "alt. month" -msgid "March" -msgstr "marca" - -msgctxt "alt. month" -msgid "April" -msgstr "kwietnia" - -msgctxt "alt. month" -msgid "May" -msgstr "maja" - -msgctxt "alt. month" -msgid "June" -msgstr "czerwca" - -msgctxt "alt. month" -msgid "July" -msgstr "lipca" - -msgctxt "alt. month" -msgid "August" -msgstr "sierpnia" - -msgctxt "alt. month" -msgid "September" -msgstr "września" - -msgctxt "alt. month" -msgid "October" -msgstr "października" - -msgctxt "alt. month" -msgid "November" -msgstr "listopada" - -msgctxt "alt. month" -msgid "December" -msgstr "grudnia" - -msgid "This is not a valid IPv6 address." -msgstr "To nie jest poprawny adres IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "lub" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rok" -msgstr[1] "%(num)d lata" -msgstr[2] "%(num)d lat" -msgstr[3] "%(num)d roku" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d miesiąc" -msgstr[1] "%(num)d miesiące" -msgstr[2] "%(num)d miesięcy" -msgstr[3] "%(num)d miesiąca" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tydzień" -msgstr[1] "%(num)d tygodnie" -msgstr[2] "%(num)d tygodni" -msgstr[3] "%(num)d tygodnia" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dzień" -msgstr[1] "%(num)d dni" -msgstr[2] "%(num)d dni" -msgstr[3] "%(num)d dnia" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d godzina" -msgstr[1] "%(num)d godziny" -msgstr[2] "%(num)d godzin" -msgstr[3] "%(num)d godziny" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuty" -msgstr[2] "%(num)d minut" -msgstr[3] "%(num)d minut" - -msgid "Forbidden" -msgstr "Dostęp zabroniony" - -msgid "CSRF verification failed. Request aborted." -msgstr "Weryfikacja CSRF nie powiodła się. Żądanie zostało przerwane." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Widzisz tę wiadomość, ponieważ ta witryna HTTPS wymaga, aby przeglądarka " -"wysłała „nagłówek Referer”, a żaden nie został wysłany. Nagłówek ten jest " -"wymagany ze względów bezpieczeństwa, aby upewnić się, że twoja przeglądarka " -"nie została przechwycona przez osoby trzecie." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Jeżeli nagłówki „Referer” w Twojej przeglądarce są wyłączone, to proszę " -"włącz je ponownie. Przynajmniej dla tej strony, połączeń HTTPS lub zapytań " -"typu „same-origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Jeśli używasz taga lub " -"umieszczasz nagłówek „Referrer-Policy: no-referrer”, prosimy je usunąć. " -"Ochrona przed atakami CSRF wymaga nagłówka „Referer”, aby wykonać ścisłe " -"sprawdzenie referera HTTP. Jeśli zależy ci na prywatności, użyj alternatyw " -"takich jak dla linków do stron osób trzecich." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Widzisz tą wiadomość, ponieważ ta witryna wymaga ciasteczka CSRF do " -"przesyłania formularza. Ciasteczko to jest wymagane ze względów " -"bezpieczeństwa, aby upewnić się, że Twoja przeglądarka nie została " -"przechwycona przez osoby trzecie." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Jeżeli ciasteczka w Twojej przeglądarce są wyłączone, to proszę włącz je " -"ponownie. Przynajmniej dla tej strony lub żądań typu „same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "Więcej informacji jest dostępnych po ustawieniu DEBUG=True." - -msgid "No year specified" -msgstr "Nie określono roku" - -msgid "Date out of range" -msgstr "Data poza zakresem" - -msgid "No month specified" -msgstr "Nie określono miesiąca" - -msgid "No day specified" -msgstr "Nie określono dnia" - -msgid "No week specified" -msgstr "Nie określono tygodnia" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s nie są dostępne" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Wyświetlanie %(verbose_name_plural)s z datą przyszłą jest niedostępne, gdyż " -"atrybut '%(class_name)s.allow_future' ma wartość 'False'." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Ciąg znaków „%(datestr)s” jest niezgodny z podanym formatem daty „%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nie znaleziono %(verbose_name)s spełniających wybrane kryteria" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Podanego numeru strony nie można przekształcić na liczbę całkowitą, nie " -"przyjął on również wartości „last” oznaczającej ostatnią stronę z dostępnego " -"zakresu." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nieprawidłowy numer strony (%(page_number)s): %(message)s " - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"Lista nie zawiera żadnych elementów, a atrybut „%(class_name)s.allow_empty” " -"ma wartość False." - -msgid "Directory indexes are not allowed here." -msgstr "Wyświetlanie zawartości katalogu jest tu niedozwolone." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s” nie istnieje" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Zawartość %(directory)s " - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacja przebiegła pomyślnie! Gratulacje!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Zobacz informacje o wydaniu dla Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Widzisz tę stronę, ponieważ w swoim pliku ustawień masz DEBUG=True i nie skonfigurowałeś " -"żadnych URL-i." - -msgid "Django Documentation" -msgstr "Dokumentacja Django" - -msgid "Topics, references, & how-to’s" -msgstr "Przewodniki tematyczne, podręczniki i przewodniki „jak to zrobić”" - -msgid "Tutorial: A Polling App" -msgstr "Samouczek: Aplikacja ankietowa" - -msgid "Get started with Django" -msgstr "Pierwsze kroki z Django" - -msgid "Django Community" -msgstr "Społeczność Django" - -msgid "Connect, get help, or contribute" -msgstr "Nawiąż kontakt, uzyskaj pomoc lub wnieś swój wkład" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pl/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/pl/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pl/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/pl/formats.py deleted file mode 100644 index 2ad1bfe..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/pl/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j E Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j E" -SHORT_DATE_FORMAT = "d-m-Y" -SHORT_DATETIME_FORMAT = "d-m-Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%y-%m-%d", # '06-10-25' - # "%d. %B %Y", # '25. października 2006' - # "%d. %b. %Y", # '25. paź. 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = " " -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index d7745a7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index b4d3a88..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,1330 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Raúl Pedro Fernandes Santos, 2014 -# Bruno Miguel Custódio , 2012 -# Claudio Fernandes , 2015 -# Jannis Leidel , 2011 -# José Durães , 2014 -# jorgecarleitao , 2014-2015 -# Manuela Silva , 2025 -# Nuno Mariz , 2011-2013,2015-2018 -# 12574c6d66324e145c1d19e02acecb73_84badd8 <4e8d94859927eab3b50486d21249c068_5346>, 2011 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Manuela Silva , 2025\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Africâner" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "Árabe Argelino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerbaijano" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorusso" - -msgid "Bengali" -msgstr "Bengalês" - -msgid "Breton" -msgstr "Bretão" - -msgid "Bosnian" -msgstr "Bósnio" - -msgid "Catalan" -msgstr "Catalão" - -msgid "Central Kurdish (Sorani)" -msgstr "Curdo Central (Sorani)" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galês" - -msgid "Danish" -msgstr "Dinamarquês" - -msgid "German" -msgstr "Alemão" - -msgid "Lower Sorbian" -msgstr "Sorbedo inferior" - -msgid "Greek" -msgstr "Grego" - -msgid "English" -msgstr "Inglês" - -msgid "Australian English" -msgstr "Inglês da Austrália" - -msgid "British English" -msgstr "Inglês Britânico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Espanhol" - -msgid "Argentinian Spanish" -msgstr "Espanhol Argentino" - -msgid "Colombian Spanish" -msgstr "Espanhol Colombiano" - -msgid "Mexican Spanish" -msgstr "Espanhol mexicano" - -msgid "Nicaraguan Spanish" -msgstr "Nicarágua Espanhol" - -msgid "Venezuelan Spanish" -msgstr "Espanhol Venezuelano" - -msgid "Estonian" -msgstr "Estónio" - -msgid "Basque" -msgstr "Basco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Filandês" - -msgid "French" -msgstr "Francês" - -msgid "Frisian" -msgstr "Frisão" - -msgid "Irish" -msgstr "Irlandês" - -msgid "Scottish Gaelic" -msgstr "Escocês Gaélico" - -msgid "Galician" -msgstr "Galaciano" - -msgid "Hebrew" -msgstr "Hebraico" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Sorbedo superior" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "Arménio" - -msgid "Interlingua" -msgstr "Interlíngua" - -msgid "Indonesian" -msgstr "Indonésio" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandês" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonês" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Cazaque" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Canarês" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxemburguês" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letão" - -msgid "Macedonian" -msgstr "Macedónio" - -msgid "Malayalam" -msgstr "Malaiala" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Birmanês" - -msgid "Norwegian Bokmål" -msgstr "Norueguês Bokmål" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Holandês" - -msgid "Norwegian Nynorsk" -msgstr "Norueguês (Nynors)" - -msgid "Ossetic" -msgstr "Ossetic" - -msgid "Punjabi" -msgstr "Panjabi" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Português" - -msgid "Brazilian Portuguese" -msgstr "Português Brasileiro" - -msgid "Romanian" -msgstr "Romeno" - -msgid "Russian" -msgstr "Russo" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanês" - -msgid "Serbian" -msgstr "Sérvio" - -msgid "Serbian Latin" -msgstr "Sérvio Latim" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suaíli" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajique" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurte" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "Ucraniano" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chinês Simplificado" - -msgid "Traditional Chinese" -msgstr "Chinês Tradicional" - -msgid "Messages" -msgstr "Mensagens" - -msgid "Site Maps" -msgstr "Mapas do Site" - -msgid "Static Files" -msgstr "Ficheiros Estáticos" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Esse número de página não é um número inteiro" - -msgid "That page number is less than 1" -msgstr "Esse número de página é inferior a 1" - -msgid "That page contains no results" -msgstr "Essa página não contém resultados" - -msgid "Enter a valid value." -msgstr "Introduza um valor válido." - -msgid "Enter a valid domain name." -msgstr "Insira um nome de domínio válido." - -msgid "Enter a valid URL." -msgstr "Introduza um URL válido." - -msgid "Enter a valid integer." -msgstr "Introduza um número inteiro válido." - -msgid "Enter a valid email address." -msgstr "Introduza um endereço de e-mail válido." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Insira um endereço %(protocol)s válido." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ou IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Introduza apenas números separados por vírgulas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Garanta que este valor seja %(limit_value)s (tem %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Garanta que este valor seja menor ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Garanta que este valor seja maior ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Garanta que este valor tenha pelo menos %(limit_value)d caractere (tem " -"%(show_value)d)." -msgstr[1] "" -"Garanta que este valor tenha pelo menos %(limit_value)d caracteres (tem " -"%(show_value)d)." -msgstr[2] "" -"Garanta que este valor tenha pelo menos %(limit_value)d caracteres (tem " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Garanta que este valor tenha no máximo %(limit_value)d caractere (tem " -"%(show_value)d)." -msgstr[1] "" -"Garanta que este valor tenha no máximo %(limit_value)d caracteres (tem " -"%(show_value)d)." -msgstr[2] "" -"Garanta que este valor tenha no máximo %(limit_value)d caracteres (tem " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Introduza um número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Garanta que não tem mais de %(max)s dígito no total." -msgstr[1] "Garanta que não tem mais de %(max)s dígitos no total." -msgstr[2] "Garanta que não tem mais de %(max)s dígitos no total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Garanta que não tem mais %(max)s casa decimal." -msgstr[1] "Garanta que não tem mais %(max)s casas decimais." -msgstr[2] "Garanta que não tem mais %(max)s casas decimais." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Garanta que não tem mais de %(max)s dígito antes do ponto decimal." -msgstr[1] "Garanta que não tem mais de %(max)s dígitos antes do ponto decimal." -msgstr[2] "Garanta que não tem mais de %(max)s dígitos antes do ponto decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Não são permitidos caracteres nulos." - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s com este %(field_labels)s já existe." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "O valor %(value)r não é uma escolha válida." - -msgid "This field cannot be null." -msgstr "Este campo não pode ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo não pode ser vazio." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s com este %(field_label)s já existe." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s tem de ser único para %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo do tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Pode ser True ou False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (até %(max_length)s)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Inteiros separados por virgula" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Data (sem hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Data (com hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Número décimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Duração" - -msgid "Email address" -msgstr "Endereço de e-mail" - -msgid "File path" -msgstr "Caminho do ficheiro" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Número em vírgula flutuante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Inteiro" - -msgid "Big (8 byte) integer" -msgstr "Inteiro grande (8 byte)" - -msgid "Small integer" -msgstr "Inteiro pequeno" - -msgid "IPv4 address" -msgstr "Endereço IPv4" - -msgid "IP address" -msgstr "Endereço IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Pode ser True, False ou None)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Inteiro positivo" - -msgid "Positive small integer" -msgstr "Pequeno número inteiro positivo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (até %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dados binários simples" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "Identificador único universal" - -msgid "File" -msgstr "Ficheiro" - -msgid "Image" -msgstr "Imagem" - -msgid "A JSON object" -msgstr "Um objeto JSON" - -msgid "Value must be valid JSON." -msgstr "O valor deve ser JSON válido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Chave Estrangeira (tipo determinado pelo campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relação de um-para-um" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relação de %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relações de %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relação de muitos-para-muitos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo é obrigatório." - -msgid "Enter a whole number." -msgstr "Introduza um número inteiro." - -msgid "Enter a valid date." -msgstr "Introduza uma data válida." - -msgid "Enter a valid time." -msgstr "Introduza uma hora válida." - -msgid "Enter a valid date/time." -msgstr "Introduza uma data/hora válida." - -msgid "Enter a valid duration." -msgstr "Introduza uma duração válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "O número de dias deve ser entre {min_days} e {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Nenhum ficheiro foi submetido. Verifique o tipo de codificação do formulário." - -msgid "No file was submitted." -msgstr "Nenhum ficheiro submetido." - -msgid "The submitted file is empty." -msgstr "O ficheiro submetido encontra-se vazio." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Garanta que o nome deste ficheiro tenha no máximo %(max)d caractere (tem " -"%(length)d)." -msgstr[1] "" -"Garanta que o nome deste ficheiro tenha no máximo %(max)d caracteres (tem " -"%(length)d)." -msgstr[2] "" -"Garanta que o nome deste ficheiro tenha no máximo %(max)d caracteres (tem " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Por favor, submeta um ficheiro ou remova a seleção da caixa, não ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Introduza uma imagem válida. O ficheiro que introduziu ou não é uma imagem " -"ou está corrompido." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Selecione uma opção válida. %(value)s não se encontra nas opções disponíveis." - -msgid "Enter a list of values." -msgstr "Introduza uma lista de valores." - -msgid "Enter a complete value." -msgstr "Introduza um valor completo." - -msgid "Enter a valid UUID." -msgstr "Introduza um UUID válido." - -msgid "Enter a valid JSON." -msgstr "Insira um JSON válido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Order" -msgstr "Ordem" - -msgid "Delete" -msgstr "Remover" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor corrija os dados duplicados em %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor corrija os dados duplicados em %(field)s, que deverá ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor corrija os dados duplicados em %(field_name)s que deverá ser único " -"para o %(lookup)s em %(date_field)s.\"" - -msgid "Please correct the duplicate values below." -msgstr "Por favor corrija os valores duplicados abaixo." - -msgid "The inline value did not match the parent instance." -msgstr "O valor em linha não corresponde à instância pai." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Selecione uma opção válida. Esse valor não se encontra opções disponíveis." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Limpar" - -msgid "Currently" -msgstr "Atualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconhecido" - -msgid "Yes" -msgstr "Sim" - -msgid "No" -msgstr "Não" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sim,não,talvez" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "meia-noite" - -msgid "noon" -msgstr "meio-dia" - -msgid "Monday" -msgstr "Segunda-feira" - -msgid "Tuesday" -msgstr "Terça-feira" - -msgid "Wednesday" -msgstr "Quarta-feira" - -msgid "Thursday" -msgstr "Quinta-feira" - -msgid "Friday" -msgstr "Sexta-feira" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Seg" - -msgid "Tue" -msgstr "Ter" - -msgid "Wed" -msgstr "Qua" - -msgid "Thu" -msgstr "Qui" - -msgid "Fri" -msgstr "Sex" - -msgid "Sat" -msgstr "Sáb" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Janeiro" - -msgid "February" -msgstr "Fevereiro" - -msgid "March" -msgstr "Março" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Junho" - -msgid "July" -msgstr "Julho" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Dezembro" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "fev" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "out" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dez" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Fev." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Março" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maio" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Jun." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Jul." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Out." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dez." - -msgctxt "alt. month" -msgid "January" -msgstr "Janeiro" - -msgctxt "alt. month" -msgid "February" -msgstr "Fevereiro" - -msgctxt "alt. month" -msgid "March" -msgstr "Março" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Maio" - -msgctxt "alt. month" -msgid "June" -msgstr "Junho" - -msgctxt "alt. month" -msgid "July" -msgstr "Julho" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Setembro" - -msgctxt "alt. month" -msgid "October" -msgstr "Outubro" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembro" - -msgctxt "alt. month" -msgid "December" -msgstr "Dezembro" - -msgid "This is not a valid IPv6 address." -msgstr "Este não é um endereço IPv6 válido." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ou" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" -msgstr[2] "%(num)d anos" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mês" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dias" -msgstr[2] "%(num)d dias" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -msgid "Forbidden" -msgstr "Proibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "A verificação de CSRF falhou. Pedido abortado." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Está a ver esta mensagem porque este site requer um cookie CSRF quando " -"submete formulários. Este cookie é requirido por razões de segurança, para " -"garantir que o seu browser não está a ser \"raptado\" por terceiros." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Está disponível mais informação com DEBUG=True." - -msgid "No year specified" -msgstr "Nenhum ano especificado" - -msgid "Date out of range" -msgstr "Data fora do alcance" - -msgid "No month specified" -msgstr "Nenhum mês especificado" - -msgid "No day specified" -msgstr "Nenhum dia especificado" - -msgid "No week specified" -msgstr "Nenhuma semana especificado" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nenhum %(verbose_name_plural)s disponível" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s futuros indisponíveis porque %(class_name)s." -"allow_future é False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nenhum %(verbose_name)s de acordo com a procura." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Índices de diretório não são permitidas aqui." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" não existe" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "A instalação funcionou com sucesso! Parabéns!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Visualizar notas de lançamento do Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Está a visualizar esta página porque tem DEBUG=True no seu ficheiro settings do Django e não " -"configurou nenhum URLs." - -msgid "Django Documentation" -msgstr "Documentação do Django" - -msgid "Topics, references, & how-to’s" -msgstr "Tópicos, referências, e como..." - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: A Polling App" - -msgid "Get started with Django" -msgstr "Comece com o Django" - -msgid "Django Community" -msgstr "Comunidade Django" - -msgid "Connect, get help, or contribute" -msgstr "Conecte-se, obtenha ajuda ou contribua" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pt/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/pt/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pt/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/pt/formats.py deleted file mode 100644 index bb4b3f5..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/pt/formats.py +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y à\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - # "%d de %b de %Y", # '25 de Out de 2006' - # "%d de %b, %Y", # '25 Out, 2006' - # "%d de %B de %Y", # '25 de Outubro de 2006' - # "%d de %B, %Y", # '25 de Outubro, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index 41fb501..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index 11ee807..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,1403 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# Amanda Savluchinske , 2019 -# amcorreia , 2018 -# andrewsmedina , 2014-2015 -# Arthur Silva , 2017 -# bruno.devpod , 2014 -# Camilo B. Moreira , 2017 -# Carlos Cadu “Cadu” Leite , 2020 -# Carlos Cadu “Cadu” Leite , 2016,2019 -# Filipe Cifali , 2016 -# Claudio Rogerio Carvalho Filho , 2020 -# dudanogueira , 2012 -# dudanogueira , 2019 -# Eduardo Felipe Castegnaro , 2024 -# Elyézer Rezende , 2013 -# Fábio C. Barrionuevo da Luz , 2014-2015 -# Felipe Rodrigues , 2016 -# Filipe Cifali , 2019 -# Gladson , 2013 -# fa9e10542e458baef0599ae856e43651_13d2225, 2011-2014 -# Guilherme , 2022 -# Heron Fonsaca, 2022 -# Hugo Tácito , 2024 -# Igor Cavalcante , 2017 -# Jannis Leidel , 2011 -# Jonas Rodrigues, 2023 -# Leonardo Gregianin, 2023 -# Lucas Infante , 2015 -# Luiz Boaretto , 2017 -# Marssal Jr. , 2022 -# Marcelo Moro Brondani , 2018 -# Mariusz Felisiak , 2021 -# Rafael Fontenelle , 2021-2022 -# Samuel Nogueira Bacelar , 2020 -# Sandro , 2011 -# Sergio Garcia , 2015 -# Tânia Andrea , 2017 -# Wiliam Souza , 2015 -# Francisco Petry Rauber , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" -"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Afrikaans" -msgstr "Africânder" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "Árabe Argelino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerbaijão" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorrussa" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Bretão" - -msgid "Bosnian" -msgstr "Bósnio" - -msgid "Catalan" -msgstr "Catalão" - -msgid "Central Kurdish (Sorani)" -msgstr "Curdo Central (Sorâni)" - -msgid "Czech" -msgstr "Tcheco" - -msgid "Welsh" -msgstr "Galês" - -msgid "Danish" -msgstr "Dinamarquês" - -msgid "German" -msgstr "Alemão" - -msgid "Lower Sorbian" -msgstr "Sorábio Baixo" - -msgid "Greek" -msgstr "Grego" - -msgid "English" -msgstr "Inglês" - -msgid "Australian English" -msgstr "Inglês Australiano" - -msgid "British English" -msgstr "Inglês Britânico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Espanhol" - -msgid "Argentinian Spanish" -msgstr "Espanhol Argentino" - -msgid "Colombian Spanish" -msgstr "Espanhol Colombiano" - -msgid "Mexican Spanish" -msgstr "Espanhol Mexicano" - -msgid "Nicaraguan Spanish" -msgstr "Espanhol Nicaraguense" - -msgid "Venezuelan Spanish" -msgstr "Espanhol Venuzuelano" - -msgid "Estonian" -msgstr "Estoniano" - -msgid "Basque" -msgstr "Basco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finlandês" - -msgid "French" -msgstr "Francês" - -msgid "Frisian" -msgstr "Frísia" - -msgid "Irish" -msgstr "Irlandês" - -msgid "Scottish Gaelic" -msgstr "Gaélico Escocês" - -msgid "Galician" -msgstr "Galiciano" - -msgid "Hebrew" -msgstr "Hebraico" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Sorábio Alto" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "Armênio" - -msgid "Interlingua" -msgstr "Interlíngua" - -msgid "Indonesian" -msgstr "Indonésio" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandês" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonês" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "Cabila" - -msgid "Kazakh" -msgstr "Cazaque" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Canarês" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "Quirguiz" - -msgid "Luxembourgish" -msgstr "Luxemburguês" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letão" - -msgid "Macedonian" -msgstr "Macedônio" - -msgid "Malayalam" -msgstr "Malaiala" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malaia" - -msgid "Burmese" -msgstr "Birmanês" - -msgid "Norwegian Bokmål" -msgstr "Dano-norueguês" - -msgid "Nepali" -msgstr "Nepalês" - -msgid "Dutch" -msgstr "Neerlandês" - -msgid "Norwegian Nynorsk" -msgstr "Novo Norueguês" - -msgid "Ossetic" -msgstr "Osseto" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polonês" - -msgid "Portuguese" -msgstr "Português" - -msgid "Brazilian Portuguese" -msgstr "Português Brasileiro" - -msgid "Romanian" -msgstr "Romeno" - -msgid "Russian" -msgstr "Russo" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanesa" - -msgid "Serbian" -msgstr "Sérvio" - -msgid "Serbian Latin" -msgstr "Sérvio Latino" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suaíli" - -msgid "Tamil" -msgstr "Tâmil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tadjique" - -msgid "Thai" -msgstr "Tailandês" - -msgid "Turkmen" -msgstr "Turcomano" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uigur" - -msgid "Ukrainian" -msgstr "Ucraniano" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeque" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chinês Simplificado" - -msgid "Traditional Chinese" -msgstr "Chinês Tradicional" - -msgid "Messages" -msgstr "Mensagens" - -msgid "Site Maps" -msgstr "Site Maps" - -msgid "Static Files" -msgstr "Arquivos Estáticos" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Esse número de página não é um número inteiro" - -msgid "That page number is less than 1" -msgstr "Esse número de página é menor que 1" - -msgid "That page contains no results" -msgstr "Essa página não contém resultados" - -msgid "Enter a valid value." -msgstr "Informe um valor válido." - -msgid "Enter a valid domain name." -msgstr "Informe um domínio válido." - -msgid "Enter a valid URL." -msgstr "Informe uma URL válida." - -msgid "Enter a valid integer." -msgstr "Insira um número inteiro válido." - -msgid "Enter a valid email address." -msgstr "Informe um endereço de email válido." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Informe um “slug” válido tendo letras, números, \"underscores\" e hífens." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Informe um “slug” válido tendo letras em Unicode, números, \"underscores\" e " -"hífens." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Insira um endereço %(protocol)s válido." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ou IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Insira apenas dígitos separados por vírgulas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Certifique-se de que o valor é %(limit_value)s (ele é %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Certifique-se que este valor seja menor ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Certifique-se que este valor seja maior ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Certifique-se que este valor seja múltiplo do tamanho do passo " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Certifique-se que este valor seja múltiplo do tamanho do passo " -"%(limit_value)s, começando por %(offset)s, por exemplo %(offset)s, " -"%(valid_value1)s, %(valid_value2)s, e assim por diante." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Certifique-se de que o valor tenha no mínimo %(limit_value)d caractere (ele " -"possui %(show_value)d)." -msgstr[1] "" -"Certifique-se de que o valor tenha no mínimo %(limit_value)d caracteres (ele " -"possui %(show_value)d)." -msgstr[2] "" -"Certifique-se de que o valor tenha no mínimo %(limit_value)d caracteres (ele " -"possui %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Certifique-se de que o valor tenha no máximo %(limit_value)d caractere (ele " -"possui %(show_value)d)." -msgstr[1] "" -"Certifique-se de que o valor tenha no máximo %(limit_value)d caracteres (ele " -"possui %(show_value)d)." -msgstr[2] "" -"Certifique-se de que o valor tenha no máximo %(limit_value)d caracteres (ele " -"possui %(show_value)d)." - -msgid "Enter a number." -msgstr "Informe um número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Certifique-se de que não tenha mais de %(max)s dígito no total." -msgstr[1] "Certifique-se de que não tenha mais de %(max)s dígitos no total." -msgstr[2] "Certifique-se de que não tenha mais de %(max)s dígitos no total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Certifique-se de que não tenha mais de %(max)s casa decimal." -msgstr[1] "Certifique-se de que não tenha mais de %(max)s casas decimais." -msgstr[2] "Certifique-se de que não tenha mais de %(max)s casas decimais." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Certifique-se de que não tenha mais de %(max)s dígito antes do ponto decimal." -msgstr[1] "" -"Certifique-se de que não tenha mais de %(max)s dígitos antes do ponto " -"decimal." -msgstr[2] "" -"Certifique-se de que não tenha mais de %(max)s dígitos antes do ponto " -"decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"A extensão de arquivo “%(extension)s” não é permitida. As extensões válidas " -"são: %(allowed_extensions)s ." - -msgid "Null characters are not allowed." -msgstr "Caracteres nulos não são permitidos." - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s com este %(field_labels)s já existe." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Restrição \"%(name)s\" foi violada." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valor %(value)r não é uma opção válida." - -msgid "This field cannot be null." -msgstr "Este campo não pode ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo não pode estar vazio." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s com este %(field_label)s já existe." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s deve ser único para %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo do tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "o valor “%(value)s” deve ser True ou False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "o valor “%(value)s” deve ser True, False ou None." - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Verdadeiro ou Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (até %(max_length)s)" - -msgid "String (unlimited)" -msgstr "String (ilimitado)" - -msgid "Comma-separated integers" -msgstr "Inteiros separados por vírgula" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"O valor \"%(value)s\" tem um formato de data inválido. Deve ser no formato " -"YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"O valor “%(value)s” tem o formato correto (YYYY-MM-DD) mas uma data inválida." - -msgid "Date (without time)" -msgstr "Data (sem hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"O valor “%(value)s” tem um formato inválido. Deve estar no formato YYYY-MM-" -"DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"O valor “%(value)s” está no formato correto. (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) mas é uma data/hora inválida" - -msgid "Date (with time)" -msgstr "Data (com hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "O valor “%(value)s” deve ser um número decimal." - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"O valor “%(value)s” está em um formato inválido. Deve ser no formato [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Duração" - -msgid "Email address" -msgstr "Endereço de e-mail" - -msgid "File path" -msgstr "Caminho do arquivo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "O valor “%(value)s” deve ser um float." - -msgid "Floating point number" -msgstr "Número de ponto flutuante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "O valor “%(value)s” deve ser inteiro." - -msgid "Integer" -msgstr "Inteiro" - -msgid "Big (8 byte) integer" -msgstr "Inteiro grande (8 byte)" - -msgid "Small integer" -msgstr "Inteiro curto" - -msgid "IPv4 address" -msgstr "Endereço IPv4" - -msgid "IP address" -msgstr "Endereço IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "O valor “%(value)s” deve ser None, True ou False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadeiro, Falso ou Nada)" - -msgid "Positive big integer" -msgstr "Inteiro grande positivo" - -msgid "Positive integer" -msgstr "Inteiro positivo" - -msgid "Positive small integer" -msgstr "Inteiro curto positivo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (até %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"O valor “%(value)s” tem um formato inválido. Deve estar no formato HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"O valor “%(value)s” está no formato correto (HH:MM[:ss[.uuuuuu]]) mas é uma " -"hora inválida." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dados binários bruto" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "O valor “%(value)s” não é um UUID válido" - -msgid "Universally unique identifier" -msgstr "Identificador único universal" - -msgid "File" -msgstr "Arquivo" - -msgid "Image" -msgstr "Imagem" - -msgid "A JSON object" -msgstr "Um objeto JSON" - -msgid "Value must be valid JSON." -msgstr "O valor deve ser um JSON válido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "A instância de %(model)s com %(field)s %(value)r não existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Chave Estrangeira (tipo determinado pelo campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relacionamento um-para-um" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relacionamento %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relacionamentos %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relacionamento muitos-para-muitos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo é obrigatório." - -msgid "Enter a whole number." -msgstr "Informe um número inteiro." - -msgid "Enter a valid date." -msgstr "Informe uma data válida." - -msgid "Enter a valid time." -msgstr "Informe uma hora válida." - -msgid "Enter a valid date/time." -msgstr "Informe uma data/hora válida." - -msgid "Enter a valid duration." -msgstr "Insira uma duração válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "O número de dias deve ser entre {min_days} e {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nenhum arquivo enviado. Verifique o tipo de codificação do formulário." - -msgid "No file was submitted." -msgstr "Nenhum arquivo foi enviado." - -msgid "The submitted file is empty." -msgstr "O arquivo enviado está vazio." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Certifique-se de que o arquivo tenha no máximo %(max)d caractere (ele possui " -"%(length)d)." -msgstr[1] "" -"Certifique-se de que o arquivo tenha no máximo %(max)d caracteres (ele " -"possui %(length)d)." -msgstr[2] "" -"Certifique-se de que o arquivo tenha no máximo %(max)d caracteres (ele " -"possui %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Por favor, envie um arquivo ou marque o checkbox, mas não ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Envie uma imagem válida. O arquivo enviado não é uma imagem ou está " -"corrompido." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Faça uma escolha válida. %(value)s não é uma das escolhas disponíveis." - -msgid "Enter a list of values." -msgstr "Informe uma lista de valores." - -msgid "Enter a complete value." -msgstr "Insira um valor completo." - -msgid "Enter a valid UUID." -msgstr "Insira um UUID válido." - -msgid "Enter a valid JSON." -msgstr "Insira um JSON válido" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Dados de ManagementForm estão faltando ou foram adulterados. Campos " -"ausentes: %(field_names)s. Você pode precisar enviar um relatório de bug se " -"o problema persistir." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Por favor, envie no máximo %(num)d formulário." -msgstr[1] "Por favor, envie no máximo %(num)d formulários." -msgstr[2] "Por favor, envie no máximo %(num)d formulários." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Por favor, envie ao menos %(num)d formulário." -msgstr[1] "Por favor, envie ao menos %(num)d formulários." -msgstr[2] "Por favor, envie ao menos %(num)d formulários." - -msgid "Order" -msgstr "Ordem" - -msgid "Delete" -msgstr "Remover" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija o valor duplicado para %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor, corrija o valor duplicado para %(field)s, o qual deve ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor, corrija o dado duplicado para %(field_name)s, o qual deve ser " -"único para %(lookup)s em %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija os valores duplicados abaixo." - -msgid "The inline value did not match the parent instance." -msgstr "O valor na linha não correspondeu com a instância pai." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Faça uma escolha válida. Sua escolha não é uma das disponíveis." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” não é um valor válido." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s não pode ser interpretada dentro da fuso horário " -"%(current_timezone)s; está ambíguo ou não existe." - -msgid "Clear" -msgstr "Limpar" - -msgid "Currently" -msgstr "Atualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconhecido" - -msgid "Yes" -msgstr "Sim" - -msgid "No" -msgstr "Não" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sim,não,talvez" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "meia-noite" - -msgid "noon" -msgstr "meio-dia" - -msgid "Monday" -msgstr "Segunda-feira" - -msgid "Tuesday" -msgstr "Terça-feira" - -msgid "Wednesday" -msgstr "Quarta-feira" - -msgid "Thursday" -msgstr "Quinta-feira" - -msgid "Friday" -msgstr "Sexta-feira" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Seg" - -msgid "Tue" -msgstr "Ter" - -msgid "Wed" -msgstr "Qua" - -msgid "Thu" -msgstr "Qui" - -msgid "Fri" -msgstr "Sex" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Janeiro" - -msgid "February" -msgstr "Fevereiro" - -msgid "March" -msgstr "Março" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Junho" - -msgid "July" -msgstr "Julho" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Dezembro" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "fev" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "out" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dez" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Fev." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Março" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maio" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junho" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julho" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Out." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dez." - -msgctxt "alt. month" -msgid "January" -msgstr "Janeiro" - -msgctxt "alt. month" -msgid "February" -msgstr "Fevereiro" - -msgctxt "alt. month" -msgid "March" -msgstr "Março" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Maio" - -msgctxt "alt. month" -msgid "June" -msgstr "Junho" - -msgctxt "alt. month" -msgid "July" -msgstr "Julho" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Setembro" - -msgctxt "alt. month" -msgid "October" -msgstr "Outubro" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembro" - -msgctxt "alt. month" -msgid "December" -msgstr "Dezembro" - -msgid "This is not a valid IPv6 address." -msgstr "Este não é um endereço IPv6 válido." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr " %(truncated_text)s…" - -msgid "or" -msgstr "ou" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" -msgstr[2] "%(num)d anos" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mês" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dias" -msgstr[2] "%(num)d dias" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -msgid "Forbidden" -msgstr "Proibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verificação CSRF falhou. Pedido cancelado." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Você está vendo esta mensagem porque este site HTTPS requer que um " -"“cabeçalho Refer” seja enviado pelo seu navegador da web, mas nenhum foi " -"enviado. Este cabeçalho é necessário por motivos de segurança, para garantir " -"que seu navegador não seja invadido por terceiros." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Se você configurou seu browser para desabilitar os cabeçalhos “Referer”, por " -"favor reabilite-os, ao menos para este site, ou para conexões HTTPS, ou para " -"requisições “same-origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Se estiver usando a tag ou " -"incluindo o cabeçalho “Referrer-Policy: no-referrer”, por favor remova-os. A " -"proteção CSRF requer o cabeçalho “Referer” para fazer a checagem de " -"referência. Se estiver preocupado com privacidade, use alternativas como para links de sites de terceiros." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Você está vendo esta mensagem, porque este site requer um cookie CSRF no " -"envio de formulários. Este cookie é necessário por razões de segurança, para " -"garantir que o seu browser não está sendo sequestrado por terceiros." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Se você configurou seu browser para desabilitar cookies, por favor reabilite-" -"os, ao menos para este site ou para requisições do tipo \"same-origin\"." - -msgid "More information is available with DEBUG=True." -msgstr "Mais informações estão disponíveis com DEBUG=True." - -msgid "No year specified" -msgstr "Ano não especificado" - -msgid "Date out of range" -msgstr "Data fora de alcance" - -msgid "No month specified" -msgstr "Mês não especificado" - -msgid "No day specified" -msgstr "Dia não especificado" - -msgid "No week specified" -msgstr "Semana não especificada" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nenhum(a) %(verbose_name_plural)s disponível" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s futuros não disponíveis pois %(class_name)s." -"allow_future é False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"String de data com formato inválido “%(datestr)s” dado o formato “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "%(verbose_name)s não encontrado de acordo com a consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Página não é “last”, e também não pode ser convertida para um int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista vazia e o \"%(class_name)s.allow_empty\" está como False." - -msgid "Directory indexes are not allowed here." -msgstr "Índices de diretório não são permitidos aqui." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" não existe" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s " - -msgid "The install worked successfully! Congratulations!" -msgstr "A instalação foi com sucesso! Parabéns!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Ver as notas de lançamento do Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Você está vendo esta página pois possui DEBUG=True no seu arquivo de configurações e não " -"configurou nenhuma URL." - -msgid "Django Documentation" -msgstr "Documentação do Django" - -msgid "Topics, references, & how-to’s" -msgstr "Tópicos, referências, & how-to’s" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Um aplicativo de votação" - -msgid "Get started with Django" -msgstr "Comece a usar Django" - -msgid "Django Community" -msgstr "Comunidade Django" - -msgid "Connect, get help, or contribute" -msgstr "Conecte-se, obtenha ajuda ou contribua" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/formats.py deleted file mode 100644 index 96a49b4..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/pt_BR/formats.py +++ /dev/null @@ -1,34 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y à\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - # "%d de %b de %Y", # '24 de Out de 2006' - # "%d de %b, %Y", # '25 Out, 2006' - # "%d de %B de %Y", # '25 de Outubro de 2006' - # "%d de %B, %Y", # '25 de Outubro, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index 37e80b0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ro/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index 3b83307..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,1323 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abel Radac , 2017 -# Bogdan Mateescu, 2018-2019,2021 -# mihneasim , 2011 -# Daniel Ursache-Dogariu, 2011 -# Denis Darii , 2011,2014 -# Ionel Cristian Mărieș , 2012 -# Jannis Leidel , 2011 -# razvan ionescu , 2015 -# Razvan Stefanescu , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-25 06:49+0000\n" -"Last-Translator: Bogdan Mateescu, 2018-2019,2021\n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabă" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Asturiană" - -msgid "Azerbaijani" -msgstr "Azeră" - -msgid "Bulgarian" -msgstr "Bulgară" - -msgid "Belarusian" -msgstr "Bielorusă" - -msgid "Bengali" -msgstr "Bengaleză" - -msgid "Breton" -msgstr "Bretonă" - -msgid "Bosnian" -msgstr "Bosniacă" - -msgid "Catalan" -msgstr "Catalană" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Cehă" - -msgid "Welsh" -msgstr "Galeză" - -msgid "Danish" -msgstr "Daneză" - -msgid "German" -msgstr "Germană" - -msgid "Lower Sorbian" -msgstr "Soraba Inferioară" - -msgid "Greek" -msgstr "Greacă" - -msgid "English" -msgstr "Engleză" - -msgid "Australian English" -msgstr "Engleză australiană" - -msgid "British English" -msgstr "Engleză britanică" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spaniolă" - -msgid "Argentinian Spanish" -msgstr "Spaniolă Argentiniană" - -msgid "Colombian Spanish" -msgstr "Spaniolă Columbiană" - -msgid "Mexican Spanish" -msgstr "Spaniolă Mexicană" - -msgid "Nicaraguan Spanish" -msgstr "Spaniolă Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Spaniolă venezueleană" - -msgid "Estonian" -msgstr "Estonă" - -msgid "Basque" -msgstr "Bască" - -msgid "Persian" -msgstr "Persană" - -msgid "Finnish" -msgstr "Finlandeză" - -msgid "French" -msgstr "Franceză" - -msgid "Frisian" -msgstr "Frizian" - -msgid "Irish" -msgstr "Irlandeză" - -msgid "Scottish Gaelic" -msgstr "Galeză Scoțiană" - -msgid "Galician" -msgstr "Galiciană" - -msgid "Hebrew" -msgstr "Ebraică" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croată" - -msgid "Upper Sorbian" -msgstr "Soraba Superioară" - -msgid "Hungarian" -msgstr "Ungară" - -msgid "Armenian" -msgstr "Armeană" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indoneză" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandeză" - -msgid "Italian" -msgstr "Italiană" - -msgid "Japanese" -msgstr "Japoneză" - -msgid "Georgian" -msgstr "Georgiană" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Kazahă" - -msgid "Khmer" -msgstr "Khmeră" - -msgid "Kannada" -msgstr "Limba kannada" - -msgid "Korean" -msgstr "Koreană" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxemburgheză" - -msgid "Lithuanian" -msgstr "Lituaniană" - -msgid "Latvian" -msgstr "Letonă" - -msgid "Macedonian" -msgstr "Macedoneană" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolă" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Burmeză" - -msgid "Norwegian Bokmål" -msgstr "Norvegiana modernă" - -msgid "Nepali" -msgstr "Nepaleză" - -msgid "Dutch" -msgstr "Olandeză" - -msgid "Norwegian Nynorsk" -msgstr "Norvegiană Nynorsk" - -msgid "Ossetic" -msgstr "Osețiană" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Poloneză" - -msgid "Portuguese" -msgstr "Portugheză" - -msgid "Brazilian Portuguese" -msgstr "Portugheză braziliană" - -msgid "Romanian" -msgstr "Română" - -msgid "Russian" -msgstr "Rusă" - -msgid "Slovak" -msgstr "Slovacă" - -msgid "Slovenian" -msgstr "Slovenă" - -msgid "Albanian" -msgstr "Albaneză" - -msgid "Serbian" -msgstr "Sârbă" - -msgid "Serbian Latin" -msgstr "Sârbă latină" - -msgid "Swedish" -msgstr "Suedeză" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Limba tamila" - -msgid "Telugu" -msgstr "Limba telugu" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tailandeză" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turcă" - -msgid "Tatar" -msgstr "Tătară" - -msgid "Udmurt" -msgstr "Udmurtă" - -msgid "Ukrainian" -msgstr "Ucraineană" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbecă" - -msgid "Vietnamese" -msgstr "Vietnameză" - -msgid "Simplified Chinese" -msgstr "Chineză simplificată" - -msgid "Traditional Chinese" -msgstr "Chineză tradițională" - -msgid "Messages" -msgstr "Mesaje" - -msgid "Site Maps" -msgstr "Harta sit-ului" - -msgid "Static Files" -msgstr "Fișiere statice" - -msgid "Syndication" -msgstr "Sindicalizare" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Numărul de pagină nu este întreg" - -msgid "That page number is less than 1" -msgstr "Numărul de pagină este mai mic decât 1" - -msgid "That page contains no results" -msgstr "Această pagină nu conține nici un rezultat" - -msgid "Enter a valid value." -msgstr "Introduceți o valoare validă." - -msgid "Enter a valid URL." -msgstr "Introduceți un URL valid." - -msgid "Enter a valid integer." -msgstr "Introduceți un întreg valid." - -msgid "Enter a valid email address." -msgstr "Introduceți o adresă de email validă." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Introduceți un “slug” valid care constă în litere, numere, underscore sau " -"cratime." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Introduceţi o adresă IPv4 validă." - -msgid "Enter a valid IPv6 address." -msgstr "Intoduceți o adresă IPv6 validă." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Introduceți o adresă IPv4 sau IPv6 validă." - -msgid "Enter only digits separated by commas." -msgstr "Introduceţi numai numere separate de virgule." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Asiguraţi-vă că această valoare este %(limit_value)s (este %(show_value)s )." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Asiguraţi-vă că această valoare este mai mică sau egală cu %(limit_value)s ." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Asiguraţi-vă că această valoare este mai mare sau egală cu %(limit_value)s ." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asigurați-vă că această valoare are cel puțin %(limit_value)d caracter (are " -"%(show_value)d)." -msgstr[1] "" -"Asigurați-vă că această valoare are cel puțin %(limit_value)d caractere (are " -"%(show_value)d)." -msgstr[2] "" -"Asigurați-vă că această valoare are cel puțin %(limit_value)d de caractere " -"(are %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asigurați-vă că această valoare are cel mult %(limit_value)d caracter (are " -"%(show_value)d)." -msgstr[1] "" -"Asigurați-vă că această valoare are cel mult %(limit_value)d caractere (are " -"%(show_value)d)." -msgstr[2] "" -"Asigurați-vă că această valoare are cel mult %(limit_value)d de caractere " -"(are %(show_value)d)." - -msgid "Enter a number." -msgstr "Introduceţi un număr." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asigurați-vă că nu este mai mult de %(max)s cifră în total." -msgstr[1] "Asigurați-vă că nu sunt mai mult de %(max)s cifre în total." -msgstr[2] "Asigurați-vă că nu sunt mai mult de %(max)s de cifre în total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asigurați-vă că nu este mai mult de %(max)s zecimală în total." -msgstr[1] "Asigurați-vă că nu sunt mai mult de %(max)s zecimale în total." -msgstr[2] "Asigurați-vă că nu sunt mai mult de %(max)s de zecimale în total." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asigurați-vă că nu este mai mult de %(max)s cifră înainte de punctul zecimal." -msgstr[1] "" -"Asigurați-vă că nu sunt mai mult de %(max)s cifre înainte de punctul zecimal." -msgstr[2] "" -"Asigurați-vă că nu sunt mai mult de %(max)s de cifre înainte de punctul " -"zecimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Caracterele Null nu sunt permise." - -msgid "and" -msgstr "și" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s cu acest %(field_labels)s există deja." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valoarea %(value)r nu este o opțiune validă." - -msgid "This field cannot be null." -msgstr "Acest câmp nu poate fi nul." - -msgid "This field cannot be blank." -msgstr "Acest câmp nu poate fi gol." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s cu %(field_label)s deja există." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s trebuie să fie unic(e) pentru %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Câmp de tip: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (adevărat sau fals)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Şir de caractere (cel mult %(max_length)s caractere)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Numere întregi separate de virgule" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Dată (fară oră)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Dată (cu oră)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Număr zecimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Durată" - -msgid "Email address" -msgstr "Adresă e-mail" - -msgid "File path" -msgstr "Calea fisierului" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Număr cu virgulă" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Întreg" - -msgid "Big (8 byte) integer" -msgstr "Întreg mare (8 octeți)" - -msgid "Small integer" -msgstr "Întreg mic" - -msgid "IPv4 address" -msgstr "Adresă IPv4" - -msgid "IP address" -msgstr "Adresă IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (adevărat, fals sau niciuna)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Întreg pozitiv" - -msgid "Positive small integer" -msgstr "Întreg pozitiv mic" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (până la %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Timp" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Date binare brute" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "Identificator unic universal" - -msgid "File" -msgstr "Fișier" - -msgid "Image" -msgstr "Imagine" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Instanța %(model)s cu %(field)s %(value)r inexistentă." - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (tip determinat de câmpul aferent)" - -msgid "One-to-one relationship" -msgstr "Relaţie unul-la-unul" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relație %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relații %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relație multe-la-multe" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Acest câmp este obligatoriu." - -msgid "Enter a whole number." -msgstr "Introduceţi un număr întreg." - -msgid "Enter a valid date." -msgstr "Introduceți o dată validă." - -msgid "Enter a valid time." -msgstr "Introduceți o oră validă." - -msgid "Enter a valid date/time." -msgstr "Introduceți o dată/oră validă." - -msgid "Enter a valid duration." -msgstr "Introduceți o durată validă." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Numărul de zile trebuie să fie cuprins între {min_days} și {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nici un fișier nu a fost trimis. Verificați tipul fișierului." - -msgid "No file was submitted." -msgstr "Nici un fișier nu a fost trimis." - -msgid "The submitted file is empty." -msgstr "Fișierul încărcat este gol." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asigurați-vă că numele fișierului are cel mult %(max)d caracter (are " -"%(length)d)." -msgstr[1] "" -"Asigurați-vă că numele fișierului are cel mult %(max)d caractere (are " -"%(length)d)." -msgstr[2] "" -"Asigurați-vă că numele fișierului are cel mult %(max)d de caractere (are " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Fie indicați un fişier, fie bifaţi caseta de selectare, nu ambele." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Încărcaţi o imagine validă. Fişierul încărcat nu era o imagine sau era o " -"imagine coruptă." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Selectați o opțiune validă. %(value)s nu face parte din opțiunile " -"disponibile." - -msgid "Enter a list of values." -msgstr "Introduceți o listă de valori." - -msgid "Enter a complete value." -msgstr "Introduceți o valoare completă." - -msgid "Enter a valid UUID." -msgstr "Introduceți un UUID valid." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Câmp ascuns %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Order" -msgstr "Ordine" - -msgid "Delete" -msgstr "Șterge" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Corectaţi datele duplicate pentru %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Corectaţi datele duplicate pentru %(field)s , ce trebuie să fie unic." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Corectaţi datele duplicate pentru %(field_name)s , care trebuie să fie unice " -"pentru %(lookup)s în %(date_field)s ." - -msgid "Please correct the duplicate values below." -msgstr "Corectaţi valorile duplicate de mai jos." - -msgid "The inline value did not match the parent instance." -msgstr "Valoarea în linie nu s-a potrivit cu instanța părinte." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Selectați o opțiune validă. Această opțiune nu face parte din opțiunile " -"disponibile." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Șterge" - -msgid "Currently" -msgstr "În prezent" - -msgid "Change" -msgstr "Schimbă" - -msgid "Unknown" -msgstr "Necunoscut" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Nu" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "da,nu,poate" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d octet" -msgstr[1] "%(size)d octeţi" -msgstr[2] "%(size)d de octeţi" - -#, python-format -msgid "%s KB" -msgstr "%s KO" - -#, python-format -msgid "%s MB" -msgstr "%s MO" - -#, python-format -msgid "%s GB" -msgstr "%s GO" - -#, python-format -msgid "%s TB" -msgstr "%s TO" - -#, python-format -msgid "%s PB" -msgstr "%s PO" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "miezul nopții" - -msgid "noon" -msgstr "amiază" - -msgid "Monday" -msgstr "Luni" - -msgid "Tuesday" -msgstr "Marți" - -msgid "Wednesday" -msgstr "Miercuri" - -msgid "Thursday" -msgstr "Joi" - -msgid "Friday" -msgstr "Vineri" - -msgid "Saturday" -msgstr "Sâmbătă" - -msgid "Sunday" -msgstr "Duminică" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mie" - -msgid "Thu" -msgstr "Joi" - -msgid "Fri" -msgstr "Vin" - -msgid "Sat" -msgstr "Sâm" - -msgid "Sun" -msgstr "Dum" - -msgid "January" -msgstr "Ianuarie" - -msgid "February" -msgstr "Februarie" - -msgid "March" -msgstr "Martie" - -msgid "April" -msgstr "Aprilie" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Iunie" - -msgid "July" -msgstr "Iulie" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "Septembrie" - -msgid "October" -msgstr "Octombrie" - -msgid "November" -msgstr "Noiembrie" - -msgid "December" -msgstr "Decembrie" - -msgid "jan" -msgstr "ian" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "iun" - -msgid "jul" -msgstr "iul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "noi" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ian." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Martie" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprilie" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Iunie" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Iulie" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Noie." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Ianuarie" - -msgctxt "alt. month" -msgid "February" -msgstr "Februarie" - -msgctxt "alt. month" -msgid "March" -msgstr "Martie" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprilie" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Iunie" - -msgctxt "alt. month" -msgid "July" -msgstr "Iulie" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "Septembrie" - -msgctxt "alt. month" -msgid "October" -msgstr "Octombrie" - -msgctxt "alt. month" -msgid "November" -msgstr "Noiembrie" - -msgctxt "alt. month" -msgid "December" -msgstr "Decembrie" - -msgid "This is not a valid IPv6 address." -msgstr "Aceasta nu este o adresă IPv6 validă." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "sau" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d an" -msgstr[1] "%(num)d ani" -msgstr[2] "%(num)d de ani" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d lună" -msgstr[1] "%(num)d luni" -msgstr[2] "%(num)d de luni" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d săptămână" -msgstr[1] "%(num)d săptămâni" -msgstr[2] "%(num)d de săptămâni" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d zi" -msgstr[1] "%(num)d zile" -msgstr[2] "%(num)d de zile" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d oră" -msgstr[1] "%(num)d ore" -msgstr[2] "%(num)d de ore" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minute" -msgstr[2] "%(num)d de minute" - -msgid "Forbidden" -msgstr "Interzis" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verificarea CSRF nereușită. Cerere eșuată." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Vedeți acest mesaj deoarece această pagină web necesită un cookie CSRF la " -"trimiterea formularelor. Acest cookie este necesar din motive de securitate, " -"pentru a se asigura că browserul nu este deturnat de terți." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Mai multe informații sunt disponibile pentru DEBUG=True." - -msgid "No year specified" -msgstr "Niciun an specificat" - -msgid "Date out of range" -msgstr "Dată în afara intervalului" - -msgid "No month specified" -msgstr "Nicio lună specificată" - -msgid "No day specified" -msgstr "Nicio zi specificată" - -msgid "No week specified" -msgstr "Nicio săptămîna specificată" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s nu e disponibil" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Viitorul %(verbose_name_plural)s nu e disponibil deoarece %(class_name)s ." -"allow_future este Fals." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Niciun rezultat pentru %(verbose_name)s care se potrivesc interogării" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Pagină invalidă (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Aici nu sunt permise indexuri la directoare" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index pentru %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalarea a funcționat cu succes! Felicitări!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Vezi notele de lansare pentru Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Vedeți această pagină deoarece DEBUG=True este în fișierul de setări și nu ați " -"configurat niciun URL." - -msgid "Django Documentation" -msgstr "Documentația Django" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: O aplicație de votare" - -msgid "Get started with Django" -msgstr "Începeți cu Django" - -msgid "Django Community" -msgstr "Comunitatea Django" - -msgid "Connect, get help, or contribute" -msgstr "Conectați-vă, obțineți ajutor sau contribuiți" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ro/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ro/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ro/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ro/formats.py deleted file mode 100644 index 5a0c173..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ro/formats.py +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y, H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y, H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", - "%d.%b.%Y", - "%d %B %Y", - "%A, %d %B %Y", -] -TIME_INPUT_FORMATS = [ - "%H:%M", - "%H:%M:%S", - "%H:%M:%S.%f", -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y, %H:%M", - "%d.%m.%Y, %H:%M:%S", - "%d.%B.%Y, %H:%M", - "%d.%B.%Y, %H:%M:%S", -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index 138118e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index 1766d19..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,1424 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mingun , 2014 -# Anton Bazhanov , 2017 -# Denis Darii , 2011 -# Dimmus , 2011 -# eigrad , 2012 -# Eugene , 2013 -# Eugene Morozov , 2021 -# eXtractor , 2015 -# crazyzubr , 2020 -# Igor Melnyk, 2014 -# Ivan Khomutov , 2017 -# Jannis Leidel , 2011 -# lilo.panic, 2016 -# Mikhail Zholobov , 2013 -# Nikolay Korotkiy , 2018 -# Panasoft, 2021 -# Вася Аникин , 2017 -# SeryiMysh , 2020 -# Алексей Борискин , 2013-2017,2019-2020,2022-2024 -# Bobsans , 2016,2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Алексей Борискин , " -"2013-2017,2019-2020,2022-2024\n" -"Language-Team: Russian (http://app.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Afrikaans" -msgstr "Бурский" - -msgid "Arabic" -msgstr "Арабский" - -msgid "Algerian Arabic" -msgstr "Алжирский арабский" - -msgid "Asturian" -msgstr "Астурийский" - -msgid "Azerbaijani" -msgstr "Азербайджанский" - -msgid "Bulgarian" -msgstr "Болгарский" - -msgid "Belarusian" -msgstr "Белоруский" - -msgid "Bengali" -msgstr "Бенгальский" - -msgid "Breton" -msgstr "Бретонский" - -msgid "Bosnian" -msgstr "Боснийский" - -msgid "Catalan" -msgstr "Каталанский" - -msgid "Central Kurdish (Sorani)" -msgstr "Центральнокурдский (Сорани)" - -msgid "Czech" -msgstr "Чешский" - -msgid "Welsh" -msgstr "Уэльский" - -msgid "Danish" -msgstr "Датский" - -msgid "German" -msgstr "Немецкий" - -msgid "Lower Sorbian" -msgstr "Нижнелужицкий" - -msgid "Greek" -msgstr "Греческий" - -msgid "English" -msgstr "Английский" - -msgid "Australian English" -msgstr "Австралийский английский" - -msgid "British English" -msgstr "Британский английский" - -msgid "Esperanto" -msgstr "Эсперанто" - -msgid "Spanish" -msgstr "Испанский" - -msgid "Argentinian Spanish" -msgstr "Аргентинский испанский" - -msgid "Colombian Spanish" -msgstr "Колумбийский испанский" - -msgid "Mexican Spanish" -msgstr "Мексиканский испанский" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуанский испанский" - -msgid "Venezuelan Spanish" -msgstr "Венесуэльский Испанский" - -msgid "Estonian" -msgstr "Эстонский" - -msgid "Basque" -msgstr "Баскский" - -msgid "Persian" -msgstr "Персидский" - -msgid "Finnish" -msgstr "Финский" - -msgid "French" -msgstr "Французский" - -msgid "Frisian" -msgstr "Фризский" - -msgid "Irish" -msgstr "Ирландский" - -msgid "Scottish Gaelic" -msgstr "Шотландский гэльский" - -msgid "Galician" -msgstr "Галисийский" - -msgid "Hebrew" -msgstr "Иврит" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Хорватский" - -msgid "Upper Sorbian" -msgstr "Верхнелужицкий" - -msgid "Hungarian" -msgstr "Венгерский" - -msgid "Armenian" -msgstr "Армянский" - -msgid "Interlingua" -msgstr "Интерлингва" - -msgid "Indonesian" -msgstr "Индонезийский" - -msgid "Igbo" -msgstr "Игбо" - -msgid "Ido" -msgstr "Идо" - -msgid "Icelandic" -msgstr "Исландский" - -msgid "Italian" -msgstr "Итальянский" - -msgid "Japanese" -msgstr "Японский" - -msgid "Georgian" -msgstr "Грузинский" - -msgid "Kabyle" -msgstr "Кабильский" - -msgid "Kazakh" -msgstr "Казахский" - -msgid "Khmer" -msgstr "Кхмерский" - -msgid "Kannada" -msgstr "Каннада" - -msgid "Korean" -msgstr "Корейский" - -msgid "Kyrgyz" -msgstr "Киргизский" - -msgid "Luxembourgish" -msgstr "Люксембургский" - -msgid "Lithuanian" -msgstr "Литовский" - -msgid "Latvian" -msgstr "Латвийский" - -msgid "Macedonian" -msgstr "Македонский" - -msgid "Malayalam" -msgstr "Малаялам" - -msgid "Mongolian" -msgstr "Монгольский" - -msgid "Marathi" -msgstr "Маратхи" - -msgid "Malay" -msgstr "Малайский" - -msgid "Burmese" -msgstr "Бирманский" - -msgid "Norwegian Bokmål" -msgstr "Норвежский (Букмол)" - -msgid "Nepali" -msgstr "Непальский" - -msgid "Dutch" -msgstr "Голландский" - -msgid "Norwegian Nynorsk" -msgstr "Норвежский (Нюнорск)" - -msgid "Ossetic" -msgstr "Осетинский" - -msgid "Punjabi" -msgstr "Панджаби" - -msgid "Polish" -msgstr "Польский" - -msgid "Portuguese" -msgstr "Португальский" - -msgid "Brazilian Portuguese" -msgstr "Бразильский португальский" - -msgid "Romanian" -msgstr "Румынский" - -msgid "Russian" -msgstr "Русский" - -msgid "Slovak" -msgstr "Словацкий" - -msgid "Slovenian" -msgstr "Словенский" - -msgid "Albanian" -msgstr "Албанский" - -msgid "Serbian" -msgstr "Сербский" - -msgid "Serbian Latin" -msgstr "Сербский (латиница)" - -msgid "Swedish" -msgstr "Шведский" - -msgid "Swahili" -msgstr "Суахили" - -msgid "Tamil" -msgstr "Тамильский" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Tajik" -msgstr "Таджикский" - -msgid "Thai" -msgstr "Тайский" - -msgid "Turkmen" -msgstr "Туркменский" - -msgid "Turkish" -msgstr "Турецкий" - -msgid "Tatar" -msgstr "Татарский" - -msgid "Udmurt" -msgstr "Удмуртский" - -msgid "Uyghur" -msgstr "Уйгурский" - -msgid "Ukrainian" -msgstr "Украинский" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "Узбекский" - -msgid "Vietnamese" -msgstr "Вьетнамский" - -msgid "Simplified Chinese" -msgstr "Упрощенный китайский" - -msgid "Traditional Chinese" -msgstr "Традиционный китайский" - -msgid "Messages" -msgstr "Сообщения" - -msgid "Site Maps" -msgstr "Карта сайта" - -msgid "Static Files" -msgstr "Статические файлы" - -msgid "Syndication" -msgstr "Ленты новостей" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Номер страницы не является натуральным числом" - -msgid "That page number is less than 1" -msgstr "Номер страницы меньше 1" - -msgid "That page contains no results" -msgstr "Страница не содержит результатов" - -msgid "Enter a valid value." -msgstr "Введите правильное значение." - -msgid "Enter a valid domain name." -msgstr "Введите правильное имя домена." - -msgid "Enter a valid URL." -msgstr "Введите правильный URL." - -msgid "Enter a valid integer." -msgstr "Введите правильное число." - -msgid "Enter a valid email address." -msgstr "Введите правильный адрес электронной почты." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Значение должно состоять только из латинских букв, цифр, знаков " -"подчеркивания или дефиса." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Значение должно состоять только из символов входящих в стандарт Юникод, " -"цифр, символов подчёркивания или дефисов." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Введите правильный адрес %(protocol)s." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 или IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Введите цифры, разделенные запятыми." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Убедитесь, что это значение — %(limit_value)s (сейчас оно — %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Убедитесь, что это значение меньше либо равно %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Убедитесь, что это значение больше либо равно %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Убедитесь, что это значение кратно числу %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Убедитесь, что данное значение отстоит от %(offset)s на число, кратное шагу " -"%(limit_value)s, например: %(offset)s, %(valid_value1)s, %(valid_value2)s и " -"так далее." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Убедитесь, что это значение содержит не менее %(limit_value)d символ (сейчас " -"%(show_value)d)." -msgstr[1] "" -"Убедитесь, что это значение содержит не менее %(limit_value)d символов " -"(сейчас %(show_value)d)." -msgstr[2] "" -"Убедитесь, что это значение содержит не менее %(limit_value)d символов " -"(сейчас %(show_value)d)." -msgstr[3] "" -"Убедитесь, что это значение содержит не менее %(limit_value)d символов " -"(сейчас %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Убедитесь, что это значение содержит не более %(limit_value)d символ (сейчас " -"%(show_value)d)." -msgstr[1] "" -"Убедитесь, что это значение содержит не более %(limit_value)d символов " -"(сейчас %(show_value)d)." -msgstr[2] "" -"Убедитесь, что это значение содержит не более %(limit_value)d символов " -"(сейчас %(show_value)d)." -msgstr[3] "" -"Убедитесь, что это значение содержит не более %(limit_value)d символов " -"(сейчас %(show_value)d)." - -msgid "Enter a number." -msgstr "Введите число." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Убедитесь, что вы ввели не более %(max)s цифры." -msgstr[1] "Убедитесь, что вы ввели не более %(max)s цифр." -msgstr[2] "Убедитесь, что вы ввели не более %(max)s цифр." -msgstr[3] "Убедитесь, что вы ввели не более %(max)s цифр." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Убедитесь, что вы ввели не более %(max)s цифры после запятой." -msgstr[1] "Убедитесь, что вы ввели не более %(max)s цифр после запятой." -msgstr[2] "Убедитесь, что вы ввели не более %(max)s цифр после запятой." -msgstr[3] "Убедитесь, что вы ввели не более %(max)s цифр после запятой." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Убедитесь, что вы ввели не более %(max)s цифры перед запятой." -msgstr[1] "Убедитесь, что вы ввели не более %(max)s цифр перед запятой." -msgstr[2] "Убедитесь, что вы ввели не более %(max)s цифр перед запятой." -msgstr[3] "Убедитесь, что вы ввели не более %(max)s цифр перед запятой." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Расширение файлов “%(extension)s” не поддерживается. Разрешенные расширения: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Данные содержат запрещённый символ: ноль-байт" - -msgid "and" -msgstr "и" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" -"%(model_name)s с такими значениями полей %(field_labels)s уже существует." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Нарушено ограничение \"%(name)s\"." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Значения %(value)r нет среди допустимых вариантов." - -msgid "This field cannot be null." -msgstr "Это поле не может иметь значение NULL." - -msgid "This field cannot be blank." -msgstr "Это поле не может быть пустым." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s с таким %(field_label)s уже существует." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Значение в поле «%(field_label)s» должно быть уникальным для фрагмента " -"«%(lookup_type)s» даты в поле %(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Поле типа %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Значение “%(value)s” должно быть True или False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Значение “%(value)s” должно быть True, False или None." - -msgid "Boolean (Either True or False)" -msgstr "Логическое (True или False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Строка (до %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Строка (неограниченной длины)" - -msgid "Comma-separated integers" -msgstr "Целые, разделенные запятыми" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Значение “%(value)s” имеет неверный формат даты. Оно должно быть в формате " -"YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Значение “%(value)s” имеет корректный формат (YYYY-MM-DD), но это " -"недействительная дата." - -msgid "Date (without time)" -msgstr "Дата (без указания времени)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Значение “%(value)s” имеет неверный формат. Оно должно быть в формате YYYY-" -"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Значение “%(value)s” имеет корректный формат (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]), но это недействительные дата/время." - -msgid "Date (with time)" -msgstr "Дата (с указанием времени)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Значение “%(value)s” должно быть десятичным числом." - -msgid "Decimal number" -msgstr "Число с фиксированной запятой" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Значение “%(value)s” имеет неверный формат. Оно должно быть в формате [DD] " -"[HH:[MM:]]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Продолжительность" - -msgid "Email address" -msgstr "Адрес электронной почты" - -msgid "File path" -msgstr "Путь к файлу" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Значение “%(value)s” должно быть числом с плавающей точкой." - -msgid "Floating point number" -msgstr "Число с плавающей запятой" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Значение “%(value)s” должно быть целым числом." - -msgid "Integer" -msgstr "Целое" - -msgid "Big (8 byte) integer" -msgstr "Длинное целое (8 байт)" - -msgid "Small integer" -msgstr "Малое целое число" - -msgid "IPv4 address" -msgstr "IPv4 адрес" - -msgid "IP address" -msgstr "IP-адрес" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Значение “%(value)s” должно быть None, True или False." - -msgid "Boolean (Either True, False or None)" -msgstr "Логическое (True, False или None)" - -msgid "Positive big integer" -msgstr "Положительное большое целое число" - -msgid "Positive integer" -msgstr "Положительное целое число" - -msgid "Positive small integer" -msgstr "Положительное малое целое число" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слаг (до %(max_length)s)" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Значение “%(value)s” имеет неверный формат. Оно должно быть в формате HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Значение “%(value)s” имеет корректный формат (HH:MM[:ss[.uuuuuu]]), но это " -"недействительное время." - -msgid "Time" -msgstr "Время" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Необработанные двоичные данные" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Значение “%(value)s” не является верным UUID-ом." - -msgid "Universally unique identifier" -msgstr "Поле для UUID, универсального уникального идентификатора" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Изображение" - -msgid "A JSON object" -msgstr "JSON-объект" - -msgid "Value must be valid JSON." -msgstr "Значение должно быть корректным JSON-ом." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"Объект модели %(model)s со значением поля %(field)s, равным %(value)r, не " -"существует." - -msgid "Foreign Key (type determined by related field)" -msgstr "Внешний Ключ (тип определен по связанному полю)" - -msgid "One-to-one relationship" -msgstr "Связь \"один к одному\"" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Связь %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Связи %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Связь \"многие ко многим\"" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Обязательное поле." - -msgid "Enter a whole number." -msgstr "Введите целое число." - -msgid "Enter a valid date." -msgstr "Введите правильную дату." - -msgid "Enter a valid time." -msgstr "Введите правильное время." - -msgid "Enter a valid date/time." -msgstr "Введите правильную дату и время." - -msgid "Enter a valid duration." -msgstr "Введите правильную продолжительность." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Количество дней должно быть в диапазоне от {min_days} до {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ни одного файла не было отправлено. Проверьте тип кодировки формы." - -msgid "No file was submitted." -msgstr "Ни одного файла не было отправлено." - -msgid "The submitted file is empty." -msgstr "Отправленный файл пуст." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Убедитесь, что это имя файла содержит не более %(max)d символ (сейчас " -"%(length)d)." -msgstr[1] "" -"Убедитесь, что это имя файла содержит не более %(max)d символов (сейчас " -"%(length)d)." -msgstr[2] "" -"Убедитесь, что это имя файла содержит не более %(max)d символов (сейчас " -"%(length)d)." -msgstr[3] "" -"Убедитесь, что это имя файла содержит не более %(max)d символов (сейчас " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Пожалуйста, загрузите файл или поставьте флажок \"Очистить\", но не " -"совершайте оба действия одновременно." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Загрузите правильное изображение. Файл, который вы загрузили, поврежден или " -"не является изображением." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Выберите корректный вариант. %(value)s нет среди допустимых значений." - -msgid "Enter a list of values." -msgstr "Введите список значений." - -msgid "Enter a complete value." -msgstr "Введите весь список значений." - -msgid "Enter a valid UUID." -msgstr "Введите правильный UUID." - -msgid "Enter a valid JSON." -msgstr "Введите корректный JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Скрытое поле %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Данные ManagementForm отсутствуют или были подделаны. Отсутствующие поля: " -"%(field_names)s. Если проблема не исчезнет, вам может потребоваться " -"отправить отчет об ошибке." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Пожалуйста, отправьте не больше %(num)d формы." -msgstr[1] "Пожалуйста, отправьте не больше %(num)d форм." -msgstr[2] "Пожалуйста, отправьте не больше %(num)d форм." -msgstr[3] "Пожалуйста, отправьте не больше %(num)d форм." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Пожалуйста, отправьте %(num)d форму." -msgstr[1] "Пожалуйста, отправьте %(num)d формы." -msgstr[2] "Пожалуйста, отправьте %(num)d форм." -msgstr[3] "Пожалуйста, отправьте %(num)d форм." - -msgid "Order" -msgstr "Порядок" - -msgid "Delete" -msgstr "Удалить" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Пожалуйста, измените повторяющееся значение в поле \"%(field)s\"." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Пожалуйста, измените значение в поле %(field)s, оно должно быть уникальным." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Пожалуйста, измените значение в поле %(field_name)s, оно должно быть " -"уникальным для %(lookup)s в поле %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Пожалуйста, измените повторяющиеся значения ниже." - -msgid "The inline value did not match the parent instance." -msgstr "Значение во вложенной форме не совпадает со значением в базовой форме." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Выберите корректный вариант. Вашего варианта нет среди допустимых значений." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” является неверным значением." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s не может быть интерпретирована в часовом поясе " -"%(current_timezone)s; дата может быть неоднозначной или оказаться " -"несуществующей." - -msgid "Clear" -msgstr "Очистить" - -msgid "Currently" -msgstr "На данный момент" - -msgid "Change" -msgstr "Изменить" - -msgid "Unknown" -msgstr "Неизвестно" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Нет" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "да,нет,может быть" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байта" -msgstr[2] "%(size)d байт" -msgstr[3] "%(size)d байт" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "п.п." - -msgid "a.m." -msgstr "д.п." - -msgid "PM" -msgstr "ПП" - -msgid "AM" -msgstr "ДП" - -msgid "midnight" -msgstr "полночь" - -msgid "noon" -msgstr "полдень" - -msgid "Monday" -msgstr "Понедельник" - -msgid "Tuesday" -msgstr "Вторник" - -msgid "Wednesday" -msgstr "Среда" - -msgid "Thursday" -msgstr "Четверг" - -msgid "Friday" -msgstr "Пятница" - -msgid "Saturday" -msgstr "Суббота" - -msgid "Sunday" -msgstr "Воскресенье" - -msgid "Mon" -msgstr "Пн" - -msgid "Tue" -msgstr "Вт" - -msgid "Wed" -msgstr "Ср" - -msgid "Thu" -msgstr "Чт" - -msgid "Fri" -msgstr "Пт" - -msgid "Sat" -msgstr "Сб" - -msgid "Sun" -msgstr "Вс" - -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgid "jan" -msgstr "янв" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "июн" - -msgid "jul" -msgstr "июл" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сен" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноя" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Янв." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апрель" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Июнь" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Июль" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Сен." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноя." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "января" - -msgctxt "alt. month" -msgid "February" -msgstr "февраля" - -msgctxt "alt. month" -msgid "March" -msgstr "марта" - -msgctxt "alt. month" -msgid "April" -msgstr "апреля" - -msgctxt "alt. month" -msgid "May" -msgstr "мая" - -msgctxt "alt. month" -msgid "June" -msgstr "июня" - -msgctxt "alt. month" -msgid "July" -msgstr "июля" - -msgctxt "alt. month" -msgid "August" -msgstr "августа" - -msgctxt "alt. month" -msgid "September" -msgstr "сентября" - -msgctxt "alt. month" -msgid "October" -msgstr "октября" - -msgctxt "alt. month" -msgid "November" -msgstr "ноября" - -msgctxt "alt. month" -msgid "December" -msgstr "декабря" - -msgid "This is not a valid IPv6 address." -msgstr "Значение не является корректным адресом IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "или" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d год" -msgstr[1] "%(num)d года" -msgstr[2] "%(num)d лет" -msgstr[3] "%(num)d лет" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месяц" -msgstr[1] "%(num)d месяца" -msgstr[2] "%(num)d месяцев" -msgstr[3] "%(num)d месяцев" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d неделя" -msgstr[1] "%(num)d недели" -msgstr[2] "%(num)d недель" -msgstr[3] "%(num)d недель" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d день" -msgstr[1] "%(num)d дня" -msgstr[2] "%(num)d дней" -msgstr[3] "%(num)d дней" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d час" -msgstr[1] "%(num)d часа" -msgstr[2] "%(num)d часов" -msgstr[3] "%(num)d часов" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минута" -msgstr[1] "%(num)d минуты" -msgstr[2] "%(num)d минут" -msgstr[3] "%(num)d минут" - -msgid "Forbidden" -msgstr "Ошибка доступа" - -msgid "CSRF verification failed. Request aborted." -msgstr "Ошибка проверки CSRF. Запрос отклонён." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Вы видите это сообщение потому что этот сайт работает по защищённому " -"протоколу HTTPS и требует, чтобы при запросе вашим браузером был передан " -"заголовок \"Referer\", но он не был передан. Этот заголовок необходим из " -"соображений безопасности: мы должны убедиться что запрос оправляете именно " -"вы." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Если вы настроили свой браузер таким образом, чтобы запретить ему передавать " -"заголовок “Referer”, пожалуйста, разрешите ему отсылать данный заголовок по " -"крайней мере для данного сайта, или для всех HTTPS-соединений, или для " -"запросов, домен и порт назначения совпадают с доменом и портом текущей " -"страницы." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Если Вы используете HTML-тэг или добавили HTTP-заголовок “Referrer-Policy: no-referrer”, " -"пожалуйста удалите их. CSRF защите необходим заголовок “Referer” для строгой " -"проверки адреса ссылающейся страницы. Если Вы беспокоитесь о приватности, " -"используйте альтернативы, например , для ссылок на " -"сайты третьих лиц." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Вы видите это сообщение, потому что данный сайт требует, чтобы при отправке " -"форм была отправлена и CSRF-cookie. Данный тип cookie необходим по " -"соображениям безопасности, чтобы убедиться, что ваш браузер не был взломан и " -"не выполняет от вашего лица действий, запрограммированных третьими лицами." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Если в вашем браузере отключены cookie, пожалуйста, включите эту функцию " -"вновь, по крайней мере для этого сайта, или для \"same-orign\" запросов." - -msgid "More information is available with DEBUG=True." -msgstr "" -"В отладочном режиме доступно больше информации. Включить отладочный режим " -"можно, установив значение переменной DEBUG=True." - -msgid "No year specified" -msgstr "Не указан год" - -msgid "Date out of range" -msgstr "Дата выходит за пределы диапазона" - -msgid "No month specified" -msgstr "Не указан месяц" - -msgid "No day specified" -msgstr "Не указан день" - -msgid "No week specified" -msgstr "Не указана неделя" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s не доступен" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Будущие %(verbose_name_plural)s недоступны, потому что %(class_name)s." -"allow_future выставлен в значение \"Ложь\"." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Не удалось распознать строку с датой “%(datestr)s”, в заданном формате " -"“%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Не найден ни один %(verbose_name)s, соответствующий запросу" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Номер страницы не содержит особое значение “last” и его не удалось " -"преобразовать к целому числу." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Неправильная страница (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"Список пуст, но “%(class_name)s.allow_empty” выставлено в значение \"Ложь\", " -"что запрещает показывать пустые списки." - -msgid "Directory indexes are not allowed here." -msgstr "Просмотр списка файлов директории здесь не разрешен." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” не существует" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Список файлов директории %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Установка прошла успешно! Поздравляем!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Посмотреть примечания к выпуску для Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Вы видите данную страницу, потому что указали DEBUG=True в файле настроек и не настроили ни одного " -"обработчика URL-адресов." - -msgid "Django Documentation" -msgstr "Документация Django" - -msgid "Topics, references, & how-to’s" -msgstr "Разделы, справочник, & примеры" - -msgid "Tutorial: A Polling App" -msgstr "Руководство: Приложение для голосования" - -msgid "Get started with Django" -msgstr "Начало работы с Django" - -msgid "Django Community" -msgstr "Сообщество Django" - -msgid "Connect, get help, or contribute" -msgstr "Присоединяйтесь, получайте помощь или помогайте в разработке" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ru/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ru/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ru/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ru/formats.py deleted file mode 100644 index 212e526..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ru/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y г." -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j E Y г. G:i" -YEAR_MONTH_FORMAT = "F Y г." -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index ddfe767..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index e245cb1..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,1394 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Zahradník, 2023-2024 -# Jannis Leidel , 2011 -# 18f25ad6fa9930fc67cb11aca9d16a27, 2012-2013 -# Marian Andre , 2013,2015,2017-2018 -# 29cf7e517570e1bc05a1509565db92ae_2a01508, 2011 -# Martin Tóth , 2017,2023 -# Miroslav Bendik , 2023 -# Peter Kuma, 2021 -# Peter Stríž , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 06:49+0000\n" -"Last-Translator: Adam Zahradník, 2023-2024\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Afrikaans" -msgstr "afrikánsky" - -msgid "Arabic" -msgstr "arabský" - -msgid "Algerian Arabic" -msgstr "alžírsky arabsky" - -msgid "Asturian" -msgstr "astúrsky" - -msgid "Azerbaijani" -msgstr "azerbajdžansky" - -msgid "Bulgarian" -msgstr "bulharsky" - -msgid "Belarusian" -msgstr "bielorusky" - -msgid "Bengali" -msgstr "bengálsky" - -msgid "Breton" -msgstr "bretónsky" - -msgid "Bosnian" -msgstr "bosniansky" - -msgid "Catalan" -msgstr "katalánsky" - -msgid "Central Kurdish (Sorani)" -msgstr "stredná kurdčina (Sorani)" - -msgid "Czech" -msgstr "česky" - -msgid "Welsh" -msgstr "walesky" - -msgid "Danish" -msgstr "dánsky" - -msgid "German" -msgstr "nemecky" - -msgid "Lower Sorbian" -msgstr "dolnolužická srbčina" - -msgid "Greek" -msgstr "grécky" - -msgid "English" -msgstr "anglicky" - -msgid "Australian English" -msgstr "austrálskou angličtinou" - -msgid "British English" -msgstr "britskou angličtinou" - -msgid "Esperanto" -msgstr "esperantsky" - -msgid "Spanish" -msgstr "španielsky" - -msgid "Argentinian Spanish" -msgstr "argentínska španielčina" - -msgid "Colombian Spanish" -msgstr "kolumbijská španielčina" - -msgid "Mexican Spanish" -msgstr "mexická španielčina" - -msgid "Nicaraguan Spanish" -msgstr "nikaragujská španielčina" - -msgid "Venezuelan Spanish" -msgstr "venezuelská španielčina" - -msgid "Estonian" -msgstr "estónsky" - -msgid "Basque" -msgstr "baskicky" - -msgid "Persian" -msgstr "perzsky" - -msgid "Finnish" -msgstr "fínsky" - -msgid "French" -msgstr "francúzsky" - -msgid "Frisian" -msgstr "frízsky" - -msgid "Irish" -msgstr "írsky" - -msgid "Scottish Gaelic" -msgstr "škótska gaelčina" - -msgid "Galician" -msgstr "galícijsky" - -msgid "Hebrew" -msgstr "hebrejsky" - -msgid "Hindi" -msgstr "hindsky" - -msgid "Croatian" -msgstr "chorvátsky" - -msgid "Upper Sorbian" -msgstr "hornolužická srbčina" - -msgid "Hungarian" -msgstr "maďarsky" - -msgid "Armenian" -msgstr "arménsky" - -msgid "Interlingua" -msgstr "interlinguánsky" - -msgid "Indonesian" -msgstr "indonézsky" - -msgid "Igbo" -msgstr "igbožsky" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandsky" - -msgid "Italian" -msgstr "taliansky" - -msgid "Japanese" -msgstr "japonsky" - -msgid "Georgian" -msgstr "gruzínsky" - -msgid "Kabyle" -msgstr "kabylsky" - -msgid "Kazakh" -msgstr "kazašsky" - -msgid "Khmer" -msgstr "kmérsky" - -msgid "Kannada" -msgstr "kannadsky" - -msgid "Korean" -msgstr "kórejsky" - -msgid "Kyrgyz" -msgstr "kirgizsky" - -msgid "Luxembourgish" -msgstr "luxembursky" - -msgid "Lithuanian" -msgstr "litovsky" - -msgid "Latvian" -msgstr "lotyšsky" - -msgid "Macedonian" -msgstr "macedónsky" - -msgid "Malayalam" -msgstr "malajalámsky" - -msgid "Mongolian" -msgstr "mongolsky" - -msgid "Marathi" -msgstr "maráthsky" - -msgid "Malay" -msgstr "malajčina" - -msgid "Burmese" -msgstr "barmsky" - -msgid "Norwegian Bokmål" -msgstr "nórsky (Bokmål)" - -msgid "Nepali" -msgstr "nepálsky" - -msgid "Dutch" -msgstr "holandsky" - -msgid "Norwegian Nynorsk" -msgstr "nórsky (Nynorsk)" - -msgid "Ossetic" -msgstr "osetsky" - -msgid "Punjabi" -msgstr "pandžábsky" - -msgid "Polish" -msgstr "poľsky" - -msgid "Portuguese" -msgstr "portugalsky" - -msgid "Brazilian Portuguese" -msgstr "portugalsky (Brazília)" - -msgid "Romanian" -msgstr "rumunsky" - -msgid "Russian" -msgstr "rusky" - -msgid "Slovak" -msgstr "slovensky" - -msgid "Slovenian" -msgstr "slovinsky" - -msgid "Albanian" -msgstr "albánsky" - -msgid "Serbian" -msgstr "srbsky" - -msgid "Serbian Latin" -msgstr "srbsky (Latin)" - -msgid "Swedish" -msgstr "švédsky" - -msgid "Swahili" -msgstr "svahilsky" - -msgid "Tamil" -msgstr "tamilsky" - -msgid "Telugu" -msgstr "telugsky" - -msgid "Tajik" -msgstr "tadžiksky" - -msgid "Thai" -msgstr "thajsky" - -msgid "Turkmen" -msgstr "turkménsky" - -msgid "Turkish" -msgstr "turecky" - -msgid "Tatar" -msgstr "tatársky" - -msgid "Udmurt" -msgstr "udmurtsky" - -msgid "Uyghur" -msgstr "ujgursky" - -msgid "Ukrainian" -msgstr "ukrajinsky" - -msgid "Urdu" -msgstr "urdsky" - -msgid "Uzbek" -msgstr "uzbecky" - -msgid "Vietnamese" -msgstr "vietnamsky" - -msgid "Simplified Chinese" -msgstr "čínsky (zjednodušene)" - -msgid "Traditional Chinese" -msgstr "čínsky (tradične)" - -msgid "Messages" -msgstr "Správy" - -msgid "Site Maps" -msgstr "Mapy Sídla" - -msgid "Static Files" -msgstr "Statické Súbory" - -msgid "Syndication" -msgstr "Syndikácia" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Číslo stránky nie je celé číslo" - -msgid "That page number is less than 1" -msgstr "Číslo stránky je menšie ako 1" - -msgid "That page contains no results" -msgstr "Stránka neobsahuje žiadne výsledky" - -msgid "Enter a valid value." -msgstr "Zadajte platnú hodnotu." - -msgid "Enter a valid domain name." -msgstr "Zadajte platný názov domény." - -msgid "Enter a valid URL." -msgstr "Zadajte platnú URL adresu." - -msgid "Enter a valid integer." -msgstr "Zadajte platné celé číslo." - -msgid "Enter a valid email address." -msgstr "Zadajte platnú e-mailovú adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Zadajte platnú skratku pozostávajúcu z písmen, čísel, podčiarkovníkov alebo " -"pomlčiek." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Zadajte platnú skratku pozostávajúcu z písmen Unicode, čísel, " -"podčiarkovníkov alebo pomlčiek." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Zadajte platnú %(protocol)s adresu." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 alebo IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Zadajte len číslice oddelené čiarkami." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Uistite sa, že táto hodnota je %(limit_value)s (je to %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Uistite sa, že táto hodnota je menšia alebo rovná %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Uistite sa, že hodnota je väčšia alebo rovná %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Uistite sa, že táto hodnota je násobkom %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Uistite sa, že táto hodnota je násobkom %(limit_value)s, začínajúc od " -"%(offset)s, t.j. %(offset)s, %(valid_value1)s, %(valid_value2)s, atď." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Uistite sa, že zadaná hodnota má najmenej %(limit_value)d znak (má " -"%(show_value)d)." -msgstr[1] "" -"Uistite sa, že zadaná hodnota má najmenej %(limit_value)d znaky (má " -"%(show_value)d)." -msgstr[2] "" -"Uistite sa, že zadaná hodnota má najmenej %(limit_value)d znakov (má " -"%(show_value)d)." -msgstr[3] "" -"Uistite sa, že zadaná hodnota má najmenej %(limit_value)d znakov (má " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Uistite sa, že táto hodnota má najviac %(limit_value)d znak (má " -"%(show_value)d)." -msgstr[1] "" -"Uistite sa, že táto hodnota má najviac %(limit_value)d znaky (má " -"%(show_value)d)." -msgstr[2] "" -"Uistite sa, že táto hodnota má najviac %(limit_value)d znakov (má " -"%(show_value)d)." -msgstr[3] "" -"Uistite sa, že táto hodnota má najviac %(limit_value)d znakov (má " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Zadajte číslo." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Uistite sa, že nie je zadaných celkovo viac ako %(max)s číslica." -msgstr[1] "Uistite sa, že nie je zadaných celkovo viac ako %(max)s číslice." -msgstr[2] "Uistite sa, že nie je zadaných celkovo viac ako %(max)s číslic." -msgstr[3] "Uistite sa, že nie je zadaných celkovo viac ako %(max)s číslic." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Uistite sa, že nie je zadané viac ako %(max)s desatinné miesto." -msgstr[1] "Uistite sa, že nie sú zadané viac ako %(max)s desatinné miesta." -msgstr[2] "Uistite sa, že nie je zadaných viac ako %(max)s desatinných miest." -msgstr[3] "Uistite sa, že nie je zadaných viac ako %(max)s desatinných miest." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Uistite sa, že nie je zadaných viac ako %(max)s číslica pred desatinnou " -"čiarkou." -msgstr[1] "" -"Uistite sa, že nie sú zadané viac ako %(max)s číslice pred desatinnou " -"čiarkou." -msgstr[2] "" -"Uistite sa, že nie je zadaných viac ako %(max)s číslic pred desatinnou " -"čiarkou." -msgstr[3] "" -"Uistite sa, že nie je zadaných viac ako %(max)s číslic pred desatinnou " -"čiarkou." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Prípona súboru „%(extension)s“ nie je povolená. Povolené prípony sú: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Znaky NULL nie sú povolené." - -msgid "and" -msgstr "a" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s s týmto %(field_labels)s už existuje." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Obmedzenie „%(name)s“ je porušené." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Hodnota %(value)r nie je platná možnosť." - -msgid "This field cannot be null." -msgstr "Toto pole nemôže byť prázdne." - -msgid "This field cannot be blank." -msgstr "Toto pole nemôže byť prázdne." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s s týmto %(field_label)s už existuje." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s musí byť jedinečné pre %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Pole typu: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Hodnota „%(value)s“ musí byť True alebo False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Hodnota „%(value)s“ musí byť True, False alebo None." - -msgid "Boolean (Either True or False)" -msgstr "Logická hodnota (buď True alebo False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Reťazec (až do %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Reťazec (neobmedzený)" - -msgid "Comma-separated integers" -msgstr "Celé čísla oddelené čiarkou" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Hodnota „%(value)s“ má neplatný tvar dátumu. Musí byť v tvare YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Hodnota „%(value)s“ je v správnom tvare (YYYY-MM-DD), ale je to neplatný " -"dátum." - -msgid "Date (without time)" -msgstr "Dátum (bez času)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Hodnota „%(value)s“ má neplatný tvar. Musí byť v tvare YYYY-MM-DD HH:MM[:" -"ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Hodnota „%(value)s“ je v správnom tvare (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]), ale je to neplatný dátum/čas." - -msgid "Date (with time)" -msgstr "Dátum (a čas)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Hodnota „%(value)s“ musí byť desatinné číslo." - -msgid "Decimal number" -msgstr "Desatinné číslo" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Hodnota „%(value)s“ má neplatný tvar. Musí byť v tvare [DD] [[HH:]MM:]ss[." -"uuuuuu]." - -msgid "Duration" -msgstr "Doba trvania" - -msgid "Email address" -msgstr "E-mailová adresa" - -msgid "File path" -msgstr "Cesta k súboru" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Hodnota „%(value)s“ musí byť desatinné číslo." - -msgid "Floating point number" -msgstr "Číslo s plávajúcou desatinnou čiarkou" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Hodnota „%(value)s“ musí byť celé číslo." - -msgid "Integer" -msgstr "Celé číslo" - -msgid "Big (8 byte) integer" -msgstr "Veľké celé číslo (8 bajtov)" - -msgid "Small integer" -msgstr "Malé celé číslo" - -msgid "IPv4 address" -msgstr "IPv4 adresa" - -msgid "IP address" -msgstr "IP adresa" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Hodnota „%(value)s“ musí byť buď None, True alebo False." - -msgid "Boolean (Either True, False or None)" -msgstr "Logická hodnota (buď True, False alebo None)" - -msgid "Positive big integer" -msgstr "Veľké kladné celé číslo" - -msgid "Positive integer" -msgstr "Kladné celé číslo" - -msgid "Positive small integer" -msgstr "Malé kladné celé číslo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Identifikátor (najviac %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Hodnota „%(value)s“ má neplatný tvar. Musí byť v tvare HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Hodnota „%(value)s“ je v správnom tvare (HH:MM[:ss[.uuuuuu]]), ale je to " -"neplatný čas." - -msgid "Time" -msgstr "Čas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Binárne údaje" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "„%(value)s“ nie je platné UUID." - -msgid "Universally unique identifier" -msgstr "Všeobecne jedinečný identifikátor" - -msgid "File" -msgstr "Súbor" - -msgid "Image" -msgstr "Obrázok" - -msgid "A JSON object" -msgstr "Objekt typu JSON" - -msgid "Value must be valid JSON." -msgstr "Hodnota musí byť v platnom formáte JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Inštancia modelu %(model)s s %(field)s %(value)r neexistuje." - -msgid "Foreign Key (type determined by related field)" -msgstr "Cudzí kľúč (typ určuje pole v relácii)" - -msgid "One-to-one relationship" -msgstr "Typ relácie: jedna k jednej" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "vzťah: %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "vzťahy: %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Typ relácie: M ku N" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Toto pole je povinné." - -msgid "Enter a whole number." -msgstr "Zadajte celé číslo." - -msgid "Enter a valid date." -msgstr "Zadajte platný dátum." - -msgid "Enter a valid time." -msgstr "Zadajte platný čas." - -msgid "Enter a valid date/time." -msgstr "Zadajte platný dátum/čas." - -msgid "Enter a valid duration." -msgstr "Zadajte platnú dobu trvania." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Počet dní musí byť medzi {min_days} a {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Súbor nebol odoslaný. Skontrolujte typ kódovania vo formulári." - -msgid "No file was submitted." -msgstr "Žiaden súbor nebol odoslaný." - -msgid "The submitted file is empty." -msgstr "Odoslaný súbor je prázdny." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Uistite sa, že názov súboru má najviac %(max)d znak (má %(length)d)." -msgstr[1] "" -"Uistite sa, že názov súboru má najviac %(max)d znaky (má %(length)d)." -msgstr[2] "" -"Uistite sa, že názov súboru má najviac %(max)d znakov (má %(length)d)." -msgstr[3] "" -"Uistite sa, že názov súboru má najviac %(max)d znakov (má %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Odošlite prosím súbor alebo zaškrtnite políčko pre vymazanie vstupného poľa, " -"nie oboje." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Nahrajte platný obrázok. Súbor, ktorý ste odoslali nebol obrázok alebo bol " -"poškodený." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Vyberte platnú voľbu. %(value)s nepatrí medzi dostupné možnosti." - -msgid "Enter a list of values." -msgstr "Zadajte zoznam hodnôt." - -msgid "Enter a complete value." -msgstr "Zadajte úplnú hodnotu." - -msgid "Enter a valid UUID." -msgstr "Zadajte platné UUID." - -msgid "Enter a valid JSON." -msgstr "Zadajte platný JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skryté pole %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Dáta ManagementForm chýbajú alebo boli zmanipulované. Chýbajúce polia: " -"%(field_names)s. Možno budete musieť túto chybu nahlásiť, ak sa bude naďalej " -"vyskytovať." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Prosím, odošlite najviac %(num)d formulár." -msgstr[1] "Prosím, odošlite najviac %(num)d formuláre." -msgstr[2] "Prosím, odošlite najviac %(num)d formulárov." -msgstr[3] "Prosím, odošlite najviac %(num)d formulárov." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Prosím, odošlite aspoň %(num)d formulár." -msgstr[1] "Prosím, odošlite aspoň %(num)d formuláre." -msgstr[2] "Prosím, odošlite aspoň %(num)d formulárov." -msgstr[3] "Prosím, odošlite aspoň %(num)d formulárov." - -msgid "Order" -msgstr "Poradie" - -msgid "Delete" -msgstr "Odstrániť" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Prosím, opravte duplicitné údaje pre %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Údaje pre %(field)s musia byť jedinečné, prosím, opravte duplikáty." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Údaje pre %(field_name)s musia byť jedinečné pre %(lookup)s v " -"%(date_field)s, prosím, opravte duplikáty." - -msgid "Please correct the duplicate values below." -msgstr "Prosím, opravte nižšie uvedené duplicitné hodnoty. " - -msgid "The inline value did not match the parent instance." -msgstr "Vnorená hodnota sa nezhoduje s nadradenou inštanciou." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Vyberte platnú možnosť. Vybraná položka nepatrí medzi dostupné možnosti." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "„%(pk)s“ nie je platná hodnota." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Hodnota %(datetime)s v časovej zóne %(current_timezone)s sa nedá " -"interpretovať; môže byť nejednoznačná alebo nemusí existovať." - -msgid "Clear" -msgstr "Vymazať" - -msgid "Currently" -msgstr "Súčasne" - -msgid "Change" -msgstr "Zmeniť" - -msgid "Unknown" -msgstr "Neznámy" - -msgid "Yes" -msgstr "Áno" - -msgid "No" -msgstr "Nie" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "áno,nie,možno" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajty" -msgstr[2] "%(size)d bajtov" -msgstr[3] "%(size)d bajtov" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "popoludní" - -msgid "a.m." -msgstr "predpoludním" - -msgid "PM" -msgstr "popoludní" - -msgid "AM" -msgstr "predpoludním" - -msgid "midnight" -msgstr "polnoc" - -msgid "noon" -msgstr "poludnie" - -msgid "Monday" -msgstr "pondelok" - -msgid "Tuesday" -msgstr "utorok" - -msgid "Wednesday" -msgstr "streda" - -msgid "Thursday" -msgstr "štvrtok" - -msgid "Friday" -msgstr "piatok" - -msgid "Saturday" -msgstr "sobota" - -msgid "Sunday" -msgstr "nedeľa" - -msgid "Mon" -msgstr "po" - -msgid "Tue" -msgstr "ut" - -msgid "Wed" -msgstr "st" - -msgid "Thu" -msgstr "št" - -msgid "Fri" -msgstr "pi" - -msgid "Sat" -msgstr "so" - -msgid "Sun" -msgstr "ne" - -msgid "January" -msgstr "január" - -msgid "February" -msgstr "február" - -msgid "March" -msgstr "marec" - -msgid "April" -msgstr "apríl" - -msgid "May" -msgstr "máj" - -msgid "June" -msgstr "jún" - -msgid "July" -msgstr "júl" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "máj" - -msgid "jun" -msgstr "jún" - -msgid "jul" -msgstr "júl" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "apr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "máj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "jún" - -msgctxt "abbrev. month" -msgid "July" -msgstr "júl" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec." - -msgctxt "alt. month" -msgid "January" -msgstr "január" - -msgctxt "alt. month" -msgid "February" -msgstr "február" - -msgctxt "alt. month" -msgid "March" -msgstr "marec" - -msgctxt "alt. month" -msgid "April" -msgstr "apríl" - -msgctxt "alt. month" -msgid "May" -msgstr "máj" - -msgctxt "alt. month" -msgid "June" -msgstr "jún" - -msgctxt "alt. month" -msgid "July" -msgstr "júl" - -msgctxt "alt. month" -msgid "August" -msgstr "august" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "október" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "december" - -msgid "This is not a valid IPv6 address." -msgstr "Toto nieje platná IPv6 adresa." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "alebo" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rok" -msgstr[1] "%(num)d roky" -msgstr[2] "%(num)d rokov" -msgstr[3] "%(num)d rokov" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesiac" -msgstr[1] "%(num)d mesiace" -msgstr[2] "%(num)d mesiacov" -msgstr[3] "%(num)d mesiacov" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d týždeň" -msgstr[1] "%(num)d týždne" -msgstr[2] "%(num)d týždňov" -msgstr[3] "%(num)d týždňov" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d deň" -msgstr[1] "%(num)d dni" -msgstr[2] "%(num)d dní" -msgstr[3] "%(num)d dní" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodina" -msgstr[1] "%(num)d hodiny" -msgstr[2] "%(num)d hodín" -msgstr[3] "%(num)d hodiny" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minúta" -msgstr[1] "%(num)d minúty" -msgstr[2] "%(num)d minút" -msgstr[3] "%(num)d minúty" - -msgid "Forbidden" -msgstr "Zakázané (Forbidden)" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF verifikázia zlyhala. Požiadavka bola prerušená." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Túto správu vidíte, pretože táto stránka na protokole HTTPS vyžaduje, aby " -"váš prehliadač zaslal hlavičku „Referer„, k čomu nedošlo. Táto hlavička je " -"vyžadovaná z bezpečnostných dôvodov pre kontrolu toho, že sa prehliadača " -"nezmocnila tretia strana." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ak ste vo vašom prehliadači vypli hlavičky „Referer“, tak ich prosím " -"zapnite, alebo aspoň pre túto stránku, alebo pre HTTPS pripojenia, alebo pre " -"požiadavky „same-origin“." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ak používate tag , alebo " -"vkladáte hlavičku „Referrer-Policy: no-referrer“, prosím odstránte ich. " -"Ochrana CSRF vyžaduje hlavičku „Referer“ na striktnú kontrolu. Ak máte obavy " -"o súkromie, použite alternatívy ako pre linky na " -"iné stránky." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Túto správu vidíte, pretože táto lokalita vyžaduje CSRF cookie pri " -"odosielaní formulárov. Toto cookie je potrebné na zabezpečenie toho, že váš " -"prehliadač nie je zneužitý - „hijack“." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ak ste vypli cookies vo vašom prehliadači, tak ich prosím zapnite, aspoň pre " -"túto stránku, alebo pre požiadavky „same-origin“." - -msgid "More information is available with DEBUG=True." -msgstr "Viac informácií bude dostupných s DEBUG=True." - -msgid "No year specified" -msgstr "Nešpecifikovaný rok" - -msgid "Date out of range" -msgstr "Dátum je mimo rozsahu" - -msgid "No month specified" -msgstr "Nešpecifikovaný mesiac" - -msgid "No day specified" -msgstr "Nešpecifikovaný deň" - -msgid "No week specified" -msgstr "Nešpecifikovaný týždeň" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s nie sú dostupné" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Budúce %(verbose_name_plural)s nie sú dostupné pretože %(class_name)s." -"allow_future má hodnotu False. " - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Neplatný dátumový reťazec „%(datestr)s“ pre formát „%(format)s“" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" -"Nebol nájdený žiadny %(verbose_name)s zodpovedajúci databázovému dopytu" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Stránka nemá hodnotu „last“ a taktiež nie je možné prekonvertovať hodnotu na " -"celé číslo." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nesprávna stránka (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Zoznam je prázdny a hodnota „%(class_name)s.allow_empty“ je False." - -msgid "Directory indexes are not allowed here." -msgstr "Výpis adresárov tu nieje povolený." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ neexistuje" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Výpis %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Inštalácia prebehla úspešne! Gratulujeme!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Zobraziť poznámky k vydaniu pre Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Táto stránka sa zobrazuje pretože máte DEBUG=True v súbore s nastaveniami a nie sú " -"nakonfigurované žiadne URL." - -msgid "Django Documentation" -msgstr "Dokumentácia Django" - -msgid "Topics, references, & how-to’s" -msgstr "Témy, referencie a návody" - -msgid "Tutorial: A Polling App" -msgstr "Tutoriál: Aplikácia „Hlasovania“" - -msgid "Get started with Django" -msgstr "Začíname s Django" - -msgid "Django Community" -msgstr "Komunita Django" - -msgid "Connect, get help, or contribute" -msgstr "Spojte sa, získajte pomoc, alebo prispejte" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sk/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sk/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sk/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sk/formats.py deleted file mode 100644 index 31d4912..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sk/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j. F Y G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y G:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%y-%m-%d", # '06-10-25' - # "%d. %B %Y", # '25. October 2006' - # "%d. %b. %Y", # '25. Oct. 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index 10e198e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index 4b5f932..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,1351 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrej Marsetič, 2022-2023 -# iElectric , 2011-2012 -# Jannis Leidel , 2011 -# Jure Cuhalev , 2012-2013 -# Marko Zabreznik , 2016 -# Primoz Verdnik , 2017 -# zejn , 2013,2016-2017 -# zejn , 2011-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 06:49+0000\n" -"Last-Translator: Andrej Marsetič, 2022-2023\n" -"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "Afrikaans" -msgstr "Afrikanščina" - -msgid "Arabic" -msgstr "Arabščina" - -msgid "Algerian Arabic" -msgstr "alžirska arabščina" - -msgid "Asturian" -msgstr "Asturijski jezik" - -msgid "Azerbaijani" -msgstr "Azerbajdžanščina" - -msgid "Bulgarian" -msgstr "Bolgarščina" - -msgid "Belarusian" -msgstr "Belorusko" - -msgid "Bengali" -msgstr "Bengalščina" - -msgid "Breton" -msgstr "Bretonščina" - -msgid "Bosnian" -msgstr "Bosanščina" - -msgid "Catalan" -msgstr "Katalonščina" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Češčina" - -msgid "Welsh" -msgstr "Valežanski jezik" - -msgid "Danish" -msgstr "Danščina" - -msgid "German" -msgstr "Nemščina" - -msgid "Lower Sorbian" -msgstr "Dolnjelužiška srbščina" - -msgid "Greek" -msgstr "Grščina" - -msgid "English" -msgstr "Angleščina" - -msgid "Australian English" -msgstr "Avstralska angleščina" - -msgid "British English" -msgstr "Britanska Angleščina" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Španščina" - -msgid "Argentinian Spanish" -msgstr "Argentinska španščina" - -msgid "Colombian Spanish" -msgstr "Kolumbijska španščina" - -msgid "Mexican Spanish" -msgstr "Mehiška španščina" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragvijska španščina" - -msgid "Venezuelan Spanish" -msgstr "Španščina (Venezuela)" - -msgid "Estonian" -msgstr "Estonščina" - -msgid "Basque" -msgstr "Baskovščina" - -msgid "Persian" -msgstr "Perzijščina" - -msgid "Finnish" -msgstr "Finščina" - -msgid "French" -msgstr "Francoščina" - -msgid "Frisian" -msgstr "Frizijščina" - -msgid "Irish" -msgstr "Irščina" - -msgid "Scottish Gaelic" -msgstr "Škotska gelščina" - -msgid "Galician" -msgstr "Galičanski jezik" - -msgid "Hebrew" -msgstr "Hebrejski jezik" - -msgid "Hindi" -msgstr "Hindujščina" - -msgid "Croatian" -msgstr "Hrvaščina" - -msgid "Upper Sorbian" -msgstr "Gornjelužiška srbščina" - -msgid "Hungarian" -msgstr "Madžarščina" - -msgid "Armenian" -msgstr "armenščina" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezijski" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Jezik Ido" - -msgid "Icelandic" -msgstr "Islandski jezik" - -msgid "Italian" -msgstr "Italijanščina" - -msgid "Japanese" -msgstr "Japonščina" - -msgid "Georgian" -msgstr "Gruzijščina" - -msgid "Kabyle" -msgstr "Kabilski jezik" - -msgid "Kazakh" -msgstr "Kazaščina" - -msgid "Khmer" -msgstr "Kmerščina" - -msgid "Kannada" -msgstr "Kanareščina" - -msgid "Korean" -msgstr "Korejščina" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luksemburščina" - -msgid "Lithuanian" -msgstr "Litvanščina" - -msgid "Latvian" -msgstr "Latvijščina" - -msgid "Macedonian" -msgstr "Makedonščina" - -msgid "Malayalam" -msgstr "Malajalščina" - -msgid "Mongolian" -msgstr "Mongolščina" - -msgid "Marathi" -msgstr "Jezik Marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Burmanski jezik" - -msgid "Norwegian Bokmål" -msgstr "Norveški jezik" - -msgid "Nepali" -msgstr "Nepalščina" - -msgid "Dutch" -msgstr "Nizozemščina" - -msgid "Norwegian Nynorsk" -msgstr "Norveščina Nynorsk" - -msgid "Ossetic" -msgstr "Osetski jezik" - -msgid "Punjabi" -msgstr "Pandžabščina" - -msgid "Polish" -msgstr "Poljščina" - -msgid "Portuguese" -msgstr "Portugalščina" - -msgid "Brazilian Portuguese" -msgstr "Brazilska portugalščina" - -msgid "Romanian" -msgstr "Romunščina" - -msgid "Russian" -msgstr "Ruščina" - -msgid "Slovak" -msgstr "Slovaščina" - -msgid "Slovenian" -msgstr "Slovenščina" - -msgid "Albanian" -msgstr "Albanščina" - -msgid "Serbian" -msgstr "Srbščina" - -msgid "Serbian Latin" -msgstr "Srbščina v latinici" - -msgid "Swedish" -msgstr "Švedščina" - -msgid "Swahili" -msgstr "Svahili" - -msgid "Tamil" -msgstr "Tamilščina" - -msgid "Telugu" -msgstr "Teluščina" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tajski jezik" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turščina" - -msgid "Tatar" -msgstr "Tatarščina" - -msgid "Udmurt" -msgstr "Udmurski jezik" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "Ukrajinščina" - -msgid "Urdu" -msgstr "Jezik Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamščina" - -msgid "Simplified Chinese" -msgstr "Poenostavljena kitajščina" - -msgid "Traditional Chinese" -msgstr "Tradicionalna kitajščina" - -msgid "Messages" -msgstr "Sporočila" - -msgid "Site Maps" -msgstr "Zemljevid spletnega mesta" - -msgid "Static Files" -msgstr "Statične datoteke" - -msgid "Syndication" -msgstr "Sindiciranje" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Število te strani ni naravno število" - -msgid "That page number is less than 1" -msgstr "Število te strani je manj kot 1" - -msgid "That page contains no results" -msgstr "Ta stran nima zadetkov" - -msgid "Enter a valid value." -msgstr "Vnesite veljavno vrednost." - -msgid "Enter a valid URL." -msgstr "Vnesite veljaven URL naslov." - -msgid "Enter a valid integer." -msgstr "Vnesite veljavno celo število." - -msgid "Enter a valid email address." -msgstr "Vnesite veljaven e-poštni naslov." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Vnesite veljaven IPv4 naslov." - -msgid "Enter a valid IPv6 address." -msgstr "Vnesite veljaven IPv6 naslov." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Vnesite veljaven IPv4 ali IPv6 naslov." - -msgid "Enter only digits separated by commas." -msgstr "Vnesite samo števila, ločena z vejicami." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Poskrbite, da bo ta vrednost %(limit_value)s. Trenutno je %(show_value)s." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Poskrbite, da bo ta vrednost manj kot ali natanko %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Poskrbite, da bo ta vrednost večja ali enaka %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Preverite, da ima ta vrednost vsaj %(limit_value)d znak (trenutno ima " -"%(show_value)d)." -msgstr[1] "" -"Preverite, da ima ta vrednost vsaj %(limit_value)d znaka (trenutno ima " -"%(show_value)d)." -msgstr[2] "" -"Preverite, da ima ta vrednost vsaj %(limit_value)d znake (trenutno ima " -"%(show_value)d)." -msgstr[3] "" -"Preverite, da ima ta vrednost vsaj %(limit_value)d znakov (trenutno ima " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Preverite, da ima ta vrednost največ %(limit_value)d znak (trenutno ima " -"%(show_value)d)." -msgstr[1] "" -"Preverite, da ima ta vrednost največ %(limit_value)d znaka (trenutno ima " -"%(show_value)d)." -msgstr[2] "" -"Preverite, da ima ta vrednost največ %(limit_value)d znake (trenutno ima " -"%(show_value)d)." -msgstr[3] "" -"Preverite, da ima ta vrednost največ %(limit_value)d znakov (trenutno ima " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Vnesite število." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Poskrbite, da skupno ne bo več kot %(max)s števka." -msgstr[1] "Poskrbite, da skupno ne bosta več kot %(max)s števki." -msgstr[2] "Poskrbite, da skupno ne bojo več kot %(max)s števke." -msgstr[3] "Poskrbite, da skupno ne bo več kot %(max)s števk." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Poskrbite, da skupno ne bo več kot %(max)s decimalnih mesto." -msgstr[1] "Poskrbite, da skupno ne bosta več kot %(max)s decimalnih mesti." -msgstr[2] "Poskrbite, da skupno ne bo več kot %(max)s decimalnih mest." -msgstr[3] "Poskrbite, da skupno ne bo več kot %(max)s decimalnih mest." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Poskrbite, da skupno ne bo več kot %(max)s števka pred decimalno vejico." -msgstr[1] "" -"Poskrbite, da skupno ne bosta več kot %(max)s števki pred decimalno vejico." -msgstr[2] "" -"Poskrbite, da skupno ne bo več kot %(max)s števk pred decimalno vejico." -msgstr[3] "" -"Poskrbite, da skupno ne bo več kot %(max)s števk pred decimalno vejico." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Znak null ni dovoljen." - -msgid "and" -msgstr "in" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s s tem %(field_labels)s že obstaja." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Vrednost %(value)r ni veljavna izbira." - -msgid "This field cannot be null." -msgstr "To polje ne more biti prazno." - -msgid "This field cannot be blank." -msgstr "To polje ne more biti prazno." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s s tem %(field_label)s že obstaja." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s mora biti enolična za %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Polje tipa: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” vrednost mora biti Da ali Ne." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolova vrednost (True ali False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Niz znakov (vse do %(max_length)s)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Z vejico ločena cela števila (integer)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” vrednost ima neveljavno obliko datuma. Biti mora v obliki LLLL-" -"MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” vrednost ima pravilno obliko (LLLL-MM-DD), vendar je neveljaven " -"datum." - -msgid "Date (without time)" -msgstr "Datum (brez ure)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Datum (z uro)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Decimalno število" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Trajanje" - -msgid "Email address" -msgstr "E-poštni naslov" - -msgid "File path" -msgstr "Pot do datoteke" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” vrednost mora biti decimalno število." - -msgid "Floating point number" -msgstr "Število s plavajočo vejico" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” vrednost mora biti celo število." - -msgid "Integer" -msgstr "Celo število (integer)" - -msgid "Big (8 byte) integer" -msgstr "Velika (8 bajtna) cela števila " - -msgid "Small integer" -msgstr "Celo število" - -msgid "IPv4 address" -msgstr "IPv4 naslov" - -msgid "IP address" -msgstr "IP naslov" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” vrednost mora biti Nič, Da ali Ne." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolova vrednost (True, False ali None)" - -msgid "Positive big integer" -msgstr "Pozitivno veliko celo število" - -msgid "Positive integer" -msgstr "Pozitivno celo število" - -msgid "Positive small integer" -msgstr "Pozitivno celo število (do 64 tisoč)" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Okrajšava naslova (do največ %(max_length)s znakov)" - -msgid "Text" -msgstr "Besedilo" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Čas" - -msgid "URL" -msgstr "URL (spletni naslov)" - -msgid "Raw binary data" -msgstr "Surovi binarni podatki" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Datoteka" - -msgid "Image" -msgstr "Slika" - -msgid "A JSON object" -msgstr "JSON objekt" - -msgid "Value must be valid JSON." -msgstr "Vrednost mora biti veljaven JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"Instanca %(model)s s poljem %(field)s, ki ustreza %(value)r, ne obstaja." - -msgid "Foreign Key (type determined by related field)" -msgstr "Tuji ključ (tip odvisen od povezanega polja)" - -msgid "One-to-one relationship" -msgstr "Relacija ena-na-ena" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relacija %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relacija %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relacija več-na-več" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "To polje je obvezno." - -msgid "Enter a whole number." -msgstr "Vnesite celo število." - -msgid "Enter a valid date." -msgstr "Vnesite veljaven datum." - -msgid "Enter a valid time." -msgstr "Vnesite veljaven čas." - -msgid "Enter a valid date/time." -msgstr "Vnesite veljaven datum/čas." - -msgid "Enter a valid duration." -msgstr "Vnesite veljavno obdobje trajanja." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Datoteka ni bila poslana. Preverite nabor znakov v formi." - -msgid "No file was submitted." -msgstr "Poslali niste nobene datoteke." - -msgid "The submitted file is empty." -msgstr "Poslana datoteka je prazna." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Poskrbite, da bo imelo to ime datoteke največ %(max)d znak (trenutno ima " -"%(length)d)." -msgstr[1] "" -"Poskrbite, da bo imelo to ime datoteke največ %(max)d znaka (trenutno ima " -"%(length)d)." -msgstr[2] "" -"Poskrbite, da bo imelo to ime datoteke največ %(max)d znake (trenutno ima " -"%(length)d)." -msgstr[3] "" -"Poskrbite, da bo imelo to ime datoteke največ %(max)d znakov (trenutno ima " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Prosim oddaj datoteko ali izberi počisti okvir, ampak ne oboje hkrati." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Naložite veljavno sliko. Naložena datoteka ni bila slika ali pa je bila le-" -"ta okvarjena." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Izberite veljavno možnost. %(value)s ni med ponujenimi izbirami." - -msgid "Enter a list of values." -msgstr "Vnesite seznam vrednosti." - -msgid "Enter a complete value." -msgstr "Vnesite popolno vrednost." - -msgid "Enter a valid UUID." -msgstr "Vnesite veljaven UUID." - -msgid "Enter a valid JSON." -msgstr "Vnesite veljaven JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skrito polje %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "Order" -msgstr "Razvrsti" - -msgid "Delete" -msgstr "Izbriši" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Prosimo, odpravite podvojene vrednosti za %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Prosimo popravite podvojene vrednosti za %(field)s, ki morajo biti unikatne." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Prosimo popravite podvojene vrednosti za polje %(field_name)s, ki mora biti " -"edinstveno za %(lookup)s po %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Prosimo odpravite podvojene vrednosti spodaj." - -msgid "The inline value did not match the parent instance." -msgstr "Vrednost se ne ujema s povezanim vnosom." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Izberite veljavno možnost. Te možnosti ni med ponujenimi izbirami." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Počisti" - -msgid "Currently" -msgstr "Trenutno" - -msgid "Change" -msgstr "Spremeni" - -msgid "Unknown" -msgstr "Neznano" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "da,ne,morda" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajta" -msgstr[2] "%(size)d bajti" -msgstr[3] "%(size)d bajtov" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "polnoč" - -msgid "noon" -msgstr "poldne" - -msgid "Monday" -msgstr "ponedeljek" - -msgid "Tuesday" -msgstr "torek" - -msgid "Wednesday" -msgstr "sreda" - -msgid "Thursday" -msgstr "četrtek" - -msgid "Friday" -msgstr "petek" - -msgid "Saturday" -msgstr "sobota" - -msgid "Sunday" -msgstr "nedelja" - -msgid "Mon" -msgstr "pon" - -msgid "Tue" -msgstr "tor" - -msgid "Wed" -msgstr "sre" - -msgid "Thu" -msgstr "čet" - -msgid "Fri" -msgstr "pet" - -msgid "Sat" -msgstr "sob" - -msgid "Sun" -msgstr "ned" - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "marec" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "junij" - -msgid "July" -msgstr "julij" - -msgid "August" -msgstr "avgust" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "avg" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marec" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junij" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julij" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Avg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "Marec" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Maj" - -msgctxt "alt. month" -msgid "June" -msgstr "Junij" - -msgctxt "alt. month" -msgid "July" -msgstr "Julij" - -msgctxt "alt. month" -msgid "August" -msgstr "Avgust" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "To ni veljaven IPv6 naslov." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ali" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d leto" -msgstr[1] "%(num)d leti" -msgstr[2] "%(num)d let" -msgstr[3] "%(num)d let" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesec" -msgstr[1] "%(num)d meseca " -msgstr[2] "%(num)d mesecev" -msgstr[3] "%(num)d mesecev" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d teden" -msgstr[1] "%(num)d tedna" -msgstr[2] "%(num)d tednov" -msgstr[3] "%(num)d tednov" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dan" -msgstr[1] "%(num)d dneva" -msgstr[2] "%(num)d dni" -msgstr[3] "%(num)d dni" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uro" -msgstr[1] "%(num)d uri" -msgstr[2] "%(num)d ure" -msgstr[3] "%(num)d ur" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minuti" -msgstr[2] "%(num)d minute" -msgstr[3] "%(num)d minut" - -msgid "Forbidden" -msgstr "Prepovedano" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF preverjanje ni uspelo. Zahtevek preklican." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"To obvestilo vidite, ker ta spletna stran zahteva CSRF piškotek, ko " -"pošiljate obrazce. Piškotek je potreben zaradi varnosti, da se zagotovi, da " -"ste zahtevek res naredili vi." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Če ste brskalnik konfigurirali tako, da onemogoča piškotke, jih znova " -"omogočite za to spletno mesto ali za zahteve »istega izvora«." - -msgid "More information is available with DEBUG=True." -msgstr "Več informacij je na voljo, če nastavite DEBUG=True." - -msgid "No year specified" -msgstr "Leto ni vnešeno" - -msgid "Date out of range" -msgstr "Datum ni znotraj veljavnega obsega." - -msgid "No month specified" -msgstr "Mesec ni vnešen" - -msgid "No day specified" -msgstr "Dan ni vnešen" - -msgid "No week specified" -msgstr "Teden ni vnešen" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Na voljo ni noben %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Prihodnje %(verbose_name_plural)s niso na voljo, ker je vrednost " -"%(class_name)s.allow_future False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Noben %(verbose_name)s ne ustreza poizvedbi" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Stran ni »zadnja«, niti je ni mogoče pretvoriti v število." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Neveljavna stran (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Prikaz vsebine mape ni dovoljen." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” ne obstaja" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Vsebina mape %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Namestitev se je uspešno izvedla! Čestitke!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Oglejte si obvestila ob izdaji za Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"To stran vidite, ker imate nastavljeno DEBUG=True v vaši settings.py datoteki in ker nimate " -"nastavljenih URL-jev." - -msgid "Django Documentation" -msgstr "Django Dokumentacija" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "Vodič: aplikacija anketa" - -msgid "Get started with Django" -msgstr "Začnite z Djangom" - -msgid "Django Community" -msgstr "Django Skupnost" - -msgid "Connect, get help, or contribute" -msgstr "Spoznajte nove ljudi, poiščite pomoč in prispevajte " diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sl/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sl/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sl/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sl/formats.py deleted file mode 100644 index c3e96bb..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sl/formats.py +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y. H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j. M. Y" -SHORT_DATETIME_FORMAT = "j.n.Y. H:i" -FIRST_DAY_OF_WEEK = 0 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%d-%m-%Y", # '25-10-2006' - "%d. %m. %Y", # '25. 10. 2006' - "%d. %m. %y", # '25. 10. 06' -] - -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d-%m-%Y %H:%M:%S", # '25-10-2006 14:30:59' - "%d-%m-%Y %H:%M:%S.%f", # '25-10-2006 14:30:59.000200' - "%d-%m-%Y %H:%M", # '25-10-2006 14:30' - "%d. %m. %Y %H:%M:%S", # '25. 10. 2006 14:30:59' - "%d. %m. %Y %H:%M:%S.%f", # '25. 10. 2006 14:30:59.000200' - "%d. %m. %Y %H:%M", # '25. 10. 2006 14:30' - "%d. %m. %y %H:%M:%S", # '25. 10. 06 14:30:59' - "%d. %m. %y %H:%M:%S.%f", # '25. 10. 06 14:30:59.000200' - "%d. %m. %y %H:%M", # '25. 10. 06 14:30' -] - -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index 205d978..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index c9ba44c..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,1352 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2011-2014 -# Besnik Bleta , 2020-2025 -# Besnik Bleta , 2015-2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2020-2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabisht" - -msgid "Algerian Arabic" -msgstr "Arabishte Algjeriane" - -msgid "Asturian" -msgstr "Asturiase" - -msgid "Azerbaijani" -msgstr "Azerbajxhanisht" - -msgid "Bulgarian" -msgstr "Bullgarisht" - -msgid "Belarusian" -msgstr "Bjellorusisht" - -msgid "Bengali" -msgstr "Bengalisht" - -msgid "Breton" -msgstr "Bretonisht" - -msgid "Bosnian" -msgstr "Boshnjake" - -msgid "Catalan" -msgstr "Katalanisht" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdishte e Qendrës (Sorani)" - -msgid "Czech" -msgstr "Çekisht" - -msgid "Welsh" -msgstr "Uellsisht" - -msgid "Danish" -msgstr "Danisht" - -msgid "German" -msgstr "Gjermanisht" - -msgid "Lower Sorbian" -msgstr "Sorbishte e Poshtme" - -msgid "Greek" -msgstr "Greqisht" - -msgid "English" -msgstr "Anglisht" - -msgid "Australian English" -msgstr "Anglishte Australie" - -msgid "British English" -msgstr "Anglishte Britanie" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanjisht" - -msgid "Argentinian Spanish" -msgstr "Spanjishte Argjentine" - -msgid "Colombian Spanish" -msgstr "Spanjishte Kolumbie" - -msgid "Mexican Spanish" -msgstr "Spanjishte Meksike" - -msgid "Nicaraguan Spanish" -msgstr "Spanjishte Nikaraguaje" - -msgid "Venezuelan Spanish" -msgstr "Spanjishte Venezuele" - -msgid "Estonian" -msgstr "Estonisht" - -msgid "Basque" -msgstr "Baskisht" - -msgid "Persian" -msgstr "Persisht" - -msgid "Finnish" -msgstr "Finlandisht" - -msgid "French" -msgstr "Frënge" - -msgid "Frisian" -msgstr "Frisisht" - -msgid "Irish" -msgstr "Irlandisht" - -msgid "Scottish Gaelic" -msgstr "Skocisht Gaelike" - -msgid "Galician" -msgstr "Galike" - -msgid "Hebrew" -msgstr "Hebraisht" - -msgid "Hindi" -msgstr "Indisht" - -msgid "Croatian" -msgstr "Kroatisht" - -msgid "Upper Sorbian" -msgstr "Sorbishte e Sipërme" - -msgid "Hungarian" -msgstr "Hungarisht" - -msgid "Armenian" -msgstr "Armenisht" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezisht" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandisht" - -msgid "Italian" -msgstr "Italisht" - -msgid "Japanese" -msgstr "Japonisht" - -msgid "Georgian" -msgstr "Gjeorgjisht" - -msgid "Kabyle" -msgstr "Kabilisht" - -msgid "Kazakh" -msgstr "Kazake" - -msgid "Khmer" -msgstr "Khmere" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreanisht" - -msgid "Kyrgyz" -msgstr "Kirgize" - -msgid "Luxembourgish" -msgstr "Luksemburgase" - -msgid "Lithuanian" -msgstr "Lituanisht" - -msgid "Latvian" -msgstr "Letonisht" - -msgid "Macedonian" -msgstr "Maqedonisht" - -msgid "Malayalam" -msgstr "Malajalame" - -msgid "Mongolian" -msgstr "Mongoliisht" - -msgid "Marathi" -msgstr "Marati" - -msgid "Malay" -msgstr "Malajase" - -msgid "Burmese" -msgstr "Burmeze" - -msgid "Norwegian Bokmål" -msgstr "Norvegjishte Bokmal" - -msgid "Nepali" -msgstr "Nepalisht" - -msgid "Dutch" -msgstr "Holandisht" - -msgid "Norwegian Nynorsk" -msgstr "Norvegjishte Nynorsk" - -msgid "Ossetic" -msgstr "Osetisht" - -msgid "Punjabi" -msgstr "Panxhabisht" - -msgid "Polish" -msgstr "Polonisht" - -msgid "Portuguese" -msgstr "Portugalisht" - -msgid "Brazilian Portuguese" -msgstr "Portugalishte Brazili" - -msgid "Romanian" -msgstr "Rumanisht" - -msgid "Russian" -msgstr "Rusisht" - -msgid "Slovak" -msgstr "Sllovakisht " - -msgid "Slovenian" -msgstr "Sllovenisht" - -msgid "Albanian" -msgstr "Shqip" - -msgid "Serbian" -msgstr "Serbisht" - -msgid "Serbian Latin" -msgstr "Serbisht Latine" - -msgid "Swedish" -msgstr "Suedisht" - -msgid "Swahili" -msgstr "Suahilisht" - -msgid "Tamil" -msgstr "Tamilisht" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Taxhike" - -msgid "Thai" -msgstr "Tajlandisht" - -msgid "Turkmen" -msgstr "Turkmene" - -msgid "Turkish" -msgstr "Turqisht" - -msgid "Tatar" -msgstr "Tatare" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Ujgure" - -msgid "Ukrainian" -msgstr "Ukrainisht" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeke" - -msgid "Vietnamese" -msgstr "Vietnamisht" - -msgid "Simplified Chinese" -msgstr "Kineze e Thjeshtuar" - -msgid "Traditional Chinese" -msgstr "Kineze Tradicionale" - -msgid "Messages" -msgstr "Mesazhe" - -msgid "Site Maps" -msgstr "Harta Sajti" - -msgid "Static Files" -msgstr "Kartela Statike" - -msgid "Syndication" -msgstr "" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Ai numër faqeje s’është numër i plotë" - -msgid "That page number is less than 1" -msgstr "Ai numër faqeje është më i vogël se 1" - -msgid "That page contains no results" -msgstr "Ajo faqe s’përmban përfundime" - -msgid "Enter a valid value." -msgstr "Jepni një vlerë të vlefshme." - -msgid "Enter a valid domain name." -msgstr "Jepni një emër të vlefshëm përkatësie." - -msgid "Enter a valid URL." -msgstr "Jepni një URL të vlefshme." - -msgid "Enter a valid integer." -msgstr "Jepni një numër të plotë të vlefshëm." - -msgid "Enter a valid email address." -msgstr "Jepni një adresë email të vlefshme." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Jepni një “identifikues” të vlefshëm, të përbërë nga shkronja, numra, " -"nënvija, ose vija në mes." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Jepni një “identifikues” të vlefshëm, të përbërë nga shkronja, numra, " -"nënvija, ose vija ndarëse Unikod." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Jepni një adresë %(protocol)s të vlefshme." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4, ose IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Jepni vetëm shifra të ndara nga presje." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Siguroni që kjo vlerë të jetë %(limit_value)s (është %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Siguroni që kjo vlerë të jetë më e vogël ose baras me %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Siguroni që kjo vlerë është më e madhe ose baras me %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Siguroni që vlera të jetë një shumëfish i madhësisë së hapit %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Siguroni që kjo vlerë të jetë një shumëfish i madhësisë %(limit_value)s, " -"duke filluar nga %(offset)s, p.sh., %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, e me radhë." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sigurohuni që kjo vlerë ka të paktën %(limit_value)d shenjë (ka " -"%(show_value)d)." -msgstr[1] "" -"Siguroni që kjo vlerë ka të paktën %(limit_value)d shenja (ka " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sigurohuni që kjo vlerë ka të shumtën %(limit_value)d shenjë (ka " -"%(show_value)d)." -msgstr[1] "" -"Siguroni që kjo vlerë ka të shumtën %(limit_value)d shenja (ka " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Jepni një numër." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Sigurohuni që s’ka më tepër se %(max)s shifër gjithsej." -msgstr[1] "Siguroni që s’ka më tepër se %(max)s shifra gjithsej." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Sigurohuni që s’ka më shumë se %(max)s vend dhjetor." -msgstr[1] "Siguroni që s’ka më shumë se %(max)s vende dhjetore." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Sigurohuni që s’ka më tepër se %(max)s shifër para presjes dhjetore." -msgstr[1] "Siguroni që s’ka më tepër se %(max)s shifra para presjes dhjetore." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Zgjatimi “%(extension)s” për kartela nuk lejohet. Zgjatime të lejuara janë: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Nuk lejohen shenja null." - -msgid "and" -msgstr "dhe " - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Ka tashmë %(model_name)s me këtë %(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Është cenuar kufizimi “%(name)s”." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Vlera %(value)r s’është zgjedhje e vlefshme." - -msgid "This field cannot be null." -msgstr "Kjo fushë s’mund të përmbajë shenja null." - -msgid "This field cannot be blank." -msgstr "Kjo fushë s’mund të jetë e paplotësuar." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ka tashmë një %(model_name)s me këtë %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s duhet të jetë unike për %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Fushë e llojit: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Vlera “%(value)s” duhet të jetë ose “True”, ose “False”." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" -"Vlera për “%(value)s” duhet të jetë ose “True”, ose “False”, ose “None”." - -msgid "Boolean (Either True or False)" -msgstr "Buleane (Ose “True”, ose “False”)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Varg (deri në %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Varg (i pakufizuar)" - -msgid "Comma-separated integers" -msgstr "Numra të plotë të ndarë me presje" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Vlera “%(value)s” ka një format të pavlefshëm datash. Duhet të jetë në " -"formatin YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Vlera “%(value)s” ka formatin e saktë (YYYY-MM-DD), por është datë e " -"pavlefshme." - -msgid "Date (without time)" -msgstr "Datë (pa kohë)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Vlera “'%(value)s” ka një format të pavlefshëm. Duhet të jetë në formatin " -"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Vlera “%(value)s” ka format të saktë (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]), " -"por është datë/kohë e pavlefshme." - -msgid "Date (with time)" -msgstr "Datë (me kohë)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Vlera “%(value)s” duhet të jetë një numër dhjetor." - -msgid "Decimal number" -msgstr "Numër dhjetor" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Vlera “%(value)s” ka format të pavlefshëm. Duhet të jetë në formatin [DD] " -"[HH:[MM:]]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Kohëzgjatje" - -msgid "Email address" -msgstr "Adresë email" - -msgid "File path" -msgstr "Shteg kartele" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Vlera “%(value)s” duhet të jetë numër i plotë." - -msgid "Integer" -msgstr "Numër i plotë" - -msgid "Big (8 byte) integer" -msgstr "Numër i plotë i madh (8 bajte)" - -msgid "Small integer" -msgstr "Numër i plotë i vogël" - -msgid "IPv4 address" -msgstr "Adresë IPv4" - -msgid "IP address" -msgstr "Adresë IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Vlera “%(value)s” duhet të jetë ose “None”, ose “True”, ose “False”." - -msgid "Boolean (Either True, False or None)" -msgstr "Buleane (Ose “True”, ose “False”, ose “None”)" - -msgid "Positive big integer" -msgstr "Numër i plotë pozitiv i madh" - -msgid "Positive integer" -msgstr "Numër i plotë pozitiv" - -msgid "Positive small integer" -msgstr "Numër i plotë pozitiv i vogël" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Identifikues (deri në %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Vlera “%(value)s” ka format të pavlefshëm. Duhet të jetë në formatin HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Vlera “%(value)s” ka formatin e saktë (HH:MM[:ss[.uuuuuu]]) por është kohë e " -"pavlefshme." - -msgid "Time" -msgstr "Kohë" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Të dhëna dyore të papërpunuara" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” s’është UUID i vlefshëm." - -msgid "Universally unique identifier" -msgstr "Identifikues universalisht unik" - -msgid "File" -msgstr "Kartelë" - -msgid "Image" -msgstr "Figurë" - -msgid "A JSON object" -msgstr "Objekt JSON" - -msgid "Value must be valid JSON." -msgstr "Vlera duhet të jetë JSON i vlefshëm." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Kyç i Jashtëm (lloj i përcaktuar nga fusha përkatëse)" - -msgid "One-to-one relationship" -msgstr "Marrëdhënie një-për-një" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Marrëdhënie %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Marrëdhënie %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Marrëdhënie shumë-për-shumë" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Kjo fushë është e domosdoshme." - -msgid "Enter a whole number." -msgstr "Jepni një numër të tërë." - -msgid "Enter a valid date." -msgstr "Jepni një datë të vlefshme." - -msgid "Enter a valid time." -msgstr "Jepni një kohë të vlefshme." - -msgid "Enter a valid date/time." -msgstr "Jepni një datë/kohë të vlefshme." - -msgid "Enter a valid duration." -msgstr "Jepni një kohëzgjatje të vlefshme." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Numri i ditëve duhet të jetë mes {min_days} dhe {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"S’u parashtrua ndonjë kartelë. Kontrolloni llojin e kodimit te formulari." - -msgid "No file was submitted." -msgstr "S’u parashtrua kartelë." - -msgid "The submitted file is empty." -msgstr "Kartela e parashtruar është e zbrazët." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Sigurohuni që ky emër kartele ka të shumtën %(max)d shenjë (it has " -"%(length)d)." -msgstr[1] "" -"Sigurohuni që ky emër kartele ka të shumtën %(max)d shenja (ka %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Ju lutemi, ose parashtroni një kartelë, ose i vini shenjë kutizës për " -"spastrim, jo që të dyja." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Ngarkoni një figurë të vlefshme. Kartela që ngarkuat ose nuk qe figurë, ose " -"qe figurë e dëmtuar." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Përzgjidhni një zgjedhje të vlefshme. %(value)s s’është një nga zgjedhjet e " -"mundshme." - -msgid "Enter a list of values." -msgstr "Jepni një listë vlerash." - -msgid "Enter a complete value." -msgstr "Jepni një vlerë të plotë." - -msgid "Enter a valid UUID." -msgstr "Jepni një UUID të vlefshëm." - -msgid "Enter a valid JSON." -msgstr "Jepni një JSON të vlefshëm." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Fushë e fshehur %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Mungojnë të dhëna ManagementForm, ose në to janë futur hundët. Fusha që " -"mungojnë: %(field_names)s. Nëse problemi vazhdon, mund të duhet të " -"parashtroni një raport të mete." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Ju lutemi, parashtroni e shumta %(num)d formular." -msgstr[1] "Ju lutemi, parashtroni e shumta %(num)d formularë." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Ju lutemi, parashtroni të paktën %(num)d formular." -msgstr[1] "Ju lutemi, parashtroni të paktën %(num)d formularë." - -msgid "Order" -msgstr "Renditi" - -msgid "Delete" -msgstr "Fshije" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ju lutemi, ndreqni të dhënat e përsëdytura për %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ju lutemi, ndreqni të dhënat e përsëdytura për %(field)s, të cilat duhet të " -"jenë unike." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ju lutemi, ndreqni të dhënat e përsëdytura për %(field_name)s të cilat duhet " -"të jenë unike për %(lookup)s te %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Ju lutemi, ndreqni më poshtë vlerat e përsëdytura." - -msgid "The inline value did not match the parent instance." -msgstr "Vlera e brendshme s’u përputh me instancën mëmë." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Përzgjidhni një zgjedhje të vlefshme. Ajo zgjedhje s’është një nga zgjedhjet " -"e mundshme." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” s’është vlerë e vlefshme." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s s’u interpretua dot brenda zonës kohore %(current_timezone)s; " -"mund të jetë e dykuptimtë, ose mund të mos ekzistojë." - -msgid "Clear" -msgstr "Spastroje" - -msgid "Currently" -msgstr "Tani" - -msgid "Change" -msgstr "Ndryshoje" - -msgid "Unknown" -msgstr "E panjohur" - -msgid "Yes" -msgstr "Po" - -msgid "No" -msgstr "Jo" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "po,jo,ndoshta" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajte" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "mesnatë" - -msgid "noon" -msgstr "mesditë" - -msgid "Monday" -msgstr "E hënë" - -msgid "Tuesday" -msgstr "E martë" - -msgid "Wednesday" -msgstr "E mërkurë" - -msgid "Thursday" -msgstr "E enjte" - -msgid "Friday" -msgstr "E premte" - -msgid "Saturday" -msgstr "E shtunë" - -msgid "Sunday" -msgstr "E dielë" - -msgid "Mon" -msgstr "Hën" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mër" - -msgid "Thu" -msgstr "Enj" - -msgid "Fri" -msgstr "Pre" - -msgid "Sat" -msgstr "Sht" - -msgid "Sun" -msgstr "Die" - -msgid "January" -msgstr "Janar" - -msgid "February" -msgstr "Shkurt" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "Prill" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Qershor" - -msgid "July" -msgstr "Korrik" - -msgid "August" -msgstr "Gusht" - -msgid "September" -msgstr "Shtator" - -msgid "October" -msgstr "Tetor" - -msgid "November" -msgstr "Nëntor" - -msgid "December" -msgstr "Dhjetor" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "shk" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "pri" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "qer" - -msgid "jul" -msgstr "kor" - -msgid "aug" -msgstr "gus" - -msgid "sep" -msgstr "sht" - -msgid "oct" -msgstr "tet" - -msgid "nov" -msgstr "nën" - -msgid "dec" -msgstr "dhj" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Shk." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mars" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Prill" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Qershor" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Korrik" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Gus." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Shta." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Tet." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nën." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dhj." - -msgctxt "alt. month" -msgid "January" -msgstr "Janar" - -msgctxt "alt. month" -msgid "February" -msgstr "Shkurt" - -msgctxt "alt. month" -msgid "March" -msgstr "Mars" - -msgctxt "alt. month" -msgid "April" -msgstr "Prill" - -msgctxt "alt. month" -msgid "May" -msgstr "Maj" - -msgctxt "alt. month" -msgid "June" -msgstr "Qershor" - -msgctxt "alt. month" -msgid "July" -msgstr "Korrik" - -msgctxt "alt. month" -msgid "August" -msgstr "Gusht" - -msgctxt "alt. month" -msgid "September" -msgstr "Shtator" - -msgctxt "alt. month" -msgid "October" -msgstr "Tetor" - -msgctxt "alt. month" -msgid "November" -msgstr "Nëntor" - -msgctxt "alt. month" -msgid "December" -msgstr "Dhjetor" - -msgid "This is not a valid IPv6 address." -msgstr "Kjo s’është adresë IPv6 e vlefshme." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ose" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d vit" -msgstr[1] "%(num)d vjet" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d muaj" -msgstr[1] "%(num)d muaj" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d javë" -msgstr[1] "%(num)d javë" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d ditë" -msgstr[1] "%(num)d ditë" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d orë" -msgstr[1] "%(num)d orë" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutë" -msgstr[1] "%(num)d minuta" - -msgid "Forbidden" -msgstr "E ndaluar" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verifikimi CSRF dështoi. Kërkesa u ndërpre." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Këtë mesazh po e shihni ngaqë ky sajt HTTPS e ka të domosdoshme dërgimin e " -"“Referer header” te shfletuesi juaj, por s’u dërgua ndonjë i tillë. Kjo krye " -"është e domosdoshme për arsye sigurie, për të bërë të mundur që shfletuesi " -"juaj të mos komprometohet nga palë të treta." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Nëse e keni formësuar shfletuesin tuaj të çaktivizojë kryet “Referer”, ju " -"lutemi, riaktivizojini, ose për lidhje HTTPS, ose për kërkesa “same-origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Nëse përdorni etiketën " -"etiketën, ose përfshini kryet “Referrer-Policy: no-referrer”, ju lutemi, " -"hiqini. Mbrojtja CSRF lyp që kryet “Referer” të kryejnë kontroll strikt " -"referuesi. Nëse shqetësoheni për privatësinë, për lidhje te sajte palësh të " -"treta përdorni alternativa si ." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Këtë mesazh po e shihni ngaqë ky sajt lyp një “cookie” CSRF, kur " -"parashtrohen formularë. Kjo “cookie” është e domosdoshme për arsye sigurie, " -"për të bërë të mundur që shfletuesi juaj të mos komprometohet nga palë të " -"treta." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Nëse e keni formësuar shfletuesin tuaj të çaktivizojë cookie-t, ju lutemi, " -"riaktivizojini, të paktën për këtë sajt, ose për kërkesa “same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "Më tepër hollësi mund të gjeni me DEBUG=True." - -msgid "No year specified" -msgstr "Nuk është caktuar vit" - -msgid "Date out of range" -msgstr "Datë jashtë intervali" - -msgid "No month specified" -msgstr "Nuk është caktuar muaj" - -msgid "No day specified" -msgstr "Nuk është caktuar ditë" - -msgid "No week specified" -msgstr "Nuk është caktuar javë" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nuk ka %(verbose_name_plural)s të përcaktuar" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s i ardhshëm jo i passhëm, ngaqë %(class_name)s." -"allow_future është False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"U dha varg i pavlefshëm date “%(datestr)s” formati i dhënë “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "S’u gjetën %(verbose_name)s me përputhje" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Faqja s’është “last”, as mund të shndërrohet në një int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Faqe e pavlefshme (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Listë e zbrazët dhe “%(class_name)s.allow_empty” është “False”." - -msgid "Directory indexes are not allowed here." -msgstr "Këtu s’lejohen tregues drejtorish." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” s’ekziston" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Tregues i %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalimi funksionoi me sukses! Përgëzime!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Shihni shënimet për hedhjen në qarkullim të " -"Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Po e shihni këtë faqe ngaqë te kartela juaj e rregullimeve gjendet DEBUG=True dhe s’keni formësuar " -"ndonjë URL." - -msgid "Django Documentation" -msgstr "Dokumentim i Django-s" - -msgid "Topics, references, & how-to’s" -msgstr "Tema, referenca, & si-të" - -msgid "Tutorial: A Polling App" -msgstr "Përkujdesore: Një Aplikacion Për Sondazhe" - -msgid "Get started with Django" -msgstr "Si t’ia filloni me Django-n" - -msgid "Django Community" -msgstr "Bashkësia Django" - -msgid "Connect, get help, or contribute" -msgstr "Lidhuni, merrni ndihmë, ose jepni ndihmesë" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sq/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sq/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sq/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sq/formats.py deleted file mode 100644 index c7ed92e..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sq/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" -TIME_FORMAT = "g.i.A" -# DATETIME_FORMAT = -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y-m-d" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index 627a9cb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index e33e070..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1364 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018-2019 -# Igor Jerosimić, 2019-2021,2023-2025 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -# Mariusz Felisiak , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2019-2021,2023-2025\n" -"Language-Team: Serbian (http://app.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Afrikaans" -msgstr "африкански" - -msgid "Arabic" -msgstr "арапски" - -msgid "Algerian Arabic" -msgstr "Алжирски арапски" - -msgid "Asturian" -msgstr "астуријски" - -msgid "Azerbaijani" -msgstr "азербејџански" - -msgid "Bulgarian" -msgstr "бугарски" - -msgid "Belarusian" -msgstr "белоруски" - -msgid "Bengali" -msgstr "бенгалски" - -msgid "Breton" -msgstr "бретонски" - -msgid "Bosnian" -msgstr "босански" - -msgid "Catalan" -msgstr "каталонски" - -msgid "Central Kurdish (Sorani)" -msgstr "централнокурдски (сорани)" - -msgid "Czech" -msgstr "чешки" - -msgid "Welsh" -msgstr "велшки" - -msgid "Danish" -msgstr "дански" - -msgid "German" -msgstr "немачки" - -msgid "Lower Sorbian" -msgstr "доњолужичкосрпски" - -msgid "Greek" -msgstr "грчки" - -msgid "English" -msgstr "енглески" - -msgid "Australian English" -msgstr "аустралијски енглески" - -msgid "British English" -msgstr "британски енглески" - -msgid "Esperanto" -msgstr "есперанто" - -msgid "Spanish" -msgstr "шпански" - -msgid "Argentinian Spanish" -msgstr "аргентински шпански" - -msgid "Colombian Spanish" -msgstr "колумбијски шпански" - -msgid "Mexican Spanish" -msgstr "мексички шпански" - -msgid "Nicaraguan Spanish" -msgstr "никарагвански шпански" - -msgid "Venezuelan Spanish" -msgstr "венецуелански шпански" - -msgid "Estonian" -msgstr "естонски" - -msgid "Basque" -msgstr "баскијски" - -msgid "Persian" -msgstr "персијски" - -msgid "Finnish" -msgstr "фински" - -msgid "French" -msgstr "француски" - -msgid "Frisian" -msgstr "фризијски" - -msgid "Irish" -msgstr "ирски" - -msgid "Scottish Gaelic" -msgstr "шкотски гелски" - -msgid "Galician" -msgstr "галицијски" - -msgid "Hebrew" -msgstr "хебрејски" - -msgid "Hindi" -msgstr "хинду" - -msgid "Croatian" -msgstr "хрватски" - -msgid "Upper Sorbian" -msgstr "горњолужичкосрпски" - -msgid "Hungarian" -msgstr "мађарски" - -msgid "Armenian" -msgstr "јерменски" - -msgid "Interlingua" -msgstr "интерлингва" - -msgid "Indonesian" -msgstr "индонежански" - -msgid "Igbo" -msgstr "Игбо" - -msgid "Ido" -msgstr "идо" - -msgid "Icelandic" -msgstr "исландски" - -msgid "Italian" -msgstr "италијански" - -msgid "Japanese" -msgstr "јапански" - -msgid "Georgian" -msgstr "грузијски" - -msgid "Kabyle" -msgstr "кабилски" - -msgid "Kazakh" -msgstr "казашки" - -msgid "Khmer" -msgstr "кмерски" - -msgid "Kannada" -msgstr "канада" - -msgid "Korean" -msgstr "корејски" - -msgid "Kyrgyz" -msgstr "Киргиски" - -msgid "Luxembourgish" -msgstr "луксембуршки" - -msgid "Lithuanian" -msgstr "литвански" - -msgid "Latvian" -msgstr "латвијски" - -msgid "Macedonian" -msgstr "македонски" - -msgid "Malayalam" -msgstr "малајаламски" - -msgid "Mongolian" -msgstr "монголски" - -msgid "Marathi" -msgstr "маратхи" - -msgid "Malay" -msgstr "малајски" - -msgid "Burmese" -msgstr "бурмански" - -msgid "Norwegian Bokmål" -msgstr "норвешки књижевни" - -msgid "Nepali" -msgstr "непалски" - -msgid "Dutch" -msgstr "холандски" - -msgid "Norwegian Nynorsk" -msgstr "норвешки нови" - -msgid "Ossetic" -msgstr "осетински" - -msgid "Punjabi" -msgstr "панџаби" - -msgid "Polish" -msgstr "пољски" - -msgid "Portuguese" -msgstr "португалски" - -msgid "Brazilian Portuguese" -msgstr "бразилски португалски" - -msgid "Romanian" -msgstr "румунски" - -msgid "Russian" -msgstr "руски" - -msgid "Slovak" -msgstr "словачки" - -msgid "Slovenian" -msgstr "словеначки" - -msgid "Albanian" -msgstr "албански" - -msgid "Serbian" -msgstr "српски" - -msgid "Serbian Latin" -msgstr "српски (латиница)" - -msgid "Swedish" -msgstr "шведски" - -msgid "Swahili" -msgstr "свахили" - -msgid "Tamil" -msgstr "тамилски" - -msgid "Telugu" -msgstr "телугу" - -msgid "Tajik" -msgstr "Таџики" - -msgid "Thai" -msgstr "тајландски" - -msgid "Turkmen" -msgstr "Туркменски" - -msgid "Turkish" -msgstr "турски" - -msgid "Tatar" -msgstr "татарски" - -msgid "Udmurt" -msgstr "удмуртски" - -msgid "Uyghur" -msgstr "Ујгури" - -msgid "Ukrainian" -msgstr "украјински" - -msgid "Urdu" -msgstr "урду" - -msgid "Uzbek" -msgstr "Узбекистански" - -msgid "Vietnamese" -msgstr "вијетнамски" - -msgid "Simplified Chinese" -msgstr "поједностављени кинески" - -msgid "Traditional Chinese" -msgstr "традиционални кинески" - -msgid "Messages" -msgstr "Poruke" - -msgid "Site Maps" -msgstr "Мапе сајта" - -msgid "Static Files" -msgstr "Статички фајлови" - -msgid "Syndication" -msgstr "Удруживање садржаја" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Задати број стране није цео број" - -msgid "That page number is less than 1" -msgstr "Задати број стране је мањи од 1" - -msgid "That page contains no results" -msgstr "Тражена страна не садржи резултате" - -msgid "Enter a valid value." -msgstr "Унесите исправну вредност." - -msgid "Enter a valid domain name." -msgstr "Унесите исправно име домена." - -msgid "Enter a valid URL." -msgstr "Унесите исправан URL." - -msgid "Enter a valid integer." -msgstr "Унесите исправан цео број." - -msgid "Enter a valid email address." -msgstr "Унесите исправну и-мејл адресу." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Унесите исрпаван „слаг“, који се састоји од слова, бројки, доњих црта или " -"циртица." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Унесите исправан \"слаг\", који се састоји од Уникод слова, бројки, доњих " -"црта или цртица." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Унесите исправну адресу %(protocol)s." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 или IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Унесите само цифре раздвојене запетама." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Ово поље мора да буде %(limit_value)s (тренутно има %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ова вредност мора да буде мања од %(limit_value)s. или тачно толико." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ова вредност мора бити већа од %(limit_value)s или тачно толико." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Ова вредност мора да умножак величине корака %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Уверите се да је ова вредност вишекратник величине корака %(limit_value)s, " -"почевши од %(offset)s, нпр. %(offset)s, %(valid_value1)s, %(valid_value2)s, " -"и тако даље." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ово поље мора да има најмање %(limit_value)d карактер (тренутно има " -"%(show_value)d)." -msgstr[1] "" -"Ово поље мора да има најмање %(limit_value)d карактера (тренутно има " -"%(show_value)d)." -msgstr[2] "" -"Ово поље мора да има најмање %(limit_value)d карактера (тренутно има " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ово поље не сме да има више од %(limit_value)d карактера (тренутно има " -"%(show_value)d)." -msgstr[1] "" -"Ово поље не сме да има више од %(limit_value)d карактера (тренутно има " -"%(show_value)d)." -msgstr[2] "" -"Ово поље не сме да има више од %(limit_value)d карактера (тренутно има " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Унесите број." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Укупно не може бити више од %(max)s цифре." -msgstr[1] "Укупно не може бити више од %(max)s цифре." -msgstr[2] "Укупно не може бити више од %(max)s цифара." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Не може бити више од %(max)s децимале." -msgstr[1] "Не може бити више од %(max)s децимале." -msgstr[2] "Не може бити више од %(max)s децимала." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Не може бити више од %(max)s цифре пре децималног зареза." -msgstr[1] "Не може бити више од %(max)s цифре пре децималног зареза." -msgstr[2] "Не може бити више од %(max)s цифара пре децималног зареза." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Екстензија датотеке \"%(extension)s\" није дозвољена. Дозвољене су следеће " -"екстензије: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "'Null' карактери нису дозвољени." - -msgid "and" -msgstr "и" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s са пољем %(field_labels)s већ постоји." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Ограничење „%(name)s“ је прекршено." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Вредност %(value)r није валидна." - -msgid "This field cannot be null." -msgstr "Ово поље не може бити 'null'." - -msgid "This field cannot be blank." -msgstr "Ово поље не може да остане празно." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s са пољем %(field_label)s већ постоји." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s мора бити јединствен(a) за %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Поље типа: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Вредност \"%(value)s\" мора бити True или False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\" вредност мора бити True, False или None." - -msgid "Boolean (Either True or False)" -msgstr "Булова вредност (True или False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Стринг са макс. дужином %(max_length)s" - -msgid "String (unlimited)" -msgstr "Стринг (неограниченo)" - -msgid "Comma-separated integers" -msgstr "Цели бројеви раздвојени запетама" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Вредност \"%(value)s\" нема исправан формат датума. Мора бити у формату ГГГГ-" -"ММ-ДД." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Вредност \"%(value)s\" има исправан формат (ГГГГ-ММ-ДД) али то није исправан " -"датум." - -msgid "Date (without time)" -msgstr "Датум (без времена)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Вредност \"%(value)s\" нема исправан формат. Мора бити у формату ГГГГ-ММ-ДД " -"ЧЧ:ММ[:сс[.uuuuuu]][TZ] ." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Вредност \"%(value)s\" има исправан формат (ГГГГ-ММ-ДД ЧЧ:ММ[:сс[.uuuuuu]]" -"[TZ]) али то није исправан датум/време." - -msgid "Date (with time)" -msgstr "Датум (са временом)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Вредност \"%(value)s\" мора бити децимални број." - -msgid "Decimal number" -msgstr "Децимални број" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Вредност \"%(value)s\" нема исправан формат. Мора бити у формату [ДД] [ЧЧ:" -"[ММ:]]сс[.uuuuuu]." - -msgid "Duration" -msgstr "Временски интервал" - -msgid "Email address" -msgstr "Имејл адреса" - -msgid "File path" -msgstr "Путања фајла" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Вредност \"%(value)s\" мора бити број са покретним зарезом." - -msgid "Floating point number" -msgstr "Број са покретним зарезом" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Вредност \"%(value)s\" мора бити цео број." - -msgid "Integer" -msgstr "Цео број" - -msgid "Big (8 byte) integer" -msgstr "Велики (8 бајтова) цео број" - -msgid "Small integer" -msgstr "Мали цео број" - -msgid "IPv4 address" -msgstr "IPv4 адреса" - -msgid "IP address" -msgstr "IP адреса" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Вредност \"%(value)s\" мора бити None, True или False." - -msgid "Boolean (Either True, False or None)" -msgstr "Булова вредност (True, False или None)" - -msgid "Positive big integer" -msgstr "Велик позитиван цео број" - -msgid "Positive integer" -msgstr "Позитиван цео број" - -msgid "Positive small integer" -msgstr "Позитиван мали цео број" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слаг са макс. дужином %(max_length)s" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Вредност \"%(value)s\" нема исправан формат. Мора бити у формату ЧЧ:ММ[:сс[." -"uuuuuu]] ." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Вредност \"%(value)s\" има исправан формат (ЧЧ:ММ[:сс[.uuuuuu]]) али то није " -"исправно време." - -msgid "Time" -msgstr "Време" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Сирови бинарни подаци" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" није исправан UUID." - -msgid "Universally unique identifier" -msgstr "Универзално јединствени идентификатор" - -msgid "File" -msgstr "Фајл" - -msgid "Image" -msgstr "Слика" - -msgid "A JSON object" -msgstr "JSON објекат" - -msgid "Value must be valid JSON." -msgstr "Вредност мора бити исправан JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s инстанца са %(field)s %(value)r није исправан избор." - -msgid "Foreign Key (type determined by related field)" -msgstr "Спољни кључ (тип је одређен асоцираном колоном)" - -msgid "One-to-one relationship" -msgstr "Релација један на један" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Релација %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Релације %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Релација више на више" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ово поље се мора попунити." - -msgid "Enter a whole number." -msgstr "Унесите цео број." - -msgid "Enter a valid date." -msgstr "Унесите исправан датум." - -msgid "Enter a valid time." -msgstr "Унесите исправно време" - -msgid "Enter a valid date/time." -msgstr "Унесите исправан датум/време." - -msgid "Enter a valid duration." -msgstr "Унесите исправан временски интервал." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Број дана мора бити између {min_days} и {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Фајл није пребачен. Проверите тип енкодирања на форми." - -msgid "No file was submitted." -msgstr "Фајл није пребачен." - -msgid "The submitted file is empty." -msgstr "Пребачени фајл је празан." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Име фајла не може имати више од %(max)d карактера (тренутно има %(length)d)." -msgstr[1] "" -"Име фајла не може имати више од %(max)d карактера (тренутно има %(length)d)." -msgstr[2] "" -"Име фајла не може имати више од %(max)d карактера (тренутно има %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Може се само послати фајл или избрисати, не оба." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Пребаците исправан фајл. Фајл који је пребачен или није слика, или је " -"оштећен." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"%(value)s није међу понуђеним вредностима. Одаберите једну од понуђених." - -msgid "Enter a list of values." -msgstr "Унесите листу вредности." - -msgid "Enter a complete value." -msgstr "Унесите комплетну вредност." - -msgid "Enter a valid UUID." -msgstr "Унесите исправан UUID." - -msgid "Enter a valid JSON." -msgstr "Унесите исправан JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Скривено поље %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Подаци од ManagementForm недостају или су покварени. Поља која недостају: " -"%(field_names)s. Можда ће бити потребно да пријавите грешку ако се проблем " -"настави." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Молим проследите највише %(num)d форму." -msgstr[1] "Молим проследите највише %(num)d форме." -msgstr[2] "Молим проследите највише %(num)d форми." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Молим проследите најмање %(num)d форму." -msgstr[1] "Молим проследите најмање %(num)d форме." -msgstr[2] "Молим проследите најмање %(num)d форми." - -msgid "Order" -msgstr "Редослед" - -msgid "Delete" -msgstr "Обриши" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Исправите вредност за поље %(field)s - оно мора бити јединствено." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Исправите вредности за поља %(field)s - њихова комбинација мора бити " -"јединствена." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Иправите вредност за поље %(field_name)s, оно мора бити јединствено за " -"%(lookup)s у %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Исправите дуплиране вредности доле." - -msgid "The inline value did not match the parent instance." -msgstr "Директно унета вредност не одговара инстанци родитеља." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Одабрана вредност није међу понуђенима. Одаберите једну од понуђених." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" није исправна вредност." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Време %(datetime)s се не може протумачити у временској зони " -"%(current_timezone)s; можда је двосмислено или не постоји." - -msgid "Clear" -msgstr "Очисти" - -msgid "Currently" -msgstr "Тренутно" - -msgid "Change" -msgstr "Измени" - -msgid "Unknown" -msgstr "Непознато" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "да,не,можда" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d бајт" -msgstr[1] "%(size)d бајта" -msgstr[2] "%(size)d бајтова" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "по п." - -msgid "a.m." -msgstr "пре п." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "поноћ" - -msgid "noon" -msgstr "подне" - -msgid "Monday" -msgstr "понедељак" - -msgid "Tuesday" -msgstr "уторак" - -msgid "Wednesday" -msgstr "среда" - -msgid "Thursday" -msgstr "четвртак" - -msgid "Friday" -msgstr "петак" - -msgid "Saturday" -msgstr "субота" - -msgid "Sunday" -msgstr "недеља" - -msgid "Mon" -msgstr "пон." - -msgid "Tue" -msgstr "уто." - -msgid "Wed" -msgstr "сре." - -msgid "Thu" -msgstr "чет." - -msgid "Fri" -msgstr "пет." - -msgid "Sat" -msgstr "суб." - -msgid "Sun" -msgstr "нед." - -msgid "January" -msgstr "јануар" - -msgid "February" -msgstr "фебруар" - -msgid "March" -msgstr "март" - -msgid "April" -msgstr "април" - -msgid "May" -msgstr "мај" - -msgid "June" -msgstr "јун" - -msgid "July" -msgstr "јул" - -msgid "August" -msgstr "август" - -msgid "September" -msgstr "септембар" - -msgid "October" -msgstr "октобар" - -msgid "November" -msgstr "новембар" - -msgid "December" -msgstr "децембар" - -msgid "jan" -msgstr "јан." - -msgid "feb" -msgstr "феб." - -msgid "mar" -msgstr "мар." - -msgid "apr" -msgstr "апр." - -msgid "may" -msgstr "мај." - -msgid "jun" -msgstr "јун." - -msgid "jul" -msgstr "јул." - -msgid "aug" -msgstr "ауг." - -msgid "sep" -msgstr "сеп." - -msgid "oct" -msgstr "окт." - -msgid "nov" -msgstr "нов." - -msgid "dec" -msgstr "дец." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Јан." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Феб." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Април" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Мај" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Јун" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Јул" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Септ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Нов." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дец." - -msgctxt "alt. month" -msgid "January" -msgstr "Јануар" - -msgctxt "alt. month" -msgid "February" -msgstr "Фебруар" - -msgctxt "alt. month" -msgid "March" -msgstr "Март" - -msgctxt "alt. month" -msgid "April" -msgstr "Април" - -msgctxt "alt. month" -msgid "May" -msgstr "Мај" - -msgctxt "alt. month" -msgid "June" -msgstr "Јун" - -msgctxt "alt. month" -msgid "July" -msgstr "Јул" - -msgctxt "alt. month" -msgid "August" -msgstr "Август" - -msgctxt "alt. month" -msgid "September" -msgstr "Септембар" - -msgctxt "alt. month" -msgid "October" -msgstr "Октобар" - -msgctxt "alt. month" -msgid "November" -msgstr "Новембар" - -msgctxt "alt. month" -msgid "December" -msgstr "Децембар" - -msgid "This is not a valid IPv6 address." -msgstr "Ово није валидна IPv6 адреса." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "или" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d године" -msgstr[2] "%(num)d година" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месец" -msgstr[1] "%(num)d месеца" -msgstr[2] "%(num)d месеци" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d недеља" -msgstr[1] "%(num)d недеље" -msgstr[2] "%(num)d недеља" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d дан" -msgstr[1] "%(num)d дана" -msgstr[2] "%(num)d дана" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d сат" -msgstr[1] "%(num)d сата" -msgstr[2] "%(num)d сати" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минут" -msgstr[1] "%(num)d минута" -msgstr[2] "%(num)d минута" - -msgid "Forbidden" -msgstr "Забрањено" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF верификација није прошла. Захтев одбијен." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Ова порука је приказана јер овај HTTPS сајт захтева да \"Referer header\" " -"буде послат од стране вашег интернет прегледача, што тренутно није случај. " -"Поменуто заглавље је потребно из безбедоносних разлога, да би се осигурало " -"да ваш прегледач није под контролом трећих лица." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ако сте подесили интернет прегледач да не шаље \"Referer\" заглавља, поново " -"их укључите, барем за овај сајт, или за HTTPS конекције, или за \"same-" -"origin\" захтеве." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ако користите таг или " -"\"Referrer-Policy: no-referrer\" заглавље, молимо да их уклоните. CSRF " -"заштита захтева \"Referer\" заглавље да би се обавила стриктна \"referrer\" " -"провера. Уколико вас брине приватност, користите алтернативе као за линкове ка другим сајтовима." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Ова порука је приказана јер овај сајт захтева CSRF куки када се прослеђују " -"подаци из форми. Овај куки је потребан из сигурносних разлога, да би се " -"осигурало да ваш претраживач није под контролом трећих лица." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ако је ваш интернет прегедач подешен да онемогући колачиће, молимо да их " -"укључите, барем за овај сајт, или за \"same-origin\" захтеве." - -msgid "More information is available with DEBUG=True." -msgstr "Више информација је доступно са DEBUG=True." - -msgid "No year specified" -msgstr "Година није назначена" - -msgid "Date out of range" -msgstr "Датум ван опсега" - -msgid "No month specified" -msgstr "Месец није назначен" - -msgid "No day specified" -msgstr "Дан није назначен" - -msgid "No week specified" -msgstr "Недеља није назначена" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Недоступни објекти %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Опција „future“ није доступна за „%(verbose_name_plural)s“ јер " -"%(class_name)s.allow_future има вредност False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Неисправан датум „%(datestr)s“ за формат „%(format)s“" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Ниједан објекат класе %(verbose_name)s није нађен датим упитом." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Страница није последња, нити може бити конвертована у тип \"int\"." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Неисправна страна (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Празна листа и „%(class_name)s.allow_empty“ има вредност False." - -msgid "Directory indexes are not allowed here." -msgstr "Индекси директоријума нису дозвољени овде." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ не постоји" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Индекс директоријума %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Инсталација је прошла успешно. Честитке!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Погледајте напомене уз издање за Ђанго " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Ова страна је приказана јер је DEBUG=True у вашим подешавањима и нисте конфигурисали " -"ниједан URL." - -msgid "Django Documentation" -msgstr "Ђанго документација" - -msgid "Topics, references, & how-to’s" -msgstr "Теме, референце, & како-да" - -msgid "Tutorial: A Polling App" -msgstr "Упутство: апликација за гласање" - -msgid "Get started with Django" -msgstr "Почните са Ђангом" - -msgid "Django Community" -msgstr "Ђанго заједница" - -msgid "Connect, get help, or contribute" -msgstr "Повежите се, потражите помоћ или дајте допринос" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sr/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sr/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sr/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sr/formats.py deleted file mode 100644 index 423f86d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sr/formats.py +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y. H:i" -YEAR_MONTH_FORMAT = "F Y." -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.m.Y." -SHORT_DATETIME_FORMAT = "j.m.Y. H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y.", # '25.10.2006.' - "%d.%m.%y.", # '25.10.06.' - "%d. %m. %Y.", # '25. 10. 2006.' - "%d. %m. %y.", # '25. 10. 06.' - # "%d. %b %y.", # '25. Oct 06.' - # "%d. %B %y.", # '25. October 06.' - # "%d. %b '%y.", # '25. Oct '06.' - # "%d. %B '%y.", # '25. October '06.' - # "%d. %b %Y.", # '25. Oct 2006.' - # "%d. %B %Y.", # '25. October 2006.' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y. %H:%M:%S", # '25.10.2006. 14:30:59' - "%d.%m.%Y. %H:%M:%S.%f", # '25.10.2006. 14:30:59.000200' - "%d.%m.%Y. %H:%M", # '25.10.2006. 14:30' - "%d.%m.%y. %H:%M:%S", # '25.10.06. 14:30:59' - "%d.%m.%y. %H:%M:%S.%f", # '25.10.06. 14:30:59.000200' - "%d.%m.%y. %H:%M", # '25.10.06. 14:30' - "%d. %m. %Y. %H:%M:%S", # '25. 10. 2006. 14:30:59' - "%d. %m. %Y. %H:%M:%S.%f", # '25. 10. 2006. 14:30:59.000200' - "%d. %m. %Y. %H:%M", # '25. 10. 2006. 14:30' - "%d. %m. %y. %H:%M:%S", # '25. 10. 06. 14:30:59' - "%d. %m. %y. %H:%M:%S.%f", # '25. 10. 06. 14:30:59.000200' - "%d. %m. %y. %H:%M", # '25. 10. 06. 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index 4a4ffa8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index 5f5bc77..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1638 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aleksa Cukovic` , 2020 -# Danijela Popović, 2022 -# Igor Jerosimić, 2019-2021,2023-2024 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Igor Jerosimić, 2019-2021,2023-2024\n" -"Language-Team: Serbian (Latin) (http://app.transifex.com/django/django/language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: conf/global_settings.py:52 -msgid "Afrikaans" -msgstr "afrikanski" - -#: conf/global_settings.py:53 -msgid "Arabic" -msgstr "arapski" - -#: conf/global_settings.py:54 -msgid "Algerian Arabic" -msgstr "Alžirski arapski" - -#: conf/global_settings.py:55 -msgid "Asturian" -msgstr "asturijski" - -#: conf/global_settings.py:56 -msgid "Azerbaijani" -msgstr "azerbejdžanski" - -#: conf/global_settings.py:57 -msgid "Bulgarian" -msgstr "bugarski" - -#: conf/global_settings.py:58 -msgid "Belarusian" -msgstr "beloruski" - -#: conf/global_settings.py:59 -msgid "Bengali" -msgstr "bengalski" - -#: conf/global_settings.py:60 -msgid "Breton" -msgstr "bretonski" - -#: conf/global_settings.py:61 -msgid "Bosnian" -msgstr "bosanski" - -#: conf/global_settings.py:62 -msgid "Catalan" -msgstr "katalonski" - -#: conf/global_settings.py:63 -msgid "Central Kurdish (Sorani)" -msgstr "centralnokurdski (sorani)" - -#: conf/global_settings.py:64 -msgid "Czech" -msgstr "češki" - -#: conf/global_settings.py:65 -msgid "Welsh" -msgstr "velški" - -#: conf/global_settings.py:66 -msgid "Danish" -msgstr "danski" - -#: conf/global_settings.py:67 -msgid "German" -msgstr "nemački" - -#: conf/global_settings.py:68 -msgid "Lower Sorbian" -msgstr "donjolužičkosrpski" - -#: conf/global_settings.py:69 -msgid "Greek" -msgstr "grčki" - -#: conf/global_settings.py:70 -msgid "English" -msgstr "engleski" - -#: conf/global_settings.py:71 -msgid "Australian English" -msgstr "australijski engleski" - -#: conf/global_settings.py:72 -msgid "British English" -msgstr "britanski engleski" - -#: conf/global_settings.py:73 -msgid "Esperanto" -msgstr "esperanto" - -#: conf/global_settings.py:74 -msgid "Spanish" -msgstr "španski" - -#: conf/global_settings.py:75 -msgid "Argentinian Spanish" -msgstr "argentinski španski" - -#: conf/global_settings.py:76 -msgid "Colombian Spanish" -msgstr "kolumbijski španski" - -#: conf/global_settings.py:77 -msgid "Mexican Spanish" -msgstr "meksički španski" - -#: conf/global_settings.py:78 -msgid "Nicaraguan Spanish" -msgstr "nikaragvanski španski" - -#: conf/global_settings.py:79 -msgid "Venezuelan Spanish" -msgstr "venecuelanski španski" - -#: conf/global_settings.py:80 -msgid "Estonian" -msgstr "estonski" - -#: conf/global_settings.py:81 -msgid "Basque" -msgstr "baskijski" - -#: conf/global_settings.py:82 -msgid "Persian" -msgstr "persijski" - -#: conf/global_settings.py:83 -msgid "Finnish" -msgstr "finski" - -#: conf/global_settings.py:84 -msgid "French" -msgstr "francuski" - -#: conf/global_settings.py:85 -msgid "Frisian" -msgstr "frizijski" - -#: conf/global_settings.py:86 -msgid "Irish" -msgstr "irski" - -#: conf/global_settings.py:87 -msgid "Scottish Gaelic" -msgstr "škotski galski" - -#: conf/global_settings.py:88 -msgid "Galician" -msgstr "galski" - -#: conf/global_settings.py:89 -msgid "Hebrew" -msgstr "hebrejski" - -#: conf/global_settings.py:90 -msgid "Hindi" -msgstr "hindu" - -#: conf/global_settings.py:91 -msgid "Croatian" -msgstr "hrvatski" - -#: conf/global_settings.py:92 -msgid "Upper Sorbian" -msgstr "gornjolužičkosrpski" - -#: conf/global_settings.py:93 -msgid "Hungarian" -msgstr "mađarski" - -#: conf/global_settings.py:94 -msgid "Armenian" -msgstr "jermenski" - -#: conf/global_settings.py:95 -msgid "Interlingua" -msgstr "interlingva" - -#: conf/global_settings.py:96 -msgid "Indonesian" -msgstr "indonežanski" - -#: conf/global_settings.py:97 -msgid "Igbo" -msgstr "Igbo" - -#: conf/global_settings.py:98 -msgid "Ido" -msgstr "ido" - -#: conf/global_settings.py:99 -msgid "Icelandic" -msgstr "islandski" - -#: conf/global_settings.py:100 -msgid "Italian" -msgstr "italijanski" - -#: conf/global_settings.py:101 -msgid "Japanese" -msgstr "japanski" - -#: conf/global_settings.py:102 -msgid "Georgian" -msgstr "gruzijski" - -#: conf/global_settings.py:103 -msgid "Kabyle" -msgstr "kabilski" - -#: conf/global_settings.py:104 -msgid "Kazakh" -msgstr "kazaški" - -#: conf/global_settings.py:105 -msgid "Khmer" -msgstr "kambodijski" - -#: conf/global_settings.py:106 -msgid "Kannada" -msgstr "kanada" - -#: conf/global_settings.py:107 -msgid "Korean" -msgstr "korejski" - -#: conf/global_settings.py:108 -msgid "Kyrgyz" -msgstr "Kirgiski" - -#: conf/global_settings.py:109 -msgid "Luxembourgish" -msgstr "luksemburški" - -#: conf/global_settings.py:110 -msgid "Lithuanian" -msgstr "litvanski" - -#: conf/global_settings.py:111 -msgid "Latvian" -msgstr "latvijski" - -#: conf/global_settings.py:112 -msgid "Macedonian" -msgstr "makedonski" - -#: conf/global_settings.py:113 -msgid "Malayalam" -msgstr "malajalamski" - -#: conf/global_settings.py:114 -msgid "Mongolian" -msgstr "mongolski" - -#: conf/global_settings.py:115 -msgid "Marathi" -msgstr "marathi" - -#: conf/global_settings.py:116 -msgid "Malay" -msgstr "malajski" - -#: conf/global_settings.py:117 -msgid "Burmese" -msgstr "burmanski" - -#: conf/global_settings.py:118 -msgid "Norwegian Bokmål" -msgstr "norveški književni" - -#: conf/global_settings.py:119 -msgid "Nepali" -msgstr "nepalski" - -#: conf/global_settings.py:120 -msgid "Dutch" -msgstr "holandski" - -#: conf/global_settings.py:121 -msgid "Norwegian Nynorsk" -msgstr "norveški novi" - -#: conf/global_settings.py:122 -msgid "Ossetic" -msgstr "osetinski" - -#: conf/global_settings.py:123 -msgid "Punjabi" -msgstr "Pandžabi" - -#: conf/global_settings.py:124 -msgid "Polish" -msgstr "poljski" - -#: conf/global_settings.py:125 -msgid "Portuguese" -msgstr "portugalski" - -#: conf/global_settings.py:126 -msgid "Brazilian Portuguese" -msgstr "brazilski portugalski" - -#: conf/global_settings.py:127 -msgid "Romanian" -msgstr "rumunski" - -#: conf/global_settings.py:128 -msgid "Russian" -msgstr "ruski" - -#: conf/global_settings.py:129 -msgid "Slovak" -msgstr "slovački" - -#: conf/global_settings.py:130 -msgid "Slovenian" -msgstr "slovenački" - -#: conf/global_settings.py:131 -msgid "Albanian" -msgstr "albanski" - -#: conf/global_settings.py:132 -msgid "Serbian" -msgstr "srpski" - -#: conf/global_settings.py:133 -msgid "Serbian Latin" -msgstr "srpski (latinica)" - -#: conf/global_settings.py:134 -msgid "Swedish" -msgstr "švedski" - -#: conf/global_settings.py:135 -msgid "Swahili" -msgstr "svahili" - -#: conf/global_settings.py:136 -msgid "Tamil" -msgstr "tamilski" - -#: conf/global_settings.py:137 -msgid "Telugu" -msgstr "telugu" - -#: conf/global_settings.py:138 -msgid "Tajik" -msgstr "Tadžiki" - -#: conf/global_settings.py:139 -msgid "Thai" -msgstr "tajlandski" - -#: conf/global_settings.py:140 -msgid "Turkmen" -msgstr "Turkmenski" - -#: conf/global_settings.py:141 -msgid "Turkish" -msgstr "turski" - -#: conf/global_settings.py:142 -msgid "Tatar" -msgstr "tatarski" - -#: conf/global_settings.py:143 -msgid "Udmurt" -msgstr "udmurtski" - -#: conf/global_settings.py:144 -msgid "Uyghur" -msgstr "Ujgur" - -#: conf/global_settings.py:145 -msgid "Ukrainian" -msgstr "ukrajinski" - -#: conf/global_settings.py:146 -msgid "Urdu" -msgstr "Urdu" - -#: conf/global_settings.py:147 -msgid "Uzbek" -msgstr "Uzbekistanski" - -#: conf/global_settings.py:148 -msgid "Vietnamese" -msgstr "vijetnamski" - -#: conf/global_settings.py:149 -msgid "Simplified Chinese" -msgstr "novokineski" - -#: conf/global_settings.py:150 -msgid "Traditional Chinese" -msgstr "starokineski" - -#: contrib/messages/apps.py:15 -msgid "Messages" -msgstr "Poruke" - -#: contrib/sitemaps/apps.py:8 -msgid "Site Maps" -msgstr "Mape sajta" - -#: contrib/staticfiles/apps.py:9 -msgid "Static Files" -msgstr "Statičke datoteke" - -#: contrib/syndication/apps.py:7 -msgid "Syndication" -msgstr "Udruživanje sadržaja" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -#: core/paginator.py:30 -msgid "…" -msgstr "…" - -#: core/paginator.py:32 -msgid "That page number is not an integer" -msgstr "Zadati broj strane nije ceo broj" - -#: core/paginator.py:33 -msgid "That page number is less than 1" -msgstr "Zadati broj strane je manji od 1" - -#: core/paginator.py:34 -msgid "That page contains no results" -msgstr "Tražena strana ne sadrži rezultate" - -#: core/validators.py:22 -msgid "Enter a valid value." -msgstr "Unesite ispravnu vrednost." - -#: core/validators.py:70 -msgid "Enter a valid domain name." -msgstr "Unesite ispravno ime domena." - -#: core/validators.py:104 forms/fields.py:759 -msgid "Enter a valid URL." -msgstr "Unesite ispravan URL." - -#: core/validators.py:165 -msgid "Enter a valid integer." -msgstr "Unesite ispravan ceo broj." - -#: core/validators.py:176 -msgid "Enter a valid email address." -msgstr "Unesite ispravnu e-mail adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -#: core/validators.py:259 -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "Unesite isrpavan „slag“, koji se sastoji od slova, brojki, donjih crta ili cirtica." - -#: core/validators.py:267 -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or" -" hyphens." -msgstr "Unesite ispravan \"slag\", koji se sastoji od Unikod slova, brojki, donjih crta ili crtica." - -#: core/validators.py:327 core/validators.py:336 core/validators.py:350 -#: db/models/fields/__init__.py:2219 -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Unesite ispravnu adresu %(protocol)s." - -#: core/validators.py:329 -msgid "IPv4" -msgstr "IPv4" - -#: core/validators.py:338 utils/ipv6.py:30 -msgid "IPv6" -msgstr "IPv6" - -#: core/validators.py:352 -msgid "IPv4 or IPv6" -msgstr "IPv4 ili IPv6" - -#: core/validators.py:341 -msgid "Enter only digits separated by commas." -msgstr "Unesite samo brojke razdvojene zapetama." - -#: core/validators.py:347 -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Ovo polje mora da bude %(limit_value)s (trenutno ima %(show_value)s)." - -#: core/validators.py:382 -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ova vrednost mora da bude manja od %(limit_value)s. ili tačno toliko." - -#: core/validators.py:391 -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ova vrednost mora biti veća od %(limit_value)s ili tačno toliko." - -#: core/validators.py:400 -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Ova vrednost mora da umnožak veličine koraka %(limit_value)s." - -#: core/validators.py:407 -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "Uverite se da je ova vrednost višestruka od veličine koraka %(limit_value)s, počevši od %(offset)s, npr. %(offset)s, %(valid_value1)s, %(valid_value2)s, itd." - -#: core/validators.py:439 -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "Ovo polje mora da ima najmanje %(limit_value)d karakter (trenutno ima %(show_value)d)." -msgstr[1] "Ovo polje mora da ima najmanje %(limit_value)d karaktera (trenutno ima %(show_value)d)." -msgstr[2] "Ovo polje mora da ima %(limit_value)d najmanje karaktera (trenutno ima %(show_value)d )." - -#: core/validators.py:457 -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "Ovo polje ne sme da ima više od %(limit_value)d karaktera (trenutno ima %(show_value)d)." -msgstr[1] "Ovo polje ne sme da ima više od %(limit_value)d karaktera (trenutno ima %(show_value)d)." -msgstr[2] "Ovo polje ne sme da ima više od %(limit_value)d karaktera (trenutno ima %(show_value)d)." - -#: core/validators.py:480 forms/fields.py:354 forms/fields.py:393 -msgid "Enter a number." -msgstr "Unesite broj." - -#: core/validators.py:482 -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Ukupno ne može biti više od %(max)s cifre." -msgstr[1] "Ukupno ne može biti više od %(max)s cifre." -msgstr[2] "Ukupno ne može biti više od %(max)s cifara." - -#: core/validators.py:487 -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Ne može biti više od %(max)s decimale." -msgstr[1] "Ne može biti više od %(max)s decimale." -msgstr[2] "Ne može biti više od %(max)s decimala." - -#: core/validators.py:492 -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Ne može biti više od %(max)s cifre pre decimalnog zapisa." -msgstr[1] "Ne može biti više od %(max)s cifre pre decimalnog zapisa." -msgstr[2] "Ne može biti više od %(max)s cifara pre decimalnog zapisa." - -#: core/validators.py:563 -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "Ekstenzija datoteke \"%(extension)s\" nije dozvoljena. Dozvoljene su sledeće ekstenzije: %(allowed_extensions)s." - -#: core/validators.py:624 -msgid "Null characters are not allowed." -msgstr "'Null' karakteri nisu dozvoljeni." - -#: db/models/base.py:1465 forms/models.py:902 -msgid "and" -msgstr "i" - -#: db/models/base.py:1467 -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s sa poljem %(field_labels)s već postoji." - -#: db/models/constraints.py:20 -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Ograničenje „%(name)s“ je prekršeno." - -#: db/models/fields/__init__.py:128 -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Vrednost %(value)r nije validna." - -#: db/models/fields/__init__.py:129 -msgid "This field cannot be null." -msgstr "Ovo polje ne može da ostane prazno." - -#: db/models/fields/__init__.py:130 -msgid "This field cannot be blank." -msgstr "Ovo polje ne može da ostane prazno." - -#: db/models/fields/__init__.py:131 -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s sa ovom vrednošću %(field_label)s već postoji." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#: db/models/fields/__init__.py:135 -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s mora biti jedinstven(a) za %(date_field_label)s %(lookup_type)s." - -#: db/models/fields/__init__.py:174 -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Polje tipa: %(field_type)s" - -#: db/models/fields/__init__.py:1157 -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Vrednost \"%(value)s\" mora biti True ili False." - -#: db/models/fields/__init__.py:1158 -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\" vrednost mora biti True, False ili None." - -#: db/models/fields/__init__.py:1160 -msgid "Boolean (Either True or False)" -msgstr "Bulova vrednost (True ili False)" - -#: db/models/fields/__init__.py:1210 -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (najviše %(max_length)s znakova)" - -#: db/models/fields/__init__.py:1212 -msgid "String (unlimited)" -msgstr "String (neograničeno)" - -#: db/models/fields/__init__.py:1316 -msgid "Comma-separated integers" -msgstr "Celi brojevi razdvojeni zapetama" - -#: db/models/fields/__init__.py:1417 -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "Vrednost \"%(value)s\" nema ispravan format datuma. Mora biti u formatu GGGG-MM-DD." - -#: db/models/fields/__init__.py:1421 db/models/fields/__init__.py:1556 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "Vrednost “%(value)s” ima odgovarajući format (GGGG-MM-DD), ali nije validan datum." - -#: db/models/fields/__init__.py:1425 -msgid "Date (without time)" -msgstr "Datum (bez vremena)" - -#: db/models/fields/__init__.py:1552 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD " -"HH:MM[:ss[.uuuuuu]][TZ] format." -msgstr "Vrednost “%(value)s” je u nevažećem formatu. Mora se uneti u formatu YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#: db/models/fields/__init__.py:1560 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD " -"HH:MM[:ss[.uuuuuu]][TZ]) but it is an invalid date/time." -msgstr "Vrednost “%(value)s” je u odgovarajućem formatu (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]), ali nije validna vrednost za datum i vreme." - -#: db/models/fields/__init__.py:1565 -msgid "Date (with time)" -msgstr "Datum (sa vremenom)" - -#: db/models/fields/__init__.py:1689 -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Vrednost “%(value)s” mora biti decimalni broj." - -#: db/models/fields/__init__.py:1691 -msgid "Decimal number" -msgstr "Decimalni broj" - -#: db/models/fields/__init__.py:1852 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] " -"[[HH:]MM:]ss[.uuuuuu] format." -msgstr "Vrednost “%(value)s” nije u odgovarajućem formatu. Mora biti u formatu [DD] [[HH:]MM:]ss[.uuuuuu]." - -#: db/models/fields/__init__.py:1856 -msgid "Duration" -msgstr "Vremenski interval" - -#: db/models/fields/__init__.py:1908 -msgid "Email address" -msgstr "Imejl adresa" - -#: db/models/fields/__init__.py:1933 -msgid "File path" -msgstr "Putanja fajla" - -#: db/models/fields/__init__.py:2011 -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Vrednost “%(value)s” value mora biti tipa float." - -#: db/models/fields/__init__.py:2013 -msgid "Floating point number" -msgstr "Broj sa pokrenom zapetom" - -#: db/models/fields/__init__.py:2053 -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Vrednost “%(value)s” mora biti ceo broj." - -#: db/models/fields/__init__.py:2055 -msgid "Integer" -msgstr "Ceo broj" - -#: db/models/fields/__init__.py:2151 -msgid "Big (8 byte) integer" -msgstr "Veliki ceo broj" - -#: db/models/fields/__init__.py:2168 -msgid "Small integer" -msgstr "Mali ceo broj" - -#: db/models/fields/__init__.py:2176 -msgid "IPv4 address" -msgstr "IPv4 adresa" - -#: db/models/fields/__init__.py:2207 -msgid "IP address" -msgstr "IP adresa" - -#: db/models/fields/__init__.py:2300 db/models/fields/__init__.py:2301 -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Vrednost “%(value)s” mora biti None, True ili False." - -#: db/models/fields/__init__.py:2303 -msgid "Boolean (Either True, False or None)" -msgstr "Bulova vrednost (True, False ili None)" - -#: db/models/fields/__init__.py:2354 -msgid "Positive big integer" -msgstr "Velik pozitivan celi broj" - -#: db/models/fields/__init__.py:2369 -msgid "Positive integer" -msgstr "Pozitivan ceo broj" - -#: db/models/fields/__init__.py:2384 -msgid "Positive small integer" -msgstr "Pozitivan mali ceo broj" - -#: db/models/fields/__init__.py:2400 -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slag (ne duži od %(max_length)s)" - -#: db/models/fields/__init__.py:2436 -msgid "Text" -msgstr "Tekst" - -#: db/models/fields/__init__.py:2511 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "Vrednost “%(value)s” nije u odgovarajućem formatu. Mora biti u formatu HH:MM[:ss[.uuuuuu]]." - -#: db/models/fields/__init__.py:2515 -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "Vrednost “%(value)s” je u odgovarajućem formatu (HH:MM[:ss[.uuuuuu]]), ali nije validna vrednost za vreme." - -#: db/models/fields/__init__.py:2519 -msgid "Time" -msgstr "Vreme" - -#: db/models/fields/__init__.py:2627 -msgid "URL" -msgstr "URL" - -#: db/models/fields/__init__.py:2651 -msgid "Raw binary data" -msgstr "Sirovi binarni podaci" - -#: db/models/fields/__init__.py:2716 -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Vrednost “%(value)s” nije validan UUID (jedinstveni ID)." - -#: db/models/fields/__init__.py:2718 -msgid "Universally unique identifier" -msgstr "Univerzalno jedinstveni identifikator" - -#: db/models/fields/files.py:232 -msgid "File" -msgstr "Fajl" - -#: db/models/fields/files.py:393 -msgid "Image" -msgstr "Slika" - -#: db/models/fields/json.py:26 -msgid "A JSON object" -msgstr "JSON objekat" - -#: db/models/fields/json.py:28 -msgid "Value must be valid JSON." -msgstr "Vrednost mora biti ispravni JSON." - -#: db/models/fields/related.py:939 -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Instanca modela %(model)s sa vrednošću %(field)s %(value)r ne postoji." - -#: db/models/fields/related.py:941 -msgid "Foreign Key (type determined by related field)" -msgstr "Strani ključ (tip određuje referentno polje)" - -#: db/models/fields/related.py:1235 -msgid "One-to-one relationship" -msgstr "Relacija jedan na jedan" - -#: db/models/fields/related.py:1292 -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relacija %(from)s-%(to)s" - -#: db/models/fields/related.py:1294 -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relacije %(from)s-%(to)s" - -#: db/models/fields/related.py:1342 -msgid "Many-to-many relationship" -msgstr "Relacija više na više" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -#: forms/boundfield.py:185 -msgid ":?.!" -msgstr ":?.!" - -#: forms/fields.py:94 -msgid "This field is required." -msgstr "Ovo polje se mora popuniti." - -#: forms/fields.py:303 -msgid "Enter a whole number." -msgstr "Unesite ceo broj." - -#: forms/fields.py:474 forms/fields.py:1246 -msgid "Enter a valid date." -msgstr "Unesite ispravan datum." - -#: forms/fields.py:497 forms/fields.py:1247 -msgid "Enter a valid time." -msgstr "Unesite ispravno vreme" - -#: forms/fields.py:524 -msgid "Enter a valid date/time." -msgstr "Unesite ispravan datum/vreme." - -#: forms/fields.py:558 -msgid "Enter a valid duration." -msgstr "Unesite ispravno trajanje." - -#: forms/fields.py:559 -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Broj dana mora biti između {min_days} i {max_days}." - -#: forms/fields.py:628 -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Fajl nije prebačen. Proverite tip enkodiranja formulara." - -#: forms/fields.py:629 -msgid "No file was submitted." -msgstr "Fajl nije prebačen." - -#: forms/fields.py:630 -msgid "The submitted file is empty." -msgstr "Prebačen fajl je prazan." - -#: forms/fields.py:632 -#, python-format -msgid "" -"Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "Ime fajla ne može imati više od %(max)d karaktera (trenutno ima %(length)d)." -msgstr[1] "Ime fajla ne može imati više od %(max)d karaktera (trenutno ima %(length)d)." -msgstr[2] "Ime fajla ne može imati više od %(max)d karaktera (trenutno ima %(length)d)." - -#: forms/fields.py:637 -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Može se samo poslati fajl ili izbrisati, ne oba." - -#: forms/fields.py:701 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "Prebacite ispravan fajl. Fajl koji je prebačen ili nije slika, ili je oštećen." - -#: forms/fields.py:868 forms/fields.py:954 forms/models.py:1581 -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "%(value)s nije među ponuđenim vrednostima. Odaberite jednu od ponuđenih." - -#: forms/fields.py:956 forms/fields.py:1075 forms/models.py:1579 -msgid "Enter a list of values." -msgstr "Unesite listu vrednosti." - -#: forms/fields.py:1076 -msgid "Enter a complete value." -msgstr "Unesite kompletnu vrednost." - -#: forms/fields.py:1315 -msgid "Enter a valid UUID." -msgstr "Unesite ispravan UUID." - -#: forms/fields.py:1345 -msgid "Enter a valid JSON." -msgstr "Unesite ispravan JSON." - -#. Translators: This is the default suffix added to form field labels -#: forms/forms.py:94 -msgid ":" -msgstr ":" - -#: forms/forms.py:231 -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skriveno polje %(name)s) %(error)s" - -#: forms/formsets.py:61 -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "Podaci od ManagementForm nedostaju ili su pokvareni. Polja koja nedostaju: %(field_names)s. Možda će biti potrebno da prijavite grešku ako se problem nastavi." - -#: forms/formsets.py:65 -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Molim prosledite najviše %(num)d formular." -msgstr[1] "Molim prosledite najviše %(num)d formulara." -msgstr[2] "Molim prosledite najviše %(num)d formulara." - -#: forms/formsets.py:70 -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] " Molim prosledite najmanje %(num)d formular." -msgstr[1] " Molim prosledite najmanje %(num)d formulara." -msgstr[2] " Molim prosledite najmanje %(num)d formulara." - -#: forms/formsets.py:484 forms/formsets.py:491 -msgid "Order" -msgstr "Redosled" - -#: forms/formsets.py:499 -msgid "Delete" -msgstr "Obriši" - -#: forms/models.py:895 -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ispravite dupliran sadržaj za polja: %(field)s." - -#: forms/models.py:900 -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Ispravite dupliran sadržaj za polja: %(field)s, koji mora da bude jedinstven." - -#: forms/models.py:907 -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "Ispravite dupliran sadržaj za polja: %(field_name)s, koji mora da bude jedinstven za %(lookup)s u %(date_field)s." - -#: forms/models.py:916 -msgid "Please correct the duplicate values below." -msgstr "Ispravite duplirane vrednosti dole." - -#: forms/models.py:1353 -msgid "The inline value did not match the parent instance." -msgstr "Direktno uneta vrednost ne odgovara instanci roditelja." - -#: forms/models.py:1444 -msgid "" -"Select a valid choice. That choice is not one of the available choices." -msgstr "Odabrana vrednost nije među ponuđenima. Odaberite jednu od ponuđenih." - -#: forms/models.py:1583 -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" nije ispravna vrednost." - -#: forms/utils.py:227 -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "Vreme %(datetime)s se ne može protumačiti u vremenskoj zoni %(current_timezone)s; možda je dvosmisleno ili ne postoji." - -#: forms/widgets.py:457 -msgid "Clear" -msgstr "Očisti" - -#: forms/widgets.py:458 -msgid "Currently" -msgstr "Trenutno" - -#: forms/widgets.py:459 -msgid "Change" -msgstr "Izmeni" - -#: forms/widgets.py:796 -msgid "Unknown" -msgstr "Nepoznato" - -#: forms/widgets.py:797 -msgid "Yes" -msgstr "Da" - -#: forms/widgets.py:798 -msgid "No" -msgstr "Ne" - -#. Translators: Please do not add spaces around commas. -#: template/defaultfilters.py:875 -msgid "yes,no,maybe" -msgstr "da,ne,možda" - -#: template/defaultfilters.py:905 template/defaultfilters.py:922 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajta" -msgstr[2] "%(size)d bajtova" - -#: template/defaultfilters.py:924 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: template/defaultfilters.py:926 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: template/defaultfilters.py:928 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: template/defaultfilters.py:930 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: template/defaultfilters.py:932 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: utils/dateformat.py:73 -msgid "p.m." -msgstr "po p." - -#: utils/dateformat.py:74 -msgid "a.m." -msgstr "pre p." - -#: utils/dateformat.py:79 -msgid "PM" -msgstr "PM" - -#: utils/dateformat.py:80 -msgid "AM" -msgstr "AM" - -#: utils/dateformat.py:152 -msgid "midnight" -msgstr "ponoć" - -#: utils/dateformat.py:154 -msgid "noon" -msgstr "podne" - -#: utils/dates.py:7 -msgid "Monday" -msgstr "ponedeljak" - -#: utils/dates.py:8 -msgid "Tuesday" -msgstr "utorak" - -#: utils/dates.py:9 -msgid "Wednesday" -msgstr "sreda" - -#: utils/dates.py:10 -msgid "Thursday" -msgstr "četvrtak" - -#: utils/dates.py:11 -msgid "Friday" -msgstr "petak" - -#: utils/dates.py:12 -msgid "Saturday" -msgstr "subota" - -#: utils/dates.py:13 -msgid "Sunday" -msgstr "nedelja" - -#: utils/dates.py:16 -msgid "Mon" -msgstr "pon." - -#: utils/dates.py:17 -msgid "Tue" -msgstr "uto." - -#: utils/dates.py:18 -msgid "Wed" -msgstr "sre." - -#: utils/dates.py:19 -msgid "Thu" -msgstr "čet." - -#: utils/dates.py:20 -msgid "Fri" -msgstr "pet." - -#: utils/dates.py:21 -msgid "Sat" -msgstr "sub." - -#: utils/dates.py:22 -msgid "Sun" -msgstr "ned." - -#: utils/dates.py:25 -msgid "January" -msgstr "januar" - -#: utils/dates.py:26 -msgid "February" -msgstr "februar" - -#: utils/dates.py:27 -msgid "March" -msgstr "mart" - -#: utils/dates.py:28 -msgid "April" -msgstr "april" - -#: utils/dates.py:29 -msgid "May" -msgstr "maj" - -#: utils/dates.py:30 -msgid "June" -msgstr "jun" - -#: utils/dates.py:31 -msgid "July" -msgstr "jul" - -#: utils/dates.py:32 -msgid "August" -msgstr "avgust" - -#: utils/dates.py:33 -msgid "September" -msgstr "septembar" - -#: utils/dates.py:34 -msgid "October" -msgstr "oktobar" - -#: utils/dates.py:35 -msgid "November" -msgstr "novembar" - -#: utils/dates.py:36 -msgid "December" -msgstr "decembar" - -#: utils/dates.py:39 -msgid "jan" -msgstr "jan." - -#: utils/dates.py:40 -msgid "feb" -msgstr "feb." - -#: utils/dates.py:41 -msgid "mar" -msgstr "mar." - -#: utils/dates.py:42 -msgid "apr" -msgstr "apr." - -#: utils/dates.py:43 -msgid "may" -msgstr "maj." - -#: utils/dates.py:44 -msgid "jun" -msgstr "jun." - -#: utils/dates.py:45 -msgid "jul" -msgstr "jul." - -#: utils/dates.py:46 -msgid "aug" -msgstr "aug." - -#: utils/dates.py:47 -msgid "sep" -msgstr "sep." - -#: utils/dates.py:48 -msgid "oct" -msgstr "okt." - -#: utils/dates.py:49 -msgid "nov" -msgstr "nov." - -#: utils/dates.py:50 -msgid "dec" -msgstr "dec." - -#: utils/dates.py:53 -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -#: utils/dates.py:54 -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -#: utils/dates.py:55 -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -#: utils/dates.py:56 -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -#: utils/dates.py:57 -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -#: utils/dates.py:58 -msgctxt "abbrev. month" -msgid "June" -msgstr "Jun" - -#: utils/dates.py:59 -msgctxt "abbrev. month" -msgid "July" -msgstr "Jul" - -#: utils/dates.py:60 -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Avg." - -#: utils/dates.py:61 -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -#: utils/dates.py:62 -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -#: utils/dates.py:63 -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -#: utils/dates.py:64 -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -#: utils/dates.py:67 -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -#: utils/dates.py:68 -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -#: utils/dates.py:69 -msgctxt "alt. month" -msgid "March" -msgstr "Mart" - -#: utils/dates.py:70 -msgctxt "alt. month" -msgid "April" -msgstr "April" - -#: utils/dates.py:71 -msgctxt "alt. month" -msgid "May" -msgstr "Maj" - -#: utils/dates.py:72 -msgctxt "alt. month" -msgid "June" -msgstr "Jun" - -#: utils/dates.py:73 -msgctxt "alt. month" -msgid "July" -msgstr "Jul" - -#: utils/dates.py:74 -msgctxt "alt. month" -msgid "August" -msgstr "Avgust" - -#: utils/dates.py:75 -msgctxt "alt. month" -msgid "September" -msgstr "Septembar" - -#: utils/dates.py:76 -msgctxt "alt. month" -msgid "October" -msgstr "Oktobar" - -#: utils/dates.py:77 -msgctxt "alt. month" -msgid "November" -msgstr "Novembar" - -#: utils/dates.py:78 -msgctxt "alt. month" -msgid "December" -msgstr "Decembar" - -#: utils/ipv6.py:8 -msgid "This is not a valid IPv6 address." -msgstr "Ovo nije ispravna IPv6 adresa." - -#: utils/text.py:70 -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." - -#: utils/text.py:255 -msgid "or" -msgstr "ili" - -#. Translators: This string is used as a separator between list elements -#: utils/text.py:274 utils/timesince.py:135 -msgid ", " -msgstr "," - -#: utils/timesince.py:8 -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d godina" -msgstr[1] "%(num)d godine" -msgstr[2] "%(num)d godina" - -#: utils/timesince.py:9 -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesec" -msgstr[1] "%(num)d meseca" -msgstr[2] "%(num)d meseci" - -#: utils/timesince.py:10 -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nedelja" -msgstr[1] "%(num)d nedelje" -msgstr[2] "%(num)d nedelja" - -#: utils/timesince.py:11 -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dan" -msgstr[1] "%(num)d dana" -msgstr[2] "%(num)d dana" - -#: utils/timesince.py:12 -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d sat" -msgstr[1] "%(num)d sata" -msgstr[2] "%(num)d sati" - -#: utils/timesince.py:13 -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuta" -msgstr[2] "%(num)d minuta" - -#: views/csrf.py:29 -msgid "Forbidden" -msgstr "Zabranjeno" - -#: views/csrf.py:30 -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF verifikacija nije prošla. Zahtev odbijen." - -#: views/csrf.py:34 -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "Ova poruka je prikazana jer ovaj HTTPS sajt zahteva da \"Referer header\" bude poslat od strane vašeg internet pregledača, što trenutno nije slučaj. Pomenuto zaglavlje je potrebno iz bezbedonosnih razloga, da bi se osiguralo da vaš pregledač nije pod kontrolom trećih lica." - -#: views/csrf.py:40 -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "Ako ste podesili internet pregledač da ne šalje \"Referer\" zaglavlja, ponovo ih uključite, barem za ovaj sajt, ili za HTTPS konekcije, ili za \"same-origin\" zahteve." - -#: views/csrf.py:45 -msgid "" -"If you are using the tag or" -" including the “Referrer-Policy: no-referrer” header, please remove them. " -"The CSRF protection requires the “Referer” header to do strict referer " -"checking. If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "Ako koristite tag ili \"Referrer-Policy: no-referrer\" zaglavlje, molimo da ih uklonite. CSRF zaštita zahteva \"Referer\" zaglavlje da bi se obavila striktna \"referrer\" provera. Ukoliko vas brine privatnost, koristite alternative kao za linkove ka drugim sajtovima." - -#: views/csrf.py:54 -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "Ova poruka je prikazana jer ovaj sajt zahteva CSRF kuki kada se prosleđuju podaci iz formi. Ovaj kuki je potreban iz sigurnosnih razloga, da bi se osiguralo da vaš pretraživač nije pod kontrolom trećih lica." - -#: views/csrf.py:60 -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "Ako je vaš internet pregedač podešen da onemogući kolačiće, molimo da ih uključite, barem za ovaj sajt, ili za \"same-origin\" zahteve." - -#: views/csrf.py:66 -msgid "More information is available with DEBUG=True." -msgstr "Više informacija je dostupno sa DEBUG=True." - -#: views/generic/dates.py:44 -msgid "No year specified" -msgstr "Godina nije naznačena" - -#: views/generic/dates.py:64 views/generic/dates.py:115 -#: views/generic/dates.py:214 -msgid "Date out of range" -msgstr "Datum van opsega" - -#: views/generic/dates.py:94 -msgid "No month specified" -msgstr "Mesec nije naznačen" - -#: views/generic/dates.py:147 -msgid "No day specified" -msgstr "Dan nije naznačen" - -#: views/generic/dates.py:194 -msgid "No week specified" -msgstr "Nedelja nije naznačena" - -#: views/generic/dates.py:349 views/generic/dates.py:380 -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nedostupni objekti %(verbose_name_plural)s" - -#: views/generic/dates.py:652 -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because " -"%(class_name)s.allow_future is False." -msgstr "Opcija „future“ nije dostupna za „%(verbose_name_plural)s“ jer %(class_name)s.allow_future ima vrednost False." - -#: views/generic/dates.py:692 -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Neispravan datum \"%(datestr)s\" za format \"%(format)s\"" - -#: views/generic/detail.py:56 -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nijedan objekat klase %(verbose_name)s nije nađen datim upitom." - -#: views/generic/list.py:70 -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Stranica nije poslednja, niti može biti konvertovana u tip \"int\"." - -#: views/generic/list.py:77 -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Neispravna strana (%(page_number)s): %(message)s" - -#: views/generic/list.py:169 -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Prazna lista i „%(class_name)s.allow_empty“ ima vrednost False." - -#: views/static.py:48 -msgid "Directory indexes are not allowed here." -msgstr "Indeksi direktorijuma nisu dozvoljeni ovde." - -#: views/static.py:50 -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ ne postoji" - -#: views/static.py:67 views/templates/directory_index.html:8 -#: views/templates/directory_index.html:11 -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks direktorijuma %(directory)s" - -#: views/templates/default_urlconf.html:7 -#: views/templates/default_urlconf.html:220 -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacija je prošla uspešno. Čestitke!" - -#: views/templates/default_urlconf.html:206 -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "Pogledajte napomene uz izdanje za Đango %(version)s" - -#: views/templates/default_urlconf.html:221 -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file " -"and you have not configured any URLs." -msgstr "Ova strana je prikazana jer je DEBUG=True u vašim podešavanjima i niste konfigurisali nijedan URL." - -#: views/templates/default_urlconf.html:229 -msgid "Django Documentation" -msgstr "Đango dokumentacija" - -#: views/templates/default_urlconf.html:230 -msgid "Topics, references, & how-to’s" -msgstr "Teme, reference, & kako-da" - -#: views/templates/default_urlconf.html:238 -msgid "Tutorial: A Polling App" -msgstr "Uputstvo: aplikacija za glasanje" - -#: views/templates/default_urlconf.html:239 -msgid "Get started with Django" -msgstr "Počnite sa Đangom" - -#: views/templates/default_urlconf.html:247 -msgid "Django Community" -msgstr "Đango zajednica" - -#: views/templates/default_urlconf.html:248 -msgid "Connect, get help, or contribute" -msgstr "Povežite se, potražite pomoć ili dajte doprinos" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/formats.py deleted file mode 100644 index 0078895..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sr_Latn/formats.py +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y. H:i" -YEAR_MONTH_FORMAT = "F Y." -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.m.Y." -SHORT_DATETIME_FORMAT = "j.m.Y. H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y.", # '25.10.2006.' - "%d.%m.%y.", # '25.10.06.' - "%d. %m. %Y.", # '25. 10. 2006.' - "%d. %m. %y.", # '25. 10. 06.' - # "%d. %b %y.", # '25. Oct 06.' - # "%d. %B %y.", # '25. October 06.' - # "%d. %b '%y.", # '25. Oct '06.' - # "%d. %B '%y.", #'25. October '06.' - # "%d. %b %Y.", # '25. Oct 2006.' - # "%d. %B %Y.", # '25. October 2006.' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y. %H:%M:%S", # '25.10.2006. 14:30:59' - "%d.%m.%Y. %H:%M:%S.%f", # '25.10.2006. 14:30:59.000200' - "%d.%m.%Y. %H:%M", # '25.10.2006. 14:30' - "%d.%m.%y. %H:%M:%S", # '25.10.06. 14:30:59' - "%d.%m.%y. %H:%M:%S.%f", # '25.10.06. 14:30:59.000200' - "%d.%m.%y. %H:%M", # '25.10.06. 14:30' - "%d. %m. %Y. %H:%M:%S", # '25. 10. 2006. 14:30:59' - "%d. %m. %Y. %H:%M:%S.%f", # '25. 10. 2006. 14:30:59.000200' - "%d. %m. %Y. %H:%M", # '25. 10. 2006. 14:30' - "%d. %m. %y. %H:%M:%S", # '25. 10. 06. 14:30:59' - "%d. %m. %y. %H:%M:%S.%f", # '25. 10. 06. 14:30:59.000200' - "%d. %m. %y. %H:%M", # '25. 10. 06. 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index 060ef09..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index d2f455d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,1362 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Albin Larsson , 2022 -# Alex Nordlund , 2012 -# Anders Hovmöller , 2023 -# Anders Jonsson , 2022 -# Andreas Pelme , 2014,2021 -# Elias Johnstone , 2022 -# Gustaf Hansen , 2015 -# Jannis Leidel , 2011 -# Jonathan Lindén, 2015 -# Jörgen Olofsson, 2024 -# Ken Lewerentz, 2022 -# Jonathan Lindén, 2014 -# Mattias Hansson , 2016 -# Mattias Benjaminsson , 2011 -# Petter Strandmark , 2019 -# Rasmus Précenth , 2014 -# Samuel Linde , 2011 -# Thomas Lundqvist, 2013,2016 -# Tomas Lööw , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Jörgen Olofsson, 2024\n" -"Language-Team: Swedish (http://app.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabiska" - -msgid "Algerian Arabic" -msgstr "Algerisk arabiska" - -msgid "Asturian" -msgstr "Asturiska" - -msgid "Azerbaijani" -msgstr "Azerbajdzjanska" - -msgid "Bulgarian" -msgstr "Bulgariska" - -msgid "Belarusian" -msgstr "Vitryska" - -msgid "Bengali" -msgstr "Bengaliska" - -msgid "Breton" -msgstr "Bretonska" - -msgid "Bosnian" -msgstr "Bosniska" - -msgid "Catalan" -msgstr "Katalanska" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdiska (Sorani)" - -msgid "Czech" -msgstr "Tjeckiska" - -msgid "Welsh" -msgstr "Walesiska" - -msgid "Danish" -msgstr "Danska" - -msgid "German" -msgstr "Tyska" - -msgid "Lower Sorbian" -msgstr "Lågsorbiska" - -msgid "Greek" -msgstr "Grekiska" - -msgid "English" -msgstr "Engelska" - -msgid "Australian English" -msgstr "Australisk engelska" - -msgid "British English" -msgstr "Brittisk engelska" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanska" - -msgid "Argentinian Spanish" -msgstr "Argentinsk spanska" - -msgid "Colombian Spanish" -msgstr "Colombiansk spanska" - -msgid "Mexican Spanish" -msgstr "Mexikansk spanska" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguansk spanska" - -msgid "Venezuelan Spanish" -msgstr "Spanska (Venezuela)" - -msgid "Estonian" -msgstr "Estländska" - -msgid "Basque" -msgstr "Baskiska" - -msgid "Persian" -msgstr "Persiska" - -msgid "Finnish" -msgstr "Finska" - -msgid "French" -msgstr "Franska" - -msgid "Frisian" -msgstr "Frisiska" - -msgid "Irish" -msgstr "Irländska" - -msgid "Scottish Gaelic" -msgstr "Skotsk gäliska" - -msgid "Galician" -msgstr "Galisiska" - -msgid "Hebrew" -msgstr "Hebreiska" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatiska" - -msgid "Upper Sorbian" -msgstr "Högsorbiska" - -msgid "Hungarian" -msgstr "Ungerska" - -msgid "Armenian" -msgstr "Armeniska" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesiska" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Isländska" - -msgid "Italian" -msgstr "Italienska" - -msgid "Japanese" -msgstr "Japanska" - -msgid "Georgian" -msgstr "Georgiska" - -msgid "Kabyle" -msgstr "Kabyliska" - -msgid "Kazakh" -msgstr "Kazakiska" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreanska" - -msgid "Kyrgyz" -msgstr "Kirgiziska" - -msgid "Luxembourgish" -msgstr "Luxemburgiska" - -msgid "Lithuanian" -msgstr "Lettiska" - -msgid "Latvian" -msgstr "Lettiska" - -msgid "Macedonian" -msgstr "Makedonska" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongoliska" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malajiska" - -msgid "Burmese" -msgstr "Burmesiska" - -msgid "Norwegian Bokmål" -msgstr "Norskt Bokmål" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Holländska" - -msgid "Norwegian Nynorsk" -msgstr "Norska (nynorsk)" - -msgid "Ossetic" -msgstr "Ossetiska" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polska" - -msgid "Portuguese" -msgstr "Portugisiska" - -msgid "Brazilian Portuguese" -msgstr "Brasiliensk portugisiska" - -msgid "Romanian" -msgstr "Rumänska" - -msgid "Russian" -msgstr "Ryska" - -msgid "Slovak" -msgstr "Slovakiska" - -msgid "Slovenian" -msgstr "Slovenska" - -msgid "Albanian" -msgstr "Albanska" - -msgid "Serbian" -msgstr "Serbiska" - -msgid "Serbian Latin" -msgstr "Serbiska (latin)" - -msgid "Swedish" -msgstr "Svenska" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamilska" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tadzjikiska" - -msgid "Thai" -msgstr "Thailändska" - -msgid "Turkmen" -msgstr "Turkmeniska" - -msgid "Turkish" -msgstr "Turkiska" - -msgid "Tatar" -msgstr "Tatariska" - -msgid "Udmurt" -msgstr "Udmurtiska" - -msgid "Uyghur" -msgstr "Uiguriska" - -msgid "Ukrainian" -msgstr "Ukrainska" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbekiska" - -msgid "Vietnamese" -msgstr "Vietnamesiska" - -msgid "Simplified Chinese" -msgstr "Förenklad Kinesiska" - -msgid "Traditional Chinese" -msgstr "Traditionell Kinesiska" - -msgid "Messages" -msgstr "Meddelanden" - -msgid "Site Maps" -msgstr "Sidkartor" - -msgid "Static Files" -msgstr "Statiska filer" - -msgid "Syndication" -msgstr "Syndikering" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Sidnumret är inte ett heltal" - -msgid "That page number is less than 1" -msgstr "Sidnumret är mindre än 1" - -msgid "That page contains no results" -msgstr "Sidan innehåller inga resultat" - -msgid "Enter a valid value." -msgstr "Fyll i ett giltigt värde." - -msgid "Enter a valid domain name." -msgstr "Fyll i ett giltigt domännamn." - -msgid "Enter a valid URL." -msgstr "Fyll i en giltig URL." - -msgid "Enter a valid integer." -msgstr "Fyll i ett giltigt heltal." - -msgid "Enter a valid email address." -msgstr "Fyll i en giltig e-postadress." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Fyll i en giltig 'slug', beståendes av bokstäver, siffror, understreck eller " -"bindestreck i Unicode." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Fyll i en giltig 'slug', beståendes av bokstäver, siffror, understreck eller " -"bindestreck i Unicode." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Fyll i en giltig %(protocol)s adress." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 eller IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Fyll enbart i siffror separerade med kommatecken." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Kontrollera att detta värde är %(limit_value)s (det är %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Kontrollera att detta värde är mindre än eller lika med %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Kontrollera att detta värde är större än eller lika med %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Kontrollera att detta värde är multipel av stegstorlek %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Kontrollera att detta värde är en multipel med stegstorlek %(limit_value)s, " -"med början från %(offset)s, t ex. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s och så vidare" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Säkerställ att detta värde åtminstone har %(limit_value)d tecken (den har " -"%(show_value)d)." -msgstr[1] "" -"Säkerställ att detta värde åtminstone har %(limit_value)d tecken (den har " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Säkerställ att detta värde har som mest %(limit_value)d tecken (den har " -"%(show_value)d)." -msgstr[1] "" -"Säkerställ att detta värde har som mest %(limit_value)d tecken (den har " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Fyll i ett tal." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Säkerställ att det inte är mer än %(max)s siffra totalt." -msgstr[1] "Säkerställ att det inte är mer än %(max)s siffror totalt." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Säkerställ att det inte är mer än %(max)s decimal." -msgstr[1] "Säkerställ att det inte är mer än %(max)s decimaler." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Säkerställ att det inte är mer än %(max)s siffra före decimalavskiljaren." -msgstr[1] "" -"Säkerställ att det inte är mer än %(max)s siffror före decimalavskiljaren." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Filändelsen “%(extension)s” är inte giltig. Giltiga filändelser är: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null-tecken är inte tillåtna." - -msgid "and" -msgstr "och" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s med samma %(field_labels)s finns redan." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Begränsningen “%(name)s” överträds." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Värdet %(value)r är inget giltigt alternativ." - -msgid "This field cannot be null." -msgstr "Detta fält får inte vara null." - -msgid "This field cannot be blank." -msgstr "Detta fält får inte vara tomt." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s med detta %(field_label)s finns redan." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s måste vara unikt för %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Fält av typ: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Värdet \"%(value)s\" måste vara antingen True eller False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Värdet ”%(value)s” måste vara antingen True, False eller None." - -msgid "Boolean (Either True or False)" -msgstr "Boolesk (antingen True eller False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Sträng (upp till %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Sträng (obegränsad)" - -msgid "Comma-separated integers" -msgstr "Komma-separerade heltal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” har ett ogiltigt datumformat. Det måste vara i formatet YYYY-MM-" -"DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Värdet “%(value)s” har det giltiga formatet (YYYY-MM-DD) men det är ett " -"ogiltigt datum." - -msgid "Date (without time)" -msgstr "Datum (utan tid)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” har ett ogiltigt format. Det måste vara i formatet YYYY-MM-DD HH:" -"MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” har det giltiga formatet (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"men ett ogiltigt datum/tid." - -msgid "Date (with time)" -msgstr "Datum (med tid)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Värdet “%(value)s” måste vara ett decimaltal." - -msgid "Decimal number" -msgstr "Decimaltal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” har ett ogiltigt format. Det måste vara i formatet [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Tidsspann" - -msgid "Email address" -msgstr "E-postadress" - -msgid "File path" -msgstr "Sökväg till fil" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Värdet \"%(value)s\" måste vara ett flyttal." - -msgid "Floating point number" -msgstr "Flyttal" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Värdet \"%(value)s\" måste vara ett heltal." - -msgid "Integer" -msgstr "Heltal" - -msgid "Big (8 byte) integer" -msgstr "Stort (8 byte) heltal" - -msgid "Small integer" -msgstr "Litet heltal" - -msgid "IPv4 address" -msgstr "IPv4-adress" - -msgid "IP address" -msgstr "IP-adress" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Värdet ”%(value)s” måste vara antingen None, True eller False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolesk (antingen True, False eller None)" - -msgid "Positive big integer" -msgstr "Positivt stort heltal" - -msgid "Positive integer" -msgstr "Positivt heltal" - -msgid "Positive small integer" -msgstr "Positivt litet heltal" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (upp till %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” har ett ogiltigt format. Det måste vara i formatet HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Värdet “%(value)s” har det giltiga formatet (HH:MM[:ss[.uuuuuu]]) men det är " -"en ogiltig tid." - -msgid "Time" -msgstr "Tid" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Rå binärdata" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” är inget giltigt UUID." - -msgid "Universally unique identifier" -msgstr "Globalt unik identifierare" - -msgid "File" -msgstr "Fil" - -msgid "Image" -msgstr "Bild" - -msgid "A JSON object" -msgstr "Ett JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Värdet måste vara giltig JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Modell %(model)s med %(field)s %(value)r finns inte." - -msgid "Foreign Key (type determined by related field)" -msgstr "Främmande nyckel (typ bestäms av relaterat fält)" - -msgid "One-to-one relationship" -msgstr "Ett-till-ett-samband" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s relation" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s relationer" - -msgid "Many-to-many relationship" -msgstr "Många-till-många-samband" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Detta fält måste fyllas i." - -msgid "Enter a whole number." -msgstr "Fyll i ett heltal." - -msgid "Enter a valid date." -msgstr "Fyll i ett giltigt datum." - -msgid "Enter a valid time." -msgstr "Fyll i en giltig tid." - -msgid "Enter a valid date/time." -msgstr "Fyll i ett giltigt datum/tid." - -msgid "Enter a valid duration." -msgstr "Fyll i ett giltigt tidsspann." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Antalet dagar måste vara mellan {min_days} och {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ingen fil skickades. Kontrollera kodningstypen i formuläret." - -msgid "No file was submitted." -msgstr "Ingen fil skickades." - -msgid "The submitted file is empty." -msgstr "Den skickade filen är tom." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Säkerställ att filnamnet har som mest %(max)d tecken (den har %(length)d)." -msgstr[1] "" -"Säkerställ att filnamnet har som mest %(max)d tecken (den har %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Var vänlig antingen skicka en fil eller markera kryssrutan för att rensa, " -"inte både och. " - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Ladda upp en giltig bild. Filen du laddade upp var antingen ingen bild eller " -"en korrupt bild." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Välj ett giltigt alternativ. %(value)s finns inte bland tillgängliga " -"alternativ." - -msgid "Enter a list of values." -msgstr "Fyll i en lista med värden." - -msgid "Enter a complete value." -msgstr "Fyll i ett fullständigt värde." - -msgid "Enter a valid UUID." -msgstr "Fyll i ett giltigt UUID." - -msgid "Enter a valid JSON." -msgstr "Fyll i ett giltigt JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Gömt fält %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-data saknas eller har manipulerats. Saknade fält: " -"%(field_names)s. Du kan behöva lämna in en felrapport om problemet kvarstår." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Vänligen skicka som mest %(num)d formulär." -msgstr[1] "Vänligen skicka som mest %(num)d formulär." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Vänligen skicka minst %(num)d formulär." -msgstr[1] "Vänligen skicka minst %(num)d formulär." - -msgid "Order" -msgstr "Sortering" - -msgid "Delete" -msgstr "Radera" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Var vänlig korrigera duplikatdata för %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Var vänlig korrigera duplikatdata för %(field)s, som måste vara unik." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Var vänlig korrigera duplikatdata för %(field_name)s som måste vara unik för " -"%(lookup)s i %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Vänligen korrigera duplikatvärdena nedan." - -msgid "The inline value did not match the parent instance." -msgstr "Värdet för InlineForeignKeyField motsvarade inte dess motpart." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Välj ett giltigt alternativ. Det valet finns inte bland tillgängliga " -"alternativ." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” är inte ett giltigt värde." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kunde inte tolkas i tidszonen %(current_timezone)s; det kan " -"vara en ogiltig eller tvetydigt tidpunkt." - -msgid "Clear" -msgstr "Rensa" - -msgid "Currently" -msgstr "Nuvarande" - -msgid "Change" -msgstr "Ändra" - -msgid "Unknown" -msgstr "Okänt" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nej" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nej,kanske" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d byte" - -#, python-format -msgid "%s KB" -msgstr "%s kB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "e.m." - -msgid "a.m." -msgstr "f.m." - -msgid "PM" -msgstr "FM" - -msgid "AM" -msgstr "EM" - -msgid "midnight" -msgstr "midnatt" - -msgid "noon" -msgstr "middag" - -msgid "Monday" -msgstr "måndag" - -msgid "Tuesday" -msgstr "tisdag" - -msgid "Wednesday" -msgstr "onsdag" - -msgid "Thursday" -msgstr "torsdag" - -msgid "Friday" -msgstr "fredag" - -msgid "Saturday" -msgstr "lördag" - -msgid "Sunday" -msgstr "söndag" - -msgid "Mon" -msgstr "mån" - -msgid "Tue" -msgstr "tis" - -msgid "Wed" -msgstr "ons" - -msgid "Thu" -msgstr "tors" - -msgid "Fri" -msgstr "fre" - -msgid "Sat" -msgstr "lör" - -msgid "Sun" -msgstr "sön" - -msgid "January" -msgstr "januari" - -msgid "February" -msgstr "februari" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "augusti" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb" - -msgctxt "abbrev. month" -msgid "March" -msgstr "mars" - -msgctxt "abbrev. month" -msgid "April" -msgstr "april" - -msgctxt "abbrev. month" -msgid "May" -msgstr "maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sep" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec" - -msgctxt "alt. month" -msgid "January" -msgstr "januari" - -msgctxt "alt. month" -msgid "February" -msgstr "februari" - -msgctxt "alt. month" -msgid "March" -msgstr "mars" - -msgctxt "alt. month" -msgid "April" -msgstr "april" - -msgctxt "alt. month" -msgid "May" -msgstr "maj" - -msgctxt "alt. month" -msgid "June" -msgstr "juni" - -msgctxt "alt. month" -msgid "July" -msgstr "juli" - -msgctxt "alt. month" -msgid "August" -msgstr "augusti" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "december" - -msgid "This is not a valid IPv6 address." -msgstr "Detta är inte en giltig IPv6 adress." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "eller" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d månad" -msgstr[1] "%(num)d månader" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d vecka" -msgstr[1] "%(num)d veckor" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagar" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d timme" -msgstr[1] "%(num)d timmar" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuter" - -msgid "Forbidden" -msgstr "Otillåtet" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verifikation misslyckades. Förfrågan avbröts." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Du ser detta meddelande eftersom denna HTTPS-sida kräver att en “Referer " -"header” skickas från din webbläsare, men ingen skickades. Denna header krävs " -"av säkerhetsskäl, för att säkerställa att din webbläsare inte kapats." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Om 'Referer' headers är inaktiverade i din webbläsare, vänligen återaktivera " -"dem, åtminstone för denna sida, eller för HTTPS-anslutningar eller för 'same-" -"origin'-förfrågningar." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Om du använder -taggen eller " -"har med ”Referrer-Policy: no-referrer”, ta bort dem. CSRF-skyddet kräver " -"”Referer” för att kunna göra sin strikta kontroll. Om du oroar dig över din " -"integritet, använd alternativ såsom för länkar " -"till tredjepart." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Du ser detta meddelande eftersom denna sida kräver en CSRF-cookie när " -"formulär skickas. Denna cookie krävs av säkerhetsskäl, för att säkerställa " -"att din webbläsare inte kapats." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Om cookies är inaktiverade i din webbläsare, vänligen återaktivera dem, " -"åtminstone för denna sida eller för “same-origin”-förfrågningar." - -msgid "More information is available with DEBUG=True." -msgstr "Mer information är tillgänglig med DEBUG=True." - -msgid "No year specified" -msgstr "Inget år angivet" - -msgid "Date out of range" -msgstr "Datum är utanför intervallet" - -msgid "No month specified" -msgstr "Ingen månad angiven" - -msgid "No day specified" -msgstr "Ingen dag angiven" - -msgid "No week specified" -msgstr "Ingen vecka angiven" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Inga %(verbose_name_plural)s är tillgängliga" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Framtida %(verbose_name_plural)s är inte tillgängliga eftersom " -"%(class_name)s.allow_future är False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ogiltig datumsträng “%(datestr)s” med givet format “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Hittade inga %(verbose_name)s som matchar frågan" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Sidan är inte 'last', och kan inte heller omvandlas till en int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ogiltig sida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tom lista och '%(class_name)s.allow_empty' är False." - -msgid "Directory indexes are not allowed here." -msgstr "Kataloglistningar är inte tillåtna här." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" finns inte" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Innehåll i %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Installationen lyckades! Grattis!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Visa release notes för Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Du ser den här sidan eftersom DEBUG=True i din settings-fil och du har inte " -"konfigurerat några URL:er." - -msgid "Django Documentation" -msgstr "Djangodokumentation" - -msgid "Topics, references, & how-to’s" -msgstr "Ämnen, referenser och how-to’s" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: En undersöknings-app" - -msgid "Get started with Django" -msgstr "Kom igång med Django" - -msgid "Django Community" -msgstr "Djangos community" - -msgid "Connect, get help, or contribute" -msgstr "Kontakta, begär hjälp eller bidra" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sv/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sv/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sv/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/sv/formats.py deleted file mode 100644 index 29e6317..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sv/formats.py +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y-m-d" -SHORT_DATETIME_FORMAT = "Y-m-d H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sw/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index 449d588..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index 273893d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,1221 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Machaku, 2015 -# Machaku, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Kiafrikaani" - -msgid "Arabic" -msgstr "Kiarabu" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Kiazerbaijani" - -msgid "Bulgarian" -msgstr "Kibulgaria" - -msgid "Belarusian" -msgstr "Kibelarusi" - -msgid "Bengali" -msgstr "Kibengali" - -msgid "Breton" -msgstr "Kibretoni" - -msgid "Bosnian" -msgstr "Kibosnia" - -msgid "Catalan" -msgstr "Kikatalani" - -msgid "Czech" -msgstr "Kicheki" - -msgid "Welsh" -msgstr "Kiweli" - -msgid "Danish" -msgstr "Kideni" - -msgid "German" -msgstr "Kijerumani" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Kigiriki" - -msgid "English" -msgstr "Kiingereza" - -msgid "Australian English" -msgstr "Kiingereza cha Kiaustalia" - -msgid "British English" -msgstr "Kiingereza cha Uingereza" - -msgid "Esperanto" -msgstr "Kiesperanto" - -msgid "Spanish" -msgstr "Kihispania" - -msgid "Argentinian Spanish" -msgstr "Kihispania cha Argentina" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Kihispania cha Mexico" - -msgid "Nicaraguan Spanish" -msgstr "Kihispania cha Nikaragua" - -msgid "Venezuelan Spanish" -msgstr "Kihispania cha Kivenezuela" - -msgid "Estonian" -msgstr "Kiestonia" - -msgid "Basque" -msgstr "Kibaskyue" - -msgid "Persian" -msgstr "Kipershia" - -msgid "Finnish" -msgstr "Kifini" - -msgid "French" -msgstr "Kifaransa" - -msgid "Frisian" -msgstr "Kifrisi" - -msgid "Irish" -msgstr "Kiairishi" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Kigalatia" - -msgid "Hebrew" -msgstr "Kiyahudi" - -msgid "Hindi" -msgstr "Kihindi" - -msgid "Croatian" -msgstr "Kikroeshia" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Kihangaria" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Kiindonesia" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Kiaiselandi" - -msgid "Italian" -msgstr "Kiitaliano" - -msgid "Japanese" -msgstr "Kijapani" - -msgid "Georgian" -msgstr "Kijiojia" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kizakhi" - -msgid "Khmer" -msgstr "Kihema" - -msgid "Kannada" -msgstr "Kikanada" - -msgid "Korean" -msgstr "Kikorea" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "Kilithuania" - -msgid "Latvian" -msgstr "Kilatvia" - -msgid "Macedonian" -msgstr "Kimacedonia" - -msgid "Malayalam" -msgstr "Kimalayalam" - -msgid "Mongolian" -msgstr "Kimongolia" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Kinepali" - -msgid "Dutch" -msgstr "Kidachi" - -msgid "Norwegian Nynorsk" -msgstr "Kinynorki cha Kinorwei" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Kipanjabi" - -msgid "Polish" -msgstr "Kipolishi" - -msgid "Portuguese" -msgstr "Kireno" - -msgid "Brazilian Portuguese" -msgstr "Kireno cha Kibrazili" - -msgid "Romanian" -msgstr "Kiromania" - -msgid "Russian" -msgstr "Kirusi" - -msgid "Slovak" -msgstr "Kislovakia" - -msgid "Slovenian" -msgstr "Kislovenia" - -msgid "Albanian" -msgstr "Kialbania" - -msgid "Serbian" -msgstr "Kiserbia" - -msgid "Serbian Latin" -msgstr "Kilatini cha Kiserbia" - -msgid "Swedish" -msgstr "Kiswidi" - -msgid "Swahili" -msgstr "Kiswahili" - -msgid "Tamil" -msgstr "Kitamili" - -msgid "Telugu" -msgstr "kitegulu" - -msgid "Thai" -msgstr "Kithai" - -msgid "Turkish" -msgstr "Kituruki" - -msgid "Tatar" -msgstr "Kitatari" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "Kiukreni" - -msgid "Urdu" -msgstr "Kiurdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Kivietinamu" - -msgid "Simplified Chinese" -msgstr "Kichina Kilichorahisishwa" - -msgid "Traditional Chinese" -msgstr "Kichina Asilia" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Ingiza thamani halali" - -msgid "Enter a valid URL." -msgstr "Ingiza URL halali." - -msgid "Enter a valid integer." -msgstr "Ingiza namba halali" - -msgid "Enter a valid email address." -msgstr "Ingiza anuani halali ya barua pepe" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Ingiza anuani halali ya IPV4" - -msgid "Enter a valid IPv6 address." -msgstr "Ingiza anuani halali ya IPV6" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Ingiza anuani halali za IPV4 au IPV6" - -msgid "Enter only digits separated by commas." -msgstr "Ingiza tarakimu zilizotenganishwa kwa koma tu." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Hakikisha thamani hii ni %(limit_value)s (ni %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Hakikisha thamani hii ni ndogo kuliko au sawa na %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Hakikisha thamani hii ni kubwa kuliko au sawa na %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Ingiza namba" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "na" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Uga huu hauwezi kuwa hauna kitu." - -msgid "This field cannot be blank." -msgstr "Uga huu hauwezi kuwa mtupu" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Tayari kuna %(field_label)s kwa %(model_name)s nyingine." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Uga wa aina %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Buleani (Aidha Kweli au Si kweli)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Tungo (hadi %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Inteja zilizotengwa kwa koma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Tarehe (bila ya muda)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Tarehe (pamoja na muda)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Namba ya desimali" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Anuani ya baruapepe" - -msgid "File path" -msgstr "Njia ya faili" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Namba ya `floating point`" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Inteja" - -msgid "Big (8 byte) integer" -msgstr "Inteja kubwa (baiti 8)" - -msgid "IPv4 address" -msgstr "anuani ya IPV4" - -msgid "IP address" -msgstr "anuani ya IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Buleani (Aidha kweli, Si kweli au Hukuna)" - -msgid "Positive integer" -msgstr "Inteja chanya" - -msgid "Positive small integer" -msgstr "Inteja chanya ndogo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slagi (hadi %(max_length)s)" - -msgid "Small integer" -msgstr "Inteja ndogo" - -msgid "Text" -msgstr "Maandishi" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Muda" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Faili" - -msgid "Image" -msgstr "Picha" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "'Foreign Key' (aina inapatikana kwa uga unaohusiana)" - -msgid "One-to-one relationship" -msgstr "Uhusiano wa moja-kwa-moja" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Uhusiano wa vingi-kwa-vingi" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Sehemu hii inahitajika" - -msgid "Enter a whole number." -msgstr "Ingiza namba kamili" - -msgid "Enter a valid date." -msgstr "Ingiza tarehe halali" - -msgid "Enter a valid time." -msgstr "Ingiza muda halali" - -msgid "Enter a valid date/time." -msgstr "Ingiza tarehe/muda halali" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Hakuna faili lililokusanywa. Angalia aina ya msimbo kwenye fomu." - -msgid "No file was submitted." -msgstr "Hakuna faili lililokusanywa." - -msgid "The submitted file is empty." -msgstr "Faili lililokusanywa ni tupu." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Tafadhali aidha kusanya faili au tiki kisanduku kilicho wazi, si yote." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Pakia picha halali. Faili ulilopakia lilikua aidha si picha au ni picha " -"iliyopotoshwa." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Chagua chaguo halali. %(value)s si moja kati ya machaguo yaliyopo." - -msgid "Enter a list of values." -msgstr "Ingiza orodha ya thamani" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Panga" - -msgid "Delete" -msgstr "Futa" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Tafadhali rekebisha data zilizojirudia kwa %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Tafadhali rekebisha data zilizojirudia kwa %(field)s, zinazotakiwa kuwa za " -"kipekee." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Tafadhali sahihisha data zilizojirudia kwa %(field_name)s ,uga huu ni lazima " -"kuwa wa pekee kwa %(lookup)s katika %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Tafadhali sahihisha thamani zilizojirudia hapo chini." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Chagua chaguo halali. Chaguo hilo si moja kati ya chaguzi halali" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Safisha" - -msgid "Currently" -msgstr "Kwa sasa" - -msgid "Change" -msgstr "Badili" - -msgid "Unknown" -msgstr "Haijulikani" - -msgid "Yes" -msgstr "Ndiyo" - -msgid "No" -msgstr "Hapana" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ndiyo,hapana,labda" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "baiti %(size)d" -msgstr[1] "baiti %(size)d" - -#, python-format -msgid "%s KB" -msgstr "KB %s" - -#, python-format -msgid "%s MB" -msgstr "MB %s" - -#, python-format -msgid "%s GB" -msgstr "GB %s" - -#, python-format -msgid "%s TB" -msgstr "TB %s" - -#, python-format -msgid "%s PB" -msgstr "PB %s" - -msgid "p.m." -msgstr "p.m" - -msgid "a.m." -msgstr "a.m" - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "usiku wa manane" - -msgid "noon" -msgstr "mchana" - -msgid "Monday" -msgstr "Jumatatu" - -msgid "Tuesday" -msgstr "Jumanne" - -msgid "Wednesday" -msgstr "Jumatano" - -msgid "Thursday" -msgstr "Alhamisi" - -msgid "Friday" -msgstr "Ijumaa" - -msgid "Saturday" -msgstr "Jumamosi" - -msgid "Sunday" -msgstr "Jumapili" - -msgid "Mon" -msgstr "Jtatu" - -msgid "Tue" -msgstr "Jnne" - -msgid "Wed" -msgstr "jtano" - -msgid "Thu" -msgstr "Alh" - -msgid "Fri" -msgstr "Ijmaa" - -msgid "Sat" -msgstr "Jmosi" - -msgid "Sun" -msgstr "Jpili" - -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Machi" - -msgid "April" -msgstr "Aprili" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Julai" - -msgid "August" -msgstr "Agosti" - -msgid "September" -msgstr "Septemba" - -msgid "October" -msgstr "Oktoba" - -msgid "November" -msgstr "Novemba" - -msgid "December" -msgstr "Disemba" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "machi" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mei" - -msgid "jun" -msgstr "Juni" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dis" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Machi" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprili" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julai" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dis." - -msgctxt "alt. month" -msgid "January" -msgstr "Januari" - -msgctxt "alt. month" -msgid "February" -msgstr "Februari" - -msgctxt "alt. month" -msgid "March" -msgstr "Machi" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprili" - -msgctxt "alt. month" -msgid "May" -msgstr "Mei" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Julai" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosti" - -msgctxt "alt. month" -msgid "September" -msgstr "Septemba" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktoba" - -msgctxt "alt. month" -msgid "November" -msgstr "Novemba" - -msgctxt "alt. month" -msgid "December" -msgstr "Disemba" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "au" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "mwaka %d" -msgstr[1] "miaka %d" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "mwezi %d" -msgstr[1] "miezi %d" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "wiki %d" -msgstr[1] "wiki %d" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "siku %d" -msgstr[1] "siku %d" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "saa %d" -msgstr[1] "saa %d" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "dakika %d" -msgstr[1] "dakika %d" - -msgid "0 minutes" -msgstr "dakika 0" - -msgid "Forbidden" -msgstr "Marufuku" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Maelezo zaidi yanapatikana ikiwa DEBUG=True" - -msgid "No year specified" -msgstr "Hakuna mwaka maalum uliotajwa" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Hakuna mwezi maalum uliotajwa" - -msgid "No day specified" -msgstr "Hakuna siku maalum iliyitajwa" - -msgid "No week specified" -msgstr "Hakuna wiki maalum iliyotajwa" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Hakujapatikana %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s kutoka wakati ujao haiwezekani kwani `" -"%(class_name)s.allow_future` ni `False`." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "hakuna %(verbose_name)s kulingana na ulizo" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ukurasa batili (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Sahirisi za saraka haziruhusiwi hapa." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Sahirisi ya %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ta/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index 1c684f8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ta/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index ad7bf71..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,1230 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "அரபிக்" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "பெங்காலி" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "" - -msgid "Catalan" -msgstr "" - -msgid "Czech" -msgstr "செக்" - -msgid "Welsh" -msgstr "வெல்ஸ்" - -msgid "Danish" -msgstr "டேனிஷ்" - -msgid "German" -msgstr "ஜெர்மன்" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "கிரேக்கம்" - -msgid "English" -msgstr "ஆங்கிலம்" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "ஸ்பானிஷ்" - -msgid "Argentinian Spanish" -msgstr "" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "" - -msgid "Basque" -msgstr "" - -msgid "Persian" -msgstr "" - -msgid "Finnish" -msgstr "பீனீஷ்" - -msgid "French" -msgstr "ப்ரென்சு" - -msgid "Frisian" -msgstr "" - -msgid "Irish" -msgstr "" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "கலீஷீயன்" - -msgid "Hebrew" -msgstr "ஹீப்ரு" - -msgid "Hindi" -msgstr "" - -msgid "Croatian" -msgstr "" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ஹங்கேரியன்" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ஐஸ்லான்டிக்" - -msgid "Italian" -msgstr "இத்தாலியன்" - -msgid "Japanese" -msgstr "ஜப்பானிய" - -msgid "Georgian" -msgstr "" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "" - -msgid "Korean" -msgstr "" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "" - -msgid "Latvian" -msgstr "" - -msgid "Macedonian" -msgstr "" - -msgid "Malayalam" -msgstr "" - -msgid "Mongolian" -msgstr "" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "டச்சு" - -msgid "Norwegian Nynorsk" -msgstr "" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "" - -msgid "Polish" -msgstr "" - -msgid "Portuguese" -msgstr "" - -msgid "Brazilian Portuguese" -msgstr "" - -msgid "Romanian" -msgstr "ரோமானியன்" - -msgid "Russian" -msgstr "ரஷ்யன்" - -msgid "Slovak" -msgstr "சுலோவாக்" - -msgid "Slovenian" -msgstr "ஸ்லோவேனியன்" - -msgid "Albanian" -msgstr "" - -msgid "Serbian" -msgstr "செர்பியன்" - -msgid "Serbian Latin" -msgstr "" - -msgid "Swedish" -msgstr "சுவிடிஷ்" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "தமிழ்" - -msgid "Telugu" -msgstr "" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "துருக்கிஷ்" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "உக்ரேனியன்" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "" - -msgid "Simplified Chinese" -msgstr "எளிய சீன மொழி" - -msgid "Traditional Chinese" -msgstr "மரபு சீன மொழி" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "" - -msgid "Enter a valid URL." -msgstr "" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "இங்கு எண்களை மட்டுமே எழுதவும் காமவாள் தனிமைபடுத்தவும் " - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "மற்றும்" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "இந்த புலம் காலியாக இருக்கக் கூடாது" - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "பூலியன் (சரி அல்லது தவறு)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "கமாவாள் பிரிக்கப்பட்ட முழு எண்" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "தேதி (நேரமில்லாமல்)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "தேதி (நேரமுடன்)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "தசம எண்கள்" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "" - -msgid "File path" -msgstr "கோப்புப் பாதை" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "முழு எண்" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "IP விலாசம்" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "இலக்கு முறை (சரி, தவறு அல்லது ஒன்றும் இல்லை)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "உரை" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "நேரம்" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "இந்த புலத்தில் மதிப்பு தேவை" - -msgid "Enter a whole number." -msgstr "முழு எண் மட்டுமே எழுதவும்" - -msgid "Enter a valid date." -msgstr "" - -msgid "Enter a valid time." -msgstr "" - -msgid "Enter a valid date/time." -msgstr "" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "அந்த பக்கத்தின் encoding வகையைப் பரிசோதிக்க.கோப்பு சமர்பிக்கப் பட்டவில்லை " - -msgid "No file was submitted." -msgstr "" - -msgid "The submitted file is empty." -msgstr "சமர்பிக்கப் பட்ட கோப்புக் காலியாக உள்ளது" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"முறையான படம் மட்டுமே பதிவேற்றம் செய்யவும். நீங்கள் பதிவேற்றம் செய்த கோப்பு படம் அள்ளாத " -"அல்லது கெட்டுப்போன கோப்பாகும்" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "" - -msgid "Delete" -msgstr "நீக்குக" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Currently" -msgstr "" - -msgid "Change" -msgstr "மாற்றுக" - -msgid "Unknown" -msgstr "தெரியாத" - -msgid "Yes" -msgstr "ஆம்" - -msgid "No" -msgstr "இல்லை" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ஆம்,இல்லை,இருக்கலாம்" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "" - -#, python-format -msgid "%s MB" -msgstr "" - -#, python-format -msgid "%s GB" -msgstr "" - -#, python-format -msgid "%s TB" -msgstr "" - -#, python-format -msgid "%s PB" -msgstr "" - -msgid "p.m." -msgstr "" - -msgid "a.m." -msgstr "" - -msgid "PM" -msgstr "" - -msgid "AM" -msgstr "" - -msgid "midnight" -msgstr "" - -msgid "noon" -msgstr "" - -msgid "Monday" -msgstr "திங்கள்" - -msgid "Tuesday" -msgstr "செவ்வாய்" - -msgid "Wednesday" -msgstr "புதன்" - -msgid "Thursday" -msgstr "வியாழன்" - -msgid "Friday" -msgstr "வெள்ளி" - -msgid "Saturday" -msgstr "சனி" - -msgid "Sunday" -msgstr "ஞாயிறு" - -msgid "Mon" -msgstr "" - -msgid "Tue" -msgstr "" - -msgid "Wed" -msgstr "" - -msgid "Thu" -msgstr "" - -msgid "Fri" -msgstr "" - -msgid "Sat" -msgstr "" - -msgid "Sun" -msgstr "" - -msgid "January" -msgstr "ஜனவரி" - -msgid "February" -msgstr "பிப்ரவரி" - -msgid "March" -msgstr "மார்ச்" - -msgid "April" -msgstr "ஏப்ரல்" - -msgid "May" -msgstr "மே" - -msgid "June" -msgstr "ஜூன்" - -msgid "July" -msgstr "ஜூலை" - -msgid "August" -msgstr "ஆகஸ்டு" - -msgid "September" -msgstr "செப்டம்பர்" - -msgid "October" -msgstr "அக்டோபர்" - -msgid "November" -msgstr "நவம்பர்" - -msgid "December" -msgstr "டிசம்பர்" - -msgid "jan" -msgstr "ஜன" - -msgid "feb" -msgstr "பிப்" - -msgid "mar" -msgstr "மார்" - -msgid "apr" -msgstr "ஏப்" - -msgid "may" -msgstr "மே" - -msgid "jun" -msgstr "ஜூன்" - -msgid "jul" -msgstr "ஜூலை" - -msgid "aug" -msgstr "ஆக" - -msgid "sep" -msgstr "செப்" - -msgid "oct" -msgstr "அக்" - -msgid "nov" -msgstr "நவ" - -msgid "dec" -msgstr "டிச" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -msgctxt "abbrev. month" -msgid "March" -msgstr "மார்ச்" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ஏப்ரல்" - -msgctxt "abbrev. month" -msgid "May" -msgstr "மே" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ஜூன்" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ஜூலை" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -msgctxt "alt. month" -msgid "January" -msgstr "ஜனவரி" - -msgctxt "alt. month" -msgid "February" -msgstr "பிப்ரவரி" - -msgctxt "alt. month" -msgid "March" -msgstr "மார்ச்" - -msgctxt "alt. month" -msgid "April" -msgstr "ஏப்ரல்" - -msgctxt "alt. month" -msgid "May" -msgstr "மே" - -msgctxt "alt. month" -msgid "June" -msgstr "ஜூன்" - -msgctxt "alt. month" -msgid "July" -msgstr "ஜூலை" - -msgctxt "alt. month" -msgid "August" -msgstr "ஆகஸ்டு" - -msgctxt "alt. month" -msgid "September" -msgstr "செப்டம்பர்" - -msgctxt "alt. month" -msgid "October" -msgstr "அக்டோபர்" - -msgctxt "alt. month" -msgid "November" -msgstr "நவம்பர்" - -msgctxt "alt. month" -msgid "December" -msgstr "டிசம்பர்" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "" - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ta/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ta/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ta/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ta/formats.py deleted file mode 100644 index d023608..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ta/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F, Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M, Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -# DECIMAL_SEPARATOR = -# THOUSAND_SEPARATOR = -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/te/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index 1366ff2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/te/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index 168ffa4..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,1233 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# bhaskar teja yerneni , 2011 -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# ప్రవీణ్ ఇళ్ళ , 2013 -# వీవెన్ , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "ఆఫ్రికాన్స్" - -msgid "Arabic" -msgstr "ఆరబిక్" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "అజేర్బైజని " - -msgid "Bulgarian" -msgstr "బల్గేరియన్" - -msgid "Belarusian" -msgstr "బెలారషియన్" - -msgid "Bengali" -msgstr "బెంగాలీ" - -msgid "Breton" -msgstr "బ్రిటన్" - -msgid "Bosnian" -msgstr "బోస్నియన్" - -msgid "Catalan" -msgstr "కాటలాన్" - -msgid "Czech" -msgstr "ఛెక్" - -msgid "Welsh" -msgstr "వెల్ష్" - -msgid "Danish" -msgstr "డానిష్" - -msgid "German" -msgstr "జెర్మన్" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "గ్రీక్" - -msgid "English" -msgstr "ఆంగ్లం" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "బ్రిటీష్ ఆంగ్లం" - -msgid "Esperanto" -msgstr "ఎస్పరాంటో" - -msgid "Spanish" -msgstr "స్పానిష్" - -msgid "Argentinian Spanish" -msgstr "అర్జెంటీనా స్పానిష్" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "మెక్షికన్ స్పానిష్ " - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "వెనుజులా స్పానిష్" - -msgid "Estonian" -msgstr "ఎస్టొనియన్" - -msgid "Basque" -msgstr "బాస్క్" - -msgid "Persian" -msgstr "పారసీ" - -msgid "Finnish" -msgstr "ఫీన్నిష్" - -msgid "French" -msgstr "ఫ్రెంచ్" - -msgid "Frisian" -msgstr "ఫ్రిసియన్" - -msgid "Irish" -msgstr "ఐరిష్" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "గలిసియన్" - -msgid "Hebrew" -msgstr "హీబ్రూ" - -msgid "Hindi" -msgstr "హిందీ" - -msgid "Croatian" -msgstr "క్రొయేషియన్" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "హంగేరియన్" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "ఇంటర్లింగ్వా" - -msgid "Indonesian" -msgstr "ఇండోనేషియన్" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ఐస్లాండిక్" - -msgid "Italian" -msgstr "ఇటాలియవ్" - -msgid "Japanese" -msgstr "జపనీ" - -msgid "Georgian" -msgstr "జార్జియన్" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "కజఖ్" - -msgid "Khmer" -msgstr "ఖ్మెర్" - -msgid "Kannada" -msgstr "కన్నడ" - -msgid "Korean" -msgstr "కొరియన్" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "లగ్జెంబర్గిష్" - -msgid "Lithuanian" -msgstr "లిథుయేనియన్" - -msgid "Latvian" -msgstr "లాత్వియన్" - -msgid "Macedonian" -msgstr "మెసిడోనియన్" - -msgid "Malayalam" -msgstr "మలయాళం" - -msgid "Mongolian" -msgstr "మంగోలియన్" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "బర్మీస్" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "నేపాలీ" - -msgid "Dutch" -msgstr "డచ్" - -msgid "Norwegian Nynorsk" -msgstr "నోర్వేగియన్ న్య్నోర్స్క్ " - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "పంజాబీ" - -msgid "Polish" -msgstr "పొలిష్" - -msgid "Portuguese" -msgstr "పోర్చుగీస్" - -msgid "Brazilian Portuguese" -msgstr "బ్రజీలియన్ పోర్చుగీస్" - -msgid "Romanian" -msgstr "రొమానియన్" - -msgid "Russian" -msgstr "రష్యన్" - -msgid "Slovak" -msgstr "స్లొవాక్" - -msgid "Slovenian" -msgstr "స్లొవానియన్" - -msgid "Albanian" -msgstr "అల్బేనియన్" - -msgid "Serbian" -msgstr "సెర్బియన్" - -msgid "Serbian Latin" -msgstr "సెర్బియన్ లాటిన్" - -msgid "Swedish" -msgstr "స్వీడిష్" - -msgid "Swahili" -msgstr "స్వాహిలి" - -msgid "Tamil" -msgstr "తమిళం" - -msgid "Telugu" -msgstr "తెలుగు" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "థాయి" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "టర్కిష్" - -msgid "Tatar" -msgstr "టటర్" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ఉక్రేనియన్" - -msgid "Urdu" -msgstr "ఉర్దూ" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "వియెత్నామీ" - -msgid "Simplified Chinese" -msgstr "సరళ చైనీ" - -msgid "Traditional Chinese" -msgstr "సాంప్రదాయ చైనీ" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "సరైన విలువని ఇవ్వండి." - -msgid "Enter a valid URL." -msgstr "సరైన URL ఇవ్వండి." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "దయచేసి సరైన ఈమెయిల్ చిరునామాను ప్రవేశపెట్టండి." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "దయచేసి సరైన IPv4 అడ్రస్ ఇవ్వండి" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "కామాల తో అంకెలు విడడీసి ఇవ్వండి " - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"దయచేసి దీని విలువ %(limit_value)s గ ఉండేట్లు చూసుకొనుము. ( మీరు సమర్పించిన విలువ " -"%(show_value)s )" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "దయచేసి దీని విలువ %(limit_value)s కు సమానముగా లేక తక్కువగా ఉండేట్లు చూసుకొనుము." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "దయచేసి దీని విలువ %(limit_value)s కు సమానముగా లేక ఎక్కువగా ఉండేట్లు చూసుకొనుము." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "దయచేసి పూర్ణ సంఖ్య ఇవ్వండి" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "మరియు" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "ఈ ఫీల్డ్ కాళీగా ఉందకూడడు " - -msgid "This field cannot be blank." -msgstr "ఈ ఖాళీని తప్పనిసరిగా పూరించాలి" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "బూలియన్ (అవునా లేక కాదా)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "పదబంధం (గరిష్ఠం %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "కామా తో విడడీసిన సంఖ్య" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "తేదీ (సమయం లేకుండా)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "తేది (సమయం తో)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "దశగణసంఖ్య" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "ఈమెయిలు చిరునామా" - -msgid "File path" -msgstr "ఫైల్ పాత్" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "పూర్ణసంఖ్య" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "ఐపీ చిరునామా" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "పాఠ్యం" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "సమయం" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "దస్త్రం" - -msgid "Image" -msgstr "బొమ్మ" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "ఈ ఫీల్డ్ అవసరము" - -msgid "Enter a whole number." -msgstr "పూర్ణ సంఖ్య ఇవ్వండి" - -msgid "Enter a valid date." -msgstr "దయచేసి సరైన తేది ఇవ్వండి." - -msgid "Enter a valid time." -msgstr "దయచేసి సరైన సమయం ఇవ్వండి." - -msgid "Enter a valid date/time." -msgstr "దయచేసి సరైన తెది/సమయం ఇవ్వండి." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -msgid "No file was submitted." -msgstr "ఫైలు సమర్పించబడలేదు." - -msgid "The submitted file is empty." -msgstr "మీరు సమర్పించిన ఫైల్ కాళీగా ఉంది " - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "సరైన విలువల జాబితాను ఇవ్వండి." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "అంతరము" - -msgid "Delete" -msgstr "తొలగించు" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "దయచేసి %(field)s యొక్క నకలు విలువను సరిదిద్దుకోండి." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "దయచేసి %(field)s యొక్క నకలు విలువను సరిదిద్దుకోండి. దీని విలువ అద్వితీయమయినది " - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "దయచేసి క్రింద ఉన్న నకలు విలువను సరిదిద్దుకోండి." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Currently" -msgstr "ప్రస్తుతము " - -msgid "Change" -msgstr "మార్చు" - -msgid "Unknown" -msgstr "తెలియనది" - -msgid "Yes" -msgstr "అవును" - -msgid "No" -msgstr "కాదు" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "అవును,కాదు,ఏమొ" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d బైటు" -msgstr[1] "%(size)d బైట్లు" - -#, python-format -msgid "%s KB" -msgstr "%s కిబై" - -#, python-format -msgid "%s MB" -msgstr "%s మెబై" - -#, python-format -msgid "%s GB" -msgstr "%s గిబై" - -#, python-format -msgid "%s TB" -msgstr "" - -#, python-format -msgid "%s PB" -msgstr "" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "అర్ధరాత్రి" - -msgid "noon" -msgstr "మధ్యాహ్నం" - -msgid "Monday" -msgstr "సోమవారం" - -msgid "Tuesday" -msgstr "మంగళవారం" - -msgid "Wednesday" -msgstr "బుధవారం" - -msgid "Thursday" -msgstr "గురువారం" - -msgid "Friday" -msgstr "శుక్రవారం" - -msgid "Saturday" -msgstr "శనివారం" - -msgid "Sunday" -msgstr "ఆదివారం" - -msgid "Mon" -msgstr "సోమ" - -msgid "Tue" -msgstr "మంగళ" - -msgid "Wed" -msgstr "బుధ" - -msgid "Thu" -msgstr "గురు" - -msgid "Fri" -msgstr "శుక్ర" - -msgid "Sat" -msgstr "శని" - -msgid "Sun" -msgstr "ఆది" - -msgid "January" -msgstr "జనవరి" - -msgid "February" -msgstr "ఫిబ్రవరి" - -msgid "March" -msgstr "మార్చి" - -msgid "April" -msgstr "ఎప్రిల్" - -msgid "May" -msgstr "మే" - -msgid "June" -msgstr "జూన్" - -msgid "July" -msgstr "జులై" - -msgid "August" -msgstr "ఆగష్టు" - -msgid "September" -msgstr "సెప్టెంబర్" - -msgid "October" -msgstr "అక్టోబర్" - -msgid "November" -msgstr "నవంబర్" - -msgid "December" -msgstr "డిసెంబర్" - -msgid "jan" -msgstr "జన" - -msgid "feb" -msgstr "ఫిబ్ర" - -msgid "mar" -msgstr "మార్చి" - -msgid "apr" -msgstr "ఎప్రి" - -msgid "may" -msgstr "మే" - -msgid "jun" -msgstr "జూన్" - -msgid "jul" -msgstr "జూలై" - -msgid "aug" -msgstr "ఆగ" - -msgid "sep" -msgstr "సెప్టెం" - -msgid "oct" -msgstr "అక్టో" - -msgid "nov" -msgstr "నవం" - -msgid "dec" -msgstr "డిసెం" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "జన." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ఫిబ్ర." - -msgctxt "abbrev. month" -msgid "March" -msgstr "మార్చి" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ఏప్రి." - -msgctxt "abbrev. month" -msgid "May" -msgstr "మే" - -msgctxt "abbrev. month" -msgid "June" -msgstr "జూన్" - -msgctxt "abbrev. month" -msgid "July" -msgstr "జూలై" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ఆగ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "సెప్టెం." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "అక్టో." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "నవం." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "డిసెం." - -msgctxt "alt. month" -msgid "January" -msgstr "జనవరి" - -msgctxt "alt. month" -msgid "February" -msgstr "ఫిబ్రవరి" - -msgctxt "alt. month" -msgid "March" -msgstr "మార్చి" - -msgctxt "alt. month" -msgid "April" -msgstr "ఏప్రిల్" - -msgctxt "alt. month" -msgid "May" -msgstr "మే" - -msgctxt "alt. month" -msgid "June" -msgstr "జూన్" - -msgctxt "alt. month" -msgid "July" -msgstr "జూలై" - -msgctxt "alt. month" -msgid "August" -msgstr "ఆగస్ట్" - -msgctxt "alt. month" -msgid "September" -msgstr "సెప్టెంబర్" - -msgctxt "alt. month" -msgid "October" -msgstr "అక్టోబర్" - -msgctxt "alt. month" -msgid "November" -msgstr "నవంబర్" - -msgctxt "alt. month" -msgid "December" -msgstr "డిసెంబర్" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "లేదా" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/te/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/te/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/te/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/te/formats.py deleted file mode 100644 index bb7f2d1..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/te/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -# DECIMAL_SEPARATOR = -# THOUSAND_SEPARATOR = -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index e93dc87..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index 05a4ca9..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,1299 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2020 -# Surush Sufiew , 2020 -# Siroj Sufiew , 2020 -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-30 18:50+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Ҳолландӣ" - -msgid "Arabic" -msgstr "Арабӣ" - -msgid "Algerian Arabic" -msgstr "Арабӣ" - -msgid "Asturian" -msgstr "Астурӣ" - -msgid "Azerbaijani" -msgstr "Озарбойҷонӣ" - -msgid "Bulgarian" -msgstr "Булғорӣ" - -msgid "Belarusian" -msgstr "Белорусӣ" - -msgid "Bengali" -msgstr "Бенгалӣ" - -msgid "Breton" -msgstr "Бретонӣ" - -msgid "Bosnian" -msgstr "Боснӣ" - -msgid "Catalan" -msgstr "Каталанӣ" - -msgid "Czech" -msgstr "Чехӣ" - -msgid "Welsh" -msgstr "Уэлсӣ" - -msgid "Danish" -msgstr "Даниягӣ" - -msgid "German" -msgstr "Олмонӣ" - -msgid "Lower Sorbian" -msgstr "Сербиягӣ" - -msgid "Greek" -msgstr "Юнонӣ" - -msgid "English" -msgstr "Англисӣ" - -msgid "Australian English" -msgstr "Англисии австралиёӣ" - -msgid "British English" -msgstr "Ангилисии бритониёӣ" - -msgid "Esperanto" -msgstr "Эсперантоӣ" - -msgid "Spanish" -msgstr "Испанӣ" - -msgid "Argentinian Spanish" -msgstr "Испании аргентиноӣ" - -msgid "Colombian Spanish" -msgstr "Испании колумбигӣ" - -msgid "Mexican Spanish" -msgstr "Испании мексикоӣ" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуанский испанский" - -msgid "Venezuelan Spanish" -msgstr "Испании венесуэлӣ" - -msgid "Estonian" -msgstr "Эстонӣ" - -msgid "Basque" -msgstr "Баскувӣ" - -msgid "Persian" -msgstr "Форсӣ" - -msgid "Finnish" -msgstr "Финикӣ" - -msgid "French" -msgstr "Фаронсавӣ" - -msgid "Frisian" -msgstr "Фризӣ" - -msgid "Irish" -msgstr "Ирландӣ" - -msgid "Scottish Gaelic" -msgstr "Шотландӣ" - -msgid "Galician" -msgstr "" - -msgid "Hebrew" -msgstr "Ивритӣ" - -msgid "Hindi" -msgstr "Ҳиндӣ" - -msgid "Croatian" -msgstr "Хорватӣ" - -msgid "Upper Sorbian" -msgstr "Себриягӣ" - -msgid "Hungarian" -msgstr "" - -msgid "Armenian" -msgstr "Арманӣ" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Индонезӣ" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Исландӣ" - -msgid "Italian" -msgstr "Итолиёвӣ" - -msgid "Japanese" -msgstr "Японӣ" - -msgid "Georgian" -msgstr "Грузӣ" - -msgid "Kabyle" -msgstr "Кабилӣ" - -msgid "Kazakh" -msgstr "Қазоқӣ" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "" - -msgid "Korean" -msgstr "Кореӣ" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Люксембургӣ" - -msgid "Lithuanian" -msgstr "Литвигӣ" - -msgid "Latvian" -msgstr "Латвигӣ" - -msgid "Macedonian" -msgstr "Македонӣ" - -msgid "Malayalam" -msgstr "" - -msgid "Mongolian" -msgstr "Монголӣ" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "Норвежский (Букмол)" - -msgid "Nepali" -msgstr "Непалӣ" - -msgid "Dutch" -msgstr "Голландӣ" - -msgid "Norwegian Nynorsk" -msgstr "Норвегӣ" - -msgid "Ossetic" -msgstr "Осетинӣ" - -msgid "Punjabi" -msgstr "Панҷобӣ" - -msgid "Polish" -msgstr "Полякӣ" - -msgid "Portuguese" -msgstr "Португалӣ" - -msgid "Brazilian Portuguese" -msgstr "Португалии бразилиёгӣ" - -msgid "Romanian" -msgstr "Руминӣ" - -msgid "Russian" -msgstr "Руссӣ" - -msgid "Slovak" -msgstr "Словакӣ" - -msgid "Slovenian" -msgstr "Словенӣ" - -msgid "Albanian" -msgstr "Албанӣ" - -msgid "Serbian" -msgstr "Сербӣ" - -msgid "Serbian Latin" -msgstr "Сербӣ" - -msgid "Swedish" -msgstr "Шведӣ" - -msgid "Swahili" -msgstr "Суахили" - -msgid "Tamil" -msgstr "Тамилӣ" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Тайский" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Туркӣ" - -msgid "Tatar" -msgstr "Тоторӣ" - -msgid "Udmurt" -msgstr "Удмуртӣ" - -msgid "Ukrainian" -msgstr "Украинӣ" - -msgid "Urdu" -msgstr "Урдуӣ" - -msgid "Uzbek" -msgstr "Узбекӣ" - -msgid "Vietnamese" -msgstr "Вэтнамӣ" - -msgid "Simplified Chinese" -msgstr "Хитоӣ" - -msgid "Traditional Chinese" -msgstr "Хитоӣ" - -msgid "Messages" -msgstr "Маълумот" - -msgid "Site Maps" -msgstr "Харитаи сайт" - -msgid "Static Files" -msgstr "Файлҳои статикӣ" - -msgid "Syndication" -msgstr "Тасмаи хабарҳо" - -msgid "That page number is not an integer" -msgstr "Рақами саҳифа бояд адади натуралӣ бошад" - -msgid "That page number is less than 1" -msgstr "Рақами саҳифа камтар аз 1" - -msgid "That page contains no results" -msgstr "Саҳифа холӣ аст" - -msgid "Enter a valid value." -msgstr "Қимматро дуруст ворид созед." - -msgid "Enter a valid URL." -msgstr "Суроға(URL)-ро дуруст ворид созед." - -msgid "Enter a valid integer." -msgstr "Ададро дуруст ворид созед." - -msgid "Enter a valid email address." -msgstr "Суроғаи почтаи электрониро дуруст ворид созед." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Қимати “slug”-ро дуруст ворид созед, бояд аз ҳарфҳо (“a-z ва A-Z”), рақамҳо, " -"зердефисҳо(_) ва дефисҳо иборат бошад." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Қимати “slug”-ро дуруст ворид созед, бояд аз Unicode-ҳарфҳо (“a-z ва A-Z”), " -"рақамҳо, зердефисҳо(_) ва дефисҳо иборат бошад." - -msgid "Enter a valid IPv4 address." -msgstr "Шакли дурусти IPv4-суроғаро ворид созед." - -msgid "Enter a valid IPv6 address." -msgstr "Шакли ҳақиқии IPv4-суроғаро ворид кунед." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Шакли ҳақиқии IPv4 ё IPv6 -суроғаро ворид кунед." - -msgid "Enter only digits separated by commas." -msgstr "Рақамҳои бо вергул шудокардашударо ворид созед." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Боварӣ ҳосил кунед, ки қиммати — %(limit_value)s (ҳоло шакли — " -"%(show_value)s -ро дорад)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Боварӣ ҳосил кунед, ки ин қиммат хурд ё баробар аст ба %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Боварӣ ҳосил кунед, ки ин қиммат калон ё баробар аст ба %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Ададро ворид созед." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Маълумот символӣ мамнӯъро дар бар мегирад: 0-байт" - -msgid "and" -msgstr "ва" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" -"%(model_name)s бо ин гуна майдонӣ қиматдор %(field_labels)s алакай вуҷуд " -"дорад." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Қимати %(value)r дар байни вариантҳои омадашуда вуҷуд надорад." - -msgid "This field cannot be null." -msgstr "Ин майдон наметавонад қимати NULL дошта бошад." - -msgid "This field cannot be blank." -msgstr "Ин майдон наметавонад холӣ бошад." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s бо ин гуна %(field_label)s алакай вуҷуд дорад." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Қимат дар майдони «%(field_label)s» бояд барои фрагменти«%(lookup_type)s» " -"ягона бошад, санаҳо барои майдон %(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Майдони намуди %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Қимати “%(value)s” бояд True ё False бошад." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Қимати “%(value)s” бояд True, False ё None бошад." - -msgid "Boolean (Either True or False)" -msgstr "Мантиқан (True ё False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Сатр (то %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Яклухт, бо вергул ҷудокардашуда" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "“%(value)s” шакли нодуруст дорад. Шакли дуруст: сол.моҳ.рӯз, аст" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "“%(value)s” шакли дуруст (сол.моҳ.рӯз) дорад, аммо сана нодуруст аст" - -msgid "Date (without time)" -msgstr "Сана (бе ишораи вақт)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” шакли нодуруст дорад. Шакли дуруст: сол.моҳ.рӯз соат.дақ[:сония[." -"uuuuuu]][TZ] аст" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” шакли дуруст дорад (сол.моҳ.рӯз соат.дақ[:сония[.uuuuuu]][TZ]), " -"аммо 'сана/вақт'' нодуруст аст" - -msgid "Date (with time)" -msgstr "Сана (бо ишораи вақт)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” бояд адади даҳӣ бошад" - -msgid "Decimal number" -msgstr "Адади 'даҳӣ' ." - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” шакли нодуруст дорад. Шакли дуруст [рӯз] [[соат:]дақ:]сония[." -"uuuuuu]" - -msgid "Duration" -msgstr "Давомнокӣ" - -msgid "Email address" -msgstr "Суроғаи почтаи электронӣ" - -msgid "File path" -msgstr "Суроғаи файл" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Қимати “%(value)s” бояд бутун бошад" - -msgid "Floating point number" -msgstr "Адади бутун." - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Қимати “%(value)s” бояд яклухт бошад" - -msgid "Integer" -msgstr "Яклухт" - -msgid "Big (8 byte) integer" -msgstr "Адади калони яклухт (8 байт)" - -msgid "IPv4 address" -msgstr "IPv4 - суроға" - -msgid "IP address" -msgstr "IP-суроға" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Қимати “%(value)s” бояд 'None', 'True' ё 'False' бошад" - -msgid "Boolean (Either True, False or None)" -msgstr "Мантиқӣ (True, False ё None)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Адади яклухти мусбат" - -msgid "Positive small integer" -msgstr "дади яклухти мусбати хурд" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слаг (то %(max_length)s)" - -msgid "Small integer" -msgstr "Адади яклухти хурд" - -msgid "Text" -msgstr "Матн" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” шакли нодуруст дорад. Шакли дуруст соат:дақ[:сония[.uuuuuu]" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” шакли дуруст дорад (соат:моҳ[:сония[.uuuuuu, аммо 'вақт' " -"нодуруст қайд шудааст " - -msgid "Time" -msgstr "Вақт" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Маълумоти бинари(дуи)-и коркарднашуда" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Қимати “%(value)s” барои UUID номувофиқ аст." - -msgid "Universally unique identifier" -msgstr "Майдони UUID, идентификатори универсалии ягона" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Тасвир" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"Объекти модели %(model)s бо майдони %(field)s, -и дорои қимати %(value)r, " -"вуҷқд надорад." - -msgid "Foreign Key (type determined by related field)" -msgstr "" -"Калиди беруна(Foreign Key) (Шакл муайян шудаст аз рӯи майдони алоқамандшуда.)" - -msgid "One-to-one relationship" -msgstr "Алоқаи \"як ба як\"" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Алоқаи %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Алоқаи %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Алоқаи \\'бисёр ба бисёр\\'" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Майдони ҳатмӣ." - -msgid "Enter a whole number." -msgstr "Адади яклухтро ворид кунед." - -msgid "Enter a valid date." -msgstr "Санаи дурстро ворид кунед." - -msgid "Enter a valid time." -msgstr "Вақтро дуруст ворид кунед.." - -msgid "Enter a valid date/time." -msgstr "Сана ва вақтро дуруст ворид кунед." - -msgid "Enter a valid duration." -msgstr "авомнокии дурустро ворид кунед." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" -"Миқдори рӯзҳо бояд доираи аз {min_days} то {max_days} -ро дарбар гирад." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Файл равон карда нашуд. Шакли кодировкаи формаро тафтиш кунед." - -msgid "No file was submitted." -msgstr "Ягон файл равон карда нашуд" - -msgid "The submitted file is empty." -msgstr "Файли равонкардашуда холӣ аст." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Хоҳиш мекунем файлро бор кунед ё байрақчаи ишоратӣ гузоред \"Тоза кардан\", " -"вале ҳарду амалро дар якҷоягӣ иҷро накунед." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Тасвири дурустро бор кунед. Файли боркардаи шумо нуқсон дорад ва ё 'тасвира' " -"нест" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Варианти дурустро интихоб кунед. %(value)s дар байни варианҳои дастрас вуҷуд " -"надорад." - -msgid "Enter a list of values." -msgstr "Рӯйхати қиматҳоро ворид кунед." - -msgid "Enter a complete value." -msgstr "Рӯйхати ҳамаи қиматҳоро ворид кунед." - -msgid "Enter a valid UUID." -msgstr "Шакли дурусти UUID -ро ворид кунед." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Майдони махфии %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Маълумоти идоракунандаи форма вуҷуд надорад ё ин ки осеб дидааст." - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Тартиб" - -msgid "Delete" -msgstr "Нест кардан" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" -"Илтимос қимати такроршудаистодаи майдони \"%(field)s\" ро тағйир диҳед." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Илтимос, қимати майдони %(field)s ро тағйир диҳед, вай бояд 'ягона' бошад." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Илтимос, қимати майдони %(field_name)s ро тағйир диҳед, вай бояд барои " -"%(lookup)s дар майдони %(date_field)s ягона бошад (Ягона будан маънои " -"такрорнашавандагиро дорад)." - -msgid "Please correct the duplicate values below." -msgstr "Хоҳиш мекунам, қимати такроршудаистодаи зеринро иваз кунед." - -msgid "The inline value did not match the parent instance." -msgstr "" -"Қимати дар форма воридкардашуда бо қимати формаи база мутобиқат намекунад." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Варианти дурустро интихоб кунед. Варианти шумо дар қатори қиматҳои " -"овардашуда вуҷуд надорад." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Тоза кардан" - -msgid "Currently" -msgstr "Дар айни замон" - -msgid "Change" -msgstr "Тағйир додан" - -msgid "Unknown" -msgstr "Номаълум" - -msgid "Yes" -msgstr "Ҳа" - -msgid "No" -msgstr "Не" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ҳа,не,шояд" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "н.ш." - -msgid "a.m." -msgstr "н.р." - -msgid "PM" -msgstr "НШ" - -msgid "AM" -msgstr "НР" - -msgid "midnight" -msgstr "нимашабӣ" - -msgid "noon" -msgstr "нисфирузӣ" - -msgid "Monday" -msgstr "Душанбе" - -msgid "Tuesday" -msgstr "Сешанбе" - -msgid "Wednesday" -msgstr "Чоршанбе" - -msgid "Thursday" -msgstr "Панҷшанбе" - -msgid "Friday" -msgstr "Ҷумъа" - -msgid "Saturday" -msgstr "Шанбе" - -msgid "Sunday" -msgstr "Якшанбе" - -msgid "Mon" -msgstr "Дш" - -msgid "Tue" -msgstr "Яш" - -msgid "Wed" -msgstr "Чш" - -msgid "Thu" -msgstr "Пш" - -msgid "Fri" -msgstr "Ҷ" - -msgid "Sat" -msgstr "Ш" - -msgid "Sun" -msgstr "Яш" - -msgid "January" -msgstr "Январ" - -msgid "February" -msgstr "Феврал" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрел" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июн" - -msgid "July" -msgstr "Июл" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябр" - -msgid "October" -msgstr "Октябр" - -msgid "November" -msgstr "Ноябр" - -msgid "December" -msgstr "Декабр" - -msgid "jan" -msgstr "янв" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "июн" - -msgid "jul" -msgstr "июл" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сен" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноя" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Янв." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апрел" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Июн" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Июл" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Сен." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноя." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "январ" - -msgctxt "alt. month" -msgid "February" -msgstr "феврал" - -msgctxt "alt. month" -msgid "March" -msgstr "март" - -msgctxt "alt. month" -msgid "April" -msgstr "апрел" - -msgctxt "alt. month" -msgid "May" -msgstr "май" - -msgctxt "alt. month" -msgid "June" -msgstr "июн" - -msgctxt "alt. month" -msgid "July" -msgstr "июл" - -msgctxt "alt. month" -msgid "August" -msgstr "август" - -msgctxt "alt. month" -msgid "September" -msgstr "сентябр" - -msgctxt "alt. month" -msgid "October" -msgstr "октябр" - -msgctxt "alt. month" -msgid "November" -msgstr "ноябр" - -msgctxt "alt. month" -msgid "December" -msgstr "декабр" - -msgid "This is not a valid IPv6 address." -msgstr "Қиммат суроғаи дурусти IPv6 нест." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ё" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "Мушкилӣ дар воридшавӣ" - -msgid "CSRF verification failed. Request aborted." -msgstr "Мушкили дар тафтиши CSRF. Дархост рад шуд." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Шумо ин хабарро барои он мебинед, ки ин HTTPS -сомона, тавассути браузери " -"шумо дархости равон кардани 'Referer' 'header' -ро дорад. Вале ягон дархост " -"равон нашудааст.Иҷрои ин амал аз ҷиҳати бехатарӣ барои мутмаин шудани он, ки " -"браузери шумо аз тарафи шахси сеюм 'шикаста'' (взлом)нашудааст, ҳатмӣ " -"мебошад." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Агар шумо браузери худро ба таври 'Referer'-сархатҳояшон дастнорас ба танзим " -"даровада бошед,хоҳиш мекунем, ки ҳадди ақал барои сомонаи мазкур ё барои " -"пайсшавии таввассути HTTPS ё ин ки бароидархостҳои манбаашон якхела, амали " -"азнавбатанзимдарориро иҷро намоед." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Шумо ин хабарро барои он мебинед, ки сомонаи мазкур талаб менамояд, то амали " -"равонкунииформа ва CSRF cookie дар якҷоягӣ сурат гирад. Ин намуди 'cookie' " -"аз ҷиҳати бехатарӣбарои мутмаин шудани он, ки браузери шумо аз тарафи шахси " -"сеюм 'шикаста'' (взлом)нашудааст, ҳатмӣ мебошад." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Агар шумо браузери худро ба таври дастнораси ба cookies' ба танзим даровада " -"бошед,хоҳиш мекунем, ки ҳадди ақал барои сомонаи мазкур ё барои пайсшавии " -"таввассути HTTPS ё ин ки бароидархостҳои манбаашон якхела, амали " -"азнавбатанзимдарориро иҷро намоед." - -msgid "More information is available with DEBUG=True." -msgstr "" -"Маълумоти бештар дар режими 'танзимдарорӣ'(отладчика), бо фаъолсозии " -"DEBUG=True." - -msgid "No year specified" -msgstr "Сол ишора нашудааст" - -msgid "Date out of range" -msgstr "сана аз доираи муайян берун аст" - -msgid "No month specified" -msgstr "Моҳ ишора нашудааст" - -msgid "No day specified" -msgstr "Рӯз ишора нашудааст" - -msgid "No week specified" -msgstr "Ҳафта ишора нашудааст" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s дастнорас аст" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s навбатӣ дастнорасанд барои он ки %(class_name)s." -"allow_future бо қимати \" False\" гузошта шудааст." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Санаи нодурусти “%(datestr)s” шакли “%(format)s” гирифтааст" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Ягон %(verbose_name)s, мувофиқ бо дархости шумо ёфт нашуд" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Саҳифа 'охирин' нест ва ё ки бо адади яклухт(int) ишора нашудааст" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Саҳифаи нодуруст (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Азназаргузаронии рӯёхати файлҳо дар директорияи зерин номумкин аст." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” вуҷуд надорад" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Рӯёхати файлҳои директорияи %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" -"Django: веб-фреймворк барои перфектсионистҳо бо дедлайнҳо. Бисёр фреймворки " -"табъи дилва хастанакунанда ҳангоми кор." - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Инҷо андешаҳо оиди баромади Django " -"%(version)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Ҷобаҷогузорӣ муваффақона анҷом ёфт! Табрик!" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Шумо ин хабарро барои он мебинед, ки дар ишора намудед: DEBUG=True ва дар файли " -"ҷобаҷогузорӣ(settings)ягонто танзимгари URL-суроғаҳоро ишора нанамудед." - -msgid "Django Documentation" -msgstr "Ҳуҷҷатгузории Django" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "Роҳбарият: Барнома барои овоздиҳӣ" - -msgid "Get started with Django" -msgstr "оғози кор бо Django" - -msgid "Django Community" -msgstr "Иттиҳоди Django" - -msgid "Connect, get help, or contribute" -msgstr "Бо мо ҳамкорӣ намуда имкониятҳои навро пайдо намоед." diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tg/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/tg/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tg/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/tg/formats.py deleted file mode 100644 index 0ab7d49..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/tg/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y г." -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j E Y г. G:i" -YEAR_MONTH_FORMAT = "F Y г." -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y", # '25.10.06' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/th/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index 3969ebd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/th/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index 8ab31f2..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,1208 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abhabongse Janthong, 2015 -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2014,2018-2019 -# Naowal Siripatana , 2017 -# sipp11 , 2014 -# Suteepat Damrongyingsupab , 2011-2012 -# Suteepat Damrongyingsupab , 2013 -# Vichai Vongvorakul , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "อาฟฟริกัน" - -msgid "Arabic" -msgstr "อารบิก" - -msgid "Asturian" -msgstr "อัสตูเรียน" - -msgid "Azerbaijani" -msgstr "อาเซอร์ไบจาน" - -msgid "Bulgarian" -msgstr "บัลแกเรีย" - -msgid "Belarusian" -msgstr "เบลารุส" - -msgid "Bengali" -msgstr "เบ็งกาลี" - -msgid "Breton" -msgstr "เบรตัน" - -msgid "Bosnian" -msgstr "บอสเนีย" - -msgid "Catalan" -msgstr "คาตะลาน" - -msgid "Czech" -msgstr "เช็ก" - -msgid "Welsh" -msgstr "เวลส์" - -msgid "Danish" -msgstr "เดนมาร์ก" - -msgid "German" -msgstr "เยอรมัน" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "กรีก" - -msgid "English" -msgstr "อังกฤษ" - -msgid "Australian English" -msgstr "อังกฤษ - ออสเตรเลีย" - -msgid "British English" -msgstr "อังกฤษ - สหราชอาณาจักร" - -msgid "Esperanto" -msgstr "เอสเปรันโต" - -msgid "Spanish" -msgstr "สเปน" - -msgid "Argentinian Spanish" -msgstr "สเปน - อาร์เจนติน่า" - -msgid "Colombian Spanish" -msgstr "สเปน - โคลัมเบีย" - -msgid "Mexican Spanish" -msgstr "สเปน - เม็กซิกัน" - -msgid "Nicaraguan Spanish" -msgstr "นิการากัวสเปน" - -msgid "Venezuelan Spanish" -msgstr "เวเนซุเอลาสเปน" - -msgid "Estonian" -msgstr "เอสโตเนีย" - -msgid "Basque" -msgstr "แบ็ซค์" - -msgid "Persian" -msgstr "เปอร์เชีย" - -msgid "Finnish" -msgstr "ฟินแลนด์" - -msgid "French" -msgstr "ฝรั่งเศส" - -msgid "Frisian" -msgstr "ฟริเซียน" - -msgid "Irish" -msgstr "ไอริช" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "กาลิเซีย" - -msgid "Hebrew" -msgstr "ฮีบรู" - -msgid "Hindi" -msgstr "ฮินดี" - -msgid "Croatian" -msgstr "โครเอเชีย" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ฮังการี" - -msgid "Armenian" -msgstr "อาร์เมเนียน" - -msgid "Interlingua" -msgstr "ภาษากลาง" - -msgid "Indonesian" -msgstr "อินโดนิเซีย" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ไอซ์แลนด์" - -msgid "Italian" -msgstr "อิตาลี" - -msgid "Japanese" -msgstr "ญี่ปุ่น" - -msgid "Georgian" -msgstr "จอร์เจีย" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "คาซัค" - -msgid "Khmer" -msgstr "เขมร" - -msgid "Kannada" -msgstr "กัณณาท" - -msgid "Korean" -msgstr "เกาหลี" - -msgid "Luxembourgish" -msgstr "ลักแซมเบิร์ก" - -msgid "Lithuanian" -msgstr "ลิทัวเนีย" - -msgid "Latvian" -msgstr "ลัตเวีย" - -msgid "Macedonian" -msgstr "มาซิโดเนีย" - -msgid "Malayalam" -msgstr "มลายู" - -msgid "Mongolian" -msgstr "มองโกเลีย" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "พม่า" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "เนปาล" - -msgid "Dutch" -msgstr "ดัตช์" - -msgid "Norwegian Nynorsk" -msgstr "นอร์เวย์ - Nynorsk" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "ปัญจาบี" - -msgid "Polish" -msgstr "โปแลนด์" - -msgid "Portuguese" -msgstr "โปรตุเกส" - -msgid "Brazilian Portuguese" -msgstr "โปรตุเกส (บราซิล)" - -msgid "Romanian" -msgstr "โรมาเนีย" - -msgid "Russian" -msgstr "รัสเซีย" - -msgid "Slovak" -msgstr "สโลวัก" - -msgid "Slovenian" -msgstr "สโลวีเนีย" - -msgid "Albanian" -msgstr "อัลแบเนีย" - -msgid "Serbian" -msgstr "เซอร์เบีย" - -msgid "Serbian Latin" -msgstr "เซอร์เบียละติน" - -msgid "Swedish" -msgstr "สวีเดน" - -msgid "Swahili" -msgstr "สวาฮีลี" - -msgid "Tamil" -msgstr "ทมิฬ" - -msgid "Telugu" -msgstr "เตลุคู" - -msgid "Thai" -msgstr "ไทย" - -msgid "Turkish" -msgstr "ตุรกี" - -msgid "Tatar" -msgstr "ตาตาร์" - -msgid "Udmurt" -msgstr "อัดเมิร์ท" - -msgid "Ukrainian" -msgstr "ยูเครน" - -msgid "Urdu" -msgstr "เออร์ดู" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "เวียดนาม" - -msgid "Simplified Chinese" -msgstr "จีนตัวย่อ" - -msgid "Traditional Chinese" -msgstr "จีนตัวเต็ม" - -msgid "Messages" -msgstr "ข้อความ" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "หมายเลขหน้าดังกล่าวไม่ใช่จำนวนเต็ม" - -msgid "That page number is less than 1" -msgstr "หมายเลขหน้าดังกล่าวมีค่าน้อยกว่า 1" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "กรุณาใส่ค่าที่ถูกต้อง" - -msgid "Enter a valid URL." -msgstr "ใส่ URL ที่ถูกต้อง" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "ป้อนที่อยู่อีเมลที่ถูกต้อง" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "กรุณาใส่หมายเลขไอพีที่ถูกต้อง" - -msgid "Enter a valid IPv6 address." -msgstr "กรอก IPv6 address ให้ถูกต้อง" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "กรอก IPv4 หรือ IPv6 address ให้ถูกต้อง" - -msgid "Enter only digits separated by commas." -msgstr "ใส่ตัวเลขที่คั่นด้วยจุลภาคเท่านั้น" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "ค่านี้ต้องเป็น %(limit_value)s (ปัจจุบันคือ %(show_value)s)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "ค่านี้ต้องน้อยกว่าหรือเท่ากับ %(limit_value)s" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "ค่านี้ต้องมากกว่าหรือเท่ากับ %(limit_value)s" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -msgid "Enter a number." -msgstr "กรอกหมายเลข" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "และ" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "ฟิลด์นี้ไม่สารถปล่อยว่างได้" - -msgid "This field cannot be blank." -msgstr "ฟิลด์นี้เว้นว่างไม่ได้" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s และ %(field_label)s มีอยู่แล้ว" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "ฟิลด์ข้อมูล: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "ตรรกะแบบบูลหมายถึง ค่า\"จริง\" (True) หรือ \"ไม่จริง \" (False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "สตริง(ได้ถึง %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "จำนวนเต็มแบบมีจุลภาค" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "วันที่ (ไม่มีเวลา)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "วันที่ (พร้อมด้วยเวลา)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "เลขฐานสิบหรือเลขทศนิยม" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "ช่วงเวลา" - -msgid "Email address" -msgstr "อีเมล" - -msgid "File path" -msgstr "ตำแหน่งไฟล์" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "เลขทศนิยม" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "จำนวนเต็ม" - -msgid "Big (8 byte) integer" -msgstr "จำนวนเต็ม (8 byte)" - -msgid "IPv4 address" -msgstr "IPv4 address" - -msgid "IP address" -msgstr "หมายเลขไอพี" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" -"ตรรกะแบบบูลหมายถึง ค่า\"จริง\" (True) หรือ \"ไม่จริง \" (False) หรือ \"ไม่มี\" (None)" - -msgid "Positive integer" -msgstr "จํานวนเต็มบวก" - -msgid "Positive small integer" -msgstr "จํานวนเต็มบวกขนาดเล็ก" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (ถึง %(max_length)s )" - -msgid "Small integer" -msgstr "จำนวนเต็มขนาดเล็ก" - -msgid "Text" -msgstr "ข้อความ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "เวลา" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "ไฟล์" - -msgid "Image" -msgstr "รูปภาพ" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (ชนิดของข้อมูลจะถูกกำหนดจากฟิลด์ที่เกี่ยวข้อง)" - -msgid "One-to-one relationship" -msgstr "ความสัมพันธ์แบบหนึ่งต่อหนึ่ง" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "ความสัมพันธ์แบบ many-to-many" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "ฟิลด์นี้จำเป็น" - -msgid "Enter a whole number." -msgstr "กรอกหมายเลข" - -msgid "Enter a valid date." -msgstr "กรุณาใส่วัน" - -msgid "Enter a valid time." -msgstr "กรุณาใส่เวลา" - -msgid "Enter a valid date/time." -msgstr "กรุณาใส่วันเวลา" - -msgid "Enter a valid duration." -msgstr "ใส่ระยะเวลาที่ถูกต้อง" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "ไม่มีไฟล์ใดถูกส่ง. ตรวจสอบ encoding type ในฟอร์ม." - -msgid "No file was submitted." -msgstr "ไม่มีไฟล์ใดถูกส่ง" - -msgid "The submitted file is empty." -msgstr "ไฟล์ที่ส่งว่างเปล่า" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "โปรดเลือกไฟล์หรือติ๊ก clear checkbox อย่างใดอย่างหนึ่ง" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "อัพโหลดรูปที่ถูกต้อง. ไฟล์ที่อัพโหลดไปไม่ใช่รูป หรือรูปเสียหาย." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "เลือกตัวเลือกที่ถูกต้อง. %(value)s ไม่ใช่ตัวเลือกที่ใช้ได้." - -msgid "Enter a list of values." -msgstr "ใส่รายการ" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "ใส่ UUID ที่ถูกต้อง" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "เรียงลำดับ" - -msgid "Delete" -msgstr "ลบ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "โปรดแก้ไขข้อมูลที่ซ้ำซ้อนใน %(field)s" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "โปรดแก้ไขข้อมูลที่ซ้ำซ้อนใน %(field)s ซึ่งจะต้องไม่ซ้ำกัน" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"โปรดแก้ไขข้อมูลซ้ำซ้อนใน %(field_name)s ซึ่งจะต้องไม่ซ้ำกันสำหรับ %(lookup)s ใน " -"%(date_field)s" - -msgid "Please correct the duplicate values below." -msgstr "โปรดแก้ไขค่าที่ซ้ำซ้อนด้านล่าง" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "เลือกตัวเลือกที่ถูกต้อง. ตัวเลือกนั้นไม่สามารถเลือกได้." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "ล้าง" - -msgid "Currently" -msgstr "ปัจจุบัน" - -msgid "Change" -msgstr "เปลี่ยนแปลง" - -msgid "Unknown" -msgstr "ไม่รู้" - -msgid "Yes" -msgstr "ใช่" - -msgid "No" -msgstr "ไม่ใช่" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ใช่,ไม่ใช่,อาจจะ" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ไบต์" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "เที่ยงคืน" - -msgid "noon" -msgstr "เที่ยงวัน" - -msgid "Monday" -msgstr "จันทร์" - -msgid "Tuesday" -msgstr "อังคาร" - -msgid "Wednesday" -msgstr "พุธ" - -msgid "Thursday" -msgstr "พฤหัสบดี" - -msgid "Friday" -msgstr "ศุกร์" - -msgid "Saturday" -msgstr "เสาร์" - -msgid "Sunday" -msgstr "อาทิตย์" - -msgid "Mon" -msgstr "จ." - -msgid "Tue" -msgstr "อ." - -msgid "Wed" -msgstr "พ." - -msgid "Thu" -msgstr "พฤ." - -msgid "Fri" -msgstr "ศ." - -msgid "Sat" -msgstr "ส." - -msgid "Sun" -msgstr "อา." - -msgid "January" -msgstr "มกราคม" - -msgid "February" -msgstr "กุมภาพันธ์" - -msgid "March" -msgstr "มีนาคม" - -msgid "April" -msgstr "เมษายน" - -msgid "May" -msgstr "พฤษภาคม" - -msgid "June" -msgstr "มิถุนายน" - -msgid "July" -msgstr "กรกฎาคม" - -msgid "August" -msgstr "สิงหาคม" - -msgid "September" -msgstr "กันยายน" - -msgid "October" -msgstr "ตุลาคม" - -msgid "November" -msgstr "พฤศจิกายน" - -msgid "December" -msgstr "ธันวาคม" - -msgid "jan" -msgstr "ม.ค." - -msgid "feb" -msgstr "ก.พ." - -msgid "mar" -msgstr "มี.ค." - -msgid "apr" -msgstr "เม.ย." - -msgid "may" -msgstr "พ.ค." - -msgid "jun" -msgstr "มิ.ย." - -msgid "jul" -msgstr "ก.ค." - -msgid "aug" -msgstr "ส.ค." - -msgid "sep" -msgstr "ก.ย." - -msgid "oct" -msgstr "ต.ค." - -msgid "nov" -msgstr "พ.ย." - -msgid "dec" -msgstr "ธ.ค." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "ม.ค." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ก.พ." - -msgctxt "abbrev. month" -msgid "March" -msgstr "มี.ค." - -msgctxt "abbrev. month" -msgid "April" -msgstr "เม.ย." - -msgctxt "abbrev. month" -msgid "May" -msgstr "พ.ค." - -msgctxt "abbrev. month" -msgid "June" -msgstr "มิ.ย." - -msgctxt "abbrev. month" -msgid "July" -msgstr "ก.ค." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ส.ค." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ก.ย." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ต.ค." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "พ.ย." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ธ.ค." - -msgctxt "alt. month" -msgid "January" -msgstr "มกราคม" - -msgctxt "alt. month" -msgid "February" -msgstr "กุมภาพันธ์" - -msgctxt "alt. month" -msgid "March" -msgstr "มีนาคม" - -msgctxt "alt. month" -msgid "April" -msgstr "เมษายน" - -msgctxt "alt. month" -msgid "May" -msgstr "พฤษภาคม" - -msgctxt "alt. month" -msgid "June" -msgstr "มิถุนายน" - -msgctxt "alt. month" -msgid "July" -msgstr "กรกฎาคม" - -msgctxt "alt. month" -msgid "August" -msgstr "สิงหาคม" - -msgctxt "alt. month" -msgid "September" -msgstr "กันยายน" - -msgctxt "alt. month" -msgid "October" -msgstr "ตุลาคม" - -msgctxt "alt. month" -msgid "November" -msgstr "พฤศจิกายน" - -msgctxt "alt. month" -msgid "December" -msgstr "ธันวาคม" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "หรือ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d ปี" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d เดือน" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d สัปดาห์" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d วัน" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ชั่วโมง" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d นาที" - -msgid "0 minutes" -msgstr "0 นาที" - -msgid "Forbidden" -msgstr "หวงห้าม" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "ไม่ระบุปี" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "ไม่ระบุเดือน" - -msgid "No day specified" -msgstr "ไม่ระบุวัน" - -msgid "No week specified" -msgstr "ไม่ระบุสัปดาห์" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "ไม่มี %(verbose_name_plural)s ที่ใช้ได้" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s ในอนาคตไม่สามารถใช้ได้ เนื่องจาก %(class_name)s." -"allow_future มีค่าเป็น False" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "ไม่พบ %(verbose_name)s จาก query" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "หน้าไม่ถูกต้อง (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "ไม่ได้รับอนุญาตให้ใช้ Directory indexes ที่นี่" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "ดัชนีของ %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "เริ่มต้นกับ Django" - -msgid "Django Community" -msgstr "ชุมชน Django" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/th/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/th/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/th/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/th/formats.py deleted file mode 100644 index 190e6d1..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/th/formats.py +++ /dev/null @@ -1,33 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j F Y, G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -SHORT_DATETIME_FORMAT = "j M Y, G:i" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # 25/10/2006 - "%d %b %Y", # 25 ต.ค. 2006 - "%d %B %Y", # 25 ตุลาคม 2006 -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # 14:30:59 - "%H:%M:%S.%f", # 14:30:59.000200 - "%H:%M", # 14:30 -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # 25/10/2006 14:30:59 - "%d/%m/%Y %H:%M:%S.%f", # 25/10/2006 14:30:59.000200 - "%d/%m/%Y %H:%M", # 25/10/2006 14:30 -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index 2858350..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index ad00026..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,1337 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2020-2021 -# Resul , 2020 -# Resul , 2022-2024 -# Welbeck Garli , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Resul , 2022-2024\n" -"Language-Team: Turkmen (http://app.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arapça" - -msgid "Algerian Arabic" -msgstr "Alžir Arapçasy" - -msgid "Asturian" -msgstr "Asturian" - -msgid "Azerbaijani" -msgstr "Azeri Türkçesi" - -msgid "Bulgarian" -msgstr "Bolgar" - -msgid "Belarusian" -msgstr "Belarusça" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosniýaça" - -msgid "Catalan" -msgstr "Katalan" - -msgid "Central Kurdish (Sorani)" -msgstr "Merkezi Kürtçe (Soraniçe)" - -msgid "Czech" -msgstr "Çehçe" - -msgid "Welsh" -msgstr "Uelsçe" - -msgid "Danish" -msgstr "Daniýaça" - -msgid "German" -msgstr "Nemesçe" - -msgid "Lower Sorbian" -msgstr "Aşaky Sorbian" - -msgid "Greek" -msgstr "Grekçe" - -msgid "English" -msgstr "Iňlisçe" - -msgid "Australian English" -msgstr "Awstraliýa Iňlisçesi" - -msgid "British English" -msgstr "Britan Iňlisçesi" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Ispança" - -msgid "Argentinian Spanish" -msgstr "Argentina Ispançasy" - -msgid "Colombian Spanish" -msgstr "Kolumbiýa Ispançasy" - -msgid "Mexican Spanish" -msgstr "Meksika Ispançasy" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragua Ispançasy" - -msgid "Venezuelan Spanish" -msgstr "Wenezuela Ispançasy" - -msgid "Estonian" -msgstr "Estonça" - -msgid "Basque" -msgstr "Baskça" - -msgid "Persian" -msgstr "Parsça" - -msgid "Finnish" -msgstr "Finçe" - -msgid "French" -msgstr "Fransuzça" - -msgid "Frisian" -msgstr "Frisça" - -msgid "Irish" -msgstr "Irlandça" - -msgid "Scottish Gaelic" -msgstr "Şotlandiýa Gaelçasy" - -msgid "Galician" -msgstr "Galisiýaça" - -msgid "Hebrew" -msgstr "Ýewreýçe" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Horwatça" - -msgid "Upper Sorbian" -msgstr "Ýokarky Sorbian" - -msgid "Hungarian" -msgstr "Wengerçe" - -msgid "Armenian" -msgstr "Ermeniçe" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezça" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandça" - -msgid "Italian" -msgstr "Italýança" - -msgid "Japanese" -msgstr "Ýaponça" - -msgid "Georgian" -msgstr "Gruzinçe" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Gazakça" - -msgid "Khmer" -msgstr "Hmerçe" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreýçe" - -msgid "Kyrgyz" -msgstr "Gyrgyzça" - -msgid "Luxembourgish" -msgstr "Lýuksemburgça" - -msgid "Lithuanian" -msgstr "Litwança" - -msgid "Latvian" -msgstr "Latwiýaça" - -msgid "Macedonian" -msgstr "Makedonça" - -msgid "Malayalam" -msgstr "Malaýalam" - -msgid "Mongolian" -msgstr "Mongolça" - -msgid "Marathi" -msgstr "Marasi" - -msgid "Malay" -msgstr "Malaý" - -msgid "Burmese" -msgstr "Birma" - -msgid "Norwegian Bokmål" -msgstr "Norwegiýa Bokmaly" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Gollandça" - -msgid "Norwegian Nynorsk" -msgstr "Norwegiýa Nynorskçasy" - -msgid "Ossetic" -msgstr "Osetikçe" - -msgid "Punjabi" -msgstr "Penjebiçe" - -msgid "Polish" -msgstr "Polýakça" - -msgid "Portuguese" -msgstr "Portugalça" - -msgid "Brazilian Portuguese" -msgstr "Braziliýa Portugalçasy" - -msgid "Romanian" -msgstr "Rumynça" - -msgid "Russian" -msgstr "Rusça" - -msgid "Slovak" -msgstr "Slowakça" - -msgid "Slovenian" -msgstr "Slowençe" - -msgid "Albanian" -msgstr "Albança" - -msgid "Serbian" -msgstr "Serbçe" - -msgid "Serbian Latin" -msgstr "Serb Latynçasy" - -msgid "Swedish" -msgstr "Şwedçe" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Täjik" - -msgid "Thai" -msgstr "Taýça" - -msgid "Turkmen" -msgstr "Türkmençe" - -msgid "Turkish" -msgstr "Türkçe" - -msgid "Tatar" -msgstr "Tatarça" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uýgur" - -msgid "Ukrainian" -msgstr "Ukrainçe" - -msgid "Urdu" -msgstr "Urduça" - -msgid "Uzbek" -msgstr "Özbekçe" - -msgid "Vietnamese" -msgstr "Wýetnamça" - -msgid "Simplified Chinese" -msgstr "Ýönekeýleşdirilen Hytaýça" - -msgid "Traditional Chinese" -msgstr "Adaty Hytaýça" - -msgid "Messages" -msgstr "Habarlar" - -msgid "Site Maps" -msgstr "Saýt Kartalary" - -msgid "Static Files" -msgstr "Statik Faýllar" - -msgid "Syndication" -msgstr "Syndikasiýa" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Ol sahypanyň sany bitewi san däl" - -msgid "That page number is less than 1" -msgstr "Ol sahypanyň belgisi 1-den az" - -msgid "That page contains no results" -msgstr "Ol sahypada hiç hili netije ýok" - -msgid "Enter a valid value." -msgstr "Dogry baha giriziň." - -msgid "Enter a valid domain name." -msgstr "Dogry domen adyny giriziň." - -msgid "Enter a valid URL." -msgstr "Dogry URL giriziň." - -msgid "Enter a valid integer." -msgstr "Dogry bitewi san giriziň." - -msgid "Enter a valid email address." -msgstr "Dogry e-poçta salgysyny giriziň." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Harplardan, sanlardan, aşaky çyzyklardan ýa-da defislerden ybarat dogry " -"“slug” giriziň." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Unikod harplaryndan, sanlardan, aşaky çyzyklardan ýa-da defislerden ybarat " -"dogry “slug” giriziň." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Dogry %(protocol)s adresi giriziň." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ýa IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Diňe otur bilen aýrylan sanlary giriziň." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"%(limit_value)s bahasynyň dogry bolmagyny üpjün ediň (şuwagt %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Maglumatyň %(limit_value)s bahasyndan az ýa-da deň bolmagyny üpjün ediň." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Maglumatyň %(limit_value)s bahasyndan köp ýa-da deň bolmagyny üpjün ediň." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Bu baha %(limit_value)s-nyň essesi bolmaly." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu maglumatda iň az %(limit_value)d harp bardygyna göz ýetiriň (munda " -"%(show_value)d bar)." -msgstr[1] "" -"Bu maglumatda azyndan %(limit_value)d nyşanyň bolmagyny üpjün ediň (şuwagt " -"%(show_value)d sany bar)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu maglumatda köpünden %(limit_value)d harp bardygyna göz ýetiriň (bunda " -"%(show_value)d bar)" -msgstr[1] "" -"Bu maglumatda iň köp %(limit_value)d nyşanyň bolmagyny üpjün ediň (şuwagt " -"%(show_value)d sany bar)" - -msgid "Enter a number." -msgstr "San giriziň" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Bu ýerde jemi %(max)s'dan köp san ýokduguna göz ýetiriň." -msgstr[1] "Bu ýerde jemi %(max)s sanydan köp sifriň bolmazlygyny üpjün ediň." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Bu ýerde %(max)s'dan köp nokatly san ýokdugyna göz ýetiriň" -msgstr[1] "Bu ýerde %(max)s sanydan köp nokatly san ýoklugyny üpjün ediň." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Nokatdan öň %(max)s'dan köp san ýokdugyna göz ýetiriň" -msgstr[1] "Nokatdan öň %(max)s sanydan köp sifriň ýoklugyny üpjün ediň." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"\"%(extension)s\" faýl görnüşine rugsat edilmeýär. Rugsat berilýän faýl " -"görnüşleri şulardan ybarat: %(allowed_extensions)s" - -msgid "Null characters are not allowed." -msgstr "Null nyşanlara rugsat berilmeýär." - -msgid "and" -msgstr "we" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s bilen baglanyşykly %(model_name)s eýýäm bar." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Çäklendirme “%(name)s” bozuldy." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r dogry saýlaw däl." - -msgid "This field cannot be null." -msgstr "Bu meýdan null bilmez." - -msgid "This field cannot be blank." -msgstr "Bu meýdan boş bolup bilmez." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s bilen baglanyşykly %(model_name)s eýýäm bar." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(lookup_type)s %(date_field_label)s üçin %(field_label)s özboluşly " -"bolmalydyr." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Meýdan görnüşi: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "\"%(value)s\" hökman True ýa-da False bolmalydyr." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\" hökman True, False ýa-da None bolmalydyr." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (True ýa-da False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Setir (iň köp %(max_length)s)" - -msgid "String (unlimited)" -msgstr "String (limitsiz)" - -msgid "Comma-separated integers" -msgstr "Otur bilen bölünen bitewi sanlar" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"\"%(value)s\" bahasynyň nädogry sene formaty bar. ÝÝÝÝ-AA-GG görnüşinde " -"bolmaly." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"\"%(value)s\" dogry yazylyş usuluna (ÝÝÝÝ-AA-GG) eýe, ýöne, sene nädogry." - -msgid "Date (without time)" -msgstr "Sene (wagtsyz)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"\"%(value)s\" ýalňyş görnüşde ýazylan. Bu baha hökmany suratda ÝÝÝÝ-AA-GG SS:" -"MM[:ss[.uuuuuu]][TZ] görnüşde bolmalydyr." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"\"%(value)s\" dogry sene görnüşine eýe (ÝÝÝÝ-AA-GG SS:MM[:ss[.uuuuuu]][TZ]). " -"Ýöne bu nädogry sene/wagt." - -msgid "Date (with time)" -msgstr "Sene (wagty bilen)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "\"%(value)s\" hökman nokatly san bolmalydyr." - -msgid "Decimal number" -msgstr "Onluk san" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"\"%(value)s\" ýalňyş sene görnüşine eýe. Bu hökman [GG] [[SS:]AA:]ss[." -"uuuuuu] görnüşinde bolmalydyr." - -msgid "Duration" -msgstr "Dowamlylyk" - -msgid "Email address" -msgstr "Email adres" - -msgid "File path" -msgstr "Faýl ýoly" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "\"%(value)s float san bolmaly." - -msgid "Floating point number" -msgstr "Float san" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "\"%(value)s\" bitewi san bolmaly." - -msgid "Integer" -msgstr "Bitewi san" - -msgid "Big (8 byte) integer" -msgstr "Uly (8 baýt) bitewi san" - -msgid "Small integer" -msgstr "Kiçi bitewi san" - -msgid "IPv4 address" -msgstr "IPv4 salgy" - -msgid "IP address" -msgstr "IP salgy" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"%(value)s\" None, True ýa-da False bolmaly." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (True, False ýa-da None)" - -msgid "Positive big integer" -msgstr "Pozitiw uly bitewi san" - -msgid "Positive integer" -msgstr "Pozitiw bitewi san" - -msgid "Positive small integer" -msgstr "Pozitiw kiçi bitewi san" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (iň köp %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"\"%(value)s\" bahasy nädogry formata eýe. SS:MM[:ss[.uuuuuu]] formatda " -"bolmaly." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"\"%(value)s\" bahasy dogry formata eýe (SS:MM[:ss[.uuuuuu]]) ýöne bu nädogry " -"wagt." - -msgid "Time" -msgstr "Wagt" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Çig ikilik maglumat" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" dogry UUID däl." - -msgid "Universally unique identifier" -msgstr "Ähliumumy özboluşly kesgitleýji" - -msgid "File" -msgstr "Faýl" - -msgid "Image" -msgstr "Surat" - -msgid "A JSON object" -msgstr "JSON obýekti" - -msgid "Value must be valid JSON." -msgstr "Bahasy JSON bolmaly." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s%(value)r bolan %(model)s ýok." - -msgid "Foreign Key (type determined by related field)" -msgstr "Daşary açary (baglanyşykly meýdança bilen kesgitlenýär)" - -msgid "One-to-one relationship" -msgstr "Bire-bir gatnaşyk" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s gatnaşyk" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s gatnaşyklar" - -msgid "Many-to-many relationship" -msgstr "Köp-köp gatnaşyk" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Bu meýdança hökman gerekli." - -msgid "Enter a whole number." -msgstr "Bitin san giriziň." - -msgid "Enter a valid date." -msgstr "Dogry senäni giriziň." - -msgid "Enter a valid time." -msgstr "Dogry wagt giriziň." - -msgid "Enter a valid date/time." -msgstr "Dogry senäni/wagty giriziň." - -msgid "Enter a valid duration." -msgstr "Dogry dowamlylygy giriziň." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Günleriň sany {min_days} bilen {max_days} arasynda bolmaly." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Hiç hili faýl tabşyrylmady. Formadaky enkodiň görnüşini barlaň." - -msgid "No file was submitted." -msgstr "Hiç hili faýl tabşyrylmady." - -msgid "The submitted file is empty." -msgstr "Tabşyrylan faýl boş." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Bu faýl adynyň iň köp %(max)d nyşanynyň bolmagyny üpjin ediň (şuwagt " -"%(length)d sany bar)." -msgstr[1] "" -"Bu faýl adynyň iň köp %(max)d nyşanynyň bolmagyny üpjin ediň (şuwagt " -"%(length)d sany bar)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Bir faýl iberiň ýa-da arassala gutyjygyny belläň, ikisini bile däl." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Dogry surat ýükläň. Ýüklän faýlyňyz ýa surat däldi ýa-da zaýalanan suratdy." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Dogry saýlawy saýlaň. %(value)s elýeterli saýlawlaryň biri däl." - -msgid "Enter a list of values." -msgstr "Bahalaryň sanawyny giriziň." - -msgid "Enter a complete value." -msgstr "Doly bahany giriziň." - -msgid "Enter a valid UUID." -msgstr "Dogry UUID giriziň." - -msgid "Enter a valid JSON." -msgstr "Dogry JSON giriziň." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Gizlin meýdan %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm maglumatlary ýok ýa-da bozulan. Tapylmadyk meýdança: " -"%(field_names)s. Mesele dowam etse, \"bug report\" açmaly bolmagyňyz mümkin." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Haýyş, iň köp %(num)d form tabşyryň." -msgstr[1] "Haýyş, iň köp %(num)d form tabşyryň." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Haýyş, azyndan %(num)d form tabşyryň." -msgstr[1] "Haýyş, azyndan %(num)d form tabşyryň." - -msgid "Order" -msgstr "Tertip" - -msgid "Delete" -msgstr "Poz" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s üçin dublikat maglumatlary düzediň." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Özboluşly bolmaly %(field)s üçin dublikat maglumatlary düzediň." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(date_field)s meýdanynda %(lookup)süçin özboluşly bolmaly %(field_name)s " -"üçin dublikat maglumatlary düzediň." - -msgid "Please correct the duplicate values below." -msgstr "Aşakdaky dublikat bahalary düzediň." - -msgid "The inline value did not match the parent instance." -msgstr "Giriş bahasy esasy mysal bilen gabat gelmedi." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Dogry saýlawy saýlaň. Bu saýlaw, elýeterli saýlawlaryň biri däl." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" dogry baha däl." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s wagty %(current_timezone)s wagt zolagy bilen düşündirip " -"bolmady; garyşyk bolup biler ýa-da ýok bolmagy mümkin." - -msgid "Clear" -msgstr "Arassala" - -msgid "Currently" -msgstr "Häzirki wagtda" - -msgid "Change" -msgstr "Üýtget" - -msgid "Unknown" -msgstr "Näbelli" - -msgid "Yes" -msgstr "Hawa" - -msgid "No" -msgstr "Ýok" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "hawa,ýok,belki" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d baýt" -msgstr[1] "%(size)d baýt" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m" - -msgid "a.m." -msgstr "a.m" - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "ýary gije" - -msgid "noon" -msgstr "günortan" - -msgid "Monday" -msgstr "Duşenbe" - -msgid "Tuesday" -msgstr "Sişenbe" - -msgid "Wednesday" -msgstr "Çarşenbe" - -msgid "Thursday" -msgstr "Penşenbe" - -msgid "Friday" -msgstr "Anna" - -msgid "Saturday" -msgstr "Şenbe" - -msgid "Sunday" -msgstr "Ýekşenbe" - -msgid "Mon" -msgstr "Duş" - -msgid "Tue" -msgstr "Siş" - -msgid "Wed" -msgstr "Çarş" - -msgid "Thu" -msgstr "Pen" - -msgid "Fri" -msgstr "Anna" - -msgid "Sat" -msgstr "Şen" - -msgid "Sun" -msgstr "Ýek" - -msgid "January" -msgstr "Ýanwar" - -msgid "February" -msgstr "Fewral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Aprel" - -msgid "May" -msgstr "Maý" - -msgid "June" -msgstr "Iýun" - -msgid "July" -msgstr "Iýul" - -msgid "August" -msgstr "Awgust" - -msgid "September" -msgstr "Sentýabr" - -msgid "October" -msgstr "Oktýabr" - -msgid "November" -msgstr "Noýabr" - -msgid "December" -msgstr "Dekabr" - -msgid "jan" -msgstr "ýan" - -msgid "feb" -msgstr "few" - -msgid "mar" -msgstr "mart" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maý" - -msgid "jun" -msgstr "iýun" - -msgid "jul" -msgstr "iýul" - -msgid "aug" -msgstr "awg" - -msgid "sep" -msgstr "sent" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "noý" - -msgid "dec" -msgstr "dek" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ýan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Few." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprel" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maý" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Iýun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Iýul" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Awg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sent." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Noý." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dek." - -msgctxt "alt. month" -msgid "January" -msgstr "Ýanwar" - -msgctxt "alt. month" -msgid "February" -msgstr "Fewral" - -msgctxt "alt. month" -msgid "March" -msgstr "Mart" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprel" - -msgctxt "alt. month" -msgid "May" -msgstr "Maý" - -msgctxt "alt. month" -msgid "June" -msgstr "Iýun" - -msgctxt "alt. month" -msgid "July" -msgstr "Iýul" - -msgctxt "alt. month" -msgid "August" -msgstr "Awgust" - -msgctxt "alt. month" -msgid "September" -msgstr "Sentýabr" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktýabr" - -msgctxt "alt. month" -msgid "November" -msgstr "Noýabr" - -msgctxt "alt. month" -msgid "December" -msgstr "Dekabr" - -msgid "This is not a valid IPv6 address." -msgstr "Bu dogry IPv6 salgy däl." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ýa" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "\"" - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ýyl" -msgstr[1] "%(num)d ýyl" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d aý" -msgstr[1] "%(num)d aý" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hepde" -msgstr[1] "%(num)d hepde" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d sagat" -msgstr[1] "%(num)d sagat" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minut" - -msgid "Forbidden" -msgstr "Gadagan " - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF dogrylamak şowsuz. Talap ýatyryldy." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Bu haty görýärsiňiz, sebäbi bu HTTPS sahypasy web brauzeriňiz tarapyndan " -"iberilmeli \"Referer header\" talap edýär, ýöne hiç biri iberilmedi. Bu " -"sözbaşy, brauzeriňiziň üçünji şahyslar tarapyndan ogurlanmazlygy üçin " -"howpsuzlyk sebäpli talap edilýär." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Brauzeriňizde \"Referer\" sözbaşylaryny öçüren bolsaňyz, iň bolmanda bu " -"sahypa ýa-da HTTPS birikmeleri ýa-da \"meňzeş\" talaplar üçin täzeden açyň." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Egerde siz diýen bellik " -"ýada \"Referrer-Policy: no-referrer\" header ulanýan bolsaňyz, olary " -"aýyrmagyňyzy haýyş edýäris. CSRF goragy üçin \"Referer\" header-i dogry " -"salgylanma üçin gereklidir. Eger siz gizlinlik üçin alada etseňiz, üçinji " -"şahs sahypalara baglanyşyklar üçin ýaly " -"alternatiwalary ulanyp bilersiňiz." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Bu sahypa formalary tabşyranda CSRF kukisini talap edýäligi sebäpli bu " -"habary görýärsiňiz. Bu kuki, brauzeriňiziň üçünji taraplar tarapyndan " -"ogurlanmazlygy üçin howpsuzlyk sebäpli talap edilýär." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Brauzeriňizde kukileri öçüren bolsaňyz, iň bolmanda şu sahypa ýa-da " -"\"meňzeş\" talaplar üçin olary täzeden açyň." - -msgid "More information is available with DEBUG=True." -msgstr "Has giňişleýin maglumat DEBUG=True bilen elýeterlidir." - -msgid "No year specified" -msgstr "Ýyl görkezilmedi" - -msgid "Date out of range" -msgstr "Sene çägiň daşynda" - -msgid "No month specified" -msgstr "Aý görkezilmedi" - -msgid "No day specified" -msgstr "Gün görkezilmedi" - -msgid "No week specified" -msgstr "Hepde görkezilmedi" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Elýeterli %(verbose_name_plural)s ýok" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Gelejek %(verbose_name_plural)s elýeterli däl sebäbi %(class_name)s." -"allow_future bahasy False" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Nädogry sene setiri \"%(datestr)s\" berlen format \"%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Talap bilen gabat gelýän %(verbose_name)s tapylmady" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Sahypa “iň soňky” däl, ony int-ede öwrüp bolmaz." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nädogry sahypa (%(page_number)s ): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Boş list we \"%(class_name)s.allow_empty\" bahasy False" - -msgid "Directory indexes are not allowed here." -msgstr "Bu ýerde katalog indekslerine rugsat berilmeýär." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" beýle ýol ýok" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s indeksi" - -msgid "The install worked successfully! Congratulations!" -msgstr "Üstünlikli guruldy! Gutlaýarys!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django %(version)s üçin goýberiş " -"belliklerini görüň" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Bu sahypany görýärsiňiz, sebäbi sazlamalar faýlyňyzda DEBUG=True we hiç hili URL düzmediňiz." - -msgid "Django Documentation" -msgstr "Django resminamalary" - -msgid "Topics, references, & how-to’s" -msgstr "Mowzuklar, salgylanmalar, & how-to-lar" - -msgid "Tutorial: A Polling App" -msgstr "Gollanma: Ses beriş programmasy" - -msgid "Get started with Django" -msgstr "Django bilen başlaň" - -msgid "Django Community" -msgstr "Django jemgyýeti" - -msgid "Connect, get help, or contribute" -msgstr "Birikiň, kömek alyň ýa-da goşant goşuň" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tk/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/tk/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tk/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/tk/formats.py deleted file mode 100644 index 0ab7d49..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/tk/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y г." -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j E Y г. G:i" -YEAR_MONTH_FORMAT = "F Y г." -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y", # '25.10.06' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index 5f13b4d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index 6bf26a8..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1359 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ahmet Emre Aladağ , 2013 -# BouRock, 2015-2025 -# BouRock, 2014-2015 -# Caner Başaran , 2013 -# Cihad GÜNDOĞDU , 2012 -# Cihad GÜNDOĞDU , 2013-2014 -# Gökmen Görgen , 2013 -# Jannis Leidel , 2011 -# Mesut Can Gürle , 2013 -# Murat Çorlu , 2012 -# Murat Sahin , 2011-2012 -# Türker Sezer , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: BouRock, 2015-2025\n" -"Language-Team: Turkish (http://app.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Afrikaans" -msgstr "Afrikanca" - -msgid "Arabic" -msgstr "Arapça" - -msgid "Algerian Arabic" -msgstr "Cezayir Arapçası" - -msgid "Asturian" -msgstr "Asturyaca" - -msgid "Azerbaijani" -msgstr "Azerice" - -msgid "Bulgarian" -msgstr "Bulgarca" - -msgid "Belarusian" -msgstr "Beyaz Rusça" - -msgid "Bengali" -msgstr "Bengalce" - -msgid "Breton" -msgstr "Bretonca" - -msgid "Bosnian" -msgstr "Boşnakça" - -msgid "Catalan" -msgstr "Katalanca" - -msgid "Central Kurdish (Sorani)" -msgstr "Orta Kürtçe (Sorani)" - -msgid "Czech" -msgstr "Çekçe" - -msgid "Welsh" -msgstr "Galce" - -msgid "Danish" -msgstr "Danca" - -msgid "German" -msgstr "Almanca" - -msgid "Lower Sorbian" -msgstr "Aşağı Sorb dili" - -msgid "Greek" -msgstr "Yunanca" - -msgid "English" -msgstr "İngilizce" - -msgid "Australian English" -msgstr "Avusturya İngilizcesi" - -msgid "British English" -msgstr "İngiliz İngilizcesi" - -msgid "Esperanto" -msgstr "Esperanto dili" - -msgid "Spanish" -msgstr "İspanyolca" - -msgid "Argentinian Spanish" -msgstr "Arjantin İspanyolcası" - -msgid "Colombian Spanish" -msgstr "Kolomiya İspanyolcası" - -msgid "Mexican Spanish" -msgstr "Meksika İspanyolcası" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragua İspanyolcası" - -msgid "Venezuelan Spanish" -msgstr "Venezüella İspanyolcası" - -msgid "Estonian" -msgstr "Estonca" - -msgid "Basque" -msgstr "Baskça" - -msgid "Persian" -msgstr "Farsça" - -msgid "Finnish" -msgstr "Fince" - -msgid "French" -msgstr "Fransızca" - -msgid "Frisian" -msgstr "Frizce" - -msgid "Irish" -msgstr "İrlandaca" - -msgid "Scottish Gaelic" -msgstr "İskoçça Galcesi" - -msgid "Galician" -msgstr "Galiçyaca" - -msgid "Hebrew" -msgstr "İbranice" - -msgid "Hindi" -msgstr "Hintçe" - -msgid "Croatian" -msgstr "Hırvatça" - -msgid "Upper Sorbian" -msgstr "Yukarı Sorb dili" - -msgid "Hungarian" -msgstr "Macarca" - -msgid "Armenian" -msgstr "Ermenice" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Endonezce" - -msgid "Igbo" -msgstr "Igbo dili" - -msgid "Ido" -msgstr "Ido dili" - -msgid "Icelandic" -msgstr "İzlandaca" - -msgid "Italian" -msgstr "İtalyanca" - -msgid "Japanese" -msgstr "Japonca" - -msgid "Georgian" -msgstr "Gürcüce" - -msgid "Kabyle" -msgstr "Kabiliye dili" - -msgid "Kazakh" -msgstr "Kazakça" - -msgid "Khmer" -msgstr "Kmerce" - -msgid "Kannada" -msgstr "Kannada dili" - -msgid "Korean" -msgstr "Korece" - -msgid "Kyrgyz" -msgstr "Kırgızca" - -msgid "Luxembourgish" -msgstr "Lüksemburgca" - -msgid "Lithuanian" -msgstr "Litovca" - -msgid "Latvian" -msgstr "Letonca" - -msgid "Macedonian" -msgstr "Makedonca" - -msgid "Malayalam" -msgstr "Malayamca" - -msgid "Mongolian" -msgstr "Moğolca" - -msgid "Marathi" -msgstr "Marathi dili" - -msgid "Malay" -msgstr "Malayca" - -msgid "Burmese" -msgstr "Birmanca" - -msgid "Norwegian Bokmål" -msgstr "Norveççe Bokmal" - -msgid "Nepali" -msgstr "Nepalce" - -msgid "Dutch" -msgstr "Flemenkçe" - -msgid "Norwegian Nynorsk" -msgstr "Norveççe Nynorsk" - -msgid "Ossetic" -msgstr "Osetçe" - -msgid "Punjabi" -msgstr "Pencapça" - -msgid "Polish" -msgstr "Lehçe" - -msgid "Portuguese" -msgstr "Portekizce" - -msgid "Brazilian Portuguese" -msgstr "Brezilya Portekizcesi" - -msgid "Romanian" -msgstr "Romence" - -msgid "Russian" -msgstr "Rusça" - -msgid "Slovak" -msgstr "Slovakça" - -msgid "Slovenian" -msgstr "Slovence" - -msgid "Albanian" -msgstr "Arnavutça" - -msgid "Serbian" -msgstr "Sırpça" - -msgid "Serbian Latin" -msgstr "Sırpça Latin" - -msgid "Swedish" -msgstr "İsveççe" - -msgid "Swahili" -msgstr "Savahilice" - -msgid "Tamil" -msgstr "Tamilce" - -msgid "Telugu" -msgstr "Telugu dili" - -msgid "Tajik" -msgstr "Tacikçe" - -msgid "Thai" -msgstr "Tayca" - -msgid "Turkmen" -msgstr "Türkmence" - -msgid "Turkish" -msgstr "Türkçe" - -msgid "Tatar" -msgstr "Tatarca" - -msgid "Udmurt" -msgstr "Udmurtça" - -msgid "Uyghur" -msgstr "Uygur" - -msgid "Ukrainian" -msgstr "Ukraynaca" - -msgid "Urdu" -msgstr "Urduca" - -msgid "Uzbek" -msgstr "‎Özbekçe" - -msgid "Vietnamese" -msgstr "Vietnamca" - -msgid "Simplified Chinese" -msgstr "Basitleştirilmiş Çince" - -msgid "Traditional Chinese" -msgstr "Geleneksel Çince" - -msgid "Messages" -msgstr "İletiler" - -msgid "Site Maps" -msgstr "Site Haritaları" - -msgid "Static Files" -msgstr "Sabit Dosyalar" - -msgid "Syndication" -msgstr "Dağıtım" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Bu sayfa numarası bir tamsayı değil" - -msgid "That page number is less than 1" -msgstr "Bu sayfa numarası 1’den az" - -msgid "That page contains no results" -msgstr "Bu sayfa hiç sonuç içermiyor" - -msgid "Enter a valid value." -msgstr "Geçerli bir değer girin." - -msgid "Enter a valid domain name." -msgstr "Geçerli bir etki alanı adı girin." - -msgid "Enter a valid URL." -msgstr "Geçerli bir URL girin." - -msgid "Enter a valid integer." -msgstr "Geçerli bir tamsayı girin." - -msgid "Enter a valid email address." -msgstr "Geçerli bir e-posta adresi girin." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Harflerden, sayılardan, altçizgilerden veya tirelerden oluşan geçerli bir " -"“kısaltma” girin." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Evrensel kod harflerden, sayılardan, altçizgilerden veya tirelerden oluşan " -"geçerli bir “kısaltma” girin." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Geçerli bir %(protocol)s adresi girin." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 veya IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Sadece virgülle ayrılmış rakamlar girin." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Bu değerin %(limit_value)s olduğuna emin olun (şu an %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Bu değerin %(limit_value)s değerinden az veya eşit olduğuna emin olun." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Bu değerin %(limit_value)s değerinden büyük veya eşit olduğuna emin olun." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Bu değerin %(limit_value)s adım boyutunun katları olduğundan emin olun." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Bu değerin %(offset)s değerinden başlayarak %(limit_value)s adım boyutunun " -"katı olduğundan emin olun, örn. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, vb." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu değerin en az %(limit_value)d karaktere sahip olduğuna emin olun (şu an " -"%(show_value)d)." -msgstr[1] "" -"Bu değerin en az %(limit_value)d karaktere sahip olduğuna emin olun (şu an " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu değerin en fazla %(limit_value)d karaktere sahip olduğuna emin olun (şu " -"an %(show_value)d)." -msgstr[1] "" -"Bu değerin en fazla %(limit_value)d karaktere sahip olduğuna emin olun (şu " -"an %(show_value)d)." - -msgid "Enter a number." -msgstr "Bir sayı girin." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Toplamda %(max)s rakamdan daha fazla olmadığından emin olun." -msgstr[1] "Toplamda %(max)s rakamdan daha fazla olmadığından emin olun." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "%(max)s ondalık basamaktan daha fazla olmadığından emin olun." -msgstr[1] "%(max)s ondalık basamaktan daha fazla olmadığından emin olun." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Ondalık noktasından önce %(max)s rakamdan daha fazla olmadığından emin olun." -msgstr[1] "" -"Ondalık noktasından önce %(max)s rakamdan daha fazla olmadığından emin olun." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"“%(extension)s” dosya uzantısına izin verilmiyor. İzin verilen uzantılar: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Boş karakterlere izin verilmiyor." - -msgid "and" -msgstr "ve" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Bu %(field_labels)s alanına sahip %(model_name)s zaten mevcut." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "\"%(name)s\" kısıtlaması ihlal edildi." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r değeri geçerli bir seçim değil." - -msgid "This field cannot be null." -msgstr "Bu alan boş olamaz." - -msgid "This field cannot be blank." -msgstr "Bu alan boş olamaz." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Bu %(field_label)s alanına sahip %(model_name)s zaten mevcut." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s, %(date_field_label)s %(lookup_type)s için benzersiz olmak " -"zorundadır." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Alan türü: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” değeri ya True ya da False olmak zorundadır." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” değeri ya True, False ya da None olmak zorundadır." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Ya True ya da False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Dizgi (%(max_length)s karaktere kadar)" - -msgid "String (unlimited)" -msgstr "Dizgi (sınırsız)" - -msgid "Comma-separated integers" -msgstr "Virgülle ayrılmış tamsayılar" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” değeri geçersiz bir tarih biçimine sahip. Bu YYYY-MM-DD " -"biçiminde olmak zorundadır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” değeri doğru bir biçime (YYYY-MM-DD) sahip ancak bu geçersiz bir " -"tarih." - -msgid "Date (without time)" -msgstr "Tarih (saat olmadan)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” değeri geçersiz bir biçime sahip. YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ] biçiminde olmak zorundadır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” değeri doğru bir biçime (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"sahip ancak bu geçersiz bir tarih/saat." - -msgid "Date (with time)" -msgstr "Tarih (saat olan)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” değeri bir ondalık sayı olmak zorundadır." - -msgid "Decimal number" -msgstr "Ondalık sayı" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” değer geçersiz bir biçime sahip. [DD] [HH:[MM:]]ss[.uuuuuu] " -"biçiminde olmak zorundadır." - -msgid "Duration" -msgstr "Süre" - -msgid "Email address" -msgstr "E-posta adresi" - -msgid "File path" -msgstr "Dosya yolu" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” değeri kayan noktalı bir sayı olmak zorundadır." - -msgid "Floating point number" -msgstr "Kayan noktalı sayı" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” değeri bir tamsayı olmak zorundadır." - -msgid "Integer" -msgstr "Tamsayı" - -msgid "Big (8 byte) integer" -msgstr "Büyük (8 bayt) tamsayı" - -msgid "Small integer" -msgstr "Küçük tamsayı" - -msgid "IPv4 address" -msgstr "IPv4 adresi" - -msgid "IP address" -msgstr "IP adresi" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” değeri ya None, True ya da False olmak zorundadır." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleanl (Ya True, False, ya da None)" - -msgid "Positive big integer" -msgstr "Pozitif büyük tamsayı" - -msgid "Positive integer" -msgstr "Pozitif tamsayı" - -msgid "Positive small integer" -msgstr "Pozitif küçük tamsayı" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Kısaltma (%(max_length)s karaktere kadar)" - -msgid "Text" -msgstr "Metin" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” değeri geçersiz bir biçime sahip. HH:MM[:ss[.uuuuuu]] biçiminde " -"olmak zorundadır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” değeri doğru biçime (HH:MM[:ss[.uuuuuu]]) sahip ancak bu " -"geçersiz bir saat." - -msgid "Time" -msgstr "Saat" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Ham ikili veri" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” geçerli bir UUID değil." - -msgid "Universally unique identifier" -msgstr "Evrensel benzersiz tanımlayıcı" - -msgid "File" -msgstr "Dosya" - -msgid "Image" -msgstr "Resim" - -msgid "A JSON object" -msgstr "JSON nesnesi" - -msgid "Value must be valid JSON." -msgstr "Değer geçerli JSON olmak zorundadır." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(field)s %(value)r olan %(model)s benzeri geçerli bir seçim değil." - -msgid "Foreign Key (type determined by related field)" -msgstr "Dış Anahtar (türü ilgili alana göre belirlenir)" - -msgid "One-to-one relationship" -msgstr "Bire-bir ilişki" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s ilişkisi" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s ilişkileri" - -msgid "Many-to-many relationship" -msgstr "Çoka-çok ilişki" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Bu alan zorunludur." - -msgid "Enter a whole number." -msgstr "Tam bir sayı girin." - -msgid "Enter a valid date." -msgstr "Geçerli bir tarih girin." - -msgid "Enter a valid time." -msgstr "Geçerli bir saat girin." - -msgid "Enter a valid date/time." -msgstr "Geçerli bir tarih/saat girin." - -msgid "Enter a valid duration." -msgstr "Geçerli bir süre girin." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Gün sayıları {min_days} ve {max_days} arasında olmak zorundadır." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Hiç dosya gönderilmedi. Formdaki kodlama türünü kontrol edin." - -msgid "No file was submitted." -msgstr "Hiç dosya gönderilmedi." - -msgid "The submitted file is empty." -msgstr "Gönderilen dosya boş." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Bu dosya adının en fazla %(max)d karaktere sahip olduğundan emin olun (şu an " -"%(length)d)." -msgstr[1] "" -"Bu dosya adının en fazla %(max)d karaktere sahip olduğundan emin olun (şu an " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Lütfen ya bir dosya gönderin ya da temizle işaretleme kutusunu işaretleyin, " -"ikisini aynı anda işaretlemeyin." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Geçerli bir resim gönderin. Gönderdiğiniz dosya ya bir resim değildi ya da " -"bozulmuş bir resimdi." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Geçerli bir seçenek seçin. %(value)s mevcut seçeneklerden biri değil." - -msgid "Enter a list of values." -msgstr "Değerlerin bir listesini girin." - -msgid "Enter a complete value." -msgstr "Tam bir değer girin." - -msgid "Enter a valid UUID." -msgstr "Geçerli bir UUID girin." - -msgid "Enter a valid JSON." -msgstr "Geçerli bir JSON girin." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Gizli alan %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm verileri eksik veya değiştirilmiş. Eksik alanlar: " -"%(field_names)s. Sorun devam ederse bir hata raporu dosyalamanız gerekebilir." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Lütfen en fazla %(num)d form gönderin." -msgstr[1] "Lütfen en fazla %(num)d form gönderin." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Lütfen en az %(num)d form gönderin." -msgstr[1] "Lütfen en az %(num)d form gönderin." - -msgid "Order" -msgstr "Sıralama" - -msgid "Delete" -msgstr "Sil" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Lütfen %(field)s için kopya veriyi düzeltin." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Lütfen %(field)s için benzersiz olmak zorunda olan, kopya veriyi düzeltin." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Lütfen %(date_field)s içindeki %(lookup)s için benzersiz olmak zorunda olan " -"%(field_name)s için kopya veriyi düzeltin." - -msgid "Please correct the duplicate values below." -msgstr "Lütfen aşağıdaki kopya değerleri düzeltin." - -msgid "The inline value did not match the parent instance." -msgstr "Satıriçi değer ana örnek ile eşleşmedi." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Geçerli bir seçenek seçin. Bu seçenek, mevcut seçeneklerden biri değil." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” geçerli bir değer değil." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s, %(current_timezone)s saat dilimi olarak yorumlanamadı; bu " -"belirsiz olabilir ya da mevcut olmayabilir." - -msgid "Clear" -msgstr "Temizle" - -msgid "Currently" -msgstr "Şu anki" - -msgid "Change" -msgstr "Değiştir" - -msgid "Unknown" -msgstr "Bilinmiyor" - -msgid "Yes" -msgstr "Evet" - -msgid "No" -msgstr "Hayır" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "evet,hayır,olabilir" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bayt" -msgstr[1] "%(size)d bayt" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "ö.s." - -msgid "a.m." -msgstr "ö.ö." - -msgid "PM" -msgstr "ÖS" - -msgid "AM" -msgstr "ÖÖ" - -msgid "midnight" -msgstr "gece yarısı" - -msgid "noon" -msgstr "öğlen" - -msgid "Monday" -msgstr "Pazartesi" - -msgid "Tuesday" -msgstr "Salı" - -msgid "Wednesday" -msgstr "Çarşamba" - -msgid "Thursday" -msgstr "Perşembe" - -msgid "Friday" -msgstr "Cuma" - -msgid "Saturday" -msgstr "Cumartesi" - -msgid "Sunday" -msgstr "Pazar" - -msgid "Mon" -msgstr "Pzt" - -msgid "Tue" -msgstr "Sal" - -msgid "Wed" -msgstr "Çrş" - -msgid "Thu" -msgstr "Prş" - -msgid "Fri" -msgstr "Cum" - -msgid "Sat" -msgstr "Cmt" - -msgid "Sun" -msgstr "Paz" - -msgid "January" -msgstr "Ocak" - -msgid "February" -msgstr "Şubat" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Nisan" - -msgid "May" -msgstr "Mayıs" - -msgid "June" -msgstr "Haziran" - -msgid "July" -msgstr "Temmuz" - -msgid "August" -msgstr "Ağustos" - -msgid "September" -msgstr "Eylül" - -msgid "October" -msgstr "Ekim" - -msgid "November" -msgstr "Kasım" - -msgid "December" -msgstr "Aralık" - -msgid "jan" -msgstr "oca" - -msgid "feb" -msgstr "şub" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "nis" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "haz" - -msgid "jul" -msgstr "tem" - -msgid "aug" -msgstr "ağu" - -msgid "sep" -msgstr "eyl" - -msgid "oct" -msgstr "eki" - -msgid "nov" -msgstr "kas" - -msgid "dec" -msgstr "ara" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Oca." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Şub." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Nisan" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayıs" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Haz." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Tem." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ağu." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Eyl." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Eki." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Kas." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Ara." - -msgctxt "alt. month" -msgid "January" -msgstr "Ocak" - -msgctxt "alt. month" -msgid "February" -msgstr "Şubat" - -msgctxt "alt. month" -msgid "March" -msgstr "Mart" - -msgctxt "alt. month" -msgid "April" -msgstr "Nisan" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayıs" - -msgctxt "alt. month" -msgid "June" -msgstr "Haziran" - -msgctxt "alt. month" -msgid "July" -msgstr "Temmuz" - -msgctxt "alt. month" -msgid "August" -msgstr "Ağustos" - -msgctxt "alt. month" -msgid "September" -msgstr "Eylül" - -msgctxt "alt. month" -msgid "October" -msgstr "Ekim" - -msgctxt "alt. month" -msgid "November" -msgstr "Kasım" - -msgctxt "alt. month" -msgid "December" -msgstr "Aralık" - -msgid "This is not a valid IPv6 address." -msgstr "Bu, geçerli bir IPv6 adresi değil." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ya da" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d yıl" -msgstr[1] "%(num)d yıl" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ay" -msgstr[1] "%(num)d ay" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hafta" -msgstr[1] "%(num)d hafta" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d saat" -msgstr[1] "%(num)d saat" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d dakika" -msgstr[1] "%(num)d dakika" - -msgid "Forbidden" -msgstr "Yasak" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF doğrulaması başarısız oldu. İstek iptal edildi." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Bu iletiyi görüyorsunuz çünkü bu HTTPS sitesi, web tarayıcınız tarafından " -"gönderilen “Referer üstbilgisi”ni gerektirir, ancak hiçbir şey gönderilmedi. " -"Bu üstbilgi güvenlik nedenleri için gerekir, tarayıcınızın üçüncü taraf " -"uygulamalar tarafından ele geçirilmediğinden emin olun." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Eğer tarayıcınızı “Referer” üstbilgilerini etkisizleştirmek için " -"yapılandırdıysanız, lütfen bunları, en azından bu site ya da HTTPS " -"bağlantıları veya “aynı-kaynakta” olan istekler için yeniden etkinleştirin." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Eğer etiketi " -"kullanıyorsanız ya da “Referrer-Policy: no-referrer” üstbilgisini dahil " -"ediyorsanız, lütfen bunları kaldırın. CSRF koruması, katı göndereni denetimi " -"yapmak için “Referer” üstbilgisi gerektirir. Gizlilik konusunda endişeniz " -"varsa, üçüncü taraf sitelere bağlantılar için gibi " -"alternatifler kullanın." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Bu iletiyi görüyorsunuz çünkü bu site, formları gönderdiğinizde bir CSRF " -"tanımlama bilgisini gerektirir. Bu tanımlama bilgisi güvenlik nedenleri için " -"gerekir, tarayıcınızın üçüncü taraf uygulamalar tarafından ele " -"geçirilmediğinden emin olun." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Eğer tarayıcınızı tanımlama bilgilerini etkisizleştirmek için " -"yapılandırdıysanız, lütfen bunları, en azından bu site ya da “aynı-kaynakta” " -"olan istekler için yeniden etkinleştirin." - -msgid "More information is available with DEBUG=True." -msgstr "Daha fazla bilgi DEBUG=True ayarı ile mevcut olur." - -msgid "No year specified" -msgstr "Yıl bilgisi belirtilmedi" - -msgid "Date out of range" -msgstr "Tarih aralık dışında" - -msgid "No month specified" -msgstr "Ay bilgisi belirtilmedi" - -msgid "No day specified" -msgstr "Gün bilgisi belirtilmedi" - -msgid "No week specified" -msgstr "Hafta bilgisi belirtilmedi" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Mevcut %(verbose_name_plural)s yok" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Gelecek %(verbose_name_plural)s mevcut değil, çünkü %(class_name)s." -"allow_future değeri False olarak tanımlı." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Geçersiz tarih dizgisi “%(datestr)s” verilen biçim “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Sorguyla eşleşen hiç %(verbose_name)s bulunamadı" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Sayfa “sonuncu” değil, ya da bir tamsayıya dönüştürülemez." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Geçersiz sayfa (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Liste boş ve “%(class_name)s.allow_empty” değeri False." - -msgid "Directory indexes are not allowed here." -msgstr "Dizin indekslerine burada izin verilmiyor." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” mevcut değil" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s indeksi" - -msgid "The install worked successfully! Congratulations!" -msgstr "Yükleme başarılı olarak çalıştı! Tebrikler!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django %(version)s sürümü için yayım notlarını göster" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Bu sayfayı görüyorsunuz çünkü DEBUG=True parametresi ayarlar dosyanızın içindedir ve " -"herhangi bir URL yapılandırmadınız." - -msgid "Django Documentation" -msgstr "Django Belgeleri" - -msgid "Topics, references, & how-to’s" -msgstr "Konular, kaynaklar ve nasıl yapılırlar" - -msgid "Tutorial: A Polling App" -msgstr "Eğitim: Anket Uygulaması" - -msgid "Get started with Django" -msgstr "Django ile başlayın" - -msgid "Django Community" -msgstr "Django Topluluğu" - -msgid "Connect, get help, or contribute" -msgstr "Bağlanın, yardım alın, ya da katkıda bulunun" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tr/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/tr/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tr/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/tr/formats.py deleted file mode 100644 index 806f442..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/tr/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "d F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "d F" -SHORT_DATE_FORMAT = "d M Y" -SHORT_DATETIME_FORMAT = "d M Y H:i" -FIRST_DAY_OF_WEEK = 1 # Pazartesi - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%y-%m-%d", # '06-10-25' - # "%d %B %Y", # '25 Ekim 2006' - # "%d %b. %Y", # '25 Eki. 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index 843b012..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index 84d06ef..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,1211 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -# v_ildar , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "Гарәп теле" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Азәрбайҗан" - -msgid "Bulgarian" -msgstr "Болгар теле" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "Бенгалия теле" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "Босния теле" - -msgid "Catalan" -msgstr "Каталан теле" - -msgid "Czech" -msgstr "Чех теле" - -msgid "Welsh" -msgstr "Уэльс теле" - -msgid "Danish" -msgstr "Дания теле" - -msgid "German" -msgstr "Алман теле" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Грек теле" - -msgid "English" -msgstr "Инглиз теле" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Британ инглиз теле" - -msgid "Esperanto" -msgstr "Эсперанто теле" - -msgid "Spanish" -msgstr "Испан теле" - -msgid "Argentinian Spanish" -msgstr "Аргентина испан теле" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Мексикалы испан" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуалы испан" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "Эстон теле" - -msgid "Basque" -msgstr "Баск теле" - -msgid "Persian" -msgstr "Фарсы теле" - -msgid "Finnish" -msgstr "Финн теле" - -msgid "French" -msgstr "Француз теле" - -msgid "Frisian" -msgstr "Фриз теле" - -msgid "Irish" -msgstr "Ирланд теле" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Галлий теле" - -msgid "Hebrew" -msgstr "Яһүд теле" - -msgid "Hindi" -msgstr "Хинд теле" - -msgid "Croatian" -msgstr "Хорват теле" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Венгр теле" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Индонезия теле" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Исланд теле" - -msgid "Italian" -msgstr "Итальян теле" - -msgid "Japanese" -msgstr "Япон теле" - -msgid "Georgian" -msgstr "Грузин теле" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Казах теле" - -msgid "Khmer" -msgstr "Кхмер теле" - -msgid "Kannada" -msgstr "Каннада теле" - -msgid "Korean" -msgstr "Корея теле" - -msgid "Luxembourgish" -msgstr "Люксембург теле" - -msgid "Lithuanian" -msgstr "Литвалылар теле" - -msgid "Latvian" -msgstr "Латвия теле" - -msgid "Macedonian" -msgstr "Македон теле" - -msgid "Malayalam" -msgstr "Малаялам теле" - -msgid "Mongolian" -msgstr "Монгол теле" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "Голланд теле" - -msgid "Norwegian Nynorsk" -msgstr "Норвегиялеләр (Нюнорск) теле" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Паджаби теле" - -msgid "Polish" -msgstr "Поляк теле" - -msgid "Portuguese" -msgstr "Португал теле" - -msgid "Brazilian Portuguese" -msgstr "Бразилия португал теле" - -msgid "Romanian" -msgstr "Румын теле" - -msgid "Russian" -msgstr "Рус теле" - -msgid "Slovak" -msgstr "Словак теле" - -msgid "Slovenian" -msgstr "Словен теле" - -msgid "Albanian" -msgstr "Албан теле" - -msgid "Serbian" -msgstr "Серб теле" - -msgid "Serbian Latin" -msgstr "Серб теле (латин алфавиты)" - -msgid "Swedish" -msgstr "Швед теле" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "Тамиль теле" - -msgid "Telugu" -msgstr "Телугу теле" - -msgid "Thai" -msgstr "Тай теле" - -msgid "Turkish" -msgstr "Төрек теле" - -msgid "Tatar" -msgstr "Татар теле" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "Украин теле" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Вьетнам теле" - -msgid "Simplified Chinese" -msgstr "Гадиләштерелгән кытай теле" - -msgid "Traditional Chinese" -msgstr "Традицион кытай теле" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Дөрес кыйммәтне кертегез." - -msgid "Enter a valid URL." -msgstr "Рөхсәт ителгән URLны кертегез." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Дөрес эл. почта адресны кертегез." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Рөхсәт ителгән IPv4 адресын кертегез." - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Өтерләр белән бүленгән сан билгеләрен кертегез" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Бу кыйммәтнең %(limit_value)s булуын тикшерегез (хәзер ул - %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Бу кыйммәтнең %(limit_value)s карата кечерәк яки тигез булуын тикшерегез." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Бу кыйммәтнең %(limit_value)s карата зуррак яки тигез булуын тикшерегез." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -msgid "Enter a number." -msgstr "Сан кертегез." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "һәм" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Бу кырның кыйммәте NULL булырга тиеш түгел." - -msgid "This field cannot be blank." -msgstr "Бу кыр буш булырга тиеш түгел." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Мондый %(field_label)s белән булган %(model_name)s инде бар." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s типтагы кыр" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Логик (True яисә False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Юл (күп дигәндә %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Өтерләр белән бүленгән бөтен саннар" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Дата (вакыт күрсәтмәсе булмаган)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Дата (вакыт күрсәтмәсе белән)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Унарлы вакланма" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Эл. почта" - -msgid "File path" -msgstr "Файл юлы" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Күчерелүчән өтер белән булган сан" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Бөтен сан" - -msgid "Big (8 byte) integer" -msgstr "Зур бөтен (8 байт)" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "IP-адрес" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Логик (True, False я None)" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Вакыт" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Тыш ачкыч (тип бәйле кыр буенча билгеләнгән)" - -msgid "One-to-one relationship" -msgstr "\"Бергә бер\" элемтәсе" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "\"Күпкә куп\" элемтәсе" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Мәҗбүри кыр." - -msgid "Enter a whole number." -msgstr "Бөтен сан кертегез." - -msgid "Enter a valid date." -msgstr "Рөхсәт ителгән датаны кертегез." - -msgid "Enter a valid time." -msgstr "Рөхсәт ителгән вакытны кертегез." - -msgid "Enter a valid date/time." -msgstr "Рөхсәт ителгән дата һәм вакытны кертегез." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Һишбер файл җибәрелмәгән. Форма кодлавын тикшерегез." - -msgid "No file was submitted." -msgstr "Һишбер файл җибәрелмәгән." - -msgid "The submitted file is empty." -msgstr "Җибәрелгән файл буш." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Зинһар, җибәрегез файлны яисә бушайту байракчасын билгеләгез, икесен бергә " -"түгел." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Рөхсәт ителгән рәсемне йөкләгез. Сез йөкләгән файл рәсем түгел яисә бозылган." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Дөрес тәкъдимне сайлагыз. Рөхсәт ителгән кыйммәтләр арасында %(value)s юк. " - -msgid "Enter a list of values." -msgstr "Кыйммәтләр исемлеген кертегез." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "Тәртип" - -msgid "Delete" -msgstr "Бетерергә" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Зинһар, %(field)s кырындагы кабатлана торган кыйммәтне төзәтегез." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Зинһар, %(field)s кырындагы кыйммәтне төзәтегез, ул уникаль булырга тиеш." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Зинһар, %(field_name)s кырындагы кыйммәтне төзәтегез, ул %(date_field)s " -"кырындагы %(lookup)s өчен уникаль булырга тиеш." - -msgid "Please correct the duplicate values below." -msgstr "Зинһар, астагы кабатлана торган кыйммәтләрне төзәтегез." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Дөрес тәкъдимне сайлагыз. Рөхсәт ителгән кыйммәтләр арасында сезнең вариант " -"юк." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Бушайтырга" - -msgid "Currently" -msgstr "Хәзерге вакытта" - -msgid "Change" -msgstr "Үзгәртергә" - -msgid "Unknown" -msgstr "Билгесез" - -msgid "Yes" -msgstr "Әйе" - -msgid "No" -msgstr "Юк" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "әйе,юк,бәлки" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "т.с." - -msgid "a.m." -msgstr "т.к." - -msgid "PM" -msgstr "ТС" - -msgid "AM" -msgstr "ТК" - -msgid "midnight" -msgstr "төн уртасы" - -msgid "noon" -msgstr "көн уртасы" - -msgid "Monday" -msgstr "Дүшәмбе" - -msgid "Tuesday" -msgstr "Сишәмбе" - -msgid "Wednesday" -msgstr "Чәршәмбе" - -msgid "Thursday" -msgstr "Пәнҗешәмбе" - -msgid "Friday" -msgstr "Җомга" - -msgid "Saturday" -msgstr "Шимбә" - -msgid "Sunday" -msgstr "Якшәмбе" - -msgid "Mon" -msgstr "Дүш" - -msgid "Tue" -msgstr "Сиш" - -msgid "Wed" -msgstr "Чәр" - -msgid "Thu" -msgstr "Пнҗ" - -msgid "Fri" -msgstr "Җом" - -msgid "Sat" -msgstr "Шим" - -msgid "Sun" -msgstr "Якш" - -msgid "January" -msgstr "Гыйнвар" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgid "jan" -msgstr "гый" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "июн" - -msgid "jul" -msgstr "июл" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сен" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноя" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Гый." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апрель" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Июнь" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Июль" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Сен." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноя." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "гыйнвар" - -msgctxt "alt. month" -msgid "February" -msgstr "февраль" - -msgctxt "alt. month" -msgid "March" -msgstr "март" - -msgctxt "alt. month" -msgid "April" -msgstr "апрель" - -msgctxt "alt. month" -msgid "May" -msgstr "май" - -msgctxt "alt. month" -msgid "June" -msgstr "июнь" - -msgctxt "alt. month" -msgid "July" -msgstr "июль" - -msgctxt "alt. month" -msgid "August" -msgstr "август" - -msgctxt "alt. month" -msgid "September" -msgstr "сентябрь" - -msgctxt "alt. month" -msgid "October" -msgstr "октябрь" - -msgctxt "alt. month" -msgid "November" -msgstr "ноябрь" - -msgctxt "alt. month" -msgid "December" -msgstr "декабрь" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "я" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Ел билгеләнмәгән" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Ай билгеләнмәгән" - -msgid "No day specified" -msgstr "Көн билгеләнмәгән" - -msgid "No week specified" -msgstr "Атна билгеләнмәгән" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Файдалана алырлык %(verbose_name_plural)s юк" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(class_name)s.allow_future False булуы сәбәпле, киләсе " -"%(verbose_name_plural)s файдалана алырлык түгел" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Таләпкә туры килгән %(verbose_name)s табылмаган" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/udm/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index 0c7ab6d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index 68c2bc7..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,1197 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Udmurt (http://www.transifex.com/django/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Африкаанс" - -msgid "Arabic" -msgstr "Араб" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Азербайджан" - -msgid "Bulgarian" -msgstr "Болгар" - -msgid "Belarusian" -msgstr "Беларус" - -msgid "Bengali" -msgstr "Бенгал" - -msgid "Breton" -msgstr "Бретон" - -msgid "Bosnian" -msgstr "Босниец" - -msgid "Catalan" -msgstr "Каталан" - -msgid "Czech" -msgstr "Чех" - -msgid "Welsh" -msgstr "Уэльс" - -msgid "Danish" -msgstr "Датчан" - -msgid "German" -msgstr "Немец" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Грек" - -msgid "English" -msgstr "Англи" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Британиысь англи" - -msgid "Esperanto" -msgstr "Эсперанто" - -msgid "Spanish" -msgstr "Испан" - -msgid "Argentinian Spanish" -msgstr "Аргентинаысь испан" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Мексикаысь испан" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуаысь испан" - -msgid "Venezuelan Spanish" -msgstr "Венесуэлаысь испан" - -msgid "Estonian" -msgstr "Эстон" - -msgid "Basque" -msgstr "Баск" - -msgid "Persian" -msgstr "Перс" - -msgid "Finnish" -msgstr "Финн" - -msgid "French" -msgstr "Француз" - -msgid "Frisian" -msgstr "Фриз" - -msgid "Irish" -msgstr "Ирланд" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Галисий" - -msgid "Hebrew" -msgstr "Иврит" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Хорват" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Венгер" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Интерлингва" - -msgid "Indonesian" -msgstr "Индонези" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Исланд" - -msgid "Italian" -msgstr "Итальян" - -msgid "Japanese" -msgstr "Япон" - -msgid "Georgian" -msgstr "Грузин" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Казах" - -msgid "Khmer" -msgstr "Кхмер" - -msgid "Kannada" -msgstr "Каннада" - -msgid "Korean" -msgstr "Корей" - -msgid "Luxembourgish" -msgstr "Люксембург" - -msgid "Lithuanian" -msgstr "Литва" - -msgid "Latvian" -msgstr "Латвий" - -msgid "Macedonian" -msgstr "Македон" - -msgid "Malayalam" -msgstr "Малаялам" - -msgid "Mongolian" -msgstr "Монгол" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Непал" - -msgid "Dutch" -msgstr "Голланд" - -msgid "Norwegian Nynorsk" -msgstr "Норвег (нюнорск)" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Панджаби" - -msgid "Polish" -msgstr "Поляк" - -msgid "Portuguese" -msgstr "Португал" - -msgid "Brazilian Portuguese" -msgstr "Бразилиысь португал" - -msgid "Romanian" -msgstr "Румын" - -msgid "Russian" -msgstr "Ӟуч" - -msgid "Slovak" -msgstr "Словак" - -msgid "Slovenian" -msgstr "Словен" - -msgid "Albanian" -msgstr "Албан" - -msgid "Serbian" -msgstr "Серб" - -msgid "Serbian Latin" -msgstr "Серб (латиницаен)" - -msgid "Swedish" -msgstr "Швед" - -msgid "Swahili" -msgstr "Суахили" - -msgid "Tamil" -msgstr "Тамиль" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Thai" -msgstr "Тай" - -msgid "Turkish" -msgstr "Турок" - -msgid "Tatar" -msgstr "Бигер" - -msgid "Udmurt" -msgstr "Удмурт" - -msgid "Ukrainian" -msgstr "Украин" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Вьетнам" - -msgid "Simplified Chinese" -msgstr "Китай (капчиятэм)" - -msgid "Traditional Chinese" -msgstr "Китай (традици)" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Тазэ шонер гожтэ." - -msgid "Enter a valid URL." -msgstr "Шонер URL гожтэ." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Электорн почта адресэз шонер гожтэ" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Шонер IPv4-адрес гожтэ." - -msgid "Enter a valid IPv6 address." -msgstr "Шонер IPv6-адрес гожтэ." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Шонер IPv4 яке IPv6 адрес гожтэ." - -msgid "Enter only digits separated by commas." -msgstr "Запятойёсын висъям лыдпусъёсты гожтэ" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Эскере, та %(limit_value)s шуыса. Али татын %(show_value)s." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Талы %(limit_value)s-лэсь бадӟымгес луыны уг яра." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Талы %(limit_value)s-лэсь ӧжытгес луыны уг яра." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -msgid "Enter a number." -msgstr "Лыд гожтэ." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "но" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Та NULL луыны уг яра." - -msgid "This field cannot be blank." -msgstr "Та буш луыны уг яра." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Таӵе %(field_label)s-ен %(model_name)s вань ини." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s типъем бусы" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "True яке False" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Чур (%(max_length)s пусозь кузьда)" - -msgid "Comma-separated integers" -msgstr "Запятоен висъям быдэс лыдъёс" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Дата (час-минут пусйытэк)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Дата но час-минут" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Десятичной лыд." - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Электрон почта адрес" - -msgid "File path" -msgstr "Файллэн нимыз" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Вещественной лыд" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "целой" - -msgid "Big (8 byte) integer" -msgstr "Бадӟым (8 байтъем) целой лыд" - -msgid "IPv4 address" -msgstr "IPv4 адрес" - -msgid "IP address" -msgstr "IP адрес" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "True, False яке None" - -msgid "Positive integer" -msgstr "Целой, нольлэсь бадӟым лыд" - -msgid "Positive small integer" -msgstr "Нольлэсь бадӟым пичи целой лыд" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Компьютерной ним (%(max_length)s пусозь кузьда)" - -msgid "Small integer" -msgstr "Пичи целой лыд" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Час-минут" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Суред" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Мукет моделен герӟет (тип герӟано бусыя валамын)." - -msgid "One-to-one relationship" -msgstr "Одӥг-одӥг герӟет" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Трос-трос герӟет" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Та клуэ." - -msgid "Enter a whole number." -msgstr "Целой лыд гожтэ." - -msgid "Enter a valid date." -msgstr "Шонер дата гожтэ." - -msgid "Enter a valid time." -msgstr "Шонер час-минут гожтэ." - -msgid "Enter a valid date/time." -msgstr "Шонер дата но час-минут гожтэ." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Одӥг файл но лэзьымтэ. Формалэсь код." - -msgid "No file was submitted." -msgstr "Файл лэземын ӧвӧл." - -msgid "The submitted file is empty." -msgstr "Лэзем файл буш." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Файл лэзе яке файл ӵушоно шуыса пусъе, огдыръя соиз но, таиз но уг яра." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "Суред лэзе. Тӥляд файлды лэзьымтэ яке со суред ӧвӧл." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Шонер вариант быръе. %(value)s вариантъёс пӧлын ӧвӧл." - -msgid "Enter a list of values." -msgstr "Список лэзе." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "Рад" - -msgid "Delete" -msgstr "Ӵушоно" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Буш кароно" - -msgid "Currently" -msgstr "Али" - -msgid "Change" -msgstr "Тупатъяно" - -msgid "Unknown" -msgstr "Тодымтэ" - -msgid "Yes" -msgstr "Бен" - -msgid "No" -msgstr "Ӧвӧл" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "бен,ӧвӧл,уг тодӥськы" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s МБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "лымшор бере" - -msgid "a.m." -msgstr "лымшор азе" - -msgid "PM" -msgstr "лымшор бере" - -msgid "AM" -msgstr "лымшор азе" - -msgid "midnight" -msgstr "уйшор" - -msgid "noon" -msgstr "лымшор" - -msgid "Monday" -msgstr "Вордӥськон" - -msgid "Tuesday" -msgstr "Пуксён" - -msgid "Wednesday" -msgstr "Вирнунал" - -msgid "Thursday" -msgstr "Покчиарня" - -msgid "Friday" -msgstr "Удмуртарня" - -msgid "Saturday" -msgstr "Кӧснунал" - -msgid "Sunday" -msgstr "Арнянунал" - -msgid "Mon" -msgstr "врд" - -msgid "Tue" -msgstr "пкс" - -msgid "Wed" -msgstr "врн" - -msgid "Thu" -msgstr "пкч" - -msgid "Fri" -msgstr "удм" - -msgid "Sat" -msgstr "ксн" - -msgid "Sun" -msgstr "арн" - -msgid "January" -msgstr "толшор" - -msgid "February" -msgstr "тулыспал" - -msgid "March" -msgstr "южтолэзь" - -msgid "April" -msgstr "оштолэзь" - -msgid "May" -msgstr "куартолэзь" - -msgid "June" -msgstr "инвожо" - -msgid "July" -msgstr "пӧсьтолэзь" - -msgid "August" -msgstr "гудырикошкон" - -msgid "September" -msgstr "куарусён" - -msgid "October" -msgstr "коньывуон" - -msgid "November" -msgstr "шуркынмон" - -msgid "December" -msgstr "толсур" - -msgid "jan" -msgstr "тшт" - -msgid "feb" -msgstr "тпт" - -msgid "mar" -msgstr "южт" - -msgid "apr" -msgstr "ошт" - -msgid "may" -msgstr "крт" - -msgid "jun" -msgstr "ивт" - -msgid "jul" -msgstr "пст" - -msgid "aug" -msgstr "гкт" - -msgid "sep" -msgstr "кут" - -msgid "oct" -msgstr "квт" - -msgid "nov" -msgstr "шкт" - -msgid "dec" -msgstr "тст" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "тшт" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "тпт" - -msgctxt "abbrev. month" -msgid "March" -msgstr "южт" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ошт" - -msgctxt "abbrev. month" -msgid "May" -msgstr "крт" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ивт" - -msgctxt "abbrev. month" -msgid "July" -msgstr "пст" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "гкт" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "кут" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "квт" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "шкт" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "тст" - -msgctxt "alt. month" -msgid "January" -msgstr "толшоре" - -msgctxt "alt. month" -msgid "February" -msgstr "тулыспалэ" - -msgctxt "alt. month" -msgid "March" -msgstr "южтолэзе" - -msgctxt "alt. month" -msgid "April" -msgstr "оштолэзе" - -msgctxt "alt. month" -msgid "May" -msgstr "куартолэзе" - -msgctxt "alt. month" -msgid "June" -msgstr "инвожое" - -msgctxt "alt. month" -msgid "July" -msgstr "пӧсьтолэзе" - -msgctxt "alt. month" -msgid "August" -msgstr "гудырикошконэ" - -msgctxt "alt. month" -msgid "September" -msgstr "куарусёнэ" - -msgctxt "alt. month" -msgid "October" -msgstr "коньывуонэ" - -msgctxt "alt. month" -msgid "November" -msgstr "шуркынмонэ" - -msgctxt "alt. month" -msgid "December" -msgstr "толсуре" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "яке" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Папкаослэсь пуштроссэс татын учкыны уг яра." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s папкалэн пушторсэз" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ug/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index ce10d7d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ug/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index daa3973..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,1353 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# abdl erkin <84247764@qq.com>, 2018 -# Abduqadir Abliz , 2023-2024 -# Abduqadir Abliz , 2023 -# Azat, 2023 -# Murat Orhun , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 06:49+0000\n" -"Last-Translator: Abduqadir Abliz , 2023-2024\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "ئافرىكانسچە" - -msgid "Arabic" -msgstr "ئەرەبچە" - -msgid "Algerian Arabic" -msgstr "ئالجىرىيە ئەرەپچىسى" - -msgid "Asturian" -msgstr "ئاستۇرىچە" - -msgid "Azerbaijani" -msgstr "ئەزەربەيجانچە" - -msgid "Bulgarian" -msgstr "بۇلغارچە" - -msgid "Belarusian" -msgstr "بېلورۇسىچە" - -msgid "Bengali" -msgstr "بېنگالچە" - -msgid "Breton" -msgstr "بىرېتونچە" - -msgid "Bosnian" -msgstr "بوسنىيەچە" - -msgid "Catalan" -msgstr "كاتالانچە" - -msgid "Central Kurdish (Sorani)" -msgstr "مەركىزى كۇردچە ( سورانى) " - -msgid "Czech" -msgstr "چېخچە" - -msgid "Welsh" -msgstr "ۋېلشچە" - -msgid "Danish" -msgstr "دانىشچە" - -msgid "German" -msgstr "گىرمانچە" - -msgid "Lower Sorbian" -msgstr "تۆۋەن سوربچە" - -msgid "Greek" -msgstr "گىرېكچە" - -msgid "English" -msgstr "ئىنگلىزچە" - -msgid "Australian English" -msgstr "" -"ئاۋىستىرالىيە ئىنگلزچىسى\n" -" " - -msgid "British English" -msgstr "ئەنگىلىيە ئىنگىلىزچىسى" - -msgid "Esperanto" -msgstr "دۇنيا تىلى" - -msgid "Spanish" -msgstr "ئىسپانچە" - -msgid "Argentinian Spanish" -msgstr "ئارگېنتىنا ئىسپانچىسى" - -msgid "Colombian Spanish" -msgstr "كولۇمبىيە ئىسپانچىسى" - -msgid "Mexican Spanish" -msgstr "مېكسىكا ئىسپانچىسى" - -msgid "Nicaraguan Spanish" -msgstr "نىكاراگۇئا ئىسپاچىسى" - -msgid "Venezuelan Spanish" -msgstr "ۋېنېزۇئېلا ئىسپانچىسى" - -msgid "Estonian" -msgstr "ئېستونىيەچە" - -msgid "Basque" -msgstr "بەسىكچە" - -msgid "Persian" -msgstr "پارىسچە" - -msgid "Finnish" -msgstr "ڧىنلانىدچە" - -msgid "French" -msgstr "ڧىرانسۇزچە" - -msgid "Frisian" -msgstr "فىرىزىيەچە" - -msgid "Irish" -msgstr "ئىرېلاندىيەچە" - -msgid "Scottish Gaelic" -msgstr "شوتلاندىيەچە" - -msgid "Galician" -msgstr "گالىچىيەچە" - -msgid "Hebrew" -msgstr "ئىبرانىچە" - -msgid "Hindi" -msgstr "ھىندىچە" - -msgid "Croatian" -msgstr "كىرودىيەچە" - -msgid "Upper Sorbian" -msgstr "يۇقىرى سوربچە" - -msgid "Hungarian" -msgstr "ماجارچە" - -msgid "Armenian" -msgstr "ئارمىنىيەچە" - -msgid "Interlingua" -msgstr "خەلقئارالىق تىل" - -msgid "Indonesian" -msgstr "ھىندىنوزىيەچە" - -msgid "Igbo" -msgstr "ئىبوچە" - -msgid "Ido" -msgstr "ئىيدوچە" - -msgid "Icelandic" -msgstr "ئىسلاندىيەچە" - -msgid "Italian" -msgstr "ئىتالىيەچە" - -msgid "Japanese" -msgstr "ياپونچە" - -msgid "Georgian" -msgstr "گرۇزىيەچە" - -msgid "Kabyle" -msgstr "كەبىيلچە" - -msgid "Kazakh" -msgstr "قازاقچە" - -msgid "Khmer" -msgstr "كامىيرچە" - -msgid "Kannada" -msgstr "كانناداچە" - -msgid "Korean" -msgstr "كورىيەچە" - -msgid "Kyrgyz" -msgstr "قىرغىزچە" - -msgid "Luxembourgish" -msgstr "لىيۇكسېمبۇرگچە" - -msgid "Lithuanian" -msgstr "لىتۋاچە" - -msgid "Latvian" -msgstr "لاتۋىيەچە" - -msgid "Macedonian" -msgstr "ماكېدونىيەچە" - -msgid "Malayalam" -msgstr "مالىيالامچە" - -msgid "Mongolian" -msgstr "مۇڭغۇلچە" - -msgid "Marathi" -msgstr "ماراتىچە" - -msgid "Malay" -msgstr "مالايچە" - -msgid "Burmese" -msgstr "بېرمىچە" - -msgid "Norwegian Bokmål" -msgstr "نورۋېگىيە بوكمىلچىسى" - -msgid "Nepali" -msgstr "نېپالچە" - -msgid "Dutch" -msgstr "گوللاندىيەچە" - -msgid "Norwegian Nynorsk" -msgstr "نورۋېگىيە نىنورسكچىسى" - -msgid "Ossetic" -msgstr "ئوسېتچە" - -msgid "Punjabi" -msgstr "پۇنجابىچە" - -msgid "Polish" -msgstr "پولشاچە" - -msgid "Portuguese" -msgstr "پورتۇگالچە" - -msgid "Brazilian Portuguese" -msgstr "بىرازىلىيە پورتۇگالچىسى" - -msgid "Romanian" -msgstr "رومەينىيەچە" - -msgid "Russian" -msgstr "رۇسچە" - -msgid "Slovak" -msgstr "سلوۋاكىيەچە" - -msgid "Slovenian" -msgstr "سىلوۋېنىيەچە" - -msgid "Albanian" -msgstr "ئالبانىيەچە" - -msgid "Serbian" -msgstr "سېربىيەچە" - -msgid "Serbian Latin" -msgstr "سېربىيە لاتىنچىسى" - -msgid "Swedish" -msgstr "شىۋىتسىيەچە" - -msgid "Swahili" -msgstr "سۋاھىلچە" - -msgid "Tamil" -msgstr "تامىلچە" - -msgid "Telugu" -msgstr "تېلۇگۇ" - -msgid "Tajik" -msgstr "تاجىكچە" - -msgid "Thai" -msgstr "تايلاندچە" - -msgid "Turkmen" -msgstr "تۈركمەنچە" - -msgid "Turkish" -msgstr "تۈركچە" - -msgid "Tatar" -msgstr "تاتارچە" - -msgid "Udmurt" -msgstr "ئۇدمۇرتچە" - -msgid "Uyghur" -msgstr "ئۇيغۇرچە" - -msgid "Ukrainian" -msgstr "ئۇكرائىنچە" - -msgid "Urdu" -msgstr "ئوردۇچە" - -msgid "Uzbek" -msgstr "ئۆزبەكچە" - -msgid "Vietnamese" -msgstr "ۋېيتنامچە" - -msgid "Simplified Chinese" -msgstr "خەنزۇچە" - -msgid "Traditional Chinese" -msgstr "ئەنئەنىۋى خەنزۇچىسى" - -msgid "Messages" -msgstr "قىسقا ئۇچۇر" - -msgid "Site Maps" -msgstr "بېكەت خەرىتىسى" - -msgid "Static Files" -msgstr "سىتاتىك ھۆججەت" - -msgid "Syndication" -msgstr "تەشكىللىنىش" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "بەت نومۇرى پۈتۈن سان ئەمەس" - -msgid "That page number is less than 1" -msgstr "بەت نومۇرى 1 دىن كىچىك" - -msgid "That page contains no results" -msgstr "ئۇ بەتتە ھېچقانداق نەتىجە يوق" - -msgid "Enter a valid value." -msgstr "بىر ئىناۋەتلىك قىممەتنى تولدۇرۇڭ" - -msgid "Enter a valid domain name." -msgstr "ئىناۋەتلىك دائىرە ئىسمى كىرگۈزۈلىدۇ." - -msgid "Enter a valid URL." -msgstr "ئىناۋەتلىك URL نى تولدۇرۇڭ" - -msgid "Enter a valid integer." -msgstr "ئىناۋەتلىك پۈتۈن سان تولدۇرۇڭ" - -msgid "Enter a valid email address." -msgstr "ئىناۋەتلىك ئېلخەت ئادرېسىنى كىرگۈزۈڭ." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"ھەرپ ، سان ، ئاستى سىزىق ياكى سىزىقچىلاردىن تەركىب تاپقان ئۈنۈملۈك «سىلاگ» " -"نى كىرگۈزۈڭ." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"يۇنىكودلۇق ھەرپ، سان، ئاستى سىزىق ياكى سىزىقچىلاردىن تەركىب تاپقان ئۈنۈملۈك " -"«slug» نى كىرگۈزۈڭ." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "ئىناۋەتلىك %(protocol)sئادرېسى كىرگۈزۈلىدۇ." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ياكى IPv6" - -msgid "Enter only digits separated by commas." -msgstr "پەش ئارقىلىق ئايرىلغان رەقەملەرنىلا كىرگۈزۈڭ." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"بۇ قىممەتنىڭ %(limit_value)s بولىشىغا كاپالەتلىك قىلىڭ ( ھازىر " -"%(show_value)s)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"بۇ قىممەتنىڭ %(limit_value)s دىن تۆۋەن ياكى تەڭ بولۇشىغا كاپالەتلىك قىلىڭ" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"بۇ قىممەتنىڭ %(limit_value)s دىن چوڭ ياكى تەڭ بولۇشىغا كاپالەتلىك قىلىڭ" - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "بۇ قىممەتنىڭ %(limit_value)s نىڭ كۆپەيتمىسى بولىشىغا كاپالەتلىك قىلىڭ" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"بۇ قىممەت كۆپ قەدەم باسقۇچلۇق بولسۇن %(limit_value)s، %(offset)s دىن " -"باشلىنىپ، مەسىلەن %(offset)s، %(valid_value1)s، %(valid_value2)s ۋە باشقىلار." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"بۇ قىممەتنىڭ كەم دېگەندە %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ھازىر %(show_value)d بار)." -msgstr[1] "" -"بۇ قىممەتنىڭ كەم دېگەندە %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ھازىر %(show_value)d بار)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"بۇ قىممەتنىڭ ئەڭ كۆپ بولغاندا %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ھازىر %(show_value)d بار)." -msgstr[1] "" -"بۇ قىممەتنىڭ ئەڭ كۆپ بولغاندا %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ئۇنىڭدا %(show_value)d بار). " - -msgid "Enter a number." -msgstr "سان كىرگۈزۈڭ." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "جەمى 4%(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." -msgstr[1] "جەمى %(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "%(max)s ئونلۇق ئورۇندىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." -msgstr[1] "%(max)s ئونلۇق ئورۇندىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"ئونلۇق نۇقتىدىن ئىلگىرى %(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." -msgstr[1] "" -"ئونلۇق نۇقتىدىن ئىلگىرى %(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"ھۆججەت كېڭەيتىشكە «%(extension)s» رۇخسەت قىلىنمايدۇ. رۇخسەت قىلىنغان " -"كېڭەيتىلمە: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "بوش ھەرپلەرگە رۇخسەت قىلىنمايدۇ." - -msgid "and" -msgstr "ۋە" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s بىلەن بۇ %(field_labels)s مەۋجۇت." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "«%(name)s» چەكلىمىسى بۇزۇلدى." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "قىممەت %(value)r ئىناۋەتسىز." - -msgid "This field cannot be null." -msgstr "بۇ ئورۇننى بوش قويۇشقا بولمايدۇ" - -msgid "This field cannot be blank." -msgstr "بۇ ئورۇننى بوش قويۇشقا بولمايدۇ" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "بۇ %(field_label)s بىلەن %(model_name)s مەۋجۇت." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s چوقۇم %(date_field_label)s %(lookup_type)s ئۈچۈن بىردىنبىر " -"بولۇشى كېرەك." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "تىپ تۈرى: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "«%(value)s» قىممىتى چوقۇم True ياكى False بولۇشى كېرەك." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "«%(value)s» قىممىتى چوقۇم True ، False ياكى None بولۇشى كېرەك." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (True ياكى False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "(%(max_length)s گە قەدەر ئۇزۇنلۇقتىكى) ھەرپ-بەلگە" - -msgid "String (unlimited)" -msgstr "ھەرپ-بەلگە ( ئۇزۇنلۇققا چەكلىمە يوق)" - -msgid "Comma-separated integers" -msgstr "پەش بىلەن ئايرىلغان پۈتۈن سان" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"«%(value)s» قىممىتى ئىناۋەتسىز ۋاقىت فورماتىدا. ئۇ چوقۇم YYYY-MM-DD شەكلىدە " -"بولۇشى كېرەك." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"«%(value)s» قىممىتىنىڭ توغرا فورماتى (YYYY-MM-DD) بار ، ئەمما ئۇ ۋاقىت " -"ئىناۋەتسىز." - -msgid "Date (without time)" -msgstr "چېسلا (سائەت مىنۇت يوق)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"«%(value)s» قىممىتى ئىناۋەتسىز. ئۇ چوقۇم YYYY-MM-DD HH: MM [: ss [.uuuuuu]] " -"[TZ] شەكلىدە بولۇشى كېرەك." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"«%(value)s» قىممىتىنىڭ توغرا فورماتى بار (YYYY-MM-DD HH: MM [: ss [.uuuuuu]] " -"[TZ]) ئەمما ئۇ ئىناۋەتسىز كۈن / ۋاقىت." - -msgid "Date (with time)" -msgstr "چېسلا (ۋاقىت بىلەن)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "«%(value)s» قىممىتى چوقۇم پۈتۈن سان بولۇشى كېرەك." - -msgid "Decimal number" -msgstr "ئونلۇق سان" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"«%(value)s» قىممىتى ئىناۋەتسىز. ئۇ چوقۇم [DD] [[HH:] MM:] ss [.uuuuuu] " -"شەكلىدە بولۇشى كېرەك." - -msgid "Duration" -msgstr "داۋاملىشىش ۋاقتى" - -msgid "Email address" -msgstr "ئېلخەت ئادرېسى" - -msgid "File path" -msgstr "ھۆججەت يولى" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "«%(value)s» قىممىتى چوقۇم لەيلىمە چېكىتلىك مىقتار بولۇشى كېرەك." - -msgid "Floating point number" -msgstr "كەسرىلىك سان نومۇر" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "«%(value)s» قىممىتى چوقۇم پۈتۈن سان بولۇشى كېرەك." - -msgid "Integer" -msgstr "پۈتۈن سان" - -msgid "Big (8 byte) integer" -msgstr "چوڭ (8 بايىت) پۈتۈن سان" - -msgid "Small integer" -msgstr "كىچىك پۈتۈن سان" - -msgid "IPv4 address" -msgstr "IPv4 ئادرېسى" - -msgid "IP address" -msgstr "IP ئادرېسى" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "«%(value)s» قىممىتى چوقۇم True ، False ياكى None بولۇشى كېرەك." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (True ياكى False)" - -msgid "Positive big integer" -msgstr "مۇسبەت چوڭ پۈتۈن سان" - -msgid "Positive integer" -msgstr "مۇسبەت پۈتۈن سان" - -msgid "Positive small integer" -msgstr "مۇسبەت كىچىك پۈتۈن سان" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (كۆپ بولغاندا %(max_length)s)" - -msgid "Text" -msgstr "تېكىست" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"«%(value)s» قىممىتى ئىناۋەتسىز. ئۇ چوقۇم HH: MM [: ss [.uuuuuu]] شەكلىدە " -"بولۇشى كېرەك." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"«%(value)s» قىممىتىنىڭ توغرا فورماتى بار (HH: MM [: ss [.uuuuuu]]) ئەمما ئۇ " -"ئىناۋەتسىز ۋاقىت." - -msgid "Time" -msgstr "ۋاقىت" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "خام ئىككىلىك سان" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "«%(value)s» ئىناۋەتلىك UUID ئەمەس." - -msgid "Universally unique identifier" -msgstr "ئۇنىۋېرسال بىردىنبىر كىملىك" - -msgid "File" -msgstr "ھۆججەت" - -msgid "Image" -msgstr "رەسىم" - -msgid "A JSON object" -msgstr "JSON ئوبيېكتى" - -msgid "Value must be valid JSON." -msgstr "چوقۇم ئىناۋەتلىك JSON بولۇشى كېرەك." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "مىسال %(value)r %(field)s قىممىتى بولغان %(model)s مەۋجۇت ئەمەس." - -msgid "Foreign Key (type determined by related field)" -msgstr "سىرتقى ئاچقۇچ (تىپى مۇناسىۋەتلىك مەيدان تەرىپىدىن بېكىتىلگەن)" - -msgid "One-to-one relationship" -msgstr "بىرمۇبىر مۇناسىۋەت" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s مۇناسىۋەت" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s مۇناسىۋەتلەر" - -msgid "Many-to-many relationship" -msgstr "كۆپكە كۆب مۇناسىۋىتى" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "بۇ رايون تەلەپ قىلىنىدۇ." - -msgid "Enter a whole number." -msgstr "پۈتۈن ساننى كىرگۈزۈڭ." - -msgid "Enter a valid date." -msgstr "ئىناۋەتلىك چېسلانى كىرگۈزۈڭ." - -msgid "Enter a valid time." -msgstr "ئىناۋەتلىك ۋاقىت كىرگۈزۈڭ." - -msgid "Enter a valid date/time." -msgstr "ئىناۋەتلىك چېسلا / ۋاقىت كىرگۈزۈڭ." - -msgid "Enter a valid duration." -msgstr "ئىناۋەتلىك مۇددىتىنى كىرگۈزۈڭ." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "كۈن سانى چوقۇم {min_days} بىلەن {max_days} ئارىسىدا بولۇشى كېرەك." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "ھېچقانداق ھۆججەت يوللانمىدى. جەدۋەلدىكى كودلاش تۈرىنى تەكشۈرۈڭ." - -msgid "No file was submitted." -msgstr "ھېچقانداق ھۆججەت يوللانمىدى." - -msgid "The submitted file is empty." -msgstr "يوللانغان ھۆججەت قۇرۇق." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"بۇ ھۆججەت نامىنىڭ ئەڭ كۆپ بولغاندا %(max)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ئۇنىڭدا %(length)d بار)." -msgstr[1] "" -"بۇ ھۆججەت نامىنىڭ ئەڭ كۆپ بولغاندا %(max)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ئۇنىڭدا %(length)d بار)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "ھۆججەت يوللاڭ ياكى تەكشۈرۈش رامكىسىنى تەكشۈرۈڭ ، ھەر ئىككىسىنى ئەمەس." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"ئىناۋەتلىك رەسىم يۈكلەڭ. سىز يۈكلىگەن ھۆججەت يا رەسىم ئەمەس ۋەياكى بۇزۇلغان." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "ئۈنۈملۈك تاللاشنى تاللاڭ. %(value)s تاللاشلارنىڭ بىرى ئەمەس." - -msgid "Enter a list of values." -msgstr "قىممەت تىزىملىكىنى كىرگۈزۈڭ." - -msgid "Enter a complete value." -msgstr "تولۇق قىممەت كىرگۈزۈڭ." - -msgid "Enter a valid UUID." -msgstr "ئىناۋەتلىك UUID نى كىرگۈزۈڭ." - -msgid "Enter a valid JSON." -msgstr "ئىناۋەتلىك JSON نى كىرگۈزۈڭ." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(يوشۇرۇن مەيدان %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm سانلىق مەلۇماتلىرى يوقاپ كەتتى ياكى ئۆزگەرتىلدى. يوقاپ كەتكەن " -"ساھە: %(field_names)s. ئەگەر مەسىلە ساقلىنىپ قالسا ، خاتالىق دوكلاتىنى " -"تاپشۇرۇشىڭىز كېرەك." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "ئەڭ كۆپ بولغاندا %(num)d جەدۋەلنى يوللاڭ." -msgstr[1] "ئەڭ كۆپ بولغاندا %(num)d جەدۋەلنى يوللاڭ." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "كەم دېگەندە %(num)d جەدۋەلنى يوللاڭ." -msgstr[1] "كەم دېگەندە %(num)d جەدۋەلنى يوللاڭ." - -msgid "Order" -msgstr "زاكاز" - -msgid "Delete" -msgstr "ئۆچۈرۈش" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s نىڭ قايتىلانغان سانلىق مەلۇماتلىرىنى تۈزىتىڭ." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s نىڭ كۆپەيتىلگەن سانلىق مەلۇماتلىرىنى تۈزىتىڭ ، بۇ چوقۇم ئۆزگىچە " -"بولۇشى كېرەك." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s دىكى قايتىلانغان سانلىق مەلۇماتنى تۈزىتىڭ ، بۇ چوقۇم " -"%(date_field)s دىكى %(lookup)s غا خاس بولۇشى كېرەك." - -msgid "Please correct the duplicate values below." -msgstr "تۆۋەندىكى قايتىلانغان قىممەتنى تۈزىتىڭ." - -msgid "The inline value did not match the parent instance." -msgstr "ئىچكى قىممەت ئاتا مىسالغا ماس كەلمىدى." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"ئۈنۈملۈك تاللاشنى تاللاڭ. بۇ تاللاش ئىشلەتكىلى بولىدىغان تاللاشلارنىڭ بىرى " -"ئەمەس." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "«%(pk)s» ئىناۋەتلىك قىممەت ئەمەس." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s نى %(current_timezone)s ۋاقىت رايونىدا ئىزاھلاشقا بولمايدۇ ئۇ " -"مۈجمەل بولۇشى مۇمكىن ياكى ئۇ مەۋجۇت بولماسلىقى مۇمكىن." - -msgid "Clear" -msgstr "تازىلاش" - -msgid "Currently" -msgstr "نۆۋەتتە" - -msgid "Change" -msgstr "ئۆزگەرتىش" - -msgid "Unknown" -msgstr "نامەلۇم" - -msgid "Yes" -msgstr "ھەئە" - -msgid "No" -msgstr "ياق" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ھەئە، ياق، بەلكىىم" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d بايىت" -msgstr[1] "%(size)d بايىت" - -#, python-format -msgid "%s KB" -msgstr "%s كىلوبايت" - -#, python-format -msgid "%s MB" -msgstr "%sمېگا بايىت" - -#, python-format -msgid "%s GB" -msgstr "%sگىگا بايىت" - -#, python-format -msgid "%s TB" -msgstr "%s تېرا بايت" - -#, python-format -msgid "%s PB" -msgstr "%s پېتا بايىت" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "يېرىم كېچىدە" - -msgid "noon" -msgstr "چۈشتە" - -msgid "Monday" -msgstr "دۈشەنبە" - -msgid "Tuesday" -msgstr "سەيشەنبە" - -msgid "Wednesday" -msgstr "چارشەمبە" - -msgid "Thursday" -msgstr "پەيشەمبە" - -msgid "Friday" -msgstr "جۈمە" - -msgid "Saturday" -msgstr "شەنبە" - -msgid "Sunday" -msgstr "يەكشەنبە" - -msgid "Mon" -msgstr "دۈش" - -msgid "Tue" -msgstr "سەي" - -msgid "Wed" -msgstr "چار" - -msgid "Thu" -msgstr "پەي" - -msgid "Fri" -msgstr "جۈ" - -msgid "Sat" -msgstr "شەن" - -msgid "Sun" -msgstr "يەك" - -msgid "January" -msgstr "يانۋار" - -msgid "February" -msgstr "فېۋرال" - -msgid "March" -msgstr "مارت" - -msgid "April" -msgstr "ئاپرىل" - -msgid "May" -msgstr "ماي" - -msgid "June" -msgstr "ئىيۇن" - -msgid "July" -msgstr "ئىيۇل" - -msgid "August" -msgstr "ئاۋغۇست" - -msgid "September" -msgstr "سىنتەبىر" - -msgid "October" -msgstr "ئۆكتەبىر" - -msgid "November" -msgstr "نويابىر" - -msgid "December" -msgstr "دىكابىر" - -msgid "jan" -msgstr "يان" - -msgid "feb" -msgstr "فېۋ" - -msgid "mar" -msgstr "مار" - -msgid "apr" -msgstr "ئاپ" - -msgid "may" -msgstr "ماي" - -msgid "jun" -msgstr "ئ‍ىيۇن" - -msgid "jul" -msgstr "ئىيۇل" - -msgid "aug" -msgstr "ئاۋ" - -msgid "sep" -msgstr "سېن" - -msgid "oct" -msgstr "ئۆك" - -msgid "nov" -msgstr "نوي" - -msgid "dec" -msgstr "دىك" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "يانۋار" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "فېۋرال" - -msgctxt "abbrev. month" -msgid "March" -msgstr "مارت" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ئاپرىل" - -msgctxt "abbrev. month" -msgid "May" -msgstr "ماي" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ئىيۇن" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ئىيۇل" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ئاۋغۇست" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "سېنتەبىر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ئۆكتەبىر" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "نويابىر" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "دىكابىر" - -msgctxt "alt. month" -msgid "January" -msgstr "يانۋار" - -msgctxt "alt. month" -msgid "February" -msgstr "فېۋرال" - -msgctxt "alt. month" -msgid "March" -msgstr "مارت" - -msgctxt "alt. month" -msgid "April" -msgstr "ئاپرىل" - -msgctxt "alt. month" -msgid "May" -msgstr "ماي" - -msgctxt "alt. month" -msgid "June" -msgstr "ئىيۇن" - -msgctxt "alt. month" -msgid "July" -msgstr "ئىيۇل" - -msgctxt "alt. month" -msgid "August" -msgstr "ئاۋغۇست" - -msgctxt "alt. month" -msgid "September" -msgstr "سىنتەبىر" - -msgctxt "alt. month" -msgid "October" -msgstr "ئۆكتەبىر" - -msgctxt "alt. month" -msgid "November" -msgstr "نويابىر" - -msgctxt "alt. month" -msgid "December" -msgstr "دىكابىر" - -msgid "This is not a valid IPv6 address." -msgstr "بۇ ئىناۋەتلىك IPv6 ئادرېس ئەمەس." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ياكى" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "،" - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d يىل" -msgstr[1] "%(num)d يىل" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ئاي" -msgstr[1] "%(num)d ئاي" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d ھەپتە" -msgstr[1] "%(num)d ھەپتە" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d كۈن" -msgstr[1] "%(num)d كۈن" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d سائەت" -msgstr[1] "%(num)d سائەت" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d مىنۇت" -msgstr[1] "%(num)d مىنۇت" - -msgid "Forbidden" -msgstr "چەكلەنگەن" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF دەلىللەش مەغلۇپ بولدى. تەلەپ ئەمەلدىن قالدۇرۇلدى." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"چۈنكى بۇ HTTPS تور بېكىتى توركۆرگۈڭىز تەرىپىدىن پايدىلانما ئۇچۇرلىرىنى " -"ئەۋەتىشنى تەلەب قىلىدۇ، ئەمما ھېچقايسىسى ئەۋەتىلمىدى، شۇ سەۋەبتىن سىز بۇ " -"ئۇچۇرنى كۆرىۋاتىسىز.\n" -"بۇ ئۇچۇرلار سىزنىڭ بىخەتەرلىكڭىز ۋە تور كۆرگۈڭىزنىڭ ئۈچۈنجى شەخىس تەرىپىدىن " -"تۇتقۇن قىلىنىشىنىڭ ئالدىنى ئېلىش ئۈچۈندۇر. " - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"ئەگەر سىز توركۆرگۈچىڭىزنى “Referer” بېكەت سېكىرتكۈچىنى چەكلەپ تەڭشىسىڭىز، بۇ " -"تور بېكەت، ياكى HTTPS ئۇلىنىشى، ياكى “ئوخشاش-مەنبە” ئىلتىماسلىرى ئۈچۈن ئۇنى " -"قايتا ئىچىپ قويۇڭ." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"ئەگەر سىز تەگىنى ياكى " -"“Referrer-Policy: no-referrer” بېكەت سېكىرتكۈچىنى ئىشلىتىۋاتىسىز، ئۇلارنى " -"ئۆچۈرۈڭ. CSRF قوغداش تەلەپ قىلىدۇ “Referer” بېكەت سېكىرتكۈچى قاتتىق " -"سېكىرتىشنى ئېلىپ بېرىشى كېرەك. ئەگەر سىز شەخسىيەتىڭىزگە قاراشقا ئۆزىڭىزنى " -"ئۆزىڭىز قارغىلى بولسىڭىز، ئۈچىنچى تەرەپ تور بېكەتلىرىگە ئۇلىنىشلاردا قاتارلىق ئالتۇرناتىۋىلارنى ئىشلىتىڭ." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -" بۇ تور بېكەت جەدۋەل يوللىغاندا CSRF ساقلانمىسىنى تەلەپ قىلىدۇ. بۇ " -"ساقلانمىلار بىخەتەرلىكنى كۆزدە تۇتۇپ ، تور كۆرگۈچىڭىزنىڭ ئۈچىنچى تەرەپ " -"تەرىپىدىن ئوغرىلانماسلىقىغا كاپالەتلىك قىلىدۇ." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"ئەگەر توركۆرگۈڭىزنى ساقلانمىلارنى چەكلەش ئۈچۈن تەڭشىگەن بولسىڭىز ، ھېچ " -"بولمىغاندا بۇ تور بېكەت ياكى «ئوخشاش مەنبە» تەلەپلىرى ئۈچۈن ئۇلارنى قايتا " -"قوزغىتىڭ." - -msgid "More information is available with DEBUG=True." -msgstr "DEBUG = True بىلەن تېخىمۇ كۆپ ئۇچۇرلارغا ئېرىشكىلى بولىدۇ." - -msgid "No year specified" -msgstr "يىل بەلگىلەنمىدى" - -msgid "Date out of range" -msgstr "ۋاقىت چەكلىمىسىدىن ئېشىب كەتتى" - -msgid "No month specified" -msgstr "ئاي بەلگىلەنمىدى" - -msgid "No day specified" -msgstr "كۈن بەلگىلەنمىدى" - -msgid "No week specified" -msgstr "ھەپتە بەلگىلەنمىدى" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s يوق" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"كەلگۈسى %(verbose_name_plural)s ئىشلەتكىلى بولمايدۇ ، چۈنكى %(class_name)s." -"allow_future بولسا False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "ئىناۋەتسىز چېسلا تىزمىسى «%(datestr)s» بېرىلگەن فورمات «%(format)s»" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "بۇ سوئالغا ماس كېلىدىغان %(verbose_name)s تېپىلمىدى" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "بەت «ئاخىرقى» ئەمەس ،ياكى ئۇنى int غا ئايلاندۇرغىلى بولمىدى." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "ئىناۋەتسىز بەت (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "بوش تىزىملىك %(class_name)s ۋە «.allow_empty» بولسا False." - -msgid "Directory indexes are not allowed here." -msgstr "ھۆججەت مۇندەرىجىسى بۇ يەردە رۇخسەت قىلىنمايدۇ." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "%(path)s مەۋجۇت ئەمەس" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s نىڭ كۆرسەتكۈچىسى" - -msgid "The install worked successfully! Congratulations!" -msgstr "قاچىلاش مۇۋەپپەقىيەتلىك بولدى! مۇبارەك بولسۇن!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -" Django %(version)s ئۈچۈن ئېلان قىلىش " -"خاتىرىسى نى كۆرۈڭ" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"سىز بۇ بەتنى كۆرۈۋاتىسىز ، چۈنكى DEBUG = " -"True سىزنىڭ تەڭشەك ھۆججىتىڭىزدە ،شۇنداقلا ھېچقانداق URL تەڭشەلىمىگەن." - -msgid "Django Documentation" -msgstr " Django قوللانمىسى" - -msgid "Topics, references, & how-to’s" -msgstr "تېما ، پايدىلانما ، & amp; قانداق قىلىش " - -msgid "Tutorial: A Polling App" -msgstr "دەرسلىك: بىر بېلەت تاشلاش دىتالى" - -msgid "Get started with Django" -msgstr "Django بىلەن تونۇشۇش" - -msgid "Django Community" -msgstr "Django جەمىيىتى" - -msgid "Connect, get help, or contribute" -msgstr "قوشۇلۇش ، ياردەمگە ئېرىشىش ياكى تۆھپە قوشۇش" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ug/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ug/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ug/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/ug/formats.py deleted file mode 100644 index 92f0134..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ug/formats.py +++ /dev/null @@ -1,14 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y/m/d" -SHORT_DATETIME_FORMAT = "Y/m/d G:i" -FIRST_DAY_OF_WEEK = 1 -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/uk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index 26b4b59..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/uk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index 74b4c9e..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,1386 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Oleksandr Chernihov , 2014 -# Boryslav Larin , 2011,2022 -# Denys Pidlisnyi , 2016 -# Igor Melnyk, 2014-2015,2017 -# Illia Volochii , 2019,2021-2023,2025 -# Jannis Leidel , 2011 -# Kirill Gagarski , 2014 -# Max V. Stotsky , 2014 -# Mikhail Kolesnik , 2015 -# Mykola Zamkovoi , 2014 -# Natalia, 2024 -# Alex Bolotov , 2013-2014 -# Roman Kozlovskyi , 2012 -# Sergiy Kuzmenko , 2011 -# tarasyyyk , 2018 -# tarasyyyk , 2019 -# Zoriana Zaiats, 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Illia Volochii , " -"2019,2021-2023,2025\n" -"Language-Team: Ukrainian (http://app.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -msgid "Afrikaans" -msgstr "Африканська" - -msgid "Arabic" -msgstr "Арабська" - -msgid "Algerian Arabic" -msgstr "Алжирська арабська" - -msgid "Asturian" -msgstr "Астурійська" - -msgid "Azerbaijani" -msgstr "Азербайджанська" - -msgid "Bulgarian" -msgstr "Болгарська" - -msgid "Belarusian" -msgstr "Білоруська" - -msgid "Bengali" -msgstr "Бенгальська" - -msgid "Breton" -msgstr "Бретонська" - -msgid "Bosnian" -msgstr "Боснійська" - -msgid "Catalan" -msgstr "Каталонська" - -msgid "Central Kurdish (Sorani)" -msgstr "Центральнокурдська (сорані)" - -msgid "Czech" -msgstr "Чеська" - -msgid "Welsh" -msgstr "Валлійська" - -msgid "Danish" -msgstr "Датська" - -msgid "German" -msgstr "Німецька" - -msgid "Lower Sorbian" -msgstr "Нижньолужицька" - -msgid "Greek" -msgstr "Грецька" - -msgid "English" -msgstr "Англійська" - -msgid "Australian English" -msgstr "Австралійська англійська" - -msgid "British English" -msgstr "Англійська (Великобританія)" - -msgid "Esperanto" -msgstr "Есперанто" - -msgid "Spanish" -msgstr "Іспанська" - -msgid "Argentinian Spanish" -msgstr "Іспанська (Аргентина)" - -msgid "Colombian Spanish" -msgstr "Колумбійська іспанська" - -msgid "Mexican Spanish" -msgstr "Мексиканська іспанська" - -msgid "Nicaraguan Spanish" -msgstr "Нікарагуанська іспанська" - -msgid "Venezuelan Spanish" -msgstr "Венесуельська іспанська" - -msgid "Estonian" -msgstr "Естонська" - -msgid "Basque" -msgstr "Баскська" - -msgid "Persian" -msgstr "Перська" - -msgid "Finnish" -msgstr "Фінська" - -msgid "French" -msgstr "Французька" - -msgid "Frisian" -msgstr "Фризька" - -msgid "Irish" -msgstr "Ірландська" - -msgid "Scottish Gaelic" -msgstr "Шотландська ґельська" - -msgid "Galician" -msgstr "Галіційська" - -msgid "Hebrew" -msgstr "Іврит" - -msgid "Hindi" -msgstr "Хінді" - -msgid "Croatian" -msgstr "Хорватська" - -msgid "Upper Sorbian" -msgstr "Верхньолужицька" - -msgid "Hungarian" -msgstr "Угорська" - -msgid "Armenian" -msgstr "Вірменська" - -msgid "Interlingua" -msgstr "Інтерлінгва" - -msgid "Indonesian" -msgstr "Індонезійська" - -msgid "Igbo" -msgstr "Ігбо" - -msgid "Ido" -msgstr "Ідо" - -msgid "Icelandic" -msgstr "Ісландська" - -msgid "Italian" -msgstr "Італійська" - -msgid "Japanese" -msgstr "Японська" - -msgid "Georgian" -msgstr "Грузинська" - -msgid "Kabyle" -msgstr "Кабіли" - -msgid "Kazakh" -msgstr "Казахська" - -msgid "Khmer" -msgstr "Кхмерська" - -msgid "Kannada" -msgstr "Каннадська" - -msgid "Korean" -msgstr "Корейська" - -msgid "Kyrgyz" -msgstr "Киргизька" - -msgid "Luxembourgish" -msgstr "Люксембурзька" - -msgid "Lithuanian" -msgstr "Литовська" - -msgid "Latvian" -msgstr "Латвійська" - -msgid "Macedonian" -msgstr "Македонська" - -msgid "Malayalam" -msgstr "Малаялам" - -msgid "Mongolian" -msgstr "Монгольська" - -msgid "Marathi" -msgstr "Маратхі" - -msgid "Malay" -msgstr "Малайська" - -msgid "Burmese" -msgstr "Бірманська" - -msgid "Norwegian Bokmål" -msgstr "Норвезька (Букмол)" - -msgid "Nepali" -msgstr "Непальська" - -msgid "Dutch" -msgstr "Голландська" - -msgid "Norwegian Nynorsk" -msgstr "Норвезька (Нюнорськ)" - -msgid "Ossetic" -msgstr "Осетинська" - -msgid "Punjabi" -msgstr "Панджабі" - -msgid "Polish" -msgstr "Польська" - -msgid "Portuguese" -msgstr "Португальська" - -msgid "Brazilian Portuguese" -msgstr "Бразильська португальська" - -msgid "Romanian" -msgstr "Румунська" - -msgid "Russian" -msgstr "Російська" - -msgid "Slovak" -msgstr "Словацька" - -msgid "Slovenian" -msgstr "Словенська" - -msgid "Albanian" -msgstr "Албанська" - -msgid "Serbian" -msgstr "Сербська" - -msgid "Serbian Latin" -msgstr "Сербська (латинська)" - -msgid "Swedish" -msgstr "Шведська" - -msgid "Swahili" -msgstr "Суахілі" - -msgid "Tamil" -msgstr "Тамільська" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Tajik" -msgstr "Таджицька" - -msgid "Thai" -msgstr "Тайська" - -msgid "Turkmen" -msgstr "Туркменська" - -msgid "Turkish" -msgstr "Турецька" - -msgid "Tatar" -msgstr "Татарська" - -msgid "Udmurt" -msgstr "Удмуртська" - -msgid "Uyghur" -msgstr " Уйгурська" - -msgid "Ukrainian" -msgstr "Українська" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "Узбецька" - -msgid "Vietnamese" -msgstr "В'єтнамська" - -msgid "Simplified Chinese" -msgstr "Китайська спрощена" - -msgid "Traditional Chinese" -msgstr "Китайська традиційна" - -msgid "Messages" -msgstr "Повідомлення" - -msgid "Site Maps" -msgstr "Мапи сайту" - -msgid "Static Files" -msgstr "Статичні файли" - -msgid "Syndication" -msgstr "Об'єднання" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Номер сторінки не є цілим числом" - -msgid "That page number is less than 1" -msgstr "Номер сторінки менше 1" - -msgid "That page contains no results" -msgstr "Сторінка не містить результатів" - -msgid "Enter a valid value." -msgstr "Введіть коректне значення." - -msgid "Enter a valid domain name." -msgstr "Введіть правильне доменне ім'я." - -msgid "Enter a valid URL." -msgstr "Введіть коректний URL." - -msgid "Enter a valid integer." -msgstr "Введіть коректне ціле число." - -msgid "Enter a valid email address." -msgstr "Введіть коректну email адресу." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Введіть коректне значення 'slug' (короткого заголовку), що може містити " -"тільки літери, числа, символи підкреслювання або дефіси." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Введіть правильну %(protocol)s адресу." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 або IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Введіть тільки цифри, що розділені комами." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Переконайтеся, що це значення дорівнює %(limit_value)s (зараз " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Переконайтеся, що це значення менше чи дорівнює %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Переконайтеся, що це значення більше чи дорівнює %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Переконайтеся, що значення є кратним розміру кроку %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Переконайтеся, що значення є кратним розміру кроку %(limit_value)s, " -"починаючи з %(offset)s. Наприклад, %(offset)s, %(valid_value1)s, " -"%(valid_value2)s і т. д." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Переконайтеся, що це значення містить не менш ніж %(limit_value)d символ " -"(зараз %(show_value)d)." -msgstr[1] "" -"Переконайтеся, що це значення містить не менш ніж %(limit_value)d символів " -"(зараз %(show_value)d)." -msgstr[2] "" -"Переконайтеся, що це значення містить не менш ніж %(limit_value)d символів " -"(зараз %(show_value)d)." -msgstr[3] "" -"Переконайтеся, що це значення містить не менш ніж %(limit_value)d символів " -"(зараз %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Переконайтеся, що це значення містить не більше ніж %(limit_value)d символ " -"(зараз %(show_value)d)." -msgstr[1] "" -"Переконайтеся, що це значення містить не більше ніж %(limit_value)d символи " -"(зараз %(show_value)d)." -msgstr[2] "" -"Переконайтеся, що це значення містить не більше ніж %(limit_value)d символів " -"(зараз %(show_value)d)." -msgstr[3] "" -"Переконайтеся, що це значення містить не більше ніж %(limit_value)d символів " -"(зараз %(show_value)d)." - -msgid "Enter a number." -msgstr "Введіть число." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Переконайтеся, що загалом тут не більше ніж %(max)s цифра." -msgstr[1] "Переконайтеся, що загалом тут не більше ніж %(max)s цифер." -msgstr[2] "Переконайтеся, що загалом тут не більше ніж %(max)s цифер." -msgstr[3] "Переконайтеся, що загалом тут не більше ніж %(max)s цифер." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Переконайтеся, що тут не більше ніж %(max)s цифра після десяткової коми." -msgstr[1] "" -"Переконайтеся, що тут не більше ніж %(max)s цифри після десяткової коми." -msgstr[2] "" -"Переконайтеся, що тут не більше ніж %(max)s цифер після десяткової коми." -msgstr[3] "" -"Переконайтеся, що тут не більше ніж %(max)s цифер після десяткової коми." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Переконайтеся, що тут не більше ніж %(max)s цифра до десяткової коми." -msgstr[1] "" -"Переконайтеся, що тут не більше ніж %(max)s цифри до десяткової коми." -msgstr[2] "" -"Переконайтеся, що тут не більше ніж %(max)s цифер до десяткової коми." -msgstr[3] "" -"Переконайтеся, що тут не більше ніж %(max)s цифер до десяткової коми." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Розширення файлу '%(extension)s' не дозволено. Дозволені розширення: ' " -"%(allowed_extensions)s'." - -msgid "Null characters are not allowed." -msgstr "Символи Null не дозволені." - -msgid "and" -msgstr "та" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s з таким %(field_labels)s вже існує." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Порушено обмеження \"%(name)s\"." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Значення %(value)r не є дозволеним вибором." - -msgid "This field cannot be null." -msgstr "Це поле не може бути пустим." - -msgid "This field cannot be blank." -msgstr "Це поле не може бути порожнім." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s з таким %(field_label)s вже існує." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s повинне бути унікальним для %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Тип поля: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Значення \"%(value)s\" повинне бути True, False, або None." - -msgid "Boolean (Either True or False)" -msgstr "Булеве значення (True або False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Рядок (до %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Рядок (необмежений)" - -msgid "Comma-separated integers" -msgstr "Цілі, розділені комою" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Дата (без часу)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Значення \"%(value)s\" має невірний формат. Воно повинне бути у форматі YYYY-" -"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Дата (з часом)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Десяткове число" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Тривалість" - -msgid "Email address" -msgstr "E-mail адреса" - -msgid "File path" -msgstr "Шлях до файла" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Число з плаваючою комою" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Ціле число" - -msgid "Big (8 byte) integer" -msgstr "Велике (8 байтів) ціле число" - -msgid "Small integer" -msgstr "Мале ціле число" - -msgid "IPv4 address" -msgstr "IPv4 адреса" - -msgid "IP address" -msgstr "IP адреса" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Булеве значення (включаючи True, False або None)" - -msgid "Positive big integer" -msgstr "Додатнє велике ціле число" - -msgid "Positive integer" -msgstr "Додатнє ціле число" - -msgid "Positive small integer" -msgstr "Додатнє мале ціле число" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (до %(max_length)s)" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Значення \"%(value)s\" має невірний формат. Воно повинне бути у форматі HH:" -"MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Час" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Необроблені двійкові дані" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” не є валідним UUID." - -msgid "Universally unique identifier" -msgstr "Універсальний унікальний ідентифікатор" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Зображення" - -msgid "A JSON object" -msgstr "JSON-об'єкт" - -msgid "Value must be valid JSON." -msgstr "Значення має бути коректним JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Зовнішній ключ (тип визначається відповідно поля)" - -msgid "One-to-one relationship" -msgstr "Один-до-одного" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s звязок" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s звязки" - -msgid "Many-to-many relationship" -msgstr "Багато-до-багатьох" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Це поле обов'язкове." - -msgid "Enter a whole number." -msgstr "Введіть ціле число." - -msgid "Enter a valid date." -msgstr "Введіть коректну дату." - -msgid "Enter a valid time." -msgstr "Введіть коректний час." - -msgid "Enter a valid date/time." -msgstr "Введіть коректну дату/час." - -msgid "Enter a valid duration." -msgstr "Введіть коректну тривалість." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Кількість днів повинна бути від {min_days} до {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Файл не надіслано. Перевірте тип кодування форми." - -msgid "No file was submitted." -msgstr "Файл не було надіслано." - -msgid "The submitted file is empty." -msgstr "Переданий файл порожній." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Переконайтеся, що це ім'я файлу містить не більше ніж з %(max)d символ " -"(зараз %(length)d)." -msgstr[1] "" -"Переконайтеся, що це ім'я файлу містить не більше ніж з %(max)d символи " -"(зараз %(length)d)." -msgstr[2] "" -"Переконайтеся, що це ім'я файлу містить не більше ніж з %(max)d символів " -"(зараз %(length)d)." -msgstr[3] "" -"Переконайтеся, що це ім'я файлу містить не більше ніж з %(max)d символів " -"(зараз %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Будь ласка, або завантажте файл, або відмітьте прапорець очищення, а не " -"обидва варіанти одразу" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Завантажте правильний малюнок. Файл, який ви завантажили, не є малюнком, або " -"є зіпсованим малюнком." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Зробить коректний вибір, %(value)s немає серед варіантів вибору." - -msgid "Enter a list of values." -msgstr "Введіть список значень." - -msgid "Enter a complete value." -msgstr "Введіть значення повністю." - -msgid "Enter a valid UUID." -msgstr "Введіть коректне значення UUID." - -msgid "Enter a valid JSON." -msgstr "Введіть коректний JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Приховане поле %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "Order" -msgstr "Послідовність" - -msgid "Delete" -msgstr "Видалити" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Будь ласка, виправте повторювані дані для поля %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Будь ласка, виправте повторювані дані для поля %(field)s, яке має бути " -"унікальним." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Будь ласка, виправте повторювані дані для поля %(field_name)s, яке має бути " -"унікальним для вибірки %(lookup)s на %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Будь ласка, виправте повторювані значення нижче." - -msgid "The inline value did not match the parent instance." -msgstr "Зв'язане значення не відповідає батьківському екземпляру." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Зробить коректний вибір. Такого варіанту нема серед доступних." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Очистити" - -msgid "Currently" -msgstr "Наразі" - -msgid "Change" -msgstr "Змінити" - -msgid "Unknown" -msgstr "Невідомо" - -msgid "Yes" -msgstr "Так" - -msgid "No" -msgstr "Ні" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "так,ні,можливо" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байти" -msgstr[2] "%(size)d байтів" -msgstr[3] "%(size)d байтів" - -#, python-format -msgid "%s KB" -msgstr "%s Кб" - -#, python-format -msgid "%s MB" -msgstr "%s Мб" - -#, python-format -msgid "%s GB" -msgstr "%s Гб" - -#, python-format -msgid "%s TB" -msgstr "%s Тб" - -#, python-format -msgid "%s PB" -msgstr "%s Пб" - -msgid "p.m." -msgstr "після полудня" - -msgid "a.m." -msgstr "до полудня" - -msgid "PM" -msgstr "після полудня" - -msgid "AM" -msgstr "до полудня" - -msgid "midnight" -msgstr "північ" - -msgid "noon" -msgstr "полудень" - -msgid "Monday" -msgstr "Понеділок" - -msgid "Tuesday" -msgstr "Вівторок" - -msgid "Wednesday" -msgstr "Середа" - -msgid "Thursday" -msgstr "Четвер" - -msgid "Friday" -msgstr "П'ятниця" - -msgid "Saturday" -msgstr "Субота" - -msgid "Sunday" -msgstr "Неділя" - -msgid "Mon" -msgstr "Пн" - -msgid "Tue" -msgstr "Вт" - -msgid "Wed" -msgstr "Ср" - -msgid "Thu" -msgstr "Чт" - -msgid "Fri" -msgstr "Пт" - -msgid "Sat" -msgstr "Сб" - -msgid "Sun" -msgstr "Нд" - -msgid "January" -msgstr "Січень" - -msgid "February" -msgstr "Лютий" - -msgid "March" -msgstr "Березень" - -msgid "April" -msgstr "Квітень" - -msgid "May" -msgstr "Травень" - -msgid "June" -msgstr "Червень" - -msgid "July" -msgstr "Липень" - -msgid "August" -msgstr "Серпень" - -msgid "September" -msgstr "Вересень" - -msgid "October" -msgstr "Жовтень" - -msgid "November" -msgstr "Листопад" - -msgid "December" -msgstr "Грудень" - -msgid "jan" -msgstr "січ" - -msgid "feb" -msgstr "лют" - -msgid "mar" -msgstr "бер" - -msgid "apr" -msgstr "кві" - -msgid "may" -msgstr "тра" - -msgid "jun" -msgstr "чер" - -msgid "jul" -msgstr "лип" - -msgid "aug" -msgstr "сер" - -msgid "sep" -msgstr "вер" - -msgid "oct" -msgstr "жов" - -msgid "nov" -msgstr "лис" - -msgid "dec" -msgstr "гру" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Січ." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Лют." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Березень" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Квітень" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Травень" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Червень" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Липень" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Сер." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Вер." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Жов." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Лис." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Гру." - -msgctxt "alt. month" -msgid "January" -msgstr "січня" - -msgctxt "alt. month" -msgid "February" -msgstr "лютого" - -msgctxt "alt. month" -msgid "March" -msgstr "березня" - -msgctxt "alt. month" -msgid "April" -msgstr "квітня" - -msgctxt "alt. month" -msgid "May" -msgstr "травня" - -msgctxt "alt. month" -msgid "June" -msgstr "червня" - -msgctxt "alt. month" -msgid "July" -msgstr "липня" - -msgctxt "alt. month" -msgid "August" -msgstr "серпня" - -msgctxt "alt. month" -msgid "September" -msgstr "вересня" - -msgctxt "alt. month" -msgid "October" -msgstr "жовтня" - -msgctxt "alt. month" -msgid "November" -msgstr "листопада" - -msgctxt "alt. month" -msgid "December" -msgstr "грудня" - -msgid "This is not a valid IPv6 address." -msgstr "Це не є правильною адресою IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "або" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d рік" -msgstr[1] "%(num)d роки" -msgstr[2] "%(num)d років" -msgstr[3] "%(num)d років" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d місяць" -msgstr[1] "%(num)d місяці" -msgstr[2] "%(num)d місяців" -msgstr[3] "%(num)d місяців" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d тиждень" -msgstr[1] "%(num)d тижні" -msgstr[2] "%(num)d тижнів" -msgstr[3] "%(num)d тижнів" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d день" -msgstr[1] "%(num)d дні" -msgstr[2] "%(num)d днів" -msgstr[3] "%(num)d днів" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d години" -msgstr[2] "%(num)d годин" -msgstr[3] "%(num)d годин" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d хвилина" -msgstr[1] "%(num)d хвилини" -msgstr[2] "%(num)d хвилин" -msgstr[3] "%(num)d хвилин" - -msgid "Forbidden" -msgstr "Заборонено" - -msgid "CSRF verification failed. Request aborted." -msgstr "Помилка перевірки CSRF. Запит відхилений." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Якщо ви налаштували свій браузер таким чином, щоб заборонити йому передавати " -"заголовок «Referer», будь ласка, дозвольте йому відсилати даний заголовок " -"принаймні для даного сайту, або для всіх HTTPS-з'єднань, або для подібних " -"запитів." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Ви бачите це повідомлення, тому що даний сайт вимагає, щоб при відправці " -"форм була відправлена ​​і CSRF-cookie. Даний тип cookie необхідний з міркувань " -"безпеки, щоб переконатися, що ваш браузер не був взламаний третьою стороною." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Більше інформації можна отримати з DEBUG=True." - -msgid "No year specified" -msgstr "Рік не вказано" - -msgid "Date out of range" -msgstr "Дата поза діапазоном" - -msgid "No month specified" -msgstr "Місяць не вказано" - -msgid "No day specified" -msgstr "День не вказано" - -msgid "No week specified" -msgstr "Тиждень не вказано" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s недоступні" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Майбутні %(verbose_name_plural)s недоступні, тому що %(class_name)s." -"allow_future має нульове значення." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Жодні %(verbose_name)s не були знайдені по запиту" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Невірна сторінка (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Перегляд вмісту каталогу не дозволено." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" не існує" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Вміст директорії %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Вітаємо, команда install завершилась успішно!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Нотатки релізу for Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Ви бачите цю сторінку тому що змінна DEBUG встановлена на True у вашому файлі " -"конфігурації і ви не налаштували жодного URL." - -msgid "Django Documentation" -msgstr "Документація Django" - -msgid "Topics, references, & how-to’s" -msgstr "Статті, довідки та інструкції" - -msgid "Tutorial: A Polling App" -msgstr "Посібник: програма голосування" - -msgid "Get started with Django" -msgstr "Початок роботи з Django" - -msgid "Django Community" -msgstr "Спільнота Django" - -msgid "Connect, get help, or contribute" -msgstr "Отримати допомогу, чи допомогти" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/uk/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/uk/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/uk/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/uk/formats.py deleted file mode 100644 index 0f28831..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/uk/formats.py +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d E Y р." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "d E Y р. H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "d F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d %B %Y", # '25 October 2006' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d %B %Y %H:%M:%S", # '25 October 2006 14:30:59' - "%d %B %Y %H:%M:%S.%f", # '25 October 2006 14:30:59.000200' - "%d %B %Y %H:%M", # '25 October 2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ur/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index 706c2ce..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/ur/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index 6067c00..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,1222 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "عربی" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "بلغاری" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "بنگالی" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "بوسنیائی" - -msgid "Catalan" -msgstr "کیٹالانی" - -msgid "Czech" -msgstr "زیچ" - -msgid "Welsh" -msgstr "ویلش" - -msgid "Danish" -msgstr "ڈینش" - -msgid "German" -msgstr "جرمن" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "گریک" - -msgid "English" -msgstr "انگلش" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "برطانوی انگلش" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "ھسپانوی" - -msgid "Argentinian Spanish" -msgstr "ارجنٹائنی سپینش" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "اسٹانین" - -msgid "Basque" -msgstr "باسک" - -msgid "Persian" -msgstr "فارسی" - -msgid "Finnish" -msgstr "فنش" - -msgid "French" -msgstr "فرانسیسی" - -msgid "Frisian" -msgstr "فریسی" - -msgid "Irish" -msgstr "آئرش" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "گیلیشین" - -msgid "Hebrew" -msgstr "عبرانی" - -msgid "Hindi" -msgstr "ھندی" - -msgid "Croatian" -msgstr "کروشن" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ھونگارین" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "انڈونیشین" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "آئس لینڈک" - -msgid "Italian" -msgstr "اطالوی" - -msgid "Japanese" -msgstr "جاپانی" - -msgid "Georgian" -msgstr "جارجیائی" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "خمر" - -msgid "Kannada" -msgstr "کناڈا" - -msgid "Korean" -msgstr "کوریائی" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "لیتھونیائی" - -msgid "Latvian" -msgstr "لتوینی" - -msgid "Macedonian" -msgstr "میسیڈونین" - -msgid "Malayalam" -msgstr "ملایالم" - -msgid "Mongolian" -msgstr "منگولین" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "ڈچ" - -msgid "Norwegian Nynorsk" -msgstr "نارویائی نینورسک" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "پنجابی" - -msgid "Polish" -msgstr "پولش" - -msgid "Portuguese" -msgstr "پورتگیز" - -msgid "Brazilian Portuguese" -msgstr "برازیلی پورتگیز" - -msgid "Romanian" -msgstr "رومانی" - -msgid "Russian" -msgstr "روسی" - -msgid "Slovak" -msgstr "سلووک" - -msgid "Slovenian" -msgstr "سلووینین" - -msgid "Albanian" -msgstr "البانوی" - -msgid "Serbian" -msgstr "سربین" - -msgid "Serbian Latin" -msgstr "سربین لاطینی" - -msgid "Swedish" -msgstr "سویڈش" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "تاملی" - -msgid "Telugu" -msgstr "تیلگو" - -msgid "Thai" -msgstr "تھائی" - -msgid "Turkish" -msgstr "ترکش" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "یوکرائنی" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "ویتنامی" - -msgid "Simplified Chinese" -msgstr "سادی چینی" - -msgid "Traditional Chinese" -msgstr "روایتی چینی" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "درست قیمت (ویلیو) درج کریں۔" - -msgid "Enter a valid URL." -msgstr "درست یو آر ایل (URL) درج کریں۔" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "IPv4 کا درست پتہ درج کریں۔" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "صرف اعداد درج کریں جو کوموں سے الگ کئے ھوئے ھوں۔" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"اس بات کا یقین کر لیں کہ یہ قیمت (ویلیو) %(limit_value)s ھے۔ (یہ " -"%(show_value)s ھے)%(show_value)s" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"اس بات کا یقین کر لیں کہ یہ قیمت (ویلیو) %(limit_value)s سے کم یا اس کے " -"برابر ھے۔" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"اس بات کا یقین کر لیں کہ یہ قیمت (ویلیو) %(limit_value)s سے زیادہ یا اس کے " -"برابر ھے۔" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "نمبر درج کریں۔" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "اور" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "یہ خانہ نامعلوم (null( نھیں رہ سکتا۔" - -msgid "This field cannot be blank." -msgstr "یہ خانہ خالی نھیں چھوڑا جا سکتا۔" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s اس %(field_label)s کے ساتھ پہلے ہی موجود ھے۔" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s قسم کا خانہ" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "بولین (True یا False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "سلسلۂ حروف (String) (%(max_length)s تک)" - -msgid "Comma-separated integers" -msgstr " کومے سے الگ کئے ھوئے صحیح اعداد" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "تاریخ (وقت کے بغیر)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "تاریخ (بمع وقت)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "اعشاری نمبر" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "" - -msgid "File path" -msgstr "فائل کا راستہ(path(" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "نقطہ اعشاریہ والا نمبر" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "صحیح عدد" - -msgid "Big (8 byte) integer" -msgstr "بڑا (8 بائٹ) صحیح عدد" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "IP ایڈریس" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "بولین (True، False یا None(" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "متن" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "وقت" - -msgid "URL" -msgstr "یو آر ایل" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "بیرونی کلید (FK( (قسم متعلقہ خانے سے متعین ھو گی)" - -msgid "One-to-one relationship" -msgstr "ون-ٹو-ون ریلیشن شپ" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "مینی-ٹو-مینی ریلیشن شپ" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "یہ خانہ درکار ھے۔" - -msgid "Enter a whole number." -msgstr "مکمل نمبر درج کریں۔" - -msgid "Enter a valid date." -msgstr "درست تاریخ درج کریں۔" - -msgid "Enter a valid time." -msgstr "درست وقت درج کریں۔" - -msgid "Enter a valid date/time." -msgstr "درست تاریخ/وقت درج کریں۔" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "کوئی فائل پیش نہیں کی گئی۔ فارم پر اینکوڈنگ کی قسم چیک کریں۔" - -msgid "No file was submitted." -msgstr "کوئی فائل پیش نہیں کی گئی تھی۔" - -msgid "The submitted file is empty." -msgstr "پیش کی گئی فائل خالی ھے۔" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "براہ مھربانی فائل پیش کریں یا Clear checkbox منتخب کریں۔ نہ کہ دونوں۔" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"درست تصویر اپ لوڈ کریں۔ جو فائل آپ نے اپ لوڈ کی تھی وہ تصویر نہیں تھی یا " -"خراب تصویر تھی۔" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "درست انتخاب منتخب کریں۔ %(value)s دستیاب انتخابات میں سے کوئی نہیں۔" - -msgid "Enter a list of values." -msgstr "قیمتوں (ویلیوز) کی لسٹ درج کریں۔" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ترتیب" - -msgid "Delete" -msgstr "مٹائیں" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "براہ کرم %(field)s کے لئے دوہرا مواد درست کریں۔" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"براہ کرم %(field)s کے لئے دوہرا مواد درست کریں جوکہ منفرد ھونا ضروری ھے۔" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"براہ کرم %(field_name)s میں دوہرا مواد درست کریں جو کہ %(date_field)s میں " -"%(lookup)s کے لئے منفرد ھونا ضروری ھے۔" - -msgid "Please correct the duplicate values below." -msgstr "براہ کرم نیچے دوہری قیمتیں (ویلیوز) درست کریں۔" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "درست انتخاب منتخب کریں۔ یہ انتخاب دستیاب انتخابات میں سے کوئی نہیں ھے۔" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "صاف کریں" - -msgid "Currently" -msgstr "فی الحال" - -msgid "Change" -msgstr "تبدیل کریں" - -msgid "Unknown" -msgstr "نامعلوم" - -msgid "Yes" -msgstr "ھاں" - -msgid "No" -msgstr "نھیں" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ھاں،نہیں،ھوسکتاہے" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d بائٹ" -msgstr[1] "%(size)d بائٹس" - -#, python-format -msgid "%s KB" -msgstr "%s ک ۔ ب" - -#, python-format -msgid "%s MB" -msgstr "%s م ۔ ب" - -#, python-format -msgid "%s GB" -msgstr "%s ج ۔ ب" - -#, python-format -msgid "%s TB" -msgstr "%s ٹ ۔ ب" - -#, python-format -msgid "%s PB" -msgstr "%s پ ۔ پ" - -msgid "p.m." -msgstr "شام" - -msgid "a.m." -msgstr "صبح" - -msgid "PM" -msgstr "شام" - -msgid "AM" -msgstr "صبح" - -msgid "midnight" -msgstr "نصف رات" - -msgid "noon" -msgstr "دوپہر" - -msgid "Monday" -msgstr "سوموار" - -msgid "Tuesday" -msgstr "منگل" - -msgid "Wednesday" -msgstr "بدھ" - -msgid "Thursday" -msgstr "جمعرات" - -msgid "Friday" -msgstr "جمعہ" - -msgid "Saturday" -msgstr "ھفتہ" - -msgid "Sunday" -msgstr "اتوار" - -msgid "Mon" -msgstr "سوموار" - -msgid "Tue" -msgstr "منگل" - -msgid "Wed" -msgstr "بدھ" - -msgid "Thu" -msgstr "جمعرات" - -msgid "Fri" -msgstr "جمعہ" - -msgid "Sat" -msgstr "ھفتہ" - -msgid "Sun" -msgstr "اتوار" - -msgid "January" -msgstr "جنوری" - -msgid "February" -msgstr "فروری" - -msgid "March" -msgstr "مارچ" - -msgid "April" -msgstr "اپریل" - -msgid "May" -msgstr "مئی" - -msgid "June" -msgstr "جون" - -msgid "July" -msgstr "جولائی" - -msgid "August" -msgstr "اگست" - -msgid "September" -msgstr "ستمبر" - -msgid "October" -msgstr "اکتوبر" - -msgid "November" -msgstr "نومبر" - -msgid "December" -msgstr "دسمبر" - -msgid "jan" -msgstr "جنوری" - -msgid "feb" -msgstr "فروری" - -msgid "mar" -msgstr "مارچ" - -msgid "apr" -msgstr "اپریل" - -msgid "may" -msgstr "مئی" - -msgid "jun" -msgstr "جون" - -msgid "jul" -msgstr "جولائی" - -msgid "aug" -msgstr "اگست" - -msgid "sep" -msgstr "ستمبر" - -msgid "oct" -msgstr "اکتوبر" - -msgid "nov" -msgstr "نومبر" - -msgid "dec" -msgstr "دسمبر" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "جنوری" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "فروری" - -msgctxt "abbrev. month" -msgid "March" -msgstr "مارچ" - -msgctxt "abbrev. month" -msgid "April" -msgstr "اپریل" - -msgctxt "abbrev. month" -msgid "May" -msgstr "مئی" - -msgctxt "abbrev. month" -msgid "June" -msgstr "جون" - -msgctxt "abbrev. month" -msgid "July" -msgstr "جولائی" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "اگست" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ستمبر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "اکتوبر" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "نومبر" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "دسمبر" - -msgctxt "alt. month" -msgid "January" -msgstr "جنوری" - -msgctxt "alt. month" -msgid "February" -msgstr "فروری" - -msgctxt "alt. month" -msgid "March" -msgstr "مارچ" - -msgctxt "alt. month" -msgid "April" -msgstr "اپریل" - -msgctxt "alt. month" -msgid "May" -msgstr "مئی" - -msgctxt "alt. month" -msgid "June" -msgstr "جون" - -msgctxt "alt. month" -msgid "July" -msgstr "جولائی" - -msgctxt "alt. month" -msgid "August" -msgstr "اگست" - -msgctxt "alt. month" -msgid "September" -msgstr "ستمبر" - -msgctxt "alt. month" -msgid "October" -msgstr "اکتوبر" - -msgctxt "alt. month" -msgid "November" -msgstr "نومبر" - -msgctxt "alt. month" -msgid "December" -msgstr "دسمبر" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "یا" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "،" - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/uz/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/uz/LC_MESSAGES/django.mo deleted file mode 100644 index b003df8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/uz/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/uz/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/uz/LC_MESSAGES/django.po deleted file mode 100644 index ad57ba9..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/uz/LC_MESSAGES/django.po +++ /dev/null @@ -1,1322 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abdulaminkhon Khaydarov , 2020 -# Bedilbek Khamidov , 2019 -# Claude Paroz , 2020 -# Shukrullo Turgunov , 2023 -# Sukhrobbek Ismatov , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-25 06:49+0000\n" -"Last-Translator: Shukrullo Turgunov , 2023\n" -"Language-Team: Uzbek (http://app.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Afrika tili" - -msgid "Arabic" -msgstr "Arab tili" - -msgid "Algerian Arabic" -msgstr "Jazoir arab tili" - -msgid "Asturian" -msgstr "Asturiya tili" - -msgid "Azerbaijani" -msgstr "Ozarbayjon tili" - -msgid "Bulgarian" -msgstr "Bolgar tili" - -msgid "Belarusian" -msgstr "Belorus tili" - -msgid "Bengali" -msgstr "Bengal tili" - -msgid "Breton" -msgstr "Breton tili" - -msgid "Bosnian" -msgstr "Bosniya tili" - -msgid "Catalan" -msgstr "Katalon tili" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Chex tili" - -msgid "Welsh" -msgstr "Uels tili" - -msgid "Danish" -msgstr "Daniya tili" - -msgid "German" -msgstr "Nemis tili" - -msgid "Lower Sorbian" -msgstr "Quyi sorbiya tili" - -msgid "Greek" -msgstr "Yunon tili" - -msgid "English" -msgstr "Ingliz tili" - -msgid "Australian English" -msgstr "Avstraliya ingliz tili" - -msgid "British English" -msgstr "Britan Ingliz tili" - -msgid "Esperanto" -msgstr "Esperanto tili" - -msgid "Spanish" -msgstr "Ispan tili" - -msgid "Argentinian Spanish" -msgstr "Argentina Ispan tili" - -msgid "Colombian Spanish" -msgstr "Kolumbiya Ispan tili" - -msgid "Mexican Spanish" -msgstr "Meksika Ispan tili " - -msgid "Nicaraguan Spanish" -msgstr "Nikaragua Ispan tili" - -msgid "Venezuelan Spanish" -msgstr "Venesuela Ispan tili" - -msgid "Estonian" -msgstr "Estoniya tili" - -msgid "Basque" -msgstr "Bask tili" - -msgid "Persian" -msgstr "Fors tili" - -msgid "Finnish" -msgstr "Fin tili" - -msgid "French" -msgstr "Fransuz tili" - -msgid "Frisian" -msgstr "Friziya tili" - -msgid "Irish" -msgstr "Irland tili" - -msgid "Scottish Gaelic" -msgstr "Shotland Gal tili" - -msgid "Galician" -msgstr "Galisiya tili" - -msgid "Hebrew" -msgstr "Ibroniy tili" - -msgid "Hindi" -msgstr "Hind tili" - -msgid "Croatian" -msgstr "Xorvat tili" - -msgid "Upper Sorbian" -msgstr "Yuqori Sorbiya tili" - -msgid "Hungarian" -msgstr "Vengriya tili" - -msgid "Armenian" -msgstr "Arman tili" - -msgid "Interlingua" -msgstr "Interlingua tili" - -msgid "Indonesian" -msgstr "Indoneziya tili" - -msgid "Igbo" -msgstr "Igbo tili" - -msgid "Ido" -msgstr "Ido tili" - -msgid "Icelandic" -msgstr "Island tili" - -msgid "Italian" -msgstr "Italyan tili" - -msgid "Japanese" -msgstr "Yapon tili" - -msgid "Georgian" -msgstr "Gruzin tili" - -msgid "Kabyle" -msgstr "Kabil tili" - -msgid "Kazakh" -msgstr "Qozoq tili" - -msgid "Khmer" -msgstr "Xmer tili" - -msgid "Kannada" -msgstr "Kannada tili" - -msgid "Korean" -msgstr "Koreys tili" - -msgid "Kyrgyz" -msgstr "Qirg'iz tili" - -msgid "Luxembourgish" -msgstr "Lyuksemburg tili" - -msgid "Lithuanian" -msgstr "Litva tili" - -msgid "Latvian" -msgstr "Latviya tili" - -msgid "Macedonian" -msgstr "Makedoniya tili" - -msgid "Malayalam" -msgstr "Malayalam tili" - -msgid "Mongolian" -msgstr "Mo'g'ul tili" - -msgid "Marathi" -msgstr "Marati tili" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Birma tili" - -msgid "Norwegian Bokmål" -msgstr "Norvegiya Bokmal tili" - -msgid "Nepali" -msgstr "Nepal tili" - -msgid "Dutch" -msgstr "Golland tili" - -msgid "Norwegian Nynorsk" -msgstr "Norvegiya Ninorsk tili" - -msgid "Ossetic" -msgstr "Osetik tili" - -msgid "Punjabi" -msgstr "Panjob tili" - -msgid "Polish" -msgstr "Polyak tili" - -msgid "Portuguese" -msgstr "Portugal tili" - -msgid "Brazilian Portuguese" -msgstr "Braziliya Portugal tili" - -msgid "Romanian" -msgstr "Rumin tili" - -msgid "Russian" -msgstr "Rus tili" - -msgid "Slovak" -msgstr "Slovak tili" - -msgid "Slovenian" -msgstr "Slovan tili" - -msgid "Albanian" -msgstr "Alban tili" - -msgid "Serbian" -msgstr "Serb tili" - -msgid "Serbian Latin" -msgstr "Serbiya Lotin tili" - -msgid "Swedish" -msgstr "Shved tili" - -msgid "Swahili" -msgstr "Suaxili tili" - -msgid "Tamil" -msgstr "Tamil tili" - -msgid "Telugu" -msgstr "Telugu tili" - -msgid "Tajik" -msgstr "Tojik tili" - -msgid "Thai" -msgstr "Tay tili" - -msgid "Turkmen" -msgstr "Turkman tili" - -msgid "Turkish" -msgstr "Turk tili" - -msgid "Tatar" -msgstr "Tatar tili" - -msgid "Udmurt" -msgstr "Udmurt tili" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "Ukrain tili" - -msgid "Urdu" -msgstr "Urdu tili" - -msgid "Uzbek" -msgstr "O'zbek tili" - -msgid "Vietnamese" -msgstr "Vetnam tili" - -msgid "Simplified Chinese" -msgstr "Soddalashtirilgan xitoy tili" - -msgid "Traditional Chinese" -msgstr "An'anaviy xitoy tili" - -msgid "Messages" -msgstr "Xabarlar" - -msgid "Site Maps" -msgstr "Sayt xaritalari" - -msgid "Static Files" -msgstr "Statik fayllar" - -msgid "Syndication" -msgstr "Sindikatsiya" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Bu sahifa raqami butun son emas" - -msgid "That page number is less than 1" -msgstr "Bu sahifa raqami 1 dan kichik" - -msgid "That page contains no results" -msgstr "Ushbu sahifada hech qanday natija yo'q" - -msgid "Enter a valid value." -msgstr "To'g'ri qiymatni kiriting." - -msgid "Enter a valid URL." -msgstr "To'g'ri URL manzilini kiriting." - -msgid "Enter a valid integer." -msgstr "To'g'ri butun sonni kiriting." - -msgid "Enter a valid email address." -msgstr "To'g'ri elektron pochta manzilini kiriting." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Harflar, raqamlar, pastki chiziqlar yoki chiziqlardan iborat to'g'ri " -"\"slug\" ni kiriting." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Unicode harflari, raqamlari, pastki chiziqlari yoki chiziqlardan iborat " -"to'g'ri \"slug\" ni kiriting." - -msgid "Enter a valid IPv4 address." -msgstr "To'g'ri IPv4 manzilini kiriting." - -msgid "Enter a valid IPv6 address." -msgstr "To'g'ri IPv6 manzilini kiriting." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "To'g'ri IPv4 yoki IPv6 manzilini kiriting." - -msgid "Enter only digits separated by commas." -msgstr "Faqat vergul bilan ajratilgan raqamlarni kiriting." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Ushbu qiymat %(limit_value)s ekanligiga ishonch hosil qiling (Hozir u " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Ushbu qiymat %(limit_value)s dan kichik yoki unga teng ekanligini tekshiring." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Ushbu qiymat %(limit_value)s dan katta yoki unga teng ekanligini tekshiring." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ushbu qiymat kamida %(limit_value)dga ega ekanligiga ishonch hosil qiling " -"(unda bor %(show_value)d)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ushbu qiymat eng ko'pi bilan %(limit_value)d ta belgidan iboratligiga " -"ishonch hosil qiling (hozir, %(show_value)d tadan iborat)." - -msgid "Enter a number." -msgstr "Raqamni kiriting." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -"Umumiy raqamlar soni %(max)s tadan ko'p bo'lmasligiga ishonch hosil qiling." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"O'nlik kasr xonalari %(max)s tadan ko'p bo'lmasligiga ishonch hosil qiling." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"O'nli kasr nuqtasidan oldin %(max)s tadan ko'p raqam bo'lmasligiga ishonch " -"hosil qiling." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"\"%(extension)s\" fayl kengaytmasiga ruxsat berilmagan Ruxsat berilgan " -"kengaytmalar: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Bo'shliq belgilaridan foydalanish mumkin emas." - -msgid "and" -msgstr "va" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s bilan %(model_name)s allaqachon mavjud." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r qiymati to'g'ri tanlov emas." - -msgid "This field cannot be null." -msgstr "Bu maydon bo‘shliq belgisidan iborat bo'lishi mumkin emas." - -msgid "This field cannot be blank." -msgstr "Bu maydon bo‘sh bo‘lishi mumkin emas." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "\"%(field_label)s\" %(model_name)s allaqachon mavjud." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s %(date_field_label)s %(lookup_type)s uchun noyob bo'lishi " -"kerak." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Maydon turi: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "\"%(value)s\" qiymati rost yoki yolg'on bo'lishi kerak." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" -"\"%(value)s\" qiymati Rost, Yolg'on yoki Bo'shliq belgisidan iborat bo'lishi " -"kerak." - -msgid "Boolean (Either True or False)" -msgstr "Mantiqiy (Rost yoki Yolg'on)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Birikma uzunligi (%(max_length)s gacha)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Vergul bilan ajratilgan butun sonlar" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"\"%(value)s\" qiymati yaroqsiz sana formatiga ega. U YYYY-MM-DD formatida " -"bo'lishi kerak." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"\"%(value)s\" qiymati to'g'ri formatga (YYYY-MM-DD) ega, ammo bu noto'g'ri " -"sana." - -msgid "Date (without time)" -msgstr "Sana (vaqtsiz)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"\"%(value)s\" qiymati noto'g'ri formatga ega. U YYYY-MM-DD HH: MM [: ss [." -"uuuuuu]] [TZ] formatida bo'lishi kerak." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"\"%(value)s\" qiymati to'g'ri formatga ega (YYYY-MM-DD HH: MM [: ss [." -"uuuuuu]] [TZ]), lekin u noto'g'ri sana / vaqt." - -msgid "Date (with time)" -msgstr "Sana (vaqt bilan)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "\"%(value)s\" qiymati o'nlik kasr sonlardan iborat bo'lishi kerak." - -msgid "Decimal number" -msgstr "O'nli kasr son" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"\"%(value)s\" qiymati noto'g'ri formatga ega. U [DD] [[HH:] MM:] ss [." -"uuuuuu] formatida bo'lishi kerak." - -msgid "Duration" -msgstr "Davomiyligi" - -msgid "Email address" -msgstr "Elektron pochta manzili" - -msgid "File path" -msgstr "Fayl manzili" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "\"%(value)s\" qiymati haqiqiy son bo'lishi kerak." - -msgid "Floating point number" -msgstr "Haqiqiy son" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "\"%(value)s\" qiymati butun son bo'lishi kerak." - -msgid "Integer" -msgstr "Butun son" - -msgid "Big (8 byte) integer" -msgstr "Katta (8 bayt) butun son" - -msgid "Small integer" -msgstr "Kichik butun son" - -msgid "IPv4 address" -msgstr "IPv4 manzili" - -msgid "IP address" -msgstr "IP manzili" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"%(value)s\" qiymati Yo‘q, To‘g‘ri yoki Noto'g'ri bo'lishi kerak." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (To'g'ri, Yolg'on yoki Hech biri)" - -msgid "Positive big integer" -msgstr "Musbat katta butun son" - -msgid "Positive integer" -msgstr "Ijobiy butun son" - -msgid "Positive small integer" -msgstr "Musbat kichik butun son" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug uzunligi (%(max_length)s gacha)" - -msgid "Text" -msgstr "Matn" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"\"%(value)s\" qiymati noto'g'ri formatga ega. U HH: MM [: ss [.uuuuuu]] " -"formatida bo'lishi kerak." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"\"%(value)s\" qiymati to'g'ri formatga ega (HH: MM [: ss [.uuuuuu]]), lekin " -"bu noto'g'ri vaqt." - -msgid "Time" -msgstr "Vaqt" - -msgid "URL" -msgstr "URL manzili" - -msgid "Raw binary data" -msgstr "Tartibsiz Ikkilik ma'lumotlar" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" to'g'ri UUID emas." - -msgid "Universally unique identifier" -msgstr "Umum noyob aniqlovchi" - -msgid "File" -msgstr "Fayl" - -msgid "Image" -msgstr "Rasm" - -msgid "A JSON object" -msgstr "JSON ob'ekti" - -msgid "Value must be valid JSON." -msgstr "Qiymat yaroqli JSON bo'lishi kerak." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s %(value)r lari bilan %(model)s namunasi uchun mavjud emas." - -msgid "Foreign Key (type determined by related field)" -msgstr "Tashqi kalit (turi aloqador maydon tomonidan belgilanadi)" - -msgid "One-to-one relationship" -msgstr "Birga-bir yago munosabat" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s -%(to)s gacha bo'lgan munosabat" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s -%(to)s gacha bo'lgan munosabatlar" - -msgid "Many-to-many relationship" -msgstr "Ko'pchilikka-ko'pchilik munosabatlar" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ushbu maydon to'ldirilishi shart." - -msgid "Enter a whole number." -msgstr "Butun raqamni kiriting." - -msgid "Enter a valid date." -msgstr "Sanani to‘g‘ri kiriting." - -msgid "Enter a valid time." -msgstr "Vaqtni to‘g‘ri kiriting." - -msgid "Enter a valid date/time." -msgstr "Sana/vaqtni to‘g‘ri kiriting." - -msgid "Enter a valid duration." -msgstr "Muddatni to'g'ri kiriting." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Kunlar soni {min_days} va {max_days} orasida bo'lishi kerak." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Hech qanday fayl yuborilmadi. Formadagi kodlash turini tekshiring." - -msgid "No file was submitted." -msgstr "Hech qanday fayl yuborilmadi." - -msgid "The submitted file is empty." -msgstr "Yuborilgan etilgan fayl bo'sh." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Fayl nomi maksimum %(max)d belgilardan ko'p emasligiga ishonch hosil qiling " -"(hozir %(length)d belgi ishlatilgan)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Iltimos, faylni yuboring yoki katachani belgilang, lekin ikkalasinimas." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"To'g'ri rasmni yuklang. Siz yuklagan fayl yoki rasm emas yoki buzilgan rasm " -"edi." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "To'g'ri tanlovni tanlang. %(value)s mavjud tanlovlardan biri emas." - -msgid "Enter a list of values." -msgstr "Qiymatlar ro'yxatini kiriting." - -msgid "Enter a complete value." -msgstr "To'liq qiymatni kiriting." - -msgid "Enter a valid UUID." -msgstr "To'g'ri UUID kiriting." - -msgid "Enter a valid JSON." -msgstr "Yaroqli JSONni kiriting." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Yashirilgan maydon %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" - -msgid "Order" -msgstr "Buyurtma" - -msgid "Delete" -msgstr "Yo'q qilish" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Iltimos, %(field)s uchun takroriy ma'lumotni tuzating." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Iltimos, noyob bo'lishi kerak bo'lgan %(field)s uchun takroriy ma'lumotlarni " -"to'g'rilang." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Iltimos, %(field_name)s uchun takroriy ma'lumotlarni %(date_field)s ga noyob " -"bo'la oladigan %(lookup)s ichidagi ma'lumotlarni moslab to'g'rilang." - -msgid "Please correct the duplicate values below." -msgstr "Iltimos, quyidagi takroriy qiymatlarni to'g'irlang." - -msgid "The inline value did not match the parent instance." -msgstr "Kiritilgan ichki qiymat ajdod misoliga mos kelmaydi." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "To'g'ri tanlovni tanlang. Bu tanlov mavjud tanlovlardan biri emas." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" to'g'ri qiymat emas." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s vaqtni %(current_timezone)s mintaqa talqinida ifodalab " -"bo'lmadi; u noaniq yoki mavjud bo'lmasligi mumkin." - -msgid "Clear" -msgstr "Aniq" - -msgid "Currently" -msgstr "Hozirda" - -msgid "Change" -msgstr "O'zgartirish" - -msgid "Unknown" -msgstr "Noma'lum" - -msgid "Yes" -msgstr "Ha" - -msgid "No" -msgstr "Yo'q" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ha,yo'q,ehtimol" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)dbayt" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "kechqurun" - -msgid "a.m." -msgstr "ertalab" - -msgid "PM" -msgstr "Kechqurun" - -msgid "AM" -msgstr "Ertalab" - -msgid "midnight" -msgstr "yarim tunda" - -msgid "noon" -msgstr "peshin" - -msgid "Monday" -msgstr "Dushanba" - -msgid "Tuesday" -msgstr "Seshanba" - -msgid "Wednesday" -msgstr "Chorshanba" - -msgid "Thursday" -msgstr "Payshanba" - -msgid "Friday" -msgstr "Juma" - -msgid "Saturday" -msgstr "Shanba" - -msgid "Sunday" -msgstr "Yakshanba" - -msgid "Mon" -msgstr "Dush" - -msgid "Tue" -msgstr "Sesh" - -msgid "Wed" -msgstr "Chor" - -msgid "Thu" -msgstr "Pay" - -msgid "Fri" -msgstr "Jum" - -msgid "Sat" -msgstr "Shan" - -msgid "Sun" -msgstr "Yak" - -msgid "January" -msgstr "Yanvar" - -msgid "February" -msgstr "Fevral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Aprel" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "Iyun" - -msgid "July" -msgstr "Iyul" - -msgid "August" -msgstr "Avgust" - -msgid "September" -msgstr "Sentabr" - -msgid "October" -msgstr "Oktabr" - -msgid "November" -msgstr "Noyabr" - -msgid "December" -msgstr "Dekabr" - -msgid "jan" -msgstr "yan" - -msgid "feb" -msgstr "fev" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "iyn" - -msgid "jul" -msgstr "iyl" - -msgid "aug" -msgstr "avg" - -msgid "sep" -msgstr "sen" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "noy" - -msgid "dec" -msgstr "dek" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Yan," - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Fev." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprel" - -msgctxt "abbrev. month" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Iyun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Iyul" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Avg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sen." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Noy." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dek." - -msgctxt "alt. month" -msgid "January" -msgstr "Yanvar" - -msgctxt "alt. month" -msgid "February" -msgstr "Fevral" - -msgctxt "alt. month" -msgid "March" -msgstr "Mart" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprel" - -msgctxt "alt. month" -msgid "May" -msgstr "May" - -msgctxt "alt. month" -msgid "June" -msgstr "Iyun" - -msgctxt "alt. month" -msgid "July" -msgstr "Iyul" - -msgctxt "alt. month" -msgid "August" -msgstr "Avgust" - -msgctxt "alt. month" -msgid "September" -msgstr "Sentabr" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktabr" - -msgctxt "alt. month" -msgid "November" -msgstr "Noyabr" - -msgctxt "alt. month" -msgid "December" -msgstr "Dekabr" - -msgid "This is not a valid IPv6 address." -msgstr "Bu to'g'ri IPv6 manzili emas." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "yoki" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d yil" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)doy" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hafta" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d kun" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d soat" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d daqiqa" - -msgid "Forbidden" -msgstr "Taqiqlangan" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF tekshiruvi amalga oshmadi. So‘rov bekor qilindi." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Agar siz \"Referer\" sarlavhalarini o'chirib qo'yish uchun brauzeringizni " -"sozlagan bo'lsangiz, iltimos, hech bo'lmasa ushbu sayt uchun, HTTPS " -"ulanishlari, yoki \"same-origin\" so'rovlari uchun ularni qayta yoqib " -"qo'ying." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Agar siz yorlig'idan yoki " -"\"Referrer-Policy: no-referer\" sarlavhasidan foydalanayotgan bo'lsangiz, " -"iltimos ularni olib tashlang. CSRF himoyasi \"Referer\" sarlavhasini " -"havolalarni qat'iy tekshirishni talab qiladi. Agar maxfiyligingiz haqida " -"xavotirda bo'lsangiz, uchinchi tomon saytlari kabi " -"havola alternativalaridan foydalaning." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Siz ushbu xabarni ko'rmoqdasiz, chunki ushbu sayt formalarni yuborishda CSRF " -"cookie ma'lumotlarini talab qiladi. Ushbu cookie ma'lumotlari xavfsizlik " -"nuqtai nazaridan, brauzeringizni uchinchi shaxslar tomonidan " -"o'g'irlanmasligini ta'minlash uchun xizmat qilinadi." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Agar siz cookie ma'lumotlarni o'chirib qo'yish uchun brauzeringizni " -"konfiguratsiya qilgan bo'lsangiz, iltimos, ushbu sayt yoki \"same-origin\" " -"so'rovlari uchun ularni qayta yoqib qo'ying." - -msgid "More information is available with DEBUG=True." -msgstr "Qo'shimcha ma'lumotlarni DEBUG = True ifodasi bilan ko'rish mumkin." - -msgid "No year specified" -msgstr "Yil ko‘rsatilmagan" - -msgid "Date out of range" -msgstr "Sana chegaradan tashqarida" - -msgid "No month specified" -msgstr "Oy ko'rsatilmagan" - -msgid "No day specified" -msgstr "Hech qanday kun ko‘rsatilmagan" - -msgid "No week specified" -msgstr "Hech qanday hafta belgilanmagan" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Hech qanday %(verbose_name_plural)s lar mavjud emas" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Kelajak %(verbose_name_plural)s lari mavjud emas, chunki %(class_name)s." -"allow_future yolg'ondur." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"\"%(datestr)s\" sana birikmasi noto'g'ri berilgan. \"%(format)s\" formati " -"tavsiya etilgan" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "So'rovga mos keladigan %(verbose_name)s topilmadi" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Sahifa \"oxirgi\" emas va uni butun songa aylantirish mumkin emas." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Noto'g'ri sahifa (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Bo'sh ro'yxat va \"%(class_name)s.allow_empty\" yolg'on." - -msgid "Directory indexes are not allowed here." -msgstr "Bu yerda katalog indekslaridan foydalanib bo'lmaydi." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" mavjud emas" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s indeksi" - -msgid "The install worked successfully! Congratulations!" -msgstr "O'rnatish muvaffaqiyatli amalga oshdi! Tabriklaymiz!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django %(version)s uchun chiqarilgan " -"nashrlarni ko'rish" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Siz ushbu sahifani ko'rmoqdasiz, chunki DEBUG = True ifodasi sizning sozlamalar faylingizda " -"ko'rsatilgan va siz biron bir URL manzilini to'gri sozlamagansiz." - -msgid "Django Documentation" -msgstr "Django Hujjatlari" - -msgid "Topics, references, & how-to’s" -msgstr "Mavzular, havolalar va qanday qilish yo'llari" - -msgid "Tutorial: A Polling App" -msgstr "Qo'llanma: So'rovnoma" - -msgid "Get started with Django" -msgstr "Django bilan boshlang" - -msgid "Django Community" -msgstr "Django hamjamiyati" - -msgid "Connect, get help, or contribute" -msgstr "Bog'laning, yordam oling yoki hissa qo'shing" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/uz/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/uz/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/uz/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/uz/formats.py deleted file mode 100644 index 2c7ee73..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/uz/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j-E, Y-\y\i\l" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = r"j-E, Y-\y\i\l G:i" -YEAR_MONTH_FORMAT = r"F Y-\y\i\l" -MONTH_DAY_FORMAT = "j-E" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d-%B, %Y-yil", # '25-Oktabr, 2006-yil' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d-%B, %Y-yil %H:%M:%S", # '25-Oktabr, 2006-yil 14:30:59' - "%d-%B, %Y-yil %H:%M:%S.%f", # '25-Oktabr, 2006-yil 14:30:59.000200' - "%d-%B, %Y-yil %H:%M", # '25-Oktabr, 2006-yil 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index 43a2a61..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/vi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index a0e6eb4..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,1234 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# Anh Phan , 2013 -# Thanh Le Viet , 2013 -# Tran , 2011 -# Tran Van , 2011,2013 -# Vuong Nguyen , 2011 -# xgenvn , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Tiếng Ả Rập" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Asturian" - -msgid "Azerbaijani" -msgstr "Tiếng Azerbaijan" - -msgid "Bulgarian" -msgstr "Tiếng Bun-ga-ri" - -msgid "Belarusian" -msgstr "Tiếng Bê-la-rút" - -msgid "Bengali" -msgstr "Tiếng Bengal" - -msgid "Breton" -msgstr "Tiếng Breton" - -msgid "Bosnian" -msgstr "Tiếng Bosnia" - -msgid "Catalan" -msgstr "Tiếng Catala" - -msgid "Czech" -msgstr "Tiếng Séc" - -msgid "Welsh" -msgstr "Xứ Wales" - -msgid "Danish" -msgstr "Tiếng Đan Mạch" - -msgid "German" -msgstr "Tiếng Đức" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Tiếng Hy Lạp" - -msgid "English" -msgstr "Tiếng Anh" - -msgid "Australian English" -msgstr "Tiếng Anh ở Úc" - -msgid "British English" -msgstr "British English" - -msgid "Esperanto" -msgstr "Quốc Tế Ngữ" - -msgid "Spanish" -msgstr "Tiếng Tây Ban Nha" - -msgid "Argentinian Spanish" -msgstr "Argentinian Spanish" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Mexican Spanish" - -msgid "Nicaraguan Spanish" -msgstr "Tiếng Tây Ban Nha-Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Tiếng Vê-nê-du-ê-la" - -msgid "Estonian" -msgstr "Tiếng Estonia" - -msgid "Basque" -msgstr "Tiếng Baxcơ" - -msgid "Persian" -msgstr "Tiếng Ba Tư" - -msgid "Finnish" -msgstr "Tiếng Phần Lan" - -msgid "French" -msgstr "Tiếng Pháp" - -msgid "Frisian" -msgstr "Tiếng Frisco" - -msgid "Irish" -msgstr "Tiếng Ai-len" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Tiếng Pháp cổ" - -msgid "Hebrew" -msgstr "Tiếng Do Thái cổ" - -msgid "Hindi" -msgstr "Tiếng Hindi" - -msgid "Croatian" -msgstr "Tiếng Croatia" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Tiếng Hung-ga-ri" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Tiếng Khoa học Quốc tế" - -msgid "Indonesian" -msgstr "Tiếng In-đô-nê-xi-a" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Tiếng Aixơlen" - -msgid "Italian" -msgstr "Tiếng Ý" - -msgid "Japanese" -msgstr "Tiếng Nhật Bản" - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Tiếng Kazakh" - -msgid "Khmer" -msgstr "Tiếng Khơ-me" - -msgid "Kannada" -msgstr "Tiếng Kannada" - -msgid "Korean" -msgstr "Tiếng Hàn Quốc" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Tiếng Luxembourg" - -msgid "Lithuanian" -msgstr "Tiếng Lat-vi" - -msgid "Latvian" -msgstr "Ngôn ngữ vùng Bantic" - -msgid "Macedonian" -msgstr "Tiếng Maxêđôni" - -msgid "Malayalam" -msgstr "Tiếng Malayalam" - -msgid "Mongolian" -msgstr "Tiếng Mông Cổ" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Burmese" -msgstr "My-an-ma" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nê-pan" - -msgid "Dutch" -msgstr "Tiếng Hà Lan" - -msgid "Norwegian Nynorsk" -msgstr "Tiếng Na Uy Nynorsk" - -msgid "Ossetic" -msgstr "Ô-sét-ti-a" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Tiếng Ba lan" - -msgid "Portuguese" -msgstr "Tiếng Bồ Đào Nha" - -msgid "Brazilian Portuguese" -msgstr "Brazilian Portuguese" - -msgid "Romanian" -msgstr "Tiếng Ru-ma-ni" - -msgid "Russian" -msgstr "Tiếng Nga" - -msgid "Slovak" -msgstr "Ngôn ngữ Slô-vac" - -msgid "Slovenian" -msgstr "Tiếng Slôven" - -msgid "Albanian" -msgstr "Tiếng Albania" - -msgid "Serbian" -msgstr "Tiếng Xéc-bi" - -msgid "Serbian Latin" -msgstr "Serbian Latin" - -msgid "Swedish" -msgstr "Tiếng Thụy Điển" - -msgid "Swahili" -msgstr "Xì-qua-hi-đi thuộc ngôn ngữ Bantu" - -msgid "Tamil" -msgstr "Tiếng Ta-min" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tiếng Thái" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Tiếng Thổ Nhĩ Kỳ" - -msgid "Tatar" -msgstr "Tác-ta" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Tiếng Ukraina" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Tiếng Việt Nam" - -msgid "Simplified Chinese" -msgstr "Tiếng Tàu giản thể" - -msgid "Traditional Chinese" -msgstr "Tiếng Tàu truyền thống" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "Bản đồ trang web" - -msgid "Static Files" -msgstr "Tập tin tĩnh" - -msgid "Syndication" -msgstr "Syndication" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Nhập một giá trị hợp lệ." - -msgid "Enter a valid URL." -msgstr "Nhập một URL hợp lệ." - -msgid "Enter a valid integer." -msgstr "Nhập một số nguyên hợp lệ." - -msgid "Enter a valid email address." -msgstr "Nhập địa chỉ email." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Nhập một địa chỉ IPv4 hợp lệ." - -msgid "Enter a valid IPv6 address." -msgstr "Nhập địa chỉ IPv6 hợp lệ" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Nhập địa chỉ IPv4 hoặc IPv6 hợp lệ" - -msgid "Enter only digits separated by commas." -msgstr "Chỉ nhập chữ số, cách nhau bằng dấu phẩy." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Đảm bảo giá trị này là %(limit_value)s (nó là %(show_value)s )." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Đảm bảo giá trị này là nhỏ hơn hoặc bằng với %(limit_value)s ." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Đảm bảo giá trị này lớn hơn hoặc bằng với %(limit_value)s ." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Giá trị này phải có ít nhất %(limit_value)d kí tự (hiện có %(show_value)d)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Giá trị này chỉ có tối đa %(limit_value)d kí tự (hiện có %(show_value)d)" - -msgid "Enter a number." -msgstr "Nhập một số." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Đảm bảo rằng tối đa không có nhiều hơn %(max)s số." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Hãy chắc chắn rằng không có nhiều hơn %(max)s chữ số thập phân." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Hãy chắc chắn rằng không có nhiều hơn %(max)s chữ số trước dấu phẩy thập " -"phân." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "và" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s với thông tin %(field_labels)s đã tồn tại" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Giá trị %(value)r không phải là lựa chọn hợp lệ." - -msgid "This field cannot be null." -msgstr "Trường này không thể để trống." - -msgid "This field cannot be blank." -msgstr "Trường này không được để trắng." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s có %(field_label)s đã tồn tại." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s phải là duy nhất %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Trường thuộc dạng: %(field_type)s " - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (hoặc là Đúng hoặc là Sai)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Chuỗi (dài đến %(max_length)s ký tự )" - -msgid "Comma-separated integers" -msgstr "Các số nguyên được phân cách bằng dấu phẩy" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Ngày (không có giờ)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Ngày (có giờ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Số thập phân" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Địa chỉ email" - -msgid "File path" -msgstr "Đường dẫn tắt tới file" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Giá trị dấu chấm động" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Số nguyên" - -msgid "Big (8 byte) integer" -msgstr "Big (8 byte) integer" - -msgid "IPv4 address" -msgstr "Địa chỉ IPv4" - -msgid "IP address" -msgstr "Địa chỉ IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Luận lý (Có thể Đúng, Sai hoặc Không cái nào đúng)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Số nguyên dương" - -msgid "Positive small integer" -msgstr "Số nguyên dương nhỏ" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug(lên đến %(max_length)s)" - -msgid "Small integer" -msgstr "Số nguyên nhỏ" - -msgid "Text" -msgstr "Đoạn văn" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Giờ" - -msgid "URL" -msgstr "Đường dẫn URL" - -msgid "Raw binary data" -msgstr "Dữ liệu nhị phân " - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "File" - -msgid "Image" -msgstr "Image" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Khóa ngoại (kiểu được xác định bởi trường liên hệ)" - -msgid "One-to-one relationship" -msgstr "Mối quan hệ một-một" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Mối quan hệ nhiều-nhiều" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Trường này là bắt buộc." - -msgid "Enter a whole number." -msgstr "Nhập một số tổng thể." - -msgid "Enter a valid date." -msgstr "Nhập một ngày hợp lệ." - -msgid "Enter a valid time." -msgstr "Nhập một thời gian hợp lệ." - -msgid "Enter a valid date/time." -msgstr "Nhập một ngày/thời gian hợp lệ." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Không có tập tin nào được gửi. Hãy kiểm tra kiểu mã hóa của biểu mẫu." - -msgid "No file was submitted." -msgstr "Không có tập tin nào được gửi." - -msgid "The submitted file is empty." -msgstr "Tập tin được gửi là rỗng." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "Tên tệp tin có tối đa %(max)d kí tự (Hiện có %(length)d)" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Vui lòng gửi một tập tin hoặc để ô chọn trắng, không chọn cả hai." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Hãy tải lên một hình ảnh hợp lệ. Tập tin mà bạn đã tải không phải là hình " -"ảnh hoặc đã bị hư hỏng." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Hãy chọn một lựa chọn hợp lệ. %(value)s không phải là một trong các lựa chọn " -"khả thi." - -msgid "Enter a list of values." -msgstr "Nhập một danh sách giá trị." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Trường ẩn %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Vui lòng đệ trình %d hoặc ít các mẫu đơn hơn." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "Thứ tự" - -msgid "Delete" -msgstr "Xóa" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Hãy sửa các dữ liệu trùng lặp cho %(field)s ." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Hãy sửa các dữ liệu trùng lặp cho %(field)s, mà phải là duy nhất." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Hãy sửa các dữ liệu trùng lặp cho %(field_name)s mà phải là duy nhất cho " -"%(lookup)s tại %(date_field)s ." - -msgid "Please correct the duplicate values below." -msgstr "Hãy sửa các giá trị trùng lặp dưới đây." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Hãy chọn một lựa chọn hợp lệ. Lựa chọn đó không phải là một trong các lựa " -"chọn khả thi." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Xóa" - -msgid "Currently" -msgstr "Hiện nay" - -msgid "Change" -msgstr "Thay đổi" - -msgid "Unknown" -msgstr "Chưa xác định" - -msgid "Yes" -msgstr "Có" - -msgid "No" -msgstr "Không" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "Có,Không,Có thể" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "chiều" - -msgid "AM" -msgstr "sáng" - -msgid "midnight" -msgstr "Nửa đêm" - -msgid "noon" -msgstr "Buổi trưa" - -msgid "Monday" -msgstr "Thứ 2" - -msgid "Tuesday" -msgstr "Thứ 3" - -msgid "Wednesday" -msgstr "Thứ 4" - -msgid "Thursday" -msgstr "Thứ 5" - -msgid "Friday" -msgstr "Thứ 6" - -msgid "Saturday" -msgstr "Thứ 7" - -msgid "Sunday" -msgstr "Chủ nhật" - -msgid "Mon" -msgstr "Thứ 2" - -msgid "Tue" -msgstr "Thứ 3" - -msgid "Wed" -msgstr "Thứ 4" - -msgid "Thu" -msgstr "Thứ 5" - -msgid "Fri" -msgstr "Thứ 6" - -msgid "Sat" -msgstr "Thứ 7" - -msgid "Sun" -msgstr "Chủ nhật" - -msgid "January" -msgstr "Tháng 1" - -msgid "February" -msgstr "Tháng 2" - -msgid "March" -msgstr "Tháng 3" - -msgid "April" -msgstr "Tháng 4" - -msgid "May" -msgstr "Tháng 5" - -msgid "June" -msgstr "Tháng 6" - -msgid "July" -msgstr "Tháng 7" - -msgid "August" -msgstr "Tháng 8" - -msgid "September" -msgstr "Tháng 9" - -msgid "October" -msgstr "Tháng 10" - -msgid "November" -msgstr "Tháng 11" - -msgid "December" -msgstr "Tháng 12" - -msgid "jan" -msgstr "Tháng 1" - -msgid "feb" -msgstr "Tháng 2" - -msgid "mar" -msgstr "Tháng 3" - -msgid "apr" -msgstr "Tháng 4" - -msgid "may" -msgstr "Tháng 5" - -msgid "jun" -msgstr "Tháng 6" - -msgid "jul" -msgstr "Tháng 7" - -msgid "aug" -msgstr "Tháng 8" - -msgid "sep" -msgstr "Tháng 9" - -msgid "oct" -msgstr "Tháng 10" - -msgid "nov" -msgstr "Tháng 11" - -msgid "dec" -msgstr "Tháng 12" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Tháng 1." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Tháng 2." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Tháng ba" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Tháng tư" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Tháng năm" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Tháng sáu" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Tháng bảy" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Tháng 8." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Tháng 9." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Tháng 10." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Tháng 11." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Tháng 12." - -msgctxt "alt. month" -msgid "January" -msgstr "Tháng một" - -msgctxt "alt. month" -msgid "February" -msgstr "Tháng hai" - -msgctxt "alt. month" -msgid "March" -msgstr "Tháng ba" - -msgctxt "alt. month" -msgid "April" -msgstr "Tháng tư" - -msgctxt "alt. month" -msgid "May" -msgstr "Tháng năm" - -msgctxt "alt. month" -msgid "June" -msgstr "Tháng sáu" - -msgctxt "alt. month" -msgid "July" -msgstr "Tháng bảy" - -msgctxt "alt. month" -msgid "August" -msgstr "Tháng tám" - -msgctxt "alt. month" -msgid "September" -msgstr "Tháng Chín" - -msgctxt "alt. month" -msgid "October" -msgstr "Tháng Mười" - -msgctxt "alt. month" -msgid "November" -msgstr "Tháng mười một" - -msgctxt "alt. month" -msgid "December" -msgstr "Tháng mười hai" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "hoặc" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d năm" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d tháng" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d tuần" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d ngày" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d giờ" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d phút" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Không có năm xác định" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Không có tháng xác định" - -msgid "No day specified" -msgstr "Không có ngày xác định" - -msgid "No week specified" -msgstr "Không có tuần xác định" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Không có %(verbose_name_plural)s phù hợp" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s trong tương lai không có sẵn vì %(class_name)s." -"allow_future là False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Không có %(verbose_name)s tìm thấy phù hợp với truy vấn" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Trang không hợp lệ (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Tại đây không cho phép đánh số chỉ mục dành cho thư mục." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index của %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/vi/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/vi/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/vi/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/vi/formats.py deleted file mode 100644 index 7b76020..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/vi/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"\N\gà\y d \t\há\n\g n \nă\m Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"H:i \N\gà\y d \t\há\n\g n \nă\m Y" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d-m-Y" -SHORT_DATETIME_FORMAT = "H:i d-m-Y" -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index c68035c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index 012741f..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,1326 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# HuanCheng Bai白宦成(Bestony) , 2017-2018 -# lanbla , 2021 -# Daniel Duan , 2013 -# Fan Xu , 2022 -# Ford Guo , 2022 -# Huanqun Yang, 2022 -# jack yang, 2023 -# jamin M , 2019 -# Jannis Leidel , 2011 -# Kevin Sze , 2012 -# Lele Long , 2011,2015,2017 -# Le Yang , 2018 -# li beite , 2020 -# Liping Wang , 2016-2017 -# L., 2024 -# matthew Yip , 2020 -# mozillazg , 2016 -# Ronald White , 2014 -# Lemon Li , 2013 -# Ray Wang , 2017 -# slene , 2011 -# Sun Liwen , 2014 -# Suntravel Chris , 2019 -# Veoco , 2021 -# Liping Wang , 2016 -# Wentao Han , 2018 -# wolf ice , 2020 -# Xiang Yu , 2014 -# Jeff Yin , 2013 -# Zhengyang Wang , 2017 -# ced773123cfad7b4e8b79ca80f736af9, 2011-2012 -# Ziya Tang , 2018 -# 付峥 , 2018 -# L., 2024 -# LatteFang <370358679@qq.com>, 2020 -# Kevin Sze , 2012 -# 高乐喆 , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 06:49+0000\n" -"Last-Translator: L., 2024\n" -"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "南非荷兰语" - -msgid "Arabic" -msgstr "阿拉伯语" - -msgid "Algerian Arabic" -msgstr "阿尔及利亚的阿拉伯语" - -msgid "Asturian" -msgstr "阿斯图里亚斯" - -msgid "Azerbaijani" -msgstr "阿塞拜疆语" - -msgid "Bulgarian" -msgstr "保加利亚语" - -msgid "Belarusian" -msgstr "白俄罗斯语" - -msgid "Bengali" -msgstr "孟加拉语" - -msgid "Breton" -msgstr "布雷顿" - -msgid "Bosnian" -msgstr "波斯尼亚语" - -msgid "Catalan" -msgstr "加泰罗尼亚语" - -msgid "Central Kurdish (Sorani)" -msgstr "中部库尔德语(Sorani)" - -msgid "Czech" -msgstr "捷克语" - -msgid "Welsh" -msgstr "威尔士语" - -msgid "Danish" -msgstr "丹麦语" - -msgid "German" -msgstr "德语" - -msgid "Lower Sorbian" -msgstr "下索布" - -msgid "Greek" -msgstr "希腊语" - -msgid "English" -msgstr "英语" - -msgid "Australian English" -msgstr "澳大利亚英语" - -msgid "British English" -msgstr "英国英语" - -msgid "Esperanto" -msgstr "世界语" - -msgid "Spanish" -msgstr "西班牙语" - -msgid "Argentinian Spanish" -msgstr "阿根廷西班牙语" - -msgid "Colombian Spanish" -msgstr "哥伦比亚西班牙语" - -msgid "Mexican Spanish" -msgstr "墨西哥西班牙语" - -msgid "Nicaraguan Spanish" -msgstr "尼加拉瓜西班牙语" - -msgid "Venezuelan Spanish" -msgstr "委内瑞拉西班牙语" - -msgid "Estonian" -msgstr "爱沙尼亚语" - -msgid "Basque" -msgstr "巴斯克语" - -msgid "Persian" -msgstr "波斯语" - -msgid "Finnish" -msgstr "芬兰语" - -msgid "French" -msgstr "法语" - -msgid "Frisian" -msgstr "夫里斯兰语" - -msgid "Irish" -msgstr "爱尔兰语" - -msgid "Scottish Gaelic" -msgstr "苏格兰盖尔语" - -msgid "Galician" -msgstr "加利西亚语" - -msgid "Hebrew" -msgstr "希伯来语" - -msgid "Hindi" -msgstr "北印度语" - -msgid "Croatian" -msgstr "克罗地亚语" - -msgid "Upper Sorbian" -msgstr "上索布" - -msgid "Hungarian" -msgstr "匈牙利语" - -msgid "Armenian" -msgstr "亚美尼亚语" - -msgid "Interlingua" -msgstr "国际语" - -msgid "Indonesian" -msgstr "印尼语" - -msgid "Igbo" -msgstr "伊博" - -msgid "Ido" -msgstr "简化伊多语" - -msgid "Icelandic" -msgstr "冰岛语" - -msgid "Italian" -msgstr "意大利语" - -msgid "Japanese" -msgstr "日语" - -msgid "Georgian" -msgstr "格鲁吉亚语" - -msgid "Kabyle" -msgstr "卡拜尔语" - -msgid "Kazakh" -msgstr "哈萨克语" - -msgid "Khmer" -msgstr "高棉语" - -msgid "Kannada" -msgstr "埃纳德语" - -msgid "Korean" -msgstr "韩语" - -msgid "Kyrgyz" -msgstr "吉尔吉斯坦语" - -msgid "Luxembourgish" -msgstr "卢森堡语" - -msgid "Lithuanian" -msgstr "立陶宛语" - -msgid "Latvian" -msgstr "拉脱维亚语" - -msgid "Macedonian" -msgstr "马其顿语" - -msgid "Malayalam" -msgstr "马来亚拉姆语" - -msgid "Mongolian" -msgstr "蒙古语" - -msgid "Marathi" -msgstr "马拉地语" - -msgid "Malay" -msgstr "马来语" - -msgid "Burmese" -msgstr "缅甸语" - -msgid "Norwegian Bokmål" -msgstr "挪威博克马尔" - -msgid "Nepali" -msgstr "尼泊尔语" - -msgid "Dutch" -msgstr "荷兰语" - -msgid "Norwegian Nynorsk" -msgstr "新挪威语" - -msgid "Ossetic" -msgstr "奥塞梯语" - -msgid "Punjabi" -msgstr "旁遮普语 " - -msgid "Polish" -msgstr "波兰语" - -msgid "Portuguese" -msgstr "葡萄牙语" - -msgid "Brazilian Portuguese" -msgstr "巴西葡萄牙语" - -msgid "Romanian" -msgstr "罗马尼亚语" - -msgid "Russian" -msgstr "俄语" - -msgid "Slovak" -msgstr "斯洛伐克语" - -msgid "Slovenian" -msgstr "斯洛文尼亚语" - -msgid "Albanian" -msgstr "阿尔巴尼亚语" - -msgid "Serbian" -msgstr "塞尔维亚语" - -msgid "Serbian Latin" -msgstr "塞尔维亚拉丁语" - -msgid "Swedish" -msgstr "瑞典语" - -msgid "Swahili" -msgstr "斯瓦西里语" - -msgid "Tamil" -msgstr "泰米尔语" - -msgid "Telugu" -msgstr "泰卢固语" - -msgid "Tajik" -msgstr "塔吉克语" - -msgid "Thai" -msgstr "泰语" - -msgid "Turkmen" -msgstr "土库曼人" - -msgid "Turkish" -msgstr "土耳其语" - -msgid "Tatar" -msgstr "鞑靼语" - -msgid "Udmurt" -msgstr "乌德穆尔特语" - -msgid "Uyghur" -msgstr "维吾尔语" - -msgid "Ukrainian" -msgstr "乌克兰语" - -msgid "Urdu" -msgstr "乌尔都语" - -msgid "Uzbek" -msgstr "乌兹别克语" - -msgid "Vietnamese" -msgstr "越南语" - -msgid "Simplified Chinese" -msgstr "简体中文" - -msgid "Traditional Chinese" -msgstr "繁体中文" - -msgid "Messages" -msgstr "消息" - -msgid "Site Maps" -msgstr "站点地图" - -msgid "Static Files" -msgstr "静态文件" - -msgid "Syndication" -msgstr "联合" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "页码不是整数" - -msgid "That page number is less than 1" -msgstr "页码小于 1" - -msgid "That page contains no results" -msgstr "本页结果为空" - -msgid "Enter a valid value." -msgstr "输入一个有效的值。" - -msgid "Enter a valid domain name." -msgstr "输入一个有效的域名。" - -msgid "Enter a valid URL." -msgstr "输入一个有效的 URL。" - -msgid "Enter a valid integer." -msgstr "输入一个有效的整数。" - -msgid "Enter a valid email address." -msgstr "输入一个有效的 Email 地址。" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "输入由字母,数字,下划线或连字符号组成的有效“字段”。" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "输入由Unicode字母,数字,下划线或连字符号组成的有效“字段”。" - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "输入一个有效的 %(protocol)s 地址。" - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 或 IPv6" - -msgid "Enter only digits separated by commas." -msgstr "只能输入用逗号分隔的数字。" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "确保该值为 %(limit_value)s (现在为 %(show_value)s)。" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "确保该值小于或等于%(limit_value)s。" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "确保该值大于或等于%(limit_value)s。" - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "确保该值是步长的倍数%(limit_value)s" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"确保此值是步长 %(limit_value)s 的倍数,从 %(offset)s 开始,例如 " -"%(offset)s、%(valid_value1)s、%(valid_value2)s 等等。" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"确保该变量至少包含 %(limit_value)d 字符(目前字符数 %(show_value)d)。" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"确保该变量包含不超过 %(limit_value)d 字符 (目前字符数 %(show_value)d)。" - -msgid "Enter a number." -msgstr "输入一个数字。" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "确认总共不超过 %(max)s 个数字." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "确认小数不超过 %(max)s 位." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "确认小数点前不超过 %(max)s 位。" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"文件扩展“%(extension)s”是不被允许。允许的扩展为:%(allowed_extensions)s。" - -msgid "Null characters are not allowed." -msgstr "不允许是用空字符串。" - -msgid "and" -msgstr "和" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "包含 %(field_labels)s 的 %(model_name)s 已经存在。" - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "约束 “%(name)s” 是无效的" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "值 %(value)r 不是有效选项。" - -msgid "This field cannot be null." -msgstr "这个值不能为 null。" - -msgid "This field cannot be blank." -msgstr "此字段不能为空。" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "具有 %(field_label)s 的 %(model_name)s 已存在。" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s 必须在 %(date_field_label)s 字段查找类型为 %(lookup_type)s 中" -"唯一。" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "字段类型:%(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s”的值应该为True或False" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s”的值应该为True,False或None" - -msgid "Boolean (Either True or False)" -msgstr "布尔值( True或False )" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "字符串(最长 %(max_length)s 位)" - -msgid "String (unlimited)" -msgstr "字符串(无限)" - -msgid "Comma-separated integers" -msgstr "逗号分隔的整数" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "“%(value)s”的值有一个错误的日期格式。它的格式应该是YYYY-MM-DD" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "“%(value)s”的值有正确的格式(YYYY-MM-DD)但它是一个错误的日期" - -msgid "Date (without time)" -msgstr "日期(不带时分)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s”的值有一个错误的日期格式。它的格式应该是YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] " - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s”的值有正确的格式 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) 但它是一个错" -"误的日期/时间" - -msgid "Date (with time)" -msgstr "日期(带时分)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s”的值应该是一个十进制数字。" - -msgid "Decimal number" -msgstr "小数" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s”的值有一个错误的格式。它的格式应该是[DD] [[HH:]MM:]ss[.uuuuuu] " - -msgid "Duration" -msgstr "时长" - -msgid "Email address" -msgstr "Email 地址" - -msgid "File path" -msgstr "文件路径" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s”的值应该是一个浮点数" - -msgid "Floating point number" -msgstr "浮点数" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s”的值应该是一个整型" - -msgid "Integer" -msgstr "整数" - -msgid "Big (8 byte) integer" -msgstr "大整数(8字节)" - -msgid "Small integer" -msgstr "小整数" - -msgid "IPv4 address" -msgstr "IPv4 地址" - -msgid "IP address" -msgstr "IP 地址" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s”的值应该是None、True或False" - -msgid "Boolean (Either True, False or None)" -msgstr "布尔值(True、False或None)" - -msgid "Positive big integer" -msgstr "正大整数" - -msgid "Positive integer" -msgstr "正整数" - -msgid "Positive small integer" -msgstr "正小整数" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (多达 %(max_length)s)" - -msgid "Text" -msgstr "文本" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "“%(value)s”的值有一个错误的格式。它的格式应该是HH:MM[:ss[.uuuuuu]]" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "“%(value)s”的值有正确的格式(HH:MM[:ss[.uuuuuu]]),但它是一个错误的时间" - -msgid "Time" -msgstr "时间" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "原始二进制数据" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s”不是一个有效的UUID" - -msgid "Universally unique identifier" -msgstr "通用唯一识别码" - -msgid "File" -msgstr "文件" - -msgid "Image" -msgstr "图像" - -msgid "A JSON object" -msgstr "一个JSON对象" - -msgid "Value must be valid JSON." -msgstr "值必须是有效的JSON。" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "包含%(field)s %(value)r的%(model)s实例不存在。" - -msgid "Foreign Key (type determined by related field)" -msgstr "外键(由相关字段确定)" - -msgid "One-to-one relationship" -msgstr "一对一关系" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s关系" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s关系" - -msgid "Many-to-many relationship" -msgstr "多对多关系" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "这个字段是必填项。" - -msgid "Enter a whole number." -msgstr "输入整数。" - -msgid "Enter a valid date." -msgstr "输入一个有效的日期。" - -msgid "Enter a valid time." -msgstr "输入一个有效的时间。" - -msgid "Enter a valid date/time." -msgstr "输入一个有效的日期/时间。" - -msgid "Enter a valid duration." -msgstr "请输入有效的时长。" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "天数应该在 {min_days} 和 {max_days} 之间。" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "未提交文件。请检查表单的编码类型。" - -msgid "No file was submitted." -msgstr "没有提交文件。" - -msgid "The submitted file is empty." -msgstr "所提交的是空文件。" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "确保该文件名长度不超过 %(max)d 字符(目前字符数 %(length)d)。" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "请提交文件或勾选清除复选框,两者其一即可。" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "请上传一张有效的图片。您所上传的文件不是图片或者是已损坏的图片。" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "选择一个有效的选项。 %(value)s 不在可用的选项中。" - -msgid "Enter a list of values." -msgstr "输入一系列值。" - -msgid "Enter a complete value." -msgstr "请输入完整的值。" - -msgid "Enter a valid UUID." -msgstr "请输入有效UUID。" - -msgid "Enter a valid JSON." -msgstr "输入一个有效的JSON。" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(隐藏字段 %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm 数据缺失或被篡改。缺少的字段: %(field_names)s。如果问题持续存" -"在,你可能需要提交错误报告。" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "请最多提交 %(num)d 个表单。" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "请至少提交 %(num)d 个表单。" - -msgid "Order" -msgstr "排序" - -msgid "Delete" -msgstr "删除" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "请修改%(field)s的重复数据" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "请修改%(field)s的重复数据.这个字段必须唯一" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"请修正%(field_name)s的重复数据。%(date_field)s %(lookup)s 在 %(field_name)s " -"必须保证唯一." - -msgid "Please correct the duplicate values below." -msgstr "请修正重复的数据." - -msgid "The inline value did not match the parent instance." -msgstr "内联值与父实例不匹配。" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "选择一个有效的选项: 该选择不在可用的选项中。" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s”不是一个有效的值" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s无法在时区%(current_timezone)s被解析;它可能是模糊的,也可能是不" -"存在的。" - -msgid "Clear" -msgstr "清除" - -msgid "Currently" -msgstr "目前" - -msgid "Change" -msgstr "修改" - -msgid "Unknown" -msgstr "未知" - -msgid "Yes" -msgstr "是" - -msgid "No" -msgstr "否" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "是、否、也许" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d 字节" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "午夜" - -msgid "noon" -msgstr "中午" - -msgid "Monday" -msgstr "星期一" - -msgid "Tuesday" -msgstr "星期二" - -msgid "Wednesday" -msgstr "星期三" - -msgid "Thursday" -msgstr "星期四" - -msgid "Friday" -msgstr "星期五" - -msgid "Saturday" -msgstr "星期六" - -msgid "Sunday" -msgstr "星期日" - -msgid "Mon" -msgstr "星期一" - -msgid "Tue" -msgstr "星期二" - -msgid "Wed" -msgstr "星期三" - -msgid "Thu" -msgstr "星期四" - -msgid "Fri" -msgstr "星期五" - -msgid "Sat" -msgstr "星期六" - -msgid "Sun" -msgstr "星期日" - -msgid "January" -msgstr "一月" - -msgid "February" -msgstr "二月" - -msgid "March" -msgstr "三月" - -msgid "April" -msgstr "四月" - -msgid "May" -msgstr "五月" - -msgid "June" -msgstr "六月" - -msgid "July" -msgstr "七月" - -msgid "August" -msgstr "八月" - -msgid "September" -msgstr "九月" - -msgid "October" -msgstr "十月" - -msgid "November" -msgstr "十一月" - -msgid "December" -msgstr "十二月" - -msgid "jan" -msgstr "一月" - -msgid "feb" -msgstr "二月" - -msgid "mar" -msgstr "三月" - -msgid "apr" -msgstr "四月" - -msgid "may" -msgstr "五月" - -msgid "jun" -msgstr "六月" - -msgid "jul" -msgstr "七月" - -msgid "aug" -msgstr "八月" - -msgid "sep" -msgstr "九月" - -msgid "oct" -msgstr "十月" - -msgid "nov" -msgstr "十一月" - -msgid "dec" -msgstr "十二月" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "一月" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "二月" - -msgctxt "abbrev. month" -msgid "March" -msgstr "三月" - -msgctxt "abbrev. month" -msgid "April" -msgstr "四月" - -msgctxt "abbrev. month" -msgid "May" -msgstr "五月" - -msgctxt "abbrev. month" -msgid "June" -msgstr "六月" - -msgctxt "abbrev. month" -msgid "July" -msgstr "七月" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "八月" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "九月" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "十月" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "十一月" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "十二月" - -msgctxt "alt. month" -msgid "January" -msgstr "一月" - -msgctxt "alt. month" -msgid "February" -msgstr "二月" - -msgctxt "alt. month" -msgid "March" -msgstr "三月" - -msgctxt "alt. month" -msgid "April" -msgstr "四月" - -msgctxt "alt. month" -msgid "May" -msgstr "五月" - -msgctxt "alt. month" -msgid "June" -msgstr "六月" - -msgctxt "alt. month" -msgid "July" -msgstr "七月" - -msgctxt "alt. month" -msgid "August" -msgstr "八月" - -msgctxt "alt. month" -msgid "September" -msgstr "九月" - -msgctxt "alt. month" -msgid "October" -msgstr "十月" - -msgctxt "alt. month" -msgid "November" -msgstr "十一月" - -msgctxt "alt. month" -msgid "December" -msgstr "十二月" - -msgid "This is not a valid IPv6 address." -msgstr "该值不是合法的IPv6地址。" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." - -msgid "or" -msgstr "或" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d 年" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d 月" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d 周" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d 日" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d 小时" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d 分钟" - -msgid "Forbidden" -msgstr "禁止访问" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF验证失败. 请求被中断." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"您看到此消息是由于HTTPS站点需要您的浏览器发送 'Referer header',但是该信息并" -"未被发送。出于安全原因,此HTTP头是必需的,以确保您的浏览器不会被第三方劫持。" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"如果您已将浏览器配置为禁用“ Referer”头,请重新启用它们,至少针对此站点,或" -"HTTPS连接或“同源”请求。" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"如果您使用的是标签或包" -"含“Referrer-Policy: no-referrer”的HTTP头,请将其删除。CSRF保护要求“Referer”头" -"执行严格的Referer检查。如果你担心隐私问题,可以使用类似这样的替代方法链接到第三方网站。" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"您看到此消息是由于该站点在提交表单时需要一个CSRF cookie。此项是出于安全考虑," -"以确保您的浏览器没有被第三方劫持。" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"如果您已将浏览器配置为禁用cookie,请重新启用它们,至少针对此站点或“同源”请" -"求。" - -msgid "More information is available with DEBUG=True." -msgstr "更多可用信息请设置选项DEBUG=True。" - -msgid "No year specified" -msgstr "没有指定年" - -msgid "Date out of range" -msgstr "日期超出范围。" - -msgid "No month specified" -msgstr "没有指定月" - -msgid "No day specified" -msgstr "没有指定天" - -msgid "No week specified" -msgstr "没有指定周" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s 可用" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"因为 %(class_name)s.allow_future 设置为 False,所以特性 " -"%(verbose_name_plural)s 不可用。" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "日期字符串“%(datestr)s”与格式“%(format)s”不匹配" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "没有找到符合查询的 %(verbose_name)s" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "页面不是最后一页,也不能被转为整数型" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "非法页面 (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "列表是空的并且“%(class_name)s.allow_empty”是False" - -msgid "Directory indexes are not allowed here." -msgstr "这里不允许目录索引" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "”%(path)s\"不存在" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s的索引" - -msgid "The install worked successfully! Congratulations!" -msgstr "" -"安装成功!\n" -"祝贺!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"查看 Django %(version)s 的 release notes " - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"您现在看见这个页面,因为您设置了 DEBUG=True 并且您还没有配置任何URLs。" - -msgid "Django Documentation" -msgstr "Django 文档" - -msgid "Topics, references, & how-to’s" -msgstr "主题,参考资料和操作方法" - -msgid "Tutorial: A Polling App" -msgstr "教程:投票应用" - -msgid "Get started with Django" -msgstr "开始使用 Django" - -msgid "Django Community" -msgstr "Django 社区" - -msgid "Connect, get help, or contribute" -msgstr "联系,获取帮助,贡献代码" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/formats.py deleted file mode 100644 index 79936f8..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hans/formats.py +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "Y年n月j日" # 2016年9月5日 -TIME_FORMAT = "H:i" # 20:45 -DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 -YEAR_MONTH_FORMAT = "Y年n月" # 2016年9月 -MONTH_DAY_FORMAT = "m月j日" # 9月5日 -SHORT_DATE_FORMAT = "Y年n月j日" # 2016年9月5日 -SHORT_DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 -FIRST_DAY_OF_WEEK = 1 # 星期一 (Monday) - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y/%m/%d", # '2016/09/05' - "%Y-%m-%d", # '2016-09-05' - "%Y年%n月%j日", # '2016年9月5日' -] - -TIME_INPUT_FORMATS = [ - "%H:%M", # '20:45' - "%H:%M:%S", # '20:45:29' - "%H:%M:%S.%f", # '20:45:29.000200' -] - -DATETIME_INPUT_FORMATS = [ - "%Y/%m/%d %H:%M", # '2016/09/05 20:45' - "%Y-%m-%d %H:%M", # '2016-09-05 20:45' - "%Y年%n月%j日 %H:%M", # '2016年9月5日 14:45' - "%Y/%m/%d %H:%M:%S", # '2016/09/05 20:45:29' - "%Y-%m-%d %H:%M:%S", # '2016-09-05 20:45:29' - "%Y年%n月%j日 %H:%M:%S", # '2016年9月5日 20:45:29' - "%Y/%m/%d %H:%M:%S.%f", # '2016/09/05 20:45:29.000200' - "%Y-%m-%d %H:%M:%S.%f", # '2016-09-05 20:45:29.000200' - "%Y年%n月%j日 %H:%n:%S.%f", # '2016年9月5日 20:45:29.000200' -] - -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "" -NUMBER_GROUPING = 4 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index 03b82f4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index 6cb7062..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,1293 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chen Chun-Chia , 2015 -# coby2023t, 2024-2025 -# Eric Ho , 2013 -# ilay , 2012 -# Jannis Leidel , 2011 -# mail6543210 , 2013 -# 0a3cb7bfd0810218facdfb511e592a6d_8d19d07 , 2011 -# tcc , 2011 -# Tzu-ping Chung , 2016-2017 -# YAO WEN LIANG, 2024 -# Yeh-Yung , 2013 -# coby2023t, 2024 -# Yeh-Yung , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: coby2023t, 2024-2025\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "南非語" - -msgid "Arabic" -msgstr "阿拉伯語" - -msgid "Algerian Arabic" -msgstr "阿爾及利亞式阿拉伯語" - -msgid "Asturian" -msgstr "阿斯圖里亞斯語" - -msgid "Azerbaijani" -msgstr "亞塞拜然語" - -msgid "Bulgarian" -msgstr "保加利亞語" - -msgid "Belarusian" -msgstr "白俄羅斯語" - -msgid "Bengali" -msgstr "孟加拉語" - -msgid "Breton" -msgstr "布列塔尼語" - -msgid "Bosnian" -msgstr "波士尼亞語" - -msgid "Catalan" -msgstr "加泰隆語" - -msgid "Central Kurdish (Sorani)" -msgstr "中部庫爾德語 (Sorani)" - -msgid "Czech" -msgstr "捷克語" - -msgid "Welsh" -msgstr "威爾斯語" - -msgid "Danish" -msgstr "丹麥語" - -msgid "German" -msgstr "德語" - -msgid "Lower Sorbian" -msgstr "下索布語" - -msgid "Greek" -msgstr "希臘語" - -msgid "English" -msgstr "英語" - -msgid "Australian English" -msgstr "澳大利亞英語" - -msgid "British English" -msgstr "英國英語" - -msgid "Esperanto" -msgstr "世界語" - -msgid "Spanish" -msgstr "西班牙語" - -msgid "Argentinian Spanish" -msgstr "阿根廷西班牙語" - -msgid "Colombian Spanish" -msgstr "哥倫比亞西班牙語" - -msgid "Mexican Spanish" -msgstr "墨西哥西班牙語" - -msgid "Nicaraguan Spanish" -msgstr "尼加拉瓜西班牙語" - -msgid "Venezuelan Spanish" -msgstr "委內瑞拉西班牙語" - -msgid "Estonian" -msgstr "愛沙尼亞語" - -msgid "Basque" -msgstr "巴斯克語" - -msgid "Persian" -msgstr "波斯語" - -msgid "Finnish" -msgstr "芬蘭語" - -msgid "French" -msgstr "法語" - -msgid "Frisian" -msgstr "菲士蘭語" - -msgid "Irish" -msgstr "愛爾蘭語" - -msgid "Scottish Gaelic" -msgstr "蘇格蘭蓋爾語" - -msgid "Galician" -msgstr "加利西亞語" - -msgid "Hebrew" -msgstr "希伯來語" - -msgid "Hindi" -msgstr "印地語" - -msgid "Croatian" -msgstr "克羅埃西亞語" - -msgid "Upper Sorbian" -msgstr "上索布語" - -msgid "Hungarian" -msgstr "匈牙利語" - -msgid "Armenian" -msgstr "亞美尼亞語" - -msgid "Interlingua" -msgstr "國際語" - -msgid "Indonesian" -msgstr "印尼語" - -msgid "Igbo" -msgstr "伊博語" - -msgid "Ido" -msgstr "伊多語" - -msgid "Icelandic" -msgstr "冰島語" - -msgid "Italian" -msgstr "義大利語" - -msgid "Japanese" -msgstr "日語" - -msgid "Georgian" -msgstr "喬治亞語" - -msgid "Kabyle" -msgstr "卡拜爾語" - -msgid "Kazakh" -msgstr "哈薩克語" - -msgid "Khmer" -msgstr "高棉語" - -msgid "Kannada" -msgstr "康納達語" - -msgid "Korean" -msgstr "韓語" - -msgid "Kyrgyz" -msgstr "吉爾吉斯語" - -msgid "Luxembourgish" -msgstr "盧森堡語" - -msgid "Lithuanian" -msgstr "立陶宛語" - -msgid "Latvian" -msgstr "拉脫維亞語" - -msgid "Macedonian" -msgstr "馬其頓語" - -msgid "Malayalam" -msgstr "馬拉雅拉姆語" - -msgid "Mongolian" -msgstr "蒙古語" - -msgid "Marathi" -msgstr "馬拉提語" - -msgid "Malay" -msgstr "馬來語" - -msgid "Burmese" -msgstr "緬甸語" - -msgid "Norwegian Bokmål" -msgstr "書面挪威語" - -msgid "Nepali" -msgstr "尼泊爾語" - -msgid "Dutch" -msgstr "荷蘭語" - -msgid "Norwegian Nynorsk" -msgstr "新挪威語" - -msgid "Ossetic" -msgstr "奧塞梯語" - -msgid "Punjabi" -msgstr "旁遮普語" - -msgid "Polish" -msgstr "波蘭語" - -msgid "Portuguese" -msgstr "葡萄牙語" - -msgid "Brazilian Portuguese" -msgstr "巴西葡萄牙語" - -msgid "Romanian" -msgstr "羅馬尼亞語" - -msgid "Russian" -msgstr "俄語" - -msgid "Slovak" -msgstr "斯洛伐克語" - -msgid "Slovenian" -msgstr "斯洛維尼亞語" - -msgid "Albanian" -msgstr "阿爾巴尼亞語" - -msgid "Serbian" -msgstr "塞爾維亞語" - -msgid "Serbian Latin" -msgstr "塞爾維亞拉丁語" - -msgid "Swedish" -msgstr "瑞典語" - -msgid "Swahili" -msgstr "斯瓦希里語" - -msgid "Tamil" -msgstr "坦米爾語" - -msgid "Telugu" -msgstr "泰盧固語" - -msgid "Tajik" -msgstr "塔吉克語" - -msgid "Thai" -msgstr "泰語" - -msgid "Turkmen" -msgstr "土庫曼語" - -msgid "Turkish" -msgstr "土耳其語" - -msgid "Tatar" -msgstr "韃靼語" - -msgid "Udmurt" -msgstr "烏德穆爾特語" - -msgid "Uyghur" -msgstr "維吾爾語" - -msgid "Ukrainian" -msgstr "烏克蘭語" - -msgid "Urdu" -msgstr "烏爾都語" - -msgid "Uzbek" -msgstr "烏茲別克語" - -msgid "Vietnamese" -msgstr "越南語" - -msgid "Simplified Chinese" -msgstr "簡體中文" - -msgid "Traditional Chinese" -msgstr "繁體中文" - -msgid "Messages" -msgstr "訊息" - -msgid "Site Maps" -msgstr "網站地圖" - -msgid "Static Files" -msgstr "靜態文件" - -msgid "Syndication" -msgstr "聯播" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "該頁碼並非整數" - -msgid "That page number is less than 1" -msgstr "該頁碼小於 1" - -msgid "That page contains no results" -msgstr "該頁未包含任何內容" - -msgid "Enter a valid value." -msgstr "請輸入有效的值。" - -msgid "Enter a valid domain name." -msgstr "輸入有效的網域名稱。" - -msgid "Enter a valid URL." -msgstr "請輸入有效的 URL。" - -msgid "Enter a valid integer." -msgstr "請輸入有效的整數。" - -msgid "Enter a valid email address." -msgstr "請輸入有效的電子郵件地址。" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "輸入合適的 \"slug\" 字串,由字母、數字、底線與連字號組成。" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "輸入合適的 \"slug\" 字串,內含 Unicode 字元、數字、底線或減號。" - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "輸入正確的 %(protocol)s 位址。." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 或 IPv6" - -msgid "Enter only digits separated by commas." -msgstr "請輸入以逗號分隔的數字。" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "請確認這個值是否為 %(limit_value)s (目前是 %(show_value)s)。" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "請確認此數值是否小於或等於 %(limit_value)s。" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "請確認此數值是否大於或等於 %(limit_value)s。" - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "請確認此數值是 %(limit_value)s 的倍數。" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"請確認此數值是 %(limit_value)s的倍數。從 %(offset)s 起始,例如 %(offset)s, " -"%(valid_value1)s, %(valid_value2)s,以此類推。" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"請確認這個值至少包含 %(limit_value)d 個字 (目前為 %(show_value)d 個字)。" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"請確認這個值至多包含 %(limit_value)d 個字 (目前為 %(show_value)d 個字)。" - -msgid "Enter a number." -msgstr "輸入一個數字" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "請確認數字全長不超過 %(max)s 位。" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "確認小數不超過 %(max)s 位。" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "請確認小數點前不超過 %(max)s 位。" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "不允許副檔名為 “%(extension)s” 。可用的像是: %(allowed_extensions)s。" - -msgid "Null characters are not allowed." -msgstr "不允許空(null)字元。" - -msgid "and" -msgstr "和" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "包含 %(field_labels)s 的 %(model_name)s 已經存在。" - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "約束條件 “%(name)s” 被違反。" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "數值 %(value)r 不是有效的選項。" - -msgid "This field cannot be null." -msgstr "這個值不能是 null。" - -msgid "This field cannot be blank." -msgstr "這個欄位不能為空。" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "包含 %(field_label)s 的 %(model_name)s 已經存在。" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s 在 %(date_field_label)s %(lookup_type)s 上必須唯一。" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "欄位類型: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” 只能是 True 或 False。" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” 只能是 True 或 False 或 None 。" - -msgid "Boolean (Either True or False)" -msgstr "布林值 (True 或 False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "字串 (至多 %(max_length)s 個字)" - -msgid "String (unlimited)" -msgstr "字串 (無限)" - -msgid "Comma-separated integers" -msgstr "逗號分隔的整數" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "“%(value)s” 的日期格式錯誤。應該是 YYYY-MM-DD 才對。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "“%(value)s” 的格式正確 (YYYY-MM-DD) 但日期有誤。" - -msgid "Date (without time)" -msgstr "日期 (不包括時間)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” 的格式錯誤。應該是 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 才對。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” 的格式正確 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) 但日期/時間有誤。" - -msgid "Date (with time)" -msgstr "日期 (包括時間)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” 必須是十進位數。" - -msgid "Decimal number" -msgstr "十進位數" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "“%(value)s” 的格式錯誤。格式必須為 [DD] [[HH:]MM:]ss[.uuuuuu] 。" - -msgid "Duration" -msgstr "時長" - -msgid "Email address" -msgstr "電子郵件地址" - -msgid "File path" -msgstr "檔案路徑" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” 必須是浮點小數。" - -msgid "Floating point number" -msgstr "浮點數" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” 必須是整數。" - -msgid "Integer" -msgstr "整數" - -msgid "Big (8 byte) integer" -msgstr "大整數 (8位元組)" - -msgid "Small integer" -msgstr "小整數" - -msgid "IPv4 address" -msgstr "IPv4 地址" - -msgid "IP address" -msgstr "IP 位址" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” 必須是 None, True 或 False。" - -msgid "Boolean (Either True, False or None)" -msgstr "布林值 (True, False 或 None)" - -msgid "Positive big integer" -msgstr "大的正整數" - -msgid "Positive integer" -msgstr "正整數" - -msgid "Positive small integer" -msgstr "正小整數" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (最多 %(max_length)s個字)" - -msgid "Text" -msgstr "文字" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "“%(value)s” 格式錯誤。格式必須為 HH:MM[:ss[.uuuuuu]] 。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "“%(value)s” 的格式正確 (HH:MM[:ss[.uuuuuu]]),但時間有誤。" - -msgid "Time" -msgstr "時間" - -msgid "URL" -msgstr "網址" - -msgid "Raw binary data" -msgstr "原始二進制數據" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” 不是有效的 UUID。" - -msgid "Universally unique identifier" -msgstr "通用唯一識別碼" - -msgid "File" -msgstr "檔案" - -msgid "Image" -msgstr "圖像" - -msgid "A JSON object" -msgstr "JSON 物件" - -msgid "Value must be valid JSON." -msgstr "必須是有效的 JSON 值" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s 實體配 %(field)s %(value)r 並不是合法選項。" - -msgid "Foreign Key (type determined by related field)" -msgstr "外鍵(類型由相關欄位決定)" - -msgid "One-to-one relationship" -msgstr "一對一關連" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s 關連" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s 關連" - -msgid "Many-to-many relationship" -msgstr "多對多關連" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "這個欄位是必須的。" - -msgid "Enter a whole number." -msgstr "輸入整數" - -msgid "Enter a valid date." -msgstr "輸入有效的日期" - -msgid "Enter a valid time." -msgstr "輸入有效的時間" - -msgid "Enter a valid date/time." -msgstr "輸入有效的日期/時間" - -msgid "Enter a valid duration." -msgstr "輸入有效的時間長。" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "天數必須介於 {min_days} 到 {max_days} 天" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "沒有檔案被送出。請檢查表單的編碼類型。" - -msgid "No file was submitted." -msgstr "沒有檔案送出" - -msgid "The submitted file is empty." -msgstr "送出的檔案是空的。" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "請確認這個檔名至多包含 %(max)d 個字 (目前為 %(length)d)。" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "請提交一個檔案或勾選清除選項,但不能同時進行。" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "請上傳一個有效的圖檔。你上傳的檔案不是圖片或是已損壞的圖檔。" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "請選擇有效的選項, %(value)s 不是一個可用的選項。" - -msgid "Enter a list of values." -msgstr "請輸入一個列表的值。" - -msgid "Enter a complete value." -msgstr "請輸入完整的值。" - -msgid "Enter a valid UUID." -msgstr "請輸入有效的 UUID。" - -msgid "Enter a valid JSON." -msgstr "輸入有效的 JSON。" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(隱藏欄位 %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm 資料遺失或被篡改。缺少欄位:%(field_names)s。如果問題持續存" -"在,您可能需要提交錯誤報告。" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "請送出最多 %(num)d 個表單。" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "請送出最少 %(num)d 個表單。" - -msgid "Order" -msgstr "排序" - -msgid "Delete" -msgstr "刪除" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "請修正 %(field)s 的重覆資料" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "請修正 %(field)s 的重覆資料, 必須為唯一值" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"請修正 %(field_name)s 重複資料, %(date_field)s 的 %(lookup)s 必須是唯一值。" - -msgid "Please correct the duplicate values below." -msgstr "請修正下方重覆的數值" - -msgid "The inline value did not match the parent instance." -msgstr "內含的外鍵無法連接到對應的上層實體。" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "選擇有效的選項: 此選擇不在可用的選項中。" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” 不是一個有效的值。" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s 無法被轉換成 %(current_timezone)s時區格式; 可能內容有誤或不存" -"在。" - -msgid "Clear" -msgstr "清除" - -msgid "Currently" -msgstr "目前" - -msgid "Change" -msgstr "變更" - -msgid "Unknown" -msgstr "未知" - -msgid "Yes" -msgstr "是" - -msgid "No" -msgstr "否" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "是、否、也許" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d 位元組" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "午夜" - -msgid "noon" -msgstr "中午" - -msgid "Monday" -msgstr "星期一" - -msgid "Tuesday" -msgstr "星期二" - -msgid "Wednesday" -msgstr "星期三" - -msgid "Thursday" -msgstr "星期四" - -msgid "Friday" -msgstr "星期五" - -msgid "Saturday" -msgstr "星期六" - -msgid "Sunday" -msgstr "星期日" - -msgid "Mon" -msgstr "星期一" - -msgid "Tue" -msgstr "星期二" - -msgid "Wed" -msgstr "星期三" - -msgid "Thu" -msgstr "星期四" - -msgid "Fri" -msgstr "星期五" - -msgid "Sat" -msgstr "星期六" - -msgid "Sun" -msgstr "星期日" - -msgid "January" -msgstr "一月" - -msgid "February" -msgstr "二月" - -msgid "March" -msgstr "三月" - -msgid "April" -msgstr "四月" - -msgid "May" -msgstr "五月" - -msgid "June" -msgstr "六月" - -msgid "July" -msgstr "七月" - -msgid "August" -msgstr "八月" - -msgid "September" -msgstr "九月" - -msgid "October" -msgstr "十月" - -msgid "November" -msgstr "十一月" - -msgid "December" -msgstr "十二月" - -msgid "jan" -msgstr "一月" - -msgid "feb" -msgstr "二月" - -msgid "mar" -msgstr "三月" - -msgid "apr" -msgstr "四月" - -msgid "may" -msgstr "五月" - -msgid "jun" -msgstr "六月" - -msgid "jul" -msgstr "七月" - -msgid "aug" -msgstr "八月" - -msgid "sep" -msgstr "九月" - -msgid "oct" -msgstr "十月" - -msgid "nov" -msgstr "十一月" - -msgid "dec" -msgstr "十二月" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "一月" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "二月" - -msgctxt "abbrev. month" -msgid "March" -msgstr "三月" - -msgctxt "abbrev. month" -msgid "April" -msgstr "四月" - -msgctxt "abbrev. month" -msgid "May" -msgstr "五月" - -msgctxt "abbrev. month" -msgid "June" -msgstr "六月" - -msgctxt "abbrev. month" -msgid "July" -msgstr "七月" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "八月" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "九月" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "十月" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "十一月" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "十二月" - -msgctxt "alt. month" -msgid "January" -msgstr "一月" - -msgctxt "alt. month" -msgid "February" -msgstr "二月" - -msgctxt "alt. month" -msgid "March" -msgstr "三月" - -msgctxt "alt. month" -msgid "April" -msgstr "四月" - -msgctxt "alt. month" -msgid "May" -msgstr "五月" - -msgctxt "alt. month" -msgid "June" -msgstr "六月" - -msgctxt "alt. month" -msgid "July" -msgstr "七月" - -msgctxt "alt. month" -msgid "August" -msgstr "八月" - -msgctxt "alt. month" -msgid "September" -msgstr "九月" - -msgctxt "alt. month" -msgid "October" -msgstr "十月" - -msgctxt "alt. month" -msgid "November" -msgstr "十一月" - -msgctxt "alt. month" -msgid "December" -msgstr "十二月" - -msgid "This is not a valid IPv6 address." -msgstr "這是無效的 IPv6 位址。" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "或" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d 年" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d 月" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d 週" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d 日" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d 小時" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d 分" - -msgid "Forbidden" -msgstr "禁止" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF 驗證失敗。已中止請求。" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"您看到此消息是因為這個 HTTPS 網站要求您的網路瀏覽器發送一個“Referer header”," -"但並沒有被發送。出於安全原因,需要此標頭來確保您的瀏覽器沒有被第三方劫持。" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"若您的瀏覽器設定為將「Referer」標頭關閉,請重新為這個網站、HTTPS 連線、或" -"「same-origin」請求啟用它。" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"若您使用 標籤或包含" -"「Referrer-Policy: no-referrer」標頭,請將其移除。 CSRF 保護要求「Referer」標" -"頭進行嚴格參照檢查。若你擔心隱私問題,可使用如 來連" -"結到第三方網站。" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"你看到這個訊息,是因為這個網站要求在送出表單包含一個 CSRF cookie。這個 " -"cookie 是用於安全用途,保護你的瀏覽器不被第三方挾持。" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"若你的瀏覽器設定為將 cookie 關閉,請重新為這個網站或「same-origin」請求啟用" -"它。" - -msgid "More information is available with DEBUG=True." -msgstr "設定 DEBUG=True 以獲得更多資訊。" - -msgid "No year specified" -msgstr "不指定年份" - -msgid "Date out of range" -msgstr "日期超過範圍" - -msgid "No month specified" -msgstr "沒有指定月份" - -msgid "No day specified" -msgstr "沒有指定日期" - -msgid "No week specified" -msgstr "沒有指定週數" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s 無法使用" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"未來的 %(verbose_name_plural)s 不可用,因為 %(class_name)s.allow_future 設置" -"為 False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "日期字串 “%(datestr)s” 不符合 “%(format)s” 格式。" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "無 %(verbose_name)s 符合本次搜尋" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "頁面不是最後一頁,也無法被轉換為整數。" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "無效的頁面 (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "列表是空的,並且 “%(class_name)s.allow_empty” 是 False 。" - -msgid "Directory indexes are not allowed here." -msgstr "這裡不允許目錄索引。" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” 不存在。" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s 的索引" - -msgid "The install worked successfully! Congratulations!" -msgstr "安裝成功!恭喜!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"查看 Django %(version)s 的 發行版本說明 " - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"你現在看到這個頁面,是因為在設定檔中設置了 DEBUG = True,且尚未配置任何網址。" - -msgid "Django Documentation" -msgstr "Django 文件" - -msgid "Topics, references, & how-to’s" -msgstr "主題、參考、教學" - -msgid "Tutorial: A Polling App" -msgstr "教學:投票應用" - -msgid "Get started with Django" -msgstr "初學 Django" - -msgid "Django Community" -msgstr "Django 社群" - -msgid "Connect, get help, or contribute" -msgstr "聯繫、獲得幫助、貢獻" diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/formats.py b/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/formats.py deleted file mode 100644 index 79936f8..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/locale/zh_Hant/formats.py +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "Y年n月j日" # 2016年9月5日 -TIME_FORMAT = "H:i" # 20:45 -DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 -YEAR_MONTH_FORMAT = "Y年n月" # 2016年9月 -MONTH_DAY_FORMAT = "m月j日" # 9月5日 -SHORT_DATE_FORMAT = "Y年n月j日" # 2016年9月5日 -SHORT_DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 -FIRST_DAY_OF_WEEK = 1 # 星期一 (Monday) - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y/%m/%d", # '2016/09/05' - "%Y-%m-%d", # '2016-09-05' - "%Y年%n月%j日", # '2016年9月5日' -] - -TIME_INPUT_FORMATS = [ - "%H:%M", # '20:45' - "%H:%M:%S", # '20:45:29' - "%H:%M:%S.%f", # '20:45:29.000200' -] - -DATETIME_INPUT_FORMATS = [ - "%Y/%m/%d %H:%M", # '2016/09/05 20:45' - "%Y-%m-%d %H:%M", # '2016-09-05 20:45' - "%Y年%n月%j日 %H:%M", # '2016年9月5日 14:45' - "%Y/%m/%d %H:%M:%S", # '2016/09/05 20:45:29' - "%Y-%m-%d %H:%M:%S", # '2016-09-05 20:45:29' - "%Y年%n月%j日 %H:%M:%S", # '2016年9月5日 20:45:29' - "%Y/%m/%d %H:%M:%S.%f", # '2016/09/05 20:45:29.000200' - "%Y-%m-%d %H:%M:%S.%f", # '2016-09-05 20:45:29.000200' - "%Y年%n月%j日 %H:%n:%S.%f", # '2016年9月5日 20:45:29.000200' -] - -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "" -NUMBER_GROUPING = 4 diff --git a/.venv/lib/python3.10/site-packages/django/conf/project_template/manage.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/project_template/manage.py-tpl deleted file mode 100755 index a628884..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/project_template/manage.py-tpl +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python -"""Django's command-line utility for administrative tasks.""" -import os -import sys - - -def main(): - """Run administrative tasks.""" - os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{{ project_name }}.settings') - try: - from django.core.management import execute_from_command_line - except ImportError as exc: - raise ImportError( - "Couldn't import Django. Are you sure it's installed and " - "available on your PYTHONPATH environment variable? Did you " - "forget to activate a virtual environment?" - ) from exc - execute_from_command_line(sys.argv) - - -if __name__ == '__main__': - main() diff --git a/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/__init__.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/__init__.py-tpl deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/asgi.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/asgi.py-tpl deleted file mode 100644 index a827238..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/asgi.py-tpl +++ /dev/null @@ -1,16 +0,0 @@ -""" -ASGI config for {{ project_name }} project. - -It exposes the ASGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/{{ docs_version }}/howto/deployment/asgi/ -""" - -import os - -from django.core.asgi import get_asgi_application - -os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{{ project_name }}.settings') - -application = get_asgi_application() diff --git a/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/settings.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/settings.py-tpl deleted file mode 100644 index 5631ec9..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/settings.py-tpl +++ /dev/null @@ -1,122 +0,0 @@ -""" -Django settings for {{ project_name }} project. - -Generated by 'django-admin startproject' using Django {{ django_version }}. - -For more information on this file, see -https://docs.djangoproject.com/en/{{ docs_version }}/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/ -""" - -from pathlib import Path - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/{{ docs_version }}/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = '{{ secret_key }}' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = [] - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = '{{ project_name }}.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = '{{ project_name }}.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} - - -# Password validation -# https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/{{ docs_version }}/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/{{ docs_version }}/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/urls.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/urls.py-tpl deleted file mode 100644 index 622f79e..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/urls.py-tpl +++ /dev/null @@ -1,22 +0,0 @@ -""" -URL configuration for {{ project_name }} project. - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/{{ docs_version }}/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" -from django.contrib import admin -from django.urls import path - -urlpatterns = [ - path('admin/', admin.site.urls), -] diff --git a/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/wsgi.py-tpl b/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/wsgi.py-tpl deleted file mode 100644 index 1ee28d0..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/project_template/project_name/wsgi.py-tpl +++ /dev/null @@ -1,16 +0,0 @@ -""" -WSGI config for {{ project_name }} project. - -It exposes the WSGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/{{ docs_version }}/howto/deployment/wsgi/ -""" - -import os - -from django.core.wsgi import get_wsgi_application - -os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{{ project_name }}.settings') - -application = get_wsgi_application() diff --git a/.venv/lib/python3.10/site-packages/django/conf/urls/__init__.py b/.venv/lib/python3.10/site-packages/django/conf/urls/__init__.py deleted file mode 100644 index 302f68d..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/urls/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import include -from django.views import defaults - -__all__ = ["handler400", "handler403", "handler404", "handler500", "include"] - -handler400 = defaults.bad_request -handler403 = defaults.permission_denied -handler404 = defaults.page_not_found -handler500 = defaults.server_error diff --git a/.venv/lib/python3.10/site-packages/django/conf/urls/i18n.py b/.venv/lib/python3.10/site-packages/django/conf/urls/i18n.py deleted file mode 100644 index 6b3fe70..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/urls/i18n.py +++ /dev/null @@ -1,39 +0,0 @@ -import functools - -from django.conf import settings -from django.urls import LocalePrefixPattern, URLResolver, get_resolver, path -from django.views.i18n import set_language - - -def i18n_patterns(*urls, prefix_default_language=True): - """ - Add the language code prefix to every URL pattern within this function. - This may only be used in the root URLconf, not in an included URLconf. - """ - if not settings.USE_I18N: - return list(urls) - return [ - URLResolver( - LocalePrefixPattern(prefix_default_language=prefix_default_language), - list(urls), - ) - ] - - -@functools.cache -def is_language_prefix_patterns_used(urlconf): - """ - Return a tuple of two booleans: ( - `True` if i18n_patterns() (LocalePrefixPattern) is used in the URLconf, - `True` if the default language should be prefixed - ) - """ - for url_pattern in get_resolver(urlconf).url_patterns: - if isinstance(url_pattern.pattern, LocalePrefixPattern): - return True, url_pattern.pattern.prefix_default_language - return False, False - - -urlpatterns = [ - path("setlang/", set_language, name="set_language"), -] diff --git a/.venv/lib/python3.10/site-packages/django/conf/urls/static.py b/.venv/lib/python3.10/site-packages/django/conf/urls/static.py deleted file mode 100644 index 8e7816e..0000000 --- a/.venv/lib/python3.10/site-packages/django/conf/urls/static.py +++ /dev/null @@ -1,30 +0,0 @@ -import re -from urllib.parse import urlsplit - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.urls import re_path -from django.views.static import serve - - -def static(prefix, view=serve, **kwargs): - """ - Return a URL pattern for serving files in debug mode. - - from django.conf import settings - from django.conf.urls.static import static - - urlpatterns = [ - # ... the rest of your URLconf goes here ... - ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - """ - if not prefix: - raise ImproperlyConfigured("Empty static prefix not permitted") - elif not settings.DEBUG or urlsplit(prefix).netloc: - # No-op if not in debug mode or a non-local prefix. - return [] - return [ - re_path( - r"^%s(?P.*)$" % re.escape(prefix.lstrip("/")), view, kwargs=kwargs - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/__init__.py deleted file mode 100644 index 0d9189f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/__init__.py +++ /dev/null @@ -1,52 +0,0 @@ -from django.contrib.admin.decorators import action, display, register -from django.contrib.admin.filters import ( - AllValuesFieldListFilter, - BooleanFieldListFilter, - ChoicesFieldListFilter, - DateFieldListFilter, - EmptyFieldListFilter, - FieldListFilter, - ListFilter, - RelatedFieldListFilter, - RelatedOnlyFieldListFilter, - SimpleListFilter, -) -from django.contrib.admin.options import ( - HORIZONTAL, - VERTICAL, - ModelAdmin, - ShowFacets, - StackedInline, - TabularInline, -) -from django.contrib.admin.sites import AdminSite, site -from django.utils.module_loading import autodiscover_modules - -__all__ = [ - "action", - "display", - "register", - "ModelAdmin", - "HORIZONTAL", - "VERTICAL", - "StackedInline", - "TabularInline", - "AdminSite", - "site", - "ListFilter", - "SimpleListFilter", - "FieldListFilter", - "BooleanFieldListFilter", - "RelatedFieldListFilter", - "ChoicesFieldListFilter", - "DateFieldListFilter", - "AllValuesFieldListFilter", - "EmptyFieldListFilter", - "RelatedOnlyFieldListFilter", - "ShowFacets", - "autodiscover", -] - - -def autodiscover(): - autodiscover_modules("admin", register_to=site) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/actions.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/actions.py deleted file mode 100644 index 865c16a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/actions.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -Built-in, globally-available admin actions. -""" - -from django.contrib import messages -from django.contrib.admin import helpers -from django.contrib.admin.decorators import action -from django.contrib.admin.utils import model_ngettext -from django.core.exceptions import PermissionDenied -from django.template.response import TemplateResponse -from django.utils.translation import gettext as _ -from django.utils.translation import gettext_lazy - - -@action( - permissions=["delete"], - description=gettext_lazy("Delete selected %(verbose_name_plural)s"), -) -def delete_selected(modeladmin, request, queryset): - """ - Default action which deletes the selected objects. - - This action first displays a confirmation page which shows all the - deletable objects, or, if the user has no permission one of the related - childs (foreignkeys), a "permission denied" message. - - Next, it deletes all selected objects and redirects back to the change list. - """ - opts = modeladmin.model._meta - app_label = opts.app_label - - # Populate deletable_objects, a data structure of all related objects that - # will also be deleted. - ( - deletable_objects, - model_count, - perms_needed, - protected, - ) = modeladmin.get_deleted_objects(queryset, request) - - # The user has already confirmed the deletion. - # Do the deletion and return None to display the change list view again. - if request.POST.get("post") and not protected: - if perms_needed: - raise PermissionDenied - n = len(queryset) - if n: - modeladmin.log_deletions(request, queryset) - modeladmin.delete_queryset(request, queryset) - modeladmin.message_user( - request, - _("Successfully deleted %(count)d %(items)s.") - % {"count": n, "items": model_ngettext(modeladmin.opts, n)}, - messages.SUCCESS, - ) - # Return None to display the change list page again. - return None - - objects_name = model_ngettext(queryset) - - if perms_needed or protected: - title = _("Cannot delete %(name)s") % {"name": objects_name} - else: - title = _("Delete multiple objects") - - context = { - **modeladmin.admin_site.each_context(request), - "title": title, - "subtitle": None, - "objects_name": str(objects_name), - "deletable_objects": [deletable_objects], - "model_count": dict(model_count).items(), - "queryset": queryset, - "perms_lacking": perms_needed, - "protected": protected, - "opts": opts, - "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, - "media": modeladmin.media, - } - - request.current_app = modeladmin.admin_site.name - - # Display the confirmation page - return TemplateResponse( - request, - modeladmin.delete_selected_confirmation_template - or [ - "admin/%s/%s/delete_selected_confirmation.html" - % (app_label, opts.model_name), - "admin/%s/delete_selected_confirmation.html" % app_label, - "admin/delete_selected_confirmation.html", - ], - context, - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/apps.py deleted file mode 100644 index 08a9e0d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/apps.py +++ /dev/null @@ -1,27 +0,0 @@ -from django.apps import AppConfig -from django.contrib.admin.checks import check_admin_app, check_dependencies -from django.core import checks -from django.utils.translation import gettext_lazy as _ - - -class SimpleAdminConfig(AppConfig): - """Simple AppConfig which does not do automatic discovery.""" - - default_auto_field = "django.db.models.AutoField" - default_site = "django.contrib.admin.sites.AdminSite" - name = "django.contrib.admin" - verbose_name = _("Administration") - - def ready(self): - checks.register(check_dependencies, checks.Tags.admin) - checks.register(check_admin_app, checks.Tags.admin) - - -class AdminConfig(SimpleAdminConfig): - """The default AppConfig for admin which does autodiscovery.""" - - default = True - - def ready(self): - super().ready() - self.module.autodiscover() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/checks.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/checks.py deleted file mode 100644 index a4d7066..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/checks.py +++ /dev/null @@ -1,1359 +0,0 @@ -import collections -from itertools import chain - -from django.apps import apps -from django.conf import settings -from django.contrib.admin.exceptions import NotRegistered -from django.contrib.admin.utils import NotRelationField, flatten, get_fields_from_path -from django.core import checks -from django.core.exceptions import FieldDoesNotExist -from django.db import models -from django.db.models.constants import LOOKUP_SEP -from django.db.models.expressions import Combinable -from django.forms.models import BaseModelForm, BaseModelFormSet, _get_foreign_key -from django.template import engines -from django.template.backends.django import DjangoTemplates -from django.utils.module_loading import import_string - - -def _issubclass(cls, classinfo): - """ - issubclass() variant that doesn't raise an exception if cls isn't a - class. - """ - try: - return issubclass(cls, classinfo) - except TypeError: - return False - - -def _contains_subclass(class_path, candidate_paths): - """ - Return whether or not a dotted class path (or a subclass of that class) is - found in a list of candidate paths. - """ - cls = import_string(class_path) - for path in candidate_paths: - try: - candidate_cls = import_string(path) - except ImportError: - # ImportErrors are raised elsewhere. - continue - if _issubclass(candidate_cls, cls): - return True - return False - - -def check_admin_app(app_configs, **kwargs): - from django.contrib.admin.sites import all_sites - - errors = [] - for site in all_sites: - errors.extend(site.check(app_configs)) - return errors - - -def check_dependencies(**kwargs): - """ - Check that the admin's dependencies are correctly installed. - """ - from django.contrib.admin.sites import all_sites - - if not apps.is_installed("django.contrib.admin"): - return [] - errors = [] - app_dependencies = ( - ("django.contrib.contenttypes", 401), - ("django.contrib.auth", 405), - ("django.contrib.messages", 406), - ) - for app_name, error_code in app_dependencies: - if not apps.is_installed(app_name): - errors.append( - checks.Error( - "'%s' must be in INSTALLED_APPS in order to use the admin " - "application." % app_name, - id="admin.E%d" % error_code, - ) - ) - for engine in engines.all(): - if isinstance(engine, DjangoTemplates): - django_templates_instance = engine.engine - break - else: - django_templates_instance = None - if not django_templates_instance: - errors.append( - checks.Error( - "A 'django.template.backends.django.DjangoTemplates' instance " - "must be configured in TEMPLATES in order to use the admin " - "application.", - id="admin.E403", - ) - ) - else: - if ( - "django.contrib.auth.context_processors.auth" - not in django_templates_instance.context_processors - and _contains_subclass( - "django.contrib.auth.backends.ModelBackend", - settings.AUTHENTICATION_BACKENDS, - ) - ): - errors.append( - checks.Error( - "'django.contrib.auth.context_processors.auth' must be " - "enabled in DjangoTemplates (TEMPLATES) if using the default " - "auth backend in order to use the admin application.", - id="admin.E402", - ) - ) - if ( - "django.contrib.messages.context_processors.messages" - not in django_templates_instance.context_processors - ): - errors.append( - checks.Error( - "'django.contrib.messages.context_processors.messages' must " - "be enabled in DjangoTemplates (TEMPLATES) in order to use " - "the admin application.", - id="admin.E404", - ) - ) - sidebar_enabled = any(site.enable_nav_sidebar for site in all_sites) - if ( - sidebar_enabled - and "django.template.context_processors.request" - not in django_templates_instance.context_processors - ): - errors.append( - checks.Warning( - "'django.template.context_processors.request' must be enabled " - "in DjangoTemplates (TEMPLATES) in order to use the admin " - "navigation sidebar.", - id="admin.W411", - ) - ) - - if not _contains_subclass( - "django.contrib.auth.middleware.AuthenticationMiddleware", settings.MIDDLEWARE - ): - errors.append( - checks.Error( - "'django.contrib.auth.middleware.AuthenticationMiddleware' must " - "be in MIDDLEWARE in order to use the admin application.", - id="admin.E408", - ) - ) - if not _contains_subclass( - "django.contrib.messages.middleware.MessageMiddleware", settings.MIDDLEWARE - ): - errors.append( - checks.Error( - "'django.contrib.messages.middleware.MessageMiddleware' must " - "be in MIDDLEWARE in order to use the admin application.", - id="admin.E409", - ) - ) - if not _contains_subclass( - "django.contrib.sessions.middleware.SessionMiddleware", settings.MIDDLEWARE - ): - errors.append( - checks.Error( - "'django.contrib.sessions.middleware.SessionMiddleware' must " - "be in MIDDLEWARE in order to use the admin application.", - hint=( - "Insert " - "'django.contrib.sessions.middleware.SessionMiddleware' " - "before " - "'django.contrib.auth.middleware.AuthenticationMiddleware'." - ), - id="admin.E410", - ) - ) - return errors - - -class BaseModelAdminChecks: - def check(self, admin_obj, **kwargs): - return [ - *self._check_autocomplete_fields(admin_obj), - *self._check_raw_id_fields(admin_obj), - *self._check_fields(admin_obj), - *self._check_fieldsets(admin_obj), - *self._check_exclude(admin_obj), - *self._check_form(admin_obj), - *self._check_filter_vertical(admin_obj), - *self._check_filter_horizontal(admin_obj), - *self._check_radio_fields(admin_obj), - *self._check_prepopulated_fields(admin_obj), - *self._check_view_on_site_url(admin_obj), - *self._check_ordering(admin_obj), - *self._check_readonly_fields(admin_obj), - ] - - def _check_autocomplete_fields(self, obj): - """ - Check that `autocomplete_fields` is a list or tuple of model fields. - """ - if not isinstance(obj.autocomplete_fields, (list, tuple)): - return must_be( - "a list or tuple", - option="autocomplete_fields", - obj=obj, - id="admin.E036", - ) - else: - return list( - chain.from_iterable( - [ - self._check_autocomplete_fields_item( - obj, field_name, "autocomplete_fields[%d]" % index - ) - for index, field_name in enumerate(obj.autocomplete_fields) - ] - ) - ) - - def _check_autocomplete_fields_item(self, obj, field_name, label): - """ - Check that an item in `autocomplete_fields` is a ForeignKey or a - ManyToManyField and that the item has a related ModelAdmin with - search_fields defined. - """ - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E037" - ) - else: - if not field.many_to_many and not isinstance(field, models.ForeignKey): - return must_be( - "a foreign key or a many-to-many field", - option=label, - obj=obj, - id="admin.E038", - ) - try: - related_admin = obj.admin_site.get_model_admin(field.remote_field.model) - except NotRegistered: - return [ - checks.Error( - 'An admin for model "%s" has to be registered ' - "to be referenced by %s.autocomplete_fields." - % ( - field.remote_field.model.__name__, - type(obj).__name__, - ), - obj=obj.__class__, - id="admin.E039", - ) - ] - else: - if not related_admin.search_fields: - return [ - checks.Error( - '%s must define "search_fields", because it\'s ' - "referenced by %s.autocomplete_fields." - % ( - related_admin.__class__.__name__, - type(obj).__name__, - ), - obj=obj.__class__, - id="admin.E040", - ) - ] - return [] - - def _check_raw_id_fields(self, obj): - """Check that `raw_id_fields` only contains field names that are listed - on the model.""" - - if not isinstance(obj.raw_id_fields, (list, tuple)): - return must_be( - "a list or tuple", option="raw_id_fields", obj=obj, id="admin.E001" - ) - else: - return list( - chain.from_iterable( - self._check_raw_id_fields_item( - obj, field_name, "raw_id_fields[%d]" % index - ) - for index, field_name in enumerate(obj.raw_id_fields) - ) - ) - - def _check_raw_id_fields_item(self, obj, field_name, label): - """Check an item of `raw_id_fields`, i.e. check that field named - `field_name` exists in model `model` and is a ForeignKey or a - ManyToManyField.""" - - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E002" - ) - else: - # Using attname is not supported. - if field.name != field_name: - return refer_to_missing_field( - field=field_name, - option=label, - obj=obj, - id="admin.E002", - ) - if not field.many_to_many and not isinstance(field, models.ForeignKey): - return must_be( - "a foreign key or a many-to-many field", - option=label, - obj=obj, - id="admin.E003", - ) - else: - return [] - - def _check_fields(self, obj): - """Check that `fields` only refer to existing fields, doesn't contain - duplicates. Check if at most one of `fields` and `fieldsets` is defined. - """ - - if obj.fields is None: - return [] - elif not isinstance(obj.fields, (list, tuple)): - return must_be("a list or tuple", option="fields", obj=obj, id="admin.E004") - elif obj.fieldsets: - return [ - checks.Error( - "Both 'fieldsets' and 'fields' are specified.", - obj=obj.__class__, - id="admin.E005", - ) - ] - fields = flatten(obj.fields) - if len(fields) != len(set(fields)): - return [ - checks.Error( - "The value of 'fields' contains duplicate field(s).", - obj=obj.__class__, - id="admin.E006", - ) - ] - - return list( - chain.from_iterable( - self._check_field_spec(obj, field_name, "fields") - for field_name in obj.fields - ) - ) - - def _check_fieldsets(self, obj): - """Check that fieldsets is properly formatted and doesn't contain - duplicates.""" - - if obj.fieldsets is None: - return [] - elif not isinstance(obj.fieldsets, (list, tuple)): - return must_be( - "a list or tuple", option="fieldsets", obj=obj, id="admin.E007" - ) - else: - seen_fields = [] - return list( - chain.from_iterable( - self._check_fieldsets_item( - obj, fieldset, "fieldsets[%d]" % index, seen_fields - ) - for index, fieldset in enumerate(obj.fieldsets) - ) - ) - - def _check_fieldsets_item(self, obj, fieldset, label, seen_fields): - """Check an item of `fieldsets`, i.e. check that this is a pair of a - set name and a dictionary containing "fields" key.""" - - if not isinstance(fieldset, (list, tuple)): - return must_be("a list or tuple", option=label, obj=obj, id="admin.E008") - elif len(fieldset) != 2: - return must_be("of length 2", option=label, obj=obj, id="admin.E009") - elif not isinstance(fieldset[1], dict): - return must_be( - "a dictionary", option="%s[1]" % label, obj=obj, id="admin.E010" - ) - elif "fields" not in fieldset[1]: - return [ - checks.Error( - "The value of '%s[1]' must contain the key 'fields'." % label, - obj=obj.__class__, - id="admin.E011", - ) - ] - elif not isinstance(fieldset[1]["fields"], (list, tuple)): - return must_be( - "a list or tuple", - option="%s[1]['fields']" % label, - obj=obj, - id="admin.E008", - ) - - seen_fields.extend(flatten(fieldset[1]["fields"])) - if len(seen_fields) != len(set(seen_fields)): - return [ - checks.Error( - "There are duplicate field(s) in '%s[1]'." % label, - obj=obj.__class__, - id="admin.E012", - ) - ] - return list( - chain.from_iterable( - self._check_field_spec(obj, fieldset_fields, '%s[1]["fields"]' % label) - for fieldset_fields in fieldset[1]["fields"] - ) - ) - - def _check_field_spec(self, obj, fields, label): - """`fields` should be an item of `fields` or an item of - fieldset[1]['fields'] for any `fieldset` in `fieldsets`. It should be a - field name or a tuple of field names.""" - - if isinstance(fields, tuple): - return list( - chain.from_iterable( - self._check_field_spec_item( - obj, field_name, "%s[%d]" % (label, index) - ) - for index, field_name in enumerate(fields) - ) - ) - else: - return self._check_field_spec_item(obj, fields, label) - - def _check_field_spec_item(self, obj, field_name, label): - if field_name in obj.readonly_fields: - # Stuff can be put in fields that isn't actually a model field if - # it's in readonly_fields, readonly_fields will handle the - # validation of such things. - return [] - else: - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - # If we can't find a field on the model that matches, it could - # be an extra field on the form. - return [] - else: - if ( - isinstance(field, models.ManyToManyField) - and not field.remote_field.through._meta.auto_created - ): - return [ - checks.Error( - "The value of '%s' cannot include the ManyToManyField " - "'%s', because that field manually specifies a " - "relationship model." % (label, field_name), - obj=obj.__class__, - id="admin.E013", - ) - ] - else: - return [] - - def _check_exclude(self, obj): - """Check that exclude is a sequence without duplicates.""" - - if obj.exclude is None: # default value is None - return [] - elif not isinstance(obj.exclude, (list, tuple)): - return must_be( - "a list or tuple", option="exclude", obj=obj, id="admin.E014" - ) - elif len(obj.exclude) > len(set(obj.exclude)): - return [ - checks.Error( - "The value of 'exclude' contains duplicate field(s).", - obj=obj.__class__, - id="admin.E015", - ) - ] - else: - return [] - - def _check_form(self, obj): - """Check that form subclasses BaseModelForm.""" - if not _issubclass(obj.form, BaseModelForm): - return must_inherit_from( - parent="BaseModelForm", option="form", obj=obj, id="admin.E016" - ) - else: - return [] - - def _check_filter_vertical(self, obj): - """Check that filter_vertical is a sequence of field names.""" - if not isinstance(obj.filter_vertical, (list, tuple)): - return must_be( - "a list or tuple", option="filter_vertical", obj=obj, id="admin.E017" - ) - else: - return list( - chain.from_iterable( - self._check_filter_item( - obj, field_name, "filter_vertical[%d]" % index - ) - for index, field_name in enumerate(obj.filter_vertical) - ) - ) - - def _check_filter_horizontal(self, obj): - """Check that filter_horizontal is a sequence of field names.""" - if not isinstance(obj.filter_horizontal, (list, tuple)): - return must_be( - "a list or tuple", option="filter_horizontal", obj=obj, id="admin.E018" - ) - else: - return list( - chain.from_iterable( - self._check_filter_item( - obj, field_name, "filter_horizontal[%d]" % index - ) - for index, field_name in enumerate(obj.filter_horizontal) - ) - ) - - def _check_filter_item(self, obj, field_name, label): - """Check one item of `filter_vertical` or `filter_horizontal`, i.e. - check that given field exists and is a ManyToManyField.""" - - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E019" - ) - else: - if not field.many_to_many or isinstance(field, models.ManyToManyRel): - return must_be( - "a many-to-many field", option=label, obj=obj, id="admin.E020" - ) - elif not field.remote_field.through._meta.auto_created: - return [ - checks.Error( - f"The value of '{label}' cannot include the ManyToManyField " - f"'{field_name}', because that field manually specifies a " - f"relationship model.", - obj=obj.__class__, - id="admin.E013", - ) - ] - else: - return [] - - def _check_radio_fields(self, obj): - """Check that `radio_fields` is a dictionary.""" - if not isinstance(obj.radio_fields, dict): - return must_be( - "a dictionary", option="radio_fields", obj=obj, id="admin.E021" - ) - else: - return list( - chain.from_iterable( - self._check_radio_fields_key(obj, field_name, "radio_fields") - + self._check_radio_fields_value( - obj, val, 'radio_fields["%s"]' % field_name - ) - for field_name, val in obj.radio_fields.items() - ) - ) - - def _check_radio_fields_key(self, obj, field_name, label): - """Check that a key of `radio_fields` dictionary is name of existing - field and that the field is a ForeignKey or has `choices` defined.""" - - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E022" - ) - else: - if not (isinstance(field, models.ForeignKey) or field.choices): - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not an " - "instance of ForeignKey, and does not have a 'choices' " - "definition." % (label, field_name), - obj=obj.__class__, - id="admin.E023", - ) - ] - else: - return [] - - def _check_radio_fields_value(self, obj, val, label): - """Check type of a value of `radio_fields` dictionary.""" - - from django.contrib.admin.options import HORIZONTAL, VERTICAL - - if val not in (HORIZONTAL, VERTICAL): - return [ - checks.Error( - "The value of '%s' must be either admin.HORIZONTAL or " - "admin.VERTICAL." % label, - obj=obj.__class__, - id="admin.E024", - ) - ] - else: - return [] - - def _check_view_on_site_url(self, obj): - if not callable(obj.view_on_site) and not isinstance(obj.view_on_site, bool): - return [ - checks.Error( - "The value of 'view_on_site' must be a callable or a boolean " - "value.", - obj=obj.__class__, - id="admin.E025", - ) - ] - else: - return [] - - def _check_prepopulated_fields(self, obj): - """Check that `prepopulated_fields` is a dictionary containing allowed - field types.""" - if not isinstance(obj.prepopulated_fields, dict): - return must_be( - "a dictionary", option="prepopulated_fields", obj=obj, id="admin.E026" - ) - else: - return list( - chain.from_iterable( - self._check_prepopulated_fields_key( - obj, field_name, "prepopulated_fields" - ) - + self._check_prepopulated_fields_value( - obj, val, 'prepopulated_fields["%s"]' % field_name - ) - for field_name, val in obj.prepopulated_fields.items() - ) - ) - - def _check_prepopulated_fields_key(self, obj, field_name, label): - """Check a key of `prepopulated_fields` dictionary, i.e. check that it - is a name of existing field and the field is one of the allowed types. - """ - - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E027" - ) - else: - if isinstance( - field, (models.DateTimeField, models.ForeignKey, models.ManyToManyField) - ): - return [ - checks.Error( - "The value of '%s' refers to '%s', which must not be a " - "DateTimeField, a ForeignKey, a OneToOneField, or a " - "ManyToManyField." % (label, field_name), - obj=obj.__class__, - id="admin.E028", - ) - ] - else: - return [] - - def _check_prepopulated_fields_value(self, obj, val, label): - """Check a value of `prepopulated_fields` dictionary, i.e. it's an - iterable of existing fields.""" - - if not isinstance(val, (list, tuple)): - return must_be("a list or tuple", option=label, obj=obj, id="admin.E029") - else: - return list( - chain.from_iterable( - self._check_prepopulated_fields_value_item( - obj, subfield_name, "%s[%r]" % (label, index) - ) - for index, subfield_name in enumerate(val) - ) - ) - - def _check_prepopulated_fields_value_item(self, obj, field_name, label): - """For `prepopulated_fields` equal to {"slug": ("title",)}, - `field_name` is "title".""" - - try: - obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E030" - ) - else: - return [] - - def _check_ordering(self, obj): - """Check that ordering refers to existing fields or is random.""" - - # ordering = None - if obj.ordering is None: # The default value is None - return [] - elif not isinstance(obj.ordering, (list, tuple)): - return must_be( - "a list or tuple", option="ordering", obj=obj, id="admin.E031" - ) - else: - return list( - chain.from_iterable( - self._check_ordering_item(obj, field_name, "ordering[%d]" % index) - for index, field_name in enumerate(obj.ordering) - ) - ) - - def _check_ordering_item(self, obj, field_name, label): - """Check that `ordering` refers to existing fields.""" - if isinstance(field_name, (Combinable, models.OrderBy)): - if not isinstance(field_name, models.OrderBy): - field_name = field_name.asc() - if isinstance(field_name.expression, models.F): - field_name = field_name.expression.name - else: - return [] - if field_name == "?" and len(obj.ordering) != 1: - return [ - checks.Error( - "The value of 'ordering' has the random ordering marker '?', " - "but contains other fields as well.", - hint='Either remove the "?", or remove the other fields.', - obj=obj.__class__, - id="admin.E032", - ) - ] - elif field_name == "?": - return [] - elif LOOKUP_SEP in field_name: - # Skip ordering in the format field1__field2 (FIXME: checking - # this format would be nice, but it's a little fiddly). - return [] - else: - field_name = field_name.removeprefix("-") - if field_name == "pk": - return [] - try: - obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E033" - ) - else: - return [] - - def _check_readonly_fields(self, obj): - """Check that readonly_fields refers to proper attribute or field.""" - - if obj.readonly_fields == (): - return [] - elif not isinstance(obj.readonly_fields, (list, tuple)): - return must_be( - "a list or tuple", option="readonly_fields", obj=obj, id="admin.E034" - ) - else: - return list( - chain.from_iterable( - self._check_readonly_fields_item( - obj, field_name, "readonly_fields[%d]" % index - ) - for index, field_name in enumerate(obj.readonly_fields) - ) - ) - - def _check_readonly_fields_item(self, obj, field_name, label): - if callable(field_name): - return [] - elif hasattr(obj, field_name): - return [] - elif hasattr(obj.model, field_name): - return [] - else: - try: - obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not a callable, " - "an attribute of '%s', or an attribute of '%s'." - % ( - label, - field_name, - obj.__class__.__name__, - obj.model._meta.label, - ), - obj=obj.__class__, - id="admin.E035", - ) - ] - else: - return [] - - -class ModelAdminChecks(BaseModelAdminChecks): - def check(self, admin_obj, **kwargs): - return [ - *super().check(admin_obj), - *self._check_save_as(admin_obj), - *self._check_save_on_top(admin_obj), - *self._check_inlines(admin_obj), - *self._check_list_display(admin_obj), - *self._check_list_display_links(admin_obj), - *self._check_list_filter(admin_obj), - *self._check_list_select_related(admin_obj), - *self._check_list_per_page(admin_obj), - *self._check_list_max_show_all(admin_obj), - *self._check_list_editable(admin_obj), - *self._check_search_fields(admin_obj), - *self._check_date_hierarchy(admin_obj), - *self._check_actions(admin_obj), - ] - - def _check_save_as(self, obj): - """Check save_as is a boolean.""" - - if not isinstance(obj.save_as, bool): - return must_be("a boolean", option="save_as", obj=obj, id="admin.E101") - else: - return [] - - def _check_save_on_top(self, obj): - """Check save_on_top is a boolean.""" - - if not isinstance(obj.save_on_top, bool): - return must_be("a boolean", option="save_on_top", obj=obj, id="admin.E102") - else: - return [] - - def _check_inlines(self, obj): - """Check all inline model admin classes.""" - - if not isinstance(obj.inlines, (list, tuple)): - return must_be( - "a list or tuple", option="inlines", obj=obj, id="admin.E103" - ) - else: - return list( - chain.from_iterable( - self._check_inlines_item(obj, item, "inlines[%d]" % index) - for index, item in enumerate(obj.inlines) - ) - ) - - def _check_inlines_item(self, obj, inline, label): - """Check one inline model admin.""" - try: - inline_label = inline.__module__ + "." + inline.__name__ - except AttributeError: - return [ - checks.Error( - "'%s' must inherit from 'InlineModelAdmin'." % obj, - obj=obj.__class__, - id="admin.E104", - ) - ] - - from django.contrib.admin.options import InlineModelAdmin - - if not _issubclass(inline, InlineModelAdmin): - return [ - checks.Error( - "'%s' must inherit from 'InlineModelAdmin'." % inline_label, - obj=obj.__class__, - id="admin.E104", - ) - ] - elif not inline.model: - return [ - checks.Error( - "'%s' must have a 'model' attribute." % inline_label, - obj=obj.__class__, - id="admin.E105", - ) - ] - elif not _issubclass(inline.model, models.Model): - return must_be( - "a Model", option="%s.model" % inline_label, obj=obj, id="admin.E106" - ) - else: - return inline(obj.model, obj.admin_site).check() - - def _check_list_display(self, obj): - """Check that list_display only contains fields or usable attributes.""" - - if not isinstance(obj.list_display, (list, tuple)): - return must_be( - "a list or tuple", option="list_display", obj=obj, id="admin.E107" - ) - else: - return list( - chain.from_iterable( - self._check_list_display_item(obj, item, "list_display[%d]" % index) - for index, item in enumerate(obj.list_display) - ) - ) - - def _check_list_display_item(self, obj, item, label): - if callable(item): - return [] - elif hasattr(obj, item): - return [] - try: - field = obj.model._meta.get_field(item) - except FieldDoesNotExist: - try: - field = getattr(obj.model, item) - except AttributeError: - try: - field = get_fields_from_path(obj.model, item)[-1] - except (FieldDoesNotExist, NotRelationField): - return [ - checks.Error( - f"The value of '{label}' refers to '{item}', which is not " - f"a callable or attribute of '{obj.__class__.__name__}', " - "or an attribute, method, or field on " - f"'{obj.model._meta.label}'.", - obj=obj.__class__, - id="admin.E108", - ) - ] - if ( - getattr(field, "is_relation", False) - and (field.many_to_many or field.one_to_many) - ) or (getattr(field, "rel", None) and field.rel.field.many_to_one): - return [ - checks.Error( - f"The value of '{label}' must not be a many-to-many field or a " - f"reverse foreign key.", - obj=obj.__class__, - id="admin.E109", - ) - ] - return [] - - def _check_list_display_links(self, obj): - """Check that list_display_links is a unique subset of list_display.""" - from django.contrib.admin.options import ModelAdmin - - if obj.list_display_links is None: - return [] - elif not isinstance(obj.list_display_links, (list, tuple)): - return must_be( - "a list, a tuple, or None", - option="list_display_links", - obj=obj, - id="admin.E110", - ) - # Check only if ModelAdmin.get_list_display() isn't overridden. - elif obj.get_list_display.__func__ is ModelAdmin.get_list_display: - return list( - chain.from_iterable( - self._check_list_display_links_item( - obj, field_name, "list_display_links[%d]" % index - ) - for index, field_name in enumerate(obj.list_display_links) - ) - ) - return [] - - def _check_list_display_links_item(self, obj, field_name, label): - if field_name not in obj.list_display: - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not defined in " - "'list_display'." % (label, field_name), - obj=obj.__class__, - id="admin.E111", - ) - ] - else: - return [] - - def _check_list_filter(self, obj): - if not isinstance(obj.list_filter, (list, tuple)): - return must_be( - "a list or tuple", option="list_filter", obj=obj, id="admin.E112" - ) - else: - return list( - chain.from_iterable( - self._check_list_filter_item(obj, item, "list_filter[%d]" % index) - for index, item in enumerate(obj.list_filter) - ) - ) - - def _check_list_filter_item(self, obj, item, label): - """ - Check one item of `list_filter`, i.e. check if it is one of three options: - 1. 'field' -- a basic field filter, possibly w/ relationships (e.g. - 'field__rel') - 2. ('field', SomeFieldListFilter) - a field-based list filter class - 3. SomeListFilter - a non-field list filter class - """ - from django.contrib.admin import FieldListFilter, ListFilter - - if callable(item) and not isinstance(item, models.Field): - # If item is option 3, it should be a ListFilter... - if not _issubclass(item, ListFilter): - return must_inherit_from( - parent="ListFilter", option=label, obj=obj, id="admin.E113" - ) - # ... but not a FieldListFilter. - elif issubclass(item, FieldListFilter): - return [ - checks.Error( - "The value of '%s' must not inherit from 'FieldListFilter'." - % label, - obj=obj.__class__, - id="admin.E114", - ) - ] - else: - return [] - elif isinstance(item, (tuple, list)): - # item is option #2 - field, list_filter_class = item - if not _issubclass(list_filter_class, FieldListFilter): - return must_inherit_from( - parent="FieldListFilter", - option="%s[1]" % label, - obj=obj, - id="admin.E115", - ) - else: - return [] - else: - # item is option #1 - field = item - - # Validate the field string - try: - get_fields_from_path(obj.model, field) - except (NotRelationField, FieldDoesNotExist): - return [ - checks.Error( - "The value of '%s' refers to '%s', which does not refer to a " - "Field." % (label, field), - obj=obj.__class__, - id="admin.E116", - ) - ] - else: - return [] - - def _check_list_select_related(self, obj): - """Check that list_select_related is a boolean, a list or a tuple.""" - - if not isinstance(obj.list_select_related, (bool, list, tuple)): - return must_be( - "a boolean, tuple or list", - option="list_select_related", - obj=obj, - id="admin.E117", - ) - else: - return [] - - def _check_list_per_page(self, obj): - """Check that list_per_page is an integer.""" - - if not isinstance(obj.list_per_page, int): - return must_be( - "an integer", option="list_per_page", obj=obj, id="admin.E118" - ) - else: - return [] - - def _check_list_max_show_all(self, obj): - """Check that list_max_show_all is an integer.""" - - if not isinstance(obj.list_max_show_all, int): - return must_be( - "an integer", option="list_max_show_all", obj=obj, id="admin.E119" - ) - else: - return [] - - def _check_list_editable(self, obj): - """Check that list_editable is a sequence of editable fields from - list_display without first element.""" - - if not isinstance(obj.list_editable, (list, tuple)): - return must_be( - "a list or tuple", option="list_editable", obj=obj, id="admin.E120" - ) - else: - return list( - chain.from_iterable( - self._check_list_editable_item( - obj, item, "list_editable[%d]" % index - ) - for index, item in enumerate(obj.list_editable) - ) - ) - - def _check_list_editable_item(self, obj, field_name, label): - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E121" - ) - else: - if field_name not in obj.list_display: - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not " - "contained in 'list_display'." % (label, field_name), - obj=obj.__class__, - id="admin.E122", - ) - ] - elif obj.list_display_links and field_name in obj.list_display_links: - return [ - checks.Error( - "The value of '%s' cannot be in both 'list_editable' and " - "'list_display_links'." % field_name, - obj=obj.__class__, - id="admin.E123", - ) - ] - # If list_display[0] is in list_editable, check that - # list_display_links is set. See #22792 and #26229 for use cases. - elif ( - obj.list_display[0] == field_name - and not obj.list_display_links - and obj.list_display_links is not None - ): - return [ - checks.Error( - "The value of '%s' refers to the first field in 'list_display' " - "('%s'), which cannot be used unless 'list_display_links' is " - "set." % (label, obj.list_display[0]), - obj=obj.__class__, - id="admin.E124", - ) - ] - elif not field.editable or field.primary_key: - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not editable " - "through the admin." % (label, field_name), - obj=obj.__class__, - id="admin.E125", - ) - ] - else: - return [] - - def _check_search_fields(self, obj): - """Check search_fields is a sequence.""" - - if not isinstance(obj.search_fields, (list, tuple)): - return must_be( - "a list or tuple", option="search_fields", obj=obj, id="admin.E126" - ) - else: - return [] - - def _check_date_hierarchy(self, obj): - """Check that date_hierarchy refers to DateField or DateTimeField.""" - - if obj.date_hierarchy is None: - return [] - else: - try: - field = get_fields_from_path(obj.model, obj.date_hierarchy)[-1] - except (NotRelationField, FieldDoesNotExist): - return [ - checks.Error( - "The value of 'date_hierarchy' refers to '%s', which " - "does not refer to a Field." % obj.date_hierarchy, - obj=obj.__class__, - id="admin.E127", - ) - ] - else: - if field.get_internal_type() not in {"DateField", "DateTimeField"}: - return must_be( - "a DateField or DateTimeField", - option="date_hierarchy", - obj=obj, - id="admin.E128", - ) - else: - return [] - - def _check_actions(self, obj): - errors = [] - actions = obj._get_base_actions() - - # Actions with an allowed_permission attribute require the ModelAdmin - # to implement a has__permission() method for each permission. - for func, name, _ in actions: - if not hasattr(func, "allowed_permissions"): - continue - for permission in func.allowed_permissions: - method_name = "has_%s_permission" % permission - if not hasattr(obj, method_name): - errors.append( - checks.Error( - "%s must define a %s() method for the %s action." - % ( - obj.__class__.__name__, - method_name, - func.__name__, - ), - obj=obj.__class__, - id="admin.E129", - ) - ) - # Names need to be unique. - names = collections.Counter(name for _, name, _ in actions) - for name, count in names.items(): - if count > 1: - errors.append( - checks.Error( - "__name__ attributes of actions defined in %s must be " - "unique. Name %r is not unique." - % ( - obj.__class__.__name__, - name, - ), - obj=obj.__class__, - id="admin.E130", - ) - ) - return errors - - -class InlineModelAdminChecks(BaseModelAdminChecks): - def check(self, inline_obj, **kwargs): - parent_model = inline_obj.parent_model - return [ - *super().check(inline_obj), - *self._check_relation(inline_obj, parent_model), - *self._check_exclude_of_parent_model(inline_obj, parent_model), - *self._check_extra(inline_obj), - *self._check_max_num(inline_obj), - *self._check_min_num(inline_obj), - *self._check_formset(inline_obj), - ] - - def _check_exclude_of_parent_model(self, obj, parent_model): - # Do not perform more specific checks if the base checks result in an - # error. - errors = super()._check_exclude(obj) - if errors: - return [] - - # Skip if `fk_name` is invalid. - if self._check_relation(obj, parent_model): - return [] - - if obj.exclude is None: - return [] - - fk = _get_foreign_key(parent_model, obj.model, fk_name=obj.fk_name) - if fk.name in obj.exclude: - return [ - checks.Error( - "Cannot exclude the field '%s', because it is the foreign key " - "to the parent model '%s'." - % ( - fk.name, - parent_model._meta.label, - ), - obj=obj.__class__, - id="admin.E201", - ) - ] - else: - return [] - - def _check_relation(self, obj, parent_model): - try: - _get_foreign_key(parent_model, obj.model, fk_name=obj.fk_name) - except ValueError as e: - return [checks.Error(e.args[0], obj=obj.__class__, id="admin.E202")] - else: - return [] - - def _check_extra(self, obj): - """Check that extra is an integer.""" - - if not isinstance(obj.extra, int): - return must_be("an integer", option="extra", obj=obj, id="admin.E203") - else: - return [] - - def _check_max_num(self, obj): - """Check that max_num is an integer.""" - - if obj.max_num is None: - return [] - elif not isinstance(obj.max_num, int): - return must_be("an integer", option="max_num", obj=obj, id="admin.E204") - else: - return [] - - def _check_min_num(self, obj): - """Check that min_num is an integer.""" - - if obj.min_num is None: - return [] - elif not isinstance(obj.min_num, int): - return must_be("an integer", option="min_num", obj=obj, id="admin.E205") - else: - return [] - - def _check_formset(self, obj): - """Check formset is a subclass of BaseModelFormSet.""" - - if not _issubclass(obj.formset, BaseModelFormSet): - return must_inherit_from( - parent="BaseModelFormSet", option="formset", obj=obj, id="admin.E206" - ) - else: - return [] - - -def must_be(type, option, obj, id): - return [ - checks.Error( - "The value of '%s' must be %s." % (option, type), - obj=obj.__class__, - id=id, - ), - ] - - -def must_inherit_from(parent, option, obj, id): - return [ - checks.Error( - "The value of '%s' must inherit from '%s'." % (option, parent), - obj=obj.__class__, - id=id, - ), - ] - - -def refer_to_missing_field(field, option, obj, id): - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not a field of '%s'." - % (option, field, obj.model._meta.label), - obj=obj.__class__, - id=id, - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/decorators.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/decorators.py deleted file mode 100644 index d3ff56a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/decorators.py +++ /dev/null @@ -1,111 +0,0 @@ -def action(function=None, *, permissions=None, description=None): - """ - Conveniently add attributes to an action function:: - - @admin.action( - permissions=['publish'], - description='Mark selected stories as published', - ) - def make_published(self, request, queryset): - queryset.update(status='p') - - This is equivalent to setting some attributes (with the original, longer - names) on the function directly:: - - def make_published(self, request, queryset): - queryset.update(status='p') - make_published.allowed_permissions = ['publish'] - make_published.short_description = 'Mark selected stories as published' - """ - - def decorator(func): - if permissions is not None: - func.allowed_permissions = permissions - if description is not None: - func.short_description = description - return func - - if function is None: - return decorator - else: - return decorator(function) - - -def display( - function=None, *, boolean=None, ordering=None, description=None, empty_value=None -): - """ - Conveniently add attributes to a display function:: - - @admin.display( - boolean=True, - ordering='-publish_date', - description='Is Published?', - ) - def is_published(self, obj): - return obj.publish_date is not None - - This is equivalent to setting some attributes (with the original, longer - names) on the function directly:: - - def is_published(self, obj): - return obj.publish_date is not None - is_published.boolean = True - is_published.admin_order_field = '-publish_date' - is_published.short_description = 'Is Published?' - """ - - def decorator(func): - if boolean is not None and empty_value is not None: - raise ValueError( - "The boolean and empty_value arguments to the @display " - "decorator are mutually exclusive." - ) - if boolean is not None: - func.boolean = boolean - if ordering is not None: - func.admin_order_field = ordering - if description is not None: - func.short_description = description - if empty_value is not None: - func.empty_value_display = empty_value - return func - - if function is None: - return decorator - else: - return decorator(function) - - -def register(*models, site=None): - """ - Register the given model(s) classes and wrapped ModelAdmin class with - admin site: - - @register(Author) - class AuthorAdmin(admin.ModelAdmin): - pass - - The `site` kwarg is an admin site to use instead of the default admin site. - """ - from django.contrib.admin import ModelAdmin - from django.contrib.admin.sites import AdminSite - from django.contrib.admin.sites import site as default_site - - def _model_admin_wrapper(admin_class): - if not models: - raise ValueError("At least one model must be passed to register.") - - admin_site = site or default_site - - if not isinstance(admin_site, AdminSite): - raise ValueError("site must subclass AdminSite") - - if not issubclass(admin_class, ModelAdmin): - raise ValueError("Wrapped class must subclass ModelAdmin.") - - admin_site.register(models, admin_class=admin_class) - - return admin_class - - return _model_admin_wrapper diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/exceptions.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/exceptions.py deleted file mode 100644 index 6105eef..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/exceptions.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.core.exceptions import SuspiciousOperation - - -class DisallowedModelAdminLookup(SuspiciousOperation): - """Invalid filter was passed to admin view via URL querystring""" - - pass - - -class DisallowedModelAdminToField(SuspiciousOperation): - """Invalid to_field was passed to admin view via URL query string""" - - pass - - -class AlreadyRegistered(Exception): - """The model is already registered.""" - - pass - - -class NotRegistered(Exception): - """The model is not registered.""" - - pass diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/filters.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/filters.py deleted file mode 100644 index 10a039a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/filters.py +++ /dev/null @@ -1,716 +0,0 @@ -""" -This encapsulates the logic for displaying filters in the Django admin. -Filters are specified in models with the "list_filter" option. - -Each filter subclass knows how to display a filter for a field that passes a -certain test -- e.g. being a DateField or ForeignKey. -""" - -import datetime - -from django.contrib.admin.exceptions import NotRegistered -from django.contrib.admin.options import IncorrectLookupParameters -from django.contrib.admin.utils import ( - build_q_object_from_lookup_parameters, - get_last_value_from_parameters, - get_model_from_relation, - prepare_lookup_value, - reverse_field_path, -) -from django.core.exceptions import ImproperlyConfigured, ValidationError -from django.db import models -from django.utils import timezone -from django.utils.translation import gettext_lazy as _ - - -class ListFilter: - title = None # Human-readable title to appear in the right sidebar. - template = "admin/filter.html" - - def __init__(self, request, params, model, model_admin): - self.request = request - # This dictionary will eventually contain the request's query string - # parameters actually used by this filter. - self.used_parameters = {} - if self.title is None: - raise ImproperlyConfigured( - "The list filter '%s' does not specify a 'title'." - % self.__class__.__name__ - ) - - def has_output(self): - """ - Return True if some choices would be output for this filter. - """ - raise NotImplementedError( - "subclasses of ListFilter must provide a has_output() method" - ) - - def choices(self, changelist): - """ - Return choices ready to be output in the template. - - `changelist` is the ChangeList to be displayed. - """ - raise NotImplementedError( - "subclasses of ListFilter must provide a choices() method" - ) - - def queryset(self, request, queryset): - """ - Return the filtered queryset. - """ - raise NotImplementedError( - "subclasses of ListFilter must provide a queryset() method" - ) - - def expected_parameters(self): - """ - Return the list of parameter names that are expected from the - request's query string and that will be used by this filter. - """ - raise NotImplementedError( - "subclasses of ListFilter must provide an expected_parameters() method" - ) - - -class FacetsMixin: - def get_facet_counts(self, pk_attname, filtered_qs): - raise NotImplementedError( - "subclasses of FacetsMixin must provide a get_facet_counts() method." - ) - - def get_facet_queryset(self, changelist): - filtered_qs = changelist.get_queryset( - self.request, exclude_parameters=self.expected_parameters() - ) - return filtered_qs.aggregate( - **self.get_facet_counts(changelist.pk_attname, filtered_qs) - ) - - -class SimpleListFilter(FacetsMixin, ListFilter): - # The parameter that should be used in the query string for that filter. - parameter_name = None - - def __init__(self, request, params, model, model_admin): - super().__init__(request, params, model, model_admin) - if self.parameter_name is None: - raise ImproperlyConfigured( - "The list filter '%s' does not specify a 'parameter_name'." - % self.__class__.__name__ - ) - if self.parameter_name in params: - value = params.pop(self.parameter_name) - self.used_parameters[self.parameter_name] = value[-1] - lookup_choices = self.lookups(request, model_admin) - if lookup_choices is None: - lookup_choices = () - self.lookup_choices = list(lookup_choices) - - def has_output(self): - return len(self.lookup_choices) > 0 - - def value(self): - """ - Return the value (in string format) provided in the request's - query string for this filter, if any, or None if the value wasn't - provided. - """ - return self.used_parameters.get(self.parameter_name) - - def lookups(self, request, model_admin): - """ - Must be overridden to return a list of tuples (value, verbose value) - """ - raise NotImplementedError( - "The SimpleListFilter.lookups() method must be overridden to " - "return a list of tuples (value, verbose value)." - ) - - def expected_parameters(self): - return [self.parameter_name] - - def get_facet_counts(self, pk_attname, filtered_qs): - original_value = self.used_parameters.get(self.parameter_name) - counts = {} - for i, choice in enumerate(self.lookup_choices): - self.used_parameters[self.parameter_name] = choice[0] - lookup_qs = self.queryset(self.request, filtered_qs) - if lookup_qs is not None: - counts[f"{i}__c"] = models.Count( - pk_attname, - filter=models.Q(pk__in=lookup_qs), - ) - self.used_parameters[self.parameter_name] = original_value - return counts - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - yield { - "selected": self.value() is None, - "query_string": changelist.get_query_string(remove=[self.parameter_name]), - "display": _("All"), - } - for i, (lookup, title) in enumerate(self.lookup_choices): - if add_facets: - if (count := facet_counts.get(f"{i}__c", -1)) != -1: - title = f"{title} ({count})" - else: - title = f"{title} (-)" - yield { - "selected": self.value() == str(lookup), - "query_string": changelist.get_query_string( - {self.parameter_name: lookup} - ), - "display": title, - } - - -class FieldListFilter(FacetsMixin, ListFilter): - _field_list_filters = [] - _take_priority_index = 0 - list_separator = "," - - def __init__(self, field, request, params, model, model_admin, field_path): - self.field = field - self.field_path = field_path - self.title = getattr(field, "verbose_name", field_path) - super().__init__(request, params, model, model_admin) - for p in self.expected_parameters(): - if p in params: - value = params.pop(p) - self.used_parameters[p] = prepare_lookup_value( - p, value, self.list_separator - ) - - def has_output(self): - return True - - def queryset(self, request, queryset): - try: - q_object = build_q_object_from_lookup_parameters(self.used_parameters) - return queryset.filter(q_object) - except (ValueError, ValidationError) as e: - # Fields may raise a ValueError or ValidationError when converting - # the parameters to the correct type. - raise IncorrectLookupParameters(e) - - @classmethod - def register(cls, test, list_filter_class, take_priority=False): - if take_priority: - # This is to allow overriding the default filters for certain types - # of fields with some custom filters. The first found in the list - # is used in priority. - cls._field_list_filters.insert( - cls._take_priority_index, (test, list_filter_class) - ) - cls._take_priority_index += 1 - else: - cls._field_list_filters.append((test, list_filter_class)) - - @classmethod - def create(cls, field, request, params, model, model_admin, field_path): - for test, list_filter_class in cls._field_list_filters: - if test(field): - return list_filter_class( - field, request, params, model, model_admin, field_path=field_path - ) - - -class RelatedFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - other_model = get_model_from_relation(field) - self.lookup_kwarg = "%s__%s__exact" % (field_path, field.target_field.name) - self.lookup_kwarg_isnull = "%s__isnull" % field_path - self.lookup_val = params.get(self.lookup_kwarg) - self.lookup_val_isnull = get_last_value_from_parameters( - params, self.lookup_kwarg_isnull - ) - super().__init__(field, request, params, model, model_admin, field_path) - self.lookup_choices = self.field_choices(field, request, model_admin) - if hasattr(field, "verbose_name"): - self.lookup_title = field.verbose_name - else: - self.lookup_title = other_model._meta.verbose_name - self.title = self.lookup_title - self.empty_value_display = model_admin.get_empty_value_display() - - @property - def include_empty_choice(self): - """ - Return True if a "(None)" choice should be included, which filters - out everything except empty relationships. - """ - return self.field.null or (self.field.is_relation and self.field.many_to_many) - - def has_output(self): - if self.include_empty_choice: - extra = 1 - else: - extra = 0 - return len(self.lookup_choices) + extra > 1 - - def expected_parameters(self): - return [self.lookup_kwarg, self.lookup_kwarg_isnull] - - def field_admin_ordering(self, field, request, model_admin): - """ - Return the model admin's ordering for related field, if provided. - """ - try: - related_admin = model_admin.admin_site.get_model_admin( - field.remote_field.model - ) - except NotRegistered: - return () - else: - return related_admin.get_ordering(request) - - def field_choices(self, field, request, model_admin): - ordering = self.field_admin_ordering(field, request, model_admin) - return field.get_choices(include_blank=False, ordering=ordering) - - def get_facet_counts(self, pk_attname, filtered_qs): - counts = { - f"{pk_val}__c": models.Count( - pk_attname, filter=models.Q(**{self.lookup_kwarg: pk_val}) - ) - for pk_val, _ in self.lookup_choices - } - if self.include_empty_choice: - counts["__c"] = models.Count( - pk_attname, filter=models.Q(**{self.lookup_kwarg_isnull: True}) - ) - return counts - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - yield { - "selected": self.lookup_val is None and not self.lookup_val_isnull, - "query_string": changelist.get_query_string( - remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] - ), - "display": _("All"), - } - count = None - for pk_val, val in self.lookup_choices: - if add_facets: - count = facet_counts[f"{pk_val}__c"] - val = f"{val} ({count})" - yield { - "selected": self.lookup_val is not None - and str(pk_val) in self.lookup_val, - "query_string": changelist.get_query_string( - {self.lookup_kwarg: pk_val}, [self.lookup_kwarg_isnull] - ), - "display": val, - } - empty_title = self.empty_value_display - if self.include_empty_choice: - if add_facets: - count = facet_counts["__c"] - empty_title = f"{empty_title} ({count})" - yield { - "selected": bool(self.lookup_val_isnull), - "query_string": changelist.get_query_string( - {self.lookup_kwarg_isnull: "True"}, [self.lookup_kwarg] - ), - "display": empty_title, - } - - -FieldListFilter.register(lambda f: f.remote_field, RelatedFieldListFilter) - - -class BooleanFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - self.lookup_kwarg = "%s__exact" % field_path - self.lookup_kwarg2 = "%s__isnull" % field_path - self.lookup_val = get_last_value_from_parameters(params, self.lookup_kwarg) - self.lookup_val2 = get_last_value_from_parameters(params, self.lookup_kwarg2) - super().__init__(field, request, params, model, model_admin, field_path) - if ( - self.used_parameters - and self.lookup_kwarg in self.used_parameters - and self.used_parameters[self.lookup_kwarg] in ("1", "0") - ): - self.used_parameters[self.lookup_kwarg] = bool( - int(self.used_parameters[self.lookup_kwarg]) - ) - - def expected_parameters(self): - return [self.lookup_kwarg, self.lookup_kwarg2] - - def get_facet_counts(self, pk_attname, filtered_qs): - return { - "true__c": models.Count( - pk_attname, filter=models.Q(**{self.field_path: True}) - ), - "false__c": models.Count( - pk_attname, filter=models.Q(**{self.field_path: False}) - ), - "null__c": models.Count( - pk_attname, filter=models.Q(**{self.lookup_kwarg2: True}) - ), - } - - def choices(self, changelist): - field_choices = dict(self.field.flatchoices) - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - for lookup, title, count_field in ( - (None, _("All"), None), - ("1", field_choices.get(True, _("Yes")), "true__c"), - ("0", field_choices.get(False, _("No")), "false__c"), - ): - if add_facets: - if count_field is not None: - count = facet_counts[count_field] - title = f"{title} ({count})" - yield { - "selected": self.lookup_val == lookup and not self.lookup_val2, - "query_string": changelist.get_query_string( - {self.lookup_kwarg: lookup}, [self.lookup_kwarg2] - ), - "display": title, - } - if self.field.null: - display = field_choices.get(None, _("Unknown")) - if add_facets: - count = facet_counts["null__c"] - display = f"{display} ({count})" - yield { - "selected": self.lookup_val2 == "True", - "query_string": changelist.get_query_string( - {self.lookup_kwarg2: "True"}, [self.lookup_kwarg] - ), - "display": display, - } - - -FieldListFilter.register( - lambda f: isinstance(f, models.BooleanField), BooleanFieldListFilter -) - - -class ChoicesFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - self.lookup_kwarg = "%s__exact" % field_path - self.lookup_kwarg_isnull = "%s__isnull" % field_path - self.lookup_val = params.get(self.lookup_kwarg) - self.lookup_val_isnull = get_last_value_from_parameters( - params, self.lookup_kwarg_isnull - ) - super().__init__(field, request, params, model, model_admin, field_path) - - def expected_parameters(self): - return [self.lookup_kwarg, self.lookup_kwarg_isnull] - - def get_facet_counts(self, pk_attname, filtered_qs): - return { - f"{i}__c": models.Count( - pk_attname, - filter=models.Q( - (self.lookup_kwarg, value) - if value is not None - else (self.lookup_kwarg_isnull, True) - ), - ) - for i, (value, _) in enumerate(self.field.flatchoices) - } - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - yield { - "selected": self.lookup_val is None, - "query_string": changelist.get_query_string( - remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] - ), - "display": _("All"), - } - none_title = "" - for i, (lookup, title) in enumerate(self.field.flatchoices): - if add_facets: - count = facet_counts[f"{i}__c"] - title = f"{title} ({count})" - if lookup is None: - none_title = title - continue - yield { - "selected": self.lookup_val is not None - and str(lookup) in self.lookup_val, - "query_string": changelist.get_query_string( - {self.lookup_kwarg: lookup}, [self.lookup_kwarg_isnull] - ), - "display": title, - } - if none_title: - yield { - "selected": bool(self.lookup_val_isnull), - "query_string": changelist.get_query_string( - {self.lookup_kwarg_isnull: "True"}, [self.lookup_kwarg] - ), - "display": none_title, - } - - -FieldListFilter.register(lambda f: bool(f.choices), ChoicesFieldListFilter) - - -class DateFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - self.field_generic = "%s__" % field_path - self.date_params = { - k: v[-1] for k, v in params.items() if k.startswith(self.field_generic) - } - - now = timezone.now() - # When time zone support is enabled, convert "now" to the user's time - # zone so Django's definition of "Today" matches what the user expects. - if timezone.is_aware(now): - now = timezone.localtime(now) - - if isinstance(field, models.DateTimeField): - today = now.replace(hour=0, minute=0, second=0, microsecond=0) - else: # field is a models.DateField - today = now.date() - tomorrow = today + datetime.timedelta(days=1) - if today.month == 12: - next_month = today.replace(year=today.year + 1, month=1, day=1) - else: - next_month = today.replace(month=today.month + 1, day=1) - next_year = today.replace(year=today.year + 1, month=1, day=1) - - self.lookup_kwarg_since = "%s__gte" % field_path - self.lookup_kwarg_until = "%s__lt" % field_path - self.links = ( - (_("Any date"), {}), - ( - _("Today"), - { - self.lookup_kwarg_since: today, - self.lookup_kwarg_until: tomorrow, - }, - ), - ( - _("Past 7 days"), - { - self.lookup_kwarg_since: today - datetime.timedelta(days=7), - self.lookup_kwarg_until: tomorrow, - }, - ), - ( - _("This month"), - { - self.lookup_kwarg_since: today.replace(day=1), - self.lookup_kwarg_until: next_month, - }, - ), - ( - _("This year"), - { - self.lookup_kwarg_since: today.replace(month=1, day=1), - self.lookup_kwarg_until: next_year, - }, - ), - ) - if field.null: - self.lookup_kwarg_isnull = "%s__isnull" % field_path - self.links += ( - (_("No date"), {self.field_generic + "isnull": True}), - (_("Has date"), {self.field_generic + "isnull": False}), - ) - super().__init__(field, request, params, model, model_admin, field_path) - - def expected_parameters(self): - params = [self.lookup_kwarg_since, self.lookup_kwarg_until] - if self.field.null: - params.append(self.lookup_kwarg_isnull) - return params - - def get_facet_counts(self, pk_attname, filtered_qs): - return { - f"{i}__c": models.Count(pk_attname, filter=models.Q(**param_dict)) - for i, (_, param_dict) in enumerate(self.links) - } - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - for i, (title, param_dict) in enumerate(self.links): - param_dict_str = {key: str(value) for key, value in param_dict.items()} - if add_facets: - count = facet_counts[f"{i}__c"] - title = f"{title} ({count})" - yield { - "selected": self.date_params == param_dict_str, - "query_string": changelist.get_query_string( - param_dict_str, [self.field_generic] - ), - "display": title, - } - - -FieldListFilter.register(lambda f: isinstance(f, models.DateField), DateFieldListFilter) - - -# This should be registered last, because it's a last resort. For example, -# if a field is eligible to use the BooleanFieldListFilter, that'd be much -# more appropriate, and the AllValuesFieldListFilter won't get used for it. -class AllValuesFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - self.lookup_kwarg = field_path - self.lookup_kwarg_isnull = "%s__isnull" % field_path - self.lookup_val = params.get(self.lookup_kwarg) - self.lookup_val_isnull = get_last_value_from_parameters( - params, self.lookup_kwarg_isnull - ) - self.empty_value_display = model_admin.get_empty_value_display() - parent_model, reverse_path = reverse_field_path(model, field_path) - # Obey parent ModelAdmin queryset when deciding which options to show - if model == parent_model: - queryset = model_admin.get_queryset(request) - else: - queryset = parent_model._default_manager.all() - self.lookup_choices = ( - queryset.distinct().order_by(field.name).values_list(field.name, flat=True) - ) - super().__init__(field, request, params, model, model_admin, field_path) - - def expected_parameters(self): - return [self.lookup_kwarg, self.lookup_kwarg_isnull] - - def get_facet_counts(self, pk_attname, filtered_qs): - return { - f"{i}__c": models.Count( - pk_attname, - filter=models.Q( - (self.lookup_kwarg, value) - if value is not None - else (self.lookup_kwarg_isnull, True) - ), - ) - for i, value in enumerate(self.lookup_choices) - } - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - yield { - "selected": self.lookup_val is None and self.lookup_val_isnull is None, - "query_string": changelist.get_query_string( - remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] - ), - "display": _("All"), - } - include_none = False - count = None - empty_title = self.empty_value_display - for i, val in enumerate(self.lookup_choices): - if add_facets: - count = facet_counts[f"{i}__c"] - if val is None: - include_none = True - empty_title = f"{empty_title} ({count})" if add_facets else empty_title - continue - val = str(val) - yield { - "selected": self.lookup_val is not None and val in self.lookup_val, - "query_string": changelist.get_query_string( - {self.lookup_kwarg: val}, [self.lookup_kwarg_isnull] - ), - "display": f"{val} ({count})" if add_facets else val, - } - if include_none: - yield { - "selected": bool(self.lookup_val_isnull), - "query_string": changelist.get_query_string( - {self.lookup_kwarg_isnull: "True"}, [self.lookup_kwarg] - ), - "display": empty_title, - } - - -FieldListFilter.register(lambda f: True, AllValuesFieldListFilter) - - -class RelatedOnlyFieldListFilter(RelatedFieldListFilter): - def field_choices(self, field, request, model_admin): - pk_qs = ( - model_admin.get_queryset(request) - .distinct() - .values_list("%s__pk" % self.field_path, flat=True) - ) - ordering = self.field_admin_ordering(field, request, model_admin) - return field.get_choices( - include_blank=False, limit_choices_to={"pk__in": pk_qs}, ordering=ordering - ) - - -class EmptyFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - if not field.empty_strings_allowed and not field.null: - raise ImproperlyConfigured( - "The list filter '%s' cannot be used with field '%s' which " - "doesn't allow empty strings and nulls." - % ( - self.__class__.__name__, - field.name, - ) - ) - self.lookup_kwarg = "%s__isempty" % field_path - self.lookup_val = get_last_value_from_parameters(params, self.lookup_kwarg) - super().__init__(field, request, params, model, model_admin, field_path) - - def get_lookup_condition(self): - lookup_conditions = [] - if self.field.empty_strings_allowed: - lookup_conditions.append((self.field_path, "")) - if self.field.null: - lookup_conditions.append((f"{self.field_path}__isnull", True)) - return models.Q.create(lookup_conditions, connector=models.Q.OR) - - def queryset(self, request, queryset): - if self.lookup_kwarg not in self.used_parameters: - return queryset - if self.lookup_val not in ("0", "1"): - raise IncorrectLookupParameters - - lookup_condition = self.get_lookup_condition() - if self.lookup_val == "1": - return queryset.filter(lookup_condition) - return queryset.exclude(lookup_condition) - - def expected_parameters(self): - return [self.lookup_kwarg] - - def get_facet_counts(self, pk_attname, filtered_qs): - lookup_condition = self.get_lookup_condition() - return { - "empty__c": models.Count(pk_attname, filter=lookup_condition), - "not_empty__c": models.Count(pk_attname, filter=~lookup_condition), - } - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - for lookup, title, count_field in ( - (None, _("All"), None), - ("1", _("Empty"), "empty__c"), - ("0", _("Not empty"), "not_empty__c"), - ): - if add_facets: - if count_field is not None: - count = facet_counts[count_field] - title = f"{title} ({count})" - yield { - "selected": self.lookup_val == lookup, - "query_string": changelist.get_query_string( - {self.lookup_kwarg: lookup} - ), - "display": title, - } diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/forms.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/forms.py deleted file mode 100644 index bbb072b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/forms.py +++ /dev/null @@ -1,31 +0,0 @@ -from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm -from django.core.exceptions import ValidationError -from django.utils.translation import gettext_lazy as _ - - -class AdminAuthenticationForm(AuthenticationForm): - """ - A custom authentication form used in the admin app. - """ - - error_messages = { - **AuthenticationForm.error_messages, - "invalid_login": _( - "Please enter the correct %(username)s and password for a staff " - "account. Note that both fields may be case-sensitive." - ), - } - required_css_class = "required" - - def confirm_login_allowed(self, user): - super().confirm_login_allowed(user) - if not user.is_staff: - raise ValidationError( - self.error_messages["invalid_login"], - code="invalid_login", - params={"username": self.username_field.verbose_name}, - ) - - -class AdminPasswordChangeForm(PasswordChangeForm): - required_css_class = "required" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/helpers.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/helpers.py deleted file mode 100644 index 51450d1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/helpers.py +++ /dev/null @@ -1,568 +0,0 @@ -import json - -from django import forms -from django.contrib.admin.utils import ( - display_for_field, - flatten_fieldsets, - help_text_for_field, - label_for_field, - lookup_field, - quote, -) -from django.core.exceptions import ObjectDoesNotExist -from django.db.models.fields.related import ( - ForeignObjectRel, - ManyToManyRel, - OneToOneField, -) -from django.forms.utils import flatatt -from django.template.defaultfilters import capfirst, linebreaksbr -from django.urls import NoReverseMatch, reverse -from django.utils.functional import cached_property -from django.utils.html import conditional_escape, format_html -from django.utils.safestring import mark_safe -from django.utils.translation import gettext -from django.utils.translation import gettext_lazy as _ - -ACTION_CHECKBOX_NAME = "_selected_action" - - -class ActionForm(forms.Form): - action = forms.ChoiceField(label=_("Action:")) - select_across = forms.BooleanField( - label="", - required=False, - initial=0, - widget=forms.HiddenInput({"class": "select-across"}), - ) - - -class AdminForm: - def __init__( - self, - form, - fieldsets, - prepopulated_fields, - readonly_fields=None, - model_admin=None, - ): - self.form, self.fieldsets = form, fieldsets - self.prepopulated_fields = [ - {"field": form[field_name], "dependencies": [form[f] for f in dependencies]} - for field_name, dependencies in prepopulated_fields.items() - ] - self.model_admin = model_admin - if readonly_fields is None: - readonly_fields = () - self.readonly_fields = readonly_fields - - def __repr__(self): - return ( - f"<{self.__class__.__qualname__}: " - f"form={self.form.__class__.__qualname__} " - f"fieldsets={self.fieldsets!r}>" - ) - - def __iter__(self): - for name, options in self.fieldsets: - yield Fieldset( - self.form, - name, - readonly_fields=self.readonly_fields, - model_admin=self.model_admin, - **options, - ) - - @property - def errors(self): - return self.form.errors - - @property - def non_field_errors(self): - return self.form.non_field_errors - - @property - def fields(self): - return self.form.fields - - @property - def is_bound(self): - return self.form.is_bound - - @property - def media(self): - media = self.form.media - for fs in self: - media += fs.media - return media - - -class Fieldset: - def __init__( - self, - form, - name=None, - readonly_fields=(), - fields=(), - classes=(), - description=None, - model_admin=None, - ): - self.form = form - self.name, self.fields = name, fields - self.classes = " ".join(classes) - self.description = description - self.model_admin = model_admin - self.readonly_fields = readonly_fields - - @property - def media(self): - return forms.Media() - - @cached_property - def is_collapsible(self): - if any(field in self.fields for field in self.form.errors): - return False - return "collapse" in self.classes - - def __iter__(self): - for field in self.fields: - yield Fieldline( - self.form, field, self.readonly_fields, model_admin=self.model_admin - ) - - -class Fieldline: - def __init__(self, form, field, readonly_fields=None, model_admin=None): - self.form = form # A django.forms.Form instance - if not hasattr(field, "__iter__") or isinstance(field, str): - self.fields = [field] - else: - self.fields = field - self.has_visible_field = not all( - field in self.form.fields and self.form.fields[field].widget.is_hidden - for field in self.fields - ) - self.model_admin = model_admin - if readonly_fields is None: - readonly_fields = () - self.readonly_fields = readonly_fields - - def __iter__(self): - for i, field in enumerate(self.fields): - if field in self.readonly_fields: - yield AdminReadonlyField( - self.form, field, is_first=(i == 0), model_admin=self.model_admin - ) - else: - yield AdminField(self.form, field, is_first=(i == 0)) - - def errors(self): - return mark_safe( - "\n".join( - self.form[f].errors.as_ul() - for f in self.fields - if f not in self.readonly_fields - ).strip("\n") - ) - - -class AdminField: - def __init__(self, form, field, is_first): - self.field = form[field] # A django.forms.BoundField instance - self.is_first = is_first # Whether this field is first on the line - self.is_checkbox = isinstance(self.field.field.widget, forms.CheckboxInput) - self.is_readonly = False - - def label_tag(self): - classes = [] - contents = conditional_escape(self.field.label) - if self.is_checkbox: - classes.append("vCheckboxLabel") - - if self.field.field.required: - classes.append("required") - if not self.is_first: - classes.append("inline") - attrs = {"class": " ".join(classes)} if classes else {} - # checkboxes should not have a label suffix as the checkbox appears - # to the left of the label. - return self.field.label_tag( - contents=mark_safe(contents), - attrs=attrs, - label_suffix="" if self.is_checkbox else None, - ) - - def errors(self): - return mark_safe(self.field.errors.as_ul()) - - -class AdminReadonlyField: - def __init__(self, form, field, is_first, model_admin=None): - # Make self.field look a little bit like a field. This means that - # {{ field.name }} must be a useful class name to identify the field. - # For convenience, store other field-related data here too. - if callable(field): - class_name = field.__name__ if field.__name__ != "" else "" - else: - class_name = field - - if form._meta.labels and class_name in form._meta.labels: - label = form._meta.labels[class_name] - else: - label = label_for_field(field, form._meta.model, model_admin, form=form) - - if form._meta.help_texts and class_name in form._meta.help_texts: - help_text = form._meta.help_texts[class_name] - else: - help_text = help_text_for_field(class_name, form._meta.model) - - if field in form.fields: - is_hidden = form.fields[field].widget.is_hidden - else: - is_hidden = False - - self.field = { - "name": class_name, - "label": label, - "help_text": help_text, - "field": field, - "is_hidden": is_hidden, - } - self.form = form - self.model_admin = model_admin - self.is_first = is_first - self.is_checkbox = False - self.is_readonly = True - self.empty_value_display = model_admin.get_empty_value_display() - - def label_tag(self): - attrs = {} - if not self.is_first: - attrs["class"] = "inline" - label = self.field["label"] - return format_html( - "{}{}", - flatatt(attrs), - capfirst(label), - self.form.label_suffix, - ) - - def get_admin_url(self, remote_field, remote_obj): - url_name = "admin:%s_%s_change" % ( - remote_field.model._meta.app_label, - remote_field.model._meta.model_name, - ) - try: - url = reverse( - url_name, - args=[quote(remote_obj.pk)], - current_app=self.model_admin.admin_site.name, - ) - return format_html('{}', url, remote_obj) - except NoReverseMatch: - return str(remote_obj) - - def contents(self): - from django.contrib.admin.templatetags.admin_list import _boolean_icon - - field, obj, model_admin = ( - self.field["field"], - self.form.instance, - self.model_admin, - ) - try: - f, attr, value = lookup_field(field, obj, model_admin) - except (AttributeError, ValueError, ObjectDoesNotExist): - result_repr = self.empty_value_display - else: - if field in self.form.fields: - widget = self.form[field].field.widget - # This isn't elegant but suffices for contrib.auth's - # ReadOnlyPasswordHashWidget. - if getattr(widget, "read_only", False): - return widget.render(field, value) - if f is None: - if getattr(attr, "boolean", False): - result_repr = _boolean_icon(value) - else: - if hasattr(value, "__html__"): - result_repr = value - else: - result_repr = linebreaksbr(value) - else: - if isinstance(f.remote_field, ManyToManyRel) and value is not None: - result_repr = ", ".join(map(str, value.all())) - elif ( - isinstance(f.remote_field, (ForeignObjectRel, OneToOneField)) - and value is not None - ): - result_repr = self.get_admin_url(f.remote_field, value) - else: - result_repr = display_for_field(value, f, self.empty_value_display) - result_repr = linebreaksbr(result_repr) - return conditional_escape(result_repr) - - -class InlineAdminFormSet: - """ - A wrapper around an inline formset for use in the admin system. - """ - - def __init__( - self, - inline, - formset, - fieldsets, - prepopulated_fields=None, - readonly_fields=None, - model_admin=None, - has_add_permission=True, - has_change_permission=True, - has_delete_permission=True, - has_view_permission=True, - ): - self.opts = inline - self.formset = formset - self.fieldsets = fieldsets - self.model_admin = model_admin - if readonly_fields is None: - readonly_fields = () - self.readonly_fields = readonly_fields - if prepopulated_fields is None: - prepopulated_fields = {} - self.prepopulated_fields = prepopulated_fields - self.classes = " ".join(inline.classes) if inline.classes else "" - self.has_add_permission = has_add_permission - self.has_change_permission = has_change_permission - self.has_delete_permission = has_delete_permission - self.has_view_permission = has_view_permission - - def __iter__(self): - if self.has_change_permission: - readonly_fields_for_editing = self.readonly_fields - else: - readonly_fields_for_editing = self.readonly_fields + flatten_fieldsets( - self.fieldsets - ) - - for form, original in zip( - self.formset.initial_forms, self.formset.get_queryset() - ): - view_on_site_url = self.opts.get_view_on_site_url(original) - yield InlineAdminForm( - self.formset, - form, - self.fieldsets, - self.prepopulated_fields, - original, - readonly_fields_for_editing, - model_admin=self.opts, - view_on_site_url=view_on_site_url, - ) - for form in self.formset.extra_forms: - yield InlineAdminForm( - self.formset, - form, - self.fieldsets, - self.prepopulated_fields, - None, - self.readonly_fields, - model_admin=self.opts, - ) - if self.has_add_permission: - yield InlineAdminForm( - self.formset, - self.formset.empty_form, - self.fieldsets, - self.prepopulated_fields, - None, - self.readonly_fields, - model_admin=self.opts, - ) - - def fields(self): - fk = getattr(self.formset, "fk", None) - empty_form = self.formset.empty_form - meta_labels = empty_form._meta.labels or {} - meta_help_texts = empty_form._meta.help_texts or {} - for i, field_name in enumerate(flatten_fieldsets(self.fieldsets)): - if fk and fk.name == field_name: - continue - if not self.has_change_permission or field_name in self.readonly_fields: - form_field = empty_form.fields.get(field_name) - widget_is_hidden = False - if form_field is not None: - widget_is_hidden = form_field.widget.is_hidden - yield { - "name": field_name, - "label": meta_labels.get(field_name) - or label_for_field( - field_name, - self.opts.model, - self.opts, - form=empty_form, - ), - "widget": {"is_hidden": widget_is_hidden}, - "required": False, - "help_text": meta_help_texts.get(field_name) - or help_text_for_field(field_name, self.opts.model), - } - else: - form_field = empty_form.fields[field_name] - label = form_field.label - if label is None: - label = label_for_field( - field_name, self.opts.model, self.opts, form=empty_form - ) - yield { - "name": field_name, - "label": label, - "widget": form_field.widget, - "required": form_field.required, - "help_text": form_field.help_text, - } - - def inline_formset_data(self): - verbose_name = self.opts.verbose_name - return json.dumps( - { - "name": "#%s" % self.formset.prefix, - "options": { - "prefix": self.formset.prefix, - "addText": gettext("Add another %(verbose_name)s") - % { - "verbose_name": capfirst(verbose_name), - }, - "deleteText": gettext("Remove"), - }, - } - ) - - @property - def forms(self): - return self.formset.forms - - @cached_property - def is_collapsible(self): - if any(self.formset.errors): - return False - return "collapse" in self.classes - - def non_form_errors(self): - return self.formset.non_form_errors() - - @property - def is_bound(self): - return self.formset.is_bound - - @property - def total_form_count(self): - return self.formset.total_form_count - - @property - def media(self): - media = self.opts.media + self.formset.media - for fs in self: - media += fs.media - return media - - -class InlineAdminForm(AdminForm): - """ - A wrapper around an inline form for use in the admin system. - """ - - def __init__( - self, - formset, - form, - fieldsets, - prepopulated_fields, - original, - readonly_fields=None, - model_admin=None, - view_on_site_url=None, - ): - self.formset = formset - self.model_admin = model_admin - self.original = original - self.show_url = original and view_on_site_url is not None - self.absolute_url = view_on_site_url - super().__init__( - form, fieldsets, prepopulated_fields, readonly_fields, model_admin - ) - - def __iter__(self): - for name, options in self.fieldsets: - yield InlineFieldset( - self.formset, - self.form, - name, - self.readonly_fields, - model_admin=self.model_admin, - **options, - ) - - def needs_explicit_pk_field(self): - return ( - # Auto fields are editable, so check for auto or non-editable pk. - self.form._meta.model._meta.auto_field - or not self.form._meta.model._meta.pk.editable - # The pk can be editable, but excluded from the inline. - or ( - self.form._meta.exclude - and self.form._meta.model._meta.pk.name in self.form._meta.exclude - ) - or - # Also search any parents for an auto field. (The pk info is - # propagated to child models so that does not need to be checked - # in parents.) - any( - parent._meta.auto_field or not parent._meta.model._meta.pk.editable - for parent in self.form._meta.model._meta.all_parents - ) - ) - - def pk_field(self): - return AdminField(self.form, self.formset._pk_field.name, False) - - def fk_field(self): - fk = getattr(self.formset, "fk", None) - if fk: - return AdminField(self.form, fk.name, False) - else: - return "" - - def deletion_field(self): - from django.forms.formsets import DELETION_FIELD_NAME - - return AdminField(self.form, DELETION_FIELD_NAME, False) - - -class InlineFieldset(Fieldset): - def __init__(self, formset, *args, **kwargs): - self.formset = formset - super().__init__(*args, **kwargs) - - def __iter__(self): - fk = getattr(self.formset, "fk", None) - for field in self.fields: - if not fk or fk.name != field: - yield Fieldline( - self.form, field, self.readonly_fields, model_admin=self.model_admin - ) - - -class AdminErrorList(forms.utils.ErrorList): - """Store errors for the form/formsets in an add/change view.""" - - def __init__(self, form, inline_formsets): - super().__init__() - - if form.is_bound: - self.extend(form.errors.values()) - for inline_formset in inline_formsets: - self.extend(inline_formset.non_form_errors()) - for errors_in_inline_form in inline_formset.errors: - self.extend(errors_in_inline_form.values()) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index d43446f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index 1dbfdb7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,788 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Christopher Penkin, 2012 -# Christopher Penkin, 2012 -# F Wolff , 2019-2020,2023-2025 -# Pi Delport , 2012 -# Pi Delport , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: F Wolff , 2019-2020,2023-2025\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Skrap gekose %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Het %(count)d %(items)s suksesvol geskrap." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kan %(name)s nie skrap nie" - -msgid "Delete multiple objects" -msgstr "Skrap meerdere objekte" - -msgid "Administration" -msgstr "Administrasie" - -msgid "All" -msgstr "Almal" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nee" - -msgid "Unknown" -msgstr "Onbekend" - -msgid "Any date" -msgstr "Enige datum" - -msgid "Today" -msgstr "Vandag" - -msgid "Past 7 days" -msgstr "Vorige 7 dae" - -msgid "This month" -msgstr "Hierdie maand" - -msgid "This year" -msgstr "Hierdie jaar" - -msgid "No date" -msgstr "Geen datum" - -msgid "Has date" -msgstr "Het datum" - -msgid "Empty" -msgstr "Leeg" - -msgid "Not empty" -msgstr "Nie leeg nie" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Gee die korrekte %(username)s en wagwoord vir ’n personeelrekening. Let op " -"dat altwee velde dalk hooflettersensitief is." - -msgid "Action:" -msgstr "Aksie:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Voeg nog ’n %(verbose_name)s by" - -msgid "Remove" -msgstr "Verwyder" - -msgid "Addition" -msgstr "Byvoeging" - -msgid "Change" -msgstr "" - -msgid "Deletion" -msgstr "Verwydering" - -msgid "action time" -msgstr "aksietyd" - -msgid "user" -msgstr "gebruiker" - -msgid "content type" -msgstr "inhoudtipe" - -msgid "object id" -msgstr "objek-ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objek-repr" - -msgid "action flag" -msgstr "aksievlag" - -msgid "change message" -msgstr "veranderingboodskap" - -msgid "log entry" -msgstr "log-inskrywing" - -msgid "log entries" -msgstr "log-inskrywingings" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Het “%(object)s” bygevoeg." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Het “%(object)s” gewysig — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Het “%(object)s” geskrap." - -msgid "LogEntry Object" -msgstr "LogEntry-objek" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Het {name} “{object}” bygevoeg." - -msgid "Added." -msgstr "Bygevoeg." - -msgid "and" -msgstr "en" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Het {fields} vir {name} “{object}” bygevoeg." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Het {fields} verander." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Het {name} “{object}” geskrap." - -msgid "No fields changed." -msgstr "Geen velde het verander nie." - -msgid "None" -msgstr "Geen" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Hou “Control” in (of “Command” op ’n Mac) om meer as een te kies." - -msgid "Select this object for an action - {}" -msgstr "Kies dié objek vir ’n aksie - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Die {name} “{obj}” is suksesvol bygevoeg." - -msgid "You may edit it again below." -msgstr "Dit kan weer hieronder gewysig word." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Die {name} “{obj}” is suksesvol bygevoeg. Voeg gerus nog ’n {name} onder by." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Die {name} “{obj}” is suksesvol gewysig. Redigeer dit gerus weer onder." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Die {name} “{obj}” is suksesvol bygevoeg. Voeg gerus nog ’n {name} onder by." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Die {name} “{obj}” is suksesvol gewysig." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Items moet gekies word om aksies op hulle uit te voer. Geen items is " -"verander nie." - -msgid "No action selected." -msgstr "Geen aksie gekies nie." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Die %(name)s “%(obj)s” is suksesvol geskrap." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s met ID “%(key)s” bestaan nie. Is dit dalk geskrap?" - -#, python-format -msgid "Add %s" -msgstr "Voeg %s by" - -#, python-format -msgid "Change %s" -msgstr "Wysig %s" - -#, python-format -msgid "View %s" -msgstr "Beskou %s" - -msgid "Database error" -msgstr "Databasisfout" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s is suksesvol verander." -msgstr[1] "%(count)s %(name)s is suksesvol verander." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s gekies" -msgstr[1] "Al %(total_count)s gekies" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 uit %(cnt)s gekies" - -msgid "Delete" -msgstr "Skrap" - -#, python-format -msgid "Change history: %s" -msgstr "Verander geskiedenis: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Om %(class_name)s %(instance)s te skrap sal vereis dat die volgende " -"beskermde verwante objekte geskrap word: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django-werfadmin" - -msgid "Django administration" -msgstr "Django-administrasie" - -msgid "Site administration" -msgstr "Werfadministrasie" - -msgid "Log in" -msgstr "Meld aan" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-administrasie" - -msgid "Page not found" -msgstr "Bladsy nie gevind nie" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Jammer! Die aangevraagde bladsy kon nie gevind word nie." - -msgid "Home" -msgstr "Tuis" - -msgid "Server error" -msgstr "Bedienerfout" - -msgid "Server error (500)" -msgstr "Bedienerfout (500)" - -msgid "Server Error (500)" -msgstr "Bedienerfout (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"’n Fout het voorgekom Dit is via e-pos aan die werfadministrateurs " -"gerapporteer en behoort binnekort reggestel te word. Dankie vir u geduld." - -msgid "Run the selected action" -msgstr "Voer die gekose aksie uit" - -msgid "Go" -msgstr "Gaan" - -msgid "Click here to select the objects across all pages" -msgstr "Kliek hier om die objekte oor alle bladsye te kies." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Kies al %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Verwyder keuses" - -msgid "Breadcrumbs" -msgstr "Broodkrummels" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelle in die %(name)s-toepassing" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "Voeg skakel by" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Voeg by" - -msgid "View" -msgstr "Bekyk" - -msgid "You don’t have permission to view or edit anything." -msgstr "U het nie regte om enigiets te sien of te redigeer nie." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Nadat ’n gebruiker geskep is, kan meer gebruikerkeuses geredigeer word." - -msgid "Error:" -msgstr "Fout:" - -msgid "Change password" -msgstr "Verander wagwoord" - -msgid "Set password" -msgstr "Stel wagwoord" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Korrigeer asb. die fout hier onder." -msgstr[1] "Korrigeer asb. die foute hier onder." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Vul ’n nuwe wagwoord vir gebruiker %(username)s in." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Dié aksie sal wagwoordgebaseerde aanmelding aktiveer vir " -"dié gebruiker." - -msgid "Disable password-based authentication" -msgstr "Deaktiveer wagwoordgebaseerde aanmelding" - -msgid "Enable password-based authentication" -msgstr "Aktiveer wagwoordgebaseerde aanmelding" - -msgid "Skip to main content" -msgstr "Gaan direk na hoofinhoud" - -msgid "Welcome," -msgstr "Welkom," - -msgid "View site" -msgstr "Besoek werf" - -msgid "Documentation" -msgstr "Dokumentasie" - -msgid "Log out" -msgstr "Meld af" - -#, python-format -msgid "Add %(name)s" -msgstr "Voeg %(name)s by" - -msgid "History" -msgstr "Geskiedenis" - -msgid "View on site" -msgstr "Bekyk op werf" - -msgid "Filter" -msgstr "Filtreer" - -msgid "Hide counts" -msgstr "Versteek tellings" - -msgid "Show counts" -msgstr "Wys tellings" - -msgid "Clear all filters" -msgstr "Verwyder alle filters" - -msgid "Remove from sorting" -msgstr "Verwyder uit sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteerprioriteit: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Wissel sortering" - -msgid "Toggle theme (current theme: auto)" -msgstr "Wissel tema (tans: outomaties)" - -msgid "Toggle theme (current theme: light)" -msgstr "Wissel tema (tans: lig)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Wissel tema (tans: donker)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Om die %(object_name)s %(escaped_object)s te skrap sou verwante objekte " -"skrap, maar jou rekening het nie toestemming om die volgende tipes objekte " -"te skrap nie:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Om die %(object_name)s “%(escaped_object)s” te skrap vereis dat die volgende " -"beskermde verwante objekte geskrap word:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Wil u definitief die %(object_name)s “%(escaped_object)s” skrap? Al die " -"volgende verwante items sal geskrap word:" - -msgid "Objects" -msgstr "Objekte" - -msgid "Yes, I’m sure" -msgstr "Ja, ek is seker" - -msgid "No, take me back" -msgstr "Nee, ek wil teruggaan" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Om die gekose %(objects_name)s te skrap sou verwante objekte skrap, maar u " -"rekening het nie toestemming om die volgende tipes objekte te skrap nie:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Om die gekose %(objects_name)s te skrap vereis dat die volgende beskermde " -"verwante objekte geskrap word:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Wil u definitief die gekose %(objects_name)s skrap? Al die volgende objekte " -"en hul verwante items sal geskrap word:" - -msgid "Delete?" -msgstr "Skrap?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Volgens %(filter_title)s " - -msgid "Summary" -msgstr "Opsomming" - -msgid "Recent actions" -msgstr "Onlangse aksies" - -msgid "My actions" -msgstr "My aksies" - -msgid "None available" -msgstr "Niks beskikbaar nie" - -msgid "Added:" -msgstr "Bygevoeg:" - -msgid "Changed:" -msgstr "Gewysig:" - -msgid "Deleted:" -msgstr "Geskrap:" - -msgid "Unknown content" -msgstr "Onbekende inhoud" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Iets is fout met die databasisinstallasie. Maak seker die gepaste " -"databasistabelle is geskep en maak seker die databasis is leesbaar deur die " -"gepaste gebruiker." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"U is aangemeld as %(username)s, maar het nie toegang tot hierdie bladsy nie. " -"Wil u met ’n ander rekening aanmeld?" - -msgid "Forgotten your login credentials?" -msgstr "Aanmeldinligting vergeet?" - -msgid "Toggle navigation" -msgstr "Navigasie aan/af" - -msgid "Sidebar" -msgstr "Kantbalk" - -msgid "Start typing to filter…" -msgstr "Tik om te filtreer..." - -msgid "Filter navigation items" -msgstr "Filtreer navigasie-items" - -msgid "Date/time" -msgstr "Datum/tyd" - -msgid "User" -msgstr "Gebruiker" - -msgid "Action" -msgstr "Aksie" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "inskrywing" -msgstr[1] "inskrywings" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dié objek het nie 'n wysigingsgeskiedenis. Dit is waarskynlik nie deur dié " -"adminwerf bygevoeg nie." - -msgid "Show all" -msgstr "Wys almal" - -msgid "Save" -msgstr "Stoor" - -msgid "Popup closing…" -msgstr "Opspringer sluit tans…" - -msgid "Search" -msgstr "Soek" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultaat" -msgstr[1] "%(counter)s resultate" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s in totaal" - -msgid "Save as new" -msgstr "Stoor as nuwe" - -msgid "Save and add another" -msgstr "Stoor en voeg ’n ander by" - -msgid "Save and continue editing" -msgstr "Stoor en wysig verder" - -msgid "Save and view" -msgstr "Stoor en bekyk" - -msgid "Close" -msgstr "Sluit" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Wysig gekose %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Voeg nog ’n %(model)s by" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Skrap gekose %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Wys gekose %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Dankie vir die kwaliteittyd wat u met die webwerf deurgebring het vandag." - -msgid "Log in again" -msgstr "Meld weer aan" - -msgid "Password change" -msgstr "Wagwoordverandering" - -msgid "Your password was changed." -msgstr "Die wagwoord is verander." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Gee asb. die ou wagwoord t.w.v. sekuriteit, en gee dan die nuwe wagwoord " -"twee keer sodat ons kan verifieer dat dit korrek getik is." - -msgid "Change my password" -msgstr "Verander my wagwoord" - -msgid "Password reset" -msgstr "Wagwoordherstel" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Jou wagwoord is gestel. Jy kan nou voortgaan en aanmeld." - -msgid "Password reset confirmation" -msgstr "Bevestig wagwoordherstel" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Tik die nuwe wagwoord twee keer in so ons kan seker wees dat dit korrek " -"ingetik is." - -msgid "New password:" -msgstr "Nuwe wagwoord:" - -msgid "Confirm password:" -msgstr "Bevestig wagwoord:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Die skakel vir wagwoordherstel was ongeldig, dalk omdat dit reeds gebruik " -"is. Vra gerus ’n nuwe een aan." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Ons het instruksies gestuur om ’n wagwoord in te stel as ’n rekening bestaan " -"met die gegewe e-posadres. Dit behoort binnekort afgelewer te word." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"As u geen e-pos ontvang nie, kontroleer dat die e-posadres waarmee " -"geregistreer is, gegee is, en kontroleer die gemorspos." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"U ontvang hierdie e-pos omdat u ’n wagwoordherstel vir u rekening by " -"%(site_name)s aangevra het." - -msgid "Please go to the following page and choose a new password:" -msgstr "Gaan asseblief na die volgende bladsy en kies ’n nuwe wagwoord:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Vir ingeval u vergeet het, u is:" - -msgid "Thanks for using our site!" -msgstr "Dankie vir die gebruik van ons webwerf!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Die %(site_name)s span" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Die wagwoord vergeet? Tik u e-posadres hieronder en ons sal instruksies vir " -"die instel van ’n nuwe wagwoord stuur." - -msgid "Email address:" -msgstr "E-posadres:" - -msgid "Reset my password" -msgstr "Herstel my wagwoord" - -msgid "Select all objects on this page for an action" -msgstr "Kies alle objekte op dié bladsy vir ’n aksie" - -msgid "All dates" -msgstr "Alle datums" - -#, python-format -msgid "Select %s" -msgstr "Kies %s" - -#, python-format -msgid "Select %s to change" -msgstr "Kies %s om te verander" - -#, python-format -msgid "Select %s to view" -msgstr "Kies %s om te bekyk" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Tyd:" - -msgid "Lookup" -msgstr "Soek" - -msgid "Currently:" -msgstr "Tans:" - -msgid "Change:" -msgstr "Wysig:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 8c9f589..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po deleted file mode 100644 index e6bdbd2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,312 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2019,2023,2025 -# Pi Delport , 2013 -# Pi Delport , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: F Wolff , 2019,2023,2025\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Beskikbare %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Kies %s deur hulle te merk en klik dan die \"Kies\"-pylknoppie" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Tik in hierdie blokkie om die lys beskikbare %s te filtreer." - -msgid "Filter" -msgstr "Filteer" - -#, javascript-format -msgid "Choose all %s" -msgstr "Kies alle %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Kies gemerkte %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Gekose %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Verwyder %s deur hulle te merk en klik dan die \"Verwyder\"-pylknoppie." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Tik in hierdie blokkie om die lys gekose %s te filtreer." - -msgid "(click to clear)" -msgstr "(klik vir skoon lys)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Verwyder alle %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s gemerkte keuse onsigbaar" -msgstr[1] "%s gemerkte keuses onsigbaar" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s van %(cnt)s gekies" -msgstr[1] "%(sel)s van %(cnt)s gekies" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Daar is ongestoorde veranderinge op individuele redigeerbare velde. Deur nou " -"’n aksie uit te voer, sal ongestoorde veranderinge verlore gaan." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"’n Aksie is gekies, maar die veranderinge aan individuele velde is nog nie " -"gestoor nie. Klik OK om te stoor. Die aksie sal weer uitgevoer moet word." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"’n Aksie is gekies en geen veranderinge aan individuele velde is gemaak nie. " -"Dalk op soek na die Gaan-knoppie in plaas van die Stoor-knoppie?" - -msgid "Now" -msgstr "Nou" - -msgid "Midnight" -msgstr "Middernag" - -msgid "6 a.m." -msgstr "06:00" - -msgid "Noon" -msgstr "Middag" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Let wel: U is %s uur voor die bedienertyd." -msgstr[1] "Let wel: U is %s ure voor die bedienertyd." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Let wel: U is %s uur agter die bedienertyd." -msgstr[1] "Let wel: U is %s ure agter die bedienertyd." - -msgid "Choose a Time" -msgstr "Kies ’n tyd" - -msgid "Choose a time" -msgstr "Kies ‘n tyd" - -msgid "Cancel" -msgstr "Kanselleer" - -msgid "Today" -msgstr "Vandag" - -msgid "Choose a Date" -msgstr "Kies ’n datum" - -msgid "Yesterday" -msgstr "Gister" - -msgid "Tomorrow" -msgstr "Môre" - -msgid "January" -msgstr "Januarie" - -msgid "February" -msgstr "Februarie" - -msgid "March" -msgstr "Maart" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Junie" - -msgid "July" -msgstr "Julie" - -msgid "August" -msgstr "Augustus" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mrt" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgid "Sunday" -msgstr "Sondag" - -msgid "Monday" -msgstr "Maandag" - -msgid "Tuesday" -msgstr "Dinsdag" - -msgid "Wednesday" -msgstr "Woensdag" - -msgid "Thursday" -msgstr "Donderdag" - -msgid "Friday" -msgstr "Vrydag" - -msgid "Saturday" -msgstr "Saterdag" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Son" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Ma" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Di" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Wo" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Do" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Vr" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sa" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "D" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "W" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "D" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.mo deleted file mode 100644 index 37fd72a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.po deleted file mode 100644 index b42fc41..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.po +++ /dev/null @@ -1,636 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 17:44+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Amharic (http://www.transifex.com/django/django/language/" -"am/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: am\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s በተሳካ ሁኔታ ተወግድዋል:: " - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s ማስወገድ አይቻልም" - -msgid "Are you sure?" -msgstr "እርግጠኛ ነህ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "የተመረጡትን %(verbose_name_plural)s አስወግድ" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "ሁሉም" - -msgid "Yes" -msgstr "አዎ" - -msgid "No" -msgstr "አይደለም" - -msgid "Unknown" -msgstr "ያልታወቀ" - -msgid "Any date" -msgstr "ማንኛውም ቀን" - -msgid "Today" -msgstr "ዛሬ" - -msgid "Past 7 days" -msgstr "ያለፉት 7 ቀናት" - -msgid "This month" -msgstr "በዚህ ወር" - -msgid "This year" -msgstr "በዚህ አመት" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "ተግባር:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "ሌላ %(verbose_name)s ጨምር" - -msgid "Remove" -msgstr "አጥፋ" - -msgid "action time" -msgstr "ተግባሩ የተፈፀመበት ጊዜ" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "መልዕክት ለውጥ" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" ተጨምሯል::" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\" - %(changes)s ተቀይሯል" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s.\" ተወግድዋል" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "እና" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "ምንም \"ፊልድ\" አልተቀየረም::" - -msgid "None" -msgstr "ምንም" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "ምንም ተግባር አልተመረጠም::" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" በተሳካ ሁኔታ ተወግድዋል:: " - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s ጨምር" - -#, python-format -msgid "Change %s" -msgstr "%s ቀይር" - -msgid "Database error" -msgstr "የ(ዳታቤዝ) ችግር" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s በተሳካ ሁኔታ ተቀይሯል::" -msgstr[1] "%(count)s %(name)s በተሳካ ሁኔታ ተቀይረዋል::" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s ተመርጠዋል" -msgstr[1] "ሁሉም %(total_count)s ተመርጠዋል" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 of %(cnt)s ተመርጠዋል" - -#, python-format -msgid "Change history: %s" -msgstr "ታሪኩን ቀይር: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ጃንጎ ድህረ-ገጽ አስተዳዳሪ" - -msgid "Django administration" -msgstr "ጃንጎ አስተዳደር" - -msgid "Site administration" -msgstr "ድህረ-ገጽ አስተዳደር" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "ድህረ-ገጹ የለም" - -msgid "We're sorry, but the requested page could not be found." -msgstr "ይቅርታ! የፈለጉት ድህረ-ገጽ የለም::" - -msgid "Home" -msgstr "ሆም" - -msgid "Server error" -msgstr "የሰርቨር ችግር" - -msgid "Server error (500)" -msgstr "የሰርቨር ችግር (500)" - -msgid "Server Error (500)" -msgstr "የሰርቨር ችግር (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "የተመረጡትን ተግባሮች አስጀምር" - -msgid "Go" -msgstr "ስራ" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "ሁሉንም %(total_count)s %(module_name)s ምረጥ" - -msgid "Clear selection" -msgstr "የተመረጡትን ባዶ ኣድርግ" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "መለያስም(ዩዘርኔም) እና የይለፍቃል(ፓስወርድ) ይስገቡ::" - -msgid "Change password" -msgstr "የይለፍቃል(ፓስወርድ) ቅየር" - -msgid "Please correct the error below." -msgstr "ከታች ያሉትን ችግሮች ያስተካክሉ::" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "ለ %(username)s መለያ አዲስ የይለፍቃል(ፓስወርድ) ያስገቡ::" - -msgid "Welcome," -msgstr "እንኳን በደህና መጡ," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "መረጃ" - -msgid "Log out" -msgstr "ጨርሰህ ውጣ" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ጨምር" - -msgid "History" -msgstr "ታሪክ" - -msgid "View on site" -msgstr "ድህረ-ገጹ ላይ ይመልከቱ" - -msgid "Filter" -msgstr "አጣራ" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "አዎ,እርግጠኛ ነኝ" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "ቀይር" - -msgid "Delete?" -msgstr "ላስወግድ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "በ %(filter_title)s" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "ጨምር" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "ምንም የለም" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "የእርሶን መለያስም (ዩዘርኔም) ወይም የይለፍቃል(ፓስወርድ)ዘነጉት?" - -msgid "Date/time" -msgstr "ቀን/ጊዜ" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "ሁሉንም አሳይ" - -msgid "Save" -msgstr "" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "ፈልግ" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] " %(counter)s ውጤት" -msgstr[1] "%(counter)s ውጤቶች" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "በአጠቃላይ %(full_result_count)s" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ዛሬ ድህረ-ገዓችንን ላይ ጥሩ ጊዜ ስላሳለፉ እናመሰግናለን::" - -msgid "Log in again" -msgstr "በድጋሜ ይግቡ" - -msgid "Password change" -msgstr "የይለፍቃል(ፓስወርድ) ቅየራ" - -msgid "Your password was changed." -msgstr "የይለፍቃልዎን(ፓስወርድ) ተቀይሯል::" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "የይለፍቃል(ፓስወርድ) ቀይር" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "አዲስ የይለፍቃል(ፓስወርድ):" - -msgid "Confirm password:" -msgstr "የይለፍቃልዎን(ፓስወርድ) በድጋሜ በማስገባት ያረጋግጡ:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"ኢ-ሜል ካልደረስዎት እባክዎን የተመዘገቡበትን የኢ-ሜል አድራሻ ትክክለኛነት ይረጋግጡእንዲሁም ኢ-ሜል (ስፓም) ማህደር " -"ውስጥ ይመልከቱ::" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"ይህ ኢ-ሜል የደረስዎት %(site_name)s ላይ እንደ አዲስ የይለፍቃል(ፓስወርድ) ለ ለመቀየር ስለጠየቁ ነው::" - -msgid "Please go to the following page and choose a new password:" -msgstr "እባክዎን ወደሚከተለው ድህረ-ገዕ በመሄድ አዲስ የይለፍቃል(ፓስወርድ) ያውጡ:" - -msgid "Your username, in case you've forgotten:" -msgstr "ድንገት ከዘነጉት ይኌው የእርሶ መለያስም (ዩዘርኔም):" - -msgid "Thanks for using our site!" -msgstr "ድህረ-ገዓችንን ስለተጠቀሙ እናመሰግናለን!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s ቡድን" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"የይለፍቃልዎን(ፓስወርድ)ረሱት? ከታች የኢ-ሜል አድራሻዎን ይስገቡ እና አዲስ ፓስወርድ ለማውጣት የሚያስችል መረጃ " -"እንልክልዎታለን::" - -msgid "Email address:" -msgstr "ኢ-ሜል አድራሻ:" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "ሁሉም ቀናት" - -#, python-format -msgid "Select %s" -msgstr "%sን ምረጥ" - -#, python-format -msgid "Select %s to change" -msgstr "ለመቀየር %sን ምረጥ" - -msgid "Date:" -msgstr "ቀን:" - -msgid "Time:" -msgstr "ጊዜ" - -msgid "Lookup" -msgstr "አፈላልግ" - -msgid "Currently:" -msgstr "በዚህ ጊዜ:" - -msgid "Change:" -msgstr "ቀይር:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index 1e0d680..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index f1b1725..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,731 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2015-2016,2018,2020-2021 -# Bashar Al-Abdulhadi, 2014 -# Eyad Toma , 2013 -# Jannis Leidel , 2011 -# Muaaz Alsaied, 2020 -# Tony xD , 2020 -# صفا الفليج , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-10-15 21:11+0000\n" -"Last-Translator: Bashar Al-Abdulhadi\n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "احذف %(verbose_name_plural)s المحدّدة" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "نجح حذف %(count)d من %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "تعذّر حذف %(name)s" - -msgid "Are you sure?" -msgstr "هل أنت متأكد؟" - -msgid "Administration" -msgstr "الإدارة" - -msgid "All" -msgstr "الكل" - -msgid "Yes" -msgstr "نعم" - -msgid "No" -msgstr "لا" - -msgid "Unknown" -msgstr "مجهول" - -msgid "Any date" -msgstr "أي تاريخ" - -msgid "Today" -msgstr "اليوم" - -msgid "Past 7 days" -msgstr "الأيام السبعة الماضية" - -msgid "This month" -msgstr "هذا الشهر" - -msgid "This year" -msgstr "هذه السنة" - -msgid "No date" -msgstr "لا يوجد أي تاريخ" - -msgid "Has date" -msgstr "به تاريخ" - -msgid "Empty" -msgstr "فارغ" - -msgid "Not empty" -msgstr "غير فارغ" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"من فضلك أدخِل قيمة %(username)s الصحيحة وكلمة السر لحساب الطاقم الإداري. " -"الحقلين حسّاسين لحالة الأحرف." - -msgid "Action:" -msgstr "الإجراء:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "أضِف %(verbose_name)s آخر" - -msgid "Remove" -msgstr "أزِل" - -msgid "Addition" -msgstr "إضافة" - -msgid "Change" -msgstr "تعديل" - -msgid "Deletion" -msgstr "حذف" - -msgid "action time" -msgstr "وقت الإجراء" - -msgid "user" -msgstr "المستخدم" - -msgid "content type" -msgstr "نوع المحتوى" - -msgid "object id" -msgstr "معرّف الكائن" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "التمثيل البصري للكائن" - -msgid "action flag" -msgstr "راية الإجراء" - -msgid "change message" -msgstr "رسالة التغيير" - -msgid "log entry" -msgstr "مدخلة سجلات" - -msgid "log entries" -msgstr "مدخلات السجلات" - -#, python-format -msgid "Added “%(object)s”." -msgstr "أُضيف ”%(object)s“." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "عُدّل ”%(object)s“ — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "حُذف ”%(object)s“." - -msgid "LogEntry Object" -msgstr "كائن LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "أُضيف {name} ‏”{object}“." - -msgid "Added." -msgstr "أُضيف." - -msgid "and" -msgstr "و" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "تغيّرت {fields} ‏{name} ‏”{object}“." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "تغيّرت {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "حُذف {name} ‏”{object}“." - -msgid "No fields changed." -msgstr "لم يتغيّر أي حقل." - -msgid "None" -msgstr "بلا" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"اضغط مفتاح ”Contrl“ (أو ”Command“ على أجهزة ماك) مطوّلًا لتحديد أكثر من عنصر." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "نجحت إضافة {name} ‏”{obj}“." - -msgid "You may edit it again below." -msgstr "يمكنك تعديله ثانيةً أسفله." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "نجحت إضافة {name} ‏”{obj}“. يمكنك إضافة {name} آخر أسفله." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "نجح تعديل {name} ‏”{obj}“. يمكنك تعديله ثانيةً أسفله." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "نجحت إضافة {name} ‏”{obj}“. يمكنك تعديله ثانيةً أسفله." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "تمت إضافة {name} “{obj}” بنجاح، يمكنك إضافة {name} أخر بالأسفل." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "نجحت إضافة {name} ‏”{obj}“." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "عليك تحديد العناصر لتطبيق الإجراءات عليها. لم يتغيّر أيّ عنصر." - -msgid "No action selected." -msgstr "لا إجراء محدّد." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "نجح حذف %(name)s ‏”%(obj)s“." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "ما من %(name)s له المعرّف ”%(key)s“. لربّما حُذف أساسًا؟" - -#, python-format -msgid "Add %s" -msgstr "إضافة %s" - -#, python-format -msgid "Change %s" -msgstr "تعديل %s" - -#, python-format -msgid "View %s" -msgstr "عرض %s" - -msgid "Database error" -msgstr "خطـأ في قاعدة البيانات" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "لم يتم تغيير أي شيء" -msgstr[1] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[2] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[3] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[4] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[5] "تم تغيير %(count)s %(name)s بنجاح." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "لم يتم تحديد أي شيء" -msgstr[1] "تم تحديد %(total_count)s" -msgstr[2] "تم تحديد %(total_count)s" -msgstr[3] "تم تحديد %(total_count)s" -msgstr[4] "تم تحديد %(total_count)s" -msgstr[5] "تم تحديد %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "لا شيء محدد من %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "تاريخ التغيير: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"حذف %(class_name)s %(instance)s سيتسبب أيضاً بحذف العناصر المرتبطة التالية: " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "إدارة موقع جانغو" - -msgid "Django administration" -msgstr "إدارة جانغو" - -msgid "Site administration" -msgstr "إدارة الموقع" - -msgid "Log in" -msgstr "ادخل" - -#, python-format -msgid "%(app)s administration" -msgstr "إدارة %(app)s " - -msgid "Page not found" -msgstr "تعذر العثور على الصفحة" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "نحن آسفون، لكننا لم نعثر على الصفحة المطلوبة." - -msgid "Home" -msgstr "الرئيسية" - -msgid "Server error" -msgstr "خطأ في المزود" - -msgid "Server error (500)" -msgstr "خطأ في المزود (500)" - -msgid "Server Error (500)" -msgstr "خطأ في المزود (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"لقد حدث خطأ. تم إبلاغ مسؤولي الموقع عبر البريد الإلكتروني وسيتم إصلاحه " -"قريبًا. شكرا لصبرك." - -msgid "Run the selected action" -msgstr "نفذ الإجراء المحدّد" - -msgid "Go" -msgstr "نفّذ" - -msgid "Click here to select the objects across all pages" -msgstr "اضغط هنا لتحديد جميع العناصر في جميع الصفحات" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "اختيار %(total_count)s %(module_name)s جميعها" - -msgid "Clear selection" -msgstr "إزالة الاختيار" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "النماذج في تطبيق %(name)s" - -msgid "Add" -msgstr "أضف" - -msgid "View" -msgstr "استعراض" - -msgid "You don’t have permission to view or edit anything." -msgstr "ليست لديك الصلاحية لاستعراض أو لتعديل أي شيء." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"أولاً ، أدخل اسم المستخدم وكلمة المرور. بعد ذلك ، ستتمكن من تعديل المزيد من " -"خيارات المستخدم." - -msgid "Enter a username and password." -msgstr "أدخل اسم مستخدم وكلمة مرور." - -msgid "Change password" -msgstr "غيّر كلمة المرور" - -msgid "Please correct the error below." -msgstr "الرجاء تصحيح الأخطاء أدناه." - -msgid "Please correct the errors below." -msgstr "الرجاء تصحيح الأخطاء أدناه." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "أدخل كلمة مرور جديدة للمستخدم %(username)s." - -msgid "Welcome," -msgstr "أهلا، " - -msgid "View site" -msgstr "عرض الموقع" - -msgid "Documentation" -msgstr "الوثائق" - -msgid "Log out" -msgstr "تسجيل الخروج" - -#, python-format -msgid "Add %(name)s" -msgstr "أضف %(name)s" - -msgid "History" -msgstr "تاريخ" - -msgid "View on site" -msgstr "مشاهدة على الموقع" - -msgid "Filter" -msgstr "مرشّح" - -msgid "Clear all filters" -msgstr "مسح جميع المرشحات" - -msgid "Remove from sorting" -msgstr "إزالة من الترتيب" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "أولوية الترتيب: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "عكس الترتيب" - -msgid "Delete" -msgstr "احذف" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"حذف العنصر %(object_name)s '%(escaped_object)s' سيتسبب بحذف العناصر المرتبطة " -"به، إلا أنك لا تملك صلاحية حذف العناصر التالية:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"حذف %(object_name)s '%(escaped_object)s' سيتسبب أيضاً بحذف العناصر المرتبطة، " -"إلا أن حسابك ليس لديه صلاحية حذف أنواع العناصر التالية:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"متأكد أنك تريد حذف العنصر %(object_name)s \"%(escaped_object)s\"؟ سيتم حذف " -"جميع العناصر التالية المرتبطة به:" - -msgid "Objects" -msgstr "عناصر" - -msgid "Yes, I’m sure" -msgstr "نعم، أنا متأكد" - -msgid "No, take me back" -msgstr "لا, تراجع للخلف" - -msgid "Delete multiple objects" -msgstr "حذف عدّة عناصر" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"حذف عناصر %(objects_name)s المُحدّدة سيتسبب بحذف العناصر المرتبطة، إلا أن " -"حسابك ليس له صلاحية حذف أنواع العناصر التالية:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"حذف عناصر %(objects_name)s المحدّدة قد يتطلب حذف العناصر المحميّة المرتبطة " -"التالية:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"أأنت متأكد أنك تريد حذف عناصر %(objects_name)s المحددة؟ جميع العناصر التالية " -"والعناصر المرتبطة بها سيتم حذفها:" - -msgid "Delete?" -msgstr "احذفه؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr " حسب %(filter_title)s " - -msgid "Summary" -msgstr "ملخص" - -msgid "Recent actions" -msgstr "آخر الإجراءات" - -msgid "My actions" -msgstr "إجراءاتي" - -msgid "None available" -msgstr "لا يوجد" - -msgid "Unknown content" -msgstr "مُحتوى مجهول" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"هنالك أمر خاطئ في تركيب قاعدة بياناتك، تأكد من أنه تم انشاء جداول قاعدة " -"البيانات الملائمة، وأن قاعدة البيانات قابلة للقراءة من قبل المستخدم الملائم." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"أنت مسجل الدخول بإسم المستخدم %(username)s, ولكنك غير مخول للوصول لهذه " -"الصفحة. هل ترغب بتسجيل الدخول بحساب آخر؟" - -msgid "Forgotten your password or username?" -msgstr "نسيت كلمة المرور أو اسم المستخدم الخاص بك؟" - -msgid "Toggle navigation" -msgstr "تغيير التصفّح" - -msgid "Start typing to filter…" -msgstr "ابدأ الكتابة للتصفية ..." - -msgid "Filter navigation items" -msgstr "تصفية عناصر التصفح" - -msgid "Date/time" -msgstr "التاريخ/الوقت" - -msgid "User" -msgstr "المستخدم" - -msgid "Action" -msgstr "إجراء" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"ليس لهذا العنصر سجلّ تغييرات، على الأغلب أنه لم يُنشأ من خلال نظام إدارة " -"الموقع." - -msgid "Show all" -msgstr "أظهر الكل" - -msgid "Save" -msgstr "احفظ" - -msgid "Popup closing…" -msgstr "جاري إغلاق النافذة المنبثقة..." - -msgid "Search" -msgstr "ابحث" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "لا نتائج" -msgstr[1] "نتيجة واحدة" -msgstr[2] "نتيجتان" -msgstr[3] "%(counter)s نتائج" -msgstr[4] "%(counter)s نتيجة" -msgstr[5] "%(counter)s نتيجة" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "المجموع %(full_result_count)s" - -msgid "Save as new" -msgstr "احفظ كجديد" - -msgid "Save and add another" -msgstr "احفظ وأضف آخر" - -msgid "Save and continue editing" -msgstr "احفظ واستمر بالتعديل" - -msgid "Save and view" -msgstr "احفظ واستعرض" - -msgid "Close" -msgstr "إغلاق" - -#, python-format -msgid "Change selected %(model)s" -msgstr "تغيير %(model)s المختارة" - -#, python-format -msgid "Add another %(model)s" -msgstr "أضف %(model)s آخر" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "حذف %(model)s المختارة" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "شكرا لقضاء بعض الوقت الجيد في الموقع اليوم." - -msgid "Log in again" -msgstr "ادخل مجدداً" - -msgid "Password change" -msgstr "غيّر كلمة مرورك" - -msgid "Your password was changed." -msgstr "تمّ تغيير كلمة مرورك." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"رجاءً أدخل كلمة المرور القديمة، للأمان، ثم أدخل كلمة المرور الجديدة مرتين " -"لنتأكد بأنك قمت بإدخالها بشكل صحيح." - -msgid "Change my password" -msgstr "غيّر كلمة مروري" - -msgid "Password reset" -msgstr "استعادة كلمة المرور" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "تم تعيين كلمة مرورك. يمكن الاستمرار وتسجيل دخولك الآن." - -msgid "Password reset confirmation" -msgstr "تأكيد استعادة كلمة المرور" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "رجاءً أدخل كلمة مرورك الجديدة مرتين كي تتأكّد من كتابتها بشكل صحيح." - -msgid "New password:" -msgstr "كلمة المرور الجديدة:" - -msgid "Confirm password:" -msgstr "أكّد كلمة المرور:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"رابط استعادة كلمة المرور غير صحيح، ربما لأنه استُخدم من قبل. رجاءً اطلب " -"استعادة كلمة المرور مرة أخرى." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"تم إرسال بريد إلكتروني بالتعليمات لضبط كلمة المرور الخاصة بك، وذلك في حال " -"تواجد حساب بنفس البريد الإلكتروني الذي أدخلته. سوف تستقبل البريد الإلكتروني " -"قريباً" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"في حال عدم إستقبال البريد الإلكتروني، الرجاء التأكد من إدخال عنوان بريدك " -"الإلكتروني الخاص بحسابك ومراجعة مجلد الرسائل غير المرغوب بها." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"لقد قمت بتلقى هذه الرسالة لطلبك بإعادة تعين كلمة المرور لحسابك الشخصي على " -"%(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "رجاءً اذهب إلى الصفحة التالية واختر كلمة مرور جديدة:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "اسم المستخدم الخاص بك، في حال كنت قد نسيته:" - -msgid "Thanks for using our site!" -msgstr "شكراً لاستخدامك موقعنا!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "فريق %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"هل نسيت كلمة المرور؟ أدخل عنوان بريدك الإلكتروني أدناه وسوف نقوم بإرسال " -"تعليمات للحصول على كلمة مرور جديدة." - -msgid "Email address:" -msgstr "عنوان البريد الإلكتروني:" - -msgid "Reset my password" -msgstr "استعد كلمة مروري" - -msgid "All dates" -msgstr "كافة التواريخ" - -#, python-format -msgid "Select %s" -msgstr "اختر %s" - -#, python-format -msgid "Select %s to change" -msgstr "اختر %s لتغييره" - -#, python-format -msgid "Select %s to view" -msgstr "اختر %s للاستعراض" - -msgid "Date:" -msgstr "التاريخ:" - -msgid "Time:" -msgstr "الوقت:" - -msgid "Lookup" -msgstr "ابحث" - -msgid "Currently:" -msgstr "حالياً:" - -msgid "Change:" -msgstr "تغيير:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0060573..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po deleted file mode 100644 index f7570b5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,278 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2015,2020-2021 -# Bashar Al-Abdulhadi, 2014 -# Jannis Leidel , 2011 -# Omar Lajam, 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-10-15 21:27+0000\n" -"Last-Translator: Bashar Al-Abdulhadi\n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s المتوفرة" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"هذه قائمة %s المتوفرة. يمكنك اختيار بعضها بانتقائها في الصندوق أدناه ثم " -"الضغط على سهم الـ\"اختيار\" بين الصندوقين." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "اكتب في هذا الصندوق لتصفية قائمة %s المتوفرة." - -msgid "Filter" -msgstr "تصفية" - -msgid "Choose all" -msgstr "اختر الكل" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "اضغط لاختيار جميع %s جملة واحدة." - -msgid "Choose" -msgstr "اختيار" - -msgid "Remove" -msgstr "احذف" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s المُختارة" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"هذه قائمة %s المحددة. يمكنك إزالة بعضها باختيارها في الصندوق أدناه ثم اضغط " -"على سهم الـ\"إزالة\" بين الصندوقين." - -msgid "Remove all" -msgstr "إزالة الكل" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "اضغط لإزالة جميع %s المحددة جملة واحدة." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "لا شي محدد" -msgstr[1] "%(sel)s من %(cnt)s محدد" -msgstr[2] "%(sel)s من %(cnt)s محدد" -msgstr[3] "%(sel)s من %(cnt)s محددة" -msgstr[4] "%(sel)s من %(cnt)s محدد" -msgstr[5] "%(sel)s من %(cnt)s محدد" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"لديك تعديلات غير محفوظة على بعض الحقول القابلة للتعديل. إن نفذت أي إجراء " -"فسوف تخسر تعديلاتك." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"لقد حددت إجراءً ، لكنك لم تحفظ تغييراتك في الحقول الفردية حتى الآن. يرجى " -"النقر فوق موافق للحفظ. ستحتاج إلى إعادة تشغيل الإجراء." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"لقد حددت إجراء ، ولم تقم بإجراء أي تغييرات على الحقول الفردية. من المحتمل " -"أنك تبحث عن الزر أذهب بدلاً من الزر حفظ." - -msgid "Now" -msgstr "الآن" - -msgid "Midnight" -msgstr "منتصف الليل" - -msgid "6 a.m." -msgstr "6 ص." - -msgid "Noon" -msgstr "الظهر" - -msgid "6 p.m." -msgstr "6 مساءً" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[1] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[2] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[3] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[4] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[5] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[1] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[2] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[3] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[4] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[5] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." - -msgid "Choose a Time" -msgstr "إختر وقت" - -msgid "Choose a time" -msgstr "اختر وقتاً" - -msgid "Cancel" -msgstr "ألغ" - -msgid "Today" -msgstr "اليوم" - -msgid "Choose a Date" -msgstr "إختر تاريخ " - -msgid "Yesterday" -msgstr "أمس" - -msgid "Tomorrow" -msgstr "غداً" - -msgid "January" -msgstr "يناير" - -msgid "February" -msgstr "فبراير" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "أبريل" - -msgid "May" -msgstr "مايو" - -msgid "June" -msgstr "يونيو" - -msgid "July" -msgstr "يوليو" - -msgid "August" -msgstr "أغسطس" - -msgid "September" -msgstr "سبتمبر" - -msgid "October" -msgstr "أكتوبر" - -msgid "November" -msgstr "نوفمبر" - -msgid "December" -msgstr "ديسمبر" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "يناير" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "فبراير" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "مارس" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "إبريل" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "مايو" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "يونيو" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "يوليو" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "أغسطس" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "سبتمبر" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "أكتوبر" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "نوفمبر" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "ديسمبر" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "أحد" - -msgctxt "one letter Monday" -msgid "M" -msgstr "إثنين" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "ثلاثاء" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "أربعاء" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "خميس" - -msgctxt "one letter Friday" -msgid "F" -msgstr "جمعة" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "سبت" - -msgid "Show" -msgstr "أظهر" - -msgid "Hide" -msgstr "اخف" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index 5f75b27..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index 8608584..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,738 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jihad Bahmaid Al-Halki, 2022 -# Riterix , 2019-2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Jihad Bahmaid Al-Halki\n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "حذف سجلات %(verbose_name_plural)s المحددة" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "تم حذف %(count)d %(items)s بنجاح." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "لا يمكن حذف %(name)s" - -msgid "Are you sure?" -msgstr "هل أنت متأكد؟" - -msgid "Administration" -msgstr "الإدارة" - -msgid "All" -msgstr "الكل" - -msgid "Yes" -msgstr "نعم" - -msgid "No" -msgstr "لا" - -msgid "Unknown" -msgstr "مجهول" - -msgid "Any date" -msgstr "أي تاريخ" - -msgid "Today" -msgstr "اليوم" - -msgid "Past 7 days" -msgstr "الأيام السبعة الماضية" - -msgid "This month" -msgstr "هذا الشهر" - -msgid "This year" -msgstr "هذه السنة" - -msgid "No date" -msgstr "لا يوجد أي تاريخ" - -msgid "Has date" -msgstr "به تاريخ" - -msgid "Empty" -msgstr "فارغة" - -msgid "Not empty" -msgstr "ليست فارغة" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"الرجاء إدخال ال%(username)s و كلمة المرور الصحيحين لحساب الطاقم. الحقلين " -"حساسين وضعية الاحرف." - -msgid "Action:" -msgstr "إجراء:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "إضافة سجل %(verbose_name)s آخر" - -msgid "Remove" -msgstr "أزل" - -msgid "Addition" -msgstr "إضافة" - -msgid "Change" -msgstr "عدّل" - -msgid "Deletion" -msgstr "حذف" - -msgid "action time" -msgstr "وقت الإجراء" - -msgid "user" -msgstr "المستخدم" - -msgid "content type" -msgstr "نوع المحتوى" - -msgid "object id" -msgstr "معرف العنصر" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ممثل العنصر" - -msgid "action flag" -msgstr "علامة الإجراء" - -msgid "change message" -msgstr "غيّر الرسالة" - -msgid "log entry" -msgstr "مُدخل السجل" - -msgid "log entries" -msgstr "مُدخلات السجل" - -#, python-format -msgid "Added “%(object)s”." -msgstr "تم إضافة العناصر \\\"%(object)s\\\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "تم تعديل العناصر \\\"%(object)s\\\" - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "تم حذف العناصر \\\"%(object)s.\\\"" - -msgid "LogEntry Object" -msgstr "كائن LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "تم إضافة {name} \\\"{object}\\\"." - -msgid "Added." -msgstr "تمت الإضافة." - -msgid "and" -msgstr "و" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "تم تغيير {fields} لـ {name} \\\"{object}\\\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "تم تغيير {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "تم حذف {name} \\\"{object}\\\"." - -msgid "No fields changed." -msgstr "لم يتم تغيير أية حقول." - -msgid "None" -msgstr "لاشيء" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"استمر بالضغط على مفتاح \\\"Control\\\", او \\\"Command\\\" على أجهزة الماك, " -"لإختيار أكثر من أختيار واحد." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "تمت إضافة {name} \\\"{obj}\\\" بنجاح." - -msgid "You may edit it again below." -msgstr "يمكن تعديله مرة أخرى أدناه." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "تمت إضافة {name} \\\"{obj}\\\" بنجاح. يمكنك إضافة {name} آخر أدناه." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "تم تغيير {name} \\\"{obj}\\\" بنجاح. يمكنك تعديله مرة أخرى أدناه." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "تمت إضافة {name} \\\"{obj}\\\" بنجاح. يمكنك تعديله مرة أخرى أدناه." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "تم تغيير {name} \\\"{obj}\\\" بنجاح. يمكنك إضافة {name} آخر أدناه." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "تم تغيير {name} \\\"{obj}\\\" بنجاح." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "يجب تحديد العناصر لتطبيق الإجراءات عليها. لم يتم تغيير أية عناصر." - -msgid "No action selected." -msgstr "لم يحدد أي إجراء." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "تم حذف %(name)s \\\"%(obj)s\\\" بنجاح." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s ب ID \\\"%(key)s\\\" غير موجود. ربما تم حذفه؟" - -#, python-format -msgid "Add %s" -msgstr "أضف %s" - -#, python-format -msgid "Change %s" -msgstr "عدّل %s" - -#, python-format -msgid "View %s" -msgstr "عرض %s" - -msgid "Database error" -msgstr "خطـأ في قاعدة البيانات" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[1] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[2] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[3] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[4] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[5] "تم تغيير %(count)s %(name)s بنجاح." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "تم تحديد %(total_count)s" -msgstr[1] "تم تحديد %(total_count)s" -msgstr[2] "تم تحديد %(total_count)s" -msgstr[3] "تم تحديد %(total_count)s" -msgstr[4] "تم تحديد %(total_count)s" -msgstr[5] "تم تحديد %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "لا شيء محدد من %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "تاريخ التغيير: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"حذف %(class_name)s %(instance)s سيتسبب أيضاً بحذف العناصر المرتبطة التالية: " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "إدارة موقع جانغو" - -msgid "Django administration" -msgstr "إدارة جانغو" - -msgid "Site administration" -msgstr "إدارة الموقع" - -msgid "Log in" -msgstr "ادخل" - -#, python-format -msgid "%(app)s administration" -msgstr "إدارة %(app)s " - -msgid "Page not found" -msgstr "تعذر العثور على الصفحة" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "نحن آسفون، لكننا لم نعثر على الصفحة المطلوبة.\"" - -msgid "Home" -msgstr "الرئيسية" - -msgid "Server error" -msgstr "خطأ في المزود" - -msgid "Server error (500)" -msgstr "خطأ في المزود (500)" - -msgid "Server Error (500)" -msgstr "خطأ في المزود (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"كان هناك خطأ. تم إعلام المسؤولين عن الموقع عبر البريد الإلكتروني وسوف يتم " -"إصلاح الخطأ قريباً. شكراً على صبركم." - -msgid "Run the selected action" -msgstr "نفذ الإجراء المحدّد" - -msgid "Go" -msgstr "نفّذ" - -msgid "Click here to select the objects across all pages" -msgstr "اضغط هنا لتحديد جميع العناصر في جميع الصفحات" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "اختيار %(total_count)s %(module_name)s جميعها" - -msgid "Clear selection" -msgstr "إزالة الاختيار" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "النماذج في تطبيق %(name)s" - -msgid "Add" -msgstr "أضف" - -msgid "View" -msgstr "عرض" - -msgid "You don’t have permission to view or edit anything." -msgstr "ليس لديك الصلاحية لعرض أو تعديل أي شيء." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"أولاً، أدخل اسم مستخدم وكلمة مرور. ومن ثم تستطيع تعديل المزيد من خيارات " -"المستخدم." - -msgid "Enter a username and password." -msgstr "أدخل اسم مستخدم وكلمة مرور." - -msgid "Change password" -msgstr "غيّر كلمة المرور" - -msgid "Please correct the error below." -msgstr "يرجى تصحيح الخطأ أدناه." - -msgid "Please correct the errors below." -msgstr "الرجاء تصحيح الأخطاء أدناه." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "أدخل كلمة مرور جديدة للمستخدم %(username)s." - -msgid "Welcome," -msgstr "أهلا، " - -msgid "View site" -msgstr "عرض الموقع" - -msgid "Documentation" -msgstr "الوثائق" - -msgid "Log out" -msgstr "اخرج" - -#, python-format -msgid "Add %(name)s" -msgstr "أضف %(name)s" - -msgid "History" -msgstr "تاريخ" - -msgid "View on site" -msgstr "مشاهدة على الموقع" - -msgid "Filter" -msgstr "مرشّح" - -msgid "Clear all filters" -msgstr "مسح جميع المرشحات" - -msgid "Remove from sorting" -msgstr "إزالة من الترتيب" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "أولوية الترتيب: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "عكس الترتيب" - -msgid "Delete" -msgstr "احذف" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"حذف العنصر %(object_name)s '%(escaped_object)s' سيتسبب بحذف العناصر المرتبطة " -"به، إلا أنك لا تملك صلاحية حذف العناصر التالية:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"حذف %(object_name)s '%(escaped_object)s' سيتسبب أيضاً بحذف العناصر المرتبطة، " -"إلا أن حسابك ليس لديه صلاحية حذف أنواع العناصر التالية:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"متأكد أنك تريد حذف العنصر %(object_name)s \\\"%(escaped_object)s\\\"؟ سيتم " -"حذف جميع العناصر التالية المرتبطة به:" - -msgid "Objects" -msgstr "عناصر" - -msgid "Yes, I’m sure" -msgstr "نعم، أنا متأكد" - -msgid "No, take me back" -msgstr "لا, تراجع للخلف" - -msgid "Delete multiple objects" -msgstr "حذف عدّة عناصر" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"حذف عناصر %(objects_name)s المُحدّدة سيتسبب بحذف العناصر المرتبطة، إلا أن " -"حسابك ليس له صلاحية حذف أنواع العناصر التالية:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"حذف عناصر %(objects_name)s المحدّدة قد يتطلب حذف العناصر المحميّة المرتبطة " -"التالية:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"أأنت متأكد أنك تريد حذف عناصر %(objects_name)s المحددة؟ جميع العناصر التالية " -"والعناصر المرتبطة بها سيتم حذفها:" - -msgid "Delete?" -msgstr "احذفه؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr " حسب %(filter_title)s " - -msgid "Summary" -msgstr "ملخص" - -msgid "Recent actions" -msgstr "آخر الإجراءات" - -msgid "My actions" -msgstr "إجراءاتي" - -msgid "None available" -msgstr "لا يوجد" - -msgid "Unknown content" -msgstr "مُحتوى مجهول" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"هنالك أمر خاطئ في تركيب قاعدة بياناتك، تأكد من أنه تم انشاء جداول قاعدة " -"البيانات الملائمة، وأن قاعدة البيانات قابلة للقراءة من قبل المستخدم الملائم." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"أنت مسجل الدخول بإسم المستخدم %(username)s, ولكنك غير مخول للوصول لهذه " -"الصفحة. هل ترغب بتسجيل الدخول بحساب آخر؟" - -msgid "Forgotten your password or username?" -msgstr "نسيت كلمة المرور أو اسم المستخدم الخاص بك؟" - -msgid "Toggle navigation" -msgstr "تغيير التنقل" - -msgid "Start typing to filter…" -msgstr "ابدأ بالكتابة لبدء التصفية(الفلترة)..." - -msgid "Filter navigation items" -msgstr "تصفية عناصر التنقل" - -msgid "Date/time" -msgstr "التاريخ/الوقت" - -msgid "User" -msgstr "المستخدم" - -msgid "Action" -msgstr "إجراء" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"ليس لهذا العنصر سجلّ تغييرات، على الأغلب أنه لم يُنشأ من خلال نظام إدارة " -"الموقع." - -msgid "Show all" -msgstr "أظهر الكل" - -msgid "Save" -msgstr "احفظ" - -msgid "Popup closing…" -msgstr "إغلاق المنبثقة ..." - -msgid "Search" -msgstr "ابحث" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s نتيجة" -msgstr[1] "%(counter)s نتيجة" -msgstr[2] "%(counter)s نتيجة" -msgstr[3] "%(counter)s نتائج" -msgstr[4] "%(counter)s نتيجة" -msgstr[5] "%(counter)s نتيجة" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "المجموع %(full_result_count)s" - -msgid "Save as new" -msgstr "احفظ كجديد" - -msgid "Save and add another" -msgstr "احفظ وأضف آخر" - -msgid "Save and continue editing" -msgstr "احفظ واستمر بالتعديل" - -msgid "Save and view" -msgstr "احفظ ثم اعرض" - -msgid "Close" -msgstr "أغلق" - -#, python-format -msgid "Change selected %(model)s" -msgstr "تغيير %(model)s المختارة" - -#, python-format -msgid "Add another %(model)s" -msgstr "أضف %(model)s آخر" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "حذف %(model)s المختارة" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "شكرا لأخذك بعض الوقت في الموقع اليوم." - -msgid "Log in again" -msgstr "ادخل مجدداً" - -msgid "Password change" -msgstr "غيّر كلمة مرورك" - -msgid "Your password was changed." -msgstr "تمّ تغيير كلمة مرورك." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"رجاءً أدخل كلمة مرورك القديمة، للأمان، ثم أدخل كلمة مرور الجديدة مرتين كي " -"تتأكّد من كتابتها بشكل صحيح." - -msgid "Change my password" -msgstr "غيّر كلمة مروري" - -msgid "Password reset" -msgstr "استعادة كلمة المرور" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "تم تعيين كلمة مرورك. يمكن الاستمرار وتسجيل دخولك الآن." - -msgid "Password reset confirmation" -msgstr "تأكيد استعادة كلمة المرور" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "رجاءً أدخل كلمة مرورك الجديدة مرتين كي تتأكّد من كتابتها بشكل صحيح." - -msgid "New password:" -msgstr "كلمة المرور الجديدة:" - -msgid "Confirm password:" -msgstr "أكّد كلمة المرور:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"رابط استعادة كلمة المرور غير صحيح، ربما لأنه استُخدم من قبل. رجاءً اطلب " -"استعادة كلمة المرور مرة أخرى." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"تم إرسال بريد إلكتروني بالتعليمات لضبط كلمة المرور الخاصة بك, في حال تواجد " -"حساب بنفس البريد الإلكتروني الذي ادخلته. سوف تستقبل البريد الإلكتروني قريباً" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"في حال عدم إستقبال البريد الإلكتروني، الرجاء التأكد من إدخال عنوان بريدك " -"الإلكتروني بشكل صحيح ومراجعة مجلد الرسائل غير المرغوب فيها." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"لقد قمت بتلقى هذه الرسالة لطلبك بإعادة تعين كلمة المرور لحسابك الشخصي على " -"%(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "رجاءً اذهب إلى الصفحة التالية واختر كلمة مرور جديدة:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "اسم المستخدم الخاص بك، في حال كنت قد نسيته:" - -msgid "Thanks for using our site!" -msgstr "شكراً لاستخدامك موقعنا!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "فريق %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"هل فقدت كلمة المرور؟ أدخل عنوان بريدك الإلكتروني أدناه وسوف نقوم بإرسال " -"تعليمات للحصول على كلمة مرور جديدة." - -msgid "Email address:" -msgstr "عنوان البريد الإلكتروني:" - -msgid "Reset my password" -msgstr "استعد كلمة مروري" - -msgid "All dates" -msgstr "كافة التواريخ" - -#, python-format -msgid "Select %s" -msgstr "اختر %s" - -#, python-format -msgid "Select %s to change" -msgstr "اختر %s لتغييره" - -#, python-format -msgid "Select %s to view" -msgstr "حدد %s للعرض" - -msgid "Date:" -msgstr "التاريخ:" - -msgid "Time:" -msgstr "الوقت:" - -msgid "Lookup" -msgstr "ابحث" - -msgid "Currently:" -msgstr "حالياً:" - -msgid "Change:" -msgstr "تغيير:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 6b419f0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po deleted file mode 100644 index 9e8a4ad..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,280 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jihad Bahmaid Al-Halki, 2022 -# Riterix , 2019-2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:26-0500\n" -"PO-Revision-Date: 2022-07-25 07:59+0000\n" -"Last-Translator: Jihad Bahmaid Al-Halki\n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s المتوفرة" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"هذه قائمة %s المتوفرة. يمكنك اختيار بعضها بانتقائها في الصندوق أدناه ثم " -"الضغط على سهم الـ\\\"اختيار\\\" بين الصندوقين." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "اكتب في هذا الصندوق لتصفية قائمة %s المتوفرة." - -msgid "Filter" -msgstr "انتقاء" - -msgid "Choose all" -msgstr "اختر الكل" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "اضغط لاختيار جميع %s جملة واحدة." - -msgid "Choose" -msgstr "اختيار" - -msgid "Remove" -msgstr "احذف" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s المختارة" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"هذه قائمة %s المحددة. يمكنك إزالة بعضها باختيارها في الصندوق أدناه ثم اضغط " -"على سهم الـ\\\"إزالة\\\" بين الصندوقين." - -msgid "Remove all" -msgstr "إزالة الكل" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "اضغط لإزالة جميع %s المحددة جملة واحدة." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "لا شي محدد" -msgstr[1] "%(sel)s من %(cnt)s محدد" -msgstr[2] "%(sel)s من %(cnt)s محدد" -msgstr[3] "%(sel)s من %(cnt)s محددة" -msgstr[4] "%(sel)s من %(cnt)s محدد" -msgstr[5] "%(sel)s من %(cnt)s محدد" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"لديك تعديلات غير محفوظة على بعض الحقول القابلة للتعديل. إن نفذت أي إجراء " -"فسوف تخسر تعديلاتك." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"اخترت إجراءً لكن دون أن تحفظ تغييرات التي قمت بها. رجاء اضغط زر الموافقة " -"لتحفظ تعديلاتك. ستحتاج إلى إعادة تنفيذ الإجراء." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "اخترت إجراءً دون تغيير أي حقل. لعلك تريد زر التنفيذ بدلاً من زر الحفظ." - -msgid "Now" -msgstr "الآن" - -msgid "Midnight" -msgstr "منتصف الليل" - -msgid "6 a.m." -msgstr "6 ص." - -msgid "Noon" -msgstr "الظهر" - -msgid "6 p.m." -msgstr "6 مساء" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[1] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[2] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[3] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[4] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[5] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[1] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[2] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[3] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[4] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[5] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." - -msgid "Choose a Time" -msgstr "إختر وقت " - -msgid "Choose a time" -msgstr "إختر وقت " - -msgid "Cancel" -msgstr "ألغ" - -msgid "Today" -msgstr "اليوم" - -msgid "Choose a Date" -msgstr "إختر تاريخ " - -msgid "Yesterday" -msgstr "أمس" - -msgid "Tomorrow" -msgstr "غداً" - -msgid "January" -msgstr "جانفي" - -msgid "February" -msgstr "فيفري" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "أفريل" - -msgid "May" -msgstr "ماي" - -msgid "June" -msgstr "جوان" - -msgid "July" -msgstr "جويليه" - -msgid "August" -msgstr "أوت" - -msgid "September" -msgstr "سبتمبر" - -msgid "October" -msgstr "أكتوبر" - -msgid "November" -msgstr "نوفمبر" - -msgid "December" -msgstr "ديسمبر" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "يناير" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "فبراير" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "مارس" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "أبريل" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "مايو" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "يونيو" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "يوليو" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "أغسطس" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "سبتمبر" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "أكتوبر" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "نوفمبر" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "ديسمبر" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "ح" - -msgctxt "one letter Monday" -msgid "M" -msgstr "ن" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "ث" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "ع" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "خ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "ج" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "س" - -msgid "" -"You have already submitted this form. Are you sure you want to submit it " -"again?" -msgstr "" - -msgid "Show" -msgstr "أظهر" - -msgid "Hide" -msgstr "اخف" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index e35811b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index 437b080..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,636 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 19:51+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "desanciáu con ésitu %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nun pue desaniciase %(name)s" - -msgid "Are you sure?" -msgstr "¿De xuru?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Too" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "Non" - -msgid "Unknown" -msgstr "Desconocíu" - -msgid "Any date" -msgstr "Cualaquier data" - -msgid "Today" -msgstr "Güei" - -msgid "Past 7 days" -msgstr "" - -msgid "This month" -msgstr "Esti mes" - -msgid "This year" -msgstr "Esi añu" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Aición:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "" - -msgid "action time" -msgstr "" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Amestáu \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Los oxetos tienen d'usase pa faer aiciones con ellos. Nun se camudó dengún " -"oxetu." - -msgid "No action selected." -msgstr "Nun s'esbilló denguna aición." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Amestar %s" - -#, python-format -msgid "Change %s" -msgstr "" - -msgid "Database error" -msgstr "" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Esbillaos 0 de %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "Aniciar sesión" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Nun s'alcontró la páxina" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Sentímoslo, pero nun s'alcuentra la páxina solicitada." - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Hebo un erru. Repotóse al sitiu d'alministradores per corréu y debería " -"d'iguase en pocu tiempu. Gracies pola to paciencia." - -msgid "Run the selected action" -msgstr "Executar l'aición esbillada" - -msgid "Go" -msgstr "Dir" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Esbillar too %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Llimpiar esbilla" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "Bienllegáu/ada," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "" - -#, python-format -msgid "Select %s" -msgstr "" - -#, python-format -msgid "Select %s to change" -msgstr "" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "Anguaño:" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7b7e49b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po deleted file mode 100644 index 53705c7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,211 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-20 02:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Disponible %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Filtrar" - -msgid "Choose all" -msgstr "Escoyer too" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Primi pa escoyer too %s d'una vegada" - -msgid "Choose" -msgstr "Escoyer" - -msgid "Remove" -msgstr "Desaniciar" - -#, javascript-format -msgid "Chosen %s" -msgstr "Escoyíu %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "Desaniciar too" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Primi pa desaniciar tolo escoyío %s d'una vegada" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s esbilláu" -msgstr[1] "%(sel)s de %(cnt)s esbillaos" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Esbillesti una aición, pero entá nun guardesti les tos camudancies nos " -"campos individuales. Por favor, primi Aceutar pa guardar. Necesitarás " -"executar de nueves la aición" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Esbillesti una aición, y nun fixesti camudancia dala nos campos " -"individuales. Quiciabes teas guetando'l botón Dir en cuantes del botón " -"Guardar." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Agora" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Escueyi una hora" - -msgid "Midnight" -msgstr "Media nueche" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "Meudía" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Encaboxar" - -msgid "Today" -msgstr "Güei" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Ayeri" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Amosar" - -msgid "Hide" -msgstr "Anubrir" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 3ab72cd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index 932adb3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,793 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Emin Mastizada , 2018,2020 -# Emin Mastizada , 2016 -# Konul Allahverdiyeva , 2016 -# Nicat Məmmədov , 2022 -# Nijat Mammadov, 2024-2025 -# Sevdimali , 2024 -# Zulfugar Ismayilzadeh , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Nijat Mammadov, 2024-2025\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Seçilmiş \"%(verbose_name_plural)s\"ləri/ları sil" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s uğurla silindi." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s silinə bilməz" - -msgid "Delete multiple objects" -msgstr "Birdən çox obyekt sil" - -msgid "Administration" -msgstr "Administrasiya" - -msgid "All" -msgstr "Hamısı" - -msgid "Yes" -msgstr "Hə" - -msgid "No" -msgstr "Yox" - -msgid "Unknown" -msgstr "Naməlum" - -msgid "Any date" -msgstr "İstənilən tarix" - -msgid "Today" -msgstr "Bu gün" - -msgid "Past 7 days" -msgstr "Son 7 gündə" - -msgid "This month" -msgstr "Bu ay" - -msgid "This year" -msgstr "Bu il" - -msgid "No date" -msgstr "Tarixi yoxdur" - -msgid "Has date" -msgstr "Tarixi mövcuddur" - -msgid "Empty" -msgstr "Boş" - -msgid "Not empty" -msgstr "Boş deyil" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Lütfən, istifadəçi hesabı üçün doğru %(username)s və şifrə daxil edin. " -"Nəzərə alın ki, hər iki xana böyük-kiçik hərflərə həssasdırlar." - -msgid "Action:" -msgstr "Əməliyyat:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Daha bir %(verbose_name)s əlavə et" - -msgid "Remove" -msgstr "Yığışdırılma" - -msgid "Addition" -msgstr "Əlavə olunma" - -msgid "Change" -msgstr "Dəyişiklik" - -msgid "Deletion" -msgstr "Silinmə" - -msgid "action time" -msgstr "əməliyyat vaxtı" - -msgid "user" -msgstr "istifadəçi" - -msgid "content type" -msgstr "məzmun növü" - -msgid "object id" -msgstr "obyekt id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "obyekt repr" - -msgid "action flag" -msgstr "əməliyyat bayrağı" - -msgid "change message" -msgstr "dəyişmə mesajı" - -msgid "log entry" -msgstr "loq yazısı" - -msgid "log entries" -msgstr "loq yazıları" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” əlavə edildi." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” dəyişdirildi — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s” silindi." - -msgid "LogEntry Object" -msgstr "LogEntry obyekti" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” əlavə edildi." - -msgid "Added." -msgstr "Əlavə edildi." - -msgid "and" -msgstr "və" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” üçün {fields} dəyişdirildi." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} dəyişdirildi." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” silindi." - -msgid "No fields changed." -msgstr "Heç bir sahə dəyişdirilmədi." - -msgid "None" -msgstr "Heç biri" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Birdən çox seçmək üçün “Control” və ya Mac üçün “Command” düyməsini basılı " -"tutun." - -msgid "Select this object for an action - {}" -msgstr "Əməliyyat üçün bu obyekti seçin - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” uğurla əlavə edildi." - -msgid "You may edit it again below." -msgstr "Bunu aşağıda təkrar redaktə edə bilərsiz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” uğurla əlavə edildi. Aşağıdan başqa bir {name} əlavə edə " -"bilərsiz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” uğurla dəyişdirildi. Təkrar aşağıdan dəyişdirə bilərsiz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” uğurla dəyişdirildi. Aşağıdan başqa bir {name} əlavə edə " -"bilərsiz." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” uğurla dəyişdirildi." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Elementlər üzərində əməliyyat aparmaq üçün, siz onları seçməlisiniz. Heç bir " -"element dəyişmədi." - -msgid "No action selected." -msgstr "Heç bir əməliyyat seçilmədi." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” uğurla silindi." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "“%(key)s” ID nömrəli %(name)s mövcud deyil. Bəlkə silinib?" - -#, python-format -msgid "Add %s" -msgstr "%s əlavə et" - -#, python-format -msgid "Change %s" -msgstr "%s obyektini dəyiş" - -#, python-format -msgid "View %s" -msgstr "%s obyektinə bax" - -msgid "Database error" -msgstr "Verilənlər bazası xətası" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s uğurlu dəyişdirildi." -msgstr[1] "%(count)s %(name)s uğurla dəyişdirildi." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seçili" -msgstr[1] "Bütün %(total_count)s seçildi" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s-dan/dən 0 seçilib" - -msgid "Delete" -msgstr "Sil" - -#, python-format -msgid "Change history: %s" -msgstr "Dəyişmə tarixi: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s silinməsi %(related_objects)s obyektlərinin də " -"silinməsinə gətirib çıxaracaq" - -msgid "Django site admin" -msgstr "Django sayt administratoru" - -msgid "Django administration" -msgstr "Django administrasiya" - -msgid "Site administration" -msgstr "Sayt administrasiyası" - -msgid "Log in" -msgstr "Daxil ol" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administrasiyası" - -msgid "Page not found" -msgstr "Səhifə tapılmadı" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Üzr istəyirik, amma sorğulanan səhifə tapılmadı." - -msgid "Home" -msgstr "Ana səhifə" - -msgid "Server error" -msgstr "Server xətası" - -msgid "Server error (500)" -msgstr "Server xətası (500)" - -msgid "Server Error (500)" -msgstr "Serverdə xəta (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Xəta baş verdi. Problem sayt administratorlarına e-poçt vasitəsi ilə " -"bildirildi və qısa bir zamanda həll olunacaq. Anlayışınız üçün təşəkkür " -"edirik." - -msgid "Run the selected action" -msgstr "Seçilən əməliyyatı yerinə yetir" - -msgid "Go" -msgstr "İrəli" - -msgid "Click here to select the objects across all pages" -msgstr "Bütün səhifələr üzrə obyektləri seçmək üçün bura klikləyin" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Hamısını seç (%(total_count)s %(module_name)s)" - -msgid "Clear selection" -msgstr "Seçimi təmizlə" - -msgid "Breadcrumbs" -msgstr "Menyu sətri" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s tətbiqetməsindəki modellər" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Əlavə et" - -msgid "View" -msgstr "Bax" - -msgid "You don’t have permission to view or edit anything." -msgstr "Heç nəyə baxmağa və ya dəyişməyə icazəniz yoxdur." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Şifrəni dəyiş" - -msgid "Set password" -msgstr "Şifrə təyin et" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Lütfən, aşağıdakı xətanı düzəldin." -msgstr[1] "Lütfən, aşağıdakı xətaları düzəldin." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s istifadəçisi üçün yeni şifrə daxil edin." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Bu əməliyyat bu istifadəçi üçün şifrə əsaslı autentifikasiyanı aktiv " -"edəcək." - -msgid "Disable password-based authentication" -msgstr "Şifrə əsaslı autentifikasiyanı ləğv elə." - -msgid "Enable password-based authentication" -msgstr "Şifrə əsaslı autentifikasiyanı aktivləşdir." - -msgid "Skip to main content" -msgstr "Əsas məzmuna keç" - -msgid "Welcome," -msgstr "Xoş gördük," - -msgid "View site" -msgstr "Sayta bax" - -msgid "Documentation" -msgstr "Dokumentasiya" - -msgid "Log out" -msgstr "Çıx" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s əlavə et" - -msgid "History" -msgstr "Tarix" - -msgid "View on site" -msgstr "Saytda bax" - -msgid "Filter" -msgstr "Süzgəc" - -msgid "Hide counts" -msgstr "Sayı gizlət" - -msgid "Show counts" -msgstr "Sayı göstər" - -msgid "Clear all filters" -msgstr "Bütün filterləri təmizlə" - -msgid "Remove from sorting" -msgstr "Sıralamadan çıxar" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sıralama prioriteti: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sıralamanı çevir" - -msgid "Toggle theme (current theme: auto)" -msgstr "Görünüşü dəyiş (halhazırkı: avtomatik)" - -msgid "Toggle theme (current theme: light)" -msgstr "Görünüşü dəyiş (halhazırkı: aydın)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Görünüşü dəyiş (halhazırkı: qaranlıq)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" obyektini sildikdə onun bağlı olduğu " -"obyektlər də silinməlidir. Ancaq sizin hesabın aşağıdakı tip obyektləri " -"silməyə səlahiyyəti çatmır:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" obyektini silmək üçün aşağıdakı " -"qorunan obyektlər də silinməlidir:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" obyektini silməkdə əminsiniz? Ona " -"bağlı olan aşağıdakı obyektlər də silinəcək:" - -msgid "Objects" -msgstr "Obyektlər" - -msgid "Yes, I’m sure" -msgstr "Bəli, əminəm" - -msgid "No, take me back" -msgstr "Xeyr, geri qayıt" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"%(objects_name)s obyektini silmək üçün ona bağlı obyektlər də silinməlidir. " -"Ancaq sizin hesabınızın aşağıdakı tip obyektləri silmək səlahiyyətinə malik " -"deyil:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s obyektini silmək üçün aşağıdakı qorunan obyektlər də " -"silinməlidir:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Seçdiyiniz %(objects_name)s obyektini silməkdə əminsiniz? Aşağıdakı bütün " -"obyektlər və ona bağlı digər obyektlər də silinəcək:" - -msgid "Delete?" -msgstr "Silinsin?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "\"%(filter_title)s\" filtrına görə " - -msgid "Summary" -msgstr "İcmal" - -msgid "Recent actions" -msgstr "Son əməliyyatlar" - -msgid "My actions" -msgstr "Mənim əməliyyatlarım" - -msgid "None available" -msgstr "Heç nə yoxdur" - -msgid "Added:" -msgstr "Əlavə olunub:" - -msgid "Changed:" -msgstr "Dəyişdirilib:" - -msgid "Deleted:" -msgstr "Silinib:" - -msgid "Unknown content" -msgstr "Naməlum məzmun" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Verilənlər bazanızın quraşdırılması ilə bağlı problem var. Müvafiq " -"cədvəllərinin yaradıldığından və verilənlər bazasının müvafiq istifadəçi " -"tərəfindən oxuna biləcəyindən əmin olun." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"%(username)s olaraq daxil olmusunuz, amma bu səhifəyə icazəniz yoxdur. Başqa " -"bir hesaba daxil olmaq istərdiniz?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Naviqasiyanı dəyiş" - -msgid "Sidebar" -msgstr "Yan panel" - -msgid "Start typing to filter…" -msgstr "Filterləmək üçün yazın..." - -msgid "Filter navigation items" -msgstr "Naviqasiya elementlərini filterlə" - -msgid "Date/time" -msgstr "Tarix/vaxt" - -msgid "User" -msgstr "İstifadəçi" - -msgid "Action" -msgstr "Əməliyyat" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "daxiletmə" -msgstr[1] "daxiletmələr" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Bu obyektin dəyişiklik tarixçəsi yoxdur. Yəqin ki, bu admin saytı vasitəsilə " -"əlavə olunmayıb." - -msgid "Show all" -msgstr "Hamısını göstər" - -msgid "Save" -msgstr "Yadda saxla" - -msgid "Popup closing…" -msgstr "Qəfil pəncərə qapadılır…" - -msgid "Search" -msgstr "Axtar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s nəticə" -msgstr[1] "%(counter)s nəticə" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Hamısı birlikdə %(full_result_count)s" - -msgid "Save as new" -msgstr "Yenisi kimi yadda saxla" - -msgid "Save and add another" -msgstr "Yadda saxla və yenisini əlavə et" - -msgid "Save and continue editing" -msgstr "Yadda saxla və redaktəyə davam et" - -msgid "Save and view" -msgstr "Yadda saxla və bax" - -msgid "Close" -msgstr "Bağla" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Seçilmiş %(model)s dəyişdir" - -#, python-format -msgid "Add another %(model)s" -msgstr "Başqa %(model)s əlavə et" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Seçilmiş %(model)s sil" - -#, python-format -msgid "View selected %(model)s" -msgstr "Bax: seçilmiş %(model)s " - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Bu gün veb saytla keyfiyyətli vaxt keçirdiyiniz üçün təşəkkür edirik." - -msgid "Log in again" -msgstr "Yenidən daxil ol" - -msgid "Password change" -msgstr "Şifrəni dəyişmək" - -msgid "Your password was changed." -msgstr "Sizin şifrəniz dəyişdirildi." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Zəhmət olmasa təhlükəsizlik naminə köhnə şifrənizi daxil edin və sonra yeni " -"şifrənizi iki dəfə daxil edin ki, düzgün daxil yazdığınızı yoxlaya bilək." - -msgid "Change my password" -msgstr "Şifrəmi dəyiş" - -msgid "Password reset" -msgstr "Şifrənin sıfırlanması" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Yeni şifrə artıq qüvvədədir. Yenidən daxil ola bilərsiniz." - -msgid "Password reset confirmation" -msgstr "Şifrə sıfırlanmasının təsdiqi" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Yeni şifrəni iki dəfə daxil edin ki, səhv etmədiyinizə əmin olaq." - -msgid "New password:" -msgstr "Yeni şifrə:" - -msgid "Confirm password:" -msgstr "Yeni şifrə (bir daha):" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Şifrənin sıfırlanması üçün olan keçid, yəqin ki, artıq istifadə olunub. " -"Şifrəni sıfırlamaq üçün yenə müraciət edin." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Şifrəni təyin etmək üçün lazım olan addımlar sizə göndərildi (əgər bu e-poçt " -"ünvanı ilə hesab varsa təbii ki). Elektron məktub qısa bir müddət ərzində " -"sizə çatacaq." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"E-poçt gəlməsə, qeydiyyatdan keçdiyiniz e-poçt ünvanını doğru daxil " -"etdiyinizə əmin olun və spam qovluğunuzu yoxlayın." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"%(site_name)s saytında şifrəni yeniləmək istədiyinizə görə bu məktubu " -"göndərdik." - -msgid "Please go to the following page and choose a new password:" -msgstr "Növbəti səhifəyə keçid alın və yeni şifrəni seçin:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Bizim saytdan istifadə etdiyiniz üçün təşəkkür edirik!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s komandası" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Şifrəni unutmusuz? Epoçt ünvanınızı daxil edin və biz sizə yeni şifrə təyin " -"etmək üçün nə etmək lazım olduğunu göndərəcəyik." - -msgid "Email address:" -msgstr "E-poçt:" - -msgid "Reset my password" -msgstr "Şifrəmi sıfırla" - -msgid "Select all objects on this page for an action" -msgstr "Əməliyyat üçün bu səhifədəki bütün obyektləri seçin" - -msgid "All dates" -msgstr "Bütün tarixlərdə" - -#, python-format -msgid "Select %s" -msgstr "%s seç" - -#, python-format -msgid "Select %s to change" -msgstr "%s dəyişmək üçün seç" - -#, python-format -msgid "Select %s to view" -msgstr "Görmək üçün %s seçin" - -msgid "Date:" -msgstr "Tarix:" - -msgid "Time:" -msgstr "Vaxt:" - -msgid "Lookup" -msgstr "Sorğu" - -msgid "Currently:" -msgstr "Hazırda:" - -msgid "Change:" -msgstr "Dəyişdir:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0fd084a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po deleted file mode 100644 index 574497a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,314 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Ismayilov , 2011-2012 -# Emin Mastizada , 2016,2020 -# Emin Mastizada , 2016 -# Nicat Məmmədov , 2022 -# Nijat Mammadov, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Nijat Mammadov, 2024\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Mövcud %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Bu xanaya yazmaqla mövcud %s siyahısını filtrləyə bilərsiniz." - -msgid "Filter" -msgstr "Süzgəc" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Seçilmiş %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Seçilmiş %s siyahısını filtrləmək üçün bu xanaya yazın" - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s seçilmiş seçim görünmür" -msgstr[1] "%s seçilmiş seçimlər görünmür" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s / %(cnt)s seçilib" -msgstr[1] "%(cnt)s-dan/dən %(sel)s ədədi seçilib" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Fərdi düzəliş oluna bilən xanalarda yadda saxlanılmamış dəyişiklikləriniz " -"var. Əgər əməliyyatı icra etsəniz, dəyişikliklər əldən gedəcək." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Əməliyyat seçmisiniz, amma fərdi xanalardakı dəyişiklikləriniz hələ də yadda " -"saxlanılmayıb. Saxlamaq üçün lütfən Tamam düyməsinə klikləyin. Əməliyyatı " -"təkrar icra etməli olacaqsınız." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Əməliyyat seçmisiniz və fərdi xanalarda heç bir dəyişiklik etməmisiniz. " -"Böyük ehtimal Saxla düyməsi yerinə İrəli düyməsinə ehtiyyacınız var." - -msgid "Now" -msgstr "İndi" - -msgid "Midnight" -msgstr "Gecə yarısı" - -msgid "6 a.m." -msgstr "Səhər 6" - -msgid "Noon" -msgstr "Günorta" - -msgid "6 p.m." -msgstr "Axşam 6" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Diqqət: Server vaxtından %s saat irəlidəsiniz." -msgstr[1] "Qeyd: Server vaxtından %s saat irəlidəsiniz." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Diqqət: Server vaxtından %s saat geridəsiniz." -msgstr[1] "Qeyd: Server vaxtından %s saat geridəsiniz." - -msgid "Choose a Time" -msgstr "Vaxt Seçin" - -msgid "Choose a time" -msgstr "Vaxtı seçin" - -msgid "Cancel" -msgstr "İmtina" - -msgid "Today" -msgstr "Bu gün" - -msgid "Choose a Date" -msgstr "Tarix Seçin" - -msgid "Yesterday" -msgstr "Dünən" - -msgid "Tomorrow" -msgstr "Sabah" - -msgid "January" -msgstr "Yanvar" - -msgid "February" -msgstr "Fevral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Aprel" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "İyun" - -msgid "July" -msgstr "İyul" - -msgid "August" -msgstr "Avqust" - -msgid "September" -msgstr "Sentyabr" - -msgid "October" -msgstr "Oktyabr" - -msgid "November" -msgstr "Noyabr" - -msgid "December" -msgstr "Dekabr" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Yan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Fev" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "İyn" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "İyl" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Avq" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sen" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Noy" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dek" - -msgid "Sunday" -msgstr "Bazar" - -msgid "Monday" -msgstr "Bazar ertəsi" - -msgid "Tuesday" -msgstr "Çərşənbə axşamı" - -msgid "Wednesday" -msgstr "Çərşənbə" - -msgid "Thursday" -msgstr "Cümə axşamı" - -msgid "Friday" -msgstr "Cümə" - -msgid "Saturday" -msgstr "Şənbə" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Baz" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "B.er" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Ç.ax" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Çər" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "C.ax" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Cüm" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Şən" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "B" - -msgctxt "one letter Monday" -msgid "M" -msgstr "B.e" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Ç.a" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ç" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "C.a" - -msgctxt "one letter Friday" -msgid "F" -msgstr "C" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Ş" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index f23565c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index 4904d35..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,791 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2015 -# znotdead , 2016-2017,2019-2021,2023-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: znotdead , " -"2016-2017,2019-2021,2023-2024\n" -"Language-Team: Belarusian (http://app.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Выдаліць абраныя %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Выдалілі %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Не ўдаецца выдаліць %(name)s" - -msgid "Are you sure?" -msgstr "Ці ўпэўненыя вы?" - -msgid "Administration" -msgstr "Адміністрацыя" - -msgid "All" -msgstr "Усе" - -msgid "Yes" -msgstr "Так" - -msgid "No" -msgstr "Не" - -msgid "Unknown" -msgstr "Невядома" - -msgid "Any date" -msgstr "Хоць-якая дата" - -msgid "Today" -msgstr "Сёньня" - -msgid "Past 7 days" -msgstr "Апошні тыдзень" - -msgid "This month" -msgstr "Гэты месяц" - -msgid "This year" -msgstr "Гэты год" - -msgid "No date" -msgstr "Няма даты" - -msgid "Has date" -msgstr "Мае дату" - -msgid "Empty" -msgstr "Пусты" - -msgid "Not empty" -msgstr "Не пусты" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Калі ласка, увядзіце правільны %(username)s і пароль для службовага рахунку. " -"Адзначым, што абодва палі могуць быць адчувальныя да рэгістра." - -msgid "Action:" -msgstr "Дзеяньне:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Дадаць яшчэ %(verbose_name)s" - -msgid "Remove" -msgstr "Прыбраць" - -msgid "Addition" -msgstr "Дапаўненьне" - -msgid "Change" -msgstr "Зьмяніць" - -msgid "Deletion" -msgstr "Выдалленне" - -msgid "action time" -msgstr "час дзеяньня" - -msgid "user" -msgstr "карыстальнік" - -msgid "content type" -msgstr "від змесціва" - -msgid "object id" -msgstr "нумар аб’екта" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "прадстаўленьне аб’екта" - -msgid "action flag" -msgstr "від дзеяньня" - -msgid "change message" -msgstr "паведамленьне пра зьмену" - -msgid "log entry" -msgstr "запіс у справаздачы" - -msgid "log entries" -msgstr "запісы ў справаздачы" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Дадалі “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Зьмянілі «%(object)s» — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Выдалілі «%(object)s»." - -msgid "LogEntry Object" -msgstr "Запіс у справаздачы" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Дадалі {name} “{object}”." - -msgid "Added." -msgstr "Дадалі." - -msgid "and" -msgstr "і" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Змянілі {fields} для {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Зьмянілі {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Выдалілі {name} “{object}”." - -msgid "No fields changed." -msgstr "Палі не зьмяняліся." - -msgid "None" -msgstr "Няма" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Утрымлівайце націснутай кнопку“Control”, або “Command” на Mac, каб вылучыць " -"больш за адзін." - -msgid "Select this object for an action - {}" -msgstr "Абярыце гэты аб'ект для дзеяньня - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Пасьпяхова дадалі {name} “{obj}”." - -msgid "You may edit it again below." -msgstr "Вы можаце зноўку правіць гэта ніжэй." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "Пасьпяхова дадалі {name} \"{obj}\". Ніжэй можна дадаць іншы {name}." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "Пасьпяхова зьмянілі {name} \"{obj}\". Ніжэй яго можна зноўку правіць." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "Пасьпяхова зьмянілі {name} \"{obj}\". Ніжэй можна дадаць іншы {name}." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Пасьпяхова зьмянілі {name} \"{obj}\"." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Каб нешта рабіць, трэба спачатку абраць, з чым гэта рабіць. Нічога не " -"зьмянілася." - -msgid "No action selected." -msgstr "Не абралі дзеяньняў." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Пасьпяхова выдалілі %(name)s «%(obj)s»." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s з ID \"%(key)s\" не існуе. Магчыма гэта было выдалена раней?" - -#, python-format -msgid "Add %s" -msgstr "Дадаць %s" - -#, python-format -msgid "Change %s" -msgstr "Зьмяніць %s" - -#, python-format -msgid "View %s" -msgstr "Праглядзець %s" - -msgid "Database error" -msgstr "База зьвестак дала хібу" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Зьмянілі %(count)s %(name)s." -msgstr[1] "Зьмянілі %(count)s %(name)s." -msgstr[2] "Зьмянілі %(count)s %(name)s." -msgstr[3] "Зьмянілі %(count)s %(name)s." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Абралі %(total_count)s" -msgstr[1] "Абралі ўсе %(total_count)s" -msgstr[2] "Абралі ўсе %(total_count)s" -msgstr[3] "Абралі ўсе %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Абралі 0 аб’ектаў з %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Гісторыя зьменаў: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Каб выдаліць %(class_name)s %(instance)s, трэба выдаліць і зьвязаныя " -"абароненыя аб’екты: %(related_objects)s" - -msgid "Django site admin" -msgstr "Кіраўнічая пляцоўка «Джэнґа»" - -msgid "Django administration" -msgstr "Кіраваць «Джэнґаю»" - -msgid "Site administration" -msgstr "Кіраваць пляцоўкаю" - -msgid "Log in" -msgstr "Увайсьці" - -#, python-format -msgid "%(app)s administration" -msgstr "Адміністрацыя %(app)s" - -msgid "Page not found" -msgstr "Бачыну не знайшлі" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "На жаль, запытаную бачыну немагчыма знайсьці." - -msgid "Home" -msgstr "Пачатак" - -msgid "Server error" -msgstr "Паслужнік даў хібу" - -msgid "Server error (500)" -msgstr "Паслужнік даў хібу (памылка 500)" - -msgid "Server Error (500)" -msgstr "Паслужнік даў хібу (памылка 500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Адбылася памылка. Паведамленне пра памылку было адаслана адміністратарам " -"сайту па электроннай пошце і яна павінна быць выпраўлена ў бліжэйшы час. " -"Дзякуй за ваша цярпенне." - -msgid "Run the selected action" -msgstr "Выканаць абранае дзеяньне" - -msgid "Go" -msgstr "Выканаць" - -msgid "Click here to select the objects across all pages" -msgstr "Каб абраць аб’екты на ўсіх бачынах, націсьніце сюды" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Абраць усе %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Не абіраць нічога" - -msgid "Breadcrumbs" -msgstr "Навігацыйны ланцужок" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Мадэлі ў %(name)s праграме" - -msgid "Add" -msgstr "Дадаць" - -msgid "View" -msgstr "Праглядзець" - -msgid "You don’t have permission to view or edit anything." -msgstr "Вы ня маеце дазволу праглядаць ці нешта зьмяняць." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Спачатку пазначце імя карыстальніка ды пароль. Потым можна будзе наставіць " -"іншыя можнасьці." - -msgid "Enter a username and password." -msgstr "Пазначце імя карыстальніка ды пароль." - -msgid "Change password" -msgstr "Зьмяніць пароль" - -msgid "Set password" -msgstr "Усталяваць пароль" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Калі ласка, выпраўце памылкy, адзначаную ніжэй." -msgstr[1] "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." -msgstr[2] "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." -msgstr[3] "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Пазначце пароль для карыстальніка «%(username)s»." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Гэта дзеянне ўключыць аўтэнтыфікацыю на аснове пароля для " -"гэтага карыстальніка." - -msgid "Disable password-based authentication" -msgstr "Адключыць аўтэнтыфікацыю на аснове пароля" - -msgid "Enable password-based authentication" -msgstr "Уключыць аўтэнтыфікацыю на аснове пароля" - -msgid "Skip to main content" -msgstr "Перайсці да асноўнага зместу" - -msgid "Welcome," -msgstr "Вітаем," - -msgid "View site" -msgstr "Адкрыць сайт" - -msgid "Documentation" -msgstr "Дакумэнтацыя" - -msgid "Log out" -msgstr "Выйсьці" - -#, python-format -msgid "Add %(name)s" -msgstr "Дадаць %(name)s" - -msgid "History" -msgstr "Гісторыя" - -msgid "View on site" -msgstr "Зірнуць на пляцоўцы" - -msgid "Filter" -msgstr "Прасеяць" - -msgid "Hide counts" -msgstr "Схаваць падлік" - -msgid "Show counts" -msgstr "Паказаць падлік" - -msgid "Clear all filters" -msgstr "Ачысьціць усе фільтры" - -msgid "Remove from sorting" -msgstr "Прыбраць з упарадкаванага" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Парадак: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Парадкаваць наадварот" - -msgid "Toggle theme (current theme: auto)" -msgstr "Пераключыць тэму (бягучая тэма: аўтаматычная)" - -msgid "Toggle theme (current theme: light)" -msgstr "Пераключыць тэму (бягучая тэма: светлая)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Пераключыць тэму (бягучая тэма: цёмная)" - -msgid "Delete" -msgstr "Выдаліць" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Калі выдаліць %(object_name)s «%(escaped_object)s», выдаляцца зьвязаныя " -"аб’екты, але ваш рахунак ня мае дазволу выдаляць наступныя віды аб’ектаў:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Каб выдаліць %(object_name)s «%(escaped_object)s», трэба выдаліць і " -"зьвязаныя абароненыя аб’екты:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ці выдаліць %(object_name)s «%(escaped_object)s»? Усе наступныя зьвязаныя " -"складнікі выдаляцца:" - -msgid "Objects" -msgstr "Аб'екты" - -msgid "Yes, I’m sure" -msgstr "Так, я ўпэўнены" - -msgid "No, take me back" -msgstr "Не, вярнуцца назад" - -msgid "Delete multiple objects" -msgstr "Выдаліць некалькі аб’ектаў" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Калі выдаліць абранае (%(objects_name)s), выдаляцца зьвязаныя аб’екты, але " -"ваш рахунак ня мае дазволу выдаляць наступныя віды аб’ектаў:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Каб выдаліць абранае (%(objects_name)s), трэба выдаліць і зьвязаныя " -"абароненыя аб’екты:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ці выдаліць абранае (%(objects_name)s)? Усе наступныя аб’екты ды зьвязаныя " -"зь імі складнікі выдаляцца:" - -msgid "Delete?" -msgstr "Ці выдаліць?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "Рэзюмэ" - -msgid "Recent actions" -msgstr "Нядаўнія дзеянні" - -msgid "My actions" -msgstr "Мае дзеяньні" - -msgid "None available" -msgstr "Недаступнае" - -msgid "Added:" -msgstr "Дадалі:" - -msgid "Changed:" -msgstr "Зьмянілі:" - -msgid "Deleted:" -msgstr "Выдалены:" - -msgid "Unknown content" -msgstr "Невядомае зьмесьціва" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Нешта ня так з усталяванаю базаю зьвестак. Упэўніцеся, што ў базе стварылі " -"патрэбныя табліцы, і што базу можа чытаць адпаведны карыстальнік." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Вы апазнаны як %(username)s але не аўтарызаваны для доступу гэтай бачыны. Не " -"жадаеце лі вы ўвайсці пад іншым карыстальнікам?" - -msgid "Forgotten your password or username?" -msgstr "Забыліся на імя ці пароль?" - -msgid "Toggle navigation" -msgstr "Пераключыць навігацыю" - -msgid "Sidebar" -msgstr "бакавая панэль" - -msgid "Start typing to filter…" -msgstr "Пачніце ўводзіць, каб адфільтраваць..." - -msgid "Filter navigation items" -msgstr "Фільтраваць элементы навігацыі" - -msgid "Date/time" -msgstr "Час, дата" - -msgid "User" -msgstr "Карыстальнік" - -msgid "Action" -msgstr "Дзеяньне" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "запіс" -msgstr[1] "запісы" -msgstr[2] "запісы" -msgstr[3] "запісы" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Аб’ект ня мае гісторыі зьменаў. Мажліва, яго дадавалі не праз кіраўнічую " -"пляцоўку." - -msgid "Show all" -msgstr "Паказаць усё" - -msgid "Save" -msgstr "Захаваць" - -msgid "Popup closing…" -msgstr "Усплывальнае акно зачыняецца..." - -msgid "Search" -msgstr "Шукаць" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s вынік" -msgstr[1] "%(counter)s вынікі" -msgstr[2] "%(counter)s вынікаў" -msgstr[3] "%(counter)s вынікаў" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Разам %(full_result_count)s" - -msgid "Save as new" -msgstr "Захаваць як новы" - -msgid "Save and add another" -msgstr "Захаваць і дадаць іншы" - -msgid "Save and continue editing" -msgstr "Захаваць і працягваць правіць" - -msgid "Save and view" -msgstr "Захаваць і праглядзець" - -msgid "Close" -msgstr "Закрыць" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Змяніць абраныя %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Дадаць яшчэ %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Выдаліць абраныя %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Праглядзець абраныя %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Дзякуем за час, які вы сёньня правялі на гэтай пляцоўцы." - -msgid "Log in again" -msgstr "Увайсьці зноўку" - -msgid "Password change" -msgstr "Зьмяніць пароль" - -msgid "Your password was changed." -msgstr "Ваш пароль зьмяніўся." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Дзеля бясьпекі пазначце стары пароль, а потым набярыце новы пароль двойчы — " -"каб упэўніцца, што набралі без памылак." - -msgid "Change my password" -msgstr "Зьмяніць пароль" - -msgid "Password reset" -msgstr "Узнавіць пароль" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Вам усталявалі пароль. Можаце вярнуцца ды ўвайсьці зноўку." - -msgid "Password reset confirmation" -msgstr "Пацьвердзіце, што трэба ўзнавіць пароль" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Набярыце новы пароль двойчы — каб упэўніцца, што набралі без памылак." - -msgid "New password:" -msgstr "Новы пароль:" - -msgid "Confirm password:" -msgstr "Пацьвердзіце пароль:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Спасылка ўзнавіць пароль хібная: мажліва таму, што ёю ўжо скарысталіся. " -"Запытайцеся ўзнавіць пароль яшчэ раз." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Мы адаслалі па электроннай пошце інструкцыі па ўстаноўцы пароля. Калі існуе " -"рахунак з электроннай поштай, што вы ўвялі, то Вы павінны атрымаць іх у " -"бліжэйшы час." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Калі вы не атрымліваеце электронную пошту, калі ласка, пераканайцеся, што вы " -"ўвялі адрас з якім вы зарэгістраваліся, а таксама праверце тэчку са спамам." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Вы атрымалі гэты ліст, таму што вы прасілі скінуць пароль для ўліковага " -"запісу карыстальніка на %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Перайдзіце да наступнае бачыны ды абярыце новы пароль:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Імя карыстальніка, калі раптам вы забыліся:" - -msgid "Thanks for using our site!" -msgstr "Дзякуем, што карыстаецеся нашаю пляцоўкаю!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Каманда «%(site_name)s»" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Забыліся пароль? Калі ласка, увядзіце свой адрас электроннай пошты ніжэй, і " -"мы вышлем інструкцыі па электроннай пошце для ўстаноўкі новага." - -msgid "Email address:" -msgstr "Адрас электроннай пошты:" - -msgid "Reset my password" -msgstr "Узнавіць пароль" - -msgid "Select all objects on this page for an action" -msgstr "Абяраць усе аб'екты на гэтай старонцы для дзеяньня" - -msgid "All dates" -msgstr "Усе даты" - -#, python-format -msgid "Select %s" -msgstr "Абраць %s" - -#, python-format -msgid "Select %s to change" -msgstr "Абярыце %s, каб зьмяніць" - -#, python-format -msgid "Select %s to view" -msgstr "Абярыце %s, каб праглядзець" - -msgid "Date:" -msgstr "Дата:" - -msgid "Time:" -msgstr "Час:" - -msgid "Lookup" -msgstr "Шукаць" - -msgid "Currently:" -msgstr "У цяперашні час:" - -msgid "Change:" -msgstr "Зьмяніць:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo deleted file mode 100644 index ac8377e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po deleted file mode 100644 index 484af85..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,333 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2015 -# znotdead , 2016,2020-2021,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: znotdead , 2016,2020-2021,2023\n" -"Language-Team: Belarusian (http://app.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Даступныя %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Сьпіс даступных %s. Каб нешта абраць, пазначце патрэбнае ў полі ніжэй і " -"пстрыкніце па стрэлцы «Абраць» між двума палямі." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Каб прасеяць даступныя %s, друкуйце ў гэтым полі." - -msgid "Filter" -msgstr "Прасеяць" - -msgid "Choose all" -msgstr "Абраць усе" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Каб абраць усе %s, пстрыкніце тут." - -msgid "Choose" -msgstr "Абраць" - -msgid "Remove" -msgstr "Прыбраць" - -#, javascript-format -msgid "Chosen %s" -msgstr "Абралі %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Сьпіс абраных %s. Каб нешта прыбраць, пазначце патрэбнае ў полі ніжэй і " -"пстрыкніце па стрэлцы «Прыбраць» між двума палямі." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Друкуйце ў гэтым полі, каб прасеяць спіс выбраных %s." - -msgid "Remove all" -msgstr "Прыбраць усё" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Каб прыбраць усе %s, пстрыкніце тут." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s абраная можнасьць нябачна" -msgstr[1] "%s абраныя можнасьці нябачны" -msgstr[2] "%s абраныя можнасьці нябачны" -msgstr[3] "%s абраныя можнасьці нябачны" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Абралі %(sel)s з %(cnt)s" -msgstr[1] "Абралі %(sel)s з %(cnt)s" -msgstr[2] "Абралі %(sel)s з %(cnt)s" -msgstr[3] "Абралі %(sel)s з %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"У пэўных палях засталіся незахаваныя зьмены. Калі выканаць дзеяньне, " -"незахаванае страціцца." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Абралі дзеяньне, але не захавалі зьмены ў пэўных палях. Каб захаваць, " -"націсьніце «Добра». Дзеяньне потым трэба будзе запусьціць нанова." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Абралі дзеяньне, а ў палях нічога не зьмянялі. Мажліва, вы хацелі націснуць " -"кнопку «Выканаць», а ня кнопку «Захаваць»." - -msgid "Now" -msgstr "Цяпер" - -msgid "Midnight" -msgstr "Поўнач" - -msgid "6 a.m." -msgstr "6 папоўначы" - -msgid "Noon" -msgstr "Поўдзень" - -msgid "6 p.m." -msgstr "6 папаўдні" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы." -msgstr[1] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы." -msgstr[2] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы." -msgstr[3] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Заўвага: Ваш час адстае на %s г ад часу на серверы." -msgstr[1] "Заўвага: Ваш час адстае на %s г ад часу на серверы." -msgstr[2] "Заўвага: Ваш час адстае на %s г ад часу на серверы." -msgstr[3] "Заўвага: Ваш час адстае на %s г ад часу на серверы." - -msgid "Choose a Time" -msgstr "Абярыце час" - -msgid "Choose a time" -msgstr "Абярыце час" - -msgid "Cancel" -msgstr "Скасаваць" - -msgid "Today" -msgstr "Сёньня" - -msgid "Choose a Date" -msgstr "Абярыце дату" - -msgid "Yesterday" -msgstr "Учора" - -msgid "Tomorrow" -msgstr "Заўтра" - -msgid "January" -msgstr "Студзень" - -msgid "February" -msgstr "Люты" - -msgid "March" -msgstr "Сакавік" - -msgid "April" -msgstr "Красавік" - -msgid "May" -msgstr "Травень" - -msgid "June" -msgstr "Чэрвень" - -msgid "July" -msgstr "Ліпень" - -msgid "August" -msgstr "Жнівень" - -msgid "September" -msgstr "Верасень" - -msgid "October" -msgstr "Кастрычнік" - -msgid "November" -msgstr "Лістапад" - -msgid "December" -msgstr "Снежань" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Сту" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Лют" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Сак" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Кра" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Чэр" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Ліп" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Жні" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Вер" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Кас" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Ліс" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Сне" - -msgid "Sunday" -msgstr "Нядзеля" - -msgid "Monday" -msgstr "Панядзелак" - -msgid "Tuesday" -msgstr "Аўторак" - -msgid "Wednesday" -msgstr "Серада" - -msgid "Thursday" -msgstr "Чацьвер" - -msgid "Friday" -msgstr "Пятніца" - -msgid "Saturday" -msgstr "Субота" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Нд" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Пн" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Аўт" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Ср" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Чц" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Пт" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Сб" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "А" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" - -msgid "Show" -msgstr "Паказаць" - -msgid "Hide" -msgstr "Схаваць" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index 3e89f3e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index d8e8dc8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,791 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022-2024 -# Boris Chervenkov , 2012 -# Claude Paroz , 2014 -# Jannis Leidel , 2011 -# Lyuboslav Petrov , 2014 -# Todor Lubenov , 2020 -# Todor Lubenov , 2014-2015 -# Venelin Stoykov , 2015-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: arneatec , 2022-2024\n" -"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Изтриване на избраните %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Успешно изтрити %(count)d %(items)s ." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Не можете да изтриете %(name)s" - -msgid "Are you sure?" -msgstr "Сигурни ли сте?" - -msgid "Administration" -msgstr "Администрация" - -msgid "All" -msgstr "Всички" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -msgid "Unknown" -msgstr "Неизвестно" - -msgid "Any date" -msgstr "Коя-да-е дата" - -msgid "Today" -msgstr "Днес" - -msgid "Past 7 days" -msgstr "Последните 7 дни" - -msgid "This month" -msgstr "Този месец" - -msgid "This year" -msgstr "Тази година" - -msgid "No date" -msgstr "Няма дата" - -msgid "Has date" -msgstr "Има дата" - -msgid "Empty" -msgstr "Празно" - -msgid "Not empty" -msgstr "Не е празно" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Моля въведете правилния %(username)s и парола за администраторски акаунт. " -"Моля забележете, че и двете полета могат да са с главни и малки букви." - -msgid "Action:" -msgstr "Действие:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Добави друг %(verbose_name)s" - -msgid "Remove" -msgstr "Премахване" - -msgid "Addition" -msgstr "Добавка" - -msgid "Change" -msgstr "Промени" - -msgid "Deletion" -msgstr "Изтриване" - -msgid "action time" -msgstr "време на действие" - -msgid "user" -msgstr "потребител" - -msgid "content type" -msgstr "тип на съдържанието" - -msgid "object id" -msgstr "id на обекта" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr на обекта" - -msgid "action flag" -msgstr "флаг за действие" - -msgid "change message" -msgstr "промени съобщение" - -msgid "log entry" -msgstr "записка в журнала" - -msgid "log entries" -msgstr "записки в журнала" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Добавен “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Променени “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Изтрити “%(object)s.”" - -msgid "LogEntry Object" -msgstr "LogEntry обект" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Добавен {name} “{object}”." - -msgid "Added." -msgstr "Добавено." - -msgid "and" -msgstr "и" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Променени {fields} за {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Променени {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Изтрит {name} “{object}”." - -msgid "No fields changed." -msgstr "Няма променени полета." - -msgid "None" -msgstr "Празно" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Задръжте “Control”, или “Command” на Mac, за да изберете повече от едно." - -msgid "Select this object for an action - {}" -msgstr "Изберете този обект за действие - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Обектът {name} “{obj}” бе успешно добавен." - -msgid "You may edit it again below." -msgstr "Можете отново да го промените по-долу." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Обектът {name} “{obj}” бе успешно добавен. Можете да добавите друг {name} по-" -"долу." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Обектът {name} “{obj}” бе успешно променен. Можете да го промените отново по-" -"долу." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Обектът {name} “{obj}” бе успешно променен. Можете да добавите друг {name} " -"по-долу." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Обектът {name} “{obj}” бе успешно променен." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Елементите трябва да бъдат избрани, за да се извършат действия по тях. Няма " -"променени елементи." - -msgid "No action selected." -msgstr "Няма избрано действие." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” беше успешно изтрит." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s с ID “%(key)s” не съществува. Може би е изтрит?" - -#, python-format -msgid "Add %s" -msgstr "Добави %s" - -#, python-format -msgid "Change %s" -msgstr "Промени %s" - -#, python-format -msgid "View %s" -msgstr "Изглед %s" - -msgid "Database error" -msgstr "Грешка в базата данни" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s беше променено успешно." -msgstr[1] "%(count)s %(name)s бяха успешно променени." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s е избран" -msgstr[1] "Избрани са всички %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Избрани са 0 от %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "История на промените: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Изтриването на избраните %(class_name)s %(instance)s ще наложи изтриването " -"на следните защитени и свързани обекти: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django административен сайт" - -msgid "Django administration" -msgstr "Django администрация" - -msgid "Site administration" -msgstr "Администрация на сайта" - -msgid "Log in" -msgstr "Вход" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s администрация" - -msgid "Page not found" -msgstr "Страница не е намерена" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Съжаляваме, но поисканата страница не може да бъде намерена." - -msgid "Home" -msgstr "Начало" - -msgid "Server error" -msgstr "Сървърна грешка" - -msgid "Server error (500)" -msgstr "Сървърна грешка (500)" - -msgid "Server Error (500)" -msgstr "Сървърна грешка (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Получи се грешка. Администраторите на сайта са уведомени за това чрез " -"електронна поща и грешката трябва да бъде поправена скоро. Благодарим ви за " -"търпението." - -msgid "Run the selected action" -msgstr "Изпълни избраното действие" - -msgid "Go" -msgstr "Напред" - -msgid "Click here to select the objects across all pages" -msgstr "Щракнете тук, за да изберете обектите във всички страници" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Избери всички %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Изчисти избраното" - -msgid "Breadcrumbs" -msgstr "Трохи" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели в приложението %(name)s " - -msgid "Add" -msgstr "Добави" - -msgid "View" -msgstr "Изглед" - -msgid "You don’t have permission to view or edit anything." -msgstr "Нямате права да разглеждате или редактирате каквото и да е." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Първо въведете потребител и парола. След това ще можете да редактирате " -"повече детайли. " - -msgid "Enter a username and password." -msgstr "Въведете потребителско име и парола." - -msgid "Change password" -msgstr "Промени парола" - -msgid "Set password" -msgstr "Задайте парола" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Моля, поправете грешката по-долу." -msgstr[1] "Моля, поправете грешките по-долу." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Въведете нова парола за потребител %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Това действие ще включи автентикация чрез парола за този " -"потребител." - -msgid "Disable password-based authentication" -msgstr "Деактивиране на автентикация чрез парола." - -msgid "Enable password-based authentication" -msgstr "Разрешаване на автентикация чрез парола." - -msgid "Skip to main content" -msgstr "Пропуснете към основното съдържание" - -msgid "Welcome," -msgstr "Добре дошли," - -msgid "View site" -msgstr "Виж сайта" - -msgid "Documentation" -msgstr "Документация" - -msgid "Log out" -msgstr "Изход" - -#, python-format -msgid "Add %(name)s" -msgstr "Добави %(name)s" - -msgid "History" -msgstr "История" - -msgid "View on site" -msgstr "Разгледай в сайта" - -msgid "Filter" -msgstr "Филтър" - -msgid "Hide counts" -msgstr "Скрий брояча" - -msgid "Show counts" -msgstr "Покажи брояча" - -msgid "Clear all filters" -msgstr "Изчисти всички филтри" - -msgid "Remove from sorting" -msgstr "Премахни от подреждането" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Ред на подреждане: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Превключи подреждането" - -msgid "Toggle theme (current theme: auto)" -msgstr "Смени темата (настояща тема: автоматична)" - -msgid "Toggle theme (current theme: light)" -msgstr "Смени темата (настояща тема: светла)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Смени темата (настояща тема: тъмна)" - -msgid "Delete" -msgstr "Изтрий" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Изтриването на %(object_name)s '%(escaped_object)s' би причинило изтриване " -"на свързани обекти, но вашият потребител няма право да изтрива следните " -"видове обекти:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Изтриването на %(object_name)s '%(escaped_object)s' изисква изтриването на " -"следните защитени свързани обекти:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Наистина ли искате да изтриете %(object_name)s \"%(escaped_object)s\"? " -"Следните свързани елементи също ще бъдат изтрити:" - -msgid "Objects" -msgstr "Обекти" - -msgid "Yes, I’m sure" -msgstr "Да, сигурен съм" - -msgid "No, take me back" -msgstr "Не, върни ме обратно" - -msgid "Delete multiple objects" -msgstr "Изтриване на множество обекти" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Изтриването на избраните %(objects_name)s ще доведе до изтриване на свързани " -"обекти, но вашият потребител няма право да изтрива следните типове обекти:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Изтриването на избраните %(objects_name)s изисква изтриването на следните " -"защитени свързани обекти:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Наистина ли искате да изтриете избраните %(objects_name)s? Всички изброени " -"обекти и свързаните с тях ще бъдат изтрити:" - -msgid "Delete?" -msgstr "Изтриване?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " По %(filter_title)s " - -msgid "Summary" -msgstr "Резюме" - -msgid "Recent actions" -msgstr "Последни действия" - -msgid "My actions" -msgstr "Моите действия" - -msgid "None available" -msgstr "Няма налични" - -msgid "Added:" -msgstr "Добавени:" - -msgid "Changed:" -msgstr "Променени:" - -msgid "Deleted:" -msgstr "Изтрити:" - -msgid "Unknown content" -msgstr "Неизвестно съдържание" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Проблем с вашата база данни. Убедете се, че необходимите таблици в базата са " -"създадени и че съответния потребител има необходимите права за достъп. " - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Вие сте се удостоверен като %(username)s, но не сте оторизиран да достъпите " -"тази страница. Бихте ли желали да влезе с друг профил?" - -msgid "Forgotten your password or username?" -msgstr "Забравена парола или потребителско име?" - -msgid "Toggle navigation" -msgstr "Превключи навигацията" - -msgid "Sidebar" -msgstr "Страничната лента" - -msgid "Start typing to filter…" -msgstr "Започнете да пишете за филтър..." - -msgid "Filter navigation items" -msgstr "Филтриране на навигационните елементи" - -msgid "Date/time" -msgstr "Дата/час" - -msgid "User" -msgstr "Потребител" - -msgid "Action" -msgstr "Действие" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "запис" -msgstr[1] "записа" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Този обект няма история на промените. Вероятно не е бил добавен чрез този " -"административен сайт." - -msgid "Show all" -msgstr "Покажи всички" - -msgid "Save" -msgstr "Запис" - -msgid "Popup closing…" -msgstr "Изскачащият прозорец се затваря..." - -msgid "Search" -msgstr "Търсене" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s резултат" -msgstr[1] "%(counter)s резултати" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s общо" - -msgid "Save as new" -msgstr "Запиши като нов" - -msgid "Save and add another" -msgstr "Запиши и добави нов" - -msgid "Save and continue editing" -msgstr "Запиши и продължи" - -msgid "Save and view" -msgstr "Запиши и прегледай" - -msgid "Close" -msgstr "Затвори" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Променете избрания %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Добавяне на друг %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Изтриване на избрания %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Виж избраните %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Благодарим ви за добре прекараното време с този сайт днес." - -msgid "Log in again" -msgstr "Влез пак" - -msgid "Password change" -msgstr "Промяна на парола" - -msgid "Your password was changed." -msgstr "Паролата ви е променена." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Въведете старата си парола /от съображения за сигурност/. След това въведете " -"желаната нова парола два пъти, за да сверим дали е написана правилно." - -msgid "Change my password" -msgstr "Промяна на паролата ми" - -msgid "Password reset" -msgstr "Нова парола" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Паролата е променена. Вече можете да се впишете." - -msgid "Password reset confirmation" -msgstr "Потвърждение за смяна на паролата" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Моля, въведете новата парола два пъти, за да се уверим, че сте я написали " -"правилно." - -msgid "New password:" -msgstr "Нова парола:" - -msgid "Confirm password:" -msgstr "Потвърдете паролата:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Връзката за възстановяване на паролата е невалидна, може би защото вече е " -"използвана. Моля, поискайте нова промяна на паролата." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"По имейл изпратихме инструкции за смяна на паролата, ако съществува профил с " -"въведения от вас адрес. Би трябвало скоро да ги получите. " - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ако не получите имейл, моля уверете се, че сте попълнили правилно адреса, с " -"който сте се регистрирали, също проверете спам папката във вашата поща." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Вие получавати този имейл, защото сте поискали да промените паролата за " -"вашия потребителски акаунт в %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Моля, отидете на следната страница и изберете нова парола:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Вашето потребителско име, в случай че сте го забравили:" - -msgid "Thanks for using our site!" -msgstr "Благодарим, че ползвате сайта ни!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Екипът на %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Забравили сте си паролата? Въведете своя имейл адрес по-долу, и ние ще ви " -"изпратим инструкции как да я смените с нова." - -msgid "Email address:" -msgstr "Имейл адреси:" - -msgid "Reset my password" -msgstr "Задай новата ми парола" - -msgid "Select all objects on this page for an action" -msgstr "Изберете всички обекти на този страница за действие" - -msgid "All dates" -msgstr "Всички дати" - -#, python-format -msgid "Select %s" -msgstr "Изберете %s" - -#, python-format -msgid "Select %s to change" -msgstr "Изберете %s за промяна" - -#, python-format -msgid "Select %s to view" -msgstr "Избери %s за преглед" - -msgid "Date:" -msgstr "Дата:" - -msgid "Time:" -msgstr "Час:" - -msgid "Lookup" -msgstr "Търсене" - -msgid "Currently:" -msgstr "Сега:" - -msgid "Change:" -msgstr "Промяна:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo deleted file mode 100644 index a3eab43..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po deleted file mode 100644 index 4ec3a50..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,320 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022-2024 -# Jannis Leidel , 2011 -# Venelin Stoykov , 2015-2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:59+0000\n" -"Last-Translator: arneatec , 2022-2024\n" -"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Налични %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Това е списък на наличните %s . Можете да изберете някои, като ги изберете в " -"полето по-долу и след това кликнете върху стрелката \"Избери\" между двете " -"полета." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Въведете в това поле, за да филтрирате списъка на наличните %s." - -msgid "Filter" -msgstr "Филтър" - -msgid "Choose all" -msgstr "Избери всички" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Кликнете, за да изберете всички %s наведнъж." - -msgid "Choose" -msgstr "Избери" - -msgid "Remove" -msgstr "Премахни" - -#, javascript-format -msgid "Chosen %s" -msgstr "Избрахме %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Това е списък на избраните %s. Можете да премахнете някои, като ги изберете " -"в полето по-долу и след това щракнете върху стрелката \"Премахни\" между " -"двете полета." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Въведете в това поле, за да филтрирате списъка на избраните %s." - -msgid "Remove all" -msgstr "Премахване на всички" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Кликнете, за да премахнете всички избрани %s наведнъж." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s избрана опция не е видима" -msgstr[1] "%s selected options not visible" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s на %(cnt)s е избран" -msgstr[1] "%(sel)s на %(cnt)s са избрани" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Имате незапазени промени по отделни полета за редактиране. Ако изпълните " -"действие, незаписаните промени ще бъдат загубени." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Вие сте избрали действие, но не сте записали промените по полета. Моля, " -"кликнете ОК, за да се запишат. Трябва отново да изпълните действието." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Вие сте избрали действие, но не сте направили промени по полетата. Вероятно " -"търсите Изпълни бутона, а не бутона Запис." - -msgid "Now" -msgstr "Сега" - -msgid "Midnight" -msgstr "Полунощ" - -msgid "6 a.m." -msgstr "6 сутринта" - -msgid "Noon" -msgstr "По обяд" - -msgid "6 p.m." -msgstr "6 след обяд" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Бележка: Вие сте %s час напред от времето на сървъра." -msgstr[1] "Бележка: Вие сте с %s часа напред от времето на сървъра" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Внимание: Вие сте %s час назад от времето на сървъра." -msgstr[1] "Внимание: Вие сте с %s часа назад от времето на сървъра." - -msgid "Choose a Time" -msgstr "Изберете време" - -msgid "Choose a time" -msgstr "Изберете време" - -msgid "Cancel" -msgstr "Отказ" - -msgid "Today" -msgstr "Днес" - -msgid "Choose a Date" -msgstr "Изберете дата" - -msgid "Yesterday" -msgstr "Вчера" - -msgid "Tomorrow" -msgstr "Утре" - -msgid "January" -msgstr "Януари" - -msgid "February" -msgstr "Февруари" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Април" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Юни" - -msgid "July" -msgstr "Юли" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Септември" - -msgid "October" -msgstr "Октомври" - -msgid "November" -msgstr "Ноември" - -msgid "December" -msgstr "Декември" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "ян." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "февр." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "март" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "апр." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "май" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "юни" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "юли" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "авг." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "септ." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "окт." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "ноем." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "дек." - -msgid "Sunday" -msgstr "неделя" - -msgid "Monday" -msgstr "понеделник" - -msgid "Tuesday" -msgstr "вторник" - -msgid "Wednesday" -msgstr "сряда" - -msgid "Thursday" -msgstr "четвъртък" - -msgid "Friday" -msgstr "петък" - -msgid "Saturday" -msgstr "събота" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "нед" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "пон" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "вт" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "ср" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "чет" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "пет" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "съб" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "В" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index b742fd8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index ef7e14b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,713 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Anubhab Baksi, 2013 -# Jannis Leidel , 2011 -# Md Arshad Hussain, 2022 -# Tahmid Rafi , 2012-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Md Arshad Hussain\n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "চিহ্নিত অংশটি %(verbose_name_plural)s মুছে ফেলুন" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d টি %(items)s সফলভাবে মুছে ফেলা হয়েছে" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s ডিলিট করা সম্ভব নয়" - -msgid "Are you sure?" -msgstr "আপনি কি নিশ্চিত?" - -msgid "Administration" -msgstr "প্রয়োগ" - -msgid "All" -msgstr "সকল" - -msgid "Yes" -msgstr "হ্যাঁ" - -msgid "No" -msgstr "না" - -msgid "Unknown" -msgstr "অজানা" - -msgid "Any date" -msgstr "যে কোন তারিখ" - -msgid "Today" -msgstr "‍আজ" - -msgid "Past 7 days" -msgstr "শেষ ৭ দিন" - -msgid "This month" -msgstr "এ মাসে" - -msgid "This year" -msgstr "এ বছরে" - -msgid "No date" -msgstr "কোন তারিখ নেই" - -msgid "Has date" -msgstr "তারিখ আছে" - -msgid "Empty" -msgstr "খালি" - -msgid "Not empty" -msgstr "খালি নেই" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "কাজ:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "আরো একটি %(verbose_name)s যোগ করুন" - -msgid "Remove" -msgstr "মুছে ফেলুন" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "পরিবর্তন" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "কার্য সময়" - -msgid "user" -msgstr "ব্যবহারকারী" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "অবজেক্ট আইডি" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "অবজেক্ট উপস্থাপক" - -msgid "action flag" -msgstr "কার্যচিহ্ন" - -msgid "change message" -msgstr "বার্তা পরিবর্তন করুন" - -msgid "log entry" -msgstr "লগ এন্ট্রি" - -msgid "log entries" -msgstr "লগ এন্ট্রিসমূহ" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” যোগ করা হয়েছে। " - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” — %(changes)s পরিবর্তন করা হয়েছে" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s.” মুছে ফেলা হয়েছে" - -msgid "LogEntry Object" -msgstr "লগ-এন্ট্রি দ্রব্য" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "যুক্ত করা হয়েছে" - -msgid "and" -msgstr "এবং" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "কোন ফিল্ড পরিবর্তন হয়নি।" - -msgid "None" -msgstr "কিছু না" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "নিম্নে আপনি আবার তা সম্পাদনা/পরিবর্তন করতে পারেন।" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\" সফলভাবে যুক্ত হয়েছে৷ নিম্নে আপনি আরেকটি {name} যুক্ত করতে পারেন।" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "কাজ করার আগে বস্তুগুলিকে অবশ্যই চিহ্নিত করতে হবে। কোনো বস্তু পরিবর্তিত হয়নি।" - -msgid "No action selected." -msgstr "কোনো কাজ " - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s যোগ করুন" - -#, python-format -msgid "Change %s" -msgstr "%s পরিবর্তন করুন" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "ডাটাবেস সমস্যা" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s টি থেকে ০ টি সিলেক্ট করা হয়েছে" - -#, python-format -msgid "Change history: %s" -msgstr "ইতিহাস পরিবর্তনঃ %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "জ্যাঙ্গো সাইট প্রশাসক" - -msgid "Django administration" -msgstr "জ্যাঙ্গো প্রশাসন" - -msgid "Site administration" -msgstr "সাইট প্রশাসন" - -msgid "Log in" -msgstr "প্রবেশ করুন" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "পৃষ্ঠা পাওয়া যায়নি" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "আমরা দুঃখিত, কিন্তু অনুরোধকৃত পাতা খুঁজে পাওয়া যায়নি।" - -msgid "Home" -msgstr "নীড়পাতা" - -msgid "Server error" -msgstr "সার্ভার সমস্যা" - -msgid "Server error (500)" -msgstr "সার্ভার সমস্যা (৫০০)" - -msgid "Server Error (500)" -msgstr "সার্ভার সমস্যা (৫০০)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "চিহ্নিত কাজটি শুরু করুন" - -msgid "Go" -msgstr "যান" - -msgid "Click here to select the objects across all pages" -msgstr "সকল পৃষ্ঠার দ্রব্য পছন্দ করতে এখানে ক্লিক করুন" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "%(total_count)s টি %(module_name)s এর সবগুলোই সিলেক্ট করুন" - -msgid "Clear selection" -msgstr "চিহ্নিত অংশের চিহ্ন মুছে ফেলুন" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s এপ্লিকেশন এর মডেল গুলো" - -msgid "Add" -msgstr "যোগ করুন" - -msgid "View" -msgstr "দেখুন" - -msgid "You don’t have permission to view or edit anything." -msgstr "কোন কিছু দেখার বা সম্পাদনা/পরিবর্তন করার আপনার কোন অনুমতি নেই।" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"প্রথমে, একজন ব্যবহারকারীর নাম এবং পাসওয়ার্ড লিখুন। তাহলে, আপনি ব্যবহারকারীর " -"অন্যান্য অনেক অপশনগুলো পরিবর্তন করতে সক্ষম হবেন। " - -msgid "Enter a username and password." -msgstr "ইউজার নেইম এবং পাসওয়ার্ড টাইপ করুন।" - -msgid "Change password" -msgstr "পাসওয়ার্ড বদলান" - -msgid "Please correct the error below." -msgstr "দয়া করে নিম্নবর্ণিত ভুলটি সংশোধন করুন।" - -msgid "Please correct the errors below." -msgstr "দয়া করে নিম্নবর্ণিত ভুলগুলো সংশোধন করুন।" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s সদস্যের জন্য নতুন পাসওয়ার্ড দিন।" - -msgid "Welcome," -msgstr "স্বাগতম," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "সহায়িকা" - -msgid "Log out" -msgstr "প্রস্থান" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s যোগ করুন" - -msgid "History" -msgstr "ইতিহাস" - -msgid "View on site" -msgstr "সাইটে দেখুন" - -msgid "Filter" -msgstr "ফিল্টার" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "ক্রমানুসারে সাজানো থেকে বিরত হোন" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "সাজানোর ক্রম: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "ক্রমানুসারে সাজানো চালু করুন/ বন্ধ করুন" - -msgid "Delete" -msgstr "মুছুন" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' মুছে ফেললে এর সম্পর্কিত অবজেক্টগুলোও মুছে " -"যাবে, কিন্তু আপনার নিম্নবর্ণিত অবজেক্টগুলো মোছার অধিকার নেইঃ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"আপনি কি %(object_name)s \"%(escaped_object)s\" মুছে ফেলার ব্যাপারে নিশ্চিত? " -"নিম্নে বর্ণিত সকল আইটেম মুছে যাবেঃ" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "হ্যাঁ, আমি নিশ্চিত" - -msgid "No, take me back" -msgstr "না, আমাক পূর্বের জায়গায় ফিরিয়ে নাও" - -msgid "Delete multiple objects" -msgstr "একাধিক জিনিস মুছে ফেলুন" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Delete?" -msgstr "মুছে ফেলুন?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s অনুযায়ী " - -msgid "Summary" -msgstr "সারসংক্ষেপ" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "আমার করনীয়" - -msgid "None available" -msgstr "কিছুই পাওয়া যায়নি" - -msgid "Unknown content" -msgstr "অজানা বিষয়" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"আপনার ড্যাটাবেস ইন্সটলেশন করার ক্ষেত্রে কিছু সমস্যা রয়েছে। নিশ্চিত করুন যে আপনি " -"যথাযথ ড্যাটাবেস টেবিলগুলো তৈরী করেছেন এবং নিশ্চিত করুন যে উক্ত ড্যাটাবেসটি অন্যান্য " -"ব্যবহারকারী দ্বারা ব্যবহারযোগ্য হবে। " - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "ইউজার নেইম অথবা পাসওয়ার্ড ভুলে গেছেন?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "তারিখ/সময়" - -msgid "User" -msgstr "সদস্য" - -msgid "Action" -msgstr "কার্য" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "সব দেখান" - -msgid "Save" -msgstr "সংরক্ষণ করুন" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "সার্চ" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "মোট %(full_result_count)s" - -msgid "Save as new" -msgstr "নতুনভাবে সংরক্ষণ করুন" - -msgid "Save and add another" -msgstr "সংরক্ষণ করুন এবং আরেকটি যোগ করুন" - -msgid "Save and continue editing" -msgstr "সংরক্ষণ করুন এবং সম্পাদনা চালিয়ে যান" - -msgid "Save and view" -msgstr "সংরক্ষণ করুন এবং দেখুন" - -msgid "Close" -msgstr "বন্ধ করুন" - -#, python-format -msgid "Change selected %(model)s" -msgstr "%(model)s নির্বাচিত অংশটি পরিবর্তন করুন" - -#, python-format -msgid "Add another %(model)s" -msgstr "আরো একটি%(model)s যুক্ত করুন" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "%(model)s নির্বাচিত অংশটি মুছুন " - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "আজকে ওয়েব সাইট আপনার গুনগত সময় দেয়ার জন্য আপনাকে ধন্যবাদ।" - -msgid "Log in again" -msgstr "পুনরায় প্রবেশ করুন" - -msgid "Password change" -msgstr "পাসওয়ার্ড বদলান" - -msgid "Your password was changed." -msgstr "আপনার পাসওয়ার্ড বদলানো হয়েছে।" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"দয়া করে নিরাপত্তার জন্য আপনার পুরানো পাসওয়ার্ডটি লিখুন, এবং তারপর নতুন পাসওয়ার্ডটি " -"দুইবার লিখুন যাতে করে আপনি সঠিক পাসওয়ার্ডটি লিখেছেন কি না তা আমরা যাচাই করতে " -"পারি। " - -msgid "Change my password" -msgstr "আমার পাসওয়ার্ড পরিবর্তন করুন" - -msgid "Password reset" -msgstr "পাসওয়ার্ড রিসেট করুন" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "আপনার পাসওয়ার্ড দেয়া হয়েছে। আপনি এখন প্রবেশ (লগইন) করতে পারেন।" - -msgid "Password reset confirmation" -msgstr "পাসওয়ার্ড রিসেট নিশ্চিত করুন" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"অনুগ্রহ করে আপনার পাসওয়ার্ড দুবার প্রবেশ করান, যাতে আমরা যাচাই করতে পারি আপনি " -"সঠিকভাবে টাইপ করেছেন।" - -msgid "New password:" -msgstr "নতুন পাসওয়ার্ডঃ" - -msgid "Confirm password:" -msgstr "পাসওয়ার্ড নিশ্চিতকরণঃ" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"পাসওয়ার্ড রিসেট লিঙ্কটি ঠিক নয়, হয়তো এটা ইতোমধ্যে ব্যবহৃত হয়েছে। পাসওয়ার্ড " -"রিসেটের জন্য অনুগ্রহ করে নতুনভাবে আবেদন করুন।" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"আপনার পাসওয়ার্ড সংযোজন করার জন্য আমরা আপনাকে নির্দেশাবলী সম্বলিত একটি ই-মেইল " -"পাঠাবো, যদি আপনার দেয়া ই-মেইলে আইডিটি এখানে বিদ্যমান থাকে। আপনি খুব দ্রুত তা " -"পেয়ে যাবেন। " - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"আপনি যদি কোন ই-মেইল না পেয়ে থাকে, তবে দয়া করে নিশ্চিত করুন আপনি যে ই-মেইল আইডি " -"দিয়ে নিবন্ধন করেছিলেন তা এখানে লিখেছেন, এবং আপনার স্পাম ফোল্ডার চেক করুন। " - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"আপনি এই ই-মেইলটি পেয়েছেন কারন আপনি %(site_name)s এ আপনার ইউজার একাউন্টের " -"পাসওয়ার্ড রিসেট এর জন্য অনুরোধ করেছেন।" - -msgid "Please go to the following page and choose a new password:" -msgstr "অনুগ্রহ করে নিচের পাতাটিতে যান এবং নতুন পাসওয়ার্ড বাছাই করুনঃ" - -msgid "Your username, in case you’ve forgotten:" -msgstr "আপনার ব্যবহারকারীর নাম, যদি আপনি ভুলে গিয়ে থাকেন:" - -msgid "Thanks for using our site!" -msgstr "আমাদের সাইট ব্যবহারের জন্য ধন্যবাদ!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s দল" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"আপনার পাসওয়ার্ড ভুলে গিয়েছেন? নিম্নে আপনার ই-মেইল আইডি লিখুন, এবং আমরা আপনাকে " -"নতুন পাসওয়ার্ড সংযোজন করার জন্য নির্দেশাবলী সম্বলিত ই-মেইল পাঠাবো।" - -msgid "Email address:" -msgstr "ইমেইল ঠিকানা:" - -msgid "Reset my password" -msgstr "আমার পাসওয়ার্ড রিসেট করুন" - -msgid "All dates" -msgstr "সকল তারিখ" - -#, python-format -msgid "Select %s" -msgstr "%s বাছাই করুন" - -#, python-format -msgid "Select %s to change" -msgstr "%s পরিবর্তনের জন্য বাছাই করুন" - -#, python-format -msgid "Select %s to view" -msgstr "দেখার জন্য %s নির্বাচন করুন" - -msgid "Date:" -msgstr "তারিখঃ" - -msgid "Time:" -msgstr "সময়ঃ" - -msgid "Lookup" -msgstr "খুঁজুন" - -msgid "Currently:" -msgstr "বর্তমান অবস্থা:" - -msgid "Change:" -msgstr "পরিবর্তন:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo deleted file mode 100644 index b3f7f97..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po deleted file mode 100644 index 139d81c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,207 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Tahmid Rafi , 2013 -# Tahmid Rafi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s বিদ্যমান" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "ফিল্টার" - -msgid "Choose all" -msgstr "সব বাছাই করুন" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "সব %s একবারে বাছাই করার জন্য ক্লিক করুন।" - -msgid "Choose" -msgstr "বাছাই করুন" - -msgid "Remove" -msgstr "মুছে ফেলুন" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s বাছাই করা হয়েছে" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "সব মুছে ফেলুন" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা সামনে আছেন।" -msgstr[1] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা সামনে আছেন।" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা পেছনে আছেন।" -msgstr[1] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা পেছনে আছেন।" - -msgid "Now" -msgstr "এখন" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "সময় নির্বাচন করুন" - -msgid "Midnight" -msgstr "মধ্যরাত" - -msgid "6 a.m." -msgstr "৬ পূর্বাহ্ন" - -msgid "Noon" -msgstr "দুপুর" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "বাতিল" - -msgid "Today" -msgstr "আজ" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "গতকাল" - -msgid "Tomorrow" -msgstr "আগামীকাল" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "দেখান" - -msgid "Hide" -msgstr "লুকান" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index 296f113..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index cbdc359..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,671 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fulup , 2012 -# Irriep Nala Novram , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 00:36+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "Ha sur oc'h?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Dilemel %(verbose_name_plural)s diuzet" - -msgid "Administration" -msgstr "Melestradurezh" - -msgid "All" -msgstr "An holl" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Ket" - -msgid "Unknown" -msgstr "Dianav" - -msgid "Any date" -msgstr "Forzh pegoulz" - -msgid "Today" -msgstr "Hiziv" - -msgid "Past 7 days" -msgstr "Er 7 devezh diwezhañ" - -msgid "This month" -msgstr "Ar miz-mañ" - -msgid "This year" -msgstr "Ar bloaz-mañ" - -msgid "No date" -msgstr "Deiziad ebet" - -msgid "Has date" -msgstr "D'an deiziad" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Ober:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Ouzhpennañ %(verbose_name)s all" - -msgid "Remove" -msgstr "Lemel kuit" - -msgid "Addition" -msgstr "Sammañ" - -msgid "Change" -msgstr "Cheñch" - -msgid "Deletion" -msgstr "Diverkadur" - -msgid "action time" -msgstr "eur an ober" - -msgid "user" -msgstr "implijer" - -msgid "content type" -msgstr "doare endalc'had" - -msgid "object id" -msgstr "id an objed" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "ober banniel" - -msgid "change message" -msgstr "Kemennadenn cheñchamant" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Ouzhpennet \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Cheñchet \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Dilamet \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Ouzhpennet {name} \"{object}\"." - -msgid "Added." -msgstr "Ouzhpennet." - -msgid "and" -msgstr "ha" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Cheñchet {fields} evit {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Cheñchet {fields}." - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Dilamet {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Maezienn ebet cheñchet." - -msgid "None" -msgstr "Hini ebet" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "Rankout a rit ec'h aozañ adarre dindan." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "Ober ebet diuzet." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Ouzhpennañ %s" - -#, python-format -msgid "Change %s" -msgstr "Cheñch %s" - -#, python-format -msgid "View %s" -msgstr "Gwelet %s" - -msgid "Database error" -msgstr "Fazi diaz-roadennoù" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s a zo bet cheñchet mat." -msgstr[1] "%(count)s %(name)s a zo bet cheñchet mat. " -msgstr[2] "%(count)s %(name)s a zo bet cheñchet mat. " -msgstr[3] "%(count)s %(name)s a zo bet cheñchet mat." -msgstr[4] "%(count)s %(name)s a zo bet cheñchet mat." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s diuzet" -msgstr[1] "%(total_count)s diuzet" -msgstr[2] "%(total_count)s diuzet" -msgstr[3] "%(total_count)s diuzet" -msgstr[4] "Pep %(total_count)s diuzet" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 diwar %(cnt)s diuzet" - -#, python-format -msgid "Change history: %s" -msgstr "Istor ar cheñchadurioù: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Lec'hienn verañ Django" - -msgid "Django administration" -msgstr "Merañ Django" - -msgid "Site administration" -msgstr "Merañ al lec'hienn" - -msgid "Log in" -msgstr "Kevreañ" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "N'eo ket bet kavet ar bajenn" - -msgid "We're sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "Degemer" - -msgid "Server error" -msgstr "Fazi servijer" - -msgid "Server error (500)" -msgstr "Fazi servijer (500)" - -msgid "Server Error (500)" -msgstr "Fazi servijer (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "Mont" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "Riñsañ an diuzadenn" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Merkit un anv implijer hag ur ger-tremen." - -msgid "Change password" -msgstr "Cheñch ger-tremen" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "Degemer mat," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Teulioù" - -msgid "Log out" -msgstr "Digevreañ" - -#, python-format -msgid "Add %(name)s" -msgstr "Ouzhpennañ %(name)s" - -msgid "History" -msgstr "Istor" - -msgid "View on site" -msgstr "Gwelet war al lec'hienn" - -msgid "Filter" -msgstr "Sil" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "Eilpennañ an diuzadenn" - -msgid "Delete" -msgstr "Diverkañ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Ya, sur on" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "View" -msgstr "" - -msgid "Delete?" -msgstr "Diverkañ ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " dre %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Ouzhpennañ" - -msgid "You don't have permission to view or edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "Endalc'had dianav" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Disoñjet ho ker-tremen pe hoc'h anv implijer ganeoc'h ?" - -msgid "Date/time" -msgstr "Deiziad/eur" - -msgid "User" -msgstr "Implijer" - -msgid "Action" -msgstr "Ober" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Diskouez pep tra" - -msgid "Save" -msgstr "Enrollañ" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Klask" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "Enrollañ evel nevez" - -msgid "Save and add another" -msgstr "Enrollañ hag ouzhpennañ unan all" - -msgid "Save and continue editing" -msgstr "Enrollañ ha derc'hel da gemmañ" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "Kevreañ en-dro" - -msgid "Password change" -msgstr "Cheñch ho ker-tremen" - -msgid "Your password was changed." -msgstr "Cheñchet eo bet ho ker-tremen." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "Cheñch ma ger-tremen" - -msgid "Password reset" -msgstr "Adderaouekaat ar ger-tremen" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "Kadarnaat eo bet cheñchet ar ger-tremen" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "Ger-tremen nevez :" - -msgid "Confirm password:" -msgstr "Kadarnaat ar ger-tremen :" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Ho trugarekaat da ober gant hol lec'hienn !" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "An holl zeiziadoù" - -#, python-format -msgid "Select %s" -msgstr "Diuzañ %s" - -#, python-format -msgid "Select %s to change" -msgstr "" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Deiziad :" - -msgid "Time:" -msgstr "Eur :" - -msgid "Lookup" -msgstr "Klask" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 58664d0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po deleted file mode 100644 index 3f81956..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,217 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fulup , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Hegerz %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Sil" - -msgid "Choose all" -msgstr "Dibab an holl" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klikañ evit dibab an holl %s war un dro." - -msgid "Choose" -msgstr "Dibab" - -msgid "Remove" -msgstr "Lemel kuit" - -#, javascript-format -msgid "Chosen %s" -msgstr "Dibabet %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "Lemel kuit pep tra" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klikañ evit dilemel an holl %s dibabet war un dro." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Bremañ" - -msgid "Midnight" -msgstr "Hanternoz" - -msgid "6 a.m." -msgstr "6e00" - -msgid "Noon" -msgstr "Kreisteiz" - -msgid "6 p.m." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Dibab un eur" - -msgid "Cancel" -msgstr "Nullañ" - -msgid "Today" -msgstr "Hiziv" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Dec'h" - -msgid "Tomorrow" -msgstr "Warc'hoazh" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Diskouez" - -msgid "Hide" -msgstr "Kuzhat" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index f920c9b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index 1d7eb6e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,657 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Filip Dupanović , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Uspješno izbrisano %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "Da li ste sigurni?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Izbriši odabrane %(verbose_name_plural)s" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Svi" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Nepoznato" - -msgid "Any date" -msgstr "Svi datumi" - -msgid "Today" -msgstr "Danas" - -msgid "Past 7 days" -msgstr "Poslednjih 7 dana" - -msgid "This month" -msgstr "Ovaj mesec" - -msgid "This year" -msgstr "Ova godina" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Radnja:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dodaj još jedan %(verbose_name)s" - -msgid "Remove" -msgstr "Obriši" - -msgid "action time" -msgstr "vrijeme radnje" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "id objekta" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr objekta" - -msgid "action flag" -msgstr "oznaka radnje" - -msgid "change message" -msgstr "opis izmjene" - -msgid "log entry" -msgstr "zapis u logovima" - -msgid "log entries" -msgstr "zapisi u logovima" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "i" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Nije bilo izmjena polja." - -msgid "None" -msgstr "Nijedan" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Predmeti moraju biti izabrani da bi se mogla obaviti akcija nad njima. " -"Nijedan predmet nije bio izmjenjen." - -msgid "No action selected." -msgstr "Nijedna akcija nije izabrana." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Objekat „%(obj)s“ klase %(name)s obrisan je uspješno." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Dodaj objekat klase %s" - -#, python-format -msgid "Change %s" -msgstr "Izmjeni objekat klase %s" - -msgid "Database error" -msgstr "Greška u bazi podataka" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 od %(cnt)s izabrani" - -#, python-format -msgid "Change history: %s" -msgstr "Historijat izmjena: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Django administracija sajta" - -msgid "Django administration" -msgstr "Django administracija" - -msgid "Site administration" -msgstr "Administracija sistema" - -msgid "Log in" -msgstr "Prijava" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Stranica nije pronađena" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Žao nam je, tražena stranica nije pronađena." - -msgid "Home" -msgstr "Početna" - -msgid "Server error" -msgstr "Greška na serveru" - -msgid "Server error (500)" -msgstr "Greška na serveru (500)" - -msgid "Server Error (500)" -msgstr "Greška na serveru (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Pokreni odabranu radnju" - -msgid "Go" -msgstr "Počni" - -msgid "Click here to select the objects across all pages" -msgstr "Kliknite ovdje da izaberete objekte preko svih stranica" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Izaberite svih %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Izbrišite izbor" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Prvo unesite korisničko ime i lozinku. Potom ćete moći da mijenjate još " -"korisničkih podešavanja." - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "Promjena lozinke" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Unesite novu lozinku za korisnika %(username)s." - -msgid "Welcome," -msgstr "Dobrodošli," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Odjava" - -#, python-format -msgid "Add %(name)s" -msgstr "Dodaj objekat klase %(name)s" - -msgid "History" -msgstr "Historijat" - -msgid "View on site" -msgstr "Pregled na sajtu" - -msgid "Filter" -msgstr "Filter" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Obriši" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Uklanjanje %(object_name)s „%(escaped_object)s“ povlači uklanjanje svih " -"objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za " -"brisanje slijedećih tipova objekata:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Da li ste sigurni da želite da obrišete %(object_name)s " -"„%(escaped_object)s“? Slijedeći objekti koji su u vezi sa ovim objektom će " -"također biti obrisani:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Da, siguran sam" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Brisanje više objekata" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "Izmjeni" - -msgid "Delete?" -msgstr "Brisanje?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Dodaj" - -msgid "You don't have permission to edit anything." -msgstr "Nemate dozvole da unosite bilo kakve izmjene." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Nema podataka" - -msgid "Unknown content" -msgstr "Nepoznat sadržaj" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Nešto nije uredu sa vašom bazom podataka. Provjerite da li postoje " -"odgovarajuće tabele i da li odgovarajući korisnik ima pristup bazi." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "Datum/vrijeme" - -msgid "User" -msgstr "Korisnik" - -msgid "Action" -msgstr "Radnja" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Ovaj objekat nema zabilježen historijat izmjena. Vjerovatno nije dodan kroz " -"ovaj sajt za administraciju." - -msgid "Show all" -msgstr "Prikaži sve" - -msgid "Save" -msgstr "Sačuvaj" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Pretraga" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "ukupno %(full_result_count)s" - -msgid "Save as new" -msgstr "Sačuvaj kao novi" - -msgid "Save and add another" -msgstr "Sačuvaj i dodaj slijedeći" - -msgid "Save and continue editing" -msgstr "Sačuvaj i nastavi sa izmjenama" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Hvala što ste danas proveli vrijeme na ovom sajtu." - -msgid "Log in again" -msgstr "Ponovna prijava" - -msgid "Password change" -msgstr "Izmjena lozinke" - -msgid "Your password was changed." -msgstr "Vaša lozinka je izmjenjena." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Iz bezbjednosnih razloga prvo unesite svoju staru lozinku, a novu zatim " -"unesite dva puta da bismo mogli da provjerimo da li ste je pravilno unijeli." - -msgid "Change my password" -msgstr "Izmijeni moju lozinku" - -msgid "Password reset" -msgstr "Resetovanje lozinke" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaša lozinka je postavljena. Možete se prijaviti." - -msgid "Password reset confirmation" -msgstr "Potvrda resetovanja lozinke" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Unesite novu lozinku dva puta kako bismo mogli da provjerimo da li ste je " -"pravilno unijeli." - -msgid "New password:" -msgstr "Nova lozinka:" - -msgid "Confirm password:" -msgstr "Potvrda lozinke:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Link za resetovanje lozinke nije važeći, vjerovatno zato što je već " -"iskorišćen. Ponovo zatražite resetovanje lozinke." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "Idite na slijedeću stranicu i postavite novu lozinku." - -msgid "Your username, in case you've forgotten:" -msgstr "Ukoliko ste zaboravili, vaše korisničko ime:" - -msgid "Thanks for using our site!" -msgstr "Hvala što koristite naš sajt!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Uredništvo sajta %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "Resetuj moju lozinku" - -msgid "All dates" -msgstr "Svi datumi" - -#, python-format -msgid "Select %s" -msgstr "Odaberi objekat klase %s" - -#, python-format -msgid "Select %s to change" -msgstr "Odaberi objekat klase %s za izmjenu" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Vrijeme:" - -msgid "Lookup" -msgstr "Pretraži" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0a373ec..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po deleted file mode 100644 index 4866fd3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,211 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Filip Dupanović , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostupno %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Odaberi sve" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "Ukloni" - -#, javascript-format -msgid "Chosen %s" -msgstr "Odabrani %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Izabran %(sel)s od %(cnt)s" -msgstr[1] "Izabrano %(sel)s od %(cnt)s" -msgstr[2] "Izabrano %(sel)s od %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Imate nespašene izmjene na pojedinim uređenim poljima. Ako pokrenete ovu " -"akciju, te izmjene će biti izgubljene." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Now" -msgstr "" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "Danas" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 46df4b0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index c89550d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,750 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2014-2015,2017,2021 -# Carles Barrobés , 2011-2012,2014 -# duub qnnp, 2015 -# Emilio Carrion, 2022 -# GerardoGa , 2018 -# Gil Obradors Via , 2019 -# Gil Obradors Via , 2019 -# Jannis Leidel , 2011 -# Manel Clos , 2020 -# Marc Compte , 2021 -# Roger Pons , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Emilio Carrion\n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar els %(verbose_name_plural)s seleccionats" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eliminat/s %(count)d %(items)s satisfactòriament." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No es pot esborrar %(name)s" - -msgid "Are you sure?" -msgstr "N'esteu segur?" - -msgid "Administration" -msgstr "Administració" - -msgid "All" -msgstr "Tots" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconegut" - -msgid "Any date" -msgstr "Qualsevol data" - -msgid "Today" -msgstr "Avui" - -msgid "Past 7 days" -msgstr "Últims 7 dies" - -msgid "This month" -msgstr "Aquest mes" - -msgid "This year" -msgstr "Aquest any" - -msgid "No date" -msgstr "Sense data" - -msgid "Has date" -msgstr "Té data" - -msgid "Empty" -msgstr "Buit" - -msgid "Not empty" -msgstr "No buit" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Si us plau, introduïu un %(username)s i contrasenya correctes per un compte " -"de personal. Observeu que ambdós camps són sensibles a majúscules." - -msgid "Action:" -msgstr "Acció:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Afegir un/a altre/a %(verbose_name)s." - -msgid "Remove" -msgstr "Eliminar" - -msgid "Addition" -msgstr "Afegeix" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Supressió" - -msgid "action time" -msgstr "moment de l'acció" - -msgid "user" -msgstr "usuari" - -msgid "content type" -msgstr "tipus de contingut" - -msgid "object id" -msgstr "id de l'objecte" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "'repr' de l'objecte" - -msgid "action flag" -msgstr "indicador de l'acció" - -msgid "change message" -msgstr "missatge del canvi" - -msgid "log entry" -msgstr "entrada del registre" - -msgid "log entries" -msgstr "entrades del registre" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Afegit \"1%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Modificat \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Eliminat \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Objecte entrada del registre" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Afegit {name} \"{object}\"." - -msgid "Added." -msgstr "Afegit." - -msgid "and" -msgstr "i" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Canviat {fields} per {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Canviats {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Eliminat {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Cap camp modificat." - -msgid "None" -msgstr "cap" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Premeu la tecla \"Control\", o \"Command\" en un Mac, per seleccionar més " -"d'un valor." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "El {name} \"{obj}\" fou afegit amb èxit." - -msgid "You may edit it again below." -msgstr "Podeu editar-lo de nou a sota." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"El {name} \"{obj}\" s'ha afegit amb èxit. Podeu afegir un altre {name} a " -"sota." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"El {name} \"{obj}\" fou canviat amb èxit. Podeu editar-lo de nou a sota." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"El {name} \"{obj}\" s'ha afegit amb èxit. Podeu editar-lo de nou a sota." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"El {name} \"{obj}\" fou canviat amb èxit. Podeu afegir un altre {name} a " -"sota." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "El {name} \"{obj}\" fou canviat amb èxit." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Heu de seleccionar els elements per poder realitzar-hi accions. No heu " -"seleccionat cap element." - -msgid "No action selected." -msgstr "No heu seleccionat cap acció." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "El/la %(name)s \"%(obj)s\" s'ha eliminat amb èxit." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s amb ID \"%(key)s\" no existeix. Potser va ser eliminat?" - -#, python-format -msgid "Add %s" -msgstr "Afegir %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "Visualitza %s" - -msgid "Database error" -msgstr "Error de base de dades" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s s'ha modificat amb èxit." -msgstr[1] "%(count)s %(name)s s'han modificat amb èxit." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionat(s)" -msgstr[1] "Tots %(total_count)s seleccionat(s)" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seleccionats" - -#, python-format -msgid "Change history: %s" -msgstr "Modificar històric: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Esborrar %(class_name)s %(instance)s requeriria esborrar els següents " -"objectes relacionats protegits: %(related_objects)s" - -msgid "Django site admin" -msgstr "Lloc administratiu de Django" - -msgid "Django administration" -msgstr "Administració de Django" - -msgid "Site administration" -msgstr "Administració del lloc" - -msgid "Log in" -msgstr "Iniciar sessió" - -#, python-format -msgid "%(app)s administration" -msgstr "Administració de %(app)s" - -msgid "Page not found" -msgstr "No s'ha pogut trobar la pàgina" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Ho sentim, però no s'ha pogut trobar la pàgina sol·licitada" - -msgid "Home" -msgstr "Inici" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error del servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"S'ha produït un error. Se n'ha informat els administradors del lloc per " -"correu electrònic, i hauria d'arreglar-se en breu. Gràcies per la vostra " -"paciència." - -msgid "Run the selected action" -msgstr "Executar l'acció seleccionada" - -msgid "Go" -msgstr "Anar" - -msgid "Click here to select the objects across all pages" -msgstr "Feu clic aquí per seleccionar els objectes a totes les pàgines" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccioneu tots %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Netejar la selecció" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Models en l'aplicació %(name)s" - -msgid "Add" -msgstr "Afegir" - -msgid "View" -msgstr "Visualitza" - -msgid "You don’t have permission to view or edit anything." -msgstr "No teniu permisos per veure o editar" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Primer, entreu un nom d'usuari i una contrasenya. Després podreu editar més " -"opcions de l'usuari." - -msgid "Enter a username and password." -msgstr "Introduïu un nom d'usuari i contrasenya." - -msgid "Change password" -msgstr "Canviar contrasenya" - -msgid "Please correct the error below." -msgstr "Si us plau, corregiu l'error de sota." - -msgid "Please correct the errors below." -msgstr "Si us plau, corregiu els errors mostrats a sota." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Introduïu una contrasenya per l'usuari %(username)s" - -msgid "Welcome," -msgstr "Benvingut/da," - -msgid "View site" -msgstr "Veure lloc" - -msgid "Documentation" -msgstr "Documentació" - -msgid "Log out" -msgstr "Finalitzar sessió" - -#, python-format -msgid "Add %(name)s" -msgstr "Afegir %(name)s" - -msgid "History" -msgstr "Històric" - -msgid "View on site" -msgstr "Veure al lloc" - -msgid "Filter" -msgstr "Filtre" - -msgid "Clear all filters" -msgstr "Netejar tots els filtres" - -msgid "Remove from sorting" -msgstr "Treure de la ordenació" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritat d'ordenació: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Commutar ordenació" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el/la %(object_name)s '%(escaped_object)s' provocaria l'eliminació " -"d'objectes relacionats, però el vostre compte no te permisos per esborrar " -"els tipus d'objecte següents:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Esborrar %(object_name)s '%(escaped_object)s' requeriria esborrar els " -"següents objectes relacionats protegits:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Esteu segurs de voler esborrar els/les %(object_name)s \"%(escaped_object)s" -"\"? S'esborraran els següents elements relacionats:" - -msgid "Objects" -msgstr "Objectes" - -msgid "Yes, I’m sure" -msgstr "Sí, n'estic segur" - -msgid "No, take me back" -msgstr "No, torna endarrere" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objectes" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Esborrar els %(objects_name)s seleccionats faria que s'esborréssin objectes " -"relacionats, però el vostre compte no té permisos per esborrar els següents " -"tipus d'objectes:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Esborrar els %(objects_name)s seleccionats requeriria esborrar els següents " -"objectes relacionats protegits:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"N'esteu segur de voler esborrar els %(objects_name)s seleccionats? " -"S'esborraran tots els objects següents i els seus elements relacionats:" - -msgid "Delete?" -msgstr "Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Per %(filter_title)s " - -msgid "Summary" -msgstr "Resum" - -msgid "Recent actions" -msgstr "Accions recents" - -msgid "My actions" -msgstr "Les meves accions" - -msgid "None available" -msgstr "Cap disponible" - -msgid "Unknown content" -msgstr "Contingut desconegut" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Hi ha algun problema a la instal·lació de la vostra base de dades. Assegureu-" -"vos que s'han creat les taules adients, i que la base de dades és llegible " -"per l'usuari apropiat." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Esteu identificats com a %(username)s, però no esteu autoritzats a accedir a " -"aquesta pàgina. Voleu identificar-vos amb un compte d'usuari diferent?" - -msgid "Forgotten your password or username?" -msgstr "Heu oblidat la vostra contrasenya o nom d'usuari?" - -msgid "Toggle navigation" -msgstr "Canviar mode de navegació" - -msgid "Start typing to filter…" -msgstr "Comença a teclejar per filtrar ..." - -msgid "Filter navigation items" -msgstr "Filtrar els items de navegació" - -msgid "Date/time" -msgstr "Data/hora" - -msgid "User" -msgstr "Usuari" - -msgid "Action" -msgstr "Acció" - -msgid "entry" -msgstr "entrada" - -msgid "entries" -msgstr "entrades" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Aquest objecte no té historial de canvis. Probablement no es va afegir " -"utilitzant aquest lloc administratiu." - -msgid "Show all" -msgstr "Mostrar tots" - -msgid "Save" -msgstr "Desar" - -msgid "Popup closing…" -msgstr "Tancant finestra emergent..." - -msgid "Search" -msgstr "Cerca" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultat" -msgstr[1] "%(counter)s resultats" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s en total" - -msgid "Save as new" -msgstr "Desar com a nou" - -msgid "Save and add another" -msgstr "Desar i afegir-ne un de nou" - -msgid "Save and continue editing" -msgstr "Desar i continuar editant" - -msgid "Save and view" -msgstr "Desa i visualitza" - -msgid "Close" -msgstr "Tanca" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Canvieu el %(model)s seleccionat" - -#, python-format -msgid "Add another %(model)s" -msgstr "Afegeix un altre %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Esborra el %(model)s seleccionat" - -#, python-format -msgid "View selected %(model)s" -msgstr "Vista seleccionada %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Gràcies per dedicar temps de qualitat avui a aquesta web." - -msgid "Log in again" -msgstr "Iniciar sessió de nou" - -msgid "Password change" -msgstr "Canvi de contrasenya" - -msgid "Your password was changed." -msgstr "La seva contrasenya ha estat canviada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Si us plau, introduïu la vostra contrasenya antiga, per seguretat, i tot " -"seguit introduïu la vostra contrasenya nova dues vegades per verificar que " -"l'heu escrita correctament." - -msgid "Change my password" -msgstr "Canviar la meva contrasenya:" - -msgid "Password reset" -msgstr "Restablir contrasenya" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"S'ha canviat la vostra contrasenya. Ara podeu continuar i iniciar sessió." - -msgid "Password reset confirmation" -msgstr "Confirmació de restabliment de contrasenya" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Si us plau, introduïu la vostra nova contrasenya dues vegades, per verificar " -"que l'heu escrita correctament." - -msgid "New password:" -msgstr "Contrasenya nova:" - -msgid "Confirm password:" -msgstr "Confirmar contrasenya:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"L'enllaç de restabliment de contrasenya era invàlid, potser perquè ja s'ha " -"utilitzat. Si us plau, sol·liciteu un nou reestabliment de contrasenya." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Li hem enviat instruccions per establir la seva contrasenya, donat que hi " -"hagi un compte associat al correu introduït. L'hauríeu de rebre en breu." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no rebeu un correu, assegureu-vos que heu introduït l'adreça amb la que " -"us vau registrar, i comproveu la vostra carpeta de \"spam\"." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Heu rebut aquest correu perquè vau sol·licitar restablir la contrasenya per " -"al vostre compte d'usuari a %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Si us plau, aneu a la pàgina següent i escolliu una nova contrasenya:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "El vostre nom d'usuari, en cas que l'hagueu oblidat:" - -msgid "Thanks for using our site!" -msgstr "Gràcies per fer ús del nostre lloc!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "L'equip de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Heu oblidat la vostra contrasenya? Introduïu la vostra adreça de correu " -"electrònic a sota, i us enviarem instruccions per canviar-la." - -msgid "Email address:" -msgstr "Adreça de correu electrònic:" - -msgid "Reset my password" -msgstr "Restablir la meva contrasenya" - -msgid "All dates" -msgstr "Totes les dates" - -#, python-format -msgid "Select %s" -msgstr "Seleccioneu %s" - -#, python-format -msgid "Select %s to change" -msgstr "Seleccioneu %s per modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Selecciona %s per a veure" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Cercar" - -msgid "Currently:" -msgstr "Actualment:" - -msgid "Change:" -msgstr "Canviar:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 44b9c4b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po deleted file mode 100644 index 29795f2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,330 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2017,2021 -# Carles Barrobés , 2011-2012,2014 -# Carlton Gibson , 2023 -# Emilio Carrion, 2022 -# Jannis Leidel , 2011 -# Roger Pons , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Carlton Gibson , 2023\n" -"Language-Team: Catalan (http://app.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s Disponibles" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Aquesta és la llista de %s disponibles. En podeu escollir alguns " -"seleccionant-los a la caixa de sota i fent clic a la fletxa \"Escollir\" " -"entre les dues caixes." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriviu en aquesta caixa per a filtrar la llista de %s disponibles." - -msgid "Filter" -msgstr "Filtre" - -msgid "Choose all" -msgstr "Escollir-los tots" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Feu clic per escollir tots els %s d'un cop." - -msgid "Choose" -msgstr "Escollir" - -msgid "Remove" -msgstr "Eliminar" - -#, javascript-format -msgid "Chosen %s" -msgstr "Escollit %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Aquesta és la llista de %s escollits. En podeu eliminar alguns seleccionant-" -"los a la caixa de sota i fent clic a la fletxa \"Eliminar\" entre les dues " -"caixes." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Escriviu en aquesta caixa per a filtrar la llista de %s seleccionats." - -msgid "Remove all" -msgstr "Esborrar-los tots" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Feu clic per eliminar tots els %s escollits d'un cop." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opcion seleccionada no visible" -msgstr[1] "%s opcions seleccionades no visibles" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionat" -msgstr[1] "%(sel)s of %(cnt)s seleccionats" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Teniu canvis sense desar a camps editables individuals. Si executeu una " -"acció, es perdran aquests canvis no desats." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Has seleccionat una acció, però encara no l'has desat els canvis dels camps " -"individuals. Si us plau clica OK per desar. Necessitaràs tornar a executar " -"l'acció." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Has seleccionat una acció i no has fet cap canvi als camps individuals. " -"Probablement estàs cercant el botó Anar enlloc del botó de Desar." - -msgid "Now" -msgstr "Ara" - -msgid "Midnight" -msgstr "Mitjanit" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Migdia" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Aneu %s hora avançats respecte la hora del servidor." -msgstr[1] "Nota: Aneu %s hores avançats respecte la hora del servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Aneu %s hora endarrerits respecte la hora del servidor." -msgstr[1] "Nota: Aneu %s hores endarrerits respecte la hora del servidor." - -msgid "Choose a Time" -msgstr "Escolliu una hora" - -msgid "Choose a time" -msgstr "Escolliu una hora" - -msgid "Cancel" -msgstr "Cancel·lar" - -msgid "Today" -msgstr "Avui" - -msgid "Choose a Date" -msgstr "Escolliu una data" - -msgid "Yesterday" -msgstr "Ahir" - -msgid "Tomorrow" -msgstr "Demà" - -msgid "January" -msgstr "Gener" - -msgid "February" -msgstr "Febrer" - -msgid "March" -msgstr "Març" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maig" - -msgid "June" -msgstr "Juny" - -msgid "July" -msgstr "Juliol" - -msgid "August" -msgstr "Agost" - -msgid "September" -msgstr "Setembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Novembre" - -msgid "December" -msgstr "Desembre" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Gen" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Oct" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgid "Sunday" -msgstr "Diumenge" - -msgid "Monday" -msgstr "Dilluns" - -msgid "Tuesday" -msgstr "Dimarts" - -msgid "Wednesday" -msgstr "Dimecres" - -msgid "Thursday" -msgstr "Dijous" - -msgid "Friday" -msgstr "Divendres" - -msgid "Saturday" -msgstr "Dissabte" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "dg." - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "dl." - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "dt." - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "dc." - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "dj." - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "dv." - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "ds." - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "X" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Ocultar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index 686f092..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index b3157f5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,792 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abdulla Dlshad, 2023 -# Bakhtawar Barzan, 2021 -# Bakhtawar Barzan, 2021 -# Kosar Tofiq Saeed , 2020 -# pejar hewrami , 2020 -# Swara , 2022,2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: Swara , 2022,2024\n" -"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)sە هەڵبژێردراوەکان بسڕەوە" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "سەرکەوتووانە %(count)d %(items)sی سڕییەوە." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "ناتوانرێت %(name)s بسڕێتەوە" - -msgid "Are you sure?" -msgstr "ئایا تۆ دڵنیایت؟" - -msgid "Administration" -msgstr "بەڕێوەبەرایەتی" - -msgid "All" -msgstr "هەمووی" - -msgid "Yes" -msgstr "بەڵێ" - -msgid "No" -msgstr "نەخێر" - -msgid "Unknown" -msgstr "نەزانراو" - -msgid "Any date" -msgstr "هەر بەروارێک" - -msgid "Today" -msgstr "ئەمڕۆ" - -msgid "Past 7 days" -msgstr "7 ڕۆژی ڕابردوو" - -msgid "This month" -msgstr "ئەم مانگە" - -msgid "This year" -msgstr "ئەمساڵ" - -msgid "No date" -msgstr "بەروار نییە" - -msgid "Has date" -msgstr "بەرواری هەیە" - -msgid "Empty" -msgstr "بەتاڵ" - -msgid "Not empty" -msgstr "بەتاڵ نییە" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"تکایە %(username)s و تێپەڕەوشە دروستەکە بنوسە بۆ هەژمارێکی ستاف. تێبینی بکە " -"لەوانەیە هەردوو خانەکە دۆخی هەستیار بێت بۆ پیتەکان." - -msgid "Action:" -msgstr "کردار:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "زیادکردنی %(verbose_name)sی تر" - -msgid "Remove" -msgstr "لابردن" - -msgid "Addition" -msgstr "خستنەسەر" - -msgid "Change" -msgstr "گۆڕین" - -msgid "Deletion" -msgstr "سڕینەوە" - -msgid "action time" -msgstr "کاتی کردار" - -msgid "user" -msgstr "بەکارهێنەر" - -msgid "content type" -msgstr "جۆری ناوەڕۆک" - -msgid "object id" -msgstr "ناسنامەی ئۆبجێکت" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "نوێنەرایەتی ئۆبجێکت" - -msgid "action flag" -msgstr "ئاڵای کردار" - -msgid "change message" -msgstr "گۆڕینی پەیام" - -msgid "log entry" -msgstr "ڕاپۆرتی تۆمار" - -msgid "log entries" -msgstr "ڕاپۆرتی تۆمارەکان" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\"ی زیادکرد." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\"— %(changes)s گۆڕدرا" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" سڕایەوە." - -msgid "LogEntry Object" -msgstr "ئۆبجێکتی ڕاپۆرتی تۆمار" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} \"{object}\" زیادکرا." - -msgid "Added." -msgstr "زیادکرا." - -msgid "and" -msgstr "و" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} بۆ {name} “{object}” گۆڕدرا." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} گۆڕدرا." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” سڕایەوە." - -msgid "No fields changed." -msgstr "هیچ خانەیەک نەگۆڕاوە." - -msgid "None" -msgstr "هیچ" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"پەنجە داگرە لەسەر “Control”، یاخود “Command” لەسەر ماک، بۆ هەڵبژاردنی " -"دانەیەک زیاتر." - -msgid "Select this object for an action - {}" -msgstr "ئەم تەنە هەڵبژێرە بۆ کردارێک - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” بەسەرکەوتوویی زیادکرا." - -msgid "You may edit it again below." -msgstr "دەگونجێت تۆ دووبارە لەخوارەوە دەستکاری بکەیت." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” بەسەرکەوتوویی زیادکرا. دەگونجێت تۆ لە خوارەوە {name}یەکی تر " -"زیادبکەیت." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” بەسەرکەوتوویی گۆڕدرا. دەگونجێت تۆ لە خوارەوە دووبارە دەستکاری " -"بکەیتەوە." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” بەسەرکەوتوویی گۆڕدرا. دەگونجێت تۆ لە خوارەوە {name}یەکی تر " -"زیاد بکەیت." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name}ی “{obj}” بەسەرکەوتوویی گۆڕدرا." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"دەبێت بڕگەکان هەڵبژێردرابن تاوەکو کرداریان لەسەر ئەنجام بدەیت. هیچ بڕگەیەک " -"نەگۆڕدراوە." - -msgid "No action selected." -msgstr "هیچ کردارێک هەڵنەبژێردراوە." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s\"%(obj)s\" بەسەرکەوتوویی سڕدرایەوە." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s بە ناسنامەی \"%(key)s\" بوونی نییە. لەوانەیە سڕدرابێتەوە؟" - -#, python-format -msgid "Add %s" -msgstr "زیادکردنی %s" - -#, python-format -msgid "Change %s" -msgstr "گۆڕینی %s" - -#, python-format -msgid "View %s" -msgstr "بینینی %s" - -msgid "Database error" -msgstr "هەڵەی بنکەدراوە" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s بەسەرکەوتوویی گۆڕدرا." -msgstr[1] "%(count)s %(name)s بەسەرکەوتوویی گۆڕدران." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s هەڵبژێردراوە" -msgstr[1] "هەمووی %(total_count)s هەڵبژێردراون" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 لە %(cnt)s هەڵبژێردراوە" - -#, python-format -msgid "Change history: %s" -msgstr "مێژووی گۆڕین: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(instance)sی %(class_name)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"سڕینەوەی %(instance)sی %(class_name)s پێویستی بە سڕینەوەی ئەم ئۆبجێکتە " -"پەیوەندیدارە پارێزراوانەیە: %(related_objects)s" - -msgid "Django site admin" -msgstr "بەڕێوەبەری پێگەی جەنگۆ" - -msgid "Django administration" -msgstr "بەڕێوەبەرایەتی جەنگۆ" - -msgid "Site administration" -msgstr "بەڕێوەبەرایەتی پێگە" - -msgid "Log in" -msgstr "چوونەژوورەوە" - -#, python-format -msgid "%(app)s administration" -msgstr "بەڕێوەبەرایەتی %(app)s" - -msgid "Page not found" -msgstr "پەڕە نەدۆزرایەوە" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "داوای لێبوردن ئەکەین، بەڵام ناتوانرێت پەڕەی داواکراو بدۆزرێتەوە." - -msgid "Home" -msgstr "ماڵەوە" - -msgid "Server error" -msgstr "هەڵەی ڕاژەکار" - -msgid "Server error (500)" -msgstr "هەڵەی ڕاژەکار (500)" - -msgid "Server Error (500)" -msgstr "هەڵەی ڕاژەکار (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"هەڵەیەک بوونی هەبووە. ڕاپۆرت دراوە بە پێگەی بەڕێوەبەرایەتی لەڕێی ئیمەیڵەوە و " -"دەبێت بەزوویی چاکبکرێت. سوپاس بۆ ئارامگرتنت." - -msgid "Run the selected action" -msgstr "کرداری هەڵبژێردراو جێبەجێ بکە" - -msgid "Go" -msgstr "بڕۆ" - -msgid "Click here to select the objects across all pages" -msgstr "کرتە لێرە بکە بۆ هەڵبژاردنی ئۆبجێکتەکان لە تەواوی هەموو پەڕەکان" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "هەموو %(total_count)s %(module_name)s هەڵبژێرە" - -msgid "Clear selection" -msgstr "پاککردنەوەی هەڵبژاردن" - -msgid "Breadcrumbs" -msgstr "وردەنان" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "مۆدێلەکان لە بەرنامەی %(name)s" - -msgid "Add" -msgstr "زیادکردن" - -msgid "View" -msgstr "بینین" - -msgid "You don’t have permission to view or edit anything." -msgstr "تۆ ڕێگەپێدراو نیت بۆ بینین یان دەستکاری هیچ شتێک." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"سەرەتا، ناوی بەکارهێنەر و تێپەڕەوشە بنوسە. پاشان دەتوانیت دەستکاری زیاتری " -"هەڵبژاردنەکانی بەکارهێنەر بکەیت." - -msgid "Enter a username and password." -msgstr "ناوی بەکارهێنەر و تێپەڕەوشە بنوسە" - -msgid "Change password" -msgstr "گۆڕینی تێپەڕەوشە" - -msgid "Set password" -msgstr "دانانی تێپەڕەوشە" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "تکایە ئەم هەڵەیەی خوارەوە ڕاست بکەرەوە." -msgstr[1] "تکایە هەڵەکانی خوارەوە ڕاست بکەرەوە." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "تێپەڕەوشەی نوێ بۆ بەکارهێنەری %(username)s بنوسە" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"ئەم کردارە چالاک دەکات لەسەر بنەمای تێپەڕەوشەی ئەم " -"بەکارهێنەرە." - -msgid "Disable password-based authentication" -msgstr "ناچالاککردنی ڕەسەنایەتی لەسەر بنەمای تێپەڕەوشە" - -msgid "Enable password-based authentication" -msgstr "چالاککردنی ڕەسەنایەتی لەسەر بنەمای تێپەڕەوشە" - -msgid "Skip to main content" -msgstr "تێیپەڕێنە بۆ ناوەڕۆکی سەرەکی" - -msgid "Welcome," -msgstr "بەخێربێیت،" - -msgid "View site" -msgstr "بینینی پێگە" - -msgid "Documentation" -msgstr "بەڵگەنامە" - -msgid "Log out" -msgstr "چوونەدەرەوە" - -#, python-format -msgid "Add %(name)s" -msgstr "زیادکردنی %(name)s" - -msgid "History" -msgstr "مێژوو" - -msgid "View on site" -msgstr "بینین لەسەر پێگە" - -msgid "Filter" -msgstr "پاڵاوتن" - -msgid "Hide counts" -msgstr "ژماردن بشارەوە" - -msgid "Show counts" -msgstr "ژماردن پیشانبدە" - -msgid "Clear all filters" -msgstr "پاکردنەوەی هەموو پاڵاوتنەکان" - -msgid "Remove from sorting" -msgstr "لابردن لە ڕیزکردن" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "ڕیزکردنی لە پێشینە: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "ڕیزکردنی پێچەوانە" - -msgid "Toggle theme (current theme: auto)" -msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: خۆکار)" - -msgid "Toggle theme (current theme: light)" -msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: ڕووناک)" - -msgid "Toggle theme (current theme: dark)" -msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: تاریک)" - -msgid "Delete" -msgstr "سڕینەوە" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"سڕینەوەی %(object_name)s ‘%(escaped_object)s‘ دەبێتە هۆی سڕینەوەی ئۆبجێکتی " -"پەیوەندیدار، بەڵام هەژمارەکەت ڕێگەپێدراو نییە بۆ سڕینەوەی ئەم جۆرە " -"ئۆبجێکتانەی تر:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"سڕینەوەی %(object_name)sی ‘%(escaped_object)s‘ پێویستیی بە سڕینەوەی ئەم " -"ئۆبجێکتە پەیوەندیدارە پارێزراوانەیە:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"ئایا تۆ دڵنیایت کە دەتەوێت %(object_name)sی \"%(escaped_object)s\" بسڕیتەوە؟ " -"هەموو ئەم ئۆبجێکتە پەیوەندیدارانەش دەسڕێتەوە:" - -msgid "Objects" -msgstr "ئۆبجێکتەکان" - -msgid "Yes, I’m sure" -msgstr "بەڵێ، من دڵنیام" - -msgid "No, take me back" -msgstr "نەخێر، من بگەڕێنەرەوە دواوە" - -msgid "Delete multiple objects" -msgstr "سڕینەوەی چەندین ئۆبجێکت" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"سڕینەوەی %(objects_name)sی هەڵبژێردراو دەبێتە هۆی سڕینەوەی ئۆبجێکتی " -"پەیوەندیدار، بەڵام هەژمارەکەت ڕێگەپێدراو نییە بۆ سڕینەوەی ئەم جۆرە " -"ئۆبجێکتانەی تر:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"سڕینەوەی %(objects_name)sی هەڵبژێردراو پێویستیی بە سڕینەوەی ئەم ئۆبجێکتە " -"پەیوەندیدارە پارێزراوانەیە:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"ئایا تۆ دڵنیایت دەتەوێت %(objects_name)sی هەڵبژێردراو بسڕیتەوە؟ هەموو ئەم " -"ئۆبجێکت و بڕگە پەیوەندیدارەکانیان دەسڕێنەوە:" - -msgid "Delete?" -msgstr "سڕینەوە؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr "بەپێی %(filter_title)s" - -msgid "Summary" -msgstr "پوختە" - -msgid "Recent actions" -msgstr "کردارە نوێیەکان" - -msgid "My actions" -msgstr "کردارەکانم" - -msgid "None available" -msgstr "هیچ شتيک بەردەست نییە" - -msgid "Added:" -msgstr "زیادکرا:" - -msgid "Changed:" -msgstr "گۆڕدرا:" - -msgid "Deleted:" -msgstr "سڕایەوە:" - -msgid "Unknown content" -msgstr "ناوەڕۆکی نەزانراو" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"هەڵەیەک هەیە لە دامەزراندنی بنکەدراوەکەت. دڵنیاببەرەوە لەوەی خشتە گونجاوەکان " -"دروستکراون، دڵنیاببەرەوە بنکەدراوەکە ئەخوێندرێتەوە لەلایەن بەکارهێنەری " -"گونجاوەوە." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"تۆ ڕەسەنایەتیت هەیە وەکو %(username)s, بەڵام ڕێگەپێدراو نیت بۆ ئەم لاپەڕەیە. " -"دەتەوێت بە هەژمارێکی تر بچیتەژوورەوە؟" - -msgid "Forgotten your password or username?" -msgstr "تێپەڕەوشە یان ناوی بەکارهێنەرەکەت بیرچۆتەوە؟" - -msgid "Toggle navigation" -msgstr "کردنەوەو داخستنی ڕێنیشاندەر" - -msgid "Sidebar" -msgstr "شریتی لاتەنیشت" - -msgid "Start typing to filter…" -msgstr "دەست بکە بە نوسین بۆ پاڵاوتن..." - -msgid "Filter navigation items" -msgstr "بڕگەکانی ڕێنیشاندەر بپاڵێوە" - -msgid "Date/time" -msgstr "بەروار/کات" - -msgid "User" -msgstr "بەکارهێنەر" - -msgid "Action" -msgstr "کردار" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "تۆمار" -msgstr[1] "تۆمارەکان" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"ئەم ئۆبجێکتە مێژووی گۆڕانکاری نییە. ڕەنگە لە ڕێگەی بەڕێەوەبەری ئەم پێگەیەوە " -"زیادنەکرابێت." - -msgid "Show all" -msgstr "پیشاندانی هەمووی" - -msgid "Save" -msgstr "پاشەکەوتکردن" - -msgid "Popup closing…" -msgstr "پەنجەرەکە دادەخرێت..." - -msgid "Search" -msgstr "گەڕان" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s ئەنجام" -msgstr[1] "%(counter)s ئەنجام" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)sگشتی" - -msgid "Save as new" -msgstr "پاشەکەوتکردن وەک نوێ" - -msgid "Save and add another" -msgstr "پاشەکەوتی بکەو دانەیەکی تر زیاد بکە" - -msgid "Save and continue editing" -msgstr "پاشەکەوتی بکەو بەردەوامبە لە گۆڕنکاری" - -msgid "Save and view" -msgstr "پاشەکەوتی بکەو پیشانی بدە" - -msgid "Close" -msgstr "داخستن" - -#, python-format -msgid "Change selected %(model)s" -msgstr "هەڵبژێردراوەکان بگۆڕە %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "زیادکردنی %(model)sی تر" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "هەڵبژێردراوەکان بسڕەوە %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "سەیری %(model)s هەڵبژێردراوەکان بکە" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "سوپاس بۆ بەسەربردنی هەندێک کاتێکی ئەمڕۆ لەگەڵ ماڵپەڕەکەدا." - -msgid "Log in again" -msgstr "دووبارە چوونەژوورەوە" - -msgid "Password change" -msgstr "گۆڕینی تێپەڕەوشە" - -msgid "Your password was changed." -msgstr "تێپەڕەوشەت گۆڕدرا." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"لەپێناو پاراستندا تکایە تێپەڕەوشە کۆنەکەت بنووسە، پاشان دووجار تێپەڕەوشە " -"نوێیەکەت بنووسە بۆ ئەوەی بتوانین پشتڕاستی بکەینەوە کە بە دروستی نووسیوتە." - -msgid "Change my password" -msgstr "گۆڕینی تێپەڕەوشەکەم" - -msgid "Password reset" -msgstr "دانانەوەی تێپەڕەوشە" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "تێپەڕەوشەکەت دانرایەوە. لەوانەیە ئێستا بچیتە سەرەوە و بچیتەژوورەوە." - -msgid "Password reset confirmation" -msgstr "دووپاتکردنەوەی دانانەوەی تێپەڕەوشە" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"تکایە دووجار تێپەڕەوشە نوێیەکەت بنوسە، پاشان دەتوانین دڵنیابین کە بە دروستی " -"نوسراوە." - -msgid "New password:" -msgstr "تێپەڕەوشەی نوێ:" - -msgid "Confirm password:" -msgstr "دووپاتکردنەوەی تێپەڕەوشە:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"بەستەری دانانەوەی تێپەڕەوشە نادروست بوو، لەوانەیە لەبەر ئەوەی پێشتر " -"بەکارهاتووە. تکایە داوای دانانەوەی تێپەڕەوشەی نوێ بکە." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"ئێمە ڕێنماییەکانمان بۆ دانانی تێپەڕەوشەکەت ئیمەیڵ بۆت ناردووە، ئەگەر " -"هەژمارێک هەبێت لەگەڵ ئەو ئیمەیڵەی کە نوسیوتە. پێویستە بەم زووانە بەدەستت " -"بگات." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"ئەگەر تۆ نامەی ئەلیکترۆنیت بەدەست نەگەیشت، ئەوا دڵنیا ببەرەوە کە تۆ ئەو " -"ناونیشانەت داخڵکردووە کە پێی تۆمار بوویت، وە فۆڵدەری سپامەکەت بپشکنە." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"تۆ ئەم نامە ئەلیکترۆنیەت بەدەست گەیشتووە لەبەرئەوەی داواکاری دوبارە " -"دانانەوەی تێپەڕە ووشەت کردبوو بۆ هەژماری بەکارهێنەرەکەت لە %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "تکایە بڕۆ بۆ پەڕەی دیاریکراو و تێپەڕەوشەیەکی نوێ هەڵبژێرە:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "ناوی بەکارهێنەری تۆ، لە کاتێکدا بیرت چووبێتەوە:" - -msgid "Thanks for using our site!" -msgstr "سوپاس بۆ بەکارهێنانی پێگەکەمان!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "دەستەی %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"تێپەڕەوشەکەت بیرچووەتەوە؟ ئیمەیڵەکەت لەخوارەوە بنوسە، پاشان ئێمە ئێمەیڵی " -"ڕێنمایت بۆ دەنێرین بۆ دانانی دانەیەکی نوێ." - -msgid "Email address:" -msgstr "ناونیشانی ئیمەیڵ:" - -msgid "Reset my password" -msgstr "دانانەوەی تێپەڕەوشەکەم" - -msgid "Select all objects on this page for an action" -msgstr "هەموو تەنەکان لەم لاپەڕەیە بۆ کردارێک هەڵبژێرە" - -msgid "All dates" -msgstr "هەموو بەروارەکان" - -#, python-format -msgid "Select %s" -msgstr "%s هەڵبژێرە" - -#, python-format -msgid "Select %s to change" -msgstr "%s هەڵبژێرە بۆ گۆڕین" - -#, python-format -msgid "Select %s to view" -msgstr "%s هەڵبژێرە بۆ بینین" - -msgid "Date:" -msgstr "بەروار:" - -msgid "Time:" -msgstr "کات:" - -msgid "Lookup" -msgstr "گەڕان" - -msgid "Currently:" -msgstr "ئێستاکە:" - -msgid "Change:" -msgstr "گۆڕین:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 95cbda7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po deleted file mode 100644 index 23b1fd0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,329 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bakhtawar Barzan, 2021 -# Bakhtawar Barzan, 2021 -# Mariusz Felisiak , 2023 -# Swara , 2022-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2024-01-20 07:59+0000\n" -"Last-Translator: Swara , 2022-2024\n" -"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%sە بەردەستەکان" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"ئەمە لیستی بەردەستی %s . دەتوانیت هەندێکیان هەڵبژێریت بە هەڵبژاردنییان لەم " -"بوخچەی خوارەوە و پاشان کرتەکردن لەسەر ئاراستەی \"هەڵبژێرە\" لە نێوان هەردوو " -"بوخچەکەدا." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "لەم بوخچەدا بنووسە بۆ ئەوەی لیستی بەردەستەکان بپاڵێویت %s." - -msgid "Filter" -msgstr "پاڵاوتن" - -msgid "Choose all" -msgstr "هەمووی هەڵبژێرە" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "کرتە بکە بۆ هەڵبژاردنی هەموو %s بەیەکجار." - -msgid "Choose" -msgstr "‌هەڵبژاردن" - -msgid "Remove" -msgstr "لابردن" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s هەڵبژێردراوەکان" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"ئەمە لیستی هەڵبژێردراوی %s. دەتوانیت هەندێکیان لاببەیت بە هەڵبژاردنییان لەم " -"بوخچەی خوارەوە و پاشان کرتەکردن لەسەر ئاراستەی \"لابردن\" لە نێوان هەردوو " -"بوخچەکەدا." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "لەم بوخچەدا بنووسە بۆ ئەوەی لیستی هەڵبژێردراوەکان بپاڵێویت %s." - -msgid "Remove all" -msgstr "لابردنی هەمووی" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "کرتە بکە بۆ لابردنی هەموو ئەوانەی هەڵبژێردراون %sبە یەکجار." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%sبژاردەی هەڵبژێردراو نابینرێت" -msgstr[1] "%s هەڵبژاردە هەڵبژێردراوەکان نابینرێن" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "‫%(sel)s لە %(cnt)s هەڵبژێردراوە" -msgstr[1] "‫%(sel)s لە %(cnt)s هەڵبژێردراوە" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"گۆڕانکاریی پاشەکەوتنەکراوت هەیە لەسەر خانەی یەکلایەنەی شیاوی دەستکاریی. " -"ئەگەر کردارێک ئەنجام بدەیت، گۆڕانکارییە پاشەکەوتنەکراوەکانت لەدەست دەچن." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"چالاکییەکی هەڵبژێردراوت هەیە، بەڵام خانە تاکلایەنەکانت تا ئێستا پاشەکەوت " -"نەکردووە. تکایە کردتە لەسەر باشە بکە بۆ پاشەکەوتکردن. پێویستە دووبارە " -"چالاکییەکە ئەنجام بدەیتەوە." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"چالاکییەکی هەڵبژێردراوت هەیە، هەروەها هیچ گۆڕانکارییەکت لەسەر خانە " -"تاکلایەنەکانت نیە. ڕەنگە تۆ بەدوای دوگمەی بڕۆدا بگەڕێیت نەک دوگمەی " -"پاشەکەوتکردن." - -msgid "Now" -msgstr "ئێستا" - -msgid "Midnight" -msgstr "نیوەشەو" - -msgid "6 a.m." -msgstr "6ی بەیانی" - -msgid "Noon" -msgstr "نیوەڕۆ" - -msgid "6 p.m." -msgstr "6ی ئێوارە." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "تێبینی: تۆ %s کاتژمێر لەپێش کاتی ڕاژەوەیت." -msgstr[1] "تێبینی: تۆ %s کاتژمێر لەپێش کاتی ڕاژەوەیت." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "تێبینی: تۆ %s کاتژمێر لەدوای کاتی ڕاژەوەیت." -msgstr[1] "تێبینی: تۆ %s کاتژمێر لەدوای کاتی ڕاژەوەیت." - -msgid "Choose a Time" -msgstr "کاتێک دیاریبکە" - -msgid "Choose a time" -msgstr "کاتێک دیاریبکە" - -msgid "Cancel" -msgstr "پاشگەزبوونەوە" - -msgid "Today" -msgstr "ئەمڕۆ" - -msgid "Choose a Date" -msgstr "ڕۆژێک دیاریبکە" - -msgid "Yesterday" -msgstr "دوێنێ" - -msgid "Tomorrow" -msgstr "سبەینێ" - -msgid "January" -msgstr "‎ڕێبەندان" - -msgid "February" -msgstr "‎ڕەشەمە" - -msgid "March" -msgstr "نەورۆز" - -msgid "April" -msgstr "‎گوڵان" - -msgid "May" -msgstr "جۆزەردان" - -msgid "June" -msgstr "‎پوشپەڕ" - -msgid "July" -msgstr "گەلاوێژ " - -msgid "August" -msgstr "‎خەرمانان" - -msgid "September" -msgstr "‎ڕەزبەر" - -msgid "October" -msgstr "‎گەڵاڕێزان" - -msgid "November" -msgstr "‎سەرماوەرز" - -msgid "December" -msgstr "‎بەفرانبار" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "‎ڕێبەندان" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "ڕەشەمە" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "نەورۆز" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "گوڵان" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "‎جۆزەردان" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "پوشپەڕ" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "‎گەلاوێژ" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "خەرمانان" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "‎ڕەزبەر" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "‎گەڵاڕێزان" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "‎سەرماوەرز" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "‎بەفرانبار" - -msgid "Sunday" -msgstr "یەکشەممە" - -msgid "Monday" -msgstr "دووشەممە" - -msgid "Tuesday" -msgstr "سێشەممە" - -msgid "Wednesday" -msgstr "چوارشەممە" - -msgid "Thursday" -msgstr "پێنجشەممە" - -msgid "Friday" -msgstr "هەینی" - -msgid "Saturday" -msgstr "شەممە" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "یەک" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "دوو" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "سێ" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "چوار" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "پێنج" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "هەینی" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "شەم" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "ی" - -msgctxt "one letter Monday" -msgid "M" -msgstr "د" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "س" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "چ" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "پ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "هە" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "ش" - -msgid "Show" -msgstr "پیشاندان" - -msgid "Hide" -msgstr "شاردنەوە" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index 0dc5f9a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index 39c3679..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,803 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Jan Papež , 2024 -# Jiří Podhorecký , 2024 -# Jiří Podhorecký , 2022 -# Jirka Vejrazka , 2011 -# Tomáš Ehrlich , 2015 -# Vláďa Macek , 2013-2014 -# Vláďa Macek , 2015-2020,2022 -# yedpodtrzitko , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:05+0000\n" -"Last-Translator: Jan Papež , 2024\n" -"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Odstranit vybrané položky typu %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Úspěšně odstraněno: %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nelze smazat %(name)s" - -msgid "Are you sure?" -msgstr "Jste si jisti?" - -msgid "Administration" -msgstr "Správa" - -msgid "All" -msgstr "Vše" - -msgid "Yes" -msgstr "Ano" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Neznámé" - -msgid "Any date" -msgstr "Libovolné datum" - -msgid "Today" -msgstr "Dnes" - -msgid "Past 7 days" -msgstr "Posledních 7 dní" - -msgid "This month" -msgstr "Tento měsíc" - -msgid "This year" -msgstr "Tento rok" - -msgid "No date" -msgstr "Bez data" - -msgid "Has date" -msgstr "Má datum" - -msgid "Empty" -msgstr "Prázdná hodnota" - -msgid "Not empty" -msgstr "Neprázdná hodnota" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Zadejte správné %(username)s a heslo pro personál. Obě pole mohou rozlišovat " -"velká a malá písmena." - -msgid "Action:" -msgstr "Operace:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Přidat %(verbose_name)s" - -msgid "Remove" -msgstr "Odebrat" - -msgid "Addition" -msgstr "Přidání" - -msgid "Change" -msgstr "Změnit" - -msgid "Deletion" -msgstr "Odstranění" - -msgid "action time" -msgstr "čas operace" - -msgid "user" -msgstr "uživatel" - -msgid "content type" -msgstr "typ obsahu" - -msgid "object id" -msgstr "id položky" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "reprez. položky" - -msgid "action flag" -msgstr "příznak operace" - -msgid "change message" -msgstr "zpráva o změně" - -msgid "log entry" -msgstr "položka protokolu" - -msgid "log entries" -msgstr "položky protokolu" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Přidán objekt \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Změněn objekt \"%(object)s\" — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Odstraněna položka \"%(object)s\"." - -msgid "LogEntry Object" -msgstr "Objekt záznam v protokolu" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Přidáno: {name} \"{object}\"." - -msgid "Added." -msgstr "Přidáno." - -msgid "and" -msgstr "a" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Změněno: {fields} pro {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Změněno: {fields}" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Odstraněno: {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Nebyla změněna žádná pole." - -msgid "None" -msgstr "Žádný" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Výběr více než jedné položky je možný přidržením klávesy \"Control\", na " -"Macu \"Command\"." - -msgid "Select this object for an action - {}" -msgstr "Vyberte tento objekt pro akci - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Položka typu {name} \"{obj}\" byla úspěšně přidána." - -msgid "You may edit it again below." -msgstr "Níže můžete údaje znovu upravovat." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Položka typu {name} \"{obj}\" byla úspěšně přidána. Níže můžete přidat další " -"položku {name}." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Položka typu {name} \"{obj}\" byla úspěšně změněna. Níže ji můžete dále " -"upravovat." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Položka \"{obj}\" typu {name} byla úspěšně změněna. Níže můžete přidat další " -"položku {name}." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Položka \"{obj}\" typu {name} byla úspěšně změněna." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"K provedení hromadných operací je třeba vybrat nějaké položky. Nedošlo k " -"žádným změnám." - -msgid "No action selected." -msgstr "Nebyla vybrána žádná operace." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Položka \"%(obj)s\" typu %(name)s byla úspěšně odstraněna." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "Objekt %(name)s s klíčem \"%(key)s\" neexistuje. Možná byl odstraněn." - -#, python-format -msgid "Add %s" -msgstr "%s: přidat" - -#, python-format -msgid "Change %s" -msgstr "%s: změnit" - -#, python-format -msgid "View %s" -msgstr "Zobrazit %s" - -msgid "Database error" -msgstr "Chyba databáze" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Položka %(name)s byla úspěšně změněna." -msgstr[1] "%(count)s položky %(name)s byly úspěšně změněny." -msgstr[2] "%(count)s položek %(name)s bylo úspěšně změněno." -msgstr[3] "%(count)s položek %(name)s bylo úspěšně změněno." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s položka vybrána." -msgstr[1] "Všechny %(total_count)s položky vybrány." -msgstr[2] "Vybráno všech %(total_count)s položek." -msgstr[3] "Vybráno všech %(total_count)s položek." - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Vybraných je 0 položek z celkem %(cnt)s." - -#, python-format -msgid "Change history: %s" -msgstr "Historie změn: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s: %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Odstranění položky \"%(instance)s\" typu %(class_name)s by vyžadovalo " -"odstranění těchto souvisejících chráněných položek: %(related_objects)s" - -msgid "Django site admin" -msgstr "Správa webu Django" - -msgid "Django administration" -msgstr "Správa systému Django" - -msgid "Site administration" -msgstr "Správa webu" - -msgid "Log in" -msgstr "Přihlášení" - -#, python-format -msgid "%(app)s administration" -msgstr "Správa aplikace %(app)s" - -msgid "Page not found" -msgstr "Stránka nenalezena" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Požadovaná stránka nebyla bohužel nalezena." - -msgid "Home" -msgstr "Domů" - -msgid "Server error" -msgstr "Chyba serveru" - -msgid "Server error (500)" -msgstr "Chyba serveru (500)" - -msgid "Server Error (500)" -msgstr "Chyba serveru (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"V systému došlo k chybě. Byla e-mailem nahlášena správcům, kteří by ji měli " -"v krátké době opravit. Děkujeme za trpělivost." - -msgid "Run the selected action" -msgstr "Provést vybranou operaci" - -msgid "Go" -msgstr "Provést" - -msgid "Click here to select the objects across all pages" -msgstr "Klepnutím zde vyberete položky ze všech stránek." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Vybrat všechny položky typu %(module_name)s, celkem %(total_count)s." - -msgid "Clear selection" -msgstr "Zrušit výběr" - -msgid "Breadcrumbs" -msgstr "Drobečky" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modely v aplikaci %(name)s" - -msgid "Add" -msgstr "Přidat" - -msgid "View" -msgstr "Zobrazit" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nemáte oprávnění k zobrazení ani úpravám." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Nejdříve zadejte uživatelské jméno a heslo. Poté budete moci upravovat více " -"uživatelských nastavení." - -msgid "Enter a username and password." -msgstr "Zadejte uživatelské jméno a heslo." - -msgid "Change password" -msgstr "Změnit heslo" - -msgid "Set password" -msgstr "Nastavit heslo" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Opravte prosím níže uvedenou chybu." -msgstr[1] "Opravte prosím níže uvedené chyby." -msgstr[2] "Opravte prosím níže uvedené chyby." -msgstr[3] "Opravte prosím níže uvedené chyby." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Zadejte nové heslo pro uživatele %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Tato akce povolí pro tohoto uživatele ověřování na základě " -"hesla." - -msgid "Disable password-based authentication" -msgstr "Zakázat ověřování pomocí hesla" - -msgid "Enable password-based authentication" -msgstr "Povolit ověřování pomocí hesla" - -msgid "Skip to main content" -msgstr "Přeskočit na hlavní obsah" - -msgid "Welcome," -msgstr "Vítejte, uživateli" - -msgid "View site" -msgstr "Zobrazení webu" - -msgid "Documentation" -msgstr "Dokumentace" - -msgid "Log out" -msgstr "Odhlásit se" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s: přidat" - -msgid "History" -msgstr "Historie" - -msgid "View on site" -msgstr "Zobrazení na webu" - -msgid "Filter" -msgstr "Filtr" - -msgid "Hide counts" -msgstr "Skrýt počty" - -msgid "Show counts" -msgstr "Zobrazit počty" - -msgid "Clear all filters" -msgstr "Zrušit všechny filtry" - -msgid "Remove from sorting" -msgstr "Přestat řadit" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Priorita řazení: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Přehodit řazení" - -msgid "Toggle theme (current theme: auto)" -msgstr "Přepnout motiv (aktuální motiv: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Přepnout motiv (aktuální motiv: světlý)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Přepnout motiv (aktuální motiv: tmavý)" - -msgid "Delete" -msgstr "Odstranit" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Odstranění položky \"%(escaped_object)s\" typu %(object_name)s by vyústilo v " -"odstranění souvisejících položek. Nemáte však oprávnění k odstranění položek " -"následujících typů:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Odstranění položky '%(escaped_object)s' typu %(object_name)s by vyžadovalo " -"odstranění souvisejících chráněných položek:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Opravdu má být odstraněna položka \"%(escaped_object)s\" typu " -"%(object_name)s? Následující související položky budou všechny odstraněny:" - -msgid "Objects" -msgstr "Objekty" - -msgid "Yes, I’m sure" -msgstr "Ano, jsem si jist(a)" - -msgid "No, take me back" -msgstr "Ne, beru zpět" - -msgid "Delete multiple objects" -msgstr "Odstranit vybrané položky" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Odstranění položky typu %(objects_name)s by vyústilo v odstranění " -"souvisejících položek. Nemáte však oprávnění k odstranění položek " -"následujících typů:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Odstranění vybrané položky typu %(objects_name)s by vyžadovalo odstranění " -"následujících souvisejících chráněných položek:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Opravdu má být odstraněny vybrané položky typu %(objects_name)s? Všechny " -"vybrané a s nimi související položky budou odstraněny:" - -msgid "Delete?" -msgstr "Odstranit?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Dle: %(filter_title)s " - -msgid "Summary" -msgstr "Shrnutí" - -msgid "Recent actions" -msgstr "Nedávné akce" - -msgid "My actions" -msgstr "Moje akce" - -msgid "None available" -msgstr "Nic" - -msgid "Added:" -msgstr "Přidáno:" - -msgid "Changed:" -msgstr "Změněno:" - -msgid "Deleted:" -msgstr "Smazáno:" - -msgid "Unknown content" -msgstr "Neznámý obsah" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Potíže s nainstalovanou databází. Ujistěte se, že byly vytvořeny " -"odpovídající tabulky a že databáze je přístupná pro čtení příslušným " -"uživatelem." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Jste přihlášeni jako uživatel %(username)s, ale k této stránce nemáte " -"oprávnění. Chcete se přihlásit k jinému účtu?" - -msgid "Forgotten your password or username?" -msgstr "Zapomněli jste heslo nebo uživatelské jméno?" - -msgid "Toggle navigation" -msgstr "Přehodit navigaci" - -msgid "Sidebar" -msgstr "Boční panel" - -msgid "Start typing to filter…" -msgstr "Filtrovat začnete vepsáním textu..." - -msgid "Filter navigation items" -msgstr "Filtrace položek navigace" - -msgid "Date/time" -msgstr "Datum a čas" - -msgid "User" -msgstr "Uživatel" - -msgid "Action" -msgstr "Operace" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "položka" -msgstr[1] "položky" -msgstr[2] "položek" -msgstr[3] "položek" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Tato položka nemá historii změn. Pravděpodobně nebyla přidána tímto " -"administračním rozhraním." - -msgid "Show all" -msgstr "Zobrazit vše" - -msgid "Save" -msgstr "Uložit" - -msgid "Popup closing…" -msgstr "Vyskakovací okno se zavírá..." - -msgid "Search" -msgstr "Hledat" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s výsledek" -msgstr[1] "%(counter)s výsledky" -msgstr[2] "%(counter)s výsledků" -msgstr[3] "%(counter)s výsledků" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Celkem %(full_result_count)s" - -msgid "Save as new" -msgstr "Uložit jako novou položku" - -msgid "Save and add another" -msgstr "Uložit a přidat další položku" - -msgid "Save and continue editing" -msgstr "Uložit a pokračovat v úpravách" - -msgid "Save and view" -msgstr "Uložit a zobrazit" - -msgid "Close" -msgstr "Zavřít" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Změnit vybrané položky typu %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Přidat další %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Odstranit vybrané položky typu %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Zobrazení vybraných %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Děkujeme za dnešní čas strávený s tímto neobyčejným webem." - -msgid "Log in again" -msgstr "Přihlaste se znovu" - -msgid "Password change" -msgstr "Změna hesla" - -msgid "Your password was changed." -msgstr "Vaše heslo bylo změněno." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Zadejte svoje současné heslo a poté dvakrát heslo nové. Omezíme tak možnost " -"překlepu." - -msgid "Change my password" -msgstr "Změnit heslo" - -msgid "Password reset" -msgstr "Obnovení hesla" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaše heslo bylo nastaveno. Nyní se můžete přihlásit." - -msgid "Password reset confirmation" -msgstr "Potvrzení obnovy hesla" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Zadejte dvakrát nové heslo. Tak ověříme, že bylo zadáno správně." - -msgid "New password:" -msgstr "Nové heslo:" - -msgid "Confirm password:" -msgstr "Potvrdit heslo:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Odkaz pro obnovení hesla byl neplatný, možná již byl použit. Požádejte o " -"obnovení hesla znovu." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Návod na nastavení hesla byl odeslán na zadanou e-mailovou adresu, pokud " -"účet s takovou adresou existuje. Měl by za okamžik dorazit." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Pokud e-mail neobdržíte, ujistěte se, že zadaná e-mailová adresa je stejná " -"jako ta registrovaná u vašeho účtu a zkontrolujte složku nevyžádané pošty, " -"tzv. spamu." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Tento e-mail vám byl zaslán na základě vyžádání obnovy hesla vašeho " -"uživatelskému účtu na systému %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Přejděte na následující stránku a zadejte nové heslo:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Pro jistotu vaše uživatelské jméno:" - -msgid "Thanks for using our site!" -msgstr "Děkujeme za používání našeho webu!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Tým aplikace %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Zapomněli jste heslo? Zadejte níže e-mailovou adresu a systém vám odešle " -"postup k nastavení nového." - -msgid "Email address:" -msgstr "E-mailová adresa:" - -msgid "Reset my password" -msgstr "Obnovit heslo" - -msgid "Select all objects on this page for an action" -msgstr "Vyberte všechny objekty na této stránce pro akci" - -msgid "All dates" -msgstr "Všechna data" - -#, python-format -msgid "Select %s" -msgstr "%s: vybrat" - -#, python-format -msgid "Select %s to change" -msgstr "Vyberte položku %s ke změně" - -#, python-format -msgid "Select %s to view" -msgstr "Vyberte položku %s k zobrazení" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Čas:" - -msgid "Lookup" -msgstr "Hledat" - -msgid "Currently:" -msgstr "Aktuálně:" - -msgid "Change:" -msgstr "Změna:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo deleted file mode 100644 index db715bc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1e8fa73..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Jan Papež , 2024 -# Jiří Podhorecký , 2024 -# Jiří Podhorecký , 2022 -# Jirka Vejrazka , 2011 -# Vláďa Macek , 2012,2014 -# Vláďa Macek , 2015-2016,2020-2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:59+0000\n" -"Last-Translator: Jan Papež , 2024\n" -"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostupné položky: %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Seznam dostupných položek %s. Jednotlivě je lze vybrat tak, že na ně v " -"rámečku klepnete a pak klepnete na šipku \"Vybrat\" mezi rámečky." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Chcete-li filtrovat ze seznamu dostupných položek %s, začněte psát do tohoto " -"pole." - -msgid "Filter" -msgstr "Filtr" - -msgid "Choose all" -msgstr "Vybrat vše" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Chcete-li najednou vybrat všechny položky %s, klepněte sem." - -msgid "Choose" -msgstr "Vybrat" - -msgid "Remove" -msgstr "Odebrat" - -#, javascript-format -msgid "Chosen %s" -msgstr "Vybrané položky %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Seznam vybraných položek %s. Jednotlivě je lze odebrat tak, že na ně v " -"rámečku klepnete a pak klepnete na šipku \"Odebrat mezi rámečky." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Zadáním do tohoto pole vyfiltrujete seznam vybraných %s." - -msgid "Remove all" -msgstr "Odebrat vše" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Chcete-li najednou odebrat všechny vybrané položky %s, klepněte sem." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s vybraná volba není viditelná" -msgstr[1] "%s vybrané volby nejsou viditelné" -msgstr[2] "%s vybrané volby nejsou viditelné" -msgstr[3] "%s vybrané volby nejsou viditelné" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Vybrána je %(sel)s položka z celkem %(cnt)s." -msgstr[1] "Vybrány jsou %(sel)s položky z celkem %(cnt)s." -msgstr[2] "Vybraných je %(sel)s položek z celkem %(cnt)s." -msgstr[3] "Vybraných je %(sel)s položek z celkem %(cnt)s." - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"V jednotlivých polích jsou neuložené změny, které budou ztraceny, pokud " -"operaci provedete." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Byla vybrána operace, ale dosud nedošlo k uložení změn jednotlivých polí. " -"Uložíte klepnutím na tlačítko OK. Pak bude třeba operaci spustit znovu." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Byla vybrána operace, ale dosud nedošlo k uložení změn jednotlivých polí. " -"Patrně využijete tlačítko Provést spíše než tlačítko Uložit." - -msgid "Now" -msgstr "Nyní" - -msgid "Midnight" -msgstr "Půlnoc" - -msgid "6 a.m." -msgstr "6h ráno" - -msgid "Noon" -msgstr "Poledne" - -msgid "6 p.m." -msgstr "6h večer" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Poznámka: Váš čas o %s hodinu předstihuje čas na serveru." -msgstr[1] "Poznámka: Váš čas o %s hodiny předstihuje čas na serveru." -msgstr[2] "Poznámka: Váš čas o %s hodiny předstihuje čas na serveru." -msgstr[3] "Poznámka: Váš čas o %s hodin předstihuje čas na serveru." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Poznámka: Váš čas se o %s hodinu zpožďuje za časem na serveru." -msgstr[1] "Poznámka: Váš čas se o %s hodiny zpožďuje za časem na serveru." -msgstr[2] "Poznámka: Váš čas se o %s hodiny zpožďuje za časem na serveru." -msgstr[3] "Poznámka: Váš čas se o %s hodin zpožďuje za časem na serveru." - -msgid "Choose a Time" -msgstr "Vyberte čas" - -msgid "Choose a time" -msgstr "Vyberte čas" - -msgid "Cancel" -msgstr "Storno" - -msgid "Today" -msgstr "Dnes" - -msgid "Choose a Date" -msgstr "Vyberte datum" - -msgid "Yesterday" -msgstr "Včera" - -msgid "Tomorrow" -msgstr "Zítra" - -msgid "January" -msgstr "leden" - -msgid "February" -msgstr "únor" - -msgid "March" -msgstr "březen" - -msgid "April" -msgstr "duben" - -msgid "May" -msgstr "květen" - -msgid "June" -msgstr "červen" - -msgid "July" -msgstr "červenec" - -msgid "August" -msgstr "srpen" - -msgid "September" -msgstr "září" - -msgid "October" -msgstr "říjen" - -msgid "November" -msgstr "listopad" - -msgid "December" -msgstr "prosinec" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Led" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Úno" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Bře" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Dub" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Kvě" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Čvn" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Čvc" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Srp" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Zář" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Říj" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Lis" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Pro" - -msgid "Sunday" -msgstr "Neděle" - -msgid "Monday" -msgstr "Pondělí" - -msgid "Tuesday" -msgstr "Úterý" - -msgid "Wednesday" -msgstr "Středa" - -msgid "Thursday" -msgstr "Čtvrtek" - -msgid "Friday" -msgstr "Pátek" - -msgid "Saturday" -msgstr "Sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Ned" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pon" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Úte" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Stř" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Čtv" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pát" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sob" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "N" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Ú" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "S" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Č" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index e20f6a4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index 82e82f7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,675 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2014 -# pjrobertson, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Dilëwyd %(count)d %(items)s yn llwyddiannus." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ni ellir dileu %(name)s" - -msgid "Are you sure?" -msgstr "Ydych yn sicr?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Dileu y %(verbose_name_plural)s â ddewiswyd" - -msgid "Administration" -msgstr "Gweinyddu" - -msgid "All" -msgstr "Pob un" - -msgid "Yes" -msgstr "Ie" - -msgid "No" -msgstr "Na" - -msgid "Unknown" -msgstr "Anhysybys" - -msgid "Any date" -msgstr "Unrhyw ddyddiad" - -msgid "Today" -msgstr "Heddiw" - -msgid "Past 7 days" -msgstr "7 diwrnod diwethaf" - -msgid "This month" -msgstr "Mis yma" - -msgid "This year" -msgstr "Eleni" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Teipiwch yr %(username)s a chyfrinair cywir ar gyfer cyfrif staff. Noder y " -"gall y ddau faes fod yn sensitif i lythrennau bach a llythrennau bras." - -msgid "Action:" -msgstr "Gweithred:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Ychwanegu %(verbose_name)s arall" - -msgid "Remove" -msgstr "Gwaredu" - -msgid "action time" -msgstr "amser y weithred" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "id gwrthrych" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr gwrthrych" - -msgid "action flag" -msgstr "fflag gweithred" - -msgid "change message" -msgstr "neges y newid" - -msgid "log entry" -msgstr "cofnod" - -msgid "log entries" -msgstr "cofnodion" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Ychwanegwyd \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Newidwyd \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Dilëwyd \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Gwrthrych LogEntry" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "a" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Ni newidwyd unrhwy feysydd." - -msgid "None" -msgstr "Dim" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Rhaid dewis eitemau er mwyn gweithredu arnynt. Ni ddewiswyd unrhyw eitemau." - -msgid "No action selected." -msgstr "Ni ddewiswyd gweithred." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Dilëwyd %(name)s \"%(obj)s\" yn llwyddiannus." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Ychwanegu %s" - -#, python-format -msgid "Change %s" -msgstr "Newid %s" - -msgid "Database error" -msgstr "Gwall cronfa ddata" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Newidwyd %(count)s %(name)s yn llwyddiannus" -msgstr[1] "Newidwyd %(count)s %(name)s yn llwyddiannus" -msgstr[2] "Newidwyd %(count)s %(name)s yn llwyddiannus" -msgstr[3] "Newidwyd %(count)s %(name)s yn llwyddiannus" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Dewiswyd %(total_count)s" -msgstr[1] "Dewiswyd %(total_count)s" -msgstr[2] "Dewiswyd %(total_count)s" -msgstr[3] "Dewiswyd %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Dewiswyd 0 o %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Hanes newid: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Byddai dileu %(class_name)s %(instance)s yn golygu dileu'r gwrthrychau " -"gwarchodedig canlynol sy'n perthyn: %(related_objects)s" - -msgid "Django site admin" -msgstr "Adran weinyddol safle Django" - -msgid "Django administration" -msgstr "Gweinyddu Django" - -msgid "Site administration" -msgstr "Gweinyddu'r safle" - -msgid "Log in" -msgstr "Mewngofnodi" - -#, python-format -msgid "%(app)s administration" -msgstr "Gweinyddu %(app)s" - -msgid "Page not found" -msgstr "Ni ddarganfyddwyd y dudalen" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Mae'n ddrwg gennym, ond ni ddarganfuwyd y dudalen" - -msgid "Home" -msgstr "Hafan" - -msgid "Server error" -msgstr "Gwall gweinydd" - -msgid "Server error (500)" -msgstr "Gwall gweinydd (500)" - -msgid "Server Error (500)" -msgstr "Gwall Gweinydd (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Mae gwall ac gyrrwyd adroddiad ohono i weinyddwyr y wefan drwy ebost a dylai " -"gael ei drwsio yn fuan. Diolch am fod yn amyneddgar." - -msgid "Run the selected action" -msgstr "Rhedeg y weithred a ddewiswyd" - -msgid "Go" -msgstr "Ffwrdd â ni" - -msgid "Click here to select the objects across all pages" -msgstr "" -"Cliciwch fan hyn i ddewis yr holl wrthrychau ar draws yr holl dudalennau" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Dewis y %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Clirio'r dewis" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Yn gyntaf, rhowch enw defnyddiwr a chyfrinair. Yna byddwch yn gallu golygu " -"mwy o ddewisiadau." - -msgid "Enter a username and password." -msgstr "Rhowch enw defnyddiwr a chyfrinair." - -msgid "Change password" -msgstr "Newid cyfrinair" - -msgid "Please correct the error below." -msgstr "Cywirwch y gwall isod." - -msgid "Please correct the errors below." -msgstr "Cywirwch y gwallau isod." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Rhowch gyfrinair newydd i'r defnyddiwr %(username)s." - -msgid "Welcome," -msgstr "Croeso," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Dogfennaeth" - -msgid "Log out" -msgstr "Allgofnodi" - -#, python-format -msgid "Add %(name)s" -msgstr "Ychwanegu %(name)s" - -msgid "History" -msgstr "Hanes" - -msgid "View on site" -msgstr "Gweld ar y safle" - -msgid "Filter" -msgstr "Hidl" - -msgid "Remove from sorting" -msgstr "Gwaredu o'r didoli" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Blaenoriaeth didoli: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toglio didoli" - -msgid "Delete" -msgstr "Dileu" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Byddai dileu %(object_name)s '%(escaped_object)s' yn golygu dileu'r " -"gwrthrychau sy'n perthyn, ond nid oes ganddoch ganiatâd i ddileu y mathau " -"canlynol o wrthrychau:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Byddai dileu %(object_name)s '%(escaped_object)s' yn golygu dileu'r " -"gwrthrychau gwarchodedig canlynol sy'n perthyn:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Ydw, rwy'n sicr" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Byddai dileu %(objects_name)s yn golygu dileu'r gwrthrychau gwarchodedig " -"canlynol sy'n perthyn:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ydych yn sicr eich bod am ddileu'r %(objects_name)s a ddewiswyd? Dilëir yr " -"holl wrthrychau canlynol a'u heitemau perthnasol:" - -msgid "Change" -msgstr "Newid" - -msgid "Delete?" -msgstr "Dileu?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Wrth %(filter_title)s" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelau yn y rhaglen %(name)s " - -msgid "Add" -msgstr "Ychwanegu" - -msgid "You don't have permission to edit anything." -msgstr "Does gennych ddim hawl i olygu unrhywbeth." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Dim ar gael" - -msgid "Unknown content" -msgstr "Cynnwys anhysbys" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Mae rhywbeth o'i le ar osodiad y gronfa ddata. Sicrhewch fod y tablau " -"cronfa ddata priodol wedi eu creu, a sicrhewch fod y gronfa ddata yn " -"ddarllenadwy gan y defnyddiwr priodol." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Anghofioch eich cyfrinair neu enw defnyddiwr?" - -msgid "Date/time" -msgstr "Dyddiad/amser" - -msgid "User" -msgstr "Defnyddiwr" - -msgid "Action" -msgstr "Gweithred" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Does dim hanes newid gan y gwrthrych yma. Mae'n debyg nad ei ychwanegwyd " -"drwy'r safle gweinydd yma." - -msgid "Show all" -msgstr "Dangos pob canlyniad" - -msgid "Save" -msgstr "Cadw" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Chwilio" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s canlyniad" -msgstr[1] "%(counter)s canlyniad" -msgstr[2] "%(counter)s canlyniad" -msgstr[3] "%(counter)s canlyniad" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Cyfanswm o %(full_result_count)s" - -msgid "Save as new" -msgstr "Cadw fel newydd" - -msgid "Save and add another" -msgstr "Cadw ac ychwanegu un arall" - -msgid "Save and continue editing" -msgstr "Cadw a pharhau i olygu" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Diolch am dreulio amser o ansawdd gyda'r safle we yma heddiw." - -msgid "Log in again" -msgstr "Mewngofnodi eto" - -msgid "Password change" -msgstr "Newid cyfrinair" - -msgid "Your password was changed." -msgstr "Newidwyd eich cyfrinair." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Rhowch eich hen gyfrinair, er mwyn diogelwch, ac yna rhowch eich cyfrinair " -"newydd ddwywaith er mwyn gwirio y'i teipiwyd yn gywir." - -msgid "Change my password" -msgstr "Newid fy nghyfrinair" - -msgid "Password reset" -msgstr "Ailosod cyfrinair" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Mae'ch cyfrinair wedi ei osod. Gallwch fewngofnodi nawr." - -msgid "Password reset confirmation" -msgstr "Cadarnhad ailosod cyfrinair" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Rhowch eich cyfrinair newydd ddwywaith er mwyn gwirio y'i teipiwyd yn gywir." - -msgid "New password:" -msgstr "Cyfrinair newydd:" - -msgid "Confirm password:" -msgstr "Cadarnhewch y cyfrinair:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Roedd y ddolen i ailosod y cyfrinair yn annilys, o bosib oherwydd ei fod " -"wedi ei ddefnyddio'n barod. Gofynnwch i ailosod y cyfrinair eto." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Os na dderbyniwch ebost, sicrhewych y rhoddwyd y cyfeiriad sydd wedi ei " -"gofrestru gyda ni, ac edrychwch yn eich ffolder sbam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Derbyniwch yr ebost hwn oherwydd i chi ofyn i ailosod y cyfrinair i'ch " -"cyfrif yn %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Ewch i'r dudalen olynol a dewsiwch gyfrinair newydd:" - -msgid "Your username, in case you've forgotten:" -msgstr "Eich enw defnyddiwr, rhag ofn eich bod wedi anghofio:" - -msgid "Thanks for using our site!" -msgstr "Diolch am ddefnyddio ein safle!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Tîm %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Anghofioch eich cyfrinair? Rhowch eich cyfeiriad ebost isod ac fe ebostiwn " -"gyfarwyddiadau ar osod un newydd." - -msgid "Email address:" -msgstr "Cyfeiriad ebost:" - -msgid "Reset my password" -msgstr "Ailosod fy nghyfrinair" - -msgid "All dates" -msgstr "Holl ddyddiadau" - -#, python-format -msgid "Select %s" -msgstr "Dewis %s" - -#, python-format -msgid "Select %s to change" -msgstr "Dewis %s i newid" - -msgid "Date:" -msgstr "Dyddiad:" - -msgid "Time:" -msgstr "Amser:" - -msgid "Lookup" -msgstr "Archwilio" - -msgid "Currently:" -msgstr "Cyfredol:" - -msgid "Change:" -msgstr "Newid:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo deleted file mode 100644 index ee9a9ca..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po deleted file mode 100644 index fa7ad2a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,222 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s sydd ar gael" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Dyma restr o'r %s sydd ar gael. Gellir dewis rhai drwyeu dewis yn y blwch " -"isod ac yna clicio'r saeth \"Dewis\" rhwng y ddau flwch." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Teipiwch yn y blwch i hidlo'r rhestr o %s sydd ar gael." - -msgid "Filter" -msgstr "Hidl" - -msgid "Choose all" -msgstr "Dewis y cyfan" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Cliciwch i ddewis pob %s yr un pryd." - -msgid "Choose" -msgstr "Dewis" - -msgid "Remove" -msgstr "Gwaredu" - -#, javascript-format -msgid "Chosen %s" -msgstr "Y %s a ddewiswyd" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Dyma restr o'r %s a ddewiswyd. Gellir gwaredu rhai drwy eu dewis yn y blwch " -"isod ac yna clicio'r saeth \"Gwaredu\" rhwng y ddau flwch." - -msgid "Remove all" -msgstr "Gwaredu'r cyfan" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Cliciwch i waredu pob %s sydd wedi ei ddewis yr un pryd." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Dewiswyd %(sel)s o %(cnt)s" -msgstr[1] "Dewiswyd %(sel)s o %(cnt)s" -msgstr[2] "Dewiswyd %(sel)s o %(cnt)s" -msgstr[3] "Dewiswyd %(sel)s o %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Mae ganddoch newidiadau heb eu cadw mewn meysydd golygadwy. Os rhedwch y " -"weithred fe gollwch y newidiadau." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Rydych wedi dewis gweithred ond nid ydych wedi newid eich newidiadau i rai " -"meysydd eto. Cliciwch 'Iawn' i gadw. Bydd rhaid i chi ail-redeg y weithred." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Rydych wedi dewis gweithred ac nid ydych wedi newid unrhyw faes. Rydych " -"siwr o fod yn edrych am y botwm 'Ewch' yn lle'r botwm 'Cadw'." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Noder: Rydych %s awr o flaen amser y gweinydd." -msgstr[1] "Noder: Rydych %s awr o flaen amser y gweinydd." -msgstr[2] "Noder: Rydych %s awr o flaen amser y gweinydd." -msgstr[3] "Noder: Rydych %s awr o flaen amser y gweinydd." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Noder: Rydych %s awr tu ôl amser y gweinydd." -msgstr[1] "Noder: Rydych %s awr tu ôl amser y gweinydd." -msgstr[2] "Noder: Rydych %s awr tu ôl amser y gweinydd." -msgstr[3] "Noder: Rydych %s awr tu ôl amser y gweinydd." - -msgid "Now" -msgstr "Nawr" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Dewiswch amser" - -msgid "Midnight" -msgstr "Canol nos" - -msgid "6 a.m." -msgstr "6 y.b." - -msgid "Noon" -msgstr "Canol dydd" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Diddymu" - -msgid "Today" -msgstr "Heddiw" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Ddoe" - -msgid "Tomorrow" -msgstr "Fory" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Dangos" - -msgid "Hide" -msgstr "Cuddio" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index fa2a896..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index b680931..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,791 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Christian Joergensen , 2012 -# Dimitris Glezos , 2012 -# Erik Ramsgaard Wognsen , 2020-2025 -# Erik Ramsgaard Wognsen , 2013,2015-2020 -# Finn Gruwier Larsen, 2011 -# Jannis Leidel , 2011 -# valberg , 2014-2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Erik Ramsgaard Wognsen , 2020-2025\n" -"Language-Team: Danish (http://app.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Slet valgte %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s blev slettet." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kan ikke slette %(name)s " - -msgid "Delete multiple objects" -msgstr "Slet flere objekter" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "Alle" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nej" - -msgid "Unknown" -msgstr "Ukendt" - -msgid "Any date" -msgstr "Når som helst" - -msgid "Today" -msgstr "I dag" - -msgid "Past 7 days" -msgstr "De sidste 7 dage" - -msgid "This month" -msgstr "Denne måned" - -msgid "This year" -msgstr "Dette år" - -msgid "No date" -msgstr "Ingen dato" - -msgid "Has date" -msgstr "Har dato" - -msgid "Empty" -msgstr "Tom" - -msgid "Not empty" -msgstr "Ikke tom" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Indtast venligst det korrekte %(username)s og adgangskode for en " -"personalekonto. Bemærk at begge felter kan være versalfølsomme." - -msgid "Action:" -msgstr "Handling" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Tilføj endnu en %(verbose_name)s" - -msgid "Remove" -msgstr "Fjern" - -msgid "Addition" -msgstr "Tilføjelse" - -msgid "Change" -msgstr "Ret" - -msgid "Deletion" -msgstr "Sletning" - -msgid "action time" -msgstr "handlingstid" - -msgid "user" -msgstr "bruger" - -msgid "content type" -msgstr "indholdstype" - -msgid "object id" -msgstr "objekt-ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekt repr" - -msgid "action flag" -msgstr "handlingsflag" - -msgid "change message" -msgstr "ændringsmeddelelse" - -msgid "log entry" -msgstr "logmeddelelse" - -msgid "log entries" -msgstr "logmeddelelser" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Tilføjede “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Ændrede “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Slettede “%(object)s”." - -msgid "LogEntry Object" -msgstr "LogEntry-objekt" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Tilføjede {name} “{object}”." - -msgid "Added." -msgstr "Tilføjet." - -msgid "and" -msgstr "og" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Ændrede {fields} for {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Ændrede {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Slettede {name} “{object}”." - -msgid "No fields changed." -msgstr "Ingen felter ændret." - -msgid "None" -msgstr "Ingen" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Hold “Ctrl”, eller “Æbletasten” på Mac, nede for at vælge mere end én." - -msgid "Select this object for an action - {}" -msgstr "Vælg dette objekt for en handling - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” blev tilføjet." - -msgid "You may edit it again below." -msgstr "Du kan redigere den/det igen herunder." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” blev tilføjet. Du kan tilføje endnu en/et {name} herunder." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” blev ændret. Du kan redigere den/det igen herunder." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” blev ændret. Du kan tilføje endnu en/et {name} herunder." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” blev ændret." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Der skal være valgt nogle emner for at man kan udføre handlinger på dem. " -"Ingen emner er blev ændret." - -msgid "No action selected." -msgstr "Ingen handling valgt." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” blev slettet." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s med ID “%(key)s” findes ikke. Måske er objektet blevet slettet?" - -#, python-format -msgid "Add %s" -msgstr "Tilføj %s" - -#, python-format -msgid "Change %s" -msgstr "Ret %s" - -#, python-format -msgid "View %s" -msgstr "Vis %s" - -msgid "Database error" -msgstr "Databasefejl" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s blev ændret." -msgstr[1] "%(count)s %(name)s blev ændret." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s valgt" -msgstr[1] "Alle %(total_count)s valgt" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 af %(cnt)s valgt" - -msgid "Delete" -msgstr "Slet" - -#, python-format -msgid "Change history: %s" -msgstr "Ændringshistorik: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Sletning af %(class_name)s %(instance)s vil kræve sletning af følgende " -"beskyttede relaterede objekter: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django website-administration" - -msgid "Django administration" -msgstr "Django administration" - -msgid "Site administration" -msgstr "Website-administration" - -msgid "Log in" -msgstr "Log ind" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administration" - -msgid "Page not found" -msgstr "Siden blev ikke fundet" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Vi beklager, men den ønskede side kunne ikke findes" - -msgid "Home" -msgstr "Hjem" - -msgid "Server error" -msgstr "Serverfejl" - -msgid "Server error (500)" -msgstr "Serverfejl (500)" - -msgid "Server Error (500)" -msgstr "Serverfejl (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Der opstod en fejl. Fejlen er rapporteret til website-administratoren via e-" -"mail, og vil blive rettet hurtigst muligt. Tak for din tålmodighed." - -msgid "Run the selected action" -msgstr "Udfør den valgte handling" - -msgid "Go" -msgstr "Udfør" - -msgid "Click here to select the objects across all pages" -msgstr "Klik her for at vælge objekter på tværs af alle sider" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Vælg alle %(total_count)s %(module_name)s " - -msgid "Clear selection" -msgstr "Ryd valg" - -msgid "Breadcrumbs" -msgstr "Sti" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeller i applikationen %(name)s" - -msgid "Model name" -msgstr "Modelnavn" - -msgid "Add link" -msgstr "Tilføj link" - -msgid "Change or view list link" -msgstr "Ret eller vis liste-link" - -msgid "Add" -msgstr "Tilføj" - -msgid "View" -msgstr "Vis" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har ikke rettigheder til at se eller redigere noget." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Efter du har oprettet en bruger får du yderligere redigeringsmuligheder." - -msgid "Error:" -msgstr "Fejl:" - -msgid "Change password" -msgstr "Skift adgangskode" - -msgid "Set password" -msgstr "Sæt adgangskode" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Ret venligst fejlen herunder." -msgstr[1] "Ret venligst fejlene herunder." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Indtast en ny adgangskode for brugeren %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Denne handling vil aktivere adgangskodebaseret " -"autentificering for denne bruger." - -msgid "Disable password-based authentication" -msgstr "Deaktivér adgangskodebaseret autentificering." - -msgid "Enable password-based authentication" -msgstr "Aktivér adgangskodebaseret autentificering." - -msgid "Skip to main content" -msgstr "Gå til hovedindhold" - -msgid "Welcome," -msgstr "Velkommen," - -msgid "View site" -msgstr "Se side" - -msgid "Documentation" -msgstr "Dokumentation" - -msgid "Log out" -msgstr "Log ud" - -#, python-format -msgid "Add %(name)s" -msgstr "Tilføj %(name)s" - -msgid "History" -msgstr "Historik" - -msgid "View on site" -msgstr "Se på website" - -msgid "Filter" -msgstr "Filtrer" - -msgid "Hide counts" -msgstr "Skjul antal" - -msgid "Show counts" -msgstr "Vis antal" - -msgid "Clear all filters" -msgstr "Nulstil alle filtre" - -msgid "Remove from sorting" -msgstr "Fjern fra sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteringsprioritet: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Skift sortering" - -msgid "Toggle theme (current theme: auto)" -msgstr "Skift tema (nuværende tema: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Skift tema (nuværende tema: lyst)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Skift tema (nuværende tema: mørkt)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Hvis du sletter %(object_name)s '%(escaped_object)s', vil du også slette " -"relaterede objekter, men din konto har ikke rettigheder til at slette " -"følgende objekttyper:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Sletning af %(object_name)s ' %(escaped_object)s ' vil kræve sletning af " -"følgende beskyttede relaterede objekter:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Er du sikker på du vil slette %(object_name)s \"%(escaped_object)s\"? Alle " -"de følgende relaterede objekter vil blive slettet:" - -msgid "Objects" -msgstr "Objekter" - -msgid "Yes, I’m sure" -msgstr "Ja, jeg er sikker" - -msgid "No, take me back" -msgstr "Nej, tag mig tilbage" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Sletning af de valgte %(objects_name)s ville resultere i sletning af " -"relaterede objekter, men din konto har ikke tilladelse til at slette " -"følgende typer af objekter:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Sletning af de valgte %(objects_name)s vil kræve sletning af følgende " -"beskyttede relaterede objekter:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Er du sikker på du vil slette de valgte %(objects_name)s? Alle de følgende " -"objekter og deres relaterede emner vil blive slettet:" - -msgid "Delete?" -msgstr "Slet?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Efter %(filter_title)s " - -msgid "Summary" -msgstr "Sammendrag" - -msgid "Recent actions" -msgstr "Seneste handlinger" - -msgid "My actions" -msgstr "Mine handlinger" - -msgid "None available" -msgstr "Ingen tilgængelige" - -msgid "Added:" -msgstr "Tilføjede:" - -msgid "Changed:" -msgstr "Ændrede:" - -msgid "Deleted:" -msgstr "Slettede:" - -msgid "Unknown content" -msgstr "Ukendt indhold" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Der er noget galt med databaseinstallationen. Kontroller om " -"databasetabellerne er blevet oprettet og at databasen er læsbar for den " -"pågældende bruger." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Du er logget ind som %(username)s, men du har ikke tilladelse til at tilgå " -"denne site. Vil du logge ind med en anden brugerkonto?" - -msgid "Forgotten your login credentials?" -msgstr "Har du glemt dine login-brugeroplysninger?" - -msgid "Toggle navigation" -msgstr "Vis/skjul navigation" - -msgid "Sidebar" -msgstr "Sidebjælke" - -msgid "Start typing to filter…" -msgstr "Skriv for at filtrere…" - -msgid "Filter navigation items" -msgstr "Filtrer navigationsemner" - -msgid "Date/time" -msgstr "Dato/tid" - -msgid "User" -msgstr "Bruger" - -msgid "Action" -msgstr "Funktion" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "post" -msgstr[1] "poster" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dette objekt har ingen ændringshistorik. Det blev formentlig ikke tilføjet " -"via dette administrations-site" - -msgid "Show all" -msgstr "Vis alle" - -msgid "Save" -msgstr "Gem" - -msgid "Popup closing…" -msgstr "Popup lukker…" - -msgid "Search" -msgstr "Søg" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultat" -msgstr[1] "%(counter)s resultater" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s i alt" - -msgid "Save as new" -msgstr "Gem som ny" - -msgid "Save and add another" -msgstr "Gem og tilføj endnu en" - -msgid "Save and continue editing" -msgstr "Gem og fortsæt med at redigere" - -msgid "Save and view" -msgstr "Gem og vis" - -msgid "Close" -msgstr "Luk" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Redigér valgte %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Tilføj endnu en %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Slet valgte %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Vis valgte %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Tak for den kvalitetstid du brugte på websitet i dag." - -msgid "Log in again" -msgstr "Log ind igen" - -msgid "Password change" -msgstr "Skift adgangskode" - -msgid "Your password was changed." -msgstr "Din adgangskode blev ændret." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Indtast venligst din gamle adgangskode for en sikkerheds skyld og indtast så " -"din nye adgangskode to gange, så vi kan være sikre på, at den er indtastet " -"korrekt." - -msgid "Change my password" -msgstr "Skift min adgangskode" - -msgid "Password reset" -msgstr "Nulstil adgangskode" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Din adgangskode er blevet sat. Du kan logge ind med den nu." - -msgid "Password reset confirmation" -msgstr "Bekræftelse for nulstilling af adgangskode" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Indtast venligst din nye adgangskode to gange, så vi kan være sikre på, at " -"den er indtastet korrekt." - -msgid "New password:" -msgstr "Ny adgangskode:" - -msgid "Confirm password:" -msgstr "Bekræft ny adgangskode:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Linket for nulstilling af adgangskoden er ugyldigt, måske fordi det allerede " -"har været brugt. Anmod venligst påny om nulstilling af adgangskoden." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Vi har sendt dig en e-mail med instruktioner for at indstille din " -"adgangskode, hvis en konto med den angivne e-mail-adresse findes. Du burde " -"modtage den snarest." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Hvis du ikke modtager en e-mail, så tjek venligst, at du har indtastet den e-" -"mail-adresse, du registrerede dig med, og tjek din spam-mappe." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Du modtager denne e-mail, fordi du har anmodet om en nulstilling af " -"adgangskoden til din brugerkonto ved %(site_name)s ." - -msgid "Please go to the following page and choose a new password:" -msgstr "Gå venligst til denne side og vælg en ny adgangskode:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Hvis du har glemt dem, er du:" - -msgid "Thanks for using our site!" -msgstr "Tak fordi du brugte vores website!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Med venlig hilsen %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Har du glemt din adgangskode? Skriv din e-mail-adresse herunder, så sender " -"vi dig instruktioner i at vælge en ny adgangskode." - -msgid "Email address:" -msgstr "E-mail-adresse:" - -msgid "Reset my password" -msgstr "Nulstil min adgangskode" - -msgid "Select all objects on this page for an action" -msgstr "Vælg alle objekter på denne side for en handling" - -msgid "All dates" -msgstr "Alle datoer" - -#, python-format -msgid "Select %s" -msgstr "Vælg %s" - -#, python-format -msgid "Select %s to change" -msgstr "Vælg %s, der skal ændres" - -#, python-format -msgid "Select %s to view" -msgstr "Vælg %s, der skal vises" - -msgid "Date:" -msgstr "Dato:" - -msgid "Time:" -msgstr "Tid:" - -msgid "Lookup" -msgstr "Slå op" - -msgid "Currently:" -msgstr "Nuværende:" - -msgid "Change:" -msgstr "Ændring:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 8137126..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po deleted file mode 100644 index 277034e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,314 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Christian Joergensen , 2012 -# Erik Ramsgaard Wognsen , 2021-2023,2025 -# Erik Ramsgaard Wognsen , 2012,2015-2016,2020 -# Finn Gruwier Larsen, 2011 -# Jannis Leidel , 2011 -# Mathias Rav , 2017 -# valberg , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Erik Ramsgaard Wognsen , 2021-2023,2025\n" -"Language-Team: Danish (http://app.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Tilgængelige %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Udvælg %s ved at vælge dem og så benytte \"Udvælg\" pileknappen." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Skriv i dette felt for at filtrere listen af tilgængelige %s." - -msgid "Filter" -msgstr "Filtrér" - -#, javascript-format -msgid "Choose all %s" -msgstr "Udvælg alle %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Udvælg valgte %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Fjern valgte %s" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valgte %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "Fjern %s ved at vælge dem og så benytte \"Fjern\" pileknappen." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Skriv i dette felt for at filtrere listen af valgte %s." - -msgid "(click to clear)" -msgstr "(klik for at rydde)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Fjern alle %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s valgt mulighed ikke vist" -msgstr[1] "%s valgte muligheder ikke vist" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s af %(cnt)s valgt" -msgstr[1] "%(sel)s af %(cnt)s valgt" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Du har ugemte ændringer af et eller flere redigerbare felter. Hvis du " -"udfører en handling fra drop-down-menuen, vil du miste disse ændringer." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Du har valgt en handling, men du har ikke gemt dine ændringer til et eller " -"flere felter. Klik venligst OK for at gemme og vælg dernæst handlingen igen." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Du har valgt en handling, og du har ikke udført nogen ændringer på felter. " -"Du søger formentlig Udfør-knappen i stedet for Gem-knappen." - -msgid "Now" -msgstr "Nu" - -msgid "Midnight" -msgstr "Midnat" - -msgid "6 a.m." -msgstr "Klokken 6" - -msgid "Noon" -msgstr "Middag" - -msgid "6 p.m." -msgstr "Klokken 18" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Obs: Du er %s time forud i forhold til servertiden." -msgstr[1] "Obs: Du er %s timer forud i forhold til servertiden." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Obs: Du er %s time bagud i forhold til servertiden." -msgstr[1] "Obs: Du er %s timer bagud i forhold til servertiden." - -msgid "Choose a Time" -msgstr "Vælg et Tidspunkt" - -msgid "Choose a time" -msgstr "Vælg et tidspunkt" - -msgid "Cancel" -msgstr "Annuller" - -msgid "Today" -msgstr "I dag" - -msgid "Choose a Date" -msgstr "Vælg en Dato" - -msgid "Yesterday" -msgstr "I går" - -msgid "Tomorrow" -msgstr "I morgen" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Marts" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "December" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec" - -msgid "Sunday" -msgstr "søndag" - -msgid "Monday" -msgstr "mandag" - -msgid "Tuesday" -msgstr "tirsdag" - -msgid "Wednesday" -msgstr "onsdag" - -msgid "Thursday" -msgstr "torsdag" - -msgid "Friday" -msgstr "fredag" - -msgid "Saturday" -msgstr "lørdag" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "søn" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "man" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "tir" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "ons" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "tor" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "fre" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "lør" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "O" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index c260e8d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 205d797..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,791 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2012 -# Florian Apolloner , 2011 -# Dimitris Glezos , 2012 -# Florian Apolloner , 2020-2023 -# jnns, 2013 -# Jannis Leidel , 2013-2018,2020 -# jnns, 2016 -# Markus Holtermann , 2020,2023 -# Markus Holtermann , 2013,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: Markus Holtermann , 2020,2023\n" -"Language-Team: German (http://app.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ausgewählte %(verbose_name_plural)s löschen" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Erfolgreich %(count)d %(items)s gelöscht." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kann %(name)s nicht löschen" - -msgid "Are you sure?" -msgstr "Sind Sie sicher?" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "Alle" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nein" - -msgid "Unknown" -msgstr "Unbekannt" - -msgid "Any date" -msgstr "Alle Daten" - -msgid "Today" -msgstr "Heute" - -msgid "Past 7 days" -msgstr "Letzte 7 Tage" - -msgid "This month" -msgstr "Diesen Monat" - -msgid "This year" -msgstr "Dieses Jahr" - -msgid "No date" -msgstr "Kein Datum" - -msgid "Has date" -msgstr "Besitzt Datum" - -msgid "Empty" -msgstr "Leer" - -msgid "Not empty" -msgstr "Nicht leer" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Bitte %(username)s und Passwort für einen Staff-Account eingeben. Beide " -"Felder berücksichtigen die Groß-/Kleinschreibung." - -msgid "Action:" -msgstr "Aktion:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "%(verbose_name)s hinzufügen" - -msgid "Remove" -msgstr "Entfernen" - -msgid "Addition" -msgstr "Hinzugefügt" - -msgid "Change" -msgstr "Ändern" - -msgid "Deletion" -msgstr "Gelöscht" - -msgid "action time" -msgstr "Zeitpunkt der Aktion" - -msgid "user" -msgstr "Benutzer" - -msgid "content type" -msgstr "Inhaltstyp" - -msgid "object id" -msgstr "Objekt-ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "Objekt Darst." - -msgid "action flag" -msgstr "Aktionskennzeichen" - -msgid "change message" -msgstr "Änderungsmeldung" - -msgid "log entry" -msgstr "Logeintrag" - -msgid "log entries" -msgstr "Logeinträge" - -#, python-format -msgid "Added “%(object)s”." -msgstr "„%(object)s“ hinzufügt." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "„%(object)s“ geändert – %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "„%(object)s“ gelöscht." - -msgid "LogEntry Object" -msgstr "LogEntry Objekt" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} „{object}“ hinzugefügt." - -msgid "Added." -msgstr "Hinzugefügt." - -msgid "and" -msgstr "und" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} für {name} „{object}“ geändert." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} geändert." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} „{object}“ gelöscht." - -msgid "No fields changed." -msgstr "Keine Felder geändert." - -msgid "None" -msgstr "-" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Halten Sie die Strg-Taste (⌘ für Mac) während des Klickens gedrückt, um " -"mehrere Einträge auszuwählen." - -msgid "Select this object for an action - {}" -msgstr "Dieses Objekt für eine Aktion auswählen - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}“ wurde erfolgreich hinzugefügt." - -msgid "You may edit it again below." -msgstr "Es kann unten erneut geändert werden." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} „{obj}“ wurde erfolgreich hinzugefügt und kann nun unten um ein " -"Weiteres ergänzt werden." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} „{obj}“ wurde erfolgreich geändert und kann unten erneut geändert " -"werden." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} „{obj}“ wurde erfolgreich hinzugefügt und kann unten geändert werden." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} „{obj}“ wurde erfolgreich geändert und kann nun unten erneut ergänzt " -"werden." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}“ wurde erfolgreich geändert." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Es müssen Objekte aus der Liste ausgewählt werden, um Aktionen " -"durchzuführen. Es wurden keine Objekte geändert." - -msgid "No action selected." -msgstr "Keine Aktion ausgewählt." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s“ wurde erfolgreich gelöscht." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s mit ID „%(key)s“ existiert nicht. Eventuell gelöscht?" - -#, python-format -msgid "Add %s" -msgstr "%s hinzufügen" - -#, python-format -msgid "Change %s" -msgstr "%s ändern" - -#, python-format -msgid "View %s" -msgstr "%s ansehen" - -msgid "Database error" -msgstr "Datenbankfehler" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s wurde erfolgreich geändert." -msgstr[1] "%(count)s %(name)s wurden erfolgreich geändert." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s ausgewählt" -msgstr[1] "Alle %(total_count)s ausgewählt" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 von %(cnt)s ausgewählt" - -#, python-format -msgid "Change history: %s" -msgstr "Änderungsgeschichte: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Das Löschen des %(class_name)s-Objekts „%(instance)s“ würde ein Löschen der " -"folgenden geschützten verwandten Objekte erfordern: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django-Systemverwaltung" - -msgid "Django administration" -msgstr "Django-Verwaltung" - -msgid "Site administration" -msgstr "Website-Verwaltung" - -msgid "Log in" -msgstr "Anmelden" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-Administration" - -msgid "Page not found" -msgstr "Seite nicht gefunden" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" -"Es tut uns leid, aber die angeforderte Seite konnte nicht gefunden werden." - -msgid "Home" -msgstr "Start" - -msgid "Server error" -msgstr "Serverfehler" - -msgid "Server error (500)" -msgstr "Serverfehler (500)" - -msgid "Server Error (500)" -msgstr "Serverfehler (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ein Fehler ist aufgetreten und wurde an die Administratoren per E-Mail " -"gemeldet. Danke für die Geduld, der Fehler sollte in Kürze behoben sein." - -msgid "Run the selected action" -msgstr "Ausgewählte Aktion ausführen" - -msgid "Go" -msgstr "Ausführen" - -msgid "Click here to select the objects across all pages" -msgstr "Hier klicken, um die Objekte aller Seiten auszuwählen" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Alle %(total_count)s %(module_name)s auswählen" - -msgid "Clear selection" -msgstr "Auswahl widerrufen" - -msgid "Breadcrumbs" -msgstr "„Brotkrümel“" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelle der %(name)s-Anwendung" - -msgid "Add" -msgstr "Hinzufügen" - -msgid "View" -msgstr "Ansehen" - -msgid "You don’t have permission to view or edit anything." -msgstr "" -"Das Benutzerkonto besitzt nicht die nötigen Rechte, um etwas anzusehen oder " -"zu ändern." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Bitte zuerst einen Benutzernamen und ein Passwort eingeben. Danach können " -"weitere Optionen für den Benutzer geändert werden." - -msgid "Enter a username and password." -msgstr "Bitte einen Benutzernamen und ein Passwort eingeben." - -msgid "Change password" -msgstr "Passwort ändern" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Bitte den unten aufgeführten Fehler korrigieren." -msgstr[1] "Bitte die unten aufgeführten Fehler korrigieren." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Bitte geben Sie ein neues Passwort für den Benutzer %(username)s ein." - -msgid "Skip to main content" -msgstr "Zum Hauptinhalt springen" - -msgid "Welcome," -msgstr "Willkommen," - -msgid "View site" -msgstr "Website anzeigen" - -msgid "Documentation" -msgstr "Dokumentation" - -msgid "Log out" -msgstr "Abmelden" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s hinzufügen" - -msgid "History" -msgstr "Geschichte" - -msgid "View on site" -msgstr "Auf der Website anzeigen" - -msgid "Filter" -msgstr "Filter" - -msgid "Hide counts" -msgstr "Anzahl verstecken" - -msgid "Show counts" -msgstr "Anzahl anzeigen" - -msgid "Clear all filters" -msgstr "Alle Filter zurücksetzen" - -msgid "Remove from sorting" -msgstr "Aus der Sortierung entfernen" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sortierung: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sortierung ein-/ausschalten" - -msgid "Toggle theme (current theme: auto)" -msgstr "Design wechseln (aktuelles Design: automatisch)" - -msgid "Toggle theme (current theme: light)" -msgstr "Design wechseln (aktuelles Design: hell)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Design wechseln (aktuelles Design: dunkel)" - -msgid "Delete" -msgstr "Löschen" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Das Löschen des %(object_name)s „%(escaped_object)s“ hätte das Löschen davon " -"abhängiger Daten zur Folge, aber Sie haben nicht die nötigen Rechte, um die " -"folgenden davon abhängigen Daten zu löschen:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Das Löschen von %(object_name)s „%(escaped_object)s“ würde ein Löschen der " -"folgenden geschützten verwandten Objekte erfordern:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Sind Sie sicher, dass Sie %(object_name)s „%(escaped_object)s“ löschen " -"wollen? Es werden zusätzlich die folgenden davon abhängigen Daten gelöscht:" - -msgid "Objects" -msgstr "Objekte" - -msgid "Yes, I’m sure" -msgstr "Ja, ich bin sicher" - -msgid "No, take me back" -msgstr "Nein, bitte abbrechen" - -msgid "Delete multiple objects" -msgstr "Mehrere Objekte löschen" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Das Löschen der ausgewählten %(objects_name)s würde im Löschen geschützter " -"verwandter Objekte resultieren, allerdings besitzt Ihr Benutzerkonto nicht " -"die nötigen Rechte, um diese zu löschen:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Das Löschen der ausgewählten %(objects_name)s würde ein Löschen der " -"folgenden geschützten verwandten Objekte erfordern:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Sind Sie sicher, dass Sie die ausgewählten %(objects_name)s löschen wollen? " -"Alle folgenden Objekte und ihre verwandten Objekte werden gelöscht:" - -msgid "Delete?" -msgstr "Löschen?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Nach %(filter_title)s " - -msgid "Summary" -msgstr "Zusammenfassung" - -msgid "Recent actions" -msgstr "Neueste Aktionen" - -msgid "My actions" -msgstr "Meine Aktionen" - -msgid "None available" -msgstr "Keine vorhanden" - -msgid "Added:" -msgstr "Hinzugefügt:" - -msgid "Changed:" -msgstr "Geändert:" - -msgid "Deleted:" -msgstr "Gelöscht:" - -msgid "Unknown content" -msgstr "Unbekannter Inhalt" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Etwas stimmt nicht mit der Datenbankkonfiguration. Bitte sicherstellen, dass " -"die richtigen Datenbanktabellen angelegt wurden und die Datenbank vom " -"verwendeten Datenbankbenutzer auch lesbar ist." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Sie sind als %(username)s angemeldet, aber nicht autorisiert, auf diese " -"Seite zuzugreifen. Wollen Sie sich mit einem anderen Account anmelden?" - -msgid "Forgotten your password or username?" -msgstr "Benutzername oder Passwort vergessen?" - -msgid "Toggle navigation" -msgstr "Navigation ein-/ausblenden" - -msgid "Sidebar" -msgstr "Seitenleiste" - -msgid "Start typing to filter…" -msgstr "Eingabe beginnen um zu filtern…" - -msgid "Filter navigation items" -msgstr "Navigationselemente filtern" - -msgid "Date/time" -msgstr "Datum/Zeit" - -msgid "User" -msgstr "Benutzer" - -msgid "Action" -msgstr "Aktion" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "Eintrag" -msgstr[1] "Einträge" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dieses Objekt hat keine Änderungsgeschichte. Es wurde möglicherweise nicht " -"über diese Verwaltungsseiten angelegt." - -msgid "Show all" -msgstr "Zeige alle" - -msgid "Save" -msgstr "Sichern" - -msgid "Popup closing…" -msgstr "Popup wird geschlossen..." - -msgid "Search" -msgstr "Suchen" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s Ergebnis" -msgstr[1] "%(counter)s Ergebnisse" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s gesamt" - -msgid "Save as new" -msgstr "Als neu sichern" - -msgid "Save and add another" -msgstr "Sichern und neu hinzufügen" - -msgid "Save and continue editing" -msgstr "Sichern und weiter bearbeiten" - -msgid "Save and view" -msgstr "Sichern und ansehen" - -msgid "Close" -msgstr "Schließen" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Ausgewählte %(model)s ändern" - -#, python-format -msgid "Add another %(model)s" -msgstr "%(model)s hinzufügen" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Ausgewählte %(model)s löschen" - -#, python-format -msgid "View selected %(model)s" -msgstr "Ausgewählte %(model)s ansehen" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Vielen Dank, dass Sie heute ein paar nette Minuten auf dieser Webseite " -"verbracht haben." - -msgid "Log in again" -msgstr "Erneut anmelden" - -msgid "Password change" -msgstr "Passwort ändern" - -msgid "Your password was changed." -msgstr "Ihr Passwort wurde geändert." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Aus Sicherheitsgründen bitte zuerst das alte Passwort und darunter dann " -"zweimal das neue Passwort eingeben, um sicherzustellen, dass es es korrekt " -"eingegeben wurde." - -msgid "Change my password" -msgstr "Mein Passwort ändern" - -msgid "Password reset" -msgstr "Passwort zurücksetzen" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Ihr Passwort wurde zurückgesetzt. Sie können sich nun anmelden." - -msgid "Password reset confirmation" -msgstr "Zurücksetzen des Passworts bestätigen" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Bitte geben Sie Ihr neues Passwort zweimal ein, damit wir überprüfen können, " -"ob es richtig eingetippt wurde." - -msgid "New password:" -msgstr "Neues Passwort:" - -msgid "Confirm password:" -msgstr "Passwort wiederholen:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Der Link zum Zurücksetzen Ihres Passworts ist ungültig, wahrscheinlich weil " -"er schon einmal benutzt wurde. Bitte setzen Sie Ihr Passwort erneut zurück." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Wir haben eine E-Mail zum Zurücksetzen des Passwortes an die angegebene E-" -"Mail-Adresse gesendet, sofern ein entsprechendes Konto existiert. Sie sollte " -"in Kürze ankommen." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Falls die E-Mail nicht angekommen sein sollte, bitte die E-Mail-Adresse auf " -"Richtigkeit und gegebenenfalls den Spam-Ordner überprüfen." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Diese E-Mail wurde aufgrund einer Anfrage zum Zurücksetzen des Passworts auf " -"der Website %(site_name)s versendet." - -msgid "Please go to the following page and choose a new password:" -msgstr "Bitte öffnen Sie folgende Seite, um Ihr neues Passwort einzugeben:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Der Benutzername, falls vergessen:" - -msgid "Thanks for using our site!" -msgstr "Vielen Dank, dass Sie unsere Website benutzen!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Das Team von %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Passwort vergessen? Einfach die E-Mail-Adresse unten eingeben und den " -"Anweisungen zum Zurücksetzen des Passworts in der E-Mail folgen." - -msgid "Email address:" -msgstr "E-Mail-Adresse:" - -msgid "Reset my password" -msgstr "Mein Passwort zurücksetzen" - -msgid "Select all objects on this page for an action" -msgstr "Alle Objekte auf dieser Seite für eine Aktion auswählen" - -msgid "All dates" -msgstr "Alle Daten" - -#, python-format -msgid "Select %s" -msgstr "%s auswählen" - -#, python-format -msgid "Select %s to change" -msgstr "%s zur Änderung auswählen" - -#, python-format -msgid "Select %s to view" -msgstr "%s zum Ansehen auswählen" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Zeit:" - -msgid "Lookup" -msgstr "Suchen" - -msgid "Currently:" -msgstr "Aktuell:" - -msgid "Change:" -msgstr "Ändern:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c579ef5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po deleted file mode 100644 index 2fe140f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,331 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2011-2012 -# Florian Apolloner , 2020-2023 -# Jannis Leidel , 2011,2013-2016,2023 -# jnns, 2016 -# Markus Holtermann , 2020,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Markus Holtermann , 2020,2023\n" -"Language-Team: German (http://app.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Verfügbare %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Dies ist die Liste der verfügbaren %s. Einfach im unten stehenden Feld " -"markieren und mithilfe des „Auswählen“-Pfeils auswählen." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Durch Eingabe in diesem Feld lässt sich die Liste der verfügbaren %s " -"eingrenzen." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Alle auswählen" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klicken, um alle %s auf einmal auszuwählen." - -msgid "Choose" -msgstr "Auswählen" - -msgid "Remove" -msgstr "Entfernen" - -#, javascript-format -msgid "Chosen %s" -msgstr "Ausgewählte %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Dies ist die Liste der ausgewählten %s. Einfach im unten stehenden Feld " -"markieren und mithilfe des „Entfernen“-Pfeils wieder entfernen." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"In diesem Feld tippen, um die Liste der ausgewählten %s einzuschränken." - -msgid "Remove all" -msgstr "Alle entfernen" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klicken, um alle ausgewählten %s auf einmal zu entfernen." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s ausgewählte Option nicht sichtbar" -msgstr[1] "%s ausgewählte Optionen nicht sichtbar" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s von %(cnt)s ausgewählt" -msgstr[1] "%(sel)s von %(cnt)s ausgewählt" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Sie haben Änderungen an bearbeitbaren Feldern vorgenommen und nicht " -"gespeichert. Wollen Sie die Aktion trotzdem ausführen und Ihre Änderungen " -"verwerfen?" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Sie haben eine Aktion ausgewählt, aber Ihre vorgenommenen Änderungen nicht " -"gespeichert. Klicken Sie OK, um dennoch zu speichern. Danach müssen Sie die " -"Aktion erneut ausführen." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Sie haben eine Aktion ausgewählt, aber keine Änderungen an bearbeitbaren " -"Feldern vorgenommen. Sie wollten wahrscheinlich auf „Ausführen“ und nicht " -"auf „Speichern“ klicken." - -msgid "Now" -msgstr "Jetzt" - -msgid "Midnight" -msgstr "Mitternacht" - -msgid "6 a.m." -msgstr "6 Uhr" - -msgid "Noon" -msgstr "Mittag" - -msgid "6 p.m." -msgstr "18 Uhr" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Achtung: Sie sind %s Stunde der Serverzeit vorraus." -msgstr[1] "Achtung: Sie sind %s Stunden der Serverzeit vorraus." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Achtung: Sie sind %s Stunde hinter der Serverzeit." -msgstr[1] "Achtung: Sie sind %s Stunden hinter der Serverzeit." - -msgid "Choose a Time" -msgstr "Uhrzeit wählen" - -msgid "Choose a time" -msgstr "Uhrzeit" - -msgid "Cancel" -msgstr "Abbrechen" - -msgid "Today" -msgstr "Heute" - -msgid "Choose a Date" -msgstr "Datum wählen" - -msgid "Yesterday" -msgstr "Gestern" - -msgid "Tomorrow" -msgstr "Morgen" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "März" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Dezember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mrz" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dez" - -msgid "Sunday" -msgstr "Sonntag" - -msgid "Monday" -msgstr "Montag" - -msgid "Tuesday" -msgstr "Dienstag" - -msgid "Wednesday" -msgstr "Mittwoch" - -msgid "Thursday" -msgstr "Donnerstag" - -msgid "Friday" -msgstr "Freitag" - -msgid "Saturday" -msgstr "Samstag" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "So" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Mo" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Di" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Mi" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Do" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Fr" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sa" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "So" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Mo" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Di" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Mi" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Do" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Fr" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Sa" - -msgid "Show" -msgstr "Einblenden" - -msgid "Hide" -msgstr "Ausblenden" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index 77e52e8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index 051acd1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,795 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016-2025\n" -"Language-Team: Lower Sorbian (http://app.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Wubrane %(verbose_name_plural)s lašowaś" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s su se wulašowali." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s njedajo se lašowaś" - -msgid "Delete multiple objects" -msgstr "Někotare objekty lašowaś" - -msgid "Administration" -msgstr "Administracija" - -msgid "All" -msgstr "Wšykne" - -msgid "Yes" -msgstr "Jo" - -msgid "No" -msgstr "Ně" - -msgid "Unknown" -msgstr "Njeznaty" - -msgid "Any date" -msgstr "Někaki datum" - -msgid "Today" -msgstr "Źinsa" - -msgid "Past 7 days" -msgstr "Zachadne 7 dnjow" - -msgid "This month" -msgstr "Toś ten mjasec" - -msgid "This year" -msgstr "W tom lěśe" - -msgid "No date" -msgstr "Žeden datum" - -msgid "Has date" -msgstr "Ma datum" - -msgid "Empty" -msgstr "Prozny" - -msgid "Not empty" -msgstr "Njeprozny" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Pšosym zapódajśo korektne %(username)s a gronidło za personalne konto. " -"Źiwajśo na to, až wobej póli móžotej mjazy wjeliko- a małopisanim rozeznawaś." - -msgid "Action:" -msgstr "Akcija:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dalšne %(verbose_name)s pśidaś" - -msgid "Remove" -msgstr "Wótpóraś" - -msgid "Addition" -msgstr "Pśidanje" - -msgid "Change" -msgstr "Změniś" - -msgid "Deletion" -msgstr "Wulašowanje" - -msgid "action time" -msgstr "akciski cas" - -msgid "user" -msgstr "wužywaŕ" - -msgid "content type" -msgstr "wopśimjeśowy typ" - -msgid "object id" -msgstr "objektowy id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objektowa reprezentacija" - -msgid "action flag" -msgstr "akciske markěrowanje" - -msgid "change message" -msgstr "změnowa powěźeńka" - -msgid "log entry" -msgstr "protokolowy zapisk" - -msgid "log entries" -msgstr "protokolowe zapiski" - -#, python-format -msgid "Added “%(object)s”." -msgstr "„%(object)s“ pśidane." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "„%(object)s“ změnjone - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "„%(object)s“ wulašowane." - -msgid "LogEntry Object" -msgstr "Objekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} „{object}“ pśidany." - -msgid "Added." -msgstr "Pśidany." - -msgid "and" -msgstr "a" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} za {name} „{object}“ změnjone." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} změnjone." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Deleted {name} „{object}“ wulašowane." - -msgid "No fields changed." -msgstr "Žedne póla změnjone." - -msgid "None" -msgstr "Žeden" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "´Źaržćo „ctrl“ abo „cmd“ na Mac tłocony, aby wusej jadnogo wubrał." - -msgid "Select this object for an action - {}" -msgstr "Wubjeŕśo toś ten objekt za akciju – {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}“ jo se wuspěšnje pśidał." - -msgid "You may edit it again below." -msgstr "Móźośo dołojce znowego wobźěłaś." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} „{obj}“ jo se wuspěšnje pśidał. Móžośo dołojce dalšne {name} pśidaś." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} „{obj}“ jo se wuspěšnje změnił. Móžośo jen dołojce znowego wobźěłowaś." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} „{obj}“ jo se wuspěšnje změnił. Móžośo dołojce dalšne {name} pśidaś." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}“ jo se wuspěšnje změnił." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Zapiski muse se wubraś, aby akcije na nje nałožowało. Zapiski njejsu se " -"změnili." - -msgid "No action selected." -msgstr "Žedna akcija wubrana." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s“ jo se wuspěšnje wulašował." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s z ID „%(key)s“ njeeksistěrujo. Jo se snaź wulašowało?" - -#, python-format -msgid "Add %s" -msgstr "%s pśidaś" - -#, python-format -msgid "Change %s" -msgstr "%s změniś" - -#, python-format -msgid "View %s" -msgstr "%s pokazaś" - -msgid "Database error" -msgstr "Zmólka datoweje banki" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s jo se wuspěšnje změnił." -msgstr[1] "%(count)s %(name)s stej se wuspěšnje změniłej." -msgstr[2] "%(count)s %(name)s su se wuspěšnje změnili." -msgstr[3] "%(count)s %(name)s jo se wuspěšnje změniło." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s wubrany" -msgstr[1] "Wšykne %(total_count)s wubranej" -msgstr[2] "Wšykne %(total_count)s wubrane" -msgstr[3] "Wšykne %(total_count)s wubranych" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 z %(cnt)s wubranych" - -msgid "Delete" -msgstr "Lašowaś" - -#, python-format -msgid "Change history: %s" -msgstr "Změnowa historija: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Aby se %(class_name)s %(instance)s lašowało, muse se slědujuce šćitane " -"objekty lašowaś: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administrator sedła Django" - -msgid "Django administration" -msgstr "Administracija Django" - -msgid "Site administration" -msgstr "Sedłowa administracija" - -msgid "Log in" -msgstr "Pśizjawiś" - -#, python-format -msgid "%(app)s administration" -msgstr "Administracija %(app)s" - -msgid "Page not found" -msgstr "Bok njejo se namakał" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Jo nam luto, ale pominany bok njedajo se namakaś." - -msgid "Home" -msgstr "Startowy bok" - -msgid "Server error" -msgstr "Serwerowa zmólka" - -msgid "Server error (500)" -msgstr "Serwerowa zmólka (500)" - -msgid "Server Error (500)" -msgstr "Serwerowa zmólka (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Zmólka jo nastała. Jo se sedłowym administratoram pśez e-mail k wěsći dała a " -"by dejała se skóro wótpóraś. Źěkujom se za wašu sćerpmosć." - -msgid "Run the selected action" -msgstr "Wubranu akciju wuwjasć" - -msgid "Go" -msgstr "Start" - -msgid "Click here to select the objects across all pages" -msgstr "Klikniśo how, aby objekty wšych bokow wubrał" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Wubjeŕśo wšykne %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Wuběrk lašowaś" - -msgid "Breadcrumbs" -msgstr "Klěbowe srjodki" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele w nałoženju %(name)s" - -msgid "Model name" -msgstr "Modelowe mě" - -msgid "Add link" -msgstr "Wótkaz pśidaś" - -msgid "Change or view list link" -msgstr "Lisćinowy wótkaz změniś abo pokazaś" - -msgid "Add" -msgstr "Pśidaś" - -msgid "View" -msgstr "Pokazaś" - -msgid "You don’t have permission to view or edit anything." -msgstr "Njamaśo pšawo něco pokazaś abo wobźěłaś" - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Gaž sćo wužywarja napórał, móžośo dalšne wužywaŕske nastajenja wobźěłaś." - -msgid "Error:" -msgstr "Zmólka:" - -msgid "Change password" -msgstr "Gronidło změniś" - -msgid "Set password" -msgstr "Gronidło póstajiś" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Pšosym korigěrujśo slědujucu zmólku." -msgstr[1] "Pšosym korigěrujśo slědujucej zmólce." -msgstr[2] "Pšosym korigěrujśo slědujuce zmólki." -msgstr[3] "Pšosym korigěrujśo slědujuce zmólki." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Zapódajśo nowe gronidło za wužywarja %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Toś ta akcija awtentifikaciju na zakłaźe gronidła za toś togo wužywarja " -" zmóžnijo ." - -msgid "Disable password-based authentication" -msgstr "Awtentifikaciju na zakłaźe gronidła znjemóžniś" - -msgid "Enable password-based authentication" -msgstr "Awtentifikaciju na zakłaźe gronidła zmóžniś" - -msgid "Skip to main content" -msgstr "Dalej ku głownemu wopśimjeśeju" - -msgid "Welcome," -msgstr "Witajśo," - -msgid "View site" -msgstr "Sedło pokazaś" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Wótzjawiś" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s pśidaś" - -msgid "History" -msgstr "Historija" - -msgid "View on site" -msgstr "Na sedle pokazaś" - -msgid "Filter" -msgstr "Filtrowaś" - -msgid "Hide counts" -msgstr "Licby schowaś" - -msgid "Show counts" -msgstr "Licby pokazaś" - -msgid "Clear all filters" -msgstr "Wšykne filtry lašowaś" - -msgid "Remove from sorting" -msgstr "Ze sortěrowanja wótpóraś" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sortěrowański rěd: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sortěrowanje pśešaltowaś" - -msgid "Toggle theme (current theme: auto)" -msgstr "Drastwu změniś (auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Drastwu změniś (swětły)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Drastwu změniś (śamny)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Gaž se %(object_name)s '%(escaped_object)s' lašujo, se pśisłušne objekty " -"wulašuju, ale wašo konto njama pšawo slědujuce typy objektow lašowaś: " - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Aby se %(object_name)s '%(escaped_object)s' lašujo, muse se slědujuce " -"šćitane pśisłušne objekty lašowaś:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Cośo napšawdu %(object_name)s „%(escaped_object)s“ lašowaś? Wšykne slědujuce " -"pśisłušne zapiski se wulašuju: " - -msgid "Objects" -msgstr "Objekty" - -msgid "Yes, I’m sure" -msgstr "Jo, som se wěsty" - -msgid "No, take me back" -msgstr "Ně, pšosym slědk" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Gaž lašujośo wubrany %(objects_name)s, se pśisłušne objekty wulašuju, ale " -"wašo konto njama pšawo slědujuce typy objektow lašowaś: " - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Aby wubrany %(objects_name)s lašowało, muse se slědujuce šćitane pśisłušne " -"objekty lašowaś:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Cośo napšawdu wubrany %(objects_name)s lašowaś? Wšykne slědujuce objekty a " -"jich pśisłušne zapiski se wulašuju:" - -msgid "Delete?" -msgstr "Lašowaś?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Pó %(filter_title)s " - -msgid "Summary" -msgstr "Zespominanje" - -msgid "Recent actions" -msgstr "Nejnowše akcije" - -msgid "My actions" -msgstr "Móje akcije" - -msgid "None available" -msgstr "Žeden k dispoziciji" - -msgid "Added:" -msgstr "Pśidany:" - -msgid "Changed:" -msgstr "Změnjony:" - -msgid "Deleted:" -msgstr "Wulašowany:" - -msgid "Unknown content" -msgstr "Njeznate wopśimjeśe" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Něco jo z wašeju instalaciju datoweje banki kśiwje šło. Pśeznańśo se, až " -"wótpowědne tabele datoweje banki su se napórali a pótom, až datowa banka " -"dajo se wót wótpówědnego wužywarja cytaś." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Sćo ako %(username)s awtentificěrowany, ale njamaśo pśistup na toś ten bok. " -"Cośo se pla drugego konta pśizjawiś?" - -msgid "Forgotten your login credentials?" -msgstr "Sćo swóje pśizjawjeńske daty zabył?" - -msgid "Toggle navigation" -msgstr "Nawigaciju pśešaltowaś" - -msgid "Sidebar" -msgstr "Bocnica" - -msgid "Start typing to filter…" -msgstr "Pišćo, aby filtrował …" - -msgid "Filter navigation items" -msgstr "Nawigaciske zapiski filtrowaś" - -msgid "Date/time" -msgstr "Datum/cas" - -msgid "User" -msgstr "Wužywaŕ" - -msgid "Action" -msgstr "Akcija" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "zapisk" -msgstr[1] "zapiska" -msgstr[2] "zapiski" -msgstr[3] "zapiskow" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Toś ten objekt njama změnowu historiju. Jo se nejskerjej pśez toś to " -"administratorowe sedło pśidał." - -msgid "Show all" -msgstr "Wšykne pokazaś" - -msgid "Save" -msgstr "Składowaś" - -msgid "Popup closing…" -msgstr "Wuskokujuce wokno se zacynja…" - -msgid "Search" -msgstr "Pytaś" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s wuslědk" -msgstr[1] "%(counter)s wuslědka" -msgstr[2] "%(counter)s wuslědki" -msgstr[3] "%(counter)s wuslědkow" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s dogromady" - -msgid "Save as new" -msgstr "Ako nowy składowaś" - -msgid "Save and add another" -msgstr "Składowaś a dalšny pśidaś" - -msgid "Save and continue editing" -msgstr "Składowaś a dalej wobźěłowaś" - -msgid "Save and view" -msgstr "Składowaś a pokazaś" - -msgid "Close" -msgstr "Zacyniś" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Wubrane %(model)s změniś" - -#, python-format -msgid "Add another %(model)s" -msgstr "Dalšny %(model)s pśidaś" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Wubrane %(model)s lašowaś" - -#, python-format -msgid "View selected %(model)s" -msgstr "Wubrany %(model)s pokazaś" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Wjeliki źěk, až sćo sebje brał źinsa cas za pśeglědowanje kwality websedła." - -msgid "Log in again" -msgstr "Hyšći raz pśizjawiś" - -msgid "Password change" -msgstr "Gronidło změniś" - -msgid "Your password was changed." -msgstr "Wašo gronidło jo se změniło." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Pšosym zapódajśo k swójej wěstośe swójo stare gronidło a pótom swójo nowe " -"gronidło dwójcy, aby my mógli pśeglědowaś, lěc sćo jo korektnje zapisał." - -msgid "Change my password" -msgstr "Mójo gronidło změniś" - -msgid "Password reset" -msgstr "Gronidło jo se slědk stajiło" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Wašo gronidło jo se póstajiło. Móžośo pókšacowaś a se něnto pśizjawiś." - -msgid "Password reset confirmation" -msgstr "Wobkšuśenje slědkstajenja gronidła" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Pšosym zapódajśo swójo nowe gronidło dwójcy, aby my mógli pśeglědowaś, lěc " -"sći jo korektnje zapisał." - -msgid "New password:" -msgstr "Nowe gronidło:" - -msgid "Confirm password:" -msgstr "Gronidło wobkšuśiś:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Wótkaz za slědkstajenje gronidła jo njepłaśiwy był, snaź dokulaž jo se južo " -"wužył. Pšosym pšosćo wó nowe slědkstajenje gronidła." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Smy wam instrukcije za nastajenje wašogo gronidła pśez e-mail pósłali, jolic " -"konto ze zapódaneju e-mailoweju adresu eksistěrujo. Wy by dejał ju skóro " -"dostaś." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jolic mejlku njedostawaśo, pśeznańśo se, až sćo adresu zapódał, z kótarejuž " -"sćo zregistrěrował, a pśeglědajśo swój spamowy zarědnik." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Dostawaśo toś tu mejlku, dokulaž sćo za swójo wužywarske konto na " -"%(site_name)s wó slědkstajenje gronidła pšosył." - -msgid "Please go to the following page and choose a new password:" -msgstr "Pšosym źiśo k slědujucemu bokoju a wubjeŕśo nowe gronidło:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Jolic sćo je zabył, sćo:" - -msgid "Thanks for using our site!" -msgstr "Wjeliki źěk za wužywanje našogo sedła!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Team %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Sćo swójo gronidło zabył? Zapódajśo dołojce swóju e-mailowu adresu a " -"pósćelomy wam instrukcije za nastajenje nowego gronidła pśez e-mail." - -msgid "Email address:" -msgstr "E-mailowa adresa:" - -msgid "Reset my password" -msgstr "Mójo gronidło slědk stajiś" - -msgid "Select all objects on this page for an action" -msgstr "Wubjeŕśo wšykne objekty na toś tom boku za akciju" - -msgid "All dates" -msgstr "Wšykne daty" - -#, python-format -msgid "Select %s" -msgstr "%s wubraś" - -#, python-format -msgid "Select %s to change" -msgstr "%s wubraś, aby se změniło" - -#, python-format -msgid "Select %s to view" -msgstr "%s wubraś, kótaryž ma se pokazaś" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Cas:" - -msgid "Lookup" -msgstr "Pytanje" - -msgid "Currently:" -msgstr "Tuchylu:" - -msgid "Change:" -msgstr "Změniś:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo deleted file mode 100644 index f0fccf6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po deleted file mode 100644 index 2598939..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,323 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2020-2023,2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016,2020-2023,2025\n" -"Language-Team: Lower Sorbian (http://app.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "K dispoziciji stojece %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Wubjeŕśo je, aby %s markěrował a wubjeŕśo pón šypowy tłocašk „Wubraś“." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Zapišćo do toś togo póla, aby zapiski z lisćiny k dispoziciji stojecych %s " -"wufiltrował. " - -msgid "Filter" -msgstr "Filtrowaś" - -#, javascript-format -msgid "Choose all %s" -msgstr "Wšykne %swubraś " - -#, javascript-format -msgid "Choose selected %s" -msgstr "Markěrujśo wubrane %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Wubrane %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Wubjeŕśo je, aby %s wótwónoźeł a wubjeŕśo pón šypowy tłocašk „Wótwónoźeś“." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"Zapišćo do toś togo póla, aby zapiski z lisćiny wubranych %s wufiltrował. " - -msgid "(click to clear)" -msgstr "(klikniśo, aby lašował)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Wšykne %s wótwónoźeś" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s wubrane nastajenje njewidobne" -msgstr[1] "%s wubranej nastajeni njewidobnej" -msgstr[2] "%s wubrane nastajenja njewidobne" -msgstr[3] "%s wubranych nastajenjow njewidobne" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s z %(cnt)s wubrany" -msgstr[1] "%(sel)s z %(cnt)s wubranej" -msgstr[2] "%(sel)s z %(cnt)s wubrane" -msgstr[3] "%(sel)s z %(cnt)s wubranych" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Maśo njeskładowane změny za jadnotliwe wobźěłujobne póla. Jolic akciju " -"wuwjeźośo, se waše njeskładowane změny zgubiju." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Sćo akciju wubrał, ale njejsćo hyšći swóje změny za jadnotliwe póla " -"składował, Pšosym klikniśo na W pórěźe, aby składował. Musyśo akciju znowego " -"wuwjasć." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Sćo akciju wubrał, ale njejsćo jadnotliwe póla změnił. Nejskerjej pytaśo " -"skerjej za tłocaškom Start ako za tłocaškom Składowaś." - -msgid "Now" -msgstr "Něnto" - -msgid "Midnight" -msgstr "Połnoc" - -msgid "6 a.m." -msgstr "6:00 góź. dopołdnja" - -msgid "Noon" -msgstr "Połdnjo" - -msgid "6 p.m." -msgstr "6:00 wótpołdnja" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Glědajśo: Waš cas jo wó %s góźinu pśéd serwerowym casom." -msgstr[1] "Glědajśo: Waš cas jo wó %s góźinje pśéd serwerowym casom." -msgstr[2] "Glědajśo: Waš cas jo wó %s góźiny pśéd serwerowym casom." -msgstr[3] "Glědajśo: Waš cas jo wó %s góźin pśéd serwerowym casom." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Glědajśo: Waš cas jo wó %s góźinu za serwerowym casom." -msgstr[1] "Glědajśo: Waš cas jo wó %s góźinje za serwerowym casom." -msgstr[2] "Glědajśo: Waš cas jo wó %s góźiny za serwerowym casom." -msgstr[3] "Glědajśo: Waš cas jo wó %s góźin za serwerowym casom." - -msgid "Choose a Time" -msgstr "Wubjeŕśo cas" - -msgid "Choose a time" -msgstr "Wubjeŕśo cas" - -msgid "Cancel" -msgstr "Pśetergnuś" - -msgid "Today" -msgstr "Źinsa" - -msgid "Choose a Date" -msgstr "Wubjeŕśo datum" - -msgid "Yesterday" -msgstr "Cora" - -msgid "Tomorrow" -msgstr "Witśe" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Měrc" - -msgid "April" -msgstr "Apryl" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Junij" - -msgid "July" -msgstr "Julij" - -msgid "August" -msgstr "Awgust" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "Nowember" - -msgid "December" -msgstr "December" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Měr." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun." - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul." - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Awg." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Now." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec." - -msgid "Sunday" -msgstr "Njeźela" - -msgid "Monday" -msgstr "Pónjeźele" - -msgid "Tuesday" -msgstr "Wałtora" - -msgid "Wednesday" -msgstr "Srjoda" - -msgid "Thursday" -msgstr "Stwórtk" - -msgid "Friday" -msgstr "Pětk" - -msgid "Saturday" -msgstr "Sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Nje" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pón" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Wał" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Srj" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Stw" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pět" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sob" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Nj" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Pó" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Wa" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Sr" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "St" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Pě" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "So" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index 0f88816..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index ec1dc94..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,737 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antonis Christofides , 2021 -# Dimitris Glezos , 2011 -# Giannis Meletakis , 2015 -# Jannis Leidel , 2011 -# Nick Mavrakis , 2016-2018,2021 -# Nick Mavrakis , 2016 -# Pãnoș , 2014 -# Pãnoș , 2014,2016,2019-2020 -# Yorgos Pagles , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-30 03:21+0000\n" -"Last-Translator: Antonis Christofides \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s: Διαγραφή επιλεγμένων" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Επιτυχώς διεγράφησαν %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Αδύνατη η διαγραφή του %(name)s" - -msgid "Are you sure?" -msgstr "Είστε σίγουρος;" - -msgid "Administration" -msgstr "Διαχείριση" - -msgid "All" -msgstr "Όλα" - -msgid "Yes" -msgstr "Ναι" - -msgid "No" -msgstr "Όχι" - -msgid "Unknown" -msgstr "Άγνωστο" - -msgid "Any date" -msgstr "Οποιαδήποτε ημερομηνία" - -msgid "Today" -msgstr "Σήμερα" - -msgid "Past 7 days" -msgstr "Τελευταίες 7 ημέρες" - -msgid "This month" -msgstr "Αυτό το μήνα" - -msgid "This year" -msgstr "Αυτό το χρόνο" - -msgid "No date" -msgstr "Καθόλου ημερομηνία" - -msgid "Has date" -msgstr "Έχει ημερομηνία" - -msgid "Empty" -msgstr "Χωρίς τιμή" - -msgid "Not empty" -msgstr "Με τιμή" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Παρακαλώ δώστε το σωστό %(username)s και συνθηματικό για λογαριασμό " -"προσωπικού. Και στα δύο πεδία μπορεί να έχει σημασία η διάκριση κεφαλαίων/" -"μικρών." - -msgid "Action:" -msgstr "Ενέργεια:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Να προστεθεί %(verbose_name)s" - -msgid "Remove" -msgstr "Αφαίρεση" - -msgid "Addition" -msgstr "Προσθήκη" - -msgid "Change" -msgstr "Αλλαγή" - -msgid "Deletion" -msgstr "Διαγραφή" - -msgid "action time" -msgstr "ώρα ενέργειας" - -msgid "user" -msgstr "χρήστης" - -msgid "content type" -msgstr "τύπος περιεχομένου" - -msgid "object id" -msgstr "ταυτότητα αντικειμένου" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "αναπαράσταση αντικειμένου" - -msgid "action flag" -msgstr "σημαία ενέργειας" - -msgid "change message" -msgstr "μήνυμα τροποποίησης" - -msgid "log entry" -msgstr "καταχώριση αρχείου καταγραφής" - -msgid "log entries" -msgstr "καταχωρίσεις αρχείου καταγραφής" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Προστέθηκε «%(object)s»." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Τροποποιήθηκε «%(object)s» — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Διαγράφηκε «%(object)s»." - -msgid "LogEntry Object" -msgstr "Αντικείμενο LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Προστέθηκε {name} “{object}”." - -msgid "Added." -msgstr "Προστέθηκε." - -msgid "and" -msgstr "και" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} «{object}»: Αλλαγή {fields}." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Αλλαγή {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Διεγράφη {name} «{object}»." - -msgid "No fields changed." -msgstr "Δεν άλλαξε κανένα πεδίο." - -msgid "None" -msgstr "Κανένα" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Κρατήστε πατημένο το «Control» («Command» σε Mac) για να επιλέξετε " -"περισσότερα από ένα αντικείμενα." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Προστέθηκε {name} «{obj}»." - -msgid "You may edit it again below." -msgstr "Μπορεί να πραγματοποιηθεί περαιτέρω επεξεργασία παρακάτω." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Προστέθηκε {name} «{obj}». Μπορεί να πραγματοποιηθεί νέα πρόσθεση παρακάτω." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Το αντικείμενο ({name}) «{obj}» τροποποιήθηκε. Μπορεί να πραγματοποιηθεί " -"περαιτέρω επεξεργασία παρακάτω." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"Προστέθηκε {name} «{obj}». Μπορεί να πραγματοποιηθεί περαιτέρω επεξεργασία " -"παρακάτω." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Το αντικείμενο ({name}) «{obj}» τροποποιήθηκε. Μπορεί να προστεθεί επιπλέον " -"{name} παρακάτω." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Το αντικείμενο ({name}) «{obj}» τροποποιήθηκε." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Καμία αλλαγή δεν πραγματοποιήθηκε γιατί δεν έχετε επιλέξει αντικείμενο. " -"Επιλέξτε ένα ή περισσότερα αντικείμενα για να πραγματοποιήσετε ενέργειες σ' " -"αυτά." - -msgid "No action selected." -msgstr "Δεν έχει επιλεγεί ενέργεια." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Διεγράφη το αντικείμενο (%(name)s) «%(obj)s»" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "Δεν υπάρχει %(name)s με ID «%(key)s». Ίσως να έχει διαγραφεί." - -#, python-format -msgid "Add %s" -msgstr "Να προστεθεί %s" - -#, python-format -msgid "Change %s" -msgstr "%s: Τροποποίηση" - -#, python-format -msgid "View %s" -msgstr "%s: Προβολή" - -msgid "Database error" -msgstr "Σφάλμα στη βάση δεδομένων" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s άλλαξε επιτυχώς." -msgstr[1] "%(count)s %(name)s άλλαξαν επιτυχώς." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Επιλέχθηκε %(total_count)s" -msgstr[1] "Επιλέχθηκαν και τα %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Επιλέχθηκαν 0 από %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Ιστορικό αλλαγών: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Η διαγραφή του αντικειμένου (%(class_name)s) %(instance)s θα απαιτούσε τη " -"διαγραφή των παρακάτω προστατευόμενων συσχετισμένων αντικειμένων: " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "Ιστότοπος διαχείρισης Django" - -msgid "Django administration" -msgstr "Διαχείριση Django" - -msgid "Site administration" -msgstr "Διαχείριση του ιστότοπου" - -msgid "Log in" -msgstr "Σύνδεση" - -#, python-format -msgid "%(app)s administration" -msgstr "Διαχείριση %(app)s" - -msgid "Page not found" -msgstr "Η σελίδα δεν βρέθηκε" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Λυπούμαστε, αλλά η σελίδα που ζητήθηκε δεν βρέθηκε." - -msgid "Home" -msgstr "Αρχική" - -msgid "Server error" -msgstr "Σφάλμα στο server" - -msgid "Server error (500)" -msgstr "Σφάλμα στο server (500)" - -msgid "Server Error (500)" -msgstr "Σφάλμα στο server (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Παρουσιάστηκε σφάλμα. Εστάλη στους διαχειριστές με email και πιθανότατα θα " -"διορθωθεί σύντομα. Ευχαριστούμε για την υπομονή σας." - -msgid "Run the selected action" -msgstr "Εκτέλεση της επιλεγμένης ενέργειας" - -msgid "Go" -msgstr "Μετάβαση" - -msgid "Click here to select the objects across all pages" -msgstr "Κάντε κλικ εδώ για να επιλέξετε τα αντικείμενα σε όλες τις σελίδες" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Επιλέξτε και τα %(total_count)s αντικείμενα (%(module_name)s)" - -msgid "Clear selection" -msgstr "Καθαρισμός επιλογής" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Μοντέλα στην εφαρμογή %(name)s" - -msgid "Add" -msgstr "Προσθήκη" - -msgid "View" -msgstr "Προβολή" - -msgid "You don’t have permission to view or edit anything." -msgstr "Δεν έχετε δικαίωμα να δείτε ή να επεξεργαστείτε κάτι." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Καταρχήν προσδιορίστε όνομα χρήστη και συνθηματικό. Κατόπιν θα σας δοθεί η " -"δυνατότητα να εισαγάγετε περισσότερες πληροφορίες για το χρήστη." - -msgid "Enter a username and password." -msgstr "Προσδιορίστε όνομα χρήστη και συνθηματικό." - -msgid "Change password" -msgstr "Αλλαγή συνθηματικού" - -msgid "Please correct the error below." -msgstr "Παρακαλούμε διορθώστε το παρακάτω λάθος." - -msgid "Please correct the errors below." -msgstr "Παρακαλοϋμε διορθώστε τα παρακάτω λάθη." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Προσδιορίστε νέο συνθηματικό για το χρήστη %(username)s." - -msgid "Welcome," -msgstr "Καλώς ήρθατε," - -msgid "View site" -msgstr "Μετάβαση στην εφαρμογή" - -msgid "Documentation" -msgstr "Τεκμηρίωση" - -msgid "Log out" -msgstr "Αποσύνδεση" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s: προσθήκη" - -msgid "History" -msgstr "Ιστορικό" - -msgid "View on site" -msgstr "Προβολή στον ιστότοπο" - -msgid "Filter" -msgstr "Φίλτρο" - -msgid "Clear all filters" -msgstr "Καθαρισμός όλων των φίλτρων" - -msgid "Remove from sorting" -msgstr "Αφαίρεση από την ταξινόμηση" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Προτεραιότητα ταξινόμησης: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Εναλλαγή ταξινόμησης" - -msgid "Delete" -msgstr "Διαγραφή" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Επιλέξατε τη διαγραφή του αντικειμένου '%(escaped_object)s' τύπου " -"%(object_name)s. Αυτό συνεπάγεται τη διαγραφή συσχετισμένων αντικειμενων για " -"τα οποία δεν έχετε δικάιωμα διαγραφής. Οι τύποι των αντικειμένων αυτών είναι:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Η διαγραφή του αντικειμένου (%(object_name)s) «%(escaped_object)s» απαιτεί " -"τη διαγραφή των παρακάτω προστατευόμενων αντικειμένων:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Επιβεβαιώστε ότι επιθυμείτε τη διαγραφή των επιλεγμένων αντικειμένων " -"(%(object_name)s \"%(escaped_object)s\"). Αν προχωρήσετε με τη διαγραφή, όλα " -"τα παρακάτω συσχετισμένα αντικείμενα θα διαγραφούν επίσης:" - -msgid "Objects" -msgstr "Αντικείμενα" - -msgid "Yes, I’m sure" -msgstr "Ναι" - -msgid "No, take me back" -msgstr "Όχι" - -msgid "Delete multiple objects" -msgstr "Διαγραφή πολλαπλών αντικειμένων" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Η διαγραφή των επιλεγμένων αντικειμένων τύπου «%(objects_name)s» θα είχε " -"αποτέλεσμα τη διαγραφή των ακόλουθων συσχετισμένων αντικειμένων για τα οποία " -"δεν έχετε το διακαίωμα διαγραφής:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Η διαγραφή των επιλεγμένων αντικειμένων τύπου «%(objects_name)s» απαιτεί τη " -"διαγραφή των παρακάτω προστατευμένων συσχετισμένων αντικειμένων:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Επιβεβαιώστε ότι επιθυμείτε τη διαγραφή των επιλεγμένων αντικειμένων τύπου " -"«%(objects_name)s». Αν προχωρήσετε με τη διαγραφή, όλα τα παρακάτω " -"συσχετισμένα αντικείμενα θα διαγραφούν επίσης:" - -msgid "Delete?" -msgstr "Διαγραφή;" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Ανά %(filter_title)s " - -msgid "Summary" -msgstr "Περίληψη" - -msgid "Recent actions" -msgstr "Πρόσφατες ενέργειες" - -msgid "My actions" -msgstr "Οι ενέργειές μου" - -msgid "None available" -msgstr "Κανένα διαθέσιμο" - -msgid "Unknown content" -msgstr "Άγνωστο περιεχόμενο" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Υπάρχει κάποιο πρόβλημα στη βάση δεδομένων. Βεβαιωθείτε πως οι κατάλληλοι " -"πίνακες έχουν δημιουργηθεί και πως υπάρχουν τα κατάλληλα δικαιώματα " -"πρόσβασης." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Έχετε ταυτοποιηθεί ως %(username)s, αλλά δεν έχετε δικαίωμα πρόσβασης σ' " -"αυτή τη σελίδα. Θέλετε να συνδεθείτε με άλλο λογαριασμό;" - -msgid "Forgotten your password or username?" -msgstr "Ξεχάσατε το συνθηματικό ή το όνομα χρήστη σας;" - -msgid "Toggle navigation" -msgstr "Εναλλαγή προβολής πλοήγησης" - -msgid "Date/time" -msgstr "Ημερομηνία/ώρα" - -msgid "User" -msgstr "Χρήστης" - -msgid "Action" -msgstr "Ενέργεια" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Αυτό το αντικείμενο δεν έχει ιστορικό αλλαγών. Πιθανότατα δεν προστέθηκε " -"μέσω του παρόντος διαχειριστικού ιστότοπου." - -msgid "Show all" -msgstr "Εμφάνιση όλων" - -msgid "Save" -msgstr "Αποθήκευση" - -msgid "Popup closing…" -msgstr "Κλείσιμο popup..." - -msgid "Search" -msgstr "Αναζήτηση" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s αποτέλεσμα" -msgstr[1] "%(counter)s αποτελέσματα" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s συνολικά" - -msgid "Save as new" -msgstr "Αποθήκευση ως νέου" - -msgid "Save and add another" -msgstr "Αποθήκευση και προσθήκη καινούργιου" - -msgid "Save and continue editing" -msgstr "Αποθήκευση και συνέχεια επεξεργασίας" - -msgid "Save and view" -msgstr "Αποθήκευση και προβολή" - -msgid "Close" -msgstr "Κλείσιμο" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Να τροποποιηθεί το επιλεγμένο αντικείμενο (%(model)s)" - -#, python-format -msgid "Add another %(model)s" -msgstr "Να προστεθεί %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Να διαγραφεί το επιλεγμένο αντικείμενο (%(model)s)" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Ευχαριστούμε που διαθέσατε χρόνο στον ιστότοπο." - -msgid "Log in again" -msgstr "Επανασύνδεση" - -msgid "Password change" -msgstr "Αλλαγή συνθηματικού" - -msgid "Your password was changed." -msgstr "Το συνθηματικό σας αλλάχθηκε." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Δώστε το παλιό σας συνθηματικό και ακολούθως το νέο σας συνθηματικό δύο " -"φορές ώστε να ελέγξουμε ότι το πληκτρολογήσατε σωστά." - -msgid "Change my password" -msgstr "Αλλαγή του συνθηματικού μου" - -msgid "Password reset" -msgstr "Επαναφορά συνθηματικού" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Το συνθηματικό σας ορίστηκε. Μπορείτε τώρα να συνδεθείτε." - -msgid "Password reset confirmation" -msgstr "Επιβεβαίωση επαναφοράς συνθηματικού" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Δώστε το νέο συνθηματικό σας δύο φορές ώστε να ελέγξουμε ότι το " -"πληκτρολογήσατε σωστά." - -msgid "New password:" -msgstr "Νέο συνθηματικό:" - -msgid "Confirm password:" -msgstr "Επιβεβαίωση συνθηματικού:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Ο σύνδεσμος που χρησιμοποιήσατε για την επαναφορά του συνθηματικού δεν είναι " -"σωστός, ίσως γιατί έχει ήδη χρησιμοποιηθεί. Πραγματοποιήστε εξαρχής τη " -"διαδικασία αίτησης επαναφοράς του συνθηματικού." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Σας στείλαμε email με οδηγίες ορισμού συνθηματικού. Θα πρέπει να το λάβετε " -"σύντομα." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Εάν δεν λάβετε email, παρακαλούμε σιγουρευτείτε ότι έχετε εισαγάγει τη " -"διεύθυνση με την οποία έχετε εγγραφεί, και ελέγξτε το φάκελο ανεπιθύμητης " -"αλληλογραφίας." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Λαμβάνετε αυτό το email επειδή ζητήσατε επαναφορά συνθηματικού για το " -"λογαριασμό σας στον ιστότοπο %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Παρακαλούμε επισκεφθείτε την ακόλουθη σελίδα και επιλέξτε νέο συνθηματικό: " - -msgid "Your username, in case you’ve forgotten:" -msgstr "Το όνομα χρήστη, σε περίπτωση που δεν το θυμάστε:" - -msgid "Thanks for using our site!" -msgstr "Ευχαριστούμε που χρησιμοποιήσατε τον ιστότοπό μας!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Η ομάδα του ιστότοπου %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Ξεχάσατε το συνθηματικό σας; Εισαγάγετε το email σας και θα σας στείλουμε " -"οδηγίες για να ορίσετε καινούργιο." - -msgid "Email address:" -msgstr "Διεύθυνση email:" - -msgid "Reset my password" -msgstr "Επαναφορά του συνθηματικού μου" - -msgid "All dates" -msgstr "Όλες οι ημερομηνίες" - -#, python-format -msgid "Select %s" -msgstr "Επιλέξτε αντικείμενο (%s)" - -#, python-format -msgid "Select %s to change" -msgstr "Επιλέξτε αντικείμενο (%s) προς αλλαγή" - -#, python-format -msgid "Select %s to view" -msgstr "Επιλέξτε αντικείμενο (%s) για προβολή" - -msgid "Date:" -msgstr "Ημ/νία:" - -msgid "Time:" -msgstr "Ώρα:" - -msgid "Lookup" -msgstr "Αναζήτηση" - -msgid "Currently:" -msgstr "Τώρα:" - -msgid "Change:" -msgstr "Επεξεργασία:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 5548ab0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1ffee5d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,272 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dimitris Glezos , 2011 -# Fotis Athineos , 2021 -# glogiotatidis , 2011 -# Jannis Leidel , 2011 -# Nikolas Demiridis , 2014 -# Nick Mavrakis , 2016 -# Pãnoș , 2014 -# Pãnoș , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-08-04 06:47+0000\n" -"Last-Translator: Fotis Athineos \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Διαθέσιμο %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Αυτή είναι η λίστα των διαθέσιμων %s. Μπορείτε να επιλέξετε κάποια, από το " -"παρακάτω πεδίο και πατώντας το βέλος \"Επιλογή\" μεταξύ των δύο πεδίων." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Πληκτρολογήστε σε αυτό το πεδίο για να φιλτράρετε τη λίστα των διαθέσιμων %s." - -msgid "Filter" -msgstr "Φίλτρο" - -msgid "Choose all" -msgstr "Επιλογή όλων" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Πατήστε για επιλογή όλων των %s με τη μία." - -msgid "Choose" -msgstr "Επιλογή" - -msgid "Remove" -msgstr "Αφαίρεση" - -#, javascript-format -msgid "Chosen %s" -msgstr "Επιλέχθηκε %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Αυτή είναι η λίστα των επιλεγμένων %s. Μπορείτε να αφαιρέσετε μερικά " -"επιλέγοντας τα απο το κουτί παρακάτω και μετά κάνοντας κλίκ στο βελάκι " -"\"Αφαίρεση\" ανάμεσα στα δύο κουτιά." - -msgid "Remove all" -msgstr "Αφαίρεση όλων" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Κλίκ για να αφαιρεθούν όλα τα επιλεγμένα %s με τη μία." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s από %(cnt)s επιλεγμένα" -msgstr[1] "%(sel)s από %(cnt)s επιλεγμένα" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Έχετε μη αποθηκευμένες αλλαγές σε μεμονωμένα επεξεργάσιμα πεδία. Άν " -"εκτελέσετε μια ενέργεια, οι μη αποθηκευμένες αλλάγες θα χαθούν" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Έχετε επιλέξει μια ενέργεια, αλλά δεν έχετε αποθηκεύσει τις αλλαγές στα " -"εκάστωτε πεδία ακόμα. Παρακαλώ πατήστε ΟΚ για να τις αποθηκεύσετε. Θα " -"χρειαστεί να εκτελέσετε ξανά την ενέργεια." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Έχετε επιλέξει μια ενέργεια, και δεν έχετε κάνει καμία αλλαγή στα εκάστοτε " -"πεδία. Πιθανών θέλετε το κουμπί Go αντί του κουμπιού Αποθήκευσης." - -msgid "Now" -msgstr "Τώρα" - -msgid "Midnight" -msgstr "Μεσάνυχτα" - -msgid "6 a.m." -msgstr "6 π.μ." - -msgid "Noon" -msgstr "Μεσημέρι" - -msgid "6 p.m." -msgstr "6 μ.μ." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Σημείωση: Είστε %s ώρα μπροστά από την ώρα του εξυπηρετητή." -msgstr[1] "Σημείωση: Είστε %s ώρες μπροστά από την ώρα του εξυπηρετητή." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Σημείωση: Είστε %s ώρα πίσω από την ώρα του εξυπηρετητή" -msgstr[1] "Σημείωση: Είστε %s ώρες πίσω από την ώρα του εξυπηρετητή." - -msgid "Choose a Time" -msgstr "Επιλέξτε Χρόνο" - -msgid "Choose a time" -msgstr "Επιλέξτε χρόνο" - -msgid "Cancel" -msgstr "Ακύρωση" - -msgid "Today" -msgstr "Σήμερα" - -msgid "Choose a Date" -msgstr "Επιλέξτε μια Ημερομηνία" - -msgid "Yesterday" -msgstr "Χθές" - -msgid "Tomorrow" -msgstr "Αύριο" - -msgid "January" -msgstr "Ιανουάριος" - -msgid "February" -msgstr "Φεβρουάριος" - -msgid "March" -msgstr "Μάρτιος" - -msgid "April" -msgstr "Απρίλιος" - -msgid "May" -msgstr "Μάιος" - -msgid "June" -msgstr "Ιούνιος" - -msgid "July" -msgstr "Ιούλιος" - -msgid "August" -msgstr "Αύγουστος" - -msgid "September" -msgstr "Σεπτέμβριος" - -msgid "October" -msgstr "Οκτώβριος" - -msgid "November" -msgstr "Νοέμβριος" - -msgid "December" -msgstr "Δεκέμβριος" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Ιαν" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Φεβ" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Μάρ" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Απρ" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Μάι" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Ιούν" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Ιούλ" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Αύγ" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Σεπ" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Οκτ" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Νοέ" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Δεκ" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Κ" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Δ" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Τ" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Τ" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Π" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Π" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Σ" - -msgid "Show" -msgstr "Προβολή" - -msgid "Hide" -msgstr "Απόκρυψη" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 08a7b68..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index 227511f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,992 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: contrib/admin/actions.py:17 -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -#: contrib/admin/actions.py:52 -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#: contrib/admin/actions.py:62 contrib/admin/options.py:2250 -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -#: contrib/admin/actions.py:64 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:17 -msgid "Delete multiple objects" -msgstr "" - -#: contrib/admin/apps.py:13 -msgid "Administration" -msgstr "" - -#: contrib/admin/filters.py:154 contrib/admin/filters.py:296 -#: contrib/admin/filters.py:365 contrib/admin/filters.py:433 -#: contrib/admin/filters.py:608 contrib/admin/filters.py:702 -msgid "All" -msgstr "" - -#: contrib/admin/filters.py:366 -msgid "Yes" -msgstr "" - -#: contrib/admin/filters.py:367 -msgid "No" -msgstr "" - -#: contrib/admin/filters.py:381 -msgid "Unknown" -msgstr "" - -#: contrib/admin/filters.py:491 -msgid "Any date" -msgstr "" - -#: contrib/admin/filters.py:493 -msgid "Today" -msgstr "" - -#: contrib/admin/filters.py:500 -msgid "Past 7 days" -msgstr "" - -#: contrib/admin/filters.py:507 -msgid "This month" -msgstr "" - -#: contrib/admin/filters.py:514 -msgid "This year" -msgstr "" - -#: contrib/admin/filters.py:524 -msgid "No date" -msgstr "" - -#: contrib/admin/filters.py:525 -msgid "Has date" -msgstr "" - -#: contrib/admin/filters.py:703 -msgid "Empty" -msgstr "" - -#: contrib/admin/filters.py:704 -msgid "Not empty" -msgstr "" - -#: contrib/admin/forms.py:14 -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -#: contrib/admin/helpers.py:31 -msgid "Action:" -msgstr "" - -#: contrib/admin/helpers.py:433 -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -#: contrib/admin/helpers.py:437 -msgid "Remove" -msgstr "" - -#: contrib/admin/models.py:20 -msgid "Addition" -msgstr "" - -#: contrib/admin/models.py:21 contrib/admin/templates/admin/app_list.html:38 -#: contrib/admin/templates/admin/edit_inline/stacked.html:20 -#: contrib/admin/templates/admin/edit_inline/tabular.html:40 -msgid "Change" -msgstr "" - -#: contrib/admin/models.py:22 -msgid "Deletion" -msgstr "" - -#: contrib/admin/models.py:108 -msgid "action time" -msgstr "" - -#: contrib/admin/models.py:115 -msgid "user" -msgstr "" - -#: contrib/admin/models.py:120 -msgid "content type" -msgstr "" - -#: contrib/admin/models.py:124 -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -#: contrib/admin/models.py:127 -msgid "object repr" -msgstr "" - -#: contrib/admin/models.py:129 -msgid "action flag" -msgstr "" - -#: contrib/admin/models.py:132 -msgid "change message" -msgstr "" - -#: contrib/admin/models.py:137 -msgid "log entry" -msgstr "" - -#: contrib/admin/models.py:138 -msgid "log entries" -msgstr "" - -#: contrib/admin/models.py:147 -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#: contrib/admin/models.py:149 -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#: contrib/admin/models.py:154 -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -#: contrib/admin/models.py:156 -msgid "LogEntry Object" -msgstr "" - -#: contrib/admin/models.py:185 -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -#: contrib/admin/models.py:190 -msgid "Added." -msgstr "" - -#: contrib/admin/models.py:198 contrib/admin/options.py:2504 -msgid "and" -msgstr "" - -#: contrib/admin/models.py:205 -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#: contrib/admin/models.py:211 -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#: contrib/admin/models.py:221 -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -#: contrib/admin/models.py:227 -msgid "No fields changed." -msgstr "" - -#: contrib/admin/options.py:248 contrib/admin/options.py:292 -msgid "None" -msgstr "" - -#: contrib/admin/options.py:344 -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#: contrib/admin/options.py:1031 -msgid "Select this object for an action - {}" -msgstr "" - -#: contrib/admin/options.py:1469 contrib/admin/options.py:1507 -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -#: contrib/admin/options.py:1471 -msgid "You may edit it again below." -msgstr "" - -#: contrib/admin/options.py:1488 -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#: contrib/admin/options.py:1556 -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#: contrib/admin/options.py:1576 -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#: contrib/admin/options.py:1598 -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -#: contrib/admin/options.py:1676 contrib/admin/options.py:2066 -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -#: contrib/admin/options.py:1696 -msgid "No action selected." -msgstr "" - -#: contrib/admin/options.py:1727 -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#: contrib/admin/options.py:1829 -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#: contrib/admin/options.py:1945 -#, python-format -msgid "Add %s" -msgstr "" - -#: contrib/admin/options.py:1947 -#, python-format -msgid "Change %s" -msgstr "" - -#: contrib/admin/options.py:1949 -#, python-format -msgid "View %s" -msgstr "" - -#: contrib/admin/options.py:2036 -msgid "Database error" -msgstr "" - -#: contrib/admin/options.py:2126 -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/options.py:2157 -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/options.py:2163 -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#: contrib/admin/options.py:2252 -#: contrib/admin/templates/admin/delete_confirmation.html:18 -#: contrib/admin/templates/admin/submit_line.html:14 -msgid "Delete" -msgstr "" - -#: contrib/admin/options.py:2308 -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#: contrib/admin/options.py:2498 -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#: contrib/admin/options.py:2507 -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -#: contrib/admin/sites.py:40 contrib/admin/templates/admin/base_site.html:3 -msgid "Django site admin" -msgstr "" - -#: contrib/admin/sites.py:43 contrib/admin/templates/admin/base_site.html:6 -msgid "Django administration" -msgstr "" - -#: contrib/admin/sites.py:46 -msgid "Site administration" -msgstr "" - -#: contrib/admin/sites.py:431 contrib/admin/templates/admin/login.html:64 -#: contrib/admin/templates/registration/password_reset_complete.html:15 -#: contrib/admin/tests.py:146 -msgid "Log in" -msgstr "" - -#: contrib/admin/sites.py:586 -#, python-format -msgid "%(app)s administration" -msgstr "" - -#: contrib/admin/templates/admin/404.html:4 -#: contrib/admin/templates/admin/404.html:8 -msgid "Page not found" -msgstr "" - -#: contrib/admin/templates/admin/404.html:10 -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -#: contrib/admin/templates/admin/500.html:6 -#: contrib/admin/templates/admin/app_index.html:10 -#: contrib/admin/templates/admin/auth/user/change_password.html:15 -#: contrib/admin/templates/admin/base.html:75 -#: contrib/admin/templates/admin/change_form.html:19 -#: contrib/admin/templates/admin/change_list.html:33 -#: contrib/admin/templates/admin/delete_confirmation.html:14 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:14 -#: contrib/admin/templates/admin/invalid_setup.html:6 -#: contrib/admin/templates/admin/object_history.html:6 -#: contrib/admin/templates/registration/logged_out.html:4 -#: contrib/admin/templates/registration/password_change_done.html:13 -#: contrib/admin/templates/registration/password_change_form.html:16 -#: contrib/admin/templates/registration/password_reset_complete.html:6 -#: contrib/admin/templates/registration/password_reset_confirm.html:8 -#: contrib/admin/templates/registration/password_reset_done.html:6 -#: contrib/admin/templates/registration/password_reset_form.html:8 -msgid "Home" -msgstr "" - -#: contrib/admin/templates/admin/500.html:7 -msgid "Server error" -msgstr "" - -#: contrib/admin/templates/admin/500.html:11 -msgid "Server error (500)" -msgstr "" - -#: contrib/admin/templates/admin/500.html:14 -msgid "Server Error (500)" -msgstr "" - -#: contrib/admin/templates/admin/500.html:15 -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -#: contrib/admin/templates/admin/actions.html:8 -msgid "Run the selected action" -msgstr "" - -#: contrib/admin/templates/admin/actions.html:8 -msgid "Go" -msgstr "" - -#: contrib/admin/templates/admin/actions.html:16 -msgid "Click here to select the objects across all pages" -msgstr "" - -#: contrib/admin/templates/admin/actions.html:16 -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -#: contrib/admin/templates/admin/actions.html:18 -msgid "Clear selection" -msgstr "" - -#: contrib/admin/templates/admin/app_index.html:8 -#: contrib/admin/templates/admin/base.html:72 -msgid "Breadcrumbs" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:8 -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:12 -msgid "Model name" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:13 -msgid "Add link" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:14 -msgid "Change or view list link" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:29 -msgid "Add" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:36 -#: contrib/admin/templates/admin/edit_inline/stacked.html:20 -#: contrib/admin/templates/admin/edit_inline/tabular.html:40 -msgid "View" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:50 -msgid "You don’t have permission to view or edit anything." -msgstr "" - -#: contrib/admin/templates/admin/auth/user/add_form.html:6 -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:5 -#: contrib/admin/templates/admin/change_form.html:4 -#: contrib/admin/templates/admin/change_list.html:4 -#: contrib/admin/templates/admin/login.html:4 -#: contrib/admin/templates/registration/password_change_form.html:4 -#: contrib/admin/templates/registration/password_reset_confirm.html:4 -#: contrib/admin/templates/registration/password_reset_form.html:4 -msgid "Error:" -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:19 -#: contrib/admin/templates/admin/auth/user/change_password.html:71 -#: contrib/admin/templates/admin/base.html:56 -#: contrib/admin/templates/registration/password_change_done.html:4 -#: contrib/admin/templates/registration/password_change_form.html:7 -msgid "Change password" -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:19 -msgid "Set password" -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:30 -#: contrib/admin/templates/admin/change_form.html:45 -#: contrib/admin/templates/admin/change_list.html:54 -#: contrib/admin/templates/admin/login.html:24 -#: contrib/admin/templates/registration/password_change_form.html:27 -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:34 -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:36 -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:72 -msgid "Disable password-based authentication" -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:74 -msgid "Enable password-based authentication" -msgstr "" - -#: contrib/admin/templates/admin/base.html:27 -msgid "Skip to main content" -msgstr "" - -#: contrib/admin/templates/admin/base.html:42 -msgid "Welcome," -msgstr "" - -#: contrib/admin/templates/admin/base.html:47 -msgid "View site" -msgstr "" - -#: contrib/admin/templates/admin/base.html:52 -#: contrib/admin/templates/registration/password_change_done.html:4 -#: contrib/admin/templates/registration/password_change_form.html:7 -msgid "Documentation" -msgstr "" - -#: contrib/admin/templates/admin/base.html:60 -#: contrib/admin/templates/registration/password_change_done.html:7 -#: contrib/admin/templates/registration/password_change_form.html:10 -msgid "Log out" -msgstr "" - -#: contrib/admin/templates/admin/change_form.html:22 -#: contrib/admin/templates/admin/change_list_object_tools.html:8 -#, python-format -msgid "Add %(name)s" -msgstr "" - -#: contrib/admin/templates/admin/change_form_object_tools.html:5 -#: contrib/admin/templates/admin/object_history.html:10 -msgid "History" -msgstr "" - -#: contrib/admin/templates/admin/change_form_object_tools.html:7 -#: contrib/admin/templates/admin/edit_inline/stacked.html:22 -#: contrib/admin/templates/admin/edit_inline/tabular.html:42 -msgid "View on site" -msgstr "" - -#: contrib/admin/templates/admin/change_list.html:79 -msgid "Filter" -msgstr "" - -#: contrib/admin/templates/admin/change_list.html:82 -msgid "Hide counts" -msgstr "" - -#: contrib/admin/templates/admin/change_list.html:83 -msgid "Show counts" -msgstr "" - -#: contrib/admin/templates/admin/change_list.html:86 -msgid "Clear all filters" -msgstr "" - -#: contrib/admin/templates/admin/change_list_results.html:16 -msgid "Remove from sorting" -msgstr "" - -#: contrib/admin/templates/admin/change_list_results.html:17 -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -#: contrib/admin/templates/admin/change_list_results.html:18 -msgid "Toggle sorting" -msgstr "" - -#: contrib/admin/templates/admin/color_theme_toggle.html:3 -msgid "Toggle theme (current theme: auto)" -msgstr "" - -#: contrib/admin/templates/admin/color_theme_toggle.html:4 -msgid "Toggle theme (current theme: light)" -msgstr "" - -#: contrib/admin/templates/admin/color_theme_toggle.html:5 -msgid "Toggle theme (current theme: dark)" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:25 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:30 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:35 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:37 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:31 -msgid "Objects" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:44 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:42 -msgid "Yes, I’m sure" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:45 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:43 -msgid "No, take me back" -msgstr "" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:23 -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:26 -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:29 -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -#: contrib/admin/templates/admin/edit_inline/tabular.html:26 -msgid "Delete?" -msgstr "" - -#: contrib/admin/templates/admin/filter.html:4 -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -#: contrib/admin/templates/admin/includes/object_delete_summary.html:2 -msgid "Summary" -msgstr "" - -#: contrib/admin/templates/admin/index.html:23 -msgid "Recent actions" -msgstr "" - -#: contrib/admin/templates/admin/index.html:24 -msgid "My actions" -msgstr "" - -#: contrib/admin/templates/admin/index.html:28 -msgid "None available" -msgstr "" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Added:" -msgstr "" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Changed:" -msgstr "" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Deleted:" -msgstr "" - -#: contrib/admin/templates/admin/index.html:43 -msgid "Unknown content" -msgstr "" - -#: contrib/admin/templates/admin/invalid_setup.html:12 -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#: contrib/admin/templates/admin/login.html:40 -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -#: contrib/admin/templates/admin/login.html:60 -msgid "Forgotten your login credentials?" -msgstr "" - -#: contrib/admin/templates/admin/nav_sidebar.html:2 -msgid "Toggle navigation" -msgstr "" - -#: contrib/admin/templates/admin/nav_sidebar.html:3 -msgid "Sidebar" -msgstr "" - -#: contrib/admin/templates/admin/nav_sidebar.html:5 -msgid "Start typing to filter…" -msgstr "" - -#: contrib/admin/templates/admin/nav_sidebar.html:6 -msgid "Filter navigation items" -msgstr "" - -#: contrib/admin/templates/admin/object_history.html:22 -msgid "Date/time" -msgstr "" - -#: contrib/admin/templates/admin/object_history.html:23 -msgid "User" -msgstr "" - -#: contrib/admin/templates/admin/object_history.html:24 -msgid "Action" -msgstr "" - -#: contrib/admin/templates/admin/object_history.html:49 -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/templates/admin/object_history.html:52 -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -#: contrib/admin/templates/admin/pagination.html:10 -#: contrib/admin/templates/admin/search_form.html:9 -msgid "Show all" -msgstr "" - -#: contrib/admin/templates/admin/pagination.html:11 -#: contrib/admin/templates/admin/submit_line.html:4 -msgid "Save" -msgstr "" - -#: contrib/admin/templates/admin/popup_response.html:3 -msgid "Popup closing…" -msgstr "" - -#: contrib/admin/templates/admin/search_form.html:7 -msgid "Search" -msgstr "" - -#: contrib/admin/templates/admin/search_form.html:9 -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/templates/admin/search_form.html:9 -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -#: contrib/admin/templates/admin/submit_line.html:5 -msgid "Save as new" -msgstr "" - -#: contrib/admin/templates/admin/submit_line.html:6 -msgid "Save and add another" -msgstr "" - -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save and continue editing" -msgstr "" - -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save and view" -msgstr "" - -#: contrib/admin/templates/admin/submit_line.html:10 -msgid "Close" -msgstr "" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:11 -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:19 -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:27 -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:34 -#, python-format -msgid "View selected %(model)s" -msgstr "" - -#: contrib/admin/templates/registration/logged_out.html:10 -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -#: contrib/admin/templates/registration/logged_out.html:12 -msgid "Log in again" -msgstr "" - -#: contrib/admin/templates/registration/password_change_done.html:14 -#: contrib/admin/templates/registration/password_change_form.html:17 -msgid "Password change" -msgstr "" - -#: contrib/admin/templates/registration/password_change_done.html:19 -msgid "Your password was changed." -msgstr "" - -#: contrib/admin/templates/registration/password_change_form.html:32 -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -#: contrib/admin/templates/registration/password_change_form.html:60 -#: contrib/admin/templates/registration/password_reset_confirm.html:38 -msgid "Change my password" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_complete.html:7 -#: contrib/admin/templates/registration/password_reset_done.html:7 -#: contrib/admin/templates/registration/password_reset_form.html:9 -msgid "Password reset" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_complete.html:13 -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_confirm.html:9 -msgid "Password reset confirmation" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_confirm.html:17 -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_confirm.html:25 -msgid "New password:" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_confirm.html:32 -msgid "Confirm password:" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_confirm.html:44 -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_done.html:13 -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_done.html:15 -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_email.html:2 -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_email.html:4 -msgid "Please go to the following page and choose a new password:" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_email.html:8 -msgid "In case you’ve forgotten, you are:" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_email.html:10 -msgid "Thanks for using our site!" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_email.html:12 -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_form.html:15 -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_form.html:22 -msgid "Email address:" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_form.html:28 -msgid "Reset my password" -msgstr "" - -#: contrib/admin/templatetags/admin_list.py:101 -msgid "Select all objects on this page for an action" -msgstr "" - -#: contrib/admin/templatetags/admin_list.py:445 -msgid "All dates" -msgstr "" - -#: contrib/admin/views/main.py:148 -#, python-format -msgid "Select %s" -msgstr "" - -#: contrib/admin/views/main.py:150 -#, python-format -msgid "Select %s to change" -msgstr "" - -#: contrib/admin/views/main.py:152 -#, python-format -msgid "Select %s to view" -msgstr "" - -#: contrib/admin/widgets.py:99 -msgid "Date:" -msgstr "" - -#: contrib/admin/widgets.py:100 -msgid "Time:" -msgstr "" - -#: contrib/admin/widgets.py:164 -msgid "Lookup" -msgstr "" - -#: contrib/admin/widgets.py:393 -msgid "Currently:" -msgstr "" - -#: contrib/admin/widgets.py:394 -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 08a7b68..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po deleted file mode 100644 index 8fdbb77..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,379 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: contrib/admin/static/admin/js/SelectFilter2.js:45 -#, javascript-format -msgid "Available %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:49 -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:61 -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:66 -#: contrib/admin/static/admin/js/SelectFilter2.js:123 -msgid "Filter" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:73 -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:84 -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:91 -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:102 -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:106 -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:118 -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:139 -msgid "(click to clear)" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:143 -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:236 -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/static/admin/js/actions.js:67 -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/static/admin/js/actions.js:161 -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -#: contrib/admin/static/admin/js/actions.js:174 -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -#: contrib/admin/static/admin/js/actions.js:175 -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:13 -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:110 -msgid "Now" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:14 -msgid "Midnight" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:15 -msgid "6 a.m." -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:16 -msgid "Noon" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:17 -msgid "6 p.m." -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:78 -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:86 -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:128 -msgid "Choose a Time" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:158 -msgid "Choose a time" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:175 -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:333 -msgid "Cancel" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:238 -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:318 -msgid "Today" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:255 -msgid "Choose a Date" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:312 -msgid "Yesterday" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:324 -msgid "Tomorrow" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:11 -msgid "January" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:12 -msgid "February" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:13 -msgid "March" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:14 -msgid "April" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:15 -msgid "May" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:16 -msgid "June" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:17 -msgid "July" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:18 -msgid "August" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:19 -msgid "September" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:20 -msgid "October" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:21 -msgid "November" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:22 -msgid "December" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:25 -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:26 -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:27 -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:28 -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:29 -msgctxt "abbrev. month May" -msgid "May" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:30 -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:31 -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:32 -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:33 -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:34 -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:35 -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:36 -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:39 -msgid "Sunday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:40 -msgid "Monday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:41 -msgid "Tuesday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:42 -msgid "Wednesday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:43 -msgid "Thursday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:44 -msgid "Friday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:45 -msgid "Saturday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:48 -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:49 -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:50 -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:51 -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:52 -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:53 -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:54 -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:57 -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:58 -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:59 -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:60 -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:61 -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:62 -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:63 -msgctxt "one letter Saturday" -msgid "S" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index c86ec5d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index dfe62a0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,724 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2014 -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-09-22 07:21+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Delete selected %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Successfully deleted %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Cannot delete %(name)s" - -msgid "Are you sure?" -msgstr "Are you sure?" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "All" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Unknown" - -msgid "Any date" -msgstr "Any date" - -msgid "Today" -msgstr "Today" - -msgid "Past 7 days" -msgstr "Past 7 days" - -msgid "This month" -msgstr "This month" - -msgid "This year" -msgstr "This year" - -msgid "No date" -msgstr "No date" - -msgid "Has date" -msgstr "Has date" - -msgid "Empty" -msgstr "Empty" - -msgid "Not empty" -msgstr "Not empty" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." - -msgid "Action:" -msgstr "Action:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Add another %(verbose_name)s" - -msgid "Remove" -msgstr "Remove" - -msgid "Addition" -msgstr "Addition" - -msgid "Change" -msgstr "Change" - -msgid "Deletion" -msgstr "Deletion" - -msgid "action time" -msgstr "action time" - -msgid "user" -msgstr "user" - -msgid "content type" -msgstr "content type" - -msgid "object id" -msgstr "object id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "object repr" - -msgid "action flag" -msgstr "action flag" - -msgid "change message" -msgstr "change message" - -msgid "log entry" -msgstr "log entry" - -msgid "log entries" -msgstr "log entries" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Added “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Changed “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Deleted “%(object)s.”" - -msgid "LogEntry Object" -msgstr "LogEntry Object" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Added {name} “{object}”." - -msgid "Added." -msgstr "Added." - -msgid "and" -msgstr "and" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Changed {fields} for {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Changed {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Deleted {name} “{object}”." - -msgid "No fields changed." -msgstr "No fields changed." - -msgid "None" -msgstr "None" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Hold down “Control”, or “Command” on a Mac, to select more than one." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "The {name} “{obj}” was added successfully." - -msgid "You may edit it again below." -msgstr "You may edit it again below." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"The {name} “{obj}” was added successfully. You may add another {name} below." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"The {name} “{obj}” was changed successfully. You may edit it again below." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"The {name} “{obj}” was added successfully. You may edit it again below." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "The {name} “{obj}” was changed successfully." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." - -msgid "No action selected." -msgstr "No action selected." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "The %(name)s “%(obj)s” was deleted successfully." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" - -#, python-format -msgid "Add %s" -msgstr "Add %s" - -#, python-format -msgid "Change %s" -msgstr "Change %s" - -#, python-format -msgid "View %s" -msgstr "View %s" - -msgid "Database error" -msgstr "Database error" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s was changed successfully." -msgstr[1] "%(count)s %(name)s were changed successfully." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selected" -msgstr[1] "All %(total_count)s selected" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 of %(cnt)s selected" - -#, python-format -msgid "Change history: %s" -msgstr "Change history: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django site admin" - -msgid "Django administration" -msgstr "Django administration" - -msgid "Site administration" -msgstr "Site administration" - -msgid "Log in" -msgstr "Log in" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administration" - -msgid "Page not found" -msgstr "Page not found" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "We’re sorry, but the requested page could not be found." - -msgid "Home" -msgstr "Home" - -msgid "Server error" -msgstr "Server error" - -msgid "Server error (500)" -msgstr "Server error (500)" - -msgid "Server Error (500)" -msgstr "Server Error (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." - -msgid "Run the selected action" -msgstr "Run the selected action" - -msgid "Go" -msgstr "Go" - -msgid "Click here to select the objects across all pages" -msgstr "Click here to select the objects across all pages" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Select all %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Clear selection" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Models in the %(name)s application" - -msgid "Add" -msgstr "Add" - -msgid "View" -msgstr "View" - -msgid "You don’t have permission to view or edit anything." -msgstr "You don’t have permission to view or edit anything." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." - -msgid "Enter a username and password." -msgstr "Enter a username and password." - -msgid "Change password" -msgstr "Change password" - -msgid "Please correct the error below." -msgstr "Please correct the error below." - -msgid "Please correct the errors below." -msgstr "Please correct the errors below." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Enter a new password for the user %(username)s." - -msgid "Welcome," -msgstr "Welcome," - -msgid "View site" -msgstr "View site" - -msgid "Documentation" -msgstr "Documentation" - -msgid "Log out" -msgstr "Log out" - -#, python-format -msgid "Add %(name)s" -msgstr "Add %(name)s" - -msgid "History" -msgstr "History" - -msgid "View on site" -msgstr "View on site" - -msgid "Filter" -msgstr "Filter" - -msgid "Clear all filters" -msgstr "Clear all filters" - -msgid "Remove from sorting" -msgstr "Remove from sorting" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorting priority: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toggle sorting" - -msgid "Delete" -msgstr "Delete" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" - -msgid "Objects" -msgstr "Objects" - -msgid "Yes, I’m sure" -msgstr "Yes, I’m sure" - -msgid "No, take me back" -msgstr "No, take me back" - -msgid "Delete multiple objects" -msgstr "Delete multiple objects" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" - -msgid "Delete?" -msgstr "Delete?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " By %(filter_title)s " - -msgid "Summary" -msgstr "Summary" - -msgid "Recent actions" -msgstr "Recent actions" - -msgid "My actions" -msgstr "My actions" - -msgid "None available" -msgstr "None available" - -msgid "Unknown content" -msgstr "Unknown content" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"You are authenticated as %(username)s, but are not authorised to access this " -"page. Would you like to login to a different account?" - -msgid "Forgotten your password or username?" -msgstr "Forgotten your password or username?" - -msgid "Toggle navigation" -msgstr "Toggle navigation" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Date/time" - -msgid "User" -msgstr "User" - -msgid "Action" -msgstr "Action" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." - -msgid "Show all" -msgstr "Show all" - -msgid "Save" -msgstr "Save" - -msgid "Popup closing…" -msgstr "Popup closing…" - -msgid "Search" -msgstr "Search" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s result" -msgstr[1] "%(counter)s results" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Save as new" - -msgid "Save and add another" -msgstr "Save and add another" - -msgid "Save and continue editing" -msgstr "Save and continue editing" - -msgid "Save and view" -msgstr "Save and view" - -msgid "Close" -msgstr "Close" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Change selected %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Add another %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Delete selected %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Log in again" - -msgid "Password change" -msgstr "Password change" - -msgid "Your password was changed." -msgstr "Your password was changed." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." - -msgid "Change my password" -msgstr "Change my password" - -msgid "Password reset" -msgstr "Password reset" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Your password has been set. You may go ahead and log in now." - -msgid "Password reset confirmation" -msgstr "Password reset confirmation" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." - -msgid "New password:" -msgstr "New password:" - -msgid "Confirm password:" -msgstr "Confirm password:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Please go to the following page and choose a new password:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Your username, in case you’ve forgotten:" - -msgid "Thanks for using our site!" -msgstr "Thanks for using our site!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "The %(site_name)s team" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." - -msgid "Email address:" -msgstr "Email address:" - -msgid "Reset my password" -msgstr "Reset my password" - -msgid "All dates" -msgstr "All dates" - -#, python-format -msgid "Select %s" -msgstr "Select %s" - -#, python-format -msgid "Select %s to change" -msgstr "Select %s to change" - -#, python-format -msgid "Select %s to view" -msgstr "Select %s to view" - -msgid "Date:" -msgstr "Date:" - -msgid "Time:" -msgstr "Time:" - -msgid "Lookup" -msgstr "Lookup" - -msgid "Currently:" -msgstr "Currently:" - -msgid "Change:" -msgstr "Change:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 077e784..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po deleted file mode 100644 index c4e52eb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,266 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2014 -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-11 13:13+0000\n" -"Last-Translator: Tom Fifield \n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Available %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Type into this box to filter down the list of available %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Choose all" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Click to choose all %s at once." - -msgid "Choose" -msgstr "Choose" - -msgid "Remove" -msgstr "Remove" - -#, javascript-format -msgid "Chosen %s" -msgstr "Chosen %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." - -msgid "Remove all" -msgstr "Remove all" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Click to remove all chosen %s at once." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s of %(cnt)s selected" -msgstr[1] "%(sel)s of %(cnt)s selected" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." - -msgid "Now" -msgstr "Now" - -msgid "Midnight" -msgstr "Midnight" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Noon" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Note: You are %s hour ahead of server time." -msgstr[1] "Note: You are %s hours ahead of server time." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Note: You are %s hour behind server time." -msgstr[1] "Note: You are %s hours behind server time." - -msgid "Choose a Time" -msgstr "Choose a Time" - -msgid "Choose a time" -msgstr "Choose a time" - -msgid "Cancel" -msgstr "Cancel" - -msgid "Today" -msgstr "Today" - -msgid "Choose a Date" -msgstr "Choose a Date" - -msgid "Yesterday" -msgstr "Yesterday" - -msgid "Tomorrow" -msgstr "Tomorrow" - -msgid "January" -msgstr "January" - -msgid "February" -msgstr "February" - -msgid "March" -msgstr "March" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "June" - -msgid "July" -msgstr "July" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "October" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "December" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Oct" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "W" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Show" - -msgid "Hide" -msgstr "Hide" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index b20f7bd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index 167a0db..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,691 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Forster , 2019 -# jon_atkinson , 2011-2012 -# Ross Poulton , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-04-05 10:37+0000\n" -"Last-Translator: Adam Forster \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Successfully deleted %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Cannot delete %(name)s" - -msgid "Are you sure?" -msgstr "Are you sure?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Delete selected %(verbose_name_plural)s" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "All" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Unknown" - -msgid "Any date" -msgstr "Any date" - -msgid "Today" -msgstr "Today" - -msgid "Past 7 days" -msgstr "Past 7 days" - -msgid "This month" -msgstr "This month" - -msgid "This year" -msgstr "This year" - -msgid "No date" -msgstr "No date" - -msgid "Has date" -msgstr "Has date" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." - -msgid "Action:" -msgstr "Action:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Add another %(verbose_name)s" - -msgid "Remove" -msgstr "Remove" - -msgid "Addition" -msgstr "Addition" - -msgid "Change" -msgstr "Change" - -msgid "Deletion" -msgstr "Deletion" - -msgid "action time" -msgstr "action time" - -msgid "user" -msgstr "user" - -msgid "content type" -msgstr "content type" - -msgid "object id" -msgstr "object id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "object repr" - -msgid "action flag" -msgstr "action flag" - -msgid "change message" -msgstr "change message" - -msgid "log entry" -msgstr "log entry" - -msgid "log entries" -msgstr "log entries" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Added \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Changed \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Deleted \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "LogEntry Object" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Added {name} \"{object}\"." - -msgid "Added." -msgstr "Added." - -msgid "and" -msgstr "and" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "No fields changed." - -msgid "None" -msgstr "None" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." - -msgid "No action selected." -msgstr "No action selected." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "The %(name)s \"%(obj)s\" was deleted successfully." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Add %s" - -#, python-format -msgid "Change %s" -msgstr "Change %s" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "Database error" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s was changed successfully." -msgstr[1] "%(count)s %(name)s were changed successfully." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selected" -msgstr[1] "All %(total_count)s selected" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 of %(cnt)s selected" - -#, python-format -msgid "Change history: %s" -msgstr "Change history: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Django site admin" - -msgid "Django administration" -msgstr "Django administration" - -msgid "Site administration" -msgstr "Site administration" - -msgid "Log in" -msgstr "Log in" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Page not found" - -msgid "We're sorry, but the requested page could not be found." -msgstr "We're sorry, but the requested page could not be found." - -msgid "Home" -msgstr "Home" - -msgid "Server error" -msgstr "Server error" - -msgid "Server error (500)" -msgstr "Server error (500)" - -msgid "Server Error (500)" -msgstr "Server Error (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Run the selected action" - -msgid "Go" -msgstr "Go" - -msgid "Click here to select the objects across all pages" -msgstr "Click here to select the objects across all pages" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Select all %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Clear selection" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." - -msgid "Enter a username and password." -msgstr "Enter a username and password." - -msgid "Change password" -msgstr "Change password" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Enter a new password for the user %(username)s." - -msgid "Welcome," -msgstr "Welcome," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Documentation" - -msgid "Log out" -msgstr "Log out" - -#, python-format -msgid "Add %(name)s" -msgstr "Add %(name)s" - -msgid "History" -msgstr "History" - -msgid "View on site" -msgstr "View on site" - -msgid "Filter" -msgstr "Filter" - -msgid "Remove from sorting" -msgstr "Remove from sorting" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorting priority: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toggle sorting" - -msgid "Delete" -msgstr "Delete" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Yes, I'm sure" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Delete multiple objects" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" - -msgid "View" -msgstr "" - -msgid "Delete?" -msgstr "Delete?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " By %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Add" - -msgid "You don't have permission to view or edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "None available" - -msgid "Unknown content" -msgstr "Unknown content" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Forgotten your password or username?" - -msgid "Date/time" -msgstr "Date/time" - -msgid "User" -msgstr "User" - -msgid "Action" -msgstr "Action" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." - -msgid "Show all" -msgstr "Show all" - -msgid "Save" -msgstr "Save" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Search" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s result" -msgstr[1] "%(counter)s results" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Save as new" - -msgid "Save and add another" -msgstr "Save and add another" - -msgid "Save and continue editing" -msgstr "Save and continue editing" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Thanks for spending some quality time with the Web site today." - -msgid "Log in again" -msgstr "Log in again" - -msgid "Password change" -msgstr "Password change" - -msgid "Your password was changed." -msgstr "Your password was changed." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." - -msgid "Change my password" -msgstr "Change my password" - -msgid "Password reset" -msgstr "Password reset" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Your password has been set. You may go ahead and log in now." - -msgid "Password reset confirmation" -msgstr "Password reset confirmation" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." - -msgid "New password:" -msgstr "New password:" - -msgid "Confirm password:" -msgstr "Confirm password:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "Please go to the following page and choose a new password:" - -msgid "Your username, in case you've forgotten:" -msgstr "Your username, in case you've forgotten:" - -msgid "Thanks for using our site!" -msgstr "Thanks for using our site!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "The %(site_name)s team" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "Reset my password" - -msgid "All dates" -msgstr "All dates" - -#, python-format -msgid "Select %s" -msgstr "Select %s" - -#, python-format -msgid "Select %s to change" -msgstr "Select %s to change" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Date:" - -msgid "Time:" -msgstr "Time:" - -msgid "Lookup" -msgstr "Lookup" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0967a38..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po deleted file mode 100644 index 03cf679..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,218 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# jon_atkinson , 2012 -# Ross Poulton , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Available %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Type into this box to filter down the list of available %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Choose all" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Click to choose all %s at once." - -msgid "Choose" -msgstr "Choose" - -msgid "Remove" -msgstr "Remove" - -#, javascript-format -msgid "Chosen %s" -msgstr "Chosen %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." - -msgid "Remove all" -msgstr "Remove all" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Click to remove all chosen %s at once." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s of %(cnt)s selected" -msgstr[1] "%(sel)s of %(cnt)s selected" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Now" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Choose a time" - -msgid "Midnight" -msgstr "Midnight" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Noon" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Cancel" - -msgid "Today" -msgstr "Today" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Yesterday" - -msgid "Tomorrow" -msgstr "Tomorrow" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Show" - -msgid "Hide" -msgstr "Hide" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index b05f121..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index ddc5901..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,728 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Batist D 🐍 , 2012-2013 -# Batist D 🐍 , 2013-2019 -# Claude Paroz , 2016 -# Dinu Gherman , 2011 -# kristjan , 2012 -# Matthieu Desplantes , 2021 -# Meiyer , 2022 -# Nikolay Korotkiy , 2017 -# Adamo Mesha , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-05-25 07:05+0000\n" -"Last-Translator: Meiyer , 2022\n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Forigi elektitajn %(verbose_name_plural)sn" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Sukcese forigis %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ne povas forigi %(name)s" - -msgid "Are you sure?" -msgstr "Ĉu vi certas?" - -msgid "Administration" -msgstr "Administrado" - -msgid "All" -msgstr "Ĉio" - -msgid "Yes" -msgstr "Jes" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Nekonata" - -msgid "Any date" -msgstr "Ajna dato" - -msgid "Today" -msgstr "Hodiaŭ" - -msgid "Past 7 days" -msgstr "Lastaj 7 tagoj" - -msgid "This month" -msgstr "Ĉi tiu monato" - -msgid "This year" -msgstr "Ĉi tiu jaro" - -msgid "No date" -msgstr "Neniu dato" - -msgid "Has date" -msgstr "Havas daton" - -msgid "Empty" -msgstr "Malplena" - -msgid "Not empty" -msgstr "Ne malplena" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Bonvolu enigi la ĝustajn %(username)sn kaj pasvorton por personara konto. " -"Notu, ke ambaŭ kampoj povas esti uskleco-distingaj." - -msgid "Action:" -msgstr "Ago:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Aldoni alian %(verbose_name)sn" - -msgid "Remove" -msgstr "Forigi" - -msgid "Addition" -msgstr "Aldono" - -msgid "Change" -msgstr "Ŝanĝi" - -msgid "Deletion" -msgstr "Forviŝo" - -msgid "action time" -msgstr "aga tempo" - -msgid "user" -msgstr "uzanto" - -msgid "content type" -msgstr "enhava tipo" - -msgid "object id" -msgstr "objekta identigaĵo" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekta prezento" - -msgid "action flag" -msgstr "aga marko" - -msgid "change message" -msgstr "ŝanĝmesaĝo" - -msgid "log entry" -msgstr "protokolero" - -msgid "log entries" -msgstr "protokoleroj" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Aldono de “%(object)s”" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Ŝanĝo de “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Forigo de “%(object)s”" - -msgid "LogEntry Object" -msgstr "Protokolera objekto" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Aldonita(j) {name} “{object}”." - -msgid "Added." -msgstr "Aldonita." - -msgid "and" -msgstr "kaj" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Ŝanĝita(j) {fields} por {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Ŝanĝita(j) {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Forigita(j) {name} “{object}”." - -msgid "No fields changed." -msgstr "Neniu kampo ŝanĝita." - -msgid "None" -msgstr "Neniu" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "La {name} “{obj}” estis sukcese aldonita(j)." - -msgid "You may edit it again below." -msgstr "Eblas redakti ĝin sube." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Elementoj devas esti elektitaj por agi je ili. Neniu elemento estis ŝanĝita." - -msgid "No action selected." -msgstr "Neniu ago elektita." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "La %(name)s “%(obj)s” estis sukcese forigita(j)." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Aldoni %sn" - -#, python-format -msgid "Change %s" -msgstr "Ŝanĝi %s" - -#, python-format -msgid "View %s" -msgstr "Vidi %sn" - -msgid "Database error" -msgstr "Datumbaza eraro" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s estis sukcese ŝanĝita." -msgstr[1] "%(count)s %(name)s estis sukcese ŝanĝitaj." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s elektitaj" -msgstr[1] "Ĉiuj %(total_count)s elektitaj" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 el %(cnt)s elektita" - -#, python-format -msgid "Change history: %s" -msgstr "Ŝanĝa historio: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Forigi la %(class_name)s-n “%(instance)s” postulus forigi la sekvajn " -"protektitajn rilatajn objektojn: %(related_objects)s" - -msgid "Django site admin" -msgstr "Dĵanga reteja administrado" - -msgid "Django administration" -msgstr "Dĵanga administrado" - -msgid "Site administration" -msgstr "Reteja administrado" - -msgid "Log in" -msgstr "Ensaluti" - -#, python-format -msgid "%(app)s administration" -msgstr "Administrado de %(app)s" - -msgid "Page not found" -msgstr "Paĝo ne trovita" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Bedaŭrinde la petita paĝo ne estis trovita." - -msgid "Home" -msgstr "Ĉefpaĝo" - -msgid "Server error" -msgstr "Servila eraro" - -msgid "Server error (500)" -msgstr "Servila eraro (500)" - -msgid "Server Error (500)" -msgstr "Servila eraro (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Lanĉi la elektitan agon" - -msgid "Go" -msgstr "Ek" - -msgid "Click here to select the objects across all pages" -msgstr "Klaku ĉi-tie por elekti la objektojn trans ĉiuj paĝoj" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Elekti ĉiuj %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Viŝi elekton" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeloj en la aplikaĵo “%(name)s”" - -msgid "Add" -msgstr "Aldoni" - -msgid "View" -msgstr "Vidi" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Enigu salutnomon kaj pasvorton." - -msgid "Change password" -msgstr "Ŝanĝi pasvorton" - -msgid "Please correct the error below." -msgstr "Bonvolu ĝustigi la eraron sube." - -msgid "Please correct the errors below." -msgstr "Bonvolu ĝustigi la erarojn sube." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Enigu novan pasvorton por la uzanto %(username)s." - -msgid "Welcome," -msgstr "Bonvenon," - -msgid "View site" -msgstr "Vidi retejon" - -msgid "Documentation" -msgstr "Dokumentaro" - -msgid "Log out" -msgstr "Elsaluti" - -#, python-format -msgid "Add %(name)s" -msgstr "Aldoni %(name)sn" - -msgid "History" -msgstr "Historio" - -msgid "View on site" -msgstr "Vidi sur retejo" - -msgid "Filter" -msgstr "Filtri" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "Forigi el ordigado" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Ordiga prioritato: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Ŝalti ordigadon" - -msgid "Delete" -msgstr "Forigi" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Foriganti la %(object_name)s '%(escaped_object)s' rezultus en foriganti " -"rilatajn objektojn, sed via konto ne havas permeson por forigi la sekvantajn " -"tipojn de objektoj:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Forigi la %(object_name)s '%(escaped_object)s' postulus forigi la sekvajn " -"protektitajn rilatajn objektojn:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ĉu vi certas, ke vi volas forigi %(object_name)s \"%(escaped_object)s\"? " -"Ĉiuj el la sekvaj rilataj eroj estos forigitaj:" - -msgid "Objects" -msgstr "Objektoj" - -msgid "Yes, I’m sure" -msgstr "Jes, mi certas" - -msgid "No, take me back" -msgstr "Ne, reen" - -msgid "Delete multiple objects" -msgstr "Forigi plurajn objektojn" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Forigi la %(objects_name)s rezultus en forigi rilatajn objektojn, sed via " -"konto ne havas permeson por forigi la sekvajn tipojn de objektoj:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Forigi la %(objects_name)s postulus forigi la sekvajn protektitajn rilatajn " -"objektojn:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ĉu vi certas, ke vi volas forigi la elektitajn %(objects_name)s? Ĉiuj el la " -"sekvaj objektoj kaj iliaj rilataj eroj estos forigita:" - -msgid "Delete?" -msgstr "Forviŝi?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Laŭ %(filter_title)s " - -msgid "Summary" -msgstr "Resumo" - -msgid "Recent actions" -msgstr "Lastaj agoj" - -msgid "My actions" -msgstr "Miaj agoj" - -msgid "None available" -msgstr "Neniu disponebla" - -msgid "Unknown content" -msgstr "Nekonata enhavo" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Vi estas aŭtentikigita kiel %(username)s, sed ne havas permeson aliri tiun " -"paĝon. Ĉu vi ŝatus ensaluti per alia konto?" - -msgid "Forgotten your password or username?" -msgstr "Ĉu vi forgesis vian pasvorton aŭ vian salutnomon?" - -msgid "Toggle navigation" -msgstr "Ŝalti navigadon" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Dato/horo" - -msgid "User" -msgstr "Uzanto" - -msgid "Action" -msgstr "Ago" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Ĉi tiu objekto ne havas historion de ŝanĝoj. Ĝi verŝajne ne estis aldonita " -"per ĉi tiu administrejo." - -msgid "Show all" -msgstr "Montri ĉion" - -msgid "Save" -msgstr "Konservi" - -msgid "Popup closing…" -msgstr "Ŝprucfenesto fermiĝas…" - -msgid "Search" -msgstr "Serĉu" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resulto" -msgstr[1] "%(counter)s rezultoj" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s entute" - -msgid "Save as new" -msgstr "Konservi kiel novan" - -msgid "Save and add another" -msgstr "Konservi kaj aldoni alian" - -msgid "Save and continue editing" -msgstr "Konservi kaj daŭre redakti" - -msgid "Save and view" -msgstr "Konservi kaj vidi" - -msgid "Close" -msgstr "Fermi" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Redaktu elektitan %(model)sn" - -#, python-format -msgid "Add another %(model)s" -msgstr "Aldoni alian %(model)sn" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Forigi elektitan %(model)sn" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Ensaluti denove" - -msgid "Password change" -msgstr "Pasvorta ŝanĝo" - -msgid "Your password was changed." -msgstr "Via pasvorto estis sukcese ŝanĝita." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Bonvolu entajpi vian malnovan pasvorton pro sekureco, kaj entajpi vian novan " -"pasvorton dufoje, por ke ni estu certaj, ke vi tajpis ĝin ĝuste." - -msgid "Change my password" -msgstr "Ŝanĝi mian passvorton" - -msgid "Password reset" -msgstr "Pasvorta rekomencigo" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Via pasvorto estis ŝanĝita. Vi povas ensaluti nun." - -msgid "Password reset confirmation" -msgstr "Konfirmo de restarigo de pasvorto" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Bonvolu entajpi vian novan pasvorton dufoje, tiel ni povas konfirmi ke vi " -"ĝuste tajpis ĝin." - -msgid "New password:" -msgstr "Nova pasvorto:" - -msgid "Confirm password:" -msgstr "Konfirmi pasvorton:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"La ligilo por restarigi pasvorton estis malvalida, eble ĉar ĝi jam estis " -"uzita. Bonvolu denove peti restarigon de pasvorto." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Ni sendis al vi instrukciojn por starigi vian pasvorton, se ekzistas konto " -"kun la retadreso, kiun vi provizis. Vi devus ricevi ilin post mallonge." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se vi ne ricevas retmesaĝon, bonvole certiĝu ke vi entajpis la adreson per " -"kiu vi registriĝis, kaj kontrolu en via spamujo." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Vi ricevis ĉi tiun retpoŝton ĉar vi petis pasvortan rekomencigon por via " -"uzanta konto ĉe %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Bonvolu iri al la sekvanta paĝo kaj elekti novan pasvorton:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Via uzantnomo, se vi forgesis ĝin:" - -msgid "Thanks for using our site!" -msgstr "Dankon pro uzo de nia retejo!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "La %(site_name)s teamo" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Ĉu vi forgesis vian pasvorton? Entajpu vian retpoŝtadreson sube kaj ni " -"sendos al vi retpoŝte instrukciojn por ŝanĝi ĝin." - -msgid "Email address:" -msgstr "Retpoŝto:" - -msgid "Reset my password" -msgstr "Rekomencigi mian pasvorton" - -msgid "All dates" -msgstr "Ĉiuj datoj" - -#, python-format -msgid "Select %s" -msgstr "Elekti %sn" - -#, python-format -msgid "Select %s to change" -msgstr "Elekti %sn por ŝanĝi" - -#, python-format -msgid "Select %s to view" -msgstr "Elektu %sn por vidi" - -msgid "Date:" -msgstr "Dato:" - -msgid "Time:" -msgstr "Horo:" - -msgid "Lookup" -msgstr "Trarigardo" - -msgid "Currently:" -msgstr "Nuntempe:" - -msgid "Change:" -msgstr "Ŝanĝo:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 6e86ac2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po deleted file mode 100644 index db99913..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,268 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Batist D 🐍 , 2012 -# Batist D 🐍 , 2014-2016 -# 977db45bb2d7151f88325d4fbeca189e_848074d <3d1ba07956d05291bf7c987ecea0a7ef_13052>, 2011 -# Meiyer , 2022 -# Adamo Mesha , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:26-0500\n" -"PO-Revision-Date: 2022-05-25 07:05+0000\n" -"Last-Translator: Meiyer , 2022\n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Disponeblaj %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Tio ĉi estas la listo de disponeblaj %s. Vi povas aktivigi kelkajn markante " -"ilin en la suba kesto kaj klakante la sagon “Elekti” inter la du kestoj." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Tajpu en ĉi-tiu skatolo por filtri la liston de haveblaj %s." - -msgid "Filter" -msgstr "Filtru" - -msgid "Choose all" -msgstr "Elekti ĉiujn" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klaku por tuj elekti ĉiujn %sn." - -msgid "Choose" -msgstr "Elekti" - -msgid "Remove" -msgstr "Forigi" - -#, javascript-format -msgid "Chosen %s" -msgstr "Elektitaj %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Tio ĉi estas la listo de elektitaj %s. Vi povas malaktivigi kelkajn markante " -"ilin en la suba kesto kaj klakante la sagon “Forigi” inter la du kestoj." - -msgid "Remove all" -msgstr "Forigi ĉiujn" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klaku por tuj forigi ĉiujn %sn elektitajn." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s elektita" -msgstr[1] "%(sel)s el %(cnt)s elektitaj" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Vi havas neŝirmitajn ŝanĝojn je unuopaj redakteblaj kampoj. Se vi faros " -"agon, viaj neŝirmitaj ŝanĝoj perdiĝos." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Nun" - -msgid "Midnight" -msgstr "Noktomeze" - -msgid "6 a.m." -msgstr "6 a.t.m." - -msgid "Noon" -msgstr "Tagmeze" - -msgid "6 p.m." -msgstr "6 p.t.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Noto: Vi estas %s horon post la servila horo." -msgstr[1] "Noto: Vi estas %s horojn post la servila horo." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Noto: Vi estas %s horon antaŭ la servila horo." -msgstr[1] "Noto: Vi estas %s horojn antaŭ la servila horo." - -msgid "Choose a Time" -msgstr "Elektu horon" - -msgid "Choose a time" -msgstr "Elektu tempon" - -msgid "Cancel" -msgstr "Nuligi" - -msgid "Today" -msgstr "Hodiaŭ" - -msgid "Choose a Date" -msgstr "Elektu daton" - -msgid "Yesterday" -msgstr "Hieraŭ" - -msgid "Tomorrow" -msgstr "Morgaŭ" - -msgid "January" -msgstr "januaro" - -msgid "February" -msgstr "februaro" - -msgid "March" -msgstr "marto" - -msgid "April" -msgstr "aprilo" - -msgid "May" -msgstr "majo" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "aŭgusto" - -msgid "September" -msgstr "septembro" - -msgid "October" -msgstr "oktobro" - -msgid "November" -msgstr "novembro" - -msgid "December" -msgstr "decembro" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "maj." - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun." - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jul." - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aŭg." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec." - -msgctxt "one letter Sunday" -msgid "S" -msgstr "d" - -msgctxt "one letter Monday" -msgid "M" -msgstr "l" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "m" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "m" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "ĵ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "v" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "s" - -msgid "" -"You have already submitted this form. Are you sure you want to submit it " -"again?" -msgstr "Vi jam forsendis tiun ĉi formularon. Ĉu vi certe volas resendi ĝin?" - -msgid "Show" -msgstr "Montri" - -msgid "Hide" -msgstr "Kaŝi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 379f204..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 7634841..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,818 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# abraham.martin , 2014 -# Antoni Aloy , 2011-2014 -# Claude Paroz , 2014 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2015-2016 -# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 -# guillem , 2012 -# Ignacio José Lizarán Rus , 2019 -# Igor Támara , 2013 -# Jannis Leidel , 2011 -# Jorge Andres Bravo Meza, 2024 -# Jorge Puente Sarrín , 2014-2015 -# José Luis , 2016 -# Josue Naaman Nistal Guerra , 2014 -# Luigy, 2019 -# Marc Garcia , 2011 -# Miguel Angel Tribaldos , 2017 -# Miguel Gonzalez , 2023 -# Natalia, 2024 -# Pablo, 2015 -# Salomon Herrera, 2023 -# Uriel Medina , 2020-2024 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:05+0000\n" -"Last-Translator: Uriel Medina , 2020-2024\n" -"Language-Team: Spanish (http://app.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionado/s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eliminado/s %(count)d %(items)s satisfactoriamente." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No se puede eliminar %(name)s" - -msgid "Are you sure?" -msgstr "¿Está seguro?" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todo" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Any date" -msgstr "Cualquier fecha" - -msgid "Today" -msgstr "Hoy" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este año" - -msgid "No date" -msgstr "Sin fecha" - -msgid "Has date" -msgstr "Tiene fecha" - -msgid "Empty" -msgstr "Vacío" - -msgid "Not empty" -msgstr "No vacío" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor introduzca el %(username)s y la clave correctos para una cuenta de " -"personal. Observe que ambos campos pueden ser sensibles a mayúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Agregar %(verbose_name)s adicional." - -msgid "Remove" -msgstr "Eliminar" - -msgid "Addition" -msgstr "Añadido" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Borrado" - -msgid "action time" -msgstr "hora de la acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "object id" -msgstr "id del objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr del objeto" - -msgid "action flag" -msgstr "marca de acción" - -msgid "change message" -msgstr "mensaje de cambio" - -msgid "log entry" -msgstr "entrada de registro" - -msgid "log entries" -msgstr "entradas de registro" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Agregado “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Modificado “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Eliminado “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Objeto de registro de Log" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Agregado {name} “{object}”." - -msgid "Added." -msgstr "Añadido." - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Cambios en {fields} para {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Modificado {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Eliminado {name} “{object}”." - -msgid "No fields changed." -msgstr "No ha cambiado ningún campo." - -msgid "None" -msgstr "Ninguno" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Mantenga presionado \"Control\" o \"Comando\" en una Mac, para seleccionar " -"más de uno." - -msgid "Select this object for an action - {}" -msgstr "Seleccione este objeto para una acción - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "El {name} “{obj}” fue agregado correctamente." - -msgid "You may edit it again below." -msgstr "Puede volverlo a editar otra vez a continuación." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"El {name} “{obj}” se agregó correctamente. Puede agregar otro {name} a " -"continuación." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"El {name} “{obj}” se cambió correctamente. Puede editarlo nuevamente a " -"continuación." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"El {name} “{obj}” se cambió correctamente. Puede agregar otro {name} a " -"continuación." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "El {name} “{obj}” se cambió correctamente." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Se deben seleccionar elementos para poder realizar acciones sobre estos. No " -"se han modificado elementos." - -msgid "No action selected." -msgstr "No se seleccionó ninguna acción." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "El%(name)s “%(obj)s” fue eliminado con éxito." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s con el ID “%(key)s” no existe. ¿Quizás fue eliminado?" - -#, python-format -msgid "Add %s" -msgstr "Añadir %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "Vista %s" - -msgid "Database error" -msgstr "Error en la base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s fué modificado con éxito." -msgstr[1] "%(count)s %(name)s fueron modificados con éxito." -msgstr[2] "%(count)s %(name)s fueron modificados con éxito." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionado" -msgstr[1] "%(total_count)s seleccionados en total" -msgstr[2] "%(total_count)s seleccionados en total" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "seleccionados 0 de %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de modificaciones: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La eliminación de %(class_name)s %(instance)s requeriría eliminar los " -"siguientes objetos relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Sitio de administración de Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Sitio administrativo" - -msgid "Log in" -msgstr "Iniciar sesión" - -#, python-format -msgid "%(app)s administration" -msgstr "Administración de %(app)s " - -msgid "Page not found" -msgstr "Página no encontrada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Lo sentimos, pero no se pudo encontrar la página solicitada." - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error de servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Hubo un error. Se ha informado a los administradores del sitio por correo " -"electrónico y debería solucionarse en breve. Gracias por su paciencia." - -msgid "Run the selected action" -msgstr "Ejecutar la acción seleccionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Pulse aquí para seleccionar los objetos a través de todas las páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar todos los %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Limpiar selección" - -msgid "Breadcrumbs" -msgstr "Migas de pan" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Añadir" - -msgid "View" -msgstr "Vista" - -msgid "You don’t have permission to view or edit anything." -msgstr "No cuenta con permiso para ver ni editar nada." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Primero, ingrese un nombre de usuario y contraseña. Luego, podrá editar más " -"opciones del usuario." - -msgid "Enter a username and password." -msgstr "Introduzca un nombre de usuario y contraseña" - -msgid "Change password" -msgstr "Cambiar contraseña" - -msgid "Set password" -msgstr "Establecer contraseña" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Por favor, corrija el siguiente error." -msgstr[1] "Por favor, corrija los siguientes errores." -msgstr[2] "Por favor, corrija los siguientes errores." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Introduzca una nueva contraseña para el usuario %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Esta acción habilitará la autenticación basada en " -"contraseña para este usuario." - -msgid "Disable password-based authentication" -msgstr "Deshabilitar la autenticación basada en contraseña" - -msgid "Enable password-based authentication" -msgstr "Habilitar la autenticación basada en contraseña" - -msgid "Skip to main content" -msgstr "Saltar al contenido principal" - -msgid "Welcome," -msgstr "Bienvenidos," - -msgid "View site" -msgstr "Ver el sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Cerrar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Añadir %(name)s" - -msgid "History" -msgstr "Histórico" - -msgid "View on site" -msgstr "Ver en el sitio" - -msgid "Filter" -msgstr "Filtro" - -msgid "Hide counts" -msgstr "Ocultar recuentos" - -msgid "Show counts" -msgstr "Mostrar recuentos" - -msgid "Clear all filters" -msgstr "Borrar todos los filtros" - -msgid "Remove from sorting" -msgstr "Eliminar del ordenación" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridad de la ordenación: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Activar la ordenación" - -msgid "Toggle theme (current theme: auto)" -msgstr "Cambiar tema (tema actual: automático)" - -msgid "Toggle theme (current theme: light)" -msgstr "Cambiar tema (tema actual: claro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Cambiar tema (tema actual: oscuro)" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"La eliminación de %(object_name)s %(escaped_object)s requeriría eliminar los " -"siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"¿Está seguro de que quiere borrar los %(object_name)s " -"\"%(escaped_object)s\"? Se borrarán los siguientes objetos relacionados:" - -msgid "Objects" -msgstr "Objetos" - -msgid "Yes, I’m sure" -msgstr "Si, estoy seguro" - -msgid "No, take me back" -msgstr "No, llévame atrás" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objetos." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"La eliminación del %(objects_name)s seleccionado resultaría en el borrado de " -"objetos relacionados, pero su cuenta no tiene permisos para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"La eliminación de %(objects_name)s seleccionado requeriría el borrado de los " -"siguientes objetos protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? " -"Todos los siguientes objetos y sus elementos relacionados serán borrados:" - -msgid "Delete?" -msgstr "¿Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Resumen" - -msgid "Recent actions" -msgstr "Acciones recientes" - -msgid "My actions" -msgstr "Mis acciones" - -msgid "None available" -msgstr "Ninguno disponible" - -msgid "Added:" -msgstr "Agregado:" - -msgid "Changed:" -msgstr "Modificado:" - -msgid "Deleted:" -msgstr "Eliminado:" - -msgid "Unknown content" -msgstr "Contenido desconocido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Algo anda mal con la instalación de su base de datos. Asegúrese de que se " -"hayan creado las tablas de base de datos adecuadas y asegúrese de que el " -"usuario adecuado pueda leer la base de datos." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Se ha autenticado como %(username)s, pero no está autorizado a acceder a " -"esta página. ¿Desea autenticarse con una cuenta diferente?" - -msgid "Forgotten your password or username?" -msgstr "¿Ha olvidado la contraseña o el nombre de usuario?" - -msgid "Toggle navigation" -msgstr "Activar navegación" - -msgid "Sidebar" -msgstr "Barra lateral" - -msgid "Start typing to filter…" -msgstr "Empiece a escribir para filtrar…" - -msgid "Filter navigation items" -msgstr "Filtrar elementos de navegación" - -msgid "Date/time" -msgstr "Fecha/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrada" -msgstr[1] "entradas" -msgstr[2] "entradas" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Este objeto no tiene un historial de cambios. Probablemente no se agregó a " -"través de este sitio de administración." - -msgid "Show all" -msgstr "Mostrar todo" - -msgid "Save" -msgstr "Guardar" - -msgid "Popup closing…" -msgstr "Cerrando ventana emergente..." - -msgid "Search" -msgstr "Buscar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" -msgstr[2] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Guardar como nuevo" - -msgid "Save and add another" -msgstr "Guardar y añadir otro" - -msgid "Save and continue editing" -msgstr "Guardar y continuar editando" - -msgid "Save and view" -msgstr "Guardar y ver" - -msgid "Close" -msgstr "Cerrar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Cambiar %(model)s seleccionados" - -#, python-format -msgid "Add another %(model)s" -msgstr "Añadir otro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eliminar %(model)s seleccionada/o" - -#, python-format -msgid "View selected %(model)s" -msgstr "Ver seleccionado %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Gracias por pasar un buen rato con el sitio web hoy." - -msgid "Log in again" -msgstr "Iniciar sesión de nuevo" - -msgid "Password change" -msgstr "Cambio de contraseña" - -msgid "Your password was changed." -msgstr "Su contraseña ha sido cambiada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Ingrese su contraseña anterior, por razones de seguridad, y luego ingrese su " -"nueva contraseña dos veces para que podamos verificar que la ingresó " -"correctamente." - -msgid "Change my password" -msgstr "Cambiar mi contraseña" - -msgid "Password reset" -msgstr "Restablecer contraseña" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Su contraseña ha sido establecida. Ahora puede continuar e iniciar sesión." - -msgid "Password reset confirmation" -msgstr "Confirmación de restablecimiento de contraseña" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor, introduzca su contraseña nueva dos veces para verificar que la ha " -"escrito correctamente." - -msgid "New password:" -msgstr "Contraseña nueva:" - -msgid "Confirm password:" -msgstr "Confirme contraseña:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"El enlace de restablecimiento de contraseña era inválido, seguramente porque " -"se haya usado antes. Por favor, solicite un nuevo restablecimiento de " -"contraseña." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Le enviamos instrucciones por correo electrónico para configurar su " -"contraseña, si existe una cuenta con el correo electrónico que ingresó. " -"Debería recibirlos en breve." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no recibe un correo electrónico, asegúrese de haber ingresado la " -"dirección con la que se registró y verifique su carpeta de correo no deseado." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ha recibido este correo electrónico porque ha solicitado restablecer la " -"contraseña para su cuenta en %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña." - -msgid "Your username, in case you’ve forgotten:" -msgstr "Su nombre de usuario, en caso de que lo haya olvidado:" - -msgid "Thanks for using our site!" -msgstr "¡Gracias por usar nuestro sitio!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"¿Olvidaste tu contraseña? Ingrese su dirección de correo electrónico a " -"continuación y le enviaremos las instrucciones para configurar una nueva." - -msgid "Email address:" -msgstr "Correo electrónico:" - -msgid "Reset my password" -msgstr "Restablecer mi contraseña" - -msgid "Select all objects on this page for an action" -msgstr "Seleccione todos los objetos de esta página para una acción" - -msgid "All dates" -msgstr "Todas las fechas" - -#, python-format -msgid "Select %s" -msgstr "Seleccione %s" - -#, python-format -msgid "Select %s to change" -msgstr "Seleccione %s a modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Seleccione %s para ver" - -msgid "Date:" -msgstr "Fecha:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Buscar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Cambiar:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7661610..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po deleted file mode 100644 index e2c5567..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,336 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2011-2012 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2015-2016 -# Jannis Leidel , 2011 -# Josue Naaman Nistal Guerra , 2014 -# Leonardo J. Caballero G. , 2011 -# Uriel Medina , 2020-2023 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Uriel Medina , 2020-2023\n" -"Language-Team: Spanish (http://app.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s Disponibles" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta es la lista de %s disponibles. Puede elegir algunos seleccionándolos en " -"la caja inferior y luego haciendo clic en la flecha \"Elegir\" que hay entre " -"las dos cajas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba en este cuadro para filtrar la lista de %s disponibles" - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Selecciona todos" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Haga clic para seleccionar todos los %s de una vez" - -msgid "Choose" -msgstr "Elegir" - -msgid "Remove" -msgstr "Eliminar" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s elegidos" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta es la lista de los %s elegidos. Puede elmininar algunos " -"seleccionándolos en la caja inferior y luego haciendo click en la flecha " -"\"Eliminar\" que hay entre las dos cajas." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Escriba en este cuadro para filtrar la lista de %s seleccionados." - -msgid "Remove all" -msgstr "Eliminar todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Haz clic para eliminar todos los %s elegidos" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opción seleccionada no visible" -msgstr[1] "%s opciones seleccionadas no visibles" -msgstr[2] "%s opciones seleccionadas no visibles" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionado" -msgstr[1] "%(sel)s de %(cnt)s seleccionados" -msgstr[2] "%(sel)s de %(cnt)s seleccionados" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tiene cambios sin guardar en campos editables individuales. Si ejecuta una " -"acción, los cambios no guardados se perderán." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Ha seleccionado una acción, pero aún no ha guardado los cambios en los " -"campos individuales. Haga clic en Aceptar para guardar. Deberá volver a " -"ejecutar la acción." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ha seleccionado una acción y no ha realizado ningún cambio en campos " -"individuales. Probablemente esté buscando el botón 'Ir' en lugar del botón " -"'Guardar'." - -msgid "Now" -msgstr "Ahora" - -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Usted esta a %s horas por delante de la hora del servidor." -msgstr[1] "Nota: Usted va %s horas por delante de la hora del servidor." -msgstr[2] "Nota: Usted va %s horas por delante de la hora del servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Usted esta a %s hora de retraso de tiempo de servidor." -msgstr[1] "Nota: Usted va %s horas por detrás de la hora del servidor." -msgstr[2] "Nota: Usted va %s horas por detrás de la hora del servidor." - -msgid "Choose a Time" -msgstr "Elija una Hora" - -msgid "Choose a time" -msgstr "Elija una hora" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoy" - -msgid "Choose a Date" -msgstr "Elija una Fecha" - -msgid "Yesterday" -msgstr "Ayer" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Ene" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Oct" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dic" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Monday" -msgstr "Lunes" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Miércoles" - -msgid "Thursday" -msgstr "Jueves" - -msgid "Friday" -msgstr "Viernes" - -msgid "Saturday" -msgstr "Sábado" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Lun" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Mie" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Jue" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Vie" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sáb" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Ocultar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index 026a84c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 35a169d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,805 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Leonardo José Guzmán , 2013 -# Natalia, 2023 -# Natalia, 2023 -# Ramiro Morales, 2013-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Ramiro Morales, 2013-2025\n" -"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionados/as" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Se eliminaron con éxito %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No se puede eliminar %(name)s" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objetos" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todos/as" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Any date" -msgstr "Cualquier fecha" - -msgid "Today" -msgstr "Hoy" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este año" - -msgid "No date" -msgstr "Sin fecha" - -msgid "Has date" -msgstr "Tiene fecha" - -msgid "Empty" -msgstr "Vacío/a" - -msgid "Not empty" -msgstr "No vacío/a" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor introduza %(username)s y contraseña correctos de una cuenta de " -"staff. Note que puede que ambos campos sean estrictos en relación a " -"diferencias entre mayúsculas y minúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Agregar otro/a %(verbose_name)s" - -msgid "Remove" -msgstr "Eliminar" - -msgid "Addition" -msgstr "Agregado" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Borrado" - -msgid "action time" -msgstr "hora de la acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "object id" -msgstr "id de objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr de objeto" - -msgid "action flag" -msgstr "marca de acción" - -msgid "change message" -msgstr "mensaje de cambio" - -msgid "log entry" -msgstr "entrada de registro" - -msgid "log entries" -msgstr "entradas de registro" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Se agrega \"%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Se modifica \"%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Se elimina \"%(object)s”." - -msgid "LogEntry Object" -msgstr "Objeto LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Se agrega {name} \"{object}”." - -msgid "Added." -msgstr "Agregado." - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Se modifican {fields} en {name} \"{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Modificación de {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Se elimina {name} \"{object}”." - -msgid "No fields changed." -msgstr "No ha modificado ningún campo." - -msgid "None" -msgstr "Ninguno" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Mantenga presionada \"Control” (\"Command” en una Mac) para seleccionar más " -"de uno." - -msgid "Select this object for an action - {}" -msgstr "Seleccione este objeto para una acción - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Se agregó con éxito {name} \"{obj}”." - -msgid "You may edit it again below." -msgstr "Puede modificarlo/a nuevamente mas abajo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Se agregó con éxito {name} \"{obj}”. Puede agregar otro/a {name} abajo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Se modificó con éxito {name} \"{obj}”. Puede modificarlo/a nuevamente abajo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Se modificó con éxito {name} \"{obj}”. Puede agregar otro {name} abajo." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Se modificó con éxito {name} \"{obj}”." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Deben existir ítems seleccionados para poder realizar acciones sobre los " -"mismos. No se modificó ningún ítem." - -msgid "No action selected." -msgstr "No se ha seleccionado ninguna acción." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Se eliminó con éxito %(name)s \"%(obj)s”." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "No existe %(name)s con ID \"%(key)s”. ¿Quizá fue eliminado/a?" - -#, python-format -msgid "Add %s" -msgstr "Agregar %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "Ver %s" - -msgid "Database error" -msgstr "Error de base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Se ha modificado con éxito %(count)s %(name)s." -msgstr[1] "Se han modificado con éxito %(count)s %(name)s." -msgstr[2] "Se han modificado con éxito %(count)s %(name)s." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionados/as" -msgstr[1] "Todos/as (%(total_count)s en total) han sido seleccionados/as" -msgstr[2] "Todos/as (%(total_count)s en total) han sido seleccionados/as" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seleccionados/as" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Change history: %s" -msgstr "Historia de modificaciones: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La eliminación de %(class_name)s %(instance)s provocaría la eliminación de " -"los siguientes objetos relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administración de sitio Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Administración de sitio" - -msgid "Log in" -msgstr "Identificarse" - -#, python-format -msgid "%(app)s administration" -msgstr "Administración de %(app)s" - -msgid "Page not found" -msgstr "Página no encontrada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Lo lamentamos, no se encontró la página solicitada." - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error de servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ha ocurrido un error. Se ha reportado el mismo a los administradores del " -"sitio vía email y debería ser solucionado en breve. Le agradecemos por su " -"paciencia." - -msgid "Run the selected action" -msgstr "Ejecutar la acción seleccionada" - -msgid "Go" -msgstr "Ejecutar" - -msgid "Click here to select the objects across all pages" -msgstr "Haga click aquí para seleccionar los objetos de todas las páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar lo(s)/a(s) %(total_count)s %(module_name)s existentes" - -msgid "Clear selection" -msgstr "Borrar selección" - -msgid "Breadcrumbs" -msgstr "Breadcrumbs" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Model name" -msgstr "Nombre del modelo" - -msgid "Add link" -msgstr "Agregar link" - -msgid "Change or view list link" -msgstr "Cambiar o ver enlace de lista" - -msgid "Add" -msgstr "Agregar" - -msgid "View" -msgstr "Ver" - -msgid "You don’t have permission to view or edit anything." -msgstr "No tiene permiso para ver o modificar nada." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "Después de crear un usuario podrá configurar más opciones del mismo." - -msgid "Error:" -msgstr "Error:" - -msgid "Change password" -msgstr "Cambiar contraseña" - -msgid "Set password" -msgstr "Establecer contraseña" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Por favor, corrija el siguiente error." -msgstr[1] "Por favor, corrija los siguientes errores." -msgstr[2] "Por favor, corrija los siguientes errores." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Introduzca una nueva contraseña para el usuario %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Esta acción activará la autenticación basada en contraseñas " -"para este usuario." - -msgid "Disable password-based authentication" -msgstr "Desactivar la autenticación basada en contraseñas" - -msgid "Enable password-based authentication" -msgstr "Activar la autenticación basada en contraseñas" - -msgid "Skip to main content" -msgstr "Ir al contenido principal" - -msgid "Welcome," -msgstr "Bienvenido/a," - -msgid "View site" -msgstr "Ver sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Cerrar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Agregar %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Ver en el sitio" - -msgid "Filter" -msgstr "Filtrar" - -msgid "Hide counts" -msgstr "Ocultar recuentos" - -msgid "Show counts" -msgstr "Mostrar recuentos" - -msgid "Clear all filters" -msgstr "Limpiar todos los filtros" - -msgid "Remove from sorting" -msgstr "Remover de ordenamiento" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridad de ordenamiento: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Alternar ordenamiento" - -msgid "Toggle theme (current theme: auto)" -msgstr "Cambiar tema (tema actual: automático)" - -msgid "Toggle theme (current theme: light)" -msgstr "Cambiar tema (tema actual: claro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Cambiar tema (tema actual: oscuro)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para eliminar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Eliminar los %(object_name)s '%(escaped_object)s' requeriría eliminar " -"también los siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"¿Está seguro de que desea eliminar los %(object_name)s " -"\"%(escaped_object)s\"? Se eliminarán los siguientes objetos relacionados:" - -msgid "Objects" -msgstr "Objectos" - -msgid "Yes, I’m sure" -msgstr "Si, estoy seguro" - -msgid "No, take me back" -msgstr "No, volver" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Eliminar el/los objetos %(objects_name)s seleccionados provocaría la " -"eliminación de objetos relacionados a los mismos, pero su cuenta de usuario " -"no tiene los permisos necesarios para eliminar los siguientes tipos de " -"objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Eliminar el/los objetos %(objects_name)s seleccionados requeriría eliminar " -"también los siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"¿Está seguro de que desea eliminar el/los objetos %(objects_name)s?. Todos " -"los siguientes objetos e ítems relacionados a los mismos también serán " -"eliminados:" - -msgid "Delete?" -msgstr "¿Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Resumen" - -msgid "Recent actions" -msgstr "Acciones recientes" - -msgid "My actions" -msgstr "Mis acciones" - -msgid "None available" -msgstr "Ninguna disponible" - -msgid "Added:" -msgstr "Agregado:" - -msgid "Changed:" -msgstr "Cambiado:" - -msgid "Deleted:" -msgstr "Eliminado:" - -msgid "Unknown content" -msgstr "Contenido desconocido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Hay algún problema con su instalación de base de datos. Asegúrese de que las " -"tablas de la misma hayan sido creadas, y asegúrese de que el usuario " -"apropiado tenga permisos de lectura en la base de datos." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Ud. se halla autenticado como %(username)s, pero no está autorizado a " -"acceder a esta página ¿Desea autenticarse con una cuenta diferente?" - -msgid "Forgotten your login credentials?" -msgstr "¿Olvidó sus credenciales de ingreso?" - -msgid "Toggle navigation" -msgstr "Alternar navegación" - -msgid "Sidebar" -msgstr "Barra lateral" - -msgid "Start typing to filter…" -msgstr "Empiece a escribir para filtrar…" - -msgid "Filter navigation items" -msgstr "Filtrar elementos de navegación" - -msgid "Date/time" -msgstr "Fecha/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrada" -msgstr[1] "entradas" -msgstr[2] "entradas" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Este objeto no tiene historia de modificaciones. Probablemente no fue " -"añadido usando este sitio de administración." - -msgid "Show all" -msgstr "Mostrar todos" - -msgid "Save" -msgstr "Guardar" - -msgid "Popup closing…" -msgstr "Cerrando ventana emergente…" - -msgid "Search" -msgstr "Buscar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" -msgstr[2] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "total: %(full_result_count)s" - -msgid "Save as new" -msgstr "Guardar como nuevo" - -msgid "Save and add another" -msgstr "Guardar y agregar otro" - -msgid "Save and continue editing" -msgstr "Guardar y continuar editando" - -msgid "Save and view" -msgstr "Guardar y ver" - -msgid "Close" -msgstr "Cerrar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Modificar %(model)s seleccionados/as" - -#, python-format -msgid "Add another %(model)s" -msgstr "Agregar otro/a %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eliminar %(model)s seleccionados/as" - -#, python-format -msgid "View selected %(model)s" -msgstr "Ver %(model)s seleccionado/a" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy." - -msgid "Log in again" -msgstr "Identificarse de nuevo" - -msgid "Password change" -msgstr "Cambio de contraseña" - -msgid "Your password was changed." -msgstr "Su contraseña ha sido cambiada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por favor, por razones de seguridad, introduzca primero su contraseña " -"antigua y luego introduzca la nueva contraseña dos veces para verificar que " -"la ha escrito correctamente." - -msgid "Change my password" -msgstr "Cambiar mi contraseña" - -msgid "Password reset" -msgstr "Recuperar contraseña" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Su contraseña ha sido cambiada. Ahora puede continuar e ingresar." - -msgid "Password reset confirmation" -msgstr "Confirmación de reincialización de contraseña" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor introduzca su nueva contraseña dos veces de manera que podamos " -"verificar que la ha escrito correctamente." - -msgid "New password:" -msgstr "Contraseña nueva:" - -msgid "Confirm password:" -msgstr "Confirme contraseña:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"El enlace de reinicialización de contraseña es inválido, posiblemente debido " -"a que ya ha sido usado. Por favor solicite una nueva reinicialización de " -"contraseña." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Se le han enviado instrucciones sobre cómo establecer su contraseña. Si la " -"dirección de email que proveyó existe, debería recibir las mismas pronto." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no ha recibido un email, por favor asegúrese de que ha introducido la " -"dirección de correo con la que se había registrado y verifique su carpeta de " -"Correo no deseado." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Le enviamos este email porque Ud. ha solicitado que se reestablezca la " -"contraseña para su cuenta de usuario en %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Por favor visite la página que se muestra a continuación y elija una nueva " -"contraseña:" - -msgid "In case you’ve forgotten, you are:" -msgstr "En el caso de que lo haya olvidado Ud. es:" - -msgid "Thanks for using our site!" -msgstr "¡Gracias por usar nuestro sitio!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"¿Olvidó su contraseña? Introduzca su dirección de email abajo y le " -"enviaremos instrucciones para establecer una nueva." - -msgid "Email address:" -msgstr "Dirección de email:" - -msgid "Reset my password" -msgstr "Recuperar mi contraseña" - -msgid "Select all objects on this page for an action" -msgstr "Seleccione todos los objetos de esta página para una acción" - -msgid "All dates" -msgstr "Todas las fechas" - -#, python-format -msgid "Select %s" -msgstr "Seleccione %s" - -#, python-format -msgid "Select %s to change" -msgstr "Seleccione %s a modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Seleccione %s que desea ver" - -msgid "Date:" -msgstr "Fecha:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Buscar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Cambiar:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 904d630..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5c55be4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,329 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ramiro Morales, 2014-2016,2020-2023,2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Ramiro Morales, 2014-2016,2020-2023,2025\n" -"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponibles" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Elija %s seleccionándolos/as y luego use el botón flecha \"Elegir\"." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba en esta caja para filtrar la lista de %s disponibles." - -msgid "Filter" -msgstr "Filtro" - -#, javascript-format -msgid "Choose all %s" -msgstr "Elegir todo/as los/as %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Elegir %s seleccionados/as" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Eliminar %s seleccionados/as" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s seleccionados/as" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Eliminar %s seleccionándolos/as y luego use el botón flecha \"Eliminar\"." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Escriba en este cuadro para filtrar la lista de %s seleccionados/as." - -msgid "(click to clear)" -msgstr "(click para limpiar)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Eliminar todo/as los/as %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opción seleccionada no visible" -msgstr[1] "%s opciones seleccionadas no visibles" -msgstr[2] "%s opciones seleccionadas no visibles" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionado/a" -msgstr[1] "%(sel)s de %(cnt)s seleccionados/as" -msgstr[2] "%(sel)s de %(cnt)s seleccionados/as" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tiene modificaciones sin guardar en campos modificables individuales. Si " -"ejecuta una acción las mismas se perderán." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Ha seleccionado una acción pero todavía no ha grabado sus cambios en campos " -"individuales. Por favor haga click en Ok para grabarlos. Luego necesitará re-" -"ejecutar la acción." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ha seleccionado una acción y no ha realizado ninguna modificación de campos " -"individuales. Es probable que deba usar el botón 'Ir' y no el botón " -"'Grabar'." - -msgid "Now" -msgstr "Ahora" - -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 AM" - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 PM" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"Nota: Ud. se encuentra en una zona horaria que está %s hora adelantada " -"respecto a la del servidor." -msgstr[1] "" -"Nota: Ud. se encuentra en una zona horaria que está %s horas adelantada " -"respecto a la del servidor." -msgstr[2] "" -"Nota: Ud. se encuentra en una zona horaria que está %s horas adelantada " -"respecto a la del servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Nota: Ud. se encuentra en una zona horaria que está %s hora atrasada " -"respecto a la del servidor." -msgstr[1] "" -"Nota: Ud. se encuentra en una zona horaria que está %s horas atrasada " -"respecto a la del servidor." -msgstr[2] "" -"Nota: Ud. se encuentra en una zona horaria que está %s horas atrasada " -"respecto a la del servidor." - -msgid "Choose a Time" -msgstr "Seleccione una Hora" - -msgid "Choose a time" -msgstr "Elija una hora" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoy" - -msgid "Choose a Date" -msgstr "Seleccione una Fecha" - -msgid "Yesterday" -msgstr "Ayer" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "enero" - -msgid "February" -msgstr "febrero" - -msgid "March" -msgstr "marzo" - -msgid "April" -msgstr "abril" - -msgid "May" -msgstr "mayo" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "agosto" - -msgid "September" -msgstr "setiembre" - -msgid "October" -msgstr "octubre" - -msgid "November" -msgstr "noviembre" - -msgid "December" -msgstr "diciembre" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Ene" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Set" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Oct" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dic" - -msgid "Sunday" -msgstr "domingo" - -msgid "Monday" -msgstr "lunes" - -msgid "Tuesday" -msgstr "martes" - -msgid "Wednesday" -msgstr "miércoles" - -msgid "Thursday" -msgstr "jueves" - -msgid "Friday" -msgstr "viernes" - -msgid "Saturday" -msgstr "sábado" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "lun" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "mié" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "jue" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "vie" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "sáb" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index f806074..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index 5831fbf..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,697 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# abraham.martin , 2014 -# Axel Díaz , 2015 -# Claude Paroz , 2014 -# Ernesto Avilés Vázquez , 2015 -# franchukelly , 2011 -# guillem , 2012 -# Igor Támara , 2013 -# Jannis Leidel , 2011 -# Josue Naaman Nistal Guerra , 2014 -# Marc Garcia , 2011 -# Pablo, 2015 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 19:11+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eliminado/s %(count)d %(items)s satisfactoriamente." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No se puede eliminar %(name)s" - -msgid "Are you sure?" -msgstr "¿Está seguro?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionado/s" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todo" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Any date" -msgstr "Cualquier fecha" - -msgid "Today" -msgstr "Hoy" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este año" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor ingrese el %(username)s y la clave correctos para obtener cuenta " -"de personal. Observe que ambos campos pueden ser sensibles a mayúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Agregar %(verbose_name)s adicional." - -msgid "Remove" -msgstr "Eliminar" - -msgid "action time" -msgstr "hora de la acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "object id" -msgstr "id del objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr del objeto" - -msgid "action flag" -msgstr "marca de acción" - -msgid "change message" -msgstr "mensaje de cambio" - -msgid "log entry" -msgstr "entrada de registro" - -msgid "log entries" -msgstr "entradas de registro" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Añadidos \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Cambiados \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Eliminado/a \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Objeto de registro de Log" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "Añadido." - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "No ha cambiado ningún campo." - -msgid "None" -msgstr "Ninguno" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Mantenga presionado \"Control\" o \"Command\" en un Mac, para seleccionar " -"más de una opción." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Se deben seleccionar elementos para poder realizar acciones sobre estos. No " -"se han modificado elementos." - -msgid "No action selected." -msgstr "No se seleccionó ninguna acción." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Añadir %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -msgid "Database error" -msgstr "Error en la base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s fué modificado con éxito." -msgstr[1] "%(count)s %(name)s fueron modificados con éxito." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionado" -msgstr[1] "%(total_count)s seleccionados en total" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "seleccionados 0 de %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de modificaciones: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La eliminación de %(class_name)s %(instance)s requeriría eliminar los " -"siguientes objetos relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Sitio de administración de Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Sitio administrativo" - -msgid "Log in" -msgstr "Iniciar sesión" - -#, python-format -msgid "%(app)s administration" -msgstr "Administración de %(app)s " - -msgid "Page not found" -msgstr "Página no encontrada" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Lo sentimos, pero no se encuentra la página solicitada." - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error de servidor (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ha habido un error. Ha sido comunicado al administrador del sitio por correo " -"electrónico y debería solucionarse a la mayor brevedad. Gracias por su " -"paciencia y comprensión." - -msgid "Run the selected action" -msgstr "Ejecutar la acción seleccionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Pulse aquí para seleccionar los objetos a través de todas las páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar todos los %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Limpiar selección" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar " -"el resto de opciones del usuario." - -msgid "Enter a username and password." -msgstr "Ingrese un nombre de usuario y contraseña" - -msgid "Change password" -msgstr "Cambiar contraseña" - -msgid "Please correct the error below." -msgstr "Por favor, corrija los siguientes errores." - -msgid "Please correct the errors below." -msgstr "Por favor, corrija los siguientes errores." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Ingrese una nueva contraseña para el usuario %(username)s." - -msgid "Welcome," -msgstr "Bienvenido/a," - -msgid "View site" -msgstr "Ver el sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Terminar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Añadir %(name)s" - -msgid "History" -msgstr "Histórico" - -msgid "View on site" -msgstr "Ver en el sitio" - -msgid "Filter" -msgstr "Filtro" - -msgid "Remove from sorting" -msgstr "Elimina de la ordenación" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridad de la ordenación: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Activar la ordenación" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"La eliminación de %(object_name)s %(escaped_object)s requeriría eliminar los " -"siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s" -"\"? Se borrarán los siguientes objetos relacionados:" - -msgid "Objects" -msgstr "Objetos" - -msgid "Yes, I'm sure" -msgstr "Sí, estoy seguro" - -msgid "No, take me back" -msgstr "No, llévame atrás" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objetos." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"La eliminación del %(objects_name)s seleccionado resultaría en el borrado de " -"objetos relacionados, pero su cuenta no tiene permisos para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"La eliminación de %(objects_name)s seleccionado requeriría el borrado de los " -"siguientes objetos protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? " -"Todos los siguientes objetos y sus elementos relacionados serán borrados:" - -msgid "Change" -msgstr "Modificar" - -msgid "Delete?" -msgstr "¿Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Resumen" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Añadir" - -msgid "You don't have permission to edit anything." -msgstr "No tiene permiso para editar nada." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Ninguno disponible" - -msgid "Unknown content" -msgstr "Contenido desconocido" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Algo va mal con la instalación de la base de datos. Asegúrese de que las " -"tablas necesarias han sido creadas, y de que la base de datos puede ser " -"leída por el usuario apropiado." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Se ha autenticado como %(username)s, pero no está autorizado a acceder a " -"esta página. ¿Desea autenticarse con una cuenta diferente?" - -msgid "Forgotten your password or username?" -msgstr "¿Ha olvidado la contraseña o el nombre de usuario?" - -msgid "Date/time" -msgstr "Fecha/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Este objeto no tiene histórico de cambios. Probablemente no fue añadido " -"usando este sitio de administración." - -msgid "Show all" -msgstr "Mostrar todo" - -msgid "Save" -msgstr "Grabar" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Cambiar %(model)s seleccionado" - -#, python-format -msgid "Add another %(model)s" -msgstr "Añadir otro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eliminar %(model)s seleccionada/o" - -msgid "Search" -msgstr "Buscar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Grabar como nuevo" - -msgid "Save and add another" -msgstr "Grabar y añadir otro" - -msgid "Save and continue editing" -msgstr "Grabar y continuar editando" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Gracias por el tiempo que ha dedicado hoy al sitio web." - -msgid "Log in again" -msgstr "Iniciar sesión de nuevo" - -msgid "Password change" -msgstr "Cambio de contraseña" - -msgid "Your password was changed." -msgstr "Su contraseña ha sido cambiada." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por favor, ingrese su contraseña antigua, por seguridad, y después " -"introduzca la nueva contraseña dos veces para verificar que la ha escrito " -"correctamente." - -msgid "Change my password" -msgstr "Cambiar mi contraseña" - -msgid "Password reset" -msgstr "Restablecer contraseña" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Su contraseña ha sido establecida. Ahora puede seguir adelante e iniciar " -"sesión." - -msgid "Password reset confirmation" -msgstr "Confirmación de restablecimiento de contraseña" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor, ingrese su contraseña nueva dos veces para verificar que la ha " -"escrito correctamente." - -msgid "New password:" -msgstr "Contraseña nueva:" - -msgid "Confirm password:" -msgstr "Confirme contraseña:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"El enlace de restablecimiento de contraseña era inválido, seguramente porque " -"se haya usado antes. Por favor, solicite un nuevo restablecimiento de " -"contraseña." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Le hemos enviado por email las instrucciones para restablecer la contraseña, " -"si es que existe una cuenta con la dirección electrónica que indicó. Debería " -"recibirlas en breve." - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no recibe un correo, por favor asegúrese de que ha introducido la " -"dirección de correo con la que se registró y verifique su carpeta de spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ha recibido este correo electrónico porque ha solicitado restablecer la " -"contraseña para su cuenta en %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña." - -msgid "Your username, in case you've forgotten:" -msgstr "Su nombre de usuario, en caso de haberlo olvidado:" - -msgid "Thanks for using our site!" -msgstr "¡Gracias por usar nuestro sitio!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"¿Ha olvidado su clave? Ingrese su dirección de correo electrónico a " -"continuación y le enviaremos las instrucciones para establecer una nueva." - -msgid "Email address:" -msgstr "Correo electrónico:" - -msgid "Reset my password" -msgstr "Restablecer mi contraseña" - -msgid "All dates" -msgstr "Todas las fechas" - -#, python-format -msgid "Select %s" -msgstr "Escoja %s" - -#, python-format -msgid "Select %s to change" -msgstr "Escoja %s a modificar" - -msgid "Date:" -msgstr "Fecha:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Buscar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Cambiar:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 3d428a0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po deleted file mode 100644 index 4bcc1cc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,223 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ernesto Avilés Vázquez , 2015 -# Jannis Leidel , 2011 -# Josue Naaman Nistal Guerra , 2014 -# Leonardo J. Caballero G. , 2011 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-20 03:01+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s Disponibles" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta es la lista de %s disponibles. Puede elegir algunos seleccionándolos en " -"la caja inferior y luego haciendo clic en la flecha \"Elegir\" que hay entre " -"las dos cajas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba en este cuadro para filtrar la lista de %s disponibles" - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Selecciona todos" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Haga clic para seleccionar todos los %s de una vez" - -msgid "Choose" -msgstr "Elegir" - -msgid "Remove" -msgstr "Eliminar" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s elegidos" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta es la lista de los %s elegidos. Puede eliminar algunos seleccionándolos " -"en la caja inferior y luego haciendo click en la flecha \"Eliminar\" que hay " -"entre las dos cajas." - -msgid "Remove all" -msgstr "Eliminar todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Haz clic para eliminar todos los %s elegidos" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionado" -msgstr[1] "%(sel)s de %(cnt)s seleccionados" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tiene cambios sin guardar en campos editables individuales. Si ejecuta una " -"acción, los cambios no guardados se perderán." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Ha seleccionado una acción, pero no ha guardado los cambios en los campos " -"individuales todavía. Pulse OK para guardar. Tendrá que volver a ejecutar la " -"acción." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ha seleccionado una acción y no ha hecho ningún cambio en campos " -"individuales. Probablemente esté buscando el botón Ejecutar en lugar del " -"botón Guardar." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Usted esta a %s horas por delante de la hora del servidor." -msgstr[1] "Nota: Usted va %s horas por delante de la hora del servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Usted esta a %s hora de retraso de tiempo de servidor." -msgstr[1] "Nota: Usted va %s horas por detrás de la hora del servidor." - -msgid "Now" -msgstr "Ahora" - -msgid "Choose a Time" -msgstr "Elija una hora" - -msgid "Choose a time" -msgstr "Elija una hora" - -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 p.m." - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoy" - -msgid "Choose a Date" -msgstr "Elija una fecha" - -msgid "Yesterday" -msgstr "Ayer" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Esconder" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index 8b88505..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index 416df6a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,720 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abe Estrada, 2011-2013 -# Alex Dzul , 2015 -# Gustavo Jimenez , 2020 -# Jesús Bautista , 2020 -# José Rosso, 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: José Rosso\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionados/as" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Se eliminaron con éxito %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No se puede eliminar %(name)s " - -msgid "Are you sure?" -msgstr "¿Está seguro?" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todos/as" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Any date" -msgstr "Cualquier fecha" - -msgid "Today" -msgstr "Hoy" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este año" - -msgid "No date" -msgstr "Sin fecha" - -msgid "Has date" -msgstr "Tiene fecha" - -msgid "Empty" -msgstr "Vacío" - -msgid "Not empty" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor introduza %(username)s y contraseña correctos de una cuenta de " -"staff. Note que puede que ambos campos sean estrictos en relación a " -"diferencias entre mayúsculas y minúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Agregar otro/a %(verbose_name)s" - -msgid "Remove" -msgstr "Eliminar" - -msgid "Addition" -msgstr "Adición" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Eliminación" - -msgid "action time" -msgstr "hora de la acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "object id" -msgstr "id de objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr de objeto" - -msgid "action flag" -msgstr "marca de acción" - -msgid "change message" -msgstr "mensaje de cambio" - -msgid "log entry" -msgstr "entrada de registro" - -msgid "log entries" -msgstr "entradas de registro" - -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "Objeto de registro de Log" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "Agregado." - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "No ha modificado ningún campo." - -msgid "None" -msgstr "Ninguno" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "El {name} \"{obj}\" se agregó correctamente." - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Deben existir items seleccionados para poder realizar acciones sobre los " -"mismos. No se modificó ningún item." - -msgid "No action selected." -msgstr "No se ha seleccionado ninguna acción." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Agregar %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "Error en la base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Se ha modificado con éxito %(count)s %(name)s." -msgstr[1] "Se han modificado con éxito %(count)s %(name)s." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionados/as" -msgstr[1] "Todos/as (%(total_count)s en total) han sido seleccionados/as" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seleccionados/as" - -#, python-format -msgid "Change history: %s" -msgstr "Historia de modificaciones: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La eliminación de %(class_name)s %(instance)s provocaría la eliminación de " -"los siguientes objetos relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Sitio de administración de Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Administración del sitio" - -msgid "Log in" -msgstr "Identificarse" - -#, python-format -msgid "%(app)s administration" -msgstr "Administración de %(app)s " - -msgid "Page not found" -msgstr "Página no encontrada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error de servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Ejecutar la acción seleccionada" - -msgid "Go" -msgstr "Ejecutar" - -msgid "Click here to select the objects across all pages" -msgstr "Haga click aquí para seleccionar los objetos de todas las páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar lo(s)/a(s) %(total_count)s de %(module_name)s" - -msgid "Clear selection" -msgstr "Borrar selección" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Agregar" - -msgid "View" -msgstr "Vista" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Introduzca un nombre de usuario y una contraseña." - -msgid "Change password" -msgstr "Cambiar contraseña" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "Por favor, corrija los siguientes errores." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Introduzca una nueva contraseña para el usuario %(username)s." - -msgid "Welcome," -msgstr "Bienvenido," - -msgid "View site" -msgstr "Ver sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Cerrar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Agregar %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Ver en el sitio" - -msgid "Filter" -msgstr "Filtrar" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "Elimina de la clasificación" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridad de la clasificación: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Activar la clasificación" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para eliminar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Para eliminar %(object_name)s '%(escaped_object)s' requiere eliminar los " -"siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"¿Está seguro de que quiere eliminar los %(object_name)s \"%(escaped_object)s" -"\"? Se eliminarán los siguientes objetos relacionados:" - -msgid "Objects" -msgstr "Objetos" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objetos" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Para eliminar %(objects_name)s requiere eliminar los objetos relacionado, " -"pero tu cuenta no tiene permisos para eliminar los siguientes tipos de " -"objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Eliminar el seleccionado %(objects_name)s requiere eliminar los siguientes " -"objetos relacionados protegidas:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"¿Está seguro que desea eliminar el seleccionado %(objects_name)s ? Todos los " -"objetos siguientes y sus elementos asociados serán eliminados:" - -msgid "Delete?" -msgstr "Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Por %(filter_title)s" - -msgid "Summary" -msgstr "Resúmen" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "Mis acciones" - -msgid "None available" -msgstr "Ninguna disponible" - -msgid "Unknown content" -msgstr "Contenido desconocido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "¿Ha olvidado su contraseña o nombre de usuario?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Fecha/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Mostrar todos/as" - -msgid "Save" -msgstr "Guardar" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Buscar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s results" -msgstr[1] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "total: %(full_result_count)s" - -msgid "Save as new" -msgstr "Guardar como nuevo" - -msgid "Save and add another" -msgstr "Guardar y agregar otro" - -msgid "Save and continue editing" -msgstr "Guardar y continuar editando" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "Cerrar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Identificarse de nuevo" - -msgid "Password change" -msgstr "Cambio de contraseña" - -msgid "Your password was changed." -msgstr "Su contraseña ha sido cambiada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "Cambiar mi contraseña" - -msgid "Password reset" -msgstr "Recuperar contraseña" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Se le ha enviado su contraseña. Ahora puede continuar e ingresar." - -msgid "Password reset confirmation" -msgstr "Confirmación de reincialización de contraseña" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor introduzca su nueva contraseña dos veces de manera que podamos " -"verificar que la ha escrito correctamente." - -msgid "New password:" -msgstr "Nueva contraseña:" - -msgid "Confirm password:" -msgstr "Confirme contraseña:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"El enlace de reinicialización de contraseña es inválido, posiblemente debido " -"a que ya ha sido usado. Por favor solicite una nueva reinicialización de " -"contraseña." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Usted está recibiendo este correo electrónico porque ha solicitado un " -"restablecimiento de contraseña para la cuenta de usuario en %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Por favor visite la página que se muestra a continuación y elija una nueva " -"contraseña:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "¡Gracias por usar nuestro sitio!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "Correo electrónico:" - -msgid "Reset my password" -msgstr "Recuperar mi contraseña" - -msgid "All dates" -msgstr "Todas las fechas" - -#, python-format -msgid "Select %s" -msgstr "Seleccione %s" - -#, python-format -msgid "Select %s to change" -msgstr "Seleccione %s a modificar" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Fecha:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Buscar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Modificar:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo deleted file mode 100644 index fbd765a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po deleted file mode 100644 index 76af2f3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,219 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abraham Estrada, 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Disponible %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta es la lista de los %s disponibles. Usted puede elegir algunos " -"seleccionándolos en el cuadro de abajo y haciendo click en la flecha " -"\"Seleccionar\" entre las dos cajas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba en esta casilla para filtrar la lista de %s disponibles." - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Seleccionar todos" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Da click para seleccionar todos los %s de una vez." - -msgid "Choose" -msgstr "Seleccionar" - -msgid "Remove" -msgstr "Quitar" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s seleccionados" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta es la lista de los %s elegidos. Usted puede eliminar algunos " -"seleccionándolos en el cuadro de abajo y haciendo click en la flecha " -"\"Eliminar\" entre las dos cajas." - -msgid "Remove all" -msgstr "Eliminar todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Da click para eliminar todos los %s seleccionados de una vez." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionado/a" -msgstr[1] "%(sel)s de %(cnt)s seleccionados/as" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tiene modificaciones sin guardar en campos modificables individuales. Si " -"ejecuta una acción las mismas se perderán." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Ha seleccionado una acción, pero todavía no ha grabado las modificaciones " -"que ha realizado en campos individuales. Por favor haga click en Aceptar " -"para grabarlas. Necesitará ejecutar la acción nuevamente." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ha seleccionado una acción pero no ha realizado ninguna modificación en " -"campos individuales. Es probable que lo que necesite usar en realidad sea el " -"botón Ejecutar y no el botón Guardar." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Ahora" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Elija una hora" - -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoy" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Ayer" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Ocultar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index ab04e3f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index c9e1509..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,698 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eduardo , 2017 -# Hotellook, 2014 -# Leonardo J. Caballero G. , 2016 -# Yoel Acevedo, 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 19:11+0000\n" -"Last-Translator: Eduardo \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" -"language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eliminado %(count)d %(items)s satisfactoriamente." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No se puede eliminar %(name)s" - -msgid "Are you sure?" -msgstr "¿Está seguro?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionado" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todo" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Any date" -msgstr "Cualquier fecha" - -msgid "Today" -msgstr "Hoy" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este año" - -msgid "No date" -msgstr "Sin fecha" - -msgid "Has date" -msgstr "Tiene fecha" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor, ingrese el %(username)s y la clave correctos para obtener cuenta " -"de personal. Observe que ambos campos pueden ser sensibles a mayúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Añadir otro %(verbose_name)s." - -msgid "Remove" -msgstr "Eliminar" - -msgid "action time" -msgstr "hora de la acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "object id" -msgstr "id del objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr del objeto" - -msgid "action flag" -msgstr "marca de acción" - -msgid "change message" -msgstr "mensaje de cambio" - -msgid "log entry" -msgstr "entrada de registro" - -msgid "log entries" -msgstr "entradas de registro" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Añadidos \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Cambiados \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Eliminado \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Objeto LogEntry" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Agregado {name} \"{object}\"." - -msgid "Added." -msgstr "Añadido." - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Modificado {fields} por {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Modificado {fields}." - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Eliminado {name} \"{object}\"." - -msgid "No fields changed." -msgstr "No ha cambiado ningún campo." - -msgid "None" -msgstr "Ninguno" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Mantenga presionado \"Control\" o \"Command\" en un Mac, para seleccionar " -"más de una opción." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" -"El {name} \"{obj}\" fue agregado satisfactoriamente. Puede editarlo " -"nuevamente a continuación. " - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" -"El {name} \"{obj}\" fue agregado satisfactoriamente. Puede agregar otro " -"{name} a continuación. " - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "El {name} \"{obj}\" fue cambiado satisfactoriamente." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" -"El {name} \"{obj}\" fue cambiado satisfactoriamente. Puede editarlo " -"nuevamente a continuación. " - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" -"El {name} \"{obj}\" fue cambiado satisfactoriamente. Puede agregar otro " -"{name} a continuación." - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "El {name} \"{obj}\" fue cambiado satisfactoriamente." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Se deben seleccionar elementos para poder realizar acciones sobre estos. No " -"se han modificado elementos." - -msgid "No action selected." -msgstr "No se seleccionó ninguna acción." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s con ID \"%(key)s\" no existe. ¿Tal vez fue eliminada?" - -#, python-format -msgid "Add %s" -msgstr "Añadir %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -msgid "Database error" -msgstr "Error en la base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s fué modificado con éxito." -msgstr[1] "%(count)s %(name)s fueron modificados con éxito." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionado" -msgstr[1] "%(total_count)s seleccionados en total" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seleccionado" - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de modificaciones: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La eliminación de %(class_name)s %(instance)s requeriría eliminar los " -"siguientes objetos relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Sitio de administración de Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Sitio de administración" - -msgid "Log in" -msgstr "Iniciar sesión" - -#, python-format -msgid "%(app)s administration" -msgstr "Administración de %(app)s " - -msgid "Page not found" -msgstr "Página no encontrada" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Lo sentimos, pero no se encuentra la página solicitada." - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error de servidor (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ha habido un error. Ha sido comunicado al administrador del sitio por correo " -"electrónico y debería solucionarse a la mayor brevedad. Gracias por su " -"paciencia y comprensión." - -msgid "Run the selected action" -msgstr "Ejecutar la acción seleccionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Pulse aquí para seleccionar los objetos a través de todas las páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar todos los %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Limpiar selección" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar " -"el resto de opciones del usuario." - -msgid "Enter a username and password." -msgstr "Ingrese un nombre de usuario y contraseña" - -msgid "Change password" -msgstr "Cambiar contraseña" - -msgid "Please correct the error below." -msgstr "Por favor, corrija el siguiente error." - -msgid "Please correct the errors below." -msgstr "Por favor, corrija los siguientes errores." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Ingrese una nueva contraseña para el usuario %(username)s." - -msgid "Welcome," -msgstr "Bienvenido," - -msgid "View site" -msgstr "Ver el sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Terminar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Añadir %(name)s" - -msgid "History" -msgstr "Histórico" - -msgid "View on site" -msgstr "Ver en el sitio" - -msgid "Filter" -msgstr "Filtro" - -msgid "Remove from sorting" -msgstr "Elimina de la ordenación" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridad de la ordenación: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Activar la ordenación" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Eliminar el %(object_name)s %(escaped_object)s requeriría eliminar los " -"siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s" -"\"? Se borrarán los siguientes objetos relacionados:" - -msgid "Objects" -msgstr "Objetos" - -msgid "Yes, I'm sure" -msgstr "Sí, Yo estoy seguro" - -msgid "No, take me back" -msgstr "No, llévame atrás" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objetos" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Eliminar el %(objects_name)s seleccionado resultaría en el borrado de " -"objetos relacionados, pero su cuenta no tiene permisos para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Eliminar el %(objects_name)s seleccionado requeriría el borrado de los " -"siguientes objetos protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? " -"Todos los siguientes objetos y sus elementos relacionados serán borrados:" - -msgid "Change" -msgstr "Modificar" - -msgid "Delete?" -msgstr "¿Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Resumen" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Añadir" - -msgid "You don't have permission to edit anything." -msgstr "No tiene permiso para editar nada." - -msgid "Recent actions" -msgstr "Acciones recientes" - -msgid "My actions" -msgstr "Mis acciones" - -msgid "None available" -msgstr "Ninguno disponible" - -msgid "Unknown content" -msgstr "Contenido desconocido" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Algo va mal con la instalación de la base de datos. Asegúrese de que las " -"tablas necesarias han sido creadas, y de que la base de datos puede ser " -"leída por el usuario apropiado." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Se ha autenticado como %(username)s, pero no está autorizado a acceder a " -"esta página. ¿Desea autenticarse con una cuenta diferente?" - -msgid "Forgotten your password or username?" -msgstr "¿Ha olvidado la contraseña o el nombre de usuario?" - -msgid "Date/time" -msgstr "Fecha/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Este objeto no tiene histórico de cambios. Probablemente no fue añadido " -"usando este sitio de administración." - -msgid "Show all" -msgstr "Mostrar todo" - -msgid "Save" -msgstr "Guardar" - -msgid "Popup closing..." -msgstr "Ventana emergente cerrando..." - -#, python-format -msgid "Change selected %(model)s" -msgstr "Cambiar %(model)s seleccionado" - -#, python-format -msgid "Add another %(model)s" -msgstr "Añadir otro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eliminar %(model)s seleccionado" - -msgid "Search" -msgstr "Buscar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Guardar como nuevo" - -msgid "Save and add another" -msgstr "Guardar y añadir otro" - -msgid "Save and continue editing" -msgstr "Guardar y continuar editando" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Gracias por el tiempo que ha dedicado hoy al sitio web." - -msgid "Log in again" -msgstr "Iniciar sesión de nuevo" - -msgid "Password change" -msgstr "Cambio de contraseña" - -msgid "Your password was changed." -msgstr "Su contraseña ha sido cambiada." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por favor, ingrese su contraseña antigua, por seguridad, y después " -"introduzca la nueva contraseña dos veces para verificar que la ha escrito " -"correctamente." - -msgid "Change my password" -msgstr "Cambiar mi contraseña" - -msgid "Password reset" -msgstr "Restablecer contraseña" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Su contraseña ha sido establecida. Ahora puede seguir adelante e iniciar " -"sesión." - -msgid "Password reset confirmation" -msgstr "Confirmación de restablecimiento de contraseña" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor, ingrese su contraseña nueva dos veces para verificar que la ha " -"escrito correctamente." - -msgid "New password:" -msgstr "Contraseña nueva:" - -msgid "Confirm password:" -msgstr "Confirme contraseña:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"El enlace de restablecimiento de contraseña era inválido, seguramente porque " -"se haya usado antes. Por favor, solicite un nuevo restablecimiento de " -"contraseña." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Le hemos enviado por correo electrónico las instrucciones para restablecer " -"la contraseña, si es que existe una cuenta con la dirección electrónica que " -"indicó. Debería recibirlas en breve." - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no recibe un correo, por favor, asegúrese de que ha introducido la " -"dirección de correo con la que se registró y verifique su carpeta de correo " -"no deseado o spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ha recibido este correo electrónico porque ha solicitado restablecer la " -"contraseña para su cuenta en %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña." - -msgid "Your username, in case you've forgotten:" -msgstr "Su nombre de usuario, en caso de haberlo olvidado:" - -msgid "Thanks for using our site!" -msgstr "¡Gracias por usar nuestro sitio!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"¿Ha olvidado su clave? Ingrese su dirección de correo electrónico a " -"continuación y le enviaremos las instrucciones para establecer una nueva." - -msgid "Email address:" -msgstr "Correo electrónico:" - -msgid "Reset my password" -msgstr "Restablecer mi contraseña" - -msgid "All dates" -msgstr "Todas las fechas" - -#, python-format -msgid "Select %s" -msgstr "Escoja %s" - -#, python-format -msgid "Select %s to change" -msgstr "Escoja %s a modificar" - -msgid "Date:" -msgstr "Fecha:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Buscar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Cambiar:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 6cc0519..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1ab4dcd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,222 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eduardo , 2017 -# FIRST AUTHOR , 2012 -# Hotellook, 2014 -# Leonardo J. Caballero G. , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-20 03:01+0000\n" -"Last-Translator: Eduardo \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" -"language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Disponibles %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta es la lista de %s disponibles. Puede elegir algunos seleccionándolos en " -"la caja inferior y luego haciendo clic en la flecha \"Elegir\" que hay entre " -"las dos cajas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba en este cuadro para filtrar la lista de %s disponibles." - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Seleccione todos" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Haga clic para seleccionar todos los %s de una vez." - -msgid "Choose" -msgstr "Elegir" - -msgid "Remove" -msgstr "Eliminar" - -#, javascript-format -msgid "Chosen %s" -msgstr "Elegidos %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta es la lista de los %s elegidos. Puede eliminar algunos seleccionándolos " -"en la caja inferior y luego haciendo clic en la flecha \"Eliminar\" que hay " -"entre las dos cajas." - -msgid "Remove all" -msgstr "Eliminar todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Haga clic para eliminar todos los %s elegidos." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionado" -msgstr[1] "%(sel)s de %(cnt)s seleccionados" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tiene cambios sin guardar en campos editables individuales. Si ejecuta una " -"acción, los cambios no guardados se perderán." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Ha seleccionado una acción, pero no ha guardado los cambios en los campos " -"individuales todavía. Pulse OK para guardar. Tendrá que volver a ejecutar la " -"acción." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ha seleccionado una acción y no ha hecho ningún cambio en campos " -"individuales. Probablemente esté buscando el botón Ejecutar en lugar del " -"botón Guardar." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Usted esta a %s hora por delante de la hora del servidor." -msgstr[1] "Nota: Usted esta a %s horas por delante de la hora del servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Usted esta a %s hora de retraso de la hora de servidor." -msgstr[1] "Nota: Usted esta a %s horas por detrás de la hora del servidor." - -msgid "Now" -msgstr "Ahora" - -msgid "Choose a Time" -msgstr "Elija una Hora" - -msgid "Choose a time" -msgstr "Elija una hora" - -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 p.m." - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoy" - -msgid "Choose a Date" -msgstr "Elija una fecha" - -msgid "Yesterday" -msgstr "Ayer" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Esconder" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index c49caae..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index 54d4f32..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,786 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# eallik , 2011 -# Erlend Eelmets , 2020 -# Jannis Leidel , 2011 -# Janno Liivak , 2013-2015 -# Martin , 2015,2022-2025 -# Martin , 2016,2019-2020 -# Marti Raudsepp , 2016 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Martin , 2015,2022-2025\n" -"Language-Team: Estonian (http://app.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Kustuta valitud %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s kustutamine õnnestus." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ei saa kustutada %(name)s" - -msgid "Delete multiple objects" -msgstr "Kustuta mitu objekti" - -msgid "Administration" -msgstr "Administreerimine" - -msgid "All" -msgstr "Kõik" - -msgid "Yes" -msgstr "Jah" - -msgid "No" -msgstr "Ei" - -msgid "Unknown" -msgstr "Tundmatu" - -msgid "Any date" -msgstr "Suvaline kuupäev" - -msgid "Today" -msgstr "Täna" - -msgid "Past 7 days" -msgstr "Viimased 7 päeva" - -msgid "This month" -msgstr "Käesolev kuu" - -msgid "This year" -msgstr "Käesolev aasta" - -msgid "No date" -msgstr "Kuupäev puudub" - -msgid "Has date" -msgstr "Kuupäev olemas" - -msgid "Empty" -msgstr "Tühi" - -msgid "Not empty" -msgstr "Täidetud" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Palun sisestage personali kontole õige %(username)s ja parool. Teadke, et " -"mõlemad väljad võivad olla tõstutundlikud." - -msgid "Action:" -msgstr "Toiming:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Lisa veel üks %(verbose_name)s" - -msgid "Remove" -msgstr "Eemalda" - -msgid "Addition" -msgstr "Lisamine" - -msgid "Change" -msgstr "Muuda" - -msgid "Deletion" -msgstr "Kustutamine" - -msgid "action time" -msgstr "toimingu aeg" - -msgid "user" -msgstr "kasutaja" - -msgid "content type" -msgstr "sisutüüp" - -msgid "object id" -msgstr "objekti id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekti esitus" - -msgid "action flag" -msgstr "toimingu lipp" - -msgid "change message" -msgstr "muudatuse tekst" - -msgid "log entry" -msgstr "logisissekanne" - -msgid "log entries" -msgstr "logisissekanded" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Lisati “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Muudeti “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Kustutati “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Objekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Lisati {name} “{object}”." - -msgid "Added." -msgstr "Lisatud." - -msgid "and" -msgstr "ja" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Muudeti {fields} -> {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Muudetud {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Kustutati {name} “{object}”." - -msgid "No fields changed." -msgstr "Ühtegi välja ei muudetud." - -msgid "None" -msgstr "Puudub" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Hoia all “Control” või “Command” Macil, et valida rohkem kui üks." - -msgid "Select this object for an action - {}" -msgstr "Vali toiminguks käesolev objekt - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” lisamine õnnestus." - -msgid "You may edit it again below." -msgstr "Võite seda uuesti muuta." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” lisamine õnnestus. Allpool saate lisada järgmise {name}." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” muutmine õnnestus. Allpool saate seda uuesti muuta." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} ”{obj}” muutmine õnnestus. Allpool saate lisada uue {name}." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” muutmine õnnestus." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Palun märgistage elemendid, millega soovite toiminguid sooritada. Ühtegi " -"elementi ei muudetud." - -msgid "No action selected." -msgstr "Toiming valimata." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” kustutamine õnnestus." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s ID-ga “%(key)s” ei eksisteeri. Võib-olla on see kustutatud?" - -#, python-format -msgid "Add %s" -msgstr "Lisa %s" - -#, python-format -msgid "Change %s" -msgstr "Muuda %s" - -#, python-format -msgid "View %s" -msgstr "Vaata %s" - -msgid "Database error" -msgstr "Andmebaasi viga" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s muutmine õnnestus." -msgstr[1] "%(count)s %(name)s muutmine õnnestus." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s valitud" -msgstr[1] "Kõik %(total_count)s valitud" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "valitud 0/%(cnt)s" - -msgid "Delete" -msgstr "Kustuta" - -#, python-format -msgid "Change history: %s" -msgstr "Muudatuste ajalugu: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Et kustutada %(class_name)s %(instance)s, on vaja kustutada järgmised " -"kaitstud seotud objektid: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administreerimisliides" - -msgid "Django administration" -msgstr "Django administreerimisliides" - -msgid "Site administration" -msgstr "Saidi administreerimine" - -msgid "Log in" -msgstr "Sisene" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administreerimine" - -msgid "Page not found" -msgstr "Lehte ei leitud" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Vabandame, kuid soovitud lehte ei leitud." - -msgid "Home" -msgstr "Kodu" - -msgid "Server error" -msgstr "Serveri viga" - -msgid "Server error (500)" -msgstr "Serveri viga (500)" - -msgid "Server Error (500)" -msgstr "Serveri Viga (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ilmnes viga. Sellest on e-posti teel teavitatud lehe administraatorit ja " -"viga parandatakse esimesel võimalusel. Täname kannatlikkuse eest." - -msgid "Run the selected action" -msgstr "Käivita valitud toiming" - -msgid "Go" -msgstr "Mine" - -msgid "Click here to select the objects across all pages" -msgstr "Kliki siin, et märgistada objektid üle kõigi lehekülgede" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Märgista kõik %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Tühjenda valik" - -msgid "Breadcrumbs" -msgstr "Lingirivi" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Rakenduse %(name)s moodulid" - -msgid "Model name" -msgstr "Mudeli nimi" - -msgid "Add link" -msgstr "Lisa link" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Lisa" - -msgid "View" -msgstr "Vaata" - -msgid "You don’t have permission to view or edit anything." -msgstr "Teil pole õigust midagi vaadata ega muuta." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "Pärast kasutaja loomist saate muuta täiendavaid kasutajaandmeid." - -msgid "Error:" -msgstr "Viga:" - -msgid "Change password" -msgstr "Muuda salasõna" - -msgid "Set password" -msgstr "Määra parool" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Palun parandage allolev viga." -msgstr[1] "Palun parandage allolevad vead." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Sisestage uus salasõna kasutajale %(username)s" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "Paroolipõhise autentimise väljalülitamine" - -msgid "Enable password-based authentication" -msgstr "Paroolipõhise autentimise lubamine" - -msgid "Skip to main content" -msgstr "Liigu põhisisu juurde" - -msgid "Welcome," -msgstr "Tere tulemast," - -msgid "View site" -msgstr "Vaata saiti" - -msgid "Documentation" -msgstr "Dokumentatsioon" - -msgid "Log out" -msgstr "Logi välja" - -#, python-format -msgid "Add %(name)s" -msgstr "Lisa %(name)s" - -msgid "History" -msgstr "Ajalugu" - -msgid "View on site" -msgstr "Näita lehel" - -msgid "Filter" -msgstr "Filtreeri" - -msgid "Hide counts" -msgstr "Peida loendused" - -msgid "Show counts" -msgstr "Näita loendusi" - -msgid "Clear all filters" -msgstr "Tühjenda kõik filtrid" - -msgid "Remove from sorting" -msgstr "Eemalda sorteerimisest" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteerimisjärk: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sorteerimine" - -msgid "Toggle theme (current theme: auto)" -msgstr "Teema lülitamine (hetkel: automaatne)" - -msgid "Toggle theme (current theme: light)" -msgstr "Teema lülitamine (hetkel: hele)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Teema lülitamine (hetkel: tume)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Selleks, et kustutada %(object_name)s '%(escaped_object)s', on vaja " -"kustutada lisaks ka kõik seotud objecktid, aga teil puudub õigus järgnevat " -"tüüpi objektide kustutamiseks:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Et kustutada %(object_name)s '%(escaped_object)s', on vaja kustutada " -"järgmised kaitstud seotud objektid:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Kas olete kindel, et soovite kustutada objekti %(object_name)s " -"\"%(escaped_object)s\"? Kõik järgnevad seotud objektid kustutatakse koos " -"sellega:" - -msgid "Objects" -msgstr "Objektid" - -msgid "Yes, I’m sure" -msgstr "Jah, olen kindel" - -msgid "No, take me back" -msgstr "Ei, mine tagasi" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Kui kustutada valitud %(objects_name)s, peaks kustutama ka seotud objektid, " -"aga sinu kasutajakontol pole õigusi järgmiste objektitüüpide kustutamiseks:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Et kustutada valitud %(objects_name)s, on vaja kustutada ka järgmised " -"kaitstud seotud objektid:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Kas oled kindel, et soovid kustutada valitud %(objects_name)s? Kõik " -"järgnevad objektid ja seotud objektid kustutatakse:" - -msgid "Delete?" -msgstr "Kustutan?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "Kokkuvõte" - -msgid "Recent actions" -msgstr "Hiljutised toimingud" - -msgid "My actions" -msgstr "Minu toimingud" - -msgid "None available" -msgstr "Ei leitud ühtegi" - -msgid "Added:" -msgstr "Lisatud:" - -msgid "Changed:" -msgstr "Muudetud:" - -msgid "Deleted:" -msgstr "Kustutatud:" - -msgid "Unknown content" -msgstr "Tundmatu sisu" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"On tekkinud viga seoses andmebaasiga. Veenduge, et kõik vajalikud " -"andmebaasitabelid on loodud ja andmebaas on loetav vastava kasutaja poolt." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Olete sisse logitud kasutajana %(username)s, kuid teil puudub ligipääs " -"lehele. Kas te soovite teise kontoga sisse logida?" - -msgid "Forgotten your login credentials?" -msgstr "Unustasid oma sisselogimisandmed?" - -msgid "Toggle navigation" -msgstr "Lülita navigeerimine sisse" - -msgid "Sidebar" -msgstr "Külgriba" - -msgid "Start typing to filter…" -msgstr "Filtreerimiseks alusta trükkimist..." - -msgid "Filter navigation items" -msgstr "Filtreeri navigatsioonielemente" - -msgid "Date/time" -msgstr "Kuupäev/kellaaeg" - -msgid "User" -msgstr "Kasutaja" - -msgid "Action" -msgstr "Toiming" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "sissekanne" -msgstr[1] "sissekanded" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Sellel objektil puudub muudatuste ajalugu. Tõenäoliselt ei lisatud objekti " -"läbi selle administreerimisliidese." - -msgid "Show all" -msgstr "Näita kõiki" - -msgid "Save" -msgstr "Salvesta" - -msgid "Popup closing…" -msgstr "Hüpikaken sulgub…" - -msgid "Search" -msgstr "Otsing" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s tulemus" -msgstr[1] "%(counter)s tulemust" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Kokku %(full_result_count)s" - -msgid "Save as new" -msgstr "Salvesta uuena" - -msgid "Save and add another" -msgstr "Salvesta ja lisa uus" - -msgid "Save and continue editing" -msgstr "Salvesta ja jätka muutmist" - -msgid "Save and view" -msgstr "Salvesta ja vaata" - -msgid "Close" -msgstr "Sulge" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Muuda valitud %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Lisa veel üks %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Kustuta valitud %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Vaata valitud %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Tänan, et veetsite aega meie lehel." - -msgid "Log in again" -msgstr "Logi uuesti sisse" - -msgid "Password change" -msgstr "Salasõna muutmine" - -msgid "Your password was changed." -msgstr "Teie salasõna on vahetatud." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Turvalisuse tagamiseks palun sisestage oma praegune salasõna ja seejärel uus " -"salasõna. Veendumaks, et uue salasõna sisestamisel ei tekkinud vigu, palun " -"sisestage see kaks korda." - -msgid "Change my password" -msgstr "Muuda salasõna" - -msgid "Password reset" -msgstr "Uue parooli loomine" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Teie salasõna on määratud. Võite nüüd sisse logida." - -msgid "Password reset confirmation" -msgstr "Uue salasõna loomise kinnitamine" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Palun sisestage uus salasõna kaks korda, et saaksime veenduda, et " -"sisestamisel ei tekkinud vigu." - -msgid "New password:" -msgstr "Uus salasõna:" - -msgid "Confirm password:" -msgstr "Kinnita salasõna:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Uue salasõna loomise link ei olnud korrektne. Võimalik, et seda on varem " -"kasutatud. Esitage uue salasõna taotlus uuesti." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Saatsime teile meilile parooli muutmise juhendi. Kui teie poolt sisestatud e-" -"posti aadressiga konto on olemas, siis jõuab kiri peagi kohale." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Kui te ei saa kirja kätte siis veenduge, et sisestasite just selle e-posti " -"aadressi, millega registreerisite. Kontrollige ka oma rämpsposti kausta." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Saite käesoleva kirja kuna soovisite muuta lehel %(site_name)s oma " -"kasutajakontoga seotud parooli." - -msgid "Please go to the following page and choose a new password:" -msgstr "Palun minge järmisele lehele ning sisestage uus salasõna" - -msgid "In case you’ve forgotten, you are:" -msgstr "Kui olete unustanud, siis olete:" - -msgid "Thanks for using our site!" -msgstr "Täname meie lehte külastamast!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s meeskond" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Unustasite oma salasõna? Sisestage oma e-posti aadress ja saadame meilile " -"juhised uue saamiseks." - -msgid "Email address:" -msgstr "E-posti aadress:" - -msgid "Reset my password" -msgstr "Lähtesta mu parool" - -msgid "Select all objects on this page for an action" -msgstr "Vali toiminguks kõik objektid sellel lehel" - -msgid "All dates" -msgstr "Kõik kuupäevad" - -#, python-format -msgid "Select %s" -msgstr "Vali %s" - -#, python-format -msgid "Select %s to change" -msgstr "Vali %s mida muuta" - -#, python-format -msgid "Select %s to view" -msgstr "Vali %s vaatamiseks" - -msgid "Date:" -msgstr "Kuupäev:" - -msgid "Time:" -msgstr "Aeg:" - -msgid "Lookup" -msgstr "Otsi" - -msgid "Currently:" -msgstr "Hetkel:" - -msgid "Change:" -msgstr "Muuda:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo deleted file mode 100644 index ebb1531..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po deleted file mode 100644 index 25543d0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,314 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# eallik , 2011 -# Jannis Leidel , 2011 -# Janno Liivak , 2013-2015 -# Martin , 2021,2023,2025 -# Martin , 2016,2020 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Martin , 2021,2023,2025\n" -"Language-Team: Estonian (http://app.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Saadaval %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Filtreeri selle kasti abil välja \"%s\" nimekirja." - -msgid "Filter" -msgstr "Filter" - -#, javascript-format -msgid "Choose all %s" -msgstr "Vali kõik %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Vali valitud %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valitud %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Filtreeri selle kasti abil valitud \"%s\" nimekirja." - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "Eemalda kõik %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s valik ei ole nähtaval" -msgstr[1] "%s valikut ei ole nähtaval" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s %(cnt)sst valitud" -msgstr[1] "%(sel)s %(cnt)sst valitud" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Muudetavates lahtrites on salvestamata muudatusi. Kui sooritate mõne " -"toimingu, lähevad salvestamata muudatused kaotsi." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Valisite toimingu, kuid pole salvestanud muudatusi lahtrites. Salvestamiseks " -"palun vajutage OK. Peate toimingu uuesti käivitama." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Valisite toimingu, kuid ei muutnud ühtegi lahtrit. Tõenäoliselt otsite Mine " -"mitte Salvesta nuppu." - -msgid "Now" -msgstr "Praegu" - -msgid "Midnight" -msgstr "Kesköö" - -msgid "6 a.m." -msgstr "6 hommikul" - -msgid "Noon" -msgstr "Keskpäev" - -msgid "6 p.m." -msgstr "6 õhtul" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Märkus: Olete %s tund serveri ajast ees." -msgstr[1] "Märkus: Olete %s tundi serveri ajast ees." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Märkus: Olete %s tund serveri ajast maas." -msgstr[1] "Märkus: Olete %s tundi serveri ajast maas." - -msgid "Choose a Time" -msgstr "Vali aeg" - -msgid "Choose a time" -msgstr "Vali aeg" - -msgid "Cancel" -msgstr "Tühista" - -msgid "Today" -msgstr "Täna" - -msgid "Choose a Date" -msgstr "Vali kuupäev" - -msgid "Yesterday" -msgstr "Eile" - -msgid "Tomorrow" -msgstr "Homme" - -msgid "January" -msgstr "jaanuar" - -msgid "February" -msgstr "veebruar" - -msgid "March" -msgstr "märts" - -msgid "April" -msgstr "aprill" - -msgid "May" -msgstr "mai" - -msgid "June" -msgstr "juuni" - -msgid "July" -msgstr "juuli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktoober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "detsember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jaan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "veebr" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "märts" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "juuni" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "juuli" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sept" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dets" - -msgid "Sunday" -msgstr "pühapäev" - -msgid "Monday" -msgstr "esmaspäev" - -msgid "Tuesday" -msgstr "teisipäev" - -msgid "Wednesday" -msgstr "kolmapäev" - -msgid "Thursday" -msgstr "neljapäev" - -msgid "Friday" -msgstr "reede" - -msgid "Saturday" -msgstr "laupäev" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "pühap." - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "esmasp." - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "teisip." - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "kolmap." - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "neljap." - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "reede" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "laup." - -msgctxt "one letter Sunday" -msgid "S" -msgstr "P" - -msgctxt "one letter Monday" -msgid "M" -msgstr "E" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "K" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "N" - -msgctxt "one letter Friday" -msgid "F" -msgstr "R" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index a2c9933..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index 3aba9f8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,732 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aitzol Naberan , 2013,2016 -# Eneko Illarramendi , 2017-2019,2022 -# Jannis Leidel , 2011 -# julen, 2012-2013 -# julen, 2013 -# Urtzi Odriozola , 2017 -# Yoaira García , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Eneko Illarramendi \n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ezabatu aukeratutako %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s elementu ezabatu dira." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ezin da %(name)s ezabatu" - -msgid "Are you sure?" -msgstr "Ziur al zaude?" - -msgid "Administration" -msgstr "Kudeaketa" - -msgid "All" -msgstr "Dena" - -msgid "Yes" -msgstr "Bai" - -msgid "No" -msgstr "Ez" - -msgid "Unknown" -msgstr "Ezezaguna" - -msgid "Any date" -msgstr "Edozein data" - -msgid "Today" -msgstr "Gaur" - -msgid "Past 7 days" -msgstr "Aurreko 7 egunak" - -msgid "This month" -msgstr "Hilabete hau" - -msgid "This year" -msgstr "Urte hau" - -msgid "No date" -msgstr "Datarik ez" - -msgid "Has date" -msgstr "Data dauka" - -msgid "Empty" -msgstr "Hutsik" - -msgid "Not empty" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Idatzi kudeaketa gunerako %(username)s eta pasahitz zuzena. Kontuan izan " -"biek maiuskula/minuskulak desberdintzen dituztela." - -msgid "Action:" -msgstr "Ekintza:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Gehitu beste %(verbose_name)s bat" - -msgid "Remove" -msgstr "Kendu" - -msgid "Addition" -msgstr "Gehitzea" - -msgid "Change" -msgstr "Aldatu" - -msgid "Deletion" -msgstr "Ezabatzea" - -msgid "action time" -msgstr "Ekintza hordua" - -msgid "user" -msgstr "erabiltzailea" - -msgid "content type" -msgstr "eduki mota" - -msgid "object id" -msgstr "objetuaren id-a" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objeturaren adierazpena" - -msgid "action flag" -msgstr "Ekintza botoia" - -msgid "change message" -msgstr "Mezua aldatu" - -msgid "log entry" -msgstr "Log sarrera" - -msgid "log entries" -msgstr "log sarrerak" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" gehituta." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" ezabatuta." - -msgid "LogEntry Object" -msgstr "LogEntry objetua" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} \"{object}\" gehituta." - -msgid "Added." -msgstr "Gehituta" - -msgid "and" -msgstr "eta" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} aldatuta." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} \"{object}\" ezabatuta." - -msgid "No fields changed." -msgstr "Ez da eremurik aldatu." - -msgid "None" -msgstr "Bat ere ez" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Bat baino gehiago hautatzeko, sakatu \"Kontrol\" tekla edo \"Command\" Mac " -"batean." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "Aldaketa gehiago egin ditzazkezu jarraian." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\" ondo gehitu da. Beste {name} bat gehitu dezakezu jarraian." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" ondo aldatu da. Aldaketa gehiago egin ditzazkezu jarraian." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" ondo gehitu da. Aldaketa gehiago egin ditzazkezu jarraian." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Elementuak aukeratu behar dira beraien gain ekintzak burutzeko. Ez da " -"elementurik aldatu." - -msgid "No action selected." -msgstr "Ez dago ekintzarik aukeratuta." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" ondo ezabatu da." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"\"%(key)s\" ID-a duen %(name)s ez da existitzen. Agian ezabatua izan da?" - -#, python-format -msgid "Add %s" -msgstr "Gehitu %s" - -#, python-format -msgid "Change %s" -msgstr "Aldatu %s" - -#, python-format -msgid "View %s" -msgstr "%s ikusi" - -msgid "Database error" -msgstr "Errorea datu-basean" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(name)s %(count)s ondo aldatu da." -msgstr[1] "%(count)s %(name)s ondo aldatu dira." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Guztira %(total_count)s aukeratuta" -msgstr[1] "Guztira %(total_count)s aukeratuta" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Guztira %(cnt)s, 0 aukeratuta" - -#, python-format -msgid "Change history: %s" -msgstr "Aldaketen historia: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s klaseko %(instance)s instantziak ezabatzeak erlazionatutako " -"objektu hauek ezabatzea eragingo du:\n" -"%(related_objects)s" - -msgid "Django site admin" -msgstr "Django kudeaketa gunea" - -msgid "Django administration" -msgstr "Django kudeaketa" - -msgid "Site administration" -msgstr "Webgunearen kudeaketa" - -msgid "Log in" -msgstr "Sartu" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s kudeaketa" - -msgid "Page not found" -msgstr "Ez da orririk aurkitu" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Sentitzen dugu, baina eskatutako orria ezin da aurkitu." - -msgid "Home" -msgstr "Hasiera" - -msgid "Server error" -msgstr "Zerbitzariaren errorea" - -msgid "Server error (500)" -msgstr "Zerbitzariaren errorea (500)" - -msgid "Server Error (500)" -msgstr "Zerbitzariaren errorea (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Burutu aukeratutako ekintza" - -msgid "Go" -msgstr "Joan" - -msgid "Click here to select the objects across all pages" -msgstr "Egin klik hemen orri guztietako objektuak aukeratzeko" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Hautatu %(total_count)s %(module_name)s guztiak" - -msgid "Clear selection" -msgstr "Garbitu hautapena" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s aplikazioaren modeloak" - -msgid "Add" -msgstr "Gehitu" - -msgid "View" -msgstr "Ikusi" - -msgid "You don’t have permission to view or edit anything." -msgstr "Ez duzu ezer ikusteko edo editatzeko baimenik." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Lehenik, sartu erabiltzailea eta pasahitza bat. Gero, editatzeko aukera " -"gehiago izango dituzu. " - -msgid "Enter a username and password." -msgstr "Sartu erabiltzaile izen eta pasahitz bat." - -msgid "Change password" -msgstr "Aldatu pasahitza" - -msgid "Please correct the error below." -msgstr "Mesedez zuzendu erroreak behean." - -msgid "Please correct the errors below." -msgstr "Mesedez zuzendu erroreak behean." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Idatzi pasahitz berria %(username)s erabiltzailearentzat." - -msgid "Welcome," -msgstr "Ongi etorri," - -msgid "View site" -msgstr "Webgunea ikusi" - -msgid "Documentation" -msgstr "Dokumentazioa" - -msgid "Log out" -msgstr "Irten" - -#, python-format -msgid "Add %(name)s" -msgstr "Gehitu %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Webgunean ikusi" - -msgid "Filter" -msgstr "Iragazkia" - -msgid "Clear all filters" -msgstr "Garbitu filtro guztiak." - -msgid "Remove from sorting" -msgstr "Kendu ordenaziotik" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Ordenatzeko lehentasuna: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Txandakatu ordenazioa" - -msgid "Delete" -msgstr "Ezabatu" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s ezabatzean bere '%(escaped_object)s' ere ezabatzen dira, " -"baina zure kontuak ez dauka baimenik objetu mota hauek ezabatzeko:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' ezabatzeak erlazionatutako objektu " -"babestu hauek ezabatzea eskatzen du:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ziur zaude %(object_name)s \"%(escaped_object)s\" ezabatu nahi dituzula? " -"Erlazionaturik dauden hurrengo elementuak ere ezabatuko dira:" - -msgid "Objects" -msgstr "Objetuak" - -msgid "Yes, I’m sure" -msgstr "bai, ziur nago " - -msgid "No, take me back" -msgstr "Ez, itzuli atzera" - -msgid "Delete multiple objects" -msgstr "Ezabatu hainbat objektu" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Aukeratutako %(objects_name)s ezabatzeak erlazionatutako objektuak ezabatzea " -"eskatzen du baina zure kontuak ez dauka baimen nahikorik objektu mota hauek " -"ezabatzeko: " - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Aukeratutako %(objects_name)s ezabatzeak erlazionatutako objektu babestu " -"hauek ezabatzea eskatzen du:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ziur zaude aukeratutako %(objects_name)s ezabatu nahi duzula? Objektu guzti " -"hauek eta erlazionatutako elementu guztiak ezabatuko dira:" - -msgid "Delete?" -msgstr "Ezabatu?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Irizpidea: %(filter_title)s" - -msgid "Summary" -msgstr "Laburpena" - -msgid "Recent actions" -msgstr "Azken ekintzak" - -msgid "My actions" -msgstr "Nire ekintzak" - -msgid "None available" -msgstr "Ez dago ezer" - -msgid "Unknown content" -msgstr "Eduki ezezaguna" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"%(username)s bezala autentikatu zara, baina ez daukazu orrialde honetara " -"sarbidea. Nahi al duzu kontu ezberdin batez sartu?" - -msgid "Forgotten your password or username?" -msgstr "Pasahitza edo erabiltzaile-izena ahaztu duzu?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "Hasi idazten filtratzeko..." - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Data/ordua" - -msgid "User" -msgstr "Erabiltzailea" - -msgid "Action" -msgstr "Ekintza" - -msgid "entry" -msgstr "sarrera" - -msgid "entries" -msgstr "sarrerak" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Erakutsi dena" - -msgid "Save" -msgstr "Gorde" - -msgid "Popup closing…" -msgstr "Popup leihoa ixten..." - -msgid "Search" -msgstr "Bilatu" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "Emaitza %(counter)s " -msgstr[1] "%(counter)s emaitza" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s guztira" - -msgid "Save as new" -msgstr "Gorde berri gisa" - -msgid "Save and add another" -msgstr "Gorde eta beste bat gehitu" - -msgid "Save and continue editing" -msgstr "Gorde eta editatzen jarraitu" - -msgid "Save and view" -msgstr "Gorde eta ikusi" - -msgid "Close" -msgstr "Itxi" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Aldatu aukeratutako %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Gehitu beste %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Ezabatu aukeratutako %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Hasi saioa berriro" - -msgid "Password change" -msgstr "Aldatu pasahitza" - -msgid "Your password was changed." -msgstr "Zure pasahitza aldatu egin da." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Mesedez, sartu zure pasahitza zaharra segurtasunagatik, gero sartu berria bi " -"aldiz, ondo idatzita dagoela ziurtatzeko. " - -msgid "Change my password" -msgstr "Nire pasahitza aldatu" - -msgid "Password reset" -msgstr "Berrezarri pasahitza" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Zure pasahitza ezarri da. Orain aurrera egin eta sartu zaitezke." - -msgid "Password reset confirmation" -msgstr "Pasahitza berrezartzeko berrespena" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Idatzi pasahitz berria birritan ondo idatzita dagoela ziurta dezagun." - -msgid "New password:" -msgstr "Pasahitz berria:" - -msgid "Confirm password:" -msgstr "Berretsi pasahitza:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Pasahitza berrezartzeko loturak baliogabea dirudi. Baliteke lotura aurretik " -"erabilita egotea. Eskatu berriro pasahitza berrezartzea." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Zure pasahitza jartzeko aginduak bidali dizkizugu... sartu duzun posta " -"elektronikoarekin konturen bat baldin badago. Laster jasoko dituzu." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Posta elektronikorik jasotzen ez baduzu, ziurtatu erregistratu duzun " -"helbidean sartu zarela, eta zure spam horria begiratu. " - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Mezu hau %(site_name)s webgunean pasahitza berrezartzea eskatu duzulako jaso " -"duzu." - -msgid "Please go to the following page and choose a new password:" -msgstr "Zoaz hurrengo orrira eta aukeratu pasahitz berria:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Zure erabiltzaile-izena, ahaztu baduzu:" - -msgid "Thanks for using our site!" -msgstr "Mila esker gure webgunea erabiltzeagatik!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s webguneko taldea" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Pasahitza ahaztu zaizu? Sartu zure helbidea behean, eta berria jartzeko " -"argibideak bidaliko dizkizugu " - -msgid "Email address:" -msgstr "Helbide elektronikoa:" - -msgid "Reset my password" -msgstr "Berrezarri pasahitza" - -msgid "All dates" -msgstr "Data guztiak" - -#, python-format -msgid "Select %s" -msgstr "Aukeratu %s" - -#, python-format -msgid "Select %s to change" -msgstr "Aukeratu %s aldatzeko" - -#, python-format -msgid "Select %s to view" -msgstr "Aukeratu %s ikusteko" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Ordua:" - -msgid "Lookup" -msgstr "Lookup" - -msgid "Currently:" -msgstr "Oraingoa:" - -msgid "Change:" -msgstr "Aldatu:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 234bff6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po deleted file mode 100644 index e7d3ae5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,267 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aitzol Naberan , 2011 -# Eneko Illarramendi , 2017,2022 -# Jannis Leidel , 2011 -# julen, 2012-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:26-0500\n" -"PO-Revision-Date: 2022-07-25 07:59+0000\n" -"Last-Translator: Eneko Illarramendi \n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s erabilgarri" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Hau da aukeran dauden %s zerrenda. Hauetako zenbait aukera ditzakezu " -"azpiko \n" -"kaxan hautatu eta kutxen artean dagoen \"Aukeratu\" gezian klik eginez." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Idatzi kutxa honetan erabilgarri dauden %s objektuak iragazteko." - -msgid "Filter" -msgstr "Filtroa" - -msgid "Choose all" -msgstr "Denak aukeratu" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Egin klik %s guztiak batera aukeratzeko." - -msgid "Choose" -msgstr "Aukeratu" - -msgid "Remove" -msgstr "Kendu" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s aukeratuak" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Hau da aukeratutako %s zerrenda. Hauetako zenbait ezaba ditzakezu azpiko " -"kutxan hautatu eta bi kutxen artean dagoen \"Ezabatu\" gezian klik eginez." - -msgid "Remove all" -msgstr "Kendu guztiak" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Egin klik aukeratutako %s guztiak kentzeko." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s-etik %(sel)s aukeratuta" -msgstr[1] "%(cnt)s-etik %(sel)s aukeratuta" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Gorde gabeko aldaketak dauzkazu eremuetan. Ekintza bat exekutatzen baduzu, " -"gorde gabeko aldaketak galduko dira." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Orain" - -msgid "Midnight" -msgstr "Gauerdia" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Eguerdia" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Oharra: zerbitzariaren denborarekiko ordu %s aurrerago zaude" -msgstr[1] "Oharra: zerbitzariaren denborarekiko %s ordu aurrerago zaude" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Oharra: zerbitzariaren denborarekiko ordu %s atzerago zaude. " -msgstr[1] "Oharra: zerbitzariaren denborarekiko %s ordu atzerago zaude. " - -msgid "Choose a Time" -msgstr "Aukeratu ordu bat" - -msgid "Choose a time" -msgstr "Aukeratu ordu bat" - -msgid "Cancel" -msgstr "Atzera" - -msgid "Today" -msgstr "Gaur" - -msgid "Choose a Date" -msgstr "Aukeratu data bat" - -msgid "Yesterday" -msgstr "Atzo" - -msgid "Tomorrow" -msgstr "Bihar" - -msgid "January" -msgstr "urtarrila" - -msgid "February" -msgstr "otsaila" - -msgid "March" -msgstr "martxoa" - -msgid "April" -msgstr "apirila" - -msgid "May" -msgstr "maiatza" - -msgid "June" -msgstr "ekaina" - -msgid "July" -msgstr "uztaila" - -msgid "August" -msgstr "abuztua" - -msgid "September" -msgstr "iraila" - -msgid "October" -msgstr "urria" - -msgid "November" -msgstr "azaroa" - -msgid "December" -msgstr "abendua" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "urt." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "ots." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "api." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "mai." - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "eka." - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "uzt." - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "abu." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "ira." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "urr." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "aza." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "abe." - -msgctxt "one letter Sunday" -msgid "S" -msgstr "ig." - -msgctxt "one letter Monday" -msgid "M" -msgstr "al." - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "ar." - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "az." - -msgctxt "one letter Thursday" -msgid "T" -msgstr "og." - -msgctxt "one letter Friday" -msgid "F" -msgstr "ol." - -msgctxt "one letter Saturday" -msgid "S" -msgstr "lr." - -msgid "" -"You have already submitted this form. Are you sure you want to submit it " -"again?" -msgstr "" - -msgid "Show" -msgstr "Erakutsi" - -msgid "Hide" -msgstr "Izkutatu" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index 86d3ee6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index 56a0160..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,790 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ahmad Hosseini , 2020 -# Ali Nikneshan , 2015,2020 -# ali salehi, 2023 -# Ali Vakilzade , 2015 -# Aly Ahmady , 2022 -# Amir Ajorloo , 2020 -# Arash Fazeli , 2012 -# Farshad Asadpour, 2021 -# Jannis Leidel , 2011 -# MJafar Mashhadi , 2018 -# Mohammad Hossein Mojtahedi , 2017,2019 -# Peyman Salehi , 2023 -# Pouya Abbassi, 2016 -# rahim agh , 2021 -# Reza Mohammadi , 2013-2014 -# Sajad Rahimi , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: ali salehi, 2023\n" -"Language-Team: Persian (http://app.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "حذف %(verbose_name_plural)s های انتخاب شده" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d تا %(items)s با موفقیت حذف شدند." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "امکان حذف %(name)s نیست." - -msgid "Are you sure?" -msgstr "آیا مطمئن هستید؟" - -msgid "Administration" -msgstr "مدیریت" - -msgid "All" -msgstr "همه" - -msgid "Yes" -msgstr "بله" - -msgid "No" -msgstr "خیر" - -msgid "Unknown" -msgstr "ناشناخته" - -msgid "Any date" -msgstr "هر تاریخی" - -msgid "Today" -msgstr "امروز" - -msgid "Past 7 days" -msgstr "۷ روز اخیر" - -msgid "This month" -msgstr "این ماه" - -msgid "This year" -msgstr "امسال" - -msgid "No date" -msgstr "بدون تاریخ" - -msgid "Has date" -msgstr "دارای تاریخ" - -msgid "Empty" -msgstr "خالی" - -msgid "Not empty" -msgstr "غیر خالی" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"لطفا %(username)s و گذرواژه را برای یک حساب کارمند وارد کنید.\n" -"توجه داشته باشید که ممکن است هر دو به کوچکی و بزرگی حروف حساس باشند." - -msgid "Action:" -msgstr "اقدام:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "افزودن یک %(verbose_name)s دیگر" - -msgid "Remove" -msgstr "حذف" - -msgid "Addition" -msgstr "افزودن" - -msgid "Change" -msgstr "تغییر" - -msgid "Deletion" -msgstr "کاستن" - -msgid "action time" -msgstr "زمان اقدام" - -msgid "user" -msgstr "کاربر" - -msgid "content type" -msgstr "نوع محتوی" - -msgid "object id" -msgstr "شناسهٔ شیء" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "صورت شیء" - -msgid "action flag" -msgstr "نشانه عمل" - -msgid "change message" -msgstr "پیغام تغییر" - -msgid "log entry" -msgstr "مورد اتفاقات" - -msgid "log entries" -msgstr "موارد اتفاقات" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" افروده شد." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "تغییر یافت \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" حدف شد." - -msgid "LogEntry Object" -msgstr "شئ LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} \"{object}\" اضافه شد." - -msgid "Added." -msgstr "اضافه شد" - -msgid "and" -msgstr "و" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} برای {name} \"{object}\" تغییر یافتند." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} تغییر یافتند." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} \"{object}\" حذف شد." - -msgid "No fields changed." -msgstr "فیلدی تغییر نیافته است." - -msgid "None" -msgstr "هیچ" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"برای انتخاب بیش از یکی، کلید \"Control\"، یا \"Command\" روی Mac، را نگه " -"دارید." - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" با موفقیت اضافه شد." - -msgid "You may edit it again below." -msgstr "می‌توانید مجدداً ویرایش کنید." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\" با موفقیت اضافه شد. شما میتوانید {name} دیگری در قسمت پایین " -"اضافه کنید." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" با موفقیت تغییر یافت. شما میتوانید دوباره آنرا در قسمت " -"پایین ویرایش کنید." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -" {name} \"{obj}\" به موفقیت اضافه شد. شما میتوانید در قسمت پایین، دوباره آن " -"را ویرایش کنید." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" با موفقیت تغییر یافت. شما میتوانید {name} دیگری در قسمت " -"پایین اضافه کنید." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" با موفقیت تغییر یافت." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"آیتم ها باید به منظور انجام عملیات بر روی آنها انتخاب شوند. هیچ آیتمی با " -"تغییر نیافته است." - -msgid "No action selected." -msgstr "فعالیتی انتخاب نشده" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s·\"%(obj)s\" با موفقیت حذف شد." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s با کلید «%(key)s» وجود ندارد. ممکن است حذف شده باشد." - -#, python-format -msgid "Add %s" -msgstr "اضافه کردن %s" - -#, python-format -msgid "Change %s" -msgstr "تغییر %s" - -#, python-format -msgid "View %s" -msgstr "مشاهده %s" - -msgid "Database error" -msgstr "خطا در بانک اطلاعاتی" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s با موفقیت تغییر کرد." -msgstr[1] "%(count)s %(name)s با موفقیت تغییر کرد." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "همه موارد %(total_count)s انتخاب شده" -msgstr[1] "همه موارد %(total_count)s انتخاب شده" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 از %(cnt)s انتخاب شده‌اند" - -#, python-format -msgid "Change history: %s" -msgstr "تاریخچهٔ تغییر: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"برای حذف %(class_name)s %(instance)s لازم است اشیای حفاظت شدهٔ زیر هم حذف " -"شوند: %(related_objects)s" - -msgid "Django site admin" -msgstr "مدیریت وب‌گاه Django" - -msgid "Django administration" -msgstr "مدیریت Django" - -msgid "Site administration" -msgstr "مدیریت وب‌گاه" - -msgid "Log in" -msgstr "ورود" - -#, python-format -msgid "%(app)s administration" -msgstr "مدیریت ‎%(app)s‎" - -msgid "Page not found" -msgstr "صفحه یافت نشد" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "شرمنده، صفحه مورد تقاضا یافت نشد." - -msgid "Home" -msgstr "شروع" - -msgid "Server error" -msgstr "خطای سرور" - -msgid "Server error (500)" -msgstr "خطای سرور (500)" - -msgid "Server Error (500)" -msgstr "خطای سرور (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"مشکلی پیش آمده. این مشکل از طریق ایمیل به مدیران وب‌گاه اطلاع داده شد و به " -"زودی اصلاح می‌گردد. از صبر شما متشکریم." - -msgid "Run the selected action" -msgstr "اجرای حرکت انتخاب شده" - -msgid "Go" -msgstr "برو" - -msgid "Click here to select the objects across all pages" -msgstr "برای انتخاب موجودیت‌ها در تمام صفحات اینجا را کلیک کنید" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "انتخاب تمامی %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "لغو انتخاب‌ها" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "مدلها در برنامه %(name)s " - -msgid "Add" -msgstr "اضافه کردن" - -msgid "View" -msgstr "مشاهده" - -msgid "You don’t have permission to view or edit anything." -msgstr "شما اجازهٔ مشاهده یا ویرایش چیزی را ندارید." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"ابتدا یک نام کاربری و گذرواژه وارد کنید. سپس می توانید مشخصات دیگر کاربر را " -"ویرایش کنید." - -msgid "Enter a username and password." -msgstr "یک نام کاربری و رمز عبور را وارد کنید." - -msgid "Change password" -msgstr "تغییر گذرواژه" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "برای کابر %(username)s یک گذرنامهٔ جدید وارد کنید." - -msgid "Skip to main content" -msgstr "انتقال به محتوای اصلی" - -msgid "Welcome," -msgstr "خوش آمدید،" - -msgid "View site" -msgstr "نمایش وبگاه" - -msgid "Documentation" -msgstr "مستندات" - -msgid "Log out" -msgstr "خروج" - -#, python-format -msgid "Add %(name)s" -msgstr "اضافه‌کردن %(name)s" - -msgid "History" -msgstr "تاریخچه" - -msgid "View on site" -msgstr "مشاهده در وب‌گاه" - -msgid "Filter" -msgstr "فیلتر" - -msgid "Hide counts" -msgstr "" - -msgid "Show counts" -msgstr "نمایش تعداد" - -msgid "Clear all filters" -msgstr "پاک کردن همه فیلترها" - -msgid "Remove from sorting" -msgstr "حذف از مرتب سازی" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "اولویت مرتب‌سازی: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "تعویض مرتب سازی" - -msgid "Toggle theme (current theme: auto)" -msgstr "تغییر رنگ پوسته (حالت کنونی: خودکار)" - -msgid "Toggle theme (current theme: light)" -msgstr "تغییر رنگ پوسته (حالت کنونی: روشن)" - -msgid "Toggle theme (current theme: dark)" -msgstr "تغییر رنگ پوسته (حالت کنونی: تیره)" - -msgid "Delete" -msgstr "حذف" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"حذف %(object_name)s·'%(escaped_object)s' می تواند باعث حذف اشیاء مرتبط شود. " -"اما حساب شما دسترسی لازم برای حذف اشیای از انواع زیر را ندارد:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"حذف %(object_name)s '%(escaped_object)s' نیاز به حذف موجودیت‌های مرتبط محافظت " -"شده ذیل دارد:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"آیا مطمئنید که می‌خواهید %(object_name)s·\"%(escaped_object)s\" را حذف کنید؟ " -"کلیهٔ اشیای مرتبط زیر حذف خواهند شد:" - -msgid "Objects" -msgstr "اشیاء" - -msgid "Yes, I’m sure" -msgstr "بله، مطمئن هستم." - -msgid "No, take me back" -msgstr "نه، من را برگردان" - -msgid "Delete multiple objects" -msgstr "حذف اشیاء متعدد" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"حذف %(objects_name)s انتخاب شده منجر به حذف موجودیت‌های مرتبط خواهد شد، ولی " -"شناسه شما اجازه حذف اینگونه از موجودیت‌های ذیل را ندارد:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"حذف %(objects_name)s انتخاب شده نیاز به حذف موجودیت‌های مرتبط محافظت شده ذیل " -"دارد:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"آیا در خصوص حذف %(objects_name)s انتخاب شده اطمینان دارید؟ تمام موجودیت‌های " -"ذیل به همراه موارد مرتبط با آنها حذف خواهند شد:" - -msgid "Delete?" -msgstr "حذف؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr "براساس %(filter_title)s " - -msgid "Summary" -msgstr "خلاصه" - -msgid "Recent actions" -msgstr "فعالیتهای اخیر" - -msgid "My actions" -msgstr "فعالیتهای من" - -msgid "None available" -msgstr "چیزی در دسترس نیست" - -msgid "Added:" -msgstr "اضافه شده:" - -msgid "Changed:" -msgstr "ویرایش شده:" - -msgid "Deleted:" -msgstr "حذف شده:" - -msgid "Unknown content" -msgstr "محتوا ناشناخته" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"در نصب بانک اطلاعاتی شما مشکلی وجود دارد. مطمئن شوید که جداول مربوطه به " -"درستی ایجاد شده‌اند و اطمینان حاصل کنید که بانک اطلاعاتی توسط کاربر مربوطه " -"قابل خواندن می باشد." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"شما به عنوان %(username)sوارد شده اید. ولی اجازه مشاهده صفحه فوق را نداریدو " -"آیا مایلید با کاربر دیگری وارد شوید؟" - -msgid "Forgotten your password or username?" -msgstr "گذرواژه یا نام کاربری خود را فراموش کرده‌اید؟" - -msgid "Toggle navigation" -msgstr "تعویض جهت یابی" - -msgid "Sidebar" -msgstr "ستون کناری" - -msgid "Start typing to filter…" -msgstr "آغار به کار نوشتن برای فیلترکردن ..." - -msgid "Filter navigation items" -msgstr "فیلتر کردن آیتم های مسیریابی" - -msgid "Date/time" -msgstr "تاریخ/ساعت" - -msgid "User" -msgstr "کاربر" - -msgid "Action" -msgstr "عمل" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"این شیء هنوز تاریخچه تغییرات ندارد. ممکن است توسط این وب‌گاه مدیر ساخته نشده " -"باشد." - -msgid "Show all" -msgstr "نمایش همه" - -msgid "Save" -msgstr "ذخیره" - -msgid "Popup closing…" -msgstr "در حال بستن پنجره..." - -msgid "Search" -msgstr "جستجو" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s نتیجه" -msgstr[1] "%(counter)s نتیجه" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "در مجموع %(full_result_count)s تا" - -msgid "Save as new" -msgstr "ذخیره به عنوان جدید" - -msgid "Save and add another" -msgstr "ذخیره و ایجاد یکی دیگر" - -msgid "Save and continue editing" -msgstr "ذخیره و ادامهٔ ویرایش" - -msgid "Save and view" -msgstr "ذخیره و نمایش" - -msgid "Close" -msgstr "بستن" - -#, python-format -msgid "Change selected %(model)s" -msgstr "تغییر دادن %(model)s انتخاب شده" - -#, python-format -msgid "Add another %(model)s" -msgstr "افزدون %(model)s دیگر" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "حذف کردن %(model)s انتخاب شده" - -#, python-format -msgid "View selected %(model)s" -msgstr "نمایش %(model)sهای انتخاب شده" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"از شما ممنون هستیم که زمان با ارزش خود را برای این تارنما امروز صرف کرده اید" - -msgid "Log in again" -msgstr "ورود دوباره" - -msgid "Password change" -msgstr "تغییر گذرواژه" - -msgid "Your password was changed." -msgstr "گذرواژهٔ شما تغییر یافت." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"برای امنیت بیشتر٬ لطفا گذرواژه قدیمی خود را وارد کنید٬ سپس گذرواژه جدیدتان " -"را دوبار وارد کنید تا ما بتوانیم چک کنیم که به درستی تایپ کرده‌اید. " - -msgid "Change my password" -msgstr "تغییر گذرواژهٔ من" - -msgid "Password reset" -msgstr "ایجاد گذرواژهٔ جدید" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "گذرواژهٔ جدیدتان تنظیم شد. اکنون می‌توانید وارد وب‌گاه شوید." - -msgid "Password reset confirmation" -msgstr "تأیید گذرواژهٔ جدید" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"گذرواژهٔ جدیدتان را دوبار وارد کنید تا ما بتوانیم چک کنیم که به درستی تایپ " -"کرده‌اید." - -msgid "New password:" -msgstr "گذرواژهٔ جدید:" - -msgid "Confirm password:" -msgstr "تکرار گذرواژه:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"پیوند ایجاد گذرواژهٔ جدید نامعتبر بود، احتمالاً به این علت که قبلاً از آن " -"استفاده شده است. لطفاً برای یک گذرواژهٔ جدید درخواست دهید." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"دستورالعمل تنظیم گذرواژه را برایتان ایمیل کردیم. اگر با ایمیلی که وارد کردید " -"اکانتی وجود داشته باشد باید به زودی این دستورالعمل‌ها را دریافت کنید." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"اگر ایمیلی دریافت نمی‌کنید، لطفاً بررسی کنید که آدرسی که وارد کرده‌اید همان است " -"که با آن ثبت نام کرده‌اید، و پوشهٔ اسپم خود را نیز چک کنید." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"شما این ایمیل را بخاطر تقاضای تغییر رمز حساب در %(site_name)s. دریافت کرده " -"اید." - -msgid "Please go to the following page and choose a new password:" -msgstr "لطفاً به صفحهٔ زیر بروید و یک گذرواژهٔ جدید انتخاب کنید:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "نام کاربری‌تان، چنانچه احیاناً یادتان رفته است:" - -msgid "Thanks for using our site!" -msgstr "ممنون از استفادهٔ شما از وب‌گاه ما" - -#, python-format -msgid "The %(site_name)s team" -msgstr "گروه %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"گذرواژه خود را فراموش کرده اید؟ آدرس ایمیل خود را وارد کنید و ما مراحل تعیین " -"کلمه عبور جدید را برای شما ایمیل می‌کنیم." - -msgid "Email address:" -msgstr "آدرس ایمیل:" - -msgid "Reset my password" -msgstr "ایجاد گذرواژهٔ جدید" - -msgid "Select all objects on this page for an action" -msgstr "" - -msgid "All dates" -msgstr "همهٔ تاریخ‌ها" - -#, python-format -msgid "Select %s" -msgstr "%s انتخاب کنید" - -#, python-format -msgid "Select %s to change" -msgstr "%s را برای تغییر انتخاب کنید" - -#, python-format -msgid "Select %s to view" -msgstr "%s را برای مشاهده انتخاب کنید" - -msgid "Date:" -msgstr "تاریخ:" - -msgid "Time:" -msgstr "زمان:" - -msgid "Lookup" -msgstr "جستجو" - -msgid "Currently:" -msgstr "در حال حاضر:" - -msgid "Change:" -msgstr "تغییر یافته:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 2add5c7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po deleted file mode 100644 index f082b60..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,271 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Nikneshan , 2011-2012 -# Alireza Savand , 2012 -# Ali Vakilzade , 2015 -# Jannis Leidel , 2011 -# Pouya Abbassi, 2016 -# rahim agh , 2020-2021 -# Reza Mohammadi , 2014 -# Sina Cheraghi , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-03 13:56+0000\n" -"Last-Translator: rahim agh \n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%sی موجود" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"این لیست%s های در دسترس است. شما ممکن است برخی از آنها را در محل زیرانتخاب " -"نمایید و سپس روی \"انتخاب\" بین دو جعبه کلیک کنید." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "برای غربال فهرست %sی موجود درون این جعبه تایپ کنید." - -msgid "Filter" -msgstr "غربال" - -msgid "Choose all" -msgstr "انتخاب همه" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "برای انتخاب یکجای همهٔ %s کلیک کنید." - -msgid "Choose" -msgstr "انتخاب" - -msgid "Remove" -msgstr "حذف" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s انتخاب شده" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"این فهرست %s های انتخاب شده است. شما ممکن است برخی از انتخاب آنها را در محل " -"زیر وارد نمایید و سپس روی \"حذف\" جهت دار بین دو جعبه حذف شده است." - -msgid "Remove all" -msgstr "حذف همه" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "برای حذف یکجای همهٔ %sی انتخاب شده کلیک کنید." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] " %(sel)s از %(cnt)s انتخاب شده‌اند" -msgstr[1] " %(sel)s از %(cnt)s انتخاب شده‌اند" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"شما تغییراتی در بعضی فیلدهای قابل تغییر انجام داده اید. اگر کاری انجام " -"دهید، تغییرات از دست خواهند رفت" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"شما یک اقدام را انتخاب کرده‌اید، ولی تغییراتی که در فیلدهای شخصی وارد کرده‌اید " -"هنوز ذخیره نشده‌اند. لطفاً کلید OK را برای ذخیره کردن تغییرات بزنید. لازم است " -"که اقدام را دوباره اجرا کنید." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"شما یک اقدام را انتخاب کرده‌اید، ولی تغییراتی در فیلدهای شخصی وارد نکرده‌اید. " -"احتمالاً به جای کلید Save به دنبال کلید Go می‌گردید." - -msgid "Now" -msgstr "اکنون" - -msgid "Midnight" -msgstr "نیمه‌شب" - -msgid "6 a.m." -msgstr "۶ صبح" - -msgid "Noon" -msgstr "ظهر" - -msgid "6 p.m." -msgstr "۶ بعدازظهر" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "توجه: شما %s ساعت از زمان سرور جلو هستید." -msgstr[1] "توجه: شما %s ساعت از زمان سرور جلو هستید." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "توجه: شما %s ساعت از زمان سرور عقب هستید." -msgstr[1] "توجه: شما %s ساعت از زمان سرور عقب هستید." - -msgid "Choose a Time" -msgstr "یک زمان انتخاب کنید" - -msgid "Choose a time" -msgstr "یک زمان انتخاب کنید" - -msgid "Cancel" -msgstr "انصراف" - -msgid "Today" -msgstr "امروز" - -msgid "Choose a Date" -msgstr "یک تاریخ انتخاب کنید" - -msgid "Yesterday" -msgstr "دیروز" - -msgid "Tomorrow" -msgstr "فردا" - -msgid "January" -msgstr "ژانویه" - -msgid "February" -msgstr "فوریه" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "آوریل" - -msgid "May" -msgstr "می" - -msgid "June" -msgstr "ژوئن" - -msgid "July" -msgstr "جولای" - -msgid "August" -msgstr "آگوست" - -msgid "September" -msgstr "سپتامبر" - -msgid "October" -msgstr "اکتبر" - -msgid "November" -msgstr "نوامبر" - -msgid "December" -msgstr "دسامبر" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "ژانویه" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "فوریه" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "مارس" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "آوریل" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "می" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "ژوئن" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "ژوئیه" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "اوت" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "سپتامبر" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "اکتبر" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "نوامبر" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "دسامبر" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "ی" - -msgctxt "one letter Monday" -msgid "M" -msgstr "د" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "س" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "چ" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "پ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "ج" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "ش" - -msgid "Show" -msgstr "نمایش" - -msgid "Hide" -msgstr "پنهان کردن" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index 78ba292..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index f9ece3e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,786 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2017,2020-2022,2025 -# Antti Kaihola , 2011 -# Jannis Leidel , 2011 -# Jiri Grönroos , 2021,2023 -# Klaus Dahlén, 2012 -# Nikolay Korotkiy , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Aarni Koskela, 2015,2017,2020-2022,2025\n" -"Language-Team: Finnish (http://app.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Poista valitut \"%(verbose_name_plural)s\"-kohteet" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d \"%(items)s\"-kohdetta poistettu." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ei voida poistaa: %(name)s" - -msgid "Delete multiple objects" -msgstr "Poista useita kohteita" - -msgid "Administration" -msgstr "Hallinta" - -msgid "All" -msgstr "Kaikki" - -msgid "Yes" -msgstr "Kyllä" - -msgid "No" -msgstr "Ei" - -msgid "Unknown" -msgstr "Tuntematon" - -msgid "Any date" -msgstr "Mikä tahansa päivä" - -msgid "Today" -msgstr "Tänään" - -msgid "Past 7 days" -msgstr "Viimeiset 7 päivää" - -msgid "This month" -msgstr "Tässä kuussa" - -msgid "This year" -msgstr "Tänä vuonna" - -msgid "No date" -msgstr "Ei päivämäärää" - -msgid "Has date" -msgstr "On päivämäärä" - -msgid "Empty" -msgstr "Tyhjä" - -msgid "Not empty" -msgstr "Ei tyhjä" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Ole hyvä ja syötä henkilökuntatilin %(username)s ja salasana. Huomaa että " -"kummassakin kentässä isoilla ja pienillä kirjaimilla saattaa olla merkitystä." - -msgid "Action:" -msgstr "Toiminto:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Lisää toinen %(verbose_name)s" - -msgid "Remove" -msgstr "Poista" - -msgid "Addition" -msgstr "Lisäys" - -msgid "Change" -msgstr "Muokkaa" - -msgid "Deletion" -msgstr "Poisto" - -msgid "action time" -msgstr "tapahtumahetki" - -msgid "user" -msgstr "käyttäjä" - -msgid "content type" -msgstr "sisältötyyppi" - -msgid "object id" -msgstr "kohteen tunniste" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "kohteen tiedot" - -msgid "action flag" -msgstr "tapahtumatyyppi" - -msgid "change message" -msgstr "selitys" - -msgid "log entry" -msgstr "lokimerkintä" - -msgid "log entries" -msgstr "lokimerkinnät" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Lisätty \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Muokattu \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Poistettu \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Lokimerkintätietue" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Lisätty {name} \"{object}\"." - -msgid "Added." -msgstr "Lisätty." - -msgid "and" -msgstr "ja" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Muutettu {fields} {name}-kohteelle \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Muutettu {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Poistettu {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Ei muutoksia kenttiin." - -msgid "None" -msgstr "Ei arvoa" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -" Pidä \"Ctrl\" (tai Macin \"Command\") pohjassa valitaksesi useita " -"vaihtoehtoja." - -msgid "Select this object for an action - {}" -msgstr "Valitse tämä kohde toiminnolle - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" on lisätty." - -msgid "You may edit it again below." -msgstr "Voit muokata sitä jälleen alla." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} \"{obj}\" on lisätty. Voit lisätä toisen {name}-kohteen alla." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" on muokattu. Voit muokata sitä edelleen alla." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" on muokattu. Voit lisätä toisen {name}-kohteen alla." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" on muokattu." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Kohteiden täytyy olla valittuna, jotta niihin voi kohdistaa toimintoja. " -"Kohteita ei ole muutettu." - -msgid "No action selected." -msgstr "Ei toimintoa valittuna." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" on poistettu." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s tunnisteella \"%(key)s\" puuttuu. Se on voitu poistaa." - -#, python-format -msgid "Add %s" -msgstr "Lisää %s" - -#, python-format -msgid "Change %s" -msgstr "Muokkaa %s" - -#, python-format -msgid "View %s" -msgstr "Näytä %s" - -msgid "Database error" -msgstr "Tietokantavirhe" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s on muokattu." -msgstr[1] "%(count)s \"%(name)s\"-kohdetta on muokattu." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s valittu" -msgstr[1] "Kaikki %(total_count)s valittu" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 valittuna %(cnt)s mahdollisesta" - -msgid "Delete" -msgstr "Poista" - -#, python-format -msgid "Change history: %s" -msgstr "Muokkaushistoria: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s poistaminen vaatisi myös seuraavien suojattujen " -"liittyvien kohteiden poiston: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django-sivuston ylläpito" - -msgid "Django administration" -msgstr "Djangon ylläpito" - -msgid "Site administration" -msgstr "Sivuston ylläpito" - -msgid "Log in" -msgstr "Kirjaudu sisään" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-ylläpito" - -msgid "Page not found" -msgstr "Sivua ei löydy" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Pahoittelemme, pyydettyä sivua ei löytynyt." - -msgid "Home" -msgstr "Etusivu" - -msgid "Server error" -msgstr "Palvelinvirhe" - -msgid "Server error (500)" -msgstr "Palvelinvirhe (500)" - -msgid "Server Error (500)" -msgstr "Palvelinvirhe (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Sattui virhe. Virheestä on huomautettu sivuston ylläpitäjille sähköpostitse " -"ja se korjautunee piakkoin. Kiitos kärsivällisyydestä." - -msgid "Run the selected action" -msgstr "Suorita valittu toiminto" - -msgid "Go" -msgstr "Suorita" - -msgid "Click here to select the objects across all pages" -msgstr "Klikkaa tästä valitaksesi kohteet kaikilta sivuilta" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Valitse kaikki %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Tyhjennä valinta" - -msgid "Breadcrumbs" -msgstr "Murupolut" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Sovelluksen %(name)s mallit" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Lisää" - -msgid "View" -msgstr "Näytä" - -msgid "You don’t have permission to view or edit anything." -msgstr "Sinulla ei ole oikeutta näyttää tai muokata mitään." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Vaihda salasana" - -msgid "Set password" -msgstr "Aseta salasana" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Korjaa alla oleva virhe." -msgstr[1] "Korjaa alla olevat virheet." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Syötä käyttäjän %(username)s uusi salasana." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Tämä toiminto kytkee päälle salasanapohjaisen kirjautumisen " -"tälle käyttäjälle." - -msgid "Disable password-based authentication" -msgstr "Ota salasanapohjainen kirjautuminen pois päältä" - -msgid "Enable password-based authentication" -msgstr "Kytke salasanapohjainen kirjautuminen käyttöön" - -msgid "Skip to main content" -msgstr "Siirry pääsisältöön" - -msgid "Welcome," -msgstr "Tervetuloa," - -msgid "View site" -msgstr "Näytä sivusto" - -msgid "Documentation" -msgstr "Dokumentaatio" - -msgid "Log out" -msgstr "Kirjaudu ulos" - -#, python-format -msgid "Add %(name)s" -msgstr "Lisää %(name)s" - -msgid "History" -msgstr "Muokkaushistoria" - -msgid "View on site" -msgstr "Näytä lopputulos" - -msgid "Filter" -msgstr "Suodatin" - -msgid "Hide counts" -msgstr "Piilota lukumäärät" - -msgid "Show counts" -msgstr "Näytä lukumäärät" - -msgid "Clear all filters" -msgstr "Tyhjennä kaikki suodattimet" - -msgid "Remove from sorting" -msgstr "Poista järjestämisestä" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Järjestysprioriteetti: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Kytke järjestäminen" - -msgid "Toggle theme (current theme: auto)" -msgstr "Vaihda teemaa (nyt: automaattinen)" - -msgid "Toggle theme (current theme: light)" -msgstr "Vaihda teemaa (nyt: vaalea)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Vaihda teemaa (nyt: tumma)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Kohteen '%(escaped_object)s' (%(object_name)s) poisto poistaisi myös siihen " -"liittyviä kohteita, mutta sinulla ei ole oikeutta näiden kohteiden " -"poistamiseen:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s': poistettaessa joudutaan poistamaan " -"myös seuraavat suojatut siihen liittyvät kohteet:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Haluatko varmasti poistaa kohteen \"%(escaped_object)s\" (%(object_name)s)? " -"Myös seuraavat kohteet poistettaisiin samalla:" - -msgid "Objects" -msgstr "Kohteet" - -msgid "Yes, I’m sure" -msgstr "Kyllä, olen varma" - -msgid "No, take me back" -msgstr "Ei, mennään takaisin" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Jos valitut %(objects_name)s poistettaisiin, jouduttaisiin poistamaan niihin " -"liittyviä kohteita. Sinulla ei kuitenkaan ole oikeutta poistaa seuraavia " -"kohdetyyppejä:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Jos valitut %(objects_name)s poistetaan, pitää poistaa myös seuraavat " -"suojatut niihin liittyvät kohteet:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Haluatko varmasti poistaa valitut %(objects_name)s? Samalla poistetaan " -"kaikki alla mainitut ja niihin liittyvät kohteet:" - -msgid "Delete?" -msgstr "Poista?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "Yhteenveto" - -msgid "Recent actions" -msgstr "Viimeisimmät tapahtumat" - -msgid "My actions" -msgstr "Omat tapahtumat" - -msgid "None available" -msgstr "Ei yhtään" - -msgid "Added:" -msgstr "Lisätty:" - -msgid "Changed:" -msgstr "Muutettu:" - -msgid "Deleted:" -msgstr "Poistettu:" - -msgid "Unknown content" -msgstr "Tuntematon sisältö" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Tietokanta-asennuksessa on jotain vialla. Varmista, että sopivat taulut on " -"luotu ja että oikea käyttäjä voi lukea tietokantaa." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Olet kirjautunut käyttäjänä %(username)s, mutta sinulla ei ole pääsyä tälle " -"sivulle. Haluaisitko kirjautua eri tilille?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Kytke navigaatio" - -msgid "Sidebar" -msgstr "Sivupalkki" - -msgid "Start typing to filter…" -msgstr "Kirjoita suodattaaksesi..." - -msgid "Filter navigation items" -msgstr "Suodata navigaatiovaihtoehtoja" - -msgid "Date/time" -msgstr "Pvm/klo" - -msgid "User" -msgstr "Käyttäjä" - -msgid "Action" -msgstr "Tapahtuma" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "merkintä" -msgstr[1] "merkintää" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Tällä kohteella ei ole muutoshistoriaa. Sitä ei ole ilmeisesti lisätty tämän " -"ylläpitosivun avulla." - -msgid "Show all" -msgstr "Näytä kaikki" - -msgid "Save" -msgstr "Tallenna ja poistu" - -msgid "Popup closing…" -msgstr "Ponnahdusikkuna sulkeutuu..." - -msgid "Search" -msgstr "Haku" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s osuma" -msgstr[1] "%(counter)s osumaa" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "yhteensä %(full_result_count)s" - -msgid "Save as new" -msgstr "Tallenna uutena" - -msgid "Save and add another" -msgstr "Tallenna ja lisää toinen" - -msgid "Save and continue editing" -msgstr "Tallenna välillä ja jatka muokkaamista" - -msgid "Save and view" -msgstr "Tallenna ja näytä" - -msgid "Close" -msgstr "Sulje" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Muuta valittuja %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Lisää toinen %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Poista valitut %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Näytä valitut %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Kiitos sivuillamme viettämästäsi ajasta." - -msgid "Log in again" -msgstr "Kirjaudu uudelleen sisään" - -msgid "Password change" -msgstr "Salasanan vaihtaminen" - -msgid "Your password was changed." -msgstr "Salasanasi on vaihdettu." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Syötä vanha salasanasi varmistukseksi, ja syötä sitten uusi salasanasi kaksi " -"kertaa, jotta se tulee varmasti oikein." - -msgid "Change my password" -msgstr "Vaihda salasana" - -msgid "Password reset" -msgstr "Salasanan nollaus" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Salasanasi on asetettu. Nyt voit kirjautua sisään." - -msgid "Password reset confirmation" -msgstr "Salasanan nollauksen vahvistus" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Syötä uusi salasanasi kaksi kertaa, jotta voimme varmistaa että syötit sen " -"oikein." - -msgid "New password:" -msgstr "Uusi salasana:" - -msgid "Confirm password:" -msgstr "Varmista uusi salasana:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Salasanan nollauslinkki oli virheellinen, mahdollisesti siksi että se on jo " -"käytetty. Ole hyvä ja pyydä uusi salasanan nollaus." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Sinulle on lähetetty sähköpostitse ohjeet salasanasi asettamiseen, mikäli " -"antamallasi sähköpostiosoitteella on olemassa tili." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jos viestiä ei näy, ole hyvä ja varmista syöttäneesi oikea sähköpostiosoite " -"sekä tarkista sähköpostisi roskapostikansio." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Tämä viesti on lähetetty sinulle, koska olet pyytänyt %(site_name)s -" -"sivustolla salasanan palautusta." - -msgid "Please go to the following page and choose a new password:" -msgstr "Määrittele uusi salasanasi oheisella sivulla:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Kiitos vierailustasi sivuillamme!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Sivuston %(site_name)s ylläpitäjät" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Unohditko salasanasi? Syötä sähköpostiosoitteesi alle ja lähetämme sinulle " -"ohjeet uuden salasanan asettamiseksi." - -msgid "Email address:" -msgstr "Sähköpostiosoite:" - -msgid "Reset my password" -msgstr "Nollaa salasanani" - -msgid "Select all objects on this page for an action" -msgstr "Valitse kaikki tämän sivun kohteet toiminnolle" - -msgid "All dates" -msgstr "Kaikki päivät" - -#, python-format -msgid "Select %s" -msgstr "Valitse %s" - -#, python-format -msgid "Select %s to change" -msgstr "Valitse muokattava %s" - -#, python-format -msgid "Select %s to view" -msgstr "Valitse näytettävä %s" - -msgid "Date:" -msgstr "Pvm:" - -msgid "Time:" -msgstr "Klo:" - -msgid "Lookup" -msgstr "Etsi" - -msgid "Currently:" -msgstr "Tällä hetkellä:" - -msgid "Change:" -msgstr "Muokkaa:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo deleted file mode 100644 index e1c46d4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po deleted file mode 100644 index fb71d4d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,314 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2017,2020-2022,2025 -# Antti Kaihola , 2011 -# Jannis Leidel , 2011 -# Jiri Grönroos , 2021,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Aarni Koskela, 2015,2017,2020-2022,2025\n" -"Language-Team: Finnish (http://app.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Mahdolliset %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Kirjoita tähän listaan suodattaaksesi %s-listaa." - -msgid "Filter" -msgstr "Suodatin" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valitut %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Kirjoita tähän listaan suodattaaksesi valittujen %s-kohteiden listaa." - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s valittu kohde ei näkyvissä" -msgstr[1] "%s valittua kohdetta ei näkyvissä" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s valittuna %(cnt)s mahdollisesta" -msgstr[1] "%(sel)s valittuna %(cnt)s mahdollisesta" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Sinulla on tallentamattomia muutoksia yksittäisissä muokattavissa kentissä. " -"Jos suoritat toiminnon, tallentamattomat muutoksesi katoavat." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Olet valinnut toiminnon, mutta et ole vielä tallentanut muutoksiasi " -"yksittäisiin kenttiin. Paina OK tallentaaksesi. Sinun pitää suorittaa " -"toiminto uudelleen." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Olet valinnut toiminnon etkä ole tehnyt yhtään muutosta yksittäisissä " -"kentissä. Etsit todennäköisesti Suorita-painiketta Tallenna-painikkeen " -"sijaan." - -msgid "Now" -msgstr "Nyt" - -msgid "Midnight" -msgstr "24" - -msgid "6 a.m." -msgstr "06" - -msgid "Noon" -msgstr "12" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Huom: Olet %s tunnin palvelinaikaa edellä." -msgstr[1] "Huom: Olet %s tuntia palvelinaikaa edellä." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Huom: Olet %s tunnin palvelinaikaa jäljessä." -msgstr[1] "Huom: Olet %s tuntia palvelinaikaa jäljessä." - -msgid "Choose a Time" -msgstr "Valitse kellonaika" - -msgid "Choose a time" -msgstr "Valitse kellonaika" - -msgid "Cancel" -msgstr "Peruuta" - -msgid "Today" -msgstr "Tänään" - -msgid "Choose a Date" -msgstr "Valitse päivämäärä" - -msgid "Yesterday" -msgstr "Eilen" - -msgid "Tomorrow" -msgstr "Huomenna" - -msgid "January" -msgstr "tammikuu" - -msgid "February" -msgstr "helmikuu" - -msgid "March" -msgstr "maaliskuu" - -msgid "April" -msgstr "huhtikuu" - -msgid "May" -msgstr "toukokuu" - -msgid "June" -msgstr "kesäkuu" - -msgid "July" -msgstr "heinäkuu" - -msgid "August" -msgstr "elokuu" - -msgid "September" -msgstr "syyskuu" - -msgid "October" -msgstr "lokakuu" - -msgid "November" -msgstr "marraskuu" - -msgid "December" -msgstr "joulukuu" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Tammi" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Helmi" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Maalis" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Huhti" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Touko" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Kesä" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Heinä" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Elo" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Syys" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Loka" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Marras" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Joulu" - -msgid "Sunday" -msgstr "Sunnuntai" - -msgid "Monday" -msgstr "Maanantai" - -msgid "Tuesday" -msgstr "Tiistai" - -msgid "Wednesday" -msgstr "Keskiviikko" - -msgid "Thursday" -msgstr "Torstai" - -msgid "Friday" -msgstr "Perjantai" - -msgid "Saturday" -msgstr "Lauantai" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Su" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Ma" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Ti" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Ke" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "To" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pe" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "La" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Su" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Ma" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Ti" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ke" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "To" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Pe" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "La" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 4e3757d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index ad216ba..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,812 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bruno Brouard , 2021 -# Claude Paroz , 2013-2025 -# Claude Paroz , 2011,2013 -# Jannis Leidel , 2011 -# Sébastien Corbin , 2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Sébastien Corbin , 2025\n" -"Language-Team: French (http://app.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Supprimer les %(verbose_name_plural)s sélectionnés" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "La suppression de %(count)d %(items)s a réussi." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Impossible de supprimer %(name)s" - -msgid "Delete multiple objects" -msgstr "Supprimer plusieurs objets" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "Tout" - -msgid "Yes" -msgstr "Oui" - -msgid "No" -msgstr "Non" - -msgid "Unknown" -msgstr "Inconnu" - -msgid "Any date" -msgstr "Toutes les dates" - -msgid "Today" -msgstr "Aujourd’hui" - -msgid "Past 7 days" -msgstr "Les 7 derniers jours" - -msgid "This month" -msgstr "Ce mois-ci" - -msgid "This year" -msgstr "Cette année" - -msgid "No date" -msgstr "Aucune date" - -msgid "Has date" -msgstr "Possède une date" - -msgid "Empty" -msgstr "Vide" - -msgid "Not empty" -msgstr "Non vide" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Veuillez compléter correctement les champs « %(username)s » et « mot de " -"passe » d'un compte autorisé. Sachez que les deux champs peuvent être " -"sensibles à la casse." - -msgid "Action:" -msgstr "Action :" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Ajouter un objet %(verbose_name)s supplémentaire" - -msgid "Remove" -msgstr "Enlever" - -msgid "Addition" -msgstr "Ajout" - -msgid "Change" -msgstr "Modification" - -msgid "Deletion" -msgstr "Suppression" - -msgid "action time" -msgstr "date de l’action" - -msgid "user" -msgstr "utilisateur" - -msgid "content type" -msgstr "type de contenu" - -msgid "object id" -msgstr "id de l’objet" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "représentation de l’objet" - -msgid "action flag" -msgstr "indicateur de l’action" - -msgid "change message" -msgstr "message de modification" - -msgid "log entry" -msgstr "entrée d’historique" - -msgid "log entries" -msgstr "entrées d’historique" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Ajout de « %(object)s »." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Modification de « %(object)s » — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Suppression de « %(object)s »." - -msgid "LogEntry Object" -msgstr "Objet de journal" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Ajout de {name} « {object} »." - -msgid "Added." -msgstr "Ajout." - -msgid "and" -msgstr "et" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Modification de {fields} pour l'objet {name} « {object} »." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Modification de {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Suppression de {name} « {object} »." - -msgid "No fields changed." -msgstr "Aucun champ modifié." - -msgid "None" -msgstr "Aucun(e)" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour " -"en sélectionner plusieurs." - -msgid "Select this object for an action - {}" -msgstr "Choisir cet objet pour une action - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "L'objet {name} « {obj} » a été ajouté avec succès." - -msgid "You may edit it again below." -msgstr "Vous pouvez l’éditer à nouveau ci-dessous." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"L’objet {name} « {obj} » a été ajouté avec succès. Vous pouvez ajouter un " -"autre objet « {name} » ci-dessous." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"L’objet {name} « {obj} » a été modifié avec succès. Vous pouvez l’éditer à " -"nouveau ci-dessous." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"L’objet {name} « {obj} » a été modifié avec succès. Vous pouvez ajouter un " -"autre objet {name} ci-dessous." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "L’objet {name} « {obj} » a été modifié avec succès." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Des éléments doivent être sélectionnés afin d’appliquer les actions. Aucun " -"élément n’a été modifié." - -msgid "No action selected." -msgstr "Aucune action sélectionnée." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "L’objet %(name)s « %(obj)s » a été supprimé avec succès." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s avec l’identifiant « %(key)s » n’existe pas. Peut-être a-t-il été " -"supprimé ?" - -#, python-format -msgid "Add %s" -msgstr "Ajout de %s" - -#, python-format -msgid "Change %s" -msgstr "Modification de %s" - -#, python-format -msgid "View %s" -msgstr "Affichage de %s" - -msgid "Database error" -msgstr "Erreur de base de données" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s objet %(name)s a été modifié avec succès." -msgstr[1] "%(count)s objets %(name)s ont été modifiés avec succès." -msgstr[2] "%(count)s objets %(name)s ont été modifiés avec succès." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s sélectionné" -msgstr[1] "Tous les %(total_count)s sélectionnés" -msgstr[2] "Tous les %(total_count)s sélectionnés" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 sur %(cnt)s sélectionné" - -msgid "Delete" -msgstr "Supprimer" - -#, python-format -msgid "Change history: %s" -msgstr "Historique des changements : %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Supprimer l’objet %(class_name)s « %(instance)s » provoquerait la " -"suppression des objets liés et protégés suivants : %(related_objects)s" - -msgid "Django site admin" -msgstr "Site d’administration de Django" - -msgid "Django administration" -msgstr "Administration de Django" - -msgid "Site administration" -msgstr "Site d’administration" - -msgid "Log in" -msgstr "Connexion" - -#, python-format -msgid "%(app)s administration" -msgstr "Administration de %(app)s" - -msgid "Page not found" -msgstr "Page non trouvée" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Nous sommes désolés, mais la page demandée est introuvable." - -msgid "Home" -msgstr "Accueil" - -msgid "Server error" -msgstr "Erreur du serveur" - -msgid "Server error (500)" -msgstr "Erreur du serveur (500)" - -msgid "Server Error (500)" -msgstr "Erreur du serveur (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Une erreur est survenue. Elle a été transmise par courriel aux " -"administrateurs du site et sera corrigée dans les meilleurs délais. Merci " -"pour votre patience." - -msgid "Run the selected action" -msgstr "Exécuter l’action sélectionnée" - -msgid "Go" -msgstr "Envoyer" - -msgid "Click here to select the objects across all pages" -msgstr "Cliquez ici pour sélectionner tous les objets sur l’ensemble des pages" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Sélectionner tous les %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Effacer la sélection" - -msgid "Breadcrumbs" -msgstr "Fil d'Ariane" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modèles de l’application %(name)s" - -msgid "Model name" -msgstr "Nom du modèle" - -msgid "Add link" -msgstr "Lien pour l'ajout" - -msgid "Change or view list link" -msgstr "Lien pour modifier ou voir la liste" - -msgid "Add" -msgstr "Ajouter" - -msgid "View" -msgstr "Afficher" - -msgid "You don’t have permission to view or edit anything." -msgstr "Vous n’avez pas la permission de voir ou de modifier quoi que ce soit." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Après avoir créé un utilisateur, vous pourrez modifiez davantage de ses " -"options." - -msgid "Error:" -msgstr "Erreur :" - -msgid "Change password" -msgstr "Modifier le mot de passe" - -msgid "Set password" -msgstr "Définir un mot de passe" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Corrigez l’erreur ci-dessous." -msgstr[1] "Corrigez les erreurs ci-dessous." -msgstr[2] "Corrigez les erreurs ci-dessous." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Saisissez un nouveau mot de passe pour l’utilisateur %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Cette action va activer l'authentification par mot de passe " -"pour cet utilisateur." - -msgid "Disable password-based authentication" -msgstr "Désactiver l'authentification par mot de passe" - -msgid "Enable password-based authentication" -msgstr "Activer l'authentification par mot de passe" - -msgid "Skip to main content" -msgstr "Passer au contenu principal" - -msgid "Welcome," -msgstr "Bienvenue," - -msgid "View site" -msgstr "Voir le site" - -msgid "Documentation" -msgstr "Documentation" - -msgid "Log out" -msgstr "Déconnexion" - -#, python-format -msgid "Add %(name)s" -msgstr "Ajouter %(name)s" - -msgid "History" -msgstr "Historique" - -msgid "View on site" -msgstr "Voir sur le site" - -msgid "Filter" -msgstr "Filtre" - -msgid "Hide counts" -msgstr "Masquer les nombres" - -msgid "Show counts" -msgstr "Afficher les nombres" - -msgid "Clear all filters" -msgstr "Effacer tous les filtres" - -msgid "Remove from sorting" -msgstr "Enlever du tri" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Priorité de tri : %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Inverser le tri" - -msgid "Toggle theme (current theme: auto)" -msgstr "Changer de thème (actuellement : automatique)" - -msgid "Toggle theme (current theme: light)" -msgstr "Changer de thème (actuellement : clair)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Changer de thème (actuellement : sombre)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Supprimer l’objet %(object_name)s « %(escaped_object)s » provoquerait la " -"suppression des objets qui lui sont liés, mais votre compte ne possède pas " -"la permission de supprimer les types d’objets suivants :" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Supprimer l’objet %(object_name)s « %(escaped_object)s » provoquerait la " -"suppression des objets liés et protégés suivants :" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Voulez-vous vraiment supprimer l’objet %(object_name)s " -"« %(escaped_object)s » ? Les éléments suivants sont liés à celui-ci et " -"seront aussi supprimés :" - -msgid "Objects" -msgstr "Objets" - -msgid "Yes, I’m sure" -msgstr "Oui, je suis sûr" - -msgid "No, take me back" -msgstr "Non, revenir à la page précédente" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"La suppression des objets %(objects_name)s sélectionnés provoquerait la " -"suppression d’objets liés, mais votre compte n’est pas autorisé à supprimer " -"les types d’objet suivants :" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"La suppression des objets %(objects_name)s sélectionnés provoquerait la " -"suppression des objets liés et protégés suivants :" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Voulez-vous vraiment supprimer les objets %(objects_name)s sélectionnés ? " -"Tous les objets suivants et les éléments liés seront supprimés :" - -msgid "Delete?" -msgstr "Supprimer ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Par %(filter_title)s " - -msgid "Summary" -msgstr "Résumé" - -msgid "Recent actions" -msgstr "Actions récentes" - -msgid "My actions" -msgstr "Mes actions" - -msgid "None available" -msgstr "Aucun(e) disponible" - -msgid "Added:" -msgstr "Ajout :" - -msgid "Changed:" -msgstr "Modif. :" - -msgid "Deleted:" -msgstr "Suppr. :" - -msgid "Unknown content" -msgstr "Contenu inconnu" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"L’installation de votre base de données est incorrecte. Vérifiez que les " -"tables utiles ont été créées, et que la base est accessible par " -"l’utilisateur concerné." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Vous êtes authentifié sous le nom %(username)s, mais vous n’êtes pas " -"autorisé à accéder à cette page. Souhaitez-vous vous connecter avec un autre " -"compte utilisateur ?" - -msgid "Forgotten your login credentials?" -msgstr "Identifiants de connexion oubliés ?" - -msgid "Toggle navigation" -msgstr "Basculer la navigation" - -msgid "Sidebar" -msgstr "Barre latérale" - -msgid "Start typing to filter…" -msgstr "Écrivez ici pour filtrer…" - -msgid "Filter navigation items" -msgstr "Filtrer les éléments de navigation" - -msgid "Date/time" -msgstr "Date/heure" - -msgid "User" -msgstr "Utilisateur" - -msgid "Action" -msgstr "Action" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrée" -msgstr[1] "entrées" -msgstr[2] "entrées" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Cet objet n’a pas d’historique de modification. Il n’a probablement pas été " -"ajouté au moyen de ce site d’administration." - -msgid "Show all" -msgstr "Tout afficher" - -msgid "Save" -msgstr "Enregistrer" - -msgid "Popup closing…" -msgstr "Fenêtre en cours de fermeture…" - -msgid "Search" -msgstr "Rechercher" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s résultat" -msgstr[1] "%(counter)s résultats" -msgstr[2] "%(counter)s résultats" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s résultats" - -msgid "Save as new" -msgstr "Enregistrer en tant que nouveau" - -msgid "Save and add another" -msgstr "Enregistrer et ajouter un nouveau" - -msgid "Save and continue editing" -msgstr "Enregistrer et continuer les modifications" - -msgid "Save and view" -msgstr "Enregistrer et afficher" - -msgid "Close" -msgstr "Fermer" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Modifier l’objet %(model)s sélectionné" - -#, python-format -msgid "Add another %(model)s" -msgstr "Ajouter un autre objet %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Supprimer l’objet %(model)s sélectionné" - -#, python-format -msgid "View selected %(model)s" -msgstr "Afficher l'objet %(model)s sélectionné" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Merci pour le temps que vous avez accordé à ce site aujourd’hui." - -msgid "Log in again" -msgstr "Connectez-vous à nouveau" - -msgid "Password change" -msgstr "Modification du mot de passe" - -msgid "Your password was changed." -msgstr "Votre mot de passe a été modifié." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Pour des raisons de sécurité, saisissez votre ancien mot de passe puis votre " -"nouveau mot de passe à deux reprises afin de vérifier qu’il est correctement " -"saisi." - -msgid "Change my password" -msgstr "Modifier mon mot de passe" - -msgid "Password reset" -msgstr "Réinitialisation du mot de passe" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Votre mot de passe a été défini. Vous pouvez maintenant vous authentifier." - -msgid "Password reset confirmation" -msgstr "Confirmation de mise à jour du mot de passe" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Saisissez deux fois votre nouveau mot de passe afin de vérifier qu’il est " -"correctement saisi." - -msgid "New password:" -msgstr "Nouveau mot de passe :" - -msgid "Confirm password:" -msgstr "Confirmation du mot de passe :" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Le lien de mise à jour du mot de passe n’était pas valide, probablement en " -"raison de sa précédente utilisation. Veuillez renouveler votre demande de " -"mise à jour de mot de passe." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Nous vous avons envoyé par courriel les instructions pour changer de mot de " -"passe, pour autant qu’un compte existe avec l’adresse que vous avez " -"indiquée. Vous devriez recevoir rapidement ce message." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si vous ne recevez pas de message, vérifiez que vous avez saisi l’adresse " -"avec laquelle vous vous êtes enregistré et contrôlez votre dossier de " -"pourriels." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Vous recevez ce message en réponse à votre demande de réinitialisation du " -"mot de passe de votre compte sur %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Veuillez vous rendre sur cette page et choisir un nouveau mot de passe :" - -msgid "In case you’ve forgotten, you are:" -msgstr "Au cas où vous l'auriez oublié, vous êtes :" - -msgid "Thanks for using our site!" -msgstr "Merci d’utiliser notre site !" - -#, python-format -msgid "The %(site_name)s team" -msgstr "L’équipe %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Mot de passe perdu ? Saisissez votre adresse électronique ci-dessous et nous " -"vous enverrons les instructions pour en créer un nouveau." - -msgid "Email address:" -msgstr "Adresse électronique :" - -msgid "Reset my password" -msgstr "Réinitialiser mon mot de passe" - -msgid "Select all objects on this page for an action" -msgstr "Sélectionner tous les objets de cette page en vue d’une action" - -msgid "All dates" -msgstr "Toutes les dates" - -#, python-format -msgid "Select %s" -msgstr "Sélectionnez %s" - -#, python-format -msgid "Select %s to change" -msgstr "Sélectionnez l’objet %s à changer" - -#, python-format -msgid "Select %s to view" -msgstr "Sélectionnez l’objet %s à afficher" - -msgid "Date:" -msgstr "Date :" - -msgid "Time:" -msgstr "Heure :" - -msgid "Lookup" -msgstr "Recherche" - -msgid "Currently:" -msgstr "Actuellement :" - -msgid "Change:" -msgstr "Modifier :" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 218199d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po deleted file mode 100644 index e752039..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,322 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2014-2017,2020-2023,2025 -# Claude Paroz , 2011-2012 -# Jannis Leidel , 2011 -# Sébastien Corbin , 2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Sébastien Corbin , 2025\n" -"Language-Team: French (http://app.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponible(s)" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Choisissez %s en les sélectionnant puis cliquez sur le bouton flèche " -"« Choisir »." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Écrivez dans cette zone pour filtrer la liste des « %s » disponibles." - -msgid "Filter" -msgstr "Filtrer" - -#, javascript-format -msgid "Choose all %s" -msgstr "Choisir toutes les valeurs « %s »" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Choisir les valeurs « %s » sélectionnées" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Enlever les valeurs « %s » sélectionnées" - -#, javascript-format -msgid "Chosen %s" -msgstr "Choix des « %s »" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Enlevez les valeurs « %s » en les sélectionnant puis en cliquant sur le " -"bouton flèche « Enlever »." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"Écrivez dans cette zone pour filtrer la liste des « %s » sélectionné·e·s." - -msgid "(click to clear)" -msgstr "(cliquer pour effacer)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Enlever toutes les valeurs « %s »" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s option sélectionnée invisible" -msgstr[1] "%s options sélectionnées invisibles" -msgstr[2] "%s options sélectionnées invisibles" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s sur %(cnt)s sélectionné" -msgstr[1] "%(sel)s sur %(cnt)s sélectionnés" -msgstr[2] "%(sel)s sur %(cnt)s sélectionnés" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Vous avez des modifications non sauvegardées sur certains champs éditables. " -"Si vous lancez une action, ces modifications vont être perdues." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Vous avez sélectionné une action, mais vous n'avez pas encore enregistré " -"certains champs modifiés. Cliquez sur OK pour enregistrer. Vous devrez " -"réappliquer l'action." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Vous avez sélectionné une action, et vous n'avez fait aucune modification " -"sur des champs. Vous cherchez probablement le bouton Envoyer et non le " -"bouton Enregistrer." - -msgid "Now" -msgstr "Maintenant" - -msgid "Midnight" -msgstr "Minuit" - -msgid "6 a.m." -msgstr "6:00" - -msgid "Noon" -msgstr "Midi" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Note : l'heure du serveur précède votre heure de %s heure." -msgstr[1] "Note : l'heure du serveur précède votre heure de %s heures." -msgstr[2] "Note : l'heure du serveur précède votre heure de %s heures." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Note : votre heure précède l'heure du serveur de %s heure." -msgstr[1] "Note : votre heure précède l'heure du serveur de %s heures." -msgstr[2] "Note : votre heure précède l'heure du serveur de %s heures." - -msgid "Choose a Time" -msgstr "Choisir une heure" - -msgid "Choose a time" -msgstr "Choisir une heure" - -msgid "Cancel" -msgstr "Annuler" - -msgid "Today" -msgstr "Aujourd'hui" - -msgid "Choose a Date" -msgstr "Choisir une date" - -msgid "Yesterday" -msgstr "Hier" - -msgid "Tomorrow" -msgstr "Demain" - -msgid "January" -msgstr "Janvier" - -msgid "February" -msgstr "Février" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "Avril" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juin" - -msgid "July" -msgstr "Juillet" - -msgid "August" -msgstr "Août" - -msgid "September" -msgstr "Septembre" - -msgid "October" -msgstr "Octobre" - -msgid "November" -msgstr "Novembre" - -msgid "December" -msgstr "Décembre" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "fév" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "avr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jui" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aoû" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "oct" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "déc" - -msgid "Sunday" -msgstr "dimanche" - -msgid "Monday" -msgstr "lundi" - -msgid "Tuesday" -msgstr "mardi" - -msgid "Wednesday" -msgstr "mercredi" - -msgid "Thursday" -msgstr "jeudi" - -msgid "Friday" -msgstr "vendredi" - -msgid "Saturday" -msgstr "samedi" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "dim" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "lun" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "mer" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "jeu" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "ven" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "sam" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index cdea1d8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index 52310d3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,609 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2015-01-18 08:31+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "" - -msgid "Yes" -msgstr "" - -msgid "No" -msgstr "" - -msgid "Unknown" -msgstr "" - -msgid "Any date" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Past 7 days" -msgstr "" - -msgid "This month" -msgstr "" - -msgid "This year" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "" - -msgid "action time" -msgstr "" - -msgid "object id" -msgstr "" - -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-format -msgid "Changed %s." -msgstr "" - -msgid "and" -msgstr "" - -#, python-format -msgid "Added %(name)s \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed %(list)s for %(name)s \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Deleted %(name)s \"%(object)s\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may add another " -"%(name)s below." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again " -"below." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was changed successfully. You may add another " -"%(name)s below." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s object with primary key %(key)r does not exist." -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "" - -#, python-format -msgid "Change %s" -msgstr "" - -msgid "Database error" -msgstr "" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We're sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "" - -msgid "Log out" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "" - -msgid "Remove" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent Actions" -msgstr "" - -msgid "My Actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "" - -msgid "(None)" -msgstr "" - -#, python-format -msgid "Select %s" -msgstr "" - -#, python-format -msgid "Select %s to change" -msgstr "" - -msgid "Date:" -msgstr "" - -msgid "Time:" -msgstr "" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 489bbab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po deleted file mode 100644 index ba09bad..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,145 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "" - -msgid "Clock" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Calendar" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" - -msgid "S M T W T F S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index 4f4d286..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index bc55f33..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,810 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Jannis Leidel , 2011 -# Luke Blaney , 2019 -# Michael Thornhill , 2011-2012,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:05+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Scrios %(verbose_name_plural) roghnaithe" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "D'éirigh le scriosadh %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ní féidir scriosadh %(name)s " - -msgid "Are you sure?" -msgstr "An bhfuil tú cinnte?" - -msgid "Administration" -msgstr "Riarachán" - -msgid "All" -msgstr "Gach" - -msgid "Yes" -msgstr "Tá" - -msgid "No" -msgstr "Níl" - -msgid "Unknown" -msgstr "Gan aithne" - -msgid "Any date" -msgstr "Aon dáta" - -msgid "Today" -msgstr "Inniu" - -msgid "Past 7 days" -msgstr "7 lá a chuaigh thart" - -msgid "This month" -msgstr "Táim cinnte" - -msgid "This year" -msgstr "An blian seo" - -msgid "No date" -msgstr "Gan dáta" - -msgid "Has date" -msgstr "Le dáta" - -msgid "Empty" -msgstr "Folamh" - -msgid "Not empty" -msgstr "Gan folamh" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Cuir isteach an %(username)s agus focal faire ceart le haghaidh cuntas " -"foirne. Tabhair faoi deara go bhféadfadh an dá réimsí a cás-íogair." - -msgid "Action:" -msgstr "Aicsean:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Cuir eile %(verbose_name)s" - -msgid "Remove" -msgstr "Tóg amach" - -msgid "Addition" -msgstr "Suimiú" - -msgid "Change" -msgstr "Athraigh" - -msgid "Deletion" -msgstr "Scriosadh" - -msgid "action time" -msgstr "am aicsean" - -msgid "user" -msgstr "úsáideoir" - -msgid "content type" -msgstr "cineál ábhair" - -msgid "object id" -msgstr "id oibiacht" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr oibiacht" - -msgid "action flag" -msgstr "brat an aicsean" - -msgid "change message" -msgstr "teachtaireacht athrú" - -msgid "log entry" -msgstr "loga iontráil" - -msgid "log entries" -msgstr "loga iontrálacha" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Curtha leis “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Athraithe “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Scriosta “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Oibiacht LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Cuireadh {name} “{object}”." - -msgid "Added." -msgstr "Curtha leis." - -msgid "and" -msgstr "agus" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Athraíodh {fields} le haghaidh {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} athrithe." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Scriosadh {name} “{object}”." - -msgid "No fields changed." -msgstr "Dada réimse aithraithe" - -msgid "None" -msgstr "Dada" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Coinnigh síos “Rialú”, nó “Ordú” ar Mac, chun níos mó ná ceann amháin a " -"roghnú." - -msgid "Select this object for an action - {}" -msgstr "Roghnaigh an réad seo le haghaidh gnímh - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Cuireadh an {name} “{obj}” leis go rathúil." - -msgid "You may edit it again below." -msgstr "Thig leat é a athrú arís faoi seo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Cuireadh an {name} “{obj}” leis go rathúil. Is féidir leat {name} eile a " -"chur leis thíos." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Athraíodh an {name} “{obj}” go rathúil. Is féidir leat é a chur in eagar " -"arís thíos." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Athraíodh an {name} “{obj}” go rathúil. Is féidir leat {name} eile a chur " -"leis thíos." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Athraíodh an {name} “{obj}” go rathúil." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Ní mór Míreanna a roghnú chun caingne a dhéanamh orthu. Níl aon mhíreanna a " -"athrú." - -msgid "No action selected." -msgstr "Uimh gníomh roghnaithe." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "D'éirigh le scriosadh %(name)s \"%(obj)s\"." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "Níl %(name)s le haitheantas “%(key)s” ann. B'fhéidir gur scriosadh é?" - -#, python-format -msgid "Add %s" -msgstr "Cuir %s le" - -#, python-format -msgid "Change %s" -msgstr "Aithrigh %s" - -#, python-format -msgid "View %s" -msgstr "Amharc ar %s" - -msgid "Database error" -msgstr "Botún bunachar sonraí" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s athraithe go rathúil" -msgstr[1] "%(count)s %(name)s athraithe go rathúil" -msgstr[2] "%(count)s %(name)s athraithe go rathúil" -msgstr[3] "%(count)s %(name)s athraithe go rathúil" -msgstr[4] "%(count)s %(name)s athraithe go rathúil" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s roghnaithe" -msgstr[1] "Gach %(total_count)s roghnaithe" -msgstr[2] "Gach %(total_count)s roghnaithe" -msgstr[3] "Gach %(total_count)s roghnaithe" -msgstr[4] "Gach %(total_count)s roghnaithe" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 as %(cnt)s roghnaithe." - -#, python-format -msgid "Change history: %s" -msgstr "Athraigh stáir %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Teastaíodh scriosadh %(class_name)s %(instance)s scriosadh na rudaí a " -"bhaineann leis: %(related_objects)s" - -msgid "Django site admin" -msgstr "Riarthóir suíomh Django" - -msgid "Django administration" -msgstr "Riarachán Django" - -msgid "Site administration" -msgstr "Riaracháin an suíomh" - -msgid "Log in" -msgstr "Logáil isteach" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s riaracháin" - -msgid "Page not found" -msgstr "Ní bhfuarthas an leathanach" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Ár leithscéal, ach níorbh fhéidir an leathanach iarrtha a aimsiú." - -msgid "Home" -msgstr "Baile" - -msgid "Server error" -msgstr "Botún freastalaí" - -msgid "Server error (500)" -msgstr "Botún freastalaí (500)" - -msgid "Server Error (500)" -msgstr "Botún Freastalaí (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Tharla earráid. Tuairiscíodh do riarthóirí an tsuímh trí ríomhphost agus ba " -"cheart é a shocrú go luath. Go raibh maith agat as do foighne." - -msgid "Run the selected action" -msgstr "Rith an gníomh roghnaithe" - -msgid "Go" -msgstr "Té" - -msgid "Click here to select the objects across all pages" -msgstr "" -"Cliceáil anseo chun na hobiacht go léir a roghnú ar fud gach leathanach" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Roghnaigh gach %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Scroiseadh modhnóir" - -msgid "Breadcrumbs" -msgstr "Brioscáin aráin" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Samhlacha ins an %(name)s iarratais" - -msgid "Add" -msgstr "Cuir le" - -msgid "View" -msgstr "Amharc ar" - -msgid "You don’t have permission to view or edit anything." -msgstr "Níl cead agat aon rud a fheiceáil ná a chur in eagar." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "Níl cead agat aon rud a fheiceáil ná a chur in eagar." - -msgid "Enter a username and password." -msgstr "Cuir isteach ainm úsáideora agus focal faire." - -msgid "Change password" -msgstr "Athraigh focal faire" - -msgid "Set password" -msgstr "Socraigh pasfhocal" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Ceartaigh an earráid thíos le do thoil." -msgstr[1] "Ceartaigh na hearráidí thíos le do thoil." -msgstr[2] "Ceartaigh na hearráidí thíos le do thoil." -msgstr[3] "Ceartaigh na hearráidí thíos le do thoil." -msgstr[4] "Ceartaigh na hearráidí thíos le do thoil." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Iontráil focal faire nua le hadhaigh an úsaideor %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Cumasóidh an gníomh seo fhíordheimhniú pasfhocal-bhunaithe " -"don úsáideoir seo." - -msgid "Disable password-based authentication" -msgstr "Díchumasaigh fíordheimhniú pasfhocal-bhunaithe" - -msgid "Enable password-based authentication" -msgstr "Cumasaigh fíordheimhniú pasfhocal-bhunaithe" - -msgid "Skip to main content" -msgstr "Téigh ar aghaidh chuig an bpríomhábhar" - -msgid "Welcome," -msgstr "Fáilte" - -msgid "View site" -msgstr "Breatnaigh ar an suíomh" - -msgid "Documentation" -msgstr "Doiciméadúchán" - -msgid "Log out" -msgstr "Logáil amach" - -#, python-format -msgid "Add %(name)s" -msgstr "Cuir %(name)s le" - -msgid "History" -msgstr "Stair" - -msgid "View on site" -msgstr "Breath ar suíomh" - -msgid "Filter" -msgstr "Scagaire" - -msgid "Hide counts" -msgstr "Folaigh comhaireamh" - -msgid "Show counts" -msgstr "Taispeáin comhaireamh" - -msgid "Clear all filters" -msgstr "Glan na scagairí go léir" - -msgid "Remove from sorting" -msgstr "Bain as sórtáil" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sórtáil tosaíocht: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toggle sórtáil" - -msgid "Toggle theme (current theme: auto)" -msgstr "Scoránaigh an téama (téama reatha: uathoibríoch)" - -msgid "Toggle theme (current theme: light)" -msgstr "Scoránaigh an téama (téama reatha: solas)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Scoránaigh an téama (téama reatha: dorcha)" - -msgid "Delete" -msgstr "Cealaigh" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Má scriossan tú %(object_name)s '%(escaped_object)s' scriosfaidh oibiachtí " -"gaolta. Ach níl cead ag do cuntas na oibiacht a leanúint a scriosadh:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Bheadh Scriosadh an %(object_name)s '%(escaped_object)s' a cheangal ar an " -"méid seo a leanas a scriosadh nithe cosanta a bhaineann le:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"An bhfuil tú cinnte na %(object_name)s \"%(escaped_object)s\" a scroiseadh?" -"Beidh gach oibiacht a leanúint scroiste freisin:" - -msgid "Objects" -msgstr "Oibiachtaí" - -msgid "Yes, I’m sure" -msgstr "Sea, táim cinnte" - -msgid "No, take me back" -msgstr "Ní hea, tóg ar ais mé" - -msgid "Delete multiple objects" -msgstr "Scrios na réadanna" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Scriosadh an roghnaithe %(objects_name)s a bheadh mar thoradh ar na nithe " -"gaolmhara a scriosadh, ach níl cead do chuntas a scriosadh na cineálacha seo " -"a leanas na cuspóirí:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Teastaíonn scriosadh na %(objects_name)s roghnaithe scriosadh na hoibiacht " -"gaolta cosainte a leanúint:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"An bhfuil tú cinnte gur mian leat a scriosadh %(objects_name)s roghnaithe? " -"Beidh gach ceann de na nithe seo a leanas agus a n-ítimí gaolta scroiste:" - -msgid "Delete?" -msgstr "Cealaigh?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Trí %(filter_title)s " - -msgid "Summary" -msgstr "Achoimre" - -msgid "Recent actions" -msgstr "Gníomhartha le déanaí" - -msgid "My actions" -msgstr "Mo ghníomhartha" - -msgid "None available" -msgstr "Dada ar fáil" - -msgid "Added:" -msgstr "Curtha leis:" - -msgid "Changed:" -msgstr "Athraithe:" - -msgid "Deleted:" -msgstr "Scriosta:" - -msgid "Unknown content" -msgstr "Inneachair anaithnid" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Tá rud éigin cearr le suiteáil do bhunachar sonraí. Cinntigh go bhfuil na " -"táblaí bunachar sonraí cuí cruthaithe, agus cinntigh go bhfuil an bunachar " -"sonraí inléite ag an úsáideoir cuí." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Tá tú fíordheimhnithe mar %(username)s, ach níl cead agat an leathanach seo " -"a rochtain. Ar mhaith leat logáil isteach i gcuntas eile?" - -msgid "Forgotten your password or username?" -msgstr "Dearmad déanta ar do focal faire nó ainm úsaideora" - -msgid "Toggle navigation" -msgstr "Scoránaigh an nascleanúint" - -msgid "Sidebar" -msgstr "Barra Taoibh" - -msgid "Start typing to filter…" -msgstr "Tosaigh ag clóscríobh chun an scagaire…" - -msgid "Filter navigation items" -msgstr "Scag míreanna nascleanúna" - -msgid "Date/time" -msgstr "Dáta/am" - -msgid "User" -msgstr "Úsaideoir" - -msgid "Action" -msgstr "Aicsean" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "iontráil" -msgstr[1] "iontrálacha" -msgstr[2] "iontrálacha" -msgstr[3] "iontrálacha" -msgstr[4] "iontrálacha" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Níl stair athruithe ag an réad seo. Is dócha nár cuireadh leis tríd an " -"suíomh riaracháin seo." - -msgid "Show all" -msgstr "Taispéan gach rud" - -msgid "Save" -msgstr "Sábháil" - -msgid "Popup closing…" -msgstr "Preabfhuinneog ag dúnadh…" - -msgid "Search" -msgstr "Cuardach" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s toradh" -msgstr[1] "%(counter)s torthaí" -msgstr[2] "%(counter)s torthaí" -msgstr[3] "%(counter)s torthaí" -msgstr[4] "%(counter)s torthaí" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s iomlán" - -msgid "Save as new" -msgstr "Sabháil mar nua" - -msgid "Save and add another" -msgstr "Sabháil agus cuir le ceann eile" - -msgid "Save and continue editing" -msgstr "Sábhail agus lean ag cuir in eagar" - -msgid "Save and view" -msgstr "Sabháil agus amharc ar" - -msgid "Close" -msgstr "Druid" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Athraigh roghnaithe %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Cuir le %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Scrios roghnaithe %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Féach ar %(model)s roghnaithe" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Go raibh maith agat as roinnt ama ardchaighdeáin a chaitheamh leis an suíomh " -"Gréasáin inniu." - -msgid "Log in again" -msgstr "Logáil isteacj arís" - -msgid "Password change" -msgstr "Athrú focal faire" - -msgid "Your password was changed." -msgstr "Bhí do focal faire aithraithe." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Cuir isteach do sheanphasfhocal, ar mhaithe le slándáil, agus ansin cuir " -"isteach do phasfhocal nua faoi dhó ionas gur féidir linn a fhíorú gur " -"chlóscríobh tú i gceart é." - -msgid "Change my password" -msgstr "Athraigh mo focal faire" - -msgid "Password reset" -msgstr "Athsocraigh focal faire" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Tá do focal faire réidh. Is féidir leat logáil isteach anois." - -msgid "Password reset confirmation" -msgstr "Deimhniú athshocraigh focal faire" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Le do thoil, iontráil do focal faire dhá uaire cé go mbeimid in ann a " -"seiceal go bhfuil sé scríobhte isteach i gceart." - -msgid "New password:" -msgstr "Focal faire nua:" - -msgid "Confirm password:" -msgstr "Deimhnigh focal faire:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Bhí nasc athshocraigh an focal faire mícheart, b'fheidir mar go raibh sé " -"úsaidte cheana. Le do thoil, iarr ar athsocraigh focal faire nua." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Chuireamar ríomhphost chugat treoracha maidir le do phasfhocal a shocrú, má " -"tá cuntas ann leis an ríomhphost a chuir tú isteach. Ba cheart duit iad a " -"fháil go luath." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Mura bhfaigheann tú ríomhphost, cinntigh le do thoil gur chuir tú isteach an " -"seoladh ar chláraigh tú leis, agus seiceáil d’fhillteán turscair." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Tá an ríomhphost seo á fháil agat toisc gur iarr tú athshocrú pasfhocail do " -"do chuntas úsáideora ag %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Le do thoil té go dtí an leathanach a leanúint agus roghmaigh focal faire " -"nua:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "D’ainm úsáideora, ar eagla go bhfuil dearmad déanta agat ar:" - -msgid "Thanks for using our site!" -msgstr "Go raibh maith agat le hadhaigh do cuairt!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Foireann an %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Dearmad déanta agat ar do phasfhocal? Cuir isteach do sheoladh ríomhphoist " -"thíos, agus seolfaimid treoracha ríomhphoist chun ceann nua a shocrú." - -msgid "Email address:" -msgstr "Seoladh ríomhphoist:" - -msgid "Reset my password" -msgstr "Athsocraigh mo focal faire" - -msgid "Select all objects on this page for an action" -msgstr "Roghnaigh gach oibiacht ar an leathanach seo le haghaidh gnímh" - -msgid "All dates" -msgstr "Gach dáta" - -#, python-format -msgid "Select %s" -msgstr "Roghnaigh %s" - -#, python-format -msgid "Select %s to change" -msgstr "Roghnaigh %s a athrú" - -#, python-format -msgid "Select %s to view" -msgstr "Roghnaigh %s le féachaint" - -msgid "Date:" -msgstr "Dáta:" - -msgid "Time:" -msgstr "Am:" - -msgid "Lookup" -msgstr "Cuardach" - -msgid "Currently:" -msgstr "Faoi láthair:" - -msgid "Change:" -msgstr "Athraigh:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo deleted file mode 100644 index e46bd50..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po deleted file mode 100644 index 6f6e50d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,341 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Jannis Leidel , 2011 -# Luke Blaney , 2019 -# Michael Thornhill , 2011-2012,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:59+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s ar fáil" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Is é seo an liosta %s ar fáil. Is féidir leat a roghnú roinnt ag roghnú acu " -"sa bhosca thíos agus ansin cliceáil ar an saighead \"Roghnaigh\" idir an dá " -"boscaí." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Scríobh isteach sa bhosca seo a scagadh síos ar an liosta de %s ar fáil." - -msgid "Filter" -msgstr "Scagaire" - -msgid "Choose all" -msgstr "Roghnaigh iomlán" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Cliceáil anseo chun %s go léir a roghnú." - -msgid "Choose" -msgstr "Roghnaigh" - -msgid "Remove" -msgstr "Bain amach" - -#, javascript-format -msgid "Chosen %s" -msgstr "Roghnófar %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Is é seo an liosta de %s roghnaithe. Is féidir leat iad a bhaint amach má " -"roghnaionn tú cuid acu sa bhosca thíos agus ansin cliceáil ar an saighead " -"\"Bain\" idir an dá boscaí." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"Clóscríobh isteach sa bhosca seo chun liosta na %s roghnaithe a scagadh." - -msgid "Remove all" -msgstr "Scrois gach ceann" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Cliceáil anseo chun %s go léir roghnaithe a scroiseadh." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "Níl an rogha roghnaithe %s le feiceáil" -msgstr[1] "Níl %s roghanna roghnaithe le feiceáil" -msgstr[2] "Níl %s roghanna roghnaithe le feiceáil" -msgstr[3] "Níl %s roghanna roghnaithe le feiceáil" -msgstr[4] "Níl %s roghanna roghnaithe le feiceáil" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s roghnaithe" -msgstr[1] "%(sel)s de %(cnt)s roghnaithe" -msgstr[2] "%(sel)s de %(cnt)s roghnaithe" -msgstr[3] "%(sel)s de %(cnt)s roghnaithe" -msgstr[4] "%(sel)s de %(cnt)s roghnaithe" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tá aithrithe nach bhfuil sabhailte ar chuid do na réimse. Má ritheann tú " -"gníomh, caillfidh tú do chuid aithrithe." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Tá gníomh roghnaithe agat, ach níor shábháil tú d'athruithe ar réimsí aonair " -"fós. Cliceáil OK le do thoil a shábháil. Beidh ort an t-aicsean a rith arís." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Tá gníomh roghnaithe agat, agus níl aon athruithe déanta agat ar réimsí " -"aonair. Is dócha go bhfuil an cnaipe Téigh á lorg agat seachas an cnaipe " -"Sábháil." - -msgid "Now" -msgstr "Anois" - -msgid "Midnight" -msgstr "Meán oíche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Nóin" - -msgid "6 p.m." -msgstr "6in" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí." -msgstr[1] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí." -msgstr[2] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí." -msgstr[3] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí." -msgstr[4] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí." -msgstr[1] "" -"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí." -msgstr[2] "" -"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí." -msgstr[3] "" -"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí." -msgstr[4] "" -"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí." - -msgid "Choose a Time" -msgstr "Roghnaigh Am" - -msgid "Choose a time" -msgstr "Roghnaigh am" - -msgid "Cancel" -msgstr "Cealaigh" - -msgid "Today" -msgstr "Inniu" - -msgid "Choose a Date" -msgstr "Roghnaigh Dáta" - -msgid "Yesterday" -msgstr "Inné" - -msgid "Tomorrow" -msgstr "Amárach" - -msgid "January" -msgstr "Eanáir" - -msgid "February" -msgstr "Feabhra" - -msgid "March" -msgstr "Márta" - -msgid "April" -msgstr "Aibreán" - -msgid "May" -msgstr "Bealtaine" - -msgid "June" -msgstr "Meitheamh" - -msgid "July" -msgstr "Iúil" - -msgid "August" -msgstr "Lúnasa" - -msgid "September" -msgstr "Meán Fómhair" - -msgid "October" -msgstr "Deireadh Fómhair" - -msgid "November" -msgstr "Samhain" - -msgid "December" -msgstr "Nollaig" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Ean" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feabh" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Már" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Aib" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Beal" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Meith" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Lúil" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Lún" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Meán Fóm" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Deireadh Fóm" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Sam" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Noll" - -msgid "Sunday" -msgstr "Domhnach" - -msgid "Monday" -msgstr "Dé Luain" - -msgid "Tuesday" -msgstr "Dé Máirt" - -msgid "Wednesday" -msgstr "Dé Céadaoin" - -msgid "Thursday" -msgstr "Déardaoin" - -msgid "Friday" -msgstr "Dé hAoine" - -msgid "Saturday" -msgstr "Dé Sathairn" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Lua" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Mái" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Céa" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Déa" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Aoi" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sat" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "C" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "D" - -msgctxt "one letter Friday" -msgid "F" -msgstr "A" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index 3807caa..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index 030f4b6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,754 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2015-2017,2021 -# GunChleoc, 2015 -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-10-27 12:57+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Sguab às na %(verbose_name_plural)s a chaidh a thaghadh" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Chaidh %(count)d %(items)s a sguabadh às." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Chan urrainn dhuinn %(name)s a sguabadh às" - -msgid "Are you sure?" -msgstr "A bheil thu cinnteach?" - -msgid "Administration" -msgstr "Rianachd" - -msgid "All" -msgstr "Na h-uile" - -msgid "Yes" -msgstr "Tha" - -msgid "No" -msgstr "Chan eil" - -msgid "Unknown" -msgstr "Chan eil fhios" - -msgid "Any date" -msgstr "Ceann-là sam bith" - -msgid "Today" -msgstr "An-diugh" - -msgid "Past 7 days" -msgstr "Na 7 làithean seo chaidh" - -msgid "This month" -msgstr "Am mìos seo" - -msgid "This year" -msgstr "Am bliadhna" - -msgid "No date" -msgstr "Gun cheann-là" - -msgid "Has date" -msgstr "Tha ceann-là aige" - -msgid "Empty" -msgstr "Falamh" - -msgid "Not empty" -msgstr "Neo-fhalamh" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Cuir a-steach %(username)s agus facal-faire ceart airson cunntas neach-" -"obrach. Thoir an aire gum bi aire do litrichean mòra ’s beaga air an dà " -"raon, ma dh’fhaoidte." - -msgid "Action:" -msgstr "Gnìomh:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Cuir %(verbose_name)s eile ris" - -msgid "Remove" -msgstr "Thoir air falbh" - -msgid "Addition" -msgstr "Cur ris" - -msgid "Change" -msgstr "Atharraich" - -msgid "Deletion" -msgstr "Sguabadh às" - -msgid "action time" -msgstr "àm a’ ghnìomha" - -msgid "user" -msgstr "cleachdaiche" - -msgid "content type" -msgstr "seòrsa susbainte" - -msgid "object id" -msgstr "id an oibceict" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "riochdachadh oibseict" - -msgid "action flag" -msgstr "bratach a’ ghnìomha" - -msgid "change message" -msgstr "teachdaireachd atharrachaidh" - -msgid "log entry" -msgstr "innteart loga" - -msgid "log entries" -msgstr "innteartan loga" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Chaidh “%(object)s” a chur ris." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Chaidh “%(object)s” atharrachadh – %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Chaidh “%(object)s” a sguabadh às." - -msgid "LogEntry Object" -msgstr "Oibseact innteart an loga" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Chaidh {name} “{object}” a chur ris." - -msgid "Added." -msgstr "Chaidh a chur ris." - -msgid "and" -msgstr "agus" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Chaidh {fields} atharrachadh airson {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Chaidh {fields} atharrachadh." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Chaidh {name} “{object}” a sguabadh às." - -msgid "No fields changed." -msgstr "Cha deach raon atharrachadh." - -msgid "None" -msgstr "Chan eil gin" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Cum sìos “Control” no “Command” air Mac gus iomadh nì a thaghadh." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Chaidh {name} “{obj}” a chur ris." - -msgid "You may edit it again below." -msgstr "’S urrainn dhut a dheasachadh a-rithist gu h-ìosal." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Chaidh {name} “%{obj}” a chur ris. ’S urrainn dhut {name} eile a chur ris gu " -"h-ìosal." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Chaidh {name} “{obj}” atharrachadh. ’S urrainn dhut a dheasachadh a-rithist " -"gu h-ìosal." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"Chaidh {name} “{obj}” a chur ris. ’S urrainn dhut a dheasachadh a-rithist gu " -"h-ìosal." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Chaidh {name} “{obj}” atharrachadh. ’S urrainn dhut {name} eile a chur ris " -"gu h-ìosal." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Chaidh {name} “{obj}” atharrachadh." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Feumaidh tu nithean a thaghadh mus dèan thu gnìomh orra. Cha deach nì " -"atharrachadh." - -msgid "No action selected." -msgstr "Cha deach gnìomh a thaghadh." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Chaidh %(name)s “%(obj)s” a sguabadh às." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"Chan eil %(name)s leis an ID \"%(key)s\" ann. 'S dòcha gun deach a sguabadh " -"às?" - -#, python-format -msgid "Add %s" -msgstr "Cuir %s ris" - -#, python-format -msgid "Change %s" -msgstr "Atharraich %s" - -#, python-format -msgid "View %s" -msgstr "Seall %s" - -msgid "Database error" -msgstr "Mearachd an stòir-dhàta" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Chaidh %(count)s %(name)s atharrachadh." -msgstr[1] "Chaidh %(count)s %(name)s atharrachadh." -msgstr[2] "Chaidh %(count)s %(name)s atharrachadh." -msgstr[3] "Chaidh %(count)s %(name)s atharrachadh." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Chaidh %(total_count)s a thaghadh" -msgstr[1] "Chaidh a h-uile %(total_count)s a thaghadh" -msgstr[2] "Chaidh a h-uile %(total_count)s a thaghadh" -msgstr[3] "Chaidh a h-uile %(total_count)s a thaghadh" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Chaidh 0 à %(cnt)s a thaghadh" - -#, python-format -msgid "Change history: %s" -msgstr "Eachdraidh nan atharraichean: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Gus %(class_name)s %(instance)s a sguabadh às, bhiodh againn ris na h-" -"oibseactan dàimheach dìonta seo a sguabadh às cuideachd: %(related_objects)s" - -msgid "Django site admin" -msgstr "Rianachd làraich Django" - -msgid "Django administration" -msgstr "Rianachd Django" - -msgid "Site administration" -msgstr "Rianachd na làraich" - -msgid "Log in" -msgstr "Clàraich a-steach" - -#, python-format -msgid "%(app)s administration" -msgstr "Rianachd %(app)s" - -msgid "Page not found" -msgstr "Cha deach an duilleag a lorg" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Tha sinn duilich ach cha do lorg sinn an duilleag a dh’iarr thu." - -msgid "Home" -msgstr "Dhachaigh" - -msgid "Server error" -msgstr "Mearachd an fhrithealaiche" - -msgid "Server error (500)" -msgstr "Mearachd an fhrithealaiche (500)" - -msgid "Server Error (500)" -msgstr "Mearachd an fhrithealaiche (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Chaidh rudeigin cearr. Fhuair rianairean na làraich aithris air a’ phost-d " -"agus tha sinn an dùil gun dèid a chàradh a dh’aithghearr. Mòran taing airson " -"d’ fhoighidinn." - -msgid "Run the selected action" -msgstr "Ruith an gnìomh a thagh thu" - -msgid "Go" -msgstr "Siuthad" - -msgid "Click here to select the objects across all pages" -msgstr "" -"Briog an-seo gus na h-oibseactan a thaghadh air feadh nan duilleagan uile" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Tagh a h-uile %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Falamhaich an taghadh" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modailean ann an aplacaid %(name)s" - -msgid "Add" -msgstr "Cuir ris" - -msgid "View" -msgstr "Seall" - -msgid "You don’t have permission to view or edit anything." -msgstr "Chan eil cead agad gus dad a shealltainn no a dheasachadh." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Cuir ainm-cleachdaiche is facal-faire a-steach an toiseach. ’S urrainn dhut " -"barrachd roghainnean a’ chleachdaiche a dheasachadh an uairsin." - -msgid "Enter a username and password." -msgstr "Cuir ainm-cleachdaiche ’s facal-faire a-steach." - -msgid "Change password" -msgstr "Atharraich am facal-faire" - -msgid "Please correct the error below." -msgstr "Feuch an cuir thu a’ mhearachd gu h-ìosal gu ceart." - -msgid "Please correct the errors below." -msgstr "Feuch an cuir thu na mearachdan gu h-ìosal gu ceart." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Cuir a-steach facal-faire ùr airson a’ chleachdaiche %(username)s." - -msgid "Welcome," -msgstr "Fàilte," - -msgid "View site" -msgstr "Seall an làrach" - -msgid "Documentation" -msgstr "Docamaideadh" - -msgid "Log out" -msgstr "Clàraich a-mach" - -#, python-format -msgid "Add %(name)s" -msgstr "Cuir %(name)s ris" - -msgid "History" -msgstr "An eachdraidh" - -msgid "View on site" -msgstr "Seall e air an làrach" - -msgid "Filter" -msgstr "Criathraich" - -msgid "Clear all filters" -msgstr "Falamhaich gach crithrag" - -msgid "Remove from sorting" -msgstr "Thoir air falbh on t-seòrsachadh" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prìomhachas an t-seòrsachaidh: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toglaich an seòrsachadh" - -msgid "Delete" -msgstr "Sguab às" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Nan sguabadh tu às %(object_name)s “%(escaped_object)s”, rachadh oibseactan " -"dàimheach a sguabadh às cuideachd ach chan eil cead aig a’ chunntas agad gus " -"na seòrsaichean de dh’oibseact seo a sguabadh às:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Nan sguabadh tu às %(object_name)s “%(escaped_object)s”, bhiodh againn ris " -"na h-oibseactan dàimheach dìonta seo a sguabadh às cuideachd:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"A bheil thu cinnteach gu bheil thu airson %(object_name)s " -"“%(escaped_object)s” a sguabadh às? Thèid a h-uile nì dàimheach a sguabadh " -"às cuideachd:" - -msgid "Objects" -msgstr "Oibseactan" - -msgid "Yes, I’m sure" -msgstr "Tha mi cinnteach" - -msgid "No, take me back" -msgstr "Chan eil, air ais leam" - -msgid "Delete multiple objects" -msgstr "Sguab às iomadh oibseact" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Nan sguabadh tu às a’ %(objects_name)s a thagh thu, rachadh oibseactan " -"dàimheach a sguabadh às cuideachd ach chan eil cead aig a’ chunntas agad gus " -"na seòrsaichean de dh’oibseact seo a sguabadh às:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Nan sguabadh tu às a’ %(objects_name)s a thagh thu, bhiodh againn ris na h-" -"oibseactan dàimheach dìonta seo a sguabadh às cuideachd:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"A bheil thu cinnteach gu bheil thu airson a’ %(objects_name)s a thagh thu a " -"sguabadh às? Thèid a h-uile oibseact seo ’s na nithean dàimheach aca a " -"sguabadh às:" - -msgid "Delete?" -msgstr "A bheil thu airson a sguabadh às?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " le %(filter_title)s " - -msgid "Summary" -msgstr "Gearr-chunntas" - -msgid "Recent actions" -msgstr "Gnìomhan o chionn goirid" - -msgid "My actions" -msgstr "Na gnìomhan agam" - -msgid "None available" -msgstr "Chan eil gin ann" - -msgid "Unknown content" -msgstr "Susbaint nach aithne dhuinn" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Chaidh rudeigin cearr le stàladh an stòir-dhàta agad. Dèan cinnteach gun " -"deach na clàran stòir-dhàta iomchaidh a chruthachadh agus gur urrainn dhan " -"chleachdaiche iomchaidh an stòr-dàta a leughadh." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Chaidh do dhearbhadh mar %(username)s ach chan eil ùghdarras agad gus an " -"duilleag seo inntrigeadh. Am bu toigh leat clàradh a-steach le cunntas eile?" - -msgid "Forgotten your password or username?" -msgstr "" -"An do dhìochuimhnich thu am facal-faire no an t-ainm-cleachdaiche agad?" - -msgid "Toggle navigation" -msgstr "Toglaich an t-seòladaireachd" - -msgid "Start typing to filter…" -msgstr "Tòisich air sgrìobhadh airson criathradh…" - -msgid "Filter navigation items" -msgstr "Criathraich nithean na seòladaireachd" - -msgid "Date/time" -msgstr "Ceann-là ’s àm" - -msgid "User" -msgstr "Cleachdaiche" - -msgid "Action" -msgstr "Gnìomh" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Chan eil eachdraidh nan atharraichean aig an oibseact seo. Dh’fhaoidte nach " -"deach a chur ris leis an làrach rianachd seo." - -msgid "Show all" -msgstr "Seall na h-uile" - -msgid "Save" -msgstr "Sàbhail" - -msgid "Popup closing…" -msgstr "Tha a’ phriob-uinneag ’ga dùnadh…" - -msgid "Search" -msgstr "Lorg" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s toradh" -msgstr[1] "%(counter)s thoradh" -msgstr[2] "%(counter)s toraidhean" -msgstr[3] "%(counter)s toradh" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s gu h-iomlan" - -msgid "Save as new" -msgstr "Sàbhail mar fhear ùr" - -msgid "Save and add another" -msgstr "Sàbhail is cuir fear eile ris" - -msgid "Save and continue editing" -msgstr "Sàbhail is deasaich a-rithist" - -msgid "Save and view" -msgstr "Sàbhail is seall" - -msgid "Close" -msgstr "Dùin" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Atharraich a’ %(model)s a thagh thu" - -#, python-format -msgid "Add another %(model)s" -msgstr "Cuir %(model)s eile ris" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Sguab às a’ %(model)s a thagh thu" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Mòran taing gun do chuir thu seachad deagh-àm air an làrach-lìn an-diugh." - -msgid "Log in again" -msgstr "Clàraich a-steach a-rithist" - -msgid "Password change" -msgstr "Atharrachadh an facail-fhaire" - -msgid "Your password was changed." -msgstr "Chaidh am facal-faire agad atharrachadh." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Cuir a-steach an seann fhacal-faire agad ri linn tèarainteachd agus cuir a-" -"steach am facal-faire ùr agad dà thuras an uairsin ach an dearbhaich sinn " -"nach do rinn thu mearachd sgrìobhaidh." - -msgid "Change my password" -msgstr "Atharraich am facal-faire agam" - -msgid "Password reset" -msgstr "Ath-shuidheachadh an fhacail-fhaire" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Chaidh am facal-faire agad a shuidheachadh. Faodaidh tu clàradh a-steach a-" -"nis." - -msgid "Password reset confirmation" -msgstr "Dearbhadh air ath-shuidheachadh an fhacail-fhaire" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Cuir a-steach am facal-faire ùr agad dà thuras ach an dearbhaich sinn nach " -"do rinn thu mearachd sgrìobhaidh." - -msgid "New password:" -msgstr "Am facal-faire ùr:" - -msgid "Confirm password:" -msgstr "Dearbhaich am facal-faire:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Bha an ceangal gus am facal-faire ath-suidheachadh mì-dhligheach; ’s dòcha " -"gun deach a chleachdadh mar-thà. Iarr ath-shuidheachadh an fhacail-fhaire às " -"ùr." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Chuir sinn stiùireadh thugad air mar a dh’ath-shuidhicheas tu am facal-faire " -"agad air a’ phost-d dhan chunntas puist-d a chuir thu a-steach. Bu chòir " -"dhut fhaighinn a dh’aithghearr." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Mura faigh thu post-d, dèan cinnteach gun do chuir thu a-steach an seòladh " -"puist-d leis an do chlàraich thu agus thoir sùil air pasgan an spama agad." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Fhuair thu am post-d seo air sgàth ’s gun do dh’iarr thu ath-shuidheachadh " -"an fhacail-fhaire agad airson a’ chunntais cleachdaiche agad air " -"%(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Tadhail air an duilleag seo is tagh facal-faire ùr:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" -"Seo an t-ainm-cleachdaiche agad air eagal ’s gun do dhìochuimhnich thu e:" - -msgid "Thanks for using our site!" -msgstr "Mòran taing airson an làrach againn a chleachdadh!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Sgioba %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Na dhìochuimhnich thu am facal-faire agad? Cuir a-steach an seòladh puist-d " -"agad gu h-ìosal agus cuiridh sinn stiùireadh thugad gus fear ùr a " -"shuidheachadh air a’ phost-d." - -msgid "Email address:" -msgstr "Seòladh puist-d:" - -msgid "Reset my password" -msgstr "Ath-shuidhich am facal-faire agam" - -msgid "All dates" -msgstr "A h-uile ceann-là" - -#, python-format -msgid "Select %s" -msgstr "Tagh %s" - -#, python-format -msgid "Select %s to change" -msgstr "Tagh %s gus atharrachadh" - -#, python-format -msgid "Select %s to view" -msgstr "Tagh %s gus a shealltainn" - -msgid "Date:" -msgstr "Ceann-là:" - -msgid "Time:" -msgstr "Àm:" - -msgid "Lookup" -msgstr "Lorg" - -msgid "Currently:" -msgstr "An-dràsta:" - -msgid "Change:" -msgstr "Atharrachadh:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 661e42e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po deleted file mode 100644 index f8b6c1f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,286 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2015-2016 -# GunChleoc, 2015 -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-07-15 10:43+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s ri am faighinn" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Seo liosta de %s a tha ri am faighinn. Gus feadhainn a thaghadh, tagh iad sa " -"bhogsa gu h-ìosal agus briog air an t-saighead “Tagh” eadar an dà bhogsa an " -"uair sin." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Sgrìobh sa bhogsa seo gus an liosta de %s ri am faighinn a chriathradh." - -msgid "Filter" -msgstr "Criathraich" - -msgid "Choose all" -msgstr "Tagh na h-uile" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Briog gus a h-uile %s a thaghadh aig an aon àm." - -msgid "Choose" -msgstr "Tagh" - -msgid "Remove" -msgstr "Thoir air falbh" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s a chaidh a thaghadh" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Seo liosta de %s a chaidh a thaghadh. Gus feadhainn a thoirt air falbh, tagh " -"iad sa bhogsa gu h-ìosal agus briog air an t-saighead “Thoir air falbh” " -"eadar an dà bhogsa an uair sin." - -msgid "Remove all" -msgstr "Thoir air falbh na h-uile" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Briog gus a h-uile %s a chaidh a thaghadh a thoirt air falbh." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Chaidh %(sel)s à %(cnt)s a thaghadh" -msgstr[1] "Chaidh %(sel)s à %(cnt)s a thaghadh" -msgstr[2] "Chaidh %(sel)s à %(cnt)s a thaghadh" -msgstr[3] "Chaidh %(sel)s à %(cnt)s a thaghadh" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tha atharraichean gun sàbhaladh agad ann an raon no dhà fa leth a ghabhas " -"deasachadh. Ma ruitheas tu gnìomh, thèid na dh’atharraich thu gun a " -"shàbhaladh air chall." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Thagh thu gnìomh ach cha do shàbhail thu na dh’atharraich thu ann an " -"raointean fa leth. Briog air “Ceart ma-thà” gus seo a shàbhaladh. Feumaidh " -"tu an gnìomh a ruith a-rithist." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Thagh thu gnìomh agus cha do rinn thu atharrachadh air ran fa leth sam bith. " -"’S dòcha gu bheil thu airson am putan “Siuthad” a chleachdadh seach am putan " -"“Sàbhail”." - -msgid "Now" -msgstr "An-dràsta" - -msgid "Midnight" -msgstr "Meadhan-oidhche" - -msgid "6 a.m." -msgstr "6m" - -msgid "Noon" -msgstr "Meadhan-latha" - -msgid "6 p.m." -msgstr "6f" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"An aire: Tha thu %s uair a thìde air thoiseach àm an fhrithealaiche." -msgstr[1] "" -"An aire: Tha thu %s uair a thìde air thoiseach àm an fhrithealaiche." -msgstr[2] "" -"An aire: Tha thu %s uairean a thìde air thoiseach àm an fhrithealaiche." -msgstr[3] "" -"An aire: Tha thu %s uair a thìde air thoiseach àm an fhrithealaiche." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"An aire: Tha thu %s uair a thìde air dheireadh àm an fhrithealaiche." -msgstr[1] "" -"An aire: Tha thu %s uair a thìde air dheireadh àm an fhrithealaiche." -msgstr[2] "" -"An aire: Tha thu %s uairean a thìde air dheireadh àm an fhrithealaiche." -msgstr[3] "" -"An aire: Tha thu %s uair a thìde air dheireadh àm an fhrithealaiche." - -msgid "Choose a Time" -msgstr "Tagh àm" - -msgid "Choose a time" -msgstr "Tagh àm" - -msgid "Cancel" -msgstr "Sguir dheth" - -msgid "Today" -msgstr "An-diugh" - -msgid "Choose a Date" -msgstr "Tagh ceann-là" - -msgid "Yesterday" -msgstr "An-dè" - -msgid "Tomorrow" -msgstr "A-màireach" - -msgid "January" -msgstr "Am Faoilleach" - -msgid "February" -msgstr "An Gearran" - -msgid "March" -msgstr "Am Màrt" - -msgid "April" -msgstr "An Giblean" - -msgid "May" -msgstr "An Cèitean" - -msgid "June" -msgstr "An t-Ògmhios" - -msgid "July" -msgstr "An t-Iuchar" - -msgid "August" -msgstr "An Lùnastal" - -msgid "September" -msgstr "An t-Sultain" - -msgid "October" -msgstr "An Dàmhair" - -msgid "November" -msgstr "An t-Samhain" - -msgid "December" -msgstr "An Dùbhlachd" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Faoi" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Gearr" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Màrt" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Gibl" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Cèit" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Ògmh" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Iuch" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Lùna" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sult" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Dàmh" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Samh" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dùbh" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Dò" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Lu" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Mà" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ci" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Da" - -msgctxt "one letter Friday" -msgid "F" -msgstr "hA" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Sa" - -msgid "Show" -msgstr "Seall" - -msgid "Hide" -msgstr "Falaich" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index daddcd3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index 0e4faca..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,795 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Denís Bermúdez Delgado , 2021 -# fasouto , 2011-2012 -# fonso , 2011,2013 -# fasouto , 2017 -# Jannis Leidel , 2011 -# Leandro Regueiro , 2013 -# 948a55bc37dd6d642f1875bb84258fff_07a28cc , 2011-2012 -# Pablo, 2015 -# X Bello , 2023-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: X Bello , 2023-2024\n" -"Language-Team: Galician (http://app.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Borrar %(verbose_name_plural)s seleccionados." - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Borrado exitosamente %(count)d %(items)s" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Non foi posíble eliminar %(name)s" - -msgid "Are you sure?" -msgstr "¿Está seguro?" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todo" - -msgid "Yes" -msgstr "Si" - -msgid "No" -msgstr "Non" - -msgid "Unknown" -msgstr "Descoñecido" - -msgid "Any date" -msgstr "Calquera data" - -msgid "Today" -msgstr "Hoxe" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este ano" - -msgid "No date" -msgstr "Sen data" - -msgid "Has date" -msgstr "Ten data" - -msgid "Empty" -msgstr "Baleiro" - -msgid "Not empty" -msgstr "Non baleiro" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor, insira os %(username)s e contrasinal dunha conta de persoal. Teña " -"en conta que ambos os dous campos distingues maiúsculas e minúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Engadir outro %(verbose_name)s" - -msgid "Remove" -msgstr "Retirar" - -msgid "Addition" -msgstr "Engadido" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Borrado" - -msgid "action time" -msgstr "hora da acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contido" - -msgid "object id" -msgstr "id do obxecto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr do obxecto" - -msgid "action flag" -msgstr "código do tipo de acción" - -msgid "change message" -msgstr "cambiar mensaxe" - -msgid "log entry" -msgstr "entrada de rexistro" - -msgid "log entries" -msgstr "entradas de rexistro" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Engadido %(object)s" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Cambiado “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Eliminado “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Obxecto LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Engadido {name} “{object}”." - -msgid "Added." -msgstr "Engadido." - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Cambiados {fields} por {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Cambiados {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Eliminado {name} “{object}”." - -msgid "No fields changed." -msgstr "Non se modificou ningún campo." - -msgid "None" -msgstr "Ningún" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -" Para seleccionar máis dunha entrada, manteña premida a tecla “Control”, ou " -"“Comando” nun Mac." - -msgid "Select this object for an action - {}" -msgstr "Seleccione este obxeto para unha acción - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Engadiuse correctamente {name} “{obj}”." - -msgid "You may edit it again below." -msgstr "Pode editalo outra vez abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Engadiuse correctamente {name} “{obj}”. Pode engadir outro {name} abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "Modificouse correctamente {name} “{obj}”. Pode editalo de novo abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Modificouse correctamente {name} “{obj}”. Pode engadir outro {name} abaixo." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Modificouse correctamente {name} “{obj}”." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Debe seleccionar ítems para poder facer accións con eles. Ningún ítem foi " -"cambiado." - -msgid "No action selected." -msgstr "Non se elixiu ningunha acción." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Eliminouse correctamente %(name)s “%(obj)s”." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "Non existe %(name)s ca ID “%(key)s”. Ó mellor foi borrado?" - -#, python-format -msgid "Add %s" -msgstr "Engadir %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "Ver %s" - -msgid "Database error" -msgstr "Erro da base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s foi cambiado satisfactoriamente." -msgstr[1] "%(count)s %(name)s foron cambiados satisfactoriamente." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionado." -msgstr[1] "Tódolos %(total_count)s seleccionados." - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seleccionados." - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de cambios: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"O borrado de %(class_name)s %(instance)s precisaría borrar os seguintes " -"obxetos relacionados: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administración de sitio Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Administración do sitio" - -msgid "Log in" -msgstr "Iniciar sesión" - -#, python-format -msgid "%(app)s administration" -msgstr "administración de %(app)s " - -msgid "Page not found" -msgstr "Páxina non atopada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Sentímolo, pero non se atopou a páxina solicitada." - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Erro no servidor" - -msgid "Server error (500)" -msgstr "Erro no servidor (500)" - -msgid "Server Error (500)" -msgstr "Erro no servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ocorreu un erro. Os administradores do sitio foron informados por email e " -"debería ser arranxado pronto. Grazas pola súa paciencia." - -msgid "Run the selected action" -msgstr "Executar a acción seleccionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Fai clic aquí para seleccionar os obxectos en tódalas páxinas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar todos os %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Limpar selección" - -msgid "Breadcrumbs" -msgstr "Migas de pan" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos na aplicación %(name)s" - -msgid "Add" -msgstr "Engadir" - -msgid "View" -msgstr "Vista" - -msgid "You don’t have permission to view or edit anything." -msgstr "Non ten permiso para ver ou editar nada." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Primeiro insira un nome de usuario e un contrasinal. Despois poderá editar " -"máis opcións de usuario." - -msgid "Enter a username and password." -msgstr "Introduza un nome de usuario e contrasinal." - -msgid "Change password" -msgstr "Cambiar contrasinal" - -msgid "Set password" -msgstr "Configurar contrasinal" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Por favor corrixa o erro de abaixo." -msgstr[1] "Por favor corrixa o erro de abaixo." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Insira un novo contrasinal para o usuario %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Esta acción vai habilitar a autentificación basada en " -"contrasinal para este usuario." - -msgid "Disable password-based authentication" -msgstr "Deshabilitar a autentificación basada en contrasinal" - -msgid "Enable password-based authentication" -msgstr "Habilitar a autentificación basada en contrasinal" - -msgid "Skip to main content" -msgstr "Saltar ó contido principal" - -msgid "Welcome," -msgstr "Benvido," - -msgid "View site" -msgstr "Ver sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Rematar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Engadir %(name)s" - -msgid "History" -msgstr "Historial" - -msgid "View on site" -msgstr "Ver no sitio" - -msgid "Filter" -msgstr "Filtro" - -msgid "Hide counts" -msgstr "Agochar contas" - -msgid "Show counts" -msgstr "Amosar contas" - -msgid "Clear all filters" -msgstr "Borrar tódolos filtros" - -msgid "Remove from sorting" -msgstr "Eliminar da clasificación" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridade de clasificación: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Activar clasificación" - -msgid "Toggle theme (current theme: auto)" -msgstr "Escoller tema (tema actual: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Escoller tema (tema actual: claro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Escoller tema (tema actual: escuro)" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Borrar o %(object_name)s '%(escaped_object)s' resultaría na eliminación de " -"elementos relacionados, pero a súa conta non ten permiso para borrar os " -"seguintes tipos de elementos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Para borrar o obxecto %(object_name)s '%(escaped_object)s' requiriríase " -"borrar os seguintes obxectos protexidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Seguro que quere borrar o %(object_name)s \"%(escaped_object)s\"? " -"Eliminaranse os seguintes obxectos relacionados:" - -msgid "Objects" -msgstr "Obxectos" - -msgid "Yes, I’m sure" -msgstr "Sí, estou seguro" - -msgid "No, take me back" -msgstr "Non, lévame de volta" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples obxectos" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Borrar os obxectos %(objects_name)s seleccionados resultaría na eliminación " -"de obxectos relacionados, pero a súa conta non ten permiso para borrar os " -"seguintes tipos de obxecto:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Para borrar os obxectos %(objects_name)s relacionados requiriríase eliminar " -"os seguintes obxectos protexidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Está seguro de que quere borrar os obxectos %(objects_name)s seleccionados? " -"Serán eliminados todos os seguintes obxectos e elementos relacionados on " -"eles:" - -msgid "Delete?" -msgstr "¿Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Sumario" - -msgid "Recent actions" -msgstr "Accións recentes" - -msgid "My actions" -msgstr "As miñas accións" - -msgid "None available" -msgstr "Ningunha dispoñíbel" - -msgid "Added:" -msgstr "Engadido:" - -msgid "Changed:" -msgstr "Modificado:" - -msgid "Deleted:" -msgstr "Eliminado:" - -msgid "Unknown content" -msgstr "Contido descoñecido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Hai un problema coa súa instalación de base de datos. Asegúrese de que se " -"creasen as táboas axeitadas na base de datos, e de que o usuario apropiado " -"teña permisos para lela." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Está identificado como %(username)s, pero non está autorizado para acceder a " -"esta páxina. Gustaríalle identificarse con una conta diferente?" - -msgid "Forgotten your password or username?" -msgstr "¿Olvidou o usuario ou contrasinal?" - -msgid "Toggle navigation" -msgstr "Activar navegación" - -msgid "Sidebar" -msgstr "Barra lateral" - -msgid "Start typing to filter…" -msgstr "Comece a escribir para filtrar…" - -msgid "Filter navigation items" -msgstr "Filtrar ítems de navegación" - -msgid "Date/time" -msgstr "Data/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrada" -msgstr[1] "entradas" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Este obxecto non ten histórico de cambios. Posibelmente non se creou usando " -"este sitio de administración." - -msgid "Show all" -msgstr "Amosar todo" - -msgid "Save" -msgstr "Gardar" - -msgid "Popup closing…" -msgstr "Pechando popup…" - -msgid "Search" -msgstr "Busca" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado. " -msgstr[1] "%(counter)s resultados." - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s en total" - -msgid "Save as new" -msgstr "Gardar como novo" - -msgid "Save and add another" -msgstr "Gardar e engadir outro" - -msgid "Save and continue editing" -msgstr "Gardar e seguir modificando" - -msgid "Save and view" -msgstr "Gardar e ver" - -msgid "Close" -msgstr "Pechar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Cambiar %(model)s seleccionado" - -#, python-format -msgid "Add another %(model)s" -msgstr "Engadir outro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eliminar %(model)s seleccionado" - -#, python-format -msgid "View selected %(model)s" -msgstr "Ver %(model)s seleccionado" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Grazas polo tempo que dedicou ao sitio web." - -msgid "Log in again" -msgstr "Entrar de novo" - -msgid "Password change" -msgstr "Cambiar o contrasinal" - -msgid "Your password was changed." -msgstr "Cambiouse o seu contrasinal." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por razóns de seguridade, introduza o contrasinal actual, e despois " -"introduza o novo contrasinal dúas veces para verificar que o escribiu " -"correctamente." - -msgid "Change my password" -msgstr "Cambiar o contrasinal" - -msgid "Password reset" -msgstr "Recuperar o contrasinal" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"A túa clave foi gardada.\n" -"Xa podes entrar." - -msgid "Password reset confirmation" -msgstr "Confirmación de reseteo da contrasinal" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor insira a súa contrasinal dúas veces para que podamos verificar se " -"a escribiu correctamente." - -msgid "New password:" -msgstr "Contrasinal novo:" - -msgid "Confirm password:" -msgstr "Confirmar contrasinal:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"A ligazón de reseteo da contrasinal non é válida, posiblemente porque xa foi " -"usada. Por favor pida un novo reseteo da contrasinal." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Acabamos de enviarlle as instrucións para configurar o contrasinal ao " -"enderezo de email que nos indicou. Debería recibilas axiña." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se non recibe un email, por favor asegúrese de que escribiu a dirección ca " -"que se rexistrou, e comprobe a carpeta de spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Recibe este email porque solicitou restablecer o contrasinal para a súa " -"conta de usuario en %(site_name)s" - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor vaia á seguinte páxina e elixa una nova contrasinal:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "No caso de que o esquecese, o seu nome de usuario é:" - -msgid "Thanks for using our site!" -msgstr "Grazas por usar o noso sitio web!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "O equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Esqueceu o contrasinal? Insira o seu enderezo de email embaixo e " -"enviarémoslle as instrucións para configurar un novo." - -msgid "Email address:" -msgstr "Enderezo de correo electrónico:" - -msgid "Reset my password" -msgstr "Recuperar o meu contrasinal" - -msgid "Select all objects on this page for an action" -msgstr "Seleccione tódolos obxetos desta páxina para unha acción" - -msgid "All dates" -msgstr "Todas as datas" - -#, python-format -msgid "Select %s" -msgstr "Seleccione un/unha %s" - -#, python-format -msgid "Select %s to change" -msgstr "Seleccione %s que modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Seleccione %s para ver" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Procurar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Modificar:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0fcb774..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po deleted file mode 100644 index b414adc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,329 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# fasouto , 2011 -# fonso , 2011,2013 -# Jannis Leidel , 2011 -# Leandro Regueiro , 2013 -# X Bello , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: X Bello , 2023\n" -"Language-Team: Galician (http://app.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s dispoñíbeis" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta é unha lista de %s dispoñíbeis. Pode escoller algúns seleccionándoos na " -"caixa inferior e a continuación facendo clic na frecha \"Escoller\" situada " -"entre as dúas caixas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba nesta caixa para filtrar a lista de %s dispoñíbeis." - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Escoller todo" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Prema para escoller todos/as os/as '%s' dunha vez." - -msgid "Choose" -msgstr "Escoller" - -msgid "Remove" -msgstr "Retirar" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s escollido/a(s)" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta é a lista de %s escollidos/as. Pode eliminar algúns seleccionándoos na " -"caixa inferior e a continuación facendo clic na frecha \"Eliminar\" situada " -"entre as dúas caixas." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Escriba nesta caixa para filtrar a lista de %s seleccionados." - -msgid "Remove all" -msgstr "Retirar todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Faga clic para eliminar da lista todos/as os/as '%s' escollidos/as." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opción seleccionada non visible" -msgstr[1] "%s opcións seleccionadas non visibles" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s escollido" -msgstr[1] "%(sel)s de %(cnt)s escollidos" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tes cambios sen guardar en campos editables individuales. Se executas unha " -"acción, os cambios non gardados perderanse." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Escolleu unha acción, pero aínda non gardou os cambios nos campos " -"individuais. Prema OK para gardar. Despois terá que volver executar a acción." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Escolleu unha acción, pero aínda non gardou os cambios nos campos " -"individuais. Probablemente estea buscando o botón Ir no canto do botón " -"Gardar." - -msgid "Now" -msgstr "Agora" - -msgid "Midnight" -msgstr "Medianoite" - -msgid "6 a.m." -msgstr "6 da mañá" - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 da tarde" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Está %s hora por diante da hora do servidor." -msgstr[1] "Nota: Está %s horas por diante da hora do servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Está %s hora por detrás da hora do servidor." -msgstr[1] "Nota: Está %s horas por detrás da hora do servidor." - -msgid "Choose a Time" -msgstr "Escolla unha Hora" - -msgid "Choose a time" -msgstr "Escolla unha hora" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoxe" - -msgid "Choose a Date" -msgstr "Escolla unha Data" - -msgid "Yesterday" -msgstr "Onte" - -msgid "Tomorrow" -msgstr "Mañá" - -msgid "January" -msgstr "Xaneiro" - -msgid "February" -msgstr "Febreiro" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Xuño" - -msgid "July" -msgstr "Xullo" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Decembro" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Xan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maio" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Xuñ" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Xul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Set" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Out" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Monday" -msgstr "Luns" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Mércores" - -msgid "Thursday" -msgstr "Xoves" - -msgid "Friday" -msgstr "Venres" - -msgid "Saturday" -msgstr "Sábado" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Domingo" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Lun" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Mér" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Xov" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Ven" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sáb" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "X" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Amosar" - -msgid "Hide" -msgstr "Esconder" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index 57f340c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index bb85402..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,780 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 534b44a19bf18d20b71ecc4eb77c572f_db336e9 , 2011 -# Jannis Leidel , 2011 -# Meir Kriheli , 2011-2015,2017,2019-2020,2023,2025 -# Menachem G., 2021 -# Yaron Shahrabani , 2020-2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Meir Kriheli , " -"2011-2015,2017,2019-2020,2023,2025\n" -"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "מחק %(verbose_name_plural)s שנבחרו" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s נמחקו בהצלחה." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "לא ניתן למחוק %(name)s" - -msgid "Delete multiple objects" -msgstr "מחק כמה פריטים" - -msgid "Administration" -msgstr "ניהול" - -msgid "All" -msgstr "הכול" - -msgid "Yes" -msgstr "כן" - -msgid "No" -msgstr "לא" - -msgid "Unknown" -msgstr "לא ידוע" - -msgid "Any date" -msgstr "כל תאריך" - -msgid "Today" -msgstr "היום" - -msgid "Past 7 days" -msgstr "בשבוע האחרון" - -msgid "This month" -msgstr "החודש" - -msgid "This year" -msgstr "השנה" - -msgid "No date" -msgstr "ללא תאריך" - -msgid "Has date" -msgstr "עם תאריך" - -msgid "Empty" -msgstr "ריק" - -msgid "Not empty" -msgstr "לא ריק" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"נא להזין את %(username)s והסיסמה הנכונים לחשבון איש צוות. נא לשים לב כי שני " -"השדות רגישים לאותיות גדולות/קטנות." - -msgid "Action:" -msgstr "פעולה" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "הוספת %(verbose_name)s" - -msgid "Remove" -msgstr "להסיר" - -msgid "Addition" -msgstr "הוספה" - -msgid "Change" -msgstr "שינוי" - -msgid "Deletion" -msgstr "מחיקה" - -msgid "action time" -msgstr "זמן פעולה" - -msgid "user" -msgstr "משתמש" - -msgid "content type" -msgstr "סוג תוכן" - -msgid "object id" -msgstr "מזהה אובייקט" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ייצוג אובייקט" - -msgid "action flag" -msgstr "דגל פעולה" - -msgid "change message" -msgstr "הערה לשינוי" - -msgid "log entry" -msgstr "רישום יומן" - -msgid "log entries" -msgstr "רישומי יומן" - -#, python-format -msgid "Added “%(object)s”." -msgstr "„%(object)s” נוסף." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "בוצע שינוי \"%(object)s\" — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "„%(object)s” נמחקו." - -msgid "LogEntry Object" -msgstr "אובייקט LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "בוצעה הוספת {name} “{object}”." - -msgid "Added." -msgstr "נוסף." - -msgid "and" -msgstr "ו" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "בוצע שינוי {fields} עבור {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr " {fields} שונו." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "בוצעה מחיקת {name} “{object}”." - -msgid "No fields changed." -msgstr "אף שדה לא השתנה." - -msgid "None" -msgstr "ללא" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "יש להחזיק \"Control\" או \"Command\" במק, כדי לבחור יותר מאחד." - -msgid "Select this object for an action - {}" -msgstr "בחירת אובייקט זה עבור פעולה - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "הוספת {name} “{obj}” בוצעה בהצלחה." - -msgid "You may edit it again below." -msgstr "ניתן לערוך שוב מתחת." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "הוספת {name} “{obj}” בוצעה בהצלחה. ניתן להוסיף עוד {name} מתחת." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "שינוי {name} “{obj}” בוצע בהצלחה. ניתן לערוך שוב מתחת." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "עדכון {name} \"{obj}\" בוצע בהצלחה. ניתן להוסיף עוד {name} מתחת." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "שינוי {name} \"{obj}\" בוצע בהצלחה." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "יש לסמן פריטים כדי לבצע עליהם פעולות. לא שונו פריטים." - -msgid "No action selected." -msgstr "לא נבחרה פעולה." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "מחיקת %(name)s “%(obj)s” בוצעה בהצלחה." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s עם ID \"%(key)s\" לא במצאי. אולי זה נמחק?" - -#, python-format -msgid "Add %s" -msgstr "הוספת %s" - -#, python-format -msgid "Change %s" -msgstr "שינוי %s" - -#, python-format -msgid "View %s" -msgstr "צפיה ב%s" - -msgid "Database error" -msgstr "שגיאת בסיס נתונים" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "שינוי %(count)s %(name)s בוצע בהצלחה." -msgstr[1] "שינוי %(count)s %(name)s בוצע בהצלחה." -msgstr[2] "שינוי %(count)s %(name)s בוצע בהצלחה." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s נבחר" -msgstr[1] "כל ה־%(total_count)s נבחרו" -msgstr[2] "כל ה־%(total_count)s נבחרו" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 מ %(cnt)s נבחרים" - -msgid "Delete" -msgstr "מחיקה" - -#, python-format -msgid "Change history: %s" -msgstr "היסטוריית שינוי: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"מחיקת %(class_name)s %(instance)s תדרוש מחיקת האובייקטים הקשורים והמוגנים " -"הבאים: %(related_objects)s" - -msgid "Django site admin" -msgstr "ניהול אתר Django" - -msgid "Django administration" -msgstr "ניהול Django" - -msgid "Site administration" -msgstr "ניהול אתר" - -msgid "Log in" -msgstr "כניסה" - -#, python-format -msgid "%(app)s administration" -msgstr "ניהול %(app)s" - -msgid "Page not found" -msgstr "דף לא קיים" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "אנו מתנצלים, העמוד המבוקש אינו קיים." - -msgid "Home" -msgstr "דף הבית" - -msgid "Server error" -msgstr "שגיאת שרת" - -msgid "Server error (500)" -msgstr "שגיאת שרת (500)" - -msgid "Server Error (500)" -msgstr "שגיאת שרת (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"התרחשה שגיאה. היא דווחה למנהלי האתר בדוא\"ל ותתוקן בקרוב. תודה על סבלנותך." - -msgid "Run the selected action" -msgstr "הפעל את הפעולה שבחרת בה." - -msgid "Go" -msgstr "בצע" - -msgid "Click here to select the objects across all pages" -msgstr "לחיצה כאן תבחר את האובייקטים בכל העמודים" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "בחירת כל %(total_count)s ה־%(module_name)s" - -msgid "Clear selection" -msgstr "איפוס בחירה" - -msgid "Breadcrumbs" -msgstr "פירורי לחם" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "מודלים ביישום %(name)s" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "הוספה" - -msgid "View" -msgstr "צפיה" - -msgid "You don’t have permission to view or edit anything." -msgstr "אין לך כלל הרשאות צפיה או עריכה." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "שינוי סיסמה" - -msgid "Set password" -msgstr "קביעת סיסמה" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "נא לתקן את השגיאה מתחת." -msgstr[1] "נא לתקן את השגיאות מתחת." -msgstr[2] "נא לתקן את השגיאות מתחת." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "יש להזין סיסמה חדשה עבור המשתמש %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"פעולה זו תאפשר אימות מבוסס סיסמה עבור משתמש זה.\n" -" " - -msgid "Disable password-based authentication" -msgstr "השבת אימות מבוסס סיסמה" - -msgid "Enable password-based authentication" -msgstr "אפשר אימות מבוסס סיסמה" - -msgid "Skip to main content" -msgstr "דילוג לתוכן העיקרי" - -msgid "Welcome," -msgstr "שלום," - -msgid "View site" -msgstr "צפיה באתר" - -msgid "Documentation" -msgstr "תיעוד" - -msgid "Log out" -msgstr "יציאה" - -#, python-format -msgid "Add %(name)s" -msgstr "הוספת %(name)s" - -msgid "History" -msgstr "היסטוריה" - -msgid "View on site" -msgstr "צפיה באתר" - -msgid "Filter" -msgstr "סינון" - -msgid "Hide counts" -msgstr "הסתרת ספירות" - -msgid "Show counts" -msgstr "הצגת ספירות" - -msgid "Clear all filters" -msgstr "ניקוי כל הסינונים" - -msgid "Remove from sorting" -msgstr "הסרה ממיון" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "עדיפות מיון: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "החלף כיוון מיון" - -msgid "Toggle theme (current theme: auto)" -msgstr "החלפת ערכת נושא (נוכחית: אוטומטית)" - -msgid "Toggle theme (current theme: light)" -msgstr "החלפת ערכת נושא (נוכחית: בהירה)" - -msgid "Toggle theme (current theme: dark)" -msgstr "החלפת ערכת נושא (נוכחית: כהה)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"מחיקת %(object_name)s '%(escaped_object)s' מצריכה מחיקת אובייקטים מקושרים, " -"אך לחשבון שלך אין הרשאות למחיקת סוגי האובייקטים הבאים:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"מחיקת ה%(object_name)s '%(escaped_object)s' תדרוש מחיקת האובייקטים הקשורים " -"והמוגנים הבאים:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"האם ברצונך למחוק את %(object_name)s \"%(escaped_object)s\"? כל הפריטים " -"הקשורים הבאים יימחקו:" - -msgid "Objects" -msgstr "אובייקטים" - -msgid "Yes, I’m sure" -msgstr "כן, בבטחה" - -msgid "No, take me back" -msgstr "לא, קח אותי חזרה." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"מחיקת ב%(objects_name)s הנבחרת תביא במחיקת אובייקטים קשורים, אבל החשבון שלך " -"אינו הרשאה למחוק את הסוגים הבאים של אובייקטים:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"מחיקת ה%(objects_name)s אשר סימנת תדרוש מחיקת האובייקטים הקשורים והמוגנים " -"הבאים:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"האם אתה בטוח שאתה רוצה למחוק את ה%(objects_name)s הנבחר? כל האובייקטים הבאים " -"ופריטים הקשורים להם יימחקו:" - -msgid "Delete?" -msgstr "מחיקה ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " לפי %(filter_title)s " - -msgid "Summary" -msgstr "סיכום" - -msgid "Recent actions" -msgstr "פעולות אחרונות" - -msgid "My actions" -msgstr "הפעולות שלי" - -msgid "None available" -msgstr "לא נמצאו" - -msgid "Added:" -msgstr "נוספו:" - -msgid "Changed:" -msgstr "שונו:" - -msgid "Deleted:" -msgstr "נמחקו:" - -msgid "Unknown content" -msgstr "תוכן לא ידוע" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"משהו שגוי בהתקנת בסיס הנתונים שלך. יש לוודא יצירת הטבלאות המתאימות וקיום " -"הרשאות קריאה על בסיס הנתונים עבור המשתמש המתאים." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"התחברת בתור %(username)s, אך אין לך הרשאות גישה לעמוד זה. האם ברצונך להתחבר " -"בתור משתמש אחר?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "החלפת מצב סרגל ניווט" - -msgid "Sidebar" -msgstr "סרגל צד" - -msgid "Start typing to filter…" -msgstr "התחל להקליד כדי לסנן..." - -msgid "Filter navigation items" -msgstr "סנן פריטי ניווט" - -msgid "Date/time" -msgstr "תאריך/שעה" - -msgid "User" -msgstr "משתמש" - -msgid "Action" -msgstr "פעולה" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "רשומה" -msgstr[1] "רשומה" -msgstr[2] "רשומות" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "לאובייקט זה אין היסטוריית שינויים. כנראה לא נוסף דרך ממשק הניהול." - -msgid "Show all" -msgstr "הצג הכל" - -msgid "Save" -msgstr "שמירה" - -msgid "Popup closing…" -msgstr "חלון צץ נסגר..." - -msgid "Search" -msgstr "חיפוש" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "תוצאה %(counter)s" -msgstr[1] "%(counter)s תוצאות" -msgstr[2] "%(counter)s תוצאות" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s סה\"כ" - -msgid "Save as new" -msgstr "שמירה כחדש" - -msgid "Save and add another" -msgstr "שמירה והוספת אחר" - -msgid "Save and continue editing" -msgstr "שמירה והמשך עריכה" - -msgid "Save and view" -msgstr "שמירה וצפיה" - -msgid "Close" -msgstr "סגירה" - -#, python-format -msgid "Change selected %(model)s" -msgstr "שינוי %(model)s הנבחר." - -#, python-format -msgid "Add another %(model)s" -msgstr "הוספת %(model)s נוסף." - -#, python-format -msgid "Delete selected %(model)s" -msgstr "מחיקת %(model)s הנבחר." - -#, python-format -msgid "View selected %(model)s" -msgstr "צפיה ב%(model)s אשר נבחרו." - -msgid "Thanks for spending some quality time with the web site today." -msgstr "תודה על בילוי זמן איכות עם האתר." - -msgid "Log in again" -msgstr "התחבר/י שוב" - -msgid "Password change" -msgstr "שינוי סיסמה" - -msgid "Your password was changed." -msgstr "סיסמתך שונתה." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"נא להזין את הססמה הישנה שלך, למען האבטחה, ולאחר מכן את הססמה החדשה שלך " -"פעמיים כדי שנוכל לוודא שהקלדת אותה נכון." - -msgid "Change my password" -msgstr "שנה את סיסמתי" - -msgid "Password reset" -msgstr "איפוס סיסמה" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "ססמתך נשמרה. כעת ניתן להתחבר." - -msgid "Password reset confirmation" -msgstr "אימות איפוס סיסמה" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "נא להזין את סיסמתך החדשה פעמיים כדי שנוכל לוודא שהקלדת אותה כראוי." - -msgid "New password:" -msgstr "סיסמה חדשה:" - -msgid "Confirm password:" -msgstr "אימות סיסמה:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"הקישור לאיפוס הסיסמה אינו חוקי. ייתכן והשתמשו בו כבר. נא לבקש איפוס סיסמה " -"חדש." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"שלחנו לך הוראות לקביעת הססמה, בהנחה שקיים חשבון עם כתובת הדואר האלקטרוני " -"שהזנת. ההוראות אמורות להתקבל בקרוב." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"אם לא קיבלת דואר אלקטרוני, נא לוודא שהזנת את הכתובת שנרשמת עימה ושההודעה לא " -"נחתה בתיקיית דואר הזבל." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"הודעה זו נשלחה אליך עקב בקשתך לאיפוס הסיסמה עבור המשתמש שלך באתר " -"%(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "נא להגיע לעמוד הבא ולבחור סיסמה חדשה:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "תודה על השימוש באתר שלנו!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "צוות %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"שכחת את הססמה שלך? נא להזין את כתובת הדואר האלקטרוני מתחת ואנו נשלח הוראות " -"לקביעת ססמה חדשה." - -msgid "Email address:" -msgstr "כתובת דוא\"ל:" - -msgid "Reset my password" -msgstr "אפס את סיסמתי" - -msgid "Select all objects on this page for an action" -msgstr "בחירת כל האובייקטים בעמוד זה עבור פעולה" - -msgid "All dates" -msgstr "כל התאריכים" - -#, python-format -msgid "Select %s" -msgstr "בחירת %s" - -#, python-format -msgid "Select %s to change" -msgstr "בחירת %s לשינוי" - -#, python-format -msgid "Select %s to view" -msgstr "בחירת %s לצפיה" - -msgid "Date:" -msgstr "תאריך:" - -msgid "Time:" -msgstr "שעה:" - -msgid "Lookup" -msgstr "חפש" - -msgid "Currently:" -msgstr "נוכחי:" - -msgid "Change:" -msgstr "שינוי:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 265d261..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1946efc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,334 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 534b44a19bf18d20b71ecc4eb77c572f_db336e9 , 2012 -# Jannis Leidel , 2011 -# Meir Kriheli , 2011-2012,2014-2015,2017,2020,2023 -# Yaron Shahrabani , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Meir Kriheli , " -"2011-2012,2014-2015,2017,2020,2023\n" -"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -#, javascript-format -msgid "Available %s" -msgstr "אפשרויות %s זמינות" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"זו רשימת %s הזמינים לבחירה. ניתן לבחור חלק ע\"י סימון בתיבה מתחת ולחיצה על " -"חץ \"בחר\" בין שתי התיבות." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "ניתן להקליד בתיבה זו כדי לסנן %s." - -msgid "Filter" -msgstr "סינון" - -msgid "Choose all" -msgstr "בחירת הכל" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "בחירת כל ה%s בבת אחת." - -msgid "Choose" -msgstr "בחר" - -msgid "Remove" -msgstr "הסרה" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s אשר נבחרו" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"זו רשימת %s אשר נבחרו. ניתן להסיר חלק ע\"י בחירה בתיבה מתחת ולחיצה על חץ " -"\"הסרה\" בין שתי התיבות." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "ניתן להקליד בתיבה זו כדי לסנן את רשימת %s הנבחרים." - -msgid "Remove all" -msgstr "הסרת הכל" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "הסרת כל %s אשר נבחרו בבת אחת." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "אפשרות נבחרת %s אינה גלויה." -msgstr[1] "%s אפשרויות נבחרות אינן גלויות." -msgstr[2] "%s אפשרויות נבחרות אינן גלויות." -msgstr[3] "%s אפשרויות נבחרות אינן גלויות." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s מ %(cnt)s נבחרות" -msgstr[1] "%(sel)s מ %(cnt)s נבחרות" -msgstr[2] "%(sel)s מ %(cnt)s נבחרות" -msgstr[3] "%(sel)s מ %(cnt)s נבחרות" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"יש לך שינויים שלא נשמרו על שדות יחידות. אם אתה מפעיל פעולה, שינויים שלא " -"נשמרו יאבדו." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"בחרת פעולה, אך לא שמרת עדיין את השינויים לשדות בודדים. נא ללחוץ על אישור כדי " -"לשמור. יהיה עליך להפעיל את הפעולה עוד פעם." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"בחרת פעולה, אך לא ביצעת שינויים בשדות. כנראה חיפשת את כפתור בצע במקום כפתור " -"שמירה." - -msgid "Now" -msgstr "כעת" - -msgid "Midnight" -msgstr "חצות" - -msgid "6 a.m." -msgstr "6 בבוקר" - -msgid "Noon" -msgstr "12 בצהריים" - -msgid "6 p.m." -msgstr "6 אחר הצהריים" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "הערה: את/ה %s שעה לפני זמן השרת." -msgstr[1] "הערה: את/ה %s שעות לפני זמן השרת." -msgstr[2] "הערה: את/ה %s שעות לפני זמן השרת." -msgstr[3] "הערה: את/ה %s שעות לפני זמן השרת." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "הערה: את/ה %s שעה אחרי זמן השרת." -msgstr[1] "הערה: את/ה %s שעות אחרי זמן השרת." -msgstr[2] "הערה: את/ה %s שעות אחרי זמן השרת." -msgstr[3] "הערה: את/ה %s שעות אחרי זמן השרת." - -msgid "Choose a Time" -msgstr "בחירת שעה" - -msgid "Choose a time" -msgstr "בחירת שעה" - -msgid "Cancel" -msgstr "ביטול" - -msgid "Today" -msgstr "היום" - -msgid "Choose a Date" -msgstr "בחירת תאריך" - -msgid "Yesterday" -msgstr "אתמול" - -msgid "Tomorrow" -msgstr "מחר" - -msgid "January" -msgstr "ינואר" - -msgid "February" -msgstr "פברואר" - -msgid "March" -msgstr "מרץ" - -msgid "April" -msgstr "אפריל" - -msgid "May" -msgstr "מאי" - -msgid "June" -msgstr "יוני" - -msgid "July" -msgstr "יולי" - -msgid "August" -msgstr "אוגוסט" - -msgid "September" -msgstr "ספטמבר" - -msgid "October" -msgstr "אוקטובר" - -msgid "November" -msgstr "נובמבר" - -msgid "December" -msgstr "דצמבר" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "ינו׳" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "פבר׳" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "מרץ" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "אפר׳" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "מאי" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "יונ׳" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "יול׳" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "אוג׳" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "ספט׳" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "אוק׳" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "נוב׳" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "דצמ׳" - -msgid "Sunday" -msgstr "ראשון" - -msgid "Monday" -msgstr "שני" - -msgid "Tuesday" -msgstr "שלישי" - -msgid "Wednesday" -msgstr "רביעי" - -msgid "Thursday" -msgstr "חמישי" - -msgid "Friday" -msgstr "שישי" - -msgid "Saturday" -msgstr "שבת" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "א" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "ב" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "ג" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "ד" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "ה" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "ו" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "ש" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "א" - -msgctxt "one letter Monday" -msgid "M" -msgstr "ב" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "ג" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "ד" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "ה" - -msgctxt "one letter Friday" -msgid "F" -msgstr "ו" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "ש" - -msgid "Show" -msgstr "הצג" - -msgid "Hide" -msgstr "הסתר" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index a2c4c7d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index 5193539..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,706 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# alkuma , 2013 -# Chandan kumar , 2012 -# Jannis Leidel , 2011 -# Pratik , 2013 -# Sandeep Satavlekar , 2011 -# Vaarun Sinha, 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Vaarun Sinha\n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "चुने हुए %(verbose_name_plural)s हटा दीजिये " - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s सफलतापूर्वक हटा दिया गया है |" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s नहीं हटा सकते" - -msgid "Are you sure?" -msgstr "क्या आप निश्चित हैं?" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "सभी" - -msgid "Yes" -msgstr "हाँ" - -msgid "No" -msgstr "नहीं" - -msgid "Unknown" -msgstr "अनजान" - -msgid "Any date" -msgstr "कोई भी तारीख" - -msgid "Today" -msgstr "आज" - -msgid "Past 7 days" -msgstr "पिछले 7 दिन" - -msgid "This month" -msgstr "इस महीने" - -msgid "This year" -msgstr "इस साल" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -msgid "Empty" -msgstr "" - -msgid "Not empty" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"कृपया कर्मचारी खाते का सही %(username)s व कूटशब्द भरें। भरते समय दीर्घाक्षर और लघु अक्षर " -"का खयाल रखें।" - -msgid "Action:" -msgstr " क्रिया:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "एक और %(verbose_name)s जोड़ें " - -msgid "Remove" -msgstr "निकालें" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "बदलें" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "कार्य के लिए समय" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "वस्तु की आईडी " - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "वस्तु का निरूपण" - -msgid "action flag" -msgstr "कार्य ध्वज" - -msgid "change message" -msgstr "परिवर्तन सन्देश" - -msgid "log entry" -msgstr "लॉग प्रविष्टि" - -msgid "log entries" -msgstr "लॉग प्रविष्टियाँ" - -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "LogEntry ऑब्जेक्ट" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "और" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "कोई क्षेत्र नहीं बदला" - -msgid "None" -msgstr "कोई नहीं" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "कार्रवाई हेतु आयटम सही अनुक्रम में चुने जाने चाहिए | कोई आइटम नहीं बदले गये हैं." - -msgid "No action selected." -msgstr "कोई कार्रवाई नहीं चुनी है |" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s बढाएं" - -#, python-format -msgid "Change %s" -msgstr "%s बदलो" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "डेटाबेस त्रुटि" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s का परिवर्तन कामयाब हुआ |" -msgstr[1] "%(count)s %(name)s का परिवर्तन कामयाब हुआ |" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s चुने" -msgstr[1] "सभी %(total_count)s चुने " - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s में से 0 चुने" - -#, python-format -msgid "Change history: %s" -msgstr "इतिहास बदलो: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ज्याँगो साइट प्रशासन" - -msgid "Django administration" -msgstr "ज्याँगो प्रशासन" - -msgid "Site administration" -msgstr "साइट प्रशासन" - -msgid "Log in" -msgstr "लॉगिन" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "पृष्ठ लापता" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "गृह" - -msgid "Server error" -msgstr "सर्वर त्रुटि" - -msgid "Server error (500)" -msgstr "सर्वर त्रुटि (500)" - -msgid "Server Error (500)" -msgstr "सर्वर त्रुटि (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "चयनित कार्रवाई चलाइये" - -msgid "Go" -msgstr "आगे बढ़े" - -msgid "Click here to select the objects across all pages" -msgstr "सभी पृष्ठों पर मौजूद वस्तुओं को चुनने के लिए यहाँ क्लिक करें " - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "तमाम %(total_count)s %(module_name)s चुनें" - -msgid "Clear selection" -msgstr "चयन खालिज किया जाये " - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s अनुप्रयोग के प्रतिरूप" - -msgid "Add" -msgstr "बढाएं" - -msgid "View" -msgstr "" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "उपयोगकर्ता का नाम और कूटशब्द दर्ज करें." - -msgid "Change password" -msgstr "पासवर्ड बदलें" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s प्रवोक्ता के लिए नयी कूटशब्द दर्ज करें ।" - -msgid "Welcome," -msgstr "आपका स्वागत है," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "दस्तावेज़ीकरण" - -msgid "Log out" -msgstr "लॉग आउट" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s बढाएं" - -msgid "History" -msgstr "इतिहास" - -msgid "View on site" -msgstr "साइट पे देखें" - -msgid "Filter" -msgstr "छन्नी" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "श्रेणीकरण से हटाये " - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "श्रेणीकरण प्राथमिकता : %(priority_number)s" - -msgid "Toggle sorting" -msgstr "टॉगल श्रेणीकरण" - -msgid "Delete" -msgstr "मिटाएँ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' को मिटाने पर सम्बंधित वस्तुएँ भी मिटा दी " -"जाएगी, परन्तु आप के खाते में निम्नलिखित प्रकार की वस्तुओं को मिटाने की अनुमति नहीं हैं |" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' को हटाने के लिए उनसे संबंधित निम्नलिखित " -"संरक्षित वस्तुओं को हटाने की आवश्यकता होगी:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"क्या आप %(object_name)s \"%(escaped_object)s\" हटाना चाहते हैं? निम्नलिखित सभी " -"संबंधित वस्तुएँ नष्ट की जाएगी" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "अनेक वस्तुएं हटाएँ" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"चयनित %(objects_name)s हटाने पर उस से सम्बंधित वस्तुएं भी हट जाएगी, परन्तु आपके खाते में " -"वस्तुओं के निम्नलिखित प्रकार हटाने की अनुमति नहीं है:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"चयनित %(objects_name)s को हटाने के पश्चात् निम्नलिखित संरक्षित संबंधित वस्तुओं को हटाने " -"की आवश्यकता होगी |" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"क्या आप ने पक्का तय किया हैं की चयनित %(objects_name)s को नष्ट किया जाये ? " -"निम्नलिखित सभी वस्तुएं और उनसे सम्बंधित वस्तुए भी नष्ट की जाएगी:" - -msgid "Delete?" -msgstr "मिटाएँ ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s द्वारा" - -msgid "Summary" -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr " कोई भी उपलब्ध नहीं" - -msgid "Unknown content" -msgstr "अज्ञात सामग्री" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "अपना पासवर्ड या उपयोगकर्ता नाम भूल गये हैं?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "तिथि / समय" - -msgid "User" -msgstr "उपभोक्ता" - -msgid "Action" -msgstr "कार्य" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "सभी दिखाएँ" - -msgid "Save" -msgstr "सुरक्षित कीजिये" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "खोज" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s परिणाम" -msgstr[1] "%(counter)s परिणाम" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s कुल परिणाम" - -msgid "Save as new" -msgstr "नये सा सहेजें" - -msgid "Save and add another" -msgstr "सहेजें और एक और जोडें" - -msgid "Save and continue editing" -msgstr "सहेजें और संपादन करें" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "फिर से लॉगिन कीजिए" - -msgid "Password change" -msgstr "कूटशब्द बदलें" - -msgid "Your password was changed." -msgstr "आपके कूटशब्द को बदला गया है" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "कूटशब्द बदलें" - -msgid "Password reset" -msgstr "कूटशब्द पुनस्थाप" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "आपके कूटशब्द को स्थापित किया गया है । अब आप लॉगिन कर सकते है ।" - -msgid "Password reset confirmation" -msgstr "कूटशब्द पुष्टि" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "कृपया आपके नये कूटशब्द को दो बार दर्ज करें ताकि हम उसकी सत्याप्ती कर सकते है ।" - -msgid "New password:" -msgstr "नया कूटशब्द " - -msgid "Confirm password:" -msgstr "कूटशब्द पुष्टि कीजिए" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"कूटशब्द पुनस्थाप संपर्क अमान्य है, संभावना है कि उसे उपयोग किया गया है। कृपया फिर से कूटशब्द " -"पुनस्थाप की आवेदन करें ।" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"आपको यह डाक इसलिए आई है क्योंकि आप ने %(site_name)s पर अपने खाते का कूटशब्द बदलने का " -"अनुरोध किया था |" - -msgid "Please go to the following page and choose a new password:" -msgstr "कृपया निम्नलिखित पृष्ठ पर नया कूटशब्द चुनिये :" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "हमारे साइट को उपयोग करने के लिए धन्यवाद ।" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s दल" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "डाक पता -" - -msgid "Reset my password" -msgstr " मेरे कूटशब्द की पुनःस्थापना" - -msgid "All dates" -msgstr "सभी तिथियों" - -#, python-format -msgid "Select %s" -msgstr "%s चुनें" - -#, python-format -msgid "Select %s to change" -msgstr "%s के बदली के लिए चयन करें" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "तिथि:" - -msgid "Time:" -msgstr "समय:" - -msgid "Lookup" -msgstr "लुक अप" - -msgid "Currently:" -msgstr "फ़िलहाल - " - -msgid "Change:" -msgstr "बदलाव -" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo deleted file mode 100644 index bb755ad..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po deleted file mode 100644 index 78b49e7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,217 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chandan kumar , 2012 -# Jannis Leidel , 2011 -# Sandeep Satavlekar , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "उपलब्ध %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"यह उपलब्ध %s की सूची है. आप उन्हें नीचे दिए गए बॉक्स में से चयन करके कुछ को चुन सकते हैं और " -"उसके बाद दो बॉक्स के बीच \"चुनें\" तीर पर क्लिक करें." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "इस बॉक्स में टाइप करने के लिए नीचे उपलब्ध %s की सूची को फ़िल्टर करें." - -msgid "Filter" -msgstr "छानना" - -msgid "Choose all" -msgstr "सभी चुनें" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "एक ही बार में सभी %s को चुनने के लिए क्लिक करें." - -msgid "Choose" -msgstr "चुनें" - -msgid "Remove" -msgstr "हटाना" - -#, javascript-format -msgid "Chosen %s" -msgstr "चुनें %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"यह उपलब्ध %s की सूची है. आप उन्हें नीचे दिए गए बॉक्स में से चयन करके कुछ को हटा सकते हैं और " -"उसके बाद दो बॉक्स के बीच \"हटायें\" तीर पर क्लिक करें." - -msgid "Remove all" -msgstr "सभी को हटाएँ" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "एक ही बार में सभी %s को हटाने के लिए क्लिक करें." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s में से %(sel)s चुना गया हैं" -msgstr[1] "%(cnt)s में से %(sel)s चुने गए हैं" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में किये हुए बदल अभी रक्षित नहीं हैं | अगर आप कुछ कार्रवाई " -"करते हो तो वे खो जायेंगे |" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"आप ने कार्रवाई तो चुनी हैं, पर स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में किये हुए बदल अभी सुरक्षित " -"नहीं किये हैं| उन्हें सुरक्षित करने के लिए कृपया 'ओके' क्लिक करे | आप को चुनी हुई कार्रवाई " -"दोबारा चलानी होगी |" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"आप ने कार्रवाई चुनी हैं, और आप ने स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में बदल नहीं किये हैं| " -"संभवतः 'सेव' बटन के बजाय आप 'गो' बटन ढून्ढ रहे हो |" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "अब" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "एक समय चुनें" - -msgid "Midnight" -msgstr "मध्यरात्री" - -msgid "6 a.m." -msgstr "सुबह 6 बजे" - -msgid "Noon" -msgstr "दोपहर" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "रद्द करें" - -msgid "Today" -msgstr "आज" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "कल (बीता)" - -msgid "Tomorrow" -msgstr "कल" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "दिखाओ" - -msgid "Hide" -msgstr " छिपाओ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index eb87cd1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index b919286..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,716 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# aljosa , 2011,2013 -# Bojan Mihelač , 2012 -# Filip Cuk , 2016 -# Goran Zugelj , 2018 -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2013,2015-2016 -# Ylodi , 2015 -# Vedran Linić , 2019 -# Ylodi , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-19 06:44+0000\n" -"Last-Translator: Vedran Linić \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Uspješno izbrisano %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nije moguće izbrisati %(name)s" - -msgid "Are you sure?" -msgstr "Jeste li sigurni?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Izbrišite odabrane %(verbose_name_plural)s" - -msgid "Administration" -msgstr "Administracija" - -msgid "All" -msgstr "Svi" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Nepoznat pojam" - -msgid "Any date" -msgstr "Bilo koji datum" - -msgid "Today" -msgstr "Danas" - -msgid "Past 7 days" -msgstr "Prošlih 7 dana" - -msgid "This month" -msgstr "Ovaj mjesec" - -msgid "This year" -msgstr "Ova godina" - -msgid "No date" -msgstr "Nema datuma" - -msgid "Has date" -msgstr "Ima datum" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Molimo unesite ispravno %(username)s i lozinku za pristup. Imajte na umu da " -"oba polja mogu biti velika i mala slova." - -msgid "Action:" -msgstr "Akcija:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dodaj još jedan %(verbose_name)s" - -msgid "Remove" -msgstr "Ukloni" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "Promijeni" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "vrijeme akcije" - -msgid "user" -msgstr "korisnik" - -msgid "content type" -msgstr "tip sadržaja" - -msgid "object id" -msgstr "id objekta" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr objekta" - -msgid "action flag" -msgstr "oznaka akcije" - -msgid "change message" -msgstr "promijeni poruku" - -msgid "log entry" -msgstr "zapis" - -msgid "log entries" -msgstr "zapisi" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Dodano \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Promijenjeno \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Obrisano \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Log zapis" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "Dodano." - -msgid "and" -msgstr "i" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Nije bilo promjena polja." - -msgid "None" -msgstr "Nijedan" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Držite \"Control\" ili \"Command\" na Mac-u kako bi odabrali više od jednog " -"objekta. " - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Unosi moraju biti odabrani da bi se nad njima mogle izvršiti akcije. Nijedan " -"unos nije promijenjen." - -msgid "No action selected." -msgstr "Nije odabrana akcija." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" uspješno izbrisan." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Novi unos (%s)" - -#, python-format -msgid "Change %s" -msgstr "Promijeni %s" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "Pogreška u bazi" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s uspješno promijenjen." -msgstr[1] "%(count)s %(name)s uspješno promijenjeno." -msgstr[2] "%(count)s %(name)s uspješno promijenjeno." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s odabrano" -msgstr[1] "Svih %(total_count)s odabrano" -msgstr[2] "Svih %(total_count)s odabrano" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 od %(cnt)s odabrano" - -#, python-format -msgid "Change history: %s" -msgstr "Promijeni povijest: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Brisanje %(class_name)s %(instance)s bi zahtjevalo i brisanje sljedećih " -"zaštićenih povezanih objekata: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administracija stranica" - -msgid "Django administration" -msgstr "Django administracija" - -msgid "Site administration" -msgstr "Administracija stranica" - -msgid "Log in" -msgstr "Prijavi se" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administracija" - -msgid "Page not found" -msgstr "Stranica nije pronađena" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Ispričavamo se, ali tražena stranica nije pronađena." - -msgid "Home" -msgstr "Početna" - -msgid "Server error" -msgstr "Greška na serveru" - -msgid "Server error (500)" -msgstr "Greška na serveru (500)" - -msgid "Server Error (500)" -msgstr "Greška na serveru (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Dogodila se greška. Administratori su obaviješteni putem elektroničke pošte " -"te bi greška uskoro trebala biti ispravljena. Hvala na strpljenju." - -msgid "Run the selected action" -msgstr "Izvrši odabranu akciju" - -msgid "Go" -msgstr "Idi" - -msgid "Click here to select the objects across all pages" -msgstr "Klikni ovdje da bi odabrao unose kroz sve stranice" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Odaberi svih %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Očisti odabir" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Prvo, unesite korisničko ime i lozinku. Onda možete promijeniti više " -"postavki korisnika." - -msgid "Enter a username and password." -msgstr "Unesite korisničko ime i lozinku." - -msgid "Change password" -msgstr "Promijeni lozinku" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "Molimo ispravite navedene greške." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Unesite novu lozinku za korisnika %(username)s." - -msgid "Welcome," -msgstr "Dobrodošli," - -msgid "View site" -msgstr "Pogledaj stranicu" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Odjava" - -#, python-format -msgid "Add %(name)s" -msgstr "Novi unos - %(name)s" - -msgid "History" -msgstr "Povijest" - -msgid "View on site" -msgstr "Pogledaj na stranicama" - -msgid "Filter" -msgstr "Filter" - -msgid "Remove from sorting" -msgstr "Odstrani iz sortiranja" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritet sortiranja: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Preklopi sortiranje" - -msgid "Delete" -msgstr "Izbriši" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Brisanje %(object_name)s '%(escaped_object)s' rezultiralo bi brisanjem " -"povezanih objekta, ali vi nemate privilegije za brisanje navedenih objekta: " - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Brisanje %(object_name)s '%(escaped_object)s' bi zahtijevalo i brisanje " -"sljedećih zaštićenih povezanih objekata:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Jeste li sigurni da želite izbrisati %(object_name)s \"%(escaped_object)s\"? " -"Svi navedeni objekti biti će izbrisani:" - -msgid "Objects" -msgstr "Objekti" - -msgid "Yes, I'm sure" -msgstr "Da, siguran sam" - -msgid "No, take me back" -msgstr "Ne, vrati me natrag" - -msgid "Delete multiple objects" -msgstr "Izbriši više unosa." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Brisanje odabranog %(objects_name)s rezultiralo bi brisanjem povezanih " -"objekta, ali vaš korisnički račun nema dozvolu za brisanje sljedeće vrste " -"objekata:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Brisanje odabranog %(objects_name)s će zahtijevati brisanje sljedećih " -"zaštićenih povezanih objekata:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Jeste li sigurni da želite izbrisati odabrane %(objects_name)s ? Svi " -"sljedeći objekti i povezane stavke će biti izbrisani:" - -msgid "View" -msgstr "Prikaz" - -msgid "Delete?" -msgstr "Izbriši?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Po %(filter_title)s " - -msgid "Summary" -msgstr "Sažetak" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeli u aplikaciji %(name)s" - -msgid "Add" -msgstr "Novi unos" - -msgid "You don't have permission to view or edit anything." -msgstr "Nemate dozvole za pregled ili izmjenu." - -msgid "Recent actions" -msgstr "Nedavne promjene" - -msgid "My actions" -msgstr "Moje promjene" - -msgid "None available" -msgstr "Nije dostupno" - -msgid "Unknown content" -msgstr "Sadržaj nepoznat" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Nešto nije uredu sa instalacijom/postavkama baze. Provjerite jesu li " -"potrebne tablice u bazi kreirane i provjerite je li baza dostupna korisniku." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Prijavljeni ste kao %(username)s, ali nemate dopuštenje za pristup traženoj " -"stranici. Želite li se prijaviti drugim korisničkim računom?" - -msgid "Forgotten your password or username?" -msgstr "Zaboravili ste lozinku ili korisničko ime?" - -msgid "Date/time" -msgstr "Datum/vrijeme" - -msgid "User" -msgstr "Korisnik" - -msgid "Action" -msgstr "Akcija" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Ovaj objekt nema povijest promjena. Moguće je da nije dodan korištenjem ove " -"administracije." - -msgid "Show all" -msgstr "Prikaži sve" - -msgid "Save" -msgstr "Spremi" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Traži" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s rezultat" -msgstr[1] "%(counter)s rezultata" -msgstr[2] "%(counter)s rezultata" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s ukupno" - -msgid "Save as new" -msgstr "Spremi kao novi unos" - -msgid "Save and add another" -msgstr "Spremi i unesi novi unos" - -msgid "Save and continue editing" -msgstr "Spremi i nastavi uređivati" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "Zatvori" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Promijeni označene %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Dodaj još jedan %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Obriši odabrane %(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Hvala što ste proveli malo kvalitetnog vremena na stranicama danas." - -msgid "Log in again" -msgstr "Prijavite se ponovo" - -msgid "Password change" -msgstr "Promjena lozinke" - -msgid "Your password was changed." -msgstr "Vaša lozinka je promijenjena." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Molim unesite staru lozinku, zbog sigurnosti, i onda unesite novu lozinku " -"dvaput da bi mogli provjeriti jeste li je ispravno unijeli." - -msgid "Change my password" -msgstr "Promijeni moju lozinku" - -msgid "Password reset" -msgstr "Resetiranje lozinke" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaša lozinka je postavljena. Sada se možete prijaviti." - -msgid "Password reset confirmation" -msgstr "Potvrda promjene lozinke" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Molimo vas da unesete novu lozinku dvaput da bi mogli provjeriti jeste li je " -"ispravno unijeli." - -msgid "New password:" -msgstr "Nova lozinka:" - -msgid "Confirm password:" -msgstr "Potvrdi lozinku:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Link za resetiranje lozinke je neispravan, vjerojatno jer je već korišten. " -"Molimo zatražite novo resetiranje lozinke." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Elektroničkom poštom smo vam poslali upute za postavljanje Vaše zaporke, ako " -"postoji korisnički račun s e-mail adresom koju ste unijeli. Uskoro bi ih " -"trebali primiti. " - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ako niste primili e-mail provjerite da li ste ispravno unijeli adresu s " -"kojom ste se registrirali i provjerite spam sandučić." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Primili ste ovu poruku jer ste zatražili postavljanje nove lozinke za svoj " -"korisnički račun na %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Molimo otiđite do sljedeće stranice i odaberite novu lozinku:" - -msgid "Your username, in case you've forgotten:" -msgstr "Vaše korisničko ime, u slučaju da ste zaboravili:" - -msgid "Thanks for using our site!" -msgstr "Hvala šta koristite naše stranice!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s tim" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Zaboravili ste lozinku? Unesite vašu e-mail adresu ispod i poslati ćemo vam " -"upute kako postaviti novu." - -msgid "Email address:" -msgstr "E-mail adresa:" - -msgid "Reset my password" -msgstr "Resetiraj moju lozinku" - -msgid "All dates" -msgstr "Svi datumi" - -#, python-format -msgid "Select %s" -msgstr "Odaberi %s" - -#, python-format -msgid "Select %s to change" -msgstr "Odaberi za promjenu - %s" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Vrijeme:" - -msgid "Lookup" -msgstr "Potraži" - -msgid "Currently:" -msgstr "Trenutno:" - -msgid "Change:" -msgstr "Promijeni:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index e8231f6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po deleted file mode 100644 index 0878d8a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,223 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# aljosa , 2011 -# Bojan Mihelač , 2012 -# Davor Lučić , 2011 -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostupno %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ovo je popis dostupnih %s. Možete dodati pojedine na način da ih izaberete u " -"polju ispod i kliknete \"Izaberi\" strelicu između dva polja. " - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Tipkajte u ovo polje da filtrirate listu dostupnih %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Odaberi sve" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Kliknite da odabrete sve %s odjednom." - -msgid "Choose" -msgstr "Izaberi" - -msgid "Remove" -msgstr "Ukloni" - -#, javascript-format -msgid "Chosen %s" -msgstr "Odabrano %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ovo je popis odabranih %s. Možete ukloniti pojedine na način da ih izaberete " -"u polju ispod i kliknete \"Ukloni\" strelicu između dva polja. " - -msgid "Remove all" -msgstr "Ukloni sve" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Kliknite da uklonite sve izabrane %s odjednom." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "odabrano %(sel)s od %(cnt)s" -msgstr[1] "odabrano %(sel)s od %(cnt)s" -msgstr[2] "odabrano %(sel)s od %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Neke promjene nisu spremljene na pojedinim polja za uređivanje. Ako " -"pokrenete akciju, nespremljene promjene će biti izgubljene." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Odabrali ste akciju, ali niste još spremili promjene na pojedinim polja. " -"Molimo kliknite OK za spremanje. Morat ćete ponovno pokrenuti akciju." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Odabrali ste akciju, a niste napravili nikakve izmjene na pojedinim poljima. " -"Vjerojatno tražite gumb Idi umjesto gumb Spremi." - -msgid "Now" -msgstr "Sada" - -msgid "Midnight" -msgstr "Ponoć" - -msgid "6 a.m." -msgstr "6 ujutro" - -msgid "Noon" -msgstr "Podne" - -msgid "6 p.m." -msgstr "6 popodne" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Choose a Time" -msgstr "Izaberite vrijeme" - -msgid "Choose a time" -msgstr "Izaberite vrijeme" - -msgid "Cancel" -msgstr "Odustani" - -msgid "Today" -msgstr "Danas" - -msgid "Choose a Date" -msgstr "Odaberite datum" - -msgid "Yesterday" -msgstr "Jučer" - -msgid "Tomorrow" -msgstr "Sutra" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Prikaži" - -msgid "Hide" -msgstr "Sakri" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index 575fb46..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index f1a44da..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,795 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016-2025\n" -"Language-Team: Upper Sorbian (http://app.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Wubrane %(verbose_name_plural)s zhašeć" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s je so wuspěšnje zhašało." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s njeda so zhašeć" - -msgid "Delete multiple objects" -msgstr "Wjacore objekty zhašeć" - -msgid "Administration" -msgstr "Administracija" - -msgid "All" -msgstr "Wšě" - -msgid "Yes" -msgstr "Haj" - -msgid "No" -msgstr "Ně" - -msgid "Unknown" -msgstr "Njeznaty" - -msgid "Any date" -msgstr "Někajki datum" - -msgid "Today" -msgstr "Dźensa" - -msgid "Past 7 days" -msgstr "Zańdźene 7 dnjow" - -msgid "This month" -msgstr "Tutón měsac" - -msgid "This year" -msgstr "Lětsa" - -msgid "No date" -msgstr "Žadyn datum" - -msgid "Has date" -msgstr "Ma datum" - -msgid "Empty" -msgstr "Prózdny" - -msgid "Not empty" -msgstr "Njeprózdny" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Prošu zapodajće korektne %(username)s a hesło za personalne konto. Dźiwajće " -"na to, zo wobě poli móžetej mjez wulko- a małopisanjom rozeznawać." - -msgid "Action:" -msgstr "Akcija:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Přidajće nowe %(verbose_name)s" - -msgid "Remove" -msgstr "Wotstronić" - -msgid "Addition" -msgstr "Přidaće" - -msgid "Change" -msgstr "Změnić" - -msgid "Deletion" -msgstr "Zhašenje" - -msgid "action time" -msgstr "akciski čas" - -msgid "user" -msgstr "wužiwar" - -msgid "content type" -msgstr "wobsahowy typ" - -msgid "object id" -msgstr "objektowy id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objektowa reprezentacija" - -msgid "action flag" -msgstr "akciske markěrowanje" - -msgid "change message" -msgstr "změnowa powěsć" - -msgid "log entry" -msgstr "protokolowy zapisk" - -msgid "log entries" -msgstr "protokolowe zapiski" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Je so „%(object)s“ přidał." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Je so „%(object)s“ změnił - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Je so „%(object)s“ zhašał." - -msgid "LogEntry Object" -msgstr "Objekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Je so {name} „{object}“ přidał." - -msgid "Added." -msgstr "Přidaty." - -msgid "and" -msgstr "a" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Je so {fields} za {name} „{object}“ změnił." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} změnjene." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Je so {name} „{object}“ zhašał." - -msgid "No fields changed." -msgstr "Žane pola změnjene." - -msgid "None" -msgstr "Žadyn" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Dźeržće „ctrl“ abo „cmd“ na Mac stłóčeny, zo byšće wjace hač jedyn wubrał." - -msgid "Select this object for an action - {}" -msgstr "Wubjerće tutón objekt za akciju – {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}“ je so wuspěšnje přidał." - -msgid "You may edit it again below." -msgstr "Móžeće deleka unowa wobdźěłać." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} „{obj}“ je so wuspěšnje přidał. Móžeće deleka dalši {name} přidać." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} „{obj}“ je so wuspěšnje změnił. Móžeće jón deleka wobdźěłować." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} „{obj}“ je so wuspěšnje změnił. Móžeće deleka dalši {name} přidać." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}“ je so wuspěšnje změnił." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Dyrbiće zapiski wubrać, zo byšće akcije z nimi wuwjesć. Zapiski njejsu so " -"změnili." - -msgid "No action selected." -msgstr "žana akcija wubrana." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s“ je so wuspěšnje zhašał." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s z ID „%(key)s“ njeeksistuje. Je so snano zhašało?" - -#, python-format -msgid "Add %s" -msgstr "%s přidać" - -#, python-format -msgid "Change %s" -msgstr "%s změnić" - -#, python-format -msgid "View %s" -msgstr "%s pokazać" - -msgid "Database error" -msgstr "Zmylk datoweje banki" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s je so wuspěšnje změnił." -msgstr[1] "%(count)s %(name)s stej so wuspěšnje změniłoj." -msgstr[2] "%(count)s %(name)s su so wuspěšnje změnili." -msgstr[3] "%(count)s %(name)s je so wuspěšnje změniło." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s wubrany" -msgstr[1] "%(total_count)s wubranej" -msgstr[2] "%(total_count)s wubrane" -msgstr[3] "%(total_count)s wubranych" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 z %(cnt)s wubranych" - -msgid "Delete" -msgstr "Zhašeć" - -#, python-format -msgid "Change history: %s" -msgstr "Změnowa historija: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Zo bychu so %(class_name)s %(instance)s zhašeli, dyrbja so slědowace škitane " -"přisłušne objekty zhašeć: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administrator sydła Django" - -msgid "Django administration" -msgstr "Administracija Django" - -msgid "Site administration" -msgstr "Sydłowa administracija" - -msgid "Log in" -msgstr "Přizjewić" - -#, python-format -msgid "%(app)s administration" -msgstr "Administracija %(app)s" - -msgid "Page not found" -msgstr "Strona njeje so namakała" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Je nam žel, ale požadana strona njeda so namakać." - -msgid "Home" -msgstr "Startowa strona" - -msgid "Server error" -msgstr "Serwerowy zmylk" - -msgid "Server error (500)" -msgstr "Serwerowy zmylk (500)" - -msgid "Server Error (500)" -msgstr "Serwerowy zmylk (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Zmylk je wustupił. Je so sydłowym administratoram přez e-mejl zdźělił a " -"dyrbjał so bórze wotstronić. Dźakujemy so za wašu sćerpliwosć." - -msgid "Run the selected action" -msgstr "Wubranu akciju wuwjesć" - -msgid "Go" -msgstr "Start" - -msgid "Click here to select the objects across all pages" -msgstr "Klikńće tu, zo byšće objekty wšěch stronow wubrać" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Wubjerće wšě %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Wuběr wotstronić" - -msgid "Breadcrumbs" -msgstr "Chlěbowe srjódki" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele w nałoženju %(name)s" - -msgid "Model name" -msgstr "Modelowe mjeno" - -msgid "Add link" -msgstr "Wotkaz přidać" - -msgid "Change or view list link" -msgstr "Lisćinowy wotkaz změnić abo pokazać" - -msgid "Add" -msgstr "Přidać" - -msgid "View" -msgstr "Pokazać" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nimaće prawo něšto pokazać abo wobdźěłać." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Hdyž sće wužiwarja wutworił, móžeće dalše wužiwarske nastajenja wobdźěłać." - -msgid "Error:" -msgstr "Zmylk:" - -msgid "Change password" -msgstr "Hesło změnić" - -msgid "Set password" -msgstr "Hesło postajić" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Prošu porjedźće slědowacy zmylk." -msgstr[1] "Prošu porjedźće slědowacej zmylkaj." -msgstr[2] "Prošu porjedźće slědowace zmylki." -msgstr[3] "Prošu porjedźće slědowace zmylki." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Zapodajće nowe hesło za %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Tuta akcija awtentifikacija na zakładźe hesła za tutoho wužiwarja " -"zmóžni ." - -msgid "Disable password-based authentication" -msgstr "Awtentifikaciju na zakładźe hesła znjemóžnić" - -msgid "Enable password-based authentication" -msgstr "Awtentifikaciju na zakładźe hesła zmóžnić" - -msgid "Skip to main content" -msgstr "Dale k hłownemu wobsahej" - -msgid "Welcome," -msgstr "Witajće," - -msgid "View site" -msgstr "Sydło pokazać" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Wotzjewić" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s přidać" - -msgid "History" -msgstr "Historija" - -msgid "View on site" -msgstr "Na sydle pokazać" - -msgid "Filter" -msgstr "Filtrować" - -msgid "Hide counts" -msgstr "Ličby schować" - -msgid "Show counts" -msgstr "Ličby pokazać" - -msgid "Clear all filters" -msgstr "Wšě filtry zhašeć" - -msgid "Remove from sorting" -msgstr "Ze sortěrowanja wotstronić" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sortěrowanski porjad: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sortěrowanje přepinać" - -msgid "Toggle theme (current theme: auto)" -msgstr "Drastu změnić (aktualna drasta: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Drastu změnić (aktualna drasta: swětła)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Drastu změnić (aktualna drasta: ćmowa)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Hdyž so %(object_name)s '%(escaped_object)s' zhašeja, so tež přisłušne " -"objekty zhašeja, ale waše konto nima prawo slědowace typy objektow zhašeć:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Zo by so %(object_name)s '%(escaped_object)s' zhašało, dyrbja so slědowace " -"přisłušne objekty zhašeć:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Chceće woprawdźe %(object_name)s \"%(escaped_object)s\" zhašeć? Wšě " -"slědowace přisłušne zapiski so zhašeja:" - -msgid "Objects" -msgstr "Objekty" - -msgid "Yes, I’m sure" -msgstr "Haj, sym sej wěsty" - -msgid "No, take me back" -msgstr "Ně, prošu wróćo" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Hdyž so wubrany %(objects_name)s zhaša, so přisłušne objekty zhašeja, ale " -"waše konto nima prawo slědowace typy objektow zhašeć: " - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Hdyž so wubrany %(objects_name)s zhaša, so slědowace škitane přisłušne " -"objekty zhašeja:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Chceće woprawdźe wubrane %(objects_name)s zhašeć? Wšě slědowace objekty a " -"jich přisłušne zapiski so zhašeja:" - -msgid "Delete?" -msgstr "Zhašeć?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Po %(filter_title)s " - -msgid "Summary" -msgstr "Zjeće" - -msgid "Recent actions" -msgstr "Najnowše akcije" - -msgid "My actions" -msgstr "Moje akcije" - -msgid "None available" -msgstr "Žadyn k dispoziciji" - -msgid "Added:" -msgstr "Přidaty:" - -msgid "Changed:" -msgstr "Změnjeny:" - -msgid "Deleted:" -msgstr "Zhašany:" - -msgid "Unknown content" -msgstr "Njeznaty wobsah" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Něšto je so z instalaciju datoweje banki nimokuliło. Zawěsćće, zo wotpowědne " -"tabele datoweje banki su so wutworili, a, zo datowa banka da so wot " -"wotpowědneho wužiwarja čitać." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Sće jako %(username)s awtentifikowany, ale nimaće přistup na tutu stronu. " -"Chceće so pola druheho konta přizjewić?" - -msgid "Forgotten your login credentials?" -msgstr "Sće swoje přizjewjenske daty zabył?" - -msgid "Toggle navigation" -msgstr "Nawigaciju přepinać" - -msgid "Sidebar" -msgstr "Bóčnica" - -msgid "Start typing to filter…" -msgstr "Pisajće, zo byšće filtrował …" - -msgid "Filter navigation items" -msgstr "Nawigaciske zapiski fitrować" - -msgid "Date/time" -msgstr "Datum/čas" - -msgid "User" -msgstr "Wužiwar" - -msgid "Action" -msgstr "Akcija" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "zapisk" -msgstr[1] "zapiskaj" -msgstr[2] "zapiski" -msgstr[3] "zapiskow" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Tutón objekt nima změnowu historiju. Njeje so najskerje přez tute " -"administratorowe sydło přidał." - -msgid "Show all" -msgstr "Wšě pokazać" - -msgid "Save" -msgstr "Składować" - -msgid "Popup closing…" -msgstr "Wuskakowace wokno so začinja…" - -msgid "Search" -msgstr "Pytać" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s wuslědk" -msgstr[1] "%(counter)s wuslědkaj" -msgstr[2] "%(counter)s wuslědki" -msgstr[3] "%(counter)s wuslědkow" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s dohromady" - -msgid "Save as new" -msgstr "Jako nowy składować" - -msgid "Save and add another" -msgstr "Skłaodwac a druhi přidać" - -msgid "Save and continue editing" -msgstr "Składować a dale wobdźěłować" - -msgid "Save and view" -msgstr "Składować a pokazać" - -msgid "Close" -msgstr "Začinić" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Wubrane %(model)s změnić" - -#, python-format -msgid "Add another %(model)s" -msgstr "Druhi %(model)s přidać" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Wubrane %(model)s zhašeć" - -#, python-format -msgid "View selected %(model)s" -msgstr "Wubrany %(model)s pokazać" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Wulki dźak, zo sće sej čas brał, zo byšće kwalitu websydła dźensa " -"přepruwował." - -msgid "Log in again" -msgstr "Znowa přizjewić" - -msgid "Password change" -msgstr "Hesło změnić" - -msgid "Your password was changed." -msgstr "Waše hesło je so změniło." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Prošu zapodajće swoje stare hesło k swojemu škitej a potom swoje nowe hesło " -"dwójce, zo bychmy móhli přepruwować, hač sće jo korektnje zapodał." - -msgid "Change my password" -msgstr "Moje hesło změnić" - -msgid "Password reset" -msgstr "Hesło wróćo stajić" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Waše hesło je so nastajiło. Móžeće pokročować a so nětko přizjewić." - -msgid "Password reset confirmation" -msgstr "Wobkrućenje wróćostajenja hesła" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Prošu zapodajće swoje hesło dwójce, zo bychmy móhli přepruwować, hač sće jo " -"korektnje zapodał." - -msgid "New password:" -msgstr "Nowe hesło:" - -msgid "Confirm password:" -msgstr "Hesło wobkrućić:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Wotkaz za wróćostajenje hesła bě njepłaćiwy, snano dokelž je so hižo wužił. " -"Prošu prošće wo nowe wróćostajenje hesła." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Smy wam e-mejlku z instrukcijemi wo nastajenju wašeho hesła pósłali, jeli " -"konto ze zapodatej e-mejlowej adresu eksistuje. Wy dyrbjał ju bórze dóstać." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jeli e-mejlku njedóstawaće, přepruwujće prošu adresu, z kotrejž sće so " -"zregistrował a hladajće do swojeho spamoweho rjadowaka." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Dóstawaće tutu e-mejlku, dokelž sće wo wróćostajenje hesła za swoje " -"wužiwarske konto na at %(site_name)s prosył." - -msgid "Please go to the following page and choose a new password:" -msgstr "Prošu dźiće k slědowacej stronje a wubjerće nowe hesło:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Jeli sće je zabył, sće:" - -msgid "Thanks for using our site!" -msgstr "Wulki dźak za wužiwanje našeho sydła!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Team %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Sće swoje hesło zabył? Zapodajće deleka swoju e-mejlowu adresu a pósćelemy " -"wam instrukcije za postajenje noweho hesła přez e-mejl." - -msgid "Email address:" -msgstr "E-mejlowa adresa:" - -msgid "Reset my password" -msgstr "Moje hesło wróćo stajić" - -msgid "Select all objects on this page for an action" -msgstr "Wubjerće wšě objekty na tutej stronje za akciju" - -msgid "All dates" -msgstr "Wšě daty" - -#, python-format -msgid "Select %s" -msgstr "%s wubrać" - -#, python-format -msgid "Select %s to change" -msgstr "%s wubrać, zo by so změniło" - -#, python-format -msgid "Select %s to view" -msgstr "%s wubrać, kotryž ma so pokazać" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Čas:" - -msgid "Lookup" -msgstr "Pytanje" - -msgid "Currently:" -msgstr "Tuchylu:" - -msgid "Change:" -msgstr "Změnić:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 18bed2d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5934758..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,326 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2020-2023,2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016,2020-2023,2025\n" -"Language-Team: Upper Sorbian (http://app.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s k dispoziciji" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Wubjerće je, zo byšće %swubrał a wubjerće potom šipowe tłóčatko „Wubrać“." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Zapisajće do tutoho kašćika, zo byšće někotre z lisćiny k dispoziciji " -"stejacych %s wufiltrował." - -msgid "Filter" -msgstr "Filtrować" - -#, javascript-format -msgid "Choose all %s" -msgstr "Wšě %s wubrać" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Wubrane %swubrać" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Wubrane %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Wubjerće je, zo byšće %swotstronił a wubjerće potom šipowe tłóčatko " -"„Wotstronić“." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"Zapisajće do tutoho kašćika, zo byšće někotre z lisćiny wubranych %s " -"wufiltrował." - -msgid "(click to clear)" -msgstr "(klikńće, zo byšće zhašał)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Wšě %s wotstronić" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%swubrane nastajenje njewidźomne" -msgstr[1] "%swubranej nastajeni njewidźomnej" -msgstr[2] "%s wubrane nastajenja njewidźomne" -msgstr[3] "%swubranych nastajenjow njewidźomne" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s z %(cnt)s wubrany" -msgstr[1] "%(sel)s z %(cnt)s wubranej" -msgstr[2] "%(sel)s z %(cnt)s wubrane" -msgstr[3] "%(sel)s z %(cnt)s wubranych" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Maće njeskładowane změny za jednotliwe wobdźěłujomne pola. Jeli akciju " -"wuwjedźeće, so waše njeskładowane změny zhubja." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Sće akciju wubrał, ale njejsće hišće swoje změny na jednoliwych polach " -"składował. Prošu klikńće na „W porjadku, zo byšće składował. Dyrbiće akciju " -"znowa wuwjesć." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Sće akciju wubrał, a njejsće žane změny na jednotliwych polach přewjedł. " -"Pytajće najskerje za tłóčatkom „Pósłać“ město tłóčatka „Składować“." - -msgid "Now" -msgstr "Nětko" - -msgid "Midnight" -msgstr "Połnóc" - -msgid "6 a.m." -msgstr "6:00 hodź. dopołdnja" - -msgid "Noon" -msgstr "připołdnjo" - -msgid "6 p.m." -msgstr "6 hodź. popołdnju" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Kedźbu: Waš čas je wo %s hodźinu před serwerowym časom." -msgstr[1] "Kedźbu: Waš čas je wo %s hodźin před serwerowym časom." -msgstr[2] "Kedźbu: Waš čas je wo %s hodźiny před serwerowym časom." -msgstr[3] "Kedźbu: Waš čas je wo %s hodźin před serwerowym časom." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Kedźbu: Waš čas je wo %s hodźinu za serwerowym časom." -msgstr[1] "Kedźbu: Waš čas je wo %s hodźinje za serwerowym časom." -msgstr[2] "Kedźbu: Waš čas je wo %s hodźiny za serwerowym časom." -msgstr[3] "Kedźbu: Waš čas je wo %s hodźin za serwerowym časom." - -msgid "Choose a Time" -msgstr "Wubjerće čas" - -msgid "Choose a time" -msgstr "Wubjerće čas" - -msgid "Cancel" -msgstr "Přetorhnyć" - -msgid "Today" -msgstr "Dźensa" - -msgid "Choose a Date" -msgstr "Wubjerće datum" - -msgid "Yesterday" -msgstr "Wčera" - -msgid "Tomorrow" -msgstr "Jutře" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Měrc" - -msgid "April" -msgstr "Apryl" - -msgid "May" -msgstr "Meja" - -msgid "June" -msgstr "Junij" - -msgid "July" -msgstr "Julij" - -msgid "August" -msgstr "Awgust" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "Nowember" - -msgid "December" -msgstr "December" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Měr." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Meja" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun." - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul." - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Awg." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Now." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec." - -msgid "Sunday" -msgstr "Njedźela" - -msgid "Monday" -msgstr "Póndźela" - -msgid "Tuesday" -msgstr "Wutora" - -msgid "Wednesday" -msgstr "Srjeda" - -msgid "Thursday" -msgstr "Štwórtk" - -msgid "Friday" -msgstr "Pjatk" - -msgid "Saturday" -msgstr "Sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Nje" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pón" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Wut" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Srj" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Štw" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pja" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sob" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Nj" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Pó" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Wu" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Sr" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Št" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Pj" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "So" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index 04682ab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index fc31d8d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,798 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ádám Krizsány , 2015 -# Akos Zsolt Hochrein , 2018 -# András Veres-Szentkirályi, 2016,2018-2020,2023 -# Balázs R, 2023,2025 -# Istvan Farkas , 2019 -# Jannis Leidel , 2011 -# János R, 2017 -# János R, 2014 -# Kristóf Gruber <>, 2012 -# slink , 2011 -# Szilveszter Farkas , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Balázs R, 2023,2025\n" -"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Kiválasztott %(verbose_name_plural)s törlése" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s sikeresen törölve lett." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s törlése nem sikerült" - -msgid "Delete multiple objects" -msgstr "Több elem törlése" - -msgid "Administration" -msgstr "Adminisztráció" - -msgid "All" -msgstr "Mind" - -msgid "Yes" -msgstr "Igen" - -msgid "No" -msgstr "Nem" - -msgid "Unknown" -msgstr "Ismeretlen" - -msgid "Any date" -msgstr "Bármely dátum" - -msgid "Today" -msgstr "Ma" - -msgid "Past 7 days" -msgstr "Utolsó 7 nap" - -msgid "This month" -msgstr "Ez a hónap" - -msgid "This year" -msgstr "Ez az év" - -msgid "No date" -msgstr "Nincs dátuma" - -msgid "Has date" -msgstr "Van dátuma" - -msgid "Empty" -msgstr "Üres" - -msgid "Not empty" -msgstr "Nem üres" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Adja meg egy adminisztrációra jogosult %(username)s és jelszavát. Vegye " -"figyelembe, hogy mindkét mező megkülönböztetheti a kis- és nagybetűket." - -msgid "Action:" -msgstr "Művelet:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Újabb %(verbose_name)s hozzáadása" - -msgid "Remove" -msgstr "Törlés" - -msgid "Addition" -msgstr "Hozzáadás" - -msgid "Change" -msgstr "Módosítás" - -msgid "Deletion" -msgstr "Törlés" - -msgid "action time" -msgstr "művelet időpontja" - -msgid "user" -msgstr "felhasználó" - -msgid "content type" -msgstr "tartalom típusa" - -msgid "object id" -msgstr "objektum id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objektum repr" - -msgid "action flag" -msgstr "művelet jelölés" - -msgid "change message" -msgstr "üzenet módosítása" - -msgid "log entry" -msgstr "naplóbejegyzés" - -msgid "log entries" -msgstr "naplóbejegyzések" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" hozzáadva." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\" módosítva — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" törölve." - -msgid "LogEntry Object" -msgstr "Naplóbejegyzés objektum" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "\"{object}\" {name} hozzáadva." - -msgid "Added." -msgstr "Hozzáadva." - -msgid "and" -msgstr "és" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "\"{object}\" {name} {fields} módosítva." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} módosítva." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "\"{object}\" {name} törölve." - -msgid "No fields changed." -msgstr "Egy mező sem változott." - -msgid "None" -msgstr "Egyik sem" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Több elem kiválasztásához tartsa nyomva a \"Control\" gombot, vagy Mac " -"gépeken a \"Command\" gombot." - -msgid "Select this object for an action - {}" -msgstr "Objektum kijelölése egy művelethez - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "A(z) \"{obj}\" {name} sikeresen hozzáadva." - -msgid "You may edit it again below." -msgstr "Alább ismét szerkesztheti." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"A(z) \"{obj}\" {name} sikeresen hozzáadva. Alább hozzadhat egy új {name} " -"rekordot." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "A(z) \"{obj}\" {name} sikeresen módosítva. Alább újra szerkesztheti." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"A(z) \"{obj}\" {name} sikeresen módosítva. Alább hozzáadhat egy új {name} " -"rekordot." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "A(z) \"{obj}\" {name} sikeresen módosítva." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"A műveletek végrehajtásához ki kell választani legalább egy elemet. Semmi " -"sem lett módosítva." - -msgid "No action selected." -msgstr "Nem választott ki műveletet." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "A(z) \"%(obj)s\" %(name)s törölve lett." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"A(z) \"%(key)s\" azonosítójú %(name)s nem létezik. Esetleg törölve lett?" - -#, python-format -msgid "Add %s" -msgstr "Új %s" - -#, python-format -msgid "Change %s" -msgstr "%s módosítása" - -#, python-format -msgid "View %s" -msgstr "%s megtekintése" - -msgid "Database error" -msgstr "Adatbázishiba" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s sikeresen módosítva lett." -msgstr[1] "%(count)s %(name)s sikeresen módosítva lett." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s kiválasztva" -msgstr[1] "%(total_count)s kiválasztva" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 kiválasztva ennyiből: %(cnt)s" - -msgid "Delete" -msgstr "Törlés" - -#, python-format -msgid "Change history: %s" -msgstr "Változások története: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(instance)s %(class_name)s törlése az alábbi kapcsolódó védett objektumok " -"törlését is magával vonná: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django honlapadminisztráció" - -msgid "Django administration" -msgstr "Django adminisztráció" - -msgid "Site administration" -msgstr "Honlap karbantartása" - -msgid "Log in" -msgstr "Bejelentkezés" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s adminisztráció" - -msgid "Page not found" -msgstr "Nincs ilyen oldal" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Sajnáljuk, de a keresett oldal nem található." - -msgid "Home" -msgstr "Kezdőlap" - -msgid "Server error" -msgstr "Szerverhiba" - -msgid "Server error (500)" -msgstr "Szerverhiba (500)" - -msgid "Server Error (500)" -msgstr "Szerverhiba (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Hiba történt. Az oldal kezelőjét e-mailben értesítettük, a hiba rövidesen " -"javítva lesz. Köszönjük a türelmet." - -msgid "Run the selected action" -msgstr "Kiválasztott művelet futtatása" - -msgid "Go" -msgstr "Mehet" - -msgid "Click here to select the objects across all pages" -msgstr "Kattintson ide több oldalnyi objektum kiválasztásához" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Az összes %(module_name)s kiválasztása, összesen %(total_count)s db" - -msgid "Clear selection" -msgstr "Kiválasztás törlése" - -msgid "Breadcrumbs" -msgstr "Breadcrumb navigáció" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s alkalmazásban elérhető modellek." - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Új" - -msgid "View" -msgstr "Megtekintés" - -msgid "You don’t have permission to view or edit anything." -msgstr "Jelenleg nincs jogosultsága bármit megtekinteni vagy szerkeszteni." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "A felhasználó létrehozása után a többi adat is szerkeszthető lesz." - -msgid "Error:" -msgstr "Hiba:" - -msgid "Change password" -msgstr "Jelszó megváltoztatása" - -msgid "Set password" -msgstr "Jelszó beállítása" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Kérem javítsa a lenti hibát." -msgstr[1] "Kérem javítsa a lenti hibákat." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Adjon meg egy új jelszót %(username)s nevű felhasználónak." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "" - -msgid "Enable password-based authentication" -msgstr "" - -msgid "Skip to main content" -msgstr "Ugrás az oldal fő részéhez" - -msgid "Welcome," -msgstr "Üdvözlöm," - -msgid "View site" -msgstr "Honlap megtekintése" - -msgid "Documentation" -msgstr "Dokumentáció" - -msgid "Log out" -msgstr "Kijelentkezés" - -#, python-format -msgid "Add %(name)s" -msgstr "Új %(name)s" - -msgid "History" -msgstr "Történet" - -msgid "View on site" -msgstr "Megtekintés a honlapon" - -msgid "Filter" -msgstr "Szűrő" - -msgid "Hide counts" -msgstr "Számok elrejtése" - -msgid "Show counts" -msgstr "Számok megjelenítése" - -msgid "Clear all filters" -msgstr "Összes szűrő törlése" - -msgid "Remove from sorting" -msgstr "Eltávolítás a rendezésből" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritás rendezésnél: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Rendezés megfordítása" - -msgid "Toggle theme (current theme: auto)" -msgstr "Téma váltás (jelenleg: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Téma váltás (jelenleg: világos)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Téma váltás (jelenleg: sötét)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"\"%(escaped_object)s\" %(object_name)s törlése a kapcsolódó objektumok " -"törlését is eredményezi, de a hozzáférése nem engedi a következő típusú " -"objektumok törlését:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"\"%(escaped_object)s\" %(object_name)s törlése az alábbi kapcsolódó " -"objektumok törlését is maga után vonja:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Biztos hogy törli a következőt: \"%(escaped_object)s\" (típus: " -"%(object_name)s)? A összes további kapcsolódó elem is törlődik:" - -msgid "Objects" -msgstr "Objektumok" - -msgid "Yes, I’m sure" -msgstr "Igen, biztos vagyok benne" - -msgid "No, take me back" -msgstr "Nem, forduljunk vissza" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"A kiválasztott %(objects_name)s törlése kapcsolódó objektumok törlését vonja " -"maga után, de az alábbi objektumtípusok törléséhez nincs megfelelő " -"jogosultsága:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"A kiválasztott %(objects_name)s törlése az alábbi védett kapcsolódó " -"objektumok törlését is maga után vonja:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Biztosan törölni akarja a kiválasztott %(objects_name)s objektumokat? Minden " -"alábbi objektum, és a hozzájuk kapcsolódóak is törlésre kerülnek:" - -msgid "Delete?" -msgstr "Törli?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s szerint " - -msgid "Summary" -msgstr "Összegzés" - -msgid "Recent actions" -msgstr "Legutóbbi műveletek" - -msgid "My actions" -msgstr "Az én műveleteim" - -msgid "None available" -msgstr "Nincs elérhető" - -msgid "Added:" -msgstr "Hozzáadva:" - -msgid "Changed:" -msgstr "Szerkesztve:" - -msgid "Deleted:" -msgstr "Törölve:" - -msgid "Unknown content" -msgstr "Ismeretlen tartalom" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Valami probléma van az adatbázissal. Kérjük győződjön meg róla, hogy a " -"megfelelő táblák létre lettek hozva, és hogy a megfelelő felhasználónak van " -"rájuk olvasási joga." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Jelenleg be vagy lépve mint %(username)s, de nincs jogod elérni ezt az " -"oldalt. Szeretnél belépni egy másik fiókkal?" - -msgid "Forgotten your login credentials?" -msgstr "Elfelejtette a bejelentkezési adatait?" - -msgid "Toggle navigation" -msgstr "Navigáció megjelenítése/elrejtése" - -msgid "Sidebar" -msgstr "Oldalsáv" - -msgid "Start typing to filter…" -msgstr "Kezdjen el gépelni a szűréshez..." - -msgid "Filter navigation items" -msgstr "Navigációs elemek szűrése" - -msgid "Date/time" -msgstr "Dátum/idő" - -msgid "User" -msgstr "Felhasználó" - -msgid "Action" -msgstr "Művelet" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "bejegyzés" -msgstr[1] "bejegyzés" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Ennek az objektumnak nincs változás naplója. Valószínűleg nem az admin " -"felületen keresztül lett rögzítve." - -msgid "Show all" -msgstr "Mutassa mindet" - -msgid "Save" -msgstr "Mentés" - -msgid "Popup closing…" -msgstr "A popup bezáródik…" - -msgid "Search" -msgstr "Keresés" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s találat" -msgstr[1] "%(counter)s találat" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s összesen" - -msgid "Save as new" -msgstr "Mentés újként" - -msgid "Save and add another" -msgstr "Mentés és másik hozzáadása" - -msgid "Save and continue editing" -msgstr "Mentés és a szerkesztés folytatása" - -msgid "Save and view" -msgstr "Mentés és megtekintés" - -msgid "Close" -msgstr "Bezárás" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Kiválasztott %(model)s szerkesztése" - -#, python-format -msgid "Add another %(model)s" -msgstr "Újabb %(model)s hozzáadása" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Kiválasztott %(model)s törlése" - -#, python-format -msgid "View selected %(model)s" -msgstr "Kiválasztott %(model)s megtekintése" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Köszönjük, hogy egy kis minőségi időt eltöltött ma a honlapunkon." - -msgid "Log in again" -msgstr "Jelentkezzen be újra" - -msgid "Password change" -msgstr "Jelszó megváltoztatása" - -msgid "Your password was changed." -msgstr "Megváltozott a jelszava." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Kérjük a biztoság kedvéért adja meg a jelenlegi jelszavát, majd az újat, " -"kétszer, hogy biztosak lehessünk abban, hogy megfelelően gépelte be." - -msgid "Change my password" -msgstr "Jelszavam megváltoztatása" - -msgid "Password reset" -msgstr "Jelszó beállítása" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Jelszava beállításra került. Most már bejelentkezhet." - -msgid "Password reset confirmation" -msgstr "Jelszó beállítás megerősítése" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Írja be az új jelszavát kétszer, hogy megbizonyosodhassunk annak " -"helyességéről." - -msgid "New password:" -msgstr "Új jelszó:" - -msgid "Confirm password:" -msgstr "Jelszó megerősítése:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"A jelszóbeállító link érvénytelen. Ennek egyik oka az lehet, hogy már " -"felhasználták. Kérem indítson új jelszóbeállítást." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Amennyiben a megadott e-mail címhez tartozik fiók, elküldtük e-mailben a " -"leírást, hogy hogyan tudja megváltoztatni a jelszavát. Hamarosan meg kell " -"érkeznie." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ha nem kapja meg a levelet, kérjük ellenőrizze, hogy a megfelelő e-mail " -"címet adta-e meg, illetve nézze meg a levélszemét mappában is." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Azért kapja ezt az e-mailt, mert jelszavának visszaállítását kérte ezen a " -"weboldalon: %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Kérjük látogassa meg a következő oldalt, és válasszon egy új jelszót:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Ha esetleg elfelejtette volna, a felhasználóneve: " - -msgid "Thanks for using our site!" -msgstr "Köszönjük, hogy használta honlapunkat!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s csapat" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Elfelejtette jelszavát? Adja meg az e-mail-címet, amellyel regisztrált " -"oldalunkon, és e-mailben elküldjük a leírását, hogy hogyan tud újat " -"beállítani." - -msgid "Email address:" -msgstr "E-mail cím:" - -msgid "Reset my password" -msgstr "Jelszavam törlése" - -msgid "Select all objects on this page for an action" -msgstr "Minden objektum kijelölése egy művelethez" - -msgid "All dates" -msgstr "Minden dátum" - -#, python-format -msgid "Select %s" -msgstr "%s kiválasztása" - -#, python-format -msgid "Select %s to change" -msgstr "Válasszon ki egyet a módosításhoz (%s)" - -#, python-format -msgid "Select %s to view" -msgstr "Válasszon ki egyet a megtekintéshez (%s)" - -msgid "Date:" -msgstr "Dátum:" - -msgid "Time:" -msgstr "Idő:" - -msgid "Lookup" -msgstr "Keresés" - -msgid "Currently:" -msgstr "Jelenleg:" - -msgid "Change:" -msgstr "Módosítás:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo deleted file mode 100644 index e9bed06..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po deleted file mode 100644 index d21b38a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,329 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# András Veres-Szentkirályi, 2016,2020-2021,2023 -# Attila Nagy <>, 2012 -# Balázs R, 2023 -# Jannis Leidel , 2011 -# János R, 2011 -# Máté Őry , 2012 -# Szilveszter Farkas , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: András Veres-Szentkirályi, 2016,2020-2021,2023\n" -"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Elérhető %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ez az elérhető %s listája. Úgy választhat közülük, hogy rákattint az alábbi " -"dobozban, és megnyomja a dobozok közti \"Választás\" nyilat." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Írjon a mezőbe az elérhető %s szűréséhez." - -msgid "Filter" -msgstr "Szűrő" - -msgid "Choose all" -msgstr "Mindet kijelölni" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Kattintson az összes %s kiválasztásához." - -msgid "Choose" -msgstr "Választás" - -msgid "Remove" -msgstr "Eltávolítás" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s kiválasztva" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ez a kiválasztott %s listája. Eltávolíthat közülük, ha rákattint, majd a két " -"doboz közti \"Eltávolítás\" nyílra kattint." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Írjon a mezőbe a kiválasztott %s szűréséhez." - -msgid "Remove all" -msgstr "Összes törlése" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Kattintson az összes %s eltávolításához." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s kiválasztott elem nem látható" -msgstr[1] "%s kiválasztott elem nem látható" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s/%(cnt)s kijelölve" -msgstr[1] "%(sel)s/%(cnt)s kijelölve" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Még el nem mentett módosításai vannak egyes szerkeszthető mezőkön. Ha most " -"futtat egy műveletet, akkor a módosítások elvesznek." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Kiválasztott egy műveletet, de nem mentette az egyes mezőkhöz kapcsolódó " -"módosításait. Kattintson az OK gombra a mentéshez. Újra kell futtatnia az " -"műveletet." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Kiválasztott egy műveletet, és nem módosított egyetlen mezőt sem. " -"Feltehetően a Mehet gombot keresi a Mentés helyett." - -msgid "Now" -msgstr "Most" - -msgid "Midnight" -msgstr "Éjfél" - -msgid "6 a.m." -msgstr "Reggel 6 óra" - -msgid "Noon" -msgstr "Dél" - -msgid "6 p.m." -msgstr "Este 6 óra" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Megjegyzés: %s órával a szerveridő előtt jársz" -msgstr[1] "Megjegyzés: %s órával a szerveridő előtt jársz" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Megjegyzés: %s órával a szerveridő mögött jársz" -msgstr[1] "Megjegyzés: %s órával a szerveridő mögött jársz" - -msgid "Choose a Time" -msgstr "Válassza ki az időt" - -msgid "Choose a time" -msgstr "Válassza ki az időt" - -msgid "Cancel" -msgstr "Mégsem" - -msgid "Today" -msgstr "Ma" - -msgid "Choose a Date" -msgstr "Válassza ki a dátumot" - -msgid "Yesterday" -msgstr "Tegnap" - -msgid "Tomorrow" -msgstr "Holnap" - -msgid "January" -msgstr "január" - -msgid "February" -msgstr "február" - -msgid "March" -msgstr "március" - -msgid "April" -msgstr "április" - -msgid "May" -msgstr "május" - -msgid "June" -msgstr "június" - -msgid "July" -msgstr "július" - -msgid "August" -msgstr "augusztus" - -msgid "September" -msgstr "szeptember" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "már" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "ápr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "máj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jún" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "júl" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "szep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec" - -msgid "Sunday" -msgstr "vasárnap" - -msgid "Monday" -msgstr "hétfő" - -msgid "Tuesday" -msgstr "kedd" - -msgid "Wednesday" -msgstr "szerda" - -msgid "Thursday" -msgstr "csütörtök" - -msgid "Friday" -msgstr "péntek" - -msgid "Saturday" -msgstr "szombat" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "vas" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "hét" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "kedd" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "sze" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "csüt" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "pén" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "szo" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "V" - -msgctxt "one letter Monday" -msgid "M" -msgstr "H" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "K" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "S" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "C" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Mutat" - -msgid "Hide" -msgstr "Elrejt" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index 1627b2d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index b39e1a7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,708 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Սմբատ Պետրոսյան , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-21 14:16-0300\n" -"PO-Revision-Date: 2018-11-01 20:23+0000\n" -"Last-Translator: Ruben Harutyunov \n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Հաջողությամբ հեռացվել է %(count)d %(items)s։" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Հնարավոր չէ հեռացնել %(name)s" - -msgid "Are you sure?" -msgstr "Համոզված ե՞ք" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Հեռացնել նշված %(verbose_name_plural)sը" - -msgid "Administration" -msgstr "Ադմինիստրավորում" - -msgid "All" -msgstr "Բոլորը" - -msgid "Yes" -msgstr "Այո" - -msgid "No" -msgstr "Ոչ" - -msgid "Unknown" -msgstr "Անհայտ" - -msgid "Any date" -msgstr "Ցանկացած ամսաթիվ" - -msgid "Today" -msgstr "Այսօր" - -msgid "Past 7 days" -msgstr "Անցած 7 օրերին" - -msgid "This month" -msgstr "Այս ամիս" - -msgid "This year" -msgstr "Այս տարի" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "Մուտքագրեք անձնակազմի պրոֆիլի ճիշտ %(username)s և գաղտնաբառ։" - -msgid "Action:" -msgstr "Գործողություն" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Ավելացնել այլ %(verbose_name)s" - -msgid "Remove" -msgstr "Հեռացնել" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "Փոփոխել" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "գործողության ժամանակ" - -msgid "user" -msgstr "օգտագործող" - -msgid "content type" -msgstr "կոնտենտի տիպ" - -msgid "object id" -msgstr "օբյեկտի id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "օբյեկտի repr" - -msgid "action flag" -msgstr "գործողության դրոշ" - -msgid "change message" -msgstr "փոփոխել հաղորդագրությունը" - -msgid "log entry" -msgstr "log գրառում" - -msgid "log entries" -msgstr "log գրառումներ" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "%(object)s֊ը ավելացվեց " - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "%(object)s֊ը փոփոխվեց ֊ %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "%(object)s-ը հեռացվեց" - -msgid "LogEntry Object" -msgstr "LogEntry օբյեկտ" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "Ավելացվեց։" - -msgid "and" -msgstr "և" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Ոչ մի դաշտ չփոփոխվեց։" - -msgid "None" -msgstr "Ոչինչ" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Սեղմեք \"Control\", կամ \"Command\" Mac֊ի մրա, մեկից ավելին ընտրելու համար։" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Օբյեկտների հետ գործողություն կատարելու համար նրանք պետք է ընտրվեն․ Ոչ մի " -"օբյեկտ չի փոփոխվել։" - -msgid "No action selected." -msgstr "Գործողությունը ընտրված չէ։" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s %(obj)s֊ը հաջողությամբ հեռացվեց։" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Ավելացնել %s" - -#, python-format -msgid "Change %s" -msgstr "Փոփոխել %s" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "Տվյալների բազաի սխալ" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s հաջողությամբ փոփոխվեց։" -msgstr[1] "%(count)s %(name)s հաջողությամբ փոփոխվեցին։" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Ընտրված են %(total_count)s" -msgstr[1] "Բոլոր %(total_count)s֊ը ընտրված են " - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s֊ից 0֊ն ընտրված է" - -#, python-format -msgid "Change history: %s" -msgstr "Փոփոխությունների պատմություն %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(instance)s %(class_name)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(instance)s %(class_name)s֊ը հեռացնելու համար անհրաժեշտ է հեռացնել նրա հետ " -"կապված պաշտպանված օբյեկտները՝ %(related_objects)s" - -msgid "Django site admin" -msgstr "Django կայքի ադմինիստրավորման էջ" - -msgid "Django administration" -msgstr "Django ադմինիստրավորում" - -msgid "Site administration" -msgstr "Կայքի ադմինիստրավորում" - -msgid "Log in" -msgstr "Մուտք" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s ադմինիստրավորում" - -msgid "Page not found" -msgstr "Էջը գտնված չէ" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Ներողություն ենք հայցում, բայց հարցվող Էջը գտնված չէ" - -msgid "Home" -msgstr "Գլխավոր" - -msgid "Server error" -msgstr "Սերվերի սխալ" - -msgid "Server error (500)" -msgstr "Սերվերի սխալ (500)" - -msgid "Server Error (500)" -msgstr "Սերվերի սխալ (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Առաջացել է սխալ։ Ադմինիստրատորները տեղեկացվել են դրա մասին էլեկտրոնային " -"փոստի միջոցով և այն կուղղվի կարճ ժամանակահատվածի ընդացքում․ Շնորհակալ ենք " -"ձեր համբերության համար։" - -msgid "Run the selected action" -msgstr "Կատարել ընտրված գործողությունը" - -msgid "Go" -msgstr "Կատարել" - -msgid "Click here to select the objects across all pages" -msgstr "Սեղմեք այստեղ բոլոր էջերից օբյեկտներ ընտրելու համար" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Ընտրել բոլոր %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Չեղարկել ընտրությունը" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Սկզբում մուտքագրեք օգտագործողի անունը և գաղտնաբառը․ Հետո դուք " -"հնարավորություն կունենաք խմբագրել ավելին։" - -msgid "Enter a username and password." -msgstr "Մուտքագրեք օգտագործողի անունը և գաղտնաբառը։" - -msgid "Change password" -msgstr "Փոխել գաղտնաբառը" - -msgid "Please correct the error below." -msgstr "Ուղղեք ստորև նշված սխալը։" - -msgid "Please correct the errors below." -msgstr "Ուղղեք ստորև նշված սխալները․" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Մուտքագրեք նոր գաղտնաբառ %(username)s օգտագործողի համար։" - -msgid "Welcome," -msgstr "Բարի գալուստ, " - -msgid "View site" -msgstr "Դիտել կայքը" - -msgid "Documentation" -msgstr "Դոկումենտացիա" - -msgid "Log out" -msgstr "Դուրս գալ" - -#, python-format -msgid "Add %(name)s" -msgstr "Ավելացնել %(name)s" - -msgid "History" -msgstr "Պատմություն" - -msgid "View on site" -msgstr "Դիտել կայքում" - -msgid "Filter" -msgstr "Ֆիլտրել" - -msgid "Remove from sorting" -msgstr "Հեռացնել դասակարգումից" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Դասակարգման առաջնություն՝ %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toggle sorting" - -msgid "Delete" -msgstr "Հեռացնել" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s'֊ի հեռացումը կարող է հանգեցնել նրա հետ " -"կապված օբյեկտների հեռացմանը, բայց դուք չունեք իրավունք հեռացնել այդ տիպի " -"օբյեկտներ․" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s'֊ը հեռացնելու համար կարող է անհրաժեշտ " -"լինել հեռացնել նրա հետ կապված պաշտպանված օբյեկտները։" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Համոզված ե՞ք, որ ուզում եք հեռացնել %(object_name)s \"%(escaped_object)s\"֊" -"ը։ նրա հետ կապված այս բոլոր օբյեկտները կհեռացվեն․" - -msgid "Objects" -msgstr "Օբյեկտներ" - -msgid "Yes, I'm sure" -msgstr "Այո, ես համոզված եմ" - -msgid "No, take me back" -msgstr "Ոչ, տարեք ենձ ետ" - -msgid "Delete multiple objects" -msgstr "Հեռացնել մի քանի օբյեկտ" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"%(objects_name)s֊ների հեռացումը կարող է հանգեցնել նրա հետ կապված օբյեկտների " -"հեռացմանը, բայց դուք չունեք իրավունք հեռացնել այդ տիպի օբյեկտներ․" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s֊ը հեռացնելու համար կարող է անհրաժեշտ լինել հեռացնել նրա հետ " -"կապված պաշտպանված օբյեկտները։" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Համոզված ե՞ք, որ ուզում եք հեռացնել նշված %(objects_name)s֊ները։ Այս բոլոր " -"օբյեկտները, ինչպես նաև նրանց հետ կապված օբյեկտները կհեռացվեն․" - -msgid "View" -msgstr "" - -msgid "Delete?" -msgstr "Հեռացնե՞լ" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s " - -msgid "Summary" -msgstr "Ամփոփում" - -#, python-format -msgid "Models in the %(name)s application" -msgstr " %(name)s հավելվածի մոդել" - -msgid "Add" -msgstr "Ավելացնել" - -msgid "You don't have permission to view or edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Ոչինք չկա" - -msgid "Unknown content" -msgstr "Անհայտ կոնտենտ" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Ինչ֊որ բան այն չէ ձեր տվյալների բազայի հետ։ Համոզվեք, որ համապատասխան " -"աղյուսակները ստեղծվել են և համոզվեք, որ համապատասխան օգտագործողը կարող է " -"կարդալ բազան։" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Դուք մուտք եք գործել որպես %(username)s, բայց իրավունք չունեք դիտելու այս " -"էջը։ Ցանկանում ե՞ք մուտք գործել որպես այլ օգտագործող" - -msgid "Forgotten your password or username?" -msgstr "Մոռացել ե՞ք օգտագործողի անունը կամ գաղտնաբառը" - -msgid "Date/time" -msgstr "Ամսաթիվ/Ժամանակ" - -msgid "User" -msgstr "Օգտագործող" - -msgid "Action" -msgstr "Գործողություն" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Այս օբյեկտը չունի փոփոխման պատմություն։ Այն հավանաբար ավելացված չէ " -"ադմինիստրավորման էջից։" - -msgid "Show all" -msgstr "Ցույց տալ բոլորը" - -msgid "Save" -msgstr "Պահպանել" - -msgid "Popup closing..." -msgstr "Ելնող պատուհանը փակվում է" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Փոփոխել ընտրված %(model)s տիպի օբյեկտը" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "Ավելացնել այլ %(model)s տիպի օբյեկտ" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Հեռացնել ընտրված %(model)s տիպի օբյեկտը" - -msgid "Search" -msgstr "Փնտրել" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s արդյունք" -msgstr[1] "%(counter)s արդյունքներ" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s ընդհանուր" - -msgid "Save as new" -msgstr "Պահպանել որպես նոր" - -msgid "Save and add another" -msgstr "Պահպանել և ավելացնել նորը" - -msgid "Save and continue editing" -msgstr "Պահպանել և շարունակել խմբագրել" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Շնորհակալություն մեր կայքում ինչ֊որ ժամանակ ծախսելու համար։" - -msgid "Log in again" -msgstr "Մուտք գործել նորից" - -msgid "Password change" -msgstr "Փոխել գաղտնաբառը" - -msgid "Your password was changed." -msgstr "Ձեր գաղտնաբառը փոխվել է" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Մուտքագրեք ձեր հին գաղտնաբառը։ Անվտանգության նկատառումներով մուտքագրեք ձեր " -"նոր գաղտնաբառը երկու անգամ, որպեսզի մենք համոզված լինենք, որ այն ճիշտ է " -"հավաքված։" - -msgid "Change my password" -msgstr "Փոխել իմ գաղտնաբառը" - -msgid "Password reset" -msgstr "Գաղտնաբառի փոփոխում" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Ձեր գաղտնաբառը պահպանված է․ Կարող եք մուտք գործել։" - -msgid "Password reset confirmation" -msgstr "Գաղտնաբառի փոփոխման հաստատում" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Մուտքագրեք ձեր նոր գաղտնաբառը երկու անգամ, որպեսզի մենք համոզված լինենք, որ " -"այն ճիշտ է հավաքված։" - -msgid "New password:" -msgstr "Նոր գաղտնաբառ․" - -msgid "Confirm password:" -msgstr "Նոր գաղտնաբառը նորից․" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Գաղտնաբառի փոփոխման հղում է սխալ է, հավանաբար այն արդեն օգտագործվել է․ Դուք " -"կարող եք ստանալ նոր հղում։" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Մենք ուղարկեցինք ձեր էլեկտրոնային փոստի հասցեին գաղտնաբառը փոփոխելու " -"հրահանգներ․ Դուք շուտով կստանաք դրանք։" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Եթե դուք չեք ստացել էլեկտրոնային նամակ, համոզվեք, որ հավաքել եք այն հասցեն, " -"որով գրանցվել եք և ստուգեք ձեր սպամի թղթապանակը։" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Դուք ստացել եք այս նամակը, քանի որ ցանկացել եք փոխել ձեր գաղտնաբառը " -"%(site_name)s կայքում։" - -msgid "Please go to the following page and choose a new password:" -msgstr "Բացեք հետևյալ էջը և ընտրեք նոր գաղտնաբառ։" - -msgid "Your username, in case you've forgotten:" -msgstr "Եթե դուք մոռացել եք ձեր օգտագործողի անունը․" - -msgid "Thanks for using our site!" -msgstr "Շնորհակալություն մեր կայքից օգտվելու համար։" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s կայքի թիմ" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Մոռացել ե՞ք ձեր գաղտնաբառը Մուտքագրեք ձեր էլեկտրոնային փոստի հասցեն և մենք " -"կուղարկենք ձեզ հրահանգներ նորը ստանալու համար։" - -msgid "Email address:" -msgstr "Email հասցե․" - -msgid "Reset my password" -msgstr "Փոխել գաղտնաբառը" - -msgid "All dates" -msgstr "Բոլոր ամսաթվերը" - -#, python-format -msgid "Select %s" -msgstr "Ընտրեք %s" - -#, python-format -msgid "Select %s to change" -msgstr "Ընտրեք %s փոխելու համար" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Ամսաթիվ․" - -msgid "Time:" -msgstr "Ժամանակ․" - -msgid "Lookup" -msgstr "Որոնում" - -msgid "Currently:" -msgstr "Հիմա․" - -msgid "Change:" -msgstr "Փոփոխել" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo deleted file mode 100644 index b9a8fa2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po deleted file mode 100644 index e209f54..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,219 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ruben Harutyunov , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-01-15 10:40+0100\n" -"Last-Translator: Ruben Harutyunov \n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Հասանելի %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Սա հասանելի %s ցուցակ է։ Դուք կարող եք ընտրել նրանցից որոշները ընտրելով " -"դրանք ստորև գտնվող վանդակում և սեղմելով երկու վանդակների միջև գտնվող \"Ընտրել" -"\" սլաքը։" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Մուտքագրեք այս դաշտում հասանելի %s ցուցակը ֆիլտրելու համար։" - -msgid "Filter" -msgstr "Ֆիլտրել" - -msgid "Choose all" -msgstr "Ընտրել բոլորը" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Սեղմեք բոլոր %sը ընտրելու համար։" - -msgid "Choose" -msgstr "Ընտրել" - -msgid "Remove" -msgstr "Հեռացնել" - -#, javascript-format -msgid "Chosen %s" -msgstr "Ընտրված %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Սա հասանելի %sի ցուցակ է։ Դուք կարող եք հեռացնել նրանցից որոշները ընտրելով " -"դրանք ստորև գտնվող վանդակում և սեղմելով երկու վանդակների միջև գտնվող " -"\"Հեռացնել\" սլաքը։" - -msgid "Remove all" -msgstr "Հեռացնել բոլորը" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Սեղմեք բոլոր %sը հեռացնելու համար։" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Ընտրված է %(cnt)s-ից %(sel)s-ը" -msgstr[1] "Ընտրված է %(cnt)s-ից %(sel)s-ը" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Դուք ունեք չպահպանված անհատական խմբագրելի դաշտեր։ Եթե դուք կատարեք " -"գործողությունը, ձեր չպահպանված փոփոխությունները կկորեն։" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Դուք ընտրել եք գործողություն, բայց դեռ չեք պահպանել անհատական խմբագրելի " -"դաշտերի փոփոխությունները Սեղմեք OK պահպանելու համար։ Անհրաժեշտ կլինի " -"վերագործարկել գործողությունը" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Դուք ընտրել եք գործողություն, բայց դեռ չեք կատարել որևէ անհատական խմբագրելի " -"դաշտերի փոփոխություն Ձեզ հավանաբար պետք է Կատարել կոճակը, Պահպանել կոճակի " -"փոխարեն" - -msgid "Now" -msgstr "Հիմա" - -msgid "Midnight" -msgstr "Կեսգիշեր" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Կեսօր" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Ձեր ժամը առաջ է սերվերի ժամանակից %s ժամով" -msgstr[1] "Ձեր ժամը առաջ է սերվերի ժամանակից %s ժամով" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Ձեր ժամը հետ է սերվերի ժամանակից %s ժամով" -msgstr[1] "Ձեր ժամը հետ է սերվերի ժամանակից %s ժամով" - -msgid "Choose a Time" -msgstr "Ընտրեք ժամանակ" - -msgid "Choose a time" -msgstr "Ընտրեք ժամանակ" - -msgid "Cancel" -msgstr "Չեղարկել" - -msgid "Today" -msgstr "Այսօր" - -msgid "Choose a Date" -msgstr "Ընտրեք ամսաթիվ" - -msgid "Yesterday" -msgstr "Երեկ" - -msgid "Tomorrow" -msgstr "Վաղը" - -msgid "January" -msgstr "Հունվար" - -msgid "February" -msgstr "Փետրվար" - -msgid "March" -msgstr "Մարտ" - -msgid "April" -msgstr "Ապրիլ" - -msgid "May" -msgstr "Մայիս" - -msgid "June" -msgstr "Հունիս" - -msgid "July" -msgstr "Հուլիս" - -msgid "August" -msgstr "Օգոստոս" - -msgid "September" -msgstr "Սեպտեմբեր" - -msgid "October" -msgstr "Հոկտեմբեր" - -msgid "November" -msgstr "Նոյեմբեր" - -msgid "December" -msgstr "Դեկտեմբեր" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Կ" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Ե" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Ե" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Չ" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Հ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "ՈՒ" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Շ" - -msgid "Show" -msgstr "Ցույց տալ" - -msgid "Hide" -msgstr "Թաքցնել" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index 06ddd42..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index f7986c9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,664 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s delite con successo." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Non pote deler %(name)s" - -msgid "Are you sure?" -msgstr "Es tu secur?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Deler le %(verbose_name_plural)s seligite" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Totes" - -msgid "Yes" -msgstr "Si" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Incognite" - -msgid "Any date" -msgstr "Omne data" - -msgid "Today" -msgstr "Hodie" - -msgid "Past 7 days" -msgstr "Ultime 7 dies" - -msgid "This month" -msgstr "Iste mense" - -msgid "This year" -msgstr "Iste anno" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Action:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Adder un altere %(verbose_name)s" - -msgid "Remove" -msgstr "Remover" - -msgid "action time" -msgstr "hora de action" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "id de objecto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr de objecto" - -msgid "action flag" -msgstr "marca de action" - -msgid "change message" -msgstr "message de cambio" - -msgid "log entry" -msgstr "entrata de registro" - -msgid "log entries" -msgstr "entratas de registro" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" addite." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\" cambiate - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s\" delite." - -msgid "LogEntry Object" -msgstr "Objecto LogEntry" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Nulle campo cambiate." - -msgid "None" -msgstr "Nulle" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Es necessari seliger elementos pro poter exequer actiones. Nulle elemento ha " -"essite cambiate." - -msgid "No action selected." -msgstr "Nulle action seligite." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Le %(name)s \"%(obj)s\" ha essite delite con successo." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Adder %s" - -#, python-format -msgid "Change %s" -msgstr "Cambiar %s" - -msgid "Database error" -msgstr "Error in le base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s cambiate con successo." -msgstr[1] "%(count)s %(name)s cambiate con successo." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seligite" -msgstr[1] "Tote le %(total_count)s seligite" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seligite" - -#, python-format -msgid "Change history: %s" -msgstr "Historia de cambiamentos: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Administration del sito Django" - -msgid "Django administration" -msgstr "Administration de Django" - -msgid "Site administration" -msgstr "Administration del sito" - -msgid "Log in" -msgstr "Aperir session" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Pagina non trovate" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Regrettabilemente, le pagina requestate non poteva esser trovate." - -msgid "Home" -msgstr "Initio" - -msgid "Server error" -msgstr "Error del servitor" - -msgid "Server error (500)" -msgstr "Error del servitor (500)" - -msgid "Server Error (500)" -msgstr "Error del servitor (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Exequer le action seligite" - -msgid "Go" -msgstr "Va" - -msgid "Click here to select the objects across all pages" -msgstr "Clicca hic pro seliger le objectos in tote le paginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seliger tote le %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Rader selection" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Primo, specifica un nomine de usator e un contrasigno. Postea, tu potera " -"modificar plus optiones de usator." - -msgid "Enter a username and password." -msgstr "Specifica un nomine de usator e un contrasigno." - -msgid "Change password" -msgstr "Cambiar contrasigno" - -msgid "Please correct the error below." -msgstr "Per favor corrige le errores sequente." - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Specifica un nove contrasigno pro le usator %(username)s." - -msgid "Welcome," -msgstr "Benvenite," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Documentation" - -msgid "Log out" -msgstr "Clauder session" - -#, python-format -msgid "Add %(name)s" -msgstr "Adder %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Vider in sito" - -msgid "Filter" -msgstr "Filtro" - -msgid "Remove from sorting" -msgstr "Remover del ordination" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritate de ordination: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Alternar le ordination" - -msgid "Delete" -msgstr "Deler" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Deler le %(object_name)s '%(escaped_object)s' resultarea in le deletion de " -"objectos associate, me tu conto non ha le permission de deler objectos del " -"sequente typos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Deler le %(object_name)s '%(escaped_object)s' necessitarea le deletion del " -"sequente objectos associate protegite:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Es tu secur de voler deler le %(object_name)s \"%(escaped_object)s\"? Tote " -"le sequente objectos associate essera delite:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Si, io es secur" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Deler plure objectos" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Deler le %(objects_name)s seligite resultarea in le deletion de objectos " -"associate, ma tu conto non ha le permission de deler objectos del sequente " -"typos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Deler le %(objects_name)s seligite necessitarea le deletion del sequente " -"objectos associate protegite:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Es tu secur de voler deler le %(objects_name)s seligite? Tote le sequente " -"objectos e le objectos associate a illo essera delite:" - -msgid "Change" -msgstr "Cambiar" - -msgid "Delete?" -msgstr "Deler?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Per %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Adder" - -msgid "You don't have permission to edit anything." -msgstr "Tu non ha le permission de modificar alcun cosa." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Nihil disponibile" - -msgid "Unknown content" -msgstr "Contento incognite" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Il ha un problema con le installation del base de datos. Assecura te que le " -"tabellas correcte ha essite create, e que le base de datos es legibile pro " -"le usator appropriate." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Contrasigno o nomine de usator oblidate?" - -msgid "Date/time" -msgstr "Data/hora" - -msgid "User" -msgstr "Usator" - -msgid "Action" -msgstr "Action" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Iste objecto non ha un historia de cambiamentos. Illo probabilemente non " -"esseva addite per medio de iste sito administrative." - -msgid "Show all" -msgstr "Monstrar toto" - -msgid "Save" -msgstr "Salveguardar" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Cercar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultato" -msgstr[1] "%(counter)s resultatos" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s in total" - -msgid "Save as new" -msgstr "Salveguardar como nove" - -msgid "Save and add another" -msgstr "Salveguardar e adder un altere" - -msgid "Save and continue editing" -msgstr "Salveguardar e continuar le modification" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Gratias pro haber passate un tempore agradabile con iste sito web." - -msgid "Log in again" -msgstr "Aperir session de novo" - -msgid "Password change" -msgstr "Cambio de contrasigno" - -msgid "Your password was changed." -msgstr "Tu contrasigno ha essite cambiate." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Per favor specifica tu ancian contrasigno, pro securitate, e postea " -"specifica tu nove contrasigno duo vices pro verificar que illo es scribite " -"correctemente." - -msgid "Change my password" -msgstr "Cambiar mi contrasigno" - -msgid "Password reset" -msgstr "Reinitialisar contrasigno" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Tu contrasigno ha essite reinitialisate. Ora tu pote aperir session." - -msgid "Password reset confirmation" -msgstr "Confirmation de reinitialisation de contrasigno" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Per favor scribe le nove contrasigno duo vices pro verificar que illo es " -"scribite correctemente." - -msgid "New password:" -msgstr "Nove contrasigno:" - -msgid "Confirm password:" -msgstr "Confirma contrasigno:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Le ligamine pro le reinitialisation del contrasigno esseva invalide, forsan " -"perque illo ha jam essite usate. Per favor submitte un nove demanda de " -"reinitialisation del contrasigno." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "Per favor va al sequente pagina pro eliger un nove contrasigno:" - -msgid "Your username, in case you've forgotten:" -msgstr "Tu nomine de usator, in caso que tu lo ha oblidate:" - -msgid "Thanks for using our site!" -msgstr "Gratias pro usar nostre sito!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Le equipa de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "Reinitialisar mi contrasigno" - -msgid "All dates" -msgstr "Tote le datas" - -#, python-format -msgid "Select %s" -msgstr "Selige %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selige %s a modificar" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Recerca" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 4c9eccc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po deleted file mode 100644 index 8285097..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,216 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponibile" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ecce le lista de %s disponibile. Tu pote seliger alcunes in le quadro " -"sequente; postea clicca le flecha \"Seliger\" inter le duo quadros." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Scribe in iste quadro pro filtrar le lista de %s disponibile." - -msgid "Filter" -msgstr "Filtrar" - -msgid "Choose all" -msgstr "Seliger totes" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Clicca pro seliger tote le %s immediatemente." - -msgid "Choose" -msgstr "Seliger" - -msgid "Remove" -msgstr "Remover" - -#, javascript-format -msgid "Chosen %s" -msgstr "Le %s seligite" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ecce le lista de %s seligite. Tu pote remover alcunes per seliger los in le " -"quadro sequente e cliccar le flecha \"Remover\" inter le duo quadros." - -msgid "Remove all" -msgstr "Remover totes" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Clicca pro remover tote le %s seligite immediatemente." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seligite" -msgstr[1] "%(sel)s de %(cnt)s seligite" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Il ha cambiamentos non salveguardate in certe campos modificabile. Si tu " -"exeque un action, iste cambiamentos essera perdite." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Tu ha seligite un action, ma tu non ha salveguardate le cambiamentos in " -"certe campos. Per favor clicca OK pro salveguardar los. Tu debera re-exequer " -"le action." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Tu ha seligite un action, e tu non ha facite cambiamentos in alcun campo. Tu " -"probabilemente cerca le button Va e non le button Salveguardar." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Ora" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Selige un hora" - -msgid "Midnight" -msgstr "Medienocte" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediedie" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Cancellar" - -msgid "Today" -msgstr "Hodie" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Heri" - -msgid "Tomorrow" -msgstr "Deman" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Monstrar" - -msgid "Hide" -msgstr "Celar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index 6a3857d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index 5a37c64..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,791 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bayu Satiyo , 2024 -# Claude Paroz , 2014 -# Fery Setiawan , 2015-2019,2021-2024 -# Jannis Leidel , 2011 -# M Asep Indrayana , 2015 -# oon arfiandwi (OonID) , 2016,2020 -# rodin , 2011-2013 -# rodin , 2013-2017 -# sag​e , 2019 -# Sutrisno Efendi , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Fery Setiawan , 2015-2019,2021-2024\n" -"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Hapus %(verbose_name_plural)s yang dipilih" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Sukses menghapus %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Tidak dapat menghapus %(name)s" - -msgid "Delete multiple objects" -msgstr "Hapus beberapa objek sekaligus" - -msgid "Administration" -msgstr "Administrasi" - -msgid "All" -msgstr "Semua" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Tidak" - -msgid "Unknown" -msgstr "Tidak diketahui" - -msgid "Any date" -msgstr "Kapanpun" - -msgid "Today" -msgstr "Hari ini" - -msgid "Past 7 days" -msgstr "Tujuh hari terakhir" - -msgid "This month" -msgstr "Bulan ini" - -msgid "This year" -msgstr "Tahun ini" - -msgid "No date" -msgstr "Tidak ada tanggal" - -msgid "Has date" -msgstr "Ada tanggal" - -msgid "Empty" -msgstr "Kosong" - -msgid "Not empty" -msgstr "Tidak kosong" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Masukkan nama pengguna %(username)s dan sandi yang benar untuk akun staf. " -"Huruf besar/kecil pada bidang ini berpengaruh." - -msgid "Action:" -msgstr "Aksi:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Tambahkan %(verbose_name)s lagi" - -msgid "Remove" -msgstr "Hapus" - -msgid "Addition" -msgstr "Tambahan" - -msgid "Change" -msgstr "Ubah" - -msgid "Deletion" -msgstr "Penghapusan" - -msgid "action time" -msgstr "waktu aksi" - -msgid "user" -msgstr "pengguna" - -msgid "content type" -msgstr "jenis isi" - -msgid "object id" -msgstr "id objek" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "representasi objek" - -msgid "action flag" -msgstr "jenis aksi" - -msgid "change message" -msgstr "ganti pesan" - -msgid "log entry" -msgstr "entri pencatatan" - -msgid "log entries" -msgstr "entri pencatatan" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” ditambahkan." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” diubah — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s” dihapus." - -msgid "LogEntry Object" -msgstr "Objek LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” ditambahkan." - -msgid "Added." -msgstr "Ditambahkan." - -msgid "and" -msgstr "dan" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} diubah untuk {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} berubah." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” dihapus." - -msgid "No fields changed." -msgstr "Tidak ada bidang yang berubah." - -msgid "None" -msgstr "None" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Tekan “Control”, atau “Command” pada Mac, untuk memilih lebih dari satu." - -msgid "Select this object for an action - {}" -msgstr "Pilih objek ini untuk suatu aksi - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” berhasil ditambahkan." - -msgid "You may edit it again below." -msgstr "Anda dapat menyunting itu kembali di bawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” berhasil ditambahkan. Anda dapat menambahkan {name} lain di " -"bawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” berhasil diubah. Anda dapat mengeditnya kembali di bawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” berhasil diubah. Anda dapat menambahkan {name} lain di bawah." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” berhasil diubah." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Objek harus dipilih sebelum dimanipulasi. Tidak ada objek yang berubah." - -msgid "No action selected." -msgstr "Tidak ada aksi yang dipilih." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” berhasil dihapus." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s dengan ID “%(key)s” tidak ada. Mungkin telah dihapus?" - -#, python-format -msgid "Add %s" -msgstr "Tambahkan %s" - -#, python-format -msgid "Change %s" -msgstr "Ubah %s" - -#, python-format -msgid "View %s" -msgstr "Lihat %s" - -msgid "Database error" -msgstr "Galat basis data" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s berhasil diubah." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s dipilih" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 dari %(cnt)s dipilih" - -msgid "Delete" -msgstr "Hapus" - -#, python-format -msgid "Change history: %s" -msgstr "Ubah riwayat: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Menghapus %(class_name)s %(instance)s memerlukan penghapusanobjek " -"terlindungi yang terkait sebagai berikut: %(related_objects)s" - -msgid "Django site admin" -msgstr "Admin situs Django" - -msgid "Django administration" -msgstr "Administrasi Django" - -msgid "Site administration" -msgstr "Administrasi situs" - -msgid "Log in" -msgstr "Masuk" - -#, python-format -msgid "%(app)s administration" -msgstr "Administrasi %(app)s" - -msgid "Page not found" -msgstr "Laman tidak ditemukan" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Maaf, laman yang Anda minta tidak ditemukan." - -msgid "Home" -msgstr "Beranda" - -msgid "Server error" -msgstr "Galat server" - -msgid "Server error (500)" -msgstr "Galat server (500)" - -msgid "Server Error (500)" -msgstr "Galat Server (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Terjadi sebuah galat dan telah dilaporkan ke administrator situs melalui " -"surel untuk diperbaiki. Terima kasih atas pengertian Anda." - -msgid "Run the selected action" -msgstr "Jalankan aksi terpilih" - -msgid "Go" -msgstr "Buka" - -msgid "Click here to select the objects across all pages" -msgstr "Klik di sini untuk memilih semua objek pada semua laman" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Pilih seluruh %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Bersihkan pilihan" - -msgid "Breadcrumbs" -msgstr "Breadcrumbs" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Model pada aplikasi %(name)s" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Tambah" - -msgid "View" -msgstr "Lihat" - -msgid "You don’t have permission to view or edit anything." -msgstr "Anda tidak memiliki izin untuk melihat atau mengedit apa pun." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Ganti sandi" - -msgid "Set password" -msgstr "Setel sandi" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Harap perbaiki kesalahan dibawah." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Masukkan sandi baru untuk pengguna %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Tindakan ini akan enable autentifikasi brerdasarkan-sandi " -"untuk pengguna ini." - -msgid "Disable password-based authentication" -msgstr "Tiadakan autentifikasu berdasarkan-sandi" - -msgid "Enable password-based authentication" -msgstr "Adakan autentifikasu berdasarkan-sandi" - -msgid "Skip to main content" -msgstr "Lewati ke isi utama" - -msgid "Welcome," -msgstr "Selamat datang," - -msgid "View site" -msgstr "Lihat situs" - -msgid "Documentation" -msgstr "Dokumentasi" - -msgid "Log out" -msgstr "Keluar" - -#, python-format -msgid "Add %(name)s" -msgstr "Tambahkan %(name)s" - -msgid "History" -msgstr "Riwayat" - -msgid "View on site" -msgstr "Lihat di situs" - -msgid "Filter" -msgstr "Filter" - -msgid "Hide counts" -msgstr "Sembunyikan hitungan" - -msgid "Show counts" -msgstr "Tampilkan hitungan" - -msgid "Clear all filters" -msgstr "Hapus semua penyaringan" - -msgid "Remove from sorting" -msgstr "Dihapus dari pengurutan" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritas pengurutan: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Ubah pengurutan" - -msgid "Toggle theme (current theme: auto)" -msgstr "Ganti tema (tema saat ini: otomatis)" - -msgid "Toggle theme (current theme: light)" -msgstr "Ganti tema (tema saat ini: terang)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Ganti tema (tema saat ini: gelap)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Menghapus %(object_name)s '%(escaped_object)s' akan menghapus objek lain " -"yang terkait, tetapi akun Anda tidak memiliki izin untuk menghapus objek " -"dengan tipe berikut:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Menghapus %(object_name)s '%(escaped_object)s' memerlukan penghapusan objek " -"terlindungi yang terkait sebagai berikut:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Yakin ingin menghapus %(object_name)s \"%(escaped_object)s\"? Semua objek " -"lain yang terkait juga akan dihapus:" - -msgid "Objects" -msgstr "Objek" - -msgid "Yes, I’m sure" -msgstr "Ya, saya yakin" - -msgid "No, take me back" -msgstr "Tidak, bawa saya kembali" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Menghapus %(objects_name)s terpilih akan menghapus objek yang terkait, " -"tetapi akun Anda tidak memiliki izin untuk menghapus objek dengan tipe " -"berikut:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Menghapus %(objects_name)s terpilih memerlukan penghapusan objek terlindungi " -"yang terkait sebagai berikut:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Yakin akan menghapus %(objects_name)s terpilih? Semua objek berikut beserta " -"objek terkait juga akan dihapus:" - -msgid "Delete?" -msgstr "Hapus?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Berdasarkan %(filter_title)s " - -msgid "Summary" -msgstr "Ringkasan" - -msgid "Recent actions" -msgstr "Tindakan terbaru" - -msgid "My actions" -msgstr "Tindakan saya" - -msgid "None available" -msgstr "Tidak ada yang tersedia" - -msgid "Added:" -msgstr "Ditambahkan:" - -msgid "Changed:" -msgstr "Berubah:" - -msgid "Deleted:" -msgstr "Dihapus:" - -msgid "Unknown content" -msgstr "Konten tidak diketahui" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Ada masalah dengan instalasi basis data Anda. Pastikan tabel yang sesuai " -"pada basis data telah dibuat dan dapat dibaca oleh pengguna yang sesuai." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Anda diautentikasi sebagai %(username)s, tapi tidak diperbolehkan untuk " -"mengakses halaman ini. Ingin mencoba mengakses menggunakan akun yang lain?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Alihkan navigasi" - -msgid "Sidebar" -msgstr "Sidebar" - -msgid "Start typing to filter…" -msgstr "Mulai mengetik untuk menyaring..." - -msgid "Filter navigation items" -msgstr "Navigasi pencarian barang" - -msgid "Date/time" -msgstr "Tanggal/waktu" - -msgid "User" -msgstr "Pengguna" - -msgid "Action" -msgstr "Aksi" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "masukan" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Objek ini tidak memiliki riwayat perubahan. Mungkin objek ini tidak " -"ditambahkan melalui situs administrasi ini." - -msgid "Show all" -msgstr "Tampilkan semua" - -msgid "Save" -msgstr "Simpan" - -msgid "Popup closing…" -msgstr "Menutup jendela sembulan..." - -msgid "Search" -msgstr "Cari" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s buah" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Simpan sebagai baru" - -msgid "Save and add another" -msgstr "Simpan dan tambahkan lagi" - -msgid "Save and continue editing" -msgstr "Simpan dan terus mengedit" - -msgid "Save and view" -msgstr "Simpan dan tampilkan" - -msgid "Close" -msgstr "Tutup" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Ubah %(model)s yang dipilih" - -#, python-format -msgid "Add another %(model)s" -msgstr "Tambahkan %(model)s yang lain" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Hapus %(model)s yang dipilih" - -#, python-format -msgid "View selected %(model)s" -msgstr "Menampilkan %(model)s terpilih" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Terima kasih untuk meluangkan waktu berkualitas dengan jaringan situs hari " -"ini." - -msgid "Log in again" -msgstr "Masuk kembali" - -msgid "Password change" -msgstr "Ubah sandi" - -msgid "Your password was changed." -msgstr "Sandi Anda telah diubah." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Masukkan sandi lama Anda, demi alasan keamanan, dan masukkan sandi baru Anda " -"dua kali untuk memastikan Anda tidak salah mengetikkannya." - -msgid "Change my password" -msgstr "Ubah sandi saya" - -msgid "Password reset" -msgstr "Setel ulang sandi" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Sandi Anda telah diperbarui. Silakan masuk." - -msgid "Password reset confirmation" -msgstr "Konfirmasi penyetelan ulang sandi" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Masukkan sandi baru dua kali untuk memastikan Anda tidak salah " -"mengetikkannya." - -msgid "New password:" -msgstr "Sandi baru:" - -msgid "Confirm password:" -msgstr "Konfirmasi sandi:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Tautan penyetelan ulang sandi tidak valid. Kemungkinan karena tautan " -"tersebut telah dipakai sebelumnya. Ajukan permintaan penyetelan sandi sekali " -"lagi." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Kami telah mengirimi Anda surel berisi petunjuk untuk mengatur sandi Anda, " -"jika ada akun dengan alamat surel yang sesuai. Anda seharusnya menerima " -"surel tersebut sesaat lagi." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jika Anda tidak menerima surel, pastikan Anda telah memasukkan alamat yang " -"digunakan saat pendaftaran serta periksa folder spam Anda." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Anda menerima email ini karena Anda meminta penyetelan ulang sandi untuk " -"akun pengguna di %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Kunjungi laman di bawah ini dan ketikkan sandi baru:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Terima kasih telah menggunakan situs kami!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Tim %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Lupa sandi Anda? Masukkan alamat surel Anda di bawah ini dan kami akan " -"mengirimkan petunjuk untuk mengatur sandi baru Anda." - -msgid "Email address:" -msgstr "Alamat email:" - -msgid "Reset my password" -msgstr "Setel ulang sandi saya" - -msgid "Select all objects on this page for an action" -msgstr "Pilih semua objek di halaman ini untuk suatu aksi" - -msgid "All dates" -msgstr "Semua tanggal" - -#, python-format -msgid "Select %s" -msgstr "Pilih %s" - -#, python-format -msgid "Select %s to change" -msgstr "Pilih %s untuk diubah" - -#, python-format -msgid "Select %s to view" -msgstr "Pilih %s untuk melihat" - -msgid "Date:" -msgstr "Tanggal:" - -msgid "Time:" -msgstr "Waktu:" - -msgid "Lookup" -msgstr "Cari" - -msgid "Currently:" -msgstr "Saat ini:" - -msgid "Change:" -msgstr "Ubah:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo deleted file mode 100644 index d338e9f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po deleted file mode 100644 index ef55ec2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,310 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fery Setiawan , 2015-2016,2021-2024 -# Jannis Leidel , 2011 -# oon arfiandwi (OonID) , 2020 -# rodin , 2011-2012 -# rodin , 2014,2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Fery Setiawan , 2015-2016,2021-2024\n" -"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s yang tersedia" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Ketik pada kotak ini untuk menyaring daftar %s yang tersedia." - -msgid "Filter" -msgstr "Filter" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s terpilih" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Ketik di dalam kotak utnuk menyaring daftar dar %s terpilih." - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s pilihan terpilih tidak muncul" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s dari %(cnt)s terpilih" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Beberapa perubahan bidang yang Anda lakukan belum tersimpan. Perubahan yang " -"telah dilakukan akan hilang." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Anda telah memilih tindakan, tetapi Anda belum menyimpan perubahan ke masing-" -"masing bidang. Silakan klik OK untuk menyimpan. Anda harus menjalankan " -"kembali tindakan tersebut." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Anda telah memilih tindakan, dan Anda belum membuat perubahan apa pun di " -"setiap bidang. Anda mungkin mencari tombol Buka daripada tombol Simpan." - -msgid "Now" -msgstr "Sekarang" - -msgid "Midnight" -msgstr "Tengah malam" - -msgid "6 a.m." -msgstr "6 pagi" - -msgid "Noon" -msgstr "Siang" - -msgid "6 p.m." -msgstr "18.00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Catatan: Waktu Anda lebih cepat %s jam dibandingkan waktu server." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Catatan: Waktu Anda lebih lambat %s jam dibandingkan waktu server." - -msgid "Choose a Time" -msgstr "Pilih Waktu" - -msgid "Choose a time" -msgstr "Pilih waktu" - -msgid "Cancel" -msgstr "Batal" - -msgid "Today" -msgstr "Hari ini" - -msgid "Choose a Date" -msgstr "Pilih Tanggal" - -msgid "Yesterday" -msgstr "Kemarin" - -msgid "Tomorrow" -msgstr "Besok" - -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Maret" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "Agustus" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Agu" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgid "Sunday" -msgstr "Ahad" - -msgid "Monday" -msgstr "Senin" - -msgid "Tuesday" -msgstr "Selasa" - -msgid "Wednesday" -msgstr "Rabu" - -msgid "Thursday" -msgstr "Kamis" - -msgid "Friday" -msgstr "Jum'at" - -msgid "Saturday" -msgstr "Sabtu" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Ahd" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Sen" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Sel" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Rab" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Kam" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Jum" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sab" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "M" - -msgctxt "one letter Monday" -msgid "M" -msgstr "S" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "S" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "R" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "K" - -msgctxt "one letter Friday" -msgid "F" -msgstr "J" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index abe5bb5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index ddf09c2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,668 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viko Bartero , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-20 01:58+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s eliminesis sucesoze." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Onu ne povas eliminar %(name)s" - -msgid "Are you sure?" -msgstr "Ka vu esas certa?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar selektita %(verbose_name_plural)s" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Omni" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Nekonocato" - -msgid "Any date" -msgstr "Irga dato" - -msgid "Today" -msgstr "Hodie" - -msgid "Past 7 days" -msgstr "7 antea dii" - -msgid "This month" -msgstr "Ca monato" - -msgid "This year" -msgstr "Ca yaro" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Skribez la korekta %(username)s e pasvorto di kelka staff account. Remarkez " -"ke both feldi darfas rikonocar miniskulo e mayuskulo." - -msgid "Action:" -msgstr "Ago:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Agregar altra %(verbose_name)s" - -msgid "Remove" -msgstr "Eliminar" - -msgid "action time" -msgstr "horo dil ago" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "id dil objekto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr dil objekto" - -msgid "action flag" -msgstr "flago dil ago" - -msgid "change message" -msgstr "chanjar mesajo" - -msgid "log entry" -msgstr "logo informo" - -msgid "log entries" -msgstr "logo informi" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" agregesis." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\" chanjesis - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s\" eliminesis." - -msgid "LogEntry Object" -msgstr "LogEntry Objekto" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Nula feldo chanjesis." - -msgid "None" -msgstr "Nula" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Onu devas selektar la objekti por aplikar oli irga ago. Nula objekto " -"chanjesis." - -msgid "No action selected." -msgstr "Nula ago selektesis." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "La %(name)s \"%(obj)s\" eliminesis sucesoze." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Agregar %s" - -#, python-format -msgid "Change %s" -msgstr "Chanjar %s" - -msgid "Database error" -msgstr "Eroro del datumaro" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s chanjesis sucesoze." -msgstr[1] "%(count)s %(name)s chanjesis sucesoze." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selektita" -msgstr[1] "La %(total_count)s selektita" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Selektita 0 di %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Modifikuro historio: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Por eliminar %(class_name)s %(instance)s on mustas eliminar la sequanta " -"protektita objekti relatita: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django situo admin" - -msgid "Django administration" -msgstr "Django administreyo" - -msgid "Site administration" -msgstr "Administrayo dil ret-situo" - -msgid "Log in" -msgstr "Startar sesiono" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "La pagino ne renkontresis" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Pardonez, ma la demandita pagino ne renkontresis." - -msgid "Home" -msgstr "Hemo" - -msgid "Server error" -msgstr "Eroro del servilo" - -msgid "Server error (500)" -msgstr "Eroro del servilo (500)" - -msgid "Server Error (500)" -msgstr "Eroro del servilo (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Eroro eventis. Ico informesis per e-posto a la administranti dil ret-situo e " -"la eroro esos korektigata balde. Danko pro vua pacienteso." - -msgid "Run the selected action" -msgstr "Exekutar la selektita ago" - -msgid "Go" -msgstr "Irar" - -msgid "Click here to select the objects across all pages" -msgstr "Kliktez hike por selektar la objekti di omna pagini" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Selektar omna %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Desfacar selekto" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Unesme, skribez uzer-nomo ed pasvorto. Pos, vu povos modifikar altra uzer-" -"selekto." - -msgid "Enter a username and password." -msgstr "Skribez uzer-nomo ed pasvorto." - -msgid "Change password" -msgstr "Chanjar pasvorto" - -msgid "Please correct the error below." -msgstr "Korektigez la eroro infre." - -msgid "Please correct the errors below." -msgstr "Korektigez la erori infre." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Skribez nova pasvorto por la uzero %(username)s." - -msgid "Welcome," -msgstr "Bonvenez," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Dokumento" - -msgid "Log out" -msgstr "Klozar sesiono" - -#, python-format -msgid "Add %(name)s" -msgstr "Agregar %(name)s" - -msgid "History" -msgstr "Historio" - -msgid "View on site" -msgstr "Vidar en la ret-situo" - -msgid "Filter" -msgstr "Filtrar" - -msgid "Remove from sorting" -msgstr "Eskartar de klasifiko" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Precedo dil klasifiko: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Aktivar/desaktivar klasifiko" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar la %(object_name)s '%(escaped_object)s' eliminos relatita objekti, " -"ma vua account ne havas permiso por eliminar la sequanta objekti:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Eliminar la %(object_name)s '%(escaped_object)s' eliminus la sequanta " -"protektita objekti relatita:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ka vu volas eliminar la %(object_name)s \"%(escaped_object)s\"? Omna " -"sequanta objekti relatita eliminesos:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Yes, me esas certa" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Eliminar multopla objekti" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Eliminar la selektita %(objects_name)s eliminos relatita objekti, ma vua " -"account ne havas permiso por eliminar la sequanta objekti:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Eliminar la selektita %(objects_name)s eliminos la sequanta protektita " -"objekti relatita:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ka vu volas eliminar la selektita %(objects_name)s? Omna sequanta objekti ed " -"olia relatita objekti eliminesos:" - -msgid "Change" -msgstr "Modifikar" - -msgid "Delete?" -msgstr "Ka eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Per %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeli en la %(name)s apliko" - -msgid "Add" -msgstr "Agregar" - -msgid "You don't have permission to edit anything." -msgstr "Vu ne havas permiso por facar modifiki." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Nulo disponebla" - -msgid "Unknown content" -msgstr "Nekonocata kontenajo" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Vua datumaro instaluro esas defektiva. Verifikez ke la datumaro tabeli " -"kreadesis e ke la uzero havas permiso por lektar la datumaro." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Ka vu obliviis vua pasvorto od uzer-nomo?" - -msgid "Date/time" -msgstr "Dato/horo" - -msgid "User" -msgstr "Uzero" - -msgid "Action" -msgstr "Ago" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Ica objekto ne havas chanjo-historio. Olu forsan ne agregesis per ica " -"administrala ret-situo." - -msgid "Show all" -msgstr "Montrar omni" - -msgid "Save" -msgstr "Salvar" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Serchar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resulto" -msgstr[1] "%(counter)s resulti" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s totala" - -msgid "Save as new" -msgstr "Salvar kom nova" - -msgid "Save and add another" -msgstr "Salvar ed agregar altra" - -msgid "Save and continue editing" -msgstr "Salvar e durar la modifiko" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Danko pro vua spensita tempo en la ret-situo hodie." - -msgid "Log in again" -msgstr "Ristartar sesiono" - -msgid "Password change" -msgstr "Pasvorto chanjo" - -msgid "Your password was changed." -msgstr "Vua pasvorto chanjesis." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por kauciono, skribez vua anta pasvorto e pos skribez vua nova pasvorto " -"dufoye por verifikar ke olu skribesis korekte." - -msgid "Change my password" -msgstr "Modifikar mea pasvorto" - -msgid "Password reset" -msgstr "Pasvorto chanjo" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vua pasvorto chanjesis. Vu darfas startar sesiono nun." - -msgid "Password reset confirmation" -msgstr "Pasvorto chanjo konfirmo" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Skribez vua nova pasvorto dufoye por verifikar ke olu skribesis korekte." - -msgid "New password:" -msgstr "Nova pasvorto:" - -msgid "Confirm password:" -msgstr "Konfirmez pasvorto:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"La link por chanjar pasvorto ne esis valida, forsan pro ke olu ja uzesis. " -"Demandez nova pasvorto chanjo." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se vu ne recevas mesajo, verifikez ke vu skribis la sama e-posto adreso " -"uzita por vua registro e lektez vua spam mesaji." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Vu esas recevanta ica mesajo pro ke vu demandis pasvorto chanjo por vua " -"uzero account che %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Irez al sequanta pagino e selektez nova pasvorto:" - -msgid "Your username, in case you've forgotten:" -msgstr "Vua uzernomo, se vu obliviis olu:" - -msgid "Thanks for using our site!" -msgstr "Danko pro uzar nia ret-situo!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "La equipo di %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Ka vu obliviis vua pasvorto? Skribez vua e-posto adreso infre e ni sendos " -"instrucioni por kreadar nova pasvorto." - -msgid "Email address:" -msgstr "E-postala adreso:" - -msgid "Reset my password" -msgstr "Chanjar mea pasvorto" - -msgid "All dates" -msgstr "Omna dati" - -#, python-format -msgid "Select %s" -msgstr "Selektar %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selektar %s por chanjar" - -msgid "Date:" -msgstr "Dato:" - -msgid "Time:" -msgstr "Horo:" - -msgid "Lookup" -msgstr "Serchado" - -msgid "Currently:" -msgstr "Aktuale" - -msgid "Change:" -msgstr "Chanjo:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo deleted file mode 100644 index fba64da..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po deleted file mode 100644 index d7be82e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,145 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:11+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/projects/p/django/language/" -"io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "" - -msgid "Clock" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Calendar" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" - -msgid "S M T W T F S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index 5532968..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index 868a452..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,720 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dagur Ammendrup , 2019 -# Hafsteinn Einarsson , 2011-2012 -# Jannis Leidel , 2011 -# 479d446b5da12875beba10cac54e9faf_a7ca1e7 , 2013 -# Thordur Sigurdsson , 2016-2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-14 19:53+0200\n" -"PO-Revision-Date: 2020-07-14 22:38+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eyddi %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Get ekki eytt %(name)s" - -msgid "Are you sure?" -msgstr "Ertu viss?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eyða völdum %(verbose_name_plural)s" - -msgid "Administration" -msgstr "Vefstjórn" - -msgid "All" -msgstr "Allt" - -msgid "Yes" -msgstr "Já" - -msgid "No" -msgstr "Nei" - -msgid "Unknown" -msgstr "Óþekkt" - -msgid "Any date" -msgstr "Allar dagsetningar" - -msgid "Today" -msgstr "Dagurinn í dag" - -msgid "Past 7 days" -msgstr "Síðustu 7 dagar" - -msgid "This month" -msgstr "Þessi mánuður" - -msgid "This year" -msgstr "Þetta ár" - -msgid "No date" -msgstr "Engin dagsetning" - -msgid "Has date" -msgstr "Hefur dagsetningu" - -msgid "Empty" -msgstr "Tómt" - -msgid "Not empty" -msgstr "Ekki tómt" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Vinsamlegast sláðu inn rétt %(username)s og lykilorð fyrir starfsmanna " -"aðgang. Takið eftir að í báðum reitum skipta há- og lágstafir máli." - -msgid "Action:" -msgstr "Aðgerð:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Bæta við öðrum %(verbose_name)s" - -msgid "Remove" -msgstr "Fjarlægja" - -msgid "Addition" -msgstr "Viðbót" - -msgid "Change" -msgstr "Breyta" - -msgid "Deletion" -msgstr "Eyðing" - -msgid "action time" -msgstr "tími aðgerðar" - -msgid "user" -msgstr "notandi" - -msgid "content type" -msgstr "efnistag" - -msgid "object id" -msgstr "kenni hlutar" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "framsetning hlutar" - -msgid "action flag" -msgstr "aðgerðarveifa" - -msgid "change message" -msgstr "breyta skilaboði" - -msgid "log entry" -msgstr "kladdafærsla" - -msgid "log entries" -msgstr "kladdafærslur" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Bætti við „%(object)s“." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Breytti „%(object)s“ — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Eyddi „%(object)s.“" - -msgid "LogEntry Object" -msgstr "LogEntry hlutur" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Bætti við {name} „{object}“." - -msgid "Added." -msgstr "Bætti við." - -msgid "and" -msgstr "og" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Breytti {fields} fyrir {name} „{object}“." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Breytti {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Eyddi {name} „{object}“." - -msgid "No fields changed." -msgstr "Engum reitum breytt." - -msgid "None" -msgstr "Ekkert" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Haltu inni „Control“, eða „Command“ á Mac til þess að velja fleira en eitt." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}“ var bætt við." - -msgid "You may edit it again below." -msgstr "Þú mátt breyta þessu aftur hér að neðan." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} „{obj}“ hefur verið bætt við. Þú getur bætt við öðru {name} að neðan." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} „{obj}“ hefur verið breytt. Þú getur breytt því aftur að neðan." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} „{obj}“ hefur verið bætt við. Þú getur breytt því aftur að neðan." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" hefur verið breytt. Þú getur bætt við öðru {name} að neðan." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}“ hefur verið breytt." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Hlutir verða að vera valdir til að framkvæma aðgerðir á þeim. Engu hefur " -"verið breytt." - -msgid "No action selected." -msgstr "Engin aðgerð valin." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s“ var eytt." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s með ID \"%(key)s\" er ekki til. Var því mögulega eytt?" - -#, python-format -msgid "Add %s" -msgstr "Bæta við %s" - -#, python-format -msgid "Change %s" -msgstr "Breyta %s" - -#, python-format -msgid "View %s" -msgstr "Skoða %s" - -msgid "Database error" -msgstr "Gagnagrunnsvilla" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s var breytt." -msgstr[1] "%(count)s %(name)s var breytt." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Allir %(total_count)s valdir" -msgstr[1] "Allir %(total_count)s valdir" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 af %(cnt)s valin" - -#, python-format -msgid "Change history: %s" -msgstr "Breytingarsaga: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Að eyða %(class_name)s %(instance)s þyrfti að eyða eftirfarandi tengdum " -"hlutum: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django vefstjóri" - -msgid "Django administration" -msgstr "Django vefstjórn" - -msgid "Site administration" -msgstr "Vefstjóri" - -msgid "Log in" -msgstr "Skrá inn" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s vefstjórn" - -msgid "Page not found" -msgstr "Síða fannst ekki" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Því miður fannst umbeðin síða ekki." - -msgid "Home" -msgstr "Heim" - -msgid "Server error" -msgstr "Kerfisvilla" - -msgid "Server error (500)" -msgstr "Kerfisvilla (500)" - -msgid "Server Error (500)" -msgstr "Kerfisvilla (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Villa kom upp. Hún hefur verið tilkynnt til vefstjóra með tölvupósti og ætti " -"að lagast fljótlega. Þökkum þolinmæðina." - -msgid "Run the selected action" -msgstr "Keyra valda aðgerð" - -msgid "Go" -msgstr "Áfram" - -msgid "Click here to select the objects across all pages" -msgstr "Smelltu hér til að velja alla hluti" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Velja alla %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Hreinsa val" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Módel í appinu %(name)s" - -msgid "Add" -msgstr "Bæta við" - -msgid "View" -msgstr "Skoða" - -msgid "You don’t have permission to view or edit anything." -msgstr "Þú hefur ekki réttindi til að skoða eða breyta neinu." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Fyrst, settu inn notendanafn og lykilorð. Svo geturðu breytt öðrum " -"notendamöguleikum." - -msgid "Enter a username and password." -msgstr "Sláðu inn notandanafn og lykilorð." - -msgid "Change password" -msgstr "Breyta lykilorði" - -msgid "Please correct the error below." -msgstr "Vinsamlegast lagfærðu villuna fyrir neðan." - -msgid "Please correct the errors below." -msgstr "Vinsamlegast leiðréttu villurnar hér að neðan." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Settu inn nýtt lykilorð fyrir notandann %(username)s." - -msgid "Welcome," -msgstr "Velkomin(n)," - -msgid "View site" -msgstr "Skoða vef" - -msgid "Documentation" -msgstr "Skjölun" - -msgid "Log out" -msgstr "Skrá út" - -#, python-format -msgid "Add %(name)s" -msgstr "Bæta við %(name)s" - -msgid "History" -msgstr "Saga" - -msgid "View on site" -msgstr "Skoða á vef" - -msgid "Filter" -msgstr "Sía" - -msgid "Clear all filters" -msgstr "Hreinsa allar síur" - -msgid "Remove from sorting" -msgstr "Taka úr röðun" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Forgangur röðunar: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Röðun af/á" - -msgid "Delete" -msgstr "Eyða" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eyðing á %(object_name)s „%(escaped_object)s“ hefði í för með sér eyðingu á " -"tengdum hlutum en þú hefur ekki réttindi til að eyða eftirfarandi hlutum:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Að eyða %(object_name)s „%(escaped_object)s“ þyrfti að eyða eftirfarandi " -"tengdum hlutum:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ertu viss um að þú viljir eyða %(object_name)s „%(escaped_object)s“? Öllu " -"eftirfarandi verður eytt:" - -msgid "Objects" -msgstr "Hlutir" - -msgid "Yes, I’m sure" -msgstr "Já ég er viss." - -msgid "No, take me back" -msgstr "Nei, fara til baka" - -msgid "Delete multiple objects" -msgstr "Eyða mörgum hlutum." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Að eyða völdu %(objects_name)s leiðir til þess að skyldum hlutum er eytt, en " -"þinn aðgangur hefur ekki réttindi til að eyða eftirtöldum hlutum:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Að eyða völdum %(objects_name)s myndi leiða til þess að eftirtöldum skyldum " -"hlutum yrði eytt:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ertu viss um að þú viljir eyða völdum %(objects_name)s? Öllum eftirtöldum " -"hlutum og skyldum hlutum verður eytt:" - -msgid "Delete?" -msgstr "Eyða?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Eftir %(filter_title)s " - -msgid "Summary" -msgstr "Samantekt" - -msgid "Recent actions" -msgstr "Nýlegar aðgerðir" - -msgid "My actions" -msgstr "Mínar aðgerðir" - -msgid "None available" -msgstr "Engin fáanleg" - -msgid "Unknown content" -msgstr "Óþekkt innihald" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Eitthvað er að gagnagrunnsuppsetningu. Gakktu úr skugga um að allar töflur " -"séu til staðar og að notandinn hafi aðgang að grunninum." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Þú ert skráður inn sem %(username)s, en ert ekki með réttindi að þessari " -"síðu. Viltu skrá þig inn sem annar notandi?" - -msgid "Forgotten your password or username?" -msgstr "Gleymt notandanafn eða lykilorð?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Date/time" -msgstr "Dagsetning/tími" - -msgid "User" -msgstr "Notandi" - -msgid "Action" -msgstr "Aðgerð" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Þessi hlutur hefur enga breytingasögu. Hann var líklega ekki búinn til á " -"þessu stjórnunarsvæði." - -msgid "Show all" -msgstr "Sýna allt" - -msgid "Save" -msgstr "Vista" - -msgid "Popup closing…" -msgstr "Sprettigluggi lokast..." - -msgid "Search" -msgstr "Leita" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s niðurstaða" -msgstr[1] "%(counter)s niðurstöður" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s í heildina" - -msgid "Save as new" -msgstr "Vista sem nýtt" - -msgid "Save and add another" -msgstr "Vista og búa til nýtt" - -msgid "Save and continue editing" -msgstr "Vista og halda áfram að breyta" - -msgid "Save and view" -msgstr "Vista og skoða" - -msgid "Close" -msgstr "Loka" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Breyta völdu %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Bæta við %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eyða völdu %(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Takk fyrir að verja tíma í vefsíðuna í dag." - -msgid "Log in again" -msgstr "Skráðu þig inn aftur" - -msgid "Password change" -msgstr "Breyta lykilorði" - -msgid "Your password was changed." -msgstr "Lykilorði þínu var breytt" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Vinsamlegast skrifaðu gamla lykilorðið þitt til öryggis. Sláðu svo nýja " -"lykilorðið tvisvar inn svo að hægt sé að ganga úr skugga um að þú hafir ekki " -"gert innsláttarvillu." - -msgid "Change my password" -msgstr "Breyta lykilorðinu mínu" - -msgid "Password reset" -msgstr "Endurstilla lykilorð" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Lykilorðið var endurstillt. Þú getur núna skráð þig inn á vefsvæðið." - -msgid "Password reset confirmation" -msgstr "Staðfesting endurstillingar lykilorðs" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Vinsamlegast settu inn nýja lykilorðið tvisvar til að forðast " -"innsláttarvillur." - -msgid "New password:" -msgstr "Nýtt lykilorð:" - -msgid "Confirm password:" -msgstr "Staðfestu lykilorð:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Endurstilling lykilorðs tókst ekki. Slóðin var ógild. Hugsanlega hefur hún " -"nú þegar verið notuð. Vinsamlegast biddu um nýja endurstillingu." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Við höfum sent þér tölvupóst með leiðbeiningum til að endurstilla lykilorðið " -"þitt, sé aðgangur til með netfanginu sem þú slóst inn. Þú ættir að fá " -"leiðbeiningarnar fljótlega. " - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ef þú færð ekki tölvupóstinn, gakktu úr skugga um að netfangið sem þú slóst " -"inn sé það sama og þú notaðir til að stofna aðganginn og að það hafi ekki " -"lent í spamsíu." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Þú ert að fá þennan tölvupóst því þú baðst um endurstillingu á lykilorði " -"fyrir aðganginn þinn á %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Vinsamlegast farðu á eftirfarandi síðu og veldu nýtt lykilorð:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Notandanafnið þitt ef þú skyldir hafa gleymt því:" - -msgid "Thanks for using our site!" -msgstr "Takk fyrir að nota vefinn okkar!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s hópurinn" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Hefurðu gleymt lykilorðinu þínu? Sláðu inn netfangið þitt hér að neðan og " -"við sendum þér tölvupóst með leiðbeiningum til að setja nýtt lykilorð. " - -msgid "Email address:" -msgstr "Netfang:" - -msgid "Reset my password" -msgstr "Endursstilla lykilorðið mitt" - -msgid "All dates" -msgstr "Allar dagsetningar" - -#, python-format -msgid "Select %s" -msgstr "Veldu %s" - -#, python-format -msgid "Select %s to change" -msgstr "Veldu %s til að breyta" - -#, python-format -msgid "Select %s to view" -msgstr "Veldu %s til að skoða" - -msgid "Date:" -msgstr "Dagsetning:" - -msgid "Time:" -msgstr "Tími:" - -msgid "Lookup" -msgstr "Fletta upp" - -msgid "Currently:" -msgstr "Eins og er:" - -msgid "Change:" -msgstr "Breyta:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 29c2bc1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5ddb17c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,267 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# gudbergur , 2012 -# Hafsteinn Einarsson , 2011-2012 -# Jannis Leidel , 2011 -# Matt R, 2018 -# Thordur Sigurdsson , 2016-2017,2020-2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-06 17:37+0000\n" -"Last-Translator: Thordur Sigurdsson \n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Fáanleg %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Þetta er listi af því %s sem er í boði. Þú getur ákveðið hluti með því að " -"velja þá í boxinu að neðan og ýta svo á \"Velja\" örina milli boxana tveggja." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Skrifaðu í boxið til að sía listann af því %s sem er í boði." - -msgid "Filter" -msgstr "Sía" - -msgid "Choose all" -msgstr "Velja öll" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Smelltu til að velja allt %s í einu." - -msgid "Choose" -msgstr "Veldu" - -msgid "Remove" -msgstr "Fjarlægja" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valin %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Þetta er listinn af völdu %s. Þú getur fjarlægt hluti með því að velja þá í " -"boxinu að neðan og ýta svo á \"Eyða\" örina á milli boxana tveggja." - -msgid "Remove all" -msgstr "Eyða öllum" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Smelltu til að fjarlægja allt valið %s í einu." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] " %(sel)s í %(cnt)s valin" -msgstr[1] " %(sel)s í %(cnt)s valin" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Enn eru óvistaðar breytingar í reitum. Ef þú keyrir aðgerð munu breytingar " -"ekki verða vistaðar." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Þú hefur valið aðgerð en hefur ekki vistað breytingar á reitum. Vinsamlegast " -"veldu 'Í lagi' til að vista. Þú þarft að endurkeyra aðgerðina." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Þú hefur valið aðgerð en hefur ekki gert breytingar á reitum. Þú ert líklega " -"að leita að 'Fara' hnappnum frekar en 'Vista' hnappnum." - -msgid "Now" -msgstr "Núna" - -msgid "Midnight" -msgstr "Miðnætti" - -msgid "6 a.m." -msgstr "6 f.h." - -msgid "Noon" -msgstr "Hádegi" - -msgid "6 p.m." -msgstr "6 e.h." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Athugaðu að þú ert %s klukkustund á undan tíma vefþjóns." -msgstr[1] "Athugaðu að þú ert %s klukkustundum á undan tíma vefþjóns." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Athugaðu að þú ert %s klukkustund á eftir tíma vefþjóns." -msgstr[1] "Athugaðu að þú ert %s klukkustundum á eftir tíma vefþjóns." - -msgid "Choose a Time" -msgstr "Veldu tíma" - -msgid "Choose a time" -msgstr "Veldu tíma" - -msgid "Cancel" -msgstr "Hætta við" - -msgid "Today" -msgstr "Í dag" - -msgid "Choose a Date" -msgstr "Veldu dagsetningu" - -msgid "Yesterday" -msgstr "Í gær" - -msgid "Tomorrow" -msgstr "Á morgun" - -msgid "January" -msgstr "janúar" - -msgid "February" -msgstr "febrúar" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "apríl" - -msgid "May" -msgstr "maí" - -msgid "June" -msgstr "júní" - -msgid "July" -msgstr "júlí" - -msgid "August" -msgstr "ágúst" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "nóvember" - -msgid "December" -msgstr "desember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maí" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jún" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Júl" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ágú" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nóv" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Þ" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "F" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" - -msgid "Show" -msgstr "Sýna" - -msgid "Hide" -msgstr "Fela" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index a099863..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index 3671884..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,798 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 0d21a39e384d88c2313b89b5042c04cb, 2017 -# Carlo Miron , 2018-2019 -# Davide Targa , 2021 -# Denis Darii , 2011 -# Flavio Curella , 2013 -# Franky Bonanno, 2023 -# Jannis Leidel , 2011 -# Luciano De Falco Alfano, 2016 -# Marco Bonetti, 2014 -# Mirco Grillo , 2018,2020 -# Nicola Larosa , 2013 -# palmux , 2014-2015,2021 -# Paolo Melchiorre , 2022-2023 -# Mattia Procopio , 2015 -# Stefano Brentegani , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: Franky Bonanno, 2023\n" -"Language-Team: Italian (http://app.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Cancella %(verbose_name_plural)s selezionati" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Cancellati/e con successo %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Impossibile cancellare %(name)s " - -msgid "Are you sure?" -msgstr "Confermi?" - -msgid "Administration" -msgstr "Amministrazione" - -msgid "All" -msgstr "Tutti" - -msgid "Yes" -msgstr "Sì" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Sconosciuto" - -msgid "Any date" -msgstr "Qualsiasi data" - -msgid "Today" -msgstr "Oggi" - -msgid "Past 7 days" -msgstr "Ultimi 7 giorni" - -msgid "This month" -msgstr "Questo mese" - -msgid "This year" -msgstr "Quest'anno" - -msgid "No date" -msgstr "Senza data" - -msgid "Has date" -msgstr "Ha la data" - -msgid "Empty" -msgstr "Vuoto" - -msgid "Not empty" -msgstr "Non vuoto" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Inserisci %(username)s e password corretti per un account di staff. Nota che " -"entrambi i campi distinguono maiuscole e minuscole." - -msgid "Action:" -msgstr "Azione:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Aggiungi un altro %(verbose_name)s." - -msgid "Remove" -msgstr "Elimina" - -msgid "Addition" -msgstr "Aggiunta " - -msgid "Change" -msgstr "Modifica" - -msgid "Deletion" -msgstr "Eliminazione" - -msgid "action time" -msgstr "momento dell'azione" - -msgid "user" -msgstr "utente" - -msgid "content type" -msgstr "content type" - -msgid "object id" -msgstr "id dell'oggetto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "rappr. dell'oggetto" - -msgid "action flag" -msgstr "flag di azione" - -msgid "change message" -msgstr "messaggio di modifica" - -msgid "log entry" -msgstr "voce di log" - -msgid "log entries" -msgstr "voci di log" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" aggiunto." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "%(object)s%(changes)s modificati" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" cancellato." - -msgid "LogEntry Object" -msgstr "Oggetto LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Aggiunto {name} \"{object}\"." - -msgid "Added." -msgstr "Aggiunto." - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Modificati {fields} per {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Modificati {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Eliminato {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Nessun campo modificato." - -msgid "None" -msgstr "Nessuno" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Tieni premuto \"Control\", o \"Command\" su Mac, per selezionarne più di uno." - -msgid "Select this object for an action - {}" -msgstr "Seleziona questo oggetto per intraprendere un'azione - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Il {name} \"{obj}\" è stato aggiunto con successo." - -msgid "You may edit it again below." -msgstr "Puoi modificarlo di nuovo qui sotto." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Il {name} \"{obj}\" è stato aggiunto con successo. Puoi aggiungere un altro " -"{name} qui sotto." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Il {name} \"{obj}\" è stato modificato con successo. Puoi modificarlo " -"nuovamente qui sotto." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"Il {name} \"{obj}\" è stato aggiunto con successo. Puoi modificarlo " -"nuovamente qui sotto." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Il {name} \"{obj}\" è stato modificato con successo. Puoi aggiungere un " -"altro {name} qui sotto." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Il {name} \"{obj}\" è stato modificato con successo." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Occorre selezionare degli oggetti per potervi eseguire azioni. Nessun " -"oggetto è stato cambiato." - -msgid "No action selected." -msgstr "Nessuna azione selezionata." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" cancellato correttamente." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s con ID \"%(key)s\" non esiste. Probabilmente è stato cancellato?" - -#, python-format -msgid "Add %s" -msgstr "Aggiungi %s" - -#, python-format -msgid "Change %s" -msgstr "Modifica %s" - -#, python-format -msgid "View %s" -msgstr "Vista %s" - -msgid "Database error" -msgstr "Errore del database" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s modificato correttamente." -msgstr[1] "%(count)s %(name)s modificati correttamente." -msgstr[2] "%(count)s %(name)s modificati correttamente." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selezionato" -msgstr[1] "Tutti i %(total_count)s selezionati" -msgstr[2] "Tutti i %(total_count)s selezionati" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 di %(cnt)s selezionati" - -#, python-format -msgid "Change history: %s" -msgstr "Tracciato delle modifiche: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La cancellazione di %(class_name)s %(instance)s richiederebbe l'eliminazione " -"dei seguenti oggetti protetti correlati: %(related_objects)s" - -msgid "Django site admin" -msgstr "Amministrazione sito Django" - -msgid "Django administration" -msgstr "Amministrazione Django" - -msgid "Site administration" -msgstr "Amministrazione sito" - -msgid "Log in" -msgstr "Accedi" - -#, python-format -msgid "%(app)s administration" -msgstr "Amministrazione %(app)s" - -msgid "Page not found" -msgstr "Pagina non trovata" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Spiacenti, ma la pagina richiesta non è stata trovata." - -msgid "Home" -msgstr "Pagina iniziale" - -msgid "Server error" -msgstr "Errore del server" - -msgid "Server error (500)" -msgstr "Errore del server (500)" - -msgid "Server Error (500)" -msgstr "Errore del server (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Si è verificato un errore. Gli amministratori del sito ne sono stati " -"informati per email, e vi porranno rimedio a breve. Grazie per la vostra " -"pazienza." - -msgid "Run the selected action" -msgstr "Esegui l'azione selezionata" - -msgid "Go" -msgstr "Vai" - -msgid "Click here to select the objects across all pages" -msgstr "Clicca qui per selezionare gli oggetti da tutte le pagine." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleziona tutti %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Annulla la selezione" - -msgid "Breadcrumbs" -msgstr "Breadcrumbs" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelli nell'applicazione %(name)s" - -msgid "Add" -msgstr "Aggiungi" - -msgid "View" -msgstr "Vista" - -msgid "You don’t have permission to view or edit anything." -msgstr "Non hai i permessi per visualizzare o modificare nulla." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Prima di tutto inserisci nome utente e password. Poi potrai modificare le " -"altre impostazioni utente." - -msgid "Enter a username and password." -msgstr "Inserisci nome utente e password." - -msgid "Change password" -msgstr "Modifica password" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Si prega di correggere l'errore sottostante." -msgstr[1] "Si prega di correggere gli errori sottostanti." -msgstr[2] "Si prega di correggere gli errori sottostanti." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Inserisci una nuova password per l'utente %(username)s." - -msgid "Skip to main content" -msgstr "Passa al contenuto principale" - -msgid "Welcome," -msgstr "Benvenuto," - -msgid "View site" -msgstr "Visualizza il sito" - -msgid "Documentation" -msgstr "Documentazione" - -msgid "Log out" -msgstr "Annulla l'accesso" - -#, python-format -msgid "Add %(name)s" -msgstr "Aggiungi %(name)s" - -msgid "History" -msgstr "Storia" - -msgid "View on site" -msgstr "Vedi sul sito" - -msgid "Filter" -msgstr "Filtra" - -msgid "Hide counts" -msgstr "Nascondi i conteggi " - -msgid "Show counts" -msgstr "Mostra i conteggi " - -msgid "Clear all filters" -msgstr "Cancella tutti i filtri" - -msgid "Remove from sorting" -msgstr "Elimina dall'ordinamento" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Priorità d'ordinamento: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Abilita/disabilita ordinamento" - -msgid "Toggle theme (current theme: auto)" -msgstr "Cambia tema (tema corrente: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Cambia tema (tema corrente: chiaro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Cambia tema (tema corrente: scuro)" - -msgid "Delete" -msgstr "Cancella" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"La cancellazione di %(object_name)s '%(escaped_object)s' causerebbe la " -"cancellazione di oggetti collegati, ma questo account non ha i permessi per " -"cancellare i seguenti tipi di oggetti:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"La cancellazione di %(object_name)s '%(escaped_object)s' richiederebbe " -"l'eliminazione dei seguenti oggetti protetti correlati:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Sicuro di voler cancellare %(object_name)s \"%(escaped_object)s\"? Tutti i " -"seguenti oggetti collegati verranno cancellati:" - -msgid "Objects" -msgstr "Oggetti" - -msgid "Yes, I’m sure" -msgstr "Sì, sono sicuro" - -msgid "No, take me back" -msgstr "No, torna indietro" - -msgid "Delete multiple objects" -msgstr "Cancella più oggetti" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Per eliminare l'elemento %(objects_name)s selezionato è necessario rimuovere " -"anche gli oggetti correlati, ma il tuo account non dispone " -"dell'autorizzazione a eliminare i seguenti tipi di oggetti:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"L'eliminazione dell'elemento %(objects_name)s selezionato richiederebbe la " -"rimozione dei seguenti oggetti protetti correlati:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Confermi la cancellazione dell'elemento %(objects_name)s selezionato? " -"Saranno rimossi tutti i seguenti oggetti e le loro voci correlate:" - -msgid "Delete?" -msgstr "Cancellare?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Per %(filter_title)s " - -msgid "Summary" -msgstr "Riepilogo" - -msgid "Recent actions" -msgstr "Azioni recenti" - -msgid "My actions" -msgstr "Le mie azioni" - -msgid "None available" -msgstr "Nulla disponibile" - -msgid "Added:" -msgstr "Aggiunto" - -msgid "Changed:" -msgstr "Cambiato " - -msgid "Deleted:" -msgstr "Eliminato " - -msgid "Unknown content" -msgstr "Contenuto sconosciuto" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Qualcosa non è andato a buon fine nell'installazione del database. " -"Assicurati che le tabelle del database siano state create, e che il database " -"sia leggibile dall'utente corretto." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Ti sei autenticato come %(username)s, ma non sei autorizzato ad accedere a " -"questa pagina. Vorresti autenticarti con un altro account?" - -msgid "Forgotten your password or username?" -msgstr "Hai dimenticato la password o lo username?" - -msgid "Toggle navigation" -msgstr "Abilita/disabilita navigazione" - -msgid "Sidebar" -msgstr "Barra laterale" - -msgid "Start typing to filter…" -msgstr "Inizia a scrivere per filtrare..." - -msgid "Filter navigation items" -msgstr "Filtra gli oggetti di navigazione" - -msgid "Date/time" -msgstr "Data/ora" - -msgid "User" -msgstr "Utente" - -msgid "Action" -msgstr "Azione" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "voce" -msgstr[1] "voci" -msgstr[2] "voci" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Questo oggetto non ha cambiamenti registrati. Probabilmente non è stato " -"creato con questo sito di amministrazione." - -msgid "Show all" -msgstr "Mostra tutto" - -msgid "Save" -msgstr "Salva" - -msgid "Popup closing…" -msgstr "Chiusura popup..." - -msgid "Search" -msgstr "Cerca" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s risultato" -msgstr[1] "%(counter)s risultati" -msgstr[2] "%(counter)s risultati" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s in tutto" - -msgid "Save as new" -msgstr "Salva come nuovo" - -msgid "Save and add another" -msgstr "Salva e aggiungi un altro" - -msgid "Save and continue editing" -msgstr "Salva e continua le modifiche" - -msgid "Save and view" -msgstr "Salva e visualizza" - -msgid "Close" -msgstr "Chiudi" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Modifica la selezione %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Aggiungi un altro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Elimina la selezione %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Visualizza il %(model)s selezionato" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Grazie per avere trascorso del tempo di qualità sul sito oggi." - -msgid "Log in again" -msgstr "Accedi di nuovo" - -msgid "Password change" -msgstr "Cambio password" - -msgid "Your password was changed." -msgstr "La tua password è stata cambiata." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Inserisci la password attuale, per ragioni di sicurezza, e poi la nuova " -"password due volte, per verificare di averla scritta correttamente." - -msgid "Change my password" -msgstr "Modifica la mia password" - -msgid "Password reset" -msgstr "Reimposta la password" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "La tua password è stata impostata. Ora puoi effettuare l'accesso." - -msgid "Password reset confirmation" -msgstr "Conferma reimpostazione password" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Inserisci la nuova password due volte, per verificare di averla scritta " -"correttamente." - -msgid "New password:" -msgstr "Nuova password:" - -msgid "Confirm password:" -msgstr "Conferma la password:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Il link per la reimpostazione della password non era valido, forse perché " -"era già stato usato. Richiedi una nuova reimpostazione della password." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Abbiamo inviato istruzioni per impostare la password, se esiste un account " -"valido all'indirizzo email che hai indicato. Dovresti riceverle a breve." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se non ricevi un messaggio email, accertati di aver inserito l'indirizzo con " -"cui ti sei registrato, e controlla la cartella dello spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ricevi questa mail perché hai richiesto di reimpostare la password del tuo " -"account utente presso %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Vai alla pagina seguente e scegli una nuova password:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Il tuo nome utente, in caso tu l'abbia dimenticato:" - -msgid "Thanks for using our site!" -msgstr "Grazie per aver usato il nostro sito!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Il team di %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Password dimenticata? Inserisci il tuo indirizzo email qui sotto e ti " -"invieremo le istruzioni per impostarne una nuova." - -msgid "Email address:" -msgstr "Indirizzo email:" - -msgid "Reset my password" -msgstr "Reimposta la mia password" - -msgid "Select all objects on this page for an action" -msgstr "" -"Seleziona tutti gli oggetti di questa pagina per intraprendere un'azione " - -msgid "All dates" -msgstr "Tutte le date" - -#, python-format -msgid "Select %s" -msgstr "Scegli %s" - -#, python-format -msgid "Select %s to change" -msgstr "Scegli %s da modificare" - -#, python-format -msgid "Select %s to view" -msgstr "Seleziona %s per visualizzarlo" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Ora:" - -msgid "Lookup" -msgstr "Consultazione" - -msgid "Currently:" -msgstr "Attualmente:" - -msgid "Change:" -msgstr "Modifica:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 20ecfac..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po deleted file mode 100644 index c8096de..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,322 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrea Guerra, 2024 -# Denis Darii , 2011 -# Jannis Leidel , 2011 -# Luciano De Falco Alfano, 2016 -# Marco Bonetti, 2014 -# Mirco Grillo , 2020 -# Nicola Larosa , 2011-2012 -# palmux , 2015,2021 -# Paolo Melchiorre , 2022-2023 -# Stefano Brentegani , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Andrea Guerra, 2024\n" -"Language-Team: Italian (http://app.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponibili" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Scrivi in questa casella per filtrare l'elenco dei %s disponibili." - -msgid "Filter" -msgstr "Filtro" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s scelti" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Scrivi in questa casella per filtrare l'elenco dei %s selezionati." - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opzione selezionata non visibile" -msgstr[1] "%s opzioni selezionate non visibili" -msgstr[2] "%s opzioni selezionate non visibili" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s di %(cnt)s selezionato" -msgstr[1] "%(sel)s di %(cnt)s selezionati" -msgstr[2] "%(sel)s di %(cnt)s selezionati" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Ci sono aggiornamenti non salvati su singoli campi modificabili. Se esegui " -"un'azione, le modifiche non salvate andranno perse." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Hai selezionato un'azione, ma non hai ancora salvato le modifiche apportate " -"a campi singoli. Fai clic su OK per salvare. Poi dovrai rieseguire l'azione." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Hai selezionato un'azione e non hai ancora apportato alcuna modifica ai " -"campi singoli. Probabilmente stai cercando il pulsante Vai, invece di Salva." - -msgid "Now" -msgstr "Adesso" - -msgid "Midnight" -msgstr "Mezzanotte" - -msgid "6 a.m." -msgstr "6 del mattino" - -msgid "Noon" -msgstr "Mezzogiorno" - -msgid "6 p.m." -msgstr "6 del pomeriggio" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Sei %s ora in anticipo rispetto al server." -msgstr[1] "Nota: Sei %s ore in anticipo rispetto al server." -msgstr[2] "Nota: Sei %s ore in anticipo rispetto al server." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Sei %s ora in ritardo rispetto al server." -msgstr[1] "Nota: Sei %s ore in ritardo rispetto al server." -msgstr[2] "Nota: Sei %s ore in ritardo rispetto al server." - -msgid "Choose a Time" -msgstr "Scegli un orario" - -msgid "Choose a time" -msgstr "Scegli un orario" - -msgid "Cancel" -msgstr "Annulla" - -msgid "Today" -msgstr "Oggi" - -msgid "Choose a Date" -msgstr "Scegli una data" - -msgid "Yesterday" -msgstr "Ieri" - -msgid "Tomorrow" -msgstr "Domani" - -msgid "January" -msgstr "Gennaio" - -msgid "February" -msgstr "Febbraio" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Aprile" - -msgid "May" -msgstr "Maggio" - -msgid "June" -msgstr "Giugno" - -msgid "July" -msgstr "Luglio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Settembre" - -msgid "October" -msgstr "Ottobre" - -msgid "November" -msgstr "Novembre" - -msgid "December" -msgstr "Dicembre" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Gen" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mag" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Giu" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Lug" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Set" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Ott" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dic" - -msgid "Sunday" -msgstr "Domenica" - -msgid "Monday" -msgstr "Lunedì" - -msgid "Tuesday" -msgstr "Martedì" - -msgid "Wednesday" -msgstr "Mercoledì" - -msgid "Thursday" -msgstr "Giovedì" - -msgid "Friday" -msgstr "Venerdì" - -msgid "Saturday" -msgstr "Sabato" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Lun" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Mer" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Gio" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Ven" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sab" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Ma" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Me" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "G" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index ec8a378..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index ac42d38..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,784 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# akiyoko , 2020 -# Claude Paroz , 2016 -# Goto Hayato , 2019 -# Hiroki Sawano, 2022 -# Jannis Leidel , 2011 -# Masaya, 2023 -# Shinichi Katsumata , 2019 -# Shinya Okano , 2012-2018,2021,2023 -# TANIGUCHI Taichi, 2022 -# Takuro Onoue , 2020 -# Takuya N , 2020 -# Tetsuya Morimoto , 2011 -# 上田慶祐 , 2015 -# 余田大輝, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: 余田大輝, 2024\n" -"Language-Team: Japanese (http://app.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "選択された %(verbose_name_plural)s の削除" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d 個の %(items)s を削除しました。" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s が削除できません" - -msgid "Are you sure?" -msgstr "よろしいですか?" - -msgid "Administration" -msgstr "管理" - -msgid "All" -msgstr "全て" - -msgid "Yes" -msgstr "はい" - -msgid "No" -msgstr "いいえ" - -msgid "Unknown" -msgstr "不明" - -msgid "Any date" -msgstr "いつでも" - -msgid "Today" -msgstr "今日" - -msgid "Past 7 days" -msgstr "過去 7 日間" - -msgid "This month" -msgstr "今月" - -msgid "This year" -msgstr "今年" - -msgid "No date" -msgstr "日付なし" - -msgid "Has date" -msgstr "日付あり" - -msgid "Empty" -msgstr "空" - -msgid "Not empty" -msgstr "空でない" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"スタッフアカウントの正しい%(username)sとパスワードを入力してください。どちら" -"のフィールドも大文字と小文字は区別されます。" - -msgid "Action:" -msgstr "操作:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "%(verbose_name)s の追加" - -msgid "Remove" -msgstr "削除" - -msgid "Addition" -msgstr "追加" - -msgid "Change" -msgstr "変更" - -msgid "Deletion" -msgstr "削除" - -msgid "action time" -msgstr "操作時刻" - -msgid "user" -msgstr "ユーザー" - -msgid "content type" -msgstr "コンテンツタイプ" - -msgid "object id" -msgstr "オブジェクト ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "オブジェクトの文字列表現" - -msgid "action flag" -msgstr "操作種別" - -msgid "change message" -msgstr "変更メッセージ" - -msgid "log entry" -msgstr "ログエントリー" - -msgid "log entries" -msgstr "ログエントリー" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” を追加しました。" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” を変更しました — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s” を削除しました。" - -msgid "LogEntry Object" -msgstr "ログエントリー オブジェクト" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” を追加しました。" - -msgid "Added." -msgstr "追加されました。" - -msgid "and" -msgstr "と" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” の {fields} を変更しました。" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} を変更しました。" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” を削除しました。" - -msgid "No fields changed." -msgstr "変更はありませんでした。" - -msgid "None" -msgstr "None" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"複数選択するときには Control キーを押したまま選択してください。Mac は " -"Command キーを使ってください" - -msgid "Select this object for an action - {}" -msgstr "アクション用にこのオブジェクトを選択 - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” を追加しました。" - -msgid "You may edit it again below." -msgstr "以下で再度編集できます。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} “{obj}” を追加しました。別の {name} を以下から追加できます。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” を変更しました。以下から再度編集できます。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} “{obj}” を変更しました。 別の {name} を以下から追加できます。" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” を変更しました。" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"操作を実行するには、対象を選択する必要があります。何も変更されませんでした。" - -msgid "No action selected." -msgstr "操作が選択されていません。" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” を削除しました。" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"ID “%(key)s” の%(name)sは見つかりませんでした。削除された可能性があります。" - -#, python-format -msgid "Add %s" -msgstr "%s を追加" - -#, python-format -msgid "Change %s" -msgstr "%s を変更" - -#, python-format -msgid "View %s" -msgstr "%sを表示" - -msgid "Database error" -msgstr "データベースエラー" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s 個の %(name)s を変更しました。" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s 個選択されました" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s個の内ひとつも選択されていません" - -#, python-format -msgid "Change history: %s" -msgstr "変更履歴: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s を削除するには以下の保護された関連オブジェクトを" -"削除することになります: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django サイト管理" - -msgid "Django administration" -msgstr "Django 管理サイト" - -msgid "Site administration" -msgstr "サイト管理" - -msgid "Log in" -msgstr "ログイン" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s 管理" - -msgid "Page not found" -msgstr "ページが見つかりません" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "申し訳ありませんが、お探しのページは見つかりませんでした。" - -msgid "Home" -msgstr "ホーム" - -msgid "Server error" -msgstr "サーバーエラー" - -msgid "Server error (500)" -msgstr "サーバーエラー (500)" - -msgid "Server Error (500)" -msgstr "サーバーエラー (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"エラーが発生しました。サイト管理者にメールで報告されたので、修正されるまでし" -"ばらくお待ちください。" - -msgid "Run the selected action" -msgstr "選択された操作を実行" - -msgid "Go" -msgstr "実行" - -msgid "Click here to select the objects across all pages" -msgstr "全ページの項目を選択するにはここをクリック" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "%(total_count)s個ある%(module_name)s を全て選択" - -msgid "Clear selection" -msgstr "選択を解除" - -msgid "Breadcrumbs" -msgstr "パンくずリスト" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s アプリケーション内のモデル" - -msgid "Add" -msgstr "追加" - -msgid "View" -msgstr "表示" - -msgid "You don’t have permission to view or edit anything." -msgstr "表示または変更のためのパーミッションがありません。" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"まずユーザー名とパスワードを登録してください。その後詳細情報が編集可能になり" -"ます。" - -msgid "Enter a username and password." -msgstr "ユーザー名とパスワードを入力してください。" - -msgid "Change password" -msgstr "パスワードの変更" - -msgid "Set password" -msgstr "パスワードを設定" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "下記のエラーを修正してください。" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"%(username)sさんの新しいパスワードを入力してください。" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"このアクションは、このユーザーに対するパスワードによる認証を有効にします。" - -msgid "Disable password-based authentication" -msgstr "パスワードによる認証の無効化" - -msgid "Enable password-based authentication" -msgstr "パスワードによる認証の有効化" - -msgid "Skip to main content" -msgstr "スキップしてメインコンテンツへ" - -msgid "Welcome," -msgstr "ようこそ" - -msgid "View site" -msgstr "サイトを表示" - -msgid "Documentation" -msgstr "ドキュメント" - -msgid "Log out" -msgstr "ログアウト" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s を追加" - -msgid "History" -msgstr "履歴" - -msgid "View on site" -msgstr "サイト上で表示" - -msgid "Filter" -msgstr "フィルター" - -msgid "Hide counts" -msgstr "件数を非表示" - -msgid "Show counts" -msgstr "件数を表示" - -msgid "Clear all filters" -msgstr "全てのフィルターを解除" - -msgid "Remove from sorting" -msgstr "ソート条件から外します" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "ソート優先順位: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "昇順降順を切り替えます" - -msgid "Toggle theme (current theme: auto)" -msgstr "テーマを切り替え (現在のテーマ: 自動)" - -msgid "Toggle theme (current theme: light)" -msgstr "テーマを切り替え (現在のテーマ: ライト)" - -msgid "Toggle theme (current theme: dark)" -msgstr "テーマを切り替え (現在のテーマ: ダーク)" - -msgid "Delete" -msgstr "削除" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' の削除時に関連づけられたオブジェクトも削" -"除しようとしましたが、あなたのアカウントには以下のタイプのオブジェクトを削除" -"するパーミッションがありません:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' を削除するには以下の保護された関連オブ" -"ジェクトを削除することになります:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\"を削除しますか? 関連づけられている以下" -"のオブジェクトも全て削除されます:" - -msgid "Objects" -msgstr "オブジェクト" - -msgid "Yes, I’m sure" -msgstr "はい、大丈夫です" - -msgid "No, take me back" -msgstr "戻る" - -msgid "Delete multiple objects" -msgstr "複数のオブジェクトを削除します" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"選択した %(objects_name)s を削除すると関連するオブジェクトも削除しますが、あ" -"なたのアカウントは以下のオブジェクト型を削除する権限がありません:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"選択した %(objects_name)s を削除すると以下の保護された関連オブジェクトを削除" -"することになります:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"本当に選択した %(objects_name)s を削除しますか? 以下の全てのオブジェクトと関" -"連する要素が削除されます:" - -msgid "Delete?" -msgstr "削除しますか?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s で絞り込む" - -msgid "Summary" -msgstr "概要" - -msgid "Recent actions" -msgstr "最近行った操作" - -msgid "My actions" -msgstr "自分の操作" - -msgid "None available" -msgstr "利用不可" - -msgid "Added:" -msgstr "追加されました:" - -msgid "Changed:" -msgstr "変更されました:" - -msgid "Deleted:" -msgstr "削除されました:" - -msgid "Unknown content" -msgstr "不明なコンテント" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"データベースのインストールに問題があります。適切なデータベーステーブルが作ら" -"れているか、適切なユーザーがデータベースを読み込み可能かを確認してください。" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"あなたは %(username)s として認証されましたが、このページへのアクセス許可があ" -"りません。他のアカウントでログインしますか?" - -msgid "Forgotten your password or username?" -msgstr "パスワードまたはユーザー名を忘れましたか?" - -msgid "Toggle navigation" -msgstr "ナビゲーションを切り替えます" - -msgid "Sidebar" -msgstr "サイドバー" - -msgid "Start typing to filter…" -msgstr "絞り込みの入力..." - -msgid "Filter navigation items" -msgstr "ナビゲーション項目の絞り込み" - -msgid "Date/time" -msgstr "日付/時刻" - -msgid "User" -msgstr "ユーザー" - -msgid "Action" -msgstr "操作" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "エントリー" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"このオブジェクトには変更履歴がありません。おそらくこの管理サイトで追加したも" -"のではありません。" - -msgid "Show all" -msgstr "全件表示" - -msgid "Save" -msgstr "保存" - -msgid "Popup closing…" -msgstr "ポップアップを閉じています..." - -msgid "Search" -msgstr "検索" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "結果 %(counter)s" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "全 %(full_result_count)s 件" - -msgid "Save as new" -msgstr "新規保存" - -msgid "Save and add another" -msgstr "保存してもう一つ追加" - -msgid "Save and continue editing" -msgstr "保存して編集を続ける" - -msgid "Save and view" -msgstr "保存して表示" - -msgid "Close" -msgstr "閉じる" - -#, python-format -msgid "Change selected %(model)s" -msgstr "選択された %(model)s の変更" - -#, python-format -msgid "Add another %(model)s" -msgstr "%(model)s の追加" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "選択された %(model)s を削除" - -#, python-format -msgid "View selected %(model)s" -msgstr "選択された %(model)s を表示" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "ご利用ありがとうございました。" - -msgid "Log in again" -msgstr "もう一度ログイン" - -msgid "Password change" -msgstr "パスワードの変更" - -msgid "Your password was changed." -msgstr "あなたのパスワードは変更されました" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"セキュリティ上の理由から元のパスワードの入力が必要です。新しいパスワードは正" -"しく入力したか確認できるように二度入力してください。" - -msgid "Change my password" -msgstr "パスワードの変更" - -msgid "Password reset" -msgstr "パスワードをリセット" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "パスワードがセットされました。ログインしてください。" - -msgid "Password reset confirmation" -msgstr "パスワードリセットの確認" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "確認のために、新しいパスワードを二回入力してください。" - -msgid "New password:" -msgstr "新しいパスワード:" - -msgid "Confirm password:" -msgstr "新しいパスワード (確認用) :" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"パスワードリセットのリンクが不正です。おそらくこのリンクは既に使われていま" -"す。もう一度パスワードリセットしてください。" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"入力されたメールアドレスを持つアカウントが存在する場合、パスワードを設定する" -"ためのメールを送信しました。すぐに届くはずです。" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"メールが届かない場合は、登録したメールアドレスを入力したか確認し、スパムフォ" -"ルダに入っていないか確認してください。" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"このメールは %(site_name)s で、あなたのアカウントのパスワードリセットが要求さ" -"れたため、送信されました。" - -msgid "Please go to the following page and choose a new password:" -msgstr "次のページで新しいパスワードを選んでください:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "あなたのユーザー名 (もし忘れていたら):" - -msgid "Thanks for using our site!" -msgstr "ご利用ありがとうございました!" - -#, python-format -msgid "The %(site_name)s team" -msgstr " %(site_name)s チーム" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"パスワードを忘れましたか? メールアドレスを以下に入力すると、新しいパスワード" -"の設定方法をお知らせします。" - -msgid "Email address:" -msgstr "メールアドレス:" - -msgid "Reset my password" -msgstr "パスワードをリセット" - -msgid "Select all objects on this page for an action" -msgstr "アクション用にこのページのすべてのオブジェクトを選択" - -msgid "All dates" -msgstr "いつでも" - -#, python-format -msgid "Select %s" -msgstr "%s を選択" - -#, python-format -msgid "Select %s to change" -msgstr "変更する %s を選択" - -#, python-format -msgid "Select %s to view" -msgstr "表示する%sを選択" - -msgid "Date:" -msgstr "日付:" - -msgid "Time:" -msgstr "時刻:" - -msgid "Lookup" -msgstr "検索" - -msgid "Currently:" -msgstr "現在の値:" - -msgid "Change:" -msgstr "変更後:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 513b0a2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po deleted file mode 100644 index 55e78db..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,322 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Goto Hayato , 2021 -# Jannis Leidel , 2011 -# Shinya Okano , 2012,2014-2016,2023 -# Taichi Taniguchi, 2022 -# Takuro Onoue , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Shinya Okano , 2012,2014-2016,2023\n" -"Language-Team: Japanese (http://app.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "利用可能 %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"これが使用可能な %s のリストです。下のボックスで項目を選択し、2つのボックス間" -"の \"選択\"の矢印をクリックして、いくつかを選択することができます。" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "使用可能な %s のリストを絞り込むには、このボックスに入力します。" - -msgid "Filter" -msgstr "フィルター" - -msgid "Choose all" -msgstr "全て選択" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "クリックするとすべての %s を選択します。" - -msgid "Choose" -msgstr "選択" - -msgid "Remove" -msgstr "削除" - -#, javascript-format -msgid "Chosen %s" -msgstr "選択された %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"これが選択された %s のリストです。下のボックスで選択し、2つのボックス間の " -"\"削除\"矢印をクリックして一部を削除することができます。" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "選択された%sのリストを絞り込むには、このボックスに入力します。" - -msgid "Remove all" -msgstr "すべて削除" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "クリックするとすべての %s を選択から削除します。" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "選択された%s件のオプションは非表示です。" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s個中%(sel)s個選択" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"フィールドに未保存の変更があります。操作を実行すると未保存の変更は失われま" -"す。" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"操作を選択しましたが、フィールドに未保存の変更があります。OKをクリックして保" -"存してください。その後、操作を再度実行する必要があります。" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"操作を選択しましたが、フィールドに変更はありませんでした。もしかして保存ボタ" -"ンではなくて実行ボタンをお探しですか。" - -msgid "Now" -msgstr "現在" - -msgid "Midnight" -msgstr "0時" - -msgid "6 a.m." -msgstr "午前 6 時" - -msgid "Noon" -msgstr "12時" - -msgid "6 p.m." -msgstr "午後 6 時" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "ノート: あなたの環境はサーバー時間より、%s時間進んでいます。" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "ノート: あなたの環境はサーバー時間より、%s時間遅れています。" - -msgid "Choose a Time" -msgstr "時間を選択" - -msgid "Choose a time" -msgstr "時間を選択" - -msgid "Cancel" -msgstr "キャンセル" - -msgid "Today" -msgstr "今日" - -msgid "Choose a Date" -msgstr "日付を選択" - -msgid "Yesterday" -msgstr "昨日" - -msgid "Tomorrow" -msgstr "明日" - -msgid "January" -msgstr "1月" - -msgid "February" -msgstr "2月" - -msgid "March" -msgstr "3月" - -msgid "April" -msgstr "4月" - -msgid "May" -msgstr "5月" - -msgid "June" -msgstr "6月" - -msgid "July" -msgstr "7月" - -msgid "August" -msgstr "8月" - -msgid "September" -msgstr "9月" - -msgid "October" -msgstr "10月" - -msgid "November" -msgstr "11月" - -msgid "December" -msgstr "12月" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "1月" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "2月" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "3月" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "4月" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "5月" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "6月" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "7月" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "8月" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "9月" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "10月" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "11月" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "12月" - -msgid "Sunday" -msgstr "日曜日" - -msgid "Monday" -msgstr "月曜日" - -msgid "Tuesday" -msgstr "火曜日" - -msgid "Wednesday" -msgstr "水曜日" - -msgid "Thursday" -msgstr "木曜日" - -msgid "Friday" -msgstr "金曜日" - -msgid "Saturday" -msgstr "土曜日" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "日" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "月" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "火" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "水" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "木" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "金" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "土" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "日" - -msgctxt "one letter Monday" -msgid "M" -msgstr "月" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "火" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "水" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "木" - -msgctxt "one letter Friday" -msgid "F" -msgstr "金" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "土" - -msgid "Show" -msgstr "表示" - -msgid "Hide" -msgstr "非表示" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index c5e7e75..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index 4929590..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,764 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2013-2015 -# David A. , 2011 -# David A. , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Jannis Leidel , 2011\n" -"Language-Team: Georgian (http://app.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "არჩეული %(verbose_name_plural)s-ის წაშლა" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s წარმატებით წაიშალა." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s ვერ იშლება" - -msgid "Delete multiple objects" -msgstr "რამდენიმე ობიექტის წაშლა" - -msgid "Administration" -msgstr "ადმინისტრირება" - -msgid "All" -msgstr "ყველა" - -msgid "Yes" -msgstr "კი" - -msgid "No" -msgstr "არა" - -msgid "Unknown" -msgstr "გაურკვეველი" - -msgid "Any date" -msgstr "ნებისმიერი თარიღი" - -msgid "Today" -msgstr "დღეს" - -msgid "Past 7 days" -msgstr "ბოლო 7 დღე" - -msgid "This month" -msgstr "ამ თვეში" - -msgid "This year" -msgstr "წელს" - -msgid "No date" -msgstr "თარიღის გარეშე" - -msgid "Has date" -msgstr "აქვს თარიღი" - -msgid "Empty" -msgstr "ცარიელი" - -msgid "Not empty" -msgstr "ცარიელი არაა" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"გთხოვთ, შეიყვანოთ სწორი %(username)s და პაროლი პერსონალის ანგარიშისთვის. " -"იქონიეთ მხედველობაში, რომ ორივე ველი ითვალისწინებს მთავრულს." - -msgid "Action:" -msgstr "ქმედება:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "კიდევ ერთი %(verbose_name)s-ის დამატება" - -msgid "Remove" -msgstr "წაშლა" - -msgid "Addition" -msgstr "დამატება" - -msgid "Change" -msgstr "ცვლილება" - -msgid "Deletion" -msgstr "წაშლა" - -msgid "action time" -msgstr "ქმედების დრო" - -msgid "user" -msgstr "მომხმარებელი" - -msgid "content type" -msgstr "შემცველობის ტიპი" - -msgid "object id" -msgstr "ობიექტის id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ობიექტის წარმ" - -msgid "action flag" -msgstr "ქმედების ალამი" - -msgid "change message" -msgstr "შეცვლის შეტყობინება" - -msgid "log entry" -msgstr "ჟურნალის ჩანაწერი" - -msgid "log entries" -msgstr "ჟურნალის ჩანაწერები" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” დაემატა." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "შეიცვალა “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s.” წაიშალა" - -msgid "LogEntry Object" -msgstr "ჟურნალის ჩანაწერის ობიექტი" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "დაემატა {name} “{object}”." - -msgid "Added." -msgstr "დამატებულია." - -msgid "and" -msgstr "და" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "დაემატა {fields} {name}-სთვის “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} შეიცვალა." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "წაიშალა {name} “{object}”." - -msgid "No fields changed." -msgstr "არცერთი ველი არ შეცვლილა." - -msgid "None" -msgstr "არცერთი" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"ობიექტებზე მოქმედებების შესასრულებლად ისინი არჩეული უნდა იყოს. არცერთი " -"ობიექტი არჩეული არ არის." - -msgid "No action selected." -msgstr "ქმედება არჩეული არაა." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "დავამატოთ %s" - -#, python-format -msgid "Change %s" -msgstr "%s-ის შეცვლა" - -#, python-format -msgid "View %s" -msgstr "%s-ის ნახვა" - -msgid "Database error" -msgstr "მონაცემთა ბაზის შეცდომა" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s წარმატებით შეიცვალა." -msgstr[1] "%(count)s %(name)s წარმატებით შეიცვალა." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s-ია არჩეული" -msgstr[1] "%(total_count)s-ია არჩეული" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s-დან არცერთი არჩეული არ არის" - -msgid "Delete" -msgstr "წაშლა" - -#, python-format -msgid "Change history: %s" -msgstr "ცვლილებების ისტორია: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Django-ს ადმინისტრირების საიტი" - -msgid "Django administration" -msgstr "Django-ს ადმინისტრირება" - -msgid "Site administration" -msgstr "საიტის ადმინისტრირება" - -msgid "Log in" -msgstr "შესვლა" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s ადმინისტრირება" - -msgid "Page not found" -msgstr "გვერდი ვერ მოიძებნა" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "მთავარი" - -msgid "Server error" -msgstr "სერვერის შეცდომა" - -msgid "Server error (500)" -msgstr "სერვერის შეცდომა (500)" - -msgid "Server Error (500)" -msgstr "სერვერის შეცდომა (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "არჩეული მოქმედების შესრულება" - -msgid "Go" -msgstr "გადასვლა" - -msgid "Click here to select the objects across all pages" -msgstr "ყველა გვერდზე არსებული ობიექტის მოსანიშნად დააწკაპეთ აქ" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "ყველა %(total_count)s %(module_name)s-ის მონიშვნა" - -msgid "Clear selection" -msgstr "მონიშნულის გასუფთავება" - -msgid "Breadcrumbs" -msgstr "ნამცეცები" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "მოდელები %(name)s აპლიკაციაში" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "დამატება" - -msgid "View" -msgstr "ხედი" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "პაროლის შეცვლა" - -msgid "Set password" -msgstr "პაროლის დაყენება" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"შეიყვანეთ ახალი პაროლი მომხმარებლისათვის %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "" - -msgid "Enable password-based authentication" -msgstr "" - -msgid "Skip to main content" -msgstr "მთავარ შემცველობაზე გადასვლა" - -msgid "Welcome," -msgstr "კეთილი იყოს თქვენი მობრძანება," - -msgid "View site" -msgstr "საიტის ნახვა" - -msgid "Documentation" -msgstr "დოკუმენტაცია" - -msgid "Log out" -msgstr "გამოსვლა" - -#, python-format -msgid "Add %(name)s" -msgstr "დავამატოთ %(name)s" - -msgid "History" -msgstr "ისტორია" - -msgid "View on site" -msgstr "წარმოდგენა საიტზე" - -msgid "Filter" -msgstr "ფილტრი" - -msgid "Hide counts" -msgstr "რაოდენობების დამალვა" - -msgid "Show counts" -msgstr "რაოდენობების ჩვენება" - -msgid "Clear all filters" -msgstr "ყველა ფილტრის გასუფთავება" - -msgid "Remove from sorting" -msgstr "დალაგებიდან მოშორება" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "დალაგების პრიორიტეტი: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "დალაგების გადართვა" - -msgid "Toggle theme (current theme: auto)" -msgstr "" - -msgid "Toggle theme (current theme: light)" -msgstr "" - -msgid "Toggle theme (current theme: dark)" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"ობიექტების წაშლა: %(object_name)s '%(escaped_object)s' გამოიწვევს " -"დაკავშირებული ობიექტების წაშლას, მაგრამ თქვენ არა გაქვთ შემდეგი ტიპების " -"ობიექტების წაშლის უფლება:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s ტიპის '%(escaped_object)s' ობიექტის წაშლა მოითხოვს ასევე " -"შემდეგი დაკავშირებული ობიექტების წაშლას:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"ნამდვილად გსურთ, წაშალოთ %(object_name)s \"%(escaped_object)s\"? ყველა " -"ქვემოთ მოყვანილი დაკავშირებული ობიექტი წაშლილი იქნება:" - -msgid "Objects" -msgstr "ობიექტები" - -msgid "Yes, I’m sure" -msgstr "დიახ, დარწმუნებული ვარ" - -msgid "No, take me back" -msgstr "არა, დამაბრუნეთ უკან" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"%(objects_name)s ტიპის ობიექტის წაშლა ითხოვს ასევე შემდეგი ობიექტების " -"წაშლას, მაგრამ თქვენ არ გაქვთ ამის ნებართვა:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"არჩეული %(objects_name)s ობიექტის წაშლა მოითხოვს ასევე შემდეგი დაცული " -"დაკავშირეული ობიექტების წაშლას:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"დარწმუნებული ხართ, რომ გსურთ %(objects_name)s ობიექტის წაშლა? ყველა შემდეგი " -"ობიექტი, და მათზე დამოკიდებული ჩანაწერები წაშლილი იქნება:" - -msgid "Delete?" -msgstr "წავშალო?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s მიხედვით " - -msgid "Summary" -msgstr "შეჯამება" - -msgid "Recent actions" -msgstr "უკანასკნელი ქმედებები" - -msgid "My actions" -msgstr "ჩემი ქმედებები" - -msgid "None available" -msgstr "ხელმისაწვდომი არაფერია" - -msgid "Added:" -msgstr "დამატებულია:" - -msgid "Changed:" -msgstr "შეცვლილი:" - -msgid "Deleted:" -msgstr "წაიშალა:" - -msgid "Unknown content" -msgstr "უცნობი შიგთავსი" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "ნავიგაციის გადართვა" - -msgid "Sidebar" -msgstr "გვერდითი პანელი" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "ნავიგაციის ელემენტების გაფილტვრა" - -msgid "Date/time" -msgstr "თარიღი/დრო" - -msgid "User" -msgstr "მომხმარებელი" - -msgid "Action" -msgstr "ქმედება" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "ელემენტი" -msgstr[1] "ჩანაწერები" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "ვაჩვენოთ ყველა" - -msgid "Save" -msgstr "შენახვა" - -msgid "Popup closing…" -msgstr "მხტუნარას დახურვა…" - -msgid "Search" -msgstr "ძებნა" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s შედეგი" -msgstr[1] "%(counter)s შედეგი" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "სულ %(full_result_count)s" - -msgid "Save as new" -msgstr "შენახვა, როგორც ახლის" - -msgid "Save and add another" -msgstr "შენახვა და კიდევ დამატება" - -msgid "Save and continue editing" -msgstr "შენახვა და ჩასწორების დამატება" - -msgid "Save and view" -msgstr "შენახვა და ნახვა" - -msgid "Close" -msgstr "დახურვა" - -#, python-format -msgid "Change selected %(model)s" -msgstr "მონიშნული %(model)s-ის შეცვლა" - -#, python-format -msgid "Add another %(model)s" -msgstr "კიდევ ერთი %(model)s-ის დამატება" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "მონიშნული %(model)s-ის წაშლა" - -#, python-format -msgid "View selected %(model)s" -msgstr "მონიშნული %(model)s-ის ნახვა" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "ხელახლა შესვლა" - -msgid "Password change" -msgstr "პაროლის შეცვლა" - -msgid "Your password was changed." -msgstr "თქვენი პაროლი შეიცვალა." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "პაროლის შეცვლა" - -msgid "Password reset" -msgstr "პაროლის ჩამოყრა" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"თქვენი პაროლი დაყენებულია. ახლა შეგიძლიათ გადახვიდეთ შემდეგ გვერდზე და " -"შეხვიდეთ სისტემაში." - -msgid "Password reset confirmation" -msgstr "პაროლი ჩამოყრის დადასტურება" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"გთხოვთ, შეიყვანეთ თქვენი ახალი პაროლი ორჯერ, რათა დავრწმუნდეთ, რომ იგი " -"სწორად ჩაბეჭდეთ." - -msgid "New password:" -msgstr "ახალი პაროლი:" - -msgid "Confirm password:" -msgstr "პაროლის დადასტურება:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"პაროლის აღდგენის ბმული არასწორი იყო, შესაძლოა იმის გამო, რომ იგი უკვე ყოფილა " -"გამოყენებული. გთხოვთ, კიდევ ერთხელ სცადოთ პაროლის აღდგენა." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"თქვენ მიიღეთ ეს წერილი იმიტომ, რომ გააკეთეთ პაროლის თავიდან დაყენების " -"მოთხოვნა თქვენი მომხმარებლის ანგარიშისთვის %(site_name)s-ზე." - -msgid "Please go to the following page and choose a new password:" -msgstr "გთხოვთ, გადახვიდეთ შემდეგ გვერდზე და აირჩიოთ ახალი პაროლი:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "გმადლობთ, რომ იყენებთ ჩვენს საიტს!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s საიტის გუნდი" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "ელფოსტის მისამართი:" - -msgid "Reset my password" -msgstr "აღვადგინოთ ჩემი პაროლი" - -msgid "Select all objects on this page for an action" -msgstr "" - -msgid "All dates" -msgstr "ყველა თარიღი" - -#, python-format -msgid "Select %s" -msgstr "აირჩიეთ %s" - -#, python-format -msgid "Select %s to change" -msgstr "აირჩიეთ %s შესაცვლელად" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "თარიღი:" - -msgid "Time:" -msgstr "დრო:" - -msgid "Lookup" -msgstr "ძიება" - -msgid "Currently:" -msgstr "ამჟამად:" - -msgid "Change:" -msgstr "შეცვლა:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo deleted file mode 100644 index a66299c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po deleted file mode 100644 index 65ee60f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,218 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2013,2015 -# David A. , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "მისაწვდომი %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"ეს არის მისაწვდომი %s-ის სია. ზოგიერთი მათგანის ასარჩევად, მონიშვნით ისინი " -"ქვედა სარკმელში და დააწკაპუნეთ ორ სარკმელს შორის მდებარე ისარზე \"არჩევა\" ." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "აკრიფეთ ამ სარკმელში მისაწვდომი %s-ის სიის გასაფილტრად." - -msgid "Filter" -msgstr "ფილტრი" - -msgid "Choose all" -msgstr "ავირჩიოთ ყველა" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "დააწკაპუნეთ ერთდროულად ყველა %s-ის ასარჩევად." - -msgid "Choose" -msgstr "არჩევა" - -msgid "Remove" -msgstr "წავშალოთ" - -#, javascript-format -msgid "Chosen %s" -msgstr "არჩეული %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"ეს არის არჩეული %s-ის სია. ზოგიერთი მათგანის მოსაშორებლად, მონიშვნით ისინი " -"ქვედა სარკმელში და დააწკაპუნეთ ორ სარკმელს შორის მდებარე ისარზე \"მოშორება" -"\" ." - -msgid "Remove all" -msgstr "ყველას მოშორება" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "დააწკაპუნეთ ყველა არჩეული %s-ის ერთდროულად მოსაშორებლად." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s-დან არჩეულია %(sel)s" -msgstr[1] "%(cnt)s-დან არჩეულია %(sel)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"ცალკეულ ველებში შეუნახავი ცვლილებები გაქვთ! თუ მოქმედებას შეასრულებთ, " -"შეუნახავი ცვლილებები დაიკარაგება." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"აგირჩევიათ მოქმედება, მაგრამ ცალკეული ველები ჯერ არ შეგინახიათ! გთხოვთ, " -"შენახვისთვის დააჭიროთ OK. მოქმედების ხელახლა გაშვება მოგიწევთ." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"აგირჩევიათ მოქმედება, მაგრამ ცალკეულ ველებში ცვლილებები არ გაგიკეთებიათ! " -"სავარაუდოდ, ეძებთ ღილაკს \"Go\", და არა \"შენახვა\"" - -msgid "Now" -msgstr "ახლა" - -msgid "Midnight" -msgstr "შუაღამე" - -msgid "6 a.m." -msgstr "დილის 6 სთ" - -msgid "Noon" -msgstr "შუადღე" - -msgid "6 p.m." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "შენიშვნა: თქვენ ხართ %s საათით წინ სერვერის დროზე." -msgstr[1] "შენიშვნა: თქვენ ხართ %s საათით წინ სერვერის დროზე." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "შენიშვნა: თქვენ ხართ %s საათით უკან სერვერის დროზე." -msgstr[1] "შენიშვნა: თქვენ ხართ %s საათით უკან სერვერის დროზე." - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ავირჩიოთ დრო" - -msgid "Cancel" -msgstr "უარი" - -msgid "Today" -msgstr "დღეს" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "გუშინ" - -msgid "Tomorrow" -msgstr "ხვალ" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "ვაჩვენოთ" - -msgid "Hide" -msgstr "დავმალოთ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo deleted file mode 100644 index d095721..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.po deleted file mode 100644 index b3d8958..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.po +++ /dev/null @@ -1,631 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-10-06 11:59+0000\n" -"Last-Translator: Muḥend Belqasem \n" -"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" -"kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "Tebɣiḍ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "Tadbelt" - -msgid "All" -msgstr "Akkw" - -msgid "Yes" -msgstr "Ih" - -msgid "No" -msgstr "Uhu" - -msgid "Unknown" -msgstr "Arussin" - -msgid "Any date" -msgstr "Yal azemz" - -msgid "Today" -msgstr "Ass-a" - -msgid "Past 7 days" -msgstr "Di 7 n wussan ineggura" - -msgid "This month" -msgstr "Aggur-agi" - -msgid "This year" -msgstr "Aseggass-agi" - -msgid "No date" -msgstr "Ulac azemz" - -msgid "Has date" -msgstr "Ɣur-s azemz" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Tigawt:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "Kkes" - -msgid "action time" -msgstr "akud n tigawt" - -msgid "user" -msgstr "aseqdac" - -msgid "content type" -msgstr "anaw n ugbur" - -msgid "object id" -msgstr "asulay n tɣawsa" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "anay n tigawt" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "anekcum n uɣmis" - -msgid "log entries" -msgstr "inekcam n uɣmis" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "yettwarna." - -msgid "and" -msgstr "akked" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "Ula yiwen" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Rnu %s" - -#, python-format -msgid "Change %s" -msgstr "" - -msgid "Database error" -msgstr "Agul n database" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "Asmel n tedbelt" - -msgid "Log in" -msgstr "Kcem" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Asebtar ulac-it" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Ad nesḥissef imi asebter i d-sutreḍ ulac-it." - -msgid "Home" -msgstr "Agejdan" - -msgid "Server error" -msgstr "Tuccḍa n uqeddac" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "Ẓer" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "Beddel awal n tbaḍnit" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "Anṣuf," - -msgid "View site" -msgstr "Wali asmel" - -msgid "Documentation" -msgstr "Tasemlit" - -msgid "Log out" -msgstr "Asenser" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "Amazray" - -msgid "View on site" -msgstr "Wali deg usmel" - -msgid "Filter" -msgstr "Tastayt" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Mḥu" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "Tiɣawsiwin" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "Beddel" - -msgid "Delete?" -msgstr "Kkes?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "Agzul" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Rnu" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "Tigawin-iw" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "Azemz/asrag" - -msgid "User" -msgstr "Amseqdac" - -msgid "Action" -msgstr "Tigawt" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Sken akk" - -msgid "Save" -msgstr "Sekles" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Anadi" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "Sekles d amaynut:" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "Abeddel n wawal uffir" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "Awennez n wawal uffir" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "Asentem n uwennez n wawal uffir" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "Awal n tbaḍnit amaynut:" - -msgid "Confirm password:" -msgstr "Sentem awal uffir" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "Tansa e-mail :" - -msgid "Reset my password" -msgstr "Wennez awal-iw uffir" - -msgid "All dates" -msgstr "Izemzen merra" - -#, python-format -msgid "Select %s" -msgstr "Fren %s" - -#, python-format -msgid "Select %s to change" -msgstr "" - -msgid "Date:" -msgstr "Azemz:" - -msgid "Time:" -msgstr "Akud:" - -msgid "Lookup" -msgstr "Anadi" - -msgid "Currently:" -msgstr "Tura:" - -msgid "Change:" -msgstr "Beddel:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 755849a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po deleted file mode 100644 index 57f70c9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,204 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-10-06 08:10+0000\n" -"Last-Translator: Muḥend Belqasem \n" -"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" -"kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Yella %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Tastayt" - -msgid "Choose all" -msgstr "Fren akk" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "Fren" - -msgid "Remove" -msgstr "kkes" - -#, javascript-format -msgid "Chosen %s" -msgstr "Ifren %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "Kkes akk" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s si %(cnt)s yettwafren" -msgstr[1] "%(sel)s si %(cnt)s ttwafernen" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Tura" - -msgid "Choose a Time" -msgstr "Fren akud:" - -msgid "Choose a time" -msgstr "Fren akud" - -msgid "Midnight" -msgstr "Ttnaṣfa n yiḍ" - -msgid "6 a.m." -msgstr "6 f.t." - -msgid "Noon" -msgstr "Ttnaṣfa n uzal" - -msgid "6 p.m." -msgstr "6 m.d." - -msgid "Cancel" -msgstr "Sefsex" - -msgid "Today" -msgstr "Ass-a" - -msgid "Choose a Date" -msgstr "Fren azemz" - -msgid "Yesterday" -msgstr "Iḍelli" - -msgid "Tomorrow" -msgstr "Azekka" - -msgid "January" -msgstr "Yennayer" - -msgid "February" -msgstr "Fuṛaṛ" - -msgid "March" -msgstr "Meɣres" - -msgid "April" -msgstr "Yebrir" - -msgid "May" -msgstr "Mayyu" - -msgid "June" -msgstr "Yunyu" - -msgid "July" -msgstr "Yulyu" - -msgid "August" -msgstr "Ɣuct" - -msgid "September" -msgstr "Ctamber" - -msgid "October" -msgstr "Tuber" - -msgid "November" -msgstr "Wamber" - -msgid "December" -msgstr "Dujamber" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Sken" - -msgid "Hide" -msgstr "Ffer" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index abc3c54..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index 6d9625a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,695 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Baurzhan Muftakhidinov , 2015 -# Leo Trubach , 2017 -# Nurlan Rakhimzhanov , 2011 -# yun_man_ger , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 00:36+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Таңдалған %(count)d %(items)s элемент өшірілді." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s өшіру мүмкін емес" - -msgid "Are you sure?" -msgstr "Осыған сенімдісіз бе?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Таңдалған %(verbose_name_plural)s өшірілді" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Барлығы" - -msgid "Yes" -msgstr "Иә" - -msgid "No" -msgstr "Жоқ" - -msgid "Unknown" -msgstr "Белгісіз" - -msgid "Any date" -msgstr "Кез келген күн" - -msgid "Today" -msgstr "Бүгін" - -msgid "Past 7 days" -msgstr "Өткен 7 күн" - -msgid "This month" -msgstr "Осы ай" - -msgid "This year" -msgstr "Осы жыл" - -msgid "No date" -msgstr "Күні жоқ" - -msgid "Has date" -msgstr "Күні бар" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Әрекет:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Тағы басқа %(verbose_name)s кос" - -msgid "Remove" -msgstr "Өшіру" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "Өзгетру" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "әрекет уақыты" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "объекттің id-i" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "объекттің repr-i" - -msgid "action flag" -msgstr "әрекет белгісі" - -msgid "change message" -msgstr "хабарламаны өзгерту" - -msgid "log entry" -msgstr "Жорнал жазуы" - -msgid "log entries" -msgstr "Жорнал жазулары" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "және" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Ешқандай толтырма өзгермеді." - -msgid "None" -msgstr "Ешнәрсе" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Бірнәрсені өзгерту үшін бірінші оларды таңдау керек. Ешнәрсе өзгертілмеді." - -msgid "No action selected." -msgstr "Ешқандай әрекет таңдалмады." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" сәтті өшірілді." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s қосу" - -#, python-format -msgid "Change %s" -msgstr "%s өзгету" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "Мәліметтер базасының қатесі" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -"one: %(count)s %(name)s өзгертілді.\n" -"\n" -"other: %(count)s %(name)s таңдалғандарының барі өзгертілді." -msgstr[1] "" -"one: %(count)s %(name)s өзгертілді.\n" -"\n" -"other: %(count)s %(name)s таңдалғандарының барі өзгертілді." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -"one: %(total_count)s таңдалды\n" -"\n" -"other: Барлығы %(total_count)s таңдалды" -msgstr[1] "" -"one: %(total_count)s таңдалды\n" -"\n" -"other: Барлығы %(total_count)s таңдалды" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 of %(cnt)s-ден 0 таңдалды" - -#, python-format -msgid "Change history: %s" -msgstr "Өзгерес тарихы: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Даңғо сайтының әкімі" - -msgid "Django administration" -msgstr "Даңғо әкімшілігі" - -msgid "Site administration" -msgstr "Сайт әкімшілігі" - -msgid "Log in" -msgstr "Кіру" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Бет табылмады" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Кешірім сұраймыз, сіздің сұраған бетіңіз табылмады." - -msgid "Home" -msgstr "Негізгі" - -msgid "Server error" -msgstr "Сервердің қатесі" - -msgid "Server error (500)" -msgstr "Сервердің қатесі (500)" - -msgid "Server Error (500)" -msgstr "Сервердің қатесі (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Таңдалған әрәкетті іске қосу" - -msgid "Go" -msgstr "Алға" - -msgid "Click here to select the objects across all pages" -msgstr "Осы беттегі барлық объекттерді таңдау үшін осы жерді шертіңіз" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Осылардың %(total_count)s %(module_name)s барлығын таңдау" - -msgid "Clear selection" -msgstr "Белгілерді өшіру" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Алдымен, пайдаланушының атын және құпия сөзді енгізіңіз. Содан соң, тағы " -"басқа пайдаланушы параметрлерін енгізе аласыз." - -msgid "Enter a username and password." -msgstr "Пайдаланушының атын және құпия сөзді енгізіңіз." - -msgid "Change password" -msgstr "Құпия сөзді өзгерту" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"%(username)s пайдаланушы үшін жаңа құпия сөзді енгізіңіз." - -msgid "Welcome," -msgstr "Қош келдіңіз," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Құжаттама" - -msgid "Log out" -msgstr "Шығу" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s қосу" - -msgid "History" -msgstr "Тарих" - -msgid "View on site" -msgstr "Сайтта көру" - -msgid "Filter" -msgstr "Сүзгіз" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Өшіру" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' объектты өшіруы байланысты объекттерін " -"өшіруді қажет етеді, бырақ сізде осындай объектерді өшіру рұқсаты жоқ:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' объектті өшіру осындай байлансты " -"объекттерды өшіруді қажет етеді:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" объекттерді өшіруге сенімдісіз бе? " -"Бұл байланысты элементтер де өшіріледі:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Иә, сенімдімін" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Бірнеше объекттерді өшіру" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"%(objects_name)s объектты өшіруы байланысты объекттерін өшіруді қажет етеді, " -"бырақ сізде осындай объектерді өшіру рұқсаты жоқ:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Таңдалған %(objects_name)s-ді(ы) өшіру, онымен байланыстағы қорғалған " -"объектілердің барлығын жояды:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Таңдаған %(objects_name)s объектіңізді өшіруге сенімдісіз бе? Себебі, " -"таңдағын объектіліріңіз және онымен байланыстағы барлық элементтер жойылады:" - -msgid "View" -msgstr "" - -msgid "Delete?" -msgstr "Өшіру?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Қосу" - -msgid "You don't have permission to view or edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Қол жетімдісі жоқ" - -msgid "Unknown content" -msgstr "Белгісіз мазмұн" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Дерекқор орнатуыңызда бір қате бар. Дерекқор кестелері дұрыс құрылғаның және " -"дерекқор көрсетілген дерекқор пайдаланушыда оқұ рұқсаты бар." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "Өшіру/Уақыт" - -msgid "User" -msgstr "Қолданушы" - -msgid "Action" -msgstr "Әрекет" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Бұл объекттың өзгерту тарихы жоқ. Мүмкін ол бұл сайт арқылы енгізілген жоқ." - -msgid "Show all" -msgstr "Барлығын көрсету" - -msgid "Save" -msgstr "Сақтау" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Іздеу" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s нәтиже" -msgstr[1] "%(counter)s нәтиже" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Барлығы %(full_result_count)s" - -msgid "Save as new" -msgstr "Жаңадан сақтау" - -msgid "Save and add another" -msgstr "Сақта және жаңасын қос" - -msgid "Save and continue editing" -msgstr "Сақта және өзгертуді жалғастыр" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Бүгін Веб-торапқа уақыт бөлгеніңіз үшін рахмет." - -msgid "Log in again" -msgstr "Қайтадан кіріңіз" - -msgid "Password change" -msgstr "Құпия сөзді өзгерту" - -msgid "Your password was changed." -msgstr "Құпия сөзіңіз өзгертілді." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Ескі құпия сөзіңізді енгізіңіз, содан сон сенімді болу үшін жаңа құпия " -"сөзіңізді екі рет енгізіңіз." - -msgid "Change my password" -msgstr "Құпия сөзімді өзгерту" - -msgid "Password reset" -msgstr "Құпия сөзді өзгерту" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Сіздің құпия сөзіңіз енгізілді. Жүйеге кіруіңізге болады." - -msgid "Password reset confirmation" -msgstr "Құпия сөзді өзгерту растау" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Сенімді болу үшін жаңа құпия сөзіңізді екі рет енгізіңіз." - -msgid "New password:" -msgstr "Жаңа құпия сөз:" - -msgid "Confirm password:" -msgstr "Құпия сөз (растау):" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Құпия сөзді өзгерту байланыс дұрыс емес, мүмкін ол осыған дейін " -"пайдаланылды. Жаңа құпия сөзді өзгерту сұрау жіберіңіз." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "Жаңа құпия сөзді тандау үшін мынау бетке кіріңіз:" - -msgid "Your username, in case you've forgotten:" -msgstr "Егер ұмытып қалған болсаңыз, пайдалануш атыңыз:" - -msgid "Thanks for using our site!" -msgstr "Біздің веб-торабын қолданғаныңыз үшін рахмет!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s тобы" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "Құпия сөзді жаңала" - -msgid "All dates" -msgstr "Барлық мерзімдер" - -#, python-format -msgid "Select %s" -msgstr "%s таңда" - -#, python-format -msgid "Select %s to change" -msgstr "%s өзгерту үщін таңда" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Күнтізбелік күн:" - -msgid "Time:" -msgstr "Уақыт:" - -msgid "Lookup" -msgstr "Іздеу" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0b65151..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po deleted file mode 100644 index 9c51f35..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,210 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Nurlan Rakhimzhanov , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s бар" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Сүзгіш" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "Өшіру(жою)" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s-ң %(sel)s-ы(і) таңдалды" -msgstr[1] "%(cnt)s-ң %(sel)s-ы(і) таңдалды" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Сіздің төмендегі өзгермелі алаңдарда(fields) өзгерістеріңіз бар. Егер артық " -"әрекет жасасаңызб сіз өзгерістеріңізді жоғалтасыз." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Сіз өз өзгерістеріңізді сақтамай, әрекет жасадыңыз. Өтініш, сақтау үшін ОК " -"батырмасын басыңыз және өз әрекетіңізді қайта жасап көріңіз. " - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Сіз Сақтау батырмасына қарағанда, Go(Алға) батырмасын іздеп отырған " -"боларсыз, себебі ешқандай өзгеріс жасамай, әрекет жасадыңыз." - -msgid "Now" -msgstr "Қазір" - -msgid "Midnight" -msgstr "Түн жарым" - -msgid "6 a.m." -msgstr "06" - -msgid "Noon" -msgstr "Талтүс" - -msgid "6 p.m." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Уақытты таңда" - -msgid "Cancel" -msgstr "Болдырмау" - -msgid "Today" -msgstr "Бүгін" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Кеше" - -msgid "Tomorrow" -msgstr "Ертең" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Көрсету" - -msgid "Hide" -msgstr "Жасыру" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index a50821c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index 8b16d1f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,636 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "តើលោកអ្នកប្រាកដទេ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "ទាំងអស់" - -msgid "Yes" -msgstr "យល់ព្រម" - -msgid "No" -msgstr "មិនយល់ព្រម" - -msgid "Unknown" -msgstr "មិន​ដឹង" - -msgid "Any date" -msgstr "កាល​បរិច្ឆេទណាមួយ" - -msgid "Today" -msgstr "ថ្ងៃនេះ" - -msgid "Past 7 days" -msgstr "៧​ថ្ងៃ​កន្លង​មក" - -msgid "This month" -msgstr "ខែ​នេះ" - -msgid "This year" -msgstr "ឆ្នាំ​នេះ" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "លប់ចេញ" - -msgid "action time" -msgstr "ពេលវេលាប្រតិបត្តិការ" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "លេខ​សំគាល់​កម្មវិធី (object id)" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "object repr" - -msgid "action flag" -msgstr "សកម្មភាព" - -msgid "change message" -msgstr "ផ្លាស់ប្តូរ" - -msgid "log entry" -msgstr "កំណត់ហេតុ" - -msgid "log entries" -msgstr "កំណត់ហេតុ" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "និង" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "ពុំមានទិន្នន័យត្រូវបានផ្លាស់ប្តូរ។" - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "ឈ្មោះកម្មវិធី %(name)s \"%(obj)s\" ត្រូវបានលប់ដោយជោគជ័យ។" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "បន្ថែម %s" - -#, python-format -msgid "Change %s" -msgstr "ផ្លាស់ប្តូរ %s" - -msgid "Database error" -msgstr "ទិន្នន័យមូលដ្ឋានមានបញ្ហា" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "សកម្មភាពផ្លាស់ប្តូរកន្លងមក : %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ទំព័រគ្រប់គ្រងរបស់ Django" - -msgid "Django administration" -msgstr "ការ​គ្រប់គ្រង​របស់ ​Django" - -msgid "Site administration" -msgstr "ទំព័រគ្រប់គ្រង" - -msgid "Log in" -msgstr "ពិនិត្យចូល" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "ទំព័រ​ដែល​លោកអ្នកចង់​រក​នេះពុំមាន​នៅក្នុងម៉ាស៊ីនរបស់យើងខ្ញុំទេ" - -msgid "We're sorry, but the requested page could not be found." -msgstr "សួមអភ័យទោស ទំព័រ​ដែល​លោកអ្នកចង់​រក​នេះពុំមាន​នឹងក្នុងម៉ាស៊ីនរបស់យើងខ្ញុំទេ" - -msgid "Home" -msgstr "គេហទំព័រ" - -msgid "Server error" -msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា" - -msgid "Server error (500)" -msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា (៥០០)" - -msgid "Server Error (500)" -msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា  (៥០០)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "ស្វែងរក" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"តំបូងសូមបំពេញ ឈ្មោះជាសមាជិក និង ពាក្យសំងាត់​។ បន្ទាប់មកលោកអ្នកអាចបំពេញបន្ថែមជំរើសផ្សេងៗទៀតបាន។ " - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "សូមស្វាគមន៏" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "ឯកសារ" - -msgid "Log out" -msgstr "ចាកចេញ" - -#, python-format -msgid "Add %(name)s" -msgstr "បន្ថែម %(name)s" - -msgid "History" -msgstr "សកម្មភាព​កន្លង​មក" - -msgid "View on site" -msgstr "មើលនៅលើគេហទំព័រដោយផ្ទាល់" - -msgid "Filter" -msgstr "ស្វែងរកជាមួយ" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "លប់" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"ការលប់ %(object_name)s '%(escaped_object)s' អាចធ្វើអោយ​កម្មវិធីដែលពាក់​ព័ន្ធបាត់បង់ ។" -" ក៏ប៉ន្តែលោកអ្នក​ពុំមាន​សិទ្ធិលប់​កម្មវិធី​ប្រភេទនេះទេ។" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"តើលោកអ្នកប្រាកដជាចង់លប់ %(object_name)s \"%(escaped_object)s" -"\"? ការលប់ %(object_name)s '%(escaped_object)s' អាចធ្វើអោយ​កម្មវិធីដែលពាក់​ព័ន្ធបាត់បង់។" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "ខ្ញុំច្បាស់​ជាចង់លប់" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "ផ្លាស់ប្តូរ" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "ដោយ​  %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "បន្ថែម" - -msgid "You don't have permission to edit anything." -msgstr "លោកអ្នកពុំមានសិទ្ធិ ផ្លាស់​ប្តូរ ទេ។" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "គ្មាន" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"មូលដ្ឋាន​ទិន្នន័យ​​​ របស់លោកអ្នក មានបញ្ហា។ តើ លោកអ្នកបាន បង្កើត តារាង​ របស់មូលដ្ឋានទិន្នន័យ​" -" ហើយឬនៅ? តើ​ លោកអ្នកប្រាកដថាសមាជិកអាចអានមូលដ្ឋានទិន្នន័យនេះ​​បានឬទេ? " - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "Date/time" - -msgid "User" -msgstr "សមាជិក" - -msgid "Action" -msgstr "សកម្មភាព" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"កម្មវិធីនេះមិនមានសកម្មភាព​កន្លងមកទេ។ ប្រហែលជាសកម្មភាពទាំងនេះមិនបានធ្វើនៅទំព័រគ្រប់គ្រងនេះ។" - -msgid "Show all" -msgstr "បង្ហាញទាំងអស់" - -msgid "Save" -msgstr "រក្សាទុក" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "សរុបទាំងអស់ %(full_result_count)s" - -msgid "Save as new" -msgstr "រក្សាទុក" - -msgid "Save and add another" -msgstr "រក្សាទុក ហើយ បន្ថែម​ថ្មី" - -msgid "Save and continue editing" -msgstr "រក្សាទុក ហើយ កែឯកសារដដែល" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "សូមថ្លែងអំណរគុណ ដែលបានចំណាយ ពេលវេលាដ៏មានតំលៃ របស់លោកអ្នកមកទស្សនាគេហទំព័ររបស់យើងខ្ញុំ" - -msgid "Log in again" -msgstr "ពិនិត្យចូលម្តងទៀត" - -msgid "Password change" -msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់" - -msgid "Your password was changed." -msgstr "ពាក្យសំងាត់របស់លោកអ្នកបានផ្លាស់ប្តូរហើយ" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "សូមបំពេញពាក្យសំងាត់ចាស់របស់លោកអ្នក។ ដើម្បីសុវត្ថភាព សូមបំពេញពាក្យសំងាត់ថ្មីខាងក្រោមពីរដង។" - -msgid "Change my password" -msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់" - -msgid "Password reset" -msgstr "ពាក្យសំងាត់បានកំណត់សារជាថ្មី" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "ពាក្យសំងាត់ថ្មី" - -msgid "Confirm password:" -msgstr "បំពេញពាក្យសំងាត់ថ្មីម្តងទៀត" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "ឈ្មោះជាសមាជិកក្នុងករណីភ្លេច:" - -msgid "Thanks for using our site!" -msgstr "សូមអរគុណដែលបានប្រើប្រាស់សេវាកម្មរបស់យើងខ្ញុំ" - -#, python-format -msgid "The %(site_name)s team" -msgstr "ក្រុមរបស់គេហទំព័រ %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "កំណត់ពាក្យសំងាត់សារជាថ្មី" - -msgid "All dates" -msgstr "កាលបរិច្ឆេទទាំងអស់" - -#, python-format -msgid "Select %s" -msgstr "ជ្រើសរើស %s" - -#, python-format -msgid "Select %s to change" -msgstr "ជ្រើសរើស %s ដើម្បីផ្លាស់ប្តូរ" - -msgid "Date:" -msgstr "កាលបរិច្ឆេទ" - -msgid "Time:" -msgstr "ម៉ោង" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c0b94c1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po deleted file mode 100644 index fbe0ae1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,201 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s ដែលអាច​ជ្រើសរើសបាន" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "ស្វែងរកជាមួយ" - -msgid "Choose all" -msgstr "ជ្រើសរើសទាំងអស់" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "លប់ចេញ" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s ដែលបានជ្រើសរើស" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" - -msgid "Now" -msgstr "ឥឡូវនេះ" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ជ្រើសរើសម៉ោង" - -msgid "Midnight" -msgstr "អធ្រាត្រ" - -msgid "6 a.m." -msgstr "ម៉ោង ៦ ព្រឹក" - -msgid "Noon" -msgstr "ពេលថ្ងែត្រង់" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "លប់ចោល" - -msgid "Today" -msgstr "ថ្ងៃនេះ" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "ម្សិលមិញ" - -msgid "Tomorrow" -msgstr "ថ្ងៃស្អែក" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index 3740da2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index 06e63dc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,639 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "ಖಚಿತಪಡಿಸುವಿರಾ? " - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "ಎಲ್ಲಾ" - -msgid "Yes" -msgstr "ಹೌದು" - -msgid "No" -msgstr "ಇಲ್ಲ" - -msgid "Unknown" -msgstr "ಗೊತ್ತಿಲ್ಲ(ದ/ದ್ದು)" - -msgid "Any date" -msgstr "ಯಾವುದೇ ದಿನಾಂಕ" - -msgid "Today" -msgstr "ಈದಿನ" - -msgid "Past 7 days" -msgstr "ಕಳೆದ ೭ ದಿನಗಳು" - -msgid "This month" -msgstr "ಈ ತಿಂಗಳು" - -msgid "This year" -msgstr "ಈ ವರ್ಷ" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "ತೆಗೆದು ಹಾಕಿ" - -msgid "action time" -msgstr "ಕ್ರಮದ(ಕ್ರಿಯೆಯ) ಸಮಯ" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "ವಸ್ತುವಿನ ಐಡಿ" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "ವಸ್ತು ಪ್ರಾತಿನಿಧ್ಯ" - -msgid "action flag" -msgstr "ಕ್ರಮದ(ಕ್ರಿಯೆಯ) ಪತಾಕೆ" - -msgid "change message" -msgstr "ಬದಲಾವಣೆಯ ಸಂದೇಶ/ಸಂದೇಶ ಬದಲಿಸಿ" - -msgid "log entry" -msgstr "ಲಾಗ್ ದಾಖಲೆ" - -msgid "log entries" -msgstr "ಲಾಗ್ ದಾಖಲೆಗಳು" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "ಮತ್ತು" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "ಯಾವುದೇ ಅಂಶಗಳು ಬದಲಾಗಲಿಲ್ಲ." - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಯಿತು." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s ಸೇರಿಸಿ" - -#, python-format -msgid "Change %s" -msgstr "%s ಅನ್ನು ಬದಲಿಸು" - -msgid "Database error" -msgstr "ದತ್ತಸಂಚಯದ ದೋಷ" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ಜಾಂಗೋ ತಾಣದ ಆಡಳಿತಗಾರರು" - -msgid "Django administration" -msgstr "ಜಾಂಗೋ ಆಡಳಿತ" - -msgid "Site administration" -msgstr "ತಾಣ ನಿರ್ವಹಣೆ" - -msgid "Log in" -msgstr "ಒಳಗೆ ಬನ್ನಿ" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "ಪುಟ ಸಿಗಲಿಲ್ಲ" - -msgid "We're sorry, but the requested page could not be found." -msgstr "ಕ್ಷಮಿಸಿ, ನೀವು ಕೇಳಿದ ಪುಟ ಸಿಗಲಿಲ್ಲ" - -msgid "Home" -msgstr "ಪ್ರಾರಂಭಸ್ಥಳ(ಮನೆ)" - -msgid "Server error" -msgstr "ಸರ್ವರ್ ದೋಷ" - -msgid "Server error (500)" -msgstr "ಸರ್ವರ್ ದೋಷ(೫೦೦)" - -msgid "Server Error (500)" -msgstr "ಸರ್ವರ್ ದೋಷ(೫೦೦)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "ಹೋಗಿ" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"ಮೊದಲು ಬಳಕೆದಾರ-ಹೆಸರು ಮತ್ತು ಪ್ರವೇಶಪದವನ್ನು ಕೊಡಿರಿ. ನಂತರ, ನೀವು ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳನ್ನು " -"ಬದಲಿಸಬಹುದಾಗಿದೆ." - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "ಪ್ರವೇಶಪದ ಬದಲಿಸಿ" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "ಸುಸ್ವಾಗತ." - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "ವಿವರಮಾಹಿತಿ" - -msgid "Log out" -msgstr "ಹೊರಕ್ಕೆ ಹೋಗಿ" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ಸೇರಿಸಿ" - -msgid "History" -msgstr "ಚರಿತ್ರೆ" - -msgid "View on site" -msgstr "ತಾಣದಲ್ಲಿ ನೋಡಿ" - -msgid "Filter" -msgstr "ಸೋಸಕ" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "ಅಳಿಸಿಹಾಕಿ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"'%(escaped_object)s' %(object_name)s ಅನ್ನು ತೆಗೆದುಹಾಕುವುದರಿಂದ ಸಂಬಂಧಿತ ವಸ್ತುಗಳೂ " -"ಕಳೆದುಹೋಗುತ್ತವೆ. ಆದರೆ ನಿಮ್ಮ ಖಾತೆಗೆ ಕೆಳಕಂಡ ಬಗೆಗಳ ವಸ್ತುಗಳನ್ನು ತೆಗೆದುಹಾಕಲು " -"ಅನುಮತಿಯಿಲ್ಲ." - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "ಹೌದು,ನನಗೆ ಖಚಿತವಿದೆ" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "ಬದಲಿಸಿ/ಬದಲಾವಣೆ" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s ಇಂದ" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "ಸೇರಿಸಿ" - -msgid "You don't have permission to edit anything." -msgstr "ಯಾವುದನ್ನೂ ತಿದ್ದಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ ." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "ಯಾವುದೂ ಲಭ್ಯವಿಲ್ಲ" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"ಡಾಟಾಬೇಸನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ. ಸೂಕ್ತ ಡಾಟಾಬೇಸ್ ಕೋಷ್ಟಕಗಳು ರಚನೆಯಾಗಿ ಅರ್ಹ " -"ಬಳಕೆದಾರರು ಅವುಗಳನ್ನು ಓದಬಹುದಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಾತರಿ ಪಡಿಸಿಕೊಳ್ಳಿ." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "ದಿನಾಂಕ/ಸಮಯ" - -msgid "User" -msgstr "ಬಳಕೆದಾರ" - -msgid "Action" -msgstr "ಕ್ರಮ(ಕ್ರಿಯೆ)" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"ಈ ವಸ್ತುವಿಗೆ ಬದಲಾವಣೆಯ ಇತಿಹಾಸವಿಲ್ಲ. ಅದು ಬಹುಶಃ ಈ ಆಡಳಿತತಾಣದ ಮೂಲಕ ಸೇರಿಸಲ್ಪಟ್ಟಿಲ್ಲ." - -msgid "Show all" -msgstr "ಎಲ್ಲವನ್ನೂ ತೋರಿಸು" - -msgid "Save" -msgstr "ಉಳಿಸಿ" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "ಒಟ್ಟು %(full_result_count)s" - -msgid "Save as new" -msgstr "ಹೊಸದರಂತೆ ಉಳಿಸಿ" - -msgid "Save and add another" -msgstr "ಉಳಿಸಿ ಮತ್ತು ಇನ್ನೊಂದನ್ನು ಸೇರಿಸಿ" - -msgid "Save and continue editing" -msgstr "ಉಳಿಸಿ ಮತ್ತು ತಿದ್ದುವುದನ್ನು ಮುಂದುವರಿಸಿರಿ." - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ಈದಿನ ತಮ್ಮ ಅತ್ಯಮೂಲ್ಯವಾದ ಸಮಯವನ್ನು ನಮ್ಮ ತಾಣದಲ್ಲಿ ಕಳೆದುದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು." - -msgid "Log in again" -msgstr "ಮತ್ತೆ ಒಳಬನ್ನಿ" - -msgid "Password change" -msgstr "ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ" - -msgid "Your password was changed." -msgstr "ನಿಮ್ಮ ಪ್ರವೇಶಪದ ಬದಲಾಯಿಸಲಾಗಿದೆ" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"ಭದ್ರತೆಯ ದೃಷ್ಟಿಯಿಂದ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ಸೂಚಿಸಿರಿ. ಆನಂತರ ನೀವು ಸರಿಯಾಗಿ " -"ಬರೆದಿದ್ದೀರೆಂದು ನಾವು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು ಎರಡು ಬಾರಿ ಬರೆಯಿರಿ." - -msgid "Change my password" -msgstr "ನನ್ನ ಪ್ರವೇಶಪದ ಬದಲಿಸಿ" - -msgid "Password reset" -msgstr "ಪ್ರವೇಶಪದವನ್ನು ಬದಲಿಸುವಿಕೆ" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "ಹೊಸ ಪ್ರವೇಶಪದ:" - -msgid "Confirm password:" -msgstr "ಪ್ರವೇಶಪದವನ್ನು ಖಚಿತಪಡಿಸಿ:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "ನೀವು ಮರೆತಿದ್ದಲ್ಲಿ , ನಿಮ್ಮ ಬಳಕೆದಾರ-ಹೆಸರು" - -msgid "Thanks for using our site!" -msgstr "ನಮ್ಮ ತಾಣವನ್ನು ಬಳಸಿದ್ದಕ್ದಾಗಿ ಧನ್ಯವಾದಗಳು!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s ತಂಡ" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "ನನ್ನ ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೆ ನಿರ್ಧರಿಸಿ " - -msgid "All dates" -msgstr "ಎಲ್ಲಾ ದಿನಾಂಕಗಳು" - -#, python-format -msgid "Select %s" -msgstr "%s ಆಯ್ದುಕೊಳ್ಳಿ" - -#, python-format -msgid "Select %s to change" -msgstr "ಬದಲಾಯಿಸಲು %s ಆಯ್ದುಕೊಳ್ಳಿ" - -msgid "Date:" -msgstr "ದಿನಾಂಕ:" - -msgid "Time:" -msgstr "ಸಮಯ:" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo deleted file mode 100644 index fa49be6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po deleted file mode 100644 index 0a651bc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,261 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# karthikbgl , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "ಲಭ್ಯ %s " - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "ಶೋಧಕ" - -msgid "Choose all" -msgstr "ಎಲ್ಲವನ್ನೂ ಆಯ್ದುಕೊಳ್ಳಿ" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "ತೆಗೆದು ಹಾಕಿ" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s ಆಯ್ದುಕೊಳ್ಳಲಾಗಿದೆ" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "ಎಲ್ಲಾ ತೆಗೆದುಹಾಕಿ" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"ನೀವು ಪ್ರತ್ಯೇಕ ತಿದ್ದಬಲ್ಲ ಕ್ಷೇತ್ರಗಳಲ್ಲಿ ಬದಲಾವಣೆ ಉಳಿಸಿಲ್ಲ. ನಿಮ್ಮ ಉಳಿಸದ ಬದಲಾವಣೆಗಳು " -"ನಾಶವಾಗುತ್ತವೆ" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "ಈಗ" - -msgid "Midnight" -msgstr "ಮಧ್ಯರಾತ್ರಿ" - -msgid "6 a.m." -msgstr "ಬೆಳಗಿನ ೬ ಗಂಟೆ " - -msgid "Noon" -msgstr "ಮಧ್ಯಾಹ್ನ" - -msgid "6 p.m." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ಸಮಯವೊಂದನ್ನು ಆರಿಸಿ" - -msgid "Cancel" -msgstr "ರದ್ದುಗೊಳಿಸಿ" - -msgid "Today" -msgstr "ಈ ದಿನ" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "ನಿನ್ನೆ" - -msgid "Tomorrow" -msgstr "ನಾಳೆ" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "" -"You have already submitted this form. Are you sure you want to submit it " -"again?" -msgstr "" - -msgid "Show" -msgstr "ಪ್ರದರ್ಶನ" - -msgid "Hide" -msgstr "ಮರೆಮಾಡಲು" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index b5f5f77..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index 3c74267..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,805 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jiyoon, Ha , 2016 -# DONGHO JEONG , 2020 -# Dummy Iam, 2021 -# Geonho Kim / Leo Kim , 2019 -# Gihun Ham , 2018 -# Hang Park , 2019 -# Hoseok Lee , 2016 -# Ian Y. Choi , 2015,2019 -# Jaehong Kim , 2011 -# Jannis Leidel , 2011 -# Jay Oh , 2020 -# Le Tartuffe , 2014,2016 -# Juyoung Lim, 2024 -# Lee Dogeon , 2025 -# LEE Hwanyong , 2023 -# Seho Noh , 2018 -# Seacbyul Lee , 2017 -# 최소영, 2024 -# Taesik Yoon , 2015 -# 정훈 이, 2021 -# 박태진, 2021 -# Yang Chan Woo , 2019 -# Youngkwang Yang, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Lee Dogeon , 2025\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "선택된 %(verbose_name_plural)s 을/를 삭제합니다." - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d개의 %(items)s 을/를 성공적으로 삭제하였습니다." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s를 삭제할 수 없습니다." - -msgid "Delete multiple objects" -msgstr "여러 개의 오브젝트 삭제" - -msgid "Administration" -msgstr "관리" - -msgid "All" -msgstr "모두" - -msgid "Yes" -msgstr "예" - -msgid "No" -msgstr "아니오" - -msgid "Unknown" -msgstr "알 수 없습니다." - -msgid "Any date" -msgstr "언제나" - -msgid "Today" -msgstr "오늘" - -msgid "Past 7 days" -msgstr "지난 7일" - -msgid "This month" -msgstr "이번 달" - -msgid "This year" -msgstr "이번 해" - -msgid "No date" -msgstr "날짜 없음" - -msgid "Has date" -msgstr "날짜 있음" - -msgid "Empty" -msgstr "비어 있음" - -msgid "Not empty" -msgstr "비어 있지 않음" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"관리자 계정의 %(username)s 와 비밀번호를 입력해주세요. 대소문자를 구분해서 입" -"력해주세요." - -msgid "Action:" -msgstr "액션:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "%(verbose_name)s 더 추가하기" - -msgid "Remove" -msgstr "삭제하기" - -msgid "Addition" -msgstr "추가" - -msgid "Change" -msgstr "변경" - -msgid "Deletion" -msgstr "삭제" - -msgid "action time" -msgstr "액션 타임" - -msgid "user" -msgstr "사용자" - -msgid "content type" -msgstr "콘텐츠 타입" - -msgid "object id" -msgstr "오브젝트 아이디" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "오브젝트 표현" - -msgid "action flag" -msgstr "액션 플래그" - -msgid "change message" -msgstr "메시지 변경" - -msgid "log entry" -msgstr "로그 엔트리" - -msgid "log entries" -msgstr "로그 엔트리" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\"이/가 추가되었습니다." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\"이/가 \"%(changes)s\"(으)로 변경되었습니다." - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "%(object)s를 삭제했습니다." - -msgid "LogEntry Object" -msgstr "로그 엔트리 객체" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}개체”를 추가했습니다." - -msgid "Added." -msgstr "추가되었습니다." - -msgid "and" -msgstr "또한" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}개체”의 {fields}필드를 변경했습니다." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields}가 변경되었습니다." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}개체”를 삭제했습니다." - -msgid "No fields changed." -msgstr "변경된 필드가 없습니다." - -msgid "None" -msgstr "없음" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"하나 이상을 선택하려면 \"Control\" 키를 누른 채로 선택해주세요. Mac의 경우에" -"는 \"Command\" 키를 눌러주세요." - -msgid "Select this object for an action - {}" -msgstr "작업에 대한 객체를 선택합니다. - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\"가 성공적으로 추가되었습니다." - -msgid "You may edit it again below." -msgstr "아래 내용을 수정해야 합니다." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\"가 성공적으로 추가되었습니다. 아래에서 다른 {name}을 추가할 " -"수 있습니다." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\"가 성공적으로 변경되었습니다. 아래에서 다시 수정할 수 있습니" -"다." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\"가 성공적으로 변경되었습니다. 아래에서 다른 {name}을 추가할 " -"수 있습니다." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\"가 성공적으로 변경되었습니다." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"항목들에 액션을 적용하기 위해선 먼저 항목들이 선택되어 있어야 합니다. 아무 항" -"목도 변경되지 않았습니다." - -msgid "No action selected." -msgstr "액션이 선택되지 않았습니다." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\"이/가 성공적으로 삭제되었습니다." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"ID \"%(key)s\"을/를 지닌%(name)s이/가 존재하지 않습니다. 삭제된 값이 아닌지 " -"확인해주세요." - -#, python-format -msgid "Add %s" -msgstr "%s 추가" - -#, python-format -msgid "Change %s" -msgstr "%s 변경" - -#, python-format -msgid "View %s" -msgstr "뷰 %s" - -msgid "Database error" -msgstr "데이터베이스 오류" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s개의 %(name)s이/가 변경되었습니다." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "총 %(total_count)s개가 선택되었습니다." - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s 중 아무것도 선택되지 않았습니다." - -msgid "Delete" -msgstr "삭제" - -#, python-format -msgid "Change history: %s" -msgstr "변경 히스토리: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s 을/를 삭제하려면 다음 보호상태의 연관된 오브젝트" -"들을 삭제해야 합니다: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django 사이트 관리" - -msgid "Django administration" -msgstr "Django 관리" - -msgid "Site administration" -msgstr "사이트 관리" - -msgid "Log in" -msgstr "로그인" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s 관리" - -msgid "Page not found" -msgstr "페이지를 찾을 수 없습니다." - -msgid "We’re sorry, but the requested page could not be found." -msgstr "죄송합니다, 요청한 페이지를 찾을 수 없습니다." - -msgid "Home" -msgstr "홈" - -msgid "Server error" -msgstr "서버 오류" - -msgid "Server error (500)" -msgstr "서버 오류 (500)" - -msgid "Server Error (500)" -msgstr "서버 오류 (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"오류가 발생했습니다. 사이트 관리자들에게 이메일로 보고되었고 단시일 내에 수정" -"될 것입니다. 기다려주셔서 감사합니다." - -msgid "Run the selected action" -msgstr "선택한 액션을 실행합니다." - -msgid "Go" -msgstr "실행" - -msgid "Click here to select the objects across all pages" -msgstr "모든 페이지의 항목들을 선택하려면 여기를 클릭하세요." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "%(total_count)s개의 %(module_name)s 모두를 선택합니다." - -msgid "Clear selection" -msgstr "선택 해제" - -msgid "Breadcrumbs" -msgstr "사용자 위치" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s 애플리케이션의 모델" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "추가" - -msgid "View" -msgstr "보기" - -msgid "You don’t have permission to view or edit anything." -msgstr "독자는 뷰 및 수정 권한이 없습니다." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "비밀번호 변경" - -msgid "Set password" -msgstr "비밀번호 설정" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "아래 오류들을 수정하기 바랍니다. " - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s 새로운 비밀번호를 입력하세요." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"이 작업은 이 사용자에 대해 비밀번호 기반 인증을 활성화합니" -"다." - -msgid "Disable password-based authentication" -msgstr "비밀번호 기반 인증 비활성화" - -msgid "Enable password-based authentication" -msgstr "비밀번호 기반 인증 활성화" - -msgid "Skip to main content" -msgstr "메인 콘텐츠로 이동" - -msgid "Welcome," -msgstr "환영합니다," - -msgid "View site" -msgstr "사이트 보기" - -msgid "Documentation" -msgstr "문서" - -msgid "Log out" -msgstr "로그아웃" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s 추가" - -msgid "History" -msgstr "히스토리" - -msgid "View on site" -msgstr "사이트에서 보기" - -msgid "Filter" -msgstr "필터" - -msgid "Hide counts" -msgstr "개수 숨기기" - -msgid "Show counts" -msgstr "개수 표시" - -msgid "Clear all filters" -msgstr "모든 필터 삭제" - -msgid "Remove from sorting" -msgstr "정렬에서 " - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "정렬 조건 : %(priority_number)s" - -msgid "Toggle sorting" -msgstr "정렬 " - -msgid "Toggle theme (current theme: auto)" -msgstr "테마 토글 (현재 테마:자동)" - -msgid "Toggle theme (current theme: light)" -msgstr "테마 토글 (현재 테마: 밝음)" - -msgid "Toggle theme (current theme: dark)" -msgstr "테마 토글 (현재 테마: 어두움)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" 을/를 삭제하면서관련 오브젝트를 제거하" -"고자 했으나, 지금 사용하시는 계정은 다음 타입의 오브젝트를 제거할 권한이 없습" -"니다. :" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s'를 삭제하려면 다음 보호상태의 연관된 오브" -"젝트들을 삭제해야 합니다." - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"정말로 %(object_name)s \"%(escaped_object)s\"을/를 삭제하시겠습니까? 다음의 " -"관련 항목들이 모두 삭제됩니다. :" - -msgid "Objects" -msgstr "오브젝트" - -msgid "Yes, I’m sure" -msgstr "네, 확신합니다. " - -msgid "No, take me back" -msgstr "아뇨, 돌려주세요." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"연관 오브젝트 삭제로 선택한 %(objects_name)s의 삭제 중, 그러나 당신의 계정은 " -"다음 오브젝트의 삭제 권한이 없습니다. " - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s를 삭제하려면 다음 보호상태의 연관된 오브젝트들을 삭제해야 합" -"니다." - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"선택한 %(objects_name)s를 정말 삭제하시겠습니까? 다음의 오브젝트와 연관 아이" -"템들이 모두 삭제됩니다:" - -msgid "Delete?" -msgstr "삭제" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s (으)로" - -msgid "Summary" -msgstr "개요" - -msgid "Recent actions" -msgstr "최근 활동" - -msgid "My actions" -msgstr "나의 활동" - -msgid "None available" -msgstr "이용할 수 없습니다." - -msgid "Added:" -msgstr "추가되었습니다:" - -msgid "Changed:" -msgstr "변경:" - -msgid "Deleted:" -msgstr "삭제:" - -msgid "Unknown content" -msgstr "알 수 없는 형식입니다." - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"당신의 데이터베이스 설치, 설치본에 오류가 있습니다. \n" -"적합한 데이터베이스 테이블이 생성되었는지 확인하고, 데이터베이스가 적합한 사" -"용자가 열람할 수 있는 지 확인하십시오. " - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"%(username)s 로 인증되어 있지만, 이 페이지에 접근 가능한 권한이 없습니다. 다" -"른 계정으로 로그인하시겠습니까?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "토글 메뉴" - -msgid "Sidebar" -msgstr "사이드바" - -msgid "Start typing to filter…" -msgstr "필터에 타이핑 시작..." - -msgid "Filter navigation items" -msgstr "탐색 항목 필터링" - -msgid "Date/time" -msgstr "날짜/시간" - -msgid "User" -msgstr "사용자" - -msgid "Action" -msgstr "액션" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "항목" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"이 개체는 변경 기록이 없습니다. 아마도 이 관리자 사이트를 통해 추가되지 않았" -"을 것입니다. " - -msgid "Show all" -msgstr "모두 표시" - -msgid "Save" -msgstr "저장" - -msgid "Popup closing…" -msgstr "팝업 닫는중..." - -msgid "Search" -msgstr "검색" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "결과 %(counter)s개 나옴" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "총 %(full_result_count)s건" - -msgid "Save as new" -msgstr "새로 저장" - -msgid "Save and add another" -msgstr "저장 및 다른 이름으로 추가" - -msgid "Save and continue editing" -msgstr "저장 및 편집 계속" - -msgid "Save and view" -msgstr "저장하고 조회하기" - -msgid "Close" -msgstr "닫기" - -#, python-format -msgid "Change selected %(model)s" -msgstr "선택된 %(model)s 변경" - -#, python-format -msgid "Add another %(model)s" -msgstr "%(model)s 추가" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "선택된 %(model)s 제거" - -#, python-format -msgid "View selected %(model)s" -msgstr "선택된 %(model)s 보기" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "사이트를 이용해 주셔서 고맙습니다." - -msgid "Log in again" -msgstr "다시 로그인하기" - -msgid "Password change" -msgstr "비밀번호 변경" - -msgid "Your password was changed." -msgstr "비밀번호가 변경되었습니다." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"독자의 과거 비밀번호를 입력한 후, 보안을 위해 새로운 비밀번호을 두 번 입력하" -"여 옳은 입력인 지 확인할 수 있도록 하십시오." - -msgid "Change my password" -msgstr "비밀번호 변경" - -msgid "Password reset" -msgstr "비밀번호 초기화" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "비밀번호가 설정되었습니다. 이제 로그인하세요." - -msgid "Password reset confirmation" -msgstr "비밀번호 초기화 확인" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"새로운 비밀번호를 정확히 입력했는지 확인할 수 있도록 두 번 입력하시기 바랍니" -"다." - -msgid "New password:" -msgstr "새로운 비밀번호:" - -msgid "Confirm password:" -msgstr "새로운 비밀번호 (확인):" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"비밀번호 초기화 링크가 이미 사용되어 올바르지 않습니다. 비밀번호 초기화를 다" -"시 해주세요." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"계정이 존재한다면, 독자가 입력한 이메일로 비밀번호 설정 안내문을 발송했습니" -"다. 곧 수신할 수 있을 것입니다. " - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"만약 이메일을 받지 못하였다면, 등록하신 이메일을 다시 확인하시거나 스팸 메일" -"함을 확인해주세요." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"%(site_name)s의 계정 비밀번호를 초기화하기 위한 요청으로 이 이메일이 전송되었" -"습니다." - -msgid "Please go to the following page and choose a new password:" -msgstr "다음 페이지에서 새 비밀번호를 선택하세요." - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "사이트를 이용해 주셔서 고맙습니다." - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s 팀" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"비밀번호를 잊어버렸나요? 이메일 주소를 아래에 입력하시면 새로운 비밀번호를 설" -"정하는 절차를 이메일로 보내드리겠습니다." - -msgid "Email address:" -msgstr "이메일 주소:" - -msgid "Reset my password" -msgstr "비밀번호 초기화" - -msgid "Select all objects on this page for an action" -msgstr "작업에 대한 이 페이지의 모든 객체를 선택합니다." - -msgid "All dates" -msgstr "언제나" - -#, python-format -msgid "Select %s" -msgstr "%s 선택" - -#, python-format -msgid "Select %s to change" -msgstr "변경할 %s 선택" - -#, python-format -msgid "Select %s to view" -msgstr "보기위한 1%s 를(을) 선택" - -msgid "Date:" -msgstr "날짜:" - -msgid "Time:" -msgstr "시각:" - -msgid "Lookup" -msgstr "찾아보기" - -msgid "Currently:" -msgstr "현재:" - -msgid "Change:" -msgstr "변경:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 85267f8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po deleted file mode 100644 index adcf449..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,327 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# DaHae Sung , 2016 -# alexhojinpark, 2023 -# Hoseok Lee , 2016 -# Jaehong Kim , 2011 -# Jannis Leidel , 2011 -# Jay Oh , 2020 -# Le Tartuffe , 2014 -# LEE Hwanyong , 2023 -# minsung kang, 2015 -# Seoeun(Sun☀️) Hong, 2023 -# Yang Chan Woo , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: alexhojinpark, 2023\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "이용 가능한 %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"사용 가능한 %s 의 리스트 입니다. 아래의 상자에서 선택하고 두 상자 사이의 " -"\"선택\" 화살표를 클릭하여 몇 가지를 선택할 수 있습니다." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "사용 가능한 %s 리스트를 필터링하려면 이 상자에 입력하세요." - -msgid "Filter" -msgstr "필터" - -msgid "Choose all" -msgstr "모두 선택" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "한번에 모든 %s 를 선택하려면 클릭하세요." - -msgid "Choose" -msgstr "선택" - -msgid "Remove" -msgstr "삭제" - -#, javascript-format -msgid "Chosen %s" -msgstr "선택된 %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"선택된 %s 리스트 입니다. 아래의 상자에서 선택하고 두 상자 사이의 \"제거\" 화" -"살표를 클릭하여 일부를 제거 할 수 있습니다." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "선택된 %s의 리스트를 필터링 하려면 이 박스에 입력 하세요 ." - -msgid "Remove all" -msgstr "모두 제거" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "한번에 선택된 모든 %s 를 제거하려면 클릭하세요." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s 선택된 옵션은 표시되지 않습니다." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s개가 %(cnt)s개 중에 선택됨." - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"개별 편집 가능한 필드에 저장되지 않은 값이 있습니다. 액션을 수행하면 저장되" -"지 않은 값들을 잃어버리게 됩니다." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"개별 필드의 값들을 저장하지 않고 액션을 선택했습니다. OK를 누르면 저장되며, " -"액션을 한 번 더 실행해야 합니다." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"개별 필드에 아무런 변경이 없는 상태로 액션을 선택했습니다. 저장 버튼이 아니" -"라 진행 버튼을 찾아보세요." - -msgid "Now" -msgstr "현재" - -msgid "Midnight" -msgstr "자정" - -msgid "6 a.m." -msgstr "오전 6시" - -msgid "Noon" -msgstr "정오" - -msgid "6 p.m." -msgstr "오후 6시" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Note: 서버 시간보다 %s 시간 빠릅니다." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Note: 서버 시간보다 %s 시간 늦은 시간입니다." - -msgid "Choose a Time" -msgstr "시간 선택" - -msgid "Choose a time" -msgstr "시간 선택" - -msgid "Cancel" -msgstr "취소" - -msgid "Today" -msgstr "오늘" - -msgid "Choose a Date" -msgstr "시간 선택" - -msgid "Yesterday" -msgstr "어제" - -msgid "Tomorrow" -msgstr "내일" - -msgid "January" -msgstr "1월" - -msgid "February" -msgstr "2월" - -msgid "March" -msgstr "3월" - -msgid "April" -msgstr "4월" - -msgid "May" -msgstr "5월" - -msgid "June" -msgstr "6월" - -msgid "July" -msgstr "7월" - -msgid "August" -msgstr "8월" - -msgid "September" -msgstr "9월" - -msgid "October" -msgstr "10월" - -msgid "November" -msgstr "11월" - -msgid "December" -msgstr "12월" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "1월" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "2월" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "3월" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "4월" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "5월" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "6월" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "7월" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "8월" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "9월" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "10월" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "11월" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "12월" - -msgid "Sunday" -msgstr "일요일" - -msgid "Monday" -msgstr "월요일" - -msgid "Tuesday" -msgstr "화요일" - -msgid "Wednesday" -msgstr "수요일" - -msgid "Thursday" -msgstr "목요일" - -msgid "Friday" -msgstr "금요일" - -msgid "Saturday" -msgstr "토요일" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "일" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "월" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "화" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "수" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "목" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "금" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "토" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "일" - -msgctxt "one letter Monday" -msgid "M" -msgstr "월" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "화" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "수" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "목" - -msgctxt "one letter Friday" -msgid "F" -msgstr "금" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "토" - -msgid "Show" -msgstr "보기" - -msgid "Hide" -msgstr "감추기" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index 71d5e5b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 683480c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,711 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Belek , 2016 -# Chyngyz Monokbaev , 2016 -# Soyuzbek Orozbek uulu , 2020-2021 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-27 14:12+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Тандалган %(verbose_name_plural)s элементтерин өчүрүү" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s ийгиликтүү өчүрүлдү." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s өчүрүү мүмкүн эмес" - -msgid "Are you sure?" -msgstr "Чечимиңиз аныкпы?" - -msgid "Administration" -msgstr "Башкаруу" - -msgid "All" -msgstr "Баары" - -msgid "Yes" -msgstr "Ооба" - -msgid "No" -msgstr "Жок" - -msgid "Unknown" -msgstr "Такталбаган" - -msgid "Any date" -msgstr "Кааалаган бир күн" - -msgid "Today" -msgstr "Бүгүн" - -msgid "Past 7 days" -msgstr "Өткөн 7 күн" - -msgid "This month" -msgstr "Бул айда" - -msgid "This year" -msgstr "Бул жылда" - -msgid "No date" -msgstr "Күн белгиленген эмес" - -msgid "Has date" -msgstr "Күн белгиленген" - -msgid "Empty" -msgstr "Бош" - -msgid "Not empty" -msgstr "Бош эмес" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Сураныч кызматкердин %(username)s жана сыр сөзүн туура жазыңыз. Эки " -"талаага тең баш тамга же кичүү тамга менен жазганыңыз маанилүү экенин эске " -"тутуңуз." - -msgid "Action:" -msgstr "Аракет" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Дагы %(verbose_name)s кошуу" - -msgid "Remove" -msgstr "Алып таштоо" - -msgid "Addition" -msgstr "Кошумча" - -msgid "Change" -msgstr "Өзгөртүү" - -msgid "Deletion" -msgstr "Өчүрүү" - -msgid "action time" -msgstr "аракет убактысы" - -msgid "user" -msgstr "колдонуучу" - -msgid "content type" -msgstr "Контент тиби" - -msgid "object id" -msgstr "объекттин id-си" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "объекттин repr-и" - -msgid "action flag" -msgstr "аракет белгиси" - -msgid "change message" -msgstr "билдирүүнү өзгөртүү" - -msgid "log entry" -msgstr "Жазуу журналы" - -msgid "log entries" -msgstr "Жазуу журналдары" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” кошулду" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” — %(changes)s өзгөрдү" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s.” өчүрүлдү" - -msgid "LogEntry Object" -msgstr "LogEntry обектиси" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” кошулду" - -msgid "Added." -msgstr "Кошулду." - -msgid "and" -msgstr "жана" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” үчүн {fields} өзгөртүлдү." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} өзгөртүлдү." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” өчүрүлдү." - -msgid "No fields changed." -msgstr "Эч бир талаа өзгөртүлгөн жок" - -msgid "None" -msgstr "Эчбир" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Көбүрөөк тандоо үчүн “CTRL”, же макбук үчүн “Cmd” кармап туруңуз." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" ийгиликтүү кошулду." - -msgid "You may edit it again below." -msgstr "Сиз муну төмөндө кайра өзгөртүшүңүз мүмкүн." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} \"{obj}\" ийгиликтүү кошулду. Сиз башка {name} кошо аласыз." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” ийгиликтүү өзгөрдү. Сиз аны төмөндө өзгөртө аласыз." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} “{obj}” ийгиликтүү кошулду. Сиз аны төмөндө өзгөртө аласыз." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” ийгиликтүү өзгөрдү. Төмөндө башка {name} кошсоңуз болот." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" ийгиликтүү өзгөрдү." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Нерселердин үстүнөн аракет кылуудан мурда алар тандалуусу керек. Эч " -"нерсеөзгөргөн жок." - -msgid "No action selected." -msgstr "Аракет тандалган жок." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" ийгиликтүү өчүрүлдү" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"ID си %(key)s\" болгон %(name)s табылган жок. Ал өчүрүлгөн болуп жүрбөсүн?" - -#, python-format -msgid "Add %s" -msgstr "%s кошуу" - -#, python-format -msgid "Change %s" -msgstr "%s өзгөртүү" - -#, python-format -msgid "View %s" -msgstr "%s көрүү" - -msgid "Database error" -msgstr "Берилиштер базасында ката" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s%(name)s ийгиликтүү өзгөртүлдү." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Бүт %(total_count)s тандалды" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s нерседен эчтемке тандалган жок" - -#, python-format -msgid "Change history: %s" -msgstr "%s тарыхын өзгөртүү" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s өчүрүлүүсү үчүн %(related_objects)s да " -"өчүрүлүүсү талап кылынат." - -msgid "Django site admin" -msgstr "Жанго башкарма сайты" - -msgid "Django administration" -msgstr "Жанго башкармасы" - -msgid "Site administration" -msgstr "Сайт башкармасы" - -msgid "Log in" -msgstr "Кирүү" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s башкармасы" - -msgid "Page not found" -msgstr "Барак табылган жок" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Кечирим сурайбыз, сиз сураган барак табылбады." - -msgid "Home" -msgstr "Башкы" - -msgid "Server error" -msgstr "Сервер катасы" - -msgid "Server error (500)" -msgstr "Сервер (500) катасы" - -msgid "Server Error (500)" -msgstr "Сервер (500) катасы" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ката кетти. Сайт башкармасына экат менен кайрылсаңыз тез арада маселе " -"чечилиши мүмкүн. Түшүнгөнүңүз үчүн рахмат." - -msgid "Run the selected action" -msgstr "Тандалган аракетти иштетиңиз" - -msgid "Go" -msgstr "Жөнө" - -msgid "Click here to select the objects across all pages" -msgstr "Барак боюнча бүт обекттерди тандоо үчүн чыкылдатыңыз" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Бүт %(total_count)s %(module_name)s тандаңыз" - -msgid "Clear selection" -msgstr "Тандоону бошотуу" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s колдонмосундагы моделдер" - -msgid "Add" -msgstr "Кошуу" - -msgid "View" -msgstr "Көрүү" - -msgid "You don’t have permission to view or edit anything." -msgstr "Сиз эчнерсени көрүүгө же өзгөртүүгө жеткиңиз жок." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Оболу колдонуучу атыңызды жана сырсөздү териңиз. Ошондо гана башка " -"маалыматтарын өзгөртө аласыз." - -msgid "Enter a username and password." -msgstr "колдонуучу атыңызды жана сырсөз киргизиңиз." - -msgid "Change password" -msgstr "Сырсөз өзгөртүү" - -msgid "Please correct the error below." -msgstr "Төмөнкү катаны оңдоңуз." - -msgid "Please correct the errors below." -msgstr "Төмөнкү каталарды оңдоңуз" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s үчүн жаңы сырсөз териңиз." - -msgid "Welcome," -msgstr "Кош келиңиз," - -msgid "View site" -msgstr "Сайтты ачуу" - -msgid "Documentation" -msgstr "Түшүндүрмө" - -msgid "Log out" -msgstr "Чыгуу" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s кошуу" - -msgid "History" -msgstr "Тарых" - -msgid "View on site" -msgstr "Сайтта көрүү" - -msgid "Filter" -msgstr "Чыпкалоо" - -msgid "Clear all filters" -msgstr "Бүт чыпкаларды алып салуу" - -msgid "Remove from sorting" -msgstr "Ирээттөөдөн алып салуу" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Ирээттөө абзелдүүлүгү: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Ирээтти алмаштыруу" - -msgid "Delete" -msgstr "Өчүрүү" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s өчүрүү үчүн башка байланышкан " -"обекттерди өчүрүү да талап кылынат. Бирок сиздин буга жеткиңиз жок:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s өчүрүү үчүн башка байланышкан " -"обекттерди өчүрүү да талап кылат:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Сиз чындап эле %(object_name)s \"%(escaped_object)s\" өчүрүүнү каалайсызбы? " -"Бүт байланышкан нерселер өчүрүлөт:" - -msgid "Objects" -msgstr "Обекттер" - -msgid "Yes, I’m sure" -msgstr "Ооба, мен чындап эле" - -msgid "No, take me back" -msgstr "Жок, мени аркага кайтар" - -msgid "Delete multiple objects" -msgstr "обекттерди өчүр" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"%(objects_name)s өчүрүү үчүн башка байланышкан обекттерди өчүрүү да талап " -"кылат. Бирок сиздин буга жеткиңиз жок:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s өчүрүү үчүн башка байланышкан обекттерди өчүрүү да талап " -"кылат:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"чындап эле %(objects_name)s өчүрүүнү каалайсызбы? Бүт байланышкан нерселер " -"өчүрүлөт:" - -msgid "Delete?" -msgstr "Өчүрөлүбү?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s боюнча" - -msgid "Summary" -msgstr "Жалпысынан" - -msgid "Recent actions" -msgstr "Акыркы аракеттер" - -msgid "My actions" -msgstr "Менин аракеттерим" - -msgid "None available" -msgstr "Мүмкүн эмес" - -msgid "Unknown content" -msgstr "Белгисиз мазмун" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Сиздин базаңызды орнотуу боюнча ката кетти. Керектүү база жадыбалдары " -"түзүлгөндүгүн жана тиешелүү колдонуучунун жеткиси барлыгын текшериңиз." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Сиз %(username)s катары киргенсиз, бирок сиздин бул баракка жеткиңиз жок. " -"Сиз башка колдонуучу катары киресизби?" - -msgid "Forgotten your password or username?" -msgstr "Колдонуучу атыңыз же сырсөздү унутуп калдыңызбы?" - -msgid "Toggle navigation" -msgstr "Навигацияны алмаштыруу" - -msgid "Start typing to filter…" -msgstr "чыпкалоо үчүн жазып башта" - -msgid "Filter navigation items" -msgstr "Навигация элементтерин чыпкалоо" - -msgid "Date/time" -msgstr "Күн/убакыт" - -msgid "User" -msgstr "Колдонуучу" - -msgid "Action" -msgstr "Аракет" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "Бул обекттин өзгөрүү тарыхы жок." - -msgid "Show all" -msgstr "Баарын көрсөтүү" - -msgid "Save" -msgstr "Сактоо" - -msgid "Popup closing…" -msgstr "Жалтаң жабылуу..." - -msgid "Search" -msgstr "Издөө" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "жыйынтыгы:%(counter)s" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "жалпысынан %(full_result_count)s" - -msgid "Save as new" -msgstr "Жаңы катары сактоо" - -msgid "Save and add another" -msgstr "Сакта жана башкасын кош" - -msgid "Save and continue editing" -msgstr "Сакта жана өзгөртүүнү улант" - -msgid "Save and view" -msgstr "Сактап туруп көрүү" - -msgid "Close" -msgstr "Жабуу" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Тандалган %(model)s өзгөртүү" - -#, python-format -msgid "Add another %(model)s" -msgstr "Башка %(model)s кошуу" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Тандалган %(model)s обеттерин өчүрүү" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Сайтта бираз убакыт өткөргөн үчүн ыраазычылык." - -msgid "Log in again" -msgstr "Кайрадан кирүү" - -msgid "Password change" -msgstr "Сырсөз өзгөрт" - -msgid "Your password was changed." -msgstr "Сиздин сырсөз өзгөрдү." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Коопсуздуктан улам эски сырсөздү териңиз, жана биз коошкондугун текшерүү " -"үчүн жаңы сырсөздү эки жолу териңиз." - -msgid "Change my password" -msgstr "Сырсөздү өзгөрт" - -msgid "Password reset" -msgstr "Сырсөздү кыйратуу" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Сиздин сырсөз орнотулду. Эми сиз алдыга карай жылып, кирүү аткарсаңыз болот." - -msgid "Password reset confirmation" -msgstr "Сырсөздү кыйратуу тастыктамасы" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Тууралыгын жана коошкондугун текшере алышыбыз үчүн сырсөздү эки жолу териңиз." - -msgid "New password:" -msgstr "Жаңы сырсөз" - -msgid "Confirm password:" -msgstr "Сырсөз тастыктоосу:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Сырсөз кыйратуу шилтемеси жараксыз, мурдатан эле колдонулган болушу мүмкүн. " -"Башка шилтеме сурап көрүңүз." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Сырсөз тууралуу сизге кат жөнөттүк. Эгер мындай аккаунт бар болсо аны тез " -"арада ала аласыз." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Эгер сиз екат албасаңыз даректин тууралыган текшериңиз жана спам папкасын " -"текшериңиз." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "Сиз %(site_name)s боюнча сырсөз сураган үчүн бул экат келди." - -msgid "Please go to the following page and choose a new password:" -msgstr "Төмөнкү баракка кириңиз да жаңы сырсөз тандаңыз." - -msgid "Your username, in case you’ve forgotten:" -msgstr "Сиздин колдонуучу атыңыз, унутуп калсаңыз керек болот." - -msgid "Thanks for using our site!" -msgstr "Биздин сайтты колдонгонуңуз үчүн рахмат!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s жамааты" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "Сырсөз унуттуңузбу? едарек териңиз сизге сырсөз боюнча экат жөнөтөбүз." - -msgid "Email address:" -msgstr "едарек:" - -msgid "Reset my password" -msgstr "Сырсөзүмдү кыйрат" - -msgid "All dates" -msgstr "Бүт күндөр" - -#, python-format -msgid "Select %s" -msgstr "%s тандоо" - -#, python-format -msgid "Select %s to change" -msgstr "%s обекттерин өзгөртүү үчүн тандоо" - -#, python-format -msgid "Select %s to view" -msgstr "%s обекттерин көрүү үчүн тандоо" - -msgid "Date:" -msgstr "Күн:" - -msgid "Time:" -msgstr "Убак:" - -msgid "Lookup" -msgstr "Көз чаптыруу" - -msgid "Currently:" -msgstr "Азыркы:" - -msgid "Change:" -msgstr "Өзгөртүү:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 037e5fd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po deleted file mode 100644 index 76ca738..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,260 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soyuzbek Orozbek uulu , 2020-2021 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-02 11:44+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s даана жеткиликтүү" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Бул жеткиликтүү тизмеси %s даана . Сиз төмөндө кутудан кээ бирлерин \"Тандоо" -"\" баскычын басуу менен тандап алсаңыз болот." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Жеткиликтүү %s даана тизмесин чыпкалоо үчүн төмөнкү кутуга жазыңыз." - -msgid "Filter" -msgstr "Чыпкалоо" - -msgid "Choose all" -msgstr "Баарын тандоо" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Бүт %s даананы заматта тандоо үчүн чыкылдатыңыз." - -msgid "Choose" -msgstr "Тандоо" - -msgid "Remove" -msgstr "Алып таштоо" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s даана тандалды" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Бул тандалган %s даана. Сиз алардын каалаганын төмөндө кутудан \"Өчүр\" " -"баскычын басуу менен өчүрө аласыз." - -msgid "Remove all" -msgstr "Баарын алып ташта" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Тандалган %s даананын баарын өчүрүү үчүн басыңыз" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)sнерседен %(sel)sтандалды" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Сиз өзүнчө аймактарда сакталбаган өзгөртүүлөргө ээсиз. Эгер сиз бул аракетти " -"жасасаңыз сакталбаган өзгөрүүлөр текке кетет." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Сиз аракетти тандадыңыз бирок өзүнчө аймактарды сактай элексиз. Сактоо үчүн " -"ОК ту басыңыз. Сиз аракетти кайталашыңыз керек." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Сиз аракетти тандадыңыз жана өзүнчө аймактарда өзгөртүү киргизген жоксуз. " -"Сиз Сактоонун ордуна Жөнө баскычын басууңуз керек." - -msgid "Now" -msgstr "Азыр" - -msgid "Midnight" -msgstr "Түнүчү" - -msgid "6 a.m." -msgstr "саарлап саат 6" - -msgid "Noon" -msgstr "Түш" - -msgid "6 p.m." -msgstr "Кэч саат 6" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Эскертүү: Сиз серверден %s саат алдыда жүрөсүз." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Эскертүү: Сиз серверден %s саат аркада жүрөсүз." - -msgid "Choose a Time" -msgstr "Толук убак танда" - -msgid "Choose a time" -msgstr "Кыска убак танда" - -msgid "Cancel" -msgstr "Жокко чыгар" - -msgid "Today" -msgstr "Бүгүн" - -msgid "Choose a Date" -msgstr "Күн танда" - -msgid "Yesterday" -msgstr "Кечээ" - -msgid "Tomorrow" -msgstr "Эртең" - -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Янв" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Фев" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Мар" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Апр" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Июн" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Июл" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Авг" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Сен" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Окт" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Ноя" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Дек" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Жек" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Дүй" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Шей" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Шар" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Бей" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Жума" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Ише" - -msgid "Show" -msgstr "Көрсөт" - -msgid "Hide" -msgstr "Жашыр" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index f989aed..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index 5e2e794..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,632 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# sim0n , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/django/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "All" - -msgid "Yes" -msgstr "Jo" - -msgid "No" -msgstr "Nee" - -msgid "Unknown" -msgstr "Onbekannt" - -msgid "Any date" -msgstr "Iergendeen Datum" - -msgid "Today" -msgstr "Haut" - -msgid "Past 7 days" -msgstr "Läscht 7 Deeg" - -msgid "This month" -msgstr "Dëse Mount" - -msgid "This year" -msgstr "Dëst Joer" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Aktioun:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "" - -msgid "action time" -msgstr "" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "" - -#, python-format -msgid "Change %s" -msgstr "" - -msgid "Database error" -msgstr "" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We're sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "" - -msgid "Log out" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Läschen" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "Änner" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "" - -#, python-format -msgid "Select %s" -msgstr "" - -#, python-format -msgid "Select %s to change" -msgstr "" - -msgid "Date:" -msgstr "" - -msgid "Time:" -msgstr "" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 5b7937f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po deleted file mode 100644 index e1c4a6a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,145 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "" - -msgid "Clock" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Calendar" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" - -msgid "S M T W T F S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index b225f66..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index 0c93418..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,720 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# lauris , 2011 -# Matas Dailyda , 2015-2019 -# Nikolajus Krauklis , 2013 -# Simonas Kazlauskas , 2012-2013 -# sirex , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 10:32+0000\n" -"Last-Translator: Matas Dailyda \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Sėkmingai ištrinta %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ištrinti %(name)s negalima" - -msgid "Are you sure?" -msgstr "Ar esate tikras?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ištrinti pasirinktus %(verbose_name_plural)s " - -msgid "Administration" -msgstr "Administravimas" - -msgid "All" -msgstr "Visi" - -msgid "Yes" -msgstr "Taip" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Nežinomas" - -msgid "Any date" -msgstr "Betkokia data" - -msgid "Today" -msgstr "Šiandien" - -msgid "Past 7 days" -msgstr "Paskutinės 7 dienos" - -msgid "This month" -msgstr "Šį mėnesį" - -msgid "This year" -msgstr "Šiais metais" - -msgid "No date" -msgstr "Nėra datos" - -msgid "Has date" -msgstr "Turi datą" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Prašome įvesti tinkamą personalo paskyros %(username)s ir slaptažodį. " -"Atminkite, kad abu laukeliai yra jautrūs raidžių dydžiui." - -msgid "Action:" -msgstr "Veiksmas:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Pridėti dar viena %(verbose_name)s" - -msgid "Remove" -msgstr "Pašalinti" - -msgid "Addition" -msgstr "Pridėjimas" - -msgid "Change" -msgstr "Pakeisti" - -msgid "Deletion" -msgstr "Pašalinimas" - -msgid "action time" -msgstr "veiksmo laikas" - -msgid "user" -msgstr "vartotojas" - -msgid "content type" -msgstr "turinio tipas" - -msgid "object id" -msgstr "objekto id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekto repr" - -msgid "action flag" -msgstr "veiksmo žymė" - -msgid "change message" -msgstr "pakeisti žinutę" - -msgid "log entry" -msgstr "log įrašas" - -msgid "log entries" -msgstr "log įrašai" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "„%(object)s“ pridėti." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Pakeisti „%(object)s“ - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "„%(object)s“ ištrinti." - -msgid "LogEntry Object" -msgstr "LogEntry objektas" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Pridėtas {name} \"{object}\"." - -msgid "Added." -msgstr "Pridėta." - -msgid "and" -msgstr "ir" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Pakeisti {fields} arba {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Pakeisti {fields}." - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Pašalintas {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Nei vienas laukas nepakeistas" - -msgid "None" -msgstr "None" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Nuspauskite \"Control\", arba \"Command\" Mac kompiuteriuose, kad pasirinkti " -"daugiau nei vieną." - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "{name} \"{obj}\" buvo sėkmingai pridėtas." - -msgid "You may edit it again below." -msgstr "Galite tai dar kartą redaguoti žemiau." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" buvo sėkmingai pridėtas. Galite pridėti kitą {name} žemiau." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" buvo sėkmingai pakeistas. Galite jį koreguoti žemiau." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" buvo sėkmingai pridėtas. Galite jį vėl redaguoti žemiau." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" buvo sėkmingai pakeistas. Galite pridėti kitą {name} žemiau." - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "{name} \"{obj}\" buvo sėkmingai pakeistas." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Įrašai turi būti pasirinkti, kad būtų galima atlikti veiksmus. Įrašai " -"pakeisti nebuvo." - -msgid "No action selected." -msgstr "Veiksmai atlikti nebuvo." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" sėkmingai ištrintas." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s su ID \"%(key)s\" neegzistuoja. Gal tai buvo ištrinta?" - -#, python-format -msgid "Add %s" -msgstr "Pridėti %s" - -#, python-format -msgid "Change %s" -msgstr "Pakeisti %s" - -#, python-format -msgid "View %s" -msgstr "Peržiūrėti %s" - -msgid "Database error" -msgstr "Duomenų bazės klaida" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s sėkmingai pakeistas." -msgstr[1] "%(count)s %(name)s sėkmingai pakeisti." -msgstr[2] "%(count)s %(name)s " -msgstr[3] "%(count)s %(name)s " - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s pasirinktas" -msgstr[1] "%(total_count)s pasirinkti" -msgstr[2] "Visi %(total_count)s pasirinkti" -msgstr[3] "Visi %(total_count)s pasirinkti" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 iš %(cnt)s pasirinkta" - -#, python-format -msgid "Change history: %s" -msgstr "Pakeitimų istorija: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s šalinimas reikalautų pašalinti apsaugotus " -"susijusius objektus: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django tinklalapio administravimas" - -msgid "Django administration" -msgstr "Django administravimas" - -msgid "Site administration" -msgstr "Tinklalapio administravimas" - -msgid "Log in" -msgstr "Prisijungti" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administravimas" - -msgid "Page not found" -msgstr "Puslapis nerastas" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Atsiprašome, bet prašytas puslapis nerastas." - -msgid "Home" -msgstr "Pradinis" - -msgid "Server error" -msgstr "Serverio klaida" - -msgid "Server error (500)" -msgstr "Serverio klaida (500)" - -msgid "Server Error (500)" -msgstr "Serverio klaida (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Netikėta klaida. Apie ją buvo pranešta administratoriams el. paštu ir ji " -"turėtų būti greitai sutvarkyta. Dėkui už kantrybę." - -msgid "Run the selected action" -msgstr "Vykdyti pasirinktus veiksmus" - -msgid "Go" -msgstr "Vykdyti" - -msgid "Click here to select the objects across all pages" -msgstr "Spauskite čia norėdami pasirinkti visus įrašus" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Pasirinkti visus %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Atstatyti į pradinę būseną" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Pirmiausia įveskite naudotojo vardą ir slaptažodį. Tada galėsite keisti " -"daugiau naudotojo nustatymų." - -msgid "Enter a username and password." -msgstr "Įveskite naudotojo vardą ir slaptažodį." - -msgid "Change password" -msgstr "Keisti slaptažodį" - -msgid "Please correct the error below." -msgstr "Prašome ištaisyti žemiau esančią klaidą." - -msgid "Please correct the errors below." -msgstr "Ištaisykite žemiau esančias klaidas." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Įveskite naują slaptažodį naudotojui %(username)s." - -msgid "Welcome," -msgstr "Sveiki," - -msgid "View site" -msgstr "Peržiūrėti tinklalapį" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Atsijungti" - -#, python-format -msgid "Add %(name)s" -msgstr "Naujas %(name)s" - -msgid "History" -msgstr "Istorija" - -msgid "View on site" -msgstr "Matyti tinklalapyje" - -msgid "Filter" -msgstr "Filtras" - -msgid "Remove from sorting" -msgstr "Pašalinti iš rikiavimo" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Rikiavimo prioritetas: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Perjungti rikiavimą" - -msgid "Delete" -msgstr "Ištrinti" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Trinant %(object_name)s '%(escaped_object)s' turi būti ištrinti ir susiję " -"objektai, bet tavo vartotojas neturi teisių ištrinti šių objektų:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Ištrinant %(object_name)s '%(escaped_object)s' būtų ištrinti šie apsaugoti " -"ir susiję objektai:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ar este tikri, kad norite ištrinti %(object_name)s \"%(escaped_object)s\"? " -"Visi susiję objektai bus ištrinti:" - -msgid "Objects" -msgstr "Objektai" - -msgid "Yes, I'm sure" -msgstr "Taip, esu tikras" - -msgid "No, take me back" -msgstr "Ne, grįžti atgal" - -msgid "Delete multiple objects" -msgstr "Ištrinti kelis objektus" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Ištrinant pasirinktą %(objects_name)s būtų ištrinti susiję objektai, tačiau " -"jūsų vartotojas neturi reikalingų teisių ištrinti šiuos objektų tipus:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Ištrinant pasirinktus %(objects_name)s būtų ištrinti šie apsaugoti ir susiję " -"objektai:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ar esate tikri, kad norite ištrinti pasirinktus %(objects_name)s? Sekantys " -"pasirinkti bei susiję objektai bus ištrinti:" - -msgid "View" -msgstr "Peržiūrėti" - -msgid "Delete?" -msgstr "Ištrinti?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Pagal %(filter_title)s " - -msgid "Summary" -msgstr "Santrauka" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s aplikacijos modeliai" - -msgid "Add" -msgstr "Pridėti" - -msgid "You don't have permission to view or edit anything." -msgstr "Jūs neturite teisių peržiūrai ir redagavimui." - -msgid "Recent actions" -msgstr "Paskutiniai veiksmai" - -msgid "My actions" -msgstr "Mano veiksmai" - -msgid "None available" -msgstr "Nėra prieinamų" - -msgid "Unknown content" -msgstr "Nežinomas turinys" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Kažkas yra negerai su jūsų duomenų bazės instaliacija. Įsitikink, kad visos " -"reikalingos lentelės sukurtos ir vartotojas turi teises skaityti duomenų " -"bazę." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Jūs esate prisijungęs kaip %(username)s, bet neturite teisių patekti į šį " -"puslapį. Ar norėtumete prisijungti su kitu vartotoju?" - -msgid "Forgotten your password or username?" -msgstr "Pamiršote slaptažodį ar vartotojo vardą?" - -msgid "Date/time" -msgstr "Data/laikas" - -msgid "User" -msgstr "Naudotojas" - -msgid "Action" -msgstr "Veiksmas" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Šis objektas neturi pakeitimų istorijos. Tikriausiai jis buvo pridėtas ne " -"per administravimo puslapį." - -msgid "Show all" -msgstr "Rodyti visus" - -msgid "Save" -msgstr "Išsaugoti" - -msgid "Popup closing…" -msgstr "Iškylantysis langas užsidaro..." - -msgid "Search" -msgstr "Ieškoti" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s rezultatas" -msgstr[1] "%(counter)s rezultatai" -msgstr[2] "%(counter)s rezultatai" -msgstr[3] "%(counter)s rezultatai" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s iš viso" - -msgid "Save as new" -msgstr "Išsaugoti kaip naują" - -msgid "Save and add another" -msgstr "Išsaugoti ir pridėti naują" - -msgid "Save and continue editing" -msgstr "Išsaugoti ir tęsti redagavimą" - -msgid "Save and view" -msgstr "Išsaugoti ir peržiūrėti" - -msgid "Close" -msgstr "Uždaryti" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Keisti pasirinktus %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Pridėti dar vieną %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Pašalinti pasirinktus %(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Dėkui už šiandien tinklalapyje turiningai praleistą laiką." - -msgid "Log in again" -msgstr "Prisijungti dar kartą" - -msgid "Password change" -msgstr "Slaptažodžio keitimas" - -msgid "Your password was changed." -msgstr "Jūsų slaptažodis buvo pakeistas." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Saugumo sumetimais įveskite seną slaptažodį ir tada du kartus naują, kad " -"įsitikinti, jog nesuklydote rašydamas" - -msgid "Change my password" -msgstr "Keisti mano slaptažodį" - -msgid "Password reset" -msgstr "Slaptažodžio atstatymas" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Jūsų slaptažodis buvo išsaugotas. Dabas galite prisijungti." - -msgid "Password reset confirmation" -msgstr "Slaptažodžio atstatymo patvirtinimas" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Įveskite naująjį slaptažodį du kartus, taip užtikrinant, jog nesuklydote " -"rašydami." - -msgid "New password:" -msgstr "Naujasis slaptažodis:" - -msgid "Confirm password:" -msgstr "Slaptažodžio patvirtinimas:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Slaptažodžio atstatymo nuoroda buvo negaliojanti, nes ji tikriausiai jau " -"buvo panaudota. Prašykite naujo slaptažodžio pakeitimo." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Jei egzistuoja vartotojas su jūsų įvestu elektroninio pašto adresu, " -"išsiųsime jums slaptažodžio nustatymo instrukcijas . Instrukcijas turėtumėte " -"gauti netrukus." - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jei el. laiško negavote, prašome įsitikinti ar įvedėte tą el. pašto adresą " -"kuriuo registravotės ir patikrinkite savo šlamšto aplanką." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Jūs gaunate šį laišką nes prašėte paskyros slaptažodžio atkūrimo " -"%(site_name)s svetainėje." - -msgid "Please go to the following page and choose a new password:" -msgstr "Prašome eiti į šį puslapį ir pasirinkti naują slaptažodį:" - -msgid "Your username, in case you've forgotten:" -msgstr "Jūsų naudotojo vardas, jei netyčia jį užmiršote:" - -msgid "Thanks for using our site!" -msgstr "Dėkui, kad naudojatės mūsų tinklalapiu!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s komanda" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Pamiršote slaptažodį? Įveskite savo el. pašto adresą ir mes išsiųsime laišką " -"su instrukcijomis kaip nustatyti naują slaptažodį." - -msgid "Email address:" -msgstr "El. pašto adresas:" - -msgid "Reset my password" -msgstr "Atstatyti slaptažodį" - -msgid "All dates" -msgstr "Visos datos" - -#, python-format -msgid "Select %s" -msgstr "Pasirinkti %s" - -#, python-format -msgid "Select %s to change" -msgstr "Pasirinkite %s kurį norite keisti" - -#, python-format -msgid "Select %s to view" -msgstr "Pasirinkti %s peržiūrai" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Laikas:" - -msgid "Lookup" -msgstr "Paieška" - -msgid "Currently:" -msgstr "Šiuo metu:" - -msgid "Change:" -msgstr "Pakeisti:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 77922d3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po deleted file mode 100644 index a922bd6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,236 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kostas , 2011 -# Matas Dailyda , 2015-2016 -# Povilas Balzaravičius , 2011 -# Simonas Kazlauskas , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Matas Dailyda \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Galimi %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Tai yra sąrašas prieinamų %s. Dėžutėje žemiau pažymėdami keletą iš jų ir " -"paspausdami „Pasirinkti“ rodyklę tarp dviejų dėžučių jūs galite pasirinkti " -"keletą iš jų." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Rašykite į šią dėžutę, kad išfiltruotumėte prieinamų %s sąrašą." - -msgid "Filter" -msgstr "Filtras" - -msgid "Choose all" -msgstr "Pasirinkti visus" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Spustelėkite, kad iš karto pasirinktumėte visus %s." - -msgid "Choose" -msgstr "Pasirinkti" - -msgid "Remove" -msgstr "Pašalinti" - -#, javascript-format -msgid "Chosen %s" -msgstr "Pasirinktas %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Tai yra sąrašas pasirinktų %s. Dėžutėje žemiau pažymėdami keletą iš jų ir " -"paspausdami „Pašalinti“ rodyklę tarp dviejų dėžučių jūs galite pašalinti " -"keletą iš jų." - -msgid "Remove all" -msgstr "Pašalinti visus" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Spustelėkite, kad iš karto pašalintumėte visus pasirinktus %s." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "pasirinktas %(sel)s iš %(cnt)s" -msgstr[1] "pasirinkti %(sel)s iš %(cnt)s" -msgstr[2] "pasirinkti %(sel)s iš %(cnt)s" -msgstr[3] "pasirinkti %(sel)s iš %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Turite neišsaugotų pakeitimų. Jeigu tęsite, Jūsų pakeitimai bus prarasti." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Pasirinkote veiksmą, bet dar neesate išsaugoję pakeitimų. Nuspauskite Gerai " -"norėdami išsaugoti. Jus reikės iš naujo paleisti veiksmą." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Pasirinkote veiksmą, bet neesate pakeitę laukų reikšmių. Jūs greičiausiai " -"ieškote mygtuko Vykdyti, o ne mygtuko Saugoti." - -msgid "Now" -msgstr "Dabar" - -msgid "Midnight" -msgstr "Vidurnaktis" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Vidurdienis" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"Pastaba: Jūsų laikrodis rodo %s valanda daugiau nei serverio laikrodis." -msgstr[1] "" -"Pastaba: Jūsų laikrodis rodo %s valandomis daugiau nei serverio laikrodis." -msgstr[2] "" -"Pastaba: Jūsų laikrodis rodo %s valandų daugiau nei serverio laikrodis." -msgstr[3] "" -"Pastaba: Jūsų laikrodis rodo %s valandų daugiau nei serverio laikrodis." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Pastaba: Jūsų laikrodis rodo %s valanda mažiau nei serverio laikrodis." -msgstr[1] "" -"Pastaba: Jūsų laikrodis rodo %s valandomis mažiau nei serverio laikrodis." -msgstr[2] "" -"Pastaba: Jūsų laikrodis rodo %s valandų mažiau nei serverio laikrodis." -msgstr[3] "" -"Pastaba: Jūsų laikrodis rodo %s valandų mažiau nei serverio laikrodis." - -msgid "Choose a Time" -msgstr "Pasirinkite laiką" - -msgid "Choose a time" -msgstr "Pasirinkite laiką" - -msgid "Cancel" -msgstr "Atšaukti" - -msgid "Today" -msgstr "Šiandien" - -msgid "Choose a Date" -msgstr "Pasirinkite datą" - -msgid "Yesterday" -msgstr "Vakar" - -msgid "Tomorrow" -msgstr "Rytoj" - -msgid "January" -msgstr "Sausis" - -msgid "February" -msgstr "Vasaris" - -msgid "March" -msgstr "Kovas" - -msgid "April" -msgstr "Balandis" - -msgid "May" -msgstr "Gegužė" - -msgid "June" -msgstr "Birželis" - -msgid "July" -msgstr "Liepa" - -msgid "August" -msgstr "Rugpjūtis" - -msgid "September" -msgstr "Rugsėjis" - -msgid "October" -msgstr "Spalis" - -msgid "November" -msgstr "Lapkritis" - -msgid "December" -msgstr "Gruodis" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "A" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "T" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "K" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Pn" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Š" - -msgid "Show" -msgstr "Parodyti" - -msgid "Hide" -msgstr "Slėpti" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index 7b3a4e3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index 4cd13c0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,797 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# edgars , 2011 -# Edgars Voroboks , 2023-2025 -# Edgars Voroboks , 2017,2022 -# Edgars Voroboks , 2018 -# Jannis Leidel , 2011 -# Māris Nartišs , 2016 -# Edgars Voroboks , 2019-2021 -# peterisb , 2016 -# Pēteris Caune, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Edgars Voroboks , 2023-2025\n" -"Language-Team: Latvian (http://app.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Izdzēst izvēlēto %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Veiksmīgi izdzēsti %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nevar izdzēst %(name)s" - -msgid "Delete multiple objects" -msgstr "Dzēst vairākus objektus" - -msgid "Administration" -msgstr "Administrācija" - -msgid "All" -msgstr "Visi" - -msgid "Yes" -msgstr "Jā" - -msgid "No" -msgstr "Nē" - -msgid "Unknown" -msgstr "Nezināms" - -msgid "Any date" -msgstr "Jebkurš datums" - -msgid "Today" -msgstr "Šodien" - -msgid "Past 7 days" -msgstr "Pēdējās 7 dienas" - -msgid "This month" -msgstr "Šomēnes" - -msgid "This year" -msgstr "Šogad" - -msgid "No date" -msgstr "Nav datums" - -msgid "Has date" -msgstr "Ir datums" - -msgid "Empty" -msgstr "Tukšs" - -msgid "Not empty" -msgstr "Nav tukšs" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Lūdzu ievadi korektu %(username)s un paroli personāla kontam. Ņem vērā, ka " -"abi ievades lauki ir reģistrjutīgi." - -msgid "Action:" -msgstr "Darbība:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Pievienot vēl %(verbose_name)s" - -msgid "Remove" -msgstr "Dzēst" - -msgid "Addition" -msgstr "Pievienošana" - -msgid "Change" -msgstr "Izmainīt" - -msgid "Deletion" -msgstr "Dzēšana" - -msgid "action time" -msgstr "darbības laiks" - -msgid "user" -msgstr "lietotājs" - -msgid "content type" -msgstr "satura tips" - -msgid "object id" -msgstr "objekta id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekta attēlojums" - -msgid "action flag" -msgstr "darbības atzīme" - -msgid "change message" -msgstr "izmaiņas teksts" - -msgid "log entry" -msgstr "žurnāla ieraksts" - -msgid "log entries" -msgstr "žurnāla ieraksti" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Pievienots “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Labots “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Dzēsts “%(object)s.”" - -msgid "LogEntry Object" -msgstr "LogEntry Objekts" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Pievienots {name} “{object}”." - -msgid "Added." -msgstr "Pievienots." - -msgid "and" -msgstr "un" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Mainīti {fields} priekš {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Mainīts {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Dzēsts {name} “{object}”." - -msgid "No fields changed." -msgstr "Neviens lauks nav mainīts." - -msgid "None" -msgstr "nekas" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Turiet nospiestu “Control”, vai “Command” uz Mac, lai iezīmētu vairāk par " -"vienu." - -msgid "Select this object for an action - {}" -msgstr "Atzīmējiet šo objektu darbībai - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” veiksmīgi pievienots." - -msgid "You may edit it again below." -msgstr "Jūs varat to atkal labot zemāk. " - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} “{obj}” veiksmīgi pievienots. Zemāk varat pievienot vēl {name}." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” tika veiksmīgi mainīts. Zemāk varat to labot vēlreiz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” tika veiksmīgi mainīts. Zemāk varat pievienot vēl {name}." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” tika veiksmīgi mainīts." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Vienumi ir jāatlasa, lai ar tiem veiktu darbības. Neviens vienums nav " -"mainīts." - -msgid "No action selected." -msgstr "Nav izvēlēta darbība." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” veiksmīgi dzēsts." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s ar ID “%(key)s” neeksistē. Varbūt tas ir dzēsts?" - -#, python-format -msgid "Add %s" -msgstr "Pievienot %s" - -#, python-format -msgid "Change %s" -msgstr "Labot %s" - -#, python-format -msgid "View %s" -msgstr "Apskatīt %s" - -msgid "Database error" -msgstr "Datubāzes kļūda" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s tika veiksmīgi mainīti." -msgstr[1] "%(count)s %(name)s tika veiksmīgi mainīts." -msgstr[2] "%(count)s %(name)s tika veiksmīgi mainīti." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s izvēlēti" -msgstr[1] "%(total_count)s izvēlēts" -msgstr[2] "%(total_count)s izvēlēti" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 no %(cnt)s izvēlēti" - -msgid "Delete" -msgstr "Dzēst" - -#, python-format -msgid "Change history: %s" -msgstr "Izmaiņu vēsture: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s dzēšanai ir nepieciešams izdzēst sekojošus " -"aizsargātus saistītos objektus: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administrācijas lapa" - -msgid "Django administration" -msgstr "Django administrācija" - -msgid "Site administration" -msgstr "Lapas administrācija" - -msgid "Log in" -msgstr "Pieslēgties" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administrācija" - -msgid "Page not found" -msgstr "Lapa nav atrasta" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Atvainojiet, pieprasītā lapa neeksistē." - -msgid "Home" -msgstr "Sākums" - -msgid "Server error" -msgstr "Servera kļūda" - -msgid "Server error (500)" -msgstr "Servera kļūda (500)" - -msgid "Server Error (500)" -msgstr "Servera kļūda (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Notika kļūda. Lapas administratoriem ir nosūtīts e-pasts un kļūda tuvākajā " -"laikā tiks novērsta. Paldies par pacietību." - -msgid "Run the selected action" -msgstr "Izpildīt izvēlēto darbību" - -msgid "Go" -msgstr "Aiziet!" - -msgid "Click here to select the objects across all pages" -msgstr "Spiest šeit, lai iezīmētu objektus no visām lapām" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Izvēlēties visus %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Atcelt iezīmēto" - -msgid "Breadcrumbs" -msgstr "Atpakaļceļi" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeļi %(name)s lietotnē" - -msgid "Model name" -msgstr "Modeļa nosaukums" - -msgid "Add link" -msgstr "Pievienot saiti" - -msgid "Change or view list link" -msgstr "Mainīt vai skatīt saraksta saiti" - -msgid "Add" -msgstr "Pievienot" - -msgid "View" -msgstr "Apskatīt" - -msgid "You don’t have permission to view or edit anything." -msgstr "Jums nav tiesību neko skatīt vai labot." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Kad būsiet izveidojis lietotāju, varēsiet rediģēt vairāk lietotāja " -"uzstādījumus." - -msgid "Error:" -msgstr "Kļūda:" - -msgid "Change password" -msgstr "Paroles maiņa" - -msgid "Set password" -msgstr "Iestatīt paroli" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Lūdzu, izlabojiet zemāk norādītās kļūdas." -msgstr[1] "Lūdzu, izlabojiet zemāk norādīto kļūdu." -msgstr[2] "Lūdzu, izlabojiet zemāk norādītās kļūdas." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Ievadiet jaunu paroli lietotājam %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Šī darbība šim lietotājam iespējos paroles bāzētu " -"autentifikāciju." - -msgid "Disable password-based authentication" -msgstr "Atspējot paroles bāzētu autentifikāciju" - -msgid "Enable password-based authentication" -msgstr "Iespējot paroles bāzētu autentifikāciju" - -msgid "Skip to main content" -msgstr "Pāriet uz galveno saturu" - -msgid "Welcome," -msgstr "Sveicināti," - -msgid "View site" -msgstr "Apskatīt lapu" - -msgid "Documentation" -msgstr "Dokumentācija" - -msgid "Log out" -msgstr "Atslēgties" - -#, python-format -msgid "Add %(name)s" -msgstr "Pievienot %(name)s" - -msgid "History" -msgstr "Vēsture" - -msgid "View on site" -msgstr "Apskatīt lapā" - -msgid "Filter" -msgstr "Filtrs" - -msgid "Hide counts" -msgstr "Slēpt skaitu" - -msgid "Show counts" -msgstr "Rādīt skaitu" - -msgid "Clear all filters" -msgstr "Notīrīt visus filtrus" - -msgid "Remove from sorting" -msgstr "Izņemt no kārtošanas" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Kārtošanas prioritāte: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Pārslēgt kārtošanu" - -msgid "Toggle theme (current theme: auto)" -msgstr "Pārslēgt motīvu (pašreizējais motīvs: automātisks)" - -msgid "Toggle theme (current theme: light)" -msgstr "Pārslēgt motīvu (pašreizējais motīvs: gaišs)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Pārslēgt motīvu (pašreizējais motīvs: tumšs)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Izdzēšot objektu %(object_name)s '%(escaped_object)s', tiks dzēsti visi " -"saistītie objekti, bet jums nav tiesību dzēst sekojošus objektu tipus:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' dzēšanai ir nepieciešams izdzēst " -"sekojošus aizsargātus saistītos objektus:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Vai esat pārliecināts, ka vēlaties dzēst %(object_name)s " -"\"%(escaped_object)s\"? Tiks dzēsti arī sekojoši saistītie objekti:" - -msgid "Objects" -msgstr "Objekti" - -msgid "Yes, I’m sure" -msgstr "Jā, esmu pārliecināts" - -msgid "No, take me back" -msgstr "Nē, ved mani atpakaļ" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Izdzēšot izvēlēto %(objects_name)s, tiks dzēsti visi saistītie objekti, bet " -"jums nav tiesību dzēst sekojošus objektu tipus:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Izvēlēto %(objects_name)s objektu dzēšanai ir nepieciešams izdzēst sekojošus " -"aizsargātus saistītos objektus:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Vai esat pārliecināts, ka vēlaties dzēst izvēlētos %(objects_name)s " -"objektus? Visi sekojošie objekti un tiem piesaistītie objekti tiks izdzēsti:" - -msgid "Delete?" -msgstr "Dzēst?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Pēc %(filter_title)s " - -msgid "Summary" -msgstr "Kopsavilkums" - -msgid "Recent actions" -msgstr "Nesenās darbības" - -msgid "My actions" -msgstr "Manas darbības" - -msgid "None available" -msgstr "Nav pieejams" - -msgid "Added:" -msgstr "Pievienots:" - -msgid "Changed:" -msgstr "Mainīts:" - -msgid "Deleted:" -msgstr "Izdzēsts:" - -msgid "Unknown content" -msgstr "Nezināms saturs" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Problēma ar datubāzes instalāciju. Pārliecinieties, ka attiecīgās tabulas ir " -"izveidotas un attiecīgajam lietotājam ir tiesības tai piekļūt." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Jūs esat autentificējies kā %(username)s, bet jums nav tiesību piekļūt šai " -"lapai. Vai vēlaties pieteikties citā kontā?" - -msgid "Forgotten your login credentials?" -msgstr "Aizmirsāt savus pieteikšanās datus?" - -msgid "Toggle navigation" -msgstr "Pārslēgt navigāciju" - -msgid "Sidebar" -msgstr "Sānjosla" - -msgid "Start typing to filter…" -msgstr "Sāciet rakstīt, lai atlasītu…" - -msgid "Filter navigation items" -msgstr "Atlasīt navigācijas vienības" - -msgid "Date/time" -msgstr "Datums/laiks" - -msgid "User" -msgstr "Lietotājs" - -msgid "Action" -msgstr "Darbība" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "ieraksti" -msgstr[1] "ieraksts" -msgstr[2] "ieraksti" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Objektam nav izmaiņu vēstures. Tas visdrīzāk netika pievienots, izmantojot " -"šo administrācijas rīku." - -msgid "Show all" -msgstr "Rādīt visu" - -msgid "Save" -msgstr "Saglabāt" - -msgid "Popup closing…" -msgstr "Logs aizveras..." - -msgid "Search" -msgstr "Meklēt" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s rezultāti" -msgstr[1] "%(counter)s rezultāts" -msgstr[2] "%(counter)s rezultāti" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "kopā - %(full_result_count)s" - -msgid "Save as new" -msgstr "Saglabāt kā jaunu" - -msgid "Save and add another" -msgstr "Saglabāt un pievienot vēl vienu" - -msgid "Save and continue editing" -msgstr "Saglabāt un turpināt labošanu" - -msgid "Save and view" -msgstr "Saglabāt un apskatīt" - -msgid "Close" -msgstr "Aizvērt" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Mainīt izvēlēto %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Pievienot citu %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Dzēst izvēlēto %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Apskatīt atzīmētos %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Paldies, ka šodien vietnei veltījāt kvalitatīvu laiku." - -msgid "Log in again" -msgstr "Pieslēgties vēlreiz" - -msgid "Password change" -msgstr "Paroles maiņa" - -msgid "Your password was changed." -msgstr "Jūsu parole tika nomainīta." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Drošības nolūkos ievadiet veco paroli un pēc tam divreiz jauno paroli, lai " -"mēs varētu pārbaudīt, ka tā ir ievadīta pareizi." - -msgid "Change my password" -msgstr "Nomainīt manu paroli" - -msgid "Password reset" -msgstr "Paroles atiestatīšana" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Jūsu parole ir iestatīta. Varat pieslēgties." - -msgid "Password reset confirmation" -msgstr "Paroles atiestatīšanas apstiprinājums" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Lūdzu ievadiet jauno paroli divreiz, lai varētu pārbaudīt, ka tā ir " -"uzrakstīta pareizi." - -msgid "New password:" -msgstr "Jaunā parole:" - -msgid "Confirm password:" -msgstr "Apstiprināt paroli:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Paroles atiestatīšanas saite bija nekorekta, iespējams, tā jau ir izmantota. " -"Lūdzu pieprasiet paroles pārstatīšanu vēlreiz." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Ja sistēmā ir konts ar jūsu e-pasta adresi, tad mēs jums tikko nosūtījām e-" -"pasta ziņojumu ar paroles iestatīšanas instrukciju. Jums to tūlīt vajadzētu " -"saņemt." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ja nesaņemat e-pastu, lūdzu, pārliecinieties, vai esat ievadījis reģistrētu " -"adresi un pārbaudiet savu mēstuļu mapi." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Jūs saņemat šo e-pasta ziņojumu, jo pieprasījāt atiestatīt lietotāja konta " -"paroli vietnē %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Lūdzu apmeklējiet sekojošo lapu un ievadiet jaunu paroli:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Ja aizmirsāt, jūs esat:" - -msgid "Thanks for using our site!" -msgstr "Paldies par mūsu lapas lietošanu!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s komanda" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Aizmirsāt savu paroli? Ievadiet jūsu e-pasta adresi un jums tiks nosūtīta " -"instrukcija, kā iestatīt jaunu paroli." - -msgid "Email address:" -msgstr "E-pasta adrese:" - -msgid "Reset my password" -msgstr "Paroles atiestatīšana" - -msgid "Select all objects on this page for an action" -msgstr "Atlasiet visus šīs lapas objektus darbībai" - -msgid "All dates" -msgstr "Visi datumi" - -#, python-format -msgid "Select %s" -msgstr "Izvēlēties %s" - -#, python-format -msgid "Select %s to change" -msgstr "Izvēlēties %s, lai izmainītu" - -#, python-format -msgid "Select %s to view" -msgstr "Izvēlēties %s, lai apskatītu" - -msgid "Date:" -msgstr "Datums:" - -msgid "Time:" -msgstr "Laiks:" - -msgid "Lookup" -msgstr "Pārlūkot" - -msgid "Currently:" -msgstr "Valūta:" - -msgid "Change:" -msgstr "Izmaiņa:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 16a5b3b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po deleted file mode 100644 index 3c6fd0c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,321 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Edgars Voroboks , 2023,2025 -# Edgars Voroboks , 2017,2022 -# Jannis Leidel , 2011 -# Edgars Voroboks , 2020-2021 -# peterisb , 2016 -# Pēteris Caune, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Edgars Voroboks , 2023,2025\n" -"Language-Team: Latvian (http://app.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Pieejams %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Izvēlēties %s tos atzīmējot un tad izvēloties \"Izvēlēties\" bultiņas pogu." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Raksti šajā logā, lai filtrētu zemāk esošo sarakstu ar pieejamajiem %s." - -msgid "Filter" -msgstr "Filtrs" - -#, javascript-format -msgid "Choose all %s" -msgstr "Izvēlēties visus %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Izvēlieties atzīmētos %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Noņemt atzīmētos %s" - -#, javascript-format -msgid "Chosen %s" -msgstr "Izvēlies %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "Noņemt %s tos atzīmējot un tad izvēloties \"Noņemt\" bultiņas pogu." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Rakstiet šajā laukā, lai filtrētu atlasīto %s sarakstu." - -msgid "(click to clear)" -msgstr "(klikšķiniet, lai notīrītu)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Noņemt visu %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s atlasītās opcijas nav redzamas" -msgstr[1] "%s atlasītā opcija nav redzama" -msgstr[2] "%s atlasītās opcijas nav redzamas" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s no %(cnt)s izvēlēts" -msgstr[1] "%(sel)s no %(cnt)s izvēlēti" -msgstr[2] "%(sel)s no %(cnt)s izvēlēti" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Jūs neesat saglabājis izmaiņas rediģējamiem laukiem. Ja jūs tagad " -"izpildīsiet izvēlēto darbību, šīs izmaiņas netiks saglabātas." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Jūs esiet izvēlējies veikt darbību, bet neesiet saglabājis veiktās izmaiņas. " -"Lūdzu nospiediet OK, lai saglabātu. Šo darbību jums nāksies izpildīt vēlreiz." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Jūs esiet izvēlējies veikt darbību un neesiet mainījis nevienu lauku. Jūs " -"droši vien meklējiet pogu 'Aiziet' nevis 'Saglabāt'." - -msgid "Now" -msgstr "Tagad" - -msgid "Midnight" -msgstr "Pusnakts" - -msgid "6 a.m." -msgstr "06.00" - -msgid "Noon" -msgstr "Pusdienas laiks" - -msgid "6 p.m." -msgstr "6:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Piezīme: Tavs laiks ir %s stundas pirms servera laika." -msgstr[1] "Piezīme: Tavs laiks ir %s stundu pirms servera laika." -msgstr[2] "Piezīme: Tavs laiks ir %s stundas pirms servera laika." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Piezīme: Tavs laiks ir %s stundas pēc servera laika." -msgstr[1] "Piezīme: Tavs laiks ir %s stundu pēc servera laika." -msgstr[2] "Piezīme: Tavs laiks ir %s stundas pēc servera laika." - -msgid "Choose a Time" -msgstr "Izvēlies laiku" - -msgid "Choose a time" -msgstr "Izvēlieties laiku" - -msgid "Cancel" -msgstr "Atcelt" - -msgid "Today" -msgstr "Šodien" - -msgid "Choose a Date" -msgstr "Izvēlies datumu" - -msgid "Yesterday" -msgstr "Vakar" - -msgid "Tomorrow" -msgstr "Rīt" - -msgid "January" -msgstr "janvāris" - -msgid "February" -msgstr "februāris" - -msgid "March" -msgstr "marts" - -msgid "April" -msgstr "aprīlis" - -msgid "May" -msgstr "maijs" - -msgid "June" -msgstr "jūnijs" - -msgid "July" -msgstr "jūlijs" - -msgid "August" -msgstr "augusts" - -msgid "September" -msgstr "septembris" - -msgid "October" -msgstr "oktobris" - -msgid "November" -msgstr "novembris" - -msgid "December" -msgstr "decembris" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jūn" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jūl" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec" - -msgid "Sunday" -msgstr "Svētdiena" - -msgid "Monday" -msgstr "Pirmdiena" - -msgid "Tuesday" -msgstr "Otrdiena" - -msgid "Wednesday" -msgstr "Trešdiena" - -msgid "Thursday" -msgstr "Ceturtdiena" - -msgid "Friday" -msgstr "Piektdiena" - -msgid "Saturday" -msgstr "Sestdiena" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Sv" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pr" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Ot" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Tr" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Ce" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pi" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Se" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Sv" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Pr" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "O" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "T" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "C" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Pk" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Se" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index 9f4d6e4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index 676173c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,726 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dimce Grozdanoski , 2021 -# dekomote , 2015 -# Jannis Leidel , 2011 -# Martino Nikolovski, 2022 -# Vasil Vangelovski , 2016-2017,2019,2021 -# Vasil Vangelovski , 2013-2015 -# Vasil Vangelovski , 2011-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-05-25 07:05+0000\n" -"Last-Translator: Martino Nikolovski, 2022\n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Избриши ги избраните %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Успешно беа избришани %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Не може да се избрише %(name)s" - -msgid "Are you sure?" -msgstr "Сигурни сте?" - -msgid "Administration" -msgstr "Администрација" - -msgid "All" -msgstr "Сите" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -msgid "Unknown" -msgstr "Непознато" - -msgid "Any date" -msgstr "Било кој датум" - -msgid "Today" -msgstr "Денеска" - -msgid "Past 7 days" -msgstr "Последните 7 дена" - -msgid "This month" -msgstr "Овој месец" - -msgid "This year" -msgstr "Оваа година" - -msgid "No date" -msgstr "Нема датум" - -msgid "Has date" -msgstr "Има датум" - -msgid "Empty" -msgstr "Празно" - -msgid "Not empty" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Ве молиме внесете ги точните %(username)s и лозинка за член на сајтот. " -"Внимавајте, двете полиња се осетливи на големи и мали букви." - -msgid "Action:" -msgstr "Акција:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Додади уште %(verbose_name)s" - -msgid "Remove" -msgstr "Отстрани" - -msgid "Addition" -msgstr "Додавање" - -msgid "Change" -msgstr "Измени" - -msgid "Deletion" -msgstr "Бришење" - -msgid "action time" -msgstr "време на акција" - -msgid "user" -msgstr "корисник" - -msgid "content type" -msgstr "тип на содржина" - -msgid "object id" -msgstr "идентификационен број на објект" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "репрезентација на објект" - -msgid "action flag" -msgstr "знакче за акција" - -msgid "change message" -msgstr "измени ја пораката" - -msgid "log entry" -msgstr "ставка во записникот" - -msgid "log entries" -msgstr "ставки во записникот" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Додадено “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Избришано “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Запис во дневник" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "Додадено." - -msgid "and" -msgstr "и" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Изменети {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Избришан {name} “{object}”." - -msgid "No fields changed." -msgstr "Не е изменето ниедно поле." - -msgid "None" -msgstr "Ништо" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Држете “Control” или “Command” на Mac за да изберете повеќе." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Успешно беше додадено {name} “{obj}”." - -msgid "You may edit it again below." -msgstr "Можете повторно да го промените подолу." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Мора да се одберат предмети за да се изврши акција врз нив. Ниеден предмет " -"не беше променет." - -msgid "No action selected." -msgstr "Ниедна акција не е одбрана." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Додади %s" - -#, python-format -msgid "Change %s" -msgstr "Измени %s" - -#, python-format -msgid "View %s" -msgstr "Погледни %s" - -msgid "Database error" -msgstr "Грешка во базата на податоци" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s ставка %(name)s беше успешно изменета." -msgstr[1] "%(count)s ставки %(name)s беа успешно изменети." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s одбран" -msgstr[1] "Сите %(total_count)s одбрани" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 од %(cnt)s избрани" - -#, python-format -msgid "Change history: %s" -msgstr "Историја на измени: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Бришењето на %(class_name)s %(instance)s бара бришење на следните заштитени " -"поврзани објекти: %(related_objects)s" - -msgid "Django site admin" -msgstr "Администрација на Џанго сајт" - -msgid "Django administration" -msgstr "Џанго администрација" - -msgid "Site administration" -msgstr "Администрација на сајт" - -msgid "Log in" -msgstr "Најава" - -#, python-format -msgid "%(app)s administration" -msgstr "Администрација на %(app)s" - -msgid "Page not found" -msgstr "Страницата не е најдена" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Се извинуваме, страница која ја побаравте не е пронајдена" - -msgid "Home" -msgstr "Дома" - -msgid "Server error" -msgstr "Грешка со серверот" - -msgid "Server error (500)" -msgstr "Грешка со серверот (500)" - -msgid "Server Error (500)" -msgstr "Грешка со серверот (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Наидовте на грешка. Известени се администраторите на страницата преку имејл " -"и би требало наскоро да биде поправена. Ви благодариме на трпението." - -msgid "Run the selected action" -msgstr "Изврши ја избраната акција" - -msgid "Go" -msgstr "Оди" - -msgid "Click here to select the objects across all pages" -msgstr "Кликнете тука за да изберете објекти низ сите страници" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Избери ги сите %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Откажи го изборот" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели во %(name)s апликација" - -msgid "Add" -msgstr "Додади" - -msgid "View" -msgstr "Погледни" - -msgid "You don’t have permission to view or edit anything." -msgstr "Немате дозвола да прегледате или промените ништо" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Прво внесете корисничко име и лозинка па потоа ќе можете да уредувате повеќе " -"опции за корисникот" - -msgid "Enter a username and password." -msgstr "Внесете корисничко име и лозинка." - -msgid "Change password" -msgstr "Промени лозинка" - -msgid "Please correct the error below." -msgstr "Ве молиме поправете ја грешката подолу." - -msgid "Please correct the errors below." -msgstr "Ве молам поправете ги грешките подолу." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Внесете нова лозинка за корисникот %(username)s." - -msgid "Welcome," -msgstr "Добредојдовте," - -msgid "View site" -msgstr "Посети го сајтот" - -msgid "Documentation" -msgstr "Документација" - -msgid "Log out" -msgstr "Одјава" - -#, python-format -msgid "Add %(name)s" -msgstr "Додади %(name)s" - -msgid "History" -msgstr "Историја" - -msgid "View on site" -msgstr "Погледни на сајтот" - -msgid "Filter" -msgstr "Филтер" - -msgid "Clear all filters" -msgstr "Ресетирај ги сите филтри" - -msgid "Remove from sorting" -msgstr "Отстрани од сортирање" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Приоритет на сортирање: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Вклучи/исклучи сортирање" - -msgid "Delete" -msgstr "Избриши" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на " -"поврзаните објекти, но со вашата сметка немате доволно привилегии да ги " -"бришете следните типови на објекти:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на " -"следниве заштитени објекти:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Сигурне сте дека сакате да ги бришете %(object_name)s „%(escaped_object)s“? " -"Сите овие ставки ќе бидат избришани:" - -msgid "Objects" -msgstr "Предмети" - -msgid "Yes, I’m sure" -msgstr "Да, сигурен сум" - -msgid "No, take me back" -msgstr "Не, врати ме назад" - -msgid "Delete multiple objects" -msgstr "Избриши повеќе ставки" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Бришење на избраните %(objects_name)s ќе резултира со бришење на поврзани " -"објекти, но немате одобрување да ги избришете следниве типови објекти:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Бришење на избраните %(objects_name)s бара бришење на следните поврзани " -"објекти кои се заштитени:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Дали сте сигурни дека сакате да го избришете избраниот %(objects_name)s? " -"Сите овие објекти и оние поврзани со нив ќе бидат избришани:" - -msgid "Delete?" -msgstr "Избриши?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Според %(filter_title)s " - -msgid "Summary" -msgstr "Резиме" - -msgid "Recent actions" -msgstr "Последни акции" - -msgid "My actions" -msgstr "Мои акции" - -msgid "None available" -msgstr "Ништо не е достапно" - -msgid "Unknown content" -msgstr "Непозната содржина" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Нешто не е во ред со инсталацијата на базата на податоци. Уверете се дека " -"соодветните табели се создадени, и дека базата на податоци е пристапна до " -"соодветниот корисник." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Најавени сте како %(username)s, но не сте авторизирани да пристапите до " -"оваа страна. Сакате ли да се најавите како друг корисник?" - -msgid "Forgotten your password or username?" -msgstr "Ја заборавивте вашата лозинка или корисничко име?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "Започнете со пишување за да филтрирате..." - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Датум/час" - -msgid "User" -msgstr "Корисник" - -msgid "Action" -msgstr "Акција" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Прикажи ги сите" - -msgid "Save" -msgstr "Сними" - -msgid "Popup closing…" -msgstr "Попапот се затвара..." - -msgid "Search" -msgstr "Барај" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s резултат" -msgstr[1] "%(counter)s резултати" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "вкупно %(full_result_count)s" - -msgid "Save as new" -msgstr "Сними како нова" - -msgid "Save and add another" -msgstr "Сними и додади уште" - -msgid "Save and continue editing" -msgstr "Сними и продолжи со уредување" - -msgid "Save and view" -msgstr "Сними и прегледај" - -msgid "Close" -msgstr "Затвори" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Промени ги избраните %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Додади уште %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Избриши ги избраните %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Најавете се повторно" - -msgid "Password change" -msgstr "Измена на лозинка" - -msgid "Your password was changed." -msgstr "Вашата лозинка беше сменета." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "Промени ја мојата лозинка" - -msgid "Password reset" -msgstr "Ресетирање на лозинка" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Вашата лозинка беше поставена. Сега можете да се најавите." - -msgid "Password reset confirmation" -msgstr "Одобрување за ресетирање на лозинка" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Ве молам внесете ја вашата нова лозинка двапати за да може да бидете сигурни " -"дека правилно сте ја внеле." - -msgid "New password:" -msgstr "Нова лозинка:" - -msgid "Confirm password:" -msgstr "Потврди лозинка:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Врската за ресетирање на лозинката беше невалидна, најверојатно бидејќи веќе " -"била искористена. Ве молам повторно побарајте ресетирање на вашата лозинката." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Го примате овој email бидејќи побаравте ресетирање на лозинка како корисник " -"на %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Ве молам одете на следната страница и внесете нова лозинка:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Вашето корисничко име, во случај да сте заборавиле:" - -msgid "Thanks for using our site!" -msgstr "Ви благодариме што го користите овој сајт!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Тимот на %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Ја заборавивте вашата лозинка? Внесете го вашиот имејл и ќе ви пратиме " -"инструкции да подесите нова лозинка. " - -msgid "Email address:" -msgstr "Email адреса:" - -msgid "Reset my password" -msgstr "Ресетирај ја мојата лозинка" - -msgid "All dates" -msgstr "Сите датуми" - -#, python-format -msgid "Select %s" -msgstr "Изберете %s" - -#, python-format -msgid "Select %s to change" -msgstr "Изберете %s за измена" - -#, python-format -msgid "Select %s to view" -msgstr "Изберете %s за прегледување" - -msgid "Date:" -msgstr "Датум:" - -msgid "Time:" -msgstr "Време:" - -msgid "Lookup" -msgstr "Побарај" - -msgid "Currently:" -msgstr "Моментално:" - -msgid "Change:" -msgstr "Измени:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c87ddf6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po deleted file mode 100644 index bd72010..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,262 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vasil Vangelovski , 2016 -# Vasil Vangelovski , 2014 -# Vasil Vangelovski , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-15 11:28+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Достапно %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ова е листа на достапни %s. Можете да изберете неколку кликајќи на нив во " -"полето подолу и со кликање на стрелката \"Одбери\" помеѓу двете полиња." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Пишувајте во ова поле за да ја филтрирате листата на достапни %s." - -msgid "Filter" -msgstr "Филтер" - -msgid "Choose all" -msgstr "Одбери ги сите ги сите" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Кликнете за да ги одберете сите %s од еднаш." - -msgid "Choose" -msgstr "Одбери" - -msgid "Remove" -msgstr "Отстрани" - -#, javascript-format -msgid "Chosen %s" -msgstr "Одбрано %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ова е листа на избрани %s. Можете да отстраните неколку кликајќи на нив во " -"полето подолу и со кликање на стрелката \"Отстрани\" помеѓу двете полиња." - -msgid "Remove all" -msgstr "Отстрани ги сите" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Кликнете за да ги отстраните сите одбрани %s одеднаш." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "избрано %(sel)s од %(cnt)s" -msgstr[1] "одбрани %(sel)s од %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Имате незачувани промени на поединечни полиња. Ако извршите акција вашите " -"незачувани промени ќе бидат изгубени." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Сега" - -msgid "Midnight" -msgstr "Полноќ" - -msgid "6 a.m." -msgstr "6 наутро" - -msgid "Noon" -msgstr "Пладне" - -msgid "6 p.m." -msgstr "6 попладне" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Забелешка: Вие сте %s час понапред од времето на серверот." -msgstr[1] "Забелешка: Вие сте %s часа понапред од времето на серверот." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Забелешка: Вие сте %s час поназад од времето на серверот." -msgstr[1] "Забелешка: Вие сте %s часа поназад од времето на серверот." - -msgid "Choose a Time" -msgstr "Одбери време" - -msgid "Choose a time" -msgstr "Одбери време" - -msgid "Cancel" -msgstr "Откажи" - -msgid "Today" -msgstr "Денеска" - -msgid "Choose a Date" -msgstr "Одбери датум" - -msgid "Yesterday" -msgstr "Вчера" - -msgid "Tomorrow" -msgstr "Утре" - -msgid "January" -msgstr "Јануари" - -msgid "February" -msgstr "Февруари" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Април" - -msgid "May" -msgstr "Мај" - -msgid "June" -msgstr "Јуни" - -msgid "July" -msgstr "Јули" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Септември" - -msgid "October" -msgstr "Октомври" - -msgid "November" -msgstr "Ноември" - -msgid "December" -msgstr "Декември" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "В" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" - -msgid "Show" -msgstr "Прикажи" - -msgid "Hide" -msgstr "Сокриј" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index f75d3d6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index d96aab9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,700 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aby Thomas , 2014 -# Hrishikesh , 2019-2020 -# Jannis Leidel , 2011 -# JOMON THOMAS LOBO , 2019 -# Junaid , 2012 -# MUHAMMED RAMEEZ , 2019 -# Rajeesh Nair , 2011-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-14 19:53+0200\n" -"PO-Revision-Date: 2020-07-14 22:38+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)sവിജയകയരമായി നീക്കം ചെയ്തു." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s നീക്കം ചെയ്യാന്‍ കഴിയില്ല." - -msgid "Are you sure?" -msgstr "തീര്‍ച്ചയാണോ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "തെരഞ്ഞെടുത്ത %(verbose_name_plural)s നീക്കം ചെയ്യുക." - -msgid "Administration" -msgstr "കാര്യനിർവഹണം" - -msgid "All" -msgstr "മുഴുവനും" - -msgid "Yes" -msgstr "അതെ" - -msgid "No" -msgstr "അല്ല" - -msgid "Unknown" -msgstr "അറിയില്ല" - -msgid "Any date" -msgstr "ഏതെങ്കിലും തീയ്യതി" - -msgid "Today" -msgstr "ഇന്ന്" - -msgid "Past 7 days" -msgstr "കഴിഞ്ഞ 7 ദിവസങ്ങൾ" - -msgid "This month" -msgstr "ഈ മാസം" - -msgid "This year" -msgstr "ഈ വര്‍ഷം" - -msgid "No date" -msgstr "തിയ്യതിയില്ല " - -msgid "Has date" -msgstr "തിയ്യതിയുണ്ട്" - -msgid "Empty" -msgstr "കാലി" - -msgid "Not empty" -msgstr "കാലിയല്ല" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"ദയവായി സ്റ്റാഫ് അക്കൗണ്ടിനുവേണ്ടിയുള്ള ശരിയായ %(username)s പാസ്‌വേഡ് എന്നിവ നൽകുക. രണ്ടു " -"കള്ളികളിലും അക്ഷരങ്ങള്‍ വലിയക്ഷരമോ ചെറിയക്ഷരമോ എന്നത് പ്രധാനമാണെന്നത് ശ്രദ്ധിയ്ക്കുക." - -msgid "Action:" -msgstr "ആക്ഷന്‍" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "മറ്റൊരു %(verbose_name)s കൂടി ചേര്‍ക്കുക" - -msgid "Remove" -msgstr "കളയുക" - -msgid "Addition" -msgstr "ചേർക്കുക" - -msgid "Change" -msgstr "മാറ്റുക" - -msgid "Deletion" -msgstr "കളയുക" - -msgid "action time" -msgstr "നടന്ന സമയം" - -msgid "user" -msgstr "ഉപയോക്താവ്" - -msgid "content type" -msgstr "കണ്ടന്റ് ടൈപ്പ്" - -msgid "object id" -msgstr "ഒബ്ജക്റ്റിന്റെ ഐഡി" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ഒബ്ജെക്ട് റെപ്രസന്റേഷൻ" - -msgid "action flag" -msgstr "ആക്ഷന്‍ ഫ്ളാഗ്" - -msgid "change message" -msgstr "സന്ദേശം മാറ്റുക" - -msgid "log entry" -msgstr "ലോഗ് എൻട്രി" - -msgid "log entries" -msgstr "ലോഗ് എൻട്രികള്‍" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” ചേർത്തു." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” മാറ്റം വരുത്തി — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "ലോഗ്‌എന്‍ട്രി ഒബ്ജെക്റ്റ്" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "ചേര്‍ത്തു." - -msgid "and" -msgstr "കൂടാതെ" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "ഒരു മാറ്റവുമില്ല." - -msgid "None" -msgstr "ഒന്നുമില്ല" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "താഴെ നിങ്ങൾക്കിത് വീണ്ടും എഡിറ്റുചെയ്യാം" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "ആക്ഷന്‍ നടപ്പിലാക്കേണ്ട വകകള്‍ തെരഞ്ഞെടുക്കണം. ഒന്നിലും മാറ്റങ്ങൾ വരുത്തിയിട്ടില്ല." - -msgid "No action selected." -msgstr "ആക്ഷനൊന്നും തെരഞ്ഞെടുത്തിട്ടില്ല." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s ചേര്‍ക്കുക" - -#, python-format -msgid "Change %s" -msgstr "%s മാറ്റാം" - -#, python-format -msgid "View %s" -msgstr "%s കാണുക" - -msgid "Database error" -msgstr "ഡേറ്റാബേസ് എറർ." - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ല്‍ മാറ്റം വരുത്തി." -msgstr[1] "%(count)s %(name)s വിജയകരമായി മാറ്റി" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s തെരഞ്ഞെടുത്തു." -msgstr[1] "%(total_count)sമൊത്തമായി തെരഞ്ഞെടുത്തു." - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s ല്‍ 0 തിരഞ്ഞെടുത്തിരിക്കുന്നു" - -#, python-format -msgid "Change history: %s" -msgstr "%s ലെ മാറ്റങ്ങള്‍." - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -" %(class_name)s %(instance)s നീക്കം ചെയ്യണമെങ്കിൽ അതിനോട് ബന്ധപ്പെട്ടതായ താഴെപ്പറയുന്ന " -"എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്: %(related_objects)s" - -msgid "Django site admin" -msgstr "ജാംഗോ സൈറ്റ് അഡ്മിന്‍" - -msgid "Django administration" -msgstr "ജാംഗോ കാര്യനിർവഹണം" - -msgid "Site administration" -msgstr "സൈറ്റ് കാര്യനിർവഹണം" - -msgid "Log in" -msgstr "ലോഗിൻ" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s കാര്യനിർവഹണം" - -msgid "Page not found" -msgstr "പേജ് കണ്ടെത്താനായില്ല" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "ക്ഷമിക്കണം, ആവശ്യപ്പെട്ട പേജ് കണ്ടെത്താന്‍ കഴിഞ്ഞില്ല." - -msgid "Home" -msgstr "പൂമുഖം" - -msgid "Server error" -msgstr "സെര്‍വറിൽ എന്തോ പ്രശ്നം" - -msgid "Server error (500)" -msgstr "സെര്‍വറിൽ എന്തോ പ്രശ്നം (500)" - -msgid "Server Error (500)" -msgstr "സെര്‍വറിൽ എന്തോ പ്രശ്നം (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "തെരഞ്ഞെടുത്ത ആക്ഷന്‍ നടപ്പിലാക്കുക" - -msgid "Go" -msgstr "തുടരുക" - -msgid "Click here to select the objects across all pages" -msgstr "എല്ലാ പേജിലേയും ഒബ്ജക്റ്റുകൾ തെരഞ്ഞെടുക്കാന്‍ ഇവിടെ ക്ലിക് ചെയ്യുക." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "മുഴുവന്‍ %(total_count)s %(module_name)s ഉം തെരഞ്ഞെടുക്കുക" - -msgid "Clear selection" -msgstr "തെരഞ്ഞെടുത്തത് റദ്ദാക്കുക." - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s മാതൃകയിലുള്ള" - -msgid "Add" -msgstr "ചേര്‍ക്കുക" - -msgid "View" -msgstr "കാണുക" - -msgid "You don’t have permission to view or edit anything." -msgstr "നിങ്ങൾക്ക് ഒന്നും കാണാനോ തിരുത്താനോ ഉള്ള അനുമതിയില്ല." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"ആദ്യമായി ഒരു യൂസർനെയിമും പാസ്‌‌വേഡും നൽകുക. തുടർന്ന്, നിങ്ങൾക്ക് കൂടുതൽ കാര്യങ്ങളിൽ മാറ്റം " -"വരുത്താവുന്നതാണ്" - -msgid "Enter a username and password." -msgstr "Enter a username and password." - -msgid "Change password" -msgstr "പാസ് വേര്‍ഡ് മാറ്റുക." - -msgid "Please correct the error below." -msgstr "താഴെ പറയുന്ന തെറ്റുകൾ തിരുത്തുക " - -msgid "Please correct the errors below." -msgstr "ദയവായി താഴെയുള്ള തെറ്റുകള്‍ പരിഹരിക്കുക." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s ന് പുതിയ പാസ് വേര്‍ഡ് നല്കുക." - -msgid "Welcome," -msgstr "സ്വാഗതം, " - -msgid "View site" -msgstr "സൈറ്റ് കാണുക " - -msgid "Documentation" -msgstr "സഹായക്കുറിപ്പുകള്‍" - -msgid "Log out" -msgstr "പുറത്ത് കടക്കുക." - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ചേര്‍ക്കുക" - -msgid "History" -msgstr "ചരിത്രം" - -msgid "View on site" -msgstr "View on site" - -msgid "Filter" -msgstr "അരിപ്പ" - -msgid "Clear all filters" -msgstr "എല്ലാ ഫിൽറ്ററുകളും ഒഴിവാക്കുക" - -msgid "Remove from sorting" -msgstr "ക്രമീകരണത്തില്‍ നിന്നും ഒഴിവാക്കുക" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "ക്രമീകരണത്തിനുള്ള മുന്‍ഗണന: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "ക്രമീകരണം വിപരീത ദിശയിലാക്കുക." - -msgid "Delete" -msgstr "നീക്കം ചെയ്യുക" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s ഡിലീറ്റ് ചെയ്യുമ്പോള്‍ അതുമായി ബന്ധമുള്ള " -"വസ്തുക്കളുംഡിലീറ്റ് ആവും. പക്ഷേ നിങ്ങള്‍ക്ക് താഴെ പറഞ്ഞ തരം വസ്തുക്കള്‍ ഡിലീറ്റ് ചെയ്യാനുള്ള അനുമതി " -"ഇല്ല:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"തിരഞ്ഞെടുക്കപ്പെട്ട %(object_name)s '%(escaped_object)s' നീക്കം ചെയ്യണമെങ്കിൽ അതിനോട് " -"ബന്ധപ്പെട്ടതായ താഴെപ്പറയുന്ന എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" നീക്കം ചെയ്യണമെന്ന് ഉറപ്പാണോ?അതുമായി ബന്ധമുള്ള " -"താഴെപ്പറയുന്ന വസ്തുക്കളെല്ലാം നീക്കം ചെയ്യുന്നതാണ്:" - -msgid "Objects" -msgstr "വസ്തുക്കൾ" - -msgid "Yes, I’m sure" -msgstr "അതെ, എനിക്കുറപ്പാണ്" - -msgid "No, take me back" -msgstr "ഇല്ല, എന്നെ തിരിച്ചെടുക്കൂ" - -msgid "Delete multiple objects" -msgstr "ഒന്നിലേറെ വസ്തുക്കള്‍ നീക്കം ചെയ്യുക" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"തിരഞ്ഞെടുക്കപ്പെട്ട %(objects_name)s നീക്കം ചെയ്താൽ അതിനോട് ബന്ധപ്പെട്ടതായ താഴെപ്പറയുന്ന " -"എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്, പക്ഷെ അതിനുളള അവകാശം അക്കൗണ്ടിനില്ല:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"തിരഞ്ഞെടുക്കപ്പെട്ട %(objects_name)s നീക്കം ചെയ്യണമെങ്കിൽ അതിനോട് ബന്ധപ്പെട്ടതായ " -"താഴെപ്പറയുന്ന എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"തിരഞ്ഞെടുക്കപ്പെട്ട %(objects_name)s നീക്കം ചെയ്യണമെന്നു ഉറപ്പാണോ ? തിരഞ്ഞെടുക്കപ്പെട്ടതും " -"അതിനോട് ബന്ധപ്പെട്ടതും ആയ എല്ലാ താഴെപ്പറയുന്ന വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്:" - -msgid "Delete?" -msgstr "ഡിലീറ്റ് ചെയ്യട്ടെ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s ആൽ" - -msgid "Summary" -msgstr "ചുരുക്കം" - -msgid "Recent actions" -msgstr "സമീപകാല പ്രവൃത്തികൾ" - -msgid "My actions" -msgstr "എന്റെ പ്രവർത്തനം" - -msgid "None available" -msgstr "ഒന്നും ലഭ്യമല്ല" - -msgid "Unknown content" -msgstr "ഉള്ളടക്കം അറിയില്ല." - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കുന്ന %(username)s, നു ഈ പേജ് കാണാൻ അനുവാദം ഇല്ല . താങ്കൾ " -"മറ്റൊരു അക്കൗണ്ടിൽ ലോഗിൻ ചെയ്യാന് ആഗ്രഹിക്കുന്നുവോ ?" - -msgid "Forgotten your password or username?" -msgstr "രഹസ്യവാക്കോ ഉപയോക്തൃനാമമോ മറന്നുപോയോ?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Date/time" -msgstr "തീയതി/സമയം" - -msgid "User" -msgstr "ഉപയോക്താവ്" - -msgid "Action" -msgstr "പ്രവർത്തി" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "എല്ലാം കാണട്ടെ" - -msgid "Save" -msgstr "സേവ് ചെയ്യണം" - -msgid "Popup closing…" -msgstr "പോപ്പ് അപ്പ് അടക്കുക " - -msgid "Search" -msgstr "പരതുക" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s results" -msgstr[1] "%(counter)s ഫലം" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "ആകെ %(full_result_count)s" - -msgid "Save as new" -msgstr "പുതിയതായി സേവ് ചെയ്യണം" - -msgid "Save and add another" -msgstr "സേവ് ചെയ്ത ശേഷം വേറെ ചേര്‍ക്കണം" - -msgid "Save and continue editing" -msgstr "സേവ് ചെയ്ത ശേഷം മാറ്റം വരുത്താം" - -msgid "Save and view" -msgstr "സേവ് ചെയ്‌തതിന്‌ ശേഷം കാണുക " - -msgid "Close" -msgstr "അടയ്ക്കുക" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "തിരഞ്ഞെടുത്തത് ഇല്ലാതാക്കുക%(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ഈ വെബ് സൈറ്റില്‍ കുറെ നല്ല സമയം ചെലവഴിച്ചതിനു നന്ദി." - -msgid "Log in again" -msgstr "വീണ്ടും ലോഗ്-ഇന്‍ ചെയ്യുക." - -msgid "Password change" -msgstr "പാസ് വേര്‍ഡ് മാറ്റം" - -msgid "Your password was changed." -msgstr "നിങ്ങളുടെ പാസ് വേര്‍ഡ് മാറ്റിക്കഴിഞ്ഞു." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "എന്റെ പാസ് വേര്‍ഡ് മാറ്റണം" - -msgid "Password reset" -msgstr "പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കല്‍" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "നിങ്ങളുടെ പാസ് വേര്‍ഡ് തയ്യാര്‍. ഇനി ലോഗ്-ഇന്‍ ചെയ്യാം." - -msgid "Password reset confirmation" -msgstr "പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കല്‍ ഉറപ്പാക്കല്‍" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"ദയവായി നിങ്ങളുടെ പുതിയ പാസ് വേര്‍ഡ് രണ്ടു തവണ നല്കണം. ശരിയായാണ് ടൈപ്പു ചെയ്തത് എന്നു " -"ഉറപ്പിക്കാനാണ്." - -msgid "New password:" -msgstr "പുതിയ പാസ് വേര്‍ഡ്:" - -msgid "Confirm password:" -msgstr "പാസ് വേര്‍ഡ് ഉറപ്പാക്കൂ:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കാന്‍ നല്കിയ ലിങ്ക് യോഗ്യമല്ല. ഒരു പക്ഷേ, അതു മുന്പ് തന്നെ ഉപയോഗിച്ചു " -"കഴിഞ്ഞതാവാം. പുതിയ ഒരു ലിങ്കിന് അപേക്ഷിക്കൂ." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"നിങ്ങളുൾ പാസ് വേർഡ്‌ മാറ്റാനുള്ള നിർദേശങ്ങൾ %(site_name)s ഇൽ ആവശ്യപ്പെട്ടതുകൊണ്ടാണ് ഈ " -"ഇമെയിൽ സന്ദേശം ലഭിച്ചദ്." - -msgid "Please go to the following page and choose a new password:" -msgstr "ദയവായി താഴെ പറയുന്ന പേജ് സന്ദര്‍ശിച്ച് പുതിയ പാസ് വേര്‍ഡ് തെരഞ്ഞെടുക്കുക:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "ഞങ്ങളുടെ സൈറ്റ് ഉപയോഗിച്ചതിന് നന്ദി!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s പക്ഷം" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "ഇമെയിൽ വിലാസം:" - -msgid "Reset my password" -msgstr "എന്റെ പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കൂ" - -msgid "All dates" -msgstr "എല്ലാ തീയതികളും" - -#, python-format -msgid "Select %s" -msgstr "%s തെരഞ്ഞെടുക്കൂ" - -#, python-format -msgid "Select %s to change" -msgstr "മാറ്റാനുള്ള %s തെരഞ്ഞെടുക്കൂ" - -#, python-format -msgid "Select %s to view" -msgstr "%s കാണാൻ തിരഞ്ഞെടുക്കുക" - -msgid "Date:" -msgstr "തിയ്യതി:" - -msgid "Time:" -msgstr "സമയം:" - -msgid "Lookup" -msgstr "തിരയുക" - -msgid "Currently:" -msgstr "നിലവിൽ:" - -msgid "Change:" -msgstr "മാറ്റം:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0abc5e7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po deleted file mode 100644 index 964d355..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,214 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aby Thomas , 2014 -# Jannis Leidel , 2011 -# MUHAMMED RAMEEZ , 2019 -# Rajeesh Nair , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-13 00:53+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "ലഭ്യമായ %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"ഇതാണ് ലഭ്യമായ %s പട്ടിക. അതില്‍ ചിലത് തിരഞ്ഞെടുക്കാന്‍ താഴെ കളത്തില്‍ നിന്നും ഉചിതമായവ സെലക്ട് " -"ചെയ്ത ശേഷം രണ്ടു കളങ്ങള്‍ക്കുമിടയിലെ \"തെരഞ്ഞെടുക്കൂ\" അടയാളത്തില്‍ ക്ലിക് ചെയ്യുക." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "ലഭ്യമായ %s പട്ടികയെ ഫില്‍ട്ടര്‍ ചെയ്തെടുക്കാന്‍ ഈ ബോക്സില്‍ ടൈപ്പ് ചെയ്യുക." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "എല്ലാം തെരഞ്ഞെടുക്കുക" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "%s എല്ലാം ഒന്നിച്ച് തെരഞ്ഞെടുക്കാന്‍ ക്ലിക് ചെയ്യുക." - -msgid "Choose" -msgstr "തെരഞ്ഞെടുക്കൂ" - -msgid "Remove" -msgstr "നീക്കം ചെയ്യൂ" - -#, javascript-format -msgid "Chosen %s" -msgstr "തെരഞ്ഞെടുത്ത %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"തെരഞ്ഞെടുക്കപ്പെട്ട %s പട്ടികയാണിത്. അവയില്‍ ചിലത് ഒഴിവാക്കണമെന്നുണ്ടെങ്കില്‍ താഴെ കളത്തില്‍ " -"നിന്നും അവ സെലക്ട് ചെയ്ത് കളങ്ങള്‍ക്കിടയിലുള്ള \"നീക്കം ചെയ്യൂ\" എന്ന അടയാളത്തില്‍ ക്ലിക് ചെയ്യുക." - -msgid "Remove all" -msgstr "എല്ലാം നീക്കം ചെയ്യുക" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "തെരഞ്ഞെടുക്കപ്പെട്ട %s എല്ലാം ഒരുമിച്ച് നീക്കം ചെയ്യാന്‍ ക്ലിക് ചെയ്യുക." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)sല്‍ %(sel)s തെരഞ്ഞെടുത്തു" -msgstr[1] "%(cnt)sല്‍ %(sel)s എണ്ണം തെരഞ്ഞെടുത്തു" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"വരുത്തിയ മാറ്റങ്ങള്‍ സേവ് ചെയ്തിട്ടില്ല. ഒരു ആക്ഷന്‍ പ്രയോഗിച്ചാല്‍ സേവ് ചെയ്യാത്ത മാറ്റങ്ങളെല്ലാം " -"നഷ്ടപ്പെടും." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "ഇപ്പോള്‍" - -msgid "Midnight" -msgstr "അര്‍ധരാത്രി" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "ഉച്ച" - -msgid "6 p.m." -msgstr "6 p.m" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം മുൻപിലാണ്." -msgstr[1] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം മുൻപിലാണ്." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം പിന്നിലാണ്." -msgstr[1] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം പിന്നിലാണ്." - -msgid "Choose a Time" -msgstr "സമയം തിരഞ്ഞെടുക്കുക" - -msgid "Choose a time" -msgstr "സമയം തെരഞ്ഞെടുക്കൂ" - -msgid "Cancel" -msgstr "റദ്ദാക്കൂ" - -msgid "Today" -msgstr "ഇന്ന്" - -msgid "Choose a Date" -msgstr "ഒരു തീയതി തിരഞ്ഞെടുക്കുക" - -msgid "Yesterday" -msgstr "ഇന്നലെ" - -msgid "Tomorrow" -msgstr "നാളെ" - -msgid "January" -msgstr "ജനുവരി" - -msgid "February" -msgstr "ഫെബ്രുവരി" - -msgid "March" -msgstr "മാർച്ച്" - -msgid "April" -msgstr "ഏപ്രിൽ" - -msgid "May" -msgstr "മെയ്" - -msgid "June" -msgstr "ജൂൺ" - -msgid "July" -msgstr "ജൂലൈ" - -msgid "August" -msgstr "ആഗസ്റ്റ്" - -msgid "September" -msgstr "സെപ്റ്റംബർ" - -msgid "October" -msgstr "ഒക്ടോബർ" - -msgid "November" -msgstr "നവംബർ" - -msgid "December" -msgstr "ഡിസംബര്" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "ഞ്ഞ‍" - -msgctxt "one letter Monday" -msgid "M" -msgstr "തി" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "ചൊ" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "ബു" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "വ്യാ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "വെ" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "ശ" - -msgid "Show" -msgstr "കാണട്ടെ" - -msgid "Hide" -msgstr "മറയട്ടെ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index 23fadf3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 89d0b30..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,787 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ankhbayar , 2013 -# Jannis Leidel , 2011 -# jargalan , 2011 -# Turmunkh Batkhuyag, 2023-2024 -# Zorig, 2016 -# Анхбаяр Анхаа , 2013-2016,2018-2019,2021,2023 -# Баясгалан Цэвлээ , 2011,2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Turmunkh Batkhuyag, 2023-2024\n" -"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Сонгосон %(verbose_name_plural)s-ийг устгах" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(items)s ээс %(count)d-ийг амжилттай устгалаа." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s устгаж чадахгүй." - -msgid "Delete multiple objects" -msgstr "Олон обектууд устгах" - -msgid "Administration" -msgstr "Удирдлага" - -msgid "All" -msgstr "Бүгд " - -msgid "Yes" -msgstr "Тийм" - -msgid "No" -msgstr "Үгүй" - -msgid "Unknown" -msgstr "Тодорхойгүй" - -msgid "Any date" -msgstr "Бүх өдөр" - -msgid "Today" -msgstr "Өнөөдөр" - -msgid "Past 7 days" -msgstr "Өнгөрсөн долоо хоног" - -msgid "This month" -msgstr "Энэ сар" - -msgid "This year" -msgstr "Энэ жил" - -msgid "No date" -msgstr "Огноогүй" - -msgid "Has date" -msgstr "Огноотой" - -msgid "Empty" -msgstr "Хоосон" - -msgid "Not empty" -msgstr "Хоосон биш" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Ажилтан хэрэглэгчийн %(username)s ба нууц үгийг зөв оруулна уу. Хоёр талбарт " -"том жижигээр үсгээр бичих ялгаатай." - -msgid "Action:" -msgstr "Үйлдэл:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Өөр %(verbose_name)s нэмэх " - -msgid "Remove" -msgstr "Хасах" - -msgid "Addition" -msgstr "Нэмэгдсэн" - -msgid "Change" -msgstr "Өөрчлөх" - -msgid "Deletion" -msgstr "Устгагдсан" - -msgid "action time" -msgstr "үйлдлийн хугацаа" - -msgid "user" -msgstr "хэрэглэгч" - -msgid "content type" -msgstr "агуулгын төрөл" - -msgid "object id" -msgstr "обектийн id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "обектийн хамаарал" - -msgid "action flag" -msgstr "үйлдэлийн тэмдэг" - -msgid "change message" -msgstr "өөрчлөлтийн мэдээлэл" - -msgid "log entry" -msgstr "лог өгөгдөл" - -msgid "log entries" -msgstr "лог өгөгдөлүүд" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Нэмэгдсэн \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Өөрчлөгдсөн \"%(object)s\"— %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Устгагдсан \"%(object)s\"." - -msgid "LogEntry Object" -msgstr "Лог бүртгэлийн обект" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Нэмсэн {name} “{object}”." - -msgid "Added." -msgstr "Нэмэгдсэн." - -msgid "and" -msgstr "ба" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Changed {fields} for {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Өөрчлөгдсөн {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Устгасан {name} “{object}”." - -msgid "No fields changed." -msgstr "Өөрчилсөн талбар алга байна." - -msgid "None" -msgstr "Хоосон" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Нэгээс олныг сонгохын тулд \"Control\" эсвэл Mac компьютер дээр \"Command\" " -"товчоо дарна уу." - -msgid "Select this object for an action - {}" -msgstr "Сонголтоо хийхийн тулд энэ объектыг сонгоно уу - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” амжилттай нэмэгдлээ." - -msgid "You may edit it again below." -msgstr "Та дараахийг дахин засах боломжтой" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” амжилттай нэмэгдлээ. Та доорх {name}-ийг нэмэх боломжтой." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" амжилттай өөрчлөгдлөө. Та доорх талбаруудыг дахин засварлах " -"боломжтой." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"\"{name}\" \"{obj}\" амжилттай өөрчлөгдлөө. Доорх {name}-г нэмж оруулна уу." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \" {obj} \" амжилттай өөрчлөгдлөө." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Үйлдэл хийхийн тулд Та ядаж 1-ийг сонгох хэрэгтэй. Өөрчилөлт хийгдсэнгүй." - -msgid "No action selected." -msgstr "Үйлдэл сонгоогүй." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” амжилттай устгагдлаа." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "“%(key)s” ID-тай %(name)sбайхгүй байна. Магадгүй устсан уу?" - -#, python-format -msgid "Add %s" -msgstr "%s-ийг нэмэх" - -#, python-format -msgid "Change %s" -msgstr "%s-ийг өөрчлөх" - -#, python-format -msgid "View %s" -msgstr "%s харах " - -msgid "Database error" -msgstr "Өгөгдлийн сангийн алдаа" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s-ийг амжилттай өөрчиллөө." -msgstr[1] "%(count)s %(name)s-ийг амжилттай өөрчиллөө." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Бүгд %(total_count)s сонгогдсон" -msgstr[1] "Бүгд %(total_count)s сонгогдсон" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s оос 0 сонгосон" - -msgid "Delete" -msgstr "Устгах" - -#, python-format -msgid "Change history: %s" -msgstr "Өөрчлөлтийн түүх: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(instance)s %(class_name)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -" %(class_name)s төрлийн %(instance)s-ийг устгах гэж байна. Эхлээд дараах " -"холбоотой хамгаалагдсан обектуудыг устгах шаардлагатай: %(related_objects)s" - -msgid "Django site admin" -msgstr "Сайтын удирдлага" - -msgid "Django administration" -msgstr "Удирдлага" - -msgid "Site administration" -msgstr "Сайтын удирдлага" - -msgid "Log in" -msgstr "Нэвтрэх" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s удирдлага" - -msgid "Page not found" -msgstr "Хуудас олдсонгүй." - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Уучлаарай, хүссэн хуудас олдсонгүй." - -msgid "Home" -msgstr "Нүүр" - -msgid "Server error" -msgstr "Серверийн алдаа" - -msgid "Server error (500)" -msgstr "Серверийн алдаа (500)" - -msgid "Server Error (500)" -msgstr "Серверийн алдаа (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Алдаа гарсан байна. И-мэйлээр админуудад мэдэгдэгдсэн бөгөөд тун удахгүй " -"засах болно. Хамтран ажилласанд баярлалаа." - -msgid "Run the selected action" -msgstr "Сонгосон үйлдэлийг ажилуулах" - -msgid "Go" -msgstr "Гүйцэтгэх" - -msgid "Click here to select the objects across all pages" -msgstr "Бүх хуудаснууд дээрх объектуудыг сонгох" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Бүгдийг сонгох %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Сонгосонг цэвэрлэх" - -msgid "Breadcrumbs" -msgstr "Талхны үүрмэг" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s хэрэглүүр дэх моделууд." - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Нэмэх" - -msgid "View" -msgstr "Харах" - -msgid "You don’t have permission to view or edit anything." -msgstr "Та ямар ч харах эсвэл засах эрхгүй байна." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Нууц үг өөрчлөх" - -msgid "Set password" -msgstr "Нууг үг оноох" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Та доорх алдаануудыг засна уу." -msgstr[1] "Та доорх алдаануудыг засна уу." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s.хэрэглэгчид шинэ нууц үг оруулна уу." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "" - -msgid "Enable password-based authentication" -msgstr "" - -msgid "Skip to main content" -msgstr "Үндсэн агуулга руу шилжих" - -msgid "Welcome," -msgstr "Тавтай морилно уу" - -msgid "View site" -msgstr "Сайтаас харах" - -msgid "Documentation" -msgstr "Баримтжуулалт" - -msgid "Log out" -msgstr "Гарах" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s нэмэх" - -msgid "History" -msgstr "Түүх" - -msgid "View on site" -msgstr "Сайтаас харах" - -msgid "Filter" -msgstr "Шүүлтүүр" - -msgid "Hide counts" -msgstr "Тооцоог нуух" - -msgid "Show counts" -msgstr "Тооцоог харуулах" - -msgid "Clear all filters" -msgstr "Бүх шүүлтүүрийг арилгах" - -msgid "Remove from sorting" -msgstr "Эрэмблэлтээс хасах" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Эрэмблэх урьтамж: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Эрэмбэлэлтийг харуул" - -msgid "Toggle theme (current theme: auto)" -msgstr "Загварыг сэлгэх (одоогийн загвар: авто)" - -msgid "Toggle theme (current theme: light)" -msgstr "Загварыг сэлгэх (одоогийн загвар: өдрийн)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Загварыг сэлгэх (одоогийн горим: шөнийн)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s'-ийг устгавал холбогдох объект нь устах " -"ч бүртгэл тань дараах төрлийн объектуудийг устгах зөвшөөрөлгүй байна:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -" %(object_name)s обектийг устгаж байна. '%(escaped_object)s' холбоотой " -"хамгаалагдсан обектуудыг заавал утсгах хэрэгтэй :" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Та %(object_name)s \"%(escaped_object)s\"-ийг устгахдаа итгэлтэй байна уу? " -"Үүнийг устгавал дараах холбогдох зүйлс нь бүгд устана:" - -msgid "Objects" -msgstr "Бичлэгүүд" - -msgid "Yes, I’m sure" -msgstr "Тийм, би итгэлтэй." - -msgid "No, take me back" -msgstr "Үгүй, намайг буцаа" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Сонгосон %(objects_name)s обектуудыг устгасанаар хамаатай бүх обкетууд устах " -"болно. Гэхдээ таньд эрх эдгээр төрлийн обектуудыг утсгах эрх байхгүй байна: " - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s обектуудыг утсгаж байна дараах холбоотой хамгаалагдсан " -"обектуудыг устгах шаардлагатай:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Та %(objects_name)s ийг устгах гэж байна итгэлтэй байна? Дараах обектууд " -"болон холбоотой зүйлс хамт устагдах болно:" - -msgid "Delete?" -msgstr "Устгах уу?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s -ээр" - -msgid "Summary" -msgstr "Хураангуй" - -msgid "Recent actions" -msgstr "Сүүлд хийсэн үйлдлүүд" - -msgid "My actions" -msgstr "Миний үйлдлүүд" - -msgid "None available" -msgstr "Үйлдэл алга" - -msgid "Added:" -msgstr "Нэмсэн:" - -msgid "Changed:" -msgstr "Өөрчилсөн:" - -msgid "Deleted:" -msgstr "Устгасан:" - -msgid "Unknown content" -msgstr "Тодорхойгүй агуулга" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Таны өгөгдлийн санг суулгахад ямар нэг алдаа гарлаа байна. Өгөгдлийн сангийн " -"тохирох хүснэгтүүдийг үүсгэсэн эсэхийг шалгаад, өгөгдлийн санг тохирох " -"хэрэглэгч унших боломжтой эсэхийг шалгаарай." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Та %(username)s нэрээр нэвтэрсэн байна гэвч энэ хуудасхуу хандах эрх " -"байхгүй байна. Та өөр эрхээр логин хийх үү?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Жолоодлого солбих" - -msgid "Sidebar" -msgstr "Хажуугийн самбар" - -msgid "Start typing to filter…" -msgstr "Шүүхийн тулд бичиж эхлэх..." - -msgid "Filter navigation items" -msgstr "Жолоодлогын зүйлсийг шүүх" - -msgid "Date/time" -msgstr "Огноо/цаг" - -msgid "User" -msgstr "Хэрэглэгч" - -msgid "Action" -msgstr "Үйлдэл" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "оролт" -msgstr[1] "оролт" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Энэ объектод өөрчлөлтийн түүх байхгүй байна. Админ сайтаар нэмээгүй байх " -"магадлалтай." - -msgid "Show all" -msgstr "Бүгдийг харуулах" - -msgid "Save" -msgstr "Хадгалах" - -msgid "Popup closing…" -msgstr "Хааж байна..." - -msgid "Search" -msgstr "Хайлт" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s үр дүн" -msgstr[1] "%(counter)s үр дүн" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Нийт %(full_result_count)s" - -msgid "Save as new" -msgstr "Шинээр хадгалах" - -msgid "Save and add another" -msgstr "Хадгалаад өөрийг нэмэх" - -msgid "Save and continue editing" -msgstr "Хадгалаад нэмж засах" - -msgid "Save and view" -msgstr "Хадгалаад харах." - -msgid "Close" -msgstr "Хаах" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Сонгосон %(model)s-ийг өөрчлөх" - -#, python-format -msgid "Add another %(model)s" -msgstr "Өөр %(model)s нэмэх" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Сонгосон %(model)s устгах" - -#, python-format -msgid "View selected %(model)s" -msgstr "View selected %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Өнөөдөр вэб сайтад цаг заваа зарцуулсанд баярлалаа." - -msgid "Log in again" -msgstr "Ахин нэвтрэх " - -msgid "Password change" -msgstr "Нууц үгийн өөрчлөлт" - -msgid "Your password was changed." -msgstr "Нууц үг тань өөрчлөгдлөө." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Та аюулгүй байдлын үүднээс хуучин нууц үгээ оруулна уу, тэгээд шинэ нууц " -"үгээ хоёр удаа оруулнаар бид бичсэн эсэхийг баталгаажуулах боломжтой." - -msgid "Change my password" -msgstr "Нууц үгээ солих" - -msgid "Password reset" -msgstr "Нууц үг шинэчилэх" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Та нууц үгтэй боллоо. Одоо бүртгэлд нэвтрэх боломжтой." - -msgid "Password reset confirmation" -msgstr "Нууц үг шинэчилэхийг баталгаажуулах" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Шинэ нууц үгээ хоёр удаа оруулна уу. Ингэснээр нууц үгээ зөв бичиж байгаа " -"эсэхийг тань шалгах юм. " - -msgid "New password:" -msgstr "Шинэ нууц үг:" - -msgid "Confirm password:" -msgstr "Нууц үгээ батлах:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Нууц үг авах холбоос болохгүй байна. Үүнийг аль хэдийнэ хэрэглэснээс болсон " -"байж болзошгүй. Шинэ нууц үг авахаар хүсэлт гаргана уу. " - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Бид таны нууц үг тохируулах зааварчилгааг и-мэйлээр илгээлээ. Хэрэв таны " -"оруулсан и-мэйл дээр акаунт байвал хурдан авах ёстой." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Хэрэв та имэйл аваагүй бол та бүртгэлтэй хаяг оруулсан эсэхийг шалгана уу, " -"мөн спам хавтасыг шалгана уу." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"%(site_name)s сайтанд бүртгүүлсэн эрхийн нууц үгийг сэргээх хүсэлт гаргасан " -"учир энэ имэйл ийг та хүлээн авсан болно. " - -msgid "Please go to the following page and choose a new password:" -msgstr "Дараах хуудас руу орон шинэ нууц үг сонгоно уу:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Манай сайтыг хэрэглэсэнд баярлалаа!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s баг" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Нууц үгээ мартсан уу? Доор имэйл хаягаа оруулна уу, бид шинэ нууц үг " -"тохируулах зааврыг имэйлээр илгээнэ." - -msgid "Email address:" -msgstr "Имэйл хаяг:" - -msgid "Reset my password" -msgstr "Нууц үгээ шинэчлэх" - -msgid "Select all objects on this page for an action" -msgstr "Энэ хуудас дээрх бүх объектуудыг үйлдэл хийхийн тулд сонгоно уу" - -msgid "All dates" -msgstr "Бүх огноо" - -#, python-format -msgid "Select %s" -msgstr "%s-г сонго" - -#, python-format -msgid "Select %s to change" -msgstr "Өөрчлөх %s-г сонгоно уу" - -#, python-format -msgid "Select %s to view" -msgstr "Харахын тулд %s сонгоно уу" - -msgid "Date:" -msgstr "Огноо:" - -msgid "Time:" -msgstr "Цаг:" - -msgid "Lookup" -msgstr "Хайх" - -msgid "Currently:" -msgstr "Одоогийнх:" - -msgid "Change:" -msgstr "Өөрчилөлт:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 9f58362..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5fda297..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,218 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tsolmon , 2012 -# Zorig, 2014,2018 -# Анхбаяр Анхаа , 2011-2012,2015,2019 -# Ганзориг БП , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-02-13 09:19+0000\n" -"Last-Translator: Анхбаяр Анхаа \n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Боломжтой %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Энэ %s жагсаалт нь боломжит утгын жагсаалт. Та аль нэгийг нь сонгоод \"Сонгох" -"\" дээр дарж нөгөө хэсэгт оруулах боломжтой." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Энэ нүдэнд бичээд дараах %s жагсаалтаас шүүнэ үү. " - -msgid "Filter" -msgstr "Шүүлтүүр" - -msgid "Choose all" -msgstr "Бүгдийг нь сонгох" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Бүгдийг сонгох бол %s дарна уу" - -msgid "Choose" -msgstr "Сонгох" - -msgid "Remove" -msgstr "Хас" - -#, javascript-format -msgid "Chosen %s" -msgstr "Сонгогдсон %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Энэ %s сонгогдсон утгуудыг жагсаалт. Та аль нэгийг нь хасахыг хүсвэл сонгоох " -"\"Хас\" дээр дарна уу." - -msgid "Remove all" -msgstr "Бүгдийг арилгах" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "%s ийн сонгоод бүгдийг нь арилгана" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s ээс %(cnt)s сонгосон" -msgstr[1] "%(sel)s ээс %(cnt)s сонгосон" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Хадгалаагүй өөрчлөлтүүд байна. Энэ үйлдэлийг хийвэл өөрчлөлтүүд устах болно." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Та 1 үйлдлийг сонгосон байна, гэвч та өөрийн өөрчлөлтүүдээ тодорхой " -"талбаруудад нь оруулагүй байна. OK дарж сануулна уу. Энэ үйлдлийг та дахин " -"хийх шаардлагатай." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Та 1 үйлдлийг сонгосон байна бас та ямарваа өөрчлөлт оруулсангүй. Та Save " -"товчлуур биш Go товчлуурыг хайж байгаа бололтой." - -msgid "Now" -msgstr "Одоо" - -msgid "Midnight" -msgstr "Шөнө дунд" - -msgid "6 a.m." -msgstr "06 цаг" - -msgid "Noon" -msgstr "Үд дунд" - -msgid "6 p.m." -msgstr "18 цаг" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Та серверийн цагаас %s цагийн түрүүнд явж байна" -msgstr[1] "Та серверийн цагаас %s цагийн түрүүнд явж байна" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Та серверийн цагаас %s цагаар хоцорч байна" -msgstr[1] "Та серверийн цагаас %s цагаар хоцорч байна" - -msgid "Choose a Time" -msgstr "Цаг сонгох" - -msgid "Choose a time" -msgstr "Цаг сонгох" - -msgid "Cancel" -msgstr "Болих" - -msgid "Today" -msgstr "Өнөөдөр" - -msgid "Choose a Date" -msgstr "Өдөр сонгох" - -msgid "Yesterday" -msgstr "Өчигдөр" - -msgid "Tomorrow" -msgstr "Маргааш" - -msgid "January" -msgstr "1-р сар" - -msgid "February" -msgstr "2-р сар" - -msgid "March" -msgstr "3-р сар" - -msgid "April" -msgstr "4-р сар" - -msgid "May" -msgstr "5-р сар" - -msgid "June" -msgstr "6-р сар" - -msgid "July" -msgstr "7-р сар" - -msgid "August" -msgstr "8-р сар" - -msgid "September" -msgstr "9-р сар" - -msgid "October" -msgstr "10-р сар" - -msgid "November" -msgstr "11-р сар" - -msgid "December" -msgstr "12-р сар" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Д" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "М" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Л" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "П" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Ба" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Бя" - -msgid "Show" -msgstr "Үзэх" - -msgid "Hide" -msgstr "Нуух" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index 8958a20..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index 395dd93..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,768 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Natalia, 2024 -# Omkar Parab, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Natalia, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "यशस्वीरीत्या %(count)d %(items)s घालवले गेले आहेत." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s घालवू शकत नाही" - -msgid "Delete multiple objects" -msgstr "एकाधिक वस्तू घालवा" - -msgid "Administration" -msgstr "प्रशासन" - -msgid "All" -msgstr "सर्व" - -msgid "Yes" -msgstr "होय" - -msgid "No" -msgstr "नाही" - -msgid "Unknown" -msgstr "अज्ञात" - -msgid "Any date" -msgstr "कोणतीही दिनांक" - -msgid "Today" -msgstr "आज" - -msgid "Past 7 days" -msgstr "मागील 7 दिवस" - -msgid "This month" -msgstr "या महिन्यात" - -msgid "This year" -msgstr "यावर्षी" - -msgid "No date" -msgstr "दिनांक नाही" - -msgid "Has date" -msgstr "दिनांक आहे" - -msgid "Empty" -msgstr "रिकामी" - -msgid "Not empty" -msgstr "रिकामी नाही" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"कृपया करून %(username)s आणि कर्मचारी खात्यासाठी अचूक गुप्तशब्द नमूद करा. लक्षात घ्या की " -"दोन्ही राखणे संवेदनशील असू शकतात." - -msgid "Action:" -msgstr "क्रिया:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "अजून एक %(verbose_name)s जोडा" - -msgid "Remove" -msgstr "काढा" - -msgid "Addition" -msgstr "वाढ" - -msgid "Change" -msgstr "बदला" - -msgid "Deletion" -msgstr "वगळा" - -msgid "action time" -msgstr "क्रियाकाळ" - -msgid "user" -msgstr "वापरकर्ता" - -msgid "content type" -msgstr "सामुग्री प्रकार" - -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "क्रिया झेंडा" - -msgid "change message" -msgstr "लिखित बदला" - -msgid "log entry" -msgstr "घटक नोंद" - -msgid "log entries" -msgstr "घटक नोंदी" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” जोडले" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” — %(changes)s बदलले" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" घालविले" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "जोडले." - -msgid "and" -msgstr "आणि" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” साठी {fields} बदलले. " - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} बदलले. " - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” घालवला" - -msgid "No fields changed." -msgstr "कोणतेही रखाणे बदलले नाहीत." - -msgid "None" -msgstr "" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "एकापेक्षा जास्त निवडण्यासाठी \"कंट्रोल\" किंवा मॅक वर \"कमांड\" खटका दाबा" - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” यशस्वीरीत्या जोडले गेले आहे." - -msgid "You may edit it again below." -msgstr "तुम्ही ते खाली पुन्हा संपादित करू शकता." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} “{obj}” यशस्वीरीत्या जोडले गेले आहे. तुम्ही खाली दुसरे {name} जोडू शकता." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” यशस्वीरीत्या बदलले गेले. तुम्ही त्याचे पुन्हा संपादन करू शकता." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} “{obj}” यशस्वीरीत्या जोडले गेले आहे. तुम्ही खाली दुसरे {name} जोडू शकता." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” यशस्वीरीत्या बदलले गेले आहे." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"गोष्टींवर क्रिया करण्यासाठी त्या निवडले जाणे आवश्यक आहे. कोणत्याही गोष्टी बदलल्या गेल्या " -"नाहीत." - -msgid "No action selected." -msgstr "कोणतीही क्रिया निवडली नाही." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” यशस्वीरीत्या हटवले गेले आहे." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s “%(key)s” ओळखीसह अस्तित्वात नाही. कदाचित ते घालवले असेल ?" - -#, python-format -msgid "Add %s" -msgstr "जोडा %s" - -#, python-format -msgid "Change %s" -msgstr "बदला %s" - -#, python-format -msgid "View %s" -msgstr "पहा %s" - -msgid "Database error" -msgstr "डेटाबेस त्रुटी" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -msgid "Delete" -msgstr "घालवा" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "जॅंगो स्थळ प्रशासक" - -msgid "Django administration" -msgstr "जॅंगो प्रशासन " - -msgid "Site administration" -msgstr "स्थळ प्रशासन " - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s प्रशासन" - -msgid "Page not found" -msgstr "पान मिळाले नाही" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "आम्ही क्षमस्व आहोत, पण विनंती केलेले पान मिळाले नाही." - -msgid "Home" -msgstr "मुख्यपान" - -msgid "Server error" -msgstr "वाढप्यात त्रुटी" - -msgid "Server error (500)" -msgstr "सर्व्हर त्रुटी (500)" - -msgid "Server Error (500)" -msgstr "सर्व्हर त्रुटी (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"त्रुटी आली आहे व ती विपत्राद्वारे सांकेतिकस्थळ व्यवस्थापकांकडे कळविण्यात आली आहे आणि लवकरच " -"ती सुधारली जाईल. आपल्या सहनशीलतेसाठी धन्यवाद." - -msgid "Run the selected action" -msgstr "निवडलेली क्रिया चालवा" - -msgid "Go" -msgstr "जा" - -msgid "Click here to select the objects across all pages" -msgstr "पानावरील सर्व वस्तूंची निवड करण्यासाठी येथे टिचकी मारा" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "सर्व %(total_count)s %(module_name)s निवडा" - -msgid "Clear selection" -msgstr "निवड काढा" - -msgid "Breadcrumbs" -msgstr "ब्रेडक्रम्ब्स" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "जोडा" - -msgid "View" -msgstr "पहा" - -msgid "You don’t have permission to view or edit anything." -msgstr "तुम्हाला काहीही पाहण्याची किंवा संपादित करण्याची परवानगी नाही." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "गुप्तशब्द बदला" - -msgid "Set password" -msgstr "" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s वापरकर्त्यासाठी नवीन गुप्तशब्द नमूद करा " - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "" - -msgid "Enable password-based authentication" -msgstr "" - -msgid "Skip to main content" -msgstr "मुख्य सामुग्रीवर जा" - -msgid "Welcome," -msgstr "स्वागत आहे," - -msgid "View site" -msgstr "संकेतस्थळ पहा" - -msgid "Documentation" -msgstr "दस्तऐवज" - -msgid "Log out" -msgstr "बाहेर पडा" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "इतिहास" - -msgid "View on site" -msgstr "संकेतस्थळावर पहा" - -msgid "Filter" -msgstr "गाळणी" - -msgid "Hide counts" -msgstr "गणना लपवा" - -msgid "Show counts" -msgstr "गणना दाखवा" - -msgid "Clear all filters" -msgstr "सर्व गाळण्या साफ करा" - -msgid "Remove from sorting" -msgstr "सोडवा सोडवा" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Toggle theme (current theme: auto)" -msgstr "थीम खुंटी बदला (सध्याची थीम: स्वयंप्रेरित)" - -msgid "Toggle theme (current theme: light)" -msgstr "थीम खुंटी बदला (सध्याची थीम: उजेड)" - -msgid "Toggle theme (current theme: dark)" -msgstr "थीम खुंटी बदला (सध्याची थीम: काळोख)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"\"%(escaped_object)s\" %(object_name)sनावाच्या वस्तू घालवताना त्याच्या संबंधित " -"वस्तूही घालवाव्या लागतील" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "होय, मला खात्री आहे" - -msgid "No, take me back" -msgstr "नको, मला मागे न्या" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"निवडलेले %(objects_name)s घालवण्यासाठी खालील संरक्षित संबंधित वस्तू डिलीट करणे आवश्यक " -"आहे." - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"तुम्हाला खात्री आहे की तुम्ही निवडलेले %(objects_name)s हटवायला याची खात्री आहे का? " -"खात्री आहे की खालील वस्तूंचे आणि त्यांच्या संबंधित घटक हटवले जातील:" - -msgid "Delete?" -msgstr "घालवायचं ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "सारांश" - -msgid "Recent actions" -msgstr "अलीकडच्या क्रिया" - -msgid "My actions" -msgstr "माझ्या क्रिया" - -msgid "None available" -msgstr "काहीही उपलब्ध नाही" - -msgid "Added:" -msgstr "जोडले गेले:" - -msgid "Changed:" -msgstr "बदलले." - -msgid "Deleted:" -msgstr "घालवले." - -msgid "Unknown content" -msgstr "अज्ञात सामुग्री" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"तुमच्या माहितीगठ्ठा स्थापनेत काहीतरी चुक आहे. खात्री करा की योग्य डेटाबेस तक्ते तयार केलेले " -"आहेत आणि खात्री करा की योग्य वापरकर्त्या माहितीगठ्ठा वाचू शकतो." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"तुम्ही %(username)s म्हणून प्रमाणित केले आहे, परंतु हे पानात शिरकाव करण्यास अधिकृत नाही. " -"तुम्हाला वेगळ्या खात्यात प्रवेश करायला आवडेल का?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "टॉगल नेविगेशन" - -msgid "Sidebar" -msgstr "बाजूभिंत" - -msgid "Start typing to filter…" -msgstr "प्रविष्ट करण्यासाठी टाइप करण्याची सुरुवात करा ..." - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "दिनांक/वेळ" - -msgid "User" -msgstr "वापरकर्ता" - -msgid "Action" -msgstr "क्रिया" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"या वस्तूचा कोणताही बदलाचा इतिहास नाही. कदाचित तो व्यवस्थापक मार्गे नव्हता जोडला गेला " -"असावा." - -msgid "Show all" -msgstr "सर्व दाखवा" - -msgid "Save" -msgstr "साठवा" - -msgid "Popup closing…" -msgstr "पॉपअप बंद होत आहे..." - -msgid "Search" -msgstr "शोधा" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "नवीन म्हणून साठवा" - -msgid "Save and add another" -msgstr "साठवा आणि आणखी एक जोडा" - -msgid "Save and continue editing" -msgstr "साठवा आणि संपादन सुरू ठेवा" - -msgid "Save and view" -msgstr "साठवा आणि पहा" - -msgid "Close" -msgstr "बंद" - -#, python-format -msgid "Change selected %(model)s" -msgstr "निवडलेले %(model)s बदला" - -#, python-format -msgid "Add another %(model)s" -msgstr "अजून एक %(model)s जोडा" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "निवडलेले %(model)s घालवा" - -#, python-format -msgid "View selected %(model)s" -msgstr "निवडलेले %(model)s पहा" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "आज संकेतस्थळावर अमुल्य वेळ घालवल्याबद्दल धन्यवाद." - -msgid "Log in again" -msgstr "पुन्हा प्रवेश करा" - -msgid "Password change" -msgstr "गुप्तशब्द बदला" - -msgid "Your password was changed." -msgstr "तुमचा गुप्तशब्द बदलला गेला आहे." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"सुरक्षेसाठी कृपया आपला जुना गुप्तशब्द नमूद करा, आणि नंतर आपला नवीन गुप्तशब्द दोनदा नमूद " -"करा जेणेकरून तुम्ही गुप्तशब्द अचूक नमूद केला आहे की नाही ह्याची आम्ही पडताळणी करू." - -msgid "Change my password" -msgstr "माझा गुप्तशब्द बदला" - -msgid "Password reset" -msgstr "गुप्तशब्द पुन्हस्थापना" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "तुमचा गुप्तशब्द जोडला आहे. आपण आता प्रवेश करू शकता." - -msgid "Password reset confirmation" -msgstr "गुप्तशब्द पुन्हस्थापना निश्चित" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"कृपया आपला नवीन गुप्तशब्द दोनदा नमूद करा, जेणेकरून तुम्ही तो योग्य नमूद केला आहे का याची " -"आम्ही पडताळणी करू." - -msgid "New password:" -msgstr "नवीन गुप्तशब्द:" - -msgid "Confirm password:" -msgstr "निश्चित गुप्तशब्द:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"गुप्तशब्द पुन्हस्थापना दुवा अवैध आहे, कदाचित तो आधीच वापरला गेलेला आहे. कृपया नवीन गुप्तशब्द " -"पुन्हस्थापनेची विनंती करा." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"आपल्याला आपला गुप्तशब्द पुन्हस्थापीत करण्याच्या सूचना विपत्र केल्या आहेत, जर नमूद केलेल्या " -"विपत्रासह खाते उपलब्ध असेल तर आपल्याला ते लवकरच मिळायला पाहीजे." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"जर तुम्हाला विपत्र मिळत नसेल तर कृपया खाते नोंदवलेला विपत्र तुम्ही योग्य नमूद केलाय का " -"याची खात्री करा आणि तुमचा स्पॅम फोल्डर तपासा." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"तुम्हाला हा विपत्र मिळत आहे कारण तुम्ही %(site_name)s या संकेतस्थळावरील तुमच्या " -"वापरकर्ता खात्यासाठी गुप्तशब्द पुन्हस्थापनेची विनंती केली होती." - -msgid "Please go to the following page and choose a new password:" -msgstr "कृपया खालील पानावर जा आणि नवीन गुप्तशब्द निवडा." - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "आमच्या संकेतस्थळाचा वापर केल्याबद्दल आभार!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s संघ" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"तुमचा गुप्तशब्द विसरलात का? तुमचा विपत्रपत्ता खाली नमूद करा. नवीन गुप्तशब्द " -"ठरवण्यासाठीच्या सूचना आम्ही तुम्हाला विपत्र करू." - -msgid "Email address:" -msgstr "विपत्र पत्ता:" - -msgid "Reset my password" -msgstr "माझा गुप्तशब्द पुन्हस्थापन करा" - -msgid "Select all objects on this page for an action" -msgstr "क्रिया करण्यासाठी या पानावरील सर्व घटक निवडा." - -msgid "All dates" -msgstr "सर्व दिनांक" - -#, python-format -msgid "Select %s" -msgstr "%s निवडा" - -#, python-format -msgid "Select %s to change" -msgstr "बदलण्यासाठी %s निवडा" - -#, python-format -msgid "Select %s to view" -msgstr "पाहण्यासाठी %s निवडा" - -msgid "Date:" -msgstr "दिनांक:" - -msgid "Time:" -msgstr "वेळ:" - -msgid "Lookup" -msgstr "शोध" - -msgid "Currently:" -msgstr "सध्या:" - -msgid "Change:" -msgstr "बदला:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 183b3d1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po deleted file mode 100644 index 2026d16..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,145 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "" - -msgid "Clock" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Calendar" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" - -msgid "S M T W T F S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index f558c1b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index e69439e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,721 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -# Mariusz Felisiak , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-12-06 07:41+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Padam pilihan %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s berjaya dipadamkan" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s tidak boleh dipadamkan" - -msgid "Are you sure?" -msgstr "Adakah anda pasti?" - -msgid "Administration" -msgstr "Pentadbiran" - -msgid "All" -msgstr "Semua" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Tidak" - -msgid "Unknown" -msgstr "Tidak diketahui" - -msgid "Any date" -msgstr "Sebarang tarikh" - -msgid "Today" -msgstr "Hari ini" - -msgid "Past 7 days" -msgstr "7 hari lalu" - -msgid "This month" -msgstr "Bulan ini" - -msgid "This year" -msgstr "Tahun ini" - -msgid "No date" -msgstr "Tiada tarikh" - -msgid "Has date" -msgstr "Mempunyai tarikh" - -msgid "Empty" -msgstr "Kosong" - -msgid "Not empty" -msgstr "Tidak kosong" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Sila masukkan %(username)s dan kata-laluan bagi akaun staf. Kedua-dua medan " -"berkemungkinan kes-sensitif." - -msgid "Action:" -msgstr "Tindakan" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Tambah %(verbose_name)s" - -msgid "Remove" -msgstr "Buang" - -msgid "Addition" -msgstr "Tambahan" - -msgid "Change" -msgstr "Tukar" - -msgid "Deletion" -msgstr "Pemadaman" - -msgid "action time" -msgstr "masa tindakan" - -msgid "user" -msgstr "pengguna" - -msgid "content type" -msgstr "jenis kandungan" - -msgid "object id" -msgstr "id objek" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr objek" - -msgid "action flag" -msgstr "bendera tindakan" - -msgid "change message" -msgstr "tukar mesej" - -msgid "log entry" -msgstr "entri log" - -msgid "log entries" -msgstr "entri log" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" ditambah" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\" ditukar - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" dipadam." - -msgid "LogEntry Object" -msgstr "Objek EntriLog" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” ditambah." - -msgid "Added." -msgstr "Ditambah." - -msgid "and" -msgstr "dan" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "“{object}” {name} untuk {fields} telah ditukar." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} telah ditukar." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "“{object}” {name} telah dipadamkan" - -msgid "No fields changed." -msgstr "Tiada medan diubah." - -msgid "None" -msgstr "Tiada" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Tekan \"Control\", atau \"Command pada Mac untuk memilih lebih daripada satu." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" telah berjaya ditambah." - -msgid "You may edit it again below." -msgstr "Anda boleh edit semula dibawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\" telah berjaya ditambah. Anda boleh menambah {name} lain " -"dibawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" berjaya diubah. Anda boleh edit semula dibawah." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} \"{obj}\" berjaya ditambah. Anda boleh edit semula dibawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" berjaya diubah. Anda boleh tambah {name} lain dibawah" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" berjaya diubah." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Item-item perlu dipilih mengikut turutan untuk tindakan lanjut. Tiada item-" -"item yang diubah." - -msgid "No action selected." -msgstr "Tiada tindakan dipilih." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" berjaya dipadam." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s dengan ID \"%(key)s\" tidak wujud. Mungkin ia telah dipadamkan?" - -#, python-format -msgid "Add %s" -msgstr "Tambah %s" - -#, python-format -msgid "Change %s" -msgstr "Tukar %s" - -#, python-format -msgid "View %s" -msgstr "Lihat %s" - -msgid "Database error" -msgstr "Masalah pangkalan data" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s berjaya ditukar." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Kesemua %(total_count)s dipilih" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 daripada %(cnt)s dipilih" - -#, python-format -msgid "Change history: %s" -msgstr "Sejarah penukaran: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Memadam %(class_name)s %(instance)s memerlukan pemadaman objek berkaitan " -"yang dilindungi: %(related_objects)s" - -msgid "Django site admin" -msgstr "Pentadbiran laman Django" - -msgid "Django administration" -msgstr "Pentadbiran Django" - -msgid "Site administration" -msgstr "Pentadbiran laman" - -msgid "Log in" -msgstr "Log masuk" - -#, python-format -msgid "%(app)s administration" -msgstr "Pentadbiran %(app)s" - -msgid "Page not found" -msgstr "Laman tidak dijumpai" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Maaf, tetapi laman yang diminta tidak dijumpai." - -msgid "Home" -msgstr "Utama" - -msgid "Server error" -msgstr "Masalah pelayan" - -msgid "Server error (500)" -msgstr "Masalah pelayan (500)" - -msgid "Server Error (500)" -msgstr "Masalah pelayan (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Terdapat masalah. Ia telah dilaporkan kepada pentadbir laman melalui emel " -"dan sepatutnya dibaiki sebentar lagi. Kesabaran anda amat dihargai." - -msgid "Run the selected action" -msgstr "Jalankan tindakan yang dipilih" - -msgid "Go" -msgstr "Teruskan" - -msgid "Click here to select the objects across all pages" -msgstr "Klik disini untuk memilih objek-objek disemua laman" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Pilih kesemua %(total_count)s%(module_name)s" - -msgid "Clear selection" -msgstr "Padam pilihan" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Model didalam aplikasi %(name)s" - -msgid "Add" -msgstr "Tambah" - -msgid "View" -msgstr "Lihat" - -msgid "You don’t have permission to view or edit anything." -msgstr "Anda tidak mempunyai kebenaran untuk melihat atau edit apa-apa." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Pertama sekali, masukkan nama pengguna dan kata laluan. Selepas itu, anda " -"boleh edit pilihan pengguna yang lain" - -msgid "Enter a username and password." -msgstr "Masukkan nama pengguna dan kata laluan." - -msgid "Change password" -msgstr "Tukar kata laluan" - -msgid "Please correct the error below." -msgstr "Sila betulkan ralat di bawah." - -msgid "Please correct the errors below." -msgstr "Sila betulkan ralat-ralat di bawah." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Masukkan kata lalauan bagi pengguna %(username)s" - -msgid "Welcome," -msgstr "Selamat datang," - -msgid "View site" -msgstr "Lihat laman" - -msgid "Documentation" -msgstr "Dokumentasi" - -msgid "Log out" -msgstr "Log keluar" - -#, python-format -msgid "Add %(name)s" -msgstr "Tambah %(name)s" - -msgid "History" -msgstr "Sejarah" - -msgid "View on site" -msgstr "Lihat di laman" - -msgid "Filter" -msgstr "Tapis" - -msgid "Clear all filters" -msgstr "Kosongkan kesemua tapisan" - -msgid "Remove from sorting" -msgstr "Buang daripada penyusunan" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Keutamaan susunan: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Togol penyusunan" - -msgid "Delete" -msgstr "Buang" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Memadam %(object_name)s '%(escaped_object)s' akan menyebabkan pembuangan " -"objek-objek yang berkaitan, tetapi akaun anda tidak mempunyai kebenaran " -"untuk memadam jenis-jenis objek-objek berikut:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Membuang %(object_name)s '%(escaped_object)s' memerlukan pembuangan objek-" -"objek berkaitan yang dilindungi:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Adakah anda pasti anda ingin membuang %(object_name)s \"%(escaped_object)s" -"\"? Semua item-item berkaitan berikut akan turut dibuang:" - -msgid "Objects" -msgstr "Objek-objek" - -msgid "Yes, I’m sure" -msgstr "Ya, saya pasti" - -msgid "No, take me back" -msgstr "Tidak, bawa saya kembali" - -msgid "Delete multiple objects" -msgstr "Buang pelbagai objek" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Membuang %(objects_name)s akan menyebabkan pembuangan objek-objek yang " -"berkaitan, tetapi akaun anda tidak mempunyai kebenaran to membuang jenis " -"objek-objek berikut:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Membuang %(objects_name)s memerlukan pembuangan objek-objek berkaitan yang " -"dilindungi:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Adakah anda pasti untuk membuang %(objects_name)s yang dipilih? Segala objek-" -"objek berikut dan item-item yang berkaitan akan turut dibuang:" - -msgid "Delete?" -msgstr "Buang?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Daripada %(filter_title)s" - -msgid "Summary" -msgstr "Rumusan" - -msgid "Recent actions" -msgstr "Tindakan terkini" - -msgid "My actions" -msgstr "Tindakan saya" - -msgid "None available" -msgstr "Tiada yang tersedia" - -msgid "Unknown content" -msgstr "Kandungan tidak diketahui" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Nampaknya ada masalah dengan pemasangan pangkalan data anda. Pastikan jadual " -"pangkalan yang bersesuaian telah di cipta, dan pastikan pangkalan data " -"tersebut boleh dibaca oleh pengguna yang bersesuaian." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Anda telah disahkan sebagai %(username)s, tetapi anda tidak dibenarkan untuk " -"mengakses ruangan ini. Adakah anda ingin log masuk menggunakan akaun lain?" - -msgid "Forgotten your password or username?" -msgstr "Terlupa kata laluan atau nama pengguna anda?" - -msgid "Toggle navigation" -msgstr "Togol navigasi" - -msgid "Start typing to filter…" -msgstr "Mulakan menaip untuk menapis..." - -msgid "Filter navigation items" -msgstr "Tapis item-item navigasi" - -msgid "Date/time" -msgstr "Tarikh/masa" - -msgid "User" -msgstr "Pengguna" - -msgid "Action" -msgstr "Tindakan" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Objek ini tidak mempunyai sejarah penukaran. Ini mungkin bermaksud ia tidak " -"ditambah menggunakan laman admin ini." - -msgid "Show all" -msgstr "Tunjuk semua" - -msgid "Save" -msgstr "Simpan" - -msgid "Popup closing…" -msgstr "Popup sedang ditutup..." - -msgid "Search" -msgstr "Cari" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s keputusan" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s jumlah" - -msgid "Save as new" -msgstr "Simpan sebagai baru" - -msgid "Save and add another" -msgstr "Simpan dan tambah lagi" - -msgid "Save and continue editing" -msgstr "Simpan dan teruskan mengedit" - -msgid "Save and view" -msgstr "Simpan dan lihat" - -msgid "Close" -msgstr "Tutup" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Tukar %(model)s yang dipilih" - -#, python-format -msgid "Add another %(model)s" -msgstr "Tambah %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Buang %(model)s pilihan" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Terima kasih kerana meluangkan masa di laman sesawang ini hari ini." - -msgid "Log in again" -msgstr "Log masuk semula" - -msgid "Password change" -msgstr "Pertukaran kata laluan" - -msgid "Your password was changed." -msgstr "Kata laluan anda telah ditukarkan" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Untuk tujuan keselamatan, sila masukkan kata laluan lama, kemudian masukkan " -"kata laluan baru dua kali supaya kami dapat memastikan anda memasukkannya " -"dengan betul." - -msgid "Change my password" -msgstr "Tukar kata laluan saya" - -msgid "Password reset" -msgstr "Tetap semula kata laluan" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Kata laluan anda telah ditetapkan. Sila log masuk." - -msgid "Password reset confirmation" -msgstr "Pengesahan tetapan semula kata laluan" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Sila masukkan kata laluan baru anda dua kali supaya kami adpat memastikan " -"anda memasukkannya dengan betul." - -msgid "New password:" -msgstr "Kata laluan baru:" - -msgid "Confirm password:" -msgstr "Sahkan kata laluan:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Pautan tetapan semula kata laluan tidak sah, mungkin kerana ia telah " -"digunakan. Sila minta tetapan semula kata laluan yang baru." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Kami telah menghantar panduan untuk menetapkan kata laluan anda melalui " -"emel, sekiranya emel yang anda masukkan itu wujud. Anda sepatutnya " -"menerimanya sebentar lagi." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jika anda tidak menerima emel, sila pastikan anda telah memasukkan alamat " -"emel yang telah didaftarkan, dan semak folder spam anda." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Anda menerima emel ini kerana anda telah memohon untuk menetapkan semula " -"kata laluan bagi akaun pengguna di %(site_name)s" - -msgid "Please go to the following page and choose a new password:" -msgstr "Sila ke ruangan berikut dan pilih kata laluan baru:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Nama pengguna anda, sekiranya anda terlupa:" - -msgid "Thanks for using our site!" -msgstr "Terima kasih kerana menggunakan laman kami!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Pasukan %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Lupa kata laluan anda? Masukkan alamat emel anda dibawah, dan kami akan " -"menghantar cara untuk menetapkan kata laluan baru." - -msgid "Email address:" -msgstr "Alamat emel:" - -msgid "Reset my password" -msgstr "Tetap semula kata laluan saya" - -msgid "All dates" -msgstr "Semua tarikh" - -#, python-format -msgid "Select %s" -msgstr "Pilih %s" - -#, python-format -msgid "Select %s to change" -msgstr "Pilih %s untuk diubah" - -#, python-format -msgid "Select %s to view" -msgstr "Pilih %s untuk lihat" - -msgid "Date:" -msgstr "Tarikh:" - -msgid "Time:" -msgstr "Masa:" - -msgid "Lookup" -msgstr "Carian" - -msgid "Currently:" -msgstr "Kini:" - -msgid "Change:" -msgstr "Tukar:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 65e0050..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po deleted file mode 100644 index 6d86502..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,264 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-11-16 13:42+0000\n" -"Last-Translator: Jafry Hisham\n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s tersedia" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ini adalah senarai %s yang tersedia. Anda boleh memilih beberapa dengan " -"memilihnya di dalam kotak dibawah dan kemudian klik pada anak panah \"Pilih" -"\" diantara dua kotak itu." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Taip didalam kotak untuk menapis senarai %s yang tersedia." - -msgid "Filter" -msgstr "Tapis" - -msgid "Choose all" -msgstr "Pilih semua" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klik untuk memlih semua %s serentak." - -msgid "Choose" -msgstr "Pilih" - -msgid "Remove" -msgstr "Buang" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s dipilh" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ini adalah senarai %s yang dipilih. Anda boleh membuangnya dengan memilihnya " -"pada kotak dibawah dan kemudian klik pada anak panah \"Buang\" diantara dua " -"kotak itu." - -msgid "Remove all" -msgstr "Buang semua" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klik untuk membuang serentak semua %s yang dipilih." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s daripada %(cnt)s dipilih" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Anda mempunyai perubahan yang belum disimpan pada medan-medan individu yang " -"boleh di-edit. Sekiranya anda melakukan sebarang tindakan, penukaran yang " -"tidak disimpan akan hilang." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Anda telah memlih tindakan, tetapi anda belum menyimpan perubahan yang " -"dilakukan pada medan-medan individu. Sila klik OK to untuk simpan. Anda " -"perlu melakukan semula tindakan tersebut." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Anda telah memilih sesuatu tindakan, dan belum membuat perubahan pada medan-" -"medan individu. Anda mungkin sedang mencari butang Pergi dan bukannya butang " -"Simpan." - -msgid "Now" -msgstr "Sekarang" - -msgid "Midnight" -msgstr "Tengah malam" - -msgid "6 a.m." -msgstr "6 pagi" - -msgid "Noon" -msgstr "Tengahari" - -msgid "6 p.m." -msgstr "6 malam" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Anda %s jam ke depan daripada masa pelayan." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Anda %s jam ke belakang daripada masa pelayan." - -msgid "Choose a Time" -msgstr "Pilih Masa" - -msgid "Choose a time" -msgstr "Pilih masa" - -msgid "Cancel" -msgstr "Batal" - -msgid "Today" -msgstr "Hari ini" - -msgid "Choose a Date" -msgstr "Pilih Tarikh" - -msgid "Yesterday" -msgstr "Semalam" - -msgid "Tomorrow" -msgstr "Esok" - -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Mac" - -msgid "April" -msgstr "Arpil" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Jun" - -msgid "July" -msgstr "Julai" - -msgid "August" -msgstr "Ogos" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Disember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ogo" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dis" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "A" - -msgctxt "one letter Monday" -msgid "M" -msgstr "I" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Se" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "R" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "K" - -msgctxt "one letter Friday" -msgid "F" -msgstr "J" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Sa" - -msgid "Show" -msgstr "Tunjuk" - -msgid "Hide" -msgstr "Sorok" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index c22fe6c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index 34054de..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,629 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2013-2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "စီမံခန့်ခွဲမှု" - -msgid "All" -msgstr "အားလုံး" - -msgid "Yes" -msgstr "ဟုတ်" - -msgid "No" -msgstr "မဟုတ်" - -msgid "Unknown" -msgstr "အမည်မသိ" - -msgid "Any date" -msgstr "နှစ်သက်ရာရက်စွဲ" - -msgid "Today" -msgstr "ယနေ့" - -msgid "Past 7 days" -msgstr "" - -msgid "This month" -msgstr "ယခုလ" - -msgid "This year" -msgstr "ယခုနှစ်" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "လုပ်ဆောင်ချက်:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "ဖယ်ရှား" - -msgid "action time" -msgstr "" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "နှင့်" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "တစ်ခုမှမဟုတ်" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "ထည့်သွင်း %s" - -#, python-format -msgid "Change %s" -msgstr "ပြောင်းလဲ %s" - -msgid "Database error" -msgstr "အချက်အလက်အစုအမှား" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "မှတ်တမ်းပြောင်းလဲ: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "ဒီဂျန်ဂိုစီမံခန့်ခွဲမှု" - -msgid "Site administration" -msgstr "ဆိုက်စီမံခန့်ခွဲမှု" - -msgid "Log in" -msgstr "ဖွင့်ဝင်" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We're sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "ပင်မ" - -msgid "Server error" -msgstr "ဆာဗာအမှားပြ" - -msgid "Server error (500)" -msgstr "ဆာဗာအမှားပြ (၅၀၀)" - -msgid "Server Error (500)" -msgstr "ဆာဗာအမှားပြ (၅၀၀)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "သွား" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "စကားဝှက်ပြောင်း" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "ကြိုဆို၊ " - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "စာရွက်စာတမ်း" - -msgid "Log out" -msgstr "ဖွင့်ထွက်" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "မှတ်တမ်း" - -msgid "View on site" -msgstr "" - -msgid "Filter" -msgstr "စီစစ်မှု" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "ပယ်ဖျက်" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "ပြောင်းလဲ" - -msgid "Delete?" -msgstr "ပယ်ဖျက်?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "အကျဉ်းချုပ်" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "ထည့်သွင်း" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "ရက်စွဲ/အချိန်" - -msgid "User" -msgstr "အသုံးပြုသူ" - -msgid "Action" -msgstr "လုပ်ဆောင်ချက်" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "သိမ်းဆည်း" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "ရှာဖွေ" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "စကားဝှက်ပြောင်း" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "အီးမေးလ်လိပ်စာ:" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "ရက်စွဲအားလုံး" - -#, python-format -msgid "Select %s" -msgstr "ရွေးချယ် %s" - -#, python-format -msgid "Select %s to change" -msgstr "ပြောင်းလဲရန် %s ရွေးချယ်" - -msgid "Date:" -msgstr "ရက်စွဲ:" - -msgid "Time:" -msgstr "အချိန်:" - -msgid "Lookup" -msgstr "ပြန်ကြည့်" - -msgid "Currently:" -msgstr "လက်ရှိ:" - -msgid "Change:" -msgstr "ပြောင်းလဲ:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 000b8bc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po deleted file mode 100644 index 06b49fc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,206 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s ကိုရယူနိုင်" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"%s သည်ရယူနိုင်သောစာရင်းဖြစ်။ အောက်ဖော်ပြပါဘူးများတွင်အချို့ကိုရွေးချယ်နိုင်ပြီးဘူးနှစ်ခုကြားရှိ\"ရွေး" -"\"များကိုကလစ်နှိပ်။" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "ယခုဘူးထဲတွင်စာသားရိုက်ထည့်ပြီး %s ရယူနိုင်သောစာရင်းကိုစိစစ်နိုင်။" - -msgid "Filter" -msgstr "စီစစ်မှု" - -msgid "Choose all" -msgstr "အားလံုးရွေး" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "%s အားလံုးကိုတစ်ကြိမ်တည်းဖြင့်ရွေးချယ်ရန်ကလစ်နှိပ်။" - -msgid "Choose" -msgstr "ရွေး" - -msgid "Remove" -msgstr "ဖယ်ရှား" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s ရွေးပြီး" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"%s သည်ရယူနိုင်သောစာရင်းဖြစ်။ အောက်ဖော်ပြပါဘူးများတွင်အချို့ကိုဖယ်ရှားနိုင်ပြီးဘူးနှစ်ခုကြားရှိ\"ဖယ်ရှား" -"\"ကိုကလစ်နှိပ်။" - -msgid "Remove all" -msgstr "အားလံုးဖယ်ရှား" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "%s အားလံုးကိုတစ်ကြိမ်တည်းဖြင့်ဖယ်ရှားရန်ကလစ်နှိပ်။" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s မှ %(sel)s ရွေးချယ်ပြီး" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" - -msgid "Now" -msgstr "ယခု" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "အချိန်ရွေးပါ" - -msgid "Midnight" -msgstr "သန်းခေါင်" - -msgid "6 a.m." -msgstr "မနက်၆နာရီ" - -msgid "Noon" -msgstr "မွန်းတည့်" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "ပယ်ဖျက်" - -msgid "Today" -msgstr "ယနေ့" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "မနေ့" - -msgid "Tomorrow" -msgstr "မနက်ဖြန်" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "ပြသ" - -msgid "Hide" -msgstr "ဖုံးကွယ်" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index ea77ddd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index 3f6445e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,720 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# jensadne , 2013-2014 -# Jon , 2015-2016 -# Jon , 2017-2020 -# Jon , 2013 -# Jon , 2011,2013 -# Sigurd Gartmann , 2012 -# Tommy Strand , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-14 19:53+0200\n" -"PO-Revision-Date: 2020-09-04 13:37+0000\n" -"Last-Translator: Jon \n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Slettet %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kan ikke slette %(name)s" - -msgid "Are you sure?" -msgstr "Er du sikker?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Slett valgte %(verbose_name_plural)s" - -msgid "Administration" -msgstr "Administrasjon" - -msgid "All" -msgstr "Alle" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nei" - -msgid "Unknown" -msgstr "Ukjent" - -msgid "Any date" -msgstr "Når som helst" - -msgid "Today" -msgstr "I dag" - -msgid "Past 7 days" -msgstr "Siste syv dager" - -msgid "This month" -msgstr "Denne måneden" - -msgid "This year" -msgstr "I år" - -msgid "No date" -msgstr "Ingen dato" - -msgid "Has date" -msgstr "Har dato" - -msgid "Empty" -msgstr "Tom" - -msgid "Not empty" -msgstr "Ikke tom" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Vennligst oppgi gyldig %(username)s og passord til en " -"administrasjonsbrukerkonto. Merk at det er forskjell på små og store " -"bokstaver." - -msgid "Action:" -msgstr "Handling:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Legg til ny %(verbose_name)s" - -msgid "Remove" -msgstr "Fjern" - -msgid "Addition" -msgstr "Tillegg" - -msgid "Change" -msgstr "Endre" - -msgid "Deletion" -msgstr "Sletting" - -msgid "action time" -msgstr "tid for handling" - -msgid "user" -msgstr "bruker" - -msgid "content type" -msgstr "innholdstype" - -msgid "object id" -msgstr "objekt-ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekt-repr" - -msgid "action flag" -msgstr "handlingsflagg" - -msgid "change message" -msgstr "endre melding" - -msgid "log entry" -msgstr "logginnlegg" - -msgid "log entries" -msgstr "logginnlegg" - -#, python-format -msgid "Added “%(object)s”." -msgstr "La til \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Endret \"%(object)s\" — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Slettet \"%(object)s\"." - -msgid "LogEntry Object" -msgstr "LogEntry-objekt" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "La til {name} \"{object}\"." - -msgid "Added." -msgstr "Lagt til." - -msgid "and" -msgstr "og" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Endret {fields} for {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Endret {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Slettet {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Ingen felt endret." - -msgid "None" -msgstr "Ingen" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Hold nede «Control», eller «Command» på en Mac, for å velge mer enn én." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" ble lagt til." - -msgid "You may edit it again below." -msgstr "Du kan endre det igjen nedenfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} \"{obj}\" ble lagt til. Du kan legge til en ny {name} nedenfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" ble endret. Du kan redigere videre nedenfor." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} \"{obj}\" ble lagt til. Du kan redigere videre nedenfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" ble endret. Du kan legge til en ny {name} nedenfor." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" ble endret." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Du må velge objekter for å utføre handlinger på dem. Ingen objekter har " -"blitt endret." - -msgid "No action selected." -msgstr "Ingen handling valgt." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" ble slettet." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s med ID \"%(key)s\" eksisterer ikke. Kanskje det ble slettet?" - -#, python-format -msgid "Add %s" -msgstr "Legg til ny %s" - -#, python-format -msgid "Change %s" -msgstr "Endre %s" - -#, python-format -msgid "View %s" -msgstr "Se %s" - -msgid "Database error" -msgstr "Databasefeil" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ble endret." -msgstr[1] "%(count)s %(name)s ble endret." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s valgt" -msgstr[1] "Alle %(total_count)s valgt" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 av %(cnt)s valgt" - -#, python-format -msgid "Change history: %s" -msgstr "Endringshistorikk: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Sletting av %(class_name)s «%(instance)s» krever sletting av følgende " -"beskyttede relaterte objekter: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administrasjonsside" - -msgid "Django administration" -msgstr "Django-administrasjon" - -msgid "Site administration" -msgstr "Nettstedsadministrasjon" - -msgid "Log in" -msgstr "Logg inn" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-administrasjon" - -msgid "Page not found" -msgstr "Fant ikke siden" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Beklager, men siden du spør etter finnes ikke." - -msgid "Home" -msgstr "Hjem" - -msgid "Server error" -msgstr "Tjenerfeil" - -msgid "Server error (500)" -msgstr "Tjenerfeil (500)" - -msgid "Server Error (500)" -msgstr "Tjenerfeil (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Det har oppstått en feil. Feilen er blitt rapportert til administrator via e-" -"post, og vil bli fikset snart. Takk for din tålmodighet." - -msgid "Run the selected action" -msgstr "Utfør den valgte handlingen" - -msgid "Go" -msgstr "Gå" - -msgid "Click here to select the objects across all pages" -msgstr "Trykk her for å velge samtlige objekter fra alle sider" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Velg alle %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Nullstill valg" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeller i %(name)s-applikasjonen" - -msgid "Add" -msgstr "Legg til" - -msgid "View" -msgstr "Se" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har ikke tillatelse til å vise eller endre noe." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Skriv først inn brukernavn og passord. Deretter vil du få mulighet til å " -"endre flere brukerinnstillinger." - -msgid "Enter a username and password." -msgstr "Skriv inn brukernavn og passord." - -msgid "Change password" -msgstr "Endre passord" - -msgid "Please correct the error below." -msgstr "Vennligst korriger feilen under." - -msgid "Please correct the errors below." -msgstr "Vennligst korriger feilene under." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Skriv inn et nytt passord for brukeren %(username)s." - -msgid "Welcome," -msgstr "Velkommen," - -msgid "View site" -msgstr "Vis nettsted" - -msgid "Documentation" -msgstr "Dokumentasjon" - -msgid "Log out" -msgstr "Logg ut" - -#, python-format -msgid "Add %(name)s" -msgstr "Legg til ny %(name)s" - -msgid "History" -msgstr "Historikk" - -msgid "View on site" -msgstr "Vis på nettsted" - -msgid "Filter" -msgstr "Filtrering" - -msgid "Clear all filters" -msgstr "Fjern alle filtre" - -msgid "Remove from sorting" -msgstr "Fjern fra sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteringsprioritet: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Slå av og på sortering" - -msgid "Delete" -msgstr "Slett" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Om du sletter %(object_name)s «%(escaped_object)s», vil også relaterte " -"objekter slettes, men du har ikke tillatelse til å slette følgende " -"objekttyper:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Sletting av %(object_name)s «%(escaped_object)s» krever sletting av følgende " -"beskyttede relaterte objekter:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Er du sikker på at du vil slette %(object_name)s «%(escaped_object)s»? Alle " -"de følgende relaterte objektene vil bli slettet:" - -msgid "Objects" -msgstr "Objekter" - -msgid "Yes, I’m sure" -msgstr "Ja, jeg er sikker" - -msgid "No, take me back" -msgstr "Nei, ta meg tilbake" - -msgid "Delete multiple objects" -msgstr "Slett flere objekter" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Sletting av det valgte %(objects_name)s ville resultere i sletting av " -"relaterte objekter, men kontoen din har ikke tillatelse til å slette " -"følgende objekttyper:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Sletting av det valgte %(objects_name)s ville kreve sletting av følgende " -"beskyttede relaterte objekter:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Er du sikker på vil slette det valgte %(objects_name)s? De følgende " -"objektene og deres relaterte objekter vil bli slettet:" - -msgid "Delete?" -msgstr "Slette?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Etter %(filter_title)s " - -msgid "Summary" -msgstr "Oppsummering" - -msgid "Recent actions" -msgstr "Siste handlinger" - -msgid "My actions" -msgstr "Mine handlinger" - -msgid "None available" -msgstr "Ingen tilgjengelige" - -msgid "Unknown content" -msgstr "Ukjent innhold" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Noe er galt med databaseinstallasjonen din. Sørg for at databasetabellene er " -"opprettet og at brukeren har de nødvendige rettighetene." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Du er logget inn som %(username)s, men er ikke autorisert til å få tilgang " -"til denne siden. Ønsker du å logge inn med en annen konto?" - -msgid "Forgotten your password or username?" -msgstr "Glemt brukernavnet eller passordet ditt?" - -msgid "Toggle navigation" -msgstr "Veksle navigasjon" - -msgid "Date/time" -msgstr "Dato/tid" - -msgid "User" -msgstr "Bruker" - -msgid "Action" -msgstr "Handling" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dette objektet har ingen endringshistorikk. Det ble sannsynligvis ikke lagt " -"til på denne administrasjonssiden." - -msgid "Show all" -msgstr "Vis alle" - -msgid "Save" -msgstr "Lagre" - -msgid "Popup closing…" -msgstr "Lukker popup..." - -msgid "Search" -msgstr "Søk" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultat" -msgstr[1] "%(counter)s resultater" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s totalt" - -msgid "Save as new" -msgstr "Lagre som ny" - -msgid "Save and add another" -msgstr "Lagre og legg til ny" - -msgid "Save and continue editing" -msgstr "Lagre og fortsett å redigere" - -msgid "Save and view" -msgstr "Lagre og se" - -msgid "Close" -msgstr "Lukk" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Endre valgt %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Legg til ny %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Slett valgte %(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Takk for i dag." - -msgid "Log in again" -msgstr "Logg inn igjen" - -msgid "Password change" -msgstr "Endre passord" - -msgid "Your password was changed." -msgstr "Ditt passord ble endret." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Av sikkerhetsgrunner må du oppgi ditt gamle passord. Deretter oppgir du det " -"nye passordet ditt to ganger, slik at vi kan kontrollere at det er korrekt." - -msgid "Change my password" -msgstr "Endre passord" - -msgid "Password reset" -msgstr "Nullstill passord" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Passordet ditt er satt. Du kan nå logge inn." - -msgid "Password reset confirmation" -msgstr "Bekreftelse på nullstilt passord" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Oppgi det nye passordet to ganger, for å sikre at det er skrevet korrekt." - -msgid "New password:" -msgstr "Nytt passord:" - -msgid "Confirm password:" -msgstr "Gjenta nytt passord:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Nullstillingslenken er ugyldig, kanskje fordi den allerede har vært brukt. " -"Vennligst nullstill passordet ditt på nytt." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Vi har sendt deg en e-post med instruksjoner for nullstilling av passord, " -"hvis en konto finnes på den e-postadressen du oppga. Du bør motta den om " -"kort tid." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Hvis du ikke mottar en e-post, sjekk igjen at du har oppgitt den adressen du " -"er registrert med og sjekk spam-mappen din." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Du mottar denne e-posten fordi du har bedt om nullstilling av passordet ditt " -"på %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Vennligst gå til følgende side og velg et nytt passord:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Brukernavnet ditt, i tilfelle du har glemt det:" - -msgid "Thanks for using our site!" -msgstr "Takk for at du bruker siden vår!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Hilsen %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Glemt passordet ditt? Oppgi e-postadressen din under, så sender vi deg en e-" -"post med instruksjoner for nullstilling av passord." - -msgid "Email address:" -msgstr "E-postadresse:" - -msgid "Reset my password" -msgstr "Nullstill mitt passord" - -msgid "All dates" -msgstr "Alle datoer" - -#, python-format -msgid "Select %s" -msgstr "Velg %s" - -#, python-format -msgid "Select %s to change" -msgstr "Velg %s du ønsker å endre" - -#, python-format -msgid "Select %s to view" -msgstr "Velg %s å se" - -msgid "Date:" -msgstr "Dato:" - -msgid "Time:" -msgstr "Tid:" - -msgid "Lookup" -msgstr "Oppslag" - -msgid "Currently:" -msgstr "Nåværende:" - -msgid "Change:" -msgstr "Endre:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 6b1d74e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1e6ddb6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,269 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eirik Krogstad , 2014 -# Jannis Leidel , 2011 -# Jon, 2015-2016 -# Jon, 2014 -# Jon, 2020-2021 -# Jon, 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-18 14:20+0000\n" -"Last-Translator: Jon\n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Tilgjengelige %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Dette er listen over tilgjengelige %s. Du kan velge noen ved å markere de i " -"boksen under og så klikke på \"Velg\"-pilen mellom de to boksene." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Skriv i dette feltet for å filtrere ned listen av tilgjengelige %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Velg alle" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klikk for å velge alle %s samtidig" - -msgid "Choose" -msgstr "Velg" - -msgid "Remove" -msgstr "Slett" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valgte %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Dette er listen over valgte %s. Du kan fjerne noen ved å markere de i boksen " -"under og så klikke på \"Fjern\"-pilen mellom de to boksene." - -msgid "Remove all" -msgstr "Fjern alle" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klikk for å fjerne alle valgte %s samtidig" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s av %(cnt)s valgt" -msgstr[1] "%(sel)s av %(cnt)s valgt" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Du har ulagrede endringer i individuelle felter. Hvis du utfører en " -"handling, vil dine ulagrede endringer gå tapt." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Du har valgt en handling, men du har ikke lagret endringene dine i " -"individuelle felter enda. Vennligst trykk OK for å lagre. Du må utføre " -"handlingen på nytt." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Du har valgt en handling, og har ikke gjort noen endringer i individuelle " -"felter. Du ser mest sannsynlig etter Gå-knappen, ikke Lagre-knappen." - -msgid "Now" -msgstr "Nå" - -msgid "Midnight" -msgstr "Midnatt" - -msgid "6 a.m." -msgstr "06:00" - -msgid "Noon" -msgstr "12:00" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Merk: Du er %s time foran server-tid." -msgstr[1] "Merk: Du er %s timer foran server-tid." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Merk: Du er %s time bak server-tid." -msgstr[1] "Merk: Du er %s timer bak server-tid." - -msgid "Choose a Time" -msgstr "Velg et klokkeslett" - -msgid "Choose a time" -msgstr "Velg et klokkeslett" - -msgid "Cancel" -msgstr "Avbryt" - -msgid "Today" -msgstr "I dag" - -msgid "Choose a Date" -msgstr "Velg en dato" - -msgid "Yesterday" -msgstr "I går" - -msgid "Tomorrow" -msgstr "I morgen" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "O" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" - -msgid "Show" -msgstr "Vis" - -msgid "Hide" -msgstr "Skjul" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index d104714..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index ab9e55a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,688 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Sagar Chalise , 2011 -# Santosh Purbey , 2020 -# Shrawan Poudel , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-22 06:50+0000\n" -"Last-Translator: Shrawan Poudel \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s छानिएको मेट्नुहोस" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "सफलतापूर्वक मेटियो %(count)d %(items)s ।" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s मेट्न सकिएन " - -msgid "Are you sure?" -msgstr "के तपाई पक्का हुनुहुन्छ ?" - -msgid "Administration" -msgstr "प्रशासन " - -msgid "All" -msgstr "सबै" - -msgid "Yes" -msgstr "हो" - -msgid "No" -msgstr "होइन" - -msgid "Unknown" -msgstr "अज्ञात" - -msgid "Any date" -msgstr "कुनै मिति" - -msgid "Today" -msgstr "आज" - -msgid "Past 7 days" -msgstr "पूर्व ७ दिन" - -msgid "This month" -msgstr "यो महिना" - -msgid "This year" -msgstr "यो साल" - -msgid "No date" -msgstr "मिति छैन" - -msgid "Has date" -msgstr "मिति छ" - -msgid "Empty" -msgstr "खाली" - -msgid "Not empty" -msgstr "खाली छैन" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"कृपया स्टाफ खाताको लागि सही %(username)s र पासवर्ड राख्नु होस । दुवै खाली ठाउँ केस " -"सेन्सिटिव हुन सक्छन् ।" - -msgid "Action:" -msgstr "कार्य:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "अर्को %(verbose_name)s थप्नुहोस ।" - -msgid "Remove" -msgstr "हटाउनुहोस" - -msgid "Addition" -msgstr "थप" - -msgid "Change" -msgstr "फेर्नुहोस" - -msgid "Deletion" -msgstr "हटाइयो" - -msgid "action time" -msgstr "कार्य समय" - -msgid "user" -msgstr "प्रयोग कर्ता" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "वस्तु परिचय" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "एक्सन फ्ल्याग" - -msgid "change message" -msgstr "सन्देश परिवर्तन गर्नुहोस" - -msgid "log entry" -msgstr "लग" - -msgid "log entries" -msgstr "लगहरु" - -#, python-format -msgid "Added “%(object)s”." -msgstr "थपियो “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "बदलियो “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "हटाईयो “%(object)s.”" - -msgid "LogEntry Object" -msgstr "लग ईन्ट्री वस्तु" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "थपियो  {name} “{object}”." - -msgid "Added." -msgstr "थपिएको छ ।" - -msgid "and" -msgstr "र" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "कुनै फाँट फेरिएन ।" - -msgid "None" -msgstr "शुन्य" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "तपाईं तल फेरि सम्पादन गर्न सक्नुहुन्छ।" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "कार्य गर्नका निम्ति वस्तु छान्नु पर्दछ । कुनैपनि छस्तु छानिएको छैन । " - -msgid "No action selected." -msgstr "कार्य छानिएको छैन ।" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s थप्नुहोस" - -#, python-format -msgid "Change %s" -msgstr "%s परिवर्तित ।" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "डाटाबेस त्रुटि" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s सफलतापूर्वक परिवर्तन भयो ।" -msgstr[1] "%(count)s %(name)sहरु सफलतापूर्वक परिवर्तन भयो ।" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s चयन भयो" -msgstr[1] "सबै %(total_count)s चयन भयो" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s को ० चयन गरियो" - -#, python-format -msgid "Change history: %s" -msgstr "इतिहास फेर्नुहोस : %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ज्याङ्गो साइट प्रशासन" - -msgid "Django administration" -msgstr "ज्याङ्गो प्रशासन" - -msgid "Site administration" -msgstr "साइट प्रशासन" - -msgid "Log in" -msgstr "लगिन" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "पृष्ठ भेटिएन" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "हामी क्षमाप्रार्थी छौं, तर अनुरोध गरिएको पृष्ठ फेला पार्न सकिएन।" - -msgid "Home" -msgstr "गृह" - -msgid "Server error" -msgstr "सर्भर त्रुटि" - -msgid "Server error (500)" -msgstr "सर्भर त्रुटि (५००)" - -msgid "Server Error (500)" -msgstr "सर्भर त्रुटि (५००)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"त्यहाँ त्रुटि रहेको छ। यो ईमेल मार्फत साइट प्रशासकहरूलाई सूचित गरिएको छ र तुरुन्तै ठिक " -"गर्नुपर्नेछ। तपाईको धैर्यताको लागि धन्यबाद।" - -msgid "Run the selected action" -msgstr "छानिएको कार्य गर्नुहोस ।" - -msgid "Go" -msgstr "बढ्नुहोस" - -msgid "Click here to select the objects across all pages" -msgstr "सबै पृष्ठभरमा वस्तु छान्न यहाँ थिच्नुहोस ।" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "%(total_count)s %(module_name)s सबै छान्नुहोस " - -msgid "Clear selection" -msgstr "चुनेको कुरा हटाउनुहोस ।" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s एप्लिकेसनमा भएको मोडेलहरु" - -msgid "Add" -msgstr "थप्नुहोस " - -msgid "View" -msgstr "" - -msgid "You don’t have permission to view or edit anything." -msgstr "तपाईंसँग केहि पनि हेर्न वा सम्पादन गर्न अनुमति छैन।" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"पहिले, प्रयोगकर्ता नाम र पासवर्ड प्रविष्ट गर्नुहोस्। त्यसो भए, तपाई बढि उपयोगकर्ता " -"विकल्पहरू सम्पादन गर्न सक्षम हुनुहुनेछ।" - -msgid "Enter a username and password." -msgstr "प्रयोगकर्ता नाम र पासवर्ड राख्नुहोस।" - -msgid "Change password" -msgstr "पासवर्ड फेर्नुहोस " - -msgid "Please correct the error below." -msgstr "कृपया तल त्रुटि सुधार गर्नुहोस्।" - -msgid "Please correct the errors below." -msgstr "कृपया तलका त्रुटी सुधार्नु होस ।" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "प्रयोगकर्ता %(username)s को लागि नयाँ पासवर्ड राख्नुहोस ।" - -msgid "Welcome," -msgstr "स्वागतम्" - -msgid "View site" -msgstr "साइट हेर्नु होस ।" - -msgid "Documentation" -msgstr "विस्तृत विवरण" - -msgid "Log out" -msgstr "लग आउट" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s थप्नुहोस" - -msgid "History" -msgstr "इतिहास" - -msgid "View on site" -msgstr "साइटमा हेर्नुहोस" - -msgid "Filter" -msgstr "छान्नुहोस" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "मेट्नुहोस" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "वहु वस्तुहरु मेट्नुहोस ।" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "%(objects_name)s " - -msgid "Delete?" -msgstr "मेट्नुहुन्छ ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s द्वारा" - -msgid "Summary" -msgstr "" - -msgid "Recent actions" -msgstr "भर्खरका कार्यहरू" - -msgid "My actions" -msgstr "मेरो कार्यहरू" - -msgid "None available" -msgstr "कुनै पनि उपलब्ध छैन ।" - -msgid "Unknown content" -msgstr "अज्ञात सामग्री" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"तपाईंको डाटाबेस स्थापनामा केहि गलत छ। निश्चित गर्नुहोस् कि उपयुक्त डाटाबेस टेबलहरू सिर्जना " -"गरिएको छ, र यो सुनिश्चित गर्नुहोस् कि उपयुक्त डाटाबेस उपयुक्त प्रयोगकर्ताद्वारा पढ्न योग्य " -"छ।" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"तपाईं यस %(username)s रूपमा प्रमाणिकरण हुनुहुन्छ, तर यस पृष्ठ पहुँच गर्न अधिकृत हुनुहुन्न। के " -"तपाइँ बिभिन्न खातामा लगईन गर्न चाहानुहुन्छ?" - -msgid "Forgotten your password or username?" -msgstr "पासवर्ड अथवा प्रयोगकर्ता नाम भुल्नुभयो ।" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "मिति/समय" - -msgid "User" -msgstr "प्रयोगकर्ता" - -msgid "Action" -msgstr "कार्य:" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "सबै देखाउनुहोस" - -msgid "Save" -msgstr "बचत गर्नुहोस" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "खोज्नुहोस" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s नतिजा" -msgstr[1] "%(counter)s नतिजाहरु" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "जम्मा %(full_result_count)s" - -msgid "Save as new" -msgstr "नयाँ रुपमा बचत गर्नुहोस" - -msgid "Save and add another" -msgstr "बचत गरेर अर्को थप्नुहोस" - -msgid "Save and continue editing" -msgstr "बचत गरेर संशोधन जारी राख्नुहोस" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "पुन: लगिन गर्नुहोस" - -msgid "Password change" -msgstr "पासवर्ड फेरबदल" - -msgid "Your password was changed." -msgstr "तपाइको पासवर्ड फेरिएको छ ।" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "मेरो पासवर्ड फेर्नुहोस " - -msgid "Password reset" -msgstr "पासवर्डपून: राख्नुहोस । " - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "तपाइको पासवर्ड राखियो । कृपया लगिन गर्नुहोस ।" - -msgid "Password reset confirmation" -msgstr "पासवर्ड पुनर्स्थापना पुष्टि" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "ठीक तरिकाले राखिएको पुष्टि गर्न कृपया नयाँ पासवर्ड दोहोर्याएर राख्नुहोस ।" - -msgid "New password:" -msgstr "नयाँ पासवर्ड :" - -msgid "Confirm password:" -msgstr "पासवर्ड पुष्टि:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "पासवर्ड पुनर्स्थापना प्रयोग भइसकेको छ । कृपया नयाँ पासवर्ड रिसेट माग्नुहोस ।" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -" %(site_name)s को लागि तपाइले पासवर्ड पुन: राख्न आग्रह गरेको हुनाले ई-मेल पाउनुहुदैंछ । " - -msgid "Please go to the following page and choose a new password:" -msgstr "कृपया उक्त पृष्ठमा जानुहोस र नयाँ पासवर्ड राख्नुहोस :" - -msgid "Your username, in case you’ve forgotten:" -msgstr "तपाईंको प्रयोगकर्ता नाम, यदि तपाईंले बिर्सनुभयो भने:" - -msgid "Thanks for using our site!" -msgstr "हाम्रो साइट प्रयोग गरेकोमा धन्यवाद" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s टोली" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"तपाईँको पासवर्ड बिर्सनुभयो? तल तपाईंको ईमेल ठेगाना राख्नुहोस् र हामी नयाँ सेट गर्न ईमेल " -"निर्देशनहरू दिनेछौं।" - -msgid "Email address:" -msgstr "ई-मेल ठेगाना :" - -msgid "Reset my password" -msgstr "मेरो पासवर्ड पुन: राख्नुहोस ।" - -msgid "All dates" -msgstr "सबै मिति" - -#, python-format -msgid "Select %s" -msgstr "%s छान्नुहोस" - -#, python-format -msgid "Select %s to change" -msgstr "%s परिवर्तन गर्न छान्नुहोस ।" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "मिति:" - -msgid "Time:" -msgstr "समय:" - -msgid "Lookup" -msgstr "खोज तलास" - -msgid "Currently:" -msgstr "अहिले :" - -msgid "Change:" -msgstr "फेर्नु होस :" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 8208857..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po deleted file mode 100644 index d55bd9f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,213 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Paras Nath Chaudhary , 2012 -# Sagar Chalise , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-10-07 02:46+0000\n" -"Last-Translator: Sagar Chalise \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "उपलब्ध %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"यो उपलब्ध %s को सुची हो। तपाईंले यी मध्य केही बक्सबाट चयन गरी बक्स बीच्को \"छान्नुहोस " -"\" तीरमा क्लिक गरी छान्नसक्नुहुन्छ । " - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr " उपलब्ध %s को सुचिबाट छान्न यो बक्समा टाइप गर्नुहोस " - -msgid "Filter" -msgstr "छान्नुहोस" - -msgid "Choose all" -msgstr "सबै छान्नुहोस " - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "एकै क्लिकमा सबै %s छान्नुहोस " - -msgid "Choose" -msgstr "छान्नुहोस " - -msgid "Remove" -msgstr "हटाउनुहोस" - -#, javascript-format -msgid "Chosen %s" -msgstr "छानिएको %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"यो छानिएका %s को सुची हो । तपाईंले यी मध्य केही बक्सबाट चयन गरी बक्स बीच्को " -"\"हटाउनुहोस\" तीरमा क्लिक गरी हटाउन सक्नुहुन्छ । " - -msgid "Remove all" -msgstr "सबै हटाउनुहोस " - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "एकै क्लिकमा सबै छानिएका %s हटाउनुहोस ।" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s को %(sel)s चयन गरियो" -msgstr[1] "%(cnt)s को %(sel)s चयन गरियो" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "तपाइको फेरबदल बचत भएको छैन । कार्य भएमा बचत नभएका फेरबदल हराउने छन् ।" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"तपाइले कार्य छाने पनि फेरबदलहरु बचत गर्नु भएको छैन । कृपया बचत गर्न हुन्छ थिच्नुहोस । कार्य " -"पुन: सञ्चालन गर्नुपर्नेछ ।" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"तपाइले कार्य छाने पनि फाँटहरुमा फेरबदलहरु गर्नु भएको छैन । बचत गर्नु भन्दा पनि अघि बढ्नुहोस " -"।" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "सूचना: तपाईँ सर्भर समय भन्दा %s घण्टा अगाडि हुनुहुन्छ ।" -msgstr[1] "सूचना: तपाईँ सर्भर समय भन्दा %s घण्टा अगाडि हुनुहुन्छ ।" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "सूचना: तपाईँ सर्भर समय भन्दा %s घण्टा पछाडि हुनुहुन्छ ।" -msgstr[1] "सूचना: तपाईँ सर्भर समय भन्दा %s घण्टा पछाडि हुनुहुन्छ ।" - -msgid "Now" -msgstr "यतिखेर" - -msgid "Choose a Time" -msgstr "समय छान्नु होस ।" - -msgid "Choose a time" -msgstr "समय चयन गर्नुहोस" - -msgid "Midnight" -msgstr "मध्यरात" - -msgid "6 a.m." -msgstr "बिहान ६ बजे" - -msgid "Noon" -msgstr "मध्यान्ह" - -msgid "6 p.m." -msgstr "बेलुकी ६ बजे" - -msgid "Cancel" -msgstr "रद्द गर्नुहोस " - -msgid "Today" -msgstr "आज" - -msgid "Choose a Date" -msgstr "मिति छान्नु होस ।" - -msgid "Yesterday" -msgstr "हिजो" - -msgid "Tomorrow" -msgstr "भोलि" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "देखाउनुहोस " - -msgid "Hide" -msgstr "लुकाउनुहोस " diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index b2181e2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index ee971dd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,799 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bas Peschier , 2013 -# Claude Paroz , 2017 -# Evelijn Saaltink , 2016 -# Harro van der Klauw , 2012 -# Ilja Maas , 2015 -# Jannis Leidel , 2011 -# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2011-2012 -# dokterbob , 2015 -# Meteor0id, 2019-2020 -# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2014-2015 -# Tino de Bruijn , 2011 -# Tonnes , 2017,2019-2020,2022-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: Tonnes , 2017,2019-2020,2022-2024\n" -"Language-Team: Dutch (http://app.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Geselecteerde %(verbose_name_plural)s verwijderen" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s met succes verwijderd." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s kan niet worden verwijderd " - -msgid "Are you sure?" -msgstr "Weet u het zeker?" - -msgid "Administration" -msgstr "Beheer" - -msgid "All" -msgstr "Alle" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nee" - -msgid "Unknown" -msgstr "Onbekend" - -msgid "Any date" -msgstr "Elke datum" - -msgid "Today" -msgstr "Vandaag" - -msgid "Past 7 days" -msgstr "Afgelopen zeven dagen" - -msgid "This month" -msgstr "Deze maand" - -msgid "This year" -msgstr "Dit jaar" - -msgid "No date" -msgstr "Geen datum" - -msgid "Has date" -msgstr "Heeft datum" - -msgid "Empty" -msgstr "Leeg" - -msgid "Not empty" -msgstr "Niet leeg" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Voer de correcte %(username)s en wachtwoord voor een stafaccount in. Let op " -"dat beide velden hoofdlettergevoelig zijn." - -msgid "Action:" -msgstr "Actie:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Nog een %(verbose_name)s toevoegen" - -msgid "Remove" -msgstr "Verwijderen" - -msgid "Addition" -msgstr "Toevoeging" - -msgid "Change" -msgstr "Wijzigen" - -msgid "Deletion" -msgstr "Verwijdering" - -msgid "action time" -msgstr "actietijd" - -msgid "user" -msgstr "gebruiker" - -msgid "content type" -msgstr "inhoudstype" - -msgid "object id" -msgstr "object-id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "object-repr" - -msgid "action flag" -msgstr "actievlag" - -msgid "change message" -msgstr "wijzigingsbericht" - -msgid "log entry" -msgstr "logboekvermelding" - -msgid "log entries" -msgstr "logboekvermeldingen" - -#, python-format -msgid "Added “%(object)s”." -msgstr "‘%(object)s’ toegevoegd." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "‘%(object)s’ gewijzigd - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "‘%(object)s’ verwijderd." - -msgid "LogEntry Object" -msgstr "LogEntry-object" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} ‘{object}’ toegevoegd." - -msgid "Added." -msgstr "Toegevoegd." - -msgid "and" -msgstr "en" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} voor {name} ‘{object}’ gewijzigd." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} gewijzigd." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} ‘{object}’ verwijderd." - -msgid "No fields changed." -msgstr "Geen velden gewijzigd." - -msgid "None" -msgstr "Geen" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Houd ‘Control’, of ‘Command’ op een Mac, ingedrukt om meerdere items te " -"selecteren." - -msgid "Select this object for an action - {}" -msgstr "Selecteer dit object voor een actie - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "De {name} ‘{obj}’ is met succes toegevoegd." - -msgid "You may edit it again below." -msgstr "U kunt deze hieronder weer bewerken." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"De {name} ‘{obj}’ is met succes toegevoegd. U kunt hieronder nog een {name} " -"toevoegen." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"De {name} ‘{obj}’ is met succes gewijzigd. U kunt deze hieronder nogmaals " -"bewerken." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"De {name} ‘{obj}’ is met succes gewijzigd. U kunt hieronder nog een {name} " -"toevoegen." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "De {name} ‘{obj}’ is met succes gewijzigd." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Er moeten items worden geselecteerd om acties op uit te voeren. Er zijn geen " -"items gewijzigd." - -msgid "No action selected." -msgstr "Geen actie geselecteerd." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "De %(name)s ‘%(obj)s’ is met succes verwijderd." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s met ID ‘%(key)s’ bestaat niet. Misschien is deze verwijderd?" - -#, python-format -msgid "Add %s" -msgstr "%s toevoegen" - -#, python-format -msgid "Change %s" -msgstr "%s wijzigen" - -#, python-format -msgid "View %s" -msgstr "%s weergeven" - -msgid "Database error" -msgstr "Databasefout" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s is met succes gewijzigd." -msgstr[1] "%(count)s %(name)s zijn met succes gewijzigd." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s geselecteerd" -msgstr[1] "Alle %(total_count)s geselecteerd" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 van de %(cnt)s geselecteerd" - -#, python-format -msgid "Change history: %s" -msgstr "Wijzigingsgeschiedenis: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Het verwijderen van %(class_name)s %(instance)s vereist het verwijderen van " -"de volgende beschermde gerelateerde objecten: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django-websitebeheer" - -msgid "Django administration" -msgstr "Django-beheer" - -msgid "Site administration" -msgstr "Websitebeheer" - -msgid "Log in" -msgstr "Aanmelden" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-beheer" - -msgid "Page not found" -msgstr "Pagina niet gevonden" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Het spijt ons, maar de opgevraagde pagina kon niet worden gevonden." - -msgid "Home" -msgstr "Voorpagina" - -msgid "Server error" -msgstr "Serverfout" - -msgid "Server error (500)" -msgstr "Serverfout (500)" - -msgid "Server Error (500)" -msgstr "Serverfout (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Er heeft zich een fout voorgedaan. Dit is via e-mail bij de " -"websitebeheerders gemeld en zou snel verholpen moeten zijn. Bedankt voor uw " -"geduld." - -msgid "Run the selected action" -msgstr "De geselecteerde actie uitvoeren" - -msgid "Go" -msgstr "Uitvoeren" - -msgid "Click here to select the objects across all pages" -msgstr "Klik hier om alle objecten op alle pagina's te selecteren" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Alle %(total_count)s %(module_name)s selecteren" - -msgid "Clear selection" -msgstr "Selectie wissen" - -msgid "Breadcrumbs" -msgstr "Broodkruimels" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modellen in de %(name)s-toepassing" - -msgid "Add" -msgstr "Toevoegen" - -msgid "View" -msgstr "Weergeven" - -msgid "You don’t have permission to view or edit anything." -msgstr "U hebt geen rechten om iets te bekijken of te bewerken." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Vul allereerst een gebruikersnaam en wachtwoord in. Daarna kunt u meer " -"gebruikersopties bewerken." - -msgid "Enter a username and password." -msgstr "Voer een gebruikersnaam en wachtwoord in." - -msgid "Change password" -msgstr "Wachtwoord wijzigen" - -msgid "Set password" -msgstr "Wachtwoord instellen" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Corrigeer de onderstaande fout." -msgstr[1] "Corrigeer de onderstaande fouten." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Voer een nieuw wachtwoord in voor de gebruiker %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Deze actie schakelt op wachtwoord gebaseerde authenticatie in voor deze gebruiker." - -msgid "Disable password-based authentication" -msgstr "Op wachtwoord gebaseerde authenticatie uitschakelen" - -msgid "Enable password-based authentication" -msgstr "Op wachtwoord gebaseerde authenticatie inschakelen" - -msgid "Skip to main content" -msgstr "Naar hoofdinhoud" - -msgid "Welcome," -msgstr "Welkom," - -msgid "View site" -msgstr "Website bekijken" - -msgid "Documentation" -msgstr "Documentatie" - -msgid "Log out" -msgstr "Afmelden" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s toevoegen" - -msgid "History" -msgstr "Geschiedenis" - -msgid "View on site" -msgstr "Weergeven op website" - -msgid "Filter" -msgstr "Filter" - -msgid "Hide counts" -msgstr "Aantallen verbergen" - -msgid "Show counts" -msgstr "Aantallen tonen" - -msgid "Clear all filters" -msgstr "Alle filters wissen" - -msgid "Remove from sorting" -msgstr "Verwijderen uit sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteerprioriteit: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sortering aan/uit" - -msgid "Toggle theme (current theme: auto)" -msgstr "Thema wisselen (huidige thema: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Thema wisselen (huidige thema: licht)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Thema wisselen (huidige thema: donker)" - -msgid "Delete" -msgstr "Verwijderen" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Het verwijderen van %(object_name)s '%(escaped_object)s' zou ook " -"gerelateerde objecten verwijderen, maar uw account heeft geen rechten om de " -"volgende typen objecten te verwijderen:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Het verwijderen van %(object_name)s '%(escaped_object)s' vereist het " -"verwijderen van de volgende gerelateerde objecten:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Weet u zeker dat u %(object_name)s '%(escaped_object)s' wilt verwijderen? " -"Alle volgende gerelateerde objecten worden verwijderd:" - -msgid "Objects" -msgstr "Objecten" - -msgid "Yes, I’m sure" -msgstr "Ja, ik weet het zeker" - -msgid "No, take me back" -msgstr "Nee, teruggaan" - -msgid "Delete multiple objects" -msgstr "Meerdere objecten verwijderen" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Het verwijderen van de geselecteerde %(objects_name)s zou ook gerelateerde " -"objecten verwijderen, maar uw account heeft geen rechten om de volgende " -"typen objecten te verwijderen:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Het verwijderen van de geselecteerde %(objects_name)s vereist het " -"verwijderen van de volgende beschermde gerelateerde objecten:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Weet u zeker dat u de geselecteerde %(objects_name)s wilt verwijderen? Alle " -"volgende objecten en hun aanverwante items zullen worden verwijderd:" - -msgid "Delete?" -msgstr "Verwijderen?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Op %(filter_title)s " - -msgid "Summary" -msgstr "Samenvatting" - -msgid "Recent actions" -msgstr "Recente acties" - -msgid "My actions" -msgstr "Mijn acties" - -msgid "None available" -msgstr "Geen beschikbaar" - -msgid "Added:" -msgstr "Toegevoegd:" - -msgid "Changed:" -msgstr "Gewijzigd:" - -msgid "Deleted:" -msgstr "Verwijderd:" - -msgid "Unknown content" -msgstr "Onbekende inhoud" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Er is iets mis met de installatie van uw database. Zorg ervoor dat de juiste " -"databasetabellen zijn aangemaakt en dat de database voor de juiste gebruiker " -"leesbaar is." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"U bent geverifieerd als %(username)s, maar niet bevoegd om deze pagina te " -"bekijken. Wilt u zich aanmelden bij een andere account?" - -msgid "Forgotten your password or username?" -msgstr "Wachtwoord of gebruikersnaam vergeten?" - -msgid "Toggle navigation" -msgstr "Navigatie aan/uit" - -msgid "Sidebar" -msgstr "Zijbalk" - -msgid "Start typing to filter…" -msgstr "Begin met typen om te filteren…" - -msgid "Filter navigation items" -msgstr "Navigatie-items filteren" - -msgid "Date/time" -msgstr "Datum/tijd" - -msgid "User" -msgstr "Gebruiker" - -msgid "Action" -msgstr "Actie" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "vermelding" -msgstr[1] "vermeldingen" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dit object heeft geen wijzigingsgeschiedenis. Het is mogelijk niet via de " -"beheerwebsite toegevoegd." - -msgid "Show all" -msgstr "Alles tonen" - -msgid "Save" -msgstr "Opslaan" - -msgid "Popup closing…" -msgstr "Pop-up sluiten…" - -msgid "Search" -msgstr "Zoeken" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultaat" -msgstr[1] "%(counter)s resultaten" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s totaal" - -msgid "Save as new" -msgstr "Opslaan als nieuw item" - -msgid "Save and add another" -msgstr "Opslaan en nieuwe toevoegen" - -msgid "Save and continue editing" -msgstr "Opslaan en opnieuw bewerken" - -msgid "Save and view" -msgstr "Opslaan en weergeven" - -msgid "Close" -msgstr "Sluiten" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Geselecteerde %(model)s wijzigen" - -#, python-format -msgid "Add another %(model)s" -msgstr "Nog een %(model)s toevoegen" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Geselecteerde %(model)s verwijderen" - -#, python-format -msgid "View selected %(model)s" -msgstr "Geselecteerde %(model)s weergeven" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Bedankt voor het vandaag wat tijd besteden aan de website." - -msgid "Log in again" -msgstr "Opnieuw aanmelden" - -msgid "Password change" -msgstr "Wachtwoordwijziging" - -msgid "Your password was changed." -msgstr "Uw wachtwoord is gewijzigd." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Voer omwille van beveiliging uw oude en twee keer uw nieuwe wachtwoord in, " -"zodat we kunnen controleren of u geen typefouten hebt gemaakt." - -msgid "Change my password" -msgstr "Mijn wachtwoord wijzigen" - -msgid "Password reset" -msgstr "Wachtwoord hersteld" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Uw wachtwoord is ingesteld. U kunt nu verdergaan en zich aanmelden." - -msgid "Password reset confirmation" -msgstr "Bevestiging wachtwoord herstellen" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Voer het nieuwe wachtwoord twee keer in, zodat we kunnen controleren of er " -"geen typefouten zijn gemaakt." - -msgid "New password:" -msgstr "Nieuw wachtwoord:" - -msgid "Confirm password:" -msgstr "Bevestig wachtwoord:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"De link voor het herstellen van het wachtwoord is ongeldig, waarschijnlijk " -"omdat de link al eens is gebruikt. Vraag opnieuw een wachtwoord aan." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"We hebben u instructies gestuurd voor het instellen van uw wachtwoord, als " -"er een account bestaat met het door u ingevoerde e-mailadres. U zou deze " -"straks moeten ontvangen." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Als u geen e-mail ontvangt, controleer dan of u het e-mailadres hebt " -"ingevoerd waarmee u zich hebt geregistreerd, en controleer uw spam-map." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"U ontvangt deze e-mail, omdat u een aanvraag voor opnieuw instellen van het " -"wachtwoord voor uw account op %(site_name)s hebt gedaan." - -msgid "Please go to the following page and choose a new password:" -msgstr "Ga naar de volgende pagina en kies een nieuw wachtwoord:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Uw gebruikersnaam, mocht u deze vergeten zijn:" - -msgid "Thanks for using our site!" -msgstr "Bedankt voor het gebruik van onze website!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Het %(site_name)s-team" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Wachtwoord vergeten? Vul hieronder uw e-mailadres in, en we sturen " -"instructies voor het instellen van een nieuw wachtwoord." - -msgid "Email address:" -msgstr "E-mailadres:" - -msgid "Reset my password" -msgstr "Mijn wachtwoord opnieuw instellen" - -msgid "Select all objects on this page for an action" -msgstr "Selecteer alle objecten op deze pagina voor een actie" - -msgid "All dates" -msgstr "Alle datums" - -#, python-format -msgid "Select %s" -msgstr "Selecteer %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selecteer %s om te wijzigen" - -#, python-format -msgid "Select %s to view" -msgstr "Selecteer %s om te bekijken" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Tijd:" - -msgid "Lookup" -msgstr "Opzoeken" - -msgid "Currently:" -msgstr "Huidig:" - -msgid "Change:" -msgstr "Wijzigen:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 69485a2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po deleted file mode 100644 index 8c7a4ba..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,334 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bouke Haarsma , 2013 -# Evelijn Saaltink , 2016 -# Harro van der Klauw , 2012 -# Ilja Maas , 2015 -# Jannis Leidel , 2011 -# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2011-2012 -# Meteor0id, 2019-2020 -# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2015 -# Tonnes , 2019-2020,2022-2023 -# wunki , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Tonnes , 2019-2020,2022-2023\n" -"Language-Team: Dutch (http://app.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Beschikbare %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Dit is de lijst met beschikbare %s. U kunt er een aantal kiezen door ze in " -"het vak hieronder te selecteren en daarna op de pijl 'Kiezen' tussen de twee " -"vakken te klikken." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Typ in dit vak om de lijst met beschikbare %s te filteren." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Alle kiezen" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klik om alle %s te kiezen." - -msgid "Choose" -msgstr "Kiezen" - -msgid "Remove" -msgstr "Verwijderen" - -#, javascript-format -msgid "Chosen %s" -msgstr "Gekozen %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Dit is de lijst met gekozen %s. U kunt er een aantal verwijderen door ze in " -"het vak hieronder te selecteren en daarna op de pijl 'Verwijderen' tussen de " -"twee vakken te klikken." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Typ in dit vak om de lijst met geselecteerde %s te filteren." - -msgid "Remove all" -msgstr "Alle verwijderen" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klik om alle gekozen %s tegelijk te verwijderen." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s geselecteerde optie niet zichtbaar" -msgstr[1] "%s geselecteerde opties niet zichtbaar" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s van de %(cnt)s geselecteerd" -msgstr[1] "%(sel)s van de %(cnt)s geselecteerd" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"U hebt niet-opgeslagen wijzigingen op afzonderlijke bewerkbare velden. Als u " -"een actie uitvoert, gaan uw wijzigingen verloren." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"U hebt een actie geselecteerd, maar uw wijzigingen in afzonderlijke velden " -"nog niet opgeslagen. Klik op OK om deze op te slaan. U dient de actie " -"opnieuw uit te voeren." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"U hebt een actie geselecteerd, en geen wijzigingen in afzonderlijke velden " -"aangebracht. Waarschijnlijk zoekt u de knop Gaan in plaats van de knop " -"Opslaan." - -msgid "Now" -msgstr "Nu" - -msgid "Midnight" -msgstr "Middernacht" - -msgid "6 a.m." -msgstr "6 uur 's ochtends" - -msgid "Noon" -msgstr "12 uur 's middags" - -msgid "6 p.m." -msgstr "6 uur 's avonds" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Let op: u ligt %s uur voor ten opzichte van de servertijd." -msgstr[1] "Let op: u ligt %s uur voor ten opzichte van de servertijd." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Let op: u ligt %s uur achter ten opzichte van de servertijd." -msgstr[1] "Let op: u ligt %s uur achter ten opzichte van de servertijd." - -msgid "Choose a Time" -msgstr "Kies een tijdstip" - -msgid "Choose a time" -msgstr "Kies een tijd" - -msgid "Cancel" -msgstr "Annuleren" - -msgid "Today" -msgstr "Vandaag" - -msgid "Choose a Date" -msgstr "Kies een datum" - -msgid "Yesterday" -msgstr "Gisteren" - -msgid "Tomorrow" -msgstr "Morgen" - -msgid "January" -msgstr "januari" - -msgid "February" -msgstr "februari" - -msgid "March" -msgstr "maart" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "mei" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "augustus" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mrt" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "mei" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec" - -msgid "Sunday" -msgstr "zondag" - -msgid "Monday" -msgstr "maandag" - -msgid "Tuesday" -msgstr "dinsdag" - -msgid "Wednesday" -msgstr "woensdag" - -msgid "Thursday" -msgstr "donderdag" - -msgid "Friday" -msgstr "vrijdag" - -msgid "Saturday" -msgstr "zaterdag" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "zo" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "ma" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "di" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "wo" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "do" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "vr" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "za" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Z" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "D" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "W" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "D" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Z" - -msgid "Show" -msgstr "Tonen" - -msgid "Hide" -msgstr "Verbergen" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index 779cf09..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index 4a7c846..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,736 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# hgrimelid , 2011-2012 -# Jannis Leidel , 2011 -# jensadne , 2013 -# Sigurd Gartmann , 2012 -# Sivert Olstad, 2021-2022 -# velmont , 2012 -# Vibeke Uthaug, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Slett valgte %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Sletta %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kan ikkje slette %(name)s" - -msgid "Are you sure?" -msgstr "Er du sikker?" - -msgid "Administration" -msgstr "Administrasjon" - -msgid "All" -msgstr "Alle" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nei" - -msgid "Unknown" -msgstr "Ukjend" - -msgid "Any date" -msgstr "Når som helst" - -msgid "Today" -msgstr "I dag" - -msgid "Past 7 days" -msgstr "Siste sju dagar" - -msgid "This month" -msgstr "Denne månaden" - -msgid "This year" -msgstr "I år" - -msgid "No date" -msgstr "Ingen dato" - -msgid "Has date" -msgstr "Har dato" - -msgid "Empty" -msgstr "Tom" - -msgid "Not empty" -msgstr "Ikkje tom" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Oppgje korrekt %(username)s og passord for ein administrasjonsbrukarkonto. " -"Merk at det er skilnad på små og store bokstavar." - -msgid "Action:" -msgstr "Handling:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Opprett ny %(verbose_name)s." - -msgid "Remove" -msgstr "Fjern" - -msgid "Addition" -msgstr "Tillegg" - -msgid "Change" -msgstr "Endre" - -msgid "Deletion" -msgstr "Sletting" - -msgid "action time" -msgstr "tid for handling" - -msgid "user" -msgstr "brukar" - -msgid "content type" -msgstr "innhaldstype" - -msgid "object id" -msgstr "objekt-ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekt repr" - -msgid "action flag" -msgstr "handlingsflagg" - -msgid "change message" -msgstr "endre melding" - -msgid "log entry" -msgstr "logginnlegg" - -msgid "log entries" -msgstr "logginnlegg" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Oppretta “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Endra “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Sletta “%(object)s”." - -msgid "LogEntry Object" -msgstr "LogEntry-objekt" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Oppretta {name} “{object}”." - -msgid "Added." -msgstr "Oppretta." - -msgid "and" -msgstr "og" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Endra {fields} for {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Endra {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Sletta {name} “{object}”." - -msgid "No fields changed." -msgstr "Ingen felt endra." - -msgid "None" -msgstr "Ingen" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Hald nede “Control”, eller “Command” på ein Mac, for å velge meir enn éin." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” vart oppretta." - -msgid "You may edit it again below." -msgstr "Du kan endre det att nedanfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” vart oppretta. Du kan opprette enda ein {name} nedanfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” vart endra. Du kan redigere vidare nedanfor." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} “{obj}” vart oppretta. Du kan redigere vidare nedanfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} “{obj}” vart endra. Du kan opprette enda ein {name} nedanfor." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” vart endra." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Objekt må vere valde for at dei skal kunne utførast handlingar på. Ingen " -"object er endra." - -msgid "No action selected." -msgstr "Inga valt handling." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” vart sletta." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s med ID “%(key)s” eksisterer ikkje. Kanskje den har vorte sletta?" - -#, python-format -msgid "Add %s" -msgstr "Opprett %s" - -#, python-format -msgid "Change %s" -msgstr "Rediger %s" - -#, python-format -msgid "View %s" -msgstr "Sjå %s" - -msgid "Database error" -msgstr "Databasefeil" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s vart endra." -msgstr[1] "%(count)s %(name)s vart endra." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s valde" -msgstr[1] "Alle %(total_count)s valde" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Ingen av %(cnt)s valde" - -#, python-format -msgid "Change history: %s" -msgstr "Endringshistorikk: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Sletting av %(class_name)s «%(instance)s» krev sletting av følgande beskytta " -"relaterte objekt: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administrasjonsside" - -msgid "Django administration" -msgstr "Django-administrasjon" - -msgid "Site administration" -msgstr "Nettstadsadministrasjon" - -msgid "Log in" -msgstr "Logg inn" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-administrasjon" - -msgid "Page not found" -msgstr "Fann ikkje sida" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Sida du spør etter finst ikkje." - -msgid "Home" -msgstr "Heim" - -msgid "Server error" -msgstr "Tenarfeil" - -msgid "Server error (500)" -msgstr "Tenarfeil (500)" - -msgid "Server Error (500)" -msgstr "Tenarfeil (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Det har oppstått ein feil. Det er rapportert til dei som administrerer " -"nettsida med e-mail og burde bli fiksa snarast. Takk for tolmodigheita." - -msgid "Run the selected action" -msgstr "Utfør den valde handlinga" - -msgid "Go" -msgstr "Gå" - -msgid "Click here to select the objects across all pages" -msgstr "Klikk her for å velje objekt på tvers av alle sider" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Velg alle %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Nullstill utval" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modellar i %(name)s-applikasjonen" - -msgid "Add" -msgstr "Opprett" - -msgid "View" -msgstr "Sjå" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har ikkje løyve til å sjå eller redigere noko." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Skriv først inn brukernamn og passord. Deretter vil du få høve til å endre " -"fleire brukarinnstillingar." - -msgid "Enter a username and password." -msgstr "Skriv inn nytt brukarnamn og passord." - -msgid "Change password" -msgstr "Endre passord" - -msgid "Please correct the error below." -msgstr "Korriger feilen under." - -msgid "Please correct the errors below." -msgstr "Korriger feila under." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Skriv inn eit nytt passord for brukaren %(username)s." - -msgid "Welcome," -msgstr "Velkommen," - -msgid "View site" -msgstr "Vis nettstad" - -msgid "Documentation" -msgstr "Dokumentasjon" - -msgid "Log out" -msgstr "Logg ut" - -#, python-format -msgid "Add %(name)s" -msgstr "Opprett %(name)s" - -msgid "History" -msgstr "Historikk" - -msgid "View on site" -msgstr "Vis på nettstad" - -msgid "Filter" -msgstr "Filtrering" - -msgid "Clear all filters" -msgstr "Fjern alle filter" - -msgid "Remove from sorting" -msgstr "Fjern frå sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteringspriorite: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Slår av eller på sortering" - -msgid "Delete" -msgstr "Slett" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Dersom du slettar %(object_name)s '%(escaped_object)s', vil også slette " -"relaterte objekt, men du har ikkje løyve til å slette følgande objekttypar:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Sletting av %(object_name)s '%(escaped_object)s' krevar sletting av " -"følgjande beskytta relaterte objekt:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Er du sikker på at du vil slette %(object_name)s \"%(escaped_object)s\"? " -"Alle dei følgjande relaterte objekta vil bli sletta:" - -msgid "Objects" -msgstr "Objekt" - -msgid "Yes, I’m sure" -msgstr "Ja, eg er sikker" - -msgid "No, take me back" -msgstr "Nei, ta meg attende" - -msgid "Delete multiple objects" -msgstr "Slett fleire objekt" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Sletting av %(objects_name)s vil føre til at relaterte objekt blir sletta, " -"men kontoen din manglar løyve til å slette følgjande objekttypar:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Sletting av %(objects_name)s krevar sletting av følgjande beskytta relaterte " -"objekt:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Er du sikker på at du vil slette dei valgte objekta %(objects_name)s? " -"Følgjande objekt og deira relaterte objekt vil bli sletta:" - -msgid "Delete?" -msgstr "Slette?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Etter %(filter_title)s " - -msgid "Summary" -msgstr "Oppsummering" - -msgid "Recent actions" -msgstr "Siste handlingar" - -msgid "My actions" -msgstr "Mine handlingar" - -msgid "None available" -msgstr "Ingen tilgjengelege" - -msgid "Unknown content" -msgstr "Ukjent innhald" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Noko er gale med databaseinstallasjonen din. Syt for at databasetabellane er " -"oppretta og at brukaren har dei naudsynte løyve." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Du er stadfesta som %(username)s, men er ikkje autentisert til å få tilgang " -"til denne sida. Ynskjer du å logge inn med ein annan konto?" - -msgid "Forgotten your password or username?" -msgstr "Gløymd brukarnamn eller passord?" - -msgid "Toggle navigation" -msgstr "Veksl navigasjon" - -msgid "Start typing to filter…" -msgstr "Begynn å skrive for å filtrere..." - -msgid "Filter navigation items" -msgstr "Filtrer navigasjonselement" - -msgid "Date/time" -msgstr "Dato/tid" - -msgid "User" -msgstr "Brukar" - -msgid "Action" -msgstr "Handling" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dette objektet har ingen endringshistorikk. Det blei sannsynlegvis ikkje " -"oppretta av denne administratoren. " - -msgid "Show all" -msgstr "Vis alle" - -msgid "Save" -msgstr "Lagre" - -msgid "Popup closing…" -msgstr "Lukkar popup…" - -msgid "Search" -msgstr "Søk" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultat" -msgstr[1] "%(counter)s resultat" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s totalt" - -msgid "Save as new" -msgstr "Lagre som ny" - -msgid "Save and add another" -msgstr "Lagre og opprett ny" - -msgid "Save and continue editing" -msgstr "Lagre og hald fram å redigere" - -msgid "Save and view" -msgstr "Lagre og sjå" - -msgid "Close" -msgstr "Lukk" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Endre valt %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Opprett ny %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Slett valde %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Takk for at du brukte litt kvalitetstid på nettsida i dag. " - -msgid "Log in again" -msgstr "Logg inn att" - -msgid "Password change" -msgstr "Endre passord" - -msgid "Your password was changed." -msgstr "Passordet ditt vart endret." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Av sikkerheitsgrunnar må du oppgje det gamle passordet ditt. Oppgje så det " -"nye passordet ditt to gongar, sånn at vi kan kontrollere at det er korrekt." - -msgid "Change my password" -msgstr "Endre passord" - -msgid "Password reset" -msgstr "Nullstill passord" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Passordet ditt er sett. Du kan logge inn." - -msgid "Password reset confirmation" -msgstr "Stadfesting på nullstilt passord" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Oppgje det nye passordet ditt to gonger, for å sikre at du oppgjev det " -"korrekt." - -msgid "New password:" -msgstr "Nytt passord:" - -msgid "Confirm password:" -msgstr "Gjenta nytt passord:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Nullstillingslinken er ugyldig, kanskje fordi den allereie har vore brukt. " -"Nullstill passordet ditt på nytt." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Dersom det eksisterer ein brukarkonto med e-postadressa du skreiv inn vil " -"det bli sendt ein e-post med instruksjonar for å nullstille passordet til " -"den e-postadressa. Du burde motta den snart. " - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Om du ikkje mottar ein e-post, ver vennleg og sørg for at du skreiv inn e-" -"postadressa du er registrert med og sjekk spam-filteret. " - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Du får denne e-posten fordi du har bedt om å nullstille passordet for " -"brukarkontoen din på %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Gå til følgjande side og velg eit nytt passord:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Brukarnamnet ditt, i tilfelle du har gløymt det:" - -msgid "Thanks for using our site!" -msgstr "Takk for at du brukar sida vår!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Helsing %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Gløymt passordet ditt? Oppgje e-postadressa di under, så sender me deg ein e-" -"post med instruksjonar for nullstilling av passord." - -msgid "Email address:" -msgstr "E-postadresse:" - -msgid "Reset my password" -msgstr "Nullstill passordet" - -msgid "All dates" -msgstr "Alle datoar" - -#, python-format -msgid "Select %s" -msgstr "Velg %s" - -#, python-format -msgid "Select %s to change" -msgstr "Velg %s du ønskar å redigere" - -#, python-format -msgid "Select %s to view" -msgstr "Velg %s du ønskar å sjå" - -msgid "Date:" -msgstr "Dato:" - -msgid "Time:" -msgstr "Tid:" - -msgid "Lookup" -msgstr "Oppslag" - -msgid "Currently:" -msgstr "Noverande:" - -msgid "Change:" -msgstr "Endre:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo deleted file mode 100644 index d94421c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po deleted file mode 100644 index 8d4f648..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,266 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# hgrimelid , 2011 -# Jannis Leidel , 2011 -# Sivert Olstad, 2021 -# velmont , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-11-10 23:27+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Tilgjengelege %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Dette er lista over tilgjengelege %s. Du kan velja nokon ved å markera dei i " -"boksen under og so klikka på «Velg»-pila mellom dei to boksane." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Skriv i dette feltet for å filtrera ned lista av tilgjengelege %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Velg alle" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klikk for å velja alle %s samtidig." - -msgid "Choose" -msgstr "Vel" - -msgid "Remove" -msgstr "Slett" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valde %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Dette er lista over valte %s. Du kan fjerna nokon ved å markera dei i boksen " -"under og so klikka på «Fjern»-pila mellom dei to boksane." - -msgid "Remove all" -msgstr "Fjern alle" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klikk for å fjerna alle valte %s samtidig." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s av %(cnt)s vald" -msgstr[1] "%(sel)s av %(cnt)s valde" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Det er endringar som ikkje er lagra i individuelt redigerbare felt. " -"Endringar som ikkje er lagra vil gå tapt." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Du har vald ei handling, men du har framleis ikkje lagra endringar for " -"individuelle felt. Klikk OK for å lagre. Du må gjere handlinga på nytt." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Du har vald ei handling og du har ikkje gjort endringar i individuelle felt. " -"Du ser sannsynlegvis etter Gå vidare-knappen - ikkje Lagre-knappen." - -msgid "Now" -msgstr "No" - -msgid "Midnight" -msgstr "Midnatt" - -msgid "6 a.m." -msgstr "06:00" - -msgid "Noon" -msgstr "12:00" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Merk: Du er %s time framanfor tjenar-tid." -msgstr[1] "Merk: Du er %s timar framanfor tjenar-tid." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Merk: Du er %s time bak tjenar-tid." -msgstr[1] "Merk: Du er %s timar bak tjenar-tid." - -msgid "Choose a Time" -msgstr "Velg eit klokkeslett" - -msgid "Choose a time" -msgstr "Velg eit klokkeslett" - -msgid "Cancel" -msgstr "Avbryt" - -msgid "Today" -msgstr "I dag" - -msgid "Choose a Date" -msgstr "Velg ein dato" - -msgid "Yesterday" -msgstr "I går" - -msgid "Tomorrow" -msgstr "I morgon" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "O" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" - -msgid "Show" -msgstr "Vis" - -msgid "Hide" -msgstr "Skjul" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index dbf509f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index aae9d9c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,665 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s хафт ӕрцыдысты." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Нӕ уайы схафын %(name)s" - -msgid "Are you sure?" -msgstr "Ӕцӕг дӕ фӕнды?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Схафын ӕвзӕрст %(verbose_name_plural)s" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Иууылдӕр" - -msgid "Yes" -msgstr "О" - -msgid "No" -msgstr "Нӕ" - -msgid "Unknown" -msgstr "Ӕнӕбӕрӕг" - -msgid "Any date" -msgstr "Цыфӕнды бон" - -msgid "Today" -msgstr "Абон" - -msgid "Past 7 days" -msgstr "Фӕстаг 7 бон" - -msgid "This month" -msgstr "Ацы мӕй" - -msgid "This year" -msgstr "Ацы аз" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Дӕ хорзӕхӕй, раст кусӕджы аккаунты %(username)s ӕмӕ пароль бафысс. Дӕ сӕры " -"дар уый, ӕмӕ дыууӕ дӕр гӕнӕн ис стыр ӕмӕ гыццыл дамгъӕ ӕвзарой." - -msgid "Action:" -msgstr "Ми:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Бафтауын ӕндӕр %(verbose_name)s" - -msgid "Remove" -msgstr "Схафын" - -msgid "action time" -msgstr "мийы рӕстӕг" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "объекты бӕрӕггӕнӕн" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "объекты хуыз" - -msgid "action flag" -msgstr "мийы флаг" - -msgid "change message" -msgstr "фыстӕг фӕивын" - -msgid "log entry" -msgstr "логы иуӕг" - -msgid "log entries" -msgstr "логы иуӕгтӕ" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Ӕфтыд ӕрцыд \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Ивд ӕрцыд \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Хафт ӕрцыд \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "ЛогыИуӕг Объект" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "ӕмӕ" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Ивд бынат нӕй." - -msgid "None" -msgstr "Никӕцы" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Иуӕгтӕ хъуамӕ ӕвзӕрст уой, цӕмӕй цын исты ми бакӕнай. Ницы иуӕг ӕрцыд ивд." - -msgid "No action selected." -msgstr "Ницы ми у ӕвзӕрст." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" хафт ӕрцыд." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Бафтауын %s" - -#, python-format -msgid "Change %s" -msgstr "Фӕивын %s" - -msgid "Database error" -msgstr "Бӕрӕгдоны рӕдыд" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ивд ӕрцыд." -msgstr[1] "%(count)s %(name)s ивд ӕрцыдысты." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s у ӕвзӕрст" -msgstr[1] "%(total_count)s дӕр иууылдӕр сты ӕвзӕрст" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s-ӕй 0 у ӕвзӕрст" - -#, python-format -msgid "Change history: %s" -msgstr "Ивынты истори: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Django сайты админ" - -msgid "Django administration" -msgstr "Django администраци" - -msgid "Site administration" -msgstr "Сайты администраци" - -msgid "Log in" -msgstr "Бахизын" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Фарс нӕ зыны" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Хатыр, фӕлӕ домд фарс нӕ зыны." - -msgid "Home" -msgstr "Хӕдзар" - -msgid "Server error" -msgstr "Серверы рӕдыд" - -msgid "Server error (500)" -msgstr "Серверы рӕдыд (500)" - -msgid "Server Error (500)" -msgstr "Серверы Рӕдыд (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Рӕдыд разынд. Уый тыххӕй сайты администратормӕ электрон фыстӕг ӕрвыст ӕрцыд " -"ӕмӕ йӕ тагъд сраст кӕндзысты. Бузныг кӕй лӕууыс." - -msgid "Run the selected action" -msgstr "Бакӕнын ӕвзӕрст ми" - -msgid "Go" -msgstr "Бацӕуын" - -msgid "Click here to select the objects across all pages" -msgstr "Ам ныххӕц цӕмӕй алы фарсы объекттӕ равзарын" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Равзарын %(total_count)s %(module_name)s иууылдӕр" - -msgid "Clear selection" -msgstr "Ӕвзӕрст асыгъдӕг кӕнын" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Фыццаг бафысс фӕсномыг ӕмӕ пароль. Стӕй дӕ бон уыдзӕн фылдӕр архайӕджы " -"фадӕттӕ ивын." - -msgid "Enter a username and password." -msgstr "Бафысс фӕсномыг ӕмӕ пароль." - -msgid "Change password" -msgstr "Пароль фӕивын" - -msgid "Please correct the error below." -msgstr "Дӕ хорзӕхӕй, бындӕр цы рӕдыдтытӕ ис, уыдон сраст кӕн." - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Бафысс ног пароль архайӕг %(username)s-ӕн." - -msgid "Welcome," -msgstr "Ӕгас цу," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Документаци" - -msgid "Log out" -msgstr "Рахизын" - -#, python-format -msgid "Add %(name)s" -msgstr "Бафтауын %(name)s" - -msgid "History" -msgstr "Истори" - -msgid "View on site" -msgstr "Сайты фенын" - -msgid "Filter" -msgstr "Фӕрсудзӕн" - -msgid "Remove from sorting" -msgstr "Радӕй айсын" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Рады приоритет: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Рад аивын" - -msgid "Delete" -msgstr "Схафын" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' хафыны тыххӕй баст объекттӕ дӕр хафт " -"ӕрцӕудзысты, фӕлӕ дӕ аккаунтӕн нӕй бар ацы объекты хуызтӕ хафын:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' хафын домы ацы хъахъхъӕд баст объекттӕ " -"хафын дӕр:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ӕцӕг дӕ фӕнды %(object_name)s \"%(escaped_object)s\" схафын? Ацы баст иуӕгтӕ " -"иууылдӕр хафт ӕрцӕудзысты:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "О, ӕцӕг мӕ фӕнды" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Цалдӕр объекты схафын" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Ӕвзӕрст %(objects_name)s хафыны тыххӕй йемӕ баст объекттӕ дӕр схафт " -"уыдзысты, фӕлӕ дӕ аккаунтӕн нӕй бар ацы объекты хуызтӕ хафын:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Ӕвзӕрст %(objects_name)s хафын домы ацы хъахъхъӕд баст объекттӕ хафын дӕр:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ӕцӕг дӕ фӕнды ӕвзӕрст %(objects_name)s схафын? ацы объекттӕ иууылдӕр, ӕмӕ " -"семӕ баст иуӕгтӕ хафт ӕрцӕудзысты:" - -msgid "Change" -msgstr "Фӕивын" - -msgid "Delete?" -msgstr "Хъӕуы схафын?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s-мӕ гӕсгӕ" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Моделтӕ %(name)s ӕфтуаны" - -msgid "Add" -msgstr "Бафтауын" - -msgid "You don't have permission to edit anything." -msgstr "Нӕй дын бар исты ивын." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Ницы ис" - -msgid "Unknown content" -msgstr "Ӕнӕбӕрӕг мидис" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Дӕ бӕрӕгдоны цыдӕр раст ӕвӕрд нӕу. Сбӕрӕг кӕн, хъӕугӕ бӕрӕгдоны таблицӕтӕ " -"конд кӕй сты ӕмӕ амынд архайӕгӕн бӕрӕгдон фӕрсыны бар кӕй ис, уый." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Дӕ пароль кӕнӕ дӕ фӕсномыг ферох кодтай?" - -msgid "Date/time" -msgstr "Бон/рӕстӕг" - -msgid "User" -msgstr "Архайӕг" - -msgid "Action" -msgstr "Ми" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "Ацы объектӕн ивдтыты истори нӕй. Уӕццӕгӕн ацы админӕй ӕфтыд нӕ уыд." - -msgid "Show all" -msgstr "Иууылдӕр равдисын" - -msgid "Save" -msgstr "Нывӕрын" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Агурын" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s фӕстиуӕг" -msgstr[1] "%(counter)s фӕстиуӕджы" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s иумӕ" - -msgid "Save as new" -msgstr "Нывӕрын куыд ног" - -msgid "Save and add another" -msgstr "Нывӕрын ӕмӕ ног бафтауын" - -msgid "Save and continue editing" -msgstr "Нывӕрын ӕмӕ дарддӕр ивын" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Бузныг дӕ рӕстӕг абон ацы веб сайтимӕ кӕй арвыстай." - -msgid "Log in again" -msgstr "Ногӕй бахизын" - -msgid "Password change" -msgstr "Пароль ивын" - -msgid "Your password was changed." -msgstr "Дӕ пароль ивд ӕрцыд." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Дӕ хорзӕхӕй, ӕдасдзинады тыххӕй, бафысс дӕ зӕронд пароль ӕмӕ стӕй та дыууӕ " -"хатт дӕ нӕуӕг пароль, цӕмӕй мах сбӕлвырд кӕнӕм раст ӕй кӕй ныффыстай, уый." - -msgid "Change my password" -msgstr "Мӕ пароль фӕивын" - -msgid "Password reset" -msgstr "Пароль рацаразын" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Дӕ пароль ӕвӕрд ӕрцыд. Дӕ бон у дарддӕр ацӕуын ӕмӕ бахизын." - -msgid "Password reset confirmation" -msgstr "Пароль ӕвӕрыны бӕлвырдгӕнӕн" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Дӕ хорзӕхӕй, дӕ ног пароль дыууӕ хатт бафысс, цӕмӕй мах сбӕрӕг кӕнӕм раст ӕй " -"кӕй ныффыстай, уый." - -msgid "New password:" -msgstr "Ног пароль:" - -msgid "Confirm password:" -msgstr "Бӕлвырд пароль:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Парол ӕвӕрыны ӕрвитӕн раст нӕ уыд. Уӕццӕгӕн уый тыххӕй, ӕмӕ нырид пайдагонд " -"ӕрцыд. Дӕ хорзӕхӕй, ӕрдом ног пароль ӕвӕрын." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Кӕд ницы фыстӕг райстай, уӕд, дӕ хорзӕхӕй, сбӕрӕг кӕн цы электрон постимӕ " -"срегистраци кодтай, уый бацамыдтай, ӕви нӕ, ӕмӕ абӕрӕг кӕн дӕ спамтӕ." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ды райстай ацы фыстӕг, уымӕн ӕмӕ %(site_name)s-ы дӕ архайӕджы аккаунтӕн " -"пароль сӕвӕрын ӕрдомдтай." - -msgid "Please go to the following page and choose a new password:" -msgstr "Дӕ хорзӕхӕй, ацу ацы фарсмӕ ӕмӕ равзар дӕ ног пароль:" - -msgid "Your username, in case you've forgotten:" -msgstr "Дӕ фӕсномыг, кӕд дӕ ферох ис:" - -msgid "Thanks for using our site!" -msgstr "Бузныг нӕ сайтӕй нын кӕй пайда кӕныс!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s-ы бал" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Ферох дӕ ис дӕ пароль? Дӕ пароль бындӕр бафысс, ӕмӕ дӕм мах email-ӕй ног " -"пароль сывӕрыны амынд арвитдзыстӕм." - -msgid "Email address:" -msgstr "Email адрис:" - -msgid "Reset my password" -msgstr "Мӕ пароль ногӕй сӕвӕрын" - -msgid "All dates" -msgstr "Бонтӕ иууылдӕр" - -#, python-format -msgid "Select %s" -msgstr "Равзарын %s" - -#, python-format -msgid "Select %s to change" -msgstr "Равзарын %s ивынӕн" - -msgid "Date:" -msgstr "Бон:" - -msgid "Time:" -msgstr "Рӕстӕг:" - -msgid "Lookup" -msgstr "Акӕсын" - -msgid "Currently:" -msgstr "Нырыккон:" - -msgid "Change:" -msgstr "Ивд:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7af0f79..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po deleted file mode 100644 index ec6c9c4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,217 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Уӕвӕг %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Уӕвӕг %s-ты номхыгъд. Дӕ бон у искӕцытӕ дзы рауӕлдай кӕнай, куы сӕ равзарай " -"бындӕр къӕртты ӕмӕ дыууӕ къӕртты ӕхсӕн \"Равзарын\"-ы ӕгънӕгыл куы ныххӕцай, " -"уӕд." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Бафысс ацы къӕртты, уӕвӕг %s-ты номхыгъд фӕрсудзынӕн." - -msgid "Filter" -msgstr "Фӕрсудзӕн" - -msgid "Choose all" -msgstr "Равзарын алкӕцыдӕр" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Ныххӕц, алы %s равзарынӕн." - -msgid "Choose" -msgstr "Равзарын" - -msgid "Remove" -msgstr "Схафын" - -#, javascript-format -msgid "Chosen %s" -msgstr "Ӕвзӕрст %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ай у ӕвзӕрст %s-ты номхыгъд. Сӕ хафынӕн сӕ дӕ бон у бындӕр къӕртты равзарын " -"ӕмӕ дыууӕ ӕгънӕджы ӕхсӕн \"Схфын\"-ыл ныххӕцын." - -msgid "Remove all" -msgstr "Схафын алкӕцыдӕр" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Ныххӕц, алы ӕвзӕрст %s схафынӕн." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s-ӕй %(sel)s ӕвзӕрст" -msgstr[1] "%(cnt)s-ӕй %(sel)s ӕвзӕрст" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Ӕнӕвӕрд ивдтытӕ баззадысты ивыны бынӕтты. Кӕд исты ми саразай, уӕд дӕ " -"ӕнӕвӕрд ивдтытӕ фесӕфдзысты." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Ды равзӕрстай цыдӕр ми, фӕлӕ ивӕн бынӕтты цы фӕивтай, уыдон нӕ бавӕрдтай. Дӕ " -"хорзӕхӕй, ныххӕц Хорзыл цӕмӕй бавӕрд уой. Стӕй дын хъӕудзӕн ацы ми ногӕй " -"бакӕнын." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ды равзӕртай цыдӕр ми, фӕлӕ ивӕн бынӕтты ницы баивтай. Уӕццӕгӕн дӕ Ацӕуыны " -"ӕгънӕг хъӕуы, Бавӕрыны нӕ фӕлӕ." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Ныр" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Рӕстӕг равзарын" - -msgid "Midnight" -msgstr "Ӕмбисӕхсӕв" - -msgid "6 a.m." -msgstr "6 ӕ.р." - -msgid "Noon" -msgstr "Ӕмбисбон" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Раздӕхын" - -msgid "Today" -msgstr "Абон" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Знон" - -msgid "Tomorrow" -msgstr "Сом" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Равдисын" - -msgid "Hide" -msgstr "Айсын" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index e25e29a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index 0041893..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,706 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# A S Alam, 2018 -# A S Alam, 2022 -# Jannis Leidel , 2011 -# Satnam S Virdi , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-25 07:05+0000\n" -"Last-Translator: A S Alam, 2022\n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "ਚੁਣੇ %(verbose_name_plural)s ਹਟਾਓ" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s ਠੀਕ ਤਰ੍ਹਾਂ ਹਟਾਈਆਂ ਗਈਆਂ।" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" - -msgid "Are you sure?" -msgstr "ਕੀ ਤੁਸੀਂ ਇਹ ਚਾਹੁੰਦੇ ਹੋ?" - -msgid "Administration" -msgstr "ਪ੍ਰਸ਼ਾਸਨ" - -msgid "All" -msgstr "ਸਭ" - -msgid "Yes" -msgstr "ਹਾਂ" - -msgid "No" -msgstr "ਨਹੀਂ" - -msgid "Unknown" -msgstr "ਅਣਜਾਣ" - -msgid "Any date" -msgstr "ਕੋਈ ਵੀ ਮਿਤੀ" - -msgid "Today" -msgstr "ਅੱਜ" - -msgid "Past 7 days" -msgstr "ਪਿਛਲੇ ੭ ਦਿਨ" - -msgid "This month" -msgstr "ਇਹ ਮਹੀਨੇ" - -msgid "This year" -msgstr "ਇਹ ਸਾਲ" - -msgid "No date" -msgstr "ਕੋਈ ਮਿਤੀ ਨਹੀਂ" - -msgid "Has date" -msgstr "ਮਿਤੀ ਹੈ" - -msgid "Empty" -msgstr "ਖਾਲੀ" - -msgid "Not empty" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "ਕਾਰਵਾਈ:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "%(verbose_name)s ਹੋਰ ਸ਼ਾਮਲ" - -msgid "Remove" -msgstr "ਹਟਾਓ" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "ਬਦਲੋ" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "ਕਾਰਵਾਈ ਸਮਾਂ" - -msgid "user" -msgstr "ਵਰਤੋਂਕਾਰ" - -msgid "content type" -msgstr "ਸਮੱਗਰੀ ਕਿਸਮ" - -msgid "object id" -msgstr "ਆਬਜੈਕਟ id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ਆਬਜੈਕਟ repr" - -msgid "action flag" -msgstr "ਕਾਰਵਾਈ ਫਲੈਗ" - -msgid "change message" -msgstr "ਸੁਨੇਹਾ ਬਦਲੋ" - -msgid "log entry" -msgstr "ਲਾਗ ਐਂਟਰੀ" - -msgid "log entries" -msgstr "ਲਾਗ ਐਂਟਰੀਆਂ" - -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "ਅਤੇ" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "ਕੋਈ ਖੇਤਰ ਨਹੀਂ ਬਦਲਿਆ।" - -msgid "None" -msgstr "ਕੋਈ ਨਹੀਂ" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "ਕੋਈ ਕਾਰਵਾਈ ਨਹੀਂ ਚੁਣੀ ਗਈ।" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s ਸ਼ਾਮਲ" - -#, python-format -msgid "Change %s" -msgstr "%s ਬਦਲੋ" - -#, python-format -msgid "View %s" -msgstr "%s ਵੇਖੋ" - -msgid "Database error" -msgstr "ਡਾਟਾਬੇਸ ਗਲਤੀ" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ਠੀਕ ਤਰ੍ਹਾਂ ਬਦਲਿਆ ਗਿਆ।" -msgstr[1] "%(count)s %(name)s ਠੀਕ ਤਰ੍ਹਾਂ ਬਦਲੇ ਗਏ ਹਨ।" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s ਚੁਣਿਆ।" -msgstr[1] "%(total_count)s ਚੁਣੇ" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "ਅਤੀਤ ਬਦਲੋ: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ਡੀਜਾਂਗੋ ਸਾਈਟ ਐਡਮਿਨ" - -msgid "Django administration" -msgstr "ਡੀਜਾਂਗੋ ਪਰਸ਼ਾਸ਼ਨ" - -msgid "Site administration" -msgstr "ਸਾਈਟ ਪਰਬੰਧ" - -msgid "Log in" -msgstr "ਲਾਗ ਇਨ" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "ਸਫ਼ਾ ਨਹੀਂ ਲੱਭਿਆ" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "ਘਰ" - -msgid "Server error" -msgstr "ਸਰਵਰ ਗਲਤੀ" - -msgid "Server error (500)" -msgstr "ਸਰਵਰ ਗਲਤੀ (500)" - -msgid "Server Error (500)" -msgstr "ਸਰਵਰ ਗਲਤੀ (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "ਚੁਣੀ ਕਾਰਵਾਈ ਕਰੋ" - -msgid "Go" -msgstr "ਜਾਓ" - -msgid "Click here to select the objects across all pages" -msgstr "ਸਭ ਸਫ਼ਿਆਂ ਵਿੱਚੋਂ ਆਬਜੈਕਟ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "ਸਭ %(total_count)s %(module_name)s ਚੁਣੋ" - -msgid "Clear selection" -msgstr "ਚੋਣ ਸਾਫ਼ ਕਰੋ" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "ਸ਼ਾਮਲ" - -msgid "View" -msgstr "" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "ਪਾਸਵਰਡ ਬਦਲੋ" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "ਯੂਜ਼ਰ %(username)s ਲਈ ਨਵਾਂ ਪਾਸਵਰਡ ਦਿਓ।" - -msgid "Skip to main content" -msgstr "" - -msgid "Welcome," -msgstr "ਜੀ ਆਇਆਂ ਨੂੰ, " - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "ਡੌਕੂਮੈਂਟੇਸ਼ਨ" - -msgid "Log out" -msgstr "ਲਾਗ ਆਉਟ" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ਸ਼ਾਮਲ" - -msgid "History" -msgstr "ਅਤੀਤ" - -msgid "View on site" -msgstr "ਸਾਈਟ ਉੱਤੇ ਜਾਓ" - -msgid "Filter" -msgstr "ਫਿਲਟਰ" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Toggle theme (current theme: auto)" -msgstr "" - -msgid "Toggle theme (current theme: light)" -msgstr "" - -msgid "Toggle theme (current theme: dark)" -msgstr "" - -msgid "Delete" -msgstr "ਹਟਾਓ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "ਕਈ ਆਬਜੈਕਟ ਹਟਾਓ" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Delete?" -msgstr "ਹਟਾਉਣਾ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s ਵਲੋਂ " - -msgid "Summary" -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "ਕੋਈ ਉਪਲੱਬਧ ਨਹੀਂ" - -msgid "Unknown content" -msgstr "ਅਣਜਾਣ ਸਮੱਗਰੀ" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Toggle navigation" -msgstr "" - -msgid "Sidebar" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "ਮਿਤੀ/ਸਮਾਂ" - -msgid "User" -msgstr "ਯੂਜ਼ਰ" - -msgid "Action" -msgstr "ਕਾਰਵਾਈ" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "ਸਭ ਵੇਖੋ" - -msgid "Save" -msgstr "ਸੰਭਾਲੋ" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "ਖੋਜ" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s ਕੁੱਲ" - -msgid "Save as new" -msgstr "ਨਵੇਂ ਵਜੋਂ ਵੇਖੋ" - -msgid "Save and add another" -msgstr "ਸੰਭਾਲੋ ਤੇ ਹੋਰ ਸ਼ਾਮਲ" - -msgid "Save and continue editing" -msgstr "ਸੰਭਾਲੋ ਤੇ ਸੋਧਣਾ ਜਾਰੀ ਰੱਖੋ" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "ਫੇਰ ਲਾਗਇਨ ਕਰੋ" - -msgid "Password change" -msgstr "ਪਾਸਵਰਡ ਬਦਲੋ" - -msgid "Your password was changed." -msgstr "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਿਆ ਗਿਆ ਹੈ।" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "ਮੇਰਾ ਪਾਸਵਰਡ ਬਦਲੋ" - -msgid "Password reset" -msgstr "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਹੈ। ਤੁਸੀਂ ਜਾਰੀ ਰੱਖ ਕੇ ਹੁਣੇ ਲਾਗਇਨ ਕਰ ਸਕਦੇ ਹੋ।" - -msgid "Password reset confirmation" -msgstr "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰਨ ਪੁਸ਼ਟੀ" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"ਆਪਣਾ ਨਵਾਂ ਪਾਸਵਰਡ ਦੋ ਵਾਰ ਦਿਉ ਤਾਂ ਕਿ ਅਸੀਂ ਜਾਂਚ ਕਰ ਸਕੀਏ ਕਿ ਤੁਸੀਂ ਠੀਕ ਤਰ੍ਹਾਂ ਲਿਖਿਆ ਹੈ।" - -msgid "New password:" -msgstr "ਨਵਾਂ ਪਾਸਵਰਡ:" - -msgid "Confirm password:" -msgstr "ਪਾਸਵਰਡ ਪੁਸ਼ਟੀ:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"ਪਾਸਵਰਡ ਰੀ-ਸੈੱਟ ਲਿੰਕ ਗਲਤ ਹੈ, ਸੰਭਵ ਤੌਰ ਉੱਤੇ ਇਹ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਚੁੱਕਾ ਹੈ। ਨਵਾਂ ਪਾਸਵਰਡ ਰੀ-" -"ਸੈੱਟ ਲਈ ਬੇਨਤੀ ਭੇਜੋ ਜੀ।" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "ਅੱਗੇ ਦਿੱਤੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਉ ਤੇ ਨਵਾਂ ਪਾਸਵਰਡ ਚੁਣੋ:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "ਸਾਡੀ ਸਾਈਟ ਵਰਤਣ ਲਈ ਧੰਨਵਾਦ ਜੀ!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s ਟੀਮ" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "ਮੇਰਾ ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ" - -msgid "All dates" -msgstr "ਸਭ ਮਿਤੀਆਂ" - -#, python-format -msgid "Select %s" -msgstr "%s ਚੁਣੋ" - -#, python-format -msgid "Select %s to change" -msgstr "ਬਦਲਣ ਲਈ %s ਚੁਣੋ" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "ਮਿਤੀ:" - -msgid "Time:" -msgstr "ਸਮਾਂ:" - -msgid "Lookup" -msgstr "ਖੋਜ" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 08925e4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po deleted file mode 100644 index ed55c46..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,253 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-15 11:28+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "ਉਪਲੱਬਧ %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "ਫਿਲਟਰ" - -msgid "Choose all" -msgstr "ਸਭ ਚੁਣੋ" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "ਹਟਾਓ" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s ਚੁਣੋ" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "ਹੁਣੇ" - -msgid "Midnight" -msgstr "ਅੱਧੀ-ਰਾਤ" - -msgid "6 a.m." -msgstr "6 ਸਵੇਰ" - -msgid "Noon" -msgstr "ਦੁਪਹਿਰ" - -msgid "6 p.m." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ਸਮਾਂ ਚੁਣੋ" - -msgid "Cancel" -msgstr "ਰੱਦ ਕਰੋ" - -msgid "Today" -msgstr "ਅੱਜ" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "ਕੱਲ੍ਹ" - -msgid "Tomorrow" -msgstr "ਭਲਕੇ" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "ਵੇਖੋ" - -msgid "Hide" -msgstr "ਓਹਲੇ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index b4391fe..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index 4801688..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,818 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# angularcircle, 2011-2013 -# angularcircle, 2013-2014 -# Jannis Leidel , 2011 -# Janusz Harkot , 2014-2015 -# Karol , 2012 -# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 -# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 -# Maciej Olko , 2016-2022 -# Maciej Olko , 2023 -# Maciej Olko , 2015 -# Mariusz Felisiak , 2020,2022-2025 -# Ola Sitarska , 2013 -# Ola Sitarska , 2013 -# Roman Barczyński, 2014 -# Tomasz Kajtoch , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Mariusz Felisiak , " -"2020,2022-2025\n" -"Language-Team: Polish (http://app.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " -"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " -"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Usuń wybrane(-nych) %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Pomyślnie usunięto %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nie można usunąć %(name)s" - -msgid "Delete multiple objects" -msgstr "Usuwanie wielu obiektów" - -msgid "Administration" -msgstr "Administracja" - -msgid "All" -msgstr "Wszystko" - -msgid "Yes" -msgstr "Tak" - -msgid "No" -msgstr "Nie" - -msgid "Unknown" -msgstr "Nieznany" - -msgid "Any date" -msgstr "Dowolna data" - -msgid "Today" -msgstr "Dzisiaj" - -msgid "Past 7 days" -msgstr "Ostatnie 7 dni" - -msgid "This month" -msgstr "Ten miesiąc" - -msgid "This year" -msgstr "Ten rok" - -msgid "No date" -msgstr "Brak daty" - -msgid "Has date" -msgstr "Posiada datę" - -msgid "Empty" -msgstr "Puste" - -msgid "Not empty" -msgstr "Niepuste" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Wprowadź poprawne dane w polach „%(username)s” i „hasło” dla konta " -"należącego do zespołu. Uwaga: wielkość liter może mieć znaczenie." - -msgid "Action:" -msgstr "Akcja:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dodaj kolejne(go)(-ną)(-ny) %(verbose_name)s" - -msgid "Remove" -msgstr "Usuń" - -msgid "Addition" -msgstr "Dodanie" - -msgid "Change" -msgstr "Zmień" - -msgid "Deletion" -msgstr "Usunięcie" - -msgid "action time" -msgstr "czas akcji" - -msgid "user" -msgstr "użytkownik" - -msgid "content type" -msgstr "typ zawartości" - -msgid "object id" -msgstr "id obiektu" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "reprezentacja obiektu" - -msgid "action flag" -msgstr "flaga akcji" - -msgid "change message" -msgstr "zmień wiadomość" - -msgid "log entry" -msgstr "log" - -msgid "log entries" -msgstr "logi" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Dodano „%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Zmieniono „%(object)s” — %(changes)s " - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Usunięto „%(object)s”." - -msgid "LogEntry Object" -msgstr "Obiekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Dodano {name} „{object}”." - -msgid "Added." -msgstr "Dodano." - -msgid "and" -msgstr "i" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Zmodyfikowano {fields} w {name} „{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Zmodyfikowano {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Usunięto {name} „{object}”." - -msgid "No fields changed." -msgstr "Żadne pole nie zostało zmienione." - -msgid "None" -msgstr "Brak" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Przytrzymaj wciśnięty klawisz „Ctrl” lub „Command” na Macu, aby zaznaczyć " -"więcej niż jeden wybór." - -msgid "Select this object for an action - {}" -msgstr "Wybierz ten obiekt do wykonania akcji - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}” został(a)(-ło) dodany(-na)(-ne) pomyślnie." - -msgid "You may edit it again below." -msgstr "Poniżej możesz ponownie edytować." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} „{obj}” został(a)(-ło) dodany(-na)(-ne) pomyślnie. Można dodać " -"kolejne(go)(-ną)(-ny) {name} poniżej." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} „{obj}” został(a)(-ło) pomyślnie zmieniony(-na)(-ne). Można edytować " -"go/ją/je ponownie poniżej." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} „{obj}” został(a)(-ło) pomyślnie zmieniony(-na)(-ne). Można dodać " -"kolejny(-nego)(-ną)(-ne) {name} poniżej." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}” został(a)(-ło) pomyślnie zmieniony(-na)(-ne)." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Wykonanie akcji wymaga wybrania obiektów. Żaden obiekt nie został zmieniony." - -msgid "No action selected." -msgstr "Nie wybrano akcji." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s” usunięty(-ta)(-te) pomyślnie." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s z ID „%(key)s” nie istnieje. Może został(a)(-ło) usunięty(-ta)(-te)?" - -#, python-format -msgid "Add %s" -msgstr "Dodaj %s" - -#, python-format -msgid "Change %s" -msgstr "Zmień %s" - -#, python-format -msgid "View %s" -msgstr "Zobacz %s" - -msgid "Database error" -msgstr "Błąd bazy danych" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s został(a)(-ło) pomyślnie zmieniony(-na)(-ne)." -msgstr[1] "%(count)s %(name)s zostały(-ło) pomyślnie zmienione(-nych)." -msgstr[2] "%(count)s %(name)s zostało pomyślnie zmienionych." -msgstr[3] "%(count)s %(name)s zostało pomyślnie zmienione." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Wybrano %(total_count)s" -msgstr[1] "Wybrano %(total_count)s" -msgstr[2] "Wybrano %(total_count)s" -msgstr[3] "Wybrano wszystkie %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Wybrano 0 z %(cnt)s" - -msgid "Delete" -msgstr "Usuń" - -#, python-format -msgid "Change history: %s" -msgstr "Historia zmian: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Usunięcie %(class_name)s %(instance)s może wiązać się z usunięciem " -"następujących chronionych obiektów pokrewnych: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administracja stroną Django" - -msgid "Django administration" -msgstr "Administracja Django" - -msgid "Site administration" -msgstr "Administracja stroną" - -msgid "Log in" -msgstr "Zaloguj się" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s: administracja" - -msgid "Page not found" -msgstr "Strona nie została znaleziona" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Przykro nam, ale żądana strona nie została znaleziona." - -msgid "Home" -msgstr "Strona główna" - -msgid "Server error" -msgstr "Błąd serwera" - -msgid "Server error (500)" -msgstr "Błąd serwera (500)" - -msgid "Server Error (500)" -msgstr "Błąd Serwera (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Niestety wystąpił błąd. Zostało to zgłoszone administratorom strony poprzez " -"email i niebawem powinno zostać naprawione. Dziękujemy za cierpliwość." - -msgid "Run the selected action" -msgstr "Wykonaj wybraną akcję" - -msgid "Go" -msgstr "Wykonaj" - -msgid "Click here to select the objects across all pages" -msgstr "Kliknij by wybrać obiekty na wszystkich stronach" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Wybierz wszystkie(-kich) %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Wyczyść wybór" - -msgid "Breadcrumbs" -msgstr "Breadcrumbs" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele w aplikacji %(name)s" - -msgid "Model name" -msgstr "Nazwa modelu" - -msgid "Add link" -msgstr "Dodaj link" - -msgid "Change or view list link" -msgstr "Link do zmiany lub podglądu" - -msgid "Add" -msgstr "Dodaj" - -msgid "View" -msgstr "Zobacz" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nie masz uprawnień do oglądania ani edycji niczego." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "Po tym jak utworzysz użytkownika, będzie mógł edytować więcej opcji." - -msgid "Error:" -msgstr "Błąd:" - -msgid "Change password" -msgstr "Zmień hasło" - -msgid "Set password" -msgstr "Ustaw hasło" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Prosimy poprawić poniższy błąd." -msgstr[1] "Prosimy poprawić poniższe błędy." -msgstr[2] "Prosimy poprawić poniższe błędy." -msgstr[3] "Prosimy poprawić poniższe błędy." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Podaj nowe hasło dla użytkownika %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"To działanie włączy uwierzytelnianie oparte na haśle dla " -"tego użytkownika. " - -msgid "Disable password-based authentication" -msgstr "Wyłącz uwierzytelnianie oparte na haśle" - -msgid "Enable password-based authentication" -msgstr "Włącz uwierzytelnianie oparte na haśle" - -msgid "Skip to main content" -msgstr "Przejdź do głównej treści" - -msgid "Welcome," -msgstr "Witaj," - -msgid "View site" -msgstr "Pokaż stronę" - -msgid "Documentation" -msgstr "Dokumentacja" - -msgid "Log out" -msgstr "Wyloguj się" - -#, python-format -msgid "Add %(name)s" -msgstr "Dodaj %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Pokaż na stronie" - -msgid "Filter" -msgstr "Filtruj" - -msgid "Hide counts" -msgstr "Ukryj ilości" - -msgid "Show counts" -msgstr "Pokaż ilości" - -msgid "Clear all filters" -msgstr "Wyczyść wszystkie filtry" - -msgid "Remove from sorting" -msgstr "Usuń z sortowania" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Priorytet sortowania: %(priority_number)s " - -msgid "Toggle sorting" -msgstr "Przełącz sortowanie" - -msgid "Toggle theme (current theme: auto)" -msgstr "Przełącz motyw (bieżący motyw: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Przełącz motyw (bieżący motyw: jasny)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Przełącz motyw (bieżący motyw: ciemny)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Usunięcie %(object_name)s „%(escaped_object)s” wiązałoby się z usunięciem " -"obiektów z nim/nią powiązanych, ale niestety nie posiadasz uprawnień do " -"usunięcia obiektów następujących typów:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Usunięcie %(object_name)s „%(escaped_object)s” wymagałoby skasowania " -"następujących chronionych obiektów, które są z nim/nią powiązane:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Czy chcesz skasować %(object_name)s „%(escaped_object)s”? Następujące " -"obiekty powiązane zostaną usunięte:" - -msgid "Objects" -msgstr "Obiekty" - -msgid "Yes, I’m sure" -msgstr "Tak, na pewno" - -msgid "No, take me back" -msgstr "Nie, zabierz mnie stąd" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Usunięcie wybranych(-nego)(-nej) %(objects_name)s spowoduje skasowanie " -"obiektów, które są z nim(i)/nią powiązane. Niestety nie posiadasz uprawnień " -"do usunięcia następujących typów obiektów:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Usunięcie wybranych(-nego)(-nej) %(objects_name)s wymaga skasowania " -"następujących chronionych obiektów, które są z nim(i)/nią powiązane:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Czy chcesz skasować zaznaczone(go)(-ną)(-ny)(-nych) %(objects_name)s? " -"Następujące obiekty oraz obiekty od nich zależne zostaną skasowane:" - -msgid "Delete?" -msgstr "Usunąć?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Według pola %(filter_title)s " - -msgid "Summary" -msgstr "Podsumowanie" - -msgid "Recent actions" -msgstr "Ostatnie działania" - -msgid "My actions" -msgstr "Moje działania" - -msgid "None available" -msgstr "Brak dostępnych" - -msgid "Added:" -msgstr "Dodano:" - -msgid "Changed:" -msgstr "Zmieniono:" - -msgid "Deleted:" -msgstr "Usunięto:" - -msgid "Unknown content" -msgstr "Zawartość nieznana" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Instalacja Twojej bazy danych jest niepoprawna. Upewnij się, że odpowiednie " -"tabele zostały utworzone i odpowiedni użytkownik jest uprawniony do ich " -"odczytu." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Jesteś uwierzytelniony jako %(username)s, ale nie jesteś upoważniony do " -"dostępu do tej strony. Czy chciałbyś zalogować się na inne konto?" - -msgid "Forgotten your login credentials?" -msgstr "Zapomniałeś swoich danych do logowania?" - -msgid "Toggle navigation" -msgstr "Przełącz nawigację" - -msgid "Sidebar" -msgstr "Pasek boczny" - -msgid "Start typing to filter…" -msgstr "Zacznij pisać, aby odfiltrować…" - -msgid "Filter navigation items" -msgstr "Filtruj elementy nawigacji" - -msgid "Date/time" -msgstr "Data/czas" - -msgid "User" -msgstr "Użytkownik" - -msgid "Action" -msgstr "Akcja" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "wpis" -msgstr[1] "wpisy" -msgstr[2] "wpisów" -msgstr[3] "wpisu" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Ten obiekt nie ma historii zmian. Najprawdopodobniej nie został on dodany " -"poprzez panel administracyjny." - -msgid "Show all" -msgstr "Pokaż wszystko" - -msgid "Save" -msgstr "Zapisz" - -msgid "Popup closing…" -msgstr "Zamykanie okna..." - -msgid "Search" -msgstr "Szukaj" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s wynik" -msgstr[1] "%(counter)s wyniki" -msgstr[2] "%(counter)s wyników" -msgstr[3] "%(counter)s wyników" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s łącznie" - -msgid "Save as new" -msgstr "Zapisz jako nowy" - -msgid "Save and add another" -msgstr "Zapisz i dodaj nowy" - -msgid "Save and continue editing" -msgstr "Zapisz i kontynuuj edycję" - -msgid "Save and view" -msgstr "Zapisz i obejrzyj" - -msgid "Close" -msgstr "Zamknij" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Zmień wybraną(-ne)(-nego)(-ny) %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Dodaj kolejne(go)(-ną)(-ny) %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Usuń wybraną(-ne)(-nego)(-ny) %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Obejrzyj wybraną(-ne)(-nego)(-ny) %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Dzięki za spędzenie cennego czasu ze stroną." - -msgid "Log in again" -msgstr "Zaloguj się ponownie" - -msgid "Password change" -msgstr "Zmiana hasła" - -msgid "Your password was changed." -msgstr "Twoje hasło zostało zmienione." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Podaj swoje stare hasło, ze względów bezpieczeństwa, a później wpisz " -"dwukrotnie Twoje nowe hasło, abyśmy mogli zweryfikować, że zostało wpisane " -"poprawnie." - -msgid "Change my password" -msgstr "Zmień hasło" - -msgid "Password reset" -msgstr "Zresetuj hasło" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Twoje hasło zostało ustawione. Możesz się teraz zalogować." - -msgid "Password reset confirmation" -msgstr "Potwierdzenie zresetowania hasła" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Podaj dwukrotnie nowe hasło, by można było zweryfikować, czy zostało wpisane " -"poprawnie." - -msgid "New password:" -msgstr "Nowe hasło:" - -msgid "Confirm password:" -msgstr "Potwierdź hasło:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Link pozwalający na reset hasła jest niepoprawny - być może dlatego, że " -"został już raz użyty. Możesz ponownie zażądać zresetowania hasła." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Instrukcja pozwalająca ustawić nowe hasło dla podanego adresu e-mail została " -"wysłana. Niebawem powinna się pojawić na twoim koncie pocztowym." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"W przypadku nieotrzymania wiadomości e-mail: upewnij się czy adres " -"wprowadzony jest zgodny z tym podanym podczas rejestracji i sprawdź " -"zawartość folderu SPAM na swoim koncie." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Otrzymujesz tę wiadomość, gdyż skorzystano z opcji resetu hasła dla Twojego " -"konta na stronie %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Aby wprowadzić nowe hasło, proszę przejść na stronę, której adres widnieje " -"poniżej:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Na wypadek gdybyś zapomniał(a), jesteś:" - -msgid "Thanks for using our site!" -msgstr "Dzięki za korzystanie z naszej strony!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Zespół %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Nie pamiętasz swojego hasła? Wprowadź w poniższym polu swój adres e-mail, a " -"wyślemy ci instrukcję opisującą sposób ustawienia nowego hasła." - -msgid "Email address:" -msgstr "Adres e-mail:" - -msgid "Reset my password" -msgstr "Zresetuj moje hasło" - -msgid "Select all objects on this page for an action" -msgstr "Wybierz wszystkie obiekty na tej stronie do wykonania akcji" - -msgid "All dates" -msgstr "Wszystkie daty" - -#, python-format -msgid "Select %s" -msgstr "Wybierz %s" - -#, python-format -msgid "Select %s to change" -msgstr "Wybierz %s do zmiany" - -#, python-format -msgid "Select %s to view" -msgstr "Wybierz %s do obejrzenia" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Czas:" - -msgid "Lookup" -msgstr "Szukaj" - -msgid "Currently:" -msgstr "Aktualny:" - -msgid "Change:" -msgstr "Zmień:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo deleted file mode 100644 index b5945d7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po deleted file mode 100644 index 453c696..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,344 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# angularcircle, 2011 -# Darek, 2022 -# Jannis Leidel , 2011 -# Janusz Harkot , 2014-2015 -# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 -# Maciej Olko , 2016,2018,2020 -# Maciej Olko , 2023 -# Mariusz Felisiak , 2021,2023,2025 -# Roman Barczyński, 2012 -# Tomasz Kajtoch , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Mariusz Felisiak , " -"2021,2023,2025\n" -"Language-Team: Polish (http://app.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " -"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " -"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostępne %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Wybierz %s przez zaznaczenie ich i kliknięcie strzałki \"Wybierz\"." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Wpisz coś tutaj, aby wyfiltrować listę dostępnych %s." - -msgid "Filter" -msgstr "Filtr" - -#, javascript-format -msgid "Choose all %s" -msgstr "Wybierz wszystkie %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Wybierz zaznaczone %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Usuń zaznaczone %s" - -#, javascript-format -msgid "Chosen %s" -msgstr "Wybrane %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "Usuń %s przez zaznaczenie ich i kliknięcie strzałki \"Usuń\"." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Wpisz coś tutaj, aby wyfiltrować listę wybranych %s." - -msgid "(click to clear)" -msgstr "(kliknij aby wyczyścić)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Usuń wszystkie %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s wybrana opcja jest ukryta" -msgstr[1] "%s wybrane opcje są ukryte" -msgstr[2] "%s wybranych opcji jest ukrytych" -msgstr[3] "%s wybranych opcji jest ukrytych" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Wybrano %(sel)s z %(cnt)s" -msgstr[1] "Wybrano %(sel)s z %(cnt)s" -msgstr[2] "Wybrano %(sel)s z %(cnt)s" -msgstr[3] "Wybrano %(sel)s z %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Zmiany w niektórych polach nie zostały zachowane. Po wykonaniu akcji, zmiany " -"te zostaną utracone." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Wybrano akcję, lecz część zmian w polach nie została zachowana. Kliknij OK, " -"aby zapisać. Aby wykonać akcję, należy ją ponownie uruchomić." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Wybrano akcję, lecz nie dokonano żadnych zmian w polach. Prawdopodobnie " -"szukasz przycisku „Wykonaj”, a nie „Zapisz”." - -msgid "Now" -msgstr "Teraz" - -msgid "Midnight" -msgstr "Północ" - -msgid "6 a.m." -msgstr "6 rano" - -msgid "Noon" -msgstr "Południe" - -msgid "6 p.m." -msgstr "6 po południu" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzinę do przodu w stosunku do " -"czasu serwera." -msgstr[1] "" -"Uwaga: Czas lokalny jest przesunięty o %s godziny do przodu w stosunku do " -"czasu serwera." -msgstr[2] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzin do przodu w stosunku do " -"czasu serwera." -msgstr[3] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzin do przodu w stosunku do " -"czasu serwera." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzinę do tyłu w stosunku do " -"czasu serwera." -msgstr[1] "" -"Uwaga: Czas lokalny jest przesunięty o %s godziny do tyłu w stosunku do " -"czasu serwera." -msgstr[2] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzin do tyłu w stosunku do czasu " -"serwera." -msgstr[3] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzin do tyłu w stosunku do czasu " -"serwera." - -msgid "Choose a Time" -msgstr "Wybierz Czas" - -msgid "Choose a time" -msgstr "Wybierz czas" - -msgid "Cancel" -msgstr "Anuluj" - -msgid "Today" -msgstr "Dzisiaj" - -msgid "Choose a Date" -msgstr "Wybierz Datę" - -msgid "Yesterday" -msgstr "Wczoraj" - -msgid "Tomorrow" -msgstr "Jutro" - -msgid "January" -msgstr "Styczeń" - -msgid "February" -msgstr "Luty" - -msgid "March" -msgstr "Marzec" - -msgid "April" -msgstr "Kwiecień" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Czerwiec" - -msgid "July" -msgstr "Lipiec" - -msgid "August" -msgstr "Sierpień" - -msgid "September" -msgstr "Wrzesień" - -msgid "October" -msgstr "Październik" - -msgid "November" -msgstr "Listopad" - -msgid "December" -msgstr "Grudzień" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Sty" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Lut" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Kwi" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Cze" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Lip" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Sie" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Wrz" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Paź" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Lis" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Gru" - -msgid "Sunday" -msgstr "Niedziela" - -msgid "Monday" -msgstr "Poniedziałek" - -msgid "Tuesday" -msgstr "Wtorek" - -msgid "Wednesday" -msgstr "Środa" - -msgid "Thursday" -msgstr "Czwartek" - -msgid "Friday" -msgstr "Piątek" - -msgid "Saturday" -msgstr "Sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Nd" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pon" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Wt" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Śr" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Czw" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pt" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "So" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "N" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "W" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ś" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "C" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index be1ab3e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index bee8df6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,806 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# emansije , 2023 -# Henrique Azevedo , 2018,2023 -# Jannis Leidel , 2011 -# jorgecarleitao , 2015 -# Manuela Silva , 2025 -# Nuno Mariz , 2013,2015,2017-2018,2023 -# 12574c6d66324e145c1d19e02acecb73_84badd8 <4e8d94859927eab3b50486d21249c068_5346>, 2011 -# Raúl Pedro Fernandes Santos, 2014 -# Rui Dinis Silva, 2017 -# Sofia Matias, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Manuela Silva , 2025\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Remover %(verbose_name_plural)s selecionados" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Foram removidos com sucesso %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Não é possível remover %(name)s " - -msgid "Delete multiple objects" -msgstr "Remover múltiplos objetos." - -msgid "Administration" -msgstr "Administração" - -msgid "All" -msgstr "Todos" - -msgid "Yes" -msgstr "Sim" - -msgid "No" -msgstr "Não" - -msgid "Unknown" -msgstr "Desconhecido" - -msgid "Any date" -msgstr "Qualquer data" - -msgid "Today" -msgstr "Hoje" - -msgid "Past 7 days" -msgstr "Últimos 7 dias" - -msgid "This month" -msgstr "Este mês" - -msgid "This year" -msgstr "Este ano" - -msgid "No date" -msgstr "Sem data" - -msgid "Has date" -msgstr "Tem data" - -msgid "Empty" -msgstr "Vazio" - -msgid "Not empty" -msgstr "Não está vazio" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor introduza o %(username)s e password corretos para a conta de " -"equipa. Tenha em atenção às maiúsculas e minúsculas." - -msgid "Action:" -msgstr "Ação:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Adicionar outro %(verbose_name)s" - -msgid "Remove" -msgstr "Remover" - -msgid "Addition" -msgstr "Adição" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Eliminação" - -msgid "action time" -msgstr "hora da ação" - -msgid "user" -msgstr "utilizador" - -msgid "content type" -msgstr "tipo de conteúdo" - -msgid "object id" -msgstr "id do objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr do objeto" - -msgid "action flag" -msgstr "flag de ação" - -msgid "change message" -msgstr "modificar mensagem" - -msgid "log entry" -msgstr "entrada de log" - -msgid "log entries" -msgstr "entradas de log" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Adicionado \"%(object)s\"" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Modificado \"%(object)s\" — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Removido \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Objeto LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Adicionado {name} \"{object}\"" - -msgid "Added." -msgstr "Adicionado." - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Alterado {fields} para {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Foi modificado {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Removido {name} \"{object}\"" - -msgid "No fields changed." -msgstr "Nenhum campo foi modificado." - -msgid "None" -msgstr "Nenhum" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Mantenha premida a tecla “Control”, ou “Command” no Mac, para selecionar " -"mais do que uma." - -msgid "Select this object for an action - {}" -msgstr "Selecionar este objecto para uma ação - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "O {name} “{obj}” foi adicionado com sucesso." - -msgid "You may edit it again below." -msgstr "Pode editar novamente abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"O {name} “{obj}” foi adicionado com sucesso. Pode adicionar outro {name} " -"abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"O {name} “{obj}” foi adicionado com sucesso. Pode editar novamente abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"O {name} “{obj}” foi alterado com sucesso. Pode adicionar outro {name} " -"abaixo." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "O {name} “{obj}” foi alterado com sucesso." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Os itens devem ser selecionados de forma a efectuar ações sobre eles. Nenhum " -"item foi modificado." - -msgid "No action selected." -msgstr "Nenhuma ação selecionada." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "O %(name)s “%(obj)s” foi apagado com sucesso." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s com o ID “%(key)s” não existe. Talvez tenha sido apagado?" - -#, python-format -msgid "Add %s" -msgstr "Adicionar %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "View %s " - -msgid "Database error" -msgstr "Erro de base de dados" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s foi modificado com sucesso." -msgstr[1] "%(count)s %(name)s foram modificados com sucesso." -msgstr[2] "%(count)s %(name)s foram modificados com sucesso." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selecionado" -msgstr[1] "Todos %(total_count)s selecionados" -msgstr[2] "Todos %(total_count)s selecionados" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s selecionados" - -msgid "Delete" -msgstr "Remover" - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de modificações: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Remover %(class_name)s %(instance)s exigiria a remoção dos seguintes objetos " -"relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Site de administração do Django" - -msgid "Django administration" -msgstr "Administração do Django" - -msgid "Site administration" -msgstr "Administração do site" - -msgid "Log in" -msgstr "Entrar" - -#, python-format -msgid "%(app)s administration" -msgstr "Administração de %(app)s" - -msgid "Page not found" -msgstr "Página não encontrada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Pedimos desculpa mas a página solicitada não foi encontrada. " - -msgid "Home" -msgstr "Início" - -msgid "Server error" -msgstr "Erro do servidor" - -msgid "Server error (500)" -msgstr "Erro do servidor (500)" - -msgid "Server Error (500)" -msgstr "Erro do servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ocorreu um erro. Foi comunicado por email aos administradores da página e " -"deverá ser corrigido em breve. Obrigado pela sua compreensão. " - -msgid "Run the selected action" -msgstr "Executar a acção selecionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Clique aqui para selecionar os objetos em todas as páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Selecionar todos %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Remover seleção" - -msgid "Breadcrumbs" -msgstr "Marcas de navegação" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos na aplicação %(name)s" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Adicionar" - -msgid "View" -msgstr "View" - -msgid "You don’t have permission to view or edit anything." -msgstr "Não tem permissões para visualizar ou editar nada. " - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Modificar palavra-passe" - -msgid "Set password" -msgstr "Definir palavra-passe" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Por favor, corrija o erro abaixo." -msgstr[1] "Por favor, corrija os erros abaixo." -msgstr[2] "Por favor, corrija os erros abaixo." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Introduza uma nova palavra-passe para o utilizador %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Esta ação irá ativara autenticação baseada em palavra-passe " -"para este utilizador." - -msgid "Disable password-based authentication" -msgstr "Desativar a autenticação baseada em palavra-passe" - -msgid "Enable password-based authentication" -msgstr "Ativar a autenticação baseada em palavra-passe" - -msgid "Skip to main content" -msgstr "Ir para o conteúdo principal" - -msgid "Welcome," -msgstr "Bem-vindo," - -msgid "View site" -msgstr "Ver site" - -msgid "Documentation" -msgstr "Documentação" - -msgid "Log out" -msgstr "Sair" - -#, python-format -msgid "Add %(name)s" -msgstr "Adicionar %(name)s" - -msgid "History" -msgstr "História" - -msgid "View on site" -msgstr "Ver no site" - -msgid "Filter" -msgstr "Filtro" - -msgid "Hide counts" -msgstr "Ocultar contagem" - -msgid "Show counts" -msgstr "Mostrar contagem" - -msgid "Clear all filters" -msgstr "Limpar todos os filtros" - -msgid "Remove from sorting" -msgstr "Remover da ordenação" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridade de ordenação: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Altenar ordenação" - -msgid "Toggle theme (current theme: auto)" -msgstr "Mudar tema (tema corrente: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Mudar tema (tema corrente: claro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Mudar tema (tema corrente: escuro)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"A remoção de %(object_name)s '%(escaped_object)s' resultará na remoção dos " -"objetos relacionados, mas a sua conta não tem permissão de remoção dos " -"seguintes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Remover o %(object_name)s ' %(escaped_object)s ' exigiria a remoção dos " -"seguintes objetos protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Tem a certeza que deseja remover %(object_name)s \"%(escaped_object)s\"? " -"Todos os items relacionados seguintes irão ser removidos:" - -msgid "Objects" -msgstr "Objectos" - -msgid "Yes, I’m sure" -msgstr "Sim, tenho a certeza" - -msgid "No, take me back" -msgstr "Não, retrocede" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Remover o %(objects_name)s selecionado poderia resultar na remoção de " -"objetos relacionados, mas a sua conta não tem permissão para remover os " -"seguintes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Remover o %(objects_name)s selecionado exigiria remover os seguintes objetos " -"protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Tem certeza de que deseja remover %(objects_name)s selecionado? Todos os " -"objetos seguintes e seus itens relacionados serão removidos:" - -msgid "Delete?" -msgstr "Remover?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Sumário" - -msgid "Recent actions" -msgstr "Ações recentes" - -msgid "My actions" -msgstr "As minhas ações" - -msgid "None available" -msgstr "Nenhum disponível" - -msgid "Added:" -msgstr "Adicionado:" - -msgid "Changed:" -msgstr "Alterado:" - -msgid "Deleted:" -msgstr "Apagado:" - -msgid "Unknown content" -msgstr "Conteúdo desconhecido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Há algo de errado com a instalação da base de dados. Certifique-se de que as " -"tabelas adequadas da base de dados foram criadas e de que a base de dados " -"pode ser lida pelo utilizador adequado." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Está autenticado como %(username)s, mas não está autorizado a aceder a esta " -"página. Deseja autenticar-se com uma conta diferente?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Alternar navegação" - -msgid "Sidebar" -msgstr "Barra lateral" - -msgid "Start typing to filter…" -msgstr "Começe a digitar para filtrar…" - -msgid "Filter navigation items" -msgstr "Filtrar itens de navegação" - -msgid "Date/time" -msgstr "Data/hora" - -msgid "User" -msgstr "Utilizador" - -msgid "Action" -msgstr "Ação" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrada" -msgstr[1] "entradas" -msgstr[2] "entradas" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Este objeto não tem um histórico de alterações. Provavelmente não foi " -"adicionado através da página de administração." - -msgid "Show all" -msgstr "Mostrar todos" - -msgid "Save" -msgstr "Gravar" - -msgid "Popup closing…" -msgstr "Encerramento de popup…" - -msgid "Search" -msgstr "Pesquisar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" -msgstr[2] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s no total" - -msgid "Save as new" -msgstr "Gravar como novo" - -msgid "Save and add another" -msgstr "Gravar e adicionar outro" - -msgid "Save and continue editing" -msgstr "Gravar e continuar a editar" - -msgid "Save and view" -msgstr "Gravar e ver" - -msgid "Close" -msgstr "Fechar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Alterar %(model)s selecionado." - -#, python-format -msgid "Add another %(model)s" -msgstr "Adicionar outro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Remover %(model)s seleccionado" - -#, python-format -msgid "View selected %(model)s" -msgstr "Vista selecionada %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Obrigado por passar algum tempo de qualidade com a página Web hoje." - -msgid "Log in again" -msgstr "Entrar novamente" - -msgid "Password change" -msgstr "Modificação da palavra-passe" - -msgid "Your password was changed." -msgstr "A sua palavra-passe foi modificada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por razões de segurança, introduza a sua palavra-passe antiga e, em seguida, " -"introduza a sua nova palavra-passe duas vezes para podermos verificar se a " -"digitou corretamente." - -msgid "Change my password" -msgstr "Modificar a minha palavra-passe" - -msgid "Password reset" -msgstr "Palavra-passe de reinicialização" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "A sua palavra-passe foi atribuída. Pode entrar agora." - -msgid "Password reset confirmation" -msgstr "Confirmação da reinicialização da palavra-passe" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor, introduza a sua nova palavra-passe duas vezes para verificarmos " -"se está correcta." - -msgid "New password:" -msgstr "Nova palavra-passe:" - -msgid "Confirm password:" -msgstr "Confirmação da palavra-passe:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"O endereço de reinicialização da palavra-passe é inválido, possivelmente " -"porque já foi usado. Por favor requisite uma nova reinicialização da palavra-" -"passe." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Enviámos-lhe um e-mail com instruções para definir a sua palavra-passe, caso " -"exista uma conta com o e-mail que introduziu. Deverá recebê-las em breve." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se não receber uma mensagem de correio eletrónico, certifique-se de que " -"introduziu o endereço com que se registou e verifique a sua pasta de spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Está a receber este email porque pediu para redefinir a palavra-chave para o " -"seu utilizador no site %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor siga a seguinte página e escolha a sua nova palavra-passe:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Obrigado pela sua visita ao nosso site!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "A equipa do %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Esqueceu-se da sua palavra-passe? Introduza o seu endereço de correio " -"eletrónico abaixo e enviar-lhe-emos instruções para definir uma nova palavra-" -"passe." - -msgid "Email address:" -msgstr "Endereço de email:" - -msgid "Reset my password" -msgstr "Reinicializar a minha palavra-passe" - -msgid "Select all objects on this page for an action" -msgstr "Selecione todos os itens nesta página para uma ação" - -msgid "All dates" -msgstr "Todas as datas" - -#, python-format -msgid "Select %s" -msgstr "Selecionar %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selecione %s para modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Selecione %s para ver" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Procurar" - -msgid "Currently:" -msgstr "Atualmente:" - -msgid "Change:" -msgstr "Modificar:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c89c980..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po deleted file mode 100644 index a6f56e1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,319 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Manuela Silva , 2025 -# Nuno Mariz , 2011-2012,2015,2017,2023 -# 12574c6d66324e145c1d19e02acecb73_84badd8 <4e8d94859927eab3b50486d21249c068_5346>, 2011 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Manuela Silva , 2025\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Disponível %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Digite nesta caixa para filtrar a lista de %s disponíveis." - -msgid "Filter" -msgstr "Filtrar" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Escolhido %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Digite nesta caixa para filtrar a lista de selecionados %s." - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opção selecionada não visível" -msgstr[1] "%s opções selecionadas não visíveis" -msgstr[2] "%s opções selecionadas não visíveis" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s selecionado" -msgstr[1] "%(sel)s de %(cnt)s selecionados" -msgstr[2] "%(sel)s de %(cnt)s selecionados" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tem mudanças por guardar nos campos individuais. Se usar uma ação, as suas " -"mudanças por guardar serão perdidas." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Agora" - -msgid "Midnight" -msgstr "Meia-noite" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Meio-dia" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"Nota: O seu fuso horário está %s hora adiantado em relação ao servidor." -msgstr[1] "" -"Nota: O seu fuso horário está %s horas adiantado em relação ao servidor." -msgstr[2] "" -"Nota: O seu fuso horário está %s horas adiantado em relação ao servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Nota: O use fuso horário está %s hora atrasado em relação ao servidor." -msgstr[1] "" -"Nota: O use fuso horário está %s horas atrasado em relação ao servidor." -msgstr[2] "" -"Nota: O use fuso horário está %s horas atrasado em relação ao servidor." - -msgid "Choose a Time" -msgstr "Escolha a Hora" - -msgid "Choose a time" -msgstr "Escolha a hora" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoje" - -msgid "Choose a Date" -msgstr "Escolha a Data" - -msgid "Yesterday" -msgstr "Ontem" - -msgid "Tomorrow" -msgstr "Amanhã" - -msgid "January" -msgstr "Janeiro" - -msgid "February" -msgstr "Fevereiro" - -msgid "March" -msgstr "Março" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Junho" - -msgid "July" -msgstr "Julho" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Dezembro" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Fev" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Set" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Out" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dez" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Monday" -msgstr "Segunda-feira" - -msgid "Tuesday" -msgstr "Terça-feira" - -msgid "Wednesday" -msgstr "Quarta-feira" - -msgid "Thursday" -msgstr "Quinta-feira" - -msgid "Friday" -msgstr "Sexta-feira" - -msgid "Saturday" -msgstr "Sábado" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Seg" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Ter" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Qua" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Qui" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Sex" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sáb" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "S" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Q" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Q" - -msgctxt "one letter Friday" -msgid "F" -msgstr "S" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index 1a2a3b9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index 8318b37..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,821 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# Bruce de Sá , 2019 -# bruno.devpod , 2014 -# Carlos Cadu “Cadu” Leite , 2019 -# Carlos Cadu “Cadu” Leite , 2019 -# Filipe Cifali , 2016 -# dudanogueira , 2012 -# Eduardo Felipe Castegnaro , 2024 -# Elyézer Rezende , 2013 -# Fábio C. Barrionuevo da Luz , 2015 -# Fabio Cerqueira , 2019 -# Francisco Petry Rauber , 2016 -# Gabriel da Mota , 2023 -# Gladson , 2013 -# Guilherme Ferreira , 2017 -# fa9e10542e458baef0599ae856e43651_13d2225, 2012-2013 -# Jannis Leidel , 2011 -# João Paulo Andrade , 2018 -# Jonas Rodrigues, 2023 -# Lucas Infante , 2015 -# Luiz Boaretto , 2017 -# Marssal Jr. , 2022 -# Marcelo Moro Brondani , 2018 -# Marco Rougeth , 2015 -# Otávio Reis , 2018 -# Raysa Dutra, 2016 -# R.J Lelis , 2019 -# Samuel Nogueira Bacelar , 2020 -# Sergio Garcia , 2015 -# Tomaz Marcelino Cunha Neto , 2022 -# Vinícius Damaceno , 2019 -# Vinícius Muniz de Melo , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" -"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Remover %(verbose_name_plural)s selecionados" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Removido %(count)d %(items)s com sucesso." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Não é possível remover %(name)s " - -msgid "Are you sure?" -msgstr "Tem certeza?" - -msgid "Administration" -msgstr "Administração" - -msgid "All" -msgstr "Todos" - -msgid "Yes" -msgstr "Sim" - -msgid "No" -msgstr "Não" - -msgid "Unknown" -msgstr "Desconhecido" - -msgid "Any date" -msgstr "Qualquer data" - -msgid "Today" -msgstr "Hoje" - -msgid "Past 7 days" -msgstr "Últimos 7 dias" - -msgid "This month" -msgstr "Este mês" - -msgid "This year" -msgstr "Este ano" - -msgid "No date" -msgstr "Sem data" - -msgid "Has date" -msgstr "Tem data" - -msgid "Empty" -msgstr "Vazio" - -msgid "Not empty" -msgstr "Não está vazio" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor, insira um %(username)s e senha corretos para uma conta de equipe. " -"Note que ambos campos são sensíveis a maiúsculas e minúsculas." - -msgid "Action:" -msgstr "Ação:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Adicionar outro(a) %(verbose_name)s" - -msgid "Remove" -msgstr "Remover" - -msgid "Addition" -msgstr "Adição" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Remoção" - -msgid "action time" -msgstr "hora da ação" - -msgid "user" -msgstr "usuário" - -msgid "content type" -msgstr "tipo de conteúdo" - -msgid "object id" -msgstr "id do objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr do objeto" - -msgid "action flag" -msgstr "flag de ação" - -msgid "change message" -msgstr "modificar mensagem" - -msgid "log entry" -msgstr "entrada de log" - -msgid "log entries" -msgstr "entradas de log" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Adicionado “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Alterado “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Removido “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Objeto LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Adicionado {name} “{object}”." - -msgid "Added." -msgstr "Adicionado." - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Alterado {fields} para {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Alterado {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Removido {name} “{object}”." - -msgid "No fields changed." -msgstr "Nenhum campo modificado." - -msgid "None" -msgstr "Nenhum" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Pressione “Control”, ou “Command” no Mac, para selecionar mais de um." - -msgid "Select this object for an action - {}" -msgstr "Selecione esse objeto para uma ação - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "O {name} “{obj}” foi adicionado com sucesso." - -msgid "You may edit it again below." -msgstr "Você pode editá-lo novamente abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"O {name} “{obj}” foi adicionado com sucesso. Você pode adicionar outro " -"{name} abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"O {name} “{obj}” foi alterado com sucesso. Você pode alterá-lo novamente " -"abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"O {name} “{obj}” foi alterado com sucesso. Você talvez adicione outro " -"{name} abaixo." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "O {name} “{obj}” foi alterado com sucesso." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Os itens devem ser selecionados em ordem a fim de executar ações sobre eles. " -"Nenhum item foi modificado." - -msgid "No action selected." -msgstr "Nenhuma ação selecionada." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "O %(name)s “%(obj)s” foi removido com sucesso." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "O %(name)s com ID “%(key)s” não existe. Talvez tenha sido removido." - -#, python-format -msgid "Add %s" -msgstr "Adicionar %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "Visualizar %s" - -msgid "Database error" -msgstr "Erro no banco de dados" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s modificado com sucesso." -msgstr[1] "%(count)s %(name)s modificados com sucesso." -msgstr[2] "%(count)s %(name)s modificados com sucesso." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selecionado" -msgstr[1] "Todos %(total_count)s selecionados" -msgstr[2] "Todos %(total_count)s selecionados" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s selecionados" - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de modificações: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Remover o %(class_name)s %(instance)s exigiria remover os seguintes objetos " -"protegidos relacionados: %(related_objects)s" - -msgid "Django site admin" -msgstr "Site de administração do Django" - -msgid "Django administration" -msgstr "Administração do Django" - -msgid "Site administration" -msgstr "Administração do Site" - -msgid "Log in" -msgstr "Acessar" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administração" - -msgid "Page not found" -msgstr "Página não encontrada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Lamentamos, mas a página requisitada não pode ser encontrada." - -msgid "Home" -msgstr "Início" - -msgid "Server error" -msgstr "Erro no servidor" - -msgid "Server error (500)" -msgstr "Erro no servidor (500)" - -msgid "Server Error (500)" -msgstr "Erro no Servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ocorreu um erro. Este foi reportado para os administradores do site via " -"email e deve ser corrigido logo. Obirgado por sua paciência." - -msgid "Run the selected action" -msgstr "Executar ação selecionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Clique aqui para selecionar os objetos de todas as páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Selecionar todos %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Limpar seleção" - -msgid "Breadcrumbs" -msgstr "Marcas de navegação" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos na aplicação %(name)s" - -msgid "Add" -msgstr "Adicionar" - -msgid "View" -msgstr "Visualizar" - -msgid "You don’t have permission to view or edit anything." -msgstr "Você não tem permissão para ver ou editar nada." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Primeiro, informe um nome de usuário e senha. Então, você poderá editar " -"outras opções do usuário." - -msgid "Enter a username and password." -msgstr "Digite um nome de usuário e senha." - -msgid "Change password" -msgstr "Alterar senha" - -msgid "Set password" -msgstr "Definir senha" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Por favor corrija o erro abaixo." -msgstr[1] "Por favor corrija os erros abaixo." -msgstr[2] "Por favor corrija os erros abaixo." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Informe uma nova senha para o usuário %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Esta ação irá habilitarautenticação baseada em senha para " -"este usuário." - -msgid "Disable password-based authentication" -msgstr "Desabilitar autenticação baseada em senha" - -msgid "Enable password-based authentication" -msgstr "Habilitar autenticação baseada em senha" - -msgid "Skip to main content" -msgstr "Ir para o conteúdo principal" - -msgid "Welcome," -msgstr "Bem-vindo(a)," - -msgid "View site" -msgstr "Ver o site" - -msgid "Documentation" -msgstr "Documentação" - -msgid "Log out" -msgstr "Encerrar sessão" - -#, python-format -msgid "Add %(name)s" -msgstr "Adicionar %(name)s" - -msgid "History" -msgstr "Histórico" - -msgid "View on site" -msgstr "Ver no site" - -msgid "Filter" -msgstr "Filtro" - -msgid "Hide counts" -msgstr "Esconder contagem" - -msgid "Show counts" -msgstr "Mostrar contagem" - -msgid "Clear all filters" -msgstr "Limpar todos os filtros" - -msgid "Remove from sorting" -msgstr "Remover da ordenação" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridade da ordenação: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Alternar ordenção" - -msgid "Toggle theme (current theme: auto)" -msgstr "Alternar tema (tema atual: automático)" - -msgid "Toggle theme (current theme: light)" -msgstr "Alternar tema (tema atual: claro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Alternar tema (tema atual: escuro)" - -msgid "Delete" -msgstr "Remover" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"A remoção de '%(object_name)s' %(escaped_object)s pode resultar na remoção " -"de objetos relacionados, mas sua conta não tem a permissão para remoção dos " -"seguintes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Remover o %(object_name)s ' %(escaped_object)s ' exigiria remover os " -"seguintes objetos protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Você tem certeza que quer remover %(object_name)s \"%(escaped_object)s\"? " -"Todos os seguintes itens relacionados serão removidos:" - -msgid "Objects" -msgstr "Objetos" - -msgid "Yes, I’m sure" -msgstr "Sim, eu tenho certeza" - -msgid "No, take me back" -msgstr "Não, me leve de volta" - -msgid "Delete multiple objects" -msgstr "Remover múltiplos objetos" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Remover o %(objects_name)s selecionado pode resultar na remoção de objetos " -"relacionados, mas sua conta não tem permissão para remover os seguintes " -"tipos de objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Remover o %(objects_name)s selecionado exigiria remover os seguintes objetos " -"relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Tem certeza de que deseja remover o %(objects_name)s selecionado? Todos os " -"seguintes objetos e seus itens relacionados serão removidos:" - -msgid "Delete?" -msgstr "Remover?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Por %(filter_title)s " - -msgid "Summary" -msgstr "Resumo" - -msgid "Recent actions" -msgstr "Ações recentes" - -msgid "My actions" -msgstr "Minhas Ações" - -msgid "None available" -msgstr "Nenhum disponível" - -msgid "Added:" -msgstr "Adicionado:" - -msgid "Changed:" -msgstr "Alterado:" - -msgid "Deleted:" -msgstr "Removido:" - -msgid "Unknown content" -msgstr "Conteúdo desconhecido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Alguma coisa está errada com sua estalação do banco de dados. Certifique-se " -"que as tabelas apropriadas foram criadas, e certifique-se que o banco de " -"dados pode ser acessado pelo usuário apropriado." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Você está autenticado como %(username)s, mas não está autorizado a acessar " -"esta página. Você gostaria de realizar login com uma conta diferente?" - -msgid "Forgotten your password or username?" -msgstr "Esqueceu sua senha ou nome de usuário?" - -msgid "Toggle navigation" -msgstr "Alternar navegação" - -msgid "Sidebar" -msgstr "Barra Lateral" - -msgid "Start typing to filter…" -msgstr "Comece a digitar para filtrar…" - -msgid "Filter navigation items" -msgstr "Filtrar itens de navegação" - -msgid "Date/time" -msgstr "Data/hora" - -msgid "User" -msgstr "Usuário" - -msgid "Action" -msgstr "Ação" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrada" -msgstr[1] "entradas" -msgstr[2] "entradas" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Este objeto não tem histórico de alterações. Provavelmente não adicionado " -"por este site de administração." - -msgid "Show all" -msgstr "Mostrar tudo" - -msgid "Save" -msgstr "Salvar" - -msgid "Popup closing…" -msgstr "Popup fechando…" - -msgid "Search" -msgstr "Pesquisar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" -msgstr[2] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Salvar como novo" - -msgid "Save and add another" -msgstr "Salvar e adicionar outro(a)" - -msgid "Save and continue editing" -msgstr "Salvar e continuar editando" - -msgid "Save and view" -msgstr "Salvar e visualizar" - -msgid "Close" -msgstr "Fechar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Alterar %(model)s selecionado" - -#, python-format -msgid "Add another %(model)s" -msgstr "Adicionar outro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Remover %(model)s selecionado" - -#, python-format -msgid "View selected %(model)s" -msgstr "Visualizar %(model)s selecionados" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Obrigado por passar algum tempo de qualidade com o site hoje." - -msgid "Log in again" -msgstr "Acessar novamente" - -msgid "Password change" -msgstr "Alterar senha" - -msgid "Your password was changed." -msgstr "Sua senha foi alterada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Informe sua senha antiga por favor, por motivos de segurança, e então " -"informe sua nova senha duas vezes para que possamos verificar se você " -"digitou tudo corretamente." - -msgid "Change my password" -msgstr "Alterar minha senha" - -msgid "Password reset" -msgstr "Recuperar senha" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Sua senha foi definida. Você pode prosseguir e se autenticar agora." - -msgid "Password reset confirmation" -msgstr "Confirmação de recuperação de senha" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor, informe sua nova senha duas vezes para que possamos verificar se " -"você a digitou corretamente." - -msgid "New password:" -msgstr "Nova senha:" - -msgid "Confirm password:" -msgstr "Confirme a senha:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"O link para a recuperação de senha era inválido, possivelmente porque já foi " -"utilizado. Por favor, solicite uma nova recuperação de senha." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Nos te enviamos um email com instruções para configurar sua senha, se uma " -"conta existe com o email fornecido. Você receberá a mensagem em breve." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se você não recebeu um email, por favor certifique-se que você forneceu o " -"endereço que você está cadastrado, e verifique sua pasta de spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Você está recebendo este email porque solicitou a redefinição da senha da " -"sua conta em %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor, acesse a seguinte página e escolha uma nova senha:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Seu nome de usuário, caso tenha esquecido:" - -msgid "Thanks for using our site!" -msgstr "Obrigado por usar nosso site!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Equipe %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Esqueceu sua senha? Forneça seu endereço de email abaixo, e nos te " -"enviaremos um email com instruções para configurar uma nova." - -msgid "Email address:" -msgstr "Endereço de email:" - -msgid "Reset my password" -msgstr "Reinicializar minha senha" - -msgid "Select all objects on this page for an action" -msgstr "Selecione todos os objetos nessa página para uma ação" - -msgid "All dates" -msgstr "Todas as datas" - -#, python-format -msgid "Select %s" -msgstr "Selecione %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selecione %s para modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Selecione %s para visualizar" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Procurar" - -msgid "Currently:" -msgstr "Atualmente:" - -msgid "Change:" -msgstr "Alterar:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo deleted file mode 100644 index e8fe18a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po deleted file mode 100644 index 10e5080..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,333 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# andrewsmedina , 2016 -# Eduardo Cereto Carvalho, 2011 -# Eduardo Felipe Castegnaro , 2024 -# Gabriel da Mota , 2023 -# fa9e10542e458baef0599ae856e43651_13d2225, 2012 -# Jannis Leidel , 2011 -# Jonas Rodrigues, 2023 -# Lucas Infante , 2015 -# Marssal Jr. , 2022 -# Rafael Fontenelle , 2021 -# Renata Barbosa Almeida , 2016 -# Samuel Nogueira Bacelar , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:59+0000\n" -"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" -"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponíveis" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta é a lista de %s disponíveis. Você pode escolhê-los(as) selecionando-" -"os(as) abaixo e clicando na seta \"Escolher\" entre as duas caixas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Digite nessa caixa para filtrar a lista de %s disponíveis." - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Escolher todos" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Clique para escolher todos os %s de uma só vez" - -msgid "Choose" -msgstr "Escolher" - -msgid "Remove" -msgstr "Remover" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s escolhido(s)" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta é a lista de %s disponíveis. Você pode removê-los(as) selecionando-" -"os(as) abaixo e clicando na seta \"Remover\" entre as duas caixas." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Digite nesta caixa para filtrar a lista de selecionados %s." - -msgid "Remove all" -msgstr "Remover todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Clique para remover de uma só vez todos os %s escolhidos." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opção selecionada não visível" -msgstr[1] "%s opções selecionadas não visíveis" -msgstr[2] "%s opções selecionadas não visíveis" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s selecionado" -msgstr[1] "%(sel)s de %(cnt)s selecionados" -msgstr[2] "%(sel)s de %(cnt)s selecionados" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Você tem alterações não salvas em campos editáveis individuais. Se você " -"executar uma ação suas alterações não salvas serão perdidas." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Você selecionou uma ação, mas você ainda não salvou suas alterações nos " -"campos individuais. Por favor clique OK para salvar. você precisará de rodar " -"novamente a ação." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Você selecionou uma ação sem fazer mudanças nos campos individuais. Você " -"provavelmente está procurando pelo botão Ir ao invés do botão Salvar." - -msgid "Now" -msgstr "Agora" - -msgid "Midnight" -msgstr "Meia-noite" - -msgid "6 a.m." -msgstr "6 da manhã" - -msgid "Noon" -msgstr "Meio-dia" - -msgid "6 p.m." -msgstr "6 da tarde" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Você está %s hora à frente do horário do servidor." -msgstr[1] "Nota: Você está %s horas à frente do horário do servidor." -msgstr[2] "Nota: Você está %s horas à frente do horário do servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Você está %s hora atrás do tempo do servidor." -msgstr[1] "Nota: Você está %s horas atrás do horário do servidor." -msgstr[2] "Nota: Você está %s horas atrás do horário do servidor." - -msgid "Choose a Time" -msgstr "Escolha um horário" - -msgid "Choose a time" -msgstr "Escolha uma hora" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoje" - -msgid "Choose a Date" -msgstr "Escolha uma data" - -msgid "Yesterday" -msgstr "Ontem" - -msgid "Tomorrow" -msgstr "Amanhã" - -msgid "January" -msgstr "Janeiro" - -msgid "February" -msgstr "Fevereiro" - -msgid "March" -msgstr "Março" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Junho" - -msgid "July" -msgstr "Julho" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Dezembro" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Fev" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Set" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Out" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dez" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Monday" -msgstr "Segunda-feira" - -msgid "Tuesday" -msgstr "Terça-feira" - -msgid "Wednesday" -msgstr "Quarta-feira" - -msgid "Thursday" -msgstr "Quinta-feira" - -msgid "Friday" -msgstr "Sexta-feira" - -msgid "Saturday" -msgstr "Sábado" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Seg" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Ter" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Qua" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Qui" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Sex" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sáb" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "S" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Q" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Q" - -msgctxt "one letter Friday" -msgid "F" -msgstr "S" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index 4fe6d2e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index f328477..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,758 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bogdan Mateescu, 2018-2019 -# Daniel Ursache-Dogariu, 2011,2022 -# Denis Darii , 2011,2014 -# Eugenol Man , 2020 -# Ionel Cristian Mărieș , 2012 -# Jannis Leidel , 2011 -# Mihai Fotea , 2020 -# Razvan Stefanescu , 2015-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-25 07:05+0000\n" -"Last-Translator: Daniel Ursache-Dogariu, 2011,2022\n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Elimină %(verbose_name_plural)s selectate" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s șterse cu succes." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nu se poate șterge %(name)s" - -msgid "Are you sure?" -msgstr "Sigur?" - -msgid "Administration" -msgstr "Administrare" - -msgid "All" -msgstr "Toate" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Nu" - -msgid "Unknown" -msgstr "Necunoscut" - -msgid "Any date" -msgstr "Orice dată" - -msgid "Today" -msgstr "Astăzi" - -msgid "Past 7 days" -msgstr "Ultimele 7 zile" - -msgid "This month" -msgstr "Luna aceasta" - -msgid "This year" -msgstr "Anul acesta" - -msgid "No date" -msgstr "Fără dată" - -msgid "Has date" -msgstr "Are dată" - -msgid "Empty" -msgstr "Gol" - -msgid "Not empty" -msgstr "Nu este gol" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Introduceți vă rog un %(username)s și parola corectă pentru un cont de " -"membru. De remarcat că ambele pot conține majuscule." - -msgid "Action:" -msgstr "Acțiune:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Adăugati încă un/o %(verbose_name)s" - -msgid "Remove" -msgstr "Elimină" - -msgid "Addition" -msgstr "Adăugare" - -msgid "Change" -msgstr "Schimbare" - -msgid "Deletion" -msgstr "Ștergere" - -msgid "action time" -msgstr "timp acțiune" - -msgid "user" -msgstr "utilizator" - -msgid "content type" -msgstr "tip de conținut" - -msgid "object id" -msgstr "id obiect" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr obiect" - -msgid "action flag" -msgstr "marcaj acțiune" - -msgid "change message" -msgstr "mesaj schimbare" - -msgid "log entry" -msgstr "intrare jurnal" - -msgid "log entries" -msgstr "intrări jurnal" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Adăugat %(object)s" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Schimbat “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Șters “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Obiect LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Adăugat {name} “{object}”." - -msgid "Added." -msgstr "Adăugat." - -msgid "and" -msgstr "și" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} schimbat pentru {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "S-au schimbat {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Șters {name} “{object}”." - -msgid "No fields changed." -msgstr "Niciun câmp modificat." - -msgid "None" -msgstr "Nimic" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" a fost adăugat cu succes." - -msgid "You may edit it again below." -msgstr "Poți edita din nou mai jos." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\" a fost adăugat cu succes. Poți adăuga alt {name} mai jos." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" a fost modificat cu succes. Poți să editezi în continuare " -"mai jos." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" a fost adăugat cu succes. Poți să editezi în continuare mai " -"jos." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" a fost modificat cu succes. Poți adăuga alt {name} mai jos." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" a fost schimbat cu succes." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Itemii trebuie selectați pentru a putea îndeplini sarcini asupra lor. Niciun " -"item nu a fost modificat." - -msgid "No action selected." -msgstr "Nicio acțiune selectată." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Adaugă %s" - -#, python-format -msgid "Change %s" -msgstr "Schimbă %s" - -#, python-format -msgid "View %s" -msgstr "Vizualizează %s" - -msgid "Database error" -msgstr "Eroare de bază de date" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s s-a modificat cu succes." -msgstr[1] "%(count)s %(name)s s-au modificat cu succes." -msgstr[2] "%(count)s de %(name)s s-au modificat cu succes." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selectat(ă)" -msgstr[1] "Toate %(total_count)s selectate" -msgstr[2] "Toate %(total_count)s selectate" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 din %(cnt)s selectat" - -#, python-format -msgid "Change history: %s" -msgstr "Istoric schimbări: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Ștergerea %(class_name)s %(instance)s ar necesita ștergerea următoarelor " -"obiecte asociate protejate: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administrare site Django" - -msgid "Django administration" -msgstr "Administrare Django" - -msgid "Site administration" -msgstr "Administrare site" - -msgid "Log in" -msgstr "Autentificare" - -#, python-format -msgid "%(app)s administration" -msgstr "administrare %(app)s" - -msgid "Page not found" -msgstr "Pagină inexistentă" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Din păcate nu am găsit pagina solicitată" - -msgid "Home" -msgstr "Acasă" - -msgid "Server error" -msgstr "Eroare de server" - -msgid "Server error (500)" -msgstr "Eroare de server (500)" - -msgid "Server Error (500)" -msgstr "Eroare server (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Pornește acțiunea selectată" - -msgid "Go" -msgstr "Start" - -msgid "Click here to select the objects across all pages" -msgstr "Clic aici pentru a selecta obiectele la nivelul tuturor paginilor" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Selectați toate %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Deselectați" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele în aplicația %(name)s" - -msgid "Add" -msgstr "Adaugă" - -msgid "View" -msgstr "Vizualizează" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Introduceți un nume de utilizator și o parolă." - -msgid "Change password" -msgstr "Schimbă parola" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Introduceți o parolă nouă pentru utilizatorul %(username)s." - -msgid "Skip to main content" -msgstr "" - -msgid "Welcome," -msgstr "Bun venit," - -msgid "View site" -msgstr "Vizualizare site" - -msgid "Documentation" -msgstr "Documentație" - -msgid "Log out" -msgstr "Deconectează-te" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "Adaugă %(name)s" - -msgid "History" -msgstr "Istoric" - -msgid "View on site" -msgstr "Vizualizează pe site" - -msgid "Filter" -msgstr "Filtru" - -msgid "Clear all filters" -msgstr "Șterge toate filtrele" - -msgid "Remove from sorting" -msgstr "Elimină din sortare" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritate sortare: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Alternează sortarea" - -msgid "Toggle theme (current theme: auto)" -msgstr "" - -msgid "Toggle theme (current theme: light)" -msgstr "" - -msgid "Toggle theme (current theme: dark)" -msgstr "" - -msgid "Delete" -msgstr "Șterge" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Ștergerea %(object_name)s '%(escaped_object)s' va duce și la ștergerea " -"obiectelor asociate, însă contul dumneavoastră nu are permisiunea de a " -"șterge următoarele tipuri de obiecte:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Ștergerea %(object_name)s '%(escaped_object)s' ar putea necesita și " -"ștergerea următoarelor obiecte protejate asociate:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Sigur doriți ștergerea %(object_name)s \"%(escaped_object)s\"? Următoarele " -"itemuri asociate vor fi șterse:" - -msgid "Objects" -msgstr "Obiecte" - -msgid "Yes, I’m sure" -msgstr "Da, sunt sigur" - -msgid "No, take me back" -msgstr "Nu, vreau să mă întorc" - -msgid "Delete multiple objects" -msgstr "Ștergeți obiecte multiple" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Ștergerea %(objects_name)s conform selecției ar putea duce la ștergerea " -"obiectelor asociate, însă contul dvs. de utilizator nu are permisiunea de a " -"șterge următoarele tipuri de obiecte:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Ştergerea %(objects_name)s conform selecției ar necesita și ștergerea " -"următoarelor obiecte protejate asociate:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Sigur doriţi să ștergeți %(objects_name)s conform selecției? Toate obiectele " -"următoare alături de cele asociate lor vor fi șterse:" - -msgid "Delete?" -msgstr "Elimină?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "După %(filter_title)s " - -msgid "Summary" -msgstr "Sumar" - -msgid "Recent actions" -msgstr "Acțiuni recente" - -msgid "My actions" -msgstr "Acțiunile mele" - -msgid "None available" -msgstr "Niciuna" - -msgid "Unknown content" -msgstr "Conținut necunoscut" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Sunteți autentificat ca %(username)s, dar nu sunteți autorizat să accesați " -"această pagină. Doriți să vă autentificați cu un alt cont?" - -msgid "Forgotten your password or username?" -msgstr "Ați uitat parola sau utilizatorul ?" - -msgid "Toggle navigation" -msgstr "Comutare navigație" - -msgid "Sidebar" -msgstr "" - -msgid "Start typing to filter…" -msgstr "Începeți să scrieți pentru filtrare..." - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Dată/oră" - -msgid "User" -msgstr "Utilizator" - -msgid "Action" -msgstr "Acțiune" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Arată totul" - -msgid "Save" -msgstr "Salvează" - -msgid "Popup closing…" -msgstr "Fereastra se închide..." - -msgid "Search" -msgstr "Caută" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s rezultat" -msgstr[1] "%(counter)s rezultate" -msgstr[2] "%(counter)s de rezultate" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s în total" - -msgid "Save as new" -msgstr "Salvați ca nou" - -msgid "Save and add another" -msgstr "Salvați și mai adăugați" - -msgid "Save and continue editing" -msgstr "Salvați și continuați editarea" - -msgid "Save and view" -msgstr "Salvează și vizualizează" - -msgid "Close" -msgstr "Închide" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Modifică %(model)s selectat" - -#, python-format -msgid "Add another %(model)s" -msgstr "Adaugă alt %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Șterge %(model)s selectat" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Reautentificare" - -msgid "Password change" -msgstr "Schimbare parolă" - -msgid "Your password was changed." -msgstr "Parola a fost schimbată." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Vă rog introduceți parola veche, pentru securitate, apoi introduceți parola " -"nouă de doua ori pentru a verifica dacă a fost scrisă corect. " - -msgid "Change my password" -msgstr "Schimbă-mi parola" - -msgid "Password reset" -msgstr "Resetare parolă" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Parola dumneavoastră a fost stabilită. Acum puteți continua să vă " -"autentificați." - -msgid "Password reset confirmation" -msgstr "Confirmare resetare parolă" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Introduceți parola de două ori, pentru a putea verifica dacă ați scris-o " -"corect." - -msgid "New password:" -msgstr "Parolă nouă:" - -msgid "Confirm password:" -msgstr "Confirmare parolă:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Link-ul de resetare a parolei a fost nevalid, probabil din cauză că acesta a " -"fost deja utilizat. Solicitați o nouă resetare a parolei." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Am trimis instrucțiuni pentru a seta parola, daca există un cont cu email-ul " -"introdus. O sa-l primiți cât de curând." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Dacă nu ați primit un email, verificați vă rog dacă ați introdus adresa cu " -"care v-ați înregistrat și verificați si folderul Spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Primiți acest email deoarece ați cerut o resetare a parolei pentru contul de " -"utilizator de la %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Mergeți la următoarea pagină și alegeți o parolă nouă:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Numele tău de utilizator, în caz că l-ai uitat:" - -msgid "Thanks for using our site!" -msgstr "Mulțumiri pentru utilizarea sitului nostru!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Echipa %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Ați uitat parola ? Introduceți adresa de email mai jos și vă vom trimite " -"instrucțiuni pentru o parolă nouă." - -msgid "Email address:" -msgstr "Adresă e-mail:" - -msgid "Reset my password" -msgstr "Resetează-mi parola" - -msgid "All dates" -msgstr "Toate datele" - -#, python-format -msgid "Select %s" -msgstr "Selectează %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selectează %s pentru schimbare" - -#, python-format -msgid "Select %s to view" -msgstr "Selecteză %s pentru a vizualiza" - -msgid "Date:" -msgstr "Dată:" - -msgid "Time:" -msgstr "Oră:" - -msgid "Lookup" -msgstr "Căutare" - -msgid "Currently:" -msgstr "În prezent:" - -msgid "Change:" -msgstr "Schimbă:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 59f694e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po deleted file mode 100644 index e681dde..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,228 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bogdan Mateescu, 2018-2019 -# Daniel Ursache-Dogariu, 2011 -# Denis Darii , 2011 -# Eugenol Man , 2020 -# Ionel Cristian Mărieș , 2012 -# Jannis Leidel , 2011 -# razvan ionescu , 2015 -# Razvan Stefanescu , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-07-15 11:16+0000\n" -"Last-Translator: Eugenol Man \n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponibil" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Aceasta este o listă cu %s disponibile. Le puteți alege selectând mai multe " -"in chenarul de mai jos și apăsând pe săgeata \"Alege\" dintre cele două " -"chenare." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Scrie în acest chenar pentru a filtra lista de %s disponibile." - -msgid "Filter" -msgstr "Filtru" - -msgid "Choose all" -msgstr "Alege toate" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Click pentru a alege toate %s." - -msgid "Choose" -msgstr "Alege" - -msgid "Remove" -msgstr "Elimină" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s alese" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Aceasta este lista de %s alese. Puteți elimina din ele selectându-le in " -"chenarul de mai jos și apasand pe săgeata \"Elimină\" dintre cele două " -"chenare." - -msgid "Remove all" -msgstr "Elimină toate" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Click pentru a elimina toate %s alese." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s din %(cnt)s selectate" -msgstr[1] "%(sel)s din %(cnt)s selectate" -msgstr[2] "de %(sel)s din %(cnt)s selectate" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Aveţi modificări nesalvate în cîmpuri individuale editabile. Dacă executaţi " -"o acțiune, modificările nesalvate vor fi pierdute." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Ai selectat o acțiune dar nu ai salvat modificările făcute în câmpuri " -"individuale. Te rugăm apasa Ok pentru a salva. Va trebui sa reiei acțiunea." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ai selectat o acțiune și nu ai făcut modificări. Probabil că dorești butonul " -"de Go mai putin cel de Salvează." - -msgid "Now" -msgstr "Acum" - -msgid "Midnight" -msgstr "Miezul nopții" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Amiază" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Notă: Sunteți cu %s oră înaintea orei serverului." -msgstr[1] "Notă: Sunteți cu %s ore înaintea orei serverului." -msgstr[2] "Notă: Sunteți cu %s de ore înaintea orei serverului." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Notă: Sunteți cu %s oră în urma orei serverului." -msgstr[1] "Notă: Sunteți cu %s ore în urma orei serverului." -msgstr[2] "Notă: Sunteți cu %s de ore în urma orei serverului." - -msgid "Choose a Time" -msgstr "Alege o oră" - -msgid "Choose a time" -msgstr "Alege o oră" - -msgid "Cancel" -msgstr "Anulează" - -msgid "Today" -msgstr "Astăzi" - -msgid "Choose a Date" -msgstr "Alege o dată" - -msgid "Yesterday" -msgstr "Ieri" - -msgid "Tomorrow" -msgstr "Mâine" - -msgid "January" -msgstr "Ianuarie" - -msgid "February" -msgstr "Februarie" - -msgid "March" -msgstr "Martie" - -msgid "April" -msgstr "Aprilie" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Iunie" - -msgid "July" -msgstr "Iulie" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "Septembrie" - -msgid "October" -msgstr "Octombrie" - -msgid "November" -msgstr "Noiembrie" - -msgid "December" -msgstr "Decembrie" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Arată" - -msgid "Hide" -msgstr "Ascunde" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index f95653f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index c77ffd1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,807 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Alex Ibragimov, 2021 -# Ivan Ivaschenko , 2013 -# Denis Darii , 2011 -# Dimmus , 2011 -# Eugene , 2016-2017 -# crazyzubr , 2020 -# Sergey , 2016 -# Jannis Leidel , 2011 -# SeryiMysh , 2020 -# Алексей Борискин , 2012-2015,2022-2024 -# Дмитрий , 2019 -# Bobsans , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: Алексей Борискин , 2012-2015,2022-2024\n" -"Language-Team: Russian (http://app.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Удалить выбранные %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Успешно удалены %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Не удается удалить %(name)s" - -msgid "Are you sure?" -msgstr "Вы уверены?" - -msgid "Administration" -msgstr "Администрирование" - -msgid "All" -msgstr "Все" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Нет" - -msgid "Unknown" -msgstr "Неизвестно" - -msgid "Any date" -msgstr "Любая дата" - -msgid "Today" -msgstr "Сегодня" - -msgid "Past 7 days" -msgstr "Последние 7 дней" - -msgid "This month" -msgstr "Этот месяц" - -msgid "This year" -msgstr "Этот год" - -msgid "No date" -msgstr "Дата не указана" - -msgid "Has date" -msgstr "Дата указана" - -msgid "Empty" -msgstr "Пусто" - -msgid "Not empty" -msgstr "Не пусто" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Пожалуйста, введите корректные %(username)s и пароль учётной записи. Оба " -"поля могут быть чувствительны к регистру." - -msgid "Action:" -msgstr "Действие:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Добавить еще один %(verbose_name)s" - -msgid "Remove" -msgstr "Удалить" - -msgid "Addition" -msgstr "Добавление" - -msgid "Change" -msgstr "Изменить" - -msgid "Deletion" -msgstr "Удаление" - -msgid "action time" -msgstr "время действия" - -msgid "user" -msgstr "пользователь" - -msgid "content type" -msgstr "тип содержимого" - -msgid "object id" -msgstr "идентификатор объекта" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "представление объекта" - -msgid "action flag" -msgstr "тип действия" - -msgid "change message" -msgstr "сообщение об изменении" - -msgid "log entry" -msgstr "запись в журнале" - -msgid "log entries" -msgstr "записи в журнале" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Добавлено “%(object)s“." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Изменено “%(object)s“ - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Удалено “%(object)s.“" - -msgid "LogEntry Object" -msgstr "Запись в журнале" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Добавлен {name} “{object}“." - -msgid "Added." -msgstr "Добавлено." - -msgid "and" -msgstr "и" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Изменено {fields} у {name} “{object}“." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Изменено {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Удален {name} “{object}“." - -msgid "No fields changed." -msgstr "Ни одно поле не изменено." - -msgid "None" -msgstr "Нет" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Удерживайте “Control“ (или “Command“ на Mac), чтобы выбрать несколько " -"значений." - -msgid "Select this object for an action - {}" -msgstr "Выбрать этот объект, чтобы применить к нему действие - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" был успешно добавлен." - -msgid "You may edit it again below." -msgstr "Вы можете снова изменить этот объект ниже." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}“ был успешно добавлен. Вы можете добавить еще один {name} ниже." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}“ был изменен успешно. Вы можете отредактировать его снова ниже." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} “{obj}“ был изменен. Вы можете добавить еще один {name} ниже." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}“ был успешно изменен." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Чтобы произвести действия над объектами, необходимо их выбрать. Объекты не " -"были изменены." - -msgid "No action selected." -msgstr "Действие не выбрано." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s“ был успешно удален." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s с ID “%(key)s“ не существует. Возможно оно было удалено?" - -#, python-format -msgid "Add %s" -msgstr "Добавить %s" - -#, python-format -msgid "Change %s" -msgstr "Изменить %s" - -#, python-format -msgid "View %s" -msgstr "Просмотреть %s" - -msgid "Database error" -msgstr "Ошибка базы данных" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s был успешно изменен." -msgstr[1] "%(count)s %(name)s были успешно изменены." -msgstr[2] "%(count)s %(name)s были успешно изменены." -msgstr[3] "%(count)s %(name)s были успешно изменены." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Выбран %(total_count)s" -msgstr[1] "Выбраны все %(total_count)s" -msgstr[2] "Выбраны все %(total_count)s" -msgstr[3] "Выбраны все %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Выбрано 0 объектов из %(cnt)s " - -#, python-format -msgid "Change history: %s" -msgstr "История изменений: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Удаление объекта %(instance)s типа %(class_name)s будет требовать удаления " -"следующих связанных объектов: %(related_objects)s" - -msgid "Django site admin" -msgstr "Административный сайт Django" - -msgid "Django administration" -msgstr "Администрирование Django" - -msgid "Site administration" -msgstr "Администрирование сайта" - -msgid "Log in" -msgstr "Войти" - -#, python-format -msgid "%(app)s administration" -msgstr "Администрирование приложения «%(app)s»" - -msgid "Page not found" -msgstr "Страница не найдена" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "К сожалению, запрашиваемая вами страница не найдена." - -msgid "Home" -msgstr "Начало" - -msgid "Server error" -msgstr "Ошибка сервера" - -msgid "Server error (500)" -msgstr "Ошибка сервера (500)" - -msgid "Server Error (500)" -msgstr "Ошибка сервера (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Произошла ошибка. О ней сообщено администраторам сайта по электронной почте, " -"ошибка должна быть вскоре исправлена. Благодарим вас за терпение." - -msgid "Run the selected action" -msgstr "Выполнить выбранное действие" - -msgid "Go" -msgstr "Выполнить" - -msgid "Click here to select the objects across all pages" -msgstr "Нажмите здесь, чтобы выбрать объекты на всех страницах" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Выбрать все %(module_name)s (%(total_count)s)" - -msgid "Clear selection" -msgstr "Снять выделение" - -msgid "Breadcrumbs" -msgstr "Хлебные крошки" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели в приложении %(name)s" - -msgid "Add" -msgstr "Добавить" - -msgid "View" -msgstr "Просмотреть" - -msgid "You don’t have permission to view or edit anything." -msgstr "У вас недостаточно полномочий для просмотра или изменения чего либо." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Сначала введите имя пользователя и пароль. Затем вы сможете ввести больше " -"информации о пользователе." - -msgid "Enter a username and password." -msgstr "Введите имя пользователя и пароль." - -msgid "Change password" -msgstr "Изменить пароль" - -msgid "Set password" -msgstr "Задать пароль" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Пожалуйста, исправьте ошибку ниже." -msgstr[1] "Пожалуйста, исправьте ошибки ниже." -msgstr[2] "Пожалуйста, исправьте ошибки ниже." -msgstr[3] "Пожалуйста, исправьте ошибки ниже." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Введите новый пароль для пользователя %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Это действие разрешит парольную аутентификацию для этого " -"пользователя." - -msgid "Disable password-based authentication" -msgstr "Запретить аутентификацию по паролю" - -msgid "Enable password-based authentication" -msgstr "Разрешить аутентификацию по паролю" - -msgid "Skip to main content" -msgstr "К основному" - -msgid "Welcome," -msgstr "Добро пожаловать," - -msgid "View site" -msgstr "Открыть сайт" - -msgid "Documentation" -msgstr "Документация" - -msgid "Log out" -msgstr "Выйти" - -#, python-format -msgid "Add %(name)s" -msgstr "Добавить %(name)s" - -msgid "History" -msgstr "История" - -msgid "View on site" -msgstr "Смотреть на сайте" - -msgid "Filter" -msgstr "Фильтр" - -msgid "Hide counts" -msgstr "Скрыть счётчики" - -msgid "Show counts" -msgstr "Показать счётчики" - -msgid "Clear all filters" -msgstr "Сбросить все фильтры" - -msgid "Remove from sorting" -msgstr "Удалить из сортировки" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Приоритет сортировки: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Сортировать в другом направлении" - -msgid "Toggle theme (current theme: auto)" -msgstr "Переключить тему (текущая: выбрана автоматически)" - -msgid "Toggle theme (current theme: light)" -msgstr "Переключить тему (текущая: светлая)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Переключить тему (текущая: тёмная)" - -msgid "Delete" -msgstr "Удалить" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Удаление %(object_name)s '%(escaped_object)s' приведет к удалению связанных " -"объектов, но ваша учетная запись не имеет прав для удаления следующих типов " -"объектов:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Удаление %(object_name)s '%(escaped_object)s' потребует удаления следующих " -"связанных защищенных объектов:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Вы уверены, что хотите удалить %(object_name)s \"%(escaped_object)s\"? Все " -"следующие связанные объекты также будут удалены:" - -msgid "Objects" -msgstr "Объекты" - -msgid "Yes, I’m sure" -msgstr "Да, я уверен" - -msgid "No, take me back" -msgstr "Нет, отменить и вернуться к выбору" - -msgid "Delete multiple objects" -msgstr "Удалить несколько объектов" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Удаление выбранной %(objects_name)s приведет к удалению связанных объектов, " -"но ваша учетная запись не имеет прав на удаление следующих типов объектов:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Удаление %(objects_name)s потребует удаления следующих связанных защищенных " -"объектов:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Вы уверены, что хотите удалить %(objects_name)s? Все следующие объекты и " -"связанные с ними элементы будут удалены:" - -msgid "Delete?" -msgstr "Удалить?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s" - -msgid "Summary" -msgstr "Краткая статистика" - -msgid "Recent actions" -msgstr "Последние действия" - -msgid "My actions" -msgstr "Мои действия" - -msgid "None available" -msgstr "Недоступно" - -msgid "Added:" -msgstr "Создано:" - -msgid "Changed:" -msgstr "Изменено:" - -msgid "Deleted:" -msgstr "Удалено:" - -msgid "Unknown content" -msgstr "Неизвестный тип" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Ваша база данных неправильно настроена. Убедитесь, что соответствующие " -"таблицы были созданы, и что соответствующему пользователю разрешен к ним " -"доступ." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Вы вошли в систему как %(username)s, однако у вас недостаточно прав для " -"просмотра данной страницы. Возможно, вы хотели бы войти в систему, используя " -"другую учётную запись?" - -msgid "Forgotten your password or username?" -msgstr "Забыли свой пароль или имя пользователя?" - -msgid "Toggle navigation" -msgstr "Переключить навигацию" - -msgid "Sidebar" -msgstr "Боковая панель" - -msgid "Start typing to filter…" -msgstr "Начните печатать для фильтрации..." - -msgid "Filter navigation items" -msgstr "Фильтр элементов навигации" - -msgid "Date/time" -msgstr "Дата и время" - -msgid "User" -msgstr "Пользователь" - -msgid "Action" -msgstr "Действие" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "запись" -msgstr[1] "записи" -msgstr[2] "записей" -msgstr[3] "записей" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Данный объект не имеет истории изменений. Возможно, он был добавлен не через " -"данный административный сайт." - -msgid "Show all" -msgstr "Показать все" - -msgid "Save" -msgstr "Сохранить" - -msgid "Popup closing…" -msgstr "Всплывающее окно закрывается..." - -msgid "Search" -msgstr "Найти" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s результат" -msgstr[1] "%(counter)s результата" -msgstr[2] "%(counter)s результатов" -msgstr[3] "%(counter)s результатов" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s всего" - -msgid "Save as new" -msgstr "Сохранить как новый объект" - -msgid "Save and add another" -msgstr "Сохранить и добавить другой объект" - -msgid "Save and continue editing" -msgstr "Сохранить и продолжить редактирование" - -msgid "Save and view" -msgstr "Сохранить и просмотреть" - -msgid "Close" -msgstr "Закрыть" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Изменить выбранный объект типа \"%(model)s\"" - -#, python-format -msgid "Add another %(model)s" -msgstr "Добавить ещё один объект типа \"%(model)s\"" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Удалить выбранный объект типа \"%(model)s\"" - -#, python-format -msgid "View selected %(model)s" -msgstr "Просмотреть выбранный объект типа \"%(model)s\"" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Благодарим вас за время, проведенное на этом сайте." - -msgid "Log in again" -msgstr "Войти снова" - -msgid "Password change" -msgstr "Изменение пароля" - -msgid "Your password was changed." -msgstr "Ваш пароль был изменен." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"В целях безопасности, пожалуйста, введите свой старый пароль, затем введите " -"новый пароль дважды, чтобы мы могли убедиться в правильности написания." - -msgid "Change my password" -msgstr "Изменить мой пароль" - -msgid "Password reset" -msgstr "Восстановление пароля" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Ваш пароль был сохранен. Теперь вы можете войти." - -msgid "Password reset confirmation" -msgstr "Подтверждение восстановления пароля" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Пожалуйста, введите новый пароль дважды, чтобы мы могли убедиться в " -"правильности написания." - -msgid "New password:" -msgstr "Новый пароль:" - -msgid "Confirm password:" -msgstr "Подтвердите пароль:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Неверная ссылка для восстановления пароля. Возможно, ей уже воспользовались. " -"Пожалуйста, попробуйте восстановить пароль еще раз." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Мы отправили вам инструкцию по установке нового пароля на указанный адрес " -"электронной почты (если в нашей базе данных есть такой адрес). Вы должны " -"получить ее в ближайшее время." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Если вы не получили письмо, пожалуйста, убедитесь, что вы ввели адрес с " -"которым Вы зарегистрировались, и проверьте папку со спамом." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Вы получили это письмо, потому что вы (или кто-то другой) запросили " -"восстановление пароля от учётной записи на сайте %(site_name)s, которая " -"связана с этим адресом электронной почты." - -msgid "Please go to the following page and choose a new password:" -msgstr "Пожалуйста, перейдите на эту страницу и введите новый пароль:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Ваше имя пользователя (на случай, если вы его забыли):" - -msgid "Thanks for using our site!" -msgstr "Спасибо, что используете наш сайт!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Команда сайта %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Забыли пароль? Введите свой адрес электронной почты ниже, и мы вышлем вам " -"инструкцию, как установить новый пароль." - -msgid "Email address:" -msgstr "Адрес электронной почты:" - -msgid "Reset my password" -msgstr "Восстановить мой пароль" - -msgid "Select all objects on this page for an action" -msgstr "Выбрать все объекты на этой странице, чтобы применить к ним действие" - -msgid "All dates" -msgstr "Все даты" - -#, python-format -msgid "Select %s" -msgstr "Выберите %s" - -#, python-format -msgid "Select %s to change" -msgstr "Выберите %s для изменения" - -#, python-format -msgid "Select %s to view" -msgstr "Выберите %s для просмотра" - -msgid "Date:" -msgstr "Дата:" - -msgid "Time:" -msgstr "Время:" - -msgid "Lookup" -msgstr "Поиск" - -msgid "Currently:" -msgstr "Сейчас:" - -msgid "Change:" -msgstr "Изменить:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 6bf7a81..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po deleted file mode 100644 index cb33c01..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,350 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Denis Darii , 2011 -# Dimmus , 2011 -# Eugene , 2012 -# Eugene , 2016 -# crazyzubr , 2020 -# Jannis Leidel , 2011 -# Panasoft, 2021 -# Алексей Борискин , 2012,2014-2015,2022-2023 -# Андрей Щуров , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Алексей Борискин , " -"2012,2014-2015,2022-2023\n" -"Language-Team: Russian (http://app.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Доступные %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Это список всех доступных %s. Вы можете выбрать некоторые из них, выделив их " -"в поле ниже и кликнув \"Выбрать\", либо двойным щелчком." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Начните вводить текст в этом поле, чтобы отфитровать список доступных %s." - -msgid "Filter" -msgstr "Фильтр" - -msgid "Choose all" -msgstr "Выбрать все" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Нажмите, чтобы выбрать все %s сразу." - -msgid "Choose" -msgstr "Выбрать" - -msgid "Remove" -msgstr "Удалить" - -#, javascript-format -msgid "Chosen %s" -msgstr "Выбранные %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Это список выбранных %s. Вы можете удалить некоторые из них, выделив их в " -"поле ниже и кликнув \"Удалить\", либо двойным щелчком." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"Набирайте символы в этом поле, чтобы отфильтровать список выбранных %s." - -msgid "Remove all" -msgstr "Удалить все" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Нажмите чтобы удалить все %s сразу." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s выбранный объект не виден" -msgstr[1] "%s выбранных объекта не видны" -msgstr[2] "%s выбранных объектов не видны" -msgstr[3] "%s выбранных объектов не видны" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Выбран %(sel)s из %(cnt)s" -msgstr[1] "Выбрано %(sel)s из %(cnt)s" -msgstr[2] "Выбрано %(sel)s из %(cnt)s" -msgstr[3] "Выбрано %(sel)s из %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Имеются несохраненные изменения в отдельных полях для редактирования. Если " -"вы запустите действие, несохраненные изменения будут потеряны." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Вы выбрали действие, но еще не сохранили изменения, внесенные в некоторых " -"полях для редактирования. Нажмите OK, чтобы сохранить изменения. После " -"сохранения вам придется запустить действие еще раз." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Вы выбрали действие и не внесли изменений в данные. Возможно, вы хотели " -"воспользоваться кнопкой \"Выполнить\", а не кнопкой \"Сохранить\". Если это " -"так, то нажмите \"Отмена\", чтобы вернуться в интерфейс редактирования." - -msgid "Now" -msgstr "Сейчас" - -msgid "Midnight" -msgstr "Полночь" - -msgid "6 a.m." -msgstr "6 утра" - -msgid "Noon" -msgstr "Полдень" - -msgid "6 p.m." -msgstr "6 вечера" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Внимание: Ваше локальное время опережает время сервера на %s час." -msgstr[1] "Внимание: Ваше локальное время опережает время сервера на %s часа." -msgstr[2] "Внимание: Ваше локальное время опережает время сервера на %s часов." -msgstr[3] "Внимание: Ваше локальное время опережает время сервера на %s часов." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Внимание: Ваше локальное время отстаёт от времени сервера на %s час." -msgstr[1] "" -"Внимание: Ваше локальное время отстаёт от времени сервера на %s часа." -msgstr[2] "" -"Внимание: Ваше локальное время отстаёт от времени сервера на %s часов." -msgstr[3] "" -"Внимание: Ваше локальное время отстаёт от времени сервера на %s часов." - -msgid "Choose a Time" -msgstr "Выберите время" - -msgid "Choose a time" -msgstr "Выберите время" - -msgid "Cancel" -msgstr "Отмена" - -msgid "Today" -msgstr "Сегодня" - -msgid "Choose a Date" -msgstr "Выберите дату" - -msgid "Yesterday" -msgstr "Вчера" - -msgid "Tomorrow" -msgstr "Завтра" - -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Янв" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Фев" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Мар" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Апр" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Июн" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Июл" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Авг" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Сен" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Окт" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Ноя" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Дек" - -msgid "Sunday" -msgstr "Воскресенье" - -msgid "Monday" -msgstr "Понедельник" - -msgid "Tuesday" -msgstr "Вторник" - -msgid "Wednesday" -msgstr "Среда" - -msgid "Thursday" -msgstr "Четверг" - -msgid "Friday" -msgstr "Пятница" - -msgid "Saturday" -msgstr "Суббота" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Вс" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Пн" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Вт" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Ср" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Чт" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Пт" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Сб" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "В" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "В" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" - -msgid "Show" -msgstr "Показать" - -msgid "Hide" -msgstr "Скрыть" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index dc548e5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index 7e18ff8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,802 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Zahradník, 2023-2024 -# Jannis Leidel , 2011 -# 18f25ad6fa9930fc67cb11aca9d16a27, 2012-2013 -# Marian Andre , 2013-2015,2017 -# 29cf7e517570e1bc05a1509565db92ae_2a01508, 2011 -# Martin Tóth , 2017,2023 -# Miroslav Bendik , 2023 -# Peter Kuma, 2021 -# Peter Stríž , 2020 -# Zbynek Drlik , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:05+0000\n" -"Last-Translator: Adam Zahradník, 2023-2024\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Odstrániť označené %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Úspešne odstránených %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nedá sa odstrániť %(name)s" - -msgid "Are you sure?" -msgstr "Ste si istý?" - -msgid "Administration" -msgstr "Správa" - -msgid "All" -msgstr "Všetko" - -msgid "Yes" -msgstr "Áno" - -msgid "No" -msgstr "Nie" - -msgid "Unknown" -msgstr "Neznámy" - -msgid "Any date" -msgstr "Ľubovoľný dátum" - -msgid "Today" -msgstr "Dnes" - -msgid "Past 7 days" -msgstr "Posledných 7 dní" - -msgid "This month" -msgstr "Tento mesiac" - -msgid "This year" -msgstr "Tento rok" - -msgid "No date" -msgstr "Bez dátumu" - -msgid "Has date" -msgstr "S dátumom" - -msgid "Empty" -msgstr "Prázdna hodnota" - -msgid "Not empty" -msgstr "Neprázdna hodnota" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Zadajte prosím správne %(username)s a heslo pre účet personálu - „staff " -"account“. Obe polia môžu obsahovať veľké a malé písmená." - -msgid "Action:" -msgstr "Akcia:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Pridať ďalší %(verbose_name)s" - -msgid "Remove" -msgstr "Odstrániť" - -msgid "Addition" -msgstr "Pridávanie" - -msgid "Change" -msgstr "Zmeniť" - -msgid "Deletion" -msgstr "Odstránenie" - -msgid "action time" -msgstr "čas akcie" - -msgid "user" -msgstr "používateľ" - -msgid "content type" -msgstr "typ obsahu" - -msgid "object id" -msgstr "identifikátor objektu" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "reprezentácia objektu" - -msgid "action flag" -msgstr "príznak akcie" - -msgid "change message" -msgstr "zmeniť správu" - -msgid "log entry" -msgstr "položka záznamu" - -msgid "log entries" -msgstr "položky záznamu" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Pridané „%(object)s“." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Zmenené „%(object)s“ — %(changes)s " - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Odstránené „%(object)s“." - -msgid "LogEntry Object" -msgstr "Objekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Pridaný {name} „{object}“." - -msgid "Added." -msgstr "Pridaný." - -msgid "and" -msgstr "a" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Zmenené {fields} pre {name} „{object}“." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Zmenené {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Odstránený {name} „{object}“." - -msgid "No fields changed." -msgstr "Polia nezmenené." - -msgid "None" -msgstr "Žiadne" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Ak chcete vybrať viac ako jednu položku na Mac, podržte „Control“, alebo " -"„Command“" - -msgid "Select this object for an action - {}" -msgstr "Vybrať tento objekt pre akciu - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Objekt {name} „{obj}“ bol úspešne pridaný." - -msgid "You may edit it again below." -msgstr "Ďalšie zmeny môžete urobiť nižšie." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Objekt {name} „{obj}“ bol úspešne pridaný. Môžete pridať ďaľší {name} nižšie." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Objekt {name} „{obj}“ bol úspešne zmenený. Ďalšie zmeny môžete urobiť nižšie." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Objekt {name} „{obj}“ bol úspešne zmenený. Môžete pridať ďaľší {name} nižšie." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Objekt {name} „{obj}“ bol úspešne zmenený." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Položky musia byť vybrané, ak chcete na nich vykonať akcie. Neboli vybrané " -"žiadne položky." - -msgid "No action selected." -msgstr "Nebola vybraná žiadna akcia." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Objekt %(name)s „%(obj)s“ bol úspešne odstránený." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "Objekt %(name)s s ID „%(key)s“ neexistuje. Možno bol odstránený?" - -#, python-format -msgid "Add %s" -msgstr "Pridať %s" - -#, python-format -msgid "Change %s" -msgstr "Zmeniť %s" - -#, python-format -msgid "View %s" -msgstr "Zobraziť%s" - -msgid "Database error" -msgstr "Chyba databázy" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s bola úspešne zmenená." -msgstr[1] "%(count)s %(name)s boli úspešne zmenené." -msgstr[2] "%(count)s %(name)s bolo úspešne zmenených." -msgstr[3] "%(count)s %(name)s bolo úspešne zmenených." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s vybraná" -msgstr[1] "Všetky %(total_count)s vybrané" -msgstr[2] "Všetkých %(total_count)s vybraných" -msgstr[3] "Všetkých %(total_count)s vybraných" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 z %(cnt)s vybraných" - -#, python-format -msgid "Change history: %s" -msgstr "Zoznam zmien: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Vymazanie %(class_name)s %(instance)s vyžaduje vymazanie nasledovných " -"súvisiacich chránených objektov: %(related_objects)s" - -msgid "Django site admin" -msgstr "Správa Django stránky" - -msgid "Django administration" -msgstr "Správa Django" - -msgid "Site administration" -msgstr "Správa stránky" - -msgid "Log in" -msgstr "Prihlásenie" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s správa" - -msgid "Page not found" -msgstr "Stránka nenájdená" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Ľutujeme, ale požadovaná stránka nebola nájdená." - -msgid "Home" -msgstr "Domov" - -msgid "Server error" -msgstr "Chyba servera" - -msgid "Server error (500)" -msgstr "Chyba servera (500)" - -msgid "Server Error (500)" -msgstr "Chyba servera (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Došlo k chybe. Chyba bola nahlásená správcovi webu prostredníctvom e-mailu a " -"zanedlho by mala byť odstránená. Ďakujeme za vašu trpezlivosť." - -msgid "Run the selected action" -msgstr "Vykonať vybranú akciu" - -msgid "Go" -msgstr "Vykonať" - -msgid "Click here to select the objects across all pages" -msgstr "Kliknite sem pre výber objektov na všetkých stránkach" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Vybrať všetkých %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Zrušiť výber" - -msgid "Breadcrumbs" -msgstr "Mininavigácia" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modely v %(name)s aplikácii" - -msgid "Add" -msgstr "Pridať" - -msgid "View" -msgstr "Zobraziť" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nemáte právo na zobrazenie alebo vykonávanie zmien." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Najskôr zadajte používateľské meno a heslo. Potom budete môcť upraviť viac " -"používateľských nastavení." - -msgid "Enter a username and password." -msgstr "Zadajte používateľské meno a heslo." - -msgid "Change password" -msgstr "Zmeniť heslo" - -msgid "Set password" -msgstr "Nastaviť heslo" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Prosím, opravte chybu uvedenú nižšie." -msgstr[1] "Prosím, opravte chyby uvedené nižšie." -msgstr[2] "Prosím, opravte chyby uvedené nižšie." -msgstr[3] "Prosím, opravte chyby uvedené nižšie." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Zadajte nové heslo pre používateľa %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Týmto povolíte tomuto používateľovi prihlasovanie pomocou " -"hesla." - -msgid "Disable password-based authentication" -msgstr "Vypnúť prihlasovanie pomocou hesla" - -msgid "Enable password-based authentication" -msgstr "Povoliť prihlasovanie pomocou hesla" - -msgid "Skip to main content" -msgstr "Preskočiť na hlavný obsah" - -msgid "Welcome," -msgstr "Vitajte," - -msgid "View site" -msgstr "Pozrieť stránku" - -msgid "Documentation" -msgstr "Dokumentácia" - -msgid "Log out" -msgstr "Odhlásiť" - -#, python-format -msgid "Add %(name)s" -msgstr "Pridať %(name)s" - -msgid "History" -msgstr "Zmeny" - -msgid "View on site" -msgstr "Pozrieť na stránke" - -msgid "Filter" -msgstr "Filtrovať" - -msgid "Hide counts" -msgstr "Skryť počet" - -msgid "Show counts" -msgstr "Zobraziť počet" - -msgid "Clear all filters" -msgstr "Zrušiť všetky filtre" - -msgid "Remove from sorting" -msgstr "Odstrániť z triedenia" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Triedenie priority: %(priority_number)s " - -msgid "Toggle sorting" -msgstr "Prepnúť triedenie" - -msgid "Toggle theme (current theme: auto)" -msgstr "Prepnúť vzhľad (aktuálne: automatický)" - -msgid "Toggle theme (current theme: light)" -msgstr "Prepnúť vzhľad (aktuálne: svetlý)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Prepnúť vzhľad (aktuálne: tmavý)" - -msgid "Delete" -msgstr "Odstrániť" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Odstránenie objektu %(object_name)s „%(escaped_object)s“ by malo za následok " -"aj odstránenie súvisiacich objektov. Váš účet však nemá oprávnenie na " -"odstránenie nasledujúcich typov objektov:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Vymazanie %(object_name)s „%(escaped_object)s“ vyžaduje vymazanie " -"nasledovných súvisiacich chránených objektov:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ste si istý, že chcete odstrániť objekt %(object_name)s " -"„%(escaped_object)s“? Všetky nasledujúce súvisiace objekty budú odstránené:" - -msgid "Objects" -msgstr "Objekty" - -msgid "Yes, I’m sure" -msgstr "Áno, som si istý" - -msgid "No, take me back" -msgstr "Nie, chcem sa vrátiť" - -msgid "Delete multiple objects" -msgstr "Odstrániť viacero objektov" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Odstránenie označených %(objects_name)s by spôsobilo odstránenie súvisiacich " -"objektov, ale váš účet nemá oprávnenie na odstránenie nasledujúcich typov " -"objektov:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Vymazanie označených %(objects_name)s vyžaduje vymazanie nasledujúcich " -"chránených súvisiacich objektov:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ste si istý, že chcete odstrániť označené %(objects_name)s? Odstránia sa " -"všetky nasledujúce objekty a ich súvisiace položky:" - -msgid "Delete?" -msgstr "Odstrániť?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Podľa %(filter_title)s " - -msgid "Summary" -msgstr "Súhrn" - -msgid "Recent actions" -msgstr "Posledné akcie" - -msgid "My actions" -msgstr "Moje akcie" - -msgid "None available" -msgstr "Nedostupné" - -msgid "Added:" -msgstr "Pridaný:" - -msgid "Changed:" -msgstr "Zmenený:" - -msgid "Deleted:" -msgstr "Odstránený:" - -msgid "Unknown content" -msgstr "Neznámy obsah" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Niečo nie je v poriadku s vašou inštaláciou databázy. Zabezpečte, aby boli " -"vytvorené potrebné databázové tabuľky a taktiež zabezpečte, aby príslušný " -"používateľ mohol čítať databázu." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Ste prihlásený ako %(username)s, ale nemáte práva k tejto stránke. Chcete sa " -"prihlásiť do iného účtu?" - -msgid "Forgotten your password or username?" -msgstr "Zabudli ste heslo alebo používateľské meno?" - -msgid "Toggle navigation" -msgstr "Prepnúť navigáciu" - -msgid "Sidebar" -msgstr "Bočný panel" - -msgid "Start typing to filter…" -msgstr "Filtrovať začnete písaním textu…" - -msgid "Filter navigation items" -msgstr "Filtrovať položky navigácie" - -msgid "Date/time" -msgstr "Dátum a čas" - -msgid "User" -msgstr "Používateľ" - -msgid "Action" -msgstr "Akcia" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "záznam" -msgstr[1] "záznamy" -msgstr[2] "záznamov" -msgstr[3] "záznamov" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Tento objekt nemá zoznam zmien. Pravdepodobne nebol pridaný prostredníctvom " -"tejto správcovskej stránky." - -msgid "Show all" -msgstr "Zobraziť všetky" - -msgid "Save" -msgstr "Uložiť" - -msgid "Popup closing…" -msgstr "Vyskakovacie okno sa zatvára…" - -msgid "Search" -msgstr "Vyhľadávanie" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s výsledok" -msgstr[1] "%(counter)s výsledky" -msgstr[2] "%(counter)s výsledkov" -msgstr[3] "%(counter)s výsledkov" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s spolu" - -msgid "Save as new" -msgstr "Uložiť ako nový" - -msgid "Save and add another" -msgstr "Uložiť a pridať ďalší" - -msgid "Save and continue editing" -msgstr "Uložiť a pokračovať v úpravách" - -msgid "Save and view" -msgstr "Uložiť a zobraziť" - -msgid "Close" -msgstr "Zatvoriť" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Zmeniť vybrané %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Pridať ďalší %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Odstrániť vybrané %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Zobraziť vybrané %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Ďakujeme, že ste dnes strávili pár pekných okamihov na tejto webovej stránke." - -msgid "Log in again" -msgstr "Znova sa prihlásiť" - -msgid "Password change" -msgstr "Zmena hesla" - -msgid "Your password was changed." -msgstr "Vaše heslo bolo zmenené." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Z bezpečnostných dôvodov zadajte staré heslo a potom nové heslo dvakrát, aby " -"sme mohli overiť, že ste ho zadali správne." - -msgid "Change my password" -msgstr "Zmeniť moje heslo" - -msgid "Password reset" -msgstr "Obnovenie hesla" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaše heslo bolo nastavené. Môžete pokračovať a prihlásiť sa." - -msgid "Password reset confirmation" -msgstr "Potvrdenie obnovenia hesla" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Zadajte nové heslo dvakrát, aby sme mohli overiť, že ste ho zadali správne." - -msgid "New password:" -msgstr "Nové heslo:" - -msgid "Confirm password:" -msgstr "Potvrdenie hesla:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Odkaz na obnovenie hesla je neplatný, pretože už bol pravdepodobne raz " -"použitý. Prosím, požiadajte znovu o obnovu hesla." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Poslali sme vám e-mailom inštrukcie pre nastavenie hesla, ak existuje konto " -"so zadanou emailovou adresou. Čoskoro by ste ich mali dostať." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ak vám nepríde e-mail, uistite sa, že ste zadali adresu, s ktorou ste sa " -"registrovali a skontrolujte svoj spamový priečinok." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Tento e-mail ste dostali preto, lebo ste požiadali o obnovenie hesla pre " -"užívateľský účet na %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Prosím, choďte na túto stránku a zvoľte si nové heslo:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Ak ste náhodou zabudli, vaše používateľské meno je:" - -msgid "Thanks for using our site!" -msgstr "Ďakujeme, že používate našu stránku!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Tím %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Zabudli ste heslo? Zadajte vašu e-mailovú adresu nižšie a my vám pošleme " -"inštrukcie pre nastavenie nového hesla." - -msgid "Email address:" -msgstr "E-mailová adresa:" - -msgid "Reset my password" -msgstr "Obnova môjho hesla" - -msgid "Select all objects on this page for an action" -msgstr "Vybrať všetky objekty na tejto strane pre akciu" - -msgid "All dates" -msgstr "Všetky dátumy" - -#, python-format -msgid "Select %s" -msgstr "Vybrať %s" - -#, python-format -msgid "Select %s to change" -msgstr "Vybrať %s na úpravu" - -#, python-format -msgid "Select %s to view" -msgstr "Pre zobrazenie %s zvolte" - -msgid "Date:" -msgstr "Dátum:" - -msgid "Time:" -msgstr "Čas:" - -msgid "Lookup" -msgstr "Vyhľadanie" - -msgid "Currently:" -msgstr "Aktuálne:" - -msgid "Change:" -msgstr "Zmeniť:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7e95301..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po deleted file mode 100644 index e4b2fd4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,337 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Zahradník, 2023 -# Dimitris Glezos , 2012 -# Jannis Leidel , 2011 -# 18f25ad6fa9930fc67cb11aca9d16a27, 2012 -# Marian Andre , 2012,2015 -# 29cf7e517570e1bc05a1509565db92ae_2a01508, 2011 -# Martin Tóth , 2017,2023 -# Peter Kuma, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Martin Tóth , 2017,2023\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostupné %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Toto je zoznam dostupných %s. Pre výber je potrebné označiť ich v poli a " -"následne kliknutím na šípku „Vybrať“ presunúť." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Píšte do tohto poľa pre vyfiltrovanie dostupných %s." - -msgid "Filter" -msgstr "Filtrovať" - -msgid "Choose all" -msgstr "Vybrať všetko" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Kliknite sem pre vybratie všetkých %s naraz." - -msgid "Choose" -msgstr "Vybrať" - -msgid "Remove" -msgstr "Odstrániť" - -#, javascript-format -msgid "Chosen %s" -msgstr "Vybrané %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Toto je zoznam dostupných %s. Pre vymazanie je potrebné označiť ich v poli a " -"následne kliknutím na šípku „Vymazať“ vymazať." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Píšte do tohto poľa pre vyfiltrovanie označených %s." - -msgid "Remove all" -msgstr "Odstrániť všetky" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Kliknite sem pre vymazanie vybratých %s naraz." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s označená možnosť sa nezobrazuje" -msgstr[1] "%s označené možnosti sa nezobrazujú" -msgstr[2] "%s označených možností sa nezobrazuje" -msgstr[3] "%s označených možností sa nezobrazuje" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s z %(cnt)s vybrané" -msgstr[1] "%(sel)s z %(cnt)s vybrané" -msgstr[2] "%(sel)s z %(cnt)s vybraných" -msgstr[3] "%(sel)s z %(cnt)s vybraných" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Vrámci jednotlivých editovateľných polí máte neuložené zmeny. Ak vykonáte " -"akciu, vaše zmeny budú stratené." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Vybrali ste akciu, ale neuložili ste jednotlivé polia. Prosím, uložte zmeny " -"kliknutím na OK. Akciu budete musieť vykonať znova." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Vybrali ste akciu, ale neurobili ste žiadne zmeny v jednotlivých poliach. " -"Pravdepodobne ste chceli použiť tlačidlo Vykonať namiesto Uložiť." - -msgid "Now" -msgstr "Teraz" - -msgid "Midnight" -msgstr "Polnoc" - -msgid "6 a.m." -msgstr "6:00" - -msgid "Noon" -msgstr "Poludnie" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Poznámka: Ste %s hodinu pred časom servera." -msgstr[1] "Poznámka: Ste %s hodiny pred časom servera." -msgstr[2] "Poznámka: Ste %s hodín pred časom servera." -msgstr[3] "Poznámka: Ste %s hodín pred časom servera." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Poznámka: Ste %s hodinu za časom servera." -msgstr[1] "Poznámka: Ste %s hodiny za časom servera." -msgstr[2] "Poznámka: Ste %s hodín za časom servera." -msgstr[3] "Poznámka: Ste %s hodín za časom servera." - -msgid "Choose a Time" -msgstr "Vybrať Čas" - -msgid "Choose a time" -msgstr "Vybrať čas" - -msgid "Cancel" -msgstr "Zrušiť" - -msgid "Today" -msgstr "Dnes" - -msgid "Choose a Date" -msgstr "Vybrať Dátum" - -msgid "Yesterday" -msgstr "Včera" - -msgid "Tomorrow" -msgstr "Zajtra" - -msgid "January" -msgstr "január" - -msgid "February" -msgstr "február" - -msgid "March" -msgstr "marec" - -msgid "April" -msgstr "apríl" - -msgid "May" -msgstr "máj" - -msgid "June" -msgstr "jún" - -msgid "July" -msgstr "júl" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "máj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jún" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "júl" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec." - -msgid "Sunday" -msgstr "nedeľa" - -msgid "Monday" -msgstr "pondelok" - -msgid "Tuesday" -msgstr "utorok" - -msgid "Wednesday" -msgstr "streda" - -msgid "Thursday" -msgstr "štvrtok" - -msgid "Friday" -msgstr "piatok" - -msgid "Saturday" -msgstr "sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "ne" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "po" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "ut" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "st" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "št" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "pi" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "so" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "N" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "U" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "S" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Š" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Zobraziť" - -msgid "Hide" -msgstr "Skryť" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index 0c262d2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index 3993498..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,774 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrej Marsetič, 2022-2023 -# Jannis Leidel , 2011 -# Primoz Verdnik , 2017 -# zejn , 2013,2016 -# zejn , 2011-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: Andrej Marsetič, 2022-2023\n" -"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Izbriši izbrano: %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Uspešno izbrisano %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ni mogoče izbrisati %(name)s" - -msgid "Are you sure?" -msgstr "Ste prepričani?" - -msgid "Administration" -msgstr "Administracija" - -msgid "All" -msgstr "Vse" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Neznano" - -msgid "Any date" -msgstr "Kadarkoli" - -msgid "Today" -msgstr "Danes" - -msgid "Past 7 days" -msgstr "Zadnjih 7 dni" - -msgid "This month" -msgstr "Ta mesec" - -msgid "This year" -msgstr "Letos" - -msgid "No date" -msgstr "Brez datuma" - -msgid "Has date" -msgstr "Z datumom" - -msgid "Empty" -msgstr "Prazno" - -msgid "Not empty" -msgstr "Ni prazno" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Vnesite veljavno %(username)s in geslo za račun osebja. Opomba: obe polji " -"upoštevata velikost črk." - -msgid "Action:" -msgstr "Dejanje:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dodaj še en %(verbose_name)s" - -msgid "Remove" -msgstr "Odstrani" - -msgid "Addition" -msgstr "Dodatek" - -msgid "Change" -msgstr "Spremeni" - -msgid "Deletion" -msgstr "Izbris" - -msgid "action time" -msgstr "čas dejanja" - -msgid "user" -msgstr "uporabnik" - -msgid "content type" -msgstr "vrsta vsebine" - -msgid "object id" -msgstr "id objekta" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "predstavitev objekta" - -msgid "action flag" -msgstr "zastavica dejanja" - -msgid "change message" -msgstr "spremeni sporočilo" - -msgid "log entry" -msgstr "dnevniški vnos" - -msgid "log entries" -msgstr "dnevniški vnosi" - -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Izbrisan “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Dnevniški vnos" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Dodan {name} “{object}”." - -msgid "Added." -msgstr "Dodano." - -msgid "and" -msgstr "in" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Spremenjena polja {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Izbrisan {name} “{object}”." - -msgid "No fields changed." -msgstr "Nobeno polje ni bilo spremenjeno." - -msgid "None" -msgstr "Brez vrednosti" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Izbrati morate vnose, nad katerimi želite izvesti operacijo. Noben vnos ni " -"bil spremenjen." - -msgid "No action selected." -msgstr "Brez dejanja." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Dodaj %s" - -#, python-format -msgid "Change %s" -msgstr "Spremeni %s" - -#, python-format -msgid "View %s" -msgstr "Pogled %s" - -msgid "Database error" -msgstr "Napaka v podatkovni bazi" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s je bil uspešno spremenjen." -msgstr[1] "%(count)s %(name)s sta bila uspešno spremenjena." -msgstr[2] "%(count)s %(name)s so bili uspešno spremenjeni." -msgstr[3] "%(count)s %(name)s je bilo uspešno spremenjenih." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s izbran" -msgstr[1] "%(total_count)s izbrana" -msgstr[2] "Vsi %(total_count)s izbrani" -msgstr[3] "Vseh %(total_count)s izbranih" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 od %(cnt)s izbranih" - -#, python-format -msgid "Change history: %s" -msgstr "Zgodovina sprememb: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Brisanje %(class_name)s %(instance)s bi zahtevalo brisanje naslednjih " -"zaščitenih povezanih objektov: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administrativni vmesnik" - -msgid "Django administration" -msgstr "Django administracija" - -msgid "Site administration" -msgstr "Administracija strani" - -msgid "Log in" -msgstr "Prijavite se" - -#, python-format -msgid "%(app)s administration" -msgstr "Administracija %(app)s" - -msgid "Page not found" -msgstr "Strani ni mogoče najti" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Opravičujemo se, a zahtevane strani ni mogoče najti." - -msgid "Home" -msgstr "Domov" - -msgid "Server error" -msgstr "Napaka na strežniku" - -msgid "Server error (500)" -msgstr "Napaka na strežniku (500)" - -msgid "Server Error (500)" -msgstr "Napaka na strežniku (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Prišlo je do nepričakovane napake. Napaka je bila preko e-pošte javljena " -"administratorjem spletne strani in naj bo bila v kratkem odpravljena. Hvala " -"za potrpljenje." - -msgid "Run the selected action" -msgstr "Izvedi izbrano dejanje" - -msgid "Go" -msgstr "Pojdi" - -msgid "Click here to select the objects across all pages" -msgstr "Kliknite tu za izbiro vseh vnosov na vseh straneh" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Izberi vse %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Počisti izbiro" - -msgid "Breadcrumbs" -msgstr "Navigacijska sled" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Model v %(name)s aplikaciji" - -msgid "Add" -msgstr "Dodaj" - -msgid "View" -msgstr "Pogled" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nimate dovoljenja za ogled ali urejanje česarkoli." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Najprej vnesite uporabniško ime in geslo. Nato boste lahko urejali več " -"uporabniških možnosti." - -msgid "Enter a username and password." -msgstr "Vnesite uporabniško ime in geslo." - -msgid "Change password" -msgstr "Spremeni geslo" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Popravite spodnjo napako." -msgstr[1] "Prosim popravite spodnji napaki." -msgstr[2] "Prosim popravite spodnje napake." -msgstr[3] "Prosim popravite spodnje napake." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Vpišite novo geslo za uporabnika %(username)s." - -msgid "Skip to main content" -msgstr "Preskoči na glavno vsebino" - -msgid "Welcome," -msgstr "Dobrodošli," - -msgid "View site" -msgstr "Poglej stran" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Odjava" - -#, python-format -msgid "Add %(name)s" -msgstr "Dodaj %(name)s" - -msgid "History" -msgstr "Zgodovina" - -msgid "View on site" -msgstr "Poglej na strani" - -msgid "Filter" -msgstr "Filter" - -msgid "Hide counts" -msgstr "" - -msgid "Show counts" -msgstr "" - -msgid "Clear all filters" -msgstr "Počisti vse filtre" - -msgid "Remove from sorting" -msgstr "Odstrani iz razvrščanja" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioriteta razvrščanja: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Preklopi razvrščanje" - -msgid "Toggle theme (current theme: auto)" -msgstr "Preklopi temo (trenutna tema: samodejno)" - -msgid "Toggle theme (current theme: light)" -msgstr "Preklopi temo (trenutna tema: svetla)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Preklop teme (trenutna tema: temna)" - -msgid "Delete" -msgstr "Izbriši" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Izbris %(object_name)s '%(escaped_object)s' bi pomenil izbris povezanih " -"objektov, vendar nimate dovoljenja za izbris naslednjih tipov objektov:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Brisanje %(object_name)s '%(escaped_object)s' bi zahtevalo brisanje " -"naslednjih zaščitenih povezanih objektov:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ste prepričani, da želite izbrisati %(object_name)s \"%(escaped_object)s\"? " -"Vsi naslednji povezani elementi bodo izbrisani:" - -msgid "Objects" -msgstr "Objekti" - -msgid "Yes, I’m sure" -msgstr "Da, prepričan sem" - -msgid "No, take me back" -msgstr "Ne, vrni me nazaj" - -msgid "Delete multiple objects" -msgstr "Izbriši več objektov" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Brisanje naslendjih %(objects_name)s bi imelo za posledico izbris naslednjih " -"povezanih objektov, vendar vaš račun nima pravic za izbris naslednjih tipov " -"objektov:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Brisanje izbranih %(objects_name)s zahteva brisanje naslednjih zaščitenih " -"povezanih objektov:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ali res želite izbrisati izbrane %(objects_name)s? Vsi naslednji objekti in " -"njihovi povezani vnosi bodo izbrisani:" - -msgid "Delete?" -msgstr "Izbrišem?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Po %(filter_title)s " - -msgid "Summary" -msgstr "Povzetek" - -msgid "Recent actions" -msgstr "Nedavna dejanja" - -msgid "My actions" -msgstr "Moja dejanja" - -msgid "None available" -msgstr "Ni na voljo" - -msgid "Added:" -msgstr "" - -msgid "Changed:" -msgstr "" - -msgid "Deleted:" -msgstr "" - -msgid "Unknown content" -msgstr "Neznana vsebina" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Prijavljeni ste kot %(username)s in nimate pravic za dostop do te strani. Bi " -"se želeli prijaviti z drugim računom?" - -msgid "Forgotten your password or username?" -msgstr "Ste pozabili geslo ali uporabniško ime?" - -msgid "Toggle navigation" -msgstr "Preklopi navigacijo" - -msgid "Sidebar" -msgstr "Stranska vrstica" - -msgid "Start typing to filter…" -msgstr "Za filtriranje začnite tipkati ..." - -msgid "Filter navigation items" -msgstr "Filtrirajte navigacijske elemente" - -msgid "Date/time" -msgstr "Datum/čas" - -msgid "User" -msgstr "Uporabnik" - -msgid "Action" -msgstr "Dejanje" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Prikaži vse" - -msgid "Save" -msgstr "Shrani" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Išči" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s zadetkov" -msgstr[1] "%(counter)s zadetek" -msgstr[2] "%(counter)s zadetka" -msgstr[3] "%(counter)s zadetki" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s skupno" - -msgid "Save as new" -msgstr "Shrani kot novo" - -msgid "Save and add another" -msgstr "Shrani in dodaj še eno" - -msgid "Save and continue editing" -msgstr "Shrani in nadaljuj z urejanjem" - -msgid "Save and view" -msgstr "Shrani in poglej" - -msgid "Close" -msgstr "Zapri" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Spremeni izbran %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Dodaj še en %(model)s " - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Izbriši izbran %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Poglej izbran %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Hvala, ker ste si danes vzeli nekaj časa za to spletno stran." - -msgid "Log in again" -msgstr "Ponovna prijava" - -msgid "Password change" -msgstr "Sprememba gesla" - -msgid "Your password was changed." -msgstr "Vaše geslo je bilo spremenjeno." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Zaradi varnosti vnesite svoje staro geslo in nato dvakrat vnesite novo " -"geslo, da bomo lahko preverili, ali ste ga pravilno vnesli." - -msgid "Change my password" -msgstr "Spremeni moje geslo" - -msgid "Password reset" -msgstr "Ponastavitev gesla" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaše geslo je bilo nastavljeno. Zdaj se lahko prijavite." - -msgid "Password reset confirmation" -msgstr "Potrdite ponastavitev gesla" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Vnesite vaše novo geslo dvakrat, da se izognete tipkarskim napakam." - -msgid "New password:" -msgstr "Novo geslo:" - -msgid "Confirm password:" -msgstr "Potrditev gesla:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Povezava za ponastavitev gesla ni bila veljavna, morda je bila že " -"uporabljena. Prosimo zahtevajte novo ponastavitev gesla." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Po e-pošti smo vam poslali navodila za nastavitev gesla, če obstaja račun z " -"e-pošto, ki ste jo vnesli. Prejeti bi jih morali kmalu." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Če ne prejmete e-poštnega sporočila, preverite, ali ste vnesli naslov, s " -"katerim ste se registrirali, in preverite mapo z vsiljeno pošto." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"To e-pošto ste prejeli, ker je ste zahtevali ponastavitev gesla za vaš " -"uporabniški račun na %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Prosimo pojdite na sledečo stran in izberite novo geslo:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Vaše uporabniško ime, če ste ga pozabili:" - -msgid "Thanks for using our site!" -msgstr "Hvala, ker uporabljate našo stran!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Ekipa strani %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Ste pozabili geslo? Spodaj vnesite svoj e-poštni naslov in poslali vam bomo " -"navodila za nastavitev novega." - -msgid "Email address:" -msgstr "E-poštni naslov:" - -msgid "Reset my password" -msgstr "Ponastavi moje geslo" - -msgid "Select all objects on this page for an action" -msgstr "" - -msgid "All dates" -msgstr "Vsi datumi" - -#, python-format -msgid "Select %s" -msgstr "Izberite %s" - -#, python-format -msgid "Select %s to change" -msgstr "Izberite %s, ki ga želite spremeniti" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Ura:" - -msgid "Lookup" -msgstr "Poizvedba" - -msgid "Currently:" -msgstr "Trenutno:" - -msgid "Change:" -msgstr "Spremembe:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo deleted file mode 100644 index f01b6b4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po deleted file mode 100644 index 08a77f6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,328 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrej Marsetič, 2022,2024 -# Jannis Leidel , 2011 -# zejn , 2016 -# zejn , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:59+0000\n" -"Last-Translator: Andrej Marsetič, 2022,2024\n" -"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Možne %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"To je seznam možnih %s. Izbrane lahko izberete z izbiro v spodnjem okvirju " -"in s klikom na puščico \"Izberi\" med okvirjema." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Z vpisom niza v to polje, zožite izbor %s." - -msgid "Filter" -msgstr "Filtriraj" - -msgid "Choose all" -msgstr "Izberi vse" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Kliknite za izbor vseh %s hkrati." - -msgid "Choose" -msgstr "Izberi" - -msgid "Remove" -msgstr "Odstrani" - -#, javascript-format -msgid "Chosen %s" -msgstr "Izbran %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"To je seznam možnih %s. Odvečne lahko odstranite z izbiro v okvirju in " -"klikom na puščico \"Odstrani\" med okvirjema." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Vnesite v to polje, da filtrirate seznam izbranih %s ." - -msgid "Remove all" -msgstr "Odstrani vse" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Kliknite za odstranitev vseh %s hkrati." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] " %s izbrana možnosti ni vidna" -msgstr[1] " %s izbrani možnosti nista vidni" -msgstr[2] " %s izbrane možnosti niso vidne" -msgstr[3] " %s izbrane možnosti niso vidne" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s od %(cnt)s izbranih" -msgstr[1] "%(sel)s od %(cnt)s izbran" -msgstr[2] "%(sel)s od %(cnt)s izbrana" -msgstr[3] "%(sel)s od %(cnt)s izbrani" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Na nekaterih poljih, kjer je omogočeno urejanje, so neshranjene spremembe. V " -"primeru nadaljevanja bodo neshranjene spremembe trajno izgubljene." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Izbrali ste dejanje, vendar še niste shranili sprememb posameznih polj. Za " -"shranjevanje kliknite V redu. Akcijo boste morali ponovno zagnati." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Izbrali ste dejanje in niste spremenili posameznih polj. Verjetno iščete " -"gumb Pojdi in ne gumb Shrani." - -msgid "Now" -msgstr "Takoj" - -msgid "Midnight" -msgstr "Polnoč" - -msgid "6 a.m." -msgstr "Ob 6h" - -msgid "Noon" -msgstr "Opoldne" - -msgid "6 p.m." -msgstr "Ob 18h" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Opomba: glede na čas na strežniku ste %s uro naprej." -msgstr[1] "Opomba: glede na čas na strežniku ste %s uri naprej." -msgstr[2] "Opomba: glede na čas na strežniku ste %s ure naprej." -msgstr[3] "Opomba: glede na čas na strežniku ste %s ur naprej." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Opomba: glede na čas na strežniku ste %s uro zadaj." -msgstr[1] "Opomba: glede na čas na strežniku ste %s uri zadaj." -msgstr[2] "Opomba: glede na čas na strežniku ste %s ure zadaj." -msgstr[3] "Opomba: glede na čas na strežniku ste %s ur zadaj." - -msgid "Choose a Time" -msgstr "Izberite čas" - -msgid "Choose a time" -msgstr "Izbor časa" - -msgid "Cancel" -msgstr "Prekliči" - -msgid "Today" -msgstr "Danes" - -msgid "Choose a Date" -msgstr "Izberite datum" - -msgid "Yesterday" -msgstr "Včeraj" - -msgid "Tomorrow" -msgstr "Jutri" - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "marec" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "junij" - -msgid "July" -msgstr "julij" - -msgid "August" -msgstr "avgust" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec" - -msgid "Sunday" -msgstr "Nedelja" - -msgid "Monday" -msgstr "Ponedeljek" - -msgid "Tuesday" -msgstr "Torek" - -msgid "Wednesday" -msgstr "Sreda" - -msgid "Thursday" -msgstr "Četrtek" - -msgid "Friday" -msgstr "Petek" - -msgid "Saturday" -msgstr "Sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Ned" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pon" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Tor" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Sre" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Čet" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pet" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sob" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "N" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "S" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Č" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index 63dadc2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index e52e9e7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,792 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2011,2015 -# Besnik Bleta , 2020,2022-2025 -# Besnik Bleta , 2015,2018-2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2020,2022-2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Fshiji %(verbose_name_plural)s e përzgjedhur" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "U fshinë me sukses %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "S’mund të fshijë %(name)s" - -msgid "Delete multiple objects" -msgstr "Fshini disa objekte njëherësh" - -msgid "Administration" -msgstr "Administrim" - -msgid "All" -msgstr "Krejt" - -msgid "Yes" -msgstr "Po" - -msgid "No" -msgstr "Jo" - -msgid "Unknown" -msgstr "E panjohur" - -msgid "Any date" -msgstr "Çfarëdo date" - -msgid "Today" -msgstr "Sot" - -msgid "Past 7 days" -msgstr "7 ditët e shkuara" - -msgid "This month" -msgstr "Këtë muaj" - -msgid "This year" -msgstr "Këtë vit" - -msgid "No date" -msgstr "Pa datë" - -msgid "Has date" -msgstr "Ka datë" - -msgid "Empty" -msgstr "E zbrazët" - -msgid "Not empty" -msgstr "Jo e zbrazët" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Ju lutemi, jepni %(username)s dhe fjalëkalimin e saktë për një llogari " -"ekipi. Kini parasysh se që të dy fushat mund të jenë të ndjeshme ndaj " -"shkrimit me shkronja të mëdha ose të vogla." - -msgid "Action:" -msgstr "Veprim:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Shtoni një tjetër %(verbose_name)s" - -msgid "Remove" -msgstr "Hiqe" - -msgid "Addition" -msgstr "Shtim" - -msgid "Change" -msgstr "Ndryshoje" - -msgid "Deletion" -msgstr "Fshirje" - -msgid "action time" -msgstr "kohë veprimi" - -msgid "user" -msgstr "përdorues" - -msgid "content type" -msgstr "lloj lënde" - -msgid "object id" -msgstr "id objekti" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "paraqitje objekti" - -msgid "action flag" -msgstr "shenjë veprimi" - -msgid "change message" -msgstr "mesazh ndryshimi" - -msgid "log entry" -msgstr "zë regjistri" - -msgid "log entries" -msgstr "zëra regjistri" - -#, python-format -msgid "Added “%(object)s”." -msgstr "U shtua “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "U ndryshua “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "U fshi “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Objekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "U shtua {name} “{object}”." - -msgid "Added." -msgstr "U shtua." - -msgid "and" -msgstr "dhe " - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "U ndryshuan {fields} për {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "U ndryshuan {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "U fshi {name} “{object}”." - -msgid "No fields changed." -msgstr "S’u ndryshua ndonjë fushë." - -msgid "None" -msgstr "Asnjë" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Që të përzgjidhni më shumë se një, mbani të shtypur “Control”, ose “Command” " -"në një Mac." - -msgid "Select this object for an action - {}" -msgstr "Përzgjidheni këtë objekt për një veprim - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” u shtua me sukses." - -msgid "You may edit it again below." -msgstr "Mund ta ripërpunoni më poshtë." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” u shtua me sukses. Mund të shtoni {name} tjetër më poshtë." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” u ndryshua me sukses. Mund ta përpunoni sërish më poshtë." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” u ndryshua me sukses. Mund të shtoni {name} tjetër më poshtë." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” u ndryshua me sukses." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Duhen përzgjedhur objekte që të kryhen veprime mbi ta. S’u ndryshua ndonjë " -"objekt." - -msgid "No action selected." -msgstr "S’u përzgjodh ndonjë veprim." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” u fshi me sukses." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s me “%(key)s” ID s’ekziston. Mos qe fshirë vallë?" - -#, python-format -msgid "Add %s" -msgstr "Shtoni %s" - -#, python-format -msgid "Change %s" -msgstr "Ndrysho %s" - -#, python-format -msgid "View %s" -msgstr "Shiheni %s" - -msgid "Database error" -msgstr "Gabim baze të dhënash" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s u ndryshua me sukses." -msgstr[1] "%(count)s %(name)s u ndryshuan me sukses." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s i përzgjedhur" -msgstr[1] "Krejt %(total_count)s të përzgjedhurat" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 nga %(cnt)s të përzgjedhur" - -msgid "Delete" -msgstr "Fshije" - -#, python-format -msgid "Change history: %s" -msgstr "Ndryshoni historikun: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Fshirja e %(class_name)s %(instance)s do të lypte fshirjen e objekteve " -"vijuese të mbrojtura që kanë lidhje me ta: %(related_objects)s" - -msgid "Django site admin" -msgstr "Përgjegjës sajti Django" - -msgid "Django administration" -msgstr "Administrim i Django-s" - -msgid "Site administration" -msgstr "Administrim sajti" - -msgid "Log in" -msgstr "Hyni" - -#, python-format -msgid "%(app)s administration" -msgstr "Administrim %(app)s" - -msgid "Page not found" -msgstr "S’u gjet faqe" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Na ndjeni, por faqja e kërkuar s’u gjet dot." - -msgid "Home" -msgstr "Hyrje" - -msgid "Server error" -msgstr "Gabim shërbyesi" - -msgid "Server error (500)" -msgstr "Gabim shërbyesi (500)" - -msgid "Server Error (500)" -msgstr "Gabim Shërbyesi (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Pati një gabim. U është njoftuar përgjegjësve të sajtit përmes email-i dhe " -"do të duhej ndrequr pa humbur kohë. Faleminderit për durimin." - -msgid "Run the selected action" -msgstr "Kryej veprimin e përzgjedhur" - -msgid "Go" -msgstr "Shko tek" - -msgid "Click here to select the objects across all pages" -msgstr "Klikoni këtu që të përzgjidhni objektet nëpër krejt faqet" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Përzgjidhni krejt %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Spastroje përzgjedhjen" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele te aplikacioni %(name)s" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Shtoni" - -msgid "View" -msgstr "Shiheni" - -msgid "You don’t have permission to view or edit anything." -msgstr "S’keni leje të shihni apo të përpunoni gjë." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Ndryshoni fjalëkalimin" - -msgid "Set password" -msgstr "Caktoni fjalëkalim" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Ju lutemi, ndreqni gabimin më poshtë." -msgstr[1] "Ju lutemi, ndreqni gabimet më poshtë." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Jepni një fjalëkalim të ri për përdoruesin %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Ky veprim do të aktivizojë për këtë përdorues mirëfilltësim " -"me bazë fjalëkalimin." - -msgid "Disable password-based authentication" -msgstr "Çaktivizo mirëfilltësim me bazë fjalëkalimin" - -msgid "Enable password-based authentication" -msgstr "Aktivizo mirëfilltësim me bazë fjalëkalimin" - -msgid "Skip to main content" -msgstr "Kalo te lënda bazë" - -msgid "Welcome," -msgstr "Mirë se vini," - -msgid "View site" -msgstr "Shihni sajtin" - -msgid "Documentation" -msgstr "Dokumentim" - -msgid "Log out" -msgstr "Dilni" - -#, python-format -msgid "Add %(name)s" -msgstr "Shto %(name)s" - -msgid "History" -msgstr "Historik" - -msgid "View on site" -msgstr "Shiheni në sajt" - -msgid "Filter" -msgstr "Filtër" - -msgid "Hide counts" -msgstr "Fshihi numrat" - -msgid "Show counts" -msgstr "Shfaqi numrat" - -msgid "Clear all filters" -msgstr "Spastroji krejt filtrat" - -msgid "Remove from sorting" -msgstr "Hiqe prej renditjeje" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Përparësi renditjesh: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Shfaq/fshih renditjen" - -msgid "Toggle theme (current theme: auto)" -msgstr "Ndërroni temën (temë e tanishme: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Ndërroni temën (temë e tanishme: e çelët)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Ndërroni temën (temë e tanishme: e errët)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Fshirja e %(object_name)s '%(escaped_object)s' do të shpinte në fshirjen e " -"objekteve të lidhur me të, por llogaria juaj s’ka leje për fshirje të " -"objekteve të llojeve të mëposhtëm:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Fshirja e %(object_name)s '%(escaped_object)s' do të kërkonte fshirjen e " -"objekteve të mbrojtur vijues, të lidhur me të:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Jeni i sigurt se doni të fshihet %(object_name)s “%(escaped_object)s”? Krejt " -"objektet vijues të lidhur me të do të fshihen:" - -msgid "Objects" -msgstr "Objekte" - -msgid "Yes, I’m sure" -msgstr "Po, jam i sigurt" - -msgid "No, take me back" -msgstr "Jo, kthemëni mbrapsht" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Fshirja e %(objects_name)s të përzgjedhur do të shpjerë në fshirjen e " -"objekteve të lidhur me të, por llogaria juaj s’ka leje të fshijë llojet " -"vijuese të objekteve:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Fshirja e %(objects_name)s të përzgjedhur do të kërkonte fshirjen e " -"objekteve të mbrojtur vijues, të lidhur me të:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Jeni i sigurt se doni të fshihen %(objects_name)s e përzgjedhur? Krejt " -"objektet vijues dhe gjëra të lidhura me ta do të fshihen:" - -msgid "Delete?" -msgstr "Të fshihet?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Nga %(filter_title)s " - -msgid "Summary" -msgstr "Përmbledhje" - -msgid "Recent actions" -msgstr "Veprime së fundi" - -msgid "My actions" -msgstr "Veprimet e mia" - -msgid "None available" -msgstr "Asnjë i passhëm" - -msgid "Added:" -msgstr "U shtua më:" - -msgid "Changed:" -msgstr "U ndryshua më:" - -msgid "Deleted:" -msgstr "U fshi më:" - -msgid "Unknown content" -msgstr "Lëndë e panjohur" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Diç është gabim me instalimin tuaj të bazës së të dhënave. Sigurohuni që " -"janë krijuar tabelat e duhura të bazës së të dhënave dhe sigurohuni që baza " -"e të dhënave është e lexueshme nga përdoruesi i duhur." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Keni bërë mirëfilltësimin si %(username)s, por s’jeni i autorizuar të hyni " -"në këtë faqe. Do të donit të hyni në një llogari tjetër?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Shfaqni/fshihni lëvizjen" - -msgid "Sidebar" -msgstr "Anështyllë" - -msgid "Start typing to filter…" -msgstr "Që të bëhet filtrim, filloni të shtypni…" - -msgid "Filter navigation items" -msgstr "Filtroni elementë lëvizjeje" - -msgid "Date/time" -msgstr "Datë/kohë" - -msgid "User" -msgstr "Përdorues" - -msgid "Action" -msgstr "Veprim" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "zë" -msgstr[1] "zëra" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Ky objekt s’ka historik ndryshimesh. Gjasat janë të mos ketë qenë shtuar " -"përmes këtij sajti admin." - -msgid "Show all" -msgstr "Shfaqi krejt" - -msgid "Save" -msgstr "Ruaje" - -msgid "Popup closing…" -msgstr "Mbyllje flluske…" - -msgid "Search" -msgstr "Kërko" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s përfundim" -msgstr[1] "%(counter)s përfundime" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s gjithsej" - -msgid "Save as new" -msgstr "Ruaje si të ri" - -msgid "Save and add another" -msgstr "Ruajeni dhe shtoni një tjetër" - -msgid "Save and continue editing" -msgstr "Ruajeni dhe vazhdoni përpunimin" - -msgid "Save and view" -msgstr "Ruajeni dhe shiheni" - -msgid "Close" -msgstr "Mbylle" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Ndryshoni %(model)s e përzgjedhur" - -#, python-format -msgid "Add another %(model)s" -msgstr "Shtoni një %(model)s tjetër" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Fshije %(model)s e përzgjedhur" - -#, python-format -msgid "View selected %(model)s" -msgstr "Shihni %(model)s e përzgjedhur" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Faleminderit që harxhoni pak kohë me sajtin sot." - -msgid "Log in again" -msgstr "Hyni sërish" - -msgid "Password change" -msgstr "Ndryshim fjalëkalimi" - -msgid "Your password was changed." -msgstr "Fjalëkalimi juaj u ndryshua." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Ju lutemi, për hir të sigurisë, jepni fjalëkalimin tuaj të vjetër dhe mandej " -"jepeni dy herë fjalëkalimin tuaj të ri, që të mund të verifikojmë se i keni " -"shtypur saktë." - -msgid "Change my password" -msgstr "Ndrysho fjalëkalimin tim" - -msgid "Password reset" -msgstr "Ricaktim fjalëkalimi" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Fjalëkalimi juaj u caktua. Mund të vazhdoni më tej dhe të bëni hyrjen tani." - -msgid "Password reset confirmation" -msgstr "Ripohim ricaktimi fjalëkalimi" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Ju lutemi, jepeni fjalëkalimin tuaj dy herë, që kështu të mund të " -"verifikojmë që e shtypët saktë." - -msgid "New password:" -msgstr "Fjalëkalim i ri:" - -msgid "Confirm password:" -msgstr "Ripohoni fjalëkalimin:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Lidhja për ricaktimin e fjalëkalimit qe e pavlefshme, ndoshta ngaqë është " -"përdorur tashmë një herë. Ju lutemi, kërkoni një ricaktim të ri fjalëkalimi." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Ju kemi dërguar me email udhëzime për caktimin e fjalëkalimit tuaj, nëse " -"ekziston një llogari me email-in që dhatë. Duhet t’ju vijnë pas pak." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Nëse s’merrni ndonjë email, ju lutemi, sigurohuni se keni dhënë adresën me " -"të cilën u regjistruat, dhe kontrolloni edhe te dosja e mesazheve të " -"padëshiruar." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Këtë email po e merrni ngaqë kërkuat ricaktim fjalëkalimi për llogarinë tuaj " -"si përdorues te %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Ju lutemi, shkoni te faqja vijuese dhe zgjidhni një fjalëkalim të ri:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Faleminderit që përdorni sajtin tonë!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Ekipi i %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Harruat fjalëkalimin tuaj? Jepni më poshtë adresën tuaj email, dhe do t’ju " -"dërgojmë me email udhëzime për caktimin e një të riu." - -msgid "Email address:" -msgstr "Adresë email:" - -msgid "Reset my password" -msgstr "Ricakto fjalëkalimin tim" - -msgid "Select all objects on this page for an action" -msgstr "Përzgjidhni për një veprim krejt objektet në këtë faqe" - -msgid "All dates" -msgstr "Krejt datat" - -#, python-format -msgid "Select %s" -msgstr "Përzgjidhni %s" - -#, python-format -msgid "Select %s to change" -msgstr "Përzgjidhni %s për ta ndryshuar" - -#, python-format -msgid "Select %s to view" -msgstr "Përzgjidhni %s për parje" - -msgid "Date:" -msgstr "Datë:" - -msgid "Time:" -msgstr "Kohë:" - -msgid "Lookup" -msgstr "Kërkim" - -msgid "Currently:" -msgstr "Tani:" - -msgid "Change:" -msgstr "Ndryshim:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 877b037..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po deleted file mode 100644 index 64f70b7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,316 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2011-2012,2015 -# Besnik Bleta , 2020-2023,2025 -# Besnik Bleta , 2015,2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2020-2023,2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s i gatshëm" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Zgjidhni %s duke i përzgjedhur dhe mandej përzgjidhni butonin shigjetë " -"“Zgjidhni”." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Që të filtrohet lista e %s të passhme, shkruani brenda kutizës." - -msgid "Filter" -msgstr "Filtro" - -#, javascript-format -msgid "Choose all %s" -msgstr "Zgjidh krejt %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Zgjidh %s e përzgjedhur" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Hiqe %s e përzgjedhur" - -#, javascript-format -msgid "Chosen %s" -msgstr "U zgjodh %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Hiqe %s duke i përzgjedhur dhe mandej përzgjidhni butonin shigjetë “Hiqe”." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Shtypni në këtë kuadrat, që të filtroni listën e %s të përzgjedhur." - -msgid "(click to clear)" -msgstr "(klikoni që të spastrohet)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Hiqi krejt %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s mundësi e përzgjedhur jo e dukshme" -msgstr[1] "%s mundësi të përzgjedhura jo të dukshme" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "U përzgjodh %(sel)s nga %(cnt)s" -msgstr[1] "U përzgjodhën %(sel)s nga %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Keni ndryshime të paruajtura te fusha individuale të ndryshueshme. Nëse " -"kryeni një veprim, ndryshimet e paruajtura do të humbin." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Keni përzgjedhur një veprim, por s’keni ruajtur ende ndryshimet që bëtë te " -"fusha individuale. Ju lutemi, klikoni OK që të bëhet ruajtja. Do t’ju duhet " -"ta ribëni veprimin." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Keni përzgjedhur një veprim dhe s’keni bërë ndonjë ndryshim te fusha " -"individuale. Ndoshta po kërkonit për butonin “Shko”, në vend se për butonin " -"“Ruaje”." - -msgid "Now" -msgstr "Tani" - -msgid "Midnight" -msgstr "Mesnatë" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mesditë" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Shënim: Jeni %s orë para kohës së shërbyesit." -msgstr[1] "Shënim: Jeni %s orë para kohës së shërbyesit." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Shënim: Jeni %s orë pas kohës së shërbyesit." -msgstr[1] "Shënim: Jeni %s orë pas kohës së shërbyesit." - -msgid "Choose a Time" -msgstr "Zgjidhni një Kohë" - -msgid "Choose a time" -msgstr "Zgjidhni një kohë" - -msgid "Cancel" -msgstr "Anuloje" - -msgid "Today" -msgstr "Sot" - -msgid "Choose a Date" -msgstr "Zgjidhni një Datë" - -msgid "Yesterday" -msgstr "Dje" - -msgid "Tomorrow" -msgstr "Nesër" - -msgid "January" -msgstr "Janar" - -msgid "February" -msgstr "Shkurt" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "Prill" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Qershor" - -msgid "July" -msgstr "Korrik" - -msgid "August" -msgstr "Gusht" - -msgid "September" -msgstr "Shtator" - -msgid "October" -msgstr "Tetor" - -msgid "November" -msgstr "Nëntor" - -msgid "December" -msgstr "Dhjetor" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Shk" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Pri" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Qer" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Kor" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Gus" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sht" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Tet" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nën" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dhje" - -msgid "Sunday" -msgstr "E diel" - -msgid "Monday" -msgstr "E hënë" - -msgid "Tuesday" -msgstr "E martë" - -msgid "Wednesday" -msgstr "E mërkurë" - -msgid "Thursday" -msgstr "E enjte" - -msgid "Friday" -msgstr "E premte" - -msgid "Saturday" -msgstr "E shtunë" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Die" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Hën" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Mër" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Enj" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pre" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sht" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "H" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "E" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index 5365f7d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index 9fc90cd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,795 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Igor Jerosimić, 2019,2021,2023-2025 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2019,2021,2023-2025\n" -"Language-Team: Serbian (http://app.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Бриши означене објекте класе %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Успешно обрисано: %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Несуспело брисање %(name)s" - -msgid "Delete multiple objects" -msgstr "Брисање више објеката" - -msgid "Administration" -msgstr "Администрација" - -msgid "All" -msgstr "Сви" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -msgid "Unknown" -msgstr "Непознато" - -msgid "Any date" -msgstr "Сви датуми" - -msgid "Today" -msgstr "Данас" - -msgid "Past 7 days" -msgstr "Последњих 7 дана" - -msgid "This month" -msgstr "Овај месец" - -msgid "This year" -msgstr "Ова година" - -msgid "No date" -msgstr "Нема датума" - -msgid "Has date" -msgstr "Има датум" - -msgid "Empty" -msgstr "Празно" - -msgid "Not empty" -msgstr "Није празно" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Молим вас унесите исправно %(username)s и лозинку. Обратите пажњу да мала и " -"велика слова представљају различите карактере." - -msgid "Action:" -msgstr "Радња:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Додај још један објекат класе %(verbose_name)s." - -msgid "Remove" -msgstr "Обриши" - -msgid "Addition" -msgstr "Додавања" - -msgid "Change" -msgstr "Измени" - -msgid "Deletion" -msgstr "Брисања" - -msgid "action time" -msgstr "време радње" - -msgid "user" -msgstr "корисник" - -msgid "content type" -msgstr "тип садржаја" - -msgid "object id" -msgstr "id објекта" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "опис објекта" - -msgid "action flag" -msgstr "ознака радње" - -msgid "change message" -msgstr "опис измене" - -msgid "log entry" -msgstr "запис у логовима" - -msgid "log entries" -msgstr "записи у логовима" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Додат објекат класе „%(object)s“." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Промењен објекат класе „%(object)s“ - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Уклоњен објекат класе „%(object)s“." - -msgid "LogEntry Object" -msgstr "Објекат уноса лога" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Додат објекат {name} \"{object}\"." - -msgid "Added." -msgstr "Додато." - -msgid "and" -msgstr "и" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Измењена поља {fields} за {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Измењена поља {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Обрисан објекат {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Без измена у пољима." - -msgid "None" -msgstr "Ништа" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Држите „Control“, или „Command“ на Mac-у да бисте обележили више од једне " -"ставке." - -msgid "Select this object for an action - {}" -msgstr "Изабери овај објекат за радњу - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Објекат {name} \"{obj}\" успешно додат." - -msgid "You may edit it again below." -msgstr "Можете га изменити опет испод" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Објекат {name} \"{obj}\" успешно додат. Можете додати још један {name} испод." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Објекат {name} \"{obj}\" успешно измењен. Можете га опет изменити испод." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Објекат {name} \"{obj}\" успешно измењен. Можете додати још један {name} " -"испод." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Објекат {name} \"{obj}\" успешно измењен." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Потребно је изабрати објекте да би се извршила акција над њима. Ниједан " -"објекат није промењен." - -msgid "No action selected." -msgstr "Није изабрана ниједна акција." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Објекат „%(obj)s“ класе %(name)s је успешно обрисан." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s са идентификацијом \"%(key)s\" не постоји. Можда је избрисан?" - -#, python-format -msgid "Add %s" -msgstr "Додај објекат класе %s" - -#, python-format -msgid "Change %s" -msgstr "Измени објекат класе %s" - -#, python-format -msgid "View %s" -msgstr "Преглед %s" - -msgid "Database error" -msgstr "Грешка у бази података" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Успешно промењен %(count)s %(name)s." -msgstr[1] "Успешно промењена %(count)s %(name)s." -msgstr[2] "Успешно промењених %(count)s %(name)s." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s изабран" -msgstr[1] "Сва %(total_count)s изабрана" -msgstr[2] "Свих %(total_count)s изабраних" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 од %(cnt)s изабрано" - -msgid "Delete" -msgstr "Обриши" - -#, python-format -msgid "Change history: %s" -msgstr "Историјат измена: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Да би избрисали %(class_name)s%(instance)s потребно је брисати и следеће " -"заштићене повезане објекте: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django администрација сајта" - -msgid "Django administration" -msgstr "Django администрација" - -msgid "Site administration" -msgstr "Администрација система" - -msgid "Log in" -msgstr "Пријава" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s администрација" - -msgid "Page not found" -msgstr "Страница није пронађена" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Жао нам је, тражена страница није пронађена." - -msgid "Home" -msgstr "Почетна" - -msgid "Server error" -msgstr "Грешка на серверу" - -msgid "Server error (500)" -msgstr "Грешка на серверу (500)" - -msgid "Server Error (500)" -msgstr "Грешка на серверу (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Десила се грешка. Пријављена је администраторима сајта преко е-поште и " -"требало би да ускоро буде исправљена. Хвала Вам на стрпљењу." - -msgid "Run the selected action" -msgstr "Покрени одабрану радњу" - -msgid "Go" -msgstr "Почни" - -msgid "Click here to select the objects across all pages" -msgstr "Изабери све објекте на овој страници." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Изабери све %(module_name)s од %(total_count)s укупно." - -msgid "Clear selection" -msgstr "Поништи избор" - -msgid "Breadcrumbs" -msgstr "Мрвице" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели у апликацији %(name)s" - -msgid "Model name" -msgstr "Име модела" - -msgid "Add link" -msgstr "Додај везу" - -msgid "Change or view list link" -msgstr "Промени или погледај везу листе" - -msgid "Add" -msgstr "Додај" - -msgid "View" -msgstr "Преглед" - -msgid "You don’t have permission to view or edit anything." -msgstr "Немате дозволе да погледате или измените било шта." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Након што направите корисника, моћи ћете да измените више корисничких опција." - -msgid "Error:" -msgstr "Грешка:" - -msgid "Change password" -msgstr "Промена лозинке" - -msgid "Set password" -msgstr "Постави лозинку" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Молимо исправите грешку испод." -msgstr[1] "Молимо исправите грешке испод." -msgstr[2] "Молимо исправите грешке испод." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Унесите нову лозинку за корисника %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -" Ова акција ћеомогућити аутентификацију засновану на " -"лозинки за овог корисника." - -msgid "Disable password-based authentication" -msgstr "Онемогући аутентификацију засновану на лозинки" - -msgid "Enable password-based authentication" -msgstr "Омогући аутентификацију засновану на лозинки" - -msgid "Skip to main content" -msgstr "Пређи на главни садржај" - -msgid "Welcome," -msgstr "Добродошли," - -msgid "View site" -msgstr "Погледај сајт" - -msgid "Documentation" -msgstr "Документација" - -msgid "Log out" -msgstr "Одјава" - -#, python-format -msgid "Add %(name)s" -msgstr "Додај објекат класе %(name)s" - -msgid "History" -msgstr "Историјат" - -msgid "View on site" -msgstr "Преглед на сајту" - -msgid "Filter" -msgstr "Филтер" - -msgid "Hide counts" -msgstr "Сакриј бројање" - -msgid "Show counts" -msgstr "Прикажи бројање" - -msgid "Clear all filters" -msgstr "Обриши све филтере" - -msgid "Remove from sorting" -msgstr "Избаци из сортирања" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Приоритет сортирања: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Укључи/искључи сортирање" - -msgid "Toggle theme (current theme: auto)" -msgstr "Укључи/искључи тему (тренутна тема: ауто)" - -msgid "Toggle theme (current theme: light)" -msgstr "Укључи/искључи тему (тренутна тема: светла)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Укључи/искључи тему (тренутна тема: тамна)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Уклањање %(object_name)s „%(escaped_object)s“ повлачи уклањање свих објеката " -"који су повезани са овим објектом, али ваш налог нема дозволе за брисање " -"следећих типова објеката:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Да би избрисали изабран %(object_name)s „%(escaped_object)s“ потребно је " -"брисати и следеће заштићене повезане објекте:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Да сигурни да желите да обришете %(object_name)s „%(escaped_object)s“? " -"Следећи објекти који су у вези са овим објектом ће такође бити обрисани:" - -msgid "Objects" -msgstr "Објекти" - -msgid "Yes, I’m sure" -msgstr "Да, сигуран сам" - -msgid "No, take me back" -msgstr "Не, хоћу назад" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Да би избрисали изабране %(objects_name)s потребно је брисати и заштићене " -"повезане објекте, међутим ваш налог нема дозволе за брисање следећих типова " -"објеката:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Да би избрисали изабране %(objects_name)s потребно је брисати и следеће " -"заштићене повезане објекте:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Да ли сте сигурни да желите да избришете изабране %(objects_name)s? Сви " -"следећи објекти и објекти са њима повезани ће бити избрисани:" - -msgid "Delete?" -msgstr "Брисање?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "Сумарно" - -msgid "Recent actions" -msgstr "Скорашње акције" - -msgid "My actions" -msgstr "Моје акције" - -msgid "None available" -msgstr "Нема података" - -msgid "Added:" -msgstr "Додато:" - -msgid "Changed:" -msgstr "Измењено:" - -msgid "Deleted:" -msgstr "Обрисано:" - -msgid "Unknown content" -msgstr "Непознат садржај" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Нешто није уреду са вашом базом података. Проверите да ли постоје " -"одговарајуће табеле и да ли одговарајући корисник има приступ бази." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Пријављени сте као %(username)s, али немате овлашћења да приступите овој " -"страни. Да ли желите да се пријавите под неким другим налогом?" - -msgid "Forgotten your login credentials?" -msgstr "Заборавили сте своје акредитиве за пријаву?" - -msgid "Toggle navigation" -msgstr "Укључи/искључи мени" - -msgid "Sidebar" -msgstr "Бочна трака" - -msgid "Start typing to filter…" -msgstr "Почните да куцате да бисте филтрирали…" - -msgid "Filter navigation items" -msgstr "Филтрирајте ставке навигације" - -msgid "Date/time" -msgstr "Датум/време" - -msgid "User" -msgstr "Корисник" - -msgid "Action" -msgstr "Радња" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "унос" -msgstr[1] "уноса" -msgstr[2] "уноса" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Овај објекат нема забележен историјат измена. Вероватно није додат кроз овај " -"сајт за администрацију." - -msgid "Show all" -msgstr "Прикажи све" - -msgid "Save" -msgstr "Сачувај" - -msgid "Popup closing…" -msgstr "Попуп се затвара..." - -msgid "Search" -msgstr "Претрага" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s резултат" -msgstr[1] "%(counter)s резултата" -msgstr[2] "%(counter)s резултата" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "укупно %(full_result_count)s" - -msgid "Save as new" -msgstr "Сачувај као нови" - -msgid "Save and add another" -msgstr "Сачувај и додај следећи" - -msgid "Save and continue editing" -msgstr "Сачувај и настави са изменама" - -msgid "Save and view" -msgstr "Сними и погледај" - -msgid "Close" -msgstr "Затвори" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Измени одабрани модел %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Додај још један модел %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Обриши одабрани модел %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Изабран приказ %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Хвала што сте данас провели време на овом сајту." - -msgid "Log in again" -msgstr "Поновна пријава" - -msgid "Password change" -msgstr "Измена лозинке" - -msgid "Your password was changed." -msgstr "Ваша лозинка је измењена." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Из безбедносних разлога прво унесите своју стару лозинку, а нову затим " -"унесите два пута да бисмо могли да проверимо да ли сте је правилно унели." - -msgid "Change my password" -msgstr "Измени моју лозинку" - -msgid "Password reset" -msgstr "Ресетовање лозинке" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Ваша лозинка је постављена. Можете се пријавити." - -msgid "Password reset confirmation" -msgstr "Потврда ресетовања лозинке" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Унесите нову лозинку два пута како бисмо могли да проверимо да ли сте је " -"правилно унели." - -msgid "New password:" -msgstr "Нова лозинка:" - -msgid "Confirm password:" -msgstr "Потврда лозинке:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Линк за ресетовање лозинке није важећи, вероватно зато што је већ " -"искоришћен. Поново затражите ресетовање лозинке." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Послали смо Вам упутства за постављање лозинке, уколико налог са овом " -"адресом постоји. Требало би да их добијете ускоро." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ако не добијете поруку, проверите да ли сте унели добру адресу са којом сте " -"се и регистровали и проверите фасциклу за нежељену пошту." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Примате ову поруку зато што сте затражили ресетовање лозинке за кориснички " -"налог на сајту %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Идите на следећу страницу и поставите нову лозинку." - -msgid "In case you’ve forgotten, you are:" -msgstr "У случају да сте заборавили, ви сте:" - -msgid "Thanks for using our site!" -msgstr "Хвала што користите наш сајт!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Екипа сајта %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Заборавили сте лозинку? Унесите адресу е-поште испод и послаћемо Вам на њу " -"упутства за постављање нове лозинке." - -msgid "Email address:" -msgstr "Адреса е-поште:" - -msgid "Reset my password" -msgstr "Ресетуј моју лозинку" - -msgid "Select all objects on this page for an action" -msgstr "Изаберите све објекте на овој страници за радњу" - -msgid "All dates" -msgstr "Сви датуми" - -#, python-format -msgid "Select %s" -msgstr "Одабери објекат класе %s" - -#, python-format -msgid "Select %s to change" -msgstr "Одабери објекат класе %s за измену" - -#, python-format -msgid "Select %s to view" -msgstr "Одабери %s за преглед" - -msgid "Date:" -msgstr "Датум:" - -msgid "Time:" -msgstr "Време:" - -msgid "Lookup" -msgstr "Претражи" - -msgid "Currently:" -msgstr "Тренутно:" - -msgid "Change:" -msgstr "Измена:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index f781f90..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1e5a04d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,321 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Igor Jerosimić, 2021,2023,2025 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2021,2023,2025\n" -"Language-Team: Serbian (http://app.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Доступни %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Изаберите %s тако што ћете их означити, а затим кликните дугме са стрелицом " -"\"Изабери\"." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Филтрирајте листу доступних елемената „%s“." - -msgid "Filter" -msgstr "Филтер" - -#, javascript-format -msgid "Choose all %s" -msgstr "Изабери све %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Изабери одабрани %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Уклони изабране %s" - -#, javascript-format -msgid "Chosen %s" -msgstr "Изабрано „%s“" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Уклоните %s тако што ћете их означити, а затим кликните дугме са стрелицом " -"\"Уклони\"." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Унесите ово поље да бисте филтрирали листу изабраних %s." - -msgid "(click to clear)" -msgstr "(кликни да обришеш)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Уклони све %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s изабрана опција није видљива" -msgstr[1] "%s изабране опције нису видљиве" -msgstr[2] "%s изабраних опција није видљиво" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s од %(cnt)s изабран" -msgstr[1] "%(sel)s од %(cnt)s изабрана" -msgstr[2] "%(sel)s од %(cnt)s изабраних" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Имате несачиване измене. Ако покренете акцију, измене ће бити изгубљене." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Изабрали сте акцију, али нисте сачували ваше промене у појединачна поља. " -"Кликните на OK да сачувате промене. Биће неопходно да поново покренете " -"акцију." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Изабрали сте акцију и нисте направили ниједну промену на појединачним " -"пољима. Вероватно тражите Крени дугме уместо Сачувај." - -msgid "Now" -msgstr "Тренутно време" - -msgid "Midnight" -msgstr "Поноћ" - -msgid "6 a.m." -msgstr "18ч" - -msgid "Noon" -msgstr "Подне" - -msgid "6 p.m." -msgstr "18ч" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Обавештење: %s сат сте испред серверског времена." -msgstr[1] "Обавештење: %s сата сте испред серверског времена." -msgstr[2] "Обавештење: %s сати сте испред серверског времена." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Обавештење: %s сат сте иза серверског времена." -msgstr[1] "Обавештење: %s сата сте иза серверског времена." -msgstr[2] "Обавештење: %s сати сте иза серверског времена." - -msgid "Choose a Time" -msgstr "Одаберите време" - -msgid "Choose a time" -msgstr "Одабир времена" - -msgid "Cancel" -msgstr "Поништи" - -msgid "Today" -msgstr "Данас" - -msgid "Choose a Date" -msgstr "Одаберите датум" - -msgid "Yesterday" -msgstr "Јуче" - -msgid "Tomorrow" -msgstr "Сутра" - -msgid "January" -msgstr "Јануар" - -msgid "February" -msgstr "Фебруар" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Април" - -msgid "May" -msgstr "Мај" - -msgid "June" -msgstr "Јун" - -msgid "July" -msgstr "Јул" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Септембар" - -msgid "October" -msgstr "Октобар" - -msgid "November" -msgstr "Новембар" - -msgid "December" -msgstr "Децембар" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "јан" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "феб" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "март" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "апр" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "мај" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "јун" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "јул" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "авг" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "сеп" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "окт" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "нов" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "дец" - -msgid "Sunday" -msgstr "недеља" - -msgid "Monday" -msgstr "понедељак" - -msgid "Tuesday" -msgstr "уторак" - -msgid "Wednesday" -msgstr "среда" - -msgid "Thursday" -msgstr "четвртак" - -msgid "Friday" -msgstr "петак" - -msgid "Saturday" -msgstr "субота" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "нед" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "пон" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "уто" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "сре" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "чет" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "пет" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "суб" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "У" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index 8a52322..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index 938936a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1003 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aco Jugo, 2024 -# Igor Jerosimić, 2019,2024-2025 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2019,2024-2025\n" -"Language-Team: Serbian (Latin) (http://app.transifex.com/django/django/language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: contrib/admin/actions.py:17 -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Briši označene objekte klase %(verbose_name_plural)s" - -#: contrib/admin/actions.py:52 -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Uspešno obrisano: %(count)d %(items)s." - -#: contrib/admin/actions.py:62 contrib/admin/options.py:2250 -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nesuspelo brisanje %(name)s" - -#: contrib/admin/actions.py:64 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:17 -msgid "Delete multiple objects" -msgstr "Brisanje više objekata" - -#: contrib/admin/apps.py:13 -msgid "Administration" -msgstr "Administracija" - -#: contrib/admin/filters.py:154 contrib/admin/filters.py:296 -#: contrib/admin/filters.py:365 contrib/admin/filters.py:433 -#: contrib/admin/filters.py:608 contrib/admin/filters.py:702 -msgid "All" -msgstr "Svi" - -#: contrib/admin/filters.py:366 -msgid "Yes" -msgstr "Da" - -#: contrib/admin/filters.py:367 -msgid "No" -msgstr "Ne" - -#: contrib/admin/filters.py:381 -msgid "Unknown" -msgstr "Nepoznato" - -#: contrib/admin/filters.py:491 -msgid "Any date" -msgstr "Svi datumi" - -#: contrib/admin/filters.py:493 -msgid "Today" -msgstr "Danas" - -#: contrib/admin/filters.py:500 -msgid "Past 7 days" -msgstr "Poslednjih 7 dana" - -#: contrib/admin/filters.py:507 -msgid "This month" -msgstr "Ovaj mesec" - -#: contrib/admin/filters.py:514 -msgid "This year" -msgstr "Ova godina" - -#: contrib/admin/filters.py:524 -msgid "No date" -msgstr "Nema datuma" - -#: contrib/admin/filters.py:525 -msgid "Has date" -msgstr "Ima datum" - -#: contrib/admin/filters.py:703 -msgid "Empty" -msgstr "Prazno" - -#: contrib/admin/filters.py:704 -msgid "Not empty" -msgstr "Nije prazno" - -#: contrib/admin/forms.py:14 -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note" -" that both fields may be case-sensitive." -msgstr "Molim vas unesite ispravno %(username)s i lozinku. Obratite pažnju da mala i velika slova predstavljaju različite karaktere." - -#: contrib/admin/helpers.py:31 -msgid "Action:" -msgstr "Radnja:" - -#: contrib/admin/helpers.py:433 -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dodaj još jedan objekat klase %(verbose_name)s." - -#: contrib/admin/helpers.py:437 -msgid "Remove" -msgstr "Obriši" - -#: contrib/admin/models.py:20 -msgid "Addition" -msgstr "Dodavanja" - -#: contrib/admin/models.py:21 contrib/admin/templates/admin/app_list.html:38 -#: contrib/admin/templates/admin/edit_inline/stacked.html:20 -#: contrib/admin/templates/admin/edit_inline/tabular.html:40 -msgid "Change" -msgstr "Izmeni" - -#: contrib/admin/models.py:22 -msgid "Deletion" -msgstr "Brisanja" - -#: contrib/admin/models.py:108 -msgid "action time" -msgstr "vreme radnje" - -#: contrib/admin/models.py:115 -msgid "user" -msgstr "korisnik" - -#: contrib/admin/models.py:120 -msgid "content type" -msgstr "tip sadržaja" - -#: contrib/admin/models.py:124 -msgid "object id" -msgstr "id objekta" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -#: contrib/admin/models.py:127 -msgid "object repr" -msgstr "opis objekta" - -#: contrib/admin/models.py:129 -msgid "action flag" -msgstr "oznaka radnje" - -#: contrib/admin/models.py:132 -msgid "change message" -msgstr "opis izmene" - -#: contrib/admin/models.py:137 -msgid "log entry" -msgstr "zapis u logovima" - -#: contrib/admin/models.py:138 -msgid "log entries" -msgstr "zapisi u logovima" - -#: contrib/admin/models.py:147 -#, python-format -msgid "Added “%(object)s”." -msgstr "Dodat objekat klase „%(object)s“." - -#: contrib/admin/models.py:149 -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Promenjen objekat klase „%(object)s“ - %(changes)s" - -#: contrib/admin/models.py:154 -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Uklonjen objekat klase „%(object)s“." - -#: contrib/admin/models.py:156 -msgid "LogEntry Object" -msgstr "Objekat unosa loga" - -#: contrib/admin/models.py:185 -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Dodat objekat {name} \"{object}\"." - -#: contrib/admin/models.py:190 -msgid "Added." -msgstr "Dodato." - -#: contrib/admin/models.py:198 contrib/admin/options.py:2504 -msgid "and" -msgstr "i" - -#: contrib/admin/models.py:205 -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Izmenjena polja {fields} za {name} \"{object}\"." - -#: contrib/admin/models.py:211 -#, python-brace-format -msgid "Changed {fields}." -msgstr "Izmenjena polja {fields}." - -#: contrib/admin/models.py:221 -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Obrisan objekat {name} \"{object}\"." - -#: contrib/admin/models.py:227 -msgid "No fields changed." -msgstr "Bez izmena u poljima." - -#: contrib/admin/options.py:248 contrib/admin/options.py:292 -msgid "None" -msgstr "Ništa" - -#: contrib/admin/options.py:344 -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Držite „Control“, ili „Command“ na Mac-u da biste obeležili više od jedne stavke." - -#: contrib/admin/options.py:1031 -msgid "Select this object for an action - {}" -msgstr "Izaberi ovaj objekat za radnju - {}" - -#: contrib/admin/options.py:1469 contrib/admin/options.py:1507 -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Objekat {name} \"{obj}\" uspešno dodat." - -#: contrib/admin/options.py:1471 -msgid "You may edit it again below." -msgstr "Možete ga izmeniti opet ispod" - -#: contrib/admin/options.py:1488 -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "Objekat {name} \"{obj}\" uspešno dodat. Možete dodati još jedan {name} ispod." - -#: contrib/admin/options.py:1556 -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "Objekat {name} \"{obj}\" uspešno izmenjen. Možete ga opet izmeniti ispod." - -#: contrib/admin/options.py:1576 -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "Objekat {name} \"{obj}\" uspešno izmenjen. Možete dodati još jedan {name} ispod." - -#: contrib/admin/options.py:1598 -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Objekat {name} \"{obj}\" uspešno izmenjen." - -#: contrib/admin/options.py:1676 contrib/admin/options.py:2066 -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "Potrebno je izabrati objekte da bi se izvršila akcija nad njima. Nijedan objekat nije promenjen." - -#: contrib/admin/options.py:1696 -msgid "No action selected." -msgstr "Nije izabrana nijedna akcija." - -#: contrib/admin/options.py:1727 -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Objekat „%(obj)s“ klase %(name)s je uspešno obrisan." - -#: contrib/admin/options.py:1829 -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s sa identifikacijom \"%(key)s\" ne postoji. Možda je izbrisan?" - -#: contrib/admin/options.py:1945 -#, python-format -msgid "Add %s" -msgstr "Dodaj objekat klase %s" - -#: contrib/admin/options.py:1947 -#, python-format -msgid "Change %s" -msgstr "Izmeni objekat klase %s" - -#: contrib/admin/options.py:1949 -#, python-format -msgid "View %s" -msgstr "Pregled %s" - -#: contrib/admin/options.py:2036 -msgid "Database error" -msgstr "Greška u bazi podataka" - -#: contrib/admin/options.py:2126 -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Uspešno promenjen %(count)s %(name)s." -msgstr[1] "Uspešno promenjena %(count)s %(name)s." -msgstr[2] "Uspešno promenjenih %(count)s %(name)s." - -#: contrib/admin/options.py:2157 -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s izabran" -msgstr[1] "Sva %(total_count)s izabrana" -msgstr[2] "Svih %(total_count)s izabranih" - -#: contrib/admin/options.py:2163 -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 od %(cnt)s izabrano" - -#: contrib/admin/options.py:2252 -#: contrib/admin/templates/admin/delete_confirmation.html:18 -#: contrib/admin/templates/admin/submit_line.html:14 -msgid "Delete" -msgstr "Obriši" - -#: contrib/admin/options.py:2308 -#, python-format -msgid "Change history: %s" -msgstr "Istorijat izmena: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#: contrib/admin/options.py:2498 -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#: contrib/admin/options.py:2507 -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "Da bi izbrisali %(class_name)s%(instance)s potrebno je brisati i sledeće zaštićene povezane objekte: %(related_objects)s" - -#: contrib/admin/sites.py:40 contrib/admin/templates/admin/base_site.html:3 -msgid "Django site admin" -msgstr "Django administracija sajta" - -#: contrib/admin/sites.py:43 contrib/admin/templates/admin/base_site.html:6 -msgid "Django administration" -msgstr "Django administracija" - -#: contrib/admin/sites.py:46 -msgid "Site administration" -msgstr "Administracija sistema" - -#: contrib/admin/sites.py:431 contrib/admin/templates/admin/login.html:64 -#: contrib/admin/templates/registration/password_reset_complete.html:15 -#: contrib/admin/tests.py:146 -msgid "Log in" -msgstr "Prijava" - -#: contrib/admin/sites.py:586 -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administracija" - -#: contrib/admin/templates/admin/404.html:4 -#: contrib/admin/templates/admin/404.html:8 -msgid "Page not found" -msgstr "Stranica nije pronađena" - -#: contrib/admin/templates/admin/404.html:10 -msgid "We’re sorry, but the requested page could not be found." -msgstr "Žao nam je, tražena stranica nije pronađena." - -#: contrib/admin/templates/admin/500.html:6 -#: contrib/admin/templates/admin/app_index.html:10 -#: contrib/admin/templates/admin/auth/user/change_password.html:15 -#: contrib/admin/templates/admin/base.html:75 -#: contrib/admin/templates/admin/change_form.html:19 -#: contrib/admin/templates/admin/change_list.html:33 -#: contrib/admin/templates/admin/delete_confirmation.html:14 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:14 -#: contrib/admin/templates/admin/invalid_setup.html:6 -#: contrib/admin/templates/admin/object_history.html:6 -#: contrib/admin/templates/registration/logged_out.html:4 -#: contrib/admin/templates/registration/password_change_done.html:13 -#: contrib/admin/templates/registration/password_change_form.html:16 -#: contrib/admin/templates/registration/password_reset_complete.html:6 -#: contrib/admin/templates/registration/password_reset_confirm.html:8 -#: contrib/admin/templates/registration/password_reset_done.html:6 -#: contrib/admin/templates/registration/password_reset_form.html:8 -msgid "Home" -msgstr "Početna" - -#: contrib/admin/templates/admin/500.html:7 -msgid "Server error" -msgstr "Greška na serveru" - -#: contrib/admin/templates/admin/500.html:11 -msgid "Server error (500)" -msgstr "Greška na serveru (500)" - -#: contrib/admin/templates/admin/500.html:14 -msgid "Server Error (500)" -msgstr "Greška na serveru (500)" - -#: contrib/admin/templates/admin/500.html:15 -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "Desila se greška. Prijavljena je administratorima sajta preko e-pošte i trebalo bi da uskoro bude ispravljena. Hvala Vam na strpljenju." - -#: contrib/admin/templates/admin/actions.html:8 -msgid "Run the selected action" -msgstr "Pokreni odabranu radnju" - -#: contrib/admin/templates/admin/actions.html:8 -msgid "Go" -msgstr "Počni" - -#: contrib/admin/templates/admin/actions.html:16 -msgid "Click here to select the objects across all pages" -msgstr "Izaberi sve objekte na ovoj stranici." - -#: contrib/admin/templates/admin/actions.html:16 -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Izaberi sve %(module_name)s od %(total_count)s ukupno." - -#: contrib/admin/templates/admin/actions.html:18 -msgid "Clear selection" -msgstr "Poništi izbor" - -#: contrib/admin/templates/admin/app_index.html:8 -#: contrib/admin/templates/admin/base.html:72 -msgid "Breadcrumbs" -msgstr "Mrvice" - -#: contrib/admin/templates/admin/app_list.html:8 -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeli u aplikaciji %(name)s" - -#: contrib/admin/templates/admin/app_list.html:12 -msgid "Model name" -msgstr "Ime modela" - -#: contrib/admin/templates/admin/app_list.html:13 -msgid "Add link" -msgstr "Dodaj vezu" - -#: contrib/admin/templates/admin/app_list.html:14 -msgid "Change or view list link" -msgstr "Pogledaj ili promeni vezu liste" - -#: contrib/admin/templates/admin/app_list.html:29 -msgid "Add" -msgstr "Dodaj" - -#: contrib/admin/templates/admin/app_list.html:36 -#: contrib/admin/templates/admin/edit_inline/stacked.html:20 -#: contrib/admin/templates/admin/edit_inline/tabular.html:40 -msgid "View" -msgstr "Pregled" - -#: contrib/admin/templates/admin/app_list.html:50 -msgid "You don’t have permission to view or edit anything." -msgstr "Nemate dozvole da pogledate ili izmenite bilo šta." - -#: contrib/admin/templates/admin/auth/user/add_form.html:6 -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "Nakon što napravite korisnika, moći ćete da izmenite više korisničkih opcija." - -#: contrib/admin/templates/admin/auth/user/change_password.html:5 -#: contrib/admin/templates/admin/change_form.html:4 -#: contrib/admin/templates/admin/change_list.html:4 -#: contrib/admin/templates/admin/login.html:4 -#: contrib/admin/templates/registration/password_change_form.html:4 -#: contrib/admin/templates/registration/password_reset_confirm.html:4 -#: contrib/admin/templates/registration/password_reset_form.html:4 -msgid "Error:" -msgstr "Greška:" - -#: contrib/admin/templates/admin/auth/user/change_password.html:19 -#: contrib/admin/templates/admin/auth/user/change_password.html:71 -#: contrib/admin/templates/admin/base.html:56 -#: contrib/admin/templates/registration/password_change_done.html:4 -#: contrib/admin/templates/registration/password_change_form.html:7 -msgid "Change password" -msgstr "Promena lozinke" - -#: contrib/admin/templates/admin/auth/user/change_password.html:19 -msgid "Set password" -msgstr "Postavi lozinku" - -#: contrib/admin/templates/admin/auth/user/change_password.html:30 -#: contrib/admin/templates/admin/change_form.html:45 -#: contrib/admin/templates/admin/change_list.html:54 -#: contrib/admin/templates/admin/login.html:24 -#: contrib/admin/templates/registration/password_change_form.html:27 -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Molimo ispravite grešku ispod." -msgstr[1] "Molimo ispravite greške ispod." -msgstr[2] "Molimo ispravite greške ispod." - -#: contrib/admin/templates/admin/auth/user/change_password.html:34 -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Unesite novu lozinku za korisnika %(username)s." - -#: contrib/admin/templates/admin/auth/user/change_password.html:36 -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr " Ova akcija ćeomogućiti autentifikaciju zasnovanu na lozinki za ovog korisnika." - -#: contrib/admin/templates/admin/auth/user/change_password.html:72 -msgid "Disable password-based authentication" -msgstr "Onemogući autentifikaciju zasnovanu na lozinki" - -#: contrib/admin/templates/admin/auth/user/change_password.html:74 -msgid "Enable password-based authentication" -msgstr "Omogući autentifikaciju zasnovanu na lozinki" - -#: contrib/admin/templates/admin/base.html:27 -msgid "Skip to main content" -msgstr "Pređi na glavni sadržaj" - -#: contrib/admin/templates/admin/base.html:42 -msgid "Welcome," -msgstr "Dobrodošli," - -#: contrib/admin/templates/admin/base.html:47 -msgid "View site" -msgstr "Pogledaj sajt" - -#: contrib/admin/templates/admin/base.html:52 -#: contrib/admin/templates/registration/password_change_done.html:4 -#: contrib/admin/templates/registration/password_change_form.html:7 -msgid "Documentation" -msgstr "Dokumentacija" - -#: contrib/admin/templates/admin/base.html:60 -#: contrib/admin/templates/registration/password_change_done.html:7 -#: contrib/admin/templates/registration/password_change_form.html:10 -msgid "Log out" -msgstr "Odjava" - -#: contrib/admin/templates/admin/change_form.html:22 -#: contrib/admin/templates/admin/change_list_object_tools.html:8 -#, python-format -msgid "Add %(name)s" -msgstr "Dodaj objekat klase %(name)s" - -#: contrib/admin/templates/admin/change_form_object_tools.html:5 -#: contrib/admin/templates/admin/object_history.html:10 -msgid "History" -msgstr "Istorijat" - -#: contrib/admin/templates/admin/change_form_object_tools.html:7 -#: contrib/admin/templates/admin/edit_inline/stacked.html:22 -#: contrib/admin/templates/admin/edit_inline/tabular.html:42 -msgid "View on site" -msgstr "Pregled na sajtu" - -#: contrib/admin/templates/admin/change_list.html:79 -msgid "Filter" -msgstr "Filter" - -#: contrib/admin/templates/admin/change_list.html:82 -msgid "Hide counts" -msgstr "Sakrij brojanje" - -#: contrib/admin/templates/admin/change_list.html:83 -msgid "Show counts" -msgstr "Prikaži brojanje" - -#: contrib/admin/templates/admin/change_list.html:86 -msgid "Clear all filters" -msgstr "Obriši sve filtere" - -#: contrib/admin/templates/admin/change_list_results.html:16 -msgid "Remove from sorting" -msgstr "Izbaci iz sortiranja" - -#: contrib/admin/templates/admin/change_list_results.html:17 -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritet sortiranja: %(priority_number)s" - -#: contrib/admin/templates/admin/change_list_results.html:18 -msgid "Toggle sorting" -msgstr "Uključi/isključi sortiranje" - -#: contrib/admin/templates/admin/color_theme_toggle.html:3 -msgid "Toggle theme (current theme: auto)" -msgstr "Uključi/isključi temu (trenutna tema: auto)" - -#: contrib/admin/templates/admin/color_theme_toggle.html:4 -msgid "Toggle theme (current theme: light)" -msgstr "Uključi/isključi temu (trenutna tema: svetla)" - -#: contrib/admin/templates/admin/color_theme_toggle.html:5 -msgid "Toggle theme (current theme: dark)" -msgstr "Uključi/isključi temu (trenutna tema: tamna)" - -#: contrib/admin/templates/admin/delete_confirmation.html:25 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "Uklanjanje %(object_name)s „%(escaped_object)s“ povlači uklanjanje svih objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za brisanje sledećih tipova objekata:" - -#: contrib/admin/templates/admin/delete_confirmation.html:30 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the" -" following protected related objects:" -msgstr "Da bi izbrisali izabran %(object_name)s „%(escaped_object)s“ potrebno je brisati i sledeće zaštićene povezane objekte:" - -#: contrib/admin/templates/admin/delete_confirmation.html:35 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "Da sigurni da želite da obrišete %(object_name)s „%(escaped_object)s“? Sledeći objekti koji su u vezi sa ovim objektom će takođe biti obrisani:" - -#: contrib/admin/templates/admin/delete_confirmation.html:37 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:31 -msgid "Objects" -msgstr "Objekti" - -#: contrib/admin/templates/admin/delete_confirmation.html:44 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:42 -msgid "Yes, I’m sure" -msgstr "Da, siguran sam" - -#: contrib/admin/templates/admin/delete_confirmation.html:45 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:43 -msgid "No, take me back" -msgstr "Ne, hoću nazad" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:23 -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "Da bi izbrisali izabrane %(objects_name)s potrebno je brisati i zaštićene povezane objekte, međutim vaš nalog nema dozvole za brisanje sledećih tipova objekata:" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:26 -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "Da bi izbrisali izabrane %(objects_name)s potrebno je brisati i sledeće zaštićene povezane objekte:" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:29 -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "Da li ste sigurni da želite da izbrišete izabrane %(objects_name)s? Svi sledeći objekti i objekti sa njima povezani će biti izbrisani:" - -#: contrib/admin/templates/admin/edit_inline/tabular.html:26 -msgid "Delete?" -msgstr "Brisanje?" - -#: contrib/admin/templates/admin/filter.html:4 -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -#: contrib/admin/templates/admin/includes/object_delete_summary.html:2 -msgid "Summary" -msgstr "Sumarno" - -#: contrib/admin/templates/admin/index.html:23 -msgid "Recent actions" -msgstr "Skorašnje akcije" - -#: contrib/admin/templates/admin/index.html:24 -msgid "My actions" -msgstr "Moje akcije" - -#: contrib/admin/templates/admin/index.html:28 -msgid "None available" -msgstr "Nema podataka" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Added:" -msgstr "Dodato:" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Changed:" -msgstr "Izmenjeno:" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Deleted:" -msgstr "Obrisano:" - -#: contrib/admin/templates/admin/index.html:43 -msgid "Unknown content" -msgstr "Nepoznat sadržaj" - -#: contrib/admin/templates/admin/invalid_setup.html:12 -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate" -" database tables have been created, and make sure the database is readable " -"by the appropriate user." -msgstr "Nešto nije uredu sa vašom bazom podataka. Proverite da li postoje odgovarajuće tabele i da li odgovarajući korisnik ima pristup bazi." - -#: contrib/admin/templates/admin/login.html:40 -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this" -" page. Would you like to login to a different account?" -msgstr "Prijavljeni ste kao %(username)s, ali nemate ovlašćenja da pristupite ovoj strani. Da li želite da se prijavite pod nekim drugim nalogom?" - -#: contrib/admin/templates/admin/login.html:60 -msgid "Forgotten your login credentials?" -msgstr "Zaboravili ste svoje akreditive za prijavu?" - -#: contrib/admin/templates/admin/nav_sidebar.html:2 -msgid "Toggle navigation" -msgstr "Uključi/isključi meni" - -#: contrib/admin/templates/admin/nav_sidebar.html:3 -msgid "Sidebar" -msgstr "Bočna traka" - -#: contrib/admin/templates/admin/nav_sidebar.html:5 -msgid "Start typing to filter…" -msgstr "Počnite da kucate da biste filtrirali…" - -#: contrib/admin/templates/admin/nav_sidebar.html:6 -msgid "Filter navigation items" -msgstr "Filtrirajte stavke navigacije" - -#: contrib/admin/templates/admin/object_history.html:22 -msgid "Date/time" -msgstr "Datum/vreme" - -#: contrib/admin/templates/admin/object_history.html:23 -msgid "User" -msgstr "Korisnik" - -#: contrib/admin/templates/admin/object_history.html:24 -msgid "Action" -msgstr "Radnja" - -#: contrib/admin/templates/admin/object_history.html:49 -msgid "entry" -msgid_plural "entries" -msgstr[0] "unos" -msgstr[1] "unosa" -msgstr[2] "unosa" - -#: contrib/admin/templates/admin/object_history.html:52 -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this" -" admin site." -msgstr "Ovaj objekat nema zabeležen istorijat izmena. Verovatno nije dodat kroz ovaj sajt za administraciju." - -#: contrib/admin/templates/admin/pagination.html:10 -#: contrib/admin/templates/admin/search_form.html:9 -msgid "Show all" -msgstr "Prikaži sve" - -#: contrib/admin/templates/admin/pagination.html:11 -#: contrib/admin/templates/admin/submit_line.html:4 -msgid "Save" -msgstr "Sačuvaj" - -#: contrib/admin/templates/admin/popup_response.html:3 -msgid "Popup closing…" -msgstr "Popup se zatvara..." - -#: contrib/admin/templates/admin/search_form.html:7 -msgid "Search" -msgstr "Pretraga" - -#: contrib/admin/templates/admin/search_form.html:9 -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s rezultat" -msgstr[1] "%(counter)s rezultata" -msgstr[2] "%(counter)s rezultata" - -#: contrib/admin/templates/admin/search_form.html:9 -#, python-format -msgid "%(full_result_count)s total" -msgstr "ukupno %(full_result_count)s" - -#: contrib/admin/templates/admin/submit_line.html:5 -msgid "Save as new" -msgstr "Sačuvaj kao novi" - -#: contrib/admin/templates/admin/submit_line.html:6 -msgid "Save and add another" -msgstr "Sačuvaj i dodaj sledeći" - -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save and continue editing" -msgstr "Sačuvaj i nastavi sa izmenama" - -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save and view" -msgstr "Snimi i pogledaj" - -#: contrib/admin/templates/admin/submit_line.html:10 -msgid "Close" -msgstr "Zatvori" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:11 -#, python-format -msgid "Change selected %(model)s" -msgstr "Izmeni odabrani model %(model)s" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:19 -#, python-format -msgid "Add another %(model)s" -msgstr "Dodaj još jedan model %(model)s" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:27 -#, python-format -msgid "Delete selected %(model)s" -msgstr "Obriši odabrani model %(model)s" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:34 -#, python-format -msgid "View selected %(model)s" -msgstr "Izabran prikaz %(model)s" - -#: contrib/admin/templates/registration/logged_out.html:10 -msgid "Thanks for spending some quality time with the web site today." -msgstr "Hvala što ste danas proveli vreme na ovom sajtu." - -#: contrib/admin/templates/registration/logged_out.html:12 -msgid "Log in again" -msgstr "Ponovna prijava" - -#: contrib/admin/templates/registration/password_change_done.html:14 -#: contrib/admin/templates/registration/password_change_form.html:17 -msgid "Password change" -msgstr "Izmena lozinke" - -#: contrib/admin/templates/registration/password_change_done.html:19 -msgid "Your password was changed." -msgstr "Vaša lozinka je izmenjena." - -#: contrib/admin/templates/registration/password_change_form.html:32 -msgid "" -"Please enter your old password, for security’s sake, and then enter your new" -" password twice so we can verify you typed it in correctly." -msgstr "Iz bezbednosnih razloga prvo unesite svoju staru lozinku, a novu zatim unesite dva puta da bismo mogli da proverimo da li ste je pravilno uneli." - -#: contrib/admin/templates/registration/password_change_form.html:60 -#: contrib/admin/templates/registration/password_reset_confirm.html:38 -msgid "Change my password" -msgstr "Izmeni moju lozinku" - -#: contrib/admin/templates/registration/password_reset_complete.html:7 -#: contrib/admin/templates/registration/password_reset_done.html:7 -#: contrib/admin/templates/registration/password_reset_form.html:9 -msgid "Password reset" -msgstr "Resetovanje lozinke" - -#: contrib/admin/templates/registration/password_reset_complete.html:13 -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaša lozinka je postavljena. Možete se prijaviti." - -#: contrib/admin/templates/registration/password_reset_confirm.html:9 -msgid "Password reset confirmation" -msgstr "Potvrda resetovanja lozinke" - -#: contrib/admin/templates/registration/password_reset_confirm.html:17 -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Unesite novu lozinku dva puta kako bismo mogli da proverimo da li ste je pravilno uneli." - -#: contrib/admin/templates/registration/password_reset_confirm.html:25 -msgid "New password:" -msgstr "Nova lozinka:" - -#: contrib/admin/templates/registration/password_reset_confirm.html:32 -msgid "Confirm password:" -msgstr "Potvrda lozinke:" - -#: contrib/admin/templates/registration/password_reset_confirm.html:44 -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "Link za resetovanje lozinke nije važeći, verovatno zato što je već iskorišćen. Ponovo zatražite resetovanje lozinke." - -#: contrib/admin/templates/registration/password_reset_done.html:13 -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "Poslali smo Vam uputstva za postavljanje lozinke, ukoliko nalog sa ovom adresom postoji. Trebalo bi da ih dobijete uskoro." - -#: contrib/admin/templates/registration/password_reset_done.html:15 -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "Ako ne dobijete poruku, proverite da li ste uneli dobru adresu sa kojom ste se i registrovali i proverite fasciklu za neželjenu poštu." - -#: contrib/admin/templates/registration/password_reset_email.html:2 -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "Primate ovu poruku zato što ste zatražili resetovanje lozinke za korisnički nalog na sajtu %(site_name)s." - -#: contrib/admin/templates/registration/password_reset_email.html:4 -msgid "Please go to the following page and choose a new password:" -msgstr "Idite na sledeću stranicu i postavite novu lozinku." - -#: contrib/admin/templates/registration/password_reset_email.html:8 -msgid "In case you’ve forgotten, you are:" -msgstr "U slučaju da ste zaboravili, vi ste:" - -#: contrib/admin/templates/registration/password_reset_email.html:10 -msgid "Thanks for using our site!" -msgstr "Hvala što koristite naš sajt!" - -#: contrib/admin/templates/registration/password_reset_email.html:12 -#, python-format -msgid "The %(site_name)s team" -msgstr "Ekipa sajta %(site_name)s" - -#: contrib/admin/templates/registration/password_reset_form.html:15 -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "Zaboravili ste lozinku? Unesite adresu e-pošte ispod i poslaćemo Vam na nju uputstva za postavljanje nove lozinke." - -#: contrib/admin/templates/registration/password_reset_form.html:22 -msgid "Email address:" -msgstr "Adresa e-pošte:" - -#: contrib/admin/templates/registration/password_reset_form.html:28 -msgid "Reset my password" -msgstr "Resetuj moju lozinku" - -#: contrib/admin/templatetags/admin_list.py:101 -msgid "Select all objects on this page for an action" -msgstr "Izaberite sve objekte na ovoj stranici za radnju" - -#: contrib/admin/templatetags/admin_list.py:445 -msgid "All dates" -msgstr "Svi datumi" - -#: contrib/admin/views/main.py:148 -#, python-format -msgid "Select %s" -msgstr "Odaberi objekat klase %s" - -#: contrib/admin/views/main.py:150 -#, python-format -msgid "Select %s to change" -msgstr "Odaberi objekat klase %s za izmenu" - -#: contrib/admin/views/main.py:152 -#, python-format -msgid "Select %s to view" -msgstr "Odaberi %s za pregled" - -#: contrib/admin/widgets.py:99 -msgid "Date:" -msgstr "Datum:" - -#: contrib/admin/widgets.py:100 -msgid "Time:" -msgstr "Vreme:" - -#: contrib/admin/widgets.py:164 -msgid "Lookup" -msgstr "Pretraži" - -#: contrib/admin/widgets.py:393 -msgid "Currently:" -msgstr "Trenutno:" - -#: contrib/admin/widgets.py:394 -msgid "Change:" -msgstr "Izmena:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo deleted file mode 100644 index a2b1196..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po deleted file mode 100644 index 26efe13..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,319 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Igor Jerosimić, 2019,2021,2023-2025 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2019,2021,2023-2025\n" -"Language-Team: Serbian (Latin) (http://app.transifex.com/django/django/" -"language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostupni %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Izaberite %s tako što ćete ih označiti, a zatim kliknite dugme sa strelicom " -"\"Izaberi\"." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Filtrirajte listu dostupnih elemenata „%s“." - -msgid "Filter" -msgstr "Filter" - -#, javascript-format -msgid "Choose all %s" -msgstr "Izaberi sve %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Izaberi označene %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Ukloni izabrane %s" - -#, javascript-format -msgid "Chosen %s" -msgstr "Izabrano „%s“" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Uklonite %s tako što ćete ih označiti, a zatim kliknite dugme sa strelicom " -"\"Ukloni\"." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Unesite u ovo polje da biste filtrirali listu izabranih %s." - -msgid "(click to clear)" -msgstr "(klikni da obrišeš)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Ukloni sve %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s izabrana opcija nije vidljiva" -msgstr[1] "%s izabrane opcije nisu vidljive" -msgstr[2] "%s izabranih opcija nije vidljivo" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s od %(cnt)s izabran" -msgstr[1] "%(sel)s od %(cnt)s izabrana" -msgstr[2] "%(sel)s od %(cnt)s izabranih" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Imate nesačivane izmene. Ako pokrenete akciju, izmene će biti izgubljene." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Izabrali ste akciju, ali niste sačuvali vaše promene u pojedinačna polja. " -"Kliknite na OK da sačuvate promene. Biće neophodno da ponovo pokrenete " -"akciju." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Izabrali ste akciju i niste napravili nijednu promenu na pojedinačnim " -"poljima. Verovatno tražite Kreni dugme umesto Sačuvaj." - -msgid "Now" -msgstr "Trenutno vreme" - -msgid "Midnight" -msgstr "Ponoć" - -msgid "6 a.m." -msgstr "18č" - -msgid "Noon" -msgstr "Podne" - -msgid "6 p.m." -msgstr "18č" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Obaveštenje: Vi ste %s sat ispred serverskog vremena." -msgstr[1] "Obaveštenje: Vi ste %s sata ispred serverskog vremena." -msgstr[2] "Obaveštenje: Vi ste %s sati ispred serverskog vremena." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Obaveštenje: Vi ste %s sat iza serverskog vremena." -msgstr[1] "Obaveštenje: Vi ste %s sata iza serverskog vremena." -msgstr[2] "Obaveštenje: Vi ste %s sati iza serverskog vremena." - -msgid "Choose a Time" -msgstr "Odaberite vreme" - -msgid "Choose a time" -msgstr "Odabir vremena" - -msgid "Cancel" -msgstr "Poništi" - -msgid "Today" -msgstr "Danas" - -msgid "Choose a Date" -msgstr "Odaberite datum" - -msgid "Yesterday" -msgstr "Juče" - -msgid "Tomorrow" -msgstr "Sutra" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Jun" - -msgid "July" -msgstr "Jul" - -msgid "August" -msgstr "Avgust" - -msgid "September" -msgstr "Septembar" - -msgid "October" -msgstr "Oktobar" - -msgid "November" -msgstr "Novembar" - -msgid "December" -msgstr "Decembar" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mart" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "avg" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec" - -msgid "Sunday" -msgstr "nedelja" - -msgid "Monday" -msgstr "ponedeljak" - -msgid "Tuesday" -msgstr "utorak" - -msgid "Wednesday" -msgstr "sreda" - -msgid "Thursday" -msgstr "četvrtak" - -msgid "Friday" -msgstr "petak" - -msgid "Saturday" -msgstr "subota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "ned" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "pon" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "uto" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "sre" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "čet" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "pet" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "sub" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "N" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "U" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "S" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Č" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index 2b6e324..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index d29e0b8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,798 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Albin Larsson , 2022-2023 -# Alex Nordlund , 2012 -# Anders Hovmöller , 2023 -# Andreas Pelme , 2014 -# d7bcbd5f5cbecdc2b959899620582440, 2011 -# Cybjit , 2012 -# Elias Johnstone , 2022 -# Henrik Palmlund Wahlgren , 2019 -# Jannis Leidel , 2011 -# Johan Rohdin, 2021 -# Jonathan Lindén, 2015 -# Jörgen Olofsson, 2024 -# Jonathan Lindén, 2014 -# metteludwig , 2019 -# Mattias Hansson , 2016 -# nip3o , 2024 -# Mikko Hellsing , 2011 -# Thomas Lundqvist, 2013,2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: nip3o , 2024\n" -"Language-Team: Swedish (http://app.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ta bort markerade %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Tog bort %(count)d %(items)s" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kan inte ta bort %(name)s" - -msgid "Delete multiple objects" -msgstr "Ta bort flera objekt" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "Alla" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nej" - -msgid "Unknown" -msgstr "Okänt" - -msgid "Any date" -msgstr "Alla datum" - -msgid "Today" -msgstr "Idag" - -msgid "Past 7 days" -msgstr "Senaste 7 dagarna" - -msgid "This month" -msgstr "Denna månad" - -msgid "This year" -msgstr "Detta år" - -msgid "No date" -msgstr "Inget datum" - -msgid "Has date" -msgstr "Har datum" - -msgid "Empty" -msgstr "Tom" - -msgid "Not empty" -msgstr "Inte tom" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Ange %(username)s och lösenord för ett personalkonto. Notera att båda fälten " -"är skiftlägeskänsliga." - -msgid "Action:" -msgstr "Åtgärd:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Lägg till ytterligare %(verbose_name)s" - -msgid "Remove" -msgstr "Ta bort" - -msgid "Addition" -msgstr "Tillägg" - -msgid "Change" -msgstr "Ändra" - -msgid "Deletion" -msgstr "Borttagning" - -msgid "action time" -msgstr "händelsetid" - -msgid "user" -msgstr "användare" - -msgid "content type" -msgstr "innehållstyp" - -msgid "object id" -msgstr "objektets id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objektets beskrivning" - -msgid "action flag" -msgstr "händelseflagga" - -msgid "change message" -msgstr "ändra meddelande" - -msgid "log entry" -msgstr "loggpost" - -msgid "log entries" -msgstr "loggposter" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Lade till \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Ändrade “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Tog bort “%(object)s.”" - -msgid "LogEntry Object" -msgstr "LogEntry-Objekt" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Lade till {name} “{object}”." - -msgid "Added." -msgstr "Lagt till." - -msgid "and" -msgstr "och" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Ändrade {fields} för {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Ändrade {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Tog bort {name} “{object}”." - -msgid "No fields changed." -msgstr "Inga fält ändrade." - -msgid "None" -msgstr "Inget" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Håll inne “Control”, eller “Command” på en Mac, för att välja fler än en." - -msgid "Select this object for an action - {}" -msgstr "Välj detta objekt för en åtgärd - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Lade till {name} “{obj}”." - -msgid "You may edit it again below." -msgstr "Du kan redigera det igen nedan" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "Lade till {name} “{obj}”. Du kan lägga till ytterligare {name} nedan." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "Ändrade {name} “{obj}”. Du kan göra ytterligare förändringar nedan." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "Ändrade {name} “{obj}”. Du kan lägga till ytterligare {name} nedan." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Ändrade {name} “{obj}”." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Poster måste väljas för att genomföra åtgärder. Inga poster har ändrats." - -msgid "No action selected." -msgstr "Inga åtgärder valda." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Tog bort %(name)s “%(obj)s”." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s med ID “%(key)s” finns inte. Kan den ha blivit borttagen?" - -#, python-format -msgid "Add %s" -msgstr "Lägg till %s" - -#, python-format -msgid "Change %s" -msgstr "Ändra %s" - -#, python-format -msgid "View %s" -msgstr "Visa %s" - -msgid "Database error" -msgstr "Databasfel" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ändrades." -msgstr[1] "%(count)s %(name)s ändrades." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s vald" -msgstr[1] "Alla %(total_count)s valda" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 av %(cnt)s valda" - -msgid "Delete" -msgstr "Radera" - -#, python-format -msgid "Change history: %s" -msgstr "Ändringshistorik: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Borttagning av %(class_name)s %(instance)s kräver borttagning av följande " -"skyddade relaterade objekt: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django webbplatsadministration" - -msgid "Django administration" -msgstr "Django-administration" - -msgid "Site administration" -msgstr "Webbplatsadministration" - -msgid "Log in" -msgstr "Logga in" - -#, python-format -msgid "%(app)s administration" -msgstr "Administration av %(app)s" - -msgid "Page not found" -msgstr "Sidan kunde inte hittas" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Tyvärr kunde inte den begärda sidan hittas." - -msgid "Home" -msgstr "Hem" - -msgid "Server error" -msgstr "Serverfel" - -msgid "Server error (500)" -msgstr "Serverfel (500)" - -msgid "Server Error (500)" -msgstr "Serverfel (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ett fel har inträffat. Felet är rapporterat till sidans administratörer via " -"e-post och bör vara åtgärdat inom kort. Tack för ditt tålamod." - -msgid "Run the selected action" -msgstr "Kör markerade operationer" - -msgid "Go" -msgstr "Utför" - -msgid "Click here to select the objects across all pages" -msgstr "Klicka här för att välja alla objekt från alla sidor" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Välj alla %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Rensa urval" - -msgid "Breadcrumbs" -msgstr "Brödsmulor" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeller i applikationen %(name)s" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Lägg till" - -msgid "View" -msgstr "Visa" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har inte tillåtelse att se eller ändra någonting." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Ändra lösenord" - -msgid "Set password" -msgstr "Sätt lösenord" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Var god rätta felet nedan." -msgstr[1] "Var god rätta felen nedan." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Ange nytt lösenord för användare %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Denna åtgärd aktiverar lösenordsbaserad autentisering för " -"denna användare." - -msgid "Disable password-based authentication" -msgstr "Inaktivera lösenordsbaserad autentisering" - -msgid "Enable password-based authentication" -msgstr "Aktivera lösenordsbaserad autentisering" - -msgid "Skip to main content" -msgstr "Hoppa till huvudinnehållet" - -msgid "Welcome," -msgstr "Välkommen," - -msgid "View site" -msgstr "Visa sida" - -msgid "Documentation" -msgstr "Dokumentation" - -msgid "Log out" -msgstr "Logga ut" - -#, python-format -msgid "Add %(name)s" -msgstr "Lägg till %(name)s" - -msgid "History" -msgstr "Historik" - -msgid "View on site" -msgstr "Visa på webbplats" - -msgid "Filter" -msgstr "Filtrera" - -msgid "Hide counts" -msgstr "Dölj antal" - -msgid "Show counts" -msgstr "Visa antal" - -msgid "Clear all filters" -msgstr "Rensa alla filter" - -msgid "Remove from sorting" -msgstr "Ta bort från sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteringsprioritet: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Ändra sorteringsordning" - -msgid "Toggle theme (current theme: auto)" -msgstr "Växla tema (aktuellt tema: automatiskt)" - -msgid "Toggle theme (current theme: light)" -msgstr "Växla tema (aktuellt tema: ljust)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Växla tema (aktuellt tema: mörkt)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Att ta bort %(object_name)s '%(escaped_object)s' skulle innebära att " -"relaterade objekt togs bort, men ditt konto har inte rättigheter att ta bort " -"följande objekttyper:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Borttagning av %(object_name)s '%(escaped_object)s' kräver borttagning av " -"följande skyddade relaterade objekt:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Är du säker på att du vill ta bort %(object_name)s \"%(escaped_object)s\"? " -"Följande relaterade objekt kommer att tas bort:" - -msgid "Objects" -msgstr "Objekt" - -msgid "Yes, I’m sure" -msgstr "Ja, jag är säker" - -msgid "No, take me back" -msgstr "Nej, ta mig tillbaka" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Borttagning av valda %(objects_name)s skulle resultera i borttagning av " -"relaterade objekt, men ditt konto har inte behörighet att ta bort följande " -"typer av objekt:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Borttagning av valda %(objects_name)s skulle kräva borttagning av följande " -"skyddade objekt:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Är du säker på att du vill ta bort valda %(objects_name)s? Alla följande " -"objekt samt relaterade objekt kommer att tas bort: " - -msgid "Delete?" -msgstr "Radera?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " På %(filter_title)s " - -msgid "Summary" -msgstr "Översikt" - -msgid "Recent actions" -msgstr "Senaste Händelser" - -msgid "My actions" -msgstr "Mina händelser" - -msgid "None available" -msgstr "Inga tillgängliga" - -msgid "Added:" -msgstr "Lagt till:" - -msgid "Changed:" -msgstr "Ändrade:" - -msgid "Deleted:" -msgstr "Raderade:" - -msgid "Unknown content" -msgstr "Okänt innehåll" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Någonting är fel med din databas-installation. Kontrollera att relevanta " -"tabeller i databasen är skapta, och kontrollera även att databasen är läsbar " -"av rätt användare." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Du är autentiserad som %(username)s men är inte behörig att komma åt denna " -"sida. Vill du logga in med ett annat konto?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Växla navigering" - -msgid "Sidebar" -msgstr "Sidopanel" - -msgid "Start typing to filter…" -msgstr "Börja skriv för att filtrera..." - -msgid "Filter navigation items" -msgstr "Filtrera navigeringsobjekt" - -msgid "Date/time" -msgstr "Datum tid" - -msgid "User" -msgstr "Användare" - -msgid "Action" -msgstr "Händelse" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "post" -msgstr[1] "poster" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Det här objektet har ingen förändringshistorik. Det var antagligen inte " -"tillagt via den här admin-sidan." - -msgid "Show all" -msgstr "Visa alla" - -msgid "Save" -msgstr "Spara" - -msgid "Popup closing…" -msgstr "Popup stängs..." - -msgid "Search" -msgstr "Sök" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultat" -msgstr[1] "%(counter)s resultat" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s totalt" - -msgid "Save as new" -msgstr "Spara som ny" - -msgid "Save and add another" -msgstr "Spara och lägg till ny" - -msgid "Save and continue editing" -msgstr "Spara och fortsätt redigera" - -msgid "Save and view" -msgstr "Spara och visa" - -msgid "Close" -msgstr "Stäng" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Ändra markerade %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Lägg till %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Ta bort markerade %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Visa valda %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Tack för att du spenderade kvalitetstid med webbplatsen idag." - -msgid "Log in again" -msgstr "Logga in igen" - -msgid "Password change" -msgstr "Ändra lösenord" - -msgid "Your password was changed." -msgstr "Ditt lösenord har ändrats." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Vänligen ange ditt gamla lösenord, för säkerhets skull, och ange därefter " -"ditt nya lösenord två gånger så att vi kan kontrollera att du skrivit rätt." - -msgid "Change my password" -msgstr "Ändra mitt lösenord" - -msgid "Password reset" -msgstr "Nollställ lösenord" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Ditt lösenord har ändrats. Du kan nu logga in." - -msgid "Password reset confirmation" -msgstr "Bekräftelse av lösenordsnollställning" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Var god fyll i ditt nya lösenord två gånger så vi kan kontrollera att du " -"skrev det rätt." - -msgid "New password:" -msgstr "Nytt lösenord:" - -msgid "Confirm password:" -msgstr "Bekräfta lösenord:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Länken för lösenordsnollställning var felaktig, möjligen därför att den " -"redan använts. Var god skicka en ny nollställningsförfrågan." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Vi har via e-post skickat dig instruktioner för hur du ställer in ditt " -"lösenord, om ett konto finns med e-posten du angav. Du borde få " -"instruktionerna inom kort." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Om du inte fick ett e-postmeddelande; kontrollera att e-postadressen är " -"densamma som du registrerade dig med, och kolla i din skräppost." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Du får detta e-postmeddelande för att du har begärt återställning av ditt " -"lösenord av ditt konto på %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Var god gå till följande sida och välj ett nytt lösenord:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Tack för att du använder vår webbplats!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s-teamet" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Har du glömt ditt lösenord? Ange din e-postadress nedan, så skickar vi dig " -"instruktioner för hur du ställer in ett nytt." - -msgid "Email address:" -msgstr "E-postadress:" - -msgid "Reset my password" -msgstr "Nollställ mitt lösenord" - -msgid "Select all objects on this page for an action" -msgstr "Välj alla objekt på denna sida för en åtgärd" - -msgid "All dates" -msgstr "Alla datum" - -#, python-format -msgid "Select %s" -msgstr "Välj %s" - -#, python-format -msgid "Select %s to change" -msgstr "Välj %s att ändra" - -#, python-format -msgid "Select %s to view" -msgstr "Välj %s för visning" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Tid:" - -msgid "Lookup" -msgstr "Uppslag" - -msgid "Currently:" -msgstr "Nuvarande:" - -msgid "Change:" -msgstr "Ändra:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 47d3efe..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po deleted file mode 100644 index 28bd355..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,328 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Anders Hovmöller , 2023 -# Andreas Pelme , 2012,2024 -# Danijel Grujicic, 2023 -# Elias Johnstone , 2022 -# Jannis Leidel , 2011 -# Jörgen Olofsson, 2024 -# Jonathan Lindén, 2014 -# Mattias Hansson , 2016 -# Mattias Benjaminsson , 2011 -# Samuel Linde , 2011 -# Thomas Lundqvist, 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:59+0000\n" -"Last-Translator: Jörgen Olofsson, 2024\n" -"Language-Team: Swedish (http://app.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Tillgängliga %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Detta är listan med tillgängliga %s. Du kan välja ut vissa genom att markera " -"dem i rutan nedan och sedan klicka på \"Välj\"-knapparna mellan de två " -"rutorna." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Skriv i denna ruta för att filtrera listan av tillgängliga %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Välj alla" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klicka för att välja alla %s på en gång." - -msgid "Choose" -msgstr "Välj" - -msgid "Remove" -msgstr "Ta bort" - -#, javascript-format -msgid "Chosen %s" -msgstr "Välj %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Detta är listan med utvalda %s. Du kan ta bort vissa genom att markera dem i " -"rutan nedan och sedan klicka på \"Ta bort\"-pilen mellan de två rutorna." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Skriv i denna ruta för att filtrera listan av tillgängliga %s." - -msgid "Remove all" -msgstr "Ta bort alla" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klicka för att ta bort alla valda %s på en gång." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s valt alternativ inte synligt" -msgstr[1] "%s valda alternativ inte synliga" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s av %(cnt)s markerade" -msgstr[1] "%(sel)s av %(cnt)s markerade" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Du har ändringar som inte sparats i enskilda redigerbara fält. Om du kör en " -"operation kommer de ändringar som inte sparats att gå förlorade." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Du har markerat en operation, men du har inte sparat sparat dina ändringar " -"till enskilda fält ännu. Var vänlig klicka OK för att spara. Du kommer att " -"behöva köra operationen på nytt." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Du har markerat en operation och du har inte gjort några ändringar i " -"enskilda fält. Du letar antagligen efter Utför-knappen snarare än Spara." - -msgid "Now" -msgstr "Nu" - -msgid "Midnight" -msgstr "Midnatt" - -msgid "6 a.m." -msgstr "06:00" - -msgid "Noon" -msgstr "Middag" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Notera: Du är %s timme före serverns tid." -msgstr[1] "Notera: Du är %s timmar före serverns tid." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Notera: Du är %s timme efter serverns tid." -msgstr[1] "Notera: Du är %s timmar efter serverns tid." - -msgid "Choose a Time" -msgstr "Välj en tidpunkt" - -msgid "Choose a time" -msgstr "Välj en tidpunkt" - -msgid "Cancel" -msgstr "Avbryt" - -msgid "Today" -msgstr "I dag" - -msgid "Choose a Date" -msgstr "Välj ett datum" - -msgid "Yesterday" -msgstr "I går" - -msgid "Tomorrow" -msgstr "I morgon" - -msgid "January" -msgstr "januari" - -msgid "February" -msgstr "februari" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "augusti" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec" - -msgid "Sunday" -msgstr "Söndag" - -msgid "Monday" -msgstr "Måndag" - -msgid "Tuesday" -msgstr "Tisdag" - -msgid "Wednesday" -msgstr "Onsdag" - -msgid "Thursday" -msgstr "Torsdag" - -msgid "Friday" -msgstr "Fredag" - -msgid "Saturday" -msgstr "Lördag" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "sön" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "mån" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "tis" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "ons" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "tors" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "fre" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "lör" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "O" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index 9aa7f31..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index afbca8e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,779 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antony Owino , 2023 -# DOREEN WANYAMA, 2023 -# Machaku, 2013-2014 -# Machaku, 2016 -# Millicent Atieno Obwanda , 2023 -# Natalia (Django Fellow), 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-25 07:05+0000\n" -"Last-Translator: DOREEN WANYAMA, 2023\n" -"Language-Team: Swahili (http://app.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Futa %(verbose_name_plural)s teule" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Umefanikiwa kufuta %(items)s %(count)d." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Huwezi kufuta %(name)s" - -msgid "Are you sure?" -msgstr "Una uhakika?" - -msgid "Administration" -msgstr "Utawala" - -msgid "All" -msgstr "yote" - -msgid "Yes" -msgstr "Ndiyo" - -msgid "No" -msgstr "Hapana" - -msgid "Unknown" -msgstr "Haijulikani" - -msgid "Any date" -msgstr "Tarehe yoyote" - -msgid "Today" -msgstr "Leo" - -msgid "Past 7 days" -msgstr "Siku 7 zilizopita" - -msgid "This month" -msgstr "mwezi huu" - -msgid "This year" -msgstr "Mwaka huu" - -msgid "No date" -msgstr "Hakuna tarehe" - -msgid "Has date" -msgstr "Kuna tarehe" - -msgid "Empty" -msgstr "tupu" - -msgid "Not empty" -msgstr "si tupu" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Tafadhali ingiza %(username)s na nywila sahihi kwa akaunti ya msimamizi. " -"Kumbuka kuzingatia herufi kubwa na ndogo." - -msgid "Action:" -msgstr "Tendo" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Ongeza %(verbose_name)s" - -msgid "Remove" -msgstr "Ondoa" - -msgid "Addition" -msgstr "ongeza" - -msgid "Change" -msgstr "Badilisha" - -msgid "Deletion" -msgstr "Ufutaji" - -msgid "action time" -msgstr "muda wa tendo" - -msgid "user" -msgstr "mtumiaji" - -msgid "content type" -msgstr "aina ya maudhui" - -msgid "object id" -msgstr "Kitambulisho cha kitu" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "`repr` ya kitu" - -msgid "action flag" -msgstr "bendera ya tendo" - -msgid "change message" -msgstr "badilisha ujumbe" - -msgid "log entry" -msgstr "ingizo kwenye kumbukumbu" - -msgid "log entries" -msgstr "maingizo kwenye kumbukumbu" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” Imeongezwa" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Kubadilishwa kwa “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Kimefutwa “%(object)s”" - -msgid "LogEntry Object" -msgstr "Kitu cha Ingizo la Kumbukumbu" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Kumeongezwa {name} “{object}”." - -msgid "Added." -msgstr "Imeongezwa" - -msgid "and" -msgstr "na" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Mabadiliko ya {fields} yamefanyika kwenye {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Mabadiliko yamefanyika katika {fields} " - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr " {name} “{object}” umefutwa." - -msgid "No fields changed." -msgstr "Hakuna uga uliobadilishwa." - -msgid "None" -msgstr "Hakuna" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -" Shikilia 'Control', au 'Command' kwenye Mac, ili kuchagua zaidi ya moja." - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” imeongezwa kwa mafanikio." - -msgid "You may edit it again below." -msgstr "Unaweza kuihariri tena hapa chini" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” imeongezwa kwa mafanikio. Unaweza kuongeza {name} nyingine " -"hapa chini." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” ilibadilishwa kwa mafanikio. Unaweza kuihariri tena hapa " -"chini." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” imeongezwa kwa mafanikio. Unaweza kuihariri tena hapa chini." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj} imebadilishwa kwa mafanikio. Unaweza kuongeza {name} nyingine " -"hapa chini. " - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” imebadilishwa kwa mafanikio." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Nilazima kuchagua vitu ili kufanyia kitu fulani. Hakuna kitu " -"kilichochaguliwa." - -msgid "No action selected." -msgstr "Hakuna tendo lililochaguliwa" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s%(obj)s ilifutwa kwa mafanikio." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)sna ID %(key)s haipo. Labda ilifutwa?" - -#, python-format -msgid "Add %s" -msgstr "Ongeza %s" - -#, python-format -msgid "Change %s" -msgstr "Badilisha %s" - -#, python-format -msgid "View %s" -msgstr "Muonekano %s" - -msgid "Database error" -msgstr "Hitilafu katika hifadhidata" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "mabadiliko ya %(name)s %(count)s yamefanikiwa." -msgstr[1] "mabadiliko ya %(name)s %(count)s yamefanikiwa." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s kuchaguliwa" -msgstr[1] "%(total_count)s (kila kitu) kuchaguliwa" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Vilivyo chaguliwa ni 0 kati ya %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Badilisha historia: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(instance)s %(class_name)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Kufutwa kwa ingizo la %(instance)s %(class_name)s kutahitaji kufutwa kwa " -"vitu vifuatavyo vyenye mahusiano vilivyokingwa: %(related_objects)s" - -msgid "Django site admin" -msgstr "Utawala wa tovuti ya django" - -msgid "Django administration" -msgstr "Utawala wa Django" - -msgid "Site administration" -msgstr "Utawala wa tovuti" - -msgid "Log in" -msgstr "Ingia" - -#, python-format -msgid "%(app)s administration" -msgstr "Utawala wa %(app)s" - -msgid "Page not found" -msgstr "Ukurasa haujapatikana" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Samahani, ukurasa uliotafutwa haukupatikana." - -msgid "Home" -msgstr "Nyumbani" - -msgid "Server error" -msgstr "Hitilafu ya seva" - -msgid "Server error (500)" -msgstr "Hitilafu ya seva (500)" - -msgid "Server Error (500)" -msgstr "Hitilafu ya seva (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Kumekuwa na kosa. Waendeshaji wa tovuti wamearifiwa kupitia barua pepe, na " -"linapaswa kurekebishwa hivi karibuni. Asante kwa uvumilivu wako." - -msgid "Run the selected action" -msgstr "Fanya tendo lililochaguliwa." - -msgid "Go" -msgstr "Nenda" - -msgid "Click here to select the objects across all pages" -msgstr "Bofya hapa kuchagua viumbile katika kurasa zote" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Chagua kila %(module_name)s, (%(total_count)s). " - -msgid "Clear selection" -msgstr "Safisha chaguo" - -msgid "Breadcrumbs" -msgstr "Nyayo " - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Models katika application %(name)s" - -msgid "Add" -msgstr "Ongeza" - -msgid "View" -msgstr "Muonekano" - -msgid "You don’t have permission to view or edit anything." -msgstr "Huna ruhusa ya kutazama au kuhariri kitu chochote" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Kwanza, ingiza jina la mtumiaji na nywila. Kisha, utaweza kuhariri chaguo " -"zaidi za mtumiaji." - -msgid "Enter a username and password." -msgstr "Ingiza jina la mtumiaji na nywila." - -msgid "Change password" -msgstr "Badilisha nywila" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Tafadhali sahihisha kosa lifuatalo." -msgstr[1] "Tafadhali sahihisha makosa yafuatayo" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "ingiza nywila ya mtumiaji %(username)s." - -msgid "Skip to main content" -msgstr "Ruka hadi kwa maudhui makuu." - -msgid "Welcome," -msgstr "Karibu" - -msgid "View site" -msgstr "Tazama tovuti" - -msgid "Documentation" -msgstr "Nyaraka" - -msgid "Log out" -msgstr "Toka" - -#, python-format -msgid "Add %(name)s" -msgstr "Ongeza %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Ona kwenye tovuti" - -msgid "Filter" -msgstr "Chuja" - -msgid "Hide counts" -msgstr "Ficha idadi" - -msgid "Show counts" -msgstr "Onesha idadi" - -msgid "Clear all filters" -msgstr "Safisha vichungi vyote" - -msgid "Remove from sorting" -msgstr "Ondoa katika upangaji" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Kipaumbele katika mpangilio: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Geuza mpangilio" - -msgid "Toggle theme (current theme: auto)" -msgstr "Badilisha mandhari (mandhari ya sasa: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Badilisha mandhari (mandhari ya sasa: mwanga)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Badilisha mandhari (mandhari ya sasa: giza)" - -msgid "Delete" -msgstr "Futa" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Kufutwa kwa '%(escaped_object)s' %(object_name)s kutasababisha kufutwa kwa " -"vitu vinavyohuisana, lakini akaunti yako haina ruhusa ya kufuta vitu vya " -"aina zifuatazo:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Kufuta '%(escaped_object)s' %(object_name)s kutahitaji kufuta vitu " -"vifuatavyo ambavyo vinavyohuisana na vimelindwa:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Una uhakika kuwa unataka kufuta \"%(escaped_object)s\" %(object_name)s ? " -"Vitu vyote vinavyohuisana kati ya vifuatavyo vitafutwa:" - -msgid "Objects" -msgstr "Viumbile" - -msgid "Yes, I’m sure" -msgstr "Ndiyo, nina uhakika" - -msgid "No, take me back" -msgstr "Hapana, nirudishe" - -msgid "Delete multiple objects" -msgstr "Futa viumbile mbalimbali" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Kufutwa kwa %(objects_name)s chaguliwa kutasababisha kufutwa kwa " -"vituvinavyohusiana, lakini akaunti yako haina ruhusa ya kufuta vitu vya " -"vifuatavyo:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Kufutwa kwa %(objects_name)s kutahitaji kufutwa kwa vitu vifuatavyo vyenye " -"uhusiano na vilivyolindwa:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Una uhakika kuwa unataka kufuta %(objects_name)s chaguliwa ? Vitu vyote kati " -"ya vifuatavyo vinavyohusiana vitafutwa:" - -msgid "Delete?" -msgstr "Futa?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Kwa %(filter_title)s" - -msgid "Summary" -msgstr "Muhtasari" - -msgid "Recent actions" -msgstr "Matendo ya karibuni" - -msgid "My actions" -msgstr "Matendo yangu" - -msgid "None available" -msgstr "Hakuna kilichopatikana" - -msgid "Added:" -msgstr "Imeongezwa:" - -msgid "Changed:" -msgstr "Kimebadilika" - -msgid "Deleted:" -msgstr "Kimefutwa" - -msgid "Unknown content" -msgstr "Maudhui hayajulikani" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Kuna tatizo na ufungaji wa hifadhidata yako. Hakikisha meza sahihi za " -"hifadhidata zimeundwa, na hakikisha hifadhidata inaweza kusomwa na mtumiaji " -"sahihi." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Umejithibitisha kama %(username)s, lakini huna ruhusa ya kupata ukurasa huu. " -"Ungependa kuingia kwa akaunti nyingine?" - -msgid "Forgotten your password or username?" -msgstr "Umesahau jina na nenosiri lako?" - -msgid "Toggle navigation" -msgstr "Badilisha urambazaji" - -msgid "Sidebar" -msgstr "Upande wa Kando" - -msgid "Start typing to filter…" -msgstr "Anza kuchapa ili kuchuja…" - -msgid "Filter navigation items" -msgstr "Chuja vitu vya urambazaji" - -msgid "Date/time" -msgstr "Tarehe/saa" - -msgid "User" -msgstr "Mtumiaji" - -msgid "Action" -msgstr "Tendo" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "ingizo" -msgstr[1] "maingizo" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Hakuna historia ya mabadiliko kwa kipande hiki. Labda hakikuongezwa kupitia " -"tovuti hii ya usimamizi." - -msgid "Show all" -msgstr "Onesha yotee" - -msgid "Save" -msgstr "Hifadhi" - -msgid "Popup closing…" -msgstr "Udukizi inafungwa..." - -msgid "Search" -msgstr "Tafuta" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "tokeo %(counter)s" -msgstr[1] "matokeo %(counter)s" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "jumla %(full_result_count)s" - -msgid "Save as new" -msgstr "Hifadhi kama mpya" - -msgid "Save and add another" -msgstr "Hifadhi na ongeza" - -msgid "Save and continue editing" -msgstr "Hifadhi na endelea kuhariri" - -msgid "Save and view" -msgstr "Hifadhi kisha tazama" - -msgid "Close" -msgstr "Funga" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Badili %(model)s husika" - -#, python-format -msgid "Add another %(model)s" -msgstr "Ongeza %(model)s tena" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Futa %(model)s husika" - -#, python-format -msgid "View selected %(model)s" -msgstr "Tazama %(model)s zilizochaguliwa" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Asante kwa kutumia muda wako kenye tovuti leo." - -msgid "Log in again" -msgstr "ingia tena" - -msgid "Password change" -msgstr "Badilisha nywila" - -msgid "Your password was changed." -msgstr "Nywila yako imebadilishwa" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Tafadhali ingiza nywila yako ya zamani, kwa usalama, na kisha ingiza nywila " -"yako mpya mara mbili ili tuweze kuthibitisha kuwa umeingiza kwa usahihi" - -msgid "Change my password" -msgstr "Badilisha nywila yangu" - -msgid "Password reset" -msgstr "Kuseti nywila upya" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Nywila yako imesetiwa. Unaweza kuendelea na kuingia sasa." - -msgid "Password reset confirmation" -msgstr "Uthibitisho wa kuseti nywila upya" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Tafadhali ingiza nywila mpya mara mbili ili tuweze kuthibitisha kuwa " -"umelichapisha kwa usahihi." - -msgid "New password:" -msgstr "Nywila mpya:" - -msgid "Confirm password:" -msgstr "Thibitisha nywila" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Kiungo cha kuseti nywila upya ni batili, inawezekana ni kwa sababu kiungo " -"hicho tayari kimetumika. tafadhali omba upya kuseti nywila." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Tumekutumia barua pepe na maelekezo ya kuweka nywila yako, endapo akaunti " -"inayolingana na barua pepe uliyoingiza ipo. Unapaswa kuzipokea hivi karibuni." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ikiwa hautapokea barua pepe, tafadhali hakikisha umeweka anwani " -"uliyojiandikisha nayo, na angalia folda yako ya barua taka" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Umepata barua pepe hii kwa sababu ulihitaji ku seti upya nywila ya akaunti " -"yako ya %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Tafadhali nenda ukurasa ufuatao na uchague nywila mpya:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Jina lako la utumiaji, ikiwa umesahau:" - -msgid "Thanks for using our site!" -msgstr "Ahsante kwa kutumia tovui yetu!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "timu ya %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Umensahau nywila yako? Ingiza anwani yako ya barua pepe hapa chini, na " -"tutakutumia barua pepe na maelekezo ya kuweka mpya." - -msgid "Email address:" -msgstr "Anuani ya barua pepe:" - -msgid "Reset my password" -msgstr "Seti nywila yangu upya" - -msgid "Select all objects on this page for an action" -msgstr "Chagua vitu vyote kwenye ukurasa huu kwa hatua." - -msgid "All dates" -msgstr "Tarehe zote" - -#, python-format -msgid "Select %s" -msgstr "Chagua %s" - -#, python-format -msgid "Select %s to change" -msgstr "Chaguo %s kwa mabadilisho" - -#, python-format -msgid "Select %s to view" -msgstr "Chagua %s kuona" - -msgid "Date:" -msgstr "Tarehe" - -msgid "Time:" -msgstr "Saa" - -msgid "Lookup" -msgstr "`Lookup`" - -msgid "Currently:" -msgstr "Kwa sasa:" - -msgid "Change:" -msgstr "Badilisha:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 12f1466..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5806dd9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,217 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Machaku , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Yaliyomo: %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Hii ni orodha ya %s uliyochagua. Unaweza kuchagua baadhi vitu kwa kuvichagua " -"katika kisanduku hapo chini kisha kubofya mshale wa \"Chagua\" kati ya " -"visanduku viwili." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Chapisha katika kisanduku hiki ili kuchuja orodha ya %s iliyopo." - -msgid "Filter" -msgstr "Chuja" - -msgid "Choose all" -msgstr "Chagua vyote" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Bofya kuchagua %s kwa pamoja." - -msgid "Choose" -msgstr "Chagua" - -msgid "Remove" -msgstr "Ondoa" - -#, javascript-format -msgid "Chosen %s" -msgstr "Chaguo la %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Hii ni orodha ya %s uliyochagua. Unaweza kuondoa baadhi vitu kwa kuvichagua " -"katika kisanduku hapo chini kisha kubofya mshale wa \"Ondoa\" kati ya " -"visanduku viwili." - -msgid "Remove all" -msgstr "Ondoa vyote" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Bofya ili kuondoa %s chaguliwa kwa pamoja." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "umechagua %(sel)s kati ya %(cnt)s" -msgstr[1] "umechagua %(sel)s kati ya %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Umeacha kuhifadhi mabadiliko katika uga zinazoharirika. Ikiwa utafanya tendo " -"lingine, mabadiliko ambayo hayajahifadhiwa yatapotea." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Umechagua tendo, lakini bado hujahifadhi mabadiliko yako katika uga husika. " -"Tafadali bofya Sawa ukitaka kuhifadhi. Utahitajika kufanya upya kitendo " - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Umechagua tendo, lakini bado hujahifadhi mabadiliko yako katika uga husika. " -"Inawezekana unatafuta kitufe cha Nenda badala ya Hifadhi" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Kumbuka: Uko saa %s mbele ukilinganisha na majira ya seva" -msgstr[1] "Kumbuka: Uko masaa %s mbele ukilinganisha na majira ya seva" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Kumbuka: Uko saa %s nyuma ukilinganisha na majira ya seva" -msgstr[1] "Kumbuka: Uko masaa %s nyuma ukilinganisha na majira ya seva" - -msgid "Now" -msgstr "Sasa" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Chagua wakati" - -msgid "Midnight" -msgstr "Usiku wa manane" - -msgid "6 a.m." -msgstr "Saa 12 alfajiri" - -msgid "Noon" -msgstr "Adhuhuri" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Ghairi" - -msgid "Today" -msgstr "Leo" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Jana" - -msgid "Tomorrow" -msgstr "Kesho" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Onesha" - -msgid "Hide" -msgstr "Ficha" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index 398f1f2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index 3a3cf1b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,643 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "உறுதியாக சொல்கிறீர்களா?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "அனைத்தும்" - -msgid "Yes" -msgstr "ஆம்" - -msgid "No" -msgstr "இல்லை" - -msgid "Unknown" -msgstr "தெரியாத" - -msgid "Any date" -msgstr "எந்த தேதியும்" - -msgid "Today" -msgstr "இன்று" - -msgid "Past 7 days" -msgstr "கடந்த 7 நாட்களில்" - -msgid "This month" -msgstr "இந்த மாதம்" - -msgid "This year" -msgstr "இந்த வருடம்" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "அழிக்க" - -msgid "action time" -msgstr "செயல் நேரம்" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "பொருள் அடையாளம்" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "பொருள் உருவகித்தம்" - -msgid "action flag" -msgstr "செயர்குறி" - -msgid "change message" -msgstr "செய்தியை மாற்று" - -msgid "log entry" -msgstr "புகுபதிவு உள்ளீடு" - -msgid "log entries" -msgstr "புகுபதிவு உள்ளீடுகள்" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "மற்றும்" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "எந்த புலமும் மாறவில்லை." - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாக அழிக்கப்பட்டுள்ளது." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s யை சேர்க்க" - -#, python-format -msgid "Change %s" -msgstr "%s யை மாற்று" - -msgid "Database error" -msgstr "தகவல்சேமிப்பு பிழை" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "வரலாற்றை மாற்று: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "டிஜாங்ஙோ தள நிர்வாகி" - -msgid "Django administration" -msgstr "டிஜாங்ஙோ நிர்வாகம் " - -msgid "Site administration" -msgstr "இணைய மேலான்மை" - -msgid "Log in" -msgstr "உள்ளே போ" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "பக்கத்தைக் காணவில்லை" - -msgid "We're sorry, but the requested page could not be found." -msgstr "நீங்கள் விரும்பிய பக்கத்தை காண இயலவில்லை,அதற்காக நாங்கள் வருந்துகிறோம்." - -msgid "Home" -msgstr "வீடு" - -msgid "Server error" -msgstr "சேவகன் பிழை" - -msgid "Server error (500)" -msgstr "சேவையகம் தவறு(500)" - -msgid "Server Error (500)" -msgstr "சேவையகம் பிழை(500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "செல்" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"முதலில்,பயனர்ப்பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்.அதன் பிறகு தான் நீங்கள் உங்கள் பெயரின் " -"விவரங்களை திருத்த முடியும்" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "கடவுச்சொல்லை மாற்று" - -msgid "Please correct the error below." -msgstr "கீழே உள்ள தவறுகளைத் திருத்துக" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "நல்வரவு," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "ஆவனமாக்கம்" - -msgid "Log out" -msgstr "வெளியேறு" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s சேர்க்க" - -msgid "History" -msgstr "வரலாறு" - -msgid "View on site" -msgstr "தளத்தில் பார்" - -msgid "Filter" -msgstr "வடிகட்டி" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "நீக்குக" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"நீக்கும் '%(escaped_object)s' ஆனது %(object_name)s தொடர்புடைய மற்றவற்றையும் நீக்கும். " -"ஆனால் அதை நீக்குவதற்குரிய உரிமை உங்களுக்கு இல்லை" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"நீங்கள் இந்த \"%(escaped_object)s\" %(object_name)s நீக்குவதில் நிச்சயமா?தொடர்புடைய " -"மற்றவையும் நீக்கப்படும். " - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "ஆம், எனக்கு உறுதி" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "மாற்றுக" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s ஆல்" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "சேர்க்க" - -msgid "You don't have permission to edit anything." -msgstr "உங்களுக்கு மாற்றுவதற்குரிய உரிமையில்லை" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "எதுவும் கிடைக்கவில்லை" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"உங்களுடைய தகவல்சேமிப்பகத்தை நிறுவுவதில் சில தவறுகள் உள்ளது. அதற்கு இணையான " -"தகவல்சேமிப்பு அட்டவணையைதயாரிக்கவும். மேலும் பயனர் படிக்கும் படியான தகவல்சேமிப்பகத்தை " -"உருவாக்கவும்." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "தேதி/நேரம் " - -msgid "User" -msgstr "பயனர்" - -msgid "Action" -msgstr "செயல்" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"இந்த பொருள் மாற்று வரலாற்றில் இல்லைஒரு வேளை நிர்வாகத்தளத்தின் மூலம் சேர்க்கப்படாமலிருக்கலாம்" - -msgid "Show all" -msgstr "எல்லாவற்றையும் காட்டு" - -msgid "Save" -msgstr "சேமிக்க" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s மொத்தம்" - -msgid "Save as new" -msgstr "புதியதாக சேமி" - -msgid "Save and add another" -msgstr "சேமித்து இன்னுமொன்றைச் சேர்" - -msgid "Save and continue editing" -msgstr "சேமித்து மாற்றத்தை தொடருக" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "வலைத்தளத்தில் உங்களது பொன்னான நேரத்தை செலவழித்தமைக்கு மிகுந்த நன்றி" - -msgid "Log in again" -msgstr "மீண்டும் உள்ளே பதிவு செய்யவும்" - -msgid "Password change" -msgstr "கடவுச்சொல் மாற்று" - -msgid "Your password was changed." -msgstr "உங்களுடைய கடவுச்சொல் மாற்றபட்டது" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"பாதுகாப்பு காரணங்களுக்காக , முதலில் உங்களது பழைய கடவுச்சொல்லை உள்ளிடுக. அதன் பிறகு " -"புதிய கடவுச்சொல்லை இரு முறை உள்ளிடுக. இது உங்களது உள்ளிடுதலை சரிபார்க்க உதவும். " - -msgid "Change my password" -msgstr "கடவுச் சொல்லை மாற்றவும்" - -msgid "Password reset" -msgstr "கடவுச்சொல்லை மாற்றியமை" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "புதிய கடவுச்சொல்:" - -msgid "Confirm password:" -msgstr "கடவுச்சொலின் மாற்றத்தை உறுதிப்படுத்து:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "உங்களது பயனாளர் பெயர், நீங்கள் மறந்திருந்தால்:" - -msgid "Thanks for using our site!" -msgstr "எங்களது வலைத்தளத்தை பயன் படுத்தியதற்கு மிகுந்த நன்றி" - -#, python-format -msgid "The %(site_name)s team" -msgstr "இந்த %(site_name)s -இன் குழு" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "எனது கடவுச்சொல்லை மாற்றியமை" - -msgid "All dates" -msgstr "அனைத்து தேதியும்" - -#, python-format -msgid "Select %s" -msgstr "%s யை தேர்ந்தெடு" - -#, python-format -msgid "Select %s to change" -msgstr "%s யை மாற்ற தேர்ந்தெடு" - -msgid "Date:" -msgstr "தேதி:" - -msgid "Time:" -msgstr "நேரம்:" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 3393111..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po deleted file mode 100644 index 0a7bfcc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,204 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s இருக்கிறதா " - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "வடிகட்டி" - -msgid "Choose all" -msgstr "எல்லாவற்றையும் தேர்ந்த்தெடுக்க" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "அழிக்க" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s தேர்ந்த்தெடுக்கப்பட்ட" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "இப்பொழுது " - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ஒரு நேரத்தை தேர்ந்த்தெடுக்க " - -msgid "Midnight" -msgstr "நடு இரவு " - -msgid "6 a.m." -msgstr "காலை 6 மணி " - -msgid "Noon" -msgstr "மதியம் " - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "வேண்டாம் " - -msgid "Today" -msgstr "இன்று " - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "நேற்று " - -msgid "Tomorrow" -msgstr "நாளை" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index 17e7dc6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index f624d4f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,640 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# bhaskar teja yerneni , 2011 -# Jannis Leidel , 2011 -# ప్రవీణ్ ఇళ్ళ , 2011,2013 -# వీవెన్ , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s జయప్రదముగా తీసేవేయబడినది." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s తొలగించుట వీలుకాదు" - -msgid "Are you sure?" -msgstr "మీరు ఖచ్చితంగా ఇలా చేయాలనుకుంటున్నారా?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "ఎంచుకోన్న %(verbose_name_plural)s తీసివేయుము " - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "అన్నీ" - -msgid "Yes" -msgstr "అవును" - -msgid "No" -msgstr "కాదు" - -msgid "Unknown" -msgstr "తెలియనది" - -msgid "Any date" -msgstr "ఏ రోజైన" - -msgid "Today" -msgstr "ఈ రోజు" - -msgid "Past 7 days" -msgstr "గత 7 రోజుల గా" - -msgid "This month" -msgstr "ఈ నెల" - -msgid "This year" -msgstr "ఈ సంవత్సరం" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "చర్య:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "తొలగించు" - -msgid "action time" -msgstr "పని సమయము " - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "వస్తువు" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "వస్తువు" - -msgid "action flag" -msgstr "పని ఫ్లాగ్" - -msgid "change message" -msgstr "సందేశము ని మార్చంది" - -msgid "log entry" -msgstr "లాగ్ ఎంట్రీ" - -msgid "log entries" -msgstr "లాగ్ ఎంట్రీలు" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "మరియు" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "క్షేత్రములు ఏమి మార్చబడలేదు" - -msgid "None" -msgstr "వొకటీ లేదు" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"అంశములపయి తదుపరి చర్య తీసుకోనటకు వాటిని ఎంపిక చేసుకోవలెను. ప్రస్తుతం ఎటువంటి అంశములు " -"మార్చబడలేదు." - -msgid "No action selected." -msgstr "మీరు ఎటువంటి చర్య తీసుకొనలేదు " - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" జయప్రదంగా తీసివేయబడ్డడి" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%sని జత చేయండి " - -#, python-format -msgid "Change %s" -msgstr "%sని మార్చుము" - -msgid "Database error" -msgstr "దత్తాంశస్థానము పొరబాటు " - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s జయప్రదముగా మార్చబడినవి." -msgstr[1] "%(count)s %(name)s జయప్రదముగా మార్చబడినవి." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s ఎంపికయినది." -msgstr[1] "అన్ని %(total_count)s ఎంపికయినవి." - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 of %(cnt)s ఎంపికయినవి." - -#, python-format -msgid "Change history: %s" -msgstr "చరిత్రం మార్చు: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "జాంగొ యొక్క నిర్వాహణదారులు" - -msgid "Django administration" -msgstr "జాంగొ నిర్వాహణ" - -msgid "Site administration" -msgstr "సైట్ నిర్వాహణ" - -msgid "Log in" -msgstr "ప్రవేశించండి" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "పుట దొరకలేదు" - -msgid "We're sorry, but the requested page could not be found." -msgstr "క్షమించండి మీరు కోరిన పుట దొరకలేడు" - -msgid "Home" -msgstr "నివాసము" - -msgid "Server error" -msgstr "సర్వర్ పొరబాటు" - -msgid "Server error (500)" -msgstr "సర్వర్ పొరబాటు (500)" - -msgid "Server Error (500)" -msgstr "సర్వర్ పొరబాటు (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "ఎంచుకున్న చర్యను నడుపు" - -msgid "Go" -msgstr "వెళ్లు" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "ఎంపికను తుడిచివేయి" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "ఒక వాడుకరిపేరు మరియు సంకేతపదాన్ని ప్రవేశపెట్టండి." - -msgid "Change password" -msgstr "సంకేతపదాన్ని మార్చుకోండి" - -msgid "Please correct the error below." -msgstr "క్రింద ఉన్న తప్పులు సరిదిద్దుకోండి" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "సుస్వాగతం" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "పత్రీకరణ" - -msgid "Log out" -msgstr "నిష్క్రమించండి" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s జత చేయు" - -msgid "History" -msgstr "చరిత్ర" - -msgid "View on site" -msgstr "సైట్ లో చూడండి" - -msgid "Filter" -msgstr "వడపోత" - -msgid "Remove from sorting" -msgstr "క్రమీకరణ నుండి తొలగించు" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "తొలగించు" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "అవును " - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "మార్చు" - -msgid "Delete?" -msgstr "తొలగించాలా?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "చేర్చు" - -msgid "You don't have permission to edit anything." -msgstr "మీకు ఏది మార్చటానికి అధికారము లేదు" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "ఏమి దొరకలేదు" - -msgid "Unknown content" -msgstr "తెలియని విషయం" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "మీ సంకేతపదం లేదా వాడుకరిపేరును మర్చిపోయారా?" - -msgid "Date/time" -msgstr "తేదీ/సమయం" - -msgid "User" -msgstr "వాడుకరి" - -msgid "Action" -msgstr "చర్య" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "అన్నీ చూపించు" - -msgid "Save" -msgstr "భద్రపరుచు" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "వెతుకు" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s ఫలితం" -msgstr[1] "%(counter)s ఫలితాలు" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s మొత్తము" - -msgid "Save as new" -msgstr "కొత్త దాని లా దాచు" - -msgid "Save and add another" -msgstr "దాచి కొత్త దానిని కలపండి" - -msgid "Save and continue editing" -msgstr "దాచి మార్చుటా ఉందండి" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "మళ్ళీ ప్రవేశించండి" - -msgid "Password change" -msgstr "అనుమతి పదం మార్పు" - -msgid "Your password was changed." -msgstr "మీ అనుమతి పదం మార్చబడిండి" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"దయచేసి రక్షన కోసము, మీ పాత అనుమతి పదం ఇవ్వండి , కొత్త అనుమతి పదం రెండు సార్లు ఇవ్వండి , " -"ఎం దుకంటే మీరు తప్పు ఇస్తే సరిచేయటానికి " - -msgid "Change my password" -msgstr "నా సంకేతపదాన్ని మార్చు" - -msgid "Password reset" -msgstr "అనుమతి పదం తిరిగి అమర్చు" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "మీ అనుమతి పదం మర్చుబడినది. మీరు ఇప్పుదు లాగ్ ఇన్ అవ్వచ్చు." - -msgid "Password reset confirmation" -msgstr "అనుమతి పదం తిరిగి మార్చు ఖాయం చెయండి" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"దయచేసి రక్షన కోసము, మీ పాత అనుమతి పదం ఇవ్వండి , కొత్త అనుమతి పదం రెండు సార్లు ఇవ్వండి , " -"ఎం దుకంటే మీరు తప్పు ఇస్తే సరిచేయటానికి " - -msgid "New password:" -msgstr "కొత్త సంకేతపదం:" - -msgid "Confirm password:" -msgstr "సంకేతపదాన్ని నిర్ధారించండి:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "మీ వాడుకరిపేరు, ఒక వేళ మీరు మర్చిపోయివుంటే:" - -msgid "Thanks for using our site!" -msgstr "మా సైటుని ఉపయోగిస్తున్నందుకు ధన్యవాదములు!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s జట్టు" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "ఈమెయిలు చిరునామా:" - -msgid "Reset my password" -msgstr "అనుమతిపదం తిరిగి అమర్చు" - -msgid "All dates" -msgstr "అన్నీ తేదీలు" - -#, python-format -msgid "Select %s" -msgstr "%s ని ఎన్నుకోండి" - -#, python-format -msgid "Select %s to change" -msgstr "%s ని మార్చటానికి ఎన్నుకోండి" - -msgid "Date:" -msgstr "తారీఖు:" - -msgid "Time:" -msgstr "సమయం:" - -msgid "Lookup" -msgstr "అంశ శోధన." - -msgid "Currently:" -msgstr "ప్రస్తుతం" - -msgid "Change:" -msgstr "మార్చు:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 92b65f1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po deleted file mode 100644 index cfa35a1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,205 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# bhaskar teja yerneni , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "ఆందుబాతులోఉన్న %s " - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "వడపోత" - -msgid "Choose all" -msgstr "అన్నీ ఎన్నుకోండి" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "తీసివేయండి" - -#, javascript-format -msgid "Chosen %s" -msgstr "ఎన్నుకున్న %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "ఇప్పుడు" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ఒక సమయము ఎన్నుకోండి" - -msgid "Midnight" -msgstr "ఆర్ధరాత్రి" - -msgid "6 a.m." -msgstr "6 a.m" - -msgid "Noon" -msgstr "మధ్యాహ్నము" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "రద్దు చేయు" - -msgid "Today" -msgstr "ఈనాడు" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "నిన్న" - -msgid "Tomorrow" -msgstr "రేపు" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "చూపించుము" - -msgid "Hide" -msgstr "దాచు" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index 34085cb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index dee2872..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,699 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2020 -# Surush Sufiew , 2020 -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-14 19:53+0200\n" -"PO-Revision-Date: 2020-07-30 18:53+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Муваффақона нест сохтед %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Нест карда нашуд %(name)s" - -msgid "Are you sure?" -msgstr "Шумо рози ҳастед ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Нест сохтани интихобшудаҳо %(verbose_name_plural)s" - -msgid "Administration" -msgstr "Маъмурият" - -msgid "All" -msgstr "Ҳама" - -msgid "Yes" -msgstr "Ҳа" - -msgid "No" -msgstr "Не" - -msgid "Unknown" -msgstr "Номуайян" - -msgid "Any date" -msgstr "Санаи бефарқ" - -msgid "Today" -msgstr "Имрӯз" - -msgid "Past 7 days" -msgstr "7 рӯзи охир" - -msgid "This month" -msgstr "Моҳи ҷорӣ" - -msgid "This year" -msgstr "Соли ҷорӣ" - -msgid "No date" -msgstr "Сана ишора нашудааст" - -msgid "Has date" -msgstr "Сана ишора шудааст" - -msgid "Empty" -msgstr "Холӣ" - -msgid "Not empty" -msgstr "Холӣ нест" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Хоҳиш менамоем %(username)s ва рамзро дуруст ворид созед. Ҳарду майдон " -"метавонанд духура бошанд." - -msgid "Action:" -msgstr "Амал:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Боз якто %(verbose_name)s илова кардан" - -msgid "Remove" -msgstr "Нест кардан" - -msgid "Addition" -msgstr "Иловакунӣ" - -msgid "Change" -msgstr "Тағйир додан" - -msgid "Deletion" -msgstr "Несткунӣ" - -msgid "action time" -msgstr "вақти амал" - -msgid "user" -msgstr "истифодабаранда" - -msgid "content type" -msgstr "намуди контент" - -msgid "object id" -msgstr "идентификатори объект" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "намоиши объект" - -msgid "action flag" -msgstr "намуди амал" - -msgid "change message" -msgstr "хабар оиди тағйирот" - -msgid "log entry" -msgstr "қайд дар дафтар" - -msgid "log entries" -msgstr "қайдҳо дар дафтар" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Илова шуд \"%(object)s\"" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "Қайд дар дафтар" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "Илова шуд." - -msgid "and" -msgstr "ва" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Тағйир ёфт {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "Ягон майдон тағйир наёфт." - -msgid "None" -msgstr "Не" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "Шумо метавонед ин объектро дар поён аз нав тағйир диҳед." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Барои иҷрои амал лозим аст, ки объектро интихоб намоед. Тағйирот барои " -"объектҳо ворид нашуданд " - -msgid "No action selected." -msgstr "Ҳеҷ амал инихоб нашудааст." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Илова кардан %s" - -#, python-format -msgid "Change %s" -msgstr "Тағйир додан %s" - -#, python-format -msgid "View %s" -msgstr "Азназаргузаронӣ %s" - -msgid "Database error" -msgstr "Мушкилӣ дар базаи додаҳо" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Интихоб карда шуд 0 аз %(cnt)s " - -#, python-format -msgid "Change history: %s" -msgstr "Таърихи вориди тағйирот: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Несткунии объекти %(instance)s намуди %(class_name)s талаб мекунад, ки " -"объектҳои алоқамандшудаизерин низ нест карда шаванд: %(related_objects)s" - -msgid "Django site admin" -msgstr "Сомонаи маъмурии Django" - -msgid "Django administration" -msgstr "Маъмурияти Django" - -msgid "Site administration" -msgstr "Маъмурияти сомона" - -msgid "Log in" -msgstr "Ворид шудан" - -#, python-format -msgid "%(app)s administration" -msgstr "Маъмурияти барномаи «%(app)s»" - -msgid "Page not found" -msgstr "Саҳифа ёфт нашуд" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "Асосӣ" - -msgid "Server error" -msgstr "Мушкилӣ дар сервер" - -msgid "Server error (500)" -msgstr "Мушкилӣ дар сервер (500)" - -msgid "Server Error (500)" -msgstr "Мушкилӣ дар сервер (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Иҷрои амалҳои ихтихобшуда" - -msgid "Go" -msgstr "Иҷро кардан" - -msgid "Click here to select the objects across all pages" -msgstr "Барои интихоби объектҳо дар ҳамаи саҳифаҳо, инҷоро пахш намоед" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Интихоби ҳамаи %(module_name)s (%(total_count)s)" - -msgid "Clear selection" -msgstr "Бекоркунии интихоб" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Моелҳои барномаи %(name)s" - -msgid "Add" -msgstr "Илова кардан" - -msgid "View" -msgstr "Азназаргузаронӣ" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Ном ва рамзро ворид созед." - -msgid "Change password" -msgstr "Тағйир додани рамз" - -msgid "Please correct the error below." -msgstr "Хоҳишмандем, хатогии зеринро ислоҳ кунед." - -msgid "Please correct the errors below." -msgstr "Хоҳишмандем, хатогиҳои зеринро ислоҳ кунед." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Рамзи навро ворид созед %(username)s." - -msgid "Welcome," -msgstr "Марҳамат," - -msgid "View site" -msgstr "Гузариш ба сомона" - -msgid "Documentation" -msgstr "Ҳуҷҷатнигорӣ" - -msgid "Log out" -msgstr "Баромад" - -#, python-format -msgid "Add %(name)s" -msgstr "Дохил кардани %(name)s" - -msgid "History" -msgstr "Таърих" - -msgid "View on site" -msgstr "Дар сомона дидан" - -msgid "Filter" -msgstr "Поло(Filter)" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "Аз қайди навъҳо баровардан" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Бартарии навъҳо: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Навъҷудокунӣ дар дигар раванд" - -msgid "Delete" -msgstr "Нест кардан" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Нест кардани %(object_name)s '%(escaped_object)s' ба нестсозии объектҳои ба " -"он алоқаманд оварда мерасонад, аммо'ҳисоби корбарӣ'-и (аккаунт) шумо иҷозати " -"нестсозии объектҳои зеринро надорад:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Нестсозии %(object_name)s '%(escaped_object)s' талаб менамояд, ки " -"объектҳоиалоқаманди муҳофизатии зерин нест карда шаванд:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Шумо боварӣ доред, ки ин элементҳо нест карда шаванд: %(object_name)s " -"\"%(escaped_object)s\"? Ҳамаи объектҳои алоқаманди зерин низ нест карда " -"мешаванд:" - -msgid "Objects" -msgstr "Объектҳо" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "Не, баргаштан" - -msgid "Delete multiple objects" -msgstr "Нестсозии якчанд объектҳо" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Нест кардани %(objects_name)s ба нестсозии объектҳои ба он алоқаманд оварда " -"мерасонад, аммо'ҳисоби корбарӣ'-и (аккаунт) шумо иҷозати нестсозии объектҳои " -"зеринро надорад:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Нестсозии %(objects_name)s талаб менамояд, ки объектҳоиалоқаманди " -"муҳофизатии зерин нест карда шаванд:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Шумо боварӣ доред, ки ин элементҳо нест карда шаванд: %(objects_name)s? " -"Ҳамаи объектҳои алоқаманди зерин низ нест карда мешаванд:" - -msgid "Delete?" -msgstr "Нест кардан?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s" - -msgid "Summary" -msgstr "Мухтасар" - -msgid "Recent actions" -msgstr "Амалҳои охирин" - -msgid "My actions" -msgstr "Амалҳои ман" - -msgid "None available" -msgstr "Дастнорас" - -msgid "Unknown content" -msgstr "Шакли номуайян" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Шумо ба система ҳамчун %(username)s, ворид шудед, вале салоҳияти шумобарои " -"азназаргузарониисаҳифаи мазкур нокифоя аст. Шояд шумо мехоҳед бо истифода аз " -"дигар 'ҳисоби корбарӣ' вориди система шавед." - -msgid "Forgotten your password or username?" -msgstr "Рамз ё номро фаромӯш кардед?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Date/time" -msgstr "Сана ва вақт" - -msgid "User" -msgstr "Истифодабар" - -msgid "Action" -msgstr "Амал" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Ҳамаро нишон додан" - -msgid "Save" -msgstr "Ҳифз кардан" - -msgid "Popup closing…" -msgstr "Равзанаи иловагӣ пӯшида мешавад..." - -msgid "Search" -msgstr "Ёфтан" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s ҳамаги" - -msgid "Save as new" -msgstr "Ҳамчун объекти нав ҳифз кардан" - -msgid "Save and add another" -msgstr "Ҳифз кардан ва объекти дигар илова кардан" - -msgid "Save and continue editing" -msgstr "Ҳифз кардан ва танзимотро давом додан" - -msgid "Save and view" -msgstr "Ҳифз кардан ва аз назар гузаронидан" - -msgid "Close" -msgstr "Пӯшидан" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Объекти интихобшударо тағйир додан: \"%(model)s\"" - -#, python-format -msgid "Add another %(model)s" -msgstr "Воридсозии боз як объекти \"%(model)s\"" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Объекти зерини интихобшударо нест кардан \"%(model)s\"" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Барои вақти дар ин сомона сарф кардаатон миннатдорем." - -msgid "Log in again" -msgstr "Аз нав ворид шудан" - -msgid "Password change" -msgstr "Тағйири рамз" - -msgid "Your password was changed." -msgstr "Рамзи шумо тағйир дода шуд." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "Тағйири рамзи ман" - -msgid "Password reset" -msgstr "Барқароркунии рамз" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Рамзи шумо ҳифз шуд. Акнун шумо метавонед ворид шавед." - -msgid "Password reset confirmation" -msgstr "Барқароркунии рамз тасдиқ карда шуд." - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Хоҳиш мекунем рамзи нави худро ду маротиба(бояд ҳарду мувофиқат кунанд) " -"дохил кунед." - -msgid "New password:" -msgstr "Рамзи нав:" - -msgid "Confirm password:" -msgstr "Рамзи тасдиқӣ:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Суроға барои барқароркунии рамз нодуруст аст. Эҳтимол алакай як маротиба " -"истифода шудааст.Амали барқароркунии рамзро такрор намоед." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Шумо ин матубро гирифтед барои он, ки аз сомонаи %(site_name)s, ки бо ин " -"почтаи электронӣ алоқаманд аст,ба мо дархост барои барқароркунии рамз қабул " -"шуд." - -msgid "Please go to the following page and choose a new password:" -msgstr "Хоҳишмандем ба ин саҳифа гузаред ва рамзи навро ворид созед:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Барои аз сомонаи мо истифода карданатон сипосгузорем!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Гурӯҳи ташкили %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "Суроғаи почтаи электронӣ:" - -msgid "Reset my password" -msgstr "Барқароркунии рамзи ман" - -msgid "All dates" -msgstr "Ҳама санаҳо" - -#, python-format -msgid "Select %s" -msgstr "Интихоб кунед %s" - -#, python-format -msgid "Select %s to change" -msgstr "Интихоби %s барои тағйирот ворид сохтан " - -#, python-format -msgid "Select %s to view" -msgstr "Интихоби %s барои азназаргузаронӣ" - -msgid "Date:" -msgstr "Сана:" - -msgid "Time:" -msgstr "Вақт:" - -msgid "Lookup" -msgstr "Ҷустуҷӯ" - -msgid "Currently:" -msgstr "Ҷорӣ:" - -msgid "Change:" -msgstr "Тағйир додан:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 2c06551..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po deleted file mode 100644 index b5f4fdb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,222 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Surush Sufiew , 2020 -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-15 01:22+0000\n" -"Last-Translator: Surush Sufiew \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Дастрас %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ин руйхати %s - ҳои дастрас. Шумо метавонед якчандто аз инҳоро дар " -"майдонипоён бо пахши тугмаи \\'Интихоб кардан'\\ интихоб намоед." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Барои баровардани рӯйхати %s. -ҳои дастрас, ба воридсозии матни лозима шурӯъ " -"кунед" - -msgid "Filter" -msgstr "Поло" - -msgid "Choose all" -msgstr "Интихоби кулл" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Барои якбора интихоб намудани кулли %s инҷоро пахш намоед." - -msgid "Choose" -msgstr "интихоб кардан" - -msgid "Remove" -msgstr "Нест кардан" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s -ҳои интихобшуда" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ин руйхати %s - ҳои интихобшуда. Шумо метавонед якчандто аз инҳоро дар " -"майдонипоён бо пахши тугмаи \\'Нест кардан'\\ нест созед." - -msgid "Remove all" -msgstr "Нест кардан ба таври кулл" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Пахш кунед барои якбора нест кардани ҳамаи %s." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Тағйиротҳои ҳифзнакардашуда дар майдони таҳрир мавҷуданд. Агаршумо иҷрои " -"амалро давом диҳед, онҳо нест хоҳанд шуд." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Шумо амалро интихоб намудед, вале ҳануз тағйиротҳои ворид кардашуда ҳифз " -"нашудаанд.\"\n" -"\"Барои ҳифз намудани онҳо ба тугмаи 'ОК' пахш намоед.\"\n" -"\"Сипас шуморо лозим меояд, ки амалро такроран иҷро намоед" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"\"Шумо амалрор интихоб намудед, вале тағйирот ворид насохтед.\"\n" -"\"Эҳтимол шумо мехостед ба ҷои тугмаи \\'Ҳифз кардан'\\, аз тугмаи \\'Иҷро " -"кардан'\\ истифода намоед.\"\n" -"\"Агар чунин бошад, он гоҳ тугмаи \\'Инкор'\\ пахш кунед, то ки ба майдони " -"таҳриркунӣ баргардед.\"" - -msgid "Now" -msgstr "Ҳозир" - -msgid "Midnight" -msgstr "Нисфишабӣ" - -msgid "6 a.m." -msgstr "6-и саҳар" - -msgid "Noon" -msgstr "Нисфирӯзӣ" - -msgid "6 p.m." -msgstr "6-и бегоҳӣ" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Choose a Time" -msgstr "Вақтро интихоб кунед" - -msgid "Choose a time" -msgstr "Вақтро интихоб кунед" - -msgid "Cancel" -msgstr "Инкор" - -msgid "Today" -msgstr "Имрӯз" - -msgid "Choose a Date" -msgstr "Санаро интихоб кунед" - -msgid "Yesterday" -msgstr "Дирӯз" - -msgid "Tomorrow" -msgstr "Фардо" - -msgid "January" -msgstr "Январ" - -msgid "February" -msgstr "Феврал" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрел" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июн" - -msgid "July" -msgstr "Июл" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябр" - -msgid "October" -msgstr "Октябр" - -msgid "November" -msgstr "Ноябр" - -msgid "December" -msgstr "Декабр" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Я" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Д" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "С" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ч" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "П" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Ҷ" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Ш" - -msgid "Show" -msgstr "Нишон додан" - -msgid "Hide" -msgstr "Пинҳон кардан" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index 5beeadd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index 53054f8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,671 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2013-2014,2017-2019 -# piti118 , 2012 -# Suteepat Damrongyingsupab , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 01:31+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s ถูกลบเรียบร้อยแล้ว" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "ไม่สามารถลบ %(name)s" - -msgid "Are you sure?" -msgstr "แน่ใจหรือ" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "ลบ %(verbose_name_plural)s ที่เลือก" - -msgid "Administration" -msgstr "การจัดการ" - -msgid "All" -msgstr "ทั้งหมด" - -msgid "Yes" -msgstr "ใช่" - -msgid "No" -msgstr "ไม่ใช่" - -msgid "Unknown" -msgstr "ไม่รู้" - -msgid "Any date" -msgstr "วันไหนก็ได้" - -msgid "Today" -msgstr "วันนี้" - -msgid "Past 7 days" -msgstr "สัปดาห์ที่แล้ว" - -msgid "This month" -msgstr "เดือนนี้" - -msgid "This year" -msgstr "ปีนี้" - -msgid "No date" -msgstr "ไม่รวมวันที่" - -msgid "Has date" -msgstr "รวมวันที่" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "กรุณาใส่ %(username)s และรหัสผ่านให้ถูกต้อง มีการแยกแยะตัวพิมพ์ใหญ่-เล็ก" - -msgid "Action:" -msgstr "คำสั่ง :" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "เพิ่ม %(verbose_name)s อีก" - -msgid "Remove" -msgstr "ถอดออก" - -msgid "Addition" -msgstr "เพิ่ม" - -msgid "Change" -msgstr "เปลี่ยนแปลง" - -msgid "Deletion" -msgstr "ลบ" - -msgid "action time" -msgstr "เวลาลงมือ" - -msgid "user" -msgstr "ผู้ใช้" - -msgid "content type" -msgstr "content type" - -msgid "object id" -msgstr "อ็อบเจ็กต์ไอดี" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "object repr" - -msgid "action flag" -msgstr "action flag" - -msgid "change message" -msgstr "เปลี่ยนข้อความ" - -msgid "log entry" -msgstr "log entry" - -msgid "log entries" -msgstr "log entries" - -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "อ็อบเจ็กต์ LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "เพิ่มแล้ว" - -msgid "and" -msgstr "และ" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "เปลี่ยน {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "ไม่มีฟิลด์ใดถูกเปลี่ยน" - -msgid "None" -msgstr "ไม่มี" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "คุณสามารถแก้ไขได้อีกครั้งด้านล่าง" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"ไม่มีรายการใดถูกเปลี่ยน\n" -"รายการจะต้องถูกเลือกก่อนเพื่อที่จะทำตามคำสั่งได้" - -msgid "No action selected." -msgstr "ไม่มีคำสั่งที่ถูกเลือก" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "เพิ่ม %s" - -#, python-format -msgid "Change %s" -msgstr "เปลี่ยน %s" - -#, python-format -msgid "View %s" -msgstr "ดู %s" - -msgid "Database error" -msgstr "เกิดความผิดพลาดที่ฐานข้อมูล" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(name)s จำนวน %(count)s อันได้ถูกเปลี่ยนแปลงเรียบร้อยแล้ว." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s ได้ถูกเลือก" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "เลือก 0 จาก %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "เปลี่ยนแปลงประวัติ: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"กำลังลบ %(class_name)s %(instance)s จะต้องมีการลบอ็อบเจ็คต์ป้องกันที่เกี่ยวข้อง : " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "ผู้ดูแลระบบ Django" - -msgid "Django administration" -msgstr "การจัดการ Django" - -msgid "Site administration" -msgstr "การจัดการไซต์" - -msgid "Log in" -msgstr "เข้าสู่ระบบ" - -#, python-format -msgid "%(app)s administration" -msgstr "การจัดการ %(app)s" - -msgid "Page not found" -msgstr "ไม่พบหน้านี้" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "หน้าหลัก" - -msgid "Server error" -msgstr "เซิร์ฟเวอร์ขัดข้อง" - -msgid "Server error (500)" -msgstr "เซิร์ฟเวอร์ขัดข้อง (500)" - -msgid "Server Error (500)" -msgstr "เซิร์ฟเวอร์ขัดข้อง (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "รันคำสั่งที่ถูกเลือก" - -msgid "Go" -msgstr "ไป" - -msgid "Click here to select the objects across all pages" -msgstr "คลิกที่นี่เพื่อเลือกอ็อบเจ็กต์จากหน้าทั้งหมด" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "เลือกทั้งหมด %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "เคลียร์ตัวเลือก" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "กรุณาใส่ชื่อผู้ใช้และรหัสผ่าน" - -msgid "Change password" -msgstr "เปลี่ยนรหัสผ่าน" - -msgid "Please correct the error below." -msgstr "กรุณาแก้ไขข้อผิดพลาดด้านล่าง" - -msgid "Please correct the errors below." -msgstr "กรุณาแก้ไขข้อผิดพลาดด้านล่าง" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "ใส่รหัสผ่านใหม่สำหรับผู้ใช้ %(username)s." - -msgid "Welcome," -msgstr "ยินดีต้อนรับ," - -msgid "View site" -msgstr "ดูที่หน้าเว็บ" - -msgid "Documentation" -msgstr "เอกสารประกอบ" - -msgid "Log out" -msgstr "ออกจากระบบ" - -#, python-format -msgid "Add %(name)s" -msgstr "เพิ่ม %(name)s" - -msgid "History" -msgstr "ประวัติ" - -msgid "View on site" -msgstr "ดูที่หน้าเว็บ" - -msgid "Filter" -msgstr "ตัวกรอง" - -msgid "Remove from sorting" -msgstr "เอาออกจาก sorting" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "ลำดับการ sorting: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "เปิด/ปิด sorting" - -msgid "Delete" -msgstr "ลบ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"กำลังดำเนินการลบ %(object_name)s '%(escaped_object)s'และจะแสดงผลการลบ " -"แต่บัญชีของคุณไม่สามารถทำการลบข้อมูลชนิดนี้ได้" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"การลบ %(object_name)s '%(escaped_object)s' จำเป็นจะต้องลบอ็อบเจ็กต์ที่เกี่ยวข้องต่อไปนี้:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"คุณแน่ใจหรือที่จะลบ %(object_name)s \"%(escaped_object)s\"?" -"ข้อมูลที่เกี่ยวข้องทั้งหมดจะถูกลบไปด้วย:" - -msgid "Objects" -msgstr "อ็อบเจ็กต์" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "ไม่ พาฉันกลับ" - -msgid "Delete multiple objects" -msgstr "ลบหลายอ็อบเจ็กต์" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"การลบ %(objects_name)s ที่เลือก จะทำให้อ็อบเจ็กต์ที่เกี่ยวข้องถูกลบไปด้วย " -"แต่บัญชีของคุณไม่มีสิทธิ์ที่จะลบอ็อบเจ็กต์ชนิดนี้" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "การลบ %(objects_name)s ที่ถูกเลือก จำเป็นจะต้องลบอ็อบเจ็กต์ที่เกี่ยวข้องต่อไปนี้:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"คุณแน่ใจหรือว่า ต้องการลบ %(objects_name)s ที่ถูกเลือก? เนื่องจากอ็อบเจ็กต์ " -"และรายการที่เกี่ยวข้องทั้งหมดต่อไปนี้จะถูกลบด้วย" - -msgid "View" -msgstr "ดู:" - -msgid "Delete?" -msgstr "ลบ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " โดย %(filter_title)s " - -msgid "Summary" -msgstr "สรุป" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "โมเดลในแอป %(name)s" - -msgid "Add" -msgstr "เพิ่ม" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "การกระทำล่าสุด" - -msgid "My actions" -msgstr "การกระทำของฉัน" - -msgid "None available" -msgstr "ไม่ว่าง" - -msgid "Unknown content" -msgstr "ไม่ทราบเนื้อหา" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"คุณได้ลงชื่อเป็น %(username)s แต่ไม่ได้รับอนุญาตให้เข้าถึงหน้านี้ " -"คุณต้องการลงชื่อเข้าใช้บัญชีอื่นหรือไม่?" - -msgid "Forgotten your password or username?" -msgstr "ลืมรหัสผ่านหรือชื่อผู้ใช้ของคุณหรือไม่" - -msgid "Date/time" -msgstr "วันที่/เวลา" - -msgid "User" -msgstr "ผู้ใช้" - -msgid "Action" -msgstr "คำสั่ง" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "แสดงทั้งหมด" - -msgid "Save" -msgstr "บันทึก" - -msgid "Popup closing…" -msgstr "ปิดป๊อปอัป ..." - -msgid "Search" -msgstr "ค้นหา" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s ผลลัพธ์" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s ทั้งหมด" - -msgid "Save as new" -msgstr "บันทึกใหม่" - -msgid "Save and add another" -msgstr "บันทึกและเพิ่ม" - -msgid "Save and continue editing" -msgstr "บันทึกและกลับมาแก้ไข" - -msgid "Save and view" -msgstr "บันทึกและดู" - -msgid "Close" -msgstr "ปิด" - -#, python-format -msgid "Change selected %(model)s" -msgstr "เปลี่ยนแปลง %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "เพิ่ม %(model)sอีก" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "ลบ %(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ขอบคุณที่สละเวลาอันมีค่าให้กับเว็บไซต์ของเราในวันนี้" - -msgid "Log in again" -msgstr "เข้าสู่ระบบอีกครั้ง" - -msgid "Password change" -msgstr "เปลี่ยนรหัสผ่าน" - -msgid "Your password was changed." -msgstr "รหัสผ่านของคุณถูกเปลี่ยนไปแล้ว" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "เปลี่ยนรหัสผ่านของฉัน" - -msgid "Password reset" -msgstr "ตั้งค่ารหัสผ่านใหม่" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "รหัสผ่านของคุณได้รับการตั้งค่าแล้ว คุณสามารถเข้าสู่ระบบได้ทันที" - -msgid "Password reset confirmation" -msgstr "การยืนยันตั้งค่ารหัสผ่านใหม่" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "กรุณาใส่รหัสผ่านใหม่สองครั้ง เพื่อตรวจสอบว่าคุณได้พิมพ์รหัสอย่างถูกต้อง" - -msgid "New password:" -msgstr "รหัสผ่านใหม่:" - -msgid "Confirm password:" -msgstr "ยืนยันรหัสผ่าน:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"การตั้งรหัสผ่านใหม่ไม่สำเร็จ เป็นเพราะว่าหน้านี้ได้ถูกใช้งานไปแล้ว กรุณาทำการตั้งรหัสผ่านใหม่อีกครั้ง" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"คุณได้รับอีเมล์ฉบับนี้ เนื่องจากคุณส่งคำร้องขอเปลี่ยนรหัสผ่านสำหรับบัญชีผู้ใช้ของคุณที่ %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "กรุณาไปที่หน้านี้และเลือกรหัสผ่านใหม่:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "ขอบคุณสำหรับการใช้งานเว็บไซต์ของเรา" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s ทีม" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "อีเมล:" - -msgid "Reset my password" -msgstr "ตั้งรหัสผ่านของฉันใหม่" - -msgid "All dates" -msgstr "ทุกวัน" - -#, python-format -msgid "Select %s" -msgstr "เลือก %s" - -#, python-format -msgid "Select %s to change" -msgstr "เลือก %s เพื่อเปลี่ยนแปลง" - -#, python-format -msgid "Select %s to view" -msgstr "เลือก %s เพื่อดู" - -msgid "Date:" -msgstr "วันที่ :" - -msgid "Time:" -msgstr "เวลา :" - -msgid "Lookup" -msgstr "ดูที่" - -msgid "Currently:" -msgstr "ปัจจุบัน:" - -msgid "Change:" -msgstr "เปลี่ยนเป็น:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 71eff63..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5cca152..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,213 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2011-2012,2018 -# Perry Roper , 2017 -# Suteepat Damrongyingsupab , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2018-05-06 07:50+0000\n" -"Last-Translator: Kowit Charoenratchatabhan \n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%sที่มีอยู่" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"นี่คือรายการที่ใช้ได้ของ %s คุณอาจเลือกบางรายการโดยการเลือกไว้ในกล่องด้านล่างแล้วคลิกที่ปุ่ม " -"\"เลือก\" ระหว่างสองกล่อง" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "พิมพ์ลงในช่องนี้เพื่อกรองรายการที่ใช้ได้ของ %s" - -msgid "Filter" -msgstr "ตัวกรอง" - -msgid "Choose all" -msgstr "เลือกทั้งหมด" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "คลิกเพื่อเลือก %s ทั้งหมดในครั้งเดียว" - -msgid "Choose" -msgstr "เลือก" - -msgid "Remove" -msgstr "ลบออก" - -#, javascript-format -msgid "Chosen %s" -msgstr "%sที่ถูกเลือก" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"นี่คือรายการที่ถูกเลือกของ %s คุณอาจเอาบางรายการออกโดยการเลือกไว้ในกล่องด้านล่างแล้วคลิกที่ปุ่ม " -"\"เอาออก\" ระหว่างสองกล่อง" - -msgid "Remove all" -msgstr "เอาออกทั้งหมด" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "คลิกเพื่อเอา %s ออกทั้งหมดในครั้งเดียว" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s จาก %(cnt)s selected" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"คุณยังไม่ได้บันทึกการเปลี่ยนแปลงในแต่ละฟิลด์ ถ้าคุณเรียกใช้คำสั่ง " -"ข้อมูลที่ไม่ได้บันทึกการเปลี่ยนแปลงของคุณจะหายไป" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"คุณได้เลือกคำสั่ง แต่คุณยังไม่ได้บันทึกการเปลี่ยนแปลงของคุณไปยังฟิลด์ กรุณาคลิก OK เพื่อบันทึก " -"คุณจะต้องเรียกใช้คำสั่งใหม่อีกครั้ง" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"คุณได้เลือกคำสั่งและคุณยังไม่ได้ทำการเปลี่ยนแปลงใด ๆ ในฟิลด์ คุณอาจมองหาปุ่มไปมากกว่าปุ่มบันทึก" - -msgid "Now" -msgstr "ขณะนี้" - -msgid "Midnight" -msgstr "เที่ยงคืน" - -msgid "6 a.m." -msgstr "หกโมงเช้า" - -msgid "Noon" -msgstr "เที่ยงวัน" - -msgid "6 p.m." -msgstr "หกโมงเย็น" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "หมายเหตุ: เวลาคุณเร็วกว่าเวลาบนเซิร์ฟเวอร์อยู่ %s ชั่วโมง." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "หมายเหตุ: เวลาคุณช้ากว่าเวลาบนเซิร์ฟเวอร์อยู่ %s ชั่วโมง." - -msgid "Choose a Time" -msgstr "เลือกเวลา" - -msgid "Choose a time" -msgstr "เลือกเวลา" - -msgid "Cancel" -msgstr "ยกเลิก" - -msgid "Today" -msgstr "วันนี้" - -msgid "Choose a Date" -msgstr "เลือกวัน" - -msgid "Yesterday" -msgstr "เมื่อวาน" - -msgid "Tomorrow" -msgstr "พรุ่งนี้" - -msgid "January" -msgstr "มกราคม" - -msgid "February" -msgstr "กุมภาพันธ์" - -msgid "March" -msgstr "มีนาคม" - -msgid "April" -msgstr "เมษายน" - -msgid "May" -msgstr "พฤษภาคม" - -msgid "June" -msgstr "มิถุนายน" - -msgid "July" -msgstr "กรกฎาคม" - -msgid "August" -msgstr "สิงหาคม" - -msgid "September" -msgstr "กันยายน" - -msgid "October" -msgstr "ตุลาคม" - -msgid "November" -msgstr "พฤศจิกายน" - -msgid "December" -msgstr "ธันวาคม" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "อา." - -msgctxt "one letter Monday" -msgid "M" -msgstr "จ." - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "อ." - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "พ." - -msgctxt "one letter Thursday" -msgid "T" -msgstr "พฤ." - -msgctxt "one letter Friday" -msgid "F" -msgstr "ศ." - -msgctxt "one letter Saturday" -msgid "S" -msgstr "ส." - -msgid "Show" -msgstr "แสดง" - -msgid "Hide" -msgstr "ซ่อน" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index fd8f0e1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index ad73340..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,738 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2022 -# Natalia, 2024 -# Resul , 2024 -# Rovshen Tagangylyjov, 2024 -# Welbeck Garli , 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: Natalia, 2024\n" -"Language-Team: Turkmen (http://app.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s saýlanany poz" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d%(items)süstünlikli pozuldy." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Pozmak amala aşyrylyp bilinmedi %(name)s" - -msgid "Are you sure?" -msgstr "Siz dowam etmekçimi?" - -msgid "Administration" -msgstr "Administrasiýa" - -msgid "All" -msgstr "Ählisi" - -msgid "Yes" -msgstr "Hawa" - -msgid "No" -msgstr "Ýok" - -msgid "Unknown" -msgstr "Näbelli" - -msgid "Any date" -msgstr "Islendik sene" - -msgid "Today" -msgstr "Şu gün" - -msgid "Past 7 days" -msgstr "Soňky 7 gün" - -msgid "This month" -msgstr "Şu aý" - -msgid "This year" -msgstr "Şu ýyl" - -msgid "No date" -msgstr "Senesiz" - -msgid "Has date" -msgstr "Senesi bar" - -msgid "Empty" -msgstr "Boş" - -msgid "Not empty" -msgstr "Boş däl" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Administratiw bolmadyk hasap üçin dogry %(username)s we parol ulanmagyňyzy " -"sizden haýyş edýäris. Giriziljek maglumatlaryň harp ýalňyşsyz bolmagyny göz " -"öňünde tutmagy unutmaň." - -msgid "Action:" -msgstr "Hereket:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Başga %(verbose_name)s goş" - -msgid "Remove" -msgstr "Aýyr" - -msgid "Addition" -msgstr "Goşmak" - -msgid "Change" -msgstr "Üýtget" - -msgid "Deletion" -msgstr "Pozmaklyk" - -msgid "action time" -msgstr "hereket wagty" - -msgid "user" -msgstr "ulanyjy" - -msgid "content type" -msgstr "mazmun görnüşi" - -msgid "object id" -msgstr "obýekt id-sy" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "obýekt repr-y" - -msgid "action flag" -msgstr "hereket belligi" - -msgid "change message" -msgstr "Habarnamany üýtget" - -msgid "log entry" -msgstr "Giriş habarnamasy" - -msgid "log entries" -msgstr "giriş habarnamalary" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" goşuldy" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\" üýtgedildi - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" pozuldy." - -msgid "LogEntry Object" -msgstr "GirişHabarnamasy Obýekty" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Goşuldy {name} “{object}”." - -msgid "Added." -msgstr "Goşuldy." - -msgid "and" -msgstr "we" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} üýtgedildi." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "" - -#, python-format -msgid "Change %s" -msgstr "" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "View" -msgstr "" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "" - -msgid "Set password" -msgstr "" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "" - -msgid "Enable password-based authentication" -msgstr "" - -msgid "Skip to main content" -msgstr "" - -msgid "Welcome," -msgstr "" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "" - -msgid "Log out" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Hide counts" -msgstr "" - -msgid "Show counts" -msgstr "" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Toggle theme (current theme: auto)" -msgstr "" - -msgid "Toggle theme (current theme: light)" -msgstr "" - -msgid "Toggle theme (current theme: dark)" -msgstr "" - -msgid "Delete" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Added:" -msgstr "" - -msgid "Changed:" -msgstr "" - -msgid "Deleted:" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Toggle navigation" -msgstr "" - -msgid "Sidebar" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "Select all objects on this page for an action" -msgstr "" - -msgid "All dates" -msgstr "" - -#, python-format -msgid "Select %s" -msgstr "" - -#, python-format -msgid "Select %s to change" -msgstr "" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "" - -msgid "Time:" -msgstr "" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index dd05678..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index 1a74ead..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,798 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BouRock, 2015-2025 -# BouRock, 2014-2015 -# Caner Başaran , 2013 -# Cihad GÜNDOĞDU , 2012 -# Cihad GÜNDOĞDU , 2014 -# Cihan Okyay , 2014 -# Jannis Leidel , 2011 -# Mesut Can Gürle , 2013 -# Murat Sahin , 2011 -# Yigit Guler , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: BouRock, 2015-2025\n" -"Language-Team: Turkish (http://app.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Seçili %(verbose_name_plural)s nesnelerini sil" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d adet %(items)s başarılı olarak silindi." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s silinemiyor" - -msgid "Delete multiple objects" -msgstr "Birden fazla nesneyi sil" - -msgid "Administration" -msgstr "Yönetim" - -msgid "All" -msgstr "Tümü" - -msgid "Yes" -msgstr "Evet" - -msgid "No" -msgstr "Hayır" - -msgid "Unknown" -msgstr "Bilinmiyor" - -msgid "Any date" -msgstr "Herhangi bir tarih" - -msgid "Today" -msgstr "Bugün" - -msgid "Past 7 days" -msgstr "Son 7 gün" - -msgid "This month" -msgstr "Bu ay" - -msgid "This year" -msgstr "Bu yıl" - -msgid "No date" -msgstr "Tarih yok" - -msgid "Has date" -msgstr "Tarih var" - -msgid "Empty" -msgstr "Boş" - -msgid "Not empty" -msgstr "Boş değil" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Lütfen görevli hesabı için %(username)s ve parolanızı doğru girin. İki " -"alanın da büyük küçük harfe duyarlı olabildiğini unutmayın." - -msgid "Action:" -msgstr "Eylem:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Başka bir %(verbose_name)s ekle" - -msgid "Remove" -msgstr "Kaldır" - -msgid "Addition" -msgstr "Ekleme" - -msgid "Change" -msgstr "Değiştir" - -msgid "Deletion" -msgstr "Silme" - -msgid "action time" -msgstr "eylem zamanı" - -msgid "user" -msgstr "kullanıcı" - -msgid "content type" -msgstr "içerik türü" - -msgid "object id" -msgstr "nesne kimliği" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "nesne kodu" - -msgid "action flag" -msgstr "eylem işareti" - -msgid "change message" -msgstr "iletiyi değiştir" - -msgid "log entry" -msgstr "günlük girdisi" - -msgid "log entries" -msgstr "günlük girdisi" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” eklendi." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” değiştirildi — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s” silindi." - -msgid "LogEntry Object" -msgstr "LogEntry Nesnesi" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” eklendi." - -msgid "Added." -msgstr "Eklendi." - -msgid "and" -msgstr "ve" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” için {fields} değiştirildi." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} değiştirildi." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” silindi." - -msgid "No fields changed." -msgstr "Değiştirilen alanlar yok." - -msgid "None" -msgstr "Hiçbiri" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Birden fazla seçmek için “Ctrl” veya Mac’teki “Command” tuşuna basılı tutun." - -msgid "Select this object for an action - {}" -msgstr "Bir eylem için bu nesneyi seç - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” başarılı olarak eklendi." - -msgid "You may edit it again below." -msgstr "Aşağıdan bunu tekrar düzenleyebilirsiniz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” başarılı olarak eklendi. Aşağıda başka bir {name} " -"ekleyebilirsiniz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” başarılı olarak değiştirildi. Aşağıda tekrar " -"düzenleyebilirsiniz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” başarılı olarak değiştirildi. Aşağıda başka bir {name} " -"ekleyebilirsiniz." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” başarılı olarak değiştirildi." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Bunlar üzerinde eylemlerin uygulanması için öğeler seçilmek zorundadır. Hiç " -"öğe değiştirilmedi." - -msgid "No action selected." -msgstr "Seçilen eylem yok." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” başarılı olarak silindi." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "“%(key)s” kimliği olan %(name)s mevcut değil. Belki silinmiş midir?" - -#, python-format -msgid "Add %s" -msgstr "%s ekle" - -#, python-format -msgid "Change %s" -msgstr "%s değiştir" - -#, python-format -msgid "View %s" -msgstr "%s göster" - -msgid "Database error" -msgstr "Veritabanı hatası" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s adet %(name)s başarılı olarak değiştirildi." -msgstr[1] "%(count)s adet %(name)s başarılı olarak değiştirildi." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s nesne seçildi" -msgstr[1] "Tüm %(total_count)s nesne seçildi" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 / %(cnt)s nesne seçildi" - -msgid "Delete" -msgstr "Sil" - -#, python-format -msgid "Change history: %s" -msgstr "Değişiklik geçmişi: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s silinmesi aşağıda korunan ilgili nesnelerin de " -"silinmesini gerektirecektir: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django site yöneticisi" - -msgid "Django administration" -msgstr "Django yönetimi" - -msgid "Site administration" -msgstr "Site yönetimi" - -msgid "Log in" -msgstr "Oturum aç" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s yönetimi" - -msgid "Page not found" -msgstr "Sayfa bulunamadı" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Üzgünüz, istediğiniz sayfa bulunamadı." - -msgid "Home" -msgstr "Giriş" - -msgid "Server error" -msgstr "Sunucu hatası" - -msgid "Server error (500)" -msgstr "Sunucu hatası (500)" - -msgid "Server Error (500)" -msgstr "Sunucu Hatası (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Bir hata oluştu. Site yöneticilerine e-posta yoluyla bildirildi ve kısa süre " -"içinde düzeltilecektir. Sabrınız için teşekkür ederiz." - -msgid "Run the selected action" -msgstr "Seçilen eylemi çalıştır" - -msgid "Go" -msgstr "Git" - -msgid "Click here to select the objects across all pages" -msgstr "Tüm sayfalardaki nesneleri seçmek için buraya tıklayın" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Tüm %(total_count)s %(module_name)s nesnelerini seç" - -msgid "Clear selection" -msgstr "Seçimi temizle" - -msgid "Breadcrumbs" -msgstr "İçerik haritaları" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s uygulamasındaki modeller" - -msgid "Model name" -msgstr "Model adı" - -msgid "Add link" -msgstr "Bağlantı ekle" - -msgid "Change or view list link" -msgstr "Liste bağlantısını değiştir veya görüntüle" - -msgid "Add" -msgstr "Ekle" - -msgid "View" -msgstr "Göster" - -msgid "You don’t have permission to view or edit anything." -msgstr "Hiçbir şeyi düzenlemek ve göstermek için izne sahip değilsiniz." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Bir kullanıcı oluşturduktan sonra, daha fazla kullanıcı seçeneğini " -"düzenleyebileceksiniz." - -msgid "Error:" -msgstr "Hata:" - -msgid "Change password" -msgstr "Parolayı değiştir" - -msgid "Set password" -msgstr "Parola ayarla" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Lütfen aşağıdaki hatayı düzeltin." -msgstr[1] "Lütfen aşağıdaki hataları düzeltin." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s kullanıcısı için yeni bir parola girin." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Bu eylem, bu kullanıcı için parola tabanlı kimlik doğrulaması " -"etkinleştirecektir." - -msgid "Disable password-based authentication" -msgstr "Parola tabanlı kimlik doğrulamasını etkisizleştir" - -msgid "Enable password-based authentication" -msgstr "Parola tabanlı kimlik doğrulamasını etkinleştir" - -msgid "Skip to main content" -msgstr "Ana içeriğe atla" - -msgid "Welcome," -msgstr "Hoş Geldiniz," - -msgid "View site" -msgstr "Siteyi göster" - -msgid "Documentation" -msgstr "Belgeler" - -msgid "Log out" -msgstr "Oturumu kapat" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ekle" - -msgid "History" -msgstr "Geçmiş" - -msgid "View on site" -msgstr "Sitede görüntüle" - -msgid "Filter" -msgstr "Süz" - -msgid "Hide counts" -msgstr "Sayıları gizle" - -msgid "Show counts" -msgstr "Sayıları göster" - -msgid "Clear all filters" -msgstr "Tüm süzgeçleri temizle" - -msgid "Remove from sorting" -msgstr "Sıralamadan kaldır" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sıralama önceliği: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sıralamayı değiştir" - -msgid "Toggle theme (current theme: auto)" -msgstr "Temayı değiştir (şu anki tema: otomatik)" - -msgid "Toggle theme (current theme: light)" -msgstr "Temayı değiştir (şu anki tema: açık)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Temayı değiştir (şu anki tema: koyu)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' nesnesinin silinmesi, ilgili nesnelerin " -"silinmesi ile sonuçlanacak, ancak hesabınız aşağıdaki nesnelerin türünü " -"silmek için izine sahip değil." - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' nesnesinin silinmesi, aşağıda korunan " -"ilgili nesnelerin silinmesini gerektirecek:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" nesnesini silmek istediğinize emin " -"misiniz? Aşağıdaki ilgili öğelerin tümü silinecektir:" - -msgid "Objects" -msgstr "Nesneler" - -msgid "Yes, I’m sure" -msgstr "Evet, eminim" - -msgid "No, take me back" -msgstr "Hayır, beni geri götür" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Seçilen %(objects_name)s nesnelerinin silinmesi, ilgili nesnelerin silinmesi " -"ile sonuçlanacak, ancak hesabınız aşağıdaki nesnelerin türünü silmek için " -"izine sahip değil." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Seçilen %(objects_name)s nesnelerinin silinmesi, aşağıda korunan ilgili " -"nesnelerin silinmesini gerektirecek:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Seçilen %(objects_name)s nesnelerini silmek istediğinize emin misiniz? " -"Aşağıdaki nesnelerin tümü ve onların ilgili öğeleri silinecektir:" - -msgid "Delete?" -msgstr "Silinsin mi?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s süzgecine göre" - -msgid "Summary" -msgstr "Özet" - -msgid "Recent actions" -msgstr "Son eylemler" - -msgid "My actions" -msgstr "Eylemlerim" - -msgid "None available" -msgstr "Mevcut değil" - -msgid "Added:" -msgstr "Eklendi:" - -msgid "Changed:" -msgstr "Değiştirildi:" - -msgid "Deleted:" -msgstr "Silindi:" - -msgid "Unknown content" -msgstr "Bilinmeyen içerik" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Veritabanı kurulumunuz ile ilgili birşeyler yanlış. Uygun veritabanı " -"tablolarının oluşturulduğundan ve veritabanının uygun kullanıcı tarafından " -"okunabilir olduğundan emin olun." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"%(username)s olarak kimlik doğrulamanız yapıldı, ancak bu sayfaya erişmek " -"için yetkili değilsiniz. Farklı bir hesapla oturum açmak ister misiniz?" - -msgid "Forgotten your login credentials?" -msgstr "Oturum açma kimlik bilgilerinizi mi unuttunuz?" - -msgid "Toggle navigation" -msgstr "Gezinmeyi aç/kapat" - -msgid "Sidebar" -msgstr "Kenar çubuğu" - -msgid "Start typing to filter…" -msgstr "Süzmek için yazmaya başlayın..." - -msgid "Filter navigation items" -msgstr "Gezinti öğelerini süz" - -msgid "Date/time" -msgstr "Tarih/saat" - -msgid "User" -msgstr "Kullanıcı" - -msgid "Action" -msgstr "Eylem" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "giriş" -msgstr[1] "giriş" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Bu nesne değişme geçmişine sahip değil. Muhtemelen bu yönetici sitesi " -"aracılığıyla eklenmedi." - -msgid "Show all" -msgstr "Tümünü göster" - -msgid "Save" -msgstr "Kaydet" - -msgid "Popup closing…" -msgstr "Açılır pencere kapanıyor…" - -msgid "Search" -msgstr "Ara" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s sonuç" -msgstr[1] "%(counter)s sonuç" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "toplam %(full_result_count)s" - -msgid "Save as new" -msgstr "Yeni olarak kaydet" - -msgid "Save and add another" -msgstr "Kaydet ve başka birini ekle" - -msgid "Save and continue editing" -msgstr "Kaydet ve düzenlemeye devam et" - -msgid "Save and view" -msgstr "Kaydet ve göster" - -msgid "Close" -msgstr "Kapat" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Seçilen %(model)s değiştir" - -#, python-format -msgid "Add another %(model)s" -msgstr "Başka bir %(model)s ekle" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Seçilen %(model)s sil" - -#, python-format -msgid "View selected %(model)s" -msgstr "Seçilen %(model)s görüntüle" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Bugün web sitesine ayırdığınız kaliteli zaman için teşekkür ederiz." - -msgid "Log in again" -msgstr "Tekrar oturum aç" - -msgid "Password change" -msgstr "Parola değiştime" - -msgid "Your password was changed." -msgstr "Parolanız değiştirildi." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Güvenliğiniz için, lütfen eski parolanızı girin, ve ondan sonra yeni " -"parolanızı iki kere girin böylece doğru olarak yazdığınızı doğrulayabilelim." - -msgid "Change my password" -msgstr "Parolamı değiştir" - -msgid "Password reset" -msgstr "Parolayı sıfırla" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Parolanız ayarlandı. Şimdi devam edebilir ve oturum açabilirsiniz." - -msgid "Password reset confirmation" -msgstr "Parola sıfırlama onayı" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Lütfen yeni parolanızı iki kere girin böylece böylece doğru olarak " -"yazdığınızı doğrulayabilelim." - -msgid "New password:" -msgstr "Yeni parola:" - -msgid "Confirm password:" -msgstr "Parolayı onayla:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Parola sıfırlama bağlantısı geçersiz olmuş, çünkü zaten kullanılmış. Lütfen " -"yeni bir parola sıfırlama isteyin." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Eğer girdiğiniz e-posta ile bir hesabınız varsa, parolanızın ayarlanması " -"için size talimatları e-posta ile gönderdik. En kısa sürede almalısınız." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Eğer bir e-posta almadıysanız, lütfen kayıt olurken girdiğiniz adresi " -"kullandığınızdan emin olun ve istenmeyen mesajlar klasörünü kontrol edin." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Bu e-postayı alıyorsunuz çünkü %(site_name)s sitesindeki kullanıcı hesabınız " -"için bir parola sıfırlama istediniz." - -msgid "Please go to the following page and choose a new password:" -msgstr "Lütfen şurada belirtilen sayfaya gidin ve yeni bir parola seçin:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Unutmuş olmanız durumunda, siz:" - -msgid "Thanks for using our site!" -msgstr "Sitemizi kullandığınız için teşekkürler!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s ekibi" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Parolanızı mı unuttunuz? Aşağıya e-posta adresinizi girin ve yeni bir tane " -"ayarlamak için talimatları e-posta ile gönderelim." - -msgid "Email address:" -msgstr "E-posta adresi:" - -msgid "Reset my password" -msgstr "Parolamı sıfırla" - -msgid "Select all objects on this page for an action" -msgstr "Bir eylem için bu sayfadaki tüm nesneleri seç" - -msgid "All dates" -msgstr "Tüm tarihler" - -#, python-format -msgid "Select %s" -msgstr "%s seç" - -#, python-format -msgid "Select %s to change" -msgstr "Değiştirmek için %s seçin" - -#, python-format -msgid "Select %s to view" -msgstr "Göstermek için %s seçin" - -msgid "Date:" -msgstr "Tarih:" - -msgid "Time:" -msgstr "Saat:" - -msgid "Lookup" -msgstr "Arama" - -msgid "Currently:" -msgstr "Şu anda:" - -msgid "Change:" -msgstr "Değiştir:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 73fb0ba..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po deleted file mode 100644 index 3c1cc9d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,315 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BouRock, 2015-2016,2019-2023,2025 -# BouRock, 2014 -# Jannis Leidel , 2011 -# Metin Amiroff , 2011 -# Murat Çorlu , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: BouRock, 2015-2016,2019-2023,2025\n" -"Language-Team: Turkish (http://app.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Mevcut %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Bunları seçerek %s seçin ve ardından \"Seç\" ok düğmesine tıklayın." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Mevcut %s listesini süzmek için bu kutu içine yazın." - -msgid "Filter" -msgstr "Süzgeç" - -#, javascript-format -msgid "Choose all %s" -msgstr "Tüm %s seç" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Seçilen %s seç" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Seçilen %s kaldır" - -#, javascript-format -msgid "Chosen %s" -msgstr "Seçilen %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Bunları seçerek %s kaldırın ve ardından \"Kaldır\" ok düğmesine tıklayın." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Seçilen %s listesini süzmek için bu kutu içine yazın." - -msgid "(click to clear)" -msgstr "(temizlemek için tıklayın)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Tüm %s kaldır" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s seçilen seçenek görünür değil" -msgstr[1] "%s seçilen seçenek görünür değil" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s / %(cnt)s seçildi" -msgstr[1] "%(sel)s / %(cnt)s seçildi" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Bireysel düzenlenebilir alanlarda kaydedilmemiş değişiklikleriniz var. Eğer " -"bir eylem çalıştırırsanız, kaydedilmemiş değişiklikleriniz kaybolacaktır." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Bir eylem seçtiniz, ancak değişikliklerinizi tek tek alanlara kaydetmediniz. " -"Kaydetmek için lütfen TAMAM düğmesine tıklayın. Eylemi yeniden çalıştırmanız " -"gerekecek." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Bir eylem seçtiniz, ancak tek tek alanlarda herhangi bir değişiklik " -"yapmadınız. Muhtemelen Kaydet düğmesi yerine Git düğmesini arıyorsunuz." - -msgid "Now" -msgstr "Şimdi" - -msgid "Midnight" -msgstr "Geceyarısı" - -msgid "6 a.m." -msgstr "Sabah 6" - -msgid "Noon" -msgstr "Öğle" - -msgid "6 p.m." -msgstr "6 ö.s." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Not: Sunucu saatinin %s saat ilerisindesiniz." -msgstr[1] "Not: Sunucu saatinin %s saat ilerisindesiniz." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Not: Sunucu saatinin %s saat gerisindesiniz." -msgstr[1] "Not: Sunucu saatinin %s saat gerisindesiniz." - -msgid "Choose a Time" -msgstr "Bir Saat Seçin" - -msgid "Choose a time" -msgstr "Bir saat seçin" - -msgid "Cancel" -msgstr "İptal" - -msgid "Today" -msgstr "Bugün" - -msgid "Choose a Date" -msgstr "Bir Tarih Seçin" - -msgid "Yesterday" -msgstr "Dün" - -msgid "Tomorrow" -msgstr "Yarın" - -msgid "January" -msgstr "Ocak" - -msgid "February" -msgstr "Şubat" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Nisan" - -msgid "May" -msgstr "Mayıs" - -msgid "June" -msgstr "Haziran" - -msgid "July" -msgstr "Temmuz" - -msgid "August" -msgstr "Ağustos" - -msgid "September" -msgstr "Eylül" - -msgid "October" -msgstr "Ekim" - -msgid "November" -msgstr "Kasım" - -msgid "December" -msgstr "Aralık" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Oca" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Şub" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Nis" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Haz" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Tem" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ağu" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Eyl" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Eki" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Kas" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Ara" - -msgid "Sunday" -msgstr "Pazar" - -msgid "Monday" -msgstr "Pazartesi" - -msgid "Tuesday" -msgstr "Salı" - -msgid "Wednesday" -msgstr "Çarşamba" - -msgid "Thursday" -msgstr "Perşembe" - -msgid "Friday" -msgstr "Cuma" - -msgid "Saturday" -msgstr "Cumartesi" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Paz" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pzt" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Sal" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Çrş" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Per" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Cum" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Cmt" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "P" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Pt" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "S" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ç" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Pe" - -msgctxt "one letter Friday" -msgid "F" -msgstr "C" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Ct" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index 6bfde60..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index 9d0260b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,655 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -# v_ildar , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s уңышлы рәвештә бетерелгән." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s бетереп булмады" - -msgid "Are you sure?" -msgstr "Сез инанып карар кылдыгызмы?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Сайланган %(verbose_name_plural)s бетерергә" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Барысы" - -msgid "Yes" -msgstr "Әйе" - -msgid "No" -msgstr "Юк" - -msgid "Unknown" -msgstr "Билгесез" - -msgid "Any date" -msgstr "Теләсә нинди көн һәм вакыт" - -msgid "Today" -msgstr "Бүген" - -msgid "Past 7 days" -msgstr "Соңгы 7 көн" - -msgid "This month" -msgstr "Бу ай" - -msgid "This year" -msgstr "Бу ел" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Гамәл:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Тагын бер %(verbose_name)s өстәргә" - -msgid "Remove" -msgstr "Бетерергә" - -msgid "action time" -msgstr "гамәл вакыты" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "объект идентификаторы" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "объект фаразы" - -msgid "action flag" -msgstr "гамәл тибы" - -msgid "change message" -msgstr "үзгәрү белдерүе" - -msgid "log entry" -msgstr "журнал язмасы" - -msgid "log entries" -msgstr "журнал язмалары" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "һәм" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Үзгәртелгән кырлар юк." - -msgid "None" -msgstr "Юк" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Элементар өстеннән гамәл кылу өчен алар сайланган булырга тиеш. Элементлар " -"үзгәртелмәгән." - -msgid "No action selected." -msgstr "Гамәл сайланмаган." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" уңышлы рәвештә бетерелгән." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s өстәргә" - -#, python-format -msgid "Change %s" -msgstr "%s үзгәртергә" - -msgid "Database error" -msgstr "Бирелмәләр базасы хатасы" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s уңышлы рәвештә үзгәртелгән." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s сайланган" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Барлык %(cnt)s объектан 0 сайланган" - -#, python-format -msgid "Change history: %s" -msgstr "Үзгәртү тарихы: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Django сайты идарәсе" - -msgid "Django administration" -msgstr "Django идарәсе" - -msgid "Site administration" -msgstr "Сайт идарәсе" - -msgid "Log in" -msgstr "Керергә" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Сәхифә табылмаган" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Кызганычка каршы, соралган сәхифә табылмады." - -msgid "Home" -msgstr "Башбит" - -msgid "Server error" -msgstr "Сервер хатасы" - -msgid "Server error (500)" -msgstr "Сервер хатасы (500)" - -msgid "Server Error (500)" -msgstr "Сервер хатасы (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Сайланган гамәлне башкарырга" - -msgid "Go" -msgstr "Башкарырга" - -msgid "Click here to select the objects across all pages" -msgstr "Барлык сәхифәләрдә булган объектларны сайлау өчен монда чирттерегез" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Бөтен %(total_count)s %(module_name)s сайларга" - -msgid "Clear selection" -msgstr "Сайланганлыкны алырга" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Баштан логин һәм серсүзне кертегез. Аннан соң сез кулланучы турында күбрәк " -"мәгълүматне төзәтә алырсыз." - -msgid "Enter a username and password." -msgstr "Логин һәм серсүзне кертегез." - -msgid "Change password" -msgstr "Серсүзне үзгәртергә" - -msgid "Please correct the error below." -msgstr "Зинһар, биредәге хаталарны төзәтегез." - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s кулланучы өчен яңа серсүзне кертегез." - -msgid "Welcome," -msgstr "Рәхим итегез," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Документация" - -msgid "Log out" -msgstr "Чыгарга" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s өстәргә" - -msgid "History" -msgstr "Тарих" - -msgid "View on site" -msgstr "Сайтта карарга" - -msgid "Filter" -msgstr "Филтер" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Бетерергә" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' бетереүе аның белән бәйләнгән " -"объектларның бетерелүенә китерә ала, әмма сезнең хисап язмагызның киләсе " -"объект тибларын бетерү өчен хокуклары җитми:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' бетерүе киләсе сакланган объектларның " -"бетерелүен таләп итә:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Сез инанып %(object_name)s \"%(escaped_object)s\" бетерергә телисезме? " -"Барлык киләсе бәйләнгән объектлар да бетерелер:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Әйе, мин инандым" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Берничә объектны бетерергә" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Сайланган %(objects_name)s бетерүе аның белән бәйләнгән объектларның " -"бетерелүенә китерә ала, әмма сезнең хисап язмагызның киләсе объект тибларын " -"бетерү өчен хокуклары җитми:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s бетерүе киләсе аның белән бәйләнгән сакланган объектларның " -"бетерелүен таләп итә:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Сез инанып %(objects_name)s бетерергә телисезме? Барлык киләсе объектлар һәм " -"алар белән бәйләнгән элементлар да бетерелер:" - -msgid "Change" -msgstr "Үзгәртергә" - -msgid "Delete?" -msgstr "Бетерергә?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s буенча" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Өстәргә" - -msgid "You don't have permission to edit anything." -msgstr "Төзәтү өчен хокукларыгыз җитми." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Тарих юк" - -msgid "Unknown content" -msgstr "Билгесез тип" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Сезнең бирелмәләр базасы дөрес итем көйләнмәгән. Тиешле җәдвәлләр төзелгәнен " -"һәм тиешле кулланучының хокуклары җитәрлек булуын тикшерегез." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "Көн һәм вакыт" - -msgid "User" -msgstr "Кулланучы" - -msgid "Action" -msgstr "Гамәл" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Әлеге объектның үзгәртү тарихы юк. Бу идарә итү сайты буенча өстәлмәгән " -"булуы ихтимал." - -msgid "Show all" -msgstr "Бөтенесен күрсәтергә" - -msgid "Save" -msgstr "Сакларга" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Эзләргә" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s нәтиҗә" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "барлыгы %(full_result_count)s" - -msgid "Save as new" -msgstr "Яңа объект итеп сакларга" - -msgid "Save and add another" -msgstr "Сакларга һәм бүтән объектны өстәргә" - -msgid "Save and continue editing" -msgstr "Сакларга һәм төзәтүне дәвам итәргә" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Сайтыбызда үткәргән вакыт өчен рәхмәт." - -msgid "Log in again" -msgstr "Тагын керергә" - -msgid "Password change" -msgstr "Серсүзне үзгәртү" - -msgid "Your password was changed." -msgstr "Серсүзегез үзгәртелгән." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Хәвефсезлек сәбәпле, зинһар, үзегезнең иске серсүзне кертегез, аннан яңа " -"серсүзне ике тапкыр кертегез (дөрес язылышын тикшерү өчен)." - -msgid "Change my password" -msgstr "Серсүземне үзгәртергә" - -msgid "Password reset" -msgstr "Серсүзне торгызу" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Серсүзегез үзгәртелгән. Сез хәзер керә аласыз." - -msgid "Password reset confirmation" -msgstr "Серсүзне торгызу раслау" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Зинһар, тикшерү өчен яңа серсүзегезне ике тапкыр кертегез." - -msgid "New password:" -msgstr "Яңа серсуз:" - -msgid "Confirm password:" -msgstr "Серсүзне раслагыз:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Серсүзне торгызу өчен сылтама хаталы. Бәлки аның белән инде кулланганнар. " -"Зинһар, серсүзне тагын бер тапкыр торгызып карагыз." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "Зинһар, бу сәхифәгә юнәлегез һәм яңа серсүзне кертегез:" - -msgid "Your username, in case you've forgotten:" -msgstr "Сезнең кулланучы исемегез (оныткан булсагыз):" - -msgid "Thanks for using our site!" -msgstr "Безнең сайтны куллану өчен рәхмәт!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s сайтының төркеме" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "Эл. почта адресы:" - -msgid "Reset my password" -msgstr "Серсүземне торгызырга" - -msgid "All dates" -msgstr "Бөтен көннәр" - -#, python-format -msgid "Select %s" -msgstr "%s сайлагыз" - -#, python-format -msgid "Select %s to change" -msgstr "Үзгәртү өчен %s сайлагыз" - -msgid "Date:" -msgstr "Көн:" - -msgid "Time:" -msgstr "Вакыт:" - -msgid "Lookup" -msgstr "Эзләү" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 16af5a0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po deleted file mode 100644 index 36e7c72..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,208 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Рөхсәт ителгән %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Фильтр" - -msgid "Choose all" -msgstr "Барысын сайларга" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "Бетерергә" - -#, javascript-format -msgid "Chosen %s" -msgstr "Сайланган %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s арасыннан %(sel)s сайланган" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Кайбер кырларда сакланмаган төзәтүләр кала. Сез гамәлне башкарсагыз, сезнең " -"сакланмаган үзгәртүләр югалачаклар." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Сез гамәлне сайладыгыз, әмма кайбер кырлардагы төзәтүләрне сакламадыгыз. " -"Аларны саклау өчен OK төймәсенә басыгыз. Аннан соң гамәлне тагын бер тапкыр " -"башкарырга туры килер." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Сез гамәлне сайладыгыз һәм төзәтүләрне башкармадыгыз. Бәлки сез \"Сакларга\" " -"төймәсе урынына \"Башкарырга\" төймәсен кулланырга теләдегез." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" - -msgid "Now" -msgstr "Хәзер" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Вакыт сайлагыз" - -msgid "Midnight" -msgstr "Төн уртасы" - -msgid "6 a.m." -msgstr "Иртәнге 6" - -msgid "Noon" -msgstr "Төш" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Юкка чыгарырга" - -msgid "Today" -msgstr "Бүген" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Кичә" - -msgid "Tomorrow" -msgstr "Иртәгә" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Күрсәтергә" - -msgid "Hide" -msgstr "Яшерергә" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index d51b11a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index df03f5f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,606 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2015-01-18 08:31+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "" - -msgid "Yes" -msgstr "Бен" - -msgid "No" -msgstr "" - -msgid "Unknown" -msgstr "Тодымтэ" - -msgid "Any date" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Past 7 days" -msgstr "" - -msgid "This month" -msgstr "" - -msgid "This year" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "" - -msgid "action time" -msgstr "" - -msgid "object id" -msgstr "" - -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-format -msgid "Changed %s." -msgstr "" - -msgid "and" -msgstr "" - -#, python-format -msgid "Added %(name)s \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed %(list)s for %(name)s \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Deleted %(name)s \"%(object)s\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may add another " -"%(name)s below." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again " -"below." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was changed successfully. You may add another " -"%(name)s below." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s object with primary key %(key)r does not exist." -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "" - -#, python-format -msgid "Change %s" -msgstr "" - -msgid "Database error" -msgstr "" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We're sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "" - -msgid "Log out" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Ӵушоно" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "Тупатъяно" - -msgid "Remove" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent Actions" -msgstr "" - -msgid "My Actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "" - -msgid "(None)" -msgstr "" - -#, python-format -msgid "Select %s" -msgstr "" - -#, python-format -msgid "Select %s to change" -msgstr "" - -msgid "Date:" -msgstr "" - -msgid "Time:" -msgstr "" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo deleted file mode 100644 index af7ab53..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po deleted file mode 100644 index e3826f0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,142 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" - -msgid "Now" -msgstr "" - -msgid "Clock" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Calendar" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" - -msgid "S M T W T F S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index 13b8d2c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index bdac66a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,790 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# abdl erkin <84247764@qq.com>, 2018 -# ABDULLA , 2014 -# Abduqadir Abliz , 2023-2024 -# Azat, 2023 -# Murat Orhun , 2023 -# Natalia, 2023 -# Serpidin Uyghur, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:05+0000\n" -"Last-Translator: Abduqadir Abliz , 2023-2024\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "تاللانغان%(verbose_name_plural)sنى ئۆچۈر" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d%(items)sمۇۋەپپەقىيەتلىك ئۆچۈرۈلدى" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)sنى ئۆچۈرەلمەيدۇ" - -msgid "Are you sure?" -msgstr "جەزىملەشتۈرەمسىز؟" - -msgid "Administration" -msgstr "باشقۇرۇش" - -msgid "All" -msgstr "ھەممىسى" - -msgid "Yes" -msgstr "ھەئە" - -msgid "No" -msgstr "ياق" - -msgid "Unknown" -msgstr "نامەلۇم" - -msgid "Any date" -msgstr "خالىغان چېسلا" - -msgid "Today" -msgstr "بۈگۈن" - -msgid "Past 7 days" -msgstr "ئۆتكەن 7 كۈن" - -msgid "This month" -msgstr "بۇ ئاي" - -msgid "This year" -msgstr "بۇ يىل" - -msgid "No date" -msgstr "چېسلا يوق" - -msgid "Has date" -msgstr "ۋاقتى بار " - -msgid "Empty" -msgstr "بوش" - -msgid "Not empty" -msgstr "بوش ئەمەس" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Please enter the correct %(username)s and password for a staff account. " -"دىققەت ھەر ئىككى بۆلەك چوڭ كىچىك يېزىلىشنى پەرقلەندۈرۈشى مۇمكىن." - -msgid "Action:" -msgstr "ھەرىكەت:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "باشقا %(verbose_name)sنى قوشۇش" - -msgid "Remove" -msgstr "چىقىرىۋەت" - -msgid "Addition" -msgstr "قوشۇش" - -msgid "Change" -msgstr "ئۆزگەرتىش" - -msgid "Deletion" -msgstr "ئۆچۈر" - -msgid "action time" -msgstr "مەشغۇلات ۋاقتى" - -msgid "user" -msgstr "ئىشلەتكۈچى" - -msgid "content type" -msgstr "مەزمۇن تىپى" - -msgid "object id" -msgstr "ئوبىيكىت كىملىكى" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ئوبيېكت ۋەكىلى" - -msgid "action flag" -msgstr "ھەرىكەت بايرىقى" - -msgid "change message" -msgstr "ئۇچۇرنى ئۆزگەرتىش" - -msgid "log entry" -msgstr "خاتىرە تۈرى" - -msgid "log entries" -msgstr "خاتىرە تۈرلىرى" - -#, python-format -msgid "Added “%(object)s”." -msgstr "%(object)sقوشۇلدى" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "%(object)s%(changes)s گە ئۆزگەرتىلدى" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "%(object)sئۆچۈرۈلدى" - -msgid "LogEntry Object" -msgstr "خاتىرە تۈرى ئوبيېكتى" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” قا قوشۇلدى" - -msgid "Added." -msgstr "قوشۇلدى." - -msgid "and" -msgstr "ۋە" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” نىڭ {fields} ئۆزگەرتىلدى" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "ئۆزگەرگەن {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "ئۆچۈرۈلگەن {name} “{object}”" - -msgid "No fields changed." -msgstr "ھېچقانداق مەيدان ئۆزگەرمىدى" - -msgid "None" -msgstr "يوق" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Mac دىكى «كونترول» ياكى «Ctrl» نى بېسىپ ، بىردىن كۆپنى تاللاڭ." - -msgid "Select this object for an action - {}" -msgstr "مەشغۇلات ئۈچۈن ئوبيېكت تاللىنىدۇ-{}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” مۇۋەپپەقىيەتلىك قوشۇلدى." - -msgid "You may edit it again below." -msgstr "تۆۋەندە قايتا تەھرىرلىسىڭىز بولىدۇ." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” مۇۋەپپەقىيەتلىك قوشۇلدى. تۆۋەندە باشقا {name} قوشسىڭىز بولىدۇ." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” مۇۋەپپەقىيەتلىك ئۆزگەرتىلدى. تۆۋەندە ئۇنى قايتا تەھرىرلىسىڭىز " -"بولىدۇ." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” مۇۋەپپەقىيەتلىك ئۆزگەرتىلدى. تۆۋەندە باشقا {name} قوشسىڭىز " -"بولىدۇ." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” مۇۋەپپەقىيەتلىك ئۆزگەرتىلدى." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"ھەرىكەت ئىجرا قىلىش ئۈچۈن تۈرلەر تاللىنىشى كېرەك. ھېچقانداق تۈر " -"ئۆزگەرتىلمىدى." - -msgid "No action selected." -msgstr "ھېچقانداق ھەرىكەت تاللىنمىدى." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s\"%(obj)s\" مۇۋەپپەقىيەتلىك ئۆچۈرۈلدى." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "ID سى \"%(key)s\" بولغان %(name)s مەۋجۇت ئەمەس. بەلكىم ئۇ ئۆچۈرۈلگەن؟" - -#, python-format -msgid "Add %s" -msgstr "%s نى قوش" - -#, python-format -msgid "Change %s" -msgstr "%sنى ئۆزگەرت" - -#, python-format -msgid "View %s" -msgstr "%sكۆرۈش" - -msgid "Database error" -msgstr "ساندان خاتالىقى" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)sنى %(name)sگە ئۆزگەرتىش مۇۋەپپىقىيەتلىك بولدى." -msgstr[1] "%(count)sنى%(name)sگە ئۆزگەرتىش مۇۋەپپىقىيەتلىك بولدى" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "ھەممە%(total_count)sتاللاندى " -msgstr[1] "ھەممە%(total_count)sتاللاندى" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s تۈردىن 0 نى تاللىدىڭىز." - -#, python-format -msgid "Change history: %s" -msgstr "تارىخنى ئۆزگەرتىش: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s%(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s%(instance)s نى ئۆچۈرۈش قوغدالغان تۆۋەندىكى ئۇچۇرلارنى " -"ئۆچۈرۈشنى تەلەپ قىلىدۇ: %(related_objects)s" - -msgid "Django site admin" -msgstr "جانگو تور بېكەت باشقۇرغۇچى" - -msgid "Django administration" -msgstr "جانگو باشقۇرۇش" - -msgid "Site administration" -msgstr "تور بېكەت باشقۇرۇش" - -msgid "Log in" -msgstr "كىرىش" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s باشقۇرۇش" - -msgid "Page not found" -msgstr "بەت تېپىلمىدى" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "كەچۈرۈڭ، لېكىن تەلەب قىلىنغان بەت تېپىلمىدى." - -msgid "Home" -msgstr "باش بەت" - -msgid "Server error" -msgstr "مۇلازىمېتىر خاتالىقى" - -msgid "Server error (500)" -msgstr "مۇلازىمېتىر خاتالىقى (500)" - -msgid "Server Error (500)" -msgstr "مۇلازىمېتىر خاتالىقى (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"خاتالىق كۆرۈلدى. بۇ ئۇچۇر تور بېكەت باشقۇرغۇچىلارغا ئېلخەت ئارقىلىق " -"ئۇقتۇرۇلدى ۋە تېزدىن تۈزۈتۈلىدۇ. سەبرىڭىزگە رەھمەت." - -msgid "Run the selected action" -msgstr "تاللانغان مەشغۇلاتنى ئىجرا قىل" - -msgid "Go" -msgstr "يۆتكەل" - -msgid "Click here to select the objects across all pages" -msgstr "بارلىق بەتلەردىكى ئوبىيكتلەرنى تاللاش ئۈچۈن بۇ يەرنى چېكىڭ." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "بارىلىق %(total_count)s%(module_name)s نى تاللا" - -msgid "Clear selection" -msgstr "تاللىغاننى تازىلا" - -msgid "Breadcrumbs" -msgstr "يول كۆرسەتكۈچى" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s پروگراممىسىدىكى مودېللار" - -msgid "Add" -msgstr "قوش" - -msgid "View" -msgstr "كۆرۈنۈش" - -msgid "You don’t have permission to view or edit anything." -msgstr "سىزنىڭ كۆرۈش ياكى تەھرىرلەش ھوقۇقىڭىز يوق." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"ئالدى بىلەن، ئىشلەتكۈچى ئاتى ۋە ئىم كىرگۈزۈلىدۇ. ئاندىن، تېخىمۇ كۆپ " -"ئىشلەتكۈچى تاللانمىلىرىنى تەھرىرلىيەلەيسىز." - -msgid "Enter a username and password." -msgstr "ئىشلەتكۈچى ئاتى ۋە پارول كىرگۈزۈڭ." - -msgid "Change password" -msgstr "پارولنى ئۆزگەرتىش" - -msgid "Set password" -msgstr "پارول تەڭشەك" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "تۆۋەندىكى خاتالىقلارنى توغرىلاڭ." -msgstr[1] "تۆۋەندىكى خاتالىقلارنى توغرىلاڭ." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "ئىشلەتكۈچى %(username)s ئۈچۈن يېڭى پارول كىرگۈزۈڭ." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"بۇ مەشغۇلات مەزكۇر ئىشلەتكۈچىنىڭ ئىم ئاساسىدىكى دەلىللىشىنى " -"قوزغىتىدۇ" - -msgid "Disable password-based authentication" -msgstr "ئىم ئاساسىدىكى دەلىللەشنى چەكلەيدۇ" - -msgid "Enable password-based authentication" -msgstr "ئىم ئاساسىدىكى دەلىللەشنى قوزغىتىدۇ" - -msgid "Skip to main content" -msgstr "ئاساسلىق مەزمۇنغا ئاتلا" - -msgid "Welcome," -msgstr "مەرھابا،" - -msgid "View site" -msgstr "بېكەتنى كۆرۈش " - -msgid "Documentation" -msgstr "قوللانمىلار" - -msgid "Log out" -msgstr "چىكىنىش" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)sنى قوشۇش" - -msgid "History" -msgstr "تارىخ" - -msgid "View on site" -msgstr "بېكەتتە كۆرۈش " - -msgid "Filter" -msgstr "سۈزگۈچ" - -msgid "Hide counts" -msgstr "ساناقنى يوشۇر" - -msgid "Show counts" -msgstr "ساناقنى كۆرسەت" - -msgid "Clear all filters" -msgstr "ھەممە سۈزگۈچلەرنى تازىلا" - -msgid "Remove from sorting" -msgstr "تەرتىپلەشتىن چىقىرىۋەت" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "تەرتىپلەش دەرىجىسى: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "تەرتىپلەشنى ئالماشتۇرۇش" - -msgid "Toggle theme (current theme: auto)" -msgstr "تېمىنى ئالماشتۇرۇش (ھازىرقى تېما: ئاپتوماتىك)" - -msgid "Toggle theme (current theme: light)" -msgstr "تېمىنى ئالماشتۇرۇش (ھازىرقى تېما: يورۇق)" - -msgid "Toggle theme (current theme: dark)" -msgstr "تېمىنى ئالماشتۇرۇش (ھازىرقى تېما: قارا)" - -msgid "Delete" -msgstr "ئۆچۈر" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s%(escaped_object)s نى ئۆچۈرۈش، ئۇنىڭغا باغلىق نەرسىلەرنى " -"ئۆچۈرۈشكە زۆرۈرلىنىدۇ ، لېكىن سىزنىڭ ھېساباتىڭىزدا تۆۋەندىكى تۈرلەرنى " -"ئۆچۈرۈش ھوقۇقى يوق:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s 's '%(escaped_object)s' نى ئۆچۈرۈش، تۆۋەندىكى قوغداق " -"قوغدالغان ئۇچۇرلارنى ئۆچۈرۈشنى تەلەپ قىلىدۇ:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s %(escaped_object)s نى راستلا ئۆچۈرۈشنى خالامسىز؟ تۆۋەندىكى " -"بارلىق باغلىق تۈرلەر ئۆچۈرۈلىدۇ:" - -msgid "Objects" -msgstr "ئوبىيكتلار" - -msgid "Yes, I’m sure" -msgstr "ھەئە، شۇنداق" - -msgid "No, take me back" -msgstr "ياق، كەينىگە ياندۇر" - -msgid "Delete multiple objects" -msgstr "كۆپ ئوبىيكتنى ئ‍ۆچۈرۈش" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"تاللانغان %(objects_name)s نى ئۆچۈرۈش، ئۇنىڭغا باغلىق نەرسىلەرنى ئۆچۈرۈشكە " -"ئۆتۈرۈلۈدۇ، لېكىن سىزنىڭ ھېساباتىڭىزدا تۆۋەندىكى تۈرلەرنى ئۆچۈرۈش ھوقۇقى يوق:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"تاللانغان %(objects_name)s نى ئۆچۈرۈش، تۆۋەندىكى قوغداق قوغدالغان ئۇچۇرلارنى " -"ئۆچۈرۈشنى تەلەپ قىلىدۇ:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"تاللانغان %(objects_name)s نى راستلا ئۆچۈرۈشنى خالامسىز؟ تۆۋەندىكى بارلىق " -"نەرسىلەر ۋە ئۇلارغا باغلىق تۈرلەر ئۆچۈرۈلىدۇ:" - -msgid "Delete?" -msgstr "ئۆچۈرۈۋېتەمسىز؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s بويىچە" - -msgid "Summary" -msgstr "ئۈزۈندە" - -msgid "Recent actions" -msgstr "يېقىنقى مەشغۇلاتلار" - -msgid "My actions" -msgstr "مەشغۇلاتلىرىم" - -msgid "None available" -msgstr "ھېچنېمە يوق" - -msgid "Added:" -msgstr "قوشۇلدى:" - -msgid "Changed:" -msgstr "ئۆزگەردى:" - -msgid "Deleted:" -msgstr "ئۆچۈرۈلدى:" - -msgid "Unknown content" -msgstr "بەلگىلەنمىگەن مەزمۇن" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"سىزنىڭ مەلۇمات سانداننىڭ ئورنىتىشىدا بىرنەمە مەسىلە بار. توغرا ساندان " -"جەدۋىلى قۇرۇلغانلىقىنى جەزملەڭ، ۋە سانداننىڭ توغرا ئىشلەتكۈچى تەرىپىدىن " -"ئوقۇلىدىغانلىقىنى جەزملەڭ." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"سىز %(username)s دېگەن ئىشلەتكۈچى ھېساباتى بىلەن كىرگەنسىز، لېكىن بۇ بەتكە " -"كىرىش ھوقۇقىڭىز يوق. باشقا ھېساباتقا كىرىشنى خالامسىز؟" - -msgid "Forgotten your password or username?" -msgstr "پارول ياكى ئىشلەتكۈچى ئاتىڭىزنى ئۇنتۇپ قالدىڭىزمۇ؟" - -msgid "Toggle navigation" -msgstr "يۆل باشلىغۇچنى ئالماشتۇرۇش" - -msgid "Sidebar" -msgstr "يان بالداق" - -msgid "Start typing to filter…" -msgstr " فىلتىرلاش ئۈچۈن يېزىشنى باشلاڭ…" - -msgid "Filter navigation items" -msgstr "يۆل باشقۇرۇش تۈرلەرىنى سۈزۈش" - -msgid "Date/time" -msgstr "چېسلا/ۋاقىت" - -msgid "User" -msgstr "ئىشلەتكۈچى" - -msgid "Action" -msgstr "مەشغۇلات" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "تۈرى" -msgstr[1] "تۈرى" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"بۇ ئوبىيكتنىڭ ئۆزگەرتىش تارىخى يوق. بۇنى مۇمكىن بۇ باشقۇرۇش بېتى ئارقىلىق " -"قوشمىغان بولۇشى مۇمكىن." - -msgid "Show all" -msgstr "ھەممىنى كۆرسەت" - -msgid "Save" -msgstr "ساقلا" - -msgid "Popup closing…" -msgstr "قاڭقىشنى تاقاۋاتىدۇ…" - -msgid "Search" -msgstr "ئىزدە" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s نەتىجە" -msgstr[1] "%(counter)s نەتىجەسى" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s جەمى" - -msgid "Save as new" -msgstr "يېڭىدىن ساقلاش" - -msgid "Save and add another" -msgstr "ساقلاپ يېڭىسىنى قوشۇش" - -msgid "Save and continue editing" -msgstr "تەھرىرلەشنى داۋاملاشتۇرۇپ ساقلاش" - -msgid "Save and view" -msgstr "ساقلاش ۋە كۆرۈش" - -msgid "Close" -msgstr "ياپ" - -#, python-format -msgid "Change selected %(model)s" -msgstr "تاللانغان%(model)sنى ئۆزگەرت" - -#, python-format -msgid "Add another %(model)s" -msgstr "باشقا %(model)s قوش" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "تاللىغان %(model)s نى ئۆچۈر" - -#, python-format -msgid "View selected %(model)s" -msgstr "تاللىغان %(model)s نى كۆرسەت" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "بۈگۈن تور بېكەتتە ساپالىق ۋاقىت سەرىب قىلغىنىڭىزغا رەھمەت." - -msgid "Log in again" -msgstr "قايتا كىرىڭ" - -msgid "Password change" -msgstr "پارولنى ئۆزگەرتىش" - -msgid "Your password was changed." -msgstr "پارولىڭىز ئۆزگەرتىلگەن" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"بىخەتەرلىك ئۈچۈن ئەسلى پارولىڭىزنى كىرگۈزۈڭ، ئاندىن يېڭى پارولىڭىزنى ئىككى " -"قېتىم كىرگۈزۈڭ، بۇنىڭ ئارقىلىق سىز توغرا يېزىب بولغىنىڭىزنى دەلىللەيمىز." - -msgid "Change my password" -msgstr "پارولىمنى ئۆزگەرتىىمەن" - -msgid "Password reset" -msgstr "ئىمنى ئەسلىگە قايتۇرۇش" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "پارول ئۆزگەرتىلدى. داۋاملاشتۇرۇپ تىزىمغا كىرسىڭىز بولىدۇ." - -msgid "Password reset confirmation" -msgstr "پارول ئەسلىگە قايتۇرۇشنى جەزملەش" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"يېڭى پارولىڭىزنى ئىككى قېتىم كىرگۈزۈڭ، بۇنىڭ ئارقىلىق سىز توغرا كىرگۈزۈب " -"بولغىنىڭىزنى دەلىللەيمىز." - -msgid "New password:" -msgstr "يېڭى پارول:" - -msgid "Confirm password:" -msgstr "پارولنى جەزملە:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"پارولنى قايتا بەلگىلەش ئۈچۈن بېرىلگەن ئۇلانما ئىناۋەتسىز بولدى، بۇ ئۇلانما " -"ئاللىبۇرۇن ئىشلىتىلگەن بولۇشى مۇمكىن. يېڭى پارولنى قايتا بەلگىلەش ئۈچۈن " -"ئىلتىماس قىلىڭ." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"سىز كىرگۈزگەن ئېلخەت ئادرېسىغا ھېسابات بولسا، پارول قويۇش ئۈچۈن سىزگە ئېلخەت " -"ئارقىلىق چۈشەندۈرۈش يوللىدۇق. سىز قىسقا ۋاقىت ئىچىدە ئۇخەتنى تاپشۇرۇب " -"ئېلىشىڭىز كېرەك." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"ئېلخەت تاپشۇرۇپ ئالمىغان بولسىڭىز، تىزىملىتىپ بولغان ئېلخەت ئادرېسىڭىزنى " -"توغرا كىرگۈزگەنلىكىڭىزنى جەزملەڭ ۋە ئېلخەت ئادرېسىڭىزنىڭ ئەخلەت ساندۇغىنى " -"تەكشۈرۈڭ." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"سىز بۇ ئېلخەتنى تاپشۇرۇب ئالدىڭىز، چۈنكى ، %(site_name)s دىكى ئىشلەتكۈچى " -"ھېساباتىڭىزنىڭ پارولىنى قايتا بەلگىلەشنى ئىلتىماس قىلدى." - -msgid "Please go to the following page and choose a new password:" -msgstr "كىيىنكى بەتكە كىرىڭ ۋە بىر شىفرە تاللاڭ:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "ئىشلەتكۈچى ئىسمىڭىز، ئۇنتۇپ قالغان ئەھۋال ئاستىدا:" - -msgid "Thanks for using our site!" -msgstr "تور بېكىتىمىزنى ئىشلەتكىنىڭىز ئۈچۈن رەھمەت!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s قوشۇنى" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"شىفرىڭىزنى ئۇنتۇپ قالدىڭىزمۇ؟ تۆۋەنگە ئېلىكتىرونلۇق ئېلىخەت ئادرىسىڭىزنى " -"كىرگۈزۈڭ، يېڭىسىنى تەڭشەش ئۈچۈن كۆرسەتمىلىك ئېلىخەت ئەۋەتىمىز ." - -msgid "Email address:" -msgstr "ئېلخەت ئادرېسى:" - -msgid "Reset my password" -msgstr "پارولىمنى قايتا بەلگىلەش" - -msgid "Select all objects on this page for an action" -msgstr "مەشغۇلات ئۈچۈن بۇ بەتتىكى ھەممە ئوبيېكت تاللىنىدۇ" - -msgid "All dates" -msgstr "بارلىق چىسلا" - -#, python-format -msgid "Select %s" -msgstr "%sنى تاللاش" - -#, python-format -msgid "Select %s to change" -msgstr "تاللانغان %sنى ئۆزگەرتش" - -#, python-format -msgid "Select %s to view" -msgstr "تاللانغان %sنى كۆرۈش" - -msgid "Date:" -msgstr "چېسلا:" - -msgid "Time:" -msgstr "ۋاقتى:" - -msgid "Lookup" -msgstr "ئىزدە" - -msgid "Currently:" -msgstr "نۆۋەتتە:" - -msgid "Change:" -msgstr "ئۆزگەرتىش:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo deleted file mode 100644 index a066227..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po deleted file mode 100644 index 90c0a88..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,323 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abduqadir Abliz , 2023 -# Azat, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Abduqadir Abliz , 2023\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "ئىشلەتكىلى بولىدىغانى %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"بۇ، تاللاشقا بولىدىغان %s تىزىملىكى. تۆۋەندىكى تىزىملىكلەر ئارىسىدىن " -"بەزىلىرنى تاللاڭ ئاندىن «تاللاش» نى چېكىڭ." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "بۇ رامكىغا يېزىش ئارقىلىق قاتناشقىلى بولىدىغان %s تىزىملىكىنى سۈزۈڭ." - -msgid "Filter" -msgstr "سۈزگۈچ" - -msgid "Choose all" -msgstr "ھەممىنى تاللا" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "بېسىب بارلىق تاللانغان %sنىڭ ھەممىسىنى تاللاڭ" - -msgid "Choose" -msgstr "تاللا" - -msgid "Remove" -msgstr "چىقىرىۋەت" - -#, javascript-format -msgid "Chosen %s" -msgstr "تاللانغانلىرى %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"بۇ، تاللانغان %s تىزىملىكى. تۆۋەندىكى تىزىملىكلەر ئارىسىدىن بەزىلىرنى " -"تاللاڭ ئاندىن «چىقىرىش» نى چېكىڭ." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "بۇ رامكىغا يېزىش ئارقىلىق تاللانغان %s سۈزۈڭ." - -msgid "Remove all" -msgstr "ھەممىنى چىقىرىۋەت" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "بېسىب بارلىق تاللانغان %sنىڭ ھەممىسىنى چىقىرىۋېتىڭ" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s تاللانغانلىرى كۆرۈنمەيدۇ" -msgstr[1] "%s تاللانغانلىرى كۆرۈنمەيدۇ" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s دىن %(cnt)s سى تاللاندى" -msgstr[1] "%(sel)s دىن %(cnt)s سى تاللاندى" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"سىزنىڭ تېخى ساقلانمىغان ئۆزگەرتىشلىرىڭىز بار. ئەگەر سىز مەشخۇلاتىڭىزنى " -"داۋاملاشتۇرسىڭىز، ساقلانمىغان ئۆزگەرتىشلىرىڭىز يوقاب كېتىشى مۇمكىن" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"سىز بىر مەشخۇلاتنى تاللىدىڭىز، ئەمما ئۆزگەرتىشلىرىڭىزنى ساقلىمىدىڭىز. ھەئە " -"نى بېسىب ساقلاڭ. ئاندىن مەشخۇلاتىڭىزنى قايتىدىن ئېلىب بېرىڭ." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"سىز بىر ھەرىكەتنى تاللىدىڭىز ، ھەمدە ئايرىم ساھەدە ھېچقانداق ئۆزگەرتىش ئېلىپ " -"بارمىدىڭىز. سىز «ساقلاش» كۇنۇپكىسىنى ئەمەس ، بەلكى Go كۇنۇپكىسىنى " -"ئىزدەۋاتقان بولۇشىڭىز مۇمكىن." - -msgid "Now" -msgstr "ھازىرلا" - -msgid "Midnight" -msgstr "يېرىم كېچە" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "چۈش" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئالدىدا." -msgstr[1] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئالدىدا." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئارقىدا." -msgstr[1] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئارقىدا." - -msgid "Choose a Time" -msgstr "بىر ۋاقىت تاللاڭ" - -msgid "Choose a time" -msgstr "بىر ۋاقىت تاللاڭ" - -msgid "Cancel" -msgstr "ۋاز كەچ" - -msgid "Today" -msgstr "بۈگۈن" - -msgid "Choose a Date" -msgstr "بىر چېسلا تاللاڭ" - -msgid "Yesterday" -msgstr "تۈنۈگۈن" - -msgid "Tomorrow" -msgstr "ئەتە" - -msgid "January" -msgstr "يانۋار" - -msgid "February" -msgstr "فېۋرال" - -msgid "March" -msgstr "مارت" - -msgid "April" -msgstr "ئاپرىل" - -msgid "May" -msgstr "ماي" - -msgid "June" -msgstr "ئىيۇن" - -msgid "July" -msgstr "ئىيۇل" - -msgid "August" -msgstr "ئاۋغۇست" - -msgid "September" -msgstr "سىنتەبىر" - -msgid "October" -msgstr "ئۆكتەبىر" - -msgid "November" -msgstr "نويابىر" - -msgid "December" -msgstr "دىكابىر" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "يانۋار" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "فېۋرال" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "مارت" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "ئاپرېل" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "ماي" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "ئىيۇن" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "ئىيۇل" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "ئاۋغۇست" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "سېنتەبىر" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "ئۆكتەبىر" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "نويابىر" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "دىكابىر" - -msgid "Sunday" -msgstr "يەكشەنبە" - -msgid "Monday" -msgstr "دۈشەنبە" - -msgid "Tuesday" -msgstr "سەيشەنبە" - -msgid "Wednesday" -msgstr "چارشەمبە" - -msgid "Thursday" -msgstr "پەيشەمبە" - -msgid "Friday" -msgstr "جۈمە" - -msgid "Saturday" -msgstr "شەنبە" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "ي" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "د" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "س" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "چ" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "پ" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "ج" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "ش" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "W" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "كۆرسەت" - -msgid "Hide" -msgstr "يوشۇر" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index 6a4d653..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index 49e319b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,810 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abbl Kto , 2021 -# Oleksandr Chernihov , 2014 -# Andriy Sokolovskiy , 2015 -# Boryslav Larin , 2011 -# Denys Pidlisnyi , 2016 -# Igor Melnyk, 2014,2017 -# Illia Volochii , 2021-2023,2025 -# Ivan Dmytrenko , 2019 -# Jannis Leidel , 2011 -# Kirill Gagarski , 2015 -# Max V. Stotsky , 2014 -# Mikhail Kolesnik , 2015 -# Mykola Holovetskyi, 2022 -# Mykola Zamkovoi , 2014 -# Sergiy Kuzmenko , 2011 -# tarasyyyk , 2018 -# Zoriana Zaiats, 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Illia Volochii , 2021-2023,2025\n" -"Language-Team: Ukrainian (http://app.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Видалити обрані %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Успішно видалено %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Не вдається видалити %(name)s" - -msgid "Delete multiple objects" -msgstr "Видалити кілька об'єктів" - -msgid "Administration" -msgstr "Адміністрування" - -msgid "All" -msgstr "Всі" - -msgid "Yes" -msgstr "Так" - -msgid "No" -msgstr "Ні" - -msgid "Unknown" -msgstr "Невідомо" - -msgid "Any date" -msgstr "Будь-яка дата" - -msgid "Today" -msgstr "Сьогодні" - -msgid "Past 7 days" -msgstr "Останні 7 днів" - -msgid "This month" -msgstr "Цього місяця" - -msgid "This year" -msgstr "Цього року" - -msgid "No date" -msgstr "Без дати" - -msgid "Has date" -msgstr "Має дату" - -msgid "Empty" -msgstr "Порожні" - -msgid "Not empty" -msgstr "Непорожні" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Будь ласка, введіть правильні %(username)s і пароль для облікового запису " -"персоналу. Зауважте, що обидва поля можуть бути чутливі до регістру." - -msgid "Action:" -msgstr "Дія:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Додати ще %(verbose_name)s" - -msgid "Remove" -msgstr "Видалити" - -msgid "Addition" -msgstr "Додавання" - -msgid "Change" -msgstr "Змінити" - -msgid "Deletion" -msgstr "Видалення" - -msgid "action time" -msgstr "час дії" - -msgid "user" -msgstr "користувач" - -msgid "content type" -msgstr "тип вмісту" - -msgid "object id" -msgstr "id об'єкта" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "представлення об'єкта (repr)" - -msgid "action flag" -msgstr "позначка дії" - -msgid "change message" -msgstr "змінити повідомлення" - -msgid "log entry" -msgstr "запис у журналі" - -msgid "log entries" -msgstr "записи в журналі" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Додано \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Змінено \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Видалено \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Об'єкт журнального запису" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Додано {name} \"{object}\"." - -msgid "Added." -msgstr "Додано." - -msgid "and" -msgstr "та" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Змінені {fields} для {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Змінені {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Видалено {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Поля не змінені." - -msgid "None" -msgstr "Ніщо" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Натисність \"Control\" або \"Command\" на Mac-пристрої, щоб вибрати більше " -"аніж один." - -msgid "Select this object for an action - {}" -msgstr "Вибрати цей об'єкт для дії – {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" було додано успішно." - -msgid "You may edit it again below." -msgstr "Ви можете відредагувати це знову." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} \"{obj}\" було змінено успішно. Ви можете додати інше {name}." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" було змінено успішно. Нижче Ви можете редагувати його знову." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" було змінено успішно. Ви можете додати інше {name}." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" було змінено успішно." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Для виконання дії необхідно обрати елемент. Жодний елемент не був змінений." - -msgid "No action selected." -msgstr "Дія не обрана." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" був видалений успішно." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s з ID \"%(key)s\" не існує. Можливо, воно було видалене?" - -#, python-format -msgid "Add %s" -msgstr "Додати %s" - -#, python-format -msgid "Change %s" -msgstr "Змінити %s" - -#, python-format -msgid "View %s" -msgstr "Переглянути %s" - -msgid "Database error" -msgstr "Помилка бази даних" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s був успішно змінений." -msgstr[1] "%(count)s %(name)s були успішно змінені." -msgstr[2] "%(count)s %(name)s було успішно змінено." -msgstr[3] "%(count)s %(name)s було успішно змінено." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s обраний" -msgstr[1] "%(total_count)s обрані" -msgstr[2] "Усі %(total_count)s обрано" -msgstr[3] "Усі %(total_count)s обрано" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 з %(cnt)s обрано" - -msgid "Delete" -msgstr "Видалити" - -#, python-format -msgid "Change history: %s" -msgstr "Історія змін: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Видалення %(class_name)s %(instance)s вимагатиме видалення наступних " -"захищених пов'язаних об'єктів: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django сайт адміністрування" - -msgid "Django administration" -msgstr "Django адміністрування" - -msgid "Site administration" -msgstr "Адміністрування сайта" - -msgid "Log in" -msgstr "Увійти" - -#, python-format -msgid "%(app)s administration" -msgstr "Адміністрування %(app)s" - -msgid "Page not found" -msgstr "Сторінка не знайдена" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "На жаль, запрошену сторінку не знайдено." - -msgid "Home" -msgstr "Домівка" - -msgid "Server error" -msgstr "Помилка сервера" - -msgid "Server error (500)" -msgstr "Помилка сервера (500)" - -msgid "Server Error (500)" -msgstr "Помилка сервера (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Сталася помилка. Вона була відправлена адміністраторам сайту через email і " -"має бути вирішена швидко. Дякуємо за ваше терпіння." - -msgid "Run the selected action" -msgstr "Виконати обрану дію" - -msgid "Go" -msgstr "Вперед" - -msgid "Click here to select the objects across all pages" -msgstr "Натисніть тут, щоб вибрати об'єкти на всіх сторінках" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Обрати всі %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Скинути вибір" - -msgid "Breadcrumbs" -msgstr "Навігаційний рядок" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Моделі у %(name)s додатку" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Додати" - -msgid "View" -msgstr "Переглянути" - -msgid "You don’t have permission to view or edit anything." -msgstr "Ви не маєте дозволу переглядати чи редагувати будь-чого." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Змінити пароль" - -msgid "Set password" -msgstr "Встановити пароль" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Будь ласка, виправте наведену нижче помилку." -msgstr[1] "Будь ласка, виправте наведені нижче помилки." -msgstr[2] "Будь ласка, виправте наведені нижче помилки." -msgstr[3] "Будь ласка, виправте наведені нижче помилки." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Введіть новий пароль для користувача %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Ця дія увімкне автентифікацію на основі пароля для " -"користувача." - -msgid "Disable password-based authentication" -msgstr "Вимкнути автентифікацію на основі паролю" - -msgid "Enable password-based authentication" -msgstr "Увімкнути автентифікацію на основі паролю" - -msgid "Skip to main content" -msgstr "Перейти до основного вмісту" - -msgid "Welcome," -msgstr "Вітаємо," - -msgid "View site" -msgstr "Дивитися сайт" - -msgid "Documentation" -msgstr "Документація" - -msgid "Log out" -msgstr "Вийти" - -#, python-format -msgid "Add %(name)s" -msgstr "Додати %(name)s" - -msgid "History" -msgstr "Історія" - -msgid "View on site" -msgstr "Дивитися на сайті" - -msgid "Filter" -msgstr "Відфільтрувати" - -msgid "Hide counts" -msgstr "Приховати кількість" - -msgid "Show counts" -msgstr "Показати кількість" - -msgid "Clear all filters" -msgstr "Очистити всі фільтри" - -msgid "Remove from sorting" -msgstr "Видалити з сортування" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Пріорітет сортування: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Сортувати в іншому напрямку" - -msgid "Toggle theme (current theme: auto)" -msgstr "Перемкнути тему (поточна тема: автоматична)" - -msgid "Toggle theme (current theme: light)" -msgstr "Перемкнути тему (поточна тема: світла)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Перемкнути тему (поточна тема: темна)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Видалення %(object_name)s '%(escaped_object)s' призведе до видалення " -"пов'язаних об'єктів, але ваш реєстраційний запис не має дозволу видаляти " -"наступні типи об'єктів:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Видалення %(object_name)s '%(escaped_object)s' вимагатиме видалення " -"наступних пов'язаних об'єктів:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ви впевнені, що хочете видалити %(object_name)s \"%(escaped_object)s\"? Всі " -"пов'язані записи, що перелічені, будуть видалені:" - -msgid "Objects" -msgstr "Об'єкти" - -msgid "Yes, I’m sure" -msgstr "Так, я впевнений" - -msgid "No, take me back" -msgstr "Ні, повернутись назад" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Видалення обраних %(objects_name)s вимагатиме видалення пов'язаних об'єктів, " -"але ваш обліковий запис не має прав для видалення таких типів об'єктів:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Видалення обраних %(objects_name)s вимагатиме видалення наступних захищених " -"пов'язаних об'єктів:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ви впевнені, що хочете видалити вибрані %(objects_name)s? Всі вказані " -"об'єкти та пов'язані з ними елементи будуть видалені:" - -msgid "Delete?" -msgstr "Видалити?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "За %(filter_title)s" - -msgid "Summary" -msgstr "Резюме" - -msgid "Recent actions" -msgstr "Недавні дії" - -msgid "My actions" -msgstr "Мої дії" - -msgid "None available" -msgstr "Немає" - -msgid "Added:" -msgstr "Додано:" - -msgid "Changed:" -msgstr "Змінено:" - -msgid "Deleted:" -msgstr "Видалено:" - -msgid "Unknown content" -msgstr "Невідомий зміст" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Щось не так з інсталяцією бази даних. Запевніться, що певні таблиці бази " -"даних були створені і що вона може бути прочитана певним користувачем." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Ви аутентифіковані як %(username)s, але вам не надано доступ до цієї " -"сторінки.\n" -"Ввійти в інший аккаунт?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Увімкнути навігацію" - -msgid "Sidebar" -msgstr "Бічна панель" - -msgid "Start typing to filter…" -msgstr "Почніть писати для фільтру..." - -msgid "Filter navigation items" -msgstr "Фільтрувати навігаційні об'єкти" - -msgid "Date/time" -msgstr "Дата/час" - -msgid "User" -msgstr "Користувач" - -msgid "Action" -msgstr "Дія" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "запис" -msgstr[1] "записи" -msgstr[2] "записи" -msgstr[3] "записи" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Цей об'єкт не має історії змін. Напевно, він був доданий не через цей сайт " -"адміністрування." - -msgid "Show all" -msgstr "Показати всі" - -msgid "Save" -msgstr "Зберегти" - -msgid "Popup closing…" -msgstr "Закриття спливаючого вікна" - -msgid "Search" -msgstr "Пошук" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s результат" -msgstr[1] "%(counter)s результати" -msgstr[2] "%(counter)s результатів" -msgstr[3] "%(counter)s результатів" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s всього" - -msgid "Save as new" -msgstr "Зберегти як нове" - -msgid "Save and add another" -msgstr "Зберегти і додати інше" - -msgid "Save and continue editing" -msgstr "Зберегти і продовжити редагування" - -msgid "Save and view" -msgstr "Зберегти і переглянути" - -msgid "Close" -msgstr "Закрити" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Змінити обрану %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Додати ще одну %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Видалити обрану %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Переглянути обрану %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Дякуємо за час, який був проведений сьогодні на сайті." - -msgid "Log in again" -msgstr "Увійти знову" - -msgid "Password change" -msgstr "Зміна паролю" - -msgid "Your password was changed." -msgstr "Ваш пароль було змінено." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Будь ласка введіть ваш старий пароль, заради безпеки, після цього введіть " -"ваш новий пароль двічі для верифікації коректності написаного." - -msgid "Change my password" -msgstr "Змінити мій пароль" - -msgid "Password reset" -msgstr "Перевстановлення паролю" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Пароль встановлено. Ви можете увійти зараз." - -msgid "Password reset confirmation" -msgstr "Підтвердження перевстановлення паролю" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Будь ласка, введіть ваш старий пароль, задля безпеки, потім введіть ваш " -"новий пароль двічі для перевірки." - -msgid "New password:" -msgstr "Новий пароль:" - -msgid "Confirm password:" -msgstr "Підтвердіть пароль:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Посилання на перевстановлення паролю було помилковим. Можливо тому, що воно " -"було вже використано. Будь ласка, замовте нове перевстановлення паролю." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Ми відправили вам інструкції для встановлення пароля, якщо обліковий запис з " -"введеною адресою існує. Ви маєте отримати їх найближчим часом." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Якщо Ви не отримали електронного листа, переконайтеся, будь ласка, в " -"зареєстрованій адресі і перевірте папку \"Спам\"." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ви отримали цей лист через те, що зробили запит на перевстановлення пароля " -"для облікового запису користувача на %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Будь ласка, перейдіть на цю сторінку, та оберіть новий пароль:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Дякуємо за користування нашим сайтом!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Команда сайту %(site_name)s " - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Забули пароль? Введіть свою email-адресу нижче і ми відправимо вам " -"інструкції по встановленню нового." - -msgid "Email address:" -msgstr "Email адреса:" - -msgid "Reset my password" -msgstr "Перевстановіть мій пароль" - -msgid "Select all objects on this page for an action" -msgstr "Обрати всі об'єкти на сторінці для дії" - -msgid "All dates" -msgstr "Всі дати" - -#, python-format -msgid "Select %s" -msgstr "Вибрати %s" - -#, python-format -msgid "Select %s to change" -msgstr "Виберіть %s щоб змінити" - -#, python-format -msgid "Select %s to view" -msgstr "Вибрати %s для перегляду" - -msgid "Date:" -msgstr "Дата:" - -msgid "Time:" -msgstr "Час:" - -msgid "Lookup" -msgstr "Пошук" - -msgid "Currently:" -msgstr "На даний час:" - -msgid "Change:" -msgstr "Змінено:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 1c8ab17..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po deleted file mode 100644 index 310826f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,323 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Oleksandr Chernihov , 2014 -# Boryslav Larin , 2011 -# Denys Pidlisnyi , 2016 -# Illia Volochii , 2021,2025 -# Jannis Leidel , 2011 -# Panasoft, 2016 -# Sergey Lysach , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Illia Volochii , 2021,2025\n" -"Language-Team: Ukrainian (http://app.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "В наявності %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Почніть вводити текст в цьому полі щоб відфільтрувати список доступних %s." - -msgid "Filter" -msgstr "Фільтр" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Обрано %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Обрано %(sel)s з %(cnt)s" -msgstr[1] "Обрано %(sel)s з %(cnt)s" -msgstr[2] "Обрано %(sel)s з %(cnt)s" -msgstr[3] "Обрано %(sel)s з %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Ви зробили якісь зміни у деяких полях. Якщо Ви виконаєте цю дію, всі " -"незбережені зміни буде втрачено." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Зараз" - -msgid "Midnight" -msgstr "Північ" - -msgid "6 a.m." -msgstr "6" - -msgid "Noon" -msgstr "Полудень" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Примітка: Ви на %s годину попереду серверного часу." -msgstr[1] "Примітка: Ви на %s години попереду серверного часу." -msgstr[2] "Примітка: Ви на %s годин попереду серверного часу." -msgstr[3] "Примітка: Ви на %s годин попереду серверного часу." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Примітка: Ви на %s годину позаду серверного часу." -msgstr[1] "Примітка: Ви на %s години позаду серверного часу." -msgstr[2] "Примітка: Ви на %s годин позаду серверного часу." -msgstr[3] "Примітка: Ви на %s годин позаду серверного часу." - -msgid "Choose a Time" -msgstr "Оберіть час" - -msgid "Choose a time" -msgstr "Оберіть час" - -msgid "Cancel" -msgstr "Відмінити" - -msgid "Today" -msgstr "Сьогодні" - -msgid "Choose a Date" -msgstr "Оберіть дату" - -msgid "Yesterday" -msgstr "Вчора" - -msgid "Tomorrow" -msgstr "Завтра" - -msgid "January" -msgstr "січня" - -msgid "February" -msgstr "лютого" - -msgid "March" -msgstr "березня" - -msgid "April" -msgstr "квітня" - -msgid "May" -msgstr "травня" - -msgid "June" -msgstr "червня" - -msgid "July" -msgstr "липня" - -msgid "August" -msgstr "серпня" - -msgid "September" -msgstr "вересня" - -msgid "October" -msgstr "жовтня" - -msgid "November" -msgstr "листопада" - -msgid "December" -msgstr "грудня" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Січ." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Лют." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Берез." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Квіт." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Трав." - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Черв." - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Лип." - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Серп." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Верес." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Жовт." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Листоп." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Груд." - -msgid "Sunday" -msgstr "Неділя" - -msgid "Monday" -msgstr "Понеділок" - -msgid "Tuesday" -msgstr "Вівторок" - -msgid "Wednesday" -msgstr "Середа" - -msgid "Thursday" -msgstr "Четвер" - -msgid "Friday" -msgstr "П'ятниця" - -msgid "Saturday" -msgstr "Субота" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Нд" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Пн" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Вт" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Ср" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Чт" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Пт" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Сб" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "В" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index 0735f5d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index 81ef111..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,661 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s کو کامیابی سے مٹا دیا گیا۔" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s نہیں مٹایا جا سکتا" - -msgid "Are you sure?" -msgstr "آپ کو یقین ھے؟" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "منتخب شدہ %(verbose_name_plural)s مٹائیں" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "تمام" - -msgid "Yes" -msgstr "ھاں" - -msgid "No" -msgstr "نھیں" - -msgid "Unknown" -msgstr "نامعلوم" - -msgid "Any date" -msgstr "کوئی تاریخ" - -msgid "Today" -msgstr "آج" - -msgid "Past 7 days" -msgstr "گزشتہ سات دن" - -msgid "This month" -msgstr "یہ مھینہ" - -msgid "This year" -msgstr "یہ سال" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "کاروائی:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "دوسرا %(verbose_name)s درج کریں" - -msgid "Remove" -msgstr "خارج کریں" - -msgid "action time" -msgstr "کاروائی کا وقت" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "شے کا شناختی نمبر" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "شے کا نمائندہ" - -msgid "action flag" -msgstr "کاروائی کا پرچم" - -msgid "change message" -msgstr "پیغام تبدیل کریں" - -msgid "log entry" -msgstr "لاگ کا اندراج" - -msgid "log entries" -msgstr "لاگ کے اندراج" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "اور" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "کوئی خانہ تبدیل نھیں کیا گیا۔" - -msgid "None" -msgstr "کوئی نھیں" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"اشیاء پر کاروائی سرانجام دینے کے لئے ان کا منتخب ھونا ضروری ھے۔ کوئی شے " -"تبدیل نھیں کی گئی۔" - -msgid "No action selected." -msgstr "کوئی کاروائی منتخب نھیں کی گئی۔" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" کامیابی سے مٹایا گیا تھا۔" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s کا اضافہ کریں" - -#, python-format -msgid "Change %s" -msgstr "%s تبدیل کریں" - -msgid "Database error" -msgstr "ڈیٹا بیس کی خرابی" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s کامیابی سے تبدیل کیا گیا تھا۔" -msgstr[1] "%(count)s %(name)s کامیابی سے تبدیل کیے گئے تھے۔" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s منتخب کیا گیا۔" -msgstr[1] "تمام %(total_count)s منتخب کئے گئے۔" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s میں سے 0 منتخب کیا گیا۔" - -#, python-format -msgid "Change history: %s" -msgstr "%s کی تبدیلی کا تاریخ نامہ" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "منتظم برائے جینگو سائٹ" - -msgid "Django administration" -msgstr "انتظامیہ برائے جینگو سائٹ" - -msgid "Site administration" -msgstr "سائٹ کی انتظامیہ" - -msgid "Log in" -msgstr "اندر جائیں" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "صفحہ نھیں ملا" - -msgid "We're sorry, but the requested page could not be found." -msgstr "ھم معذرت خواہ ھیں، مطلوبہ صفحہ نھیں مل سکا۔" - -msgid "Home" -msgstr "گھر" - -msgid "Server error" -msgstr "سرور کی خرابی" - -msgid "Server error (500)" -msgstr "سرور کی خرابی (500)" - -msgid "Server Error (500)" -msgstr "سرور کی خرابی (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "منتخب شدہ کاروائیاں چلائیں" - -msgid "Go" -msgstr "جاؤ" - -msgid "Click here to select the objects across all pages" -msgstr "تمام صفحات میں سے اشیاء منتخب کرنے کے لئے یہاں کلک کریں۔" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "تمام %(total_count)s %(module_name)s منتخب کریں" - -msgid "Clear selection" -msgstr "انتخاب صاف کریں" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"پہلے نام صارف اور لفظ اجازت درج کریں۔ پھر آپ مزید صارف کے حقوق مدوّن کرنے کے " -"قابل ھوں گے۔" - -msgid "Enter a username and password." -msgstr "نام صارف اور لفظ اجازت درج کریں۔" - -msgid "Change password" -msgstr "لفظ اجازت تبدیل کریں" - -msgid "Please correct the error below." -msgstr "براہ کرم نیچے غلطیاں درست کریں۔" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "صارف %(username)s کے لئے نیا لفظ اجازت درج کریں۔" - -msgid "Welcome," -msgstr "خوش آمدید،" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "طریق استعمال" - -msgid "Log out" -msgstr "باہر جائیں" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s کا اضافہ کریں" - -msgid "History" -msgstr "تاریخ نامہ" - -msgid "View on site" -msgstr "سائٹ پر مشاھدہ کریں" - -msgid "Filter" -msgstr "چھانٹیں" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "مٹائیں" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' کو مٹانے کے نتیجے میں معتلقہ اشیاء مٹ " -"سکتی ھیں، مگر آپ کے کھاتے کو اشیاء کی مندرجہ ذیل اقسام مٹانے کا حق حاصل نھیں " -"ھے۔" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' کو مٹانے کے لئے مندرجہ ذیل محفوظ متعلقہ " -"اشیاء کو مٹانے کی ضرورت پڑ سکتی ھے۔" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"واقعی آپ %(object_name)s \"%(escaped_object)s\" کو مٹانا چاہتے ھیں۔ مندرجہ " -"ذیل تمام متعلقہ اجزاء مٹ جائیں گے۔" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "ھاں، مجھے یقین ھے" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "متعدد اشیاء مٹائیں" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"منتخب شدہ %(objects_name)s کو مٹانے کے نتیجے میں متعلقہ اشیاء مٹ سکتی ھیں، " -"لیکن آپ کے کھاتے کو اشیاء کی مندرجہ ذیل اقسام کو مٹانے کا حق حاصل نھیں ھے۔" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"منتخب شدہ %(objects_name)s کو مٹانے کے لئے مندرجہ ذیل محفوظ شدہ اشیاء کو " -"مٹانے کی ضرورت پڑ سکتی ھے۔" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"واقعی آپ منتخب شدہ %(objects_name)s مٹانا چاھتے ھیں؟ مندرجہ ذیل اور ان سے " -"متعلقہ تمام اشیاء حذف ھو جائیں گی۔" - -msgid "Change" -msgstr "تدوین" - -msgid "Delete?" -msgstr "مٹاؤں؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr "از %(filter_title)s" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "اضافہ" - -msgid "You don't have permission to edit anything." -msgstr "آپ کو کوئی چیز مدوّن کرنے کا حق نھیں ھے۔" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "کچھ دستیاب نھیں" - -msgid "Unknown content" -msgstr "نامعلوم مواد" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"آپ کی ڈیٹا بیس کی تنصیب میں کوئی چیز خراب ھے۔ یقین کر لیں کہ موزون ڈیٹا بیس " -"ٹیبل بنائے گئے تھے، اور یقین کر لیں کہ ڈیٹ بیس مناسب صارف کے پڑھے جانے کے " -"قابل ھے۔" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "تاریخ/وقت" - -msgid "User" -msgstr "صارف" - -msgid "Action" -msgstr "کاروائی" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"اس شے کا تبدیلی کا تاریخ نامہ نھیں ھے۔ اس کا غالباً بذریعہ اس منتظم سائٹ کے " -"اضافہ نھیں کیا گیا۔" - -msgid "Show all" -msgstr "تمام دکھائیں" - -msgid "Save" -msgstr "محفوظ کریں" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "تلاش کریں" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s نتیجہ" -msgstr[1] "%(counter)s نتائج" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "کل %(full_result_count)s" - -msgid "Save as new" -msgstr "بطور نیا محفوظ کریں" - -msgid "Save and add another" -msgstr "محفوظ کریں اور مزید اضافہ کریں" - -msgid "Save and continue editing" -msgstr "محفوظ کریں اور تدوین جاری رکھیں" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ویب سائٹ پر آج کچھ معیاری وقت خرچ کرنے کے لئے شکریہ۔" - -msgid "Log in again" -msgstr "دوبارہ اندر جائیں" - -msgid "Password change" -msgstr "لفظ اجازت کی تبدیلی" - -msgid "Your password was changed." -msgstr "آپ کا لفظ اجازت تبدیل کر دیا گیا تھا۔" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"براہ کرم سیکیورٹی کی خاطر اپنا پرانا لفظ اجازت درج کریں اور پھر اپنا نیا لفظ " -"اجازت دو مرتبہ درج کریں تاکہ ھم توثیق کر سکیں کہ آپ نے اسے درست درج کیا ھے۔" - -msgid "Change my password" -msgstr "میرا لفظ تبدیل کریں" - -msgid "Password reset" -msgstr "لفظ اجازت کی دوبارہ ترتیب" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"آپ کا لفظ اجازت مرتب کر دیا گیا ھے۔ آپ کو آگے بڑھنے اور اندر جانے کی اجازت " -"ھے۔" - -msgid "Password reset confirmation" -msgstr "لفظ اجازت دوبارہ مرتب کرنے کی توثیق" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"براہ مھربانی اپنا نیا لفظ اجازت دو مرتبہ درج کریں تاکہ تاکہ ھم تصدیق کر سکیں " -"کہ تم نے اسے درست درج کیا ھے۔" - -msgid "New password:" -msgstr "نیا لفظ اجازت:" - -msgid "Confirm password:" -msgstr "لفظ اجازت کی توثیق:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"لفظ اجازت دوبارہ مرتب کرنے کا رابطہ (لنک) غلط تھا، غالباً یہ پہلے ھی استعمال " -"کیا چکا تھا۔ براہ مھربانی نیا لفظ اجازت مرتب کرنے کی درخواست کریں۔" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "براہ مھربانی مندرجہ ذیل صفحے پر جائیں اور نیا لفظ اجازت پسند کریں:" - -msgid "Your username, in case you've forgotten:" -msgstr "نام صارف، بھول جانے کی صورت میں:" - -msgid "Thanks for using our site!" -msgstr "ھماری سائٹ استعمال کرنے کے لئے شکریہ" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s کی ٹیم" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "میرا لفظ اجازت دوبارہ مرتب کریں" - -msgid "All dates" -msgstr "تمام تاریخیں" - -#, python-format -msgid "Select %s" -msgstr "%s منتخب کریں" - -#, python-format -msgid "Select %s to change" -msgstr "تبدیل کرنے کے لئے %s منتخب کریں" - -msgid "Date:" -msgstr "تاریخ:" - -msgid "Time:" -msgstr "وقت:" - -msgid "Lookup" -msgstr "ڈھونڈیں" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 65de198..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po deleted file mode 100644 index a4f5642..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,211 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "دستیاب %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "چھانٹیں" - -msgid "Choose all" -msgstr "سب منتخب کریں" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "خارج کریں" - -#, javascript-format -msgid "Chosen %s" -msgstr "منتخب شدہ %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s میں سے %(sel)s منتخب کیا گیا" -msgstr[1] "%(cnt)s میں سے %(sel)s منتخب کیے گئے" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"آپ کے پاس ذاتی قابل تدوین خانوں میں غیر محفوظ تبدیلیاں موجود ھیں۔ اگر آپ " -"کوئی کاروائی کریں گے تو آپ کی غیر محفوظ تبدیلیاں ضائع ھو جائیں گی۔" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"آپ نے ایک کاروائی منتخب کی ھے لیکن ابھی تک آپ نے ذاتی خانوں میں اپنی " -"تبدیلیاں محفوظ نہیں کی ہیں براہ مھربانی محفوط کرنے کے لئے OK پر کلک کریں۔ آپ " -"کاوائی دوبارہ چلانے کی ضرورت ھوگی۔" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"آپ نے ایک کاروائی منتخب کی ھے، اور آپ نے ذاتی خانوں میں کوئی تبدیلی نہیں کی " -"غالباً آپ 'جاؤ' بٹن تلاش کر رھے ھیں بجائے 'مخفوظ کریں' بٹن کے۔" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "اب" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "وقت منتخب کریں" - -msgid "Midnight" -msgstr "نصف رات" - -msgid "6 a.m." -msgstr "6 ص" - -msgid "Noon" -msgstr "دوپھر" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "منسوخ کریں" - -msgid "Today" -msgstr "آج" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "گزشتہ کل" - -msgid "Tomorrow" -msgstr "آئندہ کل" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "دکھائیں" - -msgid "Hide" -msgstr "چھپائیں" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo deleted file mode 100644 index 253820c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.po deleted file mode 100644 index 8b4f8fd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.po +++ /dev/null @@ -1,724 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Alex Ibragimov, 2021 -# Anvar Ulugov , 2020 -# Bedilbek Khamidov , 2019 -# Claude Paroz , 2019 -# Nuriddin Islamov, 2021 -# Shukrullo Turgunov , 2021,2024 -# Sukhrobbek Ismatov , 2019 -# Yet Sum , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-01-25 07:05+0000\n" -"Last-Translator: Shukrullo Turgunov , 2021,2024\n" -"Language-Team: Uzbek (http://app.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s larni o'chirish" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d%(items)s muvaffaqiyatli o'chirildi." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s o'chirib bo'lmadi" - -msgid "Are you sure?" -msgstr "Ishonchingiz komilmi?" - -msgid "Administration" -msgstr "Administratsiya" - -msgid "All" -msgstr "Barchasi" - -msgid "Yes" -msgstr "Ha" - -msgid "No" -msgstr "Yo'q" - -msgid "Unknown" -msgstr "Noma'lum" - -msgid "Any date" -msgstr "Istalgan kun" - -msgid "Today" -msgstr "Bugun" - -msgid "Past 7 days" -msgstr "O'tgan 7 kun" - -msgid "This month" -msgstr "Shu oyda" - -msgid "This year" -msgstr "Shu yilda" - -msgid "No date" -msgstr "Sanasi yo'q" - -msgid "Has date" -msgstr "Sanasi bor" - -msgid "Empty" -msgstr "Bo'sh" - -msgid "Not empty" -msgstr "Bo'sh emas" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Xodimlar akkaunti uchun to'g'ri %(username)s va parolni kiriting. E'tibor " -"bering, har ikkala maydon ham harf katta-kichikligini hisobga olishi mumkin." - -msgid "Action:" -msgstr "Harakat:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Boshqa %(verbose_name)s qo‘shish" - -msgid "Remove" -msgstr "O'chirish" - -msgid "Addition" -msgstr " Qo'shish" - -msgid "Change" -msgstr "O'zgartirish" - -msgid "Deletion" -msgstr "O'chirish" - -msgid "action time" -msgstr "harakat vaqti" - -msgid "user" -msgstr "foydalanuvchi" - -msgid "content type" -msgstr "tarkib turi" - -msgid "object id" -msgstr "obyekt identifikatori" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "obyekt taqdimi" - -msgid "action flag" -msgstr "harakat bayrog'i" - -msgid "change message" -msgstr "xabarni o'zgartirish" - -msgid "log entry" -msgstr "jurnal yozuvi" - -msgid "log entries" -msgstr "jurnal yozuvlari" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" qo'shildi." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "%(object)s dan %(changes)sga o'zgartirildi." - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" o'chirildi." - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "va" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "Bo'sh" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" muvaffaqiyatli o'zgartirildi." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s%(obj)smuvaffaqiyatli o'chirildi" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Qo'shish %s" - -#, python-format -msgid "Change %s" -msgstr "%sni o'zgartirish" - -#, python-format -msgid "View %s" -msgstr "Ko'rish %s" - -msgid "Database error" -msgstr "Ma'lumotlar bazasi xatoligi yuz berdi" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "Server xatoligi" - -msgid "Server error (500)" -msgstr "Server xatoligi (500)" - -msgid "Server Error (500)" -msgstr "Server xatoligi (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Tanlangan faoliyatni ishga tushirish" - -msgid "Go" -msgstr "" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Qo'shish" - -msgid "View" -msgstr "Ko'rish" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Username va parolni kiritish" - -msgid "Change password" -msgstr "Parolni o'zgartirish" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Skip to main content" -msgstr "" - -msgid "Welcome," -msgstr "Xush kelibsiz," - -msgid "View site" -msgstr "Saytni ko'rish" - -msgid "Documentation" -msgstr "Qo'llanma" - -msgid "Log out" -msgstr "Chiqish" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)sqo'shish" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "Saytda ko'rish" - -msgid "Filter" -msgstr "Saralash" - -msgid "Hide counts" -msgstr "" - -msgid "Show counts" -msgstr "" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "Tartiblashdan chiqarish" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Toggle theme (current theme: auto)" -msgstr "" - -msgid "Toggle theme (current theme: light)" -msgstr "" - -msgid "Toggle theme (current theme: dark)" -msgstr "" - -msgid "Delete" -msgstr "O'chirish" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Delete?" -msgstr "O'chirasizmi?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "Xulosa" - -msgid "Recent actions" -msgstr "So'ngi harakatlar" - -msgid "My actions" -msgstr "Mening harakatlarim" - -msgid "None available" -msgstr "" - -msgid "Added:" -msgstr "" - -msgid "Changed:" -msgstr "" - -msgid "Deleted:" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Navigatsiyani almashtirish" - -msgid "Sidebar" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "Saqlash" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Izlash" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "Parolimni tiklash" - -msgid "Select all objects on this page for an action" -msgstr "" - -msgid "All dates" -msgstr "Barcha sanalar" - -#, python-format -msgid "Select %s" -msgstr "%sni tanlash" - -#, python-format -msgid "Select %s to change" -msgstr "" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Sana:" - -msgid "Time:" -msgstr "Vaqt:" - -msgid "Lookup" -msgstr "Izlash" - -msgid "Currently:" -msgstr "Hozirda:" - -msgid "Change:" -msgstr "O'zgartirish:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7c922f6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po deleted file mode 100644 index d731b22..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,261 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Nuriddin Islamov, 2021 -# Otabek Umurzakov , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-12-15 16:52+0000\n" -"Last-Translator: Nuriddin Islamov\n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Mavjud %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Bu mavjud %s ro'yxati. Siz ulardan ba'zilarini quyidagi maydonchada " -"belgilab, so'ng ikkala maydonlar orasidagi \"Tanlash\" ko'rsatkichiga bosish " -"orqali tanlashingiz mumkin." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Mavjud bo'lgan %s larni ro'yxatini filtrlash uchun ushbu maydonchaga " -"kiriting." - -msgid "Filter" -msgstr "Filtrlash" - -msgid "Choose all" -msgstr "Barchasini tanlash" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Barcha %s larni birdan tanlash uchun bosing." - -msgid "Choose" -msgstr "Tanlash" - -msgid "Remove" -msgstr "O'chirish" - -#, javascript-format -msgid "Chosen %s" -msgstr "Tanlangan %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Bu tanlangan %s ro'yxati. Siz ulardan ba'zilarini quyidagi maydonchada " -"belgilab, so'ng ikkala maydonlar orasidagi \"O'chirish\" ko'rsatkichiga " -"bosish orqali o'chirishingiz mumkin." - -msgid "Remove all" -msgstr "Barchasini o'chirish" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Barcha tanlangan %s larni birdan o'chirib tashlash uchun bosing." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s dan %(sel)s tanlandi" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Siz alohida tahrirlash mumkin bo'lgan maydonlarda saqlanmagan " -"o‘zgarishlaringiz mavjud. Agar siz harakatni ishga tushirsangiz, saqlanmagan " -"o'zgarishlaringiz yo'qotiladi." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Hozir" - -msgid "Midnight" -msgstr "Yarim tun" - -msgid "6 a.m." -msgstr "6 t.o." - -msgid "Noon" -msgstr "Kun o'rtasi" - -msgid "6 p.m." -msgstr "6 t.k." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Eslatma: Siz server vaqtidan %s soat oldindasiz." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Eslatma: Siz server vaqtidan %s soat orqadasiz." - -msgid "Choose a Time" -msgstr "Vaqtni tanlang" - -msgid "Choose a time" -msgstr "Vaqtni tanlang" - -msgid "Cancel" -msgstr "Bekor qilish" - -msgid "Today" -msgstr "Bugun" - -msgid "Choose a Date" -msgstr "Sanani tanlang" - -msgid "Yesterday" -msgstr "Kecha" - -msgid "Tomorrow" -msgstr "Ertaga" - -msgid "January" -msgstr "Yanvar" - -msgid "February" -msgstr "Fevral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Aprel" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "Iyun" - -msgid "July" -msgstr "Iyul" - -msgid "August" -msgstr "Avgust" - -msgid "September" -msgstr "Sentabr" - -msgid "October" -msgstr "Oktabr" - -msgid "November" -msgstr "Noyabr" - -msgid "December" -msgstr "Dekabr" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Ya" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Du" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Se" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ch" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Pa" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Ju" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Sh" - -msgid "Show" -msgstr "Ko'rsatish" - -msgid "Hide" -msgstr "Bekitish" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index 1091b6f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index 60fe2ce..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,726 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dimitris Glezos , 2012 -# Jannis Leidel , 2011 -# Thanh Le Viet , 2013 -# Tran , 2011 -# Tran Van , 2011-2013,2016,2018 -# tinnguyen121221, 2021 -# Vuong Nguyen , 2011 -# xgenvn , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-12-23 17:57+0000\n" -"Last-Translator: tinnguyen121221\n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Xóa các %(verbose_name_plural)s đã chọn" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Đã xóa thành công %(count)d %(items)s ." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Không thể xóa %(name)s" - -msgid "Are you sure?" -msgstr "Bạn có chắc chắn không?" - -msgid "Administration" -msgstr "Quản trị website" - -msgid "All" -msgstr "Tất cả" - -msgid "Yes" -msgstr "Có" - -msgid "No" -msgstr "Không" - -msgid "Unknown" -msgstr "Chưa xác định" - -msgid "Any date" -msgstr "Bất kì ngày nào" - -msgid "Today" -msgstr "Hôm nay" - -msgid "Past 7 days" -msgstr "7 ngày trước" - -msgid "This month" -msgstr "Tháng này" - -msgid "This year" -msgstr "Năm nay" - -msgid "No date" -msgstr "Không có ngày" - -msgid "Has date" -msgstr "Có ngày" - -msgid "Empty" -msgstr "Rỗng" - -msgid "Not empty" -msgstr "Không rỗng" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Bạn hãy nhập đúng %(username)s và mật khẩu. (Có phân biệt chữ hoa, thường)" - -msgid "Action:" -msgstr "Hoạt động:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Thêm một %(verbose_name)s " - -msgid "Remove" -msgstr "Gỡ bỏ" - -msgid "Addition" -msgstr "Thêm" - -msgid "Change" -msgstr "Thay đổi" - -msgid "Deletion" -msgstr "Xóa" - -msgid "action time" -msgstr "Thời gian tác động" - -msgid "user" -msgstr "người dùng" - -msgid "content type" -msgstr "kiểu nội dung" - -msgid "object id" -msgstr "Mã đối tượng" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "đối tượng repr" - -msgid "action flag" -msgstr "hiệu hành động" - -msgid "change message" -msgstr "thay đổi tin nhắn" - -msgid "log entry" -msgstr "đăng nhập" - -msgid "log entries" -msgstr "mục đăng nhập" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Đã thêm “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Đã thay đổi “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Đã xóa “%(object)s.”" - -msgid "LogEntry Object" -msgstr "LogEntry Object" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Đã thêm {name} “{object}”." - -msgid "Added." -msgstr "Được thêm." - -msgid "and" -msgstr "và" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Đã thay đổi {fields} cho {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Đã thay đổi {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Đã xóa {name} “{object}”." - -msgid "No fields changed." -msgstr "Không có trường nào thay đổi" - -msgid "None" -msgstr "Không" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Nhấn giữ phím “Control”, hoặc “Command” trên máy Mac, để chọn nhiều hơn một." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” được thêm vào thành công." - -msgid "You may edit it again below." -msgstr "Bạn có thể chỉnh sửa lại bên dưới." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” được thêm vào thành công. Bạn có thể thêm một {name} khác bên " -"dưới." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” được chỉnh sửa thành công. Bạn có thể chỉnh sửa lại bên dưới." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” được thêm vào thành công. Bạn có thể chỉnh sửa lại bên dưới." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” được chỉnh sửa thành công. Bạn có thể thêm một {name} khác " -"bên dưới." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” đã được thay đổi thành công." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Mục tiêu phải được chọn mới có thể thực hiện hành động trên chúng. Không có " -"mục tiêu nào đã được thay đổi." - -msgid "No action selected." -msgstr "Không có hoạt động nào được lựa chọn." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” đã được xóa thành công." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s với ID “%(key)s” không tồn tại. Có lẽ nó đã bị xóa?" - -#, python-format -msgid "Add %s" -msgstr "Thêm %s" - -#, python-format -msgid "Change %s" -msgstr "Thay đổi %s" - -#, python-format -msgid "View %s" -msgstr "Xem %s" - -msgid "Database error" -msgstr "Cơ sở dữ liệu bị lỗi" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] " %(count)s %(name)s đã được thay đổi thành công." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Tất cả %(total_count)s đã được chọn" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 của %(cnt)s được chọn" - -#, python-format -msgid "Change history: %s" -msgstr "Lịch sử thay đổi: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Xóa %(class_name)s %(instance)s sẽ tự động xóa các đối tượng liên quan sau: " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "Trang web admin Django" - -msgid "Django administration" -msgstr "Trang quản trị cho Django" - -msgid "Site administration" -msgstr "Site quản trị hệ thống." - -msgid "Log in" -msgstr "Đăng nhập" - -#, python-format -msgid "%(app)s administration" -msgstr "Quản lý %(app)s" - -msgid "Page not found" -msgstr "Không tìm thấy trang nào" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Rất tiếc, không thể tìm thấy trang được yêu cầu." - -msgid "Home" -msgstr "Trang chủ" - -msgid "Server error" -msgstr "Lỗi máy chủ" - -msgid "Server error (500)" -msgstr "Lỗi máy chủ (500)" - -msgid "Server Error (500)" -msgstr "Lỗi máy chủ (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Có lỗi xảy ra. Lỗi sẽ được gửi đến quản trị website qua email và sẽ được " -"khắc phục sớm. Cám ơn bạn." - -msgid "Run the selected action" -msgstr "Bắt đầu hành động lựa chọn" - -msgid "Go" -msgstr "Đi đến" - -msgid "Click here to select the objects across all pages" -msgstr "Click vào đây để lựa chọn các đối tượng trên tất cả các trang" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Hãy chọn tất cả %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Xóa lựa chọn" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Các mô models trong %(name)s" - -msgid "Add" -msgstr "Thêm vào" - -msgid "View" -msgstr "Xem" - -msgid "You don’t have permission to view or edit anything." -msgstr "Bạn không có quyền xem hoặc chỉnh sửa bất cứ gì." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Đầu tiên, điền tên đăng nhập và mật khẩu. Sau đó, bạn mới có thể chỉnh sửa " -"nhiều hơn lựa chọn của người dùng." - -msgid "Enter a username and password." -msgstr "Điền tên đăng nhập và mật khẩu." - -msgid "Change password" -msgstr "Đổi mật khẩu" - -msgid "Please correct the error below." -msgstr "Hãy sửa lỗi sai dưới đây" - -msgid "Please correct the errors below." -msgstr "Hãy chỉnh sửa lại các lỗi sau." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Hãy nhập mật khẩu mới cho người sử dụng %(username)s." - -msgid "Welcome," -msgstr "Chào mừng bạn," - -msgid "View site" -msgstr "Xem trang web" - -msgid "Documentation" -msgstr "Tài liệu" - -msgid "Log out" -msgstr "Thoát" - -#, python-format -msgid "Add %(name)s" -msgstr "Thêm vào %(name)s" - -msgid "History" -msgstr "Bản ghi nhớ" - -msgid "View on site" -msgstr "Xem trên trang web" - -msgid "Filter" -msgstr "Bộ lọc" - -msgid "Clear all filters" -msgstr "Xóa tất cả bộ lọc" - -msgid "Remove from sorting" -msgstr "Bỏ khỏi sắp xếp" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sắp xếp theo:%(priority_number)s" - -msgid "Toggle sorting" -msgstr "Hoán đổi sắp xếp" - -msgid "Delete" -msgstr "Xóa" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Xóa %(object_name)s '%(escaped_object)s' sẽ làm mất những dữ liệu có liên " -"quan. Tài khoản của bạn không được cấp quyển xóa những dữ liệu đi kèm theo." - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Xóa các %(object_name)s ' %(escaped_object)s ' sẽ bắt buộc xóa các đối " -"tượng được bảo vệ sau đây:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Bạn có chắc là muốn xóa %(object_name)s \"%(escaped_object)s\"?Tất cả những " -"dữ liệu đi kèm dưới đây cũng sẽ bị mất:" - -msgid "Objects" -msgstr "Đối tượng" - -msgid "Yes, I’m sure" -msgstr "Có, tôi chắc chắn" - -msgid "No, take me back" -msgstr "Không, đưa tôi trở lại" - -msgid "Delete multiple objects" -msgstr "Xóa nhiều đối tượng" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Xóa các %(objects_name)s sẽ bắt buộc xóa các đối tượng liên quan, nhưng tài " -"khoản của bạn không có quyền xóa các loại đối tượng sau đây:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Xóa các %(objects_name)s sẽ bắt buộc xóa các đối tượng đã được bảo vệ sau " -"đây:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Bạn chắc chắn muốn xóa những lựa chọn %(objects_name)s? Tất cả những đối " -"tượng sau và những đối tượng liên quan sẽ được xóa:" - -msgid "Delete?" -msgstr "Bạn muốn xóa?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Bởi %(filter_title)s " - -msgid "Summary" -msgstr "Tóm tắt" - -msgid "Recent actions" -msgstr "Hoạt động gần đây" - -msgid "My actions" -msgstr "Hoạt động của tôi" - -msgid "None available" -msgstr "Không có sẵn" - -msgid "Unknown content" -msgstr "Không biết nội dung" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Một vài lỗi với cơ sở dữ liệu cài đặt của bạn. Hãy chắc chắn bảng biểu dữ " -"liệu được tạo phù hợp và dữ liệu có thể được đọc bởi những người sử dụng phù " -"hợp." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Bạn đã xác thực bằng tài khoản %(username)s, nhưng không đủ quyền để truy " -"cập trang này. Bạn có muốn đăng nhập bằng một tài khoản khác?" - -msgid "Forgotten your password or username?" -msgstr "Bạn quên mật khẩu hoặc tài khoản?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "Nhập để lọc..." - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Ngày/giờ" - -msgid "User" -msgstr "Người dùng" - -msgid "Action" -msgstr "Hành động" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Đối tượng này không có một lịch sử thay đổi. Nó có lẽ đã không được thêm vào " -"qua trang web admin." - -msgid "Show all" -msgstr "Hiện tất cả" - -msgid "Save" -msgstr "Lưu lại" - -msgid "Popup closing…" -msgstr "Đang đóng cửa sổ popup ..." - -msgid "Search" -msgstr "Tìm kiếm" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s kết quả" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "tổng số %(full_result_count)s" - -msgid "Save as new" -msgstr "Lưu mới" - -msgid "Save and add another" -msgstr "Lưu và thêm mới" - -msgid "Save and continue editing" -msgstr "Lưu và tiếp tục chỉnh sửa" - -msgid "Save and view" -msgstr "Lưu lại và xem" - -msgid "Close" -msgstr "Đóng" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Thay đổi %(model)s đã chọn" - -#, python-format -msgid "Add another %(model)s" -msgstr "Thêm %(model)s khác" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Xóa %(model)s đã chọn" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Cảm ơn bạn đã dành thời gian với trang web." - -msgid "Log in again" -msgstr "Đăng nhập lại" - -msgid "Password change" -msgstr "Thay đổi mật khẩu" - -msgid "Your password was changed." -msgstr "Mật khẩu của bạn đã được thay đổi" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Hãy nhập lại mật khẩu cũ và sau đó nhập mật khẩu mới hai lần để chúng tôi có " -"thể kiểm tra lại xem bạn đã gõ chính xác hay chưa." - -msgid "Change my password" -msgstr "Thay đổi mật khẩu" - -msgid "Password reset" -msgstr "Lập lại mật khẩu" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Mật khẩu của bạn đã được lập lại. Bạn hãy thử đăng nhập." - -msgid "Password reset confirmation" -msgstr "Xác nhận việc lập lại mật khẩu" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Hãy nhập mật khẩu mới hai lần để chúng tôi có thể kiểm tra xem bạn đã gõ " -"chính xác chưa" - -msgid "New password:" -msgstr "Mật khẩu mới" - -msgid "Confirm password:" -msgstr "Nhập lại mật khẩu:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Liên kết đặt lại mật khẩu không hợp lệ, có thể vì nó đã được sử dụng. Xin " -"vui lòng yêu cầu đặt lại mật khẩu mới." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Chúng tôi đã gửi cho bạn hướng dẫn thiết lập mật khẩu của bạn qua email, nếu " -"tài khoản tồn tại với email bạn đã nhập. Bạn sẽ nhận được chúng sớm." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Nếu bạn không nhận được email, hãy đảm bảo rằng bạn đã nhập địa chỉ mà bạn " -"đã đăng ký và kiểm tra thư mục spam của mình." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Bạn nhận được email này vì bạn đã yêu cầu làm mới lại mật khẩu cho tài khoản " -"của bạn tại %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Hãy vào đường link dưới đây và chọn một mật khẩu mới" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Tên đăng nhập của bạn, trường hợp bạn quên nó:" - -msgid "Thanks for using our site!" -msgstr "Cảm ơn bạn đã sử dụng website của chúng tôi!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Đội của %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Quên mật khẩu? Nhập địa chỉ email vào ô dưới đây. Chúng tôi sẽ email cho bạn " -"hướng dẫn cách thiết lập mật khẩu mới." - -msgid "Email address:" -msgstr "Địa chỉ Email:" - -msgid "Reset my password" -msgstr "Làm lại mật khẩu" - -msgid "All dates" -msgstr "Tất cả các ngày" - -#, python-format -msgid "Select %s" -msgstr "Chọn %s" - -#, python-format -msgid "Select %s to change" -msgstr "Chọn %s để thay đổi" - -#, python-format -msgid "Select %s to view" -msgstr "Chọn %s để xem" - -msgid "Date:" -msgstr "Ngày:" - -msgid "Time:" -msgstr "Giờ:" - -msgid "Lookup" -msgstr "Tìm" - -msgid "Currently:" -msgstr "Hiện nay:" - -msgid "Change:" -msgstr "Thay đổi:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c9d57cd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po deleted file mode 100644 index a3faf74..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,268 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Tran , 2011 -# Tran Van , 2013 -# tinnguyen121221, 2021 -# Vuong Nguyen , 2011 -# xgenvn , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-12-23 17:25+0000\n" -"Last-Translator: tinnguyen121221\n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Có sẵn %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Danh sách các lựa chọn đang có %s. Bạn có thể chọn bằng bách click vào mũi " -"tên \"Chọn\" nằm giữa hai hộp." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Bạn hãy nhập vào ô này để lọc các danh sách sau %s." - -msgid "Filter" -msgstr "Lọc" - -msgid "Choose all" -msgstr "Chọn tất cả" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Click để chọn tất cả %s ." - -msgid "Choose" -msgstr "Chọn" - -msgid "Remove" -msgstr "Xóa" - -#, javascript-format -msgid "Chosen %s" -msgstr "Chọn %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Danh sách bạn đã chọn %s. Bạn có thể bỏ chọn bằng cách click vào mũi tên " -"\"Xoá\" nằm giữa hai ô." - -msgid "Remove all" -msgstr "Xoá tất cả" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Click để bỏ chọn tất cả %s" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] " %(sel)s của %(cnt)s được chọn" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Bạn chưa lưu những trường đã chỉnh sửa. Nếu bạn chọn hành động này, những " -"chỉnh sửa chưa được lưu sẽ bị mất." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Bạn đã chọn một hành động, nhưng bạn chưa lưu các thay đổi trên các trường. " -"Vui lòng bấm OK để lưu lại. Bạn sẽ cần chạy lại hành dộng." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Bạn đã chọn một hành động và bạn đã không thực hiện bất kỳ thay đổi nào trên " -"các trường. Có lẽ bạn nên bấm nút Đi đến hơn là nút Lưu lại." - -msgid "Now" -msgstr "Bây giờ" - -msgid "Midnight" -msgstr "Nửa đêm" - -msgid "6 a.m." -msgstr "6 giờ sáng" - -msgid "Noon" -msgstr "Buổi trưa" - -msgid "6 p.m." -msgstr "6 giờ chiều" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"Lưu ý: Hiện tại bạn đang thấy thời gian trước %s giờ so với thời gian máy " -"chủ." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Lưu ý: Hiện tại bạn đang thấy thời gian sau %s giờ so với thời gian máy chủ." - -msgid "Choose a Time" -msgstr "Chọn Thời gian" - -msgid "Choose a time" -msgstr "Chọn giờ" - -msgid "Cancel" -msgstr "Hủy bỏ" - -msgid "Today" -msgstr "Hôm nay" - -msgid "Choose a Date" -msgstr "Chọn Ngày" - -msgid "Yesterday" -msgstr "Hôm qua" - -msgid "Tomorrow" -msgstr "Ngày mai" - -msgid "January" -msgstr "Tháng Một" - -msgid "February" -msgstr "Tháng Hai" - -msgid "March" -msgstr "Tháng Ba" - -msgid "April" -msgstr "Tháng Tư" - -msgid "May" -msgstr "Tháng Năm" - -msgid "June" -msgstr "Tháng Sáu" - -msgid "July" -msgstr "Tháng Bảy" - -msgid "August" -msgstr "Tháng Tám" - -msgid "September" -msgstr "Tháng Chín" - -msgid "October" -msgstr "Tháng Mười" - -msgid "November" -msgstr "Tháng Mười Một" - -msgid "December" -msgstr "Tháng Mười Hai" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Tháng Một" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Tháng Hai" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Tháng Ba" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Tháng Tư" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Tháng Năm" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Tháng Sáu" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Tháng Bảy" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Tháng Tám" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Tháng Chín" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Tháng Mười" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Tháng Mười Một" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Tháng Mười Hai" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "CN" - -msgctxt "one letter Monday" -msgid "M" -msgstr "2" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "3" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "4" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "5" - -msgctxt "one letter Friday" -msgid "F" -msgstr "6" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "7" - -msgid "Show" -msgstr "Hiện ra" - -msgid "Hide" -msgstr "Dấu đi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index 7bec9b7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index c6fcf86..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,779 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# lanbla , 2021 -# Brian Wang , 2018 -# Fulong Sun , 2016 -# Huanqun Yang, 2022 -# jack yang, 2023 -# Jannis Leidel , 2011 -# Kevin Sze , 2012 -# Lele Long , 2011,2015 -# Le Yang , 2018 -# li beite , 2020 -# Liping Wang , 2016-2017 -# mozillazg , 2016 -# Ronald White , 2013-2014 -# Scott Jiang, 2023 -# Sean Lee , 2013 -# Sean Lee , 2013 -# slene , 2011 -# Suntravel Chris , 2019 -# Wentao Han , 2018,2020 -# xuyi wang , 2018 -# yf zhan , 2018 -# dykai , 2019 -# ced773123cfad7b4e8b79ca80f736af9, 2012 -# 千百度, 2024 -# LatteFang <370358679@qq.com>, 2020 -# Kevin Sze , 2012 -# 考证 李 , 2020 -# 雨翌 , 2016 -# 高乐喆 , 2023 -# Ronald White , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: 千百度, 2024\n" -"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "删除所选的 %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "成功删除了 %(count)d 个 %(items)s" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "无法删除 %(name)s" - -msgid "Are you sure?" -msgstr "你确定吗?" - -msgid "Administration" -msgstr "管理" - -msgid "All" -msgstr "全部" - -msgid "Yes" -msgstr "是" - -msgid "No" -msgstr "否" - -msgid "Unknown" -msgstr "未知" - -msgid "Any date" -msgstr "任意日期" - -msgid "Today" -msgstr "今天" - -msgid "Past 7 days" -msgstr "过去7天" - -msgid "This month" -msgstr "本月" - -msgid "This year" -msgstr "今年" - -msgid "No date" -msgstr "没有日期" - -msgid "Has date" -msgstr "具有日期" - -msgid "Empty" -msgstr "空" - -msgid "Not empty" -msgstr "非空" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"请输入一个正确的工作人员账户 %(username)s 和密码. 注意他们都是区分大小写的." - -msgid "Action:" -msgstr "动作" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "添加另一个 %(verbose_name)s" - -msgid "Remove" -msgstr "删除" - -msgid "Addition" -msgstr "添加" - -msgid "Change" -msgstr "修改" - -msgid "Deletion" -msgstr "删除" - -msgid "action time" -msgstr "操作时间" - -msgid "user" -msgstr "用户" - -msgid "content type" -msgstr "内容类型" - -msgid "object id" -msgstr "对象id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "对象表示" - -msgid "action flag" -msgstr "动作标志" - -msgid "change message" -msgstr "修改消息" - -msgid "log entry" -msgstr "日志记录" - -msgid "log entries" -msgstr "日志记录" - -#, python-format -msgid "Added “%(object)s”." -msgstr "添加了“%(object)s”。" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "修改了“%(object)s”—%(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "删除了“%(object)s”。" - -msgid "LogEntry Object" -msgstr "LogEntry对象" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "添加了 {name}“{object}”。" - -msgid "Added." -msgstr "已添加。" - -msgid "and" -msgstr "和" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "修改了 {name}“{object}”的 {fields}。" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "已修改{fields}。" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "删除了 {name}“{object}”。" - -msgid "No fields changed." -msgstr "没有字段被修改。" - -msgid "None" -msgstr "无" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "按住 Control 键或 Mac 上的 Command 键来选择多项。" - -msgid "Select this object for an action - {}" -msgstr "选择此对象执行操作 - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "成功添加了 {name}“{obj}”。" - -msgid "You may edit it again below." -msgstr "您可以在下面再次编辑它." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "成功添加了 {name}“{obj}”。你可以在下面添加另一个 {name}。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "成功修改了 {name}“{obj}”。你可以在下面再次编辑它。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "成功修改了 {name}“{obj}”。你可以在下面添加另一个 {name}。" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "成功修改了 {name}“{obj}”。" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "条目必须选中以对其进行操作。没有任何条目被更改。" - -msgid "No action selected." -msgstr "未选择动作" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "成功删除了 %(name)s“%(obj)s”。" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "ID 为“%(key)s”的 %(name)s 不存在。可能已经被删除了?" - -#, python-format -msgid "Add %s" -msgstr "增加 %s" - -#, python-format -msgid "Change %s" -msgstr "修改 %s" - -#, python-format -msgid "View %s" -msgstr "查看 %s" - -msgid "Database error" -msgstr "数据库错误" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "总共 %(count)s 个 %(name)s 变更成功。" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "选中了 %(total_count)s 个" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s 个中 0 个被选" - -#, python-format -msgid "Change history: %s" -msgstr "变更历史: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"删除 %(class_name)s %(instance)s 将需要删除以下受保护的相关对象: " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "Django 站点管理员" - -msgid "Django administration" -msgstr "Django 管理" - -msgid "Site administration" -msgstr "站点管理" - -msgid "Log in" -msgstr "登录" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s 管理" - -msgid "Page not found" -msgstr "页面没有找到" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "非常抱歉,请求的页面不存在。" - -msgid "Home" -msgstr "首页" - -msgid "Server error" -msgstr "服务器错误" - -msgid "Server error (500)" -msgstr "服务器错误(500)" - -msgid "Server Error (500)" -msgstr "服务器错误 (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"发生了错误,已经通过电子邮件报告给了网站管理员。我们会尽快修复,感谢您的耐心" -"等待。" - -msgid "Run the selected action" -msgstr "运行选中的动作" - -msgid "Go" -msgstr "执行" - -msgid "Click here to select the objects across all pages" -msgstr "点击此处选择所有页面中包含的对象。" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "选中所有的 %(total_count)s 个 %(module_name)s" - -msgid "Clear selection" -msgstr "清除选中" - -msgid "Breadcrumbs" -msgstr "条形导航" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "在应用程序 %(name)s 中的模型" - -msgid "Add" -msgstr "增加" - -msgid "View" -msgstr "查看" - -msgid "You don’t have permission to view or edit anything." -msgstr "你没有查看或编辑的权限。" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "输入用户名和密码后,你将能够编辑更多的用户选项。" - -msgid "Enter a username and password." -msgstr "输入用户名和密码" - -msgid "Change password" -msgstr "修改密码" - -msgid "Set password" -msgstr "设置密码" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "请更正以下错误。" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "为用户 %(username)s 输入一个新的密码。" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "这将启用本用户基于密码的验证" - -msgid "Disable password-based authentication" -msgstr "禁用基于密码的验证" - -msgid "Enable password-based authentication" -msgstr "启用基于密码的验证" - -msgid "Skip to main content" -msgstr "跳到主要内容" - -msgid "Welcome," -msgstr "欢迎," - -msgid "View site" -msgstr "查看站点" - -msgid "Documentation" -msgstr "文档" - -msgid "Log out" -msgstr "注销" - -#, python-format -msgid "Add %(name)s" -msgstr "增加 %(name)s" - -msgid "History" -msgstr "历史" - -msgid "View on site" -msgstr "在站点上查看" - -msgid "Filter" -msgstr "过滤器" - -msgid "Hide counts" -msgstr "隐藏计数" - -msgid "Show counts" -msgstr "显示计数" - -msgid "Clear all filters" -msgstr "清除所有筛选" - -msgid "Remove from sorting" -msgstr "删除排序" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "排序优先级: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "正逆序切换" - -msgid "Toggle theme (current theme: auto)" -msgstr "切换主题(当前主题:自动)" - -msgid "Toggle theme (current theme: light)" -msgstr "切换主题(当前主题:浅色)" - -msgid "Toggle theme (current theme: dark)" -msgstr "切换主题(当前主题:深色)" - -msgid "Delete" -msgstr "删除" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"删除 %(object_name)s '%(escaped_object)s' 会导致删除相关的对象,但你的帐号无" -"权删除下列类型的对象:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"要删除 %(object_name)s '%(escaped_object)s', 将要求删除以下受保护的相关对象:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"你确认想要删除 %(object_name)s \"%(escaped_object)s\"? 下列所有相关的项目都" -"将被删除:" - -msgid "Objects" -msgstr "对象" - -msgid "Yes, I’m sure" -msgstr "是的,我确定" - -msgid "No, take me back" -msgstr "不,返回" - -msgid "Delete multiple objects" -msgstr "删除多个对象" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"要删除所选的 %(objects_name)s 结果会删除相关对象, 但你的账户没有权限删除这类" -"对象:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "要删除所选的 %(objects_name)s, 将要求删除以下受保护的相关对象:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"请确认要删除选中的 %(objects_name)s 吗?以下所有对象和与它们相关的条目将都会" -"被删除:" - -msgid "Delete?" -msgstr "删除?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " 以 %(filter_title)s" - -msgid "Summary" -msgstr "概览" - -msgid "Recent actions" -msgstr "最近动作" - -msgid "My actions" -msgstr "我的动作" - -msgid "None available" -msgstr "无可选的" - -msgid "Added:" -msgstr "已添加:" - -msgid "Changed:" -msgstr "已修改:" - -msgid "Deleted:" -msgstr "已删除:" - -msgid "Unknown content" -msgstr "未知内容" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"数据库设置有误。请检查所需的数据库表格是否已经创建,以及数据库用户是否具有正" -"确的权限。" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"您当前以%(username)s登录,但是没有这个页面的访问权限。您想使用另外一个账号登" -"录吗?" - -msgid "Forgotten your password or username?" -msgstr "忘记了您的密码或用户名?" - -msgid "Toggle navigation" -msgstr "切换导航" - -msgid "Sidebar" -msgstr "侧边栏" - -msgid "Start typing to filter…" -msgstr "开始输入以筛选..." - -msgid "Filter navigation items" -msgstr "筛选导航项目" - -msgid "Date/time" -msgstr "日期/时间" - -msgid "User" -msgstr "用户" - -msgid "Action" -msgstr "动作" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "条目" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "此对象没有修改历史。它可能不是通过管理站点添加的。" - -msgid "Show all" -msgstr "显示全部" - -msgid "Save" -msgstr "保存" - -msgid "Popup closing…" -msgstr "弹窗关闭中..." - -msgid "Search" -msgstr "搜索" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s 条结果。" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "总共 %(full_result_count)s" - -msgid "Save as new" -msgstr "保存为新的" - -msgid "Save and add another" -msgstr "保存并增加另一个" - -msgid "Save and continue editing" -msgstr "保存并继续编辑" - -msgid "Save and view" -msgstr "保存并查看" - -msgid "Close" -msgstr "关闭" - -#, python-format -msgid "Change selected %(model)s" -msgstr "更改选中的%(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "增加另一个 %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "取消选中 %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "查看已选择的%(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "感谢您今天与本网站共享一段美好时光。" - -msgid "Log in again" -msgstr "重新登录" - -msgid "Password change" -msgstr "密码修改" - -msgid "Your password was changed." -msgstr "你的密码已修改。" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "安全起见请输入你的旧密码。然后输入两次你的新密码以确保输入正确。" - -msgid "Change my password" -msgstr "修改我的密码" - -msgid "Password reset" -msgstr "密码重设" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "你的密码己经设置完成,现在你可以继续进行登录。" - -msgid "Password reset confirmation" -msgstr "密码重设确认" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "请输入两遍新密码,以便我们校验你输入的是否正确。" - -msgid "New password:" -msgstr "新密码:" - -msgid "Confirm password:" -msgstr "确认密码:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "密码重置链接无效,可能是因为它已使用。可以请求一次新的密码重置。" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"如果你所输入的电子邮箱存在对应的用户,我们将通过电子邮件向你发送设置密码的操" -"作步骤说明。你应该很快就会收到。" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"如果你没有收到电子邮件,请检查输入的是你注册的电子邮箱地址。另外,也请检查你" -"的垃圾邮件文件夹。" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "你收到这封邮件是因为你请求重置你在网站 %(site_name)s上的用户账户密码。" - -msgid "Please go to the following page and choose a new password:" -msgstr "请访问该页面并选择一个新密码:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "提醒一下,你的用户名是:" - -msgid "Thanks for using our site!" -msgstr "感谢使用我们的站点!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s 团队" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"忘记密码?在下面输入你的电子邮箱地址,我们将会把设置新密码的操作步骤说明通过" -"电子邮件发送给你。" - -msgid "Email address:" -msgstr "电子邮件地址:" - -msgid "Reset my password" -msgstr "重设我的密码" - -msgid "Select all objects on this page for an action" -msgstr "选择此页面上的所有对象执行操作" - -msgid "All dates" -msgstr "所有日期" - -#, python-format -msgid "Select %s" -msgstr "选择 %s" - -#, python-format -msgid "Select %s to change" -msgstr "选择 %s 来修改" - -#, python-format -msgid "Select %s to view" -msgstr "选择%s查看" - -msgid "Date:" -msgstr "日期:" - -msgid "Time:" -msgstr "时间:" - -msgid "Lookup" -msgstr "查询" - -msgid "Currently:" -msgstr "当前:" - -msgid "Change:" -msgstr "更改:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c78566a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po deleted file mode 100644 index 44f47c8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# HuanCheng Bai白宦成(Bestony) , 2018 -# Fan Xu , 2022 -# jack yang, 2023 -# Jannis Leidel , 2011 -# Kaiqi Zhu, 2023 -# Kewei Ma , 2016 -# Lele Long , 2011,2015 -# Liping Wang , 2016 -# matthew Yip , 2020 -# mozillazg , 2016 -# slene , 2011 -# Veoco , 2021 -# spaceoi , 2016 -# ced773123cfad7b4e8b79ca80f736af9, 2012 -# Kevin Sze , 2012 -# 高乐喆 , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-25 07:59+0000\n" -"Last-Translator: jack yang, 2023\n" -"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "可用 %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"这是可用的%s列表。你可以在选择框下面进行选择,然后点击两选框之间的“选择”箭" -"头。" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "在此框中键入以过滤可用的%s列表" - -msgid "Filter" -msgstr "过滤" - -msgid "Choose all" -msgstr "全选" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "点击选择全部%s。" - -msgid "Choose" -msgstr "选择" - -msgid "Remove" -msgstr "删除" - -#, javascript-format -msgid "Chosen %s" -msgstr "选中的 %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"这是选中的 %s 的列表。你可以在选择框下面进行选择,然后点击两选框之间的“删" -"除”箭头进行删除。" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "在该框中键入以过滤所选%s的列表。" - -msgid "Remove all" -msgstr "删除全部" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "删除所有已选择的%s。" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s所选选项不可见" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "选中了 %(cnt)s 个中的 %(sel)s 个" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"你尚未保存一个可编辑栏位的变更. 如果你进行别的动作, 未保存的变更将会丢失." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"你已经选择一个动作,但是你没有保存你单独修改的地方。请点击OK保存。你需要再重" -"新跑这个动作。" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"你已经选择一个动作,但是没有单独修改任何一处。你可以选择'Go'按键而不" -"是'Save'按键。" - -msgid "Now" -msgstr "现在" - -msgid "Midnight" -msgstr "午夜" - -msgid "6 a.m." -msgstr "上午6点" - -msgid "Noon" -msgstr "正午" - -msgid "6 p.m." -msgstr "下午6点" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "注意:你比服务器时间超前 %s 个小时。" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "注意:你比服务器时间滞后 %s 个小时。" - -msgid "Choose a Time" -msgstr "选择一个时间" - -msgid "Choose a time" -msgstr "选择一个时间" - -msgid "Cancel" -msgstr "取消" - -msgid "Today" -msgstr "今天" - -msgid "Choose a Date" -msgstr "选择一个日期" - -msgid "Yesterday" -msgstr "昨天" - -msgid "Tomorrow" -msgstr "明天" - -msgid "January" -msgstr "一月" - -msgid "February" -msgstr "二月" - -msgid "March" -msgstr "三月" - -msgid "April" -msgstr "四月" - -msgid "May" -msgstr "五月" - -msgid "June" -msgstr "六月" - -msgid "July" -msgstr "七月" - -msgid "August" -msgstr "八月" - -msgid "September" -msgstr "九月" - -msgid "October" -msgstr "十月" - -msgid "November" -msgstr "十一月" - -msgid "December" -msgstr "十二月" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "一月" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "二月" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "三月" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "四月" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "五月" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "六月" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "七月" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "八月" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "九月" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "十月" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "十一月" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "十二月" - -msgid "Sunday" -msgstr "星期日" - -msgid "Monday" -msgstr "星期一" - -msgid "Tuesday" -msgstr "星期二" - -msgid "Wednesday" -msgstr "星期三" - -msgid "Thursday" -msgstr "星期四" - -msgid "Friday" -msgstr "星期五" - -msgid "Saturday" -msgstr "星期六" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "星期日" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "星期一" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "星期二" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "星期三" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "星期四" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "星期五" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "星期六" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "W" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "显示" - -msgid "Hide" -msgstr "隐藏" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index 2cdcdd8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index 225da64..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,762 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chen Chun-Chia , 2015 -# coby2023t, 2025 -# ilay , 2012 -# Jannis Leidel , 2011 -# mail6543210 , 2013-2014 -# 0a3cb7bfd0810218facdfb511e592a6d_8d19d07 , 2011 -# tcc , 2011 -# Tzu-ping Chung , 2016-2017 -# YAO WEN LIANG, 2024 -# Yeh-Yung , 2013 -# coby2023t, 2024 -# Yeh-Yung , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: coby2023t, 2025\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "刪除所選的 %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "成功的刪除了 %(count)d 個 %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "無法刪除 %(name)s" - -msgid "Delete multiple objects" -msgstr "刪除多個物件" - -msgid "Administration" -msgstr "管理" - -msgid "All" -msgstr "全部" - -msgid "Yes" -msgstr "是" - -msgid "No" -msgstr "否" - -msgid "Unknown" -msgstr "未知" - -msgid "Any date" -msgstr "任何日期" - -msgid "Today" -msgstr "今天" - -msgid "Past 7 days" -msgstr "過去 7 天" - -msgid "This month" -msgstr "本月" - -msgid "This year" -msgstr "今年" - -msgid "No date" -msgstr "沒有日期" - -msgid "Has date" -msgstr "有日期" - -msgid "Empty" -msgstr "空的" - -msgid "Not empty" -msgstr "非空的" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "請輸入正確的工作人員帳號%(username)s及密碼。請注意兩者皆區分大小寫。" - -msgid "Action:" -msgstr "動作:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "新增其它 %(verbose_name)s" - -msgid "Remove" -msgstr "移除" - -msgid "Addition" -msgstr "新增" - -msgid "Change" -msgstr "修改" - -msgid "Deletion" -msgstr "删除" - -msgid "action time" -msgstr "動作時間" - -msgid "user" -msgstr "使用者" - -msgid "content type" -msgstr "內容類型" - -msgid "object id" -msgstr "物件 id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "物件 repr" - -msgid "action flag" -msgstr "動作旗標" - -msgid "change message" -msgstr "修改訊息" - -msgid "log entry" -msgstr "日誌記錄" - -msgid "log entries" -msgstr "日誌紀錄" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" 已新增。" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\" - %(changes)s 已修改。" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" 已刪除。" - -msgid "LogEntry Object" -msgstr "日誌記錄物件" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} \"{object}\" 已新增。" - -msgid "Added." -msgstr "已新增。" - -msgid "and" -msgstr "和" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} \"{object}\" 的 {fields} 已修改。" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} 已修改。" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} \"{object}\" 已刪除。" - -msgid "No fields changed." -msgstr "沒有欄位被修改。" - -msgid "None" -msgstr "無" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "按住 \"Control\", 或者在 Mac 上按 \"Command\", 以選取更多值" - -msgid "Select this object for an action - {}" -msgstr "選擇此對象進行操作 - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" 已成功新增。" - -msgid "You may edit it again below." -msgstr "您可以在下面再次編輯它." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} \"{obj}\" 新增成功。你可以在下方加入其他 {name}。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" 修改成功。你可以在下方再次編輯。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" 修改成功。你可以在下方加入其他 {name}。" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "成功修改了 {name}“{obj}”。" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "必須要有項目被選中才能進行動作。沒有任何項目被修改。" - -msgid "No action selected." -msgstr "沒有動作被選取。" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "成功删除了 %(name)s“%(obj)s”。" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "不存在 ID 為「%(key)s」的 %(name)s。或許它已被刪除?" - -#, python-format -msgid "Add %s" -msgstr "新增 %s" - -#, python-format -msgid "Change %s" -msgstr "修改 %s" - -#, python-format -msgid "View %s" -msgstr "查看 %s" - -msgid "Database error" -msgstr "資料庫錯誤" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "共 %(count)s %(name)s 已修改成功。" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "選取了 %(total_count)s 個" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s 中 0 個被選取" - -msgid "Delete" -msgstr "刪除" - -#, python-format -msgid "Change history: %s" -msgstr "修改歷史: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"刪除 %(class_name)s %(instance)s 將會同時刪除下面受保護的相關物件:" -"%(related_objects)s" - -msgid "Django site admin" -msgstr "Django 網站管理" - -msgid "Django administration" -msgstr "Django 管理" - -msgid "Site administration" -msgstr "網站管理" - -msgid "Log in" -msgstr "登入" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s 管理" - -msgid "Page not found" -msgstr "找不到頁面" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "很抱歉,請求頁面不存在。" - -msgid "Home" -msgstr "首頁" - -msgid "Server error" -msgstr "伺服器錯誤" - -msgid "Server error (500)" -msgstr "伺服器錯誤 (500)" - -msgid "Server Error (500)" -msgstr "伺服器錯誤 (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"存在一個錯誤。已透過電子郵件回報給網站管理員,並且應該很快就會被修正。謝謝您" -"的耐心等待。" - -msgid "Run the selected action" -msgstr "執行選取的動作" - -msgid "Go" -msgstr "執行" - -msgid "Click here to select the objects across all pages" -msgstr "點選這裡可選取全部頁面的物件" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "選擇全部 %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "清除選擇" - -msgid "Breadcrumbs" -msgstr "導覽路徑" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s 應用程式中的模型" - -msgid "Model name" -msgstr "型號" - -msgid "Add link" -msgstr "加入鏈結" - -msgid "Change or view list link" -msgstr "更改或檢視列表鏈結" - -msgid "Add" -msgstr "新增" - -msgid "View" -msgstr "查看" - -msgid "You don’t have permission to view or edit anything." -msgstr "你沒有查看或編輯的權限。" - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "建立帳號後即可編輯更多用戶選項。" - -msgid "Error:" -msgstr "錯誤:" - -msgid "Change password" -msgstr "修改密碼" - -msgid "Set password" -msgstr "設定密碼" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "請修正以下錯誤。" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "為使用者%(username)s輸入一個新的密碼。" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "這會 啟用 本用戶基於密碼的驗證" - -msgid "Disable password-based authentication" -msgstr "停用基於密碼的驗證" - -msgid "Enable password-based authentication" -msgstr "啟用基於密碼的驗證" - -msgid "Skip to main content" -msgstr "跳到主要內容" - -msgid "Welcome," -msgstr "歡迎," - -msgid "View site" -msgstr "檢視網站" - -msgid "Documentation" -msgstr "文件" - -msgid "Log out" -msgstr "登出" - -#, python-format -msgid "Add %(name)s" -msgstr "新增 %(name)s" - -msgid "History" -msgstr "歷史" - -msgid "View on site" -msgstr "在網站上檢視" - -msgid "Filter" -msgstr "過濾器" - -msgid "Hide counts" -msgstr "隱藏計數" - -msgid "Show counts" -msgstr "顯示計數" - -msgid "Clear all filters" -msgstr "清除所有篩選" - -msgid "Remove from sorting" -msgstr "從排序中移除" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "優先排序:%(priority_number)s" - -msgid "Toggle sorting" -msgstr "切換排序" - -msgid "Toggle theme (current theme: auto)" -msgstr "切換主題(當前主題:自動)" - -msgid "Toggle theme (current theme: light)" -msgstr "切換主題(當前主題:淺色)" - -msgid "Toggle theme (current theme: dark)" -msgstr "切換主題(當前主題:深色)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"刪除 %(object_name)s '%(escaped_object)s' 會把相關的物件也刪除,不過你的帳號" -"並沒有刪除以下型態物件的權限:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"要刪除 %(object_name)s '%(escaped_object)s', 將要求刪除下面受保護的相關物件:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"你確定想要刪除 %(object_name)s \"%(escaped_object)s\"?以下所有的相關項目都會" -"被刪除:" - -msgid "Objects" -msgstr "物件" - -msgid "Yes, I’m sure" -msgstr "是的,我確定" - -msgid "No, take me back" -msgstr "不,返回" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"要刪除所選的 %(objects_name)s, 結果會刪除相關物件, 但你的帳號無權刪除下面物件" -"型態:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "要刪除所選的 %(objects_name)s, 將要求刪除下面受保護的相關物件:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"你是否確定要刪除已選的 %(objects_name)s? 下面全部物件及其相關項目都將被刪除:" - -msgid "Delete?" -msgstr "刪除?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " 以 %(filter_title)s" - -msgid "Summary" -msgstr "總結" - -msgid "Recent actions" -msgstr "最近的動作" - -msgid "My actions" -msgstr "我的動作" - -msgid "None available" -msgstr "無資料" - -msgid "Added:" -msgstr "已新增。" - -msgid "Changed:" -msgstr "已修改:" - -msgid "Deleted:" -msgstr "已刪除:" - -msgid "Unknown content" -msgstr "未知內容" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"你的資料庫安裝有錯誤。確定資料庫表格已經建立,並確定資料庫可被合適的使用者讀" -"取。" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"您目前以%(username)s登入,但並沒有瀏覽此頁面的權限。您是否希望以其他帳號登" -"入?" - -msgid "Forgotten your login credentials?" -msgstr "忘記您的簽入証 ?" - -msgid "Toggle navigation" -msgstr "切換導航" - -msgid "Sidebar" -msgstr "側邊欄" - -msgid "Start typing to filter…" -msgstr "輸入內容開始篩選..." - -msgid "Filter navigation items" -msgstr "篩選導航項目" - -msgid "Date/time" -msgstr "日期/時間" - -msgid "User" -msgstr "使用者" - -msgid "Action" -msgstr "動作" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "紀錄項目" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "該物件沒有修改的歷史紀錄。它可能不是透過此管理網站新增的。" - -msgid "Show all" -msgstr "顯示全部" - -msgid "Save" -msgstr "儲存" - -msgid "Popup closing…" -msgstr "關閉彈跳視窗中..." - -msgid "Search" -msgstr "搜尋" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s 結果" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "總共 %(full_result_count)s" - -msgid "Save as new" -msgstr "儲存為新的" - -msgid "Save and add another" -msgstr "儲存並新增另一個" - -msgid "Save and continue editing" -msgstr "儲存並繼續編輯" - -msgid "Save and view" -msgstr "儲存並查看" - -msgid "Close" -msgstr "關閉" - -#, python-format -msgid "Change selected %(model)s" -msgstr "修改所選的 %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "新增其它 %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "刪除所選的 %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "查看已選擇的%(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "感謝您今天在網站上度過了一段美好的時光。" - -msgid "Log in again" -msgstr "重新登入" - -msgid "Password change" -msgstr "密碼修改" - -msgid "Your password was changed." -msgstr "您的密碼已修改。" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "為了安全上的考量,請輸入你的舊密碼,然後輸入兩次新密碼已確保輸入正確。" - -msgid "Change my password" -msgstr "修改我的密碼" - -msgid "Password reset" -msgstr "重設密碼" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "你的密碼已設置,現在可以繼續登入。" - -msgid "Password reset confirmation" -msgstr "密碼重設確認" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "請輸入新密碼兩次, 以便系統確認輸入無誤。" - -msgid "New password:" -msgstr "新密碼:" - -msgid "Confirm password:" -msgstr "確認密碼:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "密碼重設連結無效,可能已被使用。請重新申請密碼重設。" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"若您提交的電子郵件地址存在對應帳號,我們已寄出重設密碼的相關指示。您應該很快" -"就會收到。" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"如果您未收到電子郵件,請確認您輸入的電子郵件地址與您註冊時輸入的一致,並檢查" -"您的垃圾郵件匣。" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "這封電子郵件來自 %(site_name)s,因為您要求為帳號重新設定密碼。" - -msgid "Please go to the following page and choose a new password:" -msgstr "請到該頁面選擇一個新的密碼:" - -msgid "In case you’ve forgotten, you are:" -msgstr "如果您真忘了,您是: " - -msgid "Thanks for using our site!" -msgstr "感謝使用本網站!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s 團隊" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"忘記您的密碼? 請在下面輸入您的電子郵件, 然後我們會寄出設定新密碼的操作指示。" - -msgid "Email address:" -msgstr "電子信箱:" - -msgid "Reset my password" -msgstr "重設我的密碼" - -msgid "Select all objects on this page for an action" -msgstr "選擇此頁面上的所有物件執行操作" - -msgid "All dates" -msgstr "所有日期" - -#, python-format -msgid "Select %s" -msgstr "選擇 %s" - -#, python-format -msgid "Select %s to change" -msgstr "選擇 %s 來修改" - -#, python-format -msgid "Select %s to view" -msgstr "選擇%s查看" - -msgid "Date:" -msgstr "日期" - -msgid "Time:" -msgstr "時間" - -msgid "Lookup" -msgstr "查找" - -msgid "Currently:" -msgstr "目前:" - -msgid "Change:" -msgstr "變動:" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 80e5052..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po b/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po deleted file mode 100644 index 6d8705f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,309 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# coby2023t, 2025 -# ilay , 2012 -# mail6543210 , 2013 -# tcc , 2011 -# Tzu-ping Chung , 2016 -# YAO WEN LIANG, 2024 -# Yeh-Yung , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: coby2023t, 2025\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "可用 %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "想選擇 %s 可先選取它們再點 \"選取\" 箭頭按鈕。" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "在此框輸入以過濾可用的 %s 列表。" - -msgid "Filter" -msgstr "過濾器" - -#, javascript-format -msgid "Choose all %s" -msgstr "選取全部 %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "選擇已選取的 %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s 被選" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "想移除 %s 可先選取它們再點 \"移除\" 箭頭按鈕。" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "在此框輸入以過濾所選的 %s 列表。" - -msgid "(click to clear)" -msgstr "(點擊清除)" - -#, javascript-format -msgid "Remove all %s" -msgstr "移除全部 %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s所選選項不可見" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s 中 %(sel)s 個被選" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "你尚未儲存一個可編輯欄位的變更。如果你執行動作, 未儲存的變更將會遺失。" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"你已選了一個操作, 但有一個可編輯欄位的變更尚未儲存。請點選 OK 進行儲存。你需" -"要重新執行該動作。" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"你已選了一個操作, 但沒有任何改變。你可能動到 '執行' 按鈕, 而不是 '儲存' 按" -"鈕。" - -msgid "Now" -msgstr "現在" - -msgid "Midnight" -msgstr "午夜" - -msgid "6 a.m." -msgstr "上午 6 點" - -msgid "Noon" -msgstr "中午" - -msgid "6 p.m." -msgstr "下午 6 點" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "備註:您的電腦時間比伺服器快 %s 小時。" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "備註:您的電腦時間比伺服器慢 %s 小時。" - -msgid "Choose a Time" -msgstr "選擇一個時間" - -msgid "Choose a time" -msgstr "選擇一個時間" - -msgid "Cancel" -msgstr "取消" - -msgid "Today" -msgstr "今天" - -msgid "Choose a Date" -msgstr "選擇一個日期" - -msgid "Yesterday" -msgstr "昨天" - -msgid "Tomorrow" -msgstr "明天" - -msgid "January" -msgstr "一月" - -msgid "February" -msgstr "二月" - -msgid "March" -msgstr "三月" - -msgid "April" -msgstr "四月" - -msgid "May" -msgstr "五月" - -msgid "June" -msgstr "六月" - -msgid "July" -msgstr "七月" - -msgid "August" -msgstr "八月" - -msgid "September" -msgstr "九月" - -msgid "October" -msgstr "十月" - -msgid "November" -msgstr "十一月" - -msgid "December" -msgstr "十二月" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "一月" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "二月" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "三月" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "四月" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "五月" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "六月" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "七月" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "八月" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "九月" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "十月" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "十一月" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "十二月" - -msgid "Sunday" -msgstr "星期日" - -msgid "Monday" -msgstr "星期一" - -msgid "Tuesday" -msgstr "星期二" - -msgid "Wednesday" -msgstr "星期三" - -msgid "Thursday" -msgstr "星期四" - -msgid "Friday" -msgstr "星期五" - -msgid "Saturday" -msgstr "星期六" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "星期日" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "星期一" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "星期二" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "星期三" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "星期四" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "星期五" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "星期六" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "日" - -msgctxt "one letter Monday" -msgid "M" -msgstr "一" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "二" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "三" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "四" - -msgctxt "one letter Friday" -msgid "F" -msgstr "五" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "六" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/0001_initial.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/0001_initial.py deleted file mode 100644 index 6270e10..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/0001_initial.py +++ /dev/null @@ -1,75 +0,0 @@ -import django.contrib.admin.models -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("contenttypes", "__first__"), - ] - - operations = [ - migrations.CreateModel( - name="LogEntry", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "action_time", - models.DateTimeField(auto_now=True, verbose_name="action time"), - ), - ( - "object_id", - models.TextField(null=True, verbose_name="object id", blank=True), - ), - ( - "object_repr", - models.CharField(max_length=200, verbose_name="object repr"), - ), - ( - "action_flag", - models.PositiveSmallIntegerField(verbose_name="action flag"), - ), - ( - "change_message", - models.TextField(verbose_name="change message", blank=True), - ), - ( - "content_type", - models.ForeignKey( - on_delete=models.SET_NULL, - blank=True, - null=True, - to="contenttypes.ContentType", - verbose_name="content type", - ), - ), - ( - "user", - models.ForeignKey( - to=settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - verbose_name="user", - ), - ), - ], - options={ - "ordering": ["-action_time"], - "db_table": "django_admin_log", - "verbose_name": "log entry", - "verbose_name_plural": "log entries", - }, - bases=(models.Model,), - managers=[ - ("objects", django.contrib.admin.models.LogEntryManager()), - ], - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py deleted file mode 100644 index 7fcf9c0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.db import migrations, models -from django.utils import timezone - - -class Migration(migrations.Migration): - dependencies = [ - ("admin", "0001_initial"), - ] - - # No database changes; removes auto_add and adds default/editable. - operations = [ - migrations.AlterField( - model_name="logentry", - name="action_time", - field=models.DateTimeField( - verbose_name="action time", - default=timezone.now, - editable=False, - ), - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py deleted file mode 100644 index a73e55f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("admin", "0002_logentry_remove_auto_add"), - ] - - # No database changes; adds choices to action_flag. - operations = [ - migrations.AlterField( - model_name="logentry", - name="action_flag", - field=models.PositiveSmallIntegerField( - choices=[(1, "Addition"), (2, "Change"), (3, "Deletion")], - verbose_name="action flag", - ), - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/models.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/models.py deleted file mode 100644 index 957c9e4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/models.py +++ /dev/null @@ -1,248 +0,0 @@ -import json -import warnings - -from django.conf import settings -from django.contrib.admin.utils import quote -from django.contrib.contenttypes.models import ContentType -from django.db import models -from django.urls import NoReverseMatch, reverse -from django.utils import timezone -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.text import get_text_list -from django.utils.translation import gettext -from django.utils.translation import gettext_lazy as _ - -ADDITION = 1 -CHANGE = 2 -DELETION = 3 - -ACTION_FLAG_CHOICES = [ - (ADDITION, _("Addition")), - (CHANGE, _("Change")), - (DELETION, _("Deletion")), -] - - -class LogEntryManager(models.Manager): - use_in_migrations = True - - def log_action( - self, - user_id, - content_type_id, - object_id, - object_repr, - action_flag, - change_message="", - ): - warnings.warn( - "LogEntryManager.log_action() is deprecated. Use log_actions() instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - if isinstance(change_message, list): - change_message = json.dumps(change_message) - return self.model.objects.create( - user_id=user_id, - content_type_id=content_type_id, - object_id=str(object_id), - object_repr=object_repr[:200], - action_flag=action_flag, - change_message=change_message, - ) - - def log_actions( - self, user_id, queryset, action_flag, change_message="", *, single_object=False - ): - # RemovedInDjango60Warning. - if type(self).log_action != LogEntryManager.log_action: - warnings.warn( - "The usage of log_action() is deprecated. Implement log_actions() " - "instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - return [ - self.log_action( - user_id=user_id, - content_type_id=ContentType.objects.get_for_model( - obj, for_concrete_model=False - ).id, - object_id=obj.pk, - object_repr=str(obj), - action_flag=action_flag, - change_message=change_message, - ) - for obj in queryset - ] - - if isinstance(change_message, list): - change_message = json.dumps(change_message) - - log_entry_list = [ - self.model( - user_id=user_id, - content_type_id=ContentType.objects.get_for_model( - obj, for_concrete_model=False - ).id, - object_id=obj.pk, - object_repr=str(obj)[:200], - action_flag=action_flag, - change_message=change_message, - ) - for obj in queryset - ] - - if len(log_entry_list) == 1: - instance = log_entry_list[0] - instance.save() - if single_object: - return instance - return [instance] - - return self.model.objects.bulk_create(log_entry_list) - - -class LogEntry(models.Model): - action_time = models.DateTimeField( - _("action time"), - default=timezone.now, - editable=False, - ) - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - models.CASCADE, - verbose_name=_("user"), - ) - content_type = models.ForeignKey( - ContentType, - models.SET_NULL, - verbose_name=_("content type"), - blank=True, - null=True, - ) - object_id = models.TextField(_("object id"), blank=True, null=True) - # Translators: 'repr' means representation - # (https://docs.python.org/library/functions.html#repr) - object_repr = models.CharField(_("object repr"), max_length=200) - action_flag = models.PositiveSmallIntegerField( - _("action flag"), choices=ACTION_FLAG_CHOICES - ) - # change_message is either a string or a JSON structure - change_message = models.TextField(_("change message"), blank=True) - - objects = LogEntryManager() - - class Meta: - verbose_name = _("log entry") - verbose_name_plural = _("log entries") - db_table = "django_admin_log" - ordering = ["-action_time"] - - def __repr__(self): - return str(self.action_time) - - def __str__(self): - if self.is_addition(): - return gettext("Added “%(object)s”.") % {"object": self.object_repr} - elif self.is_change(): - return gettext("Changed “%(object)s” — %(changes)s") % { - "object": self.object_repr, - "changes": self.get_change_message(), - } - elif self.is_deletion(): - return gettext("Deleted “%(object)s.”") % {"object": self.object_repr} - - return gettext("LogEntry Object") - - def is_addition(self): - return self.action_flag == ADDITION - - def is_change(self): - return self.action_flag == CHANGE - - def is_deletion(self): - return self.action_flag == DELETION - - def get_change_message(self): - """ - If self.change_message is a JSON structure, interpret it as a change - string, properly translated. - """ - if self.change_message and self.change_message[0] == "[": - try: - change_message = json.loads(self.change_message) - except json.JSONDecodeError: - return self.change_message - messages = [] - for sub_message in change_message: - if "added" in sub_message: - if sub_message["added"]: - sub_message["added"]["name"] = gettext( - sub_message["added"]["name"] - ) - messages.append( - gettext("Added {name} “{object}”.").format( - **sub_message["added"] - ) - ) - else: - messages.append(gettext("Added.")) - - elif "changed" in sub_message: - sub_message["changed"]["fields"] = get_text_list( - [ - gettext(field_name) - for field_name in sub_message["changed"]["fields"] - ], - gettext("and"), - ) - if "name" in sub_message["changed"]: - sub_message["changed"]["name"] = gettext( - sub_message["changed"]["name"] - ) - messages.append( - gettext("Changed {fields} for {name} “{object}”.").format( - **sub_message["changed"] - ) - ) - else: - messages.append( - gettext("Changed {fields}.").format( - **sub_message["changed"] - ) - ) - - elif "deleted" in sub_message: - sub_message["deleted"]["name"] = gettext( - sub_message["deleted"]["name"] - ) - messages.append( - gettext("Deleted {name} “{object}”.").format( - **sub_message["deleted"] - ) - ) - - change_message = " ".join(msg[0].upper() + msg[1:] for msg in messages) - return change_message or gettext("No fields changed.") - else: - return self.change_message - - def get_edited_object(self): - """Return the edited object represented by this log entry.""" - return self.content_type.get_object_for_this_type(pk=self.object_id) - - def get_admin_url(self): - """ - Return the admin URL to edit the object represented by this log entry. - """ - if self.content_type and self.object_id: - url_name = "admin:%s_%s_change" % ( - self.content_type.app_label, - self.content_type.model, - ) - try: - return reverse(url_name, args=(quote(self.object_id),)) - except NoReverseMatch: - pass - return None diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/options.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/options.py deleted file mode 100644 index 69b0cc0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/options.py +++ /dev/null @@ -1,2600 +0,0 @@ -import copy -import enum -import json -import re -import warnings -from functools import partial, update_wrapper -from urllib.parse import parse_qsl -from urllib.parse import quote as urlquote -from urllib.parse import urlsplit - -from django import forms -from django.conf import settings -from django.contrib import messages -from django.contrib.admin import helpers, widgets -from django.contrib.admin.checks import ( - BaseModelAdminChecks, - InlineModelAdminChecks, - ModelAdminChecks, -) -from django.contrib.admin.exceptions import DisallowedModelAdminToField, NotRegistered -from django.contrib.admin.templatetags.admin_urls import add_preserved_filters -from django.contrib.admin.utils import ( - NestedObjects, - construct_change_message, - flatten_fieldsets, - get_deleted_objects, - lookup_spawns_duplicates, - model_format_dict, - model_ngettext, - quote, - unquote, -) -from django.contrib.admin.widgets import AutocompleteSelect, AutocompleteSelectMultiple -from django.contrib.auth import get_permission_codename -from django.core.exceptions import ( - FieldDoesNotExist, - FieldError, - PermissionDenied, - ValidationError, -) -from django.core.paginator import Paginator -from django.db import models, router, transaction -from django.db.models.constants import LOOKUP_SEP -from django.db.models.functions import Cast -from django.forms.formsets import DELETION_FIELD_NAME, all_valid -from django.forms.models import ( - BaseInlineFormSet, - inlineformset_factory, - modelform_defines_fields, - modelform_factory, - modelformset_factory, -) -from django.forms.widgets import CheckboxSelectMultiple, SelectMultiple -from django.http import HttpResponseRedirect -from django.http.response import HttpResponseBase -from django.template.response import SimpleTemplateResponse, TemplateResponse -from django.urls import reverse -from django.utils.decorators import method_decorator -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.html import format_html -from django.utils.http import urlencode -from django.utils.safestring import mark_safe -from django.utils.text import ( - capfirst, - format_lazy, - get_text_list, - smart_split, - unescape_string_literal, -) -from django.utils.translation import gettext as _ -from django.utils.translation import ngettext -from django.views.decorators.csrf import csrf_protect -from django.views.generic import RedirectView - -IS_POPUP_VAR = "_popup" -TO_FIELD_VAR = "_to_field" -IS_FACETS_VAR = "_facets" - - -class ShowFacets(enum.Enum): - NEVER = "NEVER" - ALLOW = "ALLOW" - ALWAYS = "ALWAYS" - - -HORIZONTAL, VERTICAL = 1, 2 - - -def get_content_type_for_model(obj): - # Since this module gets imported in the application's root package, - # it cannot import models from other applications at the module level. - from django.contrib.contenttypes.models import ContentType - - return ContentType.objects.get_for_model(obj, for_concrete_model=False) - - -def get_ul_class(radio_style): - return "radiolist" if radio_style == VERTICAL else "radiolist inline" - - -class IncorrectLookupParameters(Exception): - pass - - -# Defaults for formfield_overrides. ModelAdmin subclasses can change this -# by adding to ModelAdmin.formfield_overrides. - -FORMFIELD_FOR_DBFIELD_DEFAULTS = { - models.DateTimeField: { - "form_class": forms.SplitDateTimeField, - "widget": widgets.AdminSplitDateTime, - }, - models.DateField: {"widget": widgets.AdminDateWidget}, - models.TimeField: {"widget": widgets.AdminTimeWidget}, - models.TextField: {"widget": widgets.AdminTextareaWidget}, - models.URLField: {"widget": widgets.AdminURLFieldWidget}, - models.IntegerField: {"widget": widgets.AdminIntegerFieldWidget}, - models.BigIntegerField: {"widget": widgets.AdminBigIntegerFieldWidget}, - models.CharField: {"widget": widgets.AdminTextInputWidget}, - models.ImageField: {"widget": widgets.AdminFileWidget}, - models.FileField: {"widget": widgets.AdminFileWidget}, - models.EmailField: {"widget": widgets.AdminEmailInputWidget}, - models.UUIDField: {"widget": widgets.AdminUUIDInputWidget}, -} - -csrf_protect_m = method_decorator(csrf_protect) - - -class BaseModelAdmin(metaclass=forms.MediaDefiningClass): - """Functionality common to both ModelAdmin and InlineAdmin.""" - - autocomplete_fields = () - raw_id_fields = () - fields = None - exclude = None - fieldsets = None - form = forms.ModelForm - filter_vertical = () - filter_horizontal = () - radio_fields = {} - prepopulated_fields = {} - formfield_overrides = {} - readonly_fields = () - ordering = None - sortable_by = None - view_on_site = True - show_full_result_count = True - checks_class = BaseModelAdminChecks - - def check(self, **kwargs): - return self.checks_class().check(self, **kwargs) - - def __init__(self): - # Merge FORMFIELD_FOR_DBFIELD_DEFAULTS with the formfield_overrides - # rather than simply overwriting. - overrides = copy.deepcopy(FORMFIELD_FOR_DBFIELD_DEFAULTS) - for k, v in self.formfield_overrides.items(): - overrides.setdefault(k, {}).update(v) - self.formfield_overrides = overrides - - def formfield_for_dbfield(self, db_field, request, **kwargs): - """ - Hook for specifying the form Field instance for a given database Field - instance. - - If kwargs are given, they're passed to the form Field's constructor. - """ - # If the field specifies choices, we don't need to look for special - # admin widgets - we just need to use a select widget of some kind. - if db_field.choices: - return self.formfield_for_choice_field(db_field, request, **kwargs) - - # ForeignKey or ManyToManyFields - if isinstance(db_field, (models.ForeignKey, models.ManyToManyField)): - # Combine the field kwargs with any options for formfield_overrides. - # Make sure the passed in **kwargs override anything in - # formfield_overrides because **kwargs is more specific, and should - # always win. - if db_field.__class__ in self.formfield_overrides: - kwargs = {**self.formfield_overrides[db_field.__class__], **kwargs} - - # Get the correct formfield. - if isinstance(db_field, models.ForeignKey): - formfield = self.formfield_for_foreignkey(db_field, request, **kwargs) - elif isinstance(db_field, models.ManyToManyField): - formfield = self.formfield_for_manytomany(db_field, request, **kwargs) - - # For non-raw_id fields, wrap the widget with a wrapper that adds - # extra HTML -- the "add other" interface -- to the end of the - # rendered output. formfield can be None if it came from a - # OneToOneField with parent_link=True or a M2M intermediary. - if formfield and db_field.name not in self.raw_id_fields: - try: - related_modeladmin = self.admin_site.get_model_admin( - db_field.remote_field.model - ) - except NotRegistered: - wrapper_kwargs = {} - else: - wrapper_kwargs = { - "can_add_related": related_modeladmin.has_add_permission( - request - ), - "can_change_related": related_modeladmin.has_change_permission( - request - ), - "can_delete_related": related_modeladmin.has_delete_permission( - request - ), - "can_view_related": related_modeladmin.has_view_permission( - request - ), - } - formfield.widget = widgets.RelatedFieldWidgetWrapper( - formfield.widget, - db_field.remote_field, - self.admin_site, - **wrapper_kwargs, - ) - - return formfield - - # If we've got overrides for the formfield defined, use 'em. **kwargs - # passed to formfield_for_dbfield override the defaults. - for klass in db_field.__class__.mro(): - if klass in self.formfield_overrides: - kwargs = {**copy.deepcopy(self.formfield_overrides[klass]), **kwargs} - return db_field.formfield(**kwargs) - - # For any other type of field, just call its formfield() method. - return db_field.formfield(**kwargs) - - def formfield_for_choice_field(self, db_field, request, **kwargs): - """ - Get a form Field for a database Field that has declared choices. - """ - # If the field is named as a radio_field, use a RadioSelect - if db_field.name in self.radio_fields: - # Avoid stomping on custom widget/choices arguments. - if "widget" not in kwargs: - kwargs["widget"] = widgets.AdminRadioSelect( - attrs={ - "class": get_ul_class(self.radio_fields[db_field.name]), - } - ) - if "choices" not in kwargs: - kwargs["choices"] = db_field.get_choices( - include_blank=db_field.blank, blank_choice=[("", _("None"))] - ) - return db_field.formfield(**kwargs) - - def get_field_queryset(self, db, db_field, request): - """ - If the ModelAdmin specifies ordering, the queryset should respect that - ordering. Otherwise don't specify the queryset, let the field decide - (return None in that case). - """ - try: - related_admin = self.admin_site.get_model_admin(db_field.remote_field.model) - except NotRegistered: - return None - else: - ordering = related_admin.get_ordering(request) - if ordering is not None and ordering != (): - return db_field.remote_field.model._default_manager.using(db).order_by( - *ordering - ) - return None - - def formfield_for_foreignkey(self, db_field, request, **kwargs): - """ - Get a form Field for a ForeignKey. - """ - db = kwargs.get("using") - - if "widget" not in kwargs: - if db_field.name in self.get_autocomplete_fields(request): - kwargs["widget"] = AutocompleteSelect( - db_field, self.admin_site, using=db - ) - elif db_field.name in self.raw_id_fields: - kwargs["widget"] = widgets.ForeignKeyRawIdWidget( - db_field.remote_field, self.admin_site, using=db - ) - elif db_field.name in self.radio_fields: - kwargs["widget"] = widgets.AdminRadioSelect( - attrs={ - "class": get_ul_class(self.radio_fields[db_field.name]), - } - ) - kwargs["empty_label"] = ( - kwargs.get("empty_label", _("None")) if db_field.blank else None - ) - - if "queryset" not in kwargs: - queryset = self.get_field_queryset(db, db_field, request) - if queryset is not None: - kwargs["queryset"] = queryset - - return db_field.formfield(**kwargs) - - def formfield_for_manytomany(self, db_field, request, **kwargs): - """ - Get a form Field for a ManyToManyField. - """ - # If it uses an intermediary model that isn't auto created, don't show - # a field in admin. - if not db_field.remote_field.through._meta.auto_created: - return None - db = kwargs.get("using") - - if "widget" not in kwargs: - autocomplete_fields = self.get_autocomplete_fields(request) - if db_field.name in autocomplete_fields: - kwargs["widget"] = AutocompleteSelectMultiple( - db_field, - self.admin_site, - using=db, - ) - elif db_field.name in self.raw_id_fields: - kwargs["widget"] = widgets.ManyToManyRawIdWidget( - db_field.remote_field, - self.admin_site, - using=db, - ) - elif db_field.name in [*self.filter_vertical, *self.filter_horizontal]: - kwargs["widget"] = widgets.FilteredSelectMultiple( - db_field.verbose_name, db_field.name in self.filter_vertical - ) - if "queryset" not in kwargs: - queryset = self.get_field_queryset(db, db_field, request) - if queryset is not None: - kwargs["queryset"] = queryset - - form_field = db_field.formfield(**kwargs) - if ( - isinstance(form_field.widget, SelectMultiple) - and form_field.widget.allow_multiple_selected - and not isinstance( - form_field.widget, (CheckboxSelectMultiple, AutocompleteSelectMultiple) - ) - ): - msg = _( - "Hold down “Control”, or “Command” on a Mac, to select more than one." - ) - help_text = form_field.help_text - form_field.help_text = ( - format_lazy("{} {}", help_text, msg) if help_text else msg - ) - return form_field - - def get_autocomplete_fields(self, request): - """ - Return a list of ForeignKey and/or ManyToMany fields which should use - an autocomplete widget. - """ - return self.autocomplete_fields - - def get_view_on_site_url(self, obj=None): - if obj is None or not self.view_on_site: - return None - - if callable(self.view_on_site): - return self.view_on_site(obj) - elif hasattr(obj, "get_absolute_url"): - # use the ContentType lookup if view_on_site is True - return reverse( - "admin:view_on_site", - kwargs={ - "content_type_id": get_content_type_for_model(obj).pk, - "object_id": obj.pk, - }, - current_app=self.admin_site.name, - ) - - def get_empty_value_display(self): - """ - Return the empty_value_display set on ModelAdmin or AdminSite. - """ - try: - return mark_safe(self.empty_value_display) - except AttributeError: - return mark_safe(self.admin_site.empty_value_display) - - def get_exclude(self, request, obj=None): - """ - Hook for specifying exclude. - """ - return self.exclude - - def get_fields(self, request, obj=None): - """ - Hook for specifying fields. - """ - if self.fields: - return self.fields - # _get_form_for_get_fields() is implemented in subclasses. - form = self._get_form_for_get_fields(request, obj) - return [*form.base_fields, *self.get_readonly_fields(request, obj)] - - def get_fieldsets(self, request, obj=None): - """ - Hook for specifying fieldsets. - """ - if self.fieldsets: - return self.fieldsets - return [(None, {"fields": self.get_fields(request, obj)})] - - def get_inlines(self, request, obj): - """Hook for specifying custom inlines.""" - return self.inlines - - def get_ordering(self, request): - """ - Hook for specifying field ordering. - """ - return self.ordering or () # otherwise we might try to *None, which is bad ;) - - def get_readonly_fields(self, request, obj=None): - """ - Hook for specifying custom readonly fields. - """ - return self.readonly_fields - - def get_prepopulated_fields(self, request, obj=None): - """ - Hook for specifying custom prepopulated fields. - """ - return self.prepopulated_fields - - def get_queryset(self, request): - """ - Return a QuerySet of all model instances that can be edited by the - admin site. This is used by changelist_view. - """ - qs = self.model._default_manager.get_queryset() - # TODO: this should be handled by some parameter to the ChangeList. - ordering = self.get_ordering(request) - if ordering: - qs = qs.order_by(*ordering) - return qs - - def get_sortable_by(self, request): - """Hook for specifying which fields can be sorted in the changelist.""" - return ( - self.sortable_by - if self.sortable_by is not None - else self.get_list_display(request) - ) - - # RemovedInDjango60Warning: when the deprecation ends, replace with: - # def lookup_allowed(self, lookup, value, request): - def lookup_allowed(self, lookup, value, request=None): - from django.contrib.admin.filters import SimpleListFilter - - model = self.model - # Check FKey lookups that are allowed, so that popups produced by - # ForeignKeyRawIdWidget, on the basis of ForeignKey.limit_choices_to, - # are allowed to work. - for fk_lookup in model._meta.related_fkey_lookups: - # As ``limit_choices_to`` can be a callable, invoke it here. - if callable(fk_lookup): - fk_lookup = fk_lookup() - if (lookup, value) in widgets.url_params_from_lookup_dict( - fk_lookup - ).items(): - return True - - relation_parts = [] - prev_field = None - parts = lookup.split(LOOKUP_SEP) - for part in parts: - try: - field = model._meta.get_field(part) - except FieldDoesNotExist: - # Lookups on nonexistent fields are ok, since they're ignored - # later. - break - if not prev_field or ( - prev_field.is_relation - and field not in model._meta.parents.values() - and field is not model._meta.auto_field - and ( - model._meta.auto_field is None - or part not in getattr(prev_field, "to_fields", []) - ) - and (field.is_relation or not field.primary_key) - ): - relation_parts.append(part) - if not getattr(field, "path_infos", None): - # This is not a relational field, so further parts - # must be transforms. - break - prev_field = field - model = field.path_infos[-1].to_opts.model - - if len(relation_parts) <= 1: - # Either a local field filter, or no fields at all. - return True - valid_lookups = {self.date_hierarchy} - # RemovedInDjango60Warning: when the deprecation ends, replace with: - # for filter_item in self.get_list_filter(request): - list_filter = ( - self.get_list_filter(request) if request is not None else self.list_filter - ) - for filter_item in list_filter: - if isinstance(filter_item, type) and issubclass( - filter_item, SimpleListFilter - ): - valid_lookups.add(filter_item.parameter_name) - elif isinstance(filter_item, (list, tuple)): - valid_lookups.add(filter_item[0]) - else: - valid_lookups.add(filter_item) - - # Is it a valid relational lookup? - return not { - LOOKUP_SEP.join(relation_parts), - LOOKUP_SEP.join(relation_parts + [part]), - }.isdisjoint(valid_lookups) - - def to_field_allowed(self, request, to_field): - """ - Return True if the model associated with this admin should be - allowed to be referenced by the specified field. - """ - try: - field = self.opts.get_field(to_field) - except FieldDoesNotExist: - return False - - # Always allow referencing the primary key since it's already possible - # to get this information from the change view URL. - if field.primary_key: - return True - - # Allow reverse relationships to models defining m2m fields if they - # target the specified field. - for many_to_many in self.opts.many_to_many: - if many_to_many.m2m_target_field_name() == to_field: - return True - - # Make sure at least one of the models registered for this site - # references this field through a FK or a M2M relationship. - registered_models = set() - for model, admin in self.admin_site._registry.items(): - registered_models.add(model) - for inline in admin.inlines: - registered_models.add(inline.model) - - related_objects = ( - f - for f in self.opts.get_fields(include_hidden=True) - if (f.auto_created and not f.concrete) - ) - for related_object in related_objects: - related_model = related_object.related_model - remote_field = related_object.field.remote_field - if ( - any(issubclass(model, related_model) for model in registered_models) - and hasattr(remote_field, "get_related_field") - and remote_field.get_related_field() == field - ): - return True - - return False - - def has_add_permission(self, request): - """ - Return True if the given request has permission to add an object. - Can be overridden by the user in subclasses. - """ - opts = self.opts - codename = get_permission_codename("add", opts) - return request.user.has_perm("%s.%s" % (opts.app_label, codename)) - - def has_change_permission(self, request, obj=None): - """ - Return True if the given request has permission to change the given - Django model instance, the default implementation doesn't examine the - `obj` parameter. - - Can be overridden by the user in subclasses. In such case it should - return True if the given request has permission to change the `obj` - model instance. If `obj` is None, this should return True if the given - request has permission to change *any* object of the given type. - """ - opts = self.opts - codename = get_permission_codename("change", opts) - return request.user.has_perm("%s.%s" % (opts.app_label, codename)) - - def has_delete_permission(self, request, obj=None): - """ - Return True if the given request has permission to delete the given - Django model instance, the default implementation doesn't examine the - `obj` parameter. - - Can be overridden by the user in subclasses. In such case it should - return True if the given request has permission to delete the `obj` - model instance. If `obj` is None, this should return True if the given - request has permission to delete *any* object of the given type. - """ - opts = self.opts - codename = get_permission_codename("delete", opts) - return request.user.has_perm("%s.%s" % (opts.app_label, codename)) - - def has_view_permission(self, request, obj=None): - """ - Return True if the given request has permission to view the given - Django model instance. The default implementation doesn't examine the - `obj` parameter. - - If overridden by the user in subclasses, it should return True if the - given request has permission to view the `obj` model instance. If `obj` - is None, it should return True if the request has permission to view - any object of the given type. - """ - opts = self.opts - codename_view = get_permission_codename("view", opts) - codename_change = get_permission_codename("change", opts) - return request.user.has_perm( - "%s.%s" % (opts.app_label, codename_view) - ) or request.user.has_perm("%s.%s" % (opts.app_label, codename_change)) - - def has_view_or_change_permission(self, request, obj=None): - return self.has_view_permission(request, obj) or self.has_change_permission( - request, obj - ) - - def has_module_permission(self, request): - """ - Return True if the given request has any permission in the given - app label. - - Can be overridden by the user in subclasses. In such case it should - return True if the given request has permission to view the module on - the admin index page and access the module's index page. Overriding it - does not restrict access to the add, change or delete views. Use - `ModelAdmin.has_(add|change|delete)_permission` for that. - """ - return request.user.has_module_perms(self.opts.app_label) - - -class ModelAdmin(BaseModelAdmin): - """Encapsulate all admin options and functionality for a given model.""" - - list_display = ("__str__",) - list_display_links = () - list_filter = () - list_select_related = False - list_per_page = 100 - list_max_show_all = 200 - list_editable = () - search_fields = () - search_help_text = None - date_hierarchy = None - save_as = False - save_as_continue = True - save_on_top = False - paginator = Paginator - preserve_filters = True - show_facets = ShowFacets.ALLOW - inlines = () - - # Custom templates (designed to be over-ridden in subclasses) - add_form_template = None - change_form_template = None - change_list_template = None - delete_confirmation_template = None - delete_selected_confirmation_template = None - object_history_template = None - popup_response_template = None - - # Actions - actions = () - action_form = helpers.ActionForm - actions_on_top = True - actions_on_bottom = False - actions_selection_counter = True - checks_class = ModelAdminChecks - - def __init__(self, model, admin_site): - self.model = model - self.opts = model._meta - self.admin_site = admin_site - super().__init__() - - def __str__(self): - return "%s.%s" % (self.opts.app_label, self.__class__.__name__) - - def __repr__(self): - return ( - f"<{self.__class__.__qualname__}: model={self.model.__qualname__} " - f"site={self.admin_site!r}>" - ) - - def get_inline_instances(self, request, obj=None): - inline_instances = [] - for inline_class in self.get_inlines(request, obj): - inline = inline_class(self.model, self.admin_site) - if request: - if not ( - inline.has_view_or_change_permission(request, obj) - or inline.has_add_permission(request, obj) - or inline.has_delete_permission(request, obj) - ): - continue - if not inline.has_add_permission(request, obj): - inline.max_num = 0 - inline_instances.append(inline) - - return inline_instances - - def get_urls(self): - from django.urls import path - - def wrap(view): - def wrapper(*args, **kwargs): - return self.admin_site.admin_view(view)(*args, **kwargs) - - wrapper.model_admin = self - return update_wrapper(wrapper, view) - - info = self.opts.app_label, self.opts.model_name - - return [ - path("", wrap(self.changelist_view), name="%s_%s_changelist" % info), - path("add/", wrap(self.add_view), name="%s_%s_add" % info), - path( - "/history/", - wrap(self.history_view), - name="%s_%s_history" % info, - ), - path( - "/delete/", - wrap(self.delete_view), - name="%s_%s_delete" % info, - ), - path( - "/change/", - wrap(self.change_view), - name="%s_%s_change" % info, - ), - # For backwards compatibility (was the change url before 1.9) - path( - "/", - wrap( - RedirectView.as_view( - pattern_name="%s:%s_%s_change" - % ((self.admin_site.name,) + info) - ) - ), - ), - ] - - @property - def urls(self): - return self.get_urls() - - @property - def media(self): - extra = "" if settings.DEBUG else ".min" - js = [ - "vendor/jquery/jquery%s.js" % extra, - "jquery.init.js", - "core.js", - "admin/RelatedObjectLookups.js", - "actions.js", - "urlify.js", - "prepopulate.js", - "vendor/xregexp/xregexp%s.js" % extra, - ] - return forms.Media(js=["admin/js/%s" % url for url in js]) - - def get_model_perms(self, request): - """ - Return a dict of all perms for this model. This dict has the keys - ``add``, ``change``, ``delete``, and ``view`` mapping to the True/False - for each of those actions. - """ - return { - "add": self.has_add_permission(request), - "change": self.has_change_permission(request), - "delete": self.has_delete_permission(request), - "view": self.has_view_permission(request), - } - - def _get_form_for_get_fields(self, request, obj): - return self.get_form(request, obj, fields=None) - - def get_form(self, request, obj=None, change=False, **kwargs): - """ - Return a Form class for use in the admin add view. This is used by - add_view and change_view. - """ - if "fields" in kwargs: - fields = kwargs.pop("fields") - else: - fields = flatten_fieldsets(self.get_fieldsets(request, obj)) - excluded = self.get_exclude(request, obj) - exclude = [] if excluded is None else list(excluded) - readonly_fields = self.get_readonly_fields(request, obj) - exclude.extend(readonly_fields) - # Exclude all fields if it's a change form and the user doesn't have - # the change permission. - if ( - change - and hasattr(request, "user") - and not self.has_change_permission(request, obj) - ): - exclude.extend(fields) - if excluded is None and hasattr(self.form, "_meta") and self.form._meta.exclude: - # Take the custom ModelForm's Meta.exclude into account only if the - # ModelAdmin doesn't define its own. - exclude.extend(self.form._meta.exclude) - # if exclude is an empty list we pass None to be consistent with the - # default on modelform_factory - exclude = exclude or None - - # Remove declared form fields which are in readonly_fields. - new_attrs = dict.fromkeys( - f for f in readonly_fields if f in self.form.declared_fields - ) - form = type(self.form.__name__, (self.form,), new_attrs) - - defaults = { - "form": form, - "fields": fields, - "exclude": exclude, - "formfield_callback": partial(self.formfield_for_dbfield, request=request), - **kwargs, - } - - if defaults["fields"] is None and not modelform_defines_fields( - defaults["form"] - ): - defaults["fields"] = forms.ALL_FIELDS - - try: - return modelform_factory(self.model, **defaults) - except FieldError as e: - raise FieldError( - "%s. Check fields/fieldsets/exclude attributes of class %s." - % (e, self.__class__.__name__) - ) - - def get_changelist(self, request, **kwargs): - """ - Return the ChangeList class for use on the changelist page. - """ - from django.contrib.admin.views.main import ChangeList - - return ChangeList - - def get_changelist_instance(self, request): - """ - Return a `ChangeList` instance based on `request`. May raise - `IncorrectLookupParameters`. - """ - list_display = self.get_list_display(request) - list_display_links = self.get_list_display_links(request, list_display) - # Add the action checkboxes if any actions are available. - if self.get_actions(request): - list_display = ["action_checkbox", *list_display] - sortable_by = self.get_sortable_by(request) - ChangeList = self.get_changelist(request) - return ChangeList( - request, - self.model, - list_display, - list_display_links, - self.get_list_filter(request), - self.date_hierarchy, - self.get_search_fields(request), - self.get_list_select_related(request), - self.list_per_page, - self.list_max_show_all, - self.list_editable, - self, - sortable_by, - self.search_help_text, - ) - - def get_object(self, request, object_id, from_field=None): - """ - Return an instance matching the field and value provided, the primary - key is used if no field is provided. Return ``None`` if no match is - found or the object_id fails validation. - """ - queryset = self.get_queryset(request) - model = queryset.model - field = ( - model._meta.pk if from_field is None else model._meta.get_field(from_field) - ) - try: - object_id = field.to_python(object_id) - return queryset.get(**{field.name: object_id}) - except (model.DoesNotExist, ValidationError, ValueError): - return None - - def get_changelist_form(self, request, **kwargs): - """ - Return a Form class for use in the Formset on the changelist page. - """ - defaults = { - "formfield_callback": partial(self.formfield_for_dbfield, request=request), - **kwargs, - } - if defaults.get("fields") is None and not modelform_defines_fields( - defaults.get("form") - ): - defaults["fields"] = forms.ALL_FIELDS - - return modelform_factory(self.model, **defaults) - - def get_changelist_formset(self, request, **kwargs): - """ - Return a FormSet class for use on the changelist page if list_editable - is used. - """ - defaults = { - "formfield_callback": partial(self.formfield_for_dbfield, request=request), - **kwargs, - } - return modelformset_factory( - self.model, - self.get_changelist_form(request), - extra=0, - fields=self.list_editable, - **defaults, - ) - - def get_formsets_with_inlines(self, request, obj=None): - """ - Yield formsets and the corresponding inlines. - """ - for inline in self.get_inline_instances(request, obj): - yield inline.get_formset(request, obj), inline - - def get_paginator( - self, request, queryset, per_page, orphans=0, allow_empty_first_page=True - ): - return self.paginator(queryset, per_page, orphans, allow_empty_first_page) - - def log_addition(self, request, obj, message): - """ - Log that an object has been successfully added. - - The default implementation creates an admin LogEntry object. - """ - from django.contrib.admin.models import ADDITION, LogEntry - - return LogEntry.objects.log_actions( - user_id=request.user.pk, - queryset=[obj], - action_flag=ADDITION, - change_message=message, - single_object=True, - ) - - def log_change(self, request, obj, message): - """ - Log that an object has been successfully changed. - - The default implementation creates an admin LogEntry object. - """ - from django.contrib.admin.models import CHANGE, LogEntry - - return LogEntry.objects.log_actions( - user_id=request.user.pk, - queryset=[obj], - action_flag=CHANGE, - change_message=message, - single_object=True, - ) - - def log_deletion(self, request, obj, object_repr): - """ - Log that an object will be deleted. Note that this method must be - called before the deletion. - - The default implementation creates an admin LogEntry object. - """ - warnings.warn( - "ModelAdmin.log_deletion() is deprecated. Use log_deletions() instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - from django.contrib.admin.models import DELETION, LogEntry - - return LogEntry.objects.log_action( - user_id=request.user.pk, - content_type_id=get_content_type_for_model(obj).pk, - object_id=obj.pk, - object_repr=object_repr, - action_flag=DELETION, - ) - - def log_deletions(self, request, queryset): - """ - Log that objects will be deleted. Note that this method must be called - before the deletion. - - The default implementation creates admin LogEntry objects. - """ - from django.contrib.admin.models import DELETION, LogEntry - - # RemovedInDjango60Warning. - if type(self).log_deletion != ModelAdmin.log_deletion: - warnings.warn( - "The usage of log_deletion() is deprecated. Implement log_deletions() " - "instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - return [self.log_deletion(request, obj, str(obj)) for obj in queryset] - - return LogEntry.objects.log_actions( - user_id=request.user.pk, - queryset=queryset, - action_flag=DELETION, - ) - - def action_checkbox(self, obj): - """ - A list_display column containing a checkbox widget. - """ - attrs = { - "class": "action-select", - "aria-label": format_html( - _("Select this object for an action - {}"), str(obj) - ), - } - checkbox = forms.CheckboxInput(attrs, lambda value: False) - return checkbox.render(helpers.ACTION_CHECKBOX_NAME, str(obj.pk)) - - @staticmethod - def _get_action_description(func, name): - try: - return func.short_description - except AttributeError: - return capfirst(name.replace("_", " ")) - - def _get_base_actions(self): - """Return the list of actions, prior to any request-based filtering.""" - actions = [] - base_actions = (self.get_action(action) for action in self.actions or []) - # get_action might have returned None, so filter any of those out. - base_actions = [action for action in base_actions if action] - base_action_names = {name for _, name, _ in base_actions} - - # Gather actions from the admin site first - for name, func in self.admin_site.actions: - if name in base_action_names: - continue - description = self._get_action_description(func, name) - actions.append((func, name, description)) - # Add actions from this ModelAdmin. - actions.extend(base_actions) - return actions - - def _filter_actions_by_permissions(self, request, actions): - """Filter out any actions that the user doesn't have access to.""" - filtered_actions = [] - for action in actions: - callable = action[0] - if not hasattr(callable, "allowed_permissions"): - filtered_actions.append(action) - continue - permission_checks = ( - getattr(self, "has_%s_permission" % permission) - for permission in callable.allowed_permissions - ) - if any(has_permission(request) for has_permission in permission_checks): - filtered_actions.append(action) - return filtered_actions - - def get_actions(self, request): - """ - Return a dictionary mapping the names of all actions for this - ModelAdmin to a tuple of (callable, name, description) for each action. - """ - # If self.actions is set to None that means actions are disabled on - # this page. - if self.actions is None or IS_POPUP_VAR in request.GET: - return {} - actions = self._filter_actions_by_permissions(request, self._get_base_actions()) - return {name: (func, name, desc) for func, name, desc in actions} - - def get_action_choices(self, request, default_choices=models.BLANK_CHOICE_DASH): - """ - Return a list of choices for use in a form object. Each choice is a - tuple (name, description). - """ - choices = [] + default_choices - for func, name, description in self.get_actions(request).values(): - choice = (name, description % model_format_dict(self.opts)) - choices.append(choice) - return choices - - def get_action(self, action): - """ - Return a given action from a parameter, which can either be a callable, - or the name of a method on the ModelAdmin. Return is a tuple of - (callable, name, description). - """ - # If the action is a callable, just use it. - if callable(action): - func = action - action = action.__name__ - - # Next, look for a method. Grab it off self.__class__ to get an unbound - # method instead of a bound one; this ensures that the calling - # conventions are the same for functions and methods. - elif hasattr(self.__class__, action): - func = getattr(self.__class__, action) - - # Finally, look for a named method on the admin site - else: - try: - func = self.admin_site.get_action(action) - except KeyError: - return None - - description = self._get_action_description(func, action) - return func, action, description - - def get_list_display(self, request): - """ - Return a sequence containing the fields to be displayed on the - changelist. - """ - return self.list_display - - def get_list_display_links(self, request, list_display): - """ - Return a sequence containing the fields to be displayed as links - on the changelist. The list_display parameter is the list of fields - returned by get_list_display(). - """ - if ( - self.list_display_links - or self.list_display_links is None - or not list_display - ): - return self.list_display_links - else: - # Use only the first item in list_display as link - return list(list_display)[:1] - - def get_list_filter(self, request): - """ - Return a sequence containing the fields to be displayed as filters in - the right sidebar of the changelist page. - """ - return self.list_filter - - def get_list_select_related(self, request): - """ - Return a list of fields to add to the select_related() part of the - changelist items query. - """ - return self.list_select_related - - def get_search_fields(self, request): - """ - Return a sequence containing the fields to be searched whenever - somebody submits a search query. - """ - return self.search_fields - - def get_search_results(self, request, queryset, search_term): - """ - Return a tuple containing a queryset to implement the search - and a boolean indicating if the results may contain duplicates. - """ - - # Apply keyword searches. - def construct_search(field_name): - if field_name.startswith("^"): - return "%s__istartswith" % field_name.removeprefix("^"), None - elif field_name.startswith("="): - return "%s__iexact" % field_name.removeprefix("="), None - elif field_name.startswith("@"): - return "%s__search" % field_name.removeprefix("@"), None - # Use field_name if it includes a lookup. - opts = queryset.model._meta - lookup_fields = field_name.split(LOOKUP_SEP) - # Go through the fields, following all relations. - prev_field = None - for i, path_part in enumerate(lookup_fields): - if path_part == "pk": - path_part = opts.pk.name - try: - field = opts.get_field(path_part) - except FieldDoesNotExist: - # Use valid query lookups. - if prev_field and prev_field.get_lookup(path_part): - if path_part == "exact" and not isinstance( - prev_field, (models.CharField, models.TextField) - ): - field_name_without_exact = "__".join(lookup_fields[:i]) - alias = Cast( - field_name_without_exact, - output_field=models.CharField(), - ) - alias_name = "_".join(lookup_fields[:i]) - return f"{alias_name}_str", alias - else: - return field_name, None - else: - prev_field = field - if hasattr(field, "path_infos"): - # Update opts to follow the relation. - opts = field.path_infos[-1].to_opts - # Otherwise, use the field with icontains. - return "%s__icontains" % field_name, None - - may_have_duplicates = False - search_fields = self.get_search_fields(request) - if search_fields and search_term: - str_aliases = {} - orm_lookups = [] - for field in search_fields: - lookup, str_alias = construct_search(str(field)) - orm_lookups.append(lookup) - if str_alias: - str_aliases[lookup] = str_alias - - if str_aliases: - queryset = queryset.alias(**str_aliases) - - term_queries = [] - for bit in smart_split(search_term): - if bit.startswith(('"', "'")) and bit[0] == bit[-1]: - bit = unescape_string_literal(bit) - or_queries = models.Q.create( - [(orm_lookup, bit) for orm_lookup in orm_lookups], - connector=models.Q.OR, - ) - term_queries.append(or_queries) - queryset = queryset.filter(models.Q.create(term_queries)) - may_have_duplicates |= any( - lookup_spawns_duplicates(self.opts, search_spec) - for search_spec in orm_lookups - ) - return queryset, may_have_duplicates - - def get_preserved_filters(self, request): - """ - Return the preserved filters querystring. - """ - match = request.resolver_match - if self.preserve_filters and match: - current_url = "%s:%s" % (match.app_name, match.url_name) - changelist_url = "admin:%s_%s_changelist" % ( - self.opts.app_label, - self.opts.model_name, - ) - if current_url == changelist_url: - preserved_filters = request.GET.urlencode() - else: - preserved_filters = request.GET.get("_changelist_filters") - - if preserved_filters: - return urlencode({"_changelist_filters": preserved_filters}) - return "" - - def construct_change_message(self, request, form, formsets, add=False): - """ - Construct a JSON structure describing changes from a changed object. - """ - return construct_change_message(form, formsets, add) - - def message_user( - self, request, message, level=messages.INFO, extra_tags="", fail_silently=False - ): - """ - Send a message to the user. The default implementation - posts a message using the django.contrib.messages backend. - - Exposes almost the same API as messages.add_message(), but accepts the - positional arguments in a different order to maintain backwards - compatibility. For convenience, it accepts the `level` argument as - a string rather than the usual level number. - """ - if not isinstance(level, int): - # attempt to get the level if passed a string - try: - level = getattr(messages.constants, level.upper()) - except AttributeError: - levels = messages.constants.DEFAULT_TAGS.values() - levels_repr = ", ".join("`%s`" % level for level in levels) - raise ValueError( - "Bad message level string: `%s`. Possible values are: %s" - % (level, levels_repr) - ) - - messages.add_message( - request, level, message, extra_tags=extra_tags, fail_silently=fail_silently - ) - - def save_form(self, request, form, change): - """ - Given a ModelForm return an unsaved instance. ``change`` is True if - the object is being changed, and False if it's being added. - """ - return form.save(commit=False) - - def save_model(self, request, obj, form, change): - """ - Given a model instance save it to the database. - """ - obj.save() - - def delete_model(self, request, obj): - """ - Given a model instance delete it from the database. - """ - obj.delete() - - def delete_queryset(self, request, queryset): - """Given a queryset, delete it from the database.""" - queryset.delete() - - def save_formset(self, request, form, formset, change): - """ - Given an inline formset save it to the database. - """ - formset.save() - - def save_related(self, request, form, formsets, change): - """ - Given the ``HttpRequest``, the parent ``ModelForm`` instance, the - list of inline formsets and a boolean value based on whether the - parent is being added or changed, save the related objects to the - database. Note that at this point save_form() and save_model() have - already been called. - """ - form.save_m2m() - for formset in formsets: - self.save_formset(request, form, formset, change=change) - - def render_change_form( - self, request, context, add=False, change=False, form_url="", obj=None - ): - app_label = self.opts.app_label - preserved_filters = self.get_preserved_filters(request) - form_url = add_preserved_filters( - {"preserved_filters": preserved_filters, "opts": self.opts}, form_url - ) - view_on_site_url = self.get_view_on_site_url(obj) - has_editable_inline_admin_formsets = False - for inline in context["inline_admin_formsets"]: - if ( - inline.has_add_permission - or inline.has_change_permission - or inline.has_delete_permission - ): - has_editable_inline_admin_formsets = True - break - context.update( - { - "add": add, - "change": change, - "has_view_permission": self.has_view_permission(request, obj), - "has_add_permission": self.has_add_permission(request), - "has_change_permission": self.has_change_permission(request, obj), - "has_delete_permission": self.has_delete_permission(request, obj), - "has_editable_inline_admin_formsets": ( - has_editable_inline_admin_formsets - ), - "has_file_field": context["adminform"].form.is_multipart() - or any( - admin_formset.formset.is_multipart() - for admin_formset in context["inline_admin_formsets"] - ), - "has_absolute_url": view_on_site_url is not None, - "absolute_url": view_on_site_url, - "form_url": form_url, - "opts": self.opts, - "content_type_id": get_content_type_for_model(self.model).pk, - "save_as": self.save_as, - "save_on_top": self.save_on_top, - "to_field_var": TO_FIELD_VAR, - "is_popup_var": IS_POPUP_VAR, - "app_label": app_label, - } - ) - if add and self.add_form_template is not None: - form_template = self.add_form_template - else: - form_template = self.change_form_template - - request.current_app = self.admin_site.name - - return TemplateResponse( - request, - form_template - or [ - "admin/%s/%s/change_form.html" % (app_label, self.opts.model_name), - "admin/%s/change_form.html" % app_label, - "admin/change_form.html", - ], - context, - ) - - def _get_preserved_qsl(self, request, preserved_filters): - query_string = urlsplit(request.build_absolute_uri()).query - return parse_qsl(query_string.replace(preserved_filters, "")) - - def response_add(self, request, obj, post_url_continue=None): - """ - Determine the HttpResponse for the add_view stage. - """ - opts = obj._meta - preserved_filters = self.get_preserved_filters(request) - preserved_qsl = self._get_preserved_qsl(request, preserved_filters) - obj_url = reverse( - "admin:%s_%s_change" % (opts.app_label, opts.model_name), - args=(quote(obj.pk),), - current_app=self.admin_site.name, - ) - # Add a link to the object's change form if the user can edit the obj. - if self.has_change_permission(request, obj): - obj_repr = format_html('{}', urlquote(obj_url), obj) - else: - obj_repr = str(obj) - msg_dict = { - "name": opts.verbose_name, - "obj": obj_repr, - } - # Here, we distinguish between different save types by checking for - # the presence of keys in request.POST. - - if IS_POPUP_VAR in request.POST: - to_field = request.POST.get(TO_FIELD_VAR) - if to_field: - attr = str(to_field) - else: - attr = obj._meta.pk.attname - value = obj.serializable_value(attr) - popup_response_data = json.dumps( - { - "value": str(value), - "obj": str(obj), - } - ) - return TemplateResponse( - request, - self.popup_response_template - or [ - "admin/%s/%s/popup_response.html" - % (opts.app_label, opts.model_name), - "admin/%s/popup_response.html" % opts.app_label, - "admin/popup_response.html", - ], - { - "popup_response_data": popup_response_data, - }, - ) - - elif "_continue" in request.POST or ( - # Redirecting after "Save as new". - "_saveasnew" in request.POST - and self.save_as_continue - and self.has_change_permission(request, obj) - ): - msg = _("The {name} “{obj}” was added successfully.") - if self.has_change_permission(request, obj): - msg += " " + _("You may edit it again below.") - self.message_user(request, format_html(msg, **msg_dict), messages.SUCCESS) - if post_url_continue is None: - post_url_continue = obj_url - post_url_continue = add_preserved_filters( - { - "preserved_filters": preserved_filters, - "preserved_qsl": preserved_qsl, - "opts": opts, - }, - post_url_continue, - ) - return HttpResponseRedirect(post_url_continue) - - elif "_addanother" in request.POST: - msg = format_html( - _( - "The {name} “{obj}” was added successfully. You may add another " - "{name} below." - ), - **msg_dict, - ) - self.message_user(request, msg, messages.SUCCESS) - redirect_url = request.path - redirect_url = add_preserved_filters( - { - "preserved_filters": preserved_filters, - "preserved_qsl": preserved_qsl, - "opts": opts, - }, - redirect_url, - ) - return HttpResponseRedirect(redirect_url) - - else: - msg = format_html( - _("The {name} “{obj}” was added successfully."), **msg_dict - ) - self.message_user(request, msg, messages.SUCCESS) - return self.response_post_save_add(request, obj) - - def response_change(self, request, obj): - """ - Determine the HttpResponse for the change_view stage. - """ - - if IS_POPUP_VAR in request.POST: - opts = obj._meta - to_field = request.POST.get(TO_FIELD_VAR) - attr = str(to_field) if to_field else opts.pk.attname - value = request.resolver_match.kwargs["object_id"] - new_value = obj.serializable_value(attr) - popup_response_data = json.dumps( - { - "action": "change", - "value": str(value), - "obj": str(obj), - "new_value": str(new_value), - } - ) - return TemplateResponse( - request, - self.popup_response_template - or [ - "admin/%s/%s/popup_response.html" - % (opts.app_label, opts.model_name), - "admin/%s/popup_response.html" % opts.app_label, - "admin/popup_response.html", - ], - { - "popup_response_data": popup_response_data, - }, - ) - - opts = self.opts - preserved_filters = self.get_preserved_filters(request) - preserved_qsl = self._get_preserved_qsl(request, preserved_filters) - - msg_dict = { - "name": opts.verbose_name, - "obj": format_html('{}', urlquote(request.path), obj), - } - if "_continue" in request.POST: - msg = format_html( - _( - "The {name} “{obj}” was changed successfully. You may edit it " - "again below." - ), - **msg_dict, - ) - self.message_user(request, msg, messages.SUCCESS) - redirect_url = request.path - redirect_url = add_preserved_filters( - { - "preserved_filters": preserved_filters, - "preserved_qsl": preserved_qsl, - "opts": opts, - }, - redirect_url, - ) - return HttpResponseRedirect(redirect_url) - - elif "_addanother" in request.POST: - msg = format_html( - _( - "The {name} “{obj}” was changed successfully. You may add another " - "{name} below." - ), - **msg_dict, - ) - self.message_user(request, msg, messages.SUCCESS) - redirect_url = reverse( - "admin:%s_%s_add" % (opts.app_label, opts.model_name), - current_app=self.admin_site.name, - ) - redirect_url = add_preserved_filters( - { - "preserved_filters": preserved_filters, - "preserved_qsl": preserved_qsl, - "opts": opts, - }, - redirect_url, - ) - return HttpResponseRedirect(redirect_url) - - else: - msg = format_html( - _("The {name} “{obj}” was changed successfully."), **msg_dict - ) - self.message_user(request, msg, messages.SUCCESS) - return self.response_post_save_change(request, obj) - - def _response_post_save(self, request, obj): - if self.has_view_or_change_permission(request): - post_url = reverse( - "admin:%s_%s_changelist" % (self.opts.app_label, self.opts.model_name), - current_app=self.admin_site.name, - ) - preserved_filters = self.get_preserved_filters(request) - post_url = add_preserved_filters( - {"preserved_filters": preserved_filters, "opts": self.opts}, post_url - ) - else: - post_url = reverse("admin:index", current_app=self.admin_site.name) - return HttpResponseRedirect(post_url) - - def response_post_save_add(self, request, obj): - """ - Figure out where to redirect after the 'Save' button has been pressed - when adding a new object. - """ - return self._response_post_save(request, obj) - - def response_post_save_change(self, request, obj): - """ - Figure out where to redirect after the 'Save' button has been pressed - when editing an existing object. - """ - return self._response_post_save(request, obj) - - def response_action(self, request, queryset): - """ - Handle an admin action. This is called if a request is POSTed to the - changelist; it returns an HttpResponse if the action was handled, and - None otherwise. - """ - - # There can be multiple action forms on the page (at the top - # and bottom of the change list, for example). Get the action - # whose button was pushed. - try: - action_index = int(request.POST.get("index", 0)) - except ValueError: - action_index = 0 - - # Construct the action form. - data = request.POST.copy() - data.pop(helpers.ACTION_CHECKBOX_NAME, None) - data.pop("index", None) - - # Use the action whose button was pushed - try: - data.update({"action": data.getlist("action")[action_index]}) - except IndexError: - # If we didn't get an action from the chosen form that's invalid - # POST data, so by deleting action it'll fail the validation check - # below. So no need to do anything here - pass - - action_form = self.action_form(data, auto_id=None) - action_form.fields["action"].choices = self.get_action_choices(request) - - # If the form's valid we can handle the action. - if action_form.is_valid(): - action = action_form.cleaned_data["action"] - select_across = action_form.cleaned_data["select_across"] - func = self.get_actions(request)[action][0] - - # Get the list of selected PKs. If nothing's selected, we can't - # perform an action on it, so bail. Except we want to perform - # the action explicitly on all objects. - selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) - if not selected and not select_across: - # Reminder that something needs to be selected or nothing will happen - msg = _( - "Items must be selected in order to perform " - "actions on them. No items have been changed." - ) - self.message_user(request, msg, messages.WARNING) - return None - - if not select_across: - # Perform the action only on the selected objects - queryset = queryset.filter(pk__in=selected) - - response = func(self, request, queryset) - - # Actions may return an HttpResponse-like object, which will be - # used as the response from the POST. If not, we'll be a good - # little HTTP citizen and redirect back to the changelist page. - if isinstance(response, HttpResponseBase): - return response - else: - return HttpResponseRedirect(request.get_full_path()) - else: - msg = _("No action selected.") - self.message_user(request, msg, messages.WARNING) - return None - - def response_delete(self, request, obj_display, obj_id): - """ - Determine the HttpResponse for the delete_view stage. - """ - if IS_POPUP_VAR in request.POST: - popup_response_data = json.dumps( - { - "action": "delete", - "value": str(obj_id), - } - ) - return TemplateResponse( - request, - self.popup_response_template - or [ - "admin/%s/%s/popup_response.html" - % (self.opts.app_label, self.opts.model_name), - "admin/%s/popup_response.html" % self.opts.app_label, - "admin/popup_response.html", - ], - { - "popup_response_data": popup_response_data, - }, - ) - - self.message_user( - request, - _("The %(name)s “%(obj)s” was deleted successfully.") - % { - "name": self.opts.verbose_name, - "obj": obj_display, - }, - messages.SUCCESS, - ) - - if self.has_change_permission(request, None): - post_url = reverse( - "admin:%s_%s_changelist" % (self.opts.app_label, self.opts.model_name), - current_app=self.admin_site.name, - ) - preserved_filters = self.get_preserved_filters(request) - post_url = add_preserved_filters( - {"preserved_filters": preserved_filters, "opts": self.opts}, post_url - ) - else: - post_url = reverse("admin:index", current_app=self.admin_site.name) - return HttpResponseRedirect(post_url) - - def render_delete_form(self, request, context): - app_label = self.opts.app_label - - request.current_app = self.admin_site.name - context.update( - to_field_var=TO_FIELD_VAR, - is_popup_var=IS_POPUP_VAR, - media=self.media, - ) - - return TemplateResponse( - request, - self.delete_confirmation_template - or [ - "admin/{}/{}/delete_confirmation.html".format( - app_label, self.opts.model_name - ), - "admin/{}/delete_confirmation.html".format(app_label), - "admin/delete_confirmation.html", - ], - context, - ) - - def get_inline_formsets(self, request, formsets, inline_instances, obj=None): - # Edit permissions on parent model are required for editable inlines. - can_edit_parent = ( - self.has_change_permission(request, obj) - if obj - else self.has_add_permission(request) - ) - inline_admin_formsets = [] - for inline, formset in zip(inline_instances, formsets): - fieldsets = list(inline.get_fieldsets(request, obj)) - readonly = list(inline.get_readonly_fields(request, obj)) - if can_edit_parent: - has_add_permission = inline.has_add_permission(request, obj) - has_change_permission = inline.has_change_permission(request, obj) - has_delete_permission = inline.has_delete_permission(request, obj) - else: - # Disable all edit-permissions, and override formset settings. - has_add_permission = has_change_permission = has_delete_permission = ( - False - ) - formset.extra = formset.max_num = 0 - has_view_permission = inline.has_view_permission(request, obj) - prepopulated = dict(inline.get_prepopulated_fields(request, obj)) - inline_admin_formset = helpers.InlineAdminFormSet( - inline, - formset, - fieldsets, - prepopulated, - readonly, - model_admin=self, - has_add_permission=has_add_permission, - has_change_permission=has_change_permission, - has_delete_permission=has_delete_permission, - has_view_permission=has_view_permission, - ) - inline_admin_formsets.append(inline_admin_formset) - return inline_admin_formsets - - def get_changeform_initial_data(self, request): - """ - Get the initial form data from the request's GET params. - """ - initial = dict(request.GET.items()) - for k in initial: - try: - f = self.opts.get_field(k) - except FieldDoesNotExist: - continue - # We have to special-case M2Ms as a list of comma-separated PKs. - if isinstance(f, models.ManyToManyField): - initial[k] = initial[k].split(",") - return initial - - def _get_obj_does_not_exist_redirect(self, request, opts, object_id): - """ - Create a message informing the user that the object doesn't exist - and return a redirect to the admin index page. - """ - msg = _("%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?") % { - "name": opts.verbose_name, - "key": unquote(object_id), - } - self.message_user(request, msg, messages.WARNING) - url = reverse("admin:index", current_app=self.admin_site.name) - return HttpResponseRedirect(url) - - @csrf_protect_m - def changeform_view(self, request, object_id=None, form_url="", extra_context=None): - if request.method in ("GET", "HEAD", "OPTIONS", "TRACE"): - return self._changeform_view(request, object_id, form_url, extra_context) - - with transaction.atomic(using=router.db_for_write(self.model)): - return self._changeform_view(request, object_id, form_url, extra_context) - - def _changeform_view(self, request, object_id, form_url, extra_context): - to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) - if to_field and not self.to_field_allowed(request, to_field): - raise DisallowedModelAdminToField( - "The field %s cannot be referenced." % to_field - ) - - if request.method == "POST" and "_saveasnew" in request.POST: - object_id = None - - add = object_id is None - - if add: - if not self.has_add_permission(request): - raise PermissionDenied - obj = None - - else: - obj = self.get_object(request, unquote(object_id), to_field) - - if request.method == "POST": - if not self.has_change_permission(request, obj): - raise PermissionDenied - else: - if not self.has_view_or_change_permission(request, obj): - raise PermissionDenied - - if obj is None: - return self._get_obj_does_not_exist_redirect( - request, self.opts, object_id - ) - - fieldsets = self.get_fieldsets(request, obj) - ModelForm = self.get_form( - request, obj, change=not add, fields=flatten_fieldsets(fieldsets) - ) - if request.method == "POST": - form = ModelForm(request.POST, request.FILES, instance=obj) - formsets, inline_instances = self._create_formsets( - request, - form.instance, - change=not add, - ) - form_validated = form.is_valid() - if form_validated: - new_object = self.save_form(request, form, change=not add) - else: - new_object = form.instance - if all_valid(formsets) and form_validated: - self.save_model(request, new_object, form, not add) - self.save_related(request, form, formsets, not add) - change_message = self.construct_change_message( - request, form, formsets, add - ) - if add: - self.log_addition(request, new_object, change_message) - return self.response_add(request, new_object) - else: - self.log_change(request, new_object, change_message) - return self.response_change(request, new_object) - else: - form_validated = False - else: - if add: - initial = self.get_changeform_initial_data(request) - form = ModelForm(initial=initial) - formsets, inline_instances = self._create_formsets( - request, form.instance, change=False - ) - else: - form = ModelForm(instance=obj) - formsets, inline_instances = self._create_formsets( - request, obj, change=True - ) - - if not add and not self.has_change_permission(request, obj): - readonly_fields = flatten_fieldsets(fieldsets) - else: - readonly_fields = self.get_readonly_fields(request, obj) - admin_form = helpers.AdminForm( - form, - list(fieldsets), - # Clear prepopulated fields on a view-only form to avoid a crash. - ( - self.get_prepopulated_fields(request, obj) - if add or self.has_change_permission(request, obj) - else {} - ), - readonly_fields, - model_admin=self, - ) - media = self.media + admin_form.media - - inline_formsets = self.get_inline_formsets( - request, formsets, inline_instances, obj - ) - for inline_formset in inline_formsets: - media += inline_formset.media - - if add: - title = _("Add %s") - elif self.has_change_permission(request, obj): - title = _("Change %s") - else: - title = _("View %s") - context = { - **self.admin_site.each_context(request), - "title": title % self.opts.verbose_name, - "subtitle": str(obj) if obj else None, - "adminform": admin_form, - "object_id": object_id, - "original": obj, - "is_popup": IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET, - "to_field": to_field, - "media": media, - "inline_admin_formsets": inline_formsets, - "errors": helpers.AdminErrorList(form, formsets), - "preserved_filters": self.get_preserved_filters(request), - } - - # Hide the "Save" and "Save and continue" buttons if "Save as New" was - # previously chosen to prevent the interface from getting confusing. - if ( - request.method == "POST" - and not form_validated - and "_saveasnew" in request.POST - ): - context["show_save"] = False - context["show_save_and_continue"] = False - # Use the change template instead of the add template. - add = False - - context.update(extra_context or {}) - - return self.render_change_form( - request, context, add=add, change=not add, obj=obj, form_url=form_url - ) - - def add_view(self, request, form_url="", extra_context=None): - return self.changeform_view(request, None, form_url, extra_context) - - def change_view(self, request, object_id, form_url="", extra_context=None): - return self.changeform_view(request, object_id, form_url, extra_context) - - def _get_edited_object_pks(self, request, prefix): - """Return POST data values of list_editable primary keys.""" - pk_pattern = re.compile( - r"{}-\d+-{}$".format(re.escape(prefix), self.opts.pk.name) - ) - return [value for key, value in request.POST.items() if pk_pattern.match(key)] - - def _get_list_editable_queryset(self, request, prefix): - """ - Based on POST data, return a queryset of the objects that were edited - via list_editable. - """ - object_pks = self._get_edited_object_pks(request, prefix) - queryset = self.get_queryset(request) - validate = queryset.model._meta.pk.to_python - try: - for pk in object_pks: - validate(pk) - except ValidationError: - # Disable the optimization if the POST data was tampered with. - return queryset - return queryset.filter(pk__in=object_pks) - - @csrf_protect_m - def changelist_view(self, request, extra_context=None): - """ - The 'change list' admin view for this model. - """ - from django.contrib.admin.views.main import ERROR_FLAG - - app_label = self.opts.app_label - if not self.has_view_or_change_permission(request): - raise PermissionDenied - - try: - cl = self.get_changelist_instance(request) - except IncorrectLookupParameters: - # Wacky lookup parameters were given, so redirect to the main - # changelist page, without parameters, and pass an 'invalid=1' - # parameter via the query string. If wacky parameters were given - # and the 'invalid=1' parameter was already in the query string, - # something is screwed up with the database, so display an error - # page. - if ERROR_FLAG in request.GET: - return SimpleTemplateResponse( - "admin/invalid_setup.html", - { - "title": _("Database error"), - }, - ) - return HttpResponseRedirect(request.path + "?" + ERROR_FLAG + "=1") - - # If the request was POSTed, this might be a bulk action or a bulk - # edit. Try to look up an action or confirmation first, but if this - # isn't an action the POST will fall through to the bulk edit check, - # below. - action_failed = False - selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) - - actions = self.get_actions(request) - # Actions with no confirmation - if ( - actions - and request.method == "POST" - and "index" in request.POST - and "_save" not in request.POST - ): - if selected: - response = self.response_action( - request, queryset=cl.get_queryset(request) - ) - if response: - return response - else: - action_failed = True - else: - msg = _( - "Items must be selected in order to perform " - "actions on them. No items have been changed." - ) - self.message_user(request, msg, messages.WARNING) - action_failed = True - - # Actions with confirmation - if ( - actions - and request.method == "POST" - and helpers.ACTION_CHECKBOX_NAME in request.POST - and "index" not in request.POST - and "_save" not in request.POST - ): - if selected: - response = self.response_action( - request, queryset=cl.get_queryset(request) - ) - if response: - return response - else: - action_failed = True - - if action_failed: - # Redirect back to the changelist page to avoid resubmitting the - # form if the user refreshes the browser or uses the "No, take - # me back" button on the action confirmation page. - return HttpResponseRedirect(request.get_full_path()) - - # If we're allowing changelist editing, we need to construct a formset - # for the changelist given all the fields to be edited. Then we'll - # use the formset to validate/process POSTed data. - formset = cl.formset = None - - # Handle POSTed bulk-edit data. - if request.method == "POST" and cl.list_editable and "_save" in request.POST: - if not self.has_change_permission(request): - raise PermissionDenied - FormSet = self.get_changelist_formset(request) - modified_objects = self._get_list_editable_queryset( - request, FormSet.get_default_prefix() - ) - formset = cl.formset = FormSet( - request.POST, request.FILES, queryset=modified_objects - ) - if formset.is_valid(): - changecount = 0 - with transaction.atomic(using=router.db_for_write(self.model)): - for form in formset.forms: - if form.has_changed(): - obj = self.save_form(request, form, change=True) - self.save_model(request, obj, form, change=True) - self.save_related(request, form, formsets=[], change=True) - change_msg = self.construct_change_message( - request, form, None - ) - self.log_change(request, obj, change_msg) - changecount += 1 - if changecount: - msg = ngettext( - "%(count)s %(name)s was changed successfully.", - "%(count)s %(name)s were changed successfully.", - changecount, - ) % { - "count": changecount, - "name": model_ngettext(self.opts, changecount), - } - self.message_user(request, msg, messages.SUCCESS) - - return HttpResponseRedirect(request.get_full_path()) - - # Handle GET -- construct a formset for display. - elif cl.list_editable and self.has_change_permission(request): - FormSet = self.get_changelist_formset(request) - formset = cl.formset = FormSet(queryset=cl.result_list) - - # Build the list of media to be used by the formset. - if formset: - media = self.media + formset.media - else: - media = self.media - - # Build the action form and populate it with available actions. - if actions: - action_form = self.action_form(auto_id=None) - action_form.fields["action"].choices = self.get_action_choices(request) - media += action_form.media - else: - action_form = None - - selection_note_all = ngettext( - "%(total_count)s selected", "All %(total_count)s selected", cl.result_count - ) - - context = { - **self.admin_site.each_context(request), - "module_name": str(self.opts.verbose_name_plural), - "selection_note": _("0 of %(cnt)s selected") % {"cnt": len(cl.result_list)}, - "selection_note_all": selection_note_all % {"total_count": cl.result_count}, - "title": cl.title, - "subtitle": None, - "is_popup": cl.is_popup, - "to_field": cl.to_field, - "cl": cl, - "media": media, - "has_add_permission": self.has_add_permission(request), - "opts": cl.opts, - "action_form": action_form, - "actions_on_top": self.actions_on_top, - "actions_on_bottom": self.actions_on_bottom, - "actions_selection_counter": self.actions_selection_counter, - "preserved_filters": self.get_preserved_filters(request), - **(extra_context or {}), - } - - request.current_app = self.admin_site.name - - return TemplateResponse( - request, - self.change_list_template - or [ - "admin/%s/%s/change_list.html" % (app_label, self.opts.model_name), - "admin/%s/change_list.html" % app_label, - "admin/change_list.html", - ], - context, - ) - - def get_deleted_objects(self, objs, request): - """ - Hook for customizing the delete process for the delete view and the - "delete selected" action. - """ - return get_deleted_objects(objs, request, self.admin_site) - - @csrf_protect_m - def delete_view(self, request, object_id, extra_context=None): - if request.method in ("GET", "HEAD", "OPTIONS", "TRACE"): - return self._delete_view(request, object_id, extra_context) - - with transaction.atomic(using=router.db_for_write(self.model)): - return self._delete_view(request, object_id, extra_context) - - def _delete_view(self, request, object_id, extra_context): - "The 'delete' admin view for this model." - app_label = self.opts.app_label - - to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) - if to_field and not self.to_field_allowed(request, to_field): - raise DisallowedModelAdminToField( - "The field %s cannot be referenced." % to_field - ) - - obj = self.get_object(request, unquote(object_id), to_field) - - if not self.has_delete_permission(request, obj): - raise PermissionDenied - - if obj is None: - return self._get_obj_does_not_exist_redirect(request, self.opts, object_id) - - # Populate deleted_objects, a data structure of all related objects that - # will also be deleted. - ( - deleted_objects, - model_count, - perms_needed, - protected, - ) = self.get_deleted_objects([obj], request) - - if request.POST and not protected: # The user has confirmed the deletion. - if perms_needed: - raise PermissionDenied - obj_display = str(obj) - attr = str(to_field) if to_field else self.opts.pk.attname - obj_id = obj.serializable_value(attr) - self.log_deletions(request, [obj]) - self.delete_model(request, obj) - - return self.response_delete(request, obj_display, obj_id) - - object_name = str(self.opts.verbose_name) - - if perms_needed or protected: - title = _("Cannot delete %(name)s") % {"name": object_name} - else: - title = _("Delete") - - context = { - **self.admin_site.each_context(request), - "title": title, - "subtitle": None, - "object_name": object_name, - "object": obj, - "deleted_objects": deleted_objects, - "model_count": dict(model_count).items(), - "perms_lacking": perms_needed, - "protected": protected, - "opts": self.opts, - "app_label": app_label, - "preserved_filters": self.get_preserved_filters(request), - "is_popup": IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET, - "to_field": to_field, - **(extra_context or {}), - } - - return self.render_delete_form(request, context) - - def history_view(self, request, object_id, extra_context=None): - "The 'history' admin view for this model." - from django.contrib.admin.models import LogEntry - from django.contrib.admin.views.main import PAGE_VAR - - # First check if the user can see this history. - model = self.model - obj = self.get_object(request, unquote(object_id)) - if obj is None: - return self._get_obj_does_not_exist_redirect( - request, model._meta, object_id - ) - - if not self.has_view_or_change_permission(request, obj): - raise PermissionDenied - - # Then get the history for this object. - app_label = self.opts.app_label - action_list = ( - LogEntry.objects.filter( - object_id=unquote(object_id), - content_type=get_content_type_for_model(model), - ) - .select_related() - .order_by("action_time") - ) - - paginator = self.get_paginator(request, action_list, 100) - page_number = request.GET.get(PAGE_VAR, 1) - page_obj = paginator.get_page(page_number) - page_range = paginator.get_elided_page_range(page_obj.number) - - context = { - **self.admin_site.each_context(request), - "title": _("Change history: %s") % obj, - "subtitle": None, - "action_list": page_obj, - "page_range": page_range, - "page_var": PAGE_VAR, - "pagination_required": paginator.count > 100, - "module_name": str(capfirst(self.opts.verbose_name_plural)), - "object": obj, - "opts": self.opts, - "preserved_filters": self.get_preserved_filters(request), - **(extra_context or {}), - } - - request.current_app = self.admin_site.name - - return TemplateResponse( - request, - self.object_history_template - or [ - "admin/%s/%s/object_history.html" % (app_label, self.opts.model_name), - "admin/%s/object_history.html" % app_label, - "admin/object_history.html", - ], - context, - ) - - def get_formset_kwargs(self, request, obj, inline, prefix): - formset_params = { - "instance": obj, - "prefix": prefix, - "queryset": inline.get_queryset(request), - } - if request.method == "POST": - formset_params.update( - { - "data": request.POST.copy(), - "files": request.FILES, - "save_as_new": "_saveasnew" in request.POST, - } - ) - return formset_params - - def _create_formsets(self, request, obj, change): - "Helper function to generate formsets for add/change_view." - formsets = [] - inline_instances = [] - prefixes = {} - get_formsets_args = [request] - if change: - get_formsets_args.append(obj) - for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args): - prefix = FormSet.get_default_prefix() - prefixes[prefix] = prefixes.get(prefix, 0) + 1 - if prefixes[prefix] != 1 or not prefix: - prefix = "%s-%s" % (prefix, prefixes[prefix]) - formset_params = self.get_formset_kwargs(request, obj, inline, prefix) - formset = FormSet(**formset_params) - - def user_deleted_form(request, obj, formset, index, inline): - """Return whether or not the user deleted the form.""" - return ( - inline.has_delete_permission(request, obj) - and "{}-{}-DELETE".format(formset.prefix, index) in request.POST - ) - - # Bypass validation of each view-only inline form (since the form's - # data won't be in request.POST), unless the form was deleted. - if not inline.has_change_permission(request, obj if change else None): - for index, form in enumerate(formset.initial_forms): - if user_deleted_form(request, obj, formset, index, inline): - continue - form._errors = {} - form.cleaned_data = form.initial - formsets.append(formset) - inline_instances.append(inline) - return formsets, inline_instances - - -class InlineModelAdmin(BaseModelAdmin): - """ - Options for inline editing of ``model`` instances. - - Provide ``fk_name`` to specify the attribute name of the ``ForeignKey`` - from ``model`` to its parent. This is required if ``model`` has more than - one ``ForeignKey`` to its parent. - """ - - model = None - fk_name = None - formset = BaseInlineFormSet - extra = 3 - min_num = None - max_num = None - template = None - verbose_name = None - verbose_name_plural = None - can_delete = True - show_change_link = False - checks_class = InlineModelAdminChecks - classes = None - - def __init__(self, parent_model, admin_site): - self.admin_site = admin_site - self.parent_model = parent_model - self.opts = self.model._meta - self.has_registered_model = admin_site.is_registered(self.model) - super().__init__() - if self.verbose_name_plural is None: - if self.verbose_name is None: - self.verbose_name_plural = self.opts.verbose_name_plural - else: - self.verbose_name_plural = format_lazy("{}s", self.verbose_name) - if self.verbose_name is None: - self.verbose_name = self.opts.verbose_name - - @property - def media(self): - extra = "" if settings.DEBUG else ".min" - js = ["vendor/jquery/jquery%s.js" % extra, "jquery.init.js", "inlines.js"] - if self.filter_vertical or self.filter_horizontal: - js.extend(["SelectBox.js", "SelectFilter2.js"]) - return forms.Media(js=["admin/js/%s" % url for url in js]) - - def get_extra(self, request, obj=None, **kwargs): - """Hook for customizing the number of extra inline forms.""" - return self.extra - - def get_min_num(self, request, obj=None, **kwargs): - """Hook for customizing the min number of inline forms.""" - return self.min_num - - def get_max_num(self, request, obj=None, **kwargs): - """Hook for customizing the max number of extra inline forms.""" - return self.max_num - - def get_formset(self, request, obj=None, **kwargs): - """Return a BaseInlineFormSet class for use in admin add/change views.""" - if "fields" in kwargs: - fields = kwargs.pop("fields") - else: - fields = flatten_fieldsets(self.get_fieldsets(request, obj)) - excluded = self.get_exclude(request, obj) - exclude = [] if excluded is None else list(excluded) - exclude.extend(self.get_readonly_fields(request, obj)) - if excluded is None and hasattr(self.form, "_meta") and self.form._meta.exclude: - # Take the custom ModelForm's Meta.exclude into account only if the - # InlineModelAdmin doesn't define its own. - exclude.extend(self.form._meta.exclude) - # If exclude is an empty list we use None, since that's the actual - # default. - exclude = exclude or None - can_delete = self.can_delete and self.has_delete_permission(request, obj) - defaults = { - "form": self.form, - "formset": self.formset, - "fk_name": self.fk_name, - "fields": fields, - "exclude": exclude, - "formfield_callback": partial(self.formfield_for_dbfield, request=request), - "extra": self.get_extra(request, obj, **kwargs), - "min_num": self.get_min_num(request, obj, **kwargs), - "max_num": self.get_max_num(request, obj, **kwargs), - "can_delete": can_delete, - **kwargs, - } - - base_model_form = defaults["form"] - can_change = self.has_change_permission(request, obj) if request else True - can_add = self.has_add_permission(request, obj) if request else True - - class DeleteProtectedModelForm(base_model_form): - def hand_clean_DELETE(self): - """ - We don't validate the 'DELETE' field itself because on - templates it's not rendered using the field information, but - just using a generic "deletion_field" of the InlineModelAdmin. - """ - if self.cleaned_data.get(DELETION_FIELD_NAME, False): - using = router.db_for_write(self._meta.model) - collector = NestedObjects(using=using) - if self.instance._state.adding: - return - collector.collect([self.instance]) - if collector.protected: - objs = [] - for p in collector.protected: - objs.append( - # Translators: Model verbose name and instance - # representation, suitable to be an item in a - # list. - _("%(class_name)s %(instance)s") - % {"class_name": p._meta.verbose_name, "instance": p} - ) - params = { - "class_name": self._meta.model._meta.verbose_name, - "instance": self.instance, - "related_objects": get_text_list(objs, _("and")), - } - msg = _( - "Deleting %(class_name)s %(instance)s would require " - "deleting the following protected related objects: " - "%(related_objects)s" - ) - raise ValidationError( - msg, code="deleting_protected", params=params - ) - - def is_valid(self): - result = super().is_valid() - self.hand_clean_DELETE() - return result - - def has_changed(self): - # Protect against unauthorized edits. - if not can_change and not self.instance._state.adding: - return False - if not can_add and self.instance._state.adding: - return False - return super().has_changed() - - defaults["form"] = DeleteProtectedModelForm - - if defaults["fields"] is None and not modelform_defines_fields( - defaults["form"] - ): - defaults["fields"] = forms.ALL_FIELDS - - return inlineformset_factory(self.parent_model, self.model, **defaults) - - def _get_form_for_get_fields(self, request, obj=None): - return self.get_formset(request, obj, fields=None).form - - def get_queryset(self, request): - queryset = super().get_queryset(request) - if not self.has_view_or_change_permission(request): - queryset = queryset.none() - return queryset - - def _has_any_perms_for_target_model(self, request, perms): - """ - This method is called only when the ModelAdmin's model is for an - ManyToManyField's implicit through model (if self.opts.auto_created). - Return True if the user has any of the given permissions ('add', - 'change', etc.) for the model that points to the through model. - """ - opts = self.opts - # Find the target model of an auto-created many-to-many relationship. - for field in opts.fields: - if field.remote_field and field.remote_field.model != self.parent_model: - opts = field.remote_field.model._meta - break - return any( - request.user.has_perm( - "%s.%s" % (opts.app_label, get_permission_codename(perm, opts)) - ) - for perm in perms - ) - - def has_add_permission(self, request, obj): - if self.opts.auto_created: - # Auto-created intermediate models don't have their own - # permissions. The user needs to have the change permission for the - # related model in order to be able to do anything with the - # intermediate model. - return self._has_any_perms_for_target_model(request, ["change"]) - return super().has_add_permission(request) - - def has_change_permission(self, request, obj=None): - if self.opts.auto_created: - # Same comment as has_add_permission(). - return self._has_any_perms_for_target_model(request, ["change"]) - return super().has_change_permission(request) - - def has_delete_permission(self, request, obj=None): - if self.opts.auto_created: - # Same comment as has_add_permission(). - return self._has_any_perms_for_target_model(request, ["change"]) - return super().has_delete_permission(request, obj) - - def has_view_permission(self, request, obj=None): - if self.opts.auto_created: - # Same comment as has_add_permission(). The 'change' permission - # also implies the 'view' permission. - return self._has_any_perms_for_target_model(request, ["view", "change"]) - return super().has_view_permission(request) - - -class StackedInline(InlineModelAdmin): - template = "admin/edit_inline/stacked.html" - - -class TabularInline(InlineModelAdmin): - template = "admin/edit_inline/tabular.html" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/sites.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/sites.py deleted file mode 100644 index 201f28e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/sites.py +++ /dev/null @@ -1,621 +0,0 @@ -from functools import update_wrapper -from weakref import WeakSet - -from django.apps import apps -from django.conf import settings -from django.contrib.admin import ModelAdmin, actions -from django.contrib.admin.exceptions import AlreadyRegistered, NotRegistered -from django.contrib.admin.views.autocomplete import AutocompleteJsonView -from django.contrib.auth import REDIRECT_FIELD_NAME -from django.contrib.auth.decorators import login_not_required -from django.core.exceptions import ImproperlyConfigured -from django.db.models.base import ModelBase -from django.http import Http404, HttpResponsePermanentRedirect, HttpResponseRedirect -from django.template.response import TemplateResponse -from django.urls import NoReverseMatch, Resolver404, resolve, reverse, reverse_lazy -from django.utils.decorators import method_decorator -from django.utils.functional import LazyObject -from django.utils.module_loading import import_string -from django.utils.text import capfirst -from django.utils.translation import gettext as _ -from django.utils.translation import gettext_lazy -from django.views.decorators.cache import never_cache -from django.views.decorators.common import no_append_slash -from django.views.decorators.csrf import csrf_protect -from django.views.i18n import JavaScriptCatalog - -all_sites = WeakSet() - - -class AdminSite: - """ - An AdminSite object encapsulates an instance of the Django admin application, ready - to be hooked in to your URLconf. Models are registered with the AdminSite using the - register() method, and the get_urls() method can then be used to access Django view - functions that present a full admin interface for the collection of registered - models. - """ - - # Text to put at the end of each page's . - site_title = gettext_lazy("Django site admin") - - # Text to put in each page's <div id="site-name">. - site_header = gettext_lazy("Django administration") - - # Text to put at the top of the admin index page. - index_title = gettext_lazy("Site administration") - - # URL for the "View site" link at the top of each admin page. - site_url = "/" - - enable_nav_sidebar = True - - empty_value_display = "-" - - login_form = None - index_template = None - app_index_template = None - login_template = None - logout_template = None - password_change_template = None - password_change_done_template = None - - final_catch_all_view = True - - def __init__(self, name="admin"): - self._registry = {} # model_class class -> admin_class instance - self.name = name - self._actions = {"delete_selected": actions.delete_selected} - self._global_actions = self._actions.copy() - all_sites.add(self) - - def __repr__(self): - return f"{self.__class__.__name__}(name={self.name!r})" - - def check(self, app_configs): - """ - Run the system checks on all ModelAdmins, except if they aren't - customized at all. - """ - if app_configs is None: - app_configs = apps.get_app_configs() - app_configs = set(app_configs) # Speed up lookups below - - errors = [] - modeladmins = ( - o for o in self._registry.values() if o.__class__ is not ModelAdmin - ) - for modeladmin in modeladmins: - if modeladmin.model._meta.app_config in app_configs: - errors.extend(modeladmin.check()) - return errors - - def register(self, model_or_iterable, admin_class=None, **options): - """ - Register the given model(s) with the given admin class. - - The model(s) should be Model classes, not instances. - - If an admin class isn't given, use ModelAdmin (the default admin - options). If keyword arguments are given -- e.g., list_display -- - apply them as options to the admin class. - - If a model is already registered, raise AlreadyRegistered. - - If a model is abstract, raise ImproperlyConfigured. - """ - admin_class = admin_class or ModelAdmin - if isinstance(model_or_iterable, ModelBase): - model_or_iterable = [model_or_iterable] - for model in model_or_iterable: - if model._meta.abstract: - raise ImproperlyConfigured( - "The model %s is abstract, so it cannot be registered with admin." - % model.__name__ - ) - if model._meta.is_composite_pk: - raise ImproperlyConfigured( - "The model %s has a composite primary key, so it cannot be " - "registered with admin." % model.__name__ - ) - - if self.is_registered(model): - registered_admin = str(self.get_model_admin(model)) - msg = "The model %s is already registered " % model.__name__ - if registered_admin.endswith(".ModelAdmin"): - # Most likely registered without a ModelAdmin subclass. - msg += "in app %r." % registered_admin.removesuffix(".ModelAdmin") - else: - msg += "with %r." % registered_admin - raise AlreadyRegistered(msg) - - # Ignore the registration if the model has been - # swapped out. - if not model._meta.swapped: - # If we got **options then dynamically construct a subclass of - # admin_class with those **options. - if options: - # For reasons I don't quite understand, without a __module__ - # the created class appears to "live" in the wrong place, - # which causes issues later on. - options["__module__"] = __name__ - admin_class = type( - "%sAdmin" % model.__name__, (admin_class,), options - ) - - # Instantiate the admin class to save in the registry - self._registry[model] = admin_class(model, self) - - def unregister(self, model_or_iterable): - """ - Unregister the given model(s). - - If a model isn't already registered, raise NotRegistered. - """ - if isinstance(model_or_iterable, ModelBase): - model_or_iterable = [model_or_iterable] - for model in model_or_iterable: - if not self.is_registered(model): - raise NotRegistered("The model %s is not registered" % model.__name__) - del self._registry[model] - - def is_registered(self, model): - """ - Check if a model class is registered with this `AdminSite`. - """ - return model in self._registry - - def get_model_admin(self, model): - try: - return self._registry[model] - except KeyError: - raise NotRegistered(f"The model {model.__name__} is not registered.") - - def add_action(self, action, name=None): - """ - Register an action to be available globally. - """ - name = name or action.__name__ - self._actions[name] = action - self._global_actions[name] = action - - def disable_action(self, name): - """ - Disable a globally-registered action. Raise KeyError for invalid names. - """ - del self._actions[name] - - def get_action(self, name): - """ - Explicitly get a registered global action whether it's enabled or - not. Raise KeyError for invalid names. - """ - return self._global_actions[name] - - @property - def actions(self): - """ - Get all the enabled actions as an iterable of (name, func). - """ - return self._actions.items() - - def has_permission(self, request): - """ - Return True if the given HttpRequest has permission to view - *at least one* page in the admin site. - """ - return request.user.is_active and request.user.is_staff - - def admin_view(self, view, cacheable=False): - """ - Decorator to create an admin view attached to this ``AdminSite``. This - wraps the view and provides permission checking by calling - ``self.has_permission``. - - You'll want to use this from within ``AdminSite.get_urls()``: - - class MyAdminSite(AdminSite): - - def get_urls(self): - from django.urls import path - - urls = super().get_urls() - urls += [ - path('my_view/', self.admin_view(some_view)) - ] - return urls - - By default, admin_views are marked non-cacheable using the - ``never_cache`` decorator. If the view can be safely cached, set - cacheable=True. - """ - - def inner(request, *args, **kwargs): - if not self.has_permission(request): - if request.path == reverse("admin:logout", current_app=self.name): - index_path = reverse("admin:index", current_app=self.name) - return HttpResponseRedirect(index_path) - # Inner import to prevent django.contrib.admin (app) from - # importing django.contrib.auth.models.User (unrelated model). - from django.contrib.auth.views import redirect_to_login - - return redirect_to_login( - request.get_full_path(), - reverse("admin:login", current_app=self.name), - ) - return view(request, *args, **kwargs) - - if not cacheable: - inner = never_cache(inner) - # We add csrf_protect here so this function can be used as a utility - # function for any view, without having to repeat 'csrf_protect'. - if not getattr(view, "csrf_exempt", False): - inner = csrf_protect(inner) - return update_wrapper(inner, view) - - def get_urls(self): - # Since this module gets imported in the application's root package, - # it cannot import models from other applications at the module level, - # and django.contrib.contenttypes.views imports ContentType. - from django.contrib.contenttypes import views as contenttype_views - from django.urls import include, path, re_path - - def wrap(view, cacheable=False): - def wrapper(*args, **kwargs): - return self.admin_view(view, cacheable)(*args, **kwargs) - - wrapper.admin_site = self - # Used by LoginRequiredMiddleware. - wrapper.login_url = reverse_lazy("admin:login", current_app=self.name) - return update_wrapper(wrapper, view) - - # Admin-site-wide views. - urlpatterns = [ - path("", wrap(self.index), name="index"), - path("login/", self.login, name="login"), - path("logout/", wrap(self.logout), name="logout"), - path( - "password_change/", - wrap(self.password_change, cacheable=True), - name="password_change", - ), - path( - "password_change/done/", - wrap(self.password_change_done, cacheable=True), - name="password_change_done", - ), - path("autocomplete/", wrap(self.autocomplete_view), name="autocomplete"), - path("jsi18n/", wrap(self.i18n_javascript, cacheable=True), name="jsi18n"), - path( - "r/<path:content_type_id>/<path:object_id>/", - wrap(contenttype_views.shortcut), - name="view_on_site", - ), - ] - - # Add in each model's views, and create a list of valid URLS for the - # app_index - valid_app_labels = [] - for model, model_admin in self._registry.items(): - urlpatterns += [ - path( - "%s/%s/" % (model._meta.app_label, model._meta.model_name), - include(model_admin.urls), - ), - ] - if model._meta.app_label not in valid_app_labels: - valid_app_labels.append(model._meta.app_label) - - # If there were ModelAdmins registered, we should have a list of app - # labels for which we need to allow access to the app_index view, - if valid_app_labels: - regex = r"^(?P<app_label>" + "|".join(valid_app_labels) + ")/$" - urlpatterns += [ - re_path(regex, wrap(self.app_index), name="app_list"), - ] - - if self.final_catch_all_view: - urlpatterns.append(re_path(r"(?P<url>.*)$", wrap(self.catch_all_view))) - - return urlpatterns - - @property - def urls(self): - return self.get_urls(), "admin", self.name - - def each_context(self, request): - """ - Return a dictionary of variables to put in the template context for - *every* page in the admin site. - - For sites running on a subpath, use the SCRIPT_NAME value if site_url - hasn't been customized. - """ - script_name = request.META["SCRIPT_NAME"] - site_url = ( - script_name if self.site_url == "/" and script_name else self.site_url - ) - return { - "site_title": self.site_title, - "site_header": self.site_header, - "site_url": site_url, - "has_permission": self.has_permission(request), - "available_apps": self.get_app_list(request), - "is_popup": False, - "is_nav_sidebar_enabled": self.enable_nav_sidebar, - "log_entries": self.get_log_entries(request), - } - - def password_change(self, request, extra_context=None): - """ - Handle the "change password" task -- both form display and validation. - """ - from django.contrib.admin.forms import AdminPasswordChangeForm - from django.contrib.auth.views import PasswordChangeView - - url = reverse("admin:password_change_done", current_app=self.name) - defaults = { - "form_class": AdminPasswordChangeForm, - "success_url": url, - "extra_context": {**self.each_context(request), **(extra_context or {})}, - } - if self.password_change_template is not None: - defaults["template_name"] = self.password_change_template - request.current_app = self.name - return PasswordChangeView.as_view(**defaults)(request) - - def password_change_done(self, request, extra_context=None): - """ - Display the "success" page after a password change. - """ - from django.contrib.auth.views import PasswordChangeDoneView - - defaults = { - "extra_context": {**self.each_context(request), **(extra_context or {})}, - } - if self.password_change_done_template is not None: - defaults["template_name"] = self.password_change_done_template - request.current_app = self.name - return PasswordChangeDoneView.as_view(**defaults)(request) - - def i18n_javascript(self, request, extra_context=None): - """ - Display the i18n JavaScript that the Django admin requires. - - `extra_context` is unused but present for consistency with the other - admin views. - """ - return JavaScriptCatalog.as_view(packages=["django.contrib.admin"])(request) - - def logout(self, request, extra_context=None): - """ - Log out the user for the given HttpRequest. - - This should *not* assume the user is already logged in. - """ - from django.contrib.auth.views import LogoutView - - defaults = { - "extra_context": { - **self.each_context(request), - # Since the user isn't logged out at this point, the value of - # has_permission must be overridden. - "has_permission": False, - **(extra_context or {}), - }, - } - if self.logout_template is not None: - defaults["template_name"] = self.logout_template - request.current_app = self.name - return LogoutView.as_view(**defaults)(request) - - @method_decorator(never_cache) - @login_not_required - def login(self, request, extra_context=None): - """ - Display the login form for the given HttpRequest. - """ - if request.method == "GET" and self.has_permission(request): - # Already logged-in, redirect to admin index - index_path = reverse("admin:index", current_app=self.name) - return HttpResponseRedirect(index_path) - - # Since this module gets imported in the application's root package, - # it cannot import models from other applications at the module level, - # and django.contrib.admin.forms eventually imports User. - from django.contrib.admin.forms import AdminAuthenticationForm - from django.contrib.auth.views import LoginView - - context = { - **self.each_context(request), - "title": _("Log in"), - "subtitle": None, - "app_path": request.get_full_path(), - "username": request.user.get_username(), - } - if ( - REDIRECT_FIELD_NAME not in request.GET - and REDIRECT_FIELD_NAME not in request.POST - ): - context[REDIRECT_FIELD_NAME] = reverse("admin:index", current_app=self.name) - context.update(extra_context or {}) - - defaults = { - "extra_context": context, - "authentication_form": self.login_form or AdminAuthenticationForm, - "template_name": self.login_template or "admin/login.html", - } - request.current_app = self.name - return LoginView.as_view(**defaults)(request) - - def autocomplete_view(self, request): - return AutocompleteJsonView.as_view(admin_site=self)(request) - - @no_append_slash - def catch_all_view(self, request, url): - if settings.APPEND_SLASH and not url.endswith("/"): - urlconf = getattr(request, "urlconf", None) - try: - match = resolve("%s/" % request.path_info, urlconf) - except Resolver404: - pass - else: - if getattr(match.func, "should_append_slash", True): - return HttpResponsePermanentRedirect( - request.get_full_path(force_append_slash=True) - ) - raise Http404 - - def _build_app_dict(self, request, label=None): - """ - Build the app dictionary. The optional `label` parameter filters models - of a specific app. - """ - app_dict = {} - - if label: - models = { - m: m_a - for m, m_a in self._registry.items() - if m._meta.app_label == label - } - else: - models = self._registry - - for model, model_admin in models.items(): - app_label = model._meta.app_label - - has_module_perms = model_admin.has_module_permission(request) - if not has_module_perms: - continue - - perms = model_admin.get_model_perms(request) - - # Check whether user has any perm for this module. - # If so, add the module to the model_list. - if True not in perms.values(): - continue - - info = (app_label, model._meta.model_name) - model_dict = { - "model": model, - "name": capfirst(model._meta.verbose_name_plural), - "object_name": model._meta.object_name, - "perms": perms, - "admin_url": None, - "add_url": None, - } - if perms.get("change") or perms.get("view"): - model_dict["view_only"] = not perms.get("change") - try: - model_dict["admin_url"] = reverse( - "admin:%s_%s_changelist" % info, current_app=self.name - ) - except NoReverseMatch: - pass - if perms.get("add"): - try: - model_dict["add_url"] = reverse( - "admin:%s_%s_add" % info, current_app=self.name - ) - except NoReverseMatch: - pass - - if app_label in app_dict: - app_dict[app_label]["models"].append(model_dict) - else: - app_dict[app_label] = { - "name": apps.get_app_config(app_label).verbose_name, - "app_label": app_label, - "app_url": reverse( - "admin:app_list", - kwargs={"app_label": app_label}, - current_app=self.name, - ), - "has_module_perms": has_module_perms, - "models": [model_dict], - } - - return app_dict - - def get_app_list(self, request, app_label=None): - """ - Return a sorted list of all the installed apps that have been - registered in this site. - """ - app_dict = self._build_app_dict(request, app_label) - - # Sort the apps alphabetically. - app_list = sorted(app_dict.values(), key=lambda x: x["name"].lower()) - - # Sort the models alphabetically within each app. - for app in app_list: - app["models"].sort(key=lambda x: x["name"]) - - return app_list - - def index(self, request, extra_context=None): - """ - Display the main admin index page, which lists all of the installed - apps that have been registered in this site. - """ - app_list = self.get_app_list(request) - - context = { - **self.each_context(request), - "title": self.index_title, - "subtitle": None, - "app_list": app_list, - **(extra_context or {}), - } - - request.current_app = self.name - - return TemplateResponse( - request, self.index_template or "admin/index.html", context - ) - - def app_index(self, request, app_label, extra_context=None): - app_list = self.get_app_list(request, app_label) - - if not app_list: - raise Http404("The requested admin page does not exist.") - - context = { - **self.each_context(request), - "title": _("%(app)s administration") % {"app": app_list[0]["name"]}, - "subtitle": None, - "app_list": app_list, - "app_label": app_label, - **(extra_context or {}), - } - - request.current_app = self.name - - return TemplateResponse( - request, - self.app_index_template - or ["admin/%s/app_index.html" % app_label, "admin/app_index.html"], - context, - ) - - def get_log_entries(self, request): - from django.contrib.admin.models import LogEntry - - return LogEntry.objects.select_related("content_type", "user") - - -class DefaultAdminSite(LazyObject): - def _setup(self): - AdminSiteClass = import_string(apps.get_app_config("admin").default_site) - self._wrapped = AdminSiteClass() - - def __repr__(self): - return repr(self._wrapped) - - -# This global object represents the default admin site, for the common case. -# You can provide your own AdminSite using the (Simple)AdminConfig.default_site -# attribute. You can also instantiate AdminSite in your own code to create a -# custom admin site. -site = DefaultAdminSite() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/autocomplete.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/autocomplete.css deleted file mode 100644 index 7478c2c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/autocomplete.css +++ /dev/null @@ -1,279 +0,0 @@ -select.admin-autocomplete { - width: 20em; -} - -.select2-container--admin-autocomplete.select2-container { - min-height: 30px; -} - -.select2-container--admin-autocomplete .select2-selection--single, -.select2-container--admin-autocomplete .select2-selection--multiple { - min-height: 30px; - padding: 0; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection, -.select2-container--admin-autocomplete.select2-container--open .select2-selection { - border-color: var(--body-quiet-color); - min-height: 30px; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single, -.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single { - padding: 0; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple, -.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple { - padding: 0; -} - -.select2-container--admin-autocomplete .select2-selection--single { - background-color: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: 4px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { - color: var(--body-fg); - line-height: 30px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { - color: var(--body-quiet-color); -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { - background-color: var(--darkened-bg); - cursor: default; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; -} - -.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple { - background-color: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: 4px; - cursor: text; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 10px 5px 5px; - width: 100%; - display: flex; - flex-wrap: wrap; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { - list-style: none; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { - color: var(--body-quiet-color); - margin-top: 5px; - float: left; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin: 5px; - position: absolute; - right: 0; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { - background-color: var(--darkened-bg); - border: 1px solid var(--border-color); - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { - color: var(--body-quiet-color); - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { - color: var(--body-fg); -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { - border: solid var(--body-quiet-color) 1px; - outline: 0; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { - background-color: var(--darkened-bg); - cursor: default; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove { - display: none; -} - -.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -.select2-container--admin-autocomplete .select2-search--dropdown { - background: var(--darkened-bg); -} - -.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { - background: var(--body-bg); - color: var(--body-fg); - border: 1px solid var(--border-color); - border-radius: 4px; -} - -.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { - background: transparent; - color: var(--body-fg); - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; -} - -.select2-container--admin-autocomplete .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; - color: var(--body-fg); - background: var(--body-bg); -} - -.select2-container--admin-autocomplete .select2-results__option[role=group] { - padding: 0; -} - -.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { - color: var(--body-quiet-color); -} - -.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { - background-color: var(--selected-bg); - color: var(--body-fg); -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option { - padding-left: 1em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; -} - -.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { - background-color: var(--primary); - color: var(--primary-fg); -} - -.select2-container--admin-autocomplete .select2-results__group { - cursor: default; - display: block; - padding: 6px; -} - -.errors .select2-selection { - border: 1px solid var(--error-fg); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/base.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/base.css deleted file mode 100644 index 4f47732..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/base.css +++ /dev/null @@ -1,1183 +0,0 @@ -/* - DJANGO Admin styles -*/ - -/* VARIABLE DEFINITIONS */ -html[data-theme="light"], -:root { - --primary: #79aec8; - --secondary: #417690; - --accent: #f5dd5d; - --primary-fg: #fff; - - --body-fg: #333; - --body-bg: #fff; - --body-quiet-color: #666; - --body-medium-color: #444; - --body-loud-color: #000; - - --header-color: #ffc; - --header-branding-color: var(--accent); - --header-bg: var(--secondary); - --header-link-color: var(--primary-fg); - - --breadcrumbs-fg: #c4dce8; - --breadcrumbs-link-fg: var(--body-bg); - --breadcrumbs-bg: #264b5d; - - --link-fg: #417893; - --link-hover-color: #036; - --link-selected-fg: var(--secondary); - - --hairline-color: #e8e8e8; - --border-color: #ccc; - - --error-fg: #ba2121; - - --message-success-bg: #dfd; - --message-warning-bg: #ffc; - --message-error-bg: #ffefef; - - --darkened-bg: #f8f8f8; /* A bit darker than --body-bg */ - --selected-bg: #e4e4e4; /* E.g. selected table cells */ - --selected-row: #ffc; - - --button-fg: #fff; - --button-bg: var(--secondary); - --button-hover-bg: #205067; - --default-button-bg: #205067; - --default-button-hover-bg: var(--secondary); - --close-button-bg: #747474; - --close-button-hover-bg: #333; - --delete-button-bg: #ba2121; - --delete-button-hover-bg: #a41515; - - --object-tools-fg: var(--button-fg); - --object-tools-bg: var(--close-button-bg); - --object-tools-hover-bg: var(--close-button-hover-bg); - - --font-family-primary: - "Segoe UI", - system-ui, - Roboto, - "Helvetica Neue", - Arial, - sans-serif, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol", - "Noto Color Emoji"; - --font-family-monospace: - ui-monospace, - Menlo, - Monaco, - "Cascadia Mono", - "Segoe UI Mono", - "Roboto Mono", - "Oxygen Mono", - "Ubuntu Monospace", - "Source Code Pro", - "Fira Mono", - "Droid Sans Mono", - "Courier New", - monospace, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol", - "Noto Color Emoji"; - - color-scheme: light; -} - -html, body { - height: 100%; -} - -body { - margin: 0; - padding: 0; - font-size: 0.875rem; - font-family: var(--font-family-primary); - color: var(--body-fg); - background: var(--body-bg); -} - -/* LINKS */ - -a:link, a:visited { - color: var(--link-fg); - text-decoration: none; - transition: color 0.15s, background 0.15s; -} - -a:focus, a:hover { - color: var(--link-hover-color); -} - -a:focus { - text-decoration: underline; -} - -a img { - border: none; -} - -a.section:link, a.section:visited { - color: var(--header-link-color); - text-decoration: none; -} - -a.section:focus, a.section:hover { - text-decoration: underline; -} - -/* GLOBAL DEFAULTS */ - -p, ol, ul, dl { - margin: .2em 0 .8em 0; -} - -p { - padding: 0; - line-height: 140%; -} - -h1,h2,h3,h4,h5 { - font-weight: bold; -} - -h1 { - margin: 0 0 20px; - font-weight: 300; - font-size: 1.25rem; -} - -h2 { - font-size: 1rem; - margin: 1em 0 .5em 0; -} - -h2.subhead { - font-weight: normal; - margin-top: 0; -} - -h3 { - font-size: 0.875rem; - margin: .8em 0 .3em 0; - color: var(--body-medium-color); - font-weight: bold; -} - -h4 { - font-size: 0.75rem; - margin: 1em 0 .8em 0; - padding-bottom: 3px; - color: var(--body-medium-color); -} - -h5 { - font-size: 0.625rem; - margin: 1.5em 0 .5em 0; - color: var(--body-quiet-color); - text-transform: uppercase; - letter-spacing: 1px; -} - -ul > li { - list-style-type: square; - padding: 1px 0; -} - -li ul { - margin-bottom: 0; -} - -li, dt, dd { - font-size: 0.8125rem; - line-height: 1.25rem; -} - -dt { - font-weight: bold; - margin-top: 4px; -} - -dd { - margin-left: 0; -} - -form { - margin: 0; - padding: 0; -} - -fieldset { - margin: 0; - min-width: 0; - padding: 0; - border: none; - border-top: 1px solid var(--hairline-color); -} - -details summary { - cursor: pointer; -} - -blockquote { - font-size: 0.6875rem; - color: #777; - margin-left: 2px; - padding-left: 10px; - border-left: 5px solid #ddd; -} - -code, pre { - font-family: var(--font-family-monospace); - color: var(--body-quiet-color); - font-size: 0.75rem; - overflow-x: auto; -} - -pre.literal-block { - margin: 10px; - background: var(--darkened-bg); - padding: 6px 8px; -} - -code strong { - color: #930; -} - -hr { - clear: both; - color: var(--hairline-color); - background-color: var(--hairline-color); - height: 1px; - border: none; - margin: 0; - padding: 0; - line-height: 1px; -} - -/* TEXT STYLES & MODIFIERS */ - -.small { - font-size: 0.6875rem; -} - -.mini { - font-size: 0.625rem; -} - -.help, p.help, form p.help, div.help, form div.help, div.help li { - font-size: 0.6875rem; - color: var(--body-quiet-color); -} - -div.help ul { - margin-bottom: 0; -} - -.help-tooltip { - cursor: help; -} - -p img, h1 img, h2 img, h3 img, h4 img, td img { - vertical-align: middle; -} - -.quiet, a.quiet:link, a.quiet:visited { - color: var(--body-quiet-color); - font-weight: normal; -} - -.clear { - clear: both; -} - -.nowrap { - white-space: nowrap; -} - -.hidden { - display: none !important; -} - -/* TABLES */ - -table { - border-collapse: collapse; - border-color: var(--border-color); -} - -td, th { - font-size: 0.8125rem; - line-height: 1rem; - border-bottom: 1px solid var(--hairline-color); - vertical-align: top; - padding: 8px; -} - -th { - font-weight: 500; - text-align: left; -} - -thead th, -tfoot td { - color: var(--body-quiet-color); - padding: 5px 10px; - font-size: 0.6875rem; - background: var(--body-bg); - border: none; - border-top: 1px solid var(--hairline-color); - border-bottom: 1px solid var(--hairline-color); -} - -tfoot td { - border-bottom: none; - border-top: 1px solid var(--hairline-color); -} - -thead th.required { - font-weight: bold; -} - -tr.alt { - background: var(--darkened-bg); -} - -tr:nth-child(odd), .row-form-errors { - background: var(--body-bg); -} - -tr:nth-child(even), -tr:nth-child(even) .errorlist, -tr:nth-child(odd) + .row-form-errors, -tr:nth-child(odd) + .row-form-errors .errorlist { - background: var(--darkened-bg); -} - -/* SORTABLE TABLES */ - -thead th { - padding: 5px 10px; - line-height: normal; - text-transform: uppercase; - background: var(--darkened-bg); -} - -thead th a:link, thead th a:visited { - color: var(--body-quiet-color); -} - -thead th.sorted { - background: var(--selected-bg); -} - -thead th.sorted .text { - padding-right: 42px; -} - -table thead th .text span { - padding: 8px 10px; - display: block; -} - -table thead th .text a { - display: block; - cursor: pointer; - padding: 8px 10px; -} - -table thead th .text a:focus, table thead th .text a:hover { - background: var(--selected-bg); -} - -thead th.sorted a.sortremove { - visibility: hidden; -} - -table thead th.sorted:hover a.sortremove { - visibility: visible; -} - -table thead th.sorted .sortoptions { - display: block; - padding: 9px 5px 0 5px; - float: right; - text-align: right; -} - -table thead th.sorted .sortpriority { - font-size: .8em; - min-width: 12px; - text-align: center; - vertical-align: 3px; - margin-left: 2px; - margin-right: 2px; -} - -table thead th.sorted .sortoptions a { - position: relative; - width: 14px; - height: 14px; - display: inline-block; - background: url(../img/sorting-icons.svg) 0 0 no-repeat; - background-size: 14px auto; -} - -table thead th.sorted .sortoptions a.sortremove { - background-position: 0 0; -} - -table thead th.sorted .sortoptions a.sortremove:after { - content: '\\'; - position: absolute; - top: -6px; - left: 3px; - font-weight: 200; - font-size: 1.125rem; - color: var(--body-quiet-color); -} - -table thead th.sorted .sortoptions a.sortremove:focus:after, -table thead th.sorted .sortoptions a.sortremove:hover:after { - color: var(--link-fg); -} - -table thead th.sorted .sortoptions a.sortremove:focus, -table thead th.sorted .sortoptions a.sortremove:hover { - background-position: 0 -14px; -} - -table thead th.sorted .sortoptions a.ascending { - background-position: 0 -28px; -} - -table thead th.sorted .sortoptions a.ascending:focus, -table thead th.sorted .sortoptions a.ascending:hover { - background-position: 0 -42px; -} - -table thead th.sorted .sortoptions a.descending { - top: 1px; - background-position: 0 -56px; -} - -table thead th.sorted .sortoptions a.descending:focus, -table thead th.sorted .sortoptions a.descending:hover { - background-position: 0 -70px; -} - -/* FORM DEFAULTS */ - -input, textarea, select, .form-row p, form .button { - margin: 2px 0; - padding: 2px 3px; - vertical-align: middle; - font-family: var(--font-family-primary); - font-weight: normal; - font-size: 0.8125rem; -} -.form-row div.help { - padding: 2px 3px; -} - -textarea { - vertical-align: top; -} - -/* -Minifiers remove the default (text) "type" attribute from "input" HTML tags. -Add input:not([type]) to make the CSS stylesheet work the same. -*/ -input:not([type]), input[type=text], input[type=password], input[type=email], -input[type=url], input[type=number], input[type=tel], textarea, select, -.vTextField { - border: 1px solid var(--border-color); - border-radius: 4px; - padding: 5px 6px; - margin-top: 0; - color: var(--body-fg); - background-color: var(--body-bg); -} - -/* -Minifiers remove the default (text) "type" attribute from "input" HTML tags. -Add input:not([type]) to make the CSS stylesheet work the same. -*/ -input:not([type]):focus, input[type=text]:focus, input[type=password]:focus, -input[type=email]:focus, input[type=url]:focus, input[type=number]:focus, -input[type=tel]:focus, textarea:focus, select:focus, .vTextField:focus { - border-color: var(--body-quiet-color); -} - -select { - height: 1.875rem; -} - -select[multiple] { - /* Allow HTML size attribute to override the height in the rule above. */ - height: auto; - min-height: 150px; -} - -/* FORM BUTTONS */ - -.button, input[type=submit], input[type=button], .submit-row input, a.button { - background: var(--button-bg); - padding: 10px 15px; - border: none; - border-radius: 4px; - color: var(--button-fg); - cursor: pointer; - transition: background 0.15s; -} - -a.button { - padding: 4px 5px; -} - -.button:active, input[type=submit]:active, input[type=button]:active, -.button:focus, input[type=submit]:focus, input[type=button]:focus, -.button:hover, input[type=submit]:hover, input[type=button]:hover { - background: var(--button-hover-bg); -} - -.button[disabled], input[type=submit][disabled], input[type=button][disabled] { - opacity: 0.4; -} - -.button.default, input[type=submit].default, .submit-row input.default { - border: none; - font-weight: 400; - background: var(--default-button-bg); -} - -.button.default:active, input[type=submit].default:active, -.button.default:focus, input[type=submit].default:focus, -.button.default:hover, input[type=submit].default:hover { - background: var(--default-button-hover-bg); -} - -.button[disabled].default, -input[type=submit][disabled].default, -input[type=button][disabled].default { - opacity: 0.4; -} - - -/* MODULES */ - -.module { - border: none; - margin-bottom: 30px; - background: var(--body-bg); -} - -.module p, .module ul, .module h3, .module h4, .module dl, .module pre { - padding-left: 10px; - padding-right: 10px; -} - -.module blockquote { - margin-left: 12px; -} - -.module ul, .module ol { - margin-left: 1.5em; -} - -.module h3 { - margin-top: .6em; -} - -.module h2, .module caption, .inline-group h2 { - margin: 0; - padding: 8px; - font-weight: 400; - font-size: 0.8125rem; - text-align: left; - background: var(--header-bg); - color: var(--header-link-color); -} - -.module caption, -.inline-group h2 { - font-size: 0.75rem; - letter-spacing: 0.5px; - text-transform: uppercase; -} - -.module table { - border-collapse: collapse; -} - -/* MESSAGES & ERRORS */ - -ul.messagelist { - padding: 0; - margin: 0; -} - -ul.messagelist li { - display: block; - font-weight: 400; - font-size: 0.8125rem; - padding: 10px 10px 10px 65px; - margin: 0 0 10px 0; - background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat; - background-size: 16px auto; - color: var(--body-fg); - word-break: break-word; -} - -ul.messagelist li.warning { - background: var(--message-warning-bg) url(../img/icon-alert.svg) 40px 14px no-repeat; - background-size: 14px auto; -} - -ul.messagelist li.error { - background: var(--message-error-bg) url(../img/icon-no.svg) 40px 12px no-repeat; - background-size: 16px auto; -} - -.errornote { - font-size: 0.875rem; - font-weight: 700; - display: block; - padding: 10px 12px; - margin: 0 0 10px 0; - color: var(--error-fg); - border: 1px solid var(--error-fg); - border-radius: 4px; - background-color: var(--body-bg); - background-position: 5px 12px; - overflow-wrap: break-word; -} - -ul.errorlist { - margin: 0 0 4px; - padding: 0; - color: var(--error-fg); - background: var(--body-bg); -} - -ul.errorlist li { - font-size: 0.8125rem; - display: block; - margin-bottom: 4px; - overflow-wrap: break-word; -} - -ul.errorlist li:first-child { - margin-top: 0; -} - -ul.errorlist li a { - color: inherit; - text-decoration: underline; -} - -td ul.errorlist { - margin: 0; - padding: 0; -} - -td ul.errorlist li { - margin: 0; -} - -.form-row.errors { - margin: 0; - border: none; - border-bottom: 1px solid var(--hairline-color); - background: none; -} - -.form-row.errors ul.errorlist li { - padding-left: 0; -} - -.errors input, .errors select, .errors textarea, -td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea { - border: 1px solid var(--error-fg); -} - -.description { - font-size: 0.75rem; - padding: 5px 0 0 12px; -} - -/* BREADCRUMBS */ - -div.breadcrumbs { - background: var(--breadcrumbs-bg); - padding: 10px 40px; - border: none; - color: var(--breadcrumbs-fg); - text-align: left; -} - -div.breadcrumbs a { - color: var(--breadcrumbs-link-fg); -} - -div.breadcrumbs a:focus, div.breadcrumbs a:hover { - color: var(--breadcrumbs-fg); -} - -/* ACTION ICONS */ - -.viewlink, .inlineviewlink { - padding-left: 16px; - background: url(../img/icon-viewlink.svg) 0 1px no-repeat; -} - -.hidelink { - padding-left: 16px; - background: url(../img/icon-hidelink.svg) 0 1px no-repeat; -} - -.addlink { - padding-left: 16px; - background: url(../img/icon-addlink.svg) 0 1px no-repeat; -} - -.changelink, .inlinechangelink { - padding-left: 16px; - background: url(../img/icon-changelink.svg) 0 1px no-repeat; -} - -.deletelink { - padding-left: 16px; - background: url(../img/icon-deletelink.svg) 0 1px no-repeat; -} - -a.deletelink:link, a.deletelink:visited { - color: #CC3434; /* XXX Probably unused? */ -} - -a.deletelink:focus, a.deletelink:hover { - color: #993333; /* XXX Probably unused? */ - text-decoration: none; -} - -/* OBJECT TOOLS */ - -.object-tools { - font-size: 0.625rem; - font-weight: bold; - padding-left: 0; - float: right; - position: relative; -} - -.object-tools li { - display: block; - float: left; - margin-left: 5px; - height: 1rem; -} - -.object-tools a { - border-radius: 15px; -} - -.object-tools a:link, .object-tools a:visited { - display: block; - float: left; - padding: 3px 12px; - background: var(--object-tools-bg); - color: var(--object-tools-fg); - font-weight: 400; - font-size: 0.6875rem; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.object-tools a:focus, .object-tools a:hover { - background-color: var(--object-tools-hover-bg); -} - -.object-tools a:focus{ - text-decoration: none; -} - -.object-tools a.viewsitelink, .object-tools a.addlink { - background-repeat: no-repeat; - background-position: right 7px center; - padding-right: 26px; -} - -.object-tools a.viewsitelink { - background-image: url(../img/tooltag-arrowright.svg); -} - -.object-tools a.addlink { - background-image: url(../img/tooltag-add.svg); -} - -.object-tools:has(a.addlink) { - margin-top: -48px; -} - -/* OBJECT HISTORY */ - -#change-history table { - width: 100%; -} - -#change-history table tbody th { - width: 16em; -} - -#change-history .paginator { - color: var(--body-quiet-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--body-bg); - overflow: hidden; -} - -/* PAGE STRUCTURE */ - -#container { - position: relative; - width: 100%; - min-width: 980px; - padding: 0; - display: flex; - flex-direction: column; - height: 100%; -} - -#container > .main { - display: flex; - flex: 1 0 auto; -} - -.main > .content { - flex: 1 0; - max-width: 100%; -} - -.skip-to-content-link { - position: absolute; - top: -999px; - margin: 5px; - padding: 5px; - background: var(--body-bg); - z-index: 1; -} - -.skip-to-content-link:focus { - left: 0px; - top: 0px; -} - -#content { - padding: 20px 40px; -} - -.dashboard #content { - width: 600px; -} - -#content-main { - float: left; - width: 100%; -} - -#content-related { - float: right; - width: 260px; - position: relative; - margin-right: -300px; -} - -@media (forced-colors: active) { - #content-related { - border: 1px solid; - } -} - -/* COLUMN TYPES */ - -.colMS { - margin-right: 300px; -} - -.colSM { - margin-left: 300px; -} - -.colSM #content-related { - float: left; - margin-right: 0; - margin-left: -300px; -} - -.colSM #content-main { - float: right; -} - -.popup .colM { - width: auto; -} - -/* HEADER */ - -#header { - width: auto; - height: auto; - display: flex; - justify-content: space-between; - align-items: center; - padding: 10px 40px; - background: var(--header-bg); - color: var(--header-color); -} - -#header a:link, #header a:visited, #logout-form button { - color: var(--header-link-color); -} - -#header a:focus , #header a:hover { - text-decoration: underline; -} - -@media (forced-colors: active) { - #header { - border-bottom: 1px solid; - } -} - -#branding { - display: flex; -} - -#site-name { - padding: 0; - margin: 0; - margin-inline-end: 20px; - font-weight: 300; - font-size: 1.5rem; - color: var(--header-branding-color); -} - -#site-name a:link, #site-name a:visited { - color: var(--accent); -} - -#branding h2 { - padding: 0 10px; - font-size: 0.875rem; - margin: -8px 0 8px 0; - font-weight: normal; - color: var(--header-color); -} - -#branding a:hover { - text-decoration: none; -} - -#logout-form { - display: inline; -} - -#logout-form button { - background: none; - border: 0; - cursor: pointer; - font-family: var(--font-family-primary); -} - -#user-tools { - float: right; - margin: 0 0 0 20px; - text-align: right; -} - -#user-tools, #logout-form button{ - padding: 0; - font-weight: 300; - font-size: 0.6875rem; - letter-spacing: 0.5px; - text-transform: uppercase; -} - -#user-tools a, #logout-form button { - border-bottom: 1px solid rgba(255, 255, 255, 0.25); -} - -#user-tools a:focus, #user-tools a:hover, -#logout-form button:active, #logout-form button:hover { - text-decoration: none; - border-bottom: 0; -} - -#logout-form button:active, #logout-form button:hover { - margin-bottom: 1px; -} - -/* SIDEBAR */ - -#content-related { - background: var(--darkened-bg); -} - -#content-related .module { - background: none; -} - -#content-related h3 { - color: var(--body-quiet-color); - padding: 0 16px; - margin: 0 0 16px; -} - -#content-related h4 { - font-size: 0.8125rem; -} - -#content-related p { - padding-left: 16px; - padding-right: 16px; -} - -#content-related .actionlist { - padding: 0; - margin: 16px; -} - -#content-related .actionlist li { - line-height: 1.2; - margin-bottom: 10px; - padding-left: 18px; -} - -#content-related .module h2 { - background: none; - padding: 16px; - margin-bottom: 16px; - border-bottom: 1px solid var(--hairline-color); - font-size: 1.125rem; - color: var(--body-fg); -} - -.delete-confirmation form input[type="submit"] { - background: var(--delete-button-bg); - border-radius: 4px; - padding: 10px 15px; - color: var(--button-fg); -} - -.delete-confirmation form input[type="submit"]:active, -.delete-confirmation form input[type="submit"]:focus, -.delete-confirmation form input[type="submit"]:hover { - background: var(--delete-button-hover-bg); -} - -.delete-confirmation form .cancel-link { - display: inline-block; - vertical-align: middle; - height: 0.9375rem; - line-height: 0.9375rem; - border-radius: 4px; - padding: 10px 15px; - color: var(--button-fg); - background: var(--close-button-bg); - margin: 0 0 0 10px; -} - -.delete-confirmation form .cancel-link:active, -.delete-confirmation form .cancel-link:focus, -.delete-confirmation form .cancel-link:hover { - background: var(--close-button-hover-bg); -} - -/* POPUP */ -.popup #content { - padding: 20px; -} - -.popup #container { - min-width: 0; -} - -.popup #header { - padding: 10px 20px; -} - -/* PAGINATOR */ - -.paginator { - display: flex; - align-items: center; - gap: 4px; - font-size: 0.8125rem; - padding-top: 10px; - padding-bottom: 10px; - line-height: 22px; - margin: 0; - border-top: 1px solid var(--hairline-color); - width: 100%; - box-sizing: border-box; -} - -.paginator a:link, .paginator a:visited { - padding: 2px 6px; - background: var(--button-bg); - text-decoration: none; - color: var(--button-fg); -} - -.paginator a.showall { - border: none; - background: none; - color: var(--link-fg); -} - -.paginator a.showall:focus, .paginator a.showall:hover { - background: none; - color: var(--link-hover-color); -} - -.paginator .end { - margin-right: 6px; -} - -.paginator .this-page { - padding: 2px 6px; - font-weight: bold; - font-size: 0.8125rem; - vertical-align: top; -} - -.paginator a:focus, .paginator a:hover { - color: white; - background: var(--link-hover-color); -} - -.paginator input { - margin-left: auto; -} - -.base-svgs { - display: none; -} - -.visually-hidden { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0,0,0,0); - white-space: nowrap; - border: 0; - color: var(--body-fg); - background-color: var(--body-bg); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/changelists.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/changelists.css deleted file mode 100644 index 005b776..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/changelists.css +++ /dev/null @@ -1,343 +0,0 @@ -/* CHANGELISTS */ - -#changelist { - display: flex; - align-items: flex-start; - justify-content: space-between; -} - -#changelist .changelist-form-container { - flex: 1 1 auto; - min-width: 0; -} - -#changelist table { - width: 100%; -} - -.change-list .hiddenfields { display:none; } - -.change-list .filtered table { - border-right: none; -} - -.change-list .filtered { - min-height: 400px; -} - -.change-list .filtered .results, .change-list .filtered .paginator, -.filtered #toolbar, .filtered div.xfull { - width: auto; -} - -.change-list .filtered table tbody th { - padding-right: 1em; -} - -#changelist-form .results { - overflow-x: auto; - width: 100%; -} - -#changelist .toplinks { - border-bottom: 1px solid var(--hairline-color); -} - -#changelist .paginator { - color: var(--body-quiet-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--body-bg); - overflow: hidden; -} - -/* CHANGELIST TABLES */ - -#changelist table thead th { - padding: 0; - white-space: nowrap; - vertical-align: middle; -} - -#changelist table thead th.action-checkbox-column { - width: 1.5em; - text-align: center; -} - -#changelist table tbody td.action-checkbox { - text-align: center; -} - -#changelist table tfoot { - color: var(--body-quiet-color); -} - -/* TOOLBAR */ - -#toolbar { - padding: 8px 10px; - margin-bottom: 15px; - border-top: 1px solid var(--hairline-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--darkened-bg); - color: var(--body-quiet-color); -} - -#toolbar form input { - border-radius: 4px; - font-size: 0.875rem; - padding: 5px; - color: var(--body-fg); -} - -#toolbar #searchbar { - height: 1.1875rem; - border: 1px solid var(--border-color); - padding: 2px 5px; - margin: 0; - vertical-align: top; - font-size: 0.8125rem; - max-width: 100%; -} - -#toolbar #searchbar:focus { - border-color: var(--body-quiet-color); -} - -#toolbar form input[type="submit"] { - border: 1px solid var(--border-color); - font-size: 0.8125rem; - padding: 4px 8px; - margin: 0; - vertical-align: middle; - background: var(--body-bg); - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - color: var(--body-fg); -} - -#toolbar form input[type="submit"]:focus, -#toolbar form input[type="submit"]:hover { - border-color: var(--body-quiet-color); -} - -#changelist-search img { - vertical-align: middle; - margin-right: 4px; -} - -#changelist-search .help { - word-break: break-word; -} - -/* FILTER COLUMN */ - -#changelist-filter { - flex: 0 0 240px; - order: 1; - background: var(--darkened-bg); - border-left: none; - margin: 0 0 0 30px; -} - -@media (forced-colors: active) { - #changelist-filter { - border: 1px solid; - } -} - -#changelist-filter h2 { - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: 0.5px; - padding: 5px 15px; - margin-bottom: 12px; - border-bottom: none; -} - -#changelist-filter h3, -#changelist-filter details summary { - font-weight: 400; - padding: 0 15px; - margin-bottom: 10px; -} - -#changelist-filter details summary > * { - display: inline; -} - -#changelist-filter details > summary { - list-style-type: none; -} - -#changelist-filter details > summary::-webkit-details-marker { - display: none; -} - -#changelist-filter details > summary::before { - content: '→'; - font-weight: bold; - color: var(--link-hover-color); -} - -#changelist-filter details[open] > summary::before { - content: '↓'; -} - -#changelist-filter ul { - margin: 5px 0; - padding: 0 15px 15px; - border-bottom: 1px solid var(--hairline-color); -} - -#changelist-filter ul:last-child { - border-bottom: none; -} - -#changelist-filter li { - list-style-type: none; - margin-left: 0; - padding-left: 0; -} - -#changelist-filter a { - display: block; - color: var(--body-quiet-color); - word-break: break-word; -} - -#changelist-filter li.selected { - border-left: 5px solid var(--hairline-color); - padding-left: 10px; - margin-left: -15px; -} - -#changelist-filter li.selected a { - color: var(--link-selected-fg); -} - -#changelist-filter a:focus, #changelist-filter a:hover, -#changelist-filter li.selected a:focus, -#changelist-filter li.selected a:hover { - color: var(--link-hover-color); -} - -#changelist-filter #changelist-filter-extra-actions { - font-size: 0.8125rem; - margin-bottom: 10px; - border-bottom: 1px solid var(--hairline-color); -} - -/* DATE DRILLDOWN */ - -.change-list .toplinks { - display: flex; - padding-bottom: 5px; - flex-wrap: wrap; - gap: 3px 17px; - font-weight: bold; -} - -.change-list .toplinks a { - font-size: 0.8125rem; -} - -.change-list .toplinks .date-back { - color: var(--body-quiet-color); -} - -.change-list .toplinks .date-back:focus, -.change-list .toplinks .date-back:hover { - color: var(--link-hover-color); -} - -/* ACTIONS */ - -.filtered .actions { - border-right: none; -} - -#changelist table input { - margin: 0; - vertical-align: baseline; -} - -/* Once the :has() pseudo-class is supported by all browsers, the tr.selected - selector and the JS adding the class can be removed. */ -#changelist tbody tr.selected { - background-color: var(--selected-row); -} - -#changelist tbody tr:has(.action-select:checked) { - background-color: var(--selected-row); -} - -@media (forced-colors: active) { - #changelist tbody tr.selected { - background-color: SelectedItem; - } - #changelist tbody tr:has(.action-select:checked) { - background-color: SelectedItem; - } -} - -#changelist .actions { - padding: 10px; - background: var(--body-bg); - border-top: none; - border-bottom: none; - line-height: 1.5rem; - color: var(--body-quiet-color); - width: 100%; -} - -#changelist .actions span.all, -#changelist .actions span.action-counter, -#changelist .actions span.clear, -#changelist .actions span.question { - font-size: 0.8125rem; - margin: 0 0.5em; -} - -#changelist .actions:last-child { - border-bottom: none; -} - -#changelist .actions select { - vertical-align: top; - height: 1.5rem; - color: var(--body-fg); - border: 1px solid var(--border-color); - border-radius: 4px; - font-size: 0.875rem; - padding: 0 0 0 4px; - margin: 0; - margin-left: 10px; -} - -#changelist .actions select:focus { - border-color: var(--body-quiet-color); -} - -#changelist .actions label { - display: inline-block; - vertical-align: middle; - font-size: 0.8125rem; -} - -#changelist .actions .button { - font-size: 0.8125rem; - border: 1px solid var(--border-color); - border-radius: 4px; - background: var(--body-bg); - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - height: 1.5rem; - line-height: 1; - padding: 4px 8px; - margin: 0; - color: var(--body-fg); -} - -#changelist .actions .button:focus, #changelist .actions .button:hover { - border-color: var(--body-quiet-color); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/dark_mode.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/dark_mode.css deleted file mode 100644 index 65b58d0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/dark_mode.css +++ /dev/null @@ -1,130 +0,0 @@ -@media (prefers-color-scheme: dark) { - :root { - --primary: #264b5d; - --primary-fg: #f7f7f7; - - --body-fg: #eeeeee; - --body-bg: #121212; - --body-quiet-color: #d0d0d0; - --body-medium-color: #e0e0e0; - --body-loud-color: #ffffff; - - --breadcrumbs-link-fg: #e0e0e0; - --breadcrumbs-bg: var(--primary); - - --link-fg: #81d4fa; - --link-hover-color: #4ac1f7; - --link-selected-fg: #6f94c6; - - --hairline-color: #272727; - --border-color: #353535; - - --error-fg: #e35f5f; - --message-success-bg: #006b1b; - --message-warning-bg: #583305; - --message-error-bg: #570808; - - --darkened-bg: #212121; - --selected-bg: #1b1b1b; - --selected-row: #00363a; - - --close-button-bg: #333333; - --close-button-hover-bg: #666666; - - color-scheme: dark; - } - } - - -html[data-theme="dark"] { - --primary: #264b5d; - --primary-fg: #f7f7f7; - - --body-fg: #eeeeee; - --body-bg: #121212; - --body-quiet-color: #d0d0d0; - --body-medium-color: #e0e0e0; - --body-loud-color: #ffffff; - - --breadcrumbs-link-fg: #e0e0e0; - --breadcrumbs-bg: var(--primary); - - --link-fg: #81d4fa; - --link-hover-color: #4ac1f7; - --link-selected-fg: #6f94c6; - - --hairline-color: #272727; - --border-color: #353535; - - --error-fg: #e35f5f; - --message-success-bg: #006b1b; - --message-warning-bg: #583305; - --message-error-bg: #570808; - - --darkened-bg: #212121; - --selected-bg: #1b1b1b; - --selected-row: #00363a; - - --close-button-bg: #333333; - --close-button-hover-bg: #666666; - - color-scheme: dark; -} - -/* THEME SWITCH */ -.theme-toggle { - cursor: pointer; - border: none; - padding: 0; - background: transparent; - vertical-align: middle; - margin-inline-start: 5px; - margin-top: -1px; -} - -.theme-toggle svg { - vertical-align: middle; - height: 1.5rem; - width: 1.5rem; - display: none; -} - -/* -Fully hide screen reader text so we only show the one matching the current -theme. -*/ -.theme-toggle .visually-hidden { - display: none; -} - -html[data-theme="auto"] .theme-toggle .theme-label-when-auto { - display: block; -} - -html[data-theme="dark"] .theme-toggle .theme-label-when-dark { - display: block; -} - -html[data-theme="light"] .theme-toggle .theme-label-when-light { - display: block; -} - -/* ICONS */ -.theme-toggle svg.theme-icon-when-auto, -.theme-toggle svg.theme-icon-when-dark, -.theme-toggle svg.theme-icon-when-light { - fill: var(--header-link-color); - color: var(--header-bg); -} - -html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto { - display: block; -} - -html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark { - display: block; -} - -html[data-theme="light"] .theme-toggle svg.theme-icon-when-light { - display: block; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/dashboard.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/dashboard.css deleted file mode 100644 index 242b81a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/dashboard.css +++ /dev/null @@ -1,29 +0,0 @@ -/* DASHBOARD */ -.dashboard td, .dashboard th { - word-break: break-word; -} - -.dashboard .module table th { - width: 100%; -} - -.dashboard .module table td { - white-space: nowrap; -} - -.dashboard .module table td a { - display: block; - padding-right: .6em; -} - -/* RECENT ACTIONS MODULE */ - -.module ul.actionlist { - margin-left: 0; -} - -ul.actionlist li { - list-style-type: none; - overflow: hidden; - text-overflow: ellipsis; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/forms.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/forms.css deleted file mode 100644 index c6ce788..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/forms.css +++ /dev/null @@ -1,498 +0,0 @@ -@import url('widgets.css'); - -/* FORM ROWS */ - -.form-row { - overflow: hidden; - padding: 10px; - font-size: 0.8125rem; - border-bottom: 1px solid var(--hairline-color); -} - -.form-row img, .form-row input { - vertical-align: middle; -} - -.form-row label input[type="checkbox"] { - margin-top: 0; - vertical-align: 0; -} - -form .form-row p { - padding-left: 0; -} - -.flex-container { - display: flex; -} - -.form-multiline { - flex-wrap: wrap; -} - -.form-multiline > div { - padding-bottom: 10px; -} - -/* FORM LABELS */ - -label { - font-weight: normal; - color: var(--body-quiet-color); - font-size: 0.8125rem; -} - -.required label, label.required { - font-weight: bold; -} - -/* RADIO BUTTONS */ - -form div.radiolist div { - padding-right: 7px; -} - -form div.radiolist.inline div { - display: inline-block; -} - -form div.radiolist label { - width: auto; -} - -form div.radiolist input[type="radio"] { - margin: -2px 4px 0 0; - padding: 0; -} - -form ul.inline { - margin-left: 0; - padding: 0; -} - -form ul.inline li { - float: left; - padding-right: 7px; -} - -/* FIELDSETS */ - -fieldset .fieldset-heading, -fieldset .inline-heading, -:not(.inline-related) .collapse summary { - border: 1px solid var(--header-bg); - margin: 0; - padding: 8px; - font-weight: 400; - font-size: 0.8125rem; - background: var(--header-bg); - color: var(--header-link-color); -} - -/* ALIGNED FIELDSETS */ - -.aligned label { - display: block; - padding: 4px 10px 0 0; - min-width: 160px; - width: 160px; - word-wrap: break-word; -} - -.aligned label:not(.vCheckboxLabel):after { - content: ''; - display: inline-block; - vertical-align: middle; -} - -.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly { - padding: 6px 0; - margin-top: 0; - margin-bottom: 0; - margin-left: 0; - overflow-wrap: break-word; -} - -.aligned ul label { - display: inline; - float: none; - width: auto; -} - -.aligned .form-row input { - margin-bottom: 0; -} - -.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { - width: 350px; -} - -form .aligned ul { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned div.radiolist { - display: inline-block; - margin: 0; - padding: 0; -} - -form .aligned p.help, -form .aligned div.help { - margin-top: 0; - margin-left: 160px; - padding-left: 10px; -} - -form .aligned p.date div.help.timezonewarning, -form .aligned p.datetime div.help.timezonewarning, -form .aligned p.time div.help.timezonewarning { - margin-left: 0; - padding-left: 0; - font-weight: normal; -} - -form .aligned p.help:last-child, -form .aligned div.help:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -form .aligned input + p.help, -form .aligned textarea + p.help, -form .aligned select + p.help, -form .aligned input + div.help, -form .aligned textarea + div.help, -form .aligned select + div.help { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned select option:checked { - background-color: var(--selected-row); -} - -form .aligned ul li { - list-style: none; -} - -form .aligned table p { - margin-left: 0; - padding-left: 0; -} - -.aligned .vCheckboxLabel { - padding: 1px 0 0 5px; -} - -.aligned .vCheckboxLabel + p.help, -.aligned .vCheckboxLabel + div.help { - margin-top: -4px; -} - -.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { - width: 610px; -} - -fieldset .fieldBox { - margin-right: 20px; -} - -/* WIDE FIELDSETS */ - -.wide label { - width: 200px; -} - -form .wide p.help, -form .wide ul.errorlist, -form .wide div.help { - padding-left: 50px; -} - -form div.help ul { - padding-left: 0; - margin-left: 0; -} - -.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { - width: 450px; -} - -/* COLLAPSIBLE FIELDSETS */ - -.collapse summary .fieldset-heading, -.collapse summary .inline-heading { - background: transparent; - border: none; - color: currentColor; - display: inline; - margin: 0; - padding: 0; -} - -/* MONOSPACE TEXTAREAS */ - -fieldset.monospace textarea { - font-family: var(--font-family-monospace); -} - -/* SUBMIT ROW */ - -.submit-row { - padding: 12px 14px 12px; - margin: 0 0 20px; - background: var(--darkened-bg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - overflow: hidden; - display: flex; - gap: 10px; - flex-wrap: wrap; -} - -body.popup .submit-row { - overflow: auto; -} - -.submit-row input { - height: 2.1875rem; - line-height: 0.9375rem; -} - -.submit-row input, .submit-row a { - margin: 0; -} - -.submit-row input.default { - text-transform: uppercase; -} - -.submit-row a.deletelink { - margin-left: auto; -} - -.submit-row a.deletelink { - display: block; - background: var(--delete-button-bg); - border-radius: 4px; - padding: 0.625rem 0.9375rem; - height: 0.9375rem; - line-height: 0.9375rem; - color: var(--button-fg); -} - -.submit-row a.closelink { - display: inline-block; - background: var(--close-button-bg); - border-radius: 4px; - padding: 10px 15px; - height: 0.9375rem; - line-height: 0.9375rem; - color: var(--button-fg); -} - -.submit-row a.deletelink:focus, -.submit-row a.deletelink:hover, -.submit-row a.deletelink:active { - background: var(--delete-button-hover-bg); - text-decoration: none; -} - -.submit-row a.closelink:focus, -.submit-row a.closelink:hover, -.submit-row a.closelink:active { - background: var(--close-button-hover-bg); - text-decoration: none; -} - -/* CUSTOM FORM FIELDS */ - -.vSelectMultipleField { - vertical-align: top; -} - -.vCheckboxField { - border: none; -} - -.vDateField, .vTimeField { - margin-right: 2px; - margin-bottom: 4px; -} - -.vDateField { - min-width: 6.85em; -} - -.vTimeField { - min-width: 4.7em; -} - -.vURLField { - width: 30em; -} - -.vLargeTextField, .vXMLLargeTextField { - width: 48em; -} - -.flatpages-flatpage #id_content { - height: 40.2em; -} - -.module table .vPositiveSmallIntegerField { - width: 2.2em; -} - -.vIntegerField { - width: 5em; -} - -.vBigIntegerField { - width: 10em; -} - -.vForeignKeyRawIdAdminField { - width: 5em; -} - -.vTextField, .vUUIDField { - width: 20em; -} - -/* INLINES */ - -.inline-group { - padding: 0; - margin: 0 0 30px; -} - -.inline-group thead th { - padding: 8px 10px; -} - -.inline-group .aligned label { - width: 160px; -} - -.inline-related { - position: relative; -} - -.inline-related h4, -.inline-related:not(.tabular) .collapse summary { - margin: 0; - color: var(--body-medium-color); - padding: 5px; - font-size: 0.8125rem; - background: var(--darkened-bg); - border: 1px solid var(--hairline-color); - border-left-color: var(--darkened-bg); - border-right-color: var(--darkened-bg); -} - -.inline-related h3 span.delete { - float: right; -} - -.inline-related h3 span.delete label { - margin-left: 2px; - font-size: 0.6875rem; -} - -.inline-related fieldset { - margin: 0; - background: var(--body-bg); - border: none; - width: 100%; -} - -.inline-group .tabular fieldset.module { - border: none; -} - -.inline-related.tabular fieldset.module table { - width: 100%; - overflow-x: scroll; -} - -.last-related fieldset { - border: none; -} - -.inline-group .tabular tr.has_original td { - padding-top: 2em; -} - -.inline-group .tabular tr td.original { - padding: 2px 0 0 0; - width: 0; - _position: relative; -} - -.inline-group .tabular th.original { - width: 0px; - padding: 0; -} - -.inline-group .tabular td.original p { - position: absolute; - left: 0; - height: 1.1em; - padding: 2px 9px; - overflow: hidden; - font-size: 0.5625rem; - font-weight: bold; - color: var(--body-quiet-color); - _width: 700px; -} - -.inline-group div.add-row, -.inline-group .tabular tr.add-row td { - color: var(--body-quiet-color); - background: var(--darkened-bg); - padding: 8px 10px; - border-bottom: 1px solid var(--hairline-color); -} - -.inline-group .tabular tr.add-row td { - padding: 8px 10px; - border-bottom: 1px solid var(--hairline-color); -} - -.inline-group div.add-row a, -.inline-group .tabular tr.add-row td a { - font-size: 0.75rem; -} - -.empty-form { - display: none; -} - -/* RELATED FIELD ADD ONE / LOOKUP */ - -.related-lookup { - margin-left: 5px; - display: inline-block; - vertical-align: middle; - background-repeat: no-repeat; - background-size: 14px; -} - -.related-lookup { - width: 1rem; - height: 1rem; - background-image: url(../img/search.svg); -} - -form .related-widget-wrapper ul { - display: inline-block; - margin-left: 0; - padding-left: 0; -} - -.clearable-file-input input { - margin-top: 0; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/login.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/login.css deleted file mode 100644 index 805a34b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/login.css +++ /dev/null @@ -1,61 +0,0 @@ -/* LOGIN FORM */ - -.login { - background: var(--darkened-bg); - height: auto; -} - -.login #header { - height: auto; - padding: 15px 16px; - justify-content: center; -} - -.login #header h1 { - font-size: 1.125rem; - margin: 0; -} - -.login #header h1 a { - color: var(--header-link-color); -} - -.login #content { - padding: 20px; -} - -.login #container { - background: var(--body-bg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - overflow: hidden; - width: 28em; - min-width: 300px; - margin: 100px auto; - height: auto; -} - -.login .form-row { - padding: 4px 0; -} - -.login .form-row label { - display: block; - line-height: 2em; -} - -.login .form-row #id_username, .login .form-row #id_password { - padding: 8px; - width: 100%; - box-sizing: border-box; -} - -.login .submit-row { - padding: 1em 0 0 0; - margin: 0; - text-align: center; -} - -.login .password-reset-link { - text-align: center; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/nav_sidebar.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/nav_sidebar.css deleted file mode 100644 index 7eb0de9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/nav_sidebar.css +++ /dev/null @@ -1,150 +0,0 @@ -.sticky { - position: sticky; - top: 0; - max-height: 100vh; -} - -.toggle-nav-sidebar { - z-index: 20; - left: 0; - display: flex; - align-items: center; - justify-content: center; - flex: 0 0 23px; - width: 23px; - border: 0; - border-right: 1px solid var(--hairline-color); - background-color: var(--body-bg); - cursor: pointer; - font-size: 1.25rem; - color: var(--link-fg); - padding: 0; -} - -[dir="rtl"] .toggle-nav-sidebar { - border-left: 1px solid var(--hairline-color); - border-right: 0; -} - -.toggle-nav-sidebar:hover, -.toggle-nav-sidebar:focus { - background-color: var(--darkened-bg); -} - -#nav-sidebar { - z-index: 15; - flex: 0 0 275px; - left: -276px; - margin-left: -276px; - border-top: 1px solid transparent; - border-right: 1px solid var(--hairline-color); - background-color: var(--body-bg); - overflow: auto; -} - -[dir="rtl"] #nav-sidebar { - border-left: 1px solid var(--hairline-color); - border-right: 0; - left: 0; - margin-left: 0; - right: -276px; - margin-right: -276px; -} - -.toggle-nav-sidebar::before { - content: '\00BB'; -} - -.main.shifted .toggle-nav-sidebar::before { - content: '\00AB'; -} - -.main > #nav-sidebar { - visibility: hidden; -} - -.main.shifted > #nav-sidebar { - margin-left: 0; - visibility: visible; -} - -[dir="rtl"] .main.shifted > #nav-sidebar { - margin-right: 0; -} - -#nav-sidebar .module th { - width: 100%; - overflow-wrap: anywhere; -} - -#nav-sidebar .module th, -#nav-sidebar .module caption { - padding-left: 16px; -} - -#nav-sidebar .module td { - white-space: nowrap; -} - -[dir="rtl"] #nav-sidebar .module th, -[dir="rtl"] #nav-sidebar .module caption { - padding-left: 8px; - padding-right: 16px; -} - -#nav-sidebar .current-app .section:link, -#nav-sidebar .current-app .section:visited { - color: var(--header-color); - font-weight: bold; -} - -#nav-sidebar .current-model { - background: var(--selected-row); -} - -@media (forced-colors: active) { - #nav-sidebar .current-model { - background-color: SelectedItem; - } -} - -.main > #nav-sidebar + .content { - max-width: calc(100% - 23px); -} - -.main.shifted > #nav-sidebar + .content { - max-width: calc(100% - 299px); -} - -@media (max-width: 767px) { - #nav-sidebar, #toggle-nav-sidebar { - display: none; - } - - .main > #nav-sidebar + .content, - .main.shifted > #nav-sidebar + .content { - max-width: 100%; - } -} - -#nav-filter { - width: 100%; - box-sizing: border-box; - padding: 2px 5px; - margin: 5px 0; - border: 1px solid var(--border-color); - background-color: var(--darkened-bg); - color: var(--body-fg); -} - -#nav-filter:focus { - border-color: var(--body-quiet-color); -} - -#nav-filter.no-results { - background: var(--message-error-bg); -} - -#nav-sidebar table { - width: 100%; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/responsive.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/responsive.css deleted file mode 100644 index 0ca125d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/responsive.css +++ /dev/null @@ -1,908 +0,0 @@ -/* Tablets */ - -input[type="submit"], button { - -webkit-appearance: none; - appearance: none; -} - -@media (max-width: 1024px) { - /* Basic */ - - html { - -webkit-text-size-adjust: 100%; - } - - td, th { - padding: 10px; - font-size: 0.875rem; - } - - .small { - font-size: 0.75rem; - } - - /* Layout */ - - #container { - min-width: 0; - } - - #content { - padding: 15px 20px 20px; - } - - div.breadcrumbs { - padding: 10px 30px; - } - - /* Header */ - - #header { - flex-direction: column; - padding: 15px 30px; - justify-content: flex-start; - } - - #site-name { - margin: 0 0 8px; - line-height: 1.2; - } - - #user-tools { - margin: 0; - font-weight: 400; - line-height: 1.85; - text-align: left; - } - - #user-tools a { - display: inline-block; - line-height: 1.4; - } - - /* Dashboard */ - - .dashboard #content { - width: auto; - } - - #content-related { - margin-right: -290px; - } - - .colSM #content-related { - margin-left: -290px; - } - - .colMS { - margin-right: 290px; - } - - .colSM { - margin-left: 290px; - } - - .dashboard .module table td a { - padding-right: 0; - } - - td .changelink, td .addlink { - font-size: 0.8125rem; - } - - /* Changelist */ - - #toolbar { - border: none; - padding: 15px; - } - - #changelist-search > div { - display: flex; - flex-wrap: nowrap; - max-width: 480px; - } - - #changelist-search label { - line-height: 1.375rem; - } - - #toolbar form #searchbar { - flex: 1 0 auto; - width: 0; - height: 1.375rem; - margin: 0 10px 0 6px; - } - - #toolbar form input[type=submit] { - flex: 0 1 auto; - } - - #changelist-search .quiet { - width: 0; - flex: 1 0 auto; - margin: 5px 0 0 25px; - } - - #changelist .actions { - display: flex; - flex-wrap: wrap; - padding: 15px 0; - } - - #changelist .actions label { - display: flex; - } - - #changelist .actions select { - background: var(--body-bg); - } - - #changelist .actions .button { - min-width: 48px; - margin: 0 10px; - } - - #changelist .actions span.all, - #changelist .actions span.clear, - #changelist .actions span.question, - #changelist .actions span.action-counter { - font-size: 0.6875rem; - margin: 0 10px 0 0; - } - - #changelist-filter { - flex-basis: 200px; - } - - .change-list .filtered .results, - .change-list .filtered .paginator, - .filtered #toolbar, - .filtered .actions, - - #changelist .paginator { - border-top-color: var(--hairline-color); /* XXX Is this used at all? */ - } - - #changelist .results + .paginator { - border-top: none; - } - - /* Forms */ - - label { - font-size: 1rem; - } - - /* - Minifiers remove the default (text) "type" attribute from "input" HTML - tags. Add input:not([type]) to make the CSS stylesheet work the same. - */ - .form-row input:not([type]), - .form-row input[type=text], - .form-row input[type=password], - .form-row input[type=email], - .form-row input[type=url], - .form-row input[type=tel], - .form-row input[type=number], - .form-row textarea, - .form-row select, - .form-row .vTextField { - box-sizing: border-box; - margin: 0; - padding: 6px 8px; - min-height: 2.25rem; - font-size: 1rem; - } - - .form-row select { - height: 2.25rem; - } - - .form-row select[multiple] { - height: auto; - min-height: 0; - } - - fieldset .fieldBox + .fieldBox { - margin-top: 10px; - padding-top: 10px; - border-top: 1px solid var(--hairline-color); - } - - textarea { - max-width: 100%; - max-height: 120px; - } - - .aligned label { - padding-top: 6px; - } - - .aligned .related-lookup, - .aligned .datetimeshortcuts, - .aligned .related-lookup + strong { - align-self: center; - margin-left: 15px; - } - - form .aligned div.radiolist { - margin-left: 2px; - } - - .submit-row { - padding: 8px; - } - - .submit-row a.deletelink { - padding: 10px 7px; - } - - .button, input[type=submit], input[type=button], .submit-row input, a.button { - padding: 7px; - } - - /* Selector */ - - .selector { - display: flex; - width: 100%; - } - - .selector .selector-filter { - display: flex; - align-items: center; - } - - .selector .selector-filter input { - width: 100%; - min-height: 0; - flex: 1 1; - } - - .selector-available, .selector-chosen { - width: auto; - flex: 1 1; - display: flex; - flex-direction: column; - } - - .selector select { - width: 100%; - flex: 1 0 auto; - margin-bottom: 5px; - } - - .selector-chooseall, .selector-clearall { - align-self: center; - } - - .stacked { - flex-direction: column; - max-width: 480px; - } - - .stacked > * { - flex: 0 1 auto; - } - - .stacked select { - margin-bottom: 0; - } - - .stacked .selector-available, .stacked .selector-chosen { - width: auto; - } - - .stacked ul.selector-chooser { - padding: 0 2px; - transform: none; - } - - .stacked .selector-chooser li { - padding: 3px; - } - - .help-tooltip, .selector .help-icon { - display: none; - } - - .datetime input { - width: 50%; - max-width: 120px; - } - - .datetime span { - font-size: 0.8125rem; - } - - .datetime .timezonewarning { - display: block; - font-size: 0.6875rem; - color: var(--body-quiet-color); - } - - .datetimeshortcuts { - color: var(--border-color); /* XXX Redundant, .datetime span also sets #ccc */ - } - - .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { - width: 75%; - } - - .inline-group { - overflow: auto; - } - - /* Messages */ - - ul.messagelist li { - padding-left: 55px; - background-position: 30px 12px; - } - - ul.messagelist li.error { - background-position: 30px 12px; - } - - ul.messagelist li.warning { - background-position: 30px 14px; - } - - /* Login */ - - .login #header { - padding: 15px 20px; - } - - .login #site-name { - margin: 0; - } - - /* GIS */ - - div.olMap { - max-width: calc(100vw - 30px); - max-height: 300px; - } - - .olMap + .clear_features { - display: block; - margin-top: 10px; - } - - /* Docs */ - - .module table.xfull { - width: 100%; - } - - pre.literal-block { - overflow: auto; - } -} - -/* Mobile */ - -@media (max-width: 767px) { - /* Layout */ - - #header, #content { - padding: 15px; - } - - div.breadcrumbs { - padding: 10px 15px; - } - - /* Dashboard */ - - .colMS, .colSM { - margin: 0; - } - - #content-related, .colSM #content-related { - width: 100%; - margin: 0; - } - - #content-related .module { - margin-bottom: 0; - } - - #content-related .module h2 { - padding: 10px 15px; - font-size: 1rem; - } - - /* Changelist */ - - #changelist { - align-items: stretch; - flex-direction: column; - } - - #toolbar { - padding: 10px; - } - - #changelist-filter { - margin-left: 0; - } - - #changelist .actions label { - flex: 1 1; - } - - #changelist .actions select { - flex: 1 0; - width: 100%; - } - - #changelist .actions span { - flex: 1 0 100%; - } - - #changelist-filter { - position: static; - width: auto; - margin-top: 30px; - } - - .object-tools { - float: none; - margin: 0 0 15px; - padding: 0; - overflow: hidden; - } - - .object-tools li { - height: auto; - margin-left: 0; - } - - .object-tools li + li { - margin-left: 15px; - } - - .object-tools:has(a.addlink) { - margin-top: 0px; - } - - /* Forms */ - - .form-row { - padding: 15px 0; - } - - .aligned .form-row, - .aligned .form-row > div { - max-width: 100vw; - } - - .aligned .form-row > div { - width: calc(100vw - 30px); - } - - .flex-container { - flex-flow: column; - } - - .flex-container.checkbox-row { - flex-flow: row; - } - - textarea { - max-width: none; - } - - .vURLField { - width: auto; - } - - fieldset .fieldBox + .fieldBox { - margin-top: 15px; - padding-top: 15px; - } - - .aligned label { - width: 100%; - min-width: auto; - padding: 0 0 10px; - } - - .aligned label:after { - max-height: 0; - } - - .aligned .form-row input, - .aligned .form-row select, - .aligned .form-row textarea { - flex: 1 1 auto; - max-width: 100%; - } - - .aligned .checkbox-row input { - flex: 0 1 auto; - margin: 0; - } - - .aligned .vCheckboxLabel { - flex: 1 0; - padding: 1px 0 0 5px; - } - - .aligned label + p, - .aligned label + div.help, - .aligned label + div.readonly { - padding: 0; - margin-left: 0; - } - - .aligned p.file-upload { - font-size: 0.8125rem; - } - - span.clearable-file-input { - margin-left: 15px; - } - - span.clearable-file-input label { - font-size: 0.8125rem; - padding-bottom: 0; - } - - .aligned .timezonewarning { - flex: 1 0 100%; - margin-top: 5px; - } - - form .aligned .form-row div.help { - width: 100%; - margin: 5px 0 0; - padding: 0; - } - - form .aligned ul, - form .aligned ul.errorlist { - margin-left: 0; - padding-left: 0; - } - - form .aligned div.radiolist { - margin-top: 5px; - margin-right: 15px; - margin-bottom: -3px; - } - - form .aligned div.radiolist:not(.inline) div + div { - margin-top: 5px; - } - - /* Related widget */ - - .related-widget-wrapper { - width: 100%; - display: flex; - align-items: flex-start; - } - - .related-widget-wrapper .selector { - order: 1; - flex: 1 0 auto; - } - - .related-widget-wrapper > a { - order: 2; - } - - .related-widget-wrapper .radiolist ~ a { - align-self: flex-end; - } - - .related-widget-wrapper > select ~ a { - align-self: center; - } - - /* Selector */ - - .selector { - flex-direction: column; - gap: 10px 0; - } - - .selector-available, .selector-chosen { - flex: 1 1 auto; - } - - .selector select { - max-height: 96px; - } - - .selector ul.selector-chooser { - display: flex; - width: 60px; - height: 30px; - padding: 0 2px; - transform: none; - } - - .selector ul.selector-chooser li { - float: left; - } - - .selector-remove { - background-position: 0 0; - } - - :enabled.selector-remove:focus, :enabled.selector-remove:hover { - background-position: 0 -24px; - } - - .selector-add { - background-position: 0 -48px; - } - - :enabled.selector-add:focus, :enabled.selector-add:hover { - background-position: 0 -72px; - } - - /* Inlines */ - - .inline-group[data-inline-type="stacked"] .inline-related { - border: 1px solid var(--hairline-color); - border-radius: 4px; - margin-top: 15px; - overflow: auto; - } - - .inline-group[data-inline-type="stacked"] .inline-related > * { - box-sizing: border-box; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module { - padding: 0 10px; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module .form-row { - border-top: 1px solid var(--hairline-color); - border-bottom: none; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:first-child { - border-top: none; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 { - padding: 10px; - border-top-width: 0; - border-bottom-width: 2px; - display: flex; - flex-wrap: wrap; - align-items: center; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label { - margin-right: auto; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 span.delete { - float: none; - flex: 1 1 100%; - margin-top: 5px; - } - - .inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) { - width: 100%; - } - - .inline-group[data-inline-type="stacked"] .aligned label { - width: 100%; - } - - .inline-group[data-inline-type="stacked"] div.add-row { - margin-top: 15px; - border: 1px solid var(--hairline-color); - border-radius: 4px; - } - - .inline-group div.add-row, - .inline-group .tabular tr.add-row td { - padding: 0; - } - - .inline-group div.add-row a, - .inline-group .tabular tr.add-row td a { - display: block; - padding: 8px 10px 8px 26px; - background-position: 8px 9px; - } - - /* Submit row */ - - .submit-row { - padding: 10px; - margin: 0 0 15px; - flex-direction: column; - gap: 8px; - } - - .submit-row input, .submit-row input.default, .submit-row a { - text-align: center; - } - - .submit-row a.closelink { - padding: 10px 0; - text-align: center; - } - - .submit-row a.deletelink { - margin: 0; - } - - /* Messages */ - - ul.messagelist li { - padding-left: 40px; - background-position: 15px 12px; - } - - ul.messagelist li.error { - background-position: 15px 12px; - } - - ul.messagelist li.warning { - background-position: 15px 14px; - } - - /* Paginator */ - - .paginator .this-page, .paginator a:link, .paginator a:visited { - padding: 4px 10px; - } - - /* Login */ - - body.login { - padding: 0 15px; - } - - .login #container { - width: auto; - max-width: 480px; - margin: 50px auto; - } - - .login #header, - .login #content { - padding: 15px; - } - - .login #content-main { - float: none; - } - - .login .form-row { - padding: 0; - } - - .login .form-row + .form-row { - margin-top: 15px; - } - - .login .form-row label { - margin: 0 0 5px; - line-height: 1.2; - } - - .login .submit-row { - padding: 15px 0 0; - } - - .login br { - display: none; - } - - .login .submit-row input { - margin: 0; - text-transform: uppercase; - } - - .errornote { - margin: 0 0 20px; - padding: 8px 12px; - font-size: 0.8125rem; - } - - /* Calendar and clock */ - - .calendarbox, .clockbox { - position: fixed !important; - top: 50% !important; - left: 50% !important; - transform: translate(-50%, -50%); - margin: 0; - border: none; - overflow: visible; - } - - .calendarbox:before, .clockbox:before { - content: ''; - position: fixed; - top: 50%; - left: 50%; - width: 100vw; - height: 100vh; - background: rgba(0, 0, 0, 0.75); - transform: translate(-50%, -50%); - } - - .calendarbox > *, .clockbox > * { - position: relative; - z-index: 1; - } - - .calendarbox > div:first-child { - z-index: 2; - } - - .calendarbox .calendar, .clockbox h2 { - border-radius: 4px 4px 0 0; - overflow: hidden; - } - - .calendarbox .calendar-cancel, .clockbox .calendar-cancel { - border-radius: 0 0 4px 4px; - overflow: hidden; - } - - .calendar-shortcuts { - padding: 10px 0; - font-size: 0.75rem; - line-height: 0.75rem; - } - - .calendar-shortcuts a { - margin: 0 4px; - } - - .timelist a { - background: var(--body-bg); - padding: 4px; - } - - .calendar-cancel { - padding: 8px 10px; - } - - .clockbox h2 { - padding: 8px 15px; - } - - .calendar caption { - padding: 10px; - } - - .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { - z-index: 1; - top: 10px; - } - - /* History */ - - table#change-history tbody th, table#change-history tbody td { - font-size: 0.8125rem; - word-break: break-word; - } - - table#change-history tbody th { - width: auto; - } - - /* Docs */ - - table.model tbody th, table.model tbody td { - font-size: 0.8125rem; - word-break: break-word; - } -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css deleted file mode 100644 index 5e8f5c5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css +++ /dev/null @@ -1,89 +0,0 @@ -/* TABLETS */ - -@media (max-width: 1024px) { - [dir="rtl"] .colMS { - margin-right: 0; - } - - [dir="rtl"] #user-tools { - text-align: right; - } - - [dir="rtl"] #changelist .actions label { - padding-left: 10px; - padding-right: 0; - } - - [dir="rtl"] #changelist .actions select { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .change-list .filtered .results, - [dir="rtl"] .change-list .filtered .paginator, - [dir="rtl"] .filtered #toolbar, - [dir="rtl"] .filtered div.xfull, - [dir="rtl"] .filtered .actions, - [dir="rtl"] #changelist-filter { - margin-left: 0; - } - - [dir="rtl"] .inline-group div.add-row a, - [dir="rtl"] .inline-group .tabular tr.add-row td a { - padding: 8px 26px 8px 10px; - background-position: calc(100% - 8px) 9px; - } - - [dir="rtl"] .object-tools li { - float: right; - } - - [dir="rtl"] .object-tools li + li { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .dashboard .module table td a { - padding-left: 0; - padding-right: 16px; - } -} - -/* MOBILE */ - -@media (max-width: 767px) { - [dir="rtl"] .aligned .related-lookup, - [dir="rtl"] .aligned .datetimeshortcuts { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .aligned ul, - [dir="rtl"] form .aligned ul.errorlist { - margin-right: 0; - } - - [dir="rtl"] #changelist-filter { - margin-left: 0; - margin-right: 0; - } - [dir="rtl"] .aligned .vCheckboxLabel { - padding: 1px 5px 0 0; - } - - [dir="rtl"] .selector-remove { - background-position: 0 0; - } - - [dir="rtl"] :enabled.selector-remove:focus, :enabled.selector-remove:hover { - background-position: 0 -24px; - } - - [dir="rtl"] .selector-add { - background-position: 0 -48px; - } - - [dir="rtl"] :enabled.selector-add:focus, :enabled.selector-add:hover { - background-position: 0 -72px; - } -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/rtl.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/rtl.css deleted file mode 100644 index a2556d0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/rtl.css +++ /dev/null @@ -1,293 +0,0 @@ -/* GLOBAL */ - -th { - text-align: right; -} - -.module h2, .module caption { - text-align: right; -} - -.module ul, .module ol { - margin-left: 0; - margin-right: 1.5em; -} - -.viewlink, .addlink, .changelink, .hidelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.deletelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.object-tools { - float: left; -} - -thead th:first-child, -tfoot td:first-child { - border-left: none; -} - -/* LAYOUT */ - -#user-tools { - right: auto; - left: 0; - text-align: left; -} - -div.breadcrumbs { - text-align: right; -} - -#content-main { - float: right; -} - -#content-related { - float: left; - margin-left: -300px; - margin-right: auto; -} - -.colMS { - margin-left: 300px; - margin-right: 0; -} - -/* SORTABLE TABLES */ - -table thead th.sorted .sortoptions { - float: left; -} - -thead th.sorted .text { - padding-right: 0; - padding-left: 42px; -} - -/* dashboard styles */ - -.dashboard .module table td a { - padding-left: .6em; - padding-right: 16px; -} - -/* changelists styles */ - -.change-list .filtered table { - border-left: none; - border-right: 0px none; -} - -#changelist-filter { - border-left: none; - border-right: none; - margin-left: 0; - margin-right: 30px; -} - -#changelist-filter li.selected { - border-left: none; - padding-left: 10px; - margin-left: 0; - border-right: 5px solid var(--hairline-color); - padding-right: 10px; - margin-right: -15px; -} - -#changelist table tbody td:first-child, #changelist table tbody th:first-child { - border-right: none; - border-left: none; -} - -.paginator .end { - margin-left: 6px; - margin-right: 0; -} - -.paginator input { - margin-left: 0; - margin-right: auto; -} - -/* FORMS */ - -.aligned label { - padding: 0 0 3px 1em; -} - -.submit-row a.deletelink { - margin-left: 0; - margin-right: auto; -} - -.vDateField, .vTimeField { - margin-left: 2px; -} - -.aligned .form-row input { - margin-left: 5px; -} - -form .aligned ul { - margin-right: 163px; - padding-right: 10px; - margin-left: 0; - padding-left: 0; -} - -form ul.inline li { - float: right; - padding-right: 0; - padding-left: 7px; -} - -form .aligned p.help, -form .aligned div.help { - margin-left: 0; - margin-right: 160px; - padding-right: 10px; -} - -form div.help ul, -form .aligned .checkbox-row + .help, -form .aligned p.date div.help.timezonewarning, -form .aligned p.datetime div.help.timezonewarning, -form .aligned p.time div.help.timezonewarning { - margin-right: 0; - padding-right: 0; -} - -form .wide p.help, -form .wide ul.errorlist, -form .wide div.help { - padding-left: 0; - padding-right: 50px; -} - -.submit-row { - text-align: right; -} - -fieldset .fieldBox { - margin-left: 20px; - margin-right: 0; -} - -.errorlist li { - background-position: 100% 12px; - padding: 0; -} - -.errornote { - background-position: 100% 12px; - padding: 10px 12px; -} - -/* WIDGETS */ - -.calendarnav-previous { - top: 0; - left: auto; - right: 10px; - background: url(../img/calendar-icons.svg) 0 -15px no-repeat; -} - -.calendarnav-next { - top: 0; - right: auto; - left: 10px; - background: url(../img/calendar-icons.svg) 0 0 no-repeat; -} - -.calendar caption, .calendarbox h2 { - text-align: center; -} - -.selector { - float: right; -} - -.selector .selector-filter { - text-align: right; -} - -.selector-add { - background: url(../img/selector-icons.svg) 0 -96px no-repeat; - background-size: 24px auto; -} - -:enabled.selector-add:focus, :enabled.selector-add:hover { - background-position: 0 -120px; -} - -.selector-remove { - background: url(../img/selector-icons.svg) 0 -144px no-repeat; - background-size: 24px auto; -} - -:enabled.selector-remove:focus, :enabled.selector-remove:hover { - background-position: 0 -168px; -} - -.selector-chooseall { - background: url(../img/selector-icons.svg) right -128px no-repeat; -} - -:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { - background-position: 100% -144px; -} - -.selector-clearall { - background: url(../img/selector-icons.svg) 0 -160px no-repeat; -} - -:enabled.selector-clearall:focus, :enabled.selector-clearall:hover { - background-position: 0 -176px; -} - -.inline-deletelink { - float: left; -} - -form .form-row p.datetime { - overflow: hidden; -} - -.related-widget-wrapper { - float: right; -} - -/* MISC */ - -.inline-related h2, .inline-group h2 { - text-align: right -} - -.inline-related h3 span.delete { - padding-right: 20px; - padding-left: inherit; - left: 10px; - right: inherit; - float:left; -} - -.inline-related h3 span.delete label { - margin-left: inherit; - margin-right: 2px; -} - -.inline-group .tabular td.original p { - right: 0; -} - -.selector .selector-chooser { - margin: 0; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/unusable_password_field.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/unusable_password_field.css deleted file mode 100644 index d46eb03..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/unusable_password_field.css +++ /dev/null @@ -1,19 +0,0 @@ -/* Hide warnings fields if usable password is selected */ -form:has(#id_usable_password input[value="true"]:checked) .messagelist { - display: none; -} - -/* Hide password fields if unusable password is selected */ -form:has(#id_usable_password input[value="false"]:checked) .field-password1, -form:has(#id_usable_password input[value="false"]:checked) .field-password2 { - display: none; -} - -/* Select appropriate submit button */ -form:has(#id_usable_password input[value="true"]:checked) input[type="submit"].unset-password { - display: none; -} - -form:has(#id_usable_password input[value="false"]:checked) input[type="submit"].set-password { - display: none; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md deleted file mode 100644 index 8cb8a2b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css deleted file mode 100644 index 750b320..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css +++ /dev/null @@ -1,481 +0,0 @@ -.select2-container { - box-sizing: border-box; - display: inline-block; - margin: 0; - position: relative; - vertical-align: middle; } - .select2-container .select2-selection--single { - box-sizing: border-box; - cursor: pointer; - display: block; - height: 28px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--single .select2-selection__rendered { - display: block; - padding-left: 8px; - padding-right: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-selection--single .select2-selection__clear { - position: relative; } - .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { - padding-right: 8px; - padding-left: 20px; } - .select2-container .select2-selection--multiple { - box-sizing: border-box; - cursor: pointer; - display: block; - min-height: 32px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--multiple .select2-selection__rendered { - display: inline-block; - overflow: hidden; - padding-left: 8px; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-search--inline { - float: left; } - .select2-container .select2-search--inline .select2-search__field { - box-sizing: border-box; - border: none; - font-size: 100%; - margin-top: 5px; - padding: 0; } - .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - -.select2-dropdown { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - box-sizing: border-box; - display: block; - position: absolute; - left: -100000px; - width: 100%; - z-index: 1051; } - -.select2-results { - display: block; } - -.select2-results__options { - list-style: none; - margin: 0; - padding: 0; } - -.select2-results__option { - padding: 6px; - user-select: none; - -webkit-user-select: none; } - .select2-results__option[aria-selected] { - cursor: pointer; } - -.select2-container--open .select2-dropdown { - left: 0; } - -.select2-container--open .select2-dropdown--above { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--open .select2-dropdown--below { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-search--dropdown { - display: block; - padding: 4px; } - .select2-search--dropdown .select2-search__field { - padding: 4px; - width: 100%; - box-sizing: border-box; } - .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - .select2-search--dropdown.select2-search--hide { - display: none; } - -.select2-close-mask { - border: 0; - margin: 0; - padding: 0; - display: block; - position: fixed; - left: 0; - top: 0; - min-height: 100%; - min-width: 100%; - height: auto; - width: auto; - opacity: 0; - z-index: 99; - background-color: #fff; - filter: alpha(opacity=0); } - -.select2-hidden-accessible { - border: 0 !important; - clip: rect(0 0 0 0) !important; - -webkit-clip-path: inset(50%) !important; - clip-path: inset(50%) !important; - height: 1px !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - width: 1px !important; - white-space: nowrap !important; } - -.select2-container--default .select2-selection--single { - background-color: #fff; - border: 1px solid #aaa; - border-radius: 4px; } - .select2-container--default .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--default .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; } - .select2-container--default .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--default .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; } - .select2-container--default .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; } - -.select2-container--default.select2-container--disabled .select2-selection--single { - background-color: #eee; - cursor: default; } - .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; } - -.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--default .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 5px; - width: 100%; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered li { - list-style: none; } - .select2-container--default .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-top: 5px; - margin-right: 10px; - padding: 1px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - color: #999; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #333; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--default.select2-container--focus .select2-selection--multiple { - border: solid black 1px; - outline: 0; } - -.select2-container--default.select2-container--disabled .select2-selection--multiple { - background-color: #eee; - cursor: default; } - -.select2-container--default.select2-container--disabled .select2-selection__choice__remove { - display: none; } - -.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--default .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; } - -.select2-container--default .select2-search--inline .select2-search__field { - background: transparent; - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; } - -.select2-container--default .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--default .select2-results__option[role=group] { - padding: 0; } - -.select2-container--default .select2-results__option[aria-disabled=true] { - color: #999; } - -.select2-container--default .select2-results__option[aria-selected=true] { - background-color: #ddd; } - -.select2-container--default .select2-results__option .select2-results__option { - padding-left: 1em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; } - -.select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: #5897fb; - color: white; } - -.select2-container--default .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic .select2-selection--single { - background-color: #f7f7f7; - border: 1px solid #aaa; - border-radius: 4px; - outline: 0; - background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - .select2-container--classic .select2-selection--single:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--classic .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-right: 10px; } - .select2-container--classic .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--classic .select2-selection--single .select2-selection__arrow { - background-color: #ddd; - border: none; - border-left: 1px solid #aaa; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } - .select2-container--classic .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { - border: none; - border-right: 1px solid #aaa; - border-radius: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - left: 1px; - right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--single { - border: 1px solid #5897fb; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { - background: transparent; - border: none; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; - background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } - -.select2-container--classic .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; - outline: 0; } - .select2-container--classic .select2-selection--multiple:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--multiple .select2-selection__rendered { - list-style: none; - margin: 0; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__clear { - display: none; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { - color: #888; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #555; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - float: right; - margin-left: 5px; - margin-right: auto; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--multiple { - border: 1px solid #5897fb; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--classic .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; - outline: 0; } - -.select2-container--classic .select2-search--inline .select2-search__field { - outline: 0; - box-shadow: none; } - -.select2-container--classic .select2-dropdown { - background-color: white; - border: 1px solid transparent; } - -.select2-container--classic .select2-dropdown--above { - border-bottom: none; } - -.select2-container--classic .select2-dropdown--below { - border-top: none; } - -.select2-container--classic .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--classic .select2-results__option[role=group] { - padding: 0; } - -.select2-container--classic .select2-results__option[aria-disabled=true] { - color: grey; } - -.select2-container--classic .select2-results__option--highlighted[aria-selected] { - background-color: #3875d7; - color: white; } - -.select2-container--classic .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic.select2-container--open .select2-dropdown { - border-color: #5897fb; } diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.min.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.min.css deleted file mode 100644 index 7c18ad5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.min.css +++ /dev/null @@ -1 +0,0 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/widgets.css b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/widgets.css deleted file mode 100644 index 538af2e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/css/widgets.css +++ /dev/null @@ -1,613 +0,0 @@ -/* SELECTOR (FILTER INTERFACE) */ - -.selector { - display: flex; - flex: 1; - gap: 0 10px; -} - -.selector select { - height: 17.2em; - flex: 1 0 auto; - overflow: scroll; - width: 100%; -} - -.selector-available, .selector-chosen { - display: flex; - flex-direction: column; - flex: 1 1; -} - -.selector-available-title, .selector-chosen-title { - border: 1px solid var(--border-color); - border-radius: 4px 4px 0 0; -} - -.selector .helptext { - font-size: 0.6875rem; -} - -.selector-chosen .list-footer-display { - border: 1px solid var(--border-color); - border-top: none; - border-radius: 0 0 4px 4px; - margin: 0 0 10px; - padding: 8px; - text-align: center; - background: var(--primary); - color: var(--header-link-color); - cursor: pointer; -} -.selector-chosen .list-footer-display__clear { - color: var(--breadcrumbs-fg); -} - -.selector-chosen-title { - background: var(--secondary); - color: var(--header-link-color); - padding: 8px; -} - -.aligned .selector-chosen-title label { - color: var(--header-link-color); - width: 100%; -} - -.selector-available-title { - background: var(--darkened-bg); - color: var(--body-quiet-color); - padding: 8px; -} - -.aligned .selector-available-title label { - width: 100%; -} - -.selector .selector-filter { - border: 1px solid var(--border-color); - border-width: 0 1px; - padding: 8px; - color: var(--body-quiet-color); - font-size: 0.625rem; - margin: 0; - text-align: left; - display: flex; - gap: 8px; -} - -.selector .selector-filter label, -.inline-group .aligned .selector .selector-filter label { - float: left; - margin: 7px 0 0; - width: 18px; - height: 18px; - padding: 0; - overflow: hidden; - line-height: 1; - min-width: auto; -} - -.selector-filter input { - flex-grow: 1; -} - -.selector ul.selector-chooser { - align-self: center; - width: 30px; - background-color: var(--selected-bg); - border-radius: 10px; - margin: 0; - padding: 0; - transform: translateY(-17px); -} - -.selector-chooser li { - margin: 0; - padding: 3px; - list-style-type: none; -} - -.selector select { - padding: 0 10px; - margin: 0 0 10px; - border-radius: 0 0 4px 4px; -} -.selector .selector-chosen--with-filtered select { - margin: 0; - border-radius: 0; - height: 14em; -} - -.selector .selector-chosen:not(.selector-chosen--with-filtered) .list-footer-display { - display: none; -} - -.selector-add, .selector-remove { - width: 24px; - height: 24px; - display: block; - text-indent: -3000px; - overflow: hidden; - cursor: default; - opacity: 0.55; - border: none; -} - -:enabled.selector-add, :enabled.selector-remove { - opacity: 1; -} - -:enabled.selector-add:hover, :enabled.selector-remove:hover { - cursor: pointer; -} - -.selector-add { - background: url(../img/selector-icons.svg) 0 -144px no-repeat; - background-size: 24px auto; -} - -:enabled.selector-add:focus, :enabled.selector-add:hover { - background-position: 0 -168px; -} - -.selector-remove { - background: url(../img/selector-icons.svg) 0 -96px no-repeat; - background-size: 24px auto; -} - -:enabled.selector-remove:focus, :enabled.selector-remove:hover { - background-position: 0 -120px; -} - -.selector-chooseall, .selector-clearall { - display: inline-block; - height: 16px; - text-align: left; - margin: 0 auto; - overflow: hidden; - font-weight: bold; - line-height: 16px; - color: var(--body-quiet-color); - text-decoration: none; - opacity: 0.55; - border: none; -} - -:enabled.selector-chooseall:focus, :enabled.selector-clearall:focus, -:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { - color: var(--link-fg); -} - -:enabled.selector-chooseall, :enabled.selector-clearall { - opacity: 1; -} - -:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { - cursor: pointer; -} - -.selector-chooseall { - padding: 0 18px 0 0; - background: url(../img/selector-icons.svg) right -160px no-repeat; - cursor: default; -} - -:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { - background-position: 100% -176px; -} - -.selector-clearall { - padding: 0 0 0 18px; - background: url(../img/selector-icons.svg) 0 -128px no-repeat; - cursor: default; -} - -:enabled.selector-clearall:focus, :enabled.selector-clearall:hover { - background-position: 0 -144px; -} - -/* STACKED SELECTORS */ - -.stacked { - float: left; - width: 490px; - display: block; -} - -.stacked select { - width: 480px; - height: 10.1em; -} - -.stacked .selector-available, .stacked .selector-chosen { - width: 480px; -} - -.stacked .selector-available { - margin-bottom: 0; -} - -.stacked .selector-available input { - width: 422px; -} - -.stacked ul.selector-chooser { - display: flex; - height: 30px; - width: 64px; - margin: 0 0 10px 40%; - background-color: #eee; - border-radius: 10px; - transform: none; -} - -.stacked .selector-chooser li { - float: left; - padding: 3px 3px 3px 5px; -} - -.stacked .selector-chooseall, .stacked .selector-clearall { - display: none; -} - -.stacked .selector-add { - background: url(../img/selector-icons.svg) 0 -48px no-repeat; - background-size: 24px auto; - cursor: default; -} - -.stacked :enabled.selector-add { - background-position: 0 -48px; - cursor: pointer; -} - -.stacked :enabled.selector-add:focus, .stacked :enabled.selector-add:hover { - background-position: 0 -72px; - cursor: pointer; -} - -.stacked .selector-remove { - background: url(../img/selector-icons.svg) 0 0 no-repeat; - background-size: 24px auto; - cursor: default; -} - -.stacked :enabled.selector-remove { - background-position: 0 0px; - cursor: pointer; -} - -.stacked :enabled.selector-remove:focus, .stacked :enabled.selector-remove:hover { - background-position: 0 -24px; - cursor: pointer; -} - -.selector .help-icon { - background: url(../img/icon-unknown.svg) 0 0 no-repeat; - display: inline-block; - vertical-align: middle; - margin: -2px 0 0 2px; - width: 13px; - height: 13px; -} - -.selector .selector-chosen .help-icon { - background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat; -} - -.selector .search-label-icon { - background: url(../img/search.svg) 0 0 no-repeat; - display: inline-block; - height: 1.125rem; - width: 1.125rem; -} - -/* DATE AND TIME */ - -p.datetime { - line-height: 20px; - margin: 0; - padding: 0; - color: var(--body-quiet-color); - font-weight: bold; -} - -.datetime span { - white-space: nowrap; - font-weight: normal; - font-size: 0.6875rem; - color: var(--body-quiet-color); -} - -.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { - margin-left: 5px; - margin-bottom: 4px; -} - -table p.datetime { - font-size: 0.6875rem; - margin-left: 0; - padding-left: 0; -} - -.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { - position: relative; - display: inline-block; - vertical-align: middle; - height: 24px; - width: 24px; - overflow: hidden; -} - -.datetimeshortcuts .clock-icon { - background: url(../img/icon-clock.svg) 0 0 no-repeat; - background-size: 24px auto; -} - -.datetimeshortcuts a:focus .clock-icon, -.datetimeshortcuts a:hover .clock-icon { - background-position: 0 -24px; -} - -.datetimeshortcuts .date-icon { - background: url(../img/icon-calendar.svg) 0 0 no-repeat; - background-size: 24px auto; - top: -1px; -} - -.datetimeshortcuts a:focus .date-icon, -.datetimeshortcuts a:hover .date-icon { - background-position: 0 -24px; -} - -.timezonewarning { - font-size: 0.6875rem; - color: var(--body-quiet-color); -} - -/* URL */ - -p.url { - line-height: 20px; - margin: 0; - padding: 0; - color: var(--body-quiet-color); - font-size: 0.6875rem; - font-weight: bold; -} - -.url a { - font-weight: normal; -} - -/* FILE UPLOADS */ - -p.file-upload { - line-height: 20px; - margin: 0; - padding: 0; - color: var(--body-quiet-color); - font-size: 0.6875rem; - font-weight: bold; -} - -.file-upload a { - font-weight: normal; -} - -.file-upload .deletelink { - margin-left: 5px; -} - -span.clearable-file-input label { - color: var(--body-fg); - font-size: 0.6875rem; - display: inline; - float: none; -} - -/* CALENDARS & CLOCKS */ - -.calendarbox, .clockbox { - margin: 5px auto; - font-size: 0.75rem; - width: 19em; - text-align: center; - background: var(--body-bg); - color: var(--body-fg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); - overflow: hidden; - position: relative; -} - -.clockbox { - width: auto; -} - -.calendar { - margin: 0; - padding: 0; -} - -.calendar table { - margin: 0; - padding: 0; - border-collapse: collapse; - background: white; - width: 100%; -} - -.calendar caption, .calendarbox h2 { - margin: 0; - text-align: center; - border-top: none; - font-weight: 700; - font-size: 0.75rem; - color: #333; - background: var(--accent); -} - -.calendar th { - padding: 8px 5px; - background: var(--darkened-bg); - border-bottom: 1px solid var(--border-color); - font-weight: 400; - font-size: 0.75rem; - text-align: center; - color: var(--body-quiet-color); -} - -.calendar td { - font-weight: 400; - font-size: 0.75rem; - text-align: center; - padding: 0; - border-top: 1px solid var(--hairline-color); - border-bottom: none; -} - -.calendar td.selected a { - background: var(--secondary); - color: var(--button-fg); -} - -.calendar td.nonday { - background: var(--darkened-bg); -} - -.calendar td.today a { - font-weight: 700; -} - -.calendar td a, .timelist a { - display: block; - font-weight: 400; - padding: 6px; - text-decoration: none; - color: var(--body-quiet-color); -} - -.calendar td a:focus, .timelist a:focus, -.calendar td a:hover, .timelist a:hover { - background: var(--primary); - color: white; -} - -.calendar td a:active, .timelist a:active { - background: var(--header-bg); - color: white; -} - -.calendarnav { - font-size: 0.625rem; - text-align: center; - color: #ccc; - margin: 0; - padding: 1px 3px; -} - -.calendarnav a:link, #calendarnav a:visited, -#calendarnav a:focus, #calendarnav a:hover { - color: var(--body-quiet-color); -} - -.calendar-shortcuts { - background: var(--body-bg); - color: var(--body-quiet-color); - font-size: 0.6875rem; - line-height: 0.6875rem; - border-top: 1px solid var(--hairline-color); - padding: 8px 0; -} - -.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { - display: block; - position: absolute; - top: 8px; - width: 15px; - height: 15px; - text-indent: -9999px; - padding: 0; -} - -.calendarnav-previous { - left: 10px; - background: url(../img/calendar-icons.svg) 0 0 no-repeat; -} - -.calendarnav-next { - right: 10px; - background: url(../img/calendar-icons.svg) 0 -15px no-repeat; -} - -.calendar-cancel { - margin: 0; - padding: 4px 0; - font-size: 0.75rem; - background: var(--close-button-bg); - border-top: 1px solid var(--border-color); - color: var(--button-fg); -} - -.calendar-cancel:focus, .calendar-cancel:hover { - background: var(--close-button-hover-bg); -} - -.calendar-cancel a { - color: var(--button-fg); - display: block; -} - -ul.timelist, .timelist li { - list-style-type: none; - margin: 0; - padding: 0; -} - -.timelist a { - padding: 2px; -} - -/* EDIT INLINE */ - -.inline-deletelink { - float: right; - text-indent: -9999px; - background: url(../img/inline-delete.svg) 0 0 no-repeat; - width: 1.5rem; - height: 1.5rem; - border: 0px none; - margin-bottom: .25rem; -} - -.inline-deletelink:focus, .inline-deletelink:hover { - cursor: pointer; -} - -/* RELATED WIDGET WRAPPER */ -.related-widget-wrapper { - display: flex; - gap: 0 10px; - flex-grow: 1; - flex-wrap: wrap; - margin-bottom: 5px; -} - -.related-widget-wrapper-link { - opacity: .6; - filter: grayscale(1); -} - -.related-widget-wrapper-link:link { - opacity: 1; - filter: grayscale(0); -} - -/* GIS MAPS */ -.dj_map { - width: 600px; - height: 400px; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/LICENSE b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/LICENSE deleted file mode 100644 index a4faaa1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Code Charm Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/README.txt b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/README.txt deleted file mode 100644 index bf81f35..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -All icons are taken from Font Awesome (https://fontawesome.com/) project. -The Font Awesome font is licensed under the SIL OFL 1.1: -- https://scripts.sil.org/OFL - -SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG -Font-Awesome-SVG-PNG is licensed under the MIT license (see file license -in current folder). diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/calendar-icons.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/calendar-icons.svg deleted file mode 100644 index 04c0274..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/calendar-icons.svg +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - width="15" - height="30" - viewBox="0 0 1792 3584" - version="1.1" - id="svg5" - sodipodi:docname="calendar-icons.svg" - inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> - <sodipodi:namedview - id="namedview5" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:showpageshadow="2" - inkscape:pageopacity="0.0" - inkscape:pagecheckerboard="0" - inkscape:deskcolor="#d1d1d1" - showgrid="false" - inkscape:zoom="13.3" - inkscape:cx="15.526316" - inkscape:cy="20.977444" - inkscape:window-width="1920" - inkscape:window-height="1011" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1" - inkscape:current-layer="svg5" /> - <defs - id="defs2"> - <g - id="previous"> - <path - d="m 1037,1395 102,-102 q 19,-19 19,-45 0,-26 -19,-45 L 832,896 1139,589 q 19,-19 19,-45 0,-26 -19,-45 L 1037,397 q -19,-19 -45,-19 -26,0 -45,19 L 493,851 q -19,19 -19,45 0,26 19,45 l 454,454 q 19,19 45,19 26,0 45,-19 z m 627,-499 q 0,209 -103,385.5 Q 1458,1458 1281.5,1561 1105,1664 896,1664 687,1664 510.5,1561 334,1458 231,1281.5 128,1105 128,896 128,687 231,510.5 334,334 510.5,231 687,128 896,128 1105,128 1281.5,231 1458,334 1561,510.5 1664,687 1664,896 Z" - id="path1" /> - </g> - <g - id="next"> - <path - d="m 845,1395 454,-454 q 19,-19 19,-45 0,-26 -19,-45 L 845,397 q -19,-19 -45,-19 -26,0 -45,19 L 653,499 q -19,19 -19,45 0,26 19,45 l 307,307 -307,307 q -19,19 -19,45 0,26 19,45 l 102,102 q 19,19 45,19 26,0 45,-19 z m 819,-499 q 0,209 -103,385.5 Q 1458,1458 1281.5,1561 1105,1664 896,1664 687,1664 510.5,1561 334,1458 231,1281.5 128,1105 128,896 128,687 231,510.5 334,334 510.5,231 687,128 896,128 1105,128 1281.5,231 1458,334 1561,510.5 1664,687 1664,896 Z" - id="path2" /> - </g> - </defs> - <use - xlink:href="#next" - x="0" - y="5376" - fill="#000000" - id="use5" - transform="translate(0,-3584)" /> - <use - xlink:href="#previous" - x="0" - y="0" - fill="#333333" - id="use2" - style="fill:#000000;fill-opacity:1" /> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg deleted file mode 100644 index 228854f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#EBECE6" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9C9C9" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg> \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg deleted file mode 100644 index 96b87fd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#F1C02A" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9A741" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg> \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg deleted file mode 100644 index 8d5c6a3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#5fa225" d="M1600 796v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-alert.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-alert.svg deleted file mode 100644 index e51ea83..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-alert.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="14" height="14" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#efb80b" d="M1024 1375v-190q0-14-9.5-23.5t-22.5-9.5h-192q-13 0-22.5 9.5t-9.5 23.5v190q0 14 9.5 23.5t22.5 9.5h192q13 0 22.5-9.5t9.5-23.5zm-2-374l18-459q0-12-10-19-13-11-24-11h-220q-11 0-24 11-10 7-10 21l17 457q0 10 10 16.5t24 6.5h185q14 0 23.5-6.5t10.5-16.5zm-14-934l768 1408q35 63-2 126-17 29-46.5 46t-63.5 17h-1536q-34 0-63.5-17t-46.5-46q-37-63-2-126l768-1408q17-31 47-49t65-18 65 18 47 49z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg deleted file mode 100644 index 97910a9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg width="16" height="32" viewBox="0 0 1792 3584" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <g id="icon"> - <path d="M192 1664h288v-288h-288v288zm352 0h320v-288h-320v288zm-352-352h288v-320h-288v320zm352 0h320v-320h-320v320zm-352-384h288v-288h-288v288zm736 736h320v-288h-320v288zm-384-736h320v-288h-320v288zm768 736h288v-288h-288v288zm-384-352h320v-320h-320v320zm-352-864v-288q0-13-9.5-22.5t-22.5-9.5h-64q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5-9.5t9.5-22.5zm736 864h288v-320h-288v320zm-384-384h320v-288h-320v288zm384 0h288v-288h-288v288zm32-480v-288q0-13-9.5-22.5t-22.5-9.5h-64q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5-9.5t9.5-22.5zm384-64v1280q0 52-38 90t-90 38h-1408q-52 0-90-38t-38-90v-1280q0-52 38-90t90-38h128v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h384v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h128q52 0 90 38t38 90z"/> - </g> - </defs> - <use xlink:href="#icon" x="0" y="0" fill="#447e9b" /> - <use xlink:href="#icon" x="0" y="1792" fill="#003366" /> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg deleted file mode 100644 index 592b093..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#b48c08" d="M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-clock.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-clock.svg deleted file mode 100644 index bf9985d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-clock.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg width="16" height="32" viewBox="0 0 1792 3584" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <g id="icon"> - <path d="M1024 544v448q0 14-9 23t-23 9h-320q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h224v-352q0-14 9-23t23-9h64q14 0 23 9t9 23zm416 352q0-148-73-273t-198-198-273-73-273 73-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273zm224 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - </defs> - <use xlink:href="#icon" x="0" y="0" fill="#447e9b" /> - <use xlink:href="#icon" x="0" y="1792" fill="#003366" /> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg deleted file mode 100644 index 4059b15..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="14" height="14" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#dd4646" d="M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-hidelink.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-hidelink.svg deleted file mode 100644 index 2a8b404..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-hidelink.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#2b70bf" d="m555 1335 78-141q-87-63-136-159t-49-203q0-121 61-225-229 117-381 353 167 258 427 375zm389-759q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm363-191q0 7-1 9-105 188-315 566t-316 567l-49 89q-10 16-28 16-12 0-134-70-16-10-16-28 0-12 44-87-143-65-263.5-173T20 1029Q0 998 0 960t20-69q153-235 380-371t496-136q89 0 180 17l54-97q10-16 28-16 5 0 18 6t31 15.5 33 18.5 31.5 18.5T1291 358q16 10 16 27zm37 447q0 139-79 253.5T1056 1250l280-502q8 45 8 84zm448 128q0 35-20 69-39 64-109 145-150 172-347.5 267T896 1536l74-132q212-18 392.5-137T1664 960q-115-179-282-294l63-112q95 64 182.5 153T1772 891q20 34 20 69z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-no.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-no.svg deleted file mode 100644 index 2e0d383..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-no.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#dd4646" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg deleted file mode 100644 index 1c6b99f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#ffffff" d="M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-unknown.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-unknown.svg deleted file mode 100644 index 50b4f97..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-unknown.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#666666" d="M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg deleted file mode 100644 index a1ca1d3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#2b70bf" d="M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5t-316.5 131.5-316.5-131.5-131.5-316.5q0-121 61-225-229 117-381 353 133 205 333.5 326.5t434.5 121.5 434.5-121.5 333.5-326.5zm-720-384q0-20-14-34t-34-14q-125 0-214.5 89.5t-89.5 214.5q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5t-499.5 138.5-499.5-139-376.5-368q-20-35-20-69t20-69q140-229 376.5-368t499.5-139 499.5 139 376.5 368q20 35 20 69z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-yes.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-yes.svg deleted file mode 100644 index 5883d87..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/icon-yes.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#70bf2b" d="M1412 734q0-28-18-46l-91-90q-19-19-45-19t-45 19l-408 407-226-226q-19-19-45-19t-45 19l-91 90q-18 18-18 46 0 27 18 45l362 362q19 19 45 19 27 0 46-19l543-543q18-18 18-45zm252 162q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg deleted file mode 100644 index 8751150..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#999999" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/search.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/search.svg deleted file mode 100644 index c8c69b2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/search.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="15" height="15" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#555555" d="M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/selector-icons.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/selector-icons.svg deleted file mode 100644 index 926b8e2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/selector-icons.svg +++ /dev/null @@ -1,34 +0,0 @@ -<svg width="16" height="192" viewBox="0 0 1792 21504" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <g id="up"> - <path d="M1412 895q0-27-18-45l-362-362-91-91q-18-18-45-18t-45 18l-91 91-362 362q-18 18-18 45t18 45l91 91q18 18 45 18t45-18l189-189v502q0 26 19 45t45 19h128q26 0 45-19t19-45v-502l189 189q19 19 45 19t45-19l91-91q18-18 18-45zm252 1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - <g id="down"> - <path d="M1412 897q0-27-18-45l-91-91q-18-18-45-18t-45 18l-189 189v-502q0-26-19-45t-45-19h-128q-26 0-45 19t-19 45v502l-189-189q-19-19-45-19t-45 19l-91 91q-18 18-18 45t18 45l362 362 91 91q18 18 45 18t45-18l91-91 362-362q18-18 18-45zm252-1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - <g id="left"> - <path d="M1408 960v-128q0-26-19-45t-45-19h-502l189-189q19-19 19-45t-19-45l-91-91q-18-18-45-18t-45 18l-362 362-91 91q-18 18-18 45t18 45l91 91 362 362q18 18 45 18t45-18l91-91q18-18 18-45t-18-45l-189-189h502q26 0 45-19t19-45zm256-64q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - <g id="right"> - <path d="M1413 896q0-27-18-45l-91-91-362-362q-18-18-45-18t-45 18l-91 91q-18 18-18 45t18 45l189 189h-502q-26 0-45 19t-19 45v128q0 26 19 45t45 19h502l-189 189q-19 19-19 45t19 45l91 91q18 18 45 18t45-18l362-362 91-91q18-18 18-45zm251 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - <g id="clearall"> - <path transform="translate(336, 336) scale(0.75)" d="M1037 1395l102-102q19-19 19-45t-19-45l-307-307 307-307q19-19 19-45t-19-45l-102-102q-19-19-45-19t-45 19l-454 454q-19 19-19 45t19 45l454 454q19 19 45 19t45-19zm627-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - <g id="chooseall"> - <path transform="translate(336, 336) scale(0.75)" d="M845 1395l454-454q19-19 19-45t-19-45l-454-454q-19-19-45-19t-45 19l-102 102q-19 19-19 45t19 45l307 307-307 307q-19 19-19 45t19 45l102 102q19 19 45 19t45-19zm819-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - </defs> - <use xlink:href="#up" x="0" y="0" fill="#666666" /> - <use xlink:href="#up" x="0" y="1792" fill="#447e9b" /> - <use xlink:href="#down" x="0" y="3584" fill="#666666" /> - <use xlink:href="#down" x="0" y="5376" fill="#447e9b" /> - <use xlink:href="#left" x="0" y="7168" fill="#666666" /> - <use xlink:href="#left" x="0" y="8960" fill="#447e9b" /> - <use xlink:href="#right" x="0" y="10752" fill="#666666" /> - <use xlink:href="#right" x="0" y="12544" fill="#447e9b" /> - <use xlink:href="#clearall" x="0" y="14336" fill="#666666" /> - <use xlink:href="#clearall" x="0" y="16128" fill="#447e9b" /> - <use xlink:href="#chooseall" x="0" y="17920" fill="#666666" /> - <use xlink:href="#chooseall" x="0" y="19712" fill="#447e9b" /> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/sorting-icons.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/sorting-icons.svg deleted file mode 100644 index 7c31ec9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/sorting-icons.svg +++ /dev/null @@ -1,19 +0,0 @@ -<svg width="14" height="84" viewBox="0 0 1792 10752" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <g id="sort"> - <path d="M1408 1088q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45zm0-384q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45 19-45l448-448q19-19 45-19t45 19l448 448q19 19 19 45z"/> - </g> - <g id="ascending"> - <path d="M1408 1216q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45 19-45l448-448q19-19 45-19t45 19l448 448q19 19 19 45z"/> - </g> - <g id="descending"> - <path d="M1408 704q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45z"/> - </g> - </defs> - <use xlink:href="#sort" x="0" y="0" fill="#999999" /> - <use xlink:href="#sort" x="0" y="1792" fill="#447e9b" /> - <use xlink:href="#ascending" x="0" y="3584" fill="#999999" /> - <use xlink:href="#ascending" x="0" y="5376" fill="#447e9b" /> - <use xlink:href="#descending" x="0" y="7168" fill="#999999" /> - <use xlink:href="#descending" x="0" y="8960" fill="#447e9b" /> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg deleted file mode 100644 index 1ca64ae..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#ffffff" d="M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/tooltag-arrowright.svg b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/tooltag-arrowright.svg deleted file mode 100644 index b664d61..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/img/tooltag-arrowright.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#ffffff" d="M1363 877l-742 742q-19 19-45 19t-45-19l-166-166q-19-19-19-45t19-45l531-531-531-531q-19-19-19-45t19-45l166-166q19-19 45-19t45 19l742 742q19 19 19 45t-19 45z"/> -</svg> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/SelectBox.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/SelectBox.js deleted file mode 100644 index 3db4ec7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/SelectBox.js +++ /dev/null @@ -1,116 +0,0 @@ -'use strict'; -{ - const SelectBox = { - cache: {}, - init: function(id) { - const box = document.getElementById(id); - SelectBox.cache[id] = []; - const cache = SelectBox.cache[id]; - for (const node of box.options) { - cache.push({value: node.value, text: node.text, displayed: 1}); - } - }, - redisplay: function(id) { - // Repopulate HTML select box from cache - const box = document.getElementById(id); - const scroll_value_from_top = box.scrollTop; - box.innerHTML = ''; - for (const node of SelectBox.cache[id]) { - if (node.displayed) { - const new_option = new Option(node.text, node.value, false, false); - // Shows a tooltip when hovering over the option - new_option.title = node.text; - box.appendChild(new_option); - } - } - box.scrollTop = scroll_value_from_top; - }, - filter: function(id, text) { - // Redisplay the HTML select box, displaying only the choices containing ALL - // the words in text. (It's an AND search.) - const tokens = text.toLowerCase().split(/\s+/); - for (const node of SelectBox.cache[id]) { - node.displayed = 1; - const node_text = node.text.toLowerCase(); - for (const token of tokens) { - if (!node_text.includes(token)) { - node.displayed = 0; - break; // Once the first token isn't found we're done - } - } - } - SelectBox.redisplay(id); - }, - get_hidden_node_count(id) { - const cache = SelectBox.cache[id] || []; - return cache.filter(node => node.displayed === 0).length; - }, - delete_from_cache: function(id, value) { - let delete_index = null; - const cache = SelectBox.cache[id]; - for (const [i, node] of cache.entries()) { - if (node.value === value) { - delete_index = i; - break; - } - } - cache.splice(delete_index, 1); - }, - add_to_cache: function(id, option) { - SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); - }, - cache_contains: function(id, value) { - // Check if an item is contained in the cache - for (const node of SelectBox.cache[id]) { - if (node.value === value) { - return true; - } - } - return false; - }, - move: function(from, to) { - const from_box = document.getElementById(from); - for (const option of from_box.options) { - const option_value = option.value; - if (option.selected && SelectBox.cache_contains(from, option_value)) { - SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); - SelectBox.delete_from_cache(from, option_value); - } - } - SelectBox.redisplay(from); - SelectBox.redisplay(to); - }, - move_all: function(from, to) { - const from_box = document.getElementById(from); - for (const option of from_box.options) { - const option_value = option.value; - if (SelectBox.cache_contains(from, option_value)) { - SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); - SelectBox.delete_from_cache(from, option_value); - } - } - SelectBox.redisplay(from); - SelectBox.redisplay(to); - }, - sort: function(id) { - SelectBox.cache[id].sort(function(a, b) { - a = a.text.toLowerCase(); - b = b.text.toLowerCase(); - if (a > b) { - return 1; - } - if (a < b) { - return -1; - } - return 0; - } ); - }, - select_all: function(id) { - const box = document.getElementById(id); - for (const option of box.options) { - option.selected = true; - } - } - }; - window.SelectBox = SelectBox; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/SelectFilter2.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/SelectFilter2.js deleted file mode 100644 index 08d47fc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/SelectFilter2.js +++ /dev/null @@ -1,307 +0,0 @@ -/*global SelectBox, gettext, ngettext, interpolate, quickElement, SelectFilter*/ -/* -SelectFilter2 - Turns a multiple-select box into a filter interface. - -Requires core.js and SelectBox.js. -*/ -'use strict'; -{ - window.SelectFilter = { - init: function(field_id, field_name, is_stacked) { - if (field_id.match(/__prefix__/)) { - // Don't initialize on empty forms. - return; - } - const from_box = document.getElementById(field_id); - from_box.id += '_from'; // change its ID - from_box.className = 'filtered'; - from_box.setAttribute('aria-labelledby', field_id + '_from_title'); - - for (const p of from_box.parentNode.getElementsByTagName('p')) { - if (p.classList.contains("info")) { - // Remove <p class="info">, because it just gets in the way. - from_box.parentNode.removeChild(p); - } else if (p.classList.contains("help")) { - // Move help text up to the top so it isn't below the select - // boxes or wrapped off on the side to the right of the add - // button: - from_box.parentNode.insertBefore(p, from_box.parentNode.firstChild); - } - } - - // <div class="selector"> or <div class="selector stacked"> - const selector_div = quickElement('div', from_box.parentNode); - // Make sure the selector div is at the beginning so that the - // add link would be displayed to the right of the widget. - from_box.parentNode.prepend(selector_div); - selector_div.className = is_stacked ? 'selector stacked' : 'selector'; - - // <div class="selector-available"> - const selector_available = quickElement('div', selector_div); - selector_available.className = 'selector-available'; - const selector_available_title = quickElement('div', selector_available); - selector_available_title.id = field_id + '_from_title'; - selector_available_title.className = 'selector-available-title'; - quickElement('label', selector_available_title, interpolate(gettext('Available %s') + ' ', [field_name]), 'for', field_id + '_from'); - quickElement( - 'p', - selector_available_title, - interpolate(gettext('Choose %s by selecting them and then select the "Choose" arrow button.'), [field_name]), - 'class', 'helptext' - ); - - const filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); - filter_p.className = 'selector-filter'; - - const search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input'); - - quickElement( - 'span', search_filter_label, '', - 'class', 'help-tooltip search-label-icon', - 'aria-label', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) - ); - - filter_p.appendChild(document.createTextNode(' ')); - - const filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); - filter_input.id = field_id + '_input'; - - selector_available.appendChild(from_box); - const choose_all = quickElement( - 'button', - selector_available, - interpolate(gettext('Choose all %s'), [field_name]), - 'id', field_id + '_add_all', - 'class', 'selector-chooseall' - ); - - // <ul class="selector-chooser"> - const selector_chooser = quickElement('ul', selector_div); - selector_chooser.className = 'selector-chooser'; - const add_button = quickElement( - 'button', - quickElement('li', selector_chooser), - interpolate(gettext('Choose selected %s'), [field_name]), - 'id', field_id + '_add', - 'class', 'selector-add' - ); - const remove_button = quickElement( - 'button', - quickElement('li', selector_chooser), - interpolate(gettext('Remove selected %s'), [field_name]), - 'id', field_id + '_remove', - 'class', 'selector-remove' - ); - - // <div class="selector-chosen"> - const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen'); - selector_chosen.className = 'selector-chosen'; - const selector_chosen_title = quickElement('div', selector_chosen); - selector_chosen_title.className = 'selector-chosen-title'; - selector_chosen_title.id = field_id + '_to_title'; - quickElement('label', selector_chosen_title, interpolate(gettext('Chosen %s') + ' ', [field_name]), 'for', field_id + '_to'); - quickElement( - 'p', - selector_chosen_title, - interpolate(gettext('Remove %s by selecting them and then select the "Remove" arrow button.'), [field_name]), - 'class', 'helptext' - ); - - const filter_selected_p = quickElement('p', selector_chosen, '', 'id', field_id + '_filter_selected'); - filter_selected_p.className = 'selector-filter'; - - const search_filter_selected_label = quickElement('label', filter_selected_p, '', 'for', field_id + '_selected_input'); - - quickElement( - 'span', search_filter_selected_label, '', - 'class', 'help-tooltip search-label-icon', - 'aria-label', interpolate(gettext("Type into this box to filter down the list of selected %s."), [field_name]) - ); - - filter_selected_p.appendChild(document.createTextNode(' ')); - - const filter_selected_input = quickElement('input', filter_selected_p, '', 'type', 'text', 'placeholder', gettext("Filter")); - filter_selected_input.id = field_id + '_selected_input'; - - quickElement( - 'select', - selector_chosen, - '', - 'id', field_id + '_to', - 'multiple', '', - 'size', from_box.size, - 'name', from_box.name, - 'aria-labelledby', field_id + '_to_title', - 'class', 'filtered' - ); - const warning_footer = quickElement('div', selector_chosen, '', 'class', 'list-footer-display'); - quickElement('span', warning_footer, '', 'id', field_id + '_list-footer-display-text'); - quickElement('span', warning_footer, ' ' + gettext('(click to clear)'), 'class', 'list-footer-display__clear'); - const clear_all = quickElement( - 'button', - selector_chosen, - interpolate(gettext('Remove all %s'), [field_name]), - 'id', field_id + '_remove_all', - 'class', 'selector-clearall' - ); - - from_box.name = from_box.name + '_old'; - - // Set up the JavaScript event handlers for the select box filter interface - const move_selection = function(e, elem, move_func, from, to) { - if (!elem.hasAttribute('disabled')) { - move_func(from, to); - SelectFilter.refresh_icons(field_id); - SelectFilter.refresh_filtered_selects(field_id); - SelectFilter.refresh_filtered_warning(field_id); - } - e.preventDefault(); - }; - choose_all.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to'); - }); - add_button.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); - }); - remove_button.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from'); - }); - clear_all.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from'); - }); - warning_footer.addEventListener('click', function(e) { - filter_selected_input.value = ''; - SelectBox.filter(field_id + '_to', ''); - SelectFilter.refresh_filtered_warning(field_id); - SelectFilter.refresh_icons(field_id); - }); - filter_input.addEventListener('keypress', function(e) { - SelectFilter.filter_key_press(e, field_id, '_from', '_to'); - }); - filter_input.addEventListener('keyup', function(e) { - SelectFilter.filter_key_up(e, field_id, '_from'); - }); - filter_input.addEventListener('keydown', function(e) { - SelectFilter.filter_key_down(e, field_id, '_from', '_to'); - }); - filter_selected_input.addEventListener('keypress', function(e) { - SelectFilter.filter_key_press(e, field_id, '_to', '_from'); - }); - filter_selected_input.addEventListener('keyup', function(e) { - SelectFilter.filter_key_up(e, field_id, '_to', '_selected_input'); - }); - filter_selected_input.addEventListener('keydown', function(e) { - SelectFilter.filter_key_down(e, field_id, '_to', '_from'); - }); - selector_div.addEventListener('change', function(e) { - if (e.target.tagName === 'SELECT') { - SelectFilter.refresh_icons(field_id); - } - }); - selector_div.addEventListener('dblclick', function(e) { - if (e.target.tagName === 'OPTION') { - if (e.target.closest('select').id === field_id + '_to') { - SelectBox.move(field_id + '_to', field_id + '_from'); - } else { - SelectBox.move(field_id + '_from', field_id + '_to'); - } - SelectFilter.refresh_icons(field_id); - } - }); - from_box.closest('form').addEventListener('submit', function() { - SelectBox.filter(field_id + '_to', ''); - SelectBox.select_all(field_id + '_to'); - }); - SelectBox.init(field_id + '_from'); - SelectBox.init(field_id + '_to'); - // Move selected from_box options to to_box - SelectBox.move(field_id + '_from', field_id + '_to'); - - // Initial icon refresh - SelectFilter.refresh_icons(field_id); - }, - any_selected: function(field) { - // Temporarily add the required attribute and check validity. - field.required = true; - const any_selected = field.checkValidity(); - field.required = false; - return any_selected; - }, - refresh_filtered_warning: function(field_id) { - const count = SelectBox.get_hidden_node_count(field_id + '_to'); - const selector = document.getElementById(field_id + '_selector_chosen'); - const warning = document.getElementById(field_id + '_list-footer-display-text'); - selector.className = selector.className.replace('selector-chosen--with-filtered', ''); - warning.textContent = interpolate(ngettext( - '%s selected option not visible', - '%s selected options not visible', - count - ), [count]); - if(count > 0) { - selector.className += ' selector-chosen--with-filtered'; - } - }, - refresh_filtered_selects: function(field_id) { - SelectBox.filter(field_id + '_from', document.getElementById(field_id + "_input").value); - SelectBox.filter(field_id + '_to', document.getElementById(field_id + "_selected_input").value); - }, - refresh_icons: function(field_id) { - const from = document.getElementById(field_id + '_from'); - const to = document.getElementById(field_id + '_to'); - // Disabled if no items are selected. - document.getElementById(field_id + '_add').disabled = !SelectFilter.any_selected(from); - document.getElementById(field_id + '_remove').disabled = !SelectFilter.any_selected(to); - // Disabled if the corresponding box is empty. - document.getElementById(field_id + '_add_all').disabled = !from.querySelector('option'); - document.getElementById(field_id + '_remove_all').disabled = !to.querySelector('option'); - }, - filter_key_press: function(event, field_id, source, target) { - const source_box = document.getElementById(field_id + source); - // don't submit form if user pressed Enter - if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { - source_box.selectedIndex = 0; - SelectBox.move(field_id + source, field_id + target); - source_box.selectedIndex = 0; - event.preventDefault(); - } - }, - filter_key_up: function(event, field_id, source, filter_input) { - const input = filter_input || '_input'; - const source_box = document.getElementById(field_id + source); - const temp = source_box.selectedIndex; - SelectBox.filter(field_id + source, document.getElementById(field_id + input).value); - source_box.selectedIndex = temp; - SelectFilter.refresh_filtered_warning(field_id); - SelectFilter.refresh_icons(field_id); - }, - filter_key_down: function(event, field_id, source, target) { - const source_box = document.getElementById(field_id + source); - // right key (39) or left key (37) - const direction = source === '_from' ? 39 : 37; - // right arrow -- move across - if ((event.which && event.which === direction) || (event.keyCode && event.keyCode === direction)) { - const old_index = source_box.selectedIndex; - SelectBox.move(field_id + source, field_id + target); - SelectFilter.refresh_filtered_selects(field_id); - SelectFilter.refresh_filtered_warning(field_id); - source_box.selectedIndex = (old_index === source_box.length) ? source_box.length - 1 : old_index; - return; - } - // down arrow -- wrap around - if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { - source_box.selectedIndex = (source_box.length === source_box.selectedIndex + 1) ? 0 : source_box.selectedIndex + 1; - } - // up arrow -- wrap around - if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { - source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1; - } - } - }; - - window.addEventListener('load', function(e) { - document.querySelectorAll('select.selectfilter, select.selectfilterstacked').forEach(function(el) { - const data = el.dataset; - SelectFilter.init(el.id, data.fieldName, parseInt(data.isStacked, 10)); - }); - }); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/actions.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/actions.js deleted file mode 100644 index 04b25e9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/actions.js +++ /dev/null @@ -1,204 +0,0 @@ -/*global gettext, interpolate, ngettext, Actions*/ -'use strict'; -{ - function show(selector) { - document.querySelectorAll(selector).forEach(function(el) { - el.classList.remove('hidden'); - }); - } - - function hide(selector) { - document.querySelectorAll(selector).forEach(function(el) { - el.classList.add('hidden'); - }); - } - - function showQuestion(options) { - hide(options.acrossClears); - show(options.acrossQuestions); - hide(options.allContainer); - } - - function showClear(options) { - show(options.acrossClears); - hide(options.acrossQuestions); - document.querySelector(options.actionContainer).classList.remove(options.selectedClass); - show(options.allContainer); - hide(options.counterContainer); - } - - function reset(options) { - hide(options.acrossClears); - hide(options.acrossQuestions); - hide(options.allContainer); - show(options.counterContainer); - } - - function clearAcross(options) { - reset(options); - const acrossInputs = document.querySelectorAll(options.acrossInput); - acrossInputs.forEach(function(acrossInput) { - acrossInput.value = 0; - }); - document.querySelector(options.actionContainer).classList.remove(options.selectedClass); - } - - function checker(actionCheckboxes, options, checked) { - if (checked) { - showQuestion(options); - } else { - reset(options); - } - actionCheckboxes.forEach(function(el) { - el.checked = checked; - el.closest('tr').classList.toggle(options.selectedClass, checked); - }); - } - - function updateCounter(actionCheckboxes, options) { - const sel = Array.from(actionCheckboxes).filter(function(el) { - return el.checked; - }).length; - const counter = document.querySelector(options.counterContainer); - // data-actions-icnt is defined in the generated HTML - // and contains the total amount of objects in the queryset - const actions_icnt = Number(counter.dataset.actionsIcnt); - counter.textContent = interpolate( - ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { - sel: sel, - cnt: actions_icnt - }, true); - const allToggle = document.getElementById(options.allToggleId); - allToggle.checked = sel === actionCheckboxes.length; - if (allToggle.checked) { - showQuestion(options); - } else { - clearAcross(options); - } - } - - const defaults = { - actionContainer: "div.actions", - counterContainer: "span.action-counter", - allContainer: "div.actions span.all", - acrossInput: "div.actions input.select-across", - acrossQuestions: "div.actions span.question", - acrossClears: "div.actions span.clear", - allToggleId: "action-toggle", - selectedClass: "selected" - }; - - window.Actions = function(actionCheckboxes, options) { - options = Object.assign({}, defaults, options); - let list_editable_changed = false; - let lastChecked = null; - let shiftPressed = false; - - document.addEventListener('keydown', (event) => { - shiftPressed = event.shiftKey; - }); - - document.addEventListener('keyup', (event) => { - shiftPressed = event.shiftKey; - }); - - document.getElementById(options.allToggleId).addEventListener('click', function(event) { - checker(actionCheckboxes, options, this.checked); - updateCounter(actionCheckboxes, options); - }); - - document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) { - el.addEventListener('click', function(event) { - event.preventDefault(); - const acrossInputs = document.querySelectorAll(options.acrossInput); - acrossInputs.forEach(function(acrossInput) { - acrossInput.value = 1; - }); - showClear(options); - }); - }); - - document.querySelectorAll(options.acrossClears + " a").forEach(function(el) { - el.addEventListener('click', function(event) { - event.preventDefault(); - document.getElementById(options.allToggleId).checked = false; - clearAcross(options); - checker(actionCheckboxes, options, false); - updateCounter(actionCheckboxes, options); - }); - }); - - function affectedCheckboxes(target, withModifier) { - const multiSelect = (lastChecked && withModifier && lastChecked !== target); - if (!multiSelect) { - return [target]; - } - const checkboxes = Array.from(actionCheckboxes); - const targetIndex = checkboxes.findIndex(el => el === target); - const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked); - const startIndex = Math.min(targetIndex, lastCheckedIndex); - const endIndex = Math.max(targetIndex, lastCheckedIndex); - const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex)); - return filtered; - }; - - Array.from(document.getElementById('result_list').tBodies).forEach(function(el) { - el.addEventListener('change', function(event) { - const target = event.target; - if (target.classList.contains('action-select')) { - const checkboxes = affectedCheckboxes(target, shiftPressed); - checker(checkboxes, options, target.checked); - updateCounter(actionCheckboxes, options); - lastChecked = target; - } else { - list_editable_changed = true; - } - }); - }); - - document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) { - if (list_editable_changed) { - const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); - if (!confirmed) { - event.preventDefault(); - } - } - }); - - const el = document.querySelector('#changelist-form input[name=_save]'); - // The button does not exist if no fields are editable. - if (el) { - el.addEventListener('click', function(event) { - if (document.querySelector('[name=action]').value) { - const text = list_editable_changed - ? gettext("You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action.") - : gettext("You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button."); - if (!confirm(text)) { - event.preventDefault(); - } - } - }); - } - // Sync counter when navigating to the page, such as through the back - // button. - window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options)); - }; - - // Call function fn when the DOM is loaded and ready. If it is already - // loaded, call the function now. - // http://youmightnotneedjquery.com/#ready - function ready(fn) { - if (document.readyState !== 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } - } - - ready(function() { - const actionsEls = document.querySelectorAll('tr input.action-select'); - if (actionsEls.length > 0) { - Actions(actionsEls); - } - }); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js deleted file mode 100644 index aa1cae9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js +++ /dev/null @@ -1,408 +0,0 @@ -/*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/ -// Inserts shortcut buttons after all of the following: -// <input type="text" class="vDateField"> -// <input type="text" class="vTimeField"> -'use strict'; -{ - const DateTimeShortcuts = { - calendars: [], - calendarInputs: [], - clockInputs: [], - clockHours: { - default_: [ - [gettext_noop('Now'), -1], - [gettext_noop('Midnight'), 0], - [gettext_noop('6 a.m.'), 6], - [gettext_noop('Noon'), 12], - [gettext_noop('6 p.m.'), 18] - ] - }, - dismissClockFunc: [], - dismissCalendarFunc: [], - calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled - calendarDivName2: 'calendarin', // name of <div> that contains calendar - calendarLinkName: 'calendarlink', // name of the link that is used to toggle - clockDivName: 'clockbox', // name of clock <div> that gets toggled - clockLinkName: 'clocklink', // name of the link that is used to toggle - shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts - timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch - timezoneOffset: 0, - init: function() { - const serverOffset = document.body.dataset.adminUtcOffset; - if (serverOffset) { - const localOffset = new Date().getTimezoneOffset() * -60; - DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; - } - - for (const inp of document.getElementsByTagName('input')) { - if (inp.type === 'text' && inp.classList.contains('vTimeField')) { - DateTimeShortcuts.addClock(inp); - DateTimeShortcuts.addTimezoneWarning(inp); - } - else if (inp.type === 'text' && inp.classList.contains('vDateField')) { - DateTimeShortcuts.addCalendar(inp); - DateTimeShortcuts.addTimezoneWarning(inp); - } - } - }, - // Return the current time while accounting for the server timezone. - now: function() { - const serverOffset = document.body.dataset.adminUtcOffset; - if (serverOffset) { - const localNow = new Date(); - const localOffset = localNow.getTimezoneOffset() * -60; - localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset)); - return localNow; - } else { - return new Date(); - } - }, - // Add a warning when the time zone in the browser and backend do not match. - addTimezoneWarning: function(inp) { - const warningClass = DateTimeShortcuts.timezoneWarningClass; - let timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600; - - // Only warn if there is a time zone mismatch. - if (!timezoneOffset) { - return; - } - - // Check if warning is already there. - if (inp.parentNode.querySelectorAll('.' + warningClass).length) { - return; - } - - let message; - if (timezoneOffset > 0) { - message = ngettext( - 'Note: You are %s hour ahead of server time.', - 'Note: You are %s hours ahead of server time.', - timezoneOffset - ); - } - else { - timezoneOffset *= -1; - message = ngettext( - 'Note: You are %s hour behind server time.', - 'Note: You are %s hours behind server time.', - timezoneOffset - ); - } - message = interpolate(message, [timezoneOffset]); - - const warning = document.createElement('div'); - warning.classList.add('help', warningClass); - warning.textContent = message; - inp.parentNode.appendChild(warning); - }, - // Add clock widget to a given field - addClock: function(inp) { - const num = DateTimeShortcuts.clockInputs.length; - DateTimeShortcuts.clockInputs[num] = inp; - DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; }; - - // Shortcut links (clock icon and "Now" link) - const shortcuts_span = document.createElement('span'); - shortcuts_span.className = DateTimeShortcuts.shortCutsClass; - inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); - const now_link = document.createElement('a'); - now_link.href = "#"; - now_link.textContent = gettext('Now'); - now_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleClockQuicklink(num, -1); - }); - const clock_link = document.createElement('a'); - clock_link.href = '#'; - clock_link.id = DateTimeShortcuts.clockLinkName + num; - clock_link.addEventListener('click', function(e) { - e.preventDefault(); - // avoid triggering the document click handler to dismiss the clock - e.stopPropagation(); - DateTimeShortcuts.openClock(num); - }); - - quickElement( - 'span', clock_link, '', - 'class', 'clock-icon', - 'title', gettext('Choose a Time') - ); - shortcuts_span.appendChild(document.createTextNode('\u00A0')); - shortcuts_span.appendChild(now_link); - shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); - shortcuts_span.appendChild(clock_link); - - // Create clock link div - // - // Markup looks like: - // <div id="clockbox1" class="clockbox module"> - // <h2>Choose a time</h2> - // <ul class="timelist"> - // <li><a href="#">Now</a></li> - // <li><a href="#">Midnight</a></li> - // <li><a href="#">6 a.m.</a></li> - // <li><a href="#">Noon</a></li> - // <li><a href="#">6 p.m.</a></li> - // </ul> - // <p class="calendar-cancel"><a href="#">Cancel</a></p> - // </div> - - const clock_box = document.createElement('div'); - clock_box.style.display = 'none'; - clock_box.style.position = 'absolute'; - clock_box.className = 'clockbox module'; - clock_box.id = DateTimeShortcuts.clockDivName + num; - document.body.appendChild(clock_box); - clock_box.addEventListener('click', function(e) { e.stopPropagation(); }); - - quickElement('h2', clock_box, gettext('Choose a time')); - const time_list = quickElement('ul', clock_box); - time_list.className = 'timelist'; - // The list of choices can be overridden in JavaScript like this: - // DateTimeShortcuts.clockHours.name = [['3 a.m.', 3]]; - // where name is the name attribute of the <input>. - const name = typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined' ? 'default_' : inp.name; - DateTimeShortcuts.clockHours[name].forEach(function(element) { - const time_link = quickElement('a', quickElement('li', time_list), gettext(element[0]), 'href', '#'); - time_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleClockQuicklink(num, element[1]); - }); - }); - - const cancel_p = quickElement('p', clock_box); - cancel_p.className = 'calendar-cancel'; - const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); - cancel_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.dismissClock(num); - }); - - document.addEventListener('keyup', function(event) { - if (event.which === 27) { - // ESC key closes popup - DateTimeShortcuts.dismissClock(num); - event.preventDefault(); - } - }); - }, - openClock: function(num) { - const clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num); - const clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num); - - // Recalculate the clockbox position - // is it left-to-right or right-to-left layout ? - if (window.getComputedStyle(document.body).direction !== 'rtl') { - clock_box.style.left = findPosX(clock_link) + 17 + 'px'; - } - else { - // since style's width is in em, it'd be tough to calculate - // px value of it. let's use an estimated px for now - clock_box.style.left = findPosX(clock_link) - 110 + 'px'; - } - clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'; - - // Show the clock box - clock_box.style.display = 'block'; - document.addEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); - }, - dismissClock: function(num) { - document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none'; - document.removeEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); - }, - handleClockQuicklink: function(num, val) { - let d; - if (val === -1) { - d = DateTimeShortcuts.now(); - } - else { - d = new Date(1970, 1, 1, val, 0, 0, 0); - } - DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]); - DateTimeShortcuts.clockInputs[num].focus(); - DateTimeShortcuts.dismissClock(num); - }, - // Add calendar widget to a given field. - addCalendar: function(inp) { - const num = DateTimeShortcuts.calendars.length; - - DateTimeShortcuts.calendarInputs[num] = inp; - DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; }; - - // Shortcut links (calendar icon and "Today" link) - const shortcuts_span = document.createElement('span'); - shortcuts_span.className = DateTimeShortcuts.shortCutsClass; - inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); - const today_link = document.createElement('a'); - today_link.href = '#'; - today_link.appendChild(document.createTextNode(gettext('Today'))); - today_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, 0); - }); - const cal_link = document.createElement('a'); - cal_link.href = '#'; - cal_link.id = DateTimeShortcuts.calendarLinkName + num; - cal_link.addEventListener('click', function(e) { - e.preventDefault(); - // avoid triggering the document click handler to dismiss the calendar - e.stopPropagation(); - DateTimeShortcuts.openCalendar(num); - }); - quickElement( - 'span', cal_link, '', - 'class', 'date-icon', - 'title', gettext('Choose a Date') - ); - shortcuts_span.appendChild(document.createTextNode('\u00A0')); - shortcuts_span.appendChild(today_link); - shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); - shortcuts_span.appendChild(cal_link); - - // Create calendarbox div. - // - // Markup looks like: - // - // <div id="calendarbox3" class="calendarbox module"> - // <h2> - // <a href="#" class="link-previous">‹</a> - // <a href="#" class="link-next">›</a> February 2003 - // </h2> - // <div class="calendar" id="calendarin3"> - // <!-- (cal) --> - // </div> - // <div class="calendar-shortcuts"> - // <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a> - // </div> - // <p class="calendar-cancel"><a href="#">Cancel</a></p> - // </div> - const cal_box = document.createElement('div'); - cal_box.style.display = 'none'; - cal_box.style.position = 'absolute'; - cal_box.className = 'calendarbox module'; - cal_box.id = DateTimeShortcuts.calendarDivName1 + num; - document.body.appendChild(cal_box); - cal_box.addEventListener('click', function(e) { e.stopPropagation(); }); - - // next-prev links - const cal_nav = quickElement('div', cal_box); - const cal_nav_prev = quickElement('a', cal_nav, '<', 'href', '#'); - cal_nav_prev.className = 'calendarnav-previous'; - cal_nav_prev.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.drawPrev(num); - }); - - const cal_nav_next = quickElement('a', cal_nav, '>', 'href', '#'); - cal_nav_next.className = 'calendarnav-next'; - cal_nav_next.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.drawNext(num); - }); - - // main box - const cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num); - cal_main.className = 'calendar'; - DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num)); - DateTimeShortcuts.calendars[num].drawCurrent(); - - // calendar shortcuts - const shortcuts = quickElement('div', cal_box); - shortcuts.className = 'calendar-shortcuts'; - let day_link = quickElement('a', shortcuts, gettext('Yesterday'), 'href', '#'); - day_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, -1); - }); - shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); - day_link = quickElement('a', shortcuts, gettext('Today'), 'href', '#'); - day_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, 0); - }); - shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); - day_link = quickElement('a', shortcuts, gettext('Tomorrow'), 'href', '#'); - day_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, +1); - }); - - // cancel bar - const cancel_p = quickElement('p', cal_box); - cancel_p.className = 'calendar-cancel'; - const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); - cancel_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.dismissCalendar(num); - }); - document.addEventListener('keyup', function(event) { - if (event.which === 27) { - // ESC key closes popup - DateTimeShortcuts.dismissCalendar(num); - event.preventDefault(); - } - }); - }, - openCalendar: function(num) { - const cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num); - const cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num); - const inp = DateTimeShortcuts.calendarInputs[num]; - - // Determine if the current value in the input has a valid date. - // If so, draw the calendar with that date's year and month. - if (inp.value) { - const format = get_format('DATE_INPUT_FORMATS')[0]; - const selected = inp.value.strptime(format); - const year = selected.getUTCFullYear(); - const month = selected.getUTCMonth() + 1; - const re = /\d{4}/; - if (re.test(year.toString()) && month >= 1 && month <= 12) { - DateTimeShortcuts.calendars[num].drawDate(month, year, selected); - } - } - - // Recalculate the clockbox position - // is it left-to-right or right-to-left layout ? - if (window.getComputedStyle(document.body).direction !== 'rtl') { - cal_box.style.left = findPosX(cal_link) + 17 + 'px'; - } - else { - // since style's width is in em, it'd be tough to calculate - // px value of it. let's use an estimated px for now - cal_box.style.left = findPosX(cal_link) - 180 + 'px'; - } - cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px'; - - cal_box.style.display = 'block'; - document.addEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); - }, - dismissCalendar: function(num) { - document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; - document.removeEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); - }, - drawPrev: function(num) { - DateTimeShortcuts.calendars[num].drawPreviousMonth(); - }, - drawNext: function(num) { - DateTimeShortcuts.calendars[num].drawNextMonth(); - }, - handleCalendarCallback: function(num) { - const format = get_format('DATE_INPUT_FORMATS')[0]; - return function(y, m, d) { - DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format); - DateTimeShortcuts.calendarInputs[num].focus(); - document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; - }; - }, - handleCalendarQuickLink: function(num, offset) { - const d = DateTimeShortcuts.now(); - d.setDate(d.getDate() + offset); - DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]); - DateTimeShortcuts.calendarInputs[num].focus(); - DateTimeShortcuts.dismissCalendar(num); - } - }; - - window.addEventListener('load', DateTimeShortcuts.init); - window.DateTimeShortcuts = DateTimeShortcuts; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js deleted file mode 100644 index 1fc03c6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js +++ /dev/null @@ -1,252 +0,0 @@ -/*global SelectBox, interpolate*/ -// Handles related-objects functionality: lookup link for raw_id_fields -// and Add Another links. -'use strict'; -{ - const $ = django.jQuery; - let popupIndex = 0; - const relatedWindows = []; - - function dismissChildPopups() { - relatedWindows.forEach(function(win) { - if(!win.closed) { - win.dismissChildPopups(); - win.close(); - } - }); - } - - function setPopupIndex() { - if(document.getElementsByName("_popup").length > 0) { - const index = window.name.lastIndexOf("__") + 2; - popupIndex = parseInt(window.name.substring(index)); - } else { - popupIndex = 0; - } - } - - function addPopupIndex(name) { - return name + "__" + (popupIndex + 1); - } - - function removePopupIndex(name) { - return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), ''); - } - - function showAdminPopup(triggeringLink, name_regexp, add_popup) { - const name = addPopupIndex(triggeringLink.id.replace(name_regexp, '')); - const href = new URL(triggeringLink.href); - if (add_popup) { - href.searchParams.set('_popup', 1); - } - const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); - relatedWindows.push(win); - win.focus(); - return false; - } - - function showRelatedObjectLookupPopup(triggeringLink) { - return showAdminPopup(triggeringLink, /^lookup_/, true); - } - - function dismissRelatedLookupPopup(win, chosenId) { - const name = removePopupIndex(win.name); - const elem = document.getElementById(name); - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + chosenId; - } else { - elem.value = chosenId; - } - $(elem).trigger('change'); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function showRelatedObjectPopup(triggeringLink) { - return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); - } - - function updateRelatedObjectLinks(triggeringLink) { - const $this = $(triggeringLink); - const siblings = $this.nextAll('.view-related, .change-related, .delete-related'); - if (!siblings.length) { - return; - } - const value = $this.val(); - if (value) { - siblings.each(function() { - const elm = $(this); - elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); - elm.removeAttr('aria-disabled'); - }); - } else { - siblings.removeAttr('href'); - siblings.attr('aria-disabled', true); - } - } - - function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr, newId, skipIds = []) { - // After create/edit a model from the options next to the current - // select (+ or :pencil:) update ForeignKey PK of the rest of selects - // in the page. - - const path = win.location.pathname; - // Extract the model from the popup url '.../<model>/add/' or - // '.../<model>/<id>/change/' depending the action (add or change). - const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)]; - // Select elements with a specific model reference and context of "available-source". - const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] [data-context="available-source"]`); - - selectsRelated.forEach(function(select) { - if (currentSelect === select || skipIds && skipIds.includes(select.id)) { - return; - } - - let option = select.querySelector(`option[value="${objId}"]`); - - if (!option) { - option = new Option(newRepr, newId); - select.options.add(option); - // Update SelectBox cache for related fields. - if (window.SelectBox !== undefined && !SelectBox.cache[currentSelect.id]) { - SelectBox.add_to_cache(select.id, option); - SelectBox.redisplay(select.id); - } - return; - } - - option.textContent = newRepr; - option.value = newId; - }); - } - - function dismissAddRelatedObjectPopup(win, newId, newRepr) { - const name = removePopupIndex(win.name); - const elem = document.getElementById(name); - if (elem) { - const elemName = elem.nodeName.toUpperCase(); - if (elemName === 'SELECT') { - elem.options[elem.options.length] = new Option(newRepr, newId, true, true); - updateRelatedSelectsOptions(elem, win, null, newRepr, newId); - } else if (elemName === 'INPUT') { - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + newId; - } else { - elem.value = newId; - } - } - // Trigger a change event to update related links if required. - $(elem).trigger('change'); - } else { - const toId = name + "_to"; - const toElem = document.getElementById(toId); - const o = new Option(newRepr, newId); - SelectBox.add_to_cache(toId, o); - SelectBox.redisplay(toId); - if (toElem && toElem.nodeName.toUpperCase() === 'SELECT') { - const skipIds = [name + "_from"]; - updateRelatedSelectsOptions(toElem, win, null, newRepr, newId, skipIds); - } - } - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { - const id = removePopupIndex(win.name.replace(/^edit_/, '')); - const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); - const selects = $(selectsSelector); - selects.find('option').each(function() { - if (this.value === objId) { - this.textContent = newRepr; - this.value = newId; - } - }).trigger('change'); - updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId); - selects.next().find('.select2-selection__rendered').each(function() { - // The element can have a clear button as a child. - // Use the lastChild to modify only the displayed value. - this.lastChild.textContent = newRepr; - this.title = newRepr; - }); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function dismissDeleteRelatedObjectPopup(win, objId) { - const id = removePopupIndex(win.name.replace(/^delete_/, '')); - const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); - const selects = $(selectsSelector); - selects.find('option').each(function() { - if (this.value === objId) { - $(this).remove(); - } - }).trigger('change'); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; - window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; - window.showRelatedObjectPopup = showRelatedObjectPopup; - window.updateRelatedObjectLinks = updateRelatedObjectLinks; - window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; - window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; - window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; - window.dismissChildPopups = dismissChildPopups; - window.relatedWindows = relatedWindows; - - // Kept for backward compatibility - window.showAddAnotherPopup = showRelatedObjectPopup; - window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; - - window.addEventListener('unload', function(evt) { - window.dismissChildPopups(); - }); - - $(document).ready(function() { - setPopupIndex(); - $("a[data-popup-opener]").on('click', function(event) { - event.preventDefault(); - opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); - }); - $('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) { - e.preventDefault(); - if (this.href) { - const event = $.Event('django:show-related', {href: this.href}); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - showRelatedObjectPopup(this); - } - } - }); - $('body').on('change', '.related-widget-wrapper select', function(e) { - const event = $.Event('django:update-related'); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - updateRelatedObjectLinks(this); - } - }); - $('.related-widget-wrapper select').trigger('change'); - $('body').on('click', '.related-lookup', function(e) { - e.preventDefault(); - const event = $.Event('django:lookup-related'); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - showRelatedObjectLookupPopup(this); - } - }); - }); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/autocomplete.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/autocomplete.js deleted file mode 100644 index d3daeab..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/autocomplete.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; -{ - const $ = django.jQuery; - - $.fn.djangoAdminSelect2 = function() { - $.each(this, function(i, element) { - $(element).select2({ - ajax: { - data: (params) => { - return { - term: params.term, - page: params.page, - app_label: element.dataset.appLabel, - model_name: element.dataset.modelName, - field_name: element.dataset.fieldName - }; - } - } - }); - }); - return this; - }; - - $(function() { - // Initialize all autocomplete widgets except the one in the template - // form used when a new formset is added. - $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); - }); - - document.addEventListener('formset:added', (event) => { - $(event.target).find('.admin-autocomplete').djangoAdminSelect2(); - }); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/calendar.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/calendar.js deleted file mode 100644 index 776310f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/calendar.js +++ /dev/null @@ -1,239 +0,0 @@ -/*global gettext, pgettext, get_format, quickElement, removeChildren*/ -/* -calendar.js - Calendar functions by Adrian Holovaty -depends on core.js for utility functions like removeChildren or quickElement -*/ -'use strict'; -{ - // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions - const CalendarNamespace = { - monthsOfYear: [ - gettext('January'), - gettext('February'), - gettext('March'), - gettext('April'), - gettext('May'), - gettext('June'), - gettext('July'), - gettext('August'), - gettext('September'), - gettext('October'), - gettext('November'), - gettext('December') - ], - monthsOfYearAbbrev: [ - pgettext('abbrev. month January', 'Jan'), - pgettext('abbrev. month February', 'Feb'), - pgettext('abbrev. month March', 'Mar'), - pgettext('abbrev. month April', 'Apr'), - pgettext('abbrev. month May', 'May'), - pgettext('abbrev. month June', 'Jun'), - pgettext('abbrev. month July', 'Jul'), - pgettext('abbrev. month August', 'Aug'), - pgettext('abbrev. month September', 'Sep'), - pgettext('abbrev. month October', 'Oct'), - pgettext('abbrev. month November', 'Nov'), - pgettext('abbrev. month December', 'Dec') - ], - daysOfWeek: [ - gettext('Sunday'), - gettext('Monday'), - gettext('Tuesday'), - gettext('Wednesday'), - gettext('Thursday'), - gettext('Friday'), - gettext('Saturday') - ], - daysOfWeekAbbrev: [ - pgettext('abbrev. day Sunday', 'Sun'), - pgettext('abbrev. day Monday', 'Mon'), - pgettext('abbrev. day Tuesday', 'Tue'), - pgettext('abbrev. day Wednesday', 'Wed'), - pgettext('abbrev. day Thursday', 'Thur'), - pgettext('abbrev. day Friday', 'Fri'), - pgettext('abbrev. day Saturday', 'Sat') - ], - daysOfWeekInitial: [ - pgettext('one letter Sunday', 'S'), - pgettext('one letter Monday', 'M'), - pgettext('one letter Tuesday', 'T'), - pgettext('one letter Wednesday', 'W'), - pgettext('one letter Thursday', 'T'), - pgettext('one letter Friday', 'F'), - pgettext('one letter Saturday', 'S') - ], - firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), - isLeapYear: function(year) { - return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0)); - }, - getDaysInMonth: function(month, year) { - let days; - if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) { - days = 31; - } - else if (month === 4 || month === 6 || month === 9 || month === 11) { - days = 30; - } - else if (month === 2 && CalendarNamespace.isLeapYear(year)) { - days = 29; - } - else { - days = 28; - } - return days; - }, - draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999 - const today = new Date(); - const todayDay = today.getDate(); - const todayMonth = today.getMonth() + 1; - const todayYear = today.getFullYear(); - let todayClass = ''; - - // Use UTC functions here because the date field does not contain time - // and using the UTC function variants prevent the local time offset - // from altering the date, specifically the day field. For example: - // - // ``` - // var x = new Date('2013-10-02'); - // var day = x.getDate(); - // ``` - // - // The day variable above will be 1 instead of 2 in, say, US Pacific time - // zone. - let isSelectedMonth = false; - if (typeof selected !== 'undefined') { - isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); - } - - month = parseInt(month); - year = parseInt(year); - const calDiv = document.getElementById(div_id); - removeChildren(calDiv); - const calTable = document.createElement('table'); - quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); - const tableBody = quickElement('tbody', calTable); - - // Draw days-of-week header - let tableRow = quickElement('tr', tableBody); - for (let i = 0; i < 7; i++) { - quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]); - } - - const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); - const days = CalendarNamespace.getDaysInMonth(month, year); - - let nonDayCell; - - // Draw blanks before first of month - tableRow = quickElement('tr', tableBody); - for (let i = 0; i < startingPos; i++) { - nonDayCell = quickElement('td', tableRow, ' '); - nonDayCell.className = "nonday"; - } - - function calendarMonth(y, m) { - function onClick(e) { - e.preventDefault(); - callback(y, m, this.textContent); - } - return onClick; - } - - // Draw days of month - let currentDay = 1; - for (let i = startingPos; currentDay <= days; i++) { - if (i % 7 === 0 && currentDay !== 1) { - tableRow = quickElement('tr', tableBody); - } - if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) { - todayClass = 'today'; - } else { - todayClass = ''; - } - - // use UTC function; see above for explanation. - if (isSelectedMonth && currentDay === selected.getUTCDate()) { - if (todayClass !== '') { - todayClass += " "; - } - todayClass += "selected"; - } - - const cell = quickElement('td', tableRow, '', 'class', todayClass); - const link = quickElement('a', cell, currentDay, 'href', '#'); - link.addEventListener('click', calendarMonth(year, month)); - currentDay++; - } - - // Draw blanks after end of month (optional, but makes for valid code) - while (tableRow.childNodes.length < 7) { - nonDayCell = quickElement('td', tableRow, ' '); - nonDayCell.className = "nonday"; - } - - calDiv.appendChild(calTable); - } - }; - - // Calendar -- A calendar instance - function Calendar(div_id, callback, selected) { - // div_id (string) is the ID of the element in which the calendar will - // be displayed - // callback (string) is the name of a JavaScript function that will be - // called with the parameters (year, month, day) when a day in the - // calendar is clicked - this.div_id = div_id; - this.callback = callback; - this.today = new Date(); - this.currentMonth = this.today.getMonth() + 1; - this.currentYear = this.today.getFullYear(); - if (typeof selected !== 'undefined') { - this.selected = selected; - } - } - Calendar.prototype = { - drawCurrent: function() { - CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); - }, - drawDate: function(month, year, selected) { - this.currentMonth = month; - this.currentYear = year; - - if(selected) { - this.selected = selected; - } - - this.drawCurrent(); - }, - drawPreviousMonth: function() { - if (this.currentMonth === 1) { - this.currentMonth = 12; - this.currentYear--; - } - else { - this.currentMonth--; - } - this.drawCurrent(); - }, - drawNextMonth: function() { - if (this.currentMonth === 12) { - this.currentMonth = 1; - this.currentYear++; - } - else { - this.currentMonth++; - } - this.drawCurrent(); - }, - drawPreviousYear: function() { - this.currentYear--; - this.drawCurrent(); - }, - drawNextYear: function() { - this.currentYear++; - this.drawCurrent(); - } - }; - window.Calendar = Calendar; - window.CalendarNamespace = CalendarNamespace; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/cancel.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/cancel.js deleted file mode 100644 index 3069c6f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/cancel.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; -{ - // Call function fn when the DOM is loaded and ready. If it is already - // loaded, call the function now. - // http://youmightnotneedjquery.com/#ready - function ready(fn) { - if (document.readyState !== 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } - } - - ready(function() { - function handleClick(event) { - event.preventDefault(); - const params = new URLSearchParams(window.location.search); - if (params.has('_popup')) { - window.close(); // Close the popup. - } else { - window.history.back(); // Otherwise, go back. - } - } - - document.querySelectorAll('.cancel-link').forEach(function(el) { - el.addEventListener('click', handleClick); - }); - }); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/change_form.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/change_form.js deleted file mode 100644 index 96a4c62..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/change_form.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; -{ - const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']; - const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName; - if (modelName) { - const form = document.getElementById(modelName + '_form'); - for (const element of form.elements) { - // HTMLElement.offsetParent returns null when the element is not - // rendered. - if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) { - element.focus(); - break; - } - } - } -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/core.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/core.js deleted file mode 100644 index 10504d4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/core.js +++ /dev/null @@ -1,184 +0,0 @@ -// Core JavaScript helper functions -'use strict'; - -// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); -function quickElement() { - const obj = document.createElement(arguments[0]); - if (arguments[2]) { - const textNode = document.createTextNode(arguments[2]); - obj.appendChild(textNode); - } - const len = arguments.length; - for (let i = 3; i < len; i += 2) { - obj.setAttribute(arguments[i], arguments[i + 1]); - } - arguments[1].appendChild(obj); - return obj; -} - -// "a" is reference to an object -function removeChildren(a) { - while (a.hasChildNodes()) { - a.removeChild(a.lastChild); - } -} - -// ---------------------------------------------------------------------------- -// Find-position functions by PPK -// See https://www.quirksmode.org/js/findpos.html -// ---------------------------------------------------------------------------- -function findPosX(obj) { - let curleft = 0; - if (obj.offsetParent) { - while (obj.offsetParent) { - curleft += obj.offsetLeft - obj.scrollLeft; - obj = obj.offsetParent; - } - } else if (obj.x) { - curleft += obj.x; - } - return curleft; -} - -function findPosY(obj) { - let curtop = 0; - if (obj.offsetParent) { - while (obj.offsetParent) { - curtop += obj.offsetTop - obj.scrollTop; - obj = obj.offsetParent; - } - } else if (obj.y) { - curtop += obj.y; - } - return curtop; -} - -//----------------------------------------------------------------------------- -// Date object extensions -// ---------------------------------------------------------------------------- -{ - Date.prototype.getTwelveHours = function() { - return this.getHours() % 12 || 12; - }; - - Date.prototype.getTwoDigitMonth = function() { - return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1); - }; - - Date.prototype.getTwoDigitDate = function() { - return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); - }; - - Date.prototype.getTwoDigitTwelveHour = function() { - return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); - }; - - Date.prototype.getTwoDigitHour = function() { - return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); - }; - - Date.prototype.getTwoDigitMinute = function() { - return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); - }; - - Date.prototype.getTwoDigitSecond = function() { - return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); - }; - - Date.prototype.getAbbrevDayName = function() { - return typeof window.CalendarNamespace === "undefined" - ? '0' + this.getDay() - : window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()]; - }; - - Date.prototype.getFullDayName = function() { - return typeof window.CalendarNamespace === "undefined" - ? '0' + this.getDay() - : window.CalendarNamespace.daysOfWeek[this.getDay()]; - }; - - Date.prototype.getAbbrevMonthName = function() { - return typeof window.CalendarNamespace === "undefined" - ? this.getTwoDigitMonth() - : window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()]; - }; - - Date.prototype.getFullMonthName = function() { - return typeof window.CalendarNamespace === "undefined" - ? this.getTwoDigitMonth() - : window.CalendarNamespace.monthsOfYear[this.getMonth()]; - }; - - Date.prototype.strftime = function(format) { - const fields = { - a: this.getAbbrevDayName(), - A: this.getFullDayName(), - b: this.getAbbrevMonthName(), - B: this.getFullMonthName(), - c: this.toString(), - d: this.getTwoDigitDate(), - H: this.getTwoDigitHour(), - I: this.getTwoDigitTwelveHour(), - m: this.getTwoDigitMonth(), - M: this.getTwoDigitMinute(), - p: (this.getHours() >= 12) ? 'PM' : 'AM', - S: this.getTwoDigitSecond(), - w: '0' + this.getDay(), - x: this.toLocaleDateString(), - X: this.toLocaleTimeString(), - y: ('' + this.getFullYear()).substr(2, 4), - Y: '' + this.getFullYear(), - '%': '%' - }; - let result = '', i = 0; - while (i < format.length) { - if (format.charAt(i) === '%') { - result += fields[format.charAt(i + 1)]; - ++i; - } - else { - result += format.charAt(i); - } - ++i; - } - return result; - }; - - // ---------------------------------------------------------------------------- - // String object extensions - // ---------------------------------------------------------------------------- - String.prototype.strptime = function(format) { - const split_format = format.split(/[.\-/]/); - const date = this.split(/[.\-/]/); - let i = 0; - let day, month, year; - while (i < split_format.length) { - switch (split_format[i]) { - case "%d": - day = date[i]; - break; - case "%m": - month = date[i] - 1; - break; - case "%Y": - year = date[i]; - break; - case "%y": - // A %y value in the range of [00, 68] is in the current - // century, while [69, 99] is in the previous century, - // according to the Open Group Specification. - if (parseInt(date[i], 10) >= 69) { - year = date[i]; - } else { - year = (new Date(Date.UTC(date[i], 0))).getUTCFullYear() + 100; - } - break; - } - ++i; - } - // Create Date object from UTC since the parsed value is supposed to be - // in UTC, not local time. Also, the calendar uses UTC functions for - // date extraction. - return new Date(Date.UTC(year, month, day)); - }; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/filters.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/filters.js deleted file mode 100644 index f5536eb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/filters.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Persist changelist filters state (collapsed/expanded). - */ -'use strict'; -{ - // Init filters. - let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState')); - - if (!filters) { - filters = {}; - } - - Object.entries(filters).forEach(([key, value]) => { - const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`); - - // Check if the filter is present, it could be from other view. - if (detailElement) { - value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open'); - } - }); - - // Save filter state when clicks. - const details = document.querySelectorAll('details'); - details.forEach(detail => { - detail.addEventListener('toggle', event => { - filters[`${event.target.dataset.filterTitle}`] = detail.open; - sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters)); - }); - }); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/inlines.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/inlines.js deleted file mode 100644 index cd3726c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/inlines.js +++ /dev/null @@ -1,359 +0,0 @@ -/*global DateTimeShortcuts, SelectFilter*/ -/** - * Django admin inlines - * - * Based on jQuery Formset 1.1 - * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com) - * @requires jQuery 1.2.6 or later - * - * Copyright (c) 2009, Stanislaus Madueke - * All rights reserved. - * - * Spiced up with Code from Zain Memon's GSoC project 2009 - * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip. - * - * Licensed under the New BSD License - * See: https://opensource.org/licenses/bsd-license.php - */ -'use strict'; -{ - const $ = django.jQuery; - $.fn.formset = function(opts) { - const options = $.extend({}, $.fn.formset.defaults, opts); - const $this = $(this); - const $parent = $this.parent(); - const updateElementIndex = function(el, prefix, ndx) { - const id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); - const replacement = prefix + "-" + ndx; - if ($(el).prop("for")) { - $(el).prop("for", $(el).prop("for").replace(id_regex, replacement)); - } - if (el.id) { - el.id = el.id.replace(id_regex, replacement); - } - if (el.name) { - el.name = el.name.replace(id_regex, replacement); - } - }; - const totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"); - let nextIndex = parseInt(totalForms.val(), 10); - const maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"); - const minForms = $("#id_" + options.prefix + "-MIN_NUM_FORMS").prop("autocomplete", "off"); - let addButton; - - /** - * The "Add another MyModel" button below the inline forms. - */ - const addInlineAddButton = function() { - if (addButton === null) { - if ($this.prop("tagName") === "TR") { - // If forms are laid out as table rows, insert the - // "add" button in a new table row: - const numCols = $this.eq(-1).children().length; - $parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a role="button" class="addlink" href="#">' + options.addText + "</a></tr>"); - addButton = $parent.find("tr:last a"); - } else { - // Otherwise, insert it immediately after the last form: - $this.filter(":last").after('<div class="' + options.addCssClass + '"><a role="button" class="addlink" href="#">' + options.addText + "</a></div>"); - addButton = $this.filter(":last").next().find("a"); - } - } - addButton.on('click', addInlineClickHandler); - }; - - const addInlineClickHandler = function(e) { - e.preventDefault(); - const template = $("#" + options.prefix + "-empty"); - const row = template.clone(true); - row.removeClass(options.emptyCssClass) - .addClass(options.formCssClass) - .attr("id", options.prefix + "-" + nextIndex); - addInlineDeleteButton(row); - row.find("*").each(function() { - updateElementIndex(this, options.prefix, totalForms.val()); - }); - // Insert the new form when it has been fully edited. - row.insertBefore($(template)); - // Update number of total forms. - $(totalForms).val(parseInt(totalForms.val(), 10) + 1); - nextIndex += 1; - // Hide the add button if there's a limit and it's been reached. - if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) { - addButton.parent().hide(); - } - // Show the remove buttons if there are more than min_num. - toggleDeleteButtonVisibility(row.closest('.inline-group')); - - // Pass the new form to the post-add callback, if provided. - if (options.added) { - options.added(row); - } - row.get(0).dispatchEvent(new CustomEvent("formset:added", { - bubbles: true, - detail: { - formsetName: options.prefix - } - })); - }; - - /** - * The "X" button that is part of every unsaved inline. - * (When saved, it is replaced with a "Delete" checkbox.) - */ - const addInlineDeleteButton = function(row) { - if (row.is("tr")) { - // If the forms are laid out in table rows, insert - // the remove button into the last table cell: - row.children(":last").append('<div><a role="button" class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></div>"); - } else if (row.is("ul") || row.is("ol")) { - // If they're laid out as an ordered/unordered list, - // insert an <li> after the last list item: - row.append('<li><a role="button" class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></li>"); - } else { - // Otherwise, just insert the remove button as the - // last child element of the form's container: - row.children(":first").append('<span><a role="button" class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></span>"); - } - // Add delete handler for each row. - row.find("a." + options.deleteCssClass).on('click', inlineDeleteHandler.bind(this)); - }; - - const inlineDeleteHandler = function(e1) { - e1.preventDefault(); - const deleteButton = $(e1.target); - const row = deleteButton.closest('.' + options.formCssClass); - const inlineGroup = row.closest('.inline-group'); - // Remove the parent form containing this button, - // and also remove the relevant row with non-field errors: - const prevRow = row.prev(); - if (prevRow.length && prevRow.hasClass('row-form-errors')) { - prevRow.remove(); - } - row.remove(); - nextIndex -= 1; - // Pass the deleted form to the post-delete callback, if provided. - if (options.removed) { - options.removed(row); - } - document.dispatchEvent(new CustomEvent("formset:removed", { - detail: { - formsetName: options.prefix - } - })); - // Update the TOTAL_FORMS form count. - const forms = $("." + options.formCssClass); - $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); - // Show add button again once below maximum number. - if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) { - addButton.parent().show(); - } - // Hide the remove buttons if at min_num. - toggleDeleteButtonVisibility(inlineGroup); - // Also, update names and ids for all remaining form controls so - // they remain in sequence: - let i, formCount; - const updateElementCallback = function() { - updateElementIndex(this, options.prefix, i); - }; - for (i = 0, formCount = forms.length; i < formCount; i++) { - updateElementIndex($(forms).get(i), options.prefix, i); - $(forms.get(i)).find("*").each(updateElementCallback); - } - }; - - const toggleDeleteButtonVisibility = function(inlineGroup) { - if ((minForms.val() !== '') && (minForms.val() - totalForms.val()) >= 0) { - inlineGroup.find('.inline-deletelink').hide(); - } else { - inlineGroup.find('.inline-deletelink').show(); - } - }; - - $this.each(function(i) { - $(this).not("." + options.emptyCssClass).addClass(options.formCssClass); - }); - - // Create the delete buttons for all unsaved inlines: - $this.filter('.' + options.formCssClass + ':not(.has_original):not(.' + options.emptyCssClass + ')').each(function() { - addInlineDeleteButton($(this)); - }); - toggleDeleteButtonVisibility($this); - - // Create the add button, initially hidden. - addButton = options.addButton; - addInlineAddButton(); - - // Show the add button if allowed to add more items. - // Note that max_num = None translates to a blank string. - const showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0; - if ($this.length && showAddButton) { - addButton.parent().show(); - } else { - addButton.parent().hide(); - } - - return this; - }; - - /* Setup plugin defaults */ - $.fn.formset.defaults = { - prefix: "form", // The form prefix for your django formset - addText: "add another", // Text for the add link - deleteText: "remove", // Text for the delete link - addCssClass: "add-row", // CSS class applied to the add link - deleteCssClass: "delete-row", // CSS class applied to the delete link - emptyCssClass: "empty-row", // CSS class applied to the empty row - formCssClass: "dynamic-form", // CSS class applied to each form in a formset - added: null, // Function called each time a new form is added - removed: null, // Function called each time a form is deleted - addButton: null // Existing add button to use - }; - - - // Tabular inlines --------------------------------------------------------- - $.fn.tabularFormset = function(selector, options) { - const $rows = $(this); - - const reinitDateTimeShortCuts = function() { - // Reinitialize the calendar and clock widgets by force - if (typeof DateTimeShortcuts !== "undefined") { - $(".datetimeshortcuts").remove(); - DateTimeShortcuts.init(); - } - }; - - const updateSelectFilter = function() { - // If any SelectFilter widgets are a part of the new form, - // instantiate a new SelectFilter instance for it. - if (typeof SelectFilter !== 'undefined') { - $('.selectfilter').each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, false); - }); - $('.selectfilterstacked').each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, true); - }); - } - }; - - const initPrepopulatedFields = function(row) { - row.find('.prepopulated_field').each(function() { - const field = $(this), - input = field.find('input, select, textarea'), - dependency_list = input.data('dependency_list') || [], - dependencies = []; - $.each(dependency_list, function(i, field_name) { - dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id')); - }); - if (dependencies.length) { - input.prepopulate(dependencies, input.attr('maxlength')); - } - }); - }; - - $rows.formset({ - prefix: options.prefix, - addText: options.addText, - formCssClass: "dynamic-" + options.prefix, - deleteCssClass: "inline-deletelink", - deleteText: options.deleteText, - emptyCssClass: "empty-form", - added: function(row) { - initPrepopulatedFields(row); - reinitDateTimeShortCuts(); - updateSelectFilter(); - }, - addButton: options.addButton - }); - - return $rows; - }; - - // Stacked inlines --------------------------------------------------------- - $.fn.stackedFormset = function(selector, options) { - const $rows = $(this); - const updateInlineLabel = function(row) { - $(selector).find(".inline_label").each(function(i) { - const count = i + 1; - $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); - }); - }; - - const reinitDateTimeShortCuts = function() { - // Reinitialize the calendar and clock widgets by force, yuck. - if (typeof DateTimeShortcuts !== "undefined") { - $(".datetimeshortcuts").remove(); - DateTimeShortcuts.init(); - } - }; - - const updateSelectFilter = function() { - // If any SelectFilter widgets were added, instantiate a new instance. - if (typeof SelectFilter !== "undefined") { - $(".selectfilter").each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, false); - }); - $(".selectfilterstacked").each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, true); - }); - } - }; - - const initPrepopulatedFields = function(row) { - row.find('.prepopulated_field').each(function() { - const field = $(this), - input = field.find('input, select, textarea'), - dependency_list = input.data('dependency_list') || [], - dependencies = []; - $.each(dependency_list, function(i, field_name) { - // Dependency in a fieldset. - let field_element = row.find('.form-row .field-' + field_name); - // Dependency without a fieldset. - if (!field_element.length) { - field_element = row.find('.form-row.field-' + field_name); - } - dependencies.push('#' + field_element.find('input, select, textarea').attr('id')); - }); - if (dependencies.length) { - input.prepopulate(dependencies, input.attr('maxlength')); - } - }); - }; - - $rows.formset({ - prefix: options.prefix, - addText: options.addText, - formCssClass: "dynamic-" + options.prefix, - deleteCssClass: "inline-deletelink", - deleteText: options.deleteText, - emptyCssClass: "empty-form", - removed: updateInlineLabel, - added: function(row) { - initPrepopulatedFields(row); - reinitDateTimeShortCuts(); - updateSelectFilter(); - updateInlineLabel(row); - }, - addButton: options.addButton - }); - - return $rows; - }; - - $(document).ready(function() { - $(".js-inline-admin-formset").each(function() { - const data = $(this).data(), - inlineOptions = data.inlineFormset; - let selector; - switch(data.inlineType) { - case "stacked": - selector = inlineOptions.name + "-group .inline-related"; - $(selector).stackedFormset(selector, inlineOptions.options); - break; - case "tabular": - selector = inlineOptions.name + "-group .tabular.inline-related tbody:first > tr.form-row"; - $(selector).tabularFormset(selector, inlineOptions.options); - break; - } - }); - }); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/jquery.init.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/jquery.init.js deleted file mode 100644 index f40b27f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/jquery.init.js +++ /dev/null @@ -1,8 +0,0 @@ -/*global jQuery:false*/ -'use strict'; -/* Puts the included jQuery into our own namespace using noConflict and passing - * it 'true'. This ensures that the included jQuery doesn't pollute the global - * namespace (i.e. this preserves pre-existing values for both window.$ and - * window.jQuery). - */ -window.django = {jQuery: jQuery.noConflict(true)}; diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/nav_sidebar.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/nav_sidebar.js deleted file mode 100644 index 7e735db..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/nav_sidebar.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; -{ - const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); - if (toggleNavSidebar !== null) { - const navSidebar = document.getElementById('nav-sidebar'); - const main = document.getElementById('main'); - let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); - if (navSidebarIsOpen === null) { - navSidebarIsOpen = 'true'; - } - main.classList.toggle('shifted', navSidebarIsOpen === 'true'); - navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); - - toggleNavSidebar.addEventListener('click', function() { - if (navSidebarIsOpen === 'true') { - navSidebarIsOpen = 'false'; - } else { - navSidebarIsOpen = 'true'; - } - localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); - main.classList.toggle('shifted'); - navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); - }); - } - - function initSidebarQuickFilter() { - const options = []; - const navSidebar = document.getElementById('nav-sidebar'); - if (!navSidebar) { - return; - } - navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => { - options.push({title: container.innerHTML, node: container}); - }); - - function checkValue(event) { - let filterValue = event.target.value; - if (filterValue) { - filterValue = filterValue.toLowerCase(); - } - if (event.key === 'Escape') { - filterValue = ''; - event.target.value = ''; // clear input - } - let matches = false; - for (const o of options) { - let displayValue = ''; - if (filterValue) { - if (o.title.toLowerCase().indexOf(filterValue) === -1) { - displayValue = 'none'; - } else { - matches = true; - } - } - // show/hide parent <TR> - o.node.parentNode.parentNode.style.display = displayValue; - } - if (!filterValue || matches) { - event.target.classList.remove('no-results'); - } else { - event.target.classList.add('no-results'); - } - sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue); - } - - const nav = document.getElementById('nav-filter'); - nav.addEventListener('change', checkValue, false); - nav.addEventListener('input', checkValue, false); - nav.addEventListener('keyup', checkValue, false); - - const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue'); - if (storedValue) { - nav.value = storedValue; - checkValue({target: nav, key: ''}); - } - } - window.initSidebarQuickFilter = initSidebarQuickFilter; - initSidebarQuickFilter(); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/popup_response.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/popup_response.js deleted file mode 100644 index fecf0f4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/popup_response.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; -{ - const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); - switch(initData.action) { - case 'change': - opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); - break; - case 'delete': - opener.dismissDeleteRelatedObjectPopup(window, initData.value); - break; - default: - opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); - break; - } -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/prepopulate.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/prepopulate.js deleted file mode 100644 index 89e95ab..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/prepopulate.js +++ /dev/null @@ -1,43 +0,0 @@ -/*global URLify*/ -'use strict'; -{ - const $ = django.jQuery; - $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { - /* - Depends on urlify.js - Populates a selected field with the values of the dependent fields, - URLifies and shortens the string. - dependencies - array of dependent fields ids - maxLength - maximum length of the URLify'd string - allowUnicode - Unicode support of the URLify'd string - */ - return this.each(function() { - const prepopulatedField = $(this); - - const populate = function() { - // Bail if the field's value has been changed by the user - if (prepopulatedField.data('_changed')) { - return; - } - - const values = []; - $.each(dependencies, function(i, field) { - field = $(field); - if (field.val().length > 0) { - values.push(field.val()); - } - }); - prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); - }; - - prepopulatedField.data('_changed', false); - prepopulatedField.on('change', function() { - prepopulatedField.data('_changed', true); - }); - - if (!prepopulatedField.val()) { - $(dependencies.join(',')).on('keyup change focus', populate); - } - }); - }; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/prepopulate_init.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/prepopulate_init.js deleted file mode 100644 index a58841f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/prepopulate_init.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; -{ - const $ = django.jQuery; - const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); - $.each(fields, function(index, field) { - $( - '.empty-form .form-row .field-' + field.name + - ', .empty-form.form-row .field-' + field.name + - ', .empty-form .form-row.field-' + field.name - ).addClass('prepopulated_field'); - $(field.id).data('dependency_list', field.dependency_list).prepopulate( - field.dependency_ids, field.maxLength, field.allowUnicode - ); - }); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/theme.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/theme.js deleted file mode 100644 index e79d375..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/theme.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; -{ - function setTheme(mode) { - if (mode !== "light" && mode !== "dark" && mode !== "auto") { - console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`); - mode = "auto"; - } - document.documentElement.dataset.theme = mode; - localStorage.setItem("theme", mode); - } - - function cycleTheme() { - const currentTheme = localStorage.getItem("theme") || "auto"; - const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; - - if (prefersDark) { - // Auto (dark) -> Light -> Dark - if (currentTheme === "auto") { - setTheme("light"); - } else if (currentTheme === "light") { - setTheme("dark"); - } else { - setTheme("auto"); - } - } else { - // Auto (light) -> Dark -> Light - if (currentTheme === "auto") { - setTheme("dark"); - } else if (currentTheme === "dark") { - setTheme("light"); - } else { - setTheme("auto"); - } - } - } - - function initTheme() { - // set theme defined in localStorage if there is one, or fallback to auto mode - const currentTheme = localStorage.getItem("theme"); - currentTheme ? setTheme(currentTheme) : setTheme("auto"); - } - - window.addEventListener('load', function(_) { - const buttons = document.getElementsByClassName("theme-toggle"); - Array.from(buttons).forEach((btn) => { - btn.addEventListener("click", cycleTheme); - }); - }); - - initTheme(); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/unusable_password_field.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/unusable_password_field.js deleted file mode 100644 index ec26238..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/unusable_password_field.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; -// Fallback JS for browsers which do not support :has selector used in -// admin/css/unusable_password_fields.css -// Remove file once all supported browsers support :has selector -try { - // If browser does not support :has selector this will raise an error - document.querySelector("form:has(input)"); -} catch (error) { - console.log("Defaulting to javascript for usable password form management: " + error); - // JS replacement for unsupported :has selector - document.querySelectorAll('input[name="usable_password"]').forEach(option => { - option.addEventListener('change', function() { - const usablePassword = (this.value === "true" ? this.checked : !this.checked); - const submit1 = document.querySelector('input[type="submit"].set-password'); - const submit2 = document.querySelector('input[type="submit"].unset-password'); - const messages = document.querySelector('#id_unusable_warning'); - document.getElementById('id_password1').closest('.form-row').hidden = !usablePassword; - document.getElementById('id_password2').closest('.form-row').hidden = !usablePassword; - if (messages) { - messages.hidden = usablePassword; - } - if (submit1 && submit2) { - submit1.hidden = !usablePassword; - submit2.hidden = usablePassword; - } - }); - option.dispatchEvent(new Event('change')); - }); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/urlify.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/urlify.js deleted file mode 100644 index 9fc0409..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/urlify.js +++ /dev/null @@ -1,169 +0,0 @@ -/*global XRegExp*/ -'use strict'; -{ - const LATIN_MAP = { - 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', - 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', - 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', - 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', - 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a', - 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', - 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', - 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', - 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', - 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y' - }; - const LATIN_SYMBOLS_MAP = { - '©': '(c)' - }; - const GREEK_MAP = { - 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', - 'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3', - 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', - 'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o', - 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y', - 'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', - 'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N', - 'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', - 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I', - 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y' - }; - const TURKISH_MAP = { - 'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u', - 'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G' - }; - const ROMANIAN_MAP = { - 'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a', - 'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A' - }; - const RUSSIAN_MAP = { - 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', - 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', - 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', - 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '', - 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya', - 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', - 'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', - 'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', - 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '', - 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya' - }; - const UKRAINIAN_MAP = { - 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i', - 'ї': 'yi', 'ґ': 'g' - }; - const CZECH_MAP = { - 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't', - 'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R', - 'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z' - }; - const SLOVAK_MAP = { - 'á': 'a', 'ä': 'a', 'č': 'c', 'ď': 'd', 'é': 'e', 'í': 'i', 'ľ': 'l', - 'ĺ': 'l', 'ň': 'n', 'ó': 'o', 'ô': 'o', 'ŕ': 'r', 'š': 's', 'ť': 't', - 'ú': 'u', 'ý': 'y', 'ž': 'z', - 'Á': 'a', 'Ä': 'A', 'Č': 'C', 'Ď': 'D', 'É': 'E', 'Í': 'I', 'Ľ': 'L', - 'Ĺ': 'L', 'Ň': 'N', 'Ó': 'O', 'Ô': 'O', 'Ŕ': 'R', 'Š': 'S', 'Ť': 'T', - 'Ú': 'U', 'Ý': 'Y', 'Ž': 'Z' - }; - const POLISH_MAP = { - 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's', - 'ź': 'z', 'ż': 'z', - 'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S', - 'Ź': 'Z', 'Ż': 'Z' - }; - const LATVIAN_MAP = { - 'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l', - 'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z', - 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L', - 'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z' - }; - const ARABIC_MAP = { - 'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd', - 'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't', - 'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm', - 'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y' - }; - const LITHUANIAN_MAP = { - 'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u', - 'ū': 'u', 'ž': 'z', - 'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U', - 'Ū': 'U', 'Ž': 'Z' - }; - const SERBIAN_MAP = { - 'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz', - 'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C', - 'Џ': 'Dz', 'Đ': 'Dj' - }; - const AZERBAIJANI_MAP = { - 'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u', - 'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U' - }; - const GEORGIAN_MAP = { - 'ა': 'a', 'ბ': 'b', 'გ': 'g', 'დ': 'd', 'ე': 'e', 'ვ': 'v', 'ზ': 'z', - 'თ': 't', 'ი': 'i', 'კ': 'k', 'ლ': 'l', 'მ': 'm', 'ნ': 'n', 'ო': 'o', - 'პ': 'p', 'ჟ': 'j', 'რ': 'r', 'ს': 's', 'ტ': 't', 'უ': 'u', 'ფ': 'f', - 'ქ': 'q', 'ღ': 'g', 'ყ': 'y', 'შ': 'sh', 'ჩ': 'ch', 'ც': 'c', 'ძ': 'dz', - 'წ': 'w', 'ჭ': 'ch', 'ხ': 'x', 'ჯ': 'j', 'ჰ': 'h' - }; - - const ALL_DOWNCODE_MAPS = [ - LATIN_MAP, - LATIN_SYMBOLS_MAP, - GREEK_MAP, - TURKISH_MAP, - ROMANIAN_MAP, - RUSSIAN_MAP, - UKRAINIAN_MAP, - CZECH_MAP, - SLOVAK_MAP, - POLISH_MAP, - LATVIAN_MAP, - ARABIC_MAP, - LITHUANIAN_MAP, - SERBIAN_MAP, - AZERBAIJANI_MAP, - GEORGIAN_MAP - ]; - - const Downcoder = { - 'Initialize': function() { - if (Downcoder.map) { // already made - return; - } - Downcoder.map = {}; - for (const lookup of ALL_DOWNCODE_MAPS) { - Object.assign(Downcoder.map, lookup); - } - Downcoder.regex = new RegExp(Object.keys(Downcoder.map).join('|'), 'g'); - } - }; - - function downcode(slug) { - Downcoder.Initialize(); - return slug.replace(Downcoder.regex, function(m) { - return Downcoder.map[m]; - }); - } - - - function URLify(s, num_chars, allowUnicode) { - // changes, e.g., "Petty theft" to "petty-theft" - if (!allowUnicode) { - s = downcode(s); - } - s = s.toLowerCase(); // convert to lowercase - // if downcode doesn't hit, the char will be stripped here - if (allowUnicode) { - // Keep Unicode letters including both lowercase and uppercase - // characters, whitespace, and dash; remove other characters. - s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), ''); - } else { - s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars - } - s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces - s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens - s = s.substring(0, num_chars); // trim to first num_chars chars - return s.replace(/-+$/g, ''); // trim any trailing hyphens - } - window.URLify = URLify; -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt deleted file mode 100644 index f642c3f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright OpenJS Foundation and other contributors, https://openjsf.org/ - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js deleted file mode 100644 index 1a86433..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js +++ /dev/null @@ -1,10716 +0,0 @@ -/*! - * jQuery JavaScript Library v3.7.1 - * https://jquery.com/ - * - * Copyright OpenJS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2023-08-28T13:37Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket trac-14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML <object> elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 - // Plus for old WebKit, typeof returns "function" for HTML collections - // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) - return typeof obj === "function" && typeof obj.nodeType !== "number" && - typeof obj.item !== "function"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var version = "3.7.1", - - rhtmlSuffix = /HTML$/i, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - - // Retrieve the text value of an array of DOM nodes - text: function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += jQuery.text( node ); - } - } - if ( nodeType === 1 || nodeType === 11 ) { - return elem.textContent; - } - if ( nodeType === 9 ) { - return elem.documentElement.textContent; - } - if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - isXMLDoc: function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Assume HTML when documentElement doesn't yet exist, such as inside - // document fragments. - return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), - function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); - } ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -} -var pop = arr.pop; - - -var sort = arr.sort; - - -var splice = arr.splice; - - -var whitespace = "[\\x20\\t\\r\\n\\f]"; - - -var rtrimCSS = new RegExp( - "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", - "g" -); - - - - -// Note: an element does not contain itself -jQuery.contains = function( a, b ) { - var bup = b && b.parentNode; - - return a === bup || !!( bup && bup.nodeType === 1 && ( - - // Support: IE 9 - 11+ - // IE doesn't have `contains` on SVG. - a.contains ? - a.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); -}; - - - - -// CSS string/identifier serialization -// https://drafts.csswg.org/cssom/#common-serializing-idioms -var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; - -function fcssescape( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; -} - -jQuery.escapeSelector = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - - - - -var preferredDoc = document, - pushNative = push; - -( function() { - -var i, - Expr, - outermostContext, - sortInput, - hasDuplicate, - push = pushNative, - - // Local document vars - document, - documentElement, - documentIsHTML, - rbuggyQSA, - matches, - - // Instance-specific data - expando = jQuery.expando, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + - "loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + - whitespace + "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - ID: new RegExp( "^#(" + identifier + ")" ), - CLASS: new RegExp( "^\\.(" + identifier + ")" ), - TAG: new RegExp( "^(" + identifier + "|[*])" ), - ATTR: new RegExp( "^" + attributes ), - PSEUDO: new RegExp( "^" + pseudos ), - CHILD: new RegExp( - "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - bool: new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - needsContext: new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - if ( nonHex ) { - - // Strip the backslash prefix from a non-hex escape sequence - return nonHex; - } - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - return high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes; see `setDocument`. - // Support: IE 9 - 11+, Edge 12 - 18+ - // Removing the function wrapper causes a "Permission Denied" - // error in IE/Edge. - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && nodeName( elem, "fieldset" ); - }, - { dir: "parentNode", next: "legend" } - ); - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android <=4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { - apply: function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - }, - call: function( target ) { - pushNative.apply( target, slice.call( arguments, 1 ) ); - } - }; -} - -function find( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE 9 only - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - push.call( results, elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE 9 only - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - find.contains( context, elem ) && - elem.id === m ) { - - push.call( results, elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when - // strict-comparing two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( newContext != context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = jQuery.escapeSelector( nid ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties - // (see https://github.com/jquery/sizzle/issues/157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by jQuery selector module - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - return nodeName( elem, "input" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && - elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11+ - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a jQuery selector context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [node] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -function setDocument( node ) { - var subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - documentElement = document.documentElement; - documentIsHTML = !jQuery.isXMLDoc( document ); - - // Support: iOS 7 only, IE 9 - 11+ - // Older browsers didn't support unprefixed `matches`. - matches = documentElement.matches || - documentElement.webkitMatchesSelector || - documentElement.msMatchesSelector; - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors - // (see trac-13936). - // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, - // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. - if ( documentElement.msMatchesSelector && - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 9 - 11+, Edge 12 - 18+ - subWindow.addEventListener( "unload", unloadHandler ); - } - - // Support: IE <10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - documentElement.appendChild( el ).id = jQuery.expando; - return !document.getElementsByName || - !document.getElementsByName( jQuery.expando ).length; - } ); - - // Support: IE 9 only - // Check to see if it's possible to do matchesSelector - // on a disconnected node. - support.disconnectedMatch = assert( function( el ) { - return matches.call( el, "*" ); - } ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // IE/Edge don't support the :scope pseudo-class. - support.scope = assert( function() { - return document.querySelectorAll( ":scope" ); - } ); - - // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only - // Make sure the `:has()` argument is parsed unforgivingly. - // We include `*` in the test to detect buggy implementations that are - // _selectively_ forgiving (specifically when the list includes at least - // one valid selector). - // Note that we treat complete lack of support for `:has()` as if it were - // spec-compliant support, which is fine because use of `:has()` in such - // environments will fail in the qSA path and fall back to jQuery traversal - // anyway. - support.cssHas = assert( function() { - try { - document.querySelector( ":has(*,:jqfake)" ); - return false; - } catch ( e ) { - return true; - } - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter.ID = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find.ID = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter.ID = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find.ID = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find.TAG = function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else { - return context.querySelectorAll( tag ); - } - }; - - // Class - Expr.find.CLASS = function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - rbuggyQSA = []; - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - documentElement.appendChild( el ).innerHTML = - "<a id='" + expando + "' href='' disabled='disabled'></a>" + - "<select id='" + expando + "-\r\\' disabled='disabled'>" + - "<option selected=''></option></select>"; - - // Support: iOS <=7 - 8 only - // Boolean attributes and "value" are not treated correctly in some XML documents - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: iOS <=7 - 8 only - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: iOS 8 only - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ - // In some of the document kinds, these selectors wouldn't work natively. - // This is probably OK but for backwards compatibility we want to maintain - // handling them through jQuery traversal in jQuery 3.x. - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE 9 - 11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ - // In some of the document kinds, these selectors wouldn't work natively. - // This is probably OK but for backwards compatibility we want to maintain - // handling them through jQuery traversal in jQuery 3.x. - documentElement.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - } ); - - if ( !support.cssHas ) { - - // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ - // Our regular `try-catch` mechanism fails to detect natively-unsupported - // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) - // in browsers that parse the `:has()` argument as a forgiving selector list. - // https://drafts.csswg.org/selectors/#relational now requires the argument - // to be parsed unforgivingly, but browsers have not yet fully adjusted. - rbuggyQSA.push( ":has" ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a === document || a.ownerDocument == preferredDoc && - find.contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b === document || b.ownerDocument == preferredDoc && - find.contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - }; - - return document; -} - -find.matches = function( expr, elements ) { - return find( expr, null, null, elements ); -}; - -find.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return find( expr, document, null, [ elem ] ).length > 0; -}; - -find.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return jQuery.contains( context, elem ); -}; - - -find.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (see trac-13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - if ( val !== undefined ) { - return val; - } - - return elem.getAttribute( name ); -}; - -find.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -jQuery.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - // - // Support: Android <=4.0+ - // Testing for detecting duplicates is unpredictable so instead assume we can't - // depend on duplicate detection in all browsers without a stable sort. - hasDuplicate = !support.sortStable; - sortInput = !support.sortStable && slice.call( results, 0 ); - sort.call( results, sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - splice.call( results, duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -jQuery.fn.uniqueSort = function() { - return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); -}; - -Expr = jQuery.expr = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - ATTR: function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) - .replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - CHILD: function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - find.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) - ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - find.error( match[ 0 ] ); - } - - return match; - }, - - PSEUDO: function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr.CHILD.test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - TAG: function( nodeNameSelector ) { - var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return nodeName( elem, expectedNodeName ); - }; - }, - - CLASS: function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + ")" + className + - "(" + whitespace + "|$)" ) ) && - classCache( className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - ATTR: function( name, operator, check ) { - return function( elem ) { - var result = find.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - if ( operator === "=" ) { - return result === check; - } - if ( operator === "!=" ) { - return result !== check; - } - if ( operator === "^=" ) { - return check && result.indexOf( check ) === 0; - } - if ( operator === "*=" ) { - return check && result.indexOf( check ) > -1; - } - if ( operator === "$=" ) { - return check && result.slice( -check.length ) === check; - } - if ( operator === "~=" ) { - return ( " " + result.replace( rwhitespace, " " ) + " " ) - .indexOf( check ) > -1; - } - if ( operator === "|=" ) { - return result === check || result.slice( 0, check.length + 1 ) === check + "-"; - } - - return false; - }; - }, - - CHILD: function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - nodeName( node, name ) : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || ( parent[ expando ] = {} ); - cache = outerCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - cache = outerCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - nodeName( node, name ) : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - outerCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - PSEUDO: function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // https://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - find.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as jQuery does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - not: markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrimCSS, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element - // (see https://github.com/jquery/sizzle/issues/299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - has: markFunction( function( selector ) { - return function( elem ) { - return find( selector, elem ).length > 0; - }; - } ), - - contains: markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // https://www.w3.org/TR/selectors/#lang-pseudo - lang: markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - find.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - target: function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - root: function( elem ) { - return elem === documentElement; - }, - - focus: function( elem ) { - return elem === safeActiveElement() && - document.hasFocus() && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - enabled: createDisabledPseudo( false ), - disabled: createDisabledPseudo( true ), - - checked: function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - return ( nodeName( elem, "input" ) && !!elem.checked ) || - ( nodeName( elem, "option" ) && !!elem.selected ); - }, - - selected: function( elem ) { - - // Support: IE <=11+ - // Accessing the selectedIndex property - // forces the browser to treat the default option as - // selected when in an optgroup. - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - empty: function( elem ) { - - // https://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - parent: function( elem ) { - return !Expr.pseudos.empty( elem ); - }, - - // Element/input types - header: function( elem ) { - return rheader.test( elem.nodeName ); - }, - - input: function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - button: function( elem ) { - return nodeName( elem, "input" ) && elem.type === "button" || - nodeName( elem, "button" ); - }, - - text: function( elem ) { - var attr; - return nodeName( elem, "input" ) && elem.type === "text" && - - // Support: IE <10 only - // New HTML5 attribute values (e.g., "search") appear - // with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - first: createPositionalPseudo( function() { - return [ 0 ]; - } ), - - last: createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - even: createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - odd: createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - lt: createPositionalPseudo( function( matchIndexes, length, argument ) { - var i; - - if ( argument < 0 ) { - i = argument + length; - } else if ( argument > length ) { - i = length; - } else { - i = argument; - } - - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - gt: createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos.nth = Expr.pseudos.eq; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rleadingCombinator.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrimCSS, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - if ( parseOnly ) { - return soFar.length; - } - - return soFar ? - find.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - if ( skip && nodeName( elem, skip ) ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = outerCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - outerCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - find( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, matcherOut, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || - multipleContexts( selector || "*", - context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems; - - if ( matcher ) { - - // If we have a postFinder, or filtered seed, or non-seed postFilter - // or preexisting results, - matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results; - - // Find primary matches - matcher( matcherIn, matcherOut, context, xml ); - } else { - matcherOut = matcherIn; - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element - // (see https://github.com/jquery/sizzle/issues/299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrimCSS, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find.TAG( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: iOS <=7 - 9 only - // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching - // elements by id. (see trac-14142) - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - push.call( results, elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - jQuery.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -function compile( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -} - -/** - * A low-level selection function that works with jQuery's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with jQuery selector compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find.ID( - token.matches[ 0 ].replace( runescape, funescape ), - context - ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && - testContext( context.parentNode ) || context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -} - -// One-time assignments - -// Support: Android <=4.0 - 4.1+ -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Initialize against the default document -setDocument(); - -// Support: Android <=4.0 - 4.1+ -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -jQuery.find = find; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.unique = jQuery.uniqueSort; - -// These have always been private, but they used to be documented as part of -// Sizzle so let's maintain them for now for backwards compatibility purposes. -find.compile = compile; -find.select = select; -find.setDocument = setDocument; -find.tokenize = tokenize; - -find.escape = jQuery.escapeSelector; -find.getText = jQuery.text; -find.isXML = jQuery.isXMLDoc; -find.selectors = jQuery.expr; -find.support = jQuery.support; -find.uniqueSort = jQuery.uniqueSort; - - /* eslint-enable */ - -} )(); - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521) - // Strict HTML recognition (trac-11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to jQuery#find - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // <object> elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.error ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the error, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getErrorHook ) { - process.error = jQuery.Deferred.getErrorHook(); - - // The deprecated alias of the above. While the name suggests - // returning the stack, not an error instance, jQuery just passes - // it directly to `console.warn` so both will work; an instance - // just better cooperates with source maps. - } else if ( jQuery.Deferred.getStackHook ) { - process.error = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the primary Deferred - primary = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - primary.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( primary.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return primary.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); - } - - return primary.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error -// captured before the async barrier to get the original error cause -// which may otherwise be hidden. -jQuery.Deferred.exceptionHook = function( error, asyncError ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, - error.stack, asyncError ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See trac-6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (trac-9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see trac-8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (trac-14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (trac-11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (trac-14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = "<textarea>x</textarea>"; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces <option> tags with their contents when inserted outside of - // the select element. - div.innerHTML = "<option></option>"; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (trac-13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting <tbody> or other required elements. - thead: [ 1, "<table>", "</table>" ], - col: [ 2, "<table><colgroup>", "</colgroup></table>" ], - tr: [ 2, "<table><tbody>", "</tbody></table>" ], - td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (trac-12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG <use> instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (trac-13208) - // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (trac-13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", true ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, isSetup ) { - - // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add - if ( !isSetup ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - if ( !saved ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - this[ type ](); - result = dataPriv.get( this, type ); - dataPriv.set( this, type, false ); - - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - return result; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering - // the native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved ) { - - // ...and capture the result - dataPriv.set( this, type, jQuery.event.trigger( - saved[ 0 ], - saved.slice( 1 ), - this - ) ); - - // Abort handling of the native event by all jQuery handlers while allowing - // native handlers on the same element to run. On target, this is achieved - // by stopping immediate propagation just on the jQuery event. However, - // the native event is re-wrapped by a jQuery one on each level of the - // propagation so the only way to stop it for jQuery is to stop it for - // everyone via native `stopPropagation()`. This is not a problem for - // focus/blur which don't bubble, but it does also stop click on checkboxes - // and radios. We accept this limitation. - event.stopPropagation(); - event.isImmediatePropagationStopped = returnTrue; - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (trac-504, trac-13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - - function focusMappedHandler( nativeEvent ) { - if ( document.documentMode ) { - - // Support: IE 11+ - // Attach a single focusin/focusout handler on the document while someone wants - // focus/blur. This is because the former are synchronous in IE while the latter - // are async. In other browsers, all those handlers are invoked synchronously. - - // `handle` from private data would already wrap the event, but we need - // to change the `type` here. - var handle = dataPriv.get( this, "handle" ), - event = jQuery.event.fix( nativeEvent ); - event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; - event.isSimulated = true; - - // First, handle focusin/focusout - handle( nativeEvent ); - - // ...then, handle focus/blur - // - // focus/blur don't bubble while focusin/focusout do; simulate the former by only - // invoking the handler at the lower level. - if ( event.target === event.currentTarget ) { - - // The setup part calls `leverageNative`, which, in turn, calls - // `jQuery.event.add`, so event handle will already have been set - // by this point. - handle( event ); - } - } else { - - // For non-IE browsers, attach a single capturing handler on the document - // while someone wants focusin/focusout. - jQuery.event.simulate( delegateType, nativeEvent.target, - jQuery.event.fix( nativeEvent ) ); - } - } - - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - var attaches; - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, true ); - - if ( document.documentMode ) { - - // Support: IE 9 - 11+ - // We use the same native handler for focusin & focus (and focusout & blur) - // so we need to coordinate setup & teardown parts between those events. - // Use `delegateType` as the key as `type` is already used by `leverageNative`. - attaches = dataPriv.get( this, delegateType ); - if ( !attaches ) { - this.addEventListener( delegateType, focusMappedHandler ); - } - dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); - } else { - - // Return false to allow normal processing in the caller - return false; - } - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - teardown: function() { - var attaches; - - if ( document.documentMode ) { - attaches = dataPriv.get( this, delegateType ) - 1; - if ( !attaches ) { - this.removeEventListener( delegateType, focusMappedHandler ); - dataPriv.remove( this, delegateType ); - } else { - dataPriv.set( this, delegateType, attaches ); - } - } else { - - // Return false to indicate standard teardown should be applied - return false; - } - }, - - // Suppress native focus or blur if we're currently inside - // a leveraged native-event stack - _default: function( event ) { - return dataPriv.get( event.target, type ); - }, - - delegateType: delegateType - }; - - // Support: Firefox <=44 - // Firefox doesn't have focus(in | out) events - // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 - // - // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 - // focus(in | out) events fire after focus & blur events, - // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order - // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 - // - // Support: IE 9 - 11+ - // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, - // attach a single handler for both events in IE. - jQuery.event.special[ delegateType ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - dataHolder = document.documentMode ? this : doc, - attaches = dataPriv.get( dataHolder, delegateType ); - - // Support: IE 9 - 11+ - // We use the same native handler for focusin & focus (and focusout & blur) - // so we need to coordinate setup & teardown parts between those events. - // Use `delegateType` as the key as `type` is already used by `leverageNative`. - if ( !attaches ) { - if ( document.documentMode ) { - this.addEventListener( delegateType, focusMappedHandler ); - } else { - doc.addEventListener( type, focusMappedHandler, true ); - } - } - dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - dataHolder = document.documentMode ? this : doc, - attaches = dataPriv.get( dataHolder, delegateType ) - 1; - - if ( !attaches ) { - if ( document.documentMode ) { - this.removeEventListener( delegateType, focusMappedHandler ); - } else { - doc.removeEventListener( type, focusMappedHandler, true ); - } - dataPriv.remove( dataHolder, delegateType ); - } else { - dataPriv.set( dataHolder, delegateType, attaches ); - } - } - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /<script|<style|<link/i, - - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - - rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (trac-8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Re-enable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - - // Unwrap a CDATA section containing script contents. This shouldn't be - // needed as in XML documents they're already not visible when - // inspecting element contents and in HTML documents they have no - // meaning but we're preserving that logic for backwards compatibility. - // This will be removed completely in 4.0. See gh-4904. - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew jQuery#find here for performance reasons: - // https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var rcustomProp = /^--/; - - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (trac-8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "box-sizing:content-box;border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is `display: block` - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - isCustomProp = rcustomProp.test( name ), - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, trac-12537) - // .css('--customProperty) (gh-3144) - if ( computed ) { - - // Support: IE <=9 - 11+ - // IE only supports `"float"` in `getPropertyValue`; in computed styles - // it's only available as `"cssFloat"`. We no longer modify properties - // sent to `.css()` apart from camelCasing, so we need to check both. - // Normally, this would create difference in behavior: if - // `getPropertyValue` returns an empty string, the value returned - // by `.css()` would be `undefined`. This is usually the case for - // disconnected elements. However, in IE even disconnected elements - // with no styles return `"none"` for `getPropertyValue( "float" )` - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( isCustomProp && ret ) { - - // Support: Firefox 105+, Chrome <=105+ - // Spec requires trimming whitespace for custom properties (gh-4926). - // Firefox only trims leading whitespace. Chrome just collapses - // both leading & trailing whitespace to a single space. - // - // Fall back to `undefined` if empty string returned. - // This collapses a missing definition with property defined - // and set to an empty string but there's no standard API - // allowing us to differentiate them without a performance penalty - // and returning `undefined` aligns with older jQuery. - // - // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED - // as whitespace while CSS does not, but this is not a problem - // because CSS preprocessing replaces them with U+000A LINE FEED - // (which *is* CSS whitespace) - // https://www.w3.org/TR/css-syntax-3/#input-preprocessing - ret = ret.replace( rtrimCSS, "$1" ) || undefined; - } - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0, - marginDelta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - // Count margin delta separately to only add it after scroll gutter adjustment. - // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). - if ( box === "margin" ) { - marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta + marginDelta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - animationIterationCount: true, - aspectRatio: true, - borderImageSlice: true, - columnCount: true, - flexGrow: true, - flexShrink: true, - fontWeight: true, - gridArea: true, - gridColumn: true, - gridColumnEnd: true, - gridColumnStart: true, - gridRow: true, - gridRowEnd: true, - gridRowStart: true, - lineHeight: true, - opacity: true, - order: true, - orphans: true, - scale: true, - widows: true, - zIndex: true, - zoom: true, - - // SVG-related - fillOpacity: true, - floodOpacity: true, - stopOpacity: true, - strokeMiterlimit: true, - strokeOpacity: true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (trac-7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug trac-9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (trac-7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // Use proper attribute retrieval (trac-12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classNames, cur, curValue, className, i, finalValue; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classNames = classesToArray( value ); - - if ( classNames.length ) { - return this.each( function() { - curValue = getClass( this ); - cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - if ( cur.indexOf( " " + className + " " ) < 0 ) { - cur += className + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - this.setAttribute( "class", finalValue ); - } - } - } ); - } - - return this; - }, - - removeClass: function( value ) { - var classNames, cur, curValue, className, i, finalValue; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classNames = classesToArray( value ); - - if ( classNames.length ) { - return this.each( function() { - curValue = getClass( this ); - - // This expression is here for better compressibility (see addClass) - cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - - // Remove *all* instances - while ( cur.indexOf( " " + className + " " ) > -1 ) { - cur = cur.replace( " " + className + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - this.setAttribute( "class", finalValue ); - } - } - } ); - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var classNames, className, i, self, - type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - classNames = classesToArray( value ); - - return this.each( function() { - if ( isValidValue ) { - - // Toggle individual class names - self = jQuery( this ); - - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (trac-14686, trac-14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (trac-2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; -}; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (trac-9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (trac-6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ).filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ).map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // trac-7653, trac-8125, trac-8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - -originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes trac-9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (trac-10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket trac-12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // trac-9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (trac-11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // trac-1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see trac-8605, trac-14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // trac-14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( "<script>" ) - .attr( s.scriptAttrs || {} ) - .prop( { charset: s.scriptCharset, src: s.url } ) - .on( "load error", callback = function( evt ) { - script.remove(); - callback = null; - if ( evt ) { - complete( evt.type === "error" ? 404 : 200, evt.type ); - } - } ); - - // Use native DOM manipulation to avoid our domManip AJAX trickery - document.head.appendChild( script[ 0 ] ); - }, - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -var oldCallbacks = [], - rjsonp = /(=)\?(?=&|$)|\?\?/; - -// Default jsonp settings -jQuery.ajaxSetup( { - jsonp: "callback", - jsonpCallback: function() { - var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); - this[ callback ] = true; - return callback; - } -} ); - -// Detect, normalize options and install callbacks for jsonp requests -jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { - - var callbackName, overwritten, responseContainer, - jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? - "url" : - typeof s.data === "string" && - ( s.contentType || "" ) - .indexOf( "application/x-www-form-urlencoded" ) === 0 && - rjsonp.test( s.data ) && "data" - ); - - // Handle iff the expected data type is "jsonp" or we have a parameter to set - if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { - - // Get callback name, remembering preexisting value associated with it - callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? - s.jsonpCallback() : - s.jsonpCallback; - - // Insert callback into url or form data - if ( jsonProp ) { - s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); - } else if ( s.jsonp !== false ) { - s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; - } - - // Use data converter to retrieve json after script execution - s.converters[ "script json" ] = function() { - if ( !responseContainer ) { - jQuery.error( callbackName + " was not called" ); - } - return responseContainer[ 0 ]; - }; - - // Force json dataType - s.dataTypes[ 0 ] = "json"; - - // Install callback - overwritten = window[ callbackName ]; - window[ callbackName ] = function() { - responseContainer = arguments; - }; - - // Clean-up function (fires after converters) - jqXHR.always( function() { - - // If previous value didn't exist - remove it - if ( overwritten === undefined ) { - jQuery( window ).removeProp( callbackName ); - - // Otherwise restore preexisting value - } else { - window[ callbackName ] = overwritten; - } - - // Save back as free - if ( s[ callbackName ] ) { - - // Make sure that re-using the options doesn't screw things around - s.jsonpCallback = originalSettings.jsonpCallback; - - // Save the callback name for future use - oldCallbacks.push( callbackName ); - } - - // Call if it was a function and we have a response - if ( responseContainer && isFunction( overwritten ) ) { - overwritten( responseContainer[ 0 ] ); - } - - responseContainer = overwritten = undefined; - } ); - - // Delegate to script - return "script"; - } -} ); - - - - -// Support: Safari 8 only -// In Safari 8 documents created via document.implementation.createHTMLDocument -// collapse sibling forms: the second one becomes a child of the first one. -// Because of that, this security measure has to be disabled in Safari 8. -// https://bugs.webkit.org/show_bug.cgi?id=137337 -support.createHTMLDocument = ( function() { - var body = document.implementation.createHTMLDocument( "" ).body; - body.innerHTML = "<form></form><form></form>"; - return body.childNodes.length === 2; -} )(); - - -// Argument "data" should be string of html -// context (optional): If specified, the fragment will be created in this context, -// defaults to document -// keepScripts (optional): If true, will include scripts passed in the html string -jQuery.parseHTML = function( data, context, keepScripts ) { - if ( typeof data !== "string" ) { - return []; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - - var base, parsed, scripts; - - if ( !context ) { - - // Stop scripts or inline event handlers from being executed immediately - // by using document.implementation - if ( support.createHTMLDocument ) { - context = document.implementation.createHTMLDocument( "" ); - - // Set the base href for the created document - // so any parsed elements with URLs - // are based on the document's URL (gh-2965) - base = context.createElement( "base" ); - base.href = document.location.href; - context.head.appendChild( base ); - } else { - context = document; - } - } - - parsed = rsingleTag.exec( data ); - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[ 1 ] ) ]; - } - - parsed = buildFragment( [ data ], context, scripts ); - - if ( scripts && scripts.length ) { - jQuery( scripts ).remove(); - } - - return jQuery.merge( [], parsed.childNodes ); -}; - - -/** - * Load a url into a page - */ -jQuery.fn.load = function( url, params, callback ) { - var selector, type, response, - self = this, - off = url.indexOf( " " ); - - if ( off > -1 ) { - selector = stripAndCollapse( url.slice( off ) ); - url = url.slice( 0, off ); - } - - // If it's a function - if ( isFunction( params ) ) { - - // We assume that it's the callback - callback = params; - params = undefined; - - // Otherwise, build a param string - } else if ( params && typeof params === "object" ) { - type = "POST"; - } - - // If we have elements to modify, make the request - if ( self.length > 0 ) { - jQuery.ajax( { - url: url, - - // If "type" variable is undefined, then "GET" method will be used. - // Make value of this field explicit since - // user can override it through ajaxSetup method - type: type || "GET", - dataType: "html", - data: params - } ).done( function( responseText ) { - - // Save response for use in complete callback - response = arguments; - - self.html( selector ? - - // If a selector was specified, locate the right elements in a dummy div - // Exclude scripts to avoid IE 'Permission Denied' errors - jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : - - // Otherwise use the full result - responseText ); - - // If the request succeeds, this function gets "data", "status", "jqXHR" - // but they are ignored because response was set above. - // If it fails, this function gets "jqXHR", "status", "error" - } ).always( callback && function( jqXHR, status ) { - self.each( function() { - callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); - } ); - } ); - } - - return this; -}; - - - - -jQuery.expr.pseudos.animated = function( elem ) { - return jQuery.grep( jQuery.timers, function( fn ) { - return elem === fn.elem; - } ).length; -}; - - - - -jQuery.offset = { - setOffset: function( elem, options, i ) { - var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, - position = jQuery.css( elem, "position" ), - curElem = jQuery( elem ), - props = {}; - - // Set position first, in-case top/left are set even on static elem - if ( position === "static" ) { - elem.style.position = "relative"; - } - - curOffset = curElem.offset(); - curCSSTop = jQuery.css( elem, "top" ); - curCSSLeft = jQuery.css( elem, "left" ); - calculatePosition = ( position === "absolute" || position === "fixed" ) && - ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; - - // Need to be able to calculate position if either - // top or left is auto and position is either absolute or fixed - if ( calculatePosition ) { - curPosition = curElem.position(); - curTop = curPosition.top; - curLeft = curPosition.left; - - } else { - curTop = parseFloat( curCSSTop ) || 0; - curLeft = parseFloat( curCSSLeft ) || 0; - } - - if ( isFunction( options ) ) { - - // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) - options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); - } - - if ( options.top != null ) { - props.top = ( options.top - curOffset.top ) + curTop; - } - if ( options.left != null ) { - props.left = ( options.left - curOffset.left ) + curLeft; - } - - if ( "using" in options ) { - options.using.call( elem, props ); - - } else { - curElem.css( props ); - } - } -}; - -jQuery.fn.extend( { - - // offset() relates an element's border box to the document origin - offset: function( options ) { - - // Preserve chaining for setter - if ( arguments.length ) { - return options === undefined ? - this : - this.each( function( i ) { - jQuery.offset.setOffset( this, options, i ); - } ); - } - - var rect, win, - elem = this[ 0 ]; - - if ( !elem ) { - return; - } - - // Return zeros for disconnected and hidden (display: none) elements (gh-2310) - // Support: IE <=11 only - // Running getBoundingClientRect on a - // disconnected node in IE throws an error - if ( !elem.getClientRects().length ) { - return { top: 0, left: 0 }; - } - - // Get document-relative position by adding viewport scroll to viewport-relative gBCR - rect = elem.getBoundingClientRect(); - win = elem.ownerDocument.defaultView; - return { - top: rect.top + win.pageYOffset, - left: rect.left + win.pageXOffset - }; - }, - - // position() relates an element's margin box to its offset parent's padding box - // This corresponds to the behavior of CSS absolute positioning - position: function() { - if ( !this[ 0 ] ) { - return; - } - - var offsetParent, offset, doc, - elem = this[ 0 ], - parentOffset = { top: 0, left: 0 }; - - // position:fixed elements are offset from the viewport, which itself always has zero offset - if ( jQuery.css( elem, "position" ) === "fixed" ) { - - // Assume position:fixed implies availability of getBoundingClientRect - offset = elem.getBoundingClientRect(); - - } else { - offset = this.offset(); - - // Account for the *real* offset parent, which can be the document or its root element - // when a statically positioned element is identified - doc = elem.ownerDocument; - offsetParent = elem.offsetParent || doc.documentElement; - while ( offsetParent && - ( offsetParent === doc.body || offsetParent === doc.documentElement ) && - jQuery.css( offsetParent, "position" ) === "static" ) { - - offsetParent = offsetParent.parentNode; - } - if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { - - // Incorporate borders into its offset, since they are outside its content origin - parentOffset = jQuery( offsetParent ).offset(); - parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); - parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); - } - } - - // Subtract parent offsets and element margins - return { - top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), - left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) - }; - }, - - // This method will return documentElement in the following cases: - // 1) For the element inside the iframe without offsetParent, this method will return - // documentElement of the parent window - // 2) For the hidden or detached element - // 3) For body or html element, i.e. in case of the html node - it will return itself - // - // but those exceptions were never presented as a real life use-cases - // and might be considered as more preferable results. - // - // This logic, however, is not guaranteed and can change at any point in the future - offsetParent: function() { - return this.map( function() { - var offsetParent = this.offsetParent; - - while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { - offsetParent = offsetParent.offsetParent; - } - - return offsetParent || documentElement; - } ); - } -} ); - -// Create scrollLeft and scrollTop methods -jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { - var top = "pageYOffset" === prop; - - jQuery.fn[ method ] = function( val ) { - return access( this, function( elem, method, val ) { - - // Coalesce documents and windows - var win; - if ( isWindow( elem ) ) { - win = elem; - } else if ( elem.nodeType === 9 ) { - win = elem.defaultView; - } - - if ( val === undefined ) { - return win ? win[ prop ] : elem[ method ]; - } - - if ( win ) { - win.scrollTo( - !top ? val : win.pageXOffset, - top ? val : win.pageYOffset - ); - - } else { - elem[ method ] = val; - } - }, method, val, arguments.length ); - }; -} ); - -// Support: Safari <=7 - 9.1, Chrome <=37 - 49 -// Add the top/left cssHooks using jQuery.fn.position -// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 -// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 -// getComputedStyle returns percent when specified for top/left/bottom/right; -// rather than make the css module depend on the offset module, just check for it here -jQuery.each( [ "top", "left" ], function( _i, prop ) { - jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, - function( elem, computed ) { - if ( computed ) { - computed = curCSS( elem, prop ); - - // If curCSS returns percentage, fallback to offset - return rnumnonpx.test( computed ) ? - jQuery( elem ).position()[ prop ] + "px" : - computed; - } - } - ); -} ); - - -// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods -jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { - jQuery.each( { - padding: "inner" + name, - content: type, - "": "outer" + name - }, function( defaultExtra, funcName ) { - - // Margin is only for outerHeight, outerWidth - jQuery.fn[ funcName ] = function( margin, value ) { - var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), - extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); - - return access( this, function( elem, type, value ) { - var doc; - - if ( isWindow( elem ) ) { - - // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) - return funcName.indexOf( "outer" ) === 0 ? - elem[ "inner" + name ] : - elem.document.documentElement[ "client" + name ]; - } - - // Get document width or height - if ( elem.nodeType === 9 ) { - doc = elem.documentElement; - - // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], - // whichever is greatest - return Math.max( - elem.body[ "scroll" + name ], doc[ "scroll" + name ], - elem.body[ "offset" + name ], doc[ "offset" + name ], - doc[ "client" + name ] - ); - } - - return value === undefined ? - - // Get width or height on the element, requesting but not forcing parseFloat - jQuery.css( elem, type, extra ) : - - // Set width or height on the element - jQuery.style( elem, type, value, extra ); - }, type, chainable ? margin : undefined, chainable ); - }; - } ); -} ); - - -jQuery.each( [ - "ajaxStart", - "ajaxStop", - "ajaxComplete", - "ajaxError", - "ajaxSuccess", - "ajaxSend" -], function( _i, type ) { - jQuery.fn[ type ] = function( fn ) { - return this.on( type, fn ); - }; -} ); - - - - -jQuery.fn.extend( { - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length === 1 ? - this.off( selector, "**" ) : - this.off( types, selector || "**", fn ); - }, - - hover: function( fnOver, fnOut ) { - return this - .on( "mouseenter", fnOver ) - .on( "mouseleave", fnOut || fnOver ); - } -} ); - -jQuery.each( - ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( _i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; - } -); - - - - -// Support: Android <=4.0 only -// Make sure we trim BOM and NBSP -// Require that the "whitespace run" starts from a non-whitespace -// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. -var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; - -// Bind a function to a context, optionally partially applying any -// arguments. -// jQuery.proxy is deprecated to promote standards (specifically Function#bind) -// However, it is not slated for removal any time soon -jQuery.proxy = function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; -}; - -jQuery.holdReady = function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } -}; -jQuery.isArray = Array.isArray; -jQuery.parseJSON = JSON.parse; -jQuery.nodeName = nodeName; -jQuery.isFunction = isFunction; -jQuery.isWindow = isWindow; -jQuery.camelCase = camelCase; -jQuery.type = toType; - -jQuery.now = Date.now; - -jQuery.isNumeric = function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); -}; - -jQuery.trim = function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "$1" ); -}; - - - -// Register as a named AMD module, since jQuery can be concatenated with other -// files that may use define, but not via a proper concatenation script that -// understands anonymous AMD modules. A named AMD is safest and most robust -// way to register. Lowercase jquery is used because AMD module names are -// derived from file names, and jQuery is normally delivered in a lowercase -// file name. Do this after creating the global so that if an AMD module wants -// to call noConflict to hide this version of jQuery, it will work. - -// Note that for maximum portability, libraries that are not jQuery should -// declare themselves as anonymous modules, and avoid setting a global if an -// AMD loader is present. jQuery is a special case. For more information, see -// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon - -if ( typeof define === "function" && define.amd ) { - define( "jquery", [], function() { - return jQuery; - } ); -} - - - - -var - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$; - -jQuery.noConflict = function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; -}; - -// Expose jQuery and $ identifiers, even in AMD -// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) -// and CommonJS for browser emulators (trac-13566) -if ( typeof noGlobal === "undefined" ) { - window.jQuery = window.$ = jQuery; -} - - - - -return jQuery; -} ); diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js deleted file mode 100644 index 7f37b5d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",t="(?:\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",p="\\["+ge+"*("+t+")(?:"+ge+"*([*^$|!~]?=)"+ge+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+t+"))|)"+ge+"*\\]",g=":("+t+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+p+")*)|.*)\\)|)",v=new RegExp(ge+"+","g"),y=new RegExp("^"+ge+"*,"+ge+"*"),m=new RegExp("^"+ge+"*([>+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="<a id='"+S+"' href='' disabled='disabled'></a><select id='"+S+"-\r\\' disabled='disabled'><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(v," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(d,e,t,h,g){var v="nth"!==d.slice(0,3),y="last"!==d.slice(-4),m="of-type"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?"nextSibling":"previousSibling",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u="only"===d&&!s&&"nextSibling"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,"$1"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||"")||I.error("unsupported lang: "+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,"input")&&!!e.checked||fe(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,"input")&&"button"===e.type||fe(e,"button")},text:function(e){var t;return fe(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve," ")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ve,"$1"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+" "];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split("").sort(l).join("")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement("fieldset"))}),ce.find=I,ce.expr[":"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,"parentNode")},parentsUntil:function(e,t,n){return d(e,"parentNode",n)},next:function(e){return A(e,"nextSibling")},prev:function(e){return A(e,"previousSibling")},nextAll:function(e){return d(e,"nextSibling")},prevAll:function(e){return d(e,"previousSibling")},nextUntil:function(e,t,n){return d(e,"nextSibling",n)},prevUntil:function(e,t,n){return d(e,"previousSibling",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,"template")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\x20\t\r\n\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[["notify","progress",ce.Callbacks("memory"),ce.Callbacks("memory"),2],["resolve","done",ce.Callbacks("once memory"),ce.Callbacks("once memory"),0,"resolved"],["reject","fail",ce.Callbacks("once memory"),ce.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener("DOMContentLoaded",P),ie.removeEventListener("load",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)["catch"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener("DOMContentLoaded",P),ie.addEventListener("load",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,"ms-").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(U,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks("once memory").add(function(){_.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=_.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Y=new RegExp("^(?:([+-])=|)("+G+")([a-z%]*)$","i"),Q=["Top","Right","Bottom","Left"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&K(e)&&"none"===ce.css(e,"display")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?"":"px"),c=e.nodeType&&(ce.cssNumber[t]||"px"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=_.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ne[s]=u)))):"none"!==n&&(l[c]="none",_.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="<textarea>x</textarea>",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="<option></option>",le.option=!!xe.lastChild;var ke={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],"globalEval",!t||_.get(t[n],"globalEval"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,"<select multiple='multiple'>","</select>"]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement("div")),s=(Te.exec(o)||["",""])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),"script"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||"")&&n.push(o)}return f}var De=/^([^.]*)(?:\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(D)||[""]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,"events")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,"input")&&_.get(t,"click")||fe(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:"focusin",blur:"focusout"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,"handle"),n=ce.event.fix(e);n.type="focusin"===e.type?"focus":"blur",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,Me=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&"string"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,"script"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||"")&&!_.access(u,"globalEval")&&ce.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):m(u.textContent.replace(Me,""),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,"script")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,"script")).length&&Ee(a,!f&&Se(e,"script")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp("^("+G+")(?!px)[a-z%]+$","i"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join("|"),"i");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,"$1")||void 0),""!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement("div"),l=C.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",le.clearCloneStyle="content-box"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="box-sizing:content-box;border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",J.appendChild(e).appendChild(t).appendChild(n),r=ie.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,J.removeChild(e)),a}}))}();var Qe=["Webkit","Moz","ms"],Je=C.createElement("div").style,Ke={};function Ze(e){var t=ce.cssProps[e]||Ke[e];return t||(e in Je?e:Ke[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Je)return e}(e)||e)}var et=/^(none|table(?!-c[ea]).+)/,tt={position:"absolute",visibility:"hidden",display:"block"},nt={letterSpacing:"0",fontWeight:"400"};function rt(e,t,n){var r=Y.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function it(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=ce.css(e,n+Q[a],!0,i)),r?("content"===n&&(u-=ce.css(e,"padding"+Q[a],!0,i)),"margin"!==n&&(u-=ce.css(e,"border"+Q[a]+"Width",!0,i))):(u+=ce.css(e,"padding"+Q[a],!0,i),"padding"!==n?u+=ce.css(e,"border"+Q[a]+"Width",!0,i):s+=ce.css(e,"border"+Q[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function ot(e,t,n){var r=Xe(e),i=(!le.boxSizingReliable()||n)&&"border-box"===ce.css(e,"boxSizing",!1,r),o=i,a=Ge(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a="auto"}return(!le.boxSizingReliable()&&i||!le.reliableTrDimensions()&&fe(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===ce.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===ce.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?"border":"content"),o,r,a)+"px"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}ce.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=F(t),u=ze.test(t),l=e.style;if(u||(t=Ze(s)),a=ce.cssHooks[t]||ce.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=Y.exec(n))&&i[1]&&(n=te(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(ce.cssNumber[s]?"":"px")),le.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=F(t);return ze.test(t)||(t=Ze(s)),(a=ce.cssHooks[t]||ce.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ge(e,t,r)),"normal"===i&&t in nt&&(i=nt[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),ce.each(["height","width"],function(e,u){ce.cssHooks[u]={get:function(e,t,n){if(t)return!et.test(ce.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,u,n):Ue(e,tt,function(){return ot(e,u,n)})},set:function(e,t,n){var r,i=Xe(e),o=!le.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===ce.css(e,"boxSizing",!1,i),s=n?it(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-it(e,u,"border",!1,i)-.5)),s&&(r=Y.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=ce.css(e,u)),rt(0,t,s)}}}),ce.cssHooks.marginLeft=Ye(le.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ge(e,"marginLeft"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),ce.each({margin:"",padding:"",border:"Width"},function(i,o){ce.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+Q[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(ce.cssHooks[i+o].set=rt)}),ce.fn.extend({css:function(e,t){return M(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Xe(e),i=t.length;a<i;a++)o[t[a]]=ce.css(e,t[a],!1,r);return o}return void 0!==n?ce.style(e,t,n):ce.css(e,t)},e,t,1<arguments.length)}}),((ce.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=at.propHooks[this.prop];return e&&e.get?e.get(this):at.propHooks._default.get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):at.propHooks._default.set(this),this}}).init.prototype=at.prototype,(at.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||!ce.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=at.prototype.init,ce.fx.step={};var st,ut,lt,ct,ft=/^(?:toggle|show|hide)$/,pt=/queueHooks$/;function dt(){ut&&(!1===C.hidden&&ie.requestAnimationFrame?ie.requestAnimationFrame(dt):ie.setTimeout(dt,ce.fx.interval),ce.fx.tick())}function ht(){return ie.setTimeout(function(){st=void 0}),st=Date.now()}function gt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=Q[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function vt(e,t,n){for(var r,i=(yt.tweeners[t]||[]).concat(yt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function yt(o,e,t){var n,a,r=0,i=yt.prefilters.length,s=ce.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=st||ht(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:ce.extend({},e),opts:ce.extend(!0,{specialEasing:{},easing:ce.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||ht(),duration:t.duration,tweens:[],createTween:function(e,t){var n=ce.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=F(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=ce.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=yt.prefilters[r].call(l,o,c,l.opts))return v(n.stop)&&(ce._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return ce.map(c,vt,l),v(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),ce.fx.timer(ce.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}ce.Animation=ce.extend(yt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return te(n.elem,e,Y.exec(t),n),n}]},tweener:function(e,t){v(e)?(t=e,e=["*"]):e=e.match(D);for(var n,r=0,i=e.length;r<i;r++)n=e[r],yt.tweeners[n]=yt.tweeners[n]||[],yt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ee(e),v=_.get(e,"fxshow");for(r in n.queue||(null==(a=ce._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,ce.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ft.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||ce.style(e,r)}if((u=!ce.isEmptyObject(t))||!ce.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=_.get(e,"display")),"none"===(c=ce.css(e,"display"))&&(l?c=l:(re([e],!0),l=e.style.display||l,c=ce.css(e,"display"),re([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===ce.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=_.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&re([e],!0),p.done(function(){for(r in g||re([e]),_.remove(e,"fxshow"),d)ce.style(e,r,d[r])})),u=vt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?yt.prefilters.unshift(e):yt.prefilters.push(e)}}),ce.speed=function(e,t,n){var r=e&&"object"==typeof e?ce.extend({},e):{complete:n||!n&&t||v(e)&&e,duration:e,easing:n&&t||t&&!v(t)&&t};return ce.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in ce.fx.speeds?r.duration=ce.fx.speeds[r.duration]:r.duration=ce.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){v(r.old)&&r.old.call(this),r.queue&&ce.dequeue(this,r.queue)},r},ce.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ee).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=ce.isEmptyObject(t),o=ce.speed(e,n,r),a=function(){var e=yt(this,ce.extend({},t),o);(i||_.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=ce.timers,r=_.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&pt.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||ce.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=_.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=ce.timers,o=n?n.length:0;for(t.finish=!0,ce.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),ce.each(["toggle","show","hide"],function(e,r){var i=ce.fn[r];ce.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(gt(r,!0),e,t,n)}}),ce.each({slideDown:gt("show"),slideUp:gt("hide"),slideToggle:gt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){ce.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),ce.timers=[],ce.fx.tick=function(){var e,t=0,n=ce.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||ce.fx.stop(),st=void 0},ce.fx.timer=function(e){ce.timers.push(e),ce.fx.start()},ce.fx.interval=13,ce.fx.start=function(){ut||(ut=!0,dt())},ce.fx.stop=function(){ut=null},ce.fx.speeds={slow:600,fast:200,_default:400},ce.fn.delay=function(r,e){return r=ce.fx&&ce.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=ie.setTimeout(e,r);t.stop=function(){ie.clearTimeout(n)}})},lt=C.createElement("input"),ct=C.createElement("select").appendChild(C.createElement("option")),lt.type="checkbox",le.checkOn=""!==lt.value,le.optSelected=ct.selected,(lt=C.createElement("input")).value="t",lt.type="radio",le.radioValue="t"===lt.value;var mt,xt=ce.expr.attrHandle;ce.fn.extend({attr:function(e,t){return M(this,ce.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(i=ce.attrHooks[t.toLowerCase()]||(ce.expr.match.bool.test(t)?mt:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=ce.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!le.radioValue&&"radio"===t&&fe(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(D);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),mt={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var a=xt[t]||ce.find.attr;xt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=xt[o],xt[o]=r,r=null!=a(e,t,n)?o:null,xt[o]=i),r}});var bt=/^(?:input|select|textarea|button)$/i,wt=/^(?:a|area)$/i;function Tt(e){return(e.match(D)||[]).join(" ")}function Ct(e){return e.getAttribute&&e.getAttribute("class")||""}function kt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(D)||[]}ce.fn.extend({prop:function(e,t){return M(this,ce.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,"tabindex");return t?parseInt(t,10):bt.test(e.nodeName)||wt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),le.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this}),ce.fn.extend({addClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).addClass(t.call(this,e,Ct(this)))}):(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++)i=e[o],n.indexOf(" "+i+" ")<0&&(n+=i+" ");a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this},removeClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).removeClass(t.call(this,e,Ct(this)))}):arguments.length?(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++){i=e[o];while(-1<n.indexOf(" "+i+" "))n=n.replace(" "+i+" "," ")}a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this:this.attr("class","")},toggleClass:function(t,n){var e,r,i,o,a=typeof t,s="string"===a||Array.isArray(t);return v(t)?this.each(function(e){ce(this).toggleClass(t.call(this,e,Ct(this),n),n)}):"boolean"==typeof n&&s?n?this.addClass(t):this.removeClass(t):(e=kt(t),this.each(function(){if(s)for(o=ce(this),i=0;i<e.length;i++)r=e[i],o.hasClass(r)?o.removeClass(r):o.addClass(r);else void 0!==t&&"boolean"!==a||((r=Ct(this))&&_.set(this,"__className__",r),this.setAttribute&&this.setAttribute("class",r||!1===t?"":_.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+Tt(Ct(n))+" ").indexOf(t))return!0;return!1}});var St=/\r/g;ce.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=v(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,ce(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=ce.map(t,function(e){return null==e?"":e+""})),(r=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=ce.valHooks[t.type]||ce.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(St,""):null==e?"":e:void 0}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:Tt(ce.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!fe(n.parentNode,"optgroup"))){if(t=ce(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=ce.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<ce.inArray(ce.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<ce.inArray(ce(e).val(),t)}},le.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Et=ie.location,jt={guid:Date.now()},At=/\?/;ce.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new ie.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||ce.error("Invalid XML: "+(n?ce.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Dt=/^(?:focusinfocus|focusoutblur)$/,Nt=function(e){e.stopPropagation()};ce.extend(ce.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||C],d=ue.call(e,"type")?e.type:e,h=ue.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||C,3!==n.nodeType&&8!==n.nodeType&&!Dt.test(d+ce.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[ce.expando]?e:new ce.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:ce.makeArray(t,[e]),c=ce.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!y(n)){for(s=c.delegateType||d,Dt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||C)&&p.push(a.defaultView||a.parentWindow||ie)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(_.get(o,"events")||Object.create(null))[e.type]&&_.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&$(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!$(n)||u&&v(n[d])&&!y(n)&&((a=n[u])&&(n[u]=null),ce.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Nt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Nt),ce.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}});var qt=/\[\]$/,Lt=/\r?\n/g,Ht=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function Pt(n,e,r,i){var t;if(Array.isArray(e))ce.each(e,function(e,t){r||qt.test(n)?i(n,t):Pt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==x(e))i(n,e);else for(t in e)Pt(n+"["+t+"]",e[t],r,i)}ce.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Pt(n,e[n],t,i);return r.join("&")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&Ot.test(this.nodeName)&&!Ht.test(e)&&(this.checked||!we.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:Array.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,"\r\n")}}):{name:t.name,value:n.replace(Lt,"\r\n")}}).get()}});var Mt=/%20/g,Rt=/#.*$/,It=/([?&])_=[^&]*/,Wt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ft=/^(?:GET|HEAD)$/,$t=/^\/\//,Bt={},_t={},zt="*/".concat("*"),Xt=C.createElement("a");function Ut(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(D)||[];if(v(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Vt(t,i,o,a){var s={},u=t===_t;function l(e){var r;return s[e]=!0,ce.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Gt(e,t){var n,r,i=ce.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&ce.extend(!0,e,r),e}Xt.href=Et.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,ce.ajaxSettings),t):Gt(ce.ajaxSettings,e)},ajaxPrefilter:Ut(Bt),ajaxTransport:Ut(_t),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=ce.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?ce(y):ce.event,x=ce.Deferred(),b=ce.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Wt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace($t,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(D)||[""],null==v.crossDomain){r=C.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Xt.protocol+"//"+Xt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=ce.param(v.data,v.traditional)),Vt(Bt,v,t,T),h)return T;for(i in(g=ce.event&&v.global)&&0==ce.active++&&ce.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ft.test(v.type),f=v.url.replace(Rt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Mt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(At.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(It,"$1"),o=(At.test(f)?"&":"?")+"_="+jt.guid+++o),v.url=f+o),v.ifModified&&(ce.lastModified[f]&&T.setRequestHeader("If-Modified-Since",ce.lastModified[f]),ce.etag[f]&&T.setRequestHeader("If-None-Match",ce.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+zt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Vt(_t,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=ie.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&ie.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<ce.inArray("script",v.dataTypes)&&ce.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(ce.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(ce.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--ce.active||ce.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,i){ce[i]=function(e,t,n,r){return v(t)&&(r=r||n,n=t,t=void 0),ce.ajax(ce.extend({url:e,type:i,dataType:r,data:t,success:n},ce.isPlainObject(e)&&e))}}),ce.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),ce._evalUrl=function(e,t,n){return ce.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){ce.globalEval(e,t,n)}})},ce.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return v(n)?this.each(function(e){ce(this).wrapInner(n.call(this,e))}):this.each(function(){var e=ce(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=v(t);return this.each(function(e){ce(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){ce(this).replaceWith(this.childNodes)}),this}}),ce.expr.pseudos.hidden=function(e){return!ce.expr.pseudos.visible(e)},ce.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},ce.ajaxSettings.xhr=function(){try{return new ie.XMLHttpRequest}catch(e){}};var Yt={0:200,1223:204},Qt=ce.ajaxSettings.xhr();le.cors=!!Qt&&"withCredentials"in Qt,le.ajax=Qt=!!Qt,ce.ajaxTransport(function(i){var o,a;if(le.cors||Qt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Yt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&ie.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),ce.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),ce.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=ce("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=Tt(e.slice(s)),e=e.slice(0,s)),v(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&ce.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?ce("<div>").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var en=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;ce.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),v(e))return r=ae.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(ae.call(arguments)))}).guid=e.guid=e.guid||ce.guid++,i},ce.holdReady=function(e){e?ce.readyWait++:ce.ready(!0)},ce.isArray=Array.isArray,ce.parseJSON=JSON.parse,ce.nodeName=fe,ce.isFunction=v,ce.isWindow=y,ce.camelCase=F,ce.type=x,ce.now=Date.now,ce.isNumeric=function(e){var t=ce.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},ce.trim=function(e){return null==e?"":(e+"").replace(en,"$1")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return ce});var tn=ie.jQuery,nn=ie.$;return ce.noConflict=function(e){return ie.$===ce&&(ie.$=nn),e&&ie.jQuery===ce&&(ie.jQuery=tn),ce},"undefined"==typeof e&&(ie.jQuery=ie.$=ce),ce}); diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md deleted file mode 100644 index 8cb8a2b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js deleted file mode 100644 index 32e5ac7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js deleted file mode 100644 index 64e1caa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js deleted file mode 100644 index 1d52c26..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js deleted file mode 100644 index 73b730a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js deleted file mode 100644 index 2d17b9d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js deleted file mode 100644 index 46b084d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js deleted file mode 100644 index 82dbbb7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js deleted file mode 100644 index 7116d6c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js deleted file mode 100644 index cda32c3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js deleted file mode 100644 index c2e61e5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js deleted file mode 100644 index 02f283a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js deleted file mode 100644 index d4922a1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js deleted file mode 100644 index 3b19285..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js deleted file mode 100644 index 68afd6d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js deleted file mode 100644 index 070b61a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js deleted file mode 100644 index 90d5e73..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js deleted file mode 100644 index e1ffdbe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها می‌توانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js deleted file mode 100644 index ffed124..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js deleted file mode 100644 index dd02f97..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js deleted file mode 100644 index 208a005..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js deleted file mode 100644 index 25a8805..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js deleted file mode 100644 index f3ed798..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js deleted file mode 100644 index cb3268d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js deleted file mode 100644 index 3d5bf09..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js deleted file mode 100644 index 4893aa2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js deleted file mode 100644 index 8230007..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js deleted file mode 100644 index 4a0b3bf..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js deleted file mode 100644 index cca5bbe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js deleted file mode 100644 index 507c7d9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js deleted file mode 100644 index 451025e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js deleted file mode 100644 index 60c593b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js deleted file mode 100644 index 4dca94f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(n){return"សូមលុបចេញ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនេះ"},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានតែ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាតុទាំងអស់"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js deleted file mode 100644 index f2880fb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js deleted file mode 100644 index f6a4215..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js deleted file mode 100644 index 806dc5c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js deleted file mode 100644 index cb7b84a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js deleted file mode 100644 index 6bd7eaa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js deleted file mode 100644 index 25d89c6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js deleted file mode 100644 index 1c39f67..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरु देखाउन सकिएन।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अक्षर मेटाउनुहोस्।";return 1!=e&&(u+="कृपया "+e+" अक्षरहरु मेटाउनुहोस्।"),u},inputTooShort:function(n){return"कृपया बाँकी रहेका "+(n.minimum-n.input.length)+" वा अरु धेरै अक्षरहरु भर्नुहोस्।"},loadingMore:function(){return"अरु नतिजाहरु भरिँदैछन् …"},maximumSelected:function(n){var e="तँपाई "+n.maximum+" वस्तु मात्र छान्न पाउँनुहुन्छ।";return 1!=n.maximum&&(e="तँपाई "+n.maximum+" वस्तुहरु मात्र छान्न पाउँनुहुन्छ।"),e},noResults:function(){return"कुनै पनि नतिजा भेटिएन।"},searching:function(){return"खोजि हुँदैछ…"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js deleted file mode 100644 index 2b74058..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js deleted file mode 100644 index 4ca5748..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Usuń "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"Usuń wszystkie przedmioty"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js deleted file mode 100644 index 9b008e4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د مهربانۍ لمخي "+e+" توری ړنګ کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"لږ تر لږه "+(n.minimum-n.input.length)+" يا ډېر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په نښه کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."},removeAllItems:function(){return"ټول توکي لرې کړئ"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js deleted file mode 100644 index c991e25..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js deleted file mode 100644 index b5da1a6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js deleted file mode 100644 index 1ba7b40..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceți "+(e.minimum-e.input.length)+" sau mai multe caractere"},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"Eliminați toate elementele"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js deleted file mode 100644 index 63a7d66..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Пожалуйста, введите на "+r+" символ";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Пожалуйста, введите ещё хотя бы "+r+" символ";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Вы можете выбрать не более "+e.maximum+" элемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"},removeAllItems:function(){return"Удалить все элементы"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js deleted file mode 100644 index 5049528..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte ešte jeden znak":t<=4?"Prosím, zadajte ešte ďalšie "+e[t](!0)+" znaky":"Prosím, zadajte ešte ďalších "+t+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliť len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliť najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliť najviac "+n.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte všetky položky"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js deleted file mode 100644 index 4d0b7d3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbrišite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpišite še "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var n="Označite lahko največ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js deleted file mode 100644 index 5916202..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js deleted file mode 100644 index ce13ce8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" симбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" симбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати само "+e.maximum+" ставк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js deleted file mode 100644 index dd407a0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="Obrišite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar još "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js deleted file mode 100644 index 1bc8724..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js deleted file mode 100644 index 63eab71..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออก "+(n.input.length-n.maximum)+" ตัวอักษร"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีก "+(n.minimum-n.input.length)+" ตัวอักษร"},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือกได้ไม่เกิน "+n.maximum+" รายการ"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"},removeAllItems:function(){return"ลบรายการทั้งหมด"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js deleted file mode 100644 index 30255ff..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ýene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js deleted file mode 100644 index fc4c0bf..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js deleted file mode 100644 index 63697e3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(e){return"Будь ласка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь ласка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити всі елементи"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js deleted file mode 100644 index 24f3bc2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bớt "+(n.input.length-n.maximum)+" ký tự"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tự trở lên"},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chọn được "+n.maximum+" lựa chọn"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js deleted file mode 100644 index 2c5649d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js deleted file mode 100644 index 570a566..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"請再輸入"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"你只能選擇最多"+n.maximum+"項"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.js deleted file mode 100644 index 358572a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.js +++ /dev/null @@ -1,6820 +0,0 @@ -/*! - * Select2 4.0.13 - * https://select2.github.io - * - * Released under the MIT license - * https://github.com/select2/select2/blob/master/LICENSE.md - */ -;(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else if (typeof module === 'object' && module.exports) { - // Node/CommonJS - module.exports = function (root, jQuery) { - if (jQuery === undefined) { - // require('jQuery') returns a factory that requires window to - // build a jQuery instance, we normalize how we use modules - // that require this pattern but the window provided is a noop - // if it's defined (how jquery works) - if (typeof window !== 'undefined') { - jQuery = require('jquery'); - } - else { - jQuery = require('jquery')(root); - } - } - factory(jQuery); - return jQuery; - }; - } else { - // Browser globals - factory(jQuery); - } -} (function (jQuery) { - // This is needed so we can catch the AMD loader configuration and use it - // The inner file should be wrapped (by `banner.start.js`) in a function that - // returns the AMD loader references. - var S2 =(function () { - // Restore the Select2 AMD loader so it can be used - // Needed mostly in the language files, where the loader is not inserted - if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { - var S2 = jQuery.fn.select2.amd; - } -var S2;(function () { if (!S2 || !S2.requirejs) { -if (!S2) { S2 = {}; } else { require = S2; } -/** - * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. - * Released under MIT license, http://github.com/requirejs/almond/LICENSE - */ -//Going sloppy to avoid 'use strict' string cost, but strict practices should -//be followed. -/*global setTimeout: false */ - -var requirejs, require, define; -(function (undef) { - var main, req, makeMap, handlers, - defined = {}, - waiting = {}, - config = {}, - defining = {}, - hasOwn = Object.prototype.hasOwnProperty, - aps = [].slice, - jsSuffixRegExp = /\.js$/; - - function hasProp(obj, prop) { - return hasOwn.call(obj, prop); - } - - /** - * Given a relative module name, like ./something, normalize it to - * a real name that can be mapped to a path. - * @param {String} name the relative name - * @param {String} baseName a real name that the name arg is relative - * to. - * @returns {String} normalized name - */ - function normalize(name, baseName) { - var nameParts, nameSegment, mapValue, foundMap, lastIndex, - foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, - baseParts = baseName && baseName.split("/"), - map = config.map, - starMap = (map && map['*']) || {}; - - //Adjust any relative paths. - if (name) { - name = name.split('/'); - lastIndex = name.length - 1; - - // If wanting node ID compatibility, strip .js from end - // of IDs. Have to do this here, and not in nameToUrl - // because node allows either .js or non .js to map - // to same file. - if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { - name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); - } - - // Starts with a '.' so need the baseName - if (name[0].charAt(0) === '.' && baseParts) { - //Convert baseName to array, and lop off the last part, - //so that . matches that 'directory' and not name of the baseName's - //module. For instance, baseName of 'one/two/three', maps to - //'one/two/three.js', but we want the directory, 'one/two' for - //this normalization. - normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); - name = normalizedBaseParts.concat(name); - } - - //start trimDots - for (i = 0; i < name.length; i++) { - part = name[i]; - if (part === '.') { - name.splice(i, 1); - i -= 1; - } else if (part === '..') { - // If at the start, or previous value is still .., - // keep them so that when converted to a path it may - // still work when converted to a path, even though - // as an ID it is less than ideal. In larger point - // releases, may be better to just kick out an error. - if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { - continue; - } else if (i > 0) { - name.splice(i - 1, 2); - i -= 2; - } - } - } - //end trimDots - - name = name.join('/'); - } - - //Apply map config if available. - if ((baseParts || starMap) && map) { - nameParts = name.split('/'); - - for (i = nameParts.length; i > 0; i -= 1) { - nameSegment = nameParts.slice(0, i).join("/"); - - if (baseParts) { - //Find the longest baseName segment match in the config. - //So, do joins on the biggest to smallest lengths of baseParts. - for (j = baseParts.length; j > 0; j -= 1) { - mapValue = map[baseParts.slice(0, j).join('/')]; - - //baseName segment has config, find if it has one for - //this name. - if (mapValue) { - mapValue = mapValue[nameSegment]; - if (mapValue) { - //Match, update name to the new value. - foundMap = mapValue; - foundI = i; - break; - } - } - } - } - - if (foundMap) { - break; - } - - //Check for a star map match, but just hold on to it, - //if there is a shorter segment match later in a matching - //config, then favor over this star map. - if (!foundStarMap && starMap && starMap[nameSegment]) { - foundStarMap = starMap[nameSegment]; - starI = i; - } - } - - if (!foundMap && foundStarMap) { - foundMap = foundStarMap; - foundI = starI; - } - - if (foundMap) { - nameParts.splice(0, foundI, foundMap); - name = nameParts.join('/'); - } - } - - return name; - } - - function makeRequire(relName, forceSync) { - return function () { - //A version of a require function that passes a moduleName - //value for items that may need to - //look up paths relative to the moduleName - var args = aps.call(arguments, 0); - - //If first arg is not require('string'), and there is only - //one arg, it is the array form without a callback. Insert - //a null so that the following concat is correct. - if (typeof args[0] !== 'string' && args.length === 1) { - args.push(null); - } - return req.apply(undef, args.concat([relName, forceSync])); - }; - } - - function makeNormalize(relName) { - return function (name) { - return normalize(name, relName); - }; - } - - function makeLoad(depName) { - return function (value) { - defined[depName] = value; - }; - } - - function callDep(name) { - if (hasProp(waiting, name)) { - var args = waiting[name]; - delete waiting[name]; - defining[name] = true; - main.apply(undef, args); - } - - if (!hasProp(defined, name) && !hasProp(defining, name)) { - throw new Error('No ' + name); - } - return defined[name]; - } - - //Turns a plugin!resource to [plugin, resource] - //with the plugin being undefined if the name - //did not have a plugin prefix. - function splitPrefix(name) { - var prefix, - index = name ? name.indexOf('!') : -1; - if (index > -1) { - prefix = name.substring(0, index); - name = name.substring(index + 1, name.length); - } - return [prefix, name]; - } - - //Creates a parts array for a relName where first part is plugin ID, - //second part is resource ID. Assumes relName has already been normalized. - function makeRelParts(relName) { - return relName ? splitPrefix(relName) : []; - } - - /** - * Makes a name map, normalizing the name, and using a plugin - * for normalization if necessary. Grabs a ref to plugin - * too, as an optimization. - */ - makeMap = function (name, relParts) { - var plugin, - parts = splitPrefix(name), - prefix = parts[0], - relResourceName = relParts[1]; - - name = parts[1]; - - if (prefix) { - prefix = normalize(prefix, relResourceName); - plugin = callDep(prefix); - } - - //Normalize according - if (prefix) { - if (plugin && plugin.normalize) { - name = plugin.normalize(name, makeNormalize(relResourceName)); - } else { - name = normalize(name, relResourceName); - } - } else { - name = normalize(name, relResourceName); - parts = splitPrefix(name); - prefix = parts[0]; - name = parts[1]; - if (prefix) { - plugin = callDep(prefix); - } - } - - //Using ridiculous property names for space reasons - return { - f: prefix ? prefix + '!' + name : name, //fullName - n: name, - pr: prefix, - p: plugin - }; - }; - - function makeConfig(name) { - return function () { - return (config && config.config && config.config[name]) || {}; - }; - } - - handlers = { - require: function (name) { - return makeRequire(name); - }, - exports: function (name) { - var e = defined[name]; - if (typeof e !== 'undefined') { - return e; - } else { - return (defined[name] = {}); - } - }, - module: function (name) { - return { - id: name, - uri: '', - exports: defined[name], - config: makeConfig(name) - }; - } - }; - - main = function (name, deps, callback, relName) { - var cjsModule, depName, ret, map, i, relParts, - args = [], - callbackType = typeof callback, - usingExports; - - //Use name if no relName - relName = relName || name; - relParts = makeRelParts(relName); - - //Call the callback to define the module, if necessary. - if (callbackType === 'undefined' || callbackType === 'function') { - //Pull out the defined dependencies and pass the ordered - //values to the callback. - //Default to [require, exports, module] if no deps - deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; - for (i = 0; i < deps.length; i += 1) { - map = makeMap(deps[i], relParts); - depName = map.f; - - //Fast path CommonJS standard dependencies. - if (depName === "require") { - args[i] = handlers.require(name); - } else if (depName === "exports") { - //CommonJS module spec 1.1 - args[i] = handlers.exports(name); - usingExports = true; - } else if (depName === "module") { - //CommonJS module spec 1.1 - cjsModule = args[i] = handlers.module(name); - } else if (hasProp(defined, depName) || - hasProp(waiting, depName) || - hasProp(defining, depName)) { - args[i] = callDep(depName); - } else if (map.p) { - map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); - args[i] = defined[depName]; - } else { - throw new Error(name + ' missing ' + depName); - } - } - - ret = callback ? callback.apply(defined[name], args) : undefined; - - if (name) { - //If setting exports via "module" is in play, - //favor that over return value and exports. After that, - //favor a non-undefined return value over exports use. - if (cjsModule && cjsModule.exports !== undef && - cjsModule.exports !== defined[name]) { - defined[name] = cjsModule.exports; - } else if (ret !== undef || !usingExports) { - //Use the return value from the function. - defined[name] = ret; - } - } - } else if (name) { - //May just be an object definition for the module. Only - //worry about defining if have a module name. - defined[name] = callback; - } - }; - - requirejs = require = req = function (deps, callback, relName, forceSync, alt) { - if (typeof deps === "string") { - if (handlers[deps]) { - //callback in this case is really relName - return handlers[deps](callback); - } - //Just return the module wanted. In this scenario, the - //deps arg is the module name, and second arg (if passed) - //is just the relName. - //Normalize module name, if it contains . or .. - return callDep(makeMap(deps, makeRelParts(callback)).f); - } else if (!deps.splice) { - //deps is a config object, not an array. - config = deps; - if (config.deps) { - req(config.deps, config.callback); - } - if (!callback) { - return; - } - - if (callback.splice) { - //callback is an array, which means it is a dependency list. - //Adjust args if there are dependencies - deps = callback; - callback = relName; - relName = null; - } else { - deps = undef; - } - } - - //Support require(['a']) - callback = callback || function () {}; - - //If relName is a function, it is an errback handler, - //so remove it. - if (typeof relName === 'function') { - relName = forceSync; - forceSync = alt; - } - - //Simulate async callback; - if (forceSync) { - main(undef, deps, callback, relName); - } else { - //Using a non-zero value because of concern for what old browsers - //do, and latest browsers "upgrade" to 4 if lower value is used: - //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: - //If want a value immediately, use require('id') instead -- something - //that works in almond on the global level, but not guaranteed and - //unlikely to work in other AMD implementations. - setTimeout(function () { - main(undef, deps, callback, relName); - }, 4); - } - - return req; - }; - - /** - * Just drops the config on the floor, but returns req in case - * the config return value is used. - */ - req.config = function (cfg) { - return req(cfg); - }; - - /** - * Expose module registry for debugging and tooling - */ - requirejs._defined = defined; - - define = function (name, deps, callback) { - if (typeof name !== 'string') { - throw new Error('See almond README: incorrect module build, no module name'); - } - - //This module may not have dependencies - if (!deps.splice) { - //deps is not an array, so probably means - //an object literal or factory function for - //the value. Adjust args. - callback = deps; - deps = []; - } - - if (!hasProp(defined, name) && !hasProp(waiting, name)) { - waiting[name] = [name, deps, callback]; - } - }; - - define.amd = { - jQuery: true - }; -}()); - -S2.requirejs = requirejs;S2.require = require;S2.define = define; -} -}()); -S2.define("almond", function(){}); - -/* global jQuery:false, $:false */ -S2.define('jquery',[],function () { - var _$ = jQuery || $; - - if (_$ == null && console && console.error) { - console.error( - 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + - 'found. Make sure that you are including jQuery before Select2 on your ' + - 'web page.' - ); - } - - return _$; -}); - -S2.define('select2/utils',[ - 'jquery' -], function ($) { - var Utils = {}; - - Utils.Extend = function (ChildClass, SuperClass) { - var __hasProp = {}.hasOwnProperty; - - function BaseConstructor () { - this.constructor = ChildClass; - } - - for (var key in SuperClass) { - if (__hasProp.call(SuperClass, key)) { - ChildClass[key] = SuperClass[key]; - } - } - - BaseConstructor.prototype = SuperClass.prototype; - ChildClass.prototype = new BaseConstructor(); - ChildClass.__super__ = SuperClass.prototype; - - return ChildClass; - }; - - function getMethods (theClass) { - var proto = theClass.prototype; - - var methods = []; - - for (var methodName in proto) { - var m = proto[methodName]; - - if (typeof m !== 'function') { - continue; - } - - if (methodName === 'constructor') { - continue; - } - - methods.push(methodName); - } - - return methods; - } - - Utils.Decorate = function (SuperClass, DecoratorClass) { - var decoratedMethods = getMethods(DecoratorClass); - var superMethods = getMethods(SuperClass); - - function DecoratedClass () { - var unshift = Array.prototype.unshift; - - var argCount = DecoratorClass.prototype.constructor.length; - - var calledConstructor = SuperClass.prototype.constructor; - - if (argCount > 0) { - unshift.call(arguments, SuperClass.prototype.constructor); - - calledConstructor = DecoratorClass.prototype.constructor; - } - - calledConstructor.apply(this, arguments); - } - - DecoratorClass.displayName = SuperClass.displayName; - - function ctr () { - this.constructor = DecoratedClass; - } - - DecoratedClass.prototype = new ctr(); - - for (var m = 0; m < superMethods.length; m++) { - var superMethod = superMethods[m]; - - DecoratedClass.prototype[superMethod] = - SuperClass.prototype[superMethod]; - } - - var calledMethod = function (methodName) { - // Stub out the original method if it's not decorating an actual method - var originalMethod = function () {}; - - if (methodName in DecoratedClass.prototype) { - originalMethod = DecoratedClass.prototype[methodName]; - } - - var decoratedMethod = DecoratorClass.prototype[methodName]; - - return function () { - var unshift = Array.prototype.unshift; - - unshift.call(arguments, originalMethod); - - return decoratedMethod.apply(this, arguments); - }; - }; - - for (var d = 0; d < decoratedMethods.length; d++) { - var decoratedMethod = decoratedMethods[d]; - - DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); - } - - return DecoratedClass; - }; - - var Observable = function () { - this.listeners = {}; - }; - - Observable.prototype.on = function (event, callback) { - this.listeners = this.listeners || {}; - - if (event in this.listeners) { - this.listeners[event].push(callback); - } else { - this.listeners[event] = [callback]; - } - }; - - Observable.prototype.trigger = function (event) { - var slice = Array.prototype.slice; - var params = slice.call(arguments, 1); - - this.listeners = this.listeners || {}; - - // Params should always come in as an array - if (params == null) { - params = []; - } - - // If there are no arguments to the event, use a temporary object - if (params.length === 0) { - params.push({}); - } - - // Set the `_type` of the first object to the event - params[0]._type = event; - - if (event in this.listeners) { - this.invoke(this.listeners[event], slice.call(arguments, 1)); - } - - if ('*' in this.listeners) { - this.invoke(this.listeners['*'], arguments); - } - }; - - Observable.prototype.invoke = function (listeners, params) { - for (var i = 0, len = listeners.length; i < len; i++) { - listeners[i].apply(this, params); - } - }; - - Utils.Observable = Observable; - - Utils.generateChars = function (length) { - var chars = ''; - - for (var i = 0; i < length; i++) { - var randomChar = Math.floor(Math.random() * 36); - chars += randomChar.toString(36); - } - - return chars; - }; - - Utils.bind = function (func, context) { - return function () { - func.apply(context, arguments); - }; - }; - - Utils._convertData = function (data) { - for (var originalKey in data) { - var keys = originalKey.split('-'); - - var dataLevel = data; - - if (keys.length === 1) { - continue; - } - - for (var k = 0; k < keys.length; k++) { - var key = keys[k]; - - // Lowercase the first letter - // By default, dash-separated becomes camelCase - key = key.substring(0, 1).toLowerCase() + key.substring(1); - - if (!(key in dataLevel)) { - dataLevel[key] = {}; - } - - if (k == keys.length - 1) { - dataLevel[key] = data[originalKey]; - } - - dataLevel = dataLevel[key]; - } - - delete data[originalKey]; - } - - return data; - }; - - Utils.hasScroll = function (index, el) { - // Adapted from the function created by @ShadowScripter - // and adapted by @BillBarry on the Stack Exchange Code Review website. - // The original code can be found at - // http://codereview.stackexchange.com/q/13338 - // and was designed to be used with the Sizzle selector engine. - - var $el = $(el); - var overflowX = el.style.overflowX; - var overflowY = el.style.overflowY; - - //Check both x and y declarations - if (overflowX === overflowY && - (overflowY === 'hidden' || overflowY === 'visible')) { - return false; - } - - if (overflowX === 'scroll' || overflowY === 'scroll') { - return true; - } - - return ($el.innerHeight() < el.scrollHeight || - $el.innerWidth() < el.scrollWidth); - }; - - Utils.escapeMarkup = function (markup) { - var replaceMap = { - '\\': '\', - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '/': '/' - }; - - // Do not try to escape the markup if it's not a string - if (typeof markup !== 'string') { - return markup; - } - - return String(markup).replace(/[&<>"'\/\\]/g, function (match) { - return replaceMap[match]; - }); - }; - - // Append an array of jQuery nodes to a given element. - Utils.appendMany = function ($element, $nodes) { - // jQuery 1.7.x does not support $.fn.append() with an array - // Fall back to a jQuery object collection using $.fn.add() - if ($.fn.jquery.substr(0, 3) === '1.7') { - var $jqNodes = $(); - - $.map($nodes, function (node) { - $jqNodes = $jqNodes.add(node); - }); - - $nodes = $jqNodes; - } - - $element.append($nodes); - }; - - // Cache objects in Utils.__cache instead of $.data (see #4346) - Utils.__cache = {}; - - var id = 0; - Utils.GetUniqueElementId = function (element) { - // Get a unique element Id. If element has no id, - // creates a new unique number, stores it in the id - // attribute and returns the new id. - // If an id already exists, it simply returns it. - - var select2Id = element.getAttribute('data-select2-id'); - if (select2Id == null) { - // If element has id, use it. - if (element.id) { - select2Id = element.id; - element.setAttribute('data-select2-id', select2Id); - } else { - element.setAttribute('data-select2-id', ++id); - select2Id = id.toString(); - } - } - return select2Id; - }; - - Utils.StoreData = function (element, name, value) { - // Stores an item in the cache for a specified element. - // name is the cache key. - var id = Utils.GetUniqueElementId(element); - if (!Utils.__cache[id]) { - Utils.__cache[id] = {}; - } - - Utils.__cache[id][name] = value; - }; - - Utils.GetData = function (element, name) { - // Retrieves a value from the cache by its key (name) - // name is optional. If no name specified, return - // all cache items for the specified element. - // and for a specified element. - var id = Utils.GetUniqueElementId(element); - if (name) { - if (Utils.__cache[id]) { - if (Utils.__cache[id][name] != null) { - return Utils.__cache[id][name]; - } - return $(element).data(name); // Fallback to HTML5 data attribs. - } - return $(element).data(name); // Fallback to HTML5 data attribs. - } else { - return Utils.__cache[id]; - } - }; - - Utils.RemoveData = function (element) { - // Removes all cached items for a specified element. - var id = Utils.GetUniqueElementId(element); - if (Utils.__cache[id] != null) { - delete Utils.__cache[id]; - } - - element.removeAttribute('data-select2-id'); - }; - - return Utils; -}); - -S2.define('select2/results',[ - 'jquery', - './utils' -], function ($, Utils) { - function Results ($element, options, dataAdapter) { - this.$element = $element; - this.data = dataAdapter; - this.options = options; - - Results.__super__.constructor.call(this); - } - - Utils.Extend(Results, Utils.Observable); - - Results.prototype.render = function () { - var $results = $( - '<ul class="select2-results__options" role="listbox"></ul>' - ); - - if (this.options.get('multiple')) { - $results.attr('aria-multiselectable', 'true'); - } - - this.$results = $results; - - return $results; - }; - - Results.prototype.clear = function () { - this.$results.empty(); - }; - - Results.prototype.displayMessage = function (params) { - var escapeMarkup = this.options.get('escapeMarkup'); - - this.clear(); - this.hideLoading(); - - var $message = $( - '<li role="alert" aria-live="assertive"' + - ' class="select2-results__option"></li>' - ); - - var message = this.options.get('translations').get(params.message); - - $message.append( - escapeMarkup( - message(params.args) - ) - ); - - $message[0].className += ' select2-results__message'; - - this.$results.append($message); - }; - - Results.prototype.hideMessages = function () { - this.$results.find('.select2-results__message').remove(); - }; - - Results.prototype.append = function (data) { - this.hideLoading(); - - var $options = []; - - if (data.results == null || data.results.length === 0) { - if (this.$results.children().length === 0) { - this.trigger('results:message', { - message: 'noResults' - }); - } - - return; - } - - data.results = this.sort(data.results); - - for (var d = 0; d < data.results.length; d++) { - var item = data.results[d]; - - var $option = this.option(item); - - $options.push($option); - } - - this.$results.append($options); - }; - - Results.prototype.position = function ($results, $dropdown) { - var $resultsContainer = $dropdown.find('.select2-results'); - $resultsContainer.append($results); - }; - - Results.prototype.sort = function (data) { - var sorter = this.options.get('sorter'); - - return sorter(data); - }; - - Results.prototype.highlightFirstItem = function () { - var $options = this.$results - .find('.select2-results__option[aria-selected]'); - - var $selected = $options.filter('[aria-selected=true]'); - - // Check if there are any selected options - if ($selected.length > 0) { - // If there are selected options, highlight the first - $selected.first().trigger('mouseenter'); - } else { - // If there are no selected options, highlight the first option - // in the dropdown - $options.first().trigger('mouseenter'); - } - - this.ensureHighlightVisible(); - }; - - Results.prototype.setClasses = function () { - var self = this; - - this.data.current(function (selected) { - var selectedIds = $.map(selected, function (s) { - return s.id.toString(); - }); - - var $options = self.$results - .find('.select2-results__option[aria-selected]'); - - $options.each(function () { - var $option = $(this); - - var item = Utils.GetData(this, 'data'); - - // id needs to be converted to a string when comparing - var id = '' + item.id; - - if ((item.element != null && item.element.selected) || - (item.element == null && $.inArray(id, selectedIds) > -1)) { - $option.attr('aria-selected', 'true'); - } else { - $option.attr('aria-selected', 'false'); - } - }); - - }); - }; - - Results.prototype.showLoading = function (params) { - this.hideLoading(); - - var loadingMore = this.options.get('translations').get('searching'); - - var loading = { - disabled: true, - loading: true, - text: loadingMore(params) - }; - var $loading = this.option(loading); - $loading.className += ' loading-results'; - - this.$results.prepend($loading); - }; - - Results.prototype.hideLoading = function () { - this.$results.find('.loading-results').remove(); - }; - - Results.prototype.option = function (data) { - var option = document.createElement('li'); - option.className = 'select2-results__option'; - - var attrs = { - 'role': 'option', - 'aria-selected': 'false' - }; - - var matches = window.Element.prototype.matches || - window.Element.prototype.msMatchesSelector || - window.Element.prototype.webkitMatchesSelector; - - if ((data.element != null && matches.call(data.element, ':disabled')) || - (data.element == null && data.disabled)) { - delete attrs['aria-selected']; - attrs['aria-disabled'] = 'true'; - } - - if (data.id == null) { - delete attrs['aria-selected']; - } - - if (data._resultId != null) { - option.id = data._resultId; - } - - if (data.title) { - option.title = data.title; - } - - if (data.children) { - attrs.role = 'group'; - attrs['aria-label'] = data.text; - delete attrs['aria-selected']; - } - - for (var attr in attrs) { - var val = attrs[attr]; - - option.setAttribute(attr, val); - } - - if (data.children) { - var $option = $(option); - - var label = document.createElement('strong'); - label.className = 'select2-results__group'; - - var $label = $(label); - this.template(data, label); - - var $children = []; - - for (var c = 0; c < data.children.length; c++) { - var child = data.children[c]; - - var $child = this.option(child); - - $children.push($child); - } - - var $childrenContainer = $('<ul></ul>', { - 'class': 'select2-results__options select2-results__options--nested' - }); - - $childrenContainer.append($children); - - $option.append(label); - $option.append($childrenContainer); - } else { - this.template(data, option); - } - - Utils.StoreData(option, 'data', data); - - return option; - }; - - Results.prototype.bind = function (container, $container) { - var self = this; - - var id = container.id + '-results'; - - this.$results.attr('id', id); - - container.on('results:all', function (params) { - self.clear(); - self.append(params.data); - - if (container.isOpen()) { - self.setClasses(); - self.highlightFirstItem(); - } - }); - - container.on('results:append', function (params) { - self.append(params.data); - - if (container.isOpen()) { - self.setClasses(); - } - }); - - container.on('query', function (params) { - self.hideMessages(); - self.showLoading(params); - }); - - container.on('select', function () { - if (!container.isOpen()) { - return; - } - - self.setClasses(); - - if (self.options.get('scrollAfterSelect')) { - self.highlightFirstItem(); - } - }); - - container.on('unselect', function () { - if (!container.isOpen()) { - return; - } - - self.setClasses(); - - if (self.options.get('scrollAfterSelect')) { - self.highlightFirstItem(); - } - }); - - container.on('open', function () { - // When the dropdown is open, aria-expended="true" - self.$results.attr('aria-expanded', 'true'); - self.$results.attr('aria-hidden', 'false'); - - self.setClasses(); - self.ensureHighlightVisible(); - }); - - container.on('close', function () { - // When the dropdown is closed, aria-expended="false" - self.$results.attr('aria-expanded', 'false'); - self.$results.attr('aria-hidden', 'true'); - self.$results.removeAttr('aria-activedescendant'); - }); - - container.on('results:toggle', function () { - var $highlighted = self.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - $highlighted.trigger('mouseup'); - }); - - container.on('results:select', function () { - var $highlighted = self.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - var data = Utils.GetData($highlighted[0], 'data'); - - if ($highlighted.attr('aria-selected') == 'true') { - self.trigger('close', {}); - } else { - self.trigger('select', { - data: data - }); - } - }); - - container.on('results:previous', function () { - var $highlighted = self.getHighlightedResults(); - - var $options = self.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - // If we are already at the top, don't move further - // If no options, currentIndex will be -1 - if (currentIndex <= 0) { - return; - } - - var nextIndex = currentIndex - 1; - - // If none are highlighted, highlight the first - if ($highlighted.length === 0) { - nextIndex = 0; - } - - var $next = $options.eq(nextIndex); - - $next.trigger('mouseenter'); - - var currentOffset = self.$results.offset().top; - var nextTop = $next.offset().top; - var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); - - if (nextIndex === 0) { - self.$results.scrollTop(0); - } else if (nextTop - currentOffset < 0) { - self.$results.scrollTop(nextOffset); - } - }); - - container.on('results:next', function () { - var $highlighted = self.getHighlightedResults(); - - var $options = self.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - var nextIndex = currentIndex + 1; - - // If we are at the last option, stay there - if (nextIndex >= $options.length) { - return; - } - - var $next = $options.eq(nextIndex); - - $next.trigger('mouseenter'); - - var currentOffset = self.$results.offset().top + - self.$results.outerHeight(false); - var nextBottom = $next.offset().top + $next.outerHeight(false); - var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; - - if (nextIndex === 0) { - self.$results.scrollTop(0); - } else if (nextBottom > currentOffset) { - self.$results.scrollTop(nextOffset); - } - }); - - container.on('results:focus', function (params) { - params.element.addClass('select2-results__option--highlighted'); - }); - - container.on('results:message', function (params) { - self.displayMessage(params); - }); - - if ($.fn.mousewheel) { - this.$results.on('mousewheel', function (e) { - var top = self.$results.scrollTop(); - - var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; - - var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; - var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); - - if (isAtTop) { - self.$results.scrollTop(0); - - e.preventDefault(); - e.stopPropagation(); - } else if (isAtBottom) { - self.$results.scrollTop( - self.$results.get(0).scrollHeight - self.$results.height() - ); - - e.preventDefault(); - e.stopPropagation(); - } - }); - } - - this.$results.on('mouseup', '.select2-results__option[aria-selected]', - function (evt) { - var $this = $(this); - - var data = Utils.GetData(this, 'data'); - - if ($this.attr('aria-selected') === 'true') { - if (self.options.get('multiple')) { - self.trigger('unselect', { - originalEvent: evt, - data: data - }); - } else { - self.trigger('close', {}); - } - - return; - } - - self.trigger('select', { - originalEvent: evt, - data: data - }); - }); - - this.$results.on('mouseenter', '.select2-results__option[aria-selected]', - function (evt) { - var data = Utils.GetData(this, 'data'); - - self.getHighlightedResults() - .removeClass('select2-results__option--highlighted'); - - self.trigger('results:focus', { - data: data, - element: $(this) - }); - }); - }; - - Results.prototype.getHighlightedResults = function () { - var $highlighted = this.$results - .find('.select2-results__option--highlighted'); - - return $highlighted; - }; - - Results.prototype.destroy = function () { - this.$results.remove(); - }; - - Results.prototype.ensureHighlightVisible = function () { - var $highlighted = this.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - var $options = this.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - var currentOffset = this.$results.offset().top; - var nextTop = $highlighted.offset().top; - var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); - - var offsetDelta = nextTop - currentOffset; - nextOffset -= $highlighted.outerHeight(false) * 2; - - if (currentIndex <= 2) { - this.$results.scrollTop(0); - } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { - this.$results.scrollTop(nextOffset); - } - }; - - Results.prototype.template = function (result, container) { - var template = this.options.get('templateResult'); - var escapeMarkup = this.options.get('escapeMarkup'); - - var content = template(result, container); - - if (content == null) { - container.style.display = 'none'; - } else if (typeof content === 'string') { - container.innerHTML = escapeMarkup(content); - } else { - $(container).append(content); - } - }; - - return Results; -}); - -S2.define('select2/keys',[ - -], function () { - var KEYS = { - BACKSPACE: 8, - TAB: 9, - ENTER: 13, - SHIFT: 16, - CTRL: 17, - ALT: 18, - ESC: 27, - SPACE: 32, - PAGE_UP: 33, - PAGE_DOWN: 34, - END: 35, - HOME: 36, - LEFT: 37, - UP: 38, - RIGHT: 39, - DOWN: 40, - DELETE: 46 - }; - - return KEYS; -}); - -S2.define('select2/selection/base',[ - 'jquery', - '../utils', - '../keys' -], function ($, Utils, KEYS) { - function BaseSelection ($element, options) { - this.$element = $element; - this.options = options; - - BaseSelection.__super__.constructor.call(this); - } - - Utils.Extend(BaseSelection, Utils.Observable); - - BaseSelection.prototype.render = function () { - var $selection = $( - '<span class="select2-selection" role="combobox" ' + - ' aria-haspopup="true" aria-expanded="false">' + - '</span>' - ); - - this._tabindex = 0; - - if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { - this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); - } else if (this.$element.attr('tabindex') != null) { - this._tabindex = this.$element.attr('tabindex'); - } - - $selection.attr('title', this.$element.attr('title')); - $selection.attr('tabindex', this._tabindex); - $selection.attr('aria-disabled', 'false'); - - this.$selection = $selection; - - return $selection; - }; - - BaseSelection.prototype.bind = function (container, $container) { - var self = this; - - var resultsId = container.id + '-results'; - - this.container = container; - - this.$selection.on('focus', function (evt) { - self.trigger('focus', evt); - }); - - this.$selection.on('blur', function (evt) { - self._handleBlur(evt); - }); - - this.$selection.on('keydown', function (evt) { - self.trigger('keypress', evt); - - if (evt.which === KEYS.SPACE) { - evt.preventDefault(); - } - }); - - container.on('results:focus', function (params) { - self.$selection.attr('aria-activedescendant', params.data._resultId); - }); - - container.on('selection:update', function (params) { - self.update(params.data); - }); - - container.on('open', function () { - // When the dropdown is open, aria-expanded="true" - self.$selection.attr('aria-expanded', 'true'); - self.$selection.attr('aria-owns', resultsId); - - self._attachCloseHandler(container); - }); - - container.on('close', function () { - // When the dropdown is closed, aria-expanded="false" - self.$selection.attr('aria-expanded', 'false'); - self.$selection.removeAttr('aria-activedescendant'); - self.$selection.removeAttr('aria-owns'); - - self.$selection.trigger('focus'); - - self._detachCloseHandler(container); - }); - - container.on('enable', function () { - self.$selection.attr('tabindex', self._tabindex); - self.$selection.attr('aria-disabled', 'false'); - }); - - container.on('disable', function () { - self.$selection.attr('tabindex', '-1'); - self.$selection.attr('aria-disabled', 'true'); - }); - }; - - BaseSelection.prototype._handleBlur = function (evt) { - var self = this; - - // This needs to be delayed as the active element is the body when the tab - // key is pressed, possibly along with others. - window.setTimeout(function () { - // Don't trigger `blur` if the focus is still in the selection - if ( - (document.activeElement == self.$selection[0]) || - ($.contains(self.$selection[0], document.activeElement)) - ) { - return; - } - - self.trigger('blur', evt); - }, 1); - }; - - BaseSelection.prototype._attachCloseHandler = function (container) { - - $(document.body).on('mousedown.select2.' + container.id, function (e) { - var $target = $(e.target); - - var $select = $target.closest('.select2'); - - var $all = $('.select2.select2-container--open'); - - $all.each(function () { - if (this == $select[0]) { - return; - } - - var $element = Utils.GetData(this, 'element'); - - $element.select2('close'); - }); - }); - }; - - BaseSelection.prototype._detachCloseHandler = function (container) { - $(document.body).off('mousedown.select2.' + container.id); - }; - - BaseSelection.prototype.position = function ($selection, $container) { - var $selectionContainer = $container.find('.selection'); - $selectionContainer.append($selection); - }; - - BaseSelection.prototype.destroy = function () { - this._detachCloseHandler(this.container); - }; - - BaseSelection.prototype.update = function (data) { - throw new Error('The `update` method must be defined in child classes.'); - }; - - /** - * Helper method to abstract the "enabled" (not "disabled") state of this - * object. - * - * @return {true} if the instance is not disabled. - * @return {false} if the instance is disabled. - */ - BaseSelection.prototype.isEnabled = function () { - return !this.isDisabled(); - }; - - /** - * Helper method to abstract the "disabled" state of this object. - * - * @return {true} if the disabled option is true. - * @return {false} if the disabled option is false. - */ - BaseSelection.prototype.isDisabled = function () { - return this.options.get('disabled'); - }; - - return BaseSelection; -}); - -S2.define('select2/selection/single',[ - 'jquery', - './base', - '../utils', - '../keys' -], function ($, BaseSelection, Utils, KEYS) { - function SingleSelection () { - SingleSelection.__super__.constructor.apply(this, arguments); - } - - Utils.Extend(SingleSelection, BaseSelection); - - SingleSelection.prototype.render = function () { - var $selection = SingleSelection.__super__.render.call(this); - - $selection.addClass('select2-selection--single'); - - $selection.html( - '<span class="select2-selection__rendered"></span>' + - '<span class="select2-selection__arrow" role="presentation">' + - '<b role="presentation"></b>' + - '</span>' - ); - - return $selection; - }; - - SingleSelection.prototype.bind = function (container, $container) { - var self = this; - - SingleSelection.__super__.bind.apply(this, arguments); - - var id = container.id + '-container'; - - this.$selection.find('.select2-selection__rendered') - .attr('id', id) - .attr('role', 'textbox') - .attr('aria-readonly', 'true'); - this.$selection.attr('aria-labelledby', id); - - this.$selection.on('mousedown', function (evt) { - // Only respond to left clicks - if (evt.which !== 1) { - return; - } - - self.trigger('toggle', { - originalEvent: evt - }); - }); - - this.$selection.on('focus', function (evt) { - // User focuses on the container - }); - - this.$selection.on('blur', function (evt) { - // User exits the container - }); - - container.on('focus', function (evt) { - if (!container.isOpen()) { - self.$selection.trigger('focus'); - } - }); - }; - - SingleSelection.prototype.clear = function () { - var $rendered = this.$selection.find('.select2-selection__rendered'); - $rendered.empty(); - $rendered.removeAttr('title'); // clear tooltip on empty - }; - - SingleSelection.prototype.display = function (data, container) { - var template = this.options.get('templateSelection'); - var escapeMarkup = this.options.get('escapeMarkup'); - - return escapeMarkup(template(data, container)); - }; - - SingleSelection.prototype.selectionContainer = function () { - return $('<span></span>'); - }; - - SingleSelection.prototype.update = function (data) { - if (data.length === 0) { - this.clear(); - return; - } - - var selection = data[0]; - - var $rendered = this.$selection.find('.select2-selection__rendered'); - var formatted = this.display(selection, $rendered); - - $rendered.empty().append(formatted); - - var title = selection.title || selection.text; - - if (title) { - $rendered.attr('title', title); - } else { - $rendered.removeAttr('title'); - } - }; - - return SingleSelection; -}); - -S2.define('select2/selection/multiple',[ - 'jquery', - './base', - '../utils' -], function ($, BaseSelection, Utils) { - function MultipleSelection ($element, options) { - MultipleSelection.__super__.constructor.apply(this, arguments); - } - - Utils.Extend(MultipleSelection, BaseSelection); - - MultipleSelection.prototype.render = function () { - var $selection = MultipleSelection.__super__.render.call(this); - - $selection.addClass('select2-selection--multiple'); - - $selection.html( - '<ul class="select2-selection__rendered"></ul>' - ); - - return $selection; - }; - - MultipleSelection.prototype.bind = function (container, $container) { - var self = this; - - MultipleSelection.__super__.bind.apply(this, arguments); - - this.$selection.on('click', function (evt) { - self.trigger('toggle', { - originalEvent: evt - }); - }); - - this.$selection.on( - 'click', - '.select2-selection__choice__remove', - function (evt) { - // Ignore the event if it is disabled - if (self.isDisabled()) { - return; - } - - var $remove = $(this); - var $selection = $remove.parent(); - - var data = Utils.GetData($selection[0], 'data'); - - self.trigger('unselect', { - originalEvent: evt, - data: data - }); - } - ); - }; - - MultipleSelection.prototype.clear = function () { - var $rendered = this.$selection.find('.select2-selection__rendered'); - $rendered.empty(); - $rendered.removeAttr('title'); - }; - - MultipleSelection.prototype.display = function (data, container) { - var template = this.options.get('templateSelection'); - var escapeMarkup = this.options.get('escapeMarkup'); - - return escapeMarkup(template(data, container)); - }; - - MultipleSelection.prototype.selectionContainer = function () { - var $container = $( - '<li class="select2-selection__choice">' + - '<span class="select2-selection__choice__remove" role="presentation">' + - '×' + - '</span>' + - '</li>' - ); - - return $container; - }; - - MultipleSelection.prototype.update = function (data) { - this.clear(); - - if (data.length === 0) { - return; - } - - var $selections = []; - - for (var d = 0; d < data.length; d++) { - var selection = data[d]; - - var $selection = this.selectionContainer(); - var formatted = this.display(selection, $selection); - - $selection.append(formatted); - - var title = selection.title || selection.text; - - if (title) { - $selection.attr('title', title); - } - - Utils.StoreData($selection[0], 'data', selection); - - $selections.push($selection); - } - - var $rendered = this.$selection.find('.select2-selection__rendered'); - - Utils.appendMany($rendered, $selections); - }; - - return MultipleSelection; -}); - -S2.define('select2/selection/placeholder',[ - '../utils' -], function (Utils) { - function Placeholder (decorated, $element, options) { - this.placeholder = this.normalizePlaceholder(options.get('placeholder')); - - decorated.call(this, $element, options); - } - - Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { - if (typeof placeholder === 'string') { - placeholder = { - id: '', - text: placeholder - }; - } - - return placeholder; - }; - - Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { - var $placeholder = this.selectionContainer(); - - $placeholder.html(this.display(placeholder)); - $placeholder.addClass('select2-selection__placeholder') - .removeClass('select2-selection__choice'); - - return $placeholder; - }; - - Placeholder.prototype.update = function (decorated, data) { - var singlePlaceholder = ( - data.length == 1 && data[0].id != this.placeholder.id - ); - var multipleSelections = data.length > 1; - - if (multipleSelections || singlePlaceholder) { - return decorated.call(this, data); - } - - this.clear(); - - var $placeholder = this.createPlaceholder(this.placeholder); - - this.$selection.find('.select2-selection__rendered').append($placeholder); - }; - - return Placeholder; -}); - -S2.define('select2/selection/allowClear',[ - 'jquery', - '../keys', - '../utils' -], function ($, KEYS, Utils) { - function AllowClear () { } - - AllowClear.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - if (this.placeholder == null) { - if (this.options.get('debug') && window.console && console.error) { - console.error( - 'Select2: The `allowClear` option should be used in combination ' + - 'with the `placeholder` option.' - ); - } - } - - this.$selection.on('mousedown', '.select2-selection__clear', - function (evt) { - self._handleClear(evt); - }); - - container.on('keypress', function (evt) { - self._handleKeyboardClear(evt, container); - }); - }; - - AllowClear.prototype._handleClear = function (_, evt) { - // Ignore the event if it is disabled - if (this.isDisabled()) { - return; - } - - var $clear = this.$selection.find('.select2-selection__clear'); - - // Ignore the event if nothing has been selected - if ($clear.length === 0) { - return; - } - - evt.stopPropagation(); - - var data = Utils.GetData($clear[0], 'data'); - - var previousVal = this.$element.val(); - this.$element.val(this.placeholder.id); - - var unselectData = { - data: data - }; - this.trigger('clear', unselectData); - if (unselectData.prevented) { - this.$element.val(previousVal); - return; - } - - for (var d = 0; d < data.length; d++) { - unselectData = { - data: data[d] - }; - - // Trigger the `unselect` event, so people can prevent it from being - // cleared. - this.trigger('unselect', unselectData); - - // If the event was prevented, don't clear it out. - if (unselectData.prevented) { - this.$element.val(previousVal); - return; - } - } - - this.$element.trigger('input').trigger('change'); - - this.trigger('toggle', {}); - }; - - AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { - if (container.isOpen()) { - return; - } - - if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { - this._handleClear(evt); - } - }; - - AllowClear.prototype.update = function (decorated, data) { - decorated.call(this, data); - - if (this.$selection.find('.select2-selection__placeholder').length > 0 || - data.length === 0) { - return; - } - - var removeAll = this.options.get('translations').get('removeAllItems'); - - var $remove = $( - '<span class="select2-selection__clear" title="' + removeAll() +'">' + - '×' + - '</span>' - ); - Utils.StoreData($remove[0], 'data', data); - - this.$selection.find('.select2-selection__rendered').prepend($remove); - }; - - return AllowClear; -}); - -S2.define('select2/selection/search',[ - 'jquery', - '../utils', - '../keys' -], function ($, Utils, KEYS) { - function Search (decorated, $element, options) { - decorated.call(this, $element, options); - } - - Search.prototype.render = function (decorated) { - var $search = $( - '<li class="select2-search select2-search--inline">' + - '<input class="select2-search__field" type="search" tabindex="-1"' + - ' autocomplete="off" autocorrect="off" autocapitalize="none"' + - ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' + - '</li>' - ); - - this.$searchContainer = $search; - this.$search = $search.find('input'); - - var $rendered = decorated.call(this); - - this._transferTabIndex(); - - return $rendered; - }; - - Search.prototype.bind = function (decorated, container, $container) { - var self = this; - - var resultsId = container.id + '-results'; - - decorated.call(this, container, $container); - - container.on('open', function () { - self.$search.attr('aria-controls', resultsId); - self.$search.trigger('focus'); - }); - - container.on('close', function () { - self.$search.val(''); - self.$search.removeAttr('aria-controls'); - self.$search.removeAttr('aria-activedescendant'); - self.$search.trigger('focus'); - }); - - container.on('enable', function () { - self.$search.prop('disabled', false); - - self._transferTabIndex(); - }); - - container.on('disable', function () { - self.$search.prop('disabled', true); - }); - - container.on('focus', function (evt) { - self.$search.trigger('focus'); - }); - - container.on('results:focus', function (params) { - if (params.data._resultId) { - self.$search.attr('aria-activedescendant', params.data._resultId); - } else { - self.$search.removeAttr('aria-activedescendant'); - } - }); - - this.$selection.on('focusin', '.select2-search--inline', function (evt) { - self.trigger('focus', evt); - }); - - this.$selection.on('focusout', '.select2-search--inline', function (evt) { - self._handleBlur(evt); - }); - - this.$selection.on('keydown', '.select2-search--inline', function (evt) { - evt.stopPropagation(); - - self.trigger('keypress', evt); - - self._keyUpPrevented = evt.isDefaultPrevented(); - - var key = evt.which; - - if (key === KEYS.BACKSPACE && self.$search.val() === '') { - var $previousChoice = self.$searchContainer - .prev('.select2-selection__choice'); - - if ($previousChoice.length > 0) { - var item = Utils.GetData($previousChoice[0], 'data'); - - self.searchRemoveChoice(item); - - evt.preventDefault(); - } - } - }); - - this.$selection.on('click', '.select2-search--inline', function (evt) { - if (self.$search.val()) { - evt.stopPropagation(); - } - }); - - // Try to detect the IE version should the `documentMode` property that - // is stored on the document. This is only implemented in IE and is - // slightly cleaner than doing a user agent check. - // This property is not available in Edge, but Edge also doesn't have - // this bug. - var msie = document.documentMode; - var disableInputEvents = msie && msie <= 11; - - // Workaround for browsers which do not support the `input` event - // This will prevent double-triggering of events for browsers which support - // both the `keyup` and `input` events. - this.$selection.on( - 'input.searchcheck', - '.select2-search--inline', - function (evt) { - // IE will trigger the `input` event when a placeholder is used on a - // search box. To get around this issue, we are forced to ignore all - // `input` events in IE and keep using `keyup`. - if (disableInputEvents) { - self.$selection.off('input.search input.searchcheck'); - return; - } - - // Unbind the duplicated `keyup` event - self.$selection.off('keyup.search'); - } - ); - - this.$selection.on( - 'keyup.search input.search', - '.select2-search--inline', - function (evt) { - // IE will trigger the `input` event when a placeholder is used on a - // search box. To get around this issue, we are forced to ignore all - // `input` events in IE and keep using `keyup`. - if (disableInputEvents && evt.type === 'input') { - self.$selection.off('input.search input.searchcheck'); - return; - } - - var key = evt.which; - - // We can freely ignore events from modifier keys - if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { - return; - } - - // Tabbing will be handled during the `keydown` phase - if (key == KEYS.TAB) { - return; - } - - self.handleSearch(evt); - } - ); - }; - - /** - * This method will transfer the tabindex attribute from the rendered - * selection to the search box. This allows for the search box to be used as - * the primary focus instead of the selection container. - * - * @private - */ - Search.prototype._transferTabIndex = function (decorated) { - this.$search.attr('tabindex', this.$selection.attr('tabindex')); - this.$selection.attr('tabindex', '-1'); - }; - - Search.prototype.createPlaceholder = function (decorated, placeholder) { - this.$search.attr('placeholder', placeholder.text); - }; - - Search.prototype.update = function (decorated, data) { - var searchHadFocus = this.$search[0] == document.activeElement; - - this.$search.attr('placeholder', ''); - - decorated.call(this, data); - - this.$selection.find('.select2-selection__rendered') - .append(this.$searchContainer); - - this.resizeSearch(); - if (searchHadFocus) { - this.$search.trigger('focus'); - } - }; - - Search.prototype.handleSearch = function () { - this.resizeSearch(); - - if (!this._keyUpPrevented) { - var input = this.$search.val(); - - this.trigger('query', { - term: input - }); - } - - this._keyUpPrevented = false; - }; - - Search.prototype.searchRemoveChoice = function (decorated, item) { - this.trigger('unselect', { - data: item - }); - - this.$search.val(item.text); - this.handleSearch(); - }; - - Search.prototype.resizeSearch = function () { - this.$search.css('width', '25px'); - - var width = ''; - - if (this.$search.attr('placeholder') !== '') { - width = this.$selection.find('.select2-selection__rendered').width(); - } else { - var minimumWidth = this.$search.val().length + 1; - - width = (minimumWidth * 0.75) + 'em'; - } - - this.$search.css('width', width); - }; - - return Search; -}); - -S2.define('select2/selection/eventRelay',[ - 'jquery' -], function ($) { - function EventRelay () { } - - EventRelay.prototype.bind = function (decorated, container, $container) { - var self = this; - var relayEvents = [ - 'open', 'opening', - 'close', 'closing', - 'select', 'selecting', - 'unselect', 'unselecting', - 'clear', 'clearing' - ]; - - var preventableEvents = [ - 'opening', 'closing', 'selecting', 'unselecting', 'clearing' - ]; - - decorated.call(this, container, $container); - - container.on('*', function (name, params) { - // Ignore events that should not be relayed - if ($.inArray(name, relayEvents) === -1) { - return; - } - - // The parameters should always be an object - params = params || {}; - - // Generate the jQuery event for the Select2 event - var evt = $.Event('select2:' + name, { - params: params - }); - - self.$element.trigger(evt); - - // Only handle preventable events if it was one - if ($.inArray(name, preventableEvents) === -1) { - return; - } - - params.prevented = evt.isDefaultPrevented(); - }); - }; - - return EventRelay; -}); - -S2.define('select2/translation',[ - 'jquery', - 'require' -], function ($, require) { - function Translation (dict) { - this.dict = dict || {}; - } - - Translation.prototype.all = function () { - return this.dict; - }; - - Translation.prototype.get = function (key) { - return this.dict[key]; - }; - - Translation.prototype.extend = function (translation) { - this.dict = $.extend({}, translation.all(), this.dict); - }; - - // Static functions - - Translation._cache = {}; - - Translation.loadPath = function (path) { - if (!(path in Translation._cache)) { - var translations = require(path); - - Translation._cache[path] = translations; - } - - return new Translation(Translation._cache[path]); - }; - - return Translation; -}); - -S2.define('select2/diacritics',[ - -], function () { - var diacritics = { - '\u24B6': 'A', - '\uFF21': 'A', - '\u00C0': 'A', - '\u00C1': 'A', - '\u00C2': 'A', - '\u1EA6': 'A', - '\u1EA4': 'A', - '\u1EAA': 'A', - '\u1EA8': 'A', - '\u00C3': 'A', - '\u0100': 'A', - '\u0102': 'A', - '\u1EB0': 'A', - '\u1EAE': 'A', - '\u1EB4': 'A', - '\u1EB2': 'A', - '\u0226': 'A', - '\u01E0': 'A', - '\u00C4': 'A', - '\u01DE': 'A', - '\u1EA2': 'A', - '\u00C5': 'A', - '\u01FA': 'A', - '\u01CD': 'A', - '\u0200': 'A', - '\u0202': 'A', - '\u1EA0': 'A', - '\u1EAC': 'A', - '\u1EB6': 'A', - '\u1E00': 'A', - '\u0104': 'A', - '\u023A': 'A', - '\u2C6F': 'A', - '\uA732': 'AA', - '\u00C6': 'AE', - '\u01FC': 'AE', - '\u01E2': 'AE', - '\uA734': 'AO', - '\uA736': 'AU', - '\uA738': 'AV', - '\uA73A': 'AV', - '\uA73C': 'AY', - '\u24B7': 'B', - '\uFF22': 'B', - '\u1E02': 'B', - '\u1E04': 'B', - '\u1E06': 'B', - '\u0243': 'B', - '\u0182': 'B', - '\u0181': 'B', - '\u24B8': 'C', - '\uFF23': 'C', - '\u0106': 'C', - '\u0108': 'C', - '\u010A': 'C', - '\u010C': 'C', - '\u00C7': 'C', - '\u1E08': 'C', - '\u0187': 'C', - '\u023B': 'C', - '\uA73E': 'C', - '\u24B9': 'D', - '\uFF24': 'D', - '\u1E0A': 'D', - '\u010E': 'D', - '\u1E0C': 'D', - '\u1E10': 'D', - '\u1E12': 'D', - '\u1E0E': 'D', - '\u0110': 'D', - '\u018B': 'D', - '\u018A': 'D', - '\u0189': 'D', - '\uA779': 'D', - '\u01F1': 'DZ', - '\u01C4': 'DZ', - '\u01F2': 'Dz', - '\u01C5': 'Dz', - '\u24BA': 'E', - '\uFF25': 'E', - '\u00C8': 'E', - '\u00C9': 'E', - '\u00CA': 'E', - '\u1EC0': 'E', - '\u1EBE': 'E', - '\u1EC4': 'E', - '\u1EC2': 'E', - '\u1EBC': 'E', - '\u0112': 'E', - '\u1E14': 'E', - '\u1E16': 'E', - '\u0114': 'E', - '\u0116': 'E', - '\u00CB': 'E', - '\u1EBA': 'E', - '\u011A': 'E', - '\u0204': 'E', - '\u0206': 'E', - '\u1EB8': 'E', - '\u1EC6': 'E', - '\u0228': 'E', - '\u1E1C': 'E', - '\u0118': 'E', - '\u1E18': 'E', - '\u1E1A': 'E', - '\u0190': 'E', - '\u018E': 'E', - '\u24BB': 'F', - '\uFF26': 'F', - '\u1E1E': 'F', - '\u0191': 'F', - '\uA77B': 'F', - '\u24BC': 'G', - '\uFF27': 'G', - '\u01F4': 'G', - '\u011C': 'G', - '\u1E20': 'G', - '\u011E': 'G', - '\u0120': 'G', - '\u01E6': 'G', - '\u0122': 'G', - '\u01E4': 'G', - '\u0193': 'G', - '\uA7A0': 'G', - '\uA77D': 'G', - '\uA77E': 'G', - '\u24BD': 'H', - '\uFF28': 'H', - '\u0124': 'H', - '\u1E22': 'H', - '\u1E26': 'H', - '\u021E': 'H', - '\u1E24': 'H', - '\u1E28': 'H', - '\u1E2A': 'H', - '\u0126': 'H', - '\u2C67': 'H', - '\u2C75': 'H', - '\uA78D': 'H', - '\u24BE': 'I', - '\uFF29': 'I', - '\u00CC': 'I', - '\u00CD': 'I', - '\u00CE': 'I', - '\u0128': 'I', - '\u012A': 'I', - '\u012C': 'I', - '\u0130': 'I', - '\u00CF': 'I', - '\u1E2E': 'I', - '\u1EC8': 'I', - '\u01CF': 'I', - '\u0208': 'I', - '\u020A': 'I', - '\u1ECA': 'I', - '\u012E': 'I', - '\u1E2C': 'I', - '\u0197': 'I', - '\u24BF': 'J', - '\uFF2A': 'J', - '\u0134': 'J', - '\u0248': 'J', - '\u24C0': 'K', - '\uFF2B': 'K', - '\u1E30': 'K', - '\u01E8': 'K', - '\u1E32': 'K', - '\u0136': 'K', - '\u1E34': 'K', - '\u0198': 'K', - '\u2C69': 'K', - '\uA740': 'K', - '\uA742': 'K', - '\uA744': 'K', - '\uA7A2': 'K', - '\u24C1': 'L', - '\uFF2C': 'L', - '\u013F': 'L', - '\u0139': 'L', - '\u013D': 'L', - '\u1E36': 'L', - '\u1E38': 'L', - '\u013B': 'L', - '\u1E3C': 'L', - '\u1E3A': 'L', - '\u0141': 'L', - '\u023D': 'L', - '\u2C62': 'L', - '\u2C60': 'L', - '\uA748': 'L', - '\uA746': 'L', - '\uA780': 'L', - '\u01C7': 'LJ', - '\u01C8': 'Lj', - '\u24C2': 'M', - '\uFF2D': 'M', - '\u1E3E': 'M', - '\u1E40': 'M', - '\u1E42': 'M', - '\u2C6E': 'M', - '\u019C': 'M', - '\u24C3': 'N', - '\uFF2E': 'N', - '\u01F8': 'N', - '\u0143': 'N', - '\u00D1': 'N', - '\u1E44': 'N', - '\u0147': 'N', - '\u1E46': 'N', - '\u0145': 'N', - '\u1E4A': 'N', - '\u1E48': 'N', - '\u0220': 'N', - '\u019D': 'N', - '\uA790': 'N', - '\uA7A4': 'N', - '\u01CA': 'NJ', - '\u01CB': 'Nj', - '\u24C4': 'O', - '\uFF2F': 'O', - '\u00D2': 'O', - '\u00D3': 'O', - '\u00D4': 'O', - '\u1ED2': 'O', - '\u1ED0': 'O', - '\u1ED6': 'O', - '\u1ED4': 'O', - '\u00D5': 'O', - '\u1E4C': 'O', - '\u022C': 'O', - '\u1E4E': 'O', - '\u014C': 'O', - '\u1E50': 'O', - '\u1E52': 'O', - '\u014E': 'O', - '\u022E': 'O', - '\u0230': 'O', - '\u00D6': 'O', - '\u022A': 'O', - '\u1ECE': 'O', - '\u0150': 'O', - '\u01D1': 'O', - '\u020C': 'O', - '\u020E': 'O', - '\u01A0': 'O', - '\u1EDC': 'O', - '\u1EDA': 'O', - '\u1EE0': 'O', - '\u1EDE': 'O', - '\u1EE2': 'O', - '\u1ECC': 'O', - '\u1ED8': 'O', - '\u01EA': 'O', - '\u01EC': 'O', - '\u00D8': 'O', - '\u01FE': 'O', - '\u0186': 'O', - '\u019F': 'O', - '\uA74A': 'O', - '\uA74C': 'O', - '\u0152': 'OE', - '\u01A2': 'OI', - '\uA74E': 'OO', - '\u0222': 'OU', - '\u24C5': 'P', - '\uFF30': 'P', - '\u1E54': 'P', - '\u1E56': 'P', - '\u01A4': 'P', - '\u2C63': 'P', - '\uA750': 'P', - '\uA752': 'P', - '\uA754': 'P', - '\u24C6': 'Q', - '\uFF31': 'Q', - '\uA756': 'Q', - '\uA758': 'Q', - '\u024A': 'Q', - '\u24C7': 'R', - '\uFF32': 'R', - '\u0154': 'R', - '\u1E58': 'R', - '\u0158': 'R', - '\u0210': 'R', - '\u0212': 'R', - '\u1E5A': 'R', - '\u1E5C': 'R', - '\u0156': 'R', - '\u1E5E': 'R', - '\u024C': 'R', - '\u2C64': 'R', - '\uA75A': 'R', - '\uA7A6': 'R', - '\uA782': 'R', - '\u24C8': 'S', - '\uFF33': 'S', - '\u1E9E': 'S', - '\u015A': 'S', - '\u1E64': 'S', - '\u015C': 'S', - '\u1E60': 'S', - '\u0160': 'S', - '\u1E66': 'S', - '\u1E62': 'S', - '\u1E68': 'S', - '\u0218': 'S', - '\u015E': 'S', - '\u2C7E': 'S', - '\uA7A8': 'S', - '\uA784': 'S', - '\u24C9': 'T', - '\uFF34': 'T', - '\u1E6A': 'T', - '\u0164': 'T', - '\u1E6C': 'T', - '\u021A': 'T', - '\u0162': 'T', - '\u1E70': 'T', - '\u1E6E': 'T', - '\u0166': 'T', - '\u01AC': 'T', - '\u01AE': 'T', - '\u023E': 'T', - '\uA786': 'T', - '\uA728': 'TZ', - '\u24CA': 'U', - '\uFF35': 'U', - '\u00D9': 'U', - '\u00DA': 'U', - '\u00DB': 'U', - '\u0168': 'U', - '\u1E78': 'U', - '\u016A': 'U', - '\u1E7A': 'U', - '\u016C': 'U', - '\u00DC': 'U', - '\u01DB': 'U', - '\u01D7': 'U', - '\u01D5': 'U', - '\u01D9': 'U', - '\u1EE6': 'U', - '\u016E': 'U', - '\u0170': 'U', - '\u01D3': 'U', - '\u0214': 'U', - '\u0216': 'U', - '\u01AF': 'U', - '\u1EEA': 'U', - '\u1EE8': 'U', - '\u1EEE': 'U', - '\u1EEC': 'U', - '\u1EF0': 'U', - '\u1EE4': 'U', - '\u1E72': 'U', - '\u0172': 'U', - '\u1E76': 'U', - '\u1E74': 'U', - '\u0244': 'U', - '\u24CB': 'V', - '\uFF36': 'V', - '\u1E7C': 'V', - '\u1E7E': 'V', - '\u01B2': 'V', - '\uA75E': 'V', - '\u0245': 'V', - '\uA760': 'VY', - '\u24CC': 'W', - '\uFF37': 'W', - '\u1E80': 'W', - '\u1E82': 'W', - '\u0174': 'W', - '\u1E86': 'W', - '\u1E84': 'W', - '\u1E88': 'W', - '\u2C72': 'W', - '\u24CD': 'X', - '\uFF38': 'X', - '\u1E8A': 'X', - '\u1E8C': 'X', - '\u24CE': 'Y', - '\uFF39': 'Y', - '\u1EF2': 'Y', - '\u00DD': 'Y', - '\u0176': 'Y', - '\u1EF8': 'Y', - '\u0232': 'Y', - '\u1E8E': 'Y', - '\u0178': 'Y', - '\u1EF6': 'Y', - '\u1EF4': 'Y', - '\u01B3': 'Y', - '\u024E': 'Y', - '\u1EFE': 'Y', - '\u24CF': 'Z', - '\uFF3A': 'Z', - '\u0179': 'Z', - '\u1E90': 'Z', - '\u017B': 'Z', - '\u017D': 'Z', - '\u1E92': 'Z', - '\u1E94': 'Z', - '\u01B5': 'Z', - '\u0224': 'Z', - '\u2C7F': 'Z', - '\u2C6B': 'Z', - '\uA762': 'Z', - '\u24D0': 'a', - '\uFF41': 'a', - '\u1E9A': 'a', - '\u00E0': 'a', - '\u00E1': 'a', - '\u00E2': 'a', - '\u1EA7': 'a', - '\u1EA5': 'a', - '\u1EAB': 'a', - '\u1EA9': 'a', - '\u00E3': 'a', - '\u0101': 'a', - '\u0103': 'a', - '\u1EB1': 'a', - '\u1EAF': 'a', - '\u1EB5': 'a', - '\u1EB3': 'a', - '\u0227': 'a', - '\u01E1': 'a', - '\u00E4': 'a', - '\u01DF': 'a', - '\u1EA3': 'a', - '\u00E5': 'a', - '\u01FB': 'a', - '\u01CE': 'a', - '\u0201': 'a', - '\u0203': 'a', - '\u1EA1': 'a', - '\u1EAD': 'a', - '\u1EB7': 'a', - '\u1E01': 'a', - '\u0105': 'a', - '\u2C65': 'a', - '\u0250': 'a', - '\uA733': 'aa', - '\u00E6': 'ae', - '\u01FD': 'ae', - '\u01E3': 'ae', - '\uA735': 'ao', - '\uA737': 'au', - '\uA739': 'av', - '\uA73B': 'av', - '\uA73D': 'ay', - '\u24D1': 'b', - '\uFF42': 'b', - '\u1E03': 'b', - '\u1E05': 'b', - '\u1E07': 'b', - '\u0180': 'b', - '\u0183': 'b', - '\u0253': 'b', - '\u24D2': 'c', - '\uFF43': 'c', - '\u0107': 'c', - '\u0109': 'c', - '\u010B': 'c', - '\u010D': 'c', - '\u00E7': 'c', - '\u1E09': 'c', - '\u0188': 'c', - '\u023C': 'c', - '\uA73F': 'c', - '\u2184': 'c', - '\u24D3': 'd', - '\uFF44': 'd', - '\u1E0B': 'd', - '\u010F': 'd', - '\u1E0D': 'd', - '\u1E11': 'd', - '\u1E13': 'd', - '\u1E0F': 'd', - '\u0111': 'd', - '\u018C': 'd', - '\u0256': 'd', - '\u0257': 'd', - '\uA77A': 'd', - '\u01F3': 'dz', - '\u01C6': 'dz', - '\u24D4': 'e', - '\uFF45': 'e', - '\u00E8': 'e', - '\u00E9': 'e', - '\u00EA': 'e', - '\u1EC1': 'e', - '\u1EBF': 'e', - '\u1EC5': 'e', - '\u1EC3': 'e', - '\u1EBD': 'e', - '\u0113': 'e', - '\u1E15': 'e', - '\u1E17': 'e', - '\u0115': 'e', - '\u0117': 'e', - '\u00EB': 'e', - '\u1EBB': 'e', - '\u011B': 'e', - '\u0205': 'e', - '\u0207': 'e', - '\u1EB9': 'e', - '\u1EC7': 'e', - '\u0229': 'e', - '\u1E1D': 'e', - '\u0119': 'e', - '\u1E19': 'e', - '\u1E1B': 'e', - '\u0247': 'e', - '\u025B': 'e', - '\u01DD': 'e', - '\u24D5': 'f', - '\uFF46': 'f', - '\u1E1F': 'f', - '\u0192': 'f', - '\uA77C': 'f', - '\u24D6': 'g', - '\uFF47': 'g', - '\u01F5': 'g', - '\u011D': 'g', - '\u1E21': 'g', - '\u011F': 'g', - '\u0121': 'g', - '\u01E7': 'g', - '\u0123': 'g', - '\u01E5': 'g', - '\u0260': 'g', - '\uA7A1': 'g', - '\u1D79': 'g', - '\uA77F': 'g', - '\u24D7': 'h', - '\uFF48': 'h', - '\u0125': 'h', - '\u1E23': 'h', - '\u1E27': 'h', - '\u021F': 'h', - '\u1E25': 'h', - '\u1E29': 'h', - '\u1E2B': 'h', - '\u1E96': 'h', - '\u0127': 'h', - '\u2C68': 'h', - '\u2C76': 'h', - '\u0265': 'h', - '\u0195': 'hv', - '\u24D8': 'i', - '\uFF49': 'i', - '\u00EC': 'i', - '\u00ED': 'i', - '\u00EE': 'i', - '\u0129': 'i', - '\u012B': 'i', - '\u012D': 'i', - '\u00EF': 'i', - '\u1E2F': 'i', - '\u1EC9': 'i', - '\u01D0': 'i', - '\u0209': 'i', - '\u020B': 'i', - '\u1ECB': 'i', - '\u012F': 'i', - '\u1E2D': 'i', - '\u0268': 'i', - '\u0131': 'i', - '\u24D9': 'j', - '\uFF4A': 'j', - '\u0135': 'j', - '\u01F0': 'j', - '\u0249': 'j', - '\u24DA': 'k', - '\uFF4B': 'k', - '\u1E31': 'k', - '\u01E9': 'k', - '\u1E33': 'k', - '\u0137': 'k', - '\u1E35': 'k', - '\u0199': 'k', - '\u2C6A': 'k', - '\uA741': 'k', - '\uA743': 'k', - '\uA745': 'k', - '\uA7A3': 'k', - '\u24DB': 'l', - '\uFF4C': 'l', - '\u0140': 'l', - '\u013A': 'l', - '\u013E': 'l', - '\u1E37': 'l', - '\u1E39': 'l', - '\u013C': 'l', - '\u1E3D': 'l', - '\u1E3B': 'l', - '\u017F': 'l', - '\u0142': 'l', - '\u019A': 'l', - '\u026B': 'l', - '\u2C61': 'l', - '\uA749': 'l', - '\uA781': 'l', - '\uA747': 'l', - '\u01C9': 'lj', - '\u24DC': 'm', - '\uFF4D': 'm', - '\u1E3F': 'm', - '\u1E41': 'm', - '\u1E43': 'm', - '\u0271': 'm', - '\u026F': 'm', - '\u24DD': 'n', - '\uFF4E': 'n', - '\u01F9': 'n', - '\u0144': 'n', - '\u00F1': 'n', - '\u1E45': 'n', - '\u0148': 'n', - '\u1E47': 'n', - '\u0146': 'n', - '\u1E4B': 'n', - '\u1E49': 'n', - '\u019E': 'n', - '\u0272': 'n', - '\u0149': 'n', - '\uA791': 'n', - '\uA7A5': 'n', - '\u01CC': 'nj', - '\u24DE': 'o', - '\uFF4F': 'o', - '\u00F2': 'o', - '\u00F3': 'o', - '\u00F4': 'o', - '\u1ED3': 'o', - '\u1ED1': 'o', - '\u1ED7': 'o', - '\u1ED5': 'o', - '\u00F5': 'o', - '\u1E4D': 'o', - '\u022D': 'o', - '\u1E4F': 'o', - '\u014D': 'o', - '\u1E51': 'o', - '\u1E53': 'o', - '\u014F': 'o', - '\u022F': 'o', - '\u0231': 'o', - '\u00F6': 'o', - '\u022B': 'o', - '\u1ECF': 'o', - '\u0151': 'o', - '\u01D2': 'o', - '\u020D': 'o', - '\u020F': 'o', - '\u01A1': 'o', - '\u1EDD': 'o', - '\u1EDB': 'o', - '\u1EE1': 'o', - '\u1EDF': 'o', - '\u1EE3': 'o', - '\u1ECD': 'o', - '\u1ED9': 'o', - '\u01EB': 'o', - '\u01ED': 'o', - '\u00F8': 'o', - '\u01FF': 'o', - '\u0254': 'o', - '\uA74B': 'o', - '\uA74D': 'o', - '\u0275': 'o', - '\u0153': 'oe', - '\u01A3': 'oi', - '\u0223': 'ou', - '\uA74F': 'oo', - '\u24DF': 'p', - '\uFF50': 'p', - '\u1E55': 'p', - '\u1E57': 'p', - '\u01A5': 'p', - '\u1D7D': 'p', - '\uA751': 'p', - '\uA753': 'p', - '\uA755': 'p', - '\u24E0': 'q', - '\uFF51': 'q', - '\u024B': 'q', - '\uA757': 'q', - '\uA759': 'q', - '\u24E1': 'r', - '\uFF52': 'r', - '\u0155': 'r', - '\u1E59': 'r', - '\u0159': 'r', - '\u0211': 'r', - '\u0213': 'r', - '\u1E5B': 'r', - '\u1E5D': 'r', - '\u0157': 'r', - '\u1E5F': 'r', - '\u024D': 'r', - '\u027D': 'r', - '\uA75B': 'r', - '\uA7A7': 'r', - '\uA783': 'r', - '\u24E2': 's', - '\uFF53': 's', - '\u00DF': 's', - '\u015B': 's', - '\u1E65': 's', - '\u015D': 's', - '\u1E61': 's', - '\u0161': 's', - '\u1E67': 's', - '\u1E63': 's', - '\u1E69': 's', - '\u0219': 's', - '\u015F': 's', - '\u023F': 's', - '\uA7A9': 's', - '\uA785': 's', - '\u1E9B': 's', - '\u24E3': 't', - '\uFF54': 't', - '\u1E6B': 't', - '\u1E97': 't', - '\u0165': 't', - '\u1E6D': 't', - '\u021B': 't', - '\u0163': 't', - '\u1E71': 't', - '\u1E6F': 't', - '\u0167': 't', - '\u01AD': 't', - '\u0288': 't', - '\u2C66': 't', - '\uA787': 't', - '\uA729': 'tz', - '\u24E4': 'u', - '\uFF55': 'u', - '\u00F9': 'u', - '\u00FA': 'u', - '\u00FB': 'u', - '\u0169': 'u', - '\u1E79': 'u', - '\u016B': 'u', - '\u1E7B': 'u', - '\u016D': 'u', - '\u00FC': 'u', - '\u01DC': 'u', - '\u01D8': 'u', - '\u01D6': 'u', - '\u01DA': 'u', - '\u1EE7': 'u', - '\u016F': 'u', - '\u0171': 'u', - '\u01D4': 'u', - '\u0215': 'u', - '\u0217': 'u', - '\u01B0': 'u', - '\u1EEB': 'u', - '\u1EE9': 'u', - '\u1EEF': 'u', - '\u1EED': 'u', - '\u1EF1': 'u', - '\u1EE5': 'u', - '\u1E73': 'u', - '\u0173': 'u', - '\u1E77': 'u', - '\u1E75': 'u', - '\u0289': 'u', - '\u24E5': 'v', - '\uFF56': 'v', - '\u1E7D': 'v', - '\u1E7F': 'v', - '\u028B': 'v', - '\uA75F': 'v', - '\u028C': 'v', - '\uA761': 'vy', - '\u24E6': 'w', - '\uFF57': 'w', - '\u1E81': 'w', - '\u1E83': 'w', - '\u0175': 'w', - '\u1E87': 'w', - '\u1E85': 'w', - '\u1E98': 'w', - '\u1E89': 'w', - '\u2C73': 'w', - '\u24E7': 'x', - '\uFF58': 'x', - '\u1E8B': 'x', - '\u1E8D': 'x', - '\u24E8': 'y', - '\uFF59': 'y', - '\u1EF3': 'y', - '\u00FD': 'y', - '\u0177': 'y', - '\u1EF9': 'y', - '\u0233': 'y', - '\u1E8F': 'y', - '\u00FF': 'y', - '\u1EF7': 'y', - '\u1E99': 'y', - '\u1EF5': 'y', - '\u01B4': 'y', - '\u024F': 'y', - '\u1EFF': 'y', - '\u24E9': 'z', - '\uFF5A': 'z', - '\u017A': 'z', - '\u1E91': 'z', - '\u017C': 'z', - '\u017E': 'z', - '\u1E93': 'z', - '\u1E95': 'z', - '\u01B6': 'z', - '\u0225': 'z', - '\u0240': 'z', - '\u2C6C': 'z', - '\uA763': 'z', - '\u0386': '\u0391', - '\u0388': '\u0395', - '\u0389': '\u0397', - '\u038A': '\u0399', - '\u03AA': '\u0399', - '\u038C': '\u039F', - '\u038E': '\u03A5', - '\u03AB': '\u03A5', - '\u038F': '\u03A9', - '\u03AC': '\u03B1', - '\u03AD': '\u03B5', - '\u03AE': '\u03B7', - '\u03AF': '\u03B9', - '\u03CA': '\u03B9', - '\u0390': '\u03B9', - '\u03CC': '\u03BF', - '\u03CD': '\u03C5', - '\u03CB': '\u03C5', - '\u03B0': '\u03C5', - '\u03CE': '\u03C9', - '\u03C2': '\u03C3', - '\u2019': '\'' - }; - - return diacritics; -}); - -S2.define('select2/data/base',[ - '../utils' -], function (Utils) { - function BaseAdapter ($element, options) { - BaseAdapter.__super__.constructor.call(this); - } - - Utils.Extend(BaseAdapter, Utils.Observable); - - BaseAdapter.prototype.current = function (callback) { - throw new Error('The `current` method must be defined in child classes.'); - }; - - BaseAdapter.prototype.query = function (params, callback) { - throw new Error('The `query` method must be defined in child classes.'); - }; - - BaseAdapter.prototype.bind = function (container, $container) { - // Can be implemented in subclasses - }; - - BaseAdapter.prototype.destroy = function () { - // Can be implemented in subclasses - }; - - BaseAdapter.prototype.generateResultId = function (container, data) { - var id = container.id + '-result-'; - - id += Utils.generateChars(4); - - if (data.id != null) { - id += '-' + data.id.toString(); - } else { - id += '-' + Utils.generateChars(4); - } - return id; - }; - - return BaseAdapter; -}); - -S2.define('select2/data/select',[ - './base', - '../utils', - 'jquery' -], function (BaseAdapter, Utils, $) { - function SelectAdapter ($element, options) { - this.$element = $element; - this.options = options; - - SelectAdapter.__super__.constructor.call(this); - } - - Utils.Extend(SelectAdapter, BaseAdapter); - - SelectAdapter.prototype.current = function (callback) { - var data = []; - var self = this; - - this.$element.find(':selected').each(function () { - var $option = $(this); - - var option = self.item($option); - - data.push(option); - }); - - callback(data); - }; - - SelectAdapter.prototype.select = function (data) { - var self = this; - - data.selected = true; - - // If data.element is a DOM node, use it instead - if ($(data.element).is('option')) { - data.element.selected = true; - - this.$element.trigger('input').trigger('change'); - - return; - } - - if (this.$element.prop('multiple')) { - this.current(function (currentData) { - var val = []; - - data = [data]; - data.push.apply(data, currentData); - - for (var d = 0; d < data.length; d++) { - var id = data[d].id; - - if ($.inArray(id, val) === -1) { - val.push(id); - } - } - - self.$element.val(val); - self.$element.trigger('input').trigger('change'); - }); - } else { - var val = data.id; - - this.$element.val(val); - this.$element.trigger('input').trigger('change'); - } - }; - - SelectAdapter.prototype.unselect = function (data) { - var self = this; - - if (!this.$element.prop('multiple')) { - return; - } - - data.selected = false; - - if ($(data.element).is('option')) { - data.element.selected = false; - - this.$element.trigger('input').trigger('change'); - - return; - } - - this.current(function (currentData) { - var val = []; - - for (var d = 0; d < currentData.length; d++) { - var id = currentData[d].id; - - if (id !== data.id && $.inArray(id, val) === -1) { - val.push(id); - } - } - - self.$element.val(val); - - self.$element.trigger('input').trigger('change'); - }); - }; - - SelectAdapter.prototype.bind = function (container, $container) { - var self = this; - - this.container = container; - - container.on('select', function (params) { - self.select(params.data); - }); - - container.on('unselect', function (params) { - self.unselect(params.data); - }); - }; - - SelectAdapter.prototype.destroy = function () { - // Remove anything added to child elements - this.$element.find('*').each(function () { - // Remove any custom data set by Select2 - Utils.RemoveData(this); - }); - }; - - SelectAdapter.prototype.query = function (params, callback) { - var data = []; - var self = this; - - var $options = this.$element.children(); - - $options.each(function () { - var $option = $(this); - - if (!$option.is('option') && !$option.is('optgroup')) { - return; - } - - var option = self.item($option); - - var matches = self.matches(params, option); - - if (matches !== null) { - data.push(matches); - } - }); - - callback({ - results: data - }); - }; - - SelectAdapter.prototype.addOptions = function ($options) { - Utils.appendMany(this.$element, $options); - }; - - SelectAdapter.prototype.option = function (data) { - var option; - - if (data.children) { - option = document.createElement('optgroup'); - option.label = data.text; - } else { - option = document.createElement('option'); - - if (option.textContent !== undefined) { - option.textContent = data.text; - } else { - option.innerText = data.text; - } - } - - if (data.id !== undefined) { - option.value = data.id; - } - - if (data.disabled) { - option.disabled = true; - } - - if (data.selected) { - option.selected = true; - } - - if (data.title) { - option.title = data.title; - } - - var $option = $(option); - - var normalizedData = this._normalizeItem(data); - normalizedData.element = option; - - // Override the option's data with the combined data - Utils.StoreData(option, 'data', normalizedData); - - return $option; - }; - - SelectAdapter.prototype.item = function ($option) { - var data = {}; - - data = Utils.GetData($option[0], 'data'); - - if (data != null) { - return data; - } - - if ($option.is('option')) { - data = { - id: $option.val(), - text: $option.text(), - disabled: $option.prop('disabled'), - selected: $option.prop('selected'), - title: $option.prop('title') - }; - } else if ($option.is('optgroup')) { - data = { - text: $option.prop('label'), - children: [], - title: $option.prop('title') - }; - - var $children = $option.children('option'); - var children = []; - - for (var c = 0; c < $children.length; c++) { - var $child = $($children[c]); - - var child = this.item($child); - - children.push(child); - } - - data.children = children; - } - - data = this._normalizeItem(data); - data.element = $option[0]; - - Utils.StoreData($option[0], 'data', data); - - return data; - }; - - SelectAdapter.prototype._normalizeItem = function (item) { - if (item !== Object(item)) { - item = { - id: item, - text: item - }; - } - - item = $.extend({}, { - text: '' - }, item); - - var defaults = { - selected: false, - disabled: false - }; - - if (item.id != null) { - item.id = item.id.toString(); - } - - if (item.text != null) { - item.text = item.text.toString(); - } - - if (item._resultId == null && item.id && this.container != null) { - item._resultId = this.generateResultId(this.container, item); - } - - return $.extend({}, defaults, item); - }; - - SelectAdapter.prototype.matches = function (params, data) { - var matcher = this.options.get('matcher'); - - return matcher(params, data); - }; - - return SelectAdapter; -}); - -S2.define('select2/data/array',[ - './select', - '../utils', - 'jquery' -], function (SelectAdapter, Utils, $) { - function ArrayAdapter ($element, options) { - this._dataToConvert = options.get('data') || []; - - ArrayAdapter.__super__.constructor.call(this, $element, options); - } - - Utils.Extend(ArrayAdapter, SelectAdapter); - - ArrayAdapter.prototype.bind = function (container, $container) { - ArrayAdapter.__super__.bind.call(this, container, $container); - - this.addOptions(this.convertToOptions(this._dataToConvert)); - }; - - ArrayAdapter.prototype.select = function (data) { - var $option = this.$element.find('option').filter(function (i, elm) { - return elm.value == data.id.toString(); - }); - - if ($option.length === 0) { - $option = this.option(data); - - this.addOptions($option); - } - - ArrayAdapter.__super__.select.call(this, data); - }; - - ArrayAdapter.prototype.convertToOptions = function (data) { - var self = this; - - var $existing = this.$element.find('option'); - var existingIds = $existing.map(function () { - return self.item($(this)).id; - }).get(); - - var $options = []; - - // Filter out all items except for the one passed in the argument - function onlyItem (item) { - return function () { - return $(this).val() == item.id; - }; - } - - for (var d = 0; d < data.length; d++) { - var item = this._normalizeItem(data[d]); - - // Skip items which were pre-loaded, only merge the data - if ($.inArray(item.id, existingIds) >= 0) { - var $existingOption = $existing.filter(onlyItem(item)); - - var existingData = this.item($existingOption); - var newData = $.extend(true, {}, item, existingData); - - var $newOption = this.option(newData); - - $existingOption.replaceWith($newOption); - - continue; - } - - var $option = this.option(item); - - if (item.children) { - var $children = this.convertToOptions(item.children); - - Utils.appendMany($option, $children); - } - - $options.push($option); - } - - return $options; - }; - - return ArrayAdapter; -}); - -S2.define('select2/data/ajax',[ - './array', - '../utils', - 'jquery' -], function (ArrayAdapter, Utils, $) { - function AjaxAdapter ($element, options) { - this.ajaxOptions = this._applyDefaults(options.get('ajax')); - - if (this.ajaxOptions.processResults != null) { - this.processResults = this.ajaxOptions.processResults; - } - - AjaxAdapter.__super__.constructor.call(this, $element, options); - } - - Utils.Extend(AjaxAdapter, ArrayAdapter); - - AjaxAdapter.prototype._applyDefaults = function (options) { - var defaults = { - data: function (params) { - return $.extend({}, params, { - q: params.term - }); - }, - transport: function (params, success, failure) { - var $request = $.ajax(params); - - $request.then(success); - $request.fail(failure); - - return $request; - } - }; - - return $.extend({}, defaults, options, true); - }; - - AjaxAdapter.prototype.processResults = function (results) { - return results; - }; - - AjaxAdapter.prototype.query = function (params, callback) { - var matches = []; - var self = this; - - if (this._request != null) { - // JSONP requests cannot always be aborted - if ($.isFunction(this._request.abort)) { - this._request.abort(); - } - - this._request = null; - } - - var options = $.extend({ - type: 'GET' - }, this.ajaxOptions); - - if (typeof options.url === 'function') { - options.url = options.url.call(this.$element, params); - } - - if (typeof options.data === 'function') { - options.data = options.data.call(this.$element, params); - } - - function request () { - var $request = options.transport(options, function (data) { - var results = self.processResults(data, params); - - if (self.options.get('debug') && window.console && console.error) { - // Check to make sure that the response included a `results` key. - if (!results || !results.results || !$.isArray(results.results)) { - console.error( - 'Select2: The AJAX results did not return an array in the ' + - '`results` key of the response.' - ); - } - } - - callback(results); - }, function () { - // Attempt to detect if a request was aborted - // Only works if the transport exposes a status property - if ('status' in $request && - ($request.status === 0 || $request.status === '0')) { - return; - } - - self.trigger('results:message', { - message: 'errorLoading' - }); - }); - - self._request = $request; - } - - if (this.ajaxOptions.delay && params.term != null) { - if (this._queryTimeout) { - window.clearTimeout(this._queryTimeout); - } - - this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); - } else { - request(); - } - }; - - return AjaxAdapter; -}); - -S2.define('select2/data/tags',[ - 'jquery' -], function ($) { - function Tags (decorated, $element, options) { - var tags = options.get('tags'); - - var createTag = options.get('createTag'); - - if (createTag !== undefined) { - this.createTag = createTag; - } - - var insertTag = options.get('insertTag'); - - if (insertTag !== undefined) { - this.insertTag = insertTag; - } - - decorated.call(this, $element, options); - - if ($.isArray(tags)) { - for (var t = 0; t < tags.length; t++) { - var tag = tags[t]; - var item = this._normalizeItem(tag); - - var $option = this.option(item); - - this.$element.append($option); - } - } - } - - Tags.prototype.query = function (decorated, params, callback) { - var self = this; - - this._removeOldTags(); - - if (params.term == null || params.page != null) { - decorated.call(this, params, callback); - return; - } - - function wrapper (obj, child) { - var data = obj.results; - - for (var i = 0; i < data.length; i++) { - var option = data[i]; - - var checkChildren = ( - option.children != null && - !wrapper({ - results: option.children - }, true) - ); - - var optionText = (option.text || '').toUpperCase(); - var paramsTerm = (params.term || '').toUpperCase(); - - var checkText = optionText === paramsTerm; - - if (checkText || checkChildren) { - if (child) { - return false; - } - - obj.data = data; - callback(obj); - - return; - } - } - - if (child) { - return true; - } - - var tag = self.createTag(params); - - if (tag != null) { - var $option = self.option(tag); - $option.attr('data-select2-tag', true); - - self.addOptions([$option]); - - self.insertTag(data, tag); - } - - obj.results = data; - - callback(obj); - } - - decorated.call(this, params, wrapper); - }; - - Tags.prototype.createTag = function (decorated, params) { - var term = $.trim(params.term); - - if (term === '') { - return null; - } - - return { - id: term, - text: term - }; - }; - - Tags.prototype.insertTag = function (_, data, tag) { - data.unshift(tag); - }; - - Tags.prototype._removeOldTags = function (_) { - var $options = this.$element.find('option[data-select2-tag]'); - - $options.each(function () { - if (this.selected) { - return; - } - - $(this).remove(); - }); - }; - - return Tags; -}); - -S2.define('select2/data/tokenizer',[ - 'jquery' -], function ($) { - function Tokenizer (decorated, $element, options) { - var tokenizer = options.get('tokenizer'); - - if (tokenizer !== undefined) { - this.tokenizer = tokenizer; - } - - decorated.call(this, $element, options); - } - - Tokenizer.prototype.bind = function (decorated, container, $container) { - decorated.call(this, container, $container); - - this.$search = container.dropdown.$search || container.selection.$search || - $container.find('.select2-search__field'); - }; - - Tokenizer.prototype.query = function (decorated, params, callback) { - var self = this; - - function createAndSelect (data) { - // Normalize the data object so we can use it for checks - var item = self._normalizeItem(data); - - // Check if the data object already exists as a tag - // Select it if it doesn't - var $existingOptions = self.$element.find('option').filter(function () { - return $(this).val() === item.id; - }); - - // If an existing option wasn't found for it, create the option - if (!$existingOptions.length) { - var $option = self.option(item); - $option.attr('data-select2-tag', true); - - self._removeOldTags(); - self.addOptions([$option]); - } - - // Select the item, now that we know there is an option for it - select(item); - } - - function select (data) { - self.trigger('select', { - data: data - }); - } - - params.term = params.term || ''; - - var tokenData = this.tokenizer(params, this.options, createAndSelect); - - if (tokenData.term !== params.term) { - // Replace the search term if we have the search box - if (this.$search.length) { - this.$search.val(tokenData.term); - this.$search.trigger('focus'); - } - - params.term = tokenData.term; - } - - decorated.call(this, params, callback); - }; - - Tokenizer.prototype.tokenizer = function (_, params, options, callback) { - var separators = options.get('tokenSeparators') || []; - var term = params.term; - var i = 0; - - var createTag = this.createTag || function (params) { - return { - id: params.term, - text: params.term - }; - }; - - while (i < term.length) { - var termChar = term[i]; - - if ($.inArray(termChar, separators) === -1) { - i++; - - continue; - } - - var part = term.substr(0, i); - var partParams = $.extend({}, params, { - term: part - }); - - var data = createTag(partParams); - - if (data == null) { - i++; - continue; - } - - callback(data); - - // Reset the term to not include the tokenized portion - term = term.substr(i + 1) || ''; - i = 0; - } - - return { - term: term - }; - }; - - return Tokenizer; -}); - -S2.define('select2/data/minimumInputLength',[ - -], function () { - function MinimumInputLength (decorated, $e, options) { - this.minimumInputLength = options.get('minimumInputLength'); - - decorated.call(this, $e, options); - } - - MinimumInputLength.prototype.query = function (decorated, params, callback) { - params.term = params.term || ''; - - if (params.term.length < this.minimumInputLength) { - this.trigger('results:message', { - message: 'inputTooShort', - args: { - minimum: this.minimumInputLength, - input: params.term, - params: params - } - }); - - return; - } - - decorated.call(this, params, callback); - }; - - return MinimumInputLength; -}); - -S2.define('select2/data/maximumInputLength',[ - -], function () { - function MaximumInputLength (decorated, $e, options) { - this.maximumInputLength = options.get('maximumInputLength'); - - decorated.call(this, $e, options); - } - - MaximumInputLength.prototype.query = function (decorated, params, callback) { - params.term = params.term || ''; - - if (this.maximumInputLength > 0 && - params.term.length > this.maximumInputLength) { - this.trigger('results:message', { - message: 'inputTooLong', - args: { - maximum: this.maximumInputLength, - input: params.term, - params: params - } - }); - - return; - } - - decorated.call(this, params, callback); - }; - - return MaximumInputLength; -}); - -S2.define('select2/data/maximumSelectionLength',[ - -], function (){ - function MaximumSelectionLength (decorated, $e, options) { - this.maximumSelectionLength = options.get('maximumSelectionLength'); - - decorated.call(this, $e, options); - } - - MaximumSelectionLength.prototype.bind = - function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('select', function () { - self._checkIfMaximumSelected(); - }); - }; - - MaximumSelectionLength.prototype.query = - function (decorated, params, callback) { - var self = this; - - this._checkIfMaximumSelected(function () { - decorated.call(self, params, callback); - }); - }; - - MaximumSelectionLength.prototype._checkIfMaximumSelected = - function (_, successCallback) { - var self = this; - - this.current(function (currentData) { - var count = currentData != null ? currentData.length : 0; - if (self.maximumSelectionLength > 0 && - count >= self.maximumSelectionLength) { - self.trigger('results:message', { - message: 'maximumSelected', - args: { - maximum: self.maximumSelectionLength - } - }); - return; - } - - if (successCallback) { - successCallback(); - } - }); - }; - - return MaximumSelectionLength; -}); - -S2.define('select2/dropdown',[ - 'jquery', - './utils' -], function ($, Utils) { - function Dropdown ($element, options) { - this.$element = $element; - this.options = options; - - Dropdown.__super__.constructor.call(this); - } - - Utils.Extend(Dropdown, Utils.Observable); - - Dropdown.prototype.render = function () { - var $dropdown = $( - '<span class="select2-dropdown">' + - '<span class="select2-results"></span>' + - '</span>' - ); - - $dropdown.attr('dir', this.options.get('dir')); - - this.$dropdown = $dropdown; - - return $dropdown; - }; - - Dropdown.prototype.bind = function () { - // Should be implemented in subclasses - }; - - Dropdown.prototype.position = function ($dropdown, $container) { - // Should be implemented in subclasses - }; - - Dropdown.prototype.destroy = function () { - // Remove the dropdown from the DOM - this.$dropdown.remove(); - }; - - return Dropdown; -}); - -S2.define('select2/dropdown/search',[ - 'jquery', - '../utils' -], function ($, Utils) { - function Search () { } - - Search.prototype.render = function (decorated) { - var $rendered = decorated.call(this); - - var $search = $( - '<span class="select2-search select2-search--dropdown">' + - '<input class="select2-search__field" type="search" tabindex="-1"' + - ' autocomplete="off" autocorrect="off" autocapitalize="none"' + - ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' + - '</span>' - ); - - this.$searchContainer = $search; - this.$search = $search.find('input'); - - $rendered.prepend($search); - - return $rendered; - }; - - Search.prototype.bind = function (decorated, container, $container) { - var self = this; - - var resultsId = container.id + '-results'; - - decorated.call(this, container, $container); - - this.$search.on('keydown', function (evt) { - self.trigger('keypress', evt); - - self._keyUpPrevented = evt.isDefaultPrevented(); - }); - - // Workaround for browsers which do not support the `input` event - // This will prevent double-triggering of events for browsers which support - // both the `keyup` and `input` events. - this.$search.on('input', function (evt) { - // Unbind the duplicated `keyup` event - $(this).off('keyup'); - }); - - this.$search.on('keyup input', function (evt) { - self.handleSearch(evt); - }); - - container.on('open', function () { - self.$search.attr('tabindex', 0); - self.$search.attr('aria-controls', resultsId); - - self.$search.trigger('focus'); - - window.setTimeout(function () { - self.$search.trigger('focus'); - }, 0); - }); - - container.on('close', function () { - self.$search.attr('tabindex', -1); - self.$search.removeAttr('aria-controls'); - self.$search.removeAttr('aria-activedescendant'); - - self.$search.val(''); - self.$search.trigger('blur'); - }); - - container.on('focus', function () { - if (!container.isOpen()) { - self.$search.trigger('focus'); - } - }); - - container.on('results:all', function (params) { - if (params.query.term == null || params.query.term === '') { - var showSearch = self.showSearch(params); - - if (showSearch) { - self.$searchContainer.removeClass('select2-search--hide'); - } else { - self.$searchContainer.addClass('select2-search--hide'); - } - } - }); - - container.on('results:focus', function (params) { - if (params.data._resultId) { - self.$search.attr('aria-activedescendant', params.data._resultId); - } else { - self.$search.removeAttr('aria-activedescendant'); - } - }); - }; - - Search.prototype.handleSearch = function (evt) { - if (!this._keyUpPrevented) { - var input = this.$search.val(); - - this.trigger('query', { - term: input - }); - } - - this._keyUpPrevented = false; - }; - - Search.prototype.showSearch = function (_, params) { - return true; - }; - - return Search; -}); - -S2.define('select2/dropdown/hidePlaceholder',[ - -], function () { - function HidePlaceholder (decorated, $element, options, dataAdapter) { - this.placeholder = this.normalizePlaceholder(options.get('placeholder')); - - decorated.call(this, $element, options, dataAdapter); - } - - HidePlaceholder.prototype.append = function (decorated, data) { - data.results = this.removePlaceholder(data.results); - - decorated.call(this, data); - }; - - HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { - if (typeof placeholder === 'string') { - placeholder = { - id: '', - text: placeholder - }; - } - - return placeholder; - }; - - HidePlaceholder.prototype.removePlaceholder = function (_, data) { - var modifiedData = data.slice(0); - - for (var d = data.length - 1; d >= 0; d--) { - var item = data[d]; - - if (this.placeholder.id === item.id) { - modifiedData.splice(d, 1); - } - } - - return modifiedData; - }; - - return HidePlaceholder; -}); - -S2.define('select2/dropdown/infiniteScroll',[ - 'jquery' -], function ($) { - function InfiniteScroll (decorated, $element, options, dataAdapter) { - this.lastParams = {}; - - decorated.call(this, $element, options, dataAdapter); - - this.$loadingMore = this.createLoadingMore(); - this.loading = false; - } - - InfiniteScroll.prototype.append = function (decorated, data) { - this.$loadingMore.remove(); - this.loading = false; - - decorated.call(this, data); - - if (this.showLoadingMore(data)) { - this.$results.append(this.$loadingMore); - this.loadMoreIfNeeded(); - } - }; - - InfiniteScroll.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('query', function (params) { - self.lastParams = params; - self.loading = true; - }); - - container.on('query:append', function (params) { - self.lastParams = params; - self.loading = true; - }); - - this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); - }; - - InfiniteScroll.prototype.loadMoreIfNeeded = function () { - var isLoadMoreVisible = $.contains( - document.documentElement, - this.$loadingMore[0] - ); - - if (this.loading || !isLoadMoreVisible) { - return; - } - - var currentOffset = this.$results.offset().top + - this.$results.outerHeight(false); - var loadingMoreOffset = this.$loadingMore.offset().top + - this.$loadingMore.outerHeight(false); - - if (currentOffset + 50 >= loadingMoreOffset) { - this.loadMore(); - } - }; - - InfiniteScroll.prototype.loadMore = function () { - this.loading = true; - - var params = $.extend({}, {page: 1}, this.lastParams); - - params.page++; - - this.trigger('query:append', params); - }; - - InfiniteScroll.prototype.showLoadingMore = function (_, data) { - return data.pagination && data.pagination.more; - }; - - InfiniteScroll.prototype.createLoadingMore = function () { - var $option = $( - '<li ' + - 'class="select2-results__option select2-results__option--load-more"' + - 'role="option" aria-disabled="true"></li>' - ); - - var message = this.options.get('translations').get('loadingMore'); - - $option.html(message(this.lastParams)); - - return $option; - }; - - return InfiniteScroll; -}); - -S2.define('select2/dropdown/attachBody',[ - 'jquery', - '../utils' -], function ($, Utils) { - function AttachBody (decorated, $element, options) { - this.$dropdownParent = $(options.get('dropdownParent') || document.body); - - decorated.call(this, $element, options); - } - - AttachBody.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('open', function () { - self._showDropdown(); - self._attachPositioningHandler(container); - - // Must bind after the results handlers to ensure correct sizing - self._bindContainerResultHandlers(container); - }); - - container.on('close', function () { - self._hideDropdown(); - self._detachPositioningHandler(container); - }); - - this.$dropdownContainer.on('mousedown', function (evt) { - evt.stopPropagation(); - }); - }; - - AttachBody.prototype.destroy = function (decorated) { - decorated.call(this); - - this.$dropdownContainer.remove(); - }; - - AttachBody.prototype.position = function (decorated, $dropdown, $container) { - // Clone all of the container classes - $dropdown.attr('class', $container.attr('class')); - - $dropdown.removeClass('select2'); - $dropdown.addClass('select2-container--open'); - - $dropdown.css({ - position: 'absolute', - top: -999999 - }); - - this.$container = $container; - }; - - AttachBody.prototype.render = function (decorated) { - var $container = $('<span></span>'); - - var $dropdown = decorated.call(this); - $container.append($dropdown); - - this.$dropdownContainer = $container; - - return $container; - }; - - AttachBody.prototype._hideDropdown = function (decorated) { - this.$dropdownContainer.detach(); - }; - - AttachBody.prototype._bindContainerResultHandlers = - function (decorated, container) { - - // These should only be bound once - if (this._containerResultsHandlersBound) { - return; - } - - var self = this; - - container.on('results:all', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('results:append', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('results:message', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('select', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('unselect', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - this._containerResultsHandlersBound = true; - }; - - AttachBody.prototype._attachPositioningHandler = - function (decorated, container) { - var self = this; - - var scrollEvent = 'scroll.select2.' + container.id; - var resizeEvent = 'resize.select2.' + container.id; - var orientationEvent = 'orientationchange.select2.' + container.id; - - var $watchers = this.$container.parents().filter(Utils.hasScroll); - $watchers.each(function () { - Utils.StoreData(this, 'select2-scroll-position', { - x: $(this).scrollLeft(), - y: $(this).scrollTop() - }); - }); - - $watchers.on(scrollEvent, function (ev) { - var position = Utils.GetData(this, 'select2-scroll-position'); - $(this).scrollTop(position.y); - }); - - $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, - function (e) { - self._positionDropdown(); - self._resizeDropdown(); - }); - }; - - AttachBody.prototype._detachPositioningHandler = - function (decorated, container) { - var scrollEvent = 'scroll.select2.' + container.id; - var resizeEvent = 'resize.select2.' + container.id; - var orientationEvent = 'orientationchange.select2.' + container.id; - - var $watchers = this.$container.parents().filter(Utils.hasScroll); - $watchers.off(scrollEvent); - - $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); - }; - - AttachBody.prototype._positionDropdown = function () { - var $window = $(window); - - var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); - var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); - - var newDirection = null; - - var offset = this.$container.offset(); - - offset.bottom = offset.top + this.$container.outerHeight(false); - - var container = { - height: this.$container.outerHeight(false) - }; - - container.top = offset.top; - container.bottom = offset.top + container.height; - - var dropdown = { - height: this.$dropdown.outerHeight(false) - }; - - var viewport = { - top: $window.scrollTop(), - bottom: $window.scrollTop() + $window.height() - }; - - var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); - var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); - - var css = { - left: offset.left, - top: container.bottom - }; - - // Determine what the parent element is to use for calculating the offset - var $offsetParent = this.$dropdownParent; - - // For statically positioned elements, we need to get the element - // that is determining the offset - if ($offsetParent.css('position') === 'static') { - $offsetParent = $offsetParent.offsetParent(); - } - - var parentOffset = { - top: 0, - left: 0 - }; - - if ( - $.contains(document.body, $offsetParent[0]) || - $offsetParent[0].isConnected - ) { - parentOffset = $offsetParent.offset(); - } - - css.top -= parentOffset.top; - css.left -= parentOffset.left; - - if (!isCurrentlyAbove && !isCurrentlyBelow) { - newDirection = 'below'; - } - - if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { - newDirection = 'above'; - } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { - newDirection = 'below'; - } - - if (newDirection == 'above' || - (isCurrentlyAbove && newDirection !== 'below')) { - css.top = container.top - parentOffset.top - dropdown.height; - } - - if (newDirection != null) { - this.$dropdown - .removeClass('select2-dropdown--below select2-dropdown--above') - .addClass('select2-dropdown--' + newDirection); - this.$container - .removeClass('select2-container--below select2-container--above') - .addClass('select2-container--' + newDirection); - } - - this.$dropdownContainer.css(css); - }; - - AttachBody.prototype._resizeDropdown = function () { - var css = { - width: this.$container.outerWidth(false) + 'px' - }; - - if (this.options.get('dropdownAutoWidth')) { - css.minWidth = css.width; - css.position = 'relative'; - css.width = 'auto'; - } - - this.$dropdown.css(css); - }; - - AttachBody.prototype._showDropdown = function (decorated) { - this.$dropdownContainer.appendTo(this.$dropdownParent); - - this._positionDropdown(); - this._resizeDropdown(); - }; - - return AttachBody; -}); - -S2.define('select2/dropdown/minimumResultsForSearch',[ - -], function () { - function countResults (data) { - var count = 0; - - for (var d = 0; d < data.length; d++) { - var item = data[d]; - - if (item.children) { - count += countResults(item.children); - } else { - count++; - } - } - - return count; - } - - function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { - this.minimumResultsForSearch = options.get('minimumResultsForSearch'); - - if (this.minimumResultsForSearch < 0) { - this.minimumResultsForSearch = Infinity; - } - - decorated.call(this, $element, options, dataAdapter); - } - - MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { - if (countResults(params.data.results) < this.minimumResultsForSearch) { - return false; - } - - return decorated.call(this, params); - }; - - return MinimumResultsForSearch; -}); - -S2.define('select2/dropdown/selectOnClose',[ - '../utils' -], function (Utils) { - function SelectOnClose () { } - - SelectOnClose.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('close', function (params) { - self._handleSelectOnClose(params); - }); - }; - - SelectOnClose.prototype._handleSelectOnClose = function (_, params) { - if (params && params.originalSelect2Event != null) { - var event = params.originalSelect2Event; - - // Don't select an item if the close event was triggered from a select or - // unselect event - if (event._type === 'select' || event._type === 'unselect') { - return; - } - } - - var $highlightedResults = this.getHighlightedResults(); - - // Only select highlighted results - if ($highlightedResults.length < 1) { - return; - } - - var data = Utils.GetData($highlightedResults[0], 'data'); - - // Don't re-select already selected resulte - if ( - (data.element != null && data.element.selected) || - (data.element == null && data.selected) - ) { - return; - } - - this.trigger('select', { - data: data - }); - }; - - return SelectOnClose; -}); - -S2.define('select2/dropdown/closeOnSelect',[ - -], function () { - function CloseOnSelect () { } - - CloseOnSelect.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('select', function (evt) { - self._selectTriggered(evt); - }); - - container.on('unselect', function (evt) { - self._selectTriggered(evt); - }); - }; - - CloseOnSelect.prototype._selectTriggered = function (_, evt) { - var originalEvent = evt.originalEvent; - - // Don't close if the control key is being held - if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { - return; - } - - this.trigger('close', { - originalEvent: originalEvent, - originalSelect2Event: evt - }); - }; - - return CloseOnSelect; -}); - -S2.define('select2/i18n/en',[],function () { - // English - return { - errorLoading: function () { - return 'The results could not be loaded.'; - }, - inputTooLong: function (args) { - var overChars = args.input.length - args.maximum; - - var message = 'Please delete ' + overChars + ' character'; - - if (overChars != 1) { - message += 's'; - } - - return message; - }, - inputTooShort: function (args) { - var remainingChars = args.minimum - args.input.length; - - var message = 'Please enter ' + remainingChars + ' or more characters'; - - return message; - }, - loadingMore: function () { - return 'Loading more results…'; - }, - maximumSelected: function (args) { - var message = 'You can only select ' + args.maximum + ' item'; - - if (args.maximum != 1) { - message += 's'; - } - - return message; - }, - noResults: function () { - return 'No results found'; - }, - searching: function () { - return 'Searching…'; - }, - removeAllItems: function () { - return 'Remove all items'; - } - }; -}); - -S2.define('select2/defaults',[ - 'jquery', - 'require', - - './results', - - './selection/single', - './selection/multiple', - './selection/placeholder', - './selection/allowClear', - './selection/search', - './selection/eventRelay', - - './utils', - './translation', - './diacritics', - - './data/select', - './data/array', - './data/ajax', - './data/tags', - './data/tokenizer', - './data/minimumInputLength', - './data/maximumInputLength', - './data/maximumSelectionLength', - - './dropdown', - './dropdown/search', - './dropdown/hidePlaceholder', - './dropdown/infiniteScroll', - './dropdown/attachBody', - './dropdown/minimumResultsForSearch', - './dropdown/selectOnClose', - './dropdown/closeOnSelect', - - './i18n/en' -], function ($, require, - - ResultsList, - - SingleSelection, MultipleSelection, Placeholder, AllowClear, - SelectionSearch, EventRelay, - - Utils, Translation, DIACRITICS, - - SelectData, ArrayData, AjaxData, Tags, Tokenizer, - MinimumInputLength, MaximumInputLength, MaximumSelectionLength, - - Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, - AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, - - EnglishTranslation) { - function Defaults () { - this.reset(); - } - - Defaults.prototype.apply = function (options) { - options = $.extend(true, {}, this.defaults, options); - - if (options.dataAdapter == null) { - if (options.ajax != null) { - options.dataAdapter = AjaxData; - } else if (options.data != null) { - options.dataAdapter = ArrayData; - } else { - options.dataAdapter = SelectData; - } - - if (options.minimumInputLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MinimumInputLength - ); - } - - if (options.maximumInputLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MaximumInputLength - ); - } - - if (options.maximumSelectionLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MaximumSelectionLength - ); - } - - if (options.tags) { - options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); - } - - if (options.tokenSeparators != null || options.tokenizer != null) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - Tokenizer - ); - } - - if (options.query != null) { - var Query = require(options.amdBase + 'compat/query'); - - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - Query - ); - } - - if (options.initSelection != null) { - var InitSelection = require(options.amdBase + 'compat/initSelection'); - - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - InitSelection - ); - } - } - - if (options.resultsAdapter == null) { - options.resultsAdapter = ResultsList; - - if (options.ajax != null) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - InfiniteScroll - ); - } - - if (options.placeholder != null) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - HidePlaceholder - ); - } - - if (options.selectOnClose) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - SelectOnClose - ); - } - } - - if (options.dropdownAdapter == null) { - if (options.multiple) { - options.dropdownAdapter = Dropdown; - } else { - var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); - - options.dropdownAdapter = SearchableDropdown; - } - - if (options.minimumResultsForSearch !== 0) { - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - MinimumResultsForSearch - ); - } - - if (options.closeOnSelect) { - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - CloseOnSelect - ); - } - - if ( - options.dropdownCssClass != null || - options.dropdownCss != null || - options.adaptDropdownCssClass != null - ) { - var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); - - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - DropdownCSS - ); - } - - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - AttachBody - ); - } - - if (options.selectionAdapter == null) { - if (options.multiple) { - options.selectionAdapter = MultipleSelection; - } else { - options.selectionAdapter = SingleSelection; - } - - // Add the placeholder mixin if a placeholder was specified - if (options.placeholder != null) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - Placeholder - ); - } - - if (options.allowClear) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - AllowClear - ); - } - - if (options.multiple) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - SelectionSearch - ); - } - - if ( - options.containerCssClass != null || - options.containerCss != null || - options.adaptContainerCssClass != null - ) { - var ContainerCSS = require(options.amdBase + 'compat/containerCss'); - - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - ContainerCSS - ); - } - - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - EventRelay - ); - } - - // If the defaults were not previously applied from an element, it is - // possible for the language option to have not been resolved - options.language = this._resolveLanguage(options.language); - - // Always fall back to English since it will always be complete - options.language.push('en'); - - var uniqueLanguages = []; - - for (var l = 0; l < options.language.length; l++) { - var language = options.language[l]; - - if (uniqueLanguages.indexOf(language) === -1) { - uniqueLanguages.push(language); - } - } - - options.language = uniqueLanguages; - - options.translations = this._processTranslations( - options.language, - options.debug - ); - - return options; - }; - - Defaults.prototype.reset = function () { - function stripDiacritics (text) { - // Used 'uni range + named function' from http://jsperf.com/diacritics/18 - function match(a) { - return DIACRITICS[a] || a; - } - - return text.replace(/[^\u0000-\u007E]/g, match); - } - - function matcher (params, data) { - // Always return the object if there is nothing to compare - if ($.trim(params.term) === '') { - return data; - } - - // Do a recursive check for options with children - if (data.children && data.children.length > 0) { - // Clone the data object if there are children - // This is required as we modify the object to remove any non-matches - var match = $.extend(true, {}, data); - - // Check each child of the option - for (var c = data.children.length - 1; c >= 0; c--) { - var child = data.children[c]; - - var matches = matcher(params, child); - - // If there wasn't a match, remove the object in the array - if (matches == null) { - match.children.splice(c, 1); - } - } - - // If any children matched, return the new object - if (match.children.length > 0) { - return match; - } - - // If there were no matching children, check just the plain object - return matcher(params, match); - } - - var original = stripDiacritics(data.text).toUpperCase(); - var term = stripDiacritics(params.term).toUpperCase(); - - // Check if the text contains the term - if (original.indexOf(term) > -1) { - return data; - } - - // If it doesn't contain the term, don't return anything - return null; - } - - this.defaults = { - amdBase: './', - amdLanguageBase: './i18n/', - closeOnSelect: true, - debug: false, - dropdownAutoWidth: false, - escapeMarkup: Utils.escapeMarkup, - language: {}, - matcher: matcher, - minimumInputLength: 0, - maximumInputLength: 0, - maximumSelectionLength: 0, - minimumResultsForSearch: 0, - selectOnClose: false, - scrollAfterSelect: false, - sorter: function (data) { - return data; - }, - templateResult: function (result) { - return result.text; - }, - templateSelection: function (selection) { - return selection.text; - }, - theme: 'default', - width: 'resolve' - }; - }; - - Defaults.prototype.applyFromElement = function (options, $element) { - var optionLanguage = options.language; - var defaultLanguage = this.defaults.language; - var elementLanguage = $element.prop('lang'); - var parentLanguage = $element.closest('[lang]').prop('lang'); - - var languages = Array.prototype.concat.call( - this._resolveLanguage(elementLanguage), - this._resolveLanguage(optionLanguage), - this._resolveLanguage(defaultLanguage), - this._resolveLanguage(parentLanguage) - ); - - options.language = languages; - - return options; - }; - - Defaults.prototype._resolveLanguage = function (language) { - if (!language) { - return []; - } - - if ($.isEmptyObject(language)) { - return []; - } - - if ($.isPlainObject(language)) { - return [language]; - } - - var languages; - - if (!$.isArray(language)) { - languages = [language]; - } else { - languages = language; - } - - var resolvedLanguages = []; - - for (var l = 0; l < languages.length; l++) { - resolvedLanguages.push(languages[l]); - - if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { - // Extract the region information if it is included - var languageParts = languages[l].split('-'); - var baseLanguage = languageParts[0]; - - resolvedLanguages.push(baseLanguage); - } - } - - return resolvedLanguages; - }; - - Defaults.prototype._processTranslations = function (languages, debug) { - var translations = new Translation(); - - for (var l = 0; l < languages.length; l++) { - var languageData = new Translation(); - - var language = languages[l]; - - if (typeof language === 'string') { - try { - // Try to load it with the original name - languageData = Translation.loadPath(language); - } catch (e) { - try { - // If we couldn't load it, check if it wasn't the full path - language = this.defaults.amdLanguageBase + language; - languageData = Translation.loadPath(language); - } catch (ex) { - // The translation could not be loaded at all. Sometimes this is - // because of a configuration problem, other times this can be - // because of how Select2 helps load all possible translation files - if (debug && window.console && console.warn) { - console.warn( - 'Select2: The language file for "' + language + '" could ' + - 'not be automatically loaded. A fallback will be used instead.' - ); - } - } - } - } else if ($.isPlainObject(language)) { - languageData = new Translation(language); - } else { - languageData = language; - } - - translations.extend(languageData); - } - - return translations; - }; - - Defaults.prototype.set = function (key, value) { - var camelKey = $.camelCase(key); - - var data = {}; - data[camelKey] = value; - - var convertedData = Utils._convertData(data); - - $.extend(true, this.defaults, convertedData); - }; - - var defaults = new Defaults(); - - return defaults; -}); - -S2.define('select2/options',[ - 'require', - 'jquery', - './defaults', - './utils' -], function (require, $, Defaults, Utils) { - function Options (options, $element) { - this.options = options; - - if ($element != null) { - this.fromElement($element); - } - - if ($element != null) { - this.options = Defaults.applyFromElement(this.options, $element); - } - - this.options = Defaults.apply(this.options); - - if ($element && $element.is('input')) { - var InputCompat = require(this.get('amdBase') + 'compat/inputData'); - - this.options.dataAdapter = Utils.Decorate( - this.options.dataAdapter, - InputCompat - ); - } - } - - Options.prototype.fromElement = function ($e) { - var excludedData = ['select2']; - - if (this.options.multiple == null) { - this.options.multiple = $e.prop('multiple'); - } - - if (this.options.disabled == null) { - this.options.disabled = $e.prop('disabled'); - } - - if (this.options.dir == null) { - if ($e.prop('dir')) { - this.options.dir = $e.prop('dir'); - } else if ($e.closest('[dir]').prop('dir')) { - this.options.dir = $e.closest('[dir]').prop('dir'); - } else { - this.options.dir = 'ltr'; - } - } - - $e.prop('disabled', this.options.disabled); - $e.prop('multiple', this.options.multiple); - - if (Utils.GetData($e[0], 'select2Tags')) { - if (this.options.debug && window.console && console.warn) { - console.warn( - 'Select2: The `data-select2-tags` attribute has been changed to ' + - 'use the `data-data` and `data-tags="true"` attributes and will be ' + - 'removed in future versions of Select2.' - ); - } - - Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); - Utils.StoreData($e[0], 'tags', true); - } - - if (Utils.GetData($e[0], 'ajaxUrl')) { - if (this.options.debug && window.console && console.warn) { - console.warn( - 'Select2: The `data-ajax-url` attribute has been changed to ' + - '`data-ajax--url` and support for the old attribute will be removed' + - ' in future versions of Select2.' - ); - } - - $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); - Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); - } - - var dataset = {}; - - function upperCaseLetter(_, letter) { - return letter.toUpperCase(); - } - - // Pre-load all of the attributes which are prefixed with `data-` - for (var attr = 0; attr < $e[0].attributes.length; attr++) { - var attributeName = $e[0].attributes[attr].name; - var prefix = 'data-'; - - if (attributeName.substr(0, prefix.length) == prefix) { - // Get the contents of the attribute after `data-` - var dataName = attributeName.substring(prefix.length); - - // Get the data contents from the consistent source - // This is more than likely the jQuery data helper - var dataValue = Utils.GetData($e[0], dataName); - - // camelCase the attribute name to match the spec - var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); - - // Store the data attribute contents into the dataset since - dataset[camelDataName] = dataValue; - } - } - - // Prefer the element's `dataset` attribute if it exists - // jQuery 1.x does not correctly handle data attributes with multiple dashes - if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { - dataset = $.extend(true, {}, $e[0].dataset, dataset); - } - - // Prefer our internal data cache if it exists - var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); - - data = Utils._convertData(data); - - for (var key in data) { - if ($.inArray(key, excludedData) > -1) { - continue; - } - - if ($.isPlainObject(this.options[key])) { - $.extend(this.options[key], data[key]); - } else { - this.options[key] = data[key]; - } - } - - return this; - }; - - Options.prototype.get = function (key) { - return this.options[key]; - }; - - Options.prototype.set = function (key, val) { - this.options[key] = val; - }; - - return Options; -}); - -S2.define('select2/core',[ - 'jquery', - './options', - './utils', - './keys' -], function ($, Options, Utils, KEYS) { - var Select2 = function ($element, options) { - if (Utils.GetData($element[0], 'select2') != null) { - Utils.GetData($element[0], 'select2').destroy(); - } - - this.$element = $element; - - this.id = this._generateId($element); - - options = options || {}; - - this.options = new Options(options, $element); - - Select2.__super__.constructor.call(this); - - // Set up the tabindex - - var tabindex = $element.attr('tabindex') || 0; - Utils.StoreData($element[0], 'old-tabindex', tabindex); - $element.attr('tabindex', '-1'); - - // Set up containers and adapters - - var DataAdapter = this.options.get('dataAdapter'); - this.dataAdapter = new DataAdapter($element, this.options); - - var $container = this.render(); - - this._placeContainer($container); - - var SelectionAdapter = this.options.get('selectionAdapter'); - this.selection = new SelectionAdapter($element, this.options); - this.$selection = this.selection.render(); - - this.selection.position(this.$selection, $container); - - var DropdownAdapter = this.options.get('dropdownAdapter'); - this.dropdown = new DropdownAdapter($element, this.options); - this.$dropdown = this.dropdown.render(); - - this.dropdown.position(this.$dropdown, $container); - - var ResultsAdapter = this.options.get('resultsAdapter'); - this.results = new ResultsAdapter($element, this.options, this.dataAdapter); - this.$results = this.results.render(); - - this.results.position(this.$results, this.$dropdown); - - // Bind events - - var self = this; - - // Bind the container to all of the adapters - this._bindAdapters(); - - // Register any DOM event handlers - this._registerDomEvents(); - - // Register any internal event handlers - this._registerDataEvents(); - this._registerSelectionEvents(); - this._registerDropdownEvents(); - this._registerResultsEvents(); - this._registerEvents(); - - // Set the initial state - this.dataAdapter.current(function (initialData) { - self.trigger('selection:update', { - data: initialData - }); - }); - - // Hide the original select - $element.addClass('select2-hidden-accessible'); - $element.attr('aria-hidden', 'true'); - - // Synchronize any monitored attributes - this._syncAttributes(); - - Utils.StoreData($element[0], 'select2', this); - - // Ensure backwards compatibility with $element.data('select2'). - $element.data('select2', this); - }; - - Utils.Extend(Select2, Utils.Observable); - - Select2.prototype._generateId = function ($element) { - var id = ''; - - if ($element.attr('id') != null) { - id = $element.attr('id'); - } else if ($element.attr('name') != null) { - id = $element.attr('name') + '-' + Utils.generateChars(2); - } else { - id = Utils.generateChars(4); - } - - id = id.replace(/(:|\.|\[|\]|,)/g, ''); - id = 'select2-' + id; - - return id; - }; - - Select2.prototype._placeContainer = function ($container) { - $container.insertAfter(this.$element); - - var width = this._resolveWidth(this.$element, this.options.get('width')); - - if (width != null) { - $container.css('width', width); - } - }; - - Select2.prototype._resolveWidth = function ($element, method) { - var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; - - if (method == 'resolve') { - var styleWidth = this._resolveWidth($element, 'style'); - - if (styleWidth != null) { - return styleWidth; - } - - return this._resolveWidth($element, 'element'); - } - - if (method == 'element') { - var elementWidth = $element.outerWidth(false); - - if (elementWidth <= 0) { - return 'auto'; - } - - return elementWidth + 'px'; - } - - if (method == 'style') { - var style = $element.attr('style'); - - if (typeof(style) !== 'string') { - return null; - } - - var attrs = style.split(';'); - - for (var i = 0, l = attrs.length; i < l; i = i + 1) { - var attr = attrs[i].replace(/\s/g, ''); - var matches = attr.match(WIDTH); - - if (matches !== null && matches.length >= 1) { - return matches[1]; - } - } - - return null; - } - - if (method == 'computedstyle') { - var computedStyle = window.getComputedStyle($element[0]); - - return computedStyle.width; - } - - return method; - }; - - Select2.prototype._bindAdapters = function () { - this.dataAdapter.bind(this, this.$container); - this.selection.bind(this, this.$container); - - this.dropdown.bind(this, this.$container); - this.results.bind(this, this.$container); - }; - - Select2.prototype._registerDomEvents = function () { - var self = this; - - this.$element.on('change.select2', function () { - self.dataAdapter.current(function (data) { - self.trigger('selection:update', { - data: data - }); - }); - }); - - this.$element.on('focus.select2', function (evt) { - self.trigger('focus', evt); - }); - - this._syncA = Utils.bind(this._syncAttributes, this); - this._syncS = Utils.bind(this._syncSubtree, this); - - if (this.$element[0].attachEvent) { - this.$element[0].attachEvent('onpropertychange', this._syncA); - } - - var observer = window.MutationObserver || - window.WebKitMutationObserver || - window.MozMutationObserver - ; - - if (observer != null) { - this._observer = new observer(function (mutations) { - self._syncA(); - self._syncS(null, mutations); - }); - this._observer.observe(this.$element[0], { - attributes: true, - childList: true, - subtree: false - }); - } else if (this.$element[0].addEventListener) { - this.$element[0].addEventListener( - 'DOMAttrModified', - self._syncA, - false - ); - this.$element[0].addEventListener( - 'DOMNodeInserted', - self._syncS, - false - ); - this.$element[0].addEventListener( - 'DOMNodeRemoved', - self._syncS, - false - ); - } - }; - - Select2.prototype._registerDataEvents = function () { - var self = this; - - this.dataAdapter.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerSelectionEvents = function () { - var self = this; - var nonRelayEvents = ['toggle', 'focus']; - - this.selection.on('toggle', function () { - self.toggleDropdown(); - }); - - this.selection.on('focus', function (params) { - self.focus(params); - }); - - this.selection.on('*', function (name, params) { - if ($.inArray(name, nonRelayEvents) !== -1) { - return; - } - - self.trigger(name, params); - }); - }; - - Select2.prototype._registerDropdownEvents = function () { - var self = this; - - this.dropdown.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerResultsEvents = function () { - var self = this; - - this.results.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerEvents = function () { - var self = this; - - this.on('open', function () { - self.$container.addClass('select2-container--open'); - }); - - this.on('close', function () { - self.$container.removeClass('select2-container--open'); - }); - - this.on('enable', function () { - self.$container.removeClass('select2-container--disabled'); - }); - - this.on('disable', function () { - self.$container.addClass('select2-container--disabled'); - }); - - this.on('blur', function () { - self.$container.removeClass('select2-container--focus'); - }); - - this.on('query', function (params) { - if (!self.isOpen()) { - self.trigger('open', {}); - } - - this.dataAdapter.query(params, function (data) { - self.trigger('results:all', { - data: data, - query: params - }); - }); - }); - - this.on('query:append', function (params) { - this.dataAdapter.query(params, function (data) { - self.trigger('results:append', { - data: data, - query: params - }); - }); - }); - - this.on('keypress', function (evt) { - var key = evt.which; - - if (self.isOpen()) { - if (key === KEYS.ESC || key === KEYS.TAB || - (key === KEYS.UP && evt.altKey)) { - self.close(evt); - - evt.preventDefault(); - } else if (key === KEYS.ENTER) { - self.trigger('results:select', {}); - - evt.preventDefault(); - } else if ((key === KEYS.SPACE && evt.ctrlKey)) { - self.trigger('results:toggle', {}); - - evt.preventDefault(); - } else if (key === KEYS.UP) { - self.trigger('results:previous', {}); - - evt.preventDefault(); - } else if (key === KEYS.DOWN) { - self.trigger('results:next', {}); - - evt.preventDefault(); - } - } else { - if (key === KEYS.ENTER || key === KEYS.SPACE || - (key === KEYS.DOWN && evt.altKey)) { - self.open(); - - evt.preventDefault(); - } - } - }); - }; - - Select2.prototype._syncAttributes = function () { - this.options.set('disabled', this.$element.prop('disabled')); - - if (this.isDisabled()) { - if (this.isOpen()) { - this.close(); - } - - this.trigger('disable', {}); - } else { - this.trigger('enable', {}); - } - }; - - Select2.prototype._isChangeMutation = function (evt, mutations) { - var changed = false; - var self = this; - - // Ignore any mutation events raised for elements that aren't options or - // optgroups. This handles the case when the select element is destroyed - if ( - evt && evt.target && ( - evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' - ) - ) { - return; - } - - if (!mutations) { - // If mutation events aren't supported, then we can only assume that the - // change affected the selections - changed = true; - } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { - for (var n = 0; n < mutations.addedNodes.length; n++) { - var node = mutations.addedNodes[n]; - - if (node.selected) { - changed = true; - } - } - } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { - changed = true; - } else if ($.isArray(mutations)) { - $.each(mutations, function(evt, mutation) { - if (self._isChangeMutation(evt, mutation)) { - // We've found a change mutation. - // Let's escape from the loop and continue - changed = true; - return false; - } - }); - } - return changed; - }; - - Select2.prototype._syncSubtree = function (evt, mutations) { - var changed = this._isChangeMutation(evt, mutations); - var self = this; - - // Only re-pull the data if we think there is a change - if (changed) { - this.dataAdapter.current(function (currentData) { - self.trigger('selection:update', { - data: currentData - }); - }); - } - }; - - /** - * Override the trigger method to automatically trigger pre-events when - * there are events that can be prevented. - */ - Select2.prototype.trigger = function (name, args) { - var actualTrigger = Select2.__super__.trigger; - var preTriggerMap = { - 'open': 'opening', - 'close': 'closing', - 'select': 'selecting', - 'unselect': 'unselecting', - 'clear': 'clearing' - }; - - if (args === undefined) { - args = {}; - } - - if (name in preTriggerMap) { - var preTriggerName = preTriggerMap[name]; - var preTriggerArgs = { - prevented: false, - name: name, - args: args - }; - - actualTrigger.call(this, preTriggerName, preTriggerArgs); - - if (preTriggerArgs.prevented) { - args.prevented = true; - - return; - } - } - - actualTrigger.call(this, name, args); - }; - - Select2.prototype.toggleDropdown = function () { - if (this.isDisabled()) { - return; - } - - if (this.isOpen()) { - this.close(); - } else { - this.open(); - } - }; - - Select2.prototype.open = function () { - if (this.isOpen()) { - return; - } - - if (this.isDisabled()) { - return; - } - - this.trigger('query', {}); - }; - - Select2.prototype.close = function (evt) { - if (!this.isOpen()) { - return; - } - - this.trigger('close', { originalEvent : evt }); - }; - - /** - * Helper method to abstract the "enabled" (not "disabled") state of this - * object. - * - * @return {true} if the instance is not disabled. - * @return {false} if the instance is disabled. - */ - Select2.prototype.isEnabled = function () { - return !this.isDisabled(); - }; - - /** - * Helper method to abstract the "disabled" state of this object. - * - * @return {true} if the disabled option is true. - * @return {false} if the disabled option is false. - */ - Select2.prototype.isDisabled = function () { - return this.options.get('disabled'); - }; - - Select2.prototype.isOpen = function () { - return this.$container.hasClass('select2-container--open'); - }; - - Select2.prototype.hasFocus = function () { - return this.$container.hasClass('select2-container--focus'); - }; - - Select2.prototype.focus = function (data) { - // No need to re-trigger focus events if we are already focused - if (this.hasFocus()) { - return; - } - - this.$container.addClass('select2-container--focus'); - this.trigger('focus', {}); - }; - - Select2.prototype.enable = function (args) { - if (this.options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `select2("enable")` method has been deprecated and will' + - ' be removed in later Select2 versions. Use $element.prop("disabled")' + - ' instead.' - ); - } - - if (args == null || args.length === 0) { - args = [true]; - } - - var disabled = !args[0]; - - this.$element.prop('disabled', disabled); - }; - - Select2.prototype.data = function () { - if (this.options.get('debug') && - arguments.length > 0 && window.console && console.warn) { - console.warn( - 'Select2: Data can no longer be set using `select2("data")`. You ' + - 'should consider setting the value instead using `$element.val()`.' - ); - } - - var data = []; - - this.dataAdapter.current(function (currentData) { - data = currentData; - }); - - return data; - }; - - Select2.prototype.val = function (args) { - if (this.options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `select2("val")` method has been deprecated and will be' + - ' removed in later Select2 versions. Use $element.val() instead.' - ); - } - - if (args == null || args.length === 0) { - return this.$element.val(); - } - - var newVal = args[0]; - - if ($.isArray(newVal)) { - newVal = $.map(newVal, function (obj) { - return obj.toString(); - }); - } - - this.$element.val(newVal).trigger('input').trigger('change'); - }; - - Select2.prototype.destroy = function () { - this.$container.remove(); - - if (this.$element[0].detachEvent) { - this.$element[0].detachEvent('onpropertychange', this._syncA); - } - - if (this._observer != null) { - this._observer.disconnect(); - this._observer = null; - } else if (this.$element[0].removeEventListener) { - this.$element[0] - .removeEventListener('DOMAttrModified', this._syncA, false); - this.$element[0] - .removeEventListener('DOMNodeInserted', this._syncS, false); - this.$element[0] - .removeEventListener('DOMNodeRemoved', this._syncS, false); - } - - this._syncA = null; - this._syncS = null; - - this.$element.off('.select2'); - this.$element.attr('tabindex', - Utils.GetData(this.$element[0], 'old-tabindex')); - - this.$element.removeClass('select2-hidden-accessible'); - this.$element.attr('aria-hidden', 'false'); - Utils.RemoveData(this.$element[0]); - this.$element.removeData('select2'); - - this.dataAdapter.destroy(); - this.selection.destroy(); - this.dropdown.destroy(); - this.results.destroy(); - - this.dataAdapter = null; - this.selection = null; - this.dropdown = null; - this.results = null; - }; - - Select2.prototype.render = function () { - var $container = $( - '<span class="select2 select2-container">' + - '<span class="selection"></span>' + - '<span class="dropdown-wrapper" aria-hidden="true"></span>' + - '</span>' - ); - - $container.attr('dir', this.options.get('dir')); - - this.$container = $container; - - this.$container.addClass('select2-container--' + this.options.get('theme')); - - Utils.StoreData($container[0], 'element', this.$element); - - return $container; - }; - - return Select2; -}); - -S2.define('select2/compat/utils',[ - 'jquery' -], function ($) { - function syncCssClasses ($dest, $src, adapter) { - var classes, replacements = [], adapted; - - classes = $.trim($dest.attr('class')); - - if (classes) { - classes = '' + classes; // for IE which returns object - - $(classes.split(/\s+/)).each(function () { - // Save all Select2 classes - if (this.indexOf('select2-') === 0) { - replacements.push(this); - } - }); - } - - classes = $.trim($src.attr('class')); - - if (classes) { - classes = '' + classes; // for IE which returns object - - $(classes.split(/\s+/)).each(function () { - // Only adapt non-Select2 classes - if (this.indexOf('select2-') !== 0) { - adapted = adapter(this); - - if (adapted != null) { - replacements.push(adapted); - } - } - }); - } - - $dest.attr('class', replacements.join(' ')); - } - - return { - syncCssClasses: syncCssClasses - }; -}); - -S2.define('select2/compat/containerCss',[ - 'jquery', - './utils' -], function ($, CompatUtils) { - // No-op CSS adapter that discards all classes by default - function _containerAdapter (clazz) { - return null; - } - - function ContainerCSS () { } - - ContainerCSS.prototype.render = function (decorated) { - var $container = decorated.call(this); - - var containerCssClass = this.options.get('containerCssClass') || ''; - - if ($.isFunction(containerCssClass)) { - containerCssClass = containerCssClass(this.$element); - } - - var containerCssAdapter = this.options.get('adaptContainerCssClass'); - containerCssAdapter = containerCssAdapter || _containerAdapter; - - if (containerCssClass.indexOf(':all:') !== -1) { - containerCssClass = containerCssClass.replace(':all:', ''); - - var _cssAdapter = containerCssAdapter; - - containerCssAdapter = function (clazz) { - var adapted = _cssAdapter(clazz); - - if (adapted != null) { - // Append the old one along with the adapted one - return adapted + ' ' + clazz; - } - - return clazz; - }; - } - - var containerCss = this.options.get('containerCss') || {}; - - if ($.isFunction(containerCss)) { - containerCss = containerCss(this.$element); - } - - CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter); - - $container.css(containerCss); - $container.addClass(containerCssClass); - - return $container; - }; - - return ContainerCSS; -}); - -S2.define('select2/compat/dropdownCss',[ - 'jquery', - './utils' -], function ($, CompatUtils) { - // No-op CSS adapter that discards all classes by default - function _dropdownAdapter (clazz) { - return null; - } - - function DropdownCSS () { } - - DropdownCSS.prototype.render = function (decorated) { - var $dropdown = decorated.call(this); - - var dropdownCssClass = this.options.get('dropdownCssClass') || ''; - - if ($.isFunction(dropdownCssClass)) { - dropdownCssClass = dropdownCssClass(this.$element); - } - - var dropdownCssAdapter = this.options.get('adaptDropdownCssClass'); - dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter; - - if (dropdownCssClass.indexOf(':all:') !== -1) { - dropdownCssClass = dropdownCssClass.replace(':all:', ''); - - var _cssAdapter = dropdownCssAdapter; - - dropdownCssAdapter = function (clazz) { - var adapted = _cssAdapter(clazz); - - if (adapted != null) { - // Append the old one along with the adapted one - return adapted + ' ' + clazz; - } - - return clazz; - }; - } - - var dropdownCss = this.options.get('dropdownCss') || {}; - - if ($.isFunction(dropdownCss)) { - dropdownCss = dropdownCss(this.$element); - } - - CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter); - - $dropdown.css(dropdownCss); - $dropdown.addClass(dropdownCssClass); - - return $dropdown; - }; - - return DropdownCSS; -}); - -S2.define('select2/compat/initSelection',[ - 'jquery' -], function ($) { - function InitSelection (decorated, $element, options) { - if (options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `initSelection` option has been deprecated in favor' + - ' of a custom data adapter that overrides the `current` method. ' + - 'This method is now called multiple times instead of a single ' + - 'time when the instance is initialized. Support will be removed ' + - 'for the `initSelection` option in future versions of Select2' - ); - } - - this.initSelection = options.get('initSelection'); - this._isInitialized = false; - - decorated.call(this, $element, options); - } - - InitSelection.prototype.current = function (decorated, callback) { - var self = this; - - if (this._isInitialized) { - decorated.call(this, callback); - - return; - } - - this.initSelection.call(null, this.$element, function (data) { - self._isInitialized = true; - - if (!$.isArray(data)) { - data = [data]; - } - - callback(data); - }); - }; - - return InitSelection; -}); - -S2.define('select2/compat/inputData',[ - 'jquery', - '../utils' -], function ($, Utils) { - function InputData (decorated, $element, options) { - this._currentData = []; - this._valueSeparator = options.get('valueSeparator') || ','; - - if ($element.prop('type') === 'hidden') { - if (options.get('debug') && console && console.warn) { - console.warn( - 'Select2: Using a hidden input with Select2 is no longer ' + - 'supported and may stop working in the future. It is recommended ' + - 'to use a `<select>` element instead.' - ); - } - } - - decorated.call(this, $element, options); - } - - InputData.prototype.current = function (_, callback) { - function getSelected (data, selectedIds) { - var selected = []; - - if (data.selected || $.inArray(data.id, selectedIds) !== -1) { - data.selected = true; - selected.push(data); - } else { - data.selected = false; - } - - if (data.children) { - selected.push.apply(selected, getSelected(data.children, selectedIds)); - } - - return selected; - } - - var selected = []; - - for (var d = 0; d < this._currentData.length; d++) { - var data = this._currentData[d]; - - selected.push.apply( - selected, - getSelected( - data, - this.$element.val().split( - this._valueSeparator - ) - ) - ); - } - - callback(selected); - }; - - InputData.prototype.select = function (_, data) { - if (!this.options.get('multiple')) { - this.current(function (allData) { - $.map(allData, function (data) { - data.selected = false; - }); - }); - - this.$element.val(data.id); - this.$element.trigger('input').trigger('change'); - } else { - var value = this.$element.val(); - value += this._valueSeparator + data.id; - - this.$element.val(value); - this.$element.trigger('input').trigger('change'); - } - }; - - InputData.prototype.unselect = function (_, data) { - var self = this; - - data.selected = false; - - this.current(function (allData) { - var values = []; - - for (var d = 0; d < allData.length; d++) { - var item = allData[d]; - - if (data.id == item.id) { - continue; - } - - values.push(item.id); - } - - self.$element.val(values.join(self._valueSeparator)); - self.$element.trigger('input').trigger('change'); - }); - }; - - InputData.prototype.query = function (_, params, callback) { - var results = []; - - for (var d = 0; d < this._currentData.length; d++) { - var data = this._currentData[d]; - - var matches = this.matches(params, data); - - if (matches !== null) { - results.push(matches); - } - } - - callback({ - results: results - }); - }; - - InputData.prototype.addOptions = function (_, $options) { - var options = $.map($options, function ($option) { - return Utils.GetData($option[0], 'data'); - }); - - this._currentData.push.apply(this._currentData, options); - }; - - return InputData; -}); - -S2.define('select2/compat/matcher',[ - 'jquery' -], function ($) { - function oldMatcher (matcher) { - function wrappedMatcher (params, data) { - var match = $.extend(true, {}, data); - - if (params.term == null || $.trim(params.term) === '') { - return match; - } - - if (data.children) { - for (var c = data.children.length - 1; c >= 0; c--) { - var child = data.children[c]; - - // Check if the child object matches - // The old matcher returned a boolean true or false - var doesMatch = matcher(params.term, child.text, child); - - // If the child didn't match, pop it off - if (!doesMatch) { - match.children.splice(c, 1); - } - } - - if (match.children.length > 0) { - return match; - } - } - - if (matcher(params.term, data.text, data)) { - return match; - } - - return null; - } - - return wrappedMatcher; - } - - return oldMatcher; -}); - -S2.define('select2/compat/query',[ - -], function () { - function Query (decorated, $element, options) { - if (options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `query` option has been deprecated in favor of a ' + - 'custom data adapter that overrides the `query` method. Support ' + - 'will be removed for the `query` option in future versions of ' + - 'Select2.' - ); - } - - decorated.call(this, $element, options); - } - - Query.prototype.query = function (_, params, callback) { - params.callback = callback; - - var query = this.options.get('query'); - - query.call(null, params); - }; - - return Query; -}); - -S2.define('select2/dropdown/attachContainer',[ - -], function () { - function AttachContainer (decorated, $element, options) { - decorated.call(this, $element, options); - } - - AttachContainer.prototype.position = - function (decorated, $dropdown, $container) { - var $dropdownContainer = $container.find('.dropdown-wrapper'); - $dropdownContainer.append($dropdown); - - $dropdown.addClass('select2-dropdown--below'); - $container.addClass('select2-container--below'); - }; - - return AttachContainer; -}); - -S2.define('select2/dropdown/stopPropagation',[ - -], function () { - function StopPropagation () { } - - StopPropagation.prototype.bind = function (decorated, container, $container) { - decorated.call(this, container, $container); - - var stoppedEvents = [ - 'blur', - 'change', - 'click', - 'dblclick', - 'focus', - 'focusin', - 'focusout', - 'input', - 'keydown', - 'keyup', - 'keypress', - 'mousedown', - 'mouseenter', - 'mouseleave', - 'mousemove', - 'mouseover', - 'mouseup', - 'search', - 'touchend', - 'touchstart' - ]; - - this.$dropdown.on(stoppedEvents.join(' '), function (evt) { - evt.stopPropagation(); - }); - }; - - return StopPropagation; -}); - -S2.define('select2/selection/stopPropagation',[ - -], function () { - function StopPropagation () { } - - StopPropagation.prototype.bind = function (decorated, container, $container) { - decorated.call(this, container, $container); - - var stoppedEvents = [ - 'blur', - 'change', - 'click', - 'dblclick', - 'focus', - 'focusin', - 'focusout', - 'input', - 'keydown', - 'keyup', - 'keypress', - 'mousedown', - 'mouseenter', - 'mouseleave', - 'mousemove', - 'mouseover', - 'mouseup', - 'search', - 'touchend', - 'touchstart' - ]; - - this.$selection.on(stoppedEvents.join(' '), function (evt) { - evt.stopPropagation(); - }); - }; - - return StopPropagation; -}); - -/*! - * jQuery Mousewheel 3.1.13 - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - */ - -(function (factory) { - if ( typeof S2.define === 'function' && S2.define.amd ) { - // AMD. Register as an anonymous module. - S2.define('jquery-mousewheel',['jquery'], factory); - } else if (typeof exports === 'object') { - // Node/CommonJS style for Browserify - module.exports = factory; - } else { - // Browser globals - factory(jQuery); - } -}(function ($) { - - var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], - toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? - ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], - slice = Array.prototype.slice, - nullLowestDeltaTimeout, lowestDelta; - - if ( $.event.fixHooks ) { - for ( var i = toFix.length; i; ) { - $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; - } - } - - var special = $.event.special.mousewheel = { - version: '3.1.12', - - setup: function() { - if ( this.addEventListener ) { - for ( var i = toBind.length; i; ) { - this.addEventListener( toBind[--i], handler, false ); - } - } else { - this.onmousewheel = handler; - } - // Store the line height and page height for this particular element - $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); - $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); - }, - - teardown: function() { - if ( this.removeEventListener ) { - for ( var i = toBind.length; i; ) { - this.removeEventListener( toBind[--i], handler, false ); - } - } else { - this.onmousewheel = null; - } - // Clean up the data we added to the element - $.removeData(this, 'mousewheel-line-height'); - $.removeData(this, 'mousewheel-page-height'); - }, - - getLineHeight: function(elem) { - var $elem = $(elem), - $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); - if (!$parent.length) { - $parent = $('body'); - } - return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; - }, - - getPageHeight: function(elem) { - return $(elem).height(); - }, - - settings: { - adjustOldDeltas: true, // see shouldAdjustOldDeltas() below - normalizeOffset: true // calls getBoundingClientRect for each event - } - }; - - $.fn.extend({ - mousewheel: function(fn) { - return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); - }, - - unmousewheel: function(fn) { - return this.unbind('mousewheel', fn); - } - }); - - - function handler(event) { - var orgEvent = event || window.event, - args = slice.call(arguments, 1), - delta = 0, - deltaX = 0, - deltaY = 0, - absDelta = 0, - offsetX = 0, - offsetY = 0; - event = $.event.fix(orgEvent); - event.type = 'mousewheel'; - - // Old school scrollwheel delta - if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; } - if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; } - if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; } - if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; } - - // Firefox < 17 horizontal scrolling related to DOMMouseScroll event - if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { - deltaX = deltaY * -1; - deltaY = 0; - } - - // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy - delta = deltaY === 0 ? deltaX : deltaY; - - // New school wheel delta (wheel event) - if ( 'deltaY' in orgEvent ) { - deltaY = orgEvent.deltaY * -1; - delta = deltaY; - } - if ( 'deltaX' in orgEvent ) { - deltaX = orgEvent.deltaX; - if ( deltaY === 0 ) { delta = deltaX * -1; } - } - - // No change actually happened, no reason to go any further - if ( deltaY === 0 && deltaX === 0 ) { return; } - - // Need to convert lines and pages to pixels if we aren't already in pixels - // There are three delta modes: - // * deltaMode 0 is by pixels, nothing to do - // * deltaMode 1 is by lines - // * deltaMode 2 is by pages - if ( orgEvent.deltaMode === 1 ) { - var lineHeight = $.data(this, 'mousewheel-line-height'); - delta *= lineHeight; - deltaY *= lineHeight; - deltaX *= lineHeight; - } else if ( orgEvent.deltaMode === 2 ) { - var pageHeight = $.data(this, 'mousewheel-page-height'); - delta *= pageHeight; - deltaY *= pageHeight; - deltaX *= pageHeight; - } - - // Store lowest absolute delta to normalize the delta values - absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); - - if ( !lowestDelta || absDelta < lowestDelta ) { - lowestDelta = absDelta; - - // Adjust older deltas if necessary - if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { - lowestDelta /= 40; - } - } - - // Adjust older deltas if necessary - if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { - // Divide all the things by 40! - delta /= 40; - deltaX /= 40; - deltaY /= 40; - } - - // Get a whole, normalized value for the deltas - delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta); - deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta); - deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta); - - // Normalise offsetX and offsetY properties - if ( special.settings.normalizeOffset && this.getBoundingClientRect ) { - var boundingRect = this.getBoundingClientRect(); - offsetX = event.clientX - boundingRect.left; - offsetY = event.clientY - boundingRect.top; - } - - // Add information to the event object - event.deltaX = deltaX; - event.deltaY = deltaY; - event.deltaFactor = lowestDelta; - event.offsetX = offsetX; - event.offsetY = offsetY; - // Go ahead and set deltaMode to 0 since we converted to pixels - // Although this is a little odd since we overwrite the deltaX/Y - // properties with normalized deltas. - event.deltaMode = 0; - - // Add event and delta to the front of the arguments - args.unshift(event, delta, deltaX, deltaY); - - // Clearout lowestDelta after sometime to better - // handle multiple device types that give different - // a different lowestDelta - // Ex: trackpad = 3 and mouse wheel = 120 - if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); } - nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); - - return ($.event.dispatch || $.event.handle).apply(this, args); - } - - function nullLowestDelta() { - lowestDelta = null; - } - - function shouldAdjustOldDeltas(orgEvent, absDelta) { - // If this is an older event and the delta is divisable by 120, - // then we are assuming that the browser is treating this as an - // older mouse wheel event and that we should divide the deltas - // by 40 to try and get a more usable deltaFactor. - // Side note, this actually impacts the reported scroll distance - // in older browsers and can cause scrolling to be slower than native. - // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. - return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; - } - -})); - -S2.define('jquery.select2',[ - 'jquery', - 'jquery-mousewheel', - - './select2/core', - './select2/defaults', - './select2/utils' -], function ($, _, Select2, Defaults, Utils) { - if ($.fn.select2 == null) { - // All methods that should return the element - var thisMethods = ['open', 'close', 'destroy']; - - $.fn.select2 = function (options) { - options = options || {}; - - if (typeof options === 'object') { - this.each(function () { - var instanceOptions = $.extend(true, {}, options); - - var instance = new Select2($(this), instanceOptions); - }); - - return this; - } else if (typeof options === 'string') { - var ret; - var args = Array.prototype.slice.call(arguments, 1); - - this.each(function () { - var instance = Utils.GetData(this, 'select2'); - - if (instance == null && window.console && console.error) { - console.error( - 'The select2(\'' + options + '\') method was called on an ' + - 'element that is not using Select2.' - ); - } - - ret = instance[options].apply(instance, args); - }); - - // Check if we should be returning `this` - if ($.inArray(options, thisMethods) > -1) { - return this; - } - - return ret; - } else { - throw new Error('Invalid arguments for Select2: ' + options); - } - }; - } - - if ($.fn.select2.defaults == null) { - $.fn.select2.defaults = Defaults; - } - - return Select2; -}); - - // Return the AMD loader configuration so it can be used outside of this file - return { - define: S2.define, - require: S2.require - }; -}()); - - // Autoload the jQuery bindings - // We know that all of the modules exist above this, so we're safe - var select2 = S2.require('jquery.select2'); - - // Hold the AMD module references on the jQuery function that was just loaded - // This allows Select2 to use the internal loader outside of this file, such - // as in the language files. - jQuery.fn.select2.amd = S2; - - // Return the Select2 instance for anyone who is importing it. - return select2; -})); diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js deleted file mode 100644 index fa78191..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ -!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(d){var e=function(){if(d&&d.fn&&d.fn.select2&&d.fn.select2.amd)var e=d.fn.select2.amd;var t,n,i,h,o,s,f,g,m,v,y,_,r,a,w,l;function b(e,t){return r.call(e,t)}function c(e,t){var n,i,r,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&w.test(e[s])&&(e[s]=e[s].replace(w,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u<e.length;u++)if("."===(p=e[u]))e.splice(u,1),u-=1;else if(".."===p){if(0===u||1===u&&".."===e[2]||".."===e[u-1])continue;0<u&&(e.splice(u-1,2),u-=2)}e=e.join("/")}if((h||g)&&f){for(u=(n=e.split("/")).length;0<u;u-=1){if(i=n.slice(0,u).join("/"),h)for(d=h.length;0<d;d-=1)if(r=(r=f[h.slice(0,d).join("/")])&&r[i]){o=r,a=u;break}if(o)break;!l&&g&&g[i]&&(l=g[i],c=u)}!o&&l&&(o=l,a=c),o&&(n.splice(0,a,o),e=n.join("/"))}return e}function A(t,n){return function(){var e=a.call(arguments,0);return"string"!=typeof e[0]&&1===e.length&&e.push(null),s.apply(h,e.concat([t,n]))}}function x(t){return function(e){m[t]=e}}function D(e){if(b(v,e)){var t=v[e];delete v[e],_[e]=!0,o.apply(h,t)}if(!b(m,e)&&!b(_,e))throw new Error("No "+e);return m[e]}function u(e){var t,n=e?e.indexOf("!"):-1;return-1<n&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function S(e){return e?u(e):[]}return e&&e.requirejs||(e?n=e:e={},m={},v={},y={},_={},r=Object.prototype.hasOwnProperty,a=[].slice,w=/\.js$/,f=function(e,t){var n,i=u(e),r=i[0],o=t[1];return e=i[1],r&&(n=D(r=c(r,o))),r?e=n&&n.normalize?n.normalize(e,function(t){return function(e){return c(e,t)}}(o)):c(e,o):(r=(i=u(e=c(e,o)))[0],e=i[1],r&&(n=D(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},g={require:function(e){return A(e)},exports:function(e){var t=m[e];return void 0!==t?t:m[e]={}},module:function(e){return{id:e,uri:"",exports:m[e],config:function(e){return function(){return y&&y.config&&y.config[e]||{}}}(e)}}},o=function(e,t,n,i){var r,o,s,a,l,c,u,d=[],p=typeof n;if(c=S(i=i||e),"undefined"==p||"function"==p){for(t=!t.length&&n.length?["require","exports","module"]:t,l=0;l<t.length;l+=1)if("require"===(o=(a=f(t[l],c)).f))d[l]=g.require(e);else if("exports"===o)d[l]=g.exports(e),u=!0;else if("module"===o)r=d[l]=g.module(e);else if(b(m,o)||b(v,o)||b(_,o))d[l]=D(o);else{if(!a.p)throw new Error(e+" missing "+o);a.p.load(a.n,A(i,!0),x(o),{}),d[l]=m[o]}s=n?n.apply(m[e],d):void 0,e&&(r&&r.exports!==h&&r.exports!==m[e]?m[e]=r.exports:s===h&&u||(m[e]=s))}else e&&(m[e]=n)},t=n=s=function(e,t,n,i,r){if("string"==typeof e)return g[e]?g[e](t):D(f(e,S(t)).f);if(!e.splice){if((y=e).deps&&s(y.deps,y.callback),!t)return;t.splice?(e=t,t=n,n=null):e=h}return t=t||function(){},"function"==typeof n&&(n=i,i=r),i?o(h,e,t,n):setTimeout(function(){o(h,e,t,n)},4),s},s.config=function(e){return s(e)},t._defined=m,(i=function(e,t,n){if("string"!=typeof e)throw new Error("See almond README: incorrect module build, no module name");t.splice||(n=t,t=[]),b(m,e)||b(v,e)||(v[e]=[e,t,n])}).amd={jQuery:!0},e.requirejs=t,e.require=n,e.define=i),e.define("almond",function(){}),e.define("jquery",[],function(){var e=d||$;return null==e&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),e}),e.define("select2/utils",["jquery"],function(o){var r={};function u(e){var t=e.prototype,n=[];for(var i in t){"function"==typeof t[i]&&"constructor"!==i&&n.push(i)}return n}r.Extend=function(e,t){var n={}.hasOwnProperty;function i(){this.constructor=e}for(var r in t)n.call(t,r)&&(e[r]=t[r]);return i.prototype=t.prototype,e.prototype=new i,e.__super__=t.prototype,e},r.Decorate=function(i,r){var e=u(r),t=u(i);function o(){var e=Array.prototype.unshift,t=r.prototype.constructor.length,n=i.prototype.constructor;0<t&&(e.call(arguments,i.prototype.constructor),n=r.prototype.constructor),n.apply(this,arguments)}r.displayName=i.displayName,o.prototype=new function(){this.constructor=o};for(var n=0;n<t.length;n++){var s=t[n];o.prototype[s]=i.prototype[s]}function a(e){var t=function(){};e in o.prototype&&(t=o.prototype[e]);var n=r.prototype[e];return function(){return Array.prototype.unshift.call(arguments,t),n.apply(this,arguments)}}for(var l=0;l<e.length;l++){var c=e[l];o.prototype[c]=a(c)}return o};function e(){this.listeners={}}e.prototype.on=function(e,t){this.listeners=this.listeners||{},e in this.listeners?this.listeners[e].push(t):this.listeners[e]=[t]},e.prototype.trigger=function(e){var t=Array.prototype.slice,n=t.call(arguments,1);this.listeners=this.listeners||{},null==n&&(n=[]),0===n.length&&n.push({}),(n[0]._type=e)in this.listeners&&this.invoke(this.listeners[e],t.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},e.prototype.invoke=function(e,t){for(var n=0,i=e.length;n<i;n++)e[n].apply(this,t)},r.Observable=e,r.generateChars=function(e){for(var t="",n=0;n<e;n++){t+=Math.floor(36*Math.random()).toString(36)}return t},r.bind=function(e,t){return function(){e.apply(t,arguments)}},r._convertData=function(e){for(var t in e){var n=t.split("-"),i=e;if(1!==n.length){for(var r=0;r<n.length;r++){var o=n[r];(o=o.substring(0,1).toLowerCase()+o.substring(1))in i||(i[o]={}),r==n.length-1&&(i[o]=e[t]),i=i[o]}delete e[t]}}return e},r.hasScroll=function(e,t){var n=o(t),i=t.style.overflowX,r=t.style.overflowY;return(i!==r||"hidden"!==r&&"visible"!==r)&&("scroll"===i||"scroll"===r||(n.innerHeight()<t.scrollHeight||n.innerWidth()<t.scrollWidth))},r.escapeMarkup=function(e){var t={"\\":"\","&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},r.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},r.__cache={};var n=0;return r.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},r.StoreData=function(e,t,n){var i=r.GetUniqueElementId(e);r.__cache[i]||(r.__cache[i]={}),r.__cache[i][t]=n},r.GetData=function(e,t){var n=r.GetUniqueElementId(e);return t?r.__cache[n]&&null!=r.__cache[n][t]?r.__cache[n][t]:o(e).data(t):r.__cache[n]},r.RemoveData=function(e){var t=r.GetUniqueElementId(e);null!=r.__cache[t]&&delete r.__cache[t],e.removeAttribute("data-select2-id")},r}),e.define("select2/results",["jquery","./utils"],function(h,f){function i(e,t,n){this.$element=e,this.data=n,this.options=t,i.__super__.constructor.call(this)}return f.Extend(i,f.Observable),i.prototype.render=function(){var e=h('<ul class="select2-results__options" role="listbox"></ul>');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},i.prototype.clear=function(){this.$results.empty()},i.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h('<li role="alert" aria-live="assertive" class="select2-results__option"></li>'),i=this.options.get("translations").get(e.message);n.append(t(i(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},i.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},i.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n<e.results.length;n++){var i=e.results[n],r=this.option(i);t.push(r)}this.$results.append(t)}else 0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"})},i.prototype.position=function(e,t){t.find(".select2-results").append(e)},i.prototype.sort=function(e){return this.options.get("sorter")(e)},i.prototype.highlightFirstItem=function(){var e=this.$results.find(".select2-results__option[aria-selected]"),t=e.filter("[aria-selected=true]");0<t.length?t.first().trigger("mouseenter"):e.first().trigger("mouseenter"),this.ensureHighlightVisible()},i.prototype.setClasses=function(){var t=this;this.data.current(function(e){var i=h.map(e,function(e){return e.id.toString()});t.$results.find(".select2-results__option[aria-selected]").each(function(){var e=h(this),t=f.GetData(this,"data"),n=""+t.id;null!=t.element&&t.element.selected||null==t.element&&-1<h.inArray(n,i)?e.attr("aria-selected","true"):e.attr("aria-selected","false")})})},i.prototype.showLoading=function(e){this.hideLoading();var t={disabled:!0,loading:!0,text:this.options.get("translations").get("searching")(e)},n=this.option(t);n.className+=" loading-results",this.$results.prepend(n)},i.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},i.prototype.option=function(e){var t=document.createElement("li");t.className="select2-results__option";var n={role:"option","aria-selected":"false"},i=window.Element.prototype.matches||window.Element.prototype.msMatchesSelector||window.Element.prototype.webkitMatchesSelector;for(var r in(null!=e.element&&i.call(e.element,":disabled")||null==e.element&&e.disabled)&&(delete n["aria-selected"],n["aria-disabled"]="true"),null==e.id&&delete n["aria-selected"],null!=e._resultId&&(t.id=e._resultId),e.title&&(t.title=e.title),e.children&&(n.role="group",n["aria-label"]=e.text,delete n["aria-selected"]),n){var o=n[r];t.setAttribute(r,o)}if(e.children){var s=h(t),a=document.createElement("strong");a.className="select2-results__group";h(a);this.template(e,a);for(var l=[],c=0;c<e.children.length;c++){var u=e.children[c],d=this.option(u);l.push(d)}var p=h("<ul></ul>",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},i.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var i=n-1;0===e.length&&(i=0);var r=t.eq(i);r.trigger("mouseenter");var o=l.$results.offset().top,s=r.offset().top,a=l.$results.scrollTop()+(s-o);0===i?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var i=t.eq(n);i.trigger("mouseenter");var r=l.$results.offset().top+l.$results.outerHeight(!1),o=i.offset().top+i.outerHeight(!1),s=l.$results.scrollTop()+o-r;0===n?l.$results.scrollTop(0):r<o&&l.$results.scrollTop(s)}}),t.on("results:focus",function(e){e.element.addClass("select2-results__option--highlighted")}),t.on("results:message",function(e){l.displayMessage(e)}),h.fn.mousewheel&&this.$results.on("mousewheel",function(e){var t=l.$results.scrollTop(),n=l.$results.get(0).scrollHeight-t+e.deltaY,i=0<e.deltaY&&t-e.deltaY<=0,r=e.deltaY<0&&n<=l.$results.height();i?(l.$results.scrollTop(0),e.preventDefault(),e.stopPropagation()):r&&(l.$results.scrollTop(l.$results.get(0).scrollHeight-l.$results.height()),e.preventDefault(),e.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(e){var t=h(this),n=f.GetData(this,"data");"true"!==t.attr("aria-selected")?l.trigger("select",{originalEvent:e,data:n}):l.options.get("multiple")?l.trigger("unselect",{originalEvent:e,data:n}):l.trigger("close",{})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(e){var t=f.GetData(this,"data");l.getHighlightedResults().removeClass("select2-results__option--highlighted"),l.trigger("results:focus",{data:t,element:h(this)})})},i.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},i.prototype.destroy=function(){this.$results.remove()},i.prototype.ensureHighlightVisible=function(){var e=this.getHighlightedResults();if(0!==e.length){var t=this.$results.find("[aria-selected]").index(e),n=this.$results.offset().top,i=e.offset().top,r=this.$results.scrollTop()+(i-n),o=i-n;r-=2*e.outerHeight(!1),t<=2?this.$results.scrollTop(0):(o>this.$results.outerHeight()||o<0)&&this.$results.scrollTop(r)}},i.prototype.template=function(e,t){var n=this.options.get("templateResult"),i=this.options.get("escapeMarkup"),r=n(e,t);null==r?t.style.display="none":"string"==typeof r?t.innerHTML=i(r):h(t).append(r)},i}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,i,r){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return i.Extend(o,i.Observable),o.prototype.render=function(){var e=n('<span class="select2-selection" role="combobox" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=i.GetData(this.$element[0],"old-tabindex")?this._tabindex=i.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,i=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===r.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",i),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&i.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,i){function r(){r.__super__.constructor.apply(this,arguments)}return n.Extend(r,t),r.prototype.render=function(){var e=r.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),e},r.prototype.bind=function(t,e){var n=this;r.__super__.bind.apply(this,arguments);var i=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",i).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",i),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return e("<span></span>")},r.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),i=this.display(t,n);n.empty().append(i);var r=t.title||t.text;r?n.attr("title",r):n.removeAttr("title")}else this.clear()},r}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(r,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('<ul class="select2-selection__rendered"></ul>'),e},n.prototype.bind=function(e,t){var i=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){i.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!i.isDisabled()){var t=r(this).parent(),n=l.GetData(t[0],"data");i.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return r('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">×</span></li>')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n<e.length;n++){var i=e[n],r=this.selectionContainer(),o=this.display(i,r);r.append(o);var s=i.title||i.text;s&&r.attr("title",s),l.StoreData(r[0],"data",i),t.push(r)}var a=this.$selection.find(".select2-selection__rendered");l.appendMany(a,t)}},n}),e.define("select2/selection/placeholder",["../utils"],function(e){function t(e,t,n){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n)}return t.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},t.prototype.createPlaceholder=function(e,t){var n=this.selectionContainer();return n.html(this.display(t)),n.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),n},t.prototype.update=function(e,t){var n=1==t.length&&t[0].id!=this.placeholder.id;if(1<t.length||n)return e.call(this,t);this.clear();var i=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(i)},t}),e.define("select2/selection/allowClear",["jquery","../keys","../utils"],function(r,i,a){function e(){}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(e){i._handleClear(e)}),t.on("keypress",function(e){i._handleKeyboardClear(e,t)})},e.prototype._handleClear=function(e,t){if(!this.isDisabled()){var n=this.$selection.find(".select2-selection__clear");if(0!==n.length){t.stopPropagation();var i=a.GetData(n[0],"data"),r=this.$element.val();this.$element.val(this.placeholder.id);var o={data:i};if(this.trigger("clear",o),o.prevented)this.$element.val(r);else{for(var s=0;s<i.length;s++)if(o={data:i[s]},this.trigger("unselect",o),o.prevented)return void this.$element.val(r);this.$element.trigger("input").trigger("change"),this.trigger("toggle",{})}}}},e.prototype._handleKeyboardClear=function(e,t,n){n.isOpen()||t.which!=i.DELETE&&t.which!=i.BACKSPACE||this._handleClear(t)},e.prototype.update=function(e,t){if(e.call(this,t),!(0<this.$selection.find(".select2-selection__placeholder").length||0===t.length)){var n=this.options.get("translations").get("removeAllItems"),i=r('<span class="select2-selection__clear" title="'+n()+'">×</span>');a.StoreData(i[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(i)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(i,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=i('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" /></li>');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),t.on("open",function(){i.$search.attr("aria-controls",r),i.$search.trigger("focus")}),t.on("close",function(){i.$search.val(""),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.trigger("focus")}),t.on("enable",function(){i.$search.prop("disabled",!1),i._transferTabIndex()}),t.on("disable",function(){i.$search.prop("disabled",!0)}),t.on("focus",function(e){i.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){i.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){i._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===i.$search.val()){var t=i.$searchContainer.prev(".select2-selection__choice");if(0<t.length){var n=a.GetData(t[0],"data");i.searchRemoveChoice(n),e.preventDefault()}}}),this.$selection.on("click",".select2-search--inline",function(e){i.$search.val()&&e.stopPropagation()});var o=document.documentMode,s=o&&o<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){s?i.$selection.off("input.search input.searchcheck"):i.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){if(s&&"input"===e.type)i.$selection.off("input.search input.searchcheck");else{var t=e.which;t!=l.SHIFT&&t!=l.CTRL&&t!=l.ALT&&t!=l.TAB&&i.handleSearch(e)}})},e.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},e.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},e.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),n&&this.$search.trigger("focus")},e.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var e=this.$search.val();this.trigger("query",{term:e})}this._keyUpPrevented=!1},e.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},e.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="";""!==this.$search.attr("placeholder")?e=this.$selection.find(".select2-selection__rendered").width():e=.75*(this.$search.val().length+1)+"em";this.$search.css("width",e)},e}),e.define("select2/selection/eventRelay",["jquery"],function(s){function e(){}return e.prototype.bind=function(e,t,n){var i=this,r=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],o=["opening","closing","selecting","unselecting","clearing"];e.call(this,t,n),t.on("*",function(e,t){if(-1!==s.inArray(e,r)){t=t||{};var n=s.Event("select2:"+e,{params:t});i.$element.trigger(n),-1!==s.inArray(e,o)&&(t.prevented=n.isDefaultPrevented())}})},e}),e.define("select2/translation",["jquery","require"],function(t,n){function i(e){this.dict=e||{}}return i.prototype.all=function(){return this.dict},i.prototype.get=function(e){return this.dict[e]},i.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},i._cache={},i.loadPath=function(e){if(!(e in i._cache)){var t=n(e);i._cache[e]=t}return new i(i._cache[e])},i}),e.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Œ":"OE","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","œ":"oe","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ώ":"ω","ς":"σ","’":"'"}}),e.define("select2/data/base",["../utils"],function(i){function n(e,t){n.__super__.constructor.call(this)}return i.Extend(n,i.Observable),n.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},n.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},n.prototype.bind=function(e,t){},n.prototype.destroy=function(){},n.prototype.generateResultId=function(e,t){var n=e.id+"-result-";return n+=i.generateChars(4),null!=t.id?n+="-"+t.id.toString():n+="-"+i.generateChars(4),n},n}),e.define("select2/data/select",["./base","../utils","jquery"],function(e,a,l){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return a.Extend(n,e),n.prototype.current=function(e){var n=[],i=this;this.$element.find(":selected").each(function(){var e=l(this),t=i.item(e);n.push(t)}),e(n)},n.prototype.select=function(r){var o=this;if(r.selected=!0,l(r.element).is("option"))return r.element.selected=!0,void this.$element.trigger("input").trigger("change");if(this.$element.prop("multiple"))this.current(function(e){var t=[];(r=[r]).push.apply(r,e);for(var n=0;n<r.length;n++){var i=r[n].id;-1===l.inArray(i,t)&&t.push(i)}o.$element.val(t),o.$element.trigger("input").trigger("change")});else{var e=r.id;this.$element.val(e),this.$element.trigger("input").trigger("change")}},n.prototype.unselect=function(r){var o=this;if(this.$element.prop("multiple")){if(r.selected=!1,l(r.element).is("option"))return r.element.selected=!1,void this.$element.trigger("input").trigger("change");this.current(function(e){for(var t=[],n=0;n<e.length;n++){var i=e[n].id;i!==r.id&&-1===l.inArray(i,t)&&t.push(i)}o.$element.val(t),o.$element.trigger("input").trigger("change")})}},n.prototype.bind=function(e,t){var n=this;(this.container=e).on("select",function(e){n.select(e.data)}),e.on("unselect",function(e){n.unselect(e.data)})},n.prototype.destroy=function(){this.$element.find("*").each(function(){a.RemoveData(this)})},n.prototype.query=function(i,e){var r=[],o=this;this.$element.children().each(function(){var e=l(this);if(e.is("option")||e.is("optgroup")){var t=o.item(e),n=o.matches(i,t);null!==n&&r.push(n)}}),e({results:r})},n.prototype.addOptions=function(e){a.appendMany(this.$element,e)},n.prototype.option=function(e){var t;e.children?(t=document.createElement("optgroup")).label=e.text:void 0!==(t=document.createElement("option")).textContent?t.textContent=e.text:t.innerText=e.text,void 0!==e.id&&(t.value=e.id),e.disabled&&(t.disabled=!0),e.selected&&(t.selected=!0),e.title&&(t.title=e.title);var n=l(t),i=this._normalizeItem(e);return i.element=t,a.StoreData(t,"data",i),n},n.prototype.item=function(e){var t={};if(null!=(t=a.GetData(e[0],"data")))return t;if(e.is("option"))t={id:e.val(),text:e.text(),disabled:e.prop("disabled"),selected:e.prop("selected"),title:e.prop("title")};else if(e.is("optgroup")){t={text:e.prop("label"),children:[],title:e.prop("title")};for(var n=e.children("option"),i=[],r=0;r<n.length;r++){var o=l(n[r]),s=this.item(o);i.push(s)}t.children=i}return(t=this._normalizeItem(t)).element=e[0],a.StoreData(e[0],"data",t),t},n.prototype._normalizeItem=function(e){e!==Object(e)&&(e={id:e,text:e});return null!=(e=l.extend({},{text:""},e)).id&&(e.id=e.id.toString()),null!=e.text&&(e.text=e.text.toString()),null==e._resultId&&e.id&&null!=this.container&&(e._resultId=this.generateResultId(this.container,e)),l.extend({},{selected:!1,disabled:!1},e)},n.prototype.matches=function(e,t){return this.options.get("matcher")(e,t)},n}),e.define("select2/data/array",["./select","../utils","jquery"],function(e,f,g){function i(e,t){this._dataToConvert=t.get("data")||[],i.__super__.constructor.call(this,e,t)}return f.Extend(i,e),i.prototype.bind=function(e,t){i.__super__.bind.call(this,e,t),this.addOptions(this.convertToOptions(this._dataToConvert))},i.prototype.select=function(n){var e=this.$element.find("option").filter(function(e,t){return t.value==n.id.toString()});0===e.length&&(e=this.option(n),this.addOptions(e)),i.__super__.select.call(this,n)},i.prototype.convertToOptions=function(e){var t=this,n=this.$element.find("option"),i=n.map(function(){return t.item(g(this)).id}).get(),r=[];function o(e){return function(){return g(this).val()==e.id}}for(var s=0;s<e.length;s++){var a=this._normalizeItem(e[s]);if(0<=g.inArray(a.id,i)){var l=n.filter(o(a)),c=this.item(l),u=g.extend(!0,{},a,c),d=this.option(u);l.replaceWith(d)}else{var p=this.option(a);if(a.children){var h=this.convertToOptions(a.children);f.appendMany(p,h)}r.push(p)}}return r},i}),e.define("select2/data/ajax",["./array","../utils","jquery"],function(e,t,o){function n(e,t){this.ajaxOptions=this._applyDefaults(t.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),n.__super__.constructor.call(this,e,t)}return t.Extend(n,e),n.prototype._applyDefaults=function(e){var t={data:function(e){return o.extend({},e,{q:e.term})},transport:function(e,t,n){var i=o.ajax(e);return i.then(t),i.fail(n),i}};return o.extend({},t,e,!0)},n.prototype.processResults=function(e){return e},n.prototype.query=function(n,i){var r=this;null!=this._request&&(o.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var t=o.extend({type:"GET"},this.ajaxOptions);function e(){var e=t.transport(t,function(e){var t=r.processResults(e,n);r.options.get("debug")&&window.console&&console.error&&(t&&t.results&&o.isArray(t.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),i(t)},function(){"status"in e&&(0===e.status||"0"===e.status)||r.trigger("results:message",{message:"errorLoading"})});r._request=e}"function"==typeof t.url&&(t.url=t.url.call(this.$element,n)),"function"==typeof t.data&&(t.data=t.data.call(this.$element,n)),this.ajaxOptions.delay&&null!=n.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(e,this.ajaxOptions.delay)):e()},n}),e.define("select2/data/tags",["jquery"],function(u){function e(e,t,n){var i=n.get("tags"),r=n.get("createTag");void 0!==r&&(this.createTag=r);var o=n.get("insertTag");if(void 0!==o&&(this.insertTag=o),e.call(this,t,n),u.isArray(i))for(var s=0;s<i.length;s++){var a=i[s],l=this._normalizeItem(a),c=this.option(l);this.$element.append(c)}}return e.prototype.query=function(e,c,u){var d=this;this._removeOldTags(),null!=c.term&&null==c.page?e.call(this,c,function e(t,n){for(var i=t.results,r=0;r<i.length;r++){var o=i[r],s=null!=o.children&&!e({results:o.children},!0);if((o.text||"").toUpperCase()===(c.term||"").toUpperCase()||s)return!n&&(t.data=i,void u(t))}if(n)return!0;var a=d.createTag(c);if(null!=a){var l=d.option(a);l.attr("data-select2-tag",!0),d.addOptions([l]),d.insertTag(i,a)}t.results=i,u(t)}):e.call(this,c,u)},e.prototype.createTag=function(e,t){var n=u.trim(t.term);return""===n?null:{id:n,text:n}},e.prototype.insertTag=function(e,t,n){t.unshift(n)},e.prototype._removeOldTags=function(e){this.$element.find("option[data-select2-tag]").each(function(){this.selected||u(this).remove()})},e}),e.define("select2/data/tokenizer",["jquery"],function(d){function e(e,t,n){var i=n.get("tokenizer");void 0!==i&&(this.tokenizer=i),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){e.call(this,t,n),this.$search=t.dropdown.$search||t.selection.$search||n.find(".select2-search__field")},e.prototype.query=function(e,t,n){var i=this;t.term=t.term||"";var r=this.tokenizer(t,this.options,function(e){var t=i._normalizeItem(e);if(!i.$element.find("option").filter(function(){return d(this).val()===t.id}).length){var n=i.option(t);n.attr("data-select2-tag",!0),i._removeOldTags(),i.addOptions([n])}!function(e){i.trigger("select",{data:e})}(t)});r.term!==t.term&&(this.$search.length&&(this.$search.val(r.term),this.$search.trigger("focus")),t.term=r.term),e.call(this,t,n)},e.prototype.tokenizer=function(e,t,n,i){for(var r=n.get("tokenSeparators")||[],o=t.term,s=0,a=this.createTag||function(e){return{id:e.term,text:e.term}};s<o.length;){var l=o[s];if(-1!==d.inArray(l,r)){var c=o.substr(0,s),u=a(d.extend({},t,{term:c}));null!=u?(i(u),o=o.substr(s+1)||"",s=0):s++}else s++}return{term:o}},e}),e.define("select2/data/minimumInputLength",[],function(){function e(e,t,n){this.minimumInputLength=n.get("minimumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",t.term.length<this.minimumInputLength?this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumInputLength",[],function(){function e(e,t,n){this.maximumInputLength=n.get("maximumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",0<this.maximumInputLength&&t.term.length>this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("select",function(){i._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var i=this;this._checkIfMaximumSelected(function(){e.call(i,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var i=this;this.current(function(e){var t=null!=e?e.length:0;0<i.maximumSelectionLength&&t>=i.maximumSelectionLength?i.trigger("results:message",{message:"maximumSelected",args:{maximum:i.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('<span class="select2-dropdown"><span class="select2-results"></span></span>');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" /></span>');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){i.handleSearch(e)}),t.on("open",function(){i.$search.attr("tabindex",0),i.$search.attr("aria-controls",r),i.$search.trigger("focus"),window.setTimeout(function(){i.$search.trigger("focus")},0)}),t.on("close",function(){i.$search.attr("tabindex",-1),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.val(""),i.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||i.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(i.showSearch(e)?i.$searchContainer.removeClass("select2-search--hide"):i.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,i){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,i)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),i=t.length-1;0<=i;i--){var r=t[i];this.placeholder.id===r.id&&n.splice(i,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,i){this.lastParams={},e.call(this,t,n,i),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("query",function(e){i.lastParams=e,i.loading=!0}),t.on("query:append",function(e){i.lastParams=e,i.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('<li class="select2-results__option select2-results__option--load-more"role="option" aria-disabled="true"></li>'),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("open",function(){i._showDropdown(),i._attachPositioningHandler(t),i._bindContainerResultHandlers(t)}),t.on("close",function(){i._hideDropdown(),i._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f("<span></span>"),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,i="scroll.select2."+t.id,r="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(i,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(i+" "+r+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+i+" "+r)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),i=null,r=this.$container.offset();r.bottom=r.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=r.top,o.bottom=r.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=a<r.top-s,u=l>r.bottom+s,d={left:r.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(i="below"),u||!c||t?!c&&u&&t&&(i="below"):i="above",("above"==i||t&&"below"!==i)&&(d.top=o.top-h.top-s),null!=i&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+i),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+i)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,i){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,i)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,i=0;i<t.length;i++){var r=t[i];r.children?n+=e(r.children):n++}return n}(t.data.results)<this.minimumResultsForSearch)&&e.call(this,t)},e}),e.define("select2/dropdown/selectOnClose",["../utils"],function(o){function e(){}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("close",function(e){i._handleSelectOnClose(e)})},e.prototype._handleSelectOnClose=function(e,t){if(t&&null!=t.originalSelect2Event){var n=t.originalSelect2Event;if("select"===n._type||"unselect"===n._type)return}var i=this.getHighlightedResults();if(!(i.length<1)){var r=o.GetData(i[0],"data");null!=r.element&&r.element.selected||null==r.element&&r.selected||this.trigger("select",{data:r})}},e}),e.define("select2/dropdown/closeOnSelect",[],function(){function e(){}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("select",function(e){i._selectTriggered(e)}),t.on("unselect",function(e){i._selectTriggered(e)})},e.prototype._selectTriggered=function(e,t){var n=t.originalEvent;n&&(n.ctrlKey||n.metaKey)||this.trigger("close",{originalEvent:n,originalSelect2Event:t})},e}),e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return 1!=t&&(n+="s"),n},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return 1!=e.maximum&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(c,u,d,p,h,f,g,m,v,y,s,t,_,w,$,b,A,x,D,S,C,E,O,T,q,j,L,I,e){function n(){this.reset()}return n.prototype.apply=function(e){if(null==(e=c.extend(!0,{},this.defaults,e)).dataAdapter){if(null!=e.ajax?e.dataAdapter=$:null!=e.data?e.dataAdapter=w:e.dataAdapter=_,0<e.minimumInputLength&&(e.dataAdapter=y.Decorate(e.dataAdapter,x)),0<e.maximumInputLength&&(e.dataAdapter=y.Decorate(e.dataAdapter,D)),0<e.maximumSelectionLength&&(e.dataAdapter=y.Decorate(e.dataAdapter,S)),e.tags&&(e.dataAdapter=y.Decorate(e.dataAdapter,b)),null==e.tokenSeparators&&null==e.tokenizer||(e.dataAdapter=y.Decorate(e.dataAdapter,A)),null!=e.query){var t=u(e.amdBase+"compat/query");e.dataAdapter=y.Decorate(e.dataAdapter,t)}if(null!=e.initSelection){var n=u(e.amdBase+"compat/initSelection");e.dataAdapter=y.Decorate(e.dataAdapter,n)}}if(null==e.resultsAdapter&&(e.resultsAdapter=d,null!=e.ajax&&(e.resultsAdapter=y.Decorate(e.resultsAdapter,T)),null!=e.placeholder&&(e.resultsAdapter=y.Decorate(e.resultsAdapter,O)),e.selectOnClose&&(e.resultsAdapter=y.Decorate(e.resultsAdapter,L))),null==e.dropdownAdapter){if(e.multiple)e.dropdownAdapter=C;else{var i=y.Decorate(C,E);e.dropdownAdapter=i}if(0!==e.minimumResultsForSearch&&(e.dropdownAdapter=y.Decorate(e.dropdownAdapter,j)),e.closeOnSelect&&(e.dropdownAdapter=y.Decorate(e.dropdownAdapter,I)),null!=e.dropdownCssClass||null!=e.dropdownCss||null!=e.adaptDropdownCssClass){var r=u(e.amdBase+"compat/dropdownCss");e.dropdownAdapter=y.Decorate(e.dropdownAdapter,r)}e.dropdownAdapter=y.Decorate(e.dropdownAdapter,q)}if(null==e.selectionAdapter){if(e.multiple?e.selectionAdapter=h:e.selectionAdapter=p,null!=e.placeholder&&(e.selectionAdapter=y.Decorate(e.selectionAdapter,f)),e.allowClear&&(e.selectionAdapter=y.Decorate(e.selectionAdapter,g)),e.multiple&&(e.selectionAdapter=y.Decorate(e.selectionAdapter,m)),null!=e.containerCssClass||null!=e.containerCss||null!=e.adaptContainerCssClass){var o=u(e.amdBase+"compat/containerCss");e.selectionAdapter=y.Decorate(e.selectionAdapter,o)}e.selectionAdapter=y.Decorate(e.selectionAdapter,v)}e.language=this._resolveLanguage(e.language),e.language.push("en");for(var s=[],a=0;a<e.language.length;a++){var l=e.language[a];-1===s.indexOf(l)&&s.push(l)}return e.language=s,e.translations=this._processTranslations(e.language,e.debug),e},n.prototype.reset=function(){function a(e){return e.replace(/[^\u0000-\u007E]/g,function(e){return t[e]||e})}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:y.escapeMarkup,language:{},matcher:function e(t,n){if(""===c.trim(t.term))return n;if(n.children&&0<n.children.length){for(var i=c.extend(!0,{},n),r=n.children.length-1;0<=r;r--)null==e(t,n.children[r])&&i.children.splice(r,1);return 0<i.children.length?i:e(t,i)}var o=a(n.text).toUpperCase(),s=a(t.term).toUpperCase();return-1<o.indexOf(s)?n:null},minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,scrollAfterSelect:!1,sorter:function(e){return e},templateResult:function(e){return e.text},templateSelection:function(e){return e.text},theme:"default",width:"resolve"}},n.prototype.applyFromElement=function(e,t){var n=e.language,i=this.defaults.language,r=t.prop("lang"),o=t.closest("[lang]").prop("lang"),s=Array.prototype.concat.call(this._resolveLanguage(r),this._resolveLanguage(n),this._resolveLanguage(i),this._resolveLanguage(o));return e.language=s,e},n.prototype._resolveLanguage=function(e){if(!e)return[];if(c.isEmptyObject(e))return[];if(c.isPlainObject(e))return[e];var t;t=c.isArray(e)?e:[e];for(var n=[],i=0;i<t.length;i++)if(n.push(t[i]),"string"==typeof t[i]&&0<t[i].indexOf("-")){var r=t[i].split("-")[0];n.push(r)}return n},n.prototype._processTranslations=function(e,t){for(var n=new s,i=0;i<e.length;i++){var r=new s,o=e[i];if("string"==typeof o)try{r=s.loadPath(o)}catch(e){try{o=this.defaults.amdLanguageBase+o,r=s.loadPath(o)}catch(e){t&&window.console&&console.warn&&console.warn('Select2: The language file for "'+o+'" could not be automatically loaded. A fallback will be used instead.')}}else r=c.isPlainObject(o)?new s(o):o;n.extend(r)}return n},n.prototype.set=function(e,t){var n={};n[c.camelCase(e)]=t;var i=y._convertData(n);c.extend(!0,this.defaults,i)},new n}),e.define("select2/options",["require","jquery","./defaults","./utils"],function(i,d,r,p){function e(e,t){if(this.options=e,null!=t&&this.fromElement(t),null!=t&&(this.options=r.applyFromElement(this.options,t)),this.options=r.apply(this.options),t&&t.is("input")){var n=i(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=p.Decorate(this.options.dataAdapter,n)}}return e.prototype.fromElement=function(e){var t=["select2"];null==this.options.multiple&&(this.options.multiple=e.prop("multiple")),null==this.options.disabled&&(this.options.disabled=e.prop("disabled")),null==this.options.dir&&(e.prop("dir")?this.options.dir=e.prop("dir"):e.closest("[dir]").prop("dir")?this.options.dir=e.closest("[dir]").prop("dir"):this.options.dir="ltr"),e.prop("disabled",this.options.disabled),e.prop("multiple",this.options.multiple),p.GetData(e[0],"select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),p.StoreData(e[0],"data",p.GetData(e[0],"select2Tags")),p.StoreData(e[0],"tags",!0)),p.GetData(e[0],"ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),e.attr("ajax--url",p.GetData(e[0],"ajaxUrl")),p.StoreData(e[0],"ajax-Url",p.GetData(e[0],"ajaxUrl")));var n={};function i(e,t){return t.toUpperCase()}for(var r=0;r<e[0].attributes.length;r++){var o=e[0].attributes[r].name,s="data-";if(o.substr(0,s.length)==s){var a=o.substring(s.length),l=p.GetData(e[0],a);n[a.replace(/-([a-z])/g,i)]=l}}d.fn.jquery&&"1."==d.fn.jquery.substr(0,2)&&e[0].dataset&&(n=d.extend(!0,{},e[0].dataset,n));var c=d.extend(!0,{},p.GetData(e[0]),n);for(var u in c=p._convertData(c))-1<d.inArray(u,t)||(d.isPlainObject(this.options[u])?d.extend(this.options[u],c[u]):this.options[u]=c[u]);return this},e.prototype.get=function(e){return this.options[e]},e.prototype.set=function(e,t){this.options[e]=t},e}),e.define("select2/core",["jquery","./options","./utils","./keys"],function(o,c,u,i){var d=function(e,t){null!=u.GetData(e[0],"select2")&&u.GetData(e[0],"select2").destroy(),this.$element=e,this.id=this._generateId(e),t=t||{},this.options=new c(t,e),d.__super__.constructor.call(this);var n=e.attr("tabindex")||0;u.StoreData(e[0],"old-tabindex",n),e.attr("tabindex","-1");var i=this.options.get("dataAdapter");this.dataAdapter=new i(e,this.options);var r=this.render();this._placeContainer(r);var o=this.options.get("selectionAdapter");this.selection=new o(e,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,r);var s=this.options.get("dropdownAdapter");this.dropdown=new s(e,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,r);var a=this.options.get("resultsAdapter");this.results=new a(e,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var l=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(e){l.trigger("selection:update",{data:e})}),e.addClass("select2-hidden-accessible"),e.attr("aria-hidden","true"),this._syncAttributes(),u.StoreData(e[0],"select2",this),e.data("select2",this)};return u.Extend(d,u.Observable),d.prototype._generateId=function(e){return"select2-"+(null!=e.attr("id")?e.attr("id"):null!=e.attr("name")?e.attr("name")+"-"+u.generateChars(2):u.generateChars(4)).replace(/(:|\.|\[|\]|,)/g,"")},d.prototype._placeContainer=function(e){e.insertAfter(this.$element);var t=this._resolveWidth(this.$element,this.options.get("width"));null!=t&&e.css("width",t)},d.prototype._resolveWidth=function(e,t){var n=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==t){var i=this._resolveWidth(e,"style");return null!=i?i:this._resolveWidth(e,"element")}if("element"==t){var r=e.outerWidth(!1);return r<=0?"auto":r+"px"}if("style"!=t)return"computedstyle"!=t?t:window.getComputedStyle(e[0]).width;var o=e.attr("style");if("string"!=typeof o)return null;for(var s=o.split(";"),a=0,l=s.length;a<l;a+=1){var c=s[a].replace(/\s/g,"").match(n);if(null!==c&&1<=c.length)return c[1]}return null},d.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},d.prototype._registerDomEvents=function(){var t=this;this.$element.on("change.select2",function(){t.dataAdapter.current(function(e){t.trigger("selection:update",{data:e})})}),this.$element.on("focus.select2",function(e){t.trigger("focus",e)}),this._syncA=u.bind(this._syncAttributes,this),this._syncS=u.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var e=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=e?(this._observer=new e(function(e){t._syncA(),t._syncS(null,e)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",t._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",t._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",t._syncS,!1))},d.prototype._registerDataEvents=function(){var n=this;this.dataAdapter.on("*",function(e,t){n.trigger(e,t)})},d.prototype._registerSelectionEvents=function(){var n=this,i=["toggle","focus"];this.selection.on("toggle",function(){n.toggleDropdown()}),this.selection.on("focus",function(e){n.focus(e)}),this.selection.on("*",function(e,t){-1===o.inArray(e,i)&&n.trigger(e,t)})},d.prototype._registerDropdownEvents=function(){var n=this;this.dropdown.on("*",function(e,t){n.trigger(e,t)})},d.prototype._registerResultsEvents=function(){var n=this;this.results.on("*",function(e,t){n.trigger(e,t)})},d.prototype._registerEvents=function(){var n=this;this.on("open",function(){n.$container.addClass("select2-container--open")}),this.on("close",function(){n.$container.removeClass("select2-container--open")}),this.on("enable",function(){n.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){n.$container.addClass("select2-container--disabled")}),this.on("blur",function(){n.$container.removeClass("select2-container--focus")}),this.on("query",function(t){n.isOpen()||n.trigger("open",{}),this.dataAdapter.query(t,function(e){n.trigger("results:all",{data:e,query:t})})}),this.on("query:append",function(t){this.dataAdapter.query(t,function(e){n.trigger("results:append",{data:e,query:t})})}),this.on("keypress",function(e){var t=e.which;n.isOpen()?t===i.ESC||t===i.TAB||t===i.UP&&e.altKey?(n.close(e),e.preventDefault()):t===i.ENTER?(n.trigger("results:select",{}),e.preventDefault()):t===i.SPACE&&e.ctrlKey?(n.trigger("results:toggle",{}),e.preventDefault()):t===i.UP?(n.trigger("results:previous",{}),e.preventDefault()):t===i.DOWN&&(n.trigger("results:next",{}),e.preventDefault()):(t===i.ENTER||t===i.SPACE||t===i.DOWN&&e.altKey)&&(n.open(),e.preventDefault())})},d.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.isDisabled()?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},d.prototype._isChangeMutation=function(e,t){var n=!1,i=this;if(!e||!e.target||"OPTION"===e.target.nodeName||"OPTGROUP"===e.target.nodeName){if(t)if(t.addedNodes&&0<t.addedNodes.length)for(var r=0;r<t.addedNodes.length;r++){t.addedNodes[r].selected&&(n=!0)}else t.removedNodes&&0<t.removedNodes.length?n=!0:o.isArray(t)&&o.each(t,function(e,t){if(i._isChangeMutation(e,t))return!(n=!0)});else n=!0;return n}},d.prototype._syncSubtree=function(e,t){var n=this._isChangeMutation(e,t),i=this;n&&this.dataAdapter.current(function(e){i.trigger("selection:update",{data:e})})},d.prototype.trigger=function(e,t){var n=d.__super__.trigger,i={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(void 0===t&&(t={}),e in i){var r=i[e],o={prevented:!1,name:e,args:t};if(n.call(this,r,o),o.prevented)return void(t.prevented=!0)}n.call(this,e,t)},d.prototype.toggleDropdown=function(){this.isDisabled()||(this.isOpen()?this.close():this.open())},d.prototype.open=function(){this.isOpen()||this.isDisabled()||this.trigger("query",{})},d.prototype.close=function(e){this.isOpen()&&this.trigger("close",{originalEvent:e})},d.prototype.isEnabled=function(){return!this.isDisabled()},d.prototype.isDisabled=function(){return this.options.get("disabled")},d.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},d.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},d.prototype.focus=function(e){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},d.prototype.enable=function(e){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=e&&0!==e.length||(e=[!0]);var t=!e[0];this.$element.prop("disabled",t)},d.prototype.data=function(){this.options.get("debug")&&0<arguments.length&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var t=[];return this.dataAdapter.current(function(e){t=e}),t},d.prototype.val=function(e){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==e||0===e.length)return this.$element.val();var t=e[0];o.isArray(t)&&(t=o.map(t,function(e){return e.toString()})),this.$element.val(t).trigger("input").trigger("change")},d.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",u.GetData(this.$element[0],"old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),u.RemoveData(this.$element[0]),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},d.prototype.render=function(){var e=o('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("select2/compat/utils",["jquery"],function(s){return{syncCssClasses:function(e,t,n){var i,r,o=[];(i=s.trim(e.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0===this.indexOf("select2-")&&o.push(this)}),(i=s.trim(t.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&null!=(r=n(this))&&o.push(r)}),e.attr("class",o.join(" "))}}}),e.define("select2/compat/containerCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("containerCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptContainerCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("containerCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/dropdownCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("dropdownCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptDropdownCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("dropdownCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/initSelection",["jquery"],function(i){function e(e,t,n){n.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=n.get("initSelection"),this._isInitialized=!1,e.call(this,t,n)}return e.prototype.current=function(e,t){var n=this;this._isInitialized?e.call(this,t):this.initSelection.call(null,this.$element,function(e){n._isInitialized=!0,i.isArray(e)||(e=[e]),t(e)})},e}),e.define("select2/compat/inputData",["jquery","../utils"],function(s,i){function e(e,t,n){this._currentData=[],this._valueSeparator=n.get("valueSeparator")||",","hidden"===t.prop("type")&&n.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead."),e.call(this,t,n)}return e.prototype.current=function(e,t){function i(e,t){var n=[];return e.selected||-1!==s.inArray(e.id,t)?(e.selected=!0,n.push(e)):e.selected=!1,e.children&&n.push.apply(n,i(e.children,t)),n}for(var n=[],r=0;r<this._currentData.length;r++){var o=this._currentData[r];n.push.apply(n,i(o,this.$element.val().split(this._valueSeparator)))}t(n)},e.prototype.select=function(e,t){if(this.options.get("multiple")){var n=this.$element.val();n+=this._valueSeparator+t.id,this.$element.val(n),this.$element.trigger("input").trigger("change")}else this.current(function(e){s.map(e,function(e){e.selected=!1})}),this.$element.val(t.id),this.$element.trigger("input").trigger("change")},e.prototype.unselect=function(e,r){var o=this;r.selected=!1,this.current(function(e){for(var t=[],n=0;n<e.length;n++){var i=e[n];r.id!=i.id&&t.push(i.id)}o.$element.val(t.join(o._valueSeparator)),o.$element.trigger("input").trigger("change")})},e.prototype.query=function(e,t,n){for(var i=[],r=0;r<this._currentData.length;r++){var o=this._currentData[r],s=this.matches(t,o);null!==s&&i.push(s)}n({results:i})},e.prototype.addOptions=function(e,t){var n=s.map(t,function(e){return i.GetData(e[0],"data")});this._currentData.push.apply(this._currentData,n)},e}),e.define("select2/compat/matcher",["jquery"],function(s){return function(o){return function(e,t){var n=s.extend(!0,{},t);if(null==e.term||""===s.trim(e.term))return n;if(t.children){for(var i=t.children.length-1;0<=i;i--){var r=t.children[i];o(e.term,r.text,r)||n.children.splice(i,1)}if(0<n.children.length)return n}return o(e.term,t.text,t)?n:null}}}),e.define("select2/compat/query",[],function(){function e(e,t,n){n.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2."),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.callback=n,this.options.get("query").call(null,t)},e}),e.define("select2/dropdown/attachContainer",[],function(){function e(e,t,n){e.call(this,t,n)}return e.prototype.position=function(e,t,n){n.find(".dropdown-wrapper").append(t),t.addClass("select2-dropdown--below"),n.addClass("select2-container--below")},e}),e.define("select2/dropdown/stopPropagation",[],function(){function e(){}return e.prototype.bind=function(e,t,n){e.call(this,t,n);this.$dropdown.on(["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"].join(" "),function(e){e.stopPropagation()})},e}),e.define("select2/selection/stopPropagation",[],function(){function e(){}return e.prototype.bind=function(e,t,n){e.call(this,t,n);this.$selection.on(["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"].join(" "),function(e){e.stopPropagation()})},e}),l=function(p){var h,f,e=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],t="onwheel"in document||9<=document.documentMode?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],g=Array.prototype.slice;if(p.event.fixHooks)for(var n=e.length;n;)p.event.fixHooks[e[--n]]=p.event.mouseHooks;var m=p.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var e=t.length;e;)this.addEventListener(t[--e],i,!1);else this.onmousewheel=i;p.data(this,"mousewheel-line-height",m.getLineHeight(this)),p.data(this,"mousewheel-page-height",m.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var e=t.length;e;)this.removeEventListener(t[--e],i,!1);else this.onmousewheel=null;p.removeData(this,"mousewheel-line-height"),p.removeData(this,"mousewheel-page-height")},getLineHeight:function(e){var t=p(e),n=t["offsetParent"in p.fn?"offsetParent":"parent"]();return n.length||(n=p("body")),parseInt(n.css("fontSize"),10)||parseInt(t.css("fontSize"),10)||16},getPageHeight:function(e){return p(e).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};function i(e){var t,n=e||window.event,i=g.call(arguments,1),r=0,o=0,s=0,a=0,l=0;if((e=p.event.fix(n)).type="mousewheel","detail"in n&&(s=-1*n.detail),"wheelDelta"in n&&(s=n.wheelDelta),"wheelDeltaY"in n&&(s=n.wheelDeltaY),"wheelDeltaX"in n&&(o=-1*n.wheelDeltaX),"axis"in n&&n.axis===n.HORIZONTAL_AXIS&&(o=-1*s,s=0),r=0===s?o:s,"deltaY"in n&&(r=s=-1*n.deltaY),"deltaX"in n&&(o=n.deltaX,0===s&&(r=-1*o)),0!==s||0!==o){if(1===n.deltaMode){var c=p.data(this,"mousewheel-line-height");r*=c,s*=c,o*=c}else if(2===n.deltaMode){var u=p.data(this,"mousewheel-page-height");r*=u,s*=u,o*=u}if(t=Math.max(Math.abs(s),Math.abs(o)),(!f||t<f)&&y(n,f=t)&&(f/=40),y(n,t)&&(r/=40,o/=40,s/=40),r=Math[1<=r?"floor":"ceil"](r/f),o=Math[1<=o?"floor":"ceil"](o/f),s=Math[1<=s?"floor":"ceil"](s/f),m.settings.normalizeOffset&&this.getBoundingClientRect){var d=this.getBoundingClientRect();a=e.clientX-d.left,l=e.clientY-d.top}return e.deltaX=o,e.deltaY=s,e.deltaFactor=f,e.offsetX=a,e.offsetY=l,e.deltaMode=0,i.unshift(e,r,o,s),h&&clearTimeout(h),h=setTimeout(v,200),(p.event.dispatch||p.event.handle).apply(this,i)}}function v(){f=null}function y(e,t){return m.settings.adjustOldDeltas&&"mousewheel"===e.type&&t%120==0}p.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})},"function"==typeof e.define&&e.define.amd?e.define("jquery-mousewheel",["jquery"],l):"object"==typeof exports?module.exports=l:l(d),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(r,e,o,t,s){if(null==r.fn.select2){var a=["open","close","destroy"];r.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=r.extend(!0,{},t);new o(r(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,i=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,i)}),-1<r.inArray(t,a)?this:n}}return null==r.fn.select2.defaults&&(r.fn.select2.defaults=t),o}),{define:e.define,require:e.require}}(),t=e.require("jquery.select2");return d.fn.select2.amd=e,t}); \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt deleted file mode 100644 index 4d80338..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2007-present Steven Levithan <http://xregexp.com/> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js deleted file mode 100644 index 215482c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js +++ /dev/null @@ -1,6126 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.XRegExp = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ -"use strict"; - -var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice"); - -var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from"); - -var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol"); - -var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method"); - -var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array"); - -var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - -var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); - -_Object$defineProperty(exports, "__esModule", { - value: true -}); - -exports["default"] = void 0; - -var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray")); - -var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each")); - -var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat")); - -var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of")); - -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } - -function _unsupportedIterableToArray(o, minLen) { var _context4; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context4 = Object.prototype.toString.call(o)).call(_context4, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -/*! - * XRegExp Unicode Base 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2008-present MIT License - */ -var _default = function _default(XRegExp) { - /** - * Adds base support for Unicode matching: - * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or - * `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the - * braces for token names that are a single letter (e.g. `\pL` or `PL`). - * - Adds flag A (astral), which enables 21-bit Unicode support. - * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data. - * - * Unicode Base relies on externally provided Unicode character data. Official addons are - * available to provide data for Unicode categories, scripts, and properties. - * - * @requires XRegExp - */ - // ==--------------------------== - // Private stuff - // ==--------------------------== - // Storage for Unicode data - var unicode = {}; - var unicodeTypes = {}; // Reuse utils - - var dec = XRegExp._dec; - var hex = XRegExp._hex; - var pad4 = XRegExp._pad4; // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed - - function normalize(name) { - return name.replace(/[- _]+/g, '').toLowerCase(); - } // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal - - - function charCode(chr) { - var esc = /^\\[xu](.+)/.exec(chr); - return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\' ? 1 : 0); - } // Inverts a list of ordered BMP characters and ranges - - - function invertBmp(range) { - var output = ''; - var lastEnd = -1; - (0, _forEach["default"])(XRegExp).call(XRegExp, range, /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, function (m) { - var start = charCode(m[1]); - - if (start > lastEnd + 1) { - output += "\\u".concat(pad4(hex(lastEnd + 1))); - - if (start > lastEnd + 2) { - output += "-\\u".concat(pad4(hex(start - 1))); - } - } - - lastEnd = charCode(m[2] || m[1]); - }); - - if (lastEnd < 0xFFFF) { - output += "\\u".concat(pad4(hex(lastEnd + 1))); - - if (lastEnd < 0xFFFE) { - output += '-\\uFFFF'; - } - } - - return output; - } // Generates an inverted BMP range on first use - - - function cacheInvertedBmp(slug) { - var prop = 'b!'; - return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp)); - } // Combines and optionally negates BMP and astral data - - - function buildAstral(slug, isNegated) { - var item = unicode[slug]; - var combined = ''; - - if (item.bmp && !item.isBmpLast) { - var _context; - - combined = (0, _concat["default"])(_context = "[".concat(item.bmp, "]")).call(_context, item.astral ? '|' : ''); - } - - if (item.astral) { - combined += item.astral; - } - - if (item.isBmpLast && item.bmp) { - var _context2; - - combined += (0, _concat["default"])(_context2 = "".concat(item.astral ? '|' : '', "[")).call(_context2, item.bmp, "]"); - } // Astral Unicode tokens always match a code point, never a code unit - - - return isNegated ? "(?:(?!".concat(combined, ")(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))") : "(?:".concat(combined, ")"); - } // Builds a complete astral pattern on first use - - - function cacheAstral(slug, isNegated) { - var prop = isNegated ? 'a!' : 'a='; - return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated)); - } // ==--------------------------== - // Core functionality - // ==--------------------------== - - /* - * Add astral mode (flag A) and Unicode token syntax: `\p{..}`, `\P{..}`, `\p{^..}`, `\pC`. - */ - - - XRegExp.addToken( // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}` - /\\([pP])(?:{(\^?)(?:(\w+)=)?([^}]*)}|([A-Za-z]))/, function (match, scope, flags) { - var ERR_DOUBLE_NEG = 'Invalid double negation '; - var ERR_UNKNOWN_NAME = 'Unknown Unicode token '; - var ERR_UNKNOWN_REF = 'Unicode token missing data '; - var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token '; - var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes'; - - var _match = (0, _slicedToArray2["default"])(match, 6), - fullToken = _match[0], - pPrefix = _match[1], - caretNegation = _match[2], - typePrefix = _match[3], - tokenName = _match[4], - tokenSingleCharName = _match[5]; // Negated via \P{..} or \p{^..} - - - var isNegated = pPrefix === 'P' || !!caretNegation; // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A - - var isAstralMode = (0, _indexOf["default"])(flags).call(flags, 'A') !== -1; // Token lookup name. Check `tokenSingleCharName` first to avoid passing `undefined` - // via `\p{}` - - var slug = normalize(tokenSingleCharName || tokenName); // Token data object - - var item = unicode[slug]; - - if (pPrefix === 'P' && caretNegation) { - throw new SyntaxError(ERR_DOUBLE_NEG + fullToken); - } - - if (!unicode.hasOwnProperty(slug)) { - throw new SyntaxError(ERR_UNKNOWN_NAME + fullToken); - } - - if (typePrefix) { - if (!(unicodeTypes[typePrefix] && unicodeTypes[typePrefix][slug])) { - throw new SyntaxError(ERR_UNKNOWN_NAME + fullToken); - } - } // Switch to the negated form of the referenced Unicode token - - - if (item.inverseOf) { - slug = normalize(item.inverseOf); - - if (!unicode.hasOwnProperty(slug)) { - var _context3; - - throw new ReferenceError((0, _concat["default"])(_context3 = "".concat(ERR_UNKNOWN_REF + fullToken, " -> ")).call(_context3, item.inverseOf)); - } - - item = unicode[slug]; - isNegated = !isNegated; - } - - if (!(item.bmp || isAstralMode)) { - throw new SyntaxError(ERR_ASTRAL_ONLY + fullToken); - } - - if (isAstralMode) { - if (scope === 'class') { - throw new SyntaxError(ERR_ASTRAL_IN_CLASS); - } - - return cacheAstral(slug, isNegated); - } - - return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : "".concat((isNegated ? '[^' : '[') + item.bmp, "]"); - }, { - scope: 'all', - optionalFlags: 'A', - leadChar: '\\' - }); - /** - * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`. - * - * @memberOf XRegExp - * @param {Array} data Objects with named character ranges. Each object may have properties - * `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are - * optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If - * `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent, - * the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are - * provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and - * `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan - * high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and - * `astral` data should be a combination of literal characters and `\xHH` or `\uHHHH` escape - * sequences, with hyphens to create ranges. Any regex metacharacters in the data should be - * escaped, apart from range-creating hyphens. The `astral` data can additionally use - * character classes and alternation, and should use surrogate pairs to represent astral code - * points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is - * defined as the exact inverse of another token. - * @param {String} [typePrefix] Enables optionally using this type as a prefix for all of the - * provided Unicode tokens, e.g. if given `'Type'`, then `\p{TokenName}` can also be written - * as `\p{Type=TokenName}`. - * @example - * - * // Basic use - * XRegExp.addUnicodeData([{ - * name: 'XDigit', - * alias: 'Hexadecimal', - * bmp: '0-9A-Fa-f' - * }]); - * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true - */ - - XRegExp.addUnicodeData = function (data, typePrefix) { - var ERR_NO_NAME = 'Unicode token requires name'; - var ERR_NO_DATA = 'Unicode token has no character data '; - - if (typePrefix) { - // Case sensitive to match ES2018 - unicodeTypes[typePrefix] = {}; - } - - var _iterator = _createForOfIteratorHelper(data), - _step; - - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var item = _step.value; - - if (!item.name) { - throw new Error(ERR_NO_NAME); - } - - if (!(item.inverseOf || item.bmp || item.astral)) { - throw new Error(ERR_NO_DATA + item.name); - } - - var normalizedName = normalize(item.name); - unicode[normalizedName] = item; - - if (typePrefix) { - unicodeTypes[typePrefix][normalizedName] = true; - } - - if (item.alias) { - var normalizedAlias = normalize(item.alias); - unicode[normalizedAlias] = item; - - if (typePrefix) { - unicodeTypes[typePrefix][normalizedAlias] = true; - } - } - } // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and - // flags might now produce different results - - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - - XRegExp.cache.flush('patterns'); - }; - /** - * @ignore - * - * Return a reference to the internal Unicode definition structure for the given Unicode - * Property if the given name is a legal Unicode Property for use in XRegExp `\p` or `\P` regex - * constructs. - * - * @memberOf XRegExp - * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive), - * e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode - * Properties and Property Aliases. - * @returns {Object} Reference to definition structure when the name matches a Unicode Property. - * - * @note - * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories. - * - * @note - * This method is *not* part of the officially documented API and may change or be removed in - * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode - * structures set up by XRegExp. - */ - - - XRegExp._getUnicodeProperty = function (name) { - var slug = normalize(name); - return unicode[slug]; - }; -}; - -exports["default"] = _default; -module.exports = exports.default; -},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],2:[function(require,module,exports){ -"use strict"; - -var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - -var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); - -_Object$defineProperty(exports, "__esModule", { - value: true -}); - -exports["default"] = void 0; - -var _categories = _interopRequireDefault(require("../../tools/output/categories")); - -/*! - * XRegExp Unicode Categories 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2010-present MIT License - * Unicode data by Mathias Bynens <mathiasbynens.be> - */ -var _default = function _default(XRegExp) { - /** - * Adds support for Unicode's general categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. See - * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token - * names are case insensitive, and any spaces, hyphens, and underscores are ignored. - * - * Uses Unicode 14.0.0. - * - * @requires XRegExp, Unicode Base - */ - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Categories'); - } - - XRegExp.addUnicodeData(_categories["default"]); -}; - -exports["default"] = _default; -module.exports = exports.default; -},{"../../tools/output/categories":222,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],3:[function(require,module,exports){ -"use strict"; - -var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - -var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); - -_Object$defineProperty(exports, "__esModule", { - value: true -}); - -exports["default"] = void 0; - -var _xregexp = _interopRequireDefault(require("./xregexp")); - -var _unicodeBase = _interopRequireDefault(require("./addons/unicode-base")); - -var _unicodeCategories = _interopRequireDefault(require("./addons/unicode-categories")); - -(0, _unicodeBase["default"])(_xregexp["default"]); -(0, _unicodeCategories["default"])(_xregexp["default"]); -var _default = _xregexp["default"]; -exports["default"] = _default; -module.exports = exports.default; -},{"./addons/unicode-base":1,"./addons/unicode-categories":2,"./xregexp":4,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],4:[function(require,module,exports){ -"use strict"; - -var _sliceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/slice"); - -var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from"); - -var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol"); - -var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method"); - -var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array"); - -var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - -var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); - -_Object$defineProperty(exports, "__esModule", { - value: true -}); - -exports["default"] = void 0; - -var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray")); - -var _flags = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/flags")); - -var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort")); - -var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice")); - -var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int")); - -var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of")); - -var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each")); - -var _create = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/create")); - -var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat")); - -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } - -function _unsupportedIterableToArray(o, minLen) { var _context9; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty2(_context9 = Object.prototype.toString.call(o)).call(_context9, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -/*! - * XRegExp 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2007-present MIT License - */ - -/** - * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and - * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to - * make your client-side grepping simpler and more powerful, while freeing you from related - * cross-browser inconsistencies. - */ -// ==--------------------------== -// Private stuff -// ==--------------------------== -// Property name used for extended regex instance data -var REGEX_DATA = 'xregexp'; // Optional features that can be installed and uninstalled - -var features = { - astral: false, - namespacing: true -}; // Storage for fixed/extended native methods - -var fixed = {}; // Storage for regexes cached by `XRegExp.cache` - -var regexCache = {}; // Storage for pattern details cached by the `XRegExp` constructor - -var patternCache = {}; // Storage for regex syntax tokens added internally or by `XRegExp.addToken` - -var tokens = []; // Token scopes - -var defaultScope = 'default'; -var classScope = 'class'; // Regexes that match native regex syntax, including octals - -var nativeTokens = { - // Any native multicharacter token in default scope, or any single character - 'default': /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/, - // Any native multicharacter token in character class scope, or any single character - 'class': /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/ -}; // Any backreference or dollar-prefixed character in replacement strings - -var replacementToken = /\$(?:\{([^\}]+)\}|<([^>]+)>|(\d\d?|[\s\S]?))/g; // Check for correct `exec` handling of nonparticipating capturing groups - -var correctExecNpcg = /()??/.exec('')[1] === undefined; // Check for ES6 `flags` prop support - -var hasFlagsProp = (0, _flags["default"])(/x/) !== undefined; - -function hasNativeFlag(flag) { - // Can't check based on the presence of properties/getters since browsers might support such - // properties even when they don't support the corresponding flag in regex construction (tested - // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u` - // throws an error) - var isSupported = true; - - try { - // Can't use regex literals for testing even in a `try` because regex literals with - // unsupported flags cause a compilation error in IE - new RegExp('', flag); // Work around a broken/incomplete IE11 polyfill for sticky introduced in core-js 3.6.0 - - if (flag === 'y') { - // Using function to avoid babel transform to regex literal - var gy = function () { - return 'gy'; - }(); - - var incompleteY = '.a'.replace(new RegExp('a', gy), '.') === '..'; - - if (incompleteY) { - isSupported = false; - } - } - } catch (exception) { - isSupported = false; - } - - return isSupported; -} // Check for ES2021 `d` flag support - - -var hasNativeD = hasNativeFlag('d'); // Check for ES2018 `s` flag support - -var hasNativeS = hasNativeFlag('s'); // Check for ES6 `u` flag support - -var hasNativeU = hasNativeFlag('u'); // Check for ES6 `y` flag support - -var hasNativeY = hasNativeFlag('y'); // Tracker for known flags, including addon flags - -var registeredFlags = { - d: hasNativeD, - g: true, - i: true, - m: true, - s: hasNativeS, - u: hasNativeU, - y: hasNativeY -}; // Flags to remove when passing to native `RegExp` constructor - -var nonnativeFlags = hasNativeS ? /[^dgimsuy]+/g : /[^dgimuy]+/g; -/** - * Attaches extended data and `XRegExp.prototype` properties to a regex object. - * - * @private - * @param {RegExp} regex Regex to augment. - * @param {Array} captureNames Array with capture names, or `null`. - * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A. - * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A. - * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal - * operations, and never exposed to users. For internal-only regexes, we can improve perf by - * skipping some operations like attaching `XRegExp.prototype` properties. - * @returns {!RegExp} Augmented regex. - */ - -function augment(regex, captureNames, xSource, xFlags, isInternalOnly) { - var _context; - - regex[REGEX_DATA] = { - captureNames: captureNames - }; - - if (isInternalOnly) { - return regex; - } // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value - - - if (regex.__proto__) { - regex.__proto__ = XRegExp.prototype; - } else { - for (var p in XRegExp.prototype) { - // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this - // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype` - // extensions exist on `regex.prototype` anyway - regex[p] = XRegExp.prototype[p]; - } - } - - regex[REGEX_DATA].source = xSource; // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order - - regex[REGEX_DATA].flags = xFlags ? (0, _sort["default"])(_context = xFlags.split('')).call(_context).join('') : xFlags; - return regex; -} -/** - * Removes any duplicate characters from the provided string. - * - * @private - * @param {String} str String to remove duplicate characters from. - * @returns {string} String with any duplicate characters removed. - */ - - -function clipDuplicates(str) { - return str.replace(/([\s\S])(?=[\s\S]*\1)/g, ''); -} -/** - * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype` - * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing - * flags g and y while copying the regex. - * - * @private - * @param {RegExp} regex Regex to copy. - * @param {Object} [options] Options object with optional properties: - * - `addG` {Boolean} Add flag g while copying the regex. - * - `addY` {Boolean} Add flag y while copying the regex. - * - `removeG` {Boolean} Remove flag g while copying the regex. - * - `removeY` {Boolean} Remove flag y while copying the regex. - * - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal - * operations, and never exposed to users. For internal-only regexes, we can improve perf by - * skipping some operations like attaching `XRegExp.prototype` properties. - * - `source` {String} Overrides `<regex>.source`, for special cases. - * @returns {RegExp} Copy of the provided regex, possibly with modified flags. - */ - - -function copyRegex(regex, options) { - var _context2; - - if (!XRegExp.isRegExp(regex)) { - throw new TypeError('Type RegExp expected'); - } - - var xData = regex[REGEX_DATA] || {}; - var flags = getNativeFlags(regex); - var flagsToAdd = ''; - var flagsToRemove = ''; - var xregexpSource = null; - var xregexpFlags = null; - options = options || {}; - - if (options.removeG) { - flagsToRemove += 'g'; - } - - if (options.removeY) { - flagsToRemove += 'y'; - } - - if (flagsToRemove) { - flags = flags.replace(new RegExp("[".concat(flagsToRemove, "]+"), 'g'), ''); - } - - if (options.addG) { - flagsToAdd += 'g'; - } - - if (options.addY) { - flagsToAdd += 'y'; - } - - if (flagsToAdd) { - flags = clipDuplicates(flags + flagsToAdd); - } - - if (!options.isInternalOnly) { - if (xData.source !== undefined) { - xregexpSource = xData.source; - } // null or undefined; don't want to add to `flags` if the previous value was null, since - // that indicates we're not tracking original precompilation flags - - - if ((0, _flags["default"])(xData) != null) { - // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never - // removed for non-internal regexes, so don't need to handle it - xregexpFlags = flagsToAdd ? clipDuplicates((0, _flags["default"])(xData) + flagsToAdd) : (0, _flags["default"])(xData); - } - } // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid - // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and - // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the - // translation to native regex syntax - - - regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? (0, _slice["default"])(_context2 = xData.captureNames).call(_context2, 0) : null, xregexpSource, xregexpFlags, options.isInternalOnly); - return regex; -} -/** - * Converts hexadecimal to decimal. - * - * @private - * @param {String} hex - * @returns {number} - */ - - -function dec(hex) { - return (0, _parseInt2["default"])(hex, 16); -} -/** - * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an - * inline comment or whitespace with flag x. This is used directly as a token handler function - * passed to `XRegExp.addToken`. - * - * @private - * @param {String} match Match arg of `XRegExp.addToken` handler - * @param {String} scope Scope arg of `XRegExp.addToken` handler - * @param {String} flags Flags arg of `XRegExp.addToken` handler - * @returns {string} Either '' or '(?:)', depending on which is needed in the context of the match. - */ - - -function getContextualTokenSeparator(match, scope, flags) { - var matchEndPos = match.index + match[0].length; - var precedingChar = match.input[match.index - 1]; - var followingChar = match.input[matchEndPos]; - - if ( // No need to separate tokens if at the beginning or end of a group, before or after a - // group, or before or after a `|` - /^[()|]$/.test(precedingChar) || /^[()|]$/.test(followingChar) || // No need to separate tokens if at the beginning or end of the pattern - match.index === 0 || matchEndPos === match.input.length || // No need to separate tokens if at the beginning of a noncapturing group or lookaround. - // Looks only at the last 4 chars (at most) for perf when constructing long regexes. - /\(\?(?:[:=!]|<[=!])$/.test(match.input.substring(match.index - 4, match.index)) || // Avoid separating tokens when the following token is a quantifier - isQuantifierNext(match.input, matchEndPos, flags)) { - return ''; - } // Keep tokens separated. This avoids e.g. inadvertedly changing `\1 1` or `\1(?#)1` to `\11`. - // This also ensures all tokens remain as discrete atoms, e.g. it prevents converting the - // syntax error `(? :` into `(?:`. - - - return '(?:)'; -} -/** - * Returns native `RegExp` flags used by a regex object. - * - * @private - * @param {RegExp} regex Regex to check. - * @returns {string} Native flags in use. - */ - - -function getNativeFlags(regex) { - return hasFlagsProp ? (0, _flags["default"])(regex) : // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation - // with an empty string) allows this to continue working predictably when - // `XRegExp.proptotype.toString` is overridden - /\/([a-z]*)$/i.exec(RegExp.prototype.toString.call(regex))[1]; -} -/** - * Determines whether a regex has extended instance data used to track capture names. - * - * @private - * @param {RegExp} regex Regex to check. - * @returns {boolean} Whether the regex uses named capture. - */ - - -function hasNamedCapture(regex) { - return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames); -} -/** - * Converts decimal to hexadecimal. - * - * @private - * @param {Number|String} dec - * @returns {string} - */ - - -function hex(dec) { - return (0, _parseInt2["default"])(dec, 10).toString(16); -} -/** - * Checks whether the next nonignorable token after the specified position is a quantifier. - * - * @private - * @param {String} pattern Pattern to search within. - * @param {Number} pos Index in `pattern` to search at. - * @param {String} flags Flags used by the pattern. - * @returns {Boolean} Whether the next nonignorable token is a quantifier. - */ - - -function isQuantifierNext(pattern, pos, flags) { - var inlineCommentPattern = '\\(\\?#[^)]*\\)'; - var lineCommentPattern = '#[^#\\n]*'; - var quantifierPattern = '[?*+]|{\\d+(?:,\\d*)?}'; - var regex = (0, _indexOf["default"])(flags).call(flags, 'x') !== -1 ? // Ignore any leading whitespace, line comments, and inline comments - /^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/ : // Ignore any leading inline comments - /^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/; - return regex.test((0, _slice["default"])(pattern).call(pattern, pos)); -} -/** - * Determines whether a value is of the specified type, by resolving its internal [[Class]]. - * - * @private - * @param {*} value Object to check. - * @param {String} type Type to check for, in TitleCase. - * @returns {boolean} Whether the object matches the type. - */ - - -function isType(value, type) { - return Object.prototype.toString.call(value) === "[object ".concat(type, "]"); -} -/** - * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow - * the ES5 abstract operation `ToObject`. - * - * @private - * @param {*} value Object to check and return. - * @returns {*} The provided object. - */ - - -function nullThrows(value) { - // null or undefined - if (value == null) { - throw new TypeError('Cannot convert null or undefined to object'); - } - - return value; -} -/** - * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values. - * - * @private - * @param {String} str - * @returns {string} - */ - - -function pad4(str) { - while (str.length < 4) { - str = "0".concat(str); - } - - return str; -} -/** - * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads - * the flag preparation logic from the `XRegExp` constructor. - * - * @private - * @param {String} pattern Regex pattern, possibly with a leading mode modifier. - * @param {String} flags Any combination of flags. - * @returns {!Object} Object with properties `pattern` and `flags`. - */ - - -function prepareFlags(pattern, flags) { - // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags - if (clipDuplicates(flags) !== flags) { - throw new SyntaxError("Invalid duplicate regex flag ".concat(flags)); - } // Strip and apply a leading mode modifier with any combination of flags except `dgy` - - - pattern = pattern.replace(/^\(\?([\w$]+)\)/, function ($0, $1) { - if (/[dgy]/.test($1)) { - throw new SyntaxError("Cannot use flags dgy in mode modifier ".concat($0)); - } // Allow duplicate flags within the mode modifier - - - flags = clipDuplicates(flags + $1); - return ''; - }); // Throw on unknown native or nonnative flags - - var _iterator = _createForOfIteratorHelper(flags), - _step; - - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var flag = _step.value; - - if (!registeredFlags[flag]) { - throw new SyntaxError("Unknown regex flag ".concat(flag)); - } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - - return { - pattern: pattern, - flags: flags - }; -} -/** - * Prepares an options object from the given value. - * - * @private - * @param {String|Object} value Value to convert to an options object. - * @returns {Object} Options object. - */ - - -function prepareOptions(value) { - var options = {}; - - if (isType(value, 'String')) { - (0, _forEach["default"])(XRegExp).call(XRegExp, value, /[^\s,]+/, function (match) { - options[match] = true; - }); - return options; - } - - return value; -} -/** - * Registers a flag so it doesn't throw an 'unknown flag' error. - * - * @private - * @param {String} flag Single-character flag to register. - */ - - -function registerFlag(flag) { - if (!/^[\w$]$/.test(flag)) { - throw new Error('Flag must be a single character A-Za-z0-9_$'); - } - - registeredFlags[flag] = true; -} -/** - * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified - * position, until a match is found. - * - * @private - * @param {String} pattern Original pattern from which an XRegExp object is being built. - * @param {String} flags Flags being used to construct the regex. - * @param {Number} pos Position to search for tokens within `pattern`. - * @param {Number} scope Regex scope to apply: 'default' or 'class'. - * @param {Object} context Context object to use for token handler functions. - * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`. - */ - - -function runTokens(pattern, flags, pos, scope, context) { - var i = tokens.length; - var leadChar = pattern[pos]; - var result = null; - var match; - var t; // Run in reverse insertion order - - while (i--) { - t = tokens[i]; - - if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !((0, _indexOf["default"])(flags).call(flags, t.flag) !== -1)) { - continue; - } - - match = XRegExp.exec(pattern, t.regex, pos, 'sticky'); - - if (match) { - result = { - matchLength: match[0].length, - output: t.handler.call(context, match, scope, flags), - reparse: t.reparse - }; // Finished with token tests - - break; - } - } - - return result; -} -/** - * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to - * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if - * the Unicode Base addon is not available, since flag A is registered by that addon. - * - * @private - * @param {Boolean} on `true` to enable; `false` to disable. - */ - - -function setAstral(on) { - features.astral = on; -} -/** - * Adds named capture groups to the `groups` property of match arrays. See here for details: - * https://github.com/tc39/proposal-regexp-named-groups - * - * @private - * @param {Boolean} on `true` to enable; `false` to disable. - */ - - -function setNamespacing(on) { - features.namespacing = on; -} // ==--------------------------== -// Constructor -// ==--------------------------== - -/** - * Creates an extended regular expression object for matching text with a pattern. Differs from a - * native regular expression in that additional syntax and flags are supported. The returned object - * is in fact a native `RegExp` and works with all native methods. - * - * @class XRegExp - * @constructor - * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy. - * @param {String} [flags] Any combination of flags. - * Native flags: - * - `d` - indices for capturing groups (ES2021) - * - `g` - global - * - `i` - ignore case - * - `m` - multiline anchors - * - `u` - unicode (ES6) - * - `y` - sticky (Firefox 3+, ES6) - * Additional XRegExp flags: - * - `n` - named capture only - * - `s` - dot matches all (aka singleline) - works even when not natively supported - * - `x` - free-spacing and line comments (aka extended) - * - `A` - 21-bit Unicode properties (aka astral) - requires the Unicode Base addon - * Flags cannot be provided when constructing one `RegExp` from another. - * @returns {RegExp} Extended regular expression object. - * @example - * - * // With named capture and flag x - * XRegExp(`(?<year> [0-9]{4} ) -? # year - * (?<month> [0-9]{2} ) -? # month - * (?<day> [0-9]{2} ) # day`, 'x'); - * - * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp) - * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and - * // have fresh `lastIndex` properties (set to zero). - * XRegExp(/regex/); - */ - - -function XRegExp(pattern, flags) { - if (XRegExp.isRegExp(pattern)) { - if (flags !== undefined) { - throw new TypeError('Cannot supply flags when copying a RegExp'); - } - - return copyRegex(pattern); - } // Copy the argument behavior of `RegExp` - - - pattern = pattern === undefined ? '' : String(pattern); - flags = flags === undefined ? '' : String(flags); - - if (XRegExp.isInstalled('astral') && !((0, _indexOf["default"])(flags).call(flags, 'A') !== -1)) { - // This causes an error to be thrown if the Unicode Base addon is not available - flags += 'A'; - } - - if (!patternCache[pattern]) { - patternCache[pattern] = {}; - } - - if (!patternCache[pattern][flags]) { - var context = { - hasNamedCapture: false, - captureNames: [] - }; - var scope = defaultScope; - var output = ''; - var pos = 0; - var result; // Check for flag-related errors, and strip/apply flags in a leading mode modifier - - var applied = prepareFlags(pattern, flags); - var appliedPattern = applied.pattern; - var appliedFlags = (0, _flags["default"])(applied); // Use XRegExp's tokens to translate the pattern to a native regex pattern. - // `appliedPattern.length` may change on each iteration if tokens use `reparse` - - while (pos < appliedPattern.length) { - do { - // Check for custom tokens at the current position - result = runTokens(appliedPattern, appliedFlags, pos, scope, context); // If the matched token used the `reparse` option, splice its output into the - // pattern before running tokens again at the same position - - if (result && result.reparse) { - appliedPattern = (0, _slice["default"])(appliedPattern).call(appliedPattern, 0, pos) + result.output + (0, _slice["default"])(appliedPattern).call(appliedPattern, pos + result.matchLength); - } - } while (result && result.reparse); - - if (result) { - output += result.output; - pos += result.matchLength || 1; - } else { - // Get the native token at the current position - var _XRegExp$exec = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky'), - _XRegExp$exec2 = (0, _slicedToArray2["default"])(_XRegExp$exec, 1), - token = _XRegExp$exec2[0]; - - output += token; - pos += token.length; - - if (token === '[' && scope === defaultScope) { - scope = classScope; - } else if (token === ']' && scope === classScope) { - scope = defaultScope; - } - } - } - - patternCache[pattern][flags] = { - // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty - // groups are sometimes inserted during regex transpilation in order to keep tokens - // separated. However, more than one empty group in a row is never needed. - pattern: output.replace(/(?:\(\?:\))+/g, '(?:)'), - // Strip all but native flags - flags: appliedFlags.replace(nonnativeFlags, ''), - // `context.captureNames` has an item for each capturing group, even if unnamed - captures: context.hasNamedCapture ? context.captureNames : null - }; - } - - var generated = patternCache[pattern][flags]; - return augment(new RegExp(generated.pattern, (0, _flags["default"])(generated)), generated.captures, pattern, flags); -} // Add `RegExp.prototype` to the prototype chain - - -XRegExp.prototype = /(?:)/; // ==--------------------------== -// Public properties -// ==--------------------------== - -/** - * The XRegExp version number as a string containing three dot-separated parts. For example, - * '2.0.0-beta-3'. - * - * @static - * @memberOf XRegExp - * @type String - */ - -XRegExp.version = '5.1.1'; // ==--------------------------== -// Public methods -// ==--------------------------== -// Intentionally undocumented; used in tests and addons - -XRegExp._clipDuplicates = clipDuplicates; -XRegExp._hasNativeFlag = hasNativeFlag; -XRegExp._dec = dec; -XRegExp._hex = hex; -XRegExp._pad4 = pad4; -/** - * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to - * create XRegExp addons. If more than one token can match the same string, the last added wins. - * - * @memberOf XRegExp - * @param {RegExp} regex Regex object that matches the new token. - * @param {Function} handler Function that returns a new pattern string (using native regex syntax) - * to replace the matched token within all future XRegExp regexes. Has access to persistent - * properties of the regex being built, through `this`. Invoked with three arguments: - * - The match array, with named backreference properties. - * - The regex scope where the match was found: 'default' or 'class'. - * - The flags used by the regex, including any flags in a leading mode modifier. - * The handler function becomes part of the XRegExp construction process, so be careful not to - * construct XRegExps within the function or you will trigger infinite recursion. - * @param {Object} [options] Options object with optional properties: - * - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'. - * - `flag` {String} Single-character flag that triggers the token. This also registers the - * flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used. - * - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are - * not required to trigger the token. This registers the flags, to prevent XRegExp from - * throwing an 'unknown flag' error when any of the flags are used. - * - `reparse` {Boolean} Whether the `handler` function's output should not be treated as - * final, and instead be reparseable by other tokens (including the current token). Allows - * token chaining or deferring. - * - `leadChar` {String} Single character that occurs at the beginning of any successful match - * of the token (not always applicable). This doesn't change the behavior of the token unless - * you provide an erroneous value. However, providing it can increase the token's performance - * since the token can be skipped at any positions where this character doesn't appear. - * @example - * - * // Basic usage: Add \a for the ALERT control code - * XRegExp.addToken( - * /\\a/, - * () => '\\x07', - * {scope: 'all'} - * ); - * XRegExp('\\a[\\a-\\n]+').test('\x07\n\x07'); // -> true - * - * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers. - * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of - * // character classes only) - * XRegExp.addToken( - * /([?*+]|{\d+(?:,\d*)?})(\??)/, - * (match) => `${match[1]}${match[2] ? '' : '?'}`, - * {flag: 'U'} - * ); - * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a' - * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa' - */ - -XRegExp.addToken = function (regex, handler, options) { - options = options || {}; - var _options = options, - optionalFlags = _options.optionalFlags; - - if (options.flag) { - registerFlag(options.flag); - } - - if (optionalFlags) { - optionalFlags = optionalFlags.split(''); - - var _iterator2 = _createForOfIteratorHelper(optionalFlags), - _step2; - - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var flag = _step2.value; - registerFlag(flag); - } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - } // Add to the private list of syntax tokens - - - tokens.push({ - regex: copyRegex(regex, { - addG: true, - addY: hasNativeY, - isInternalOnly: true - }), - handler: handler, - scope: options.scope || defaultScope, - flag: options.flag, - reparse: options.reparse, - leadChar: options.leadChar - }); // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags - // might now produce different results - - XRegExp.cache.flush('patterns'); -}; -/** - * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with - * the same pattern and flag combination, the cached copy of the regex is returned. - * - * @memberOf XRegExp - * @param {String} pattern Regex pattern string. - * @param {String} [flags] Any combination of XRegExp flags. - * @returns {RegExp} Cached XRegExp object. - * @example - * - * let match; - * while (match = XRegExp.cache('.', 'gs').exec('abc')) { - * // The regex is compiled once only - * } - */ - - -XRegExp.cache = function (pattern, flags) { - if (!regexCache[pattern]) { - regexCache[pattern] = {}; - } - - return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags)); -}; // Intentionally undocumented; used in tests - - -XRegExp.cache.flush = function (cacheName) { - if (cacheName === 'patterns') { - // Flush the pattern cache used by the `XRegExp` constructor - patternCache = {}; - } else { - // Flush the regex cache populated by `XRegExp.cache` - regexCache = {}; - } -}; -/** - * Escapes any regular expression metacharacters, for use when matching literal strings. The result - * can safely be used at any position within a regex that uses any flags. - * - * @memberOf XRegExp - * @param {String} str String to escape. - * @returns {string} String with regex metacharacters escaped. - * @example - * - * XRegExp.escape('Escaped? <.>'); - * // -> 'Escaped\?\u0020<\.>' - */ -// Following are the contexts where each metacharacter needs to be escaped because it would -// otherwise have a special meaning, change the meaning of surrounding characters, or cause an -// error. Context 'default' means outside character classes only. -// - `\` - context: all -// - `[()*+?.$|` - context: default -// - `]` - context: default with flag u or if forming the end of a character class -// - `{}` - context: default with flag u or if part of a valid/complete quantifier pattern -// - `,` - context: default if in a position that causes an unescaped `{` to turn into a quantifier. -// Ex: `/^a{1\,2}$/` matches `'a{1,2}'`, but `/^a{1,2}$/` matches `'a'` or `'aa'` -// - `#` and <whitespace> - context: default with flag x -// - `^` - context: default, and context: class if it's the first character in the class -// - `-` - context: class if part of a valid character class range - - -XRegExp.escape = function (str) { - return String(nullThrows(str)). // Escape most special chars with a backslash - replace(/[\\\[\]{}()*+?.^$|]/g, '\\$&'). // Convert to \uNNNN for special chars that can't be escaped when used with ES6 flag `u` - replace(/[\s#\-,]/g, function (match) { - return "\\u".concat(pad4(hex(match.charCodeAt(0)))); - }); -}; -/** - * Executes a regex search in a specified string. Returns a match array or `null`. If the provided - * regex uses named capture, named capture properties are included on the match array's `groups` - * property. Optional `pos` and `sticky` arguments specify the search start position, and whether - * the match must start at the specified position only. The `lastIndex` property of the provided - * regex is not used, but is updated for compatibility. Also fixes browser bugs compared to the - * native `RegExp.prototype.exec` and can be used reliably cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {Number} [pos=0] Zero-based index at which to start the search. - * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position - * only. The string `'sticky'` is accepted as an alternative to `true`. - * @returns {Array} Match array with named capture properties on the `groups` object, or `null`. If - * the `namespacing` feature is off, named capture properties are directly on the match array. - * @example - * - * // Basic use, with named capturing group - * let match = XRegExp.exec('U+2620', XRegExp('U\\+(?<hex>[0-9A-F]{4})')); - * match.groups.hex; // -> '2620' - * - * // With pos and sticky, in a loop - * let pos = 3, result = [], match; - * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\d)>/, pos, 'sticky')) { - * result.push(match[1]); - * pos = match.index + match[0].length; - * } - * // result -> ['2', '3', '4'] - */ - - -XRegExp.exec = function (str, regex, pos, sticky) { - var cacheKey = 'g'; - var addY = false; - var fakeY = false; - var match; - addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false); - - if (addY) { - cacheKey += 'y'; - } else if (sticky) { - // Simulate sticky matching by appending an empty capture to the original regex. The - // resulting regex will succeed no matter what at the current index (set with `lastIndex`), - // and will not search the rest of the subject string. We'll know that the original regex - // has failed if that last capture is `''` rather than `undefined` (i.e., if that last - // capture participated in the match). - fakeY = true; - cacheKey += 'FakeY'; - } - - regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.match`/`replace` - - var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, { - addG: true, - addY: addY, - source: fakeY ? "".concat(regex.source, "|()") : undefined, - removeY: sticky === false, - isInternalOnly: true - })); - pos = pos || 0; - r2.lastIndex = pos; // Fixed `exec` required for `lastIndex` fix, named backreferences, etc. - - match = fixed.exec.call(r2, str); // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means - // the original regexp failed (see above). - - if (fakeY && match && match.pop() === '') { - match = null; - } - - if (regex.global) { - regex.lastIndex = match ? r2.lastIndex : 0; - } - - return match; -}; -/** - * Executes a provided function once per regex match. Searches always start at the beginning of the - * string and continue until the end, regardless of the state of the regex's `global` property and - * initial `lastIndex`. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {Function} callback Function to execute for each match. Invoked with four arguments: - * - The match array, with named backreference properties. - * - The zero-based match index. - * - The string being traversed. - * - The regex object being used to traverse the string. - * @example - * - * // Extracts every other digit from a string - * const evens = []; - * XRegExp.forEach('1a2345', /\d/, (match, i) => { - * if (i % 2) evens.push(+match[0]); - * }); - * // evens -> [2, 4] - */ - - -XRegExp.forEach = function (str, regex, callback) { - var pos = 0; - var i = -1; - var match; - - while (match = XRegExp.exec(str, regex, pos)) { - // Because `regex` is provided to `callback`, the function could use the deprecated/ - // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec` - // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop, - // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of - // regexes, mutating the regex will not have any effect on the iteration or matched strings, - // which is a nice side effect that brings extra safety. - callback(match, ++i, str, regex); - pos = match.index + (match[0].length || 1); - } -}; -/** - * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with - * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native - * regexes are not recompiled using XRegExp syntax. - * - * @memberOf XRegExp - * @param {RegExp} regex Regex to globalize. - * @returns {RegExp} Copy of the provided regex with flag `g` added. - * @example - * - * const globalCopy = XRegExp.globalize(/regex/); - * globalCopy.global; // -> true - */ - - -XRegExp.globalize = function (regex) { - return copyRegex(regex, { - addG: true - }); -}; -/** - * Installs optional features according to the specified options. Can be undone using - * `XRegExp.uninstall`. - * - * @memberOf XRegExp - * @param {Object|String} options Options object or string. - * @example - * - * // With an options object - * XRegExp.install({ - * // Enables support for astral code points in Unicode addons (implicitly sets flag A) - * astral: true, - * - * // Adds named capture groups to the `groups` property of matches - * namespacing: true - * }); - * - * // With an options string - * XRegExp.install('astral namespacing'); - */ - - -XRegExp.install = function (options) { - options = prepareOptions(options); - - if (!features.astral && options.astral) { - setAstral(true); - } - - if (!features.namespacing && options.namespacing) { - setNamespacing(true); - } -}; -/** - * Checks whether an individual optional feature is installed. - * - * @memberOf XRegExp - * @param {String} feature Name of the feature to check. One of: - * - `astral` - * - `namespacing` - * @returns {boolean} Whether the feature is installed. - * @example - * - * XRegExp.isInstalled('astral'); - */ - - -XRegExp.isInstalled = function (feature) { - return !!features[feature]; -}; -/** - * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes - * created in another frame, when `instanceof` and `constructor` checks would fail. - * - * @memberOf XRegExp - * @param {*} value Object to check. - * @returns {boolean} Whether the object is a `RegExp` object. - * @example - * - * XRegExp.isRegExp('string'); // -> false - * XRegExp.isRegExp(/regex/i); // -> true - * XRegExp.isRegExp(RegExp('^', 'm')); // -> true - * XRegExp.isRegExp(XRegExp('(?s).')); // -> true - */ - - -XRegExp.isRegExp = function (value) { - return Object.prototype.toString.call(value) === '[object RegExp]'; -}; // Same as `isType(value, 'RegExp')`, but avoiding that function call here for perf since -// `isRegExp` is used heavily by internals including regex construction - -/** - * Returns the first matched string, or in global mode, an array containing all matched strings. - * This is essentially a more convenient re-implementation of `String.prototype.match` that gives - * the result types you actually want (string instead of `exec`-style array in match-first mode, - * and an empty array instead of `null` when no matches are found in match-all mode). It also lets - * you override flag g and ignore `lastIndex`, and fixes browser bugs. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to - * return an array of all matched strings. If not explicitly specified and `regex` uses flag g, - * `scope` is 'all'. - * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all - * mode: Array of all matched strings, or an empty array. - * @example - * - * // Match first - * XRegExp.match('abc', /\w/); // -> 'a' - * XRegExp.match('abc', /\w/g, 'one'); // -> 'a' - * XRegExp.match('abc', /x/g, 'one'); // -> null - * - * // Match all - * XRegExp.match('abc', /\w/g); // -> ['a', 'b', 'c'] - * XRegExp.match('abc', /\w/, 'all'); // -> ['a', 'b', 'c'] - * XRegExp.match('abc', /x/, 'all'); // -> [] - */ - - -XRegExp.match = function (str, regex, scope) { - var global = regex.global && scope !== 'one' || scope === 'all'; - var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY'; - regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`replace` - - var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, { - addG: !!global, - removeG: scope === 'one', - isInternalOnly: true - })); - var result = String(nullThrows(str)).match(r2); - - if (regex.global) { - regex.lastIndex = scope === 'one' && result ? // Can't use `r2.lastIndex` since `r2` is nonglobal in this case - result.index + result[0].length : 0; - } - - return global ? result || [] : result && result[0]; -}; -/** - * Retrieves the matches from searching a string using a chain of regexes that successively search - * within previous matches. The provided `chain` array can contain regexes and or objects with - * `regex` and `backref` properties. When a backreference is specified, the named or numbered - * backreference is passed forward to the next regex or returned. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {Array} chain Regexes that each search for matches within preceding results. - * @returns {Array} Matches by the last regex in the chain, or an empty array. - * @example - * - * // Basic usage; matches numbers within <b> tags - * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [ - * XRegExp('(?is)<b>.*?</b>'), - * /\d+/ - * ]); - * // -> ['2', '4', '56'] - * - * // Passing forward and returning specific backreferences - * const html = `<a href="http://xregexp.com/api/">XRegExp</a> - * <a href="http://www.google.com/">Google</a>`; - * XRegExp.matchChain(html, [ - * {regex: /<a href="([^"]+)">/i, backref: 1}, - * {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'} - * ]); - * // -> ['xregexp.com', 'www.google.com'] - */ - - -XRegExp.matchChain = function (str, chain) { - return function recurseChain(values, level) { - var item = chain[level].regex ? chain[level] : { - regex: chain[level] - }; - var matches = []; - - function addMatch(match) { - if (item.backref) { - var ERR_UNDEFINED_GROUP = "Backreference to undefined group: ".concat(item.backref); - var isNamedBackref = isNaN(item.backref); - - if (isNamedBackref && XRegExp.isInstalled('namespacing')) { - // `groups` has `null` as prototype, so using `in` instead of `hasOwnProperty` - if (!(match.groups && item.backref in match.groups)) { - throw new ReferenceError(ERR_UNDEFINED_GROUP); - } - } else if (!match.hasOwnProperty(item.backref)) { - throw new ReferenceError(ERR_UNDEFINED_GROUP); - } - - var backrefValue = isNamedBackref && XRegExp.isInstalled('namespacing') ? match.groups[item.backref] : match[item.backref]; - matches.push(backrefValue || ''); - } else { - matches.push(match[0]); - } - } - - var _iterator3 = _createForOfIteratorHelper(values), - _step3; - - try { - for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { - var value = _step3.value; - (0, _forEach["default"])(XRegExp).call(XRegExp, value, item.regex, addMatch); - } - } catch (err) { - _iterator3.e(err); - } finally { - _iterator3.f(); - } - - return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1); - }([str], 0); -}; -/** - * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string - * or regex, and the replacement can be a string or a function to be called for each match. To - * perform a global search and replace, use the optional `scope` argument or include flag g if using - * a regex. Replacement strings can use `$<n>` or `${n}` for named and numbered backreferences. - * Replacement functions can use named backreferences via the last argument. Also fixes browser bugs - * compared to the native `String.prototype.replace` and can be used reliably cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp|String} search Search pattern to be replaced. - * @param {String|Function} replacement Replacement string or a function invoked to create it. - * Replacement strings can include special replacement syntax: - * - $$ - Inserts a literal $ character. - * - $&, $0 - Inserts the matched substring. - * - $` - Inserts the string that precedes the matched substring (left context). - * - $' - Inserts the string that follows the matched substring (right context). - * - $n, $nn - Where n/nn are digits referencing an existing capturing group, inserts - * backreference n/nn. - * - $<n>, ${n} - Where n is a name or any number of digits that reference an existing capturing - * group, inserts backreference n. - * Replacement functions are invoked with three or more arguments: - * - args[0] - The matched substring (corresponds to `$&` above). If the `namespacing` feature - * is off, named backreferences are accessible as properties of this argument. - * - args[1..n] - One argument for each backreference (corresponding to `$1`, `$2`, etc. above). - * If the regex has no capturing groups, no arguments appear in this position. - * - args[n+1] - The zero-based index of the match within the entire search string. - * - args[n+2] - The total string being searched. - * - args[n+3] - If the the search pattern is a regex with named capturing groups, the last - * argument is the groups object. Its keys are the backreference names and its values are the - * backreference values. If the `namespacing` feature is off, this argument is not present. - * @param {String} [scope] Use 'one' to replace the first match only, or 'all'. Defaults to 'one'. - * Defaults to 'all' if using a regex with flag g. - * @returns {String} New string with one or all matches replaced. - * @example - * - * // Regex search, using named backreferences in replacement string - * const name = XRegExp('(?<first>\\w+) (?<last>\\w+)'); - * XRegExp.replace('John Smith', name, '$<last>, $<first>'); - * // -> 'Smith, John' - * - * // Regex search, using named backreferences in replacement function - * XRegExp.replace('John Smith', name, (...args) => { - * const groups = args[args.length - 1]; - * return `${groups.last}, ${groups.first}`; - * }); - * // -> 'Smith, John' - * - * // String search, with replace-all - * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all'); - * // -> 'XRegExp builds XRegExps' - */ - - -XRegExp.replace = function (str, search, replacement, scope) { - var isRegex = XRegExp.isRegExp(search); - var global = search.global && scope !== 'one' || scope === 'all'; - var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY'; - var s2 = search; - - if (isRegex) { - search[REGEX_DATA] = search[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s - // `lastIndex` isn't updated *during* replacement iterations - - s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, { - addG: !!global, - removeG: scope === 'one', - isInternalOnly: true - })); - } else if (global) { - s2 = new RegExp(XRegExp.escape(String(search)), 'g'); - } // Fixed `replace` required for named backreferences, etc. - - - var result = fixed.replace.call(nullThrows(str), s2, replacement); - - if (isRegex && search.global) { - // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) - search.lastIndex = 0; - } - - return result; -}; -/** - * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an - * array of replacement details. Later replacements operate on the output of earlier replacements. - * Replacement details are accepted as an array with a regex or string to search for, the - * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp - * replacement text syntax, which supports named backreference properties via `$<name>` or - * `${name}`. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {Array} replacements Array of replacement detail arrays. - * @returns {String} New string with all replacements. - * @example - * - * str = XRegExp.replaceEach(str, [ - * [XRegExp('(?<name>a)'), 'z$<name>'], - * [/b/gi, 'y'], - * [/c/g, 'x', 'one'], // scope 'one' overrides /g - * [/d/, 'w', 'all'], // scope 'all' overrides lack of /g - * ['e', 'v', 'all'], // scope 'all' allows replace-all for strings - * [/f/g, (match) => match.toUpperCase()] - * ]); - */ - - -XRegExp.replaceEach = function (str, replacements) { - var _iterator4 = _createForOfIteratorHelper(replacements), - _step4; - - try { - for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { - var r = _step4.value; - str = XRegExp.replace(str, r[0], r[1], r[2]); - } - } catch (err) { - _iterator4.e(err); - } finally { - _iterator4.f(); - } - - return str; -}; -/** - * Splits a string into an array of strings using a regex or string separator. Matches of the - * separator are not included in the result array. However, if `separator` is a regex that contains - * capturing groups, backreferences are spliced into the result each time `separator` is matched. - * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably - * cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to split. - * @param {RegExp|String} separator Regex or string to use for separating the string. - * @param {Number} [limit] Maximum number of items to include in the result array. - * @returns {Array} Array of substrings. - * @example - * - * // Basic use - * XRegExp.split('a b c', ' '); - * // -> ['a', 'b', 'c'] - * - * // With limit - * XRegExp.split('a b c', ' ', 2); - * // -> ['a', 'b'] - * - * // Backreferences in result array - * XRegExp.split('..word1..', /([a-z]+)(\d+)/i); - * // -> ['..', 'word', '1', '..'] - */ - - -XRegExp.split = function (str, separator, limit) { - return fixed.split.call(nullThrows(str), separator, limit); -}; -/** - * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and - * `sticky` arguments specify the search start position, and whether the match must start at the - * specified position only. The `lastIndex` property of the provided regex is not used, but is - * updated for compatibility. Also fixes browser bugs compared to the native - * `RegExp.prototype.test` and can be used reliably cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {Number} [pos=0] Zero-based index at which to start the search. - * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position - * only. The string `'sticky'` is accepted as an alternative to `true`. - * @returns {boolean} Whether the regex matched the provided value. - * @example - * - * // Basic use - * XRegExp.test('abc', /c/); // -> true - * - * // With pos and sticky - * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false - * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true - */ -// Do this the easy way :-) - - -XRegExp.test = function (str, regex, pos, sticky) { - return !!XRegExp.exec(str, regex, pos, sticky); -}; -/** - * Uninstalls optional features according to the specified options. Used to undo the actions of - * `XRegExp.install`. - * - * @memberOf XRegExp - * @param {Object|String} options Options object or string. - * @example - * - * // With an options object - * XRegExp.uninstall({ - * // Disables support for astral code points in Unicode addons (unless enabled per regex) - * astral: true, - * - * // Don't add named capture groups to the `groups` property of matches - * namespacing: true - * }); - * - * // With an options string - * XRegExp.uninstall('astral namespacing'); - */ - - -XRegExp.uninstall = function (options) { - options = prepareOptions(options); - - if (features.astral && options.astral) { - setAstral(false); - } - - if (features.namespacing && options.namespacing) { - setNamespacing(false); - } -}; -/** - * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as - * regex objects or strings. Metacharacters are escaped in patterns provided as strings. - * Backreferences in provided regex objects are automatically renumbered to work correctly within - * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the - * `flags` argument. - * - * @memberOf XRegExp - * @param {Array} patterns Regexes and strings to combine. - * @param {String} [flags] Any combination of XRegExp flags. - * @param {Object} [options] Options object with optional properties: - * - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'. - * @returns {RegExp} Union of the provided regexes and strings. - * @example - * - * XRegExp.union(['a+b*c', /(dogs)\1/, /(cats)\1/], 'i'); - * // -> /a\+b\*c|(dogs)\1|(cats)\2/i - * - * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'}); - * // -> /manbearpig/i - */ - - -XRegExp.union = function (patterns, flags, options) { - options = options || {}; - var conjunction = options.conjunction || 'or'; - var numCaptures = 0; - var numPriorCaptures; - var captureNames; - - function rewrite(match, paren, backref) { - var name = captureNames[numCaptures - numPriorCaptures]; // Capturing group - - if (paren) { - ++numCaptures; // If the current capture has a name, preserve the name - - if (name) { - return "(?<".concat(name, ">"); - } // Backreference - - } else if (backref) { - // Rewrite the backreference - return "\\".concat(+backref + numPriorCaptures); - } - - return match; - } - - if (!(isType(patterns, 'Array') && patterns.length)) { - throw new TypeError('Must provide a nonempty array of patterns to merge'); - } - - var parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; - var output = []; - - var _iterator5 = _createForOfIteratorHelper(patterns), - _step5; - - try { - for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { - var pattern = _step5.value; - - if (XRegExp.isRegExp(pattern)) { - numPriorCaptures = numCaptures; - captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || []; // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are - // independently valid; helps keep this simple. Named captures are put back - - output.push(XRegExp(pattern.source).source.replace(parts, rewrite)); - } else { - output.push(XRegExp.escape(pattern)); - } - } - } catch (err) { - _iterator5.e(err); - } finally { - _iterator5.f(); - } - - var separator = conjunction === 'none' ? '' : '|'; - return XRegExp(output.join(separator), flags); -}; // ==--------------------------== -// Fixed/extended native methods -// ==--------------------------== - -/** - * Adds named capture support (with backreferences returned as `result.name`), and fixes browser - * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`. - * - * @memberOf RegExp - * @param {String} str String to search. - * @returns {Array} Match array with named backreference properties, or `null`. - */ - - -fixed.exec = function (str) { - var origLastIndex = this.lastIndex; - var match = RegExp.prototype.exec.apply(this, arguments); - - if (match) { - // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing - // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9 - // in standards mode follows the spec. - if (!correctExecNpcg && match.length > 1 && (0, _indexOf["default"])(match).call(match, '') !== -1) { - var _context3; - - var r2 = copyRegex(this, { - removeG: true, - isInternalOnly: true - }); // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed - // matching due to characters outside the match - - (0, _slice["default"])(_context3 = String(str)).call(_context3, match.index).replace(r2, function () { - var len = arguments.length; // Skip index 0 and the last 2 - - for (var i = 1; i < len - 2; ++i) { - if ((i < 0 || arguments.length <= i ? undefined : arguments[i]) === undefined) { - match[i] = undefined; - } - } - }); - } // Attach named capture properties - - - if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) { - var groupsObject = match; - - if (XRegExp.isInstalled('namespacing')) { - // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec - match.groups = (0, _create["default"])(null); - groupsObject = match.groups; - } // Skip index 0 - - - for (var i = 1; i < match.length; ++i) { - var name = this[REGEX_DATA].captureNames[i - 1]; - - if (name) { - groupsObject[name] = match[i]; - } - } // Preserve any existing `groups` obj that came from native ES2018 named capture - - } else if (!match.groups && XRegExp.isInstalled('namespacing')) { - match.groups = undefined; - } // Fix browsers that increment `lastIndex` after zero-length matches - - - if (this.global && !match[0].length && this.lastIndex > match.index) { - this.lastIndex = match.index; - } - } - - if (!this.global) { - // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) - this.lastIndex = origLastIndex; - } - - return match; -}; -/** - * Fixes browser bugs in the native `RegExp.prototype.test`. - * - * @memberOf RegExp - * @param {String} str String to search. - * @returns {boolean} Whether the regex matched the provided value. - */ - - -fixed.test = function (str) { - // Do this the easy way :-) - return !!fixed.exec.call(this, str); -}; -/** - * Adds named capture support (with backreferences returned as `result.name`), and fixes browser - * bugs in the native `String.prototype.match`. - * - * @memberOf String - * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`. - * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g, - * the result of calling `regex.exec(this)`. - */ - - -fixed.match = function (regex) { - if (!XRegExp.isRegExp(regex)) { - // Use the native `RegExp` rather than `XRegExp` - regex = new RegExp(regex); - } else if (regex.global) { - var result = String.prototype.match.apply(this, arguments); // Fixes IE bug - - regex.lastIndex = 0; - return result; - } - - return fixed.exec.call(regex, nullThrows(this)); -}; -/** - * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement - * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also - * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex - * search value, and the value of a replacement regex's `lastIndex` property during replacement - * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third - * (`flags`) argument. Use via `XRegExp.replace`. - * - * @memberOf String - * @param {RegExp|String} search Search pattern to be replaced. - * @param {String|Function} replacement Replacement string or a function invoked to create it. - * @returns {string} New string with one or all matches replaced. - */ - - -fixed.replace = function (search, replacement) { - var isRegex = XRegExp.isRegExp(search); - var origLastIndex; - var captureNames; - var result; - - if (isRegex) { - if (search[REGEX_DATA]) { - captureNames = search[REGEX_DATA].captureNames; - } // Only needed if `search` is nonglobal - - - origLastIndex = search.lastIndex; - } else { - search += ''; // Type-convert - } // Don't use `typeof`; some older browsers return 'function' for regex objects - - - if (isType(replacement, 'Function')) { - // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement - // functions isn't type-converted to a string - result = String(this).replace(search, function () { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - if (captureNames) { - var groupsObject; - - if (XRegExp.isInstalled('namespacing')) { - // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec - groupsObject = (0, _create["default"])(null); - args.push(groupsObject); - } else { - // Change the `args[0]` string primitive to a `String` object that can store - // properties. This really does need to use `String` as a constructor - args[0] = new String(args[0]); - groupsObject = args[0]; - } // Store named backreferences - - - for (var i = 0; i < captureNames.length; ++i) { - if (captureNames[i]) { - groupsObject[captureNames[i]] = args[i + 1]; - } - } - } // ES6 specs the context for replacement functions as `undefined` - - - return replacement.apply(void 0, args); - }); - } else { - // Ensure that the last value of `args` will be a string when given nonstring `this`, - // while still throwing on null or undefined context - result = String(nullThrows(this)).replace(search, function () { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - return String(replacement).replace(replacementToken, replacer); - - function replacer($0, bracketed, angled, dollarToken) { - bracketed = bracketed || angled; // ES2018 added a new trailing `groups` arg that's passed to replacement functions - // when the search regex uses native named capture - - var numNonCaptureArgs = isType(args[args.length - 1], 'Object') ? 4 : 3; - var numCaptures = args.length - numNonCaptureArgs; // Handle named or numbered backreference with curly or angled braces: ${n}, $<n> - - if (bracketed) { - // Handle backreference to numbered capture, if `bracketed` is an integer. Use - // `0` for the entire match. Any number of leading zeros may be used. - if (/^\d+$/.test(bracketed)) { - // Type-convert and drop leading zeros - var _n = +bracketed; - - if (_n <= numCaptures) { - return args[_n] || ''; - } - } // Handle backreference to named capture. If the name does not refer to an - // existing capturing group, it's an error. Also handles the error for numbered - // backference that does not refer to an existing group. - // Using `indexOf` since having groups with the same name is already an error, - // otherwise would need `lastIndexOf`. - - - var n = captureNames ? (0, _indexOf["default"])(captureNames).call(captureNames, bracketed) : -1; - - if (n < 0) { - throw new SyntaxError("Backreference to undefined group ".concat($0)); - } - - return args[n + 1] || ''; - } // Handle `$`-prefixed variable - // Handle space/blank first because type conversion with `+` drops space padding - // and converts spaces and empty strings to `0` - - - if (dollarToken === '' || dollarToken === ' ') { - throw new SyntaxError("Invalid token ".concat($0)); - } - - if (dollarToken === '&' || +dollarToken === 0) { - // $&, $0 (not followed by 1-9), $00 - return args[0]; - } - - if (dollarToken === '$') { - // $$ - return '$'; - } - - if (dollarToken === '`') { - var _context4; - - // $` (left context) - return (0, _slice["default"])(_context4 = args[args.length - 1]).call(_context4, 0, args[args.length - 2]); - } - - if (dollarToken === "'") { - var _context5; - - // $' (right context) - return (0, _slice["default"])(_context5 = args[args.length - 1]).call(_context5, args[args.length - 2] + args[0].length); - } // Handle numbered backreference without braces - // Type-convert and drop leading zero - - - dollarToken = +dollarToken; // XRegExp behavior for `$n` and `$nn`: - // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits. - // - `$1` is an error if no capturing groups. - // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0` - // instead. - // - `$01` is `$1` if at least one capturing group, else it's an error. - // - `$0` (not followed by 1-9) and `$00` are the entire match. - // Native behavior, for comparison: - // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+. - // - `$1` is a literal `$1` if no capturing groups. - // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups. - // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`. - // - `$0` is a literal `$0`. - - if (!isNaN(dollarToken)) { - if (dollarToken > numCaptures) { - throw new SyntaxError("Backreference to undefined group ".concat($0)); - } - - return args[dollarToken] || ''; - } // `$` followed by an unsupported char is an error, unlike native JS - - - throw new SyntaxError("Invalid token ".concat($0)); - } - }); - } - - if (isRegex) { - if (search.global) { - // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) - search.lastIndex = 0; - } else { - // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) - search.lastIndex = origLastIndex; - } - } - - return result; -}; -/** - * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`. - * - * @memberOf String - * @param {RegExp|String} separator Regex or string to use for separating the string. - * @param {Number} [limit] Maximum number of items to include in the result array. - * @returns {!Array} Array of substrings. - */ - - -fixed.split = function (separator, limit) { - if (!XRegExp.isRegExp(separator)) { - // Browsers handle nonregex split correctly, so use the faster native method - return String.prototype.split.apply(this, arguments); - } - - var str = String(this); - var output = []; - var origLastIndex = separator.lastIndex; - var lastLastIndex = 0; - var lastLength; // Values for `limit`, per the spec: - // If undefined: pow(2,32) - 1 - // If 0, Infinity, or NaN: 0 - // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32); - // If negative number: pow(2,32) - floor(abs(limit)) - // If other: Type-convert, then use the above rules - // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless - // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+ - - limit = (limit === undefined ? -1 : limit) >>> 0; - (0, _forEach["default"])(XRegExp).call(XRegExp, str, separator, function (match) { - // This condition is not the same as `if (match[0].length)` - if (match.index + match[0].length > lastLastIndex) { - output.push((0, _slice["default"])(str).call(str, lastLastIndex, match.index)); - - if (match.length > 1 && match.index < str.length) { - Array.prototype.push.apply(output, (0, _slice["default"])(match).call(match, 1)); - } - - lastLength = match[0].length; - lastLastIndex = match.index + lastLength; - } - }); - - if (lastLastIndex === str.length) { - if (!separator.test('') || lastLength) { - output.push(''); - } - } else { - output.push((0, _slice["default"])(str).call(str, lastLastIndex)); - } - - separator.lastIndex = origLastIndex; - return output.length > limit ? (0, _slice["default"])(output).call(output, 0, limit) : output; -}; // ==--------------------------== -// Built-in syntax/flag tokens -// ==--------------------------== - -/* - * Letter escapes that natively match literal characters: `\a`, `\A`, etc. These should be - * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser - * consistency and to reserve their syntax, but lets them be superseded by addons. - */ - - -XRegExp.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/, function (match, scope) { - // \B is allowed in default scope only - if (match[1] === 'B' && scope === defaultScope) { - return match[0]; - } - - throw new SyntaxError("Invalid escape ".concat(match[0])); -}, { - scope: 'all', - leadChar: '\\' -}); -/* - * Unicode code point escape with curly braces: `\u{N..}`. `N..` is any one or more digit - * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag - * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to - * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior - * if you follow a `\u{N..}` token that references a code point above U+FFFF with a quantifier, or - * if you use the same in a character class. - */ - -XRegExp.addToken(/\\u{([\dA-Fa-f]+)}/, function (match, scope, flags) { - var code = dec(match[1]); - - if (code > 0x10FFFF) { - throw new SyntaxError("Invalid Unicode code point ".concat(match[0])); - } - - if (code <= 0xFFFF) { - // Converting to \uNNNN avoids needing to escape the literal character and keep it - // separate from preceding tokens - return "\\u".concat(pad4(hex(code))); - } // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling - - - if (hasNativeU && (0, _indexOf["default"])(flags).call(flags, 'u') !== -1) { - return match[0]; - } - - throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u'); -}, { - scope: 'all', - leadChar: '\\' -}); -/* - * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in - * free-spacing mode (flag x). - */ - -XRegExp.addToken(/\(\?#[^)]*\)/, getContextualTokenSeparator, { - leadChar: '(' -}); -/* - * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only. - */ - -XRegExp.addToken(/\s+|#[^\n]*\n?/, getContextualTokenSeparator, { - flag: 'x' -}); -/* - * Dot, in dotAll mode (aka singleline mode, flag s) only. - */ - -if (!hasNativeS) { - XRegExp.addToken(/\./, function () { - return '[\\s\\S]'; - }, { - flag: 's', - leadChar: '.' - }); -} -/* - * Named backreference: `\k<name>`. Backreference names can use RegExpIdentifierName characters - * only. Also allows numbered backreferences as `\k<n>`. - */ - - -XRegExp.addToken(/\\k<([^>]+)>/, function (match) { - var _context6, _context7; - - // Groups with the same name is an error, else would need `lastIndexOf` - var index = isNaN(match[1]) ? (0, _indexOf["default"])(_context6 = this.captureNames).call(_context6, match[1]) + 1 : +match[1]; - var endIndex = match.index + match[0].length; - - if (!index || index > this.captureNames.length) { - throw new SyntaxError("Backreference to undefined group ".concat(match[0])); - } // Keep backreferences separate from subsequent literal numbers. This avoids e.g. - // inadvertedly changing `(?<n>)\k<n>1` to `()\11`. - - - return (0, _concat["default"])(_context7 = "\\".concat(index)).call(_context7, endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)'); -}, { - leadChar: '\\' -}); -/* - * Numbered backreference or octal, plus any following digits: `\0`, `\11`, etc. Octals except `\0` - * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches - * are returned unaltered. IE < 9 doesn't support backreferences above `\99` in regex syntax. - */ - -XRegExp.addToken(/\\(\d+)/, function (match, scope) { - if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') { - throw new SyntaxError("Cannot use octal escape or backreference to undefined group ".concat(match[0])); - } - - return match[0]; -}, { - scope: 'all', - leadChar: '\\' -}); -/* - * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the - * RegExpIdentifierName characters only. Names can't be integers. Supports Python-style - * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively - * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to - * Python-style named capture as octals. - */ - -XRegExp.addToken(/\(\?P?<((?:[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])(?:[\$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u0870-\u0887\u0889-\u088E\u0898-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3C-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C5D\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDD\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1715\u171F-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B4C\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF50\uDF70-\uDF85\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC75\uDC7F-\uDCBA\uDCC2\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39\uDF40-\uDF46]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF6\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0\uDFF1]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAE\uDEC0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]|\uDB40[\uDD00-\uDDEF])*)>/, function (match) { - var _context8; - - if (!XRegExp.isInstalled('namespacing') && (match[1] === 'length' || match[1] === '__proto__')) { - throw new SyntaxError("Cannot use reserved word as capture name ".concat(match[0])); - } - - if ((0, _indexOf["default"])(_context8 = this.captureNames).call(_context8, match[1]) !== -1) { - throw new SyntaxError("Cannot use same name for multiple groups ".concat(match[0])); - } - - this.captureNames.push(match[1]); - this.hasNamedCapture = true; - return '('; -}, { - leadChar: '(' -}); -/* - * Capturing group; match the opening parenthesis only. Required for support of named capturing - * groups. Also adds named capture only mode (flag n). - */ - -XRegExp.addToken(/\((?!\?)/, function (match, scope, flags) { - if ((0, _indexOf["default"])(flags).call(flags, 'n') !== -1) { - return '(?:'; - } - - this.captureNames.push(null); - return '('; -}, { - optionalFlags: 'n', - leadChar: '(' -}); -var _default = XRegExp; -exports["default"] = _default; -module.exports = exports.default; -},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/flags":8,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/instance/sort":12,"@babel/runtime-corejs3/core-js-stable/object/create":13,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/parse-int":15,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],5:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/array/from"); -},{"core-js-pure/stable/array/from":208}],6:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/array/is-array"); -},{"core-js-pure/stable/array/is-array":209}],7:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/concat"); -},{"core-js-pure/stable/instance/concat":212}],8:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/flags"); -},{"core-js-pure/stable/instance/flags":213}],9:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/for-each"); -},{"core-js-pure/stable/instance/for-each":214}],10:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/index-of"); -},{"core-js-pure/stable/instance/index-of":215}],11:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/slice"); -},{"core-js-pure/stable/instance/slice":216}],12:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/sort"); -},{"core-js-pure/stable/instance/sort":217}],13:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/object/create"); -},{"core-js-pure/stable/object/create":218}],14:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/object/define-property"); -},{"core-js-pure/stable/object/define-property":219}],15:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/parse-int"); -},{"core-js-pure/stable/parse-int":220}],16:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/symbol"); -},{"core-js-pure/stable/symbol":221}],17:[function(require,module,exports){ -module.exports = require("core-js-pure/features/array/from"); -},{"core-js-pure/features/array/from":52}],18:[function(require,module,exports){ -module.exports = require("core-js-pure/features/array/is-array"); -},{"core-js-pure/features/array/is-array":53}],19:[function(require,module,exports){ -module.exports = require("core-js-pure/features/get-iterator-method"); -},{"core-js-pure/features/get-iterator-method":54}],20:[function(require,module,exports){ -module.exports = require("core-js-pure/features/instance/slice"); -},{"core-js-pure/features/instance/slice":55}],21:[function(require,module,exports){ -module.exports = require("core-js-pure/features/symbol"); -},{"core-js-pure/features/symbol":56}],22:[function(require,module,exports){ -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{}],23:[function(require,module,exports){ -var _Array$isArray = require("@babel/runtime-corejs3/core-js/array/is-array"); - -function _arrayWithHoles(arr) { - if (_Array$isArray(arr)) return arr; -} - -module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{"@babel/runtime-corejs3/core-js/array/is-array":18}],24:[function(require,module,exports){ -function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - "default": obj - }; -} - -module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{}],25:[function(require,module,exports){ -var _Symbol = require("@babel/runtime-corejs3/core-js/symbol"); - -var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method"); - -function _iterableToArrayLimit(arr, i) { - var _i = arr == null ? null : typeof _Symbol !== "undefined" && _getIteratorMethod(arr) || arr["@@iterator"]; - - if (_i == null) return; - var _arr = []; - var _n = true; - var _d = false; - - var _s, _e; - - try { - for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; -} - -module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/core-js/symbol":21}],26:[function(require,module,exports){ -function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{}],27:[function(require,module,exports){ -var arrayWithHoles = require("./arrayWithHoles.js"); - -var iterableToArrayLimit = require("./iterableToArrayLimit.js"); - -var unsupportedIterableToArray = require("./unsupportedIterableToArray.js"); - -var nonIterableRest = require("./nonIterableRest.js"); - -function _slicedToArray(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest(); -} - -module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{"./arrayWithHoles.js":23,"./iterableToArrayLimit.js":25,"./nonIterableRest.js":26,"./unsupportedIterableToArray.js":28}],28:[function(require,module,exports){ -var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js/instance/slice"); - -var _Array$from = require("@babel/runtime-corejs3/core-js/array/from"); - -var arrayLikeToArray = require("./arrayLikeToArray.js"); - -function _unsupportedIterableToArray(o, minLen) { - var _context; - - if (!o) return; - if (typeof o === "string") return arrayLikeToArray(o, minLen); - - var n = _sliceInstanceProperty(_context = Object.prototype.toString.call(o)).call(_context, 8, -1); - - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return _Array$from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); -} - -module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{"./arrayLikeToArray.js":22,"@babel/runtime-corejs3/core-js/array/from":17,"@babel/runtime-corejs3/core-js/instance/slice":20}],29:[function(require,module,exports){ -var parent = require('../../stable/array/from'); - -module.exports = parent; - -},{"../../stable/array/from":208}],30:[function(require,module,exports){ -var parent = require('../../stable/array/is-array'); - -module.exports = parent; - -},{"../../stable/array/is-array":209}],31:[function(require,module,exports){ -var parent = require('../stable/get-iterator-method'); - -module.exports = parent; - -},{"../stable/get-iterator-method":211}],32:[function(require,module,exports){ -var parent = require('../../stable/instance/slice'); - -module.exports = parent; - -},{"../../stable/instance/slice":216}],33:[function(require,module,exports){ -var parent = require('../../stable/symbol'); - -module.exports = parent; - -},{"../../stable/symbol":221}],34:[function(require,module,exports){ -require('../../modules/es.string.iterator'); -require('../../modules/es.array.from'); -var path = require('../../internals/path'); - -module.exports = path.Array.from; - -},{"../../internals/path":142,"../../modules/es.array.from":170,"../../modules/es.string.iterator":184}],35:[function(require,module,exports){ -require('../../modules/es.array.is-array'); -var path = require('../../internals/path'); - -module.exports = path.Array.isArray; - -},{"../../internals/path":142,"../../modules/es.array.is-array":172}],36:[function(require,module,exports){ -require('../../../modules/es.array.concat'); -var entryVirtual = require('../../../internals/entry-virtual'); - -module.exports = entryVirtual('Array').concat; - -},{"../../../internals/entry-virtual":91,"../../../modules/es.array.concat":168}],37:[function(require,module,exports){ -require('../../../modules/es.array.for-each'); -var entryVirtual = require('../../../internals/entry-virtual'); - -module.exports = entryVirtual('Array').forEach; - -},{"../../../internals/entry-virtual":91,"../../../modules/es.array.for-each":169}],38:[function(require,module,exports){ -require('../../../modules/es.array.index-of'); -var entryVirtual = require('../../../internals/entry-virtual'); - -module.exports = entryVirtual('Array').indexOf; - -},{"../../../internals/entry-virtual":91,"../../../modules/es.array.index-of":171}],39:[function(require,module,exports){ -require('../../../modules/es.array.slice'); -var entryVirtual = require('../../../internals/entry-virtual'); - -module.exports = entryVirtual('Array').slice; - -},{"../../../internals/entry-virtual":91,"../../../modules/es.array.slice":174}],40:[function(require,module,exports){ -require('../../../modules/es.array.sort'); -var entryVirtual = require('../../../internals/entry-virtual'); - -module.exports = entryVirtual('Array').sort; - -},{"../../../internals/entry-virtual":91,"../../../modules/es.array.sort":175}],41:[function(require,module,exports){ -require('../modules/es.array.iterator'); -require('../modules/es.string.iterator'); -var getIteratorMethod = require('../internals/get-iterator-method'); - -module.exports = getIteratorMethod; - -},{"../internals/get-iterator-method":101,"../modules/es.array.iterator":173,"../modules/es.string.iterator":184}],42:[function(require,module,exports){ -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var method = require('../array/virtual/concat'); - -var ArrayPrototype = Array.prototype; - -module.exports = function (it) { - var own = it.concat; - return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.concat) ? method : own; -}; - -},{"../../internals/object-is-prototype-of":135,"../array/virtual/concat":36}],43:[function(require,module,exports){ -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var flags = require('../regexp/flags'); - -var RegExpPrototype = RegExp.prototype; - -module.exports = function (it) { - return (it === RegExpPrototype || isPrototypeOf(RegExpPrototype, it)) ? flags(it) : it.flags; -}; - -},{"../../internals/object-is-prototype-of":135,"../regexp/flags":50}],44:[function(require,module,exports){ -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var method = require('../array/virtual/index-of'); - -var ArrayPrototype = Array.prototype; - -module.exports = function (it) { - var own = it.indexOf; - return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.indexOf) ? method : own; -}; - -},{"../../internals/object-is-prototype-of":135,"../array/virtual/index-of":38}],45:[function(require,module,exports){ -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var method = require('../array/virtual/slice'); - -var ArrayPrototype = Array.prototype; - -module.exports = function (it) { - var own = it.slice; - return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.slice) ? method : own; -}; - -},{"../../internals/object-is-prototype-of":135,"../array/virtual/slice":39}],46:[function(require,module,exports){ -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var method = require('../array/virtual/sort'); - -var ArrayPrototype = Array.prototype; - -module.exports = function (it) { - var own = it.sort; - return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.sort) ? method : own; -}; - -},{"../../internals/object-is-prototype-of":135,"../array/virtual/sort":40}],47:[function(require,module,exports){ -require('../../modules/es.object.create'); -var path = require('../../internals/path'); - -var Object = path.Object; - -module.exports = function create(P, D) { - return Object.create(P, D); -}; - -},{"../../internals/path":142,"../../modules/es.object.create":178}],48:[function(require,module,exports){ -require('../../modules/es.object.define-property'); -var path = require('../../internals/path'); - -var Object = path.Object; - -var defineProperty = module.exports = function defineProperty(it, key, desc) { - return Object.defineProperty(it, key, desc); -}; - -if (Object.defineProperty.sham) defineProperty.sham = true; - -},{"../../internals/path":142,"../../modules/es.object.define-property":179}],49:[function(require,module,exports){ -require('../modules/es.parse-int'); -var path = require('../internals/path'); - -module.exports = path.parseInt; - -},{"../internals/path":142,"../modules/es.parse-int":181}],50:[function(require,module,exports){ -require('../../modules/es.regexp.flags'); -var uncurryThis = require('../../internals/function-uncurry-this'); -var regExpFlags = require('../../internals/regexp-flags'); - -module.exports = uncurryThis(regExpFlags); - -},{"../../internals/function-uncurry-this":99,"../../internals/regexp-flags":144,"../../modules/es.regexp.flags":183}],51:[function(require,module,exports){ -require('../../modules/es.array.concat'); -require('../../modules/es.object.to-string'); -require('../../modules/es.symbol'); -require('../../modules/es.symbol.async-iterator'); -require('../../modules/es.symbol.description'); -require('../../modules/es.symbol.has-instance'); -require('../../modules/es.symbol.is-concat-spreadable'); -require('../../modules/es.symbol.iterator'); -require('../../modules/es.symbol.match'); -require('../../modules/es.symbol.match-all'); -require('../../modules/es.symbol.replace'); -require('../../modules/es.symbol.search'); -require('../../modules/es.symbol.species'); -require('../../modules/es.symbol.split'); -require('../../modules/es.symbol.to-primitive'); -require('../../modules/es.symbol.to-string-tag'); -require('../../modules/es.symbol.unscopables'); -require('../../modules/es.json.to-string-tag'); -require('../../modules/es.math.to-string-tag'); -require('../../modules/es.reflect.to-string-tag'); -var path = require('../../internals/path'); - -module.exports = path.Symbol; - -},{"../../internals/path":142,"../../modules/es.array.concat":168,"../../modules/es.json.to-string-tag":176,"../../modules/es.math.to-string-tag":177,"../../modules/es.object.to-string":180,"../../modules/es.reflect.to-string-tag":182,"../../modules/es.symbol":190,"../../modules/es.symbol.async-iterator":185,"../../modules/es.symbol.description":186,"../../modules/es.symbol.has-instance":187,"../../modules/es.symbol.is-concat-spreadable":188,"../../modules/es.symbol.iterator":189,"../../modules/es.symbol.match":192,"../../modules/es.symbol.match-all":191,"../../modules/es.symbol.replace":193,"../../modules/es.symbol.search":194,"../../modules/es.symbol.species":195,"../../modules/es.symbol.split":196,"../../modules/es.symbol.to-primitive":197,"../../modules/es.symbol.to-string-tag":198,"../../modules/es.symbol.unscopables":199}],52:[function(require,module,exports){ -var parent = require('../../actual/array/from'); - -module.exports = parent; - -},{"../../actual/array/from":29}],53:[function(require,module,exports){ -var parent = require('../../actual/array/is-array'); - -module.exports = parent; - -},{"../../actual/array/is-array":30}],54:[function(require,module,exports){ -var parent = require('../actual/get-iterator-method'); - -module.exports = parent; - -},{"../actual/get-iterator-method":31}],55:[function(require,module,exports){ -var parent = require('../../actual/instance/slice'); - -module.exports = parent; - -},{"../../actual/instance/slice":32}],56:[function(require,module,exports){ -var parent = require('../../actual/symbol'); -require('../../modules/esnext.symbol.async-dispose'); -require('../../modules/esnext.symbol.dispose'); -require('../../modules/esnext.symbol.matcher'); -require('../../modules/esnext.symbol.metadata'); -require('../../modules/esnext.symbol.observable'); -// TODO: Remove from `core-js@4` -require('../../modules/esnext.symbol.pattern-match'); -// TODO: Remove from `core-js@4` -require('../../modules/esnext.symbol.replace-all'); - -module.exports = parent; - -},{"../../actual/symbol":33,"../../modules/esnext.symbol.async-dispose":200,"../../modules/esnext.symbol.dispose":201,"../../modules/esnext.symbol.matcher":202,"../../modules/esnext.symbol.metadata":203,"../../modules/esnext.symbol.observable":204,"../../modules/esnext.symbol.pattern-match":205,"../../modules/esnext.symbol.replace-all":206}],57:[function(require,module,exports){ -var global = require('../internals/global'); -var isCallable = require('../internals/is-callable'); -var tryToString = require('../internals/try-to-string'); - -var TypeError = global.TypeError; - -// `Assert: IsCallable(argument) is true` -module.exports = function (argument) { - if (isCallable(argument)) return argument; - throw TypeError(tryToString(argument) + ' is not a function'); -}; - -},{"../internals/global":104,"../internals/is-callable":114,"../internals/try-to-string":162}],58:[function(require,module,exports){ -var global = require('../internals/global'); -var isCallable = require('../internals/is-callable'); - -var String = global.String; -var TypeError = global.TypeError; - -module.exports = function (argument) { - if (typeof argument == 'object' || isCallable(argument)) return argument; - throw TypeError("Can't set " + String(argument) + ' as a prototype'); -}; - -},{"../internals/global":104,"../internals/is-callable":114}],59:[function(require,module,exports){ -module.exports = function () { /* empty */ }; - -},{}],60:[function(require,module,exports){ -var global = require('../internals/global'); -var isObject = require('../internals/is-object'); - -var String = global.String; -var TypeError = global.TypeError; - -// `Assert: Type(argument) is Object` -module.exports = function (argument) { - if (isObject(argument)) return argument; - throw TypeError(String(argument) + ' is not an object'); -}; - -},{"../internals/global":104,"../internals/is-object":117}],61:[function(require,module,exports){ -'use strict'; -var $forEach = require('../internals/array-iteration').forEach; -var arrayMethodIsStrict = require('../internals/array-method-is-strict'); - -var STRICT_METHOD = arrayMethodIsStrict('forEach'); - -// `Array.prototype.forEach` method implementation -// https://tc39.es/ecma262/#sec-array.prototype.foreach -module.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) { - return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); -// eslint-disable-next-line es/no-array-prototype-foreach -- safe -} : [].forEach; - -},{"../internals/array-iteration":64,"../internals/array-method-is-strict":66}],62:[function(require,module,exports){ -'use strict'; -var global = require('../internals/global'); -var bind = require('../internals/function-bind-context'); -var call = require('../internals/function-call'); -var toObject = require('../internals/to-object'); -var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing'); -var isArrayIteratorMethod = require('../internals/is-array-iterator-method'); -var isConstructor = require('../internals/is-constructor'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var createProperty = require('../internals/create-property'); -var getIterator = require('../internals/get-iterator'); -var getIteratorMethod = require('../internals/get-iterator-method'); - -var Array = global.Array; - -// `Array.from` method implementation -// https://tc39.es/ecma262/#sec-array.from -module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { - var O = toObject(arrayLike); - var IS_CONSTRUCTOR = isConstructor(this); - var argumentsLength = arguments.length; - var mapfn = argumentsLength > 1 ? arguments[1] : undefined; - var mapping = mapfn !== undefined; - if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined); - var iteratorMethod = getIteratorMethod(O); - var index = 0; - var length, result, step, iterator, next, value; - // if the target is not iterable or it's an array with the default iterator - use a simple case - if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) { - iterator = getIterator(O, iteratorMethod); - next = iterator.next; - result = IS_CONSTRUCTOR ? new this() : []; - for (;!(step = call(next, iterator)).done; index++) { - value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value; - createProperty(result, index, value); - } - } else { - length = lengthOfArrayLike(O); - result = IS_CONSTRUCTOR ? new this(length) : Array(length); - for (;length > index; index++) { - value = mapping ? mapfn(O[index], index) : O[index]; - createProperty(result, index, value); - } - } - result.length = index; - return result; -}; - -},{"../internals/call-with-safe-iteration-closing":72,"../internals/create-property":80,"../internals/function-bind-context":96,"../internals/function-call":97,"../internals/get-iterator":102,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/is-array-iterator-method":112,"../internals/is-constructor":115,"../internals/length-of-array-like":123,"../internals/to-object":157}],63:[function(require,module,exports){ -var toIndexedObject = require('../internals/to-indexed-object'); -var toAbsoluteIndex = require('../internals/to-absolute-index'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); - -// `Array.prototype.{ indexOf, includes }` methods implementation -var createMethod = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIndexedObject($this); - var length = lengthOfArrayLike(O); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare -- NaN check - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare -- NaN check - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) { - if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - -module.exports = { - // `Array.prototype.includes` method - // https://tc39.es/ecma262/#sec-array.prototype.includes - includes: createMethod(true), - // `Array.prototype.indexOf` method - // https://tc39.es/ecma262/#sec-array.prototype.indexof - indexOf: createMethod(false) -}; - -},{"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154}],64:[function(require,module,exports){ -var bind = require('../internals/function-bind-context'); -var uncurryThis = require('../internals/function-uncurry-this'); -var IndexedObject = require('../internals/indexed-object'); -var toObject = require('../internals/to-object'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var arraySpeciesCreate = require('../internals/array-species-create'); - -var push = uncurryThis([].push); - -// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation -var createMethod = function (TYPE) { - var IS_MAP = TYPE == 1; - var IS_FILTER = TYPE == 2; - var IS_SOME = TYPE == 3; - var IS_EVERY = TYPE == 4; - var IS_FIND_INDEX = TYPE == 6; - var IS_FILTER_REJECT = TYPE == 7; - var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; - return function ($this, callbackfn, that, specificCreate) { - var O = toObject($this); - var self = IndexedObject(O); - var boundFunction = bind(callbackfn, that); - var length = lengthOfArrayLike(self); - var index = 0; - var create = specificCreate || arraySpeciesCreate; - var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined; - var value, result; - for (;length > index; index++) if (NO_HOLES || index in self) { - value = self[index]; - result = boundFunction(value, index, O); - if (TYPE) { - if (IS_MAP) target[index] = result; // map - else if (result) switch (TYPE) { - case 3: return true; // some - case 5: return value; // find - case 6: return index; // findIndex - case 2: push(target, value); // filter - } else switch (TYPE) { - case 4: return false; // every - case 7: push(target, value); // filterReject - } - } - } - return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; - }; -}; - -module.exports = { - // `Array.prototype.forEach` method - // https://tc39.es/ecma262/#sec-array.prototype.foreach - forEach: createMethod(0), - // `Array.prototype.map` method - // https://tc39.es/ecma262/#sec-array.prototype.map - map: createMethod(1), - // `Array.prototype.filter` method - // https://tc39.es/ecma262/#sec-array.prototype.filter - filter: createMethod(2), - // `Array.prototype.some` method - // https://tc39.es/ecma262/#sec-array.prototype.some - some: createMethod(3), - // `Array.prototype.every` method - // https://tc39.es/ecma262/#sec-array.prototype.every - every: createMethod(4), - // `Array.prototype.find` method - // https://tc39.es/ecma262/#sec-array.prototype.find - find: createMethod(5), - // `Array.prototype.findIndex` method - // https://tc39.es/ecma262/#sec-array.prototype.findIndex - findIndex: createMethod(6), - // `Array.prototype.filterReject` method - // https://github.com/tc39/proposal-array-filtering - filterReject: createMethod(7) -}; - -},{"../internals/array-species-create":71,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/indexed-object":109,"../internals/length-of-array-like":123,"../internals/to-object":157}],65:[function(require,module,exports){ -var fails = require('../internals/fails'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var V8_VERSION = require('../internals/engine-v8-version'); - -var SPECIES = wellKnownSymbol('species'); - -module.exports = function (METHOD_NAME) { - // We can't use this feature detection in V8 since it causes - // deoptimization and serious performance degradation - // https://github.com/zloirock/core-js/issues/677 - return V8_VERSION >= 51 || !fails(function () { - var array = []; - var constructor = array.constructor = {}; - constructor[SPECIES] = function () { - return { foo: 1 }; - }; - return array[METHOD_NAME](Boolean).foo !== 1; - }); -}; - -},{"../internals/engine-v8-version":89,"../internals/fails":94,"../internals/well-known-symbol":166}],66:[function(require,module,exports){ -'use strict'; -var fails = require('../internals/fails'); - -module.exports = function (METHOD_NAME, argument) { - var method = [][METHOD_NAME]; - return !!method && fails(function () { - // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing - method.call(null, argument || function () { throw 1; }, 1); - }); -}; - -},{"../internals/fails":94}],67:[function(require,module,exports){ -var global = require('../internals/global'); -var toAbsoluteIndex = require('../internals/to-absolute-index'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var createProperty = require('../internals/create-property'); - -var Array = global.Array; -var max = Math.max; - -module.exports = function (O, start, end) { - var length = lengthOfArrayLike(O); - var k = toAbsoluteIndex(start, length); - var fin = toAbsoluteIndex(end === undefined ? length : end, length); - var result = Array(max(fin - k, 0)); - for (var n = 0; k < fin; k++, n++) createProperty(result, n, O[k]); - result.length = n; - return result; -}; - -},{"../internals/create-property":80,"../internals/global":104,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153}],68:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); - -module.exports = uncurryThis([].slice); - -},{"../internals/function-uncurry-this":99}],69:[function(require,module,exports){ -var arraySlice = require('../internals/array-slice-simple'); - -var floor = Math.floor; - -var mergeSort = function (array, comparefn) { - var length = array.length; - var middle = floor(length / 2); - return length < 8 ? insertionSort(array, comparefn) : merge( - array, - mergeSort(arraySlice(array, 0, middle), comparefn), - mergeSort(arraySlice(array, middle), comparefn), - comparefn - ); -}; - -var insertionSort = function (array, comparefn) { - var length = array.length; - var i = 1; - var element, j; - - while (i < length) { - j = i; - element = array[i]; - while (j && comparefn(array[j - 1], element) > 0) { - array[j] = array[--j]; - } - if (j !== i++) array[j] = element; - } return array; -}; - -var merge = function (array, left, right, comparefn) { - var llength = left.length; - var rlength = right.length; - var lindex = 0; - var rindex = 0; - - while (lindex < llength || rindex < rlength) { - array[lindex + rindex] = (lindex < llength && rindex < rlength) - ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++] - : lindex < llength ? left[lindex++] : right[rindex++]; - } return array; -}; - -module.exports = mergeSort; - -},{"../internals/array-slice-simple":67}],70:[function(require,module,exports){ -var global = require('../internals/global'); -var isArray = require('../internals/is-array'); -var isConstructor = require('../internals/is-constructor'); -var isObject = require('../internals/is-object'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var SPECIES = wellKnownSymbol('species'); -var Array = global.Array; - -// a part of `ArraySpeciesCreate` abstract operation -// https://tc39.es/ecma262/#sec-arrayspeciescreate -module.exports = function (originalArray) { - var C; - if (isArray(originalArray)) { - C = originalArray.constructor; - // cross-realm fallback - if (isConstructor(C) && (C === Array || isArray(C.prototype))) C = undefined; - else if (isObject(C)) { - C = C[SPECIES]; - if (C === null) C = undefined; - } - } return C === undefined ? Array : C; -}; - -},{"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/well-known-symbol":166}],71:[function(require,module,exports){ -var arraySpeciesConstructor = require('../internals/array-species-constructor'); - -// `ArraySpeciesCreate` abstract operation -// https://tc39.es/ecma262/#sec-arrayspeciescreate -module.exports = function (originalArray, length) { - return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length); -}; - -},{"../internals/array-species-constructor":70}],72:[function(require,module,exports){ -var anObject = require('../internals/an-object'); -var iteratorClose = require('../internals/iterator-close'); - -// call something on iterator step with safe closing on error -module.exports = function (iterator, fn, value, ENTRIES) { - try { - return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); - } catch (error) { - iteratorClose(iterator, 'throw', error); - } -}; - -},{"../internals/an-object":60,"../internals/iterator-close":120}],73:[function(require,module,exports){ -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var ITERATOR = wellKnownSymbol('iterator'); -var SAFE_CLOSING = false; - -try { - var called = 0; - var iteratorWithReturn = { - next: function () { - return { done: !!called++ }; - }, - 'return': function () { - SAFE_CLOSING = true; - } - }; - iteratorWithReturn[ITERATOR] = function () { - return this; - }; - // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing - Array.from(iteratorWithReturn, function () { throw 2; }); -} catch (error) { /* empty */ } - -module.exports = function (exec, SKIP_CLOSING) { - if (!SKIP_CLOSING && !SAFE_CLOSING) return false; - var ITERATION_SUPPORT = false; - try { - var object = {}; - object[ITERATOR] = function () { - return { - next: function () { - return { done: ITERATION_SUPPORT = true }; - } - }; - }; - exec(object); - } catch (error) { /* empty */ } - return ITERATION_SUPPORT; -}; - -},{"../internals/well-known-symbol":166}],74:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); - -var toString = uncurryThis({}.toString); -var stringSlice = uncurryThis(''.slice); - -module.exports = function (it) { - return stringSlice(toString(it), 8, -1); -}; - -},{"../internals/function-uncurry-this":99}],75:[function(require,module,exports){ -var global = require('../internals/global'); -var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support'); -var isCallable = require('../internals/is-callable'); -var classofRaw = require('../internals/classof-raw'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var Object = global.Object; - -// ES3 wrong here -var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function (it, key) { - try { - return it[key]; - } catch (error) { /* empty */ } -}; - -// getting tag from ES6+ `Object.prototype.toString` -module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { - var O, tag, result; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag - // builtinTag case - : CORRECT_ARGUMENTS ? classofRaw(O) - // ES3 arguments fallback - : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; -}; - -},{"../internals/classof-raw":74,"../internals/global":104,"../internals/is-callable":114,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],76:[function(require,module,exports){ -var fails = require('../internals/fails'); - -module.exports = !fails(function () { - function F() { /* empty */ } - F.prototype.constructor = null; - // eslint-disable-next-line es/no-object-getprototypeof -- required for testing - return Object.getPrototypeOf(new F()) !== F.prototype; -}); - -},{"../internals/fails":94}],77:[function(require,module,exports){ -'use strict'; -var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype; -var create = require('../internals/object-create'); -var createPropertyDescriptor = require('../internals/create-property-descriptor'); -var setToStringTag = require('../internals/set-to-string-tag'); -var Iterators = require('../internals/iterators'); - -var returnThis = function () { return this; }; - -module.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) { - var TO_STRING_TAG = NAME + ' Iterator'; - IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) }); - setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); - Iterators[TO_STRING_TAG] = returnThis; - return IteratorConstructor; -}; - -},{"../internals/create-property-descriptor":79,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-create":127,"../internals/set-to-string-tag":147}],78:[function(require,module,exports){ -var DESCRIPTORS = require('../internals/descriptors'); -var definePropertyModule = require('../internals/object-define-property'); -var createPropertyDescriptor = require('../internals/create-property-descriptor'); - -module.exports = DESCRIPTORS ? function (object, key, value) { - return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; - -},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/object-define-property":129}],79:[function(require,module,exports){ -module.exports = function (bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value: value - }; -}; - -},{}],80:[function(require,module,exports){ -'use strict'; -var toPropertyKey = require('../internals/to-property-key'); -var definePropertyModule = require('../internals/object-define-property'); -var createPropertyDescriptor = require('../internals/create-property-descriptor'); - -module.exports = function (object, key, value) { - var propertyKey = toPropertyKey(key); - if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); - else object[propertyKey] = value; -}; - -},{"../internals/create-property-descriptor":79,"../internals/object-define-property":129,"../internals/to-property-key":159}],81:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var call = require('../internals/function-call'); -var IS_PURE = require('../internals/is-pure'); -var FunctionName = require('../internals/function-name'); -var isCallable = require('../internals/is-callable'); -var createIteratorConstructor = require('../internals/create-iterator-constructor'); -var getPrototypeOf = require('../internals/object-get-prototype-of'); -var setPrototypeOf = require('../internals/object-set-prototype-of'); -var setToStringTag = require('../internals/set-to-string-tag'); -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); -var redefine = require('../internals/redefine'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var Iterators = require('../internals/iterators'); -var IteratorsCore = require('../internals/iterators-core'); - -var PROPER_FUNCTION_NAME = FunctionName.PROPER; -var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; -var IteratorPrototype = IteratorsCore.IteratorPrototype; -var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; -var ITERATOR = wellKnownSymbol('iterator'); -var KEYS = 'keys'; -var VALUES = 'values'; -var ENTRIES = 'entries'; - -var returnThis = function () { return this; }; - -module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { - createIteratorConstructor(IteratorConstructor, NAME, next); - - var getIterationMethod = function (KIND) { - if (KIND === DEFAULT && defaultIterator) return defaultIterator; - if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; - switch (KIND) { - case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; - case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; - case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; - } return function () { return new IteratorConstructor(this); }; - }; - - var TO_STRING_TAG = NAME + ' Iterator'; - var INCORRECT_VALUES_NAME = false; - var IterablePrototype = Iterable.prototype; - var nativeIterator = IterablePrototype[ITERATOR] - || IterablePrototype['@@iterator'] - || DEFAULT && IterablePrototype[DEFAULT]; - var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); - var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; - var CurrentIteratorPrototype, methods, KEY; - - // fix native - if (anyNativeIterator) { - CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); - if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { - if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { - if (setPrototypeOf) { - setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); - } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { - redefine(CurrentIteratorPrototype, ITERATOR, returnThis); - } - } - // Set @@toStringTag to native iterators - setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); - if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; - } - } - - // fix Array.prototype.{ values, @@iterator }.name in V8 / FF - if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { - if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { - createNonEnumerableProperty(IterablePrototype, 'name', VALUES); - } else { - INCORRECT_VALUES_NAME = true; - defaultIterator = function values() { return call(nativeIterator, this); }; - } - } - - // export additional methods - if (DEFAULT) { - methods = { - values: getIterationMethod(VALUES), - keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), - entries: getIterationMethod(ENTRIES) - }; - if (FORCED) for (KEY in methods) { - if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { - redefine(IterablePrototype, KEY, methods[KEY]); - } - } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); - } - - // define iterator - if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { - redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); - } - Iterators[NAME] = defaultIterator; - - return methods; -}; - -},{"../internals/create-iterator-constructor":77,"../internals/create-non-enumerable-property":78,"../internals/export":93,"../internals/function-call":97,"../internals/function-name":98,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-get-prototype-of":134,"../internals/object-set-prototype-of":139,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/well-known-symbol":166}],82:[function(require,module,exports){ -var path = require('../internals/path'); -var hasOwn = require('../internals/has-own-property'); -var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped'); -var defineProperty = require('../internals/object-define-property').f; - -module.exports = function (NAME) { - var Symbol = path.Symbol || (path.Symbol = {}); - if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, { - value: wrappedWellKnownSymbolModule.f(NAME) - }); -}; - -},{"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/path":142,"../internals/well-known-symbol-wrapped":165}],83:[function(require,module,exports){ -var fails = require('../internals/fails'); - -// Detect IE8's incomplete defineProperty implementation -module.exports = !fails(function () { - // eslint-disable-next-line es/no-object-defineproperty -- required for testing - return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; -}); - -},{"../internals/fails":94}],84:[function(require,module,exports){ -var global = require('../internals/global'); -var isObject = require('../internals/is-object'); - -var document = global.document; -// typeof document.createElement is 'object' in old IE -var EXISTS = isObject(document) && isObject(document.createElement); - -module.exports = function (it) { - return EXISTS ? document.createElement(it) : {}; -}; - -},{"../internals/global":104,"../internals/is-object":117}],85:[function(require,module,exports){ -// iterable DOM collections -// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods -module.exports = { - CSSRuleList: 0, - CSSStyleDeclaration: 0, - CSSValueList: 0, - ClientRectList: 0, - DOMRectList: 0, - DOMStringList: 0, - DOMTokenList: 1, - DataTransferItemList: 0, - FileList: 0, - HTMLAllCollection: 0, - HTMLCollection: 0, - HTMLFormElement: 0, - HTMLSelectElement: 0, - MediaList: 0, - MimeTypeArray: 0, - NamedNodeMap: 0, - NodeList: 1, - PaintRequestList: 0, - Plugin: 0, - PluginArray: 0, - SVGLengthList: 0, - SVGNumberList: 0, - SVGPathSegList: 0, - SVGPointList: 0, - SVGStringList: 0, - SVGTransformList: 0, - SourceBufferList: 0, - StyleSheetList: 0, - TextTrackCueList: 0, - TextTrackList: 0, - TouchList: 0 -}; - -},{}],86:[function(require,module,exports){ -var userAgent = require('../internals/engine-user-agent'); - -var firefox = userAgent.match(/firefox\/(\d+)/i); - -module.exports = !!firefox && +firefox[1]; - -},{"../internals/engine-user-agent":88}],87:[function(require,module,exports){ -var UA = require('../internals/engine-user-agent'); - -module.exports = /MSIE|Trident/.test(UA); - -},{"../internals/engine-user-agent":88}],88:[function(require,module,exports){ -var getBuiltIn = require('../internals/get-built-in'); - -module.exports = getBuiltIn('navigator', 'userAgent') || ''; - -},{"../internals/get-built-in":100}],89:[function(require,module,exports){ -var global = require('../internals/global'); -var userAgent = require('../internals/engine-user-agent'); - -var process = global.process; -var Deno = global.Deno; -var versions = process && process.versions || Deno && Deno.version; -var v8 = versions && versions.v8; -var match, version; - -if (v8) { - match = v8.split('.'); - // in old Chrome, versions of V8 isn't V8 = Chrome / 10 - // but their correct versions are not interesting for us - version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); -} - -// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` -// so check `userAgent` even if `.v8` exists, but 0 -if (!version && userAgent) { - match = userAgent.match(/Edge\/(\d+)/); - if (!match || match[1] >= 74) { - match = userAgent.match(/Chrome\/(\d+)/); - if (match) version = +match[1]; - } -} - -module.exports = version; - -},{"../internals/engine-user-agent":88,"../internals/global":104}],90:[function(require,module,exports){ -var userAgent = require('../internals/engine-user-agent'); - -var webkit = userAgent.match(/AppleWebKit\/(\d+)\./); - -module.exports = !!webkit && +webkit[1]; - -},{"../internals/engine-user-agent":88}],91:[function(require,module,exports){ -var path = require('../internals/path'); - -module.exports = function (CONSTRUCTOR) { - return path[CONSTRUCTOR + 'Prototype']; -}; - -},{"../internals/path":142}],92:[function(require,module,exports){ -// IE8- don't enum bug keys -module.exports = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' -]; - -},{}],93:[function(require,module,exports){ -'use strict'; -var global = require('../internals/global'); -var apply = require('../internals/function-apply'); -var uncurryThis = require('../internals/function-uncurry-this'); -var isCallable = require('../internals/is-callable'); -var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f; -var isForced = require('../internals/is-forced'); -var path = require('../internals/path'); -var bind = require('../internals/function-bind-context'); -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); -var hasOwn = require('../internals/has-own-property'); - -var wrapConstructor = function (NativeConstructor) { - var Wrapper = function (a, b, c) { - if (this instanceof Wrapper) { - switch (arguments.length) { - case 0: return new NativeConstructor(); - case 1: return new NativeConstructor(a); - case 2: return new NativeConstructor(a, b); - } return new NativeConstructor(a, b, c); - } return apply(NativeConstructor, this, arguments); - }; - Wrapper.prototype = NativeConstructor.prototype; - return Wrapper; -}; - -/* - options.target - name of the target object - options.global - target is the global object - options.stat - export as static methods of target - options.proto - export as prototype methods of target - options.real - real prototype method for the `pure` version - options.forced - export even if the native feature is available - options.bind - bind methods to the target, required for the `pure` version - options.wrap - wrap constructors to preventing global pollution, required for the `pure` version - options.unsafe - use the simple assignment of property instead of delete + defineProperty - options.sham - add a flag to not completely full polyfills - options.enumerable - export as enumerable property - options.noTargetGet - prevent calling a getter on target - options.name - the .name of the function if it does not match the key -*/ -module.exports = function (options, source) { - var TARGET = options.target; - var GLOBAL = options.global; - var STATIC = options.stat; - var PROTO = options.proto; - - var nativeSource = GLOBAL ? global : STATIC ? global[TARGET] : (global[TARGET] || {}).prototype; - - var target = GLOBAL ? path : path[TARGET] || createNonEnumerableProperty(path, TARGET, {})[TARGET]; - var targetPrototype = target.prototype; - - var FORCED, USE_NATIVE, VIRTUAL_PROTOTYPE; - var key, sourceProperty, targetProperty, nativeProperty, resultProperty, descriptor; - - for (key in source) { - FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); - // contains in native - USE_NATIVE = !FORCED && nativeSource && hasOwn(nativeSource, key); - - targetProperty = target[key]; - - if (USE_NATIVE) if (options.noTargetGet) { - descriptor = getOwnPropertyDescriptor(nativeSource, key); - nativeProperty = descriptor && descriptor.value; - } else nativeProperty = nativeSource[key]; - - // export native or implementation - sourceProperty = (USE_NATIVE && nativeProperty) ? nativeProperty : source[key]; - - if (USE_NATIVE && typeof targetProperty == typeof sourceProperty) continue; - - // bind timers to global for call from export context - if (options.bind && USE_NATIVE) resultProperty = bind(sourceProperty, global); - // wrap global constructors for prevent changs in this version - else if (options.wrap && USE_NATIVE) resultProperty = wrapConstructor(sourceProperty); - // make static versions for prototype methods - else if (PROTO && isCallable(sourceProperty)) resultProperty = uncurryThis(sourceProperty); - // default case - else resultProperty = sourceProperty; - - // add a flag to not completely full polyfills - if (options.sham || (sourceProperty && sourceProperty.sham) || (targetProperty && targetProperty.sham)) { - createNonEnumerableProperty(resultProperty, 'sham', true); - } - - createNonEnumerableProperty(target, key, resultProperty); - - if (PROTO) { - VIRTUAL_PROTOTYPE = TARGET + 'Prototype'; - if (!hasOwn(path, VIRTUAL_PROTOTYPE)) { - createNonEnumerableProperty(path, VIRTUAL_PROTOTYPE, {}); - } - // export virtual prototype methods - createNonEnumerableProperty(path[VIRTUAL_PROTOTYPE], key, sourceProperty); - // export real prototype methods - if (options.real && targetPrototype && !targetPrototype[key]) { - createNonEnumerableProperty(targetPrototype, key, sourceProperty); - } - } - } -}; - -},{"../internals/create-non-enumerable-property":78,"../internals/function-apply":95,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/is-forced":116,"../internals/object-get-own-property-descriptor":130,"../internals/path":142}],94:[function(require,module,exports){ -module.exports = function (exec) { - try { - return !!exec(); - } catch (error) { - return true; - } -}; - -},{}],95:[function(require,module,exports){ -var FunctionPrototype = Function.prototype; -var apply = FunctionPrototype.apply; -var bind = FunctionPrototype.bind; -var call = FunctionPrototype.call; - -// eslint-disable-next-line es/no-reflect -- safe -module.exports = typeof Reflect == 'object' && Reflect.apply || (bind ? call.bind(apply) : function () { - return call.apply(apply, arguments); -}); - -},{}],96:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var aCallable = require('../internals/a-callable'); - -var bind = uncurryThis(uncurryThis.bind); - -// optional / simple context binding -module.exports = function (fn, that) { - aCallable(fn); - return that === undefined ? fn : bind ? bind(fn, that) : function (/* ...args */) { - return fn.apply(that, arguments); - }; -}; - -},{"../internals/a-callable":57,"../internals/function-uncurry-this":99}],97:[function(require,module,exports){ -var call = Function.prototype.call; - -module.exports = call.bind ? call.bind(call) : function () { - return call.apply(call, arguments); -}; - -},{}],98:[function(require,module,exports){ -var DESCRIPTORS = require('../internals/descriptors'); -var hasOwn = require('../internals/has-own-property'); - -var FunctionPrototype = Function.prototype; -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; - -var EXISTS = hasOwn(FunctionPrototype, 'name'); -// additional protection from minified / mangled / dropped function names -var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; -var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); - -module.exports = { - EXISTS: EXISTS, - PROPER: PROPER, - CONFIGURABLE: CONFIGURABLE -}; - -},{"../internals/descriptors":83,"../internals/has-own-property":105}],99:[function(require,module,exports){ -var FunctionPrototype = Function.prototype; -var bind = FunctionPrototype.bind; -var call = FunctionPrototype.call; -var callBind = bind && bind.bind(call); - -module.exports = bind ? function (fn) { - return fn && callBind(call, fn); -} : function (fn) { - return fn && function () { - return call.apply(fn, arguments); - }; -}; - -},{}],100:[function(require,module,exports){ -var path = require('../internals/path'); -var global = require('../internals/global'); -var isCallable = require('../internals/is-callable'); - -var aFunction = function (variable) { - return isCallable(variable) ? variable : undefined; -}; - -module.exports = function (namespace, method) { - return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace]) - : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method]; -}; - -},{"../internals/global":104,"../internals/is-callable":114,"../internals/path":142}],101:[function(require,module,exports){ -var classof = require('../internals/classof'); -var getMethod = require('../internals/get-method'); -var Iterators = require('../internals/iterators'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var ITERATOR = wellKnownSymbol('iterator'); - -module.exports = function (it) { - if (it != undefined) return getMethod(it, ITERATOR) - || getMethod(it, '@@iterator') - || Iterators[classof(it)]; -}; - -},{"../internals/classof":75,"../internals/get-method":103,"../internals/iterators":122,"../internals/well-known-symbol":166}],102:[function(require,module,exports){ -var global = require('../internals/global'); -var call = require('../internals/function-call'); -var aCallable = require('../internals/a-callable'); -var anObject = require('../internals/an-object'); -var tryToString = require('../internals/try-to-string'); -var getIteratorMethod = require('../internals/get-iterator-method'); - -var TypeError = global.TypeError; - -module.exports = function (argument, usingIterator) { - var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; - if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); - throw TypeError(tryToString(argument) + ' is not iterable'); -}; - -},{"../internals/a-callable":57,"../internals/an-object":60,"../internals/function-call":97,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/try-to-string":162}],103:[function(require,module,exports){ -var aCallable = require('../internals/a-callable'); - -// `GetMethod` abstract operation -// https://tc39.es/ecma262/#sec-getmethod -module.exports = function (V, P) { - var func = V[P]; - return func == null ? undefined : aCallable(func); -}; - -},{"../internals/a-callable":57}],104:[function(require,module,exports){ -(function (global){(function (){ -var check = function (it) { - return it && it.Math == Math && it; -}; - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -module.exports = - // eslint-disable-next-line es/no-global-this -- safe - check(typeof globalThis == 'object' && globalThis) || - check(typeof window == 'object' && window) || - // eslint-disable-next-line no-restricted-globals -- safe - check(typeof self == 'object' && self) || - check(typeof global == 'object' && global) || - // eslint-disable-next-line no-new-func -- fallback - (function () { return this; })() || Function('return this')(); - -}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],105:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var toObject = require('../internals/to-object'); - -var hasOwnProperty = uncurryThis({}.hasOwnProperty); - -// `HasOwnProperty` abstract operation -// https://tc39.es/ecma262/#sec-hasownproperty -module.exports = Object.hasOwn || function hasOwn(it, key) { - return hasOwnProperty(toObject(it), key); -}; - -},{"../internals/function-uncurry-this":99,"../internals/to-object":157}],106:[function(require,module,exports){ -module.exports = {}; - -},{}],107:[function(require,module,exports){ -var getBuiltIn = require('../internals/get-built-in'); - -module.exports = getBuiltIn('document', 'documentElement'); - -},{"../internals/get-built-in":100}],108:[function(require,module,exports){ -var DESCRIPTORS = require('../internals/descriptors'); -var fails = require('../internals/fails'); -var createElement = require('../internals/document-create-element'); - -// Thank's IE8 for his funny defineProperty -module.exports = !DESCRIPTORS && !fails(function () { - // eslint-disable-next-line es/no-object-defineproperty -- requied for testing - return Object.defineProperty(createElement('div'), 'a', { - get: function () { return 7; } - }).a != 7; -}); - -},{"../internals/descriptors":83,"../internals/document-create-element":84,"../internals/fails":94}],109:[function(require,module,exports){ -var global = require('../internals/global'); -var uncurryThis = require('../internals/function-uncurry-this'); -var fails = require('../internals/fails'); -var classof = require('../internals/classof-raw'); - -var Object = global.Object; -var split = uncurryThis(''.split); - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -module.exports = fails(function () { - // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 - // eslint-disable-next-line no-prototype-builtins -- safe - return !Object('z').propertyIsEnumerable(0); -}) ? function (it) { - return classof(it) == 'String' ? split(it, '') : Object(it); -} : Object; - -},{"../internals/classof-raw":74,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104}],110:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var isCallable = require('../internals/is-callable'); -var store = require('../internals/shared-store'); - -var functionToString = uncurryThis(Function.toString); - -// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper -if (!isCallable(store.inspectSource)) { - store.inspectSource = function (it) { - return functionToString(it); - }; -} - -module.exports = store.inspectSource; - -},{"../internals/function-uncurry-this":99,"../internals/is-callable":114,"../internals/shared-store":149}],111:[function(require,module,exports){ -var NATIVE_WEAK_MAP = require('../internals/native-weak-map'); -var global = require('../internals/global'); -var uncurryThis = require('../internals/function-uncurry-this'); -var isObject = require('../internals/is-object'); -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); -var hasOwn = require('../internals/has-own-property'); -var shared = require('../internals/shared-store'); -var sharedKey = require('../internals/shared-key'); -var hiddenKeys = require('../internals/hidden-keys'); - -var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; -var TypeError = global.TypeError; -var WeakMap = global.WeakMap; -var set, get, has; - -var enforce = function (it) { - return has(it) ? get(it) : set(it, {}); -}; - -var getterFor = function (TYPE) { - return function (it) { - var state; - if (!isObject(it) || (state = get(it)).type !== TYPE) { - throw TypeError('Incompatible receiver, ' + TYPE + ' required'); - } return state; - }; -}; - -if (NATIVE_WEAK_MAP || shared.state) { - var store = shared.state || (shared.state = new WeakMap()); - var wmget = uncurryThis(store.get); - var wmhas = uncurryThis(store.has); - var wmset = uncurryThis(store.set); - set = function (it, metadata) { - if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); - metadata.facade = it; - wmset(store, it, metadata); - return metadata; - }; - get = function (it) { - return wmget(store, it) || {}; - }; - has = function (it) { - return wmhas(store, it); - }; -} else { - var STATE = sharedKey('state'); - hiddenKeys[STATE] = true; - set = function (it, metadata) { - if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); - metadata.facade = it; - createNonEnumerableProperty(it, STATE, metadata); - return metadata; - }; - get = function (it) { - return hasOwn(it, STATE) ? it[STATE] : {}; - }; - has = function (it) { - return hasOwn(it, STATE); - }; -} - -module.exports = { - set: set, - get: get, - has: has, - enforce: enforce, - getterFor: getterFor -}; - -},{"../internals/create-non-enumerable-property":78,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/is-object":117,"../internals/native-weak-map":125,"../internals/shared-key":148,"../internals/shared-store":149}],112:[function(require,module,exports){ -var wellKnownSymbol = require('../internals/well-known-symbol'); -var Iterators = require('../internals/iterators'); - -var ITERATOR = wellKnownSymbol('iterator'); -var ArrayPrototype = Array.prototype; - -// check on default Array iterator -module.exports = function (it) { - return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); -}; - -},{"../internals/iterators":122,"../internals/well-known-symbol":166}],113:[function(require,module,exports){ -var classof = require('../internals/classof-raw'); - -// `IsArray` abstract operation -// https://tc39.es/ecma262/#sec-isarray -// eslint-disable-next-line es/no-array-isarray -- safe -module.exports = Array.isArray || function isArray(argument) { - return classof(argument) == 'Array'; -}; - -},{"../internals/classof-raw":74}],114:[function(require,module,exports){ -// `IsCallable` abstract operation -// https://tc39.es/ecma262/#sec-iscallable -module.exports = function (argument) { - return typeof argument == 'function'; -}; - -},{}],115:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var fails = require('../internals/fails'); -var isCallable = require('../internals/is-callable'); -var classof = require('../internals/classof'); -var getBuiltIn = require('../internals/get-built-in'); -var inspectSource = require('../internals/inspect-source'); - -var noop = function () { /* empty */ }; -var empty = []; -var construct = getBuiltIn('Reflect', 'construct'); -var constructorRegExp = /^\s*(?:class|function)\b/; -var exec = uncurryThis(constructorRegExp.exec); -var INCORRECT_TO_STRING = !constructorRegExp.exec(noop); - -var isConstructorModern = function isConstructor(argument) { - if (!isCallable(argument)) return false; - try { - construct(noop, empty, argument); - return true; - } catch (error) { - return false; - } -}; - -var isConstructorLegacy = function isConstructor(argument) { - if (!isCallable(argument)) return false; - switch (classof(argument)) { - case 'AsyncFunction': - case 'GeneratorFunction': - case 'AsyncGeneratorFunction': return false; - } - try { - // we can't check .prototype since constructors produced by .bind haven't it - // `Function#toString` throws on some built-it function in some legacy engines - // (for example, `DOMQuad` and similar in FF41-) - return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); - } catch (error) { - return true; - } -}; - -isConstructorLegacy.sham = true; - -// `IsConstructor` abstract operation -// https://tc39.es/ecma262/#sec-isconstructor -module.exports = !construct || fails(function () { - var called; - return isConstructorModern(isConstructorModern.call) - || !isConstructorModern(Object) - || !isConstructorModern(function () { called = true; }) - || called; -}) ? isConstructorLegacy : isConstructorModern; - -},{"../internals/classof":75,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/inspect-source":110,"../internals/is-callable":114}],116:[function(require,module,exports){ -var fails = require('../internals/fails'); -var isCallable = require('../internals/is-callable'); - -var replacement = /#|\.prototype\./; - -var isForced = function (feature, detection) { - var value = data[normalize(feature)]; - return value == POLYFILL ? true - : value == NATIVE ? false - : isCallable(detection) ? fails(detection) - : !!detection; -}; - -var normalize = isForced.normalize = function (string) { - return String(string).replace(replacement, '.').toLowerCase(); -}; - -var data = isForced.data = {}; -var NATIVE = isForced.NATIVE = 'N'; -var POLYFILL = isForced.POLYFILL = 'P'; - -module.exports = isForced; - -},{"../internals/fails":94,"../internals/is-callable":114}],117:[function(require,module,exports){ -var isCallable = require('../internals/is-callable'); - -module.exports = function (it) { - return typeof it == 'object' ? it !== null : isCallable(it); -}; - -},{"../internals/is-callable":114}],118:[function(require,module,exports){ -module.exports = true; - -},{}],119:[function(require,module,exports){ -var global = require('../internals/global'); -var getBuiltIn = require('../internals/get-built-in'); -var isCallable = require('../internals/is-callable'); -var isPrototypeOf = require('../internals/object-is-prototype-of'); -var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid'); - -var Object = global.Object; - -module.exports = USE_SYMBOL_AS_UID ? function (it) { - return typeof it == 'symbol'; -} : function (it) { - var $Symbol = getBuiltIn('Symbol'); - return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, Object(it)); -}; - -},{"../internals/get-built-in":100,"../internals/global":104,"../internals/is-callable":114,"../internals/object-is-prototype-of":135,"../internals/use-symbol-as-uid":164}],120:[function(require,module,exports){ -var call = require('../internals/function-call'); -var anObject = require('../internals/an-object'); -var getMethod = require('../internals/get-method'); - -module.exports = function (iterator, kind, value) { - var innerResult, innerError; - anObject(iterator); - try { - innerResult = getMethod(iterator, 'return'); - if (!innerResult) { - if (kind === 'throw') throw value; - return value; - } - innerResult = call(innerResult, iterator); - } catch (error) { - innerError = true; - innerResult = error; - } - if (kind === 'throw') throw value; - if (innerError) throw innerResult; - anObject(innerResult); - return value; -}; - -},{"../internals/an-object":60,"../internals/function-call":97,"../internals/get-method":103}],121:[function(require,module,exports){ -'use strict'; -var fails = require('../internals/fails'); -var isCallable = require('../internals/is-callable'); -var create = require('../internals/object-create'); -var getPrototypeOf = require('../internals/object-get-prototype-of'); -var redefine = require('../internals/redefine'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var IS_PURE = require('../internals/is-pure'); - -var ITERATOR = wellKnownSymbol('iterator'); -var BUGGY_SAFARI_ITERATORS = false; - -// `%IteratorPrototype%` object -// https://tc39.es/ecma262/#sec-%iteratorprototype%-object -var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; - -/* eslint-disable es/no-array-prototype-keys -- safe */ -if ([].keys) { - arrayIterator = [].keys(); - // Safari 8 has buggy iterators w/o `next` - if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; - else { - PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); - if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; - } -} - -var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () { - var test = {}; - // FF44- legacy iterators case - return IteratorPrototype[ITERATOR].call(test) !== test; -}); - -if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; -else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); - -// `%IteratorPrototype%[@@iterator]()` method -// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator -if (!isCallable(IteratorPrototype[ITERATOR])) { - redefine(IteratorPrototype, ITERATOR, function () { - return this; - }); -} - -module.exports = { - IteratorPrototype: IteratorPrototype, - BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS -}; - -},{"../internals/fails":94,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/object-create":127,"../internals/object-get-prototype-of":134,"../internals/redefine":143,"../internals/well-known-symbol":166}],122:[function(require,module,exports){ -arguments[4][106][0].apply(exports,arguments) -},{"dup":106}],123:[function(require,module,exports){ -var toLength = require('../internals/to-length'); - -// `LengthOfArrayLike` abstract operation -// https://tc39.es/ecma262/#sec-lengthofarraylike -module.exports = function (obj) { - return toLength(obj.length); -}; - -},{"../internals/to-length":156}],124:[function(require,module,exports){ -/* eslint-disable es/no-symbol -- required for testing */ -var V8_VERSION = require('../internals/engine-v8-version'); -var fails = require('../internals/fails'); - -// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing -module.exports = !!Object.getOwnPropertySymbols && !fails(function () { - var symbol = Symbol(); - // Chrome 38 Symbol has incorrect toString conversion - // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances - return !String(symbol) || !(Object(symbol) instanceof Symbol) || - // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances - !Symbol.sham && V8_VERSION && V8_VERSION < 41; -}); - -},{"../internals/engine-v8-version":89,"../internals/fails":94}],125:[function(require,module,exports){ -var global = require('../internals/global'); -var isCallable = require('../internals/is-callable'); -var inspectSource = require('../internals/inspect-source'); - -var WeakMap = global.WeakMap; - -module.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap)); - -},{"../internals/global":104,"../internals/inspect-source":110,"../internals/is-callable":114}],126:[function(require,module,exports){ -var global = require('../internals/global'); -var fails = require('../internals/fails'); -var uncurryThis = require('../internals/function-uncurry-this'); -var toString = require('../internals/to-string'); -var trim = require('../internals/string-trim').trim; -var whitespaces = require('../internals/whitespaces'); - -var $parseInt = global.parseInt; -var Symbol = global.Symbol; -var ITERATOR = Symbol && Symbol.iterator; -var hex = /^[+-]?0x/i; -var exec = uncurryThis(hex.exec); -var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22 - // MS Edge 18- broken with boxed symbols - || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); })); - -// `parseInt` method -// https://tc39.es/ecma262/#sec-parseint-string-radix -module.exports = FORCED ? function parseInt(string, radix) { - var S = trim(toString(string)); - return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10)); -} : $parseInt; - -},{"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/string-trim":152,"../internals/to-string":161,"../internals/whitespaces":167}],127:[function(require,module,exports){ -/* global ActiveXObject -- old IE, WSH */ -var anObject = require('../internals/an-object'); -var defineProperties = require('../internals/object-define-properties'); -var enumBugKeys = require('../internals/enum-bug-keys'); -var hiddenKeys = require('../internals/hidden-keys'); -var html = require('../internals/html'); -var documentCreateElement = require('../internals/document-create-element'); -var sharedKey = require('../internals/shared-key'); - -var GT = '>'; -var LT = '<'; -var PROTOTYPE = 'prototype'; -var SCRIPT = 'script'; -var IE_PROTO = sharedKey('IE_PROTO'); - -var EmptyConstructor = function () { /* empty */ }; - -var scriptTag = function (content) { - return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; -}; - -// Create object with fake `null` prototype: use ActiveX Object with cleared prototype -var NullProtoObjectViaActiveX = function (activeXDocument) { - activeXDocument.write(scriptTag('')); - activeXDocument.close(); - var temp = activeXDocument.parentWindow.Object; - activeXDocument = null; // avoid memory leak - return temp; -}; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var NullProtoObjectViaIFrame = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = documentCreateElement('iframe'); - var JS = 'java' + SCRIPT + ':'; - var iframeDocument; - iframe.style.display = 'none'; - html.appendChild(iframe); - // https://github.com/zloirock/core-js/issues/475 - iframe.src = String(JS); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(scriptTag('document.F=Object')); - iframeDocument.close(); - return iframeDocument.F; -}; - -// Check for document.domain and active x support -// No need to use active x approach when document.domain is not set -// see https://github.com/es-shims/es5-shim/issues/150 -// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 -// avoid IE GC bug -var activeXDocument; -var NullProtoObject = function () { - try { - activeXDocument = new ActiveXObject('htmlfile'); - } catch (error) { /* ignore */ } - NullProtoObject = typeof document != 'undefined' - ? document.domain && activeXDocument - ? NullProtoObjectViaActiveX(activeXDocument) // old IE - : NullProtoObjectViaIFrame() - : NullProtoObjectViaActiveX(activeXDocument); // WSH - var length = enumBugKeys.length; - while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; - return NullProtoObject(); -}; - -hiddenKeys[IE_PROTO] = true; - -// `Object.create` method -// https://tc39.es/ecma262/#sec-object.create -module.exports = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - EmptyConstructor[PROTOTYPE] = anObject(O); - result = new EmptyConstructor(); - EmptyConstructor[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = NullProtoObject(); - return Properties === undefined ? result : defineProperties(result, Properties); -}; - -},{"../internals/an-object":60,"../internals/document-create-element":84,"../internals/enum-bug-keys":92,"../internals/hidden-keys":106,"../internals/html":107,"../internals/object-define-properties":128,"../internals/shared-key":148}],128:[function(require,module,exports){ -var DESCRIPTORS = require('../internals/descriptors'); -var definePropertyModule = require('../internals/object-define-property'); -var anObject = require('../internals/an-object'); -var toIndexedObject = require('../internals/to-indexed-object'); -var objectKeys = require('../internals/object-keys'); - -// `Object.defineProperties` method -// https://tc39.es/ecma262/#sec-object.defineproperties -// eslint-disable-next-line es/no-object-defineproperties -- safe -module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var props = toIndexedObject(Properties); - var keys = objectKeys(Properties); - var length = keys.length; - var index = 0; - var key; - while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); - return O; -}; - -},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/object-define-property":129,"../internals/object-keys":137,"../internals/to-indexed-object":154}],129:[function(require,module,exports){ -var global = require('../internals/global'); -var DESCRIPTORS = require('../internals/descriptors'); -var IE8_DOM_DEFINE = require('../internals/ie8-dom-define'); -var anObject = require('../internals/an-object'); -var toPropertyKey = require('../internals/to-property-key'); - -var TypeError = global.TypeError; -// eslint-disable-next-line es/no-object-defineproperty -- safe -var $defineProperty = Object.defineProperty; - -// `Object.defineProperty` method -// https://tc39.es/ecma262/#sec-object.defineproperty -exports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPropertyKey(P); - anObject(Attributes); - if (IE8_DOM_DEFINE) try { - return $defineProperty(O, P, Attributes); - } catch (error) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; -}; - -},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/global":104,"../internals/ie8-dom-define":108,"../internals/to-property-key":159}],130:[function(require,module,exports){ -var DESCRIPTORS = require('../internals/descriptors'); -var call = require('../internals/function-call'); -var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable'); -var createPropertyDescriptor = require('../internals/create-property-descriptor'); -var toIndexedObject = require('../internals/to-indexed-object'); -var toPropertyKey = require('../internals/to-property-key'); -var hasOwn = require('../internals/has-own-property'); -var IE8_DOM_DEFINE = require('../internals/ie8-dom-define'); - -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// `Object.getOwnPropertyDescriptor` method -// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor -exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { - O = toIndexedObject(O); - P = toPropertyKey(P); - if (IE8_DOM_DEFINE) try { - return $getOwnPropertyDescriptor(O, P); - } catch (error) { /* empty */ } - if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); -}; - -},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/function-call":97,"../internals/has-own-property":105,"../internals/ie8-dom-define":108,"../internals/object-property-is-enumerable":138,"../internals/to-indexed-object":154,"../internals/to-property-key":159}],131:[function(require,module,exports){ -/* eslint-disable es/no-object-getownpropertynames -- safe */ -var classof = require('../internals/classof-raw'); -var toIndexedObject = require('../internals/to-indexed-object'); -var $getOwnPropertyNames = require('../internals/object-get-own-property-names').f; -var arraySlice = require('../internals/array-slice-simple'); - -var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames - ? Object.getOwnPropertyNames(window) : []; - -var getWindowNames = function (it) { - try { - return $getOwnPropertyNames(it); - } catch (error) { - return arraySlice(windowNames); - } -}; - -// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window -module.exports.f = function getOwnPropertyNames(it) { - return windowNames && classof(it) == 'Window' - ? getWindowNames(it) - : $getOwnPropertyNames(toIndexedObject(it)); -}; - -},{"../internals/array-slice-simple":67,"../internals/classof-raw":74,"../internals/object-get-own-property-names":132,"../internals/to-indexed-object":154}],132:[function(require,module,exports){ -var internalObjectKeys = require('../internals/object-keys-internal'); -var enumBugKeys = require('../internals/enum-bug-keys'); - -var hiddenKeys = enumBugKeys.concat('length', 'prototype'); - -// `Object.getOwnPropertyNames` method -// https://tc39.es/ecma262/#sec-object.getownpropertynames -// eslint-disable-next-line es/no-object-getownpropertynames -- safe -exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return internalObjectKeys(O, hiddenKeys); -}; - -},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],133:[function(require,module,exports){ -// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe -exports.f = Object.getOwnPropertySymbols; - -},{}],134:[function(require,module,exports){ -var global = require('../internals/global'); -var hasOwn = require('../internals/has-own-property'); -var isCallable = require('../internals/is-callable'); -var toObject = require('../internals/to-object'); -var sharedKey = require('../internals/shared-key'); -var CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter'); - -var IE_PROTO = sharedKey('IE_PROTO'); -var Object = global.Object; -var ObjectPrototype = Object.prototype; - -// `Object.getPrototypeOf` method -// https://tc39.es/ecma262/#sec-object.getprototypeof -module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { - var object = toObject(O); - if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; - var constructor = object.constructor; - if (isCallable(constructor) && object instanceof constructor) { - return constructor.prototype; - } return object instanceof Object ? ObjectPrototype : null; -}; - -},{"../internals/correct-prototype-getter":76,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/shared-key":148,"../internals/to-object":157}],135:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); - -module.exports = uncurryThis({}.isPrototypeOf); - -},{"../internals/function-uncurry-this":99}],136:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var hasOwn = require('../internals/has-own-property'); -var toIndexedObject = require('../internals/to-indexed-object'); -var indexOf = require('../internals/array-includes').indexOf; -var hiddenKeys = require('../internals/hidden-keys'); - -var push = uncurryThis([].push); - -module.exports = function (object, names) { - var O = toIndexedObject(object); - var i = 0; - var result = []; - var key; - for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); - // Don't enum bug & hidden keys - while (names.length > i) if (hasOwn(O, key = names[i++])) { - ~indexOf(result, key) || push(result, key); - } - return result; -}; - -},{"../internals/array-includes":63,"../internals/function-uncurry-this":99,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/to-indexed-object":154}],137:[function(require,module,exports){ -var internalObjectKeys = require('../internals/object-keys-internal'); -var enumBugKeys = require('../internals/enum-bug-keys'); - -// `Object.keys` method -// https://tc39.es/ecma262/#sec-object.keys -// eslint-disable-next-line es/no-object-keys -- safe -module.exports = Object.keys || function keys(O) { - return internalObjectKeys(O, enumBugKeys); -}; - -},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],138:[function(require,module,exports){ -'use strict'; -var $propertyIsEnumerable = {}.propertyIsEnumerable; -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// Nashorn ~ JDK8 bug -var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); - -// `Object.prototype.propertyIsEnumerable` method implementation -// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable -exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { - var descriptor = getOwnPropertyDescriptor(this, V); - return !!descriptor && descriptor.enumerable; -} : $propertyIsEnumerable; - -},{}],139:[function(require,module,exports){ -/* eslint-disable no-proto -- safe */ -var uncurryThis = require('../internals/function-uncurry-this'); -var anObject = require('../internals/an-object'); -var aPossiblePrototype = require('../internals/a-possible-prototype'); - -// `Object.setPrototypeOf` method -// https://tc39.es/ecma262/#sec-object.setprototypeof -// Works with __proto__ only. Old v8 can't work with null proto objects. -// eslint-disable-next-line es/no-object-setprototypeof -- safe -module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { - var CORRECT_SETTER = false; - var test = {}; - var setter; - try { - // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe - setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set); - setter(test, []); - CORRECT_SETTER = test instanceof Array; - } catch (error) { /* empty */ } - return function setPrototypeOf(O, proto) { - anObject(O); - aPossiblePrototype(proto); - if (CORRECT_SETTER) setter(O, proto); - else O.__proto__ = proto; - return O; - }; -}() : undefined); - -},{"../internals/a-possible-prototype":58,"../internals/an-object":60,"../internals/function-uncurry-this":99}],140:[function(require,module,exports){ -'use strict'; -var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support'); -var classof = require('../internals/classof'); - -// `Object.prototype.toString` method implementation -// https://tc39.es/ecma262/#sec-object.prototype.tostring -module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { - return '[object ' + classof(this) + ']'; -}; - -},{"../internals/classof":75,"../internals/to-string-tag-support":160}],141:[function(require,module,exports){ -var global = require('../internals/global'); -var call = require('../internals/function-call'); -var isCallable = require('../internals/is-callable'); -var isObject = require('../internals/is-object'); - -var TypeError = global.TypeError; - -// `OrdinaryToPrimitive` abstract operation -// https://tc39.es/ecma262/#sec-ordinarytoprimitive -module.exports = function (input, pref) { - var fn, val; - if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; - if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; - if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; - throw TypeError("Can't convert object to primitive value"); -}; - -},{"../internals/function-call":97,"../internals/global":104,"../internals/is-callable":114,"../internals/is-object":117}],142:[function(require,module,exports){ -arguments[4][106][0].apply(exports,arguments) -},{"dup":106}],143:[function(require,module,exports){ -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); - -module.exports = function (target, key, value, options) { - if (options && options.enumerable) target[key] = value; - else createNonEnumerableProperty(target, key, value); -}; - -},{"../internals/create-non-enumerable-property":78}],144:[function(require,module,exports){ -'use strict'; -var anObject = require('../internals/an-object'); - -// `RegExp.prototype.flags` getter implementation -// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags -module.exports = function () { - var that = anObject(this); - var result = ''; - if (that.global) result += 'g'; - if (that.ignoreCase) result += 'i'; - if (that.multiline) result += 'm'; - if (that.dotAll) result += 's'; - if (that.unicode) result += 'u'; - if (that.sticky) result += 'y'; - return result; -}; - -},{"../internals/an-object":60}],145:[function(require,module,exports){ -var global = require('../internals/global'); - -var TypeError = global.TypeError; - -// `RequireObjectCoercible` abstract operation -// https://tc39.es/ecma262/#sec-requireobjectcoercible -module.exports = function (it) { - if (it == undefined) throw TypeError("Can't call method on " + it); - return it; -}; - -},{"../internals/global":104}],146:[function(require,module,exports){ -var global = require('../internals/global'); - -// eslint-disable-next-line es/no-object-defineproperty -- safe -var defineProperty = Object.defineProperty; - -module.exports = function (key, value) { - try { - defineProperty(global, key, { value: value, configurable: true, writable: true }); - } catch (error) { - global[key] = value; - } return value; -}; - -},{"../internals/global":104}],147:[function(require,module,exports){ -var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support'); -var defineProperty = require('../internals/object-define-property').f; -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); -var hasOwn = require('../internals/has-own-property'); -var toString = require('../internals/object-to-string'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); - -module.exports = function (it, TAG, STATIC, SET_METHOD) { - if (it) { - var target = STATIC ? it : it.prototype; - if (!hasOwn(target, TO_STRING_TAG)) { - defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG }); - } - if (SET_METHOD && !TO_STRING_TAG_SUPPORT) { - createNonEnumerableProperty(target, 'toString', toString); - } - } -}; - -},{"../internals/create-non-enumerable-property":78,"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/object-to-string":140,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],148:[function(require,module,exports){ -var shared = require('../internals/shared'); -var uid = require('../internals/uid'); - -var keys = shared('keys'); - -module.exports = function (key) { - return keys[key] || (keys[key] = uid(key)); -}; - -},{"../internals/shared":150,"../internals/uid":163}],149:[function(require,module,exports){ -var global = require('../internals/global'); -var setGlobal = require('../internals/set-global'); - -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || setGlobal(SHARED, {}); - -module.exports = store; - -},{"../internals/global":104,"../internals/set-global":146}],150:[function(require,module,exports){ -var IS_PURE = require('../internals/is-pure'); -var store = require('../internals/shared-store'); - -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: '3.20.0', - mode: IS_PURE ? 'pure' : 'global', - copyright: '© 2021 Denis Pushkarev (zloirock.ru)' -}); - -},{"../internals/is-pure":118,"../internals/shared-store":149}],151:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); -var toString = require('../internals/to-string'); -var requireObjectCoercible = require('../internals/require-object-coercible'); - -var charAt = uncurryThis(''.charAt); -var charCodeAt = uncurryThis(''.charCodeAt); -var stringSlice = uncurryThis(''.slice); - -var createMethod = function (CONVERT_TO_STRING) { - return function ($this, pos) { - var S = toString(requireObjectCoercible($this)); - var position = toIntegerOrInfinity(pos); - var size = S.length; - var first, second; - if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; - first = charCodeAt(S, position); - return first < 0xD800 || first > 0xDBFF || position + 1 === size - || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF - ? CONVERT_TO_STRING - ? charAt(S, position) - : first - : CONVERT_TO_STRING - ? stringSlice(S, position, position + 2) - : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; - }; -}; - -module.exports = { - // `String.prototype.codePointAt` method - // https://tc39.es/ecma262/#sec-string.prototype.codepointat - codeAt: createMethod(false), - // `String.prototype.at` method - // https://github.com/mathiasbynens/String.prototype.at - charAt: createMethod(true) -}; - -},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-integer-or-infinity":155,"../internals/to-string":161}],152:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var requireObjectCoercible = require('../internals/require-object-coercible'); -var toString = require('../internals/to-string'); -var whitespaces = require('../internals/whitespaces'); - -var replace = uncurryThis(''.replace); -var whitespace = '[' + whitespaces + ']'; -var ltrim = RegExp('^' + whitespace + whitespace + '*'); -var rtrim = RegExp(whitespace + whitespace + '*$'); - -// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation -var createMethod = function (TYPE) { - return function ($this) { - var string = toString(requireObjectCoercible($this)); - if (TYPE & 1) string = replace(string, ltrim, ''); - if (TYPE & 2) string = replace(string, rtrim, ''); - return string; - }; -}; - -module.exports = { - // `String.prototype.{ trimLeft, trimStart }` methods - // https://tc39.es/ecma262/#sec-string.prototype.trimstart - start: createMethod(1), - // `String.prototype.{ trimRight, trimEnd }` methods - // https://tc39.es/ecma262/#sec-string.prototype.trimend - end: createMethod(2), - // `String.prototype.trim` method - // https://tc39.es/ecma262/#sec-string.prototype.trim - trim: createMethod(3) -}; - -},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-string":161,"../internals/whitespaces":167}],153:[function(require,module,exports){ -var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); - -var max = Math.max; -var min = Math.min; - -// Helper for a popular repeating case of the spec: -// Let integer be ? ToInteger(index). -// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). -module.exports = function (index, length) { - var integer = toIntegerOrInfinity(index); - return integer < 0 ? max(integer + length, 0) : min(integer, length); -}; - -},{"../internals/to-integer-or-infinity":155}],154:[function(require,module,exports){ -// toObject with fallback for non-array-like ES3 strings -var IndexedObject = require('../internals/indexed-object'); -var requireObjectCoercible = require('../internals/require-object-coercible'); - -module.exports = function (it) { - return IndexedObject(requireObjectCoercible(it)); -}; - -},{"../internals/indexed-object":109,"../internals/require-object-coercible":145}],155:[function(require,module,exports){ -var ceil = Math.ceil; -var floor = Math.floor; - -// `ToIntegerOrInfinity` abstract operation -// https://tc39.es/ecma262/#sec-tointegerorinfinity -module.exports = function (argument) { - var number = +argument; - // eslint-disable-next-line no-self-compare -- safe - return number !== number || number === 0 ? 0 : (number > 0 ? floor : ceil)(number); -}; - -},{}],156:[function(require,module,exports){ -var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); - -var min = Math.min; - -// `ToLength` abstract operation -// https://tc39.es/ecma262/#sec-tolength -module.exports = function (argument) { - return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 -}; - -},{"../internals/to-integer-or-infinity":155}],157:[function(require,module,exports){ -var global = require('../internals/global'); -var requireObjectCoercible = require('../internals/require-object-coercible'); - -var Object = global.Object; - -// `ToObject` abstract operation -// https://tc39.es/ecma262/#sec-toobject -module.exports = function (argument) { - return Object(requireObjectCoercible(argument)); -}; - -},{"../internals/global":104,"../internals/require-object-coercible":145}],158:[function(require,module,exports){ -var global = require('../internals/global'); -var call = require('../internals/function-call'); -var isObject = require('../internals/is-object'); -var isSymbol = require('../internals/is-symbol'); -var getMethod = require('../internals/get-method'); -var ordinaryToPrimitive = require('../internals/ordinary-to-primitive'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var TypeError = global.TypeError; -var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); - -// `ToPrimitive` abstract operation -// https://tc39.es/ecma262/#sec-toprimitive -module.exports = function (input, pref) { - if (!isObject(input) || isSymbol(input)) return input; - var exoticToPrim = getMethod(input, TO_PRIMITIVE); - var result; - if (exoticToPrim) { - if (pref === undefined) pref = 'default'; - result = call(exoticToPrim, input, pref); - if (!isObject(result) || isSymbol(result)) return result; - throw TypeError("Can't convert object to primitive value"); - } - if (pref === undefined) pref = 'number'; - return ordinaryToPrimitive(input, pref); -}; - -},{"../internals/function-call":97,"../internals/get-method":103,"../internals/global":104,"../internals/is-object":117,"../internals/is-symbol":119,"../internals/ordinary-to-primitive":141,"../internals/well-known-symbol":166}],159:[function(require,module,exports){ -var toPrimitive = require('../internals/to-primitive'); -var isSymbol = require('../internals/is-symbol'); - -// `ToPropertyKey` abstract operation -// https://tc39.es/ecma262/#sec-topropertykey -module.exports = function (argument) { - var key = toPrimitive(argument, 'string'); - return isSymbol(key) ? key : key + ''; -}; - -},{"../internals/is-symbol":119,"../internals/to-primitive":158}],160:[function(require,module,exports){ -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var test = {}; - -test[TO_STRING_TAG] = 'z'; - -module.exports = String(test) === '[object z]'; - -},{"../internals/well-known-symbol":166}],161:[function(require,module,exports){ -var global = require('../internals/global'); -var classof = require('../internals/classof'); - -var String = global.String; - -module.exports = function (argument) { - if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string'); - return String(argument); -}; - -},{"../internals/classof":75,"../internals/global":104}],162:[function(require,module,exports){ -var global = require('../internals/global'); - -var String = global.String; - -module.exports = function (argument) { - try { - return String(argument); - } catch (error) { - return 'Object'; - } -}; - -},{"../internals/global":104}],163:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); - -var id = 0; -var postfix = Math.random(); -var toString = uncurryThis(1.0.toString); - -module.exports = function (key) { - return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); -}; - -},{"../internals/function-uncurry-this":99}],164:[function(require,module,exports){ -/* eslint-disable es/no-symbol -- required for testing */ -var NATIVE_SYMBOL = require('../internals/native-symbol'); - -module.exports = NATIVE_SYMBOL - && !Symbol.sham - && typeof Symbol.iterator == 'symbol'; - -},{"../internals/native-symbol":124}],165:[function(require,module,exports){ -var wellKnownSymbol = require('../internals/well-known-symbol'); - -exports.f = wellKnownSymbol; - -},{"../internals/well-known-symbol":166}],166:[function(require,module,exports){ -var global = require('../internals/global'); -var shared = require('../internals/shared'); -var hasOwn = require('../internals/has-own-property'); -var uid = require('../internals/uid'); -var NATIVE_SYMBOL = require('../internals/native-symbol'); -var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid'); - -var WellKnownSymbolsStore = shared('wks'); -var Symbol = global.Symbol; -var symbolFor = Symbol && Symbol['for']; -var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; - -module.exports = function (name) { - if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) { - var description = 'Symbol.' + name; - if (NATIVE_SYMBOL && hasOwn(Symbol, name)) { - WellKnownSymbolsStore[name] = Symbol[name]; - } else if (USE_SYMBOL_AS_UID && symbolFor) { - WellKnownSymbolsStore[name] = symbolFor(description); - } else { - WellKnownSymbolsStore[name] = createWellKnownSymbol(description); - } - } return WellKnownSymbolsStore[name]; -}; - -},{"../internals/global":104,"../internals/has-own-property":105,"../internals/native-symbol":124,"../internals/shared":150,"../internals/uid":163,"../internals/use-symbol-as-uid":164}],167:[function(require,module,exports){ -// a string of all valid unicode whitespaces -module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' + - '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; - -},{}],168:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var global = require('../internals/global'); -var fails = require('../internals/fails'); -var isArray = require('../internals/is-array'); -var isObject = require('../internals/is-object'); -var toObject = require('../internals/to-object'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var createProperty = require('../internals/create-property'); -var arraySpeciesCreate = require('../internals/array-species-create'); -var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var V8_VERSION = require('../internals/engine-v8-version'); - -var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable'); -var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; -var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded'; -var TypeError = global.TypeError; - -// We can't use this feature detection in V8 since it causes -// deoptimization and serious performance degradation -// https://github.com/zloirock/core-js/issues/679 -var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () { - var array = []; - array[IS_CONCAT_SPREADABLE] = false; - return array.concat()[0] !== array; -}); - -var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat'); - -var isConcatSpreadable = function (O) { - if (!isObject(O)) return false; - var spreadable = O[IS_CONCAT_SPREADABLE]; - return spreadable !== undefined ? !!spreadable : isArray(O); -}; - -var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; - -// `Array.prototype.concat` method -// https://tc39.es/ecma262/#sec-array.prototype.concat -// with adding support of @@isConcatSpreadable and @@species -$({ target: 'Array', proto: true, forced: FORCED }, { - // eslint-disable-next-line no-unused-vars -- required for `.length` - concat: function concat(arg) { - var O = toObject(this); - var A = arraySpeciesCreate(O, 0); - var n = 0; - var i, k, length, len, E; - for (i = -1, length = arguments.length; i < length; i++) { - E = i === -1 ? O : arguments[i]; - if (isConcatSpreadable(E)) { - len = lengthOfArrayLike(E); - if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); - for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]); - } else { - if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); - createProperty(A, n++, E); - } - } - A.length = n; - return A; - } -}); - -},{"../internals/array-method-has-species-support":65,"../internals/array-species-create":71,"../internals/create-property":80,"../internals/engine-v8-version":89,"../internals/export":93,"../internals/fails":94,"../internals/global":104,"../internals/is-array":113,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/well-known-symbol":166}],169:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var forEach = require('../internals/array-for-each'); - -// `Array.prototype.forEach` method -// https://tc39.es/ecma262/#sec-array.prototype.foreach -// eslint-disable-next-line es/no-array-prototype-foreach -- safe -$({ target: 'Array', proto: true, forced: [].forEach != forEach }, { - forEach: forEach -}); - -},{"../internals/array-for-each":61,"../internals/export":93}],170:[function(require,module,exports){ -var $ = require('../internals/export'); -var from = require('../internals/array-from'); -var checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration'); - -var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) { - // eslint-disable-next-line es/no-array-from -- required for testing - Array.from(iterable); -}); - -// `Array.from` method -// https://tc39.es/ecma262/#sec-array.from -$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, { - from: from -}); - -},{"../internals/array-from":62,"../internals/check-correctness-of-iteration":73,"../internals/export":93}],171:[function(require,module,exports){ -'use strict'; -/* eslint-disable es/no-array-prototype-indexof -- required for testing */ -var $ = require('../internals/export'); -var uncurryThis = require('../internals/function-uncurry-this'); -var $IndexOf = require('../internals/array-includes').indexOf; -var arrayMethodIsStrict = require('../internals/array-method-is-strict'); - -var un$IndexOf = uncurryThis([].indexOf); - -var NEGATIVE_ZERO = !!un$IndexOf && 1 / un$IndexOf([1], 1, -0) < 0; -var STRICT_METHOD = arrayMethodIsStrict('indexOf'); - -// `Array.prototype.indexOf` method -// https://tc39.es/ecma262/#sec-array.prototype.indexof -$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD }, { - indexOf: function indexOf(searchElement /* , fromIndex = 0 */) { - var fromIndex = arguments.length > 1 ? arguments[1] : undefined; - return NEGATIVE_ZERO - // convert -0 to +0 - ? un$IndexOf(this, searchElement, fromIndex) || 0 - : $IndexOf(this, searchElement, fromIndex); - } -}); - -},{"../internals/array-includes":63,"../internals/array-method-is-strict":66,"../internals/export":93,"../internals/function-uncurry-this":99}],172:[function(require,module,exports){ -var $ = require('../internals/export'); -var isArray = require('../internals/is-array'); - -// `Array.isArray` method -// https://tc39.es/ecma262/#sec-array.isarray -$({ target: 'Array', stat: true }, { - isArray: isArray -}); - -},{"../internals/export":93,"../internals/is-array":113}],173:[function(require,module,exports){ -'use strict'; -var toIndexedObject = require('../internals/to-indexed-object'); -var addToUnscopables = require('../internals/add-to-unscopables'); -var Iterators = require('../internals/iterators'); -var InternalStateModule = require('../internals/internal-state'); -var defineProperty = require('../internals/object-define-property').f; -var defineIterator = require('../internals/define-iterator'); -var IS_PURE = require('../internals/is-pure'); -var DESCRIPTORS = require('../internals/descriptors'); - -var ARRAY_ITERATOR = 'Array Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); - -// `Array.prototype.entries` method -// https://tc39.es/ecma262/#sec-array.prototype.entries -// `Array.prototype.keys` method -// https://tc39.es/ecma262/#sec-array.prototype.keys -// `Array.prototype.values` method -// https://tc39.es/ecma262/#sec-array.prototype.values -// `Array.prototype[@@iterator]` method -// https://tc39.es/ecma262/#sec-array.prototype-@@iterator -// `CreateArrayIterator` internal method -// https://tc39.es/ecma262/#sec-createarrayiterator -module.exports = defineIterator(Array, 'Array', function (iterated, kind) { - setInternalState(this, { - type: ARRAY_ITERATOR, - target: toIndexedObject(iterated), // target - index: 0, // next index - kind: kind // kind - }); -// `%ArrayIteratorPrototype%.next` method -// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next -}, function () { - var state = getInternalState(this); - var target = state.target; - var kind = state.kind; - var index = state.index++; - if (!target || index >= target.length) { - state.target = undefined; - return { value: undefined, done: true }; - } - if (kind == 'keys') return { value: index, done: false }; - if (kind == 'values') return { value: target[index], done: false }; - return { value: [index, target[index]], done: false }; -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% -// https://tc39.es/ecma262/#sec-createunmappedargumentsobject -// https://tc39.es/ecma262/#sec-createmappedargumentsobject -var values = Iterators.Arguments = Iterators.Array; - -// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); - -// V8 ~ Chrome 45- bug -if (!IS_PURE && DESCRIPTORS && values.name !== 'values') try { - defineProperty(values, 'name', { value: 'values' }); -} catch (error) { /* empty */ } - -},{"../internals/add-to-unscopables":59,"../internals/define-iterator":81,"../internals/descriptors":83,"../internals/internal-state":111,"../internals/is-pure":118,"../internals/iterators":122,"../internals/object-define-property":129,"../internals/to-indexed-object":154}],174:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var global = require('../internals/global'); -var isArray = require('../internals/is-array'); -var isConstructor = require('../internals/is-constructor'); -var isObject = require('../internals/is-object'); -var toAbsoluteIndex = require('../internals/to-absolute-index'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var toIndexedObject = require('../internals/to-indexed-object'); -var createProperty = require('../internals/create-property'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support'); -var un$Slice = require('../internals/array-slice'); - -var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice'); - -var SPECIES = wellKnownSymbol('species'); -var Array = global.Array; -var max = Math.max; - -// `Array.prototype.slice` method -// https://tc39.es/ecma262/#sec-array.prototype.slice -// fallback for not array-like ES3 strings and DOM objects -$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, { - slice: function slice(start, end) { - var O = toIndexedObject(this); - var length = lengthOfArrayLike(O); - var k = toAbsoluteIndex(start, length); - var fin = toAbsoluteIndex(end === undefined ? length : end, length); - // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible - var Constructor, result, n; - if (isArray(O)) { - Constructor = O.constructor; - // cross-realm fallback - if (isConstructor(Constructor) && (Constructor === Array || isArray(Constructor.prototype))) { - Constructor = undefined; - } else if (isObject(Constructor)) { - Constructor = Constructor[SPECIES]; - if (Constructor === null) Constructor = undefined; - } - if (Constructor === Array || Constructor === undefined) { - return un$Slice(O, k, fin); - } - } - result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0)); - for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]); - result.length = n; - return result; - } -}); - -},{"../internals/array-method-has-species-support":65,"../internals/array-slice":68,"../internals/create-property":80,"../internals/export":93,"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154,"../internals/well-known-symbol":166}],175:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var uncurryThis = require('../internals/function-uncurry-this'); -var aCallable = require('../internals/a-callable'); -var toObject = require('../internals/to-object'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var toString = require('../internals/to-string'); -var fails = require('../internals/fails'); -var internalSort = require('../internals/array-sort'); -var arrayMethodIsStrict = require('../internals/array-method-is-strict'); -var FF = require('../internals/engine-ff-version'); -var IE_OR_EDGE = require('../internals/engine-is-ie-or-edge'); -var V8 = require('../internals/engine-v8-version'); -var WEBKIT = require('../internals/engine-webkit-version'); - -var test = []; -var un$Sort = uncurryThis(test.sort); -var push = uncurryThis(test.push); - -// IE8- -var FAILS_ON_UNDEFINED = fails(function () { - test.sort(undefined); -}); -// V8 bug -var FAILS_ON_NULL = fails(function () { - test.sort(null); -}); -// Old WebKit -var STRICT_METHOD = arrayMethodIsStrict('sort'); - -var STABLE_SORT = !fails(function () { - // feature detection can be too slow, so check engines versions - if (V8) return V8 < 70; - if (FF && FF > 3) return; - if (IE_OR_EDGE) return true; - if (WEBKIT) return WEBKIT < 603; - - var result = ''; - var code, chr, value, index; - - // generate an array with more 512 elements (Chakra and old V8 fails only in this case) - for (code = 65; code < 76; code++) { - chr = String.fromCharCode(code); - - switch (code) { - case 66: case 69: case 70: case 72: value = 3; break; - case 68: case 71: value = 4; break; - default: value = 2; - } - - for (index = 0; index < 47; index++) { - test.push({ k: chr + index, v: value }); - } - } - - test.sort(function (a, b) { return b.v - a.v; }); - - for (index = 0; index < test.length; index++) { - chr = test[index].k.charAt(0); - if (result.charAt(result.length - 1) !== chr) result += chr; - } - - return result !== 'DGBEFHACIJK'; -}); - -var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT; - -var getSortCompare = function (comparefn) { - return function (x, y) { - if (y === undefined) return -1; - if (x === undefined) return 1; - if (comparefn !== undefined) return +comparefn(x, y) || 0; - return toString(x) > toString(y) ? 1 : -1; - }; -}; - -// `Array.prototype.sort` method -// https://tc39.es/ecma262/#sec-array.prototype.sort -$({ target: 'Array', proto: true, forced: FORCED }, { - sort: function sort(comparefn) { - if (comparefn !== undefined) aCallable(comparefn); - - var array = toObject(this); - - if (STABLE_SORT) return comparefn === undefined ? un$Sort(array) : un$Sort(array, comparefn); - - var items = []; - var arrayLength = lengthOfArrayLike(array); - var itemsLength, index; - - for (index = 0; index < arrayLength; index++) { - if (index in array) push(items, array[index]); - } - - internalSort(items, getSortCompare(comparefn)); - - itemsLength = items.length; - index = 0; - - while (index < itemsLength) array[index] = items[index++]; - while (index < arrayLength) delete array[index++]; - - return array; - } -}); - -},{"../internals/a-callable":57,"../internals/array-method-is-strict":66,"../internals/array-sort":69,"../internals/engine-ff-version":86,"../internals/engine-is-ie-or-edge":87,"../internals/engine-v8-version":89,"../internals/engine-webkit-version":90,"../internals/export":93,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/to-string":161}],176:[function(require,module,exports){ -var global = require('../internals/global'); -var setToStringTag = require('../internals/set-to-string-tag'); - -// JSON[@@toStringTag] property -// https://tc39.es/ecma262/#sec-json-@@tostringtag -setToStringTag(global.JSON, 'JSON', true); - -},{"../internals/global":104,"../internals/set-to-string-tag":147}],177:[function(require,module,exports){ -// empty - -},{}],178:[function(require,module,exports){ -var $ = require('../internals/export'); -var DESCRIPTORS = require('../internals/descriptors'); -var create = require('../internals/object-create'); - -// `Object.create` method -// https://tc39.es/ecma262/#sec-object.create -$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, { - create: create -}); - -},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-create":127}],179:[function(require,module,exports){ -var $ = require('../internals/export'); -var DESCRIPTORS = require('../internals/descriptors'); -var objectDefinePropertyModile = require('../internals/object-define-property'); - -// `Object.defineProperty` method -// https://tc39.es/ecma262/#sec-object.defineproperty -$({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, { - defineProperty: objectDefinePropertyModile.f -}); - -},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-define-property":129}],180:[function(require,module,exports){ -arguments[4][177][0].apply(exports,arguments) -},{"dup":177}],181:[function(require,module,exports){ -var $ = require('../internals/export'); -var $parseInt = require('../internals/number-parse-int'); - -// `parseInt` method -// https://tc39.es/ecma262/#sec-parseint-string-radix -$({ global: true, forced: parseInt != $parseInt }, { - parseInt: $parseInt -}); - -},{"../internals/export":93,"../internals/number-parse-int":126}],182:[function(require,module,exports){ -arguments[4][177][0].apply(exports,arguments) -},{"dup":177}],183:[function(require,module,exports){ -arguments[4][177][0].apply(exports,arguments) -},{"dup":177}],184:[function(require,module,exports){ -'use strict'; -var charAt = require('../internals/string-multibyte').charAt; -var toString = require('../internals/to-string'); -var InternalStateModule = require('../internals/internal-state'); -var defineIterator = require('../internals/define-iterator'); - -var STRING_ITERATOR = 'String Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); - -// `String.prototype[@@iterator]` method -// https://tc39.es/ecma262/#sec-string.prototype-@@iterator -defineIterator(String, 'String', function (iterated) { - setInternalState(this, { - type: STRING_ITERATOR, - string: toString(iterated), - index: 0 - }); -// `%StringIteratorPrototype%.next` method -// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next -}, function next() { - var state = getInternalState(this); - var string = state.string; - var index = state.index; - var point; - if (index >= string.length) return { value: undefined, done: true }; - point = charAt(string, index); - state.index += point.length; - return { value: point, done: false }; -}); - -},{"../internals/define-iterator":81,"../internals/internal-state":111,"../internals/string-multibyte":151,"../internals/to-string":161}],185:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.asyncIterator` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.asynciterator -defineWellKnownSymbol('asyncIterator'); - -},{"../internals/define-well-known-symbol":82}],186:[function(require,module,exports){ -arguments[4][177][0].apply(exports,arguments) -},{"dup":177}],187:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.hasInstance` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.hasinstance -defineWellKnownSymbol('hasInstance'); - -},{"../internals/define-well-known-symbol":82}],188:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.isConcatSpreadable` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.isconcatspreadable -defineWellKnownSymbol('isConcatSpreadable'); - -},{"../internals/define-well-known-symbol":82}],189:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.iterator` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.iterator -defineWellKnownSymbol('iterator'); - -},{"../internals/define-well-known-symbol":82}],190:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var global = require('../internals/global'); -var getBuiltIn = require('../internals/get-built-in'); -var apply = require('../internals/function-apply'); -var call = require('../internals/function-call'); -var uncurryThis = require('../internals/function-uncurry-this'); -var IS_PURE = require('../internals/is-pure'); -var DESCRIPTORS = require('../internals/descriptors'); -var NATIVE_SYMBOL = require('../internals/native-symbol'); -var fails = require('../internals/fails'); -var hasOwn = require('../internals/has-own-property'); -var isArray = require('../internals/is-array'); -var isCallable = require('../internals/is-callable'); -var isObject = require('../internals/is-object'); -var isPrototypeOf = require('../internals/object-is-prototype-of'); -var isSymbol = require('../internals/is-symbol'); -var anObject = require('../internals/an-object'); -var toObject = require('../internals/to-object'); -var toIndexedObject = require('../internals/to-indexed-object'); -var toPropertyKey = require('../internals/to-property-key'); -var $toString = require('../internals/to-string'); -var createPropertyDescriptor = require('../internals/create-property-descriptor'); -var nativeObjectCreate = require('../internals/object-create'); -var objectKeys = require('../internals/object-keys'); -var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names'); -var getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external'); -var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols'); -var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor'); -var definePropertyModule = require('../internals/object-define-property'); -var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable'); -var arraySlice = require('../internals/array-slice'); -var redefine = require('../internals/redefine'); -var shared = require('../internals/shared'); -var sharedKey = require('../internals/shared-key'); -var hiddenKeys = require('../internals/hidden-keys'); -var uid = require('../internals/uid'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped'); -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); -var setToStringTag = require('../internals/set-to-string-tag'); -var InternalStateModule = require('../internals/internal-state'); -var $forEach = require('../internals/array-iteration').forEach; - -var HIDDEN = sharedKey('hidden'); -var SYMBOL = 'Symbol'; -var PROTOTYPE = 'prototype'; -var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); - -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(SYMBOL); - -var ObjectPrototype = Object[PROTOTYPE]; -var $Symbol = global.Symbol; -var SymbolPrototype = $Symbol && $Symbol[PROTOTYPE]; -var TypeError = global.TypeError; -var QObject = global.QObject; -var $stringify = getBuiltIn('JSON', 'stringify'); -var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; -var nativeDefineProperty = definePropertyModule.f; -var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f; -var nativePropertyIsEnumerable = propertyIsEnumerableModule.f; -var push = uncurryThis([].push); - -var AllSymbols = shared('symbols'); -var ObjectPrototypeSymbols = shared('op-symbols'); -var StringToSymbolRegistry = shared('string-to-symbol-registry'); -var SymbolToStringRegistry = shared('symbol-to-string-registry'); -var WellKnownSymbolsStore = shared('wks'); - -// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 -var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; - -// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 -var setSymbolDescriptor = DESCRIPTORS && fails(function () { - return nativeObjectCreate(nativeDefineProperty({}, 'a', { - get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; } - })).a != 7; -}) ? function (O, P, Attributes) { - var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P); - if (ObjectPrototypeDescriptor) delete ObjectPrototype[P]; - nativeDefineProperty(O, P, Attributes); - if (ObjectPrototypeDescriptor && O !== ObjectPrototype) { - nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor); - } -} : nativeDefineProperty; - -var wrap = function (tag, description) { - var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype); - setInternalState(symbol, { - type: SYMBOL, - tag: tag, - description: description - }); - if (!DESCRIPTORS) symbol.description = description; - return symbol; -}; - -var $defineProperty = function defineProperty(O, P, Attributes) { - if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes); - anObject(O); - var key = toPropertyKey(P); - anObject(Attributes); - if (hasOwn(AllSymbols, key)) { - if (!Attributes.enumerable) { - if (!hasOwn(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {})); - O[HIDDEN][key] = true; - } else { - if (hasOwn(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false; - Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) }); - } return setSymbolDescriptor(O, key, Attributes); - } return nativeDefineProperty(O, key, Attributes); -}; - -var $defineProperties = function defineProperties(O, Properties) { - anObject(O); - var properties = toIndexedObject(Properties); - var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties)); - $forEach(keys, function (key) { - if (!DESCRIPTORS || call($propertyIsEnumerable, properties, key)) $defineProperty(O, key, properties[key]); - }); - return O; -}; - -var $create = function create(O, Properties) { - return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties); -}; - -var $propertyIsEnumerable = function propertyIsEnumerable(V) { - var P = toPropertyKey(V); - var enumerable = call(nativePropertyIsEnumerable, this, P); - if (this === ObjectPrototype && hasOwn(AllSymbols, P) && !hasOwn(ObjectPrototypeSymbols, P)) return false; - return enumerable || !hasOwn(this, P) || !hasOwn(AllSymbols, P) || hasOwn(this, HIDDEN) && this[HIDDEN][P] - ? enumerable : true; -}; - -var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) { - var it = toIndexedObject(O); - var key = toPropertyKey(P); - if (it === ObjectPrototype && hasOwn(AllSymbols, key) && !hasOwn(ObjectPrototypeSymbols, key)) return; - var descriptor = nativeGetOwnPropertyDescriptor(it, key); - if (descriptor && hasOwn(AllSymbols, key) && !(hasOwn(it, HIDDEN) && it[HIDDEN][key])) { - descriptor.enumerable = true; - } - return descriptor; -}; - -var $getOwnPropertyNames = function getOwnPropertyNames(O) { - var names = nativeGetOwnPropertyNames(toIndexedObject(O)); - var result = []; - $forEach(names, function (key) { - if (!hasOwn(AllSymbols, key) && !hasOwn(hiddenKeys, key)) push(result, key); - }); - return result; -}; - -var $getOwnPropertySymbols = function getOwnPropertySymbols(O) { - var IS_OBJECT_PROTOTYPE = O === ObjectPrototype; - var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O)); - var result = []; - $forEach(names, function (key) { - if (hasOwn(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn(ObjectPrototype, key))) { - push(result, AllSymbols[key]); - } - }); - return result; -}; - -// `Symbol` constructor -// https://tc39.es/ecma262/#sec-symbol-constructor -if (!NATIVE_SYMBOL) { - $Symbol = function Symbol() { - if (isPrototypeOf(SymbolPrototype, this)) throw TypeError('Symbol is not a constructor'); - var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]); - var tag = uid(description); - var setter = function (value) { - if (this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value); - if (hasOwn(this, HIDDEN) && hasOwn(this[HIDDEN], tag)) this[HIDDEN][tag] = false; - setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value)); - }; - if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter }); - return wrap(tag, description); - }; - - SymbolPrototype = $Symbol[PROTOTYPE]; - - redefine(SymbolPrototype, 'toString', function toString() { - return getInternalState(this).tag; - }); - - redefine($Symbol, 'withoutSetter', function (description) { - return wrap(uid(description), description); - }); - - propertyIsEnumerableModule.f = $propertyIsEnumerable; - definePropertyModule.f = $defineProperty; - getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor; - getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames; - getOwnPropertySymbolsModule.f = $getOwnPropertySymbols; - - wrappedWellKnownSymbolModule.f = function (name) { - return wrap(wellKnownSymbol(name), name); - }; - - if (DESCRIPTORS) { - // https://github.com/tc39/proposal-Symbol-description - nativeDefineProperty(SymbolPrototype, 'description', { - configurable: true, - get: function description() { - return getInternalState(this).description; - } - }); - if (!IS_PURE) { - redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true }); - } - } -} - -$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, { - Symbol: $Symbol -}); - -$forEach(objectKeys(WellKnownSymbolsStore), function (name) { - defineWellKnownSymbol(name); -}); - -$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, { - // `Symbol.for` method - // https://tc39.es/ecma262/#sec-symbol.for - 'for': function (key) { - var string = $toString(key); - if (hasOwn(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string]; - var symbol = $Symbol(string); - StringToSymbolRegistry[string] = symbol; - SymbolToStringRegistry[symbol] = string; - return symbol; - }, - // `Symbol.keyFor` method - // https://tc39.es/ecma262/#sec-symbol.keyfor - keyFor: function keyFor(sym) { - if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol'); - if (hasOwn(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym]; - }, - useSetter: function () { USE_SETTER = true; }, - useSimple: function () { USE_SETTER = false; } -}); - -$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, { - // `Object.create` method - // https://tc39.es/ecma262/#sec-object.create - create: $create, - // `Object.defineProperty` method - // https://tc39.es/ecma262/#sec-object.defineproperty - defineProperty: $defineProperty, - // `Object.defineProperties` method - // https://tc39.es/ecma262/#sec-object.defineproperties - defineProperties: $defineProperties, - // `Object.getOwnPropertyDescriptor` method - // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors - getOwnPropertyDescriptor: $getOwnPropertyDescriptor -}); - -$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, { - // `Object.getOwnPropertyNames` method - // https://tc39.es/ecma262/#sec-object.getownpropertynames - getOwnPropertyNames: $getOwnPropertyNames, - // `Object.getOwnPropertySymbols` method - // https://tc39.es/ecma262/#sec-object.getownpropertysymbols - getOwnPropertySymbols: $getOwnPropertySymbols -}); - -// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives -// https://bugs.chromium.org/p/v8/issues/detail?id=3443 -$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, { - getOwnPropertySymbols: function getOwnPropertySymbols(it) { - return getOwnPropertySymbolsModule.f(toObject(it)); - } -}); - -// `JSON.stringify` method behavior with symbols -// https://tc39.es/ecma262/#sec-json.stringify -if ($stringify) { - var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () { - var symbol = $Symbol(); - // MS Edge converts symbol values to JSON as {} - return $stringify([symbol]) != '[null]' - // WebKit converts symbol values to JSON as null - || $stringify({ a: symbol }) != '{}' - // V8 throws on boxed symbols - || $stringify(Object(symbol)) != '{}'; - }); - - $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, { - // eslint-disable-next-line no-unused-vars -- required for `.length` - stringify: function stringify(it, replacer, space) { - var args = arraySlice(arguments); - var $replacer = replacer; - if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined - if (!isArray(replacer)) replacer = function (key, value) { - if (isCallable($replacer)) value = call($replacer, this, key, value); - if (!isSymbol(value)) return value; - }; - args[1] = replacer; - return apply($stringify, null, args); - } - }); -} - -// `Symbol.prototype[@@toPrimitive]` method -// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive -if (!SymbolPrototype[TO_PRIMITIVE]) { - var valueOf = SymbolPrototype.valueOf; - // eslint-disable-next-line no-unused-vars -- required for .length - redefine(SymbolPrototype, TO_PRIMITIVE, function (hint) { - // TODO: improve hint logic - return call(valueOf, this); - }); -} -// `Symbol.prototype[@@toStringTag]` property -// https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag -setToStringTag($Symbol, SYMBOL); - -hiddenKeys[HIDDEN] = true; - -},{"../internals/an-object":60,"../internals/array-iteration":64,"../internals/array-slice":68,"../internals/create-property-descriptor":79,"../internals/define-well-known-symbol":82,"../internals/descriptors":83,"../internals/export":93,"../internals/fails":94,"../internals/function-apply":95,"../internals/function-call":97,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/internal-state":111,"../internals/is-array":113,"../internals/is-callable":114,"../internals/is-object":117,"../internals/is-pure":118,"../internals/is-symbol":119,"../internals/native-symbol":124,"../internals/object-create":127,"../internals/object-define-property":129,"../internals/object-get-own-property-descriptor":130,"../internals/object-get-own-property-names":132,"../internals/object-get-own-property-names-external":131,"../internals/object-get-own-property-symbols":133,"../internals/object-is-prototype-of":135,"../internals/object-keys":137,"../internals/object-property-is-enumerable":138,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/shared":150,"../internals/shared-key":148,"../internals/to-indexed-object":154,"../internals/to-object":157,"../internals/to-property-key":159,"../internals/to-string":161,"../internals/uid":163,"../internals/well-known-symbol":166,"../internals/well-known-symbol-wrapped":165}],191:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.matchAll` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.matchall -defineWellKnownSymbol('matchAll'); - -},{"../internals/define-well-known-symbol":82}],192:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.match` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.match -defineWellKnownSymbol('match'); - -},{"../internals/define-well-known-symbol":82}],193:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.replace` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.replace -defineWellKnownSymbol('replace'); - -},{"../internals/define-well-known-symbol":82}],194:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.search` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.search -defineWellKnownSymbol('search'); - -},{"../internals/define-well-known-symbol":82}],195:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.species` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.species -defineWellKnownSymbol('species'); - -},{"../internals/define-well-known-symbol":82}],196:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.split` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.split -defineWellKnownSymbol('split'); - -},{"../internals/define-well-known-symbol":82}],197:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.toPrimitive` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.toprimitive -defineWellKnownSymbol('toPrimitive'); - -},{"../internals/define-well-known-symbol":82}],198:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.toStringTag` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.tostringtag -defineWellKnownSymbol('toStringTag'); - -},{"../internals/define-well-known-symbol":82}],199:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.unscopables` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.unscopables -defineWellKnownSymbol('unscopables'); - -},{"../internals/define-well-known-symbol":82}],200:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.asyncDispose` well-known symbol -// https://github.com/tc39/proposal-using-statement -defineWellKnownSymbol('asyncDispose'); - -},{"../internals/define-well-known-symbol":82}],201:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.dispose` well-known symbol -// https://github.com/tc39/proposal-using-statement -defineWellKnownSymbol('dispose'); - -},{"../internals/define-well-known-symbol":82}],202:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.matcher` well-known symbol -// https://github.com/tc39/proposal-pattern-matching -defineWellKnownSymbol('matcher'); - -},{"../internals/define-well-known-symbol":82}],203:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.metadata` well-known symbol -// https://github.com/tc39/proposal-decorators -defineWellKnownSymbol('metadata'); - -},{"../internals/define-well-known-symbol":82}],204:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.observable` well-known symbol -// https://github.com/tc39/proposal-observable -defineWellKnownSymbol('observable'); - -},{"../internals/define-well-known-symbol":82}],205:[function(require,module,exports){ -// TODO: remove from `core-js@4` -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.patternMatch` well-known symbol -// https://github.com/tc39/proposal-pattern-matching -defineWellKnownSymbol('patternMatch'); - -},{"../internals/define-well-known-symbol":82}],206:[function(require,module,exports){ -// TODO: remove from `core-js@4` -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -defineWellKnownSymbol('replaceAll'); - -},{"../internals/define-well-known-symbol":82}],207:[function(require,module,exports){ -require('../modules/es.array.iterator'); -var DOMIterables = require('../internals/dom-iterables'); -var global = require('../internals/global'); -var classof = require('../internals/classof'); -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); -var Iterators = require('../internals/iterators'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); - -for (var COLLECTION_NAME in DOMIterables) { - var Collection = global[COLLECTION_NAME]; - var CollectionPrototype = Collection && Collection.prototype; - if (CollectionPrototype && classof(CollectionPrototype) !== TO_STRING_TAG) { - createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); - } - Iterators[COLLECTION_NAME] = Iterators.Array; -} - -},{"../internals/classof":75,"../internals/create-non-enumerable-property":78,"../internals/dom-iterables":85,"../internals/global":104,"../internals/iterators":122,"../internals/well-known-symbol":166,"../modules/es.array.iterator":173}],208:[function(require,module,exports){ -var parent = require('../../es/array/from'); - -module.exports = parent; - -},{"../../es/array/from":34}],209:[function(require,module,exports){ -var parent = require('../../es/array/is-array'); - -module.exports = parent; - -},{"../../es/array/is-array":35}],210:[function(require,module,exports){ -var parent = require('../../../es/array/virtual/for-each'); - -module.exports = parent; - -},{"../../../es/array/virtual/for-each":37}],211:[function(require,module,exports){ -var parent = require('../es/get-iterator-method'); -require('../modules/web.dom-collections.iterator'); - -module.exports = parent; - -},{"../es/get-iterator-method":41,"../modules/web.dom-collections.iterator":207}],212:[function(require,module,exports){ -var parent = require('../../es/instance/concat'); - -module.exports = parent; - -},{"../../es/instance/concat":42}],213:[function(require,module,exports){ -var parent = require('../../es/instance/flags'); - -module.exports = parent; - -},{"../../es/instance/flags":43}],214:[function(require,module,exports){ -require('../../modules/web.dom-collections.iterator'); -var classof = require('../../internals/classof'); -var hasOwn = require('../../internals/has-own-property'); -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var method = require('../array/virtual/for-each'); - -var ArrayPrototype = Array.prototype; - -var DOMIterables = { - DOMTokenList: true, - NodeList: true -}; - -module.exports = function (it) { - var own = it.forEach; - return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.forEach) - || hasOwn(DOMIterables, classof(it)) ? method : own; -}; - -},{"../../internals/classof":75,"../../internals/has-own-property":105,"../../internals/object-is-prototype-of":135,"../../modules/web.dom-collections.iterator":207,"../array/virtual/for-each":210}],215:[function(require,module,exports){ -var parent = require('../../es/instance/index-of'); - -module.exports = parent; - -},{"../../es/instance/index-of":44}],216:[function(require,module,exports){ -var parent = require('../../es/instance/slice'); - -module.exports = parent; - -},{"../../es/instance/slice":45}],217:[function(require,module,exports){ -var parent = require('../../es/instance/sort'); - -module.exports = parent; - -},{"../../es/instance/sort":46}],218:[function(require,module,exports){ -var parent = require('../../es/object/create'); - -module.exports = parent; - -},{"../../es/object/create":47}],219:[function(require,module,exports){ -var parent = require('../../es/object/define-property'); - -module.exports = parent; - -},{"../../es/object/define-property":48}],220:[function(require,module,exports){ -var parent = require('../es/parse-int'); - -module.exports = parent; - -},{"../es/parse-int":49}],221:[function(require,module,exports){ -var parent = require('../../es/symbol'); -require('../../modules/web.dom-collections.iterator'); - -module.exports = parent; - -},{"../../es/symbol":51,"../../modules/web.dom-collections.iterator":207}],222:[function(require,module,exports){ -module.exports = [ - { - 'name': 'C', - 'alias': 'Other', - 'isBmpLast': true, - 'bmp': '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EE\u05F5-\u0605\u061C\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB\u07FC\u082E\u082F\u083F\u085C\u085D\u085F\u086B-\u086F\u088F-\u0897\u08E2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A77-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C0D\u0C11\u0C29\u0C3A\u0C3B\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B\u0C5C\u0C5E\u0C5F\u0C64\u0C65\u0C70-\u0C76\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDC\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u1716-\u171E\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ACF-\u1AFF\u1B4D-\u1B4F\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1C8F\u1CBB\u1CBC\u1CC8-\u1CCF\u1CFB-\u1CFF\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20C1-\u20CF\u20F1-\u20FF\u218C-\u218F\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E5E-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u3130\u318F\u31E4-\u31EF\u321F\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7CB-\uA7CF\uA7D2\uA7D4\uA7DA-\uA7F1\uA82D-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB6C-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC3-\uFBD2\uFD90\uFD91\uFDC8-\uFDCE\uFDD0-\uFDEF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF', - 'astral': '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9D-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD7B\uDD8B\uDD93\uDD96\uDDA2\uDDB2\uDDBA\uDDBD-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDF7F\uDF86\uDFB1\uDFBB-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F\uDEAA\uDEAE\uDEAF\uDEB2-\uDEFF\uDF28-\uDF2F\uDF5A-\uDF6F\uDF8A-\uDFAF\uDFCC-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC76-\uDC7E\uDCBD\uDCC3-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD48-\uDD4F\uDD77-\uDD7F\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5C\uDC62-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEBA-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF47-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD47-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEAF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFAF\uDFB1-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80E-\uD810\uD812-\uD819\uD824-\uD82A\uD82D\uD82E\uD830-\uD832\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80B[\uDC00-\uDF8F\uDFF3-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDEBF\uDECA-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82B[\uDC00-\uDFEF\uDFF4\uDFFC\uDFFF]|\uD82C[\uDD23-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD833[\uDC00-\uDEFF\uDF2E\uDF2F\uDF47-\uDF4F\uDFC4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDEB-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD837[\uDC00-\uDEFF\uDF1F-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDE8F\uDEAF-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD839[\uDC00-\uDFDF\uDFE7\uDFEC\uDFEF\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDDAE-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED8-\uDEDC\uDEED-\uDEEF\uDEFD-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFEF\uDFF1-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE\uDCAF\uDCB2-\uDCFF\uDE54-\uDE5F\uDE6E\uDE6F\uDE75-\uDE77\uDE7D-\uDE7F\uDE87-\uDE8F\uDEAD-\uDEAF\uDEBB-\uDEBF\uDEC6-\uDECF\uDEDA-\uDEDF\uDEE8-\uDEEF\uDEF7-\uDEFF\uDF93\uDFCB-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEE0-\uDEFF]|\uD86D[\uDF39-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]' - }, - { - 'name': 'Cc', - 'alias': 'Control', - 'bmp': '\0-\x1F\x7F-\x9F' - }, - { - 'name': 'Cf', - 'alias': 'Format', - 'bmp': '\xAD\u0600-\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB', - 'astral': '\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC38]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]' - }, - { - 'name': 'Cn', - 'alias': 'Unassigned', - 'bmp': '\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EE\u05F5-\u05FF\u070E\u074B\u074C\u07B2-\u07BF\u07FB\u07FC\u082E\u082F\u083F\u085C\u085D\u085F\u086B-\u086F\u088F\u0892-\u0897\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A77-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C0D\u0C11\u0C29\u0C3A\u0C3B\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B\u0C5C\u0C5E\u0C5F\u0C64\u0C65\u0C70-\u0C76\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDC\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u1716-\u171E\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ACF-\u1AFF\u1B4D-\u1B4F\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1C8F\u1CBB\u1CBC\u1CC8-\u1CCF\u1CFB-\u1CFF\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u2065\u2072\u2073\u208F\u209D-\u209F\u20C1-\u20CF\u20F1-\u20FF\u218C-\u218F\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E5E-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u3130\u318F\u31E4-\u31EF\u321F\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7CB-\uA7CF\uA7D2\uA7D4\uA7DA-\uA7F1\uA82D-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB6C-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC3-\uFBD2\uFD90\uFD91\uFDC8-\uFDCE\uFDD0-\uFDEF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD\uFEFE\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFF8\uFFFE\uFFFF', - 'astral': '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9D-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD7B\uDD8B\uDD93\uDD96\uDDA2\uDDB2\uDDBA\uDDBD-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDF7F\uDF86\uDFB1\uDFBB-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F\uDEAA\uDEAE\uDEAF\uDEB2-\uDEFF\uDF28-\uDF2F\uDF5A-\uDF6F\uDF8A-\uDFAF\uDFCC-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC76-\uDC7E\uDCC3-\uDCCC\uDCCE\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD48-\uDD4F\uDD77-\uDD7F\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5C\uDC62-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEBA-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF47-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD47-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEAF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFAF\uDFB1-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80E-\uD810\uD812-\uD819\uD824-\uD82A\uD82D\uD82E\uD830-\uD832\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80B[\uDC00-\uDF8F\uDFF3-\uDFFF]|\uD80D[\uDC2F\uDC39-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDEBF\uDECA-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82B[\uDC00-\uDFEF\uDFF4\uDFFC\uDFFF]|\uD82C[\uDD23-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD833[\uDC00-\uDEFF\uDF2E\uDF2F\uDF47-\uDF4F\uDFC4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDEB-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD837[\uDC00-\uDEFF\uDF1F-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDE8F\uDEAF-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD839[\uDC00-\uDFDF\uDFE7\uDFEC\uDFEF\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDDAE-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED8-\uDEDC\uDEED-\uDEEF\uDEFD-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFEF\uDFF1-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE\uDCAF\uDCB2-\uDCFF\uDE54-\uDE5F\uDE6E\uDE6F\uDE75-\uDE77\uDE7D-\uDE7F\uDE87-\uDE8F\uDEAD-\uDEAF\uDEBB-\uDEBF\uDEC6-\uDECF\uDEDA-\uDEDF\uDEE8-\uDEEF\uDEF7-\uDEFF\uDF93\uDFCB-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEE0-\uDEFF]|\uD86D[\uDF39-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00\uDC02-\uDC1F\uDC80-\uDCFF\uDDF0-\uDFFF]|[\uDBBF\uDBFF][\uDFFE\uDFFF]' - }, - { - 'name': 'Co', - 'alias': 'Private_Use', - 'bmp': '\uE000-\uF8FF', - 'astral': '[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD]' - }, - { - 'name': 'Cs', - 'alias': 'Surrogate', - 'bmp': '\uD800-\uDFFF' - }, - { - 'name': 'L', - 'alias': 'Letter', - 'bmp': 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', - 'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]' - }, - { - 'name': 'LC', - 'alias': 'Cased_Letter', - 'bmp': 'A-Za-z\xB5\xC0-\xD6\xD8-\xF6\xF8-\u01BA\u01BC-\u01BF\u01C4-\u0293\u0295-\u02AF\u0370-\u0373\u0376\u0377\u037B-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0560-\u0588\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FD-\u10FF\u13A0-\u13F5\u13F8-\u13FD\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2134\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C7B\u2C7E-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA640-\uA66D\uA680-\uA69B\uA722-\uA76F\uA771-\uA787\uA78B-\uA78E\uA790-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F5\uA7F6\uA7FA\uAB30-\uAB5A\uAB60-\uAB68\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF21-\uFF3A\uFF41-\uFF5A', - 'astral': '\uD801[\uDC00-\uDC4F\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC]|\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD806[\uDCA0-\uDCDF]|\uD81B[\uDE40-\uDE7F]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF09\uDF0B-\uDF1E]|\uD83A[\uDD00-\uDD43]' - }, - { - 'name': 'Ll', - 'alias': 'Lowercase_Letter', - 'bmp': 'a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5F\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7BB\uA7BD\uA7BF\uA7C1\uA7C3\uA7C8\uA7CA\uA7D1\uA7D3\uA7D5\uA7D7\uA7D9\uA7F6\uA7FA\uAB30-\uAB5A\uAB60-\uAB68\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', - 'astral': '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD81B[\uDE60-\uDE7F]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD837[\uDF00-\uDF09\uDF0B-\uDF1E]|\uD83A[\uDD22-\uDD43]' - }, - { - 'name': 'Lm', - 'alias': 'Modifier_Letter', - 'bmp': '\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u081A\u0824\u0828\u08C9\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F2-\uA7F4\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uAB69\uFF70\uFF9E\uFF9F', - 'astral': '\uD801[\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD838[\uDD37-\uDD3D]|\uD83A\uDD4B' - }, - { - 'name': 'Lo', - 'alias': 'Other_Letter', - 'bmp': '\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C8\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', - 'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC50-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF4A\uDF50]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD837\uDF0A|\uD838[\uDD00-\uDD2C\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]' - }, - { - 'name': 'Lt', - 'alias': 'Titlecase_Letter', - 'bmp': '\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC' - }, - { - 'name': 'Lu', - 'alias': 'Uppercase_Letter', - 'bmp': 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2183\u2C00-\u2C2F\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uA7BA\uA7BC\uA7BE\uA7C0\uA7C2\uA7C4-\uA7C7\uA7C9\uA7D0\uA7D6\uA7D8\uA7F5\uFF21-\uFF3A', - 'astral': '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD81B[\uDE40-\uDE5F]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]' - }, - { - 'name': 'M', - 'alias': 'Mark', - 'bmp': '\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u0898-\u089F\u08CA-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3C\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D81-\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u180F\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ACE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA82C\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', - 'astral': '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD803[\uDD24-\uDD27\uDEAB\uDEAC\uDF46-\uDF50\uDF82-\uDF85]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC70\uDC73\uDC74\uDC7F-\uDC82\uDCB0-\uDCBA\uDCC2\uDD00-\uDD02\uDD27-\uDD34\uDD45\uDD46\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDDC9-\uDDCC\uDDCE\uDDCF\uDE2C-\uDE37\uDE3E\uDEDF-\uDEEA\uDF00-\uDF03\uDF3B\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC35-\uDC46\uDC5E\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDDDC\uDDDD\uDE30-\uDE40\uDEAB-\uDEB7\uDF1D-\uDF2B]|\uD806[\uDC2C-\uDC3A\uDD30-\uDD35\uDD37\uDD38\uDD3B-\uDD3E\uDD40\uDD42\uDD43\uDDD1-\uDDD7\uDDDA-\uDDE0\uDDE4\uDE01-\uDE0A\uDE33-\uDE39\uDE3B-\uDE3E\uDE47\uDE51-\uDE5B\uDE8A-\uDE99]|\uD807[\uDC2F-\uDC36\uDC38-\uDC3F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD31-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD45\uDD47\uDD8A-\uDD8E\uDD90\uDD91\uDD93-\uDD97\uDEF3-\uDEF6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF4F\uDF51-\uDF87\uDF8F-\uDF92\uDFE4\uDFF0\uDFF1]|\uD82F[\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD30-\uDD36\uDEAE\uDEEC-\uDEEF]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' - }, - { - 'name': 'Mc', - 'alias': 'Spacing_Mark', - 'bmp': '\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E\u094F\u0982\u0983\u09BE-\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062-\u1064\u1067-\u106D\u1083\u1084\u1087-\u108C\u108F\u109A-\u109C\u1715\u1734\u17B6\u17BE-\u17C5\u17C7\u17C8\u1923-\u1926\u1929-\u192B\u1930\u1931\u1933-\u1938\u1A19\u1A1A\u1A55\u1A57\u1A61\u1A63\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2\u1BF3\u1C24-\u1C2B\u1C34\u1C35\u1CE1\u1CF7\u302E\u302F\uA823\uA824\uA827\uA880\uA881\uA8B4-\uA8C3\uA952\uA953\uA983\uA9B4\uA9B5\uA9BA\uA9BB\uA9BE-\uA9C0\uAA2F\uAA30\uAA33\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE\uAAEF\uAAF5\uABE3\uABE4\uABE6\uABE7\uABE9\uABEA\uABEC', - 'astral': '\uD804[\uDC00\uDC02\uDC82\uDCB0-\uDCB2\uDCB7\uDCB8\uDD2C\uDD45\uDD46\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\uDDCE\uDE2C-\uDE2E\uDE32\uDE33\uDE35\uDEE0-\uDEE2\uDF02\uDF03\uDF3E\uDF3F\uDF41-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63]|\uD805[\uDC35-\uDC37\uDC40\uDC41\uDC45\uDCB0-\uDCB2\uDCB9\uDCBB-\uDCBE\uDCC1\uDDAF-\uDDB1\uDDB8-\uDDBB\uDDBE\uDE30-\uDE32\uDE3B\uDE3C\uDE3E\uDEAC\uDEAE\uDEAF\uDEB6\uDF20\uDF21\uDF26]|\uD806[\uDC2C-\uDC2E\uDC38\uDD30-\uDD35\uDD37\uDD38\uDD3D\uDD40\uDD42\uDDD1-\uDDD3\uDDDC-\uDDDF\uDDE4\uDE39\uDE57\uDE58\uDE97]|\uD807[\uDC2F\uDC3E\uDCA9\uDCB1\uDCB4\uDD8A-\uDD8E\uDD93\uDD94\uDD96\uDEF5\uDEF6]|\uD81B[\uDF51-\uDF87\uDFF0\uDFF1]|\uD834[\uDD65\uDD66\uDD6D-\uDD72]' - }, - { - 'name': 'Me', - 'alias': 'Enclosing_Mark', - 'bmp': '\u0488\u0489\u1ABE\u20DD-\u20E0\u20E2-\u20E4\uA670-\uA672' - }, - { - 'name': 'Mn', - 'alias': 'Nonspacing_Mark', - 'bmp': '\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u0898-\u089F\u08CA-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2\u09E3\u09FE\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B55\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C04\u0C3C\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D00\u0D01\u0D3B\u0D3C\u0D41-\u0D44\u0D4D\u0D62\u0D63\u0D81\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732\u1733\u1752\u1753\u1772\u1773\u17B4\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u180F\u1885\u1886\u18A9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193B\u1A17\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80\u1B81\u1BA2-\u1BA5\u1BA8\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099\u309A\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA825\uA826\uA82C\uA8C4\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9BD\uA9E5\uAA29-\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEC\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', - 'astral': '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD803[\uDD24-\uDD27\uDEAB\uDEAC\uDF46-\uDF50\uDF82-\uDF85]|\uD804[\uDC01\uDC38-\uDC46\uDC70\uDC73\uDC74\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDCC2\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDDC9-\uDDCC\uDDCF\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDE3E\uDEDF\uDEE3-\uDEEA\uDF00\uDF01\uDF3B\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC38-\uDC3F\uDC42-\uDC44\uDC46\uDC5E\uDCB3-\uDCB8\uDCBA\uDCBF\uDCC0\uDCC2\uDCC3\uDDB2-\uDDB5\uDDBC\uDDBD\uDDBF\uDDC0\uDDDC\uDDDD\uDE33-\uDE3A\uDE3D\uDE3F\uDE40\uDEAB\uDEAD\uDEB0-\uDEB5\uDEB7\uDF1D-\uDF1F\uDF22-\uDF25\uDF27-\uDF2B]|\uD806[\uDC2F-\uDC37\uDC39\uDC3A\uDD3B\uDD3C\uDD3E\uDD43\uDDD4-\uDDD7\uDDDA\uDDDB\uDDE0\uDE01-\uDE0A\uDE33-\uDE38\uDE3B-\uDE3E\uDE47\uDE51-\uDE56\uDE59-\uDE5B\uDE8A-\uDE96\uDE98\uDE99]|\uD807[\uDC30-\uDC36\uDC38-\uDC3D\uDC3F\uDC92-\uDCA7\uDCAA-\uDCB0\uDCB2\uDCB3\uDCB5\uDCB6\uDD31-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD45\uDD47\uDD90\uDD91\uDD95\uDD97\uDEF3\uDEF4]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF4F\uDF8F-\uDF92\uDFE4]|\uD82F[\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD30-\uDD36\uDEAE\uDEEC-\uDEEF]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' - }, - { - 'name': 'N', - 'alias': 'Number', - 'bmp': '0-9\xB2\xB3\xB9\xBC-\xBE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D58-\u0D5E\u0D66-\u0D78\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', - 'astral': '\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE48\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDD30-\uDD39\uDE60-\uDE7E\uDF1D-\uDF26\uDF51-\uDF54\uDFC5-\uDFCB]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF3B]|\uD806[\uDCE0-\uDCF2\uDD50-\uDD59]|\uD807[\uDC50-\uDC6C\uDD50-\uDD59\uDDA0-\uDDA9\uDFC0-\uDFD4]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDEC0-\uDEC9\uDF50-\uDF59\uDF5B-\uDF61]|\uD81B[\uDE80-\uDE96]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDFCE-\uDFFF]|\uD838[\uDD40-\uDD49\uDEF0-\uDEF9]|\uD83A[\uDCC7-\uDCCF\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]' - }, - { - 'name': 'Nd', - 'alias': 'Decimal_Number', - 'bmp': '0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', - 'astral': '\uD801[\uDCA0-\uDCA9]|\uD803[\uDD30-\uDD39]|\uD804[\uDC66-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF39]|\uD806[\uDCE0-\uDCE9\uDD50-\uDD59]|\uD807[\uDC50-\uDC59\uDD50-\uDD59\uDDA0-\uDDA9]|\uD81A[\uDE60-\uDE69\uDEC0-\uDEC9\uDF50-\uDF59]|\uD835[\uDFCE-\uDFFF]|\uD838[\uDD40-\uDD49\uDEF0-\uDEF9]|\uD83A[\uDD50-\uDD59]|\uD83E[\uDFF0-\uDFF9]' - }, - { - 'name': 'Nl', - 'alias': 'Letter_Number', - 'bmp': '\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF', - 'astral': '\uD800[\uDD40-\uDD74\uDF41\uDF4A\uDFD1-\uDFD5]|\uD809[\uDC00-\uDC6E]' - }, - { - 'name': 'No', - 'alias': 'Other_Number', - 'bmp': '\xB2\xB3\xB9\xBC-\xBE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835', - 'astral': '\uD800[\uDD07-\uDD33\uDD75-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE48\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E\uDF1D-\uDF26\uDF51-\uDF54\uDFC5-\uDFCB]|\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD805[\uDF3A\uDF3B]|\uD806[\uDCEA-\uDCF2]|\uD807[\uDC5A-\uDC6C\uDFC0-\uDFD4]|\uD81A[\uDF5B-\uDF61]|\uD81B[\uDE80-\uDE96]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD83A[\uDCC7-\uDCCF]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D]|\uD83C[\uDD00-\uDD0C]' - }, - { - 'name': 'P', - 'alias': 'Punctuation', - 'bmp': '!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65', - 'astral': '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' - }, - { - 'name': 'Pc', - 'alias': 'Connector_Punctuation', - 'bmp': '_\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F' - }, - { - 'name': 'Pd', - 'alias': 'Dash_Punctuation', - 'bmp': '\\-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u2E5D\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D', - 'astral': '\uD803\uDEAD' - }, - { - 'name': 'Pe', - 'alias': 'Close_Punctuation', - 'bmp': '\\)\\]\\}\u0F3B\u0F3D\u169C\u2046\u207E\u208E\u2309\u230B\u232A\u2769\u276B\u276D\u276F\u2771\u2773\u2775\u27C6\u27E7\u27E9\u27EB\u27ED\u27EF\u2984\u2986\u2988\u298A\u298C\u298E\u2990\u2992\u2994\u2996\u2998\u29D9\u29DB\u29FD\u2E23\u2E25\u2E27\u2E29\u2E56\u2E58\u2E5A\u2E5C\u3009\u300B\u300D\u300F\u3011\u3015\u3017\u3019\u301B\u301E\u301F\uFD3E\uFE18\uFE36\uFE38\uFE3A\uFE3C\uFE3E\uFE40\uFE42\uFE44\uFE48\uFE5A\uFE5C\uFE5E\uFF09\uFF3D\uFF5D\uFF60\uFF63' - }, - { - 'name': 'Pf', - 'alias': 'Final_Punctuation', - 'bmp': '\xBB\u2019\u201D\u203A\u2E03\u2E05\u2E0A\u2E0D\u2E1D\u2E21' - }, - { - 'name': 'Pi', - 'alias': 'Initial_Punctuation', - 'bmp': '\xAB\u2018\u201B\u201C\u201F\u2039\u2E02\u2E04\u2E09\u2E0C\u2E1C\u2E20' - }, - { - 'name': 'Po', - 'alias': 'Other_Punctuation', - 'bmp': '!-#%-\'\\*,\\.\\/:;\\?@\\\xA1\xA7\xB6\xB7\xBF\u037E\u0387\u055A-\u055F\u0589\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u166E\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u1805\u1807-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203B-\u203E\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205E\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00\u2E01\u2E06-\u2E08\u2E0B\u2E0E-\u2E16\u2E18\u2E19\u2E1B\u2E1E\u2E1F\u2E2A-\u2E2E\u2E30-\u2E39\u2E3C-\u2E3F\u2E41\u2E43-\u2E4F\u2E52-\u2E54\u3001-\u3003\u303D\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFE10-\uFE16\uFE19\uFE30\uFE45\uFE46\uFE49-\uFE4C\uFE50-\uFE52\uFE54-\uFE57\uFE5F-\uFE61\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF07\uFF0A\uFF0C\uFF0E\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3C\uFF61\uFF64\uFF65', - 'astral': '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' - }, - { - 'name': 'Ps', - 'alias': 'Open_Punctuation', - 'bmp': '\\(\\[\\{\u0F3A\u0F3C\u169B\u201A\u201E\u2045\u207D\u208D\u2308\u230A\u2329\u2768\u276A\u276C\u276E\u2770\u2772\u2774\u27C5\u27E6\u27E8\u27EA\u27EC\u27EE\u2983\u2985\u2987\u2989\u298B\u298D\u298F\u2991\u2993\u2995\u2997\u29D8\u29DA\u29FC\u2E22\u2E24\u2E26\u2E28\u2E42\u2E55\u2E57\u2E59\u2E5B\u3008\u300A\u300C\u300E\u3010\u3014\u3016\u3018\u301A\u301D\uFD3F\uFE17\uFE35\uFE37\uFE39\uFE3B\uFE3D\uFE3F\uFE41\uFE43\uFE47\uFE59\uFE5B\uFE5D\uFF08\uFF3B\uFF5B\uFF5F\uFF62' - }, - { - 'name': 'S', - 'alias': 'Symbol', - 'bmp': '\\$\\+<->\\^`\\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD', - 'astral': '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDD-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE74\uDE78-\uDE7C\uDE80-\uDE86\uDE90-\uDEAC\uDEB0-\uDEBA\uDEC0-\uDEC5\uDED0-\uDED9\uDEE0-\uDEE7\uDEF0-\uDEF6\uDF00-\uDF92\uDF94-\uDFCA]' - }, - { - 'name': 'Sc', - 'alias': 'Currency_Symbol', - 'bmp': '\\$\xA2-\xA5\u058F\u060B\u07FE\u07FF\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20C0\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6', - 'astral': '\uD807[\uDFDD-\uDFE0]|\uD838\uDEFF|\uD83B\uDCB0' - }, - { - 'name': 'Sk', - 'alias': 'Modifier_Symbol', - 'bmp': '\\^`\xA8\xAF\xB4\xB8\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u0888\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u309B\u309C\uA700-\uA716\uA720\uA721\uA789\uA78A\uAB5B\uAB6A\uAB6B\uFBB2-\uFBC2\uFF3E\uFF40\uFFE3', - 'astral': '\uD83C[\uDFFB-\uDFFF]' - }, - { - 'name': 'Sm', - 'alias': 'Math_Symbol', - 'bmp': '\\+<->\\|~\xAC\xB1\xD7\xF7\u03F6\u0606-\u0608\u2044\u2052\u207A-\u207C\u208A-\u208C\u2118\u2140-\u2144\u214B\u2190-\u2194\u219A\u219B\u21A0\u21A3\u21A6\u21AE\u21CE\u21CF\u21D2\u21D4\u21F4-\u22FF\u2320\u2321\u237C\u239B-\u23B3\u23DC-\u23E1\u25B7\u25C1\u25F8-\u25FF\u266F\u27C0-\u27C4\u27C7-\u27E5\u27F0-\u27FF\u2900-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2AFF\u2B30-\u2B44\u2B47-\u2B4C\uFB29\uFE62\uFE64-\uFE66\uFF0B\uFF1C-\uFF1E\uFF5C\uFF5E\uFFE2\uFFE9-\uFFEC', - 'astral': '\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD83B[\uDEF0\uDEF1]' - }, - { - 'name': 'So', - 'alias': 'Other_Symbol', - 'bmp': '\xA6\xA9\xAE\xB0\u0482\u058D\u058E\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09FA\u0B70\u0BF3-\u0BF8\u0BFA\u0C7F\u0D4F\u0D79\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u214A\u214C\u214D\u214F\u218A\u218B\u2195-\u2199\u219C-\u219F\u21A1\u21A2\u21A4\u21A5\u21A7-\u21AD\u21AF-\u21CD\u21D0\u21D1\u21D3\u21D5-\u21F3\u2300-\u2307\u230C-\u231F\u2322-\u2328\u232B-\u237B\u237D-\u239A\u23B4-\u23DB\u23E2-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u25B6\u25B8-\u25C0\u25C2-\u25F7\u2600-\u266E\u2670-\u2767\u2794-\u27BF\u2800-\u28FF\u2B00-\u2B2F\u2B45\u2B46\u2B4D-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA828-\uA82B\uA836\uA837\uA839\uAA77-\uAA79\uFD40-\uFD4F\uFDCF\uFDFD-\uFDFF\uFFE4\uFFE8\uFFED\uFFEE\uFFFC\uFFFD', - 'astral': '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFDC\uDFE1-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838\uDD4F|\uD83B[\uDCAC\uDD2E]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFA]|\uD83D[\uDC00-\uDED7\uDEDD-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE74\uDE78-\uDE7C\uDE80-\uDE86\uDE90-\uDEAC\uDEB0-\uDEBA\uDEC0-\uDEC5\uDED0-\uDED9\uDEE0-\uDEE7\uDEF0-\uDEF6\uDF00-\uDF92\uDF94-\uDFCA]' - }, - { - 'name': 'Z', - 'alias': 'Separator', - 'bmp': ' \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' - }, - { - 'name': 'Zl', - 'alias': 'Line_Separator', - 'bmp': '\u2028' - }, - { - 'name': 'Zp', - 'alias': 'Paragraph_Separator', - 'bmp': '\u2029' - }, - { - 'name': 'Zs', - 'alias': 'Space_Separator', - 'bmp': ' \xA0\u1680\u2000-\u200A\u202F\u205F\u3000' - } -]; - -},{}]},{},[3])(3) -}); diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js b/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js deleted file mode 100644 index 6d36ca5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js +++ /dev/null @@ -1,17 +0,0 @@ -!function(u){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=u();else if("function"==typeof define&&define.amd)define([],u);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).XRegExp=u()}}((function(){return function r(u,d,t){function o(c,i){if(!d[c]){if(!u[c]){var l="function"==typeof require&&require;if(!i&&l)return l(c,!0);if(a)return a(c,!0);var D=new Error("Cannot find module '"+c+"'");throw D.code="MODULE_NOT_FOUND",D}var p=d[c]={exports:{}};u[c][0].call(p.exports,(function(d){return o(u[c][1][d]||d)}),p,p.exports,r,u,d,t)}return d[c].exports}for(var a="function"==typeof require&&require,c=0;c<t.length;c++)o(t[c]);return o}({1:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/instance/slice"),c=u("@babel/runtime-corejs3/core-js-stable/array/from"),i=u("@babel/runtime-corejs3/core-js-stable/symbol"),l=u("@babel/runtime-corejs3/core-js/get-iterator-method"),D=u("@babel/runtime-corejs3/core-js-stable/array/is-array"),p=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),b=u("@babel/runtime-corejs3/helpers/interopRequireDefault");p(t,"__esModule",{value:!0}),t.default=void 0;var y=b(u("@babel/runtime-corejs3/helpers/slicedToArray")),m=b(u("@babel/runtime-corejs3/core-js-stable/instance/for-each")),A=b(u("@babel/runtime-corejs3/core-js-stable/instance/concat")),E=b(u("@babel/runtime-corejs3/core-js-stable/instance/index-of"));function _createForOfIteratorHelper(u,d){var t=void 0!==i&&l(u)||u["@@iterator"];if(!t){if(D(u)||(t=function _unsupportedIterableToArray(u,d){var t;if(!u)return;if("string"==typeof u)return _arrayLikeToArray(u,d);var i=a(t=Object.prototype.toString.call(u)).call(t,8,-1);"Object"===i&&u.constructor&&(i=u.constructor.name);if("Map"===i||"Set"===i)return c(u);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return _arrayLikeToArray(u,d)}(u))||d&&u&&"number"==typeof u.length){t&&(u=t);var p=0,b=function F(){};return{s:b,n:function n(){return p>=u.length?{done:!0}:{done:!1,value:u[p++]}},e:function e(u){throw u},f:b}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var y,m=!0,A=!1;return{s:function s(){t=t.call(u)},n:function n(){var u=t.next();return m=u.done,u},e:function e(u){A=!0,y=u},f:function f(){try{m||null==t.return||t.return()}finally{if(A)throw y}}}}function _arrayLikeToArray(u,d){(null==d||d>u.length)&&(d=u.length);for(var t=0,a=new Array(d);t<d;t++)a[t]=u[t];return a} -/*! - * XRegExp Unicode Base 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2008-present MIT License - */t.default=function _default(u){var d={},t={},a=u._dec,c=u._hex,i=u._pad4;function normalize(u){return u.replace(/[- _]+/g,"").toLowerCase()}function charCode(u){var d=/^\\[xu](.+)/.exec(u);return d?a(d[1]):u.charCodeAt("\\"===u[0]?1:0)}function cacheInvertedBmp(t){return d[t]["b!"]||(d[t]["b!"]=function invertBmp(d){var t="",a=-1;return(0,m.default)(u).call(u,d,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(u){var d=charCode(u[1]);d>a+1&&(t+="\\u".concat(i(c(a+1))),d>a+2&&(t+="-\\u".concat(i(c(d-1))))),a=charCode(u[2]||u[1])})),a<65535&&(t+="\\u".concat(i(c(a+1))),a<65534&&(t+="-\\uFFFF")),t}(d[t].bmp))}function cacheAstral(u,t){var a=t?"a!":"a=";return d[u][a]||(d[u][a]=function buildAstral(u,t){var a,c,i=d[u],l="";return i.bmp&&!i.isBmpLast&&(l=(0,A.default)(a="[".concat(i.bmp,"]")).call(a,i.astral?"|":"")),i.astral&&(l+=i.astral),i.isBmpLast&&i.bmp&&(l+=(0,A.default)(c="".concat(i.astral?"|":"","[")).call(c,i.bmp,"]")),t?"(?:(?!".concat(l,")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-￿]))"):"(?:".concat(l,")")}(u,t))}u.addToken(/\\([pP])(?:{(\^?)(?:(\w+)=)?([^}]*)}|([A-Za-z]))/,(function(u,a,c){var i="Unknown Unicode token ",l=(0,y.default)(u,6),D=l[0],p=l[1],b=l[2],m=l[3],C=l[4],g=l[5],h="P"===p||!!b,x=-1!==(0,E.default)(c).call(c,"A"),v=normalize(g||C),B=d[v];if("P"===p&&b)throw new SyntaxError("Invalid double negation "+D);if(!d.hasOwnProperty(v))throw new SyntaxError(i+D);if(m&&(!t[m]||!t[m][v]))throw new SyntaxError(i+D);if(B.inverseOf){var w;if(v=normalize(B.inverseOf),!d.hasOwnProperty(v))throw new ReferenceError((0,A.default)(w="".concat("Unicode token missing data "+D," -> ")).call(w,B.inverseOf));B=d[v],h=!h}if(!B.bmp&&!x)throw new SyntaxError("Astral mode required for Unicode token "+D);if(x){if("class"===a)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return cacheAstral(v,h)}return"class"===a?h?cacheInvertedBmp(v):B.bmp:"".concat((h?"[^":"[")+B.bmp,"]")}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),u.addUnicodeData=function(a,c){c&&(t[c]={});var i,l=_createForOfIteratorHelper(a);try{for(l.s();!(i=l.n()).done;){var D=i.value;if(!D.name)throw new Error("Unicode token requires name");if(!(D.inverseOf||D.bmp||D.astral))throw new Error("Unicode token has no character data "+D.name);var p=normalize(D.name);if(d[p]=D,c&&(t[c][p]=!0),D.alias){var b=normalize(D.alias);d[b]=D,c&&(t[c][b]=!0)}}}catch(u){l.e(u)}finally{l.f()}u.cache.flush("patterns")},u._getUnicodeProperty=function(u){var t=normalize(u);return d[t]}},d.exports=t.default},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],2:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),c=u("@babel/runtime-corejs3/helpers/interopRequireDefault");a(t,"__esModule",{value:!0}),t.default=void 0;var i=c(u("../../tools/output/categories")); -/*! - * XRegExp Unicode Categories 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2010-present MIT License - * Unicode data by Mathias Bynens <mathiasbynens.be> - */t.default=function _default(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Categories");u.addUnicodeData(i.default)},d.exports=t.default},{"../../tools/output/categories":222,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],3:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),c=u("@babel/runtime-corejs3/helpers/interopRequireDefault");a(t,"__esModule",{value:!0}),t.default=void 0;var i=c(u("./xregexp")),l=c(u("./addons/unicode-base")),D=c(u("./addons/unicode-categories"));(0,l.default)(i.default),(0,D.default)(i.default);var p=i.default;t.default=p,d.exports=t.default},{"./addons/unicode-base":1,"./addons/unicode-categories":2,"./xregexp":4,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],4:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/instance/slice"),c=u("@babel/runtime-corejs3/core-js-stable/array/from"),i=u("@babel/runtime-corejs3/core-js-stable/symbol"),l=u("@babel/runtime-corejs3/core-js/get-iterator-method"),D=u("@babel/runtime-corejs3/core-js-stable/array/is-array"),p=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),b=u("@babel/runtime-corejs3/helpers/interopRequireDefault");p(t,"__esModule",{value:!0}),t.default=void 0;var y=b(u("@babel/runtime-corejs3/helpers/slicedToArray")),m=b(u("@babel/runtime-corejs3/core-js-stable/instance/flags")),A=b(u("@babel/runtime-corejs3/core-js-stable/instance/sort")),E=b(u("@babel/runtime-corejs3/core-js-stable/instance/slice")),C=b(u("@babel/runtime-corejs3/core-js-stable/parse-int")),g=b(u("@babel/runtime-corejs3/core-js-stable/instance/index-of")),h=b(u("@babel/runtime-corejs3/core-js-stable/instance/for-each")),x=b(u("@babel/runtime-corejs3/core-js-stable/object/create")),v=b(u("@babel/runtime-corejs3/core-js-stable/instance/concat"));function _createForOfIteratorHelper(u,d){var t=void 0!==i&&l(u)||u["@@iterator"];if(!t){if(D(u)||(t=function _unsupportedIterableToArray(u,d){var t;if(!u)return;if("string"==typeof u)return _arrayLikeToArray(u,d);var i=a(t=Object.prototype.toString.call(u)).call(t,8,-1);"Object"===i&&u.constructor&&(i=u.constructor.name);if("Map"===i||"Set"===i)return c(u);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return _arrayLikeToArray(u,d)}(u))||d&&u&&"number"==typeof u.length){t&&(u=t);var p=0,b=function F(){};return{s:b,n:function n(){return p>=u.length?{done:!0}:{done:!1,value:u[p++]}},e:function e(u){throw u},f:b}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var y,m=!0,A=!1;return{s:function s(){t=t.call(u)},n:function n(){var u=t.next();return m=u.done,u},e:function e(u){A=!0,y=u},f:function f(){try{m||null==t.return||t.return()}finally{if(A)throw y}}}}function _arrayLikeToArray(u,d){(null==d||d>u.length)&&(d=u.length);for(var t=0,a=new Array(d);t<d;t++)a[t]=u[t];return a} -/*! - * XRegExp 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2007-present MIT License - */var B={astral:!1,namespacing:!0},w={},j={},k={},S=[],O="default",R="class",_={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},T=/\$(?:\{([^\}]+)\}|<([^>]+)>|(\d\d?|[\s\S]?))/g,I=void 0===/()??/.exec("")[1],P=void 0!==(0,m.default)(/x/);function hasNativeFlag(u){var d=!0;try{if(new RegExp("",u),"y"===u){".."===".a".replace(new RegExp("a","gy"),".")&&(d=!1)}}catch(u){d=!1}return d}var X=hasNativeFlag("d"),L=hasNativeFlag("s"),N=hasNativeFlag("u"),M=hasNativeFlag("y"),U={d:X,g:!0,i:!0,m:!0,s:L,u:N,y:M},G=L?/[^dgimsuy]+/g:/[^dgimuy]+/g;function augment(u,d,t,a,c){var i;if(u.xregexp={captureNames:d},c)return u;if(u.__proto__)u.__proto__=XRegExp.prototype;else for(var l in XRegExp.prototype)u[l]=XRegExp.prototype[l];return u.xregexp.source=t,u.xregexp.flags=a?(0,A.default)(i=a.split("")).call(i).join(""):a,u}function clipDuplicates(u){return u.replace(/([\s\S])(?=[\s\S]*\1)/g,"")}function copyRegex(u,d){var t;if(!XRegExp.isRegExp(u))throw new TypeError("Type RegExp expected");var a=u.xregexp||{},c=function getNativeFlags(u){return P?(0,m.default)(u):/\/([a-z]*)$/i.exec(RegExp.prototype.toString.call(u))[1]}(u),i="",l="",D=null,p=null;return(d=d||{}).removeG&&(l+="g"),d.removeY&&(l+="y"),l&&(c=c.replace(new RegExp("[".concat(l,"]+"),"g"),"")),d.addG&&(i+="g"),d.addY&&(i+="y"),i&&(c=clipDuplicates(c+i)),d.isInternalOnly||(void 0!==a.source&&(D=a.source),null!=(0,m.default)(a)&&(p=i?clipDuplicates((0,m.default)(a)+i):(0,m.default)(a))),u=augment(new RegExp(d.source||u.source,c),function hasNamedCapture(u){return!(!u.xregexp||!u.xregexp.captureNames)}(u)?(0,E.default)(t=a.captureNames).call(t,0):null,D,p,d.isInternalOnly)}function dec(u){return(0,C.default)(u,16)}function getContextualTokenSeparator(u,d,t){var a=u.index+u[0].length,c=u.input[u.index-1],i=u.input[a];return/^[()|]$/.test(c)||/^[()|]$/.test(i)||0===u.index||a===u.input.length||/\(\?(?:[:=!]|<[=!])$/.test(u.input.substring(u.index-4,u.index))||function isQuantifierNext(u,d,t){return(-1!==(0,g.default)(t).call(t,"x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/).test((0,E.default)(u).call(u,d))}(u.input,a,t)?"":"(?:)"}function hex(u){return(0,C.default)(u,10).toString(16)}function isType(u,d){return Object.prototype.toString.call(u)==="[object ".concat(d,"]")}function nullThrows(u){if(null==u)throw new TypeError("Cannot convert null or undefined to object");return u}function pad4(u){for(;u.length<4;)u="0".concat(u);return u}function prepareOptions(u){var d={};return isType(u,"String")?((0,h.default)(XRegExp).call(XRegExp,u,/[^\s,]+/,(function(u){d[u]=!0})),d):u}function registerFlag(u){if(!/^[\w$]$/.test(u))throw new Error("Flag must be a single character A-Za-z0-9_$");U[u]=!0}function runTokens(u,d,t,a,c){for(var i,l,D=S.length,p=u[t],b=null;D--;)if(!((l=S[D]).leadChar&&l.leadChar!==p||l.scope!==a&&"all"!==l.scope||l.flag&&-1===(0,g.default)(d).call(d,l.flag))&&(i=XRegExp.exec(u,l.regex,t,"sticky"))){b={matchLength:i[0].length,output:l.handler.call(c,i,a,d),reparse:l.reparse};break}return b}function setAstral(u){B.astral=u}function setNamespacing(u){B.namespacing=u}function XRegExp(u,d){if(XRegExp.isRegExp(u)){if(void 0!==d)throw new TypeError("Cannot supply flags when copying a RegExp");return copyRegex(u)}if(u=void 0===u?"":String(u),d=void 0===d?"":String(d),XRegExp.isInstalled("astral")&&-1===(0,g.default)(d).call(d,"A")&&(d+="A"),k[u]||(k[u]={}),!k[u][d]){for(var t,a={hasNamedCapture:!1,captureNames:[]},c=O,i="",l=0,D=function prepareFlags(u,d){if(clipDuplicates(d)!==d)throw new SyntaxError("Invalid duplicate regex flag ".concat(d));u=u.replace(/^\(\?([\w$]+)\)/,(function(u,t){if(/[dgy]/.test(t))throw new SyntaxError("Cannot use flags dgy in mode modifier ".concat(u));return d=clipDuplicates(d+t),""}));var t,a=_createForOfIteratorHelper(d);try{for(a.s();!(t=a.n()).done;){var c=t.value;if(!U[c])throw new SyntaxError("Unknown regex flag ".concat(c))}}catch(u){a.e(u)}finally{a.f()}return{pattern:u,flags:d}}(u,d),p=D.pattern,b=(0,m.default)(D);l<p.length;){do{(t=runTokens(p,b,l,c,a))&&t.reparse&&(p=(0,E.default)(p).call(p,0,l)+t.output+(0,E.default)(p).call(p,l+t.matchLength))}while(t&&t.reparse);if(t)i+=t.output,l+=t.matchLength||1;else{var A=XRegExp.exec(p,_[c],l,"sticky"),C=(0,y.default)(A,1)[0];i+=C,l+=C.length,"["===C&&c===O?c=R:"]"===C&&c===R&&(c=O)}}k[u][d]={pattern:i.replace(/(?:\(\?:\))+/g,"(?:)"),flags:b.replace(G,""),captures:a.hasNamedCapture?a.captureNames:null}}var h=k[u][d];return augment(new RegExp(h.pattern,(0,m.default)(h)),h.captures,u,d)}XRegExp.prototype=/(?:)/,XRegExp.version="5.1.1",XRegExp._clipDuplicates=clipDuplicates,XRegExp._hasNativeFlag=hasNativeFlag,XRegExp._dec=dec,XRegExp._hex=hex,XRegExp._pad4=pad4,XRegExp.addToken=function(u,d,t){var a=(t=t||{}).optionalFlags;if(t.flag&®isterFlag(t.flag),a){var c,i=_createForOfIteratorHelper(a=a.split(""));try{for(i.s();!(c=i.n()).done;){registerFlag(c.value)}}catch(u){i.e(u)}finally{i.f()}}S.push({regex:copyRegex(u,{addG:!0,addY:M,isInternalOnly:!0}),handler:d,scope:t.scope||O,flag:t.flag,reparse:t.reparse,leadChar:t.leadChar}),XRegExp.cache.flush("patterns")},XRegExp.cache=function(u,d){return j[u]||(j[u]={}),j[u][d]||(j[u][d]=XRegExp(u,d))},XRegExp.cache.flush=function(u){"patterns"===u?k={}:j={}},XRegExp.escape=function(u){return String(nullThrows(u)).replace(/[\\\[\]{}()*+?.^$|]/g,"\\$&").replace(/[\s#\-,]/g,(function(u){return"\\u".concat(pad4(hex(u.charCodeAt(0))))}))},XRegExp.exec=function(u,d,t,a){var c,i,l="g",D=!1;(c=M&&!!(a||d.sticky&&!1!==a))?l+="y":a&&(D=!0,l+="FakeY"),d.xregexp=d.xregexp||{};var p=d.xregexp[l]||(d.xregexp[l]=copyRegex(d,{addG:!0,addY:c,source:D?"".concat(d.source,"|()"):void 0,removeY:!1===a,isInternalOnly:!0}));return t=t||0,p.lastIndex=t,i=w.exec.call(p,u),D&&i&&""===i.pop()&&(i=null),d.global&&(d.lastIndex=i?p.lastIndex:0),i},XRegExp.forEach=function(u,d,t){for(var a,c=0,i=-1;a=XRegExp.exec(u,d,c);)t(a,++i,u,d),c=a.index+(a[0].length||1)},XRegExp.globalize=function(u){return copyRegex(u,{addG:!0})},XRegExp.install=function(u){u=prepareOptions(u),!B.astral&&u.astral&&setAstral(!0),!B.namespacing&&u.namespacing&&setNamespacing(!0)},XRegExp.isInstalled=function(u){return!!B[u]},XRegExp.isRegExp=function(u){return"[object RegExp]"===Object.prototype.toString.call(u)},XRegExp.match=function(u,d,t){var a=d.global&&"one"!==t||"all"===t,c=(a?"g":"")+(d.sticky?"y":"")||"noGY";d.xregexp=d.xregexp||{};var i=d.xregexp[c]||(d.xregexp[c]=copyRegex(d,{addG:!!a,removeG:"one"===t,isInternalOnly:!0})),l=String(nullThrows(u)).match(i);return d.global&&(d.lastIndex="one"===t&&l?l.index+l[0].length:0),a?l||[]:l&&l[0]},XRegExp.matchChain=function(u,d){return function recurseChain(u,t){var a=d[t].regex?d[t]:{regex:d[t]},c=[];function addMatch(u){if(a.backref){var d="Backreference to undefined group: ".concat(a.backref),t=isNaN(a.backref);if(t&&XRegExp.isInstalled("namespacing")){if(!u.groups||!(a.backref in u.groups))throw new ReferenceError(d)}else if(!u.hasOwnProperty(a.backref))throw new ReferenceError(d);var i=t&&XRegExp.isInstalled("namespacing")?u.groups[a.backref]:u[a.backref];c.push(i||"")}else c.push(u[0])}var i,l=_createForOfIteratorHelper(u);try{for(l.s();!(i=l.n()).done;){var D=i.value;(0,h.default)(XRegExp).call(XRegExp,D,a.regex,addMatch)}}catch(u){l.e(u)}finally{l.f()}return t!==d.length-1&&c.length?recurseChain(c,t+1):c}([u],0)},XRegExp.replace=function(u,d,t,a){var c=XRegExp.isRegExp(d),i=d.global&&"one"!==a||"all"===a,l=(i?"g":"")+(d.sticky?"y":"")||"noGY",D=d;c?(d.xregexp=d.xregexp||{},D=d.xregexp[l]||(d.xregexp[l]=copyRegex(d,{addG:!!i,removeG:"one"===a,isInternalOnly:!0}))):i&&(D=new RegExp(XRegExp.escape(String(d)),"g"));var p=w.replace.call(nullThrows(u),D,t);return c&&d.global&&(d.lastIndex=0),p},XRegExp.replaceEach=function(u,d){var t,a=_createForOfIteratorHelper(d);try{for(a.s();!(t=a.n()).done;){var c=t.value;u=XRegExp.replace(u,c[0],c[1],c[2])}}catch(u){a.e(u)}finally{a.f()}return u},XRegExp.split=function(u,d,t){return w.split.call(nullThrows(u),d,t)},XRegExp.test=function(u,d,t,a){return!!XRegExp.exec(u,d,t,a)},XRegExp.uninstall=function(u){u=prepareOptions(u),B.astral&&u.astral&&setAstral(!1),B.namespacing&&u.namespacing&&setNamespacing(!1)},XRegExp.union=function(u,d,t){var a,c,i=(t=t||{}).conjunction||"or",l=0;function rewrite(u,d,t){var i=c[l-a];if(d){if(++l,i)return"(?<".concat(i,">")}else if(t)return"\\".concat(+t+a);return u}if(!isType(u,"Array")||!u.length)throw new TypeError("Must provide a nonempty array of patterns to merge");var D,p=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,b=[],y=_createForOfIteratorHelper(u);try{for(y.s();!(D=y.n()).done;){var m=D.value;XRegExp.isRegExp(m)?(a=l,c=m.xregexp&&m.xregexp.captureNames||[],b.push(XRegExp(m.source).source.replace(p,rewrite))):b.push(XRegExp.escape(m))}}catch(u){y.e(u)}finally{y.f()}var A="none"===i?"":"|";return XRegExp(b.join(A),d)},w.exec=function(u){var d=this.lastIndex,t=RegExp.prototype.exec.apply(this,arguments);if(t){if(!I&&t.length>1&&-1!==(0,g.default)(t).call(t,"")){var a,c=copyRegex(this,{removeG:!0,isInternalOnly:!0});(0,E.default)(a=String(u)).call(a,t.index).replace(c,(function(){for(var u=arguments.length,d=1;d<u-2;++d)void 0===(d<0||arguments.length<=d?void 0:arguments[d])&&(t[d]=void 0)}))}if(this.xregexp&&this.xregexp.captureNames){var i=t;XRegExp.isInstalled("namespacing")&&(t.groups=(0,x.default)(null),i=t.groups);for(var l=1;l<t.length;++l){var D=this.xregexp.captureNames[l-1];D&&(i[D]=t[l])}}else!t.groups&&XRegExp.isInstalled("namespacing")&&(t.groups=void 0);this.global&&!t[0].length&&this.lastIndex>t.index&&(this.lastIndex=t.index)}return this.global||(this.lastIndex=d),t},w.test=function(u){return!!w.exec.call(this,u)},w.match=function(u){if(XRegExp.isRegExp(u)){if(u.global){var d=String.prototype.match.apply(this,arguments);return u.lastIndex=0,d}}else u=new RegExp(u);return w.exec.call(u,nullThrows(this))},w.replace=function(u,d){var t,a,c,i=XRegExp.isRegExp(u);return i?(u.xregexp&&(a=u.xregexp.captureNames),t=u.lastIndex):u+="",c=isType(d,"Function")?String(this).replace(u,(function(){for(var u=arguments.length,t=new Array(u),c=0;c<u;c++)t[c]=arguments[c];if(a){var i;XRegExp.isInstalled("namespacing")?(i=(0,x.default)(null),t.push(i)):(t[0]=new String(t[0]),i=t[0]);for(var l=0;l<a.length;++l)a[l]&&(i[a[l]]=t[l+1])}return d.apply(void 0,t)})):String(nullThrows(this)).replace(u,(function(){for(var u=arguments.length,t=new Array(u),c=0;c<u;c++)t[c]=arguments[c];return String(d).replace(T,replacer);function replacer(u,d,c,i){d=d||c;var l,D,p=isType(t[t.length-1],"Object")?4:3,b=t.length-p;if(d){if(/^\d+$/.test(d)){var y=+d;if(y<=b)return t[y]||""}var m=a?(0,g.default)(a).call(a,d):-1;if(m<0)throw new SyntaxError("Backreference to undefined group ".concat(u));return t[m+1]||""}if(""===i||" "===i)throw new SyntaxError("Invalid token ".concat(u));if("&"===i||0==+i)return t[0];if("$"===i)return"$";if("`"===i)return(0,E.default)(l=t[t.length-1]).call(l,0,t[t.length-2]);if("'"===i)return(0,E.default)(D=t[t.length-1]).call(D,t[t.length-2]+t[0].length);if(i=+i,!isNaN(i)){if(i>b)throw new SyntaxError("Backreference to undefined group ".concat(u));return t[i]||""}throw new SyntaxError("Invalid token ".concat(u))}})),i&&(u.global?u.lastIndex=0:u.lastIndex=t),c},w.split=function(u,d){if(!XRegExp.isRegExp(u))return String.prototype.split.apply(this,arguments);var t,a=String(this),c=[],i=u.lastIndex,l=0;return d=(void 0===d?-1:d)>>>0,(0,h.default)(XRegExp).call(XRegExp,a,u,(function(u){u.index+u[0].length>l&&(c.push((0,E.default)(a).call(a,l,u.index)),u.length>1&&u.index<a.length&&Array.prototype.push.apply(c,(0,E.default)(u).call(u,1)),t=u[0].length,l=u.index+t)})),l===a.length?u.test("")&&!t||c.push(""):c.push((0,E.default)(a).call(a,l)),u.lastIndex=i,c.length>d?(0,E.default)(c).call(c,0,d):c},XRegExp.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(u,d){if("B"===u[1]&&d===O)return u[0];throw new SyntaxError("Invalid escape ".concat(u[0]))}),{scope:"all",leadChar:"\\"}),XRegExp.addToken(/\\u{([\dA-Fa-f]+)}/,(function(u,d,t){var a=dec(u[1]);if(a>1114111)throw new SyntaxError("Invalid Unicode code point ".concat(u[0]));if(a<=65535)return"\\u".concat(pad4(hex(a)));if(N&&-1!==(0,g.default)(t).call(t,"u"))return u[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),XRegExp.addToken(/\(\?#[^)]*\)/,getContextualTokenSeparator,{leadChar:"("}),XRegExp.addToken(/\s+|#[^\n]*\n?/,getContextualTokenSeparator,{flag:"x"}),L||XRegExp.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),XRegExp.addToken(/\\k<([^>]+)>/,(function(u){var d,t,a=isNaN(u[1])?(0,g.default)(d=this.captureNames).call(d,u[1])+1:+u[1],c=u.index+u[0].length;if(!a||a>this.captureNames.length)throw new SyntaxError("Backreference to undefined group ".concat(u[0]));return(0,v.default)(t="\\".concat(a)).call(t,c===u.input.length||isNaN(u.input[c])?"":"(?:)")}),{leadChar:"\\"}),XRegExp.addToken(/\\(\d+)/,(function(u,d){if(!(d===O&&/^[1-9]/.test(u[1])&&+u[1]<=this.captureNames.length)&&"0"!==u[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group ".concat(u[0]));return u[0]}),{scope:"all",leadChar:"\\"}),XRegExp.addToken(/\(\?P?<((?:[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])(?:[\$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u0870-\u0887\u0889-\u088E\u0898-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3C-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C5D\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDD\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1715\u171F-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B4C\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF50\uDF70-\uDF85\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC75\uDC7F-\uDCBA\uDCC2\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39\uDF40-\uDF46]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF6\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0\uDFF1]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAE\uDEC0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]|\uDB40[\uDD00-\uDDEF])*)>/,(function(u){var d;if(!XRegExp.isInstalled("namespacing")&&("length"===u[1]||"__proto__"===u[1]))throw new SyntaxError("Cannot use reserved word as capture name ".concat(u[0]));if(-1!==(0,g.default)(d=this.captureNames).call(d,u[1]))throw new SyntaxError("Cannot use same name for multiple groups ".concat(u[0]));return this.captureNames.push(u[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),XRegExp.addToken(/\((?!\?)/,(function(u,d,t){return-1!==(0,g.default)(t).call(t,"n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("});var q=XRegExp;t.default=q,d.exports=t.default},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/flags":8,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/instance/sort":12,"@babel/runtime-corejs3/core-js-stable/object/create":13,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/parse-int":15,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],5:[function(u,d,t){d.exports=u("core-js-pure/stable/array/from")},{"core-js-pure/stable/array/from":208}],6:[function(u,d,t){d.exports=u("core-js-pure/stable/array/is-array")},{"core-js-pure/stable/array/is-array":209}],7:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/concat")},{"core-js-pure/stable/instance/concat":212}],8:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/flags")},{"core-js-pure/stable/instance/flags":213}],9:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/for-each")},{"core-js-pure/stable/instance/for-each":214}],10:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/index-of")},{"core-js-pure/stable/instance/index-of":215}],11:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/slice")},{"core-js-pure/stable/instance/slice":216}],12:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/sort")},{"core-js-pure/stable/instance/sort":217}],13:[function(u,d,t){d.exports=u("core-js-pure/stable/object/create")},{"core-js-pure/stable/object/create":218}],14:[function(u,d,t){d.exports=u("core-js-pure/stable/object/define-property")},{"core-js-pure/stable/object/define-property":219}],15:[function(u,d,t){d.exports=u("core-js-pure/stable/parse-int")},{"core-js-pure/stable/parse-int":220}],16:[function(u,d,t){d.exports=u("core-js-pure/stable/symbol")},{"core-js-pure/stable/symbol":221}],17:[function(u,d,t){d.exports=u("core-js-pure/features/array/from")},{"core-js-pure/features/array/from":52}],18:[function(u,d,t){d.exports=u("core-js-pure/features/array/is-array")},{"core-js-pure/features/array/is-array":53}],19:[function(u,d,t){d.exports=u("core-js-pure/features/get-iterator-method")},{"core-js-pure/features/get-iterator-method":54}],20:[function(u,d,t){d.exports=u("core-js-pure/features/instance/slice")},{"core-js-pure/features/instance/slice":55}],21:[function(u,d,t){d.exports=u("core-js-pure/features/symbol")},{"core-js-pure/features/symbol":56}],22:[function(u,d,t){d.exports=function _arrayLikeToArray(u,d){(null==d||d>u.length)&&(d=u.length);for(var t=0,a=new Array(d);t<d;t++)a[t]=u[t];return a},d.exports.__esModule=!0,d.exports.default=d.exports},{}],23:[function(u,d,t){var a=u("@babel/runtime-corejs3/core-js/array/is-array");d.exports=function _arrayWithHoles(u){if(a(u))return u},d.exports.__esModule=!0,d.exports.default=d.exports},{"@babel/runtime-corejs3/core-js/array/is-array":18}],24:[function(u,d,t){d.exports=function _interopRequireDefault(u){return u&&u.__esModule?u:{default:u}},d.exports.__esModule=!0,d.exports.default=d.exports},{}],25:[function(u,d,t){var a=u("@babel/runtime-corejs3/core-js/symbol"),c=u("@babel/runtime-corejs3/core-js/get-iterator-method");d.exports=function _iterableToArrayLimit(u,d){var t=null==u?null:void 0!==a&&c(u)||u["@@iterator"];if(null!=t){var i,l,D=[],p=!0,b=!1;try{for(t=t.call(u);!(p=(i=t.next()).done)&&(D.push(i.value),!d||D.length!==d);p=!0);}catch(u){b=!0,l=u}finally{try{p||null==t.return||t.return()}finally{if(b)throw l}}return D}},d.exports.__esModule=!0,d.exports.default=d.exports},{"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/core-js/symbol":21}],26:[function(u,d,t){d.exports=function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},d.exports.__esModule=!0,d.exports.default=d.exports},{}],27:[function(u,d,t){var a=u("./arrayWithHoles.js"),c=u("./iterableToArrayLimit.js"),i=u("./unsupportedIterableToArray.js"),l=u("./nonIterableRest.js");d.exports=function _slicedToArray(u,d){return a(u)||c(u,d)||i(u,d)||l()},d.exports.__esModule=!0,d.exports.default=d.exports},{"./arrayWithHoles.js":23,"./iterableToArrayLimit.js":25,"./nonIterableRest.js":26,"./unsupportedIterableToArray.js":28}],28:[function(u,d,t){var a=u("@babel/runtime-corejs3/core-js/instance/slice"),c=u("@babel/runtime-corejs3/core-js/array/from"),i=u("./arrayLikeToArray.js");d.exports=function _unsupportedIterableToArray(u,d){var t;if(u){if("string"==typeof u)return i(u,d);var l=a(t=Object.prototype.toString.call(u)).call(t,8,-1);return"Object"===l&&u.constructor&&(l=u.constructor.name),"Map"===l||"Set"===l?c(u):"Arguments"===l||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(l)?i(u,d):void 0}},d.exports.__esModule=!0,d.exports.default=d.exports},{"./arrayLikeToArray.js":22,"@babel/runtime-corejs3/core-js/array/from":17,"@babel/runtime-corejs3/core-js/instance/slice":20}],29:[function(u,d,t){var a=u("../../stable/array/from");d.exports=a},{"../../stable/array/from":208}],30:[function(u,d,t){var a=u("../../stable/array/is-array");d.exports=a},{"../../stable/array/is-array":209}],31:[function(u,d,t){var a=u("../stable/get-iterator-method");d.exports=a},{"../stable/get-iterator-method":211}],32:[function(u,d,t){var a=u("../../stable/instance/slice");d.exports=a},{"../../stable/instance/slice":216}],33:[function(u,d,t){var a=u("../../stable/symbol");d.exports=a},{"../../stable/symbol":221}],34:[function(u,d,t){u("../../modules/es.string.iterator"),u("../../modules/es.array.from");var a=u("../../internals/path");d.exports=a.Array.from},{"../../internals/path":142,"../../modules/es.array.from":170,"../../modules/es.string.iterator":184}],35:[function(u,d,t){u("../../modules/es.array.is-array");var a=u("../../internals/path");d.exports=a.Array.isArray},{"../../internals/path":142,"../../modules/es.array.is-array":172}],36:[function(u,d,t){u("../../../modules/es.array.concat");var a=u("../../../internals/entry-virtual");d.exports=a("Array").concat},{"../../../internals/entry-virtual":91,"../../../modules/es.array.concat":168}],37:[function(u,d,t){u("../../../modules/es.array.for-each");var a=u("../../../internals/entry-virtual");d.exports=a("Array").forEach},{"../../../internals/entry-virtual":91,"../../../modules/es.array.for-each":169}],38:[function(u,d,t){u("../../../modules/es.array.index-of");var a=u("../../../internals/entry-virtual");d.exports=a("Array").indexOf},{"../../../internals/entry-virtual":91,"../../../modules/es.array.index-of":171}],39:[function(u,d,t){u("../../../modules/es.array.slice");var a=u("../../../internals/entry-virtual");d.exports=a("Array").slice},{"../../../internals/entry-virtual":91,"../../../modules/es.array.slice":174}],40:[function(u,d,t){u("../../../modules/es.array.sort");var a=u("../../../internals/entry-virtual");d.exports=a("Array").sort},{"../../../internals/entry-virtual":91,"../../../modules/es.array.sort":175}],41:[function(u,d,t){u("../modules/es.array.iterator"),u("../modules/es.string.iterator");var a=u("../internals/get-iterator-method");d.exports=a},{"../internals/get-iterator-method":101,"../modules/es.array.iterator":173,"../modules/es.string.iterator":184}],42:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/concat"),i=Array.prototype;d.exports=function(u){var d=u.concat;return u===i||a(i,u)&&d===i.concat?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/concat":36}],43:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../regexp/flags"),i=RegExp.prototype;d.exports=function(u){return u===i||a(i,u)?c(u):u.flags}},{"../../internals/object-is-prototype-of":135,"../regexp/flags":50}],44:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/index-of"),i=Array.prototype;d.exports=function(u){var d=u.indexOf;return u===i||a(i,u)&&d===i.indexOf?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/index-of":38}],45:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/slice"),i=Array.prototype;d.exports=function(u){var d=u.slice;return u===i||a(i,u)&&d===i.slice?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/slice":39}],46:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/sort"),i=Array.prototype;d.exports=function(u){var d=u.sort;return u===i||a(i,u)&&d===i.sort?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/sort":40}],47:[function(u,d,t){u("../../modules/es.object.create");var a=u("../../internals/path").Object;d.exports=function create(u,d){return a.create(u,d)}},{"../../internals/path":142,"../../modules/es.object.create":178}],48:[function(u,d,t){u("../../modules/es.object.define-property");var a=u("../../internals/path").Object,c=d.exports=function defineProperty(u,d,t){return a.defineProperty(u,d,t)};a.defineProperty.sham&&(c.sham=!0)},{"../../internals/path":142,"../../modules/es.object.define-property":179}],49:[function(u,d,t){u("../modules/es.parse-int");var a=u("../internals/path");d.exports=a.parseInt},{"../internals/path":142,"../modules/es.parse-int":181}],50:[function(u,d,t){u("../../modules/es.regexp.flags");var a=u("../../internals/function-uncurry-this"),c=u("../../internals/regexp-flags");d.exports=a(c)},{"../../internals/function-uncurry-this":99,"../../internals/regexp-flags":144,"../../modules/es.regexp.flags":183}],51:[function(u,d,t){u("../../modules/es.array.concat"),u("../../modules/es.object.to-string"),u("../../modules/es.symbol"),u("../../modules/es.symbol.async-iterator"),u("../../modules/es.symbol.description"),u("../../modules/es.symbol.has-instance"),u("../../modules/es.symbol.is-concat-spreadable"),u("../../modules/es.symbol.iterator"),u("../../modules/es.symbol.match"),u("../../modules/es.symbol.match-all"),u("../../modules/es.symbol.replace"),u("../../modules/es.symbol.search"),u("../../modules/es.symbol.species"),u("../../modules/es.symbol.split"),u("../../modules/es.symbol.to-primitive"),u("../../modules/es.symbol.to-string-tag"),u("../../modules/es.symbol.unscopables"),u("../../modules/es.json.to-string-tag"),u("../../modules/es.math.to-string-tag"),u("../../modules/es.reflect.to-string-tag");var a=u("../../internals/path");d.exports=a.Symbol},{"../../internals/path":142,"../../modules/es.array.concat":168,"../../modules/es.json.to-string-tag":176,"../../modules/es.math.to-string-tag":177,"../../modules/es.object.to-string":180,"../../modules/es.reflect.to-string-tag":182,"../../modules/es.symbol":190,"../../modules/es.symbol.async-iterator":185,"../../modules/es.symbol.description":186,"../../modules/es.symbol.has-instance":187,"../../modules/es.symbol.is-concat-spreadable":188,"../../modules/es.symbol.iterator":189,"../../modules/es.symbol.match":192,"../../modules/es.symbol.match-all":191,"../../modules/es.symbol.replace":193,"../../modules/es.symbol.search":194,"../../modules/es.symbol.species":195,"../../modules/es.symbol.split":196,"../../modules/es.symbol.to-primitive":197,"../../modules/es.symbol.to-string-tag":198,"../../modules/es.symbol.unscopables":199}],52:[function(u,d,t){var a=u("../../actual/array/from");d.exports=a},{"../../actual/array/from":29}],53:[function(u,d,t){var a=u("../../actual/array/is-array");d.exports=a},{"../../actual/array/is-array":30}],54:[function(u,d,t){var a=u("../actual/get-iterator-method");d.exports=a},{"../actual/get-iterator-method":31}],55:[function(u,d,t){var a=u("../../actual/instance/slice");d.exports=a},{"../../actual/instance/slice":32}],56:[function(u,d,t){var a=u("../../actual/symbol");u("../../modules/esnext.symbol.async-dispose"),u("../../modules/esnext.symbol.dispose"),u("../../modules/esnext.symbol.matcher"),u("../../modules/esnext.symbol.metadata"),u("../../modules/esnext.symbol.observable"),u("../../modules/esnext.symbol.pattern-match"),u("../../modules/esnext.symbol.replace-all"),d.exports=a},{"../../actual/symbol":33,"../../modules/esnext.symbol.async-dispose":200,"../../modules/esnext.symbol.dispose":201,"../../modules/esnext.symbol.matcher":202,"../../modules/esnext.symbol.metadata":203,"../../modules/esnext.symbol.observable":204,"../../modules/esnext.symbol.pattern-match":205,"../../modules/esnext.symbol.replace-all":206}],57:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-callable"),i=u("../internals/try-to-string"),l=a.TypeError;d.exports=function(u){if(c(u))return u;throw l(i(u)+" is not a function")}},{"../internals/global":104,"../internals/is-callable":114,"../internals/try-to-string":162}],58:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-callable"),i=a.String,l=a.TypeError;d.exports=function(u){if("object"==typeof u||c(u))return u;throw l("Can't set "+i(u)+" as a prototype")}},{"../internals/global":104,"../internals/is-callable":114}],59:[function(u,d,t){d.exports=function(){}},{}],60:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-object"),i=a.String,l=a.TypeError;d.exports=function(u){if(c(u))return u;throw l(i(u)+" is not an object")}},{"../internals/global":104,"../internals/is-object":117}],61:[function(u,d,t){"use strict";var a=u("../internals/array-iteration").forEach,c=u("../internals/array-method-is-strict")("forEach");d.exports=c?[].forEach:function forEach(u){return a(this,u,arguments.length>1?arguments[1]:void 0)}},{"../internals/array-iteration":64,"../internals/array-method-is-strict":66}],62:[function(u,d,t){"use strict";var a=u("../internals/global"),c=u("../internals/function-bind-context"),i=u("../internals/function-call"),l=u("../internals/to-object"),D=u("../internals/call-with-safe-iteration-closing"),p=u("../internals/is-array-iterator-method"),b=u("../internals/is-constructor"),y=u("../internals/length-of-array-like"),m=u("../internals/create-property"),A=u("../internals/get-iterator"),E=u("../internals/get-iterator-method"),C=a.Array;d.exports=function from(u){var d=l(u),t=b(this),a=arguments.length,g=a>1?arguments[1]:void 0,h=void 0!==g;h&&(g=c(g,a>2?arguments[2]:void 0));var x,v,B,w,j,k,S=E(d),O=0;if(!S||this==C&&p(S))for(x=y(d),v=t?new this(x):C(x);x>O;O++)k=h?g(d[O],O):d[O],m(v,O,k);else for(j=(w=A(d,S)).next,v=t?new this:[];!(B=i(j,w)).done;O++)k=h?D(w,g,[B.value,O],!0):B.value,m(v,O,k);return v.length=O,v}},{"../internals/call-with-safe-iteration-closing":72,"../internals/create-property":80,"../internals/function-bind-context":96,"../internals/function-call":97,"../internals/get-iterator":102,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/is-array-iterator-method":112,"../internals/is-constructor":115,"../internals/length-of-array-like":123,"../internals/to-object":157}],63:[function(u,d,t){var a=u("../internals/to-indexed-object"),c=u("../internals/to-absolute-index"),i=u("../internals/length-of-array-like"),createMethod=function(u){return function(d,t,l){var D,p=a(d),b=i(p),y=c(l,b);if(u&&t!=t){for(;b>y;)if((D=p[y++])!=D)return!0}else for(;b>y;y++)if((u||y in p)&&p[y]===t)return u||y||0;return!u&&-1}};d.exports={includes:createMethod(!0),indexOf:createMethod(!1)}},{"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154}],64:[function(u,d,t){var a=u("../internals/function-bind-context"),c=u("../internals/function-uncurry-this"),i=u("../internals/indexed-object"),l=u("../internals/to-object"),D=u("../internals/length-of-array-like"),p=u("../internals/array-species-create"),b=c([].push),createMethod=function(u){var d=1==u,t=2==u,c=3==u,y=4==u,m=6==u,A=7==u,E=5==u||m;return function(C,g,h,x){for(var v,B,w=l(C),j=i(w),k=a(g,h),S=D(j),O=0,R=x||p,_=d?R(C,S):t||A?R(C,0):void 0;S>O;O++)if((E||O in j)&&(B=k(v=j[O],O,w),u))if(d)_[O]=B;else if(B)switch(u){case 3:return!0;case 5:return v;case 6:return O;case 2:b(_,v)}else switch(u){case 4:return!1;case 7:b(_,v)}return m?-1:c||y?y:_}};d.exports={forEach:createMethod(0),map:createMethod(1),filter:createMethod(2),some:createMethod(3),every:createMethod(4),find:createMethod(5),findIndex:createMethod(6),filterReject:createMethod(7)}},{"../internals/array-species-create":71,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/indexed-object":109,"../internals/length-of-array-like":123,"../internals/to-object":157}],65:[function(u,d,t){var a=u("../internals/fails"),c=u("../internals/well-known-symbol"),i=u("../internals/engine-v8-version"),l=c("species");d.exports=function(u){return i>=51||!a((function(){var d=[];return(d.constructor={})[l]=function(){return{foo:1}},1!==d[u](Boolean).foo}))}},{"../internals/engine-v8-version":89,"../internals/fails":94,"../internals/well-known-symbol":166}],66:[function(u,d,t){"use strict";var a=u("../internals/fails");d.exports=function(u,d){var t=[][u];return!!t&&a((function(){t.call(null,d||function(){throw 1},1)}))}},{"../internals/fails":94}],67:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/to-absolute-index"),i=u("../internals/length-of-array-like"),l=u("../internals/create-property"),D=a.Array,p=Math.max;d.exports=function(u,d,t){for(var a=i(u),b=c(d,a),y=c(void 0===t?a:t,a),m=D(p(y-b,0)),A=0;b<y;b++,A++)l(m,A,u[b]);return m.length=A,m}},{"../internals/create-property":80,"../internals/global":104,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153}],68:[function(u,d,t){var a=u("../internals/function-uncurry-this");d.exports=a([].slice)},{"../internals/function-uncurry-this":99}],69:[function(u,d,t){var a=u("../internals/array-slice-simple"),c=Math.floor,mergeSort=function(u,d){var t=u.length,i=c(t/2);return t<8?insertionSort(u,d):merge(u,mergeSort(a(u,0,i),d),mergeSort(a(u,i),d),d)},insertionSort=function(u,d){for(var t,a,c=u.length,i=1;i<c;){for(a=i,t=u[i];a&&d(u[a-1],t)>0;)u[a]=u[--a];a!==i++&&(u[a]=t)}return u},merge=function(u,d,t,a){for(var c=d.length,i=t.length,l=0,D=0;l<c||D<i;)u[l+D]=l<c&&D<i?a(d[l],t[D])<=0?d[l++]:t[D++]:l<c?d[l++]:t[D++];return u};d.exports=mergeSort},{"../internals/array-slice-simple":67}],70:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-array"),i=u("../internals/is-constructor"),l=u("../internals/is-object"),D=u("../internals/well-known-symbol")("species"),p=a.Array;d.exports=function(u){var d;return c(u)&&(d=u.constructor,(i(d)&&(d===p||c(d.prototype))||l(d)&&null===(d=d[D]))&&(d=void 0)),void 0===d?p:d}},{"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/well-known-symbol":166}],71:[function(u,d,t){var a=u("../internals/array-species-constructor");d.exports=function(u,d){return new(a(u))(0===d?0:d)}},{"../internals/array-species-constructor":70}],72:[function(u,d,t){var a=u("../internals/an-object"),c=u("../internals/iterator-close");d.exports=function(u,d,t,i){try{return i?d(a(t)[0],t[1]):d(t)}catch(d){c(u,"throw",d)}}},{"../internals/an-object":60,"../internals/iterator-close":120}],73:[function(u,d,t){var a=u("../internals/well-known-symbol")("iterator"),c=!1;try{var i=0,l={next:function(){return{done:!!i++}},return:function(){c=!0}};l[a]=function(){return this},Array.from(l,(function(){throw 2}))}catch(u){}d.exports=function(u,d){if(!d&&!c)return!1;var t=!1;try{var i={};i[a]=function(){return{next:function(){return{done:t=!0}}}},u(i)}catch(u){}return t}},{"../internals/well-known-symbol":166}],74:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=a({}.toString),i=a("".slice);d.exports=function(u){return i(c(u),8,-1)}},{"../internals/function-uncurry-this":99}],75:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/to-string-tag-support"),i=u("../internals/is-callable"),l=u("../internals/classof-raw"),D=u("../internals/well-known-symbol")("toStringTag"),p=a.Object,b="Arguments"==l(function(){return arguments}());d.exports=c?l:function(u){var d,t,a;return void 0===u?"Undefined":null===u?"Null":"string"==typeof(t=function(u,d){try{return u[d]}catch(u){}}(d=p(u),D))?t:b?l(d):"Object"==(a=l(d))&&i(d.callee)?"Arguments":a}},{"../internals/classof-raw":74,"../internals/global":104,"../internals/is-callable":114,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],76:[function(u,d,t){var a=u("../internals/fails");d.exports=!a((function(){function F(){}return F.prototype.constructor=null,Object.getPrototypeOf(new F)!==F.prototype}))},{"../internals/fails":94}],77:[function(u,d,t){"use strict";var a=u("../internals/iterators-core").IteratorPrototype,c=u("../internals/object-create"),i=u("../internals/create-property-descriptor"),l=u("../internals/set-to-string-tag"),D=u("../internals/iterators"),returnThis=function(){return this};d.exports=function(u,d,t,p){var b=d+" Iterator";return u.prototype=c(a,{next:i(+!p,t)}),l(u,b,!1,!0),D[b]=returnThis,u}},{"../internals/create-property-descriptor":79,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-create":127,"../internals/set-to-string-tag":147}],78:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/object-define-property"),i=u("../internals/create-property-descriptor");d.exports=a?function(u,d,t){return c.f(u,d,i(1,t))}:function(u,d,t){return u[d]=t,u}},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/object-define-property":129}],79:[function(u,d,t){d.exports=function(u,d){return{enumerable:!(1&u),configurable:!(2&u),writable:!(4&u),value:d}}},{}],80:[function(u,d,t){"use strict";var a=u("../internals/to-property-key"),c=u("../internals/object-define-property"),i=u("../internals/create-property-descriptor");d.exports=function(u,d,t){var l=a(d);l in u?c.f(u,l,i(0,t)):u[l]=t}},{"../internals/create-property-descriptor":79,"../internals/object-define-property":129,"../internals/to-property-key":159}],81:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/function-call"),i=u("../internals/is-pure"),l=u("../internals/function-name"),D=u("../internals/is-callable"),p=u("../internals/create-iterator-constructor"),b=u("../internals/object-get-prototype-of"),y=u("../internals/object-set-prototype-of"),m=u("../internals/set-to-string-tag"),A=u("../internals/create-non-enumerable-property"),E=u("../internals/redefine"),C=u("../internals/well-known-symbol"),g=u("../internals/iterators"),h=u("../internals/iterators-core"),x=l.PROPER,v=l.CONFIGURABLE,B=h.IteratorPrototype,w=h.BUGGY_SAFARI_ITERATORS,j=C("iterator"),k="keys",S="values",O="entries",returnThis=function(){return this};d.exports=function(u,d,t,l,C,h,R){p(t,d,l);var _,T,I,getIterationMethod=function(u){if(u===C&&M)return M;if(!w&&u in L)return L[u];switch(u){case k:return function keys(){return new t(this,u)};case S:return function values(){return new t(this,u)};case O:return function entries(){return new t(this,u)}}return function(){return new t(this)}},P=d+" Iterator",X=!1,L=u.prototype,N=L[j]||L["@@iterator"]||C&&L[C],M=!w&&N||getIterationMethod(C),U="Array"==d&&L.entries||N;if(U&&(_=b(U.call(new u)))!==Object.prototype&&_.next&&(i||b(_)===B||(y?y(_,B):D(_[j])||E(_,j,returnThis)),m(_,P,!0,!0),i&&(g[P]=returnThis)),x&&C==S&&N&&N.name!==S&&(!i&&v?A(L,"name",S):(X=!0,M=function values(){return c(N,this)})),C)if(T={values:getIterationMethod(S),keys:h?M:getIterationMethod(k),entries:getIterationMethod(O)},R)for(I in T)(w||X||!(I in L))&&E(L,I,T[I]);else a({target:d,proto:!0,forced:w||X},T);return i&&!R||L[j]===M||E(L,j,M,{name:C}),g[d]=M,T}},{"../internals/create-iterator-constructor":77,"../internals/create-non-enumerable-property":78,"../internals/export":93,"../internals/function-call":97,"../internals/function-name":98,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-get-prototype-of":134,"../internals/object-set-prototype-of":139,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/well-known-symbol":166}],82:[function(u,d,t){var a=u("../internals/path"),c=u("../internals/has-own-property"),i=u("../internals/well-known-symbol-wrapped"),l=u("../internals/object-define-property").f;d.exports=function(u){var d=a.Symbol||(a.Symbol={});c(d,u)||l(d,u,{value:i.f(u)})}},{"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/path":142,"../internals/well-known-symbol-wrapped":165}],83:[function(u,d,t){var a=u("../internals/fails");d.exports=!a((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},{"../internals/fails":94}],84:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-object"),i=a.document,l=c(i)&&c(i.createElement);d.exports=function(u){return l?i.createElement(u):{}}},{"../internals/global":104,"../internals/is-object":117}],85:[function(u,d,t){d.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},{}],86:[function(u,d,t){var a=u("../internals/engine-user-agent").match(/firefox\/(\d+)/i);d.exports=!!a&&+a[1]},{"../internals/engine-user-agent":88}],87:[function(u,d,t){var a=u("../internals/engine-user-agent");d.exports=/MSIE|Trident/.test(a)},{"../internals/engine-user-agent":88}],88:[function(u,d,t){var a=u("../internals/get-built-in");d.exports=a("navigator","userAgent")||""},{"../internals/get-built-in":100}],89:[function(u,d,t){var a,c,i=u("../internals/global"),l=u("../internals/engine-user-agent"),D=i.process,p=i.Deno,b=D&&D.versions||p&&p.version,y=b&&b.v8;y&&(c=(a=y.split("."))[0]>0&&a[0]<4?1:+(a[0]+a[1])),!c&&l&&(!(a=l.match(/Edge\/(\d+)/))||a[1]>=74)&&(a=l.match(/Chrome\/(\d+)/))&&(c=+a[1]),d.exports=c},{"../internals/engine-user-agent":88,"../internals/global":104}],90:[function(u,d,t){var a=u("../internals/engine-user-agent").match(/AppleWebKit\/(\d+)\./);d.exports=!!a&&+a[1]},{"../internals/engine-user-agent":88}],91:[function(u,d,t){var a=u("../internals/path");d.exports=function(u){return a[u+"Prototype"]}},{"../internals/path":142}],92:[function(u,d,t){d.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},{}],93:[function(u,d,t){"use strict";var a=u("../internals/global"),c=u("../internals/function-apply"),i=u("../internals/function-uncurry-this"),l=u("../internals/is-callable"),D=u("../internals/object-get-own-property-descriptor").f,p=u("../internals/is-forced"),b=u("../internals/path"),y=u("../internals/function-bind-context"),m=u("../internals/create-non-enumerable-property"),A=u("../internals/has-own-property"),wrapConstructor=function(u){var Wrapper=function(d,t,a){if(this instanceof Wrapper){switch(arguments.length){case 0:return new u;case 1:return new u(d);case 2:return new u(d,t)}return new u(d,t,a)}return c(u,this,arguments)};return Wrapper.prototype=u.prototype,Wrapper};d.exports=function(u,d){var t,c,E,C,g,h,x,v,B=u.target,w=u.global,j=u.stat,k=u.proto,S=w?a:j?a[B]:(a[B]||{}).prototype,O=w?b:b[B]||m(b,B,{})[B],R=O.prototype;for(E in d)t=!p(w?E:B+(j?".":"#")+E,u.forced)&&S&&A(S,E),g=O[E],t&&(h=u.noTargetGet?(v=D(S,E))&&v.value:S[E]),C=t&&h?h:d[E],t&&typeof g==typeof C||(x=u.bind&&t?y(C,a):u.wrap&&t?wrapConstructor(C):k&&l(C)?i(C):C,(u.sham||C&&C.sham||g&&g.sham)&&m(x,"sham",!0),m(O,E,x),k&&(A(b,c=B+"Prototype")||m(b,c,{}),m(b[c],E,C),u.real&&R&&!R[E]&&m(R,E,C)))}},{"../internals/create-non-enumerable-property":78,"../internals/function-apply":95,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/is-forced":116,"../internals/object-get-own-property-descriptor":130,"../internals/path":142}],94:[function(u,d,t){d.exports=function(u){try{return!!u()}catch(u){return!0}}},{}],95:[function(u,d,t){var a=Function.prototype,c=a.apply,i=a.bind,l=a.call;d.exports="object"==typeof Reflect&&Reflect.apply||(i?l.bind(c):function(){return l.apply(c,arguments)})},{}],96:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/a-callable"),i=a(a.bind);d.exports=function(u,d){return c(u),void 0===d?u:i?i(u,d):function(){return u.apply(d,arguments)}}},{"../internals/a-callable":57,"../internals/function-uncurry-this":99}],97:[function(u,d,t){var a=Function.prototype.call;d.exports=a.bind?a.bind(a):function(){return a.apply(a,arguments)}},{}],98:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/has-own-property"),i=Function.prototype,l=a&&Object.getOwnPropertyDescriptor,D=c(i,"name"),p=D&&"something"===function something(){}.name,b=D&&(!a||a&&l(i,"name").configurable);d.exports={EXISTS:D,PROPER:p,CONFIGURABLE:b}},{"../internals/descriptors":83,"../internals/has-own-property":105}],99:[function(u,d,t){var a=Function.prototype,c=a.bind,i=a.call,l=c&&c.bind(i);d.exports=c?function(u){return u&&l(i,u)}:function(u){return u&&function(){return i.apply(u,arguments)}}},{}],100:[function(u,d,t){var a=u("../internals/path"),c=u("../internals/global"),i=u("../internals/is-callable"),aFunction=function(u){return i(u)?u:void 0};d.exports=function(u,d){return arguments.length<2?aFunction(a[u])||aFunction(c[u]):a[u]&&a[u][d]||c[u]&&c[u][d]}},{"../internals/global":104,"../internals/is-callable":114,"../internals/path":142}],101:[function(u,d,t){var a=u("../internals/classof"),c=u("../internals/get-method"),i=u("../internals/iterators"),l=u("../internals/well-known-symbol")("iterator");d.exports=function(u){if(null!=u)return c(u,l)||c(u,"@@iterator")||i[a(u)]}},{"../internals/classof":75,"../internals/get-method":103,"../internals/iterators":122,"../internals/well-known-symbol":166}],102:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-call"),i=u("../internals/a-callable"),l=u("../internals/an-object"),D=u("../internals/try-to-string"),p=u("../internals/get-iterator-method"),b=a.TypeError;d.exports=function(u,d){var t=arguments.length<2?p(u):d;if(i(t))return l(c(t,u));throw b(D(u)+" is not iterable")}},{"../internals/a-callable":57,"../internals/an-object":60,"../internals/function-call":97,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/try-to-string":162}],103:[function(u,d,t){var a=u("../internals/a-callable");d.exports=function(u,d){var t=u[d];return null==t?void 0:a(t)}},{"../internals/a-callable":57}],104:[function(u,d,t){(function(u){(function(){var check=function(u){return u&&u.Math==Math&&u};d.exports=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof u&&u)||function(){return this}()||Function("return this")()}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],105:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/to-object"),i=a({}.hasOwnProperty);d.exports=Object.hasOwn||function hasOwn(u,d){return i(c(u),d)}},{"../internals/function-uncurry-this":99,"../internals/to-object":157}],106:[function(u,d,t){d.exports={}},{}],107:[function(u,d,t){var a=u("../internals/get-built-in");d.exports=a("document","documentElement")},{"../internals/get-built-in":100}],108:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/fails"),i=u("../internals/document-create-element");d.exports=!a&&!c((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},{"../internals/descriptors":83,"../internals/document-create-element":84,"../internals/fails":94}],109:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-uncurry-this"),i=u("../internals/fails"),l=u("../internals/classof-raw"),D=a.Object,p=c("".split);d.exports=i((function(){return!D("z").propertyIsEnumerable(0)}))?function(u){return"String"==l(u)?p(u,""):D(u)}:D},{"../internals/classof-raw":74,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104}],110:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/is-callable"),i=u("../internals/shared-store"),l=a(Function.toString);c(i.inspectSource)||(i.inspectSource=function(u){return l(u)}),d.exports=i.inspectSource},{"../internals/function-uncurry-this":99,"../internals/is-callable":114,"../internals/shared-store":149}],111:[function(u,d,t){var a,c,i,l=u("../internals/native-weak-map"),D=u("../internals/global"),p=u("../internals/function-uncurry-this"),b=u("../internals/is-object"),y=u("../internals/create-non-enumerable-property"),m=u("../internals/has-own-property"),A=u("../internals/shared-store"),E=u("../internals/shared-key"),C=u("../internals/hidden-keys"),g="Object already initialized",h=D.TypeError,x=D.WeakMap;if(l||A.state){var v=A.state||(A.state=new x),B=p(v.get),w=p(v.has),j=p(v.set);a=function(u,d){if(w(v,u))throw new h(g);return d.facade=u,j(v,u,d),d},c=function(u){return B(v,u)||{}},i=function(u){return w(v,u)}}else{var k=E("state");C[k]=!0,a=function(u,d){if(m(u,k))throw new h(g);return d.facade=u,y(u,k,d),d},c=function(u){return m(u,k)?u[k]:{}},i=function(u){return m(u,k)}}d.exports={set:a,get:c,has:i,enforce:function(u){return i(u)?c(u):a(u,{})},getterFor:function(u){return function(d){var t;if(!b(d)||(t=c(d)).type!==u)throw h("Incompatible receiver, "+u+" required");return t}}}},{"../internals/create-non-enumerable-property":78,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/is-object":117,"../internals/native-weak-map":125,"../internals/shared-key":148,"../internals/shared-store":149}],112:[function(u,d,t){var a=u("../internals/well-known-symbol"),c=u("../internals/iterators"),i=a("iterator"),l=Array.prototype;d.exports=function(u){return void 0!==u&&(c.Array===u||l[i]===u)}},{"../internals/iterators":122,"../internals/well-known-symbol":166}],113:[function(u,d,t){var a=u("../internals/classof-raw");d.exports=Array.isArray||function isArray(u){return"Array"==a(u)}},{"../internals/classof-raw":74}],114:[function(u,d,t){d.exports=function(u){return"function"==typeof u}},{}],115:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/fails"),i=u("../internals/is-callable"),l=u("../internals/classof"),D=u("../internals/get-built-in"),p=u("../internals/inspect-source"),noop=function(){},b=[],y=D("Reflect","construct"),m=/^\s*(?:class|function)\b/,A=a(m.exec),E=!m.exec(noop),C=function isConstructor(u){if(!i(u))return!1;try{return y(noop,b,u),!0}catch(u){return!1}},g=function isConstructor(u){if(!i(u))return!1;switch(l(u)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return E||!!A(m,p(u))}catch(u){return!0}};g.sham=!0,d.exports=!y||c((function(){var u;return C(C.call)||!C(Object)||!C((function(){u=!0}))||u}))?g:C},{"../internals/classof":75,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/inspect-source":110,"../internals/is-callable":114}],116:[function(u,d,t){var a=u("../internals/fails"),c=u("../internals/is-callable"),i=/#|\.prototype\./,isForced=function(u,d){var t=D[l(u)];return t==b||t!=p&&(c(d)?a(d):!!d)},l=isForced.normalize=function(u){return String(u).replace(i,".").toLowerCase()},D=isForced.data={},p=isForced.NATIVE="N",b=isForced.POLYFILL="P";d.exports=isForced},{"../internals/fails":94,"../internals/is-callable":114}],117:[function(u,d,t){var a=u("../internals/is-callable");d.exports=function(u){return"object"==typeof u?null!==u:a(u)}},{"../internals/is-callable":114}],118:[function(u,d,t){d.exports=!0},{}],119:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/get-built-in"),i=u("../internals/is-callable"),l=u("../internals/object-is-prototype-of"),D=u("../internals/use-symbol-as-uid"),p=a.Object;d.exports=D?function(u){return"symbol"==typeof u}:function(u){var d=c("Symbol");return i(d)&&l(d.prototype,p(u))}},{"../internals/get-built-in":100,"../internals/global":104,"../internals/is-callable":114,"../internals/object-is-prototype-of":135,"../internals/use-symbol-as-uid":164}],120:[function(u,d,t){var a=u("../internals/function-call"),c=u("../internals/an-object"),i=u("../internals/get-method");d.exports=function(u,d,t){var l,D;c(u);try{if(!(l=i(u,"return"))){if("throw"===d)throw t;return t}l=a(l,u)}catch(u){D=!0,l=u}if("throw"===d)throw t;if(D)throw l;return c(l),t}},{"../internals/an-object":60,"../internals/function-call":97,"../internals/get-method":103}],121:[function(u,d,t){"use strict";var a,c,i,l=u("../internals/fails"),D=u("../internals/is-callable"),p=u("../internals/object-create"),b=u("../internals/object-get-prototype-of"),y=u("../internals/redefine"),m=u("../internals/well-known-symbol"),A=u("../internals/is-pure"),E=m("iterator"),C=!1;[].keys&&("next"in(i=[].keys())?(c=b(b(i)))!==Object.prototype&&(a=c):C=!0),null==a||l((function(){var u={};return a[E].call(u)!==u}))?a={}:A&&(a=p(a)),D(a[E])||y(a,E,(function(){return this})),d.exports={IteratorPrototype:a,BUGGY_SAFARI_ITERATORS:C}},{"../internals/fails":94,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/object-create":127,"../internals/object-get-prototype-of":134,"../internals/redefine":143,"../internals/well-known-symbol":166}],122:[function(u,d,t){arguments[4][106][0].apply(t,arguments)},{dup:106}],123:[function(u,d,t){var a=u("../internals/to-length");d.exports=function(u){return a(u.length)}},{"../internals/to-length":156}],124:[function(u,d,t){var a=u("../internals/engine-v8-version"),c=u("../internals/fails");d.exports=!!Object.getOwnPropertySymbols&&!c((function(){var u=Symbol();return!String(u)||!(Object(u)instanceof Symbol)||!Symbol.sham&&a&&a<41}))},{"../internals/engine-v8-version":89,"../internals/fails":94}],125:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-callable"),i=u("../internals/inspect-source"),l=a.WeakMap;d.exports=c(l)&&/native code/.test(i(l))},{"../internals/global":104,"../internals/inspect-source":110,"../internals/is-callable":114}],126:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/fails"),i=u("../internals/function-uncurry-this"),l=u("../internals/to-string"),D=u("../internals/string-trim").trim,p=u("../internals/whitespaces"),b=a.parseInt,y=a.Symbol,m=y&&y.iterator,A=/^[+-]?0x/i,E=i(A.exec),C=8!==b(p+"08")||22!==b(p+"0x16")||m&&!c((function(){b(Object(m))}));d.exports=C?function parseInt(u,d){var t=D(l(u));return b(t,d>>>0||(E(A,t)?16:10))}:b},{"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/string-trim":152,"../internals/to-string":161,"../internals/whitespaces":167}],127:[function(u,d,t){var a,c=u("../internals/an-object"),i=u("../internals/object-define-properties"),l=u("../internals/enum-bug-keys"),D=u("../internals/hidden-keys"),p=u("../internals/html"),b=u("../internals/document-create-element"),y=u("../internals/shared-key"),m=y("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(u){return"<script>"+u+"</"+"script>"},NullProtoObjectViaActiveX=function(u){u.write(scriptTag("")),u.close();var d=u.parentWindow.Object;return u=null,d},NullProtoObject=function(){try{a=new ActiveXObject("htmlfile")}catch(u){}var u,d;NullProtoObject="undefined"!=typeof document?document.domain&&a?NullProtoObjectViaActiveX(a):((d=b("iframe")).style.display="none",p.appendChild(d),d.src=String("javascript:"),(u=d.contentWindow.document).open(),u.write(scriptTag("document.F=Object")),u.close(),u.F):NullProtoObjectViaActiveX(a);for(var t=l.length;t--;)delete NullProtoObject.prototype[l[t]];return NullProtoObject()};D[m]=!0,d.exports=Object.create||function create(u,d){var t;return null!==u?(EmptyConstructor.prototype=c(u),t=new EmptyConstructor,EmptyConstructor.prototype=null,t[m]=u):t=NullProtoObject(),void 0===d?t:i(t,d)}},{"../internals/an-object":60,"../internals/document-create-element":84,"../internals/enum-bug-keys":92,"../internals/hidden-keys":106,"../internals/html":107,"../internals/object-define-properties":128,"../internals/shared-key":148}],128:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/object-define-property"),i=u("../internals/an-object"),l=u("../internals/to-indexed-object"),D=u("../internals/object-keys");d.exports=a?Object.defineProperties:function defineProperties(u,d){i(u);for(var t,a=l(d),p=D(d),b=p.length,y=0;b>y;)c.f(u,t=p[y++],a[t]);return u}},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/object-define-property":129,"../internals/object-keys":137,"../internals/to-indexed-object":154}],129:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/descriptors"),i=u("../internals/ie8-dom-define"),l=u("../internals/an-object"),D=u("../internals/to-property-key"),p=a.TypeError,b=Object.defineProperty;t.f=c?b:function defineProperty(u,d,t){if(l(u),d=D(d),l(t),i)try{return b(u,d,t)}catch(u){}if("get"in t||"set"in t)throw p("Accessors not supported");return"value"in t&&(u[d]=t.value),u}},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/global":104,"../internals/ie8-dom-define":108,"../internals/to-property-key":159}],130:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/function-call"),i=u("../internals/object-property-is-enumerable"),l=u("../internals/create-property-descriptor"),D=u("../internals/to-indexed-object"),p=u("../internals/to-property-key"),b=u("../internals/has-own-property"),y=u("../internals/ie8-dom-define"),m=Object.getOwnPropertyDescriptor;t.f=a?m:function getOwnPropertyDescriptor(u,d){if(u=D(u),d=p(d),y)try{return m(u,d)}catch(u){}if(b(u,d))return l(!c(i.f,u,d),u[d])}},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/function-call":97,"../internals/has-own-property":105,"../internals/ie8-dom-define":108,"../internals/object-property-is-enumerable":138,"../internals/to-indexed-object":154,"../internals/to-property-key":159}],131:[function(u,d,t){var a=u("../internals/classof-raw"),c=u("../internals/to-indexed-object"),i=u("../internals/object-get-own-property-names").f,l=u("../internals/array-slice-simple"),D="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];d.exports.f=function getOwnPropertyNames(u){return D&&"Window"==a(u)?function(u){try{return i(u)}catch(u){return l(D)}}(u):i(c(u))}},{"../internals/array-slice-simple":67,"../internals/classof-raw":74,"../internals/object-get-own-property-names":132,"../internals/to-indexed-object":154}],132:[function(u,d,t){var a=u("../internals/object-keys-internal"),c=u("../internals/enum-bug-keys").concat("length","prototype");t.f=Object.getOwnPropertyNames||function getOwnPropertyNames(u){return a(u,c)}},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],133:[function(u,d,t){t.f=Object.getOwnPropertySymbols},{}],134:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/has-own-property"),i=u("../internals/is-callable"),l=u("../internals/to-object"),D=u("../internals/shared-key"),p=u("../internals/correct-prototype-getter"),b=D("IE_PROTO"),y=a.Object,m=y.prototype;d.exports=p?y.getPrototypeOf:function(u){var d=l(u);if(c(d,b))return d[b];var t=d.constructor;return i(t)&&d instanceof t?t.prototype:d instanceof y?m:null}},{"../internals/correct-prototype-getter":76,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/shared-key":148,"../internals/to-object":157}],135:[function(u,d,t){var a=u("../internals/function-uncurry-this");d.exports=a({}.isPrototypeOf)},{"../internals/function-uncurry-this":99}],136:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/has-own-property"),i=u("../internals/to-indexed-object"),l=u("../internals/array-includes").indexOf,D=u("../internals/hidden-keys"),p=a([].push);d.exports=function(u,d){var t,a=i(u),b=0,y=[];for(t in a)!c(D,t)&&c(a,t)&&p(y,t);for(;d.length>b;)c(a,t=d[b++])&&(~l(y,t)||p(y,t));return y}},{"../internals/array-includes":63,"../internals/function-uncurry-this":99,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/to-indexed-object":154}],137:[function(u,d,t){var a=u("../internals/object-keys-internal"),c=u("../internals/enum-bug-keys");d.exports=Object.keys||function keys(u){return a(u,c)}},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],138:[function(u,d,t){"use strict";var a={}.propertyIsEnumerable,c=Object.getOwnPropertyDescriptor,i=c&&!a.call({1:2},1);t.f=i?function propertyIsEnumerable(u){var d=c(this,u);return!!d&&d.enumerable}:a},{}],139:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/an-object"),i=u("../internals/a-possible-prototype");d.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var u,d=!1,t={};try{(u=a(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(t,[]),d=t instanceof Array}catch(u){}return function setPrototypeOf(t,a){return c(t),i(a),d?u(t,a):t.__proto__=a,t}}():void 0)},{"../internals/a-possible-prototype":58,"../internals/an-object":60,"../internals/function-uncurry-this":99}],140:[function(u,d,t){"use strict";var a=u("../internals/to-string-tag-support"),c=u("../internals/classof");d.exports=a?{}.toString:function toString(){return"[object "+c(this)+"]"}},{"../internals/classof":75,"../internals/to-string-tag-support":160}],141:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-call"),i=u("../internals/is-callable"),l=u("../internals/is-object"),D=a.TypeError;d.exports=function(u,d){var t,a;if("string"===d&&i(t=u.toString)&&!l(a=c(t,u)))return a;if(i(t=u.valueOf)&&!l(a=c(t,u)))return a;if("string"!==d&&i(t=u.toString)&&!l(a=c(t,u)))return a;throw D("Can't convert object to primitive value")}},{"../internals/function-call":97,"../internals/global":104,"../internals/is-callable":114,"../internals/is-object":117}],142:[function(u,d,t){arguments[4][106][0].apply(t,arguments)},{dup:106}],143:[function(u,d,t){var a=u("../internals/create-non-enumerable-property");d.exports=function(u,d,t,c){c&&c.enumerable?u[d]=t:a(u,d,t)}},{"../internals/create-non-enumerable-property":78}],144:[function(u,d,t){"use strict";var a=u("../internals/an-object");d.exports=function(){var u=a(this),d="";return u.global&&(d+="g"),u.ignoreCase&&(d+="i"),u.multiline&&(d+="m"),u.dotAll&&(d+="s"),u.unicode&&(d+="u"),u.sticky&&(d+="y"),d}},{"../internals/an-object":60}],145:[function(u,d,t){var a=u("../internals/global").TypeError;d.exports=function(u){if(null==u)throw a("Can't call method on "+u);return u}},{"../internals/global":104}],146:[function(u,d,t){var a=u("../internals/global"),c=Object.defineProperty;d.exports=function(u,d){try{c(a,u,{value:d,configurable:!0,writable:!0})}catch(t){a[u]=d}return d}},{"../internals/global":104}],147:[function(u,d,t){var a=u("../internals/to-string-tag-support"),c=u("../internals/object-define-property").f,i=u("../internals/create-non-enumerable-property"),l=u("../internals/has-own-property"),D=u("../internals/object-to-string"),p=u("../internals/well-known-symbol")("toStringTag");d.exports=function(u,d,t,b){if(u){var y=t?u:u.prototype;l(y,p)||c(y,p,{configurable:!0,value:d}),b&&!a&&i(y,"toString",D)}}},{"../internals/create-non-enumerable-property":78,"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/object-to-string":140,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],148:[function(u,d,t){var a=u("../internals/shared"),c=u("../internals/uid"),i=a("keys");d.exports=function(u){return i[u]||(i[u]=c(u))}},{"../internals/shared":150,"../internals/uid":163}],149:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/set-global"),i="__core-js_shared__",l=a[i]||c(i,{});d.exports=l},{"../internals/global":104,"../internals/set-global":146}],150:[function(u,d,t){var a=u("../internals/is-pure"),c=u("../internals/shared-store");(d.exports=function(u,d){return c[u]||(c[u]=void 0!==d?d:{})})("versions",[]).push({version:"3.20.0",mode:a?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},{"../internals/is-pure":118,"../internals/shared-store":149}],151:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/to-integer-or-infinity"),i=u("../internals/to-string"),l=u("../internals/require-object-coercible"),D=a("".charAt),p=a("".charCodeAt),b=a("".slice),createMethod=function(u){return function(d,t){var a,y,m=i(l(d)),A=c(t),E=m.length;return A<0||A>=E?u?"":void 0:(a=p(m,A))<55296||a>56319||A+1===E||(y=p(m,A+1))<56320||y>57343?u?D(m,A):a:u?b(m,A,A+2):y-56320+(a-55296<<10)+65536}};d.exports={codeAt:createMethod(!1),charAt:createMethod(!0)}},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-integer-or-infinity":155,"../internals/to-string":161}],152:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/require-object-coercible"),i=u("../internals/to-string"),l=u("../internals/whitespaces"),D=a("".replace),p="["+l+"]",b=RegExp("^"+p+p+"*"),y=RegExp(p+p+"*$"),createMethod=function(u){return function(d){var t=i(c(d));return 1&u&&(t=D(t,b,"")),2&u&&(t=D(t,y,"")),t}};d.exports={start:createMethod(1),end:createMethod(2),trim:createMethod(3)}},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-string":161,"../internals/whitespaces":167}],153:[function(u,d,t){var a=u("../internals/to-integer-or-infinity"),c=Math.max,i=Math.min;d.exports=function(u,d){var t=a(u);return t<0?c(t+d,0):i(t,d)}},{"../internals/to-integer-or-infinity":155}],154:[function(u,d,t){var a=u("../internals/indexed-object"),c=u("../internals/require-object-coercible");d.exports=function(u){return a(c(u))}},{"../internals/indexed-object":109,"../internals/require-object-coercible":145}],155:[function(u,d,t){var a=Math.ceil,c=Math.floor;d.exports=function(u){var d=+u;return d!=d||0===d?0:(d>0?c:a)(d)}},{}],156:[function(u,d,t){var a=u("../internals/to-integer-or-infinity"),c=Math.min;d.exports=function(u){return u>0?c(a(u),9007199254740991):0}},{"../internals/to-integer-or-infinity":155}],157:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/require-object-coercible"),i=a.Object;d.exports=function(u){return i(c(u))}},{"../internals/global":104,"../internals/require-object-coercible":145}],158:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-call"),i=u("../internals/is-object"),l=u("../internals/is-symbol"),D=u("../internals/get-method"),p=u("../internals/ordinary-to-primitive"),b=u("../internals/well-known-symbol"),y=a.TypeError,m=b("toPrimitive");d.exports=function(u,d){if(!i(u)||l(u))return u;var t,a=D(u,m);if(a){if(void 0===d&&(d="default"),t=c(a,u,d),!i(t)||l(t))return t;throw y("Can't convert object to primitive value")}return void 0===d&&(d="number"),p(u,d)}},{"../internals/function-call":97,"../internals/get-method":103,"../internals/global":104,"../internals/is-object":117,"../internals/is-symbol":119,"../internals/ordinary-to-primitive":141,"../internals/well-known-symbol":166}],159:[function(u,d,t){var a=u("../internals/to-primitive"),c=u("../internals/is-symbol");d.exports=function(u){var d=a(u,"string");return c(d)?d:d+""}},{"../internals/is-symbol":119,"../internals/to-primitive":158}],160:[function(u,d,t){var a={};a[u("../internals/well-known-symbol")("toStringTag")]="z",d.exports="[object z]"===String(a)},{"../internals/well-known-symbol":166}],161:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/classof"),i=a.String;d.exports=function(u){if("Symbol"===c(u))throw TypeError("Cannot convert a Symbol value to a string");return i(u)}},{"../internals/classof":75,"../internals/global":104}],162:[function(u,d,t){var a=u("../internals/global").String;d.exports=function(u){try{return a(u)}catch(u){return"Object"}}},{"../internals/global":104}],163:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=0,i=Math.random(),l=a(1..toString);d.exports=function(u){return"Symbol("+(void 0===u?"":u)+")_"+l(++c+i,36)}},{"../internals/function-uncurry-this":99}],164:[function(u,d,t){var a=u("../internals/native-symbol");d.exports=a&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},{"../internals/native-symbol":124}],165:[function(u,d,t){var a=u("../internals/well-known-symbol");t.f=a},{"../internals/well-known-symbol":166}],166:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/shared"),i=u("../internals/has-own-property"),l=u("../internals/uid"),D=u("../internals/native-symbol"),p=u("../internals/use-symbol-as-uid"),b=c("wks"),y=a.Symbol,m=y&&y.for,A=p?y:y&&y.withoutSetter||l;d.exports=function(u){if(!i(b,u)||!D&&"string"!=typeof b[u]){var d="Symbol."+u;D&&i(y,u)?b[u]=y[u]:b[u]=p&&m?m(d):A(d)}return b[u]}},{"../internals/global":104,"../internals/has-own-property":105,"../internals/native-symbol":124,"../internals/shared":150,"../internals/uid":163,"../internals/use-symbol-as-uid":164}],167:[function(u,d,t){d.exports="\t\n\v\f\r                \u2028\u2029\ufeff"},{}],168:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/global"),i=u("../internals/fails"),l=u("../internals/is-array"),D=u("../internals/is-object"),p=u("../internals/to-object"),b=u("../internals/length-of-array-like"),y=u("../internals/create-property"),m=u("../internals/array-species-create"),A=u("../internals/array-method-has-species-support"),E=u("../internals/well-known-symbol"),C=u("../internals/engine-v8-version"),g=E("isConcatSpreadable"),h=9007199254740991,x="Maximum allowed index exceeded",v=c.TypeError,B=C>=51||!i((function(){var u=[];return u[g]=!1,u.concat()[0]!==u})),w=A("concat"),isConcatSpreadable=function(u){if(!D(u))return!1;var d=u[g];return void 0!==d?!!d:l(u)};a({target:"Array",proto:!0,forced:!B||!w},{concat:function concat(u){var d,t,a,c,i,l=p(this),D=m(l,0),A=0;for(d=-1,a=arguments.length;d<a;d++)if(isConcatSpreadable(i=-1===d?l:arguments[d])){if(A+(c=b(i))>h)throw v(x);for(t=0;t<c;t++,A++)t in i&&y(D,A,i[t])}else{if(A>=h)throw v(x);y(D,A++,i)}return D.length=A,D}})},{"../internals/array-method-has-species-support":65,"../internals/array-species-create":71,"../internals/create-property":80,"../internals/engine-v8-version":89,"../internals/export":93,"../internals/fails":94,"../internals/global":104,"../internals/is-array":113,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/well-known-symbol":166}],169:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/array-for-each");a({target:"Array",proto:!0,forced:[].forEach!=c},{forEach:c})},{"../internals/array-for-each":61,"../internals/export":93}],170:[function(u,d,t){var a=u("../internals/export"),c=u("../internals/array-from");a({target:"Array",stat:!0,forced:!u("../internals/check-correctness-of-iteration")((function(u){Array.from(u)}))},{from:c})},{"../internals/array-from":62,"../internals/check-correctness-of-iteration":73,"../internals/export":93}],171:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/function-uncurry-this"),i=u("../internals/array-includes").indexOf,l=u("../internals/array-method-is-strict"),D=c([].indexOf),p=!!D&&1/D([1],1,-0)<0,b=l("indexOf");a({target:"Array",proto:!0,forced:p||!b},{indexOf:function indexOf(u){var d=arguments.length>1?arguments[1]:void 0;return p?D(this,u,d)||0:i(this,u,d)}})},{"../internals/array-includes":63,"../internals/array-method-is-strict":66,"../internals/export":93,"../internals/function-uncurry-this":99}],172:[function(u,d,t){u("../internals/export")({target:"Array",stat:!0},{isArray:u("../internals/is-array")})},{"../internals/export":93,"../internals/is-array":113}],173:[function(u,d,t){"use strict";var a=u("../internals/to-indexed-object"),c=u("../internals/add-to-unscopables"),i=u("../internals/iterators"),l=u("../internals/internal-state"),D=u("../internals/object-define-property").f,p=u("../internals/define-iterator"),b=u("../internals/is-pure"),y=u("../internals/descriptors"),m="Array Iterator",A=l.set,E=l.getterFor(m);d.exports=p(Array,"Array",(function(u,d){A(this,{type:m,target:a(u),index:0,kind:d})}),(function(){var u=E(this),d=u.target,t=u.kind,a=u.index++;return!d||a>=d.length?(u.target=void 0,{value:void 0,done:!0}):"keys"==t?{value:a,done:!1}:"values"==t?{value:d[a],done:!1}:{value:[a,d[a]],done:!1}}),"values");var C=i.Arguments=i.Array;if(c("keys"),c("values"),c("entries"),!b&&y&&"values"!==C.name)try{D(C,"name",{value:"values"})}catch(u){}},{"../internals/add-to-unscopables":59,"../internals/define-iterator":81,"../internals/descriptors":83,"../internals/internal-state":111,"../internals/is-pure":118,"../internals/iterators":122,"../internals/object-define-property":129,"../internals/to-indexed-object":154}],174:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/global"),i=u("../internals/is-array"),l=u("../internals/is-constructor"),D=u("../internals/is-object"),p=u("../internals/to-absolute-index"),b=u("../internals/length-of-array-like"),y=u("../internals/to-indexed-object"),m=u("../internals/create-property"),A=u("../internals/well-known-symbol"),E=u("../internals/array-method-has-species-support"),C=u("../internals/array-slice"),g=E("slice"),h=A("species"),x=c.Array,v=Math.max;a({target:"Array",proto:!0,forced:!g},{slice:function slice(u,d){var t,a,c,A=y(this),E=b(A),g=p(u,E),B=p(void 0===d?E:d,E);if(i(A)&&(t=A.constructor,(l(t)&&(t===x||i(t.prototype))||D(t)&&null===(t=t[h]))&&(t=void 0),t===x||void 0===t))return C(A,g,B);for(a=new(void 0===t?x:t)(v(B-g,0)),c=0;g<B;g++,c++)g in A&&m(a,c,A[g]);return a.length=c,a}})},{"../internals/array-method-has-species-support":65,"../internals/array-slice":68,"../internals/create-property":80,"../internals/export":93,"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154,"../internals/well-known-symbol":166}],175:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/function-uncurry-this"),i=u("../internals/a-callable"),l=u("../internals/to-object"),D=u("../internals/length-of-array-like"),p=u("../internals/to-string"),b=u("../internals/fails"),y=u("../internals/array-sort"),m=u("../internals/array-method-is-strict"),A=u("../internals/engine-ff-version"),E=u("../internals/engine-is-ie-or-edge"),C=u("../internals/engine-v8-version"),g=u("../internals/engine-webkit-version"),h=[],x=c(h.sort),v=c(h.push),B=b((function(){h.sort(void 0)})),w=b((function(){h.sort(null)})),j=m("sort"),k=!b((function(){if(C)return C<70;if(!(A&&A>3)){if(E)return!0;if(g)return g<603;var u,d,t,a,c="";for(u=65;u<76;u++){switch(d=String.fromCharCode(u),u){case 66:case 69:case 70:case 72:t=3;break;case 68:case 71:t=4;break;default:t=2}for(a=0;a<47;a++)h.push({k:d+a,v:t})}for(h.sort((function(u,d){return d.v-u.v})),a=0;a<h.length;a++)d=h[a].k.charAt(0),c.charAt(c.length-1)!==d&&(c+=d);return"DGBEFHACIJK"!==c}}));a({target:"Array",proto:!0,forced:B||!w||!j||!k},{sort:function sort(u){void 0!==u&&i(u);var d=l(this);if(k)return void 0===u?x(d):x(d,u);var t,a,c=[],b=D(d);for(a=0;a<b;a++)a in d&&v(c,d[a]);for(y(c,function(u){return function(d,t){return void 0===t?-1:void 0===d?1:void 0!==u?+u(d,t)||0:p(d)>p(t)?1:-1}}(u)),t=c.length,a=0;a<t;)d[a]=c[a++];for(;a<b;)delete d[a++];return d}})},{"../internals/a-callable":57,"../internals/array-method-is-strict":66,"../internals/array-sort":69,"../internals/engine-ff-version":86,"../internals/engine-is-ie-or-edge":87,"../internals/engine-v8-version":89,"../internals/engine-webkit-version":90,"../internals/export":93,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/to-string":161}],176:[function(u,d,t){var a=u("../internals/global");u("../internals/set-to-string-tag")(a.JSON,"JSON",!0)},{"../internals/global":104,"../internals/set-to-string-tag":147}],177:[function(u,d,t){},{}],178:[function(u,d,t){u("../internals/export")({target:"Object",stat:!0,sham:!u("../internals/descriptors")},{create:u("../internals/object-create")})},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-create":127}],179:[function(u,d,t){var a=u("../internals/export"),c=u("../internals/descriptors");a({target:"Object",stat:!0,forced:!c,sham:!c},{defineProperty:u("../internals/object-define-property").f})},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-define-property":129}],180:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],181:[function(u,d,t){var a=u("../internals/export"),c=u("../internals/number-parse-int");a({global:!0,forced:parseInt!=c},{parseInt:c})},{"../internals/export":93,"../internals/number-parse-int":126}],182:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],183:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],184:[function(u,d,t){"use strict";var a=u("../internals/string-multibyte").charAt,c=u("../internals/to-string"),i=u("../internals/internal-state"),l=u("../internals/define-iterator"),D="String Iterator",p=i.set,b=i.getterFor(D);l(String,"String",(function(u){p(this,{type:D,string:c(u),index:0})}),(function next(){var u,d=b(this),t=d.string,c=d.index;return c>=t.length?{value:void 0,done:!0}:(u=a(t,c),d.index+=u.length,{value:u,done:!1})}))},{"../internals/define-iterator":81,"../internals/internal-state":111,"../internals/string-multibyte":151,"../internals/to-string":161}],185:[function(u,d,t){u("../internals/define-well-known-symbol")("asyncIterator")},{"../internals/define-well-known-symbol":82}],186:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],187:[function(u,d,t){u("../internals/define-well-known-symbol")("hasInstance")},{"../internals/define-well-known-symbol":82}],188:[function(u,d,t){u("../internals/define-well-known-symbol")("isConcatSpreadable")},{"../internals/define-well-known-symbol":82}],189:[function(u,d,t){u("../internals/define-well-known-symbol")("iterator")},{"../internals/define-well-known-symbol":82}],190:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/global"),i=u("../internals/get-built-in"),l=u("../internals/function-apply"),D=u("../internals/function-call"),p=u("../internals/function-uncurry-this"),b=u("../internals/is-pure"),y=u("../internals/descriptors"),m=u("../internals/native-symbol"),A=u("../internals/fails"),E=u("../internals/has-own-property"),C=u("../internals/is-array"),g=u("../internals/is-callable"),h=u("../internals/is-object"),x=u("../internals/object-is-prototype-of"),v=u("../internals/is-symbol"),B=u("../internals/an-object"),w=u("../internals/to-object"),j=u("../internals/to-indexed-object"),k=u("../internals/to-property-key"),S=u("../internals/to-string"),O=u("../internals/create-property-descriptor"),R=u("../internals/object-create"),_=u("../internals/object-keys"),T=u("../internals/object-get-own-property-names"),I=u("../internals/object-get-own-property-names-external"),P=u("../internals/object-get-own-property-symbols"),X=u("../internals/object-get-own-property-descriptor"),L=u("../internals/object-define-property"),N=u("../internals/object-property-is-enumerable"),M=u("../internals/array-slice"),U=u("../internals/redefine"),G=u("../internals/shared"),q=u("../internals/shared-key"),z=u("../internals/hidden-keys"),$=u("../internals/uid"),H=u("../internals/well-known-symbol"),Z=u("../internals/well-known-symbol-wrapped"),Y=u("../internals/define-well-known-symbol"),V=u("../internals/set-to-string-tag"),W=u("../internals/internal-state"),J=u("../internals/array-iteration").forEach,K=q("hidden"),Q="Symbol",uu=H("toPrimitive"),eu=W.set,du=W.getterFor(Q),nu=Object.prototype,tu=c.Symbol,ru=tu&&tu.prototype,au=c.TypeError,cu=c.QObject,ou=i("JSON","stringify"),iu=X.f,su=L.f,fu=I.f,lu=N.f,Du=p([].push),pu=G("symbols"),bu=G("op-symbols"),yu=G("string-to-symbol-registry"),Fu=G("symbol-to-string-registry"),mu=G("wks"),Au=!cu||!cu.prototype||!cu.prototype.findChild,Eu=y&&A((function(){return 7!=R(su({},"a",{get:function(){return su(this,"a",{value:7}).a}})).a}))?function(u,d,t){var a=iu(nu,d);a&&delete nu[d],su(u,d,t),a&&u!==nu&&su(nu,d,a)}:su,wrap=function(u,d){var t=pu[u]=R(ru);return eu(t,{type:Q,tag:u,description:d}),y||(t.description=d),t},Cu=function defineProperty(u,d,t){u===nu&&Cu(bu,d,t),B(u);var a=k(d);return B(t),E(pu,a)?(t.enumerable?(E(u,K)&&u[K][a]&&(u[K][a]=!1),t=R(t,{enumerable:O(0,!1)})):(E(u,K)||su(u,K,O(1,{})),u[K][a]=!0),Eu(u,a,t)):su(u,a,t)},gu=function defineProperties(u,d){B(u);var t=j(d),a=_(t).concat(Bu(t));return J(a,(function(d){y&&!D(hu,t,d)||Cu(u,d,t[d])})),u},hu=function propertyIsEnumerable(u){var d=k(u),t=D(lu,this,d);return!(this===nu&&E(pu,d)&&!E(bu,d))&&(!(t||!E(this,d)||!E(pu,d)||E(this,K)&&this[K][d])||t)},xu=function getOwnPropertyDescriptor(u,d){var t=j(u),a=k(d);if(t!==nu||!E(pu,a)||E(bu,a)){var c=iu(t,a);return!c||!E(pu,a)||E(t,K)&&t[K][a]||(c.enumerable=!0),c}},vu=function getOwnPropertyNames(u){var d=fu(j(u)),t=[];return J(d,(function(u){E(pu,u)||E(z,u)||Du(t,u)})),t},Bu=function getOwnPropertySymbols(u){var d=u===nu,t=fu(d?bu:j(u)),a=[];return J(t,(function(u){!E(pu,u)||d&&!E(nu,u)||Du(a,pu[u])})),a};(m||(tu=function Symbol(){if(x(ru,this))throw au("Symbol is not a constructor");var u=arguments.length&&void 0!==arguments[0]?S(arguments[0]):void 0,d=$(u),setter=function(u){this===nu&&D(setter,bu,u),E(this,K)&&E(this[K],d)&&(this[K][d]=!1),Eu(this,d,O(1,u))};return y&&Au&&Eu(nu,d,{configurable:!0,set:setter}),wrap(d,u)},U(ru=tu.prototype,"toString",(function toString(){return du(this).tag})),U(tu,"withoutSetter",(function(u){return wrap($(u),u)})),N.f=hu,L.f=Cu,X.f=xu,T.f=I.f=vu,P.f=Bu,Z.f=function(u){return wrap(H(u),u)},y&&(su(ru,"description",{configurable:!0,get:function description(){return du(this).description}}),b||U(nu,"propertyIsEnumerable",hu,{unsafe:!0}))),a({global:!0,wrap:!0,forced:!m,sham:!m},{Symbol:tu}),J(_(mu),(function(u){Y(u)})),a({target:Q,stat:!0,forced:!m},{for:function(u){var d=S(u);if(E(yu,d))return yu[d];var t=tu(d);return yu[d]=t,Fu[t]=d,t},keyFor:function keyFor(u){if(!v(u))throw au(u+" is not a symbol");if(E(Fu,u))return Fu[u]},useSetter:function(){Au=!0},useSimple:function(){Au=!1}}),a({target:"Object",stat:!0,forced:!m,sham:!y},{create:function create(u,d){return void 0===d?R(u):gu(R(u),d)},defineProperty:Cu,defineProperties:gu,getOwnPropertyDescriptor:xu}),a({target:"Object",stat:!0,forced:!m},{getOwnPropertyNames:vu,getOwnPropertySymbols:Bu}),a({target:"Object",stat:!0,forced:A((function(){P.f(1)}))},{getOwnPropertySymbols:function getOwnPropertySymbols(u){return P.f(w(u))}}),ou)&&a({target:"JSON",stat:!0,forced:!m||A((function(){var u=tu();return"[null]"!=ou([u])||"{}"!=ou({a:u})||"{}"!=ou(Object(u))}))},{stringify:function stringify(u,d,t){var a=M(arguments),c=d;if((h(d)||void 0!==u)&&!v(u))return C(d)||(d=function(u,d){if(g(c)&&(d=D(c,this,u,d)),!v(d))return d}),a[1]=d,l(ou,null,a)}});if(!ru[uu]){var wu=ru.valueOf;U(ru,uu,(function(u){return D(wu,this)}))}V(tu,Q),z[K]=!0},{"../internals/an-object":60,"../internals/array-iteration":64,"../internals/array-slice":68,"../internals/create-property-descriptor":79,"../internals/define-well-known-symbol":82,"../internals/descriptors":83,"../internals/export":93,"../internals/fails":94,"../internals/function-apply":95,"../internals/function-call":97,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/internal-state":111,"../internals/is-array":113,"../internals/is-callable":114,"../internals/is-object":117,"../internals/is-pure":118,"../internals/is-symbol":119,"../internals/native-symbol":124,"../internals/object-create":127,"../internals/object-define-property":129,"../internals/object-get-own-property-descriptor":130,"../internals/object-get-own-property-names":132,"../internals/object-get-own-property-names-external":131,"../internals/object-get-own-property-symbols":133,"../internals/object-is-prototype-of":135,"../internals/object-keys":137,"../internals/object-property-is-enumerable":138,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/shared":150,"../internals/shared-key":148,"../internals/to-indexed-object":154,"../internals/to-object":157,"../internals/to-property-key":159,"../internals/to-string":161,"../internals/uid":163,"../internals/well-known-symbol":166,"../internals/well-known-symbol-wrapped":165}],191:[function(u,d,t){u("../internals/define-well-known-symbol")("matchAll")},{"../internals/define-well-known-symbol":82}],192:[function(u,d,t){u("../internals/define-well-known-symbol")("match")},{"../internals/define-well-known-symbol":82}],193:[function(u,d,t){u("../internals/define-well-known-symbol")("replace")},{"../internals/define-well-known-symbol":82}],194:[function(u,d,t){u("../internals/define-well-known-symbol")("search")},{"../internals/define-well-known-symbol":82}],195:[function(u,d,t){u("../internals/define-well-known-symbol")("species")},{"../internals/define-well-known-symbol":82}],196:[function(u,d,t){u("../internals/define-well-known-symbol")("split")},{"../internals/define-well-known-symbol":82}],197:[function(u,d,t){u("../internals/define-well-known-symbol")("toPrimitive")},{"../internals/define-well-known-symbol":82}],198:[function(u,d,t){u("../internals/define-well-known-symbol")("toStringTag")},{"../internals/define-well-known-symbol":82}],199:[function(u,d,t){u("../internals/define-well-known-symbol")("unscopables")},{"../internals/define-well-known-symbol":82}],200:[function(u,d,t){u("../internals/define-well-known-symbol")("asyncDispose")},{"../internals/define-well-known-symbol":82}],201:[function(u,d,t){u("../internals/define-well-known-symbol")("dispose")},{"../internals/define-well-known-symbol":82}],202:[function(u,d,t){u("../internals/define-well-known-symbol")("matcher")},{"../internals/define-well-known-symbol":82}],203:[function(u,d,t){u("../internals/define-well-known-symbol")("metadata")},{"../internals/define-well-known-symbol":82}],204:[function(u,d,t){u("../internals/define-well-known-symbol")("observable")},{"../internals/define-well-known-symbol":82}],205:[function(u,d,t){u("../internals/define-well-known-symbol")("patternMatch")},{"../internals/define-well-known-symbol":82}],206:[function(u,d,t){u("../internals/define-well-known-symbol")("replaceAll")},{"../internals/define-well-known-symbol":82}],207:[function(u,d,t){u("../modules/es.array.iterator");var a=u("../internals/dom-iterables"),c=u("../internals/global"),i=u("../internals/classof"),l=u("../internals/create-non-enumerable-property"),D=u("../internals/iterators"),p=u("../internals/well-known-symbol")("toStringTag");for(var b in a){var y=c[b],m=y&&y.prototype;m&&i(m)!==p&&l(m,p,b),D[b]=D.Array}},{"../internals/classof":75,"../internals/create-non-enumerable-property":78,"../internals/dom-iterables":85,"../internals/global":104,"../internals/iterators":122,"../internals/well-known-symbol":166,"../modules/es.array.iterator":173}],208:[function(u,d,t){var a=u("../../es/array/from");d.exports=a},{"../../es/array/from":34}],209:[function(u,d,t){var a=u("../../es/array/is-array");d.exports=a},{"../../es/array/is-array":35}],210:[function(u,d,t){var a=u("../../../es/array/virtual/for-each");d.exports=a},{"../../../es/array/virtual/for-each":37}],211:[function(u,d,t){var a=u("../es/get-iterator-method");u("../modules/web.dom-collections.iterator"),d.exports=a},{"../es/get-iterator-method":41,"../modules/web.dom-collections.iterator":207}],212:[function(u,d,t){var a=u("../../es/instance/concat");d.exports=a},{"../../es/instance/concat":42}],213:[function(u,d,t){var a=u("../../es/instance/flags");d.exports=a},{"../../es/instance/flags":43}],214:[function(u,d,t){u("../../modules/web.dom-collections.iterator");var a=u("../../internals/classof"),c=u("../../internals/has-own-property"),i=u("../../internals/object-is-prototype-of"),l=u("../array/virtual/for-each"),D=Array.prototype,p={DOMTokenList:!0,NodeList:!0};d.exports=function(u){var d=u.forEach;return u===D||i(D,u)&&d===D.forEach||c(p,a(u))?l:d}},{"../../internals/classof":75,"../../internals/has-own-property":105,"../../internals/object-is-prototype-of":135,"../../modules/web.dom-collections.iterator":207,"../array/virtual/for-each":210}],215:[function(u,d,t){var a=u("../../es/instance/index-of");d.exports=a},{"../../es/instance/index-of":44}],216:[function(u,d,t){var a=u("../../es/instance/slice");d.exports=a},{"../../es/instance/slice":45}],217:[function(u,d,t){var a=u("../../es/instance/sort");d.exports=a},{"../../es/instance/sort":46}],218:[function(u,d,t){var a=u("../../es/object/create");d.exports=a},{"../../es/object/create":47}],219:[function(u,d,t){var a=u("../../es/object/define-property");d.exports=a},{"../../es/object/define-property":48}],220:[function(u,d,t){var a=u("../es/parse-int");d.exports=a},{"../es/parse-int":49}],221:[function(u,d,t){var a=u("../../es/symbol");u("../../modules/web.dom-collections.iterator"),d.exports=a},{"../../es/symbol":51,"../../modules/web.dom-collections.iterator":207}],222:[function(u,d,t){d.exports=[{name:"C",alias:"Other",isBmpLast:!0,bmp:"\0--Ÿ­͸͹΀-΃΋΍΢԰՗՘֋֌֐׈-׏׫-׮׵-؅؜۝܎܏݋݌޲-޿߻߼࠮࠯࠿࡜࡝࡟࡫-࡯࢏-ࢗ࣢঄঍঎঑঒঩঱঳-঵঺঻৅৆৉৊৏-৖৘-৛৞৤৥৿਀਄਋-਎਑਒਩਱਴਷਺਻਽੃-੆੉੊੎-੐੒-੘੝੟-੥੷-઀઄઎઒઩઱઴઺઻૆૊૎૏૑-૟૤૥૲-૸଀଄଍଎଑଒଩଱଴଺଻୅୆୉୊୎-୔୘-୛୞୤୥୸-஁஄஋-஍஑஖-஘஛஝஠-஢஥-஧஫-஭஺-஽௃-௅௉௎௏௑-௖௘-௥௻-௿఍఑఩఺఻౅౉౎-౔౗౛౜౞౟౤౥౰-౶಍಑಩಴಺಻೅೉೎-೔೗-೜೟೤೥೰ೳ-೿഍഑൅൉൐-൓൤൥඀඄඗-඙඲඼඾඿෇-෉෋-෎෕෗෠-෥෰෱෵-฀฻-฾๜-຀຃຅຋຤຦຾຿໅໇໎໏໚໛໠-໿཈཭-཰྘྽࿍࿛-࿿჆჈-჌჎჏቉቎቏቗቙቞቟኉኎኏኱኶኷኿዁዆዇዗጑጖጗፛፜፽-፿᎚-᎟᏶᏷᏾᏿᚝-᚟᛹-᛿᜖-᜞᜷-᜿᝔-᝟᝭᝱᝴-᝿៞៟៪-៯៺-៿᠎᠚-᠟᡹-᡿᢫-᢯᣶-᣿᤟᤬-᤯᤼-᤿᥁-᥃᥮᥯᥵-᥿᦬-᦯᧊-᧏᧛-᧝᨜᨝᩟᩽᩾᪊-᪏᪚-᪟᪮᪯᫏-᫿᭍-᭏᭿᯴-᯻᰸-᰺᱊-᱌Ᲊ-᲏᲻᲼᳈-᳏᳻-᳿἖἗἞἟὆὇὎὏὘὚὜὞὾὿᾵῅῔῕῜῰῱῵῿​-‏‪-‮⁠-⁲⁳₏₝-₟⃁-⃏⃱-⃿↌-↏␧-␿⑋-⑟⭴⭵⮖⳴-⳸⴦⴨-⴬⴮⴯⵨-⵮⵱-⵾⶗-⶟⶧⶯⶷⶿⷇⷏⷗⷟⹞-⹿⺚⻴-⻿⿖-⿯⿼-⿿぀゗゘㄀-㄄㄰㆏㇤-㇯㈟꒍-꒏꓇-꓏꘬-꘿꛸-꛿Ɤ-꟏꟒꟔Ꟛ-꟱꠭-꠯꠺-꠿꡸-꡿꣆-꣍꣚-꣟꥔-꥞꥽-꥿꧎꧚-꧝꧿꨷-꨿꩎꩏꩚꩛꫃-꫚꫷-꬀꬇꬈꬏꬐꬗-꬟꬧꬯꭬-꭯꯮꯯꯺-꯿힤-힯퟇-퟊퟼-﩮﩯﫚-﫿﬇-﬒﬘-﬜﬷﬽﬿﭂﭅﯃-﯒﶐﶑﷈-﷎﷐-﷯︚-︟﹓﹧﹬-﹯﹵﻽-＀﾿-￁￈￉￐￑￘￙￝-￟￧￯-￾￿",astral:"\ud800[\udc0c\udc27\udc3b\udc3e\udc4e\udc4f\udc5e-\udc7f\udcfb-\udcff\udd03-\udd06\udd34-\udd36\udd8f\udd9d-\udd9f\udda1-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udedf\udefc-\udeff\udf24-\udf2c\udf4b-\udf4f\udf7b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udcaf\udcd4-\udcd7\udcfc-\udcff\udd28-\udd2f\udd64-\udd6e\udd7b\udd8b\udd93\udd96\udda2\uddb2\uddba\uddbd-\uddff\udf37-\udf3f\udf56-\udf5f\udf68-\udf7f\udf86\udfb1\udfbb-\udfff]|\ud802[\udc06\udc07\udc09\udc36\udc39-\udc3b\udc3d\udc3e\udc56\udc9f-\udca6\udcb0-\udcdf\udcf3\udcf6-\udcfa\udd1c-\udd1e\udd3a-\udd3e\udd40-\udd7f\uddb8-\uddbb\uddd0\uddd1\ude04\ude07-\ude0b\ude14\ude18\ude36\ude37\ude3b-\ude3e\ude49-\ude4f\ude59-\ude5f\udea0-\udebf\udee7-\udeea\udef7-\udeff\udf36-\udf38\udf56\udf57\udf73-\udf77\udf92-\udf98\udf9d-\udfa8\udfb0-\udfff]|\ud803[\udc49-\udc7f\udcb3-\udcbf\udcf3-\udcf9\udd28-\udd2f\udd3a-\ude5f\ude7f\udeaa\udeae\udeaf\udeb2-\udeff\udf28-\udf2f\udf5a-\udf6f\udf8a-\udfaf\udfcc-\udfdf\udff7-\udfff]|\ud804[\udc4e-\udc51\udc76-\udc7e\udcbd\udcc3-\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd48-\udd4f\udd77-\udd7f\udde0\uddf5-\uddff\ude12\ude3f-\ude7f\ude87\ude89\ude8e\ude9e\udeaa-\udeaf\udeeb-\udeef\udefa-\udeff\udf04\udf0d\udf0e\udf11\udf12\udf29\udf31\udf34\udf3a\udf45\udf46\udf49\udf4a\udf4e\udf4f\udf51-\udf56\udf58-\udf5c\udf64\udf65\udf6d-\udf6f\udf75-\udfff]|\ud805[\udc5c\udc62-\udc7f\udcc8-\udccf\udcda-\udd7f\uddb6\uddb7\uddde-\uddff\ude45-\ude4f\ude5a-\ude5f\ude6d-\ude7f\udeba-\udebf\udeca-\udeff\udf1b\udf1c\udf2c-\udf2f\udf47-\udfff]|\ud806[\udc3c-\udc9f\udcf3-\udcfe\udd07\udd08\udd0a\udd0b\udd14\udd17\udd36\udd39\udd3a\udd47-\udd4f\udd5a-\udd9f\udda8\udda9\uddd8\uddd9\udde5-\uddff\ude48-\ude4f\udea3-\udeaf\udef9-\udfff]|\ud807[\udc09\udc37\udc46-\udc4f\udc6d-\udc6f\udc90\udc91\udca8\udcb7-\udcff\udd07\udd0a\udd37-\udd39\udd3b\udd3e\udd48-\udd4f\udd5a-\udd5f\udd66\udd69\udd8f\udd92\udd99-\udd9f\uddaa-\udedf\udef9-\udfaf\udfb1-\udfbf\udff2-\udffe]|\ud808[\udf9a-\udfff]|\ud809[\udc6f\udc75-\udc7f\udd44-\udfff]|[\ud80a\ud80e-\ud810\ud812-\ud819\ud824-\ud82a\ud82d\ud82e\ud830-\ud832\ud83f\ud87b-\ud87d\ud87f\ud885-\udb3f\udb41-\udbff][\udc00-\udfff]|\ud80b[\udc00-\udf8f\udff3-\udfff]|\ud80d[\udc2f-\udfff]|\ud811[\ude47-\udfff]|\ud81a[\ude39-\ude3f\ude5f\ude6a-\ude6d\udebf\udeca-\udecf\udeee\udeef\udef6-\udeff\udf46-\udf4f\udf5a\udf62\udf78-\udf7c\udf90-\udfff]|\ud81b[\udc00-\ude3f\ude9b-\udeff\udf4b-\udf4e\udf88-\udf8e\udfa0-\udfdf\udfe5-\udfef\udff2-\udfff]|\ud821[\udff8-\udfff]|\ud823[\udcd6-\udcff\udd09-\udfff]|\ud82b[\udc00-\udfef\udff4\udffc\udfff]|\ud82c[\udd23-\udd4f\udd53-\udd63\udd68-\udd6f\udefc-\udfff]|\ud82f[\udc6b-\udc6f\udc7d-\udc7f\udc89-\udc8f\udc9a\udc9b\udca0-\udfff]|\ud833[\udc00-\udeff\udf2e\udf2f\udf47-\udf4f\udfc4-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\udd73-\udd7a\uddeb-\uddff\ude46-\udedf\udef4-\udeff\udf57-\udf5f\udf79-\udfff]|\ud835[\udc55\udc9d\udca0\udca1\udca3\udca4\udca7\udca8\udcad\udcba\udcbc\udcc4\udd06\udd0b\udd0c\udd15\udd1d\udd3a\udd3f\udd45\udd47-\udd49\udd51\udea6\udea7\udfcc\udfcd]|\ud836[\ude8c-\ude9a\udea0\udeb0-\udfff]|\ud837[\udc00-\udeff\udf1f-\udfff]|\ud838[\udc07\udc19\udc1a\udc22\udc25\udc2b-\udcff\udd2d-\udd2f\udd3e\udd3f\udd4a-\udd4d\udd50-\ude8f\udeaf-\udebf\udefa-\udefe\udf00-\udfff]|\ud839[\udc00-\udfdf\udfe7\udfec\udfef\udfff]|\ud83a[\udcc5\udcc6\udcd7-\udcff\udd4c-\udd4f\udd5a-\udd5d\udd60-\udfff]|\ud83b[\udc00-\udc70\udcb5-\udd00\udd3e-\uddff\ude04\ude20\ude23\ude25\ude26\ude28\ude33\ude38\ude3a\ude3c-\ude41\ude43-\ude46\ude48\ude4a\ude4c\ude50\ude53\ude55\ude56\ude58\ude5a\ude5c\ude5e\ude60\ude63\ude65\ude66\ude6b\ude73\ude78\ude7d\ude7f\ude8a\ude9c-\udea0\udea4\udeaa\udebc-\udeef\udef2-\udfff]|\ud83c[\udc2c-\udc2f\udc94-\udc9f\udcaf\udcb0\udcc0\udcd0\udcf6-\udcff\uddae-\udde5\ude03-\ude0f\ude3c-\ude3f\ude49-\ude4f\ude52-\ude5f\ude66-\udeff]|\ud83d[\uded8-\udedc\udeed-\udeef\udefd-\udeff\udf74-\udf7f\udfd9-\udfdf\udfec-\udfef\udff1-\udfff]|\ud83e[\udc0c-\udc0f\udc48-\udc4f\udc5a-\udc5f\udc88-\udc8f\udcae\udcaf\udcb2-\udcff\ude54-\ude5f\ude6e\ude6f\ude75-\ude77\ude7d-\ude7f\ude87-\ude8f\udead-\udeaf\udebb-\udebf\udec6-\udecf\udeda-\udedf\udee8-\udeef\udef7-\udeff\udf93\udfcb-\udfef\udffa-\udfff]|\ud869[\udee0-\udeff]|\ud86d[\udf39-\udf3f]|\ud86e[\udc1e\udc1f]|\ud873[\udea2-\udeaf]|\ud87a[\udfe1-\udfff]|\ud87e[\ude1e-\udfff]|\ud884[\udf4b-\udfff]|\udb40[\udc00-\udcff\uddf0-\udfff]"},{name:"Cc",alias:"Control",bmp:"\0--Ÿ"},{name:"Cf",alias:"Format",bmp:"­؀-؅؜۝܏࢐࢑࣢᠎​-‏‪-‮⁠-⁤⁦-\ufeff-",astral:"\ud804[\udcbd\udccd]|\ud80d[\udc30-\udc38]|\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|\udb40[\udc01\udc20-\udc7f]"},{name:"Cn",alias:"Unassigned",bmp:"͸͹΀-΃΋΍΢԰՗՘֋֌֐׈-׏׫-׮׵-׿܎݋݌޲-޿߻߼࠮࠯࠿࡜࡝࡟࡫-࡯࢏࢒-ࢗ঄঍঎঑঒঩঱঳-঵঺঻৅৆৉৊৏-৖৘-৛৞৤৥৿਀਄਋-਎਑਒਩਱਴਷਺਻਽੃-੆੉੊੎-੐੒-੘੝੟-੥੷-઀઄઎઒઩઱઴઺઻૆૊૎૏૑-૟૤૥૲-૸଀଄଍଎଑଒଩଱଴଺଻୅୆୉୊୎-୔୘-୛୞୤୥୸-஁஄஋-஍஑஖-஘஛஝஠-஢஥-஧஫-஭஺-஽௃-௅௉௎௏௑-௖௘-௥௻-௿఍఑఩఺఻౅౉౎-౔౗౛౜౞౟౤౥౰-౶಍಑಩಴಺಻೅೉೎-೔೗-೜೟೤೥೰ೳ-೿഍഑൅൉൐-൓൤൥඀඄඗-඙඲඼඾඿෇-෉෋-෎෕෗෠-෥෰෱෵-฀฻-฾๜-຀຃຅຋຤຦຾຿໅໇໎໏໚໛໠-໿཈཭-཰྘྽࿍࿛-࿿჆჈-჌჎჏቉቎቏቗቙቞቟኉኎኏኱኶኷኿዁዆዇዗጑጖጗፛፜፽-፿᎚-᎟᏶᏷᏾᏿᚝-᚟᛹-᛿᜖-᜞᜷-᜿᝔-᝟᝭᝱᝴-᝿៞៟៪-៯៺-៿᠚-᠟᡹-᡿᢫-᢯᣶-᣿᤟᤬-᤯᤼-᤿᥁-᥃᥮᥯᥵-᥿᦬-᦯᧊-᧏᧛-᧝᨜᨝᩟᩽᩾᪊-᪏᪚-᪟᪮᪯᫏-᫿᭍-᭏᭿᯴-᯻᰸-᰺᱊-᱌Ᲊ-᲏᲻᲼᳈-᳏᳻-᳿἖἗἞἟὆὇὎὏὘὚὜὞὾὿᾵῅῔῕῜῰῱῵῿⁥⁲⁳₏₝-₟⃁-⃏⃱-⃿↌-↏␧-␿⑋-⑟⭴⭵⮖⳴-⳸⴦⴨-⴬⴮⴯⵨-⵮⵱-⵾⶗-⶟⶧⶯⶷⶿⷇⷏⷗⷟⹞-⹿⺚⻴-⻿⿖-⿯⿼-⿿぀゗゘㄀-㄄㄰㆏㇤-㇯㈟꒍-꒏꓇-꓏꘬-꘿꛸-꛿Ɤ-꟏꟒꟔Ꟛ-꟱꠭-꠯꠺-꠿꡸-꡿꣆-꣍꣚-꣟꥔-꥞꥽-꥿꧎꧚-꧝꧿꨷-꨿꩎꩏꩚꩛꫃-꫚꫷-꬀꬇꬈꬏꬐꬗-꬟꬧꬯꭬-꭯꯮꯯꯺-꯿힤-힯퟇-퟊퟼-퟿﩮﩯﫚-﫿﬇-﬒﬘-﬜﬷﬽﬿﭂﭅﯃-﯒﶐﶑﷈-﷎﷐-﷯︚-︟﹓﹧﹬-﹯﹵﻽﻾＀﾿-￁￈￉￐￑￘￙￝-￟￧￯-￸￾￿",astral:"\ud800[\udc0c\udc27\udc3b\udc3e\udc4e\udc4f\udc5e-\udc7f\udcfb-\udcff\udd03-\udd06\udd34-\udd36\udd8f\udd9d-\udd9f\udda1-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udedf\udefc-\udeff\udf24-\udf2c\udf4b-\udf4f\udf7b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udcaf\udcd4-\udcd7\udcfc-\udcff\udd28-\udd2f\udd64-\udd6e\udd7b\udd8b\udd93\udd96\udda2\uddb2\uddba\uddbd-\uddff\udf37-\udf3f\udf56-\udf5f\udf68-\udf7f\udf86\udfb1\udfbb-\udfff]|\ud802[\udc06\udc07\udc09\udc36\udc39-\udc3b\udc3d\udc3e\udc56\udc9f-\udca6\udcb0-\udcdf\udcf3\udcf6-\udcfa\udd1c-\udd1e\udd3a-\udd3e\udd40-\udd7f\uddb8-\uddbb\uddd0\uddd1\ude04\ude07-\ude0b\ude14\ude18\ude36\ude37\ude3b-\ude3e\ude49-\ude4f\ude59-\ude5f\udea0-\udebf\udee7-\udeea\udef7-\udeff\udf36-\udf38\udf56\udf57\udf73-\udf77\udf92-\udf98\udf9d-\udfa8\udfb0-\udfff]|\ud803[\udc49-\udc7f\udcb3-\udcbf\udcf3-\udcf9\udd28-\udd2f\udd3a-\ude5f\ude7f\udeaa\udeae\udeaf\udeb2-\udeff\udf28-\udf2f\udf5a-\udf6f\udf8a-\udfaf\udfcc-\udfdf\udff7-\udfff]|\ud804[\udc4e-\udc51\udc76-\udc7e\udcc3-\udccc\udcce\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd48-\udd4f\udd77-\udd7f\udde0\uddf5-\uddff\ude12\ude3f-\ude7f\ude87\ude89\ude8e\ude9e\udeaa-\udeaf\udeeb-\udeef\udefa-\udeff\udf04\udf0d\udf0e\udf11\udf12\udf29\udf31\udf34\udf3a\udf45\udf46\udf49\udf4a\udf4e\udf4f\udf51-\udf56\udf58-\udf5c\udf64\udf65\udf6d-\udf6f\udf75-\udfff]|\ud805[\udc5c\udc62-\udc7f\udcc8-\udccf\udcda-\udd7f\uddb6\uddb7\uddde-\uddff\ude45-\ude4f\ude5a-\ude5f\ude6d-\ude7f\udeba-\udebf\udeca-\udeff\udf1b\udf1c\udf2c-\udf2f\udf47-\udfff]|\ud806[\udc3c-\udc9f\udcf3-\udcfe\udd07\udd08\udd0a\udd0b\udd14\udd17\udd36\udd39\udd3a\udd47-\udd4f\udd5a-\udd9f\udda8\udda9\uddd8\uddd9\udde5-\uddff\ude48-\ude4f\udea3-\udeaf\udef9-\udfff]|\ud807[\udc09\udc37\udc46-\udc4f\udc6d-\udc6f\udc90\udc91\udca8\udcb7-\udcff\udd07\udd0a\udd37-\udd39\udd3b\udd3e\udd48-\udd4f\udd5a-\udd5f\udd66\udd69\udd8f\udd92\udd99-\udd9f\uddaa-\udedf\udef9-\udfaf\udfb1-\udfbf\udff2-\udffe]|\ud808[\udf9a-\udfff]|\ud809[\udc6f\udc75-\udc7f\udd44-\udfff]|[\ud80a\ud80e-\ud810\ud812-\ud819\ud824-\ud82a\ud82d\ud82e\ud830-\ud832\ud83f\ud87b-\ud87d\ud87f\ud885-\udb3f\udb41-\udb7f][\udc00-\udfff]|\ud80b[\udc00-\udf8f\udff3-\udfff]|\ud80d[\udc2f\udc39-\udfff]|\ud811[\ude47-\udfff]|\ud81a[\ude39-\ude3f\ude5f\ude6a-\ude6d\udebf\udeca-\udecf\udeee\udeef\udef6-\udeff\udf46-\udf4f\udf5a\udf62\udf78-\udf7c\udf90-\udfff]|\ud81b[\udc00-\ude3f\ude9b-\udeff\udf4b-\udf4e\udf88-\udf8e\udfa0-\udfdf\udfe5-\udfef\udff2-\udfff]|\ud821[\udff8-\udfff]|\ud823[\udcd6-\udcff\udd09-\udfff]|\ud82b[\udc00-\udfef\udff4\udffc\udfff]|\ud82c[\udd23-\udd4f\udd53-\udd63\udd68-\udd6f\udefc-\udfff]|\ud82f[\udc6b-\udc6f\udc7d-\udc7f\udc89-\udc8f\udc9a\udc9b\udca4-\udfff]|\ud833[\udc00-\udeff\udf2e\udf2f\udf47-\udf4f\udfc4-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\uddeb-\uddff\ude46-\udedf\udef4-\udeff\udf57-\udf5f\udf79-\udfff]|\ud835[\udc55\udc9d\udca0\udca1\udca3\udca4\udca7\udca8\udcad\udcba\udcbc\udcc4\udd06\udd0b\udd0c\udd15\udd1d\udd3a\udd3f\udd45\udd47-\udd49\udd51\udea6\udea7\udfcc\udfcd]|\ud836[\ude8c-\ude9a\udea0\udeb0-\udfff]|\ud837[\udc00-\udeff\udf1f-\udfff]|\ud838[\udc07\udc19\udc1a\udc22\udc25\udc2b-\udcff\udd2d-\udd2f\udd3e\udd3f\udd4a-\udd4d\udd50-\ude8f\udeaf-\udebf\udefa-\udefe\udf00-\udfff]|\ud839[\udc00-\udfdf\udfe7\udfec\udfef\udfff]|\ud83a[\udcc5\udcc6\udcd7-\udcff\udd4c-\udd4f\udd5a-\udd5d\udd60-\udfff]|\ud83b[\udc00-\udc70\udcb5-\udd00\udd3e-\uddff\ude04\ude20\ude23\ude25\ude26\ude28\ude33\ude38\ude3a\ude3c-\ude41\ude43-\ude46\ude48\ude4a\ude4c\ude50\ude53\ude55\ude56\ude58\ude5a\ude5c\ude5e\ude60\ude63\ude65\ude66\ude6b\ude73\ude78\ude7d\ude7f\ude8a\ude9c-\udea0\udea4\udeaa\udebc-\udeef\udef2-\udfff]|\ud83c[\udc2c-\udc2f\udc94-\udc9f\udcaf\udcb0\udcc0\udcd0\udcf6-\udcff\uddae-\udde5\ude03-\ude0f\ude3c-\ude3f\ude49-\ude4f\ude52-\ude5f\ude66-\udeff]|\ud83d[\uded8-\udedc\udeed-\udeef\udefd-\udeff\udf74-\udf7f\udfd9-\udfdf\udfec-\udfef\udff1-\udfff]|\ud83e[\udc0c-\udc0f\udc48-\udc4f\udc5a-\udc5f\udc88-\udc8f\udcae\udcaf\udcb2-\udcff\ude54-\ude5f\ude6e\ude6f\ude75-\ude77\ude7d-\ude7f\ude87-\ude8f\udead-\udeaf\udebb-\udebf\udec6-\udecf\udeda-\udedf\udee8-\udeef\udef7-\udeff\udf93\udfcb-\udfef\udffa-\udfff]|\ud869[\udee0-\udeff]|\ud86d[\udf39-\udf3f]|\ud86e[\udc1e\udc1f]|\ud873[\udea2-\udeaf]|\ud87a[\udfe1-\udfff]|\ud87e[\ude1e-\udfff]|\ud884[\udf4b-\udfff]|\udb40[\udc00\udc02-\udc1f\udc80-\udcff\uddf0-\udfff]|[\udbbf\udbff][\udffe\udfff]"},{name:"Co",alias:"Private_Use",bmp:"-",astral:"[\udb80-\udbbe\udbc0-\udbfe][\udc00-\udfff]|[\udbbf\udbff][\udc00-\udffd]"},{name:"Cs",alias:"Surrogate",bmp:"\ud800-\udfff"},{name:"L",alias:"Letter",bmp:"A-Za-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛱ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢄᢇ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々〆〱-〵〻〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛥꜗ-ꜟꜢ-ꞈꞋ-ꟊꟐꟑꟓꟕ-ꟙꟲ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf2d-\udf40\udf42-\udf49\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\udd70-\udd7a\udd7c-\udd8a\udd8c-\udd92\udd94\udd95\udd97-\udda1\udda3-\uddb1\uddb3-\uddb9\uddbb\uddbc\ude00-\udf36\udf40-\udf55\udf60-\udf67\udf80-\udf85\udf87-\udfb0\udfb2-\udfba]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude35\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2\udd00-\udd23\ude80-\udea9\udeb0\udeb1\udf00-\udf1c\udf27\udf30-\udf45\udf70-\udf81\udfb0-\udfc4\udfe0-\udff6]|\ud804[\udc03-\udc37\udc71\udc72\udc75\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd44\udd47\udd50-\udd72\udd76\udd83-\uddb2\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude2b\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udede\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d\udf50\udf5d-\udf61]|\ud805[\udc00-\udc34\udc47-\udc4a\udc5f-\udc61\udc80-\udcaf\udcc4\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udeb8\udf00-\udf1a\udf40-\udf46]|\ud806[\udc00-\udc2b\udca0-\udcdf\udcff-\udd06\udd09\udd0c-\udd13\udd15\udd16\udd18-\udd2f\udd3f\udd41\udda0-\udda7\uddaa-\uddd0\udde1\udde3\ude00\ude0b-\ude32\ude3a\ude50\ude5c-\ude89\ude9d\udeb0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f\udd00-\udd06\udd08\udd09\udd0b-\udd30\udd46\udd60-\udd65\udd67\udd68\udd6a-\udd89\udd98\udee0-\udef2\udfb0]|\ud808[\udc00-\udf99]|\ud809[\udc80-\udd43]|\ud80b[\udf90-\udff0]|[\ud80c\ud81c-\ud820\ud822\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872\ud874-\ud879\ud880-\ud883][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\ude70-\udebe\uded0-\udeed\udf00-\udf2f\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\ude40-\ude7f\udf00-\udf4a\udf50\udf93-\udf9f\udfe0\udfe1\udfe3]|\ud821[\udc00-\udff7]|\ud823[\udc00-\udcd5\udd00-\udd08]|\ud82b[\udff0-\udff3\udff5-\udffb\udffd\udffe]|\ud82c[\udc00-\udd22\udd50-\udd52\udd64-\udd67\udd70-\udefb]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud837[\udf00-\udf1e]|\ud838[\udd00-\udd2c\udd37-\udd3d\udd4e\ude90-\udead\udec0-\udeeb]|\ud839[\udfe0-\udfe6\udfe8-\udfeb\udfed\udfee\udff0-\udffe]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd4b]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud869[\udc00-\udedf\udf00-\udfff]|\ud86d[\udc00-\udf38\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1\udeb0-\udfff]|\ud87a[\udc00-\udfe0]|\ud87e[\udc00-\ude1d]|\ud884[\udc00-\udf4a]"},{name:"LC",alias:"Cased_Letter",bmp:"A-Za-zµÀ-ÖØ-öø-ƺƼ-ƿDŽ-ʓʕ-ʯͰ-ͳͶͷͻ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՠ-ֈႠ-ჅჇჍა-ჺჽ-ჿᎠ-Ᏽᏸ-ᏽᲀ-ᲈᲐ-ᲺᲽ-Ჿᴀ-ᴫᵫ-ᵷᵹ-ᶚḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℴℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-ⱻⱾ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭꙀ-ꙭꚀ-ꚛꜢ-ꝯꝱ-ꞇꞋ-ꞎꞐ-ꟊꟐꟑꟓꟕ-ꟙꟵꟶꟺꬰ-ꭚꭠ-ꭨꭰ-ꮿff-stﬓ-ﬗA-Za-z",astral:"\ud801[\udc00-\udc4f\udcb0-\udcd3\udcd8-\udcfb\udd70-\udd7a\udd7c-\udd8a\udd8c-\udd92\udd94\udd95\udd97-\udda1\udda3-\uddb1\uddb3-\uddb9\uddbb\uddbc]|\ud803[\udc80-\udcb2\udcc0-\udcf2]|\ud806[\udca0-\udcdf]|\ud81b[\ude40-\ude7f]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud837[\udf00-\udf09\udf0b-\udf1e]|\ud83a[\udd00-\udd43]"},{name:"Ll",alias:"Lowercase_Letter",bmp:"a-zµß-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżž-ƀƃƅƈƌƍƒƕƙ-ƛƞơƣƥƨƪƫƭưƴƶƹƺƽ-ƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳ-ȹȼȿɀɂɇɉɋɍɏ-ʓʕ-ʯͱͳͷͻ-ͽΐά-ώϐϑϕ-ϗϙϛϝϟϡϣϥϧϩϫϭϯ-ϳϵϸϻϼа-џѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӏӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹӻӽӿԁԃԅԇԉԋԍԏԑԓԕԗԙԛԝԟԡԣԥԧԩԫԭԯՠ-ֈა-ჺჽ-ჿᏸ-ᏽᲀ-ᲈᴀ-ᴫᵫ-ᵷᵹ-ᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕ-ẝẟạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹỻỽỿ-ἇἐ-ἕἠ-ἧἰ-ἷὀ-ὅὐ-ὗὠ-ὧὰ-ώᾀ-ᾇᾐ-ᾗᾠ-ᾧᾰ-ᾴᾶᾷιῂ-ῄῆῇῐ-ΐῖῗῠ-ῧῲ-ῴῶῷℊℎℏℓℯℴℹℼℽⅆ-ⅉⅎↄⰰ-ⱟⱡⱥⱦⱨⱪⱬⱱⱳⱴⱶ-ⱻⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⳬⳮⳳⴀ-ⴥⴧⴭꙁꙃꙅꙇꙉꙋꙍꙏꙑꙓꙕꙗꙙꙛꙝꙟꙡꙣꙥꙧꙩꙫꙭꚁꚃꚅꚇꚉꚋꚍꚏꚑꚓꚕꚗꚙꚛꜣꜥꜧꜩꜫꜭꜯ-ꜱꜳꜵꜷꜹꜻꜽꜿꝁꝃꝅꝇꝉꝋꝍꝏꝑꝓꝕꝗꝙꝛꝝꝟꝡꝣꝥꝧꝩꝫꝭꝯꝱ-ꝸꝺꝼꝿꞁꞃꞅꞇꞌꞎꞑꞓ-ꞕꞗꞙꞛꞝꞟꞡꞣꞥꞧꞩꞯꞵꞷꞹꞻꞽꞿꟁꟃꟈꟊꟑꟓꟕꟗꟙꟶꟺꬰ-ꭚꭠ-ꭨꭰ-ꮿff-stﬓ-ﬗa-z",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb\udd97-\udda1\udda3-\uddb1\uddb3-\uddb9\uddbb\uddbc]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud81b[\ude60-\ude7f]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud837[\udf00-\udf09\udf0b-\udf1e]|\ud83a[\udd22-\udd43]"},{name:"Lm",alias:"Modifier_Letter",bmp:"ʰ-ˁˆ-ˑˠ-ˤˬˮʹͺՙـۥۦߴߵߺࠚࠤࠨࣉॱๆໆჼៗᡃᪧᱸ-ᱽᴬ-ᵪᵸᶛ-ᶿⁱⁿₐ-ₜⱼⱽⵯⸯ々〱-〵〻ゝゞー-ヾꀕꓸ-ꓽꘌꙿꚜꚝꜗ-ꜟꝰꞈꟲ-ꟴꟸꟹꧏꧦꩰꫝꫳꫴꭜ-ꭟꭩー゙゚",astral:"\ud801[\udf80-\udf85\udf87-\udfb0\udfb2-\udfba]|\ud81a[\udf40-\udf43]|\ud81b[\udf93-\udf9f\udfe0\udfe1\udfe3]|\ud82b[\udff0-\udff3\udff5-\udffb\udffd\udffe]|\ud838[\udd37-\udd3d]|𞥋"},{name:"Lo",alias:"Other_Letter",bmp:"ªºƻǀ-ǃʔא-תׯ-ײؠ-ؿف-يٮٯٱ-ۓەۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪࠀ-ࠕࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣈऄ-हऽॐक़-ॡॲ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๅກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎᄀ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛱ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៜᠠ-ᡂᡄ-ᡸᢀ-ᢄᢇ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱷᳩ-ᳬᳮ-ᳳᳵᳶᳺℵ-ℸⴰ-ⵧⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ〆〼ぁ-ゖゟァ-ヺヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꀔꀖ-ꒌꓐ-ꓷꔀ-ꘋꘐ-ꘟꘪꘫꙮꚠ-ꛥꞏꟷꟻ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧠ-ꧤꧧ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩯꩱ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛꫜꫠ-ꫪꫲꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎יִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼヲ-ッア-ンᅠ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf2d-\udf40\udf42-\udf49\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud801[\udc50-\udc9d\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude35\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udd00-\udd23\ude80-\udea9\udeb0\udeb1\udf00-\udf1c\udf27\udf30-\udf45\udf70-\udf81\udfb0-\udfc4\udfe0-\udff6]|\ud804[\udc03-\udc37\udc71\udc72\udc75\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd44\udd47\udd50-\udd72\udd76\udd83-\uddb2\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude2b\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udede\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d\udf50\udf5d-\udf61]|\ud805[\udc00-\udc34\udc47-\udc4a\udc5f-\udc61\udc80-\udcaf\udcc4\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udeb8\udf00-\udf1a\udf40-\udf46]|\ud806[\udc00-\udc2b\udcff-\udd06\udd09\udd0c-\udd13\udd15\udd16\udd18-\udd2f\udd3f\udd41\udda0-\udda7\uddaa-\uddd0\udde1\udde3\ude00\ude0b-\ude32\ude3a\ude50\ude5c-\ude89\ude9d\udeb0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f\udd00-\udd06\udd08\udd09\udd0b-\udd30\udd46\udd60-\udd65\udd67\udd68\udd6a-\udd89\udd98\udee0-\udef2\udfb0]|\ud808[\udc00-\udf99]|\ud809[\udc80-\udd43]|\ud80b[\udf90-\udff0]|[\ud80c\ud81c-\ud820\ud822\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872\ud874-\ud879\ud880-\ud883][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\ude70-\udebe\uded0-\udeed\udf00-\udf2f\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf4a\udf50]|\ud821[\udc00-\udff7]|\ud823[\udc00-\udcd5\udd00-\udd08]|\ud82c[\udc00-\udd22\udd50-\udd52\udd64-\udd67\udd70-\udefb]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|𝼊|\ud838[\udd00-\udd2c\udd4e\ude90-\udead\udec0-\udeeb]|\ud839[\udfe0-\udfe6\udfe8-\udfeb\udfed\udfee\udff0-\udffe]|\ud83a[\udc00-\udcc4]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud869[\udc00-\udedf\udf00-\udfff]|\ud86d[\udc00-\udf38\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1\udeb0-\udfff]|\ud87a[\udc00-\udfe0]|\ud87e[\udc00-\ude1d]|\ud884[\udc00-\udf4a]"},{name:"Lt",alias:"Titlecase_Letter",bmp:"DžLjNjDzᾈ-ᾏᾘ-ᾟᾨ-ᾯᾼῌῼ"},{name:"Lu",alias:"Uppercase_Letter",bmp:"A-ZÀ-ÖØ-ÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉ-ƋƎ-ƑƓƔƖ-ƘƜƝƟƠƢƤƦƧƩƬƮƯƱ-ƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶ-ǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁɃ-ɆɈɊɌɎͰͲͶͿΆΈ-ΊΌΎΏΑ-ΡΣ-ΫϏϒ-ϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽ-ЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸӺӼӾԀԂԄԆԈԊԌԎԐԒԔԖԘԚԜԞԠԢԤԦԨԪԬԮԱ-ՖႠ-ჅჇჍᎠ-ᏵᲐ-ᲺᲽ-ᲿḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẞẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸỺỼỾἈ-ἏἘ-ἝἨ-ἯἸ-ἿὈ-ὍὙὛὝὟὨ-ὯᾸ-ΆῈ-ΉῘ-ΊῨ-ῬῸ-Ώℂℇℋ-ℍℐ-ℒℕℙ-ℝℤΩℨK-ℭℰ-ℳℾℿⅅↃⰀ-ⰯⱠⱢ-ⱤⱧⱩⱫⱭ-ⱰⱲⱵⱾ-ⲀⲂⲄⲆⲈⲊⲌⲎⲐⲒⲔⲖⲘⲚⲜⲞⲠⲢⲤⲦⲨⲪⲬⲮⲰⲲⲴⲶⲸⲺⲼⲾⳀⳂⳄⳆⳈⳊⳌⳎⳐⳒⳔⳖⳘⳚⳜⳞⳠⳢⳫⳭⳲꙀꙂꙄꙆꙈꙊꙌꙎꙐꙒꙔꙖꙘꙚꙜꙞꙠꙢꙤꙦꙨꙪꙬꚀꚂꚄꚆꚈꚊꚌꚎꚐꚒꚔꚖꚘꚚꜢꜤꜦꜨꜪꜬꜮꜲꜴꜶꜸꜺꜼꜾꝀꝂꝄꝆꝈꝊꝌꝎꝐꝒꝔꝖꝘꝚꝜꝞꝠꝢꝤꝦꝨꝪꝬꝮꝹꝻꝽꝾꞀꞂꞄꞆꞋꞍꞐꞒꞖꞘꞚꞜꞞꞠꞢꞤꞦꞨꞪ-ꞮꞰ-ꞴꞶꞸꞺꞼꞾꟀꟂꟄ-ꟇꟉꟐꟖꟘꟵA-Z",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3\udd70-\udd7a\udd7c-\udd8a\udd8c-\udd92\udd94\udd95]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud81b[\ude40-\ude5f]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]"},{name:"M",alias:"Mark",bmp:"̀-ͯ҃-҉֑-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣඁ-ඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍᠏ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-ᫎᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿⃐-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯-꙲ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯",astral:"\ud800[\uddfd\udee0\udf76-\udf7a]|\ud802[\ude01-\ude03\ude05\ude06\ude0c-\ude0f\ude38-\ude3a\ude3f\udee5\udee6]|\ud803[\udd24-\udd27\udeab\udeac\udf46-\udf50\udf82-\udf85]|\ud804[\udc00-\udc02\udc38-\udc46\udc70\udc73\udc74\udc7f-\udc82\udcb0-\udcba\udcc2\udd00-\udd02\udd27-\udd34\udd45\udd46\udd73\udd80-\udd82\uddb3-\uddc0\uddc9-\uddcc\uddce\uddcf\ude2c-\ude37\ude3e\udedf-\udeea\udf00-\udf03\udf3b\udf3c\udf3e-\udf44\udf47\udf48\udf4b-\udf4d\udf57\udf62\udf63\udf66-\udf6c\udf70-\udf74]|\ud805[\udc35-\udc46\udc5e\udcb0-\udcc3\uddaf-\uddb5\uddb8-\uddc0\udddc\udddd\ude30-\ude40\udeab-\udeb7\udf1d-\udf2b]|\ud806[\udc2c-\udc3a\udd30-\udd35\udd37\udd38\udd3b-\udd3e\udd40\udd42\udd43\uddd1-\uddd7\uddda-\udde0\udde4\ude01-\ude0a\ude33-\ude39\ude3b-\ude3e\ude47\ude51-\ude5b\ude8a-\ude99]|\ud807[\udc2f-\udc36\udc38-\udc3f\udc92-\udca7\udca9-\udcb6\udd31-\udd36\udd3a\udd3c\udd3d\udd3f-\udd45\udd47\udd8a-\udd8e\udd90\udd91\udd93-\udd97\udef3-\udef6]|\ud81a[\udef0-\udef4\udf30-\udf36]|\ud81b[\udf4f\udf51-\udf87\udf8f-\udf92\udfe4\udff0\udff1]|\ud82f[\udc9d\udc9e]|\ud833[\udf00-\udf2d\udf30-\udf46]|\ud834[\udd65-\udd69\udd6d-\udd72\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud836[\ude00-\ude36\ude3b-\ude6c\ude75\ude84\ude9b-\ude9f\udea1-\udeaf]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a\udd30-\udd36\udeae\udeec-\udeef]|\ud83a[\udcd0-\udcd6\udd44-\udd4a]|\udb40[\udd00-\uddef]"},{name:"Mc",alias:"Spacing_Mark",bmp:"ःऻा-ीॉ-ौॎॏংঃা-ীেৈোৌৗਃਾ-ੀઃા-ીૉોૌଂଃାୀେୈୋୌୗாிுூெ-ைொ-ௌௗఁ-ఃు-ౄಂಃಾೀ-ೄೇೈೊೋೕೖംഃാ-ീെ-ൈൊ-ൌൗංඃා-ෑෘ-ෟෲෳ༾༿ཿါာေးျြၖၗၢ-ၤၧ-ၭႃႄႇ-ႌႏႚ-ႜ᜕᜴ាើ-ៅះៈᤣ-ᤦᤩ-ᤫᤰᤱᤳ-ᤸᨙᨚᩕᩗᩡᩣᩤᩭ-ᩲᬄᬵᬻᬽ-ᭁᭃ᭄ᮂᮡᮦᮧ᮪ᯧᯪ-ᯬᯮ᯲᯳ᰤ-ᰫᰴᰵ᳡᳷〮〯ꠣꠤꠧꢀꢁꢴ-ꣃꥒ꥓ꦃꦴꦵꦺꦻꦾ-꧀ꨯꨰꨳꨴꩍꩻꩽꫫꫮꫯꫵꯣꯤꯦꯧꯩꯪ꯬",astral:"\ud804[\udc00\udc02\udc82\udcb0-\udcb2\udcb7\udcb8\udd2c\udd45\udd46\udd82\uddb3-\uddb5\uddbf\uddc0\uddce\ude2c-\ude2e\ude32\ude33\ude35\udee0-\udee2\udf02\udf03\udf3e\udf3f\udf41-\udf44\udf47\udf48\udf4b-\udf4d\udf57\udf62\udf63]|\ud805[\udc35-\udc37\udc40\udc41\udc45\udcb0-\udcb2\udcb9\udcbb-\udcbe\udcc1\uddaf-\uddb1\uddb8-\uddbb\uddbe\ude30-\ude32\ude3b\ude3c\ude3e\udeac\udeae\udeaf\udeb6\udf20\udf21\udf26]|\ud806[\udc2c-\udc2e\udc38\udd30-\udd35\udd37\udd38\udd3d\udd40\udd42\uddd1-\uddd3\udddc-\udddf\udde4\ude39\ude57\ude58\ude97]|\ud807[\udc2f\udc3e\udca9\udcb1\udcb4\udd8a-\udd8e\udd93\udd94\udd96\udef5\udef6]|\ud81b[\udf51-\udf87\udff0\udff1]|\ud834[\udd65\udd66\udd6d-\udd72]"},{name:"Me",alias:"Enclosing_Mark",bmp:"҈҉᪾⃝-⃠⃢-⃤꙰-꙲"},{name:"Mn",alias:"Nonspacing_Mark",bmp:"̀-ͯ҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ंऺ़ु-ै्॑-ॗॢॣঁ়ু-ৄ্ৢৣ৾ਁਂ਼ੁੂੇੈੋ-੍ੑੰੱੵઁં઼ુ-ૅેૈ્ૢૣૺ-૿ଁ଼ିୁ-ୄ୍୕ୖୢୣஂீ்ఀఄ఼ా-ీె-ైొ-్ౕౖౢౣಁ಼ಿೆೌ್ೢೣഀഁ഻഼ു-ൄ്ൢൣඁ්ි-ුූัิ-ฺ็-๎ັິ-ຼ່-ໍཱ༹༘༙༵༷-ཾྀ-྄྆྇ྍ-ྗྙ-ྼ࿆ိ-ူဲ-့္်ွှၘၙၞ-ၠၱ-ၴႂႅႆႍႝ፝-፟ᜒ-᜔ᜲᜳᝒᝓᝲᝳ឴឵ិ-ួំ៉-៓៝᠋-᠍᠏ᢅᢆᢩᤠ-ᤢᤧᤨᤲ᤹-᤻ᨘᨗᨛᩖᩘ-ᩞ᩠ᩢᩥ-ᩬᩳ-᩿᩼᪰-᪽ᪿ-ᫎᬀ-ᬃ᬴ᬶ-ᬺᬼᭂ᭫-᭳ᮀᮁᮢ-ᮥᮨᮩ᮫-ᮭ᯦ᯨᯩᯭᯯ-ᯱᰬ-ᰳᰶ᰷᳐-᳔᳒-᳢᳠-᳨᳭᳴᳸᳹᷀-᷿⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〭꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠥꠦ꠬꣄ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-ꥑꦀ-ꦂ꦳ꦶ-ꦹꦼꦽꧥꨩ-ꨮꨱꨲꨵꨶꩃꩌꩼꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫬꫭ꫶ꯥꯨ꯭ﬞ︀-️︠-︯",astral:"\ud800[\uddfd\udee0\udf76-\udf7a]|\ud802[\ude01-\ude03\ude05\ude06\ude0c-\ude0f\ude38-\ude3a\ude3f\udee5\udee6]|\ud803[\udd24-\udd27\udeab\udeac\udf46-\udf50\udf82-\udf85]|\ud804[\udc01\udc38-\udc46\udc70\udc73\udc74\udc7f-\udc81\udcb3-\udcb6\udcb9\udcba\udcc2\udd00-\udd02\udd27-\udd2b\udd2d-\udd34\udd73\udd80\udd81\uddb6-\uddbe\uddc9-\uddcc\uddcf\ude2f-\ude31\ude34\ude36\ude37\ude3e\udedf\udee3-\udeea\udf00\udf01\udf3b\udf3c\udf40\udf66-\udf6c\udf70-\udf74]|\ud805[\udc38-\udc3f\udc42-\udc44\udc46\udc5e\udcb3-\udcb8\udcba\udcbf\udcc0\udcc2\udcc3\uddb2-\uddb5\uddbc\uddbd\uddbf\uddc0\udddc\udddd\ude33-\ude3a\ude3d\ude3f\ude40\udeab\udead\udeb0-\udeb5\udeb7\udf1d-\udf1f\udf22-\udf25\udf27-\udf2b]|\ud806[\udc2f-\udc37\udc39\udc3a\udd3b\udd3c\udd3e\udd43\uddd4-\uddd7\uddda\udddb\udde0\ude01-\ude0a\ude33-\ude38\ude3b-\ude3e\ude47\ude51-\ude56\ude59-\ude5b\ude8a-\ude96\ude98\ude99]|\ud807[\udc30-\udc36\udc38-\udc3d\udc3f\udc92-\udca7\udcaa-\udcb0\udcb2\udcb3\udcb5\udcb6\udd31-\udd36\udd3a\udd3c\udd3d\udd3f-\udd45\udd47\udd90\udd91\udd95\udd97\udef3\udef4]|\ud81a[\udef0-\udef4\udf30-\udf36]|\ud81b[\udf4f\udf8f-\udf92\udfe4]|\ud82f[\udc9d\udc9e]|\ud833[\udf00-\udf2d\udf30-\udf46]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud836[\ude00-\ude36\ude3b-\ude6c\ude75\ude84\ude9b-\ude9f\udea1-\udeaf]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a\udd30-\udd36\udeae\udeec-\udeef]|\ud83a[\udcd0-\udcd6\udd44-\udd4a]|\udb40[\udd00-\uddef]"},{name:"N",alias:"Number",bmp:"0-9²³¹¼-¾٠-٩۰-۹߀-߉०-९০-৯৴-৹੦-੯૦-૯୦-୯୲-୷௦-௲౦-౯౸-౾೦-೯൘-൞൦-൸෦-෯๐-๙໐-໙༠-༳၀-၉႐-႙፩-፼ᛮ-ᛰ០-៩៰-៹᠐-᠙᥆-᥏᧐-᧚᪀-᪉᪐-᪙᭐-᭙᮰-᮹᱀-᱉᱐-᱙⁰⁴-⁹₀-₉⅐-ↂↅ-↉①-⒛⓪-⓿❶-➓⳽〇〡-〩〸-〺㆒-㆕㈠-㈩㉈-㉏㉑-㉟㊀-㊉㊱-㊿꘠-꘩ꛦ-ꛯ꠰-꠵꣐-꣙꤀-꤉꧐-꧙꧰-꧹꩐-꩙꯰-꯹0-9",astral:"\ud800[\udd07-\udd33\udd40-\udd78\udd8a\udd8b\udee1-\udefb\udf20-\udf23\udf41\udf4a\udfd1-\udfd5]|\ud801[\udca0-\udca9]|\ud802[\udc58-\udc5f\udc79-\udc7f\udca7-\udcaf\udcfb-\udcff\udd16-\udd1b\uddbc\uddbd\uddc0-\uddcf\uddd2-\uddff\ude40-\ude48\ude7d\ude7e\ude9d-\ude9f\udeeb-\udeef\udf58-\udf5f\udf78-\udf7f\udfa9-\udfaf]|\ud803[\udcfa-\udcff\udd30-\udd39\ude60-\ude7e\udf1d-\udf26\udf51-\udf54\udfc5-\udfcb]|\ud804[\udc52-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9\udde1-\uddf4\udef0-\udef9]|\ud805[\udc50-\udc59\udcd0-\udcd9\ude50-\ude59\udec0-\udec9\udf30-\udf3b]|\ud806[\udce0-\udcf2\udd50-\udd59]|\ud807[\udc50-\udc6c\udd50-\udd59\udda0-\udda9\udfc0-\udfd4]|\ud809[\udc00-\udc6e]|\ud81a[\ude60-\ude69\udec0-\udec9\udf50-\udf59\udf5b-\udf61]|\ud81b[\ude80-\ude96]|\ud834[\udee0-\udef3\udf60-\udf78]|\ud835[\udfce-\udfff]|\ud838[\udd40-\udd49\udef0-\udef9]|\ud83a[\udcc7-\udccf\udd50-\udd59]|\ud83b[\udc71-\udcab\udcad-\udcaf\udcb1-\udcb4\udd01-\udd2d\udd2f-\udd3d]|\ud83c[\udd00-\udd0c]|\ud83e[\udff0-\udff9]"},{name:"Nd",alias:"Decimal_Number",bmp:"0-9٠-٩۰-۹߀-߉०-९০-৯੦-੯૦-૯୦-୯௦-௯౦-౯೦-೯൦-൯෦-෯๐-๙໐-໙༠-༩၀-၉႐-႙០-៩᠐-᠙᥆-᥏᧐-᧙᪀-᪉᪐-᪙᭐-᭙᮰-᮹᱀-᱉᱐-᱙꘠-꘩꣐-꣙꤀-꤉꧐-꧙꧰-꧹꩐-꩙꯰-꯹0-9",astral:"\ud801[\udca0-\udca9]|\ud803[\udd30-\udd39]|\ud804[\udc66-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9\udef0-\udef9]|\ud805[\udc50-\udc59\udcd0-\udcd9\ude50-\ude59\udec0-\udec9\udf30-\udf39]|\ud806[\udce0-\udce9\udd50-\udd59]|\ud807[\udc50-\udc59\udd50-\udd59\udda0-\udda9]|\ud81a[\ude60-\ude69\udec0-\udec9\udf50-\udf59]|\ud835[\udfce-\udfff]|\ud838[\udd40-\udd49\udef0-\udef9]|\ud83a[\udd50-\udd59]|\ud83e[\udff0-\udff9]"},{name:"Nl",alias:"Letter_Number",bmp:"ᛮ-ᛰⅠ-ↂↅ-ↈ〇〡-〩〸-〺ꛦ-ꛯ",astral:"\ud800[\udd40-\udd74\udf41\udf4a\udfd1-\udfd5]|\ud809[\udc00-\udc6e]"},{name:"No",alias:"Other_Number",bmp:"²³¹¼-¾৴-৹୲-୷௰-௲౸-౾൘-൞൰-൸༪-༳፩-፼៰-៹᧚⁰⁴-⁹₀-₉⅐-⅟↉①-⒛⓪-⓿❶-➓⳽㆒-㆕㈠-㈩㉈-㉏㉑-㉟㊀-㊉㊱-㊿꠰-꠵",astral:"\ud800[\udd07-\udd33\udd75-\udd78\udd8a\udd8b\udee1-\udefb\udf20-\udf23]|\ud802[\udc58-\udc5f\udc79-\udc7f\udca7-\udcaf\udcfb-\udcff\udd16-\udd1b\uddbc\uddbd\uddc0-\uddcf\uddd2-\uddff\ude40-\ude48\ude7d\ude7e\ude9d-\ude9f\udeeb-\udeef\udf58-\udf5f\udf78-\udf7f\udfa9-\udfaf]|\ud803[\udcfa-\udcff\ude60-\ude7e\udf1d-\udf26\udf51-\udf54\udfc5-\udfcb]|\ud804[\udc52-\udc65\udde1-\uddf4]|\ud805[\udf3a\udf3b]|\ud806[\udcea-\udcf2]|\ud807[\udc5a-\udc6c\udfc0-\udfd4]|\ud81a[\udf5b-\udf61]|\ud81b[\ude80-\ude96]|\ud834[\udee0-\udef3\udf60-\udf78]|\ud83a[\udcc7-\udccf]|\ud83b[\udc71-\udcab\udcad-\udcaf\udcb1-\udcb4\udd01-\udd2d\udd2f-\udd3d]|\ud83c[\udd00-\udd0c]"},{name:"P",alias:"Punctuation",bmp:"!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}¡§«¶·»¿;·՚-՟։֊־׀׃׆׳״؉؊،؍؛؝-؟٪-٭۔܀-܍߷-߹࠰-࠾࡞।॥॰৽੶૰౷಄෴๏๚๛༄-༒༔༺-༽྅࿐-࿔࿙࿚၊-၏჻፠-፨᐀᙮᚛᚜᛫-᛭᜵᜶។-៖៘-៚᠀-᠊᥄᥅᨞᨟᪠-᪦᪨-᪭᭚-᭠᭽᭾᯼-᯿᰻-᰿᱾᱿᳀-᳇᳓‐-‧‰-⁃⁅-⁑⁓-⁞⁽⁾₍₎⌈-⌋〈〉❨-❵⟅⟆⟦-⟯⦃-⦘⧘-⧛⧼⧽⳹-⳼⳾⳿⵰⸀-⸮⸰-⹏⹒-⹝、-〃〈-】〔-〟〰〽゠・꓾꓿꘍-꘏꙳꙾꛲-꛷꡴-꡷꣎꣏꣸-꣺꣼꤮꤯꥟꧁-꧍꧞꧟꩜-꩟꫞꫟꫰꫱꯫﴾﴿︐-︙︰-﹒﹔-﹡﹣﹨﹪﹫!-#%-*,-/:;?@[-]_{}⦅-・",astral:"\ud800[\udd00-\udd02\udf9f\udfd0]|𐕯|\ud802[\udc57\udd1f\udd3f\ude50-\ude58\ude7f\udef0-\udef6\udf39-\udf3f\udf99-\udf9c]|\ud803[\udead\udf55-\udf59\udf86-\udf89]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\udd74\udd75\uddc5-\uddc8\uddcd\udddb\udddd-\udddf\ude38-\ude3d\udea9]|\ud805[\udc4b-\udc4f\udc5a\udc5b\udc5d\udcc6\uddc1-\uddd7\ude41-\ude43\ude60-\ude6c\udeb9\udf3c-\udf3e]|\ud806[\udc3b\udd44-\udd46\udde2\ude3f-\ude46\ude9a-\ude9c\ude9e-\udea2]|\ud807[\udc41-\udc45\udc70\udc71\udef7\udef8\udfff]|\ud809[\udc70-\udc74]|\ud80b[\udff1\udff2]|\ud81a[\ude6e\ude6f\udef5\udf37-\udf3b\udf44]|\ud81b[\ude97-\ude9a\udfe2]|𛲟|\ud836[\ude87-\ude8b]|\ud83a[\udd5e\udd5f]"},{name:"Pc",alias:"Connector_Punctuation",bmp:"_‿⁀⁔︳︴﹍-﹏_"},{name:"Pd",alias:"Dash_Punctuation",bmp:"\\-֊־᐀᠆‐-―⸗⸚⸺⸻⹀⹝〜〰゠︱︲﹘﹣-",astral:"𐺭"},{name:"Pe",alias:"Close_Punctuation",bmp:"\\)\\]\\}༻༽᚜⁆⁾₎⌉⌋〉❩❫❭❯❱❳❵⟆⟧⟩⟫⟭⟯⦄⦆⦈⦊⦌⦎⦐⦒⦔⦖⦘⧙⧛⧽⸣⸥⸧⸩⹖⹘⹚⹜〉》」』】〕〗〙〛〞〟﴾︘︶︸︺︼︾﹀﹂﹄﹈﹚﹜﹞)]}⦆」"},{name:"Pf",alias:"Final_Punctuation",bmp:"»’”›⸃⸅⸊⸍⸝⸡"},{name:"Pi",alias:"Initial_Punctuation",bmp:"«‘‛“‟‹⸂⸄⸉⸌⸜⸠"},{name:"Po",alias:"Other_Punctuation",bmp:"!-#%-'\\*,\\.\\/:;\\?@\\¡§¶·¿;·՚-՟։׀׃׆׳״؉؊،؍؛؝-؟٪-٭۔܀-܍߷-߹࠰-࠾࡞।॥॰৽੶૰౷಄෴๏๚๛༄-༒༔྅࿐-࿔࿙࿚၊-၏჻፠-፨᙮᛫-᛭᜵᜶។-៖៘-៚᠀-᠅᠇-᠊᥄᥅᨞᨟᪠-᪦᪨-᪭᭚-᭠᭽᭾᯼-᯿᰻-᰿᱾᱿᳀-᳇᳓‖‗†-‧‰-‸※-‾⁁-⁃⁇-⁑⁓⁕-⁞⳹-⳼⳾⳿⵰⸀⸁⸆-⸈⸋⸎-⸖⸘⸙⸛⸞⸟⸪-⸮⸰-⸹⸼-⸿⹁⹃-⹏⹒-⹔、-〃〽・꓾꓿꘍-꘏꙳꙾꛲-꛷꡴-꡷꣎꣏꣸-꣺꣼꤮꤯꥟꧁-꧍꧞꧟꩜-꩟꫞꫟꫰꫱꯫︐-︖︙︰﹅﹆﹉-﹌﹐-﹒﹔-﹗﹟-﹡﹨﹪﹫!-#%-'*,./:;?@\。、・",astral:"\ud800[\udd00-\udd02\udf9f\udfd0]|𐕯|\ud802[\udc57\udd1f\udd3f\ude50-\ude58\ude7f\udef0-\udef6\udf39-\udf3f\udf99-\udf9c]|\ud803[\udf55-\udf59\udf86-\udf89]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\udd74\udd75\uddc5-\uddc8\uddcd\udddb\udddd-\udddf\ude38-\ude3d\udea9]|\ud805[\udc4b-\udc4f\udc5a\udc5b\udc5d\udcc6\uddc1-\uddd7\ude41-\ude43\ude60-\ude6c\udeb9\udf3c-\udf3e]|\ud806[\udc3b\udd44-\udd46\udde2\ude3f-\ude46\ude9a-\ude9c\ude9e-\udea2]|\ud807[\udc41-\udc45\udc70\udc71\udef7\udef8\udfff]|\ud809[\udc70-\udc74]|\ud80b[\udff1\udff2]|\ud81a[\ude6e\ude6f\udef5\udf37-\udf3b\udf44]|\ud81b[\ude97-\ude9a\udfe2]|𛲟|\ud836[\ude87-\ude8b]|\ud83a[\udd5e\udd5f]"},{name:"Ps",alias:"Open_Punctuation",bmp:"\\(\\[\\{༺༼᚛‚„⁅⁽₍⌈⌊〈❨❪❬❮❰❲❴⟅⟦⟨⟪⟬⟮⦃⦅⦇⦉⦋⦍⦏⦑⦓⦕⦗⧘⧚⧼⸢⸤⸦⸨⹂⹕⹗⹙⹛〈《「『【〔〖〘〚〝﴿︗︵︷︹︻︽︿﹁﹃﹇﹙﹛﹝([{⦅「"},{name:"S",alias:"Symbol",bmp:"\\$\\+<->\\^`\\|~¢-¦¨©¬®-±´¸×÷˂-˅˒-˟˥-˫˭˯-˿͵΄΅϶҂֍-֏؆-؈؋؎؏۞۩۽۾߶߾߿࢈৲৳৺৻૱୰௳-௺౿൏൹฿༁-༃༓༕-༗༚-༟༴༶༸྾-࿅࿇-࿌࿎࿏࿕-࿘႞႟᎐-᎙᙭៛᥀᧞-᧿᭡-᭪᭴-᭼᾽᾿-῁῍-῏῝-῟῭-`´῾⁄⁒⁺-⁼₊-₌₠-⃀℀℁℃-℆℈℉℔№-℘℞-℣℥℧℩℮℺℻⅀-⅄⅊-⅍⅏↊↋←-⌇⌌-⌨⌫-␦⑀-⑊⒜-ⓩ─-❧➔-⟄⟇-⟥⟰-⦂⦙-⧗⧜-⧻⧾-⭳⭶-⮕⮗-⯿⳥-⳪⹐⹑⺀-⺙⺛-⻳⼀-⿕⿰-⿻〄〒〓〠〶〷〾〿゛゜㆐㆑㆖-㆟㇀-㇣㈀-㈞㈪-㉇㉐㉠-㉿㊊-㊰㋀-㏿䷀-䷿꒐-꓆꜀-꜖꜠꜡꞉꞊꠨-꠫꠶-꠹꩷-꩹꭛꭪꭫﬩﮲-﯂﵀-﵏﷏﷼-﷿﹢﹤-﹦﹩$+<->^`|~¢-₩│-○�",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9c\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|𑜿|\ud807[\udfd5-\udff1]|\ud81a[\udf3c-\udf3f\udf45]|𛲜|\ud833[\udf50-\udfc3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\uddea\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud838[\udd4f\udeff]|\ud83b[\udcac\udcb0\udd2e\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd0d-\uddad\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\ude60-\ude65\udf00-\udfff]|\ud83d[\udc00-\uded7\udedd-\udeec\udef0-\udefc\udf00-\udf73\udf80-\udfd8\udfe0-\udfeb\udff0]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udcb0\udcb1\udd00-\ude53\ude60-\ude6d\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec5\uded0-\uded9\udee0-\udee7\udef0-\udef6\udf00-\udf92\udf94-\udfca]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\$¢-¥֏؋߾߿৲৳৻૱௹฿៛₠-⃀꠸﷼﹩$¢£¥₩",astral:"\ud807[\udfdd-\udfe0]|𞋿|𞲰"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\^`¨¯´¸˂-˅˒-˟˥-˫˭˯-˿͵΄΅࢈᾽᾿-῁῍-῏῝-῟῭-`´῾゛゜꜀-꜖꜠꜡꞉꞊꭛꭪꭫﮲-﯂^` ̄",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\+<->\\|~¬±×÷϶؆-؈⁄⁒⁺-⁼₊-₌℘⅀-⅄⅋←-↔↚↛↠↣↦↮⇎⇏⇒⇔⇴-⋿⌠⌡⍼⎛-⎳⏜-⏡▷◁◸-◿♯⟀-⟄⟇-⟥⟰-⟿⤀-⦂⦙-⧗⧜-⧻⧾-⫿⬰-⭄⭇-⭌﬩﹢﹤-﹦+<->|~¬←-↓",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"¦©®°҂֍֎؎؏۞۩۽۾߶৺୰௳-௸௺౿൏൹༁-༃༓༕-༗༚-༟༴༶༸྾-࿅࿇-࿌࿎࿏࿕-࿘႞႟᎐-᎙᙭᥀᧞-᧿᭡-᭪᭴-᭼℀℁℃-℆℈℉℔№℗℞-℣℥℧℩℮℺℻⅊⅌⅍⅏↊↋↕-↙↜-↟↡↢↤↥↧-↭↯-⇍⇐⇑⇓⇕-⇳⌀-⌇⌌-⌟⌢-⌨⌫-⍻⍽-⎚⎴-⏛⏢-␦⑀-⑊⒜-ⓩ─-▶▸-◀◂-◷☀-♮♰-❧➔-➿⠀-⣿⬀-⬯⭅⭆⭍-⭳⭶-⮕⮗-⯿⳥-⳪⹐⹑⺀-⺙⺛-⻳⼀-⿕⿰-⿻〄〒〓〠〶〷〾〿㆐㆑㆖-㆟㇀-㇣㈀-㈞㈪-㉇㉐㉠-㉿㊊-㊰㋀-㏿䷀-䷿꒐-꓆꠨-꠫꠶꠷꠹꩷-꩹﵀-﵏﷏﷽-﷿¦│■○�",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9c\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|𑜿|\ud807[\udfd5-\udfdc\udfe1-\udff1]|\ud81a[\udf3c-\udf3f\udf45]|𛲜|\ud833[\udf50-\udfc3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\uddea\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|𞅏|\ud83b[\udcac\udd2e]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd0d-\uddad\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\ude60-\ude65\udf00-\udffa]|\ud83d[\udc00-\uded7\udedd-\udeec\udef0-\udefc\udf00-\udf73\udf80-\udfd8\udfe0-\udfeb\udff0]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udcb0\udcb1\udd00-\ude53\ude60-\ude6d\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec5\uded0-\uded9\udee0-\udee7\udef0-\udef6\udf00-\udf92\udf94-\udfca]"},{name:"Z",alias:"Separator",bmp:"   - \u2028\u2029   "},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:"   -    "}]},{}]},{},[3])(3)})); diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/404.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/404.html deleted file mode 100644 index 19f0749..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/404.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block title %}{% translate 'Page not found' %}{% endblock %} - -{% block content %} - -<h2>{% translate 'Page not found' %}</h2> - -<p>{% translate 'We’re sorry, but the requested page could not be found.' %}</p> - -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/500.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/500.html deleted file mode 100644 index b5ac5c3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/500.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block breadcrumbs %} -<div class="breadcrumbs"> -<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a> -› {% translate 'Server error' %} -</div> -{% endblock %} - -{% block title %}{% translate 'Server error (500)' %}{% endblock %} - -{% block content %} -<h1>{% translate 'Server Error <em>(500)</em>' %}</h1> -<p>{% translate 'There’s been an error. It’s been reported to the site administrators via email and should be fixed shortly. Thanks for your patience.' %}</p> - -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/actions.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/actions.html deleted file mode 100644 index f506c92..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/actions.html +++ /dev/null @@ -1,23 +0,0 @@ -{% load i18n %} -<div class="actions"> - {% block actions %} - {% block actions-form %} - {% for field in action_form %}{% if field.label %}<label>{{ field.label }} {{ field }}</label>{% else %}{{ field }}{% endif %}{% endfor %} - {% endblock %} - {% block actions-submit %} - <button type="submit" class="button" title="{% translate "Run the selected action" %}" name="index" value="{{ action_index|default:0 }}">{% translate "Go" %}</button> - {% endblock %} - {% block actions-counter %} - {% if actions_selection_counter %} - <span class="action-counter" data-actions-icnt="{{ cl.result_list|length }}">{{ selection_note }}</span> - {% if cl.result_count != cl.result_list|length %} - <span class="all hidden">{{ selection_note_all }}</span> - <span class="question hidden"> - <a role="button" href="#" title="{% translate "Click here to select the objects across all pages" %}">{% blocktranslate with cl.result_count as total_count %}Select all {{ total_count }} {{ module_name }}{% endblocktranslate %}</a> - </span> - <span class="clear hidden"><a role="button" href="#">{% translate "Clear selection" %}</a></span> - {% endif %} - {% endif %} - {% endblock %} - {% endblock %} -</div> diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/app_index.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/app_index.html deleted file mode 100644 index 727f72b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/app_index.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends "admin/index.html" %} -{% load i18n %} - -{% block bodyclass %}{{ block.super }} app-{{ app_label }}{% endblock %} - -{% if not is_popup %} -{% block nav-breadcrumbs %} - <nav aria-label="{% translate 'Breadcrumbs' %}"> - <div class="breadcrumbs"> - <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a> - › - {% for app in app_list %} - {{ app.name }} - {% endfor %} - </div> - </nav> -{% endblock %} -{% endif %} - -{% block sidebar %}{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/app_list.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/app_list.html deleted file mode 100644 index 60d874b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/app_list.html +++ /dev/null @@ -1,51 +0,0 @@ -{% load i18n %} - -{% if app_list %} - {% for app in app_list %} - <div class="app-{{ app.app_label }} module{% if app.app_url in request.path|urlencode %} current-app{% endif %}"> - <table> - <caption> - <a href="{{ app.app_url }}" class="section" title="{% blocktranslate with name=app.name %}Models in the {{ name }} application{% endblocktranslate %}">{{ app.name }}</a> - </caption> - <thead class="visually-hidden"> - <tr> - <th scope="col">{% translate 'Model name' %}</th> - <th scope="col">{% translate 'Add link' %}</th> - <th scope="col">{% translate 'Change or view list link' %}</th> - </tr> - </thead> - {% for model in app.models %} - {% with model_name=model.object_name|lower %} - <tr class="model-{{ model_name }}{% if model.admin_url in request.path|urlencode %} current-model{% endif %}"> - <th scope="row" id="{{ app.app_label }}-{{ model_name }}"> - {% if model.admin_url %} - <a href="{{ model.admin_url }}"{% if model.admin_url in request.path|urlencode %} aria-current="page"{% endif %}>{{ model.name }}</a> - {% else %} - {{ model.name }} - {% endif %} - </th> - - {% if model.add_url %} - <td><a href="{{ model.add_url }}" class="addlink" aria-describedby="{{ app.app_label }}-{{ model_name }}">{% translate 'Add' %}</a></td> - {% else %} - <td></td> - {% endif %} - - {% if model.admin_url and show_changelinks %} - {% if model.view_only %} - <td><a href="{{ model.admin_url }}" class="viewlink" aria-describedby="{{ app.app_label }}-{{ model_name }}">{% translate 'View' %}</a></td> - {% else %} - <td><a href="{{ model.admin_url }}" class="changelink" aria-describedby="{{ app.app_label }}-{{ model_name }}">{% translate 'Change' %}</a></td> - {% endif %} - {% elif show_changelinks %} - <td></td> - {% endif %} - </tr> - {% endwith %} - {% endfor %} - </table> - </div> - {% endfor %} -{% else %} - <p>{% translate 'You don’t have permission to view or edit anything.' %}</p> -{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html deleted file mode 100644 index 7c7ca1d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "admin/change_form.html" %} -{% load i18n static %} - -{% block form_top %} - {% if not is_popup %} - <p>{% translate "After you’ve created a user, you’ll be able to edit more user options." %}</p> - {% endif %} -{% endblock %} -{% block extrahead %} - {{ block.super }} - <link rel="stylesheet" href="{% static 'admin/css/unusable_password_field.css' %}"> -{% endblock %} -{% block admin_change_form_document_ready %} - {{ block.super }} - <script src="{% static 'admin/js/unusable_password_field.js' %}" defer></script> -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/auth/user/change_password.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/auth/user/change_password.html deleted file mode 100644 index 2f96a71..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/auth/user/change_password.html +++ /dev/null @@ -1,81 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} -{% load admin_urls %} - -{% block title %}{% if form.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %} - {{ block.super }} - <link rel="stylesheet" href="{% static "admin/css/forms.css" %}"> - <link rel="stylesheet" href="{% static 'admin/css/unusable_password_field.css' %}"> -{% endblock %} -{% block bodyclass %}{{ block.super }} {{ opts.app_label }}-{{ opts.model_name }} change-form{% endblock %} -{% if not is_popup %} -{% block breadcrumbs %} -<div class="breadcrumbs"> -<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a> -› <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> -› <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> -› <a href="{% url opts|admin_urlname:'change' original.pk|admin_urlquote %}">{{ original|truncatewords:"18" }}</a> -› {% if form.user.has_usable_password %}{% translate 'Change password' %}{% else %}{% translate 'Set password' %}{% endif %} -</div> -{% endblock %} -{% endif %} -{% block content %}<div id="content-main"> -<form{% if form_url %} action="{{ form_url }}"{% endif %} method="post" id="{{ opts.model_name }}_form">{% csrf_token %}{% block form_top %}{% endblock %} -<input type="text" name="username" value="{{ original.get_username }}" class="hidden"> -<div> -{% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1">{% endif %} -{% if form.errors %} - <p class="errornote"> - {% blocktranslate count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} - </p> -{% endif %} - -<p>{% blocktranslate with username=original %}Enter a new password for the user <strong>{{ username }}</strong>.{% endblocktranslate %}</p> -{% if not form.user.has_usable_password %} - <p>{% blocktranslate %}This action will <strong>enable</strong> password-based authentication for this user.{% endblocktranslate %}</p> -{% endif %} - -<fieldset class="module aligned"> - -<div class="form-row"> - {{ form.usable_password.errors }} - <div class="flex-container">{{ form.usable_password.label_tag }} {{ form.usable_password }}</div> - {% if form.usable_password.help_text %} - <div class="help"{% if form.usable_password.id_for_label %} id="{{ form.usable_password.id_for_label }}_helptext"{% endif %}> - <p>{{ form.usable_password.help_text|safe }}</p> - </div> - {% endif %} -</div> - -<div class="form-row field-password1"> - {{ form.password1.errors }} - <div class="flex-container">{{ form.password1.label_tag }} {{ form.password1 }}</div> - {% if form.password1.help_text %} - <div class="help"{% if form.password1.id_for_label %} id="{{ form.password1.id_for_label }}_helptext"{% endif %}>{{ form.password1.help_text|safe }}</div> - {% endif %} -</div> - -<div class="form-row field-password2"> - {{ form.password2.errors }} - <div class="flex-container">{{ form.password2.label_tag }} {{ form.password2 }}</div> - {% if form.password2.help_text %} - <div class="help"{% if form.password2.id_for_label %} id="{{ form.password2.id_for_label }}_helptext"{% endif %}>{{ form.password2.help_text|safe }}</div> - {% endif %} -</div> - -</fieldset> - -<div class="submit-row"> - {% if form.user.has_usable_password %} - <input type="submit" name="set-password" value="{% translate 'Change password' %}" class="default set-password"> - <input type="submit" name="unset-password" value="{% translate 'Disable password-based authentication' %}" class="unset-password"> - {% else %} - <input type="submit" name="set-password" value="{% translate 'Enable password-based authentication' %}" class="default set-password"> - {% endif %} -</div> - -</div> -</form></div> -<script src="{% static 'admin/js/unusable_password_field.js' %}" defer></script> -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/base.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/base.html deleted file mode 100644 index 7e95550..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/base.html +++ /dev/null @@ -1,126 +0,0 @@ -{% load i18n static %}<!DOCTYPE html> -{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} -<html lang="{{ LANGUAGE_CODE|default:"en-us" }}" dir="{{ LANGUAGE_BIDI|yesno:'rtl,ltr,auto' }}"> -<head> -<title>{% block title %}{% endblock %} - -{% block dark-mode-vars %} - - -{% endblock %} -{% if not is_popup and is_nav_sidebar_enabled %} - - -{% endif %} -{% block extrastyle %}{% endblock %} -{% if LANGUAGE_BIDI %}{% endif %} -{% block extrahead %}{% endblock %} -{% block responsive %} - - - {% if LANGUAGE_BIDI %}{% endif %} -{% endblock %} -{% block blockbots %}{% endblock %} - - - -{% translate 'Skip to main content' %} - -
- - {% if not is_popup %} - - {% block header %} - - {% endblock %} - - {% block nav-breadcrumbs %} - - {% endblock %} - {% endif %} - -
- {% if not is_popup and is_nav_sidebar_enabled %} - {% block nav-sidebar %} - {% include "admin/nav_sidebar.html" %} - {% endblock %} - {% endif %} -
- {% block messages %} - {% if messages %} -
    {% for message in messages %} - {{ message|capfirst }} - {% endfor %}
- {% endif %} - {% endblock messages %} - -
- {% block pretitle %}{% endblock %} - {% block content_title %}{% if title %}

{{ title }}

{% endif %}{% endblock %} - {% block object-tools %}{% endblock %} - {% block content_subtitle %}{% if subtitle %}

{{ subtitle }}

{% endif %}{% endblock %} - {% block content %} - {{ content }} - {% endblock %} - {% block sidebar %}{% endblock %} -
-
- -
-
-
{% block footer %}{% endblock %}
-
- - - - - - - - - -{% block extrabody %}{% endblock extrabody %} - - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/base_site.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/base_site.html deleted file mode 100644 index 4405998..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/base_site.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "admin/base.html" %} - -{% block title %}{% if subtitle %}{{ subtitle }} | {% endif %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} - -{% block branding %} - -{% if user.is_anonymous %} - {% include "admin/color_theme_toggle.html" %} -{% endif %} -{% endblock %} - -{% block nav-global %}{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_form.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_form.html deleted file mode 100644 index 11536b0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_form.html +++ /dev/null @@ -1,83 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n admin_urls static admin_modify %} - -{% block title %}{% if errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrahead %}{{ block.super }} - -{{ media }} -{% endblock %} - -{% block extrastyle %}{{ block.super }}{% endblock %} - -{% block coltype %}colM{% endblock %} - -{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %} - -{% if not is_popup %} -{% block breadcrumbs %} - -{% endblock %} -{% endif %} - -{% block object-tools %} -{% if change and not is_popup %} -
    - {% block object-tools-items %} - {% change_form_object_tools %} - {% endblock %} -
-{% endif %} -{% endblock %} - -{% block content %}
-
{% csrf_token %}{% block form_top %}{% endblock %} -
-{% if is_popup %}{% endif %} -{% if to_field %}{% endif %} -{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} -{% if errors %} -

- {% blocktranslate count counter=errors|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} -

- {{ adminform.form.non_field_errors }} -{% endif %} - -{% block field_sets %} -{% for fieldset in adminform %} - {% include "admin/includes/fieldset.html" with heading_level=2 prefix="fieldset" id_prefix=0 id_suffix=forloop.counter0 %} -{% endfor %} -{% endblock %} - -{% block after_field_sets %}{% endblock %} - -{% block inline_field_sets %} -{% for inline_admin_formset in inline_admin_formsets %} - {% include inline_admin_formset.opts.template %} -{% endfor %} -{% endblock %} - -{% block after_related_objects %}{% endblock %} - -{% block submit_buttons_bottom %}{% submit_row %}{% endblock %} - -{% block admin_change_form_document_ready %} - -{% endblock %} - -{# JavaScript for prepopulated fields #} -{% prepopulated_fields_js %} - -
-
-{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_form_object_tools.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_form_object_tools.html deleted file mode 100644 index 067ae83..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_form_object_tools.html +++ /dev/null @@ -1,8 +0,0 @@ -{% load i18n admin_urls %} -{% block object-tools-items %} -
  • - {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %} - {% translate "History" %} -
  • -{% if has_absolute_url %}
  • {% translate "View on site" %}
  • {% endif %} -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_list.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_list.html deleted file mode 100644 index cf96df9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_list.html +++ /dev/null @@ -1,95 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n admin_urls static admin_list %} - -{% block title %}{% if cl.formset and cl.formset.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %} - {{ block.super }} - - {% if cl.formset %} - - {% endif %} - {% if cl.formset or action_form %} - - {% endif %} - {{ media.css }} - {% if not actions_on_top and not actions_on_bottom %} - - {% endif %} -{% endblock %} - -{% block extrahead %} -{{ block.super }} -{{ media.js }} - -{% endblock %} - -{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list{% endblock %} - -{% if not is_popup %} -{% block breadcrumbs %} - -{% endblock %} -{% endif %} - -{% block coltype %}{% endblock %} - -{% block object-tools %} -
      - {% block object-tools-items %} - {% change_list_object_tools %} - {% endblock %} -
    -{% endblock %} - -{% block content %} -
    - {% if cl.formset and cl.formset.errors %} -

    - {% blocktranslate count counter=cl.formset.total_error_count %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} -

    - {{ cl.formset.non_form_errors }} - {% endif %} -
    -
    - {% block search %}{% search_form cl %}{% endblock %} - {% block date_hierarchy %}{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}{% endblock %} - -
    {% csrf_token %} - {% if cl.formset %} -
    {{ cl.formset.management_form }}
    - {% endif %} - - {% block result_list %} - {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %} - {% result_list cl %} - {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %} - {% endblock %} - {% block pagination %}{% pagination cl %}{% endblock %} -
    -
    - {% block filters %} - {% if cl.has_filters %} - - {% endif %} - {% endblock %} -
    -
    -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_list_object_tools.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_list_object_tools.html deleted file mode 100644 index 11cc6fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_list_object_tools.html +++ /dev/null @@ -1,12 +0,0 @@ -{% load i18n admin_urls %} - -{% block object-tools-items %} - {% if has_add_permission %} -
  • - {% url cl.opts|admin_urlname:'add' as add_url %} - - {% blocktranslate with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktranslate %} - -
  • - {% endif %} -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_list_results.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_list_results.html deleted file mode 100644 index d2a9fee..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/change_list_results.html +++ /dev/null @@ -1,36 +0,0 @@ -{% load i18n %} -{% if result_hidden_fields %} -
    {# DIV for HTML validation #} -{% for item in result_hidden_fields %}{{ item }}{% endfor %} -
    -{% endif %} -{% if results %} -
    - - - -{% for header in result_headers %} -{% endfor %} - - - -{% for result in results %} -{% if result.form and result.form.non_field_errors %} - -{% endif %} -{% for item in result %}{{ item }}{% endfor %} -{% endfor %} - -
    - {% if header.sortable and header.sort_priority > 0 %} -
    - - {% if num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %} - -
    - {% endif %} -
    {% if header.sortable %}{{ header.text|capfirst }}{% else %}{{ header.text|capfirst }}{% endif %}
    -
    -
    {{ result.form.non_field_errors }}
    -
    -{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/color_theme_toggle.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/color_theme_toggle.html deleted file mode 100644 index 2caa19e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/color_theme_toggle.html +++ /dev/null @@ -1,15 +0,0 @@ -{% load i18n %} - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html deleted file mode 100644 index c508856..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html +++ /dev/null @@ -1,14 +0,0 @@ -{% if show %} - -{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/delete_confirmation.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/delete_confirmation.html deleted file mode 100644 index 09e25e1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/delete_confirmation.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n admin_urls static %} - -{% block extrahead %} - {{ block.super }} - {{ media }} - -{% endblock %} - -{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation{% endblock %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -{% if perms_lacking %} - {% block delete_forbidden %} -

    {% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}

    -
      {{ perms_lacking|unordered_list }}
    - {% endblock %} -{% elif protected %} - {% block delete_protected %} -

    {% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:{% endblocktranslate %}

    -
      {{ protected|unordered_list }}
    - {% endblock %} -{% else %} - {% block delete_confirm %} -

    {% blocktranslate with escaped_object=object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktranslate %}

    - {% include "admin/includes/object_delete_summary.html" %} -

    {% translate "Objects" %}

    -
      {{ deleted_objects|unordered_list }}
    -
    {% csrf_token %} -
    - - {% if is_popup %}{% endif %} - {% if to_field %}{% endif %} - - {% translate "No, take me back" %} -
    -
    - {% endblock %} -{% endif %} -{% endblock content %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/delete_selected_confirmation.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/delete_selected_confirmation.html deleted file mode 100644 index 51b93a5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/delete_selected_confirmation.html +++ /dev/null @@ -1,47 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n l10n admin_urls static %} - -{% block extrahead %} - {{ block.super }} - {{ media }} - -{% endblock %} - -{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation delete-selected-confirmation{% endblock %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -{% if perms_lacking %} -

    {% blocktranslate %}Deleting the selected {{ objects_name }} would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}

    -
      {{ perms_lacking|unordered_list }}
    -{% elif protected %} -

    {% blocktranslate %}Deleting the selected {{ objects_name }} would require deleting the following protected related objects:{% endblocktranslate %}

    -
      {{ protected|unordered_list }}
    -{% else %} -

    {% blocktranslate %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktranslate %}

    - {% include "admin/includes/object_delete_summary.html" %} -

    {% translate "Objects" %}

    - {% for deletable_object in deletable_objects %} -
      {{ deletable_object|unordered_list }}
    - {% endfor %} -
    {% csrf_token %} -
    - {% for obj in queryset %} - - {% endfor %} - - - - {% translate "No, take me back" %} -
    -
    -{% endif %} -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html deleted file mode 100644 index a6939f4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html +++ /dev/null @@ -1,38 +0,0 @@ -{% load i18n admin_urls %} -
    -
    - {% if inline_admin_formset.is_collapsible %}
    {% endif %} -

    - {% if inline_admin_formset.formset.max_num == 1 %} - {{ inline_admin_formset.opts.verbose_name|capfirst }} - {% else %} - {{ inline_admin_formset.opts.verbose_name_plural|capfirst }} - {% endif %} -

    - {% if inline_admin_formset.is_collapsible %}
    {% endif %} -{{ inline_admin_formset.formset.management_form }} -{{ inline_admin_formset.formset.non_form_errors }} - -{% for inline_admin_form in inline_admin_formset %}
    -

    {{ inline_admin_formset.opts.verbose_name|capfirst }}: {% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} {% if inline_admin_formset.has_change_permission %}{% translate "Change" %}{% else %}{% translate "View" %}{% endif %}{% endif %} -{% else %}#{{ forloop.counter }}{% endif %} - {% if inline_admin_form.show_url %}{% translate "View on site" %}{% endif %} - {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission and inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}{% endif %} -

    - {% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %} - - {% with parent_counter=forloop.counter0 %} - {% for fieldset in inline_admin_form %} - {% include "admin/includes/fieldset.html" with heading_level=4 prefix=fieldset.formset.prefix id_prefix=parent_counter id_suffix=forloop.counter0 %} - {% endfor %} - {% endwith %} - - {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %} - {% if inline_admin_form.fk_field %}{{ inline_admin_form.fk_field.field }}{% endif %} -
    {% endfor %} - {% if inline_admin_formset.is_collapsible %}
    {% endif %} -
    -
    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/edit_inline/tabular.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/edit_inline/tabular.html deleted file mode 100644 index 9367ac9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/edit_inline/tabular.html +++ /dev/null @@ -1,69 +0,0 @@ -{% load i18n admin_urls static admin_modify %} -
    - -
    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/filter.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/filter.html deleted file mode 100644 index a6094ec..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/filter.html +++ /dev/null @@ -1,12 +0,0 @@ -{% load i18n %} -
    - - {% blocktranslate with filter_title=title %} By {{ filter_title }} {% endblocktranslate %} - - -
    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html deleted file mode 100644 index 9c9b319..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html +++ /dev/null @@ -1,39 +0,0 @@ -
    - {% if fieldset.name %} - {% if fieldset.is_collapsible %}
    {% endif %} - {{ fieldset.name }} - {% if fieldset.is_collapsible %}{% endif %} - {% endif %} - {% if fieldset.description %} -
    {{ fieldset.description|safe }}
    - {% endif %} - {% for line in fieldset %} -
    - {% if line.fields|length == 1 %}{{ line.errors }}{% else %}
    {% endif %} - {% for field in line %} -
    - {% if not line.fields|length == 1 and not field.is_readonly %}{{ field.errors }}{% endif %} -
    - {% if field.is_checkbox %} - {{ field.field }}{{ field.label_tag }} - {% else %} - {{ field.label_tag }} - {% if field.is_readonly %} -
    {{ field.contents }}
    - {% else %} - {{ field.field }} - {% endif %} - {% endif %} -
    - {% if field.field.help_text %} -
    -
    {{ field.field.help_text|safe }}
    -
    - {% endif %} -
    - {% endfor %} - {% if not line.fields|length == 1 %}
    {% endif %} -
    - {% endfor %} - {% if fieldset.name and fieldset.is_collapsible %}
    {% endif %} -
    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/includes/object_delete_summary.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/includes/object_delete_summary.html deleted file mode 100644 index 9ad97db..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/includes/object_delete_summary.html +++ /dev/null @@ -1,7 +0,0 @@ -{% load i18n %} -

    {% translate "Summary" %}

    -
      - {% for model_name, object_count in model_count %} -
    • {{ model_name|capfirst }}: {{ object_count }}
    • - {% endfor %} -
    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/index.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/index.html deleted file mode 100644 index 899727a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/index.html +++ /dev/null @@ -1,51 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} - -{% block extrastyle %}{{ block.super }}{% endblock %} - -{% block coltype %}colMS{% endblock %} - -{% block bodyclass %}{{ block.super }} dashboard{% endblock %} - -{% block nav-breadcrumbs %}{% endblock %} - -{% block nav-sidebar %}{% endblock %} - -{% block content %} -
    - {% include "admin/app_list.html" with app_list=app_list show_changelinks=True %} -
    -{% endblock %} - -{% block sidebar %} - -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/invalid_setup.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/invalid_setup.html deleted file mode 100644 index 1ef7c71..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/invalid_setup.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -

    {% translate 'Something’s wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user.' %}

    -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/login.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/login.html deleted file mode 100644 index fa0dcbc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/login.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} - -{% block title %}{% if form.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %}{{ block.super }} -{{ form.media }} -{% endblock %} - -{% block bodyclass %}{{ block.super }} login{% endblock %} - -{% block usertools %}{% endblock %} - -{% block nav-global %}{% endblock %} - -{% block nav-sidebar %}{% endblock %} - -{% block content_title %}{% endblock %} - -{% block nav-breadcrumbs %}{% endblock %} - -{% block content %} -{% if form.errors and not form.non_field_errors %} -

    -{% blocktranslate count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} -

    -{% endif %} - -{% if form.non_field_errors %} -{% for error in form.non_field_errors %} -

    - {{ error }} -

    -{% endfor %} -{% endif %} - -
    - -{% if user.is_authenticated %} -

    -{% blocktranslate trimmed %} - You are authenticated as {{ username }}, but are not authorized to - access this page. Would you like to login to a different account? -{% endblocktranslate %} -

    -{% endif %} - -
    {% csrf_token %} -
    - {{ form.username.errors }} - {{ form.username.label_tag }} {{ form.username }} -
    -
    - {{ form.password.errors }} - {{ form.password.label_tag }} {{ form.password }} - -
    - {% url 'admin_password_reset' as password_reset_url %} - {% if password_reset_url %} - - {% endif %} -
    - -
    -
    - -
    -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/nav_sidebar.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/nav_sidebar.html deleted file mode 100644 index a413e23..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/nav_sidebar.html +++ /dev/null @@ -1,8 +0,0 @@ -{% load i18n %} - - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/object_history.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/object_history.html deleted file mode 100644 index f83984c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/object_history.html +++ /dev/null @@ -1,56 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n admin_urls %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -
    -
    - -{% if action_list %} - - - - - - - - - - {% for action in action_list %} - - - - - - {% endfor %} - -
    {% translate 'Date/time' %}{% translate 'User' %}{% translate 'Action' %}
    {{ action.action_time|date:"DATETIME_FORMAT" }}{{ action.user.get_username }}{% if action.user.get_full_name %} ({{ action.user.get_full_name }}){% endif %}{{ action.get_change_message }}
    -

    - {% if pagination_required %} - {% for i in page_range %} - {% if i == action_list.paginator.ELLIPSIS %} - {{ action_list.paginator.ELLIPSIS }} - {% elif i == action_list.number %} - {{ i }} - {% else %} - {{ i }} - {% endif %} - {% endfor %} - {% endif %} - {{ action_list.paginator.count }} {% blocktranslate count counter=action_list.paginator.count %}entry{% plural %}entries{% endblocktranslate %} -

    -{% else %} -

    {% translate 'This object doesn’t have a change history. It probably wasn’t added via this admin site.' %}

    -{% endif %} -
    -
    -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/pagination.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/pagination.html deleted file mode 100644 index bc3117b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/pagination.html +++ /dev/null @@ -1,12 +0,0 @@ -{% load admin_list %} -{% load i18n %} -

    -{% if pagination_required %} -{% for i in page_range %} - {% paginator_number cl i %} -{% endfor %} -{% endif %} -{{ cl.result_count }} {% if cl.result_count == 1 %}{{ cl.opts.verbose_name }}{% else %}{{ cl.opts.verbose_name_plural }}{% endif %} -{% if show_all_url %}{% translate 'Show all' %}{% endif %} -{% if cl.formset and cl.result_count %}{% endif %} -

    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/popup_response.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/popup_response.html deleted file mode 100644 index 57a1ae3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/popup_response.html +++ /dev/null @@ -1,10 +0,0 @@ -{% load i18n static %} - - {% translate 'Popup closing…' %} - - - - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/prepopulated_fields_js.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/prepopulated_fields_js.html deleted file mode 100644 index dd6e561..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/prepopulated_fields_js.html +++ /dev/null @@ -1,5 +0,0 @@ -{% load static %} - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/search_form.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/search_form.html deleted file mode 100644 index 447b803..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/search_form.html +++ /dev/null @@ -1,20 +0,0 @@ -{% load i18n static %} -{% if cl.search_fields %} -
    -{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/submit_line.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/submit_line.html deleted file mode 100644 index b2b2054..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/submit_line.html +++ /dev/null @@ -1,17 +0,0 @@ -{% load i18n admin_urls %} -
    -{% block submit-row %} -{% if show_save %}{% endif %} -{% if show_save_as_new %}{% endif %} -{% if show_save_and_add_another %}{% endif %} -{% if show_save_and_continue %}{% endif %} -{% if show_close %} - {% url opts|admin_urlname:'changelist' as changelist_url %} - {% translate 'Close' %} -{% endif %} -{% if show_delete_link and original %} - {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %} - {% translate "Delete" %} -{% endif %} -{% endblock %} -
    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html deleted file mode 100644 index 8b42f19..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html +++ /dev/null @@ -1,6 +0,0 @@ -{% if widget.is_initial %}

    {{ widget.initial_text }}: {{ widget.value }}{% if not widget.required %} - - -{% endif %}
    -{{ widget.input_text }}:{% endif %} -{% if widget.is_initial %}

    {% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/date.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/date.html deleted file mode 100644 index acd5d5f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/date.html +++ /dev/null @@ -1,3 +0,0 @@ -

    - {% include "django/forms/widgets/date.html" %} -

    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html deleted file mode 100644 index a6eba93..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html +++ /dev/null @@ -1,2 +0,0 @@ -{% if related_url %}
    {% endif %}{% include 'django/forms/widgets/input.html' %}{% if related_url %}{% endif %}{% if link_label %} -{% if link_url %}{{ link_label }}{% else %}{{ link_label }}{% endif %}{% endif %}{% if related_url %}
    {% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html deleted file mode 100644 index 0dd0331..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html +++ /dev/null @@ -1 +0,0 @@ -{% include 'admin/widgets/foreign_key_raw_id.html' %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/radio.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/radio.html deleted file mode 100644 index 780899a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/radio.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/multiple_input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html deleted file mode 100644 index 9251527..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html +++ /dev/null @@ -1,41 +0,0 @@ -{% load i18n static %} - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html deleted file mode 100644 index 7fc7bf6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html +++ /dev/null @@ -1,4 +0,0 @@ -

    - {{ date_label }} {% with widget=widget.subwidgets.0 %}{% include widget.template_name %}{% endwith %}
    - {{ time_label }} {% with widget=widget.subwidgets.1 %}{% include widget.template_name %}{% endwith %} -

    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/time.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/time.html deleted file mode 100644 index e4eaca6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/time.html +++ /dev/null @@ -1,3 +0,0 @@ -

    - {% include "django/forms/widgets/time.html" %} -

    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/url.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/url.html deleted file mode 100644 index 69dc401..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/admin/widgets/url.html +++ /dev/null @@ -1 +0,0 @@ -{% if url_valid %}

    {{ current_label }} {{ widget.value }}
    {{ change_label }} {% endif %}{% include "django/forms/widgets/input.html" %}{% if url_valid %}

    {% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/logged_out.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/logged_out.html deleted file mode 100644 index e9a5545..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/logged_out.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block breadcrumbs %}{% endblock %} - -{% block nav-sidebar %}{% endblock %} - -{% block content %} - -

    {% translate "Thanks for spending some quality time with the web site today." %}

    - -

    {% translate 'Log in again' %}

    - -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_change_done.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_change_done.html deleted file mode 100644 index 784ab37..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_change_done.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} -{% block userlinks %} - {% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}{% translate 'Documentation' %} / {% endif %}{% translate 'Change password' %} / -
    - {% csrf_token %} - -
    - {% include "admin/color_theme_toggle.html" %} -{% endblock %} -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -

    {% translate 'Your password was changed.' %}

    -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_change_form.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_change_form.html deleted file mode 100644 index 3d66aeb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_change_form.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} - -{% block title %}{% if form.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %}{{ block.super }}{% endblock %} -{% block userlinks %} - {% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}{% translate 'Documentation' %} / {% endif %} {% translate 'Change password' %} / -
    - {% csrf_token %} - -
    - {% include "admin/color_theme_toggle.html" %} -{% endblock %} -{% block breadcrumbs %} - -{% endblock %} - -{% block content %}
    - -
    {% csrf_token %} -
    -{% if form.errors %} -

    - {% blocktranslate count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} -

    -{% endif %} - - -

    {% translate 'Please enter your old password, for security’s sake, and then enter your new password twice so we can verify you typed it in correctly.' %}

    - -
    - -
    - {{ form.old_password.errors }} -
    {{ form.old_password.label_tag }} {{ form.old_password }}
    -
    - -
    - {{ form.new_password1.errors }} -
    {{ form.new_password1.label_tag }} {{ form.new_password1 }}
    - {% if form.new_password1.help_text %} -
    {{ form.new_password1.help_text|safe }}
    - {% endif %} -
    - -
    - {{ form.new_password2.errors }} -
    {{ form.new_password2.label_tag }} {{ form.new_password2 }}
    - {% if form.new_password2.help_text %} -
    {{ form.new_password2.help_text|safe }}
    - {% endif %} -
    - -
    - -
    - -
    - -
    -
    - -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_complete.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_complete.html deleted file mode 100644 index e6a383f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_complete.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} - -

    {% translate "Your password has been set. You may go ahead and log in now." %}

    - -

    {% translate 'Log in' %}

    - -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_confirm.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_confirm.html deleted file mode 100644 index 5e1478b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_confirm.html +++ /dev/null @@ -1,48 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} - -{% block title %}{% if form.new_password1.errors or form.new_password2.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %}{{ block.super }}{% endblock %} -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} - -{% if validlink %} - -

    {% translate "Please enter your new password twice so we can verify you typed it in correctly." %}

    - -
    {% csrf_token %} -
    - -
    - {{ form.new_password1.errors }} -
    - - {{ form.new_password1 }} -
    -
    -
    - {{ form.new_password2.errors }} -
    - - {{ form.new_password2 }} -
    -
    -
    -
    - -
    -
    - -{% else %} - -

    {% translate "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}

    - -{% endif %} - -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_done.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_done.html deleted file mode 100644 index 8b1971a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_done.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} - -

    {% translate 'We’ve emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly.' %}

    - -

    {% translate 'If you don’t receive an email, please make sure you’ve entered the address you registered with, and check your spam folder.' %}

    - -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_email.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_email.html deleted file mode 100644 index 2a428c4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_email.html +++ /dev/null @@ -1,14 +0,0 @@ -{% load i18n %}{% autoescape off %} -{% blocktranslate %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktranslate %} - -{% translate "Please go to the following page and choose a new password:" %} -{% block reset_link %} -{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %} -{% endblock %} -{% translate 'In case you’ve forgotten, you are:' %} {{ user.get_username }} - -{% translate "Thanks for using our site!" %} - -{% blocktranslate %}The {{ site_name }} team{% endblocktranslate %} - -{% endautoescape %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_form.html b/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_form.html deleted file mode 100644 index e12189a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templates/registration/password_reset_form.html +++ /dev/null @@ -1,32 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} - -{% block title %}{% if form.email.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %}{{ block.super }}{% endblock %} -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} - -

    {% translate 'Forgotten your password? Enter your email address below, and we’ll email instructions for setting a new one.' %}

    - -
    {% csrf_token %} -
    -
    - {{ form.email.errors }} -
    - - {{ form.email }} -
    -
    -
    -
    - -
    -
    - -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/admin_list.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/admin_list.py deleted file mode 100644 index 6615e98..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/admin_list.py +++ /dev/null @@ -1,544 +0,0 @@ -import datetime - -from django.contrib.admin.templatetags.admin_urls import add_preserved_filters -from django.contrib.admin.utils import ( - display_for_field, - display_for_value, - get_fields_from_path, - label_for_field, - lookup_field, -) -from django.contrib.admin.views.main import ( - ALL_VAR, - IS_FACETS_VAR, - IS_POPUP_VAR, - ORDER_VAR, - PAGE_VAR, - SEARCH_VAR, -) -from django.core.exceptions import ObjectDoesNotExist -from django.db import models -from django.db.models.constants import LOOKUP_SEP -from django.template import Library -from django.template.loader import get_template -from django.templatetags.static import static -from django.urls import NoReverseMatch -from django.utils import formats, timezone -from django.utils.html import format_html -from django.utils.safestring import mark_safe -from django.utils.text import capfirst -from django.utils.translation import gettext as _ - -from .base import InclusionAdminNode - -register = Library() - - -@register.simple_tag -def paginator_number(cl, i): - """ - Generate an individual page index link in a paginated list. - """ - if i == cl.paginator.ELLIPSIS: - return format_html("{} ", cl.paginator.ELLIPSIS) - elif i == cl.page_num: - return format_html('{} ', i) - else: - return format_html( - '{} ', - cl.get_query_string({PAGE_VAR: i}), - mark_safe(' class="end"' if i == cl.paginator.num_pages else ""), - i, - ) - - -def pagination(cl): - """ - Generate the series of links to the pages in a paginated list. - """ - pagination_required = (not cl.show_all or not cl.can_show_all) and cl.multi_page - page_range = ( - cl.paginator.get_elided_page_range(cl.page_num) if pagination_required else [] - ) - need_show_all_link = cl.can_show_all and not cl.show_all and cl.multi_page - return { - "cl": cl, - "pagination_required": pagination_required, - "show_all_url": need_show_all_link and cl.get_query_string({ALL_VAR: ""}), - "page_range": page_range, - "ALL_VAR": ALL_VAR, - "1": 1, - } - - -@register.tag(name="pagination") -def pagination_tag(parser, token): - return InclusionAdminNode( - parser, - token, - func=pagination, - template_name="pagination.html", - takes_context=False, - ) - - -def result_headers(cl): - """ - Generate the list column headers. - """ - ordering_field_columns = cl.get_ordering_field_columns() - for i, field_name in enumerate(cl.list_display): - text, attr = label_for_field( - field_name, cl.model, model_admin=cl.model_admin, return_attr=True - ) - is_field_sortable = cl.sortable_by is None or field_name in cl.sortable_by - if attr: - field_name = _coerce_field_name(field_name, i) - # Potentially not sortable - - # if the field is the action checkbox: no sorting and special class - if field_name == "action_checkbox": - aria_label = _("Select all objects on this page for an action") - yield { - "text": mark_safe( - f'' - ), - "class_attrib": mark_safe(' class="action-checkbox-column"'), - "sortable": False, - } - continue - - admin_order_field = getattr(attr, "admin_order_field", None) - # Set ordering for attr that is a property, if defined. - if isinstance(attr, property) and hasattr(attr, "fget"): - admin_order_field = getattr(attr.fget, "admin_order_field", None) - if not admin_order_field and LOOKUP_SEP not in field_name: - is_field_sortable = False - - if not is_field_sortable: - # Not sortable - yield { - "text": text, - "class_attrib": format_html(' class="column-{}"', field_name), - "sortable": False, - } - continue - - # OK, it is sortable if we got this far - th_classes = ["sortable", "column-{}".format(field_name)] - order_type = "" - new_order_type = "asc" - sort_priority = 0 - # Is it currently being sorted on? - is_sorted = i in ordering_field_columns - if is_sorted: - order_type = ordering_field_columns.get(i).lower() - sort_priority = list(ordering_field_columns).index(i) + 1 - th_classes.append("sorted %sending" % order_type) - new_order_type = {"asc": "desc", "desc": "asc"}[order_type] - - # build new ordering param - o_list_primary = [] # URL for making this field the primary sort - o_list_remove = [] # URL for removing this field from sort - o_list_toggle = [] # URL for toggling order type for this field - - def make_qs_param(t, n): - return ("-" if t == "desc" else "") + str(n) - - for j, ot in ordering_field_columns.items(): - if j == i: # Same column - param = make_qs_param(new_order_type, j) - # We want clicking on this header to bring the ordering to the - # front - o_list_primary.insert(0, param) - o_list_toggle.append(param) - # o_list_remove - omit - else: - param = make_qs_param(ot, j) - o_list_primary.append(param) - o_list_toggle.append(param) - o_list_remove.append(param) - - if i not in ordering_field_columns: - o_list_primary.insert(0, make_qs_param(new_order_type, i)) - - yield { - "text": text, - "sortable": True, - "sorted": is_sorted, - "ascending": order_type == "asc", - "sort_priority": sort_priority, - "url_primary": cl.get_query_string({ORDER_VAR: ".".join(o_list_primary)}), - "url_remove": cl.get_query_string({ORDER_VAR: ".".join(o_list_remove)}), - "url_toggle": cl.get_query_string({ORDER_VAR: ".".join(o_list_toggle)}), - "class_attrib": ( - format_html(' class="{}"', " ".join(th_classes)) if th_classes else "" - ), - } - - -def _boolean_icon(field_val): - icon_url = static( - "admin/img/icon-%s.svg" % {True: "yes", False: "no", None: "unknown"}[field_val] - ) - return format_html('{}', icon_url, field_val) - - -def _coerce_field_name(field_name, field_index): - """ - Coerce a field_name (which may be a callable) to a string. - """ - if callable(field_name): - if field_name.__name__ == "": - return "lambda" + str(field_index) - else: - return field_name.__name__ - return field_name - - -def items_for_result(cl, result, form): - """ - Generate the actual list of data. - """ - - def link_in_col(is_first, field_name, cl): - if cl.list_display_links is None: - return False - if is_first and not cl.list_display_links: - return True - return field_name in cl.list_display_links - - first = True - pk = cl.lookup_opts.pk.attname - for field_index, field_name in enumerate(cl.list_display): - empty_value_display = cl.model_admin.get_empty_value_display() - row_classes = ["field-%s" % _coerce_field_name(field_name, field_index)] - link_to_changelist = link_in_col(first, field_name, cl) - try: - f, attr, value = lookup_field(field_name, result, cl.model_admin) - except ObjectDoesNotExist: - result_repr = empty_value_display - else: - empty_value_display = getattr( - attr, "empty_value_display", empty_value_display - ) - if isinstance(value, str) and value.strip() == "": - value = "" - if f is None or f.auto_created: - if field_name == "action_checkbox": - row_classes = ["action-checkbox"] - boolean = getattr(attr, "boolean", False) - # Set boolean for attr that is a property, if defined. - if isinstance(attr, property) and hasattr(attr, "fget"): - boolean = getattr(attr.fget, "boolean", False) - result_repr = display_for_value(value, empty_value_display, boolean) - if isinstance(value, (datetime.date, datetime.time)): - row_classes.append("nowrap") - else: - if isinstance(f.remote_field, models.ManyToOneRel): - field_val = getattr(result, f.name) - if field_val is None: - result_repr = empty_value_display - else: - result_repr = field_val - else: - result_repr = display_for_field( - value, - f, - empty_value_display, - avoid_link=link_to_changelist, - ) - if isinstance( - f, (models.DateField, models.TimeField, models.ForeignKey) - ): - row_classes.append("nowrap") - row_class = mark_safe(' class="%s"' % " ".join(row_classes)) - # If list_display_links not defined, add the link tag to the first field - if link_to_changelist: - table_tag = "th" if first else "td" - first = False - - # Display link to the result's change_view if the url exists, else - # display just the result's representation. - try: - url = cl.url_for_result(result) - except NoReverseMatch: - link_or_text = result_repr - else: - url = add_preserved_filters( - {"preserved_filters": cl.preserved_filters, "opts": cl.opts}, url - ) - # Convert the pk to something that can be used in JavaScript. - # Problem cases are non-ASCII strings. - if cl.to_field: - attr = str(cl.to_field) - else: - attr = pk - value = result.serializable_value(attr) - link_or_text = format_html( - '{}', - url, - ( - format_html(' data-popup-opener="{}"', value) - if cl.is_popup - else "" - ), - result_repr, - ) - - yield format_html( - "<{}{}>{}", table_tag, row_class, link_or_text, table_tag - ) - else: - # By default the fields come from ModelAdmin.list_editable, but if we pull - # the fields out of the form instead of list_editable custom admins - # can provide fields on a per request basis - if ( - form - and field_name in form.fields - and not ( - field_name == cl.model._meta.pk.name - and form[cl.model._meta.pk.name].is_hidden - ) - ): - bf = form[field_name] - result_repr = mark_safe(str(bf.errors) + str(bf)) - yield format_html("{}", row_class, result_repr) - if form and not form[cl.model._meta.pk.name].is_hidden: - yield format_html("{}", form[cl.model._meta.pk.name]) - - -class ResultList(list): - """ - Wrapper class used to return items in a list_editable changelist, annotated - with the form object for error reporting purposes. Needed to maintain - backwards compatibility with existing admin templates. - """ - - def __init__(self, form, *items): - self.form = form - super().__init__(*items) - - -def results(cl): - if cl.formset: - for res, form in zip(cl.result_list, cl.formset.forms): - yield ResultList(form, items_for_result(cl, res, form)) - else: - for res in cl.result_list: - yield ResultList(None, items_for_result(cl, res, None)) - - -def result_hidden_fields(cl): - if cl.formset: - for res, form in zip(cl.result_list, cl.formset.forms): - if form[cl.model._meta.pk.name].is_hidden: - yield mark_safe(form[cl.model._meta.pk.name]) - - -def result_list(cl): - """ - Display the headers and data list together. - """ - headers = list(result_headers(cl)) - num_sorted_fields = 0 - for h in headers: - if h["sortable"] and h["sorted"]: - num_sorted_fields += 1 - return { - "cl": cl, - "result_hidden_fields": list(result_hidden_fields(cl)), - "result_headers": headers, - "num_sorted_fields": num_sorted_fields, - "results": list(results(cl)), - } - - -@register.tag(name="result_list") -def result_list_tag(parser, token): - return InclusionAdminNode( - parser, - token, - func=result_list, - template_name="change_list_results.html", - takes_context=False, - ) - - -def date_hierarchy(cl): - """ - Display the date hierarchy for date drill-down functionality. - """ - if cl.date_hierarchy: - field_name = cl.date_hierarchy - field = get_fields_from_path(cl.model, field_name)[-1] - if isinstance(field, models.DateTimeField): - dates_or_datetimes = "datetimes" - else: - dates_or_datetimes = "dates" - year_field = "%s__year" % field_name - month_field = "%s__month" % field_name - day_field = "%s__day" % field_name - field_generic = "%s__" % field_name - year_lookup = cl.params.get(year_field) - month_lookup = cl.params.get(month_field) - day_lookup = cl.params.get(day_field) - - def link(filters): - return cl.get_query_string(filters, [field_generic]) - - if not (year_lookup or month_lookup or day_lookup): - # select appropriate start level - date_range = cl.queryset.aggregate( - first=models.Min(field_name), last=models.Max(field_name) - ) - if date_range["first"] and date_range["last"]: - if dates_or_datetimes == "datetimes": - date_range = { - k: timezone.localtime(v) if timezone.is_aware(v) else v - for k, v in date_range.items() - } - if date_range["first"].year == date_range["last"].year: - year_lookup = date_range["first"].year - if date_range["first"].month == date_range["last"].month: - month_lookup = date_range["first"].month - - if year_lookup and month_lookup and day_lookup: - day = datetime.date(int(year_lookup), int(month_lookup), int(day_lookup)) - return { - "show": True, - "back": { - "link": link({year_field: year_lookup, month_field: month_lookup}), - "title": capfirst(formats.date_format(day, "YEAR_MONTH_FORMAT")), - }, - "choices": [ - {"title": capfirst(formats.date_format(day, "MONTH_DAY_FORMAT"))} - ], - } - elif year_lookup and month_lookup: - days = getattr(cl.queryset, dates_or_datetimes)(field_name, "day") - return { - "show": True, - "back": { - "link": link({year_field: year_lookup}), - "title": str(year_lookup), - }, - "choices": [ - { - "link": link( - { - year_field: year_lookup, - month_field: month_lookup, - day_field: day.day, - } - ), - "title": capfirst(formats.date_format(day, "MONTH_DAY_FORMAT")), - } - for day in days - ], - } - elif year_lookup: - months = getattr(cl.queryset, dates_or_datetimes)(field_name, "month") - return { - "show": True, - "back": {"link": link({}), "title": _("All dates")}, - "choices": [ - { - "link": link( - {year_field: year_lookup, month_field: month.month} - ), - "title": capfirst( - formats.date_format(month, "YEAR_MONTH_FORMAT") - ), - } - for month in months - ], - } - else: - years = getattr(cl.queryset, dates_or_datetimes)(field_name, "year") - return { - "show": True, - "back": None, - "choices": [ - { - "link": link({year_field: str(year.year)}), - "title": str(year.year), - } - for year in years - ], - } - - -@register.tag(name="date_hierarchy") -def date_hierarchy_tag(parser, token): - return InclusionAdminNode( - parser, - token, - func=date_hierarchy, - template_name="date_hierarchy.html", - takes_context=False, - ) - - -def search_form(cl): - """ - Display a search form for searching the list. - """ - return { - "cl": cl, - "show_result_count": cl.result_count != cl.full_result_count, - "search_var": SEARCH_VAR, - "is_popup_var": IS_POPUP_VAR, - "is_facets_var": IS_FACETS_VAR, - } - - -@register.tag(name="search_form") -def search_form_tag(parser, token): - return InclusionAdminNode( - parser, - token, - func=search_form, - template_name="search_form.html", - takes_context=False, - ) - - -@register.simple_tag -def admin_list_filter(cl, spec): - tpl = get_template(spec.template) - return tpl.render( - { - "title": spec.title, - "choices": list(spec.choices(cl)), - "spec": spec, - } - ) - - -def admin_actions(context): - """ - Track the number of times the action field has been rendered on the page, - so we know which value to use. - """ - context["action_index"] = context.get("action_index", -1) + 1 - return context - - -@register.tag(name="admin_actions") -def admin_actions_tag(parser, token): - return InclusionAdminNode( - parser, token, func=admin_actions, template_name="actions.html" - ) - - -@register.tag(name="change_list_object_tools") -def change_list_object_tools_tag(parser, token): - """Display the row of change list object tools.""" - return InclusionAdminNode( - parser, - token, - func=lambda context: context, - template_name="change_list_object_tools.html", - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/admin_modify.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/admin_modify.py deleted file mode 100644 index 0e3046a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/admin_modify.py +++ /dev/null @@ -1,150 +0,0 @@ -import json - -from django import template -from django.template.context import Context - -from .base import InclusionAdminNode - -register = template.Library() - - -def prepopulated_fields_js(context): - """ - Create a list of prepopulated_fields that should render JavaScript for - the prepopulated fields for both the admin form and inlines. - """ - prepopulated_fields = [] - if "adminform" in context: - prepopulated_fields.extend(context["adminform"].prepopulated_fields) - if "inline_admin_formsets" in context: - for inline_admin_formset in context["inline_admin_formsets"]: - for inline_admin_form in inline_admin_formset: - if inline_admin_form.original is None: - prepopulated_fields.extend(inline_admin_form.prepopulated_fields) - - prepopulated_fields_json = [] - for field in prepopulated_fields: - prepopulated_fields_json.append( - { - "id": "#%s" % field["field"].auto_id, - "name": field["field"].name, - "dependency_ids": [ - "#%s" % dependency.auto_id for dependency in field["dependencies"] - ], - "dependency_list": [ - dependency.name for dependency in field["dependencies"] - ], - "maxLength": field["field"].field.max_length or 50, - "allowUnicode": getattr(field["field"].field, "allow_unicode", False), - } - ) - - context.update( - { - "prepopulated_fields": prepopulated_fields, - "prepopulated_fields_json": json.dumps(prepopulated_fields_json), - } - ) - return context - - -@register.tag(name="prepopulated_fields_js") -def prepopulated_fields_js_tag(parser, token): - return InclusionAdminNode( - parser, - token, - func=prepopulated_fields_js, - template_name="prepopulated_fields_js.html", - ) - - -def submit_row(context): - """ - Display the row of buttons for delete and save. - """ - add = context["add"] - change = context["change"] - is_popup = context["is_popup"] - save_as = context["save_as"] - show_save = context.get("show_save", True) - show_save_and_add_another = context.get("show_save_and_add_another", True) - show_save_and_continue = context.get("show_save_and_continue", True) - has_add_permission = context["has_add_permission"] - has_change_permission = context["has_change_permission"] - has_view_permission = context["has_view_permission"] - has_editable_inline_admin_formsets = context["has_editable_inline_admin_formsets"] - can_save = ( - (has_change_permission and change) - or (has_add_permission and add) - or has_editable_inline_admin_formsets - ) - can_save_and_add_another = ( - has_add_permission - and not is_popup - and (not save_as or add) - and can_save - and show_save_and_add_another - ) - can_save_and_continue = ( - not is_popup and can_save and has_view_permission and show_save_and_continue - ) - can_change = has_change_permission or has_editable_inline_admin_formsets - ctx = Context(context) - ctx.update( - { - "can_change": can_change, - "show_delete_link": ( - not is_popup - and context["has_delete_permission"] - and change - and context.get("show_delete", True) - ), - "show_save_as_new": not is_popup - and has_add_permission - and change - and save_as, - "show_save_and_add_another": can_save_and_add_another, - "show_save_and_continue": can_save_and_continue, - "show_save": show_save and can_save, - "show_close": not (show_save and can_save), - } - ) - return ctx - - -@register.tag(name="submit_row") -def submit_row_tag(parser, token): - return InclusionAdminNode( - parser, token, func=submit_row, template_name="submit_line.html" - ) - - -@register.tag(name="change_form_object_tools") -def change_form_object_tools_tag(parser, token): - """Display the row of change form object tools.""" - return InclusionAdminNode( - parser, - token, - func=lambda context: context, - template_name="change_form_object_tools.html", - ) - - -@register.filter -def cell_count(inline_admin_form): - """Return the number of cells used in a tabular inline.""" - count = 1 # Hidden cell with hidden 'id' field - for fieldset in inline_admin_form: - # Count all visible fields. - for line in fieldset: - for field in line: - try: - is_hidden = field.field.is_hidden - except AttributeError: - is_hidden = field.field["is_hidden"] - if not is_hidden: - count += 1 - if inline_admin_form.formset.can_delete: - # Delete checkbox - count += 1 - return count diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/admin_urls.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/admin_urls.py deleted file mode 100644 index 176e7a4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/admin_urls.py +++ /dev/null @@ -1,70 +0,0 @@ -from urllib.parse import parse_qsl, unquote, urlsplit, urlunsplit - -from django import template -from django.contrib.admin.utils import quote -from django.urls import Resolver404, get_script_prefix, resolve -from django.utils.http import urlencode - -register = template.Library() - - -@register.filter -def admin_urlname(value, arg): - return "admin:%s_%s_%s" % (value.app_label, value.model_name, arg) - - -@register.filter -def admin_urlquote(value): - return quote(value) - - -@register.simple_tag(takes_context=True) -def add_preserved_filters(context, url, popup=False, to_field=None): - opts = context.get("opts") - preserved_filters = context.get("preserved_filters") - preserved_qsl = context.get("preserved_qsl") - - parsed_url = list(urlsplit(url)) - parsed_qs = dict(parse_qsl(parsed_url[3])) - merged_qs = {} - - if preserved_qsl: - merged_qs.update(preserved_qsl) - - if opts and preserved_filters: - preserved_filters = dict(parse_qsl(preserved_filters)) - - match_url = "/%s" % unquote(url).partition(get_script_prefix())[2] - try: - match = resolve(match_url) - except Resolver404: - pass - else: - current_url = "%s:%s" % (match.app_name, match.url_name) - changelist_url = "admin:%s_%s_changelist" % ( - opts.app_label, - opts.model_name, - ) - if ( - changelist_url == current_url - and "_changelist_filters" in preserved_filters - ): - preserved_filters = dict( - parse_qsl(preserved_filters["_changelist_filters"]) - ) - - merged_qs.update(preserved_filters) - - if popup: - from django.contrib.admin.options import IS_POPUP_VAR - - merged_qs[IS_POPUP_VAR] = 1 - if to_field: - from django.contrib.admin.options import TO_FIELD_VAR - - merged_qs[TO_FIELD_VAR] = to_field - - merged_qs.update(parsed_qs) - - parsed_url[3] = urlencode(merged_qs) - return urlunsplit(parsed_url) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/base.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/base.py deleted file mode 100644 index 9551c0e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/base.py +++ /dev/null @@ -1,45 +0,0 @@ -from inspect import getfullargspec - -from django.template.library import InclusionNode, parse_bits - - -class InclusionAdminNode(InclusionNode): - """ - Template tag that allows its template to be overridden per model, per app, - or globally. - """ - - def __init__(self, parser, token, func, template_name, takes_context=True): - self.template_name = template_name - params, varargs, varkw, defaults, kwonly, kwonly_defaults, _ = getfullargspec( - func - ) - bits = token.split_contents() - args, kwargs = parse_bits( - parser, - bits[1:], - params, - varargs, - varkw, - defaults, - kwonly, - kwonly_defaults, - takes_context, - bits[0], - ) - super().__init__(func, takes_context, args, kwargs, filename=None) - - def render(self, context): - opts = context["opts"] - app_label = opts.app_label.lower() - object_name = opts.model_name - # Load template for this render call. (Setting self.filename isn't - # thread-safe.) - context.render_context[self] = context.template.engine.select_template( - [ - "admin/%s/%s/%s" % (app_label, object_name, self.template_name), - "admin/%s/%s" % (app_label, self.template_name), - "admin/%s" % self.template_name, - ] - ) - return super().render(context) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/log.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/log.py deleted file mode 100644 index 55b2c46..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/templatetags/log.py +++ /dev/null @@ -1,67 +0,0 @@ -from django import template - -register = template.Library() - - -class AdminLogNode(template.Node): - def __init__(self, limit, varname, user): - self.limit = limit - self.varname = varname - self.user = user - - def __repr__(self): - return "" - - def render(self, context): - entries = context["log_entries"] - if self.user is not None: - user_id = self.user - if not user_id.isdigit(): - user_id = context[self.user].pk - entries = entries.filter(user__pk=user_id) - context[self.varname] = entries[: int(self.limit)] - return "" - - -@register.tag -def get_admin_log(parser, token): - """ - Populate a template variable with the admin log for the given criteria. - - Usage:: - - {% get_admin_log [limit] as [varname] for_user [context_var_with_user_obj] %} - - Examples:: - - {% get_admin_log 10 as admin_log for_user 23 %} - {% get_admin_log 10 as admin_log for_user user %} - {% get_admin_log 10 as admin_log %} - - Note that ``context_var_containing_user_obj`` can be a hard-coded integer - (user ID) or the name of a template context variable containing the user - object whose ID you want. - """ - tokens = token.contents.split() - if len(tokens) < 4: - raise template.TemplateSyntaxError( - "'get_admin_log' statements require two arguments" - ) - if not tokens[1].isdigit(): - raise template.TemplateSyntaxError( - "First argument to 'get_admin_log' must be an integer" - ) - if tokens[2] != "as": - raise template.TemplateSyntaxError( - "Second argument to 'get_admin_log' must be 'as'" - ) - if len(tokens) > 4: - if tokens[4] != "for_user": - raise template.TemplateSyntaxError( - "Fourth argument to 'get_admin_log' must be 'for_user'" - ) - return AdminLogNode( - limit=tokens[1], - varname=tokens[3], - user=(tokens[5] if len(tokens) > 5 else None), - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/admin/tests.py b/.venv/lib/python3.10/site-packages/django/contrib/admin/tests.py deleted file mode 100644 index 636a6ff..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/admin/tests.py +++ /dev/null @@ -1,233 +0,0 @@ -from contextlib import contextmanager - -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from django.test import modify_settings -from django.test.selenium import SeleniumTestCase -from django.utils.deprecation import MiddlewareMixin -from django.utils.translation import gettext as _ - -# Make unittest ignore frames in this module when reporting failures. -__unittest = True - - -class CSPMiddleware(MiddlewareMixin): - """The admin's JavaScript should be compatible with CSP.""" - - def process_response(self, request, response): - response.headers["Content-Security-Policy"] = "default-src 'self'" - return response - - -@modify_settings(MIDDLEWARE={"append": "django.contrib.admin.tests.CSPMiddleware"}) -class AdminSeleniumTestCase(SeleniumTestCase, StaticLiveServerTestCase): - available_apps = [ - "django.contrib.admin", - "django.contrib.auth", - "django.contrib.contenttypes", - "django.contrib.sessions", - "django.contrib.sites", - ] - - def wait_until(self, callback, timeout=10): - """ - Block the execution of the tests until the specified callback returns a - value that is not falsy. This method can be called, for example, after - clicking a link or submitting a form. See the other public methods that - call this function for more details. - """ - from selenium.webdriver.support.wait import WebDriverWait - - WebDriverWait(self.selenium, timeout).until(callback) - - def wait_for_and_switch_to_popup(self, num_windows=2, timeout=10): - """ - Block until `num_windows` are present and are ready (usually 2, but can - be overridden in the case of pop-ups opening other pop-ups). Switch the - current window to the new pop-up. - """ - self.wait_until(lambda d: len(d.window_handles) == num_windows, timeout) - self.selenium.switch_to.window(self.selenium.window_handles[-1]) - self.wait_page_ready() - - def wait_for(self, css_selector, timeout=10): - """ - Block until a CSS selector is found on the page. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - self.wait_until( - ec.presence_of_element_located((By.CSS_SELECTOR, css_selector)), timeout - ) - - def wait_for_text(self, css_selector, text, timeout=10): - """ - Block until the text is found in the CSS selector. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - self.wait_until( - ec.text_to_be_present_in_element((By.CSS_SELECTOR, css_selector), text), - timeout, - ) - - def wait_for_value(self, css_selector, text, timeout=10): - """ - Block until the value is found in the CSS selector. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - self.wait_until( - ec.text_to_be_present_in_element_value( - (By.CSS_SELECTOR, css_selector), text - ), - timeout, - ) - - def wait_until_visible(self, css_selector, timeout=10): - """ - Block until the element described by the CSS selector is visible. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - self.wait_until( - ec.visibility_of_element_located((By.CSS_SELECTOR, css_selector)), timeout - ) - - def wait_until_invisible(self, css_selector, timeout=10): - """ - Block until the element described by the CSS selector is invisible. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - self.wait_until( - ec.invisibility_of_element_located((By.CSS_SELECTOR, css_selector)), timeout - ) - - def wait_page_ready(self, timeout=10): - """ - Block until the page is ready. - """ - self.wait_until( - lambda driver: driver.execute_script("return document.readyState;") - == "complete", - timeout, - ) - - @contextmanager - def wait_page_loaded(self, timeout=10): - """ - Block until a new page has loaded and is ready. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - old_page = self.selenium.find_element(By.TAG_NAME, "html") - yield - # Wait for the next page to be loaded - self.wait_until(ec.staleness_of(old_page), timeout=timeout) - self.wait_page_ready(timeout=timeout) - - def admin_login(self, username, password, login_url="/admin/"): - """ - Log in to the admin. - """ - from selenium.webdriver.common.by import By - - self.selenium.get("%s%s" % (self.live_server_url, login_url)) - username_input = self.selenium.find_element(By.NAME, "username") - username_input.send_keys(username) - password_input = self.selenium.find_element(By.NAME, "password") - password_input.send_keys(password) - login_text = _("Log in") - with self.wait_page_loaded(): - self.selenium.find_element( - By.XPATH, '//input[@value="%s"]' % login_text - ).click() - - def select_option(self, selector, value): - """ - Select the
    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/auth/templates/registration/password_reset_subject.txt b/.venv/lib/python3.10/site-packages/django/contrib/auth/templates/registration/password_reset_subject.txt deleted file mode 100644 index eb30fcb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/auth/templates/registration/password_reset_subject.txt +++ /dev/null @@ -1,3 +0,0 @@ -{% load i18n %}{% autoescape off %} -{% blocktranslate %}Password reset on {{ site_name }}{% endblocktranslate %} -{% endautoescape %} \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/contrib/auth/tokens.py b/.venv/lib/python3.10/site-packages/django/contrib/auth/tokens.py deleted file mode 100644 index 09cc2b5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/auth/tokens.py +++ /dev/null @@ -1,132 +0,0 @@ -from datetime import datetime - -from django.conf import settings -from django.utils.crypto import constant_time_compare, salted_hmac -from django.utils.http import base36_to_int, int_to_base36 - - -class PasswordResetTokenGenerator: - """ - Strategy object used to generate and check tokens for the password - reset mechanism. - """ - - key_salt = "django.contrib.auth.tokens.PasswordResetTokenGenerator" - algorithm = None - _secret = None - _secret_fallbacks = None - - def __init__(self): - self.algorithm = self.algorithm or "sha256" - - def _get_secret(self): - return self._secret or settings.SECRET_KEY - - def _set_secret(self, secret): - self._secret = secret - - secret = property(_get_secret, _set_secret) - - def _get_fallbacks(self): - if self._secret_fallbacks is None: - return settings.SECRET_KEY_FALLBACKS - return self._secret_fallbacks - - def _set_fallbacks(self, fallbacks): - self._secret_fallbacks = fallbacks - - secret_fallbacks = property(_get_fallbacks, _set_fallbacks) - - def make_token(self, user): - """ - Return a token that can be used once to do a password reset - for the given user. - """ - return self._make_token_with_timestamp( - user, - self._num_seconds(self._now()), - self.secret, - ) - - def check_token(self, user, token): - """ - Check that a password reset token is correct for a given user. - """ - if not (user and token): - return False - # Parse the token - try: - ts_b36, _ = token.split("-") - except ValueError: - return False - - try: - ts = base36_to_int(ts_b36) - except ValueError: - return False - - # Check that the timestamp/uid has not been tampered with - for secret in [self.secret, *self.secret_fallbacks]: - if constant_time_compare( - self._make_token_with_timestamp(user, ts, secret), - token, - ): - break - else: - return False - - # Check the timestamp is within limit. - if (self._num_seconds(self._now()) - ts) > settings.PASSWORD_RESET_TIMEOUT: - return False - - return True - - def _make_token_with_timestamp(self, user, timestamp, secret): - # timestamp is number of seconds since 2001-1-1. Converted to base 36, - # this gives us a 6 digit string until about 2069. - ts_b36 = int_to_base36(timestamp) - hash_string = salted_hmac( - self.key_salt, - self._make_hash_value(user, timestamp), - secret=secret, - algorithm=self.algorithm, - ).hexdigest()[ - ::2 - ] # Limit to shorten the URL. - return "%s-%s" % (ts_b36, hash_string) - - def _make_hash_value(self, user, timestamp): - """ - Hash the user's primary key, email (if available), and some user state - that's sure to change after a password reset to produce a token that is - invalidated when it's used: - 1. The password field will change upon a password reset (even if the - same password is chosen, due to password salting). - 2. The last_login field will usually be updated very shortly after - a password reset. - Failing those things, settings.PASSWORD_RESET_TIMEOUT eventually - invalidates the token. - - Running this data through salted_hmac() prevents password cracking - attempts using the reset token, provided the secret isn't compromised. - """ - # Truncate microseconds so that tokens are consistent even if the - # database doesn't support microseconds. - login_timestamp = ( - "" - if user.last_login is None - else user.last_login.replace(microsecond=0, tzinfo=None) - ) - email_field = user.get_email_field_name() - email = getattr(user, email_field, "") or "" - return f"{user.pk}{user.password}{login_timestamp}{timestamp}{email}" - - def _num_seconds(self, dt): - return int((dt - datetime(2001, 1, 1)).total_seconds()) - - def _now(self): - # Used for mocking in tests - return datetime.now() - - -default_token_generator = PasswordResetTokenGenerator() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/auth/urls.py b/.venv/lib/python3.10/site-packages/django/contrib/auth/urls.py deleted file mode 100644 index 699ba61..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/auth/urls.py +++ /dev/null @@ -1,36 +0,0 @@ -# The views used below are normally mapped in the AdminSite instance. -# This URLs file is used to provide a reliable view deployment for test purposes. -# It is also provided as a convenience to those who want to deploy these URLs -# elsewhere. - -from django.contrib.auth import views -from django.urls import path - -urlpatterns = [ - path("login/", views.LoginView.as_view(), name="login"), - path("logout/", views.LogoutView.as_view(), name="logout"), - path( - "password_change/", views.PasswordChangeView.as_view(), name="password_change" - ), - path( - "password_change/done/", - views.PasswordChangeDoneView.as_view(), - name="password_change_done", - ), - path("password_reset/", views.PasswordResetView.as_view(), name="password_reset"), - path( - "password_reset/done/", - views.PasswordResetDoneView.as_view(), - name="password_reset_done", - ), - path( - "reset///", - views.PasswordResetConfirmView.as_view(), - name="password_reset_confirm", - ), - path( - "reset/done/", - views.PasswordResetCompleteView.as_view(), - name="password_reset_complete", - ), -] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/auth/validators.py b/.venv/lib/python3.10/site-packages/django/contrib/auth/validators.py deleted file mode 100644 index bf3894a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/auth/validators.py +++ /dev/null @@ -1,25 +0,0 @@ -import re - -from django.core import validators -from django.utils.deconstruct import deconstructible -from django.utils.translation import gettext_lazy as _ - - -@deconstructible -class ASCIIUsernameValidator(validators.RegexValidator): - regex = r"^[\w.@+-]+\Z" - message = _( - "Enter a valid username. This value may contain only unaccented lowercase a-z " - "and uppercase A-Z letters, numbers, and @/./+/-/_ characters." - ) - flags = re.ASCII - - -@deconstructible -class UnicodeUsernameValidator(validators.RegexValidator): - regex = r"^[\w.@+-]+\Z" - message = _( - "Enter a valid username. This value may contain only letters, " - "numbers, and @/./+/-/_ characters." - ) - flags = 0 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/auth/views.py b/.venv/lib/python3.10/site-packages/django/contrib/auth/views.py deleted file mode 100644 index cd810a1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/auth/views.py +++ /dev/null @@ -1,385 +0,0 @@ -from urllib.parse import urlsplit, urlunsplit - -from django.conf import settings - -# Avoid shadowing the login() and logout() views below. -from django.contrib.auth import REDIRECT_FIELD_NAME, get_user_model -from django.contrib.auth import login as auth_login -from django.contrib.auth import logout as auth_logout -from django.contrib.auth import update_session_auth_hash -from django.contrib.auth.decorators import login_not_required, login_required -from django.contrib.auth.forms import ( - AuthenticationForm, - PasswordChangeForm, - PasswordResetForm, - SetPasswordForm, -) -from django.contrib.auth.tokens import default_token_generator -from django.contrib.sites.shortcuts import get_current_site -from django.core.exceptions import ImproperlyConfigured, ValidationError -from django.http import HttpResponseRedirect, QueryDict -from django.shortcuts import resolve_url -from django.urls import reverse_lazy -from django.utils.decorators import method_decorator -from django.utils.http import url_has_allowed_host_and_scheme, urlsafe_base64_decode -from django.utils.translation import gettext_lazy as _ -from django.views.decorators.cache import never_cache -from django.views.decorators.csrf import csrf_protect -from django.views.decorators.debug import sensitive_post_parameters -from django.views.generic.base import TemplateView -from django.views.generic.edit import FormView - -UserModel = get_user_model() - - -class RedirectURLMixin: - next_page = None - redirect_field_name = REDIRECT_FIELD_NAME - success_url_allowed_hosts = set() - - def get_success_url(self): - return self.get_redirect_url() or self.get_default_redirect_url() - - def get_redirect_url(self): - """Return the user-originating redirect URL if it's safe.""" - redirect_to = self.request.POST.get( - self.redirect_field_name, self.request.GET.get(self.redirect_field_name) - ) - url_is_safe = url_has_allowed_host_and_scheme( - url=redirect_to, - allowed_hosts=self.get_success_url_allowed_hosts(), - require_https=self.request.is_secure(), - ) - return redirect_to if url_is_safe else "" - - def get_success_url_allowed_hosts(self): - return {self.request.get_host(), *self.success_url_allowed_hosts} - - def get_default_redirect_url(self): - """Return the default redirect URL.""" - if self.next_page: - return resolve_url(self.next_page) - raise ImproperlyConfigured("No URL to redirect to. Provide a next_page.") - - -@method_decorator(login_not_required, name="dispatch") -class LoginView(RedirectURLMixin, FormView): - """ - Display the login form and handle the login action. - """ - - form_class = AuthenticationForm - authentication_form = None - template_name = "registration/login.html" - redirect_authenticated_user = False - extra_context = None - - @method_decorator(sensitive_post_parameters()) - @method_decorator(csrf_protect) - @method_decorator(never_cache) - def dispatch(self, request, *args, **kwargs): - if self.redirect_authenticated_user and self.request.user.is_authenticated: - redirect_to = self.get_success_url() - if redirect_to == self.request.path: - raise ValueError( - "Redirection loop for authenticated user detected. Check that " - "your LOGIN_REDIRECT_URL doesn't point to a login page." - ) - return HttpResponseRedirect(redirect_to) - return super().dispatch(request, *args, **kwargs) - - def get_default_redirect_url(self): - """Return the default redirect URL.""" - if self.next_page: - return resolve_url(self.next_page) - else: - return resolve_url(settings.LOGIN_REDIRECT_URL) - - def get_form_class(self): - return self.authentication_form or self.form_class - - def get_form_kwargs(self): - kwargs = super().get_form_kwargs() - kwargs["request"] = self.request - return kwargs - - def form_valid(self, form): - """Security check complete. Log the user in.""" - auth_login(self.request, form.get_user()) - return HttpResponseRedirect(self.get_success_url()) - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - current_site = get_current_site(self.request) - context.update( - { - self.redirect_field_name: self.get_redirect_url(), - "site": current_site, - "site_name": current_site.name, - **(self.extra_context or {}), - } - ) - return context - - -class LogoutView(RedirectURLMixin, TemplateView): - """ - Log out the user and display the 'You are logged out' message. - """ - - http_method_names = ["post", "options"] - template_name = "registration/logged_out.html" - extra_context = None - - @method_decorator(csrf_protect) - @method_decorator(never_cache) - def dispatch(self, request, *args, **kwargs): - return super().dispatch(request, *args, **kwargs) - - def post(self, request, *args, **kwargs): - """Logout may be done via POST.""" - auth_logout(request) - redirect_to = self.get_success_url() - if redirect_to != request.get_full_path(): - # Redirect to target page once the session has been cleared. - return HttpResponseRedirect(redirect_to) - return super().get(request, *args, **kwargs) - - def get_default_redirect_url(self): - """Return the default redirect URL.""" - if self.next_page: - return resolve_url(self.next_page) - elif settings.LOGOUT_REDIRECT_URL: - return resolve_url(settings.LOGOUT_REDIRECT_URL) - else: - return self.request.path - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - current_site = get_current_site(self.request) - context.update( - { - "site": current_site, - "site_name": current_site.name, - "title": _("Logged out"), - "subtitle": None, - **(self.extra_context or {}), - } - ) - return context - - -def logout_then_login(request, login_url=None): - """ - Log out the user if they are logged in. Then redirect to the login page. - """ - login_url = resolve_url(login_url or settings.LOGIN_URL) - return LogoutView.as_view(next_page=login_url)(request) - - -def redirect_to_login(next, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME): - """ - Redirect the user to the login page, passing the given 'next' page. - """ - resolved_url = resolve_url(login_url or settings.LOGIN_URL) - - login_url_parts = list(urlsplit(resolved_url)) - if redirect_field_name: - querystring = QueryDict(login_url_parts[3], mutable=True) - querystring[redirect_field_name] = next - login_url_parts[3] = querystring.urlencode(safe="/") - - return HttpResponseRedirect(urlunsplit(login_url_parts)) - - -# Class-based password reset views -# - PasswordResetView sends the mail -# - PasswordResetDoneView shows a success message for the above -# - PasswordResetConfirmView checks the link the user clicked and -# prompts for a new password -# - PasswordResetCompleteView shows a success message for the above - - -class PasswordContextMixin: - extra_context = None - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context.update( - {"title": self.title, "subtitle": None, **(self.extra_context or {})} - ) - return context - - -@method_decorator(login_not_required, name="dispatch") -class PasswordResetView(PasswordContextMixin, FormView): - email_template_name = "registration/password_reset_email.html" - extra_email_context = None - form_class = PasswordResetForm - from_email = None - html_email_template_name = None - subject_template_name = "registration/password_reset_subject.txt" - success_url = reverse_lazy("password_reset_done") - template_name = "registration/password_reset_form.html" - title = _("Password reset") - token_generator = default_token_generator - - @method_decorator(csrf_protect) - def dispatch(self, *args, **kwargs): - return super().dispatch(*args, **kwargs) - - def form_valid(self, form): - opts = { - "use_https": self.request.is_secure(), - "token_generator": self.token_generator, - "from_email": self.from_email, - "email_template_name": self.email_template_name, - "subject_template_name": self.subject_template_name, - "request": self.request, - "html_email_template_name": self.html_email_template_name, - "extra_email_context": self.extra_email_context, - } - form.save(**opts) - return super().form_valid(form) - - -INTERNAL_RESET_SESSION_TOKEN = "_password_reset_token" - - -@method_decorator(login_not_required, name="dispatch") -class PasswordResetDoneView(PasswordContextMixin, TemplateView): - template_name = "registration/password_reset_done.html" - title = _("Password reset sent") - - -@method_decorator(login_not_required, name="dispatch") -class PasswordResetConfirmView(PasswordContextMixin, FormView): - form_class = SetPasswordForm - post_reset_login = False - post_reset_login_backend = None - reset_url_token = "set-password" - success_url = reverse_lazy("password_reset_complete") - template_name = "registration/password_reset_confirm.html" - title = _("Enter new password") - token_generator = default_token_generator - - @method_decorator(sensitive_post_parameters()) - @method_decorator(never_cache) - def dispatch(self, *args, **kwargs): - if "uidb64" not in kwargs or "token" not in kwargs: - raise ImproperlyConfigured( - "The URL path must contain 'uidb64' and 'token' parameters." - ) - - self.validlink = False - self.user = self.get_user(kwargs["uidb64"]) - - if self.user is not None: - token = kwargs["token"] - if token == self.reset_url_token: - session_token = self.request.session.get(INTERNAL_RESET_SESSION_TOKEN) - if self.token_generator.check_token(self.user, session_token): - # If the token is valid, display the password reset form. - self.validlink = True - return super().dispatch(*args, **kwargs) - else: - if self.token_generator.check_token(self.user, token): - # Store the token in the session and redirect to the - # password reset form at a URL without the token. That - # avoids the possibility of leaking the token in the - # HTTP Referer header. - self.request.session[INTERNAL_RESET_SESSION_TOKEN] = token - redirect_url = self.request.path.replace( - token, self.reset_url_token - ) - return HttpResponseRedirect(redirect_url) - - # Display the "Password reset unsuccessful" page. - return self.render_to_response(self.get_context_data()) - - def get_user(self, uidb64): - try: - # urlsafe_base64_decode() decodes to bytestring - uid = urlsafe_base64_decode(uidb64).decode() - pk = UserModel._meta.pk.to_python(uid) - user = UserModel._default_manager.get(pk=pk) - except ( - TypeError, - ValueError, - OverflowError, - UserModel.DoesNotExist, - ValidationError, - ): - user = None - return user - - def get_form_kwargs(self): - kwargs = super().get_form_kwargs() - kwargs["user"] = self.user - return kwargs - - def form_valid(self, form): - user = form.save() - del self.request.session[INTERNAL_RESET_SESSION_TOKEN] - if self.post_reset_login: - auth_login(self.request, user, self.post_reset_login_backend) - return super().form_valid(form) - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - if self.validlink: - context["validlink"] = True - else: - context.update( - { - "form": None, - "title": _("Password reset unsuccessful"), - "validlink": False, - } - ) - return context - - -@method_decorator(login_not_required, name="dispatch") -class PasswordResetCompleteView(PasswordContextMixin, TemplateView): - template_name = "registration/password_reset_complete.html" - title = _("Password reset complete") - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["login_url"] = resolve_url(settings.LOGIN_URL) - return context - - -class PasswordChangeView(PasswordContextMixin, FormView): - form_class = PasswordChangeForm - success_url = reverse_lazy("password_change_done") - template_name = "registration/password_change_form.html" - title = _("Password change") - - @method_decorator(sensitive_post_parameters()) - @method_decorator(csrf_protect) - @method_decorator(login_required) - def dispatch(self, *args, **kwargs): - return super().dispatch(*args, **kwargs) - - def get_form_kwargs(self): - kwargs = super().get_form_kwargs() - kwargs["user"] = self.request.user - return kwargs - - def form_valid(self, form): - form.save() - # Updating the password logs out all other sessions for the user - # except the current one. - update_session_auth_hash(self.request, form.user) - return super().form_valid(form) - - -class PasswordChangeDoneView(PasswordContextMixin, TemplateView): - template_name = "registration/password_change_done.html" - title = _("Password change successful") - - @method_decorator(login_required) - def dispatch(self, *args, **kwargs): - return super().dispatch(*args, **kwargs) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/admin.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/admin.py deleted file mode 100644 index 617d6d2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/admin.py +++ /dev/null @@ -1,143 +0,0 @@ -from functools import partial - -from django.contrib.admin.checks import InlineModelAdminChecks -from django.contrib.admin.options import InlineModelAdmin, flatten_fieldsets -from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.forms import ( - BaseGenericInlineFormSet, - generic_inlineformset_factory, -) -from django.core import checks -from django.core.exceptions import FieldDoesNotExist -from django.forms import ALL_FIELDS -from django.forms.models import modelform_defines_fields - - -class GenericInlineModelAdminChecks(InlineModelAdminChecks): - def _check_exclude_of_parent_model(self, obj, parent_model): - # There's no FK to exclude, so no exclusion checks are required. - return [] - - def _check_relation(self, obj, parent_model): - # There's no FK, but we do need to confirm that the ct_field and - # ct_fk_field are valid, and that they are part of a GenericForeignKey. - - gfks = [ - f - for f in obj.model._meta.private_fields - if isinstance(f, GenericForeignKey) - ] - if not gfks: - return [ - checks.Error( - "'%s' has no GenericForeignKey." % obj.model._meta.label, - obj=obj.__class__, - id="admin.E301", - ) - ] - else: - # Check that the ct_field and ct_fk_fields exist - try: - obj.model._meta.get_field(obj.ct_field) - except FieldDoesNotExist: - return [ - checks.Error( - "'ct_field' references '%s', which is not a field on '%s'." - % ( - obj.ct_field, - obj.model._meta.label, - ), - obj=obj.__class__, - id="admin.E302", - ) - ] - - try: - obj.model._meta.get_field(obj.ct_fk_field) - except FieldDoesNotExist: - return [ - checks.Error( - "'ct_fk_field' references '%s', which is not a field on '%s'." - % ( - obj.ct_fk_field, - obj.model._meta.label, - ), - obj=obj.__class__, - id="admin.E303", - ) - ] - - # There's one or more GenericForeignKeys; make sure that one of them - # uses the right ct_field and ct_fk_field. - for gfk in gfks: - if gfk.ct_field == obj.ct_field and gfk.fk_field == obj.ct_fk_field: - return [] - - return [ - checks.Error( - "'%s' has no GenericForeignKey using content type field '%s' and " - "object ID field '%s'." - % ( - obj.model._meta.label, - obj.ct_field, - obj.ct_fk_field, - ), - obj=obj.__class__, - id="admin.E304", - ) - ] - - -class GenericInlineModelAdmin(InlineModelAdmin): - ct_field = "content_type" - ct_fk_field = "object_id" - formset = BaseGenericInlineFormSet - - checks_class = GenericInlineModelAdminChecks - - def get_formset(self, request, obj=None, **kwargs): - if "fields" in kwargs: - fields = kwargs.pop("fields") - else: - fields = flatten_fieldsets(self.get_fieldsets(request, obj)) - exclude = [*(self.exclude or []), *self.get_readonly_fields(request, obj)] - if ( - self.exclude is None - and hasattr(self.form, "_meta") - and self.form._meta.exclude - ): - # Take the custom ModelForm's Meta.exclude into account only if the - # GenericInlineModelAdmin doesn't define its own. - exclude.extend(self.form._meta.exclude) - exclude = exclude or None - can_delete = self.can_delete and self.has_delete_permission(request, obj) - defaults = { - "ct_field": self.ct_field, - "fk_field": self.ct_fk_field, - "form": self.form, - "formfield_callback": partial(self.formfield_for_dbfield, request=request), - "formset": self.formset, - "extra": self.get_extra(request, obj), - "can_delete": can_delete, - "can_order": False, - "fields": fields, - "min_num": self.get_min_num(request, obj), - "max_num": self.get_max_num(request, obj), - "exclude": exclude, - **kwargs, - } - - if defaults["fields"] is None and not modelform_defines_fields( - defaults["form"] - ): - defaults["fields"] = ALL_FIELDS - - return generic_inlineformset_factory(self.model, **defaults) - - -class GenericStackedInline(GenericInlineModelAdmin): - template = "admin/edit_inline/stacked.html" - - -class GenericTabularInline(GenericInlineModelAdmin): - template = "admin/edit_inline/tabular.html" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/apps.py deleted file mode 100644 index 11dfb91..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/apps.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.apps import AppConfig -from django.contrib.contenttypes.checks import ( - check_generic_foreign_keys, - check_model_name_lengths, -) -from django.core import checks -from django.db.models.signals import post_migrate, pre_migrate -from django.utils.translation import gettext_lazy as _ - -from .management import create_contenttypes, inject_rename_contenttypes_operations - - -class ContentTypesConfig(AppConfig): - default_auto_field = "django.db.models.AutoField" - name = "django.contrib.contenttypes" - verbose_name = _("Content Types") - - def ready(self): - pre_migrate.connect(inject_rename_contenttypes_operations, sender=self) - post_migrate.connect(create_contenttypes) - checks.register(check_generic_foreign_keys, checks.Tags.models) - checks.register(check_model_name_lengths, checks.Tags.models) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/checks.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/checks.py deleted file mode 100644 index 753c5d2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/checks.py +++ /dev/null @@ -1,46 +0,0 @@ -from itertools import chain - -from django.apps import apps -from django.core.checks import Error - - -def check_generic_foreign_keys(app_configs=None, **kwargs): - from .fields import GenericForeignKey - - if app_configs is None: - models = apps.get_models() - else: - models = chain.from_iterable( - app_config.get_models() for app_config in app_configs - ) - errors = [] - fields = ( - obj - for model in models - for obj in vars(model).values() - if isinstance(obj, GenericForeignKey) - ) - for field in fields: - errors.extend(field.check()) - return errors - - -def check_model_name_lengths(app_configs=None, **kwargs): - if app_configs is None: - models = apps.get_models() - else: - models = chain.from_iterable( - app_config.get_models() for app_config in app_configs - ) - errors = [] - for model in models: - if len(model._meta.model_name) > 100: - errors.append( - Error( - "Model names must be at most 100 characters (got %d)." - % (len(model._meta.model_name),), - obj=model, - id="contenttypes.E005", - ) - ) - return errors diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/fields.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/fields.py deleted file mode 100644 index 4905fd1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/fields.py +++ /dev/null @@ -1,842 +0,0 @@ -import functools -import itertools -import warnings -from collections import defaultdict - -from asgiref.sync import sync_to_async - -from django.contrib.contenttypes.models import ContentType -from django.core import checks -from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist -from django.db import DEFAULT_DB_ALIAS, models, router, transaction -from django.db.models import DO_NOTHING, ForeignObject, ForeignObjectRel -from django.db.models.base import ModelBase, make_foreign_order_accessors -from django.db.models.fields import Field -from django.db.models.fields.mixins import FieldCacheMixin -from django.db.models.fields.related import ( - ReverseManyToOneDescriptor, - lazy_related_operation, -) -from django.db.models.query_utils import PathInfo -from django.db.models.sql import AND -from django.db.models.sql.where import WhereNode -from django.db.models.utils import AltersData -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.functional import cached_property - - -class GenericForeignKey(FieldCacheMixin, Field): - """ - Provide a generic many-to-one relation through the ``content_type`` and - ``object_id`` fields. - - This class also doubles as an accessor to the related object (similar to - ForwardManyToOneDescriptor) by adding itself as a model attribute. - """ - - many_to_many = False - many_to_one = True - one_to_many = False - one_to_one = False - - def __init__( - self, ct_field="content_type", fk_field="object_id", for_concrete_model=True - ): - super().__init__(editable=False) - self.ct_field = ct_field - self.fk_field = fk_field - self.for_concrete_model = for_concrete_model - self.is_relation = True - - def contribute_to_class(self, cls, name, **kwargs): - super().contribute_to_class(cls, name, private_only=True, **kwargs) - # GenericForeignKey is its own descriptor. - setattr(cls, self.attname, self) - - def get_attname_column(self): - attname, column = super().get_attname_column() - return attname, None - - def get_filter_kwargs_for_object(self, obj): - """See corresponding method on Field""" - return { - self.fk_field: getattr(obj, self.fk_field), - self.ct_field: getattr(obj, self.ct_field), - } - - def get_forward_related_filter(self, obj): - """See corresponding method on RelatedField""" - return { - self.fk_field: obj.pk, - self.ct_field: ContentType.objects.get_for_model(obj).pk, - } - - def check(self, **kwargs): - return [ - *self._check_field_name(), - *self._check_object_id_field(), - *self._check_content_type_field(), - ] - - def _check_object_id_field(self): - try: - self.model._meta.get_field(self.fk_field) - except FieldDoesNotExist: - return [ - checks.Error( - "The GenericForeignKey object ID references the " - "nonexistent field '%s'." % self.fk_field, - obj=self, - id="contenttypes.E001", - ) - ] - else: - return [] - - def _check_content_type_field(self): - """ - Check if field named `field_name` in model `model` exists and is a - valid content_type field (is a ForeignKey to ContentType). - """ - try: - field = self.model._meta.get_field(self.ct_field) - except FieldDoesNotExist: - return [ - checks.Error( - "The GenericForeignKey content type references the " - "nonexistent field '%s.%s'." - % (self.model._meta.object_name, self.ct_field), - obj=self, - id="contenttypes.E002", - ) - ] - else: - if not isinstance(field, models.ForeignKey): - return [ - checks.Error( - "'%s.%s' is not a ForeignKey." - % (self.model._meta.object_name, self.ct_field), - hint=( - "GenericForeignKeys must use a ForeignKey to " - "'contenttypes.ContentType' as the 'content_type' field." - ), - obj=self, - id="contenttypes.E003", - ) - ] - elif field.remote_field.model != ContentType: - return [ - checks.Error( - "'%s.%s' is not a ForeignKey to 'contenttypes.ContentType'." - % (self.model._meta.object_name, self.ct_field), - hint=( - "GenericForeignKeys must use a ForeignKey to " - "'contenttypes.ContentType' as the 'content_type' field." - ), - obj=self, - id="contenttypes.E004", - ) - ] - else: - return [] - - @cached_property - def cache_name(self): - return self.name - - def get_content_type(self, obj=None, id=None, using=None, model=None): - if obj is not None: - return ContentType.objects.db_manager(obj._state.db).get_for_model( - obj, for_concrete_model=self.for_concrete_model - ) - elif id is not None: - return ContentType.objects.db_manager(using).get_for_id(id) - elif model is not None: - return ContentType.objects.db_manager(using).get_for_model( - model, for_concrete_model=self.for_concrete_model - ) - else: - # This should never happen. I love comments like this, don't you? - raise Exception("Impossible arguments to GFK.get_content_type!") - - def get_prefetch_queryset(self, instances, queryset=None): - warnings.warn( - "get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() " - "instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - if queryset is None: - return self.get_prefetch_querysets(instances) - return self.get_prefetch_querysets(instances, [queryset]) - - def get_prefetch_querysets(self, instances, querysets=None): - custom_queryset_dict = {} - if querysets is not None: - for queryset in querysets: - ct_id = self.get_content_type( - model=queryset.query.model, using=queryset.db - ).pk - if ct_id in custom_queryset_dict: - raise ValueError( - "Only one queryset is allowed for each content type." - ) - custom_queryset_dict[ct_id] = queryset - - # For efficiency, group the instances by content type and then do one - # query per model - fk_dict = defaultdict(set) - # We need one instance for each group in order to get the right db: - instance_dict = {} - ct_attname = self.model._meta.get_field(self.ct_field).attname - for instance in instances: - # We avoid looking for values if either ct_id or fkey value is None - ct_id = getattr(instance, ct_attname) - if ct_id is not None: - fk_val = getattr(instance, self.fk_field) - if fk_val is not None: - fk_dict[ct_id].add(fk_val) - instance_dict[ct_id] = instance - - ret_val = [] - for ct_id, fkeys in fk_dict.items(): - if ct_id in custom_queryset_dict: - # Return values from the custom queryset, if provided. - ret_val.extend(custom_queryset_dict[ct_id].filter(pk__in=fkeys)) - else: - instance = instance_dict[ct_id] - ct = self.get_content_type(id=ct_id, using=instance._state.db) - ret_val.extend(ct.get_all_objects_for_this_type(pk__in=fkeys)) - - # For doing the join in Python, we have to match both the FK val and the - # content type, so we use a callable that returns a (fk, class) pair. - def gfk_key(obj): - ct_id = getattr(obj, ct_attname) - if ct_id is None: - return None - else: - model = self.get_content_type( - id=ct_id, using=obj._state.db - ).model_class() - return ( - model._meta.pk.get_prep_value(getattr(obj, self.fk_field)), - model, - ) - - return ( - ret_val, - lambda obj: (obj.pk, obj.__class__), - gfk_key, - True, - self.name, - False, - ) - - def __get__(self, instance, cls=None): - if instance is None: - return self - - # Don't use getattr(instance, self.ct_field) here because that might - # reload the same ContentType over and over (#5570). Instead, get the - # content type ID here, and later when the actual instance is needed, - # use ContentType.objects.get_for_id(), which has a global cache. - f = self.model._meta.get_field(self.ct_field) - ct_id = getattr(instance, f.attname, None) - pk_val = getattr(instance, self.fk_field) - - rel_obj = self.get_cached_value(instance, default=None) - if rel_obj is None and self.is_cached(instance): - return rel_obj - if rel_obj is not None: - ct_match = ( - ct_id == self.get_content_type(obj=rel_obj, using=instance._state.db).id - ) - pk_match = ct_match and rel_obj._meta.pk.to_python(pk_val) == rel_obj.pk - if pk_match: - return rel_obj - else: - rel_obj = None - if ct_id is not None: - ct = self.get_content_type(id=ct_id, using=instance._state.db) - try: - rel_obj = ct.get_object_for_this_type( - using=instance._state.db, pk=pk_val - ) - except ObjectDoesNotExist: - pass - self.set_cached_value(instance, rel_obj) - return rel_obj - - def __set__(self, instance, value): - ct = None - fk = None - if value is not None: - ct = self.get_content_type(obj=value) - fk = value.pk - - setattr(instance, self.ct_field, ct) - setattr(instance, self.fk_field, fk) - self.set_cached_value(instance, value) - - -class GenericRel(ForeignObjectRel): - """ - Used by GenericRelation to store information about the relation. - """ - - def __init__( - self, - field, - to, - related_name=None, - related_query_name=None, - limit_choices_to=None, - ): - super().__init__( - field, - to, - related_name=related_query_name or "+", - related_query_name=related_query_name, - limit_choices_to=limit_choices_to, - on_delete=DO_NOTHING, - ) - - -class GenericRelation(ForeignObject): - """ - Provide a reverse to a relation created by a GenericForeignKey. - """ - - # Field flags - auto_created = False - empty_strings_allowed = False - - many_to_many = False - many_to_one = False - one_to_many = True - one_to_one = False - - rel_class = GenericRel - - mti_inherited = False - - def __init__( - self, - to, - object_id_field="object_id", - content_type_field="content_type", - for_concrete_model=True, - related_query_name=None, - limit_choices_to=None, - **kwargs, - ): - kwargs["rel"] = self.rel_class( - self, - to, - related_query_name=related_query_name, - limit_choices_to=limit_choices_to, - ) - - # Reverse relations are always nullable (Django can't enforce that a - # foreign key on the related model points to this model). - kwargs["null"] = True - kwargs["blank"] = True - kwargs["on_delete"] = models.CASCADE - kwargs["editable"] = False - kwargs["serialize"] = False - - # This construct is somewhat of an abuse of ForeignObject. This field - # represents a relation from pk to object_id field. But, this relation - # isn't direct, the join is generated reverse along foreign key. So, - # the from_field is object_id field, to_field is pk because of the - # reverse join. - super().__init__(to, from_fields=[object_id_field], to_fields=[], **kwargs) - - self.object_id_field_name = object_id_field - self.content_type_field_name = content_type_field - self.for_concrete_model = for_concrete_model - - def check(self, **kwargs): - return [ - *super().check(**kwargs), - *self._check_generic_foreign_key_existence(), - ] - - def _is_matching_generic_foreign_key(self, field): - """ - Return True if field is a GenericForeignKey whose content type and - object id fields correspond to the equivalent attributes on this - GenericRelation. - """ - return ( - isinstance(field, GenericForeignKey) - and field.ct_field == self.content_type_field_name - and field.fk_field == self.object_id_field_name - ) - - def _check_generic_foreign_key_existence(self): - target = self.remote_field.model - if isinstance(target, ModelBase): - fields = target._meta.private_fields - if any(self._is_matching_generic_foreign_key(field) for field in fields): - return [] - else: - return [ - checks.Error( - "The GenericRelation defines a relation with the model " - "'%s', but that model does not have a GenericForeignKey." - % target._meta.label, - obj=self, - id="contenttypes.E004", - ) - ] - else: - return [] - - def resolve_related_fields(self): - self.to_fields = [self.model._meta.pk.name] - return [ - ( - self.remote_field.model._meta.get_field(self.object_id_field_name), - self.model._meta.pk, - ) - ] - - def get_local_related_value(self, instance): - return self.get_instance_value_for_fields(instance, self.foreign_related_fields) - - def get_foreign_related_value(self, instance): - # We (possibly) need to convert object IDs to the type of the - # instances' PK in order to match up instances during prefetching. - return tuple( - foreign_field.to_python(val) - for foreign_field, val in zip( - self.foreign_related_fields, - self.get_instance_value_for_fields(instance, self.local_related_fields), - ) - ) - - def _get_path_info_with_parent(self, filtered_relation): - """ - Return the path that joins the current model through any parent models. - The idea is that if you have a GFK defined on a parent model then we - need to join the parent model first, then the child model. - """ - # With an inheritance chain ChildTag -> Tag and Tag defines the - # GenericForeignKey, and a TaggedItem model has a GenericRelation to - # ChildTag, then we need to generate a join from TaggedItem to Tag - # (as Tag.object_id == TaggedItem.pk), and another join from Tag to - # ChildTag (as that is where the relation is to). Do this by first - # generating a join to the parent model, then generating joins to the - # child models. - path = [] - opts = self.remote_field.model._meta.concrete_model._meta - parent_opts = opts.get_field(self.object_id_field_name).model._meta - target = parent_opts.pk - path.append( - PathInfo( - from_opts=self.model._meta, - to_opts=parent_opts, - target_fields=(target,), - join_field=self.remote_field, - m2m=True, - direct=False, - filtered_relation=filtered_relation, - ) - ) - # Collect joins needed for the parent -> child chain. This is easiest - # to do if we collect joins for the child -> parent chain and then - # reverse the direction (call to reverse() and use of - # field.remote_field.get_path_info()). - parent_field_chain = [] - while parent_opts != opts: - field = opts.get_ancestor_link(parent_opts.model) - parent_field_chain.append(field) - opts = field.remote_field.model._meta - parent_field_chain.reverse() - for field in parent_field_chain: - path.extend(field.remote_field.path_infos) - return path - - def get_path_info(self, filtered_relation=None): - opts = self.remote_field.model._meta - object_id_field = opts.get_field(self.object_id_field_name) - if object_id_field.model != opts.model: - return self._get_path_info_with_parent(filtered_relation) - else: - target = opts.pk - return [ - PathInfo( - from_opts=self.model._meta, - to_opts=opts, - target_fields=(target,), - join_field=self.remote_field, - m2m=True, - direct=False, - filtered_relation=filtered_relation, - ) - ] - - def get_reverse_path_info(self, filtered_relation=None): - opts = self.model._meta - from_opts = self.remote_field.model._meta - return [ - PathInfo( - from_opts=from_opts, - to_opts=opts, - target_fields=(opts.pk,), - join_field=self, - m2m=False, - direct=False, - filtered_relation=filtered_relation, - ) - ] - - def value_to_string(self, obj): - qs = getattr(obj, self.name).all() - return str([instance.pk for instance in qs]) - - def contribute_to_class(self, cls, name, **kwargs): - kwargs["private_only"] = True - super().contribute_to_class(cls, name, **kwargs) - self.model = cls - # Disable the reverse relation for fields inherited by subclasses of a - # model in multi-table inheritance. The reverse relation points to the - # field of the base model. - if self.mti_inherited: - self.remote_field.related_name = "+" - self.remote_field.related_query_name = None - setattr(cls, self.name, ReverseGenericManyToOneDescriptor(self.remote_field)) - - # Add get_RELATED_order() and set_RELATED_order() to the model this - # field belongs to, if the model on the other end of this relation - # is ordered with respect to its corresponding GenericForeignKey. - if not cls._meta.abstract: - - def make_generic_foreign_order_accessors(related_model, model): - if self._is_matching_generic_foreign_key( - model._meta.order_with_respect_to - ): - make_foreign_order_accessors(model, related_model) - - lazy_related_operation( - make_generic_foreign_order_accessors, - self.model, - self.remote_field.model, - ) - - def set_attributes_from_rel(self): - pass - - def get_internal_type(self): - return "ManyToManyField" - - def get_content_type(self): - """ - Return the content type associated with this field's model. - """ - return ContentType.objects.get_for_model( - self.model, for_concrete_model=self.for_concrete_model - ) - - def get_extra_restriction(self, alias, remote_alias): - field = self.remote_field.model._meta.get_field(self.content_type_field_name) - contenttype_pk = self.get_content_type().pk - lookup = field.get_lookup("exact")(field.get_col(remote_alias), contenttype_pk) - return WhereNode([lookup], connector=AND) - - def bulk_related_objects(self, objs, using=DEFAULT_DB_ALIAS): - """ - Return all objects related to ``objs`` via this ``GenericRelation``. - """ - return self.remote_field.model._base_manager.db_manager(using).filter( - **{ - "%s__pk" - % self.content_type_field_name: ContentType.objects.db_manager(using) - .get_for_model(self.model, for_concrete_model=self.for_concrete_model) - .pk, - "%s__in" % self.object_id_field_name: [obj.pk for obj in objs], - } - ) - - -class ReverseGenericManyToOneDescriptor(ReverseManyToOneDescriptor): - """ - Accessor to the related objects manager on the one-to-many relation created - by GenericRelation. - - In the example:: - - class Post(Model): - comments = GenericRelation(Comment) - - ``post.comments`` is a ReverseGenericManyToOneDescriptor instance. - """ - - @cached_property - def related_manager_cls(self): - return create_generic_related_manager( - self.rel.model._default_manager.__class__, - self.rel, - ) - - -def create_generic_related_manager(superclass, rel): - """ - Factory function to create a manager that subclasses another manager - (generally the default manager of a given model) and adds behaviors - specific to generic relations. - """ - - class GenericRelatedObjectManager(superclass, AltersData): - def __init__(self, instance=None): - super().__init__() - - self.instance = instance - - self.model = rel.model - self.get_content_type = functools.partial( - ContentType.objects.db_manager(instance._state.db).get_for_model, - for_concrete_model=rel.field.for_concrete_model, - ) - self.content_type = self.get_content_type(instance) - self.content_type_field_name = rel.field.content_type_field_name - self.object_id_field_name = rel.field.object_id_field_name - self.prefetch_cache_name = rel.field.attname - self.pk_val = instance.pk - - self.core_filters = { - "%s__pk" % self.content_type_field_name: self.content_type.id, - self.object_id_field_name: self.pk_val, - } - - def __call__(self, *, manager): - manager = getattr(self.model, manager) - manager_class = create_generic_related_manager(manager.__class__, rel) - return manager_class(instance=self.instance) - - do_not_call_in_templates = True - - def __str__(self): - return repr(self) - - def _apply_rel_filters(self, queryset): - """ - Filter the queryset for the instance this manager is bound to. - """ - db = self._db or router.db_for_read(self.model, instance=self.instance) - return queryset.using(db).filter(**self.core_filters) - - def _remove_prefetched_objects(self): - try: - self.instance._prefetched_objects_cache.pop(self.prefetch_cache_name) - except (AttributeError, KeyError): - pass # nothing to clear from cache - - def get_queryset(self): - try: - return self.instance._prefetched_objects_cache[self.prefetch_cache_name] - except (AttributeError, KeyError): - queryset = super().get_queryset() - return self._apply_rel_filters(queryset) - - def get_prefetch_queryset(self, instances, queryset=None): - warnings.warn( - "get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() " - "instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - if queryset is None: - return self.get_prefetch_querysets(instances) - return self.get_prefetch_querysets(instances, [queryset]) - - def get_prefetch_querysets(self, instances, querysets=None): - if querysets and len(querysets) != 1: - raise ValueError( - "querysets argument of get_prefetch_querysets() should have a " - "length of 1." - ) - queryset = querysets[0] if querysets else super().get_queryset() - queryset._add_hints(instance=instances[0]) - queryset = queryset.using(queryset._db or self._db) - # Group instances by content types. - content_type_queries = [ - models.Q.create( - [ - (f"{self.content_type_field_name}__pk", content_type_id), - (f"{self.object_id_field_name}__in", {obj.pk for obj in objs}), - ] - ) - for content_type_id, objs in itertools.groupby( - sorted(instances, key=lambda obj: self.get_content_type(obj).pk), - lambda obj: self.get_content_type(obj).pk, - ) - ] - query = models.Q.create(content_type_queries, connector=models.Q.OR) - # We (possibly) need to convert object IDs to the type of the - # instances' PK in order to match up instances: - object_id_converter = instances[0]._meta.pk.to_python - content_type_id_field_name = "%s_id" % self.content_type_field_name - return ( - queryset.filter(query), - lambda relobj: ( - object_id_converter(getattr(relobj, self.object_id_field_name)), - getattr(relobj, content_type_id_field_name), - ), - lambda obj: (obj.pk, self.get_content_type(obj).pk), - False, - self.prefetch_cache_name, - False, - ) - - def add(self, *objs, bulk=True): - self._remove_prefetched_objects() - db = router.db_for_write(self.model, instance=self.instance) - - def check_and_update_obj(obj): - if not isinstance(obj, self.model): - raise TypeError( - "'%s' instance expected, got %r" - % (self.model._meta.object_name, obj) - ) - setattr(obj, self.content_type_field_name, self.content_type) - setattr(obj, self.object_id_field_name, self.pk_val) - - if bulk: - pks = [] - for obj in objs: - if obj._state.adding or obj._state.db != db: - raise ValueError( - "%r instance isn't saved. Use bulk=False or save " - "the object first." % obj - ) - check_and_update_obj(obj) - pks.append(obj.pk) - - self.model._base_manager.using(db).filter(pk__in=pks).update( - **{ - self.content_type_field_name: self.content_type, - self.object_id_field_name: self.pk_val, - } - ) - else: - with transaction.atomic(using=db, savepoint=False): - for obj in objs: - check_and_update_obj(obj) - obj.save() - - add.alters_data = True - - async def aadd(self, *objs, bulk=True): - return await sync_to_async(self.add)(*objs, bulk=bulk) - - aadd.alters_data = True - - def remove(self, *objs, bulk=True): - if not objs: - return - self._clear(self.filter(pk__in=[o.pk for o in objs]), bulk) - - remove.alters_data = True - - async def aremove(self, *objs, bulk=True): - return await sync_to_async(self.remove)(*objs, bulk=bulk) - - aremove.alters_data = True - - def clear(self, *, bulk=True): - self._clear(self, bulk) - - clear.alters_data = True - - async def aclear(self, *, bulk=True): - return await sync_to_async(self.clear)(bulk=bulk) - - aclear.alters_data = True - - def _clear(self, queryset, bulk): - self._remove_prefetched_objects() - db = router.db_for_write(self.model, instance=self.instance) - queryset = queryset.using(db) - if bulk: - # `QuerySet.delete()` creates its own atomic block which - # contains the `pre_delete` and `post_delete` signal handlers. - queryset.delete() - else: - with transaction.atomic(using=db, savepoint=False): - for obj in queryset: - obj.delete() - - _clear.alters_data = True - - def set(self, objs, *, bulk=True, clear=False): - # Force evaluation of `objs` in case it's a queryset whose value - # could be affected by `manager.clear()`. Refs #19816. - objs = tuple(objs) - - db = router.db_for_write(self.model, instance=self.instance) - with transaction.atomic(using=db, savepoint=False): - if clear: - self.clear() - self.add(*objs, bulk=bulk) - else: - old_objs = set(self.using(db).all()) - new_objs = [] - for obj in objs: - if obj in old_objs: - old_objs.remove(obj) - else: - new_objs.append(obj) - - self.remove(*old_objs) - self.add(*new_objs, bulk=bulk) - - set.alters_data = True - - async def aset(self, objs, *, bulk=True, clear=False): - return await sync_to_async(self.set)(objs, bulk=bulk, clear=clear) - - aset.alters_data = True - - def create(self, **kwargs): - self._remove_prefetched_objects() - kwargs[self.content_type_field_name] = self.content_type - kwargs[self.object_id_field_name] = self.pk_val - db = router.db_for_write(self.model, instance=self.instance) - return super().using(db).create(**kwargs) - - create.alters_data = True - - async def acreate(self, **kwargs): - return await sync_to_async(self.create)(**kwargs) - - acreate.alters_data = True - - def get_or_create(self, **kwargs): - kwargs[self.content_type_field_name] = self.content_type - kwargs[self.object_id_field_name] = self.pk_val - db = router.db_for_write(self.model, instance=self.instance) - return super().using(db).get_or_create(**kwargs) - - get_or_create.alters_data = True - - async def aget_or_create(self, **kwargs): - return await sync_to_async(self.get_or_create)(**kwargs) - - aget_or_create.alters_data = True - - def update_or_create(self, **kwargs): - kwargs[self.content_type_field_name] = self.content_type - kwargs[self.object_id_field_name] = self.pk_val - db = router.db_for_write(self.model, instance=self.instance) - return super().using(db).update_or_create(**kwargs) - - update_or_create.alters_data = True - - async def aupdate_or_create(self, **kwargs): - return await sync_to_async(self.update_or_create)(**kwargs) - - aupdate_or_create.alters_data = True - - return GenericRelatedObjectManager diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/forms.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/forms.py deleted file mode 100644 index 34a88f6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/forms.py +++ /dev/null @@ -1,133 +0,0 @@ -from django.contrib.contenttypes.models import ContentType -from django.db import models -from django.forms import ModelForm, modelformset_factory -from django.forms.models import BaseModelFormSet - - -class BaseGenericInlineFormSet(BaseModelFormSet): - """ - A formset for generic inline objects to a parent. - """ - - def __init__( - self, - data=None, - files=None, - instance=None, - save_as_new=False, - prefix=None, - queryset=None, - **kwargs, - ): - opts = self.model._meta - self.instance = instance - self.rel_name = ( - opts.app_label - + "-" - + opts.model_name - + "-" - + self.ct_field.name - + "-" - + self.ct_fk_field.name - ) - self.save_as_new = save_as_new - if self.instance is None or not self.instance._is_pk_set(): - qs = self.model._default_manager.none() - else: - if queryset is None: - queryset = self.model._default_manager - qs = queryset.filter( - **{ - self.ct_field.name: ContentType.objects.get_for_model( - self.instance, for_concrete_model=self.for_concrete_model - ), - self.ct_fk_field.name: self.instance.pk, - } - ) - super().__init__(queryset=qs, data=data, files=files, prefix=prefix, **kwargs) - - def initial_form_count(self): - if self.save_as_new: - return 0 - return super().initial_form_count() - - @classmethod - def get_default_prefix(cls): - opts = cls.model._meta - return ( - opts.app_label - + "-" - + opts.model_name - + "-" - + cls.ct_field.name - + "-" - + cls.ct_fk_field.name - ) - - def save_new(self, form, commit=True): - setattr( - form.instance, - self.ct_field.attname, - ContentType.objects.get_for_model(self.instance).pk, - ) - setattr(form.instance, self.ct_fk_field.attname, self.instance.pk) - return form.save(commit=commit) - - -def generic_inlineformset_factory( - model, - form=ModelForm, - formset=BaseGenericInlineFormSet, - ct_field="content_type", - fk_field="object_id", - fields=None, - exclude=None, - extra=3, - can_order=False, - can_delete=True, - max_num=None, - formfield_callback=None, - validate_max=False, - for_concrete_model=True, - min_num=None, - validate_min=False, - absolute_max=None, - can_delete_extra=True, -): - """ - Return a ``GenericInlineFormSet`` for the given kwargs. - - You must provide ``ct_field`` and ``fk_field`` if they are different from - the defaults ``content_type`` and ``object_id`` respectively. - """ - opts = model._meta - # if there is no field called `ct_field` let the exception propagate - ct_field = opts.get_field(ct_field) - if ( - not isinstance(ct_field, models.ForeignKey) - or ct_field.remote_field.model != ContentType - ): - raise Exception("fk_name '%s' is not a ForeignKey to ContentType" % ct_field) - fk_field = opts.get_field(fk_field) # let the exception propagate - exclude = [*(exclude or []), ct_field.name, fk_field.name] - FormSet = modelformset_factory( - model, - form=form, - formfield_callback=formfield_callback, - formset=formset, - extra=extra, - can_delete=can_delete, - can_order=can_order, - fields=fields, - exclude=exclude, - max_num=max_num, - validate_max=validate_max, - min_num=min_num, - validate_min=validate_min, - absolute_max=absolute_max, - can_delete_extra=can_delete_extra, - ) - FormSet.ct_field = ct_field - FormSet.ct_fk_field = fk_field - FormSet.for_concrete_model = for_concrete_model - return FormSet diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/af/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index 60c2dee..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/af/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index ef24168..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2019,2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: F Wolff , 2019,2024\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Inhoudtipes" - -msgid "python model class name" -msgstr "python-modelklasnaam" - -msgid "content type" -msgstr "inhoudtipe" - -msgid "content types" -msgstr "inhoudtipes" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Inhoudtipe %(ct_id)s-objek het geen geassosieerde model nie" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Inhoudstipe %(ct_id)s objek %(obj_id)s bestaan nie." - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s-objekte het nie ’n get_absolute_url()-metode nie" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index 612d4a0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index afebdd7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2014 -# Jannis Leidel , 2011 -# AlMeer , 2014 -# Muaaz Alsaied, 2020 -# صفا الفليج , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-04-06 19:57+0000\n" -"Last-Translator: صفا الفليج \n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Content Types" -msgstr "أنواع المحتوى" - -msgid "python model class name" -msgstr "اسم صنف النموذج في بايثون" - -msgid "content type" -msgstr "نوع المحتوى" - -msgid "content types" -msgstr "أنواع المحتوى" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "ليس لكائن نوع المحتوى %(ct_id)s أيّ نموذج مرتبط" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "كائن نوع المحتوى %(ct_id)s بالمعرّف %(obj_id)s غير موجود" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "ليس لكائنات %(ct_name)s الدالة التابِعة get_absolute_url()‎" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar_DZ/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index fc230ca..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar_DZ/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index 276a4d4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Riterix , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-14 18:35+0000\n" -"Last-Translator: Riterix \n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Content Types" -msgstr "نوع المحتوى" - -msgid "python model class name" -msgstr "اسم صنف النموذج في python" - -msgid "content type" -msgstr "نوع البيانات" - -msgid "content types" -msgstr "أنواع البيانات" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "لا يوجد كائن مرتبط بنوع البيانات %(ct_id)s ." - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "نوع المحتوى %(ct_id)s الكائن %(obj_id)s غير موجود" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s كائن لا يحتوي على دالة get_absolute_url() ." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index a91316d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index 9e00e7b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-20 02:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "nome de modelu de clas python" - -msgid "content type" -msgstr "triba de conteníu" - -msgid "content types" -msgstr "tribes de conteníu" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/az/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 0aede69..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/az/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index f7fe8bc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Ismayilov , 2011 -# Emin Mastizada , 2020 -# Emin Mastizada , 2016 -# Nijat Mammadov, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2024-08-07 19:22+0000\n" -"Last-Translator: Nijat Mammadov, 2024\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Məzmun Növləri" - -msgid "python model class name" -msgstr "python modelinin sinif (class) adı" - -msgid "content type" -msgstr "məzmun tipi" - -msgid "content types" -msgstr "məzmun tipləri" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "%(ct_id)s məzmun növü obyekti ilə əlaqəli model yoxdur" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "%(ct_id)s məzmun növlü %(obj_id)s obyekti mövcut deyil" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s obyektlərinin get_absolute_url() metodu yoxdur" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/be/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index 6ffe799..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/be/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index 1b869da..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2015 -# znotdead , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-10-16 18:24+0000\n" -"Last-Translator: znotdead \n" -"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Content Types" -msgstr "Тыпы кантэнту" - -msgid "python model class name" -msgstr "назва клясы пітонавае мадэлі" - -msgid "content type" -msgstr "від зьмесьціва" - -msgid "content types" -msgstr "віды зьмесьціва" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Аб’ект са зьмесьцівам віду %(ct_id)s не зьвязалі з мадэльлю" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Аб’ект %(obj_id)s са зьмесьцівам віду %(ct_id)s не існуе" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Аб’екты %(ct_name)s ня маюць спосабу «get_absolute_url()»" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index 20e9b66..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index 9169509..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022 -# Boris Chervenkov , 2012 -# Georgi Kostadinov , 2012 -# Jannis Leidel , 2011 -# vestimir , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2022-01-13 18:20+0000\n" -"Last-Translator: arneatec \n" -"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Типове съдържание" - -msgid "python model class name" -msgstr "име на класа на модела в Python" - -msgid "content type" -msgstr "тип на съдържанието" - -msgid "content types" -msgstr "типове съдържание" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Обект с тип на съдържанието %(ct_id)s няма асоцииран модел." - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Обект %(obj_id)s с тип на съдържанието %(ct_id)s не съществува." - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s обекти нямат метода get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index 4a2a89a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index 01f8cb1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Tahmid Rafi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Tahmid Rafi \n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "কনটেন্ট টাইপসমূহ" - -msgid "python model class name" -msgstr "পাইথন মডেল ক্লাসের নাম" - -msgid "content type" -msgstr "কনটেন্ট টাইপ" - -msgid "content types" -msgstr "কনটেন্ট টাইপ সমূহ" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "কনটেন্ট টাইপ %(ct_id)s অবজেক্টের সাথে সংযুক্ত কোনো মডেল নেই" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s অবজেক্টের কোনো get_absolute_url() মেথড নেই" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/br/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index ebb4b38..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/br/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index 15a3dfd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Irriep Nala Novram , 2018-2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-03-12 14:31+0000\n" -"Last-Translator: Irriep Nala Novram \n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -msgid "Content Types" -msgstr "Doareoù endalc'had" - -msgid "python model class name" -msgstr "anv klas model python" - -msgid "content type" -msgstr "doare endalc'had" - -msgid "content types" -msgstr "doareoù endalc'had" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Doare endalc'had an objed %(ct_id)s n'eus tamm skouer kevelet gantañ" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "Doare endalc'had %(ct_id)s an objed %(obj_id)s n'eus ket anezhañ" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "An objedoù %(ct_name)s n'o deus ket un hentenn get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index 8206fb8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index d8a69a5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "ime python klase modela" - -msgid "content type" -msgstr "tip sadržaja" - -msgid "content types" -msgstr "tipovi sadržaja" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 2a67471..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index 5d6f7f3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Carles Barrobés , 2012,2014 -# Jannis Leidel , 2011 -# Manel Clos , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-04-28 20:05+0000\n" -"Last-Translator: Manel Clos \n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Tipus de Contingut" - -msgid "python model class name" -msgstr "nom de la classe del model en python" - -msgid "content type" -msgstr "tipus de contingut" - -msgid "content types" -msgstr "tipus de continguts" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "L'objecte del tipus de contingut %(ct_id)s no té un model associat" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "L'objecte %(obj_id)s del tipus de contingut %(ct_id)s no existeix" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Els objectes %(ct_name)s no tenen el mètode get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ckb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index 866e8ed..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ckb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index 6bd611d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Swara , 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2023-04-24 19:22+0000\n" -"Last-Translator: Swara , 2022\n" -"Language-Team: Central Kurdish (http://www.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "جۆرەکانی ناوەڕۆک" - -msgid "python model class name" -msgstr "ناوی پۆلی مۆدێلی پایسۆن" - -msgid "content type" -msgstr "جۆری ناوەڕۆک" - -msgid "content types" -msgstr "جۆرەکانی ناوەڕۆک" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "ئۆبجێکی جۆری ناوەڕۆکی %(ct_id)s هیچ مۆدێلێکی پەیوەستکراوی نییە" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "جۆری ناوەڕۆکی %(ct_id)s ئۆبجێکتی %(obj_id)s بوونی نیە" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "ئۆبجێکتەکانی %(ct_name)s ڕێچکەی get_absolute_url() ی نیە" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index f0ac28e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index d327a5e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vláďa Macek , 2012,2014 -# Vláďa Macek , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-19 09:23+0000\n" -"Last-Translator: Vláďa Macek \n" -"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -msgid "Content Types" -msgstr "Typy obsahu" - -msgid "python model class name" -msgstr "název třídy modelu v Pythonu" - -msgid "content type" -msgstr "typ obsahu" - -msgid "content types" -msgstr "typy obsahu" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Typ obsahu %(ct_id)s nemá přidružený model." - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Objekt %(obj_id)s typu obsahu %(ct_id)s neexistuje." - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Objektům typu %(ct_name)s chybí metoda get_absolute_url()." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index d72e975..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index 9b868d2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Maredudd ap Gwyndaf \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -msgid "Content Types" -msgstr "Mathau Cynnwys" - -msgid "python model class name" -msgstr "end dosbarth model python" - -msgid "content type" -msgstr "math cynnwys" - -msgid "content types" -msgstr "mathau cynnwys" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Does dim model cysylltiedig gyda gwrthrych math cynnwys %(ct_id)s" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "Nid ydy gwrthrych %(obj_id)s math cynnwys %(ct_id)s yn bodoli" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "Does dim swyddogaeth get_absolute_url() gyda'r gwrthrych %(ct_name)s" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/da/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index 5f5511b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/da/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index f10de28..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Erik Wognsen , 2014,2019 -# Jannis Leidel , 2011 -# Kristian Øllegaard , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 18:00+0000\n" -"Last-Translator: Erik Wognsen \n" -"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Indholdstyper" - -msgid "python model class name" -msgstr "klassenavn i Python-model" - -msgid "content type" -msgstr "indholdstype" - -msgid "content types" -msgstr "indholdstyper" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Indholdstype %(ct_id)s-objekt har ingen tilhørende model" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Indholdstype %(ct_id)s-objekt %(obj_id)s findes ikke" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr " %(ct_name)s-objekter har ikke en get_absolute_url()-metode" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/de/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index c098e03..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/de/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 8d50c70..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2012 -# Jannis Leidel , 2011,2013-2014,2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-17 22:43+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Inhaltstypen" - -msgid "python model class name" -msgstr "Python Modell-Klassenname" - -msgid "content type" -msgstr "Inhaltstyp" - -msgid "content types" -msgstr "Inhaltstypen" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Objekt des Inhaltstyps %(ct_id)s hat kein dazugehöriges Modell" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Objekt %(obj_id)s des Inhaltstyps %(ct_id)s ist nicht vorhanden" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr " %(ct_name)s Objekte haben keine get_absolute_url ()-Methode" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index 3ecc064..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index fa40165..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-02-25 16:03+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Content Types" -msgstr "Wopśimjeśowe typy" - -msgid "python model class name" -msgstr "klasowe mě pythonowe modela" - -msgid "content type" -msgstr "wopśimjeśowy typ" - -msgid "content types" -msgstr "wopśimjeśowe typy" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Objekt wopśimjeśowego typa %(ct_id)s njama zwězany model" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Objekt %(obj_id)s wopśimjeśowego typa %(ct_id)s njeeksistěrujo" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Objekty %(ct_name)s njamaju metodu get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/el/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index d49b9f6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/el/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index fc107e8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Nikolas Demiridis , 2014 -# Pãnoș , 2014 -# Pãnoș , 2016,2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-04 07:05+0000\n" -"Last-Translator: Pãnoș \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Τύποι Περιεχομένου" - -msgid "python model class name" -msgstr "όνομα κλάσης μοντέλου python" - -msgid "content type" -msgstr "τύπος περιεχομένου" - -msgid "content types" -msgstr "τύποι περιεχομένου" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" -"Το αντικείμενο %(ct_id)s τύπου περιεχομένου δεν έχει συσχετισμένο μοντέλο" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Το αντικείμενο %(obj_id)s τύπου περιεχομένου %(ct_id)s δεν υπάρχει" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "τα αντικείμενα %(ct_name)s δεν έχουν μέθοδο get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 08a7b68..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index cee0237..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: contrib/contenttypes/apps.py:16 -msgid "Content Types" -msgstr "" - -#: contrib/contenttypes/models.py:135 -msgid "python model class name" -msgstr "" - -#: contrib/contenttypes/models.py:139 -msgid "content type" -msgstr "" - -#: contrib/contenttypes/models.py:140 -msgid "content types" -msgstr "" - -#: contrib/contenttypes/views.py:18 -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#: contrib/contenttypes/views.py:24 -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "" - -#: contrib/contenttypes/views.py:32 -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index fcc2fc5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index 19d5c16..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:11+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (Australia) (http://www.transifex.com/projects/p/" -"django/language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "content types" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index f4b2043..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index 7e385be..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# jon_atkinson , 2011 -# Ross Poulton , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "python model class name" - -msgid "content type" -msgstr "content type" - -msgid "content types" -msgstr "content types" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Content type %(ct_id)s object has no associated model" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "Content type %(ct_id)s object %(obj_id)s doesn't exist" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s objects don't have a get_absolute_url() method" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index 152620e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index f64e0fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Batist D 🐍 , 2014 -# Meiyer , 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2022-04-24 19:22+0000\n" -"Last-Translator: Meiyer , 2022\n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Enhavaj tipoj" - -msgid "python model class name" -msgstr "klasa nomo de pitona modelo" - -msgid "content type" -msgstr "enhava tipo" - -msgid "content types" -msgstr "enhavaj tipoj" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Objekto kun enhava tipo %(ct_id)s ne havas modelojn asociitajn kun ĝi" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Objekto %(obj_id)s kun enhava tipo %(ct_id)s ne ekzistas" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Objektoj %(ct_name)s ne havas metodon get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 5bdc5a2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index dd7398b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2012 -# Jannis Leidel , 2011 -# Josue Naaman Nistal Guerra , 2014 -# Uriel Medina , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-09-25 17:13+0000\n" -"Last-Translator: Uriel Medina \n" -"Language-Team: Spanish (http://www.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Tipos de contenido" - -msgid "python model class name" -msgstr "nombre de la clase modelo de python" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "content types" -msgstr "tipos de contenido" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" -"El objeto de tipo de contenido %(ct_id)s no tiene ningún modelo asociado." - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "El tipo de contenido %(ct_id)s del objeto %(obj_id)s no existe" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s objetos no tienen un método get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index 12eec9c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index d048560..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ramiro Morales, 2012,2014-2015,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-10-01 10:21+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Tipos de Contenido" - -msgid "python model class name" -msgstr "nombre de la clase Python del modelo" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "content types" -msgstr "tipos de contenido" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "El objeto Tipo de contenido %(ct_id)s no tiene un modelo asociado" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "El objeto Tipo de contenido %(ct_id)s %(obj_id)s no existe" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Los objetos %(ct_name)s no tienen un método get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index 66b7631..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index e386b5c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Carlos Muñoz , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-20 03:01+0000\n" -"Last-Translator: Carlos Muñoz \n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Tipos de contenido" - -msgid "python model class name" -msgstr "nombre de la clase modelo de python" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "content types" -msgstr "tipos de contenido" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" -"El objeto de tipo de contenido %(ct_id)s no tiene ningún modelo asociado." - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "El objeto de tipo de contenido %(ct_id)s objeto %(obj_id)s no existe" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "El objeto %(ct_name)s no tiene un método get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index 1361168..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index 905c9ea..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abe Estrada, 2011-2012 -# Jesús Bautista , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-25 05:47+0000\n" -"Last-Translator: Jesús Bautista \n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Tipos de Contenido" - -msgid "python model class name" -msgstr "nombre de la clase python del modelo" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "content types" -msgstr "tipos de contenido" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" -"Los objetos con el tipo de contenido %(ct_id)s no tienen un modelo asociado" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index 78ad5f8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index e86c178..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eduardo , 2017 -# Yoel Acevedo, 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-20 03:01+0000\n" -"Last-Translator: Eduardo \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" -"language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Tipos de contenido" - -msgid "python model class name" -msgstr "nombre de la clase del modelo de python" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "content types" -msgstr "tipos de contenido" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" -"El objeto de tipo de contenido %(ct_id)s no tiene ningún modelo asociado" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "El objeto de tipo de contenido %(ct_id)s objeto %(obj_id)s no existe" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "El objeto %(ct_name)s no tiene un método get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/et/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index e4ec019..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/et/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index d90ea9a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Janno Liivak , 2013 -# Marti Raudsepp , 2014 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-28 01:46+0000\n" -"Last-Translator: Ragnar Rebase \n" -"Language-Team: Estonian (http://www.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Sisutüübid" - -msgid "python model class name" -msgstr "pythoni mudeli klassinimi" - -msgid "content type" -msgstr "sisutüüp" - -msgid "content types" -msgstr "sisutüübid" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Sisutüübi %(ct_id)s objektil puudub seos mudeliga" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Sisutüübi %(ct_id)s objekti %(obj_id)s pole olemas" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s objektidel pole get_absolute_url() meetodit" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index 5883d06..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index 07146e9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aitzol Naberan , 2012 -# Eneko Illarramendi , 2017 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Eneko Illarramendi \n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Eduki Motak" - -msgid "python model class name" -msgstr "python model class izena" - -msgid "content type" -msgstr "eduki mota" - -msgid "content types" -msgstr "eduki motak" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "%(ct_id)s eduki motak ez dauka lotutako eredurik" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "%(ct_id)s eduki motako %(obj_id)s objekturik ez da existitzen" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s objektuek ez daukate get_absolute_url() metodorik" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index c11cd46..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index f4bea17..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Nikneshan , 2012 -# Jannis Leidel , 2011 -# rahim agh , 2020 -# Reza Mohammadi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-27 09:31+0000\n" -"Last-Translator: rahim agh \n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Content Types" -msgstr "نوع‌های محتوا" - -msgid "python model class name" -msgstr "نام پایتونی کلاس مدل" - -msgid "content type" -msgstr "نوع محتوا" - -msgid "content types" -msgstr "نوع‌های محتوا" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "نوع محتوای %(ct_id)s به هیچ مدلی مرتبط نشده است" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "شیء %(obj_id)s از نمونه محتوای %(ct_id)s وجود ندارد" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "شیء %(ct_name)s متد get_absolute_url() را ندارد" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index af15679..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index ea4db91..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2020 -# Jannis Leidel , 2011 -# Klaus Dahlén , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-12-09 06:31+0000\n" -"Last-Translator: Aarni Koskela\n" -"Language-Team: Finnish (http://www.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Sisältötyypit" - -msgid "python model class name" -msgstr "mallin python-luokan nimi" - -msgid "content type" -msgstr "sisältötyyppi" - -msgid "content types" -msgstr "sisältötyypit" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Sisältötyypin %(ct_id)s objektiin ei ole liitetty mallia" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Sisältötyypin %(ct_id)s objektia %(obj_id)s ei ole olemassa" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s-objekteilla ei ole get_absolute_url()-metodia" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 2de1e4a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index 2f355d1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2014,2019 -# Claude Paroz , 2012 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-18 15:50+0000\n" -"Last-Translator: Claude Paroz \n" -"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Content Types" -msgstr "Types de contenus" - -msgid "python model class name" -msgstr "nom de la classe python du modèle" - -msgid "content type" -msgstr "type de contenu" - -msgid "content types" -msgstr "types de contenu" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "L'objet type de contenu %(ct_id)s n'a pas de modèle associé" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "L'objet %(obj_id)s du type de contenu %(ct_id)s n’existe pas" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Les objets %(ct_name)s n’ont pas de méthode get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index 489bbab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index 6e549c3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "content types" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index 4b96fe5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index 40229fc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Jannis Leidel , 2011 -# Luke Blaney , 2019 -# Michael Thornhill , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2024-10-07 19:22+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -msgid "Content Types" -msgstr "Cineál Inneachair" - -msgid "python model class name" -msgstr "píotón samhail aicme ainm" - -msgid "content type" -msgstr "tíopa inneachar " - -msgid "content types" -msgstr "tíopaI inneachair" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Ní bhaineann samhail leis an cineál inneachar %(ct_id)s" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Níl cineál ábhair %(ct_id)s réad %(obj_id)s ann" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Níl modh get_absolute_url() ag réada %(ct_name)s" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index 05d9baf..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index 825730b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2015 -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-13 12:51+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -msgid "Content Types" -msgstr "Seòrsaichean susbainte" - -msgid "python model class name" -msgstr "ainm clas air modail python" - -msgid "content type" -msgstr "seòrsa susbainte" - -msgid "content types" -msgstr "seòrsaichean susbainte" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" -"Chan eil modail co-cheangailte ris an oibseact le seòrsa susbaint %(ct_id)s" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Chan eil an oibseact %(obj_id)s le seòrsa susbaint %(ct_id)s ann" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Chan eil am modh get_absolute_url() aig na h-oibseactan %(ct_name)s" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index 5ecd343..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index 18f962e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# fonso , 2013 -# Jannis Leidel , 2011 -# Leandro Regueiro , 2013 -# X Bello , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2023-04-24 19:22+0000\n" -"Last-Translator: X Bello , 2023\n" -"Language-Team: Galician (http://www.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Tipos de Contido" - -msgid "python model class name" -msgstr "nome en Python da clase do modelo" - -msgid "content type" -msgstr "tipo de contido" - -msgid "content types" -msgstr "tipos de contido" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "O obxecto de tipo de contido %(ct_id)s non ten un modelo asociado" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "O obxecto %(obj_id)s con tipo de contido %(ct_id)s non existe" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Os obxectos %(ct_name)s non teñen un método get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/he/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index 0bcdcd3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/he/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index 43bd82e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Meir Kriheli , 2012,2014,2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-08-02 13:30+0000\n" -"Last-Translator: Meir Kriheli \n" -"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -msgid "Content Types" -msgstr "סוגי תוכן" - -msgid "python model class name" -msgstr "שם ה־class של מודל פייתון" - -msgid "content type" -msgstr "סוג תוכן" - -msgid "content types" -msgstr "סוגי תוכן" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "לא משוייך מודל לאובייקט מסוג התוכן %(ct_id)s" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "סוג תוכן %(ct_id)s אובייקט %(obj_id)s אינו קיים" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "אובייקטי %(ct_name)s אינם כוללים מתודת get_absolute_url()‎" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index 4af5d95..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index aabdaf4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chandan kumar , 2012 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "पैथॉन मॉडल क्लास नाम" - -msgid "content type" -msgstr "विषय-सूची प्रकार" - -msgid "content types" -msgstr "विषय-सूचियाँ प्रकार" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "सामग्री प्रकार के %(ct_id)s ऑब्जेक्ट कोई संबद्ध मॉडल नहीं है।" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "सामग्री प्रकार %(ct_id)s वस्तु %(obj_id)s मौजूद नहीं है." - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s वस्तुओं की get_absolute_url() विधि नहीं है." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index 1fa258e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index 8acf7e8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bojan Mihelač , 2012 -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Mislav Cimperšak \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgid "Content Types" -msgstr "Tipovi sadržaja" - -msgid "python model class name" -msgstr "ime klase (class) python modela" - -msgid "content type" -msgstr "tip sadržaja" - -msgid "content types" -msgstr "tipovi sadržaja" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Tip sadržaja %(ct_id)s objekt nema pridruženi model" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "Tip sadržaja %(ct_id)s objekt %(obj_id)s ne postoji" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s objekti nemaju get_absolute_url() metodu" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index 349357f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index a0f3feb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-21 19:25+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Content Types" -msgstr "Wobsahowe typy" - -msgid "python model class name" -msgstr "klasowe mjeno pythonoweho modela" - -msgid "content type" -msgstr "wobsahowy typ" - -msgid "content types" -msgstr "wobsahowe typy" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Objekt wobsahoweho typa %(ct_id)s nima zwjazany model" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Objekt %(obj_id)s wobsahoweho typa %(ct_id)s njeeksistuje" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Objekty %(ct_name)s nimaja metodu get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index ece0a5e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index 7c4a800..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# András Veres-Szentkirályi, 2016 -# Attila Nagy <>, 2012 -# Istvan Farkas , 2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-18 09:29+0000\n" -"Last-Translator: Istvan Farkas \n" -"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Tartalom típusok" - -msgid "python model class name" -msgstr "python modell osztály neve" - -msgid "content type" -msgstr "tartalom típusa" - -msgid "content types" -msgstr "tartalom típusok" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "A %(ct_id)s tartalomtípus-objektumhoz nincsenek modellek hozzárendelve" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "A(z) %(ct_id)s típusú %(obj_id)s objektum nem létezik" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "" -"%(ct_name)s objektumok esetén nincs beállítva a get_absolute_url() metódus." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index a62ddff..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index 63b9e93..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-11-01 20:28+0000\n" -"Last-Translator: Ruben Harutyunov \n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Պարունակության տիպեր" - -msgid "python model class name" -msgstr "python մոդելի դասի անուն" - -msgid "content type" -msgstr "պարունակության տիպ" - -msgid "content types" -msgstr "պարունակության տիպեր" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Պարունակության տիպ %(ct_id)s օբյեկտը չունի իր հետ կապված մոդել" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "Պարունակության տիպ %(ct_id)s %(obj_id)s օբյեկտը գոյություն չունի" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s օբյեկտները չունեն get_absolute_url() մեթոդ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index 2eec9aa..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index cf2a5e4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2012,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-12-24 19:22+0000\n" -"Last-Translator: Martijn Dekker \n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Typos de contento" - -msgid "python model class name" -msgstr "nomine del classe del modello Python" - -msgid "content type" -msgstr "typo de contento" - -msgid "content types" -msgstr "typos de contento" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Le objecto del typo de contento %(ct_id)s non ha un modello associate" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Le objecto %(obj_id)s del typo de contento %(ct_id)s non existe" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Objectos %(ct_name)s non ha un methodo get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/id/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index ea0373e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/id/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index c6db9d4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fery Setiawan , 2020 -# Jannis Leidel , 2011 -# M Asep Indrayana , 2015 -# rodin , 2011-2012 -# rodin , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-02-06 02:33+0000\n" -"Last-Translator: Fery Setiawan \n" -"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "Jenis Konten" - -msgid "python model class name" -msgstr "nama kelas model python" - -msgid "content type" -msgstr "tipe konten" - -msgid "content types" -msgstr "tipe konten" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Tipe konten objek %(ct_id)s tidak memiliki model yang terkait" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Jenis isi %(ct_id)s object %(obj_id)s tidak ada" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "objek %(ct_name)s tidak memiliki metode get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/io/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index 0b6b123..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/io/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index b70d8d6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viko Bartero , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-20 01:58+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "klaso nomo dil python modelo" - -msgid "content type" -msgstr "kontenajo tipo" - -msgid "content types" -msgstr "kontenajo tipi" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "La objekto kun kontenajo tipo %(ct_id)s ne havas relatita modelo" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "La objekto %(obj_id)s kun kontenajo tipo %(ct_id)s ne existas" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "La objekti %(ct_name)s ne havas get_absolute_url() metodo" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/is/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index 97eb95c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/is/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index a691279..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Hafsteinn Einarsson , 2012 -# Jannis Leidel , 2011 -# Thordur Sigurdsson , 2016,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-20 05:05+0000\n" -"Last-Translator: Thordur Sigurdsson \n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -msgid "Content Types" -msgstr "Efnistög" - -msgid "python model class name" -msgstr "python eininga klasa nafn" - -msgid "content type" -msgstr "efnistag" - -msgid "content types" -msgstr "efnistög" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Gerð innihalds %(ct_id)s hefur ekkert tengt módel" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Gerð innihalds %(ct_id)s hlutar %(obj_id)s er ekki til" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s hlutir hafa ekki get_absolute_url () aðferð" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index dcdb640..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index 8984cb0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Marco Bonetti, 2014 -# Mirco Grillo , 2020 -# Nicola Larosa , 2012 -# Stefano Brentegani , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-07-23 09:00+0000\n" -"Last-Translator: Mirco Grillo \n" -"Language-Team: Italian (http://www.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Content Type" - -msgid "python model class name" -msgstr "nome della classe del modello Python" - -msgid "content type" -msgstr "content type" - -msgid "content types" -msgstr "content type" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "L'oggetto con content type %(ct_id)s non ha alcun modello associato" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "L'oggetto %(obj_id)s con content type %(ct_id)s non esiste" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Gli oggetti %(ct_name)s non hanno un metodo get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index 7a0ce28..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index af29839..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,47 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Shinya Okano , 2012,2014 -# Takuya N , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-02-07 16:03+0000\n" -"Last-Translator: Takuya N \n" -"Language-Team: Japanese (http://www.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "コンテンツタイプ" - -msgid "python model class name" -msgstr "Python モデルクラス名" - -msgid "content type" -msgstr "コンテンツタイプ" - -msgid "content types" -msgstr "コンテンツタイプ" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" -"コンテンツタイプ %(ct_id)s のオブジェクトは、関連付けられたモデルを持っていま" -"せん" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "コンテンツタイプ %(ct_id)s のオブジェクト %(obj_id)s は存在しません" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "" -"%(ct_name)s のオブジェクトは get_absolute_url() メソッドを持っていません" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index 5545459..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index e2f1396..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2013,2015 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: André Bouatchidzé \n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Content Types" -msgstr "კონტენტის ტიპები" - -msgid "python model class name" -msgstr "python-ის მოდელის კლასის სახელი" - -msgid "content type" -msgstr "კონტენტის ტიპი" - -msgid "content types" -msgstr "კონტენტის ტიპები" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "კონტენტის ტიპის %(ct_id)s ობიექტს არ გააჩნია ასოცირებული მოდელი" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "კონტენტის ტიპის %(ct_id)s ობიექტი %(obj_id)s არ არსებობს" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s ობიექტებს არ გააჩნიათ მეთოდი get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index 889b0a0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index af1c9f9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Nurlan Rakhimzhanov , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "питонның үлгі классның аты" - -msgid "content type" -msgstr "мазмұн түрі" - -msgid "content types" -msgstr "мазмұн түрлері" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/km/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index 6e6775c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/km/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index 674077a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "ឈ្មោះ python model class" - -msgid "content type" -msgstr "ប្រភេទអត្ថន័យ" - -msgid "content types" -msgstr "ប្រភេទអត្ថន័យ" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index 00951f1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index d4bde11..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "ಪೈಥಾನ್ ಮಾಡೆಲ್ ಕ್ಲಾಸಿನ ಹೆಸರು" - -msgid "content type" -msgstr "ಒಳವಿಷಯದ ಬಗೆ" - -msgid "content types" -msgstr "ಒಳವಿಷಯದ ಬಗೆಗಳು" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index f8f00ba..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index 8cef428..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Le Tartuffe , 2014 -# Yang Chan Woo , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 08:01+0000\n" -"Last-Translator: Yang Chan Woo \n" -"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "콘텐츠 타입" - -msgid "python model class name" -msgstr "python 모델 클래스 명" - -msgid "content type" -msgstr "콘텐츠 타입" - -msgid "content types" -msgstr "콘텐츠 타입(들)" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "콘텐츠 타입 %(ct_id)s 객체는 관련 모델이 없습니다" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "콘텐츠 타입 %(ct_id)s객체%(obj_id)s는 존재하지 않습니다." - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s객체들은 get_absolute_url() 메소드가 없습니다." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ky/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index f9cd081..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ky/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 9c6495a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soyuzbek Orozbek uulu , 2020 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-23 06:00+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "Мазмун түрү" - -msgid "python model class name" -msgstr "питон модел класс ысымы" - -msgid "content type" -msgstr "мазмун түрү" - -msgid "content types" -msgstr "мазмун түрлөрү" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "%(ct_id)s мазмун түрүнүн өзүнө байланышкан модели жок." - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "%(ct_id)sмазмун түрүнүн %(obj_id)sобектисинде жашабайт." - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)sобекттеринде get_absolute_url() ыкмасы жок" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index 5b7937f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index 69819b7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "content types" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index 8c70382..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index 8c8de9c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Matas Dailyda , 2015 -# Simonas Kazlauskas , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Matas Dailyda \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Content Types" -msgstr "Turinio tipai" - -msgid "python model class name" -msgstr "python modelio klasės vardas" - -msgid "content type" -msgstr "turinio tipas" - -msgid "content types" -msgstr "turinio tipai" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Tūrinio tipo %(ct_id)s objektas neturi priskirto modelio" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "Tūrinio tipo %(ct_id)s objektas %(obj_id)s neegzistuoja" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s objektai neturi get_absolute_url() metodo" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index 4a5565f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index b91627e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# NullIsNot0 , 2019 -# peterisb , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-07 07:19+0000\n" -"Last-Translator: NullIsNot0 \n" -"Language-Team: Latvian (http://www.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -msgid "Content Types" -msgstr "Satura tipi" - -msgid "python model class name" -msgstr "python modeļa klases nosaukums" - -msgid "content type" -msgstr "satura tips" - -msgid "content types" -msgstr "satura tipi" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Satura tipa %(ct_id)s objektam nav asociētā modeļa" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Satura tipa %(ct_id)s objekts %(obj_id)s neeksistē" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s objekti nesatur get_absolute_url() metodi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index ca4d926..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index e8a455b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vasil Vangelovski , 2014 -# Vasil Vangelovski , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: dekomote \n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgid "Content Types" -msgstr "Типови содржини" - -msgid "python model class name" -msgstr "име на класата за python моделoт" - -msgid "content type" -msgstr "тип на содржина" - -msgid "content types" -msgstr "типови содржини" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Типот на содржина %(ct_id)s објект нема асоциран модел" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "Типот на содржина %(ct_id)s објект %(obj_id)s не постои" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s објекти немаат get_absolute_url() метод" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index 70458b6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index 873523d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Rajeesh Nair , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "പൈത്തണ്‍ മോഡല്‍ ക്ളാസ്സിന്റെ പേര്" - -msgid "content type" -msgstr "ഏതു തരം ഉള്ളടക്കം" - -msgid "content types" -msgstr "ഏതൊക്കെ തരം ഉള്ളടക്കം" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "കണ്ടന്റ് ടൈപ്പ് %(ct_id)s വസ്തുവിന് അനുബന്ധമായ മോഡല്‍ ഇല്ല." - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "കണ്ടന്റ് ടൈപ്പ് %(ct_id)s വസ്തു %(obj_id)s നിലവിലില്ല" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s വസ്തുക്കള്‍ക്ക് get_absolute_url() രീതി ഇല്ല." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index bb640e9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 266a85b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bayarkhuu Bataa, 2017 -# Jannis Leidel , 2011 -# Zorig , 2014 -# Анхбаяр Анхаа , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-10-19 14:01+0000\n" -"Last-Translator: Bayarkhuu Bataa\n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Агуулгын төрөл" - -msgid "python model class name" -msgstr "пайтоны моделын классын нэр" - -msgid "content type" -msgstr "агуулгын төрөл" - -msgid "content types" -msgstr "агуулгын төрлүүд" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "%(ct_id)s төрлийн холбоотой модель олдсонгүй" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "%(ct_id)s төрлийн %(obj_id)s объект олдсонгүй" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" -"%(ct_name)s объектууд дээр get_absolute_url() функцийг тодорхойлоогүй байна." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index 4f5b10d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index 880ce36..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Omkar Parab, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2024-01-24 19:22+0000\n" -"Last-Translator: Omkar Parab, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "सामुग्रीचे प्रकार" - -msgid "python model class name" -msgstr "पायथन मॉडेल वर्गाचे नाव" - -msgid "content type" -msgstr "सामुग्री प्रकार" - -msgid "content types" -msgstr "सामुग्रीचे प्रकार" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "%(ct_id)s या सामुग्री प्रकाराच्या ऑब्जेक्टला संबंधित मॉडेल नाही." - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ms/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index 3d28522..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ms/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index 1aa74e0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-11-16 12:42+0000\n" -"Last-Translator: Jafry Hisham\n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "Jenis kandungan" - -msgid "python model class name" -msgstr "nama kelas model python" - -msgid "content type" -msgstr "jenis kandungan" - -msgid "content types" -msgstr "jenis-jenis kandungan" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Jenis kandungan %(ct_id)s tidak mempunyai model yang berkaitan" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Jenis kandungan %(ct_id)s objek %(obj_id)s tidak wujud" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Objek-objek %(ct_name)s tidak mempunyai kaedah get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index 03d84f2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index e5fc0fc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2013,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Yhal Htet Aung \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "အကြောင်းအရာအမျိုးအစားများ" - -msgid "python model class name" -msgstr "စပါးကြီးမော်ဒယ်အမျိုးအစားနာမည်" - -msgid "content type" -msgstr "အကြောင်းအရာအမျိုးအစား" - -msgid "content types" -msgstr "အကြောင်းအရာအမျိုးအစားများ" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "အကြောင်းအရာအမျိုးအစား %(ct_id)s အရာဝတ္ထုမှာဆက်နွယ်သောမော်ဒယ်မရှိ" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "အကြောင်းအရာအမျိုးအစား %(ct_id)s အရာဝတ္ထု %(obj_id)s မတည်ရှိနေ" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s အရာဝတ္ထုများ get_absolute_url() နည်းလမ်းမရှိ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index d058fce..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index f1485a8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# jensadne , 2014 -# Jon , 2020 -# Jon , 2012 -# Sigurd Gartmann , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-21 12:15+0000\n" -"Last-Translator: Jon \n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Innholdstyper" - -msgid "python model class name" -msgstr "python-modellklassenavn" - -msgid "content type" -msgstr "innholdstype" - -msgid "content types" -msgstr "innholdstyper" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Innholdstype %(ct_id)s objekt har ingen assosiert model" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Innholdstype %(ct_id)s objekt %(obj_id)s finnes ikke" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s-objekter har ikke get_absolute_url()-metode" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index 6e855c7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index 6ecdd03..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Sagar Chalise , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Sagar Chalise \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "कन्टेन्ट टाइपहरु" - -msgid "python model class name" -msgstr "पाइथन मोडेल क्लासको नाम" - -msgid "content type" -msgstr "कन्टेन्ट टाइप" - -msgid "content types" -msgstr "कन्टेन्ट टाइपहरु" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "कन्टेन्ट टाइप %(ct_id)s वस्तु सँग सम्बन्धित मोडेल छैन ।" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "कन्टेन्ट टाइप %(ct_id)s वस्तु %(obj_id)s छैन ।" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s वस्तुमा get_absolute_url() तरिका छैन ।" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index e5e33f1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index 2dade66..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Harro van der Klauw , 2012 -# Jannis Leidel , 2011 -# Sander Steffann , 2015 -# Tonnes , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 08:44+0000\n" -"Last-Translator: Tonnes \n" -"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Inhoudstypen" - -msgid "python model class name" -msgstr "klassenaam van pythonmodel" - -msgid "content type" -msgstr "inhoudstype" - -msgid "content types" -msgstr "inhoudstypen" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Object van inhoudstype %(ct_id)s heeft geen bijbehorend model" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Object %(obj_id)s van inhoudstype %(ct_id)s bestaat niet" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s-objecten hebben geen get_absolute_url()-methode" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index c60510c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index c441b43..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# jensadne , 2013 -# Sivert Olstad, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-10-21 18:49+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Innhaldstypar" - -msgid "python model class name" -msgstr "python-modell klassenamn" - -msgid "content type" -msgstr "innhaldstype" - -msgid "content types" -msgstr "innhaldstypar" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Innhaldstype %(ct_id)s-objektet har ingen modell knytta til seg" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Innhaldstype %(ct_id)s-objekt %(obj_id)s eksisterer ikkje" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s-objekt har ikkje ein get_absolute_url() metode" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/os/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index 3e44b4b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/os/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index bdeabb6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "python моделы классы ном" - -msgid "content type" -msgstr "мидисы хуыз" - -msgid "content types" -msgstr "мидисы хуызтӕ" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "%(ct_id)s мидисы хуызы объектӕн ӕмбӕлгӕ модел нӕй" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "%(ct_id)s мидисы хуызы объект %(obj_id)s нӕй" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s объекттӕн get_absolute_url() метод нӕй" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index 9221827..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index 7eb0a2c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "ਪਾਈਥਨ ਮਾਡਲ ਕਲਾਸ ਨਾਂ" - -msgid "content type" -msgstr "ਸਮੱਗਰੀ ਕਿਸਮ" - -msgid "content types" -msgstr "ਸਮੱਗਰੀ ਕਿਸਮ" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index 00e6a51..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index 0c26fb2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,47 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# sidewinder , 2014 -# angularcircle, 2012 -# Jannis Leidel , 2011 -# m_aciek , 2019 -# Tomasz Kajtoch , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-11 14:09+0000\n" -"Last-Translator: m_aciek \n" -"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" -"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" -"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -msgid "Content Types" -msgstr "Typy Zawartości" - -msgid "python model class name" -msgstr "Nazwa klasy modelu pythona" - -msgid "content type" -msgstr "typ zawartości" - -msgid "content types" -msgstr "typy zawartości" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Obiekt typu zawartości %(ct_id)s nie posiada przypisanego modelu" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Obiekt %(obj_id)s typu zawartości %(ct_id)s nie istnieje" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Obiekty %(ct_name)s nie posiadają metody get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index c4c14c7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index 4ddb9f4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Nuno Mariz , 2011-2012 -# pedromcaraujo , 2024 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2024-08-07 19:22+0000\n" -"Last-Translator: pedromcaraujo , 2024\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Tipos de Conteúdo" - -msgid "python model class name" -msgstr "nome da classe do model em python" - -msgid "content type" -msgstr "tipo de conteúdo" - -msgid "content types" -msgstr "tipos de conteúdos" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Objeto do tipo de conteúdo %(ct_id)s não tem nenhum model associado" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "O objeto %(obj_id)s do tipo de conteúdo %(ct_id)s não existe." - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Objetos %(ct_name)s não têm o método get_absolute_url()." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index eec927d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index 26b3adf..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# Carlos C. Leite , 2016,2019 -# semente, 2012 -# Jannis Leidel , 2011 -# Rafael Fontenelle , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-01-17 06:36+0000\n" -"Last-Translator: Rafael Fontenelle \n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Content Types" -msgstr "Tipos de Conteúdo" - -msgid "python model class name" -msgstr "nome da classe de modelo em python" - -msgid "content type" -msgstr "tipo de conteúdo" - -msgid "content types" -msgstr "tipos de conteúdo" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Objeto do tipo de conteúdo %(ct_id)s não tem nenhum model associado" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "O objeto %(obj_id)s do tipo de conteúdo %(ct_id)s não existe." - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "os objetos %(ct_name)s não têm o método get_absolute_url()." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index 7d41295..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index 2c32c7e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Daniel Ursache-Dogariu, 2011 -# Denis Darii , 2014 -# Razvan Stefanescu , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Razvan Stefanescu \n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -msgid "Content Types" -msgstr "Tipuri de conținut" - -msgid "python model class name" -msgstr "nume clasă model Python" - -msgid "content type" -msgstr "tip conținut" - -msgid "content types" -msgstr "tipuri conținut" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Tipul de conținut %(ct_id)s nu are nici un model asociat" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "Content type %(ct_id)s object %(obj_id)s doesn't exist" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "Obiectele %(ct_name)s nu au o metodă get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index 27f7ed2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index 0d36e2a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,47 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eugene , 2012 -# crazyzubr , 2020 -# Jannis Leidel , 2011 -# Алексей Борискин , 2012,2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-14 18:22+0000\n" -"Last-Translator: crazyzubr \n" -"Language-Team: Russian (http://www.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Content Types" -msgstr "Типы содержимого" - -msgid "python model class name" -msgstr "имя класса модели" - -msgid "content type" -msgstr "тип содержимого" - -msgid "content types" -msgstr "типы содержимого" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Тип содержимого %(ct_id)s не имеет связанной модели" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Объекта типа %(ct_id)s с идентификатором %(obj_id)s не существует" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Объекты типа \"%(ct_name)s\" не имеют метода get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index c2fa5a9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index c66f9ba..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Marian Andre , 2012 -# Martin Tóth , 2017,2023 -# Peter Kuma, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2023-12-04 19:22+0000\n" -"Last-Translator: Martin Tóth , 2017,2023\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Content Types" -msgstr "Typy Obsahu" - -msgid "python model class name" -msgstr "pythonovské meno triedy modelu" - -msgid "content type" -msgstr "typ obsahu" - -msgid "content types" -msgstr "typy obsahu" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Objekt typu obsahu %(ct_id)s nemá pridružený model" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Objekt %(obj_id)s typu obsahu %(ct_id)s neexistuje" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr " Objekty %(ct_name)s nemajú metódu get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index 6253ab0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index d13e0dc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# zejn , 2016 -# zejn , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Primož Verdnik \n" -"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Content Types" -msgstr "vrste vsebine" - -msgid "python model class name" -msgstr "ime razreda modela python" - -msgid "content type" -msgstr "vrsta vsebine" - -msgid "content types" -msgstr "vrste vsebine" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Predmet vrste vsebine %(ct_id)s nima določenega povezanega modela" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "Predmet %(obj_id)s vrste %(ct_id)s ne obstaja" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "Predmeti vrste %(ct_name)s nimajo določila get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index cbc3393..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index 37e4727..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik , 2011 -# Besnik , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-18 09:52+0000\n" -"Last-Translator: Besnik \n" -"Language-Team: Albanian (http://www.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Lloje Lënde" - -msgid "python model class name" -msgstr "emër klase modeli python" - -msgid "content type" -msgstr "lloj lënde" - -msgid "content types" -msgstr "lloje lënde" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Objekti për lloj lënde %(ct_id)s s’ka model të përshoqëruar" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Objekti %(obj_id)s për lloj lënde %(ct_id)s s’ekziston" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Objektet %(ct_name)s s’përmbajnë ndonjë metodë get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index 9a10067..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index 02aae70..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Igor Jerosimić, 2020 -# Jannis Leidel , 2011 -# Janos Guljas , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-21 20:40+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (http://www.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Content Types" -msgstr "Типови садржаја" - -msgid "python model class name" -msgstr "име python класе модела" - -msgid "content type" -msgstr "тип садржаја" - -msgid "content types" -msgstr "типови садржаја" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Тип садржаја %(ct_id)s нема асоцирани модел" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Тип садржаја %(ct_id)s објекта %(obj_id)s не постоји" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Објекти %(ct_name)s немају get_absolute_url() метод" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index a97478b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index 926478e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Igor Jerosimić, 2019-2020 -# Jannis Leidel , 2011 -# Janos Guljas , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-21 20:49+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" -"language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Content Types" -msgstr "Tipovi sadržaja" - -msgid "python model class name" -msgstr "ime python klase modela" - -msgid "content type" -msgstr "tip sadržaja" - -msgid "content types" -msgstr "tipovi sadržaja" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Tip sadržaja %(ct_id)s nema asocirani model" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Tip sadržaja %(ct_id)s objekta %(obj_id)s ne postoji" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Objekti %(ct_name)s nemaju get_absolute_url() metod" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index b4fe3a8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index 8cdfa8d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Albin Larsson , 2022 -# Andreas Pelme , 2012 -# Jannis Leidel , 2011 -# Jonathan Lindén, 2014 -# Thomas Lundqvist, 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2022-07-24 19:22+0000\n" -"Last-Translator: Albin Larsson \n" -"Language-Team: Swedish (http://www.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Innehållstyper" - -msgid "python model class name" -msgstr "klassnamn för Python-modell" - -msgid "content type" -msgstr "innehållstyp" - -msgid "content types" -msgstr "innehållstyper" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Innehållstypens %(ct_id)s har ingen associerad modell." - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Innehållstypens %(ct_id)s objekt %(obj_id)s finns inte" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s objekt har inte en get_absolute_url()-metod" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index dcd2203..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index 4f9d8bc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "" - -msgid "content type" -msgstr "aina ya maudhui" - -msgid "content types" -msgstr "aina ya maudhui" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index 8438101..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index 5a524c3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "python model class name" - -msgid "content type" -msgstr "பொருளடக்க வகை" - -msgid "content types" -msgstr "பொருளடக்க வகைகள்" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index 732d4e9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index ca476cd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "పైతాన్ మొడల్ క్లాస్ పేరు" - -msgid "content type" -msgstr "సూచన రకం" - -msgid "content types" -msgstr "సూచన రకాలు" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index 8f0140d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index 9150d44..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-15 00:27+0000\n" -"Last-Translator: Surush Sufiew \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Намуди контент" - -msgid "python model class name" -msgstr "номи класси модел" - -msgid "content type" -msgstr "намуди контент" - -msgid "content types" -msgstr "намуди контентҳо" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Намуди контенти %(ct_id)s модели алоқаманд надорад" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/th/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index 7e443b0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/th/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index 8ab409e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "python model class name" - -msgid "content type" -msgstr "content type" - -msgid "content types" -msgstr "content types" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "ประเภทของเนื้อหา %(ct_id)s ไม่มีอ็อบเจ็กที่มีรูปแบบที่เกี่ยวข้อง" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "ไม่มีประเภทของเนื้อหา %(ct_id)s วัตถุ %(obj_id)s" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "%(ct_name)s ไม่มีเมธอด get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index 0bafb07..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index 44d8f80..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Resulkary , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-07-07 20:28+0000\n" -"Last-Translator: Resulkary \n" -"Language-Team: Turkmen (http://www.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "Mazmunyň görnüşleri" - -msgid "python model class name" -msgstr "python model synpynyň ady" - -msgid "content type" -msgstr "mazmunyň görnüşi" - -msgid "content types" -msgstr "mazmunyň görnüşleri" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Mazmun görnüşi %(ct_id)s obýekti bilen baglanyşykly model ýok" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "Mazmun görnüşi %(ct_id)s %(obj_id)s ýok" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s obýektlerde get_absolute_url() metody ýok" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index 18bcd94..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index b33b267..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BouRock, 2019 -# BouRock, 2014 -# Jannis Leidel , 2011 -# Murat Çorlu , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 08:00+0000\n" -"Last-Translator: BouRock\n" -"Language-Team: Turkish (http://www.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Content Types" -msgstr "İçerik Türleri" - -msgid "python model class name" -msgstr "python model sınıfı adı" - -msgid "content type" -msgstr "içerik türü" - -msgid "content types" -msgstr "içerik türleri" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "İçerik türü %(ct_id)s nesnesi ilişkilendirilmiş modele sahip değil" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "İçerik türü %(ct_id)s nesne %(obj_id)s mevcut değil" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s nesneleri bir get_absolute_url() yöntemine sahip değiller" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index f45a1f2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index 90a5004..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "модель классының исеме" - -msgid "content type" -msgstr "эчтәлек тибы" - -msgid "content types" -msgstr "эчтәлек тиблары" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index af7ab53..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index a8f7e88..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "content types" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ug/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index f81e7c0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ug/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index ad21e41..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abduqadir Abliz , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2023-12-04 19:22+0000\n" -"Last-Translator: Abduqadir Abliz , 2023\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "مەزمۇن تىپلىرى" - -msgid "python model class name" -msgstr "python مودېلىنىڭ سىنىپ ئىسمى" - -msgid "content type" -msgstr "مەزمۇن تىپى" - -msgid "content types" -msgstr "مەزمۇن تىپلىرى" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "مەزمۇن تىپى %(ct_id)s ئوبيېكتىنىڭ باغلانغان مودېلى يوق" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "مەزمۇن تىپى %(ct_id)s ئوبيېكت %(obj_id)s مەۋجۇت ئەمەس" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s ئوبيېكتى get_absolute_url() ئۇسۇلى يوق" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index 5ca84fa..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index a798bb1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Oleksandr Chernihov , 2014 -# Illia Volochii , 2021 -# Jannis Leidel , 2011 -# Sergey Lysach , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-01-20 00:17+0000\n" -"Last-Translator: Illia Volochii \n" -"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -msgid "Content Types" -msgstr "Типи вмісту" - -msgid "python model class name" -msgstr "імʼя класу моделі" - -msgid "content type" -msgstr "тип вмісту" - -msgid "content types" -msgstr "типи вмісту" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Тип вмісту %(ct_id)s не має пов'язанної моделі" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "" -"Обʼєкт з ідентифікатором %(ct_id)s, що має тип вмісту %(obj_id)s не існує" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "Обʼєкт типу %(ct_name)s не має методу get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index f6ff919..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index 075af1f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Content Types" -msgstr "" - -msgid "python model class name" -msgstr "پائثان کے ماڈل کی کلاس کا نام" - -msgid "content type" -msgstr "مضمون کی قسم" - -msgid "content types" -msgstr "مضمون کی اقسام" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "" - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index 1cc06c6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index 6dbef52..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Tran , 2011 -# Tran Van , 2013 -# xgenvn , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Tran Van \n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "Các loại nội dung" - -msgid "python model class name" -msgstr "tên lớp mô hình python" - -msgid "content type" -msgstr "kiểu nội dung" - -msgid "content types" -msgstr "kiểu nội dung" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "Đối tượng của kiểu nội dung %(ct_id)s không có model tương ứng" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" -msgstr "Đối tượng %(obj_id)s của Kiểu nội dung %(ct_id)s không tồn tại." - -#, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" -msgstr "Đối tượng %(ct_name)s không có phương thức get_absolute_url()" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index 7f9dc8c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index 2acb647..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ronald White , 2014 -# slene , 2011 -# wolf ice , 2020 -# Kevin Sze , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-03-04 02:33+0000\n" -"Last-Translator: wolf ice \n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "内容类型" - -msgid "python model class name" -msgstr "python 模型类名" - -msgid "content type" -msgstr "内容类型" - -msgid "content types" -msgstr "内容类型" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "内容类型 %(ct_id)s 对象没有关联的模型" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "内容类型%(ct_id)s对象%(obj_id)s不存在" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s对象不包含get_absolute_url()方法" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index 7c1e8b8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index e6e918b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# ilay , 2012 -# Jannis Leidel , 2011 -# Tzu-ping Chung , 2016,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-18 09:00+0000\n" -"Last-Translator: Tzu-ping Chung \n" -"Language-Team: Chinese (Taiwan) (http://www.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Content Types" -msgstr "內容類型" - -msgid "python model class name" -msgstr "python model 類別名稱" - -msgid "content type" -msgstr "內容類型" - -msgid "content types" -msgstr "內容類型" - -#, python-format -msgid "Content type %(ct_id)s object has no associated model" -msgstr "內容類型 %(ct_id)s 的物件沒有關聯的資料模型" - -#, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" -msgstr "內容類型 %(ct_id)s 的物件 %(obj_id)s 不存在" - -#, python-format -msgid "%(ct_name)s objects don’t have a get_absolute_url() method" -msgstr "%(ct_name)s 的物件沒有 get_absolute_url() 方法" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/management/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/management/__init__.py deleted file mode 100644 index 903b9ab..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/management/__init__.py +++ /dev/null @@ -1,145 +0,0 @@ -from django.apps import apps as global_apps -from django.db import DEFAULT_DB_ALIAS, IntegrityError, migrations, router, transaction - - -class RenameContentType(migrations.RunPython): - def __init__(self, app_label, old_model, new_model): - self.app_label = app_label - self.old_model = old_model - self.new_model = new_model - super().__init__(self.rename_forward, self.rename_backward) - - def _rename(self, apps, schema_editor, old_model, new_model): - ContentType = apps.get_model("contenttypes", "ContentType") - db = schema_editor.connection.alias - if not router.allow_migrate_model(db, ContentType): - return - - try: - content_type = ContentType.objects.db_manager(db).get_by_natural_key( - self.app_label, old_model - ) - except ContentType.DoesNotExist: - pass - else: - content_type.model = new_model - try: - with transaction.atomic(using=db): - content_type.save(using=db, update_fields={"model"}) - except IntegrityError: - # Gracefully fallback if a stale content type causes a - # conflict as remove_stale_contenttypes will take care of - # asking the user what should be done next. - content_type.model = old_model - else: - # Clear the cache as the `get_by_natural_key()` call will cache - # the renamed ContentType instance by its old model name. - ContentType.objects.clear_cache() - - def rename_forward(self, apps, schema_editor): - self._rename(apps, schema_editor, self.old_model, self.new_model) - - def rename_backward(self, apps, schema_editor): - self._rename(apps, schema_editor, self.new_model, self.old_model) - - -def inject_rename_contenttypes_operations( - plan=None, apps=global_apps, using=DEFAULT_DB_ALIAS, **kwargs -): - """ - Insert a `RenameContentType` operation after every planned `RenameModel` - operation. - """ - if plan is None: - return - - # Determine whether or not the ContentType model is available. - try: - ContentType = apps.get_model("contenttypes", "ContentType") - except LookupError: - available = False - else: - if not router.allow_migrate_model(using, ContentType): - return - available = True - - for migration, backward in plan: - if (migration.app_label, migration.name) == ("contenttypes", "0001_initial"): - # There's no point in going forward if the initial contenttypes - # migration is unapplied as the ContentType model will be - # unavailable from this point. - if backward: - break - else: - available = True - continue - # The ContentType model is not available yet. - if not available: - continue - inserts = [] - for index, operation in enumerate(migration.operations): - if isinstance(operation, migrations.RenameModel): - operation = RenameContentType( - migration.app_label, - operation.old_name_lower, - operation.new_name_lower, - ) - inserts.append((index + 1, operation)) - for inserted, (index, operation) in enumerate(inserts): - migration.operations.insert(inserted + index, operation) - - -def get_contenttypes_and_models(app_config, using, ContentType): - if not router.allow_migrate_model(using, ContentType): - return None, None - - ContentType.objects.clear_cache() - - content_types = { - ct.model: ct - for ct in ContentType.objects.using(using).filter(app_label=app_config.label) - } - app_models = {model._meta.model_name: model for model in app_config.get_models()} - return content_types, app_models - - -def create_contenttypes( - app_config, - verbosity=2, - interactive=True, - using=DEFAULT_DB_ALIAS, - apps=global_apps, - **kwargs, -): - """ - Create content types for models in the given app. - """ - if not app_config.models_module: - return - - app_label = app_config.label - try: - app_config = apps.get_app_config(app_label) - ContentType = apps.get_model("contenttypes", "ContentType") - except LookupError: - return - - content_types, app_models = get_contenttypes_and_models( - app_config, using, ContentType - ) - - if not app_models: - return - - cts = [ - ContentType( - app_label=app_label, - model=model_name, - ) - for (model_name, model) in app_models.items() - if model_name not in content_types - ] - ContentType.objects.using(using).bulk_create(cts) - if verbosity >= 2: - for ct in cts: - print("Adding content type '%s | %s'" % (ct.app_label, ct.model)) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/management/commands/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/management/commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/management/commands/remove_stale_contenttypes.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/management/commands/remove_stale_contenttypes.py deleted file mode 100644 index 27aaf1d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/management/commands/remove_stale_contenttypes.py +++ /dev/null @@ -1,113 +0,0 @@ -import itertools - -from django.apps import apps -from django.contrib.contenttypes.models import ContentType -from django.core.management import BaseCommand -from django.db import DEFAULT_DB_ALIAS, connections, router -from django.db.models.deletion import Collector - - -class Command(BaseCommand): - help = "Deletes stale content types in the database." - - def add_arguments(self, parser): - parser.add_argument( - "--noinput", - "--no-input", - action="store_false", - dest="interactive", - help="Tells Django to NOT prompt the user for input of any kind.", - ) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help='Nominates the database to use. Defaults to the "default" database.', - ) - parser.add_argument( - "--include-stale-apps", - action="store_true", - default=False, - help=( - "Deletes stale content types including ones from previously " - "installed apps that have been removed from INSTALLED_APPS." - ), - ) - - def handle(self, **options): - db = options["database"] - include_stale_apps = options["include_stale_apps"] - interactive = options["interactive"] - verbosity = options["verbosity"] - - if not router.allow_migrate_model(db, ContentType): - return - ContentType.objects.clear_cache() - - apps_content_types = itertools.groupby( - ContentType.objects.using(db).order_by("app_label", "model"), - lambda obj: obj.app_label, - ) - for app_label, content_types in apps_content_types: - if not include_stale_apps and app_label not in apps.app_configs: - continue - to_remove = [ct for ct in content_types if ct.model_class() is None] - # Confirm that the content type is stale before deletion. - using = router.db_for_write(ContentType) - if to_remove: - if interactive: - ct_info = [] - for ct in to_remove: - ct_info.append( - " - Content type for %s.%s" % (ct.app_label, ct.model) - ) - collector = NoFastDeleteCollector(using=using, origin=ct) - collector.collect([ct]) - - for obj_type, objs in collector.data.items(): - if objs != {ct}: - ct_info.append( - " - %s %s object(s)" - % ( - len(objs), - obj_type._meta.label, - ) - ) - content_type_display = "\n".join(ct_info) - self.stdout.write( - "Some content types in your database are stale and can be " - "deleted.\n" - "Any objects that depend on these content types will also be " - "deleted.\n" - "The content types and dependent objects that would be deleted " - "are:\n\n" - f"{content_type_display}\n\n" - "This list doesn't include any cascade deletions to data " - "outside of Django\n" - "models (uncommon).\n\n" - "Are you sure you want to delete these content types?\n" - "If you're unsure, answer 'no'." - ) - ok_to_delete = input("Type 'yes' to continue, or 'no' to cancel: ") - else: - ok_to_delete = "yes" - - if ok_to_delete == "yes": - for ct in to_remove: - if verbosity >= 2: - self.stdout.write( - "Deleting stale content type '%s | %s'" - % (ct.app_label, ct.model) - ) - ct.delete() - else: - if verbosity >= 2: - self.stdout.write("Stale content types remain.") - - -class NoFastDeleteCollector(Collector): - def can_fast_delete(self, *args, **kwargs): - """ - Always load related objects to display them when showing confirmation. - """ - return False diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/migrations/0001_initial.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/migrations/0001_initial.py deleted file mode 100644 index 7ea39d4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/migrations/0001_initial.py +++ /dev/null @@ -1,45 +0,0 @@ -import django.contrib.contenttypes.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [] - - operations = [ - migrations.CreateModel( - name="ContentType", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("name", models.CharField(max_length=100)), - ("app_label", models.CharField(max_length=100)), - ( - "model", - models.CharField( - max_length=100, verbose_name="python model class name" - ), - ), - ], - options={ - "ordering": ("name",), - "db_table": "django_content_type", - "verbose_name": "content type", - "verbose_name_plural": "content types", - }, - bases=(models.Model,), - managers=[ - ("objects", django.contrib.contenttypes.models.ContentTypeManager()), - ], - ), - migrations.AlterUniqueTogether( - name="contenttype", - unique_together={("app_label", "model")}, - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/migrations/0002_remove_content_type_name.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/migrations/0002_remove_content_type_name.py deleted file mode 100644 index 29f0474..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/migrations/0002_remove_content_type_name.py +++ /dev/null @@ -1,42 +0,0 @@ -from django.db import migrations, models - - -def add_legacy_name(apps, schema_editor): - alias = schema_editor.connection.alias - ContentType = apps.get_model("contenttypes", "ContentType") - for ct in ContentType.objects.using(alias): - try: - ct.name = apps.get_model(ct.app_label, ct.model)._meta.object_name - except LookupError: - ct.name = ct.model - ct.save() - - -class Migration(migrations.Migration): - dependencies = [ - ("contenttypes", "0001_initial"), - ] - - operations = [ - migrations.AlterModelOptions( - name="contenttype", - options={ - "verbose_name": "content type", - "verbose_name_plural": "content types", - }, - ), - migrations.AlterField( - model_name="contenttype", - name="name", - field=models.CharField(max_length=100, null=True), - ), - migrations.RunPython( - migrations.RunPython.noop, - add_legacy_name, - hints={"model_name": "contenttype"}, - ), - migrations.RemoveField( - model_name="contenttype", - name="name", - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/migrations/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/models.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/models.py deleted file mode 100644 index 1ae45de..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/models.py +++ /dev/null @@ -1,188 +0,0 @@ -from collections import defaultdict - -from django.apps import apps -from django.db import models -from django.db.models import Q -from django.utils.translation import gettext_lazy as _ - - -class ContentTypeManager(models.Manager): - use_in_migrations = True - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - # Cache shared by all the get_for_* methods to speed up - # ContentType retrieval. - self._cache = {} - - def get_by_natural_key(self, app_label, model): - try: - ct = self._cache[self.db][(app_label, model)] - except KeyError: - ct = self.get(app_label=app_label, model=model) - self._add_to_cache(self.db, ct) - return ct - - def _get_opts(self, model, for_concrete_model): - if for_concrete_model: - model = model._meta.concrete_model - return model._meta - - def _get_from_cache(self, opts): - key = (opts.app_label, opts.model_name) - return self._cache[self.db][key] - - def get_for_model(self, model, for_concrete_model=True): - """ - Return the ContentType object for a given model, creating the - ContentType if necessary. Lookups are cached so that subsequent lookups - for the same model don't hit the database. - """ - opts = self._get_opts(model, for_concrete_model) - try: - return self._get_from_cache(opts) - except KeyError: - pass - - # The ContentType entry was not found in the cache, therefore we - # proceed to load or create it. - try: - # Start with get() and not get_or_create() in order to use - # the db_for_read (see #20401). - ct = self.get(app_label=opts.app_label, model=opts.model_name) - except self.model.DoesNotExist: - # Not found in the database; we proceed to create it. This time - # use get_or_create to take care of any race conditions. - ct, created = self.get_or_create( - app_label=opts.app_label, - model=opts.model_name, - ) - self._add_to_cache(self.db, ct) - return ct - - def get_for_models(self, *models, for_concrete_models=True): - """ - Given *models, return a dictionary mapping {model: content_type}. - """ - results = {} - # Models that aren't already in the cache grouped by app labels. - needed_models = defaultdict(set) - # Mapping of opts to the list of models requiring it. - needed_opts = defaultdict(list) - for model in models: - opts = self._get_opts(model, for_concrete_models) - try: - ct = self._get_from_cache(opts) - except KeyError: - needed_models[opts.app_label].add(opts.model_name) - needed_opts[(opts.app_label, opts.model_name)].append(model) - else: - results[model] = ct - if needed_opts: - # Lookup required content types from the DB. - condition = Q( - *( - Q(("app_label", app_label), ("model__in", models)) - for app_label, models in needed_models.items() - ), - _connector=Q.OR, - ) - cts = self.filter(condition) - for ct in cts: - opts_models = needed_opts.pop((ct.app_label, ct.model), []) - for model in opts_models: - results[model] = ct - self._add_to_cache(self.db, ct) - # Create content types that weren't in the cache or DB. - for (app_label, model_name), opts_models in needed_opts.items(): - ct = self.create(app_label=app_label, model=model_name) - self._add_to_cache(self.db, ct) - for model in opts_models: - results[model] = ct - return results - - def get_for_id(self, id): - """ - Lookup a ContentType by ID. Use the same shared cache as get_for_model - (though ContentTypes are not created on-the-fly by get_by_id). - """ - try: - ct = self._cache[self.db][id] - except KeyError: - # This could raise a DoesNotExist; that's correct behavior and will - # make sure that only correct ctypes get stored in the cache dict. - ct = self.get(pk=id) - self._add_to_cache(self.db, ct) - return ct - - def clear_cache(self): - """ - Clear out the content-type cache. - """ - self._cache.clear() - - def _add_to_cache(self, using, ct): - """Insert a ContentType into the cache.""" - # Note it's possible for ContentType objects to be stale; model_class() - # will return None. Hence, there is no reliance on - # model._meta.app_label here, just using the model fields instead. - key = (ct.app_label, ct.model) - self._cache.setdefault(using, {})[key] = ct - self._cache.setdefault(using, {})[ct.id] = ct - - -class ContentType(models.Model): - app_label = models.CharField(max_length=100) - model = models.CharField(_("python model class name"), max_length=100) - objects = ContentTypeManager() - - class Meta: - verbose_name = _("content type") - verbose_name_plural = _("content types") - db_table = "django_content_type" - unique_together = [["app_label", "model"]] - - def __str__(self): - return self.app_labeled_name - - @property - def name(self): - model = self.model_class() - if not model: - return self.model - return str(model._meta.verbose_name) - - @property - def app_labeled_name(self): - model = self.model_class() - if not model: - return self.model - return "%s | %s" % ( - model._meta.app_config.verbose_name, - model._meta.verbose_name, - ) - - def model_class(self): - """Return the model class for this type of content.""" - try: - return apps.get_model(self.app_label, self.model) - except LookupError: - return None - - def get_object_for_this_type(self, using=None, **kwargs): - """ - Return an object of this type for the keyword arguments given. - Basically, this is a proxy around this object_type's get_object() model - method. The ObjectNotExist exception, if thrown, will not be caught, - so code that calls this method should catch it. - """ - return self.model_class()._base_manager.using(using).get(**kwargs) - - def get_all_objects_for_this_type(self, **kwargs): - """ - Return all objects of this type for the keyword arguments given. - """ - return self.model_class()._base_manager.filter(**kwargs) - - def natural_key(self): - return (self.app_label, self.model) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/prefetch.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/prefetch.py deleted file mode 100644 index 97ac602..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/prefetch.py +++ /dev/null @@ -1,36 +0,0 @@ -from django.db.models import Prefetch -from django.db.models.query import ModelIterable, RawQuerySet - - -class GenericPrefetch(Prefetch): - def __init__(self, lookup, querysets, to_attr=None): - for queryset in querysets: - if queryset is not None and ( - isinstance(queryset, RawQuerySet) - or ( - hasattr(queryset, "_iterable_class") - and not issubclass(queryset._iterable_class, ModelIterable) - ) - ): - raise ValueError( - "Prefetch querysets cannot use raw(), values(), and values_list()." - ) - self.querysets = querysets - super().__init__(lookup, to_attr=to_attr) - - def __getstate__(self): - obj_dict = self.__dict__.copy() - obj_dict["querysets"] = [] - for queryset in self.querysets: - if queryset is not None: - queryset = queryset._chain() - # Prevent the QuerySet from being evaluated - queryset._result_cache = [] - queryset._prefetch_done = True - obj_dict["querysets"].append(queryset) - return obj_dict - - def get_current_querysets(self, level): - if self.get_current_prefetch_to(level) == self.prefetch_to: - return self.querysets - return None diff --git a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/views.py b/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/views.py deleted file mode 100644 index bfde73c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/contenttypes/views.py +++ /dev/null @@ -1,88 +0,0 @@ -from django.apps import apps -from django.contrib.contenttypes.models import ContentType -from django.contrib.sites.shortcuts import get_current_site -from django.core.exceptions import ObjectDoesNotExist -from django.http import Http404, HttpResponseRedirect -from django.utils.translation import gettext as _ - - -def shortcut(request, content_type_id, object_id): - """ - Redirect to an object's page based on a content-type ID and an object ID. - """ - # Look up the object, making sure it's got a get_absolute_url() function. - try: - content_type = ContentType.objects.get(pk=content_type_id) - if not content_type.model_class(): - raise Http404( - _("Content type %(ct_id)s object has no associated model") - % {"ct_id": content_type_id} - ) - obj = content_type.get_object_for_this_type(pk=object_id) - except (ObjectDoesNotExist, ValueError): - raise Http404( - _("Content type %(ct_id)s object %(obj_id)s doesn’t exist") - % {"ct_id": content_type_id, "obj_id": object_id} - ) - - try: - get_absolute_url = obj.get_absolute_url - except AttributeError: - raise Http404( - _("%(ct_name)s objects don’t have a get_absolute_url() method") - % {"ct_name": content_type.name} - ) - absurl = get_absolute_url() - - # Try to figure out the object's domain, so we can do a cross-site redirect - # if necessary. - - # If the object actually defines a domain, we're done. - if absurl.startswith(("http://", "https://", "//")): - return HttpResponseRedirect(absurl) - - # Otherwise, we need to introspect the object's relationships for a - # relation to the Site object - try: - object_domain = get_current_site(request).domain - except ObjectDoesNotExist: - object_domain = None - - if apps.is_installed("django.contrib.sites"): - Site = apps.get_model("sites.Site") - opts = obj._meta - - for field in opts.many_to_many: - # Look for a many-to-many relationship to Site. - if field.remote_field.model is Site: - site_qs = getattr(obj, field.name).all() - if object_domain and site_qs.filter(domain=object_domain).exists(): - # The current site's domain matches a site attached to the - # object. - break - # Caveat: In the case of multiple related Sites, this just - # selects the *first* one, which is arbitrary. - site = site_qs.first() - if site: - object_domain = site.domain - break - else: - # No many-to-many relationship to Site found. Look for a - # many-to-one relationship to Site. - for field in obj._meta.fields: - if field.remote_field and field.remote_field.model is Site: - try: - site = getattr(obj, field.name) - except Site.DoesNotExist: - continue - if site is not None: - object_domain = site.domain - break - - # If all that malarkey found an object domain, use it. Otherwise, fall back - # to whatever get_absolute_url() returned. - if object_domain is not None: - protocol = request.scheme - return HttpResponseRedirect("%s://%s%s" % (protocol, object_domain, absurl)) - else: - return HttpResponseRedirect(absurl) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/admin.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/admin.py deleted file mode 100644 index 5bbc2ad..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/admin.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.contrib import admin -from django.contrib.flatpages.forms import FlatpageForm -from django.contrib.flatpages.models import FlatPage -from django.utils.translation import gettext_lazy as _ - - -@admin.register(FlatPage) -class FlatPageAdmin(admin.ModelAdmin): - form = FlatpageForm - fieldsets = ( - (None, {"fields": ("url", "title", "content", "sites")}), - ( - _("Advanced options"), - { - "classes": ("collapse",), - "fields": ("registration_required", "template_name"), - }, - ), - ) - list_display = ("url", "title") - list_filter = ("sites", "registration_required") - search_fields = ("url", "title") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/apps.py deleted file mode 100644 index eb9f470..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/apps.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.apps import AppConfig -from django.utils.translation import gettext_lazy as _ - - -class FlatPagesConfig(AppConfig): - default_auto_field = "django.db.models.AutoField" - name = "django.contrib.flatpages" - verbose_name = _("Flat Pages") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/forms.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/forms.py deleted file mode 100644 index 136fd02..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/forms.py +++ /dev/null @@ -1,74 +0,0 @@ -from django import forms -from django.conf import settings -from django.contrib.flatpages.models import FlatPage -from django.core.exceptions import ValidationError -from django.utils.translation import gettext -from django.utils.translation import gettext_lazy as _ - - -class FlatpageForm(forms.ModelForm): - url = forms.RegexField( - label=_("URL"), - max_length=100, - regex=r"^[-\w/.~]+$", - help_text=_( - "Example: “/about/contact/”. Make sure to have leading and trailing " - "slashes." - ), - error_messages={ - "invalid": _( - "This value must contain only letters, numbers, dots, " - "underscores, dashes, slashes or tildes." - ), - }, - ) - - class Meta: - model = FlatPage - fields = "__all__" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - if not self._trailing_slash_required(): - self.fields["url"].help_text = _( - "Example: “/about/contact”. Make sure to have a leading slash." - ) - - def _trailing_slash_required(self): - return ( - settings.APPEND_SLASH - and "django.middleware.common.CommonMiddleware" in settings.MIDDLEWARE - ) - - def clean_url(self): - url = self.cleaned_data["url"] - if not url.startswith("/"): - raise ValidationError( - gettext("URL is missing a leading slash."), - code="missing_leading_slash", - ) - if self._trailing_slash_required() and not url.endswith("/"): - raise ValidationError( - gettext("URL is missing a trailing slash."), - code="missing_trailing_slash", - ) - return url - - def clean(self): - url = self.cleaned_data.get("url") - sites = self.cleaned_data.get("sites") - - same_url = FlatPage.objects.filter(url=url) - if self.instance.pk: - same_url = same_url.exclude(pk=self.instance.pk) - - if sites and same_url.filter(sites__in=sites).exists(): - for site in sites: - if same_url.filter(sites=site).exists(): - raise ValidationError( - _("Flatpage with url %(url)s already exists for site %(site)s"), - code="duplicate_url", - params={"url": url, "site": site}, - ) - - return super().clean() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index d9b1b12..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index dc81ad4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2019,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2023-12-04 19:03+0000\n" -"Last-Translator: F Wolff , 2019,2023\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Gevorderde keuses" - -msgid "Flat Pages" -msgstr "Plat bladsye" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Voorbeeld: “/about/kontak/”. Maak seker dat dit begin en eindig met ’n " -"skuinsstreep." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Hierdie waarde moet slegs letters, syfers, punte, onderstrepies, " -"koppeltekens, skuinsstrepe of tildes bevat." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Voorbeeld: “/about/kontak/”. Maak seker dat dit begin met ’n skuinsstreep." - -msgid "URL is missing a leading slash." -msgstr "’n Skuinsstreep ontbreek vooraan URL." - -msgid "URL is missing a trailing slash." -msgstr "’n Skuinsstreep ontbreek agteraan URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Plat bladsy met URL %(url)s bestaan reeds vir die werf %(site)s" - -msgid "title" -msgstr "titel" - -msgid "content" -msgstr "inhoud" - -msgid "enable comments" -msgstr "aktiveer opmerkings" - -msgid "template name" -msgstr "sjabloonnaam" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Voorbeeld: “/flatpages/kontakbladsy.html”. As dit weggelaat word, sal die " -"stelsel “flatpages/default.html” gebruik." - -msgid "registration required" -msgstr "registrasie benodig" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"As hierdie gemerk is, sal slegs aangemelde gebruikers die bladsy kan bekyk." - -msgid "sites" -msgstr "werwe" - -msgid "flat page" -msgstr "plat bladsy" - -msgid "flat pages" -msgstr "plat bladsye" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index be793de..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index 984d77d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2015 -# Bashar Al-Abdulhadi, 2014 -# Eyad Toma , 2013 -# Jannis Leidel , 2011 -# Muaaz Alsaied, 2020 -# Ossama Khayat , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-04-02 11:30+0000\n" -"Last-Translator: Muaaz Alsaied\n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Advanced options" -msgstr "خيارات متقدّمة" - -msgid "Flat Pages" -msgstr "صفحات مسطحة" - -msgid "URL" -msgstr "رابط" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "مثال: “/about/contact/”. تأكد من وضع فواصل مائلة في البداية والنهاية." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"يجب أن تحتوي هذه القيمة الأحرف والأرقام والنقاط وعلامات _ و - و / أو ~ فقط." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "مثال: “/about/contact/”. تأكد من وضع فواصل مائلة في البداية." - -msgid "URL is missing a leading slash." -msgstr "العنوان URL يفقد رمز / في بدايته." - -msgid "URL is missing a trailing slash." -msgstr "العنوان URL يفقد رمز / في نهايته." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "الصفحة ذو العنوان %(url)s موجودة سابقاً في موقع %(site)s" - -msgid "title" -msgstr "العنوان" - -msgid "content" -msgstr "المحتوى" - -msgid "enable comments" -msgstr "السماح بالتعليقات" - -msgid "template name" -msgstr "اسم القالب" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"مثال: “flatpages/contact_page.html”. إن لم يكن هذا موجوداً، فسوف يستخدم " -"النظام 'flatpages/default.html'." - -msgid "registration required" -msgstr "التسجيل مطلوب" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"إذا كان هذا الخيار محددا، فإن المستخدمين الداخلين فقط سيتمكنون من مشاهدة " -"الصفحة." - -msgid "sites" -msgstr "المواقع" - -msgid "flat page" -msgstr "صفحة مسطحة" - -msgid "flat pages" -msgstr "صفحات مسطحة" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar_DZ/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index e494972..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar_DZ/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index 8e87c9b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Riterix , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-14 18:57+0000\n" -"Last-Translator: Riterix \n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Advanced options" -msgstr "خيارات متقدمة" - -msgid "Flat Pages" -msgstr "صفحات مسطحة" - -msgid "URL" -msgstr "رابط" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "مثال: '/about/contact/'. تأكد من وضع شرطات في البداية والنهاية." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"يجب أن تحتوي هذه القيمة الأحرف والأرقام والنقاط وعلامات _ و - و / أو ~ فقط." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "مثال: '/about/contact/'. تأكد من وضع شرطات في البداية." - -msgid "URL is missing a leading slash." -msgstr "العنوان URL يفقد رمز / في بدايته." - -msgid "URL is missing a trailing slash." -msgstr "العنوان URL يفقد رمز / في نهايته." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "الصفحة ذو العنوان %(url)s موجودة سابقاً في موقع %(site)s" - -msgid "title" -msgstr "العنوان" - -msgid "content" -msgstr "المحتوى" - -msgid "enable comments" -msgstr "السماح بالتعليقات" - -msgid "template name" -msgstr "اسم القالب" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"مثال: 'flatpages/contact_page.html'. إن لم تكن الصفحة موجودة، فسوف يستخدم " -"النظام 'flatpages/default.html'." - -msgid "registration required" -msgstr "التسجيل مطلوب" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"إذا كان هذا الخيار محددا، فإن المستخدمين الداخلين فقط سيتمكنون من مشاهدة " -"الصفحة." - -msgid "sites" -msgstr "المواقع" - -msgid "flat page" -msgstr "صفحة مسطحة" - -msgid "flat pages" -msgstr "صفحات مسطحة" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ast/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index 4fcf510..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ast/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index 3b618d0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 19:51+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Opciones avanzaes" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "títulu" - -msgid "content" -msgstr "conteníu" - -msgid "enable comments" -msgstr "habilitar comentarios" - -msgid "template name" -msgstr "" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" - -msgid "registration required" -msgstr "requierse rexistru" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Si esto ta conseñao, namái los usuarios con sesión aniciada podrán ver la " -"páxina." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 3d6b294..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index 45de566..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,94 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Ismayilov , 2011 -# Dimitris Glezos , 2012 -# Emin Mastizada , 2018,2020 -# Emin Mastizada , 2015 -# Nijat Mammadov, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2024-08-07 19:03+0000\n" -"Last-Translator: Nijat Mammadov, 2024\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Əlavə imkanlar" - -msgid "Flat Pages" -msgstr "Düz Səhifələr" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Məsələn, “/about/contact/”. Əvvəldə və sondakı çəpəki xəttin olmasına diqqət " -"edin." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Burada yalnız hərf, rəqəm, nöqtə, altdan xətt, defis, çəpəki xətt və ya " -"tildadan istifadə etmək olar." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Məsələn, “/about/contact”. Əvvəldəki çəpəki xəttin olmasına diqqət edin." - -msgid "URL is missing a leading slash." -msgstr "URL əvvəlində çəpəki xətt əskikdir." - -msgid "URL is missing a trailing slash." -msgstr "Ünvan sonunda çəpəki xətt əksikdir." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(site)s saytı üçün artıq %(url)s ünvanlı düz səhifə onsuz da var" - -msgid "title" -msgstr "başlıq" - -msgid "content" -msgstr "məzmun" - -msgid "enable comments" -msgstr "şərhlər olsun" - -msgid "template name" -msgstr "şablonun adı" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Məsələn, “flatpages/contact_page.html”. Əgər təchiz edilməsə, sistem " -"“flatpages/default.html” işlədəcək." - -msgid "registration required" -msgstr "ancaq qeydiyyatlılar üçün" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Əgər bura quş qoysanız, ancaq qeydiyyatdan keçib sayta daxil olmuş " -"istifadəçilər bu səhifəni görə biləcəklər." - -msgid "sites" -msgstr "saytlar" - -msgid "flat page" -msgstr "düz səhifə" - -msgid "flat pages" -msgstr "düz səhifələr" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/be/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index 5c02d66..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/be/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index f32e3c1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# znotdead , 2016,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-10-16 18:27+0000\n" -"Last-Translator: znotdead \n" -"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Advanced options" -msgstr "Адмысловыя можнасьці" - -msgid "Flat Pages" -msgstr "Нязменныя Бачыны" - -msgid "URL" -msgstr "Сеціўная спасылка" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Прыклад: «/about/contact/». Упэўніцеся, што адрас пачынаецца й заканчваецца " -"рыскаю «/»." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Дазваляюцца толькі літары, лічбы, кропкі, знак падкрэсьліваньня, злучкі, " -"нахіленыя рыскі, тыльды." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Прыклад: «/about/contact/». Упэўніцеся, што адрас пачынаецца рыскаю «/»." - -msgid "URL is missing a leading slash." -msgstr "Спасылка не пачынаецца з рыскі «/»." - -msgid "URL is missing a trailing slash." -msgstr "Спасылка не заканчваецца рыскаю «/»." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "На пляцоўцы «%(site)s» ужо існуе нязьменная бачына з адрасам «%(url)s»" - -msgid "title" -msgstr "назва" - -msgid "content" -msgstr "зьмесьціва" - -msgid "enable comments" -msgstr "дазволіць выказваньні" - -msgid "template name" -msgstr "назва шаблёну" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Прыклад: “flatpages/contact_page.html”. Калі не пазначаць нічога, сыстэма " -"будзе ўжываць “flatpages/default.html”." - -msgid "registration required" -msgstr "трэба запісацца" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Калі абраць гэта, бачыну змогуць пабачыць толькі тыя карыстальнікі, што " -"апазналіся." - -msgid "sites" -msgstr "сайты" - -msgid "flat page" -msgstr "нязьменная бачына" - -msgid "flat pages" -msgstr "нязьменныя бачыны" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index e7633dd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index f7e3535..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022 -# Jannis Leidel , 2011 -# Venelin Stoykov , 2016 -# vestimir , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2022-01-14 11:31+0000\n" -"Last-Translator: arneatec \n" -"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Допълнителни опции" - -msgid "Flat Pages" -msgstr "Информативни страници" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Пример: \"/about/contact/\". Началната и крайната наклонена чертичка са " -"задължителни." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Тази стойност трябва да съдържа само букви, цифри, точки, долни тирета, " -"тирета, наклонени черти или тилди." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Пример: \"/about/contact/\". Началната наклонена чертичка е задължителна. " - -msgid "URL is missing a leading slash." -msgstr "В URL липсва начална наклонена черта." - -msgid "URL is missing a trailing slash." -msgstr "В URL липсва завършваща наклонена черта." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Flatpage с url %(url)s вече съществува за сайт %(site)s" - -msgid "title" -msgstr "заглавие" - -msgid "content" -msgstr "съдържание" - -msgid "enable comments" -msgstr "позволяване на коментари" - -msgid "template name" -msgstr "име на шаблон" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Пример: \"flatpages/contact_page.html\". Ако това не е указано, системата " -"ще използва \"flatpages/default.html\". " - -msgid "registration required" -msgstr "изисква се регистрация" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ако това е чекнато, само логнати потребители ще могат да виждат страницата. " - -msgid "sites" -msgstr "сайтове" - -msgid "flat page" -msgstr "информативна страница" - -msgid "flat pages" -msgstr "информативни страници" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index 9465be4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index 7885c6c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,83 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Tahmid Rafi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "এডভান্সড অপশন" - -msgid "Flat Pages" -msgstr "ফ্ল্যাট পেজ" - -msgid "URL" -msgstr "ইউআরএল (URL)" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "উদাহরণঃ '/about/contact/'। শুরু এবং শেষের স্ল্যাশগুলো আবশ্যক।" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"এই মানটিতে শুধুমাত্র বর্ণ, অঙ্ক, পিরিয়ড, আন্ডারস্কোর, ড্যাশ, স্ল্যাশ অথবা টিল্ড " -"ক্যারেক্টার থাকতে পারবে।" - -msgid "URL is missing a leading slash." -msgstr "ইউআরএল টির শুরুর স্ল্যাশ চিহ্নটি দেওয়া হয় নি।" - -msgid "URL is missing a trailing slash." -msgstr "ইউআরএল টির শেষের স্ল্যাশ চিহ্নটি দেওয়া হয় নি।" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(site)s সাইটের জন্য %(url)s ইউআরএল এর ফ্ল্যাটপেজ আগেই তৈরী করা হয়েছ।" - -msgid "title" -msgstr "শিরোনাম" - -msgid "content" -msgstr "কনটেন্ট" - -msgid "enable comments" -msgstr "মন্তব্য প্রদান সচল করুন" - -msgid "template name" -msgstr "টেমপ্লেট নাম" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"উদাহরণঃ ’flatpage/contact_page.html'। এটি যদি খালি থাকে, তবে সিস্টেম " -"’flatpage/default.html' ব্যবহার করবে।" - -msgid "registration required" -msgstr "নিবন্ধন আবশ্যক" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "এটি চেক করা হলে, শুধুমাত্র লগইন করা সদস্যরা পাতাটি দেখতে সমর্থ হবেন।" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "ফ্লাট পাতা" - -msgid "flat pages" -msgstr "ফ্লাট পাতা সমূহ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index 48e491e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index 8fb6f1f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,95 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fulup , 2012 -# Irriep Nala Novram , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-03-12 14:19+0000\n" -"Last-Translator: Irriep Nala Novram \n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -msgid "Advanced options" -msgstr "Dibarzhioù araokaet" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Da skouer: '/diwar-benn/darempred/'. Bezit sur da gaout beskellioù \"/\" e " -"penn-kentañ hag e fin ar chadenn." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"An dalvoudegezh-mañ a c'hall enderc'hel lizherennoù hepken, sifroù, pikoù, " -"barrennigoù islinennañ, beskellioù pe tildeoù c'hoazh." - -msgid "Example: '/about/contact'. Make sure to have a leading slash." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "An URL a vank enni ur veskell \"/\" en he fenn-kentañ." - -msgid "URL is missing a trailing slash." -msgstr "An URL a vank enni ur veskell \"/\" en he dilost." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" -"Ar bajenn difiñv d'an URL %(url)s a zo anezhi e-barzh al lec'hienn %(site)s " -"endeo" - -msgid "title" -msgstr "titl" - -msgid "content" -msgstr "danvez" - -msgid "enable comments" -msgstr "aotren an evezhiadennoù" - -msgid "template name" -msgstr "anv patrom" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Da skouer : 'flatpages/contact_page.html'. Ma neket pourvezet, ar sistem a " -"raio gant 'flatpages/default.html'." - -msgid "registration required" -msgstr "enskrivadur rekiset" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ma vez kochet, ar bajenn a c'hallo bezañ gwelet gant an implijerien kevreet " -"hepken." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "pajenn difiñv" - -msgid "flat pages" -msgstr "pajennoù difiñv" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index 752f8f3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index ddc6823..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Filip Dupanović , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Advanced options" -msgstr "Napredna podešavanja" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Primjer: '/about/contact/'. Pazite na to da postoje i početne i završne kose " -"crte." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Ova vrijednost smije samo sadržati slova, brijeve, tačke, donje crte, crte, " -"kose crte i tilde." - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "naslov" - -msgid "content" -msgstr "sadržaj" - -msgid "enable comments" -msgstr "omogući komentare" - -msgid "template name" -msgstr "naziv obrazca" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Primjer: 'flatpages/contact_page.html'. Ako ovo ostavite praznim, sistem će " -"koristiti 'flatpages/default.html'." - -msgid "registration required" -msgstr "registracija obavezna" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ako je ovo obilježeno, samo će prijavljeni korisnici moći da vide ovu " -"stranicu." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "statična stranica" - -msgid "flat pages" -msgstr "statične stranice" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ca/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 9d5dcc1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ca/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index ff25561..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2011 -# Carles Barrobés , 2012,2014 -# Gil Obradors Via , 2019 -# Jannis Leidel , 2011 -# Manel Clos , 2020 -# Roger Pons , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-04-28 20:26+0000\n" -"Last-Translator: Manel Clos \n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Opcions avançades" - -msgid "Flat Pages" -msgstr "Pàgines Estàtiques" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Exemple: '/about/contact/'. Assegureu-vos de posar les barres al principi i " -"al final." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Aquest valor sols pot contenir lletres, nombres, punts, subratllats, guions, " -"barres o accents." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Exemple: '/about/contact/'. Assegureu-vos de posar la barra al principi." - -msgid "URL is missing a leading slash." -msgstr "La URL no comença amb \"/\"." - -msgid "URL is missing a trailing slash." -msgstr "La URL no acaba amb \"/\"." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Ja hi ha una pàgina estàtica amb la URL %(url)s per al lloc %(site)s" - -msgid "title" -msgstr "títol" - -msgid "content" -msgstr "contingut" - -msgid "enable comments" -msgstr "habilitar comentaris" - -msgid "template name" -msgstr "nom de la plantilla" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Exemple: 'flatpages/contact_page.html'. Si no es proporciona, el sistema " -"utilitzarà 'flatpages/default.html'." - -msgid "registration required" -msgstr "cal estar registrat" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Si està marcat, només els usuaris registrats podran veure la pàgina." - -msgid "sites" -msgstr "llocs" - -msgid "flat page" -msgstr "pàgina estàtica" - -msgid "flat pages" -msgstr "pàgines estàtiques" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ckb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index 1448347..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ckb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index 42548f9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# kosar tofiq , 2020 -# Swara , 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2023-04-24 19:03+0000\n" -"Last-Translator: Swara , 2022\n" -"Language-Team: Central Kurdish (http://www.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "هەڵبژاردنە پێشکەوتووەکان" - -msgid "Flat Pages" -msgstr "لاپەڕە تەختەکان" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "نمونە: “/about/contact/”. دڵنیابە کە هێڵی لاری پێش و پاشت نوسیوە." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"ئەم بەهایە دەبێت تەنها پیت، ژمارە، خاڵ، ژێر هێڵ، هێڵ، هێڵی لار یان پێچ " -"لەخۆبگرێت." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "نمونە: “/about/contact”. دڵنیابە کە هێڵی لاری پێشەوەت نوسیوە" - -msgid "URL is missing a leading slash." -msgstr "URL هێڵێکی لاری سەرەتای تێدا نییە." - -msgid "URL is missing a trailing slash." -msgstr "URL هێڵێکی لاری لە دواوە کەمە." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "لاپەڕەی تەخت لەگەڵ url %(url)s پێشتر بوونی هەیە بۆ پێگەی %(site)s" - -msgid "title" -msgstr "ناونیشان" - -msgid "content" -msgstr "ناوەخن" - -msgid "enable comments" -msgstr "چالاککردنی سەرنجەکان" - -msgid "template name" -msgstr "ناوی ڕووکار" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"نمونە: “flatpages/contact_page.html”. ئەگەر ئەمە دابین نەکراوە, سیستەمەکە " -"“flatpages/default.html” بەکاردەهێنێت." - -msgid "registration required" -msgstr "تۆمارکردن داواکراوە" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"ئەگەر ئەمە هەڵبژێردرابێت، ئەوا تەنها ئەو بەکارهێنەرانەی لە ژوورەوەن دەتوانن " -"ئەم لاپەڕە ببینن." - -msgid "sites" -msgstr "ماڵپەڕەکان" - -msgid "flat page" -msgstr "لاپەڕەی تەخت" - -msgid "flat pages" -msgstr "لاپەڕە تەختەکان" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index 2a73798..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index abf9bed..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vláďa Macek , 2011-2012,2014 -# Vláďa Macek , 2015,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-19 09:23+0000\n" -"Last-Translator: Vláďa Macek \n" -"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -msgid "Advanced options" -msgstr "Pokročilá nastavení" - -msgid "Flat Pages" -msgstr "Statické stránky" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Příklad: \"/about/contact/\". Ujistěte se, že máte počáteční a konečná " -"lomítka." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Tato hodnota musí obsahovat pouze písmena, číslice, tečky, podtržítka, " -"pomlčky, lomítka nebo vlnovky." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Příklad: \"/about/contact\". Úvodní lomítko je důležité." - -msgid "URL is missing a leading slash." -msgstr "V adrese URL chybí úvodní lomítko." - -msgid "URL is missing a trailing slash." -msgstr "V adrese URL chybí koncové lomítko." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Flat stránka s adresou %(url)s pro web %(site)s již existuje." - -msgid "title" -msgstr "titulek" - -msgid "content" -msgstr "obsah" - -msgid "enable comments" -msgstr "povolit komentáře" - -msgid "template name" -msgstr "název šablony" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Příklad: \"flatpages/kontaktni_stranka.html\". Pokud toto není zadáno, bude " -"použita šablona \"flatpages/default.html\"." - -msgid "registration required" -msgstr "nutná registrace" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Určuje, že tuto stránku uvidí pouze přihlášení uživatelé." - -msgid "sites" -msgstr "weby" - -msgid "flat page" -msgstr "statická stránka" - -msgid "flat pages" -msgstr "statické stránky" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index dbc7227..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index b910e11..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -msgid "Advanced options" -msgstr "Opsiynau uwch" - -msgid "Flat Pages" -msgstr "Tudalennau Fflat" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Enghraifft: '/amdanom/cyswllt/'. Sicrhewch fod gennych slaesau ar y dechrau " -"a'r diwedd." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Gall y gwerth hwn ond gynnwys llythrennau, rhifau, dotiau, tanlinellau, " -"llinellau doriad, slaesau neu tildeau." - -msgid "URL is missing a leading slash." -msgstr "Mae'r slaes ar goll ar ddechrau'r URL." - -msgid "URL is missing a trailing slash." -msgstr "Mae slaes ar goll ar ddiwedd yr URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" -"Mae flatpage gyda'r url %(url)s yn bodoli yn barod am y safle %(site)s" - -msgid "title" -msgstr "teitl" - -msgid "content" -msgstr "cynnwys" - -msgid "enable comments" -msgstr "galluogi sylwadau" - -msgid "template name" -msgstr "enw'r templed" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Enghraifft: 'flatpages/tudalen_cyswllt.html'. Os na ddarparir hyn, bydd y " -"system yn defnyddio 'flatpages/default.html'." - -msgid "registration required" -msgstr "cofrestriad gofynnol" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Os ticir hwn, dim ond defnyddwyr sydd wedi mewngofnodi bydd yn gallu gweld y " -"dudalen." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "tudalen fflat" - -msgid "flat pages" -msgstr "tudalennau fflat" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index 0e7f50d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index 133810a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Christian Joergensen , 2012 -# Erik Wognsen , 2012,2014-2015,2019 -# Finn Gruwier Larsen, 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 18:11+0000\n" -"Last-Translator: Erik Wognsen \n" -"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Avancerede muligheder" - -msgid "Flat Pages" -msgstr "Flade sider" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Eksempel: “/om/kontakt/”. Vær opmærksom på, at der skal være skråstreg både " -"først og sidst." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Denne værdi må kun indeholde bogstaver, tal, punktum, understreger, " -"bindestreger, skråstreger eller tilder." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Eksempel: “/om/kontakt/”. Vær opmærksom på, at der skal være skråstreg først." - -msgid "URL is missing a leading slash." -msgstr "URL mangler en skråstreg i starten." - -msgid "URL is missing a trailing slash." -msgstr "URL mangler en afsluttende skråstreg." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "En flad side med URL'en %(url)s eksisterer allerede for siden %(site)s" - -msgid "title" -msgstr "titel" - -msgid "content" -msgstr "indhold" - -msgid "enable comments" -msgstr "tillad kommentarer" - -msgid "template name" -msgstr "skabelonnavn" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Eksempel: “flatpages/kontaktside”. Hvis dette ikke gives bruger systemet " -"“flatpages/default”." - -msgid "registration required" -msgstr "registrering påkrævet" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Hvis denne boks er markeret, vil kun brugere der er logget ind, kunne se " -"siden." - -msgid "sites" -msgstr "websider" - -msgid "flat page" -msgstr "flad side" - -msgid "flat pages" -msgstr "flade sider" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/de/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index bd863e2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/de/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 9aac43b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2012 -# Jannis Leidel , 2011,2013-2017,2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-17 23:00+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Erweiterte Optionen" - -msgid "Flat Pages" -msgstr "Flat Pages" - -msgid "URL" -msgstr "Adresse (URL)" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Beispiel: „/about/contact/“. Wichtig: Am Anfang und Ende muss ein " -"Schrägstrich („/“) stehen." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Dieser Wert darf nur Buchstaben, Ziffern, Punkte, Unterstriche, " -"Bindestriche, Schrägstriche und Tilden enthalten." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Beispiel: „/about/contact“. Wichtig: Am Anfang muss ein Schrägstrich („/“) " -"stehen." - -msgid "URL is missing a leading slash." -msgstr "Der URL fehlt ein vorangestellter Schrägstrich." - -msgid "URL is missing a trailing slash." -msgstr "Der URL fehlt ein abschließender Schrägstrich." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" -"Flatpage mit der URL %(url)s ist für die Website %(site)s bereits vorhanden" - -msgid "title" -msgstr "Titel" - -msgid "content" -msgstr "Inhalt" - -msgid "enable comments" -msgstr "Kommentare aktivieren" - -msgid "template name" -msgstr "Name des Templates" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Beispiel: „flatpages/contact_page.html“. Wenn dieses Feld nicht gesetzt ist, " -"wird standardmäßig „flatpages/default.html“ benutzt." - -msgid "registration required" -msgstr "Registrierung erforderlich" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Wenn hier ein Haken gesetzt ist, können nur angemeldete Benutzer die Seite " -"sehen." - -msgid "sites" -msgstr "Websites" - -msgid "flat page" -msgstr "Flat Page" - -msgid "flat pages" -msgstr "Flat Pages" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index 61c6eb0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index c6fc553..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2019-2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-02-25 16:06+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Advanced options" -msgstr "Rozšyrjone nastajenja" - -msgid "Flat Pages" -msgstr "Statiske boki" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Pśikład: „/about/contact/“. Pśeznańśo se, až sćo pódał wócynjajucu a " -"zacynjajucu nakósnu smužku." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Toś ta gódnota smějo jano pismiki, licby, dypki, pódsmužki, , wězawki, " -"nakósne smužki abo tildy wopśimowaś." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Pśikład: „/about/contact“. Pśeznańśo se, až maśo wjeducu nakósnu smužku." - -msgid "URL is missing a leading slash." -msgstr "URL njama wócynjajucu nakósnu smužku." - -msgid "URL is missing a trailing slash." -msgstr "URL njama zacynjajucu nakósnu smužku." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Statiski bok z url %(url)s južo eksistěrujo za sedło %(site)s" - -msgid "title" -msgstr "titel" - -msgid "content" -msgstr "wopśimjeśe" - -msgid "enable comments" -msgstr "komentary zmóžniś" - -msgid "template name" -msgstr "mě pśedłogi" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Pśikład: „flatpages/contact_page.html“. Jolic to njejo pódane, buźo system " -"„flatpages/default.html“ wužywaś." - -msgid "registration required" -msgstr "registrěrowanje trěbne" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Jolic to jo zmóžnjone, mógu se jano pśizjawjone wužywarje bok woglědaś." - -msgid "sites" -msgstr "sedła" - -msgid "flat page" -msgstr "statiski bok" - -msgid "flat pages" -msgstr "statiske boki" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/el/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index f9174a1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/el/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index 1f34dae..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dimitris Glezos , 2011 -# Fotis Athineos , 2021 -# Jannis Leidel , 2011 -# Pãnoș , 2014 -# Pãnoș , 2016,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-08-04 06:27+0000\n" -"Last-Translator: Fotis Athineos \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Προχωρημένες επιλογές" - -msgid "Flat Pages" -msgstr "Απλές Σελίδες" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Παράδειγμα: “/about/contact/“. Βεβαιωθείτε ότι περιέχει καθέτους στην αρχή " -"και το τέλος." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Η τιμή αυτή πρέπει να περιέχει μόνο γράμματα, αριθμούς, τελείες, παύλες, " -"κάτω παύλες, καθέτους ή περισπωμένες." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Παράδειγμα: “/about/contact/“. Βεβαιωθείτε ότι περιέχει κάθετο στην αρχή." - -msgid "URL is missing a leading slash." -msgstr "Λείπει μια αρχική κάθετος από την διεύθυνση." - -msgid "URL is missing a trailing slash." -msgstr "Λείπει μια τελική κάθετος από τη διεύθυνση." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" -"Υπάρχει ήδη Απλή σελίδα με διεύθυνση %(url)s για την ιστοσελίδα %(site)s" - -msgid "title" -msgstr "τίτλος" - -msgid "content" -msgstr "περιεχόμενο" - -msgid "enable comments" -msgstr "ενεργοποίηση σχολίων" - -msgid "template name" -msgstr "όνομα περιγράμματος" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Παράδειγμα: “flatpages/contact_page.html“. Αν δεν δηλωθεί, το σύστημα θα " -"χρησιμοποιήσει το “flatpages/default.html“." - -msgid "registration required" -msgstr "απαιτείται εγγραφή" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Εάν επιλεγεί, μόνο συνδεδεμένοι χρήστες θα μπορούν να βλέπουν τη σελίδα." - -msgid "sites" -msgstr "ιστότοποι" - -msgid "flat page" -msgstr "απλή σελίδα" - -msgid "flat pages" -msgstr "απλές σελίδες" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 08a7b68..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index 8fe158e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,96 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: contrib/flatpages/admin.py:12 -msgid "Advanced options" -msgstr "" - -#: contrib/flatpages/apps.py:7 -msgid "Flat Pages" -msgstr "" - -#: contrib/flatpages/forms.py:9 contrib/flatpages/models.py:9 -msgid "URL" -msgstr "" - -#: contrib/flatpages/forms.py:12 -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" - -#: contrib/flatpages/forms.py:15 -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -#: contrib/flatpages/forms.py:29 -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" - -#: contrib/flatpages/forms.py:42 -msgid "URL is missing a leading slash." -msgstr "" - -#: contrib/flatpages/forms.py:47 -msgid "URL is missing a trailing slash." -msgstr "" - -#: contrib/flatpages/forms.py:64 -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -#: contrib/flatpages/models.py:10 -msgid "title" -msgstr "" - -#: contrib/flatpages/models.py:11 -msgid "content" -msgstr "" - -#: contrib/flatpages/models.py:12 -msgid "enable comments" -msgstr "" - -#: contrib/flatpages/models.py:14 -msgid "template name" -msgstr "" - -#: contrib/flatpages/models.py:18 -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" - -#: contrib/flatpages/models.py:23 -msgid "registration required" -msgstr "" - -#: contrib/flatpages/models.py:24 -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -#: contrib/flatpages/models.py:27 -msgid "sites" -msgstr "" - -#: contrib/flatpages/models.py:31 -msgid "flat page" -msgstr "" - -#: contrib/flatpages/models.py:32 -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index 354cbe6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index 9e09c70..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Katie McLaughlin , 2021 -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-06-23 07:20+0000\n" -"Last-Translator: Katie McLaughlin \n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Advanced options" - -msgid "Flat Pages" -msgstr "Flat Pages" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Example: “/about/contact”. Make sure to have a leading slash." - -msgid "URL is missing a leading slash." -msgstr "URL is missing a leading slash." - -msgid "URL is missing a trailing slash." -msgstr "URL is missing a trailing slash." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Flatpage with url %(url)s already exists for site %(site)s" - -msgid "title" -msgstr "title" - -msgid "content" -msgstr "content" - -msgid "enable comments" -msgstr "enable comments" - -msgid "template name" -msgstr "template name" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." - -msgid "registration required" -msgstr "registration required" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"If this is checked, only logged-in users will be able to view the page." - -msgid "sites" -msgstr "sites" - -msgid "flat page" -msgstr "flat page" - -msgid "flat pages" -msgstr "flat pages" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index a85d1d1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index 68b6158..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,85 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# jon_atkinson , 2012 -# Ross Poulton , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Advanced options" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." - -msgid "URL is missing a leading slash." -msgstr "URL is missing a leading slash." - -msgid "URL is missing a trailing slash." -msgstr "URL is missing a trailing slash." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Flatpage with url %(url)s already exists for site %(site)s" - -msgid "title" -msgstr "title" - -msgid "content" -msgstr "content" - -msgid "enable comments" -msgstr "enable comments" - -msgid "template name" -msgstr "template name" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." - -msgid "registration required" -msgstr "registration required" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"If this is checked, only logged-in users will be able to view the page." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "flat page" - -msgid "flat pages" -msgstr "flat pages" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eo/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index 16e74c3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eo/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index 7a66172..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Batist D 🐍 , 2011-2012 -# Batist D 🐍 , 2014-2015,2017,2019 -# Matthieu Desplantes , 2021 -# Meiyer , 2022 -# Robin van der Vliet , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2022-04-24 19:03+0000\n" -"Last-Translator: Meiyer , 2022\n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Altnivelaj elektoj" - -msgid "Flat Pages" -msgstr "Simplaj paĝoj" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Ekzemple: “/about/contact/”. Certigu, ke estas suprenstrekoj komence kaj " -"fine." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Ĉi tiu valoro devus enhavi sole literojn, ciferojn, punktojn, substrekojn, " -"haltostrekojn, oblikvajn strekojn, aŭ tildojn." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Ekzemple: “/about/contact”. Certigu, ke estas suprenstreko komence." - -msgid "URL is missing a leading slash." -msgstr "La strek-signo ‘/’ ne ĉeestas en la komenco de URL." - -msgid "URL is missing a trailing slash." -msgstr "La strek-signo ‘/’ ne ĉeestas en la fino de URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Simpla paĝo kun URL %(url)s jam ekzistas por la retejo %(site)s" - -msgid "title" -msgstr "titolo" - -msgid "content" -msgstr "enhavo" - -msgid "enable comments" -msgstr "ebligi rimarkojn" - -msgid "template name" -msgstr "nomo de ŝablono" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Ekzemple: “flatpages/contact_page.html”. Se la ŝablono ne estas indikita, " -"estos uzata “flatpages/default.html”." - -msgid "registration required" -msgstr "registriĝo postulita" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Kiam la marko-butono estas elektita, nur ensalutintaj uzantoj povas rigardi " -"la paĝon." - -msgid "sites" -msgstr "retejoj" - -msgid "flat page" -msgstr "simpla paĝo" - -msgid "flat pages" -msgstr "simplaj paĝoj" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 33d67b0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 060a385..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2011-2012 -# Ernesto Avilés, 2015 -# Ernesto Avilés, 2014 -# Ignacio José Lizarán Rus , 2019 -# Jannis Leidel , 2011 -# Uriel Medina , 2020 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-09-25 17:43+0000\n" -"Last-Translator: Uriel Medina \n" -"Language-Team: Spanish (http://www.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Opciones avanzadas" - -msgid "Flat Pages" -msgstr "Páginas estáticas" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Ejemplo: “/about/contact/”. Asegúrese de tener barras al principio y al " -"final." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Este valor solo puede contener letras, números, puntos, guiones bajos o " -"medios, barras o tildes." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Ejemplo: \"/about/contact”. Asegúrese de tener una barra al principio." - -msgid "URL is missing a leading slash." -msgstr "A la URL le falta la barra inicial." - -msgid "URL is missing a trailing slash." -msgstr "A la URL le falta la barra final." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr " En el sitio %(site)s ya hay una pagina estática con la url %(url)s" - -msgid "title" -msgstr "título" - -msgid "content" -msgstr "contenido" - -msgid "enable comments" -msgstr "habilitar comentarios" - -msgid "template name" -msgstr "nombre de plantilla" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Ejemplo: \"flatpages/contact_page.html\". Si no se proporciona, el sistema " -"utilizará \"flatpages/default.html\"." - -msgid "registration required" -msgstr "Se requiere registro" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página." - -msgid "sites" -msgstr "sitios" - -msgid "flat page" -msgstr "página estática" - -msgid "flat pages" -msgstr "páginas estáticas" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index d28b2e4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 0c0d4a9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ramiro Morales, 2011-2012,2014-2015,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-10-01 10:25+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Opciones avanzadas" - -msgid "Flat Pages" -msgstr "Páginas Estáticas" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Ejemplo: “/about/contact/”. Asegúrese de usar barras '/' al principio y al " -"final." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Este valor debe contener solamente letras, números, puntos, guiones bajos, " -"guiones (-), barras (/) o tildes." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Ejemplo: “/about/contact”. Asegúrese de usar una barra ('/') al principio." - -msgid "URL is missing a leading slash." -msgstr "A la URL le falta una / al principio." - -msgid "URL is missing a trailing slash." -msgstr "A la URL le falta una / al final." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Ya existe una flatpage con url %(url)s para el sitio %(site)s" - -msgid "title" -msgstr "título" - -msgid "content" -msgstr "contenido" - -msgid "enable comments" -msgstr "activar comentarios" - -msgid "template name" -msgstr "nombre de plantilla" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Ejemplo: “flatpages/contact_page.html”. Si no lo proporciona, el sistema " -"usará “flatpages/default.html”." - -msgid "registration required" -msgstr "debe estar registrado" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página." - -msgid "sites" -msgstr "sitios" - -msgid "flat page" -msgstr "página estática" - -msgid "flat pages" -msgstr "páginas estáticas" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index 0564ec3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index c977035..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ernesto Avilés Vázquez , 2014-2015 -# Jannis Leidel , 2011 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-20 03:01+0000\n" -"Last-Translator: Carlos Muñoz \n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Opciones avanzadas" - -msgid "Flat Pages" -msgstr "Páginas estáticas" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al " -"final." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Este valor solo puede contener letras, números, puntos, guiones bajos o " -"medios, barras o tildes." - -msgid "URL is missing a leading slash." -msgstr "A la URL le falta la barra inicial." - -msgid "URL is missing a trailing slash." -msgstr "A la URL le falta la barra final." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr " En el sitio %(site)s ya hay un Flatpage con la url %(url)s" - -msgid "title" -msgstr "título" - -msgid "content" -msgstr "contenido" - -msgid "enable comments" -msgstr "habilitar comentarios" - -msgid "template name" -msgstr "nombre de plantilla" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Ejemplo: 'flatpages/contact_page.html'. Si no se proporciona uno, el sistema " -"usará 'flatpages/default.html'." - -msgid "registration required" -msgstr "debe estar registrado" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página." - -msgid "sites" -msgstr "sitios" - -msgid "flat page" -msgstr "página estática" - -msgid "flat pages" -msgstr "páginas estáticas" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index 9b3ce53..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index 1fbad5f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abraham Estrada, 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Opciones avanzadas" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Ejemplo: '/acerca/contacto/'. Asegúrese de usar barras '/' al principio y al " -"final." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Este valor debe contener solamente letras, números, puntos, guiones bajos, " -"guiones (-), barras (/) o tildes." - -msgid "URL is missing a leading slash." -msgstr "A la URL le falta una diagonal al inicio" - -msgid "URL is missing a trailing slash." -msgstr "A la URL le falta una diagonal al final" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "La página con la url %(url)s ya existe para el sitio %(site)s" - -msgid "title" -msgstr "título" - -msgid "content" -msgstr "contenido" - -msgid "enable comments" -msgstr "activar comentarios" - -msgid "template name" -msgstr "nombre de la plantilla" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Ejemplo: 'flatpages/pagina_contacto.html'. Si no lo proporciona, el sistema " -"usará 'flatpages/default.html'." - -msgid "registration required" -msgstr "necesario registrarse" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "página estática" - -msgid "flat pages" -msgstr "páginas estática" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index daa82b4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index dbaf54b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,85 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Leonardo J. Caballero G. , 2016 -# Leonardo J. Caballero G. , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Leonardo J. Caballero G. \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" -"language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Opciones avanzadas" - -msgid "Flat Pages" -msgstr "Páginas estáticas" - -msgid "URL" -msgstr "Dirección URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al " -"final." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Este valor solo puede contener letras, números, puntos, guiones bajos o " -"medios, barras o tildes." - -msgid "URL is missing a leading slash." -msgstr "A la URL le falta la barra inicial." - -msgid "URL is missing a trailing slash." -msgstr "A la URL le falta la barra final." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "La página estática con la url %(url)s ya existe para el sitio %(site)s" - -msgid "title" -msgstr "título" - -msgid "content" -msgstr "contenido" - -msgid "enable comments" -msgstr "permitir comentarios" - -msgid "template name" -msgstr "nombre de la plantilla" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Ejemplo: 'flatpages/contact_page.html'. Si no se proporciona uno, el sistema " -"usará 'flatpages/default.html'." - -msgid "registration required" -msgstr "es necesario registrarse" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página." - -msgid "sites" -msgstr "sitios" - -msgid "flat page" -msgstr "página estática" - -msgid "flat pages" -msgstr "páginas estáticas" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index 82b3c23..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index da51a04..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Janno Liivak , 2013-2015 -# madisvain , 2011 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-28 02:36+0000\n" -"Last-Translator: Ragnar Rebase \n" -"Language-Team: Estonian (http://www.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Lisavalikud" - -msgid "Flat Pages" -msgstr "Sisulehed" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Näide: “/about/contact/”. Veenduge, et URL algaks ja lõppeks kaldkriipsuga." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"See väärtus peab sisaldama ainult tähti, numbreid, punkte, alakriipse, " -"kriipse, kaldkriipse või tildeseid." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Näide: “/about/contact”. Veenduge, et URL algaks kaldkriipsuga." - -msgid "URL is missing a leading slash." -msgstr "Internetiaadressil puudub alustav kaldkriips" - -msgid "URL is missing a trailing slash." -msgstr "Internetiaadressil puudub lõpetav kaldkriips" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Saidil %(site)s on sisuleht aadressiga %(url)s juba olemas" - -msgid "title" -msgstr "pealkiri" - -msgid "content" -msgstr "sisu" - -msgid "enable comments" -msgstr "võimalda kommentaarid" - -msgid "template name" -msgstr "mall" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Näide: “flatpages/contact_page.html”.  Kui mall on määramata, kasutatakse " -"vaikimisi malli “flatpages/default.html”." - -msgid "registration required" -msgstr "registreerumine nõutav" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Kui see on valitud, näevad lehte ainult sisselogitud kasutajad" - -msgid "sites" -msgstr "saidid" - -msgid "flat page" -msgstr "sisuleht" - -msgid "flat pages" -msgstr "sisulehed" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index b49fd45..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index 66f3d48..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aitzol Naberan , 2011-2012 -# Eneko Illarramendi , 2017,2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-22 10:01+0000\n" -"Last-Translator: Eneko Illarramendi \n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Aukera aurreratuak" - -msgid "Flat Pages" -msgstr "Flatpage-ak" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Adibidez: '/about/contact/'. Ziurta zaitez '/' karaktera hasieran eta " -"bukaeran dagoela." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Eremu honetan soilik hizki, zenbaki, puntu, azpimarra, marra, / edo ~ egon " -"daitezke." - -msgid "Example: '/about/contact'. Make sure to have a leading slash." -msgstr "Adibidez: '/about/contact'. Ez ahaztu hasieran barra bat gehitzea." - -msgid "URL is missing a leading slash." -msgstr "URLak hasierako / falta du." - -msgid "URL is missing a trailing slash." -msgstr "URLk bukaerako / falta du." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(site)s webgunean dagoeneko existitzende %(url)s urldun Flatpage bat" - -msgid "title" -msgstr "izenburua" - -msgid "content" -msgstr "edukia" - -msgid "enable comments" -msgstr "komentarioak onartu" - -msgid "template name" -msgstr "plantila izena" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Adibidez: 'flatpages/contact_page.html'. Hau zehazten ez bada, sistemak " -"'flatpages/default.html' erabiliko du." - -msgid "registration required" -msgstr "erregistratzea beharrezkoa da" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Hau markatuta badago, erregistratutako erabiltzaileek bakarrik ikusiko dute " -"orria." - -msgid "sites" -msgstr "webguneak" - -msgid "flat page" -msgstr "flat page" - -msgid "flat pages" -msgstr "flat pages" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index d884e7e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index cf0477c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Nikneshan , 2011-2012 -# Ali Vakilzade , 2015 -# Fariman Ghaedi , 2019 -# Jannis Leidel , 2011 -# rahim agh , 2021 -# Reza Mohammadi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-04-19 03:16+0000\n" -"Last-Translator: rahim agh \n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Advanced options" -msgstr "گزینه‌های پیشرفته" - -msgid "Flat Pages" -msgstr "صفحات تخت" - -msgid "URL" -msgstr "نشانی اینترنتی" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"مثال: '/about/contact/'. مطمئن شوید که اسلش را هم در ابتدا و هم در انتها " -"گذاشته‌اید." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "این مقدار فقط باید حاوی حروف، اعداد، خط زیر، خط تیره و یا اسلش باشد." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "مثال: 'about/contact/'. مطمئن شوید که یک اسلش در ابتدا وجود دارد. " - -msgid "URL is missing a leading slash." -msgstr "در آدرس اسلش آغازین فراموش شده است." - -msgid "URL is missing a trailing slash." -msgstr "در آدرس اسلش پایانی فراموش شده است." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "صفحه تخت با آدرس %(url)s برای سایت %(site)s وجود دارد " - -msgid "title" -msgstr "عنوان" - -msgid "content" -msgstr "محتوا" - -msgid "enable comments" -msgstr "فعال کردن نظرات" - -msgid "template name" -msgstr "نام قالب" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"مثال: 'flatpages/contact_page.html'. اگر این مشخص نشود، سیستم از 'flatpages/" -"default.html' استفاده خواهد کرد." - -msgid "registration required" -msgstr "عضویت لازم است" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"اگر این انتخاب شود، فقط کاربران وارد شده خواهند توانست این صفحه را مشاهده " -"نمایند." - -msgid "sites" -msgstr "وب‌گاه‌ها" - -msgid "flat page" -msgstr "صفحه تخت" - -msgid "flat pages" -msgstr "صفحات تخت" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index c71b4ec..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index 789cd92..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2020 -# Jannis Leidel , 2011 -# Klaus Dahlén , 2012 -# Ville Säävuori , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-12-09 06:32+0000\n" -"Last-Translator: Aarni Koskela\n" -"Language-Team: Finnish (http://www.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Lisäasetukset" - -msgid "Flat Pages" -msgstr "Tekstisivut" - -msgid "URL" -msgstr "URL-osoite" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Esimerkki: '/tietoja/yhteystiedot/'. Varmista että sekä alussa että lopussa " -"on kauttaviiva." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Tämä arvo saa sisältää vain kirjaimia, numeroita, pisteitä sekä ala-, tavu-, " -"kautta- ja aaltoviivoja." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Esimerkki: \"/tietoja/yhteystiedot/\". Varmista että alussa on kauttaviiva." - -msgid "URL is missing a leading slash." -msgstr "URL:n alusta puuttuu kauttaviiva." - -msgid "URL is missing a trailing slash." -msgstr "URL:n lopusta puuttuu kauttaviiva." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Sivustolla %(site)s on jo sivu, jonka URL on %(url)s" - -msgid "title" -msgstr "otsikko" - -msgid "content" -msgstr "sisältö" - -msgid "enable comments" -msgstr "salli kommentit" - -msgid "template name" -msgstr "mallipohjan nimi" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Esimerkiksi: \"flatpages/yhteydenotto.html'\" Jos tämä jätetään tyhjäksi, " -"käytetään oletuspohjaa \"flatpages/default.html\"." - -msgid "registration required" -msgstr "vaaditaan rekisteröityminen" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Jos tämä kohta on valittu, vain sisäänkirjautuneet käyttäjät näkevät sivun." - -msgid "sites" -msgstr "sivustot" - -msgid "flat page" -msgstr "tekstisivu" - -msgid "flat pages" -msgstr "tekstisivut" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 41ed7dc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index fb72ed9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Simon Charette , 2012 -# Claude Paroz , 2014-2015,2019 -# Claude Paroz , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-18 16:02+0000\n" -"Last-Translator: Claude Paroz \n" -"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Advanced options" -msgstr "Options avancées" - -msgid "Flat Pages" -msgstr "Pages statiques" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Par exemple, « /a_propos/contact/ ». Vérifiez la présence du caractère « / » " -"en début et en fin de chaîne." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Cette valeur ne peut contenir que des lettres, des chiffres, des points, des " -"soulignés, des tirets, des barres obliques ou des tildes." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Par exemple, « /a_propos/contact ». Vérifiez la présence du caractère « / » " -"en début de chaîne." - -msgid "URL is missing a leading slash." -msgstr "Le caractère « / » n'est pas présent en début de chaîne." - -msgid "URL is missing a trailing slash." -msgstr "Le caractère « / » n'est pas présent en fin de chaîne." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "La page statique à l’URL %(url)s existe déjà pour le site %(site)s" - -msgid "title" -msgstr "titre" - -msgid "content" -msgstr "contenu" - -msgid "enable comments" -msgstr "autoriser les commentaires" - -msgid "template name" -msgstr "nom du gabarit" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Par exemple, « flatpages/contact_page.html ». Sans définition, le système " -"utilisera « flatpages/default.html »." - -msgid "registration required" -msgstr "enregistrement requis" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Si coché, seuls les utilisateurs connectés auront la possibilité de voir " -"cette page." - -msgid "sites" -msgstr "sites" - -msgid "flat page" -msgstr "page statique" - -msgid "flat pages" -msgstr "pages statiques" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index d130f4e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index 29912b3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,74 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:34+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "" - -msgid "content" -msgstr "" - -msgid "enable comments" -msgstr "" - -msgid "template name" -msgstr "" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" - -msgid "registration required" -msgstr "" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ga/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index fdb1677..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ga/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index 5db5dba..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Jannis Leidel , 2011 -# Michael Thornhill , 2011-2012,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2024-10-07 19:03+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -msgid "Advanced options" -msgstr "Ard-rogha" - -msgid "Flat Pages" -msgstr "Leathanaigh Maol" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Sampla: “/ faoi/teagmháil/”. Bí cinnte go bhfuil slais tosaigh agus slaise " -"agat." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Ní mór an luach a bhfuil ach litreacha, uimhreacha, poncanna, béim, dashes, " -"slaiseanna nó thilde." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Sampla: “/ faoi/teagmháil”. Bí cinnte go bhfuil slais tosaigh." - -msgid "URL is missing a leading slash." -msgstr "Tá slais tosaigh in easnamh ag an URL." - -msgid "URL is missing a trailing slash." -msgstr "Tá slais deireanach in easnamh ag an URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Tá flatpage le url %(url)s ann cheana le suíomh %(site)s." - -msgid "title" -msgstr "teideal" - -msgid "content" -msgstr "inneachar" - -msgid "enable comments" -msgstr "Cuir nótaí tráchta ar chumas" - -msgid "template name" -msgstr "ainm an teimpléid" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Sampla: “flatpages/contact_page.html”. Mura gcuirtear é seo ar fáil, " -"úsáidfidh an córas “flatpages/default.html”." - -msgid "registration required" -msgstr "clárúchán riachtanach" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Dá mbéadh é seo seicailte, ní beidh ach úsáideora logáilte isteach in ann an " -"leathanach seo a fheiceail" - -msgid "sites" -msgstr "láithreáin" - -msgid "flat page" -msgstr "leacleathanach" - -msgid "flat pages" -msgstr "leacleathanaigh" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gd/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index c430c58..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gd/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index 1e99447..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,95 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2015 -# GunChleoc, 2015 -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-13 12:47+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -msgid "Advanced options" -msgstr "Roghainnean adhartach" - -msgid "Flat Pages" -msgstr "Duilleagan rèidhe" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Mar eisimpleir: “/mu-dheidhinn/fios-thugainn/”. Dèan cinnteach gum bi slais " -"air an toiseach ’s air an deireadh." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Chan fhaod ach litrichean, àireamhan, puingean, fo-loidhnichean, tàthanan, " -"slaisichean is tuinn a bhith san luach." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Mar eisimpleir: “/mu-dheidhinn/fios-thugainn/”. Dèan cinnteach gum bi slais " -"air an toiseach ’s air an deireadh." - -msgid "URL is missing a leading slash." -msgstr "Tha slais a dhìth air thoiseach an URL." - -msgid "URL is missing a trailing slash." -msgstr "Tha slais a dhìth air deireadh an URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" -"Tha duilleag rèidh le url %(url)s ann mar-tà airson na làraich %(site)s" - -msgid "title" -msgstr "tiotal" - -msgid "content" -msgstr "susbaint" - -msgid "enable comments" -msgstr "cuir beachdan an comas" - -msgid "template name" -msgstr "ainm na teamplaid" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Ball-eisimpleir: “flatpages/duilleag_fios_thugainn.html”. Mura dèid seo a " -"sholar-cleachdaidh an siostam “flatpages/default.html”." - -msgid "registration required" -msgstr "tha clàradh riatanach" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ma tha cromag ris, chan faic ach na chleachdaichean a chlàraich a-steach an " -"duilleag seo." - -msgid "sites" -msgstr "làraichean" - -msgid "flat page" -msgstr "duilleag rèidh" - -msgid "flat pages" -msgstr "duilleagan rèidhe" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index 4b784c2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index 22b733a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# fasouto , 2011 -# fonso , 2011,2013 -# Jannis Leidel , 2011 -# Leandro Regueiro , 2013 -# X Bello , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2023-04-24 19:03+0000\n" -"Last-Translator: X Bello , 2023\n" -"Language-Team: Galician (http://www.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Opcións avanzadas" - -msgid "Flat Pages" -msgstr "Páxinas simples" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "Exemplo: “/about/contact”. Lembre incluír as barras inicial e final." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Este valor soamente pode conter letras, números, puntos, guións baixos, " -"guións, barras inclinadas e tiles do eñe (~)." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Exemplo: “/about/contact”. Lembre incluír a barra inicial." - -msgid "URL is missing a leading slash." -msgstr "Falta unha barra inclinada no principio da URL." - -msgid "URL is missing a trailing slash." -msgstr "Falta unha barra inclinada no final da URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Xa existe unha páxina simple con url %(url)s no sitio %(site)s" - -msgid "title" -msgstr "título" - -msgid "content" -msgstr "contido" - -msgid "enable comments" -msgstr "activar comentarios" - -msgid "template name" -msgstr "nome da plantilla" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Exemplo: “flatpages/contact_page.html”. Se non se especifica, o sistema " -"usará “flatpages/default.html”." - -msgid "registration required" -msgstr "require rexistro" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Se se marca, só poderán ver a páxina os usuarios identificados." - -msgid "sites" -msgstr "sitios" - -msgid "flat page" -msgstr "páxina simple" - -msgid "flat pages" -msgstr "páxinas simples" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/he/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index 4d5347e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/he/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index e703c63..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 534b44a19bf18d20b71ecc4eb77c572f_db336e9 , 2011 -# Jannis Leidel , 2011 -# Meir Kriheli , 2012,2014-2015,2019-2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-08-02 13:26+0000\n" -"Last-Translator: Meir Kriheli \n" -"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -msgid "Advanced options" -msgstr "אפשרויות מתקדמות" - -msgid "Flat Pages" -msgstr "דפים פשוטים" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "דוגמה: “/about/contact/”. יש לוודא שמכיל קווים נטויים בהתחלה ובסוף." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"הערך הזאת חייב להכיל רק אותיות, מספרים, נקודות, מקפים, קווים תחתונים, חתכים " -"או סימני טילדה בלבד." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "דוגמה: “‎/about/contact”. יש לוודא שמכיל קו נטוי בהתחלה." - -msgid "URL is missing a leading slash." -msgstr "חסר קו נטוי בתחילת URL." - -msgid "URL is missing a trailing slash." -msgstr "חסר קו נטוי בסוף URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "קיים כבר דף פשוט עם url %(url)s עבור אתר %(site)s" - -msgid "title" -msgstr "כותרת" - -msgid "content" -msgstr "תוכן" - -msgid "enable comments" -msgstr "אפשר תגובות" - -msgid "template name" -msgstr "שם תבנית" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"דוגמה: “flatpages/contact_page.html”. אם לא צוין, המערכת תשתמש ב־“flatpages/" -"default.html”." - -msgid "registration required" -msgstr "הרשמה נדרשת" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "אם מסומן, רק משתמשים מחוברים יוכלו לצפות בדף." - -msgid "sites" -msgstr "אתרים" - -msgid "flat page" -msgstr "דף פשוט" - -msgid "flat pages" -msgstr "דפים פשוטים" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index ca42d15..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index 1851834..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,81 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chandan kumar , 2012 -# Jannis Leidel , 2011 -# Sandeep Satavlekar , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "उन्नत विकल्प" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "अग्रणी है और अनुगामी स्लैश का होना सुनिश्चित करें. उदाहरण: '/about/contact/'" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "इस मूल्य में सिर्फ वर्णाक्षर, अंक, बिंदु, रेखांकन, डैश, स्लैश और टिल्ड्स ही होने चाहिए" - -msgid "URL is missing a leading slash." -msgstr "यूआरएल से प्रमुख स्लैश गायब है." - -msgid "URL is missing a trailing slash." -msgstr "यूआरएल से अनुगामी स्लैश गायब है." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(site)s साइट के लिए %(url)s यूआरएल के साथ चपटापृष्ट मौजूद है." - -msgid "title" -msgstr "शीर्षक" - -msgid "content" -msgstr "विषय सूची" - -msgid "enable comments" -msgstr "टिप्पणियां सक्षम करें" - -msgid "template name" -msgstr "सांचे का नाम" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"उदाहरण: 'flatpages/contact_page.html'. यदि यह जिक्र नहीं किया तो यह प्रणाली " -"'flatpages/default.html' का प्रयोग करेगी. ." - -msgid "registration required" -msgstr "पंजीकरण आवश्यक" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "अगर इस जाँच की है, केवल लॉग इन करने वालों के लिए पृष्ठ देखने में सक्षम हो जाएगा." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "चपटा पृष्ट" - -msgid "flat pages" -msgstr "चपटे पृष्ट" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index d310400..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index 7e7c163..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# aljosa , 2011-2012 -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Mislav Cimperšak \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgid "Advanced options" -msgstr "Napredne opcije" - -msgid "Flat Pages" -msgstr "Statične stranice" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Primjer: '/about/contact/'. Provjerite ako imate prvi i preostale slash-eve " -"(/)." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Ova vrijednost može sadržavati samo slova, brojeve, točke, podvlake, crtice, " -"kose crte ili tilde." - -msgid "URL is missing a leading slash." -msgstr "URL-u nedostaje početni /." - -msgid "URL is missing a trailing slash." -msgstr "URL-u nedostaje / na kraju." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Stranica sa URL-om %(url)s već postoji za web %(site)s" - -msgid "title" -msgstr "naslov" - -msgid "content" -msgstr "sadržaj" - -msgid "enable comments" -msgstr "uključi komentare" - -msgid "template name" -msgstr "ime template-a" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Primjer: 'flatpages/contact_page.html'. Ako navedeno nije definirano sistem " -"će koristiti 'flatpages/default.html'." - -msgid "registration required" -msgstr "registracija obavezna" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ako je ovo selektirano samo logirani korisnici moći će vidjeti ovu stranicu." - -msgid "sites" -msgstr "stranice" - -msgid "flat page" -msgstr "statična stranica" - -msgid "flat pages" -msgstr "statične stranice" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index b8111a2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index 3df5cab..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-21 19:28+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Advanced options" -msgstr "Rozšěrjene nastajenja" - -msgid "Flat Pages" -msgstr "Statiske strony" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Přikład: '/about/contact/'. Přeswědčće so, zo sće wočinjace a začinjace " -"nakósne smužki podał." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Tuta hódnota smě jenož pismiki, ličby, dypki, podsmužki, wjazawki, nakósne " -"smužki abo tildy wobsahować." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Přikład: 'about/contact'. Zawěsćće, zo maće nawodnu nakósnu smužku." - -msgid "URL is missing a leading slash." -msgstr "URL wočinjacu nakósnu smužku nima." - -msgid "URL is missing a trailing slash." -msgstr "URL začinjacu nakósnu smužku nima." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Statiska strona z url %(url)s hižo za sydło %(site)s eksistuje" - -msgid "title" -msgstr "titul" - -msgid "content" -msgstr "wobsah" - -msgid "enable comments" -msgstr "komentary zmóžnić" - -msgid "template name" -msgstr "mjeno předłohi" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Přikład: 'flatpages/contact_page.html'. Jeli to njeje podate, budźe system " -"'flatpages/default.html' wužiwać." - -msgid "registration required" -msgstr "registrowanje trěbne" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Jeli to je zmóžnjene, móža sej jenož přizjewjeni wužiwarjo stronu wobhladać." - -msgid "sites" -msgstr "sydła" - -msgid "flat page" -msgstr "statiska strona" - -msgid "flat pages" -msgstr "statiske strony" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index ccf6f73..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index ebc44ba..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,94 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# András Veres-Szentkirályi, 2016,2019 -# Istvan Farkas , 2019 -# Jannis Leidel , 2011 -# Szilveszter Farkas , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-18 10:16+0000\n" -"Last-Translator: Istvan Farkas \n" -"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "További beállítások" - -msgid "Flat Pages" -msgstr "Egyszerű oldalak" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Példa: \"/rolunk/kapcsolat/\" Bizonyosodjon meg róla, hogy a kezdő és záró " -"\"/\" karakterek a helyükön vannak." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Ez az érték csak betűt, számot, pontot, aláhúzást, kötőjelet, perjelet, vagy " -"hullámot tartalmazhat." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Példa: \"/rolunk/kapcsolat\". Bizonyosodjon meg róla, hogy \"/\" karakterrel " -"kezdődik." - -msgid "URL is missing a leading slash." -msgstr "AZ URL-ből hiányzik a kezdő perjel." - -msgid "URL is missing a trailing slash." -msgstr "AZ URL-ből hiányzik a záró perjel." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(site)s honlapon már létezik egyszerű oldal ezzel az URL-lel: %(url)s" - -msgid "title" -msgstr "cím" - -msgid "content" -msgstr "tartalom" - -msgid "enable comments" -msgstr "megjegyzések engedélyezése" - -msgid "template name" -msgstr "sablon neve" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Példa: \"flatpages/contact_page.html\". Ha ez nincs megadva, a rendszer a " -"\"flatpages/default.html\" értéket fogja használni." - -msgid "registration required" -msgstr "regisztráció szükséges" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ha ez be van jelölve, csak bejelentkezett felhasználó tudja az oldalt " -"megnézni." - -msgid "sites" -msgstr "honlapok" - -msgid "flat page" -msgstr "egyszerű oldal" - -msgid "flat pages" -msgstr "egyszerű oldalak" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index 447dc4e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index 7e9ee66..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2018-11-01 20:34+0000\n" -"Last-Translator: Ruben Harutyunov \n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Ընդլայնված կարգավորումներ" - -msgid "Flat Pages" -msgstr "Պարզ էջեր" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Օրինակ․ '/about/contact/'։ Համոզվեք, որ մուտքագրել եք սկզբի և վերջի թեք " -"գծերը։" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Այս արժեքը պետք է պարունակի միայն տառեր, թվեր, կետեր, ընդգծումներ, գծեր, թեք " -"գծեր կամ ալիքանշաններ։" - -msgid "URL is missing a leading slash." -msgstr "URL֊ը չունի սկզբի թեք գիծ։" - -msgid "URL is missing a trailing slash." -msgstr "URL֊ը չունի վերջի թեք գիծ։" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(url)s url֊ով էջ արդեն գոյություն ունի %(site)s կայքի համար" - -msgid "title" -msgstr "վերնագիր" - -msgid "content" -msgstr "պարունակություն" - -msgid "enable comments" -msgstr "միացնել մեկնաբանությունները" - -msgid "template name" -msgstr "template֊ի անունը" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Օրինակ․ 'flatpages/contact_page.html'։ Եթե տրամադրված չէ, համակարգը " -"կօգտագործի 'flatpages/default.html' ֆայլը։" - -msgid "registration required" -msgstr "պահանջվում է գրանցվել" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Եթե սա նշված է, միայն մուտք գործած օգտագործողները կկարողանան դիտել էջը։" - -msgid "sites" -msgstr "կայքեր" - -msgid "flat page" -msgstr "պարզ էջ" - -msgid "flat pages" -msgstr "պարզ էջեր" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ia/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index 8b37130..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ia/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index 3df229d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,77 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "" - -msgid "content" -msgstr "" - -msgid "enable comments" -msgstr "" - -msgid "template name" -msgstr "" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" - -msgid "registration required" -msgstr "" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/id/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index 4426268..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/id/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index 9057580..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fery Setiawan , 2015-2016,2019-2020 -# Jannis Leidel , 2011 -# rodin , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-02-06 02:33+0000\n" -"Last-Translator: Fery Setiawan \n" -"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "Opsi lanjutan" - -msgid "Flat Pages" -msgstr "Halaman Tetap" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Contoh: “/about/contact/”. Pastikan memiliki awalan dan akhiran garis miring." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Nilai hanya hanya dapat berisi huruf, angka, titik, garis bawah, tanda " -"minus, garis miring, atau tanda tilde." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Contoh: “/about/contact”. Pastikan memiliki awalan garis miring." - -msgid "URL is missing a leading slash." -msgstr "Tidak ada garis miring awal pada URL." - -msgid "URL is missing a trailing slash." -msgstr "Tidak ada garis miring akhir pada URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Laman tetap %(url)s sudah ada untuk situs %(site)s" - -msgid "title" -msgstr "judul" - -msgid "content" -msgstr "isi" - -msgid "enable comments" -msgstr "aktifkan komentar" - -msgid "template name" -msgstr "nama templat" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Contoh: “flatpages/contact_page.html”. Jika tidak disediakan, sistem akan " -"menggunakan “flatpages/default.html”." - -msgid "registration required" -msgstr "pendaftaran diwajibkan" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Jika dipilih, hanya pengguna ter-otentikasi yang bisa mengunjungi halaman " -"ini." - -msgid "sites" -msgstr "situs" - -msgid "flat page" -msgstr "laman tetap" - -msgid "flat pages" -msgstr "laman tetap" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/io/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index 37ef71d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/io/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index 78e3fd0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,74 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:34+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/projects/p/django/language/" -"io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "" - -msgid "content" -msgstr "" - -msgid "enable comments" -msgstr "" - -msgid "template name" -msgstr "" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" - -msgid "registration required" -msgstr "" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index 32956d2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index fbc5a03..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Hafsteinn Einarsson , 2011-2012 -# Jannis Leidel , 2011 -# Thordur Sigurdsson , 2016,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-20 05:07+0000\n" -"Last-Translator: Thordur Sigurdsson \n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -msgid "Advanced options" -msgstr "Ítarlegar stillingar" - -msgid "Flat Pages" -msgstr "Flatskrár" - -msgid "URL" -msgstr "Veffang" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "Dæmi: '/about/contact/'. Passaðu að hafa skástrik fremst og aftast." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Þessi reitur má aðeins innihalda bókstafi (ekki broddstafi), tölustafi og " -"táknin . / - _ og ~." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Dæmi: '/about/contact'. Passaðu að hafa skástrik fremst." - -msgid "URL is missing a leading slash." -msgstr "Skástrik vantar fremst í slóð" - -msgid "URL is missing a trailing slash." -msgstr "Skástrik vantar aftast í slóð" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "'Flatpage' með slóðina %(url)s er þegar til fyrir síðuna %(site)s" - -msgid "title" -msgstr "titill" - -msgid "content" -msgstr "innihald" - -msgid "enable comments" -msgstr "virkja athugasemdir" - -msgid "template name" -msgstr "nafn sniðmáts" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Dæmi: 'flatpages/contact_page.html'. Ef ekkert er gefið upp mun kerfið nota " -"'flatpages/default.html'." - -msgid "registration required" -msgstr "skráning nauðsynleg" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Ef þetta er valið geta eingöngu innskráðir notendur séð síðuna." - -msgid "sites" -msgstr "vefir" - -msgid "flat page" -msgstr "flatskrá" - -msgid "flat pages" -msgstr "flatskrár" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/it/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index 7bc06b2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/it/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index 606a8d2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Carlo Miron , 2019 -# Jannis Leidel , 2011 -# Marco Bonetti, 2014 -# Mirco Grillo , 2020 -# palmux , 2015,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-01-15 16:01+0000\n" -"Last-Translator: palmux \n" -"Language-Team: Italian (http://www.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Opzioni avanzate" - -msgid "Flat Pages" -msgstr "Flat Pages" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Per esempio: '/about/contact'. Assicurati che inizi e finisca con uno slash." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Questo valore deve contenere solo lettere, numeri, punti, underscore, " -"trattini, barre diagonali o tilde." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Per esempio: '/about/contact'. Assicurati che inizi con uno slash." - -msgid "URL is missing a leading slash." -msgstr "Manca una barra iniziale nella URL." - -msgid "URL is missing a trailing slash." -msgstr "Manca una barra finale nella URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "La flatpage con url %(url)s esiste già per il sito %(site)s" - -msgid "title" -msgstr "titolo" - -msgid "content" -msgstr "contenuto" - -msgid "enable comments" -msgstr "abilita commenti" - -msgid "template name" -msgstr "nome template" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Esempio: \"flatpages/contact_page.html\". Se non specificato, il sistema " -"userà \"flatpages/default.html\"." - -msgid "registration required" -msgstr "registrazione obbligatoria" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Se selezionato, solo gli utenti che hanno effettuato l'accesso potranno " -"vedere la pagina." - -msgid "sites" -msgstr "siti" - -msgid "flat page" -msgstr "flat page" - -msgid "flat pages" -msgstr "flat pages" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index 6369ad4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index 67b7abd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Shinichi Katsumata , 2019 -# Shinya Okano , 2012,2014-2015 -# Takuya N , 2020 -# Tetsuya Morimoto , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-02-07 16:07+0000\n" -"Last-Translator: Takuya N \n" -"Language-Team: Japanese (http://www.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "詳細設定" - -msgid "Flat Pages" -msgstr "フラットページ" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"例: “/about/contact/”. 先頭と最後にスラッシュがあるか確認してください。" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"この値は文字、数字、ドット、アンダースコア、ダッシュ、スラッシュかチルダのみ" -"でなければいけません。" - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "例: “/about/contact”. 先頭にスラッシュがあるか確認してください。" - -msgid "URL is missing a leading slash." -msgstr "URLの先頭はスラッシュが必要です。" - -msgid "URL is missing a trailing slash." -msgstr "URLの末尾はスラッシュが必要です。" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "URL %(url)s のフラットページは %(site)s のサイトに既に存在しています。" - -msgid "title" -msgstr "タイトル" - -msgid "content" -msgstr "内容" - -msgid "enable comments" -msgstr "コメントを有効にする" - -msgid "template name" -msgstr "テンプレート名" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"例: “flatpages/contact_page.html”. 指定しなければ、デフォルト値の “flatpages/" -"default.html” を使います。" - -msgid "registration required" -msgstr "登録が必要です" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "チェックした場合、ログインしたユーザーだけがページを参照できます。" - -msgid "sites" -msgstr "サイト" - -msgid "flat page" -msgstr "フラットページ" - -msgid "flat pages" -msgstr "フラットページ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index 9b20adf..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index 3bf4bcc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2013 -# avsd05 , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Advanced options" -msgstr "დამატებითი პარამეტრები" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"მაგალითი: '/about/contact/'. ყურადღება მიაქციეთ დახრილ ხაზებს თავში და " -"ბოლოში." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"ეს მნიშვნელობა უნდა შეიცავდეს მხოლოდ ლათინურ ასოებს, ციფრებს, წერტილებს, " -"ხაზგასმის ნიშნებს, დეფისებს, დახრილ ხაზებს და ტილდებს." - -msgid "URL is missing a leading slash." -msgstr "URL-ს დასაწყისში აკლია დახრილი ხაზი." - -msgid "URL is missing a trailing slash." -msgstr "URL-ს ბოლოში აკლია დახრილი ხაზი." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "უბრალო გვერდი url-ით %(url)s უკვე არსებობს საიტისთვის %(site)s" - -msgid "title" -msgstr "სათაური" - -msgid "content" -msgstr "კონტენტი" - -msgid "enable comments" -msgstr "ჩავრთოთ კომენტარები" - -msgid "template name" -msgstr "შაბლონის სახელი" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"მაგალითი: 'flatpages/contact_page.html'. თუ იგი მითითებული არ არის, " -"გამოყენებული იქნება 'flatpages/default.html'." - -msgid "registration required" -msgstr "რეგისტრაცია აუცილებელია" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"თუ ეს დროშა ჩართულია, მხოლო შემოსულ მომხმარებლებს ექნებათ გვერდის " -"დათვალიერების საშუალება." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "უბრალო გვერდი" - -msgid "flat pages" -msgstr "უბრალო გვერდები" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index f8ef043..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index 4135eca..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Leo Trubach , 2017 -# yun_man_ger , 2011 -# Zhazira , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 00:18+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Advanced options" -msgstr "Толық опциялар" - -msgid "Flat Pages" -msgstr "Жай беттер" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Мысал: '/about/contact/'. Басында және аяғында слэштің болуын тексеріңіз." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Бұл мән тек әріптерден, сандардан, нүктелерден, төменгі сызықтардан, " -"сызықшалардан, слэштерден немесе тильдалардан құралуы тиіс. " - -msgid "Example: '/about/contact'. Make sure to have a leading slash." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "URLдың басында бөлшек белгісі жоқ" - -msgid "URL is missing a trailing slash." -msgstr "URLдың аяғында бөлшек белгісі жоқ" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(url)s url'ымен жайбет %(site)s сайтта бұрыннан бар" - -msgid "title" -msgstr "атау" - -msgid "content" -msgstr "мазмұн" - -msgid "enable comments" -msgstr "комментарийларды рұқсат ету" - -msgid "template name" -msgstr "шаблон атауы" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Мысал: 'flatpages/contact_page.html'. Ештенке берілмесе, 'flatpages/default." -"html' қолданылады." - -msgid "registration required" -msgstr "тіркеу қажетті" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Бұл белгіленген жағдайда, тек енген қолданушылар ғана бетті көре алады." - -msgid "sites" -msgstr "сайттар" - -msgid "flat page" -msgstr "Жай бет" - -msgid "flat pages" -msgstr "Жай беттер" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/km/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index 73e5fa3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/km/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index 8ed4eee..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "អាស័យដ្ឋានគេហទំព័រ(URL)" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"ឧទាហរណ៍  '/about/contact/' ។ ត្រូវប្រាកដថាមានសញ្ញា / ទាំងនៅផ្នែកខាងមុខ និង ខាងក្រោយ។" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "ចំណងជើង" - -msgid "content" -msgstr "អត្ថន័យ" - -msgid "enable comments" -msgstr "អនុញ្ញាត" - -msgid "template name" -msgstr "ឈ្មោះឯកសារគំរូ" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"ឧទាហរណ៍ 'flatpages/contact_page.html'។ ប្រសិនឯកសារនេះមិនមានទេ​" -" នោះឯកសារ 'flatpages/default.html'នឹងត្រូវប្រើ។" - -msgid "registration required" -msgstr "ត្រូវការសមាជិកភាព" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "ប្រសិនជាចុចជ្រើសរើសយកជំរើសនេះ នោះ មានតែសមាជិកទេដែលអាចមើលទំព័រនេះបាន​។" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "ទំព័ថ្មី" - -msgid "flat pages" -msgstr "ទំព័ថ្មី" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index ed64a6b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index 83198cc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,82 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"ಉದಾ:'/about/contact/'. ಮೊದಲು ಮತ್ತು ಕೊನೆಯಲ್ಲಿ ಓರೆಗೆರೆ (/) ಇರುವಂತೆ ನೋಡಿಕೊಳ್ಳಿ." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "ಶೀರ್ಷಿಕೆ" - -msgid "content" -msgstr "ಒಳವಿಷಯ" - -msgid "enable comments" -msgstr "ಟಿಪ್ಪಣಿಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ" - -msgid "template name" -msgstr "ಟೆಂಪ್ಲೇಟಿನ ಹೆಸರು" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"ಉದಾ:'flatpages/contact_page.html'. ಇದನ್ನು ಕೊಡದಿದ್ದರೆ ಗಣಕವ್ಯವಸ್ಥೆಯು 'flatpages/" -"default.html' ಅನ್ನು ಬಳಸುವದು." - -msgid "registration required" -msgstr "ನೋಂದಾವಣೆ ಅಗತ್ಯವಿದೆ." - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"ಇದರಲ್ಲಿ ಗುರುತು ಮಾಡಿದರೆ, ಒಳಬಂದ (ಲಾಗಿನ್ ಆದ) ಬಳಕೆದಾರರು ಮಾತ್ರ ಪುಟವನ್ನು ನೋಡಬಹುದು." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "ಚಪ್ಪಟೆ ಪುಟ" - -msgid "flat pages" -msgstr "ಚಪ್ಪಟೆ ಪುಟಗಳು" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ko/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index 6f13b0d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ko/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index f0f117a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jiyoon, Ha , 2016 -# Ian Y. Choi , 2015 -# Jaehong Kim , 2011 -# Jannis Leidel , 2011 -# Jay Oh , 2020 -# Le Tartuffe , 2014 -# Jonghwa Seo , 2019 -# JunGu Kang , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-07-04 14:22+0000\n" -"Last-Translator: Jay Oh \n" -"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "고급 옵션" - -msgid "Flat Pages" -msgstr "플랫 페이지" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "앞, 뒤에 슬래시(/)를 넣으세요. 예:'/about/contact/' " - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"이 문자열은 문자, 숫자, 점, 언더스코어, 대쉬, 슬래시, 틸드만 사용해야 합니다." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "맨앞에 슬래시(/)를 반드시 넣으세요. 예: '/about/contact'" - -msgid "URL is missing a leading slash." -msgstr "URL 맨 앞의 슬래시가 없습니다." - -msgid "URL is missing a trailing slash." -msgstr "URL 맨 뒤의 슬래시가 없습니다." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(site)s 사이트에 %(url)s 을/를 사용한 플랫 페이지가 이미 존재합니다." - -msgid "title" -msgstr "제목" - -msgid "content" -msgstr "내용" - -msgid "enable comments" -msgstr "사용 가능한 코멘트" - -msgid "template name" -msgstr "템플릿 이름" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"예: 'flatpages/contact_page.html' 를 사용할 수 없는 경우 시스템이 'flatpages/" -"default.html' 을/를 사용합니다." - -msgid "registration required" -msgstr "등록이 필요합니다" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "체크할 경우, 로그인한 사용자만 해당 페이지를 볼 수 있습니다." - -msgid "sites" -msgstr "사이트" - -msgid "flat page" -msgstr "플랫 페이지" - -msgid "flat pages" -msgstr "플랫 페이지들" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ky/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index c4aa02f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ky/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 7f420f3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soyuzbek Orozbek uulu , 2020 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-23 06:23+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "Дагы мүмкүнчүлүктөр" - -msgid "Flat Pages" -msgstr "Туруктуу барактар" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Мисалы: “/about/contact/”. Башында жана аягында бөлчөк бар экендигин " -"текшериңиз." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Бул маани жалаң арип, сан, чекит, астсызык, сызык, бөлчөк же тилда камтый " -"алат." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Мисалы: “/about/contact”. Башында бөлчөк бар экендигин текшериңиз." - -msgid "URL is missing a leading slash." -msgstr "URL башында бөлчөгү жок." - -msgid "URL is missing a trailing slash." -msgstr "URL аягында бөлчөгү жок." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(url)s URLдүү барак %(site)sсайтында мурдатан эле бар." - -msgid "title" -msgstr "наам" - -msgid "content" -msgstr "мазмун" - -msgid "enable comments" -msgstr "пикирлерди күйгүзүү" - -msgid "template name" -msgstr "калып аты" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Мисалы: “flatpages/contact_page.html”. Эгер бул көрсөтүлбөсө, систем " -"“flatpages/default.html” колдоно берет." - -msgid "registration required" -msgstr "катталуу талап кылынат." - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Эгер бул тандалса жалаң гана катталып кирген колдонуучулар бул баракты көрө " -"алышат." - -msgid "sites" -msgstr "сайттар" - -msgid "flat page" -msgstr "туруктуу барак" - -msgid "flat pages" -msgstr "туруктуу барактар" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index 1367568..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index cbacfee..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,77 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/django/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "" - -msgid "content" -msgstr "" - -msgid "enable comments" -msgstr "" - -msgid "template name" -msgstr "" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" - -msgid "registration required" -msgstr "" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index fe4c1e4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index 16e75aa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,94 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kostas , 2011 -# Matas Dailyda , 2015,2019 -# Simonas Kazlauskas , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 10:34+0000\n" -"Last-Translator: Matas Dailyda \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Advanced options" -msgstr "Sudėtingesni nustatymai" - -msgid "Flat Pages" -msgstr "Paprasti puslapiai" - -msgid "URL" -msgstr "Nuoroda" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Pavyzdžiui: '/about/contact/'. Įsitikink, kad yra pasvirieji brūkšniai " -"pradžioj ir gale." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Ši reikšmė gali būti sudaryta tik iš raidžių, skaičių, pabraukimų, brūkšnių " -"ir/arba pasvirų brūkšnių." - -msgid "Example: '/about/contact'. Make sure to have a leading slash." -msgstr "" -"Pavizdys: '/apie/kontaktai'. Įsitikinkite kad pradžioje būtų pasvirasis " -"brūkšnys." - -msgid "URL is missing a leading slash." -msgstr "Nuorodos pradžioje trūksta pasvirojo brūkšnio." - -msgid "URL is missing a trailing slash." -msgstr "Nuorodos pabaigoje trūksta pasvirojo brūkšnio." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Paprastas puslapis su adresu %(url)s %(site)s puslapyje jau egzistuoja" - -msgid "title" -msgstr "pavadinimas" - -msgid "content" -msgstr "turinys" - -msgid "enable comments" -msgstr "įjungti komentavimą" - -msgid "template name" -msgstr "šablono vardas" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Pavyzdžiui: 'flatpages/contact_page.html'. Jeigu bus nenurodytas, sistema " -"naudos 'flatpages/default.html'." - -msgid "registration required" -msgstr "registracija privaloma" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Jeigu pažymėta, tik prisijungę vartotojai galės matyti šį puslapį." - -msgid "sites" -msgstr "tinklalapiai" - -msgid "flat page" -msgstr "paprastas puslapis" - -msgid "flat pages" -msgstr "paprasti puslapiai" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index d7ce9c2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index 12260ec..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# NullIsNot0 , 2019 -# peterisb , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-07 07:17+0000\n" -"Last-Translator: NullIsNot0 \n" -"Language-Team: Latvian (http://www.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -msgid "Advanced options" -msgstr "Papildus opcijas" - -msgid "Flat Pages" -msgstr "Vienkāršās lapas" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Piemēram: “/about/contact/”. Pārliecinieties, ka esat ievietojuši sākuma un " -"beigu slīpsvītras." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Šai vērtība ir jāsatur tikai burtus, ciparus, punktus, pasvītrojumi, " -"domuzīmes, slīpsvītras vai tildes simboli." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Piemēram: “/about/contact”. Pārliecinieties, ka esat ievietojuši sākuma " -"slīpsvītru." - -msgid "URL is missing a leading slash." -msgstr "URL trūkst sākuma slīpsvītra." - -msgid "URL is missing a trailing slash." -msgstr "URL trūkst beigu slīpsvītra." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Vienkāršā lapa ar url %(url)s jau eksistē vietnei %(site)s" - -msgid "title" -msgstr "virsraksts" - -msgid "content" -msgstr "saturs" - -msgid "enable comments" -msgstr "ieslēgt komentārus" - -msgid "template name" -msgstr "šablona nosaukums" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Piemēram: “flatpages/contact_page.html”. Ja tas nav norādīts, sistēma lietos " -"“flatpages/default.html”." - -msgid "registration required" -msgstr "reģistrācija obligāta" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ja šis ir atzīmēts, tikai pieslēgušies lietotāji, varēs piekļūt šai lapu." - -msgid "sites" -msgstr "vietnes" - -msgid "flat page" -msgstr "vienkārša lapa" - -msgid "flat pages" -msgstr "vienkāršas lapas" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index 68d4a8b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index b612fb2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vasil Vangelovski , 2016 -# Vasil Vangelovski , 2014 -# Vasil Vangelovski , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Vasil Vangelovski \n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgid "Advanced options" -msgstr "Напредни можности" - -msgid "Flat Pages" -msgstr "Статични страници" - -msgid "URL" -msgstr "Веб адреса" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"На пр. „/за_сајтот/контакт/“. Осигурајте се дека имате коса црта и на крајот " -"и на почетокот." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Оваа вредност смее да има само букви, бројки, долни црти, црти, коси црти " -"или тилди." - -msgid "URL is missing a leading slash." -msgstr "На веб адресата и недостасува почетна црта." - -msgid "URL is missing a trailing slash." -msgstr "На веб адресата и недостасува завршна црта." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" -"Статична страница со веб адреса %(url)s веќе постои за сајтот %(site)s" - -msgid "title" -msgstr "наслов" - -msgid "content" -msgstr "содржина" - -msgid "enable comments" -msgstr "овозможи коментари" - -msgid "template name" -msgstr "име на шаблон" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"На пр. „flatpages/kontakt.html'. Ако не го внесете ова, системот ќе користи " -"„flatpages/default.html“." - -msgid "registration required" -msgstr "потребна е регистрација" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ако ова е штиклирано, само најавените корисници ќе можат да ја гледаат оваа " -"страница." - -msgid "sites" -msgstr "сајтови" - -msgid "flat page" -msgstr "статична страница" - -msgid "flat pages" -msgstr "статични страници" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ml/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index d4cf1e3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ml/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index 4d5fd10..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aby Thomas , 2014 -# Hrishikesh , 2019-2020 -# Jannis Leidel , 2011 -# Rajeesh Nair , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-13 21:22+0000\n" -"Last-Translator: Hrishikesh \n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "സങ്കീർണ്ണമായ ഓപ്ഷനുകൾ" - -msgid "Flat Pages" -msgstr "ഫ്ലാറ്റ് പേജുകൾ" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"ഉദാഹരണം: “/about/contact/”. തുടക്കത്തിലും അവസാനവും സ്ലാഷുകൾ ഉണ്ടെന്ന് ഉറപ്പുവരുത്തുക." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"ഇതിൽ അക്ഷരങ്ങൾ, നമ്പറുകൾ, കുത്തുകൾ, അണ്ടർസ്കോറുകൾ, ഡാഷുകൾ, സ്ലാഷുകൾ അതുമല്ലെങ്കിൽ ടിൽഡുകൾ " -"എന്നിവ മാത്രമേ അനുവദിക്കുള്ളൂ." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "ഉദാഹരണം: “/about/contact”. തുടക്കത്തിൽ ഒരു സ്ലാഷ് ഉണ്ടെന്ന് ഉറപ്പുവരുത്തുക." - -msgid "URL is missing a leading slash." -msgstr "URLന്റെ മുന്‍വശത്ത് ഒരു സ്ലാഷിന്റെ കുറവുണ്ട്." - -msgid "URL is missing a trailing slash." -msgstr "URLന്റെ പിന്‍വശത്ത് ഒരു സ്ലാഷിന്റെ കുറവുണ്ട്." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(site)s എന്ന സൈറ്റിനു %(url)s എന്ന url ഉള്ള ഫ്ലാറ്റ്പേജ് നിലവിലുണ്ട്" - -msgid "title" -msgstr "ശീര്‍ഷകം" - -msgid "content" -msgstr "ഉള്ളടക്കം" - -msgid "enable comments" -msgstr "അഭിപ്രായങ്ങള്‍ അനുവദിക്കുക" - -msgid "template name" -msgstr "ടെമ്പ്ലേറ്റിന്റെ പേര്" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"ഉദാ: 'flatpages/contact_page.html'. ഇതു നല്കിയില്ലെങ്കില്‍, പകരമായി 'flatpages/" -"default.html' ആയിരിക്കും ഉപയോഗിക്കുക." - -msgid "registration required" -msgstr "രജിസ്ട്രേഷന്‍ ആവശ്യമാണ്" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "ഇതു ടിക് ചെയ്താല്‍ പിന്നെ ലോഗ്-ഇന്‍ ചെയ്ത യൂസര്‍ക്കു മാത്രമേ ഈ പേജ് കാണാന്‍ കഴിയൂ." - -msgid "sites" -msgstr "സൈറ്റുകൾ" - -msgid "flat page" -msgstr "ഫ്ളാറ്റ് പേജ്" - -msgid "flat pages" -msgstr "ഫ്ളാറ്റ് പേജുകള്‍" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index a9c8f09..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 1dedfe1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Zorig, 2014,2016 -# Zorig, 2019 -# Анхбаяр Анхаа , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-19 02:15+0000\n" -"Last-Translator: Zorig\n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Дээд хэрэглээний сонголтууд" - -msgid "Flat Pages" -msgstr "Дан хуудас" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Жишээ: '/about/contact/'. Хөтлөх буюу зам заах ташуу зураас байх хэрэгтэй." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Энэ хэсэгт зөвхөн үсэг, тоо, цэг, доогуур зураас, налуу зураасууд бичих " -"боломжтой. " - -msgid "Example: '/about/contact'. Make sure to have a leading slash." -msgstr "" -"Жишээ: '/about/contact/'. Хөтлөх буюу зам заах ташуу зураас байх хэрэгтэй." - -msgid "URL is missing a leading slash." -msgstr "URL ийн эхний slash ийг мартсан байна." - -msgid "URL is missing a trailing slash." -msgstr "URL ийн арийн slash ийг мартсан байна" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Хуудасны хаяг %(url)s %(site)s дээр давхардаж байна." - -msgid "title" -msgstr "гарчиг" - -msgid "content" -msgstr "агуулга" - -msgid "enable comments" -msgstr "санал сэтгэгдэл үлдээх боломжтой болгох" - -msgid "template name" -msgstr "загварын нэр" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Жишээ: 'flatpages/contact_page.html'. Хэрэв ийм зүйл гарч ирэхгүй бол систем " -"'flatpages/default.html'-ийг хэрэглэнэ." - -msgid "registration required" -msgstr "бүртгэгдсэн хэрэглэгчид үзнэ" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Үүнийг чагтлавал зөвхөн сайтад нэвтэрсэн хэрэглэгч сайтыг харах боломжтой " -"болно." - -msgid "sites" -msgstr "сайтууд" - -msgid "flat page" -msgstr "өөрчлөлтгүй хуудас" - -msgid "flat pages" -msgstr "өөрчлөлтгүй хуудаснууд" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index 6197eac..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index 1d88dc9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,82 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Omkar Parab, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2024-01-24 19:03+0000\n" -"Last-Translator: Omkar Parab, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "प्रगत पर्याय" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "यूआरएल" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "अग्रगण्य आणि अनुगामी स्लॅश असल्याची खात्री करा. उदाहरण: “/about/contact/”." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"या मूल्यामध्ये फक्त अक्षरे, संख्या, ठिपके, अंडरस्कोअर, डॅश, स्लॅश किंवा टिल्ड असणे आवश्यक आहे." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "अग्रगण्य स्लॅश असल्याची खात्री करा. उदाहरण: “/about/contact”. " - -msgid "URL is missing a leading slash." -msgstr "URL मधे अग्रगण्य स्लॅश गहाळ आहे." - -msgid "URL is missing a trailing slash." -msgstr "URL मधे अनुगामी स्लॅश गहाळ आहे. " - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "शीर्षक" - -msgid "content" -msgstr "सामुग्री" - -msgid "enable comments" -msgstr "प्रतिक्रिया सक्षम करा" - -msgid "template name" -msgstr "टेम्पलेटचे नाव" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" - -msgid "registration required" -msgstr "नोंदणी आवश्यक" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -msgid "sites" -msgstr "स्थळे" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ms/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index 7af7bbd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ms/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index 4315687..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-11-16 12:59+0000\n" -"Last-Translator: Jafry Hisham\n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "Pilihan lanjut" - -msgid "Flat Pages" -msgstr "Muka rata" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Contoh: \"/berkenaan/hubungi/\". Pastikan ada sempang awalan dan akhiran." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Niali ini hanya boleh mengandugi huruf, nombor, titik, garis-bawah, " -"sengkang, sempang atau tilde." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Contoh: \"/berkenaan/hubungi\". Pastikan ada sempang awalan." - -msgid "URL is missing a leading slash." -msgstr "URL tidak mempunyai sempang awalan." - -msgid "URL is missing a trailing slash." -msgstr "URL tidak mempunyai sempang akhiran." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Mukarata dengan url %(url)s sudah wujud bagi laman %(site)s" - -msgid "title" -msgstr "tajuk" - -msgid "content" -msgstr "kandungan" - -msgid "enable comments" -msgstr "hidupkan komen" - -msgid "template name" -msgstr "nama templat" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Contoh: \"mukarata/ruangan_hubungi.html\". Sekiranya ini tidak diberikam, " -"sistem akan menggunakan \"flatpages/defulat.html\"." - -msgid "registration required" -msgstr "Pendaftaran diperlukan" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Sekiranya ini ditanda, hanya pengguna yang log-masuk sahaja akan dapat " -"melihat ruangan ini." - -msgid "sites" -msgstr "laman-laman" - -msgid "flat page" -msgstr "muka rata" - -msgid "flat pages" -msgstr "muka rata" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/my/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index a959d4c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/my/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index e46bfbe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,77 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "ယူအာအယ်" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "" - -msgid "content" -msgstr "" - -msgid "enable comments" -msgstr "" - -msgid "template name" -msgstr "" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" - -msgid "registration required" -msgstr "" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index 4383609..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index b6eba01..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# jensadne , 2014 -# Jon , 2015 -# Jon , 2019-2020 -# Jon , 2011-2012 -# Sigurd Gartmann , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-21 12:12+0000\n" -"Last-Translator: Jon \n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Avanserte innstillinger" - -msgid "Flat Pages" -msgstr "Flatsider" - -msgid "URL" -msgstr "Nettadresse" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Eksempel: \"/om/kontakt/\". Kontroller at det er en skråstrek foran og bak." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Dette feltet kan kun inneholde bokstaver, nummer, skilletegn, understreker, " -"bindestreker, skråstreker eller tilder." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Eksempel: \"/om/kontakt\". Kontroller at det er en skråstrek foran." - -msgid "URL is missing a leading slash." -msgstr "URL mangler innledende skråstrek." - -msgid "URL is missing a trailing slash." -msgstr "URL mangler avsluttende skråstrek." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Flatside med URL-en %(url)s finnes allerede for siden %(site)s" - -msgid "title" -msgstr "tittel" - -msgid "content" -msgstr "innhold" - -msgid "enable comments" -msgstr "tillat kommentarer" - -msgid "template name" -msgstr "malnavn" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Eksempel: \"flatpages/contact_page.html\". Hvis denne ikke er gitt, vil " -"\"flatpages/default.html\" bli brukt." - -msgid "registration required" -msgstr "krever registrering" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Hvis denne er krysset av, kan kun innloggede brukere se siden." - -msgid "sites" -msgstr "nettsteder" - -msgid "flat page" -msgstr "flatside" - -msgid "flat pages" -msgstr "flatsider" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ne/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index e435dd8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ne/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index 54ec75f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,77 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Sagar Chalise , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Sagar Chalise \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "उदाहरणका लागि: '/about/contact/' । अगाडि र पछाडि '/' राख्न नभुल्नुहोला ।" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "यो मानमा अंक, वर्ण, थोप्लो, अन्डरस्कोर, ड्यास, स्ल्यास र टिल्ड मात्र हुनुपर्दछ ।" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "शीर्षक" - -msgid "content" -msgstr "विषय" - -msgid "enable comments" -msgstr "प्रतिकृयाको लागि मञ्जुरी दिनुहोस" - -msgid "template name" -msgstr "टेम्प्लेटको नाम" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" - -msgid "registration required" -msgstr "दर्ता अनिवार्य छ ।" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -msgid "sites" -msgstr "साइटहरु" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index af4bd8a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index 2f06f80..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Harro van der Klauw , 2012 -# Ilja Maas , 2015 -# Jannis Leidel , 2011 -# Jeffrey Gelens , 2012 -# Sander Steffann , 2015 -# Tino de Bruijn , 2011 -# Tonnes , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 08:52+0000\n" -"Last-Translator: Tonnes \n" -"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Geavanceerde opties" - -msgid "Flat Pages" -msgstr "Platte pagina's" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "Voorbeeld: ‘/about/contact/’. Zorg voor slashes aan het begin en eind." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Deze waarde mag alleen letters, cijfers, punten, liggende streepjes, " -"streepjes, slashes of tildes bevatten." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Voorbeeld: ‘/about/contact’. Zorg voor een slash aan het begin." - -msgid "URL is missing a leading slash." -msgstr "In de URL ontbreekt een beginslash." - -msgid "URL is missing a trailing slash." -msgstr "In de URL ontbreekt een eindslash." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Platte pagina met URL %(url)s bestaat al voor website %(site)s" - -msgid "title" -msgstr "titel" - -msgid "content" -msgstr "inhoud" - -msgid "enable comments" -msgstr "opmerkingen toestaan" - -msgid "template name" -msgstr "sjabloonnaam" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Voorbeeld: ‘flatpages/contact_page.html’. Als dit niet is opgegeven, wordt " -"‘flatpages/default.html’ gebruikt." - -msgid "registration required" -msgstr "registratie vereist" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Als dit is aangevinkt, kunnen alleen aangemelde gebruikers de pagina " -"bekijken." - -msgid "sites" -msgstr "websites" - -msgid "flat page" -msgstr "platte pagina" - -msgid "flat pages" -msgstr "platte pagina's" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index a62a709..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index 55c92ea..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# hgrimelid , 2011 -# Jannis Leidel , 2011 -# Sivert Olstad, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-11-12 08:48+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Avanserte innstillingar" - -msgid "Flat Pages" -msgstr "Flatsider" - -msgid "URL" -msgstr "Nettadresse" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Eksempel: “/om/kontakt/”. Kontroller at det er ein skråstrek framanfor og " -"bak." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Dette feltet kan berre innehalde bokstavar, nummer, skilleteikn, " -"understrekar, bindestrekar, skråstrekar eller tilder." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Eksempel: “/om/kontakt/”. Kontroller at det er ein skråstrek framanfor." - -msgid "URL is missing a leading slash." -msgstr "Nettadressa manglar ein skråstrek framanfor." - -msgid "URL is missing a trailing slash." -msgstr "Nettadressa manglar ein skråstrek bak." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Flatside med nettadresse %(url)s eksisterer allereie for sida %(site)s" - -msgid "title" -msgstr "tittel" - -msgid "content" -msgstr "innhald" - -msgid "enable comments" -msgstr "tillat kommentarer" - -msgid "template name" -msgstr "malnamn" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Døme: “flatpages/contact_page.html”. Dersom denne ikkje er oppgjeve vert " -"“flatpages/default.html” brukt." - -msgid "registration required" -msgstr "krevar registrering" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Dersom denne er kryssa av, kan berre innlogga brukarar sjå sida." - -msgid "sites" -msgstr "nettstadar" - -msgid "flat page" -msgstr "flatside" - -msgid "flat pages" -msgstr "flatsider" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/os/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index 5d25b6b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/os/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index aaa9895..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Флдӕр фадӕттӕ" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Цӕвиттон: '/about/contact/'. Дӕ хъус дар цӕмӕ дзы сӕйраг ӕмӕ хицӕнгӕнаг " -"слӕштӕ уой." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Ам хъуамӕ ӕрмӕст дамгъӕтӕ, стъӕлфытӕ, бынылхӕххытӕ, дефистӕ, слӕштӕ ӕмӕ " -"тильдӕтӕ уой." - -msgid "URL is missing a leading slash." -msgstr "URL-ы сӕйраг слӕш нӕй." - -msgid "URL is missing a trailing slash." -msgstr "URL-ы хицӕнгӕнаг слӕш нӕй." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(url)s url-имӕ тъӕпӕнфарс нырид ис %(site)s сайтӕн" - -msgid "title" -msgstr "сӕр" - -msgid "content" -msgstr "мидис" - -msgid "enable comments" -msgstr "хъуыдытӕ баиу кӕнын" - -msgid "template name" -msgstr "хуызӕгы ном" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Цӕвиттон: 'flatpages/contact_page.html'. Кӕд ай лӕвӕрд нӕу, уӕд системӕ " -"сӕвӕрдзӕн 'flatpages/default.html'." - -msgid "registration required" -msgstr "регистраци хъӕуы" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Кӕд ай нысангонд у, уӕд ацы фарс ӕрмӕст системӕмӕ хызт архайджытӕн уыдзӕнис " -"бар уынын." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "тъӕпӕн фарс" - -msgid "flat pages" -msgstr "тъӕпӕн фӕрстӕ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index c20a520..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index ab56520..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,78 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "ਤਕਨੀਕੀ ਚੋਣਾਂ" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "ਟਾਈਟਲ" - -msgid "content" -msgstr "ਸਮੱਗਰੀ" - -msgid "enable comments" -msgstr "ਟਿੱਪਣੀਆਂ ਚਾਲੂ" - -msgid "template name" -msgstr "ਟੈਪਲੇਟ ਨਾਂ" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" - -msgid "registration required" -msgstr "ਰਜਿਸਟਰੇਸ਼ਨ ਲੋੜੀਦੀ ਹੈ" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index 74b2580..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index 51f2bfb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,96 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# angularcircle, 2012 -# angularcircle, 2012 -# Jannis Leidel , 2011 -# Janusz Harkot , 2015 -# m_aciek , 2019 -# Tomasz Kajtoch , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-11 14:08+0000\n" -"Last-Translator: m_aciek \n" -"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" -"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" -"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -msgid "Advanced options" -msgstr "Opcje zaawansowane" - -msgid "Flat Pages" -msgstr "Strony statyczne" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Przykład: „/about/contact/”. Upewnij się, że wpisałeś początkowy i końcowy " -"ukośnik." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"To pole może zawierać jedynie litery, cyfry, kropki, podkreślenia, myślniki, " -"ukośniki i tyldy." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Przykład: „/about/contact”. Upewnij się, że wpisałeś początkowy ukośnik." - -msgid "URL is missing a leading slash." -msgstr "W URL-u brakuje początkowego ukośnika." - -msgid "URL is missing a trailing slash." -msgstr "W URL-u brakuje końcowego ukośnika." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" -"Strona statyczna o adresie %(url)s została już utworzona dla strony %(site)s" - -msgid "title" -msgstr "tytuł" - -msgid "content" -msgstr "zawartość" - -msgid "enable comments" -msgstr "włącz komentarze" - -msgid "template name" -msgstr "nazwa szablonu" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Przykład: „flatpages/contact_page.html”. Jeżeli nie zostanie podane, system " -"użyje „flatpages/default.html”." - -msgid "registration required" -msgstr "wymagana rejestracja" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Jeżeli zaznaczone - tylko zalogowani użytkownicy będą mogli zobaczyć stronę." - -msgid "sites" -msgstr "strony" - -msgid "flat page" -msgstr "strona statyczna" - -msgid "flat pages" -msgstr "strony statyczne" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index 586fe66..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index bf89878..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Manuela Silva , 2025 -# Nuno Mariz , 2011-2012,2015 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Manuela Silva , 2025\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Opções avançadas" - -msgid "Flat Pages" -msgstr "Páginas Simples" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Exemplo: “/about/contact/”. Certifique-se que tem traços oblíquos no início " -"e no final." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Este valor apenas poderá conter letras, números, pontos, underscores, " -"hífenes, barras ou tils." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Exemplo: “/about/contact”. Certifique-se que tem um traço obliquo no inicio." - -msgid "URL is missing a leading slash." -msgstr "Está a faltar a barra inicial no URL." - -msgid "URL is missing a trailing slash." -msgstr "Está a faltar a barra final no URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "A página plana com o url %(url)s já existe no site %(site)s" - -msgid "title" -msgstr "título" - -msgid "content" -msgstr "conteúdo" - -msgid "enable comments" -msgstr "permitir comentários" - -msgid "template name" -msgstr "nome da template" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Exemplo: “flatpages/contact_page.html”. Se isto não for fornecido, o sistema " -"utilizará “flatpages/default.html”." - -msgid "registration required" -msgstr "é necessário registo" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Se estiver selecionado, apenas utilizadores autenticados poderão ver esta " -"página." - -msgid "sites" -msgstr "site" - -msgid "flat page" -msgstr "página plana" - -msgid "flat pages" -msgstr "páginas planas" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index 3677d3d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index e28cabe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,98 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# Amanda Savluchinske , 2019 -# andrewsmedina , 2013 -# dudanogueira , 2019 -# Eduardo Cereto Carvalho, 2011 -# Fábio C. Barrionuevo da Luz , 2013 -# semente, 2012-2013 -# Jannis Leidel , 2011 -# Lucas Infante , 2015 -# Rafael Fontenelle , 2021 -# Sergio Oliveira , 2013 -# Thiago Avelino , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-01-17 06:37+0000\n" -"Last-Translator: Rafael Fontenelle \n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Advanced options" -msgstr "Opções avançadas" - -msgid "Flat Pages" -msgstr "Páginas Planas" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Exemplo: “/about/contact/”. Certifique-se de ter barras no início e no final." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Este valor deve conter apenas letras, números, pontos, sublinhados, traços, " -"barras ou til." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Exemplo: “/about/contact”. Certifique-se de ter uma barra no início." - -msgid "URL is missing a leading slash." -msgstr "Está faltando uma barra no início da URL." - -msgid "URL is missing a trailing slash." -msgstr "Está faltando uma barra no final da URL." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Uma flatpage com a URL %(url)s já existe para o site %(site)s" - -msgid "title" -msgstr "título" - -msgid "content" -msgstr "conteúdo" - -msgid "enable comments" -msgstr "habilitar comentários" - -msgid "template name" -msgstr "nome do template" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Exemplo: “flatpages/contact_page.html”. Se isso não for fornecido, o sistema " -"utilizará “flatpages/default.html”." - -msgid "registration required" -msgstr "registro obrigatório" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Se estiver assinalado, apenas usuários autenticados poderão ver a página." - -msgid "sites" -msgstr "sites" - -msgid "flat page" -msgstr "página plana" - -msgid "flat pages" -msgstr "páginas planas" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index b8d7ae8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index 6631911..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,96 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bogdan Mateescu, 2019 -# Daniel Ursache-Dogariu, 2011 -# Denis Darii , 2014 -# Jannis Leidel , 2011 -# Razvan Stefanescu , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 12:01+0000\n" -"Last-Translator: Bogdan Mateescu\n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -msgid "Advanced options" -msgstr "Opțiuni avansate" - -msgid "Flat Pages" -msgstr "Pagini Statice" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Exemplu: '/despre/contact/'. Asigurați-vă că sunt bare oblice la început și " -"la sfârșit." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Această valoare trebuie să conţină doar litere, numere, puncte, linii joase, " -"cratime, bare oblice sau tilde." - -msgid "Example: '/about/contact'. Make sure to have a leading slash." -msgstr "" -"Exemplu: '/despre/contact'. Asigurați-vă că sunt bare oblice la început și " -"la sfârșit." - -msgid "URL is missing a leading slash." -msgstr "În URL lipseste slashul inițial." - -msgid "URL is missing a trailing slash." -msgstr "În URL lipseste slashul final." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Pagina Flat cu url-ul %(url)s există deja pentru saitul %(site)s" - -msgid "title" -msgstr "titlu" - -msgid "content" -msgstr "conținut" - -msgid "enable comments" -msgstr "permite comentarii" - -msgid "template name" -msgstr "nume șablon" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Exemplu: 'flatpages/contact_page.html'. Dacă aceasta nu există, sistemul va " -"folosi 'flatpages/default.html'." - -msgid "registration required" -msgstr "necesită înregistrare" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Dacă aceasta este bifată, numai utilizatorii autentificați vor putea vedea " -"pagina." - -msgid "sites" -msgstr "pagini" - -msgid "flat page" -msgstr "pagină statică" - -msgid "flat pages" -msgstr "pagini statice" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index 669d7e1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index bfe344c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,95 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eugene , 2012 -# crazyzubr , 2020 -# Jannis Leidel , 2011 -# Mike Yumatov , 2011 -# Алексей Борискин , 2012,2014-2015,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-14 18:19+0000\n" -"Last-Translator: crazyzubr \n" -"Language-Team: Russian (http://www.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Advanced options" -msgstr "Расширенные настройки" - -msgid "Flat Pages" -msgstr "Простые страницы" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Пример: “/about/contact/”. Убедитесь, что ввели начальную и конечную косые " -"черты." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Значение должно состоять только из букв, цифр и символов точки, " -"подчеркивания, тире, косой черты и тильды." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Пример: “/about/contact”. Убедитесь, что в начале адреса находится косая " -"черта." - -msgid "URL is missing a leading slash." -msgstr "В начале URL отсутствует косая черта" - -msgid "URL is missing a trailing slash." -msgstr "В конце URL отсутствует косая черта" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Простая страница с адресом %(url)s уже существует для сайта %(site)s" - -msgid "title" -msgstr "заголовок" - -msgid "content" -msgstr "содержимое" - -msgid "enable comments" -msgstr "включить комментарии" - -msgid "template name" -msgstr "имя шаблона" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Пример: “flatpages/contact_page.html“. Если не указано, система будет " -"использовать “flatpages/default.html“." - -msgid "registration required" -msgstr "требуется регистрация" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Если отмечено, только вошедшие пользователи смогут видеть страницу." - -msgid "sites" -msgstr "сайты" - -msgid "flat page" -msgstr "простая страница" - -msgid "flat pages" -msgstr "простые страницы" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index e4b7636..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index bcd4c8b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Marian Andre , 2011-2012,2014 -# Martin Tóth , 2017,2023 -# Peter Kuma, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2023-12-04 19:03+0000\n" -"Last-Translator: Martin Tóth , 2017,2023\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Advanced options" -msgstr "Pokročilé nastavenia" - -msgid "Flat Pages" -msgstr "Statické stránky" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Príklad: „/about/contact/“. Zabezpečte, aby boli lomky na začiatku a na " -"konci." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Táto hodnota musí obsahovať len písmená, číslice, bodky, podčiarovníky, " -"pomlčky, lomky alebo vlnovky." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Príklad: „/about/contact“. Zabezpečte, aby bola lomka na začiatku." - -msgid "URL is missing a leading slash." -msgstr "V URL chýba úvodná lomka." - -msgid "URL is missing a trailing slash." -msgstr "V URL chýba koncová lomka." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Statická stránka s url %(url)s pre sídlo %(site)s už existuje." - -msgid "title" -msgstr "názov" - -msgid "content" -msgstr "obsah" - -msgid "enable comments" -msgstr "povoliť komentáre" - -msgid "template name" -msgstr "názov šablóny" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Príklad: „flatpages/contact_page.html“. Ak nie je uvedené, systém použije " -"„flatpages/default.html“." - -msgid "registration required" -msgstr "nutná registrácia" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ak je toto zaškrtnuté, na stránku budú mať prístup len prihlásení " -"používatelia." - -msgid "sites" -msgstr "sídla" - -msgid "flat page" -msgstr "statická stránka" - -msgid "flat pages" -msgstr "statické stránky" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index 4bae321..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index af01899..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrej Marsetič, 2022 -# iElectric , 2011 -# Jannis Leidel , 2011 -# zejn , 2016 -# zejn , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2023-04-24 19:03+0000\n" -"Last-Translator: Andrej Marsetič, 2022\n" -"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "Advanced options" -msgstr "Napredne možnosti" - -msgid "Flat Pages" -msgstr "enostavne strani" - -msgid "URL" -msgstr "Naslov URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Primer: “/o-nas/kontakt/”. Prepričajte se, da imate začetne in končne " -"poševnice." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Vsebina lahko vsebuje samo črke, številke, pike, podčrtaje, poševnice, " -"črtice in tilde." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Primer: “/o-nas/kontakt/”. Prepričajte se, da imate poševnico na začetku." - -msgid "URL is missing a leading slash." -msgstr "Na začetku naslov URL manjka poševnica." - -msgid "URL is missing a trailing slash." -msgstr "Na koncu naslova URL manjka poševnica." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Enostavna stran na naslovu %(url)s že obstaja na strani %(site)s" - -msgid "title" -msgstr "naslov" - -msgid "content" -msgstr "vsebina" - -msgid "enable comments" -msgstr "omogoči opombe" - -msgid "template name" -msgstr "ime predloge" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Primer: »flatpages/contact_page.html«. Če je to polje prazno, bo sistem " -"uporabil »flatpages/default.html«." - -msgid "registration required" -msgstr "zahtevana je registracija" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Izbrana možnost omogoča ogled strani le prijavljenim uporabnikom." - -msgid "sites" -msgstr "strani" - -msgid "flat page" -msgstr "enostavna stran" - -msgid "flat pages" -msgstr "enostavne strani" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sq/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index bea62bf..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sq/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index b73d15a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2011,2015 -# Besnik Bleta , 2025 -# Besnik Bleta , 2015,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Mundësi të mëtejshme" - -msgid "Flat Pages" -msgstr "Faqe të Thjeshta" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Shembull: “/rreth/kontakt/”. Sigurohuni që vendosni pjerraket përkatëse." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Kjo vlerë duhet të përmbajë vetëm shkronja, numra, pika, nënvija, vija " -"ndarëse, pjerrake ose shenjën afërsisht." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Shembull: “/mbi/kontakt”. Sigurohuni që keni pjerrake paraprirëse." - -msgid "URL is missing a leading slash." -msgstr "URL-së i mungon një pjerrake në krye." - -msgid "URL is missing a trailing slash." -msgstr "URL-së i mungon një pjerrake në fund." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Ka tashmë një “flatpage” me url %(url)s për sajtin %(site)s" - -msgid "title" -msgstr "titull" - -msgid "content" -msgstr "lëndë" - -msgid "enable comments" -msgstr "aktivizo komente" - -msgid "template name" -msgstr "emër gjedheje" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Shembull: “flatpages/contact_page.html”. Nëse s’është dhënë një e tillë, " -"sistemi do të përdorë “flatpages/default.html”." - -msgid "registration required" -msgstr "lypset regjistrim" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Po iu vu shenjë kësaj, faqen do të jenë në gjendje ta shohin vetëm " -"përdoruesit që kanë bërë hyrjen." - -msgid "sites" -msgstr "sajte" - -msgid "flat page" -msgstr "faqe e thjeshtë" - -msgid "flat pages" -msgstr "faqe të thjeshta" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index f5b96db..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index 46cb525..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Igor Jerosimić, 2019-2020 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-21 20:41+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (http://www.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Advanced options" -msgstr "Напредна подешавања" - -msgid "Flat Pages" -msgstr "Флет странице" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Пример: \"/about/contact/\". Пазите на то да постоје почетне и завршне косе " -"црте." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Унета вредност може садржати само слова, бројке, тачке, доње црте, црте, " -"знаке разломка или тилде." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Пример: '/about/contact/'. Пазите на то да постоји почетна коса црта." - -msgid "URL is missing a leading slash." -msgstr "Недостаје коса црта на почетку URL-а." - -msgid "URL is missing a trailing slash." -msgstr "Недостаје коса црта на крају URL-а." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Страница са адресом %(url)s већ постоји за сајт %(site)s" - -msgid "title" -msgstr "наслов" - -msgid "content" -msgstr "садржај" - -msgid "enable comments" -msgstr "омогући коментарисање" - -msgid "template name" -msgstr "назив темплејта" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Пример: \"flatpages/contact_page.html\". Ако ово оставите празним, систем ће " -"користити \"flatpages/default.html\"." - -msgid "registration required" -msgstr "потребна регистрација" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ако је ово обележено, само ће пријављени корисници моћи да виде ову страницу." - -msgid "sites" -msgstr "сајтови" - -msgid "flat page" -msgstr "флет страница" - -msgid "flat pages" -msgstr "флет странице" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index 733de55..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index b059b29..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Igor Jerosimić, 2019-2020 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-21 20:48+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" -"language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Advanced options" -msgstr "Napredna podešavanja" - -msgid "Flat Pages" -msgstr "Flet stranice" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Primer: \"/about/contact/\". Pazite na to da postoje početne i završne kose " -"crte." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Uneta vrednost može sadržati samo slova, brojke, tačke, donje crte, crte, " -"znake razlomka ili tilde." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Primer: \"/about/contact/\". Pazite na to da postoji početna kosa crta." - -msgid "URL is missing a leading slash." -msgstr "Nedostaje kosa crta na početku URL-a." - -msgid "URL is missing a trailing slash." -msgstr "Nedostaje kosa crta na kraju URL-a." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Stranica sa adresom %(url)s već postoji za sajt %(site)s" - -msgid "title" -msgstr "naslov" - -msgid "content" -msgstr "sadržaj" - -msgid "enable comments" -msgstr "omogući komentarisanje" - -msgid "template name" -msgstr "naziv templejta" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Primer: \"flatpages/contact_page.html\". Ako ovo ostavite praznim, sistem će " -"koristiti \"flatpages/contact_page.html\"." - -msgid "registration required" -msgstr "potrebna registracija" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ako je ovo obeleženo, samo će prijavljeni korisnici moći da vide ovu " -"stranicu." - -msgid "sites" -msgstr "sajtovi" - -msgid "flat page" -msgstr "flet stranica" - -msgid "flat pages" -msgstr "flet stranice" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index 483a758..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index 2e772d0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Albin Larsson , 2022 -# Andreas Pelme , 2011-2012 -# Jannis Leidel , 2011 -# Jonathan Lindén, 2014 -# Petter Strandmark , 2019 -# Thomas Lundqvist, 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2022-07-24 19:03+0000\n" -"Last-Translator: Albin Larsson \n" -"Language-Team: Swedish (http://www.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Avancerade inställningar" - -msgid "Flat Pages" -msgstr "Statiska sidor" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Exempel: \"/om/kontakt/\". Se till att ha inledande och avslutande " -"snedstreck." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Detta värde får endast innehålla bokstäver, siffror, punkter, understreck, " -"bindestreck, snedstreck och tilde." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "Exempel: \"/om/kontakt/\". Se till att ett inledande snedstreck." - -msgid "URL is missing a leading slash." -msgstr "URL:en saknar ett inledande snedstreck." - -msgid "URL is missing a trailing slash." -msgstr "URL:en saknar ett avslutande snedstreck." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Statisk sida med %(url)s finns redan för webbplatsen %(site)s" - -msgid "title" -msgstr "titel" - -msgid "content" -msgstr "innehåll" - -msgid "enable comments" -msgstr "aktivera kommentarer" - -msgid "template name" -msgstr "mallnamn" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Exempel: 'sidor/kontaktsida.html'. Om detta inte fylls i kommer systemet att " -"använda 'flatpages/default.html'." - -msgid "registration required" -msgstr "registrering krävs" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Om detta bockas för kommer endast inloggade användare kunna se sidan." - -msgid "sites" -msgstr "webbplatser" - -msgid "flat page" -msgstr "statisk sida" - -msgid "flat pages" -msgstr "statiska sidor" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sw/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index fcf11e5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sw/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index 564ec06..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,83 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Machaku , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Chaguzi za kiwango cha juu" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Mfano: '/about/contact/'. Hakikisha unaweka mkwaju mwanzoni na mwishoni." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "URL imekosa mkwaju mwishoni" - -msgid "URL is missing a trailing slash." -msgstr "URL imekosa mkwaju mwanzoni" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "kichwa" - -msgid "content" -msgstr "maudhui" - -msgid "enable comments" -msgstr "ruhusu maoni" - -msgid "template name" -msgstr "jina la templeti" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Mfano: 'flatpages/contact_page.html'. Ikiwa hii haitaainishwa mfumo utatumia " -"'flatpages/default.html'." - -msgid "registration required" -msgstr "usajili unahitajika" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ikiwa hii itatikiwa ni watumiaji waliosajiliwa tuu ndio watakaoweza kuuona " -"ukurasa huo" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ta/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index bf8dadf..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ta/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index ab745cd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "உதாரணம்: '/about/contact/'. முன்னும் பின்னும் '/' உள்ளதை உறுதி செய்க." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "தலைப்பு" - -msgid "content" -msgstr "பொருளடக்கம்" - -msgid "enable comments" -msgstr "விமர்சனங்களை செயலாக்கு" - -msgid "template name" -msgstr "வார்ப்புரு பெயர்" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"உதாரணம் 'flatpages/contact_page'. இது இல்லையெனில் 'flatpages/default' என்பதே " -"பயன்படுத்தப்படும்.ப்படும்." - -msgid "registration required" -msgstr "முன்பதிவு தேவை" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"இது தெரிவு செய்யப்பட்டிருந்தால், உள்நுழைந்த பயனர்கள் மட்டுமே இந்தப் பக்கத்தை பார்க்க முடியும்." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "எளிய பக்கம்" - -msgid "flat pages" -msgstr "எளிய பக்கங்கள்" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/te/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index 76d634c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/te/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index 0d38aae..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,79 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "పట్టము" - -msgid "content" -msgstr "సూచన " - -msgid "enable comments" -msgstr "" - -msgid "template name" -msgstr "" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"ఉదాహరణ: 'flatpages/contact_page.html'.ఇది ఇవ్వకపోతే సిస్టం 'flatpages/default." -"html' ని వాడుకుంటడి" - -msgid "registration required" -msgstr "నమొదు చేయటము అవసరం" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "ఇది చెక్ చేసి ఉంటే కేవలం లాగ్గడ్ ఇన్ యూజర్లు పేజి చూడలేస్తారు" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index 2ce72c0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index e0f76cc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-15 00:29+0000\n" -"Last-Translator: Surush Sufiew \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Танзимоти васеъ" - -msgid "Flat Pages" -msgstr "Саҳифаҳои муқарарӣ" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Қимат бояд танҳо аз ҳарф, рақам, ва аломатҳои нуқта, зерхат, дефис, слеш ва " -"зада иборат бошад." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "Дар аввали URL слеш(/) мавҷуд нест" - -msgid "URL is missing a trailing slash." -msgstr "Дар охири URL слеш(/) мавҷуд нест" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" -"Саҳифаи муқарарӣ бо чунин суроға %(url)s барои сомонаи %(site)s алакай " -"мавҷуд аст." - -msgid "title" -msgstr "сархат" - -msgid "content" -msgstr "контент" - -msgid "enable comments" -msgstr "фаъолсозии 'андешаҳо'" - -msgid "template name" -msgstr "номи нусха" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" - -msgid "registration required" -msgstr "Бақайдгирӣ талаб карда мешавад" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Агар қайд шуда бошад, танҳо истифодабарандагони рухсатдор метавонанд аз " -"назар гузаронанд." - -msgid "sites" -msgstr "сомонаҳо" - -msgid "flat page" -msgstr "саҳифаи муқарарӣ" - -msgid "flat pages" -msgstr "саҳифаҳои муқарарӣ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/th/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index f477c9b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/th/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index be7808a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Kowit Charoenratchatabhan \n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "ตัวเลือกเพิ่มเติม" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "ตัวอย่าง: '/about/contact/'. ต้องแน่ใจว่าขึ้นต้นและลงท้ายด้วยเครื่องหมาย /" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "ค่านี้จะต้องประกอบด้วยตัวอักษร, ตัวเลข, จุด, ขีดขีดกลาง, เครื่องหมาย / หรือตัวหนอน" - -msgid "URL is missing a leading slash." -msgstr "เครื่องหมาย \"/\" นำหน้า URL หายไป" - -msgid "URL is missing a trailing slash." -msgstr "เครื่องหมาย \"/\" ตามหลัง URL หายไป" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "หน้าเรียบชื่อ %(url)s ถูกใช้ไปแล้วสำหรับ %(site)s" - -msgid "title" -msgstr "หัวข้อ" - -msgid "content" -msgstr "เนื้อหา" - -msgid "enable comments" -msgstr "ใช้งานข้อติชม" - -msgid "template name" -msgstr "ชื่อเทมเพลต" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"ตัวอย่าง: 'flatpages/contact_page.html' ถ้าไม่ได้ถูกใช้ ระบบจะใช้ 'flatpages/default." -"html' " - -msgid "registration required" -msgstr "ต้องลงทะเบียนก่อน" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "ถ้าถูกเลือก ผู้ใช้ที่ลงทะเบียนเข้าสู่ระบบเท่านั้นที่จะสามารถดูหน้านี้" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "หน้าเรียบ" - -msgid "flat pages" -msgstr "หน้าเรียบ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index 643416e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index 54dd112..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Resul , 2024 -# Welbeck Garli , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2024-08-07 19:03+0000\n" -"Last-Translator: Resul , 2024\n" -"Language-Team: Turkmen (http://app.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "Has çylşyrymly wariantlar" - -msgid "Flat Pages" -msgstr "Ýönekeý Sahypalar" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Meselem: \"about/contact/\". Dogry we yzygiderli çyzgylaryň bardygyna göz " -"ýetiriň." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "Sözbaşy" - -msgid "content" -msgstr "mazmun" - -msgid "enable comments" -msgstr "" - -msgid "template name" -msgstr "" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" - -msgid "registration required" -msgstr "" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index 920fcc4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index 7ccae22..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,94 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BouRock, 2015,2019 -# BouRock, 2014 -# Jannis Leidel , 2011 -# Metin Amiroff , 2011 -# Murat Çorlu , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 08:28+0000\n" -"Last-Translator: BouRock\n" -"Language-Team: Turkish (http://www.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Advanced options" -msgstr "Gelişmiş seçenekler" - -msgid "Flat Pages" -msgstr "Düz Sayfalar" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Örnek: “/hakkinda/iletisim/”. Başında ve sonunda bölü işareti olduğundan " -"emin olun." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Bu değer sadece harfler, sayılar, noktalar, altçizgiler, tireler, bölme veya " -"yaklaşık işaretleri içermek zorundadır." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Örnek: “/hakkinda/iletisim”. Başında bölü işareti olduğundan emin olun." - -msgid "URL is missing a leading slash." -msgstr "URL başında bölü işareti eksik." - -msgid "URL is missing a trailing slash." -msgstr "URL sonunda bölü işareti eksik." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(url)s adresli düz sayfa %(site)s sitesinde zaten mevcut" - -msgid "title" -msgstr "başlık" - -msgid "content" -msgstr "içerik" - -msgid "enable comments" -msgstr "yorumları etkinleştir" - -msgid "template name" -msgstr "şablon adı" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Örnek: “flatpages/contact_page.html”. Eğer bu şekilde yazılmazsa, sistem " -"“flatpages/default.html” olarak kullanacak." - -msgid "registration required" -msgstr "kayıt olma gerekli" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Eğer bu işaretlenirse, sadece oturum açan kullanıcılar sayfayı " -"görüntüleyebilecektir." - -msgid "sites" -msgstr "siteler" - -msgid "flat page" -msgstr "düz sayfa" - -msgid "flat pages" -msgstr "düz sayfalar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index 038f647..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index 0754d68..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "Өстәмә көйләүләр" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Үрнәк: '/about/contact/'. Алдынгы һәм арттагы авыш сызыкларын кертүне " -"тикшерегез." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Бу кыйммәт тик хәрефләрдән, саннардан һәм нокта, астына сызу, тире, авыш " -"сызык, тильда билгеләреннән генә тора ала." - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "башлам" - -msgid "content" -msgstr "эчтәлек" - -msgid "enable comments" -msgstr "фикерләрне ялгарга" - -msgid "template name" -msgstr "шаблон исеме" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Үрнәк: 'flatpages/contact_page.html'. Күрсәтелгән булмаса, система " -"'flatpages/defalut.html' кулланыр." - -msgid "registration required" -msgstr "теркәлү кирәк" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Билгеләнгән булса, фәкать кергән кулланучылар гына сәхифәне күрә алырлар." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "гади сәхифә" - -msgid "flat pages" -msgstr "гади сәхифәләр" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/udm/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index 4613a37..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/udm/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index 45fb893..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,77 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/django/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "" - -msgid "content" -msgstr "" - -msgid "enable comments" -msgstr "" - -msgid "template name" -msgstr "" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" - -msgid "registration required" -msgstr "" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ug/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index 422f871..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ug/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index c4a1e71..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,85 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2023-12-04 19:03+0000\n" -"Last-Translator: Azat, 2023\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "ئالىي تاللانما" - -msgid "Flat Pages" -msgstr "تەكشى بەتلەر" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"مىسال: “/about/contact/”. باش قىسمى ۋە ئاخىر قىسمىدا سىزىق بولۇشى كېرەك." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"بۇ قىممەت پەقەت ھەرپلەر، سانلار، نۇقتىلار، ئاستى سىزىقلار، سىزىقلار، يانتۇ " -"سىزىقلار ياكى تىلدىلاردىن تۈزۈلگەن بولۇشى كېرەك." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "مىسال: “/about/contact”. باش قىسمىدا سىزىق بولۇشى كېرەك." - -msgid "URL is missing a leading slash." -msgstr "URL نىڭ باش قىسمىدا سىزىق يوق." - -msgid "URL is missing a trailing slash." -msgstr "URL نىڭ ئاخىر قىسمىدا سىزىق يوق." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "%(site)s تور بېكىتى ئۈچۈن %(url)ss URL ئادرېسلىق تەك بەت مەۋجۇت." - -msgid "title" -msgstr "ماۋزۇ" - -msgid "content" -msgstr "مەزمۇن" - -msgid "enable comments" -msgstr "ئىنكاسلارنى قوزغىتىڭ" - -msgid "template name" -msgstr "قېلىپ ئاتى" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"مىسال: “flatpages/contact_page.html”. ئەگەر بۇ تەمىنلەنمىسە، سىستېما " -"“flatpages/default.html” نى ئىشلىتىدۇ." - -msgid "registration required" -msgstr "تىزىملىتىش زۆرۈر" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "ئەگەر بۇ تاللانسا، پەقەت كىرگەن ئىشلەتكۈچىلەر بەتنى كۆرەلەيدۇ." - -msgid "sites" -msgstr "بېكەتلەر" - -msgid "flat page" -msgstr "تەكشى بەت" - -msgid "flat pages" -msgstr "تەكشى بەتلەر" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/uk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index 72d6b06..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/uk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index 8ba1e76..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,99 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Oleksandr Chernihov , 2014 -# Illia Volochii , 2021 -# Jannis Leidel , 2011 -# Panasoft, 2016 -# Sergey Lysach , 2011-2012 -# tarasyyyk , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2021-01-20 00:29+0000\n" -"Last-Translator: Illia Volochii \n" -"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -msgid "Advanced options" -msgstr "Додаткові опції" - -msgid "Flat Pages" -msgstr "Прості сторінки" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "" -"Наприклад, “/about/contact/”. Переконайтеся у наявності скісної риски на " -"початку та вкінці." - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"Це значення повинне містити тільки літери, цифри, крапки, підкреслення, " -"тире, косі риси чи тільди." - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "" -"Наприклад, “/about/contact/”. Переконайтеся у наявності скісної риски на " -"початку." - -msgid "URL is missing a leading slash." -msgstr "На початку URL відсутня коса риса." - -msgid "URL is missing a trailing slash." -msgstr "В кінці URL відсутня коса риса." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "Проста сторінка з адресою %(url)s вже існує для сайту %(site)s" - -msgid "title" -msgstr "заголовок" - -msgid "content" -msgstr "зміст" - -msgid "enable comments" -msgstr "увімкнути коментарі" - -msgid "template name" -msgstr "ім'я шаблона" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"Наприклад, “/about/contact/”. Якщо не вказано, система використовуватиме " -"“flatpages/default.html”." - -msgid "registration required" -msgstr "потрібна реєстрація" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Якщо тут є галочка, тільки користувачі, що увійшли, зможуть переглядати цю " -"сторінку." - -msgid "sites" -msgstr "сайти" - -msgid "flat page" -msgstr "проста сторінка" - -msgid "flat pages" -msgstr "прості сторінки" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ur/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index dfb3755..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ur/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index 73d30d3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Advanced options" -msgstr "اعلٰی اختیارات" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "یو آر ایل (URL(" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"مثال: '/about/contact/'۔ یقین کر لیں کہ سابقہ اور لاحقہ سلیش موجود ھے۔" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"اس قیمت (ویلیو) کا صرف حروف، نمبروں، نقاط، انڈرسکور، ڈیش، سلیش، یا ٹائلڈ پر " -"مشتمل ھونا ضروری ھے۔" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "عنوان" - -msgid "content" -msgstr "مضمون" - -msgid "enable comments" -msgstr "تبصرے فعال کریں" - -msgid "template name" -msgstr "قالب کا نام" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"مثال: 'flatpages/contact_page.html'۔ اگر یہ مھیا نھیں کیا گیا تو سسٹم " -"'flatpages/default.html' استعمال کرے گا۔" - -msgid "registration required" -msgstr "رجسٹریشن ضروری ھے" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"اگر یہ فعال ھے تو صرف اندر آئے ھوئے (logged-in) صارفین یہ صفحہ دیکھنے کے " -"قابل ھوں گے۔" - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "ھموار صفحہ" - -msgid "flat pages" -msgstr "ھموار صفحے" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/vi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index cbee5e4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/vi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index 9caf553..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,82 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# toi ta , 2016 -# Tran , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: toi ta \n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "Các tùy chọn nâng cao" - -msgid "Flat Pages" -msgstr "" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" - -msgid "URL is missing a leading slash." -msgstr "" - -msgid "URL is missing a trailing slash." -msgstr "" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "" - -msgid "title" -msgstr "tiêu đề" - -msgid "content" -msgstr "nội dung" - -msgid "enable comments" -msgstr "mở bình luận" - -msgid "template name" -msgstr "tên thiết kế" - -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" - -msgid "registration required" -msgstr "Bạn cần phải cần đăng kí" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Nếu bạn đánh dấu vào đây, chỉ những tài khoản đã đăng nhập mới có thể xem " -"được trang này." - -msgid "sites" -msgstr "" - -msgid "flat page" -msgstr "" - -msgid "flat pages" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index 58e3c9e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index a1e058b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Lele Long , 2011 -# mozillazg , 2016 -# Ronald White , 2014 -# Suntravel Chris , 2019 -# wolf ice , 2020 -# Kevin Sze , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-03-04 04:05+0000\n" -"Last-Translator: wolf ice \n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "高级选项" - -msgid "Flat Pages" -msgstr "简单页面" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "例如:“/about/contact/”。确保有开头和结尾的斜杠。" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "该值必须只能包含字母,数字,点号,下划线,破折号,和" - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "例如:“/about/contact”。确保有一个开头的斜杠。" - -msgid "URL is missing a leading slash." -msgstr "URL头部缺失斜线." - -msgid "URL is missing a trailing slash." -msgstr "URL尾部缺失斜线." - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "带有url %(url)s的Flatpage已经存在于站点 %(site)s" - -msgid "title" -msgstr "标题" - -msgid "content" -msgstr "内容" - -msgid "enable comments" -msgstr "允许评论" - -msgid "template name" -msgstr "模板名称" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"例如:“flatpages/contact_page.html”。如果它未被提供,系统将使用“flatpages/" -"default.html”。" - -msgid "registration required" -msgstr "请先注册" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "如果被选中,仅登录用户才可以查看此页。" - -msgid "sites" -msgstr "站点" - -msgid "flat page" -msgstr "简单页面" - -msgid "flat pages" -msgstr "简单页面" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index 756e0b2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index f64b252..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# ilay , 2012 -# Jannis Leidel , 2011 -# 619e61dbdb61c57213f62815aaf60e01, 2011 -# Tzu-ping Chung , 2016,2019 -# YAO WEN LIANG, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2024-08-07 19:03+0000\n" -"Last-Translator: YAO WEN LIANG, 2024\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Advanced options" -msgstr "進階選項" - -msgid "Flat Pages" -msgstr "靜態頁面" - -msgid "URL" -msgstr "URL" - -msgid "" -"Example: “/about/contact/”. Make sure to have leading and trailing slashes." -msgstr "例如:「/about/contact/」。注意必須包含開頭與結束的斜線。" - -msgid "" -"This value must contain only letters, numbers, dots, underscores, dashes, " -"slashes or tildes." -msgstr "" -"此欄位只能有: 英文字母、數字、點(.)、底線(_)、刪節號(-)、斜線(/)、波浪號(~)。" - -msgid "Example: “/about/contact”. Make sure to have a leading slash." -msgstr "例如:「/about/contact」。注意必須包含開頭的斜線。" - -msgid "URL is missing a leading slash." -msgstr "URL 缺少前導的斜線。" - -msgid "URL is missing a trailing slash." -msgstr "URL 缺少一個斜線。" - -#, python-format -msgid "Flatpage with url %(url)s already exists for site %(site)s" -msgstr "網站 %(site)s 已經存在一個靜態頁面,其 url 為 %(url)s。" - -msgid "title" -msgstr "標題" - -msgid "content" -msgstr "內容" - -msgid "enable comments" -msgstr "啟用評論" - -msgid "template name" -msgstr "模板名稱" - -msgid "" -"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " -"will use “flatpages/default.html”." -msgstr "" -"例如:\"flatpages/contact_page.html\"。若未提供,系統會使用 \"flatpages/" -"default.html\"。" - -msgid "registration required" -msgstr "請先註冊" - -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "如果此項被選取,則只有登入的使用者可以檢視頁面。" - -msgid "sites" -msgstr "網站" - -msgid "flat page" -msgstr "靜態頁面" - -msgid "flat pages" -msgstr "靜態頁面" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/middleware.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/middleware.py deleted file mode 100644 index 9c6a727..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/middleware.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.conf import settings -from django.contrib.flatpages.views import flatpage -from django.http import Http404 -from django.utils.deprecation import MiddlewareMixin - - -class FlatpageFallbackMiddleware(MiddlewareMixin): - def process_response(self, request, response): - if response.status_code != 404: - return response # No need to check for a flatpage for non-404 responses. - try: - return flatpage(request, request.path_info) - # Return the original response if any errors happened. Because this - # is a middleware, we can't assume the errors will be caught elsewhere. - except Http404: - return response - except Exception: - if settings.DEBUG: - raise - return response diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/migrations/0001_initial.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/migrations/0001_initial.py deleted file mode 100644 index db95098..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/migrations/0001_initial.py +++ /dev/null @@ -1,68 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("sites", "0001_initial"), - ] - - operations = [ - migrations.CreateModel( - name="FlatPage", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "url", - models.CharField(max_length=100, verbose_name="URL", db_index=True), - ), - ("title", models.CharField(max_length=200, verbose_name="title")), - ("content", models.TextField(verbose_name="content", blank=True)), - ( - "enable_comments", - models.BooleanField(default=False, verbose_name="enable comments"), - ), - ( - "template_name", - models.CharField( - help_text=( - "Example: “flatpages/contact_page.html”. If this isn’t " - "provided, the system will use “flatpages/default.html”." - ), - max_length=70, - verbose_name="template name", - blank=True, - ), - ), - ( - "registration_required", - models.BooleanField( - default=False, - help_text=( - "If this is checked, only logged-in users will be able to " - "view the page." - ), - verbose_name="registration required", - ), - ), - ( - "sites", - models.ManyToManyField(to="sites.Site", verbose_name="sites"), - ), - ], - options={ - "ordering": ["url"], - "db_table": "django_flatpage", - "verbose_name": "flat page", - "verbose_name_plural": "flat pages", - }, - bases=(models.Model,), - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/migrations/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/models.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/models.py deleted file mode 100644 index d001cd1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/models.py +++ /dev/null @@ -1,49 +0,0 @@ -from django.contrib.sites.models import Site -from django.db import models -from django.urls import NoReverseMatch, get_script_prefix, reverse -from django.utils.encoding import iri_to_uri -from django.utils.translation import gettext_lazy as _ - - -class FlatPage(models.Model): - url = models.CharField(_("URL"), max_length=100, db_index=True) - title = models.CharField(_("title"), max_length=200) - content = models.TextField(_("content"), blank=True) - enable_comments = models.BooleanField(_("enable comments"), default=False) - template_name = models.CharField( - _("template name"), - max_length=70, - blank=True, - help_text=_( - "Example: “flatpages/contact_page.html”. If this isn’t provided, " - "the system will use “flatpages/default.html”." - ), - ) - registration_required = models.BooleanField( - _("registration required"), - help_text=_( - "If this is checked, only logged-in users will be able to view the page." - ), - default=False, - ) - sites = models.ManyToManyField(Site, verbose_name=_("sites")) - - class Meta: - db_table = "django_flatpage" - verbose_name = _("flat page") - verbose_name_plural = _("flat pages") - ordering = ["url"] - - def __str__(self): - return "%s -- %s" % (self.url, self.title) - - def get_absolute_url(self): - from .views import flatpage - - for url in (self.url.lstrip("/"), self.url): - try: - return reverse(flatpage, kwargs={"url": url}) - except NoReverseMatch: - pass - # Handle script prefix manually because we bypass reverse() - return iri_to_uri(get_script_prefix().rstrip("/") + self.url) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/sitemaps.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/sitemaps.py deleted file mode 100644 index 405507c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/sitemaps.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.apps import apps as django_apps -from django.contrib.sitemaps import Sitemap -from django.core.exceptions import ImproperlyConfigured - - -class FlatPageSitemap(Sitemap): - def items(self): - if not django_apps.is_installed("django.contrib.sites"): - raise ImproperlyConfigured( - "FlatPageSitemap requires django.contrib.sites, which isn't installed." - ) - Site = django_apps.get_model("sites.Site") - current_site = Site.objects.get_current() - return current_site.flatpage_set.filter(registration_required=False) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/templatetags/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/templatetags/flatpages.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/templatetags/flatpages.py deleted file mode 100644 index 9ec6b88..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/templatetags/flatpages.py +++ /dev/null @@ -1,101 +0,0 @@ -from django import template -from django.conf import settings -from django.contrib.flatpages.models import FlatPage -from django.contrib.sites.shortcuts import get_current_site - -register = template.Library() - - -class FlatpageNode(template.Node): - def __init__(self, context_name, starts_with=None, user=None): - self.context_name = context_name - if starts_with: - self.starts_with = template.Variable(starts_with) - else: - self.starts_with = None - if user: - self.user = template.Variable(user) - else: - self.user = None - - def render(self, context): - if "request" in context: - site_pk = get_current_site(context["request"]).pk - else: - site_pk = settings.SITE_ID - flatpages = FlatPage.objects.filter(sites__id=site_pk) - # If a prefix was specified, add a filter - if self.starts_with: - flatpages = flatpages.filter( - url__startswith=self.starts_with.resolve(context) - ) - - # If the provided user is not authenticated, or no user - # was provided, filter the list to only public flatpages. - if self.user: - user = self.user.resolve(context) - if not user.is_authenticated: - flatpages = flatpages.filter(registration_required=False) - else: - flatpages = flatpages.filter(registration_required=False) - - context[self.context_name] = flatpages - return "" - - -@register.tag -def get_flatpages(parser, token): - """ - Retrieve all flatpage objects available for the current site and - visible to the specific user (or visible to all users if no user is - specified). Populate the template context with them in a variable - whose name is defined by the ``as`` clause. - - An optional ``for`` clause controls the user whose permissions are used in - determining which flatpages are visible. - - An optional argument, ``starts_with``, limits the returned flatpages to - those beginning with a particular base URL. This argument can be a variable - or a string, as it resolves from the template context. - - Syntax:: - - {% get_flatpages ['url_starts_with'] [for user] as context_name %} - - Example usage:: - - {% get_flatpages as flatpages %} - {% get_flatpages for someuser as flatpages %} - {% get_flatpages '/about/' as about_pages %} - {% get_flatpages prefix as about_pages %} - {% get_flatpages '/about/' for someuser as about_pages %} - """ - bits = token.split_contents() - syntax_message = ( - "%(tag_name)s expects a syntax of %(tag_name)s " - "['url_starts_with'] [for user] as context_name" % {"tag_name": bits[0]} - ) - # Must have at 3-6 bits in the tag - if 3 <= len(bits) <= 6: - # If there's an even number of bits, there's no prefix - if len(bits) % 2 == 0: - prefix = bits[1] - else: - prefix = None - - # The very last bit must be the context name - if bits[-2] != "as": - raise template.TemplateSyntaxError(syntax_message) - context_name = bits[-1] - - # If there are 5 or 6 bits, there is a user defined - if len(bits) >= 5: - if bits[-4] != "for": - raise template.TemplateSyntaxError(syntax_message) - user = bits[-3] - else: - user = None - - return FlatpageNode(context_name, starts_with=prefix, user=user) - else: - raise template.TemplateSyntaxError(syntax_message) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/urls.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/urls.py deleted file mode 100644 index d4480b3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/urls.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.contrib.flatpages import views -from django.urls import path - -urlpatterns = [ - path("", views.flatpage, name="django.contrib.flatpages.views.flatpage"), -] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/views.py b/.venv/lib/python3.10/site-packages/django/contrib/flatpages/views.py deleted file mode 100644 index 776f179..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/flatpages/views.py +++ /dev/null @@ -1,70 +0,0 @@ -from django.conf import settings -from django.contrib.flatpages.models import FlatPage -from django.contrib.sites.shortcuts import get_current_site -from django.http import Http404, HttpResponse, HttpResponsePermanentRedirect -from django.shortcuts import get_object_or_404 -from django.template import loader -from django.utils.safestring import mark_safe -from django.views.decorators.csrf import csrf_protect - -DEFAULT_TEMPLATE = "flatpages/default.html" - -# This view is called from FlatpageFallbackMiddleware.process_response -# when a 404 is raised, which often means CsrfViewMiddleware.process_view -# has not been called even if CsrfViewMiddleware is installed. So we need -# to use @csrf_protect, in case the template needs {% csrf_token %}. -# However, we can't just wrap this view; if no matching flatpage exists, -# or a redirect is required for authentication, the 404 needs to be returned -# without any CSRF checks. Therefore, we only -# CSRF protect the internal implementation. - - -def flatpage(request, url): - """ - Public interface to the flat page view. - - Models: `flatpages.flatpages` - Templates: Uses the template defined by the ``template_name`` field, - or :template:`flatpages/default.html` if template_name is not defined. - Context: - flatpage - `flatpages.flatpages` object - """ - if not url.startswith("/"): - url = "/" + url - site_id = get_current_site(request).id - try: - f = get_object_or_404(FlatPage, url=url, sites=site_id) - except Http404: - if not url.endswith("/") and settings.APPEND_SLASH: - url += "/" - f = get_object_or_404(FlatPage, url=url, sites=site_id) - return HttpResponsePermanentRedirect("%s/" % request.path) - else: - raise - return render_flatpage(request, f) - - -@csrf_protect -def render_flatpage(request, f): - """ - Internal interface to the flat page view. - """ - # If registration is required for accessing this page, and the user isn't - # logged in, redirect to the login page. - if f.registration_required and not request.user.is_authenticated: - from django.contrib.auth.views import redirect_to_login - - return redirect_to_login(request.path) - if f.template_name: - template = loader.select_template((f.template_name, DEFAULT_TEMPLATE)) - else: - template = loader.get_template(DEFAULT_TEMPLATE) - - # To avoid having to always use the "|safe" filter in flatpage templates, - # mark the title and content as already safe (since they are raw HTML - # content in the first place). - f.title = mark_safe(f.title) - f.content = mark_safe(f.content) - - return HttpResponse(template.render({"flatpage": f}, request)) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/admin/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/admin/__init__.py deleted file mode 100644 index c1f495b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/admin/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.contrib.admin import ( - HORIZONTAL, - VERTICAL, - AdminSite, - ModelAdmin, - StackedInline, - TabularInline, - action, - autodiscover, - display, - register, - site, -) -from django.contrib.gis.admin.options import GISModelAdmin - -__all__ = [ - "HORIZONTAL", - "VERTICAL", - "AdminSite", - "ModelAdmin", - "StackedInline", - "TabularInline", - "action", - "autodiscover", - "display", - "register", - "site", - "GISModelAdmin", -] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/admin/options.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/admin/options.py deleted file mode 100644 index eece241..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/admin/options.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.contrib.admin import ModelAdmin -from django.contrib.gis.db import models -from django.contrib.gis.forms import OSMWidget - - -class GeoModelAdminMixin: - gis_widget = OSMWidget - gis_widget_kwargs = {} - - def formfield_for_dbfield(self, db_field, request, **kwargs): - if isinstance(db_field, models.GeometryField) and ( - db_field.dim < 3 or self.gis_widget.supports_3d - ): - kwargs["widget"] = self.gis_widget(**self.gis_widget_kwargs) - return db_field.formfield(**kwargs) - else: - return super().formfield_for_dbfield(db_field, request, **kwargs) - - -class GISModelAdmin(GeoModelAdminMixin, ModelAdmin): - pass diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/apps.py deleted file mode 100644 index 6282501..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/apps.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.apps import AppConfig -from django.core import serializers -from django.utils.translation import gettext_lazy as _ - - -class GISConfig(AppConfig): - default_auto_field = "django.db.models.AutoField" - name = "django.contrib.gis" - verbose_name = _("GIS") - - def ready(self): - serializers.BUILTIN_SERIALIZERS.setdefault( - "geojson", "django.contrib.gis.serializers.geojson" - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/adapter.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/adapter.py deleted file mode 100644 index b472e3a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/adapter.py +++ /dev/null @@ -1,26 +0,0 @@ -class WKTAdapter: - """ - An adaptor for Geometries sent to the MySQL and Oracle database backends. - """ - - def __init__(self, geom): - self.wkt = geom.wkt - self.srid = geom.srid - - def __eq__(self, other): - return ( - isinstance(other, WKTAdapter) - and self.wkt == other.wkt - and self.srid == other.srid - ) - - def __hash__(self): - return hash((self.wkt, self.srid)) - - def __str__(self): - return self.wkt - - @classmethod - def _fix_polygon(cls, poly): - # Hook for Oracle. - return poly diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/features.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/features.py deleted file mode 100644 index cc4ce10..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/features.py +++ /dev/null @@ -1,111 +0,0 @@ -import re - -from django.contrib.gis.db import models - - -class BaseSpatialFeatures: - gis_enabled = True - - # Does the database contain a SpatialRefSys model to store SRID information? - has_spatialrefsys_table = True - - # Does the backend support the django.contrib.gis.utils.add_srs_entry() utility? - supports_add_srs_entry = True - # Does the backend introspect GeometryField to its subtypes? - supports_geometry_field_introspection = True - - # Does the database have a geography type? - supports_geography = False - # Does the backend support storing 3D geometries? - supports_3d_storage = False - # Reference implementation of 3D functions is: - # https://postgis.net/docs/PostGIS_Special_Functions_Index.html#PostGIS_3D_Functions - supports_3d_functions = False - # Does the database support SRID transform operations? - supports_transform = True - # Can geometry fields be null? - supports_null_geometries = True - # Are empty geometries supported? - supports_empty_geometries = False - # Can the function be applied on geodetic coordinate systems? - supports_distance_geodetic = True - supports_length_geodetic = True - supports_perimeter_geodetic = False - supports_area_geodetic = True - # Is the database able to count vertices on polygons (with `num_points`)? - supports_num_points_poly = True - - # Does the backend support expressions for specifying distance in the - # dwithin lookup? - supports_dwithin_distance_expr = True - - # Does the database have raster support? - supports_raster = False - - # Does the database support a unique index on geometry fields? - supports_geometry_field_unique_index = True - - # Can SchemaEditor alter geometry fields? - can_alter_geometry_field = True - - # Do the database functions/aggregates support the tolerance parameter? - supports_tolerance_parameter = False - - # Set of options that AsGeoJSON() doesn't support. - unsupported_geojson_options = {} - - # Does Intersection() return None (rather than an empty GeometryCollection) - # for empty results? - empty_intersection_returns_none = True - - @property - def supports_bbcontains_lookup(self): - return "bbcontains" in self.connection.ops.gis_operators - - @property - def supports_contained_lookup(self): - return "contained" in self.connection.ops.gis_operators - - @property - def supports_crosses_lookup(self): - return "crosses" in self.connection.ops.gis_operators - - @property - def supports_distances_lookups(self): - return self.has_Distance_function - - @property - def supports_dwithin_lookup(self): - return "dwithin" in self.connection.ops.gis_operators - - @property - def supports_relate_lookup(self): - return "relate" in self.connection.ops.gis_operators - - @property - def supports_isvalid_lookup(self): - return self.has_IsValid_function - - # Is the aggregate supported by the database? - @property - def supports_collect_aggr(self): - return models.Collect not in self.connection.ops.disallowed_aggregates - - @property - def supports_extent_aggr(self): - return models.Extent not in self.connection.ops.disallowed_aggregates - - @property - def supports_make_line_aggr(self): - return models.MakeLine not in self.connection.ops.disallowed_aggregates - - @property - def supports_union_aggr(self): - return models.Union not in self.connection.ops.disallowed_aggregates - - def __getattr__(self, name): - m = re.match(r"has_(\w*)_function$", name) - if m: - func_name = m[1] - return func_name not in self.connection.ops.unsupported_functions - raise AttributeError diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/models.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/models.py deleted file mode 100644 index 589c872..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/models.py +++ /dev/null @@ -1,140 +0,0 @@ -from django.contrib.gis import gdal - - -class SpatialRefSysMixin: - """ - The SpatialRefSysMixin is a class used by the database-dependent - SpatialRefSys objects to reduce redundant code. - """ - - @property - def srs(self): - """ - Return a GDAL SpatialReference object. - """ - # TODO: Is caching really necessary here? Is complexity worth it? - if hasattr(self, "_srs"): - # Returning a clone of the cached SpatialReference object. - return self._srs.clone() - else: - # Attempting to cache a SpatialReference object. - - # Trying to get from WKT first. - try: - self._srs = gdal.SpatialReference(self.wkt) - return self.srs - except Exception as e: - msg = e - - try: - self._srs = gdal.SpatialReference(self.proj4text) - return self.srs - except Exception as e: - msg = e - - raise Exception( - "Could not get OSR SpatialReference from WKT: %s\nError:\n%s" - % (self.wkt, msg) - ) - - @property - def ellipsoid(self): - """ - Return a tuple of the ellipsoid parameters: - (semimajor axis, semiminor axis, and inverse flattening). - """ - return self.srs.ellipsoid - - @property - def name(self): - "Return the projection name." - return self.srs.name - - @property - def spheroid(self): - "Return the spheroid name for this spatial reference." - return self.srs["spheroid"] - - @property - def datum(self): - "Return the datum for this spatial reference." - return self.srs["datum"] - - @property - def projected(self): - "Is this Spatial Reference projected?" - return self.srs.projected - - @property - def local(self): - "Is this Spatial Reference local?" - return self.srs.local - - @property - def geographic(self): - "Is this Spatial Reference geographic?" - return self.srs.geographic - - @property - def linear_name(self): - "Return the linear units name." - return self.srs.linear_name - - @property - def linear_units(self): - "Return the linear units." - return self.srs.linear_units - - @property - def angular_name(self): - "Return the name of the angular units." - return self.srs.angular_name - - @property - def angular_units(self): - "Return the angular units." - return self.srs.angular_units - - @property - def units(self): - "Return a tuple of the units and the name." - if self.projected or self.local: - return (self.linear_units, self.linear_name) - elif self.geographic: - return (self.angular_units, self.angular_name) - else: - return (None, None) - - @classmethod - def get_units(cls, wkt): - """ - Return a tuple of (unit_value, unit_name) for the given WKT without - using any of the database fields. - """ - return gdal.SpatialReference(wkt).units - - @classmethod - def get_spheroid(cls, wkt, string=True): - """ - Class method used by GeometryField on initialization to - retrieve the `SPHEROID[..]` parameters from the given WKT. - """ - srs = gdal.SpatialReference(wkt) - sphere_params = srs.ellipsoid - sphere_name = srs["spheroid"] - - if not string: - return sphere_name, sphere_params - else: - # `string` parameter used to place in format acceptable by PostGIS - if len(sphere_params) == 3: - radius, flattening = sphere_params[0], sphere_params[2] - else: - radius, flattening = sphere_params - return 'SPHEROID["%s",%s,%s]' % (sphere_name, radius, flattening) - - def __str__(self): - """ - Return the string representation, a 'pretty' OGC WKT. - """ - return str(self.srs) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/operations.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/operations.py deleted file mode 100644 index fafdf60..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/base/operations.py +++ /dev/null @@ -1,210 +0,0 @@ -from django.contrib.gis.db.models import GeometryField -from django.contrib.gis.db.models.functions import Distance -from django.contrib.gis.measure import Area as AreaMeasure -from django.contrib.gis.measure import Distance as DistanceMeasure -from django.db import NotSupportedError -from django.utils.functional import cached_property - - -class BaseSpatialOperations: - # Quick booleans for the type of this spatial backend, and - # an attribute for the spatial database version tuple (if applicable) - postgis = False - spatialite = False - mariadb = False - mysql = False - oracle = False - spatial_version = None - - # How the geometry column should be selected. - select = "%s" - - @cached_property - def select_extent(self): - return self.select - - # Aggregates - disallowed_aggregates = () - - geom_func_prefix = "" - - # Mapping between Django function names and backend names, when names do not - # match; used in spatial_function_name(). - function_names = {} - - # Set of known unsupported functions of the backend - unsupported_functions = { - "Area", - "AsGeoJSON", - "AsGML", - "AsKML", - "AsSVG", - "Azimuth", - "BoundingCircle", - "Centroid", - "ClosestPoint", - "Difference", - "Distance", - "Envelope", - "FromWKB", - "FromWKT", - "GeoHash", - "GeometryDistance", - "Intersection", - "IsEmpty", - "IsValid", - "Length", - "LineLocatePoint", - "MakeValid", - "MemSize", - "NumGeometries", - "NumPoints", - "Perimeter", - "PointOnSurface", - "Reverse", - "Scale", - "SnapToGrid", - "SymDifference", - "Transform", - "Translate", - "Union", - } - - # Constructors - from_text = False - - # Default conversion functions for aggregates; will be overridden if implemented - # for the spatial backend. - def convert_extent(self, box, srid): - raise NotImplementedError( - "Aggregate extent not implemented for this spatial backend." - ) - - def convert_extent3d(self, box, srid): - raise NotImplementedError( - "Aggregate 3D extent not implemented for this spatial backend." - ) - - # For quoting column values, rather than columns. - def geo_quote_name(self, name): - return "'%s'" % name - - # GeometryField operations - def geo_db_type(self, f): - """ - Return the database column type for the geometry field on - the spatial backend. - """ - raise NotImplementedError( - "subclasses of BaseSpatialOperations must provide a geo_db_type() method" - ) - - def get_distance(self, f, value, lookup_type): - """ - Return the distance parameters for the given geometry field, - lookup value, and lookup type. - """ - raise NotImplementedError( - "Distance operations not available on this spatial backend." - ) - - def get_geom_placeholder(self, f, value, compiler): - """ - Return the placeholder for the given geometry field with the given - value. Depending on the spatial backend, the placeholder may contain a - stored procedure call to the transformation function of the spatial - backend. - """ - - def transform_value(value, field): - return value is not None and value.srid != field.srid - - if hasattr(value, "as_sql"): - return ( - "%s(%%s, %s)" % (self.spatial_function_name("Transform"), f.srid) - if transform_value(value.output_field, f) - else "%s" - ) - if transform_value(value, f): - # Add Transform() to the SQL placeholder. - return "%s(%s(%%s,%s), %s)" % ( - self.spatial_function_name("Transform"), - self.from_text, - value.srid, - f.srid, - ) - elif self.connection.features.has_spatialrefsys_table: - return "%s(%%s,%s)" % (self.from_text, f.srid) - else: - # For backwards compatibility on MySQL (#27464). - return "%s(%%s)" % self.from_text - - def check_expression_support(self, expression): - if isinstance(expression, self.disallowed_aggregates): - raise NotSupportedError( - "%s spatial aggregation is not supported by this database backend." - % expression.name - ) - super().check_expression_support(expression) - - def spatial_aggregate_name(self, agg_name): - raise NotImplementedError( - "Aggregate support not implemented for this spatial backend." - ) - - def spatial_function_name(self, func_name): - if func_name in self.unsupported_functions: - raise NotSupportedError( - "This backend doesn't support the %s function." % func_name - ) - return self.function_names.get(func_name, self.geom_func_prefix + func_name) - - # Routines for getting the OGC-compliant models. - def geometry_columns(self): - raise NotImplementedError( - "Subclasses of BaseSpatialOperations must provide a geometry_columns() " - "method." - ) - - def spatial_ref_sys(self): - raise NotImplementedError( - "subclasses of BaseSpatialOperations must a provide spatial_ref_sys() " - "method" - ) - - distance_expr_for_lookup = staticmethod(Distance) - - def get_db_converters(self, expression): - converters = super().get_db_converters(expression) - if isinstance(expression.output_field, GeometryField): - converters.append(self.get_geometry_converter(expression)) - return converters - - def get_geometry_converter(self, expression): - raise NotImplementedError( - "Subclasses of BaseSpatialOperations must provide a " - "get_geometry_converter() method." - ) - - def get_area_att_for_field(self, field): - if field.geodetic(self.connection): - if self.connection.features.supports_area_geodetic: - return "sq_m" - raise NotImplementedError( - "Area on geodetic coordinate systems not supported." - ) - else: - units_name = field.units_name(self.connection) - if units_name: - return AreaMeasure.unit_attname(units_name) - - def get_distance_att_for_field(self, field): - dist_att = None - if field.geodetic(self.connection): - if self.connection.features.supports_distance_geodetic: - dist_att = "m" - else: - units = field.units_name(self.connection) - if units: - dist_att = DistanceMeasure.unit_attname(units) - return dist_att diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/base.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/base.py deleted file mode 100644 index 4abc052..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/base.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db.backends.mysql.base import DatabaseWrapper as MySQLDatabaseWrapper - -from .features import DatabaseFeatures -from .introspection import MySQLIntrospection -from .operations import MySQLOperations -from .schema import MySQLGISSchemaEditor - - -class DatabaseWrapper(MySQLDatabaseWrapper): - SchemaEditorClass = MySQLGISSchemaEditor - # Classes instantiated in __init__(). - features_class = DatabaseFeatures - introspection_class = MySQLIntrospection - ops_class = MySQLOperations diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/features.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/features.py deleted file mode 100644 index cd99420..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/features.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures -from django.db.backends.mysql.features import DatabaseFeatures as MySQLDatabaseFeatures -from django.utils.functional import cached_property - - -class DatabaseFeatures(BaseSpatialFeatures, MySQLDatabaseFeatures): - empty_intersection_returns_none = False - has_spatialrefsys_table = False - supports_add_srs_entry = False - supports_distance_geodetic = False - supports_length_geodetic = False - supports_area_geodetic = False - supports_transform = False - supports_null_geometries = False - supports_num_points_poly = False - unsupported_geojson_options = {"crs"} - - @cached_property - def supports_geometry_field_unique_index(self): - # Not supported in MySQL since https://dev.mysql.com/worklog/task/?id=11808 - return self.connection.mysql_is_mariadb diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/introspection.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/introspection.py deleted file mode 100644 index 4d6aea7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/introspection.py +++ /dev/null @@ -1,33 +0,0 @@ -from MySQLdb.constants import FIELD_TYPE - -from django.contrib.gis.gdal import OGRGeomType -from django.db.backends.mysql.introspection import DatabaseIntrospection - - -class MySQLIntrospection(DatabaseIntrospection): - # Updating the data_types_reverse dictionary with the appropriate - # type for Geometry fields. - data_types_reverse = DatabaseIntrospection.data_types_reverse.copy() - data_types_reverse[FIELD_TYPE.GEOMETRY] = "GeometryField" - - def get_geometry_type(self, table_name, description): - with self.connection.cursor() as cursor: - # In order to get the specific geometry type of the field, - # we introspect on the table definition using `DESCRIBE`. - cursor.execute("DESCRIBE %s" % self.connection.ops.quote_name(table_name)) - # Increment over description info until we get to the geometry - # column. - for column, typ, null, key, default, extra in cursor.fetchall(): - if column == description.name: - # Using OGRGeomType to convert from OGC name to Django field. - # MySQL does not support 3D or SRIDs, so the field params - # are empty. - field_type = OGRGeomType(typ).django - field_params = {} - break - return field_type, field_params - - def supports_spatial_index(self, cursor, table_name): - # Supported with MyISAM, Aria, or InnoDB. - storage_engine = self.get_storage_engine(cursor, table_name) - return storage_engine in ("MyISAM", "Aria", "InnoDB") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/operations.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/operations.py deleted file mode 100644 index ea9c6fd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/operations.py +++ /dev/null @@ -1,146 +0,0 @@ -from django.contrib.gis.db import models -from django.contrib.gis.db.backends.base.adapter import WKTAdapter -from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations -from django.contrib.gis.db.backends.utils import SpatialOperator -from django.contrib.gis.geos.geometry import GEOSGeometryBase -from django.contrib.gis.geos.prototypes.io import wkb_r -from django.contrib.gis.measure import Distance -from django.db.backends.mysql.operations import DatabaseOperations -from django.utils.functional import cached_property - - -class MySQLOperations(BaseSpatialOperations, DatabaseOperations): - name = "mysql" - geom_func_prefix = "ST_" - - Adapter = WKTAdapter - - @cached_property - def mariadb(self): - return self.connection.mysql_is_mariadb - - @cached_property - def mysql(self): - return not self.connection.mysql_is_mariadb - - @cached_property - def select(self): - return self.geom_func_prefix + "AsBinary(%s)" - - @cached_property - def from_text(self): - return self.geom_func_prefix + "GeomFromText" - - @cached_property - def collect(self): - if self.connection.features.supports_collect_aggr: - return self.geom_func_prefix + "Collect" - - @cached_property - def gis_operators(self): - operators = { - "bbcontains": SpatialOperator( - func="MBRContains" - ), # For consistency w/PostGIS API - "bboverlaps": SpatialOperator(func="MBROverlaps"), # ... - "contained": SpatialOperator(func="MBRWithin"), # ... - "contains": SpatialOperator(func="ST_Contains"), - "crosses": SpatialOperator(func="ST_Crosses"), - "disjoint": SpatialOperator(func="ST_Disjoint"), - "equals": SpatialOperator(func="ST_Equals"), - "exact": SpatialOperator(func="ST_Equals"), - "intersects": SpatialOperator(func="ST_Intersects"), - "overlaps": SpatialOperator(func="ST_Overlaps"), - "same_as": SpatialOperator(func="ST_Equals"), - "touches": SpatialOperator(func="ST_Touches"), - "within": SpatialOperator(func="ST_Within"), - } - if self.connection.mysql_is_mariadb: - operators["relate"] = SpatialOperator(func="ST_Relate") - else: - operators["covers"] = SpatialOperator(func="MBRCovers") - operators["coveredby"] = SpatialOperator(func="MBRCoveredBy") - return operators - - @cached_property - def disallowed_aggregates(self): - disallowed_aggregates = [ - models.Extent, - models.Extent3D, - models.MakeLine, - models.Union, - ] - is_mariadb = self.connection.mysql_is_mariadb - if is_mariadb or self.connection.mysql_version < (8, 0, 24): - disallowed_aggregates.insert(0, models.Collect) - return tuple(disallowed_aggregates) - - function_names = { - "FromWKB": "ST_GeomFromWKB", - "FromWKT": "ST_GeomFromText", - } - - @cached_property - def unsupported_functions(self): - unsupported = { - "AsGML", - "AsKML", - "AsSVG", - "Azimuth", - "BoundingCircle", - "ClosestPoint", - "ForcePolygonCW", - "GeometryDistance", - "IsEmpty", - "LineLocatePoint", - "MakeValid", - "MemSize", - "Perimeter", - "PointOnSurface", - "Reverse", - "Scale", - "SnapToGrid", - "Transform", - "Translate", - } - if self.connection.mysql_is_mariadb: - unsupported.remove("PointOnSurface") - unsupported.update({"GeoHash", "IsValid"}) - return unsupported - - def geo_db_type(self, f): - return f.geom_type - - def get_distance(self, f, value, lookup_type): - value = value[0] - if isinstance(value, Distance): - if f.geodetic(self.connection): - raise ValueError( - "Only numeric values of degree units are allowed on " - "geodetic distance queries." - ) - dist_param = getattr( - value, Distance.unit_attname(f.units_name(self.connection)) - ) - else: - dist_param = value - return [dist_param] - - def get_geometry_converter(self, expression): - read = wkb_r().read - srid = expression.output_field.srid - if srid == -1: - srid = None - geom_class = expression.output_field.geom_class - - def converter(value, expression, connection): - if value is not None: - geom = GEOSGeometryBase(read(memoryview(value)), geom_class) - if srid: - geom.srid = srid - return geom - - return converter - - def spatial_aggregate_name(self, agg_name): - return getattr(self, agg_name.lower()) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/schema.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/schema.py deleted file mode 100644 index e485c67..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/mysql/schema.py +++ /dev/null @@ -1,112 +0,0 @@ -import logging - -from django.contrib.gis.db.models import GeometryField -from django.db import OperationalError -from django.db.backends.mysql.schema import DatabaseSchemaEditor - -logger = logging.getLogger("django.contrib.gis") - - -class MySQLGISSchemaEditor(DatabaseSchemaEditor): - sql_add_spatial_index = "CREATE SPATIAL INDEX %(index)s ON %(table)s(%(column)s)" - - def skip_default(self, field): - # Geometry fields are stored as BLOB/TEXT, for which MySQL < 8.0.13 - # doesn't support defaults. - if ( - isinstance(field, GeometryField) - and not self._supports_limited_data_type_defaults - ): - return True - return super().skip_default(field) - - def quote_value(self, value): - if isinstance(value, self.connection.ops.Adapter): - return super().quote_value(str(value)) - return super().quote_value(value) - - def _field_indexes_sql(self, model, field): - if isinstance(field, GeometryField) and field.spatial_index and not field.null: - with self.connection.cursor() as cursor: - supports_spatial_index = ( - self.connection.introspection.supports_spatial_index( - cursor, model._meta.db_table - ) - ) - sql = self._create_spatial_index_sql(model, field) - if supports_spatial_index: - return [sql] - else: - logger.error( - f"Cannot create SPATIAL INDEX {sql}. Only MyISAM, Aria, and InnoDB " - f"support them.", - ) - return [] - return super()._field_indexes_sql(model, field) - - def remove_field(self, model, field): - if isinstance(field, GeometryField) and field.spatial_index and not field.null: - sql = self._delete_spatial_index_sql(model, field) - try: - self.execute(sql) - except OperationalError: - logger.error( - "Couldn't remove spatial index: %s (may be expected " - "if your storage engine doesn't support them).", - sql, - ) - - super().remove_field(model, field) - - def _alter_field( - self, - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict=False, - ): - super()._alter_field( - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict=strict, - ) - - old_field_spatial_index = ( - isinstance(old_field, GeometryField) - and old_field.spatial_index - and not old_field.null - ) - new_field_spatial_index = ( - isinstance(new_field, GeometryField) - and new_field.spatial_index - and not new_field.null - ) - if not old_field_spatial_index and new_field_spatial_index: - self.execute(self._create_spatial_index_sql(model, new_field)) - elif old_field_spatial_index and not new_field_spatial_index: - self.execute(self._delete_spatial_index_sql(model, old_field)) - - def _create_spatial_index_name(self, model, field): - return "%s_%s_id" % (model._meta.db_table, field.column) - - def _create_spatial_index_sql(self, model, field): - index_name = self._create_spatial_index_name(model, field) - qn = self.connection.ops.quote_name - return self.sql_add_spatial_index % { - "index": qn(index_name), - "table": qn(model._meta.db_table), - "column": qn(field.column), - } - - def _delete_spatial_index_sql(self, model, field): - index_name = self._create_spatial_index_name(model, field) - return self._delete_index_sql(model, index_name) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/adapter.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/adapter.py deleted file mode 100644 index 0bf1164..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/adapter.py +++ /dev/null @@ -1,61 +0,0 @@ -from django.contrib.gis.db.backends.base.adapter import WKTAdapter -from django.contrib.gis.geos import GeometryCollection, Polygon -from django.db.backends.oracle.oracledb_any import oracledb - - -class OracleSpatialAdapter(WKTAdapter): - input_size = oracledb.CLOB - - def __init__(self, geom): - """ - Oracle requires that polygon rings are in proper orientation. This - affects spatial operations and an invalid orientation may cause - failures. Correct orientations are: - * Outer ring - counter clockwise - * Inner ring(s) - clockwise - """ - if isinstance(geom, Polygon): - if self._polygon_must_be_fixed(geom): - geom = self._fix_polygon(geom) - elif isinstance(geom, GeometryCollection): - if any( - isinstance(g, Polygon) and self._polygon_must_be_fixed(g) for g in geom - ): - geom = self._fix_geometry_collection(geom) - - self.wkt = geom.wkt - self.srid = geom.srid - - @staticmethod - def _polygon_must_be_fixed(poly): - return not poly.empty and ( - not poly.exterior_ring.is_counterclockwise - or any(x.is_counterclockwise for x in poly) - ) - - @classmethod - def _fix_polygon(cls, poly, clone=True): - """Fix single polygon orientation as described in __init__().""" - if clone: - poly = poly.clone() - - if not poly.exterior_ring.is_counterclockwise: - poly.exterior_ring = list(reversed(poly.exterior_ring)) - - for i in range(1, len(poly)): - if poly[i].is_counterclockwise: - poly[i] = list(reversed(poly[i])) - - return poly - - @classmethod - def _fix_geometry_collection(cls, coll): - """ - Fix polygon orientations in geometry collections as described in - __init__(). - """ - coll = coll.clone() - for i, geom in enumerate(coll): - if isinstance(geom, Polygon): - coll[i] = cls._fix_polygon(geom, clone=False) - return coll diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/base.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/base.py deleted file mode 100644 index d43516a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/base.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db.backends.oracle.base import DatabaseWrapper as OracleDatabaseWrapper - -from .features import DatabaseFeatures -from .introspection import OracleIntrospection -from .operations import OracleOperations -from .schema import OracleGISSchemaEditor - - -class DatabaseWrapper(OracleDatabaseWrapper): - SchemaEditorClass = OracleGISSchemaEditor - # Classes instantiated in __init__(). - features_class = DatabaseFeatures - introspection_class = OracleIntrospection - ops_class = OracleOperations diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/features.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/features.py deleted file mode 100644 index f346d93..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/features.py +++ /dev/null @@ -1,28 +0,0 @@ -from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures -from django.db.backends.oracle.features import ( - DatabaseFeatures as OracleDatabaseFeatures, -) -from django.utils.functional import cached_property - - -class DatabaseFeatures(BaseSpatialFeatures, OracleDatabaseFeatures): - supports_add_srs_entry = False - supports_geometry_field_introspection = False - supports_geometry_field_unique_index = False - supports_perimeter_geodetic = True - supports_dwithin_distance_expr = False - supports_tolerance_parameter = True - unsupported_geojson_options = {"bbox", "crs", "precision"} - - @cached_property - def django_test_skips(self): - skips = super().django_test_skips - skips.update( - { - "Oracle doesn't support spatial operators in constraints.": { - "gis_tests.gis_migrations.test_operations.OperationTests." - "test_add_check_constraint", - }, - } - ) - return skips diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/introspection.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/introspection.py deleted file mode 100644 index bf299b1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/introspection.py +++ /dev/null @@ -1,46 +0,0 @@ -from django.db.backends.oracle.introspection import DatabaseIntrospection -from django.db.backends.oracle.oracledb_any import oracledb -from django.utils.functional import cached_property - - -class OracleIntrospection(DatabaseIntrospection): - # Associating any OBJECTVAR instances with GeometryField. This won't work - # right on Oracle objects that aren't MDSYS.SDO_GEOMETRY, but it is the - # only object type supported within Django anyways. - @cached_property - def data_types_reverse(self): - return { - **super().data_types_reverse, - oracledb.DB_TYPE_OBJECT: "GeometryField", - } - - def get_geometry_type(self, table_name, description): - with self.connection.cursor() as cursor: - # Querying USER_SDO_GEOM_METADATA to get the SRID and dimension information. - try: - cursor.execute( - 'SELECT "DIMINFO", "SRID" FROM "USER_SDO_GEOM_METADATA" ' - 'WHERE "TABLE_NAME"=%s AND "COLUMN_NAME"=%s', - (table_name.upper(), description.name.upper()), - ) - row = cursor.fetchone() - except Exception as exc: - raise Exception( - "Could not find entry in USER_SDO_GEOM_METADATA " - 'corresponding to "%s"."%s"' % (table_name, description.name) - ) from exc - - # TODO: Research way to find a more specific geometry field type for - # the column's contents. - field_type = "GeometryField" - - # Getting the field parameters. - field_params = {} - dim, srid = row - if srid != 4326: - field_params["srid"] = srid - # Size of object array (SDO_DIM_ARRAY) is number of dimensions. - dim = dim.size() - if dim != 2: - field_params["dim"] = dim - return field_type, field_params diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/models.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/models.py deleted file mode 100644 index 7a69fbc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/models.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -The GeometryColumns and SpatialRefSys models for the Oracle spatial -backend. - -It should be noted that Oracle Spatial does not have database tables -named according to the OGC standard, so the closest analogs are used. -For example, the `USER_SDO_GEOM_METADATA` is used for the GeometryColumns -model and the `SDO_COORD_REF_SYS` is used for the SpatialRefSys model. -""" - -from django.contrib.gis.db import models -from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin - - -class OracleGeometryColumns(models.Model): - "Maps to the Oracle USER_SDO_GEOM_METADATA table." - - table_name = models.CharField(max_length=32) - column_name = models.CharField(max_length=1024) - srid = models.IntegerField(primary_key=True) - # TODO: Add support for `diminfo` column (type MDSYS.SDO_DIM_ARRAY). - - class Meta: - app_label = "gis" - db_table = "USER_SDO_GEOM_METADATA" - managed = False - - def __str__(self): - return "%s - %s (SRID: %s)" % (self.table_name, self.column_name, self.srid) - - @classmethod - def table_name_col(cls): - """ - Return the name of the metadata column used to store the feature table - name. - """ - return "table_name" - - @classmethod - def geom_col_name(cls): - """ - Return the name of the metadata column used to store the feature - geometry column. - """ - return "column_name" - - -class OracleSpatialRefSys(models.Model, SpatialRefSysMixin): - "Maps to the Oracle MDSYS.CS_SRS table." - - cs_name = models.CharField(max_length=68) - srid = models.IntegerField(primary_key=True) - auth_srid = models.IntegerField() - auth_name = models.CharField(max_length=256) - wktext = models.CharField(max_length=2046) - # Optional geometry representing the bounds of this coordinate - # system. By default, all are NULL in the table. - cs_bounds = models.PolygonField(null=True) - - class Meta: - app_label = "gis" - db_table = "CS_SRS" - managed = False - - @property - def wkt(self): - return self.wktext diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/operations.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/operations.py deleted file mode 100644 index 1be7668..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/operations.py +++ /dev/null @@ -1,247 +0,0 @@ -""" -This module contains the spatial lookup types, and the `get_geo_where_clause` -routine for Oracle Spatial. - -Please note that WKT support is broken on the XE version, and thus -this backend will not work on such platforms. Specifically, XE lacks -support for an internal JVM, and Java libraries are required to use -the WKT constructors. -""" - -import re - -from django.contrib.gis.db import models -from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations -from django.contrib.gis.db.backends.oracle.adapter import OracleSpatialAdapter -from django.contrib.gis.db.backends.utils import SpatialOperator -from django.contrib.gis.geos.geometry import GEOSGeometry, GEOSGeometryBase -from django.contrib.gis.geos.prototypes.io import wkb_r -from django.contrib.gis.measure import Distance -from django.db.backends.oracle.operations import DatabaseOperations - -DEFAULT_TOLERANCE = "0.05" - - -class SDOOperator(SpatialOperator): - sql_template = "%(func)s(%(lhs)s, %(rhs)s) = 'TRUE'" - - -class SDODWithin(SpatialOperator): - sql_template = "SDO_WITHIN_DISTANCE(%(lhs)s, %(rhs)s, %%s) = 'TRUE'" - - -class SDODisjoint(SpatialOperator): - sql_template = ( - "SDO_GEOM.RELATE(%%(lhs)s, 'DISJOINT', %%(rhs)s, %s) = 'DISJOINT'" - % DEFAULT_TOLERANCE - ) - - -class SDORelate(SpatialOperator): - sql_template = "SDO_RELATE(%(lhs)s, %(rhs)s, 'mask=%(mask)s') = 'TRUE'" - - def check_relate_argument(self, arg): - masks = ( - "TOUCH|OVERLAPBDYDISJOINT|OVERLAPBDYINTERSECT|EQUAL|INSIDE|COVEREDBY|" - "CONTAINS|COVERS|ANYINTERACT|ON" - ) - mask_regex = re.compile(r"^(%s)(\+(%s))*$" % (masks, masks), re.I) - if not isinstance(arg, str) or not mask_regex.match(arg): - raise ValueError('Invalid SDO_RELATE mask: "%s"' % arg) - - def as_sql(self, connection, lookup, template_params, sql_params): - template_params["mask"] = sql_params[-1] - return super().as_sql(connection, lookup, template_params, sql_params[:-1]) - - -class OracleOperations(BaseSpatialOperations, DatabaseOperations): - name = "oracle" - oracle = True - disallowed_aggregates = (models.Collect, models.Extent3D, models.MakeLine) - - Adapter = OracleSpatialAdapter - - extent = "SDO_AGGR_MBR" - unionagg = "SDO_AGGR_UNION" - - from_text = "SDO_GEOMETRY" - - function_names = { - "Area": "SDO_GEOM.SDO_AREA", - "AsGeoJSON": "SDO_UTIL.TO_GEOJSON", - "AsWKB": "SDO_UTIL.TO_WKBGEOMETRY", - "AsWKT": "SDO_UTIL.TO_WKTGEOMETRY", - "BoundingCircle": "SDO_GEOM.SDO_MBC", - "Centroid": "SDO_GEOM.SDO_CENTROID", - "Difference": "SDO_GEOM.SDO_DIFFERENCE", - "Distance": "SDO_GEOM.SDO_DISTANCE", - "Envelope": "SDO_GEOM_MBR", - "FromWKB": "SDO_UTIL.FROM_WKBGEOMETRY", - "FromWKT": "SDO_UTIL.FROM_WKTGEOMETRY", - "Intersection": "SDO_GEOM.SDO_INTERSECTION", - "IsValid": "SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT", - "Length": "SDO_GEOM.SDO_LENGTH", - "NumGeometries": "SDO_UTIL.GETNUMELEM", - "NumPoints": "SDO_UTIL.GETNUMVERTICES", - "Perimeter": "SDO_GEOM.SDO_LENGTH", - "PointOnSurface": "SDO_GEOM.SDO_POINTONSURFACE", - "Reverse": "SDO_UTIL.REVERSE_LINESTRING", - "SymDifference": "SDO_GEOM.SDO_XOR", - "Transform": "SDO_CS.TRANSFORM", - "Union": "SDO_GEOM.SDO_UNION", - } - - # We want to get SDO Geometries as WKT because it is much easier to - # instantiate GEOS proxies from WKT than SDO_GEOMETRY(...) strings. - # However, this adversely affects performance (i.e., Java is called - # to convert to WKT on every query). If someone wishes to write a - # SDO_GEOMETRY(...) parser in Python, let me know =) - select = "SDO_UTIL.TO_WKBGEOMETRY(%s)" - - gis_operators = { - "contains": SDOOperator(func="SDO_CONTAINS"), - "coveredby": SDOOperator(func="SDO_COVEREDBY"), - "covers": SDOOperator(func="SDO_COVERS"), - "disjoint": SDODisjoint(), - "intersects": SDOOperator( - func="SDO_OVERLAPBDYINTERSECT" - ), # TODO: Is this really the same as ST_Intersects()? - "equals": SDOOperator(func="SDO_EQUAL"), - "exact": SDOOperator(func="SDO_EQUAL"), - "overlaps": SDOOperator(func="SDO_OVERLAPS"), - "same_as": SDOOperator(func="SDO_EQUAL"), - # Oracle uses a different syntax, e.g., 'mask=inside+touch' - "relate": SDORelate(), - "touches": SDOOperator(func="SDO_TOUCH"), - "within": SDOOperator(func="SDO_INSIDE"), - "dwithin": SDODWithin(), - } - - unsupported_functions = { - "AsKML", - "AsSVG", - "Azimuth", - "ClosestPoint", - "ForcePolygonCW", - "GeoHash", - "GeometryDistance", - "IsEmpty", - "LineLocatePoint", - "MakeValid", - "MemSize", - "Scale", - "SnapToGrid", - "Translate", - } - - def geo_quote_name(self, name): - return super().geo_quote_name(name).upper() - - def convert_extent(self, clob): - if clob: - # Generally, Oracle returns a polygon for the extent -- however, - # it can return a single point if there's only one Point in the - # table. - ext_geom = GEOSGeometry(memoryview(clob.read())) - gtype = str(ext_geom.geom_type) - if gtype == "Polygon": - # Construct the 4-tuple from the coordinates in the polygon. - shell = ext_geom.shell - ll, ur = shell[0][:2], shell[2][:2] - elif gtype == "Point": - ll = ext_geom.coords[:2] - ur = ll - else: - raise Exception( - "Unexpected geometry type returned for extent: %s" % gtype - ) - xmin, ymin = ll - xmax, ymax = ur - return (xmin, ymin, xmax, ymax) - else: - return None - - def geo_db_type(self, f): - """ - Return the geometry database type for Oracle. Unlike other spatial - backends, no stored procedure is necessary and it's the same for all - geometry types. - """ - return "MDSYS.SDO_GEOMETRY" - - def get_distance(self, f, value, lookup_type): - """ - Return the distance parameters given the value and the lookup type. - On Oracle, geometry columns with a geodetic coordinate system behave - implicitly like a geography column, and thus meters will be used as - the distance parameter on them. - """ - if not value: - return [] - value = value[0] - if isinstance(value, Distance): - if f.geodetic(self.connection): - dist_param = value.m - else: - dist_param = getattr( - value, Distance.unit_attname(f.units_name(self.connection)) - ) - else: - dist_param = value - - # dwithin lookups on Oracle require a special string parameter - # that starts with "distance=". - if lookup_type == "dwithin": - dist_param = "distance=%s" % dist_param - - return [dist_param] - - def get_geom_placeholder(self, f, value, compiler): - if value is None: - return "NULL" - return super().get_geom_placeholder(f, value, compiler) - - def spatial_aggregate_name(self, agg_name): - """ - Return the spatial aggregate SQL name. - """ - agg_name = "unionagg" if agg_name.lower() == "union" else agg_name.lower() - return getattr(self, agg_name) - - # Routines for getting the OGC-compliant models. - def geometry_columns(self): - from django.contrib.gis.db.backends.oracle.models import OracleGeometryColumns - - return OracleGeometryColumns - - def spatial_ref_sys(self): - from django.contrib.gis.db.backends.oracle.models import OracleSpatialRefSys - - return OracleSpatialRefSys - - def modify_insert_params(self, placeholder, params): - """Drop out insert parameters for NULL placeholder. Needed for Oracle Spatial - backend due to #10888. - """ - if placeholder == "NULL": - return [] - return super().modify_insert_params(placeholder, params) - - def get_geometry_converter(self, expression): - read = wkb_r().read - srid = expression.output_field.srid - if srid == -1: - srid = None - geom_class = expression.output_field.geom_class - - def converter(value, expression, connection): - if value is not None: - geom = GEOSGeometryBase(read(memoryview(value.read())), geom_class) - if srid: - geom.srid = srid - return geom - - return converter - - def get_area_att_for_field(self, field): - return "sq_m" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/schema.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/schema.py deleted file mode 100644 index ce03ee8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/oracle/schema.py +++ /dev/null @@ -1,151 +0,0 @@ -from django.contrib.gis.db.models import GeometryField -from django.db.backends.oracle.schema import DatabaseSchemaEditor -from django.db.backends.utils import strip_quotes, truncate_name - - -class OracleGISSchemaEditor(DatabaseSchemaEditor): - sql_add_geometry_metadata = """ - INSERT INTO USER_SDO_GEOM_METADATA - ("TABLE_NAME", "COLUMN_NAME", "DIMINFO", "SRID") - VALUES ( - %(table)s, - %(column)s, - MDSYS.SDO_DIM_ARRAY( - MDSYS.SDO_DIM_ELEMENT('LONG', %(dim0)s, %(dim2)s, %(tolerance)s), - MDSYS.SDO_DIM_ELEMENT('LAT', %(dim1)s, %(dim3)s, %(tolerance)s) - ), - %(srid)s - )""" - sql_add_spatial_index = ( - "CREATE INDEX %(index)s ON %(table)s(%(column)s) " - "INDEXTYPE IS MDSYS.SPATIAL_INDEX" - ) - sql_clear_geometry_table_metadata = ( - "DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = %(table)s" - ) - sql_clear_geometry_field_metadata = ( - "DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = %(table)s " - "AND COLUMN_NAME = %(column)s" - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.geometry_sql = [] - - def geo_quote_name(self, name): - return self.connection.ops.geo_quote_name(name) - - def quote_value(self, value): - if isinstance(value, self.connection.ops.Adapter): - return super().quote_value(str(value)) - return super().quote_value(value) - - def _field_indexes_sql(self, model, field): - if isinstance(field, GeometryField) and field.spatial_index: - return [self._create_spatial_index_sql(model, field)] - return super()._field_indexes_sql(model, field) - - def column_sql(self, model, field, include_default=False): - column_sql = super().column_sql(model, field, include_default) - if isinstance(field, GeometryField): - self.geometry_sql.append( - self.sql_add_geometry_metadata - % { - "table": self.geo_quote_name(model._meta.db_table), - "column": self.geo_quote_name(field.column), - "dim0": field._extent[0], - "dim1": field._extent[1], - "dim2": field._extent[2], - "dim3": field._extent[3], - "tolerance": field._tolerance, - "srid": field.srid, - } - ) - return column_sql - - def create_model(self, model): - super().create_model(model) - self.run_geometry_sql() - - def delete_model(self, model): - super().delete_model(model) - self.execute( - self.sql_clear_geometry_table_metadata - % { - "table": self.geo_quote_name(model._meta.db_table), - } - ) - - def add_field(self, model, field): - super().add_field(model, field) - self.run_geometry_sql() - - def remove_field(self, model, field): - if isinstance(field, GeometryField): - self.execute( - self.sql_clear_geometry_field_metadata - % { - "table": self.geo_quote_name(model._meta.db_table), - "column": self.geo_quote_name(field.column), - } - ) - if field.spatial_index: - self.execute(self._delete_spatial_index_sql(model, field)) - super().remove_field(model, field) - - def run_geometry_sql(self): - for sql in self.geometry_sql: - self.execute(sql) - self.geometry_sql = [] - - def _alter_field( - self, - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict=False, - ): - super()._alter_field( - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict=strict, - ) - - old_field_spatial_index = ( - isinstance(old_field, GeometryField) and old_field.spatial_index - ) - new_field_spatial_index = ( - isinstance(new_field, GeometryField) and new_field.spatial_index - ) - if not old_field_spatial_index and new_field_spatial_index: - self.execute(self._create_spatial_index_sql(model, new_field)) - elif old_field_spatial_index and not new_field_spatial_index: - self.execute(self._delete_spatial_index_sql(model, old_field)) - - def _create_spatial_index_name(self, model, field): - # Oracle doesn't allow object names > 30 characters. Use this scheme - # instead of self._create_index_name() for backwards compatibility. - return truncate_name( - "%s_%s_id" % (strip_quotes(model._meta.db_table), field.column), 30 - ) - - def _create_spatial_index_sql(self, model, field): - index_name = self._create_spatial_index_name(model, field) - return self.sql_add_spatial_index % { - "index": self.quote_name(index_name), - "table": self.quote_name(model._meta.db_table), - "column": self.quote_name(field.column), - } - - def _delete_spatial_index_sql(self, model, field): - index_name = self._create_spatial_index_name(model, field) - return self._delete_index_sql(model, index_name) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/adapter.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/adapter.py deleted file mode 100644 index 581fc23..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/adapter.py +++ /dev/null @@ -1,63 +0,0 @@ -""" -This object provides quoting for GEOS geometries into PostgreSQL/PostGIS. -""" - -from django.contrib.gis.db.backends.postgis.pgraster import to_pgraster -from django.contrib.gis.geos import GEOSGeometry -from django.db.backends.postgresql.psycopg_any import sql - - -class PostGISAdapter: - def __init__(self, obj, geography=False): - """ - Initialize on the spatial object. - """ - self.is_geometry = isinstance(obj, (GEOSGeometry, PostGISAdapter)) - - # Getting the WKB (in string form, to allow easy pickling of - # the adaptor) and the SRID from the geometry or raster. - if self.is_geometry: - self.ewkb = bytes(obj.ewkb) - else: - self.ewkb = to_pgraster(obj) - - self.srid = obj.srid - self.geography = geography - - def __conform__(self, proto): - """Does the given protocol conform to what Psycopg2 expects?""" - from psycopg2.extensions import ISQLQuote - - if proto == ISQLQuote: - return self - else: - raise Exception( - "Error implementing psycopg2 protocol. Is psycopg2 installed?" - ) - - def __eq__(self, other): - return isinstance(other, PostGISAdapter) and self.ewkb == other.ewkb - - def __hash__(self): - return hash(self.ewkb) - - def __str__(self): - return self.getquoted().decode() - - @classmethod - def _fix_polygon(cls, poly): - return poly - - def getquoted(self): - """ - Return a properly quoted string for use in PostgreSQL/PostGIS. - """ - if self.is_geometry: - # Psycopg will figure out whether to use E'\\000' or '\000'. - return b"%s(%s)" % ( - b"ST_GeogFromWKB" if self.geography else b"ST_GeomFromEWKB", - sql.quote(self.ewkb).encode(), - ) - else: - # For rasters, add explicit type cast to WKB string. - return b"'%s'::raster" % self.ewkb.hex().encode() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/base.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/base.py deleted file mode 100644 index 8360c0e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/base.py +++ /dev/null @@ -1,161 +0,0 @@ -from functools import lru_cache - -from django.db.backends.base.base import NO_DB_ALIAS -from django.db.backends.postgresql.base import DatabaseWrapper as PsycopgDatabaseWrapper -from django.db.backends.postgresql.features import ( - DatabaseFeatures as PsycopgDatabaseFeatures, -) -from django.db.backends.postgresql.introspection import ( - DatabaseIntrospection as PsycopgDatabaseIntrospection, -) -from django.db.backends.postgresql.operations import ( - DatabaseOperations as PsycopgDatabaseOperations, -) -from django.db.backends.postgresql.psycopg_any import is_psycopg3 - -from .adapter import PostGISAdapter -from .features import DatabaseFeatures -from .introspection import PostGISIntrospection -from .operations import PostGISOperations -from .schema import PostGISSchemaEditor - -if is_psycopg3: - from psycopg.adapt import Dumper - from psycopg.pq import Format - from psycopg.types import TypeInfo - from psycopg.types.string import TextBinaryLoader, TextLoader - - class GeometryType: - pass - - class GeographyType: - pass - - class RasterType: - pass - - class BaseTextDumper(Dumper): - def dump(self, obj): - # Return bytes as hex for text formatting - return obj.ewkb.hex().encode() - - class BaseBinaryDumper(Dumper): - format = Format.BINARY - - def dump(self, obj): - return obj.ewkb - - @lru_cache - def postgis_adapters(geo_oid, geog_oid, raster_oid): - class BaseDumper(Dumper): - def __init_subclass__(cls, base_dumper): - super().__init_subclass__() - - cls.GeometryDumper = type( - "GeometryDumper", (base_dumper,), {"oid": geo_oid} - ) - cls.GeographyDumper = type( - "GeographyDumper", (base_dumper,), {"oid": geog_oid} - ) - cls.RasterDumper = type( - "RasterDumper", (BaseTextDumper,), {"oid": raster_oid} - ) - - def get_key(self, obj, format): - if obj.is_geometry: - return GeographyType if obj.geography else GeometryType - else: - return RasterType - - def upgrade(self, obj, format): - if obj.is_geometry: - if obj.geography: - return self.GeographyDumper(GeographyType) - else: - return self.GeometryDumper(GeometryType) - else: - return self.RasterDumper(RasterType) - - def dump(self, obj): - raise NotImplementedError - - class PostGISTextDumper(BaseDumper, base_dumper=BaseTextDumper): - pass - - class PostGISBinaryDumper(BaseDumper, base_dumper=BaseBinaryDumper): - format = Format.BINARY - - return PostGISTextDumper, PostGISBinaryDumper - - -class DatabaseWrapper(PsycopgDatabaseWrapper): - SchemaEditorClass = PostGISSchemaEditor - features_class = DatabaseFeatures - ops_class = PostGISOperations - introspection_class = PostGISIntrospection - - _type_infos = { - "geometry": {}, - "geography": {}, - "raster": {}, - } - - def __init__(self, *args, **kwargs): - if kwargs.get("alias", "") == NO_DB_ALIAS: - # Don't initialize PostGIS-specific stuff for non-db connections. - self.features_class = PsycopgDatabaseFeatures - self.ops_class = PsycopgDatabaseOperations - self.introspection_class = PsycopgDatabaseIntrospection - - super().__init__(*args, **kwargs) - - def prepare_database(self): - super().prepare_database() - # Check that postgis extension is installed. - with self.cursor() as cursor: - cursor.execute("SELECT 1 FROM pg_extension WHERE extname = %s", ["postgis"]) - if bool(cursor.fetchone()): - return - cursor.execute("CREATE EXTENSION IF NOT EXISTS postgis") - if is_psycopg3: - # Ensure adapters are registers if PostGIS is used within this - # connection. - self.register_geometry_adapters(self.connection, True) - - def get_new_connection(self, conn_params): - connection = super().get_new_connection(conn_params) - if is_psycopg3: - self.register_geometry_adapters(connection) - return connection - - if is_psycopg3: - - def _register_type(self, pg_connection, typename): - registry = self._type_infos[typename] - try: - info = registry[self.alias] - except KeyError: - info = TypeInfo.fetch(pg_connection, typename) - registry[self.alias] = info - - if info: # Can be None if the type does not exist (yet). - info.register(pg_connection) - pg_connection.adapters.register_loader(info.oid, TextLoader) - pg_connection.adapters.register_loader(info.oid, TextBinaryLoader) - - return info.oid if info else None - - def register_geometry_adapters(self, pg_connection, clear_caches=False): - if clear_caches: - for typename in self._type_infos: - self._type_infos[typename].pop(self.alias, None) - - geo_oid = self._register_type(pg_connection, "geometry") - geog_oid = self._register_type(pg_connection, "geography") - raster_oid = self._register_type(pg_connection, "raster") - - PostGISTextDumper, PostGISBinaryDumper = postgis_adapters( - geo_oid, geog_oid, raster_oid - ) - pg_connection.adapters.register_dumper(PostGISAdapter, PostGISTextDumper) - pg_connection.adapters.register_dumper(PostGISAdapter, PostGISBinaryDumper) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/const.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/const.py deleted file mode 100644 index 8bc16a1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/const.py +++ /dev/null @@ -1,63 +0,0 @@ -""" -PostGIS to GDAL conversion constant definitions -""" - -# Lookup to convert pixel type values from GDAL to PostGIS -GDAL_TO_POSTGIS = [None, 4, 6, 5, 8, 7, 10, 11, None, None, None, None] - -# Lookup to convert pixel type values from PostGIS to GDAL -POSTGIS_TO_GDAL = [1, 1, 1, 3, 1, 3, 2, 5, 4, None, 6, 7, None, None] - -# Struct pack structure for raster header, the raster header has the -# following structure: -# -# Endianness, PostGIS raster version, number of bands, scale, origin, -# skew, srid, width, and height. -# -# Scale, origin, and skew have x and y values. PostGIS currently uses -# a fixed endianness (1) and there is only one version (0). -POSTGIS_HEADER_STRUCTURE = "B H H d d d d d d i H H" - -# Lookup values to convert GDAL pixel types to struct characters. This is -# used to pack and unpack the pixel values of PostGIS raster bands. -GDAL_TO_STRUCT = [ - None, - "B", - "H", - "h", - "L", - "l", - "f", - "d", - None, - None, - None, - None, -] - -# Size of the packed value in bytes for different numerical types. -# This is needed to cut chunks of band data out of PostGIS raster strings -# when decomposing them into GDALRasters. -# See https://docs.python.org/library/struct.html#format-characters -STRUCT_SIZE = { - "b": 1, # Signed char - "B": 1, # Unsigned char - "?": 1, # _Bool - "h": 2, # Short - "H": 2, # Unsigned short - "i": 4, # Integer - "I": 4, # Unsigned Integer - "l": 4, # Long - "L": 4, # Unsigned Long - "f": 4, # Float - "d": 8, # Double -} - -# Pixel type specifies type of pixel values in a band. Storage flag specifies -# whether the band data is stored as part of the datum or is to be found on the -# server's filesystem. There are currently 11 supported pixel value types, so 4 -# bits are enough to account for all. Reserve the upper 4 bits for generic -# flags. See -# https://trac.osgeo.org/postgis/wiki/WKTRaster/RFC/RFC1_V0SerialFormat#Pixeltypeandstorageflag -BANDTYPE_PIXTYPE_MASK = 0x0F -BANDTYPE_FLAG_HASNODATA = 1 << 6 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/features.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/features.py deleted file mode 100644 index d96e939..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/features.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures -from django.db.backends.postgresql.features import ( - DatabaseFeatures as PsycopgDatabaseFeatures, -) - - -class DatabaseFeatures(BaseSpatialFeatures, PsycopgDatabaseFeatures): - supports_geography = True - supports_3d_storage = True - supports_3d_functions = True - supports_raster = True - supports_empty_geometries = True - empty_intersection_returns_none = False diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/introspection.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/introspection.py deleted file mode 100644 index 766c0fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/introspection.py +++ /dev/null @@ -1,71 +0,0 @@ -from django.contrib.gis.gdal import OGRGeomType -from django.db.backends.postgresql.introspection import DatabaseIntrospection - - -class PostGISIntrospection(DatabaseIntrospection): - postgis_oid_lookup = {} # Populated when introspection is performed. - - ignored_tables = DatabaseIntrospection.ignored_tables + [ - "geography_columns", - "geometry_columns", - "raster_columns", - "spatial_ref_sys", - "raster_overviews", - ] - - def get_field_type(self, data_type, description): - if not self.postgis_oid_lookup: - # Query PostgreSQL's pg_type table to determine the OID integers - # for the PostGIS data types used in reverse lookup (the integers - # may be different across versions). To prevent unnecessary - # requests upon connection initialization, the `data_types_reverse` - # dictionary isn't updated until introspection is performed here. - with self.connection.cursor() as cursor: - cursor.execute( - "SELECT oid, typname " - "FROM pg_type " - "WHERE typname IN ('geometry', 'geography')" - ) - self.postgis_oid_lookup = dict(cursor.fetchall()) - self.data_types_reverse.update( - (oid, "GeometryField") for oid in self.postgis_oid_lookup - ) - return super().get_field_type(data_type, description) - - def get_geometry_type(self, table_name, description): - """ - The geometry type OID used by PostGIS does not indicate the particular - type of field that a geometry column is (e.g., whether it's a - PointField or a PolygonField). Thus, this routine queries the PostGIS - metadata tables to determine the geometry type. - """ - with self.connection.cursor() as cursor: - cursor.execute( - """ - SELECT t.coord_dimension, t.srid, t.type FROM ( - SELECT * FROM geometry_columns - UNION ALL - SELECT * FROM geography_columns - ) AS t WHERE t.f_table_name = %s AND t.f_geometry_column = %s - """, - (table_name, description.name), - ) - row = cursor.fetchone() - if not row: - raise Exception( - 'Could not find a geometry or geography column for "%s"."%s"' - % (table_name, description.name) - ) - dim, srid, field_type = row - # OGRGeomType does not require GDAL and makes it easy to convert - # from OGC geom type name to Django field. - field_type = OGRGeomType(field_type).django - # Getting any GeometryField keyword arguments that are not the default. - field_params = {} - if self.postgis_oid_lookup.get(description.type_code) == "geography": - field_params["geography"] = True - if srid != 4326: - field_params["srid"] = srid - if dim != 2: - field_params["dim"] = dim - return field_type, field_params diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/models.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/models.py deleted file mode 100644 index c3747d7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/models.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -The GeometryColumns and SpatialRefSys models for the PostGIS backend. -""" - -from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin -from django.db import models - - -class PostGISGeometryColumns(models.Model): - """ - The 'geometry_columns' view from PostGIS. See the PostGIS - documentation at Ch. 4.3.2. - """ - - f_table_catalog = models.CharField(max_length=256) - f_table_schema = models.CharField(max_length=256) - f_table_name = models.CharField(max_length=256) - f_geometry_column = models.CharField(max_length=256) - coord_dimension = models.IntegerField() - srid = models.IntegerField(primary_key=True) - type = models.CharField(max_length=30) - - class Meta: - app_label = "gis" - db_table = "geometry_columns" - managed = False - - def __str__(self): - return "%s.%s - %dD %s field (SRID: %d)" % ( - self.f_table_name, - self.f_geometry_column, - self.coord_dimension, - self.type, - self.srid, - ) - - @classmethod - def table_name_col(cls): - """ - Return the name of the metadata column used to store the feature table - name. - """ - return "f_table_name" - - @classmethod - def geom_col_name(cls): - """ - Return the name of the metadata column used to store the feature - geometry column. - """ - return "f_geometry_column" - - -class PostGISSpatialRefSys(models.Model, SpatialRefSysMixin): - """ - The 'spatial_ref_sys' table from PostGIS. See the PostGIS - documentation at Ch. 4.2.1. - """ - - srid = models.IntegerField(primary_key=True) - auth_name = models.CharField(max_length=256) - auth_srid = models.IntegerField() - srtext = models.CharField(max_length=2048) - proj4text = models.CharField(max_length=2048) - - class Meta: - app_label = "gis" - db_table = "spatial_ref_sys" - managed = False - - @property - def wkt(self): - return self.srtext diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/operations.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/operations.py deleted file mode 100644 index 7a347c5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/operations.py +++ /dev/null @@ -1,423 +0,0 @@ -import re - -from django.conf import settings -from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations -from django.contrib.gis.db.backends.utils import SpatialOperator -from django.contrib.gis.db.models import GeometryField, RasterField -from django.contrib.gis.gdal import GDALRaster -from django.contrib.gis.geos.geometry import GEOSGeometryBase -from django.contrib.gis.geos.prototypes.io import wkb_r -from django.contrib.gis.measure import Distance -from django.core.exceptions import ImproperlyConfigured -from django.db import NotSupportedError, ProgrammingError -from django.db.backends.postgresql.operations import DatabaseOperations -from django.db.backends.postgresql.psycopg_any import is_psycopg3 -from django.db.models import Func, Value -from django.utils.functional import cached_property -from django.utils.version import get_version_tuple - -from .adapter import PostGISAdapter -from .models import PostGISGeometryColumns, PostGISSpatialRefSys -from .pgraster import from_pgraster - -# Identifier to mark raster lookups as bilateral. -BILATERAL = "bilateral" - - -class PostGISOperator(SpatialOperator): - def __init__(self, geography=False, raster=False, **kwargs): - # Only a subset of the operators and functions are available for the - # geography type. Lookups that don't support geography will be cast to - # geometry. - self.geography = geography - # Only a subset of the operators and functions are available for the - # raster type. Lookups that don't support raster will be converted to - # polygons. If the raster argument is set to BILATERAL, then the - # operator cannot handle mixed geom-raster lookups. - self.raster = raster - super().__init__(**kwargs) - - def as_sql(self, connection, lookup, template_params, *args): - template_params = self.check_raster(lookup, template_params) - template_params = self.check_geography(lookup, template_params) - return super().as_sql(connection, lookup, template_params, *args) - - def check_raster(self, lookup, template_params): - spheroid = lookup.rhs_params and lookup.rhs_params[-1] == "spheroid" - - # Check which input is a raster. - lhs_is_raster = lookup.lhs.field.geom_type == "RASTER" - rhs_is_raster = isinstance(lookup.rhs, GDALRaster) - - # Look for band indices and inject them if provided. - if lookup.band_lhs is not None and lhs_is_raster: - if not self.func: - raise ValueError( - "Band indices are not allowed for this operator, it works on bbox " - "only." - ) - template_params["lhs"] = "%s, %s" % ( - template_params["lhs"], - lookup.band_lhs, - ) - - if lookup.band_rhs is not None and rhs_is_raster: - if not self.func: - raise ValueError( - "Band indices are not allowed for this operator, it works on bbox " - "only." - ) - template_params["rhs"] = "%s, %s" % ( - template_params["rhs"], - lookup.band_rhs, - ) - - # Convert rasters to polygons if necessary. - if not self.raster or spheroid: - # Operators without raster support. - if lhs_is_raster: - template_params["lhs"] = "ST_Polygon(%s)" % template_params["lhs"] - if rhs_is_raster: - template_params["rhs"] = "ST_Polygon(%s)" % template_params["rhs"] - elif self.raster == BILATERAL: - # Operators with raster support but don't support mixed (rast-geom) - # lookups. - if lhs_is_raster and not rhs_is_raster: - template_params["lhs"] = "ST_Polygon(%s)" % template_params["lhs"] - elif rhs_is_raster and not lhs_is_raster: - template_params["rhs"] = "ST_Polygon(%s)" % template_params["rhs"] - - return template_params - - def check_geography(self, lookup, template_params): - """Convert geography fields to geometry types, if necessary.""" - if lookup.lhs.output_field.geography and not self.geography: - template_params["lhs"] += "::geometry" - return template_params - - -class ST_Polygon(Func): - function = "ST_Polygon" - - def __init__(self, expr): - super().__init__(expr) - expr = self.source_expressions[0] - if isinstance(expr, Value) and not expr._output_field_or_none: - self.source_expressions[0] = Value( - expr.value, output_field=RasterField(srid=expr.value.srid) - ) - - @cached_property - def output_field(self): - return GeometryField(srid=self.source_expressions[0].field.srid) - - -class PostGISOperations(BaseSpatialOperations, DatabaseOperations): - name = "postgis" - postgis = True - geom_func_prefix = "ST_" - - Adapter = PostGISAdapter - - collect = geom_func_prefix + "Collect" - extent = geom_func_prefix + "Extent" - extent3d = geom_func_prefix + "3DExtent" - length3d = geom_func_prefix + "3DLength" - makeline = geom_func_prefix + "MakeLine" - perimeter3d = geom_func_prefix + "3DPerimeter" - unionagg = geom_func_prefix + "Union" - - gis_operators = { - "bbcontains": PostGISOperator(op="~", raster=True), - "bboverlaps": PostGISOperator(op="&&", geography=True, raster=True), - "contained": PostGISOperator(op="@", raster=True), - "overlaps_left": PostGISOperator(op="&<", raster=BILATERAL), - "overlaps_right": PostGISOperator(op="&>", raster=BILATERAL), - "overlaps_below": PostGISOperator(op="&<|"), - "overlaps_above": PostGISOperator(op="|&>"), - "left": PostGISOperator(op="<<"), - "right": PostGISOperator(op=">>"), - "strictly_below": PostGISOperator(op="<<|"), - "strictly_above": PostGISOperator(op="|>>"), - "same_as": PostGISOperator(op="~=", raster=BILATERAL), - "exact": PostGISOperator(op="~=", raster=BILATERAL), # alias of same_as - "contains": PostGISOperator(func="ST_Contains", raster=BILATERAL), - "contains_properly": PostGISOperator( - func="ST_ContainsProperly", raster=BILATERAL - ), - "coveredby": PostGISOperator( - func="ST_CoveredBy", geography=True, raster=BILATERAL - ), - "covers": PostGISOperator(func="ST_Covers", geography=True, raster=BILATERAL), - "crosses": PostGISOperator(func="ST_Crosses"), - "disjoint": PostGISOperator(func="ST_Disjoint", raster=BILATERAL), - "equals": PostGISOperator(func="ST_Equals"), - "intersects": PostGISOperator( - func="ST_Intersects", geography=True, raster=BILATERAL - ), - "overlaps": PostGISOperator(func="ST_Overlaps", raster=BILATERAL), - "relate": PostGISOperator(func="ST_Relate"), - "touches": PostGISOperator(func="ST_Touches", raster=BILATERAL), - "within": PostGISOperator(func="ST_Within", raster=BILATERAL), - "dwithin": PostGISOperator(func="ST_DWithin", geography=True, raster=BILATERAL), - } - - unsupported_functions = set() - - select = "%s" if is_psycopg3 else "%s::bytea" - - select_extent = None - - @cached_property - def function_names(self): - function_names = { - "AsWKB": "ST_AsBinary", - "AsWKT": "ST_AsText", - "BoundingCircle": "ST_MinimumBoundingCircle", - "FromWKB": "ST_GeomFromWKB", - "FromWKT": "ST_GeomFromText", - "NumPoints": "ST_NPoints", - } - return function_names - - @cached_property - def spatial_version(self): - """Determine the version of the PostGIS library.""" - # Trying to get the PostGIS version because the function - # signatures will depend on the version used. The cost - # here is a database query to determine the version, which - # can be mitigated by setting `POSTGIS_VERSION` with a 3-tuple - # comprising user-supplied values for the major, minor, and - # subminor revision of PostGIS. - if hasattr(settings, "POSTGIS_VERSION"): - version = settings.POSTGIS_VERSION - else: - # Run a basic query to check the status of the connection so we're - # sure we only raise the error below if the problem comes from - # PostGIS and not from PostgreSQL itself (see #24862). - self._get_postgis_func("version") - - try: - vtup = self.postgis_version_tuple() - except ProgrammingError: - raise ImproperlyConfigured( - 'Cannot determine PostGIS version for database "%s" ' - 'using command "SELECT postgis_lib_version()". ' - "GeoDjango requires at least PostGIS version 3.1. " - "Was the database created from a spatial database " - "template?" % self.connection.settings_dict["NAME"] - ) - version = vtup[1:] - return version - - def convert_extent(self, box): - """ - Return a 4-tuple extent for the `Extent` aggregate by converting - the bounding box text returned by PostGIS (`box` argument), for - example: "BOX(-90.0 30.0, -85.0 40.0)". - """ - if box is None: - return None - ll, ur = box[4:-1].split(",") - xmin, ymin = map(float, ll.split()) - xmax, ymax = map(float, ur.split()) - return (xmin, ymin, xmax, ymax) - - def convert_extent3d(self, box3d): - """ - Return a 6-tuple extent for the `Extent3D` aggregate by converting - the 3d bounding-box text returned by PostGIS (`box3d` argument), for - example: "BOX3D(-90.0 30.0 1, -85.0 40.0 2)". - """ - if box3d is None: - return None - ll, ur = box3d[6:-1].split(",") - xmin, ymin, zmin = map(float, ll.split()) - xmax, ymax, zmax = map(float, ur.split()) - return (xmin, ymin, zmin, xmax, ymax, zmax) - - def geo_db_type(self, f): - """ - Return the database field type for the given spatial field. - """ - if f.geom_type == "RASTER": - return "raster" - - # Type-based geometries. - # TODO: Support 'M' extension. - if f.dim == 3: - geom_type = f.geom_type + "Z" - else: - geom_type = f.geom_type - if f.geography: - if f.srid != 4326: - raise NotSupportedError( - "PostGIS only supports geography columns with an SRID of 4326." - ) - - return "geography(%s,%d)" % (geom_type, f.srid) - else: - return "geometry(%s,%d)" % (geom_type, f.srid) - - def get_distance(self, f, dist_val, lookup_type): - """ - Retrieve the distance parameters for the given geometry field, - distance lookup value, and the distance lookup type. - - This is the most complex implementation of the spatial backends due to - what is supported on geodetic geometry columns vs. what's available on - projected geometry columns. In addition, it has to take into account - the geography column type. - """ - # Getting the distance parameter - value = dist_val[0] - - # Shorthand boolean flags. - geodetic = f.geodetic(self.connection) - geography = f.geography - - if isinstance(value, Distance): - if geography: - dist_param = value.m - elif geodetic: - if lookup_type == "dwithin": - raise ValueError( - "Only numeric values of degree units are " - "allowed on geographic DWithin queries." - ) - dist_param = value.m - else: - dist_param = getattr( - value, Distance.unit_attname(f.units_name(self.connection)) - ) - else: - # Assuming the distance is in the units of the field. - dist_param = value - - return [dist_param] - - def get_geom_placeholder(self, f, value, compiler): - """ - Provide a proper substitution value for Geometries or rasters that are - not in the SRID of the field. Specifically, this routine will - substitute in the ST_Transform() function call. - """ - transform_func = self.spatial_function_name("Transform") - if hasattr(value, "as_sql"): - if value.field.srid == f.srid: - placeholder = "%s" - else: - placeholder = "%s(%%s, %s)" % (transform_func, f.srid) - return placeholder - - # Get the srid for this object - if value is None: - value_srid = None - else: - value_srid = value.srid - - # Adding Transform() to the SQL placeholder if the value srid - # is not equal to the field srid. - if value_srid is None or value_srid == f.srid: - placeholder = "%s" - else: - placeholder = "%s(%%s, %s)" % (transform_func, f.srid) - - return placeholder - - def _get_postgis_func(self, func): - """ - Helper routine for calling PostGIS functions and returning their result. - """ - # Close out the connection. See #9437. - with self.connection.temporary_connection() as cursor: - cursor.execute("SELECT %s()" % func) - return cursor.fetchone()[0] - - def postgis_geos_version(self): - "Return the version of the GEOS library used with PostGIS." - return self._get_postgis_func("postgis_geos_version") - - def postgis_lib_version(self): - "Return the version number of the PostGIS library used with PostgreSQL." - return self._get_postgis_func("postgis_lib_version") - - def postgis_proj_version(self): - """Return the version of the PROJ library used with PostGIS.""" - return self._get_postgis_func("postgis_proj_version") - - def postgis_version(self): - "Return PostGIS version number and compile-time options." - return self._get_postgis_func("postgis_version") - - def postgis_full_version(self): - "Return PostGIS version number and compile-time options." - return self._get_postgis_func("postgis_full_version") - - def postgis_version_tuple(self): - """ - Return the PostGIS version as a tuple (version string, major, - minor, subminor). - """ - version = self.postgis_lib_version() - return (version,) + get_version_tuple(version) - - def proj_version_tuple(self): - """ - Return the version of PROJ used by PostGIS as a tuple of the - major, minor, and subminor release numbers. - """ - proj_regex = re.compile(r"(\d+)\.(\d+)\.(\d+)") - proj_ver_str = self.postgis_proj_version() - m = proj_regex.search(proj_ver_str) - if m: - return tuple(map(int, m.groups())) - else: - raise Exception("Could not determine PROJ version from PostGIS.") - - def spatial_aggregate_name(self, agg_name): - if agg_name == "Extent3D": - return self.extent3d - else: - return self.geom_func_prefix + agg_name - - # Routines for getting the OGC-compliant models. - def geometry_columns(self): - return PostGISGeometryColumns - - def spatial_ref_sys(self): - return PostGISSpatialRefSys - - def parse_raster(self, value): - """Convert a PostGIS HEX String into a dict readable by GDALRaster.""" - return from_pgraster(value) - - def distance_expr_for_lookup(self, lhs, rhs, **kwargs): - return super().distance_expr_for_lookup( - self._normalize_distance_lookup_arg(lhs), - self._normalize_distance_lookup_arg(rhs), - **kwargs, - ) - - @staticmethod - def _normalize_distance_lookup_arg(arg): - is_raster = ( - arg.field.geom_type == "RASTER" - if hasattr(arg, "field") - else isinstance(arg, GDALRaster) - ) - return ST_Polygon(arg) if is_raster else arg - - def get_geometry_converter(self, expression): - read = wkb_r().read - geom_class = expression.output_field.geom_class - - def converter(value, expression, connection): - if isinstance(value, str): # Coming from hex strings. - value = value.encode("ascii") - return None if value is None else GEOSGeometryBase(read(value), geom_class) - - return converter - - def get_area_att_for_field(self, field): - return "sq_m" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/pgraster.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/pgraster.py deleted file mode 100644 index c231b48..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/pgraster.py +++ /dev/null @@ -1,152 +0,0 @@ -import struct - -from django.core.exceptions import ValidationError - -from .const import ( - BANDTYPE_FLAG_HASNODATA, - BANDTYPE_PIXTYPE_MASK, - GDAL_TO_POSTGIS, - GDAL_TO_STRUCT, - POSTGIS_HEADER_STRUCTURE, - POSTGIS_TO_GDAL, - STRUCT_SIZE, -) - - -def pack(structure, data): - """ - Pack data into hex string with little endian format. - """ - return struct.pack("<" + structure, *data) - - -def unpack(structure, data): - """ - Unpack little endian hexlified binary string into a list. - """ - return struct.unpack("<" + structure, bytes.fromhex(data)) - - -def chunk(data, index): - """ - Split a string into two parts at the input index. - """ - return data[:index], data[index:] - - -def from_pgraster(data): - """ - Convert a PostGIS HEX String into a dictionary. - """ - if data is None: - return - - # Split raster header from data - header, data = chunk(data, 122) - header = unpack(POSTGIS_HEADER_STRUCTURE, header) - - # Parse band data - bands = [] - pixeltypes = [] - while data: - # Get pixel type for this band - pixeltype_with_flags, data = chunk(data, 2) - pixeltype_with_flags = unpack("B", pixeltype_with_flags)[0] - pixeltype = pixeltype_with_flags & BANDTYPE_PIXTYPE_MASK - - # Convert datatype from PostGIS to GDAL & get pack type and size - pixeltype = POSTGIS_TO_GDAL[pixeltype] - pack_type = GDAL_TO_STRUCT[pixeltype] - pack_size = 2 * STRUCT_SIZE[pack_type] - - # Parse band nodata value. The nodata value is part of the - # PGRaster string even if the nodata flag is True, so it always - # has to be chunked off the data string. - nodata, data = chunk(data, pack_size) - nodata = unpack(pack_type, nodata)[0] - - # Chunk and unpack band data (pack size times nr of pixels) - band, data = chunk(data, pack_size * header[10] * header[11]) - band_result = {"data": bytes.fromhex(band)} - - # Set the nodata value if the nodata flag is set. - if pixeltype_with_flags & BANDTYPE_FLAG_HASNODATA: - band_result["nodata_value"] = nodata - - # Append band data to band list - bands.append(band_result) - - # Store pixeltype of this band in pixeltypes array - pixeltypes.append(pixeltype) - - # Check that all bands have the same pixeltype. - # This is required by GDAL. PostGIS rasters could have different pixeltypes - # for bands of the same raster. - if len(set(pixeltypes)) != 1: - raise ValidationError("Band pixeltypes are not all equal.") - - return { - "srid": int(header[9]), - "width": header[10], - "height": header[11], - "datatype": pixeltypes[0], - "origin": (header[5], header[6]), - "scale": (header[3], header[4]), - "skew": (header[7], header[8]), - "bands": bands, - } - - -def to_pgraster(rast): - """ - Convert a GDALRaster into PostGIS Raster format. - """ - # Prepare the raster header data as a tuple. The first two numbers are - # the endianness and the PostGIS Raster Version, both are fixed by - # PostGIS at the moment. - rasterheader = ( - 1, - 0, - len(rast.bands), - rast.scale.x, - rast.scale.y, - rast.origin.x, - rast.origin.y, - rast.skew.x, - rast.skew.y, - rast.srs.srid, - rast.width, - rast.height, - ) - - # Pack raster header. - result = pack(POSTGIS_HEADER_STRUCTURE, rasterheader) - - for band in rast.bands: - # The PostGIS raster band header has exactly two elements, a 8BUI byte - # and the nodata value. - # - # The 8BUI stores both the PostGIS pixel data type and a nodata flag. - # It is composed as the datatype with BANDTYPE_FLAG_HASNODATA (1 << 6) - # for existing nodata values: - # 8BUI_VALUE = PG_PIXEL_TYPE (0-11) | BANDTYPE_FLAG_HASNODATA - # - # For example, if the byte value is 71, then the datatype is - # 71 & ~BANDTYPE_FLAG_HASNODATA = 7 (32BSI) - # and the nodata value is True. - structure = "B" + GDAL_TO_STRUCT[band.datatype()] - - # Get band pixel type in PostGIS notation - pixeltype = GDAL_TO_POSTGIS[band.datatype()] - - # Set the nodata flag - if band.nodata_value is not None: - pixeltype |= BANDTYPE_FLAG_HASNODATA - - # Pack band header - bandheader = pack(structure, (pixeltype, band.nodata_value or 0)) - - # Add packed header and band data to result - result += bandheader + band.data(as_memoryview=True) - - return result diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/schema.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/schema.py deleted file mode 100644 index c74b574..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/postgis/schema.py +++ /dev/null @@ -1,124 +0,0 @@ -from django.contrib.gis.db.models import GeometryField -from django.db.backends.postgresql.schema import DatabaseSchemaEditor -from django.db.models.expressions import Col, Func - - -class PostGISSchemaEditor(DatabaseSchemaEditor): - geom_index_type = "GIST" - geom_index_ops_nd = "GIST_GEOMETRY_OPS_ND" - rast_index_template = "ST_ConvexHull(%(expressions)s)" - - sql_alter_column_to_3d = ( - "ALTER COLUMN %(column)s TYPE %(type)s USING ST_Force3D(%(column)s)::%(type)s" - ) - sql_alter_column_to_2d = ( - "ALTER COLUMN %(column)s TYPE %(type)s USING ST_Force2D(%(column)s)::%(type)s" - ) - - def geo_quote_name(self, name): - return self.connection.ops.geo_quote_name(name) - - def _field_should_be_indexed(self, model, field): - if getattr(field, "spatial_index", False): - return True - return super()._field_should_be_indexed(model, field) - - def _create_index_sql(self, model, *, fields=None, **kwargs): - if fields is None or len(fields) != 1 or not hasattr(fields[0], "geodetic"): - return super()._create_index_sql(model, fields=fields, **kwargs) - - return self._create_spatial_index_sql(model, fields[0], **kwargs) - - def _alter_column_type_sql( - self, table, old_field, new_field, new_type, old_collation, new_collation - ): - """ - Special case when dimension changed. - """ - if not hasattr(old_field, "dim") or not hasattr(new_field, "dim"): - return super()._alter_column_type_sql( - table, old_field, new_field, new_type, old_collation, new_collation - ) - - if old_field.dim == 2 and new_field.dim == 3: - sql_alter = self.sql_alter_column_to_3d - elif old_field.dim == 3 and new_field.dim == 2: - sql_alter = self.sql_alter_column_to_2d - else: - sql_alter = self.sql_alter_column_type - return ( - ( - sql_alter - % { - "column": self.quote_name(new_field.column), - "type": new_type, - "collation": "", - }, - [], - ), - [], - ) - - def _alter_field( - self, - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict=False, - ): - super()._alter_field( - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict=strict, - ) - - old_field_spatial_index = ( - isinstance(old_field, GeometryField) and old_field.spatial_index - ) - new_field_spatial_index = ( - isinstance(new_field, GeometryField) and new_field.spatial_index - ) - if not old_field_spatial_index and new_field_spatial_index: - self.execute(self._create_spatial_index_sql(model, new_field)) - elif old_field_spatial_index and not new_field_spatial_index: - self.execute(self._delete_spatial_index_sql(model, old_field)) - - def _create_spatial_index_name(self, model, field): - return self._create_index_name(model._meta.db_table, [field.column], "_id") - - def _create_spatial_index_sql(self, model, field, **kwargs): - expressions = None - opclasses = None - fields = [field] - if field.geom_type == "RASTER": - # For raster fields, wrap index creation SQL statement with ST_ConvexHull. - # Indexes on raster columns are based on the convex hull of the raster. - expressions = Func(Col(None, field), template=self.rast_index_template) - fields = None - elif field.dim > 2 and not field.geography: - # Use "nd" ops which are fast on multidimensional cases - opclasses = [self.geom_index_ops_nd] - if not (name := kwargs.get("name")): - name = self._create_spatial_index_name(model, field) - - return super()._create_index_sql( - model, - fields=fields, - name=name, - using=" USING %s" % self.geom_index_type, - opclasses=opclasses, - expressions=expressions, - ) - - def _delete_spatial_index_sql(self, model, field): - index_name = self._create_spatial_index_name(model, field) - return self._delete_index_sql(model, index_name) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/adapter.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/adapter.py deleted file mode 100644 index 91d14dc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/adapter.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.contrib.gis.db.backends.base.adapter import WKTAdapter -from django.db.backends.sqlite3.base import Database - - -class SpatiaLiteAdapter(WKTAdapter): - "SQLite adapter for geometry objects." - - def __conform__(self, protocol): - if protocol is Database.PrepareProtocol: - return str(self) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/base.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/base.py deleted file mode 100644 index 3359a7a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/base.py +++ /dev/null @@ -1,79 +0,0 @@ -from ctypes.util import find_library - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.db.backends.sqlite3.base import DatabaseWrapper as SQLiteDatabaseWrapper - -from .client import SpatiaLiteClient -from .features import DatabaseFeatures -from .introspection import SpatiaLiteIntrospection -from .operations import SpatiaLiteOperations -from .schema import SpatialiteSchemaEditor - - -class DatabaseWrapper(SQLiteDatabaseWrapper): - SchemaEditorClass = SpatialiteSchemaEditor - # Classes instantiated in __init__(). - client_class = SpatiaLiteClient - features_class = DatabaseFeatures - introspection_class = SpatiaLiteIntrospection - ops_class = SpatiaLiteOperations - - def __init__(self, *args, **kwargs): - # Trying to find the location of the SpatiaLite library. - # Here we are figuring out the path to the SpatiaLite library - # (`libspatialite`). If it's not in the system library path (e.g., it - # cannot be found by `ctypes.util.find_library`), then it may be set - # manually in the settings via the `SPATIALITE_LIBRARY_PATH` setting. - self.lib_spatialite_paths = [ - name - for name in [ - getattr(settings, "SPATIALITE_LIBRARY_PATH", None), - "mod_spatialite.so", - "mod_spatialite", - find_library("spatialite"), - ] - if name is not None - ] - super().__init__(*args, **kwargs) - - def get_new_connection(self, conn_params): - conn = super().get_new_connection(conn_params) - # Enabling extension loading on the SQLite connection. - try: - conn.enable_load_extension(True) - except AttributeError: - raise ImproperlyConfigured( - "SpatiaLite requires SQLite to be configured to allow " - "extension loading." - ) - # Load the SpatiaLite library extension on the connection. - for path in self.lib_spatialite_paths: - try: - conn.load_extension(path) - except Exception: - if getattr(settings, "SPATIALITE_LIBRARY_PATH", None): - raise ImproperlyConfigured( - "Unable to load the SpatiaLite library extension " - "as specified in your SPATIALITE_LIBRARY_PATH setting." - ) - continue - else: - break - else: - raise ImproperlyConfigured( - "Unable to load the SpatiaLite library extension. " - "Library names tried: %s" % ", ".join(self.lib_spatialite_paths) - ) - return conn - - def prepare_database(self): - super().prepare_database() - # Check if spatial metadata have been initialized in the database - with self.cursor() as cursor: - cursor.execute("PRAGMA table_info(geometry_columns);") - if cursor.fetchall() == []: - if self.ops.spatial_version < (5,): - cursor.execute("SELECT InitSpatialMetaData(1)") - else: - cursor.execute("SELECT InitSpatialMetaDataFull(1)") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/client.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/client.py deleted file mode 100644 index 527fe15..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/client.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.db.backends.sqlite3.client import DatabaseClient - - -class SpatiaLiteClient(DatabaseClient): - executable_name = "spatialite" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/features.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/features.py deleted file mode 100644 index 9504bb0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/features.py +++ /dev/null @@ -1,26 +0,0 @@ -from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures -from django.db.backends.sqlite3.features import ( - DatabaseFeatures as SQLiteDatabaseFeatures, -) -from django.utils.functional import cached_property - - -class DatabaseFeatures(BaseSpatialFeatures, SQLiteDatabaseFeatures): - can_alter_geometry_field = False # Not implemented - supports_3d_storage = True - - @cached_property - def supports_area_geodetic(self): - return bool(self.connection.ops.geom_lib_version()) - - @cached_property - def django_test_skips(self): - skips = super().django_test_skips - skips.update( - { - "SpatiaLite doesn't support distance lookups with Distance objects.": { - "gis_tests.geogapp.tests.GeographyTest.test02_distance_lookup", - }, - } - ) - return skips diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/introspection.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/introspection.py deleted file mode 100644 index 8d0003f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/introspection.py +++ /dev/null @@ -1,82 +0,0 @@ -from django.contrib.gis.gdal import OGRGeomType -from django.db.backends.sqlite3.introspection import ( - DatabaseIntrospection, - FlexibleFieldLookupDict, -) - - -class GeoFlexibleFieldLookupDict(FlexibleFieldLookupDict): - """ - Subclass that includes updates the `base_data_types_reverse` dict - for geometry field types. - """ - - base_data_types_reverse = { - **FlexibleFieldLookupDict.base_data_types_reverse, - "point": "GeometryField", - "linestring": "GeometryField", - "polygon": "GeometryField", - "multipoint": "GeometryField", - "multilinestring": "GeometryField", - "multipolygon": "GeometryField", - "geometrycollection": "GeometryField", - } - - -class SpatiaLiteIntrospection(DatabaseIntrospection): - data_types_reverse = GeoFlexibleFieldLookupDict() - - def get_geometry_type(self, table_name, description): - with self.connection.cursor() as cursor: - # Querying the `geometry_columns` table to get additional metadata. - cursor.execute( - "SELECT coord_dimension, srid, geometry_type " - "FROM geometry_columns " - "WHERE f_table_name=%s AND f_geometry_column=%s", - (table_name, description.name), - ) - row = cursor.fetchone() - if not row: - raise Exception( - 'Could not find a geometry column for "%s"."%s"' - % (table_name, description.name) - ) - - # OGRGeomType does not require GDAL and makes it easy to convert - # from OGC geom type name to Django field. - ogr_type = row[2] - if isinstance(ogr_type, int) and ogr_type > 1000: - # SpatiaLite uses SFSQL 1.2 offsets 1000 (Z), 2000 (M), and - # 3000 (ZM) to indicate the presence of higher dimensional - # coordinates (M not yet supported by Django). - ogr_type = ogr_type % 1000 + OGRGeomType.wkb25bit - field_type = OGRGeomType(ogr_type).django - - # Getting any GeometryField keyword arguments that are not the default. - dim = row[0] - srid = row[1] - field_params = {} - if srid != 4326: - field_params["srid"] = srid - if (isinstance(dim, str) and "Z" in dim) or dim == 3: - field_params["dim"] = 3 - return field_type, field_params - - def get_constraints(self, cursor, table_name): - constraints = super().get_constraints(cursor, table_name) - cursor.execute( - "SELECT f_geometry_column " - "FROM geometry_columns " - "WHERE f_table_name=%s AND spatial_index_enabled=1", - (table_name,), - ) - for row in cursor.fetchall(): - constraints["%s__spatial__index" % row[0]] = { - "columns": [row[0]], - "primary_key": False, - "unique": False, - "foreign_key": None, - "check": False, - "index": True, - } - return constraints diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/models.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/models.py deleted file mode 100644 index 1d564b0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/models.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -The GeometryColumns and SpatialRefSys models for the SpatiaLite backend. -""" - -from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin -from django.db import models - - -class SpatialiteGeometryColumns(models.Model): - """ - The 'geometry_columns' table from SpatiaLite. - """ - - f_table_name = models.CharField(max_length=256) - f_geometry_column = models.CharField(max_length=256) - coord_dimension = models.IntegerField() - srid = models.IntegerField(primary_key=True) - spatial_index_enabled = models.IntegerField() - type = models.IntegerField(db_column="geometry_type") - - class Meta: - app_label = "gis" - db_table = "geometry_columns" - managed = False - - def __str__(self): - return "%s.%s - %dD %s field (SRID: %d)" % ( - self.f_table_name, - self.f_geometry_column, - self.coord_dimension, - self.type, - self.srid, - ) - - @classmethod - def table_name_col(cls): - """ - Return the name of the metadata column used to store the feature table - name. - """ - return "f_table_name" - - @classmethod - def geom_col_name(cls): - """ - Return the name of the metadata column used to store the feature - geometry column. - """ - return "f_geometry_column" - - -class SpatialiteSpatialRefSys(models.Model, SpatialRefSysMixin): - """ - The 'spatial_ref_sys' table from SpatiaLite. - """ - - srid = models.IntegerField(primary_key=True) - auth_name = models.CharField(max_length=256) - auth_srid = models.IntegerField() - ref_sys_name = models.CharField(max_length=256) - proj4text = models.CharField(max_length=2048) - srtext = models.CharField(max_length=2048) - - class Meta: - app_label = "gis" - db_table = "spatial_ref_sys" - managed = False - - @property - def wkt(self): - return self.srtext diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/operations.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/operations.py deleted file mode 100644 index 3d10a53..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/operations.py +++ /dev/null @@ -1,231 +0,0 @@ -""" -SQL functions reference lists: -https://www.gaia-gis.it/gaia-sins/spatialite-sql-4.3.0.html -""" - -from django.contrib.gis.db import models -from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations -from django.contrib.gis.db.backends.spatialite.adapter import SpatiaLiteAdapter -from django.contrib.gis.db.backends.utils import SpatialOperator -from django.contrib.gis.geos.geometry import GEOSGeometry, GEOSGeometryBase -from django.contrib.gis.geos.prototypes.io import wkb_r -from django.contrib.gis.measure import Distance -from django.core.exceptions import ImproperlyConfigured -from django.db.backends.sqlite3.operations import DatabaseOperations -from django.utils.functional import cached_property -from django.utils.version import get_version_tuple - - -class SpatialiteNullCheckOperator(SpatialOperator): - def as_sql(self, connection, lookup, template_params, sql_params): - sql, params = super().as_sql(connection, lookup, template_params, sql_params) - return "%s > 0" % sql, params - - -class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations): - name = "spatialite" - spatialite = True - - Adapter = SpatiaLiteAdapter - - collect = "Collect" - extent = "Extent" - makeline = "MakeLine" - unionagg = "GUnion" - - from_text = "GeomFromText" - - gis_operators = { - # Binary predicates - "equals": SpatialiteNullCheckOperator(func="Equals"), - "disjoint": SpatialiteNullCheckOperator(func="Disjoint"), - "touches": SpatialiteNullCheckOperator(func="Touches"), - "crosses": SpatialiteNullCheckOperator(func="Crosses"), - "within": SpatialiteNullCheckOperator(func="Within"), - "overlaps": SpatialiteNullCheckOperator(func="Overlaps"), - "contains": SpatialiteNullCheckOperator(func="Contains"), - "intersects": SpatialiteNullCheckOperator(func="Intersects"), - "relate": SpatialiteNullCheckOperator(func="Relate"), - "coveredby": SpatialiteNullCheckOperator(func="CoveredBy"), - "covers": SpatialiteNullCheckOperator(func="Covers"), - # Returns true if B's bounding box completely contains A's bounding box. - "contained": SpatialOperator(func="MbrWithin"), - # Returns true if A's bounding box completely contains B's bounding box. - "bbcontains": SpatialOperator(func="MbrContains"), - # Returns true if A's bounding box overlaps B's bounding box. - "bboverlaps": SpatialOperator(func="MbrOverlaps"), - # These are implemented here as synonyms for Equals - "same_as": SpatialiteNullCheckOperator(func="Equals"), - "exact": SpatialiteNullCheckOperator(func="Equals"), - # Distance predicates - "dwithin": SpatialOperator(func="PtDistWithin"), - } - - disallowed_aggregates = (models.Extent3D,) - - select = "CAST (AsEWKB(%s) AS BLOB)" - - function_names = { - "AsWKB": "St_AsBinary", - "BoundingCircle": "GEOSMinimumBoundingCircle", - "ForcePolygonCW": "ST_ForceLHR", - "FromWKB": "ST_GeomFromWKB", - "FromWKT": "ST_GeomFromText", - "Length": "ST_Length", - "LineLocatePoint": "ST_Line_Locate_Point", - "NumPoints": "ST_NPoints", - "Reverse": "ST_Reverse", - "Scale": "ScaleCoords", - "Translate": "ST_Translate", - "Union": "ST_Union", - } - - @cached_property - def unsupported_functions(self): - unsupported = {"GeometryDistance", "IsEmpty", "MemSize"} - if not self.geom_lib_version(): - unsupported |= {"Azimuth", "GeoHash", "MakeValid"} - if self.spatial_version < (5, 1): - unsupported |= {"BoundingCircle"} - return unsupported - - @cached_property - def spatial_version(self): - """Determine the version of the SpatiaLite library.""" - try: - version = self.spatialite_version_tuple()[1:] - except Exception as exc: - raise ImproperlyConfigured( - 'Cannot determine the SpatiaLite version for the "%s" database. ' - "Was the SpatiaLite initialization SQL loaded on this database?" - % (self.connection.settings_dict["NAME"],) - ) from exc - if version < (4, 3, 0): - raise ImproperlyConfigured("GeoDjango supports SpatiaLite 4.3.0 and above.") - return version - - def convert_extent(self, box): - """ - Convert the polygon data received from SpatiaLite to min/max values. - """ - if box is None: - return None - shell = GEOSGeometry(box).shell - xmin, ymin = shell[0][:2] - xmax, ymax = shell[2][:2] - return (xmin, ymin, xmax, ymax) - - def geo_db_type(self, f): - """ - Return None because geometry columns are added via the - `AddGeometryColumn` stored procedure on SpatiaLite. - """ - return None - - def get_distance(self, f, value, lookup_type): - """ - Return the distance parameters for the given geometry field, - lookup value, and lookup type. - """ - if not value: - return [] - value = value[0] - if isinstance(value, Distance): - if f.geodetic(self.connection): - if lookup_type == "dwithin": - raise ValueError( - "Only numeric values of degree units are allowed on " - "geographic DWithin queries." - ) - dist_param = value.m - else: - dist_param = getattr( - value, Distance.unit_attname(f.units_name(self.connection)) - ) - else: - dist_param = value - return [dist_param] - - def _get_spatialite_func(self, func): - """ - Helper routine for calling SpatiaLite functions and returning - their result. - Any error occurring in this method should be handled by the caller. - """ - cursor = self.connection._cursor() - try: - cursor.execute("SELECT %s" % func) - row = cursor.fetchone() - finally: - cursor.close() - return row[0] - - def geos_version(self): - "Return the version of GEOS used by SpatiaLite as a string." - return self._get_spatialite_func("geos_version()") - - def proj_version(self): - """Return the version of the PROJ library used by SpatiaLite.""" - return self._get_spatialite_func("proj4_version()") - - def lwgeom_version(self): - """Return the version of LWGEOM library used by SpatiaLite.""" - return self._get_spatialite_func("lwgeom_version()") - - def rttopo_version(self): - """Return the version of RTTOPO library used by SpatiaLite.""" - return self._get_spatialite_func("rttopo_version()") - - def geom_lib_version(self): - """ - Return the version of the version-dependant geom library used by - SpatiaLite. - """ - if self.spatial_version >= (5,): - return self.rttopo_version() - else: - return self.lwgeom_version() - - def spatialite_version(self): - "Return the SpatiaLite library version as a string." - return self._get_spatialite_func("spatialite_version()") - - def spatialite_version_tuple(self): - """ - Return the SpatiaLite version as a tuple (version string, major, - minor, subminor). - """ - version = self.spatialite_version() - return (version,) + get_version_tuple(version) - - def spatial_aggregate_name(self, agg_name): - """ - Return the spatial aggregate SQL template and function for the - given Aggregate instance. - """ - agg_name = "unionagg" if agg_name.lower() == "union" else agg_name.lower() - return getattr(self, agg_name) - - # Routines for getting the OGC-compliant models. - def geometry_columns(self): - from django.contrib.gis.db.backends.spatialite.models import ( - SpatialiteGeometryColumns, - ) - - return SpatialiteGeometryColumns - - def spatial_ref_sys(self): - from django.contrib.gis.db.backends.spatialite.models import ( - SpatialiteSpatialRefSys, - ) - - return SpatialiteSpatialRefSys - - def get_geometry_converter(self, expression): - geom_class = expression.output_field.geom_class - read = wkb_r().read - - def converter(value, expression, connection): - return None if value is None else GEOSGeometryBase(read(value), geom_class) - - return converter diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/schema.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/schema.py deleted file mode 100644 index fb2c569..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/spatialite/schema.py +++ /dev/null @@ -1,194 +0,0 @@ -from django.db import DatabaseError -from django.db.backends.sqlite3.schema import DatabaseSchemaEditor - - -class SpatialiteSchemaEditor(DatabaseSchemaEditor): - sql_add_geometry_column = ( - "SELECT AddGeometryColumn(%(table)s, %(column)s, %(srid)s, " - "%(geom_type)s, %(dim)s, %(null)s)" - ) - sql_add_spatial_index = "SELECT CreateSpatialIndex(%(table)s, %(column)s)" - sql_drop_spatial_index = "DROP TABLE idx_%(table)s_%(column)s" - sql_recover_geometry_metadata = ( - "SELECT RecoverGeometryColumn(%(table)s, %(column)s, %(srid)s, " - "%(geom_type)s, %(dim)s)" - ) - sql_remove_geometry_metadata = "SELECT DiscardGeometryColumn(%(table)s, %(column)s)" - sql_discard_geometry_columns = ( - "DELETE FROM %(geom_table)s WHERE f_table_name = %(table)s" - ) - sql_update_geometry_columns = ( - "UPDATE %(geom_table)s SET f_table_name = %(new_table)s " - "WHERE f_table_name = %(old_table)s" - ) - - geometry_tables = [ - "geometry_columns", - "geometry_columns_auth", - "geometry_columns_time", - "geometry_columns_statistics", - ] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.geometry_sql = [] - - def geo_quote_name(self, name): - return self.connection.ops.geo_quote_name(name) - - def column_sql(self, model, field, include_default=False): - from django.contrib.gis.db.models import GeometryField - - if not isinstance(field, GeometryField): - return super().column_sql(model, field, include_default) - - # Geometry columns are created by the `AddGeometryColumn` function - self.geometry_sql.append( - self.sql_add_geometry_column - % { - "table": self.geo_quote_name(model._meta.db_table), - "column": self.geo_quote_name(field.column), - "srid": field.srid, - "geom_type": self.geo_quote_name(field.geom_type), - "dim": field.dim, - "null": int(not field.null), - } - ) - - if field.spatial_index: - self.geometry_sql.append( - self.sql_add_spatial_index - % { - "table": self.quote_name(model._meta.db_table), - "column": self.quote_name(field.column), - } - ) - return None, None - - def remove_geometry_metadata(self, model, field): - self.execute( - self.sql_remove_geometry_metadata - % { - "table": self.quote_name(model._meta.db_table), - "column": self.quote_name(field.column), - } - ) - self.execute( - self.sql_drop_spatial_index - % { - "table": model._meta.db_table, - "column": field.column, - } - ) - - def create_model(self, model): - super().create_model(model) - # Create geometry columns - for sql in self.geometry_sql: - self.execute(sql) - self.geometry_sql = [] - - def delete_model(self, model, **kwargs): - from django.contrib.gis.db.models import GeometryField - - # Drop spatial metadata (dropping the table does not automatically remove them) - for field in model._meta.local_fields: - if isinstance(field, GeometryField): - self.remove_geometry_metadata(model, field) - # Make sure all geom stuff is gone - for geom_table in self.geometry_tables: - try: - self.execute( - self.sql_discard_geometry_columns - % { - "geom_table": geom_table, - "table": self.quote_name(model._meta.db_table), - } - ) - except DatabaseError: - pass - super().delete_model(model, **kwargs) - - def add_field(self, model, field): - from django.contrib.gis.db.models import GeometryField - - if isinstance(field, GeometryField): - # Populate self.geometry_sql - self.column_sql(model, field) - for sql in self.geometry_sql: - self.execute(sql) - self.geometry_sql = [] - else: - super().add_field(model, field) - - def remove_field(self, model, field): - from django.contrib.gis.db.models import GeometryField - - # NOTE: If the field is a geometry field, the table is just recreated, - # the parent's remove_field can't be used cause it will skip the - # recreation if the field does not have a database type. Geometry fields - # do not have a db type cause they are added and removed via stored - # procedures. - if isinstance(field, GeometryField): - self._remake_table(model, delete_field=field) - else: - super().remove_field(model, field) - - def alter_db_table(self, model, old_db_table, new_db_table): - from django.contrib.gis.db.models import GeometryField - - if old_db_table == new_db_table or ( - self.connection.features.ignores_table_name_case - and old_db_table.lower() == new_db_table.lower() - ): - return - # Remove geometry-ness from temp table - for field in model._meta.local_fields: - if isinstance(field, GeometryField): - self.execute( - self.sql_remove_geometry_metadata - % { - "table": self.quote_name(old_db_table), - "column": self.quote_name(field.column), - } - ) - # Alter table - super().alter_db_table(model, old_db_table, new_db_table) - # Repoint any straggler names - for geom_table in self.geometry_tables: - try: - self.execute( - self.sql_update_geometry_columns - % { - "geom_table": geom_table, - "old_table": self.quote_name(old_db_table), - "new_table": self.quote_name(new_db_table), - } - ) - except DatabaseError: - pass - # Re-add geometry-ness and rename spatial index tables - for field in model._meta.local_fields: - if isinstance(field, GeometryField): - self.execute( - self.sql_recover_geometry_metadata - % { - "table": self.geo_quote_name(new_db_table), - "column": self.geo_quote_name(field.column), - "srid": field.srid, - "geom_type": self.geo_quote_name(field.geom_type), - "dim": field.dim, - } - ) - if getattr(field, "spatial_index", False): - self.execute( - self.sql_rename_table - % { - "old_table": self.quote_name( - "idx_%s_%s" % (old_db_table, field.column) - ), - "new_table": self.quote_name( - "idx_%s_%s" % (new_db_table, field.column) - ), - } - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/utils.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/utils.py deleted file mode 100644 index ffb7420..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/backends/utils.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -A collection of utility routines and classes used by the spatial -backends. -""" - - -class SpatialOperator: - """ - Class encapsulating the behavior specific to a GIS operation (used by lookups). - """ - - sql_template = None - - def __init__(self, op=None, func=None): - self.op = op - self.func = func - - @property - def default_template(self): - if self.func: - return "%(func)s(%(lhs)s, %(rhs)s)" - else: - return "%(lhs)s %(op)s %(rhs)s" - - def as_sql(self, connection, lookup, template_params, sql_params): - sql_template = self.sql_template or lookup.sql_template or self.default_template - template_params.update({"op": self.op, "func": self.func}) - return sql_template % template_params, sql_params diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/__init__.py deleted file mode 100644 index 0d5d45d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -from django.db.models import * # NOQA isort:skip -from django.db.models import __all__ as models_all # isort:skip -import django.contrib.gis.db.models.functions # NOQA -import django.contrib.gis.db.models.lookups # NOQA -from django.contrib.gis.db.models.aggregates import * # NOQA -from django.contrib.gis.db.models.aggregates import __all__ as aggregates_all -from django.contrib.gis.db.models.fields import ( - GeometryCollectionField, - GeometryField, - LineStringField, - MultiLineStringField, - MultiPointField, - MultiPolygonField, - PointField, - PolygonField, - RasterField, -) - -__all__ = models_all + aggregates_all -__all__ += [ - "GeometryCollectionField", - "GeometryField", - "LineStringField", - "MultiLineStringField", - "MultiPointField", - "MultiPolygonField", - "PointField", - "PolygonField", - "RasterField", -] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/aggregates.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/aggregates.py deleted file mode 100644 index abff1a5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/aggregates.py +++ /dev/null @@ -1,95 +0,0 @@ -from django.contrib.gis.db.models.fields import ( - ExtentField, - GeometryCollectionField, - GeometryField, - LineStringField, -) -from django.db.models import Aggregate, Func, Value -from django.utils.functional import cached_property - -__all__ = ["Collect", "Extent", "Extent3D", "MakeLine", "Union"] - - -class GeoAggregate(Aggregate): - function = None - is_extent = False - - @cached_property - def output_field(self): - return self.output_field_class(self.source_expressions[0].output_field.srid) - - def as_sql(self, compiler, connection, function=None, **extra_context): - # this will be called again in parent, but it's needed now - before - # we get the spatial_aggregate_name - connection.ops.check_expression_support(self) - return super().as_sql( - compiler, - connection, - function=function or connection.ops.spatial_aggregate_name(self.name), - **extra_context, - ) - - def as_oracle(self, compiler, connection, **extra_context): - if not self.is_extent: - tolerance = self.extra.get("tolerance") or getattr(self, "tolerance", 0.05) - clone = self.copy() - source_expressions = self.get_source_expressions() - source_expressions.pop() # Don't wrap filters with SDOAGGRTYPE(). - spatial_type_expr = Func( - *source_expressions, - Value(tolerance), - function="SDOAGGRTYPE", - output_field=self.output_field, - ) - source_expressions = [spatial_type_expr, self.filter] - clone.set_source_expressions(source_expressions) - return clone.as_sql(compiler, connection, **extra_context) - return self.as_sql(compiler, connection, **extra_context) - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - c = super().resolve_expression(query, allow_joins, reuse, summarize, for_save) - for field in c.get_source_fields(): - if not hasattr(field, "geom_type"): - raise ValueError( - "Geospatial aggregates only allowed on geometry fields." - ) - return c - - -class Collect(GeoAggregate): - name = "Collect" - output_field_class = GeometryCollectionField - - -class Extent(GeoAggregate): - name = "Extent" - is_extent = "2D" - - def __init__(self, expression, **extra): - super().__init__(expression, output_field=ExtentField(), **extra) - - def convert_value(self, value, expression, connection): - return connection.ops.convert_extent(value) - - -class Extent3D(GeoAggregate): - name = "Extent3D" - is_extent = "3D" - - def __init__(self, expression, **extra): - super().__init__(expression, output_field=ExtentField(), **extra) - - def convert_value(self, value, expression, connection): - return connection.ops.convert_extent3d(value) - - -class MakeLine(GeoAggregate): - name = "MakeLine" - output_field_class = LineStringField - - -class Union(GeoAggregate): - name = "Union" - output_field_class = GeometryField diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/fields.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/fields.py deleted file mode 100644 index 812029d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/fields.py +++ /dev/null @@ -1,434 +0,0 @@ -from collections import defaultdict, namedtuple - -from django.contrib.gis import forms, gdal -from django.contrib.gis.db.models.proxy import SpatialProxy -from django.contrib.gis.gdal.error import GDALException -from django.contrib.gis.geos import ( - GeometryCollection, - GEOSException, - GEOSGeometry, - LineString, - MultiLineString, - MultiPoint, - MultiPolygon, - Point, - Polygon, -) -from django.core.exceptions import ImproperlyConfigured -from django.db.models import Field -from django.utils.translation import gettext_lazy as _ - -# Local cache of the spatial_ref_sys table, which holds SRID data for each -# spatial database alias. This cache exists so that the database isn't queried -# for SRID info each time a distance query is constructed. -_srid_cache = defaultdict(dict) - - -SRIDCacheEntry = namedtuple( - "SRIDCacheEntry", ["units", "units_name", "spheroid", "geodetic"] -) - - -def get_srid_info(srid, connection): - """ - Return the units, unit name, and spheroid WKT associated with the - given SRID from the `spatial_ref_sys` (or equivalent) spatial database - table for the given database connection. These results are cached. - """ - from django.contrib.gis.gdal import SpatialReference - - try: - # The SpatialRefSys model for the spatial backend. - SpatialRefSys = connection.ops.spatial_ref_sys() - except NotImplementedError: - SpatialRefSys = None - - alias, get_srs = ( - ( - connection.alias, - lambda srid: SpatialRefSys.objects.using(connection.alias) - .get(srid=srid) - .srs, - ) - if SpatialRefSys - else (None, SpatialReference) - ) - if srid not in _srid_cache[alias]: - srs = get_srs(srid) - units, units_name = srs.units - _srid_cache[alias][srid] = SRIDCacheEntry( - units=units, - units_name=units_name, - spheroid='SPHEROID["%s",%s,%s]' - % (srs["spheroid"], srs.semi_major, srs.inverse_flattening), - geodetic=srs.geographic, - ) - - return _srid_cache[alias][srid] - - -class BaseSpatialField(Field): - """ - The Base GIS Field. - - It's used as a base class for GeometryField and RasterField. Defines - properties that are common to all GIS fields such as the characteristics - of the spatial reference system of the field. - """ - - description = _("The base GIS field.") - empty_strings_allowed = False - - def __init__(self, verbose_name=None, srid=4326, spatial_index=True, **kwargs): - """ - The initialization function for base spatial fields. Takes the following - as keyword arguments: - - srid: - The spatial reference system identifier, an OGC standard. - Defaults to 4326 (WGS84). - - spatial_index: - Indicates whether to create a spatial index. Defaults to True. - Set this instead of 'db_index' for geographic fields since index - creation is different for geometry columns. - """ - - # Setting the index flag with the value of the `spatial_index` keyword. - self.spatial_index = spatial_index - - # Setting the SRID and getting the units. Unit information must be - # easily available in the field instance for distance queries. - self.srid = srid - - # Setting the verbose_name keyword argument with the positional - # first parameter, so this works like normal fields. - kwargs["verbose_name"] = verbose_name - - super().__init__(**kwargs) - - def deconstruct(self): - name, path, args, kwargs = super().deconstruct() - # Always include SRID for less fragility; include spatial index if it's - # not the default value. - kwargs["srid"] = self.srid - if self.spatial_index is not True: - kwargs["spatial_index"] = self.spatial_index - return name, path, args, kwargs - - def db_type(self, connection): - return connection.ops.geo_db_type(self) - - def spheroid(self, connection): - return get_srid_info(self.srid, connection).spheroid - - def units(self, connection): - return get_srid_info(self.srid, connection).units - - def units_name(self, connection): - return get_srid_info(self.srid, connection).units_name - - def geodetic(self, connection): - """ - Return true if this field's SRID corresponds with a coordinate - system that uses non-projected units (e.g., latitude/longitude). - """ - return get_srid_info(self.srid, connection).geodetic - - def get_placeholder(self, value, compiler, connection): - """ - Return the placeholder for the spatial column for the - given value. - """ - return connection.ops.get_geom_placeholder(self, value, compiler) - - def get_srid(self, obj): - """ - Return the default SRID for the given geometry or raster, taking into - account the SRID set for the field. For example, if the input geometry - or raster doesn't have an SRID, then the SRID of the field will be - returned. - """ - srid = obj.srid # SRID of given geometry. - if srid is None or self.srid == -1 or (srid == -1 and self.srid != -1): - return self.srid - else: - return srid - - def get_db_prep_value(self, value, connection, *args, **kwargs): - if value is None: - return None - return connection.ops.Adapter( - super().get_db_prep_value(value, connection, *args, **kwargs), - **( - {"geography": True} - if self.geography and connection.features.supports_geography - else {} - ), - ) - - def get_raster_prep_value(self, value, is_candidate): - """ - Return a GDALRaster if conversion is successful, otherwise return None. - """ - if isinstance(value, gdal.GDALRaster): - return value - elif is_candidate: - try: - return gdal.GDALRaster(value) - except GDALException: - pass - elif isinstance(value, dict): - try: - return gdal.GDALRaster(value) - except GDALException: - raise ValueError( - "Couldn't create spatial object from lookup value '%s'." % value - ) - - def get_prep_value(self, value): - obj = super().get_prep_value(value) - if obj is None: - return None - # When the input is not a geometry or raster, attempt to construct one - # from the given string input. - if isinstance(obj, GEOSGeometry): - pass - else: - # Check if input is a candidate for conversion to raster or geometry. - is_candidate = isinstance(obj, (bytes, str)) or hasattr( - obj, "__geo_interface__" - ) - # Try to convert the input to raster. - raster = self.get_raster_prep_value(obj, is_candidate) - - if raster: - obj = raster - elif is_candidate: - try: - obj = GEOSGeometry(obj) - except (GEOSException, GDALException): - raise ValueError( - "Couldn't create spatial object from lookup value '%s'." % obj - ) - else: - raise ValueError( - "Cannot use object with type %s for a spatial lookup parameter." - % type(obj).__name__ - ) - - # Assigning the SRID value. - obj.srid = self.get_srid(obj) - return obj - - -class GeometryField(BaseSpatialField): - """ - The base Geometry field -- maps to the OpenGIS Specification Geometry type. - """ - - description = _( - "The base Geometry field — maps to the OpenGIS Specification Geometry type." - ) - form_class = forms.GeometryField - # The OpenGIS Geometry name. - geom_type = "GEOMETRY" - geom_class = None - - def __init__( - self, - verbose_name=None, - dim=2, - geography=False, - *, - extent=(-180.0, -90.0, 180.0, 90.0), - tolerance=0.05, - **kwargs, - ): - """ - The initialization function for geometry fields. In addition to the - parameters from BaseSpatialField, it takes the following as keyword - arguments: - - dim: - The number of dimensions for this geometry. Defaults to 2. - - extent: - Customize the extent, in a 4-tuple of WGS 84 coordinates, for the - geometry field entry in the `USER_SDO_GEOM_METADATA` table. Defaults - to (-180.0, -90.0, 180.0, 90.0). - - tolerance: - Define the tolerance, in meters, to use for the geometry field - entry in the `USER_SDO_GEOM_METADATA` table. Defaults to 0.05. - """ - # Setting the dimension of the geometry field. - self.dim = dim - - # Is this a geography rather than a geometry column? - self.geography = geography - - # Oracle-specific private attributes for creating the entry in - # `USER_SDO_GEOM_METADATA` - self._extent = extent - self._tolerance = tolerance - - super().__init__(verbose_name=verbose_name, **kwargs) - - def deconstruct(self): - name, path, args, kwargs = super().deconstruct() - # Include kwargs if they're not the default values. - if self.dim != 2: - kwargs["dim"] = self.dim - if self.geography is not False: - kwargs["geography"] = self.geography - if self._extent != (-180.0, -90.0, 180.0, 90.0): - kwargs["extent"] = self._extent - if self._tolerance != 0.05: - kwargs["tolerance"] = self._tolerance - return name, path, args, kwargs - - def contribute_to_class(self, cls, name, **kwargs): - super().contribute_to_class(cls, name, **kwargs) - - # Setup for lazy-instantiated Geometry object. - setattr( - cls, - self.attname, - SpatialProxy(self.geom_class or GEOSGeometry, self, load_func=GEOSGeometry), - ) - - def formfield(self, **kwargs): - defaults = { - "form_class": self.form_class, - "geom_type": self.geom_type, - "srid": self.srid, - **kwargs, - } - if self.dim > 2 and not getattr( - defaults["form_class"].widget, "supports_3d", False - ): - defaults.setdefault("widget", forms.Textarea) - return super().formfield(**defaults) - - def select_format(self, compiler, sql, params): - """ - Return the selection format string, depending on the requirements - of the spatial backend. For example, Oracle and MySQL require custom - selection formats in order to retrieve geometries in OGC WKB. - """ - if not compiler.query.subquery: - return compiler.connection.ops.select % sql, params - return sql, params - - -# The OpenGIS Geometry Type Fields -class PointField(GeometryField): - geom_type = "POINT" - geom_class = Point - form_class = forms.PointField - description = _("Point") - - -class LineStringField(GeometryField): - geom_type = "LINESTRING" - geom_class = LineString - form_class = forms.LineStringField - description = _("Line string") - - -class PolygonField(GeometryField): - geom_type = "POLYGON" - geom_class = Polygon - form_class = forms.PolygonField - description = _("Polygon") - - -class MultiPointField(GeometryField): - geom_type = "MULTIPOINT" - geom_class = MultiPoint - form_class = forms.MultiPointField - description = _("Multi-point") - - -class MultiLineStringField(GeometryField): - geom_type = "MULTILINESTRING" - geom_class = MultiLineString - form_class = forms.MultiLineStringField - description = _("Multi-line string") - - -class MultiPolygonField(GeometryField): - geom_type = "MULTIPOLYGON" - geom_class = MultiPolygon - form_class = forms.MultiPolygonField - description = _("Multi polygon") - - -class GeometryCollectionField(GeometryField): - geom_type = "GEOMETRYCOLLECTION" - geom_class = GeometryCollection - form_class = forms.GeometryCollectionField - description = _("Geometry collection") - - -class ExtentField(Field): - "Used as a return value from an extent aggregate" - - description = _("Extent Aggregate Field") - - def get_internal_type(self): - return "ExtentField" - - def select_format(self, compiler, sql, params): - select = compiler.connection.ops.select_extent - return select % sql if select else sql, params - - -class RasterField(BaseSpatialField): - """ - Raster field for GeoDjango -- evaluates into GDALRaster objects. - """ - - description = _("Raster Field") - geom_type = "RASTER" - geography = False - - def _check_connection(self, connection): - # Make sure raster fields are used only on backends with raster support. - if ( - not connection.features.gis_enabled - or not connection.features.supports_raster - ): - raise ImproperlyConfigured( - "Raster fields require backends with raster support." - ) - - def db_type(self, connection): - self._check_connection(connection) - return super().db_type(connection) - - def from_db_value(self, value, expression, connection): - return connection.ops.parse_raster(value) - - def contribute_to_class(self, cls, name, **kwargs): - super().contribute_to_class(cls, name, **kwargs) - # Setup for lazy-instantiated Raster object. For large querysets, the - # instantiation of all GDALRasters can potentially be expensive. This - # delays the instantiation of the objects to the moment of evaluation - # of the raster attribute. - setattr(cls, self.attname, SpatialProxy(gdal.GDALRaster, self)) - - def get_transform(self, name): - from django.contrib.gis.db.models.lookups import RasterBandTransform - - try: - band_index = int(name) - return type( - "SpecificRasterBandTransform", - (RasterBandTransform,), - {"band_index": band_index}, - ) - except ValueError: - pass - return super().get_transform(name) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/functions.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/functions.py deleted file mode 100644 index 10272b7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/functions.py +++ /dev/null @@ -1,590 +0,0 @@ -from decimal import Decimal - -from django.contrib.gis.db.models.fields import BaseSpatialField, GeometryField -from django.contrib.gis.db.models.sql import AreaField, DistanceField -from django.contrib.gis.geos import GEOSGeometry -from django.core.exceptions import FieldError -from django.db import NotSupportedError -from django.db.models import ( - BinaryField, - BooleanField, - FloatField, - Func, - IntegerField, - TextField, - Transform, - Value, -) -from django.db.models.functions import Cast -from django.utils.functional import cached_property - -NUMERIC_TYPES = (int, float, Decimal) - - -class GeoFuncMixin: - function = None - geom_param_pos = (0,) - - def __init__(self, *expressions, **extra): - super().__init__(*expressions, **extra) - - # Ensure that value expressions are geometric. - for pos in self.geom_param_pos: - expr = self.source_expressions[pos] - if not isinstance(expr, Value): - continue - try: - output_field = expr.output_field - except FieldError: - output_field = None - geom = expr.value - if ( - not isinstance(geom, GEOSGeometry) - or output_field - and not isinstance(output_field, GeometryField) - ): - raise TypeError( - "%s function requires a geometric argument in position %d." - % (self.name, pos + 1) - ) - if not geom.srid and not output_field: - raise ValueError("SRID is required for all geometries.") - if not output_field: - self.source_expressions[pos] = Value( - geom, output_field=GeometryField(srid=geom.srid) - ) - - @property - def name(self): - return self.__class__.__name__ - - @cached_property - def geo_field(self): - return self.source_expressions[self.geom_param_pos[0]].field - - def as_sql(self, compiler, connection, function=None, **extra_context): - if self.function is None and function is None: - function = connection.ops.spatial_function_name(self.name) - return super().as_sql(compiler, connection, function=function, **extra_context) - - def resolve_expression(self, *args, **kwargs): - res = super().resolve_expression(*args, **kwargs) - if not self.geom_param_pos: - return res - - # Ensure that expressions are geometric. - source_fields = res.get_source_fields() - for pos in self.geom_param_pos: - field = source_fields[pos] - if not isinstance(field, GeometryField): - raise TypeError( - "%s function requires a GeometryField in position %s, got %s." - % ( - self.name, - pos + 1, - type(field).__name__, - ) - ) - - base_srid = res.geo_field.srid - for pos in self.geom_param_pos[1:]: - expr = res.source_expressions[pos] - expr_srid = expr.output_field.srid - if expr_srid != base_srid: - # Automatic SRID conversion so objects are comparable. - res.source_expressions[pos] = Transform( - expr, base_srid - ).resolve_expression(*args, **kwargs) - return res - - def _handle_param(self, value, param_name="", check_types=None): - if not hasattr(value, "resolve_expression"): - if check_types and not isinstance(value, check_types): - raise TypeError( - "The %s parameter has the wrong type: should be %s." - % (param_name, check_types) - ) - return value - - -class GeoFunc(GeoFuncMixin, Func): - pass - - -class GeomOutputGeoFunc(GeoFunc): - @cached_property - def output_field(self): - return GeometryField(srid=self.geo_field.srid) - - -class SQLiteDecimalToFloatMixin: - """ - By default, Decimal values are converted to str by the SQLite backend, which - is not acceptable by the GIS functions expecting numeric values. - """ - - def as_sqlite(self, compiler, connection, **extra_context): - copy = self.copy() - copy.set_source_expressions( - [ - ( - Value(float(expr.value)) - if hasattr(expr, "value") and isinstance(expr.value, Decimal) - else expr - ) - for expr in copy.get_source_expressions() - ] - ) - return copy.as_sql(compiler, connection, **extra_context) - - -class OracleToleranceMixin: - tolerance = 0.05 - - def as_oracle(self, compiler, connection, **extra_context): - tolerance = Value( - self._handle_param( - self.extra.get("tolerance", self.tolerance), - "tolerance", - NUMERIC_TYPES, - ) - ) - clone = self.copy() - clone.set_source_expressions([*self.get_source_expressions(), tolerance]) - return clone.as_sql(compiler, connection, **extra_context) - - -class Area(OracleToleranceMixin, GeoFunc): - arity = 1 - - @cached_property - def output_field(self): - return AreaField(self.geo_field) - - def as_sql(self, compiler, connection, **extra_context): - if not connection.features.supports_area_geodetic and self.geo_field.geodetic( - connection - ): - raise NotSupportedError( - "Area on geodetic coordinate systems not supported." - ) - return super().as_sql(compiler, connection, **extra_context) - - def as_sqlite(self, compiler, connection, **extra_context): - if self.geo_field.geodetic(connection): - extra_context["template"] = "%(function)s(%(expressions)s, %(spheroid)d)" - extra_context["spheroid"] = True - return self.as_sql(compiler, connection, **extra_context) - - -class Azimuth(GeoFunc): - output_field = FloatField() - arity = 2 - geom_param_pos = (0, 1) - - -class AsGeoJSON(GeoFunc): - output_field = TextField() - - def __init__(self, expression, bbox=False, crs=False, precision=8, **extra): - expressions = [expression] - if precision is not None: - expressions.append(self._handle_param(precision, "precision", int)) - options = 0 - if crs and bbox: - options = 3 - elif bbox: - options = 1 - elif crs: - options = 2 - expressions.append(options) - super().__init__(*expressions, **extra) - - def as_oracle(self, compiler, connection, **extra_context): - source_expressions = self.get_source_expressions() - clone = self.copy() - clone.set_source_expressions(source_expressions[:1]) - return super(AsGeoJSON, clone).as_sql(compiler, connection, **extra_context) - - -class AsGML(GeoFunc): - geom_param_pos = (1,) - output_field = TextField() - - def __init__(self, expression, version=2, precision=8, **extra): - expressions = [version, expression] - if precision is not None: - expressions.append(self._handle_param(precision, "precision", int)) - super().__init__(*expressions, **extra) - - def as_oracle(self, compiler, connection, **extra_context): - source_expressions = self.get_source_expressions() - version = source_expressions[0] - clone = self.copy() - clone.set_source_expressions([source_expressions[1]]) - extra_context["function"] = ( - "SDO_UTIL.TO_GML311GEOMETRY" - if version.value == 3 - else "SDO_UTIL.TO_GMLGEOMETRY" - ) - return super(AsGML, clone).as_sql(compiler, connection, **extra_context) - - -class AsKML(GeoFunc): - output_field = TextField() - - def __init__(self, expression, precision=8, **extra): - expressions = [expression] - if precision is not None: - expressions.append(self._handle_param(precision, "precision", int)) - super().__init__(*expressions, **extra) - - -class AsSVG(GeoFunc): - output_field = TextField() - - def __init__(self, expression, relative=False, precision=8, **extra): - relative = ( - relative if hasattr(relative, "resolve_expression") else int(relative) - ) - expressions = [ - expression, - relative, - self._handle_param(precision, "precision", int), - ] - super().__init__(*expressions, **extra) - - -class AsWKB(GeoFunc): - output_field = BinaryField() - arity = 1 - - -class AsWKT(GeoFunc): - output_field = TextField() - arity = 1 - - -class BoundingCircle(OracleToleranceMixin, GeomOutputGeoFunc): - def __init__(self, expression, num_seg=48, **extra): - super().__init__(expression, num_seg, **extra) - - def as_oracle(self, compiler, connection, **extra_context): - clone = self.copy() - clone.set_source_expressions([self.get_source_expressions()[0]]) - return super(BoundingCircle, clone).as_oracle( - compiler, connection, **extra_context - ) - - def as_sqlite(self, compiler, connection, **extra_context): - clone = self.copy() - clone.set_source_expressions([self.get_source_expressions()[0]]) - return super(BoundingCircle, clone).as_sqlite( - compiler, connection, **extra_context - ) - - -class Centroid(OracleToleranceMixin, GeomOutputGeoFunc): - arity = 1 - - -class ClosestPoint(GeomOutputGeoFunc): - arity = 2 - geom_param_pos = (0, 1) - - -class Difference(OracleToleranceMixin, GeomOutputGeoFunc): - arity = 2 - geom_param_pos = (0, 1) - - -class DistanceResultMixin: - @cached_property - def output_field(self): - return DistanceField(self.geo_field) - - def source_is_geography(self): - return self.geo_field.geography and self.geo_field.srid == 4326 - - -class Distance(DistanceResultMixin, OracleToleranceMixin, GeoFunc): - geom_param_pos = (0, 1) - spheroid = None - - def __init__(self, expr1, expr2, spheroid=None, **extra): - expressions = [expr1, expr2] - if spheroid is not None: - self.spheroid = self._handle_param(spheroid, "spheroid", bool) - super().__init__(*expressions, **extra) - - def as_postgresql(self, compiler, connection, **extra_context): - clone = self.copy() - function = None - expr2 = clone.source_expressions[1] - geography = self.source_is_geography() - if expr2.output_field.geography != geography: - if isinstance(expr2, Value): - expr2.output_field.geography = geography - else: - clone.source_expressions[1] = Cast( - expr2, - GeometryField(srid=expr2.output_field.srid, geography=geography), - ) - - if not geography and self.geo_field.geodetic(connection): - # Geometry fields with geodetic (lon/lat) coordinates need special - # distance functions. - if self.spheroid: - # DistanceSpheroid is more accurate and resource intensive than - # DistanceSphere. - function = connection.ops.spatial_function_name("DistanceSpheroid") - # Replace boolean param by the real spheroid of the base field - clone.source_expressions.append( - Value(self.geo_field.spheroid(connection)) - ) - else: - function = connection.ops.spatial_function_name("DistanceSphere") - return super(Distance, clone).as_sql( - compiler, connection, function=function, **extra_context - ) - - def as_sqlite(self, compiler, connection, **extra_context): - if self.geo_field.geodetic(connection): - # SpatiaLite returns NULL instead of zero on geodetic coordinates - extra_context["template"] = ( - "COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)" - ) - extra_context["spheroid"] = int(bool(self.spheroid)) - return super().as_sql(compiler, connection, **extra_context) - - -class Envelope(GeomOutputGeoFunc): - arity = 1 - - -class ForcePolygonCW(GeomOutputGeoFunc): - arity = 1 - - -class FromWKB(GeoFunc): - arity = 2 - geom_param_pos = () - - def __init__(self, expression, srid=0, **extra): - expressions = [ - expression, - self._handle_param(srid, "srid", int), - ] - if "output_field" not in extra: - extra["output_field"] = GeometryField(srid=srid) - super().__init__(*expressions, **extra) - - def as_oracle(self, compiler, connection, **extra_context): - # Oracle doesn't support the srid parameter. - source_expressions = self.get_source_expressions() - clone = self.copy() - clone.set_source_expressions(source_expressions[:1]) - return super(FromWKB, clone).as_sql(compiler, connection, **extra_context) - - -class FromWKT(FromWKB): - pass - - -class GeoHash(GeoFunc): - output_field = TextField() - - def __init__(self, expression, precision=None, **extra): - expressions = [expression] - if precision is not None: - expressions.append(self._handle_param(precision, "precision", int)) - super().__init__(*expressions, **extra) - - def as_mysql(self, compiler, connection, **extra_context): - clone = self.copy() - # If no precision is provided, set it to the maximum. - if len(clone.source_expressions) < 2: - clone.source_expressions.append(Value(100)) - return clone.as_sql(compiler, connection, **extra_context) - - -class GeometryDistance(GeoFunc): - output_field = FloatField() - arity = 2 - function = "" - arg_joiner = " <-> " - geom_param_pos = (0, 1) - - -class Intersection(OracleToleranceMixin, GeomOutputGeoFunc): - arity = 2 - geom_param_pos = (0, 1) - - -@BaseSpatialField.register_lookup -class IsEmpty(GeoFuncMixin, Transform): - lookup_name = "isempty" - output_field = BooleanField() - - -@BaseSpatialField.register_lookup -class IsValid(OracleToleranceMixin, GeoFuncMixin, Transform): - lookup_name = "isvalid" - output_field = BooleanField() - - def as_oracle(self, compiler, connection, **extra_context): - sql, params = super().as_oracle(compiler, connection, **extra_context) - return "CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END" % sql, params - - -class Length(DistanceResultMixin, OracleToleranceMixin, GeoFunc): - def __init__(self, expr1, spheroid=True, **extra): - self.spheroid = spheroid - super().__init__(expr1, **extra) - - def as_sql(self, compiler, connection, **extra_context): - if ( - self.geo_field.geodetic(connection) - and not connection.features.supports_length_geodetic - ): - raise NotSupportedError( - "This backend doesn't support Length on geodetic fields" - ) - return super().as_sql(compiler, connection, **extra_context) - - def as_postgresql(self, compiler, connection, **extra_context): - clone = self.copy() - function = None - if self.source_is_geography(): - clone.source_expressions.append(Value(self.spheroid)) - elif self.geo_field.geodetic(connection): - # Geometry fields with geodetic (lon/lat) coordinates need length_spheroid - function = connection.ops.spatial_function_name("LengthSpheroid") - clone.source_expressions.append(Value(self.geo_field.spheroid(connection))) - else: - dim = min(f.dim for f in self.get_source_fields() if f) - if dim > 2: - function = connection.ops.length3d - return super(Length, clone).as_sql( - compiler, connection, function=function, **extra_context - ) - - def as_sqlite(self, compiler, connection, **extra_context): - function = None - if self.geo_field.geodetic(connection): - function = "GeodesicLength" if self.spheroid else "GreatCircleLength" - return super().as_sql(compiler, connection, function=function, **extra_context) - - -class LineLocatePoint(GeoFunc): - output_field = FloatField() - arity = 2 - geom_param_pos = (0, 1) - - -class MakeValid(GeomOutputGeoFunc): - pass - - -class MemSize(GeoFunc): - output_field = IntegerField() - arity = 1 - - -class NumGeometries(GeoFunc): - output_field = IntegerField() - arity = 1 - - -class NumPoints(GeoFunc): - output_field = IntegerField() - arity = 1 - - -class Perimeter(DistanceResultMixin, OracleToleranceMixin, GeoFunc): - arity = 1 - - def as_postgresql(self, compiler, connection, **extra_context): - function = None - if self.geo_field.geodetic(connection) and not self.source_is_geography(): - raise NotSupportedError( - "ST_Perimeter cannot use a non-projected non-geography field." - ) - dim = min(f.dim for f in self.get_source_fields()) - if dim > 2: - function = connection.ops.perimeter3d - return super().as_sql(compiler, connection, function=function, **extra_context) - - def as_sqlite(self, compiler, connection, **extra_context): - if self.geo_field.geodetic(connection): - raise NotSupportedError("Perimeter cannot use a non-projected field.") - return super().as_sql(compiler, connection, **extra_context) - - -class PointOnSurface(OracleToleranceMixin, GeomOutputGeoFunc): - arity = 1 - - -class Reverse(GeoFunc): - arity = 1 - - -class Scale(SQLiteDecimalToFloatMixin, GeomOutputGeoFunc): - def __init__(self, expression, x, y, z=0.0, **extra): - expressions = [ - expression, - self._handle_param(x, "x", NUMERIC_TYPES), - self._handle_param(y, "y", NUMERIC_TYPES), - ] - if z != 0.0: - expressions.append(self._handle_param(z, "z", NUMERIC_TYPES)) - super().__init__(*expressions, **extra) - - -class SnapToGrid(SQLiteDecimalToFloatMixin, GeomOutputGeoFunc): - def __init__(self, expression, *args, **extra): - nargs = len(args) - expressions = [expression] - if nargs in (1, 2): - expressions.extend( - [self._handle_param(arg, "", NUMERIC_TYPES) for arg in args] - ) - elif nargs == 4: - # Reverse origin and size param ordering - expressions += [ - *(self._handle_param(arg, "", NUMERIC_TYPES) for arg in args[2:]), - *(self._handle_param(arg, "", NUMERIC_TYPES) for arg in args[0:2]), - ] - else: - raise ValueError("Must provide 1, 2, or 4 arguments to `SnapToGrid`.") - super().__init__(*expressions, **extra) - - -class SymDifference(OracleToleranceMixin, GeomOutputGeoFunc): - arity = 2 - geom_param_pos = (0, 1) - - -class Transform(GeomOutputGeoFunc): - def __init__(self, expression, srid, **extra): - expressions = [ - expression, - self._handle_param(srid, "srid", int), - ] - if "output_field" not in extra: - extra["output_field"] = GeometryField(srid=srid) - super().__init__(*expressions, **extra) - - -class Translate(Scale): - def as_sqlite(self, compiler, connection, **extra_context): - clone = self.copy() - if len(self.source_expressions) < 4: - # Always provide the z parameter for ST_Translate - clone.source_expressions.append(Value(0)) - return super(Translate, clone).as_sqlite(compiler, connection, **extra_context) - - -class Union(OracleToleranceMixin, GeomOutputGeoFunc): - arity = 2 - geom_param_pos = (0, 1) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/lookups.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/lookups.py deleted file mode 100644 index b9686fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/lookups.py +++ /dev/null @@ -1,395 +0,0 @@ -from django.contrib.gis.db.models.fields import BaseSpatialField -from django.contrib.gis.measure import Distance -from django.db import NotSupportedError -from django.db.models import Expression, Lookup, Transform -from django.db.models.sql.query import Query -from django.utils.regex_helper import _lazy_re_compile - - -class RasterBandTransform(Transform): - def as_sql(self, compiler, connection): - return compiler.compile(self.lhs) - - -class GISLookup(Lookup): - sql_template = None - transform_func = None - distance = False - band_rhs = None - band_lhs = None - - def __init__(self, lhs, rhs): - rhs, *self.rhs_params = rhs if isinstance(rhs, (list, tuple)) else [rhs] - super().__init__(lhs, rhs) - self.template_params = {} - self.process_rhs_params() - - def process_rhs_params(self): - if self.rhs_params: - # Check if a band index was passed in the query argument. - if len(self.rhs_params) == (2 if self.lookup_name == "relate" else 1): - self.process_band_indices() - elif len(self.rhs_params) > 1: - raise ValueError("Tuple too long for lookup %s." % self.lookup_name) - elif isinstance(self.lhs, RasterBandTransform): - self.process_band_indices(only_lhs=True) - - def process_band_indices(self, only_lhs=False): - """ - Extract the lhs band index from the band transform class and the rhs - band index from the input tuple. - """ - # PostGIS band indices are 1-based, so the band index needs to be - # increased to be consistent with the GDALRaster band indices. - if only_lhs: - self.band_rhs = 1 - self.band_lhs = self.lhs.band_index + 1 - return - - if isinstance(self.lhs, RasterBandTransform): - self.band_lhs = self.lhs.band_index + 1 - else: - self.band_lhs = 1 - - self.band_rhs, *self.rhs_params = self.rhs_params - - def get_db_prep_lookup(self, value, connection): - # get_db_prep_lookup is called by process_rhs from super class - return ("%s", [connection.ops.Adapter(value)]) - - def process_rhs(self, compiler, connection): - if isinstance(self.rhs, Query): - # If rhs is some Query, don't touch it. - return super().process_rhs(compiler, connection) - if isinstance(self.rhs, Expression): - self.rhs = self.rhs.resolve_expression(compiler.query) - rhs, rhs_params = super().process_rhs(compiler, connection) - placeholder = connection.ops.get_geom_placeholder( - self.lhs.output_field, self.rhs, compiler - ) - return placeholder % rhs, rhs_params - - def get_rhs_op(self, connection, rhs): - # Unlike BuiltinLookup, the GIS get_rhs_op() implementation should return - # an object (SpatialOperator) with an as_sql() method to allow for more - # complex computations (where the lhs part can be mixed in). - return connection.ops.gis_operators[self.lookup_name] - - def as_sql(self, compiler, connection): - lhs_sql, lhs_params = self.process_lhs(compiler, connection) - rhs_sql, rhs_params = self.process_rhs(compiler, connection) - sql_params = (*lhs_params, *rhs_params) - - template_params = { - "lhs": lhs_sql, - "rhs": rhs_sql, - "value": "%s", - **self.template_params, - } - rhs_op = self.get_rhs_op(connection, rhs_sql) - return rhs_op.as_sql(connection, self, template_params, sql_params) - - -# ------------------ -# Geometry operators -# ------------------ - - -@BaseSpatialField.register_lookup -class OverlapsLeftLookup(GISLookup): - """ - The overlaps_left operator returns true if A's bounding box overlaps or is to the - left of B's bounding box. - """ - - lookup_name = "overlaps_left" - - -@BaseSpatialField.register_lookup -class OverlapsRightLookup(GISLookup): - """ - The 'overlaps_right' operator returns true if A's bounding box overlaps or is to the - right of B's bounding box. - """ - - lookup_name = "overlaps_right" - - -@BaseSpatialField.register_lookup -class OverlapsBelowLookup(GISLookup): - """ - The 'overlaps_below' operator returns true if A's bounding box overlaps or is below - B's bounding box. - """ - - lookup_name = "overlaps_below" - - -@BaseSpatialField.register_lookup -class OverlapsAboveLookup(GISLookup): - """ - The 'overlaps_above' operator returns true if A's bounding box overlaps or is above - B's bounding box. - """ - - lookup_name = "overlaps_above" - - -@BaseSpatialField.register_lookup -class LeftLookup(GISLookup): - """ - The 'left' operator returns true if A's bounding box is strictly to the left - of B's bounding box. - """ - - lookup_name = "left" - - -@BaseSpatialField.register_lookup -class RightLookup(GISLookup): - """ - The 'right' operator returns true if A's bounding box is strictly to the right - of B's bounding box. - """ - - lookup_name = "right" - - -@BaseSpatialField.register_lookup -class StrictlyBelowLookup(GISLookup): - """ - The 'strictly_below' operator returns true if A's bounding box is strictly below B's - bounding box. - """ - - lookup_name = "strictly_below" - - -@BaseSpatialField.register_lookup -class StrictlyAboveLookup(GISLookup): - """ - The 'strictly_above' operator returns true if A's bounding box is strictly above B's - bounding box. - """ - - lookup_name = "strictly_above" - - -@BaseSpatialField.register_lookup -class SameAsLookup(GISLookup): - """ - The "~=" operator is the "same as" operator. It tests actual geometric - equality of two features. So if A and B are the same feature, - vertex-by-vertex, the operator returns true. - """ - - lookup_name = "same_as" - - -BaseSpatialField.register_lookup(SameAsLookup, "exact") - - -@BaseSpatialField.register_lookup -class BBContainsLookup(GISLookup): - """ - The 'bbcontains' operator returns true if A's bounding box completely contains - by B's bounding box. - """ - - lookup_name = "bbcontains" - - -@BaseSpatialField.register_lookup -class BBOverlapsLookup(GISLookup): - """ - The 'bboverlaps' operator returns true if A's bounding box overlaps B's - bounding box. - """ - - lookup_name = "bboverlaps" - - -@BaseSpatialField.register_lookup -class ContainedLookup(GISLookup): - """ - The 'contained' operator returns true if A's bounding box is completely contained - by B's bounding box. - """ - - lookup_name = "contained" - - -# ------------------ -# Geometry functions -# ------------------ - - -@BaseSpatialField.register_lookup -class ContainsLookup(GISLookup): - lookup_name = "contains" - - -@BaseSpatialField.register_lookup -class ContainsProperlyLookup(GISLookup): - lookup_name = "contains_properly" - - -@BaseSpatialField.register_lookup -class CoveredByLookup(GISLookup): - lookup_name = "coveredby" - - -@BaseSpatialField.register_lookup -class CoversLookup(GISLookup): - lookup_name = "covers" - - -@BaseSpatialField.register_lookup -class CrossesLookup(GISLookup): - lookup_name = "crosses" - - -@BaseSpatialField.register_lookup -class DisjointLookup(GISLookup): - lookup_name = "disjoint" - - -@BaseSpatialField.register_lookup -class EqualsLookup(GISLookup): - lookup_name = "equals" - - -@BaseSpatialField.register_lookup -class IntersectsLookup(GISLookup): - lookup_name = "intersects" - - -@BaseSpatialField.register_lookup -class OverlapsLookup(GISLookup): - lookup_name = "overlaps" - - -@BaseSpatialField.register_lookup -class RelateLookup(GISLookup): - lookup_name = "relate" - sql_template = "%(func)s(%(lhs)s, %(rhs)s, %%s)" - pattern_regex = _lazy_re_compile(r"^[012TF*]{9}$") - - def process_rhs(self, compiler, connection): - # Check the pattern argument - pattern = self.rhs_params[0] - backend_op = connection.ops.gis_operators[self.lookup_name] - if hasattr(backend_op, "check_relate_argument"): - backend_op.check_relate_argument(pattern) - elif not isinstance(pattern, str) or not self.pattern_regex.match(pattern): - raise ValueError('Invalid intersection matrix pattern "%s".' % pattern) - sql, params = super().process_rhs(compiler, connection) - return sql, params + [pattern] - - -@BaseSpatialField.register_lookup -class TouchesLookup(GISLookup): - lookup_name = "touches" - - -@BaseSpatialField.register_lookup -class WithinLookup(GISLookup): - lookup_name = "within" - - -class DistanceLookupBase(GISLookup): - distance = True - sql_template = "%(func)s(%(lhs)s, %(rhs)s) %(op)s %(value)s" - - def process_rhs_params(self): - if not 1 <= len(self.rhs_params) <= 3: - raise ValueError( - "2, 3, or 4-element tuple required for '%s' lookup." % self.lookup_name - ) - elif len(self.rhs_params) == 3 and self.rhs_params[2] != "spheroid": - raise ValueError( - "For 4-element tuples the last argument must be the 'spheroid' " - "directive." - ) - - # Check if the second parameter is a band index. - if len(self.rhs_params) > 1 and self.rhs_params[1] != "spheroid": - self.process_band_indices() - - def process_distance(self, compiler, connection): - dist_param = self.rhs_params[0] - return ( - compiler.compile(dist_param.resolve_expression(compiler.query)) - if hasattr(dist_param, "resolve_expression") - else ( - "%s", - connection.ops.get_distance( - self.lhs.output_field, self.rhs_params, self.lookup_name - ), - ) - ) - - -@BaseSpatialField.register_lookup -class DWithinLookup(DistanceLookupBase): - lookup_name = "dwithin" - sql_template = "%(func)s(%(lhs)s, %(rhs)s, %(value)s)" - - def process_distance(self, compiler, connection): - dist_param = self.rhs_params[0] - if ( - not connection.features.supports_dwithin_distance_expr - and hasattr(dist_param, "resolve_expression") - and not isinstance(dist_param, Distance) - ): - raise NotSupportedError( - "This backend does not support expressions for specifying " - "distance in the dwithin lookup." - ) - return super().process_distance(compiler, connection) - - def process_rhs(self, compiler, connection): - dist_sql, dist_params = self.process_distance(compiler, connection) - self.template_params["value"] = dist_sql - rhs_sql, params = super().process_rhs(compiler, connection) - return rhs_sql, params + dist_params - - -class DistanceLookupFromFunction(DistanceLookupBase): - def as_sql(self, compiler, connection): - spheroid = ( - len(self.rhs_params) == 2 and self.rhs_params[-1] == "spheroid" - ) or None - distance_expr = connection.ops.distance_expr_for_lookup( - self.lhs, self.rhs, spheroid=spheroid - ) - sql, params = compiler.compile(distance_expr.resolve_expression(compiler.query)) - dist_sql, dist_params = self.process_distance(compiler, connection) - return ( - "%(func)s %(op)s %(dist)s" % {"func": sql, "op": self.op, "dist": dist_sql}, - params + dist_params, - ) - - -@BaseSpatialField.register_lookup -class DistanceGTLookup(DistanceLookupFromFunction): - lookup_name = "distance_gt" - op = ">" - - -@BaseSpatialField.register_lookup -class DistanceGTELookup(DistanceLookupFromFunction): - lookup_name = "distance_gte" - op = ">=" - - -@BaseSpatialField.register_lookup -class DistanceLTLookup(DistanceLookupFromFunction): - lookup_name = "distance_lt" - op = "<" - - -@BaseSpatialField.register_lookup -class DistanceLTELookup(DistanceLookupFromFunction): - lookup_name = "distance_lte" - op = "<=" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/proxy.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/proxy.py deleted file mode 100644 index b415e14..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/proxy.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -The SpatialProxy object allows for lazy-geometries and lazy-rasters. The proxy -uses Python descriptors for instantiating and setting Geometry or Raster -objects corresponding to geographic model fields. - -Thanks to Robert Coup for providing this functionality (see #4322). -""" - -from django.db.models.query_utils import DeferredAttribute - - -class SpatialProxy(DeferredAttribute): - def __init__(self, klass, field, load_func=None): - """ - Initialize on the given Geometry or Raster class (not an instance) - and the corresponding field. - """ - self._klass = klass - self._load_func = load_func or klass - super().__init__(field) - - def __get__(self, instance, cls=None): - """ - Retrieve the geometry or raster, initializing it using the - corresponding class specified during initialization and the value of - the field. Currently, GEOS or OGR geometries as well as GDALRasters are - supported. - """ - if instance is None: - # Accessed on a class, not an instance - return self - - # Getting the value of the field. - try: - geo_value = instance.__dict__[self.field.attname] - except KeyError: - geo_value = super().__get__(instance, cls) - - if isinstance(geo_value, self._klass): - geo_obj = geo_value - elif (geo_value is None) or (geo_value == ""): - geo_obj = None - else: - # Otherwise, a geometry or raster object is built using the field's - # contents, and the model's corresponding attribute is set. - geo_obj = self._load_func(geo_value) - setattr(instance, self.field.attname, geo_obj) - return geo_obj - - def __set__(self, instance, value): - """ - Retrieve the proxied geometry or raster with the corresponding class - specified during initialization. - - To set geometries, use values of None, HEXEWKB, or WKT. - To set rasters, use JSON or dict values. - """ - # The geographic type of the field. - gtype = self.field.geom_type - - if gtype == "RASTER" and ( - value is None or isinstance(value, (str, dict, self._klass)) - ): - # For raster fields, ensure input is None or a string, dict, or - # raster instance. - pass - elif isinstance(value, self._klass): - # The geometry type must match that of the field -- unless the - # general GeometryField is used. - if value.srid is None: - # Assigning the field SRID if the geometry has no SRID. - value.srid = self.field.srid - elif value is None or isinstance(value, (str, memoryview)): - # Set geometries with None, WKT, HEX, or WKB - pass - else: - raise TypeError( - "Cannot set %s SpatialProxy (%s) with value of type: %s" - % (instance.__class__.__name__, gtype, type(value)) - ) - - # Setting the objects dictionary with the value, and returning. - instance.__dict__[self.field.attname] = value - return value diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/sql/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/sql/__init__.py deleted file mode 100644 index 1376e8d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/sql/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.contrib.gis.db.models.sql.conversion import AreaField, DistanceField - -__all__ = [ - "AreaField", - "DistanceField", -] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/sql/conversion.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/sql/conversion.py deleted file mode 100644 index 7802b2d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/db/models/sql/conversion.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -This module holds simple classes to convert geospatial values from the -database. -""" - -from decimal import Decimal - -from django.contrib.gis.measure import Area, Distance -from django.db import models - - -class AreaField(models.FloatField): - "Wrapper for Area values." - - def __init__(self, geo_field): - super().__init__() - self.geo_field = geo_field - - def get_prep_value(self, value): - if not isinstance(value, Area): - raise ValueError("AreaField only accepts Area measurement objects.") - return value - - def get_db_prep_value(self, value, connection, prepared=False): - if value is None: - return - area_att = connection.ops.get_area_att_for_field(self.geo_field) - return getattr(value, area_att) if area_att else value - - def from_db_value(self, value, expression, connection): - if value is None: - return - # If the database returns a Decimal, convert it to a float as expected - # by the Python geometric objects. - if isinstance(value, Decimal): - value = float(value) - # If the units are known, convert value into area measure. - area_att = connection.ops.get_area_att_for_field(self.geo_field) - return Area(**{area_att: value}) if area_att else value - - def get_internal_type(self): - return "AreaField" - - -class DistanceField(models.FloatField): - "Wrapper for Distance values." - - def __init__(self, geo_field): - super().__init__() - self.geo_field = geo_field - - def get_prep_value(self, value): - if isinstance(value, Distance): - return value - return super().get_prep_value(value) - - def get_db_prep_value(self, value, connection, prepared=False): - if not isinstance(value, Distance): - return value - distance_att = connection.ops.get_distance_att_for_field(self.geo_field) - if not distance_att: - raise ValueError( - "Distance measure is supplied, but units are unknown for result." - ) - return getattr(value, distance_att) - - def from_db_value(self, value, expression, connection): - if value is None: - return - distance_att = connection.ops.get_distance_att_for_field(self.geo_field) - return Distance(**{distance_att: value}) if distance_att else value - - def get_internal_type(self): - return "DistanceField" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/feeds.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/feeds.py deleted file mode 100644 index ebd4511..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/feeds.py +++ /dev/null @@ -1,151 +0,0 @@ -from django.contrib.syndication.views import Feed as BaseFeed -from django.utils.feedgenerator import Atom1Feed, Rss201rev2Feed - - -class GeoFeedMixin: - """ - This mixin provides the necessary routines for SyndicationFeed subclasses - to produce simple GeoRSS or W3C Geo elements. - """ - - def georss_coords(self, coords): - """ - In GeoRSS coordinate pairs are ordered by lat/lon and separated by - a single white space. Given a tuple of coordinates, return a string - GeoRSS representation. - """ - return " ".join("%f %f" % (coord[1], coord[0]) for coord in coords) - - def add_georss_point(self, handler, coords, w3c_geo=False): - """ - Adds a GeoRSS point with the given coords using the given handler. - Handles the differences between simple GeoRSS and the more popular - W3C Geo specification. - """ - if w3c_geo: - lon, lat = coords[:2] - handler.addQuickElement("geo:lat", "%f" % lat) - handler.addQuickElement("geo:lon", "%f" % lon) - else: - handler.addQuickElement("georss:point", self.georss_coords((coords,))) - - def add_georss_element(self, handler, item, w3c_geo=False): - """Add a GeoRSS XML element using the given item and handler.""" - # Getting the Geometry object. - geom = item.get("geometry") - if geom is not None: - if isinstance(geom, (list, tuple)): - # Special case if a tuple/list was passed in. The tuple may be - # a point or a box - box_coords = None - if isinstance(geom[0], (list, tuple)): - # Box: ( (X0, Y0), (X1, Y1) ) - if len(geom) == 2: - box_coords = geom - else: - raise ValueError("Only should be two sets of coordinates.") - else: - if len(geom) == 2: - # Point: (X, Y) - self.add_georss_point(handler, geom, w3c_geo=w3c_geo) - elif len(geom) == 4: - # Box: (X0, Y0, X1, Y1) - box_coords = (geom[:2], geom[2:]) - else: - raise ValueError("Only should be 2 or 4 numeric elements.") - # If a GeoRSS box was given via tuple. - if box_coords is not None: - if w3c_geo: - raise ValueError( - "Cannot use simple GeoRSS box in W3C Geo feeds." - ) - handler.addQuickElement( - "georss:box", self.georss_coords(box_coords) - ) - else: - # Getting the lowercase geometry type. - gtype = str(geom.geom_type).lower() - if gtype == "point": - self.add_georss_point(handler, geom.coords, w3c_geo=w3c_geo) - else: - if w3c_geo: - raise ValueError("W3C Geo only supports Point geometries.") - # For formatting consistent w/the GeoRSS simple standard: - # http://georss.org/1.0#simple - if gtype in ("linestring", "linearring"): - handler.addQuickElement( - "georss:line", self.georss_coords(geom.coords) - ) - elif gtype in ("polygon",): - # Only support the exterior ring. - handler.addQuickElement( - "georss:polygon", self.georss_coords(geom[0].coords) - ) - else: - raise ValueError( - 'Geometry type "%s" not supported.' % geom.geom_type - ) - - -# ### SyndicationFeed subclasses ### -class GeoRSSFeed(Rss201rev2Feed, GeoFeedMixin): - def rss_attributes(self): - attrs = super().rss_attributes() - attrs["xmlns:georss"] = "http://www.georss.org/georss" - return attrs - - def add_item_elements(self, handler, item): - super().add_item_elements(handler, item) - self.add_georss_element(handler, item) - - def add_root_elements(self, handler): - super().add_root_elements(handler) - self.add_georss_element(handler, self.feed) - - -class GeoAtom1Feed(Atom1Feed, GeoFeedMixin): - def root_attributes(self): - attrs = super().root_attributes() - attrs["xmlns:georss"] = "http://www.georss.org/georss" - return attrs - - def add_item_elements(self, handler, item): - super().add_item_elements(handler, item) - self.add_georss_element(handler, item) - - def add_root_elements(self, handler): - super().add_root_elements(handler) - self.add_georss_element(handler, self.feed) - - -class W3CGeoFeed(Rss201rev2Feed, GeoFeedMixin): - def rss_attributes(self): - attrs = super().rss_attributes() - attrs["xmlns:geo"] = "http://www.w3.org/2003/01/geo/wgs84_pos#" - return attrs - - def add_item_elements(self, handler, item): - super().add_item_elements(handler, item) - self.add_georss_element(handler, item, w3c_geo=True) - - def add_root_elements(self, handler): - super().add_root_elements(handler) - self.add_georss_element(handler, self.feed, w3c_geo=True) - - -# ### Feed subclass ### -class Feed(BaseFeed): - """ - This is a subclass of the `Feed` from `django.contrib.syndication`. - This allows users to define a `geometry(obj)` and/or `item_geometry(item)` - methods on their own subclasses so that geo-referenced information may - placed in the feed. - """ - - feed_type = GeoRSSFeed - - def feed_extra_kwargs(self, obj): - return {"geometry": self._get_dynamic_attr("geometry", obj)} - - def item_extra_kwargs(self, item): - return {"geometry": self._get_dynamic_attr("item_geometry", item)} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/forms/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/forms/__init__.py deleted file mode 100644 index c07720b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/forms/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.forms import * # NOQA - -from .fields import ( # NOQA - GeometryCollectionField, - GeometryField, - LineStringField, - MultiLineStringField, - MultiPointField, - MultiPolygonField, - PointField, - PolygonField, -) -from .widgets import BaseGeometryWidget, OpenLayersWidget, OSMWidget # NOQA diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/forms/fields.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/forms/fields.py deleted file mode 100644 index 1fd3153..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/forms/fields.py +++ /dev/null @@ -1,144 +0,0 @@ -from django import forms -from django.contrib.gis.gdal import GDALException -from django.contrib.gis.geos import GEOSException, GEOSGeometry -from django.core.exceptions import ValidationError -from django.utils.translation import gettext_lazy as _ - -from .widgets import OpenLayersWidget - - -class GeometryField(forms.Field): - """ - This is the basic form field for a Geometry. Any textual input that is - accepted by GEOSGeometry is accepted by this form. By default, - this includes WKT, HEXEWKB, WKB (in a buffer), and GeoJSON. - """ - - widget = OpenLayersWidget - geom_type = "GEOMETRY" - - default_error_messages = { - "required": _("No geometry value provided."), - "invalid_geom": _("Invalid geometry value."), - "invalid_geom_type": _("Invalid geometry type."), - "transform_error": _( - "An error occurred when transforming the geometry " - "to the SRID of the geometry form field." - ), - } - - def __init__(self, *, srid=None, geom_type=None, **kwargs): - self.srid = srid - if geom_type is not None: - self.geom_type = geom_type - super().__init__(**kwargs) - self.widget.attrs["geom_type"] = self.geom_type - - def to_python(self, value): - """Transform the value to a Geometry object.""" - if value in self.empty_values: - return None - - if not isinstance(value, GEOSGeometry): - if hasattr(self.widget, "deserialize"): - try: - value = self.widget.deserialize(value) - except GDALException: - value = None - else: - try: - value = GEOSGeometry(value) - except (GEOSException, ValueError, TypeError): - value = None - if value is None: - raise ValidationError( - self.error_messages["invalid_geom"], code="invalid_geom" - ) - - # Try to set the srid - if not value.srid: - try: - value.srid = self.widget.map_srid - except AttributeError: - if self.srid: - value.srid = self.srid - return value - - def clean(self, value): - """ - Validate that the input value can be converted to a Geometry object - and return it. Raise a ValidationError if the value cannot be - instantiated as a Geometry. - """ - geom = super().clean(value) - if geom is None: - return geom - - # Ensuring that the geometry is of the correct type (indicated - # using the OGC string label). - if ( - str(geom.geom_type).upper() != self.geom_type - and self.geom_type != "GEOMETRY" - ): - raise ValidationError( - self.error_messages["invalid_geom_type"], code="invalid_geom_type" - ) - - # Transforming the geometry if the SRID was set. - if self.srid and self.srid != -1 and self.srid != geom.srid: - try: - geom.transform(self.srid) - except GEOSException: - raise ValidationError( - self.error_messages["transform_error"], code="transform_error" - ) - - return geom - - def has_changed(self, initial, data): - """Compare geographic value of data with its initial value.""" - - try: - data = self.to_python(data) - initial = self.to_python(initial) - except ValidationError: - return True - - # Only do a geographic comparison if both values are available - if initial and data: - data.transform(initial.srid) - # If the initial value was not added by the browser, the geometry - # provided may be slightly different, the first time it is saved. - # The comparison is done with a very low tolerance. - return not initial.equals_exact(data, tolerance=0.000001) - else: - # Check for change of state of existence - return bool(initial) != bool(data) - - -class GeometryCollectionField(GeometryField): - geom_type = "GEOMETRYCOLLECTION" - - -class PointField(GeometryField): - geom_type = "POINT" - - -class MultiPointField(GeometryField): - geom_type = "MULTIPOINT" - - -class LineStringField(GeometryField): - geom_type = "LINESTRING" - - -class MultiLineStringField(GeometryField): - geom_type = "MULTILINESTRING" - - -class PolygonField(GeometryField): - geom_type = "POLYGON" - - -class MultiPolygonField(GeometryField): - geom_type = "MULTIPOLYGON" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/forms/widgets.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/forms/widgets.py deleted file mode 100644 index 55895ae..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/forms/widgets.py +++ /dev/null @@ -1,125 +0,0 @@ -import logging - -from django.conf import settings -from django.contrib.gis import gdal -from django.contrib.gis.geometry import json_regex -from django.contrib.gis.geos import GEOSException, GEOSGeometry -from django.forms.widgets import Widget -from django.utils import translation - -logger = logging.getLogger("django.contrib.gis") - - -class BaseGeometryWidget(Widget): - """ - The base class for rich geometry widgets. - Render a map using the WKT of the geometry. - """ - - geom_type = "GEOMETRY" - map_srid = 4326 - display_raw = False - - supports_3d = False - template_name = "" # set on subclasses - - def __init__(self, attrs=None): - self.attrs = {} - for key in ("geom_type", "map_srid", "display_raw"): - self.attrs[key] = getattr(self, key) - if attrs: - self.attrs.update(attrs) - - def serialize(self, value): - return value.wkt if value else "" - - def deserialize(self, value): - try: - return GEOSGeometry(value) - except (GEOSException, ValueError, TypeError) as err: - logger.error("Error creating geometry from value '%s' (%s)", value, err) - return None - - def get_context(self, name, value, attrs): - context = super().get_context(name, value, attrs) - # If a string reaches here (via a validation error on another - # field) then just reconstruct the Geometry. - if value and isinstance(value, str): - value = self.deserialize(value) - - if value: - # Check that srid of value and map match - if value.srid and value.srid != self.map_srid: - try: - ogr = value.ogr - ogr.transform(self.map_srid) - value = ogr - except gdal.GDALException as err: - logger.error( - "Error transforming geometry from srid '%s' to srid '%s' (%s)", - value.srid, - self.map_srid, - err, - ) - - geom_type = gdal.OGRGeomType(self.attrs["geom_type"]).name - context.update( - self.build_attrs( - self.attrs, - { - "name": name, - "module": "geodjango_%s" % name.replace("-", "_"), # JS-safe - "serialized": self.serialize(value), - "geom_type": "Geometry" if geom_type == "Unknown" else geom_type, - "STATIC_URL": settings.STATIC_URL, - "LANGUAGE_BIDI": translation.get_language_bidi(), - **(attrs or {}), - }, - ) - ) - return context - - -class OpenLayersWidget(BaseGeometryWidget): - template_name = "gis/openlayers.html" - map_srid = 3857 - - class Media: - css = { - "all": ( - "https://cdn.jsdelivr.net/npm/ol@v7.2.2/ol.css", - "gis/css/ol3.css", - ) - } - js = ( - "https://cdn.jsdelivr.net/npm/ol@v7.2.2/dist/ol.js", - "gis/js/OLMapWidget.js", - ) - - def serialize(self, value): - return value.json if value else "" - - def deserialize(self, value): - geom = super().deserialize(value) - # GeoJSON assumes WGS84 (4326). Use the map's SRID instead. - if geom and json_regex.match(value) and self.map_srid != 4326: - geom.srid = self.map_srid - return geom - - -class OSMWidget(OpenLayersWidget): - """ - An OpenLayers/OpenStreetMap-based widget. - """ - - template_name = "gis/openlayers-osm.html" - default_lon = 5 - default_lat = 47 - default_zoom = 12 - - def __init__(self, attrs=None): - super().__init__() - for key in ("default_lon", "default_lat", "default_zoom"): - self.attrs[key] = getattr(self, key) - if attrs: - self.attrs.update(attrs) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/LICENSE b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/LICENSE deleted file mode 100644 index 30d410e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2007-2009, Justin Bronn -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of OGRGeometry nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/__init__.py deleted file mode 100644 index 37c9273..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -""" -This module houses ctypes interfaces for GDAL objects. The following GDAL -objects are supported: - -CoordTransform: Used for coordinate transformations from one spatial - reference system to another. - -Driver: Wraps an OGR data source driver. - -DataSource: Wrapper for the OGR data source object, supports - OGR-supported data sources. - -Envelope: A ctypes structure for bounding boxes (GDAL library - not required). - -OGRGeometry: Object for accessing OGR Geometry functionality. - -OGRGeomType: A class for representing the different OGR Geometry - types (GDAL library not required). - -SpatialReference: Represents OSR Spatial Reference objects. - -The GDAL library will be imported from the system path using the default -library name for the current OS. The default library path may be overridden -by setting `GDAL_LIBRARY_PATH` in your settings with the path to the GDAL C -library on your system. -""" - -from django.contrib.gis.gdal.datasource import DataSource -from django.contrib.gis.gdal.driver import Driver -from django.contrib.gis.gdal.envelope import Envelope -from django.contrib.gis.gdal.error import GDALException, SRSException, check_err -from django.contrib.gis.gdal.geometries import OGRGeometry -from django.contrib.gis.gdal.geomtype import OGRGeomType -from django.contrib.gis.gdal.libgdal import ( - GDAL_VERSION, - gdal_full_version, - gdal_version, -) -from django.contrib.gis.gdal.raster.source import GDALRaster -from django.contrib.gis.gdal.srs import AxisOrder, CoordTransform, SpatialReference - -__all__ = ( - "AxisOrder", - "Driver", - "DataSource", - "CoordTransform", - "Envelope", - "GDALException", - "GDALRaster", - "GDAL_VERSION", - "OGRGeometry", - "OGRGeomType", - "SpatialReference", - "SRSException", - "check_err", - "gdal_version", - "gdal_full_version", -) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/base.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/base.py deleted file mode 100644 index 74a2689..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/base.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.contrib.gis.gdal.error import GDALException -from django.contrib.gis.ptr import CPointerBase - - -class GDALBase(CPointerBase): - null_ptr_exception_class = GDALException diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/datasource.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/datasource.py deleted file mode 100644 index 2c9d479..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/datasource.py +++ /dev/null @@ -1,129 +0,0 @@ -""" -DataSource is a wrapper for the OGR Data Source object, which provides -an interface for reading vector geometry data from many different file -formats (including ESRI shapefiles). - -When instantiating a DataSource object, use the filename of a -GDAL-supported data source. For example, a SHP file or a -TIGER/Line file from the government. - -The ds_driver keyword is used internally when a ctypes pointer -is passed in directly. - -Example: - ds = DataSource('/home/foo/bar.shp') - for layer in ds: - for feature in layer: - # Getting the geometry for the feature. - g = feature.geom - - # Getting the 'description' field for the feature. - desc = feature['description'] - - # We can also increment through all of the fields - # attached to this feature. - for field in feature: - # Get the name of the field (e.g. 'description') - nm = field.name - - # Get the type (integer) of the field, e.g. 0 => OFTInteger - t = field.type - - # Returns the value the field; OFTIntegers return ints, - # OFTReal returns floats, all else returns string. - val = field.value -""" - -from pathlib import Path - -from django.contrib.gis.gdal.base import GDALBase -from django.contrib.gis.gdal.driver import Driver -from django.contrib.gis.gdal.error import GDALException -from django.contrib.gis.gdal.layer import Layer -from django.contrib.gis.gdal.prototypes import ds as capi -from django.utils.encoding import force_bytes, force_str - - -# For more information, see the OGR C API documentation: -# https://gdal.org/api/vector_c_api.html -# -# The OGR_DS_* routines are relevant here. -class DataSource(GDALBase): - "Wraps an OGR Data Source object." - - destructor = capi.destroy_ds - - def __init__(self, ds_input, ds_driver=False, write=False, encoding="utf-8"): - # The write flag. - self._write = capi.GDAL_OF_UPDATE if write else capi.GDAL_OF_READONLY - # See also https://gdal.org/development/rfc/rfc23_ogr_unicode.html - self.encoding = encoding - - Driver.ensure_registered() - - if isinstance(ds_input, (str, Path)): - try: - # GDALOpenEx will auto-detect the data source type. - ds = capi.open_ds( - force_bytes(ds_input), - self._write | capi.GDAL_OF_VECTOR, - None, - None, - None, - ) - except GDALException: - # Making the error message more clear rather than something - # like "Invalid pointer returned from OGROpen". - raise GDALException('Could not open the datasource at "%s"' % ds_input) - elif isinstance(ds_input, self.ptr_type) and isinstance( - ds_driver, Driver.ptr_type - ): - ds = ds_input - else: - raise GDALException("Invalid data source input type: %s" % type(ds_input)) - - if ds: - self.ptr = ds - driver = capi.get_dataset_driver(ds) - self.driver = Driver(driver) - else: - # Raise an exception if the returned pointer is NULL - raise GDALException('Invalid data source file "%s"' % ds_input) - - def __getitem__(self, index): - "Allows use of the index [] operator to get a layer at the index." - if isinstance(index, str): - try: - layer = capi.get_layer_by_name(self.ptr, force_bytes(index)) - except GDALException: - raise IndexError("Invalid OGR layer name given: %s." % index) - elif isinstance(index, int): - if 0 <= index < self.layer_count: - layer = capi.get_layer(self._ptr, index) - else: - raise IndexError( - "Index out of range when accessing layers in a datasource: %s." - % index - ) - else: - raise TypeError("Invalid index type: %s" % type(index)) - return Layer(layer, self) - - def __len__(self): - "Return the number of layers within the data source." - return self.layer_count - - def __str__(self): - "Return OGR GetName and Driver for the Data Source." - return "%s (%s)" % (self.name, self.driver) - - @property - def layer_count(self): - "Return the number of layers in the data source." - return capi.get_layer_count(self._ptr) - - @property - def name(self): - "Return the name of the data source." - name = capi.get_ds_name(self._ptr) - return force_str(name, self.encoding, strings_only=True) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/driver.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/driver.py deleted file mode 100644 index 1d4ca4c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/driver.py +++ /dev/null @@ -1,94 +0,0 @@ -from ctypes import c_void_p - -from django.contrib.gis.gdal.base import GDALBase -from django.contrib.gis.gdal.error import GDALException -from django.contrib.gis.gdal.prototypes import ds as capi -from django.utils.encoding import force_bytes, force_str - - -class Driver(GDALBase): - """ - Wrap a GDAL/OGR Data Source Driver. - For more information, see the C API documentation: - https://gdal.org/api/vector_c_api.html - https://gdal.org/api/raster_c_api.html - """ - - # Case-insensitive aliases for some GDAL/OGR Drivers. - # For a complete list of original driver names see - # https://gdal.org/drivers/vector/ - # https://gdal.org/drivers/raster/ - _alias = { - # vector - "esri": "ESRI Shapefile", - "shp": "ESRI Shapefile", - "shape": "ESRI Shapefile", - "tiger": "TIGER", - "tiger/line": "TIGER", - # raster - "tiff": "GTiff", - "tif": "GTiff", - "jpeg": "JPEG", - "jpg": "JPEG", - } - - def __init__(self, dr_input): - """ - Initialize an GDAL/OGR driver on either a string or integer input. - """ - if isinstance(dr_input, str): - # If a string name of the driver was passed in - self.ensure_registered() - - # Checking the alias dictionary (case-insensitive) to see if an - # alias exists for the given driver. - if dr_input.lower() in self._alias: - name = self._alias[dr_input.lower()] - else: - name = dr_input - - # Attempting to get the GDAL/OGR driver by the string name. - driver = c_void_p(capi.get_driver_by_name(force_bytes(name))) - elif isinstance(dr_input, int): - self.ensure_registered() - driver = capi.get_driver(dr_input) - elif isinstance(dr_input, c_void_p): - driver = dr_input - else: - raise GDALException( - "Unrecognized input type for GDAL/OGR Driver: %s" % type(dr_input) - ) - - # Making sure we get a valid pointer to the OGR Driver - if not driver: - raise GDALException( - "Could not initialize GDAL/OGR Driver on input: %s" % dr_input - ) - self.ptr = driver - - def __str__(self): - return self.name - - @classmethod - def ensure_registered(cls): - """ - Attempt to register all the data source drivers. - """ - # Only register all if the driver count is 0 (or else all drivers will - # be registered over and over again). - if not capi.get_driver_count(): - capi.register_all() - - @classmethod - def driver_count(cls): - """ - Return the number of GDAL/OGR data source drivers registered. - """ - return capi.get_driver_count() - - @property - def name(self): - """ - Return description/name string for this driver. - """ - return force_str(capi.get_driver_description(self.ptr)) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/envelope.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/envelope.py deleted file mode 100644 index 24383de..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/envelope.py +++ /dev/null @@ -1,205 +0,0 @@ -""" -The GDAL/OGR library uses an Envelope structure to hold the bounding -box information for a geometry. The envelope (bounding box) contains -two pairs of coordinates, one for the lower left coordinate and one -for the upper right coordinate: - - +----------o Upper right; (max_x, max_y) - | | - | | - | | -Lower left (min_x, min_y) o----------+ -""" - -from ctypes import Structure, c_double - -from django.contrib.gis.gdal.error import GDALException - - -# The OGR definition of an Envelope is a C structure containing four doubles. -# See the 'ogr_core.h' source file for more information: -# https://gdal.org/doxygen/ogr__core_8h_source.html -class OGREnvelope(Structure): - "Represent the OGREnvelope C Structure." - - _fields_ = [ - ("MinX", c_double), - ("MaxX", c_double), - ("MinY", c_double), - ("MaxY", c_double), - ] - - -class Envelope: - """ - The Envelope object is a C structure that contains the minimum and - maximum X, Y coordinates for a rectangle bounding box. The naming - of the variables is compatible with the OGR Envelope structure. - """ - - def __init__(self, *args): - """ - The initialization function may take an OGREnvelope structure, 4-element - tuple or list, or 4 individual arguments. - """ - - if len(args) == 1: - if isinstance(args[0], OGREnvelope): - # OGREnvelope (a ctypes Structure) was passed in. - self._envelope = args[0] - elif isinstance(args[0], (tuple, list)): - # A tuple was passed in. - if len(args[0]) != 4: - raise GDALException( - "Incorrect number of tuple elements (%d)." % len(args[0]) - ) - else: - self._from_sequence(args[0]) - else: - raise TypeError("Incorrect type of argument: %s" % type(args[0])) - elif len(args) == 4: - # Individual parameters passed in. - # Thanks to ww for the help - self._from_sequence([float(a) for a in args]) - else: - raise GDALException("Incorrect number (%d) of arguments." % len(args)) - - # Checking the x,y coordinates - if self.min_x > self.max_x: - raise GDALException("Envelope minimum X > maximum X.") - if self.min_y > self.max_y: - raise GDALException("Envelope minimum Y > maximum Y.") - - def __eq__(self, other): - """ - Return True if the envelopes are equivalent; can compare against - other Envelopes and 4-tuples. - """ - if isinstance(other, Envelope): - return ( - (self.min_x == other.min_x) - and (self.min_y == other.min_y) - and (self.max_x == other.max_x) - and (self.max_y == other.max_y) - ) - elif isinstance(other, tuple) and len(other) == 4: - return ( - (self.min_x == other[0]) - and (self.min_y == other[1]) - and (self.max_x == other[2]) - and (self.max_y == other[3]) - ) - else: - raise GDALException("Equivalence testing only works with other Envelopes.") - - def __str__(self): - "Return a string representation of the tuple." - return str(self.tuple) - - def _from_sequence(self, seq): - "Initialize the C OGR Envelope structure from the given sequence." - self._envelope = OGREnvelope() - self._envelope.MinX = seq[0] - self._envelope.MinY = seq[1] - self._envelope.MaxX = seq[2] - self._envelope.MaxY = seq[3] - - def expand_to_include(self, *args): - """ - Modify the envelope to expand to include the boundaries of - the passed-in 2-tuple (a point), 4-tuple (an extent) or - envelope. - """ - # We provide a number of different signatures for this method, - # and the logic here is all about converting them into a - # 4-tuple single parameter which does the actual work of - # expanding the envelope. - if len(args) == 1: - if isinstance(args[0], Envelope): - return self.expand_to_include(args[0].tuple) - elif hasattr(args[0], "x") and hasattr(args[0], "y"): - return self.expand_to_include( - args[0].x, args[0].y, args[0].x, args[0].y - ) - elif isinstance(args[0], (tuple, list)): - # A tuple was passed in. - if len(args[0]) == 2: - return self.expand_to_include( - (args[0][0], args[0][1], args[0][0], args[0][1]) - ) - elif len(args[0]) == 4: - (minx, miny, maxx, maxy) = args[0] - if minx < self._envelope.MinX: - self._envelope.MinX = minx - if miny < self._envelope.MinY: - self._envelope.MinY = miny - if maxx > self._envelope.MaxX: - self._envelope.MaxX = maxx - if maxy > self._envelope.MaxY: - self._envelope.MaxY = maxy - else: - raise GDALException( - "Incorrect number of tuple elements (%d)." % len(args[0]) - ) - else: - raise TypeError("Incorrect type of argument: %s" % type(args[0])) - elif len(args) == 2: - # An x and an y parameter were passed in - return self.expand_to_include((args[0], args[1], args[0], args[1])) - elif len(args) == 4: - # Individual parameters passed in. - return self.expand_to_include(args) - else: - raise GDALException("Incorrect number (%d) of arguments." % len(args[0])) - - @property - def min_x(self): - "Return the value of the minimum X coordinate." - return self._envelope.MinX - - @property - def min_y(self): - "Return the value of the minimum Y coordinate." - return self._envelope.MinY - - @property - def max_x(self): - "Return the value of the maximum X coordinate." - return self._envelope.MaxX - - @property - def max_y(self): - "Return the value of the maximum Y coordinate." - return self._envelope.MaxY - - @property - def ur(self): - "Return the upper-right coordinate." - return (self.max_x, self.max_y) - - @property - def ll(self): - "Return the lower-left coordinate." - return (self.min_x, self.min_y) - - @property - def tuple(self): - "Return a tuple representing the envelope." - return (self.min_x, self.min_y, self.max_x, self.max_y) - - @property - def wkt(self): - "Return WKT representing a Polygon for this envelope." - # TODO: Fix significant figures. - return "POLYGON((%s %s,%s %s,%s %s,%s %s,%s %s))" % ( - self.min_x, - self.min_y, - self.min_x, - self.max_y, - self.max_x, - self.max_y, - self.max_x, - self.min_y, - self.min_x, - self.min_y, - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/error.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/error.py deleted file mode 100644 index 08ad5c3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/error.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -This module houses the GDAL & SRS Exception objects, and the -check_err() routine which checks the status code returned by -GDAL/OGR methods. -""" - - -# #### GDAL & SRS Exceptions #### -class GDALException(Exception): - pass - - -class SRSException(Exception): - pass - - -# #### GDAL/OGR error checking codes and routine #### - -# OGR Error Codes -OGRERR_DICT = { - 1: (GDALException, "Not enough data."), - 2: (GDALException, "Not enough memory."), - 3: (GDALException, "Unsupported geometry type."), - 4: (GDALException, "Unsupported operation."), - 5: (GDALException, "Corrupt data."), - 6: (GDALException, "OGR failure."), - 7: (SRSException, "Unsupported SRS."), - 8: (GDALException, "Invalid handle."), -} - -# CPL Error Codes -# https://gdal.org/api/cpl.html#cpl-error-h -CPLERR_DICT = { - 1: (GDALException, "AppDefined"), - 2: (GDALException, "OutOfMemory"), - 3: (GDALException, "FileIO"), - 4: (GDALException, "OpenFailed"), - 5: (GDALException, "IllegalArg"), - 6: (GDALException, "NotSupported"), - 7: (GDALException, "AssertionFailed"), - 8: (GDALException, "NoWriteAccess"), - 9: (GDALException, "UserInterrupt"), - 10: (GDALException, "ObjectNull"), -} - -ERR_NONE = 0 - - -def check_err(code, cpl=False): - """ - Check the given CPL/OGRERR and raise an exception where appropriate. - """ - err_dict = CPLERR_DICT if cpl else OGRERR_DICT - - if code == ERR_NONE: - return - elif code in err_dict: - e, msg = err_dict[code] - raise e(msg) - else: - raise GDALException('Unknown error code: "%s"' % code) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/feature.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/feature.py deleted file mode 100644 index 6f08969..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/feature.py +++ /dev/null @@ -1,120 +0,0 @@ -from django.contrib.gis.gdal.base import GDALBase -from django.contrib.gis.gdal.error import GDALException -from django.contrib.gis.gdal.field import Field -from django.contrib.gis.gdal.geometries import OGRGeometry, OGRGeomType -from django.contrib.gis.gdal.prototypes import ds as capi -from django.contrib.gis.gdal.prototypes import geom as geom_api -from django.utils.encoding import force_bytes, force_str - - -# For more information, see the OGR C API source code: -# https://gdal.org/api/vector_c_api.html -# -# The OGR_F_* routines are relevant here. -class Feature(GDALBase): - """ - This class that wraps an OGR Feature, needs to be instantiated - from a Layer object. - """ - - destructor = capi.destroy_feature - - def __init__(self, feat, layer): - """ - Initialize Feature from a pointer and its Layer object. - """ - if not feat: - raise GDALException("Cannot create OGR Feature, invalid pointer given.") - self.ptr = feat - self._layer = layer - - def __getitem__(self, index): - """ - Get the Field object at the specified index, which may be either - an integer or the Field's string label. Note that the Field object - is not the field's _value_ -- use the `get` method instead to - retrieve the value (e.g. an integer) instead of a Field instance. - """ - if isinstance(index, str): - i = self.index(index) - elif 0 <= index < self.num_fields: - i = index - else: - raise IndexError( - "Index out of range when accessing field in a feature: %s." % index - ) - return Field(self, i) - - def __len__(self): - "Return the count of fields in this feature." - return self.num_fields - - def __str__(self): - "The string name of the feature." - return "Feature FID %d in Layer<%s>" % (self.fid, self.layer_name) - - def __eq__(self, other): - "Do equivalence testing on the features." - return bool(capi.feature_equal(self.ptr, other._ptr)) - - # #### Feature Properties #### - @property - def encoding(self): - return self._layer._ds.encoding - - @property - def fid(self): - "Return the feature identifier." - return capi.get_fid(self.ptr) - - @property - def layer_name(self): - "Return the name of the layer for the feature." - name = capi.get_feat_name(self._layer._ldefn) - return force_str(name, self.encoding, strings_only=True) - - @property - def num_fields(self): - "Return the number of fields in the Feature." - return capi.get_feat_field_count(self.ptr) - - @property - def fields(self): - "Return a list of fields in the Feature." - return [ - force_str( - capi.get_field_name(capi.get_field_defn(self._layer._ldefn, i)), - self.encoding, - strings_only=True, - ) - for i in range(self.num_fields) - ] - - @property - def geom(self): - "Return the OGR Geometry for this Feature." - # Retrieving the geometry pointer for the feature. - geom_ptr = capi.get_feat_geom_ref(self.ptr) - return OGRGeometry(geom_api.clone_geom(geom_ptr)) - - @property - def geom_type(self): - "Return the OGR Geometry Type for this Feature." - return OGRGeomType(capi.get_fd_geom_type(self._layer._ldefn)) - - # #### Feature Methods #### - def get(self, field): - """ - Return the value of the field, instead of an instance of the Field - object. May take a string of the field name or a Field object as - parameters. - """ - field_name = getattr(field, "name", field) - return self[field_name].value - - def index(self, field_name): - "Return the index of the given field name." - i = capi.get_field_index(self.ptr, force_bytes(field_name)) - if i < 0: - raise IndexError("Invalid OFT field name given: %s." % field_name) - return i diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/field.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/field.py deleted file mode 100644 index 5374f6c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/field.py +++ /dev/null @@ -1,253 +0,0 @@ -from ctypes import byref, c_int -from datetime import date, datetime, time - -from django.contrib.gis.gdal.base import GDALBase -from django.contrib.gis.gdal.error import GDALException -from django.contrib.gis.gdal.prototypes import ds as capi -from django.utils.encoding import force_str - - -# For more information, see the OGR C API source code: -# https://gdal.org/api/vector_c_api.html -# -# The OGR_Fld_* routines are relevant here. -class Field(GDALBase): - """ - Wrap an OGR Field. Needs to be instantiated from a Feature object. - """ - - def __init__(self, feat, index): - """ - Initialize on the feature object and the integer index of - the field within the feature. - """ - # Setting the feature pointer and index. - self._feat = feat - self._index = index - - # Getting the pointer for this field. - fld_ptr = capi.get_feat_field_defn(feat.ptr, index) - if not fld_ptr: - raise GDALException("Cannot create OGR Field, invalid pointer given.") - self.ptr = fld_ptr - - # Setting the class depending upon the OGR Field Type (OFT) - self.__class__ = OGRFieldTypes[self.type] - - def __str__(self): - "Return the string representation of the Field." - return str(self.value).strip() - - # #### Field Methods #### - def as_double(self): - "Retrieve the Field's value as a double (float)." - return ( - capi.get_field_as_double(self._feat.ptr, self._index) - if self.is_set - else None - ) - - def as_int(self, is_64=False): - "Retrieve the Field's value as an integer." - if is_64: - return ( - capi.get_field_as_integer64(self._feat.ptr, self._index) - if self.is_set - else None - ) - else: - return ( - capi.get_field_as_integer(self._feat.ptr, self._index) - if self.is_set - else None - ) - - def as_string(self): - "Retrieve the Field's value as a string." - if not self.is_set: - return None - string = capi.get_field_as_string(self._feat.ptr, self._index) - return force_str(string, encoding=self._feat.encoding, strings_only=True) - - def as_datetime(self): - "Retrieve the Field's value as a tuple of date & time components." - if not self.is_set: - return None - yy, mm, dd, hh, mn, ss, tz = [c_int() for i in range(7)] - status = capi.get_field_as_datetime( - self._feat.ptr, - self._index, - byref(yy), - byref(mm), - byref(dd), - byref(hh), - byref(mn), - byref(ss), - byref(tz), - ) - if status: - return (yy, mm, dd, hh, mn, ss, tz) - else: - raise GDALException( - "Unable to retrieve date & time information from the field." - ) - - # #### Field Properties #### - @property - def is_set(self): - "Return True if the value of this field isn't null, False otherwise." - return capi.is_field_set(self._feat.ptr, self._index) - - @property - def name(self): - "Return the name of this Field." - name = capi.get_field_name(self.ptr) - return force_str(name, encoding=self._feat.encoding, strings_only=True) - - @property - def precision(self): - "Return the precision of this Field." - return capi.get_field_precision(self.ptr) - - @property - def type(self): - "Return the OGR type of this Field." - return capi.get_field_type(self.ptr) - - @property - def type_name(self): - "Return the OGR field type name for this Field." - return capi.get_field_type_name(self.type) - - @property - def value(self): - "Return the value of this Field." - # Default is to get the field as a string. - return self.as_string() - - @property - def width(self): - "Return the width of this Field." - return capi.get_field_width(self.ptr) - - -# ### The Field sub-classes for each OGR Field type. ### -class OFTInteger(Field): - _bit64 = False - - @property - def value(self): - "Return an integer contained in this field." - return self.as_int(self._bit64) - - @property - def type(self): - """ - GDAL uses OFTReals to represent OFTIntegers in created - shapefiles -- forcing the type here since the underlying field - type may actually be OFTReal. - """ - return 0 - - -class OFTReal(Field): - @property - def value(self): - "Return a float contained in this field." - return self.as_double() - - -# String & Binary fields, just subclasses -class OFTString(Field): - pass - - -class OFTWideString(Field): - pass - - -class OFTBinary(Field): - pass - - -# OFTDate, OFTTime, OFTDateTime fields. -class OFTDate(Field): - @property - def value(self): - "Return a Python `date` object for the OFTDate field." - try: - yy, mm, dd, hh, mn, ss, tz = self.as_datetime() - return date(yy.value, mm.value, dd.value) - except (TypeError, ValueError, GDALException): - return None - - -class OFTDateTime(Field): - @property - def value(self): - "Return a Python `datetime` object for this OFTDateTime field." - # TODO: Adapt timezone information. - # See https://lists.osgeo.org/pipermail/gdal-dev/2006-February/007990.html - # The `tz` variable has values of: 0=unknown, 1=localtime (ambiguous), - # 100=GMT, 104=GMT+1, 80=GMT-5, etc. - try: - yy, mm, dd, hh, mn, ss, tz = self.as_datetime() - return datetime(yy.value, mm.value, dd.value, hh.value, mn.value, ss.value) - except (TypeError, ValueError, GDALException): - return None - - -class OFTTime(Field): - @property - def value(self): - "Return a Python `time` object for this OFTTime field." - try: - yy, mm, dd, hh, mn, ss, tz = self.as_datetime() - return time(hh.value, mn.value, ss.value) - except (ValueError, GDALException): - return None - - -class OFTInteger64(OFTInteger): - _bit64 = True - - -# List fields are also just subclasses -class OFTIntegerList(Field): - pass - - -class OFTRealList(Field): - pass - - -class OFTStringList(Field): - pass - - -class OFTWideStringList(Field): - pass - - -class OFTInteger64List(Field): - pass - - -# Class mapping dictionary for OFT Types and reverse mapping. -OGRFieldTypes = { - 0: OFTInteger, - 1: OFTIntegerList, - 2: OFTReal, - 3: OFTRealList, - 4: OFTString, - 5: OFTStringList, - 6: OFTWideString, - 7: OFTWideStringList, - 8: OFTBinary, - 9: OFTDate, - 10: OFTTime, - 11: OFTDateTime, - 12: OFTInteger64, - 13: OFTInteger64List, -} -ROGRFieldTypes = {cls: num for num, cls in OGRFieldTypes.items()} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/geometries.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/geometries.py deleted file mode 100644 index 33e7de0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/geometries.py +++ /dev/null @@ -1,881 +0,0 @@ -""" -The OGRGeometry is a wrapper for using the OGR Geometry class -(see https://gdal.org/api/ogrgeometry_cpp.html#_CPPv411OGRGeometry). -OGRGeometry may be instantiated when reading geometries from OGR Data Sources -(e.g. SHP files), or when given OGC WKT (a string). - -While the 'full' API is not present yet, the API is "pythonic" unlike -the traditional and "next-generation" OGR Python bindings. One major -advantage OGR Geometries have over their GEOS counterparts is support -for spatial reference systems and their transformation. - -Example: - >>> from django.contrib.gis.gdal import OGRGeometry, OGRGeomType, SpatialReference - >>> wkt1, wkt2 = 'POINT(-90 30)', 'POLYGON((0 0, 5 0, 5 5, 0 5)' - >>> pnt = OGRGeometry(wkt1) - >>> print(pnt) - POINT (-90 30) - >>> mpnt = OGRGeometry(OGRGeomType('MultiPoint'), SpatialReference('WGS84')) - >>> mpnt.add(wkt1) - >>> mpnt.add(wkt1) - >>> print(mpnt) - MULTIPOINT (-90 30,-90 30) - >>> print(mpnt.srs.name) - WGS 84 - >>> print(mpnt.srs.proj) - +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs - >>> mpnt.transform(SpatialReference('NAD27')) - >>> print(mpnt.proj) - +proj=longlat +ellps=clrk66 +datum=NAD27 +no_defs - >>> print(mpnt) - MULTIPOINT (-89.99993037860248 29.99979788655764,-89.99993037860248 29.99979788655764) - - The OGRGeomType class is to make it easy to specify an OGR geometry type: - >>> from django.contrib.gis.gdal import OGRGeomType - >>> gt1 = OGRGeomType(3) # Using an integer for the type - >>> gt2 = OGRGeomType('Polygon') # Using a string - >>> gt3 = OGRGeomType('POLYGON') # It's case-insensitive - >>> print(gt1 == 3, gt1 == 'Polygon') # Equivalence works w/non-OGRGeomType objects - True True -""" - -import sys -import warnings -from binascii import b2a_hex -from ctypes import byref, c_char_p, c_double, c_ubyte, c_void_p, string_at - -from django.contrib.gis.gdal.base import GDALBase -from django.contrib.gis.gdal.envelope import Envelope, OGREnvelope -from django.contrib.gis.gdal.error import GDALException, SRSException -from django.contrib.gis.gdal.geomtype import OGRGeomType -from django.contrib.gis.gdal.prototypes import geom as capi -from django.contrib.gis.gdal.prototypes import srs as srs_api -from django.contrib.gis.gdal.srs import CoordTransform, SpatialReference -from django.contrib.gis.geometry import hex_regex, json_regex, wkt_regex -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.encoding import force_bytes - - -# For more information, see the OGR C API source code: -# https://gdal.org/api/vector_c_api.html -# -# The OGR_G_* routines are relevant here. -class OGRGeometry(GDALBase): - """Encapsulate an OGR geometry.""" - - destructor = capi.destroy_geom - geos_support = True - - def __init__(self, geom_input, srs=None): - """Initialize Geometry on either WKT or an OGR pointer as input.""" - str_instance = isinstance(geom_input, str) - - # If HEX, unpack input to a binary buffer. - if str_instance and hex_regex.match(geom_input): - geom_input = memoryview(bytes.fromhex(geom_input)) - str_instance = False - - # Constructing the geometry, - if str_instance: - wkt_m = wkt_regex.match(geom_input) - json_m = json_regex.match(geom_input) - if wkt_m: - if wkt_m["srid"]: - # If there's EWKT, set the SRS w/value of the SRID. - srs = int(wkt_m["srid"]) - if wkt_m["type"].upper() == "LINEARRING": - # OGR_G_CreateFromWkt doesn't work with LINEARRING WKT. - # See https://trac.osgeo.org/gdal/ticket/1992. - g = capi.create_geom(OGRGeomType(wkt_m["type"]).num) - capi.import_wkt(g, byref(c_char_p(wkt_m["wkt"].encode()))) - else: - g = capi.from_wkt( - byref(c_char_p(wkt_m["wkt"].encode())), None, byref(c_void_p()) - ) - elif json_m: - g = self._from_json(geom_input.encode()) - else: - # Seeing if the input is a valid short-hand string - # (e.g., 'Point', 'POLYGON'). - OGRGeomType(geom_input) - g = capi.create_geom(OGRGeomType(geom_input).num) - elif isinstance(geom_input, memoryview): - # WKB was passed in - g = self._from_wkb(geom_input) - elif isinstance(geom_input, OGRGeomType): - # OGRGeomType was passed in, an empty geometry will be created. - g = capi.create_geom(geom_input.num) - elif isinstance(geom_input, self.ptr_type): - # OGR pointer (c_void_p) was the input. - g = geom_input - else: - raise GDALException( - "Invalid input type for OGR Geometry construction: %s" - % type(geom_input) - ) - - # Now checking the Geometry pointer before finishing initialization - # by setting the pointer for the object. - if not g: - raise GDALException( - "Cannot create OGR Geometry from input: %s" % geom_input - ) - self.ptr = g - - # Assigning the SpatialReference object to the geometry, if valid. - if srs: - self.srs = srs - - # Setting the class depending upon the OGR Geometry Type - if (geo_class := GEO_CLASSES.get(self.geom_type.num)) is None: - raise TypeError(f"Unsupported geometry type: {self.geom_type}") - self.__class__ = geo_class - - # Pickle routines - def __getstate__(self): - srs = self.srs - if srs: - srs = srs.wkt - else: - srs = None - return bytes(self.wkb), srs - - def __setstate__(self, state): - wkb, srs = state - ptr = capi.from_wkb(wkb, None, byref(c_void_p()), len(wkb)) - if not ptr: - raise GDALException("Invalid OGRGeometry loaded from pickled state.") - self.ptr = ptr - self.srs = srs - - @classmethod - def _from_wkb(cls, geom_input): - return capi.from_wkb( - bytes(geom_input), None, byref(c_void_p()), len(geom_input) - ) - - @staticmethod - def _from_json(geom_input): - return capi.from_json(geom_input) - - @classmethod - def from_bbox(cls, bbox): - "Construct a Polygon from a bounding box (4-tuple)." - x0, y0, x1, y1 = bbox - return OGRGeometry( - "POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s))" - % (x0, y0, x0, y1, x1, y1, x1, y0, x0, y0) - ) - - @staticmethod - def from_json(geom_input): - return OGRGeometry(OGRGeometry._from_json(force_bytes(geom_input))) - - @classmethod - def from_gml(cls, gml_string): - return cls(capi.from_gml(force_bytes(gml_string))) - - # ### Geometry set-like operations ### - # g = g1 | g2 - def __or__(self, other): - "Return the union of the two geometries." - return self.union(other) - - # g = g1 & g2 - def __and__(self, other): - "Return the intersection of this Geometry and the other." - return self.intersection(other) - - # g = g1 - g2 - def __sub__(self, other): - "Return the difference this Geometry and the other." - return self.difference(other) - - # g = g1 ^ g2 - def __xor__(self, other): - "Return the symmetric difference of this Geometry and the other." - return self.sym_difference(other) - - def __eq__(self, other): - "Is this Geometry equal to the other?" - return isinstance(other, OGRGeometry) and self.equals(other) - - def __str__(self): - "WKT is used for the string representation." - return self.wkt - - # #### Geometry Properties #### - @property - def dimension(self): - "Return 0 for points, 1 for lines, and 2 for surfaces." - return capi.get_dims(self.ptr) - - @property - def coord_dim(self): - "Return the coordinate dimension of the Geometry." - return capi.get_coord_dim(self.ptr) - - # RemovedInDjango60Warning - @coord_dim.setter - def coord_dim(self, dim): - "Set the coordinate dimension of this Geometry." - msg = "coord_dim setter is deprecated. Use set_3d() instead." - warnings.warn(msg, RemovedInDjango60Warning, stacklevel=2) - if dim not in (2, 3): - raise ValueError("Geometry dimension must be either 2 or 3") - capi.set_coord_dim(self.ptr, dim) - - @property - def geom_count(self): - "Return the number of elements in this Geometry." - return capi.get_geom_count(self.ptr) - - @property - def point_count(self): - "Return the number of Points in this Geometry." - return capi.get_point_count(self.ptr) - - @property - def num_points(self): - "Alias for `point_count` (same name method in GEOS API.)" - return self.point_count - - @property - def num_coords(self): - "Alias for `point_count`." - return self.point_count - - @property - def geom_type(self): - "Return the Type for this Geometry." - return OGRGeomType(capi.get_geom_type(self.ptr)) - - @property - def geom_name(self): - "Return the Name of this Geometry." - return capi.get_geom_name(self.ptr) - - @property - def area(self): - "Return the area for a LinearRing, Polygon, or MultiPolygon; 0 otherwise." - return capi.get_area(self.ptr) - - @property - def envelope(self): - "Return the envelope for this Geometry." - # TODO: Fix Envelope() for Point geometries. - return Envelope(capi.get_envelope(self.ptr, byref(OGREnvelope()))) - - @property - def empty(self): - return capi.is_empty(self.ptr) - - @property - def extent(self): - "Return the envelope as a 4-tuple, instead of as an Envelope object." - return self.envelope.tuple - - @property - def is_3d(self): - """Return True if the geometry has Z coordinates.""" - return capi.is_3d(self.ptr) - - def set_3d(self, value): - """Set if this geometry has Z coordinates.""" - if value is True: - capi.set_3d(self.ptr, 1) - elif value is False: - capi.set_3d(self.ptr, 0) - else: - raise ValueError(f"Input to 'set_3d' must be a boolean, got '{value!r}'.") - - @property - def is_measured(self): - """Return True if the geometry has M coordinates.""" - return capi.is_measured(self.ptr) - - def set_measured(self, value): - """Set if this geometry has M coordinates.""" - if value is True: - capi.set_measured(self.ptr, 1) - elif value is False: - capi.set_measured(self.ptr, 0) - else: - raise ValueError( - f"Input to 'set_measured' must be a boolean, got '{value!r}'." - ) - - @property - def has_curve(self): - """Return True if the geometry is or has curve geometry.""" - return capi.has_curve_geom(self.ptr, 0) - - def get_linear_geometry(self): - """Return a linear version of this geometry.""" - return OGRGeometry(capi.get_linear_geom(self.ptr, 0, None)) - - def get_curve_geometry(self): - """Return a curve version of this geometry.""" - return OGRGeometry(capi.get_curve_geom(self.ptr, None)) - - # #### SpatialReference-related Properties #### - - # The SRS property - def _get_srs(self): - "Return the Spatial Reference for this Geometry." - try: - srs_ptr = capi.get_geom_srs(self.ptr) - return SpatialReference(srs_api.clone_srs(srs_ptr)) - except SRSException: - return None - - def _set_srs(self, srs): - "Set the SpatialReference for this geometry." - # Do not have to clone the `SpatialReference` object pointer because - # when it is assigned to this `OGRGeometry` it's internal OGR - # reference count is incremented, and will likewise be released - # (decremented) when this geometry's destructor is called. - if isinstance(srs, SpatialReference): - srs_ptr = srs.ptr - elif isinstance(srs, (int, str)): - sr = SpatialReference(srs) - srs_ptr = sr.ptr - elif srs is None: - srs_ptr = None - else: - raise TypeError( - "Cannot assign spatial reference with object of type: %s" % type(srs) - ) - capi.assign_srs(self.ptr, srs_ptr) - - srs = property(_get_srs, _set_srs) - - # The SRID property - def _get_srid(self): - srs = self.srs - if srs: - return srs.srid - return None - - def _set_srid(self, srid): - if isinstance(srid, int) or srid is None: - self.srs = srid - else: - raise TypeError("SRID must be set with an integer.") - - srid = property(_get_srid, _set_srid) - - # #### Output Methods #### - def _geos_ptr(self): - from django.contrib.gis.geos import GEOSGeometry - - return GEOSGeometry._from_wkb(self.wkb) - - @property - def geos(self): - "Return a GEOSGeometry object from this OGRGeometry." - if self.geos_support: - from django.contrib.gis.geos import GEOSGeometry - - return GEOSGeometry(self._geos_ptr(), self.srid) - else: - from django.contrib.gis.geos import GEOSException - - raise GEOSException(f"GEOS does not support {self.__class__.__qualname__}.") - - @property - def gml(self): - "Return the GML representation of the Geometry." - return capi.to_gml(self.ptr) - - @property - def hex(self): - "Return the hexadecimal representation of the WKB (a string)." - return b2a_hex(self.wkb).upper() - - @property - def json(self): - """ - Return the GeoJSON representation of this Geometry. - """ - return capi.to_json(self.ptr) - - geojson = json - - @property - def kml(self): - "Return the KML representation of the Geometry." - return capi.to_kml(self.ptr, None) - - @property - def wkb_size(self): - "Return the size of the WKB buffer." - return capi.get_wkbsize(self.ptr) - - @property - def wkb(self): - "Return the WKB representation of the Geometry." - if sys.byteorder == "little": - byteorder = 1 # wkbNDR (from ogr_core.h) - else: - byteorder = 0 # wkbXDR - sz = self.wkb_size - # Creating the unsigned character buffer, and passing it in by reference. - buf = (c_ubyte * sz)() - # For backward compatibility, export old-style 99-402 extended - # dimension types when geometry does not have an M dimension. - # https://gdal.org/api/vector_c_api.html#_CPPv417OGR_G_ExportToWkb12OGRGeometryH15OGRwkbByteOrderPh - to_wkb = capi.to_iso_wkb if self.is_measured else capi.to_wkb - to_wkb(self.ptr, byteorder, byref(buf)) - # Returning a buffer of the string at the pointer. - return memoryview(string_at(buf, sz)) - - @property - def wkt(self): - "Return the WKT representation of the Geometry." - # For backward compatibility, export old-style 99-402 extended - # dimension types when geometry does not have an M dimension. - # https://gdal.org/api/vector_c_api.html#_CPPv417OGR_G_ExportToWkt12OGRGeometryHPPc - to_wkt = capi.to_iso_wkt if self.is_measured else capi.to_wkt - return to_wkt(self.ptr, byref(c_char_p())) - - @property - def ewkt(self): - "Return the EWKT representation of the Geometry." - srs = self.srs - if srs and srs.srid: - return "SRID=%s;%s" % (srs.srid, self.wkt) - else: - return self.wkt - - # #### Geometry Methods #### - def clone(self): - "Clone this OGR Geometry." - return OGRGeometry(capi.clone_geom(self.ptr), self.srs) - - def close_rings(self): - """ - If there are any rings within this geometry that have not been - closed, this routine will do so by adding the starting point at the - end. - """ - # Closing the open rings. - capi.geom_close_rings(self.ptr) - - def transform(self, coord_trans, clone=False): - """ - Transform this geometry to a different spatial reference system. - May take a CoordTransform object, a SpatialReference object, string - WKT or PROJ, and/or an integer SRID. By default, return nothing - and transform the geometry in-place. However, if the `clone` keyword is - set, return a transformed clone of this geometry. - """ - if clone: - klone = self.clone() - klone.transform(coord_trans) - return klone - - # Depending on the input type, use the appropriate OGR routine - # to perform the transformation. - if isinstance(coord_trans, CoordTransform): - capi.geom_transform(self.ptr, coord_trans.ptr) - elif isinstance(coord_trans, SpatialReference): - capi.geom_transform_to(self.ptr, coord_trans.ptr) - elif isinstance(coord_trans, (int, str)): - sr = SpatialReference(coord_trans) - capi.geom_transform_to(self.ptr, sr.ptr) - else: - raise TypeError( - "Transform only accepts CoordTransform, " - "SpatialReference, string, and integer objects." - ) - - # #### Topology Methods #### - def _topology(self, func, other): - """A generalized function for topology operations, takes a GDAL function and - the other geometry to perform the operation on.""" - if not isinstance(other, OGRGeometry): - raise TypeError( - "Must use another OGRGeometry object for topology operations!" - ) - - # Returning the output of the given function with the other geometry's - # pointer. - return func(self.ptr, other.ptr) - - def intersects(self, other): - "Return True if this geometry intersects with the other." - return self._topology(capi.ogr_intersects, other) - - def equals(self, other): - "Return True if this geometry is equivalent to the other." - return self._topology(capi.ogr_equals, other) - - def disjoint(self, other): - "Return True if this geometry and the other are spatially disjoint." - return self._topology(capi.ogr_disjoint, other) - - def touches(self, other): - "Return True if this geometry touches the other." - return self._topology(capi.ogr_touches, other) - - def crosses(self, other): - "Return True if this geometry crosses the other." - return self._topology(capi.ogr_crosses, other) - - def within(self, other): - "Return True if this geometry is within the other." - return self._topology(capi.ogr_within, other) - - def contains(self, other): - "Return True if this geometry contains the other." - return self._topology(capi.ogr_contains, other) - - def overlaps(self, other): - "Return True if this geometry overlaps the other." - return self._topology(capi.ogr_overlaps, other) - - # #### Geometry-generation Methods #### - def _geomgen(self, gen_func, other=None): - "A helper routine for the OGR routines that generate geometries." - if isinstance(other, OGRGeometry): - return OGRGeometry(gen_func(self.ptr, other.ptr), self.srs) - else: - return OGRGeometry(gen_func(self.ptr), self.srs) - - @property - def boundary(self): - "Return the boundary of this geometry." - return self._geomgen(capi.get_boundary) - - @property - def convex_hull(self): - """ - Return the smallest convex Polygon that contains all the points in - this Geometry. - """ - return self._geomgen(capi.geom_convex_hull) - - def difference(self, other): - """ - Return a new geometry consisting of the region which is the difference - of this geometry and the other. - """ - return self._geomgen(capi.geom_diff, other) - - def intersection(self, other): - """ - Return a new geometry consisting of the region of intersection of this - geometry and the other. - """ - return self._geomgen(capi.geom_intersection, other) - - def sym_difference(self, other): - """ - Return a new geometry which is the symmetric difference of this - geometry and the other. - """ - return self._geomgen(capi.geom_sym_diff, other) - - def union(self, other): - """ - Return a new geometry consisting of the region which is the union of - this geometry and the other. - """ - return self._geomgen(capi.geom_union, other) - - @property - def centroid(self): - """Return the centroid (a Point) of this Polygon.""" - # The centroid is a Point, create a geometry for this. - p = OGRGeometry(OGRGeomType("Point")) - capi.get_centroid(self.ptr, p.ptr) - return p - - -# The subclasses for OGR Geometry. -class Point(OGRGeometry): - def _geos_ptr(self): - from django.contrib.gis import geos - - return geos.Point._create_empty() if self.empty else super()._geos_ptr() - - @classmethod - def _create_empty(cls): - return capi.create_geom(OGRGeomType("point").num) - - @property - def x(self): - "Return the X coordinate for this Point." - return capi.getx(self.ptr, 0) - - @property - def y(self): - "Return the Y coordinate for this Point." - return capi.gety(self.ptr, 0) - - @property - def z(self): - "Return the Z coordinate for this Point." - if self.is_3d: - return capi.getz(self.ptr, 0) - - @property - def m(self): - """Return the M coordinate for this Point.""" - if self.is_measured: - return capi.getm(self.ptr, 0) - - @property - def tuple(self): - "Return the tuple of this point." - if self.is_3d and self.is_measured: - return self.x, self.y, self.z, self.m - if self.is_3d: - return self.x, self.y, self.z - if self.is_measured: - return self.x, self.y, self.m - return self.x, self.y - - coords = tuple - - -class LineString(OGRGeometry): - def __getitem__(self, index): - "Return the Point at the given index." - if 0 <= index < self.point_count: - x, y, z, m = c_double(), c_double(), c_double(), c_double() - capi.get_point(self.ptr, index, byref(x), byref(y), byref(z), byref(m)) - if self.is_3d and self.is_measured: - return x.value, y.value, z.value, m.value - if self.is_3d: - return x.value, y.value, z.value - if self.is_measured: - return x.value, y.value, m.value - dim = self.coord_dim - if dim == 1: - return (x.value,) - elif dim == 2: - return (x.value, y.value) - else: - raise IndexError( - "Index out of range when accessing points of a line string: %s." % index - ) - - def __len__(self): - "Return the number of points in the LineString." - return self.point_count - - @property - def tuple(self): - "Return the tuple representation of this LineString." - return tuple(self[i] for i in range(len(self))) - - coords = tuple - - def _listarr(self, func): - """ - Internal routine that returns a sequence (list) corresponding with - the given function. - """ - return [func(self.ptr, i) for i in range(len(self))] - - @property - def x(self): - "Return the X coordinates in a list." - return self._listarr(capi.getx) - - @property - def y(self): - "Return the Y coordinates in a list." - return self._listarr(capi.gety) - - @property - def z(self): - "Return the Z coordinates in a list." - if self.is_3d: - return self._listarr(capi.getz) - - @property - def m(self): - """Return the M coordinates in a list.""" - if self.is_measured: - return self._listarr(capi.getm) - - -# LinearRings are used in Polygons. -class LinearRing(LineString): - pass - - -class Polygon(OGRGeometry): - def __len__(self): - "Return the number of interior rings in this Polygon." - return self.geom_count - - def __getitem__(self, index): - "Get the ring at the specified index." - if 0 <= index < self.geom_count: - return OGRGeometry( - capi.clone_geom(capi.get_geom_ref(self.ptr, index)), self.srs - ) - else: - raise IndexError( - "Index out of range when accessing rings of a polygon: %s." % index - ) - - # Polygon Properties - @property - def shell(self): - "Return the shell of this Polygon." - return self[0] # First ring is the shell - - exterior_ring = shell - - @property - def tuple(self): - "Return a tuple of LinearRing coordinate tuples." - return tuple(self[i].tuple for i in range(self.geom_count)) - - coords = tuple - - @property - def point_count(self): - "Return the number of Points in this Polygon." - # Summing up the number of points in each ring of the Polygon. - return sum(self[i].point_count for i in range(self.geom_count)) - - -class CircularString(LineString): - geos_support = False - - -class CurvePolygon(Polygon): - geos_support = False - - -class CompoundCurve(OGRGeometry): - geos_support = False - - -# Geometry Collection base class. -class GeometryCollection(OGRGeometry): - "The Geometry Collection class." - - def __getitem__(self, index): - "Get the Geometry at the specified index." - if 0 <= index < self.geom_count: - return OGRGeometry( - capi.clone_geom(capi.get_geom_ref(self.ptr, index)), self.srs - ) - else: - raise IndexError( - "Index out of range when accessing geometry in a collection: %s." - % index - ) - - def __len__(self): - "Return the number of geometries in this Geometry Collection." - return self.geom_count - - def add(self, geom): - "Add the geometry to this Geometry Collection." - if isinstance(geom, OGRGeometry): - if isinstance(geom, self.__class__): - for g in geom: - capi.add_geom(self.ptr, g.ptr) - else: - capi.add_geom(self.ptr, geom.ptr) - elif isinstance(geom, str): - tmp = OGRGeometry(geom) - capi.add_geom(self.ptr, tmp.ptr) - else: - raise GDALException("Must add an OGRGeometry.") - - @property - def point_count(self): - "Return the number of Points in this Geometry Collection." - # Summing up the number of points in each geometry in this collection - return sum(self[i].point_count for i in range(self.geom_count)) - - @property - def tuple(self): - "Return a tuple representation of this Geometry Collection." - return tuple(self[i].tuple for i in range(self.geom_count)) - - coords = tuple - - -# Multiple Geometry types. -class MultiPoint(GeometryCollection): - pass - - -class MultiLineString(GeometryCollection): - pass - - -class MultiPolygon(GeometryCollection): - pass - - -class MultiSurface(GeometryCollection): - geos_support = False - - -class MultiCurve(GeometryCollection): - geos_support = False - - -# Class mapping dictionary (using the OGRwkbGeometryType as the key) -GEO_CLASSES = { - 1: Point, - 2: LineString, - 3: Polygon, - 4: MultiPoint, - 5: MultiLineString, - 6: MultiPolygon, - 7: GeometryCollection, - 8: CircularString, - 9: CompoundCurve, - 10: CurvePolygon, - 11: MultiCurve, - 12: MultiSurface, - 101: LinearRing, - 1008: CircularString, # CIRCULARSTRING Z - 1009: CompoundCurve, # COMPOUNDCURVE Z - 1010: CurvePolygon, # CURVEPOLYGON Z - 1011: MultiCurve, # MULTICURVE Z - 1012: MultiSurface, # MULTICURVE Z - 2001: Point, # POINT M - 2002: LineString, # LINESTRING M - 2003: Polygon, # POLYGON M - 2004: MultiPoint, # MULTIPOINT M - 2005: MultiLineString, # MULTILINESTRING M - 2006: MultiPolygon, # MULTIPOLYGON M - 2007: GeometryCollection, # GEOMETRYCOLLECTION M - 2008: CircularString, # CIRCULARSTRING M - 2009: CompoundCurve, # COMPOUNDCURVE M - 2010: CurvePolygon, # CURVEPOLYGON M - 2011: MultiCurve, # MULTICURVE M - 2012: MultiSurface, # MULTICURVE M - 3001: Point, # POINT ZM - 3002: LineString, # LINESTRING ZM - 3003: Polygon, # POLYGON ZM - 3004: MultiPoint, # MULTIPOINT ZM - 3005: MultiLineString, # MULTILINESTRING ZM - 3006: MultiPolygon, # MULTIPOLYGON ZM - 3007: GeometryCollection, # GEOMETRYCOLLECTION ZM - 3008: CircularString, # CIRCULARSTRING ZM - 3009: CompoundCurve, # COMPOUNDCURVE ZM - 3010: CurvePolygon, # CURVEPOLYGON ZM - 3011: MultiCurve, # MULTICURVE ZM - 3012: MultiSurface, # MULTISURFACE ZM - 1 + OGRGeomType.wkb25bit: Point, # POINT Z - 2 + OGRGeomType.wkb25bit: LineString, # LINESTRING Z - 3 + OGRGeomType.wkb25bit: Polygon, # POLYGON Z - 4 + OGRGeomType.wkb25bit: MultiPoint, # MULTIPOINT Z - 5 + OGRGeomType.wkb25bit: MultiLineString, # MULTILINESTRING Z - 6 + OGRGeomType.wkb25bit: MultiPolygon, # MULTIPOLYGON Z - 7 + OGRGeomType.wkb25bit: GeometryCollection, # GEOMETRYCOLLECTION Z -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/geomtype.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/geomtype.py deleted file mode 100644 index c8c4703..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/geomtype.py +++ /dev/null @@ -1,146 +0,0 @@ -from django.contrib.gis.gdal.error import GDALException - - -class OGRGeomType: - "Encapsulate OGR Geometry Types." - - wkb25bit = -2147483648 - - # Dictionary of acceptable OGRwkbGeometryType s and their string names. - _types = { - 0: "Unknown", - 1: "Point", - 2: "LineString", - 3: "Polygon", - 4: "MultiPoint", - 5: "MultiLineString", - 6: "MultiPolygon", - 7: "GeometryCollection", - 8: "CircularString", - 9: "CompoundCurve", - 10: "CurvePolygon", - 11: "MultiCurve", - 12: "MultiSurface", - 15: "PolyhedralSurface", - 16: "TIN", - 17: "Triangle", - 100: "None", - 101: "LinearRing", - 102: "PointZ", - 1008: "CircularStringZ", - 1009: "CompoundCurveZ", - 1010: "CurvePolygonZ", - 1011: "MultiCurveZ", - 1012: "MultiSurfaceZ", - 1013: "CurveZ", - 1014: "SurfaceZ", - 1015: "PolyhedralSurfaceZ", - 1016: "TINZ", - 1017: "TriangleZ", - 2001: "PointM", - 2002: "LineStringM", - 2003: "PolygonM", - 2004: "MultiPointM", - 2005: "MultiLineStringM", - 2006: "MultiPolygonM", - 2007: "GeometryCollectionM", - 2008: "CircularStringM", - 2009: "CompoundCurveM", - 2010: "CurvePolygonM", - 2011: "MultiCurveM", - 2012: "MultiSurfaceM", - 2015: "PolyhedralSurfaceM", - 2016: "TINM", - 2017: "TriangleM", - 3001: "PointZM", - 3002: "LineStringZM", - 3003: "PolygonZM", - 3004: "MultiPointZM", - 3005: "MultiLineStringZM", - 3006: "MultiPolygonZM", - 3007: "GeometryCollectionZM", - 3008: "CircularStringZM", - 3009: "CompoundCurveZM", - 3010: "CurvePolygonZM", - 3011: "MultiCurveZM", - 3012: "MultiSurfaceZM", - 3015: "PolyhedralSurfaceZM", - 3016: "TINZM", - 3017: "TriangleZM", - 1 + wkb25bit: "Point25D", - 2 + wkb25bit: "LineString25D", - 3 + wkb25bit: "Polygon25D", - 4 + wkb25bit: "MultiPoint25D", - 5 + wkb25bit: "MultiLineString25D", - 6 + wkb25bit: "MultiPolygon25D", - 7 + wkb25bit: "GeometryCollection25D", - } - # Reverse type dictionary, keyed by lowercase of the name. - _str_types = {v.lower(): k for k, v in _types.items()} - - def __init__(self, type_input): - "Figure out the correct OGR Type based upon the input." - if isinstance(type_input, OGRGeomType): - num = type_input.num - elif isinstance(type_input, str): - type_input = type_input.lower() - if type_input == "geometry": - type_input = "unknown" - num = self._str_types.get(type_input) - if num is None: - raise GDALException('Invalid OGR String Type "%s"' % type_input) - elif isinstance(type_input, int): - if type_input not in self._types: - raise GDALException("Invalid OGR Integer Type: %d" % type_input) - num = type_input - else: - raise TypeError("Invalid OGR input type given.") - - # Setting the OGR geometry type number. - self.num = num - - def __str__(self): - "Return the value of the name property." - return self.name - - def __repr__(self): - return f"<{self.__class__.__qualname__}: {self.name}>" - - def __eq__(self, other): - """ - Do an equivalence test on the OGR type with the given - other OGRGeomType, the short-hand string, or the integer. - """ - if isinstance(other, OGRGeomType): - return self.num == other.num - elif isinstance(other, str): - return self.name.lower() == other.lower() - elif isinstance(other, int): - return self.num == other - else: - return False - - @property - def name(self): - "Return a short-hand string form of the OGR Geometry type." - return self._types[self.num] - - @property - def django(self): - "Return the Django GeometryField for this OGR Type." - s = self.name.replace("25D", "") - if s in ("LinearRing", "None"): - return None - elif s == "Unknown": - s = "Geometry" - elif s == "PointZ": - s = "Point" - return s + "Field" - - def to_multi(self): - """ - Transform Point, LineString, Polygon, and their 25D equivalents - to their Multi... counterpart. - """ - if self.name.startswith(("Point", "LineString", "Polygon")): - self.num += 3 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/layer.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/layer.py deleted file mode 100644 index 1afa046..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/layer.py +++ /dev/null @@ -1,234 +0,0 @@ -from ctypes import byref, c_double - -from django.contrib.gis.gdal.base import GDALBase -from django.contrib.gis.gdal.envelope import Envelope, OGREnvelope -from django.contrib.gis.gdal.error import GDALException, SRSException -from django.contrib.gis.gdal.feature import Feature -from django.contrib.gis.gdal.field import OGRFieldTypes -from django.contrib.gis.gdal.geometries import OGRGeometry -from django.contrib.gis.gdal.geomtype import OGRGeomType -from django.contrib.gis.gdal.prototypes import ds as capi -from django.contrib.gis.gdal.prototypes import geom as geom_api -from django.contrib.gis.gdal.prototypes import srs as srs_api -from django.contrib.gis.gdal.srs import SpatialReference -from django.utils.encoding import force_bytes, force_str - - -# For more information, see the OGR C API source code: -# https://gdal.org/api/vector_c_api.html -# -# The OGR_L_* routines are relevant here. -class Layer(GDALBase): - """ - A class that wraps an OGR Layer, needs to be instantiated from a DataSource - object. - """ - - def __init__(self, layer_ptr, ds): - """ - Initialize on an OGR C pointer to the Layer and the `DataSource` object - that owns this layer. The `DataSource` object is required so that a - reference to it is kept with this Layer. This prevents garbage - collection of the `DataSource` while this Layer is still active. - """ - if not layer_ptr: - raise GDALException("Cannot create Layer, invalid pointer given") - self.ptr = layer_ptr - self._ds = ds - self._ldefn = capi.get_layer_defn(self._ptr) - # Does the Layer support random reading? - self._random_read = self.test_capability(b"RandomRead") - - def __getitem__(self, index): - "Get the Feature at the specified index." - if isinstance(index, int): - # An integer index was given -- we cannot do a check based on the - # number of features because the beginning and ending feature IDs - # are not guaranteed to be 0 and len(layer)-1, respectively. - if index < 0: - raise IndexError("Negative indices are not allowed on OGR Layers.") - return self._make_feature(index) - elif isinstance(index, slice): - # A slice was given - start, stop, stride = index.indices(self.num_feat) - return [self._make_feature(fid) for fid in range(start, stop, stride)] - else: - raise TypeError( - "Integers and slices may only be used when indexing OGR Layers." - ) - - def __iter__(self): - "Iterate over each Feature in the Layer." - # ResetReading() must be called before iteration is to begin. - capi.reset_reading(self._ptr) - for i in range(self.num_feat): - yield Feature(capi.get_next_feature(self._ptr), self) - - def __len__(self): - "The length is the number of features." - return self.num_feat - - def __str__(self): - "The string name of the layer." - return self.name - - def _make_feature(self, feat_id): - """ - Helper routine for __getitem__ that constructs a Feature from the given - Feature ID. If the OGR Layer does not support random-access reading, - then each feature of the layer will be incremented through until the - a Feature is found matching the given feature ID. - """ - if self._random_read: - # If the Layer supports random reading, return. - try: - return Feature(capi.get_feature(self.ptr, feat_id), self) - except GDALException: - pass - else: - # Random access isn't supported, have to increment through - # each feature until the given feature ID is encountered. - for feat in self: - if feat.fid == feat_id: - return feat - # Should have returned a Feature, raise an IndexError. - raise IndexError("Invalid feature id: %s." % feat_id) - - # #### Layer properties #### - @property - def extent(self): - "Return the extent (an Envelope) of this layer." - env = OGREnvelope() - capi.get_extent(self.ptr, byref(env), 1) - return Envelope(env) - - @property - def name(self): - "Return the name of this layer in the Data Source." - name = capi.get_fd_name(self._ldefn) - return force_str(name, self._ds.encoding, strings_only=True) - - @property - def num_feat(self, force=1): - "Return the number of features in the Layer." - return capi.get_feature_count(self.ptr, force) - - @property - def num_fields(self): - "Return the number of fields in the Layer." - return capi.get_field_count(self._ldefn) - - @property - def geom_type(self): - "Return the geometry type (OGRGeomType) of the Layer." - return OGRGeomType(capi.get_fd_geom_type(self._ldefn)) - - @property - def srs(self): - "Return the Spatial Reference used in this Layer." - try: - ptr = capi.get_layer_srs(self.ptr) - return SpatialReference(srs_api.clone_srs(ptr)) - except SRSException: - return None - - @property - def fields(self): - """ - Return a list of string names corresponding to each of the Fields - available in this Layer. - """ - return [ - force_str( - capi.get_field_name(capi.get_field_defn(self._ldefn, i)), - self._ds.encoding, - strings_only=True, - ) - for i in range(self.num_fields) - ] - - @property - def field_types(self): - """ - Return a list of the types of fields in this Layer. For example, - return the list [OFTInteger, OFTReal, OFTString] for an OGR layer that - has an integer, a floating-point, and string fields. - """ - return [ - OGRFieldTypes[capi.get_field_type(capi.get_field_defn(self._ldefn, i))] - for i in range(self.num_fields) - ] - - @property - def field_widths(self): - "Return a list of the maximum field widths for the features." - return [ - capi.get_field_width(capi.get_field_defn(self._ldefn, i)) - for i in range(self.num_fields) - ] - - @property - def field_precisions(self): - "Return the field precisions for the features." - return [ - capi.get_field_precision(capi.get_field_defn(self._ldefn, i)) - for i in range(self.num_fields) - ] - - def _get_spatial_filter(self): - try: - return OGRGeometry(geom_api.clone_geom(capi.get_spatial_filter(self.ptr))) - except GDALException: - return None - - def _set_spatial_filter(self, filter): - if isinstance(filter, OGRGeometry): - capi.set_spatial_filter(self.ptr, filter.ptr) - elif isinstance(filter, (tuple, list)): - if not len(filter) == 4: - raise ValueError("Spatial filter list/tuple must have 4 elements.") - # Map c_double onto params -- if a bad type is passed in it - # will be caught here. - xmin, ymin, xmax, ymax = map(c_double, filter) - capi.set_spatial_filter_rect(self.ptr, xmin, ymin, xmax, ymax) - elif filter is None: - capi.set_spatial_filter(self.ptr, None) - else: - raise TypeError( - "Spatial filter must be either an OGRGeometry instance, a 4-tuple, or " - "None." - ) - - spatial_filter = property(_get_spatial_filter, _set_spatial_filter) - - # #### Layer Methods #### - def get_fields(self, field_name): - """ - Return a list containing the given field name for every Feature - in the Layer. - """ - if field_name not in self.fields: - raise GDALException("invalid field name: %s" % field_name) - return [feat.get(field_name) for feat in self] - - def get_geoms(self, geos=False): - """ - Return a list containing the OGRGeometry for every Feature in - the Layer. - """ - if geos: - from django.contrib.gis.geos import GEOSGeometry - - return [GEOSGeometry(feat.geom.wkb) for feat in self] - else: - return [feat.geom for feat in self] - - def test_capability(self, capability): - """ - Return a bool indicating whether the this Layer supports the given - capability (a string). Valid capability strings include: - 'RandomRead', 'SequentialWrite', 'RandomWrite', 'FastSpatialFilter', - 'FastFeatureCount', 'FastGetExtent', 'CreateField', 'Transactions', - 'DeleteFeature', and 'FastSetNextByIndex'. - """ - return bool(capi.test_capability(self.ptr, force_bytes(capability))) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/libgdal.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/libgdal.py deleted file mode 100644 index 49d6363..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/libgdal.py +++ /dev/null @@ -1,142 +0,0 @@ -import logging -import os -import re -from ctypes import CDLL, CFUNCTYPE, c_char_p, c_int -from ctypes.util import find_library - -from django.contrib.gis.gdal.error import GDALException -from django.core.exceptions import ImproperlyConfigured - -logger = logging.getLogger("django.contrib.gis") - -# Custom library path set? -try: - from django.conf import settings - - lib_path = settings.GDAL_LIBRARY_PATH -except (AttributeError, ImportError, ImproperlyConfigured, OSError): - lib_path = None - -if lib_path: - lib_names = None -elif os.name == "nt": - # Windows NT shared libraries - lib_names = [ - "gdal310", - "gdal309", - "gdal308", - "gdal307", - "gdal306", - "gdal305", - "gdal304", - "gdal303", - "gdal302", - "gdal301", - ] -elif os.name == "posix": - # *NIX library names. - lib_names = [ - "gdal", - "GDAL", - "gdal3.10.0", - "gdal3.9.0", - "gdal3.8.0", - "gdal3.7.0", - "gdal3.6.0", - "gdal3.5.0", - "gdal3.4.0", - "gdal3.3.0", - "gdal3.2.0", - "gdal3.1.0", - ] -else: - raise ImproperlyConfigured('GDAL is unsupported on OS "%s".' % os.name) - -# Using the ctypes `find_library` utility to find the -# path to the GDAL library from the list of library names. -if lib_names: - for lib_name in lib_names: - lib_path = find_library(lib_name) - if lib_path is not None: - break - -if lib_path is None: - raise ImproperlyConfigured( - 'Could not find the GDAL library (tried "%s"). Is GDAL installed? ' - "If it is, try setting GDAL_LIBRARY_PATH in your settings." - % '", "'.join(lib_names) - ) - -# This loads the GDAL/OGR C library -lgdal = CDLL(lib_path) - -# On Windows, the GDAL binaries have some OSR routines exported with -# STDCALL, while others are not. Thus, the library will also need to -# be loaded up as WinDLL for said OSR functions that require the -# different calling convention. -if os.name == "nt": - from ctypes import WinDLL - - lwingdal = WinDLL(lib_path) - - -def std_call(func): - """ - Return the correct STDCALL function for certain OSR routines on Win32 - platforms. - """ - if os.name == "nt": - return lwingdal[func] - else: - return lgdal[func] - - -# #### Version-information functions. #### - -# Return GDAL library version information with the given key. -_version_info = std_call("GDALVersionInfo") -_version_info.argtypes = [c_char_p] -_version_info.restype = c_char_p - - -def gdal_version(): - "Return only the GDAL version number information." - return _version_info(b"RELEASE_NAME") - - -def gdal_full_version(): - "Return the full GDAL version information." - return _version_info(b"") - - -def gdal_version_info(): - ver = gdal_version() - m = re.match(rb"^(?P\d+)\.(?P\d+)(?:\.(?P\d+))?", ver) - if not m: - raise GDALException('Could not parse GDAL version string "%s"' % ver) - major, minor, subminor = m.groups() - return (int(major), int(minor), subminor and int(subminor)) - - -GDAL_VERSION = gdal_version_info() - -# Set library error handling so as errors are logged -CPLErrorHandler = CFUNCTYPE(None, c_int, c_int, c_char_p) - - -def err_handler(error_class, error_number, message): - logger.error("GDAL_ERROR %d: %s", error_number, message) - - -err_handler = CPLErrorHandler(err_handler) - - -def function(name, args, restype): - func = std_call(name) - func.argtypes = args - func.restype = restype - return func - - -set_error_handler = function("CPLSetErrorHandler", [CPLErrorHandler], CPLErrorHandler) -set_error_handler(err_handler) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/ds.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/ds.py deleted file mode 100644 index 0434bc5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/ds.py +++ /dev/null @@ -1,110 +0,0 @@ -""" -This module houses the ctypes function prototypes for OGR DataSource -related data structures. OGR_Dr_*, OGR_DS_*, OGR_L_*, OGR_F_*, -OGR_Fld_* routines are relevant here. -""" - -from ctypes import POINTER, c_char_p, c_double, c_int, c_long, c_uint, c_void_p - -from django.contrib.gis.gdal.envelope import OGREnvelope -from django.contrib.gis.gdal.libgdal import lgdal -from django.contrib.gis.gdal.prototypes.generation import ( - bool_output, - const_string_output, - double_output, - geom_output, - int64_output, - int_output, - srs_output, - void_output, - voidptr_output, -) - -c_int_p = POINTER(c_int) # shortcut type - -GDAL_OF_READONLY = 0x00 -GDAL_OF_UPDATE = 0x01 - -GDAL_OF_ALL = 0x00 -GDAL_OF_RASTER = 0x02 -GDAL_OF_VECTOR = 0x04 - -# Driver Routines -register_all = void_output(lgdal.GDALAllRegister, [], errcheck=False) -cleanup_all = void_output(lgdal.GDALDestroyDriverManager, [], errcheck=False) -get_driver = voidptr_output(lgdal.GDALGetDriver, [c_int]) -get_driver_by_name = voidptr_output( - lgdal.GDALGetDriverByName, [c_char_p], errcheck=False -) -get_driver_count = int_output(lgdal.GDALGetDriverCount, []) -get_driver_description = const_string_output(lgdal.GDALGetDescription, [c_void_p]) - -# DataSource -open_ds = voidptr_output( - lgdal.GDALOpenEx, - [c_char_p, c_uint, POINTER(c_char_p), POINTER(c_char_p), POINTER(c_char_p)], -) -destroy_ds = void_output(lgdal.GDALClose, [c_void_p], errcheck=False) -get_ds_name = const_string_output(lgdal.GDALGetDescription, [c_void_p]) -get_dataset_driver = voidptr_output(lgdal.GDALGetDatasetDriver, [c_void_p]) -get_layer = voidptr_output(lgdal.GDALDatasetGetLayer, [c_void_p, c_int]) -get_layer_by_name = voidptr_output( - lgdal.GDALDatasetGetLayerByName, [c_void_p, c_char_p] -) -get_layer_count = int_output(lgdal.GDALDatasetGetLayerCount, [c_void_p]) - -# Layer Routines -get_extent = void_output(lgdal.OGR_L_GetExtent, [c_void_p, POINTER(OGREnvelope), c_int]) -get_feature = voidptr_output(lgdal.OGR_L_GetFeature, [c_void_p, c_long]) -get_feature_count = int_output(lgdal.OGR_L_GetFeatureCount, [c_void_p, c_int]) -get_layer_defn = voidptr_output(lgdal.OGR_L_GetLayerDefn, [c_void_p]) -get_layer_srs = srs_output(lgdal.OGR_L_GetSpatialRef, [c_void_p]) -get_next_feature = voidptr_output(lgdal.OGR_L_GetNextFeature, [c_void_p]) -reset_reading = void_output(lgdal.OGR_L_ResetReading, [c_void_p], errcheck=False) -test_capability = int_output(lgdal.OGR_L_TestCapability, [c_void_p, c_char_p]) -get_spatial_filter = geom_output(lgdal.OGR_L_GetSpatialFilter, [c_void_p]) -set_spatial_filter = void_output( - lgdal.OGR_L_SetSpatialFilter, [c_void_p, c_void_p], errcheck=False -) -set_spatial_filter_rect = void_output( - lgdal.OGR_L_SetSpatialFilterRect, - [c_void_p, c_double, c_double, c_double, c_double], - errcheck=False, -) - -# Feature Definition Routines -get_fd_geom_type = int_output(lgdal.OGR_FD_GetGeomType, [c_void_p]) -get_fd_name = const_string_output(lgdal.OGR_FD_GetName, [c_void_p]) -get_feat_name = const_string_output(lgdal.OGR_FD_GetName, [c_void_p]) -get_field_count = int_output(lgdal.OGR_FD_GetFieldCount, [c_void_p]) -get_field_defn = voidptr_output(lgdal.OGR_FD_GetFieldDefn, [c_void_p, c_int]) - -# Feature Routines -clone_feature = voidptr_output(lgdal.OGR_F_Clone, [c_void_p]) -destroy_feature = void_output(lgdal.OGR_F_Destroy, [c_void_p], errcheck=False) -feature_equal = int_output(lgdal.OGR_F_Equal, [c_void_p, c_void_p]) -get_feat_geom_ref = geom_output(lgdal.OGR_F_GetGeometryRef, [c_void_p]) -get_feat_field_count = int_output(lgdal.OGR_F_GetFieldCount, [c_void_p]) -get_feat_field_defn = voidptr_output(lgdal.OGR_F_GetFieldDefnRef, [c_void_p, c_int]) -get_fid = int_output(lgdal.OGR_F_GetFID, [c_void_p]) -get_field_as_datetime = int_output( - lgdal.OGR_F_GetFieldAsDateTime, - [c_void_p, c_int, c_int_p, c_int_p, c_int_p, c_int_p, c_int_p, c_int_p], -) -get_field_as_double = double_output(lgdal.OGR_F_GetFieldAsDouble, [c_void_p, c_int]) -get_field_as_integer = int_output(lgdal.OGR_F_GetFieldAsInteger, [c_void_p, c_int]) -get_field_as_integer64 = int64_output( - lgdal.OGR_F_GetFieldAsInteger64, [c_void_p, c_int] -) -is_field_set = bool_output(lgdal.OGR_F_IsFieldSetAndNotNull, [c_void_p, c_int]) -get_field_as_string = const_string_output( - lgdal.OGR_F_GetFieldAsString, [c_void_p, c_int] -) -get_field_index = int_output(lgdal.OGR_F_GetFieldIndex, [c_void_p, c_char_p]) - -# Field Routines -get_field_name = const_string_output(lgdal.OGR_Fld_GetNameRef, [c_void_p]) -get_field_precision = int_output(lgdal.OGR_Fld_GetPrecision, [c_void_p]) -get_field_type = int_output(lgdal.OGR_Fld_GetType, [c_void_p]) -get_field_type_name = const_string_output(lgdal.OGR_GetFieldTypeName, [c_int]) -get_field_width = int_output(lgdal.OGR_Fld_GetWidth, [c_void_p]) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/errcheck.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/errcheck.py deleted file mode 100644 index d970b2e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/errcheck.py +++ /dev/null @@ -1,142 +0,0 @@ -""" -This module houses the error-checking routines used by the GDAL -ctypes prototypes. -""" - -from ctypes import c_void_p, string_at - -from django.contrib.gis.gdal.error import GDALException, SRSException, check_err -from django.contrib.gis.gdal.libgdal import lgdal - - -# Helper routines for retrieving pointers and/or values from -# arguments passed in by reference. -def arg_byref(args, offset=-1): - "Return the pointer argument's by-reference value." - return args[offset]._obj.value - - -def ptr_byref(args, offset=-1): - "Return the pointer argument passed in by-reference." - return args[offset]._obj - - -# ### String checking Routines ### -def check_const_string(result, func, cargs, offset=None, cpl=False): - """ - Similar functionality to `check_string`, but does not free the pointer. - """ - if offset: - check_err(result, cpl=cpl) - ptr = ptr_byref(cargs, offset) - return ptr.value - else: - return result - - -def check_string(result, func, cargs, offset=-1, str_result=False): - """ - Check the string output returned from the given function, and free - the string pointer allocated by OGR. The `str_result` keyword - may be used when the result is the string pointer, otherwise - the OGR error code is assumed. The `offset` keyword may be used - to extract the string pointer passed in by-reference at the given - slice offset in the function arguments. - """ - if str_result: - # For routines that return a string. - ptr = result - if not ptr: - s = None - else: - s = string_at(result) - else: - # Error-code return specified. - check_err(result) - ptr = ptr_byref(cargs, offset) - # Getting the string value - s = ptr.value - # Correctly freeing the allocated memory behind GDAL pointer - # with the VSIFree routine. - if ptr: - lgdal.VSIFree(ptr) - return s - - -# ### DataSource, Layer error-checking ### - - -# ### Envelope checking ### -def check_envelope(result, func, cargs, offset=-1): - "Check a function that returns an OGR Envelope by reference." - return ptr_byref(cargs, offset) - - -# ### Geometry error-checking routines ### -def check_geom(result, func, cargs): - "Check a function that returns a geometry." - # OGR_G_Clone may return an integer, even though the - # restype is set to c_void_p - if isinstance(result, int): - result = c_void_p(result) - if not result: - raise GDALException( - 'Invalid geometry pointer returned from "%s".' % func.__name__ - ) - return result - - -def check_geom_offset(result, func, cargs, offset=-1): - "Check the geometry at the given offset in the C parameter list." - check_err(result) - geom = ptr_byref(cargs, offset=offset) - return check_geom(geom, func, cargs) - - -# ### Spatial Reference error-checking routines ### -def check_srs(result, func, cargs): - if isinstance(result, int): - result = c_void_p(result) - if not result: - raise SRSException( - 'Invalid spatial reference pointer returned from "%s".' % func.__name__ - ) - return result - - -# ### Other error-checking routines ### -def check_arg_errcode(result, func, cargs, cpl=False): - """ - The error code is returned in the last argument, by reference. - Check its value with `check_err` before returning the result. - """ - check_err(arg_byref(cargs), cpl=cpl) - return result - - -def check_errcode(result, func, cargs, cpl=False): - """ - Check the error code returned (c_int). - """ - check_err(result, cpl=cpl) - - -def check_pointer(result, func, cargs): - "Make sure the result pointer is valid." - if isinstance(result, int): - result = c_void_p(result) - if result: - return result - else: - raise GDALException('Invalid pointer returned from "%s"' % func.__name__) - - -def check_str_arg(result, func, cargs): - """ - This is for the OSRGet[Angular|Linear]Units functions, which - require that the returned string pointer not be freed. This - returns both the double and string values. - """ - dbl = result - ptr = cargs[-1]._obj - return dbl, ptr.value.decode() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/generation.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/generation.py deleted file mode 100644 index 42665a2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/generation.py +++ /dev/null @@ -1,178 +0,0 @@ -""" -This module contains functions that generate ctypes prototypes for the -GDAL routines. -""" - -from ctypes import POINTER, c_bool, c_char_p, c_double, c_int, c_int64, c_void_p -from functools import partial - -from django.contrib.gis.gdal.prototypes.errcheck import ( - check_arg_errcode, - check_const_string, - check_errcode, - check_geom, - check_geom_offset, - check_pointer, - check_srs, - check_str_arg, - check_string, -) - - -class gdal_char_p(c_char_p): - pass - - -def bool_output(func, argtypes, errcheck=None): - """Generate a ctypes function that returns a boolean value.""" - func.argtypes = argtypes - func.restype = c_bool - if errcheck: - func.errcheck = errcheck - return func - - -def double_output(func, argtypes, errcheck=False, strarg=False, cpl=False): - "Generate a ctypes function that returns a double value." - func.argtypes = argtypes - func.restype = c_double - if errcheck: - func.errcheck = partial(check_arg_errcode, cpl=cpl) - if strarg: - func.errcheck = check_str_arg - return func - - -def geom_output(func, argtypes, offset=None): - """ - Generate a function that returns a Geometry either by reference - or directly (if the return_geom keyword is set to True). - """ - # Setting the argument types - func.argtypes = argtypes - - if not offset: - # When a geometry pointer is directly returned. - func.restype = c_void_p - func.errcheck = check_geom - else: - # Error code returned, geometry is returned by-reference. - func.restype = c_int - - def geomerrcheck(result, func, cargs): - return check_geom_offset(result, func, cargs, offset) - - func.errcheck = geomerrcheck - - return func - - -def int_output(func, argtypes, errcheck=None): - "Generate a ctypes function that returns an integer value." - func.argtypes = argtypes - func.restype = c_int - if errcheck: - func.errcheck = errcheck - return func - - -def int64_output(func, argtypes): - "Generate a ctypes function that returns a 64-bit integer value." - func.argtypes = argtypes - func.restype = c_int64 - return func - - -def srs_output(func, argtypes): - """ - Generate a ctypes prototype for the given function with - the given C arguments that returns a pointer to an OGR - Spatial Reference System. - """ - func.argtypes = argtypes - func.restype = c_void_p - func.errcheck = check_srs - return func - - -def const_string_output(func, argtypes, offset=None, decoding=None, cpl=False): - func.argtypes = argtypes - if offset: - func.restype = c_int - else: - func.restype = c_char_p - - def _check_const(result, func, cargs): - res = check_const_string(result, func, cargs, offset=offset, cpl=cpl) - if res and decoding: - res = res.decode(decoding) - return res - - func.errcheck = _check_const - - return func - - -def string_output(func, argtypes, offset=-1, str_result=False, decoding=None): - """ - Generate a ctypes prototype for the given function with the - given argument types that returns a string from a GDAL pointer. - The `const` flag indicates whether the allocated pointer should - be freed via the GDAL library routine VSIFree -- but only applies - only when `str_result` is True. - """ - func.argtypes = argtypes - if str_result: - # Use subclass of c_char_p so the error checking routine - # can free the memory at the pointer's address. - func.restype = gdal_char_p - else: - # Error code is returned - func.restype = c_int - - # Dynamically defining our error-checking function with the - # given offset. - def _check_str(result, func, cargs): - res = check_string(result, func, cargs, offset=offset, str_result=str_result) - if res and decoding: - res = res.decode(decoding) - return res - - func.errcheck = _check_str - return func - - -def void_output(func, argtypes, errcheck=True, cpl=False): - """ - For functions that don't only return an error code that needs to - be examined. - """ - if argtypes: - func.argtypes = argtypes - if errcheck: - # `errcheck` keyword may be set to False for routines that - # return void, rather than a status code. - func.restype = c_int - func.errcheck = partial(check_errcode, cpl=cpl) - else: - func.restype = None - - return func - - -def voidptr_output(func, argtypes, errcheck=True): - "For functions that return c_void_p." - func.argtypes = argtypes - func.restype = c_void_p - if errcheck: - func.errcheck = check_pointer - return func - - -def chararray_output(func, argtypes, errcheck=True): - """For functions that return a c_char_p array.""" - func.argtypes = argtypes - func.restype = POINTER(c_char_p) - if errcheck: - func.errcheck = check_pointer - return func diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/geom.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/geom.py deleted file mode 100644 index 9066dbd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/geom.py +++ /dev/null @@ -1,175 +0,0 @@ -from ctypes import POINTER, c_char_p, c_double, c_int, c_void_p - -from django.contrib.gis.gdal.envelope import OGREnvelope -from django.contrib.gis.gdal.libgdal import GDAL_VERSION, lgdal -from django.contrib.gis.gdal.prototypes.errcheck import check_envelope -from django.contrib.gis.gdal.prototypes.generation import ( - bool_output, - const_string_output, - double_output, - geom_output, - int_output, - srs_output, - string_output, - void_output, -) - - -# ### Generation routines specific to this module ### -def env_func(f, argtypes): - "For getting OGREnvelopes." - f.argtypes = argtypes - f.restype = None - f.errcheck = check_envelope - return f - - -def pnt_func(f): - "For accessing point information." - return double_output(f, [c_void_p, c_int]) - - -def topology_func(f): - f.argtypes = [c_void_p, c_void_p] - f.restype = c_int - f.errcheck = lambda result, func, cargs: bool(result) - return f - - -# ### OGR_G ctypes function prototypes ### - -# GeoJSON routines. -from_json = geom_output(lgdal.OGR_G_CreateGeometryFromJson, [c_char_p]) -to_json = string_output( - lgdal.OGR_G_ExportToJson, [c_void_p], str_result=True, decoding="ascii" -) -to_kml = string_output( - lgdal.OGR_G_ExportToKML, [c_void_p, c_char_p], str_result=True, decoding="ascii" -) - -# GetX, GetY, GetZ all return doubles. -getx = pnt_func(lgdal.OGR_G_GetX) -gety = pnt_func(lgdal.OGR_G_GetY) -getz = pnt_func(lgdal.OGR_G_GetZ) -getm = pnt_func(lgdal.OGR_G_GetM) - -# Geometry creation routines. -if GDAL_VERSION >= (3, 3): - from_wkb = geom_output( - lgdal.OGR_G_CreateFromWkbEx, - [c_char_p, c_void_p, POINTER(c_void_p), c_int], - offset=-2, - ) -else: - from_wkb = geom_output( - lgdal.OGR_G_CreateFromWkb, - [c_char_p, c_void_p, POINTER(c_void_p), c_int], - offset=-2, - ) -from_wkt = geom_output( - lgdal.OGR_G_CreateFromWkt, - [POINTER(c_char_p), c_void_p, POINTER(c_void_p)], - offset=-1, -) -from_gml = geom_output(lgdal.OGR_G_CreateFromGML, [c_char_p]) -create_geom = geom_output(lgdal.OGR_G_CreateGeometry, [c_int]) -clone_geom = geom_output(lgdal.OGR_G_Clone, [c_void_p]) -get_geom_ref = geom_output(lgdal.OGR_G_GetGeometryRef, [c_void_p, c_int]) -get_boundary = geom_output(lgdal.OGR_G_GetBoundary, [c_void_p]) -geom_convex_hull = geom_output(lgdal.OGR_G_ConvexHull, [c_void_p]) -geom_diff = geom_output(lgdal.OGR_G_Difference, [c_void_p, c_void_p]) -geom_intersection = geom_output(lgdal.OGR_G_Intersection, [c_void_p, c_void_p]) -geom_sym_diff = geom_output(lgdal.OGR_G_SymmetricDifference, [c_void_p, c_void_p]) -geom_union = geom_output(lgdal.OGR_G_Union, [c_void_p, c_void_p]) -is_3d = bool_output(lgdal.OGR_G_Is3D, [c_void_p]) -set_3d = void_output(lgdal.OGR_G_Set3D, [c_void_p, c_int], errcheck=False) -is_measured = bool_output(lgdal.OGR_G_IsMeasured, [c_void_p]) -set_measured = void_output(lgdal.OGR_G_SetMeasured, [c_void_p, c_int], errcheck=False) -has_curve_geom = bool_output(lgdal.OGR_G_HasCurveGeometry, [c_void_p, c_int]) -get_linear_geom = geom_output( - lgdal.OGR_G_GetLinearGeometry, [c_void_p, c_double, POINTER(c_char_p)] -) -get_curve_geom = geom_output( - lgdal.OGR_G_GetCurveGeometry, [c_void_p, POINTER(c_char_p)] -) - -# Geometry modification routines. -add_geom = void_output(lgdal.OGR_G_AddGeometry, [c_void_p, c_void_p]) -import_wkt = void_output(lgdal.OGR_G_ImportFromWkt, [c_void_p, POINTER(c_char_p)]) - -# Destroys a geometry -destroy_geom = void_output(lgdal.OGR_G_DestroyGeometry, [c_void_p], errcheck=False) - -# Geometry export routines. -to_wkb = void_output( - lgdal.OGR_G_ExportToWkb, None, errcheck=True -) # special handling for WKB. -to_iso_wkb = void_output(lgdal.OGR_G_ExportToIsoWkb, None, errcheck=True) -to_wkt = string_output( - lgdal.OGR_G_ExportToWkt, [c_void_p, POINTER(c_char_p)], decoding="ascii" -) -to_iso_wkt = string_output( - lgdal.OGR_G_ExportToIsoWkt, [c_void_p, POINTER(c_char_p)], decoding="ascii" -) -to_gml = string_output( - lgdal.OGR_G_ExportToGML, [c_void_p], str_result=True, decoding="ascii" -) -if GDAL_VERSION >= (3, 3): - get_wkbsize = int_output(lgdal.OGR_G_WkbSizeEx, [c_void_p]) -else: - get_wkbsize = int_output(lgdal.OGR_G_WkbSize, [c_void_p]) - -# Geometry spatial-reference related routines. -assign_srs = void_output( - lgdal.OGR_G_AssignSpatialReference, [c_void_p, c_void_p], errcheck=False -) -get_geom_srs = srs_output(lgdal.OGR_G_GetSpatialReference, [c_void_p]) - -# Geometry properties -get_area = double_output(lgdal.OGR_G_GetArea, [c_void_p]) -get_centroid = void_output(lgdal.OGR_G_Centroid, [c_void_p, c_void_p]) -get_dims = int_output(lgdal.OGR_G_GetDimension, [c_void_p]) -get_coord_dim = int_output(lgdal.OGR_G_CoordinateDimension, [c_void_p]) -set_coord_dim = void_output( - lgdal.OGR_G_SetCoordinateDimension, [c_void_p, c_int], errcheck=False -) -is_empty = int_output( - lgdal.OGR_G_IsEmpty, [c_void_p], errcheck=lambda result, func, cargs: bool(result) -) - -get_geom_count = int_output(lgdal.OGR_G_GetGeometryCount, [c_void_p]) -get_geom_name = const_string_output( - lgdal.OGR_G_GetGeometryName, [c_void_p], decoding="ascii" -) -get_geom_type = int_output(lgdal.OGR_G_GetGeometryType, [c_void_p]) -get_point_count = int_output(lgdal.OGR_G_GetPointCount, [c_void_p]) -get_point = void_output( - lgdal.OGR_G_GetPointZM, - [ - c_void_p, - c_int, - POINTER(c_double), - POINTER(c_double), - POINTER(c_double), - POINTER(c_double), - ], - errcheck=False, -) -geom_close_rings = void_output(lgdal.OGR_G_CloseRings, [c_void_p], errcheck=False) - -# Topology routines. -ogr_contains = topology_func(lgdal.OGR_G_Contains) -ogr_crosses = topology_func(lgdal.OGR_G_Crosses) -ogr_disjoint = topology_func(lgdal.OGR_G_Disjoint) -ogr_equals = topology_func(lgdal.OGR_G_Equals) -ogr_intersects = topology_func(lgdal.OGR_G_Intersects) -ogr_overlaps = topology_func(lgdal.OGR_G_Overlaps) -ogr_touches = topology_func(lgdal.OGR_G_Touches) -ogr_within = topology_func(lgdal.OGR_G_Within) - -# Transformation routines. -geom_transform = void_output(lgdal.OGR_G_Transform, [c_void_p, c_void_p]) -geom_transform_to = void_output(lgdal.OGR_G_TransformTo, [c_void_p, c_void_p]) - -# For retrieving the envelope of the geometry. -get_envelope = env_func(lgdal.OGR_G_GetEnvelope, [c_void_p, POINTER(OGREnvelope)]) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/raster.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/raster.py deleted file mode 100644 index d1dd9ec..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/raster.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -This module houses the ctypes function prototypes for GDAL DataSource (raster) -related data structures. -""" - -from ctypes import POINTER, c_bool, c_char_p, c_double, c_int, c_void_p -from functools import partial - -from django.contrib.gis.gdal.libgdal import std_call -from django.contrib.gis.gdal.prototypes.generation import ( - chararray_output, - const_string_output, - double_output, - int_output, - void_output, - voidptr_output, -) - -# For more detail about c function names and definitions see -# https://gdal.org/api/raster_c_api.html -# https://gdal.org/doxygen/gdalwarper_8h.html -# https://gdal.org/api/gdal_utils.html - -# Prepare partial functions that use cpl error codes -void_output = partial(void_output, cpl=True) -const_string_output = partial(const_string_output, cpl=True) -double_output = partial(double_output, cpl=True) - -# Raster Data Source Routines -create_ds = voidptr_output( - std_call("GDALCreate"), [c_void_p, c_char_p, c_int, c_int, c_int, c_int, c_void_p] -) -open_ds = voidptr_output(std_call("GDALOpen"), [c_char_p, c_int]) -close_ds = void_output(std_call("GDALClose"), [c_void_p], errcheck=False) -flush_ds = int_output(std_call("GDALFlushCache"), [c_void_p]) -copy_ds = voidptr_output( - std_call("GDALCreateCopy"), - [c_void_p, c_char_p, c_void_p, c_int, POINTER(c_char_p), c_void_p, c_void_p], -) -add_band_ds = void_output(std_call("GDALAddBand"), [c_void_p, c_int]) -get_ds_description = const_string_output(std_call("GDALGetDescription"), [c_void_p]) -get_ds_driver = voidptr_output(std_call("GDALGetDatasetDriver"), [c_void_p]) -get_ds_info = const_string_output(std_call("GDALInfo"), [c_void_p, c_void_p]) -get_ds_xsize = int_output(std_call("GDALGetRasterXSize"), [c_void_p]) -get_ds_ysize = int_output(std_call("GDALGetRasterYSize"), [c_void_p]) -get_ds_raster_count = int_output(std_call("GDALGetRasterCount"), [c_void_p]) -get_ds_raster_band = voidptr_output(std_call("GDALGetRasterBand"), [c_void_p, c_int]) -get_ds_projection_ref = const_string_output( - std_call("GDALGetProjectionRef"), [c_void_p] -) -set_ds_projection_ref = void_output(std_call("GDALSetProjection"), [c_void_p, c_char_p]) -get_ds_geotransform = void_output( - std_call("GDALGetGeoTransform"), [c_void_p, POINTER(c_double * 6)], errcheck=False -) -set_ds_geotransform = void_output( - std_call("GDALSetGeoTransform"), [c_void_p, POINTER(c_double * 6)] -) - -get_ds_metadata = chararray_output( - std_call("GDALGetMetadata"), [c_void_p, c_char_p], errcheck=False -) -set_ds_metadata = void_output( - std_call("GDALSetMetadata"), [c_void_p, POINTER(c_char_p), c_char_p] -) -get_ds_metadata_domain_list = chararray_output( - std_call("GDALGetMetadataDomainList"), [c_void_p], errcheck=False -) -get_ds_metadata_item = const_string_output( - std_call("GDALGetMetadataItem"), [c_void_p, c_char_p, c_char_p] -) -set_ds_metadata_item = const_string_output( - std_call("GDALSetMetadataItem"), [c_void_p, c_char_p, c_char_p, c_char_p] -) -free_dsl = void_output(std_call("CSLDestroy"), [POINTER(c_char_p)], errcheck=False) - -# Raster Band Routines -band_io = void_output( - std_call("GDALRasterIO"), - [ - c_void_p, - c_int, - c_int, - c_int, - c_int, - c_int, - c_void_p, - c_int, - c_int, - c_int, - c_int, - c_int, - ], -) -get_band_xsize = int_output(std_call("GDALGetRasterBandXSize"), [c_void_p]) -get_band_ysize = int_output(std_call("GDALGetRasterBandYSize"), [c_void_p]) -get_band_index = int_output(std_call("GDALGetBandNumber"), [c_void_p]) -get_band_description = const_string_output(std_call("GDALGetDescription"), [c_void_p]) -get_band_ds = voidptr_output(std_call("GDALGetBandDataset"), [c_void_p]) -get_band_datatype = int_output(std_call("GDALGetRasterDataType"), [c_void_p]) -get_band_color_interp = int_output( - std_call("GDALGetRasterColorInterpretation"), [c_void_p] -) -get_band_nodata_value = double_output( - std_call("GDALGetRasterNoDataValue"), [c_void_p, POINTER(c_int)] -) -set_band_nodata_value = void_output( - std_call("GDALSetRasterNoDataValue"), [c_void_p, c_double] -) -delete_band_nodata_value = void_output( - std_call("GDALDeleteRasterNoDataValue"), [c_void_p] -) -get_band_statistics = void_output( - std_call("GDALGetRasterStatistics"), - [ - c_void_p, - c_int, - c_int, - POINTER(c_double), - POINTER(c_double), - POINTER(c_double), - POINTER(c_double), - c_void_p, - c_void_p, - ], -) -compute_band_statistics = void_output( - std_call("GDALComputeRasterStatistics"), - [ - c_void_p, - c_int, - POINTER(c_double), - POINTER(c_double), - POINTER(c_double), - POINTER(c_double), - c_void_p, - c_void_p, - ], -) - -# Reprojection routine -reproject_image = void_output( - std_call("GDALReprojectImage"), - [ - c_void_p, - c_char_p, - c_void_p, - c_char_p, - c_int, - c_double, - c_double, - c_void_p, - c_void_p, - c_void_p, - ], -) -auto_create_warped_vrt = voidptr_output( - std_call("GDALAutoCreateWarpedVRT"), - [c_void_p, c_char_p, c_char_p, c_int, c_double, c_void_p], -) - -# Create VSI gdal raster files from in-memory buffers. -# https://gdal.org/api/cpl.html#cpl-vsi-h -create_vsi_file_from_mem_buffer = voidptr_output( - std_call("VSIFileFromMemBuffer"), [c_char_p, c_void_p, c_int, c_int] -) -get_mem_buffer_from_vsi_file = voidptr_output( - std_call("VSIGetMemFileBuffer"), [c_char_p, POINTER(c_int), c_bool] -) -unlink_vsi_file = int_output(std_call("VSIUnlink"), [c_char_p]) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/srs.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/srs.py deleted file mode 100644 index 82d91bd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/prototypes/srs.py +++ /dev/null @@ -1,107 +0,0 @@ -from ctypes import POINTER, c_char_p, c_int, c_void_p - -from django.contrib.gis.gdal.libgdal import lgdal, std_call -from django.contrib.gis.gdal.prototypes.generation import ( - const_string_output, - double_output, - int_output, - srs_output, - string_output, - void_output, -) - - -# Shortcut generation for routines with known parameters. -def srs_double(f): - """ - Create a function prototype for the OSR routines that take - the OSRSpatialReference object and return a double value. - """ - return double_output(f, [c_void_p, POINTER(c_int)], errcheck=True) - - -def units_func(f): - """ - Create a ctypes function prototype for OSR units functions, e.g., - OSRGetAngularUnits, OSRGetLinearUnits. - """ - return double_output(f, [c_void_p, POINTER(c_char_p)], strarg=True) - - -# Creation & destruction. -clone_srs = srs_output(std_call("OSRClone"), [c_void_p]) -new_srs = srs_output(std_call("OSRNewSpatialReference"), [c_char_p]) -release_srs = void_output(lgdal.OSRRelease, [c_void_p], errcheck=False) -destroy_srs = void_output( - std_call("OSRDestroySpatialReference"), [c_void_p], errcheck=False -) -srs_validate = void_output(lgdal.OSRValidate, [c_void_p]) -set_axis_strategy = void_output( - lgdal.OSRSetAxisMappingStrategy, [c_void_p, c_int], errcheck=False -) - -# Getting the semi_major, semi_minor, and flattening functions. -semi_major = srs_double(lgdal.OSRGetSemiMajor) -semi_minor = srs_double(lgdal.OSRGetSemiMinor) -invflattening = srs_double(lgdal.OSRGetInvFlattening) - -# WKT, PROJ, EPSG, XML importation routines. -from_wkt = void_output(lgdal.OSRImportFromWkt, [c_void_p, POINTER(c_char_p)]) -from_proj = void_output(lgdal.OSRImportFromProj4, [c_void_p, c_char_p]) -from_epsg = void_output(std_call("OSRImportFromEPSG"), [c_void_p, c_int]) -from_xml = void_output(lgdal.OSRImportFromXML, [c_void_p, c_char_p]) -from_user_input = void_output(std_call("OSRSetFromUserInput"), [c_void_p, c_char_p]) - -# Morphing to/from ESRI WKT. -morph_to_esri = void_output(lgdal.OSRMorphToESRI, [c_void_p]) -morph_from_esri = void_output(lgdal.OSRMorphFromESRI, [c_void_p]) - -# Identifying the EPSG -identify_epsg = void_output(lgdal.OSRAutoIdentifyEPSG, [c_void_p]) - -# Getting the angular_units, linear_units functions -linear_units = units_func(lgdal.OSRGetLinearUnits) -angular_units = units_func(lgdal.OSRGetAngularUnits) - -# For exporting to WKT, PROJ, "Pretty" WKT, and XML. -to_wkt = string_output( - std_call("OSRExportToWkt"), [c_void_p, POINTER(c_char_p)], decoding="utf-8" -) -to_proj = string_output( - std_call("OSRExportToProj4"), [c_void_p, POINTER(c_char_p)], decoding="ascii" -) -to_pretty_wkt = string_output( - std_call("OSRExportToPrettyWkt"), - [c_void_p, POINTER(c_char_p), c_int], - offset=-2, - decoding="utf-8", -) - -to_xml = string_output( - lgdal.OSRExportToXML, - [c_void_p, POINTER(c_char_p), c_char_p], - offset=-2, - decoding="utf-8", -) - -# String attribute retrieval routines. -get_attr_value = const_string_output( - std_call("OSRGetAttrValue"), [c_void_p, c_char_p, c_int], decoding="utf-8" -) -get_auth_name = const_string_output( - lgdal.OSRGetAuthorityName, [c_void_p, c_char_p], decoding="ascii" -) -get_auth_code = const_string_output( - lgdal.OSRGetAuthorityCode, [c_void_p, c_char_p], decoding="ascii" -) - -# SRS Properties -isgeographic = int_output(lgdal.OSRIsGeographic, [c_void_p]) -islocal = int_output(lgdal.OSRIsLocal, [c_void_p]) -isprojected = int_output(lgdal.OSRIsProjected, [c_void_p]) - -# Coordinate transformation -new_ct = srs_output(std_call("OCTNewCoordinateTransformation"), [c_void_p, c_void_p]) -destroy_ct = void_output( - std_call("OCTDestroyCoordinateTransformation"), [c_void_p], errcheck=False -) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/band.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/band.py deleted file mode 100644 index c3ec960..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/band.py +++ /dev/null @@ -1,273 +0,0 @@ -from ctypes import byref, c_double, c_int, c_void_p - -from django.contrib.gis.gdal.error import GDALException -from django.contrib.gis.gdal.prototypes import raster as capi -from django.contrib.gis.gdal.raster.base import GDALRasterBase -from django.contrib.gis.shortcuts import numpy -from django.utils.encoding import force_str - -from .const import ( - GDAL_COLOR_TYPES, - GDAL_INTEGER_TYPES, - GDAL_PIXEL_TYPES, - GDAL_TO_CTYPES, -) - - -class GDALBand(GDALRasterBase): - """ - Wrap a GDAL raster band, needs to be obtained from a GDALRaster object. - """ - - def __init__(self, source, index): - self.source = source - self._ptr = capi.get_ds_raster_band(source._ptr, index) - - def _flush(self): - """ - Call the flush method on the Band's parent raster and force a refresh - of the statistics attribute when requested the next time. - """ - self.source._flush() - self._stats_refresh = True - - @property - def description(self): - """ - Return the description string of the band. - """ - return force_str(capi.get_band_description(self._ptr)) - - @property - def width(self): - """ - Width (X axis) in pixels of the band. - """ - return capi.get_band_xsize(self._ptr) - - @property - def height(self): - """ - Height (Y axis) in pixels of the band. - """ - return capi.get_band_ysize(self._ptr) - - @property - def pixel_count(self): - """ - Return the total number of pixels in this band. - """ - return self.width * self.height - - _stats_refresh = False - - def statistics(self, refresh=False, approximate=False): - """ - Compute statistics on the pixel values of this band. - - The return value is a tuple with the following structure: - (minimum, maximum, mean, standard deviation). - - If approximate=True, the statistics may be computed based on overviews - or a subset of image tiles. - - If refresh=True, the statistics will be computed from the data directly, - and the cache will be updated where applicable. - - For empty bands (where all pixel values are nodata), all statistics - values are returned as None. - - For raster formats using Persistent Auxiliary Metadata (PAM) services, - the statistics might be cached in an auxiliary file. - """ - # Prepare array with arguments for capi function - smin, smax, smean, sstd = c_double(), c_double(), c_double(), c_double() - stats_args = [ - self._ptr, - c_int(approximate), - byref(smin), - byref(smax), - byref(smean), - byref(sstd), - c_void_p(), - c_void_p(), - ] - - if refresh or self._stats_refresh: - func = capi.compute_band_statistics - else: - # Add additional argument to force computation if there is no - # existing PAM file to take the values from. - force = True - stats_args.insert(2, c_int(force)) - func = capi.get_band_statistics - - # Computation of statistics fails for empty bands. - try: - func(*stats_args) - result = smin.value, smax.value, smean.value, sstd.value - except GDALException: - result = (None, None, None, None) - - self._stats_refresh = False - - return result - - @property - def min(self): - """ - Return the minimum pixel value for this band. - """ - return self.statistics()[0] - - @property - def max(self): - """ - Return the maximum pixel value for this band. - """ - return self.statistics()[1] - - @property - def mean(self): - """ - Return the mean of all pixel values of this band. - """ - return self.statistics()[2] - - @property - def std(self): - """ - Return the standard deviation of all pixel values of this band. - """ - return self.statistics()[3] - - @property - def nodata_value(self): - """ - Return the nodata value for this band, or None if it isn't set. - """ - # Get value and nodata exists flag - nodata_exists = c_int() - value = capi.get_band_nodata_value(self._ptr, nodata_exists) - if not nodata_exists: - value = None - # If the pixeltype is an integer, convert to int - elif self.datatype() in GDAL_INTEGER_TYPES: - value = int(value) - return value - - @nodata_value.setter - def nodata_value(self, value): - """ - Set the nodata value for this band. - """ - if value is None: - capi.delete_band_nodata_value(self._ptr) - elif not isinstance(value, (int, float)): - raise ValueError("Nodata value must be numeric or None.") - else: - capi.set_band_nodata_value(self._ptr, value) - self._flush() - - def datatype(self, as_string=False): - """ - Return the GDAL Pixel Datatype for this band. - """ - dtype = capi.get_band_datatype(self._ptr) - if as_string: - dtype = GDAL_PIXEL_TYPES[dtype] - return dtype - - def color_interp(self, as_string=False): - """Return the GDAL color interpretation for this band.""" - color = capi.get_band_color_interp(self._ptr) - if as_string: - color = GDAL_COLOR_TYPES[color] - return color - - def data(self, data=None, offset=None, size=None, shape=None, as_memoryview=False): - """ - Read or writes pixel values for this band. Blocks of data can - be accessed by specifying the width, height and offset of the - desired block. The same specification can be used to update - parts of a raster by providing an array of values. - - Allowed input data types are bytes, memoryview, list, tuple, and array. - """ - offset = offset or (0, 0) - size = size or (self.width - offset[0], self.height - offset[1]) - shape = shape or size - if any(x <= 0 for x in size): - raise ValueError("Offset too big for this raster.") - - if size[0] > self.width or size[1] > self.height: - raise ValueError("Size is larger than raster.") - - # Create ctypes type array generator - ctypes_array = GDAL_TO_CTYPES[self.datatype()] * (shape[0] * shape[1]) - - if data is None: - # Set read mode - access_flag = 0 - # Prepare empty ctypes array - data_array = ctypes_array() - else: - # Set write mode - access_flag = 1 - - # Instantiate ctypes array holding the input data - if isinstance(data, (bytes, memoryview)) or ( - numpy and isinstance(data, numpy.ndarray) - ): - data_array = ctypes_array.from_buffer_copy(data) - else: - data_array = ctypes_array(*data) - - # Access band - capi.band_io( - self._ptr, - access_flag, - offset[0], - offset[1], - size[0], - size[1], - byref(data_array), - shape[0], - shape[1], - self.datatype(), - 0, - 0, - ) - - # Return data as numpy array if possible, otherwise as list - if data is None: - if as_memoryview: - return memoryview(data_array) - elif numpy: - # reshape() needs a reshape parameter with the height first. - return numpy.frombuffer( - data_array, dtype=numpy.dtype(data_array) - ).reshape(tuple(reversed(size))) - else: - return list(data_array) - else: - self._flush() - - -class BandList(list): - def __init__(self, source): - self.source = source - super().__init__() - - def __iter__(self): - for idx in range(1, len(self) + 1): - yield GDALBand(self.source, idx) - - def __len__(self): - return capi.get_ds_raster_count(self.source._ptr) - - def __getitem__(self, index): - try: - return GDALBand(self.source, index + 1) - except GDALException: - raise GDALException("Unable to get band index %d" % index) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/base.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/base.py deleted file mode 100644 index 3d95c90..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/base.py +++ /dev/null @@ -1,77 +0,0 @@ -from django.contrib.gis.gdal.base import GDALBase -from django.contrib.gis.gdal.prototypes import raster as capi - - -class GDALRasterBase(GDALBase): - """ - Attributes that exist on both GDALRaster and GDALBand. - """ - - @property - def metadata(self): - """ - Return the metadata for this raster or band. The return value is a - nested dictionary, where the first-level key is the metadata domain and - the second-level is the metadata item names and values for that domain. - """ - # The initial metadata domain list contains the default domain. - # The default is returned if domain name is None. - domain_list = ["DEFAULT"] - - # Get additional metadata domains from the raster. - meta_list = capi.get_ds_metadata_domain_list(self._ptr) - if meta_list: - # The number of domains is unknown, so retrieve data until there - # are no more values in the ctypes array. - counter = 0 - domain = meta_list[counter] - while domain: - domain_list.append(domain.decode()) - counter += 1 - domain = meta_list[counter] - - # Free domain list array. - capi.free_dsl(meta_list) - - # Retrieve metadata values for each domain. - result = {} - for domain in domain_list: - # Get metadata for this domain. - data = capi.get_ds_metadata( - self._ptr, - (None if domain == "DEFAULT" else domain.encode()), - ) - if not data: - continue - # The number of metadata items is unknown, so retrieve data until - # there are no more values in the ctypes array. - domain_meta = {} - counter = 0 - item = data[counter] - while item: - key, val = item.decode().split("=") - domain_meta[key] = val - counter += 1 - item = data[counter] - # The default domain values are returned if domain is None. - result[domain or "DEFAULT"] = domain_meta - return result - - @metadata.setter - def metadata(self, value): - """ - Set the metadata. Update only the domains that are contained in the - value dictionary. - """ - # Loop through domains. - for domain, metadata in value.items(): - # Set the domain to None for the default, otherwise encode. - domain = None if domain == "DEFAULT" else domain.encode() - # Set each metadata entry separately. - for meta_name, meta_value in metadata.items(): - capi.set_ds_metadata_item( - self._ptr, - meta_name.encode(), - meta_value.encode() if meta_value else None, - domain, - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/const.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/const.py deleted file mode 100644 index a1ab62f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/const.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -GDAL - Constant definitions -""" - -from ctypes import ( - c_double, - c_float, - c_int8, - c_int16, - c_int32, - c_int64, - c_ubyte, - c_uint16, - c_uint32, - c_uint64, -) - -# See https://gdal.org/api/raster_c_api.html#_CPPv412GDALDataType -GDAL_PIXEL_TYPES = { - 0: "GDT_Unknown", # Unknown or unspecified type - 1: "GDT_Byte", # Eight bit unsigned integer - 2: "GDT_UInt16", # Sixteen bit unsigned integer - 3: "GDT_Int16", # Sixteen bit signed integer - 4: "GDT_UInt32", # Thirty-two bit unsigned integer - 5: "GDT_Int32", # Thirty-two bit signed integer - 6: "GDT_Float32", # Thirty-two bit floating point - 7: "GDT_Float64", # Sixty-four bit floating point - 8: "GDT_CInt16", # Complex Int16 - 9: "GDT_CInt32", # Complex Int32 - 10: "GDT_CFloat32", # Complex Float32 - 11: "GDT_CFloat64", # Complex Float64 - 12: "GDT_UInt64", # 64 bit unsigned integer (GDAL 3.5+). - 13: "GDT_Int64", # 64 bit signed integer (GDAL 3.5+). - 14: "GDT_Int8", # 8 bit signed integer (GDAL 3.7+). -} - -# A list of gdal datatypes that are integers. -GDAL_INTEGER_TYPES = [1, 2, 3, 4, 5, 12, 13, 14] - -# Lookup values to convert GDAL pixel type indices into ctypes objects. -# The GDAL band-io works with ctypes arrays to hold data to be written -# or to hold the space for data to be read into. The lookup below helps -# selecting the right ctypes object for a given gdal pixel type. -GDAL_TO_CTYPES = [ - None, - c_ubyte, - c_uint16, - c_int16, - c_uint32, - c_int32, - c_float, - c_double, - None, - None, - None, - None, - c_uint64, - c_int64, - c_int8, -] - -# List of resampling algorithms that can be used to warp a GDALRaster. -GDAL_RESAMPLE_ALGORITHMS = { - "NearestNeighbour": 0, - "Bilinear": 1, - "Cubic": 2, - "CubicSpline": 3, - "Lanczos": 4, - "Average": 5, - "Mode": 6, -} - -# See https://gdal.org/api/raster_c_api.html#_CPPv415GDALColorInterp -GDAL_COLOR_TYPES = { - 0: "GCI_Undefined", # Undefined, default value, i.e. not known - 1: "GCI_GrayIndex", # Grayscale - 2: "GCI_PaletteIndex", # Paletted - 3: "GCI_RedBand", # Red band of RGBA image - 4: "GCI_GreenBand", # Green band of RGBA image - 5: "GCI_BlueBand", # Blue band of RGBA image - 6: "GCI_AlphaBand", # Alpha (0=transparent, 255=opaque) - 7: "GCI_HueBand", # Hue band of HLS image - 8: "GCI_SaturationBand", # Saturation band of HLS image - 9: "GCI_LightnessBand", # Lightness band of HLS image - 10: "GCI_CyanBand", # Cyan band of CMYK image - 11: "GCI_MagentaBand", # Magenta band of CMYK image - 12: "GCI_YellowBand", # Yellow band of CMYK image - 13: "GCI_BlackBand", # Black band of CMLY image - 14: "GCI_YCbCr_YBand", # Y Luminance - 15: "GCI_YCbCr_CbBand", # Cb Chroma - 16: "GCI_YCbCr_CrBand", # Cr Chroma, also GCI_Max -} - -# GDAL virtual filesystems prefix. -VSI_FILESYSTEM_PREFIX = "/vsi" - -# Fixed base path for buffer-based GDAL in-memory files. -VSI_MEM_FILESYSTEM_BASE_PATH = "/vsimem/" - -# Should the memory file system take ownership of the buffer, freeing it when -# the file is deleted? (No, GDALRaster.__del__() will delete the buffer.) -VSI_TAKE_BUFFER_OWNERSHIP = False - -# Should a VSI file be removed when retrieving its buffer? -VSI_DELETE_BUFFER_ON_READ = False diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/source.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/source.py deleted file mode 100644 index b33eb11..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/raster/source.py +++ /dev/null @@ -1,541 +0,0 @@ -import json -import os -import sys -import uuid -from ctypes import ( - addressof, - byref, - c_buffer, - c_char_p, - c_double, - c_int, - c_void_p, - string_at, -) -from pathlib import Path - -from django.contrib.gis.gdal.driver import Driver -from django.contrib.gis.gdal.error import GDALException -from django.contrib.gis.gdal.prototypes import raster as capi -from django.contrib.gis.gdal.raster.band import BandList -from django.contrib.gis.gdal.raster.base import GDALRasterBase -from django.contrib.gis.gdal.raster.const import ( - GDAL_RESAMPLE_ALGORITHMS, - VSI_DELETE_BUFFER_ON_READ, - VSI_FILESYSTEM_PREFIX, - VSI_MEM_FILESYSTEM_BASE_PATH, - VSI_TAKE_BUFFER_OWNERSHIP, -) -from django.contrib.gis.gdal.srs import SpatialReference, SRSException -from django.contrib.gis.geometry import json_regex -from django.utils.encoding import force_bytes, force_str -from django.utils.functional import cached_property - - -class TransformPoint(list): - indices = { - "origin": (0, 3), - "scale": (1, 5), - "skew": (2, 4), - } - - def __init__(self, raster, prop): - x = raster.geotransform[self.indices[prop][0]] - y = raster.geotransform[self.indices[prop][1]] - super().__init__([x, y]) - self._raster = raster - self._prop = prop - - @property - def x(self): - return self[0] - - @x.setter - def x(self, value): - gtf = self._raster.geotransform - gtf[self.indices[self._prop][0]] = value - self._raster.geotransform = gtf - - @property - def y(self): - return self[1] - - @y.setter - def y(self, value): - gtf = self._raster.geotransform - gtf[self.indices[self._prop][1]] = value - self._raster.geotransform = gtf - - -class GDALRaster(GDALRasterBase): - """ - Wrap a raster GDAL Data Source object. - """ - - destructor = capi.close_ds - - def __init__(self, ds_input, write=False): - self._write = 1 if write else 0 - Driver.ensure_registered() - - # Preprocess json inputs. This converts json strings to dictionaries, - # which are parsed below the same way as direct dictionary inputs. - if isinstance(ds_input, str) and json_regex.match(ds_input): - ds_input = json.loads(ds_input) - - # If input is a valid file path, try setting file as source. - if isinstance(ds_input, (str, Path)): - ds_input = str(ds_input) - if not ds_input.startswith(VSI_FILESYSTEM_PREFIX) and not os.path.exists( - ds_input - ): - raise GDALException( - 'Unable to read raster source input "%s".' % ds_input - ) - try: - # GDALOpen will auto-detect the data source type. - self._ptr = capi.open_ds(force_bytes(ds_input), self._write) - except GDALException as err: - raise GDALException( - 'Could not open the datasource at "{}" ({}).'.format(ds_input, err) - ) - elif isinstance(ds_input, bytes): - # Create a new raster in write mode. - self._write = 1 - # Get size of buffer. - size = sys.getsizeof(ds_input) - # Pass data to ctypes, keeping a reference to the ctypes object so - # that the vsimem file remains available until the GDALRaster is - # deleted. - self._ds_input = c_buffer(ds_input) - # Create random name to reference in vsimem filesystem. - vsi_path = os.path.join(VSI_MEM_FILESYSTEM_BASE_PATH, str(uuid.uuid4())) - # Create vsimem file from buffer. - capi.create_vsi_file_from_mem_buffer( - force_bytes(vsi_path), - byref(self._ds_input), - size, - VSI_TAKE_BUFFER_OWNERSHIP, - ) - # Open the new vsimem file as a GDALRaster. - try: - self._ptr = capi.open_ds(force_bytes(vsi_path), self._write) - except GDALException: - # Remove the broken file from the VSI filesystem. - capi.unlink_vsi_file(force_bytes(vsi_path)) - raise GDALException("Failed creating VSI raster from the input buffer.") - elif isinstance(ds_input, dict): - # A new raster needs to be created in write mode - self._write = 1 - - # Create driver (in memory by default) - driver = Driver(ds_input.get("driver", "MEM")) - - # For out of memory drivers, check filename argument - if driver.name != "MEM" and "name" not in ds_input: - raise GDALException( - 'Specify name for creation of raster with driver "{}".'.format( - driver.name - ) - ) - - # Check if width and height where specified - if "width" not in ds_input or "height" not in ds_input: - raise GDALException( - "Specify width and height attributes for JSON or dict input." - ) - - # Check if srid was specified - if "srid" not in ds_input: - raise GDALException("Specify srid for JSON or dict input.") - - # Create null terminated gdal options array. - papsz_options = [] - for key, val in ds_input.get("papsz_options", {}).items(): - option = "{}={}".format(key, val) - papsz_options.append(option.upper().encode()) - papsz_options.append(None) - - # Convert papszlist to ctypes array. - papsz_options = (c_char_p * len(papsz_options))(*papsz_options) - - # Create GDAL Raster - self._ptr = capi.create_ds( - driver._ptr, - force_bytes(ds_input.get("name", "")), - ds_input["width"], - ds_input["height"], - ds_input.get("nr_of_bands", len(ds_input.get("bands", []))), - ds_input.get("datatype", 6), - byref(papsz_options), - ) - - # Set band data if provided - for i, band_input in enumerate(ds_input.get("bands", [])): - band = self.bands[i] - if "nodata_value" in band_input: - band.nodata_value = band_input["nodata_value"] - # Instantiate band filled with nodata values if only - # partial input data has been provided. - if band.nodata_value is not None and ( - "data" not in band_input - or "size" in band_input - or "shape" in band_input - ): - band.data(data=(band.nodata_value,), shape=(1, 1)) - # Set band data values from input. - band.data( - data=band_input.get("data"), - size=band_input.get("size"), - shape=band_input.get("shape"), - offset=band_input.get("offset"), - ) - - # Set SRID - self.srs = ds_input.get("srid") - - # Set additional properties if provided - if "origin" in ds_input: - self.origin.x, self.origin.y = ds_input["origin"] - - if "scale" in ds_input: - self.scale.x, self.scale.y = ds_input["scale"] - - if "skew" in ds_input: - self.skew.x, self.skew.y = ds_input["skew"] - elif isinstance(ds_input, c_void_p): - # Instantiate the object using an existing pointer to a gdal raster. - self._ptr = ds_input - else: - raise GDALException( - 'Invalid data source input type: "{}".'.format(type(ds_input)) - ) - - def __del__(self): - if self.is_vsi_based: - # Remove the temporary file from the VSI in-memory filesystem. - capi.unlink_vsi_file(force_bytes(self.name)) - super().__del__() - - def __str__(self): - return self.name - - def __repr__(self): - """ - Short-hand representation because WKB may be very large. - """ - return "" % hex(addressof(self._ptr)) - - def _flush(self): - """ - Flush all data from memory into the source file if it exists. - The data that needs flushing are geotransforms, coordinate systems, - nodata_values and pixel values. This function will be called - automatically wherever it is needed. - """ - # Raise an Exception if the value is being changed in read mode. - if not self._write: - raise GDALException( - "Raster needs to be opened in write mode to change values." - ) - capi.flush_ds(self._ptr) - - @property - def vsi_buffer(self): - if not ( - self.is_vsi_based and self.name.startswith(VSI_MEM_FILESYSTEM_BASE_PATH) - ): - return None - # Prepare an integer that will contain the buffer length. - out_length = c_int() - # Get the data using the vsi file name. - dat = capi.get_mem_buffer_from_vsi_file( - force_bytes(self.name), - byref(out_length), - VSI_DELETE_BUFFER_ON_READ, - ) - # Read the full buffer pointer. - return string_at(dat, out_length.value) - - @cached_property - def is_vsi_based(self): - return self._ptr and self.name.startswith(VSI_FILESYSTEM_PREFIX) - - @property - def name(self): - """ - Return the name of this raster. Corresponds to filename - for file-based rasters. - """ - return force_str(capi.get_ds_description(self._ptr)) - - @cached_property - def driver(self): - """ - Return the GDAL Driver used for this raster. - """ - ds_driver = capi.get_ds_driver(self._ptr) - return Driver(ds_driver) - - @property - def width(self): - """ - Width (X axis) in pixels. - """ - return capi.get_ds_xsize(self._ptr) - - @property - def height(self): - """ - Height (Y axis) in pixels. - """ - return capi.get_ds_ysize(self._ptr) - - @property - def srs(self): - """ - Return the SpatialReference used in this GDALRaster. - """ - try: - wkt = capi.get_ds_projection_ref(self._ptr) - if not wkt: - return None - return SpatialReference(wkt, srs_type="wkt") - except SRSException: - return None - - @srs.setter - def srs(self, value): - """ - Set the spatial reference used in this GDALRaster. The input can be - a SpatialReference or any parameter accepted by the SpatialReference - constructor. - """ - if isinstance(value, SpatialReference): - srs = value - elif isinstance(value, (int, str)): - srs = SpatialReference(value) - else: - raise ValueError("Could not create a SpatialReference from input.") - capi.set_ds_projection_ref(self._ptr, srs.wkt.encode()) - self._flush() - - @property - def srid(self): - """ - Shortcut to access the srid of this GDALRaster. - """ - return self.srs.srid - - @srid.setter - def srid(self, value): - """ - Shortcut to set this GDALRaster's srs from an srid. - """ - self.srs = value - - @property - def geotransform(self): - """ - Return the geotransform of the data source. - Return the default geotransform if it does not exist or has not been - set previously. The default is [0.0, 1.0, 0.0, 0.0, 0.0, -1.0]. - """ - # Create empty ctypes double array for data - gtf = (c_double * 6)() - capi.get_ds_geotransform(self._ptr, byref(gtf)) - return list(gtf) - - @geotransform.setter - def geotransform(self, values): - "Set the geotransform for the data source." - if len(values) != 6 or not all(isinstance(x, (int, float)) for x in values): - raise ValueError("Geotransform must consist of 6 numeric values.") - # Create ctypes double array with input and write data - values = (c_double * 6)(*values) - capi.set_ds_geotransform(self._ptr, byref(values)) - self._flush() - - @property - def origin(self): - """ - Coordinates of the raster origin. - """ - return TransformPoint(self, "origin") - - @property - def scale(self): - """ - Pixel scale in units of the raster projection. - """ - return TransformPoint(self, "scale") - - @property - def skew(self): - """ - Skew of pixels (rotation parameters). - """ - return TransformPoint(self, "skew") - - @property - def extent(self): - """ - Return the extent as a 4-tuple (xmin, ymin, xmax, ymax). - """ - # Calculate boundary values based on scale and size - xval = self.origin.x + self.scale.x * self.width - yval = self.origin.y + self.scale.y * self.height - # Calculate min and max values - xmin = min(xval, self.origin.x) - xmax = max(xval, self.origin.x) - ymin = min(yval, self.origin.y) - ymax = max(yval, self.origin.y) - - return xmin, ymin, xmax, ymax - - @property - def bands(self): - return BandList(self) - - def warp(self, ds_input, resampling="NearestNeighbour", max_error=0.0): - """ - Return a warped GDALRaster with the given input characteristics. - - The input is expected to be a dictionary containing the parameters - of the target raster. Allowed values are width, height, SRID, origin, - scale, skew, datatype, driver, and name (filename). - - By default, the warp functions keeps all parameters equal to the values - of the original source raster. For the name of the target raster, the - name of the source raster will be used and appended with - _copy. + source_driver_name. - - In addition, the resampling algorithm can be specified with the "resampling" - input parameter. The default is NearestNeighbor. For a list of all options - consult the GDAL_RESAMPLE_ALGORITHMS constant. - """ - # Get the parameters defining the geotransform, srid, and size of the raster - ds_input.setdefault("width", self.width) - ds_input.setdefault("height", self.height) - ds_input.setdefault("srid", self.srs.srid) - ds_input.setdefault("origin", self.origin) - ds_input.setdefault("scale", self.scale) - ds_input.setdefault("skew", self.skew) - # Get the driver, name, and datatype of the target raster - ds_input.setdefault("driver", self.driver.name) - - if "name" not in ds_input: - ds_input["name"] = self.name + "_copy." + self.driver.name - - if "datatype" not in ds_input: - ds_input["datatype"] = self.bands[0].datatype() - - # Instantiate raster bands filled with nodata values. - ds_input["bands"] = [{"nodata_value": bnd.nodata_value} for bnd in self.bands] - - # Create target raster - target = GDALRaster(ds_input, write=True) - - # Select resampling algorithm - algorithm = GDAL_RESAMPLE_ALGORITHMS[resampling] - - # Reproject image - capi.reproject_image( - self._ptr, - self.srs.wkt.encode(), - target._ptr, - target.srs.wkt.encode(), - algorithm, - 0.0, - max_error, - c_void_p(), - c_void_p(), - c_void_p(), - ) - - # Make sure all data is written to file - target._flush() - - return target - - def clone(self, name=None): - """Return a clone of this GDALRaster.""" - if name: - clone_name = name - elif self.driver.name != "MEM": - clone_name = self.name + "_copy." + self.driver.name - else: - clone_name = os.path.join(VSI_MEM_FILESYSTEM_BASE_PATH, str(uuid.uuid4())) - return GDALRaster( - capi.copy_ds( - self.driver._ptr, - force_bytes(clone_name), - self._ptr, - c_int(), - c_char_p(), - c_void_p(), - c_void_p(), - ), - write=self._write, - ) - - def transform( - self, srs, driver=None, name=None, resampling="NearestNeighbour", max_error=0.0 - ): - """ - Return a copy of this raster reprojected into the given spatial - reference system. - """ - # Convert the resampling algorithm name into an algorithm id - algorithm = GDAL_RESAMPLE_ALGORITHMS[resampling] - - if isinstance(srs, SpatialReference): - target_srs = srs - elif isinstance(srs, (int, str)): - target_srs = SpatialReference(srs) - else: - raise TypeError( - "Transform only accepts SpatialReference, string, and integer " - "objects." - ) - - if target_srs.srid == self.srid and (not driver or driver == self.driver.name): - return self.clone(name) - # Create warped virtual dataset in the target reference system - target = capi.auto_create_warped_vrt( - self._ptr, - self.srs.wkt.encode(), - target_srs.wkt.encode(), - algorithm, - max_error, - c_void_p(), - ) - target = GDALRaster(target) - - # Construct the target warp dictionary from the virtual raster - data = { - "srid": target_srs.srid, - "width": target.width, - "height": target.height, - "origin": [target.origin.x, target.origin.y], - "scale": [target.scale.x, target.scale.y], - "skew": [target.skew.x, target.skew.y], - } - - # Set the driver and filepath if provided - if driver: - data["driver"] = driver - - if name: - data["name"] = name - - # Warp the raster into new srid - return self.warp(data, resampling=resampling, max_error=max_error) - - @property - def info(self): - """ - Return information about this raster in a string format equivalent - to the output of the gdalinfo command line utility. - """ - return capi.get_ds_info(self.ptr, None).decode() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/srs.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/srs.py deleted file mode 100644 index 8bf72ab..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/gdal/srs.py +++ /dev/null @@ -1,362 +0,0 @@ -""" -The Spatial Reference class, represents OGR Spatial Reference objects. - -Example: ->>> from django.contrib.gis.gdal import SpatialReference ->>> srs = SpatialReference('WGS84') ->>> print(srs) -GEOGCS["WGS 84", - DATUM["WGS_1984", - SPHEROID["WGS 84",6378137,298.257223563, - AUTHORITY["EPSG","7030"]], - TOWGS84[0,0,0,0,0,0,0], - AUTHORITY["EPSG","6326"]], - PRIMEM["Greenwich",0, - AUTHORITY["EPSG","8901"]], - UNIT["degree",0.01745329251994328, - AUTHORITY["EPSG","9122"]], - AUTHORITY["EPSG","4326"]] ->>> print(srs.proj) -+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ->>> print(srs.ellipsoid) -(6378137.0, 6356752.3142451793, 298.25722356300003) ->>> print(srs.projected, srs.geographic) -False True ->>> srs.import_epsg(32140) ->>> print(srs.name) -NAD83 / Texas South Central -""" - -from ctypes import byref, c_char_p, c_int -from enum import IntEnum -from types import NoneType - -from django.contrib.gis.gdal.base import GDALBase -from django.contrib.gis.gdal.error import SRSException -from django.contrib.gis.gdal.prototypes import srs as capi -from django.utils.encoding import force_bytes, force_str - - -class AxisOrder(IntEnum): - TRADITIONAL = 0 - AUTHORITY = 1 - - -class SpatialReference(GDALBase): - """ - A wrapper for the OGRSpatialReference object. According to the GDAL web site, - the SpatialReference object "provide[s] services to represent coordinate - systems (projections and datums) and to transform between them." - """ - - destructor = capi.release_srs - - def __init__(self, srs_input="", srs_type="user", axis_order=None): - """ - Create a GDAL OSR Spatial Reference object from the given input. - The input may be string of OGC Well Known Text (WKT), an integer - EPSG code, a PROJ string, and/or a projection "well known" shorthand - string (one of 'WGS84', 'WGS72', 'NAD27', 'NAD83'). - """ - if not isinstance(axis_order, (NoneType, AxisOrder)): - raise ValueError( - "SpatialReference.axis_order must be an AxisOrder instance." - ) - self.axis_order = axis_order or AxisOrder.TRADITIONAL - if srs_type == "wkt": - self.ptr = capi.new_srs(c_char_p(b"")) - self.import_wkt(srs_input) - if self.axis_order == AxisOrder.TRADITIONAL: - capi.set_axis_strategy(self.ptr, self.axis_order) - return - elif isinstance(srs_input, str): - try: - # If SRID is a string, e.g., '4326', then make acceptable - # as user input. - srid = int(srs_input) - srs_input = "EPSG:%d" % srid - except ValueError: - pass - elif isinstance(srs_input, int): - # EPSG integer code was input. - srs_type = "epsg" - elif isinstance(srs_input, self.ptr_type): - srs = srs_input - srs_type = "ogr" - else: - raise TypeError('Invalid SRS type "%s"' % srs_type) - - if srs_type == "ogr": - # Input is already an SRS pointer. - srs = srs_input - else: - # Creating a new SRS pointer, using the string buffer. - buf = c_char_p(b"") - srs = capi.new_srs(buf) - - # If the pointer is NULL, throw an exception. - if not srs: - raise SRSException( - "Could not create spatial reference from: %s" % srs_input - ) - else: - self.ptr = srs - - if self.axis_order == AxisOrder.TRADITIONAL: - capi.set_axis_strategy(self.ptr, self.axis_order) - # Importing from either the user input string or an integer SRID. - if srs_type == "user": - self.import_user_input(srs_input) - elif srs_type == "epsg": - self.import_epsg(srs_input) - - def __getitem__(self, target): - """ - Return the value of the given string attribute node, None if the node - doesn't exist. Can also take a tuple as a parameter, (target, child), - where child is the index of the attribute in the WKT. For example: - - >>> wkt = 'GEOGCS["WGS 84", DATUM["WGS_1984, ... AUTHORITY["EPSG","4326"]]' - >>> srs = SpatialReference(wkt) # could also use 'WGS84', or 4326 - >>> print(srs['GEOGCS']) - WGS 84 - >>> print(srs['DATUM']) - WGS_1984 - >>> print(srs['AUTHORITY']) - EPSG - >>> print(srs['AUTHORITY', 1]) # The authority value - 4326 - >>> print(srs['TOWGS84', 4]) # the fourth value in this wkt - 0 - >>> # For the units authority, have to use the pipe symbole. - >>> print(srs['UNIT|AUTHORITY']) - EPSG - >>> print(srs['UNIT|AUTHORITY', 1]) # The authority value for the units - 9122 - """ - if isinstance(target, tuple): - return self.attr_value(*target) - else: - return self.attr_value(target) - - def __str__(self): - "Use 'pretty' WKT." - return self.pretty_wkt - - # #### SpatialReference Methods #### - def attr_value(self, target, index=0): - """ - The attribute value for the given target node (e.g. 'PROJCS'). The index - keyword specifies an index of the child node to return. - """ - if not isinstance(target, str) or not isinstance(index, int): - raise TypeError - return capi.get_attr_value(self.ptr, force_bytes(target), index) - - def auth_name(self, target): - "Return the authority name for the given string target node." - return capi.get_auth_name( - self.ptr, target if target is None else force_bytes(target) - ) - - def auth_code(self, target): - "Return the authority code for the given string target node." - return capi.get_auth_code( - self.ptr, target if target is None else force_bytes(target) - ) - - def clone(self): - "Return a clone of this SpatialReference object." - return SpatialReference(capi.clone_srs(self.ptr), axis_order=self.axis_order) - - def from_esri(self): - "Morph this SpatialReference from ESRI's format to EPSG." - capi.morph_from_esri(self.ptr) - - def identify_epsg(self): - """ - This method inspects the WKT of this SpatialReference, and will - add EPSG authority nodes where an EPSG identifier is applicable. - """ - capi.identify_epsg(self.ptr) - - def to_esri(self): - "Morph this SpatialReference to ESRI's format." - capi.morph_to_esri(self.ptr) - - def validate(self): - "Check to see if the given spatial reference is valid." - capi.srs_validate(self.ptr) - - # #### Name & SRID properties #### - @property - def name(self): - "Return the name of this Spatial Reference." - if self.projected: - return self.attr_value("PROJCS") - elif self.geographic: - return self.attr_value("GEOGCS") - elif self.local: - return self.attr_value("LOCAL_CS") - else: - return None - - @property - def srid(self): - "Return the SRID of top-level authority, or None if undefined." - try: - return int(self.auth_code(target=None)) - except (TypeError, ValueError): - return None - - # #### Unit Properties #### - @property - def linear_name(self): - "Return the name of the linear units." - units, name = capi.linear_units(self.ptr, byref(c_char_p())) - return name - - @property - def linear_units(self): - "Return the value of the linear units." - units, name = capi.linear_units(self.ptr, byref(c_char_p())) - return units - - @property - def angular_name(self): - "Return the name of the angular units." - units, name = capi.angular_units(self.ptr, byref(c_char_p())) - return name - - @property - def angular_units(self): - "Return the value of the angular units." - units, name = capi.angular_units(self.ptr, byref(c_char_p())) - return units - - @property - def units(self): - """ - Return a 2-tuple of the units value and the units name. Automatically - determine whether to return the linear or angular units. - """ - units, name = None, None - if self.projected or self.local: - units, name = capi.linear_units(self.ptr, byref(c_char_p())) - elif self.geographic: - units, name = capi.angular_units(self.ptr, byref(c_char_p())) - if name is not None: - name = force_str(name) - return (units, name) - - # #### Spheroid/Ellipsoid Properties #### - @property - def ellipsoid(self): - """ - Return a tuple of the ellipsoid parameters: - (semimajor axis, semiminor axis, and inverse flattening) - """ - return (self.semi_major, self.semi_minor, self.inverse_flattening) - - @property - def semi_major(self): - "Return the Semi Major Axis for this Spatial Reference." - return capi.semi_major(self.ptr, byref(c_int())) - - @property - def semi_minor(self): - "Return the Semi Minor Axis for this Spatial Reference." - return capi.semi_minor(self.ptr, byref(c_int())) - - @property - def inverse_flattening(self): - "Return the Inverse Flattening for this Spatial Reference." - return capi.invflattening(self.ptr, byref(c_int())) - - # #### Boolean Properties #### - @property - def geographic(self): - """ - Return True if this SpatialReference is geographic - (root node is GEOGCS). - """ - return bool(capi.isgeographic(self.ptr)) - - @property - def local(self): - "Return True if this SpatialReference is local (root node is LOCAL_CS)." - return bool(capi.islocal(self.ptr)) - - @property - def projected(self): - """ - Return True if this SpatialReference is a projected coordinate system - (root node is PROJCS). - """ - return bool(capi.isprojected(self.ptr)) - - # #### Import Routines ##### - def import_epsg(self, epsg): - "Import the Spatial Reference from the EPSG code (an integer)." - capi.from_epsg(self.ptr, epsg) - - def import_proj(self, proj): - """Import the Spatial Reference from a PROJ string.""" - capi.from_proj(self.ptr, proj) - - def import_user_input(self, user_input): - "Import the Spatial Reference from the given user input string." - capi.from_user_input(self.ptr, force_bytes(user_input)) - - def import_wkt(self, wkt): - "Import the Spatial Reference from OGC WKT (string)" - capi.from_wkt(self.ptr, byref(c_char_p(force_bytes(wkt)))) - - def import_xml(self, xml): - "Import the Spatial Reference from an XML string." - capi.from_xml(self.ptr, xml) - - # #### Export Properties #### - @property - def wkt(self): - "Return the WKT representation of this Spatial Reference." - return capi.to_wkt(self.ptr, byref(c_char_p())) - - @property - def pretty_wkt(self, simplify=0): - "Return the 'pretty' representation of the WKT." - return capi.to_pretty_wkt(self.ptr, byref(c_char_p()), simplify) - - @property - def proj(self): - """Return the PROJ representation for this Spatial Reference.""" - return capi.to_proj(self.ptr, byref(c_char_p())) - - @property - def proj4(self): - "Alias for proj()." - return self.proj - - @property - def xml(self, dialect=""): - "Return the XML representation of this Spatial Reference." - return capi.to_xml(self.ptr, byref(c_char_p()), force_bytes(dialect)) - - -class CoordTransform(GDALBase): - "The coordinate system transformation object." - - destructor = capi.destroy_ct - - def __init__(self, source, target): - "Initialize on a source and target SpatialReference objects." - if not isinstance(source, SpatialReference) or not isinstance( - target, SpatialReference - ): - raise TypeError("source and target must be of type SpatialReference") - self.ptr = capi.new_ct(source._ptr, target._ptr) - self._srs1_name = source.name - self._srs2_name = target.name - - def __str__(self): - return 'Transform from "%s" to "%s"' % (self._srs1_name, self._srs2_name) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geoip2.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geoip2.py deleted file mode 100644 index 5b510de..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geoip2.py +++ /dev/null @@ -1,250 +0,0 @@ -""" -This module houses the GeoIP2 object, a wrapper for the MaxMind GeoIP2(R) -Python API (https://geoip2.readthedocs.io/). This is an alternative to the -Python GeoIP2 interface provided by MaxMind. - -GeoIP(R) is a registered trademark of MaxMind, Inc. - -For IP-based geolocation, this module requires the GeoLite2 Country and City -datasets, in binary format (CSV will not work!). The datasets may be -downloaded from MaxMind at https://dev.maxmind.com/geoip/geoip2/geolite2/. -Grab GeoLite2-Country.mmdb.gz and GeoLite2-City.mmdb.gz, and unzip them in the -directory corresponding to settings.GEOIP_PATH. -""" - -import ipaddress -import socket -import warnings - -from django.conf import settings -from django.core.exceptions import ValidationError -from django.core.validators import validate_ipv46_address -from django.utils._os import to_path -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.functional import cached_property - -__all__ = ["HAS_GEOIP2"] - -try: - import geoip2.database -except ImportError: # pragma: no cover - HAS_GEOIP2 = False -else: - HAS_GEOIP2 = True - __all__ += ["GeoIP2", "GeoIP2Exception"] - - -# These are the values stored in the `database_type` field of the metadata. -# See https://maxmind.github.io/MaxMind-DB/#database_type for details. -SUPPORTED_DATABASE_TYPES = { - "DBIP-City-Lite", - "DBIP-Country-Lite", - "GeoIP2-City", - "GeoIP2-Country", - "GeoLite2-City", - "GeoLite2-Country", -} - - -class GeoIP2Exception(Exception): - pass - - -class GeoIP2: - # The flags for GeoIP memory caching. - # Try MODE_MMAP_EXT, MODE_MMAP, MODE_FILE in that order. - MODE_AUTO = 0 - # Use the C extension with memory map. - MODE_MMAP_EXT = 1 - # Read from memory map. Pure Python. - MODE_MMAP = 2 - # Read database as standard file. Pure Python. - MODE_FILE = 4 - # Load database into memory. Pure Python. - MODE_MEMORY = 8 - cache_options = frozenset( - (MODE_AUTO, MODE_MMAP_EXT, MODE_MMAP, MODE_FILE, MODE_MEMORY) - ) - - _path = None - _reader = None - - def __init__(self, path=None, cache=0, country=None, city=None): - """ - Initialize the GeoIP object. No parameters are required to use default - settings. Keyword arguments may be passed in to customize the locations - of the GeoIP datasets. - - * path: Base directory to where GeoIP data is located or the full path - to where the city or country data files (*.mmdb) are located. - Assumes that both the city and country data sets are located in - this directory; overrides the GEOIP_PATH setting. - - * cache: The cache settings when opening up the GeoIP datasets. May be - an integer in (0, 1, 2, 4, 8) corresponding to the MODE_AUTO, - MODE_MMAP_EXT, MODE_MMAP, MODE_FILE, and MODE_MEMORY, - `GeoIPOptions` C API settings, respectively. Defaults to 0, - meaning MODE_AUTO. - - * country: The name of the GeoIP country data file. Defaults to - 'GeoLite2-Country.mmdb'; overrides the GEOIP_COUNTRY setting. - - * city: The name of the GeoIP city data file. Defaults to - 'GeoLite2-City.mmdb'; overrides the GEOIP_CITY setting. - """ - if cache not in self.cache_options: - raise GeoIP2Exception("Invalid GeoIP caching option: %s" % cache) - - path = path or getattr(settings, "GEOIP_PATH", None) - city = city or getattr(settings, "GEOIP_CITY", "GeoLite2-City.mmdb") - country = country or getattr(settings, "GEOIP_COUNTRY", "GeoLite2-Country.mmdb") - - if not path: - raise GeoIP2Exception( - "GeoIP path must be provided via parameter or the GEOIP_PATH setting." - ) - - path = to_path(path) - - # Try the path first in case it is the full path to a database. - for path in (path, path / city, path / country): - if path.is_file(): - self._path = path - self._reader = geoip2.database.Reader(path, mode=cache) - break - else: - raise GeoIP2Exception( - "Path must be a valid database or directory containing databases." - ) - - database_type = self._metadata.database_type - if database_type not in SUPPORTED_DATABASE_TYPES: - raise GeoIP2Exception(f"Unable to handle database edition: {database_type}") - - def __del__(self): - # Cleanup any GeoIP file handles lying around. - if self._reader: - self._reader.close() - - def __repr__(self): - m = self._metadata - version = f"v{m.binary_format_major_version}.{m.binary_format_minor_version}" - return f"<{self.__class__.__name__} [{version}] _path='{self._path}'>" - - @cached_property - def _metadata(self): - return self._reader.metadata() - - @cached_property - def is_city(self): - return "City" in self._metadata.database_type - - @cached_property - def is_country(self): - return "Country" in self._metadata.database_type - - def _query(self, query, *, require_city=False): - if not isinstance(query, (str, ipaddress.IPv4Address, ipaddress.IPv6Address)): - raise TypeError( - "GeoIP query must be a string or instance of IPv4Address or " - "IPv6Address, not type %s" % type(query).__name__, - ) - - if require_city and not self.is_city: - raise GeoIP2Exception(f"Invalid GeoIP city data file: {self._path}") - - if isinstance(query, str): - try: - validate_ipv46_address(query) - except ValidationError: - # GeoIP2 only takes IP addresses, so try to resolve a hostname. - query = socket.gethostbyname(query) - - function = self._reader.city if self.is_city else self._reader.country - return function(query) - - def city(self, query): - """ - Return a dictionary of city information for the given IP address or - Fully Qualified Domain Name (FQDN). Some information in the dictionary - may be undefined (None). - """ - response = self._query(query, require_city=True) - region = response.subdivisions[0] if response.subdivisions else None - return { - "accuracy_radius": response.location.accuracy_radius, - "city": response.city.name, - "continent_code": response.continent.code, - "continent_name": response.continent.name, - "country_code": response.country.iso_code, - "country_name": response.country.name, - "is_in_european_union": response.country.is_in_european_union, - "latitude": response.location.latitude, - "longitude": response.location.longitude, - "metro_code": response.location.metro_code, - "postal_code": response.postal.code, - "region_code": region.iso_code if region else None, - "region_name": region.name if region else None, - "time_zone": response.location.time_zone, - # Kept for backward compatibility. - "dma_code": response.location.metro_code, - "region": region.iso_code if region else None, - } - - def country_code(self, query): - "Return the country code for the given IP Address or FQDN." - return self.country(query)["country_code"] - - def country_name(self, query): - "Return the country name for the given IP Address or FQDN." - return self.country(query)["country_name"] - - def country(self, query): - """ - Return a dictionary with the country code and name when given an - IP address or a Fully Qualified Domain Name (FQDN). For example, both - '24.124.1.80' and 'djangoproject.com' are valid parameters. - """ - response = self._query(query, require_city=False) - return { - "continent_code": response.continent.code, - "continent_name": response.continent.name, - "country_code": response.country.iso_code, - "country_name": response.country.name, - "is_in_european_union": response.country.is_in_european_union, - } - - def coords(self, query, ordering=("longitude", "latitude")): - warnings.warn( - "GeoIP2.coords() is deprecated. Use GeoIP2.lon_lat() instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - data = self.city(query) - return tuple(data[o] for o in ordering) - - def lon_lat(self, query): - "Return a tuple of the (longitude, latitude) for the given query." - data = self.city(query) - return data["longitude"], data["latitude"] - - def lat_lon(self, query): - "Return a tuple of the (latitude, longitude) for the given query." - data = self.city(query) - return data["latitude"], data["longitude"] - - def geos(self, query): - "Return a GEOS Point object for the given query." - # Allows importing and using GeoIP2() when GEOS is not installed. - from django.contrib.gis.geos import Point - - return Point(self.lon_lat(query), srid=4326) - - @classmethod - def open(cls, full_path, cache): - warnings.warn( - "GeoIP2.open() is deprecated. Use GeoIP2() instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - return GeoIP2(full_path, cache) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geometry.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geometry.py deleted file mode 100644 index 7aac864..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geometry.py +++ /dev/null @@ -1,19 +0,0 @@ -import re - -from django.utils.regex_helper import _lazy_re_compile - -# Regular expression for recognizing HEXEWKB and WKT. A prophylactic measure -# to prevent potentially malicious input from reaching the underlying C -# library. Not a substitute for good web security programming practices. -hex_regex = _lazy_re_compile(r"^[0-9A-F]+$", re.I) -wkt_regex = _lazy_re_compile( - r"^(SRID=(?P\-?[0-9]+);)?" - r"(?P" - r"(?PPOINT|LINESTRING|LINEARRING|POLYGON|MULTIPOINT|" - r"MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION|CIRCULARSTRING|COMPOUNDCURVE|" - r"CURVEPOLYGON|MULTICURVE|MULTISURFACE|CURVE|SURFACE|POLYHEDRALSURFACE|TIN|" - r"TRIANGLE)" - r"[ACEGIMLONPSRUTYZ0-9,.+() -]+)$", - re.I, -) -json_regex = _lazy_re_compile(r"^(\s+)?\{.*}(\s+)?$", re.DOTALL) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/LICENSE b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/LICENSE deleted file mode 100644 index 0479b07..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2007-2009 Justin Bronn -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of GEOSGeometry nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/__init__.py deleted file mode 100644 index f50cd19..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -The GeoDjango GEOS module. Please consult the GeoDjango documentation -for more details: https://docs.djangoproject.com/en/dev/ref/contrib/gis/geos/ -""" - -from .collections import ( # NOQA - GeometryCollection, - MultiLineString, - MultiPoint, - MultiPolygon, -) -from .error import GEOSException # NOQA -from .factory import fromfile, fromstr # NOQA -from .geometry import GEOSGeometry, hex_regex, wkt_regex # NOQA -from .io import WKBReader, WKBWriter, WKTReader, WKTWriter # NOQA -from .libgeos import geos_version # NOQA -from .linestring import LinearRing, LineString # NOQA -from .point import Point # NOQA -from .polygon import Polygon # NOQA diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/base.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/base.py deleted file mode 100644 index b7466ba..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/base.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.contrib.gis.geos.error import GEOSException -from django.contrib.gis.ptr import CPointerBase - - -class GEOSBase(CPointerBase): - null_ptr_exception_class = GEOSException diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/collections.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/collections.py deleted file mode 100644 index 41a647f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/collections.py +++ /dev/null @@ -1,121 +0,0 @@ -""" -This module houses the Geometry Collection objects: -GeometryCollection, MultiPoint, MultiLineString, and MultiPolygon -""" - -from django.contrib.gis.geos import prototypes as capi -from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin -from django.contrib.gis.geos.libgeos import GEOM_PTR -from django.contrib.gis.geos.linestring import LinearRing, LineString -from django.contrib.gis.geos.point import Point -from django.contrib.gis.geos.polygon import Polygon - - -class GeometryCollection(GEOSGeometry): - _typeid = 7 - - def __init__(self, *args, **kwargs): - "Initialize a Geometry Collection from a sequence of Geometry objects." - # Checking the arguments - if len(args) == 1: - # If only one geometry provided or a list of geometries is provided - # in the first argument. - if isinstance(args[0], (tuple, list)): - init_geoms = args[0] - else: - init_geoms = args - else: - init_geoms = args - - # Ensuring that only the permitted geometries are allowed in this collection - # this is moved to list mixin super class - self._check_allowed(init_geoms) - - # Creating the geometry pointer array. - collection = self._create_collection(len(init_geoms), init_geoms) - super().__init__(collection, **kwargs) - - def __iter__(self): - "Iterate over each Geometry in the Collection." - for i in range(len(self)): - yield self[i] - - def __len__(self): - "Return the number of geometries in this Collection." - return self.num_geom - - # ### Methods for compatibility with ListMixin ### - def _create_collection(self, length, items): - # Creating the geometry pointer array. - geoms = (GEOM_PTR * length)( - *[ - # this is a little sloppy, but makes life easier - # allow GEOSGeometry types (python wrappers) or pointer types - capi.geom_clone(getattr(g, "ptr", g)) - for g in items - ] - ) - return capi.create_collection(self._typeid, geoms, length) - - def _get_single_internal(self, index): - return capi.get_geomn(self.ptr, index) - - def _get_single_external(self, index): - "Return the Geometry from this Collection at the given index (0-based)." - # Checking the index and returning the corresponding GEOS geometry. - return GEOSGeometry( - capi.geom_clone(self._get_single_internal(index)), srid=self.srid - ) - - def _set_list(self, length, items): - "Create a new collection, and destroy the contents of the previous pointer." - prev_ptr = self.ptr - srid = self.srid - self.ptr = self._create_collection(length, items) - if srid: - self.srid = srid - capi.destroy_geom(prev_ptr) - - _set_single = GEOSGeometry._set_single_rebuild - _assign_extended_slice = GEOSGeometry._assign_extended_slice_rebuild - - @property - def kml(self): - "Return the KML for this Geometry Collection." - return "%s" % "".join(g.kml for g in self) - - @property - def tuple(self): - "Return a tuple of all the coordinates in this Geometry Collection" - return tuple(g.tuple for g in self) - - coords = tuple - - -# MultiPoint, MultiLineString, and MultiPolygon class definitions. -class MultiPoint(GeometryCollection): - _allowed = Point - _typeid = 4 - - -class MultiLineString(LinearGeometryMixin, GeometryCollection): - _allowed = (LineString, LinearRing) - _typeid = 5 - - -class MultiPolygon(GeometryCollection): - _allowed = Polygon - _typeid = 6 - - -# Setting the allowed types here since GeometryCollection is defined before -# its subclasses. -GeometryCollection._allowed = ( - Point, - LineString, - LinearRing, - Polygon, - MultiPoint, - MultiLineString, - MultiPolygon, -) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/coordseq.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/coordseq.py deleted file mode 100644 index 484b53a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/coordseq.py +++ /dev/null @@ -1,211 +0,0 @@ -""" -This module houses the GEOSCoordSeq object, which is used internally -by GEOSGeometry to house the actual coordinates of the Point, -LineString, and LinearRing geometries. -""" - -from ctypes import byref, c_byte, c_double, c_uint - -from django.contrib.gis.geos import prototypes as capi -from django.contrib.gis.geos.base import GEOSBase -from django.contrib.gis.geos.error import GEOSException -from django.contrib.gis.geos.libgeos import CS_PTR -from django.contrib.gis.shortcuts import numpy - - -class GEOSCoordSeq(GEOSBase): - "The internal representation of a list of coordinates inside a Geometry." - - ptr_type = CS_PTR - - def __init__(self, ptr, z=False): - "Initialize from a GEOS pointer." - if not isinstance(ptr, CS_PTR): - raise TypeError("Coordinate sequence should initialize with a CS_PTR.") - self._ptr = ptr - self._z = z - - def __iter__(self): - "Iterate over each point in the coordinate sequence." - for i in range(self.size): - yield self[i] - - def __len__(self): - "Return the number of points in the coordinate sequence." - return self.size - - def __str__(self): - "Return the string representation of the coordinate sequence." - return str(self.tuple) - - def __getitem__(self, index): - "Return the coordinate sequence value at the given index." - self._checkindex(index) - return self._point_getter(index) - - def __setitem__(self, index, value): - "Set the coordinate sequence value at the given index." - # Checking the input value - if isinstance(value, (list, tuple)): - pass - elif numpy and isinstance(value, numpy.ndarray): - pass - else: - raise TypeError( - "Must set coordinate with a sequence (list, tuple, or numpy array)." - ) - # Checking the dims of the input - if self.dims == 3 and self._z: - n_args = 3 - point_setter = self._set_point_3d - else: - n_args = 2 - point_setter = self._set_point_2d - if len(value) != n_args: - raise TypeError("Dimension of value does not match.") - self._checkindex(index) - point_setter(index, value) - - # #### Internal Routines #### - def _checkindex(self, index): - "Check the given index." - if not (0 <= index < self.size): - raise IndexError("invalid GEOS Geometry index: %s" % index) - - def _checkdim(self, dim): - "Check the given dimension." - if dim < 0 or dim > 2: - raise GEOSException('invalid ordinate dimension "%d"' % dim) - - def _get_x(self, index): - return capi.cs_getx(self.ptr, index, byref(c_double())) - - def _get_y(self, index): - return capi.cs_gety(self.ptr, index, byref(c_double())) - - def _get_z(self, index): - return capi.cs_getz(self.ptr, index, byref(c_double())) - - def _set_x(self, index, value): - capi.cs_setx(self.ptr, index, value) - - def _set_y(self, index, value): - capi.cs_sety(self.ptr, index, value) - - def _set_z(self, index, value): - capi.cs_setz(self.ptr, index, value) - - @property - def _point_getter(self): - return self._get_point_3d if self.dims == 3 and self._z else self._get_point_2d - - def _get_point_2d(self, index): - return (self._get_x(index), self._get_y(index)) - - def _get_point_3d(self, index): - return (self._get_x(index), self._get_y(index), self._get_z(index)) - - def _set_point_2d(self, index, value): - x, y = value - self._set_x(index, x) - self._set_y(index, y) - - def _set_point_3d(self, index, value): - x, y, z = value - self._set_x(index, x) - self._set_y(index, y) - self._set_z(index, z) - - # #### Ordinate getting and setting routines #### - def getOrdinate(self, dimension, index): - "Return the value for the given dimension and index." - self._checkindex(index) - self._checkdim(dimension) - return capi.cs_getordinate(self.ptr, index, dimension, byref(c_double())) - - def setOrdinate(self, dimension, index, value): - "Set the value for the given dimension and index." - self._checkindex(index) - self._checkdim(dimension) - capi.cs_setordinate(self.ptr, index, dimension, value) - - def getX(self, index): - "Get the X value at the index." - return self.getOrdinate(0, index) - - def setX(self, index, value): - "Set X with the value at the given index." - self.setOrdinate(0, index, value) - - def getY(self, index): - "Get the Y value at the given index." - return self.getOrdinate(1, index) - - def setY(self, index, value): - "Set Y with the value at the given index." - self.setOrdinate(1, index, value) - - def getZ(self, index): - "Get Z with the value at the given index." - return self.getOrdinate(2, index) - - def setZ(self, index, value): - "Set Z with the value at the given index." - self.setOrdinate(2, index, value) - - # ### Dimensions ### - @property - def size(self): - "Return the size of this coordinate sequence." - return capi.cs_getsize(self.ptr, byref(c_uint())) - - @property - def dims(self): - "Return the dimensions of this coordinate sequence." - return capi.cs_getdims(self.ptr, byref(c_uint())) - - @property - def hasz(self): - """ - Return whether this coordinate sequence is 3D. This property value is - inherited from the parent Geometry. - """ - return self._z - - # ### Other Methods ### - def clone(self): - "Clone this coordinate sequence." - return GEOSCoordSeq(capi.cs_clone(self.ptr), self.hasz) - - @property - def kml(self): - "Return the KML representation for the coordinates." - # Getting the substitution string depending on whether the coordinates have - # a Z dimension. - if self.hasz: - substr = "%s,%s,%s " - else: - substr = "%s,%s,0 " - return ( - "%s" - % "".join(substr % self[i] for i in range(len(self))).strip() - ) - - @property - def tuple(self): - "Return a tuple version of this coordinate sequence." - n = self.size - get_point = self._point_getter - if n == 1: - return get_point(0) - return tuple(get_point(i) for i in range(n)) - - @property - def is_counterclockwise(self): - """Return whether this coordinate sequence is counterclockwise.""" - ret = c_byte() - if not capi.cs_is_ccw(self.ptr, byref(ret)): - raise GEOSException( - 'Error encountered in GEOS C function "%s".' % capi.cs_is_ccw.func_name - ) - return ret.value == 1 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/error.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/error.py deleted file mode 100644 index 970f42e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/error.py +++ /dev/null @@ -1,4 +0,0 @@ -class GEOSException(Exception): - "The base GEOS exception, indicates a GEOS-related error." - - pass diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/factory.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/factory.py deleted file mode 100644 index 2c1c247..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/factory.py +++ /dev/null @@ -1,33 +0,0 @@ -from django.contrib.gis.geos.geometry import GEOSGeometry, hex_regex, wkt_regex - - -def fromfile(file_h): - """ - Given a string file name, returns a GEOSGeometry. The file may contain WKB, - WKT, or HEX. - """ - # If given a file name, get a real handle. - if isinstance(file_h, str): - with open(file_h, "rb") as file_h: - buf = file_h.read() - else: - buf = file_h.read() - - # If we get WKB need to wrap in memoryview(), so run through regexes. - if isinstance(buf, bytes): - try: - decoded = buf.decode() - except UnicodeDecodeError: - pass - else: - if wkt_regex.match(decoded) or hex_regex.match(decoded): - return GEOSGeometry(decoded) - else: - return GEOSGeometry(buf) - - return GEOSGeometry(memoryview(buf)) - - -def fromstr(string, **kwargs): - "Given a string value, return a GEOSGeometry object." - return GEOSGeometry(string, **kwargs) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/geometry.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/geometry.py deleted file mode 100644 index 42aee77..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/geometry.py +++ /dev/null @@ -1,780 +0,0 @@ -""" -This module contains the 'base' GEOSGeometry object -- all GEOS Geometries -inherit from this object. -""" - -import re -from ctypes import addressof, byref, c_double - -from django.contrib.gis import gdal -from django.contrib.gis.geometry import hex_regex, json_regex, wkt_regex -from django.contrib.gis.geos import prototypes as capi -from django.contrib.gis.geos.base import GEOSBase -from django.contrib.gis.geos.coordseq import GEOSCoordSeq -from django.contrib.gis.geos.error import GEOSException -from django.contrib.gis.geos.libgeos import GEOM_PTR, geos_version_tuple -from django.contrib.gis.geos.mutable_list import ListMixin -from django.contrib.gis.geos.prepared import PreparedGeometry -from django.contrib.gis.geos.prototypes.io import ewkb_w, wkb_r, wkb_w, wkt_r, wkt_w -from django.utils.deconstruct import deconstructible -from django.utils.encoding import force_bytes, force_str - - -class GEOSGeometryBase(GEOSBase): - _GEOS_CLASSES = None - - ptr_type = GEOM_PTR - destructor = capi.destroy_geom - has_cs = False # Only Point, LineString, LinearRing have coordinate sequences - - def __init__(self, ptr, cls): - self._ptr = ptr - - # Setting the class type (e.g., Point, Polygon, etc.) - if type(self) in (GEOSGeometryBase, GEOSGeometry): - if cls is None: - if GEOSGeometryBase._GEOS_CLASSES is None: - # Inner imports avoid import conflicts with GEOSGeometry. - from .collections import ( - GeometryCollection, - MultiLineString, - MultiPoint, - MultiPolygon, - ) - from .linestring import LinearRing, LineString - from .point import Point - from .polygon import Polygon - - GEOSGeometryBase._GEOS_CLASSES = { - 0: Point, - 1: LineString, - 2: LinearRing, - 3: Polygon, - 4: MultiPoint, - 5: MultiLineString, - 6: MultiPolygon, - 7: GeometryCollection, - } - cls = GEOSGeometryBase._GEOS_CLASSES[self.geom_typeid] - self.__class__ = cls - self._post_init() - - def _post_init(self): - "Perform post-initialization setup." - # Setting the coordinate sequence for the geometry (will be None on - # geometries that do not have coordinate sequences) - self._cs = ( - GEOSCoordSeq(capi.get_cs(self.ptr), self.hasz) if self.has_cs else None - ) - - def __copy__(self): - """ - Return a clone because the copy of a GEOSGeometry may contain an - invalid pointer location if the original is garbage collected. - """ - return self.clone() - - def __deepcopy__(self, memodict): - """ - The `deepcopy` routine is used by the `Node` class of django.utils.tree; - thus, the protocol routine needs to be implemented to return correct - copies (clones) of these GEOS objects, which use C pointers. - """ - return self.clone() - - def __str__(self): - "EWKT is used for the string representation." - return self.ewkt - - def __repr__(self): - "Short-hand representation because WKT may be very large." - return "<%s object at %s>" % (self.geom_type, hex(addressof(self.ptr))) - - # Pickling support - def _to_pickle_wkb(self): - return bytes(self.wkb) - - def _from_pickle_wkb(self, wkb): - return wkb_r().read(memoryview(wkb)) - - def __getstate__(self): - # The pickled state is simply a tuple of the WKB (in string form) - # and the SRID. - return self._to_pickle_wkb(), self.srid - - def __setstate__(self, state): - # Instantiating from the tuple state that was pickled. - wkb, srid = state - ptr = self._from_pickle_wkb(wkb) - if not ptr: - raise GEOSException("Invalid Geometry loaded from pickled state.") - self.ptr = ptr - self._post_init() - self.srid = srid - - @classmethod - def _from_wkb(cls, wkb): - return wkb_r().read(wkb) - - @staticmethod - def from_ewkt(ewkt): - ewkt = force_bytes(ewkt) - srid = None - parts = ewkt.split(b";", 1) - if len(parts) == 2: - srid_part, wkt = parts - match = re.match(rb"SRID=(?P\-?\d+)", srid_part) - if not match: - raise ValueError("EWKT has invalid SRID part.") - srid = int(match["srid"]) - else: - wkt = ewkt - if not wkt: - raise ValueError("Expected WKT but got an empty string.") - return GEOSGeometry(GEOSGeometry._from_wkt(wkt), srid=srid) - - @staticmethod - def _from_wkt(wkt): - return wkt_r().read(wkt) - - @classmethod - def from_gml(cls, gml_string): - return gdal.OGRGeometry.from_gml(gml_string).geos - - # Comparison operators - def __eq__(self, other): - """ - Equivalence testing, a Geometry may be compared with another Geometry - or an EWKT representation. - """ - if isinstance(other, str): - try: - other = GEOSGeometry.from_ewkt(other) - except (ValueError, GEOSException): - return False - return ( - isinstance(other, GEOSGeometry) - and self.srid == other.srid - and self.equals_exact(other) - ) - - def __hash__(self): - return hash((self.srid, self.wkt)) - - # ### Geometry set-like operations ### - # Thanks to Sean Gillies for inspiration: - # http://lists.gispython.org/pipermail/community/2007-July/001034.html - # g = g1 | g2 - def __or__(self, other): - "Return the union of this Geometry and the other." - return self.union(other) - - # g = g1 & g2 - def __and__(self, other): - "Return the intersection of this Geometry and the other." - return self.intersection(other) - - # g = g1 - g2 - def __sub__(self, other): - "Return the difference this Geometry and the other." - return self.difference(other) - - # g = g1 ^ g2 - def __xor__(self, other): - "Return the symmetric difference of this Geometry and the other." - return self.sym_difference(other) - - # #### Coordinate Sequence Routines #### - @property - def coord_seq(self): - "Return a clone of the coordinate sequence for this Geometry." - if self.has_cs: - return self._cs.clone() - - # #### Geometry Info #### - @property - def geom_type(self): - "Return a string representing the Geometry type, e.g. 'Polygon'" - return capi.geos_type(self.ptr).decode() - - @property - def geom_typeid(self): - "Return an integer representing the Geometry type." - return capi.geos_typeid(self.ptr) - - @property - def num_geom(self): - "Return the number of geometries in the Geometry." - return capi.get_num_geoms(self.ptr) - - @property - def num_coords(self): - "Return the number of coordinates in the Geometry." - return capi.get_num_coords(self.ptr) - - @property - def num_points(self): - "Return the number points, or coordinates, in the Geometry." - return self.num_coords - - @property - def dims(self): - "Return the dimension of this Geometry (0=point, 1=line, 2=surface)." - return capi.get_dims(self.ptr) - - def normalize(self, clone=False): - """ - Convert this Geometry to normal form (or canonical form). - If the `clone` keyword is set, then the geometry is not modified and a - normalized clone of the geometry is returned instead. - """ - if clone: - clone = self.clone() - capi.geos_normalize(clone.ptr) - return clone - capi.geos_normalize(self.ptr) - - def make_valid(self): - """ - Attempt to create a valid representation of a given invalid geometry - without losing any of the input vertices. - """ - return GEOSGeometry(capi.geos_makevalid(self.ptr), srid=self.srid) - - # #### Unary predicates #### - @property - def empty(self): - """ - Return a boolean indicating whether the set of points in this Geometry - are empty. - """ - return capi.geos_isempty(self.ptr) - - @property - def hasz(self): - "Return whether the geometry has a 3D dimension." - return capi.geos_hasz(self.ptr) - - @property - def ring(self): - "Return whether or not the geometry is a ring." - return capi.geos_isring(self.ptr) - - @property - def simple(self): - "Return false if the Geometry isn't simple." - return capi.geos_issimple(self.ptr) - - @property - def valid(self): - "Test the validity of this Geometry." - return capi.geos_isvalid(self.ptr) - - @property - def valid_reason(self): - """ - Return a string containing the reason for any invalidity. - """ - return capi.geos_isvalidreason(self.ptr).decode() - - # #### Binary predicates. #### - def contains(self, other): - "Return true if other.within(this) returns true." - return capi.geos_contains(self.ptr, other.ptr) - - def covers(self, other): - """ - Return True if the DE-9IM Intersection Matrix for the two geometries is - T*****FF*, *T****FF*, ***T**FF*, or ****T*FF*. If either geometry is - empty, return False. - """ - return capi.geos_covers(self.ptr, other.ptr) - - def crosses(self, other): - """ - Return true if the DE-9IM intersection matrix for the two Geometries - is T*T****** (for a point and a curve,a point and an area or a line and - an area) 0******** (for two curves). - """ - return capi.geos_crosses(self.ptr, other.ptr) - - def disjoint(self, other): - """ - Return true if the DE-9IM intersection matrix for the two Geometries - is FF*FF****. - """ - return capi.geos_disjoint(self.ptr, other.ptr) - - def equals(self, other): - """ - Return true if the DE-9IM intersection matrix for the two Geometries - is T*F**FFF*. - """ - return capi.geos_equals(self.ptr, other.ptr) - - def equals_exact(self, other, tolerance=0): - """ - Return true if the two Geometries are exactly equal, up to a - specified tolerance. - """ - return capi.geos_equalsexact(self.ptr, other.ptr, float(tolerance)) - - def equals_identical(self, other): - """ - Return true if the two Geometries are point-wise equivalent. - """ - if geos_version_tuple() < (3, 12): - raise GEOSException( - "GEOSGeometry.equals_identical() requires GEOS >= 3.12.0." - ) - return capi.geos_equalsidentical(self.ptr, other.ptr) - - def intersects(self, other): - "Return true if disjoint return false." - return capi.geos_intersects(self.ptr, other.ptr) - - def overlaps(self, other): - """ - Return true if the DE-9IM intersection matrix for the two Geometries - is T*T***T** (for two points or two surfaces) 1*T***T** (for two curves). - """ - return capi.geos_overlaps(self.ptr, other.ptr) - - def relate_pattern(self, other, pattern): - """ - Return true if the elements in the DE-9IM intersection matrix for the - two Geometries match the elements in pattern. - """ - if not isinstance(pattern, str) or len(pattern) > 9: - raise GEOSException("invalid intersection matrix pattern") - return capi.geos_relatepattern(self.ptr, other.ptr, force_bytes(pattern)) - - def touches(self, other): - """ - Return true if the DE-9IM intersection matrix for the two Geometries - is FT*******, F**T***** or F***T****. - """ - return capi.geos_touches(self.ptr, other.ptr) - - def within(self, other): - """ - Return true if the DE-9IM intersection matrix for the two Geometries - is T*F**F***. - """ - return capi.geos_within(self.ptr, other.ptr) - - # #### SRID Routines #### - @property - def srid(self): - "Get the SRID for the geometry. Return None if no SRID is set." - s = capi.geos_get_srid(self.ptr) - if s == 0: - return None - else: - return s - - @srid.setter - def srid(self, srid): - "Set the SRID for the geometry." - capi.geos_set_srid(self.ptr, 0 if srid is None else srid) - - # #### Output Routines #### - @property - def ewkt(self): - """ - Return the EWKT (SRID + WKT) of the Geometry. - """ - srid = self.srid - return "SRID=%s;%s" % (srid, self.wkt) if srid else self.wkt - - @property - def wkt(self): - "Return the WKT (Well-Known Text) representation of this Geometry." - return wkt_w(dim=3 if self.hasz else 2, trim=True).write(self).decode() - - @property - def hex(self): - """ - Return the WKB of this Geometry in hexadecimal form. Please note - that the SRID is not included in this representation because it is not - a part of the OGC specification (use the `hexewkb` property instead). - """ - # A possible faster, all-python, implementation: - # str(self.wkb).encode('hex') - return wkb_w(dim=3 if self.hasz else 2).write_hex(self) - - @property - def hexewkb(self): - """ - Return the EWKB of this Geometry in hexadecimal form. This is an - extension of the WKB specification that includes SRID value that are - a part of this geometry. - """ - return ewkb_w(dim=3 if self.hasz else 2).write_hex(self) - - @property - def json(self): - """ - Return GeoJSON representation of this Geometry. - """ - return self.ogr.json - - geojson = json - - @property - def wkb(self): - """ - Return the WKB (Well-Known Binary) representation of this Geometry - as a Python memoryview. SRID and Z values are not included, use the - `ewkb` property instead. - """ - return wkb_w(3 if self.hasz else 2).write(self) - - @property - def ewkb(self): - """ - Return the EWKB representation of this Geometry as a Python memoryview. - This is an extension of the WKB specification that includes any SRID - value that are a part of this geometry. - """ - return ewkb_w(3 if self.hasz else 2).write(self) - - @property - def kml(self): - "Return the KML representation of this Geometry." - gtype = self.geom_type - return "<%s>%s" % (gtype, self.coord_seq.kml, gtype) - - @property - def prepared(self): - """ - Return a PreparedGeometry corresponding to this geometry -- it is - optimized for the contains, intersects, and covers operations. - """ - return PreparedGeometry(self) - - # #### GDAL-specific output routines #### - def _ogr_ptr(self): - return gdal.OGRGeometry._from_wkb(self.wkb) - - @property - def ogr(self): - "Return the OGR Geometry for this Geometry." - return gdal.OGRGeometry(self._ogr_ptr(), self.srs) - - @property - def srs(self): - "Return the OSR SpatialReference for SRID of this Geometry." - if self.srid: - try: - return gdal.SpatialReference(self.srid) - except (gdal.GDALException, gdal.SRSException): - pass - return None - - @property - def crs(self): - "Alias for `srs` property." - return self.srs - - def transform(self, ct, clone=False): - """ - Requires GDAL. Transform the geometry according to the given - transformation object, which may be an integer SRID, and WKT or - PROJ string. By default, transform the geometry in-place and return - nothing. However if the `clone` keyword is set, don't modify the - geometry and return a transformed clone instead. - """ - srid = self.srid - - if ct == srid: - # short-circuit where source & dest SRIDs match - if clone: - return self.clone() - else: - return - - if isinstance(ct, gdal.CoordTransform): - # We don't care about SRID because CoordTransform presupposes - # source SRS. - srid = None - elif srid is None or srid < 0: - raise GEOSException("Calling transform() with no SRID set is not supported") - - # Creating an OGR Geometry, which is then transformed. - g = gdal.OGRGeometry(self._ogr_ptr(), srid) - g.transform(ct) - # Getting a new GEOS pointer - ptr = g._geos_ptr() - if clone: - # User wants a cloned transformed geometry returned. - return GEOSGeometry(ptr, srid=g.srid) - if ptr: - # Reassigning pointer, and performing post-initialization setup - # again due to the reassignment. - capi.destroy_geom(self.ptr) - self.ptr = ptr - self._post_init() - self.srid = g.srid - else: - raise GEOSException("Transformed WKB was invalid.") - - # #### Topology Routines #### - def _topology(self, gptr): - "Return Geometry from the given pointer." - return GEOSGeometry(gptr, srid=self.srid) - - @property - def boundary(self): - "Return the boundary as a newly allocated Geometry object." - return self._topology(capi.geos_boundary(self.ptr)) - - def buffer(self, width, quadsegs=8): - """ - Return a geometry that represents all points whose distance from this - Geometry is less than or equal to distance. Calculations are in the - Spatial Reference System of this Geometry. The optional third parameter sets - the number of segment used to approximate a quarter circle (defaults to 8). - (Text from PostGIS documentation at ch. 6.1.3) - """ - return self._topology(capi.geos_buffer(self.ptr, width, quadsegs)) - - def buffer_with_style( - self, width, quadsegs=8, end_cap_style=1, join_style=1, mitre_limit=5.0 - ): - """ - Same as buffer() but allows customizing the style of the memoryview. - - End cap style can be round (1), flat (2), or square (3). - Join style can be round (1), mitre (2), or bevel (3). - Mitre ratio limit only affects mitered join style. - """ - return self._topology( - capi.geos_bufferwithstyle( - self.ptr, width, quadsegs, end_cap_style, join_style, mitre_limit - ), - ) - - @property - def centroid(self): - """ - The centroid is equal to the centroid of the set of component Geometries - of highest dimension (since the lower-dimension geometries contribute zero - "weight" to the centroid). - """ - return self._topology(capi.geos_centroid(self.ptr)) - - @property - def convex_hull(self): - """ - Return the smallest convex Polygon that contains all the points - in the Geometry. - """ - return self._topology(capi.geos_convexhull(self.ptr)) - - def difference(self, other): - """ - Return a Geometry representing the points making up this Geometry - that do not make up other. - """ - return self._topology(capi.geos_difference(self.ptr, other.ptr)) - - @property - def envelope(self): - "Return the envelope for this geometry (a polygon)." - return self._topology(capi.geos_envelope(self.ptr)) - - def intersection(self, other): - "Return a Geometry representing the points shared by this Geometry and other." - return self._topology(capi.geos_intersection(self.ptr, other.ptr)) - - @property - def point_on_surface(self): - "Compute an interior point of this Geometry." - return self._topology(capi.geos_pointonsurface(self.ptr)) - - def relate(self, other): - "Return the DE-9IM intersection matrix for this Geometry and the other." - return capi.geos_relate(self.ptr, other.ptr).decode() - - def simplify(self, tolerance=0.0, preserve_topology=False): - """ - Return the Geometry, simplified using the Douglas-Peucker algorithm - to the specified tolerance (higher tolerance => less points). If no - tolerance provided, defaults to 0. - - By default, don't preserve topology - e.g. polygons can be split, - collapse to lines or disappear holes can be created or disappear, and - lines can cross. By specifying preserve_topology=True, the result will - have the same dimension and number of components as the input. This is - significantly slower. - """ - if preserve_topology: - return self._topology(capi.geos_preservesimplify(self.ptr, tolerance)) - else: - return self._topology(capi.geos_simplify(self.ptr, tolerance)) - - def sym_difference(self, other): - """ - Return a set combining the points in this Geometry not in other, - and the points in other not in this Geometry. - """ - return self._topology(capi.geos_symdifference(self.ptr, other.ptr)) - - @property - def unary_union(self): - "Return the union of all the elements of this geometry." - return self._topology(capi.geos_unary_union(self.ptr)) - - def union(self, other): - "Return a Geometry representing all the points in this Geometry and other." - return self._topology(capi.geos_union(self.ptr, other.ptr)) - - # #### Other Routines #### - @property - def area(self): - "Return the area of the Geometry." - return capi.geos_area(self.ptr, byref(c_double())) - - def distance(self, other): - """ - Return the distance between the closest points on this Geometry - and the other. Units will be in those of the coordinate system of - the Geometry. - """ - if not isinstance(other, GEOSGeometry): - raise TypeError("distance() works only on other GEOS Geometries.") - return capi.geos_distance(self.ptr, other.ptr, byref(c_double())) - - @property - def extent(self): - """ - Return the extent of this geometry as a 4-tuple, consisting of - (xmin, ymin, xmax, ymax). - """ - from .point import Point - - env = self.envelope - if isinstance(env, Point): - xmin, ymin = env.tuple - xmax, ymax = xmin, ymin - else: - xmin, ymin = env[0][0] - xmax, ymax = env[0][2] - return (xmin, ymin, xmax, ymax) - - @property - def length(self): - """ - Return the length of this Geometry (e.g., 0 for point, or the - circumference of a Polygon). - """ - return capi.geos_length(self.ptr, byref(c_double())) - - def clone(self): - "Clone this Geometry." - return GEOSGeometry(capi.geom_clone(self.ptr)) - - -class LinearGeometryMixin: - """ - Used for LineString and MultiLineString. - """ - - def interpolate(self, distance): - return self._topology(capi.geos_interpolate(self.ptr, distance)) - - def interpolate_normalized(self, distance): - return self._topology(capi.geos_interpolate_normalized(self.ptr, distance)) - - def project(self, point): - from .point import Point - - if not isinstance(point, Point): - raise TypeError("locate_point argument must be a Point") - return capi.geos_project(self.ptr, point.ptr) - - def project_normalized(self, point): - from .point import Point - - if not isinstance(point, Point): - raise TypeError("locate_point argument must be a Point") - return capi.geos_project_normalized(self.ptr, point.ptr) - - @property - def merged(self): - """ - Return the line merge of this Geometry. - """ - return self._topology(capi.geos_linemerge(self.ptr)) - - @property - def closed(self): - """ - Return whether or not this Geometry is closed. - """ - return capi.geos_isclosed(self.ptr) - - -@deconstructible -class GEOSGeometry(GEOSGeometryBase, ListMixin): - "A class that, generally, encapsulates a GEOS geometry." - - def __init__(self, geo_input, srid=None): - """ - The base constructor for GEOS geometry objects. It may take the - following inputs: - - * strings: - - WKT - - HEXEWKB (a PostGIS-specific canonical form) - - GeoJSON (requires GDAL) - * memoryview: - - WKB - - The `srid` keyword specifies the Source Reference Identifier (SRID) - number for this Geometry. If not provided, it defaults to None. - """ - input_srid = None - if isinstance(geo_input, bytes): - geo_input = force_str(geo_input) - if isinstance(geo_input, str): - wkt_m = wkt_regex.match(geo_input) - if wkt_m: - # Handle WKT input. - if wkt_m["srid"]: - input_srid = int(wkt_m["srid"]) - g = self._from_wkt(force_bytes(wkt_m["wkt"])) - elif hex_regex.match(geo_input): - # Handle HEXEWKB input. - g = wkb_r().read(force_bytes(geo_input)) - elif json_regex.match(geo_input): - # Handle GeoJSON input. - ogr = gdal.OGRGeometry.from_json(geo_input) - g = ogr._geos_ptr() - input_srid = ogr.srid - else: - raise ValueError("String input unrecognized as WKT EWKT, and HEXEWKB.") - elif isinstance(geo_input, GEOM_PTR): - # When the input is a pointer to a geometry (GEOM_PTR). - g = geo_input - elif isinstance(geo_input, memoryview): - # When the input is a memoryview (WKB). - g = wkb_r().read(geo_input) - elif isinstance(geo_input, GEOSGeometry): - g = capi.geom_clone(geo_input.ptr) - else: - raise TypeError("Improper geometry input type: %s" % type(geo_input)) - - if not g: - raise GEOSException("Could not initialize GEOS Geometry with given input.") - - input_srid = input_srid or capi.geos_get_srid(g) or None - if input_srid and srid and input_srid != srid: - raise ValueError("Input geometry already has SRID: %d." % input_srid) - - super().__init__(g, None) - # Set the SRID, if given. - srid = input_srid or srid - if srid and isinstance(srid, int): - self.srid = srid diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/io.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/io.py deleted file mode 100644 index 8dd3f28..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/io.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -Module that holds classes for performing I/O operations on GEOS geometry -objects. Specifically, this has Python implementations of WKB/WKT -reader and writer classes. -""" - -from django.contrib.gis.geos.geometry import GEOSGeometry -from django.contrib.gis.geos.prototypes.io import ( - WKBWriter, - WKTWriter, - _WKBReader, - _WKTReader, -) - -__all__ = ["WKBWriter", "WKTWriter", "WKBReader", "WKTReader"] - - -# Public classes for (WKB|WKT)Reader, which return GEOSGeometry -class WKBReader(_WKBReader): - def read(self, wkb): - "Return a GEOSGeometry for the given WKB buffer." - return GEOSGeometry(super().read(wkb)) - - -class WKTReader(_WKTReader): - def read(self, wkt): - "Return a GEOSGeometry for the given WKT string." - return GEOSGeometry(super().read(wkt)) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/libgeos.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/libgeos.py deleted file mode 100644 index 2707fef..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/libgeos.py +++ /dev/null @@ -1,175 +0,0 @@ -""" -This module houses the ctypes initialization procedures, as well -as the notice and error handler function callbacks (get called -when an error occurs in GEOS). - -This module also houses GEOS Pointer utilities, including -get_pointer_arr(), and GEOM_PTR. -""" - -import logging -import os -from ctypes import CDLL, CFUNCTYPE, POINTER, Structure, c_char_p -from ctypes.util import find_library - -from django.core.exceptions import ImproperlyConfigured -from django.utils.functional import SimpleLazyObject, cached_property -from django.utils.version import get_version_tuple - -logger = logging.getLogger("django.contrib.gis") - - -def load_geos(): - # Custom library path set? - try: - from django.conf import settings - - lib_path = settings.GEOS_LIBRARY_PATH - except (AttributeError, ImportError, ImproperlyConfigured, OSError): - lib_path = None - - # Setting the appropriate names for the GEOS-C library. - if lib_path: - lib_names = None - elif os.name == "nt": - # Windows NT libraries - lib_names = ["geos_c", "libgeos_c-1"] - elif os.name == "posix": - # *NIX libraries - lib_names = ["geos_c", "GEOS"] - else: - raise ImportError('Unsupported OS "%s"' % os.name) - - # Using the ctypes `find_library` utility to find the path to the GEOS - # shared library. This is better than manually specifying each library name - # and extension (e.g., libgeos_c.[so|so.1|dylib].). - if lib_names: - for lib_name in lib_names: - lib_path = find_library(lib_name) - if lib_path is not None: - break - - # No GEOS library could be found. - if lib_path is None: - raise ImportError( - 'Could not find the GEOS library (tried "%s"). ' - "Try setting GEOS_LIBRARY_PATH in your settings." % '", "'.join(lib_names) - ) - # Getting the GEOS C library. The C interface (CDLL) is used for - # both *NIX and Windows. - # See the GEOS C API source code for more details on the library function calls: - # https://libgeos.org/doxygen/geos__c_8h_source.html - _lgeos = CDLL(lib_path) - # Here we set up the prototypes for the initGEOS_r and finishGEOS_r - # routines. These functions aren't actually called until they are - # attached to a GEOS context handle -- this actually occurs in - # geos/prototypes/threadsafe.py. - _lgeos.initGEOS_r.restype = CONTEXT_PTR - _lgeos.finishGEOS_r.argtypes = [CONTEXT_PTR] - # Set restype for compatibility across 32 and 64-bit platforms. - _lgeos.GEOSversion.restype = c_char_p - return _lgeos - - -# The notice and error handler C function callback definitions. -# Supposed to mimic the GEOS message handler (C below): -# typedef void (*GEOSMessageHandler)(const char *fmt, ...); -NOTICEFUNC = CFUNCTYPE(None, c_char_p, c_char_p) - - -def notice_h(fmt, lst): - fmt, lst = fmt.decode(), lst.decode() - try: - warn_msg = fmt % lst - except TypeError: - warn_msg = fmt - logger.warning("GEOS_NOTICE: %s\n", warn_msg) - - -notice_h = NOTICEFUNC(notice_h) - -ERRORFUNC = CFUNCTYPE(None, c_char_p, c_char_p) - - -def error_h(fmt, lst): - fmt, lst = fmt.decode(), lst.decode() - try: - err_msg = fmt % lst - except TypeError: - err_msg = fmt - logger.error("GEOS_ERROR: %s\n", err_msg) - - -error_h = ERRORFUNC(error_h) - -# #### GEOS Geometry C data structures, and utility functions. #### - - -# Opaque GEOS geometry structures, used for GEOM_PTR and CS_PTR -class GEOSGeom_t(Structure): - pass - - -class GEOSPrepGeom_t(Structure): - pass - - -class GEOSCoordSeq_t(Structure): - pass - - -class GEOSContextHandle_t(Structure): - pass - - -# Pointers to opaque GEOS geometry structures. -GEOM_PTR = POINTER(GEOSGeom_t) -PREPGEOM_PTR = POINTER(GEOSPrepGeom_t) -CS_PTR = POINTER(GEOSCoordSeq_t) -CONTEXT_PTR = POINTER(GEOSContextHandle_t) - - -lgeos = SimpleLazyObject(load_geos) - - -class GEOSFuncFactory: - """ - Lazy loading of GEOS functions. - """ - - argtypes = None - restype = None - errcheck = None - - def __init__(self, func_name, *, restype=None, errcheck=None, argtypes=None): - self.func_name = func_name - if restype is not None: - self.restype = restype - if errcheck is not None: - self.errcheck = errcheck - if argtypes is not None: - self.argtypes = argtypes - - def __call__(self, *args): - return self.func(*args) - - @cached_property - def func(self): - from django.contrib.gis.geos.prototypes.threadsafe import GEOSFunc - - func = GEOSFunc(self.func_name) - func.argtypes = self.argtypes or [] - func.restype = self.restype - if self.errcheck: - func.errcheck = self.errcheck - return func - - -def geos_version(): - """Return the string version of the GEOS library.""" - return lgeos.GEOSversion() - - -def geos_version_tuple(): - """Return the GEOS version as a tuple (major, minor, subminor).""" - return get_version_tuple(geos_version().decode()) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/linestring.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/linestring.py deleted file mode 100644 index 78a265c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/linestring.py +++ /dev/null @@ -1,193 +0,0 @@ -from django.contrib.gis.geos import prototypes as capi -from django.contrib.gis.geos.coordseq import GEOSCoordSeq -from django.contrib.gis.geos.error import GEOSException -from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin -from django.contrib.gis.geos.point import Point -from django.contrib.gis.shortcuts import numpy - - -class LineString(LinearGeometryMixin, GEOSGeometry): - _init_func = capi.create_linestring - _minlength = 2 - has_cs = True - - def __init__(self, *args, **kwargs): - """ - Initialize on the given sequence -- may take lists, tuples, NumPy arrays - of X,Y pairs, or Point objects. If Point objects are used, ownership is - _not_ transferred to the LineString object. - - Examples: - ls = LineString((1, 1), (2, 2)) - ls = LineString([(1, 1), (2, 2)]) - ls = LineString(array([(1, 1), (2, 2)])) - ls = LineString(Point(1, 1), Point(2, 2)) - """ - # If only one argument provided, set the coords array appropriately - if len(args) == 1: - coords = args[0] - else: - coords = args - - if not ( - isinstance(coords, (tuple, list)) - or numpy - and isinstance(coords, numpy.ndarray) - ): - raise TypeError("Invalid initialization input for LineStrings.") - - # If SRID was passed in with the keyword arguments - srid = kwargs.get("srid") - - ncoords = len(coords) - if not ncoords: - super().__init__(self._init_func(None), srid=srid) - return - - if ncoords < self._minlength: - raise ValueError( - "%s requires at least %d points, got %s." - % ( - self.__class__.__name__, - self._minlength, - ncoords, - ) - ) - - numpy_coords = not isinstance(coords, (tuple, list)) - if numpy_coords: - shape = coords.shape # Using numpy's shape. - if len(shape) != 2: - raise TypeError("Too many dimensions.") - self._checkdim(shape[1]) - ndim = shape[1] - else: - # Getting the number of coords and the number of dimensions -- which - # must stay the same, e.g., no LineString((1, 2), (1, 2, 3)). - ndim = None - # Incrementing through each of the coordinates and verifying - for coord in coords: - if not isinstance(coord, (tuple, list, Point)): - raise TypeError( - "Each coordinate should be a sequence (list or tuple)" - ) - - if ndim is None: - ndim = len(coord) - self._checkdim(ndim) - elif len(coord) != ndim: - raise TypeError("Dimension mismatch.") - - # Creating a coordinate sequence object because it is easier to - # set the points using its methods. - cs = GEOSCoordSeq(capi.create_cs(ncoords, ndim), z=bool(ndim == 3)) - point_setter = cs._set_point_3d if ndim == 3 else cs._set_point_2d - - for i in range(ncoords): - if numpy_coords: - point_coords = coords[i, :] - elif isinstance(coords[i], Point): - point_coords = coords[i].tuple - else: - point_coords = coords[i] - point_setter(i, point_coords) - - # Calling the base geometry initialization with the returned pointer - # from the function. - super().__init__(self._init_func(cs.ptr), srid=srid) - - def __iter__(self): - "Allow iteration over this LineString." - for i in range(len(self)): - yield self[i] - - def __len__(self): - "Return the number of points in this LineString." - return len(self._cs) - - def _get_single_external(self, index): - return self._cs[index] - - _get_single_internal = _get_single_external - - def _set_list(self, length, items): - ndim = self._cs.dims - hasz = self._cs.hasz # I don't understand why these are different - srid = self.srid - - # create a new coordinate sequence and populate accordingly - cs = GEOSCoordSeq(capi.create_cs(length, ndim), z=hasz) - for i, c in enumerate(items): - cs[i] = c - - ptr = self._init_func(cs.ptr) - if ptr: - capi.destroy_geom(self.ptr) - self.ptr = ptr - if srid is not None: - self.srid = srid - self._post_init() - else: - # can this happen? - raise GEOSException("Geometry resulting from slice deletion was invalid.") - - def _set_single(self, index, value): - self._cs[index] = value - - def _checkdim(self, dim): - if dim not in (2, 3): - raise TypeError("Dimension mismatch.") - - # #### Sequence Properties #### - @property - def tuple(self): - "Return a tuple version of the geometry from the coordinate sequence." - return self._cs.tuple - - coords = tuple - - def _listarr(self, func): - """ - Return a sequence (list) corresponding with the given function. - Return a numpy array if possible. - """ - lst = [func(i) for i in range(len(self))] - if numpy: - return numpy.array(lst) # ARRRR! - else: - return lst - - @property - def array(self): - "Return a numpy array for the LineString." - return self._listarr(self._cs.__getitem__) - - @property - def x(self): - "Return a list or numpy array of the X variable." - return self._listarr(self._cs.getX) - - @property - def y(self): - "Return a list or numpy array of the Y variable." - return self._listarr(self._cs.getY) - - @property - def z(self): - "Return a list or numpy array of the Z variable." - if not self.hasz: - return None - else: - return self._listarr(self._cs.getZ) - - -# LinearRings are LineStrings used within Polygons. -class LinearRing(LineString): - _minlength = 4 - _init_func = capi.create_linearring - - @property - def is_counterclockwise(self): - if self.empty: - raise ValueError("Orientation of an empty LinearRing cannot be determined.") - return self._cs.is_counterclockwise diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/mutable_list.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/mutable_list.py deleted file mode 100644 index 36131fe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/mutable_list.py +++ /dev/null @@ -1,314 +0,0 @@ -# Copyright (c) 2008-2009 Aryeh Leib Taurog, all rights reserved. -# Released under the New BSD license. -""" -This module contains a base type which provides list-style mutations -without specific data storage methods. - -See also http://static.aryehleib.com/oldsite/MutableLists.html - -Author: Aryeh Leib Taurog. -""" -from functools import total_ordering - - -@total_ordering -class ListMixin: - """ - A base class which provides complete list interface. - Derived classes must call ListMixin's __init__() function - and implement the following: - - function _get_single_external(self, i): - Return single item with index i for general use. - The index i will always satisfy 0 <= i < len(self). - - function _get_single_internal(self, i): - Same as above, but for use within the class [Optional] - Note that if _get_single_internal and _get_single_internal return - different types of objects, _set_list must distinguish - between the two and handle each appropriately. - - function _set_list(self, length, items): - Recreate the entire object. - - NOTE: items may be a generator which calls _get_single_internal. - Therefore, it is necessary to cache the values in a temporary: - temp = list(items) - before clobbering the original storage. - - function _set_single(self, i, value): - Set the single item at index i to value [Optional] - If left undefined, all mutations will result in rebuilding - the object using _set_list. - - function __len__(self): - Return the length - - int _minlength: - The minimum legal length [Optional] - - int _maxlength: - The maximum legal length [Optional] - - type or tuple _allowed: - A type or tuple of allowed item types [Optional] - """ - - _minlength = 0 - _maxlength = None - - # ### Python initialization and special list interface methods ### - - def __init__(self, *args, **kwargs): - if not hasattr(self, "_get_single_internal"): - self._get_single_internal = self._get_single_external - - if not hasattr(self, "_set_single"): - self._set_single = self._set_single_rebuild - self._assign_extended_slice = self._assign_extended_slice_rebuild - - super().__init__(*args, **kwargs) - - def __getitem__(self, index): - "Get the item(s) at the specified index/slice." - if isinstance(index, slice): - return [ - self._get_single_external(i) for i in range(*index.indices(len(self))) - ] - else: - index = self._checkindex(index) - return self._get_single_external(index) - - def __delitem__(self, index): - "Delete the item(s) at the specified index/slice." - if not isinstance(index, (int, slice)): - raise TypeError("%s is not a legal index" % index) - - # calculate new length and dimensions - origLen = len(self) - if isinstance(index, int): - index = self._checkindex(index) - indexRange = [index] - else: - indexRange = range(*index.indices(origLen)) - - newLen = origLen - len(indexRange) - newItems = ( - self._get_single_internal(i) for i in range(origLen) if i not in indexRange - ) - - self._rebuild(newLen, newItems) - - def __setitem__(self, index, val): - "Set the item(s) at the specified index/slice." - if isinstance(index, slice): - self._set_slice(index, val) - else: - index = self._checkindex(index) - self._check_allowed((val,)) - self._set_single(index, val) - - # ### Special methods for arithmetic operations ### - def __add__(self, other): - "add another list-like object" - return self.__class__([*self, *other]) - - def __radd__(self, other): - "add to another list-like object" - return other.__class__([*other, *self]) - - def __iadd__(self, other): - "add another list-like object to self" - self.extend(other) - return self - - def __mul__(self, n): - "multiply" - return self.__class__(list(self) * n) - - def __rmul__(self, n): - "multiply" - return self.__class__(list(self) * n) - - def __imul__(self, n): - "multiply" - if n <= 0: - del self[:] - else: - cache = list(self) - for i in range(n - 1): - self.extend(cache) - return self - - def __eq__(self, other): - olen = len(other) - for i in range(olen): - try: - c = self[i] == other[i] - except IndexError: - # self must be shorter - return False - if not c: - return False - return len(self) == olen - - def __lt__(self, other): - olen = len(other) - for i in range(olen): - try: - c = self[i] < other[i] - except IndexError: - # self must be shorter - return True - if c: - return c - elif other[i] < self[i]: - return False - return len(self) < olen - - # ### Public list interface Methods ### - # ## Non-mutating ## - def count(self, val): - "Standard list count method" - count = 0 - for i in self: - if val == i: - count += 1 - return count - - def index(self, val): - "Standard list index method" - for i in range(0, len(self)): - if self[i] == val: - return i - raise ValueError("%s not found in object" % val) - - # ## Mutating ## - def append(self, val): - "Standard list append method" - self[len(self) :] = [val] - - def extend(self, vals): - "Standard list extend method" - self[len(self) :] = vals - - def insert(self, index, val): - "Standard list insert method" - if not isinstance(index, int): - raise TypeError("%s is not a legal index" % index) - self[index:index] = [val] - - def pop(self, index=-1): - "Standard list pop method" - result = self[index] - del self[index] - return result - - def remove(self, val): - "Standard list remove method" - del self[self.index(val)] - - def reverse(self): - "Standard list reverse method" - self[:] = self[-1::-1] - - def sort(self, key=None, reverse=False): - "Standard list sort method" - self[:] = sorted(self, key=key, reverse=reverse) - - # ### Private routines ### - def _rebuild(self, newLen, newItems): - if newLen and newLen < self._minlength: - raise ValueError("Must have at least %d items" % self._minlength) - if self._maxlength is not None and newLen > self._maxlength: - raise ValueError("Cannot have more than %d items" % self._maxlength) - - self._set_list(newLen, newItems) - - def _set_single_rebuild(self, index, value): - self._set_slice(slice(index, index + 1, 1), [value]) - - def _checkindex(self, index): - length = len(self) - if 0 <= index < length: - return index - if -length <= index < 0: - return index + length - raise IndexError("invalid index: %s" % index) - - def _check_allowed(self, items): - if hasattr(self, "_allowed"): - if False in [isinstance(val, self._allowed) for val in items]: - raise TypeError("Invalid type encountered in the arguments.") - - def _set_slice(self, index, values): - "Assign values to a slice of the object" - try: - valueList = list(values) - except TypeError: - raise TypeError("can only assign an iterable to a slice") - - self._check_allowed(valueList) - - origLen = len(self) - start, stop, step = index.indices(origLen) - - # CAREFUL: index.step and step are not the same! - # step will never be None - if index.step is None: - self._assign_simple_slice(start, stop, valueList) - else: - self._assign_extended_slice(start, stop, step, valueList) - - def _assign_extended_slice_rebuild(self, start, stop, step, valueList): - "Assign an extended slice by rebuilding entire list" - indexList = range(start, stop, step) - # extended slice, only allow assigning slice of same size - if len(valueList) != len(indexList): - raise ValueError( - "attempt to assign sequence of size %d " - "to extended slice of size %d" % (len(valueList), len(indexList)) - ) - - # we're not changing the length of the sequence - newLen = len(self) - newVals = dict(zip(indexList, valueList)) - - def newItems(): - for i in range(newLen): - if i in newVals: - yield newVals[i] - else: - yield self._get_single_internal(i) - - self._rebuild(newLen, newItems()) - - def _assign_extended_slice(self, start, stop, step, valueList): - "Assign an extended slice by re-assigning individual items" - indexList = range(start, stop, step) - # extended slice, only allow assigning slice of same size - if len(valueList) != len(indexList): - raise ValueError( - "attempt to assign sequence of size %d " - "to extended slice of size %d" % (len(valueList), len(indexList)) - ) - - for i, val in zip(indexList, valueList): - self._set_single(i, val) - - def _assign_simple_slice(self, start, stop, valueList): - "Assign a simple slice; Can assign slice of any length" - origLen = len(self) - stop = max(start, stop) - newLen = origLen - stop + start + len(valueList) - - def newItems(): - for i in range(origLen + 1): - if i == start: - yield from valueList - - if i < origLen: - if i < start or i >= stop: - yield self._get_single_internal(i) - - self._rebuild(newLen, newItems()) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/point.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/point.py deleted file mode 100644 index 06b2668..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/point.py +++ /dev/null @@ -1,162 +0,0 @@ -from ctypes import c_uint - -from django.contrib.gis import gdal -from django.contrib.gis.geos import prototypes as capi -from django.contrib.gis.geos.error import GEOSException -from django.contrib.gis.geos.geometry import GEOSGeometry - - -class Point(GEOSGeometry): - _minlength = 2 - _maxlength = 3 - has_cs = True - - def __init__(self, x=None, y=None, z=None, srid=None): - """ - The Point object may be initialized with either a tuple, or individual - parameters. - - For example: - >>> p = Point((5, 23)) # 2D point, passed in as a tuple - >>> p = Point(5, 23, 8) # 3D point, passed in with individual parameters - """ - if x is None: - coords = [] - elif isinstance(x, (tuple, list)): - # Here a tuple or list was passed in under the `x` parameter. - coords = x - elif isinstance(x, (float, int)) and isinstance(y, (float, int)): - # Here X, Y, and (optionally) Z were passed in individually, as parameters. - if isinstance(z, (float, int)): - coords = [x, y, z] - else: - coords = [x, y] - else: - raise TypeError("Invalid parameters given for Point initialization.") - - point = self._create_point(len(coords), coords) - - # Initializing using the address returned from the GEOS - # createPoint factory. - super().__init__(point, srid=srid) - - def _to_pickle_wkb(self): - return None if self.empty else super()._to_pickle_wkb() - - def _from_pickle_wkb(self, wkb): - return self._create_empty() if wkb is None else super()._from_pickle_wkb(wkb) - - def _ogr_ptr(self): - return ( - gdal.geometries.Point._create_empty() if self.empty else super()._ogr_ptr() - ) - - @classmethod - def _create_empty(cls): - return cls._create_point(None, None) - - @classmethod - def _create_point(cls, ndim, coords): - """ - Create a coordinate sequence, set X, Y, [Z], and create point - """ - if not ndim: - return capi.create_point(None) - - if ndim < 2 or ndim > 3: - raise TypeError("Invalid point dimension: %s" % ndim) - - cs = capi.create_cs(c_uint(1), c_uint(ndim)) - i = iter(coords) - capi.cs_setx(cs, 0, next(i)) - capi.cs_sety(cs, 0, next(i)) - if ndim == 3: - capi.cs_setz(cs, 0, next(i)) - - return capi.create_point(cs) - - def _set_list(self, length, items): - ptr = self._create_point(length, items) - if ptr: - srid = self.srid - capi.destroy_geom(self.ptr) - self._ptr = ptr - if srid is not None: - self.srid = srid - self._post_init() - else: - # can this happen? - raise GEOSException("Geometry resulting from slice deletion was invalid.") - - def _set_single(self, index, value): - self._cs.setOrdinate(index, 0, value) - - def __iter__(self): - "Iterate over coordinates of this Point." - for i in range(len(self)): - yield self[i] - - def __len__(self): - "Return the number of dimensions for this Point (either 0, 2 or 3)." - if self.empty: - return 0 - if self.hasz: - return 3 - else: - return 2 - - def _get_single_external(self, index): - if index == 0: - return self.x - elif index == 1: - return self.y - elif index == 2: - return self.z - - _get_single_internal = _get_single_external - - @property - def x(self): - "Return the X component of the Point." - return self._cs.getOrdinate(0, 0) - - @x.setter - def x(self, value): - "Set the X component of the Point." - self._cs.setOrdinate(0, 0, value) - - @property - def y(self): - "Return the Y component of the Point." - return self._cs.getOrdinate(1, 0) - - @y.setter - def y(self, value): - "Set the Y component of the Point." - self._cs.setOrdinate(1, 0, value) - - @property - def z(self): - "Return the Z component of the Point." - return self._cs.getOrdinate(2, 0) if self.hasz else None - - @z.setter - def z(self, value): - "Set the Z component of the Point." - if not self.hasz: - raise GEOSException("Cannot set Z on 2D Point.") - self._cs.setOrdinate(2, 0, value) - - # ### Tuple setting and retrieval routines. ### - @property - def tuple(self): - "Return a tuple of the point." - return self._cs.tuple - - @tuple.setter - def tuple(self, tup): - "Set the coordinates of the point with the given tuple." - self._cs[0] = tup - - # The tuple and coords properties - coords = tuple diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/polygon.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/polygon.py deleted file mode 100644 index 6f76b57..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/polygon.py +++ /dev/null @@ -1,189 +0,0 @@ -from django.contrib.gis.geos import prototypes as capi -from django.contrib.gis.geos.geometry import GEOSGeometry -from django.contrib.gis.geos.libgeos import GEOM_PTR -from django.contrib.gis.geos.linestring import LinearRing - - -class Polygon(GEOSGeometry): - _minlength = 1 - - def __init__(self, *args, **kwargs): - """ - Initialize on an exterior ring and a sequence of holes (both - instances may be either LinearRing instances, or a tuple/list - that may be constructed into a LinearRing). - - Examples of initialization, where shell, hole1, and hole2 are - valid LinearRing geometries: - >>> from django.contrib.gis.geos import LinearRing, Polygon - >>> shell = hole1 = hole2 = LinearRing() - >>> poly = Polygon(shell, hole1, hole2) - >>> poly = Polygon(shell, (hole1, hole2)) - - >>> # Example where a tuple parameters are used: - >>> poly = Polygon(((0, 0), (0, 10), (10, 10), (10, 0), (0, 0)), - ... ((4, 4), (4, 6), (6, 6), (6, 4), (4, 4))) - """ - if not args: - super().__init__(self._create_polygon(0, None), **kwargs) - return - - # Getting the ext_ring and init_holes parameters from the argument list - ext_ring, *init_holes = args - n_holes = len(init_holes) - - # If initialized as Polygon(shell, (LinearRing, LinearRing)) - # [for backward-compatibility] - if n_holes == 1 and isinstance(init_holes[0], (tuple, list)): - if not init_holes[0]: - init_holes = () - n_holes = 0 - elif isinstance(init_holes[0][0], LinearRing): - init_holes = init_holes[0] - n_holes = len(init_holes) - - polygon = self._create_polygon(n_holes + 1, [ext_ring, *init_holes]) - super().__init__(polygon, **kwargs) - - def __iter__(self): - "Iterate over each ring in the polygon." - for i in range(len(self)): - yield self[i] - - def __len__(self): - "Return the number of rings in this Polygon." - return self.num_interior_rings + 1 - - @classmethod - def from_bbox(cls, bbox): - "Construct a Polygon from a bounding box (4-tuple)." - x0, y0, x1, y1 = bbox - for z in bbox: - if not isinstance(z, (float, int)): - return GEOSGeometry( - "POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s))" - % (x0, y0, x0, y1, x1, y1, x1, y0, x0, y0) - ) - return Polygon(((x0, y0), (x0, y1), (x1, y1), (x1, y0), (x0, y0))) - - # ### These routines are needed for list-like operation w/ListMixin ### - def _create_polygon(self, length, items): - # Instantiate LinearRing objects if necessary, but don't clone them yet - # _construct_ring will throw a TypeError if a parameter isn't a valid ring - # If we cloned the pointers here, we wouldn't be able to clean up - # in case of error. - if not length: - return capi.create_empty_polygon() - - rings = [] - for r in items: - if isinstance(r, GEOM_PTR): - rings.append(r) - else: - rings.append(self._construct_ring(r)) - - shell = self._clone(rings.pop(0)) - - n_holes = length - 1 - if n_holes: - holes_param = (GEOM_PTR * n_holes)(*[self._clone(r) for r in rings]) - else: - holes_param = None - - return capi.create_polygon(shell, holes_param, n_holes) - - def _clone(self, g): - if isinstance(g, GEOM_PTR): - return capi.geom_clone(g) - else: - return capi.geom_clone(g.ptr) - - def _construct_ring( - self, - param, - msg=( - "Parameter must be a sequence of LinearRings or objects that can " - "initialize to LinearRings" - ), - ): - "Try to construct a ring from the given parameter." - if isinstance(param, LinearRing): - return param - try: - return LinearRing(param) - except TypeError: - raise TypeError(msg) - - def _set_list(self, length, items): - # Getting the current pointer, replacing with the newly constructed - # geometry, and destroying the old geometry. - prev_ptr = self.ptr - srid = self.srid - self.ptr = self._create_polygon(length, items) - if srid: - self.srid = srid - capi.destroy_geom(prev_ptr) - - def _get_single_internal(self, index): - """ - Return the ring at the specified index. The first index, 0, will - always return the exterior ring. Indices > 0 will return the - interior ring at the given index (e.g., poly[1] and poly[2] would - return the first and second interior ring, respectively). - - CAREFUL: Internal/External are not the same as Interior/Exterior! - Return a pointer from the existing geometries for use internally by the - object's methods. _get_single_external() returns a clone of the same - geometry for use by external code. - """ - if index == 0: - return capi.get_extring(self.ptr) - else: - # Getting the interior ring, have to subtract 1 from the index. - return capi.get_intring(self.ptr, index - 1) - - def _get_single_external(self, index): - return GEOSGeometry( - capi.geom_clone(self._get_single_internal(index)), srid=self.srid - ) - - _set_single = GEOSGeometry._set_single_rebuild - _assign_extended_slice = GEOSGeometry._assign_extended_slice_rebuild - - # #### Polygon Properties #### - @property - def num_interior_rings(self): - "Return the number of interior rings." - # Getting the number of rings - return capi.get_nrings(self.ptr) - - def _get_ext_ring(self): - "Get the exterior ring of the Polygon." - return self[0] - - def _set_ext_ring(self, ring): - "Set the exterior ring of the Polygon." - self[0] = ring - - # Properties for the exterior ring/shell. - exterior_ring = property(_get_ext_ring, _set_ext_ring) - shell = exterior_ring - - @property - def tuple(self): - "Get the tuple for each ring in this Polygon." - return tuple(self[i].tuple for i in range(len(self))) - - coords = tuple - - @property - def kml(self): - "Return the KML representation of this Polygon." - inner_kml = "".join( - "%s" % self[i + 1].kml - for i in range(self.num_interior_rings) - ) - return "%s%s" % ( - self[0].kml, - inner_kml, - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prepared.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prepared.py deleted file mode 100644 index 9c77d8a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prepared.py +++ /dev/null @@ -1,51 +0,0 @@ -from .base import GEOSBase -from .prototypes import prepared as capi - - -class PreparedGeometry(GEOSBase): - """ - A geometry that is prepared for performing certain operations. - At the moment this includes the contains covers, and intersects - operations. - """ - - ptr_type = capi.PREPGEOM_PTR - destructor = capi.prepared_destroy - - def __init__(self, geom): - # Keeping a reference to the original geometry object to prevent it - # from being garbage collected which could then crash the prepared one - # See #21662 - self._base_geom = geom - from .geometry import GEOSGeometry - - if not isinstance(geom, GEOSGeometry): - raise TypeError - self.ptr = capi.geos_prepare(geom.ptr) - - def contains(self, other): - return capi.prepared_contains(self.ptr, other.ptr) - - def contains_properly(self, other): - return capi.prepared_contains_properly(self.ptr, other.ptr) - - def covers(self, other): - return capi.prepared_covers(self.ptr, other.ptr) - - def intersects(self, other): - return capi.prepared_intersects(self.ptr, other.ptr) - - def crosses(self, other): - return capi.prepared_crosses(self.ptr, other.ptr) - - def disjoint(self, other): - return capi.prepared_disjoint(self.ptr, other.ptr) - - def overlaps(self, other): - return capi.prepared_overlaps(self.ptr, other.ptr) - - def touches(self, other): - return capi.prepared_touches(self.ptr, other.ptr) - - def within(self, other): - return capi.prepared_within(self.ptr, other.ptr) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/__init__.py deleted file mode 100644 index d713228..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/__init__.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -This module contains all of the GEOS ctypes function prototypes. Each -prototype handles the interaction between the GEOS library and Python -via ctypes. -""" - -from django.contrib.gis.geos.prototypes.coordseq import ( # NOQA - create_cs, - cs_clone, - cs_getdims, - cs_getordinate, - cs_getsize, - cs_getx, - cs_gety, - cs_getz, - cs_is_ccw, - cs_setordinate, - cs_setx, - cs_sety, - cs_setz, - get_cs, -) -from django.contrib.gis.geos.prototypes.geom import ( # NOQA - create_collection, - create_empty_polygon, - create_linearring, - create_linestring, - create_point, - create_polygon, - destroy_geom, - geom_clone, - geos_get_srid, - geos_makevalid, - geos_normalize, - geos_set_srid, - geos_type, - geos_typeid, - get_dims, - get_extring, - get_geomn, - get_intring, - get_nrings, - get_num_coords, - get_num_geoms, -) -from django.contrib.gis.geos.prototypes.misc import * # NOQA -from django.contrib.gis.geos.prototypes.predicates import ( # NOQA - geos_contains, - geos_covers, - geos_crosses, - geos_disjoint, - geos_equals, - geos_equalsexact, - geos_equalsidentical, - geos_hasz, - geos_intersects, - geos_isclosed, - geos_isempty, - geos_isring, - geos_issimple, - geos_isvalid, - geos_overlaps, - geos_relatepattern, - geos_touches, - geos_within, -) -from django.contrib.gis.geos.prototypes.topology import * # NOQA diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/coordseq.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/coordseq.py deleted file mode 100644 index cfc242c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/coordseq.py +++ /dev/null @@ -1,97 +0,0 @@ -from ctypes import POINTER, c_byte, c_double, c_int, c_uint - -from django.contrib.gis.geos.libgeos import CS_PTR, GEOM_PTR, GEOSFuncFactory -from django.contrib.gis.geos.prototypes.errcheck import GEOSException, last_arg_byref - - -# ## Error-checking routines specific to coordinate sequences. ## -def check_cs_op(result, func, cargs): - "Check the status code of a coordinate sequence operation." - if result == 0: - raise GEOSException("Could not set value on coordinate sequence") - else: - return result - - -def check_cs_get(result, func, cargs): - "Check the coordinate sequence retrieval." - check_cs_op(result, func, cargs) - # Object in by reference, return its value. - return last_arg_byref(cargs) - - -# ## Coordinate sequence prototype factory classes. ## -class CsInt(GEOSFuncFactory): - "For coordinate sequence routines that return an integer." - - argtypes = [CS_PTR, POINTER(c_uint)] - restype = c_int - errcheck = staticmethod(check_cs_get) - - -class CsOperation(GEOSFuncFactory): - "For coordinate sequence operations." - - restype = c_int - - def __init__(self, *args, ordinate=False, get=False, **kwargs): - if get: - # Get routines have double parameter passed-in by reference. - errcheck = check_cs_get - dbl_param = POINTER(c_double) - else: - errcheck = check_cs_op - dbl_param = c_double - - if ordinate: - # Get/Set ordinate routines have an extra uint parameter. - argtypes = [CS_PTR, c_uint, c_uint, dbl_param] - else: - argtypes = [CS_PTR, c_uint, dbl_param] - - super().__init__( - *args, **{**kwargs, "errcheck": errcheck, "argtypes": argtypes} - ) - - -class CsOutput(GEOSFuncFactory): - restype = CS_PTR - - @staticmethod - def errcheck(result, func, cargs): - if not result: - raise GEOSException( - "Error encountered checking Coordinate Sequence returned from GEOS " - 'C function "%s".' % func.__name__ - ) - return result - - -# ## Coordinate Sequence ctypes prototypes ## - -# Coordinate Sequence constructors & cloning. -cs_clone = CsOutput("GEOSCoordSeq_clone", argtypes=[CS_PTR]) -create_cs = CsOutput("GEOSCoordSeq_create", argtypes=[c_uint, c_uint]) -get_cs = CsOutput("GEOSGeom_getCoordSeq", argtypes=[GEOM_PTR]) - -# Getting, setting ordinate -cs_getordinate = CsOperation("GEOSCoordSeq_getOrdinate", ordinate=True, get=True) -cs_setordinate = CsOperation("GEOSCoordSeq_setOrdinate", ordinate=True) - -# For getting, x, y, z -cs_getx = CsOperation("GEOSCoordSeq_getX", get=True) -cs_gety = CsOperation("GEOSCoordSeq_getY", get=True) -cs_getz = CsOperation("GEOSCoordSeq_getZ", get=True) - -# For setting, x, y, z -cs_setx = CsOperation("GEOSCoordSeq_setX") -cs_sety = CsOperation("GEOSCoordSeq_setY") -cs_setz = CsOperation("GEOSCoordSeq_setZ") - -# These routines return size & dimensions. -cs_getsize = CsInt("GEOSCoordSeq_getSize") -cs_getdims = CsInt("GEOSCoordSeq_getDimensions") - -cs_is_ccw = GEOSFuncFactory( - "GEOSCoordSeq_isCCW", restype=c_int, argtypes=[CS_PTR, POINTER(c_byte)] -) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/errcheck.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/errcheck.py deleted file mode 100644 index 5ee4399..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/errcheck.py +++ /dev/null @@ -1,96 +0,0 @@ -""" -Error checking functions for GEOS ctypes prototype functions. -""" - -from ctypes import c_void_p, string_at - -from django.contrib.gis.geos.error import GEOSException -from django.contrib.gis.geos.libgeos import GEOSFuncFactory - -# Getting the `free` routine used to free the memory allocated for -# string pointers returned by GEOS. -free = GEOSFuncFactory("GEOSFree") -free.argtypes = [c_void_p] - - -def last_arg_byref(args): - "Return the last C argument's value by reference." - return args[-1]._obj.value - - -def check_dbl(result, func, cargs): - "Check the status code and returns the double value passed in by reference." - # Checking the status code - if result != 1: - return None - # Double passed in by reference, return its value. - return last_arg_byref(cargs) - - -def check_geom(result, func, cargs): - "Error checking on routines that return Geometries." - if not result: - raise GEOSException( - 'Error encountered checking Geometry returned from GEOS C function "%s".' - % func.__name__ - ) - return result - - -def check_minus_one(result, func, cargs): - "Error checking on routines that should not return -1." - if result == -1: - raise GEOSException( - 'Error encountered in GEOS C function "%s".' % func.__name__ - ) - else: - return result - - -def check_predicate(result, func, cargs): - "Error checking for unary/binary predicate functions." - if result == 1: - return True - elif result == 0: - return False - else: - raise GEOSException( - 'Error encountered on GEOS C predicate function "%s".' % func.__name__ - ) - - -def check_sized_string(result, func, cargs): - """ - Error checking for routines that return explicitly sized strings. - - This frees the memory allocated by GEOS at the result pointer. - """ - if not result: - raise GEOSException( - 'Invalid string pointer returned by GEOS C function "%s"' % func.__name__ - ) - # A c_size_t object is passed in by reference for the second - # argument on these routines, and its needed to determine the - # correct size. - s = string_at(result, last_arg_byref(cargs)) - # Freeing the memory allocated within GEOS - free(result) - return s - - -def check_string(result, func, cargs): - """ - Error checking for routines that return strings. - - This frees the memory allocated by GEOS at the result pointer. - """ - if not result: - raise GEOSException( - 'Error encountered checking string return value in GEOS C function "%s".' - % func.__name__ - ) - # Getting the string value at the pointer address. - s = string_at(result) - # Freeing the memory allocated within GEOS - free(result) - return s diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/geom.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/geom.py deleted file mode 100644 index 3996544..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/geom.py +++ /dev/null @@ -1,94 +0,0 @@ -from ctypes import POINTER, c_char_p, c_int, c_ubyte, c_uint - -from django.contrib.gis.geos.libgeos import CS_PTR, GEOM_PTR, GEOSFuncFactory -from django.contrib.gis.geos.prototypes.errcheck import ( - check_geom, - check_minus_one, - check_string, -) - -# This is the return type used by binary output (WKB, HEX) routines. -c_uchar_p = POINTER(c_ubyte) - - -# We create a simple subclass of c_char_p here because when the response -# type is set to c_char_p, you get a _Python_ string and there's no way -# to access the string's address inside the error checking function. -# In other words, you can't free the memory allocated inside GEOS. Previously, -# the return type would just be omitted and the integer address would be -# used -- but this allows us to be specific in the function definition and -# keeps the reference so it may be free'd. -class geos_char_p(c_char_p): - pass - - -# ### ctypes factory classes ### -class GeomOutput(GEOSFuncFactory): - "For GEOS routines that return a geometry." - - restype = GEOM_PTR - errcheck = staticmethod(check_geom) - - -class IntFromGeom(GEOSFuncFactory): - "Argument is a geometry, return type is an integer." - - argtypes = [GEOM_PTR] - restype = c_int - errcheck = staticmethod(check_minus_one) - - -class StringFromGeom(GEOSFuncFactory): - "Argument is a Geometry, return type is a string." - - argtypes = [GEOM_PTR] - restype = geos_char_p - errcheck = staticmethod(check_string) - - -# ### ctypes prototypes ### - -# The GEOS geometry type, typeid, num_coordinates and number of geometries -geos_makevalid = GeomOutput("GEOSMakeValid", argtypes=[GEOM_PTR]) -geos_normalize = IntFromGeom("GEOSNormalize") -geos_type = StringFromGeom("GEOSGeomType") -geos_typeid = IntFromGeom("GEOSGeomTypeId") -get_dims = GEOSFuncFactory("GEOSGeom_getDimensions", argtypes=[GEOM_PTR], restype=c_int) -get_num_coords = IntFromGeom("GEOSGetNumCoordinates") -get_num_geoms = IntFromGeom("GEOSGetNumGeometries") - -# Geometry creation factories -create_point = GeomOutput("GEOSGeom_createPoint", argtypes=[CS_PTR]) -create_linestring = GeomOutput("GEOSGeom_createLineString", argtypes=[CS_PTR]) -create_linearring = GeomOutput("GEOSGeom_createLinearRing", argtypes=[CS_PTR]) - -# Polygon and collection creation routines need argument types defined -# for compatibility with some platforms, e.g. macOS ARM64. With argtypes -# defined, arrays are automatically cast and byref() calls are not needed. -create_polygon = GeomOutput( - "GEOSGeom_createPolygon", - argtypes=[GEOM_PTR, POINTER(GEOM_PTR), c_uint], -) -create_empty_polygon = GeomOutput("GEOSGeom_createEmptyPolygon", argtypes=[]) -create_collection = GeomOutput( - "GEOSGeom_createCollection", - argtypes=[c_int, POINTER(GEOM_PTR), c_uint], -) - -# Ring routines -get_extring = GeomOutput("GEOSGetExteriorRing", argtypes=[GEOM_PTR]) -get_intring = GeomOutput("GEOSGetInteriorRingN", argtypes=[GEOM_PTR, c_int]) -get_nrings = IntFromGeom("GEOSGetNumInteriorRings") - -# Collection Routines -get_geomn = GeomOutput("GEOSGetGeometryN", argtypes=[GEOM_PTR, c_int]) - -# Cloning -geom_clone = GEOSFuncFactory("GEOSGeom_clone", argtypes=[GEOM_PTR], restype=GEOM_PTR) - -# Destruction routine. -destroy_geom = GEOSFuncFactory("GEOSGeom_destroy", argtypes=[GEOM_PTR]) - -# SRID routines -geos_get_srid = GEOSFuncFactory("GEOSGetSRID", argtypes=[GEOM_PTR], restype=c_int) -geos_set_srid = GEOSFuncFactory("GEOSSetSRID", argtypes=[GEOM_PTR, c_int]) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/io.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/io.py deleted file mode 100644 index efe9ec1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/io.py +++ /dev/null @@ -1,369 +0,0 @@ -import threading -from ctypes import POINTER, Structure, byref, c_byte, c_char_p, c_int, c_size_t - -from django.contrib.gis.geos.base import GEOSBase -from django.contrib.gis.geos.libgeos import ( - GEOM_PTR, - GEOSFuncFactory, - geos_version_tuple, -) -from django.contrib.gis.geos.prototypes.errcheck import ( - check_geom, - check_sized_string, - check_string, -) -from django.contrib.gis.geos.prototypes.geom import c_uchar_p, geos_char_p -from django.utils.encoding import force_bytes -from django.utils.functional import SimpleLazyObject - - -# ### The WKB/WKT Reader/Writer structures and pointers ### -class WKTReader_st(Structure): - pass - - -class WKTWriter_st(Structure): - pass - - -class WKBReader_st(Structure): - pass - - -class WKBWriter_st(Structure): - pass - - -WKT_READ_PTR = POINTER(WKTReader_st) -WKT_WRITE_PTR = POINTER(WKTWriter_st) -WKB_READ_PTR = POINTER(WKBReader_st) -WKB_WRITE_PTR = POINTER(WKBReader_st) - -# WKTReader routines -wkt_reader_create = GEOSFuncFactory("GEOSWKTReader_create", restype=WKT_READ_PTR) -wkt_reader_destroy = GEOSFuncFactory("GEOSWKTReader_destroy", argtypes=[WKT_READ_PTR]) - -wkt_reader_read = GEOSFuncFactory( - "GEOSWKTReader_read", - argtypes=[WKT_READ_PTR, c_char_p], - restype=GEOM_PTR, - errcheck=check_geom, -) -# WKTWriter routines -wkt_writer_create = GEOSFuncFactory("GEOSWKTWriter_create", restype=WKT_WRITE_PTR) -wkt_writer_destroy = GEOSFuncFactory("GEOSWKTWriter_destroy", argtypes=[WKT_WRITE_PTR]) - -wkt_writer_write = GEOSFuncFactory( - "GEOSWKTWriter_write", - argtypes=[WKT_WRITE_PTR, GEOM_PTR], - restype=geos_char_p, - errcheck=check_string, -) - -wkt_writer_get_outdim = GEOSFuncFactory( - "GEOSWKTWriter_getOutputDimension", argtypes=[WKT_WRITE_PTR], restype=c_int -) -wkt_writer_set_outdim = GEOSFuncFactory( - "GEOSWKTWriter_setOutputDimension", argtypes=[WKT_WRITE_PTR, c_int] -) - -wkt_writer_set_trim = GEOSFuncFactory( - "GEOSWKTWriter_setTrim", argtypes=[WKT_WRITE_PTR, c_byte] -) -wkt_writer_set_precision = GEOSFuncFactory( - "GEOSWKTWriter_setRoundingPrecision", argtypes=[WKT_WRITE_PTR, c_int] -) - -# WKBReader routines -wkb_reader_create = GEOSFuncFactory("GEOSWKBReader_create", restype=WKB_READ_PTR) -wkb_reader_destroy = GEOSFuncFactory("GEOSWKBReader_destroy", argtypes=[WKB_READ_PTR]) - - -class WKBReadFunc(GEOSFuncFactory): - # Although the function definitions take `const unsigned char *` - # as their parameter, we use c_char_p here so the function may - # take Python strings directly as parameters. Inside Python there - # is not a difference between signed and unsigned characters, so - # it is not a problem. - argtypes = [WKB_READ_PTR, c_char_p, c_size_t] - restype = GEOM_PTR - errcheck = staticmethod(check_geom) - - -wkb_reader_read = WKBReadFunc("GEOSWKBReader_read") -wkb_reader_read_hex = WKBReadFunc("GEOSWKBReader_readHEX") - -# WKBWriter routines -wkb_writer_create = GEOSFuncFactory("GEOSWKBWriter_create", restype=WKB_WRITE_PTR) -wkb_writer_destroy = GEOSFuncFactory("GEOSWKBWriter_destroy", argtypes=[WKB_WRITE_PTR]) - - -# WKB Writing prototypes. -class WKBWriteFunc(GEOSFuncFactory): - argtypes = [WKB_WRITE_PTR, GEOM_PTR, POINTER(c_size_t)] - restype = c_uchar_p - errcheck = staticmethod(check_sized_string) - - -wkb_writer_write = WKBWriteFunc("GEOSWKBWriter_write") -wkb_writer_write_hex = WKBWriteFunc("GEOSWKBWriter_writeHEX") - - -# WKBWriter property getter/setter prototypes. -class WKBWriterGet(GEOSFuncFactory): - argtypes = [WKB_WRITE_PTR] - restype = c_int - - -class WKBWriterSet(GEOSFuncFactory): - argtypes = [WKB_WRITE_PTR, c_int] - - -wkb_writer_get_byteorder = WKBWriterGet("GEOSWKBWriter_getByteOrder") -wkb_writer_set_byteorder = WKBWriterSet("GEOSWKBWriter_setByteOrder") -wkb_writer_get_outdim = WKBWriterGet("GEOSWKBWriter_getOutputDimension") -wkb_writer_set_outdim = WKBWriterSet("GEOSWKBWriter_setOutputDimension") -wkb_writer_get_include_srid = WKBWriterGet( - "GEOSWKBWriter_getIncludeSRID", restype=c_byte -) -wkb_writer_set_include_srid = WKBWriterSet( - "GEOSWKBWriter_setIncludeSRID", argtypes=[WKB_WRITE_PTR, c_byte] -) - - -# ### Base I/O Class ### -class IOBase(GEOSBase): - "Base class for GEOS I/O objects." - - def __init__(self): - # Getting the pointer with the constructor. - self.ptr = self._constructor() - # Loading the real destructor function at this point as doing it in - # __del__ is too late (import error). - self.destructor.func - - -# ### Base WKB/WKT Reading and Writing objects ### - - -# Non-public WKB/WKT reader classes for internal use because -# their `read` methods return _pointers_ instead of GEOSGeometry -# objects. -class _WKTReader(IOBase): - _constructor = wkt_reader_create - ptr_type = WKT_READ_PTR - destructor = wkt_reader_destroy - - def read(self, wkt): - if not isinstance(wkt, (bytes, str)): - raise TypeError - return wkt_reader_read(self.ptr, force_bytes(wkt)) - - -class _WKBReader(IOBase): - _constructor = wkb_reader_create - ptr_type = WKB_READ_PTR - destructor = wkb_reader_destroy - - def read(self, wkb): - "Return a _pointer_ to C GEOS Geometry object from the given WKB." - if isinstance(wkb, memoryview): - wkb_s = bytes(wkb) - return wkb_reader_read(self.ptr, wkb_s, len(wkb_s)) - elif isinstance(wkb, bytes): - return wkb_reader_read_hex(self.ptr, wkb, len(wkb)) - elif isinstance(wkb, str): - wkb_s = wkb.encode() - return wkb_reader_read_hex(self.ptr, wkb_s, len(wkb_s)) - else: - raise TypeError - - -def default_trim_value(): - """ - GEOS changed the default value in 3.12.0. Can be replaced by True when - 3.12.0 becomes the minimum supported version. - """ - return geos_version_tuple() >= (3, 12) - - -DEFAULT_TRIM_VALUE = SimpleLazyObject(default_trim_value) - - -# ### WKB/WKT Writer Classes ### -class WKTWriter(IOBase): - _constructor = wkt_writer_create - ptr_type = WKT_WRITE_PTR - destructor = wkt_writer_destroy - _precision = None - - def __init__(self, dim=2, trim=False, precision=None): - super().__init__() - self._trim = DEFAULT_TRIM_VALUE - self.trim = trim - if precision is not None: - self.precision = precision - self.outdim = dim - - def write(self, geom): - "Return the WKT representation of the given geometry." - return wkt_writer_write(self.ptr, geom.ptr) - - @property - def outdim(self): - return wkt_writer_get_outdim(self.ptr) - - @outdim.setter - def outdim(self, new_dim): - if new_dim not in (2, 3): - raise ValueError("WKT output dimension must be 2 or 3") - wkt_writer_set_outdim(self.ptr, new_dim) - - @property - def trim(self): - return self._trim - - @trim.setter - def trim(self, flag): - if bool(flag) != self._trim: - self._trim = bool(flag) - wkt_writer_set_trim(self.ptr, self._trim) - - @property - def precision(self): - return self._precision - - @precision.setter - def precision(self, precision): - if (not isinstance(precision, int) or precision < 0) and precision is not None: - raise AttributeError( - "WKT output rounding precision must be non-negative integer or None." - ) - if precision != self._precision: - self._precision = precision - wkt_writer_set_precision(self.ptr, -1 if precision is None else precision) - - -class WKBWriter(IOBase): - _constructor = wkb_writer_create - ptr_type = WKB_WRITE_PTR - destructor = wkb_writer_destroy - geos_version = geos_version_tuple() - - def __init__(self, dim=2): - super().__init__() - self.outdim = dim - - def _handle_empty_point(self, geom): - from django.contrib.gis.geos import Point - - if isinstance(geom, Point) and geom.empty: - if self.srid: - # PostGIS uses POINT(NaN NaN) for WKB representation of empty - # points. Use it for EWKB as it's a PostGIS specific format. - # https://trac.osgeo.org/postgis/ticket/3181 - geom = Point(float("NaN"), float("NaN"), srid=geom.srid) - else: - raise ValueError("Empty point is not representable in WKB.") - return geom - - def write(self, geom): - "Return the WKB representation of the given geometry." - geom = self._handle_empty_point(geom) - wkb = wkb_writer_write(self.ptr, geom.ptr, byref(c_size_t())) - return memoryview(wkb) - - def write_hex(self, geom): - "Return the HEXEWKB representation of the given geometry." - geom = self._handle_empty_point(geom) - wkb = wkb_writer_write_hex(self.ptr, geom.ptr, byref(c_size_t())) - return wkb - - # ### WKBWriter Properties ### - - # Property for getting/setting the byteorder. - def _get_byteorder(self): - return wkb_writer_get_byteorder(self.ptr) - - def _set_byteorder(self, order): - if order not in (0, 1): - raise ValueError( - "Byte order parameter must be 0 (Big Endian) or 1 (Little Endian)." - ) - wkb_writer_set_byteorder(self.ptr, order) - - byteorder = property(_get_byteorder, _set_byteorder) - - # Property for getting/setting the output dimension. - @property - def outdim(self): - return wkb_writer_get_outdim(self.ptr) - - @outdim.setter - def outdim(self, new_dim): - if new_dim not in (2, 3): - raise ValueError("WKB output dimension must be 2 or 3") - wkb_writer_set_outdim(self.ptr, new_dim) - - # Property for getting/setting the include srid flag. - @property - def srid(self): - return bool(wkb_writer_get_include_srid(self.ptr)) - - @srid.setter - def srid(self, include): - wkb_writer_set_include_srid(self.ptr, bool(include)) - - -# `ThreadLocalIO` object holds instances of the WKT and WKB reader/writer -# objects that are local to the thread. The `GEOSGeometry` internals -# access these instances by calling the module-level functions, defined -# below. -class ThreadLocalIO(threading.local): - wkt_r = None - wkt_w = None - wkb_r = None - wkb_w = None - ewkb_w = None - - -thread_context = ThreadLocalIO() - - -# These module-level routines return the I/O object that is local to the -# thread. If the I/O object does not exist yet it will be initialized. -def wkt_r(): - thread_context.wkt_r = thread_context.wkt_r or _WKTReader() - return thread_context.wkt_r - - -def wkt_w(dim=2, trim=False, precision=None): - if not thread_context.wkt_w: - thread_context.wkt_w = WKTWriter(dim=dim, trim=trim, precision=precision) - else: - thread_context.wkt_w.outdim = dim - thread_context.wkt_w.trim = trim - thread_context.wkt_w.precision = precision - return thread_context.wkt_w - - -def wkb_r(): - thread_context.wkb_r = thread_context.wkb_r or _WKBReader() - return thread_context.wkb_r - - -def wkb_w(dim=2): - if not thread_context.wkb_w: - thread_context.wkb_w = WKBWriter(dim=dim) - else: - thread_context.wkb_w.outdim = dim - return thread_context.wkb_w - - -def ewkb_w(dim=2): - if not thread_context.ewkb_w: - thread_context.ewkb_w = WKBWriter(dim=dim) - thread_context.ewkb_w.srid = True - else: - thread_context.ewkb_w.outdim = dim - return thread_context.ewkb_w diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/misc.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/misc.py deleted file mode 100644 index a591869..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/misc.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -This module is for the miscellaneous GEOS routines, particularly the -ones that return the area, distance, and length. -""" - -from ctypes import POINTER, c_double, c_int - -from django.contrib.gis.geos.libgeos import GEOM_PTR, GEOSFuncFactory -from django.contrib.gis.geos.prototypes.errcheck import check_dbl, check_string -from django.contrib.gis.geos.prototypes.geom import geos_char_p - -__all__ = ["geos_area", "geos_distance", "geos_length", "geos_isvalidreason"] - - -class DblFromGeom(GEOSFuncFactory): - """ - Argument is a Geometry, return type is double that is passed - in by reference as the last argument. - """ - - restype = c_int # Status code returned - errcheck = staticmethod(check_dbl) - - -# ### ctypes prototypes ### - -# Area, distance, and length prototypes. -geos_area = DblFromGeom("GEOSArea", argtypes=[GEOM_PTR, POINTER(c_double)]) -geos_distance = DblFromGeom( - "GEOSDistance", argtypes=[GEOM_PTR, GEOM_PTR, POINTER(c_double)] -) -geos_length = DblFromGeom("GEOSLength", argtypes=[GEOM_PTR, POINTER(c_double)]) -geos_isvalidreason = GEOSFuncFactory( - "GEOSisValidReason", restype=geos_char_p, errcheck=check_string, argtypes=[GEOM_PTR] -) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/predicates.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/predicates.py deleted file mode 100644 index 71cfd8d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/predicates.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -This module houses the GEOS ctypes prototype functions for the -unary and binary predicate operations on geometries. -""" - -from ctypes import c_byte, c_char_p, c_double - -from django.contrib.gis.geos.libgeos import GEOM_PTR, GEOSFuncFactory -from django.contrib.gis.geos.prototypes.errcheck import check_predicate - - -# ## Binary & unary predicate factories ## -class UnaryPredicate(GEOSFuncFactory): - "For GEOS unary predicate functions." - - argtypes = [GEOM_PTR] - restype = c_byte - errcheck = staticmethod(check_predicate) - - -class BinaryPredicate(UnaryPredicate): - "For GEOS binary predicate functions." - - argtypes = [GEOM_PTR, GEOM_PTR] - - -# ## Unary Predicates ## -geos_hasz = UnaryPredicate("GEOSHasZ") -geos_isclosed = UnaryPredicate("GEOSisClosed") -geos_isempty = UnaryPredicate("GEOSisEmpty") -geos_isring = UnaryPredicate("GEOSisRing") -geos_issimple = UnaryPredicate("GEOSisSimple") -geos_isvalid = UnaryPredicate("GEOSisValid") - -# ## Binary Predicates ## -geos_contains = BinaryPredicate("GEOSContains") -geos_covers = BinaryPredicate("GEOSCovers") -geos_crosses = BinaryPredicate("GEOSCrosses") -geos_disjoint = BinaryPredicate("GEOSDisjoint") -geos_equals = BinaryPredicate("GEOSEquals") -geos_equalsexact = BinaryPredicate( - "GEOSEqualsExact", argtypes=[GEOM_PTR, GEOM_PTR, c_double] -) -geos_equalsidentical = BinaryPredicate("GEOSEqualsIdentical") -geos_intersects = BinaryPredicate("GEOSIntersects") -geos_overlaps = BinaryPredicate("GEOSOverlaps") -geos_relatepattern = BinaryPredicate( - "GEOSRelatePattern", argtypes=[GEOM_PTR, GEOM_PTR, c_char_p] -) -geos_touches = BinaryPredicate("GEOSTouches") -geos_within = BinaryPredicate("GEOSWithin") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/prepared.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/prepared.py deleted file mode 100644 index 4fdfab3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/prepared.py +++ /dev/null @@ -1,26 +0,0 @@ -from ctypes import c_byte - -from django.contrib.gis.geos.libgeos import GEOM_PTR, PREPGEOM_PTR, GEOSFuncFactory -from django.contrib.gis.geos.prototypes.errcheck import check_predicate - -# Prepared geometry constructor and destructors. -geos_prepare = GEOSFuncFactory("GEOSPrepare", argtypes=[GEOM_PTR], restype=PREPGEOM_PTR) -prepared_destroy = GEOSFuncFactory("GEOSPreparedGeom_destroy", argtypes=[PREPGEOM_PTR]) - - -# Prepared geometry binary predicate support. -class PreparedPredicate(GEOSFuncFactory): - argtypes = [PREPGEOM_PTR, GEOM_PTR] - restype = c_byte - errcheck = staticmethod(check_predicate) - - -prepared_contains = PreparedPredicate("GEOSPreparedContains") -prepared_contains_properly = PreparedPredicate("GEOSPreparedContainsProperly") -prepared_covers = PreparedPredicate("GEOSPreparedCovers") -prepared_crosses = PreparedPredicate("GEOSPreparedCrosses") -prepared_disjoint = PreparedPredicate("GEOSPreparedDisjoint") -prepared_intersects = PreparedPredicate("GEOSPreparedIntersects") -prepared_overlaps = PreparedPredicate("GEOSPreparedOverlaps") -prepared_touches = PreparedPredicate("GEOSPreparedTouches") -prepared_within = PreparedPredicate("GEOSPreparedWithin") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/threadsafe.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/threadsafe.py deleted file mode 100644 index d4f7ffb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/threadsafe.py +++ /dev/null @@ -1,77 +0,0 @@ -import threading - -from django.contrib.gis.geos.base import GEOSBase -from django.contrib.gis.geos.libgeos import CONTEXT_PTR, error_h, lgeos, notice_h - - -class GEOSContextHandle(GEOSBase): - """Represent a GEOS context handle.""" - - ptr_type = CONTEXT_PTR - destructor = lgeos.finishGEOS_r - - def __init__(self): - # Initializing the context handler for this thread with - # the notice and error handler. - self.ptr = lgeos.initGEOS_r(notice_h, error_h) - - -# Defining a thread-local object and creating an instance -# to hold a reference to GEOSContextHandle for this thread. -class GEOSContext(threading.local): - handle = None - - -thread_context = GEOSContext() - - -class GEOSFunc: - """ - Serve as a wrapper for GEOS C Functions. Use thread-safe function - variants when available. - """ - - def __init__(self, func_name): - # GEOS thread-safe function signatures end with '_r' and take an - # additional context handle parameter. - self.cfunc = getattr(lgeos, func_name + "_r") - # Create a reference to thread_context so it's not garbage-collected - # before an attempt to call this object. - self.thread_context = thread_context - - def __call__(self, *args): - # Create a context handle if one doesn't exist for this thread. - self.thread_context.handle = self.thread_context.handle or GEOSContextHandle() - # Call the threaded GEOS routine with the pointer of the context handle - # as the first argument. - return self.cfunc(self.thread_context.handle.ptr, *args) - - def __str__(self): - return self.cfunc.__name__ - - # argtypes property - def _get_argtypes(self): - return self.cfunc.argtypes - - def _set_argtypes(self, argtypes): - self.cfunc.argtypes = [CONTEXT_PTR, *argtypes] - - argtypes = property(_get_argtypes, _set_argtypes) - - # restype property - def _get_restype(self): - return self.cfunc.restype - - def _set_restype(self, restype): - self.cfunc.restype = restype - - restype = property(_get_restype, _set_restype) - - # errcheck property - def _get_errcheck(self): - return self.cfunc.errcheck - - def _set_errcheck(self, errcheck): - self.cfunc.errcheck = errcheck - - errcheck = property(_get_errcheck, _set_errcheck) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/topology.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/topology.py deleted file mode 100644 index 541c954..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/geos/prototypes/topology.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -This module houses the GEOS ctypes prototype functions for the -topological operations on geometries. -""" - -from ctypes import c_double, c_int - -from django.contrib.gis.geos.libgeos import GEOM_PTR, GEOSFuncFactory -from django.contrib.gis.geos.prototypes.errcheck import ( - check_geom, - check_minus_one, - check_string, -) -from django.contrib.gis.geos.prototypes.geom import geos_char_p - - -class Topology(GEOSFuncFactory): - "For GEOS unary topology functions." - - argtypes = [GEOM_PTR] - restype = GEOM_PTR - errcheck = staticmethod(check_geom) - - -# Topology Routines -geos_boundary = Topology("GEOSBoundary") -geos_buffer = Topology("GEOSBuffer", argtypes=[GEOM_PTR, c_double, c_int]) -geos_bufferwithstyle = Topology( - "GEOSBufferWithStyle", argtypes=[GEOM_PTR, c_double, c_int, c_int, c_int, c_double] -) -geos_centroid = Topology("GEOSGetCentroid") -geos_convexhull = Topology("GEOSConvexHull") -geos_difference = Topology("GEOSDifference", argtypes=[GEOM_PTR, GEOM_PTR]) -geos_envelope = Topology("GEOSEnvelope") -geos_intersection = Topology("GEOSIntersection", argtypes=[GEOM_PTR, GEOM_PTR]) -geos_linemerge = Topology("GEOSLineMerge") -geos_pointonsurface = Topology("GEOSPointOnSurface") -geos_preservesimplify = Topology( - "GEOSTopologyPreserveSimplify", argtypes=[GEOM_PTR, c_double] -) -geos_simplify = Topology("GEOSSimplify", argtypes=[GEOM_PTR, c_double]) -geos_symdifference = Topology("GEOSSymDifference", argtypes=[GEOM_PTR, GEOM_PTR]) -geos_union = Topology("GEOSUnion", argtypes=[GEOM_PTR, GEOM_PTR]) - -geos_unary_union = GEOSFuncFactory( - "GEOSUnaryUnion", argtypes=[GEOM_PTR], restype=GEOM_PTR -) - -# GEOSRelate returns a string, not a geometry. -geos_relate = GEOSFuncFactory( - "GEOSRelate", - argtypes=[GEOM_PTR, GEOM_PTR], - restype=geos_char_p, - errcheck=check_string, -) - -# Linear referencing routines -geos_project = GEOSFuncFactory( - "GEOSProject", - argtypes=[GEOM_PTR, GEOM_PTR], - restype=c_double, - errcheck=check_minus_one, -) -geos_interpolate = Topology("GEOSInterpolate", argtypes=[GEOM_PTR, c_double]) - -geos_project_normalized = GEOSFuncFactory( - "GEOSProjectNormalized", - argtypes=[GEOM_PTR, GEOM_PTR], - restype=c_double, - errcheck=check_minus_one, -) -geos_interpolate_normalized = Topology( - "GEOSInterpolateNormalized", argtypes=[GEOM_PTR, c_double] -) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/af/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index 2a67e8f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/af/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index 83320bb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,82 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: F Wolff , 2023\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Die basis-GIS-veld" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index 083951f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index 092b5df..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2015-2016 -# Bashar Al-Abdulhadi, 2014 -# Eyad Toma , 2013 -# Jannis Leidel , 2011 -# Muaaz Alsaied, 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-04-02 11:32+0000\n" -"Last-Translator: Muaaz Alsaied\n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "GIS" -msgstr "نظم المعلومات الجغرافية GIS" - -msgid "The base GIS field." -msgstr "حقل نظم المعلومات الجغرافية الرئيسي" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "قاعدة حقل Geometry -- مُرتبط بنوع مواصفات OpenGIS الهندسية." - -msgid "Point" -msgstr "نقطة إحداثية" - -msgid "Line string" -msgstr "سطر تسلسل أحرف" - -msgid "Polygon" -msgstr "مُضلّع إحداثي" - -msgid "Multi-point" -msgstr "نقاط إحداثية" - -msgid "Multi-line string" -msgstr "تسلسل أحرف متعدد الأسطر" - -msgid "Multi polygon" -msgstr "مجموعة مُضلعات إحداثية" - -msgid "Geometry collection" -msgstr "مجموعة إحداثية" - -msgid "Extent Aggregate Field" -msgstr "حقل مجموع التحصيل" - -msgid "Raster Field" -msgstr "حقل خطوط المسح التسامتي" - -msgid "No geometry value provided." -msgstr "لم تُدخل أي أحداثيات." - -msgid "Invalid geometry value." -msgstr "الإحداثيات غير صحيحة." - -msgid "Invalid geometry type." -msgstr "نوع الإحداثيات غير صحيح." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "حدث خطأ أثناء تحويل geometry إلى حقل SRID." - -msgid "Delete all Features" -msgstr "حذف جميع المميزات" - -msgid "WKT debugging window:" -msgstr "نافذة تدقيق WKT:" - -msgid "Debugging window (serialized value)" -msgstr "نافذة التدقيق (قيمة تسلسلية)" - -msgid "No feeds are registered." -msgstr "لا موجز مسجّل" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r غير مسجّل." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar_DZ/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index 55a61ec..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar_DZ/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index c1d13f8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Riterix , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-14 22:46+0000\n" -"Last-Translator: Riterix \n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "GIS" -msgstr "نظم المعلومات الجغرافية GIS" - -msgid "The base GIS field." -msgstr "حقل نظم المعلومات الجغرافية الرئيسي" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"قاعدة الحقل الهندسي ترتكز لمواصفات نوع OpenGIS (نظم المعلومات الجغرافية " -"المفتوحة) الهندسية." - -msgid "Point" -msgstr "نقطة إحداثية" - -msgid "Line string" -msgstr "سطر تسلسل أحرف" - -msgid "Polygon" -msgstr "مُضلّع إحداثي" - -msgid "Multi-point" -msgstr "نقاط إحداثية" - -msgid "Multi-line string" -msgstr "تسلسل أحرف متعدد الأسطر" - -msgid "Multi polygon" -msgstr "مجموعة مُضلعات إحداثية" - -msgid "Geometry collection" -msgstr "مجموعة إحداثية" - -msgid "Extent Aggregate Field" -msgstr "حقل مجموع التحصيل\"" - -msgid "Raster Field" -msgstr "حقل خطوط المسح التسامتي" - -msgid "No geometry value provided." -msgstr "لم تُدخل أي أحداثيات." - -msgid "Invalid geometry value." -msgstr "الإحداثيات غير صحيحة." - -msgid "Invalid geometry type." -msgstr "نوع الإحداثيات غير صحيح." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "حدث خطأ أثناء تحويل geometry إلى حقل SRID." - -msgid "Delete all Features" -msgstr "حذف جميع المميزات" - -msgid "WKT debugging window:" -msgstr "نافذة تدقيق WKT:" - -msgid "Debugging window (serialized value)" -msgstr "نافذة التدقيق (قيمة تسلسلية)" - -msgid "No feeds are registered." -msgstr "لا موجز مسجّل" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r غير مسجّل" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ast/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index 4a347ba..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ast/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index cf0ea5b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,85 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 19:51+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Puntu" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "Polígonu" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Nun s'apurrió'l valor de xeometría." - -msgid "Invalid geometry value." -msgstr "Valor de xeometría inválidu." - -msgid "Invalid geometry type." -msgstr "Triba de xeometría inválida." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "Nun hai feeds rexistraos" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/az/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 265fec9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/az/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index 5525296..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Ismayilov , 2011 -# Emin Mastizada , 2018,2020 -# Nijat Mammadov, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-08-07 18:45+0000\n" -"Last-Translator: Nijat Mammadov, 2024\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Təməl GIS xanası." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Təməl Həndəsə sahəsi — OpenGIS Specification Geometry növünə işarətlənir." - -msgid "Point" -msgstr "Nöqtə" - -msgid "Line string" -msgstr "Xətt" - -msgid "Polygon" -msgstr "Poliqon" - -msgid "Multi-point" -msgstr "Çox nöqtəli" - -msgid "Multi-line string" -msgstr "Xətlər" - -msgid "Multi polygon" -msgstr "Poliqonlar" - -msgid "Geometry collection" -msgstr "Fiqurlar çoxluğu" - -msgid "Extent Aggregate Field" -msgstr "Aqreqat Sahəsini Genişləndir" - -msgid "Raster Field" -msgstr "Rastr Sahəsi" - -msgid "No geometry value provided." -msgstr "Həndəsi qiyməti verilməyib." - -msgid "Invalid geometry value." -msgstr "Həndəsi qiyməti düzgün deyil." - -msgid "Invalid geometry type." -msgstr "Həndəsi tipi düzgün deyil." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Fiquru vərəqənin fiqur sahəsinin SRID qiymətinə çevirərkən xəta baş verdi." - -msgid "Delete all Features" -msgstr "Bütün Xüsusiyyətləri sil" - -msgid "Debugging window (serialized value)" -msgstr "Sazlama pəncərəsi (seriallaşdırılmış dəyər)" - -msgid "No feeds are registered." -msgstr "Qeyd edilmiş axın yoxdur." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "%r qısaltması qeyd edilməyib." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/be/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index 4773ef6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/be/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index 2886c34..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2014-2015 -# znotdead , 2016,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: znotdead , 2016,2019\n" -"Language-Team: Belarusian (http://app.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "GIS" -msgstr "ГІС" - -msgid "The base GIS field." -msgstr "Галоўнае поле ГІС." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Галоўнае геаметрычнае поле — адлюстроўвае геамэтрычныя віды паводле " -"спэцыфікацыі «OpenGIS»." - -msgid "Point" -msgstr "Пункт" - -msgid "Line string" -msgstr "Ломаная" - -msgid "Polygon" -msgstr "Шматкутнік" - -msgid "Multi-point" -msgstr "Набор пунктаў" - -msgid "Multi-line string" -msgstr "Набор ломаных" - -msgid "Multi polygon" -msgstr "Набор шматкутнікаў" - -msgid "Geometry collection" -msgstr "Набор ґеамэтрычных аб’ектаў" - -msgid "Extent Aggregate Field" -msgstr "Поле аб'яднанай плошчы" - -msgid "Raster Field" -msgstr "Растравае поле" - -msgid "No geometry value provided." -msgstr "Не пазначылі значэньне ґеамэтрыі." - -msgid "Invalid geometry value." -msgstr "Хібнае значэньне ґеамэтрыі." - -msgid "Invalid geometry type." -msgstr "Хібны від ґеамэтрыі." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Не ўдалося ператварыць ґеамэтрыю ў SRID." - -msgid "Delete all Features" -msgstr "Выдаліць усе аб’екты" - -msgid "Debugging window (serialized value)" -msgstr "Акно адладкі (сэрыялізаванае значэньне)" - -msgid "No feeds are registered." -msgstr "Няма запісаных стужак." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Біркі %r няма ў запісаных." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index fded0fd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index 4775661..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Georgi Kostadinov , 2012 -# Todor Lubenov , 2016,2020 -# Todor Lubenov , 2011,2015,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Todor Lubenov , 2011,2015,2021\n" -"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Базово ГИС поле." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Базово Геометричнно поле — карти от OpenGIS Specification Geometry тип." - -msgid "Point" -msgstr "Точка" - -msgid "Line string" -msgstr "Линеен елемент" - -msgid "Polygon" -msgstr "Полигон" - -msgid "Multi-point" -msgstr "Комплексна-точка" - -msgid "Multi-line string" -msgstr "Комплексен-линеен елемент" - -msgid "Multi polygon" -msgstr "Комплексен полигон" - -msgid "Geometry collection" -msgstr "Геометрична колекция" - -msgid "Extent Aggregate Field" -msgstr "Разшири Полето за обединяване" - -msgid "Raster Field" -msgstr "Растерно Поле" - -msgid "No geometry value provided." -msgstr "Няма предоставена геометрична стойност." - -msgid "Invalid geometry value." -msgstr "Невалидна геометрична стойност." - -msgid "Invalid geometry type." -msgstr "Невалиден геометричен тип." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Възникна грешка при трансформиране на геометрията на SRID от полето " -"геометрия." - -msgid "Delete all Features" -msgstr "Изтрий всички обекти" - -msgid "Debugging window (serialized value)" -msgstr "Debugging прозорец (сериализирана стойност)" - -msgid "No feeds are registered." -msgstr "Няма регистрирани фийда." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r не е регистриран." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index 1168ac4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index 037e7d9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Tahmid Rafi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "জিআইএস" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "বিন্দু" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "বহুভুজ" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "কোন জ্যামিতিক মান দেয়া হয়নি।" - -msgid "Invalid geometry value." -msgstr "জ্যামিতিক মানটি বৈধ নয়।" - -msgid "Invalid geometry type." -msgstr "জ্যামিতিক নমুনাটি বৈধ নয়।" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "%r স্লাগটি রেজিস্টারকৃত নয়।" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/br/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index 0829bd0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/br/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index d29da14..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fulup , 2012 -# Irriep Nala Novram , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2019-03-12 14:10+0000\n" -"Last-Translator: Irriep Nala Novram \n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Pik" - -msgid "Line string" -msgstr "Chadenn segmant" - -msgid "Polygon" -msgstr "Poligon" - -msgid "Multi-point" -msgstr "Liespik" - -msgid "Multi-line string" -msgstr "Lies chadenn segmant" - -msgid "Multi polygon" -msgstr "Liespoligon" - -msgid "Geometry collection" -msgstr "Dastumad mentoniezh" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Talvoudegezh mentoniezh roet ebet." - -msgid "Invalid geometry value." -msgstr "Talvoudegezh mentoniezh direizh." - -msgid "Invalid geometry type." -msgstr "Doare mentoniezh direizh." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Ur fazi a zo c'hoarvezet da vare treuzfurmadur an objed mentoniezhel e-barzh " -"ar vaezienn stumm mentoniezhel SRID." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "Neket enrollet ar \"slug\" %r." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index df48c3d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index e6a8de2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Tačka" - -msgid "Line string" -msgstr "Linijska nit" - -msgid "Polygon" -msgstr "Poligon" - -msgid "Multi-point" -msgstr "Multi-point" - -msgid "Multi-line string" -msgstr "Višelinijska nit" - -msgid "Multi polygon" -msgstr "Multi poligon" - -msgid "Geometry collection" -msgstr "Geometrijska kolekcija" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Niste zadali parametre za geometriju." - -msgid "Invalid geometry value." -msgstr "Neispravan parametar za geometriju." - -msgid "Invalid geometry type." -msgstr "Nepostojeći tip geometrije." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Došlo je do greške tokom pretvaranje geometrije u SRID geometrijskom polja " -"obrazca." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ca/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 5eca653..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ca/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index 8406866..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2012,2015 -# Carles Barrobés , 2012,2014 -# duub qnnp, 2015 -# Jannis Leidel , 2011 -# Manel Clos , 2020 -# Roger Pons , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Manel Clos , 2020\n" -"Language-Team: Catalan (http://app.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "El camp base de GIS" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"El camp base Geometry -- correspon al tipus Geometry de l'especificació " -"OpenGIS." - -msgid "Point" -msgstr "Punt" - -msgid "Line string" -msgstr "Cadena de línies" - -msgid "Polygon" -msgstr "Polígon" - -msgid "Multi-point" -msgstr "Multi-punt" - -msgid "Multi-line string" -msgstr "Cadena de multi-línies" - -msgid "Multi polygon" -msgstr "Multi polígon" - -msgid "Geometry collection" -msgstr "Col·leció de geometria" - -msgid "Extent Aggregate Field" -msgstr "Estén camp agregat" - -msgid "Raster Field" -msgstr "Camp de mapa de bits" - -msgid "No geometry value provided." -msgstr "No s'ha indicat cap valor de geometria." - -msgid "Invalid geometry value." -msgstr "Valor de geometria invàlid." - -msgid "Invalid geometry type." -msgstr "Tipus de geometria invàlid." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"S'ha produït un error en transformar la geometria al SRID del camp de " -"geometria del formulari." - -msgid "Delete all Features" -msgstr "Elimina totes les característiques" - -msgid "Debugging window (serialized value)" -msgstr "Finestra de depuració (valor serialitzat)" - -msgid "No feeds are registered." -msgstr "No s'han registrat canal de contingut" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "El 'slug' %r no està registrat" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ckb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index 912945f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ckb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index 2d7b7e3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# kosar tofiq , 2020 -# Swara , 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Swara , 2022\n" -"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "خانەی بنەڕەتی GIS." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"خانەی بنەڕەتی ئەندازەیی - نەخشەکان بۆ جۆری تایبەتمەندیە ئەندازەییەکانی " -"OpenGIS." - -msgid "Point" -msgstr "خاڵ" - -msgid "Line string" -msgstr "هێڵی ڕیزبه‌ند" - -msgid "Polygon" -msgstr "فرەگۆشە" - -msgid "Multi-point" -msgstr "فرەخاڵ" - -msgid "Multi-line string" -msgstr "ڕیزبەندی فرەهێڵ" - -msgid "Multi polygon" -msgstr "فرەگۆشە" - -msgid "Geometry collection" -msgstr "کۆکراوەی ئەندازەیی" - -msgid "Extent Aggregate Field" -msgstr "خانەی کۆکراوەی فراوان" - -msgid "Raster Field" -msgstr "خانەی ڕاستەر" - -msgid "No geometry value provided." -msgstr "هیچ بەهایەکی ئەندازەیی دابیننەکراوە." - -msgid "Invalid geometry value." -msgstr "بەهای ئەندازەیی نادروستە." - -msgid "Invalid geometry type." -msgstr "جۆری ئەندازەیی نادروستە." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"هەڵەیەک ڕوویدا لە کاتی گۆڕینی ئەندازەییەکە بۆ SRID ی خانەی فۆڕمی ئەندازەیی." - -msgid "Delete all Features" -msgstr "سڕینەوەی هەموو تایبتمەندیەکان" - -msgid "Debugging window (serialized value)" -msgstr "پەنجەرەی هەڵەدۆزینەوە (بەهای زنجیرەیی)" - -msgid "No feeds are registered." -msgstr "هیچ پێدانێک تۆمارنەکراوە." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "سلەگی %r تۆمارنەکراوە." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index cc89d69..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index b22d732..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vláďa Macek , 2012,2014 -# Vláďa Macek , 2015,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Vláďa Macek , 2015,2019\n" -"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Základní pole GIS" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Základní geometrické datové pole — mapuje se na typ OpenGIS Specification " -"Geometry." - -msgid "Point" -msgstr "Bod" - -msgid "Line string" -msgstr "Úsek čáry" - -msgid "Polygon" -msgstr "Polygon" - -msgid "Multi-point" -msgstr "Mnohonásobný bod" - -msgid "Multi-line string" -msgstr "Mnohonásobný úsek čáry" - -msgid "Multi polygon" -msgstr "Mnohonásobný polygon" - -msgid "Geometry collection" -msgstr "Kolekce geometrií" - -msgid "Extent Aggregate Field" -msgstr "Pole Extent Aggregate" - -msgid "Raster Field" -msgstr "Pole Raster" - -msgid "No geometry value provided." -msgstr "Hodnota geometrie nezadána." - -msgid "Invalid geometry value." -msgstr "Neplatná hodnota geometrie." - -msgid "Invalid geometry type." -msgstr "Neplatný typ geometrie." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Nastala chyba při transformaci geometrie na identifikátor SRID geometrického " -"formulářového pole." - -msgid "Delete all Features" -msgstr "Odstranit všechny vlastnosti" - -msgid "Debugging window (serialized value)" -msgstr "Ladicí okno (serializovaná hodnota)" - -msgid "No feeds are registered." -msgstr "Žádné dávky nejsou registrované." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Identifikátor %r není registrován." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index 50cd7c4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index a12d85f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Maredudd ap Gwyndaf , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 19:51+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Pwynt" - -msgid "Line string" -msgstr "Llinyn llinell" - -msgid "Polygon" -msgstr "Polygon" - -msgid "Multi-point" -msgstr "Aml-bwynt" - -msgid "Multi-line string" -msgstr "Llinyn aml-linell" - -msgid "Multi polygon" -msgstr "Aml-bolygon" - -msgid "Geometry collection" -msgstr "Casgliad geometreg" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Ni ddarparwyd gwerth geometreg" - -msgid "Invalid geometry value." -msgstr "Gwerth geometreg annilys" - -msgid "Invalid geometry type." -msgstr "Math geometreg annilys" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Roedd gwall tra'n trawsnewid y geometreg i SRID y maes ffurflen geometreg." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "Does dim un llif wedi ei gofrestru." - -#, python-format -msgid "Slug %r isn't registered." -msgstr "Malwen %r heb ei gofrestru." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/da/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index a489e6f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/da/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index 4e1999c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Erik Ramsgaard Wognsen , 2012,2014-2015,2019 -# Finn Gruwier Larsen, 2011 -# Jannis Leidel , 2011 -# Kristian Øllegaard , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Erik Ramsgaard Wognsen , " -"2012,2014-2015,2019\n" -"Language-Team: Danish (http://app.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Basis-GIS-feltet." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "Basisgeometrifeltet — mapper til OpenGIS Specification Geometry-typen." - -msgid "Point" -msgstr "Punkt" - -msgid "Line string" -msgstr "Linjesegment" - -msgid "Polygon" -msgstr "Polygon" - -msgid "Multi-point" -msgstr "Multipunkt" - -msgid "Multi-line string" -msgstr "Multilinjesegment" - -msgid "Multi polygon" -msgstr "Multipolygon" - -msgid "Geometry collection" -msgstr "Geometrisamling" - -msgid "Extent Aggregate Field" -msgstr "Extent Aggregate-felt" - -msgid "Raster Field" -msgstr "Raster-felt" - -msgid "No geometry value provided." -msgstr "Ingen værdi givet for geometri." - -msgid "Invalid geometry value." -msgstr "Ugyldig geometriværdi." - -msgid "Invalid geometry type." -msgstr "Ugyldig gemometritype." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Der opstod en fejl ved transformation af geometrien til formularfeltets SRID" - -msgid "Delete all Features" -msgstr "Slet alle Features" - -msgid "Debugging window (serialized value)" -msgstr "Fejlsøgninsvindue (serialiseret værdi)" - -msgid "No feeds are registered." -msgstr "Ingen feeds registrerede." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "\"Slug\" %r er ikke registreret." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/de/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index 166c1f0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/de/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 54b4b20..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2012 -# Jannis Leidel , 2011-2012,2014-2015,2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Jannis Leidel , " -"2011-2012,2014-2015,2020\n" -"Language-Team: German (http://app.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Das Basis-GIS-Feld." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Das Basis-GIS-Feld – verwendet den Geometrie-Typ der OpenGIS-Spezifikation." - -msgid "Point" -msgstr "Punkt" - -msgid "Line string" -msgstr "Linienzug" - -msgid "Polygon" -msgstr "Polygon" - -msgid "Multi-point" -msgstr "Mehrere Punkte" - -msgid "Multi-line string" -msgstr "Mehrere Linienzüge" - -msgid "Multi polygon" -msgstr "Mehrere Polygone" - -msgid "Geometry collection" -msgstr "Sammlung geometrischer Objekte" - -msgid "Extent Aggregate Field" -msgstr "Ausmaße-Aggregat-Feld" - -msgid "Raster Field" -msgstr "Raster-Feld" - -msgid "No geometry value provided." -msgstr "Kein geometrischer Wert gegeben." - -msgid "Invalid geometry value." -msgstr "Ungültiger geometrischer Wert." - -msgid "Invalid geometry type." -msgstr "Ungültiger geometrischer Typ." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Ein Fehler ist beim Umwandeln der Geometrie-Werte in die SRID des Geometrie-" -"Formularfeldes aufgetreten." - -msgid "Delete all Features" -msgstr "Alles löschen" - -msgid "Debugging window (serialized value)" -msgstr "Debugging-Fenster (serialisierter Wert)" - -msgid "No feeds are registered." -msgstr "Keine Feeds registriert." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Kürzel %r ist nicht registriert." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/dsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index d8372f6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/dsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index e3a8b17..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Michael Wolf , 2016,2020\n" -"Language-Team: Lower Sorbian (http://app.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Bazowe pólo GIS." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Bazowe geometrijowe pólo -- wužywa geometrijowy typ specifikacije OpenGIS." - -msgid "Point" -msgstr "Dypk" - -msgid "Line string" -msgstr "Cera" - -msgid "Polygon" -msgstr "Wjelerožk" - -msgid "Multi-point" -msgstr "Někotare dypki" - -msgid "Multi-line string" -msgstr "Někotare cery" - -msgid "Multi polygon" -msgstr "Někotare wjelerožki" - -msgid "Geometry collection" -msgstr "Geometrijowa zběrka" - -msgid "Extent Aggregate Field" -msgstr "Pólo „Extent Aggregate" - -msgid "Raster Field" -msgstr "Rasterowe pólo" - -msgid "No geometry value provided." -msgstr "Žedna geometrijowa gódnota pódana." - -msgid "Invalid geometry value." -msgstr "Njepłaśiwa geometrijowa gódnota." - -msgid "Invalid geometry type." -msgstr "Njepłaśiwy geometrijowy typ." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Zmólka jo se nastała, gaž geometrija jo se do SRID póla geometrijowego " -"formulara pśetwóriła." - -msgid "Delete all Features" -msgstr "Wšykne funkcije lašowaś" - -msgid "Debugging window (serialized value)" -msgstr "Wokno pytanja zmólkow (serializěrowana gódnota)" - -msgid "No feeds are registered." -msgstr "Žedne kanale njejsu zregistrěrowane." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Adresowe mě %r njejo zregistrěrowane." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/el/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index dcddabb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/el/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index 776107e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Anastasiadis Stavros , 2014 -# Dimitris Glezos , 2011 -# Elena Andreou , 2016 -# Fotis Athineos , 2021 -# Kostas Papadimitriou , 2012 -# Nick Mavrakis , 2016 -# Pãnoș , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Fotis Athineos , 2021\n" -"Language-Team: Greek (http://app.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr " Γεωγραφικά Συστήματα Πληροφορίας" - -msgid "The base GIS field." -msgstr "Το βασικό GIS πεδίο." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Το βασικό Γεωμετρικό πεδίο — αντιστοιχεί στον τύπο της Γεωμετρικής " -"Προδιαγραφής OpenGIS." - -msgid "Point" -msgstr "Σημείο" - -msgid "Line string" -msgstr "Γραμμή string" - -msgid "Polygon" -msgstr "Πολύγωνο" - -msgid "Multi-point" -msgstr "Πολλαπλό σημείο" - -msgid "Multi-line string" -msgstr "Multi-line string" - -msgid "Multi polygon" -msgstr "Πολλαπλό πολύγωνο" - -msgid "Geometry collection" -msgstr "Συλλογή γεωμετριών" - -msgid "Extent Aggregate Field" -msgstr "Πεδίο Extent Aggregate" - -msgid "Raster Field" -msgstr "Πεδίο Raster" - -msgid "No geometry value provided." -msgstr "Δε δόθηκε τιμή γεωμετρίας." - -msgid "Invalid geometry value." -msgstr "Άκυρη γεωμετρική τιμή." - -msgid "Invalid geometry type." -msgstr "Άκυρος γεωμετρικός τύπος." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Παρουσιάστηκε σφάλμα κατά τη μετατροπή της γεωμετρίας στο SRID του πεδίου " -"της φόρμας γεωμετρίας." - -msgid "Delete all Features" -msgstr "Διαγραφή όλων των αντικειμένων" - -msgid "Debugging window (serialized value)" -msgstr "Παράθυρο αποσφαλμάτωσης (σειριακή τιμή)" - -msgid "No feeds are registered." -msgstr "Δεν υπάρχουν εγγεγραμμένες ροές ειδήσεων." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Το slug %r δεν έχει καταχωρηθεί." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 08a7b68..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index c6e3d72..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,98 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: contrib/gis/apps.py:9 -msgid "GIS" -msgstr "" - -#: contrib/gis/db/models/fields.py:81 -msgid "The base GIS field." -msgstr "" - -#: contrib/gis/db/models/fields.py:233 -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" - -#: contrib/gis/db/models/fields.py:332 -msgid "Point" -msgstr "" - -#: contrib/gis/db/models/fields.py:339 -msgid "Line string" -msgstr "" - -#: contrib/gis/db/models/fields.py:346 -msgid "Polygon" -msgstr "" - -#: contrib/gis/db/models/fields.py:353 -msgid "Multi-point" -msgstr "" - -#: contrib/gis/db/models/fields.py:360 -msgid "Multi-line string" -msgstr "" - -#: contrib/gis/db/models/fields.py:367 -msgid "Multi polygon" -msgstr "" - -#: contrib/gis/db/models/fields.py:374 -msgid "Geometry collection" -msgstr "" - -#: contrib/gis/db/models/fields.py:380 -msgid "Extent Aggregate Field" -msgstr "" - -#: contrib/gis/db/models/fields.py:395 -msgid "Raster Field" -msgstr "" - -#: contrib/gis/forms/fields.py:21 -msgid "No geometry value provided." -msgstr "" - -#: contrib/gis/forms/fields.py:22 -msgid "Invalid geometry value." -msgstr "" - -#: contrib/gis/forms/fields.py:23 -msgid "Invalid geometry type." -msgstr "" - -#: contrib/gis/forms/fields.py:25 -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -#: contrib/gis/templates/gis/openlayers.html:6 -msgid "Delete all Features" -msgstr "" - -#: contrib/gis/templates/gis/openlayers.html:7 -msgid "Debugging window (serialized value)" -msgstr "" - -#: contrib/gis/views.py:8 -msgid "No feeds are registered." -msgstr "" - -#: contrib/gis/views.py:14 -#, python-format -msgid "Slug %r isn’t registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_AU/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index 49b5343..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_AU/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index d107919..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:35+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (Australia) (http://www.transifex.com/projects/p/" -"django/language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Google Maps via GeoDjango" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_GB/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index 0f30967..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_GB/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index 0fe8230..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# jon_atkinson , 2011 -# Ross Poulton , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Point" - -msgid "Line string" -msgstr "Line string" - -msgid "Polygon" -msgstr "Polygon" - -msgid "Multi-point" -msgstr "Multi-point" - -msgid "Multi-line string" -msgstr "Multi-line string" - -msgid "Multi polygon" -msgstr "Multi polygon" - -msgid "Geometry collection" -msgstr "Geometry collection" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "No geometry value provided." - -msgid "Invalid geometry value." -msgstr "Invalid geometry value." - -msgid "Invalid geometry type." -msgstr "Invalid geometry type." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "No feeds are registered." - -#, python-format -msgid "Slug %r isn't registered." -msgstr "Slug %r isn't registered." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eo/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index b96c9c2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eo/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index 16ef0c1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Batist D 🐍 , 2012 -# Batist D 🐍 , 2014-2015 -# Mariusz Felisiak , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Mariusz Felisiak , 2023\n" -"Language-Team: Esperanto (http://app.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "La baza GIS kampo." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "La baza Geometry kampo — korelas al la OpenGIS Specifa Geometrio tipo." - -msgid "Point" -msgstr "Punkto" - -msgid "Line string" -msgstr "Liniŝnuro" - -msgid "Polygon" -msgstr "Plurangulo" - -msgid "Multi-point" -msgstr "Multpunkto" - -msgid "Multi-line string" -msgstr "Multlinia ŝnuro" - -msgid "Multi polygon" -msgstr "Multplurangulo" - -msgid "Geometry collection" -msgstr "Geometriaro" - -msgid "Extent Aggregate Field" -msgstr "Etenda kunmetita kampo" - -msgid "Raster Field" -msgstr "Rastruma kampo" - -msgid "No geometry value provided." -msgstr "Neniu geometria valoro provizas." - -msgid "Invalid geometry value." -msgstr "Malvalida geometria valoro." - -msgid "Invalid geometry type." -msgstr "Malvalida geometria tipo." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Eraro okazis dum transformi la geometrion al la SRID de la geometria forma " -"kampo." - -msgid "Delete all Features" -msgstr "Forigi ĉiuj trajtoj" - -msgid "Debugging window (serialized value)" -msgstr "Elcimigita fenestro (seriigita valoro)" - -msgid "No feeds are registered." -msgstr "Neniu fluo estas registrita." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Ĵetonvorto %r ne estas registrita." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index c32e28c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index fa2c02d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2012,2015-2016,2019 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2015 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2020 -# Igor Támara , 2015 -# Jannis Leidel , 2011 -# Josue Naaman Nistal Guerra , 2014 -# Marc Garcia , 2011 -# Uriel Medina , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Uriel Medina , 2020\n" -"Language-Team: Spanish (http://app.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "El campo GIS base." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"El campo base Geometry — coincide con el tipo OpenGIS Specification Geometry." - -msgid "Point" -msgstr "Punto" - -msgid "Line string" -msgstr "Cadena de línea" - -msgid "Polygon" -msgstr "Polígono" - -msgid "Multi-point" -msgstr "Punto múltiple" - -msgid "Multi-line string" -msgstr "Cadena de línea múltiple" - -msgid "Multi polygon" -msgstr "Polígono múltiple" - -msgid "Geometry collection" -msgstr "Colección de \"Geometry\"" - -msgid "Extent Aggregate Field" -msgstr "Extensión de campo agregado" - -msgid "Raster Field" -msgstr "Campo Raster" - -msgid "No geometry value provided." -msgstr "No se indico ningún valor de geometría." - -msgid "Invalid geometry value." -msgstr "Valor de geometría inválido." - -msgid "Invalid geometry type." -msgstr "Tipo de geometría inválido." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Ocurrió un error al transformar la geometria al SRID de la geometria del " -"campo de formulario." - -msgid "Delete all Features" -msgstr "Borrar todos los elementos" - -msgid "Debugging window (serialized value)" -msgstr "Ventana de depuración (valores serializados)" - -msgid "No feeds are registered." -msgstr "No se han registrado canales de contenido." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "El slug %r no está registrado." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_AR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index 2dd6730..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_AR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 7853f22..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ramiro Morales, 2012,2014-2015,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Ramiro Morales, 2012,2014-2015,2019\n" -"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "SIG" - -msgid "The base GIS field." -msgstr "El campo GIS base" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"El campo Geometry base — corresponde al tipo Geometry de la especificación " -"OpenGIS." - -msgid "Point" -msgstr "Punto" - -msgid "Line string" -msgstr "Secuencia de líneas" - -msgid "Polygon" -msgstr "Polígono" - -msgid "Multi-point" -msgstr "Multi-punto" - -msgid "Multi-line string" -msgstr "Cadena multi-línea" - -msgid "Multi polygon" -msgstr "Multi polígono" - -msgid "Geometry collection" -msgstr "Colección de Geometry's" - -msgid "Extent Aggregate Field" -msgstr "Campo Extent Aggregate" - -msgid "Raster Field" -msgstr "Campo Raster" - -msgid "No geometry value provided." -msgstr "No se ha proporcionado un valor de geometría." - -msgid "Invalid geometry value." -msgstr "Valor de geometría no válido." - -msgid "Invalid geometry type." -msgstr "Tipo de geometría no válido." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Ha ocurrido un error mientras se transformaba la geometría al SRID del campo " -"de formulario de la misma." - -msgid "Delete all Features" -msgstr "Eliminar todas las Features" - -msgid "Debugging window (serialized value)" -msgstr "Ventana de depuración (valor serializado)" - -msgid "No feeds are registered." -msgstr "No se han registrado feeds." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "El slug %r no está registrado." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_CO/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index e1bba32..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_CO/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index 96f3d6d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2012,2015 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2015 -# Igor Támara , 2015 -# Jannis Leidel , 2011 -# Josue Naaman Nistal Guerra , 2014 -# Marc Garcia , 2011 -# Mariusz Felisiak , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Mariusz Felisiak , 2023\n" -"Language-Team: Spanish (Colombia) (http://app.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "El campo GIS base." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Punto" - -msgid "Line string" -msgstr "Cadena de línea" - -msgid "Polygon" -msgstr "Polígono" - -msgid "Multi-point" -msgstr "Punto múltiple" - -msgid "Multi-line string" -msgstr "Cadena de línea múltiple" - -msgid "Multi polygon" -msgstr "Polígono múltiple" - -msgid "Geometry collection" -msgstr "Colección de \"Geometry\"" - -msgid "Extent Aggregate Field" -msgstr "Extensión de campo agregado" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "No se indico ningún valor de geometría." - -msgid "Invalid geometry value." -msgstr "Valor de geometría inválido." - -msgid "Invalid geometry type." -msgstr "Tipo de geometría inválido." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Ocurrió un error al transformar la geometria al SRID de la geometria del " -"campo de formulario." - -msgid "Delete all Features" -msgstr "Borrar todos los elementos" - -msgid "Debugging window (serialized value)" -msgstr "Ventana de depuración (valores serializados)" - -msgid "No feeds are registered." -msgstr "No se han registrado canales de contenido." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "El slug %r no está registrado." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_MX/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index e0696d5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_MX/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index 85698c5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abraham Estrada, 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Punto" - -msgid "Line string" -msgstr "Secuencia de líneas" - -msgid "Polygon" -msgstr "Polígono" - -msgid "Multi-point" -msgstr "Multi-punto" - -msgid "Multi-line string" -msgstr "Cadena multi-línea" - -msgid "Multi polygon" -msgstr "Multi polígonos" - -msgid "Geometry collection" -msgstr "Colección de geometrías" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "No se ha proporcionado un valor de geometría." - -msgid "Invalid geometry value." -msgstr "Valor de geometría no válido." - -msgid "Invalid geometry type." -msgstr "Tipo de geometría no válido." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Ha ocurrido un error mientras se transformaba la geometría al SRID del campo " -"de formulario de la misma." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "No hay feeds registrados." - -#, python-format -msgid "Slug %r isn't registered." -msgstr "El slug %r no está registrado." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_VE/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index 23ec22d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_VE/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index 7d4117d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:35+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/" -"django/language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Google Maps via GeoDjango" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/et/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index f052b4c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/et/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index 5eeb1e3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# eallik , 2011 -# Jannis Leidel , 2011 -# Janno Liivak , 2013-2015 -# madisvain , 2011 -# Martin , 2015 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Ragnar Rebase , 2019\n" -"Language-Team: Estonian (http://app.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Baas GIS väli." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Baas Geomeetria väli -- ühildub OpenGIS Spetsifikatsiooni Geomeetria tüübiga." - -msgid "Point" -msgstr "Punkt" - -msgid "Line string" -msgstr "Üherea tekst" - -msgid "Polygon" -msgstr "Polügon" - -msgid "Multi-point" -msgstr "Multi-punkt" - -msgid "Multi-line string" -msgstr "Mitmerealine string" - -msgid "Multi polygon" -msgstr "Multi-polügon" - -msgid "Geometry collection" -msgstr "Geomeetriakogum" - -msgid "Extent Aggregate Field" -msgstr "Laiendi Agregeeritud Väli" - -msgid "Raster Field" -msgstr "Rastri Väli" - -msgid "No geometry value provided." -msgstr "Geomeetriline väärtus puudub." - -msgid "Invalid geometry value." -msgstr "Vigane geomeetriline väärtus." - -msgid "Invalid geometry type." -msgstr "Vigane geomeetriline tüüp." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Geomeetria teisendamisel geomeetria vormivälja SRID-ks tekkis viga." - -msgid "Delete all Features" -msgstr "Kustuta kõik Vahendid" - -msgid "Debugging window (serialized value)" -msgstr "Siluri aken (järjestikväärtus)" - -msgid "No feeds are registered." -msgstr "Ühtegi voogu pole registreeritud." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Nälk %r ei ole registeeritud." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index 9118c75..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index c45fe36..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aitzol Naberan , 2011-2012 -# Eneko Illarramendi , 2017 -# Urtzi Odriozola , 2017,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Urtzi Odriozola , 2017,2021\n" -"Language-Team: Basque (http://app.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Oinarrizko GIS eremua." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Oinarrizko Geometria eremua — OpenGIS zehaztapeneko Geomtry motarentzat mapak" - -msgid "Point" -msgstr "Puntua" - -msgid "Line string" -msgstr "Lerro string-a" - -msgid "Polygon" -msgstr "Poligonoa" - -msgid "Multi-point" -msgstr "Puntu anitz" - -msgid "Multi-line string" -msgstr "Lerro-anitzeko string-a" - -msgid "Multi polygon" -msgstr "Multi poligonoa" - -msgid "Geometry collection" -msgstr "Geometria bilduma" - -msgid "Extent Aggregate Field" -msgstr "Eremu agregatu hedatua" - -msgid "Raster Field" -msgstr "Raster eremua" - -msgid "No geometry value provided." -msgstr "Ez fa geometria baliorik eman." - -msgid "Invalid geometry value." -msgstr "Geometria balio okera." - -msgid "Invalid geometry type." -msgstr "Geometria mota okerra." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Errore bat gertatu da geometria bere form eremuaren SRIDra biurtzean." - -msgid "Delete all Features" -msgstr "Ezabatu ezaugarri guztiak" - -msgid "Debugging window (serialized value)" -msgstr "Arazketa leihoa (balio serializatua)" - -msgid "No feeds are registered." -msgstr "Ez dago jariorik erregistratuta." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "%r sluga ez dago erregistratuta." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index 51f9f5f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index 966ddad..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Nikneshan , 2012-2013,2020 -# Alireza Savand , 2013 -# Ali Vakilzade , 2015 -# Jannis Leidel , 2011 -# Pouya Abbassi, 2016 -# Saeed , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Ali Nikneshan , 2012-2013,2020\n" -"Language-Team: Persian (http://app.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "GIS" -msgstr "جی‌آی‌اس" - -msgid "The base GIS field." -msgstr "پایه‌ی سیستم اطلاعات جغرافیایی میدانی." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "پایه‌ی فیلد هندسی --نوع خاص هندسه‌ی نقشه‌ها‌ی نوع OpenGIS" - -msgid "Point" -msgstr "نقطه" - -msgid "Line string" -msgstr "رشته خط" - -msgid "Polygon" -msgstr "چندضلعی" - -msgid "Multi-point" -msgstr "چند نقطه ای" - -msgid "Multi-line string" -msgstr "چند خط رشته" - -msgid "Multi polygon" -msgstr "چندین چند ضلعی " - -msgid "Geometry collection" -msgstr "مجموعه هندسی" - -msgid "Extent Aggregate Field" -msgstr "تراکم وسعت حوزه‌ی " - -msgid "Raster Field" -msgstr "حوزه‌ی شطرنجی" - -msgid "No geometry value provided." -msgstr "مقدار جغرافیایی‌ای مقرر نشده است." - -msgid "Invalid geometry value." -msgstr "مقدار جغرافیایی نامعتبر" - -msgid "Invalid geometry type." -msgstr "نوعِ جغرافیایی نامعتبر" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "مشکلی در هنگام انتقال مختصات هندسی از فیلد به SRID رخ داد." - -msgid "Delete all Features" -msgstr "حذف همه‌ی اشیاء" - -msgid "Debugging window (serialized value)" -msgstr "پنجره‌ی اشکال زدایی (ارزش متوالی)" - -msgid "No feeds are registered." -msgstr "هیچ فیدی ثبت شده است." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r ثبت نشده" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index 180a3a2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index dc67108..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2020 -# Antti Kaihola , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Aarni Koskela, 2015,2020\n" -"Language-Team: Finnish (http://app.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "Paikkatietojärjestelmä" - -msgid "The base GIS field." -msgstr "GIS-peruskenttä." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "Geometriaperuskenttä – vastaa OpenGIS-määrittelyn geometriatyyppiä." - -msgid "Point" -msgstr "Piste" - -msgid "Line string" -msgstr "Murtoviiva" - -msgid "Polygon" -msgstr "Polygoni" - -msgid "Multi-point" -msgstr "Monipiste" - -msgid "Multi-line string" -msgstr "Monimurtoviiva" - -msgid "Multi polygon" -msgstr "Monipolygoni" - -msgid "Geometry collection" -msgstr "Geometriakokoelma" - -msgid "Extent Aggregate Field" -msgstr "Laajuusaggregaattikenttä" - -msgid "Raster Field" -msgstr "Rasterikenttä" - -msgid "No geometry value provided." -msgstr "Geometria-arvoa ei annettu." - -msgid "Invalid geometry value." -msgstr "Virheellinen geometria-arvo." - -msgid "Invalid geometry type." -msgstr "Virheellinen geometriatyyppi." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Kentän SRID-muunnoksessa tapahtui virhe." - -msgid "Delete all Features" -msgstr "Poista kaikki ominaisuudet" - -msgid "Debugging window (serialized value)" -msgstr "Debuggausikkuna (sarjoitettu arvo)" - -msgid "No feeds are registered." -msgstr "Syötteitä ei ole rekisteröity." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Lyhytnimeä %r ei ole rekisteröity." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index d1bff9f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index 6b9c044..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2014-2015,2017,2019 -# Claude Paroz , 2012 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Claude Paroz , 2014-2015,2017,2019\n" -"Language-Team: French (http://app.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "GIS" -msgstr "SIG" - -msgid "The base GIS field." -msgstr "Le champ SIG de base." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Le champ géométrique de base, correspond au type Geometry de la " -"spécification OpenGIS." - -msgid "Point" -msgstr "Point" - -msgid "Line string" -msgstr "Chaîne de segment" - -msgid "Polygon" -msgstr "Polygone" - -msgid "Multi-point" -msgstr "Multipoint" - -msgid "Multi-line string" -msgstr "Chaîne multisegment" - -msgid "Multi polygon" -msgstr "Multipolygone" - -msgid "Geometry collection" -msgstr "Collection géométrique" - -msgid "Extent Aggregate Field" -msgstr "Champ d’agrégation d’étendue" - -msgid "Raster Field" -msgstr "Champ matriciel" - -msgid "No geometry value provided." -msgstr "Aucune valeur géométrique fournie." - -msgid "Invalid geometry value." -msgstr "Valeur géométrique non valide." - -msgid "Invalid geometry type." -msgstr "Type de géométrie non valide." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Une erreur est survenue lors de la transformation de l’objet géométrique " -"dans le SRID du champ de formulaire géométrique." - -msgid "Delete all Features" -msgstr "Supprimer toutes les localisations" - -msgid "Debugging window (serialized value)" -msgstr "Fenêtre de débogage (valeur sérialisée)" - -msgid "No feeds are registered." -msgstr "Aucun flux enregistré." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Le slug %r n’est pas enregistré." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index 19b093b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index 9426d48..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:35+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Google Maps via GeoDjango" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ga/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index ea86255..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ga/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index 482e384..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Jannis Leidel , 2011 -# Michael Thornhill , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-10-07 18:45+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Réimse bonn GIS." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"An bonnréimse Céimseata — léarscáileanna chuig an gcineál Céimseata " -"Sonraíochta OpenGIS." - -msgid "Point" -msgstr "Pointe" - -msgid "Line string" -msgstr "Líne teaghrán" - -msgid "Polygon" -msgstr "Polagán" - -msgid "Multi-point" -msgstr "Il-phointe" - -msgid "Multi-line string" -msgstr "Il-líne teaghrán" - -msgid "Multi polygon" -msgstr "Il polagán" - -msgid "Geometry collection" -msgstr "Céimseata bhailiú" - -msgid "Extent Aggregate Field" -msgstr "Méid Réimse Comhiomlán" - -msgid "Raster Field" -msgstr "Réimse Raster" - -msgid "No geometry value provided." -msgstr "Ní soláthair méid geoiméadracht" - -msgid "Invalid geometry value." -msgstr "Méid geoiméadracht neamhbhailí" - -msgid "Invalid geometry type." -msgstr "Tíopa geoiméadracht neamhbhailí" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Tharla earráid ag claochlú an geoiméadracht go dtí SRID an réimse fhoirm " -"geoiméadracht." - -msgid "Delete all Features" -msgstr "Scrios na Gnéithe go léir" - -msgid "Debugging window (serialized value)" -msgstr "Fuinneog dífhabhtaithe (luach sraitheach)" - -msgid "No feeds are registered." -msgstr "Níl fothaí cláraithe." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Níl seilide %r cláraithe." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gd/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index 477fb2c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gd/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index fc2d14a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2015-2016 -# GunChleoc, 2015 -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: GunChleoc, 2015\n" -"Language-Team: Gaelic, Scottish (http://app.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Bun-raon GIS." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Bun-raon geomatrais – thèid a mhapachadh dhan t-seòrsa geomatrais a chaidh a " -"shònrachadh le OpenGIS." - -msgid "Point" -msgstr "Puing" - -msgid "Line string" -msgstr "Sreang loidhne" - -msgid "Polygon" -msgstr "Ioma-cheàrnach" - -msgid "Multi-point" -msgstr "Iomadh-phuing" - -msgid "Multi-line string" -msgstr "Sreang ioma-loidhne" - -msgid "Multi polygon" -msgstr "Iomadh ioma-cheàrnach" - -msgid "Geometry collection" -msgstr "Cruinneachadh geomatrais" - -msgid "Extent Aggregate Field" -msgstr "Raon agragaid a tha ann" - -msgid "Raster Field" -msgstr "Raon raster" - -msgid "No geometry value provided." -msgstr "Cha deach luach geomatrais a shònrachadh." - -msgid "Invalid geometry value." -msgstr "Luach geomatrais mì-dhligheach." - -msgid "Invalid geometry type." -msgstr "Seòrsa geomatrais mì-dhligheach." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Thachair mearachd le thar-mhùthadh a’ gheomatrais gun SRID aig raon foirme " -"a’ gheomatrais." - -msgid "Delete all Features" -msgstr "Sguab às a h-uile gleus" - -msgid "Debugging window (serialized value)" -msgstr "Uinneag dì-bhugachaidh (luach sreathaichte)" - -msgid "No feeds are registered." -msgstr "Cha deach inbhir a shònrachadh." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Cha deach an sluga %r a chlàradh." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index eddd528..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index af564c2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# fasouto , 2011 -# fonso , 2013 -# Leandro Regueiro , 2013 -# X Bello , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: X Bello , 2023\n" -"Language-Team: Galician (http://app.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "SIX" - -msgid "The base GIS field." -msgstr "O cambo básico de XIS." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"O cambo básico Geometry — correspónese co tipo Geometry da especificación " -"OpenGIS." - -msgid "Point" -msgstr "Punto" - -msgid "Line string" -msgstr "Secuencia de liñas" - -msgid "Polygon" -msgstr "Polígono" - -msgid "Multi-point" -msgstr "Punto múltiple" - -msgid "Multi-line string" -msgstr "Cadea multi-liña" - -msgid "Multi polygon" -msgstr "Multi polígono" - -msgid "Geometry collection" -msgstr "Colección de xeometrías" - -msgid "Extent Aggregate Field" -msgstr "Campo de Agregación de Extensión" - -msgid "Raster Field" -msgstr "Campo de Raster" - -msgid "No geometry value provided." -msgstr "Non se proporcionou un valor de xeometría." - -msgid "Invalid geometry value." -msgstr "Valor xeométrico non válido." - -msgid "Invalid geometry type." -msgstr "Tipo xeométrico non válido." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Atopouse un erro mentras se trasnformaba a xeometría ó SRID do campo " -"xeométrico do formulario." - -msgid "Delete all Features" -msgstr "Eliminar tódalas Propiedades" - -msgid "Debugging window (serialized value)" -msgstr "Ventá de depurado (valor serializado)" - -msgid "No feeds are registered." -msgstr "Non hai feeds rexistradas." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "O slug %r non está rexistrado." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/he/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index e479683..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/he/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index 489e8c4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,83 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Meir Kriheli , 2012,2014-2015,2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Meir Kriheli , 2012,2014-2015,2020\n" -"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -msgid "GIS" -msgstr "מערכת מידע גאוגרפית" - -msgid "The base GIS field." -msgstr "שדה GIS הבסיסי." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "שדה Geometry הבסיסי —ממופה לטיפוס OpenGIS Specification Geometry." - -msgid "Point" -msgstr "נקודה" - -msgid "Line string" -msgstr "מחרוזת קו" - -msgid "Polygon" -msgstr "פוליגון" - -msgid "Multi-point" -msgstr "מרובה־נקודות" - -msgid "Multi-line string" -msgstr "מחרוזת קו מרובת שורות" - -msgid "Multi polygon" -msgstr "פוליגון מרובה" - -msgid "Geometry collection" -msgstr "אוסף גיאומטרי" - -msgid "Extent Aggregate Field" -msgstr "שדה Extent Aggregate" - -msgid "Raster Field" -msgstr "שדה Raster" - -msgid "No geometry value provided." -msgstr "לא סופק ערך גיאומטרי." - -msgid "Invalid geometry value." -msgstr "ערך גאומטרי שגוי." - -msgid "Invalid geometry type." -msgstr "סוג גיאומטרי שגוי." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "הייתה בעיה עם השינוי של הצורה לסוג של השדה." - -msgid "Delete all Features" -msgstr "מחיקת כל התכונות" - -msgid "Debugging window (serialized value)" -msgstr "חלון ניפוי שגיאות (serialized value)" - -msgid "No feeds are registered." -msgstr "לא נרשמו פידים." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "ה־Slug %r אינו רשום." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index 8d267a5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index 7209a61..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chandan kumar , 2012 -# Sandeep Satavlekar , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "बिंदु" - -msgid "Line string" -msgstr "पंक्ति शृंखला" - -msgid "Polygon" -msgstr "बहुभुज" - -msgid "Multi-point" -msgstr "बहु बिंदु" - -msgid "Multi-line string" -msgstr "बहु - पंक्ति शृंखला" - -msgid "Multi polygon" -msgstr "बहु बहुभुज" - -msgid "Geometry collection" -msgstr "ज्यामिति संग्रह" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "कोई ज्यामिति मूल्य प्रदान नहीं की है." - -msgid "Invalid geometry value." -msgstr "अवैध ज्यामिति मूल्य." - -msgid "Invalid geometry type." -msgstr "अवैध ज्यामिति प्रकार" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"ज्यामिति को ज्यामिति प्रपत्र फ़ील्ड के SRID में परिवर्तित करते वक़्त एक ग़लती हो गयी ." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "कोई फ़ीड पंजीकृत नहीं हैं." - -#, python-format -msgid "Slug %r isn't registered." -msgstr "स्लग %r पंजीकृत नहीं है." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index f98a3be..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index 7c844b6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# berislavlopac , 2012 -# Davor Lučić , 2012 -# Filip Cuk , 2016 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Točka" - -msgid "Line string" -msgstr "Linija (Line string)" - -msgid "Polygon" -msgstr "Poligon" - -msgid "Multi-point" -msgstr "Više točaka" - -msgid "Multi-line string" -msgstr "Više linija (Line string)" - -msgid "Multi polygon" -msgstr "Više poligona" - -msgid "Geometry collection" -msgstr "Geometrijska kolekcija" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Geometrijska vrijednost nije priložena." - -msgid "Invalid geometry value." -msgstr "Neispravna geometrijska vrijednost." - -msgid "Invalid geometry type." -msgstr "Neispravan geometrijski tip." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Došlo je do greške pri transformaciji geometrije na SRID geometrijskog polja " -"forme." - -msgid "Delete all Features" -msgstr "Izbriši sve značajke" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "Nema registriranih izvora." - -#, python-format -msgid "Slug %r isn't registered." -msgstr "Slug %r nije registriran." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index b50e758..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index 66d0357..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Michael Wolf , 2016,2019\n" -"Language-Team: Upper Sorbian (http://app.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Bazowe polo GIS." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Bazowe geometrijowe polo -- zarysowane do geometrijoweho typa specifikacije " -"OpenGIS. " - -msgid "Point" -msgstr "Dypk" - -msgid "Line string" -msgstr "Čara" - -msgid "Polygon" -msgstr "Wjeleróžk" - -msgid "Multi-point" -msgstr "Wjacore dypki" - -msgid "Multi-line string" -msgstr "Wjacore čary" - -msgid "Multi polygon" -msgstr "Wjacore wjelróžki" - -msgid "Geometry collection" -msgstr "Geometrijowa zběrka" - -msgid "Extent Aggregate Field" -msgstr "Polo „extent aggregate“" - -msgid "Raster Field" -msgstr "Rasterowe polo" - -msgid "No geometry value provided." -msgstr "Žana geometrijowa hódnota podata." - -msgid "Invalid geometry value." -msgstr "Njepłaćiwa geometrijowa hódnota." - -msgid "Invalid geometry type." -msgstr "Njepłaćiwy geometrijowy typ." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Zmylk je wustupił, hdyž so geometrija do SRID pola geometrijoweho formulara " -"přetwori." - -msgid "Delete all Features" -msgstr "Wšě funkcije zhašeć" - -msgid "Debugging window (serialized value)" -msgstr "Wokno pytanja zmylkow (serijalizowana hódnota)" - -msgid "No feeds are registered." -msgstr "Žane kanale zregistrowane." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Adresowe mjeno %r njeje zregistrowane." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index ec2e8a2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index 9e7799e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# András Veres-Szentkirályi, 2016 -# Istvan Farkas , 2019 -# Jannis Leidel , 2011 -# Kristóf Gruber <>, 2012 -# Szilveszter Farkas , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Istvan Farkas , 2019\n" -"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Az alap GIS mező." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Az alap geometria mező - az OpenGIS Specification Geometry formátumnak " -"megfelelően." - -msgid "Point" -msgstr "Pont" - -msgid "Line string" -msgstr "Vonallánc" - -msgid "Polygon" -msgstr "Poligon" - -msgid "Multi-point" -msgstr "Multi-pont" - -msgid "Multi-line string" -msgstr "Többes vonallánc" - -msgid "Multi polygon" -msgstr "Multi-poligon" - -msgid "Geometry collection" -msgstr "Geometria gyűjtemény" - -msgid "Extent Aggregate Field" -msgstr "Terület összegző mező" - -msgid "Raster Field" -msgstr "Raszter mező" - -msgid "No geometry value provided." -msgstr "Geometriai adat nem került megadásra." - -msgid "Invalid geometry value." -msgstr "Érvénytelen geometriai érték." - -msgid "Invalid geometry type." -msgstr "Érvénytelen geometriai típus." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Hiba történt a geometriai transzformáció során." - -msgid "Delete all Features" -msgstr "Minden Feature törlése" - -msgid "Debugging window (serialized value)" -msgstr "Debug ablak (szerializált érték)" - -msgid "No feeds are registered." -msgstr "Nincs regisztrált feed." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "A(z) %r domain-darabka nincs regisztrálva." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index cecc0a9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index 21a69f7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,81 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Django team\n" -"Language-Team: Armenian (http://app.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "ԱՏՀ" - -msgid "The base GIS field." -msgstr "ԱՏՀ֊ի գլխավոր դաշտ" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Կետ" - -msgid "Line string" -msgstr "Թեք" - -msgid "Polygon" -msgstr "Բազմանկյուն" - -msgid "Multi-point" -msgstr "Կետերի հավաքածու" - -msgid "Multi-line string" -msgstr "Թեքերի հավաքածու" - -msgid "Multi polygon" -msgstr "Բազմանկյունների հավաքածու" - -msgid "Geometry collection" -msgstr "Երկրաչափական օբյեկտների հավաքածու" - -msgid "Extent Aggregate Field" -msgstr "Մակերեսի կամ ծավալի խմբավորման դաշտ" - -msgid "Raster Field" -msgstr "Պատկերացանցի դաշտ" - -msgid "No geometry value provided." -msgstr "Երկարաչափական արժեք չի տրամադրվել։" - -msgid "Invalid geometry value." -msgstr "Երկարաչափական օյբեկտի սխալ արժեք։" - -msgid "Invalid geometry type." -msgstr "Երկարաչափական օյբեկտի տիպ։" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Երկարաչափական օյբեկտի SRID ձևափոխելու ժամանակ առաջացել է սխալլ։" - -msgid "Delete all Features" -msgstr "Հեռացնել բոլոր օբյեկտները" - -msgid "Debugging window (serialized value)" -msgstr "Կարգաբերման պատուհան (սերիալիզացված արժեքներ)" - -msgid "No feeds are registered." -msgstr "Չկան գրանցված feed֊եր։" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index d0867b7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index cd08566..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2023 -# Martijn Dekker , 2012,2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Mariusz Felisiak , 2023\n" -"Language-Team: Interlingua (http://app.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "Le campo GIS de base." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Le campo Geometry de base. Corresponde al typo geometric del specification " -"OpenGIS." - -msgid "Point" -msgstr "Puncto" - -msgid "Line string" -msgstr "Texto de linea" - -msgid "Polygon" -msgstr "Polygono" - -msgid "Multi-point" -msgstr "Plure punctos" - -msgid "Multi-line string" -msgstr "Texto con plure lineas" - -msgid "Multi polygon" -msgstr "Plure polygonos" - -msgid "Geometry collection" -msgstr "Collection geometric" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Nulle valor geometric fornite." - -msgid "Invalid geometry value." -msgstr "Valor geometric invalide." - -msgid "Invalid geometry type." -msgstr "Typo geometric invalide." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Un error occurreva durante le transformation del geometria al SRID del campo " -"del formulario geometric." - -msgid "Delete all Features" -msgstr "Deler tote le elementos" - -msgid "Debugging window (serialized value)" -msgstr "Fenestra pro debugging (valor serialisate)" - -msgid "No feeds are registered." -msgstr "Nulle syndication es registrate." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Le denotation %r non es registrate." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/id/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index 03412db..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/id/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index 8907759..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fery Setiawan , 2016 -# Jannis Leidel , 2011 -# M Asep Indrayana , 2015 -# rodin , 2011-2012 -# rodin , 2015-2016 -# sag᠎e , 2019 -# Sutrisno Efendi , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: sag᠎e , 2019\n" -"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Bidang GIS dasar." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Bidang Geometri dasar — memetakan ke jenis OpenGIS Specification Geometry." - -msgid "Point" -msgstr "Point" - -msgid "Line string" -msgstr "Line string" - -msgid "Polygon" -msgstr "Polygon" - -msgid "Multi-point" -msgstr "Multi-point" - -msgid "Multi-line string" -msgstr "Multi-line string" - -msgid "Multi polygon" -msgstr "Multi polygon" - -msgid "Geometry collection" -msgstr "Geometry collection" - -msgid "Extent Aggregate Field" -msgstr "perpanjang Bidang Pengumpulan" - -msgid "Raster Field" -msgstr "Bidang Raster" - -msgid "No geometry value provided." -msgstr "Nilai geometri tidak disediakan." - -msgid "Invalid geometry value." -msgstr "Nilai geometri salah." - -msgid "Invalid geometry type." -msgstr "Tipe geometri salah." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Galat terjadi saat mentransformasi geometri ke SRID bidang formulir geometri." - -msgid "Delete all Features" -msgstr "Hapus semua Fitur" - -msgid "Debugging window (serialized value)" -msgstr "Jendela mencari dan memperbaiki kesalahan (nilai bersambung)" - -msgid "No feeds are registered." -msgstr "Tidak ada umpan terdaftar." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r tidak terdaftar." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/io/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index a5371ba..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/io/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index 97432bf..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:35+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/projects/p/django/language/" -"io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Google Maps via GeoDjango" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/is/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index 7f198ce..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/is/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index 0ea0986..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Hafsteinn Einarsson , 2011-2012 -# Jannis Leidel , 2011 -# Thordur Sigurdsson , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-20 05:37+0000\n" -"Last-Translator: Thordur Sigurdsson \n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "Grunn GIS reitur — varpast í OpenGIS rúmgerð." - -msgid "Point" -msgstr "Punktur" - -msgid "Line string" -msgstr "Lína" - -msgid "Polygon" -msgstr "Marghyrningur" - -msgid "Multi-point" -msgstr "Punktar" - -msgid "Multi-line string" -msgstr "Línur" - -msgid "Multi polygon" -msgstr "Marghyrningar" - -msgid "Geometry collection" -msgstr "Rúmsafn" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Ekkert rúmgildi gefið." - -msgid "Invalid geometry value." -msgstr "Ógild rúmeining" - -msgid "Invalid geometry type." -msgstr "Ógild rúmmálsgerð." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Villa kom upp við að varpa rúmgildi í SRID reitsins." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "Engir listar (feeds) eru skráðir" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/it/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index d454db4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/it/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index c86f18f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,94 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# yakky , 2015 -# Jannis Leidel , 2011 -# Marco Bonetti, 2014 -# Mirco Grillo , 2020 -# Nicola Larosa , 2012 -# palmux , 2015 -# Mattia Procopio , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-07-23 08:59+0000\n" -"Last-Translator: Mirco Grillo \n" -"Language-Team: Italian (http://www.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Il campo GIS base." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Il campo Geometry -- corrisponde al tipo Geometry delle specifiche OpenGIS." - -msgid "Point" -msgstr "Punto" - -msgid "Line string" -msgstr "Stringa linea" - -msgid "Polygon" -msgstr "Poligono" - -msgid "Multi-point" -msgstr "Multipunto" - -msgid "Multi-line string" -msgstr "Stringa multilinea" - -msgid "Multi polygon" -msgstr "Multi poligono" - -msgid "Geometry collection" -msgstr "Raccolta Geometry" - -msgid "Extent Aggregate Field" -msgstr "Campo di aggregazione esteso" - -msgid "Raster Field" -msgstr "Campo raster" - -msgid "No geometry value provided." -msgstr "Nessun valore geometrico fornito." - -msgid "Invalid geometry value." -msgstr "Valore geometrico non valido." - -msgid "Invalid geometry type." -msgstr "Tipo geometrico non valido." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Si è verificato un errore durante la trasformazione della geometria nello " -"SRID del campo geometria della form." - -msgid "Delete all Features" -msgstr "Cancella tutti gli oggetti" - -msgid "WKT debugging window:" -msgstr "Finestra di debug WKT:" - -msgid "Debugging window (serialized value)" -msgstr "Finestra di debug (valore serializzato)" - -msgid "No feeds are registered." -msgstr "Non ci sono feed registrati." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Lo slug %r non è registrato." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ja/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index 402c100..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ja/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index 232f66a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Akio Ogasahara , 2024 -# Jannis Leidel , 2011 -# Shinya Okano , 2012,2014-2015 -# Takuya N , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-08-07 18:45+0000\n" -"Last-Translator: Akio Ogasahara , 2024\n" -"Language-Team: Japanese (http://app.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "地理情報システム" - -msgid "The base GIS field." -msgstr "基底GISフィールド" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "基底GISフィールド — OpenGIS で決められた地形タイプに対応します。" - -msgid "Point" -msgstr "点" - -msgid "Line string" -msgstr "線" - -msgid "Polygon" -msgstr "ポリゴン" - -msgid "Multi-point" -msgstr "複数の点" - -msgid "Multi-line string" -msgstr "複数の線" - -msgid "Multi polygon" -msgstr "複数のポリゴン" - -msgid "Geometry collection" -msgstr "ジオメトリのコレクション" - -msgid "Extent Aggregate Field" -msgstr "広さ集計フィールド" - -msgid "Raster Field" -msgstr "ラスターフィールド" - -msgid "No geometry value provided." -msgstr "geometry値がありません。" - -msgid "Invalid geometry value." -msgstr "geometry値が不正です" - -msgid "Invalid geometry type." -msgstr "geometryタイプが不正です。" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"geometry を geometry フォームフィールドの SRID に変換しようとしてエラーが起き" -"ました。" - -msgid "Delete all Features" -msgstr "すべての機能を削除" - -msgid "Debugging window (serialized value)" -msgstr "デバッグウィンドウ(シリアライズされた値)" - -msgid "No feeds are registered." -msgstr "フィードが登録されていません。" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "スラグ %r は登録されていません。" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ka/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index b684ee9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ka/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index 31bb23c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2013,2015 -# avsd05 , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "წერტილი" - -msgid "Line string" -msgstr "ხაზის მასივი" - -msgid "Polygon" -msgstr "მრავალკუთხედი" - -msgid "Multi-point" -msgstr "წერტილების სიმრავლე" - -msgid "Multi-line string" -msgstr "ხაზების სიმრავლის მასივი" - -msgid "Multi polygon" -msgstr "მრავალკუთხედების სიმრავლე" - -msgid "Geometry collection" -msgstr "გეომეტრიული კოლექცია" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "გეომეტრიის მნიშვნელობა მოცემული არ არის." - -msgid "Invalid geometry value." -msgstr "გეომეტრიის მნიშვნელობა არასწორია." - -msgid "Invalid geometry type." -msgstr "გეომეტრიის ტიპი არასწორია." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "ველიდან გეომეტრიის SRID-ში გადაყვანისას მოხდა შეცდომა." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "არცერთი ფიდი არ არის რეგისტრირებული." - -#, python-format -msgid "Slug %r isn't registered." -msgstr "სლაგი %r არ არის რეგისტრირებული." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index c750301..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index 2666802..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,85 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# yun_man_ger , 2011 -# Zhazira , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Нүкте" - -msgid "Line string" -msgstr "Сынық" - -msgid "Polygon" -msgstr "Көпбұрыш" - -msgid "Multi-point" -msgstr "Нүкте жинағы" - -msgid "Multi-line string" -msgstr "Сынықтар жинағы" - -msgid "Multi polygon" -msgstr "Көпбұрыш жинағы" - -msgid "Geometry collection" -msgstr "Геометриялық объект жинағы" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Геметрия мәні берілген жоқ" - -msgid "Invalid geometry value." -msgstr "Геометрия мәні дұрыс емес" - -msgid "Invalid geometry type." -msgstr "Геометрия түрі дұрыс емес" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Геометрияны SRID-ге өзгерту кезінде қате шықты." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/km/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index 4ae545a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/km/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index d5d5980..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:35+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/projects/p/django/language/" -"km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Google Maps via GeoDjango" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index be4f674..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index 0ec1b16..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:35+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kannada (http://www.transifex.com/projects/p/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Google Maps via GeoDjango" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ko/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index 29545de..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ko/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index 004cde1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jiyoon, Ha , 2016 -# Jaehong Kim , 2011 -# Jannis Leidel , 2011 -# Jay Oh , 2020 -# Le Tartuffe , 2014 -# JunGu Kang , 2015 -# 이지현 , 2017 -# minsung kang, 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Jay Oh , 2020\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "기본 GIS 필드" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "기본 지리 정보 필드 — 오픈GIS에 특화된 지리 정보 형식의 맵" - -msgid "Point" -msgstr "위치" - -msgid "Line string" -msgstr "한줄 문자열" - -msgid "Polygon" -msgstr "다각형" - -msgid "Multi-point" -msgstr "다중 위치" - -msgid "Multi-line string" -msgstr "여러줄 문자열" - -msgid "Multi polygon" -msgstr "복수 다각형" - -msgid "Geometry collection" -msgstr "지리적 위치 모음" - -msgid "Extent Aggregate Field" -msgstr "확장 집계 필드" - -msgid "Raster Field" -msgstr "래스터 필드" - -msgid "No geometry value provided." -msgstr "지리 값이 없습니다." - -msgid "Invalid geometry value." -msgstr "잘못된 지리 값." - -msgid "Invalid geometry type." -msgstr "잘못된 지리 형식." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Geometry를 geometry 필드의 SRID로 변환하는 도중 오류가 발생하였습니다." - -msgid "Delete all Features" -msgstr "모든 기능 삭제" - -msgid "Debugging window (serialized value)" -msgstr "디버깅 창 (연속된 값)" - -msgid "No feeds are registered." -msgstr "등록된 피드가 없습니다." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "%r 이/가 등록되지 않았습니다." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ky/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index 6b61583..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ky/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 3e453c7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,83 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soyuzbek orozbek uulu , 2020 -# Soyuzbek orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Soyuzbek orozbek uulu , 2020\n" -"Language-Team: Kyrgyz (http://app.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Негизги GIS талаасы" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"негизги Геометр талаасы — OpenGIS Геометрдик көрсөтмөлө тибине дал келет." - -msgid "Point" -msgstr "Чекит" - -msgid "Line string" -msgstr "Сап сызыгы" - -msgid "Polygon" -msgstr "Көпбурчтук" - -msgid "Multi-point" -msgstr "Көп чекит" - -msgid "Multi-line string" -msgstr "Көпсап" - -msgid "Multi polygon" -msgstr "Көп көпбурчтук" - -msgid "Geometry collection" -msgstr "Геометр жыйындысы" - -msgid "Extent Aggregate Field" -msgstr "Кошумча Агрегат талаасы" - -msgid "Raster Field" -msgstr "Растр Талаасы" - -msgid "No geometry value provided." -msgstr "геометр маани тейленбейт." - -msgid "Invalid geometry value." -msgstr "Ката геометр маани." - -msgid "Invalid geometry type." -msgstr "Ката геометр тиби." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "геометр аймагынын маанисин SRID ге которгондо ката чыкты." - -msgid "Delete all Features" -msgstr "Бүт касиеттерди өчүр" - -msgid "Debugging window (serialized value)" -msgstr "Оңдоо терезеси (кысымдалган маани)" - -msgid "No feeds are registered." -msgstr "Кадамдар катталган эмес." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "%r слагы катталган эмес." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index f91c361..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index 40fd9e2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:35+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Google Maps via GeoDjango" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index 4505fa6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index dff04ab..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Kostas , 2011 -# lauris , 2011 -# Mariusz Felisiak , 2023 -# Matas Dailyda , 2015 -# Simonas Kazlauskas , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Mariusz Felisiak , 2023\n" -"Language-Team: Lithuanian (http://app.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Bazinis GIS laukas." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Bazinis geometrijos laukas — atvaizduoja OpenGIS Specification Geometry tipą." - -msgid "Point" -msgstr "Taškas" - -msgid "Line string" -msgstr "Atkarpa" - -msgid "Polygon" -msgstr "Daugiakampis" - -msgid "Multi-point" -msgstr "Taškų aibė" - -msgid "Multi-line string" -msgstr "Atkarpų aibė" - -msgid "Multi polygon" -msgstr "Daugiakampių aibė" - -msgid "Geometry collection" -msgstr "Geometrinė kolekcija" - -msgid "Extent Aggregate Field" -msgstr "Išplėsti agregato lauką" - -msgid "Raster Field" -msgstr "Rastro laukas" - -msgid "No geometry value provided." -msgstr "Nenurodyta geometrinė reikšmė" - -msgid "Invalid geometry value." -msgstr "Netinkama geometrinė reikšmė" - -msgid "Invalid geometry type." -msgstr "Netinkamas geometrinis tipas" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Įvyko klaida pertvarkant geometrijos lauko SRID geometriją." - -msgid "Delete all Features" -msgstr "Pašalinti visas ypatybes" - -msgid "Debugging window (serialized value)" -msgstr "Derinimo langas (serijomis išdėstytos reikšmės)" - -msgid "No feeds are registered." -msgstr "Nėra užregistruotų srautų." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Adresas %r neregistruotas." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index c154ca5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index 37565d0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Edgars Voroboks , 2019 -# peterisb , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Edgars Voroboks , 2019\n" -"Language-Team: Latvian (http://app.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -msgid "GIS" -msgstr "ĢIS" - -msgid "The base GIS field." -msgstr "ĢIS bāzes lauks." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Bāzes Ģeometrijas lauks -- atbilst OpenGIS specifikācijas Geometry tipam." - -msgid "Point" -msgstr "Punkts" - -msgid "Line string" -msgstr "Līniju virkne" - -msgid "Polygon" -msgstr "Daudzstūris" - -msgid "Multi-point" -msgstr "Vairāki punkti" - -msgid "Multi-line string" -msgstr "Vairāku rindu virkne" - -msgid "Multi polygon" -msgstr "Vairāki daudzstūri" - -msgid "Geometry collection" -msgstr "Ģeometrijas kolekcija" - -msgid "Extent Aggregate Field" -msgstr "Apjoma agregācijas lauks" - -msgid "Raster Field" -msgstr "Rastra lauks" - -msgid "No geometry value provided." -msgstr "Nav norādīta ģeometrijas vērtība." - -msgid "Invalid geometry value." -msgstr "Nekorekta ģeometrijas vērtība." - -msgid "Invalid geometry type." -msgstr "Nekorekts ģeometrijas tips." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Sastapta kļūda, pārveidojot ģeometriju uz ģeometriskās formas lauka SRID." - -msgid "Delete all Features" -msgstr "Dzēst visus objektus" - -msgid "Debugging window (serialized value)" -msgstr "Atkļūdošanas logs (serializēta vērtība)" - -msgid "No feeds are registered." -msgstr "Nav reģistrētu barotņu." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Vienkāršotais nosaukums %r nav reģistrēts." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index ff5e5c3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index 03934c6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# dekomote , 2015 -# Jannis Leidel , 2011 -# Mariusz Felisiak , 2023 -# Vasil Vangelovski , 2016 -# Vasil Vangelovski , 2014 -# Vasil Vangelovski , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Mariusz Felisiak , 2023\n" -"Language-Team: Macedonian (http://app.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgid "GIS" -msgstr "ГИС" - -msgid "The base GIS field." -msgstr "Базичното ГИС поле." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Базичното геметриско поле — мапира директно на геометриско поле од OpenGIS " -"спецификацијата." - -msgid "Point" -msgstr "Точка" - -msgid "Line string" -msgstr "Линиска нишка" - -msgid "Polygon" -msgstr "Полигон" - -msgid "Multi-point" -msgstr "Повеќе точки" - -msgid "Multi-line string" -msgstr "Повеќе-линиска нишка" - -msgid "Multi polygon" -msgstr "Повеќе полигони" - -msgid "Geometry collection" -msgstr "Колекција од геометриски објекти" - -msgid "Extent Aggregate Field" -msgstr "Поле за агрегација по плоштина или периметар" - -msgid "Raster Field" -msgstr "Растер поле" - -msgid "No geometry value provided." -msgstr "Не е внесена геометриска вредност." - -msgid "Invalid geometry value." -msgstr "Невалидна геометриска вредност." - -msgid "Invalid geometry type." -msgstr "Невалиден геометриски тип." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Се појави грешка при трансформација на геометриската вредност во SRID од " -"геометриското поле" - -msgid "Delete all Features" -msgstr "Избриши ги сите карактеристики" - -msgid "Debugging window (serialized value)" -msgstr "Прозор за дебагирање (серијализирана вредност)" - -msgid "No feeds are registered." -msgstr "Нема регистрирани фидови." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Краткото име (slug) %r не е регистрирано" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ml/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index 8972f2a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ml/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index ad8251e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aby Thomas , 2014 -# Jannis Leidel , 2011 -# Rajeesh Nair , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "ജി.ഐ.എസ്" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "ബിന്ദു" - -msgid "Line string" -msgstr "രേഖാ സ്ട്രിങ്ങ്" - -msgid "Polygon" -msgstr "ബഹുഭുജം" - -msgid "Multi-point" -msgstr "ബഹുബിന്ദു" - -msgid "Multi-line string" -msgstr "ബഹു രേഖാ സ്ട്രിങ്ങ്" - -msgid "Multi polygon" -msgstr "ബഹു ബഹുഭുജം" - -msgid "Geometry collection" -msgstr "ജ്യാമിതി ശേഖരം" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "ജ്യാമിതീയ മൂല്യമൊന്നും തന്നിട്ടില്ല." - -msgid "Invalid geometry value." -msgstr "തെറ്റായ ജ്യാമിതീയ മൂല്യം." - -msgid "Invalid geometry type." -msgstr "തെറ്റായ തരം ജ്യാമിതി." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"ജ്യാമിതീയ രൂപത്തെ ജ്യാമിതി കളത്തിന്റെ SRID-ലേക്കു മാറ്റുമ്പോള്‍ എന്തോ തകരാറു സംഭവിച്ചിട്ടുണ്ട്." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr " ഫീഡുകളൊന്നും രജിസ്റ്റര്‍ ചെയ്തിട്ടില്ല." - -#, python-format -msgid "Slug %r isn't registered." -msgstr "%r എന്ന സ്ലഗ് രജിസ്റ്റര്‍ ചെയ്തിട്ടില്ല." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index 8643c1f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 1362f6c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Baskhuu Lodoikhuu , 2011 -# Jannis Leidel , 2011 -# Mariusz Felisiak , 2023 -# Turmunkh Batkhuyag, 2023 -# Zorig, 2014,2016 -# Анхбаяр Анхаа , 2011-2012,2015 -# Баясгалан Цэвлээ , 2011,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-24 18:45+0000\n" -"Last-Translator: Turmunkh Batkhuyag, 2023\n" -"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "Газар зүйн мэдээлэл" - -msgid "The base GIS field." -msgstr "Ерөнхий GIS талбар" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Үндсэн Geometry талбар — OpenGIS газрын зургын Геометрын дүрсны онцгой " -"төрөлтэй байна." - -msgid "Point" -msgstr "Цэг" - -msgid "Line string" -msgstr "Тэмдэгт мөр" - -msgid "Polygon" -msgstr "Олон өнцөгт" - -msgid "Multi-point" -msgstr "Олон цэг" - -msgid "Multi-line string" -msgstr "Олон мөр бүхий тэмтэгт мөр" - -msgid "Multi polygon" -msgstr "Олон өнцөгтийн олонлог" - -msgid "Geometry collection" -msgstr "Геометрийн цуглуулга" - -msgid "Extent Aggregate Field" -msgstr "Aggregate талбарыг өргөтгөх" - -msgid "Raster Field" -msgstr "Растер талбар" - -msgid "No geometry value provided." -msgstr "Геометрийн утгыг өгөөгүй." - -msgid "Invalid geometry value." -msgstr "Буруу геометрийн утга байна." - -msgid "Invalid geometry type." -msgstr "Геометер төрөл буруу байна." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Геометрийг геометрийн форм талбарын SRID болгон хувиргах үед алдаа гарлаа." - -msgid "Delete all Features" -msgstr "Бүх онцлогүүдыг устгах" - -msgid "Debugging window (serialized value)" -msgstr "Шинжлэх цонх (дугаарлагдсан утга) " - -msgid "No feeds are registered." -msgstr "Бүртгэгдсэн feeds байхгүй байна." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "%r слаг бүгтгэгдээгүй байна" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index 2c75572..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index 1083d95..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,82 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Omkar Parab, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-01-24 18:45+0000\n" -"Last-Translator: Omkar Parab, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "सर्व वैशिष्ट्ये घालवा" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ms/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index 63a382e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ms/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index 756ca99..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Jafry Hisham, 2021\n" -"Language-Team: Malay (http://app.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Medan asas GIS" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Medan asas geometri - disuaikan ke jenis Spesifikasi Geometri OpenGIS ." - -msgid "Point" -msgstr "Titik" - -msgid "Line string" -msgstr "Rentetan baris" - -msgid "Polygon" -msgstr "Polygon" - -msgid "Multi-point" -msgstr "Berbilang-titik" - -msgid "Multi-line string" -msgstr "Rentetan berbilang-baris" - -msgid "Multi polygon" -msgstr "Berbilang polygon" - -msgid "Geometry collection" -msgstr "Koleksi geometri" - -msgid "Extent Aggregate Field" -msgstr "Medan Agregat Takat" - -msgid "Raster Field" -msgstr "Medan Raster" - -msgid "No geometry value provided." -msgstr "Tiada nilai geometri diberikan." - -msgid "Invalid geometry value." -msgstr "Nilai geometri tidak sah." - -msgid "Invalid geometry type." -msgstr "Jenis geometri tidak sah." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Ralat telah berlaku semasa mengubah geometri kepada SRID geometri medan " -"borang." - -msgid "Delete all Features" -msgstr "Hapuskan semua Ciri-cri" - -msgid "Debugging window (serialized value)" -msgstr "Tingkap penyahpijatan (nilai bersiri)" - -msgid "No feeds are registered." -msgstr "Tiada feed didaftarkan." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r tidak didaftarkan." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index 443434b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index 3fbc0ee..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,85 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-20 03:01+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "ဂျီအိုင်အက်စ်" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index 4220ad8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index e347e78..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# jensadne , 2014 -# Jon, 2015 -# Jon, 2020 -# Jon, 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Jon, 2020\n" -"Language-Team: Norwegian Bokmål (http://app.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "GIS-basefeltet." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Geometry-basefeltet - tilordnes til OpenGIS Specification Geometry-typen." - -msgid "Point" -msgstr "Punkt" - -msgid "Line string" -msgstr "Linje-string" - -msgid "Polygon" -msgstr "Polygon" - -msgid "Multi-point" -msgstr "Multipunkt" - -msgid "Multi-line string" -msgstr "Multilinje-string" - -msgid "Multi polygon" -msgstr "Multi-polygon" - -msgid "Geometry collection" -msgstr "Geometri-samling" - -msgid "Extent Aggregate Field" -msgstr "Extent Aggregate-felt" - -msgid "Raster Field" -msgstr "Raster-felt" - -msgid "No geometry value provided." -msgstr "Ingen geometriverdi oppgitt." - -msgid "Invalid geometry value." -msgstr "Ugyldig geometriverdi" - -msgid "Invalid geometry type." -msgstr "Ugyldig geometritype" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"En feil oppstod ved transformering av geometrien til SRID fra geometrifeltet." - -msgid "Delete all Features" -msgstr "Slett alle Features" - -msgid "Debugging window (serialized value)" -msgstr "Debugging-vindu (serialisert verdi)" - -msgid "No feeds are registered." -msgstr "Ingen feeds er registrert." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r er ikke registrert." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ne/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index 9ebdb54..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ne/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index 07e9468..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Sagar Chalise , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "बिन्दु" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "बहुभुज" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "ज्यामिति संकलन" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "ज्यामिति मान उपलब्ध छैन ।" - -msgid "Invalid geometry value." -msgstr "उनुपयुक्त ज्यामिति मान" - -msgid "Invalid geometry type." -msgstr "उनुपयुक्त ज्यामिति प्रकार" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index 4ad8805..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index cace53f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Blue , 2011 -# Harro van der Klauw , 2012 -# Ilja Maas , 2015 -# Jannis Leidel , 2011 -# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2011 -# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2015 -# Tonnes , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Tonnes , 2019\n" -"Language-Team: Dutch (http://app.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Het basis-GIS-veld." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Het basis-Geometrie-veld – correspondeert met het Geometrie-type van de " -"OpenGIS-specificatie." - -msgid "Point" -msgstr "Punt" - -msgid "Line string" -msgstr "Tekenreeks" - -msgid "Polygon" -msgstr "Polygoon" - -msgid "Multi-point" -msgstr "Multipunt" - -msgid "Multi-line string" -msgstr "Multi-tekenreeks" - -msgid "Multi polygon" -msgstr "Multi-polygoon" - -msgid "Geometry collection" -msgstr "Geometrie-verzameling" - -msgid "Extent Aggregate Field" -msgstr "Gebieds-aggregatieveld" - -msgid "Raster Field" -msgstr "Rasterveld" - -msgid "No geometry value provided." -msgstr "Geen geometriewaarde opgegeven." - -msgid "Invalid geometry value." -msgstr "Ongeldige geometriewaarde." - -msgid "Invalid geometry type." -msgstr "Ongeldig geometrietype." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Er is een fout opgetreden bij het omvormen van de geometrie naar de SRID van " -"het geometrieveld." - -msgid "Delete all Features" -msgstr "Alle kenmerken verwijderen" - -msgid "Debugging window (serialized value)" -msgstr "Debugvenster (geserialiseerde waarde)" - -msgid "No feeds are registered." -msgstr "Er zijn geen feeds geregistreerd." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r is niet geregistreerd." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index 0676ecd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index fcb77a6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Sivert Olstad, 2021 -# Vibeke Uthaug, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Vibeke Uthaug, 2021\n" -"Language-Team: Norwegian Nynorsk (http://app.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "GIS-basefeltet" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Geometry-basefeltet - tilordnes til OpenGIS Specification Geometry-typen." - -msgid "Point" -msgstr "Punkt" - -msgid "Line string" -msgstr "Linjestreng" - -msgid "Polygon" -msgstr "Polygon" - -msgid "Multi-point" -msgstr "Fleirpunkt" - -msgid "Multi-line string" -msgstr "Fleirlinje-streng" - -msgid "Multi polygon" -msgstr "Multi-polygon" - -msgid "Geometry collection" -msgstr "Geometrisamling" - -msgid "Extent Aggregate Field" -msgstr "Extent Aggregate-felt" - -msgid "Raster Field" -msgstr "Raster-felt" - -msgid "No geometry value provided." -msgstr "Ingen geometriverdi oppgjeve." - -msgid "Invalid geometry value." -msgstr "Ugyldig geometriverdi." - -msgid "Invalid geometry type." -msgstr "Ugyldig geometritype." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Det oppstod ein feil ved transformering av geometrien til SRID frå " -"geometrifeltet." - -msgid "Delete all Features" -msgstr "Slett alle Features" - -msgid "Debugging window (serialized value)" -msgstr "Feilsøking-vindauge (serialisert verdi)" - -msgid "No feeds are registered." -msgstr "Ingen feeds er registrert." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r er ikkje registrert." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/os/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index 47f4a0f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/os/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index 65c7267..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Стъӕлф" - -msgid "Line string" -msgstr "Хаахы рӕнхъ" - -msgid "Polygon" -msgstr "Бирӕкъуымон" - -msgid "Multi-point" -msgstr "Бирӕ-стъӕлф" - -msgid "Multi-line string" -msgstr "Бирӕ-хаххы рӕнхъ" - -msgid "Multi polygon" -msgstr "Бирӕ бирӕкъуымон" - -msgid "Geometry collection" -msgstr "Геометриты ӕмбырд" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Геометрийы бӕрц амынд нӕу." - -msgid "Invalid geometry value." -msgstr "Геометрийы бӕрц раст нӕу." - -msgid "Invalid geometry type." -msgstr "Геометрийы хуыз раст нӕу." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Рӕдыд ӕрцыд SRID геометри формӕйы бынаты геометримӕ ивд куы цыдис, уӕд." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "Ницы лӕсӕн уыд регистрацигонд." - -#, python-format -msgid "Slug %r isn't registered." -msgstr "Слаг %r регистрацигонд нӕу." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index cc74c58..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index 544c783..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# A S Alam , 2013 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "ਪੁਆਇੰਟ" - -msgid "Line string" -msgstr "ਲਾਈਨ ਸਤਰ" - -msgid "Polygon" -msgstr "ਬਹੁਭੁਜ" - -msgid "Multi-point" -msgstr "ਕਈ-ਪੁਆਇੰਟ" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "ਮਲਟੀ ਬਹੁ-ਭੁਜ" - -msgid "Geometry collection" -msgstr "ਜੁਮੈਟਰੀ ਭੰਡਾਰ" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "ਕੋਈ ਜੁਮੈਟਰੀ ਮੁੱਲ ਨਹੀਂ ਦਿੱਤਾ ਗਿਆ।" - -msgid "Invalid geometry value." -msgstr "ਗਲਤ ਜੁਮੈਟਰੀ ਮੁੱਲ।" - -msgid "Invalid geometry type." -msgstr "ਗਲਤ ਜੁਮੈਟਰੀ ਕਿਸਮ।" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "ਕੋਈ ਫੀਡ ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ।" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index 5f15e70..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index 6c3efec..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# angularcircle, 2012 -# Jannis Leidel , 2011 -# Janusz Harkot , 2015 -# Piotr Jakimiak , 2015 -# Maciej Olko , 2019 -# Maciej Olko , 2015 -# Mattia Procopio , 2014 -# Tomasz Kajtoch , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Maciej Olko , 2019\n" -"Language-Team: Polish (http://app.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " -"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " -"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Pole bazowe GIS." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "Pole bazowe Geometrii — mapowane na typ Geometry specyfikacji OpenGIS." - -msgid "Point" -msgstr "Punkt" - -msgid "Line string" -msgstr "Ścieżka" - -msgid "Polygon" -msgstr "Wielokąt" - -msgid "Multi-point" -msgstr "Zbiór punktów" - -msgid "Multi-line string" -msgstr "Zbiór ścieżek" - -msgid "Multi polygon" -msgstr "Zbiór wielokątów" - -msgid "Geometry collection" -msgstr "Zbiór geometrii" - -msgid "Extent Aggregate Field" -msgstr "Pole Zasięgu Agregacji" - -msgid "Raster Field" -msgstr "Pole Rastrowe" - -msgid "No geometry value provided." -msgstr "Brak wartości geometrii." - -msgid "Invalid geometry value." -msgstr "Błędna wartość geometrii." - -msgid "Invalid geometry type." -msgstr "Błędny typ geometrii." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Wystąpił błąd podczas przekształcania geometrii do SRID pola formularza " -"geometrii." - -msgid "Delete all Features" -msgstr "Usuń wszystkie Elementy" - -msgid "Debugging window (serialized value)" -msgstr "Okno debugowania (wartość zserializowana)" - -msgid "No feeds are registered." -msgstr "Brak zarejestrowanych kanałów informacyjnych." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r nie jest zarejestrowany." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index bacd6b2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index cae805a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claudio Fernandes , 2015 -# Jannis Leidel , 2011 -# jorgecarleitao , 2015 -# 425fe09b3064b9f906f637fff94056ae_a00ea56 <0fa3588fa89906bfcb3a354600956e0e_308047>, 2015 -# Manuela Silva , 2025 -# Nuno Mariz , 2011-2012,2015 -# 12574c6d66324e145c1d19e02acecb73_84badd8 <4e8d94859927eab3b50486d21249c068_5346>, 2011 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Manuela Silva , 2025\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "SIG" - -msgid "The base GIS field." -msgstr "O campo GIS base." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"O campo básico Geometria - aponta para o tipo de Geometria de Especificação " -"OpenGIS." - -msgid "Point" -msgstr "Ponto" - -msgid "Line string" -msgstr "Linha" - -msgid "Polygon" -msgstr "Polígono" - -msgid "Multi-point" -msgstr "Multi-ponto" - -msgid "Multi-line string" -msgstr "Multi-linha" - -msgid "Multi polygon" -msgstr "Multi-polígono" - -msgid "Geometry collection" -msgstr "Coleção geométrica" - -msgid "Extent Aggregate Field" -msgstr "Extender Campo Agregado" - -msgid "Raster Field" -msgstr "Campo Raster" - -msgid "No geometry value provided." -msgstr "Não foi submetido nenhum valor do tipo geometria." - -msgid "Invalid geometry value." -msgstr "Valor inválido de geometria." - -msgid "Invalid geometry type." -msgstr "Tipo inválido de geometria." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Ocorreu um erro na transformação da geometria para o SRID da geometria do " -"campo do formulário." - -msgid "Delete all Features" -msgstr "Eliminar todas as Caraterísticas" - -msgid "Debugging window (serialized value)" -msgstr "Janela de depuração (valor serializado)" - -msgid "No feeds are registered." -msgstr "Nenhum feed está registado." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index 3ea91a5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index d807a0b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,94 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# Carlos E C Leite - Cadu , 2015-2016,2019 -# Eduardo Cereto Carvalho, 2011 -# semente, 2012 -# Jannis Leidel , 2011 -# Lucas Infante , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-10-09 16:09+0000\n" -"Last-Translator: Carlos E C Leite - Cadu \n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "O campo GIS base." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"O campo Geometry básico - aponta para o tipo OpenGis Specification " -"Geometry. " - -msgid "Point" -msgstr "Ponto" - -msgid "Line string" -msgstr "Linha string" - -msgid "Polygon" -msgstr "Polígono" - -msgid "Multi-point" -msgstr "Multiponto" - -msgid "Multi-line string" -msgstr "Multilinha string" - -msgid "Multi polygon" -msgstr "Multipolígono" - -msgid "Geometry collection" -msgstr "Coleção geométrica" - -msgid "Extent Aggregate Field" -msgstr "Campo agregado extendido" - -msgid "Raster Field" -msgstr "Campo Raster." - -msgid "No geometry value provided." -msgstr "Nenhum valor geométrico fornecido." - -msgid "Invalid geometry value." -msgstr "Valor geométrico inválido." - -msgid "Invalid geometry type." -msgstr "Tipo geométrico inválido." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Ocorreu um erro ao transformar a geometria para o SRID do campo de " -"formulário de geometria." - -msgid "Delete all Features" -msgstr "Deletar todas os elementos" - -msgid "WKT debugging window:" -msgstr "Janela de debug WKT" - -msgid "Debugging window (serialized value)" -msgstr "Janela de debug (valor seralizado)" - -msgid "No feeds are registered." -msgstr "Nenhum feed foi registrado." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "O Slug %r não está registrado." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ro/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index d5bfb30..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ro/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index ae9d157..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bogdan Mateescu, 2019 -# Daniel Ursache-Dogariu, 2011 -# Denis Darii , 2011,2014 -# Eugenol Man , 2020 -# Razvan Stefanescu , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Eugenol Man , 2020\n" -"Language-Team: Romanian (http://app.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Câmpul GIS de bază." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Punct" - -msgid "Line string" -msgstr "Șir linii" - -msgid "Polygon" -msgstr "Poligon" - -msgid "Multi-point" -msgstr "Multi-punct" - -msgid "Multi-line string" -msgstr "Șir multi-linie" - -msgid "Multi polygon" -msgstr "Multi poligon" - -msgid "Geometry collection" -msgstr "Colecție geometrie" - -msgid "Extent Aggregate Field" -msgstr "Câmp agregat extins" - -msgid "Raster Field" -msgstr "Câmp raster" - -msgid "No geometry value provided." -msgstr "Nicio valoare geometrică furnizată." - -msgid "Invalid geometry value." -msgstr "Valoare geometrică nevalidă." - -msgid "Invalid geometry type." -msgstr "Tip geometric nevalid." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"A avut loc o eroare la transformarea geometriei în SRID-ul câmpului " -"geometric al formularului." - -msgid "Delete all Features" -msgstr "Șterge toate Entitățile" - -msgid "Debugging window (serialized value)" -msgstr "Fereastra de depanare (valoare serializată)" - -msgid "No feeds are registered." -msgstr "Nici un feed registrat." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r nu este înregistrat." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ru/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index 1f92476..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ru/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index 1674643..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,91 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eugene , 2012 -# eXtractor , 2015 -# crazyzubr , 2020 -# Jannis Leidel , 2011 -# Алексей Борискин , 2012,2014-2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: crazyzubr , 2020\n" -"Language-Team: Russian (http://app.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "GIS" -msgstr "ГИС" - -msgid "The base GIS field." -msgstr "Базовое ГИС-поле." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Базовое геометрическое поле. Соответствует типу OpenGIS Specification " -"Geometry." - -msgid "Point" -msgstr "Точка" - -msgid "Line string" -msgstr "Ломаная" - -msgid "Polygon" -msgstr "Многоугольник" - -msgid "Multi-point" -msgstr "Набор точек" - -msgid "Multi-line string" -msgstr "Набор ломаных" - -msgid "Multi polygon" -msgstr "Набор многоугольников" - -msgid "Geometry collection" -msgstr "Набор геометрических объектов" - -msgid "Extent Aggregate Field" -msgstr "Поле, агрегирующее площадь или объём" - -msgid "Raster Field" -msgstr "Растровое поле" - -msgid "No geometry value provided." -msgstr "Не указано значение геометрии." - -msgid "Invalid geometry value." -msgstr "Неверное значение геометрии." - -msgid "Invalid geometry type." -msgstr "Неверный тип геометрического объекта." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Произошла ошибка во время преобразования геометрического объекта в SRID." - -msgid "Delete all Features" -msgstr "Удалить все объекты" - -msgid "Debugging window (serialized value)" -msgstr "Отладочное окно (сериализованные значения)" - -msgid "No feeds are registered." -msgstr "Нет зарегистрированных фидов." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Слаг %r не зарегистрирован." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index 9a6c2f5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index 5a6c87c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# 18f25ad6fa9930fc67cb11aca9d16a27, 2012 -# Marian Andre , 2015,2017 -# Martin Tóth , 2017,2023 -# Štefan Lučivjanský , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Martin Tóth , 2017,2023\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Základné GIS pole." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "Základné pole Geometry — mapuje na typ OpenGIS Specification Geometry." - -msgid "Point" -msgstr "Bod" - -msgid "Line string" -msgstr "Čiara" - -msgid "Polygon" -msgstr "Polygón" - -msgid "Multi-point" -msgstr "Viacero bodov" - -msgid "Multi-line string" -msgstr "Viacero čiar" - -msgid "Multi polygon" -msgstr "Viacero polygónov" - -msgid "Geometry collection" -msgstr "Goemetrická kolekcia" - -msgid "Extent Aggregate Field" -msgstr "Rozšírené agregátne pole" - -msgid "Raster Field" -msgstr "Rastrové Pole" - -msgid "No geometry value provided." -msgstr "Nie je zadaná žiadna geometrická hodnota." - -msgid "Invalid geometry value." -msgstr "Chybná geometrická hodnota." - -msgid "Invalid geometry type." -msgstr "Chybný geometrický typ." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Nastala chyba pri prevode geometrie do SRID z formulárového poľa." - -msgid "Delete all Features" -msgstr "Odstrániť všetky vlastnosti" - -msgid "Debugging window (serialized value)" -msgstr "Ladiace okno (serializovaná hodnota)" - -msgid "No feeds are registered." -msgstr "Žiadne kanály nie sú registrované." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Identifikátor %r nie je registrovaný." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index b19dd7f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index e4551dd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,89 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Mariusz Felisiak , 2023 -# Primoz Verdnik , 2017 -# zejn , 2016 -# zejn , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Mariusz Felisiak , 2023\n" -"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Osnovno GIS polje" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "Osnovno polje GIS — se preslika v vrsto Geometry po določilih OpenGIS." - -msgid "Point" -msgstr "Točka" - -msgid "Line string" -msgstr "Črtni niz" - -msgid "Polygon" -msgstr "Mnogokotnik" - -msgid "Multi-point" -msgstr "Več-točkovi predmet" - -msgid "Multi-line string" -msgstr "Več črtni niz" - -msgid "Multi polygon" -msgstr "Večkratni mnogokotnikov" - -msgid "Geometry collection" -msgstr "Zbirka likov" - -msgid "Extent Aggregate Field" -msgstr "Polje z agregiranim območjem" - -msgid "Raster Field" -msgstr "Rastersko polje" - -msgid "No geometry value provided." -msgstr "Ni navedene geometrijske vrednosti." - -msgid "Invalid geometry value." -msgstr "Neveljavna geometrijska vrednost." - -msgid "Invalid geometry type." -msgstr "Neveljavna vrsta geometrije." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Med pretvarjanjem geometrijskega zapisa v SRID geometrijskega polja je " -"prišlo do napake." - -msgid "Delete all Features" -msgstr "Pobriši vse atribute" - -msgid "Debugging window (serialized value)" -msgstr "Okno za razhroščevanje (serializirana vrednost)" - -msgid "No feeds are registered." -msgstr "Ni vpisanih virov." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Okrajšava %r ni vpisana." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sq/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index dd55394..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sq/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index 8f1ed4f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2011,2015 -# Besnik Bleta , 2025 -# Besnik Bleta , 2015,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Fushat GIS bazë." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Fusha bazë Gjeometri — e përshoqëron me llojin Gjeometri me Specifikime " -"OpenGIS." - -msgid "Point" -msgstr "Pikë" - -msgid "Line string" -msgstr "Varg vije" - -msgid "Polygon" -msgstr "Shumëkëndësh" - -msgid "Multi-point" -msgstr "Multi-pika" - -msgid "Multi-line string" -msgstr "Varg multi-vijë" - -msgid "Multi polygon" -msgstr "Multi shumëkëndësh" - -msgid "Geometry collection" -msgstr "Përmbledhje gjeometrie" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "S’u dha vlerë gjeometrie." - -msgid "Invalid geometry value." -msgstr "Vlerë e pavlefshme gjeometrie." - -msgid "Invalid geometry type." -msgstr "Lloj i pavlefshëm gjeometrie." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Ndodhi një gabim gjatë shndërrimit të gjeometrisë në fushë SRID formulari " -"gjeometrie." - -msgid "Delete all Features" -msgstr "Fshiji krejt Veçoritë" - -msgid "Debugging window (serialized value)" -msgstr "Dritare diagnostikimi (vlerë e serializuar)" - -msgid "No feeds are registered." -msgstr "S’ka prurje të regjistruara." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Identifikuesi %r s’është i regjistruar." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index 3fbf09a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index 5915452..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Igor Jerosimić, 2020 -# Jannis Leidel , 2011 -# Janos Guljas , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Igor Jerosimić, 2020\n" -"Language-Team: Serbian (http://app.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Основна GIS поља." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Основно геометријско поље - мапира тип геометрије по „OpenGIS“ спецификацији." - -msgid "Point" -msgstr "Тачка" - -msgid "Line string" -msgstr "Линија" - -msgid "Polygon" -msgstr "Полигон" - -msgid "Multi-point" -msgstr "Више тачака" - -msgid "Multi-line string" -msgstr "Више линија" - -msgid "Multi polygon" -msgstr "Више полигона" - -msgid "Geometry collection" -msgstr "Колекција геопметријских облика" - -msgid "Extent Aggregate Field" -msgstr "Проширено збирно поље" - -msgid "Raster Field" -msgstr "Растерско поље" - -msgid "No geometry value provided." -msgstr "Нисте задали параметре за геометрију." - -msgid "Invalid geometry value." -msgstr "Неисправан параметар за геометрију." - -msgid "Invalid geometry type." -msgstr "Непостојећи тип геометрије." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Грешка се десила током трансформације геометрије на „SRID“ тип поља." - -msgid "Delete all Features" -msgstr "Обриши сва својства" - -msgid "Debugging window (serialized value)" -msgstr "Прозор за отклањање грешака (серијализована вредност)" - -msgid "No feeds are registered." -msgstr "Нема регистрованих фидова." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Слаг %r није регистрован." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index baff02a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index 8ab0744..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Igor Jerosimić, 2019-2020 -# Jannis Leidel , 2011 -# Janos Guljas , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Igor Jerosimić, 2019-2020\n" -"Language-Team: Serbian (Latin) (http://app.transifex.com/django/django/" -"language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Osnovno GIS polje." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Osnovno geometrijsko polje -- mapira tip geometrije po \"OpenGIS\" " -"specifikaciji." - -msgid "Point" -msgstr "Tačka" - -msgid "Line string" -msgstr "Linija" - -msgid "Polygon" -msgstr "Poligon" - -msgid "Multi-point" -msgstr "Više tačaka" - -msgid "Multi-line string" -msgstr "Više linija" - -msgid "Multi polygon" -msgstr "Više poligona" - -msgid "Geometry collection" -msgstr "Kolekcija geopmetrijskih oblika" - -msgid "Extent Aggregate Field" -msgstr "Prošireno zbirno polje" - -msgid "Raster Field" -msgstr "Rastersko polje" - -msgid "No geometry value provided." -msgstr "Niste zadali parametre za geometriju." - -msgid "Invalid geometry value." -msgstr "Neispravan parametar za geometriju." - -msgid "Invalid geometry type." -msgstr "Nepostojeći tip geometrije." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Greška se desila tokom transformacije geometrije na „SRID“ tip polja." - -msgid "Delete all Features" -msgstr "Obriši sva svojstva" - -msgid "Debugging window (serialized value)" -msgstr "Prozor za otklanjanje grešaka (serijalizovana vrednost)" - -msgid "No feeds are registered." -msgstr "Nema registrovanih fidova." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slag %r nije registrovan." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index 3a9473d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index c98dc92..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Albin Larsson , 2022 -# Andreas Pelme , 2011-2012 -# Jannis Leidel , 2011 -# Jonathan Lindén, 2015 -# Jonathan Lindén, 2014 -# Petter Strandmark , 2019 -# Thomas Lundqvist, 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Albin Larsson , 2022\n" -"Language-Team: Swedish (http://app.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Basklassen för GIS-fält." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Basklassen för geometri-fält -- motsvarar ”Geometry”-typen i OpenGIS-" -"specifikationen." - -msgid "Point" -msgstr "Punkt" - -msgid "Line string" -msgstr "Linjesegment" - -msgid "Polygon" -msgstr "Polygon" - -msgid "Multi-point" -msgstr "Multipunkt" - -msgid "Multi-line string" -msgstr "Multilinjesegment" - -msgid "Multi polygon" -msgstr "Multipolygon" - -msgid "Geometry collection" -msgstr "Geometrisamling" - -msgid "Extent Aggregate Field" -msgstr "Fält för sammanlagd yta" - -msgid "Raster Field" -msgstr "Rasterfält" - -msgid "No geometry value provided." -msgstr "Inget geometriskt värde angivet." - -msgid "Invalid geometry value." -msgstr "Ogiltigt geometrivärde." - -msgid "Invalid geometry type." -msgstr "Ogiltig geometrityp" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Ett fel uppstod under transformering till SRID:t hos formulärsfältet." - -msgid "Delete all Features" -msgstr "Ta bort alla attribut" - -msgid "Debugging window (serialized value)" -msgstr "Felsökningsfönster (serialiserat värde)" - -msgid "No feeds are registered." -msgstr "Inga flöden är registrerade." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slugen %r är inte registrerad." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sw/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index 1e7ac9f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sw/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index 04d75bb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Machaku , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Nukta" - -msgid "Line string" -msgstr "Mstari" - -msgid "Polygon" -msgstr "Poligoni" - -msgid "Multi-point" -msgstr "Nukta zaidi ya moja" - -msgid "Multi-line string" -msgstr "Mstari zaidi ya mmoja. " - -msgid "Multi polygon" -msgstr "Poligoni zaidi ya moja" - -msgid "Geometry collection" -msgstr "Mkusanyiko wa jiometri" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Hakuna thamani ya jiometri iliyotolewa" - -msgid "Invalid geometry value." -msgstr "Thamani batili ya jiometri." - -msgid "Invalid geometry type." -msgstr "Aina batili ya jiometri." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Hitilafu imetokea wakati wa kubadilisha jiometri kuwa SRID ya sehemu ya fomu " -"ya jiometri." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "Hakuna mlisho uliosajiliwa." - -#, python-format -msgid "Slug %r isn't registered." -msgstr "Slagi %r haijasajiliwa" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ta/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index 7964f32..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ta/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index 9c2577c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:35+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/projects/p/django/language/" -"ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Google Maps via GeoDjango" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/te/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index 20bc7f0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/te/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index 0797c2f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "క్షెత్రగనిత మూల్యము ఇవ్వలెదు." - -msgid "Invalid geometry value." -msgstr "సరికాని క్షేత్రగణిత మూల్యము." - -msgid "Invalid geometry type." -msgstr "సరికాని క్షేత్రగణిత రకం." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index 257eae1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index e05714b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,84 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-15 01:08+0000\n" -"Last-Translator: Surush Sufiew \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Майдони асосии GIS" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "Шакли нодурусти геометрӣ" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/th/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index de8d4c5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/th/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index 40355c2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2012 -# Vichai Vongvorakul , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "จุด" - -msgid "Line string" -msgstr "สายสตริง" - -msgid "Polygon" -msgstr "รูปหลายเหลี่ยม" - -msgid "Multi-point" -msgstr "หลาย ๆ จุด" - -msgid "Multi-line string" -msgstr "สตริงหลายบรรทัด" - -msgid "Multi polygon" -msgstr "รูปหลายเหลี่ยมหลายรูป" - -msgid "Geometry collection" -msgstr "คอลเลกชันรูปทรงเรขาคณิต" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "ไม่พบข้อมูลพิกัด" - -msgid "Invalid geometry value." -msgstr "ค่าพิกัดผิดพลาด " - -msgid "Invalid geometry type." -msgstr "ขนิดข้อมูลพิกัดผิดพลาด" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "ข้อผิดพลาดที่เกิดขึ้นเมื่อการเปลี่ยนรูปทรงเรขาคณิตที่ SRID ของเขตข้อมูลฟอร์มเรขาคณิต" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "ไม่มีฟีดที่ลงทะเบียน" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "Slug %r ไม่ได้ลงทะเบียน" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index 46268b5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index 455bffb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,88 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BouRock, 2015,2019 -# BouRock, 2014-2015 -# Jannis Leidel , 2011 -# Murat Çorlu , 2012 -# Murat Sahin , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: BouRock, 2015,2019\n" -"Language-Team: Turkish (http://app.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "Temel GIS alanı." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "Temel Geometri alanı — OpenGIS Özellikleri Geometri türüyle eşlenir." - -msgid "Point" -msgstr "Nokta" - -msgid "Line string" -msgstr "Satır dizgisi" - -msgid "Polygon" -msgstr "Çokgen" - -msgid "Multi-point" -msgstr "Çok noktalı" - -msgid "Multi-line string" -msgstr "Çok satırlı dizgi" - -msgid "Multi polygon" -msgstr "Çoklu çokgen" - -msgid "Geometry collection" -msgstr "Geometri koleksiyonu" - -msgid "Extent Aggregate Field" -msgstr "Toplama Alanını Genişlet" - -msgid "Raster Field" -msgstr "Tarama Alanı" - -msgid "No geometry value provided." -msgstr "Verilen hiç geometri değeri yok." - -msgid "Invalid geometry value." -msgstr "Geçersiz geometri değeri." - -msgid "Invalid geometry type." -msgstr "Geçersiz geometri türü." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"Geometri verisi geometri form alanının SRID değerine dönüştürülürken bir " -"hata meydana geldi." - -msgid "Delete all Features" -msgstr "Tüm Özellikleri Sil" - -msgid "Debugging window (serialized value)" -msgstr "Hata ayıklama penceresi (serileştirilmiş değer)" - -msgid "No feeds are registered." -msgstr "Hiçbir besleme kayıtlı değil." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "%r kısaltması kayıtlı değil." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index 618bfb7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index c54e9f2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,85 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -# v_ildar , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "ГИС" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Нокта" - -msgid "Line string" -msgstr "Сынык сызык" - -msgid "Polygon" -msgstr "Күппочмак" - -msgid "Multi-point" -msgstr "Нокта җыелмасы" - -msgid "Multi-line string" -msgstr "Сынык сызыклар җыелмасы" - -msgid "Multi polygon" -msgstr "Күппочмаклар җыелмасы" - -msgid "Geometry collection" -msgstr "Геометрик объектлар җыелмасы" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Геометрик кыйммәт күрсәтелмәгән." - -msgid "Invalid geometry value." -msgstr "Дөрес булмаган геометрик кыйммәт." - -msgid "Invalid geometry type." -msgstr "Дөрес булмаган геометрик тип." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Геометриядән SRIDгә үзгәртү вакытында хата килеп чыкты." - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/udm/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index 192c21c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/udm/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index 1208f91..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,80 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:35+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "" - -msgid "Line string" -msgstr "" - -msgid "Polygon" -msgstr "" - -msgid "Multi-point" -msgstr "" - -msgid "Multi-line string" -msgstr "" - -msgid "Multi polygon" -msgstr "" - -msgid "Geometry collection" -msgstr "" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "" - -msgid "Invalid geometry value." -msgstr "" - -msgid "Invalid geometry type." -msgstr "" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Google Maps via GeoDjango" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ug/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index 0dff815..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ug/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index b64a663..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abduqadir Abliz , 2023 -# Azat, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Azat, 2023\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "ئاساسىي GIS بۆلىكى." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"ئاساسىي گېئومېتىرىيە سۆز بۆلىكى_OpenGIS ئۆلچەملىك گېئومېتىرىيە تىپىدە ئەكس " -"ئەتتۈرىدۇ." - -msgid "Point" -msgstr "نۇقتا" - -msgid "Line string" -msgstr "قۇر تىزىقى" - -msgid "Polygon" -msgstr "كۆپ تەرەپلىك" - -msgid "Multi-point" -msgstr "كۆپ نۇقتا" - -msgid "Multi-line string" -msgstr "كۆپ قۇر تىزىقى" - -msgid "Multi polygon" -msgstr "نۇرغۇن كۆپ تەرەپلىك" - -msgid "Geometry collection" -msgstr "گېئومېتىرىيە توپلىمى" - -msgid "Extent Aggregate Field" -msgstr "كېڭەيتىلگەن يىغىندا سۆز بۆلىكى" - -msgid "Raster Field" -msgstr "راستىر ساھەسى" - -msgid "No geometry value provided." -msgstr "گېئومېتىرىيە قىممىتى تەمىنلەنمىگەن." - -msgid "Invalid geometry value." -msgstr "گېئومېتىرىيە قىممىتى ئىناۋەتسىز." - -msgid "Invalid geometry type." -msgstr "ئىناۋەتسىز گېئومېتىرىيە تىپى" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"گىئومېتىرىيەلىك شەكىلنى گىئومېتىرىيە جەدۋەل سۆز بۆلىكىدىكى SRID غا " -"ئايلاندۇرغاندا خاتالىق كۆرۈلدى." - -msgid "Delete all Features" -msgstr "ھەممە ئىقتىدارلارنى ئۆچۈر" - -msgid "Debugging window (serialized value)" -msgstr "تەڭشەش كۆزنىكى (سېرىللاشتۇرۇلغان قىممەت)" - -msgid "No feeds are registered." -msgstr "ھېچقانداق مەنبە خەتلەتمىگەن." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r تىزىملىتىلمىغان." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/uk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index cd5c40d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/uk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index f894c66..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,93 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Denis Podlesniy , 2016 -# Illia Volochii , 2021 -# Jannis Leidel , 2011 -# Kirill Gagarski , 2016 -# Max V. Stotsky , 2014 -# Roman Kozlovskyi , 2012 -# Sergey Lysach , 2011 -# Андрей Костенко , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Illia Volochii , 2021\n" -"Language-Team: Ukrainian (http://app.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -msgid "GIS" -msgstr "ГІС" - -msgid "The base GIS field." -msgstr "Базове GIS поле." - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "" -"Базове поле Geometry, яке відповідає типу Geometry із специфікації OpenGIS" - -msgid "Point" -msgstr "Точка" - -msgid "Line string" -msgstr "Ламана" - -msgid "Polygon" -msgstr "Багатокутник" - -msgid "Multi-point" -msgstr "Набір точок" - -msgid "Multi-line string" -msgstr "Набір ламаних" - -msgid "Multi polygon" -msgstr "Набір багатокутників" - -msgid "Geometry collection" -msgstr "Набір геометричних об'єктів" - -msgid "Extent Aggregate Field" -msgstr "Поле, агрегуюче площу чи об'єм" - -msgid "Raster Field" -msgstr "Растрове поле" - -msgid "No geometry value provided." -msgstr "Не задано геометричне значення." - -msgid "Invalid geometry value." -msgstr "Невірне геометричне значення." - -msgid "Invalid geometry type." -msgstr "Невірний геометричний тип." - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Помилка при перетворенні геометрії до SRID геометричного поля форми." - -msgid "Delete all Features" -msgstr "Видалити всі Features" - -msgid "Debugging window (serialized value)" -msgstr "Вікно налагождення (серіалізоване значення)" - -msgid "No feeds are registered." -msgstr "Немає зареєстрованих підписок." - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Слаг %r не зареєстрований." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ur/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index 4b2b784..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ur/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index bb78f46..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,86 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "نقطہ" - -msgid "Line string" -msgstr "لائن سٹرنگ" - -msgid "Polygon" -msgstr "پولی گان" - -msgid "Multi-point" -msgstr "کثیر النقاط" - -msgid "Multi-line string" -msgstr "متعدد لائنوں والا سٹرنگ" - -msgid "Multi polygon" -msgstr "ملٹی پولی گان" - -msgid "Geometry collection" -msgstr "جیومیٹری کا ذخیرہ" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "کوئی جیومیٹری ویلیو مھیا نھیں کی گئی۔" - -msgid "Invalid geometry value." -msgstr "غلط جیومیٹری ویلیو۔" - -msgid "Invalid geometry type." -msgstr "غلط جیومیٹری ٹائپ" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "" -"جیومیٹری کو جیومیٹری کے فارم کے SRID خانے میں تبدیل کرتے ھوئےکوئی خرابی واقع " -"ھو گئی ھے۔" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/vi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index 0295e89..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/vi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index adfc6b5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Thanh Le Viet , 2013 -# Tran , 2011 -# Tran Van , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "" - -msgid "The base GIS field." -msgstr "" - -msgid "" -"The base Geometry field -- maps to the OpenGIS Specification Geometry type." -msgstr "" - -msgid "Point" -msgstr "Điểm" - -msgid "Line string" -msgstr "Đường" - -msgid "Polygon" -msgstr "Đa giác" - -msgid "Multi-point" -msgstr "Đa điểm" - -msgid "Multi-line string" -msgstr "Multi-line string" - -msgid "Multi polygon" -msgstr "Multi polygon" - -msgid "Geometry collection" -msgstr "Kiểu hình học" - -msgid "Extent Aggregate Field" -msgstr "" - -msgid "Raster Field" -msgstr "" - -msgid "No geometry value provided." -msgstr "Không có giá trị geometry" - -msgid "Invalid geometry value." -msgstr "Giá trị geometry không hợp lệ" - -msgid "Invalid geometry type." -msgstr "Kiểu geometry không hợp lệ" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "Có lỗi khi chuyển đổi hình học từ SRID của trường geometry" - -msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Debugging window (serialized value)" -msgstr "" - -msgid "No feeds are registered." -msgstr "Không có feed nào được đăng kí" - -#, python-format -msgid "Slug %r isn't registered." -msgstr "Slug %r không được đăng kí" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index cffabb2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index 6411c6b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,90 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Daniel Duan , 2011 -# Jannis Leidel , 2011 -# Lei Yang , 2011 -# Lele Long , 2011,2015 -# mozillazg , 2016 -# Ronald White , 2014 -# wolf ice , 2020 -# Kevin Sze , 2012 -# 航 柯 , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: wolf ice , 2020\n" -"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "GIS" - -msgid "The base GIS field." -msgstr "基础 GIS 字段。" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "基本几何字段—映射到OpenGIS规范几何类型。" - -msgid "Point" -msgstr "点" - -msgid "Line string" -msgstr "行字串" - -msgid "Polygon" -msgstr "多边形" - -msgid "Multi-point" -msgstr "多点" - -msgid "Multi-line string" -msgstr "多行字符串" - -msgid "Multi polygon" -msgstr "多个多边形" - -msgid "Geometry collection" -msgstr "几何集合" - -msgid "Extent Aggregate Field" -msgstr "扩展聚集字段" - -msgid "Raster Field" -msgstr "光栅字段" - -msgid "No geometry value provided." -msgstr "未提供几何信息。" - -msgid "Invalid geometry value." -msgstr "无效几何信息。" - -msgid "Invalid geometry type." -msgstr "无效几何类型。" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "几何形状转换SRID字段将发生错误" - -msgid "Delete all Features" -msgstr "删除所有要素" - -msgid "Debugging window (serialized value)" -msgstr "调试窗口(已序列化的值)" - -msgid "No feeds are registered." -msgstr "没有已注册的源。" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "字段 %r没被注册" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index c667bc5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index 828b555..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,87 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chen Chun-Chia , 2015 -# ilay , 2012 -# Jannis Leidel , 2011 -# 619e61dbdb61c57213f62815aaf60e01, 2011 -# Tzu-ping Chung , 2016,2019 -# YAO WEN LIANG, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-08-07 18:45+0000\n" -"Last-Translator: YAO WEN LIANG, 2024\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "GIS" -msgstr "地理資訊系統(GIS)" - -msgid "The base GIS field." -msgstr "基礎 GIS 欄位。" - -msgid "" -"The base Geometry field — maps to the OpenGIS Specification Geometry type." -msgstr "基本的 Geometry 欄位——對應於 OpenGIS 規格的 Geometry 類型。" - -msgid "Point" -msgstr "點" - -msgid "Line string" -msgstr "線串" - -msgid "Polygon" -msgstr "多邊形" - -msgid "Multi-point" -msgstr "多點" - -msgid "Multi-line string" -msgstr "多線串" - -msgid "Multi polygon" -msgstr "多個多邊形" - -msgid "Geometry collection" -msgstr "幾何集合" - -msgid "Extent Aggregate Field" -msgstr "聚集程度欄位" - -msgid "Raster Field" -msgstr "光柵欄位" - -msgid "No geometry value provided." -msgstr "未提供幾何資訊。" - -msgid "Invalid geometry value." -msgstr "無效的幾何參數。" - -msgid "Invalid geometry type." -msgstr "無效的幾何類型。" - -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." -msgstr "當把目前地理資訊-GIS,轉成空間參考識別碼-SRID時發生錯誤。" - -msgid "Delete all Features" -msgstr "清空地圖" - -msgid "Debugging window (serialized value)" -msgstr "除錯視窗 (序列化值)" - -msgid "No feeds are registered." -msgstr "沒有已註冊的 feed。" - -#, python-format -msgid "Slug %r isn’t registered." -msgstr "Slug %r 尚未註冊。" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/management/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/management/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/management/commands/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/management/commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/management/commands/inspectdb.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/management/commands/inspectdb.py deleted file mode 100644 index 1bcc1a0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/management/commands/inspectdb.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.core.management.commands.inspectdb import Command as InspectDBCommand - - -class Command(InspectDBCommand): - db_module = "django.contrib.gis.db" - - def get_field_type(self, connection, table_name, row): - field_type, field_params, field_notes = super().get_field_type( - connection, table_name, row - ) - if field_type == "GeometryField": - # Getting a more specific field type and any additional parameters - # from the `get_geometry_type` routine for the spatial backend. - field_type, geo_params = connection.introspection.get_geometry_type( - table_name, row - ) - field_params.update(geo_params) - return field_type, field_params, field_notes diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/management/commands/ogrinspect.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/management/commands/ogrinspect.py deleted file mode 100644 index 2d2bd63..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/management/commands/ogrinspect.py +++ /dev/null @@ -1,164 +0,0 @@ -import argparse - -from django.contrib.gis import gdal -from django.core.management.base import BaseCommand, CommandError -from django.utils.inspect import get_func_args - - -class LayerOptionAction(argparse.Action): - """ - Custom argparse action for the `ogrinspect` `layer_key` keyword option - which may be an integer or a string. - """ - - def __call__(self, parser, namespace, value, option_string=None): - try: - setattr(namespace, self.dest, int(value)) - except ValueError: - setattr(namespace, self.dest, value) - - -class ListOptionAction(argparse.Action): - """ - Custom argparse action for `ogrinspect` keywords that require - a string list. If the string is 'True'/'true' then the option - value will be a boolean instead. - """ - - def __call__(self, parser, namespace, value, option_string=None): - if value.lower() == "true": - setattr(namespace, self.dest, True) - else: - setattr(namespace, self.dest, value.split(",")) - - -class Command(BaseCommand): - help = ( - "Inspects the given OGR-compatible data source (e.g., a shapefile) and " - "outputs\na GeoDjango model with the given model name. For example:\n" - " ./manage.py ogrinspect zipcode.shp Zipcode" - ) - - requires_system_checks = [] - - def add_arguments(self, parser): - parser.add_argument("data_source", help="Path to the data source.") - parser.add_argument("model_name", help="Name of the model to create.") - parser.add_argument( - "--blank", - action=ListOptionAction, - default=False, - help="Use a comma separated list of OGR field names to add " - "the `blank=True` option to the field definition. Set to `true` " - "to apply to all applicable fields.", - ) - parser.add_argument( - "--decimal", - action=ListOptionAction, - default=False, - help="Use a comma separated list of OGR float fields to " - "generate `DecimalField` instead of the default " - "`FloatField`. Set to `true` to apply to all OGR float fields.", - ) - parser.add_argument( - "--geom-name", - default="geom", - help="Specifies the model name for the Geometry Field (defaults to `geom`)", - ) - parser.add_argument( - "--layer", - dest="layer_key", - action=LayerOptionAction, - default=0, - help="The key for specifying which layer in the OGR data " - "source to use. Defaults to 0 (the first layer). May be " - "an integer or a string identifier for the layer.", - ) - parser.add_argument( - "--multi-geom", - action="store_true", - help="Treat the geometry in the data source as a geometry collection.", - ) - parser.add_argument( - "--name-field", - help="Specifies a field name to return for the __str__() method.", - ) - parser.add_argument( - "--no-imports", - action="store_false", - dest="imports", - help="Do not include `from django.contrib.gis.db import models` statement.", - ) - parser.add_argument( - "--null", - action=ListOptionAction, - default=False, - help="Use a comma separated list of OGR field names to add " - "the `null=True` option to the field definition. Set to `true` " - "to apply to all applicable fields.", - ) - parser.add_argument( - "--srid", - help="The SRID to use for the Geometry Field. If it can be " - "determined, the SRID of the data source is used.", - ) - parser.add_argument( - "--mapping", - action="store_true", - help="Generate mapping dictionary for use with `LayerMapping`.", - ) - - def handle(self, *args, **options): - data_source, model_name = options.pop("data_source"), options.pop("model_name") - - # Getting the OGR DataSource from the string parameter. - try: - ds = gdal.DataSource(data_source) - except gdal.GDALException as msg: - raise CommandError(msg) - - # Returning the output of ogrinspect with the given arguments - # and options. - from django.contrib.gis.utils.ogrinspect import _ogrinspect, mapping - - # Filter options to params accepted by `_ogrinspect` - ogr_options = { - k: v - for k, v in options.items() - if k in get_func_args(_ogrinspect) and v is not None - } - output = [s for s in _ogrinspect(ds, model_name, **ogr_options)] - - if options["mapping"]: - # Constructing the keyword arguments for `mapping`, and - # calling it on the data source. - kwargs = { - "geom_name": options["geom_name"], - "layer_key": options["layer_key"], - "multi_geom": options["multi_geom"], - } - mapping_dict = mapping(ds, **kwargs) - # This extra legwork is so that the dictionary definition comes - # out in the same order as the fields in the model definition. - rev_mapping = {v: k for k, v in mapping_dict.items()} - output.extend( - [ - "", - "", - "# Auto-generated `LayerMapping` dictionary for %s model" - % model_name, - "%s_mapping = {" % model_name.lower(), - ] - ) - output.extend( - " '%s': '%s'," % (rev_mapping[ogr_fld], ogr_fld) - for ogr_fld in ds[options["layer_key"]].fields - ) - output.extend( - [ - " '%s': '%s'," - % (options["geom_name"], mapping_dict[options["geom_name"]]), - "}", - ] - ) - return "\n".join(output) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/measure.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/measure.py deleted file mode 100644 index 707c061..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/measure.py +++ /dev/null @@ -1,373 +0,0 @@ -# Copyright (c) 2007, Robert Coup -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# 3. Neither the name of Distance nor the names of its contributors may be used -# to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -""" -Distance and Area objects to allow for sensible and convenient calculation -and conversions. - -Authors: Robert Coup, Justin Bronn, Riccardo Di Virgilio - -Inspired by GeoPy (https://github.com/geopy/geopy) -and Geoff Biggs' PhD work on dimensioned units for robotics. -""" -from decimal import Decimal -from functools import total_ordering - -__all__ = ["A", "Area", "D", "Distance"] - -NUMERIC_TYPES = (int, float, Decimal) -AREA_PREFIX = "sq_" - - -def pretty_name(obj): - return obj.__name__ if obj.__class__ == type else obj.__class__.__name__ - - -@total_ordering -class MeasureBase: - STANDARD_UNIT = None - ALIAS = {} - UNITS = {} - LALIAS = {} - - def __init__(self, default_unit=None, **kwargs): - value, self._default_unit = self.default_units(kwargs) - setattr(self, self.STANDARD_UNIT, value) - if default_unit and isinstance(default_unit, str): - self._default_unit = default_unit - - def _get_standard(self): - return getattr(self, self.STANDARD_UNIT) - - def _set_standard(self, value): - setattr(self, self.STANDARD_UNIT, value) - - standard = property(_get_standard, _set_standard) - - def __getattr__(self, name): - if name in self.UNITS: - return self.standard / self.UNITS[name] - else: - raise AttributeError("Unknown unit type: %s" % name) - - def __repr__(self): - return "%s(%s=%s)" % ( - pretty_name(self), - self._default_unit, - getattr(self, self._default_unit), - ) - - def __str__(self): - return "%s %s" % (getattr(self, self._default_unit), self._default_unit) - - # **** Comparison methods **** - - def __eq__(self, other): - if isinstance(other, self.__class__): - return self.standard == other.standard - else: - return NotImplemented - - def __hash__(self): - return hash(self.standard) - - def __lt__(self, other): - if isinstance(other, self.__class__): - return self.standard < other.standard - else: - return NotImplemented - - # **** Operators methods **** - - def __add__(self, other): - if isinstance(other, self.__class__): - return self.__class__( - default_unit=self._default_unit, - **{self.STANDARD_UNIT: (self.standard + other.standard)}, - ) - else: - raise TypeError( - "%(class)s must be added with %(class)s" % {"class": pretty_name(self)} - ) - - def __iadd__(self, other): - if isinstance(other, self.__class__): - self.standard += other.standard - return self - else: - raise TypeError( - "%(class)s must be added with %(class)s" % {"class": pretty_name(self)} - ) - - def __sub__(self, other): - if isinstance(other, self.__class__): - return self.__class__( - default_unit=self._default_unit, - **{self.STANDARD_UNIT: (self.standard - other.standard)}, - ) - else: - raise TypeError( - "%(class)s must be subtracted from %(class)s" - % {"class": pretty_name(self)} - ) - - def __isub__(self, other): - if isinstance(other, self.__class__): - self.standard -= other.standard - return self - else: - raise TypeError( - "%(class)s must be subtracted from %(class)s" - % {"class": pretty_name(self)} - ) - - def __mul__(self, other): - if isinstance(other, NUMERIC_TYPES): - return self.__class__( - default_unit=self._default_unit, - **{self.STANDARD_UNIT: (self.standard * other)}, - ) - else: - raise TypeError( - "%(class)s must be multiplied with number" - % {"class": pretty_name(self)} - ) - - def __imul__(self, other): - if isinstance(other, NUMERIC_TYPES): - self.standard *= float(other) - return self - else: - raise TypeError( - "%(class)s must be multiplied with number" - % {"class": pretty_name(self)} - ) - - def __rmul__(self, other): - return self * other - - def __truediv__(self, other): - if isinstance(other, self.__class__): - return self.standard / other.standard - if isinstance(other, NUMERIC_TYPES): - return self.__class__( - default_unit=self._default_unit, - **{self.STANDARD_UNIT: (self.standard / other)}, - ) - else: - raise TypeError( - "%(class)s must be divided with number or %(class)s" - % {"class": pretty_name(self)} - ) - - def __itruediv__(self, other): - if isinstance(other, NUMERIC_TYPES): - self.standard /= float(other) - return self - else: - raise TypeError( - "%(class)s must be divided with number" % {"class": pretty_name(self)} - ) - - def __bool__(self): - return bool(self.standard) - - def default_units(self, kwargs): - """ - Return the unit value and the default units specified - from the given keyword arguments dictionary. - """ - val = 0.0 - default_unit = self.STANDARD_UNIT - for unit, value in kwargs.items(): - if not isinstance(value, float): - value = float(value) - if unit in self.UNITS: - val += self.UNITS[unit] * value - default_unit = unit - elif unit in self.ALIAS: - u = self.ALIAS[unit] - val += self.UNITS[u] * value - default_unit = u - else: - lower = unit.lower() - if lower in self.UNITS: - val += self.UNITS[lower] * value - default_unit = lower - elif lower in self.LALIAS: - u = self.LALIAS[lower] - val += self.UNITS[u] * value - default_unit = u - else: - raise AttributeError("Unknown unit type: %s" % unit) - return val, default_unit - - @classmethod - def unit_attname(cls, unit_str): - """ - Retrieve the unit attribute name for the given unit string. - For example, if the given unit string is 'metre', return 'm'. - Raise an AttributeError if an attribute cannot be found. - """ - lower = unit_str.lower() - if unit_str in cls.UNITS: - return unit_str - elif lower in cls.UNITS: - return lower - elif lower in cls.LALIAS: - return cls.LALIAS[lower] - else: - raise AttributeError(f"Unknown unit type: {unit_str}") - - -class Distance(MeasureBase): - STANDARD_UNIT = "m" - UNITS = { - "chain": 20.1168, - "chain_benoit": 20.116782, - "chain_sears": 20.1167645, - "british_chain_benoit": 20.1167824944, - "british_chain_sears": 20.1167651216, - "british_chain_sears_truncated": 20.116756, - "cm": 0.01, - "british_ft": 0.304799471539, - "british_yd": 0.914398414616, - "clarke_ft": 0.3047972654, - "clarke_link": 0.201166195164, - "fathom": 1.8288, - "ft": 0.3048, - "furlong": 201.168, - "german_m": 1.0000135965, - "gold_coast_ft": 0.304799710181508, - "indian_yd": 0.914398530744, - "inch": 0.0254, - "km": 1000.0, - "link": 0.201168, - "link_benoit": 0.20116782, - "link_sears": 0.20116765, - "m": 1.0, - "mi": 1609.344, - "mm": 0.001, - "nm": 1852.0, - "nm_uk": 1853.184, - "rod": 5.0292, - "sears_yd": 0.91439841, - "survey_ft": 0.304800609601, - "um": 0.000001, - "yd": 0.9144, - } - - # Unit aliases for `UNIT` terms encountered in Spatial Reference WKT. - ALIAS = { - "centimeter": "cm", - "foot": "ft", - "inches": "inch", - "kilometer": "km", - "kilometre": "km", - "meter": "m", - "metre": "m", - "micrometer": "um", - "micrometre": "um", - "millimeter": "mm", - "millimetre": "mm", - "mile": "mi", - "yard": "yd", - "British chain (Benoit 1895 B)": "british_chain_benoit", - "British chain (Sears 1922)": "british_chain_sears", - "British chain (Sears 1922 truncated)": "british_chain_sears_truncated", - "British foot (Sears 1922)": "british_ft", - "British foot": "british_ft", - "British yard (Sears 1922)": "british_yd", - "British yard": "british_yd", - "Clarke's Foot": "clarke_ft", - "Clarke's link": "clarke_link", - "Chain (Benoit)": "chain_benoit", - "Chain (Sears)": "chain_sears", - "Foot (International)": "ft", - "Furrow Long": "furlong", - "German legal metre": "german_m", - "Gold Coast foot": "gold_coast_ft", - "Indian yard": "indian_yd", - "Link (Benoit)": "link_benoit", - "Link (Sears)": "link_sears", - "Nautical Mile": "nm", - "Nautical Mile (UK)": "nm_uk", - "US survey foot": "survey_ft", - "U.S. Foot": "survey_ft", - "Yard (Indian)": "indian_yd", - "Yard (Sears)": "sears_yd", - } - LALIAS = {k.lower(): v for k, v in ALIAS.items()} - - def __mul__(self, other): - if isinstance(other, self.__class__): - return Area( - default_unit=AREA_PREFIX + self._default_unit, - **{AREA_PREFIX + self.STANDARD_UNIT: (self.standard * other.standard)}, - ) - elif isinstance(other, NUMERIC_TYPES): - return self.__class__( - default_unit=self._default_unit, - **{self.STANDARD_UNIT: (self.standard * other)}, - ) - else: - raise TypeError( - "%(distance)s must be multiplied with number or %(distance)s" - % { - "distance": pretty_name(self.__class__), - } - ) - - -class Area(MeasureBase): - STANDARD_UNIT = AREA_PREFIX + Distance.STANDARD_UNIT - # Getting the square units values and the alias dictionary. - UNITS = {"%s%s" % (AREA_PREFIX, k): v**2 for k, v in Distance.UNITS.items()} | { - "ha": 10000, - } - ALIAS = {k: "%s%s" % (AREA_PREFIX, v) for k, v in Distance.ALIAS.items()} | { - "hectare": "ha", - } - - LALIAS = {k.lower(): v for k, v in ALIAS.items()} - - def __truediv__(self, other): - if isinstance(other, NUMERIC_TYPES): - return self.__class__( - default_unit=self._default_unit, - **{self.STANDARD_UNIT: (self.standard / other)}, - ) - else: - raise TypeError( - "%(class)s must be divided by a number" % {"class": pretty_name(self)} - ) - - -# Shortcuts -D = Distance -A = Area diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/ptr.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/ptr.py deleted file mode 100644 index 6754701..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/ptr.py +++ /dev/null @@ -1,41 +0,0 @@ -from ctypes import c_void_p - - -class CPointerBase: - """ - Base class for objects that have a pointer access property - that controls access to the underlying C pointer. - """ - - _ptr = None # Initially the pointer is NULL. - ptr_type = c_void_p - destructor = None - null_ptr_exception_class = AttributeError - - @property - def ptr(self): - # Raise an exception if the pointer isn't valid so that NULL pointers - # aren't passed to routines -- that's very bad. - if self._ptr: - return self._ptr - raise self.null_ptr_exception_class( - "NULL %s pointer encountered." % self.__class__.__name__ - ) - - @ptr.setter - def ptr(self, ptr): - # Only allow the pointer to be set with pointers of the compatible - # type or None (NULL). - if not (ptr is None or isinstance(ptr, self.ptr_type)): - raise TypeError("Incompatible pointer type: %s." % type(ptr)) - self._ptr = ptr - - def __del__(self): - """ - Free the memory used by the C++ object. - """ - if self.destructor and self._ptr: - try: - self.destructor(self.ptr) - except (AttributeError, ImportError, TypeError): - pass # Some part might already have been garbage collected diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/serializers/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/serializers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/serializers/geojson.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/serializers/geojson.py deleted file mode 100644 index 187af26..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/serializers/geojson.py +++ /dev/null @@ -1,77 +0,0 @@ -import json - -from django.contrib.gis.gdal import CoordTransform, SpatialReference -from django.core.serializers.base import SerializerDoesNotExist -from django.core.serializers.json import Serializer as JSONSerializer - - -class Serializer(JSONSerializer): - """ - Convert a queryset to GeoJSON, http://geojson.org/ - """ - - def _init_options(self): - super()._init_options() - self.geometry_field = self.json_kwargs.pop("geometry_field", None) - self.id_field = self.json_kwargs.pop("id_field", None) - self.srid = self.json_kwargs.pop("srid", 4326) - if ( - self.selected_fields is not None - and self.geometry_field is not None - and self.geometry_field not in self.selected_fields - ): - self.selected_fields = [*self.selected_fields, self.geometry_field] - - def start_serialization(self): - self._init_options() - self._cts = {} # cache of CoordTransform's - self.stream.write('{"type": "FeatureCollection", "features": [') - - def end_serialization(self): - self.stream.write("]}") - - def start_object(self, obj): - super().start_object(obj) - self._geometry = None - if self.geometry_field is None: - # Find the first declared geometry field - for field in obj._meta.fields: - if hasattr(field, "geom_type"): - self.geometry_field = field.name - break - - def get_dump_object(self, obj): - data = { - "type": "Feature", - "id": obj.pk if self.id_field is None else getattr(obj, self.id_field), - "properties": self._current, - } - if ( - self.selected_fields is None or "pk" in self.selected_fields - ) and "pk" not in data["properties"]: - data["properties"]["pk"] = obj._meta.pk.value_to_string(obj) - if self._geometry: - if self._geometry.srid != self.srid: - # If needed, transform the geometry in the srid of the global - # geojson srid. - if self._geometry.srid not in self._cts: - srs = SpatialReference(self.srid) - self._cts[self._geometry.srid] = CoordTransform( - self._geometry.srs, srs - ) - self._geometry.transform(self._cts[self._geometry.srid]) - data["geometry"] = json.loads(self._geometry.geojson) - else: - data["geometry"] = None - return data - - def handle_field(self, obj, field): - if field.name == self.geometry_field: - self._geometry = field.value_from_object(obj) - else: - super().handle_field(obj, field) - - -class Deserializer: - def __init__(self, *args, **kwargs): - raise SerializerDoesNotExist("geojson is a serialization-only serializer") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/shortcuts.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/shortcuts.py deleted file mode 100644 index 33ff2ac..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/shortcuts.py +++ /dev/null @@ -1,40 +0,0 @@ -import zipfile -from io import BytesIO - -from django.conf import settings -from django.http import HttpResponse -from django.template import loader - -# NumPy supported? -try: - import numpy -except ImportError: - numpy = False - - -def compress_kml(kml): - "Return compressed KMZ from the given KML string." - kmz = BytesIO() - with zipfile.ZipFile(kmz, "a", zipfile.ZIP_DEFLATED) as zf: - zf.writestr("doc.kml", kml.encode(settings.DEFAULT_CHARSET)) - kmz.seek(0) - return kmz.read() - - -def render_to_kml(*args, **kwargs): - "Render the response as KML (using the correct MIME type)." - return HttpResponse( - loader.render_to_string(*args, **kwargs), - content_type="application/vnd.google-earth.kml+xml", - ) - - -def render_to_kmz(*args, **kwargs): - """ - Compress the KML content and return as KMZ (using the correct - MIME type). - """ - return HttpResponse( - compress_kml(loader.render_to_string(*args, **kwargs)), - content_type="application/vnd.google-earth.kmz", - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/sitemaps/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/sitemaps/__init__.py deleted file mode 100644 index 3654bfc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/sitemaps/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Geo-enabled Sitemap classes. -from django.contrib.gis.sitemaps.kml import KMLSitemap, KMZSitemap - -__all__ = ["KMLSitemap", "KMZSitemap"] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/sitemaps/kml.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/sitemaps/kml.py deleted file mode 100644 index a84b5ae..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/sitemaps/kml.py +++ /dev/null @@ -1,78 +0,0 @@ -from django.apps import apps -from django.contrib.gis.db.models import GeometryField -from django.contrib.sitemaps import Sitemap -from django.db import models -from django.urls import reverse - - -class KMLSitemap(Sitemap): - """ - A minimal hook to produce KML sitemaps. - """ - - geo_format = "kml" - - def __init__(self, locations=None): - # If no locations specified, then we try to build for - # every model in installed applications. - self.locations = self._build_kml_sources(locations) - - def _build_kml_sources(self, sources): - """ - Go through the given sources and return a 3-tuple of the application - label, module name, and field name of every GeometryField encountered - in the sources. - - If no sources are provided, then all models. - """ - kml_sources = [] - if sources is None: - sources = apps.get_models() - for source in sources: - if isinstance(source, models.base.ModelBase): - for field in source._meta.fields: - if isinstance(field, GeometryField): - kml_sources.append( - ( - source._meta.app_label, - source._meta.model_name, - field.name, - ) - ) - elif isinstance(source, (list, tuple)): - if len(source) != 3: - raise ValueError( - "Must specify a 3-tuple of (app_label, module_name, " - "field_name)." - ) - kml_sources.append(source) - else: - raise TypeError("KML Sources must be a model or a 3-tuple.") - return kml_sources - - def get_urls(self, page=1, site=None, protocol=None): - """ - This method is overridden so the appropriate `geo_format` attribute - is placed on each URL element. - """ - urls = Sitemap.get_urls(self, page=page, site=site, protocol=protocol) - for url in urls: - url["geo_format"] = self.geo_format - return urls - - def items(self): - return self.locations - - def location(self, obj): - return reverse( - "django.contrib.gis.sitemaps.views.%s" % self.geo_format, - kwargs={ - "label": obj[0], - "model": obj[1], - "field_name": obj[2], - }, - ) - - -class KMZSitemap(KMLSitemap): - geo_format = "kmz" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/sitemaps/views.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/sitemaps/views.py deleted file mode 100644 index 17eb54e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/sitemaps/views.py +++ /dev/null @@ -1,65 +0,0 @@ -from django.apps import apps -from django.contrib.gis.db.models import GeometryField -from django.contrib.gis.db.models.functions import AsKML, Transform -from django.contrib.gis.shortcuts import render_to_kml, render_to_kmz -from django.core.exceptions import FieldDoesNotExist -from django.db import DEFAULT_DB_ALIAS, connections -from django.http import Http404 - - -def kml(request, label, model, field_name=None, compress=False, using=DEFAULT_DB_ALIAS): - """ - This view generates KML for the given app label, model, and field name. - - The field name must be that of a geographic field. - """ - placemarks = [] - try: - klass = apps.get_model(label, model) - except LookupError: - raise Http404( - 'You must supply a valid app label and module name. Got "%s.%s"' - % (label, model) - ) - - if field_name: - try: - field = klass._meta.get_field(field_name) - if not isinstance(field, GeometryField): - raise FieldDoesNotExist - except FieldDoesNotExist: - raise Http404("Invalid geometry field.") - - connection = connections[using] - - if connection.features.has_AsKML_function: - # Database will take care of transformation. - placemarks = klass._default_manager.using(using).annotate(kml=AsKML(field_name)) - else: - # If the database offers no KML method, we use the `kml` - # attribute of the lazy geometry instead. - placemarks = [] - if connection.features.has_Transform_function: - qs = klass._default_manager.using(using).annotate( - **{"%s_4326" % field_name: Transform(field_name, 4326)} - ) - field_name += "_4326" - else: - qs = klass._default_manager.using(using).all() - for mod in qs: - mod.kml = getattr(mod, field_name).kml - placemarks.append(mod) - - # Getting the render function and rendering to the correct. - if compress: - render = render_to_kmz - else: - render = render_to_kml - return render("gis/kml/placemarks.kml", {"places": placemarks}) - - -def kmz(request, label, model, field_name=None, using=DEFAULT_DB_ALIAS): - """ - Return KMZ for the given app label, model, and field name. - """ - return kml(request, label, model, field_name, compress=True, using=using) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/css/ol3.css b/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/css/ol3.css deleted file mode 100644 index ac8f0a8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/css/ol3.css +++ /dev/null @@ -1,39 +0,0 @@ -.dj_map_wrapper { - position: relative; - float: left; -} -html[dir="rtl"] .dj_map_wrapper { - float: right; -} - -.switch-type { - background-repeat: no-repeat; - cursor: pointer; - top: 0.5em; - width: 22px; - height: 20px; -} - -.type-Point { - background-image: url("../img/draw_point_off.svg"); - right: 5px; -} -.type-Point.type-active { - background-image: url("../img/draw_point_on.svg"); -} - -.type-LineString { - background-image: url("../img/draw_line_off.svg"); - right: 30px; -} -.type-LineString.type-active { - background-image: url("../img/draw_line_on.svg"); -} - -.type-Polygon { - background-image: url("../img/draw_polygon_off.svg"); - right: 55px; -} -.type-Polygon.type-active { - background-image: url("../img/draw_polygon_on.svg"); -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_line_off.svg b/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_line_off.svg deleted file mode 100644 index c403af6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_line_off.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_line_on.svg b/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_line_on.svg deleted file mode 100644 index 5eb0d6d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_line_on.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_point_off.svg b/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_point_off.svg deleted file mode 100644 index 5a29034..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_point_off.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_point_on.svg b/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_point_on.svg deleted file mode 100644 index f006524..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_point_on.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_polygon_off.svg b/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_polygon_off.svg deleted file mode 100644 index b02dd35..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_polygon_off.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_polygon_on.svg b/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_polygon_on.svg deleted file mode 100644 index 303a02a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/img/draw_polygon_on.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/js/OLMapWidget.js b/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/js/OLMapWidget.js deleted file mode 100644 index a545036..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/static/gis/js/OLMapWidget.js +++ /dev/null @@ -1,233 +0,0 @@ -/* global ol */ -'use strict'; -class GeometryTypeControl extends ol.control.Control { - // Map control to switch type when geometry type is unknown - constructor(opt_options) { - const options = opt_options || {}; - - const element = document.createElement('div'); - element.className = 'switch-type type-' + options.type + ' ol-control ol-unselectable'; - if (options.active) { - element.classList.add("type-active"); - } - - super({ - element: element, - target: options.target - }); - const self = this; - const switchType = function(e) { - e.preventDefault(); - if (options.widget.currentGeometryType !== self) { - options.widget.map.removeInteraction(options.widget.interactions.draw); - options.widget.interactions.draw = new ol.interaction.Draw({ - features: options.widget.featureCollection, - type: options.type - }); - options.widget.map.addInteraction(options.widget.interactions.draw); - options.widget.currentGeometryType.element.classList.remove('type-active'); - options.widget.currentGeometryType = self; - element.classList.add("type-active"); - } - }; - - element.addEventListener('click', switchType, false); - element.addEventListener('touchstart', switchType, false); - } -} - -// TODO: allow deleting individual features (#8972) -class MapWidget { - constructor(options) { - this.map = null; - this.interactions = {draw: null, modify: null}; - this.typeChoices = false; - this.ready = false; - - // Default options - this.options = { - default_lat: 0, - default_lon: 0, - default_zoom: 12, - is_collection: options.geom_name.includes('Multi') || options.geom_name.includes('Collection') - }; - - // Altering using user-provided options - for (const property in options) { - if (Object.hasOwn(options, property)) { - this.options[property] = options[property]; - } - } - if (!options.base_layer) { - this.options.base_layer = new ol.layer.Tile({source: new ol.source.OSM()}); - } - - this.map = this.createMap(); - this.featureCollection = new ol.Collection(); - this.featureOverlay = new ol.layer.Vector({ - map: this.map, - source: new ol.source.Vector({ - features: this.featureCollection, - useSpatialIndex: false // improve performance - }), - updateWhileAnimating: true, // optional, for instant visual feedback - updateWhileInteracting: true // optional, for instant visual feedback - }); - - // Populate and set handlers for the feature container - const self = this; - this.featureCollection.on('add', function(event) { - const feature = event.element; - feature.on('change', function() { - self.serializeFeatures(); - }); - if (self.ready) { - self.serializeFeatures(); - if (!self.options.is_collection) { - self.disableDrawing(); // Only allow one feature at a time - } - } - }); - - const initial_value = document.getElementById(this.options.id).value; - if (initial_value) { - const jsonFormat = new ol.format.GeoJSON(); - const features = jsonFormat.readFeatures('{"type": "Feature", "geometry": ' + initial_value + '}'); - const extent = ol.extent.createEmpty(); - features.forEach(function(feature) { - this.featureOverlay.getSource().addFeature(feature); - ol.extent.extend(extent, feature.getGeometry().getExtent()); - }, this); - // Center/zoom the map - this.map.getView().fit(extent, {minResolution: 1}); - } else { - this.map.getView().setCenter(this.defaultCenter()); - } - this.createInteractions(); - if (initial_value && !this.options.is_collection) { - this.disableDrawing(); - } - const clearNode = document.getElementById(this.map.getTarget()).nextElementSibling; - if (clearNode.classList.contains('clear_features')) { - clearNode.querySelector('a').addEventListener('click', (ev) => { - ev.preventDefault(); - self.clearFeatures(); - }); - } - this.ready = true; - } - - createMap() { - return new ol.Map({ - target: this.options.map_id, - layers: [this.options.base_layer], - view: new ol.View({ - zoom: this.options.default_zoom - }) - }); - } - - createInteractions() { - // Initialize the modify interaction - this.interactions.modify = new ol.interaction.Modify({ - features: this.featureCollection, - deleteCondition: function(event) { - return ol.events.condition.shiftKeyOnly(event) && - ol.events.condition.singleClick(event); - } - }); - - // Initialize the draw interaction - let geomType = this.options.geom_name; - if (geomType === "Geometry" || geomType === "GeometryCollection") { - // Default to Point, but create icons to switch type - geomType = "Point"; - this.currentGeometryType = new GeometryTypeControl({widget: this, type: "Point", active: true}); - this.map.addControl(this.currentGeometryType); - this.map.addControl(new GeometryTypeControl({widget: this, type: "LineString", active: false})); - this.map.addControl(new GeometryTypeControl({widget: this, type: "Polygon", active: false})); - this.typeChoices = true; - } - this.interactions.draw = new ol.interaction.Draw({ - features: this.featureCollection, - type: geomType - }); - - this.map.addInteraction(this.interactions.draw); - this.map.addInteraction(this.interactions.modify); - } - - defaultCenter() { - const center = [this.options.default_lon, this.options.default_lat]; - if (this.options.map_srid) { - return ol.proj.transform(center, 'EPSG:4326', this.map.getView().getProjection()); - } - return center; - } - - enableDrawing() { - this.interactions.draw.setActive(true); - if (this.typeChoices) { - // Show geometry type icons - const divs = document.getElementsByClassName("switch-type"); - for (let i = 0; i !== divs.length; i++) { - divs[i].style.visibility = "visible"; - } - } - } - - disableDrawing() { - if (this.interactions.draw) { - this.interactions.draw.setActive(false); - if (this.typeChoices) { - // Hide geometry type icons - const divs = document.getElementsByClassName("switch-type"); - for (let i = 0; i !== divs.length; i++) { - divs[i].style.visibility = "hidden"; - } - } - } - } - - clearFeatures() { - this.featureCollection.clear(); - // Empty textarea widget - document.getElementById(this.options.id).value = ''; - this.enableDrawing(); - } - - serializeFeatures() { - // Three use cases: GeometryCollection, multigeometries, and single geometry - let geometry = null; - const features = this.featureOverlay.getSource().getFeatures(); - if (this.options.is_collection) { - if (this.options.geom_name === "GeometryCollection") { - const geometries = []; - for (let i = 0; i < features.length; i++) { - geometries.push(features[i].getGeometry()); - } - geometry = new ol.geom.GeometryCollection(geometries); - } else { - geometry = features[0].getGeometry().clone(); - for (let j = 1; j < features.length; j++) { - switch (geometry.getType()) { - case "MultiPoint": - geometry.appendPoint(features[j].getGeometry().getPoint(0)); - break; - case "MultiLineString": - geometry.appendLineString(features[j].getGeometry().getLineString(0)); - break; - case "MultiPolygon": - geometry.appendPolygon(features[j].getGeometry().getPolygon(0)); - } - } - } - } else { - if (features[0]) { - geometry = features[0].getGeometry(); - } - } - const jsonFormat = new ol.format.GeoJSON(); - document.getElementById(this.options.id).value = jsonFormat.writeGeometry(geometry); - } -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/kml/base.kml b/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/kml/base.kml deleted file mode 100644 index 374404c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/kml/base.kml +++ /dev/null @@ -1,6 +0,0 @@ - - -{% block name %}{% endblock %} -{% block placemarks %}{% endblock %} - - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/kml/placemarks.kml b/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/kml/placemarks.kml deleted file mode 100644 index ea2ac19..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/kml/placemarks.kml +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "gis/kml/base.kml" %} -{% block placemarks %}{% for place in places %} - - {% if place.name %}{{ place.name }}{% else %}{{ place }}{% endif %} - {% if place.description %}{{ place.description }}{% else %}{{ place }}{% endif %} - {{ place.kml|safe }} - {% endfor %}{% endblock %} - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/openlayers-osm.html b/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/openlayers-osm.html deleted file mode 100644 index 88b1c8c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/openlayers-osm.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "gis/openlayers.html" %} -{% load l10n %} - -{% block options %}{{ block.super }} -options['default_lon'] = {{ default_lon|unlocalize }}; -options['default_lat'] = {{ default_lat|unlocalize }}; -options['default_zoom'] = {{ default_zoom|unlocalize }}; -{% endblock %} - -{% block base_layer %} -var base_layer = new ol.layer.Tile({source: new ol.source.OSM()}); -{% endblock %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/openlayers.html b/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/openlayers.html deleted file mode 100644 index f9f7e5f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/templates/gis/openlayers.html +++ /dev/null @@ -1,32 +0,0 @@ -{% load i18n l10n %} - -
    -
    - {% if not disabled %}{% translate "Delete all Features" %}{% endif %} - {% if display_raw %}

    {% translate "Debugging window (serialized value)" %}

    {% endif %} - - -
    diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/__init__.py deleted file mode 100644 index 92ff64d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -""" -This module contains useful utilities for GeoDjango. -""" - -from django.contrib.gis.utils.ogrinfo import ogrinfo -from django.contrib.gis.utils.ogrinspect import mapping, ogrinspect -from django.contrib.gis.utils.srs import add_srs_entry -from django.core.exceptions import ImproperlyConfigured - -__all__ = [ - "add_srs_entry", - "mapping", - "ogrinfo", - "ogrinspect", -] - -try: - # LayerMapping requires DJANGO_SETTINGS_MODULE to be set, - # and ImproperlyConfigured is raised if that's not the case. - from django.contrib.gis.utils.layermapping import LayerMapError, LayerMapping - - __all__ += ["LayerMapError", "LayerMapping"] - -except ImproperlyConfigured: - pass diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/layermapping.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/layermapping.py deleted file mode 100644 index 137dd6b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/layermapping.py +++ /dev/null @@ -1,728 +0,0 @@ -# LayerMapping -- A Django Model/OGR Layer Mapping Utility -""" -The LayerMapping class provides a way to map the contents of OGR -vector files (e.g. SHP files) to Geographic-enabled Django models. - -For more information, please consult the GeoDjango documentation: - https://docs.djangoproject.com/en/dev/ref/contrib/gis/layermapping/ -""" -import sys -from decimal import Decimal -from decimal import InvalidOperation as DecimalInvalidOperation -from pathlib import Path - -from django.contrib.gis.db.models import GeometryField -from django.contrib.gis.gdal import ( - CoordTransform, - DataSource, - GDALException, - OGRGeometry, - OGRGeomType, - SpatialReference, -) -from django.contrib.gis.gdal.field import ( - OFTDate, - OFTDateTime, - OFTInteger, - OFTInteger64, - OFTReal, - OFTString, - OFTTime, -) -from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist -from django.db import connections, models, router, transaction -from django.utils.encoding import force_str - - -# LayerMapping exceptions. -class LayerMapError(Exception): - pass - - -class InvalidString(LayerMapError): - pass - - -class InvalidDecimal(LayerMapError): - pass - - -class InvalidInteger(LayerMapError): - pass - - -class MissingForeignKey(LayerMapError): - pass - - -class LayerMapping: - "A class that maps OGR Layers to GeoDjango Models." - - # Acceptable 'base' types for a multi-geometry type. - MULTI_TYPES = { - 1: OGRGeomType("MultiPoint"), - 2: OGRGeomType("MultiLineString"), - 3: OGRGeomType("MultiPolygon"), - OGRGeomType("Point25D").num: OGRGeomType("MultiPoint25D"), - OGRGeomType("LineString25D").num: OGRGeomType("MultiLineString25D"), - OGRGeomType("Polygon25D").num: OGRGeomType("MultiPolygon25D"), - } - # Acceptable Django field types and corresponding acceptable OGR - # counterparts. - FIELD_TYPES = { - models.AutoField: OFTInteger, - models.BigAutoField: OFTInteger64, - models.SmallAutoField: OFTInteger, - models.BooleanField: (OFTInteger, OFTReal, OFTString), - models.IntegerField: (OFTInteger, OFTReal, OFTString), - models.FloatField: (OFTInteger, OFTReal), - models.DateField: OFTDate, - models.DateTimeField: OFTDateTime, - models.EmailField: OFTString, - models.TimeField: OFTTime, - models.DecimalField: (OFTInteger, OFTReal), - models.CharField: OFTString, - models.SlugField: OFTString, - models.TextField: OFTString, - models.URLField: OFTString, - models.UUIDField: OFTString, - models.BigIntegerField: (OFTInteger, OFTReal, OFTString), - models.SmallIntegerField: (OFTInteger, OFTReal, OFTString), - models.PositiveBigIntegerField: (OFTInteger, OFTReal, OFTString), - models.PositiveIntegerField: (OFTInteger, OFTReal, OFTString), - models.PositiveSmallIntegerField: (OFTInteger, OFTReal, OFTString), - } - - def __init__( - self, - model, - data, - mapping, - layer=0, - source_srs=None, - encoding="utf-8", - transaction_mode="commit_on_success", - transform=True, - unique=None, - using=None, - ): - """ - A LayerMapping object is initialized using the given Model (not an instance), - a DataSource (or string path to an OGR-supported data file), and a mapping - dictionary. See the module level docstring for more details and keyword - argument usage. - """ - # Getting the DataSource and the associated Layer. - if isinstance(data, (str, Path)): - self.ds = DataSource(data, encoding=encoding) - else: - self.ds = data - self.layer = self.ds[layer] - - self.using = using if using is not None else router.db_for_write(model) - connection = connections[self.using] - self.spatial_backend = connection.ops - - # Setting the mapping & model attributes. - self.mapping = mapping - self.model = model - - # Checking the layer -- initialization of the object will fail if - # things don't check out before hand. - self.check_layer() - - # Getting the geometry column associated with the model (an - # exception will be raised if there is no geometry column). - if connection.features.supports_transform: - self.geo_field = self.geometry_field() - else: - transform = False - - # Checking the source spatial reference system, and getting - # the coordinate transformation object (unless the `transform` - # keyword is set to False) - if transform: - self.source_srs = self.check_srs(source_srs) - self.transform = self.coord_transform() - else: - self.transform = transform - - # Setting the encoding for OFTString fields, if specified. - if encoding: - # Making sure the encoding exists, if not a LookupError - # exception will be thrown. - from codecs import lookup - - lookup(encoding) - self.encoding = encoding - else: - self.encoding = None - - if unique: - self.check_unique(unique) - transaction_mode = "autocommit" # Has to be set to autocommit. - self.unique = unique - else: - self.unique = None - - # Setting the transaction decorator with the function in the - # transaction modes dictionary. - self.transaction_mode = transaction_mode - if transaction_mode == "autocommit": - self.transaction_decorator = None - elif transaction_mode == "commit_on_success": - self.transaction_decorator = transaction.atomic - else: - raise LayerMapError("Unrecognized transaction mode: %s" % transaction_mode) - - # #### Checking routines used during initialization #### - def check_fid_range(self, fid_range): - "Check the `fid_range` keyword." - if fid_range: - if isinstance(fid_range, (tuple, list)): - return slice(*fid_range) - elif isinstance(fid_range, slice): - return fid_range - else: - raise TypeError - else: - return None - - def check_layer(self): - """ - Check the Layer metadata and ensure that it's compatible with the - mapping information and model. Unlike previous revisions, there is no - need to increment through each feature in the Layer. - """ - # The geometry field of the model is set here. - # TODO: Support more than one geometry field / model. However, this - # depends on the GDAL Driver in use. - self.geom_field = False - self.fields = {} - - # Getting lists of the field names and the field types available in - # the OGR Layer. - ogr_fields = self.layer.fields - ogr_field_types = self.layer.field_types - - # Function for determining if the OGR mapping field is in the Layer. - def check_ogr_fld(ogr_map_fld): - try: - idx = ogr_fields.index(ogr_map_fld) - except ValueError: - raise LayerMapError( - 'Given mapping OGR field "%s" not found in OGR Layer.' % ogr_map_fld - ) - return idx - - # No need to increment through each feature in the model, simply check - # the Layer metadata against what was given in the mapping dictionary. - for field_name, ogr_name in self.mapping.items(): - # Ensuring that a corresponding field exists in the model - # for the given field name in the mapping. - try: - model_field = self.model._meta.get_field(field_name) - except FieldDoesNotExist: - raise LayerMapError( - 'Given mapping field "%s" not in given Model fields.' % field_name - ) - - # Getting the string name for the Django field class (e.g., 'PointField'). - fld_name = model_field.__class__.__name__ - - if isinstance(model_field, GeometryField): - if self.geom_field: - raise LayerMapError( - "LayerMapping does not support more than one GeometryField per " - "model." - ) - - # Getting the coordinate dimension of the geometry field. - coord_dim = model_field.dim - - try: - if coord_dim == 3: - gtype = OGRGeomType(ogr_name + "25D") - else: - gtype = OGRGeomType(ogr_name) - except GDALException: - raise LayerMapError( - 'Invalid mapping for GeometryField "%s".' % field_name - ) - - # Making sure that the OGR Layer's Geometry is compatible. - ltype = self.layer.geom_type - if not ( - ltype.name.startswith(gtype.name) - or self.make_multi(ltype, model_field) - ): - raise LayerMapError( - "Invalid mapping geometry; model has %s%s, " - "layer geometry type is %s." - % (fld_name, "(dim=3)" if coord_dim == 3 else "", ltype) - ) - - # Setting the `geom_field` attribute w/the name of the model field - # that is a Geometry. Also setting the coordinate dimension - # attribute. - self.geom_field = field_name - self.coord_dim = coord_dim - fields_val = model_field - elif isinstance(model_field, models.ForeignKey): - if isinstance(ogr_name, dict): - # Is every given related model mapping field in the Layer? - rel_model = model_field.remote_field.model - for rel_name, ogr_field in ogr_name.items(): - idx = check_ogr_fld(ogr_field) - try: - rel_model._meta.get_field(rel_name) - except FieldDoesNotExist: - raise LayerMapError( - 'ForeignKey mapping field "%s" not in %s fields.' - % (rel_name, rel_model.__class__.__name__) - ) - fields_val = rel_model - else: - raise TypeError("ForeignKey mapping must be of dictionary type.") - else: - # Is the model field type supported by LayerMapping? - if model_field.__class__ not in self.FIELD_TYPES: - raise LayerMapError( - 'Django field type "%s" has no OGR mapping (yet).' % fld_name - ) - - # Is the OGR field in the Layer? - idx = check_ogr_fld(ogr_name) - ogr_field = ogr_field_types[idx] - - # Can the OGR field type be mapped to the Django field type? - if not issubclass(ogr_field, self.FIELD_TYPES[model_field.__class__]): - raise LayerMapError( - 'OGR field "%s" (of type %s) cannot be mapped to Django %s.' - % (ogr_field, ogr_field.__name__, fld_name) - ) - fields_val = model_field - - self.fields[field_name] = fields_val - - def check_srs(self, source_srs): - "Check the compatibility of the given spatial reference object." - - if isinstance(source_srs, SpatialReference): - sr = source_srs - elif isinstance(source_srs, self.spatial_backend.spatial_ref_sys()): - sr = source_srs.srs - elif isinstance(source_srs, (int, str)): - sr = SpatialReference(source_srs) - else: - # Otherwise just pulling the SpatialReference from the layer - sr = self.layer.srs - - if not sr: - raise LayerMapError("No source reference system defined.") - else: - return sr - - def check_unique(self, unique): - "Check the `unique` keyword parameter -- may be a sequence or string." - if isinstance(unique, (list, tuple)): - # List of fields to determine uniqueness with - for attr in unique: - if attr not in self.mapping: - raise ValueError - elif isinstance(unique, str): - # Only a single field passed in. - if unique not in self.mapping: - raise ValueError - else: - raise TypeError( - "Unique keyword argument must be set with a tuple, list, or string." - ) - - # Keyword argument retrieval routines #### - def feature_kwargs(self, feat): - """ - Given an OGR Feature, return a dictionary of keyword arguments for - constructing the mapped model. - """ - # The keyword arguments for model construction. - kwargs = {} - - # Incrementing through each model field and OGR field in the - # dictionary mapping. - for field_name, ogr_name in self.mapping.items(): - model_field = self.fields[field_name] - - if isinstance(model_field, GeometryField): - # Verify OGR geometry. - try: - val = self.verify_geom(feat.geom, model_field) - except GDALException: - raise LayerMapError("Could not retrieve geometry from feature.") - elif isinstance(model_field, models.base.ModelBase): - # The related _model_, not a field was passed in -- indicating - # another mapping for the related Model. - val = self.verify_fk(feat, model_field, ogr_name) - else: - # Otherwise, verify OGR Field type. - val = self.verify_ogr_field(feat[ogr_name], model_field) - - # Setting the keyword arguments for the field name with the - # value obtained above. - kwargs[field_name] = val - - return kwargs - - def unique_kwargs(self, kwargs): - """ - Given the feature keyword arguments (from `feature_kwargs`), construct - and return the uniqueness keyword arguments -- a subset of the feature - kwargs. - """ - if isinstance(self.unique, str): - return {self.unique: kwargs[self.unique]} - else: - return {fld: kwargs[fld] for fld in self.unique} - - # #### Verification routines used in constructing model keyword arguments. #### - def verify_ogr_field(self, ogr_field, model_field): - """ - Verify if the OGR Field contents are acceptable to the model field. If - they are, return the verified value, otherwise raise an exception. - """ - if isinstance(ogr_field, OFTString) and isinstance( - model_field, (models.CharField, models.TextField) - ): - if self.encoding and ogr_field.value is not None: - # The encoding for OGR data sources may be specified here - # (e.g., 'cp437' for Census Bureau boundary files). - val = force_str(ogr_field.value, self.encoding) - else: - val = ogr_field.value - if ( - model_field.max_length - and val is not None - and len(val) > model_field.max_length - ): - raise InvalidString( - "%s model field maximum string length is %s, given %s characters." - % (model_field.name, model_field.max_length, len(val)) - ) - elif isinstance(ogr_field, OFTReal) and isinstance( - model_field, models.DecimalField - ): - try: - # Creating an instance of the Decimal value to use. - d = Decimal(str(ogr_field.value)) - except DecimalInvalidOperation: - raise InvalidDecimal( - "Could not construct decimal from: %s" % ogr_field.value - ) - - # Getting the decimal value as a tuple. - dtup = d.as_tuple() - digits = dtup[1] - d_idx = dtup[2] # index where the decimal is - - # Maximum amount of precision, or digits to the left of the decimal. - max_prec = model_field.max_digits - model_field.decimal_places - - # Getting the digits to the left of the decimal place for the - # given decimal. - if d_idx < 0: - n_prec = len(digits[:d_idx]) - else: - n_prec = len(digits) + d_idx - - # If we have more than the maximum digits allowed, then throw an - # InvalidDecimal exception. - if n_prec > max_prec: - raise InvalidDecimal( - "A DecimalField with max_digits %d, decimal_places %d must " - "round to an absolute value less than 10^%d." - % (model_field.max_digits, model_field.decimal_places, max_prec) - ) - val = d - elif isinstance(ogr_field, (OFTReal, OFTString)) and isinstance( - model_field, models.IntegerField - ): - # Attempt to convert any OFTReal and OFTString value to an OFTInteger. - try: - val = int(ogr_field.value) - except ValueError: - raise InvalidInteger( - "Could not construct integer from: %s" % ogr_field.value - ) - else: - val = ogr_field.value - return val - - def verify_fk(self, feat, rel_model, rel_mapping): - """ - Given an OGR Feature, the related model and its dictionary mapping, - retrieve the related model for the ForeignKey mapping. - """ - # TODO: It is expensive to retrieve a model for every record -- - # explore if an efficient mechanism exists for caching related - # ForeignKey models. - - # Constructing and verifying the related model keyword arguments. - fk_kwargs = {} - for field_name, ogr_name in rel_mapping.items(): - fk_kwargs[field_name] = self.verify_ogr_field( - feat[ogr_name], rel_model._meta.get_field(field_name) - ) - - # Attempting to retrieve and return the related model. - try: - return rel_model.objects.using(self.using).get(**fk_kwargs) - except ObjectDoesNotExist: - raise MissingForeignKey( - "No ForeignKey %s model found with keyword arguments: %s" - % (rel_model.__name__, fk_kwargs) - ) - - def verify_geom(self, geom, model_field): - """ - Verify the geometry -- construct and return a GeometryCollection - if necessary (for example if the model field is MultiPolygonField while - the mapped shapefile only contains Polygons). - """ - # Measured geometries are not yet supported by GeoDjango models. - if geom.is_measured: - geom.set_measured(False) - - # Downgrade a 3D geom to a 2D one, if necessary. - if self.coord_dim == 2 and geom.is_3d: - geom.set_3d(False) - - if self.make_multi(geom.geom_type, model_field): - # Constructing a multi-geometry type to contain the single geometry - multi_type = self.MULTI_TYPES[geom.geom_type.num] - g = OGRGeometry(multi_type) - g.add(geom) - else: - g = geom - - # Transforming the geometry with our Coordinate Transformation object, - # but only if the class variable `transform` is set w/a CoordTransform - # object. - if self.transform: - g.transform(self.transform) - - # Returning the WKT of the geometry. - return g.wkt - - # #### Other model methods #### - def coord_transform(self): - "Return the coordinate transformation object." - SpatialRefSys = self.spatial_backend.spatial_ref_sys() - try: - # Getting the target spatial reference system - target_srs = ( - SpatialRefSys.objects.using(self.using) - .get(srid=self.geo_field.srid) - .srs - ) - - # Creating the CoordTransform object - return CoordTransform(self.source_srs, target_srs) - except Exception as exc: - raise LayerMapError( - "Could not translate between the data source and model geometry." - ) from exc - - def geometry_field(self): - "Return the GeometryField instance associated with the geographic column." - # Use `get_field()` on the model's options so that we - # get the correct field instance if there's model inheritance. - opts = self.model._meta - return opts.get_field(self.geom_field) - - def make_multi(self, geom_type, model_field): - """ - Given the OGRGeomType for a geometry and its associated GeometryField, - determine whether the geometry should be turned into a GeometryCollection. - """ - return ( - geom_type.num in self.MULTI_TYPES - and model_field.__class__.__name__ == "Multi%s" % geom_type.django - ) - - def save( - self, - verbose=False, - fid_range=False, - step=False, - progress=False, - silent=False, - stream=sys.stdout, - strict=False, - ): - """ - Save the contents from the OGR DataSource Layer into the database - according to the mapping dictionary given at initialization. - - Keyword Parameters: - verbose: - If set, information will be printed subsequent to each model save - executed on the database. - - fid_range: - May be set with a slice or tuple of (begin, end) feature ID's to map - from the data source. In other words, this keyword enables the user - to selectively import a subset range of features in the geographic - data source. - - step: - If set with an integer, transactions will occur at every step - interval. For example, if step=1000, a commit would occur after - the 1,000th feature, the 2,000th feature etc. - - progress: - When this keyword is set, status information will be printed giving - the number of features processed and successfully saved. By default, - progress information will pe printed every 1000 features processed, - however, this default may be overridden by setting this keyword with an - integer for the desired interval. - - stream: - Status information will be written to this file handle. Defaults to - using `sys.stdout`, but any object with a `write` method is supported. - - silent: - By default, non-fatal error notifications are printed to stdout, but - this keyword may be set to disable these notifications. - - strict: - Execution of the model mapping will cease upon the first error - encountered. The default behavior is to attempt to continue. - """ - # Getting the default Feature ID range. - default_range = self.check_fid_range(fid_range) - - # Setting the progress interval, if requested. - if progress: - if progress is True or not isinstance(progress, int): - progress_interval = 1000 - else: - progress_interval = progress - - def _save(feat_range=default_range, num_feat=0, num_saved=0): - if feat_range: - layer_iter = self.layer[feat_range] - else: - layer_iter = self.layer - - for feat in layer_iter: - num_feat += 1 - # Getting the keyword arguments - try: - kwargs = self.feature_kwargs(feat) - except LayerMapError as msg: - # Something borked the validation - if strict: - raise - elif not silent: - stream.write( - "Ignoring Feature ID %s because: %s\n" % (feat.fid, msg) - ) - else: - # Constructing the model using the keyword args - is_update = False - if self.unique: - # If we want unique models on a particular field, handle the - # geometry appropriately. - try: - # Getting the keyword arguments and retrieving - # the unique model. - u_kwargs = self.unique_kwargs(kwargs) - m = self.model.objects.using(self.using).get(**u_kwargs) - is_update = True - - # Getting the geometry (in OGR form), creating - # one from the kwargs WKT, adding in additional - # geometries, and update the attribute with the - # just-updated geometry WKT. - geom_value = getattr(m, self.geom_field) - if geom_value is None: - geom = OGRGeometry(kwargs[self.geom_field]) - else: - geom = geom_value.ogr - new = OGRGeometry(kwargs[self.geom_field]) - for g in new: - geom.add(g) - setattr(m, self.geom_field, geom.wkt) - except ObjectDoesNotExist: - # No unique model exists yet, create. - m = self.model(**kwargs) - else: - m = self.model(**kwargs) - - try: - # Attempting to save. - m.save(using=self.using) - num_saved += 1 - if verbose: - stream.write( - "%s: %s\n" % ("Updated" if is_update else "Saved", m) - ) - except Exception as msg: - if strict: - # Bailing out if the `strict` keyword is set. - if not silent: - stream.write( - "Failed to save the feature (id: %s) into the " - "model with the keyword arguments:\n" % feat.fid - ) - stream.write("%s\n" % kwargs) - raise - elif not silent: - stream.write( - "Failed to save %s:\n %s\nContinuing\n" % (kwargs, msg) - ) - - # Printing progress information, if requested. - if progress and num_feat % progress_interval == 0: - stream.write( - "Processed %d features, saved %d ...\n" % (num_feat, num_saved) - ) - - # Only used for status output purposes -- incremental saving uses the - # values returned here. - return num_saved, num_feat - - if self.transaction_decorator is not None: - _save = self.transaction_decorator(_save) - - nfeat = self.layer.num_feat - if step and isinstance(step, int) and step < nfeat: - # Incremental saving is requested at the given interval (step) - if default_range: - raise LayerMapError( - "The `step` keyword may not be used in conjunction with the " - "`fid_range` keyword." - ) - beg, num_feat, num_saved = (0, 0, 0) - indices = range(step, nfeat, step) - n_i = len(indices) - - for i, end in enumerate(indices): - # Constructing the slice to use for this step; the last slice is - # special (e.g, [100:] instead of [90:100]). - if i + 1 == n_i: - step_slice = slice(beg, None) - else: - step_slice = slice(beg, end) - - try: - num_feat, num_saved = _save(step_slice, num_feat, num_saved) - beg = end - except Exception: # Deliberately catch everything - stream.write( - "%s\nFailed to save slice: %s\n" % ("=-" * 20, step_slice) - ) - raise - else: - # Otherwise, just calling the previously defined _save() function. - _save() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/ogrinfo.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/ogrinfo.py deleted file mode 100644 index eafa23c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/ogrinfo.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -This module includes some utility functions for inspecting the layout -of a GDAL data source -- the functionality is analogous to the output -produced by the `ogrinfo` utility. -""" - -from django.contrib.gis.gdal import DataSource -from django.contrib.gis.gdal.geometries import GEO_CLASSES - - -def ogrinfo(data_source, num_features=10): - """ - Walk the available layers in the supplied `data_source`, displaying - the fields for the first `num_features` features. - """ - - # Checking the parameters. - if isinstance(data_source, str): - data_source = DataSource(data_source) - elif isinstance(data_source, DataSource): - pass - else: - raise Exception( - "Data source parameter must be a string or a DataSource object." - ) - - for i, layer in enumerate(data_source): - print("data source : %s" % data_source.name) - print("==== layer %s" % i) - print(" shape type: %s" % GEO_CLASSES[layer.geom_type.num].__name__) - print(" # features: %s" % len(layer)) - print(" srs: %s" % layer.srs) - extent_tup = layer.extent.tuple - print(" extent: %s - %s" % (extent_tup[0:2], extent_tup[2:4])) - print("Displaying the first %s features ====" % num_features) - - width = max(*map(len, layer.fields)) - fmt = " %%%ss: %%s" % width - for j, feature in enumerate(layer[:num_features]): - print("=== Feature %s" % j) - for fld_name in layer.fields: - type_name = feature[fld_name].type_name - output = fmt % (fld_name, type_name) - val = feature.get(fld_name) - if val: - if isinstance(val, str): - val_fmt = ' ("%s")' - else: - val_fmt = " (%s)" - output += val_fmt % val - else: - output += " (None)" - print(output) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/ogrinspect.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/ogrinspect.py deleted file mode 100644 index 76c8bfb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/ogrinspect.py +++ /dev/null @@ -1,268 +0,0 @@ -""" -This module is for inspecting OGR data sources and generating either -models for GeoDjango and/or mapping dictionaries for use with the -`LayerMapping` utility. -""" - -from django.contrib.gis.gdal import DataSource -from django.contrib.gis.gdal.field import ( - OFTDate, - OFTDateTime, - OFTInteger, - OFTInteger64, - OFTReal, - OFTString, - OFTTime, -) - - -def mapping(data_source, geom_name="geom", layer_key=0, multi_geom=False): - """ - Given a DataSource, generate a dictionary that may be used - for invoking the LayerMapping utility. - - Keyword Arguments: - `geom_name` => The name of the geometry field to use for the model. - - `layer_key` => The key for specifying which layer in the DataSource to use; - defaults to 0 (the first layer). May be an integer index or a string - identifier for the layer. - - `multi_geom` => Boolean (default: False) - specify as multigeometry. - """ - if isinstance(data_source, str): - # Instantiating the DataSource from the string. - data_source = DataSource(data_source) - elif isinstance(data_source, DataSource): - pass - else: - raise TypeError( - "Data source parameter must be a string or a DataSource object." - ) - - # Creating the dictionary. - _mapping = {} - - # Generating the field name for each field in the layer. - for field in data_source[layer_key].fields: - mfield = field.lower() - if mfield[-1:] == "_": - mfield += "field" - _mapping[mfield] = field - gtype = data_source[layer_key].geom_type - if multi_geom: - gtype.to_multi() - _mapping[geom_name] = str(gtype).upper() - return _mapping - - -def ogrinspect(*args, **kwargs): - """ - Given a data source (either a string or a DataSource object) and a string - model name this function will generate a GeoDjango model. - - Usage: - - >>> from django.contrib.gis.utils import ogrinspect - >>> ogrinspect('/path/to/shapefile.shp','NewModel') - - ...will print model definition to stout - - or put this in a Python script and use to redirect the output to a new - model like: - - $ python generate_model.py > myapp/models.py - - # generate_model.py - from django.contrib.gis.utils import ogrinspect - shp_file = 'data/mapping_hacks/world_borders.shp' - model_name = 'WorldBorders' - - print(ogrinspect(shp_file, model_name, multi_geom=True, srid=4326, - geom_name='shapes', blank=True)) - - Required Arguments - `datasource` => string or DataSource object to file pointer - - `model name` => string of name of new model class to create - - Optional Keyword Arguments - `geom_name` => For specifying the model name for the Geometry Field. - Otherwise will default to `geom` - - `layer_key` => The key for specifying which layer in the DataSource to use; - defaults to 0 (the first layer). May be an integer index or a string - identifier for the layer. - - `srid` => The SRID to use for the Geometry Field. If it can be determined, - the SRID of the datasource is used. - - `multi_geom` => Boolean (default: False) - specify as multigeometry. - - `name_field` => String - specifies a field name to return for the - __str__() method (which will be generated if specified). - - `imports` => Boolean (default: True) - set to False to omit the - `from django.contrib.gis.db import models` code from the - autogenerated models thus avoiding duplicated imports when building - more than one model by batching ogrinspect() - - `decimal` => Boolean or sequence (default: False). When set to True - all generated model fields corresponding to the `OFTReal` type will - be `DecimalField` instead of `FloatField`. A sequence of specific - field names to generate as `DecimalField` may also be used. - - `blank` => Boolean or sequence (default: False). When set to True all - generated model fields will have `blank=True`. If the user wants to - give specific fields to have blank, then a list/tuple of OGR field - names may be used. - - `null` => Boolean (default: False) - When set to True all generated - model fields will have `null=True`. If the user wants to specify - give specific fields to have null, then a list/tuple of OGR field - names may be used. - - Note: Call the _ogrinspect() helper to do the heavy lifting. - """ - return "\n".join(_ogrinspect(*args, **kwargs)) - - -def _ogrinspect( - data_source, - model_name, - geom_name="geom", - layer_key=0, - srid=None, - multi_geom=False, - name_field=None, - imports=True, - decimal=False, - blank=False, - null=False, -): - """ - Helper routine for `ogrinspect` that generates GeoDjango models corresponding - to the given data source. See the `ogrinspect` docstring for more details. - """ - # Getting the DataSource - if isinstance(data_source, str): - data_source = DataSource(data_source) - elif isinstance(data_source, DataSource): - pass - else: - raise TypeError( - "Data source parameter must be a string or a DataSource object." - ) - - # Getting the layer corresponding to the layer key and getting - # a string listing of all OGR fields in the Layer. - layer = data_source[layer_key] - ogr_fields = layer.fields - - # Creating lists from the `null`, `blank`, and `decimal` - # keyword arguments. - def process_kwarg(kwarg): - if isinstance(kwarg, (list, tuple)): - return [s.lower() for s in kwarg] - elif kwarg: - return [s.lower() for s in ogr_fields] - else: - return [] - - null_fields = process_kwarg(null) - blank_fields = process_kwarg(blank) - decimal_fields = process_kwarg(decimal) - - # Gets the `null` and `blank` keywords for the given field name. - def get_kwargs_str(field_name): - kwlist = [] - if field_name.lower() in null_fields: - kwlist.append("null=True") - if field_name.lower() in blank_fields: - kwlist.append("blank=True") - if kwlist: - return ", " + ", ".join(kwlist) - else: - return "" - - # For those wishing to disable the imports. - if imports: - yield "# This is an auto-generated Django model module created by ogrinspect." - yield "from django.contrib.gis.db import models" - yield "" - yield "" - - yield "class %s(models.Model):" % model_name - - for field_name, width, precision, field_type in zip( - ogr_fields, layer.field_widths, layer.field_precisions, layer.field_types - ): - # The model field name. - mfield = field_name.lower() - if mfield[-1:] == "_": - mfield += "field" - - # Getting the keyword args string. - kwargs_str = get_kwargs_str(field_name) - - if field_type is OFTReal: - # By default OFTReals are mapped to `FloatField`, however, they - # may also be mapped to `DecimalField` if specified in the - # `decimal` keyword. - if field_name.lower() in decimal_fields: - yield ( - " %s = models.DecimalField(max_digits=%d, decimal_places=%d%s)" - ) % ( - mfield, - width, - precision, - kwargs_str, - ) - else: - yield " %s = models.FloatField(%s)" % (mfield, kwargs_str[2:]) - elif field_type is OFTInteger: - yield " %s = models.IntegerField(%s)" % (mfield, kwargs_str[2:]) - elif field_type is OFTInteger64: - yield " %s = models.BigIntegerField(%s)" % (mfield, kwargs_str[2:]) - elif field_type is OFTString: - yield " %s = models.CharField(max_length=%s%s)" % ( - mfield, - width, - kwargs_str, - ) - elif field_type is OFTDate: - yield " %s = models.DateField(%s)" % (mfield, kwargs_str[2:]) - elif field_type is OFTDateTime: - yield " %s = models.DateTimeField(%s)" % (mfield, kwargs_str[2:]) - elif field_type is OFTTime: - yield " %s = models.TimeField(%s)" % (mfield, kwargs_str[2:]) - else: - raise TypeError("Unknown field type %s in %s" % (field_type, mfield)) - - # TODO: Autodetection of multigeometry types (see #7218). - gtype = layer.geom_type - if multi_geom: - gtype.to_multi() - geom_field = gtype.django - - # Setting up the SRID keyword string. - if srid is None: - if layer.srs is None: - srid_str = "srid=-1" - else: - srid = layer.srs.srid - if srid is None: - srid_str = "srid=-1" - elif srid == 4326: - # WGS84 is already the default. - srid_str = "" - else: - srid_str = "srid=%s" % srid - else: - srid_str = "srid=%s" % srid - - yield " %s = models.%s(%s)" % (geom_name, geom_field, srid_str) - - if name_field: - yield "" - yield " def __str__(self): return self.%s" % name_field diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/srs.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/srs.py deleted file mode 100644 index 2204767..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/utils/srs.py +++ /dev/null @@ -1,78 +0,0 @@ -from django.contrib.gis.gdal import SpatialReference -from django.db import DEFAULT_DB_ALIAS, connections - - -def add_srs_entry( - srs, auth_name="EPSG", auth_srid=None, ref_sys_name=None, database=None -): - """ - Take a GDAL SpatialReference system and add its information to the - `spatial_ref_sys` table of the spatial backend. Doing this enables - database-level spatial transformations for the backend. Thus, this utility - is useful for adding spatial reference systems not included by default with - the backend: - - >>> from django.contrib.gis.utils import add_srs_entry - >>> add_srs_entry(3857) - - Keyword Arguments: - auth_name: - This keyword may be customized with the value of the `auth_name` field. - Defaults to 'EPSG'. - - auth_srid: - This keyword may be customized with the value of the `auth_srid` field. - Defaults to the SRID determined by GDAL. - - ref_sys_name: - For SpatiaLite users only, sets the value of the `ref_sys_name` field. - Defaults to the name determined by GDAL. - - database: - The name of the database connection to use; the default is the value - of `django.db.DEFAULT_DB_ALIAS` (at the time of this writing, its value - is 'default'). - """ - database = database or DEFAULT_DB_ALIAS - connection = connections[database] - - if not hasattr(connection.ops, "spatial_version"): - raise Exception("The `add_srs_entry` utility only works with spatial backends.") - if not connection.features.supports_add_srs_entry: - raise Exception("This utility does not support your database backend.") - SpatialRefSys = connection.ops.spatial_ref_sys() - - # If argument is not a `SpatialReference` instance, use it as parameter - # to construct a `SpatialReference` instance. - if not isinstance(srs, SpatialReference): - srs = SpatialReference(srs) - - if srs.srid is None: - raise Exception( - "Spatial reference requires an SRID to be " - "compatible with the spatial backend." - ) - - # Initializing the keyword arguments dictionary for both PostGIS - # and SpatiaLite. - kwargs = { - "srid": srs.srid, - "auth_name": auth_name, - "auth_srid": auth_srid or srs.srid, - "proj4text": srs.proj4, - } - # Backend-specific fields for the SpatialRefSys model. - srs_field_names = {f.name for f in SpatialRefSys._meta.get_fields()} - if "srtext" in srs_field_names: - kwargs["srtext"] = srs.wkt - if "ref_sys_name" in srs_field_names: - # SpatiaLite specific - kwargs["ref_sys_name"] = ref_sys_name or srs.name - - # Creating the spatial_ref_sys model. - try: - # Try getting via SRID only, because using all kwargs may - # differ from exact wkt/proj in database. - SpatialRefSys.objects.using(database).get(srid=srs.srid) - except SpatialRefSys.DoesNotExist: - SpatialRefSys.objects.using(database).create(**kwargs) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/gis/views.py b/.venv/lib/python3.10/site-packages/django/contrib/gis/views.py deleted file mode 100644 index 346fb5b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/gis/views.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.http import Http404 -from django.utils.translation import gettext as _ - - -def feed(request, url, feed_dict=None): - """Provided for backwards compatibility.""" - if not feed_dict: - raise Http404(_("No feeds are registered.")) - - slug = url.partition("/")[0] - try: - f = feed_dict[slug] - except KeyError: - raise Http404(_("Slug %r isn’t registered.") % slug) - - instance = f() - instance.feed_url = getattr(f, "feed_url", None) or request.path - instance.title_template = f.title_template or ("feeds/%s_title.html" % slug) - instance.description_template = f.description_template or ( - "feeds/%s_description.html" % slug - ) - return instance(request) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/humanize/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/humanize/apps.py deleted file mode 100644 index 817ae96..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.apps import AppConfig -from django.utils.translation import gettext_lazy as _ - - -class HumanizeConfig(AppConfig): - name = "django.contrib.humanize" - verbose_name = _("Humanize") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/af/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index d3f79ac..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/af/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index 087f017..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,328 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2019,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:40+0000\n" -"Last-Translator: F Wolff , 2019,2023\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanise" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}de" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}ste" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}ste" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}ste" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}ste" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}ste" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}ste" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}ste" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}ste" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}ste" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}ste" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s miljoen" -msgstr[1] "%(value)s miljoen" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miljard" -msgstr[1] "%(value)s miljard" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s biljoen" -msgstr[1] "%(value)s biljoen" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s biljard" -msgstr[1] "%(value)s biljard" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s triljoen" -msgstr[1] "%(value)s triljoen" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s triljard" -msgstr[1] "%(value)s triljard" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s kwadriljoen" -msgstr[1] "%(value)s kwadriljoen" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kwadriljard" -msgstr[1] "%(value)s kwadriljard" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kwintiljoen" -msgstr[1] "%(value)s kwintiljoen" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kwinteljard" -msgstr[1] "%(value)s kwinteljard" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "een" - -msgid "two" -msgstr "twee" - -msgid "three" -msgstr "drie" - -msgid "four" -msgstr "vier" - -msgid "five" -msgstr "vyf" - -msgid "six" -msgstr "ses" - -msgid "seven" -msgstr "sewe" - -msgid "eight" -msgstr "agt" - -msgid "nine" -msgstr "nege" - -msgid "today" -msgstr "vandag" - -msgid "tomorrow" -msgstr "môre" - -msgid "yesterday" -msgstr "gister" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s gelede" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "’n uur gelede" -msgstr[1] "%(count)s uur gelede" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "’n minuut gelede" -msgstr[1] "%(count)s minute gelede" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "’n sekonde gelede" -msgstr[1] "%(count)s sekondes gelede" - -msgid "now" -msgstr "nou" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "oor ’n sekonde" -msgstr[1] "oor %(count)s sekondes" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "oor ’n minuut" -msgstr[1] "oor %(count)s minute" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "oor ’n uur" -msgstr[1] "oor %(count)s ure" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "oor %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d jaar" -msgstr[1] "%(num)d jaar" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d maand" -msgstr[1] "%(num)d maande" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d week" -msgstr[1] "%(num)d weke" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dae" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uur" -msgstr[1] "%(num)d uur" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuut" -msgstr[1] "%(num)d minute" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d jaar" -msgstr[1] "%(num)d jaar" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d maand" -msgstr[1] "%(num)d maande" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d week" -msgstr[1] "%(num)d weke" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dae" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uur" -msgstr[1] "%(num)d uur" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuut" -msgstr[1] "%(num)d minute" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index 169bb73..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index 94c7f87..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,449 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2020-2021 -# Bashar Al-Abdulhadi, 2014 -# Eyad Toma , 2013 -# Jannis Leidel , 2011 -# Muaaz Alsaied, 2020 -# Ossama Khayat , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-10-15 21:36+0000\n" -"Last-Translator: Bashar Al-Abdulhadi\n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Humanize" -msgstr "عمل صفة بشرية" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s مليون" -msgstr[1] "%(value)s مليون" -msgstr[2] "%(value)s مليون" -msgstr[3] "%(value)s ملايين" -msgstr[4] "%(value)s مليون" -msgstr[5] "%(value)s مليون" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s مليار" -msgstr[1] "%(value)s مليار" -msgstr[2] "%(value)s مليار" -msgstr[3] "%(value)s مليار" -msgstr[4] "%(value)s مليار" -msgstr[5] "%(value)s مليار" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s ترليون" -msgstr[1] "%(value)s ترليون" -msgstr[2] "%(value)s ترليون" -msgstr[3] "%(value)s ترليون" -msgstr[4] "%(value)s ترليون" -msgstr[5] "%(value)s ترليون" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s كوادرليون" -msgstr[1] "%(value)s كوادرليون" -msgstr[2] "%(value)s كوادرليون" -msgstr[3] "%(value)s كوادرليون" -msgstr[4] "%(value)s كوادرليون" -msgstr[5] "%(value)s كوادرليون" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s كوينتيليون" -msgstr[1] "%(value)s كوينتيليون" -msgstr[2] "%(value)s كوينتيليون" -msgstr[3] "%(value)s كوينتيليون" -msgstr[4] "%(value)s كوينتيليون" -msgstr[5] "%(value)s كوينتيليون" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s سكستيليون" -msgstr[1] "%(value)s سكستيليون" -msgstr[2] "%(value)s سكستيليون" -msgstr[3] "%(value)s سكستيليون" -msgstr[4] "%(value)s سكستيليون" -msgstr[5] "%(value)s سكستيليون" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s سبتيليون" -msgstr[1] "%(value)s سبتيليون" -msgstr[2] "%(value)s سبتيليون" -msgstr[3] "%(value)s سبتيليون" -msgstr[4] "%(value)s سبتيليون" -msgstr[5] "%(value)s سبتيليون" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s أقتيليون" -msgstr[1] "%(value)s أقتيليون" -msgstr[2] "%(value)s أقتيليون" -msgstr[3] "%(value)s أقتيليون" -msgstr[4] "%(value)s أقتيليون" -msgstr[5] "%(value)s أقتيليون" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s نانليون" -msgstr[1] "%(value)s نانليون" -msgstr[2] "%(value)s نانليون" -msgstr[3] "%(value)s نانليون" -msgstr[4] "%(value)s نانليون" -msgstr[5] "%(value)s نانليون" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s ديسيليون" -msgstr[1] "%(value)s ديسيليون" -msgstr[2] "%(value)s ديسيليون" -msgstr[3] "%(value)s ديسيليون" -msgstr[4] "%(value)s ديسيليون" -msgstr[5] "%(value)s ديسيليون" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s جوجول" -msgstr[1] "%(value)s جوجول" -msgstr[2] "%(value)s جوجول" -msgstr[3] "%(value)s جوجول" -msgstr[4] "%(value)s جوجول" -msgstr[5] "%(value)s جوجول" - -msgid "one" -msgstr "واحد" - -msgid "two" -msgstr "إثنان" - -msgid "three" -msgstr "ثلالثة" - -msgid "four" -msgstr "أربعة" - -msgid "five" -msgstr "خمسة" - -msgid "six" -msgstr "ستة" - -msgid "seven" -msgstr "سبعة" - -msgid "eight" -msgstr "ثمانية" - -msgid "nine" -msgstr "تسعة" - -msgid "today" -msgstr "اليوم" - -msgid "tomorrow" -msgstr "غداً" - -msgid "yesterday" -msgstr "أمس" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s مضت" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "منذ %(count)s ساعة" -msgstr[1] "منذ ساعة" -msgstr[2] "منذ %(count)s ساعة" -msgstr[3] "منذ %(count)s ساعة" -msgstr[4] "منذ %(count)s ساعة" -msgstr[5] "منذ %(count)s ساعة" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "منذ %(count)s دقيقة" -msgstr[1] "منذ دقيقة" -msgstr[2] "منذ %(count)s دقيقة" -msgstr[3] "منذ %(count)s دقيقة" -msgstr[4] "منذ %(count)s دقيقة" -msgstr[5] "منذ %(count)s دقيقة" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "منذ %(count)s ثانية" -msgstr[1] "منذ ثانية" -msgstr[2] "منذ %(count)s ثانيتين" -msgstr[3] "منذ %(count)s ثواني" -msgstr[4] "منذ %(count)s ثانية" -msgstr[5] "منذ %(count)s ثانية" - -msgid "now" -msgstr "الآن" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s ثواني من الآن" -msgstr[1] "منذ ثانية من الآن" -msgstr[2] "%(count)s ثواني من الآن" -msgstr[3] "%(count)s ثواني من الآن" -msgstr[4] "%(count)s ثواني من الآن" -msgstr[5] "%(count)s ثواني من الآن" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s دقائق من الآن" -msgstr[1] "منذ دقيقة من الآن" -msgstr[2] "%(count)s دقائق من الآن" -msgstr[3] "%(count)s دقائق من الآن" -msgstr[4] "%(count)s دقائق من الآن" -msgstr[5] "%(count)s دقائق من الآن" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s ساعات من الآن" -msgstr[1] "منذ ساعة من الآن" -msgstr[2] "%(count)s ساعات من الآن" -msgstr[3] "%(count)s ساعات من الآن" -msgstr[4] "%(count)s ساعات من الآن" -msgstr[5] "%(count)s ساعات من الآن" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s من الآن" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d سنة" -msgstr[1] "%(num)d سنة" -msgstr[2] "%(num)d سنتين" -msgstr[3] "%(num)d سنوات" -msgstr[4] "%(num)d سنوات" -msgstr[5] "%(num)d سنوات" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d شهر" -msgstr[1] "%(num)d شهر" -msgstr[2] "%(num)d شهرين" -msgstr[3] "%(num)d أشهر" -msgstr[4] "%(num)d أشهر" -msgstr[5] "%(num)d أشهر" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d أسبوع" -msgstr[1] "%(num)d أسبوع" -msgstr[2] "%(num)d أسبوعين" -msgstr[3] "%(num)d أسابيع" -msgstr[4] "%(num)d أسبوع" -msgstr[5] "%(num)d أسابيع" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d يوم" -msgstr[1] "%(num)d يوم" -msgstr[2] "%(num)d يومين" -msgstr[3] "%(num)d أيام" -msgstr[4] "%(num)d يوم" -msgstr[5] "%(num)d أيام" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ساعة" -msgstr[1] "%(num)d ساعة" -msgstr[2] "%(num)d ساعتين" -msgstr[3] "%(num)d ساعات" -msgstr[4] "%(num)d ساعة" -msgstr[5] "%(num)d ساعات" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d دقيقة" -msgstr[1] "%(num)d دقيقة" -msgstr[2] "%(num)d دقيقتين" -msgstr[3] "%(num)d دقائق" -msgstr[4] "%(num)d دقيقة" -msgstr[5] "%(num)d دقيقة" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d سنة" -msgstr[1] "%(num)d سنة" -msgstr[2] "%(num)d سنتين" -msgstr[3] "%(num)d سنوات" -msgstr[4] "%(num)d سنة" -msgstr[5] "%(num)d سنوات" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d شهر" -msgstr[1] "%(num)d شهر" -msgstr[2] "%(num)d شهرين" -msgstr[3] "%(num)d أشهر" -msgstr[4] "%(num)d شهر" -msgstr[5] "%(num)d أشهر" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d أسبوع" -msgstr[1] "%(num)d أسبوع" -msgstr[2] "%(num)d أسبوعين" -msgstr[3] "%(num)d أسابيع" -msgstr[4] "%(num)d أسبوع" -msgstr[5] "%(num)d أسابيع" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d يوم" -msgstr[1] "%(num)d يوم" -msgstr[2] "%(num)d يومين" -msgstr[3] "%(num)d أيام" -msgstr[4] "%(num)d يوم" -msgstr[5] "%(num)d أيام" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ساعة" -msgstr[1] "%(num)d ساعة" -msgstr[2] "%(num)d ساعتين" -msgstr[3] "%(num)d ساعات" -msgstr[4] "%(num)d ساعة" -msgstr[5] "%(num)d ساعات" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d دقيقة" -msgstr[1] "%(num)d دقيقة" -msgstr[2] "%(num)d دقيقتين" -msgstr[3] "%(num)d دقائق" -msgstr[4] "%(num)d دقيقة" -msgstr[5] "%(num)d دقيقة" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar_DZ/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index d61abbd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar_DZ/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index 4e4c151..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,555 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Riterix , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-12-16 02:59+0000\n" -"Last-Translator: Riterix \n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Humanize" -msgstr "عمل صفة بشرية" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f مليون" -msgstr[1] "%(value).1f مليون" -msgstr[2] "%(value).1f مليونان" -msgstr[3] "%(value).1f مليون" -msgstr[4] "%(value).1f مليون" -msgstr[5] "%(value).1f مليون" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s مليون" -msgstr[1] "%(value)s مليون" -msgstr[2] "%(value)s مليون" -msgstr[3] "%(value)s ملايين" -msgstr[4] "%(value)s مليون" -msgstr[5] "%(value)s مليون" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f مليار" -msgstr[1] "%(value).1f مليار" -msgstr[2] "%(value).1f ملياران" -msgstr[3] "%(value).1f مليار" -msgstr[4] "%(value).1f مليار" -msgstr[5] "%(value).1f مليار" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s مليار" -msgstr[1] "%(value)s مليار" -msgstr[2] "%(value)s مليار" -msgstr[3] "%(value)s مليار" -msgstr[4] "%(value)s مليار" -msgstr[5] "%(value)s مليار" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f ترليون" -msgstr[1] "%(value).1f ترليون" -msgstr[2] "%(value).1f ترليونان" -msgstr[3] "%(value).1f ترليونات" -msgstr[4] "%(value).1f ترليون" -msgstr[5] "%(value).1f ترليون" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s ترليون" -msgstr[1] "%(value)s ترليون" -msgstr[2] "%(value)s ترليون" -msgstr[3] "%(value)s ترليون" -msgstr[4] "%(value)s ترليون" -msgstr[5] "%(value)s ترليون" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f كوادرليون" -msgstr[1] "%(value).1f كوادرليون" -msgstr[2] "%(value).1f كوادرليون" -msgstr[3] "%(value).1f كوادرليون" -msgstr[4] "%(value).1f كوادرليون" -msgstr[5] "%(value).1f كوادرليون" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s كوادرليون" -msgstr[1] "%(value)s كوادرليون" -msgstr[2] "%(value)s كوادرليون" -msgstr[3] "%(value)s كوادرليون" -msgstr[4] "%(value)s كوادرليون" -msgstr[5] "%(value)s كوادرليون" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f كوينتيليون" -msgstr[1] "%(value).1f كوينتيليون" -msgstr[2] "%(value).1f كوينتيليون" -msgstr[3] "%(value).1f كوينتيليون" -msgstr[4] "%(value).1f كوينتيليون" -msgstr[5] "%(value).1f كوينتيليون" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s كوينتيليون" -msgstr[1] "%(value)s كوينتيليون" -msgstr[2] "%(value)s كوينتيليون" -msgstr[3] "%(value)s كوينتيليون" -msgstr[4] "%(value)s كوينتيليون" -msgstr[5] "%(value)s كوينتيليون" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f سكستيليون" -msgstr[1] "%(value).1f سكستيليون" -msgstr[2] "%(value).1f سكستيليون" -msgstr[3] "%(value).1f سكستيليون" -msgstr[4] "%(value).1f سكستيليون" -msgstr[5] "%(value).1f سكستيليون" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s سكستيليون" -msgstr[1] "%(value)s سكستيليون" -msgstr[2] "%(value)s سكستيليون" -msgstr[3] "%(value)s سكستيليون" -msgstr[4] "%(value)s سكستيليون" -msgstr[5] "%(value)s سكستيليون" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f سبتيليون" -msgstr[1] "%(value).1f سبتيليون" -msgstr[2] "%(value).1f سبتيليون" -msgstr[3] "%(value).1f سبتيليون" -msgstr[4] "%(value).1f سبتيليون" -msgstr[5] "%(value).1f سبتيليون" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s سبتيليون" -msgstr[1] "%(value)s سبتيليون" -msgstr[2] "%(value)s سبتيليون" -msgstr[3] "%(value)s سبتيليون" -msgstr[4] "%(value)s سبتيليون" -msgstr[5] "%(value)s سبتيليون" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f أقتيليون" -msgstr[1] "%(value).1f أقتيليون" -msgstr[2] "%(value).1f أقتيليون" -msgstr[3] "%(value).1f أقتيليون" -msgstr[4] "%(value).1f أقتيليون" -msgstr[5] "%(value).1f أقتيليون" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s أقتيليون" -msgstr[1] "%(value)s أقتيليون" -msgstr[2] "%(value)s أقتيليون" -msgstr[3] "%(value)s أقتيليون" -msgstr[4] "%(value)s أقتيليون" -msgstr[5] "%(value)s أقتيليون" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f نانليون" -msgstr[1] "%(value).1f نانليون" -msgstr[2] "%(value).1f نانليون" -msgstr[3] "%(value).1f نانليون" -msgstr[4] "%(value).1f نانليون" -msgstr[5] "%(value).1f نانليون" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s نانليون" -msgstr[1] "%(value)s نانليون" -msgstr[2] "%(value)s نانليون" -msgstr[3] "%(value)s نانليون" -msgstr[4] "%(value)s نانليون" -msgstr[5] "%(value)s نانليون" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f ديسيليون" -msgstr[1] "%(value).1f ديسيليون" -msgstr[2] "%(value).1f ديسيليون" -msgstr[3] "%(value).1f ديسيليون" -msgstr[4] "%(value).1f ديسيليون" -msgstr[5] "%(value).1f ديسيليون" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s ديسيليون" -msgstr[1] "%(value)s ديسيليون" -msgstr[2] "%(value)s ديسيليون" -msgstr[3] "%(value)s ديسيليون" -msgstr[4] "%(value)s ديسيليون" -msgstr[5] "%(value)s ديسيليون" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f جوجول" -msgstr[1] "%(value).1f جوجول" -msgstr[2] "%(value).1f جوجول" -msgstr[3] "%(value).1f جوجول" -msgstr[4] "%(value).1f جوجول" -msgstr[5] "%(value).1f جوجول" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s جوجول" -msgstr[1] "%(value)s جوجول" -msgstr[2] "%(value)s جوجول" -msgstr[3] "%(value)s جوجول" -msgstr[4] "%(value)s جوجول" -msgstr[5] "%(value)s جوجول" - -msgid "one" -msgstr "واحد" - -msgid "two" -msgstr "إثنان" - -msgid "three" -msgstr "ثلالثة" - -msgid "four" -msgstr "أربعة" - -msgid "five" -msgstr "خمسة" - -msgid "six" -msgstr "ستة" - -msgid "seven" -msgstr "سبعة" - -msgid "eight" -msgstr "ثمانية" - -msgid "nine" -msgstr "تسعة" - -msgid "today" -msgstr "اليوم" - -msgid "tomorrow" -msgstr "غداً" - -msgid "yesterday" -msgstr "أمس" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s مضت" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "منذ %(count)s ساعة" -msgstr[1] "منذ ساعة" -msgstr[2] "منذ %(count)s ساعة" -msgstr[3] "منذ %(count)s ساعة" -msgstr[4] "منذ %(count)s ساعة" -msgstr[5] "منذ %(count)s ساعة" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "منذ %(count)s دقيقة" -msgstr[1] "منذ دقيقة" -msgstr[2] "منذ %(count)s دقيقة" -msgstr[3] "منذ %(count)s دقيقة" -msgstr[4] "منذ %(count)s دقيقة" -msgstr[5] "منذ %(count)s دقيقة" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "منذ %(count)s ثانية" -msgstr[1] "منذ ثانية" -msgstr[2] "منذ %(count)s ثانيتين" -msgstr[3] "منذ %(count)s ثواني" -msgstr[4] "منذ %(count)s ثانية" -msgstr[5] "منذ %(count)s ثانية" - -msgid "now" -msgstr "الآن" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s ثواني من الآن" -msgstr[1] "منذ ثانية من الآن" -msgstr[2] "%(count)s ثواني من الآن" -msgstr[3] "%(count)s ثواني من الآن" -msgstr[4] "%(count)s ثواني من الآن" -msgstr[5] "%(count)s ثواني من الآن" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s دقائق من الآن" -msgstr[1] "منذ دقيقة من الآن" -msgstr[2] "%(count)s دقائق من الآن" -msgstr[3] "%(count)s دقائق من الآن" -msgstr[4] "%(count)s دقائق من الآن" -msgstr[5] "%(count)s دقائق من الآن" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s ساعات من الآن" -msgstr[1] "منذ ساعة من الآن" -msgstr[2] "%(count)s ساعات من الآن" -msgstr[3] "%(count)s ساعات من الآن" -msgstr[4] "%(count)s ساعات من الآن" -msgstr[5] "%(count)s ساعات من الآن" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s من الآن" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d سنة" -msgstr[1] "%d سنة" -msgstr[2] "%d سنتين" -msgstr[3] "%d سنوات" -msgstr[4] "%d سنة" -msgstr[5] "%d سنة" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d شهر" -msgstr[1] "%d شهر" -msgstr[2] "%d شهرين" -msgstr[3] "%d أشهر" -msgstr[4] "%d شهر" -msgstr[5] "%d شهر" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d اسبوع" -msgstr[1] "%d اسبوع" -msgstr[2] "%d أسبوعين" -msgstr[3] "%d أسابيع" -msgstr[4] "%d اسبوع" -msgstr[5] "%d اسبوع" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d يوم" -msgstr[1] "%d يوم" -msgstr[2] "%d يومان" -msgstr[3] "%d أيام" -msgstr[4] "%d يوم" -msgstr[5] "%d يوم" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ساعة" -msgstr[1] "%d ساعة واحدة" -msgstr[2] "%d ساعتين" -msgstr[3] "%d ساعات" -msgstr[4] "%d ساعة" -msgstr[5] "%d ساعة" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d دقيقة" -msgstr[1] "%d دقيقة" -msgstr[2] "%d دقيقتين" -msgstr[3] "%d دقائق" -msgstr[4] "%d دقيقة" -msgstr[5] "%d دقيقة" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d سنة" -msgstr[1] "%d سنة" -msgstr[2] "%d سنتين" -msgstr[3] "%d سنوات" -msgstr[4] "%d سنة" -msgstr[5] "%d سنة" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d شهر" -msgstr[1] "%d شهر" -msgstr[2] "%d شهرين" -msgstr[3] "%d أشهر" -msgstr[4] "%d شهر" -msgstr[5] "%d شهر" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d أسبوع" -msgstr[1] "%d أسبوع" -msgstr[2] "%d أسبوعين" -msgstr[3] "%d أسابيع" -msgstr[4] "%d أسبوع" -msgstr[5] "%d أسبوع" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d يوم" -msgstr[1] "%d يوم" -msgstr[2] "%d يومان" -msgstr[3] "%d أيام" -msgstr[4] "%d يوم" -msgstr[5] "%d يوم" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ساعة" -msgstr[1] "%d ساعة واحدة" -msgstr[2] "%d ساعتين" -msgstr[3] "%d ساعات" -msgstr[4] "%d ساعة" -msgstr[5] "%d ساعة" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d دقيقة" -msgstr[1] "%d دقيقة" -msgstr[2] "%d دقيقتين" -msgstr[3] "%d دقائق" -msgstr[4] "%d دقيقة" -msgstr[5] "%d دقيقة" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ast/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index 049aab2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ast/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index 50f4794..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,262 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 19:51+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "ᵘ" - -msgid "st" -msgstr "ᵘ" - -msgid "nd" -msgstr "ᵘ" - -msgid "rd" -msgstr "ᵘ" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f millón" -msgstr[1] "%(value).1f millones" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s millón" -msgstr[1] "%(value)s millones" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f billón" -msgstr[1] "%(value).1f billones" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s billón" -msgstr[1] "%(value)s billones" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f trillón" -msgstr[1] "%(value).1f trillones" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trillón" -msgstr[1] "%(value)s trillones" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f cuatrillón" -msgstr[1] "%(value).1f cuatrillones" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s cuatrillón" -msgstr[1] "%(value)s cuatrillones" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f quintillón" -msgstr[1] "%(value).1f quintillones" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s quintillón" -msgstr[1] "%(value)s quintillones" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f sextillón" -msgstr[1] "%(value).1f sextillones" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextillón" -msgstr[1] "%(value)s sextillones" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f septillón" -msgstr[1] "%(value).1f septillones" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septillón" -msgstr[1] "%(value)s septillones" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f octillón" -msgstr[1] "%(value).1f octillones" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octillón" -msgstr[1] "%(value)s octillones" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f nonillón" -msgstr[1] "%(value).1f nonillones" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonillón" -msgstr[1] "%(value)s nonillones" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f decillón" -msgstr[1] "%(value).1f decillones" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decillón" -msgstr[1] "%(value)s decillones" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f gúgol" -msgstr[1] "%(value).1f gúgol" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gúgol" -msgstr[1] "%(value)s gúgol" - -msgid "one" -msgstr "un" - -msgid "two" -msgstr "dos" - -msgid "three" -msgstr "trés" - -msgid "four" -msgstr "cuatro" - -msgid "five" -msgstr "cinco" - -msgid "six" -msgstr "seis" - -msgid "seven" -msgstr "siete" - -msgid "eight" -msgstr "ocho" - -msgid "nine" -msgstr "nueve" - -msgid "today" -msgstr "güei" - -msgid "tomorrow" -msgstr "mañana" - -msgid "yesterday" -msgstr "ayeri" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "hai %(delta)s" - -msgid "now" -msgstr "agora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s dende agora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/az/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 57035e0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/az/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index df21af9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,333 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Ismayilov , 2011 -# Claude Paroz , 2013 -# Emin Mastizada , 2018,2020 -# Emin Mastizada , 2016 -# Nicat Məmmədov , 2022 -# Nijat Mammadov, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-08-07 18:40+0000\n" -"Last-Translator: Nijat Mammadov, 2024\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "İnsanlaşdır" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milyon" -msgstr[1] "%(value)s milyon" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milyard" -msgstr[1] "%(value)s milyard" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trilyon" -msgstr[1] "%(value)s trilyon" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kvadrilyon" -msgstr[1] "%(value)s kvadrilyon" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kvintilyon" -msgstr[1] "%(value)s kvintilyon" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sekstilyon" -msgstr[1] "%(value)s sekstilyon" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilyon" -msgstr[1] "%(value)s septilyon" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktilyon" -msgstr[1] "%(value)s oktilyon" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonilyon" -msgstr[1] "%(value)s nonilyon" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s deçilyon" -msgstr[1] "%(value)s deçilyon" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s quqol" -msgstr[1] "%(value)s quqol" - -msgid "one" -msgstr "bir" - -msgid "two" -msgstr "iki" - -msgid "three" -msgstr "üç" - -msgid "four" -msgstr "dörd" - -msgid "five" -msgstr "beş" - -msgid "six" -msgstr "altı" - -msgid "seven" -msgstr "yeddi" - -msgid "eight" -msgstr "səkkiz" - -msgid "nine" -msgstr "doqquz" - -msgid "today" -msgstr "bu gün" - -msgid "tomorrow" -msgstr "sabah" - -msgid "yesterday" -msgstr "dünən" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s əvvəl" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "bir saat əvvəl" -msgstr[1] "%(count)s saat əvvəl" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "bir dəqiqə əvvəl" -msgstr[1] "%(count)s dəqiqə əvvəl" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "bir saniyə əvvəl" -msgstr[1] "%(count)s saniyə əvvəl" - -msgid "now" -msgstr "indi" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "bir saniyə sonra" -msgstr[1] "%(count)s saniyə sonra" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "bir dəqiqə sonra" -msgstr[1] "%(count)s dəqiqə sonra" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "bir saat sonra" -msgstr[1] "%(count)s saat sonra" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s bundan sonra" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d il" -msgstr[1] "%(num)d il" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ay" -msgstr[1] "%(num)d ay" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d həftə" -msgstr[1] "%(num)d həftə" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d saat" -msgstr[1] "%(num)d saat" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d dəqiqə" -msgstr[1] "%(num)d dəqiqə" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d il" -msgstr[1] "%(num)d il" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ay" -msgstr[1] "%(num)d ay" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d həftə" -msgstr[1] "%(num)d həftə" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d saat" -msgstr[1] "%(num)d saat" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d dəqiqə" -msgstr[1] "%(num)d dəqiqə" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/be/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index ed7b846..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/be/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index 565b5b3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,389 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2014-2015 -# znotdead , 2019,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-09-22 16:47+0000\n" -"Last-Translator: znotdead \n" -"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Humanize" -msgstr "Ачалавечваньне" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}ы" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}ы" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}ы" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}і" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}і" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}ы" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}ы" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}ы" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}ы" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}ы" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}ы" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s мільён" -msgstr[1] "%(value)s мільёны" -msgstr[2] "%(value)s мільёнаў" -msgstr[3] "%(value)s мільёнаў" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value).s мільярд" -msgstr[1] "%(value)s мільярды" -msgstr[2] "%(value)s мільярдаў" -msgstr[3] "%(value)s мільярдаў" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s трыльён" -msgstr[1] "%(value)s трыльёны" -msgstr[2] "%(value)s трыльёнаў" -msgstr[3] "%(value)s трыльёнаў" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s квадрыльён" -msgstr[1] "%(value)s квадрыльёны" -msgstr[2] "%(value)s квадрыльёнаў" -msgstr[3] "%(value)s квадрыльёнаў" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s квінтыльён" -msgstr[1] "%(value)s квінтыльёны" -msgstr[2] "%(value)s квінтыльёнаў" -msgstr[3] "%(value)s квінтыльёнаў" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s сэкстыльён" -msgstr[1] "%(value)s сэкстыльёны" -msgstr[2] "%(value)s сэкстыльёнаў" -msgstr[3] "%(value)s сэкстыльёнаў" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s сэптыльён" -msgstr[1] "%(value)s сэптыльёны" -msgstr[2] "%(value)s сэптыльёнаў" -msgstr[3] "%(value)s сэптыльёнаў" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s актыльён" -msgstr[1] "%(value)s актыльёны" -msgstr[2] "%(value)s актыльёнаў" -msgstr[3] "%(value)s актыльёнаў" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s нанільён" -msgstr[1] "%(value)s нанільёны" -msgstr[2] "%(value)s нанільёнаў" -msgstr[3] "%(value)s нанільёнаў" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s дэцыльён" -msgstr[1] "%(value)s дэцыльёны" -msgstr[2] "%(value)s дэцыльёнаў" -msgstr[3] "%(value)s дэцыльёнаў" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s ґуґал" -msgstr[1] "%(value)s ґуґлы" -msgstr[2] "%(value)s ґуґлаў" -msgstr[3] "%(value)s ґуґлаў" - -msgid "one" -msgstr "адзін" - -msgid "two" -msgstr "два" - -msgid "three" -msgstr "тры" - -msgid "four" -msgstr "чатыры" - -msgid "five" -msgstr "пяць" - -msgid "six" -msgstr "шэсьць" - -msgid "seven" -msgstr "сем" - -msgid "eight" -msgstr "восем" - -msgid "nine" -msgstr "дзевяць" - -msgid "today" -msgstr "сёньня" - -msgid "tomorrow" -msgstr "заўтра" - -msgid "yesterday" -msgstr "ўчора" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s таму" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s гадзіну таму" -msgstr[1] "%(count)s гадзіны таму" -msgstr[2] "%(count)s гадзінаў таму" -msgstr[3] "%(count)s гадзінаў таму" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s хвіліну таму" -msgstr[1] "%(count)s хвіліны таму" -msgstr[2] "%(count)s хвілінаў таму" -msgstr[3] "%(count)s хвілінаў таму" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s сэкунду таму" -msgstr[1] "%(count)s сэкунды таму" -msgstr[2] "%(count)s сэкундаў таму" -msgstr[3] "%(count)s сэкундаў таму" - -msgid "now" -msgstr "зараз" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "праз %(count)s сэкунду" -msgstr[1] "праз %(count)s сэкунды" -msgstr[2] "праз %(count)s сэкундаў" -msgstr[3] "праз %(count)s сэкундаў" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "праз %(count)s хвіліну" -msgstr[1] "праз %(count)s хвіліны" -msgstr[2] "праз %(count)s хвілінаў" -msgstr[3] "праз %(count)s хвілінаў" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "праз %(count)s гадзіну" -msgstr[1] "праз %(count)s гадзіны" -msgstr[2] "праз %(count)s гадзінаў" -msgstr[3] "праз %(count)s гадзінаў" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "праз %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d год" -msgstr[1] "%(num)d гадоў" -msgstr[2] "%(num)d гадоў" -msgstr[3] "%(num)d гадоў" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месяц" -msgstr[1] "%(num)d месяцаў" -msgstr[2] "%(num)d месяцаў" -msgstr[3] "%(num)d месяцаў" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d тыдзень" -msgstr[1] "%(num)d тыдняў" -msgstr[2] "%(num)d тыдняў" -msgstr[3] "%(num)d тыдняў" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d дзень" -msgstr[1] "%(num)d дзён" -msgstr[2] "%(num)d дзён" -msgstr[3] "%(num)d дзён" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d гадзіна" -msgstr[1] "%(num)d гадзін" -msgstr[2] "%(num)d гадзін" -msgstr[3] "%(num)d гадзін" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d хвіліна" -msgstr[1] "%(num)d хвілін" -msgstr[2] "%(num)d хвілін" -msgstr[3] "%(num)d хвілін" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d год" -msgstr[1] "%(num)d гадоў" -msgstr[2] "%(num)d гадоў" -msgstr[3] "%(num)d гадоў" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месяц" -msgstr[1] "%(num)d месяцаў" -msgstr[2] "%(num)d месяцаў" -msgstr[3] "%(num)d месяцаў" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d тыдзень" -msgstr[1] "%(num)d тыдняў" -msgstr[2] "%(num)d тыдняў" -msgstr[3] "%(num)d тыдняў" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d дзень" -msgstr[1] "%(num)d дзён" -msgstr[2] "%(num)d дзён" -msgstr[3] "%(num)d дзён" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d гадзіна" -msgstr[1] "%(num)d гадзін" -msgstr[2] "%(num)d гадзін" -msgstr[3] "%(num)d гадзін" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d хвіліна" -msgstr[1] "%(num)d хвілін" -msgstr[2] "%(num)d хвілін" -msgstr[3] "%(num)d хвілін" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index 85cdff8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index a4f6ad6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022 -# Georgi Kostadinov , 2012 -# Jannis Leidel , 2011 -# Todor Lubenov , 2011,2015 -# Venelin Stoykov , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2022-01-14 11:48+0000\n" -"Last-Translator: arneatec \n" -"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Очовечаване" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}ти" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}ен" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}ви" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}ри" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}ти" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}ти" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}ти" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}ти" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}ми" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}ми" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}ти" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s милион" -msgstr[1] "%(value)s милиона" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s милиард" -msgstr[1] "%(value)s милиарда" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s трилион" -msgstr[1] "%(value)s трилиона" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s квадрилион" -msgstr[1] "%(value)s квадрилиона" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s квинтилион" -msgstr[1] "%(value)s квинтилиона" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s секстилион" -msgstr[1] "%(value)s секстилиона" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s септилион" -msgstr[1] "%(value)s септилиона" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s октилион" -msgstr[1] "%(value)s октилиона" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s нонилион" -msgstr[1] "%(value)s нонилиона" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s децилион" -msgstr[1] "%(value)s децилиона" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s гугол" -msgstr[1] "%(value)s гугола" - -msgid "one" -msgstr "един" - -msgid "two" -msgstr "два" - -msgid "three" -msgstr "три" - -msgid "four" -msgstr "четири" - -msgid "five" -msgstr "пет" - -msgid "six" -msgstr "шест" - -msgid "seven" -msgstr "седем" - -msgid "eight" -msgstr "осем" - -msgid "nine" -msgstr "девет" - -msgid "today" -msgstr "днес" - -msgid "tomorrow" -msgstr "утре" - -msgid "yesterday" -msgstr "вчера" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "преди %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "преди един час" -msgstr[1] "преди %(count)s часа" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "преди минута" -msgstr[1] "преди %(count)s минути" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "преди секунда" -msgstr[1] "преди %(count)s секунди" - -msgid "now" -msgstr "сега" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "след секунда" -msgstr[1] "след %(count)s секунди" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "след минута" -msgstr[1] "след %(count)s минути" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "след един час" -msgstr[1] "след %(count)s часа" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "след %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d години" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месец" -msgstr[1] "%(num)d месеца" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d седмица" -msgstr[1] "%(num)d седмици" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d ден" -msgstr[1] "%(num)d дни" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d час" -msgstr[1] "%(num)d часа" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минута" -msgstr[1] "%(num)d минути" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d години" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месец" -msgstr[1] "%(num)d месеца" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d седмица" -msgstr[1] "%(num)d седмици" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d ден" -msgstr[1] "%(num)d дни" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d час" -msgstr[1] "%(num)d часа" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минута" -msgstr[1] "%(num)d минути" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index 042122a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index 2b60f57..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,263 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Tahmid Rafi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Tahmid Rafi \n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "তম" - -msgid "st" -msgstr "ম" - -msgid "nd" -msgstr "য়" - -msgid "rd" -msgstr "য়" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f মিলিয়ন" -msgstr[1] "%(value).1f মিলিয়ন" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s মিলিয়ন" -msgstr[1] "%(value)s মিলিয়ন" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f বিলিয়ন" -msgstr[1] "%(value).1f বিলিয়ন" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s বিলিয়ন" -msgstr[1] "%(value)s বিলিয়ন" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f ট্রিলিয়ন" -msgstr[1] "%(value).1f ট্রিলিয়ন" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s ট্রিলিয়ন" -msgstr[1] "%(value)s ট্রিলিয়ন" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s কোয়াড্রিলিয়ন" -msgstr[1] "%(value)s কোয়াড্রিলিয়ন" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s কুইন্টিলিয়ন" -msgstr[1] "%(value)s কুইন্টিলিয়ন" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s সেক্সটিলিয়ন" -msgstr[1] "%(value)s সেক্সটিলিয়ন" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s সেপ্টিলিয়ন" -msgstr[1] "%(value)s সেপ্টিলিয়ন" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s অক্টিলিয়ন" -msgstr[1] "%(value)s অক্টিলিয়ন" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s ননিলিয়ন" -msgstr[1] "%(value)s ননিলিয়ন" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s ডেসিলিয়ন" -msgstr[1] "%(value)s ডেসিলিয়ন" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s গোগোল" -msgstr[1] "%(value)s গোগোল" - -msgid "one" -msgstr "এক" - -msgid "two" -msgstr "দুই" - -msgid "three" -msgstr "তিন" - -msgid "four" -msgstr "চার" - -msgid "five" -msgstr "পাঁচ" - -msgid "six" -msgstr "ছয়" - -msgid "seven" -msgstr "সাত" - -msgid "eight" -msgstr "আট" - -msgid "nine" -msgstr "নয়" - -msgid "today" -msgstr "আজ" - -msgid "tomorrow" -msgstr "আগামীকাল" - -msgid "yesterday" -msgstr "গতকাল" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "%(delta)s আগে" - -msgid "now" -msgstr "এখন" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "এক সেকেন্ড আগে" -msgstr[1] "%(count)s সেকেন্ড আগে" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "এক মিনিট আগে" -msgstr[1] "%(count)s মিনিট আগে" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "এক ঘন্টা আগে" -msgstr[1] "%(count)s ঘন্টা আগে" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "এখন থেকে %(delta)s পরে" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "এখন থেকে এক সেকেন্ড পরে" -msgstr[1] "এখন থেকে %(count)s সেকেন্ড পরে" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "এখন থেকে এক মিনিট পরে" -msgstr[1] "এখন থেকে %(count)s মিনিট পরে" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "এখন থেকে এক ঘন্টা পরে" -msgstr[1] "এখন থেকে %(count)s ঘন্টা পরে" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/br/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index e45c05a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/br/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index 8f85745..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,517 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fulup , 2012,2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2018-09-29 08:30+0000\n" -"Last-Translator: Claude Paroz \n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -msgid "Humanize" -msgstr "Denelaat" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f milion" -msgstr[1] "%(value).1f milion" -msgstr[2] "%(value).1f milion" -msgstr[3] "%(value).1f milion" -msgstr[4] "%(value).1f milion" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s million" -msgstr[1] "%(value)s million" -msgstr[2] "%(value)s million" -msgstr[3] "%(value)s million" -msgstr[4] "%(value)s million" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f miliard" -msgstr[1] "%(value).1f miliard" -msgstr[2] "%(value).1f miliard" -msgstr[3] "%(value).1f miliard" -msgstr[4] "%(value).1f miliard" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliard" -msgstr[1] "%(value)s miliard" -msgstr[2] "%(value)s miliard" -msgstr[3] "%(value)s miliard" -msgstr[4] "%(value)s miliard" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f bilion" -msgstr[1] "%(value).1f bilion" -msgstr[2] "%(value).1f bilion" -msgstr[3] "%(value).1f bilion" -msgstr[4] "%(value).1f bilion" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s bilion" -msgstr[1] "%(value)s bilion" -msgstr[2] "%(value)s bilion" -msgstr[3] "%(value)s bilion" -msgstr[4] "%(value)s bilion" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f c'hadrilion" -msgstr[1] "%(value).1f kadrilion" -msgstr[2] "%(value).1f kadrilion" -msgstr[3] "%(value).1f kadrilion" -msgstr[4] "%(value).1f kadrilion" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s c'hadrilion" -msgstr[1] "%(value)s kadrilion" -msgstr[2] "%(value)s kadrilion" -msgstr[3] "%(value)s kadrilion" -msgstr[4] "%(value)s kadrilion" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f c'hintilion" -msgstr[1] "%(value).1f kintilion" -msgstr[2] "%(value).1f kintilion" -msgstr[3] "%(value).1f kintilion" -msgstr[4] "%(value).1f kintilion" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s c'hintilion" -msgstr[1] "%(value)s kintilion" -msgstr[2] "%(value)s kintilion" -msgstr[3] "%(value)s kintilion" -msgstr[4] "%(value)s kintilion" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f sekstilion" -msgstr[1] "%(value).1f sekstilion" -msgstr[2] "%(value).1f sekstilion" -msgstr[3] "%(value).1f sekstilion" -msgstr[4] "%(value).1f sekstilion" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sekstilion" -msgstr[1] "%(value)s sekstilion" -msgstr[2] "%(value)s sekstilion" -msgstr[3] "%(value)s sekstilion" -msgstr[4] "%(value)s sekstilion" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f septilion" -msgstr[1] "%(value).1f septilion" -msgstr[2] "%(value).1f septilion" -msgstr[3] "%(value).1f septilion" -msgstr[4] "%(value).1f septilion" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilion" -msgstr[1] "%(value)s septilion" -msgstr[2] "%(value)s septilion" -msgstr[3] "%(value)s septilion" -msgstr[4] "%(value)s septilion" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f oktilion" -msgstr[1] "%(value).1f oktilion" -msgstr[2] "%(value).1f oktilion" -msgstr[3] "%(value).1f oktilion" -msgstr[4] "%(value).1f oktilion" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktilion" -msgstr[1] "%(value)s oktilion" -msgstr[2] "%(value)s oktilion" -msgstr[3] "%(value)s oktilion" -msgstr[4] "%(value)s oktilion" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f nonilion" -msgstr[1] "%(value).1f nonilion" -msgstr[2] "%(value).1f nonilion" -msgstr[3] "%(value).1f nonilion" -msgstr[4] "%(value).1f nonilion" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonilion" -msgstr[1] "%(value)s nonilion" -msgstr[2] "%(value)s nonilion" -msgstr[3] "%(value)s nonilion" -msgstr[4] "%(value)s nonilion" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f dekilion" -msgstr[1] "%(value).1f dekilion" -msgstr[2] "%(value).1f dekilion" -msgstr[3] "%(value).1f dekilion" -msgstr[4] "%(value).1f dekilion" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s dekilion" -msgstr[1] "%(value)s dekilion" -msgstr[2] "%(value)s dekilion" -msgstr[3] "%(value)s dekilion" -msgstr[4] "%(value)s dekilion" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f gogol" -msgstr[1] "%(value).1f gogol" -msgstr[2] "%(value).1f gogol" -msgstr[3] "%(value).1f gogol" -msgstr[4] "%(value).1f gogol" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gogol" -msgstr[1] "%(value)s gogol" -msgstr[2] "%(value)s gogol" -msgstr[3] "%(value)s gogol" -msgstr[4] "%(value)s gogol" - -msgid "one" -msgstr "unan" - -msgid "two" -msgstr "daou" - -msgid "three" -msgstr "tri" - -msgid "four" -msgstr "pevar" - -msgid "five" -msgstr "pemp" - -msgid "six" -msgstr "c'hwec'h" - -msgid "seven" -msgstr "seizh" - -msgid "eight" -msgstr "eizh" - -msgid "nine" -msgstr "nav" - -msgid "today" -msgstr "hiziv" - -msgid "tomorrow" -msgstr "warc'hoazh" - -msgid "yesterday" -msgstr "dec'h" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s eurvezh zo" -msgstr[1] "%(count)s eurvezh zo" -msgstr[2] "%(count)s eurvezh zo" -msgstr[3] "%(count)s eurvezh zo" -msgstr[4] "%(count)s eurvezh zo" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s munud zo" -msgstr[1] "%(count)s munud zo" -msgstr[2] "%(count)s munud zo" -msgstr[3] "%(count)s munud zo" -msgstr[4] "%(count)s munud zo" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s eilenn zo" -msgstr[1] "%(count)s eilenn zo" -msgstr[2] "%(count)s eilenn zo" -msgstr[3] "%(count)s eilenn zo" -msgstr[4] "%(count)s eilenn zo" - -msgid "now" -msgstr "bremañ" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "a-benn %(count)s eilenn" -msgstr[1] "a-benn %(count)s eilenn" -msgstr[2] "a-benn %(count)s eilenn" -msgstr[3] "a-benn %(count)s eilenn" -msgstr[4] "a-benn %(count)s eilenn" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "a-benn %(count)s munud" -msgstr[1] "a-benn %(count)s munud" -msgstr[2] "a-benn %(count)s munud" -msgstr[3] "a-benn %(count)s munud" -msgstr[4] "a-benn %(count)s munud" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "a-benn %(count)s eurvezh" -msgstr[1] "a-benn %(count)s eurvezh" -msgstr[2] "a-benn %(count)s eurvezh" -msgstr[3] "a-benn %(count)s eurvezh" -msgstr[4] "a-benn %(count)s eurvezh" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index b3a7647..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index 51108e9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,292 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Filip Dupanović , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "-i" - -msgid "st" -msgstr "-vi" - -msgid "nd" -msgstr "-i" - -msgid "rd" -msgstr "-i" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f million" -msgstr[1] "%(value).1f miliona" -msgstr[2] "%(value).1f miliona" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f milijarda" -msgstr[1] "%(value).1f milijarde" -msgstr[2] "%(value).1f milijardi" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f bilion" -msgstr[1] "%(value).1f biliona" -msgstr[2] "%(value).1f biliona" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "one" -msgstr "jedan" - -msgid "two" -msgstr "dva" - -msgid "three" -msgstr "tri" - -msgid "four" -msgstr "četiri" - -msgid "five" -msgstr "pet" - -msgid "six" -msgstr "šest" - -msgid "seven" -msgstr "sedam" - -msgid "eight" -msgstr "osam" - -msgid "nine" -msgstr "devet" - -msgid "today" -msgstr "deset" - -msgid "tomorrow" -msgstr "sutra" - -msgid "yesterday" -msgstr "jučer" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ca/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 348f920..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ca/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index 4befcc6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2011-2012,2019,2021 -# Carles Barrobés , 2011,2014 -# GerardoGa , 2018 -# Gil Obradors Via , 2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-10-27 09:05+0000\n" -"Last-Translator: Antoni Aloy \n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanitzar" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}è" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}è" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}r" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}n" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}r" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}è" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}è" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}è" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}è" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}è" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}è" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milió" -msgstr[1] "%(value)s milions" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliard" -msgstr[1] "%(value)s miliards" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s bilió" -msgstr[1] "%(value)s bilió" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s quadrilió" -msgstr[1] "%(value)s quadrilions" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s quintilió" -msgstr[1] "%(value)s quintilions" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextilió" -msgstr[1] "%(value)s sextilions" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilió" -msgstr[1] "%(value)s septilions" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octilió" -msgstr[1] "%(value)s octilions" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonilió" -msgstr[1] "%(value)s nonilions" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decilió" -msgstr[1] "%(value)s decilions" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googols" - -msgid "one" -msgstr "un" - -msgid "two" -msgstr "dos" - -msgid "three" -msgstr "tres" - -msgid "four" -msgstr "quatre" - -msgid "five" -msgstr "cinc" - -msgid "six" -msgstr "sis" - -msgid "seven" -msgstr "set" - -msgid "eight" -msgstr "vuit" - -msgid "nine" -msgstr "nou" - -msgid "today" -msgstr "avui" - -msgid "tomorrow" -msgstr "demà" - -msgid "yesterday" -msgstr "ahir" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "Fa %(delta)s " - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "fa una hora" -msgstr[1] "fa %(count)s hores" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "fa un minut" -msgstr[1] "fa %(count)s minuts" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "fa un segon" -msgstr[1] "fa %(count)s segons" - -msgid "now" -msgstr "ara" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "d'aquí a un segon" -msgstr[1] "d'aquí a %(count)s segons" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "d'aquí a un minut" -msgstr[1] "d'aquí a %(count)s minuts" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "d'aquí a una hora" -msgstr[1] "d'aquí a %(count)s hores" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "fa %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d any" -msgstr[1] "%(num)d anys" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d mesos" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d setmana" -msgstr[1] "%(num)d setmanes" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dies" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d hores" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuts" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d any" -msgstr[1] "%(num)d anys" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d mesos" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d setmana" -msgstr[1] "%(num)d setmanes" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dies" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d hores" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuts" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ckb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index e087c72..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ckb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index 40e3e60..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,329 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# kosar tofiq , 2020 -# Swara , 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2023-04-24 18:40+0000\n" -"Last-Translator: Swara , 2022\n" -"Language-Team: Central Kurdish (http://www.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "بەمرۆڤایەتیکردن" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "‫{}th" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "‫{}th" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "‫{}st" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "‫{}nd" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "‫{}rd" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "‫{}th" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "‫{}th" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "‫{}th" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "‫{}th" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "‫{}th" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "‫{}th" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s ملیۆن" -msgstr[1] "%(value)s ملیۆن" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "‫%(value)s بلیۆن" -msgstr[1] "‫%(value)s بلیۆن" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "‫%(value)s تریلۆن" -msgstr[1] "‫%(value)s تریلۆن" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "‫%(value)s کوادرلیۆن" -msgstr[1] "‫%(value)s کوادرلیۆن" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "‫%(value)s کوینترلیۆن" -msgstr[1] "‫%(value)s کوینترلیۆن" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "‫%(value)s شەش تریلۆن" -msgstr[1] "‫%(value)s شەش تریلۆن" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "‫%(value)s سێپتریلۆن" -msgstr[1] "‫%(value)s سێپتریلۆن" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "‫%(value)s ئۆکتریلیۆن" -msgstr[1] "‫%(value)s ئۆکتریلیۆن" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "‫%(value)s نۆنتریلۆن" -msgstr[1] "‫%(value)s نۆنتریلۆن" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "‫%(value)s دێستریلیۆن" -msgstr[1] "‫%(value)s دێستریلیۆن" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "‫%(value)s گوگۆڵ" -msgstr[1] "‫%(value)s گوگۆڵ" - -msgid "one" -msgstr "یەک" - -msgid "two" -msgstr "دوو" - -msgid "three" -msgstr "سێ" - -msgid "four" -msgstr "چوار" - -msgid "five" -msgstr "پێنج" - -msgid "six" -msgstr "شەش" - -msgid "seven" -msgstr "حەوت" - -msgid "eight" -msgstr "هەشت" - -msgid "nine" -msgstr "نۆ" - -msgid "today" -msgstr "ئەمڕۆ" - -msgid "tomorrow" -msgstr "سبەینێ" - -msgid "yesterday" -msgstr "دوێنێ" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s پێشتر" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "کاتژمێرێک پێشتر" -msgstr[1] "‫%(count)s کاتژمێر پێشتر" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "خولەکێک پێشتر" -msgstr[1] "‫%(count)s خولەک پێشتر" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "چرکەیەک پێشتر" -msgstr[1] "‫%(count)s چرکە پێشتر" - -msgid "now" -msgstr "ئێستا" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "چرکەیەک لە ئێستاوە" -msgstr[1] "‫%(count)s چرکە لە ئێستاوە" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "خولەکێک لە ئێستاوە" -msgstr[1] "‫%(count)s خولەک لە ئێستاوە" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "کاتژمێرێک لە ئێستاوە" -msgstr[1] "‫%(count)s کاتژمێر لە ئێستاوە" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s لە ئێستاوە" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "‫%(num)d ساڵ" -msgstr[1] "‫%(num)d ساڵ" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "‫%(num)d مانگ" -msgstr[1] "‫%(num)d مانگ" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "‫%(num)d هەفتە" -msgstr[1] "‫%(num)d هەفتە" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "‫%(num)d ڕۆژ" -msgstr[1] "‫%(num)d ڕۆژ" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "‫%(num)d کاتژمێر" -msgstr[1] "‫%(num)d کاتژمێر" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "‫%(num)d خولەک" -msgstr[1] "‫%(num)d خولەک" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "‫%(num)d ساڵ" -msgstr[1] "‫%(num)d ساڵ" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "‫%(num)d مانگ" -msgstr[1] "‫%(num)d مانگ" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "‫%(num)d هەفتە" -msgstr[1] "‫%(num)d هەفتە" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "‫%(num)d ڕۆژ" -msgstr[1] "‫%(num)d ڕۆژ" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "‫%(num)d کاتژمێر" -msgstr[1] "‫%(num)d کاتژمێر" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "‫%(num)d خولەک" -msgstr[1] "‫%(num)d خولەک" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index 4b46222..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index f61b7e5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,388 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vláďa Macek , 2011,2014 -# Vláďa Macek , 2018,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-18 23:35+0000\n" -"Last-Translator: Vláďa Macek \n" -"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -msgid "Humanize" -msgstr "Polidštění" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] " %(value)s milion" -msgstr[1] " %(value)s miliony" -msgstr[2] " %(value)s milionů" -msgstr[3] " %(value)s milionů" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliarda" -msgstr[1] "%(value)s miliardy" -msgstr[2] "%(value)s miliard" -msgstr[3] "%(value)s miliard" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s bilion" -msgstr[1] "%(value)s biliony" -msgstr[2] "%(value)s bilionů" -msgstr[3] "%(value)s bilionů" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s biliarda" -msgstr[1] "%(value)s biliardy" -msgstr[2] "%(value)s biliard" -msgstr[3] "%(value)s biliard" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trilion" -msgstr[1] "%(value)s triliony" -msgstr[2] "%(value)s trilionů" -msgstr[3] "%(value)s trilionů" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s triliarda" -msgstr[1] "%(value)s triliardy" -msgstr[2] "%(value)s triliard" -msgstr[3] "%(value)s triliard" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s kvadrilion" -msgstr[1] "%(value)s kvadriliony" -msgstr[2] "%(value)s kvadrilionů" -msgstr[3] "%(value)s kvadrilionů" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kvadriliarda" -msgstr[1] "%(value)s kvadriliardy" -msgstr[2] "%(value)s kvadriliard" -msgstr[3] "%(value)s kvadriliard" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kvintilion" -msgstr[1] "%(value)s kvintiliony" -msgstr[2] "%(value)s kvintilionů" -msgstr[3] "%(value)s kvintilionů" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kvintiliarda" -msgstr[1] "%(value)s kvintiliardy" -msgstr[2] "%(value)s kvintiliard" -msgstr[3] "%(value)s kvintiliard" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googoly" -msgstr[2] "%(value)s googolů" -msgstr[3] "%(value)s googolů" - -msgid "one" -msgstr "jedna" - -msgid "two" -msgstr "dvě" - -msgid "three" -msgstr "tři" - -msgid "four" -msgstr "čtyři" - -msgid "five" -msgstr "pět" - -msgid "six" -msgstr "šest" - -msgid "seven" -msgstr "sedm" - -msgid "eight" -msgstr "osm" - -msgid "nine" -msgstr "devět" - -msgid "today" -msgstr "dnes" - -msgid "tomorrow" -msgstr "zítra" - -msgid "yesterday" -msgstr "včera" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "před %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "před hodinou" -msgstr[1] "před %(count)s hodinami" -msgstr[2] "o %(count)s hodin dříve" -msgstr[3] "před %(count)s hodinami" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "před minutou" -msgstr[1] "před %(count)s minutami" -msgstr[2] "o %(count)s minuty dříve" -msgstr[3] "před %(count)s minutami" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "před sekundou" -msgstr[1] "před %(count)s sekundami" -msgstr[2] "o %(count)s sekundy dříve" -msgstr[3] "před %(count)s sekundami" - -msgid "now" -msgstr "nyní" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "za sekundu" -msgstr[1] "za %(count)s sekundy" -msgstr[2] "za %(count)s sekundy" -msgstr[3] "za %(count)s sekund" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "za minutu" -msgstr[1] "za %(count)s minuty" -msgstr[2] "za %(count)s minuty" -msgstr[3] "za %(count)s minut" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "za hodinu" -msgstr[1] "za %(count)s hodiny" -msgstr[2] "za %(count)s hodiny" -msgstr[3] "za %(count)s hodin" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "za %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rokem" -msgstr[1] "%(num)d lety" -msgstr[2] "%(num)d rokem" -msgstr[3] "%(num)d lety" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d měsícem" -msgstr[1] "%(num)d měsíci" -msgstr[2] "%(num)d měsícem" -msgstr[3] "%(num)d měsíci" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d týdnem" -msgstr[1] "%(num)d týdny" -msgstr[2] "%(num)d týdny" -msgstr[3] "%(num)d týdny" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dnem" -msgstr[1] "%(num)d dny" -msgstr[2] "%(num)d dny" -msgstr[3] "%(num)d dny" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodinou" -msgstr[1] "%(num)d hodinami" -msgstr[2] "%(num)d hodinami" -msgstr[3] "%(num)d hodinami" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutou" -msgstr[1] "%(num)d minutami" -msgstr[2] "%(num)d minutami" -msgstr[3] "%(num)d minutami" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rok" -msgstr[1] "%(num)d roky" -msgstr[2] "%(num)d let" -msgstr[3] "%(num)d let" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d měsíc" -msgstr[1] "%(num)d měsíce" -msgstr[2] "%(num)d měsíců" -msgstr[3] "%(num)d měsíců" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d týden" -msgstr[1] "%(num)d týdny" -msgstr[2] "%(num)d týdnů" -msgstr[3] "%(num)d týdnů" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d den" -msgstr[1] "%(num)d dny" -msgstr[2] "%(num)d dní" -msgstr[3] "%(num)d dní" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodina" -msgstr[1] "%(num)d hodiny" -msgstr[2] "%(num)d hodin" -msgstr[3] "%(num)d hodin" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuty" -msgstr[2] "%(num)d minut" -msgstr[3] "%(num)d minut" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index aceed48..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index 6dd10e8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,318 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Maredudd ap Gwyndaf , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 19:21+0000\n" -"Last-Translator: Maredudd ap Gwyndaf \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -msgid "Humanize" -msgstr "Dynoli" - -msgid "th" -msgstr "edd" - -msgid "st" -msgstr "af" - -msgid "nd" -msgstr "ail" - -msgid "rd" -msgstr "ydd" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f miliwn" -msgstr[1] "%(value).1f miliwn" -msgstr[2] "%(value).1f miliwn" -msgstr[3] "%(value).1f miliwn" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s miliwn" -msgstr[1] "%(value)s miliwn" -msgstr[2] "%(value)s miliwn" -msgstr[3] "%(value)s miliwn" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f biliwn" -msgstr[1] "%(value).1f biliwn" -msgstr[2] "%(value).1f biliwn" -msgstr[3] "%(value).1f biliwn" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s biliwn" -msgstr[1] "%(value)s biliwn" -msgstr[2] "%(value)s biliwn" -msgstr[3] "%(value)s biliwn" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f triliwn" -msgstr[1] "%(value).1f triliwn" -msgstr[2] "%(value).1f triliwn" -msgstr[3] "%(value).1f triliwn" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s triliwn" -msgstr[1] "%(value)s triliwn" -msgstr[2] "%(value)s triliwn" -msgstr[3] "%(value)s triliwn" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f cwadriliwn" -msgstr[1] "%(value).1f cwadriliwn" -msgstr[2] "%(value).1f cwadriliwn" -msgstr[3] "%(value).1f cwadriliwn" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s cwadriliwn" -msgstr[1] "%(value)s cwadriliwn" -msgstr[2] "%(value)s cwadriliwn" -msgstr[3] "%(value)s cwadriliwn" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f cwintiliwn" -msgstr[1] "%(value).1f cwintiliwn" -msgstr[2] "%(value).1f cwintiliwn" -msgstr[3] "%(value).1f cwintiliwn" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s cwintiliwn" -msgstr[1] "%(value)s cwintiliwn" -msgstr[2] "%(value)s cwintiliwn" -msgstr[3] "%(value)s cwintiliwn" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f secstiliwnfm" -msgstr[1] "%(value).1f secstiliwnfm" -msgstr[2] "%(value).1f secstiliwnfm" -msgstr[3] "%(value).1f secstiliwnfm" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s secstiliwn" -msgstr[1] "%(value)s secstiliwn" -msgstr[2] "%(value)s secstiliwn" -msgstr[3] "%(value)s secstiliwn" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f septiliwn" -msgstr[1] "%(value).1f septiliwn" -msgstr[2] "%(value).1f septiliwn" -msgstr[3] "%(value).1f septiliwn" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septiliwn" -msgstr[1] "%(value)s septiliwn" -msgstr[2] "%(value)s septiliwn" -msgstr[3] "%(value)s septiliwn" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f octiliwn" -msgstr[1] "%(value).1f octiliwn" -msgstr[2] "%(value).1f octiliwn" -msgstr[3] "%(value).1f octiliwn" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octiliwn" -msgstr[1] "%(value)s octiliwn" -msgstr[2] "%(value)s octiliwn" -msgstr[3] "%(value)s octiliwn" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f noniliwn" -msgstr[1] "%(value).1f noniliwn" -msgstr[2] "%(value).1f noniliwn" -msgstr[3] "%(value).1f noniliwn" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s noniliwn" -msgstr[1] "%(value)s noniliwn" -msgstr[2] "%(value)s noniliwn" -msgstr[3] "%(value)s noniliwn" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f dengiliwn" -msgstr[1] "%(value).1f dengiliwn" -msgstr[2] "%(value).1f dengiliwn" -msgstr[3] "%(value).1f dengiliwn" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s dengiliwn" -msgstr[1] "%(value)s dengiliwn" -msgstr[2] "%(value)s dengiliwn" -msgstr[3] "%(value)s dengiliwn" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f gwgol" -msgstr[1] "%(value).1f gwgol" -msgstr[2] "%(value).1f gwgol" -msgstr[3] "%(value).1f gwgol" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gwgol" -msgstr[1] "%(value)s gwgol" -msgstr[2] "%(value)s gwgol" -msgstr[3] "%(value)s gwgol" - -msgid "one" -msgstr "un" - -msgid "two" -msgstr "dau" - -msgid "three" -msgstr "tri" - -msgid "four" -msgstr "pedwar" - -msgid "five" -msgstr "pump" - -msgid "six" -msgstr "chwech" - -msgid "seven" -msgstr "saith" - -msgid "eight" -msgstr "wyth" - -msgid "nine" -msgstr "naw" - -msgid "today" -msgstr "heddiw" - -msgid "tomorrow" -msgstr "fory" - -msgid "yesterday" -msgstr "ddoe" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "%(delta)s yn ôl" - -msgid "now" -msgstr "nawr" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "un eiliad yn ôl" -msgstr[1] "%(count)s eiliad yn ôl" -msgstr[2] "%(count)s eiliad yn ôl" -msgstr[3] "%(count)s eiliad yn ôl" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "un munud yn ôl" -msgstr[1] "%(count)s munud yn ôl" -msgstr[2] "%(count)s munud yn ôl" -msgstr[3] "%(count)s munud yn ôl" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "un awr yn ôl" -msgstr[1] "%(count)s awr yn ôl" -msgstr[2] "%(count)s awr yn ôl" -msgstr[3] "%(count)s awr yn ôl" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s o nawr" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "un eiliad o nawr" -msgstr[1] "%(count)s eiliad o nawr" -msgstr[2] "%(count)s eiliad o nawr" -msgstr[3] "%(count)s eiliad o nawr" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "un munud o nawr" -msgstr[1] "%(count)s funud o nawr" -msgstr[2] "%(count)s munud o nawr" -msgstr[3] "%(count)s munud o nawr" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "un awr o nawr" -msgstr[1] "%(count)s awr o nawr" -msgstr[2] "%(count)s awr o nawr" -msgstr[3] "%(count)s awr o nawr" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/da/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index bb8cd61..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/da/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index 8ad82a0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,331 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Christian Joergensen , 2012 -# Erik Ramsgaard Wognsen , 2021 -# Erik Ramsgaard Wognsen , 2014,2018 -# Jannis Leidel , 2011 -# valberg , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-09-23 21:30+0000\n" -"Last-Translator: Erik Ramsgaard Wognsen \n" -"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Menneskeliggør" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s million" -msgstr[1] "%(value)s millioner" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milliard" -msgstr[1] "%(value)s milliarder" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billion" -msgstr[1] "%(value)s billioner" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s billiard" -msgstr[1] "%(value)s billiarder" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trillion" -msgstr[1] "%(value)s trillioner" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s trilliard" -msgstr[1] "%(value)s trilliarder" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s kvadrillion" -msgstr[1] "%(value)s kvadrillioner" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kvadrilliard" -msgstr[1] "%(value)s kvadrilliarder" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kvintillion" -msgstr[1] "%(value)s kvintillioner" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kvintilliard" -msgstr[1] "%(value)s kvintilliarder" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gogol" -msgstr[1] "%(value)s gogoler" - -msgid "one" -msgstr "en" - -msgid "two" -msgstr "to" - -msgid "three" -msgstr "tre" - -msgid "four" -msgstr "fire" - -msgid "five" -msgstr "fem" - -msgid "six" -msgstr "seks" - -msgid "seven" -msgstr "syv" - -msgid "eight" -msgstr "otte" - -msgid "nine" -msgstr "ni" - -msgid "today" -msgstr "i dag" - -msgid "tomorrow" -msgstr "i morgen" - -msgid "yesterday" -msgstr "i går" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s siden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "en time siden" -msgstr[1] "%(count)s timer siden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "et minut siden" -msgstr[1] "%(count)s minutter siden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "et sekund siden" -msgstr[1] "%(count)s sekunder siden" - -msgid "now" -msgstr "nu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "om et sekund" -msgstr[1] "om %(count)s sekunder" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "om et minut" -msgstr[1] "om %(count)s minutter" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "om en time" -msgstr[1] "om %(count)s timer" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s fra nu af" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d måned" -msgstr[1] "%(num)d måneder" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d uge" -msgstr[1] "%(num)d uger" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dage" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timer" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minutter" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d måned" -msgstr[1] "%(num)d måneder" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d uge" -msgstr[1] "%(num)d uger" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dage" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timer" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minutter" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index df46d3c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 1fa0a64..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,330 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2011 -# Claude Paroz , 2013 -# Florian Apolloner , 2021 -# Jannis Leidel , 2011,2013-2014,2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-11-28 17:20+0000\n" -"Last-Translator: Raphael Michel \n" -"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanize" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s Million" -msgstr[1] "%(value)s Millionen" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s Milliarde" -msgstr[1] "%(value)s Milliarden" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s Billion" -msgstr[1] "%(value)s Billionen" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s Billiarde" -msgstr[1] "%(value)s Billiarden" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s Trillion" -msgstr[1] "%(value)s Trillionen" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s Trilliarde" -msgstr[1] "%(value)s Trilliarden" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s Quadrillion" -msgstr[1] "%(value)s Quadrillionen" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s Quadrilliarde" -msgstr[1] "%(value)s Quadrilliarden" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s Quintillion" -msgstr[1] "%(value)s Quintillionen" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s Quintilliarde" -msgstr[1] "%(value)s Quintilliarden" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s Sedezilliarde" -msgstr[1] "%(value)s Sedezilliarden" - -msgid "one" -msgstr "eins" - -msgid "two" -msgstr "zwei" - -msgid "three" -msgstr "drei" - -msgid "four" -msgstr "vier" - -msgid "five" -msgstr "fünf" - -msgid "six" -msgstr "sechs" - -msgid "seven" -msgstr "sieben" - -msgid "eight" -msgstr "acht" - -msgid "nine" -msgstr "neun" - -msgid "today" -msgstr "heute" - -msgid "tomorrow" -msgstr "morgen" - -msgid "yesterday" -msgstr "gestern" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s her" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "vor einer Stunde" -msgstr[1] "vor %(count)s Stunden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "vor einer Minute" -msgstr[1] "vor %(count)s Minuten" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "vor einer Sekunde" -msgstr[1] "vor %(count)s Sekunden" - -msgid "now" -msgstr "jetzt" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "in einer Sekunde" -msgstr[1] "in %(count)s Sekunden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "in einer Minute" -msgstr[1] "in %(count)s Minuten" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "in einer Stunde" -msgstr[1] "in %(count)s Stunden" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s von jetzt an" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d Jahr" -msgstr[1] "%(num)d Jahre" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d Monat" -msgstr[1] "%(num)d Monate" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d Woche" -msgstr[1] "%(num)d Wochen" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d Tage" -msgstr[1] "%(num)d Tage" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d Stunde" -msgstr[1] "%(num)d Stunden" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d Minute" -msgstr[1] "%(num)d Minuten" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d Jahr" -msgstr[1] "%(num)d Jahre" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d Monat" -msgstr[1] "%(num)d Monate" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d Woche" -msgstr[1] "%(num)d Wochen" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d Tag" -msgstr[1] "%(num)d Tage" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d Stunde" -msgstr[1] "%(num)d Stunden" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d Minute" -msgstr[1] "%(num)d Minuten" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/dsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index bbd9821..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/dsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index 11ab238..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,387 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2018,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-09-28 19:07+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Humanize" -msgstr "Humanize" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milion" -msgstr[1] "%(value)s miliona" -msgstr[2] "%(value)s miliony" -msgstr[3] "%(value)s milionow" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliarda" -msgstr[1] "%(value)s miliarźe" -msgstr[2] "%(value)s miliardy" -msgstr[3] "%(value)s miliardow" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s bilion" -msgstr[1] "%(value)s biliona" -msgstr[2] "%(value)s biliony" -msgstr[3] "%(value)s bilionow" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s biliarda" -msgstr[1] "%(value)s biliarźe" -msgstr[2] "%(value)s biliardy" -msgstr[3] "%(value)s biliardow" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trilion" -msgstr[1] "%(value)s triliona" -msgstr[2] "%(value)s triliony" -msgstr[3] "%(value)s trilionow" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s triliarda" -msgstr[1] "%(value)s triliarźe" -msgstr[2] "%(value)s triliardy" -msgstr[3] "%(value)s triliardow" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s kwadrilion" -msgstr[1] "%(value)s kwadriliona" -msgstr[2] "%(value)s kwadriliony" -msgstr[3] "%(value)s kwadrilionow" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kwadriliarda" -msgstr[1] "%(value)s kwadriliarźe" -msgstr[2] "%(value)s kwadriliardy" -msgstr[3] "%(value)s kwadriliardow" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kwintilion" -msgstr[1] "%(value)s kwintiliona" -msgstr[2] "%(value)s kwintiliony" -msgstr[3] "%(value)s kwintilionow" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kwintiliarda" -msgstr[1] "%(value)s kwintiliarźe" -msgstr[2] "%(value)s kwintiliardy" -msgstr[3] "%(value)s kwintiliardow" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s sedeciliarda" -msgstr[1] "%(value)s sedeciliarźe" -msgstr[2] "%(value)s sedeciliardy" -msgstr[3] "%(value)s sedeciliardow" - -msgid "one" -msgstr "jaden" - -msgid "two" -msgstr "dwa" - -msgid "three" -msgstr "tśi" - -msgid "four" -msgstr "styri" - -msgid "five" -msgstr "pěś" - -msgid "six" -msgstr "šesć" - -msgid "seven" -msgstr "sedym" - -msgid "eight" -msgstr "wósym" - -msgid "nine" -msgstr "źewjeś" - -msgid "today" -msgstr "źinsa" - -msgid "tomorrow" -msgstr "witśe" - -msgid "yesterday" -msgstr "cora" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "pśed %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "Pśed %(count)s góźinu" -msgstr[1] "Pśed %(count)s góźinoma" -msgstr[2] "Pśed %(count)s góźinami" -msgstr[3] "Pśed %(count)s góźinami" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "Pśed %(count)s minutu" -msgstr[1] "Pśed %(count)s minutoma" -msgstr[2] "Pśed %(count)s minutami" -msgstr[3] "Pśed %(count)s minutami" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "Pśed %(count)s sekundu" -msgstr[1] "Pśed %(count)s sekundoma" -msgstr[2] "Pśed %(count)s sekundami" -msgstr[3] "Pśed %(count)s sekundami" - -msgid "now" -msgstr "něnto" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "za %(count)s sekundu" -msgstr[1] "za %(count)s sekunźe" -msgstr[2] "za %(count)s sekundy" -msgstr[3] "za %(count)s sekundow" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "za %(count)s minutu" -msgstr[1] "za %(count)s minuśe" -msgstr[2] "za %(count)s minuty" -msgstr[3] "za %(count)s minutow" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "za %(count)s góźinu" -msgstr[1] "za %(count)s góźinje" -msgstr[2] "za %(count)s góźiny" -msgstr[3] "za %(count)s góźin" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s wótněnta" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d lěto" -msgstr[1] "%(num)d lěśe" -msgstr[2] "%(num)d lěta" -msgstr[3] "%(num)d lět" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mjasec" -msgstr[1] "%(num)d mjaseca" -msgstr[2] "%(num)d mjasece" -msgstr[3] "%(num)dmjasecow" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tyźeń" -msgstr[1] "%(num)d tyźenja" -msgstr[2] "%(num)d tyźenje" -msgstr[3] "%(num)d tyźenjow" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d źeń" -msgstr[1] "%(num)d dnja" -msgstr[2] "%(num)d dny" -msgstr[3] "%(num)d dnjow" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d góźina" -msgstr[1] "%(num)d góźinje" -msgstr[2] "%(num)d góźiny" -msgstr[3] "%(num)d góźin" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuśe" -msgstr[2] "%(num)d minuty" -msgstr[3] "%(num)d minutow" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d lěto" -msgstr[1] "%(num)d lěśe" -msgstr[2] "%(num)d lěta" -msgstr[3] "%(num)d lět" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mjasec" -msgstr[1] "%(num)d mjaseca" -msgstr[2] "%(num)d mjasece" -msgstr[3] "%(num)dmjasecow" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tyźeń" -msgstr[1] "%(num)d tyźenja" -msgstr[2] "%(num)d tyźenje" -msgstr[3] "%(num)d tyźenjow" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d źeń" -msgstr[1] "%(num)d dnja" -msgstr[2] "%(num)d dny" -msgstr[3] "%(num)d dnjow" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d góźina" -msgstr[1] "%(num)d góźinje" -msgstr[2] "%(num)d góźiny" -msgstr[3] "%(num)d góźin" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuśe" -msgstr[2] "%(num)d minuty" -msgstr[3] "%(num)d minutow" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index 5b4868f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index 6f1d0aa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,398 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dimitris Glezos , 2011 -# Jannis Leidel , 2011 -# Kostas Papadimitriou , 2012 -# Nick Mavrakis , 2018 -# Nikolas Demiridis , 2014 -# Pãnoș , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2018-09-22 10:19+0000\n" -"Last-Translator: Nick Mavrakis \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Εξανθρώπιση" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}ο" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}ο" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}ο" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}ο" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}ο" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}ο" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}ο" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}ο" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}ο" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}ο" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}ο" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f εκατομμύριο" -msgstr[1] "%(value).1f εκατομμύρια" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] " %(value)s εκατομμύριο" -msgstr[1] " %(value)s εκατομμύρια" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f δισεκατομμύριο" -msgstr[1] "%(value).1f δισεκατομμύρια" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s δισεκατομμύριο" -msgstr[1] "%(value)s δισεκατομμύρια" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f τρισεκατομμύριο" -msgstr[1] "%(value).1f τρισεκατομμύρια" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s τρισεκατομμύριο" -msgstr[1] "%(value)s τρισεκατομμύρια" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f τετράκις εκατομμύριο" -msgstr[1] "%(value).1f τετράκις εκατομμύρια" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s τετράκις εκατομμύριο" -msgstr[1] "%(value)s τετράκις εκατομμύρια" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f πεντάκις εκατομμύριo" -msgstr[1] "%(value).1f πεντάκις εκατομμύρια" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s πεντάκις εκατομμύριo" -msgstr[1] "%(value)s πεντάκις εκατομμύρια" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f εξάκις εκατομμύριo" -msgstr[1] "%(value).1f εξάκις εκατομμύρια" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s εξάκις εκατομμύριo" -msgstr[1] "%(value)s εξάκις εκατομμύρια" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f επτάκις εκατομμύριο" -msgstr[1] "%(value).1f επτάκις εκατομμύρια" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s επτάκις εκατομμύριο" -msgstr[1] "%(value)s επτάκις εκατομμύρια" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f οκτάκις εκατομμύριο" -msgstr[1] "%(value).1f οκτάκις εκατομμύρια" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s οκτάκις εκατομμύριο" -msgstr[1] "%(value)s οκτάκις εκατομμύρια" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f εννεάκις εκατομμύριο" -msgstr[1] "%(value).1f εννεάκις εκατομμύρια" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s εννεάκις εκατομμύριο" -msgstr[1] "%(value)s εννεάκις εκατομμύρια" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f δεκάκις εκατομμύριο" -msgstr[1] "%(value).1f δεκάκις εκατομμύρια" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s δεκάκις εκατομμύριο" -msgstr[1] "%(value)s δεκάκις εκατομμύρια" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f googol" -msgstr[1] "%(value).1f googol" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" - -msgid "one" -msgstr "ένα" - -msgid "two" -msgstr "δύο" - -msgid "three" -msgstr "τρία" - -msgid "four" -msgstr "τέσσερα" - -msgid "five" -msgstr "πέντε" - -msgid "six" -msgstr "έξι" - -msgid "seven" -msgstr "εφτά" - -msgid "eight" -msgstr "οκτώ" - -msgid "nine" -msgstr "εννιά" - -msgid "today" -msgstr "σήμερα" - -msgid "tomorrow" -msgstr "αύριο" - -msgid "yesterday" -msgstr "χθες" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "πριν από %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "μια ώρα πρίν" -msgstr[1] "%(count)s ώρες πρίν" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "ένα λεπτό πρίν" -msgstr[1] "%(count)s λεπτά πρίν" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "ένα δευτερόλεπτο πρίν" -msgstr[1] "%(count)s δευτερόλεπτα πρίν" - -msgid "now" -msgstr "τώρα" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "ένα δευτερόλεπτο από τώρα" -msgstr[1] "%(count)s δευτερόλεπτα από τώρα" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "ένα λεπτό από τώρα" -msgstr[1] "%(count)s λεπτά από τώρα" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "μία ώρα από τώρα" -msgstr[1] "%(count)s ώρες από τώρα" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "σε %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d χρόνος" -msgstr[1] "%d χρόνια" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d μήνας" -msgstr[1] "%d μήνες" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d εβδομάδα" -msgstr[1] "%d εβδομάδες" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d μέρα" -msgstr[1] "%d μέρες" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ώρα" -msgstr[1] "%d ώρες" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d λεπτό" -msgstr[1] "%d λεπτά" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d χρόνος" -msgstr[1] "%d χρόνια" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d μήνας" -msgstr[1] "%d μήνες" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d εβδομάδα" -msgstr[1] "%d εβδομάδες" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d μέρα" -msgstr[1] "%d μέρες" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ώρα" -msgstr[1] "%d ώρες" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d λεπτό" -msgstr[1] "%d λεπτά" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 08a7b68..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index fa868e7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,378 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: contrib/humanize/apps.py:7 -msgid "Humanize" -msgstr "" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -#: contrib/humanize/templatetags/humanize.py:35 -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -#: contrib/humanize/templatetags/humanize.py:39 -msgctxt "ordinal 0" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -#: contrib/humanize/templatetags/humanize.py:41 -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -#: contrib/humanize/templatetags/humanize.py:43 -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -#: contrib/humanize/templatetags/humanize.py:45 -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -#: contrib/humanize/templatetags/humanize.py:47 -msgctxt "ordinal 4" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -#: contrib/humanize/templatetags/humanize.py:49 -msgctxt "ordinal 5" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -#: contrib/humanize/templatetags/humanize.py:51 -msgctxt "ordinal 6" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -#: contrib/humanize/templatetags/humanize.py:53 -msgctxt "ordinal 7" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -#: contrib/humanize/templatetags/humanize.py:55 -msgctxt "ordinal 8" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -#: contrib/humanize/templatetags/humanize.py:57 -msgctxt "ordinal 9" -msgid "{}th" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:88 -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:89 -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:90 -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:94 -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:100 -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:105 -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:109 -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:111 -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:112 -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:113 -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:114 -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:158 -msgid "one" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:159 -msgid "two" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:160 -msgid "three" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:161 -msgid "four" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:162 -msgid "five" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:163 -msgid "six" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:164 -msgid "seven" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:165 -msgid "eight" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:166 -msgid "nine" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:188 -msgid "today" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:190 -msgid "tomorrow" -msgstr "" - -#: contrib/humanize/templatetags/humanize.py:192 -msgid "yesterday" -msgstr "" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 weeks' -#: contrib/humanize/templatetags/humanize.py:210 -#, python-format -msgid "%(delta)s ago" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:213 -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:216 -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:219 -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:220 -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:224 -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:229 -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:234 -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 weeks' -#: contrib/humanize/templatetags/humanize.py:237 -#, python-format -msgid "%(delta)s from now" -msgstr "" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#: contrib/humanize/templatetags/humanize.py:242 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:245 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:248 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:250 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:252 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:255 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s from now' -#: contrib/humanize/templatetags/humanize.py:262 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:265 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:268 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:271 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:274 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:277 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index b381a0f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index 6417eb8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,328 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-09-22 07:22+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanise" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}th" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}th" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}st" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}nd" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}rd" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}th" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}th" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}th" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}th" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}th" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}th" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "" - -msgid "two" -msgstr "" - -msgid "three" -msgstr "" - -msgid "four" -msgstr "" - -msgid "five" -msgstr "" - -msgid "six" -msgstr "" - -msgid "seven" -msgstr "" - -msgid "eight" -msgstr "" - -msgid "nine" -msgstr "" - -msgid "today" -msgstr "" - -msgid "tomorrow" -msgstr "" - -msgid "yesterday" -msgstr "" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index 0901a67..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index 1098658..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,263 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# bfirsh , 2011 -# jon_atkinson , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "th" - -msgid "st" -msgstr "st" - -msgid "nd" -msgstr "nd" - -msgid "rd" -msgstr "rd" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f million" -msgstr[1] "%(value).1f million" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s million" -msgstr[1] "%(value)s million" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f billion" -msgstr[1] "%(value).1f billion" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s billion" -msgstr[1] "%(value)s billion" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f trillion" -msgstr[1] "%(value).1f trillion" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trillion" -msgstr[1] "%(value)s trillion" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f quadrillion" -msgstr[1] "%(value).1f quadrillion" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s quadrillion" -msgstr[1] "%(value)s quadrillion" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f quintillion" -msgstr[1] "%(value).1f quintillion" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s quintillion" -msgstr[1] "%(value)s quintillion" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f sextillion" -msgstr[1] "%(value).1f sextillion" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextillion" -msgstr[1] "%(value)s sextillion" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f septillion" -msgstr[1] "%(value).1f septillion" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septillion" -msgstr[1] "%(value)s septillion" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f octillion" -msgstr[1] "%(value).1f octillion" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octillion" -msgstr[1] "%(value)s octillion" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f nonillion" -msgstr[1] "%(value).1f nonillion" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonillion" -msgstr[1] "%(value)s nonillion" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f decillion" -msgstr[1] "%(value).1f decillion" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decillion" -msgstr[1] "%(value)s decillion" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f googol" -msgstr[1] "%(value).1f googol" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" - -msgid "one" -msgstr "one" - -msgid "two" -msgstr "two" - -msgid "three" -msgstr "three" - -msgid "four" -msgstr "four" - -msgid "five" -msgstr "five" - -msgid "six" -msgstr "six" - -msgid "seven" -msgstr "seven" - -msgid "eight" -msgstr "eight" - -msgid "nine" -msgstr "nine" - -msgid "today" -msgstr "today" - -msgid "tomorrow" -msgstr "tomorrow" - -msgid "yesterday" -msgstr "yesterday" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "%(delta)s ago" - -msgid "now" -msgstr "now" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s from now" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index 6c0df78..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index 4f13eb3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,394 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Baptiste Darthenay , 2014,2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2018-05-24 15:17+0000\n" -"Last-Translator: Baptiste Darthenay \n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanigi" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}a" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}a" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}a" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}a" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}a" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}a" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}a" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}a" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}a" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}a" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}a" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f milionoj" -msgstr[1] "%(value).1f milionoj" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milionoj" -msgstr[1] "%(value)s milionoj" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f miliardoj" -msgstr[1] "%(value).1f miliardoj" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliardoj" -msgstr[1] "%(value)s miliardoj" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f triiliono" -msgstr[1] "%(value).1f triiliono" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s triilionoj" -msgstr[1] "%(value)s triilionoj" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f kvariliono" -msgstr[1] "%(value).1f kvariliono" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kvarilionoj" -msgstr[1] "%(value)s kvarilionoj" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f kvinilionoj" -msgstr[1] "%(value).1f kvinilionoj" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kvinilionoj" -msgstr[1] "%(value)s kvinilionoj" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f sesilionoj" -msgstr[1] "%(value).1f sesilionoj" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sesilionoj" -msgstr[1] "%(value)s sesilionoj" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f sepilionoj" -msgstr[1] "%(value).1f sepilionoj" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s sepilionoj" -msgstr[1] "%(value)s sepilionoj" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f okilionoj" -msgstr[1] "%(value).1f okilionoj" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s okilionoj" -msgstr[1] "%(value)s okilionoj" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f naŭilionoj" -msgstr[1] "%(value).1f naŭilionoj" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s naŭilionoj" -msgstr[1] "%(value)s naŭilionoj" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f dekilionoj" -msgstr[1] "%(value).1f dekilionoj" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s dekilionoj" -msgstr[1] "%(value)s dekilionoj" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f guglo" -msgstr[1] "%(value).1f guglo" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gugloj" -msgstr[1] "%(value)s gugloj" - -msgid "one" -msgstr "unu" - -msgid "two" -msgstr "du" - -msgid "three" -msgstr "tri" - -msgid "four" -msgstr "kvar" - -msgid "five" -msgstr "kvin" - -msgid "six" -msgstr "ses" - -msgid "seven" -msgstr "sep" - -msgid "eight" -msgstr "ok" - -msgid "nine" -msgstr "naŭ" - -msgid "today" -msgstr "hodiaŭ" - -msgid "tomorrow" -msgstr "morgaŭ" - -msgid "yesterday" -msgstr "hieraŭ" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "antaŭ %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "horo antaŭe" -msgstr[1] "%(count)s horoj antaŭe" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "minuto antaŭe" -msgstr[1] "%(count)s minutoj antaŭe" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "sekundo antaŭe" -msgstr[1] "%(count)s sekundoj antaŭe" - -msgid "now" -msgstr "nun" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "post sekundo" -msgstr[1] "post %(count)s sekundoj" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "post minuto" -msgstr[1] "post %(count)s minutoj" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "post horo" -msgstr[1] "post %(count)s horoj" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "antaŭ %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d jaro" -msgstr[1] "%d jaroj" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d monato" -msgstr[1] "%d monatoj" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semajno" -msgstr[1] "%d semajnoj" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d tago" -msgstr[1] "%d tagoj" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d horo" -msgstr[1] "%d horoj" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutoj" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d jaro" -msgstr[1] "%d jaroj" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d monato" -msgstr[1] "%d monatoj" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semajno" -msgstr[1] "%d semajnoj" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d tago" -msgstr[1] "%d tagoj" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d horo" -msgstr[1] "%d horoj" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutoj" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 8946e3a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index b4faf18..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,365 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2012 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2014 -# Ignacio José Lizarán Rus , 2019 -# Jannis Leidel , 2011 -# Leonardo J. Caballero G. , 2011 -# Luigy, 2019 -# ntrrgc , 2014 -# Uriel Medina , 2020-2021 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2022-04-24 18:40+0000\n" -"Last-Translator: Uriel Medina , 2020-2021\n" -"Language-Team: Spanish (http://www.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanizar" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}º" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s millon" -msgstr[1] "%(value)s millones" -msgstr[2] "%(value)s millones" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s millardo" -msgstr[1] "%(value)s millardos" -msgstr[2] "%(value)s millardos" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billón" -msgstr[1] "%(value)s billones" -msgstr[2] "%(value)s billones" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s billardos" -msgstr[1] "%(value)s billardos" -msgstr[2] "%(value)s billardos" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trillón" -msgstr[1] "%(value)s trillones" -msgstr[2] "%(value)s trillones" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s trillardo" -msgstr[1] "%(value)s trillardos" -msgstr[2] "%(value)s trillardos" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s cuatrillón" -msgstr[1] "%(value)s cuatrillones" -msgstr[2] "%(value)s cuatrillones" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s cuatrillardo" -msgstr[1] "%(value)s cuatrillardos" -msgstr[2] "%(value)s cuatrillardos" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s quintillón" -msgstr[1] "%(value)s quintillones" -msgstr[2] "%(value)s quintillones" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s quintillardo" -msgstr[1] "%(value)s quintillardos" -msgstr[2] "%(value)s quintillardos" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] " %(value)s googol" -msgstr[1] " %(value)s gúgoles" -msgstr[2] " %(value)s gúgoles" - -msgid "one" -msgstr "uno" - -msgid "two" -msgstr "dos" - -msgid "three" -msgstr "tres" - -msgid "four" -msgstr "cuatro" - -msgid "five" -msgstr "cinco" - -msgid "six" -msgstr "seis" - -msgid "seven" -msgstr "siete" - -msgid "eight" -msgstr "ocho" - -msgid "nine" -msgstr "nueve" - -msgid "today" -msgstr "hoy" - -msgid "tomorrow" -msgstr "mañana" - -msgid "yesterday" -msgstr "ayer" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "hace %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "hace una hora" -msgstr[1] "hace %(count)s horas" -msgstr[2] "hace %(count)s horas" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "hace un minuto" -msgstr[1] "hace %(count)s minutos" -msgstr[2] "hace %(count)s minutos" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "hace un segundo" -msgstr[1] "hace %(count)s segundos" -msgstr[2] "hace %(count)s segundos" - -msgid "now" -msgstr "ahora" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "un segundo a partir de ahora" -msgstr[1] "%(count)s segundos a partir de ahora" -msgstr[2] "%(count)s segundos a partir de ahora" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "un minuto a partir de ahora" -msgstr[1] "%(count)s minutos a partir de ahora" -msgstr[2] "%(count)s minutos a partir de ahora" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "una hora a partir de ahora" -msgstr[1] "%(count)s horas a partir de ahora" -msgstr[2] "%(count)s horas a partir de ahora" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s desde ahora" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d año" -msgstr[1] "%(num)d años" -msgstr[2] "%(num)d años" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" -msgstr[2] "%(num)d días" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d año" -msgstr[1] "%(num)d años" -msgstr[2] "%(num)d años" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" -msgstr[2] "%(num)d días" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index 62767df..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 11624ab..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2017 -# Jannis Leidel , 2011 -# lardissone , 2014 -# lardissone , 2014 -# Ramiro Morales, 2012,2014-2015,2018,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-11-19 15:15+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanización" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}.º" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s millón" -msgstr[1] "%(value)s millones" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s millardo" -msgstr[1] "%(value)s millardos" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billón" -msgstr[1] "%(value)s billones" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s mil billones" -msgstr[1] "%(value)s miles de billones" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trillón" -msgstr[1] "%(value)s trilliones" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s mil trillones" -msgstr[1] "%(value)s miles de trillones" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s cuatrillón" -msgstr[1] "%(value)s cuatrillones" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s mil cuatrillones" -msgstr[1] "%(value)s miles de cuatrillones" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s quintillón" -msgstr[1] "%(value)s quintillones" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s mil quintillones" -msgstr[1] "%(value)s miles de quintillones" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s \"gúgol\"" -msgstr[1] "%(value)s \"gúgols\"" - -msgid "one" -msgstr "uno" - -msgid "two" -msgstr "dos" - -msgid "three" -msgstr "tres" - -msgid "four" -msgstr "cuatro" - -msgid "five" -msgstr "cinco" - -msgid "six" -msgstr "seis" - -msgid "seven" -msgstr "siete" - -msgid "eight" -msgstr "ocho" - -msgid "nine" -msgstr "nueve" - -msgid "today" -msgstr "hoy" - -msgid "tomorrow" -msgstr "mañana" - -msgid "yesterday" -msgstr "ayer" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "hace %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "hace una hora" -msgstr[1] "hace %(count)s horas" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "hace un minuto" -msgstr[1] "hace %(count)s minutos" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "hace un segundo" -msgstr[1] "hace %(count)s segundos" - -msgid "now" -msgstr "ahora" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "dentro de un segundo" -msgstr[1] "dentro de %(count)s segundos" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "dentro de un minuto" -msgstr[1] "dentro de %(count)s minutos" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "dentro de una hora" -msgstr[1] "dentro de %(count)s horas" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "dentro de %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d año" -msgstr[1] "%(num)d años" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d año" -msgstr[1] "%(num)d años" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index 3a00392..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index 75648b1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,267 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2012 -# Ernesto Avilés Vázquez , 2014 -# Jannis Leidel , 2011 -# Leonardo J. Caballero G. , 2011 -# ntrrgc , 2014 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 21:47+0000\n" -"Last-Translator: Carlos Muñoz \n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanizar" - -msgid "th" -msgstr "º" - -msgid "st" -msgstr "º" - -msgid "nd" -msgstr "º" - -msgid "rd" -msgstr "º" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f millón" -msgstr[1] "%(value).1f millón" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s millón" -msgstr[1] "%(value)s millones" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f millardo" -msgstr[1] "%(value).1f millardos" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s millardo" -msgstr[1] "%(value)s millardos" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f billón" -msgstr[1] "%(value).1f billón" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billón" -msgstr[1] "%(value)s billones" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f billardo" -msgstr[1] "%(value).1f billardos" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s billardos" -msgstr[1] "%(value)s billardos" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f trillón" -msgstr[1] "%(value).1f trillones" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trillón" -msgstr[1] "%(value)s trillones" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f trillardo" -msgstr[1] "%(value).1f trillardos" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s trillardo" -msgstr[1] "%(value)s trillardos" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f cuatrillón" -msgstr[1] "%(value).1f cuatrillones" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s cuatrillón" -msgstr[1] "%(value)s cuatrillones" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f cuatrillardo" -msgstr[1] "%(value).1f cuatrillardos" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s cuatrillardo" -msgstr[1] "%(value)s cuatrillardos" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f quintillón" -msgstr[1] "%(value).1f quintillones" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s quintillón" -msgstr[1] "%(value)s quintillones" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f quintillardo" -msgstr[1] "%(value).1f quintillardos" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s quintillardo" -msgstr[1] "%(value)s quintillardos" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f googol" -msgstr[1] "%(value).1f googol" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] " %(value)s googol" -msgstr[1] " %(value)s googol" - -msgid "one" -msgstr "uno" - -msgid "two" -msgstr "dos" - -msgid "three" -msgstr "tres" - -msgid "four" -msgstr "cuatro" - -msgid "five" -msgstr "cinco" - -msgid "six" -msgstr "seis" - -msgid "seven" -msgstr "siete" - -msgid "eight" -msgstr "ocho" - -msgid "nine" -msgstr "nueve" - -msgid "today" -msgstr "hoy" - -msgid "tomorrow" -msgstr "mañana" - -msgid "yesterday" -msgstr "ayer" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "hace %(delta)s" - -msgid "now" -msgstr "ahora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "hace un segundo" -msgstr[1] "hace %(count)s segundos" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "hace un minuto" -msgstr[1] "hace %(count)s minutos" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "hace una hora" -msgstr[1] "hace %(count)s horas" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s a partir de ahora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "un segundo a partir de ahora" -msgstr[1] "%(count)s segundos a partir de ahora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "un minuto a partir de ahora" -msgstr[1] "%(count)s minutos a partir de ahora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "una hora a partir de ahora" -msgstr[1] "%(count)s horas a partir de ahora" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index b5199ef..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index b3f666b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,264 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abraham Estrada, 2011-2012 -# Alex Dzul , 2015 -# Juan Pablo Flores , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 18:03+0000\n" -"Last-Translator: Juan Pablo Flores \n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanizar" - -msgid "th" -msgstr "to" - -msgid "st" -msgstr "ro" - -msgid "nd" -msgstr "do" - -msgid "rd" -msgstr "ro" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f millón" -msgstr[1] "%(value).1f millones" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s millones" -msgstr[1] "%(value)s millones" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f billón" -msgstr[1] "%(value).1f billones" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s billiones" -msgstr[1] "%(value)s billiones" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f trillón" -msgstr[1] "%(value).1f trillones" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trilliones" -msgstr[1] "%(value)s trilliones" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f cuatrillón" -msgstr[1] "%(value).1f cuatrillones" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s cuatrillón" -msgstr[1] "%(value)s cuatrillones" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f quintillón" -msgstr[1] "%(value).1f quintillones" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s quintillón" -msgstr[1] "%(value)s quintillones" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f sextillón" -msgstr[1] "%(value).1f sextillones" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextillón" -msgstr[1] "%(value)s sextillones" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f septillón" -msgstr[1] "%(value).1f septillones" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septillón" -msgstr[1] "%(value)s septillones" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f octillón" -msgstr[1] "%(value).1f octillones" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octillón" -msgstr[1] "%(value)s octillones" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f nonillion" -msgstr[1] "%(value).1f nonillion" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonillón" -msgstr[1] "%(value)s nonillones" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f decillón" -msgstr[1] "%(value).1f decillones" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decillón" -msgstr[1] "%(value)s decillones" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f googol" -msgstr[1] "%(value).1f googoles" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googoles" - -msgid "one" -msgstr "uno" - -msgid "two" -msgstr "dos" - -msgid "three" -msgstr "tres" - -msgid "four" -msgstr "cuatro" - -msgid "five" -msgstr "cinco" - -msgid "six" -msgstr "seis" - -msgid "seven" -msgstr "siete" - -msgid "eight" -msgstr "ocho" - -msgid "nine" -msgstr "nueve" - -msgid "today" -msgstr "hoy" - -msgid "tomorrow" -msgstr "mañana" - -msgid "yesterday" -msgstr "ayer" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "hace %(delta)s" - -msgid "now" -msgstr "ahora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "hace un segundo" -msgstr[1] "Hace %(count)s segundos" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "hace un minuto" -msgstr[1] "Hace %(count)s minutos" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "hace una hora" -msgstr[1] "Hace %(count)s horas" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s a partir de ahora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "Un segundo desde ahora" -msgstr[1] "%(count)s desde ahora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index 31bccab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index d5ebd03..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,262 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eduardo , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 21:47+0000\n" -"Last-Translator: Eduardo \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" -"language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanizar" - -msgid "th" -msgstr "" - -msgid "st" -msgstr "" - -msgid "nd" -msgstr "" - -msgid "rd" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "uno" - -msgid "two" -msgstr "dos" - -msgid "three" -msgstr "tres" - -msgid "four" -msgstr "cuatro" - -msgid "five" -msgstr "cinco" - -msgid "six" -msgstr "seis" - -msgid "seven" -msgstr "siete" - -msgid "eight" -msgstr "ocho" - -msgid "nine" -msgstr "nueve" - -msgid "today" -msgstr "hoy" - -msgid "tomorrow" -msgstr "mañana" - -msgid "yesterday" -msgstr "ayer" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "ahora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/et/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index 85274d0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/et/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index 16cf8fb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,334 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2013 -# Jannis Leidel , 2011 -# Janno Liivak , 2013 -# Martin , 2021 -# Martin , 2019 -# Marti Raudsepp , 2014 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-11-19 08:47+0000\n" -"Last-Translator: Martin \n" -"Language-Team: Estonian (http://www.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Inimlikustamine" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s miljon" -msgstr[1] "%(value)s miljonit" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miljard" -msgstr[1] "%(value)s miljardit" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s triljon" -msgstr[1] "%(value)s triljonit" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kvadriljon" -msgstr[1] "%(value)s kvadriljonit" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kvintiljon" -msgstr[1] "%(value)s kvintiljonit" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sekstiljon" -msgstr[1] "%(value)s sekstiljonit" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septiljon" -msgstr[1] "%(value)s septiljonit" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktiljon" -msgstr[1] "%(value)s oktiljonit" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s noniljon" -msgstr[1] "%(value)s noniljonit" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s detsiljon" -msgstr[1] "%(value)s detsiljonit" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googolit" - -msgid "one" -msgstr "üks" - -msgid "two" -msgstr "kaks" - -msgid "three" -msgstr "kolm" - -msgid "four" -msgstr "neli" - -msgid "five" -msgstr "viis" - -msgid "six" -msgstr "kuus" - -msgid "seven" -msgstr "seitse" - -msgid "eight" -msgstr "kaheksa" - -msgid "nine" -msgstr "üheksa" - -msgid "today" -msgstr "täna" - -msgid "tomorrow" -msgstr "homme" - -msgid "yesterday" -msgstr "eile" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s tagasi" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "tund tagasi" -msgstr[1] "%(count)s tundi tagasi" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "minut tagasi" -msgstr[1] "%(count)s minutit tagasi" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "sekund tagasi" -msgstr[1] "%(count)s sekundit tagasi" - -msgid "now" -msgstr "praegu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "sekund praegusest hetkest" -msgstr[1] "%(count)s sekundit praegusest hetkest" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "minut praegusest hetkest" -msgstr[1] "%(count)s minutit praegusest hetkest" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "tund praegusest hetkest" -msgstr[1] "%(count)s tundi praegusest hetkest" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s praegusest hetkest" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d aasta" -msgstr[1] "%(num)d aastat" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d kuu" -msgstr[1] "%(num)d kuud" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nädal" -msgstr[1] "%(num)d nädalat" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d päev" -msgstr[1] "%(num)d päeva" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d tund" -msgstr[1] "%(num)d tundi" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minutit" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d aasta" -msgstr[1] "%(num)d aastat" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d kuu" -msgstr[1] "%(num)d kuud" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nädal" -msgstr[1] "%(num)d nädalat" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d päev" -msgstr[1] "%(num)d päeva" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d tund" -msgstr[1] "%(num)d tundi" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minutit" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index 7efd0e2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index 648bf69..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aitzol Naberan , 2011-2012,2016 -# Ander Martinez , 2014 -# Eneko Illarramendi , 2017-2018,2022,2024 -# Jannis Leidel , 2011 -# julen, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-08-07 18:40+0000\n" -"Last-Translator: Eneko Illarramendi , " -"2017-2018,2022,2024\n" -"Language-Team: Basque (http://app.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Gizakitu" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "milioi %(value)s" -msgstr[1] "%(value)s milioi" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "bilioi %(value)s" -msgstr[1] "%(value)s bilioi" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "trilioi %(value)s" -msgstr[1] "%(value)s trilioi" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "kuatrilioi %(value)s" -msgstr[1] "%(value)s kuatrilioi" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "kintilioi %(value)s" -msgstr[1] "%(value)s kintilioi" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "sextilioi %(value)s" -msgstr[1] "%(value)s sextilioi" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "septilioi %(value)s" -msgstr[1] "%(value)s septilioi" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "octillioi %(value)s" -msgstr[1] " %(value)s octilioi" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "nonilioi %(value)s" -msgstr[1] "%(value)s nonilioi" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "dezilioi %(value)s " -msgstr[1] "%(value)s dezilioi" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "googol %(value)s" -msgstr[1] "%(value)s googol" - -msgid "one" -msgstr "bat" - -msgid "two" -msgstr "bi" - -msgid "three" -msgstr "hiru" - -msgid "four" -msgstr "lau" - -msgid "five" -msgstr "bost" - -msgid "six" -msgstr "sei" - -msgid "seven" -msgstr "zazpi" - -msgid "eight" -msgstr "zortzi" - -msgid "nine" -msgstr "bederatzi" - -msgid "today" -msgstr "gaur" - -msgid "tomorrow" -msgstr "bihar" - -msgid "yesterday" -msgstr "atzo" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "duela %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "duela ordubete" -msgstr[1] "duela %(count)s ordu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "duela minutu bat" -msgstr[1] "duela %(count)s minutu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "duela segundu bat" -msgstr[1] "duela %(count)s segundo" - -msgid "now" -msgstr "orain" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "segundu bat barru" -msgstr[1] "%(count)s segundo barru" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "minutu bat barru" -msgstr[1] "%(count)s minutu barru" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "ordubete barru" -msgstr[1] "%(count)s ordu barru" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s barru" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] " urte %(num)d" -msgstr[1] "%(num)d urte" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "hilabete %(num)d" -msgstr[1] "%(num)d hilabete" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "aste %(num)d" -msgstr[1] "%(num)d aste" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "egun %(num)d" -msgstr[1] "%(num)d egun" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "ordu %(num)d" -msgstr[1] "%(num)d ordu" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "minutu %(num)d" -msgstr[1] "%(num)d minutu" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "urte %(num)d" -msgstr[1] "%(num)d urte" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "hilabete %(num)d" -msgstr[1] "%(num)d hilabete" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "aste %(num)d" -msgstr[1] "%(num)d aste" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "egun %(num)d" -msgstr[1] "%(num)d egun" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "ordu %(num)d" -msgstr[1] "%(num)d ordu" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "minutu %(num)d" -msgstr[1] "%(num)d minutu" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index b8fe938..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index 25daae9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,335 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Nikneshan , 2012 -# Alireza Savand , 2012 -# Claude Paroz , 2013 -# Eshagh , 2022 -# Jannis Leidel , 2011 -# MJafar Mashhadi , 2018 -# Mohammad Hossein Mojtahedi , 2016 -# Reza Mohammadi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2022-07-24 18:40+0000\n" -"Last-Translator: Eshagh \n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Humanize" -msgstr "انسانی‌سازی" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}م" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}م" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}ین" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}م" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}م" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}م" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}م" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}م" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}م" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}م" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}م" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s میلیون" -msgstr[1] "%(value)s میلیون" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s میلیارد" -msgstr[1] "%(value)s میلیارد" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s تریلیون" -msgstr[1] "%(value)s تریلیون" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s کوادریلیون" -msgstr[1] "%(value)s کوادریلیون" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s کوانتینیوم" -msgstr[1] "%(value)s کوانتینیوم" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s با ۲۱ صفر" -msgstr[1] "%(value)s با ۲۱ صفر" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s سپتیلیون" -msgstr[1] "%(value)s سپتیلیون" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octillion" -msgstr[1] "%(value)s octillion" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s با ۵۴ صفر" -msgstr[1] "%(value)s با ۵۴ صفر" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s با شصت صفر" -msgstr[1] "%(value)s با شصت صفر" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s گوگُل" -msgstr[1] "%(value)s گوگُل" - -msgid "one" -msgstr "یک" - -msgid "two" -msgstr "دو" - -msgid "three" -msgstr "سه" - -msgid "four" -msgstr "چهار" - -msgid "five" -msgstr "پنج" - -msgid "six" -msgstr "شش" - -msgid "seven" -msgstr "هفت" - -msgid "eight" -msgstr "هشت" - -msgid "nine" -msgstr "نُه" - -msgid "today" -msgstr "امروز" - -msgid "tomorrow" -msgstr "فردا" - -msgid "yesterday" -msgstr "دیروز" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s پیش" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s ساعت پیش" -msgstr[1] "%(count)s ساعت پیش" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s دقیقه پیش" -msgstr[1] "%(count)s دقیقه پیش" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s ثانیه پیش" -msgstr[1] "%(count)s ثانیه پیش" - -msgid "now" -msgstr "اکنون" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s ثانیه دیگر" -msgstr[1] "%(count)s ثانیه دیگر" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s دقیقه دیگر" -msgstr[1] "%(count)s دقیقه دیگر" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s ساعت دیگر" -msgstr[1] "%(count)s ساعت دیگر" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s دیگر" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d سال" -msgstr[1] "%(num)d سال" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ماه" -msgstr[1] "%(num)d ماه" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d هفته" -msgstr[1] "%(num)d هفته" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d روز" -msgstr[1] "%(num)d روز" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ساعت" -msgstr[1] "%(num)d ساعت" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d دقیقه" -msgstr[1] "%(num)d دقیقه" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d سال" -msgstr[1] "%(num)d سال" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ماه" -msgstr[1] "%(num)d ماه" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d هفته" -msgstr[1] "%(num)d هفته" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d روز" -msgstr[1] "%(num)d روز" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ساعت" -msgstr[1] "%(num)d ساعت" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d دقیقه" -msgstr[1] "%(num)d دقیقه" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index 54466b8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index aee5335..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,331 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2020-2021 -# Antti Kaihola , 2011 -# Jannis Leidel , 2011 -# Lasse Liehu , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-11-22 15:15+0000\n" -"Last-Translator: Aarni Koskela\n" -"Language-Team: Finnish (http://www.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Ihmistys" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s miljoona" -msgstr[1] "%(value)s miljoonaa" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miljardi" -msgstr[1] "%(value)s miljardia" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s biljoona" -msgstr[1] "%(value)s biljoonaa" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kvadriljoona" -msgstr[1] "%(value)s kvadriljoonaa" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kvintiljoona" -msgstr[1] "%(value)s kvintiljoonaa" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sekstiljoona" -msgstr[1] "%(value)s sekstiljoonaa" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septiljoona" -msgstr[1] "%(value)s septiljoonaa" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktiljoona" -msgstr[1] "%(value)s oktiljoonaa" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s noniljoona" -msgstr[1] "%(value)s noniljoonaa" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s dekiljoona" -msgstr[1] "%(value)s dekiljoonaa" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googolia" - -msgid "one" -msgstr "yksi" - -msgid "two" -msgstr "kaksi" - -msgid "three" -msgstr "kolme" - -msgid "four" -msgstr "neljä" - -msgid "five" -msgstr "viisi" - -msgid "six" -msgstr "kuusi" - -msgid "seven" -msgstr "seitsemän" - -msgid "eight" -msgstr "kahdeksan" - -msgid "nine" -msgstr "yhdeksän" - -msgid "today" -msgstr "tänään" - -msgid "tomorrow" -msgstr "huomenna" - -msgid "yesterday" -msgstr "eilen" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s sitten" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "tunti sitten" -msgstr[1] "%(count)s tuntia sitten" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "minuutti sitten" -msgstr[1] "%(count)s minuuttia sitten" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "sekunti sitten" -msgstr[1] "%(count)s sekuntia sitten" - -msgid "now" -msgstr "nyt" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "sekunnin päästä" -msgstr[1] "%(count)s sekunnin päästä" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "minuutin päästä" -msgstr[1] "%(count)s minuutin päästä" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "tunnin päästä" -msgstr[1] "%(count)s tunnin päästä" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s nykyhetkestä" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d vuosi" -msgstr[1] "%(num)d vuotta" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)dkuukausi" -msgstr[1] "%(num)dkuukautta" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d viikko" -msgstr[1] "%(num)d viikkoa" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)dpäivä" -msgstr[1] "%(num)d päivää" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d tunti" -msgstr[1] "%(num)d tuntia" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuutti" -msgstr[1] "%(num)d minuuttia" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d vuosi" -msgstr[1] "%(num)d vuotta" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d kuukausi" -msgstr[1] "%(num)d kuukautta " - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d viikko" -msgstr[1] "%(num)d viikkoa" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d päivä" -msgstr[1] "%(num)d päivää" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d tunti" -msgstr[1] "%(num)d tuntia" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuutti" -msgstr[1] "%(num)d minuuttia" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index eb8e731..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index c5a7e2a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,360 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2013-2014,2018-2019,2021 -# Claude Paroz , 2011 -# Jannis Leidel , 2011 -# Jean-Baptiste Mora, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2023-04-24 18:40+0000\n" -"Last-Translator: Claude Paroz , " -"2013-2014,2018-2019,2021\n" -"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Humanize" -msgstr "Humanisation" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}er" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}e" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s million" -msgstr[1] "%(value)s millions" -msgstr[2] "%(value)s millions" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milliard" -msgstr[1] "%(value)s milliards" -msgstr[2] "%(value)s milliards" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billion" -msgstr[1] "%(value)s billions" -msgstr[2] "%(value)s billions" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s quadrillion" -msgstr[1] "%(value)s quadrillions" -msgstr[2] "%(value)s quadrillions" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s quintillion" -msgstr[1] "%(value)s quintillions" -msgstr[2] "%(value)s quintillions" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextillion" -msgstr[1] "%(value)s sextillion" -msgstr[2] "%(value)s sextillion" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septillion" -msgstr[1] "%(value)s septillions" -msgstr[2] "%(value)s septillions" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octillion" -msgstr[1] "%(value)s octillions" -msgstr[2] "%(value)s octillions" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonillion" -msgstr[1] "%(value)s nonillions" -msgstr[2] "%(value)s nonillions" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s décillion" -msgstr[1] "%(value)s décillions" -msgstr[2] "%(value)s décillions" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gogol" -msgstr[1] "%(value)s gogols" -msgstr[2] "%(value)s gogols" - -msgid "one" -msgstr "un" - -msgid "two" -msgstr "deux" - -msgid "three" -msgstr "trois" - -msgid "four" -msgstr "quatre" - -msgid "five" -msgstr "cinq" - -msgid "six" -msgstr "six" - -msgid "seven" -msgstr "sept" - -msgid "eight" -msgstr "huit" - -msgid "nine" -msgstr "neuf" - -msgid "today" -msgstr "aujourd'hui" - -msgid "tomorrow" -msgstr "demain" - -msgid "yesterday" -msgstr "hier" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "il y a %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "il y a une heure" -msgstr[1] "il y a %(count)s heures" -msgstr[2] "il y a %(count)s heures" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "il y a une minute" -msgstr[1] "il y a %(count)s minutes" -msgstr[2] "il y a %(count)s minutes" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "il y a une seconde" -msgstr[1] "il y a %(count)s secondes" -msgstr[2] "il y a %(count)s secondes" - -msgid "now" -msgstr "maintenant" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "dans une seconde" -msgstr[1] "dans %(count)s secondes" -msgstr[2] "dans %(count)s secondes" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "dans une minute" -msgstr[1] "dans %(count)s minutes" -msgstr[2] "dans %(count)s minutes" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "dans une heure" -msgstr[1] "dans %(count)s heures" -msgstr[2] "dans %(count)s heures" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "dans %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d année" -msgstr[1] "%(num)d années" -msgstr[2] "%(num)d années" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mois" -msgstr[1] "%(num)d mois" -msgstr[2] "%(num)d mois" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semaine" -msgstr[1] "%(num)d semaines" -msgstr[2] "%(num)d semaines" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d jour" -msgstr[1] "%(num)d jours" -msgstr[2] "%(num)d jours" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d heure" -msgstr[1] "%(num)d heures" -msgstr[2] "%(num)d heures" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minute" -msgstr[1] "%(num)d minutes" -msgstr[2] "%(num)d minutes" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d année" -msgstr[1] "%(num)d années" -msgstr[2] "%(num)d années" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mois" -msgstr[1] "%(num)d mois" -msgstr[2] "%(num)d mois" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semaine" -msgstr[1] "%(num)d semaines" -msgstr[2] "%(num)d semaines" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d jour" -msgstr[1] "%(num)d jours" -msgstr[2] "%(num)d jours" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d heure" -msgstr[1] "%(num)d heures" -msgstr[2] "%(num)d heures" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minute" -msgstr[1] "%(num)d minutes" -msgstr[2] "%(num)d minutes" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index 489bbab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index 2ae2bf8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,261 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "" - -msgid "st" -msgstr "" - -msgid "nd" -msgstr "" - -msgid "rd" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "" - -msgid "two" -msgstr "" - -msgid "three" -msgstr "" - -msgid "four" -msgstr "" - -msgid "five" -msgstr "" - -msgid "six" -msgstr "" - -msgid "seven" -msgstr "" - -msgid "eight" -msgstr "" - -msgid "nine" -msgstr "" - -msgid "today" -msgstr "" - -msgid "tomorrow" -msgstr "" - -msgid "yesterday" -msgstr "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ga/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index abbfd57..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ga/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index 0e99520..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,418 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Jannis Leidel , 2011 -# Luke Blaney , 2019 -# Michael Thornhill , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-10-07 18:40+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -msgid "Humanize" -msgstr "Déan daonnachadh" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}ú" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}ú" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}ú" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}ú" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}ú" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}ú" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}ú" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}ú" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}ú" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}ú" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}ú" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] " %(value)s milliún" -msgstr[1] " %(value)s milliún" -msgstr[2] " %(value)s milliún" -msgstr[3] " %(value)s milliún" -msgstr[4] " %(value)s milliún" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] " %(value)s billiún" -msgstr[1] " %(value)s billiún" -msgstr[2] " %(value)s billiún" -msgstr[3] " %(value)s billiún" -msgstr[4] " %(value)s billiún" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] " %(value)s trilliún" -msgstr[1] " %(value)s trilliún" -msgstr[2] " %(value)s trilliún" -msgstr[3] " %(value)s trilliún" -msgstr[4] " %(value)s trilliún" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s quadrilliún" -msgstr[1] "%(value)s quadrilliún" -msgstr[2] "%(value)s quadrilliún" -msgstr[3] "%(value)s quadrilliún" -msgstr[4] "%(value)s quadrilliún" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s quintillion" -msgstr[1] "%(value)s quintillion" -msgstr[2] "%(value)s quintillion" -msgstr[3] "%(value)s quintillion" -msgstr[4] "%(value)s quintillion" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextillion" -msgstr[1] "%(value)s sextillion" -msgstr[2] "%(value)s sextillion" -msgstr[3] "%(value)s sextillion" -msgstr[4] "%(value)s sextillion" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septillion" -msgstr[1] "%(value)s septillion" -msgstr[2] "%(value)s septillion" -msgstr[3] "%(value)s septillion" -msgstr[4] "%(value)s septillion" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octillion" -msgstr[1] "%(value)s octillion" -msgstr[2] "%(value)s octillion" -msgstr[3] "%(value)s octillion" -msgstr[4] "%(value)s octillion" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonillion" -msgstr[1] "%(value)s nonillion" -msgstr[2] "%(value)s nonillion" -msgstr[3] "%(value)s nonillion" -msgstr[4] "%(value)s nonillion" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decillion" -msgstr[1] "%(value)s decillion" -msgstr[2] "%(value)s decillion" -msgstr[3] "%(value)s decillion" -msgstr[4] "%(value)s decillion" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" -msgstr[2] "%(value)s googol" -msgstr[3] "%(value)s googol" -msgstr[4] "%(value)s googol" - -msgid "one" -msgstr "aon" - -msgid "two" -msgstr "dó" - -msgid "three" -msgstr "trí" - -msgid "four" -msgstr "ceathair" - -msgid "five" -msgstr "cúig" - -msgid "six" -msgstr "sé" - -msgid "seven" -msgstr "seacht" - -msgid "eight" -msgstr "ocht" - -msgid "nine" -msgstr "naoi" - -msgid "today" -msgstr "inniu" - -msgid "tomorrow" -msgstr "amárach" - -msgid "yesterday" -msgstr "inné" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s ó shin" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "uair an chloig ó shin" -msgstr[1] "%(count)s uair an chloig ó shin" -msgstr[2] "%(count)s uair an chloig ó shin" -msgstr[3] "%(count)s uair an chloig ó shin" -msgstr[4] "%(count)s uair an chloig ó shin" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "nóiméad ó shin" -msgstr[1] "%(count)s nóiméad ó shin" -msgstr[2] "%(count)s nóiméad ó shin" -msgstr[3] "%(count)s nóiméad ó shin" -msgstr[4] "%(count)s nóiméad ó shin" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "soicind ó shin" -msgstr[1] "%(count)s soicindí ó shin" -msgstr[2] "%(count)s soicindí ó shin" -msgstr[3] "%(count)s soicindí ó shin" -msgstr[4] "%(count)s soicindí ó shin" - -msgid "now" -msgstr "anois" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "soicind as seo amach" -msgstr[1] "%(count)s soicind as seo amach" -msgstr[2] "%(count)s soicind as seo amach" -msgstr[3] "%(count)s soicind as seo amach" -msgstr[4] "%(count)s soicind as seo amach" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "nóiméad ó anois" -msgstr[1] "%(count)s nóiméad as seo" -msgstr[2] "%(count)s nóiméad as seo" -msgstr[3] "%(count)s nóiméad as seo" -msgstr[4] "%(count)s nóiméad as seo" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "uair an chloig ó anois" -msgstr[1] "%(count)s uair an chloig as seo amach" -msgstr[2] "%(count)s uair an chloig as seo amach" -msgstr[3] "%(count)s uair an chloig as seo amach" -msgstr[4] "%(count)s uair an chloig as seo amach" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s as seo amach" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d bhliain" -msgstr[1] "%(num)d bliain" -msgstr[2] "%(num)d bliain" -msgstr[3] "%(num)d bliain" -msgstr[4] "%(num)d bliain" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mí" -msgstr[1] "%(num)d mí" -msgstr[2] "%(num)d mí" -msgstr[3] "%(num)d mí" -msgstr[4] "%(num)d mí" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d seachtain" -msgstr[1] "%(num)d seachtain" -msgstr[2] "%(num)d seachtain" -msgstr[3] "%(num)d seachtain" -msgstr[4] "%(num)d seachtain" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d lá" -msgstr[1] "%(num)d lá" -msgstr[2] "%(num)d lá" -msgstr[3] "%(num)d lá" -msgstr[4] "%(num)d lá" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uair" -msgstr[1] "%(num)d uair an chloig" -msgstr[2] "%(num)d uair an chloig" -msgstr[3] "%(num)d uair an chloig" -msgstr[4] "%(num)d uair an chloig" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d nóiméad" -msgstr[1] "%(num)d nóiméad" -msgstr[2] "%(num)d nóiméad" -msgstr[3] "%(num)d nóiméad" -msgstr[4] "%(num)d nóiméad" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d bhliain" -msgstr[1] "%(num)d bliain" -msgstr[2] "%(num)d bliain" -msgstr[3] "%(num)d bliain" -msgstr[4] "%(num)d bliain" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mí" -msgstr[1] "%(num)d mí" -msgstr[2] "%(num)d mí" -msgstr[3] "%(num)d mí" -msgstr[4] "%(num)d mí" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d seachtain" -msgstr[1] "%(num)d seachtain" -msgstr[2] "%(num)d seachtain" -msgstr[3] "%(num)d seachtain" -msgstr[4] "%(num)d seachtain" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d lá" -msgstr[1] "%(num)d lá" -msgstr[2] "%(num)d lá" -msgstr[3] "%(num)d lá" -msgstr[4] "%(num)d lá" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uair" -msgstr[1] "%(num)d uair an chloig" -msgstr[2] "%(num)d uair an chloig" -msgstr[3] "%(num)d uair an chloig" -msgstr[4] "%(num)d uair an chloig" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d nóiméad" -msgstr[1] "%(num)d nóiméad" -msgstr[2] "%(num)d nóiméad" -msgstr[3] "%(num)d nóiméad" -msgstr[4] "%(num)d nóiméad" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gd/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index 8c2fac1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gd/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index 7101512..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,389 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2021 -# GunChleoc, 2015 -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-12-24 18:40+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -msgid "Humanize" -msgstr "Humanize" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}mh" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}mh" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}d" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}na" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}s" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}mh" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}mh" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}mh" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}mh" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}mh" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}mh" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s mhillean" -msgstr[1] "%(value)s mhillean" -msgstr[2] "%(value)s milleanan" -msgstr[3] "%(value)s millean" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s bhillean" -msgstr[1] "%(value)s bhillean" -msgstr[2] "%(value)s billeanan" -msgstr[3] "%(value)s billean" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trillean" -msgstr[1] "%(value)s thrillean" -msgstr[2] "%(value)s trilleanan" -msgstr[3] "%(value)s trillean" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s quadrillean" -msgstr[1] "%(value)s quadrillean" -msgstr[2] "%(value)s quadrilleanan" -msgstr[3] "%(value)s quadrillean" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s quintillean" -msgstr[1] "%(value)s quintillean" -msgstr[2] "%(value)s quintilleanan" -msgstr[3] "%(value)s quintillean" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextillean" -msgstr[1] "%(value)s shextillean" -msgstr[2] "%(value)s sextilleanan" -msgstr[3] "%(value)s sextillean" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septillean" -msgstr[1] "%(value)s sheptillean" -msgstr[2] "%(value)s septilleanan" -msgstr[3] "%(value)s septillean" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octillean" -msgstr[1] "%(value)s octillean" -msgstr[2] "%(value)s octilleanan" -msgstr[3] "%(value)s octillean" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonillean" -msgstr[1] "%(value)s nonillean" -msgstr[2] "%(value)s nonilleanan" -msgstr[3] "%(value)s nonillean" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decillean" -msgstr[1] "%(value)s dhecillean" -msgstr[2] "%(value)s decilleanan" -msgstr[3] "%(value)s decillean" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s ghoogol" -msgstr[1] "%(value)s ghoogol" -msgstr[2] "%(value)s googolan" -msgstr[3] "%(value)s googol" - -msgid "one" -msgstr "aon" - -msgid "two" -msgstr "dà" - -msgid "three" -msgstr "trì" - -msgid "four" -msgstr "ceithir" - -msgid "five" -msgstr "còig" - -msgid "six" -msgstr "sia" - -msgid "seven" -msgstr "seachd" - -msgid "eight" -msgstr "ochd" - -msgid "nine" -msgstr "naoidh" - -msgid "today" -msgstr "an-diugh" - -msgid "tomorrow" -msgstr "a-màireach" - -msgid "yesterday" -msgstr "an-dè" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s air ais" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s uair a thìde air ais" -msgstr[1] "%(count)s uair a thìde air ais" -msgstr[2] "%(count)s uairean a thìde air ais" -msgstr[3] "%(count)s uair a thìde air ais" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s mhionaid air ais" -msgstr[1] "%(count)s mhionaid air ais" -msgstr[2] "%(count)s mionaidean air ais" -msgstr[3] "%(count)s mionaid air ais" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s diog air ais" -msgstr[1] "%(count)s dhiog air ais" -msgstr[2] "%(count)s diogan air ais" -msgstr[3] "%(count)s diog air ais" - -msgid "now" -msgstr "an-dràsta" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "an ceann %(count)s diog" -msgstr[1] "an ceann %(count)s dhiog" -msgstr[2] "an ceann %(count)s diogan" -msgstr[3] "an ceann %(count)s diog" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "an ceann %(count)s mhionaid" -msgstr[1] "an ceann %(count)s mhionaid" -msgstr[2] "an ceann %(count)s mionaidean" -msgstr[3] "an ceann %(count)s mionaid" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "an ceann %(count)s uair a thìde" -msgstr[1] "an ceann %(count)s uair a thìde" -msgstr[2] "an ceann %(count)s uairean a thìde" -msgstr[3] "an ceann %(count)s uair a thìde" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "an ceann %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d bhliadhna" -msgstr[1] "%(num)d bhliadhna" -msgstr[2] "%(num)d bliadhnaichean" -msgstr[3] "%(num)d bliadhna" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mhìos" -msgstr[1] "%(num)d mhìos" -msgstr[2] "%(num)d mìosan" -msgstr[3] "%(num)d mìos" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d seachdain" -msgstr[1] "%(num)d sheachdain" -msgstr[2] "%(num)d seachdainean" -msgstr[3] "%(num)d seachdain" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d latha" -msgstr[1] "%(num)d latha" -msgstr[2] "%(num)d làithean" -msgstr[3] "%(num)d latha" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uair a thìde" -msgstr[1] "%(num)d uair a thìde" -msgstr[2] "%(num)d uairean a thìde" -msgstr[3] "%(num)d uair a thìde" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d mhionaid" -msgstr[1] "%(num)d mhionaid" -msgstr[2] "%(num)d mionaidean" -msgstr[3] "%(num)d mionaid" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d bhliadhna" -msgstr[1] "%(num)d bhliadhna" -msgstr[2] "%(num)d bliadhnaichean" -msgstr[3] "%(num)d bliadhna" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mhìos" -msgstr[1] "%(num)d mhìos" -msgstr[2] "%(num)d mìosan" -msgstr[3] "%(num)d mìos" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d seachdain" -msgstr[1] "%(num)d sheachdain" -msgstr[2] "%(num)d seachdainean" -msgstr[3] "%(num)d seachdain" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d latha" -msgstr[1] "%(num)d latha" -msgstr[2] "%(num)d làithean" -msgstr[3] "%(num)d latha" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uair a thìde" -msgstr[1] "%(num)d uair a thìde" -msgstr[2] "%(num)d uairean a thìde" -msgstr[3] "%(num)d uair a thìde" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d mhionaid" -msgstr[1] "%(num)d mhionaid" -msgstr[2] "%(num)d mionaidean" -msgstr[3] "%(num)d mionaid" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index 30c0d5c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index b024007..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# fasouto , 2011 -# fonso , 2013 -# Jannis Leidel , 2011 -# Leandro Regueiro , 2011,2013 -# X Bello , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2023-04-24 18:40+0000\n" -"Last-Translator: X Bello , 2023\n" -"Language-Team: Galician (http://www.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanización" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}º" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s millón" -msgstr[1] "%(value)s millóns" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s mil millóns" -msgstr[1] "%(value)s mil millóns" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billón" -msgstr[1] "%(value)s billóns" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s trillón" -msgstr[1] "%(value)s trillóns" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s cuadrillón" -msgstr[1] "%(value)s cuadrillóns" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s quintillón" -msgstr[1] "%(value)s quintillóns" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s sextillón" -msgstr[1] "%(value)s sextillóns" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s septillón" -msgstr[1] "%(value)s septillóns" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s octillón" -msgstr[1] "%(value)s octillóns" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s nonillón" -msgstr[1] "%(value)s nonillóns" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gúgol" -msgstr[1] "%(value)s gúgols" - -msgid "one" -msgstr "un" - -msgid "two" -msgstr "dous" - -msgid "three" -msgstr "tres" - -msgid "four" -msgstr "catro" - -msgid "five" -msgstr "cinco" - -msgid "six" -msgstr "seis" - -msgid "seven" -msgstr "sete" - -msgid "eight" -msgstr "oito" - -msgid "nine" -msgstr "nove" - -msgid "today" -msgstr "hoxe" - -msgid "tomorrow" -msgstr "mañá" - -msgid "yesterday" -msgstr "onte" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "fai %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "Fai unha hora" -msgstr[1] "Fai %(count)s horas" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "Fai un minuto" -msgstr[1] "Fai %(count)s minutos" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "Fai un segundo" -msgstr[1] "Fai %(count)s segundos" - -msgid "now" -msgstr "agora" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "Dentro dun segundo" -msgstr[1] "Dentro de %(count)s segundos" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "Dentro dun minuto" -msgstr[1] "Dentro de %(count)s minutos" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "Dentro dunha hora" -msgstr[1] "Dentro de %(count)s horas" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "dentro de %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/he/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index cbd4232..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/he/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index 3fb1327..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,389 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Alex Gaynor , 2011 -# Jannis Leidel , 2011 -# Meir Kriheli , 2012,2014,2019 -# Uri Rodberg , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-09-22 07:22+0000\n" -"Last-Translator: Uri Rodberg \n" -"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -msgid "Humanize" -msgstr "האנשה" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "ה־{}" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "ה־{}" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "ה־{}" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "ה־{}" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "ה־{}" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "ה־{}" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "ה־{}" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "ה־{}" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "ה־{}" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "ה־{}" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "ה־{}" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "מיליון" -msgstr[1] "%(value)s מיליון" -msgstr[2] "%(value)s מיליון" -msgstr[3] "%(value)s מיליון" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "מיליארד" -msgstr[1] "%(value)s מיליארד" -msgstr[2] "%(value)s מיליארד" -msgstr[3] "%(value)s מיליארד" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "טריליון" -msgstr[1] "%(value)s טריליון" -msgstr[2] "%(value)s טריליון" -msgstr[3] "%(value)s טריליון" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "קוודריליון" -msgstr[1] "%(value)s קוודריליון" -msgstr[2] "%(value)s קוודריליון" -msgstr[3] "%(value)s קוודריליון" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "קווינטיליון" -msgstr[1] "%(value)s קווינטיליון" -msgstr[2] "%(value)s קווינטיליון" -msgstr[3] "%(value)s קווינטיליון" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "סקסטיליון" -msgstr[1] "%(value)s סקסטיליון" -msgstr[2] "%(value)s סקסטיליון" -msgstr[3] "%(value)s סקסטיליון" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "ספטיליון" -msgstr[1] "%(value)s ספטיליון" -msgstr[2] "%(value)s ספטיליון" -msgstr[3] "%(value)s ספטיליון" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "אוקטיליון" -msgstr[1] "%(value)s אוקטיליון" -msgstr[2] "%(value)s אוקטיליון" -msgstr[3] "%(value)s אוקטיליון" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "נוניליון" -msgstr[1] "%(value)s נוניליון" -msgstr[2] "%(value)s נוניליון" -msgstr[3] "%(value)s נוניליון" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "דציליון" -msgstr[1] "%(value)s דציליון" -msgstr[2] "%(value)s דציליון" -msgstr[3] "%(value)s דציליון" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "גוגול" -msgstr[1] "%(value)s גוגול" -msgstr[2] "%(value)s גוגול" -msgstr[3] "%(value)s גוגול" - -msgid "one" -msgstr "אחד" - -msgid "two" -msgstr "שניים" - -msgid "three" -msgstr "שלושה" - -msgid "four" -msgstr "ארבעה" - -msgid "five" -msgstr "חמישה" - -msgid "six" -msgstr "שישה" - -msgid "seven" -msgstr "שבעה" - -msgid "eight" -msgstr "שמונה" - -msgid "nine" -msgstr "תשעה" - -msgid "today" -msgstr "היום" - -msgid "tomorrow" -msgstr "מחר" - -msgid "yesterday" -msgstr "אתמול" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "לפני %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "לפני שעה" -msgstr[1] "לפני שעתיים" -msgstr[2] "לפני %(count)s שעות" -msgstr[3] "לפני %(count)s שעות" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "לפני דקה" -msgstr[1] "לפני %(count)s דקות" -msgstr[2] "לפני %(count)s דקות" -msgstr[3] "לפני %(count)s דקות" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "לפני שנייה" -msgstr[1] "לפני %(count)s שניות" -msgstr[2] "לפני %(count)s שניות" -msgstr[3] "לפני %(count)s שניות" - -msgid "now" -msgstr "עכשיו" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "בעוד שנייה" -msgstr[1] "בעוד %(count)s שניות" -msgstr[2] "בעוד %(count)s שניות" -msgstr[3] "בעוד %(count)s שניות" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "בעוד דקה" -msgstr[1] "בעוד %(count)s דקות" -msgstr[2] "בעוד %(count)s דקות" -msgstr[3] "בעוד %(count)s דקות" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "בעוד שעה" -msgstr[1] "בעוד שעתיים" -msgstr[2] "בעוד %(count)s שעות" -msgstr[3] "בעוד %(count)s שעות" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "בעוד %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "שנה" -msgstr[1] "שנתיים" -msgstr[2] "%(num)d שנים" -msgstr[3] "%(num)d שנים" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "חודש" -msgstr[1] "חודשיים" -msgstr[2] "%(num)d חודשים" -msgstr[3] "%(num)d חודשים" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "שבוע" -msgstr[1] "שבועיים" -msgstr[2] "%(num)d שבועות" -msgstr[3] "%(num)d שבועות" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "יום" -msgstr[1] "יומיים" -msgstr[2] "%(num)d ימים" -msgstr[3] "%(num)d ימים" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "שעה" -msgstr[1] "שעתיים" -msgstr[2] "%(num)d שעות" -msgstr[3] "%(num)d שעות" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "דקה" -msgstr[1] "%(num)d דקות" -msgstr[2] "%(num)d דקות" -msgstr[3] "%(num)d דקות" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "שנה" -msgstr[1] "שנתיים" -msgstr[2] "%(num)d שנים" -msgstr[3] "%(num)d שנים" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "חודש" -msgstr[1] "חודשיים" -msgstr[2] "%(num)d חודשים" -msgstr[3] "%(num)d חודשים" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "שבוע" -msgstr[1] "שבועיים" -msgstr[2] "%(num)d שבועות" -msgstr[3] "%(num)d שבועות" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "יום" -msgstr[1] "יומיים" -msgstr[2] "%(num)d ימים" -msgstr[3] "%(num)d ימים" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "שעה" -msgstr[1] "שעתיים" -msgstr[2] "%(num)d שעות" -msgstr[3] "%(num)d שעות" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "דקה" -msgstr[1] "%(num)d דקות" -msgstr[2] "%(num)d דקות" -msgstr[3] "%(num)d דקות" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index 3217de2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index 52551e6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,263 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chandan kumar , 2012 -# Jannis Leidel , 2011 -# Sandeep Satavlekar , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "वाँ" - -msgid "st" -msgstr "ला" - -msgid "nd" -msgstr "रा" - -msgid "rd" -msgstr "रा" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f मिलियन" -msgstr[1] "%(value).1f मिलियन" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s मिलियन" -msgstr[1] "%(value)s मिलियन" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f बिलियन" -msgstr[1] "%(value).1f बिलियन" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s बिलियन" -msgstr[1] "%(value)s बिलियन" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f खरब" -msgstr[1] "%(value).1f खरब" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s खरब" -msgstr[1] "%(value)s खरब" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f करोड़ शंख" -msgstr[1] "%(value).1f करोड़ शंख" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s करोड़ शंख" -msgstr[1] "%(value)s करोड़ शंख" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f कुइनतिलिअन " -msgstr[1] "%(value).1f कुइनतिलिअन " - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s कुइनतिलिअन " -msgstr[1] "%(value)s कुइनतिलिअन " - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f सेक्सतिलियन" -msgstr[1] "%(value).1f सेक्सतिलियन" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s सेक्सतिलियन" -msgstr[1] "%(value)s सेक्सतिलियन" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f सेपतिलियन " -msgstr[1] "%(value).1f सेपतिलियन " - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s सेपतिलियन " -msgstr[1] "%(value)s सेपतिलियन " - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f ओकतिलियन " -msgstr[1] "%(value).1f ओकतिलियन " - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s ओकतिलियन " -msgstr[1] "%(value)s ओकतिलियन " - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f नोनिलियन" -msgstr[1] "%(value).1f नोनिलियन" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s नोनिलियन" -msgstr[1] "%(value)s नोनिलियन" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f देसीलियन" -msgstr[1] "%(value).1f देसीलियन" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s देसीलियन" -msgstr[1] "%(value)s देसीलियन" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f गोगोल" -msgstr[1] "%(value).1f गोगोल" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s गोगोल" -msgstr[1] "%(value)s गोगोल" - -msgid "one" -msgstr "एक" - -msgid "two" -msgstr "दो" - -msgid "three" -msgstr "तीन" - -msgid "four" -msgstr "चार" - -msgid "five" -msgstr "पाँच" - -msgid "six" -msgstr "छह" - -msgid "seven" -msgstr "सात" - -msgid "eight" -msgstr "आठ" - -msgid "nine" -msgstr "नौ" - -msgid "today" -msgstr "आज" - -msgid "tomorrow" -msgstr "कल" - -msgid "yesterday" -msgstr "कल (बीता)" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "%(delta)s पहले" - -msgid "now" -msgstr "अभी" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s अब से" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index 99793a8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index 635ea6d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,291 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mislav Cimperšak , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 21:47+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "" - -msgid "st" -msgstr "" - -msgid "nd" -msgstr "" - -msgid "rd" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "one" -msgstr "jedan" - -msgid "two" -msgstr "dva" - -msgid "three" -msgstr "tri" - -msgid "four" -msgstr "četiri" - -msgid "five" -msgstr "pet" - -msgid "six" -msgstr "šest" - -msgid "seven" -msgstr "sedam" - -msgid "eight" -msgstr "osam" - -msgid "nine" -msgstr "devet" - -msgid "today" -msgstr "danas" - -msgid "tomorrow" -msgstr "sutra" - -msgid "yesterday" -msgstr "jučer" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "prije %(delta)s" - -msgid "now" -msgstr "sad" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "prije %(count)s sekunde" -msgstr[1] "prije %(count)s sekundi" -msgstr[2] "prije %(count)s sekundi" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "prije %(count)s minute" -msgstr[1] "prije %(count)s minute" -msgstr[2] "prije %(count)s minuta" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index d9618ca..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index 7446faa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,387 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2018,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-09-28 18:41+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Humanize" -msgstr "Humanize" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milion" -msgstr[1] "%(value)s milionaj" -msgstr[2] "%(value)s miliony" -msgstr[3] "%(value)s milionow" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliarda" -msgstr[1] "%(value)s miliardźe" -msgstr[2] "%(value)s miliardy" -msgstr[3] "%(value)s miliardow" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s bilion" -msgstr[1] "%(value)s bilionaj" -msgstr[2] "%(value)s biliony" -msgstr[3] "%(value)s bilionow" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s biliarda" -msgstr[1] "%(value)s biliardźe" -msgstr[2] "%(value)s biliardy" -msgstr[3] "%(value)s biliardow" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trilion" -msgstr[1] "%(value)s trilionaj" -msgstr[2] "%(value)s triliony" -msgstr[3] "%(value)s trilionow" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s triliarda" -msgstr[1] "%(value)s triliardźe" -msgstr[2] "%(value)s triliardy" -msgstr[3] "%(value)s triliardow" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s kwadrilion" -msgstr[1] "%(value)s kwadrilionaj" -msgstr[2] "%(value)s kwadriliony" -msgstr[3] "%(value)s kwadrilionow" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kwadriliarda" -msgstr[1] "%(value)s kwadriliardźe" -msgstr[2] "%(value)s kwadriliardy" -msgstr[3] "%(value)s kwadriliardow" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kwintilion" -msgstr[1] "%(value)s kwintilionaj" -msgstr[2] "%(value)s kwintiliony" -msgstr[3] "%(value)s kwintilionow" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kwintiliarda" -msgstr[1] "%(value)s kwintiliardźe" -msgstr[2] "%(value)s kwintiliardy" -msgstr[3] "%(value)s kwintiliardow" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s sedeciliarda" -msgstr[1] "%(value)s sedeciliardźe" -msgstr[2] "%(value)s sedeciliardy" -msgstr[3] "%(value)s sedeciliardow" - -msgid "one" -msgstr "jedyn" - -msgid "two" -msgstr "dwaj" - -msgid "three" -msgstr "tři" - -msgid "four" -msgstr "štyri" - -msgid "five" -msgstr "pjeć" - -msgid "six" -msgstr "šěsć" - -msgid "seven" -msgstr "sydom" - -msgid "eight" -msgstr "wosom" - -msgid "nine" -msgstr "dźewjeć" - -msgid "today" -msgstr "dźensa" - -msgid "tomorrow" -msgstr "jutře" - -msgid "yesterday" -msgstr "wčera" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "Před %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "před %(count)s hodźinu" -msgstr[1] "před %(count)s hodźinomaj" -msgstr[2] "před %(count)s hodźinami" -msgstr[3] "před %(count)s hodźinami" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "před %(count)s mjeńšinu" -msgstr[1] "před %(count)s mjeńšinomaj" -msgstr[2] "před %(count)s mjeńšinami" -msgstr[3] "před %(count)s mjeńšinami" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "před %(count)s sekundu" -msgstr[1] "před %(count)s sekundomaj" -msgstr[2] "před %(count)s sekundami" -msgstr[3] "před %(count)s sekundami" - -msgid "now" -msgstr "nětko" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "za %(count)s sekundu" -msgstr[1] "za %(count)s sekundźe" -msgstr[2] "za %(count)s sekundy" -msgstr[3] "za %(count)s sekundow" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "za %(count)s mjeńšinu" -msgstr[1] "za %(count)s mjeńšinje" -msgstr[2] "za %(count)s mjeńšiny" -msgstr[3] "za %(count)s mjeńšin" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "za %(count)s hodźinu" -msgstr[1] "za %(count)s hodźinje" -msgstr[2] "za %(count)s hodźiny" -msgstr[3] "za %(count)s hodźin" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s wotnětka" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d lěto" -msgstr[1] "%(num)d lěće" -msgstr[2] "%(num)d lěta" -msgstr[3] "%(num)d lět" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d měsac" -msgstr[1] "%(num)d měsacaj" -msgstr[2] "%(num)d měsacy" -msgstr[3] "%(num)d měsacow" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tydźeń" -msgstr[1] "%(num)d njedźeli" -msgstr[2] "%(num)d njedźele" -msgstr[3] "%(num)d njedźel" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dźeń" -msgstr[1] "%(num)d dnjej" -msgstr[2] "%(num)d dny" -msgstr[3] "%(num)d dnjow" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodźina" -msgstr[1] "%(num)d hodźinje" -msgstr[2] "%(num)d hodźiny" -msgstr[3] "%(num)d hodźin" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d mjeńšina" -msgstr[1] "%(num)d mjeńšinje" -msgstr[2] "%(num)d mjeńšiny" -msgstr[3] "%(num)d mjeńšin" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d lěto" -msgstr[1] "%(num)d lěće" -msgstr[2] "%(num)d lěta" -msgstr[3] "%(num)d lět" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d měsac" -msgstr[1] "%(num)d měsacaj" -msgstr[2] "%(num)d měsacy" -msgstr[3] "%(num)d měsacow" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tydźeń" -msgstr[1] "%(num)d njedźeli" -msgstr[2] "%(num)d njedźele" -msgstr[3] "%(num)d njedźel" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dźeń" -msgstr[1] "%(num)d dnjej" -msgstr[2] "%(num)d dny" -msgstr[3] "%(num)d dnjow" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodźina" -msgstr[1] "%(num)d hodźinje" -msgstr[2] "%(num)d hodźiny" -msgstr[3] "%(num)d hodźin" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d mjeńšina" -msgstr[1] "%(num)d mjeńšinje" -msgstr[2] "%(num)d mjeńšiny" -msgstr[3] "%(num)d mjeńšin" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index e2052fb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index 01c7ff4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# András Veres-Szentkirályi, 2016,2018 -# Attila Nagy <>, 2012 -# Balázs R, 2023 -# Jannis Leidel , 2011 -# János R, 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:40+0000\n" -"Last-Translator: Balázs R, 2023\n" -"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Emberi formázás" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s millió" -msgstr[1] "%(value)s millió" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] " %(value)s milliárd" -msgstr[1] " %(value)s milliárd" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billió" -msgstr[1] "%(value)s billió" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s billiárd" -msgstr[1] "%(value)s billiárd" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trillió" -msgstr[1] "%(value)s trillió" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s trilliárd" -msgstr[1] "%(value)s trilliárd" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s kvadrillió" -msgstr[1] "%(value)s kvadrillió" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kvadrilliárd" -msgstr[1] "%(value)s kvadrilliárd" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kvintillió" -msgstr[1] "%(value)s kvintillió" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kvintilliárd" -msgstr[1] "%(value)s kvintilliárd" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" - -msgid "one" -msgstr "egy" - -msgid "two" -msgstr "kettő" - -msgid "three" -msgstr "három" - -msgid "four" -msgstr "négy" - -msgid "five" -msgstr "öt" - -msgid "six" -msgstr "hat" - -msgid "seven" -msgstr "hét" - -msgid "eight" -msgstr "nyolc" - -msgid "nine" -msgstr "kilenc" - -msgid "today" -msgstr "ma" - -msgid "tomorrow" -msgstr "holnap" - -msgid "yesterday" -msgstr "tegnap" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr " %(delta)s ezelőtt" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "egy órája" -msgstr[1] "%(count)s órája" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "egy perce" -msgstr[1] "%(count)s perce" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "egy másodperce" -msgstr[1] "%(count)s másodperce" - -msgid "now" -msgstr "most" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "egy másodperc múlva" -msgstr[1] "%(count)s másodperc múlva" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "egy perc múlva" -msgstr[1] "%(count)s perc múlva" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "egy óra múlva" -msgstr[1] "%(count)s óra múlva" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s múlva" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d évvel" -msgstr[1] "%(num)d évvel" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d hónappal" -msgstr[1] "%(num)d hónappal" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d héttel" -msgstr[1] "%(num)d héttel" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d nappal" -msgstr[1] "%(num)d nappal" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d órával" -msgstr[1] "%(num)d órával" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d perccel" -msgstr[1] "%(num)d perccel" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d év" -msgstr[1] "%(num)d év" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d hónap" -msgstr[1] "%(num)d hónap" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hét" -msgstr[1] "%(num)d hét" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d nap" -msgstr[1] "%(num)d nap" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d óra" -msgstr[1] "%(num)d óra" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d perc" -msgstr[1] "%(num)d perc" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index 2062d1e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index 085e7d7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,330 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Artur Saroyan <>, 2012 -# EnCo_de, 2024 -# Ruben Harutyunov , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-08-07 18:40+0000\n" -"Last-Translator: EnCo_de, 2024\n" -"Language-Team: Armenian (http://app.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}րդ" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}րդ" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}րդ" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}րդ" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}րդ" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}րդ" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}րդ" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}րդ" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}րդ" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}րդ" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}րդ" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s միլիոն" -msgstr[1] "%(value)s միլիոն" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s միլիարդ" -msgstr[1] "%(value)s միլիարդ" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s տրիլիոն" -msgstr[1] "%(value)s տրիլիոն" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s կվադրիլիոն" -msgstr[1] "%(value)s կվադրիլիոն" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "մեկ" - -msgid "two" -msgstr "երկու" - -msgid "three" -msgstr "երեք" - -msgid "four" -msgstr "չորս" - -msgid "five" -msgstr "հինգ" - -msgid "six" -msgstr "վեց" - -msgid "seven" -msgstr "յոթ" - -msgid "eight" -msgstr "ութ" - -msgid "nine" -msgstr "ինը" - -msgid "today" -msgstr "այսօր" - -msgid "tomorrow" -msgstr "վաղը" - -msgid "yesterday" -msgstr "երեկ" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s առաջ" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "մեկ ժամ առաջ" -msgstr[1] "%(count)s ժամ առաջ" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "մեկ րոպե առաջ" -msgstr[1] "%(count)s րոպե առաջ" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "մեկ վայրկյան առաջ" -msgstr[1] "%(count)s վայրկյան առաջ" - -msgid "now" -msgstr "հիմա" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "մեկ վայրկյանից" -msgstr[1] "%(count)s վայրկյանից" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "մեկ րոպե անց" -msgstr[1] "%(count)s րոպե անց" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "մեկ ժամ հետո" -msgstr[1] "%(count)s ժամ հետո" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s հետո" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d տարի" -msgstr[1] "%(num)d տարի" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ամիս" -msgstr[1] "%(num)d ամիս" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d շաբաթ" -msgstr[1] "%(num)d շաբաթ" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d օր" -msgstr[1] "%(num)d օր" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ժամ" -msgstr[1] "%(num)d ժամ" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d րոպե" -msgstr[1] "%(num)d րոպե" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d տարի" -msgstr[1] "%(num)d տարի" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ամիս" -msgstr[1] "%(num)d ամիս" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d շաբաթ" -msgstr[1] "%(num)d շաբաթ" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d օր" -msgstr[1] "%(num)d օր" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ժամ" -msgstr[1] "%(num)d ժամ" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d րոպե" -msgstr[1] "%(num)d րոպե" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ia/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index 9e1f250..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ia/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index cc7aec5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,262 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2012,2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Martijn Dekker \n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanisar" - -msgid "th" -msgstr "e" - -msgid "st" -msgstr "me" - -msgid "nd" -msgstr "nde" - -msgid "rd" -msgstr "tie" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f million" -msgstr[1] "%(value).1f milliones" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s million" -msgstr[1] "%(value)s milliones" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f milliardo" -msgstr[1] "%(value).1f milliardos" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milliardo" -msgstr[1] "%(value)s milliardos" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f billion" -msgstr[1] "%(value).1f billiones" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billion" -msgstr[1] "%(value)s billiones" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f billiardo" -msgstr[1] "%(value).1f billiardos" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s billiardo" -msgstr[1] "%(value)s billiardos" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f trillion" -msgstr[1] "%(value).1f trilliones" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trillion" -msgstr[1] "%(value)s trilliones" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f trilliardo" -msgstr[1] "%(value).1f trilliardos" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s trilliardo" -msgstr[1] "%(value)s trilliardos" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f quadrillion" -msgstr[1] "%(value).1f quadrilliones" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s quadrillion" -msgstr[1] "%(value)s quadrilliones" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f quadrilliardo" -msgstr[1] "%(value).1f quadrilliardos" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s quadrilliardo" -msgstr[1] "%(value)s quadrilliardos" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f quintillion" -msgstr[1] "%(value).1f quintilliones" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s quintillion" -msgstr[1] "%(value)s quintilliones" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f quintilliardo" -msgstr[1] "%(value).1f quintilliardos" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s quintilliardo" -msgstr[1] "%(value)s quintilliardos" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f googol" -msgstr[1] "%(value).1f googoles" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googoles" - -msgid "one" -msgstr "un" - -msgid "two" -msgstr "duo" - -msgid "three" -msgstr "tres" - -msgid "four" -msgstr "quatro" - -msgid "five" -msgstr "cinque" - -msgid "six" -msgstr "sex" - -msgid "seven" -msgstr "septe" - -msgid "eight" -msgstr "octo" - -msgid "nine" -msgstr "novem" - -msgid "today" -msgstr "hodie" - -msgid "tomorrow" -msgstr "deman" - -msgid "yesterday" -msgstr "heri" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "%(delta)s retro" - -msgid "now" -msgstr "ora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "un secunda retro" -msgstr[1] "%(count)s secundas retro" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "un minuta retro" -msgstr[1] "%(count)s minutas retro" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "un hora retro" -msgstr[1] "%(count)s horas retro" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "in %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "un secunda desde ora" -msgstr[1] "%(count)s secundas desde ora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "un minuta desde ora" -msgstr[1] "%(count)s minutas desde ora" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "un hora desde ora" -msgstr[1] "%(count)s horas desde ora" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/id/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index c464dc7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/id/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index 8acb99d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,304 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fery Setiawan , 2016,2018,2021 -# Jannis Leidel , 2011 -# rodin , 2011-2012 -# rodin , 2014 -# sag᠎e , 2019 -# Sutrisno Efendi , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-10-06 09:17+0000\n" -"Last-Translator: Fery Setiawan \n" -"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "Memanusiawikan" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "ke-{}" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "ke-{}" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "ke-{}" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "ke-{}" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "ke-{}" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "ke-{}" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "ke-{}" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "ke-{}" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "ke-{}" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "ke-{}" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "ke-{}" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s juta" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliar" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s triliun" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kuadriliun" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kuintiliun" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sekstiliun" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septiliun" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktiliun" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s noniliun" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s desiliun" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" - -msgid "one" -msgstr "satu" - -msgid "two" -msgstr "dua" - -msgid "three" -msgstr "tiga" - -msgid "four" -msgstr "empat" - -msgid "five" -msgstr "lima" - -msgid "six" -msgstr "enam" - -msgid "seven" -msgstr "tujuh" - -msgid "eight" -msgstr "delapan" - -msgid "nine" -msgstr "sembilan" - -msgid "today" -msgstr "hari ini" - -msgid "tomorrow" -msgstr "besok" - -msgid "yesterday" -msgstr "kemarin" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s yang lalu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s jam yang lalu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s menit yang lalu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s detik yang lalu" - -msgid "now" -msgstr "sekarang" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s detik dari sekarang" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s menit dari sekarang" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s jam dari sekarang" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s dari sekarang" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d tahun" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d bulan" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d minggu" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d hari" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d jam" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d menit" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d tahun" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d bulan" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d minggu" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d hari" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d jam" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d menit" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/io/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index fba64da..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/io/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index 046e775..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,261 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:11+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/projects/p/django/language/" -"io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "" - -msgid "st" -msgstr "" - -msgid "nd" -msgstr "" - -msgid "rd" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "" - -msgid "two" -msgstr "" - -msgid "three" -msgstr "" - -msgid "four" -msgstr "" - -msgid "five" -msgstr "" - -msgid "six" -msgstr "" - -msgid "seven" -msgstr "" - -msgid "eight" -msgstr "" - -msgid "nine" -msgstr "" - -msgid "today" -msgstr "" - -msgid "tomorrow" -msgstr "" - -msgid "yesterday" -msgstr "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/is/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index b22c4ad..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/is/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index d9b14c0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,399 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# gudmundur , 2012 -# Hafsteinn Einarsson , 2012 -# Jannis Leidel , 2011 -# Matt R, 2018 -# Thordur Sigurdsson , 2016,2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:49+0200\n" -"PO-Revision-Date: 2018-05-18 03:49+0000\n" -"Last-Translator: Thordur Sigurdsson \n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -msgid "Humanize" -msgstr "" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f milljón" -msgstr[1] "%(value).1f milljónir" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milljón" -msgstr[1] "%(value)s milljónir" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f milljarður" -msgstr[1] "%(value).1f milljarðar" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milljarður" -msgstr[1] "%(value)s milljarðar" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f billjarður" -msgstr[1] "%(value).1f billjónir" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billjón" -msgstr[1] "%(value)s billjónir" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f billjarður" -msgstr[1] "%(value).1f billjarðar" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s billjarður" -msgstr[1] "%(value)s billjarðar" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f trilljón" -msgstr[1] "%(value).1f trilljónir" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trilljón" -msgstr[1] "%(value)s trilljónir" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f trilljarður" -msgstr[1] "%(value).1f trilljarðar" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s trilljarður" -msgstr[1] "%(value)s trilljarðar" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f kvaðrilljón" -msgstr[1] "%(value).1f kvaðrilljónir" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s kvaðrilljón" -msgstr[1] "%(value)s kvaðrilljónir" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f kvaðrilljarður" -msgstr[1] "%(value).1f kvaðrilljarðar" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kvaðrilljarður" -msgstr[1] "%(value)s kvaðrilljarðar" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f kvintilljón" -msgstr[1] "%(value).1f kvintilljónir" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kvintilljón" -msgstr[1] "%(value)s kvintilljónir" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f kvintilljarður" -msgstr[1] "%(value).1f kvintilljarðar" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kvintilljarður" -msgstr[1] "%(value)s kvintilljarðar" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f googol" -msgstr[1] "%(value).1f googol" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" - -msgid "one" -msgstr "einn" - -msgid "two" -msgstr "tveir" - -msgid "three" -msgstr "þrír" - -msgid "four" -msgstr "fjórir" - -msgid "five" -msgstr "fimm" - -msgid "six" -msgstr "sex" - -msgid "seven" -msgstr "sjö" - -msgid "eight" -msgstr "átta" - -msgid "nine" -msgstr "níu" - -msgid "today" -msgstr "í dag" - -msgid "tomorrow" -msgstr "á morgun" - -msgid "yesterday" -msgstr "í gær" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "" - -#. Translators: 'naturaltime-past' strings will be included in -#. '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "now" -msgstr "núna" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "" - -#. Translators: 'naturaltime-future' strings will be included in -#. '%(delta)s from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index efebe27..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index 4e1c222..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,368 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Carlo Miron , 2014 -# Carlo Miron , 2018 -# Davide Targa , 2021 -# Federico Capoano , 2011 -# Jannis Leidel , 2011 -# Luca Manlio De Lisi , 2011 -# Marco Bonetti, 2014 -# Mirco Grillo , 2018 -# Nicola Larosa , 2011 -# palmux , 2015 -# Paolo Melchiorre , 2023 -# Stefano Brentegani , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2023-04-24 18:40+0000\n" -"Last-Translator: Paolo Melchiorre , 2023\n" -"Language-Team: Italian (http://www.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Umanizzazione " - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}esimo" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}esimo" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}esimo" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}esimo" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}esimo" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}esimo" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}esimo" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}esimo" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}esimo" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}esimo" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}esimo" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milione" -msgstr[1] "%(value)s milioni" -msgstr[2] "%(value)s milioni" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliardo" -msgstr[1] "%(value)s miliardi" -msgstr[2] "%(value)s miliardi" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s migliaio di miliardi" -msgstr[1] "%(value)s migliaia di miliardi" -msgstr[2] "%(value)s migliaia di miliardi" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s milione di miliardi" -msgstr[1] "%(value)s milioni di miliardi" -msgstr[2] "%(value)s milioni di miliardi" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s miliardo di miliardi" -msgstr[1] "%(value)s miliardi di miliardi" -msgstr[2] "%(value)s miliardi di miliardi" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s migliaio di miliardi di miliardi" -msgstr[1] "%(value)s migliaia di miliardi di miliardi" -msgstr[2] "%(value)s migliaia di miliardi di miliardi" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s milione di miliardi di miliardi" -msgstr[1] "%(value)s milioni di miliardi di miliardi" -msgstr[2] "%(value)s milioni di miliardi di miliardi" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s miliardo di miliardi di miliardi" -msgstr[1] "%(value)s miliardi di miliardi di miliardi" -msgstr[2] "%(value)s miliardi di miliardi di miliardi" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s migliaio di miliardi di miliardi di miliardi" -msgstr[1] "%(value)s migliaia di miliardi di miliardi di miliardi" -msgstr[2] "%(value)s migliaia di miliardi di miliardi di miliardi" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s milione di miliardi di miliardi di miliardi" -msgstr[1] "%(value)s milioni di miliardi di miliardi di miliardi" -msgstr[2] "%(value)s milioni di miliardi di miliardi di miliardi" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" -msgstr[2] "%(value)s googol" - -msgid "one" -msgstr "uno" - -msgid "two" -msgstr "due" - -msgid "three" -msgstr "tre" - -msgid "four" -msgstr "quattro" - -msgid "five" -msgstr "cinque" - -msgid "six" -msgstr "sei" - -msgid "seven" -msgstr "sette" - -msgid "eight" -msgstr "otto" - -msgid "nine" -msgstr "nove" - -msgid "today" -msgstr "oggi" - -msgid "tomorrow" -msgstr "domani" - -msgid "yesterday" -msgstr "ieri" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s fa" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "un ora fa" -msgstr[1] "%(count)s ore fa" -msgstr[2] "%(count)s ore fa" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "un minuto fa" -msgstr[1] "%(count)s minuti fa" -msgstr[2] "%(count)s minuti fa" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "un secondo fa" -msgstr[1] "%(count)s secondi fa" -msgstr[2] "%(count)s secondi fa" - -msgid "now" -msgstr "adesso" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "tra un secondo" -msgstr[1] "tra %(count)s secondi" -msgstr[2] "tra %(count)s secondi" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "tra un minuto" -msgstr[1] "tra %(count)s minuti" -msgstr[2] "tra %(count)s minuti" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "tra un'ora" -msgstr[1] "tra %(count)s ore" -msgstr[2] "tra %(count)s ore" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s da adesso" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d anno" -msgstr[1] "%(num)d anni" -msgstr[2] "%(num)d anni" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mese" -msgstr[1] "%(num)d mesi" -msgstr[2] "%(num)d mesi" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d settimana" -msgstr[1] "%(num)d settimane" -msgstr[2] "%(num)d settimane" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d giorno" -msgstr[1] "%(num)d giorni" -msgstr[2] "%(num)d giorni" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ora" -msgstr[1] "%(num)d ore" -msgstr[2] "%(num)d ore" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minuti" -msgstr[2] "%(num)d minuti" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d anno" -msgstr[1] "%(num)d anni" -msgstr[2] "%(num)d anni" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mese" -msgstr[1] "%(num)d mesi" -msgstr[2] "%(num)d mesi" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d settimana" -msgstr[1] "%(num)d settimane" -msgstr[2] "%(num)d settimane" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d giorno" -msgstr[1] "%(num)d giorni" -msgstr[2] "%(num)d giorni" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ora" -msgstr[1] "%(num)d ore" -msgstr[2] "%(num)d ore" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minuti" -msgstr[2] "%(num)d minuti" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ja/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index 0e043b9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ja/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index f077d0a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,301 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Jonas Obrist , 2012 -# Shinya Okano , 2012-2014,2018,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-10-13 11:44+0000\n" -"Last-Translator: Shinya Okano \n" -"Language-Team: Japanese (http://www.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "ヒューマナイズ" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}番目" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}番目" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}番目" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}番目" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}番目" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}番目" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}番目" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}番目" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}番目" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}番目" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}番目" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s ミリオン" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s ビリオン" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s トリリオン" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] " %(value)s クァドリリオン" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s クインテリオン" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s セクスティリオン" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s セプティリオン" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s オクティリオン" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s ノニリオン" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s デシリオン" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s グーゴル" - -msgid "one" -msgstr "1" - -msgid "two" -msgstr "2" - -msgid "three" -msgstr "3" - -msgid "four" -msgstr "4" - -msgid "five" -msgstr "5" - -msgid "six" -msgstr "6" - -msgid "seven" -msgstr "7" - -msgid "eight" -msgstr "8" - -msgid "nine" -msgstr "9" - -msgid "today" -msgstr "今日" - -msgid "tomorrow" -msgstr "明日" - -msgid "yesterday" -msgstr "昨日" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s前" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s時間前" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s分前" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s秒前" - -msgid "now" -msgstr "今" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "今から%(count)s秒" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "今から%(count)s分" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "今から%(count)s時間" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "今から%(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d年" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)dヶ月" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d週間" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d日" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d時間" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d分" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d年" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)dヶ月" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d週間" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d日" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d時間" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d分" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ka/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index 61fb3e0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ka/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index e9cbf25..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,395 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2013-2015 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2018-05-18 01:38+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Humanize" -msgstr "ჰუმანიზირება" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f მილიონი" -msgstr[1] "%(value).1f მილიონი" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s მილიონი" -msgstr[1] "%(value)s მილიონი" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f მილიარდი" -msgstr[1] "%(value).1f მილიარდი" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s მილიარდი" -msgstr[1] "%(value)s მილიარდი" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f ტრილიონი" -msgstr[1] "%(value).1f ტრილიონი" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s ტრილიონი" -msgstr[1] "%(value)s ტრილიონი" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f კვადრილიონი" -msgstr[1] "%(value).1f კვადრილიონი" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s კვადრილიონი" -msgstr[1] "%(value)s კვადრილიონი" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f კვინტილიონი" -msgstr[1] "%(value).1f კვინტილიონი" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s კვინტილიონი" -msgstr[1] "%(value)s კვინტილიონი" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f სექსტილიონი" -msgstr[1] "%(value).1f სექსტილიონი" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s სექსტილიონი" -msgstr[1] "%(value)s სექსტილიონი" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f სეპტილიონი" -msgstr[1] "%(value).1f სეპტილიონი" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s სეპტილიონი" -msgstr[1] "%(value)s სეპტილიონი" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f ოქტილიონი" -msgstr[1] "%(value).1f ოქტილიონი" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s ოქტილიონი" -msgstr[1] "%(value)s ოქტილიონი" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f ნონილიონი" -msgstr[1] "%(value).1f ნონილიონი" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s ნონილიონი" -msgstr[1] "%(value)s ნონილიონი" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f დეცილიონი" -msgstr[1] "%(value).1f დეცილიონი" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s დეცილიონი" -msgstr[1] "%(value)s დეცილიონი" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f გუგოლი" -msgstr[1] "%(value).1f გუგოლი" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s გუგოლი" -msgstr[1] "%(value)s გუგოლი" - -msgid "one" -msgstr "ერთი" - -msgid "two" -msgstr "ორი" - -msgid "three" -msgstr "სამი" - -msgid "four" -msgstr "ოთხი" - -msgid "five" -msgstr "ხუთი" - -msgid "six" -msgstr "ექვსი" - -msgid "seven" -msgstr "შვიდი" - -msgid "eight" -msgstr "რვა" - -msgid "nine" -msgstr "ცხრა" - -msgid "today" -msgstr "დღეს" - -msgid "tomorrow" -msgstr "ხვალ" - -msgid "yesterday" -msgstr "გუშინ" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s საათის წინ" -msgstr[1] "%(count)s საათის წინ" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s წუთის წინ" -msgstr[1] "%(count)s წუთის წინ" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s წამის წინ" -msgstr[1] "%(count)s წამის წინ" - -msgid "now" -msgstr "ახლა" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s წამში" -msgstr[1] "%(count)s წამში" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s წუთში" -msgstr[1] "%(count)s წუთში" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s საათში" -msgstr[1] "%(count)s საათში" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index 4e22806..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index 75a6a38..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,394 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Leo Trubach , 2017 -# yun_man_ger , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2018-05-18 01:38+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Humanize" -msgstr "" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f миллион" -msgstr[1] "%(value).1f миллион" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s миллион" -msgstr[1] "%(value)s миллион" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f миллиард" -msgstr[1] "%(value).1f миллиард" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s миллиард" -msgstr[1] "%(value)s миллиард" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f триллион" -msgstr[1] "%(value).1f триллион" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trillion" -msgstr[1] "%(value)s trillion" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f квадриллион" -msgstr[1] "%(value).1f квадриллион" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s квадриллион" -msgstr[1] "%(value)s квадриллион" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f квинтиллион" -msgstr[1] "%(value).1f квинтиллион" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s квинтиллион" -msgstr[1] "%(value)s квинтиллион" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "бір" - -msgid "two" -msgstr "екі" - -msgid "three" -msgstr "үш" - -msgid "four" -msgstr "төрт" - -msgid "five" -msgstr "бес" - -msgid "six" -msgstr "алты" - -msgid "seven" -msgstr "жеті" - -msgid "eight" -msgstr "сегіз" - -msgid "nine" -msgstr "тоғыз" - -msgid "today" -msgstr "бүгін" - -msgid "tomorrow" -msgstr "ерте" - -msgid "yesterday" -msgstr "кеше" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -msgid "now" -msgstr "кәзір" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/km/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index 482b022..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/km/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index 0aab550..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,233 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:11+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/projects/p/django/language/" -"km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "" - -msgid "st" -msgstr "" - -msgid "nd" -msgstr "" - -msgid "rd" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" - -msgid "one" -msgstr "" - -msgid "two" -msgstr "" - -msgid "three" -msgstr "" - -msgid "four" -msgstr "" - -msgid "five" -msgstr "" - -msgid "six" -msgstr "" - -msgid "seven" -msgstr "" - -msgid "eight" -msgstr "" - -msgid "nine" -msgstr "" - -msgid "today" -msgstr "" - -msgid "tomorrow" -msgstr "" - -msgid "yesterday" -msgstr "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index b75cf46..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index 9e7eeb9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,233 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:11+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kannada (http://www.transifex.com/projects/p/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "" - -msgid "st" -msgstr "" - -msgid "nd" -msgstr "" - -msgid "rd" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" - -msgid "one" -msgstr "" - -msgid "two" -msgstr "" - -msgid "three" -msgstr "" - -msgid "four" -msgstr "" - -msgid "five" -msgstr "" - -msgid "six" -msgstr "" - -msgid "seven" -msgstr "" - -msgid "eight" -msgstr "" - -msgid "nine" -msgstr "" - -msgid "today" -msgstr "" - -msgid "tomorrow" -msgstr "" - -msgid "yesterday" -msgstr "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ko/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index 1c311bb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ko/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index 82cda2d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,304 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ian Y. Choi , 2015 -# Jannis Leidel , 2011 -# Le Tartuffe , 2014 -# JunGu Kang , 2015 -# Seho Noh , 2018 -# 정훈 이, 2021 -# Jrog , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-12-24 18:40+0000\n" -"Last-Translator: 정훈 이\n" -"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "인간화" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}번째" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}번째" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}번째" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}번째" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}번째" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}번째" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}번째" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}번째" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}번째" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}번째" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}번째" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s 백만" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s 십억" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s 조" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s 천조" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s 백경" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s 섹틸리언-10의21제곱" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s 셉틸리언-10의 24제곱" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s 옥틸리언-10의 27제곱" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s 노닐리언-10의30제곱" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s 디실리언-10의 33제곱" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s 구골-10의 100제곱" - -msgid "one" -msgstr "1" - -msgid "two" -msgstr "2" - -msgid "three" -msgstr "3" - -msgid "four" -msgstr "4" - -msgid "five" -msgstr "5" - -msgid "six" -msgstr "6" - -msgid "seven" -msgstr "7" - -msgid "eight" -msgstr "8" - -msgid "nine" -msgstr "9" - -msgid "today" -msgstr "오늘" - -msgid "tomorrow" -msgstr "내일" - -msgid "yesterday" -msgstr "어제" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s 전" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s 시간 전" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s 분 전" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s 초 전" - -msgid "now" -msgstr "지금" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "지금부터 %(count)s 초" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "지금부터 %(count)s 분" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "지금부터 %(count)s 시간" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "지금부터 %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d년" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d개월" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d주" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d일" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d시간" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d분" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d년" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d개월" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d주" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d일" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d시간" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d분" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ky/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index 669a321..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ky/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 1308815..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,299 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soyuzbek Orozbek uulu , 2021 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-11-27 14:11+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "Инсандаштыруу" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}нчы" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}үнчү" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}инчи" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}инчи" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}үнчү" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}үнчү" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}инчи" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}нчы" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}инчи" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}инчи" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}унчу" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)sмиллион" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)sмиллиард" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)sтриллион" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)sквадриллион" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)sквинтиллион" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)sсекстиллион" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)sсептиллион" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)sоктиллион" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)sнонтиллион" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)sдесилион" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)sгугл" - -msgid "one" -msgstr "бир" - -msgid "two" -msgstr "эки" - -msgid "three" -msgstr "үч" - -msgid "four" -msgstr "төрт" - -msgid "five" -msgstr "беш" - -msgid "six" -msgstr "алты" - -msgid "seven" -msgstr "жети" - -msgid "eight" -msgstr "сегиз" - -msgid "nine" -msgstr "тогуз" - -msgid "today" -msgstr "бүгүн" - -msgid "tomorrow" -msgstr "эртең" - -msgid "yesterday" -msgstr "кечээ" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s мурда" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)sсаат мурда" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)sмүнөт мурда" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)sсекунд мурда" - -msgid "now" -msgstr "азыр" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "мындан%(count)sсекунд мурда" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "мындан%(count)sмүнөт мурда" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "мындан%(count)sсаат мурда" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "мындан %(delta)s мурда" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d жыл" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ай" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d апта" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d күн" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d саат" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d мүнөт" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d жыл" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ай" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d апта" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d күн" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d саат" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d мүнөт" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index 5b7937f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index 32550de..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,261 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "" - -msgid "st" -msgstr "" - -msgid "nd" -msgstr "" - -msgid "rd" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "" - -msgid "two" -msgstr "" - -msgid "three" -msgstr "" - -msgid "four" -msgstr "" - -msgid "five" -msgstr "" - -msgid "six" -msgstr "" - -msgid "seven" -msgstr "" - -msgid "eight" -msgstr "" - -msgid "nine" -msgstr "" - -msgid "today" -msgstr "" - -msgid "tomorrow" -msgstr "" - -msgid "yesterday" -msgstr "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index d6f5ca2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index a9fa708..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,477 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Matas Dailyda , 2015,2018 -# Simonas Kazlauskas , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2018-05-18 08:22+0000\n" -"Last-Translator: Matas Dailyda \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Humanize" -msgstr "Sužmoginti" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}-as" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}-as" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}-as" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}-as" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}-as" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}-as" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}-as" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}-as" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}-as" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}-as" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}-as" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f milijonas" -msgstr[1] "%(value).1f milijonai" -msgstr[2] "%(value).1f milijonų" -msgstr[3] "%(value).1f milijonų" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milijonas" -msgstr[1] "%(value)s milijonai" -msgstr[2] "%(value)s milijonų" -msgstr[3] "%(value)s milijonų" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f milijardas" -msgstr[1] "%(value).1f milijardai" -msgstr[2] "%(value).1f milijardų" -msgstr[3] "%(value).1f milijardų" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milijardas" -msgstr[1] "%(value)s milijardai" -msgstr[2] "%(value)s milijardų" -msgstr[3] "%(value)s milijardų" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f trilijonas" -msgstr[1] "%(value).1f trilijonai" -msgstr[2] "%(value).1f trilijonų" -msgstr[3] "%(value).1f trilijonų" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trilijonas" -msgstr[1] "%(value)s trilijonai" -msgstr[2] "%(value)s trilijonų" -msgstr[3] "%(value)s trilijonų" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f kvadrilijonas" -msgstr[1] "%(value).1f kvadrilijonai" -msgstr[2] "%(value).1f kvadrilijonų" -msgstr[3] "%(value).1f kvadrilijonų" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kvadrilijonas" -msgstr[1] "%(value)s kvadrilijonai" -msgstr[2] "%(value)s kvadrilijonų" -msgstr[3] "%(value)s kvadrilijonų" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f kvintilijonas" -msgstr[1] "%(value).1f kvintilijonai" -msgstr[2] "%(value).1f kvintilijonų" -msgstr[3] "%(value).1f kvintilijonų" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kvintilijonas" -msgstr[1] "%(value)s kvintilijonai" -msgstr[2] "%(value)s kvintilijonų" -msgstr[3] "%(value)s kvintilijonų" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f sikstilijonas" -msgstr[1] "%(value).1f sikstilijonai" -msgstr[2] "%(value).1f sikstilijonų" -msgstr[3] "%(value).1f sikstilijonų" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sikstilijonas" -msgstr[1] "%(value)s sikstilijonai" -msgstr[2] "%(value)s sikstilijonų" -msgstr[3] "%(value)s sikstilijonų" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f septilijonas" -msgstr[1] "%(value).1f septilijonai" -msgstr[2] "%(value).1f septilijonų" -msgstr[3] "%(value).1f septilijonų" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilijonas" -msgstr[1] "%(value)s septilijonai" -msgstr[2] "%(value)s septilijonų" -msgstr[3] "%(value)s septilijonų" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f oktilijonas" -msgstr[1] "%(value).1f oktilijonai" -msgstr[2] "%(value).1f oktilijonų" -msgstr[3] "%(value).1f oktilijonų" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktilijonas" -msgstr[1] "%(value)s oktilijonai" -msgstr[2] "%(value)s oktilijonų" -msgstr[3] "%(value)s oktilijonų" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f naintilijonas" -msgstr[1] "%(value).1f naintilijonai" -msgstr[2] "%(value).1f naintilijonų" -msgstr[3] "%(value).1f naintilijonų" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s naintilijonas" -msgstr[1] "%(value)s naintilijonai" -msgstr[2] "%(value)s naintilijonų" -msgstr[3] "%(value)s naintilijonų" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f decilijonas" -msgstr[1] "%(value).1f decilijonai" -msgstr[2] "%(value).1f decilijonų" -msgstr[3] "%(value).1f decilijonų" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decilijonas" -msgstr[1] "%(value)s decilijonai" -msgstr[2] "%(value)s decilijonų" -msgstr[3] "%(value)s decilijonų" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f gugolas" -msgstr[1] "%(value).1f gugolai" -msgstr[2] "%(value).1f gugolų" -msgstr[3] "%(value).1f gugolų" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gugolas" -msgstr[1] "%(value)s gugolai" -msgstr[2] "%(value)s gugolų" -msgstr[3] "%(value)s gugolų" - -msgid "one" -msgstr "vienas" - -msgid "two" -msgstr "du" - -msgid "three" -msgstr "trys" - -msgid "four" -msgstr "keturi" - -msgid "five" -msgstr "penki" - -msgid "six" -msgstr "šeši" - -msgid "seven" -msgstr "septyni" - -msgid "eight" -msgstr "aštuoni" - -msgid "nine" -msgstr "devyni" - -msgid "today" -msgstr "šiandien" - -msgid "tomorrow" -msgstr "rytoj" - -msgid "yesterday" -msgstr "vakar" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "prieš %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "prieš %(count)s valandą" -msgstr[1] "prieš %(count)s valandas" -msgstr[2] "prieš %(count)s valandų" -msgstr[3] "prieš %(count)s valandų" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "prieš %(count)s minutę" -msgstr[1] "prieš %(count)s minutes" -msgstr[2] "prieš %(count)s minučių" -msgstr[3] "prieš %(count)s minučių" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "prieš %(count)s sekundę" -msgstr[1] "prieš %(count)s sekundes" -msgstr[2] "prieš %(count)s sekundžių" -msgstr[3] "prieš %(count)s sekundžių" - -msgid "now" -msgstr "dabar" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s sekundė nuo dabar" -msgstr[1] "%(count)s sekundes nuo dabar" -msgstr[2] "%(count)s skundžių nuo dabar" -msgstr[3] "%(count)s skundžių nuo dabar" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s minutė nuo dabar" -msgstr[1] "%(count)s minutės nuo dabar" -msgstr[2] "%(count)s minučių nuo dabar" -msgstr[3] "%(count)s minučių nuo dabar" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s valandą nuo dabar" -msgstr[1] "%(count)s valandos nuo dabar" -msgstr[2] "%(count)s valandų nuo dabar" -msgstr[3] "%(count)s valandų nuo dabar" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s nuo dabar" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d metus" -msgstr[1] "%d metus" -msgstr[2] "%d metų" -msgstr[3] "%d metų" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mėnesį" -msgstr[1] "%d mėnesius" -msgstr[2] "%d mėnesių" -msgstr[3] "%d mėnesių" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d savaitę" -msgstr[1] "%d savaites" -msgstr[2] "%d savaičių" -msgstr[3] "%d savaičių" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dieną" -msgstr[1] "%d dienas" -msgstr[2] "%d dienų" -msgstr[3] "%d dienų" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d valandą" -msgstr[1] "%d valandas" -msgstr[2] "%d valandų" -msgstr[3] "%d valandų" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minutę" -msgstr[1] "%d minutes" -msgstr[2] "%d minučių" -msgstr[3] "%d minučių" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d metus" -msgstr[1] "%d metus" -msgstr[2] "%d metų" -msgstr[3] "%d metų" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mėnesį" -msgstr[1] "%d mėnesius" -msgstr[2] "%d mėnesių" -msgstr[3] "%d mėnesių" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d savaitę" -msgstr[1] "%d savaites" -msgstr[2] "%d savaičių" -msgstr[3] "%d savaičių" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dieną" -msgstr[1] "%d dienas" -msgstr[2] "%d dienų" -msgstr[3] "%d dienų" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d valandą" -msgstr[1] "%d valandas" -msgstr[2] "%d valandų" -msgstr[3] "%d valandų" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minutė" -msgstr[1] "%d minutes" -msgstr[2] "%d minučių" -msgstr[3] "%d minučių" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index 29d2e78..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index 50569e5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,363 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# NullIsNot0 , 2017 -# NullIsNot0 , 2017-2018 -# Jannis Leidel , 2011 -# NullIsNot0 , 2021 -# peterisb , 2016 -# peterisb , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-10-06 05:15+0000\n" -"Last-Translator: NullIsNot0 \n" -"Language-Team: Latvian (http://www.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -msgid "Humanize" -msgstr "Padarīt cilvēcīgu" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s miljonu" -msgstr[1] "%(value)s miljons" -msgstr[2] "%(value)s miljonu" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miljardu" -msgstr[1] "%(value)s miljards" -msgstr[2] "%(value)s miljardu" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s triljonu" -msgstr[1] "%(value)s triljons" -msgstr[2] "%(value)s triljonu" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kvadriljonu" -msgstr[1] "%(value)s kvadriljons" -msgstr[2] "%(value)s kvadriljonu" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kvintiljonu" -msgstr[1] "%(value)s kvintiljons" -msgstr[2] "%(value)s kvintiljonu" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sekstiljonu" -msgstr[1] "%(value)s sekstiljons" -msgstr[2] "%(value)s sekstiljonu" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septiljonu" -msgstr[1] "%(value)s septiljons" -msgstr[2] "%(value)s septiljonu" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktiljonu" -msgstr[1] "%(value)s oktiljons" -msgstr[2] "%(value)s oktiljonu" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s noniljonu" -msgstr[1] "%(value)s noniljons" -msgstr[2] "%(value)s noniljonu" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s dekaljonu" -msgstr[1] "%(value)s dekaljons" -msgstr[2] "%(value)s dekaljonu" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gugolu" -msgstr[1] "%(value)s gugols" -msgstr[2] "%(value)s gugolu" - -msgid "one" -msgstr "viens" - -msgid "two" -msgstr "divi" - -msgid "three" -msgstr "trīs" - -msgid "four" -msgstr "četri" - -msgid "five" -msgstr "pieci" - -msgid "six" -msgstr "seši" - -msgid "seven" -msgstr "septiņi" - -msgid "eight" -msgstr "astoņi" - -msgid "nine" -msgstr "deviņi" - -msgid "today" -msgstr "šodien" - -msgid "tomorrow" -msgstr "rīt" - -msgid "yesterday" -msgstr "vakar" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "pirms %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "pirms %(count)s stundas" -msgstr[1] "pirms %(count)s stundām" -msgstr[2] "pirms %(count)s stundām" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "pirms %(count)s minūtes" -msgstr[1] "pirms %(count)s minūtēm" -msgstr[2] "pirms %(count)s minūtēm" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "pirms %(count)s sekundes" -msgstr[1] "pirms %(count)s sekundēm" -msgstr[2] "pirms %(count)s sekundēm" - -msgid "now" -msgstr "tagad" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "pēc %(count)s sekundes" -msgstr[1] "pēc %(count)s sekundēm" -msgstr[2] "pēc %(count)s sekundēm" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "pēc %(count)s minūtes" -msgstr[1] "pēc %(count)s minūtēm" -msgstr[2] "pēc %(count)s minūtēm" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "pēc %(count)s stundas" -msgstr[1] "pēc %(count)s stundām" -msgstr[2] "pēc %(count)s stundām" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "pēc %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d gadi" -msgstr[1] "%(num)d gads" -msgstr[2] "%(num)d gadi" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mēneši" -msgstr[1] "%(num)d mēnesis" -msgstr[2] "%(num)d mēneši" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nedēļas" -msgstr[1] "%(num)d nedēļa" -msgstr[2] "%(num)d nedēļas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dienas" -msgstr[1] "%(num)d diena" -msgstr[2] "%(num)d dienas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d stundas" -msgstr[1] "%(num)d stunda" -msgstr[2] "%(num)d stundas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minūtes" -msgstr[1] "%(num)d minūte" -msgstr[2] "%(num)d minūtes" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d gadi" -msgstr[1] "%(num)d gads" -msgstr[2] "%(num)d gadi" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mēneši" -msgstr[1] "%(num)d mēnesis" -msgstr[2] "%(num)d mēneši" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nedēļas" -msgstr[1] "%(num)d nedēļa" -msgstr[2] "%(num)d nedēļas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dienas" -msgstr[1] "%(num)d diena" -msgstr[2] "%(num)d dienas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d stundas" -msgstr[1] "%(num)d stunda" -msgstr[2] "%(num)d stundas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minūtes" -msgstr[1] "%(num)d minūte" -msgstr[2] "%(num)d minūtes" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index cc6bfbd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index 136b20b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,262 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Vasil Vangelovski , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 19:05+0000\n" -"Last-Translator: dekomote \n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgid "Humanize" -msgstr "Хуманизирање" - -msgid "th" -msgstr "ти" - -msgid "st" -msgstr "ви" - -msgid "nd" -msgstr "ри" - -msgid "rd" -msgstr "ти" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f милион" -msgstr[1] "%(value).1f милиони" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s милион" -msgstr[1] "%(value)s милиони" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f милијарда" -msgstr[1] "%(value).1f милијарди" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s милијарда" -msgstr[1] "%(value)s милијарди" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f трилион" -msgstr[1] "%(value).1f трилиони" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s трилион" -msgstr[1] "%(value)s трилиони" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f квадрилион" -msgstr[1] "%(value).1f квадрилиони" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s квадрилион" -msgstr[1] "%(value)s квадрилиони" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f квинтилион" -msgstr[1] "%(value).1f квинтилиони" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s квинтилион" -msgstr[1] "%(value)s квинтилиони" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f секстилион" -msgstr[1] "%(value).1f секстилиони" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s секстилион" -msgstr[1] "%(value)s секстилиони" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f септилион" -msgstr[1] "%(value).1f септилиони" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s септилион" -msgstr[1] "%(value)s септилиони" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f октилион" -msgstr[1] "%(value).1f октилиони" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s октилион" -msgstr[1] "%(value)s октилиони" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f нонилион" -msgstr[1] "%(value).1f нонилиони" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s нонилион" -msgstr[1] "%(value)s нонилиони" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f децилион" -msgstr[1] "%(value).1f децилиони" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s децилион" -msgstr[1] "%(value)s децилиони" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f гугол" -msgstr[1] "%(value).1f гуголи" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s гугол" -msgstr[1] "%(value)s гуголи" - -msgid "one" -msgstr "еден" - -msgid "two" -msgstr "две" - -msgid "three" -msgstr "три" - -msgid "four" -msgstr "четри" - -msgid "five" -msgstr "пет" - -msgid "six" -msgstr "шест" - -msgid "seven" -msgstr "седум" - -msgid "eight" -msgstr "осум" - -msgid "nine" -msgstr "девет" - -msgid "today" -msgstr "денес" - -msgid "tomorrow" -msgstr "утре" - -msgid "yesterday" -msgstr "вчера" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "пред %(delta)s" - -msgid "now" -msgstr "сега" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "пред %(count)s секундa" -msgstr[1] "пред %(count)s секунди" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "пред %(count)s минутa" -msgstr[1] "пред %(count)s минути" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "пред %(count)s час" -msgstr[1] "пред %(count)s часа" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s од сега" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "за %(count)s секундa од сега" -msgstr[1] "за %(count)s секунди од сега" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "за %(count)s минута од сега" -msgstr[1] "за %(count)s минути од сега" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "за %(count)s час од сега" -msgstr[1] "за %(count)s часа од сега" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ml/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index 13cc9ae..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ml/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index 3c844a8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,396 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Hrishikesh , 2020 -# Jannis Leidel , 2011 -# Rajeesh Nair , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2020-05-13 21:29+0000\n" -"Last-Translator: Hrishikesh \n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "ഹ്യൂമനൈസ്" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f ദശലക്ഷം" -msgstr[1] "%(value).1f ദശലക്ഷം" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s ദശലക്ഷം" -msgstr[1] "%(value)s ദശലക്ഷം" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f ശതകോടി" -msgstr[1] "%(value).1f ശതകോടി" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s ശതകോടി" -msgstr[1] "%(value)s ശതകോടി" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f ട്രില്ല്യണ്‍ (ലക്ഷം കോടി)" -msgstr[1] "%(value).1f ട്രില്ല്യണ്‍ (ലക്ഷം കോടി)" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s ലക്ഷം കോടി" -msgstr[1] "%(value)s ലക്ഷം കോടി" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f ക്വാഡ്രില്ല്യണ്‍" -msgstr[1] "%(value).1f ക്വാഡ്രില്ല്യണ്‍" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s ക്വാഡ്രില്ല്യണ്‍" -msgstr[1] "%(value)s ക്വാഡ്രില്ല്യണ്‍" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f ക്വിന്റില്ല്യണ്‍" -msgstr[1] "%(value).1f ക്വിന്റില്ല്യണ്‍" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s ക്വിന്റില്ല്യണ്‍" -msgstr[1] "%(value)s ക്വിന്റില്ല്യണ്‍" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f സെക്സ്റ്റില്ല്യണ്‍" -msgstr[1] "%(value).1f സെക്സ്റ്റില്ല്യണ്‍" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s സെക്സ്റ്റില്ല്യണ്‍" -msgstr[1] "%(value)s സെക്സ്റ്റില്ല്യണ്‍" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f സെപ്റ്റില്ല്യണ്‍" -msgstr[1] "%(value).1f സെപ്റ്റില്ല്യണ്‍" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s സെപ്റ്റില്ല്യണ്‍" -msgstr[1] "%(value)s സെപ്റ്റില്ല്യണ്‍" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f ഒക്റ്റില്ല്യണ്‍" -msgstr[1] "%(value).1f ഒക്റ്റില്ല്യണ്‍" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s ഒക്റ്റില്ല്യണ്‍" -msgstr[1] "%(value)s ഒക്റ്റില്ല്യണ്‍" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f നോനില്ല്യണ്‍" -msgstr[1] "%(value).1f നോനില്ല്യണ്‍" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s നോനില്ല്യണ്‍" -msgstr[1] "%(value)s നോനില്ല്യണ്‍" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f ഡെസില്ല്യണ്‍" -msgstr[1] "%(value).1f ഡെസില്ല്യണ്‍" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s ഡെസില്ല്യണ്‍" -msgstr[1] "%(value)s ഡെസില്ല്യണ്‍" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f ഗൂഗോള്‍" -msgstr[1] "%(value).1f ഗൂഗോള്‍" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s ഗൂഗോള്‍" -msgstr[1] "%(value)s ഗൂഗോള്‍" - -msgid "one" -msgstr "ഒന്ന്" - -msgid "two" -msgstr "രണ്ട്" - -msgid "three" -msgstr "മൂന്ന്" - -msgid "four" -msgstr "നാല്" - -msgid "five" -msgstr "അഞ്ച്" - -msgid "six" -msgstr "ആറ്" - -msgid "seven" -msgstr "ഏഴ്" - -msgid "eight" -msgstr "എട്ട്" - -msgid "nine" -msgstr "ഒന്‍പത്" - -msgid "today" -msgstr "ഇന്ന്" - -msgid "tomorrow" -msgstr "നാളെ" - -msgid "yesterday" -msgstr "ഇന്നലെ" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -msgid "now" -msgstr "ഇപ്പോള്‍" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index 0f2c700..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 94bb307..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,333 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bayarkhuu Bataa, 2014 -# Bayarkhuu Bataa, 2013 -# Turmunkh Batkhuyag, 2023 -# Zorig, 2013 -# Zorig, 2019 -# Анхбаяр Анхаа , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-24 18:40+0000\n" -"Last-Translator: Turmunkh Batkhuyag, 2023\n" -"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Хүнчлэх" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{} дэх" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{} дэх" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{} дэх" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{} дахь" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{} дахь" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{} дэх" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{} дахь" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{} дахь" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{} дахь" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{} дахь" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{} дэх" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s сая" -msgstr[1] "%(value)s сая" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s тэрбум" -msgstr[1] "%(value)s тэрбум" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s наяд" -msgstr[1] "%(value)s их наяд" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s тунамал" -msgstr[1] "%(value)s тунамал" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s их ингүүмэл " -msgstr[1] "%(value)s их ингүүмэл " - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s ялгаруулагч" -msgstr[1] "%(value)s ялгаруулагч" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s их өөр дээр " -msgstr[1] "%(value)s их өөр дээр " - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s өөр дээр " -msgstr[1] "%(value)s өөр дээр " - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s их шалтгааны үзэгдэл" -msgstr[1] "%(value)s их шалтгааны үзэгдэл" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s эрхэт" -msgstr[1] "%(value)s эрхэт" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" - -msgid "one" -msgstr "нэг" - -msgid "two" -msgstr "хоёр" - -msgid "three" -msgstr "гурав" - -msgid "four" -msgstr "дөрөв" - -msgid "five" -msgstr "тав" - -msgid "six" -msgstr "зургаа" - -msgid "seven" -msgstr "долоо" - -msgid "eight" -msgstr "найм" - -msgid "nine" -msgstr "ес" - -msgid "today" -msgstr "өнөөдөр" - -msgid "tomorrow" -msgstr "маргааш" - -msgid "yesterday" -msgstr "өчигдөр" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s ѳмнѳ" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "1 цагийн өмнө" -msgstr[1] "%(count)s цагийн өмнө" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "1 минутын өмнө" -msgstr[1] "%(count)s минутын өмнө" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "1 секундын өмнө" -msgstr[1] "%(count)s секундын өмнө" - -msgid "now" -msgstr "одоо" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "1 секундын дараа" -msgstr[1] "%(count)s секундын дараа" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "1 минутын дараа" -msgstr[1] "%(count)s минутын дараа" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "1 цагийн дараа" -msgstr[1] "%(count)s цагийн дараа" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "одооноос %(delta)s " - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d жил" -msgstr[1] "%(num)d жил" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d сар" -msgstr[1] "%(num)d сар" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d долоо хоног" -msgstr[1] "%(num)d долоо хоног" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d өдөр" -msgstr[1] "%(num)d өдөр" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d цаг" -msgstr[1] "%(num)d цаг" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минут" -msgstr[1] "%(num)d минут" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d жил" -msgstr[1] "%(num)d жил" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d сар" -msgstr[1] "%(num)d сар" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d долоо хоног" -msgstr[1] "%(num)d долоо хоног" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d өдөр" -msgstr[1] "%(num)d өдөр" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d цаг" -msgstr[1] "%(num)d цаг" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минут" -msgstr[1] "%(num)d минут" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index 9e758b0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index 97d741b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,328 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Omkar Parab, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-01-24 18:40+0000\n" -"Last-Translator: Omkar Parab, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "मानवीकरण" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}वा" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}वा" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}वा" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}वा" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}वा" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}वा" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}वा" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}वा" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}वा" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}वा" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{वा}" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "एक" - -msgid "two" -msgstr "दोन" - -msgid "three" -msgstr "तीन" - -msgid "four" -msgstr "चार" - -msgid "five" -msgstr "पाच" - -msgid "six" -msgstr "सहा" - -msgid "seven" -msgstr "सात" - -msgid "eight" -msgstr "आठ" - -msgid "nine" -msgstr "नऊ" - -msgid "today" -msgstr "आज" - -msgid "tomorrow" -msgstr "उद्या" - -msgid "yesterday" -msgstr "काल" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s पूर्वी" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -msgid "now" -msgstr "आता" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ms/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index 1384c6b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ms/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index e1101d4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,299 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# alternativespeak , 2012 -# Jafry Hisham, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-12-24 18:40+0000\n" -"Last-Translator: Jafry Hisham\n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "Memanusiakan" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "ke{}" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "ke{}" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "ke{}" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "ke{}" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "ke{}" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "ke{}" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "ke{}" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "ke{}" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "ke{}" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "ke{}" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "ke{}" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s juta" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s bilion" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trilion" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kuadrilion" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kuintilion" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)ssextilion" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilion" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktilion" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nontilion" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)sdesilion" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" - -msgid "one" -msgstr "satu" - -msgid "two" -msgstr "dua" - -msgid "three" -msgstr "tiga" - -msgid "four" -msgstr "empat" - -msgid "five" -msgstr "lima" - -msgid "six" -msgstr "enam" - -msgid "seven" -msgstr "tujuh" - -msgid "eight" -msgstr "lapan" - -msgid "nine" -msgstr "sembilan" - -msgid "today" -msgstr "hari ini" - -msgid "tomorrow" -msgstr "esok" - -msgid "yesterday" -msgstr "semalam" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s yang lalu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s yang lalu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s minit yang lalu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s saat yang lalu" - -msgid "now" -msgstr "sekarang" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s saat dari sekarang" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s minit dari sekarang" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s jam dari sekarang" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s dari sekarang" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d tahun" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d bulan" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d minggu" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d hari" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d jam" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minit" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d tahun" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d bulan" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d minggu" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d hari" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d jam" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minit" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/my/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index d26a6d2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/my/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index a3fe48c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,234 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "မြောက်" - -msgid "st" -msgstr "မြောက်" - -msgid "nd" -msgstr "မြောက်" - -msgid "rd" -msgstr "မြောက်" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f မီလီယံ" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s မီလီယံ" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f ဘီလီယံ" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s ဘီလီယံ" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f တရီလျံ" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s တရီလျံ" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f ကွပ်ဒရီလျံ" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s ကွပ်ဒရီလျံ" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f ကွင့်တီလျံ" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s ကွင့်တီလျံ" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f ဆက်တီလျံ" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s ဆက်တီလျံ" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f ဆပ်တီလျံ" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s ဆပ်တီလျံ" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f အော့တီလျံ" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s အော့တီလျံ" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f နိုနီလျံ" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s နိုနီလျံ" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f ဒက်စီလျံ" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s ဒက်စီလျံ" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f ဂူးဂေါ်" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s ဂူးဂေါ်" - -msgid "one" -msgstr "တစ်" - -msgid "two" -msgstr "နှစ်" - -msgid "three" -msgstr "သံုး" - -msgid "four" -msgstr "လေး" - -msgid "five" -msgstr "ငါး" - -msgid "six" -msgstr "ခြောက်" - -msgid "seven" -msgstr "ခုနစ်" - -msgid "eight" -msgstr "ရှစ်" - -msgid "nine" -msgstr "ကိုး" - -msgid "today" -msgstr "ယနေ့" - -msgid "tomorrow" -msgstr "မနက်ဖြန်" - -msgid "yesterday" -msgstr "မနေ့" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "%(delta)s အခါက" - -msgid "now" -msgstr "ယခု" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s ယခုမှ" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index 71f60b2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index 1212f9c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,331 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Jon, 2014 -# Jon, 2018,2022 -# Jon, 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2023-04-24 18:40+0000\n" -"Last-Translator: Jon, 2018,2022\n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanize" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s million" -msgstr[1] "%(value)s millioner" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milliard" -msgstr[1] "%(value)s milliarder" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billion" -msgstr[1] "%(value)s billioner" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kvadrillion" -msgstr[1] "%(value)s kvadrillioner" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kvintillion" -msgstr[1] "%(value)s kvintillioner" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sekstillion" -msgstr[1] "%(value)s sekstillioner" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septillion" -msgstr[1] "%(value)s septillioner" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktillion" -msgstr[1] "%(value)s oktillioner" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonillion" -msgstr[1] "%(value)s nonillioner" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s desillion" -msgstr[1] "%(value)s desillioner" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googoler" - -msgid "one" -msgstr "én" - -msgid "two" -msgstr "to" - -msgid "three" -msgstr "tre" - -msgid "four" -msgstr "fire" - -msgid "five" -msgstr "fem" - -msgid "six" -msgstr "seks" - -msgid "seven" -msgstr "sju" - -msgid "eight" -msgstr "åtte" - -msgid "nine" -msgstr "ni" - -msgid "today" -msgstr "i dag" - -msgid "tomorrow" -msgstr "i morgen" - -msgid "yesterday" -msgstr "i går" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s siden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "en time siden" -msgstr[1] "%(count)s timer siden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "et minutt siden" -msgstr[1] "%(count)s minutter siden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "et sekund siden" -msgstr[1] "%(count)s sekunder siden" - -msgid "now" -msgstr "nå" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "et sekund fra nå" -msgstr[1] "%(count)s sekunder fra nå" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "et minutt fra nå" -msgstr[1] "%(count)s minutter fra nå" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "en time fra nå" -msgstr[1] "%(count)s timer fra nå" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s fra nå" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d måned" -msgstr[1] "%(num)d måneder" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d uke" -msgstr[1] "%(num)d uker" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dager" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timer" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutt" -msgstr[1] "%(num)d minutter" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d måned" -msgstr[1] "%(num)d måneder" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d uke" -msgstr[1] "%(num)d uker" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dager" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timer" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutt" -msgstr[1] "%(num)d minutter" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ne/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index 24deec3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ne/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index d3c9c95..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,395 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Paras Nath Chaudhary , 2012 -# Sagar Chalise , 2019 -# Sandesh Rana , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-12-15 05:39+0000\n" -"Last-Translator: Sagar Chalise \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "मानवीय बनाउनुहोस्" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s मिलियन" -msgstr[1] "%(value)s मिलियन" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s अरब" -msgstr[1] "%(value)s अरब" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s खरब" -msgstr[1] "%(value)s खरब" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s करोड़ शंख" -msgstr[1] "%(value)s करोड़ शंख" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "एक " - -msgid "two" -msgstr "दुई " - -msgid "three" -msgstr "तीन " - -msgid "four" -msgstr "चार " - -msgid "five" -msgstr "पाँच " - -msgid "six" -msgstr "छ " - -msgid "seven" -msgstr "सात " - -msgid "eight" -msgstr "आठ " - -msgid "nine" -msgstr "नौ " - -msgid "today" -msgstr "आज" - -msgid "tomorrow" -msgstr "भोली" - -msgid "yesterday" -msgstr "हिजो" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)sपहिले" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "एक घण्टा अघि" -msgstr[1] "%(count)s घण्टा अघि" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "एक मिनेट अघि" -msgstr[1] "%(count)s मिनेट अघि" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "एक सेकेन्ड अघि" -msgstr[1] "%(count)s सेकेन्ड अघि" - -msgid "now" -msgstr "अहिले" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "एक सेकेन्ड पछि" -msgstr[1] "%(count)s सेकेन्ड पछि" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "एक मिनेट पछि" -msgstr[1] "%(count)s मिनेट पछि" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "एक घण्टा पछि" -msgstr[1] "%(count)s घण्टा पछि" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s अबदेखि" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d बर्ष" -msgstr[1] "%d बर्षहरु" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d महिना" -msgstr[1] "%d महिनाहरु" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d हप्ता" -msgstr[1] "%d हप्ताहरु" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d दिन" -msgstr[1] "%d दिनहरु" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d घण्टा" -msgstr[1] "%d घण्टाहरू" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d मिनेट" -msgstr[1] "%d मिनेटहरू " - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d बर्ष" -msgstr[1] "%d बर्षहरु" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d महिना" -msgstr[1] "%d महिनाहरु" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d हप्ता" -msgstr[1] "%d हप्ताहरु" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d दिन" -msgstr[1] "%d दिनहरु" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d घण्टा" -msgstr[1] "%d घण्टाहरू" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d मिनेट" -msgstr[1] "%d मिनेटहरू " diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index a702bfa..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index c88cf1d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Blue , 2011-2012 -# Jannis Leidel , 2011 -# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2014 -# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2015 -# Tino de Bruijn , 2012 -# Tonnes , 2019,2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2022-07-24 18:40+0000\n" -"Last-Translator: Tonnes \n" -"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Vermenselijken" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}e" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}e" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s miljoen" -msgstr[1] "%(value)s miljoen" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miljard" -msgstr[1] "%(value)s miljard" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s biljoen" -msgstr[1] "%(value)s biljoen" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s biljard" -msgstr[1] "%(value)s biljard" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s triljoen" -msgstr[1] "%(value)s triljoen" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s triljard" -msgstr[1] "%(value)s triljard" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s quadriljoen" -msgstr[1] "%(value)s quadriljoen" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s quadriljard" -msgstr[1] "%(value)s quadriljard" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s quintiljoen" -msgstr[1] "%(value)s quintiljoen" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s quintiljard" -msgstr[1] "%(value)s quintiljard" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" - -msgid "one" -msgstr "één" - -msgid "two" -msgstr "twee" - -msgid "three" -msgstr "drie" - -msgid "four" -msgstr "vier" - -msgid "five" -msgstr "vijf" - -msgid "six" -msgstr "zes" - -msgid "seven" -msgstr "zeven" - -msgid "eight" -msgstr "acht" - -msgid "nine" -msgstr "negen" - -msgid "today" -msgstr "vandaag" - -msgid "tomorrow" -msgstr "morgen" - -msgid "yesterday" -msgstr "gisteren" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s geleden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "een uur geleden" -msgstr[1] "%(count)s uur geleden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "een minuut geleden" -msgstr[1] "%(count)s minuten geleden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "een seconde geleden" -msgstr[1] "%(count)s seconden geleden" - -msgid "now" -msgstr "nu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "over een seconde" -msgstr[1] "over %(count)s seconden" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "over een minuut" -msgstr[1] "over %(count)s minuten" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "over een uur" -msgstr[1] "over %(count)s uur" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "over %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d jaar" -msgstr[1] "%(num)d jaar" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d maand" -msgstr[1] "%(num)d maanden" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d week" -msgstr[1] "%(num)d weken" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagen" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uur" -msgstr[1] "%(num)d uur" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuut" -msgstr[1] "%(num)d minuten" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d jaar" -msgstr[1] "%(num)d jaar" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d maand" -msgstr[1] "%(num)d maanden" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d week" -msgstr[1] "%(num)d weken" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagen" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uur" -msgstr[1] "%(num)d uur" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuut" -msgstr[1] "%(num)d minuten" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index 2b358c4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index 30d7558..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,330 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Sivert Olstad, 2021-2022 -# velmont , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2022-07-24 18:40+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanize" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s million" -msgstr[1] "%(value)s millionar" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milliard" -msgstr[1] "%(value)s milliardar" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s billion" -msgstr[1] "%(value)s billionar" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kvadrillion" -msgstr[1] "%(value)s kvadrillionar" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kvintillion" -msgstr[1] "%(value)s kvintillionar" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sekstillion" -msgstr[1] "%(value)s sekstillionar" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septillion" -msgstr[1] "%(value)s septillionar" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktillion" -msgstr[1] "%(value)s oktillionar" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonillion" -msgstr[1] "%(value)s nonillionar" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s desillion" -msgstr[1] "%(value)s desillionar" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googolar" - -msgid "one" -msgstr "éin" - -msgid "two" -msgstr "to" - -msgid "three" -msgstr "tre" - -msgid "four" -msgstr "fire" - -msgid "five" -msgstr "fem" - -msgid "six" -msgstr "seks" - -msgid "seven" -msgstr "sju" - -msgid "eight" -msgstr "åtte" - -msgid "nine" -msgstr "ni" - -msgid "today" -msgstr "i dag" - -msgid "tomorrow" -msgstr "i morgon" - -msgid "yesterday" -msgstr "i går" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s sidan" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "ein time sidan" -msgstr[1] "%(count)s timar sidan" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "eitt minutt sidan" -msgstr[1] "%(count)s minutt sidan" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "eitt sekund sidan" -msgstr[1] "%(count)s sekund sidan" - -msgid "now" -msgstr "no" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "eitt sekund frå no" -msgstr[1] "%(count)s sekund frå no" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "eitt minutt frå no" -msgstr[1] "%(count)s minutt frå no" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "ein time frå no" -msgstr[1] "%(count)s timar frå no" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s frå no" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d månad" -msgstr[1] "%(num)d månader" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d veke" -msgstr[1] "%(num)d veker" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagar" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timar" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutt" -msgstr[1] "%(num)d minutt" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d månad" -msgstr[1] "%(num)d månader" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d veke" -msgstr[1] "%(num)d veker" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagar" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timar" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutt" -msgstr[1] "%(num)d minutt" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/os/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index c156f1a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/os/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index 186ac89..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,262 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "-ӕм" - -msgid "st" -msgstr "-аг" - -msgid "nd" -msgstr "-аг" - -msgid "rd" -msgstr "-аг" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f милуан" -msgstr[1] "%(value).1f милуан" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s милуан" -msgstr[1] "%(value)s милуан" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f биллон" -msgstr[1] "%(value).1f биллион" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s биллион" -msgstr[1] "%(value)s биллион" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f триллион" -msgstr[1] "%(value).1f триллион" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s триллион" -msgstr[1] "%(value)s триллион" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f къуадриллион" -msgstr[1] "%(value).1f къуадриллион" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s къуадриллион" -msgstr[1] "%(value)s къуадриллион" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f къуинтиллион" -msgstr[1] "%(value).1f къуинтиллион" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s къуинтиллион" -msgstr[1] "%(value)s къуинтиллион" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f секстиллион" -msgstr[1] "%(value).1f секстиллион" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s секстиллион" -msgstr[1] "%(value)s секстиллион" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f септиллион" -msgstr[1] "%(value).1f септиллион" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s септиллион" -msgstr[1] "%(value)s септиллион" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f октиллион" -msgstr[1] "%(value).1f октиллион" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s октиллион" -msgstr[1] "%(value)s октиллион" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f нониллион" -msgstr[1] "%(value).1f нониллион" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s нониллион" -msgstr[1] "%(value)s нониллион" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f дециллион" -msgstr[1] "%(value).1f дециллион" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s дециллион" -msgstr[1] "%(value)s дециллион" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f гугол" -msgstr[1] "%(value).1f гугол" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s гугол" -msgstr[1] "%(value)s гугол" - -msgid "one" -msgstr "иу" - -msgid "two" -msgstr "дыууӕ" - -msgid "three" -msgstr "ӕртӕ" - -msgid "four" -msgstr "цыппар" - -msgid "five" -msgstr "фондз" - -msgid "six" -msgstr "ӕхсӕз" - -msgid "seven" -msgstr "авд" - -msgid "eight" -msgstr "аст" - -msgid "nine" -msgstr "фараст" - -msgid "today" -msgstr "абон" - -msgid "tomorrow" -msgstr "сом" - -msgid "yesterday" -msgstr "знон" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "%(delta)s раздӕр" - -msgid "now" -msgstr "ныр" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s енырӕй" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index 84c6571..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index d37c9ae..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,263 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# A S Alam , 2013 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "ਵਾਂ" - -msgid "st" -msgstr "ਲਾਂ" - -msgid "nd" -msgstr "ਜਾ" - -msgid "rd" -msgstr "ਜਾ" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f ਮਿਲੀਅਨ" -msgstr[1] "%(value).1f ਮਿਲੀਅਨ" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s ਮਿਲੀਅਨ" -msgstr[1] "%(value)s ਮਿਲੀਅਨ" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f ਬਿਲੀਅਨ" -msgstr[1] "%(value).1f ਬਿਲੀਅਨ" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f ਟਰਲੀਅਨ" -msgstr[1] "%(value).1f ਟਰਲੀਅਨ" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "ਇੱਕ" - -msgid "two" -msgstr "ਦੋ" - -msgid "three" -msgstr "ਤਿੰਨ" - -msgid "four" -msgstr "ਚਾਰ" - -msgid "five" -msgstr "ਪੰਜ" - -msgid "six" -msgstr "ਛੇ" - -msgid "seven" -msgstr "ਸੱਤ" - -msgid "eight" -msgstr "ਅੱਠ" - -msgid "nine" -msgstr "ਨੌ" - -msgid "today" -msgstr "ਅੱਜ" - -msgid "tomorrow" -msgstr "ਭਲਕੇ" - -msgid "yesterday" -msgstr "ਕੱਲ੍ਹ" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "ਹੁਣ" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index 9e8495f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index ab0ab92..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,394 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Stachowicz , 2015 -# angularcircle, 2011 -# angularcircle, 2014 -# Jannis Leidel , 2011 -# m_aciek , 2018,2021 -# Piotr Meuś , 2014 -# Roman Barczyński, 2012 -# Tomasz Kajtoch , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-09-23 19:40+0000\n" -"Last-Translator: m_aciek \n" -"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" -"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" -"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -msgid "Humanize" -msgstr "Humanizacja" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milion" -msgstr[1] "%(value)s miliony" -msgstr[2] "%(value)s milionów" -msgstr[3] "%(value)s milionów" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliard" -msgstr[1] "%(value)s miliardy" -msgstr[2] "%(value)s miliardów" -msgstr[3] "%(value)s miliardów" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s kwintylion" -msgstr[1] "%(value)s biliony" -msgstr[2] "%(value)s kwintylionów" -msgstr[3] "%(value)s kwintylionów" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kwadrylion" -msgstr[1] "%(value)s biliardy" -msgstr[2] "%(value)s kwadrylionów" -msgstr[3] "%(value)s kwadrylionów" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trylion" -msgstr[1] "%(value)s tryliony" -msgstr[2] "%(value)s trylionyów" -msgstr[3] "%(value)s trylionyów" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] " %(value)s tryliard" -msgstr[1] "%(value)s tryliardy" -msgstr[2] "%(value)s tryliardów" -msgstr[3] "%(value)s tryliardów" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septylion" -msgstr[1] "%(value)s septyliony" -msgstr[2] "%(value)s septylionów" -msgstr[3] "%(value)s septylionów" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kwadryliard" -msgstr[1] "%(value)s kwardyliardy" -msgstr[2] "%(value)s kwadryliardów" -msgstr[3] "%(value)s kwadryliardów" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kwintylion" -msgstr[1] "%(value)s kwintyliony" -msgstr[2] "%(value)s kwintylionów" -msgstr[3] "%(value)s kwintylionów" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kwintyliard" -msgstr[1] "%(value)s kwintyliardy" -msgstr[2] "%(value)s kwintyliardów" -msgstr[3] "%(value)s kwintyliardów" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googole" -msgstr[2] "%(value)s googolów" -msgstr[3] "%(value)s googolów" - -msgid "one" -msgstr "jeden" - -msgid "two" -msgstr "dwa" - -msgid "three" -msgstr "trzy" - -msgid "four" -msgstr "cztery" - -msgid "five" -msgstr "pięć" - -msgid "six" -msgstr "sześć" - -msgid "seven" -msgstr "siedem" - -msgid "eight" -msgstr "osiem" - -msgid "nine" -msgstr "dziewięć" - -msgid "today" -msgstr "dzisiaj" - -msgid "tomorrow" -msgstr "jutro" - -msgid "yesterday" -msgstr "wczoraj" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s temu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "godzinę temu" -msgstr[1] "%(count)s godziny temu" -msgstr[2] "%(count)s godzin temu" -msgstr[3] "%(count)s godzin temu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "minutę temu" -msgstr[1] "%(count)s minuty temu" -msgstr[2] "%(count)s minut temu" -msgstr[3] "%(count)s minut temu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "sekundę temu" -msgstr[1] "%(count)s sekundy temu" -msgstr[2] "%(count)s sekund temu" -msgstr[3] "%(count)s sekund temu" - -msgid "now" -msgstr "teraz" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "za sekundę" -msgstr[1] "za %(count)s sekundy" -msgstr[2] "za %(count)s sekund" -msgstr[3] "za %(count)s sekund" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "za minutę" -msgstr[1] "za %(count)s minuty" -msgstr[2] "za %(count)s minut" -msgstr[3] "za %(count)s minut" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "za godzinę" -msgstr[1] "za %(count)s godziny" -msgstr[2] "za %(count)s godzin" -msgstr[3] "za %(count)s godzin" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "za %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rok" -msgstr[1] "%(num)d lata" -msgstr[2] "%(num)d lat" -msgstr[3] "%(num)d roku" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d miesiąc" -msgstr[1] "%(num)d miesiące" -msgstr[2] "%(num)d miesięcy" -msgstr[3] "%(num)d miesiąca" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tydzień" -msgstr[1] "%(num)d tygodnie" -msgstr[2] "%(num)d tygodni" -msgstr[3] "%(num)d tygodnia" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dzień" -msgstr[1] "%(num)d dni" -msgstr[2] "%(num)d dni" -msgstr[3] "%(num)d dnia" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d godzinę" -msgstr[1] "%(num)d godziny" -msgstr[2] "%(num)d godzin" -msgstr[3] "%(num)d godziny" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutę" -msgstr[1] "%(num)d minuty" -msgstr[2] "%(num)d minut" -msgstr[3] "%(num)d minuty" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rok" -msgstr[1] "%(num)d lata" -msgstr[2] "%(num)d lat" -msgstr[3] "%(num)d roku" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d miesiąc" -msgstr[1] "%(num)d miesiące" -msgstr[2] "%(num)d miesięcy" -msgstr[3] "%(num)dmiesiąca" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tydzień" -msgstr[1] "%(num)d tygodnie" -msgstr[2] "%(num)d tygodni" -msgstr[3] "%(num)d tygodnia" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dzień" -msgstr[1] "%(num)d dni" -msgstr[2] "%(num)d dni" -msgstr[3] "%(num)d dnia" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d godzinę" -msgstr[1] "%(num)d godziny" -msgstr[2] "%(num)d godzin" -msgstr[3] "%(num)d godziny" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutę" -msgstr[1] "%(num)d minuty" -msgstr[2] "%(num)d minut" -msgstr[3] "%(num)d minuty" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index 798955a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index 5d5ca39..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,362 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Henrique Azevedo , 2018 -# Jannis Leidel , 2011 -# jorgecarleitao , 2014 -# Manuela Silva , 2025 -# Nuno Mariz , 2012-2013,2018 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Manuela Silva , 2025\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanizar" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}.º" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}.º" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milhão" -msgstr[1] "%(value)s milhões" -msgstr[2] "%(value)s milhões" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s bilião" -msgstr[1] "%(value)s biliões" -msgstr[2] "%(value)s biliões" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trilião" -msgstr[1] "%(value)s triliões" -msgstr[2] "%(value)s triliões" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s quadrilião" -msgstr[1] "%(value)s quatriliões" -msgstr[2] "%(value)s quatriliões" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s quintilião" -msgstr[1] "%(value)s quintiliões" -msgstr[2] "%(value)s quintiliões" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextilião" -msgstr[1] "%(value)s sextiliões" -msgstr[2] "%(value)s sextiliões" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilião" -msgstr[1] "%(value)s septiliões" -msgstr[2] "%(value)s septiliões" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octilião" -msgstr[1] "%(value)s octiliões" -msgstr[2] "%(value)s octiliões" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonilião" -msgstr[1] "%(value)s noniliões" -msgstr[2] "%(value)s noniliões" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decilião" -msgstr[1] "%(value)s deciliões" -msgstr[2] "%(value)s deciliões" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" -msgstr[2] "%(value)s googol" - -msgid "one" -msgstr "um" - -msgid "two" -msgstr "dois" - -msgid "three" -msgstr "três" - -msgid "four" -msgstr "quatro" - -msgid "five" -msgstr "cinco" - -msgid "six" -msgstr "seis" - -msgid "seven" -msgstr "sete" - -msgid "eight" -msgstr "oito" - -msgid "nine" -msgstr "nove" - -msgid "today" -msgstr "hoje" - -msgid "tomorrow" -msgstr "amanhã" - -msgid "yesterday" -msgstr "ontem" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s atrás" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "há uma hora atrás" -msgstr[1] "há %(count)s horas atrás" -msgstr[2] "há %(count)s horas atrás" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "há um minuto atrás" -msgstr[1] "há %(count)s minutos atrás" -msgstr[2] "há %(count)s minutos atrás" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "há um segundo atrás" -msgstr[1] "há %(count)s segundos atrás" -msgstr[2] "há %(count)s segundos atrás" - -msgid "now" -msgstr "agora" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "daqui a um segundo" -msgstr[1] "daqui a %(count)s segundos" -msgstr[2] "daqui a %(count)s segundos" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "daqui a um minuto" -msgstr[1] "daqui a %(count)s minutos" -msgstr[2] "daqui a %(count)s minutos" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "daqui a uma hora" -msgstr[1] "daqui a %(count)s horas" -msgstr[2] "daqui a %(count)s horas" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s a partir de agora" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" -msgstr[2] "%(num)d anos" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mês" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dias" -msgstr[2] "%(num)d dias" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" -msgstr[2] "%(num)d anos" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mês" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dias" -msgstr[2] "%(num)d dias" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index fe94773..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index 391c4d5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,367 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# bruno.devpod , 2014 -# Claude Paroz , 2024 -# Eduardo Cereto Carvalho, 2012 -# Eduardo Felipe Castegnaro , 2024 -# Erick Mesquita, 2023 -# fa9e10542e458baef0599ae856e43651_13d2225, 2012-2013 -# Jannis Leidel , 2011 -# Rafael Fontenelle , 2022 -# Sandro , 2011 -# Francisco Petry Rauber , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-08-07 18:40+0000\n" -"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" -"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Humanize" -msgstr "Humanizar" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}º" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}º" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milhão" -msgstr[1] "%(value)s milhões" -msgstr[2] "%(value)s milhões" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s bilhão" -msgstr[1] "%(value)s bilhões" -msgstr[2] "%(value)s bilhões" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trilhão" -msgstr[1] "%(value)s trilhões" -msgstr[2] "%(value)s trilhões" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s quadrilhão" -msgstr[1] "%(value)s quadrilhões" -msgstr[2] "%(value)s quadrilhões" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s quintilhão" -msgstr[1] "%(value)s quintilhões" -msgstr[2] "%(value)s quintilhões" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextilhão" -msgstr[1] "%(value)s sextilhões" -msgstr[2] "%(value)s sextilhões" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilhão" -msgstr[1] "%(value)s septilhões" -msgstr[2] "%(value)s septilhões" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octilhão" -msgstr[1] "%(value)s octilhões" -msgstr[2] "%(value)s octilhões" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonilhão" -msgstr[1] "%(value)s nonilhões" -msgstr[2] "%(value)s nonilhões" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decilhão" -msgstr[1] "%(value)s decilhões" -msgstr[2] "%(value)s decilhões" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" -msgstr[2] "%(value)s googol" - -msgid "one" -msgstr "um" - -msgid "two" -msgstr "dois" - -msgid "three" -msgstr "três" - -msgid "four" -msgstr "quatro" - -msgid "five" -msgstr "cinco" - -msgid "six" -msgstr "seis" - -msgid "seven" -msgstr "sete" - -msgid "eight" -msgstr "oito" - -msgid "nine" -msgstr "nove" - -msgid "today" -msgstr "hoje" - -msgid "tomorrow" -msgstr "amanhã" - -msgid "yesterday" -msgstr "ontem" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s atrás" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "uma hora atrás" -msgstr[1] "%(count)s horas atrás" -msgstr[2] "%(count)s horas atrás" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "um minuto atrás" -msgstr[1] "%(count)s minutos atrás" -msgstr[2] "%(count)s minutos atrás" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "um segundo atrás" -msgstr[1] "%(count)s segundos atrás" -msgstr[2] "%(count)s segundos atrás" - -msgid "now" -msgstr "agora" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "um segundo a partir de agora" -msgstr[1] "%(count)s segundos a partir de agora" -msgstr[2] "%(count)s segundos a partir de agora" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "um minuto a partir de agora" -msgstr[1] "%(count)s minutos a partir de agora" -msgstr[2] "%(count)s minutos a partir de agora" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "uma hora a partir de agora" -msgstr[1] "%(count)s horas a partir de agora" -msgstr[2] "%(count)s horas a partir de agora" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s a partir de agora" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" -msgstr[2] "%(num)d anos" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mês" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dias" -msgstr[2] "%(num)d dias" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" -msgstr[2] "%(num)d anos" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mês" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dias" -msgstr[2] "%(num)d dias" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ro/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index ded2647..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ro/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index efc883a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,440 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bogdan Mateescu, 2018 -# Daniel Ursache-Dogariu, 2011 -# Denis Darii , 2014 -# Jannis Leidel , 2011 -# Razvan Stefanescu , 2016 -# Sorin Sbarnea, 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2018-05-18 06:45+0000\n" -"Last-Translator: Bogdan Mateescu\n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -msgid "Humanize" -msgstr "Umanizare" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "al {}-lea" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "al {}-lea" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "al {}-lea" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "al {}-lea" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "al {}-lea" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "al {}-lea" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "al {}-lea" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "al {}-lea" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "al {}-lea" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "al {}-lea" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f milion" -msgstr[1] "%(value).1f milioane" -msgstr[2] "%(value).1f de milioane" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milion" -msgstr[1] "%(value)s milioane" -msgstr[2] "%(value)s de milioane" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f miliard" -msgstr[1] "%(value).1f miliarde" -msgstr[2] "%(value).1f de miliarde" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliard" -msgstr[1] "%(value)s miliarde" -msgstr[2] "%(value)s de miliarde" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f trilion" -msgstr[1] "%(value).1f trilioane" -msgstr[2] "%(value).1f de trilioane" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trilion" -msgstr[1] "%(value)s trilioane" -msgstr[2] "%(value)s de trilioane" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f cuadrilion" -msgstr[1] "%(value).1f cuadrilioane" -msgstr[2] "%(value).1f de cuadrilioane" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s cuadrilion" -msgstr[1] "%(value)s cuadrilioane" -msgstr[2] "%(value)s de cuadrilioane" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f cuntilion" -msgstr[1] "%(value).1f cuntilioane" -msgstr[2] "%(value).1f de cuntilioane" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s cuntilion" -msgstr[1] "%(value)s cuntilioane" -msgstr[2] "%(value)s de cuntilioane" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f sextilion" -msgstr[1] "%(value).1f sextilioane" -msgstr[2] "%(value).1f de sextilioane" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextilion" -msgstr[1] "%(value)s sextilioane" -msgstr[2] "%(value)s de sextilioane" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f septilion" -msgstr[1] "%(value).1f septilioane" -msgstr[2] "%(value).1f de septilioane" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilion" -msgstr[1] "%(value)s septilioane" -msgstr[2] "%(value)s de septilioane" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f octilion" -msgstr[1] "%(value).1f octilioane" -msgstr[2] "%(value).1f de octilioane" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octilion" -msgstr[1] "%(value)s octilioane" -msgstr[2] "%(value)s de octilioane" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f nonilion" -msgstr[1] "%(value).1f nonilioane" -msgstr[2] "%(value).1f de nonilioane" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonilion" -msgstr[1] "%(value)s nonilioane" -msgstr[2] "%(value)s de nonilioane" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f decilion" -msgstr[1] "%(value).1f decilioane" -msgstr[2] "%(value).1f de decilioane" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decilion" -msgstr[1] "%(value)s decilioane" -msgstr[2] "%(value)s de decilioane" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f googol" -msgstr[1] "%(value).1f googol" -msgstr[2] "%(value).1f de googol" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" -msgstr[2] "%(value)s de googol" - -msgid "one" -msgstr "unu" - -msgid "two" -msgstr "doi" - -msgid "three" -msgstr "trei" - -msgid "four" -msgstr "patru" - -msgid "five" -msgstr "cinci" - -msgid "six" -msgstr "șase" - -msgid "seven" -msgstr "șapte" - -msgid "eight" -msgstr "opt" - -msgid "nine" -msgstr "nouă" - -msgid "today" -msgstr "astăzi" - -msgid "tomorrow" -msgstr "mâine" - -msgid "yesterday" -msgstr "ieri" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "Acum %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "Acum o oră" -msgstr[1] "Acum %(count)s ore" -msgstr[2] "Acum %(count)s de ore" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "Acum un minut" -msgstr[1] "Acum %(count)s minute" -msgstr[2] "Acum %(count)s de minute" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "Acum o secundă" -msgstr[1] "Acum %(count)s secunde" -msgstr[2] "Acum %(count)s de secunde" - -msgid "now" -msgstr "acum" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "Într-o secundă" -msgstr[1] "În %(count)s secunde" -msgstr[2] "În %(count)s de secunde" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "Într-un minut" -msgstr[1] "În %(count)s minute" -msgstr[2] "În %(count)s de minute" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "Într-o oră" -msgstr[1] "În %(count)s ore" -msgstr[2] "În %(count)s de ore" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "În %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d an" -msgstr[1] "%d ani" -msgstr[2] "%d de ani" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d lună" -msgstr[1] "%d luni" -msgstr[2] "%d de luni" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d săptămână" -msgstr[1] "%d săptămâni" -msgstr[2] "%d de săptămâni" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d zi" -msgstr[1] "%d zile" -msgstr[2] "%d de zile" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d oră" -msgstr[1] "%d ore" -msgstr[2] "%d de ore" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minut" -msgstr[1] "%d minute" -msgstr[2] "%d de minute" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d an" -msgstr[1] "%d ani" -msgstr[2] "%d de ani" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d lună" -msgstr[1] "%d luni" -msgstr[2] "%d de luni" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d săptămână" -msgstr[1] "%d săptămâni" -msgstr[2] "%d de săptămâni" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d zi" -msgstr[1] "%d zile" -msgstr[2] "%d de zile" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d oră" -msgstr[1] "%d ore" -msgstr[2] "%d de ore" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minut" -msgstr[1] "%d minute" -msgstr[2] "%d de minute" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ru/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index edd7505..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ru/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index 51839a3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,396 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mingun , 2014 -# Dimmus , 2011 -# Eugene , 2012 -# Grigory Fateyev (aka greg) , 2018 -# Jannis Leidel , 2011 -# Mingun , 2014 -# SeryiMysh , 2018 -# Алексей Борискин , 2012,2014,2022 -# Bobsans , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2022-04-24 18:40+0000\n" -"Last-Translator: Алексей Борискин , 2012,2014,2022\n" -"Language-Team: Russian (http://www.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Humanize" -msgstr "Приведение значений к виду, понятному человеку" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}-й" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}-й" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}-й" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}-й" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}-й" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}-й" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}-й" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}-й" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}-й" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}-й" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}-й" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s миллион" -msgstr[1] "%(value)s миллиона" -msgstr[2] "%(value)s миллионов" -msgstr[3] "%(value)s миллионов" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s миллиард" -msgstr[1] "%(value)s миллиарда" -msgstr[2] "%(value)s миллиардов" -msgstr[3] "%(value)s миллиардов" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s триллион" -msgstr[1] "%(value)s триллиона" -msgstr[2] "%(value)s триллионов" -msgstr[3] "%(value)s триллионов" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s квадриллион" -msgstr[1] "%(value)s квадриллиона" -msgstr[2] "%(value)s квадриллионов" -msgstr[3] "%(value)s квадриллионов" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s квинтиллион" -msgstr[1] "%(value)s квинтиллиона" -msgstr[2] "%(value)s квинтиллионов" -msgstr[3] "%(value)s квинтиллионов" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s секстиллион" -msgstr[1] "%(value)s секстиллиона" -msgstr[2] "%(value)s секстиллионов" -msgstr[3] "%(value)s секстиллионов" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s септиллион" -msgstr[1] "%(value)s септиллиона" -msgstr[2] "%(value)s септиллионов" -msgstr[3] "%(value)s септиллионов" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s октиллион" -msgstr[1] "%(value)s октиллиона" -msgstr[2] "%(value)s октиллионов" -msgstr[3] "%(value)s октиллионов" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s нониллион" -msgstr[1] "%(value)s нониллиона" -msgstr[2] "%(value)s нониллионов" -msgstr[3] "%(value)s нониллионов" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s дециллион" -msgstr[1] "%(value)s дециллиона" -msgstr[2] "%(value)s дециллионов" -msgstr[3] "%(value)s дециллионов" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s гугол" -msgstr[1] "%(value)s гугола" -msgstr[2] "%(value)s гуголов" -msgstr[3] "%(value)s гуголов" - -msgid "one" -msgstr "один" - -msgid "two" -msgstr "два" - -msgid "three" -msgstr "три" - -msgid "four" -msgstr "четыре" - -msgid "five" -msgstr "пять" - -msgid "six" -msgstr "шесть" - -msgid "seven" -msgstr "семь" - -msgid "eight" -msgstr "восемь" - -msgid "nine" -msgstr "девять" - -msgid "today" -msgstr "сегодня" - -msgid "tomorrow" -msgstr "завтра" - -msgid "yesterday" -msgstr "вчера" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s назад" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s час назад" -msgstr[1] "%(count)s часа назад" -msgstr[2] "%(count)s часов назад" -msgstr[3] "%(count)s часов назад" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s минуту назад" -msgstr[1] "%(count)s минуты назад" -msgstr[2] "%(count)s минут назад" -msgstr[3] "%(count)s минут назад" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s секунду назад" -msgstr[1] "%(count)s секунды назад" -msgstr[2] "%(count)s секунд назад" -msgstr[3] "%(count)s секунд назад" - -msgid "now" -msgstr "сейчас" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "через %(count)s секунду" -msgstr[1] "через %(count)s секунды" -msgstr[2] "через %(count)s секунд" -msgstr[3] "через %(count)s секунд" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "через %(count)s минуту" -msgstr[1] "через %(count)s минуты" -msgstr[2] "через %(count)s минут" -msgstr[3] "через %(count)s минут" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "через %(count)s час" -msgstr[1] "через %(count)s часа" -msgstr[2] "через %(count)s часов" -msgstr[3] "через %(count)s часов" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "через %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d год" -msgstr[1] "%(num)d года" -msgstr[2] "%(num)d лет" -msgstr[3] "%(num)d лет" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месяц" -msgstr[1] "%(num)d месяца" -msgstr[2] "%(num)d месяцев" -msgstr[3] "%(num)d месяцев" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d неделю" -msgstr[1] "%(num)d недели" -msgstr[2] "%(num)d недель" -msgstr[3] "%(num)d недель" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d день" -msgstr[1] "%(num)d дня" -msgstr[2] "%(num)d дней" -msgstr[3] "%(num)d дней" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d час" -msgstr[1] "%(num)d часа" -msgstr[2] "%(num)d часов" -msgstr[3] "%(num)d часов" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минуту" -msgstr[1] "%(num)d минуты" -msgstr[2] "%(num)d минут" -msgstr[3] "%(num)d минут" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d год" -msgstr[1] "%(num)d года" -msgstr[2] "%(num)d лет" -msgstr[3] "%(num)d лет" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месяц" -msgstr[1] "%(num)d месяца" -msgstr[2] "%(num)d месяцев" -msgstr[3] "%(num)d месяцев" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d неделю" -msgstr[1] "%(num)d недели" -msgstr[2] "%(num)d недель" -msgstr[3] "%(num)d недель" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d день" -msgstr[1] "%(num)d дня" -msgstr[2] "%(num)d дней" -msgstr[3] "%(num)d дней" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d час" -msgstr[1] "%(num)d часа" -msgstr[2] "%(num)d часов" -msgstr[3] "%(num)d часов" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минуту" -msgstr[1] "%(num)d минуты" -msgstr[2] "%(num)d минут" -msgstr[3] "%(num)d минут" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index 561afb1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index 5591cae..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,390 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Zahradník, 2023 -# Claude Paroz , 2013 -# Jannis Leidel , 2011 -# Marian Andre , 2012-2013 -# Martin Tóth , 2017-2019,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:40+0000\n" -"Last-Translator: Martin Tóth , 2017-2019,2023\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Humanize" -msgstr "Poľudštenie" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milión" -msgstr[1] "%(value)s milióny" -msgstr[2] "%(value)s miliónov" -msgstr[3] "%(value)s miliónov" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliarda" -msgstr[1] "%(value)s miliardy" -msgstr[2] "%(value)s miliárd" -msgstr[3] "%(value)s miliárd" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s bilión" -msgstr[1] "%(value)s bilióny" -msgstr[2] "%(value)s biliónov" -msgstr[3] "%(value)s biliónov" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s biliarda" -msgstr[1] "%(value)s biliardy" -msgstr[2] "%(value)s biliárd" -msgstr[3] "%(value)s biliárd" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trilión" -msgstr[1] "%(value)s trilióny" -msgstr[2] "%(value)s triliónov" -msgstr[3] "%(value)s triliónov" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s triliarda" -msgstr[1] "%(value)s triliardy" -msgstr[2] "%(value)s triliárd" -msgstr[3] "%(value)s triliárd" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s kvadrilión" -msgstr[1] "%(value)s kvadrilióny" -msgstr[2] "%(value)s kvadriliónov" -msgstr[3] "%(value)s kvadriliónov" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kvadriliarda" -msgstr[1] "%(value)s kvadriliardy" -msgstr[2] "%(value)s kvadriliárd" -msgstr[3] "%(value)s kvadriliárd" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kvintilión" -msgstr[1] "%(value)s kvintilióny" -msgstr[2] "%(value)s kvintiliónov" -msgstr[3] "%(value)s kvintiliónov" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kvintiliarda" -msgstr[1] "%(value)s kvintiliardy" -msgstr[2] "%(value)s kvintiliárd" -msgstr[3] "%(value)s kvintiliárd" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" -msgstr[2] "%(value)s googol" -msgstr[3] "%(value)s googol" - -msgid "one" -msgstr "jeden" - -msgid "two" -msgstr "dva" - -msgid "three" -msgstr "tri" - -msgid "four" -msgstr "štyri" - -msgid "five" -msgstr "päť" - -msgid "six" -msgstr "šesť" - -msgid "seven" -msgstr "sedem" - -msgid "eight" -msgstr "osem" - -msgid "nine" -msgstr "deväť" - -msgid "today" -msgstr "dnes" - -msgid "tomorrow" -msgstr "zajtra" - -msgid "yesterday" -msgstr "včera" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "pred %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "pred hodinou" -msgstr[1] "pred %(count)s hodinami" -msgstr[2] "pred %(count)s hodinami" -msgstr[3] "pred %(count)s hodinami" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "pred minútou" -msgstr[1] "pred %(count)s minútami" -msgstr[2] "pred %(count)s minútami" -msgstr[3] "pred %(count)s minútami" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "pred sekundou" -msgstr[1] "pred %(count)s sekundami" -msgstr[2] "pred %(count)s sekundami" -msgstr[3] "pred %(count)s sekundami" - -msgid "now" -msgstr "teraz" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "o sekundu" -msgstr[1] "o %(count)s sekundy" -msgstr[2] "o %(count)s sekúnd" -msgstr[3] "o %(count)s sekúnd" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "o minútu" -msgstr[1] "o %(count)s minúty" -msgstr[2] "o %(count)s minút" -msgstr[3] "o %(count)s minút" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "o hodinu" -msgstr[1] "o %(count)s hodiny" -msgstr[2] "o %(count)s hodín" -msgstr[3] "o %(count)s hodín" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "o %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rokom" -msgstr[1] "%(num)d rokmi" -msgstr[2] "%(num)d rokmi" -msgstr[3] "%(num)d rokmi" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesiacom" -msgstr[1] "%(num)d mesiacmi" -msgstr[2] "%(num)d mesiacmi" -msgstr[3] "%(num)d mesiacmi" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d týždňom" -msgstr[1] "%(num)d týždňami" -msgstr[2] "%(num)d týždňami" -msgstr[3] "%(num)d týždňami" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dňom" -msgstr[1] "%(num)d dňami" -msgstr[2] "%(num)d dňami" -msgstr[3] "%(num)d dňami" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodinou" -msgstr[1] "%(num)d hodinami" -msgstr[2] "%(num)d hodinami" -msgstr[3] "%(num)d hodinami" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minútou" -msgstr[1] "%(num)d minútami" -msgstr[2] "%(num)d minútami" -msgstr[3] "%(num)d minútami" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rok" -msgstr[1] "%(num)d roky" -msgstr[2] "%(num)d rokov" -msgstr[3] "%(num)d rokov" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesiac" -msgstr[1] "%(num)d mesiace" -msgstr[2] "%(num)d mesiacov" -msgstr[3] "%(num)d mesiacov" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d týždeň" -msgstr[1] "%(num)d týždne" -msgstr[2] "%(num)d týždňov" -msgstr[3] "%(num)d týždňov" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d deň" -msgstr[1] "%(num)d dni" -msgstr[2] "%(num)d dní" -msgstr[3] "%(num)d dní" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodinu" -msgstr[1] "%(num)d hodiny" -msgstr[2] "%(num)d hodín" -msgstr[3] "%(num)d hodín" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minútu" -msgstr[1] "%(num)d minúty" -msgstr[2] "%(num)d minút" -msgstr[3] "%(num)d minút" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index 2526b74..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index 3d50a93..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,392 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrej Marsetič, 2022-2023 -# Jannis Leidel , 2011 -# Jure Cuhalev , 2011 -# Primoz Verdnik , 2013-2014 -# zejn , 2016 -# zejn , 2011,2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:40+0000\n" -"Last-Translator: Andrej Marsetič, 2022-2023\n" -"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "Humanize" -msgstr "Počloveči" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milijon" -msgstr[1] "%(value)s milijona" -msgstr[2] "%(value)s milijoni" -msgstr[3] "%(value)s milijonov" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miljarda" -msgstr[1] "%(value)s miljardi" -msgstr[2] "%(value)s miljarde" -msgstr[3] "%(value)s miljard" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s triljon" -msgstr[1] "%(value)s triljona" -msgstr[2] "%(value)s triljoni" -msgstr[3] "%(value)s triljonov" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kvadrilijon" -msgstr[1] "%(value)s kvadrilijona" -msgstr[2] "%(value)s kvadrilijoni" -msgstr[3] "%(value)s kvadrilijonov" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kvintilijon" -msgstr[1] "%(value)s kvintilijona" -msgstr[2] "%(value)s kvintilijoni" -msgstr[3] "%(value)s kvintilijonov" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sekstilijon" -msgstr[1] "%(value)s sekstilijona" -msgstr[2] "%(value)s sekstilijoni" -msgstr[3] "%(value)s sekstilijonov" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilijon" -msgstr[1] "%(value)s septilijona" -msgstr[2] "%(value)s septilijoni" -msgstr[3] "%(value)s septilijonov" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktilijon" -msgstr[1] "%(value)s oktilijona" -msgstr[2] "%(value)s oktilijoni" -msgstr[3] "%(value)s oktilijonov" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonilijon" -msgstr[1] "%(value)s nonilijona" -msgstr[2] "%(value)s nonilijoni" -msgstr[3] "%(value)s nonilijonov" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decilijon" -msgstr[1] "%(value)s decilijona" -msgstr[2] "%(value)s decilijoni" -msgstr[3] "%(value)s decilijonov" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gugol" -msgstr[1] "%(value)s gugola" -msgstr[2] "%(value)s gugoli" -msgstr[3] "%(value)s gugolov" - -msgid "one" -msgstr "ena" - -msgid "two" -msgstr "dve" - -msgid "three" -msgstr "tri" - -msgid "four" -msgstr "štiri" - -msgid "five" -msgstr "pet" - -msgid "six" -msgstr "šest" - -msgid "seven" -msgstr "sedem" - -msgid "eight" -msgstr "osem" - -msgid "nine" -msgstr "devet" - -msgid "today" -msgstr "danes" - -msgid "tomorrow" -msgstr "jutri" - -msgid "yesterday" -msgstr "včeraj" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "pred %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "pred %(count)s uro" -msgstr[1] "pred %(count)s urama" -msgstr[2] "pred %(count)s urami" -msgstr[3] "pred %(count)s urami" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "pred %(count)s minuto" -msgstr[1] "pred %(count)s minutama" -msgstr[2] "pred %(count)s minutami" -msgstr[3] "pred %(count)s minutami" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "pred %(count)s sekundo" -msgstr[1] "pred %(count)s sekundama" -msgstr[2] "pred %(count)s sekundami" -msgstr[3] "pred %(count)s sekundami" - -msgid "now" -msgstr "zdaj" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "čez %(count)s sekundo" -msgstr[1] "čez %(count)s sekundi" -msgstr[2] "čez %(count)s sekunde" -msgstr[3] "čez %(count)s sekund" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "čez %(count)s minuto" -msgstr[1] "čez %(count)s minuti" -msgstr[2] "čez %(count)s minute" -msgstr[3] "čez %(count)s minut" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "čez %(count)s uro" -msgstr[1] "čez %(count)s uri" -msgstr[2] "čez %(count)s ure" -msgstr[3] "čez %(count)s ur" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)sod zdaj" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d leto" -msgstr[1] "%(num)d leti" -msgstr[2] "%(num)d let" -msgstr[3] "%(num)d let" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesec" -msgstr[1] "%(num)d meseca" -msgstr[2] "%(num)d mesecev" -msgstr[3] "%(num)d mesecev" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d teden" -msgstr[1] "%(num)d tedna" -msgstr[2] "%(num)d tednov" -msgstr[3] "%(num)d tednov" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dan" -msgstr[1] "%(num)d dneva" -msgstr[2] "%(num)d dni" -msgstr[3] "%(num)d dni" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ura" -msgstr[1] "%(num)d uri" -msgstr[2] "%(num)d ur" -msgstr[3] "%(num)d ur" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuti" -msgstr[2] "%(num)d minut" -msgstr[3] "%(num)d minut" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d leto" -msgstr[1] "%(num)d leti" -msgstr[2] "%(num)d let" -msgstr[3] "%(num)d let" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesec" -msgstr[1] "%(num)d meseca" -msgstr[2] "%(num)d mesecev" -msgstr[3] "%(num)d mesecev" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d teden" -msgstr[1] "%(num)d tedena" -msgstr[2] "%(num)d tedne" -msgstr[3] "%(num)d tedne" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dan" -msgstr[1] "%(num)d dneva" -msgstr[2] "%(num)d dni" -msgstr[3] "%(num)d dni" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ura" -msgstr[1] "%(num)d uri" -msgstr[2] "%(num)d ure" -msgstr[3] "%(num)d ure" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuti" -msgstr[2] "%(num)d minut" -msgstr[3] "%(num)d minut" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sq/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index 475feab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sq/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index 826ae04..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,330 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2011,2015 -# Besnik Bleta , 2025 -# Besnik Bleta , 2015,2018-2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Jepi Formë Njerëzore" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "-të" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "-të" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "-të" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "-të" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "-të" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "-të" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "-të" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "-të" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "-të" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "-të" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milion" -msgstr[1] "%(value)s milionë" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miliard" -msgstr[1] "%(value)s miliardë" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trilion" -msgstr[1] "%(value)s trilionë" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kuadrilion" -msgstr[1] "%(value)s kuadrilionë" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kuintilionë" -msgstr[1] "%(value)s kuintilionë" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sestilion" -msgstr[1] "%(value)s sestilionë" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilion" -msgstr[1] "%(value)s septilionë" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktilion" -msgstr[1] "%(value)s oktilionë" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonilion" -msgstr[1] "%(value)s nonilionë" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decilion" -msgstr[1] "%(value)s decilionë" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gugol" -msgstr[1] "%(value)s gugolë" - -msgid "one" -msgstr "një" - -msgid "two" -msgstr "dy" - -msgid "three" -msgstr "tre" - -msgid "four" -msgstr "katër" - -msgid "five" -msgstr "pesë" - -msgid "six" -msgstr "gjashtë" - -msgid "seven" -msgstr "shtatë" - -msgid "eight" -msgstr "tetë" - -msgid "nine" -msgstr "nëntë" - -msgid "today" -msgstr "sot" - -msgid "tomorrow" -msgstr "nesër" - -msgid "yesterday" -msgstr "dje" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s më parë" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "një orë më parë" -msgstr[1] "%(count)s orë më parë" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "një minutë më parë" -msgstr[1] "%(count)s minuta më parë" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "një sekondë më parë" -msgstr[1] "%(count)s sekonda më parë" - -msgid "now" -msgstr "tani" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "një sekondë më parë" -msgstr[1] "%(count)s sekonda më parë" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "për një minutë" -msgstr[1] "për %(count)s minuta" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "për një orë" -msgstr[1] "për %(count)s orë" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s nga tani" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d vit" -msgstr[1] "%(num)d vjet" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d muaj" -msgstr[1] "%(num)d muaj" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d javë" -msgstr[1] "%(num)d javë" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d ditë" -msgstr[1] "%(num)d ditë" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d orë" -msgstr[1] "%(num)d orë" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutë" -msgstr[1] "%(num)d minuta" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d vjet" -msgstr[1] "%(num)d vjet" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d muaj" -msgstr[1] "%(num)d muaj" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d javë" -msgstr[1] "%(num)d javë" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d ditë" -msgstr[1] "%(num)d ditë" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d orë" -msgstr[1] "%(num)d orë" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutë" -msgstr[1] "%(num)d minuta" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index 4977fb6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index e72dd70..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,359 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Igor Jerosimić, 2021,2023,2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2021,2023,2025\n" -"Language-Team: Serbian (http://app.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Humanize" -msgstr "Улепшавање" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}-ти" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}-ти" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}-и" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}-и" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}-и" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}-и" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}-и" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}-и" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}-и" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}-и" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}-и" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s милион" -msgstr[1] "%(value)s милиона" -msgstr[2] "%(value)s милиона" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s милијарда" -msgstr[1] "%(value)s милијарде" -msgstr[2] "%(value)s милијарди" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s билион" -msgstr[1] "%(value)s билиона" -msgstr[2] "%(value)s билиона" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s билијарда" -msgstr[1] "%(value)s билијарде" -msgstr[2] "%(value)s билијарди" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s трилион" -msgstr[1] "%(value)s трилиона" -msgstr[2] "%(value)s трилиона" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s трилијарда" -msgstr[1] "%(value)s трилијарде" -msgstr[2] "%(value)s трилијарди" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s квадрилион" -msgstr[1] "%(value)s квадрилиона" -msgstr[2] "%(value)s квадрилиона" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s квадрилијарда" -msgstr[1] "%(value)s квадрилијарде" -msgstr[2] "%(value)s квадрилијарди" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s квантилион" -msgstr[1] "%(value)s квантилиона" -msgstr[2] "%(value)s квантилиона" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s квантилијарда" -msgstr[1] "%(value)s квантилијарде" -msgstr[2] "%(value)s квантилијарди" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s гугол" -msgstr[1] "%(value)s гугола" -msgstr[2] "%(value)s гугола" - -msgid "one" -msgstr "један" - -msgid "two" -msgstr "два" - -msgid "three" -msgstr "три" - -msgid "four" -msgstr "четири" - -msgid "five" -msgstr "пет" - -msgid "six" -msgstr "шест" - -msgid "seven" -msgstr "седам" - -msgid "eight" -msgstr "осам" - -msgid "nine" -msgstr "девет" - -msgid "today" -msgstr "данас" - -msgid "tomorrow" -msgstr "сутра" - -msgid "yesterday" -msgstr "јуче" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "пре %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "пре %(count)s сата" -msgstr[1] "пре %(count)s сата" -msgstr[2] "пре %(count)s сати" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "пре %(count)s минута" -msgstr[1] "пре %(count)s минута" -msgstr[2] "пре %(count)s минута" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "пре %(count)s секунде" -msgstr[1] "пре %(count)s секунде" -msgstr[2] "пре %(count)s секунди" - -msgid "now" -msgstr "сада" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s секунда од сад" -msgstr[1] "%(count)s секунде од сада" -msgstr[2] "%(count)s секунди од сада" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s минут од сад" -msgstr[1] "%(count)s минута од сада" -msgstr[2] "%(count)s минута од сада" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s сат од сад" -msgstr[1] "%(count)s сата од сада" -msgstr[2] "%(count)s сати од сада" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s од сад" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d године" -msgstr[2] "%(num)d година" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месец" -msgstr[1] "%(num)d месеца" -msgstr[2] "%(num)d месеци" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d недеља" -msgstr[1] "%(num)d недеље" -msgstr[2] "%(num)d недеља" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d дан" -msgstr[1] "%(num)d дана" -msgstr[2] "%(num)d дана" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d сат" -msgstr[1] "%(num)d сата" -msgstr[2] "%(num)d сати" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минут" -msgstr[1] "%(num)d минута" -msgstr[2] "%(num)d минута" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d године" -msgstr[2] "%(num)d година" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месец" -msgstr[1] "%(num)d месеца" -msgstr[2] "%(num)d месеци" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d недеља" -msgstr[1] "%(num)d недеље" -msgstr[2] "%(num)d недеља" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d дан" -msgstr[1] "%(num)d дана" -msgstr[2] "%(num)d дана" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d сат" -msgstr[1] "%(num)d сата" -msgstr[2] "%(num)d сати" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минут" -msgstr[1] "%(num)d минута" -msgstr[2] "%(num)d минута" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index d4d2867..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index e977ea1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,412 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Igor Jerosimić, 2021,2023-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2021,2023-2025\n" -"Language-Team: Serbian (Latin) (http://app.transifex.com/django/django/language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: contrib/humanize/apps.py:7 -msgid "Humanize" -msgstr "Ulepšavanje" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -#: contrib/humanize/templatetags/humanize.py:35 -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}-ti" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -#: contrib/humanize/templatetags/humanize.py:39 -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}-ti" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -#: contrib/humanize/templatetags/humanize.py:41 -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}-i" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -#: contrib/humanize/templatetags/humanize.py:43 -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}-i" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -#: contrib/humanize/templatetags/humanize.py:45 -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}-i" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -#: contrib/humanize/templatetags/humanize.py:47 -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}-i" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -#: contrib/humanize/templatetags/humanize.py:49 -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}-i" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -#: contrib/humanize/templatetags/humanize.py:51 -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}-i" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -#: contrib/humanize/templatetags/humanize.py:53 -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}-i" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -#: contrib/humanize/templatetags/humanize.py:55 -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}-i" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -#: contrib/humanize/templatetags/humanize.py:57 -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}-i" - -#: contrib/humanize/templatetags/humanize.py:88 -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milion" -msgstr[1] "%(value)s miliona" -msgstr[2] "%(value)s miliona" - -#: contrib/humanize/templatetags/humanize.py:89 -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milijarda" -msgstr[1] "%(value)s milijarde" -msgstr[2] "%(value)s milijardi" - -#: contrib/humanize/templatetags/humanize.py:90 -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s bilion" -msgstr[1] "%(value)s biliona" -msgstr[2] "%(value)s biliona" - -#: contrib/humanize/templatetags/humanize.py:94 -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s bilijarda" -msgstr[1] "%(value)s bilijarde" -msgstr[2] "%(value)s bilijardi" - -#: contrib/humanize/templatetags/humanize.py:100 -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s trilion" -msgstr[1] "%(value)s triliona" -msgstr[2] "%(value)s triliona" - -#: contrib/humanize/templatetags/humanize.py:105 -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s trilijarda" -msgstr[1] "%(value)s trilijarde" -msgstr[2] "%(value)s trilijardi" - -#: contrib/humanize/templatetags/humanize.py:109 -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s kvadrilion" -msgstr[1] "%(value)s kvadriliona" -msgstr[2] "%(value)s kvadriliona" - -#: contrib/humanize/templatetags/humanize.py:111 -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kvadrilijarda" -msgstr[1] "%(value)s kvadrilijarde" -msgstr[2] "%(value)s kvadrilijardi" - -#: contrib/humanize/templatetags/humanize.py:112 -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kvantilion" -msgstr[1] "%(value)s kvantiliona" -msgstr[2] "%(value)s kvantiliona" - -#: contrib/humanize/templatetags/humanize.py:113 -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kvantilijarda" -msgstr[1] "%(value)s kvantilijarde" -msgstr[2] "%(value)s kvantilijardi" - -#: contrib/humanize/templatetags/humanize.py:114 -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s gugol" -msgstr[1] "%(value)s gugola" -msgstr[2] "%(value)s gugola" - -#: contrib/humanize/templatetags/humanize.py:158 -msgid "one" -msgstr "jedan" - -#: contrib/humanize/templatetags/humanize.py:159 -msgid "two" -msgstr "dva" - -#: contrib/humanize/templatetags/humanize.py:160 -msgid "three" -msgstr "tri" - -#: contrib/humanize/templatetags/humanize.py:161 -msgid "four" -msgstr "četiri" - -#: contrib/humanize/templatetags/humanize.py:162 -msgid "five" -msgstr "pet" - -#: contrib/humanize/templatetags/humanize.py:163 -msgid "six" -msgstr "šest" - -#: contrib/humanize/templatetags/humanize.py:164 -msgid "seven" -msgstr "sedam" - -#: contrib/humanize/templatetags/humanize.py:165 -msgid "eight" -msgstr "osam" - -#: contrib/humanize/templatetags/humanize.py:166 -msgid "nine" -msgstr "devet" - -#: contrib/humanize/templatetags/humanize.py:188 -msgid "today" -msgstr "danas" - -#: contrib/humanize/templatetags/humanize.py:190 -msgid "tomorrow" -msgstr "sutra" - -#: contrib/humanize/templatetags/humanize.py:192 -msgid "yesterday" -msgstr "juče" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#: contrib/humanize/templatetags/humanize.py:210 -#, python-format -msgid "%(delta)s ago" -msgstr "pre %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:213 -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "pre sat" -msgstr[1] "pre %(count)s sata" -msgstr[2] "pre %(count)s sati" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:216 -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "pre minut" -msgstr[1] "pre %(count)s minuta" -msgstr[2] "pre %(count)s minuta" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:219 -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "pre sekund" -msgstr[1] "pre %(count)s sekunde" -msgstr[2] "pre %(count)s sekundi" - -#: contrib/humanize/templatetags/humanize.py:220 -msgid "now" -msgstr "sada" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:224 -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "sekund od sad" -msgstr[1] "%(count)s sekunde od sada" -msgstr[2] "%(count)s sekundi od sada" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:229 -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "minut od sad" -msgstr[1] "%(count)s minuta od sada" -msgstr[2] "%(count)s minuta od sada" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#: contrib/humanize/templatetags/humanize.py:234 -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "sat od sad" -msgstr[1] "%(count)s sata od sada" -msgstr[2] "%(count)s sati od sada" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#: contrib/humanize/templatetags/humanize.py:237 -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s od sad" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#: contrib/humanize/templatetags/humanize.py:242 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d godina" -msgstr[1] "%(num)d godine" -msgstr[2] "%(num)d godina" - -#: contrib/humanize/templatetags/humanize.py:245 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesec" -msgstr[1] "%(num)d meseca" -msgstr[2] "%(num)d meseci" - -#: contrib/humanize/templatetags/humanize.py:248 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nedelja" -msgstr[1] "%(num)d nedelje" -msgstr[2] "%(num)d nedelja" - -#: contrib/humanize/templatetags/humanize.py:250 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dan" -msgstr[1] "%(num)d dana" -msgstr[2] "%(num)d dana" - -#: contrib/humanize/templatetags/humanize.py:252 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d sat" -msgstr[1] "%(num)d sata" -msgstr[2] "%(num)d sati" - -#: contrib/humanize/templatetags/humanize.py:255 -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuta" -msgstr[2] "%(num)d minuta" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#: contrib/humanize/templatetags/humanize.py:262 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d godina" -msgstr[1] "%(num)d godine" -msgstr[2] "%(num)d godina" - -#: contrib/humanize/templatetags/humanize.py:265 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesec" -msgstr[1] "%(num)d meseca" -msgstr[2] "%(num)d meseci" - -#: contrib/humanize/templatetags/humanize.py:268 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nedelja" -msgstr[1] "%(num)d nedelje" -msgstr[2] "%(num)d nedelja" - -#: contrib/humanize/templatetags/humanize.py:271 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dan" -msgstr[1] "%(num)d dana" -msgstr[2] "%(num)d dana" - -#: contrib/humanize/templatetags/humanize.py:274 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d sat" -msgstr[1] "%(num)d sata" -msgstr[2] "%(num)d sati" - -#: contrib/humanize/templatetags/humanize.py:277 -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuta" -msgstr[2] "%(num)d minuta" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index a670a62..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index eda2164..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,335 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Albin Larsson , 2022 -# Andreas Pelme , 2011-2012,2014 -# Elias Johnstone , 2022 -# Jannis Leidel , 2011 -# Johan Rohdin, 2021 -# Jonathan Lindén, 2014 -# Petter Strandmark , 2019 -# Rasmus Précenth , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2022-07-24 18:40+0000\n" -"Last-Translator: Elias Johnstone \n" -"Language-Team: Swedish (http://www.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Humanisera" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}:e" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}:e" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}:a" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}:a" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}:e" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}:e" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}:e" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}:e" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}:e" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}:e" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}:e" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s miljon" -msgstr[1] "%(value)s miljoner" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s miljard" -msgstr[1] "%(value)s miljarder" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s triljon" -msgstr[1] "%(value)s triljoner" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s biljard" -msgstr[1] "%(value)s biljarder" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kvintiljon" -msgstr[1] "%(value)s kvintiljoner" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s triljard" -msgstr[1] "%(value)s triljarder" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s kvadriljon" -msgstr[1] "%(value)s kvadriljoner" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s kvadriljard" -msgstr[1] "%(value)s kvadriljarder" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s kvintiljon" -msgstr[1] "%(value)s kvintiljoner" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s kvintiljard" -msgstr[1] "%(value)s kvintiljarder" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googoler" - -msgid "one" -msgstr "ett" - -msgid "two" -msgstr "två" - -msgid "three" -msgstr "tre" - -msgid "four" -msgstr "fyra" - -msgid "five" -msgstr "fem" - -msgid "six" -msgstr "sex" - -msgid "seven" -msgstr "sju" - -msgid "eight" -msgstr "åtta" - -msgid "nine" -msgstr "nio" - -msgid "today" -msgstr "i dag" - -msgid "tomorrow" -msgstr "i morgon" - -msgid "yesterday" -msgstr "i går" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s sedan" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "en timme sedan" -msgstr[1] "%(count)s timmar sedan" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "en minut sedan" -msgstr[1] "%(count)s minuter sedan" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "en sekund sedan" -msgstr[1] "%(count)s sekunder sedan" - -msgid "now" -msgstr "nu" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "en sekund från nu" -msgstr[1] "om %(count)s sekunder" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "en minut från nu" -msgstr[1] "om %(count)s minuter" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "en timme från nu" -msgstr[1] "om %(count)s timmar" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "om %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d månad" -msgstr[1] "%(num)d månader" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d vecka" -msgstr[1] "%(num)d veckor" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagar" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d timme" -msgstr[1] "%(num)d timmar" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuter" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d månad" -msgstr[1] "%(num)d månader" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d vecka" -msgstr[1] "%(num)d veckor" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagar" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d timme" -msgstr[1] "%(num)d timmar" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuter" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sw/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index c0b7891..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sw/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index 5852ab3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,262 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Machaku , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Weka kibinadamu" - -msgid "th" -msgstr " " - -msgid "st" -msgstr " " - -msgid "nd" -msgstr " " - -msgid "rd" -msgstr " " - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "milioni %(value).1f" -msgstr[1] "milioni %(value).1f" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "milioni %(value)s" -msgstr[1] "milioni %(value)s" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "bilioni %(value).1f" -msgstr[1] "bilioni %(value).1f" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "bilioni %(value)s" -msgstr[1] "bilioni %(value)s" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "trilioni %(value).1f" -msgstr[1] "trilioni %(value).1f" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "trilioni %(value)s" -msgstr[1] "trilioni %(value)s" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "kuadrilioni %(value).1f" -msgstr[1] "kuadrilioni %(value).1f" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "kuadrilioni %(value)s" -msgstr[1] "kuadrilioni %(value)s" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "kuintilioni %(value).1f" -msgstr[1] "kuintilioni %(value).1f" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "kuintilioni %(value)s" -msgstr[1] "kuintilioni %(value)s" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "seksitilioni %(value).1f" -msgstr[1] "seksitilioni %(value).1f" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "seksitilioni %(value)s" -msgstr[1] "seksitilioni %(value)s" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "septilioni %(value).1f" -msgstr[1] "septilioni %(value).1f" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "septilioni %(value)s" -msgstr[1] "septilioni %(value)s" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f oktilioni" -msgstr[1] "%(value).1f oktilioni" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "oktilioni %(value)s" -msgstr[1] "oktilioni %(value)s" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "nonilioni %(value).1f" -msgstr[1] "nonilioni %(value).1f" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "nonilioni %(value)s" -msgstr[1] "nonilioni %(value)s" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "desilioni %(value).1f" -msgstr[1] "desilioni %(value).1f" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "desilioni %(value)s" -msgstr[1] "desilioni %(value)s" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "gogoli %(value).1f" -msgstr[1] "gogoli %(value).1f" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "gogoli %(value)s" -msgstr[1] "gogoli %(value)s" - -msgid "one" -msgstr "moja" - -msgid "two" -msgstr "mbili" - -msgid "three" -msgstr "tatu" - -msgid "four" -msgstr "nne" - -msgid "five" -msgstr "tano" - -msgid "six" -msgstr "sita" - -msgid "seven" -msgstr "saba" - -msgid "eight" -msgstr "nane" - -msgid "nine" -msgstr "tisa" - -msgid "today" -msgstr "leo" - -msgid "tomorrow" -msgstr "kesho" - -msgid "yesterday" -msgstr "jana" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "%(delta)s zilizopita" - -msgid "now" -msgstr "sasa" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "Sekunde iliyopita" -msgstr[1] "Sekunde %(count)s zilizopita" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "Dakika iliyopita" -msgstr[1] "Dakika %(count)s zilizopita" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "Saa lililopita" -msgstr[1] "Masaa %(count)s yaliyopita" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s kutoka sasa" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "Sekunde moja kutoka sasa" -msgstr[1] "Sekunde %(count)s kutoka sasa" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "Dakika moja kutoka sasa" -msgstr[1] "Dakika %(count)s kutoka sasa" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "Saa limoja kutoka sasa " -msgstr[1] "Masaa %(count)s kutoka sasa" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ta/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index 77e9f9b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ta/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index 36a253d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,261 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/projects/p/django/language/" -"ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "" - -msgid "st" -msgstr "" - -msgid "nd" -msgstr "" - -msgid "rd" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "" - -msgid "two" -msgstr "" - -msgid "three" -msgstr "" - -msgid "four" -msgstr "" - -msgid "five" -msgstr "" - -msgid "six" -msgstr "" - -msgid "seven" -msgstr "" - -msgid "eight" -msgstr "" - -msgid "nine" -msgstr "" - -msgid "today" -msgstr "" - -msgid "tomorrow" -msgstr "" - -msgid "yesterday" -msgstr "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/te/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index e7439a3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/te/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index ad1ccdb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,262 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# bhaskar teja yerneni , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "వ" - -msgid "st" -msgstr "వ" - -msgid "nd" -msgstr "వ" - -msgid "rd" -msgstr "వ" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "ఒక్కటి" - -msgid "two" -msgstr "రెండు" - -msgid "three" -msgstr "మూడు" - -msgid "four" -msgstr "నాలుగు" - -msgid "five" -msgstr "ఐదు" - -msgid "six" -msgstr "ఆరు" - -msgid "seven" -msgstr "ఏడు" - -msgid "eight" -msgstr "ఎనిమిది " - -msgid "nine" -msgstr "తొమ్మిది" - -msgid "today" -msgstr "ఈ రోజు" - -msgid "tomorrow" -msgstr "రెపు" - -msgid "yesterday" -msgstr "నిన్న" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "%(delta)s క్రితము" - -msgid "now" -msgstr "ఇప్పుడు " - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "ఇప్పటినుండి %(delta)s కు" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index 76b769b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index de792ea..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,393 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2020-05-15 00:31+0000\n" -"Last-Translator: Surush Sufiew \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Ба шакли оммафаҳм овардани қимат" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}-ум" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}-ум" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}-ум" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}-ум" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}-ум" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}-ум" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}-ум" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}-ум" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}-ум" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}-ум" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}-ум" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "як" - -msgid "two" -msgstr "ду" - -msgid "three" -msgstr "се" - -msgid "four" -msgstr "чор" - -msgid "five" -msgstr "панҷ" - -msgid "six" -msgstr "шаш" - -msgid "seven" -msgstr "ҳафт" - -msgid "eight" -msgstr "ҳашт" - -msgid "nine" -msgstr "нуҳ" - -msgid "today" -msgstr "имрӯз" - -msgid "tomorrow" -msgstr "пагоҳ" - -msgid "yesterday" -msgstr "дирӯз" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s пеш" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -msgid "now" -msgstr "ҳозир" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "баъд аз %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/th/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index 6c11ee0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/th/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index e713265..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,357 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2012,2018 -# Perry Roper , 2017 -# sipp11 , 2014 -# Vichai Vongvorakul , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2018-05-18 01:38+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "ทำเป็นภาษามนุษย์" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f หนึ่งล้าน" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s ล้าน" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f สิบล้าน" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s พันล้าน" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f ร้อยล้าน" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] " %(value)s ล้านล้าน" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f quadrillion" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s quadrillion" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f quintillion" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s quintillion" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f sextillion" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sextillion" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f septillion" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septillion" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f octillion" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s octillion" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f nonillion" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonillion" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f decillion" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s decillion" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f googol" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" - -msgid "one" -msgstr "หนึ่ง" - -msgid "two" -msgstr "สอง" - -msgid "three" -msgstr "สาม" - -msgid "four" -msgstr "สี่" - -msgid "five" -msgstr "ห้า" - -msgid "six" -msgstr "หก" - -msgid "seven" -msgstr "เจ็ด" - -msgid "eight" -msgstr "แปด" - -msgid "nine" -msgstr "เก้า" - -msgid "today" -msgstr "วันนี้" - -msgid "tomorrow" -msgstr "พรุ่งนี้" - -msgid "yesterday" -msgstr "เมื่อวานนี้" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s ชั่วโมงที่ผ่านมา" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s นาทีที่ผ่านมา" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s วินาทีที่ผ่านมา" - -msgid "now" -msgstr "ขณะนี้" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s วินาทีต่อจากนี้" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s นาทีต่อจากนี้" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s ชั่วโมงต่อจากนี้" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index 5df0030..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index 7901342..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,328 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Resul , 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2023-04-24 18:40+0000\n" -"Last-Translator: Resul , 2022\n" -"Language-Team: Turkmen (http://www.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "Düşnüklileşdir" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}-nji" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}-nji" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}-inji" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}-nji" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}-nji" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}-nji" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}-nji" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}-njy" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}-nji" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}-nji" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}-njy" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s million" -msgstr[1] "%(value)s million" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milliard" -msgstr[1] "%(value)s milliard" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trillion" -msgstr[1] "%(value)s trillion" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s kwadrillion" -msgstr[1] "%(value)s kwadrillion" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kwintillion" -msgstr[1] "%(value)s kwintillion" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s sekstillion" -msgstr[1] "%(value)s sekstillion" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septillion" -msgstr[1] "%(value)s septillion" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktillion" -msgstr[1] "%(value)s oktillion" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonillion" -msgstr[1] "%(value)s nonillion" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s desillion" -msgstr[1] "%(value)s desillion" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" - -msgid "one" -msgstr "bir" - -msgid "two" -msgstr "iki" - -msgid "three" -msgstr "üç" - -msgid "four" -msgstr "dört" - -msgid "five" -msgstr "bäş" - -msgid "six" -msgstr "alty" - -msgid "seven" -msgstr "ýedi" - -msgid "eight" -msgstr "sekiz" - -msgid "nine" -msgstr "dokuz" - -msgid "today" -msgstr "şu gün" - -msgid "tomorrow" -msgstr "ertir" - -msgid "yesterday" -msgstr "düýn" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s öň" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "bir sagat öň" -msgstr[1] "%(count)s sagat öň" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "bir minut öň" -msgstr[1] "%(count)s minut öň" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "bir sekunt öň" -msgstr[1] "%(count)s sekunt öň" - -msgid "now" -msgstr "şu wagt" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "şu wagtdan bir sekunt soň" -msgstr[1] "şu wagtdan %(count)s sekunt soň" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "şu wagtdan bir minut soň" -msgstr[1] "şu wagtdan %(count)s minut soň" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "şu wagtdan bir sagat soň" -msgstr[1] "şu wagtdan  %(count)s sagat soň" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "şu wagtdan %(delta)s soň" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ýyl" -msgstr[1] "%(num)d ýyl" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d aý" -msgstr[1] "%(num)d aý" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hepde" -msgstr[1] "%(num)d hepde" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d sagat" -msgstr[1] "%(num)d sagat" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minut" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ýyl" -msgstr[1] "%(num)d ýyl" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d aý" -msgstr[1] "%(num)d aý" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hepde" -msgstr[1] "%(num)d hepde" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d sagat" -msgstr[1] "%(num)d sagat" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minut" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index 348e992..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index ef2b605..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,333 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ahmet Emre Aladağ , 2013 -# BouRock, 2018,2021 -# BouRock, 2014 -# Jannis Leidel , 2011 -# Metin Amiroff , 2012 -# Murat Sahin , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-09-22 17:36+0000\n" -"Last-Translator: BouRock\n" -"Language-Team: Turkish (http://www.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Humanize" -msgstr "İnsansı" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}." - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}." - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s milyon" -msgstr[1] "%(value)s milyon" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s milyar" -msgstr[1] "%(value)s milyar" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s trilyon" -msgstr[1] "%(value)s trilyon" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s katrilyon" -msgstr[1] "%(value)s katrilyon" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s kentilyon" -msgstr[1] "%(value)s kentilyon" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s seksilyon" -msgstr[1] "%(value)s seksilyon" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s septilyon" -msgstr[1] "%(value)s septilyon" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s oktilyon" -msgstr[1] "%(value)s oktilyon" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nonilyon" -msgstr[1] "%(value)s nonilyon" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s desilyon" -msgstr[1] "%(value)s desilyon" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s googol" -msgstr[1] "%(value)s googol" - -msgid "one" -msgstr "bir" - -msgid "two" -msgstr "iki" - -msgid "three" -msgstr "üç" - -msgid "four" -msgstr "dört" - -msgid "five" -msgstr "beş" - -msgid "six" -msgstr "altı" - -msgid "seven" -msgstr "yedi" - -msgid "eight" -msgstr "sekiz" - -msgid "nine" -msgstr "dokuz" - -msgid "today" -msgstr "bugün" - -msgid "tomorrow" -msgstr "yarın" - -msgid "yesterday" -msgstr "dün" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s önce" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "bir saat önce" -msgstr[1] "%(count)s saat önce" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "bir dakika önce" -msgstr[1] "%(count)s dakika önce" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "bir saniye önce" -msgstr[1] "%(count)s saniye önce" - -msgid "now" -msgstr "şimdi" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "şu andan itibaren bir saniye" -msgstr[1] "şu andan itibaren %(count)s saniye" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "şu andan itibaren bir dakika" -msgstr[1] "şu andan itibaren %(count)s dakika" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "şu andan itibaren bir saat" -msgstr[1] "şu andan itibaren %(count)s saat" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "şu andan itibaren %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d yıl" -msgstr[1] "%(num)d yıl" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ay" -msgstr[1] "%(num)d ay" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hafta" -msgstr[1] "%(num)d hafta" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d saat" -msgstr[1] "%(num)d saat" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d dakika" -msgstr[1] "%(num)d dakika" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d yıl" -msgstr[1] "%(num)d yıl" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ay" -msgstr[1] "%(num)d ay" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hafta" -msgstr[1] "%(num)d hafta" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d saat" -msgstr[1] "%(num)d saat" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d dakika" -msgstr[1] "%(num)d dakika" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index 98df56f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index 96c72ad..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,233 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "че" - -msgid "st" -msgstr "че" - -msgid "nd" -msgstr "че" - -msgid "rd" -msgstr "че" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f миллион" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s миллион" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f миллиард" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s миллиард" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f триллион" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s триллион" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f квадриллион" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s квадриллион" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f квинтиллион" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s квинтиллион" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f секстиллион" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s секстиллион" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f септиллион" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s септиллион" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f октиллион" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s октиллион" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f нониллион" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s нониллион" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f дециллион" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s дециллион" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f дециллион" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s гугол" - -msgid "one" -msgstr "бер" - -msgid "two" -msgstr "ике" - -msgid "three" -msgstr "өч" - -msgid "four" -msgstr "дүрт" - -msgid "five" -msgstr "биш" - -msgid "six" -msgstr "алты" - -msgid "seven" -msgstr "җиде" - -msgid "eight" -msgstr "сигез" - -msgid "nine" -msgstr "тугыз" - -msgid "today" -msgstr "бүген" - -msgid "tomorrow" -msgstr "иртәгә" - -msgid "yesterday" -msgstr "кичә" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "%(delta)s элек" - -msgid "now" -msgstr "хәзер" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "хәзердән %(delta)s" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index af7ab53..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index 3508cf8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,233 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "" - -msgid "st" -msgstr "" - -msgid "nd" -msgstr "" - -msgid "rd" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" - -msgid "one" -msgstr "" - -msgid "two" -msgstr "" - -msgid "three" -msgstr "" - -msgid "four" -msgstr "" - -msgid "five" -msgstr "" - -msgid "six" -msgstr "" - -msgid "seven" -msgstr "" - -msgid "eight" -msgstr "" - -msgid "nine" -msgstr "" - -msgid "today" -msgstr "" - -msgid "tomorrow" -msgstr "" - -msgid "yesterday" -msgstr "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ug/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index 1cc8dd1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ug/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index 3216ca1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,328 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abduqadir Abliz , 2023 -# Azat, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:40+0000\n" -"Last-Translator: Azat, 2023\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "ئىنسانلاشتۇرۇش" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}جى" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}جى" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}جى" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}جى" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}جى" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}جى" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}جى" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}جى" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}جى" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}جى" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}جى" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s مىليون" -msgstr[1] "%(value)s مىليون" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s مىليارد" -msgstr[1] "%(value)s مىليارد" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s تىرىليون" -msgstr[1] "%(value)s تىرىليون" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s كۋادىرىللىيۇن" -msgstr[1] "%(value)s كۋادىرىللىيۇن" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s كۈيىنتىللىيون" -msgstr[1] "%(value)s كۈيىنتىللىيون" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s سېكستىللىيون" -msgstr[1] "%(value)s سېكستىللىيون" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s سېكستىللىيون" -msgstr[1] "%(value)s سېكستىللىيون" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s ئوكتىلىيون" -msgstr[1] "%(value)s ئوكتىلىيون" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s نونىللىيون" -msgstr[1] "%(value)s نونىللىيون" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s دېكىللىيون" -msgstr[1] "%(value)s دېكىللىيون" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s گۇگول " -msgstr[1] "%(value)s گۇگول" - -msgid "one" -msgstr "بىر" - -msgid "two" -msgstr "ئىككى" - -msgid "three" -msgstr "ئۈچ" - -msgid "four" -msgstr "تۆت" - -msgid "five" -msgstr "بەش" - -msgid "six" -msgstr "ئالتە" - -msgid "seven" -msgstr "يەتتە" - -msgid "eight" -msgstr "سەككىز" - -msgid "nine" -msgstr "توققۇز" - -msgid "today" -msgstr "بۈگۈن" - -msgid "tomorrow" -msgstr "ئەتە" - -msgid "yesterday" -msgstr "تۈنۈگۈن" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s ئىلگىرى" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "1 سائەت ئىلگىرى" -msgstr[1] "%(count)s سائەت ئىلگىرى" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "1 مىنۇت ئىلگىرى" -msgstr[1] "%(count)s مىنۇت ئىلگىرى" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "1 سېكۇنت ئىلگىرى" -msgstr[1] "%(count)s سېكۇنت ئىلگىرى" - -msgid "now" -msgstr "ھازىر" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "1 سېكۇنتتىن كېيىن" -msgstr[1] "%(count)s سېكۇنتتىن كېيىن" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "1 مىنۇتتىن كېيىن" -msgstr[1] "%(count)s مىنۇتتىن كېيىن" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "1 سائەتتىن كېيىن" -msgstr[1] "%(count)s سائەتتىن كېيىن" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s دىن كېيىن" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d يىل" -msgstr[1] "%(num)d يىل" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ئاي" -msgstr[1] "%(num)d ئاي" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d ھەپتە" -msgstr[1] "%(num)d ھەپتە" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d كۈن" -msgstr[1] "%(num)d كۈن" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d سائەت" -msgstr[1] "%(num)d سائەت" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d مىنۇت" -msgstr[1] "%(num)d مىنۇت" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d يىل" -msgstr[1] "%(num)d يىل" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ئاي" -msgstr[1] "%(num)d ئاي" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d ھەپتە" -msgstr[1] "%(num)d ھەپتە" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d كۈن" -msgstr[1] "%(num)d كۈن" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d سائەت" -msgstr[1] "%(num)d سائەت" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d مىنۇت" -msgstr[1] "%(num)d مىنۇت" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index 1662778..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index d4c86fd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,395 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Oleksandr Chernihov , 2014 -# Illia Volochii , 2022 -# Kirill Gagarski , 2014 -# Max V. Stotsky , 2014 -# Mykola Zamkovoi , 2014 -# Alex Bolotov , 2013 -# tarasyyyk , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2022-07-24 18:40+0000\n" -"Last-Translator: Illia Volochii \n" -"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -msgid "Humanize" -msgstr "Олюднювати" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "{}ий" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "{}ть" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "{}ий" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "{}ий" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "{}ій" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "{}ий" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "{}ий" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "{}ий" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "{}ий" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "{}ий" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "{}ий" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s мільйон" -msgstr[1] "%(value)s мільйони" -msgstr[2] "%(value)s мільйонів" -msgstr[3] "%(value)s мільйонів" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s мільярд" -msgstr[1] "%(value)s мільярди" -msgstr[2] "%(value)s мільярдів" -msgstr[3] "%(value)s мільярдів" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s трильйон" -msgstr[1] "%(value)s трильйони" -msgstr[2] "%(value)s трильйонів" -msgstr[3] "%(value)s трильйонів" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s квадрильйон" -msgstr[1] "%(value)s квадрильйони" -msgstr[2] "%(value)s квадрильйонів" -msgstr[3] "%(value)s квадрильйонів" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s квінтильйон" -msgstr[1] "%(value)s квінтильйони" -msgstr[2] "%(value)s квінтильйонів" -msgstr[3] "%(value)s квінтильйонів" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s секстильйон" -msgstr[1] "%(value)s секстильйони" -msgstr[2] "%(value)s секстильйонів" -msgstr[3] "%(value)s секстильйонів" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s септильйон" -msgstr[1] "%(value)s септильйони" -msgstr[2] "%(value)s септильйонів" -msgstr[3] "%(value)s септильйонів" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s октильйон" -msgstr[1] "%(value)s октильйони" -msgstr[2] "%(value)s октильйонів" -msgstr[3] "%(value)s октильйонів" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s нонільйон" -msgstr[1] "%(value)s нонільйони" -msgstr[2] "%(value)s нонільйонів" -msgstr[3] "%(value)s нонільйонів" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s децильйон" -msgstr[1] "%(value)s децильйони" -msgstr[2] "%(value)s децильйонів" -msgstr[3] "%(value)s децильйонів" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s гугол" -msgstr[1] "%(value)s гуголи" -msgstr[2] "%(value)s гуголів" -msgstr[3] "%(value)s гуголів" - -msgid "one" -msgstr "один" - -msgid "two" -msgstr "два" - -msgid "three" -msgstr "три" - -msgid "four" -msgstr "чотири" - -msgid "five" -msgstr "п'ять" - -msgid "six" -msgstr "шість" - -msgid "seven" -msgstr "сім" - -msgid "eight" -msgstr "вісім" - -msgid "nine" -msgstr "дев'ять" - -msgid "today" -msgstr "сьогодні" - -msgid "tomorrow" -msgstr "завтра" - -msgid "yesterday" -msgstr "вчора" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s тому" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s годину тому" -msgstr[1] "%(count)s години тому" -msgstr[2] "%(count)s годин тому" -msgstr[3] "%(count)s годин тому" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s хвилину тому" -msgstr[1] "%(count)s хвилини тому" -msgstr[2] "%(count)s хвилин тому" -msgstr[3] "%(count)s хвилин тому" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s секунду тому" -msgstr[1] "%(count)s секунди тому" -msgstr[2] "%(count)s секунд тому" -msgstr[3] "%(count)s секунд тому" - -msgid "now" -msgstr "зараз" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s секунда від цього часу" -msgstr[1] "%(count)s секунди від цього часу" -msgstr[2] "%(count)s секунд від цього часу" -msgstr[3] "%(count)s секунд від цього часу" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s хвилина від цього часу" -msgstr[1] "%(count)s хвилини від цього часу" -msgstr[2] "%(count)s хвилин від цього часу" -msgstr[3] "%(count)s хвилин від цього часу" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s година від цього часу" -msgstr[1] "%(count)s години від цього часу" -msgstr[2] "%(count)s годин від цього часу" -msgstr[3] "%(count)s годин від цього часу" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "через %(delta)s" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d рік" -msgstr[1] "%(num)d роки" -msgstr[2] "%(num)d років" -msgstr[3] "%(num)d років" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d місяць" -msgstr[1] "%(num)d місяці" -msgstr[2] "%(num)d місяців" -msgstr[3] "%(num)d місяців" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d тиждень" -msgstr[1] "%(num)d тижні" -msgstr[2] "%(num)d тижнів" -msgstr[3] "%(num)d тижнів" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d день" -msgstr[1] "%(num)d дні" -msgstr[2] "%(num)d днів" -msgstr[3] "%(num)d днів" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d години" -msgstr[2] "%(num)d годин" -msgstr[3] "%(num)d годин" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d хвилина" -msgstr[1] "%(num)d хвилини" -msgstr[2] "%(num)d хвилин" -msgstr[3] "%(num)d хвилин" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d рік" -msgstr[1] "%(num)d роки" -msgstr[2] "%(num)d років" -msgstr[3] "%(num)d років" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d місяць" -msgstr[1] "%(num)d місяці" -msgstr[2] "%(num)d місяців" -msgstr[3] "%(num)d місяців" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d тиждень" -msgstr[1] "%(num)d тижні" -msgstr[2] "%(num)d тижнів" -msgstr[3] "%(num)d тижнів" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d день" -msgstr[1] "%(num)d дні" -msgstr[2] "%(num)d днів" -msgstr[3] "%(num)d днів" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d години" -msgstr[2] "%(num)d годин" -msgstr[3] "%(num)d годин" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d хвилина" -msgstr[1] "%(num)d хвилини" -msgstr[2] "%(num)d хвилин" -msgstr[3] "%(num)d хвилин" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ur/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index 078d2e9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ur/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index 2e889dd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,261 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "واں" - -msgid "st" -msgstr "پہلا" - -msgid "nd" -msgstr "دوسرا" - -msgid "rd" -msgstr "تیسرا" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f ملین" -msgstr[1] "%(value).1f ملین" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f بلین" -msgstr[1] "%(value).1f بلین" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f ٹریلین" -msgstr[1] "%(value).1f ٹریلین" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" -msgstr[1] "" - -msgid "one" -msgstr "ایک" - -msgid "two" -msgstr "دو" - -msgid "three" -msgstr "تین" - -msgid "four" -msgstr "چار" - -msgid "five" -msgstr "پانچ" - -msgid "six" -msgstr "چھ" - -msgid "seven" -msgstr "سات" - -msgid "eight" -msgstr "آتھ" - -msgid "nine" -msgstr "نو" - -msgid "today" -msgstr "آج" - -msgid "tomorrow" -msgstr "آئندہ کل" - -msgid "yesterday" -msgstr "گزستہ کل" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "" - -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" -msgstr[1] "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" -msgstr[1] "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uz/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uz/LC_MESSAGES/django.mo deleted file mode 100644 index 179f657..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uz/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uz/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uz/LC_MESSAGES/django.po deleted file mode 100644 index b85d5b8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/uz/LC_MESSAGES/django.po +++ /dev/null @@ -1,353 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# A'zam Mamatmurodov , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-11-13 09:18+0000\n" -"Last-Translator: A'zam Mamatmurodov \n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "" - -msgid "one" -msgstr "bir" - -msgid "two" -msgstr "ikki" - -msgid "three" -msgstr "uch" - -msgid "four" -msgstr "to'rt" - -msgid "five" -msgstr "besh" - -msgid "six" -msgstr "olti" - -msgid "seven" -msgstr "yetti" - -msgid "eight" -msgstr "sakkiz" - -msgid "nine" -msgstr "to'qqiz" - -msgid "today" -msgstr "o'n" - -msgid "tomorrow" -msgstr "ertaga" - -msgid "yesterday" -msgstr "kecha" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s oldin" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s soat oldin" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s daqiqa oldin" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s soniya oldin" - -msgid "now" -msgstr "hozir" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d yil" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d oy" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d hafta" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d kun" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d soat" - -#, python-format -msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d daqiqa" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d yil" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d oy" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d hafta" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d kun" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d soat" - -#, python-format -msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d daqiqa" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/vi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index 7c0b900..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/vi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index 4b7cd6e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,235 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# xgenvn , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Tran Van \n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "Humanize" - -msgid "th" -msgstr "th" - -msgid "st" -msgstr "st" - -msgid "nd" -msgstr "nd" - -msgid "rd" -msgstr "rd" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f triệu" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s triệu" - -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f tỷ" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s tỷ" - -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f nghìn tỷ" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s nghìn tỷ" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f triệu tỷ" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s triệu tỷ" - -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f tỷ tỷ" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s tỷ tỷ" - -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f nghìn tỷ tỷ" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s nghỉn tỷ tỷ" - -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f triệu tỷ tỷ" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s triệu tỷ tỷ" - -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f tỷ tỷ tỷ" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s tỷ tỷ tỷ" - -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f nghìn tỷ tỷ tỷ" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s nghỉn tỷ tỷ tỷ" - -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f triệu tỷ tỷ tỷ" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s triệu tỷ tỷ tỷ" - -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f tỷ tỷ tỷ tỷ" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s tỷ tỷ tỷ tỷ" - -msgid "one" -msgstr "Một" - -msgid "two" -msgstr "Hai" - -msgid "three" -msgstr "Ba" - -msgid "four" -msgstr "Bốn" - -msgid "five" -msgstr "Năm" - -msgid "six" -msgstr "Sáu" - -msgid "seven" -msgstr "Bảy" - -msgid "eight" -msgstr "Tám" - -msgid "nine" -msgstr "Chín" - -msgid "today" -msgstr "Hôm nay" - -msgid "tomorrow" -msgstr "Ngày mai" - -msgid "yesterday" -msgstr "Hôm qua" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s ago" -msgstr "cách đây %(delta)s" - -msgid "now" -msgstr "vừa mới đây" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s giây trước" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s phút trước" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s giờ trước" - -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "%(delta)s sau" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s giây sau" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s phút sau" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s giờ sau" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index e0e6617..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index abbb1b0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,308 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# lanbla , 2021 -# Jannis Leidel , 2011 -# Jenny Qian , 2018 -# Lele Long , 2015 -# Ronald White , 2014 -# Suntravel Chris , 2019 -# wang zhao <672565116@qq.com>, 2018 -# Xiang Yu , 2014 -# ced773123cfad7b4e8b79ca80f736af9, 2011 -# Kevin Sze , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-07 14:40+0200\n" -"PO-Revision-Date: 2021-11-22 03:16+0000\n" -"Last-Translator: lanbla \n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "人性化" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "第{}" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s 百万" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s 十亿" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s 万亿" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s 1000的5次方" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s 1000的4次方" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s 1000的7次方" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s 1000的8次方" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s 1000的9次方" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s 1000的10次方" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s 1000的11次方" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s 10的100次方" - -msgid "one" -msgstr "一" - -msgid "two" -msgstr "二" - -msgid "three" -msgstr "三" - -msgid "four" -msgstr "四" - -msgid "five" -msgstr "五" - -msgid "six" -msgstr "六" - -msgid "seven" -msgstr "七" - -msgid "eight" -msgstr "八" - -msgid "nine" -msgstr "九" - -msgid "today" -msgstr "今天" - -msgid "tomorrow" -msgstr "明天" - -msgid "yesterday" -msgstr "昨天" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s前" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s小时之前" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s分钟之前" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s秒之前" - -msgid "now" -msgstr "现在" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s秒以后" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s分钟以后" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s小时以后" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s之后" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d 年" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d 月" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d 周" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d 日" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d 小时" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d 分钟" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d 年" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d 月" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d 周" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d 日" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d 小时" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d 分钟" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index 418fa78..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index f6edb94..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,304 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chen Chun-Chia , 2015 -# yubike, 2024 -# Jannis Leidel , 2011 -# tcc , 2011 -# Tzu-ping Chung , 2016,2019 -# Yeh-Yung , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-08-07 18:40+0000\n" -"Last-Translator: yubike, 2024\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Humanize" -msgstr "人性化" - -#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). -msgctxt "ordinal 11, 12, 13" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 0, e.g. 80th. -msgctxt "ordinal 0" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. -msgctxt "ordinal 1" -msgid "{}st" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. -msgctxt "ordinal 2" -msgid "{}nd" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. -msgctxt "ordinal 3" -msgid "{}rd" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 4, e.g. 84th. -msgctxt "ordinal 4" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 5, e.g. 85th. -msgctxt "ordinal 5" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 6, e.g. 86th. -msgctxt "ordinal 6" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 7, e.g. 87th. -msgctxt "ordinal 7" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 8, e.g. 88th. -msgctxt "ordinal 8" -msgid "{}th" -msgstr "第{}" - -#. Translators: Ordinal format when value ends with 9, e.g. 89th. -msgctxt "ordinal 9" -msgid "{}th" -msgstr "第{}" - -#, python-format -msgid "%(value)s million" -msgid_plural "%(value)s million" -msgstr[0] "%(value)s 百萬" - -#, python-format -msgid "%(value)s billion" -msgid_plural "%(value)s billion" -msgstr[0] "%(value)s 十億" - -#, python-format -msgid "%(value)s trillion" -msgid_plural "%(value)s trillion" -msgstr[0] "%(value)s 兆" - -#, python-format -msgid "%(value)s quadrillion" -msgid_plural "%(value)s quadrillion" -msgstr[0] "%(value)s 千兆" - -#, python-format -msgid "%(value)s quintillion" -msgid_plural "%(value)s quintillion" -msgstr[0] "%(value)s 百京" - -#, python-format -msgid "%(value)s sextillion" -msgid_plural "%(value)s sextillion" -msgstr[0] "%(value)s 十垓" - -#, python-format -msgid "%(value)s septillion" -msgid_plural "%(value)s septillion" -msgstr[0] "%(value)s 秭" - -#, python-format -msgid "%(value)s octillion" -msgid_plural "%(value)s octillion" -msgstr[0] "%(value)s 千秭" - -#, python-format -msgid "%(value)s nonillion" -msgid_plural "%(value)s nonillion" -msgstr[0] "%(value)s 百穰" - -#, python-format -msgid "%(value)s decillion" -msgid_plural "%(value)s decillion" -msgstr[0] "%(value)s 十溝" - -#, python-format -msgid "%(value)s googol" -msgid_plural "%(value)s googol" -msgstr[0] "%(value)s 穰大數" - -msgid "one" -msgstr "一" - -msgid "two" -msgstr "二" - -msgid "three" -msgstr "三" - -msgid "four" -msgstr "四" - -msgid "five" -msgstr "五" - -msgid "six" -msgstr "六" - -msgid "seven" -msgstr "七" - -msgid "eight" -msgstr "八" - -msgid "nine" -msgstr "九" - -msgid "today" -msgstr "今天" - -msgid "tomorrow" -msgstr "明天" - -msgid "yesterday" -msgstr "昨天" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s ago" -msgstr "%(delta)s前" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" -msgstr[0] "%(count)s 小時前" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute ago" -msgid_plural "%(count)s minutes ago" -msgstr[0] "%(count)s 分鐘前" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" -msgstr[0] "%(count)s 秒前" - -msgid "now" -msgstr "現在" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a second from now" -msgid_plural "%(count)s seconds from now" -msgstr[0] "%(count)s 秒後" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "a minute from now" -msgid_plural "%(count)s minutes from now" -msgstr[0] "%(count)s 分鐘後" - -#. Translators: please keep a non-breaking space (U+00A0) between count -#. and time unit. -#, python-format -msgid "an hour from now" -msgid_plural "%(count)s hours from now" -msgstr[0] "%(count)s 小時後" - -#. Translators: delta will contain a string like '2 months' or '1 month, 2 -#. weeks' -#, python-format -msgid "%(delta)s from now" -msgstr "%(delta)s後" - -#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d 年" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d 月" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d 週" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d 日" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d 小時" - -#, python-format -msgctxt "naturaltime-past" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d 分" - -#. Translators: 'naturaltime-future' strings will be included in '%(delta)s -#. from now' -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d 年" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d 月" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d 週" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d 日" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d 小時" - -#, python-format -msgctxt "naturaltime-future" -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d 分" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/templatetags/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/humanize/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/humanize/templatetags/humanize.py b/.venv/lib/python3.10/site-packages/django/contrib/humanize/templatetags/humanize.py deleted file mode 100644 index 2e3f133..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/humanize/templatetags/humanize.py +++ /dev/null @@ -1,336 +0,0 @@ -import re -from datetime import date, datetime, timezone -from decimal import Decimal - -from django import template -from django.template import defaultfilters -from django.utils.formats import number_format -from django.utils.safestring import mark_safe -from django.utils.timezone import is_aware -from django.utils.translation import gettext as _ -from django.utils.translation import ( - gettext_lazy, - ngettext, - ngettext_lazy, - npgettext_lazy, - pgettext, - round_away_from_one, -) - -register = template.Library() - - -@register.filter(is_safe=True) -def ordinal(value): - """ - Convert an integer to its ordinal as a string. 1 is '1st', 2 is '2nd', - 3 is '3rd', etc. Works for any non-negative integer. - """ - try: - value = int(value) - except (TypeError, ValueError): - return value - if value < 0: - return str(value) - if value % 100 in (11, 12, 13): - # Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). - value = pgettext("ordinal 11, 12, 13", "{}th").format(value) - else: - templates = ( - # Translators: Ordinal format when value ends with 0, e.g. 80th. - pgettext("ordinal 0", "{}th"), - # Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. - pgettext("ordinal 1", "{}st"), - # Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. - pgettext("ordinal 2", "{}nd"), - # Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. - pgettext("ordinal 3", "{}rd"), - # Translators: Ordinal format when value ends with 4, e.g. 84th. - pgettext("ordinal 4", "{}th"), - # Translators: Ordinal format when value ends with 5, e.g. 85th. - pgettext("ordinal 5", "{}th"), - # Translators: Ordinal format when value ends with 6, e.g. 86th. - pgettext("ordinal 6", "{}th"), - # Translators: Ordinal format when value ends with 7, e.g. 87th. - pgettext("ordinal 7", "{}th"), - # Translators: Ordinal format when value ends with 8, e.g. 88th. - pgettext("ordinal 8", "{}th"), - # Translators: Ordinal format when value ends with 9, e.g. 89th. - pgettext("ordinal 9", "{}th"), - ) - value = templates[value % 10].format(value) - # Mark value safe so i18n does not break with or see #19988 - return mark_safe(value) - - -@register.filter(is_safe=True) -def intcomma(value, use_l10n=True): - """ - Convert an integer to a string containing commas every three digits. - For example, 3000 becomes '3,000' and 45000 becomes '45,000'. - """ - if use_l10n: - try: - if not isinstance(value, (float, Decimal)): - value = int(value) - except (TypeError, ValueError): - return intcomma(value, False) - else: - return number_format(value, use_l10n=True, force_grouping=True) - result = str(value) - match = re.match(r"-?\d+", result) - if match: - prefix = match[0] - prefix_with_commas = re.sub(r"\d{3}", r"\g<0>,", prefix[::-1])[::-1] - # Remove a leading comma, if needed. - prefix_with_commas = re.sub(r"^(-?),", r"\1", prefix_with_commas) - result = prefix_with_commas + result[len(prefix) :] - return result - - -# A tuple of standard large number to their converters -intword_converters = ( - (6, lambda number: ngettext("%(value)s million", "%(value)s million", number)), - (9, lambda number: ngettext("%(value)s billion", "%(value)s billion", number)), - (12, lambda number: ngettext("%(value)s trillion", "%(value)s trillion", number)), - ( - 15, - lambda number: ngettext( - "%(value)s quadrillion", "%(value)s quadrillion", number - ), - ), - ( - 18, - lambda number: ngettext( - "%(value)s quintillion", "%(value)s quintillion", number - ), - ), - ( - 21, - lambda number: ngettext("%(value)s sextillion", "%(value)s sextillion", number), - ), - ( - 24, - lambda number: ngettext("%(value)s septillion", "%(value)s septillion", number), - ), - (27, lambda number: ngettext("%(value)s octillion", "%(value)s octillion", number)), - (30, lambda number: ngettext("%(value)s nonillion", "%(value)s nonillion", number)), - (33, lambda number: ngettext("%(value)s decillion", "%(value)s decillion", number)), - (100, lambda number: ngettext("%(value)s googol", "%(value)s googol", number)), -) - - -@register.filter(is_safe=False) -def intword(value): - """ - Convert a large integer to a friendly text representation. Works best - for numbers over 1 million. For example, 1000000 becomes '1.0 million', - 1200000 becomes '1.2 million' and '1200000000' becomes '1.2 billion'. - """ - try: - value = int(value) - except (TypeError, ValueError): - return value - - abs_value = abs(value) - if abs_value < 1000000: - return value - - for exponent, converter in intword_converters: - large_number = 10**exponent - if abs_value < large_number * 1000: - new_value = value / large_number - rounded_value = round_away_from_one(new_value) - return converter(abs(rounded_value)) % { - "value": defaultfilters.floatformat(new_value, 1), - } - return value - - -@register.filter(is_safe=True) -def apnumber(value): - """ - For numbers 1-9, return the number spelled out. Otherwise, return the - number. This follows Associated Press style. - """ - try: - value = int(value) - except (TypeError, ValueError): - return value - if not 0 < value < 10: - return value - return ( - _("one"), - _("two"), - _("three"), - _("four"), - _("five"), - _("six"), - _("seven"), - _("eight"), - _("nine"), - )[value - 1] - - -# Perform the comparison in the default time zone when USE_TZ = True -# (unless a specific time zone has been applied with the |timezone filter). -@register.filter(expects_localtime=True) -def naturalday(value, arg=None): - """ - For date values that are tomorrow, today or yesterday compared to - present day return representing string. Otherwise, return a string - formatted according to settings.DATE_FORMAT. - """ - tzinfo = getattr(value, "tzinfo", None) - try: - value = date(value.year, value.month, value.day) - except AttributeError: - # Passed value wasn't a date object - return value - today = datetime.now(tzinfo).date() - delta = value - today - if delta.days == 0: - return _("today") - elif delta.days == 1: - return _("tomorrow") - elif delta.days == -1: - return _("yesterday") - return defaultfilters.date(value, arg) - - -# This filter doesn't require expects_localtime=True because it deals properly -# with both naive and aware datetimes. Therefore avoid the cost of conversion. -@register.filter -def naturaltime(value): - """ - For date and time values show how many seconds, minutes, or hours ago - compared to current timestamp return representing string. - """ - return NaturalTimeFormatter.string_for(value) - - -class NaturalTimeFormatter: - time_strings = { - # Translators: delta will contain a string like '2 months' or '1 month, 2 weeks' - "past-day": gettext_lazy("%(delta)s ago"), - # Translators: please keep a non-breaking space (U+00A0) between count - # and time unit. - "past-hour": ngettext_lazy("an hour ago", "%(count)s hours ago", "count"), - # Translators: please keep a non-breaking space (U+00A0) between count - # and time unit. - "past-minute": ngettext_lazy("a minute ago", "%(count)s minutes ago", "count"), - # Translators: please keep a non-breaking space (U+00A0) between count - # and time unit. - "past-second": ngettext_lazy("a second ago", "%(count)s seconds ago", "count"), - "now": gettext_lazy("now"), - # fmt: off - # fmt turned off to avoid black splitting the ngettext_lazy calls to multiple - # lines, as this results in gettext missing the 'Translators:' comments. - "future-second": ngettext_lazy( - # Translators: please keep a non-breaking space (U+00A0) between count - # and time unit. - "a second from now", "%(count)s seconds from now", "count" - ), - "future-minute": ngettext_lazy( - # Translators: please keep a non-breaking space (U+00A0) between count - # and time unit. - "a minute from now", "%(count)s minutes from now", "count", - ), - "future-hour": ngettext_lazy( - # Translators: please keep a non-breaking space (U+00A0) between count - # and time unit. - "an hour from now", "%(count)s hours from now", "count", - ), - # fmt: on - # Translators: delta will contain a string like '2 months' or '1 month, 2 weeks' - "future-day": gettext_lazy("%(delta)s from now"), - } - past_substrings = { - # fmt: off - "year": npgettext_lazy( - # Translators: 'naturaltime-past' strings will be included in - # '%(delta)s ago' - "naturaltime-past", "%(num)d year", "%(num)d years", "num", - ), - # fmt:on - "month": npgettext_lazy( - "naturaltime-past", "%(num)d month", "%(num)d months", "num" - ), - "week": npgettext_lazy( - "naturaltime-past", "%(num)d week", "%(num)d weeks", "num" - ), - "day": npgettext_lazy("naturaltime-past", "%(num)d day", "%(num)d days", "num"), - "hour": npgettext_lazy( - "naturaltime-past", "%(num)d hour", "%(num)d hours", "num" - ), - "minute": npgettext_lazy( - "naturaltime-past", "%(num)d minute", "%(num)d minutes", "num" - ), - } - future_substrings = { - # fmt: off - "year": npgettext_lazy( - # Translators: 'naturaltime-future' strings will be included in - # '%(delta)s from now'. - "naturaltime-future", "%(num)d year", "%(num)d years", "num", - ), - # fmt: on - "month": npgettext_lazy( - "naturaltime-future", "%(num)d month", "%(num)d months", "num" - ), - "week": npgettext_lazy( - "naturaltime-future", "%(num)d week", "%(num)d weeks", "num" - ), - "day": npgettext_lazy( - "naturaltime-future", "%(num)d day", "%(num)d days", "num" - ), - "hour": npgettext_lazy( - "naturaltime-future", "%(num)d hour", "%(num)d hours", "num" - ), - "minute": npgettext_lazy( - "naturaltime-future", "%(num)d minute", "%(num)d minutes", "num" - ), - } - - @classmethod - def string_for(cls, value): - if not isinstance(value, date): # datetime is a subclass of date - return value - - now = datetime.now(timezone.utc if is_aware(value) else None) - if value < now: - delta = now - value - if delta.days != 0: - return cls.time_strings["past-day"] % { - "delta": defaultfilters.timesince( - value, now, time_strings=cls.past_substrings - ), - } - elif delta.seconds == 0: - return cls.time_strings["now"] - elif delta.seconds < 60: - return cls.time_strings["past-second"] % {"count": delta.seconds} - elif delta.seconds // 60 < 60: - count = delta.seconds // 60 - return cls.time_strings["past-minute"] % {"count": count} - else: - count = delta.seconds // 60 // 60 - return cls.time_strings["past-hour"] % {"count": count} - else: - delta = value - now - if delta.days != 0: - return cls.time_strings["future-day"] % { - "delta": defaultfilters.timeuntil( - value, now, time_strings=cls.future_substrings - ), - } - elif delta.seconds == 0: - return cls.time_strings["now"] - elif delta.seconds < 60: - return cls.time_strings["future-second"] % {"count": delta.seconds} - elif delta.seconds // 60 < 60: - count = delta.seconds // 60 - return cls.time_strings["future-minute"] % {"count": count} - else: - count = delta.seconds // 60 // 60 - return cls.time_strings["future-hour"] % {"count": count} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/__init__.py deleted file mode 100644 index 3b62e0b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib.messages.api import * # NOQA -from django.contrib.messages.constants import * # NOQA -from django.contrib.messages.storage.base import Message # NOQA diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/api.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/api.py deleted file mode 100644 index 7a67e8b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/api.py +++ /dev/null @@ -1,127 +0,0 @@ -from django.contrib.messages import constants -from django.contrib.messages.storage import default_storage - -__all__ = ( - "add_message", - "get_messages", - "get_level", - "set_level", - "debug", - "info", - "success", - "warning", - "error", - "MessageFailure", -) - - -class MessageFailure(Exception): - pass - - -def add_message(request, level, message, extra_tags="", fail_silently=False): - """ - Attempt to add a message to the request using the 'messages' app. - """ - try: - messages = request._messages - except AttributeError: - if not hasattr(request, "META"): - raise TypeError( - "add_message() argument must be an HttpRequest object, not " - "'%s'." % request.__class__.__name__ - ) - if not fail_silently: - raise MessageFailure( - "You cannot add messages without installing " - "django.contrib.messages.middleware.MessageMiddleware" - ) - else: - return messages.add(level, message, extra_tags) - - -def get_messages(request): - """ - Return the message storage on the request if it exists, otherwise return - an empty list. - """ - return getattr(request, "_messages", []) - - -def get_level(request): - """ - Return the minimum level of messages to be recorded. - - The default level is the ``MESSAGE_LEVEL`` setting. If this is not found, - use the ``INFO`` level. - """ - storage = getattr(request, "_messages", default_storage(request)) - return storage.level - - -def set_level(request, level): - """ - Set the minimum level of messages to be recorded, and return ``True`` if - the level was recorded successfully. - - If set to ``None``, use the default level (see the get_level() function). - """ - if not hasattr(request, "_messages"): - return False - request._messages.level = level - return True - - -def debug(request, message, extra_tags="", fail_silently=False): - """Add a message with the ``DEBUG`` level.""" - add_message( - request, - constants.DEBUG, - message, - extra_tags=extra_tags, - fail_silently=fail_silently, - ) - - -def info(request, message, extra_tags="", fail_silently=False): - """Add a message with the ``INFO`` level.""" - add_message( - request, - constants.INFO, - message, - extra_tags=extra_tags, - fail_silently=fail_silently, - ) - - -def success(request, message, extra_tags="", fail_silently=False): - """Add a message with the ``SUCCESS`` level.""" - add_message( - request, - constants.SUCCESS, - message, - extra_tags=extra_tags, - fail_silently=fail_silently, - ) - - -def warning(request, message, extra_tags="", fail_silently=False): - """Add a message with the ``WARNING`` level.""" - add_message( - request, - constants.WARNING, - message, - extra_tags=extra_tags, - fail_silently=fail_silently, - ) - - -def error(request, message, extra_tags="", fail_silently=False): - """Add a message with the ``ERROR`` level.""" - add_message( - request, - constants.ERROR, - message, - extra_tags=extra_tags, - fail_silently=fail_silently, - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/apps.py deleted file mode 100644 index 5bda152..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/apps.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.apps import AppConfig -from django.contrib.messages.storage import base -from django.contrib.messages.utils import get_level_tags -from django.core.signals import setting_changed -from django.utils.functional import SimpleLazyObject -from django.utils.translation import gettext_lazy as _ - - -def update_level_tags(setting, **kwargs): - if setting == "MESSAGE_TAGS": - base.LEVEL_TAGS = SimpleLazyObject(get_level_tags) - - -class MessagesConfig(AppConfig): - name = "django.contrib.messages" - verbose_name = _("Messages") - - def ready(self): - setting_changed.connect(update_level_tags) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/constants.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/constants.py deleted file mode 100644 index 92c9242..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/constants.py +++ /dev/null @@ -1,21 +0,0 @@ -DEBUG = 10 -INFO = 20 -SUCCESS = 25 -WARNING = 30 -ERROR = 40 - -DEFAULT_TAGS = { - DEBUG: "debug", - INFO: "info", - SUCCESS: "success", - WARNING: "warning", - ERROR: "error", -} - -DEFAULT_LEVELS = { - "DEBUG": DEBUG, - "INFO": INFO, - "SUCCESS": SUCCESS, - "WARNING": WARNING, - "ERROR": ERROR, -} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/context_processors.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/context_processors.py deleted file mode 100644 index e01cc31..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/context_processors.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.contrib.messages.api import get_messages -from django.contrib.messages.constants import DEFAULT_LEVELS - - -def messages(request): - """ - Return a lazy 'messages' context variable as well as - 'DEFAULT_MESSAGE_LEVELS'. - """ - return { - "messages": get_messages(request), - "DEFAULT_MESSAGE_LEVELS": DEFAULT_LEVELS, - } diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/middleware.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/middleware.py deleted file mode 100644 index 0087031..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/middleware.py +++ /dev/null @@ -1,26 +0,0 @@ -from django.conf import settings -from django.contrib.messages.storage import default_storage -from django.utils.deprecation import MiddlewareMixin - - -class MessageMiddleware(MiddlewareMixin): - """ - Middleware that handles temporary messages. - """ - - def process_request(self, request): - request._messages = default_storage(request) - - def process_response(self, request, response): - """ - Update the storage backend (i.e., save the messages). - - Raise ValueError if not all messages could be stored and DEBUG is True. - """ - # A higher middleware layer may return a request which does not contain - # messages storage, so make no assumption that it will be there. - if hasattr(request, "_messages"): - unstored_messages = request._messages.update(response) - if unstored_messages and settings.DEBUG: - raise ValueError("Not all temporary messages could be stored.") - return response diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/__init__.py deleted file mode 100644 index 373dbba..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.conf import settings -from django.utils.module_loading import import_string - - -def default_storage(request): - """ - Callable with the same interface as the storage classes. - - This isn't just default_storage = import_string(settings.MESSAGE_STORAGE) - to avoid accessing the settings at the module level. - """ - return import_string(settings.MESSAGE_STORAGE)(request) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/base.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/base.py deleted file mode 100644 index 5d89acf..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/base.py +++ /dev/null @@ -1,183 +0,0 @@ -from django.conf import settings -from django.contrib.messages import constants, utils -from django.utils.functional import SimpleLazyObject - -LEVEL_TAGS = SimpleLazyObject(utils.get_level_tags) - - -class Message: - """ - Represent an actual message that can be stored in any of the supported - storage classes (typically session- or cookie-based) and rendered in a view - or template. - """ - - def __init__(self, level, message, extra_tags=None): - self.level = int(level) - self.message = message - self.extra_tags = extra_tags - - def _prepare(self): - """ - Prepare the message for serialization by forcing the ``message`` - and ``extra_tags`` to str in case they are lazy translations. - """ - self.message = str(self.message) - self.extra_tags = str(self.extra_tags) if self.extra_tags is not None else None - - def __eq__(self, other): - if not isinstance(other, Message): - return NotImplemented - return self.level == other.level and self.message == other.message - - def __str__(self): - return str(self.message) - - def __repr__(self): - extra_tags = f", extra_tags={self.extra_tags!r}" if self.extra_tags else "" - return f"Message(level={self.level}, message={self.message!r}{extra_tags})" - - @property - def tags(self): - return " ".join(tag for tag in [self.extra_tags, self.level_tag] if tag) - - @property - def level_tag(self): - return LEVEL_TAGS.get(self.level, "") - - -class BaseStorage: - """ - This is the base backend for temporary message storage. - - This is not a complete class; to be a usable storage backend, it must be - subclassed and the two methods ``_get`` and ``_store`` overridden. - """ - - def __init__(self, request, *args, **kwargs): - self.request = request - self._queued_messages = [] - self.used = False - self.added_new = False - super().__init__(*args, **kwargs) - - def __len__(self): - return len(self._loaded_messages) + len(self._queued_messages) - - def __iter__(self): - self.used = True - if self._queued_messages: - self._loaded_messages.extend(self._queued_messages) - self._queued_messages = [] - return iter(self._loaded_messages) - - def __contains__(self, item): - return item in self._loaded_messages or item in self._queued_messages - - def __repr__(self): - return f"<{self.__class__.__qualname__}: request={self.request!r}>" - - @property - def _loaded_messages(self): - """ - Return a list of loaded messages, retrieving them first if they have - not been loaded yet. - """ - if not hasattr(self, "_loaded_data"): - messages, all_retrieved = self._get() - self._loaded_data = messages or [] - return self._loaded_data - - def _get(self, *args, **kwargs): - """ - Retrieve a list of stored messages. Return a tuple of the messages - and a flag indicating whether or not all the messages originally - intended to be stored in this storage were, in fact, stored and - retrieved; e.g., ``(messages, all_retrieved)``. - - **This method must be implemented by a subclass.** - - If it is possible to tell if the backend was not used (as opposed to - just containing no messages) then ``None`` should be returned in - place of ``messages``. - """ - raise NotImplementedError( - "subclasses of BaseStorage must provide a _get() method" - ) - - def _store(self, messages, response, *args, **kwargs): - """ - Store a list of messages and return a list of any messages which could - not be stored. - - One type of object must be able to be stored, ``Message``. - - **This method must be implemented by a subclass.** - """ - raise NotImplementedError( - "subclasses of BaseStorage must provide a _store() method" - ) - - def _prepare_messages(self, messages): - """ - Prepare a list of messages for storage. - """ - for message in messages: - message._prepare() - - def update(self, response): - """ - Store all unread messages. - - If the backend has yet to be iterated, store previously stored messages - again. Otherwise, only store messages added after the last iteration. - """ - self._prepare_messages(self._queued_messages) - if self.used: - return self._store(self._queued_messages, response) - elif self.added_new: - messages = self._loaded_messages + self._queued_messages - return self._store(messages, response) - - def add(self, level, message, extra_tags=""): - """ - Queue a message to be stored. - - The message is only queued if it contained something and its level is - not less than the recording level (``self.level``). - """ - if not message: - return - # Check that the message level is not less than the recording level. - level = int(level) - if level < self.level: - return - # Add the message. - self.added_new = True - message = Message(level, message, extra_tags=extra_tags) - self._queued_messages.append(message) - - def _get_level(self): - """ - Return the minimum recorded level. - - The default level is the ``MESSAGE_LEVEL`` setting. If this is - not found, the ``INFO`` level is used. - """ - if not hasattr(self, "_level"): - self._level = getattr(settings, "MESSAGE_LEVEL", constants.INFO) - return self._level - - def _set_level(self, value=None): - """ - Set a custom minimum recorded level. - - If set to ``None``, the default level will be used (see the - ``_get_level`` method). - """ - if value is None and hasattr(self, "_level"): - del self._level - else: - self._level = int(value) - - level = property(_get_level, _set_level, _set_level) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/cookie.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/cookie.py deleted file mode 100644 index 2008b31..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/cookie.py +++ /dev/null @@ -1,248 +0,0 @@ -import binascii -import json - -from django.conf import settings -from django.contrib.messages.storage.base import BaseStorage, Message -from django.core import signing -from django.http import SimpleCookie -from django.utils.safestring import SafeData, mark_safe - - -class MessageEncoder(json.JSONEncoder): - """ - Compactly serialize instances of the ``Message`` class as JSON. - """ - - message_key = "__json_message" - - def default(self, obj): - if isinstance(obj, Message): - # Using 0/1 here instead of False/True to produce more compact json - is_safedata = 1 if isinstance(obj.message, SafeData) else 0 - message = [self.message_key, is_safedata, obj.level, obj.message] - if obj.extra_tags is not None: - message.append(obj.extra_tags) - return message - return super().default(obj) - - -class MessageDecoder(json.JSONDecoder): - """ - Decode JSON that includes serialized ``Message`` instances. - """ - - def process_messages(self, obj): - if isinstance(obj, list) and obj: - if obj[0] == MessageEncoder.message_key: - if obj[1]: - obj[3] = mark_safe(obj[3]) - return Message(*obj[2:]) - return [self.process_messages(item) for item in obj] - if isinstance(obj, dict): - return {key: self.process_messages(value) for key, value in obj.items()} - return obj - - def decode(self, s, **kwargs): - decoded = super().decode(s, **kwargs) - return self.process_messages(decoded) - - -class MessagePartSerializer: - def dumps(self, obj): - return [ - json.dumps( - o, - separators=(",", ":"), - cls=MessageEncoder, - ) - for o in obj - ] - - -class MessagePartGatherSerializer: - def dumps(self, obj): - """ - The parameter is an already serialized list of Message objects. No need - to serialize it again, only join the list together and encode it. - """ - return ("[" + ",".join(obj) + "]").encode("latin-1") - - -class MessageSerializer: - def loads(self, data): - return json.loads(data.decode("latin-1"), cls=MessageDecoder) - - -class CookieStorage(BaseStorage): - """ - Store messages in a cookie. - """ - - cookie_name = "messages" - # uwsgi's default configuration enforces a maximum size of 4kb for all the - # HTTP headers. In order to leave some room for other cookies and headers, - # restrict the session cookie to 1/2 of 4kb. See #18781. - max_cookie_size = 2048 - not_finished = "__messagesnotfinished__" - not_finished_json = json.dumps("__messagesnotfinished__") - key_salt = "django.contrib.messages" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.signer = signing.get_cookie_signer(salt=self.key_salt) - - def _get(self, *args, **kwargs): - """ - Retrieve a list of messages from the messages cookie. If the - not_finished sentinel value is found at the end of the message list, - remove it and return a result indicating that not all messages were - retrieved by this storage. - """ - data = self.request.COOKIES.get(self.cookie_name) - messages = self._decode(data) - all_retrieved = not (messages and messages[-1] == self.not_finished) - if messages and not all_retrieved: - # remove the sentinel value - messages.pop() - return messages, all_retrieved - - def _update_cookie(self, encoded_data, response): - """ - Either set the cookie with the encoded data if there is any data to - store, or delete the cookie. - """ - if encoded_data: - response.set_cookie( - self.cookie_name, - encoded_data, - domain=settings.SESSION_COOKIE_DOMAIN, - secure=settings.SESSION_COOKIE_SECURE or None, - httponly=settings.SESSION_COOKIE_HTTPONLY or None, - samesite=settings.SESSION_COOKIE_SAMESITE, - ) - else: - response.delete_cookie( - self.cookie_name, - domain=settings.SESSION_COOKIE_DOMAIN, - samesite=settings.SESSION_COOKIE_SAMESITE, - ) - - def _store(self, messages, response, remove_oldest=True, *args, **kwargs): - """ - Store the messages to a cookie and return a list of any messages which - could not be stored. - - If the encoded data is larger than ``max_cookie_size``, remove - messages until the data fits (these are the messages which are - returned), and add the not_finished sentinel value to indicate as much. - """ - unstored_messages = [] - serialized_messages = MessagePartSerializer().dumps(messages) - encoded_data = self._encode_parts(serialized_messages) - if self.max_cookie_size: - # data is going to be stored eventually by SimpleCookie, which - # adds its own overhead, which we must account for. - cookie = SimpleCookie() # create outside the loop - - def is_too_large_for_cookie(data): - return data and len(cookie.value_encode(data)[1]) > self.max_cookie_size - - def compute_msg(some_serialized_msg): - return self._encode_parts( - some_serialized_msg + [self.not_finished_json], - encode_empty=True, - ) - - if is_too_large_for_cookie(encoded_data): - if remove_oldest: - idx = bisect_keep_right( - serialized_messages, - fn=lambda m: is_too_large_for_cookie(compute_msg(m)), - ) - unstored_messages = messages[:idx] - encoded_data = compute_msg(serialized_messages[idx:]) - else: - idx = bisect_keep_left( - serialized_messages, - fn=lambda m: is_too_large_for_cookie(compute_msg(m)), - ) - unstored_messages = messages[idx:] - encoded_data = compute_msg(serialized_messages[:idx]) - - self._update_cookie(encoded_data, response) - return unstored_messages - - def _encode_parts(self, messages, encode_empty=False): - """ - Return an encoded version of the serialized messages list which can be - stored as plain text. - - Since the data will be retrieved from the client-side, the encoded data - also contains a hash to ensure that the data was not tampered with. - """ - if messages or encode_empty: - return self.signer.sign_object( - messages, serializer=MessagePartGatherSerializer, compress=True - ) - - def _encode(self, messages, encode_empty=False): - """ - Return an encoded version of the messages list which can be stored as - plain text. - - Proxies MessagePartSerializer.dumps and _encoded_parts. - """ - serialized_messages = MessagePartSerializer().dumps(messages) - return self._encode_parts(serialized_messages, encode_empty=encode_empty) - - def _decode(self, data): - """ - Safely decode an encoded text stream back into a list of messages. - - If the encoded text stream contained an invalid hash or was in an - invalid format, return None. - """ - if not data: - return None - try: - return self.signer.unsign_object(data, serializer=MessageSerializer) - except (signing.BadSignature, binascii.Error, json.JSONDecodeError): - pass - # Mark the data as used (so it gets removed) since something was wrong - # with the data. - self.used = True - return None - - -def bisect_keep_left(a, fn): - """ - Find the index of the first element from the start of the array that - verifies the given condition. - The function is applied from the start of the array to the pivot. - """ - lo = 0 - hi = len(a) - while lo < hi: - mid = (lo + hi) // 2 - if fn(a[: mid + 1]): - hi = mid - else: - lo = mid + 1 - return lo - - -def bisect_keep_right(a, fn): - """ - Find the index of the first element from the end of the array that verifies - the given condition. - The function is applied from the pivot to the end of array. - """ - lo = 0 - hi = len(a) - while lo < hi: - mid = (lo + hi) // 2 - if fn(a[mid:]): - lo = mid + 1 - else: - hi = mid - return lo diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/fallback.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/fallback.py deleted file mode 100644 index 44e26fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/fallback.py +++ /dev/null @@ -1,56 +0,0 @@ -from django.contrib.messages.storage.base import BaseStorage -from django.contrib.messages.storage.cookie import CookieStorage -from django.contrib.messages.storage.session import SessionStorage - - -class FallbackStorage(BaseStorage): - """ - Try to store all messages in the first backend. Store any unstored - messages in each subsequent backend. - """ - - storage_classes = (CookieStorage, SessionStorage) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.storages = [ - storage_class(*args, **kwargs) for storage_class in self.storage_classes - ] - self._used_storages = set() - - def _get(self, *args, **kwargs): - """ - Get a single list of messages from all storage backends. - """ - all_messages = [] - for storage in self.storages: - messages, all_retrieved = storage._get() - # If the backend hasn't been used, no more retrieval is necessary. - if messages is None: - break - if messages: - self._used_storages.add(storage) - all_messages.extend(messages) - # If this storage class contained all the messages, no further - # retrieval is necessary - if all_retrieved: - break - return all_messages, all_retrieved - - def _store(self, messages, response, *args, **kwargs): - """ - Store the messages and return any unstored messages after trying all - backends. - - For each storage backend, any messages not stored are passed on to the - next backend. - """ - for storage in self.storages: - if messages: - messages = storage._store(messages, response, remove_oldest=False) - # Even if there are no more messages, continue iterating to ensure - # storages which contained messages are flushed. - elif storage in self._used_storages: - storage._store([], response) - self._used_storages.remove(storage) - return messages diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/session.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/session.py deleted file mode 100644 index 3271c92..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/storage/session.py +++ /dev/null @@ -1,52 +0,0 @@ -import json - -from django.contrib.messages.storage.base import BaseStorage -from django.contrib.messages.storage.cookie import MessageDecoder, MessageEncoder -from django.core.exceptions import ImproperlyConfigured - - -class SessionStorage(BaseStorage): - """ - Store messages in the session (that is, django.contrib.sessions). - """ - - session_key = "_messages" - - def __init__(self, request, *args, **kwargs): - if not hasattr(request, "session"): - raise ImproperlyConfigured( - "The session-based temporary message storage requires session " - "middleware to be installed, and come before the message " - "middleware in the MIDDLEWARE list." - ) - super().__init__(request, *args, **kwargs) - - def _get(self, *args, **kwargs): - """ - Retrieve a list of messages from the request's session. This storage - always stores everything it is given, so return True for the - all_retrieved flag. - """ - return ( - self.deserialize_messages(self.request.session.get(self.session_key)), - True, - ) - - def _store(self, messages, response, *args, **kwargs): - """ - Store a list of messages to the request's session. - """ - if messages: - self.request.session[self.session_key] = self.serialize_messages(messages) - else: - self.request.session.pop(self.session_key, None) - return [] - - def serialize_messages(self, messages): - encoder = MessageEncoder() - return encoder.encode(messages) - - def deserialize_messages(self, data): - if data and isinstance(data, str): - return json.loads(data, cls=MessageDecoder) - return data diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/test.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/test.py deleted file mode 100644 index 9f3e1bf..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/test.py +++ /dev/null @@ -1,11 +0,0 @@ -from .api import get_messages - -# Make unittest ignore frames in this module when reporting failures. -__unittest = True - - -class MessagesTestMixin: - def assertMessages(self, response, expected_messages, *, ordered=True): - request_messages = list(get_messages(response.wsgi_request)) - assertion = self.assertEqual if ordered else self.assertCountEqual - assertion(request_messages, expected_messages) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/utils.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/utils.py deleted file mode 100644 index 0dd8873..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/utils.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.conf import settings -from django.contrib.messages import constants - - -def get_level_tags(): - """ - Return the message level tags. - """ - return { - **constants.DEFAULT_TAGS, - **getattr(settings, "MESSAGE_TAGS", {}), - } diff --git a/.venv/lib/python3.10/site-packages/django/contrib/messages/views.py b/.venv/lib/python3.10/site-packages/django/contrib/messages/views.py deleted file mode 100644 index 38dee9b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/messages/views.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.contrib import messages - - -class SuccessMessageMixin: - """ - Add a success message on successful form submission. - """ - - success_message = "" - - def form_valid(self, form): - response = super().form_valid(form) - success_message = self.get_success_message(form.cleaned_data) - if success_message: - messages.success(self.request, success_message) - return response - - def get_success_message(self, cleaned_data): - return self.success_message % cleaned_data diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/__init__.py deleted file mode 100644 index 4bfbd52..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .general import * # NOQA -from .statistics import * # NOQA diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/general.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/general.py deleted file mode 100644 index 48968b5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/general.py +++ /dev/null @@ -1,65 +0,0 @@ -from django.contrib.postgres.fields import ArrayField -from django.db.models import Aggregate, BooleanField, JSONField, TextField, Value - -from .mixins import OrderableAggMixin - -__all__ = [ - "ArrayAgg", - "BitAnd", - "BitOr", - "BitXor", - "BoolAnd", - "BoolOr", - "JSONBAgg", - "StringAgg", -] - - -class ArrayAgg(OrderableAggMixin, Aggregate): - function = "ARRAY_AGG" - template = "%(function)s(%(distinct)s%(expressions)s %(order_by)s)" - allow_distinct = True - - @property - def output_field(self): - return ArrayField(self.source_expressions[0].output_field) - - -class BitAnd(Aggregate): - function = "BIT_AND" - - -class BitOr(Aggregate): - function = "BIT_OR" - - -class BitXor(Aggregate): - function = "BIT_XOR" - - -class BoolAnd(Aggregate): - function = "BOOL_AND" - output_field = BooleanField() - - -class BoolOr(Aggregate): - function = "BOOL_OR" - output_field = BooleanField() - - -class JSONBAgg(OrderableAggMixin, Aggregate): - function = "JSONB_AGG" - template = "%(function)s(%(distinct)s%(expressions)s %(order_by)s)" - allow_distinct = True - output_field = JSONField() - - -class StringAgg(OrderableAggMixin, Aggregate): - function = "STRING_AGG" - template = "%(function)s(%(distinct)s%(expressions)s %(order_by)s)" - allow_distinct = True - output_field = TextField() - - def __init__(self, expression, delimiter, **extra): - delimiter_expr = Value(str(delimiter)) - super().__init__(expression, delimiter_expr, **extra) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/mixins.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/mixins.py deleted file mode 100644 index 6af43a7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/mixins.py +++ /dev/null @@ -1,62 +0,0 @@ -import warnings - -from django.core.exceptions import FullResultSet -from django.db.models.expressions import OrderByList -from django.utils.deprecation import RemovedInDjango61Warning - - -class OrderableAggMixin: - # RemovedInDjango61Warning: When the deprecation ends, replace with: - # def __init__(self, *expressions, order_by=(), **extra): - def __init__(self, *expressions, ordering=(), order_by=(), **extra): - # RemovedInDjango61Warning. - if ordering: - warnings.warn( - "The ordering argument is deprecated. Use order_by instead.", - category=RemovedInDjango61Warning, - stacklevel=2, - ) - if order_by: - raise TypeError("Cannot specify both order_by and ordering.") - order_by = ordering - if not order_by: - self.order_by = None - elif isinstance(order_by, (list, tuple)): - self.order_by = OrderByList(*order_by) - else: - self.order_by = OrderByList(order_by) - super().__init__(*expressions, **extra) - - def resolve_expression(self, *args, **kwargs): - if self.order_by is not None: - self.order_by = self.order_by.resolve_expression(*args, **kwargs) - return super().resolve_expression(*args, **kwargs) - - def get_source_expressions(self): - return super().get_source_expressions() + [self.order_by] - - def set_source_expressions(self, exprs): - *exprs, self.order_by = exprs - return super().set_source_expressions(exprs) - - def as_sql(self, compiler, connection): - *source_exprs, filtering_expr, order_by_expr = self.get_source_expressions() - - order_by_sql = "" - order_by_params = [] - if order_by_expr is not None: - order_by_sql, order_by_params = compiler.compile(order_by_expr) - - filter_params = [] - if filtering_expr is not None: - try: - _, filter_params = compiler.compile(filtering_expr) - except FullResultSet: - pass - - source_params = [] - for source_expr in source_exprs: - source_params += compiler.compile(source_expr)[1] - - sql, _ = super().as_sql(compiler, connection, order_by=order_by_sql) - return sql, (*source_params, *order_by_params, *filter_params) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/statistics.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/statistics.py deleted file mode 100644 index 3dc442b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/aggregates/statistics.py +++ /dev/null @@ -1,75 +0,0 @@ -from django.db.models import Aggregate, FloatField, IntegerField - -__all__ = [ - "CovarPop", - "Corr", - "RegrAvgX", - "RegrAvgY", - "RegrCount", - "RegrIntercept", - "RegrR2", - "RegrSlope", - "RegrSXX", - "RegrSXY", - "RegrSYY", - "StatAggregate", -] - - -class StatAggregate(Aggregate): - output_field = FloatField() - - def __init__(self, y, x, output_field=None, filter=None, default=None): - if not x or not y: - raise ValueError("Both y and x must be provided.") - super().__init__( - y, x, output_field=output_field, filter=filter, default=default - ) - - -class Corr(StatAggregate): - function = "CORR" - - -class CovarPop(StatAggregate): - def __init__(self, y, x, sample=False, filter=None, default=None): - self.function = "COVAR_SAMP" if sample else "COVAR_POP" - super().__init__(y, x, filter=filter, default=default) - - -class RegrAvgX(StatAggregate): - function = "REGR_AVGX" - - -class RegrAvgY(StatAggregate): - function = "REGR_AVGY" - - -class RegrCount(StatAggregate): - function = "REGR_COUNT" - output_field = IntegerField() - empty_result_set_value = 0 - - -class RegrIntercept(StatAggregate): - function = "REGR_INTERCEPT" - - -class RegrR2(StatAggregate): - function = "REGR_R2" - - -class RegrSlope(StatAggregate): - function = "REGR_SLOPE" - - -class RegrSXX(StatAggregate): - function = "REGR_SXX" - - -class RegrSXY(StatAggregate): - function = "REGR_SXY" - - -class RegrSYY(StatAggregate): - function = "REGR_SYY" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/apps.py deleted file mode 100644 index a8ee3fb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/apps.py +++ /dev/null @@ -1,84 +0,0 @@ -from django.apps import AppConfig -from django.core.signals import setting_changed -from django.db import connections -from django.db.backends.postgresql.psycopg_any import RANGE_TYPES -from django.db.backends.signals import connection_created -from django.db.migrations.writer import MigrationWriter -from django.db.models import CharField, OrderBy, TextField -from django.db.models.functions import Collate -from django.db.models.indexes import IndexExpression -from django.utils.translation import gettext_lazy as _ - -from .indexes import OpClass -from .lookups import ( - SearchLookup, - TrigramSimilar, - TrigramStrictWordSimilar, - TrigramWordSimilar, - Unaccent, -) -from .serializers import RangeSerializer -from .signals import register_type_handlers - - -def uninstall_if_needed(setting, value, enter, **kwargs): - """ - Undo the effects of PostgresConfig.ready() when django.contrib.postgres - is "uninstalled" by override_settings(). - """ - if ( - not enter - and setting == "INSTALLED_APPS" - and "django.contrib.postgres" not in set(value) - ): - connection_created.disconnect(register_type_handlers) - CharField._unregister_lookup(Unaccent) - TextField._unregister_lookup(Unaccent) - CharField._unregister_lookup(SearchLookup) - TextField._unregister_lookup(SearchLookup) - CharField._unregister_lookup(TrigramSimilar) - TextField._unregister_lookup(TrigramSimilar) - CharField._unregister_lookup(TrigramWordSimilar) - TextField._unregister_lookup(TrigramWordSimilar) - CharField._unregister_lookup(TrigramStrictWordSimilar) - TextField._unregister_lookup(TrigramStrictWordSimilar) - # Disconnect this receiver until the next time this app is installed - # and ready() connects it again to prevent unnecessary processing on - # each setting change. - setting_changed.disconnect(uninstall_if_needed) - MigrationWriter.unregister_serializer(RANGE_TYPES) - - -class PostgresConfig(AppConfig): - name = "django.contrib.postgres" - verbose_name = _("PostgreSQL extensions") - - def ready(self): - setting_changed.connect(uninstall_if_needed) - # Connections may already exist before we are called. - for conn in connections.all(initialized_only=True): - if conn.vendor == "postgresql": - conn.introspection.data_types_reverse.update( - { - 3904: "django.contrib.postgres.fields.IntegerRangeField", - 3906: "django.contrib.postgres.fields.DecimalRangeField", - 3910: "django.contrib.postgres.fields.DateTimeRangeField", - 3912: "django.contrib.postgres.fields.DateRangeField", - 3926: "django.contrib.postgres.fields.BigIntegerRangeField", - } - ) - if conn.connection is not None: - register_type_handlers(conn) - connection_created.connect(register_type_handlers) - CharField.register_lookup(Unaccent) - TextField.register_lookup(Unaccent) - CharField.register_lookup(SearchLookup) - TextField.register_lookup(SearchLookup) - CharField.register_lookup(TrigramSimilar) - TextField.register_lookup(TrigramSimilar) - CharField.register_lookup(TrigramWordSimilar) - TextField.register_lookup(TrigramWordSimilar) - CharField.register_lookup(TrigramStrictWordSimilar) - TextField.register_lookup(TrigramStrictWordSimilar) - MigrationWriter.register_serializer(RANGE_TYPES, RangeSerializer) - IndexExpression.register_wrappers(OrderBy, OpClass, Collate) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/constraints.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/constraints.py deleted file mode 100644 index 2eae101..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/constraints.py +++ /dev/null @@ -1,214 +0,0 @@ -from types import NoneType - -from django.core.exceptions import ValidationError -from django.db import DEFAULT_DB_ALIAS -from django.db.backends.ddl_references import Expressions, Statement, Table -from django.db.models import BaseConstraint, Deferrable, F, Q -from django.db.models.expressions import Exists, ExpressionList -from django.db.models.indexes import IndexExpression -from django.db.models.lookups import PostgresOperatorLookup -from django.db.models.sql import Query - -__all__ = ["ExclusionConstraint"] - - -class ExclusionConstraintExpression(IndexExpression): - template = "%(expressions)s WITH %(operator)s" - - -class ExclusionConstraint(BaseConstraint): - template = ( - "CONSTRAINT %(name)s EXCLUDE USING %(index_type)s " - "(%(expressions)s)%(include)s%(where)s%(deferrable)s" - ) - - def __init__( - self, - *, - name, - expressions, - index_type=None, - condition=None, - deferrable=None, - include=None, - violation_error_code=None, - violation_error_message=None, - ): - if index_type and index_type.lower() not in {"gist", "spgist"}: - raise ValueError( - "Exclusion constraints only support GiST or SP-GiST indexes." - ) - if not expressions: - raise ValueError( - "At least one expression is required to define an exclusion " - "constraint." - ) - if not all( - isinstance(expr, (list, tuple)) and len(expr) == 2 for expr in expressions - ): - raise ValueError("The expressions must be a list of 2-tuples.") - if not isinstance(condition, (NoneType, Q)): - raise ValueError("ExclusionConstraint.condition must be a Q instance.") - if not isinstance(deferrable, (NoneType, Deferrable)): - raise ValueError( - "ExclusionConstraint.deferrable must be a Deferrable instance." - ) - if not isinstance(include, (NoneType, list, tuple)): - raise ValueError("ExclusionConstraint.include must be a list or tuple.") - self.expressions = expressions - self.index_type = index_type or "GIST" - self.condition = condition - self.deferrable = deferrable - self.include = tuple(include) if include else () - super().__init__( - name=name, - violation_error_code=violation_error_code, - violation_error_message=violation_error_message, - ) - - def _get_expressions(self, schema_editor, query): - expressions = [] - for idx, (expression, operator) in enumerate(self.expressions): - if isinstance(expression, str): - expression = F(expression) - expression = ExclusionConstraintExpression(expression, operator=operator) - expression.set_wrapper_classes(schema_editor.connection) - expressions.append(expression) - return ExpressionList(*expressions).resolve_expression(query) - - def _check(self, model, connection): - references = set() - for expr, _ in self.expressions: - if isinstance(expr, str): - expr = F(expr) - references.update(model._get_expr_references(expr)) - return self._check_references(model, references) - - def _get_condition_sql(self, compiler, schema_editor, query): - if self.condition is None: - return None - where = query.build_where(self.condition) - sql, params = where.as_sql(compiler, schema_editor.connection) - return sql % tuple(schema_editor.quote_value(p) for p in params) - - def constraint_sql(self, model, schema_editor): - query = Query(model, alias_cols=False) - compiler = query.get_compiler(connection=schema_editor.connection) - expressions = self._get_expressions(schema_editor, query) - table = model._meta.db_table - condition = self._get_condition_sql(compiler, schema_editor, query) - include = [ - model._meta.get_field(field_name).column for field_name in self.include - ] - return Statement( - self.template, - table=Table(table, schema_editor.quote_name), - name=schema_editor.quote_name(self.name), - index_type=self.index_type, - expressions=Expressions( - table, expressions, compiler, schema_editor.quote_value - ), - where=" WHERE (%s)" % condition if condition else "", - include=schema_editor._index_include_sql(model, include), - deferrable=schema_editor._deferrable_constraint_sql(self.deferrable), - ) - - def create_sql(self, model, schema_editor): - return Statement( - "ALTER TABLE %(table)s ADD %(constraint)s", - table=Table(model._meta.db_table, schema_editor.quote_name), - constraint=self.constraint_sql(model, schema_editor), - ) - - def remove_sql(self, model, schema_editor): - return schema_editor._delete_constraint_sql( - schema_editor.sql_delete_check, - model, - schema_editor.quote_name(self.name), - ) - - def deconstruct(self): - path, args, kwargs = super().deconstruct() - kwargs["expressions"] = self.expressions - if self.condition is not None: - kwargs["condition"] = self.condition - if self.index_type.lower() != "gist": - kwargs["index_type"] = self.index_type - if self.deferrable: - kwargs["deferrable"] = self.deferrable - if self.include: - kwargs["include"] = self.include - return path, args, kwargs - - def __eq__(self, other): - if isinstance(other, self.__class__): - return ( - self.name == other.name - and self.index_type == other.index_type - and self.expressions == other.expressions - and self.condition == other.condition - and self.deferrable == other.deferrable - and self.include == other.include - and self.violation_error_code == other.violation_error_code - and self.violation_error_message == other.violation_error_message - ) - return super().__eq__(other) - - def __repr__(self): - return "<%s: index_type=%s expressions=%s name=%s%s%s%s%s%s>" % ( - self.__class__.__qualname__, - repr(self.index_type), - repr(self.expressions), - repr(self.name), - "" if self.condition is None else " condition=%s" % self.condition, - "" if self.deferrable is None else " deferrable=%r" % self.deferrable, - "" if not self.include else " include=%s" % repr(self.include), - ( - "" - if self.violation_error_code is None - else " violation_error_code=%r" % self.violation_error_code - ), - ( - "" - if self.violation_error_message is None - or self.violation_error_message == self.default_violation_error_message - else " violation_error_message=%r" % self.violation_error_message - ), - ) - - def validate(self, model, instance, exclude=None, using=DEFAULT_DB_ALIAS): - queryset = model._default_manager.using(using) - replacement_map = instance._get_field_expression_map( - meta=model._meta, exclude=exclude - ) - replacements = {F(field): value for field, value in replacement_map.items()} - lookups = [] - for expression, operator in self.expressions: - if isinstance(expression, str): - expression = F(expression) - if exclude and self._expression_refs_exclude(model, expression, exclude): - return - rhs_expression = expression.replace_expressions(replacements) - if hasattr(expression, "get_expression_for_validation"): - expression = expression.get_expression_for_validation() - if hasattr(rhs_expression, "get_expression_for_validation"): - rhs_expression = rhs_expression.get_expression_for_validation() - lookup = PostgresOperatorLookup(lhs=expression, rhs=rhs_expression) - lookup.postgres_operator = operator - lookups.append(lookup) - queryset = queryset.filter(*lookups) - model_class_pk = instance._get_pk_val(model._meta) - if not instance._state.adding and instance._is_pk_set(model._meta): - queryset = queryset.exclude(pk=model_class_pk) - if not self.condition: - if queryset.exists(): - raise ValidationError( - self.get_violation_error_message(), code=self.violation_error_code - ) - else: - if (self.condition & Exists(queryset.filter(self.condition))).check( - replacement_map, using=using - ): - raise ValidationError( - self.get_violation_error_message(), code=self.violation_error_code - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/expressions.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/expressions.py deleted file mode 100644 index 469f4e9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/expressions.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.contrib.postgres.fields import ArrayField -from django.db.models import Subquery -from django.utils.functional import cached_property - - -class ArraySubquery(Subquery): - template = "ARRAY(%(subquery)s)" - - def __init__(self, queryset, **kwargs): - super().__init__(queryset, **kwargs) - - @cached_property - def output_field(self): - return ArrayField(self.query.output_field) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/__init__.py deleted file mode 100644 index ef11027..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .array import * # NOQA -from .citext import * # NOQA -from .hstore import * # NOQA -from .jsonb import * # NOQA -from .ranges import * # NOQA diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/array.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/array.py deleted file mode 100644 index 28c0f66..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/array.py +++ /dev/null @@ -1,372 +0,0 @@ -import json - -from django.contrib.postgres import lookups -from django.contrib.postgres.forms import SimpleArrayField -from django.contrib.postgres.validators import ArrayMaxLengthValidator -from django.core import checks, exceptions -from django.db.models import Field, Func, IntegerField, Transform, Value -from django.db.models.fields.mixins import CheckFieldDefaultMixin -from django.db.models.lookups import Exact, In -from django.utils.translation import gettext_lazy as _ - -from ..utils import prefix_validation_error -from .utils import AttributeSetter - -__all__ = ["ArrayField"] - - -class ArrayField(CheckFieldDefaultMixin, Field): - empty_strings_allowed = False - default_error_messages = { - "item_invalid": _("Item %(nth)s in the array did not validate:"), - "nested_array_mismatch": _("Nested arrays must have the same length."), - } - _default_hint = ("list", "[]") - - def __init__(self, base_field, size=None, **kwargs): - self.base_field = base_field - self.db_collation = getattr(self.base_field, "db_collation", None) - self.size = size - if self.size: - self.default_validators = [ - *self.default_validators, - ArrayMaxLengthValidator(self.size), - ] - # For performance, only add a from_db_value() method if the base field - # implements it. - if hasattr(self.base_field, "from_db_value"): - self.from_db_value = self._from_db_value - super().__init__(**kwargs) - - @property - def model(self): - try: - return self.__dict__["model"] - except KeyError: - raise AttributeError( - "'%s' object has no attribute 'model'" % self.__class__.__name__ - ) - - @model.setter - def model(self, model): - self.__dict__["model"] = model - self.base_field.model = model - - @classmethod - def _choices_is_value(cls, value): - return isinstance(value, (list, tuple)) or super()._choices_is_value(value) - - def check(self, **kwargs): - errors = super().check(**kwargs) - if self.base_field.remote_field: - errors.append( - checks.Error( - "Base field for array cannot be a related field.", - obj=self, - id="postgres.E002", - ) - ) - else: - base_checks = self.base_field.check() - if base_checks: - error_messages = "\n ".join( - "%s (%s)" % (base_check.msg, base_check.id) - for base_check in base_checks - if isinstance(base_check, checks.Error) - ) - if error_messages: - errors.append( - checks.Error( - "Base field for array has errors:\n %s" % error_messages, - obj=self, - id="postgres.E001", - ) - ) - warning_messages = "\n ".join( - "%s (%s)" % (base_check.msg, base_check.id) - for base_check in base_checks - if isinstance(base_check, checks.Warning) - ) - if warning_messages: - errors.append( - checks.Warning( - "Base field for array has warnings:\n %s" - % warning_messages, - obj=self, - id="postgres.W004", - ) - ) - return errors - - def set_attributes_from_name(self, name): - super().set_attributes_from_name(name) - self.base_field.set_attributes_from_name(name) - - @property - def description(self): - return "Array of %s" % self.base_field.description - - def db_type(self, connection): - size = self.size or "" - return "%s[%s]" % (self.base_field.db_type(connection), size) - - def cast_db_type(self, connection): - size = self.size or "" - return "%s[%s]" % (self.base_field.cast_db_type(connection), size) - - def db_parameters(self, connection): - db_params = super().db_parameters(connection) - db_params["collation"] = self.db_collation - return db_params - - def get_placeholder(self, value, compiler, connection): - return "%s::{}".format(self.db_type(connection)) - - def get_db_prep_value(self, value, connection, prepared=False): - if isinstance(value, (list, tuple)): - return [ - self.base_field.get_db_prep_value(i, connection, prepared=False) - for i in value - ] - return value - - def deconstruct(self): - name, path, args, kwargs = super().deconstruct() - if path == "django.contrib.postgres.fields.array.ArrayField": - path = "django.contrib.postgres.fields.ArrayField" - kwargs.update( - { - "base_field": self.base_field.clone(), - "size": self.size, - } - ) - return name, path, args, kwargs - - def to_python(self, value): - if isinstance(value, str): - # Assume we're deserializing - vals = json.loads(value) - value = [self.base_field.to_python(val) for val in vals] - return value - - def _from_db_value(self, value, expression, connection): - if value is None: - return value - return [ - self.base_field.from_db_value(item, expression, connection) - for item in value - ] - - def value_to_string(self, obj): - values = [] - vals = self.value_from_object(obj) - base_field = self.base_field - - for val in vals: - if val is None: - values.append(None) - else: - obj = AttributeSetter(base_field.attname, val) - values.append(base_field.value_to_string(obj)) - return json.dumps(values, ensure_ascii=False) - - def get_transform(self, name): - transform = super().get_transform(name) - if transform: - return transform - if "_" not in name: - try: - index = int(name) - except ValueError: - pass - else: - index += 1 # postgres uses 1-indexing - return IndexTransformFactory(index, self.base_field) - try: - start, end = name.split("_") - start = int(start) + 1 - end = int(end) # don't add one here because postgres slices are weird - except ValueError: - pass - else: - return SliceTransformFactory(start, end) - - def validate(self, value, model_instance): - super().validate(value, model_instance) - for index, part in enumerate(value): - try: - self.base_field.validate(part, model_instance) - except exceptions.ValidationError as error: - raise prefix_validation_error( - error, - prefix=self.error_messages["item_invalid"], - code="item_invalid", - params={"nth": index + 1}, - ) - if isinstance(self.base_field, ArrayField): - if len({len(i) for i in value}) > 1: - raise exceptions.ValidationError( - self.error_messages["nested_array_mismatch"], - code="nested_array_mismatch", - ) - - def run_validators(self, value): - super().run_validators(value) - for index, part in enumerate(value): - try: - self.base_field.run_validators(part) - except exceptions.ValidationError as error: - raise prefix_validation_error( - error, - prefix=self.error_messages["item_invalid"], - code="item_invalid", - params={"nth": index + 1}, - ) - - def formfield(self, **kwargs): - return super().formfield( - **{ - "form_class": SimpleArrayField, - "base_field": self.base_field.formfield(), - "max_length": self.size, - **kwargs, - } - ) - - def slice_expression(self, expression, start, length): - # If length is not provided, don't specify an end to slice to the end - # of the array. - end = None if length is None else start + length - 1 - return SliceTransform(start, end, expression) - - -class ArrayRHSMixin: - def __init__(self, lhs, rhs): - # Don't wrap arrays that contains only None values, psycopg doesn't - # allow this. - if isinstance(rhs, (tuple, list)) and any(self._rhs_not_none_values(rhs)): - expressions = [] - for value in rhs: - if not hasattr(value, "resolve_expression"): - field = lhs.output_field - value = Value(field.base_field.get_prep_value(value)) - expressions.append(value) - rhs = Func( - *expressions, - function="ARRAY", - template="%(function)s[%(expressions)s]", - ) - super().__init__(lhs, rhs) - - def process_rhs(self, compiler, connection): - rhs, rhs_params = super().process_rhs(compiler, connection) - cast_type = self.lhs.output_field.cast_db_type(connection) - return "%s::%s" % (rhs, cast_type), rhs_params - - def _rhs_not_none_values(self, rhs): - for x in rhs: - if isinstance(x, (list, tuple)): - yield from self._rhs_not_none_values(x) - elif x is not None: - yield True - - -@ArrayField.register_lookup -class ArrayContains(ArrayRHSMixin, lookups.DataContains): - pass - - -@ArrayField.register_lookup -class ArrayContainedBy(ArrayRHSMixin, lookups.ContainedBy): - pass - - -@ArrayField.register_lookup -class ArrayExact(ArrayRHSMixin, Exact): - pass - - -@ArrayField.register_lookup -class ArrayOverlap(ArrayRHSMixin, lookups.Overlap): - pass - - -@ArrayField.register_lookup -class ArrayLenTransform(Transform): - lookup_name = "len" - output_field = IntegerField() - - def as_sql(self, compiler, connection): - lhs, params = compiler.compile(self.lhs) - # Distinguish NULL and empty arrays - return ( - "CASE WHEN %(lhs)s IS NULL THEN NULL ELSE " - "coalesce(array_length(%(lhs)s, 1), 0) END" - ) % {"lhs": lhs}, params * 2 - - -@ArrayField.register_lookup -class ArrayInLookup(In): - def get_prep_lookup(self): - values = super().get_prep_lookup() - if hasattr(values, "resolve_expression"): - return values - # In.process_rhs() expects values to be hashable, so convert lists - # to tuples. - prepared_values = [] - for value in values: - if hasattr(value, "resolve_expression"): - prepared_values.append(value) - else: - prepared_values.append(tuple(value)) - return prepared_values - - -class IndexTransform(Transform): - def __init__(self, index, base_field, *args, **kwargs): - super().__init__(*args, **kwargs) - self.index = index - self.base_field = base_field - - def as_sql(self, compiler, connection): - lhs, params = compiler.compile(self.lhs) - if not lhs.endswith("]"): - lhs = "(%s)" % lhs - return "%s[%%s]" % lhs, (*params, self.index) - - @property - def output_field(self): - return self.base_field - - -class IndexTransformFactory: - def __init__(self, index, base_field): - self.index = index - self.base_field = base_field - - def __call__(self, *args, **kwargs): - return IndexTransform(self.index, self.base_field, *args, **kwargs) - - -class SliceTransform(Transform): - def __init__(self, start, end, *args, **kwargs): - super().__init__(*args, **kwargs) - self.start = start - self.end = end - - def as_sql(self, compiler, connection): - lhs, params = compiler.compile(self.lhs) - # self.start is set to 1 if slice start is not provided. - if self.end is None: - return f"({lhs})[%s:]", (*params, self.start) - else: - return f"({lhs})[%s:%s]", (*params, self.start, self.end) - - -class SliceTransformFactory: - def __init__(self, start, end): - self.start = start - self.end = end - - def __call__(self, *args, **kwargs): - return SliceTransform(self.start, self.end, *args, **kwargs) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/citext.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/citext.py deleted file mode 100644 index 01df541..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/citext.py +++ /dev/null @@ -1,45 +0,0 @@ -from django.db.models import CharField, EmailField, TextField - -__all__ = ["CICharField", "CIEmailField", "CITextField"] - - -class CICharField(CharField): - system_check_removed_details = { - "msg": ( - "django.contrib.postgres.fields.CICharField is removed except for support " - "in historical migrations." - ), - "hint": ( - 'Use CharField(db_collation="…") with a case-insensitive non-deterministic ' - "collation instead." - ), - "id": "fields.E905", - } - - -class CIEmailField(EmailField): - system_check_removed_details = { - "msg": ( - "django.contrib.postgres.fields.CIEmailField is removed except for support " - "in historical migrations." - ), - "hint": ( - 'Use EmailField(db_collation="…") with a case-insensitive ' - "non-deterministic collation instead." - ), - "id": "fields.E906", - } - - -class CITextField(TextField): - system_check_removed_details = { - "msg": ( - "django.contrib.postgres.fields.CITextField is removed except for support " - "in historical migrations." - ), - "hint": ( - 'Use TextField(db_collation="…") with a case-insensitive non-deterministic ' - "collation instead." - ), - "id": "fields.E907", - } diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/hstore.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/hstore.py deleted file mode 100644 index 300458c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/hstore.py +++ /dev/null @@ -1,112 +0,0 @@ -import json - -from django.contrib.postgres import forms, lookups -from django.contrib.postgres.fields.array import ArrayField -from django.core import exceptions -from django.db.models import Field, TextField, Transform -from django.db.models.fields.mixins import CheckFieldDefaultMixin -from django.utils.translation import gettext_lazy as _ - -__all__ = ["HStoreField"] - - -class HStoreField(CheckFieldDefaultMixin, Field): - empty_strings_allowed = False - description = _("Map of strings to strings/nulls") - default_error_messages = { - "not_a_string": _("The value of “%(key)s” is not a string or null."), - } - _default_hint = ("dict", "{}") - - def db_type(self, connection): - return "hstore" - - def get_transform(self, name): - transform = super().get_transform(name) - if transform: - return transform - return KeyTransformFactory(name) - - def validate(self, value, model_instance): - super().validate(value, model_instance) - for key, val in value.items(): - if not isinstance(val, str) and val is not None: - raise exceptions.ValidationError( - self.error_messages["not_a_string"], - code="not_a_string", - params={"key": key}, - ) - - def to_python(self, value): - if isinstance(value, str): - value = json.loads(value) - return value - - def value_to_string(self, obj): - return json.dumps(self.value_from_object(obj), ensure_ascii=False) - - def formfield(self, **kwargs): - return super().formfield( - **{ - "form_class": forms.HStoreField, - **kwargs, - } - ) - - def get_prep_value(self, value): - value = super().get_prep_value(value) - - if isinstance(value, dict): - prep_value = {} - for key, val in value.items(): - key = str(key) - if val is not None: - val = str(val) - prep_value[key] = val - value = prep_value - - if isinstance(value, list): - value = [str(item) for item in value] - - return value - - -HStoreField.register_lookup(lookups.DataContains) -HStoreField.register_lookup(lookups.ContainedBy) -HStoreField.register_lookup(lookups.HasKey) -HStoreField.register_lookup(lookups.HasKeys) -HStoreField.register_lookup(lookups.HasAnyKeys) - - -class KeyTransform(Transform): - output_field = TextField() - - def __init__(self, key_name, *args, **kwargs): - super().__init__(*args, **kwargs) - self.key_name = key_name - - def as_sql(self, compiler, connection): - lhs, params = compiler.compile(self.lhs) - return "(%s -> %%s)" % lhs, tuple(params) + (self.key_name,) - - -class KeyTransformFactory: - def __init__(self, key_name): - self.key_name = key_name - - def __call__(self, *args, **kwargs): - return KeyTransform(self.key_name, *args, **kwargs) - - -@HStoreField.register_lookup -class KeysTransform(Transform): - lookup_name = "keys" - function = "akeys" - output_field = ArrayField(TextField()) - - -@HStoreField.register_lookup -class ValuesTransform(Transform): - lookup_name = "values" - function = "avals" - output_field = ArrayField(TextField()) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/jsonb.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/jsonb.py deleted file mode 100644 index 760b5d8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/jsonb.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db.models import JSONField as BuiltinJSONField - -__all__ = ["JSONField"] - - -class JSONField(BuiltinJSONField): - system_check_removed_details = { - "msg": ( - "django.contrib.postgres.fields.JSONField is removed except for " - "support in historical migrations." - ), - "hint": "Use django.db.models.JSONField instead.", - "id": "fields.E904", - } diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/ranges.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/ranges.py deleted file mode 100644 index fbb6012..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/ranges.py +++ /dev/null @@ -1,383 +0,0 @@ -import datetime -import json - -from django.contrib.postgres import forms, lookups -from django.db import models -from django.db.backends.postgresql.psycopg_any import ( - DateRange, - DateTimeTZRange, - NumericRange, - Range, -) -from django.db.models.functions import Cast -from django.db.models.lookups import PostgresOperatorLookup - -from .utils import AttributeSetter - -__all__ = [ - "RangeField", - "IntegerRangeField", - "BigIntegerRangeField", - "DecimalRangeField", - "DateTimeRangeField", - "DateRangeField", - "RangeBoundary", - "RangeOperators", -] - - -class RangeBoundary(models.Expression): - """A class that represents range boundaries.""" - - def __init__(self, inclusive_lower=True, inclusive_upper=False): - self.lower = "[" if inclusive_lower else "(" - self.upper = "]" if inclusive_upper else ")" - - def as_sql(self, compiler, connection): - return "'%s%s'" % (self.lower, self.upper), [] - - -class RangeOperators: - # https://www.postgresql.org/docs/current/functions-range.html#RANGE-OPERATORS-TABLE - EQUAL = "=" - NOT_EQUAL = "<>" - CONTAINS = "@>" - CONTAINED_BY = "<@" - OVERLAPS = "&&" - FULLY_LT = "<<" - FULLY_GT = ">>" - NOT_LT = "&>" - NOT_GT = "&<" - ADJACENT_TO = "-|-" - - -class RangeField(models.Field): - empty_strings_allowed = False - - def __init__(self, *args, **kwargs): - if "default_bounds" in kwargs: - raise TypeError( - f"Cannot use 'default_bounds' with {self.__class__.__name__}." - ) - # Initializing base_field here ensures that its model matches the model - # for self. - if hasattr(self, "base_field"): - self.base_field = self.base_field() - super().__init__(*args, **kwargs) - - @property - def model(self): - try: - return self.__dict__["model"] - except KeyError: - raise AttributeError( - "'%s' object has no attribute 'model'" % self.__class__.__name__ - ) - - @model.setter - def model(self, model): - self.__dict__["model"] = model - self.base_field.model = model - - @classmethod - def _choices_is_value(cls, value): - return isinstance(value, (list, tuple)) or super()._choices_is_value(value) - - def get_placeholder(self, value, compiler, connection): - return "%s::{}".format(self.db_type(connection)) - - def get_prep_value(self, value): - if value is None: - return None - elif isinstance(value, Range): - return value - elif isinstance(value, (list, tuple)): - return self.range_type(value[0], value[1]) - return value - - def to_python(self, value): - if isinstance(value, str): - # Assume we're deserializing - vals = json.loads(value) - for end in ("lower", "upper"): - if end in vals: - vals[end] = self.base_field.to_python(vals[end]) - value = self.range_type(**vals) - elif isinstance(value, (list, tuple)): - value = self.range_type(value[0], value[1]) - return value - - def set_attributes_from_name(self, name): - super().set_attributes_from_name(name) - self.base_field.set_attributes_from_name(name) - - def value_to_string(self, obj): - value = self.value_from_object(obj) - if value is None: - return None - if value.isempty: - return json.dumps({"empty": True}) - base_field = self.base_field - result = {"bounds": value._bounds} - for end in ("lower", "upper"): - val = getattr(value, end) - if val is None: - result[end] = None - else: - obj = AttributeSetter(base_field.attname, val) - result[end] = base_field.value_to_string(obj) - return json.dumps(result) - - def formfield(self, **kwargs): - kwargs.setdefault("form_class", self.form_field) - return super().formfield(**kwargs) - - -CANONICAL_RANGE_BOUNDS = "[)" - - -class ContinuousRangeField(RangeField): - """ - Continuous range field. It allows specifying default bounds for list and - tuple inputs. - """ - - def __init__(self, *args, default_bounds=CANONICAL_RANGE_BOUNDS, **kwargs): - if default_bounds not in ("[)", "(]", "()", "[]"): - raise ValueError("default_bounds must be one of '[)', '(]', '()', or '[]'.") - self.default_bounds = default_bounds - super().__init__(*args, **kwargs) - - def get_prep_value(self, value): - if isinstance(value, (list, tuple)): - return self.range_type(value[0], value[1], self.default_bounds) - return super().get_prep_value(value) - - def formfield(self, **kwargs): - kwargs.setdefault("default_bounds", self.default_bounds) - return super().formfield(**kwargs) - - def deconstruct(self): - name, path, args, kwargs = super().deconstruct() - if self.default_bounds and self.default_bounds != CANONICAL_RANGE_BOUNDS: - kwargs["default_bounds"] = self.default_bounds - return name, path, args, kwargs - - -class IntegerRangeField(RangeField): - base_field = models.IntegerField - range_type = NumericRange - form_field = forms.IntegerRangeField - - def db_type(self, connection): - return "int4range" - - -class BigIntegerRangeField(RangeField): - base_field = models.BigIntegerField - range_type = NumericRange - form_field = forms.IntegerRangeField - - def db_type(self, connection): - return "int8range" - - -class DecimalRangeField(ContinuousRangeField): - base_field = models.DecimalField - range_type = NumericRange - form_field = forms.DecimalRangeField - - def db_type(self, connection): - return "numrange" - - -class DateTimeRangeField(ContinuousRangeField): - base_field = models.DateTimeField - range_type = DateTimeTZRange - form_field = forms.DateTimeRangeField - - def db_type(self, connection): - return "tstzrange" - - -class DateRangeField(RangeField): - base_field = models.DateField - range_type = DateRange - form_field = forms.DateRangeField - - def db_type(self, connection): - return "daterange" - - -class RangeContains(lookups.DataContains): - def get_prep_lookup(self): - if not isinstance(self.rhs, (list, tuple, Range)): - return Cast(self.rhs, self.lhs.field.base_field) - return super().get_prep_lookup() - - -RangeField.register_lookup(RangeContains) -RangeField.register_lookup(lookups.ContainedBy) -RangeField.register_lookup(lookups.Overlap) - - -class DateTimeRangeContains(PostgresOperatorLookup): - """ - Lookup for Date/DateTimeRange containment to cast the rhs to the correct - type. - """ - - lookup_name = "contains" - postgres_operator = RangeOperators.CONTAINS - - def process_rhs(self, compiler, connection): - # Transform rhs value for db lookup. - if isinstance(self.rhs, datetime.date): - value = models.Value(self.rhs) - self.rhs = value.resolve_expression(compiler.query) - return super().process_rhs(compiler, connection) - - def as_postgresql(self, compiler, connection): - sql, params = super().as_postgresql(compiler, connection) - # Cast the rhs if needed. - cast_sql = "" - if ( - isinstance(self.rhs, models.Expression) - and self.rhs._output_field_or_none - and - # Skip cast if rhs has a matching range type. - not isinstance( - self.rhs._output_field_or_none, self.lhs.output_field.__class__ - ) - ): - cast_internal_type = self.lhs.output_field.base_field.get_internal_type() - cast_sql = "::{}".format(connection.data_types.get(cast_internal_type)) - return "%s%s" % (sql, cast_sql), params - - -DateRangeField.register_lookup(DateTimeRangeContains) -DateTimeRangeField.register_lookup(DateTimeRangeContains) - - -class RangeContainedBy(PostgresOperatorLookup): - lookup_name = "contained_by" - type_mapping = { - "smallint": "int4range", - "integer": "int4range", - "bigint": "int8range", - "double precision": "numrange", - "numeric": "numrange", - "date": "daterange", - "timestamp with time zone": "tstzrange", - } - postgres_operator = RangeOperators.CONTAINED_BY - - def process_rhs(self, compiler, connection): - rhs, rhs_params = super().process_rhs(compiler, connection) - # Ignore precision for DecimalFields. - db_type = self.lhs.output_field.cast_db_type(connection).split("(")[0] - cast_type = self.type_mapping[db_type] - return "%s::%s" % (rhs, cast_type), rhs_params - - def process_lhs(self, compiler, connection): - lhs, lhs_params = super().process_lhs(compiler, connection) - if isinstance(self.lhs.output_field, models.FloatField): - lhs = "%s::numeric" % lhs - elif isinstance(self.lhs.output_field, models.SmallIntegerField): - lhs = "%s::integer" % lhs - return lhs, lhs_params - - def get_prep_lookup(self): - return RangeField().get_prep_value(self.rhs) - - -models.DateField.register_lookup(RangeContainedBy) -models.DateTimeField.register_lookup(RangeContainedBy) -models.IntegerField.register_lookup(RangeContainedBy) -models.FloatField.register_lookup(RangeContainedBy) -models.DecimalField.register_lookup(RangeContainedBy) - - -@RangeField.register_lookup -class FullyLessThan(PostgresOperatorLookup): - lookup_name = "fully_lt" - postgres_operator = RangeOperators.FULLY_LT - - -@RangeField.register_lookup -class FullGreaterThan(PostgresOperatorLookup): - lookup_name = "fully_gt" - postgres_operator = RangeOperators.FULLY_GT - - -@RangeField.register_lookup -class NotLessThan(PostgresOperatorLookup): - lookup_name = "not_lt" - postgres_operator = RangeOperators.NOT_LT - - -@RangeField.register_lookup -class NotGreaterThan(PostgresOperatorLookup): - lookup_name = "not_gt" - postgres_operator = RangeOperators.NOT_GT - - -@RangeField.register_lookup -class AdjacentToLookup(PostgresOperatorLookup): - lookup_name = "adjacent_to" - postgres_operator = RangeOperators.ADJACENT_TO - - -@RangeField.register_lookup -class RangeStartsWith(models.Transform): - lookup_name = "startswith" - function = "lower" - - @property - def output_field(self): - return self.lhs.output_field.base_field - - -@RangeField.register_lookup -class RangeEndsWith(models.Transform): - lookup_name = "endswith" - function = "upper" - - @property - def output_field(self): - return self.lhs.output_field.base_field - - -@RangeField.register_lookup -class IsEmpty(models.Transform): - lookup_name = "isempty" - function = "isempty" - output_field = models.BooleanField() - - -@RangeField.register_lookup -class LowerInclusive(models.Transform): - lookup_name = "lower_inc" - function = "LOWER_INC" - output_field = models.BooleanField() - - -@RangeField.register_lookup -class LowerInfinite(models.Transform): - lookup_name = "lower_inf" - function = "LOWER_INF" - output_field = models.BooleanField() - - -@RangeField.register_lookup -class UpperInclusive(models.Transform): - lookup_name = "upper_inc" - function = "UPPER_INC" - output_field = models.BooleanField() - - -@RangeField.register_lookup -class UpperInfinite(models.Transform): - lookup_name = "upper_inf" - function = "UPPER_INF" - output_field = models.BooleanField() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/utils.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/utils.py deleted file mode 100644 index 82da93e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/fields/utils.py +++ /dev/null @@ -1,3 +0,0 @@ -class AttributeSetter: - def __init__(self, name, value): - setattr(self, name, value) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/__init__.py deleted file mode 100644 index bb2685e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .array import * # NOQA -from .hstore import * # NOQA -from .ranges import * # NOQA diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/array.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/array.py deleted file mode 100644 index fd5cd21..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/array.py +++ /dev/null @@ -1,251 +0,0 @@ -import copy -from itertools import chain - -from django import forms -from django.contrib.postgres.validators import ( - ArrayMaxLengthValidator, - ArrayMinLengthValidator, -) -from django.core.exceptions import ValidationError -from django.utils.translation import gettext_lazy as _ - -from ..utils import prefix_validation_error - - -class SimpleArrayField(forms.CharField): - default_error_messages = { - "item_invalid": _("Item %(nth)s in the array did not validate:"), - } - - def __init__( - self, base_field, *, delimiter=",", max_length=None, min_length=None, **kwargs - ): - self.base_field = base_field - self.delimiter = delimiter - super().__init__(**kwargs) - if min_length is not None: - self.min_length = min_length - self.validators.append(ArrayMinLengthValidator(int(min_length))) - if max_length is not None: - self.max_length = max_length - self.validators.append(ArrayMaxLengthValidator(int(max_length))) - - def clean(self, value): - value = super().clean(value) - return [self.base_field.clean(val) for val in value] - - def prepare_value(self, value): - if isinstance(value, list): - return self.delimiter.join( - str(self.base_field.prepare_value(v)) for v in value - ) - return value - - def to_python(self, value): - if isinstance(value, list): - items = value - elif value: - items = value.split(self.delimiter) - else: - items = [] - errors = [] - values = [] - for index, item in enumerate(items): - try: - values.append(self.base_field.to_python(item)) - except ValidationError as error: - errors.append( - prefix_validation_error( - error, - prefix=self.error_messages["item_invalid"], - code="item_invalid", - params={"nth": index + 1}, - ) - ) - if errors: - raise ValidationError(errors) - return values - - def validate(self, value): - super().validate(value) - errors = [] - for index, item in enumerate(value): - try: - self.base_field.validate(item) - except ValidationError as error: - errors.append( - prefix_validation_error( - error, - prefix=self.error_messages["item_invalid"], - code="item_invalid", - params={"nth": index + 1}, - ) - ) - if errors: - raise ValidationError(errors) - - def run_validators(self, value): - super().run_validators(value) - errors = [] - for index, item in enumerate(value): - try: - self.base_field.run_validators(item) - except ValidationError as error: - errors.append( - prefix_validation_error( - error, - prefix=self.error_messages["item_invalid"], - code="item_invalid", - params={"nth": index + 1}, - ) - ) - if errors: - raise ValidationError(errors) - - def has_changed(self, initial, data): - try: - value = self.to_python(data) - except ValidationError: - pass - else: - if initial in self.empty_values and value in self.empty_values: - return False - return super().has_changed(initial, data) - - -class SplitArrayWidget(forms.Widget): - template_name = "postgres/widgets/split_array.html" - - def __init__(self, widget, size, **kwargs): - self.widget = widget() if isinstance(widget, type) else widget - self.size = size - super().__init__(**kwargs) - - @property - def is_hidden(self): - return self.widget.is_hidden - - def value_from_datadict(self, data, files, name): - return [ - self.widget.value_from_datadict(data, files, "%s_%s" % (name, index)) - for index in range(self.size) - ] - - def value_omitted_from_data(self, data, files, name): - return all( - self.widget.value_omitted_from_data(data, files, "%s_%s" % (name, index)) - for index in range(self.size) - ) - - def id_for_label(self, id_): - # See the comment for RadioSelect.id_for_label() - if id_: - id_ += "_0" - return id_ - - def get_context(self, name, value, attrs=None): - attrs = {} if attrs is None else attrs - context = super().get_context(name, value, attrs) - if self.is_localized: - self.widget.is_localized = self.is_localized - value = value or [] - context["widget"]["subwidgets"] = [] - final_attrs = self.build_attrs(attrs) - id_ = final_attrs.get("id") - for i in range(max(len(value), self.size)): - try: - widget_value = value[i] - except IndexError: - widget_value = None - if id_: - final_attrs = {**final_attrs, "id": "%s_%s" % (id_, i)} - context["widget"]["subwidgets"].append( - self.widget.get_context(name + "_%s" % i, widget_value, final_attrs)[ - "widget" - ] - ) - return context - - @property - def media(self): - return self.widget.media - - def __deepcopy__(self, memo): - obj = super().__deepcopy__(memo) - obj.widget = copy.deepcopy(self.widget) - return obj - - @property - def needs_multipart_form(self): - return self.widget.needs_multipart_form - - -class SplitArrayField(forms.Field): - default_error_messages = { - "item_invalid": _("Item %(nth)s in the array did not validate:"), - } - - def __init__(self, base_field, size, *, remove_trailing_nulls=False, **kwargs): - self.base_field = base_field - self.size = size - self.remove_trailing_nulls = remove_trailing_nulls - widget = SplitArrayWidget(widget=base_field.widget, size=size) - kwargs.setdefault("widget", widget) - super().__init__(**kwargs) - - def _remove_trailing_nulls(self, values): - index = None - if self.remove_trailing_nulls: - for i, value in reversed(list(enumerate(values))): - if value in self.base_field.empty_values: - index = i - else: - break - if index is not None: - values = values[:index] - return values, index - - def to_python(self, value): - value = super().to_python(value) - return [self.base_field.to_python(item) for item in value] - - def clean(self, value): - cleaned_data = [] - errors = [] - if not any(value) and self.required: - raise ValidationError(self.error_messages["required"]) - max_size = max(self.size, len(value)) - for index in range(max_size): - item = value[index] - try: - cleaned_data.append(self.base_field.clean(item)) - except ValidationError as error: - errors.append( - prefix_validation_error( - error, - self.error_messages["item_invalid"], - code="item_invalid", - params={"nth": index + 1}, - ) - ) - cleaned_data.append(item) - else: - errors.append(None) - cleaned_data, null_index = self._remove_trailing_nulls(cleaned_data) - if null_index is not None: - errors = errors[:null_index] - errors = list(filter(None, errors)) - if errors: - raise ValidationError(list(chain.from_iterable(errors))) - return cleaned_data - - def has_changed(self, initial, data): - try: - data = self.to_python(data) - except ValidationError: - pass - else: - data, _ = self._remove_trailing_nulls(data) - if initial in self.empty_values and data in self.empty_values: - return False - return super().has_changed(initial, data) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/hstore.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/hstore.py deleted file mode 100644 index f824f78..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/hstore.py +++ /dev/null @@ -1,59 +0,0 @@ -import json - -from django import forms -from django.core.exceptions import ValidationError -from django.utils.translation import gettext_lazy as _ - -__all__ = ["HStoreField"] - - -class HStoreField(forms.CharField): - """ - A field for HStore data which accepts dictionary JSON input. - """ - - widget = forms.Textarea - default_error_messages = { - "invalid_json": _("Could not load JSON data."), - "invalid_format": _("Input must be a JSON dictionary."), - } - - def prepare_value(self, value): - if isinstance(value, dict): - return json.dumps(value, ensure_ascii=False) - return value - - def to_python(self, value): - if not value: - return {} - if not isinstance(value, dict): - try: - value = json.loads(value) - except json.JSONDecodeError: - raise ValidationError( - self.error_messages["invalid_json"], - code="invalid_json", - ) - - if not isinstance(value, dict): - raise ValidationError( - self.error_messages["invalid_format"], - code="invalid_format", - ) - - # Cast everything to strings for ease. - for key, val in value.items(): - if val is not None: - val = str(val) - value[key] = val - return value - - def has_changed(self, initial, data): - """ - Return True if data differs from initial. - """ - # For purposes of seeing whether something has changed, None is - # the same as an empty dict, if the data or initial value we get - # is None, replace it w/ {}. - initial_value = self.to_python(initial) - return super().has_changed(initial_value, data) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/ranges.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/ranges.py deleted file mode 100644 index 3017f08..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/forms/ranges.py +++ /dev/null @@ -1,119 +0,0 @@ -from django import forms -from django.core import exceptions -from django.db.backends.postgresql.psycopg_any import ( - DateRange, - DateTimeTZRange, - NumericRange, -) -from django.forms.widgets import HiddenInput, MultiWidget -from django.utils.translation import gettext_lazy as _ - -__all__ = [ - "BaseRangeField", - "IntegerRangeField", - "DecimalRangeField", - "DateTimeRangeField", - "DateRangeField", - "HiddenRangeWidget", - "RangeWidget", -] - - -class RangeWidget(MultiWidget): - def __init__(self, base_widget, attrs=None): - widgets = (base_widget, base_widget) - super().__init__(widgets, attrs) - - def decompress(self, value): - if value: - return (value.lower, value.upper) - return (None, None) - - -class HiddenRangeWidget(RangeWidget): - """A widget that splits input into two inputs.""" - - def __init__(self, attrs=None): - super().__init__(HiddenInput, attrs) - - -class BaseRangeField(forms.MultiValueField): - default_error_messages = { - "invalid": _("Enter two valid values."), - "bound_ordering": _( - "The start of the range must not exceed the end of the range." - ), - } - hidden_widget = HiddenRangeWidget - - def __init__(self, **kwargs): - if "widget" not in kwargs: - kwargs["widget"] = RangeWidget(self.base_field.widget) - if "fields" not in kwargs: - kwargs["fields"] = [ - self.base_field(required=False), - self.base_field(required=False), - ] - kwargs.setdefault("required", False) - kwargs.setdefault("require_all_fields", False) - self.range_kwargs = {} - if default_bounds := kwargs.pop("default_bounds", None): - self.range_kwargs = {"bounds": default_bounds} - super().__init__(**kwargs) - - def prepare_value(self, value): - lower_base, upper_base = self.fields - if isinstance(value, self.range_type): - return [ - lower_base.prepare_value(value.lower), - upper_base.prepare_value(value.upper), - ] - if value is None: - return [ - lower_base.prepare_value(None), - upper_base.prepare_value(None), - ] - return value - - def compress(self, values): - if not values: - return None - lower, upper = values - if lower is not None and upper is not None and lower > upper: - raise exceptions.ValidationError( - self.error_messages["bound_ordering"], - code="bound_ordering", - ) - try: - range_value = self.range_type(lower, upper, **self.range_kwargs) - except TypeError: - raise exceptions.ValidationError( - self.error_messages["invalid"], - code="invalid", - ) - else: - return range_value - - -class IntegerRangeField(BaseRangeField): - default_error_messages = {"invalid": _("Enter two whole numbers.")} - base_field = forms.IntegerField - range_type = NumericRange - - -class DecimalRangeField(BaseRangeField): - default_error_messages = {"invalid": _("Enter two numbers.")} - base_field = forms.DecimalField - range_type = NumericRange - - -class DateTimeRangeField(BaseRangeField): - default_error_messages = {"invalid": _("Enter two valid date/times.")} - base_field = forms.DateTimeField - range_type = DateTimeTZRange - - -class DateRangeField(BaseRangeField): - default_error_messages = {"invalid": _("Enter two valid dates.")} - base_field = forms.DateField - range_type = DateRange diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/functions.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/functions.py deleted file mode 100644 index f001a04..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/functions.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.db.models import DateTimeField, Func, UUIDField - - -class RandomUUID(Func): - template = "GEN_RANDOM_UUID()" - output_field = UUIDField() - - -class TransactionNow(Func): - template = "CURRENT_TIMESTAMP" - output_field = DateTimeField() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/indexes.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/indexes.py deleted file mode 100644 index ce9e2ce..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/indexes.py +++ /dev/null @@ -1,242 +0,0 @@ -from django.db.models import Func, Index -from django.utils.functional import cached_property - -__all__ = [ - "BloomIndex", - "BrinIndex", - "BTreeIndex", - "GinIndex", - "GistIndex", - "HashIndex", - "SpGistIndex", -] - - -class PostgresIndex(Index): - @cached_property - def max_name_length(self): - # Allow an index name longer than 30 characters when the suffix is - # longer than the usual 3 character limit. The 30 character limit for - # cross-database compatibility isn't applicable to PostgreSQL-specific - # indexes. - return Index.max_name_length - len(Index.suffix) + len(self.suffix) - - def create_sql(self, model, schema_editor, using="", **kwargs): - self.check_supported(schema_editor) - statement = super().create_sql( - model, schema_editor, using=" USING %s" % (using or self.suffix), **kwargs - ) - with_params = self.get_with_params() - if with_params: - statement.parts["extra"] = " WITH (%s)%s" % ( - ", ".join(with_params), - statement.parts["extra"], - ) - return statement - - def check_supported(self, schema_editor): - pass - - def get_with_params(self): - return [] - - -class BloomIndex(PostgresIndex): - suffix = "bloom" - - def __init__(self, *expressions, length=None, columns=(), **kwargs): - super().__init__(*expressions, **kwargs) - if len(self.fields) > 32: - raise ValueError("Bloom indexes support a maximum of 32 fields.") - if not isinstance(columns, (list, tuple)): - raise ValueError("BloomIndex.columns must be a list or tuple.") - if len(columns) > len(self.fields): - raise ValueError("BloomIndex.columns cannot have more values than fields.") - if not all(0 < col <= 4095 for col in columns): - raise ValueError( - "BloomIndex.columns must contain integers from 1 to 4095.", - ) - if length is not None and not 0 < length <= 4096: - raise ValueError( - "BloomIndex.length must be None or an integer from 1 to 4096.", - ) - self.length = length - self.columns = columns - - def deconstruct(self): - path, args, kwargs = super().deconstruct() - if self.length is not None: - kwargs["length"] = self.length - if self.columns: - kwargs["columns"] = self.columns - return path, args, kwargs - - def get_with_params(self): - with_params = [] - if self.length is not None: - with_params.append("length = %d" % self.length) - if self.columns: - with_params.extend( - "col%d = %d" % (i, v) for i, v in enumerate(self.columns, start=1) - ) - return with_params - - -class BrinIndex(PostgresIndex): - suffix = "brin" - - def __init__( - self, *expressions, autosummarize=None, pages_per_range=None, **kwargs - ): - if pages_per_range is not None and pages_per_range <= 0: - raise ValueError("pages_per_range must be None or a positive integer") - self.autosummarize = autosummarize - self.pages_per_range = pages_per_range - super().__init__(*expressions, **kwargs) - - def deconstruct(self): - path, args, kwargs = super().deconstruct() - if self.autosummarize is not None: - kwargs["autosummarize"] = self.autosummarize - if self.pages_per_range is not None: - kwargs["pages_per_range"] = self.pages_per_range - return path, args, kwargs - - def get_with_params(self): - with_params = [] - if self.autosummarize is not None: - with_params.append( - "autosummarize = %s" % ("on" if self.autosummarize else "off") - ) - if self.pages_per_range is not None: - with_params.append("pages_per_range = %d" % self.pages_per_range) - return with_params - - -class BTreeIndex(PostgresIndex): - suffix = "btree" - - def __init__(self, *expressions, fillfactor=None, deduplicate_items=None, **kwargs): - self.fillfactor = fillfactor - self.deduplicate_items = deduplicate_items - super().__init__(*expressions, **kwargs) - - def deconstruct(self): - path, args, kwargs = super().deconstruct() - if self.fillfactor is not None: - kwargs["fillfactor"] = self.fillfactor - if self.deduplicate_items is not None: - kwargs["deduplicate_items"] = self.deduplicate_items - return path, args, kwargs - - def get_with_params(self): - with_params = [] - if self.fillfactor is not None: - with_params.append("fillfactor = %d" % self.fillfactor) - if self.deduplicate_items is not None: - with_params.append( - "deduplicate_items = %s" % ("on" if self.deduplicate_items else "off") - ) - return with_params - - -class GinIndex(PostgresIndex): - suffix = "gin" - - def __init__( - self, *expressions, fastupdate=None, gin_pending_list_limit=None, **kwargs - ): - self.fastupdate = fastupdate - self.gin_pending_list_limit = gin_pending_list_limit - super().__init__(*expressions, **kwargs) - - def deconstruct(self): - path, args, kwargs = super().deconstruct() - if self.fastupdate is not None: - kwargs["fastupdate"] = self.fastupdate - if self.gin_pending_list_limit is not None: - kwargs["gin_pending_list_limit"] = self.gin_pending_list_limit - return path, args, kwargs - - def get_with_params(self): - with_params = [] - if self.gin_pending_list_limit is not None: - with_params.append( - "gin_pending_list_limit = %d" % self.gin_pending_list_limit - ) - if self.fastupdate is not None: - with_params.append("fastupdate = %s" % ("on" if self.fastupdate else "off")) - return with_params - - -class GistIndex(PostgresIndex): - suffix = "gist" - - def __init__(self, *expressions, buffering=None, fillfactor=None, **kwargs): - self.buffering = buffering - self.fillfactor = fillfactor - super().__init__(*expressions, **kwargs) - - def deconstruct(self): - path, args, kwargs = super().deconstruct() - if self.buffering is not None: - kwargs["buffering"] = self.buffering - if self.fillfactor is not None: - kwargs["fillfactor"] = self.fillfactor - return path, args, kwargs - - def get_with_params(self): - with_params = [] - if self.buffering is not None: - with_params.append("buffering = %s" % ("on" if self.buffering else "off")) - if self.fillfactor is not None: - with_params.append("fillfactor = %d" % self.fillfactor) - return with_params - - -class HashIndex(PostgresIndex): - suffix = "hash" - - def __init__(self, *expressions, fillfactor=None, **kwargs): - self.fillfactor = fillfactor - super().__init__(*expressions, **kwargs) - - def deconstruct(self): - path, args, kwargs = super().deconstruct() - if self.fillfactor is not None: - kwargs["fillfactor"] = self.fillfactor - return path, args, kwargs - - def get_with_params(self): - with_params = [] - if self.fillfactor is not None: - with_params.append("fillfactor = %d" % self.fillfactor) - return with_params - - -class SpGistIndex(PostgresIndex): - suffix = "spgist" - - def __init__(self, *expressions, fillfactor=None, **kwargs): - self.fillfactor = fillfactor - super().__init__(*expressions, **kwargs) - - def deconstruct(self): - path, args, kwargs = super().deconstruct() - if self.fillfactor is not None: - kwargs["fillfactor"] = self.fillfactor - return path, args, kwargs - - def get_with_params(self): - with_params = [] - if self.fillfactor is not None: - with_params.append("fillfactor = %d" % self.fillfactor) - return with_params - - -class OpClass(Func): - template = "%(expressions)s %(name)s" - constraint_validation_compatible = False - - def __init__(self, expression, name): - super().__init__(expression, name=name) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/jinja2/postgres/widgets/split_array.html b/.venv/lib/python3.10/site-packages/django/contrib/postgres/jinja2/postgres/widgets/split_array.html deleted file mode 100644 index 32fda82..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/jinja2/postgres/widgets/split_array.html +++ /dev/null @@ -1 +0,0 @@ -{% include 'django/forms/widgets/multiwidget.html' %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/af/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index 958440e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/af/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index a1177ee..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,103 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2019-2020,2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: F Wolff , 2019-2020,2024\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL-uitbreidings" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Item %(nth)s in die skikking kon nie valideer nie:" - -msgid "Nested arrays must have the same length." -msgstr "Geneste skikkings moet dieselfde lengte hê." - -msgid "Map of strings to strings/nulls" -msgstr "Woordeboek van stringe na stringe/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Die waarde “%(key)s” is nie 'n string of null nie." - -msgid "Could not load JSON data." -msgstr "Kon nie JSON-data laai nie." - -msgid "Input must be a JSON dictionary." -msgstr "Toevoer moet 'n JSON-woordeboek wees." - -msgid "Enter two valid values." -msgstr "Gee twee geldige waardes." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Die begin van die omvang mag nie die einde van die omvang oorskry nie." - -msgid "Enter two whole numbers." -msgstr "Tik twee heelgetalle in." - -msgid "Enter two numbers." -msgstr "Tik twee getalle in." - -msgid "Enter two valid date/times." -msgstr "Tik twee geldige datum/tydwaardes in." - -msgid "Enter two valid dates." -msgstr "Tik twee geldige datums in." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Lys bevat %(show_value)d item, maar moet hoogstens %(limit_value)d bevat." -msgstr[1] "" -"Lys bevat %(show_value)d items, maar moet hoogstens %(limit_value)d bevat." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Lys bevat %(show_value)d item, maar moet minstens %(limit_value)d bevat." -msgstr[1] "" -"Lys bevat %(show_value)d items, maar moet minstens %(limit_value)d bevat." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Sommige sleutels het ontbreek: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Sommige onbekende sleutels is voorsien: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Maak seker dat die omvang se bogrens nie groter as %(limit_value)s is nie." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Maak seker dat die omvang se ondergrens nie groter as %(limit_value)s is nie." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index e5e383d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index 5e0aad7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,131 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2015-2017 -# Muaaz Alsaied, 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "PostgreSQL extensions" -msgstr "ملحقات PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "العنصر %(nth)s في المتسلسلة لم يحقق التالي: " - -msgid "Nested arrays must have the same length." -msgstr "يجب أن تكون المجموعات المتداخلة بنفس الطول." - -msgid "Map of strings to strings/nulls" -msgstr "ترابط strings بـ strings/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "قيمة \"%(key)s\" ليست string أو null." - -msgid "Could not load JSON data." -msgstr "لا يمكن عرض بيانات JSON." - -msgid "Input must be a JSON dictionary." -msgstr "المُدخل يجب أن يكون بصيغة بصيغة قاموس JSON." - -msgid "Enter two valid values." -msgstr "إدخال قيمتين صالحتين." - -msgid "The start of the range must not exceed the end of the range." -msgstr "بداية المدى يجب ألا تتجاوز نهاية المدى." - -msgid "Enter two whole numbers." -msgstr "أدخل رقمين كاملين." - -msgid "Enter two numbers." -msgstr "أدخل رقمين." - -msgid "Enter two valid date/times." -msgstr "أدخل تاريخين/وقتين صحيحين." - -msgid "Enter two valid dates." -msgstr "أدخل تاريخين صحيحين." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." -msgstr[1] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." -msgstr[2] "" -"القائمة تحتوي على %(show_value)d عنصرين, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." -msgstr[3] "" -"القائمة تحتوي على %(show_value)d عناصر, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." -msgstr[4] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." -msgstr[5] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." -msgstr[1] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." -msgstr[2] "" -"القائمة تحتوي على %(show_value)d عنصرين, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." -msgstr[3] "" -"القائمة تحتوي على %(show_value)d عناصر, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." -msgstr[4] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." -msgstr[5] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "بعض المفاتيح مفقودة: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "بعض المفاتيح المزوّدة غير معرّفه: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "تأكد من أن هذا المدى أقل من أو يساوي %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "تأكد من أن هذا المدى أكثر من أو يساوي %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar_DZ/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index cd38cf9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar_DZ/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index 87021fe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,131 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Riterix , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "PostgreSQL extensions" -msgstr "ملحقات PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "العنصر %(nth)s في المجموعة لم يتم التحقق منه: " - -msgid "Nested arrays must have the same length." -msgstr "يجب أن تكون المجموعات المتداخلة بنفس الطول." - -msgid "Map of strings to strings/nulls" -msgstr "خريطة السلاسل إلى سلاسل / بلا قيم" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "قيمة \\\"%(key)s\\\" ليست سلسلة أو بلا قيمة." - -msgid "Could not load JSON data." -msgstr "لا يمكن عرض بيانات JSON." - -msgid "Input must be a JSON dictionary." -msgstr "المُدخل يجب أن يكون بصيغة بصيغة قاموس JSON." - -msgid "Enter two valid values." -msgstr "إدخال قيمتين صالحتين." - -msgid "The start of the range must not exceed the end of the range." -msgstr "بداية المدى يجب ألا تتجاوز نهاية المدى." - -msgid "Enter two whole numbers." -msgstr "أدخل رقمين كاملين." - -msgid "Enter two numbers." -msgstr "أدخل رقمين." - -msgid "Enter two valid date/times." -msgstr "أدخل تاريخين/وقتين صحيحين." - -msgid "Enter two valid dates." -msgstr "أدخل تاريخين صحيحين." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." -msgstr[1] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." -msgstr[2] "" -"القائمة تحتوي على %(show_value)d عنصرين, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." -msgstr[3] "" -"القائمة تحتوي على %(show_value)d عناصر, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." -msgstr[4] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." -msgstr[5] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." -msgstr[1] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." -msgstr[2] "" -"القائمة تحتوي على %(show_value)d عنصرين, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." -msgstr[3] "" -"القائمة تحتوي على %(show_value)d عناصر, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." -msgstr[4] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." -msgstr[5] "" -"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "بعض المفاتيح مفقودة: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "بعض المفاتيح المزوّدة غير معرّفه: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "تأكد من أن هذا المدى أقل من أو يساوي %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "تأكد من أن هذا المدى أكثر من أو يساوي %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index b6739d9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index 222c65c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,104 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Emin Mastizada , 2018,2020 -# Nijat Mammadov, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2024-08-07 09:22+0000\n" -"Last-Translator: Nijat Mammadov, 2024\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL uzantıları" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Massivdəki %(nth)s. element təsdiqlənə bilmir:" - -msgid "Nested arrays must have the same length." -msgstr "İç-içə massivlərin uzunluğu eyni olmalıdır." - -msgid "Map of strings to strings/nulls" -msgstr "Sətirlərin string/null dəyərlərə xəritələnmə cədvəli" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "“%(key)s” dəyəri string və ya null deyil." - -msgid "Could not load JSON data." -msgstr "JSON məlumat yüklənə bilmir." - -msgid "Input must be a JSON dictionary." -msgstr "Giriş JSON lüğət olmalıdır." - -msgid "Enter two valid values." -msgstr "İki düzgün dəyər daxil edin." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Aralığın başlanğıcı bitişindən böyük ola bilməz." - -msgid "Enter two whole numbers." -msgstr "İki tam rəqəm daxil edin." - -msgid "Enter two numbers." -msgstr "İki rəqəm daxil edin." - -msgid "Enter two valid date/times." -msgstr "İki düzgün tarix/vaxt daxil edin." - -msgid "Enter two valid dates." -msgstr "İki düzgün tarix daxil edin." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Siyahıda %(show_value)d element var, ən çox %(limit_value)d ola bilər." -msgstr[1] "" -"Siyahıda %(show_value)d element var, ən çox %(limit_value)d ola bilər." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Siyahıda %(show_value)d element var, ən az %(limit_value)d ola bilər." -msgstr[1] "" -"Siyahıda %(show_value)d element var, ən az %(limit_value)d ola bilər." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Bəzi açarlar əskikdir: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Bəzi bilinməyən açarlar təchiz edilib: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Aralığın yuxarı sərhədinin %(limit_value)s-dən/dan çox olmadığına əmin olun" - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Aralığın yuxarı sərhədinin %(limit_value)s-dən/dan az olmadığına əmin olun" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/be/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index cf342c7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/be/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index 6cafe79..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,120 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2015 -# znotdead , 2016-2017,2019,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: znotdead , 2016-2017,2019,2023\n" -"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "PostgreSQL extensions" -msgstr "Пашырэнні PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Элемент масіву нумар %(nth)s не прайшоў праверкі:" - -msgid "Nested arrays must have the same length." -msgstr "Укладзенныя масівы павінны мець аднолькавую даўжыню." - -msgid "Map of strings to strings/nulls" -msgstr "Адпаведнасць радкоў у радкі/нулі" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Значэнне “%(key)s” не з'яўляецца радком ці null." - -msgid "Could not load JSON data." -msgstr "Не атрымалася загрузіць дадзеныя JSON." - -msgid "Input must be a JSON dictionary." -msgstr "Значэнне павінна быць JSON слоўнікам. " - -msgid "Enter two valid values." -msgstr "Увядзіце два сапраўдных значэнні." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Пачатак дыяпазону не павінен перавышаць канец дыяпазону." - -msgid "Enter two whole numbers." -msgstr "Увядзіце два цэлых лікі." - -msgid "Enter two numbers." -msgstr "Увядзіце два лікі." - -msgid "Enter two valid date/times." -msgstr "Увядзіце дзве/два сапраўдных даты/часу." - -msgid "Enter two valid dates." -msgstr "Увядзіце дзве сапраўдных даты." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Спіс мае %(show_value)d элемент, ён павінен мець не болей чым " -"%(limit_value)d." -msgstr[1] "" -"Спіс мае %(show_value)d элемента, ён павінен мець не болей чым " -"%(limit_value)d." -msgstr[2] "" -"Спіс мае %(show_value)d элементаў, ён павінен мець не болей чым " -"%(limit_value)d." -msgstr[3] "" -"Спіс мае %(show_value)d элементаў, ён павінен мець не болей чым " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Спіс мае %(show_value)d элемент, ён павінен мець не менш чым %(limit_value)d." -msgstr[1] "" -"Спіс мае %(show_value)d элемента, ён павінен мець не менш чым " -"%(limit_value)d." -msgstr[2] "" -"Спіс мае %(show_value)d элементаў, ён павінен мець не менш чым " -"%(limit_value)d." -msgstr[3] "" -"Спіс мае %(show_value)d элементаў, ён павінен мець не менш чым " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Не хапае нейкіх ключоў: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Дадзены нейкія невядомыя ключы: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Пераканайцеся, што верхняя мяжа дыяпазону не перавышае %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Пераканайцеся, што ніжняя мяжа дыяпазону не менш за %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/bg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index 6a39b64..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/bg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index 1b25e0a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,110 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022-2023 -# Todor Lubenov , 2015 -# Venelin Stoykov , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-12-04 09:22+0000\n" -"Last-Translator: arneatec , 2022-2023\n" -"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL разширения" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Елемент %(nth)s в масива не се валидира:" - -msgid "Nested arrays must have the same length." -msgstr "Вложените масиви трябва да имат еднаква дължина." - -msgid "Map of strings to strings/nulls" -msgstr "Мап от стрингове към стрингове/null-ове" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Стойността на “%(key)s” не е стринг или null." - -msgid "Could not load JSON data." -msgstr "Не можа да зареди JSON данни." - -msgid "Input must be a JSON dictionary." -msgstr "Входните данни трябва да са JSON речник." - -msgid "Enter two valid values." -msgstr "Въведете две валидни стойности." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Началото на обхвата не трябва да превишава края му." - -msgid "Enter two whole numbers." -msgstr "Въведете две цели числа." - -msgid "Enter two numbers." -msgstr "Въведете две числа." - -msgid "Enter two valid date/times." -msgstr "Въведете две валидни дати/времена." - -msgid "Enter two valid dates." -msgstr "Въведете две коректни дати." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Списъкът съдържа %(show_value)d елемент, а трябва да има не повече от " -"%(limit_value)d." -msgstr[1] "" -"Списъкът съдържа %(show_value)d елемента, а трябва да има не повече от " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Списъкът съдържа %(show_value)d елемент, а трябва да има поне " -"%(limit_value)d." -msgstr[1] "" -"Списъкът съдържа %(show_value)d елемента, а трябва да има поне " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Някои ключове липсват: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Бяха предоставени някои неизвестни ключове: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Уверете се, че горната граница на диапазона не е по-голяма от " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Уверете се, че горната граница на диапазона не е по-малка от %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ca/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 3de632f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ca/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index 52d90b8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,112 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2015,2017 -# duub qnnp, 2015 -# Gil Obradors Via , 2019 -# Manel Clos , 2020 -# Roger Pons , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Extensions de PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "L'element %(nth)s de la matriu no s'ha pogut validar:" - -msgid "Nested arrays must have the same length." -msgstr "Les matrius niades han de tenir la mateixa longitud." - -msgid "Map of strings to strings/nulls" -msgstr "Mapa de cadenes a cadenes/nuls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "El valor de \"%(key)s\" no és ni una cadena ni un nul." - -msgid "Could not load JSON data." -msgstr "No es poden carregar les dades JSON" - -msgid "Input must be a JSON dictionary." -msgstr "L'entrada ha de ser un diccionari JSON" - -msgid "Enter two valid values." -msgstr "Introdueixi dos valors vàlids." - -msgid "The start of the range must not exceed the end of the range." -msgstr "L'inici del rang no pot excedir el seu final." - -msgid "Enter two whole numbers." -msgstr "Introduïu dos números enters positius." - -msgid "Enter two numbers." -msgstr "Introduïu dos números." - -msgid "Enter two valid date/times." -msgstr "Introduïu dues data/hora vàlides." - -msgid "Enter two valid dates." -msgstr "Introduïu dos dates vàlides." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"La llista conté %(show_value)d element, no n'hauria de tenir més de " -"%(limit_value)d." -msgstr[1] "" -"La llista conté %(show_value)d elements, no n'hauria de tenir més de " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"La llista conté %(show_value)d element, no n'hauria de contenir menys de " -"%(limit_value)d." -msgstr[1] "" -"La llista conté %(show_value)d elements, no n'hauria de contenir menys de " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Algunes claus no hi són: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "S'han facilitat claus desconegudes: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Asseguri's que aquest rang és completament menor o igual a %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Asseguri's que aquest rang és completament major o igual a %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index e5b798f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index 35664e9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,101 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Swara , 2022,2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2024-01-19 09:22+0000\n" -"Last-Translator: Swara , 2022,2024\n" -"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "پێوەکراوەکانی PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "بڕگەی%(nth)s لەناو ڕیزەکەدا پشتڕاست نەکراوەتەوە:" - -msgid "Nested arrays must have the same length." -msgstr "ڕیزی هێلانەکراو دەبێت هەمان درێژی هەبێت." - -msgid "Map of strings to strings/nulls" -msgstr "نەخشەی ده‌قه‌ڕیزبه‌ندەکان بۆ دەقەڕیزبەندەکان/بەتاڵەکان" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "بەهای “%(key)s” نە دەقەڕیزبەندە نە بەتاڵ." - -msgid "Could not load JSON data." -msgstr "نەتوانرا داتاکانی JSON باربکرێت." - -msgid "Input must be a JSON dictionary." -msgstr "دەرخواردە دەبێت فەرهەنگی JSON بێت." - -msgid "Enter two valid values." -msgstr "دوو بەهای دروست بنوسە." - -msgid "The start of the range must not exceed the end of the range." -msgstr "نابێت سەرەتای ڕێژەکە لە کۆتایی ڕێژەکە زیاتر بێت." - -msgid "Enter two whole numbers." -msgstr "دوو ژمارەی تەواو بنوسە." - -msgid "Enter two numbers." -msgstr "دوو ژمارە بنوسە." - -msgid "Enter two valid date/times." -msgstr "دوو بەروار/کاتی دروست بنوسە." - -msgid "Enter two valid dates." -msgstr "دوو بەرواری دروست بنوسە." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"لیست پێکدێت لە %(show_value)d بڕگە، دەبێت زیاتر نەبێت لە %(limit_value)d." -msgstr[1] "" -"لیست پێکدێت لە %(show_value)d بڕگە، دەبێت زیاتر نەبێت لە %(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"لیست پێکدێت لە %(show_value)d بڕگە، دەبێت کەمتر نەبێت لە %(limit_value)d." -msgstr[1] "" -"لیست پێکدێت لە %(show_value)d بڕگە، دەبێت کەمتر نەبێت لە %(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "هەندێک کلیل نەمابوون: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "هەندێک کلیلی نەناسراو دابین کران: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "دڵنیابە لەوەی کە سنووری سەرەوەی ڕێژەکە زیاتر نییە لە %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "دڵنیابە لەوەی کە سنووری خوارەوەی ڕێژەکە کەمتر نییە لە %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/cs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index c8e64ab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/cs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index ae65f5f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,119 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jiří Podhorecký , 2024 -# Tomáš Ehrlich , 2015 -# Vláďa Macek , 2015-2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2024-10-07 09:22+0000\n" -"Last-Translator: Jiří Podhorecký , 2024\n" -"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -msgid "PostgreSQL extensions" -msgstr "Rozšíření pro PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Položka č. %(nth)s v seznamu je neplatná:" - -msgid "Nested arrays must have the same length." -msgstr "Vnořená pole musejí mít stejnou délku." - -msgid "Map of strings to strings/nulls" -msgstr "Mapování řetězců na řetězce či hodnoty NULL" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Hodnota s klíčem \"%(key)s\" není řetězec ani NULL." - -msgid "Could not load JSON data." -msgstr "Data typu JSON nelze načíst." - -msgid "Input must be a JSON dictionary." -msgstr "Vstup musí být slovník formátu JSON." - -msgid "Enter two valid values." -msgstr "Zadejte dvě platné hodnoty." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Počáteční hodnota rozsahu nemůže být vyšší než koncová hodnota." - -msgid "Enter two whole numbers." -msgstr "Zadejte dvě celá čísla." - -msgid "Enter two numbers." -msgstr "Zadejte dvě čísla." - -msgid "Enter two valid date/times." -msgstr "Zadejte dvě platné hodnoty data nebo času." - -msgid "Enter two valid dates." -msgstr "Zadejte dvě platná data." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Seznam obsahuje %(show_value)d položku, ale neměl by obsahovat více než " -"%(limit_value)d." -msgstr[1] "" -"Seznam obsahuje %(show_value)d položky, ale neměl by obsahovat více než " -"%(limit_value)d." -msgstr[2] "" -"Seznam obsahuje %(show_value)d položek, ale neměl by obsahovat více než " -"%(limit_value)d." -msgstr[3] "" -"Seznam obsahuje %(show_value)d položek, ale neměl by obsahovat více než " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Seznam obsahuje %(show_value)d položku, ale neměl by obsahovat méně než " -"%(limit_value)d." -msgstr[1] "" -"Seznam obsahuje %(show_value)d položky, ale neměl by obsahovat méně než " -"%(limit_value)d." -msgstr[2] "" -"Seznam obsahuje %(show_value)d položek, ale neměl by obsahovat méně než " -"%(limit_value)d." -msgstr[3] "" -"Seznam obsahuje %(show_value)d položek, ale neměl by obsahovat méně než " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Některé klíče chybí: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Byly zadány neznámé klíče: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "Ujistěte se, že horní hranice rozsahu není větší než %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Ujistěte se, že spodní hranice rozsahu není menší než %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index 7991704..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index 268fd75..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,106 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Erik Ramsgaard Wognsen , 2023 -# Erik Ramsgaard Wognsen , 2015-2020 -# valberg , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Erik Ramsgaard Wognsen , 2023\n" -"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL-udvidelser" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Element %(nth)s i array'et blev ikke valideret:" - -msgid "Nested arrays must have the same length." -msgstr "Indlejrede arrays skal have den samme længde." - -msgid "Map of strings to strings/nulls" -msgstr "Afbildning fra strenge til strenge/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Værdien af “%(key)s” er ikke en streng eller null." - -msgid "Could not load JSON data." -msgstr "Kunne ikke indlæse JSON-data." - -msgid "Input must be a JSON dictionary." -msgstr "Input skal være et JSON-dictionary." - -msgid "Enter two valid values." -msgstr "Indtast to gyldige værdier." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Starten af intervallet kan ikke overstige slutningen af intervallet." - -msgid "Enter two whole numbers." -msgstr "Indtast to heltal." - -msgid "Enter two numbers." -msgstr "Indtast to tal." - -msgid "Enter two valid date/times." -msgstr "Indtast to gyldige dato/tider." - -msgid "Enter two valid dates." -msgstr "Indtast to gyldige datoer." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Listen indeholder %(show_value)d element, en bør ikke indeholde mere end " -"%(limit_value)d." -msgstr[1] "" -"Listen indeholder %(show_value)d elementer, den bør ikke indeholde mere end " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Listen indeholder %(show_value)d element, den bør ikke indeholde mindre end " -"%(limit_value)d." -msgstr[1] "" -"Listen indeholder %(show_value)d elementer, den bør ikke indeholde mindre " -"end %(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Nøgler mangler: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Ukendte nøgler angivet: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "Intervallets øvre grænse må ikke være større end %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Intervallets nedre grænse må ikke være mindre end %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/de/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index 8f40b1c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/de/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 6114f47..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,111 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Florian Apolloner , 2023 -# Jannis Leidel , 2015-2018,2020 -# Jens Neuhaus , 2016 -# Markus Holtermann , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Florian Apolloner , 2023\n" -"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL-Erweiterungen" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Element %(nth)s im Array konnte nicht validiert werden:" - -msgid "Nested arrays must have the same length." -msgstr "Verschachtelte Arrays müssen die gleiche Länge haben." - -msgid "Map of strings to strings/nulls" -msgstr "Zuordnung von Zeichenketten zu Zeichenketten/NULLs" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Der Wert für „%(key)s“ ist keine Zeichenkette oder NULL." - -msgid "Could not load JSON data." -msgstr "Konnte JSON-Daten nicht laden." - -msgid "Input must be a JSON dictionary." -msgstr "Eingabe muss ein JSON-Dictionary sein." - -msgid "Enter two valid values." -msgstr "Bitte zwei gültige Werte eingeben." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Der Anfang des Wertbereichs darf nicht das Ende überschreiten." - -msgid "Enter two whole numbers." -msgstr "Bitte zwei ganze Zahlen eingeben." - -msgid "Enter two numbers." -msgstr "Bitte zwei Zahlen eingeben." - -msgid "Enter two valid date/times." -msgstr "Bitte zwei gültige Datum/Uhrzeit-Werte eingeben." - -msgid "Enter two valid dates." -msgstr "Bitte zwei gültige Kalenderdaten eingeben." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Liste enthält %(show_value)d Element, es sollte aber nicht mehr als " -"%(limit_value)d enthalten." -msgstr[1] "" -"Liste enthält %(show_value)d Elemente, es sollte aber nicht mehr als " -"%(limit_value)d enthalten." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Liste enthält %(show_value)d Element, es sollte aber nicht weniger als " -"%(limit_value)d enthalten." -msgstr[1] "" -"Liste enthält %(show_value)d Elemente, es sollte aber nicht weniger als " -"%(limit_value)d enthalten." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Einige Werte fehlen: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Einige unbekannte Werte wurden eingegeben: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Bitte sicherstellen, dass die obere Grenze des Bereichs nicht größer als " -"%(limit_value)s ist." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Bitte sicherstellen, dass die untere Grenze des Bereichs nicht kleiner als " -"%(limit_value)s ist." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/dsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index d3902b9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/dsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index b165905..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,118 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016-2018,2020,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Michael Wolf , 2016-2018,2020,2023\n" -"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "PostgreSQL extensions" -msgstr "Rozšyrjenja PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Zapisk %(nth)sw pólnej wariabli njejo se wobkšuśił:" - -msgid "Nested arrays must have the same length." -msgstr "Zakašćikowane pólne wariable muse tu samsku dłujkosć měś." - -msgid "Map of strings to strings/nulls" -msgstr "Konwertěrowanje znamuškowych rjeśazkow do znamuškowych rjeśazkow/nulow" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Gódnota „%(key)s“ njejo znamuškowy rjeśazk abo null." - -msgid "Could not load JSON data." -msgstr "JSON-daty njejsu se zacytowaś dali." - -msgid "Input must be a JSON dictionary." -msgstr "Zapódaśe musy JSON-słownik byś." - -msgid "Enter two valid values." -msgstr "Zapódajśo dwě płaśiwej gódnośe." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Zachopjeńk wobcerka njesmějo kóńc wobcerka pśekšocyś." - -msgid "Enter two whole numbers." -msgstr "Zapódajśo dwě cełej licbje." - -msgid "Enter two numbers." -msgstr "Zapódajśo dwě licbje." - -msgid "Enter two valid date/times." -msgstr "Zapódajśo dwě płaśiwej datowej/casowej pódaśi." - -msgid "Enter two valid dates." -msgstr "Zapódajśo dwě płaśiwej datowej pódaśi." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Lisćina wopśimujo %(show_value)d element, wóna njeby dejała wěcej ako " -"%(limit_value)d wopśimowaś." -msgstr[1] "" -"Lisćina wopśimujo %(show_value)d elementa, wóna njeby dejała wěcej ako " -"%(limit_value)d wopśimowaś." -msgstr[2] "" -"Lisćina wopśimujo %(show_value)d elementy, wóna njeby dejała wěcej ako " -"%(limit_value)d wopśimowaś." -msgstr[3] "" -"Lisćina wopśimujo %(show_value)d elementow, wóna njeby dejała wěcej ako " -"%(limit_value)d wopśimowaś." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Lisćina wopśimujo %(show_value)d element, wóna njeby dejała mjenjej ako " -"%(limit_value)d wopśimowaś." -msgstr[1] "" -"Lisćina wopśimujo %(show_value)d elementa, wóna njeby dejała mjenjej ako " -"%(limit_value)d wopśimowaś." -msgstr[2] "" -"Lisćina wopśimujo %(show_value)d elementy, wóna njeby dejała mjenjej ako " -"%(limit_value)d wopśimowaś." -msgstr[3] "" -"Lisćina wopśimujo %(show_value)d elementow, wóna njeby dejała mjenjej ako " -"%(limit_value)d wopśimowaś." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Někotare kluce feluju: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Někotare njeznate kluce su se pódali: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "Zawěsććo, až górna granica wobceŕka njejo wětša ako %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Zawěsććo, až dolna granica wobceŕka njejo mjeńša ako %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/el/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index baa62ce..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/el/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index 5996c4e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,111 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fotis Athineos , 2021 -# Giannis Meletakis , 2015 -# Nick Mavrakis , 2017-2018 -# Nick Mavrakis , 2016 -# Pãnoș , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2021-08-04 06:26+0000\n" -"Last-Translator: Fotis Athineos \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Επεκτάσεις της PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "To στοιχείο %(nth)s στον πίνακα δεν είναι έγκυρο:" - -msgid "Nested arrays must have the same length." -msgstr "Οι ένθετοι πίνακες πρέπει να έχουν το ίδιο μήκος." - -msgid "Map of strings to strings/nulls" -msgstr "Αντιστοίχιση strings σε strings/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Η τιμή του “%(key)s“ δεν είναι string ή null." - -msgid "Could not load JSON data." -msgstr "Αδύνατη η φόρτωση των δεδομένων JSON." - -msgid "Input must be a JSON dictionary." -msgstr "Το input πρέπει να είναι ένα έγκυρο JSON dictionary." - -msgid "Enter two valid values." -msgstr "Εισάγετε δύο έγκυρες τιμές." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Η αρχή του range δεν πρέπει να ξεπερνά το τέλος του range." - -msgid "Enter two whole numbers." -msgstr "Εισάγετε δυο ολόκληρους αριθμούς." - -msgid "Enter two numbers." -msgstr "Εισάγετε δυο αριθμούς." - -msgid "Enter two valid date/times." -msgstr "Εισάγετε δύο έγκυρες ημερομηνίες/ώρες." - -msgid "Enter two valid dates." -msgstr "Εισάγετε δυο έγκυρες ημερομηνίες." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Η λίστα περιέχει %(show_value)d στοιχείο και δεν πρέπει να περιέχει πάνω από " -"%(limit_value)d." -msgstr[1] "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Η λίστα περιέχει %(show_value)d στοιχεία και δεν πρέπει να περιέχει λιγότερα " -"από %(limit_value)d." -msgstr[1] "" -"Η λίστα περιέχει %(show_value)d στοιχεία και δεν πρέπει να περιέχει λιγότερα " -"από %(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Έλειπαν μερικά κλειδιά: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Δόθηκαν μέρικά άγνωστα κλειδιά: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Βεβαιωθείτε ότι το range είναι αυστηρά μικρότερο ή ίσο από %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Βεβαιωθείτε ότι το range είναι αυστηρά μεγαλύτερο ή ίσο από %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 08a7b68..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index eaf0ad7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,114 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2015-01-18 20:56+0100\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: contrib/postgres/apps.py:54 -msgid "PostgreSQL extensions" -msgstr "" - -#: contrib/postgres/fields/array.py:21 contrib/postgres/forms/array.py:17 -#: contrib/postgres/forms/array.py:185 -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -#: contrib/postgres/fields/array.py:22 -msgid "Nested arrays must have the same length." -msgstr "" - -#: contrib/postgres/fields/hstore.py:15 -msgid "Map of strings to strings/nulls" -msgstr "" - -#: contrib/postgres/fields/hstore.py:17 -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -#: contrib/postgres/forms/hstore.py:17 -msgid "Could not load JSON data." -msgstr "" - -#: contrib/postgres/forms/hstore.py:18 -msgid "Input must be a JSON dictionary." -msgstr "" - -#: contrib/postgres/forms/ranges.py:42 -msgid "Enter two valid values." -msgstr "" - -#: contrib/postgres/forms/ranges.py:44 -msgid "The start of the range must not exceed the end of the range." -msgstr "" - -#: contrib/postgres/forms/ranges.py:99 -msgid "Enter two whole numbers." -msgstr "" - -#: contrib/postgres/forms/ranges.py:105 -msgid "Enter two numbers." -msgstr "" - -#: contrib/postgres/forms/ranges.py:111 -msgid "Enter two valid date/times." -msgstr "" - -#: contrib/postgres/forms/ranges.py:117 -msgid "Enter two valid dates." -msgstr "" - -#: contrib/postgres/validators.py:15 -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#: contrib/postgres/validators.py:25 -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#: contrib/postgres/validators.py:38 -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "" - -#: contrib/postgres/validators.py:39 -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" - -#: contrib/postgres/validators.py:81 -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" - -#: contrib/postgres/validators.py:90 -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en_AU/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index 1ac0ada..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en_AU/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index cdae855..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,109 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2021-04-11 13:16+0000\n" -"Last-Translator: Tom Fifield \n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL extensions" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Item %(nth)s in the array did not validate:" - -msgid "Nested arrays must have the same length." -msgstr "Nested arrays must have the same length." - -msgid "Map of strings to strings/nulls" -msgstr "Map of strings to strings/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "The value of “%(key)s” is not a string or null." - -msgid "Could not load JSON data." -msgstr "Could not load JSON data." - -msgid "Input must be a JSON dictionary." -msgstr "Input must be a JSON dictionary." - -msgid "Enter two valid values." -msgstr "Enter two valid values." - -msgid "The start of the range must not exceed the end of the range." -msgstr "The start of the range must not exceed the end of the range." - -msgid "Enter two whole numbers." -msgstr "Enter two whole numbers." - -msgid "Enter two numbers." -msgstr "Enter two numbers." - -msgid "Enter two valid date/times." -msgstr "Enter two valid date/times." - -msgid "Enter two valid dates." -msgstr "Enter two valid dates." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgstr[1] "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgstr[1] "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Some keys were missing: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Some unknown keys were provided: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Ensure that this range is completely less than or equal to %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eo/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index 2126b26..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eo/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index e21c5a7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,109 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Baptiste Darthenay , 2015-2017,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL kromaĵoj" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Elemento %(nth)s en la tabelo ne estas valida:" - -msgid "Nested arrays must have the same length." -msgstr "Ingitaj tabeloj devas havi la saman grandon." - -msgid "Map of strings to strings/nulls" -msgstr "Kongruo de signoĉenoj al signoĉenoj/nulvaloroj" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "Malsukcesis ŝarĝi la JSON datumojn." - -msgid "Input must be a JSON dictionary." -msgstr "La enigo devas esti JSON vortaro." - -msgid "Enter two valid values." -msgstr "Enigu du validajn valorojn." - -msgid "The start of the range must not exceed the end of the range." -msgstr "La komenco de la intervalo ne devas superi la finon de la intervalo." - -msgid "Enter two whole numbers." -msgstr "Enigu du entjeroj." - -msgid "Enter two numbers." -msgstr "Enigu du nombroj." - -msgid "Enter two valid date/times." -msgstr "Enigu du validajn dato/horojn." - -msgid "Enter two valid dates." -msgstr "Enigu du validajn datojn." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"La listo enhavas %(show_value)d eron, kaj ne devas enhavi pli ol " -"%(limit_value)d." -msgstr[1] "" -"La listo enhavas %(show_value)d erojn, kaj ne devas enhavi pli ol " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"La listo enhavas %(show_value)d erojn, kaj devas enhavi pli ol " -"%(limit_value)d." -msgstr[1] "" -"La listo enhavas %(show_value)d erojn, kaj devas enhavi pli ol " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Kelkaj ŝlosiloj mankas: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Kelkaj nekonataj ŝlosiloj estis provizitaj: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Bv kontroli, ke la tuta intervalo estas malpli alta aŭ egala al " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Bv kontroli, ke la tuta intervalo estas pli alta aŭ egala al %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 120367b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 7af29ed..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,121 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2015,2017 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2015 -# Ignacio José Lizarán Rus , 2019 -# Igor Támara , 2015 -# Pablo, 2015 -# Uriel Medina , 2020,2023 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Uriel Medina , 2020,2023\n" -"Language-Team: Spanish (http://www.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Extensiones de PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "El elemento %(nth)s del arreglo no se pudo validar:" - -msgid "Nested arrays must have the same length." -msgstr "Los arreglos anidados deben tener la misma longitud." - -msgid "Map of strings to strings/nulls" -msgstr "Mapa de cadenas a cadenas/nulos" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "El valor de “%(key)s” no es una cadena ni es nulo." - -msgid "Could not load JSON data." -msgstr "No se pududieron cargar los datos JSON." - -msgid "Input must be a JSON dictionary." -msgstr "La entrada debe ser un diccionario JSON" - -msgid "Enter two valid values." -msgstr "Introduzca dos valores válidos." - -msgid "The start of the range must not exceed the end of the range." -msgstr "El comienzo del rango no puede exceder su final." - -msgid "Enter two whole numbers." -msgstr "Ingrese dos números enteros." - -msgid "Enter two numbers." -msgstr "Ingrese dos números." - -msgid "Enter two valid date/times." -msgstr "Ingrese dos fechas/horas válidas." - -msgid "Enter two valid dates." -msgstr "Ingrese dos fechas válidas." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"La lista contiene %(show_value)d elemento, no debería contener más de " -"%(limit_value)d." -msgstr[1] "" -"La lista contiene %(show_value)d elementos, no debería contener más de " -"%(limit_value)d." -msgstr[2] "" -"La lista contiene %(show_value)d elementos, no debería contener más de " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"La lista contiene %(show_value)d elemento, no debería contener menos de " -"%(limit_value)d." -msgstr[1] "" -"La lista contiene %(show_value)d elementos, no debería contener menos de " -"%(limit_value)d." -msgstr[2] "" -"La lista contiene %(show_value)d elementos, no debería contener menos de " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Faltan algunas claves: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Se facilitaron algunas claves desconocidas: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Asegúrese de que el límite superior del rango no sea mayor que " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Asegúrese de que el límite inferior del rango no sea inferior a " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index fa3e3bd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 8125696..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,115 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ramiro Morales, 2015-2019,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-12-04 09:22+0000\n" -"Last-Translator: Ramiro Morales, 2015-2019,2023\n" -"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Extensiones PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "La validación del ítem %(nth)s del arreglo falló:" - -msgid "Nested arrays must have the same length." -msgstr "Los arreglos anidados deben ser de la misma longitud." - -msgid "Map of strings to strings/nulls" -msgstr "Mapa de cadenas a cadenas/nulos" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "El valor de \"%(key)s” no es una cadena o nulo." - -msgid "Could not load JSON data." -msgstr "No se han podido cargar los datos JSON." - -msgid "Input must be a JSON dictionary." -msgstr "debe ser un diccionario JSON." - -msgid "Enter two valid values." -msgstr "Introduzca dos valores válidos." - -msgid "The start of the range must not exceed the end of the range." -msgstr "El inicio del rango no debe ser mayor que el fin del rango." - -msgid "Enter two whole numbers." -msgstr "Introduzca dos números enteros." - -msgid "Enter two numbers." -msgstr "Introduzca dos números." - -msgid "Enter two valid date/times." -msgstr "Introduzca dos fechas/horas válidas." - -msgid "Enter two valid dates." -msgstr "Introduzca dos fechas válidas." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"La lista contiene %(show_value)d ítem, debe contener no mas de " -"%(limit_value)d." -msgstr[1] "" -"La lista contiene %(show_value)d ítems, debe contener no mas de " -"%(limit_value)d." -msgstr[2] "" -"La lista contiene %(show_value)d ítems, debe contener no mas de " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"La lista contiene %(show_value)d ítem, debe contener no mas de " -"%(limit_value)d." -msgstr[1] "" -"La lista contiene %(show_value)d ítems, debe contener no menos de " -"%(limit_value)d." -msgstr[2] "" -"La lista contiene %(show_value)d ítems, debe contener no menos de " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "No se encontraron algunas llaves: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Algunas de las llaves provistas son desconocidas: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Asegúrese de que el límite superior del rango no sea mayor que " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Asegúrese de que el límite inferior del rango no sea menor que " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index 927d16a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index 1b8157f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,112 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2015 -# Ernesto Avilés, 2015 -# Igor Támara , 2015 -# Pablo, 2015 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Extensiones de PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "Los arreglos anidados deben tener la misma longitud." - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "No se pududieron cargar los datos JSON." - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "Ingrese dos valores válidos." - -msgid "The start of the range must not exceed the end of the range." -msgstr "El comienzo del rango no puede exceder su final." - -msgid "Enter two whole numbers." -msgstr "Ingrese dos números enteros." - -msgid "Enter two numbers." -msgstr "Ingrese dos números." - -msgid "Enter two valid date/times." -msgstr "Ingrese dos fechas/horas válidas." - -msgid "Enter two valid dates." -msgstr "Ingrese dos fechas válidas." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"La lista contiene %(show_value)d elemento, no debería contener más de " -"%(limit_value)d." -msgstr[1] "" -"La lista contiene %(show_value)d elementos, no debería contener más de " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"La lista contiene %(show_value)d elemento, no debería contener menos de " -"%(limit_value)d." -msgstr[1] "" -"La lista contiene %(show_value)d elementos, no debería contener menos de " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Faltan algunas claves: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Se facilitaron algunas claves desconocidas: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este rango es menor o igual que %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Asegúrese de que este rango es efectivamente mayor o igual que " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index 294ebd2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index cf16864..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,98 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Alex Dzul , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Extensiones PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "" - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "" - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "Ingrese dos valores válidos" - -msgid "The start of the range must not exceed the end of the range." -msgstr "" - -msgid "Enter two whole numbers." -msgstr "" - -msgid "Enter two numbers." -msgstr "Ingrese dos números" - -msgid "Enter two valid date/times." -msgstr "" - -msgid "Enter two valid dates." -msgstr "Ingrese dos fechas válidas" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/et/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index e912083..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/et/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index 6c3e66c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,111 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martin Pajuste , 2015 -# Martin Pajuste , 2017 -# Marti Raudsepp , 2015-2016 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Estonian (http://www.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL laiendused" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Element %(nth)s massiivis pole korrektne:" - -msgid "Nested arrays must have the same length." -msgstr "Mitmemõõtmelised massiivid peavad olema sama pikad." - -msgid "Map of strings to strings/nulls" -msgstr "Teisendus sõnedest sõnedeks/tühjadeks" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Võtme “%(key)s” väärtus ei ole sõne ega tühi." - -msgid "Could not load JSON data." -msgstr "Ei saanud laadida JSON andmeid." - -msgid "Input must be a JSON dictionary." -msgstr "Sisend peab olema JSON sõnastik." - -msgid "Enter two valid values." -msgstr "Sisesta kaks korrektset väärtust." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Vahemiku algus ei või olla suurem kui vahemiku lõpp." - -msgid "Enter two whole numbers." -msgstr "Sisesta kaks täisarvu." - -msgid "Enter two numbers." -msgstr "Sisesta kaks arvu." - -msgid "Enter two valid date/times." -msgstr "Sisesta kaks korrektset kuupäeva ja kellaaega." - -msgid "Enter two valid dates." -msgstr "Sisesta kaks korrektset kuupäeva." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Nimekiri sisaldab %(show_value)d elementi, ei tohiks olla rohkem kui " -"%(limit_value)d." -msgstr[1] "" -"Nimekiri sisaldab %(show_value)d elementi, ei tohiks olla rohkem kui " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Nimekiri sisaldab %(show_value)d elementi, ei tohiks olla vähem kui " -"%(limit_value)d." -msgstr[1] "" -"Nimekiri sisaldab %(show_value)d elementi, ei tohiks olla vähem kui " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Puuduvad võtmeväärtused: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Tundmatud võtmeväärtused: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Veendu, et see vahemik on täielikult väiksem või võrdne kui %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Veendu, et see vahemik on täielikult suurem või võrdne kui %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index 776c2f4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index 89b8acb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,108 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eneko Illarramendi , 2017-2018 -# Urtzi Odriozola , 2017,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2021-03-18 15:48+0000\n" -"Last-Translator: Urtzi Odriozola \n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL hedapenak" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Array-ko %(nth)s elementua ez da balekoa:" - -msgid "Nested arrays must have the same length." -msgstr "Array habiaratuek luzera bera izan behar dute." - -msgid "Map of strings to strings/nulls" -msgstr "String-etik string/null-era mapa" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "”%(key)s”-ren balioa ez da string bat, edo null." - -msgid "Could not load JSON data." -msgstr "Ezin izan dira JSON datuak kargatu." - -msgid "Input must be a JSON dictionary." -msgstr "Sarrera JSON hiztegi bat izan behar da." - -msgid "Enter two valid values." -msgstr "Idatzi bi baleko balio." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Tartearen hasierak ezin du amaierako tartearen balioa gainditu." - -msgid "Enter two whole numbers." -msgstr "Idatzi bi zenbaki oso." - -msgid "Enter two numbers." -msgstr "Idatzi bi zenbaki." - -msgid "Enter two valid date/times." -msgstr "Idatzi bi baleko data/ordu." - -msgid "Enter two valid dates." -msgstr "Idatzi bi baleko data." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Zerrendak elementu %(show_value)d du, ez lituzke %(limit_value)dbaino " -"gehiago izan behar." -msgstr[1] "" -"Zerrendak %(show_value)d elementu ditu, ez lituzke %(limit_value)d baino " -"gehiago izan behar." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Zerrendak elementu %(show_value)d du, ez lituzke %(limit_value)d baino " -"gutxiago izan behar." -msgstr[1] "" -"Zerrendak %(show_value)d elementu ditu, ez lituzke %(limit_value)d baino " -"gutxiago izan behar." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Gako batzuk falta dira: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Gako ezezagun batzuk eman dira: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Ziurtatu guztiz tarte hau %(limit_value)s baino txikiagoa edo berdina dela." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Ziurtatu guztiz tarte hau %(limit_value)s baino handiagoa edo berdina dela." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index 26bd1e5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index e9b404e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,108 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Nikneshan , 2015 -# MJafar Mashhadi , 2018 -# Mohammad Hossein Mojtahedi , 2016 -# Pouya Abbassi, 2016 -# rahim agh , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-27 09:32+0000\n" -"Last-Translator: rahim agh \n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "PostgreSQL extensions" -msgstr "ملحقات Postgres" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "عضو %(nth)sم آرایه معتبر نیست:" - -msgid "Nested arrays must have the same length." -msgstr "آرایه های تو در تو باید هم سایز باشند" - -msgid "Map of strings to strings/nulls" -msgstr "نگاشتی از رشته به رشته/هیچمقدار" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "مقدار \"%(key)s\" یک رشته حرفی یا null نیست." - -msgid "Could not load JSON data." -msgstr "امکان بارگزاری داده های JSON نیست." - -msgid "Input must be a JSON dictionary." -msgstr "مقدار ورودی باید یک دیکشنری JSON باشد." - -msgid "Enter two valid values." -msgstr "دو مقدار معتبر وارد کنید" - -msgid "The start of the range must not exceed the end of the range." -msgstr "مقدار شروع بازه باید از پایان کوچکتر باشد" - -msgid "Enter two whole numbers." -msgstr "دو عدد کامل وارد کنید" - -msgid "Enter two numbers." -msgstr "دو عدد وارد کنید" - -msgid "Enter two valid date/times." -msgstr "دو تاریخ/ساعت معتبر وارد کنید" - -msgid "Enter two valid dates." -msgstr "دو تاریخ معتبر وارد کنید" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"لیست شامل %(show_value)d مورد است. ولی باید حداکثر شامل %(limit_value)d مورد " -"باشد." -msgstr[1] "" -"لیست شامل %(show_value)d مورد است. ولی باید حداکثر شامل %(limit_value)d مورد " -"باشد." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"لیست شامل %(show_value)d است، نباید کمتر از %(limit_value)d را شامل شود." -msgstr[1] "" -"لیست شامل %(show_value)d است، نباید کمتر از %(limit_value)d را شامل شود." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "برخی کلیدها یافت نشدند: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "برخی کلیدهای ارائه شده ناشناخته‌اند: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "اطمیمنان حاصل کنید که این رنج، کوچکتر یا برابر با %(limit_value)s است." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "اطمینان حاصل کنید که رنج، بزرگتر یا برابر با %(limit_value)s است." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index ed32da1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index df9150e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,105 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2017,2020,2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Aarni Koskela, 2015,2017,2020,2025\n" -"Language-Team: Finnish (http://app.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL-laajennukset" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Taulukon %(nth)s alkio ei ole kelvollinen:" - -msgid "Nested arrays must have the same length." -msgstr "Sisäkkäisillä taulukoilla tulee olla sama pituus." - -msgid "Map of strings to strings/nulls" -msgstr "Kartta merkkijonoista merkkijonoihin tai tyhjiin (null)" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Avaimen \"%(key)s\" arvo ei ole merkkijono tai tyhjä (null)." - -msgid "Could not load JSON data." -msgstr "JSON-dataa ei voitu ladata." - -msgid "Input must be a JSON dictionary." -msgstr "Syötteen tulee olla JSON-sanakirja." - -msgid "Enter two valid values." -msgstr "Anna kaksi oikeaa arvoa." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Alueen alku pitää olla pienempi kuin alueen loppu." - -msgid "Enter two whole numbers." -msgstr "Anna kaksi kokonaislukua." - -msgid "Enter two numbers." -msgstr "Anna kaksi lukua." - -msgid "Enter two valid date/times." -msgstr "Anna kaksi oikeaa päivämäärää/kellonaikaa." - -msgid "Enter two valid dates." -msgstr "Anna kaksi oikeaa päivämäärää." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Listassa on %(show_value)d arvo, mutta siinä ei saa olla enempää kuin " -"%(limit_value)d." -msgstr[1] "" -"Listassa on %(show_value)d arvoa, mutta siinä ei saa olla enempää kuin " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Listassa on %(show_value)d arvo, mutta siinä ei saa olla vähempää kuin " -"%(limit_value)d arvoa." -msgstr[1] "" -"Listassa on %(show_value)d arvoa, mutta siinä ei saa olla vähempää kuin " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Joitain avaimia puuttuu: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Tuntemattomia avaimia annettiin: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "Tämän alueen yläraja ei tule olla suurempi kuin %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Tämän alueen alaraja ei tule olla pienempi kuin %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index b4230ed..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index a0e4724..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,114 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2015-2019,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Claude Paroz , 2015-2019,2023\n" -"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Extensions PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "L'élément n°%(nth)s du tableau n’est pas valide :" - -msgid "Nested arrays must have the same length." -msgstr "Les tableaux imbriqués doivent être de même longueur." - -msgid "Map of strings to strings/nulls" -msgstr "Correspondances clé/valeur (chaînes ou valeurs nulles)" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "La valeur de « %(key)s » n’est pas une chaîne, ni une valeur nulle." - -msgid "Could not load JSON data." -msgstr "Impossible de charger les données JSON." - -msgid "Input must be a JSON dictionary." -msgstr "Le contenu saisi doit être un dictionnaire JSON." - -msgid "Enter two valid values." -msgstr "Saisissez deux valeurs valides." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Le début de l’intervalle ne peut pas dépasser la fin de l'intervalle." - -msgid "Enter two whole numbers." -msgstr "Saisissez deux nombres entiers." - -msgid "Enter two numbers." -msgstr "Saisissez deux nombres." - -msgid "Enter two valid date/times." -msgstr "Saisissez deux dates/heures valides." - -msgid "Enter two valid dates." -msgstr "Saisissez deux dates valides." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"La liste contient %(show_value)d élément, mais elle ne devrait pas en " -"contenir plus de %(limit_value)d." -msgstr[1] "" -"La liste contient %(show_value)d éléments, mais elle ne devrait pas en " -"contenir plus de %(limit_value)d." -msgstr[2] "" -"La liste contient %(show_value)d éléments, mais elle ne devrait pas en " -"contenir plus de %(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"La liste contient %(show_value)d élément, mais elle doit en contenir au " -"moins %(limit_value)d." -msgstr[1] "" -"La liste contient %(show_value)d éléments, mais elle doit en contenir au " -"moins %(limit_value)d." -msgstr[2] "" -"La liste contient %(show_value)d éléments, mais elle doit en contenir au " -"moins %(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Certaines clés sont manquantes : %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Certaines clés inconnues ont été fournies : %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"S’assure que la limite supérieure de l’intervalle n’est pas plus grande que " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"S’assure que la limite inférieure de l’intervalle n’est pas plus petite que " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ga/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index 0f8fe8b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ga/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index 45babc8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,125 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2024-10-07 09:22+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -msgid "PostgreSQL extensions" -msgstr "Eisínteachtaí PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Níor bhailíochtaigh mír %(nth)s san eagar:" - -msgid "Nested arrays must have the same length." -msgstr "Caithfidh an fad céanna a bheith ag eagair neadaithe." - -msgid "Map of strings to strings/nulls" -msgstr "Léarscáil de theaghráin go teaghráin/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Ní teaghrán nó null é luach “%(key)s”." - -msgid "Could not load JSON data." -msgstr "Níorbh fhéidir sonraí JSON a lódáil." - -msgid "Input must be a JSON dictionary." -msgstr "Ní mór gur foclóir JSON é an t-ionchur." - -msgid "Enter two valid values." -msgstr "Cuir isteach dhá luach bhailí." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Ní fhéadfaidh tús an raoin a bheith níos mó ná deireadh an raoin." - -msgid "Enter two whole numbers." -msgstr "Cuir isteach dhá slánuimhir." - -msgid "Enter two numbers." -msgstr "Cuir isteach dhá uimhir." - -msgid "Enter two valid date/times." -msgstr "Cuir isteach dhá dháta bhailí." - -msgid "Enter two valid dates." -msgstr "Cuir isteach dhá dháta bhailí." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Tá %(show_value)d mír ar an liosta, níor cheart go mbeadh níos mó ná " -"%(limit_value)d ann." -msgstr[1] "" -"Tá %(show_value)d míreanna ar an liosta, níor cheart go mbeadh níos mó ná " -"%(limit_value)d ann." -msgstr[2] "" -"Tá %(show_value)d míreanna ar an liosta, níor cheart go mbeadh níos mó ná " -"%(limit_value)d ann." -msgstr[3] "" -"Tá %(show_value)d míreanna ar an liosta, níor cheart go mbeadh níos mó ná " -"%(limit_value)d ann." -msgstr[4] "" -"Tá %(show_value)d míreanna ar an liosta, níor cheart go mbeadh níos mó ná " -"%(limit_value)d ann." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Tá %(show_value)d mír ar an liosta, níor cheart go mbeadh níos lú ná " -"%(limit_value)d ann." -msgstr[1] "" -"Tá %(show_value)d míreanna ar an liosta, níor cheart go mbeadh níos lú ná " -"%(limit_value)d ann." -msgstr[2] "" -"Tá %(show_value)d míreanna ar an liosta, níor cheart go mbeadh níos lú ná " -"%(limit_value)d ann." -msgstr[3] "" -"Tá %(show_value)d míreanna ar an liosta, níor cheart go mbeadh níos lú ná " -"%(limit_value)d ann." -msgstr[4] "" -"Tá %(show_value)d míreanna ar an liosta, níor cheart go mbeadh níos lú ná " -"%(limit_value)d ann." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Bhí roinnt eochracha ar iarraidh: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Soláthraíodh roinnt eochracha anaithnid: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Cinntigh nach bhfuil teorainn uachtarach an raoin níos mó ná %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Cinntigh nach bhfuil teorainn íochtair an raoin níos lú ná %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gd/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index 9e8b0fd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gd/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index 29b9050..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,125 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2016-2017 -# GunChleoc, 2015 -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -msgid "PostgreSQL extensions" -msgstr "Leudachain PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Cha deach le dearbhadh an nì %(nth)s san arraigh:" - -msgid "Nested arrays must have the same length." -msgstr "Feumaidh an aon fhaid a bhith aig a h-uile arraigh neadaichte." - -msgid "Map of strings to strings/nulls" -msgstr "Mapaichean de shreangan gu sreangan/luachan null" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Chan eil an luach air %(key)s ’na shreang no null." - -msgid "Could not load JSON data." -msgstr "Cha deach leinn dàta JSON a luchdadh." - -msgid "Input must be a JSON dictionary." -msgstr "Feumaidh an t-ion-chur a bhith 'na fhaclair JSON." - -msgid "Enter two valid values." -msgstr "Cuir a-steach dà luach dligheach." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Chan fhaod toiseach na rainse a bith nas motha na deireadh na rainse." - -msgid "Enter two whole numbers." -msgstr "Cuir a-steach dà àireamh shlàn." - -msgid "Enter two numbers." -msgstr "Cuir a-steach dà àireamh." - -msgid "Enter two valid date/times." -msgstr "Cuir a-steach dà cheann-là ’s àm dligheach." - -msgid "Enter two valid dates." -msgstr "Cuir a-steach dà cheann-là dligheach." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Tha %(show_value)d nì air an liosta ach cha bu chòir corr is %(limit_value)d " -"a bhith oirre." -msgstr[1] "" -"Tha %(show_value)d nì air an liosta ach cha bu chòir corr is %(limit_value)d " -"a bhith oirre." -msgstr[2] "" -"Tha %(show_value)d nithean air an liosta ach cha bu chòir corr is " -"%(limit_value)d a bhith oirre." -msgstr[3] "" -"Tha %(show_value)d nì air an liosta ach cha bu chòir corr is %(limit_value)d " -"a bhith oirre." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Tha %(show_value)d nì air an liosta ach cha bu chòir nas lugha na " -"%(limit_value)d a bhith oirre." -msgstr[1] "" -"Tha %(show_value)d nì air an liosta ach cha bu chòir nas lugha na " -"%(limit_value)d a bhith oirre." -msgstr[2] "" -"Tha %(show_value)d nithean air an liosta ach cha bu chòir nas lugha na " -"%(limit_value)d a bhith oirre." -msgstr[3] "" -"Tha %(show_value)d nì air an liosta ach cha bu chòir nas lugha na " -"%(limit_value)d a bhith oirre." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Bha cuid a dh’iuchraichean a dhìth: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Chaidh iuchraichean nach aithne dhuinn a shònrachadh: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Dèan cinnteach gu bheil an rainse seo nas lugha na no co-ionnan ri " -"%(limit_value)s air fad." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Dèan cinnteach gu bheil an rainse seo nas motha na no co-ionnan ri " -"%(limit_value)s air fad." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index c90b428..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index 0fb8d3b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,108 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# fasouto , 2017 -# X Bello , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: X Bello , 2023\n" -"Language-Team: Galician (http://www.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Extensión de PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "O %(nth)s elemento do array non validóu:" - -msgid "Nested arrays must have the same length." -msgstr "Os arrais aniñados teñen que ter a mesma lonxitude." - -msgid "Map of strings to strings/nulls" -msgstr "Mapeo de strings a strings/nulos" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "O valor de “%(key)s” non é un string ou nulo." - -msgid "Could not load JSON data." -msgstr "Non se puderon cargar os datos JSON." - -msgid "Input must be a JSON dictionary." -msgstr "A entrada ten que ser un diccionario JSON." - -msgid "Enter two valid values." -msgstr "Introduza dous valores válidos." - -msgid "The start of the range must not exceed the end of the range." -msgstr "O comezo do rango non pode superar o fin do rango." - -msgid "Enter two whole numbers." -msgstr "Introduza dous números completos." - -msgid "Enter two numbers." -msgstr "Insira dous números." - -msgid "Enter two valid date/times." -msgstr "Insira dúas datas/horas válidas." - -msgid "Enter two valid dates." -msgstr "Insira dúas datas válidas." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"A lista contén %(show_value)d elemento, non debería conter máis de " -"%(limit_value)d." -msgstr[1] "" -"A lista contén %(show_value)d elementos, non debería conter máis de " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"A lista contén %(show_value)d elemento, non debería conter menos de " -"%(limit_value)d." -msgstr[1] "" -"A lista contén %(show_value)d elementos, non debería conter menos de " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Faltan algunhas chaves: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Facilitáronse algunhas chaves descoñecidas: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Asegúrese de que o límite superior do rango non é maior que %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Asegúrese de que o límite inferior do rango non é menor que %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/he/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index 30f0e16..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/he/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index c59ea67..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,110 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Meir Kriheli , 2015,2017,2019,2023 -# אורי רודברג , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-12-04 09:22+0000\n" -"Last-Translator: Meir Kriheli , 2015,2017,2019,2023\n" -"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -msgid "PostgreSQL extensions" -msgstr "הרחבות PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "פריט %(nth)s במערך לא עבר בדיקת חוקיות: " - -msgid "Nested arrays must have the same length." -msgstr "מערכים מקוננים חייבים להיות באותו האורך." - -msgid "Map of strings to strings/nulls" -msgstr "מיפוי מחרוזות אל מחרוזות/nulls." - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "הערך של \"%(key)s\" אינו מחרוזת או null." - -msgid "Could not load JSON data." -msgstr "לא ניתן לטעון מידע JSON." - -msgid "Input must be a JSON dictionary." -msgstr "הקלט חייב להיות מילון JSON." - -msgid "Enter two valid values." -msgstr "נא להזין שני ערכים חוקיים." - -msgid "The start of the range must not exceed the end of the range." -msgstr "התחלת טווח אינה יכולה גדולה יותר מסופו." - -msgid "Enter two whole numbers." -msgstr "נא להזין שני מספרים שלמים." - -msgid "Enter two numbers." -msgstr "נא להזין שני מספרים." - -msgid "Enter two valid date/times." -msgstr "נא להזין שני תאריך/שעה חוקיים." - -msgid "Enter two valid dates." -msgstr "נא להזין שני תאריכים חוקיים." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"הרשימה מכילה פריט %(show_value)d, עליה להכיל לא יותר מ-%(limit_value)d." -msgstr[1] "" -"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא יותר מ-%(limit_value)d." -msgstr[2] "" -"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא יותר מ-%(limit_value)d." -msgstr[3] "" -"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא יותר מ-%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"הרשימה מכילה פריט %(show_value)d, עליה להכיל לא פחות מ-%(limit_value)d." -msgstr[1] "" -"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא פחות מ-%(limit_value)d." -msgstr[2] "" -"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא פחות מ-%(limit_value)d." -msgstr[3] "" -"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא פחות מ-%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "חלק מהמפתחות חסרים: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "סופקו מספר מפתחות לא ידועים: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "נא לוודא שהגבול העליון של הטווח אינו גדול מ־%(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "נא לוודא שהגבול התחתון של הטווח אינו קטן מ־%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index 99c9fde..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index b48912b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,102 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Filip Cuk , 2016 -# Mislav Cimperšak , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgid "PostgreSQL extensions" -msgstr "" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "" - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "JSON podatci neuspješno učitani." - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "Unesite 2 ispravne vrijednosti." - -msgid "The start of the range must not exceed the end of the range." -msgstr "" - -msgid "Enter two whole numbers." -msgstr "Unesite dva cijela broja." - -msgid "Enter two numbers." -msgstr "Unesite dva broja." - -msgid "Enter two valid date/times." -msgstr "Unesite dva ispravna datuma/vremena." - -msgid "Enter two valid dates." -msgstr "Unesite dva ispravna datuma." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index 1bad454..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index 62280f1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,118 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016-2019,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Michael Wolf , 2016-2019,2023\n" -"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "PostgreSQL extensions" -msgstr "Rozšěrjenja PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Zapisk %(nth)s w pólnym wariabli njeje so wokrućił:" - -msgid "Nested arrays must have the same length." -msgstr "Zakašćikowane pólne wariable maja samsnu dołhosć." - -msgid "Map of strings to strings/nulls" -msgstr "Konwertowanje znamješkowych rjećazkow do znamješkowych rjećazkow/nulow" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Hódnota \" %(key)s\" znamješkowy rjećazk abo null njeje." - -msgid "Could not load JSON data." -msgstr "JSON-daty njedachu so začitać." - -msgid "Input must be a JSON dictionary." -msgstr "Zapodaće dyrbi JSON-słownik być." - -msgid "Enter two valid values." -msgstr "Zapodajće dwě płaćiwej hódnoće." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Spočatk wobłuka njesmě kónc wobłuka překročić." - -msgid "Enter two whole numbers." -msgstr "Zapodajće dwě cyłej ličbje." - -msgid "Enter two numbers." -msgstr "Zapodajće dwě ličbje." - -msgid "Enter two valid date/times." -msgstr "Zapódajće dwě płaćiwej datowej/časowej podaći." - -msgid "Enter two valid dates." -msgstr "Zapodajće dwě płaćiwej datowej podaći." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Lisćina %(show_value)d element wobsahuje, wona njeměła wjace hač " -"%(limit_value)d wobsahować." -msgstr[1] "" -"Lisćina %(show_value)d elementaj wobsahuje, wona njeměła wjace hač " -"%(limit_value)d wobsahować." -msgstr[2] "" -"Lisćina %(show_value)d elementy wobsahuje, wona njeměła wjace hač " -"%(limit_value)d wobsahować." -msgstr[3] "" -"Lisćina %(show_value)d elementow wobsahuje, wona njeměła wjace hač " -"%(limit_value)d wobsahować." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Lisćina %(show_value)d element wobsahuje, wona njeměła mjenje hač " -"%(limit_value)d wobsahować." -msgstr[1] "" -"Lisćina %(show_value)d elementaj wobsahuje, wona njeměła mjenje hač " -"%(limit_value)d wobsahować." -msgstr[2] "" -"Lisćina %(show_value)d elementy wobsahuje, wona njeměła mjenje hač " -"%(limit_value)d wobsahować." -msgstr[3] "" -"Lisćina %(show_value)d elementow wobsahuje, wona njeměła mjenje hač " -"%(limit_value)d wobsahować." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Někotre kluče faluje: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Někotre njeznate kluče su so podali: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "Zawěsćće, zo hornja hranica wobłuka njeje wjetša hač %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Zawěsćće, zo delnja hranica wobłuka njeje mjeńša hač %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index 675614c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index 1adb7d1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,110 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Akos Zsolt Hochrein , 2018 -# András Veres-Szentkirályi, 2016 -# Balázs R, 2023 -# Dóra Szendrei , 2017 -# Istvan Farkas , 2019 -# János R, 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-12-04 09:22+0000\n" -"Last-Translator: Balázs R, 2023\n" -"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL kiterjesztések" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "A tömb %(nth)s-ik eleme érvénytelen:" - -msgid "Nested arrays must have the same length." -msgstr "A belső tömböknek egyforma hosszúaknak kell lenniük." - -msgid "Map of strings to strings/nulls" -msgstr "String-string/null leképezés" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "A(z) \"%(key)s\" nem karakterlánc, vagy null." - -msgid "Could not load JSON data." -msgstr "JSON adat betöltése sikertelen." - -msgid "Input must be a JSON dictionary." -msgstr "A bemenetnek JSON szótárnak kell lennie." - -msgid "Enter two valid values." -msgstr "Adjon meg két érvényes értéket." - -msgid "The start of the range must not exceed the end of the range." -msgstr "A tartomány eleje nem lehet nagyobb a tartomány végénél." - -msgid "Enter two whole numbers." -msgstr "Adjon meg két egész számot." - -msgid "Enter two numbers." -msgstr "Adjon meg két számot." - -msgid "Enter two valid date/times." -msgstr "Adjon meg két érvényes dátumot/időt." - -msgid "Enter two valid dates." -msgstr "Adjon meg két érvényes dátumot." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"A lista %(show_value)d elemet tartalmaz, legfeljebb %(limit_value)d lehetne." -msgstr[1] "" -"A lista %(show_value)d elemet tartalmaz, legfeljebb %(limit_value)d lehetne." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"A lista %(show_value)d elemet tartalmaz, legalább %(limit_value)d kellene." -msgstr[1] "" -"A lista %(show_value)d elemet tartalmaz, legalább %(limit_value)d kellene." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Néhány kulcs hiányzik: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Néhány ismeretlen kulcs érkezett: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Bizonyosodjon meg arról, hogy a tartomány felső határa nem nagyobb, mint " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Bizonyosodjon meg arról, hogy a tartomány alsó határa nem kisebb, mint " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index fe0d7ab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index 7b7fe80..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,109 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL հավելվածներ" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "Ներդրված մասսիվները պետք է ունենան նույն երկարությունը" - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "Չհաջողվեց բեռնել JSON տվյալները" - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "Մուտքագրեք երկու վավերական արժեք" - -msgid "The start of the range must not exceed the end of the range." -msgstr "Ինտերվալի սկիզբը չպետք է գերազանցի նրա ավարտը" - -msgid "Enter two whole numbers." -msgstr "Մուտքագրեք երկու ամբողջ թիվ" - -msgid "Enter two numbers." -msgstr "Մուտքագրեք երկու թիվ" - -msgid "Enter two valid date/times." -msgstr "Մուտքագրեք երկու ճիշտ ամսաթվեր/ժամանակ" - -msgid "Enter two valid dates." -msgstr "Մուտքագրեք երկու ճիշտ ամսաթվեր" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Ցուցակը պարունակում է %(show_value)d էլեմենտը, բայց այն պետք է պարունակի " -"%(limit_value)d֊ից ոչ ավելի էլեմենտ" -msgstr[1] "" -"Ցուցակը պարունակում է %(show_value)d էլեմենտները, բայց այն պետք է պարունակի " -"%(limit_value)d֊ից ոչ ավելի էլեմենտ" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Ցուցակը պարունակում է %(show_value)d էլեմենտը, բայց այն պետք է պարունակի " -"%(limit_value)d֊ից ոչ պակաս էլեմենտ" -msgstr[1] "" -"Ցուցակը պարունակում է %(show_value)d էլեմենտը, բայց այն պետք է պարունակի " -"%(limit_value)d֊ից ոչ պակաս էլեմենտ" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Որոշ բանալիներ պակասում են՝ %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Տրամադրվել են որոշ անհայտ բանալիներ՝ %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Համոզվեք, որ տիրույթին պատկանող արժեքները փոքր են, կամ հավասար " -"%(limit_value)s֊ի" - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Համոզվեք, որ տիրույթին պատկանող արժեքները մեծ են, կամ հավասար " -"%(limit_value)s֊ի" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ia/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index e26e0b3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ia/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index 68829ff..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,98 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Extensiones PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "Arrays annidate debe haber le mesme longitude." - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "" - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "" - -msgid "The start of the range must not exceed the end of the range." -msgstr "" - -msgid "Enter two whole numbers." -msgstr "" - -msgid "Enter two numbers." -msgstr "" - -msgid "Enter two valid date/times." -msgstr "" - -msgid "Enter two valid dates." -msgstr "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/id/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index d0e3ef7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/id/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index f7a7e2d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,105 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fery Setiawan , 2015-2018,2024 -# M Asep Indrayana , 2015 -# oon arfiandwi (OonID) , 2016 -# rodin , 2016 -# sag​e , 2019 -# Sutrisno Efendi , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2024-08-07 09:22+0000\n" -"Last-Translator: Fery Setiawan , 2015-2018,2024\n" -"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "PostgreSQL extensions" -msgstr "Ekstensi PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Butir %(nth)s dalam larik tidak tervalidasi:" - -msgid "Nested arrays must have the same length." -msgstr "Array bersaran harus mempunyai panjang yang sama." - -msgid "Map of strings to strings/nulls" -msgstr "Pemetaan dari string ke string/null" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Nilai dari “%(key)s” bukan sebuah string atau null." - -msgid "Could not load JSON data." -msgstr "Tidak dapat memuat data JSON." - -msgid "Input must be a JSON dictionary." -msgstr "Masukan harus kamus JSON." - -msgid "Enter two valid values." -msgstr "Masukkan dua nilai yang valid." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Awal jangkauan harus tidak melebihi akhir jangkauan." - -msgid "Enter two whole numbers." -msgstr "Masukkan dua buah bilangan bulat." - -msgid "Enter two numbers." -msgstr "Masukkan dua buah bilangan." - -msgid "Enter two valid date/times." -msgstr "Masukan dua buah tanggal/waktu." - -msgid "Enter two valid dates." -msgstr "Masukan dua buah tanggal yang benar." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Daftar mengandung %(show_value)d butir, seharusnya mengandung tidak lebih " -"dari %(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Daftar mengandung%(show_value)d butir, seharusnya mengandung tidak kurang " -"dari %(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Beberapa kunci hilang: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Beberapa kunci yang tidak dikenali diberikan: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Pastikan bahwa batas atas jangkauan tidak lebih besar dari %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Pastikan batas bawah jangkauan tidak kurang dari %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index 9f6a21e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index a1ccb7c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,108 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Thordur Sigurdsson , 2016-2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL viðbætur" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Hlutur %(nth)s í listanum er ógildur:" - -msgid "Nested arrays must have the same length." -msgstr "Faldaðir (nested) listar verða að vera af sömu lengd." - -msgid "Map of strings to strings/nulls" -msgstr "Möppun strengja í strengi/null" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Gildið á \"%(key)s\" er ekki strengur eða null." - -msgid "Could not load JSON data." -msgstr "Gat ekki hlaðið inn JSON gögnum." - -msgid "Input must be a JSON dictionary." -msgstr "Inntak verður að vera JSON hlutur (dictionary)." - -msgid "Enter two valid values." -msgstr "Sláðu inn tvö gild gildi." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Upphaf bils má ekki ná yfir endalok bils." - -msgid "Enter two whole numbers." -msgstr "Sláðu inn tvær heilar tölur." - -msgid "Enter two numbers." -msgstr "Sláðu inn tvær tölur." - -msgid "Enter two valid date/times." -msgstr "Sláðu inn tvær gildar dagsetningar ásamt tíma." - -msgid "Enter two valid dates." -msgstr "Sláðu inn tvær gildar dagsetningar." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Listinn inniheldur %(show_value)d hlut, en má ekki innihalda fleiri en " -"%(limit_value)d." -msgstr[1] "" -"Listinn inniheldur %(show_value)d hluti, en má ekki innihalda fleiri en " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Listinn inniheldur %(show_value)d hlut, en má ekki innihalda færri en " -"%(limit_value)d." -msgstr[1] "" -"Listinn inniheldur %(show_value)d hluti, en má ekki innihalda færri en " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Þessa lykla vantar: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Þessir óþekktu lyklar fundust: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Gakktu úr skugga um að þetta bil sé minna eða jafnt og %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Gakktu úr skugga um að þetta bil sé stærra eða jafnt og %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/it/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index c0f2bcd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/it/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index 5d082ca..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,122 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 0d21a39e384d88c2313b89b5042c04cb, 2017 -# Flavio Curella , 2016 -# Mirco Grillo , 2018,2020 -# palmux , 2015 -# Paolo Melchiorre , 2023 -# Mattia Procopio , 2015 -# Stefano Brentegani , 2015-2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Paolo Melchiorre , 2023\n" -"Language-Team: Italian (http://www.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Estensioni per PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "L'elemento %(nth)s dell'array non è stato convalidato:" - -msgid "Nested arrays must have the same length." -msgstr "Gli array annidati devono avere la stessa lunghezza." - -msgid "Map of strings to strings/nulls" -msgstr "Mappa di stringhe a stringhe/null" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Il valore di \"%(key)s\" non è una stringa o nullo." - -msgid "Could not load JSON data." -msgstr "Caricamento dati JSON fallito." - -msgid "Input must be a JSON dictionary." -msgstr "L'input deve essere un dizionario JSON." - -msgid "Enter two valid values." -msgstr "Inserisci due valori validi." - -msgid "The start of the range must not exceed the end of the range." -msgstr "" -"Il valore iniziale dell'intervallo non può essere superiore al valore finale." - -msgid "Enter two whole numbers." -msgstr "Inserisci due numeri interi." - -msgid "Enter two numbers." -msgstr "Inserisci due numeri." - -msgid "Enter two valid date/times." -msgstr "Inserisci due valori data/ora validi." - -msgid "Enter two valid dates." -msgstr "Inserisci due date valide." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"La lista contiene %(show_value)d oggetto, non dovrebbe contenerne più di " -"%(limit_value)d." -msgstr[1] "" -"La lista contiene %(show_value)d elementi, e dovrebbe contenerne al massimo " -"%(limit_value)d." -msgstr[2] "" -"La lista contiene %(show_value)d elementi, e dovrebbe contenerne al massimo " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"La lista contiene %(show_value)d oggetto, non dovrebbe contenerne meno di " -"%(limit_value)d." -msgstr[1] "" -"La lista contiene %(show_value)d oggetti, e dovrebbe contenerne almeno " -"%(limit_value)d." -msgstr[2] "" -"La lista contiene %(show_value)d oggetti, e dovrebbe contenerne almeno " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Alcune chiavi risultano mancanti: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Sono state fornite alcune chiavi sconosciute: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Assicurarsi che il limite superiore dell'intervallo non sia maggiore di " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Assicurarsi che il limite inferiore dell'intervallo non sia inferiore a " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ja/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index fa79bbd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ja/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index fb73aac..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,100 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Shinya Okano , 2015-2018,2023 -# Takuya N , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Shinya Okano , 2015-2018,2023\n" -"Language-Team: Japanese (http://www.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL拡張" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "配列内のアイテム %(nth)s は検証できませんでした:" - -msgid "Nested arrays must have the same length." -msgstr "ネストした配列は同じ長さにしなければなりません。" - -msgid "Map of strings to strings/nulls" -msgstr "文字列と文字列/NULLのマップ" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "“%(key)s” の値は文字列または NULL ではありません。" - -msgid "Could not load JSON data." -msgstr "JSONデータを読み込めませんでした。" - -msgid "Input must be a JSON dictionary." -msgstr "JSON辞書を入力しなければなりません。" - -msgid "Enter two valid values." -msgstr "2つの値を正しく入力してください。" - -msgid "The start of the range must not exceed the end of the range." -msgstr "範囲の開始は、範囲の終わりを超えてはなりません。" - -msgid "Enter two whole numbers." -msgstr "2つの整数を入力してください。" - -msgid "Enter two numbers." -msgstr "2つの数値を入力してください。" - -msgid "Enter two valid date/times." -msgstr "2つの日付/時間を入力してください。" - -msgid "Enter two valid dates." -msgstr "2つの日付を入力してください。" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"リストには%(show_value)d個のアイテムが含まれますが、%(limit_value)d個までしか" -"含められません。" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"リストには%(show_value)d個のアイテムが含まれますが、%(limit_value)d個までしか" -"含められません。" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "いくつかのキーが欠落しています: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "いくつかの不明なキーがあります: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "範囲の上限が%(limit_value)sを超えないようにしてください。" - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "範囲の下限が%(limit_value)sより小さくならないようにしてください。" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ka/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index 510f545..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ka/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index d1ae6c8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,98 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL-ის გაფართოებები" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "" - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "" - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "" - -msgid "The start of the range must not exceed the end of the range." -msgstr "" - -msgid "Enter two whole numbers." -msgstr "შეიყვანეთ ორი მთელი რიცხვი." - -msgid "Enter two numbers." -msgstr "შეიყვანეთ ორი რიცხვი." - -msgid "Enter two valid date/times." -msgstr "" - -msgid "Enter two valid dates." -msgstr "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index 22c521b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index f5deca2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,97 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Leo Trubach , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL кеңейтулері" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "Бір-бірін ішіне салынған ауқымдардың ұзындықтары бірдей болу керек" - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "" - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "" - -msgid "The start of the range must not exceed the end of the range." -msgstr "" - -msgid "Enter two whole numbers." -msgstr "" - -msgid "Enter two numbers." -msgstr "" - -msgid "Enter two valid date/times." -msgstr "" - -msgid "Enter two valid dates." -msgstr "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index af8e218..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index 9788384..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,105 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# hoseung2 , 2017 -# Gihun Ham , 2018 -# JunGu Kang , 2015 -# Kwangho Kim , 2019 -# 조민권 , 2016 -# minsung kang, 2015 -# Seoeun(Sun☀️) Hong, 2023 -# Subin Choi , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-12-04 09:22+0000\n" -"Last-Translator: Seoeun(Sun☀️) Hong, 2023\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL 확장" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "배열 안에 있는 항목 1%(nth)s가 올바르지 않습니다:" - -msgid "Nested arrays must have the same length." -msgstr "네스팅된 배열은 반드시 같은 길이를 가져야 합니다." - -msgid "Map of strings to strings/nulls" -msgstr "문자열을 문자열/null 에 매핑" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "\"%(key)s\"의 값은 문자열 또는 널이 아닙니다." - -msgid "Could not load JSON data." -msgstr "JSON 데이터를 불러오지 못했습니다." - -msgid "Input must be a JSON dictionary." -msgstr "입력은 JSON 사전이어야만 합니다." - -msgid "Enter two valid values." -msgstr "유효한 두 값을 입력하세요." - -msgid "The start of the range must not exceed the end of the range." -msgstr "범위의 시작은 끝보다 클 수 없습니다." - -msgid "Enter two whole numbers." -msgstr "두 정수를 입력하세요." - -msgid "Enter two numbers." -msgstr "두 숫자를 입력하세요." - -msgid "Enter two valid date/times." -msgstr "올바른 날짜/시각 두 개를 입력하세요." - -msgid "Enter two valid dates." -msgstr "올바른 날짜 두 개를 입력하세요." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"리스트는 %(show_value)d 아이템들을 포함하며, %(limit_value)d를 초과해서 포함" -"할 수 없습니다." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"리스트는 %(show_value)d 아이템들을 포함하며, %(limit_value)d 이상 포함해야 합" -"니다." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "일부 키가 누락되어있습니다: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "일부 알 수 없는 키가 제공되었습니다. : %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "범위의 상한값이 %(limit_value)s보다 크지 않은지 확인하십시오." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "범위의 하한값이 %(limit_value)s보다 작지 않은지 확인하십시오." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ky/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index a0edffd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ky/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 72c0a48..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,100 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soyuzbek Orozbek uulu , 2020 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-23 06:06+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL кеңейтүүлөрү" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "%(nth)s нерсеси тизмекте туураланган эмес:" - -msgid "Nested arrays must have the same length." -msgstr "Кийишилген тизмектер окшош узундукта болуш керек." - -msgid "Map of strings to strings/nulls" -msgstr "сап -> сап\\боштук сөздүгү" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "%(key)sмааниси сап эмес же бош эмес." - -msgid "Could not load JSON data." -msgstr "JSON берилиши жүктөлбөй жатат." - -msgid "Input must be a JSON dictionary." -msgstr "Терүү JSON сөздүгү болуусу керек." - -msgid "Enter two valid values." -msgstr "Туура кош маани тер." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Чекебелдин башталышы бүтүшүн ашпоосу керек." - -msgid "Enter two whole numbers." -msgstr "Туура кош бүтүн сан тер." - -msgid "Enter two numbers." -msgstr "Кош сан тер." - -msgid "Enter two valid date/times." -msgstr "Туура кош күн\\убак тер." - -msgid "Enter two valid dates." -msgstr "Туура кош күн тер." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Тизме %(show_value)dнерсе камтыйт, бирок ал %(limit_value)dнерседен ашык " -"камтыбашы керек. " - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Тизме %(show_value)dнерсе камтыйт, бирок ал %(limit_value)dнерседен аз " -"камтыбашы керек. " - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Кээ бир ачкытарга %(keys)s жетишпе жатат" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Кээ бир белгисиз ачкычтар %(keys)s тейлейт" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "Чекебел %(limit_value)s дан ашпоосун текшериңиз." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "Чекебел жок дегенде %(limit_value)s экендигин текшериңиз." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index 0bd44f4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index c34bd47..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,120 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Matas Dailyda , 2015-2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL plėtiniai" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "%(nth)s elementų masyve yra nevalidžių:" - -msgid "Nested arrays must have the same length." -msgstr "Iterpti vienas į kitą masyvai turi būti vienodo ilgio." - -msgid "Map of strings to strings/nulls" -msgstr "Susietos tekstinės reikšmės su tekstinėmis reikšmėmis/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "Nepavyko užkrauti JSON duomenų." - -msgid "Input must be a JSON dictionary." -msgstr "Įvestis turi būti JSON žodynas." - -msgid "Enter two valid values." -msgstr "Įveskite dvi tinkamas reikšmes." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Diapazono pradžia negali būti didesnė už diapazono pabaigą." - -msgid "Enter two whole numbers." -msgstr "Įveskite du sveikus skaičius." - -msgid "Enter two numbers." -msgstr "Įveskite du skaičius." - -msgid "Enter two valid date/times." -msgstr "Įveskite dvi tinkamas datas/laikus." - -msgid "Enter two valid dates." -msgstr "Įveskite dvi tinkamas datas." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Sąrašas turi %(show_value)d elementą. Sąrašas neturėtų turėti daugiau " -"elementų nei %(limit_value)d." -msgstr[1] "" -"Sąrašas turi %(show_value)d elementus. Sąrašas neturėtų turėti daugiau " -"elementų nei %(limit_value)d." -msgstr[2] "" -"Sąrašas turi %(show_value)d elementų. Sąrašas neturėtų turėti daugiau " -"elementų nei %(limit_value)d." -msgstr[3] "" -"Sąrašas turi %(show_value)d elementų. Sąrašas neturėtų turėti daugiau " -"elementų nei %(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Sąrašas turi %(show_value)d elementą. Sąrašas turėtų turėti daugiau elementų " -"nei %(limit_value)d." -msgstr[1] "" -"Sąrašas turi %(show_value)d elementus. Sąrašas turėtų turėti daugiau " -"elementų nei %(limit_value)d." -msgstr[2] "" -"Sąrašas turi %(show_value)d elementų. Sąrašas turėtų turėti daugiau elementų " -"nei %(limit_value)d." -msgstr[3] "" -"Sąrašas turi %(show_value)d elementų. Sąrašas turėtų turėti daugiau elementų " -"nei %(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Kai kurių reikšmių nėra: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Buvo pateiktos kelios nežinomos reikšmės: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "Įsitikinkite kad diapazonas yra mažesnis arba lygus %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "Įsitikinkite kad diapazonas yra didesnis arba lygus %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index 14a1db4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index ad92a4b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,118 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Edgars Voroboks , 2023 -# Edgars Voroboks , 2017 -# Edgars Voroboks , 2018 -# Edgars Voroboks , 2019 -# peterisb , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Edgars Voroboks , 2023\n" -"Language-Team: Latvian (http://www.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL paplašinājums" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Masīva %(nth)s elements nav pareizs:" - -msgid "Nested arrays must have the same length." -msgstr "Iekļauto masīvu garumam jābūt vienādam." - -msgid "Map of strings to strings/nulls" -msgstr "Virkņu karte uz virknēm/tukšumiem" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "\"%(key)s\" vērtība nav teksta rinda vai nulles simbols." - -msgid "Could not load JSON data." -msgstr "Nevarēja ielādēt JSON datus." - -msgid "Input must be a JSON dictionary." -msgstr "Ieejošajiem datiem ir jābūt JSON vārdnīcai." - -msgid "Enter two valid values." -msgstr "Ievadi divas derīgas vērtības." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Diapazona sākums nedrīkst būt liekāks par beigām." - -msgid "Enter two whole numbers." -msgstr "Ievadiet divus veselus skaitļus." - -msgid "Enter two numbers." -msgstr "Ievadiet divus skaitļus." - -msgid "Enter two valid date/times." -msgstr "Ievadiet divus derīgus datumus/laikus." - -msgid "Enter two valid dates." -msgstr "Ievadiet divus korektus datumus." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Saraksts satur %(show_value)d ierakstus, bet tam jāsatur ne vairāk kā " -"%(limit_value)d." -msgstr[1] "" -"Saraksts satur %(show_value)d ierakstu, bet tam jāsatur ne vairāk kā " -"%(limit_value)d." -msgstr[2] "" -"Saraksts satur %(show_value)d ierakstus, bet tam jāsatur ne vairāk kā " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Saraksts satur %(show_value)d ierakstus, bet tam jāsatur vismaz " -"%(limit_value)d." -msgstr[1] "" -"Saraksts satur %(show_value)d ierakstu, bet tam jāsatur vismaz " -"%(limit_value)d." -msgstr[2] "" -"Saraksts satur %(show_value)d ierakstus, bet tam jāsatur vismaz " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Trūka dažas atslēgas: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Tika norādītas dažas nezināmas atslēgas: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Pārliecinieties, ka diapazona augšējā robeža nav lielāka par %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Pārliecinieties, ka diapazona apakšējā robeža nav mazāka par %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index 30eac66..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index a320c46..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,112 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# dekomote , 2015 -# Vasil Vangelovski , 2015-2017 -# Vasil Vangelovski , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL eкстензии" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "Вгнездени низи мораат да имаат иста должина." - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "Не можеа да се вчитаат JSON податоци." - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "Внесете две валидни вредности." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Почетокот на опсегот не смее да го надминува крајот на опсегот." - -msgid "Enter two whole numbers." -msgstr "Внесете два цели броеви." - -msgid "Enter two numbers." -msgstr "Внесете два броја." - -msgid "Enter two valid date/times." -msgstr "Внесете две валидни датуми/времиња" - -msgid "Enter two valid dates." -msgstr "Внесете два валидни датуми." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Листата соджи %(show_value)d елемент, не смее да содржи повеќе од " -"%(limit_value)d." -msgstr[1] "" -"Листата содржи %(show_value)d елементи, не треба да содржи повеќе од " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Листата содржи %(show_value)d елемент, не треба да содржи помалку од " -"%(limit_value)d." -msgstr[1] "" -"Листата содржи %(show_value)d елемент, не треба да содржи помалку од " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Некои клучеви недостигаа: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Беа дадени некои непознати клучеви: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Осигурајте се дека овој опсег во целост е помал или еднаков на " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Осигурајте се дека овој опсег во целост е поголем или еднаков на " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ml/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index c7ae922..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ml/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index 93c6f92..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,98 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Hrishikesh , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-13 21:28+0000\n" -"Last-Translator: Hrishikesh \n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL എക്സ്റ്റൻഷനുക" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "നെസ്റ്റഡ് അറേകൾക്ക് ഒരേ ലെങ്ത്തായിരിക്കണം." - -msgid "Map of strings to strings/nulls" -msgstr "സ്ട്രിങ്ങുകളിൽ നിന്ന് സ്ട്രിങ്ങുകളിലേക്ക്/nulls ലേയ്ക്ക് ഉള്ള Map." - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "JSON ഡാറ്റ ലോഡുചെയ്യാനായില്ല." - -msgid "Input must be a JSON dictionary." -msgstr "ഇൻപുട്ട് നിർബന്ധമായു ഒരു JSON ഡിക്ഷ്ണറി ആയിരിക്കണം." - -msgid "Enter two valid values." -msgstr "ശരിയായ രണ്ട് വാല്യൂകൾ നൽകു" - -msgid "The start of the range must not exceed the end of the range." -msgstr "" - -msgid "Enter two whole numbers." -msgstr "രണ്ട് പൂർണ്ണസംഖ്യകൾ നൽകുക." - -msgid "Enter two numbers." -msgstr "" - -msgid "Enter two valid date/times." -msgstr "" - -msgid "Enter two valid dates." -msgstr "ശരിയായ രണ്ട് തീയതികൾ നകുക." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index 5f36705..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 326792e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,111 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Zorig, 2016-2017 -# Zorig, 2019 -# Анхбаяр Анхаа , 2015 -# Баясгалан Цэвлээ , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL -ын өргөтгөлүүд" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Массивд байгаа %(nth)s буруу байна" - -msgid "Nested arrays must have the same length." -msgstr "Түүвэрлэсэн массив ижил урттай байх ёстой." - -msgid "Map of strings to strings/nulls" -msgstr "Тэмдэгтийг тэмдэгт/null руу заагч" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "JSON дата-г уншиж чадахгүй байна." - -msgid "Input must be a JSON dictionary." -msgstr "Оролт JSON dictionary байх ёстой." - -msgid "Enter two valid values." -msgstr "Хоёр зөв утга оруулна уу" - -msgid "The start of the range must not exceed the end of the range." -msgstr "Хүрээний эхлэл төгсгөлөөс хэтрэхгүй байх ёстой." - -msgid "Enter two whole numbers." -msgstr "Хоёр бүхэл тоон утга оруулна уу." - -msgid "Enter two numbers." -msgstr "Хоёр тоо оруулна уу." - -msgid "Enter two valid date/times." -msgstr "хоёр зөв огноо/цаг-ыг оруулна уу." - -msgid "Enter two valid dates." -msgstr "Хоёр зөв огноо оруулна уу" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Жагсаалтанд %(show_value)d зүйл байна, %(limit_value)d -ээс хэтрэхгүй байх " -"ёстой." -msgstr[1] "" -"Жагсаалтанд %(show_value)d зүйлүүд байна, %(limit_value)d -ээс хэтрэхгүй " -"байх ёстой." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Жагсаалтанд %(show_value)d зүйл байна, %(limit_value)d -ээс ихгүй байх ёстой." -msgstr[1] "" -"Жагсаалтанд %(show_value)d зүйлүүд байна, %(limit_value)d -ээс ихгүй байх " -"ёстой." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Зарим түлхүүр байхгүй байна: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Хэсэг үл мэдэгдэх түлхүүр байна: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Энэ хүрээ нь %(limit_value)s -тэй бүрэн тэнцүү буюу түүнээс бага байгаа " -"эсэхийг шалгана уу" - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Энэ хүрээ нь %(limit_value)s -с их буюу тэнцүү байгаа эсэхийг шалгана уу" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index d183857..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index 42fb58d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,97 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Omkar Parab, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2024-01-19 09:22+0000\n" -"Last-Translator: Omkar Parab, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "" - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "JSON डेटा लोड करू शकलो नाही. " - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "दोन वैध मूल्ये प्रविष्ट करा." - -msgid "The start of the range must not exceed the end of the range." -msgstr "" - -msgid "Enter two whole numbers." -msgstr "दोन पूर्ण संख्या प्रविष्ट करा." - -msgid "Enter two numbers." -msgstr "दोन संख्या प्रविष्ट करा." - -msgid "Enter two valid date/times." -msgstr "दोन वैध दिनांक/वेळा प्रविष्ट करा." - -msgid "Enter two valid dates." -msgstr "दोन वैध दिनांका प्रविष्ट करा" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ms/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index 51c00af..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ms/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index 422eb13..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,100 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2021-11-16 12:53+0000\n" -"Last-Translator: Jafry Hisham\n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "PostgreSQL extensions" -msgstr "Sambungan PoestgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "item %(nth)s didalam tatasusunan tidak disahkan:" - -msgid "Nested arrays must have the same length." -msgstr "Tatasusunan bersarang haruslah sama panjang." - -msgid "Map of strings to strings/nulls" -msgstr "Suaian rentetan ke rentetan/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Nilai \"%(key)s\" bukan rentetan atau adalah null." - -msgid "Could not load JSON data." -msgstr "Tidak dapat memuatkan data JSON." - -msgid "Input must be a JSON dictionary." -msgstr "Input mestilah dalam bentuk kamus JSON." - -msgid "Enter two valid values." -msgstr "Masukkan dua nilai yang sah." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Permulaan julat tidak boleh melebihi akhir julat." - -msgid "Enter two whole numbers." -msgstr "Masukkan dua nombor bulat." - -msgid "Enter two numbers." -msgstr "Masukkan duan nombor." - -msgid "Enter two valid date/times." -msgstr "Masukkan dua tarikh.masa yang sah." - -msgid "Enter two valid dates." -msgstr "Masukkan dua tarikh yang sah." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Senarai mempunyai %(show_value)d perkara, tetapi sepatutnya mempunyai lebih " -"daripada %(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Senarai mempunyai %(show_value)d perkara, tetapi ia sepatutnya mempunyai " -"tidak kurang daripaada %(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Sesetengah kunci hilang: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Sesetengah kunci yang diberikan tidak diketahui: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Pastikan julat ini adalah kurang daripada atau sama dengan %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "Pastikan julat ini lebih daripada atau sama dengan %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index a4b273a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index 31cbb37..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,107 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jon , 2015-2016 -# Jon , 2017-2018,2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL-utvidelser" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Element %(nth)s i arrayen validerte ikke:" - -msgid "Nested arrays must have the same length." -msgstr "Nøstede arrays må ha samme lengde." - -msgid "Map of strings to strings/nulls" -msgstr "Oversikt over strenger til strenger/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Verdien av \"%(key)s\" er ikke en streng eller null." - -msgid "Could not load JSON data." -msgstr "Kunne ikke laste JSON-data." - -msgid "Input must be a JSON dictionary." -msgstr "Input må være en JSON-dictionary." - -msgid "Enter two valid values." -msgstr "Oppgi to gyldige verdier." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Starten på serien må ikke overstige enden av serien." - -msgid "Enter two whole numbers." -msgstr "Oppgi to heltall." - -msgid "Enter two numbers." -msgstr "Oppgi to tall." - -msgid "Enter two valid date/times." -msgstr "Oppgi to gyldige datoer og tidspunkter." - -msgid "Enter two valid dates." -msgstr "Oppgi to gyldige datoer." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Listen inneholder %(show_value)d element, den bør ikke inneholde mer enn " -"%(limit_value)d." -msgstr[1] "" -"Listen inneholder %(show_value)d elementer, den bør ikke inneholde mer enn " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Listen inneholder %(show_value)d element, den bør ikke inneholde færre enn " -"%(limit_value)d." -msgstr[1] "" -"Listen inneholder %(show_value)d elementer, den bør ikke inneholde færre enn " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Noen nøkler manglet: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Noen ukjente nøkler ble oppgitt: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "Sørg for at denne serien er helt mindre enn eller lik %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "Sørg for at denne serien er helt større enn eller lik %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ne/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index 311ab17..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ne/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index 3ee263d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,96 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "" - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "" - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "दुई उपयुक्त मान राख्नु होस ।" - -msgid "The start of the range must not exceed the end of the range." -msgstr "" - -msgid "Enter two whole numbers." -msgstr "" - -msgid "Enter two numbers." -msgstr "दुई अङ्क राख्नु होस ।" - -msgid "Enter two valid date/times." -msgstr "दुई उपयुक्त मिति/समय राख्नु होस ।" - -msgid "Enter two valid dates." -msgstr "दुई उपयुक्त मिति राख्नु होस ।" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index 61c3a25..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index e1fcfc2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,112 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Evelijn Saaltink , 2016 -# Ilja Maas , 2015 -# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2015 -# Tonnes , 2017,2019,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-12-04 09:22+0000\n" -"Last-Translator: Tonnes , 2017,2019,2023\n" -"Language-Team: Dutch (http://app.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL-extensies" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Item %(nth)s in de matrix is niet gevalideerd:" - -msgid "Nested arrays must have the same length." -msgstr "Geneste matrices moeten dezelfde lengte hebben." - -msgid "Map of strings to strings/nulls" -msgstr "Toewijzing van tekenreeksen naar tekenreeksen/nulwaarden" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "De waarde van ‘%(key)s’ is geen tekenreeks of nul." - -msgid "Could not load JSON data." -msgstr "Kon JSON-gegevens niet laden." - -msgid "Input must be a JSON dictionary." -msgstr "Invoer moet een JSON-bibliotheek zijn." - -msgid "Enter two valid values." -msgstr "Voer twee geldige waarden in." - -msgid "The start of the range must not exceed the end of the range." -msgstr "" -"Het begin van het bereik mag niet groter zijn dan het einde van het bereik." - -msgid "Enter two whole numbers." -msgstr "Voer twee gehele getallen in." - -msgid "Enter two numbers." -msgstr "Voer twee getallen in." - -msgid "Enter two valid date/times." -msgstr "Voer twee geldige datums/tijden in." - -msgid "Enter two valid dates." -msgstr "Voer twee geldige datums in." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Lijst bevat %(show_value)d element, maar mag niet meer dan %(limit_value)d " -"elementen bevatten." -msgstr[1] "" -"Lijst bevat %(show_value)d elementen, maar mag niet meer dan %(limit_value)d " -"elementen bevatten." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Lijst bevat %(show_value)d element, maar mag niet minder dan %(limit_value)d " -"elementen bevatten." -msgstr[1] "" -"Lijst bevat %(show_value)d elementen, maar mag niet minder dan " -"%(limit_value)d elementen bevatten." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Sommige sleutels ontbreken: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Er zijn enkele onbekende sleutels opgegeven: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Zorg ervoor dat de bovengrens van het bereik niet hoger is dan " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Zorg ervoor dat de ondergrens van het bereik niet lager is dan " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index 52ea3d1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index aff9967..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,106 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Sivert Olstad, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2021-11-16 22:21+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL-utvidingar" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Element %(nth)s i arrayen validerte ikkje:" - -msgid "Nested arrays must have the same length." -msgstr "Nysta arrayar må ha same lengde." - -msgid "Map of strings to strings/nulls" -msgstr "Oversyn over strenger til strenger/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Verdien til “%(key)s” er ikkje ein streng eller null." - -msgid "Could not load JSON data." -msgstr "Kunne ikkje laste JSON-data." - -msgid "Input must be a JSON dictionary." -msgstr "Inndata må vere ein JSON-dictionary." - -msgid "Enter two valid values." -msgstr "Oppgje to gyldige verdiar." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Starten på serien må ikkje overstige enden av serien." - -msgid "Enter two whole numbers." -msgstr "Oppgje to heiltal." - -msgid "Enter two numbers." -msgstr "Oppgje to tal." - -msgid "Enter two valid date/times." -msgstr "Oppgje to gyldige datoar/tidspunkt." - -msgid "Enter two valid dates." -msgstr "Oppgje to gyldige datoar." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Lista inneheld %(show_value)d element, den bør ikkje innehalde fleire enn " -"%(limit_value)d." -msgstr[1] "" -"Lista inneheld %(show_value)d element, den bør ikkje innehalde fleire enn " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Lista inneheld %(show_value)d element, den bør ikkje innehalde færre enn " -"%(limit_value)d." -msgstr[1] "" -"Lista inneheld %(show_value)d element, den bør ikkje innehalde færre enn " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Nokon nyklar mangla: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Nokon ukjende nyklar vart oppgjeve: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "Syrg for at serien er heilt mindre enn eller lik %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "Syrg for at serien er heilt større enn eller lik %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index 0a096ee..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index eb0c401..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,127 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dariusz Paluch , 2015 -# Janusz Harkot , 2015 -# Piotr Jakimiak , 2015 -# lobsterick , 2019 -# Maciej Olko , 2016-2019 -# Maciej Olko , 2023 -# Maciej Olko , 2015 -# Tomasz Kajtoch , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Maciej Olko , 2023\n" -"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " -"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " -"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -msgid "PostgreSQL extensions" -msgstr "Rozszerzenia PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Element %(nth)s w tablicy nie przeszedł walidacji:" - -msgid "Nested arrays must have the same length." -msgstr "Zagnieżdżone tablice muszą mieć tę samą długość." - -msgid "Map of strings to strings/nulls" -msgstr "Mapowanie ciągów znaków na ciągi znaków/nulle" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Wartość „%(key)s” nie jest ciągiem znaków ani nullem." - -msgid "Could not load JSON data." -msgstr "Nie można załadować danych JSON." - -msgid "Input must be a JSON dictionary." -msgstr "Wejście musi być słownikiem JSON." - -msgid "Enter two valid values." -msgstr "Podaj dwie poprawne wartości." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Początek zakresu nie może przekroczyć jego końca." - -msgid "Enter two whole numbers." -msgstr "Podaj dwie liczby całkowite." - -msgid "Enter two numbers." -msgstr "Podaj dwie liczby." - -msgid "Enter two valid date/times." -msgstr "Podaj dwie poprawne daty/godziny." - -msgid "Enter two valid dates." -msgstr "Podaj dwie poprawne daty." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Lista zawiera %(show_value)d element, a nie powinna zawierać więcej niż " -"%(limit_value)d." -msgstr[1] "" -"Lista zawiera %(show_value)d elementów, a nie powinna zawierać więcej niż " -"%(limit_value)d." -msgstr[2] "" -"Lista zawiera %(show_value)d elementów, a nie powinna zawierać więcej niż " -"%(limit_value)d." -msgstr[3] "" -"Lista zawiera %(show_value)d elementów, a nie powinna zawierać więcej niż " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Lista zawiera %(show_value)d element, a powinna zawierać nie mniej niż " -"%(limit_value)d." -msgstr[1] "" -"Lista zawiera %(show_value)d elementów, a powinna zawierać nie mniej niż " -"%(limit_value)d." -msgstr[2] "" -"Lista zawiera %(show_value)d elementów, a powinna zawierać nie mniej niż " -"%(limit_value)d." -msgstr[3] "" -"Lista zawiera %(show_value)d elementów, a powinna zawierać nie mniej niż " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Brak części kluczy: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Podano nieznane klucze: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Upewnij się, że górna granica zakresu nie jest większa niż %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Upewnij się, że dolna granica zakresu nie jest mniejsza niż %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index 7f6ed0d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index fce5ed8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,107 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claudio Fernandes , 2015 -# jorgecarleitao , 2015 -# Nuno Mariz , 2015,2017-2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-12 20:01+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Extensões de PostgresSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Item %(nth)s na lista não validou:" - -msgid "Nested arrays must have the same length." -msgstr "As sub-listas têm de ter o mesmo tamanho." - -msgid "Map of strings to strings/nulls" -msgstr "Mapeamento de strings para strings/nulos" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "Não foi possível carregar os dados JSON." - -msgid "Input must be a JSON dictionary." -msgstr "A entrada deve ser um dicionário JSON." - -msgid "Enter two valid values." -msgstr "Introduza dois valores válidos." - -msgid "The start of the range must not exceed the end of the range." -msgstr "O início da gama não pode ser maior que o seu fim." - -msgid "Enter two whole numbers." -msgstr "Introduza dois números inteiros." - -msgid "Enter two numbers." -msgstr "Introduza dois números." - -msgid "Enter two valid date/times." -msgstr "Introduza duas datas/horas válidas." - -msgid "Enter two valid dates." -msgstr "Introduza duas datas válidas." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"A lista contém %(show_value)d item, não pode conter mais do que " -"%(limit_value)d." -msgstr[1] "" -"A lista contém %(show_value)d itens, não pode conter mais do que " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"A lista contém %(show_value)d item, tem de conter pelo menos %(limit_value)d." -msgstr[1] "" -"A lista contém %(show_value)d itens, tem de conter pelo menos " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Algumas chaves estão em falta: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Foram fornecidas algumas chaves desconhecidas: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "Garanta que esta gama é toda ela menor ou igual a %(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "Garanta que esta gama é toda ela maior ou igual a %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index 3c39f56..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index 7b1b3a4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,123 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andre Machado , 2016 -# Carlos C. Leite , 2016,2019 -# Claudemiro Alves Feitosa Neto , 2015 -# Fábio C. Barrionuevo da Luz , 2015 -# Jonas Rodrigues, 2023 -# Lucas Infante , 2015 -# Luiz Boaretto , 2017 -# Marcelo Moro Brondani , 2018 -# Rafael Ribeiro , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Jonas Rodrigues, 2023\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Extensões para PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "O item %(nth)s na matriz não validou:" - -msgid "Nested arrays must have the same length." -msgstr "Matrizes aninhadas devem ter o mesmo comprimento." - -msgid "Map of strings to strings/nulls" -msgstr "Mapa de strings para strings/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "O valor da “%(key)s” não é string ou null." - -msgid "Could not load JSON data." -msgstr "Não foi possível carregar dados JSON." - -msgid "Input must be a JSON dictionary." -msgstr "Input deve ser um dicionário JSON" - -msgid "Enter two valid values." -msgstr "Insira dois valores válidos." - -msgid "The start of the range must not exceed the end of the range." -msgstr "O inicio do intervalo não deve exceder o fim do intervalo." - -msgid "Enter two whole numbers." -msgstr "Insira dois números cheios." - -msgid "Enter two numbers." -msgstr "Insira dois números" - -msgid "Enter two valid date/times." -msgstr "Insira duas datas/horas válidas." - -msgid "Enter two valid dates." -msgstr "Insira duas datas válidas." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"A lista contém um item %(show_value)d, não deveria conter mais que " -"%(limit_value)d." -msgstr[1] "" -"A lista contém itens %(show_value)d, não deveria conter mais que " -"%(limit_value)d." -msgstr[2] "" -"A lista contém itens %(show_value)d, não deveria conter mais que " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"A lista contém um item %(show_value)d, deveria conter não menos que " -"%(limit_value)d." -msgstr[1] "" -"A lista contém %(show_value)d itens, deveria conter não menos que " -"%(limit_value)d." -msgstr[2] "" -"A lista contém %(show_value)d itens, deveria conter não menos que " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Algumas chaves estavam faltando: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Algumas chaves desconhecidas foram fornecidos: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Certifique-se de que o limite superior do intervalo não seja maior que " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Assegure-se de que o limite inferior do intervalo não seja menor que " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ro/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index 0c34adb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ro/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index ae8e69d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,120 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bogdan Mateescu, 2018 -# Eugenol Man , 2020 -# Razvan Stefanescu , 2015,2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-07-06 17:14+0000\n" -"Last-Translator: Eugenol Man \n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -msgid "PostgreSQL extensions" -msgstr "Extensiile PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Elementul %(nth)s din mulțime nu s-a validat:" - -msgid "Nested arrays must have the same length." -msgstr "Vectorii imbricați trebuie să aibă aceeași lungime." - -msgid "Map of strings to strings/nulls" -msgstr "Asociere de șiruri de caractere cu șiruri de caractere/null." - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Valoarea “%(key)s” nu este un sir sau zero." - -msgid "Could not load JSON data." -msgstr "Nu am putut încărca datele JSON." - -msgid "Input must be a JSON dictionary." -msgstr "Intrarea trebuie să fie un dicționar JSON valid." - -msgid "Enter two valid values." -msgstr "Introdu două valori valide." - -msgid "The start of the range must not exceed the end of the range." -msgstr "" -"Începutul intervalului nu trebuie să depășească sfârșitul intervalului." - -msgid "Enter two whole numbers." -msgstr "Introdu două numere întregi." - -msgid "Enter two numbers." -msgstr "Introdu două numere." - -msgid "Enter two valid date/times." -msgstr "Introdu două date / ore valide." - -msgid "Enter two valid dates." -msgstr "Introdu două date valide." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Lista conține %(show_value)d, nu ar trebui să conțină mai mult de " -"%(limit_value)d." -msgstr[1] "" -"Lista conține %(show_value)d, nu ar trebui să conțină mai mult de " -"%(limit_value)d." -msgstr[2] "" -"Lista conține %(show_value)d, nu ar trebui să conțină mai mult de " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Lista conține %(show_value)d, nu ar trebui să conțină mai puțin de " -"%(limit_value)d." -msgstr[1] "" -"Lista conține %(show_value)d, nu ar trebui să conțină mai puțin de " -"%(limit_value)d." -msgstr[2] "" -"Lista conține %(show_value)d, nu ar trebui să conțină mai puțin de " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Unele chei lipsesc: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Au fost furnizate chei necunoscute: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Asigură-te că intervalul este în întregime mai mic sau egal cu " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" -"Asigură-te că intervalul este în întregime mai mare sau egal cu " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ru/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index e74abd1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ru/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index bc5bf33..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,131 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eugene , 2016 -# eXtractor , 2015 -# crazyzubr , 2020 -# Kirill Gagarski , 2015 -# Вася Аникин , 2017 -# Алексей Борискин , 2015-2018,2023 -# Bobsans , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-12-04 09:22+0000\n" -"Last-Translator: Алексей Борискин , 2015-2018,2023\n" -"Language-Team: Russian (http://app.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "PostgreSQL extensions" -msgstr "Расширения PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Элемент %(nth)s в массиве не прошёл проверку:" - -msgid "Nested arrays must have the same length." -msgstr "Вложенные массивы должны иметь одинаковую длину." - -msgid "Map of strings to strings/nulls" -msgstr "" -"Ассоциативный массив со строковыми ключами и строковыми или отсутствующими " -"значениями." - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Значение “%(key)s” не является строкой или null." - -msgid "Could not load JSON data." -msgstr "Не удалось загрузить JSON-данные." - -msgid "Input must be a JSON dictionary." -msgstr "Значение должно быть JSON-словарём." - -msgid "Enter two valid values." -msgstr "Введите два правильных значения." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Начало диапазона не может превышать его предел." - -msgid "Enter two whole numbers." -msgstr "Введите два целых числа." - -msgid "Enter two numbers." -msgstr "Введите два числа." - -msgid "Enter two valid date/times." -msgstr "Введите две правильные даты со временем." - -msgid "Enter two valid dates." -msgstr "Введите две правильные даты." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Список содержит %(show_value)d элемент, однако количество элементов не " -"должно превышать %(limit_value)d." -msgstr[1] "" -"Список содержит %(show_value)d элемента, однако количество элементов не " -"должно превышать %(limit_value)d." -msgstr[2] "" -"Список содержит %(show_value)d элементов, однако количество элементов не " -"должно превышать %(limit_value)d." -msgstr[3] "" -"Список содержит %(show_value)d элементов, однако количество элементов не " -"должно превышать %(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Список содержит %(show_value)d элемент, однако количество элементов должно " -"быть не меньше %(limit_value)d." -msgstr[1] "" -"Список содержит %(show_value)d элемента, однако количество элементов должно " -"быть не меньше %(limit_value)d." -msgstr[2] "" -"Список содержит %(show_value)d элементов, однако количество элементов должно " -"быть не меньше %(limit_value)d." -msgstr[3] "" -"Список содержит %(show_value)d элементов, однако количество элементов должно " -"быть не меньше %(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Некоторые ключи пропущены: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" -"Некоторые из предоставленных ключей не входят в список известных ключей: " -"%(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Убедитесь, что верхняя граница диапазона не больше, чем %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Убедитесь, что нижняя граница диапазона не меньше, чем %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index bad5729..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index b9f5d4c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,121 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Zahradník, 2023 -# Martin Tóth , 2017-2018,2023 -# Peter Stríž , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-12-04 09:22+0000\n" -"Last-Translator: Martin Tóth , 2017-2018,2023\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL rozšírenia" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "%(nth)s. položka poľa je neplatná:" - -msgid "Nested arrays must have the same length." -msgstr "Vnorené polia musia mať rovnakú dĺžku." - -msgid "Map of strings to strings/nulls" -msgstr "Mapovanie reťazcov na reťazce/NULL" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Hodnota s kľúčom „%(key)s“ nie je reťazec ani NULL." - -msgid "Could not load JSON data." -msgstr "Údaje typu JSON sa nepodarilo načítať." - -msgid "Input must be a JSON dictionary." -msgstr "Vstup musí byť slovník vo formáte JSON." - -msgid "Enter two valid values." -msgstr "Zadajte dve platné hodnoty." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Začiatočná hodnota rozsahu nesmie býť vyššia ako koncová hodnota." - -msgid "Enter two whole numbers." -msgstr "Zadajte dve celé čísla." - -msgid "Enter two numbers." -msgstr "Zadajte dve čísla." - -msgid "Enter two valid date/times." -msgstr "Zadajte dva platné dátumy/časy." - -msgid "Enter two valid dates." -msgstr "Zadajte dva platné dátumy." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať viac ako " -"%(limit_value)d." -msgstr[1] "" -"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať viac ako " -"%(limit_value)d." -msgstr[2] "" -"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať viac ako " -"%(limit_value)d." -msgstr[3] "" -"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať viac ako " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať menej ako " -"%(limit_value)d." -msgstr[1] "" -"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať menej ako " -"%(limit_value)d." -msgstr[2] "" -"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať menej ako " -"%(limit_value)d." -msgstr[3] "" -"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať menej ako " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Niektoré kľúče chýbajú: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Boli zadané neznáme kľúče: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Uistite sa, že horná hranica rozsahu nie je väčšia ako %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Uistite sa, že dolná hranica rozsahu nie je menšia ako %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index 47a41df..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index b79c39a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,120 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrej Marsetič, 2022 -# Primoz Verdnik , 2017 -# zejn , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Andrej Marsetič, 2022\n" -"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL razširitve" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "Gnezdeni seznami morajo imeti enako dolžino." - -msgid "Map of strings to strings/nulls" -msgstr "Preslikava nizev v nize/null" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Vrednost \"%(key)s\" ni niz ali ničelna vrednost." - -msgid "Could not load JSON data." -msgstr "Ni bilo mogoče naložiti JSON podatkov." - -msgid "Input must be a JSON dictionary." -msgstr "Vhodni podatek mora biti JSON objekt." - -msgid "Enter two valid values." -msgstr "Vnesite dve veljavni vrednosti." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Začetek območja mora biti po vrednosti manjši od konca območja." - -msgid "Enter two whole numbers." -msgstr "Vnesite dve celi števili." - -msgid "Enter two numbers." -msgstr "Vnesite dve števili." - -msgid "Enter two valid date/times." -msgstr "Vnesite dva veljavna datuma oz. točki v času." - -msgid "Enter two valid dates." -msgstr "Vnesite dva veljavna datuma." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Seznam vsebuje %(show_value)d element, moral pa bi jih imeti največ " -"%(limit_value)d." -msgstr[1] "" -"Seznam vsebuje %(show_value)d elementa, moral pa bi jih imeti največ " -"%(limit_value)d." -msgstr[2] "" -"Seznam vsebuje %(show_value)d elemente, moral pa bi jih imeti največ " -"%(limit_value)d." -msgstr[3] "" -"Seznam vsebuje %(show_value)d elementov, moral pa bi jih imeti največ " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Seznam vsebuje %(show_value)d element, moral pa bi jih najmanj " -"%(limit_value)d." -msgstr[1] "" -"Seznam vsebuje %(show_value)d elementa, moral pa bi jih najmanj " -"%(limit_value)d." -msgstr[2] "" -"Seznam vsebuje %(show_value)d elemente, moral pa bi jih najmanj " -"%(limit_value)d." -msgstr[3] "" -"Seznam vsebuje %(show_value)d elementov, moral pa bi jih najmanj " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Nekateri ključi manjkajo: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Navedeni so bili nekateri neznani ključi: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sq/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index 7bd98f0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sq/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index abdcfb4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,110 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2023,2025 -# Besnik Bleta , 2017-2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2023,2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Zgjerime PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Objekti %(nth)s te matrica s’u vleftësua:" - -msgid "Nested arrays must have the same length." -msgstr "" - -msgid "Map of strings to strings/nulls" -msgstr "Hartë vargjesh te strings/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Vlera e “%(key)s” s’është varg ose “nul”." - -msgid "Could not load JSON data." -msgstr "S’u ngarkuan dot të dhëna JSON." - -msgid "Input must be a JSON dictionary." -msgstr "Vlera duhet të jetë një fjalor JSON." - -msgid "Enter two valid values." -msgstr "Jepni dy vlera të vlefshme." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Fillimi i një intervali s’duhet të tejkalojë fundin e një intervali." - -msgid "Enter two whole numbers." -msgstr "Jepni dy vlera të plota numrash." - -msgid "Enter two numbers." -msgstr "Jepni dy numra." - -msgid "Enter two valid date/times." -msgstr "Jepni dy data/kohë të vlefshme." - -msgid "Enter two valid dates." -msgstr "Jepni dy data të vlefshme." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Lista përmban %(show_value)d element, duhet të përmbajë jo më shumë se " -"%(limit_value)d." -msgstr[1] "" -"Lista përmban %(show_value)d elementë, duhet të përmbajë jo më shumë se " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Lista përmban %(show_value)d element, duhet të përmbajë jo më pak " -"%(limit_value)d." -msgstr[1] "" -"Lista përmban %(show_value)d elementë, duhet të përmbajë jo më pak " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Mungojnë ca kyçe: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Janë dhënë kyçe të panjohur: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Garantoni që kufiri i sipërm i intervalit të mos jetë më i madh se " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Garantoni që kufiri i poshtëm i intervalit të mos jetë më i vogël se " -"%(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index 7d12ac8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index b7d796c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,113 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Igor Jerosimić, 2020,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Igor Jerosimić, 2020,2023\n" -"Language-Team: Serbian (http://www.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL екстензије" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Ставка %(nth)s у низу није валидирана:" - -msgid "Nested arrays must have the same length." -msgstr "Угњеждени низови морају да буду исте дужине." - -msgid "Map of strings to strings/nulls" -msgstr "Мапа знаковних ниски на знаковне ниске/null-ове" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Вредност “%(key)s” није знаковни низ или null." - -msgid "Could not load JSON data." -msgstr "Не могу да учитам JSON податке." - -msgid "Input must be a JSON dictionary." -msgstr "Улазна вредност мора бити JSON dict." - -msgid "Enter two valid values." -msgstr "Унесите две исправне вредности." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Почетак опсега не може бити преко краја опсега." - -msgid "Enter two whole numbers." -msgstr "Унесите два цела броја." - -msgid "Enter two numbers." -msgstr "Унесите два броја." - -msgid "Enter two valid date/times." -msgstr "Унесите два исправна датума/времена." - -msgid "Enter two valid dates." -msgstr "Унесите два исправна датума." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Листа садржи %(show_value)dставку, не би требало да садржи више од " -"%(limit_value)d." -msgstr[1] "" -"Листа садржи %(show_value)d ставке, не би требало да садржи више од " -"%(limit_value)d." -msgstr[2] "" -"Листа садржи %(show_value)d ставки, не би требало да садржи више од " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Листа садржи %(show_value)d ставку, не би требало да садржи мање од " -"%(limit_value)d." -msgstr[1] "" -"Листа садржи %(show_value)d ставке, не би требало да садржи мање од " -"%(limit_value)d." -msgstr[2] "" -"Листа садржи %(show_value)d ставки, не би требало да садржи мање од " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Неки кључеви недостају: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Дати су неки непознати кључеви: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "Осигурајте да горња граница опсега није већа од %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Осигурајте да доња граница опсега није мања од %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index 74a26e3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index ce65e27..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,112 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Igor Jerosimić, 2019-2020,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Igor Jerosimić, 2019-2020,2023\n" -"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" -"language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL ekstenzije" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Stavka %(nth)su nizu nije ispravna:" - -msgid "Nested arrays must have the same length." -msgstr "Ugnježdeni nizovi moraju da budu iste dužine." - -msgid "Map of strings to strings/nulls" -msgstr "Mapa znakovnih niski na znakovne niske/null-ove" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Vrednost \"%(key)s\" nije znakovni niz ili null." - -msgid "Could not load JSON data." -msgstr "Ne mogu da učitam JSON podatke." - -msgid "Input must be a JSON dictionary." -msgstr "Ulazna vrednost mora biti JSON dict." - -msgid "Enter two valid values." -msgstr "Unesite dve ispravne vrednosti." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Početak opsega ne može biti preko kraja opsega." - -msgid "Enter two whole numbers." -msgstr "Unesite dva cela broja." - -msgid "Enter two numbers." -msgstr "Unesite dva broja." - -msgid "Enter two valid date/times." -msgstr "Unesite dva ispravna datuma/vremena." - -msgid "Enter two valid dates." -msgstr "Unesite dva ispravna datuma." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Lista sadrži %(show_value)dstavku, ne bi trebalo da sadrži više od " -"%(limit_value)d." -msgstr[1] "" -"Lista sadrži %(show_value)dstavke, ne bi trebalo da sadrži više od " -"%(limit_value)d." -msgstr[2] "" -"Lista sadrži %(show_value)dstavki, ne bi trebalo da sadrži više od " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Lista sadrži %(show_value)dstavku, ne bi trebalo da sadrži manje od " -"%(limit_value)d." -msgstr[1] "" -"Lista sadrži %(show_value)dstavke, ne bi trebalo da sadrži manje od " -"%(limit_value)d." -msgstr[2] "" -"Lista sadrži %(show_value)dstavki, ne bi trebalo da sadrži manje od " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Neki ključevi nedostaju: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Dati su neki nepoznati ključevi: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "Osigurajte da gornja granica opsega nije veća od %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Osigurajte da donja granica opsega nije manja od %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index 725396d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index a6cc037..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,110 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Anders Hovmöller , 2023 -# Elias Johnstone , 2022 -# Gustaf Hansen , 2015 -# Jonathan Lindén, 2015 -# Petter Strandmark , 2019 -# Thomas Lundqvist, 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Anders Hovmöller , 2023\n" -"Language-Team: Swedish (http://www.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL-tillägg" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Element %(nth)s i arrayen gick inte att validera:" - -msgid "Nested arrays must have the same length." -msgstr "Flerdimensionella arrayer måste vara av samma längd" - -msgid "Map of strings to strings/nulls" -msgstr "Funktion från sträng till sträng/null" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Värdet av “%(key)s” är inte en sträng eller null." - -msgid "Could not load JSON data." -msgstr "Kunde inte ladda JSON-data." - -msgid "Input must be a JSON dictionary." -msgstr "Input måste vara en JSON-dictionary." - -msgid "Enter two valid values." -msgstr "Fyll i två giltiga värden" - -msgid "The start of the range must not exceed the end of the range." -msgstr "Starten av intervallet kan inte vara större än slutet av intervallet." - -msgid "Enter two whole numbers." -msgstr "Fyll i två heltal." - -msgid "Enter two numbers." -msgstr "Fyll i två tal." - -msgid "Enter two valid date/times." -msgstr "Fyll i två giltiga datum/tider." - -msgid "Enter two valid dates." -msgstr "Fyll i två giltiga datum." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Listan innehåller %(show_value)d objekt, men kan inte innehålla fler än " -"%(limit_value)d." -msgstr[1] "" -"Listan innehåller %(show_value)d objekt, men kan inte innehålla fler än " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Listan innehåller %(show_value)d objekt, men kan inte innehålla färre än " -"%(limit_value)d." -msgstr[1] "" -"Listan innehåller %(show_value)d objekt, men kan inte innehålla färre än " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Några nycklar saknades: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Några okända okända nycklar skickades: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "Säkerställ att den övre gränsen inte överstiger %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Säkerställ att den undre gränsen inte understiger %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index 2e69e93..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index fffabf5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,101 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-15 00:32+0000\n" -"Last-Translator: Surush Sufiew \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "Расширения PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Элементи %(nth)s -и массив санҷишро нагузашт:" - -msgid "Nested arrays must have the same length." -msgstr "Массивҳои воридкардашуда бояд дарозиҳои якхела дошта бошанд." - -msgid "Map of strings to strings/nulls" -msgstr "Массивҳои strings ба strings/nulls" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "Боркунии JSON-додаҳо муяссар нашуд." - -msgid "Input must be a JSON dictionary." -msgstr "Қимматҳо бояд дар шакли JSON-луғатҳо ворид карда шаванд." - -msgid "Enter two valid values." -msgstr "Дуто қимати дуруст ворид созед." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Оғози фосила наметавонад қимати аз ҳудуди худ калонро қабул кунад." - -msgid "Enter two whole numbers." -msgstr "Дуто адади яклухтро ворид созед." - -msgid "Enter two numbers." -msgstr "Ду ададро ворид созед." - -msgid "Enter two valid date/times." -msgstr "Санаро бо вақт дуруст ворид кунед." - -msgid "Enter two valid dates." -msgstr "Дуто санаи дурустро ворид созед." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Баъзе аз калидҳо истисно карда шудаанд: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" -"Баъзе аз калидҳои овардашуда ба руйхати калидҳои маъмул дохил нестанд: " -"%(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" -"Мутмаин гардед, ки ҳамаи қиматҳои мутаалиқ ба ин фосила, кам ё баробаранд ба:" -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "Мутмаин шавед ки ин фосила зиёд ё баробаранд ба: %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index 06bda56..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index 6253652..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,107 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Resulkary , 2020 -# Welbeck Garli , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-07-15 16:27+0000\n" -"Last-Translator: Welbeck Garli \n" -"Language-Team: Turkmen (http://www.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL giňeltmeleri" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "" - -msgid "Nested arrays must have the same length." -msgstr "Iç-içe massiwleriň deň uzynlygy bolmaly." - -msgid "Map of strings to strings/nulls" -msgstr "Setirleriň setirler/boşluklara kartasy" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "\"%(key)s\" netijesi setir ýa-da boş däl" - -msgid "Could not load JSON data." -msgstr "JSON maglumatlary ýükläp bolmady." - -msgid "Input must be a JSON dictionary." -msgstr "Giriş JSON sözlügi bolmaly." - -msgid "Enter two valid values." -msgstr "Iki sany dogry baha giriziň." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Aralygyň başlangyjy soňundan ýokary bolmaly däldir." - -msgid "Enter two whole numbers." -msgstr "iki sany esasy san giriziň." - -msgid "Enter two numbers." -msgstr "Iki sany san giriz" - -msgid "Enter two valid date/times." -msgstr "Iki sany dogry senäni/wagty giriziň." - -msgid "Enter two valid dates." -msgstr "Iki sany dogry sene giriziň." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Bu listda %(show_value)d element bar, asyl %(limit_value)ddan köp element " -"bolmaly däldir." -msgstr[1] "" -"Bu listda %(show_value)d element bar, asyl %(limit_value)ddan köp element " -"bolmaly däldir." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Bu listda %(show_value)d element bar, asyl %(limit_value)ddan az element " -"bolmaly däldir." -msgstr[1] "" -"Bu listda %(show_value)d element bar, asyl %(limit_value)ddan az element " -"bolmaly däldir." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Käbir açarlar ýok: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Käbir bilinmeýän açarlar girizilen: %(keys)s" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "Şu iki aralygyň %(limit_value)s'a deň ýa-da azdygyna göz ýetiriň." - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "Şu iki aralygyň %(limit_value)s'a deň ýa-da köpdügine göz ýetiriň." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index 849a5e7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index e8c4ea9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,109 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BouRock, 2015-2019,2023 -# BouRock, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: BouRock, 2015-2019,2023\n" -"Language-Team: Turkish (http://www.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL uzantıları" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Dizilimdeki %(nth)s öğesi doğrulanmadı:" - -msgid "Nested arrays must have the same length." -msgstr "İç içe dizilimler aynı uzunlukta olmak zorunda." - -msgid "Map of strings to strings/nulls" -msgstr "Dizgiler/boşlar olarak dizgilerin eşlemesi" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "“%(key)s” değeri bir dizgi ya da boş değil." - -msgid "Could not load JSON data." -msgstr "JSON verisi yüklenemedi." - -msgid "Input must be a JSON dictionary." -msgstr "Bir JSON dizini girilmek zorundadır." - -msgid "Enter two valid values." -msgstr "Iki geçerli değer girin." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Aralığın başlangıcı aralığın bitişini aşmamak zorundadır." - -msgid "Enter two whole numbers." -msgstr "Bütün iki sayıyı girin." - -msgid "Enter two numbers." -msgstr "İki sayı girin." - -msgid "Enter two valid date/times." -msgstr "Geçerli iki tarih/saat girin." - -msgid "Enter two valid dates." -msgstr "Geçerli iki tarih girin." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Liste %(show_value)d öğe içeriyor, %(limit_value)d değerden daha fazla " -"içermemelidir." -msgstr[1] "" -"Liste %(show_value)d öğe içeriyor, %(limit_value)d değerden daha fazla " -"içermemelidir." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Liste %(show_value)d öğe içeriyor, %(limit_value)d değerden daha az " -"içermemelidir." -msgstr[1] "" -"Liste %(show_value)d öğe içeriyor, %(limit_value)d değerden daha az " -"içermemelidir." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Bazı anahtarlar eksik: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Bazı bilinmeyen anahtarlar verilmiş: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"Aralığın üst sınırının %(limit_value)s değerinden büyük olmadığından emin " -"olun." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"Aralığın alt sınırının %(limit_value)s değerinden az olmadığından emin olun." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ug/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index 08b016e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ug/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index c0a400b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,107 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abduqadir Abliz , 2023 -# Azat, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-12-04 09:22+0000\n" -"Last-Translator: Azat, 2023\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL كېڭەيتمىلەر" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "تىزىملىكتىكى %(nth)s تەرتىپلىك ئېلېمېنت توغرىلانمىدى:" - -msgid "Nested arrays must have the same length." -msgstr "ئىچكى تىزىملىكلەرنىڭ ئۇزۇنلۇقى ئوخشاش بولۇشى كېرەك." - -msgid "Map of strings to strings/nulls" -msgstr "تېكىستلەرنىڭ/نۇللارنىڭ خەرىتىسى" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "“%(key)s” نىڭ قىممىتى تېكىست ياكى نۇلل ئەمەس." - -msgid "Could not load JSON data." -msgstr "JSON سانلىق مەلۇماتنى يۈكلىيەلمىدى." - -msgid "Input must be a JSON dictionary." -msgstr "كىرگۈزۈلگىنى چوقۇم JSON لۇغىتى بولۇشى لازىم." - -msgid "Enter two valid values." -msgstr "ئىككى ئىناۋەتلىك قىممەت كىرگۈزۈلىدۇ." - -msgid "The start of the range must not exceed the end of the range." -msgstr "دائىرەنىڭ باشلىنىشى دائىرەنىڭ ئاخىرىدىن ئېشىپ كەتمەسلىكى كېرەك." - -msgid "Enter two whole numbers." -msgstr "ئىككى پۈتۈن سان كىرگۈزۈلىدۇ." - -msgid "Enter two numbers." -msgstr "ئىككى سان كىرگۈزۈلىدۇ." - -msgid "Enter two valid date/times." -msgstr "ئىناۋەتلىك ئىككى چېسلا/ۋاقىت كىرگۈزۈلىدۇ." - -msgid "Enter two valid dates." -msgstr "ئىككى ئىناۋەتلىك چېسلا كىرگۈزۈلىدۇ." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"تىزىملىك %(show_value)d تەرتىپلىك ئېلېمېنت ئۆز ئىچىگە ئالىدۇ، بۇنىڭدا " -"%(limit_value)d تەرتىپلىك ئېلېمېنتتىن ئاشماسلىكى كېرەك." -msgstr[1] "" -"تىزىملىك %(show_value)d تەرتىپلىك ئېلېمېنت ئۆز ئىچىگە ئالىدۇ، بۇنىڭدا " -"%(limit_value)d تەرتىپلىك ئېلېمېنتتىن ئاشماسلىكى كېرەك." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"تىزىملىك %(show_value)d تەرتىپلىك ئېلېمېنت ئۆز ئىچىگە ئالىدۇ، بۇنىڭدا " -"%(limit_value)d تەرتىپلىك ئېلېمېنتتىن كەم بولماسلىغى كېرەك." -msgstr[1] "" -"تىزىملىك %(show_value)d تەرتىپلىك ئېلېمېنت ئۆز ئىچىگە ئالىدۇ، بۇنىڭدا " -"%(limit_value)d تەرتىپلىك ئېلېمېنتتىن كەم بولماسلىغى كېرەك." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "بەزى ئاچقۇچلار يوق: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "بەزى ئاچقۇچلار تەمىنلەنمىگەن: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" -"دائىرەنىڭ يۇقىرى چەكلىمىسى%(limit_value)s دىن چوڭ بولماسلىكىنى جەزملەڭ." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" -"دائىرەنىڭ ئاستى چەكلىمىسى %(limit_value)s دىن ئاز بولماسلىكىنى جەزملەڭ." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index 60e9d92..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index 282a03b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,126 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andriy Sokolovskiy , 2015 -# Denis Podlesniy , 2016 -# Igor Melnyk, 2017 -# Illia Volochii , 2021,2023 -# Kirill Gagarski , 2015-2016 -# tarasyyyk , 2018 -# Zoriana Zaiats, 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Illia Volochii , 2021,2023\n" -"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -msgid "PostgreSQL extensions" -msgstr "Розширення PostgreSQL" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Елемент %(nth)s у масиві не коректний:" - -msgid "Nested arrays must have the same length." -msgstr "Вкладени масиви повинні бути одинакової довжини." - -msgid "Map of strings to strings/nulls" -msgstr "Асоціативний масив із рядків у рядки/обнулення" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "Значення “%(key)s” не є рядком чи null." - -msgid "Could not load JSON data." -msgstr "Не вдалося завантажити JSON-дані." - -msgid "Input must be a JSON dictionary." -msgstr "Значення повинне бути JSON-словником." - -msgid "Enter two valid values." -msgstr "Введіть два корректних значення." - -msgid "The start of the range must not exceed the end of the range." -msgstr "Початок діапазону не повинен перевищувати кінець діапазону." - -msgid "Enter two whole numbers." -msgstr "Введіть два ціліх числа." - -msgid "Enter two numbers." -msgstr "Введіть два числа." - -msgid "Enter two valid date/times." -msgstr "Введіть дві коректні дати з часом." - -msgid "Enter two valid dates." -msgstr "Введіть дві коректні дати." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" -"Список містить %(show_value)d елемент, кількість яких не має перевищувати " -"%(limit_value)d." -msgstr[1] "" -"Список містить %(show_value)d елементи, кількість яких не має перевищувати " -"%(limit_value)d." -msgstr[2] "" -"Список містить %(show_value)d елементів, кількість яких не має перевищувати " -"%(limit_value)d." -msgstr[3] "" -"Список містить %(show_value)d елементів, кількість яких не має перевищувати " -"%(limit_value)d." - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" -"Список містить %(show_value)d елемент, кількість яких не має бути не менша " -"%(limit_value)d." -msgstr[1] "" -"Список містить %(show_value)d елементів, кількість яких не має бути не менша " -"%(limit_value)d." -msgstr[2] "" -"Список містить %(show_value)d елемента, кількість яких не має бути не менша " -"%(limit_value)d." -msgstr[3] "" -"Список містить %(show_value)d елемента, кількість яких не має бути не менша " -"%(limit_value)d." - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "Не вистачає наступних ключів: %(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "Були надані наступні невідомі ключі: %(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "Переконайтеся, що верхня межа діапазону не перевищує %(limit_value)s." - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "Переконайтеся, що нижня межа діапазону не менша ніж %(limit_value)s." diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uz/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uz/LC_MESSAGES/django.mo deleted file mode 100644 index f2d4c0d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uz/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uz/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uz/LC_MESSAGES/django.po deleted file mode 100644 index ca8a24c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/uz/LC_MESSAGES/django.po +++ /dev/null @@ -1,95 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abdulaminkhon Khaydarov , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-07-25 17:13+0000\n" -"Last-Translator: Abdulaminkhon Khaydarov \n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL kengaytmalar" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "Massiv %(nth)s elementi tasdiqlanmadi:" - -msgid "Nested arrays must have the same length." -msgstr "Ichki massivlar bir xil uzunlikda bo'lishi kerak." - -msgid "Map of strings to strings/nulls" -msgstr "" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "" - -msgid "Could not load JSON data." -msgstr "" - -msgid "Input must be a JSON dictionary." -msgstr "" - -msgid "Enter two valid values." -msgstr "" - -msgid "The start of the range must not exceed the end of the range." -msgstr "" - -msgid "Enter two whole numbers." -msgstr "" - -msgid "Enter two numbers." -msgstr "" - -msgid "Enter two valid date/times." -msgstr "" - -msgid "Enter two valid dates." -msgstr "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure that this range is completely greater than or equal to " -"%(limit_value)s." -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index 3e0c140..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index ac0b4b8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,100 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Lele Long , 2015,2017 -# Liping Wang , 2016 -# Liping Wang , 2016 -# wang zhao <672565116@qq.com>, 2018 -# wolf ice , 2020 -# 高乐喆 , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: 高乐喆 , 2023\n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL 扩展。" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "数组中的%(nth)s项目没有验证:" - -msgid "Nested arrays must have the same length." -msgstr "嵌套数组必须是相同长度。" - -msgid "Map of strings to strings/nulls" -msgstr "字符串到字符串/空的映射" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "“%(key)s”的值不是一个字符串或null" - -msgid "Could not load JSON data." -msgstr "不能加载JSON数据。" - -msgid "Input must be a JSON dictionary." -msgstr "输入必须是JSON字典。" - -msgid "Enter two valid values." -msgstr "输入两个有效的值。" - -msgid "The start of the range must not exceed the end of the range." -msgstr "区间开头不能超过区间结尾。" - -msgid "Enter two whole numbers." -msgstr "输入两个整数。" - -msgid "Enter two numbers." -msgstr "输入两个数字。" - -msgid "Enter two valid date/times." -msgstr "输入两个有效的日期/时间。" - -msgid "Enter two valid dates." -msgstr "输入两个有效日期。" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "列表已包含 %(show_value)d 项,不应该超过 %(limit_value)d 项。" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "列表已包含 %(show_value)d 项,不应该少于 %(limit_value)d 项。" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "某些键缺失:%(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "包含未知的键:%(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "确保范围的上限不大于%(limit_value)s。" - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "确保范围的下限不小于%(limit_value)s。" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index 3a13d4e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index e82920a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,98 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chen Chun-Chia , 2015 -# yubike, 2024 -# Tzu-ping Chung , 2016-2017,2019 -# YAO WEN LIANG, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2024-08-07 09:22+0000\n" -"Last-Translator: YAO WEN LIANG, 2024\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "PostgreSQL extensions" -msgstr "PostgreSQL 擴充" - -#, python-format -msgid "Item %(nth)s in the array did not validate:" -msgstr "陣列中第 %(nth)s 個物件驗證失敗:" - -msgid "Nested arrays must have the same length." -msgstr "各嵌套陣列長度必須相同。" - -msgid "Map of strings to strings/nulls" -msgstr "字串與字串/空值的對應" - -#, python-format -msgid "The value of “%(key)s” is not a string or null." -msgstr "「%(key)s」並非字串或空值。" - -msgid "Could not load JSON data." -msgstr "無法載入 JSON 資料。" - -msgid "Input must be a JSON dictionary." -msgstr "必須輸入 JSON 字典。" - -msgid "Enter two valid values." -msgstr "請輸入兩個有效的值" - -msgid "The start of the range must not exceed the end of the range." -msgstr "範圍的起始不可超過範圍的結束。" - -msgid "Enter two whole numbers." -msgstr "請輸入兩個整數" - -msgid "Enter two numbers." -msgstr "請輸入兩個數字" - -msgid "Enter two valid date/times." -msgstr "請輸入兩個有效的日期/時間" - -msgid "Enter two valid dates." -msgstr "請輸入兩個有效的日期" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no more than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no more than " -"%(limit_value)d." -msgstr[0] "列表包含 %(show_value)d 個物件,但不應包含多於 %(limit_value)d 個。" - -#, python-format -msgid "" -"List contains %(show_value)d item, it should contain no fewer than " -"%(limit_value)d." -msgid_plural "" -"List contains %(show_value)d items, it should contain no fewer than " -"%(limit_value)d." -msgstr[0] "列表包含 %(show_value)d 個物件,但應至少包含 %(limit_value)d 個。" - -#, python-format -msgid "Some keys were missing: %(keys)s" -msgstr "缺少鍵值:%(keys)s" - -#, python-format -msgid "Some unknown keys were provided: %(keys)s" -msgstr "包含不明鍵值:%(keys)s" - -#, python-format -msgid "" -"Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "請確保範圍的上限不會大於%(limit_value)s。" - -#, python-format -msgid "" -"Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "請確保範圍的下限不會小於%(limit_value)s。" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/lookups.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/lookups.py deleted file mode 100644 index 4e1783f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/lookups.py +++ /dev/null @@ -1,78 +0,0 @@ -from django.db.models import Transform -from django.db.models.lookups import PostgresOperatorLookup -from django.db.models.sql.query import Query - -from .search import SearchVector, SearchVectorExact, SearchVectorField - - -class DataContains(PostgresOperatorLookup): - lookup_name = "contains" - postgres_operator = "@>" - - -class ContainedBy(PostgresOperatorLookup): - lookup_name = "contained_by" - postgres_operator = "<@" - - -class Overlap(PostgresOperatorLookup): - lookup_name = "overlap" - postgres_operator = "&&" - - def get_prep_lookup(self): - from .expressions import ArraySubquery - - if isinstance(self.rhs, Query): - self.rhs = ArraySubquery(self.rhs) - return super().get_prep_lookup() - - -class HasKey(PostgresOperatorLookup): - lookup_name = "has_key" - postgres_operator = "?" - prepare_rhs = False - - -class HasKeys(PostgresOperatorLookup): - lookup_name = "has_keys" - postgres_operator = "?&" - - def get_prep_lookup(self): - return [str(item) for item in self.rhs] - - -class HasAnyKeys(HasKeys): - lookup_name = "has_any_keys" - postgres_operator = "?|" - - -class Unaccent(Transform): - bilateral = True - lookup_name = "unaccent" - function = "UNACCENT" - - -class SearchLookup(SearchVectorExact): - lookup_name = "search" - - def process_lhs(self, qn, connection): - if not isinstance(self.lhs.output_field, SearchVectorField): - config = getattr(self.rhs, "config", None) - self.lhs = SearchVector(self.lhs, config=config) - lhs, lhs_params = super().process_lhs(qn, connection) - return lhs, lhs_params - - -class TrigramSimilar(PostgresOperatorLookup): - lookup_name = "trigram_similar" - postgres_operator = "%%" - - -class TrigramWordSimilar(PostgresOperatorLookup): - lookup_name = "trigram_word_similar" - postgres_operator = "%%>" - - -class TrigramStrictWordSimilar(PostgresOperatorLookup): - lookup_name = "trigram_strict_word_similar" - postgres_operator = "%%>>" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/operations.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/operations.py deleted file mode 100644 index 84360fe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/operations.py +++ /dev/null @@ -1,349 +0,0 @@ -from django.contrib.postgres.signals import ( - get_citext_oids, - get_hstore_oids, - register_type_handlers, -) -from django.db import NotSupportedError, router -from django.db.migrations import AddConstraint, AddIndex, RemoveIndex -from django.db.migrations.operations.base import Operation, OperationCategory -from django.db.models.constraints import CheckConstraint - - -class CreateExtension(Operation): - reversible = True - category = OperationCategory.ADDITION - - def __init__(self, name): - self.name = name - - def state_forwards(self, app_label, state): - pass - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - if schema_editor.connection.vendor != "postgresql" or not router.allow_migrate( - schema_editor.connection.alias, app_label - ): - return - if not self.extension_exists(schema_editor, self.name): - schema_editor.execute( - "CREATE EXTENSION IF NOT EXISTS %s" - % schema_editor.quote_name(self.name) - ) - # Clear cached, stale oids. - get_hstore_oids.cache_clear() - get_citext_oids.cache_clear() - # Registering new type handlers cannot be done before the extension is - # installed, otherwise a subsequent data migration would use the same - # connection. - register_type_handlers(schema_editor.connection) - if hasattr(schema_editor.connection, "register_geometry_adapters"): - schema_editor.connection.register_geometry_adapters( - schema_editor.connection.connection, True - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - if not router.allow_migrate(schema_editor.connection.alias, app_label): - return - if self.extension_exists(schema_editor, self.name): - schema_editor.execute( - "DROP EXTENSION IF EXISTS %s" % schema_editor.quote_name(self.name) - ) - # Clear cached, stale oids. - get_hstore_oids.cache_clear() - get_citext_oids.cache_clear() - - def extension_exists(self, schema_editor, extension): - with schema_editor.connection.cursor() as cursor: - cursor.execute( - "SELECT 1 FROM pg_extension WHERE extname = %s", - [extension], - ) - return bool(cursor.fetchone()) - - def describe(self): - return "Creates extension %s" % self.name - - @property - def migration_name_fragment(self): - return "create_extension_%s" % self.name - - -class BloomExtension(CreateExtension): - def __init__(self): - self.name = "bloom" - - -class BtreeGinExtension(CreateExtension): - def __init__(self): - self.name = "btree_gin" - - -class BtreeGistExtension(CreateExtension): - def __init__(self): - self.name = "btree_gist" - - -class CITextExtension(CreateExtension): - def __init__(self): - self.name = "citext" - - -class CryptoExtension(CreateExtension): - def __init__(self): - self.name = "pgcrypto" - - -class HStoreExtension(CreateExtension): - def __init__(self): - self.name = "hstore" - - -class TrigramExtension(CreateExtension): - def __init__(self): - self.name = "pg_trgm" - - -class UnaccentExtension(CreateExtension): - def __init__(self): - self.name = "unaccent" - - -class NotInTransactionMixin: - def _ensure_not_in_transaction(self, schema_editor): - if schema_editor.connection.in_atomic_block: - raise NotSupportedError( - "The %s operation cannot be executed inside a transaction " - "(set atomic = False on the migration)." % self.__class__.__name__ - ) - - -class AddIndexConcurrently(NotInTransactionMixin, AddIndex): - """Create an index using PostgreSQL's CREATE INDEX CONCURRENTLY syntax.""" - - atomic = False - category = OperationCategory.ADDITION - - def describe(self): - return "Concurrently create index %s on field(s) %s of model %s" % ( - self.index.name, - ", ".join(self.index.fields), - self.model_name, - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - self._ensure_not_in_transaction(schema_editor) - model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.add_index(model, self.index, concurrently=True) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - self._ensure_not_in_transaction(schema_editor) - model = from_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.remove_index(model, self.index, concurrently=True) - - -class RemoveIndexConcurrently(NotInTransactionMixin, RemoveIndex): - """Remove an index using PostgreSQL's DROP INDEX CONCURRENTLY syntax.""" - - atomic = False - category = OperationCategory.REMOVAL - - def describe(self): - return "Concurrently remove index %s from %s" % (self.name, self.model_name) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - self._ensure_not_in_transaction(schema_editor) - model = from_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - from_model_state = from_state.models[app_label, self.model_name_lower] - index = from_model_state.get_index_by_name(self.name) - schema_editor.remove_index(model, index, concurrently=True) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - self._ensure_not_in_transaction(schema_editor) - model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - to_model_state = to_state.models[app_label, self.model_name_lower] - index = to_model_state.get_index_by_name(self.name) - schema_editor.add_index(model, index, concurrently=True) - - -class CollationOperation(Operation): - def __init__(self, name, locale, *, provider="libc", deterministic=True): - self.name = name - self.locale = locale - self.provider = provider - self.deterministic = deterministic - - def state_forwards(self, app_label, state): - pass - - def deconstruct(self): - kwargs = {"name": self.name, "locale": self.locale} - if self.provider and self.provider != "libc": - kwargs["provider"] = self.provider - if self.deterministic is False: - kwargs["deterministic"] = self.deterministic - return ( - self.__class__.__qualname__, - [], - kwargs, - ) - - def create_collation(self, schema_editor): - args = {"locale": schema_editor.quote_name(self.locale)} - if self.provider != "libc": - args["provider"] = schema_editor.quote_name(self.provider) - if self.deterministic is False: - args["deterministic"] = "false" - schema_editor.execute( - "CREATE COLLATION %(name)s (%(args)s)" - % { - "name": schema_editor.quote_name(self.name), - "args": ", ".join( - f"{option}={value}" for option, value in args.items() - ), - } - ) - - def remove_collation(self, schema_editor): - schema_editor.execute( - "DROP COLLATION %s" % schema_editor.quote_name(self.name), - ) - - -class CreateCollation(CollationOperation): - """Create a collation.""" - - category = OperationCategory.ADDITION - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - if schema_editor.connection.vendor != "postgresql" or not router.allow_migrate( - schema_editor.connection.alias, app_label - ): - return - self.create_collation(schema_editor) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - if not router.allow_migrate(schema_editor.connection.alias, app_label): - return - self.remove_collation(schema_editor) - - def describe(self): - return f"Create collation {self.name}" - - @property - def migration_name_fragment(self): - return "create_collation_%s" % self.name.lower() - - def reduce(self, operation, app_label): - if isinstance(operation, RemoveCollation) and self.name == operation.name: - return [] - return super().reduce(operation, app_label) - - -class RemoveCollation(CollationOperation): - """Remove a collation.""" - - category = OperationCategory.REMOVAL - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - if schema_editor.connection.vendor != "postgresql" or not router.allow_migrate( - schema_editor.connection.alias, app_label - ): - return - self.remove_collation(schema_editor) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - if not router.allow_migrate(schema_editor.connection.alias, app_label): - return - self.create_collation(schema_editor) - - def describe(self): - return f"Remove collation {self.name}" - - @property - def migration_name_fragment(self): - return "remove_collation_%s" % self.name.lower() - - -class AddConstraintNotValid(AddConstraint): - """ - Add a table constraint without enforcing validation, using PostgreSQL's - NOT VALID syntax. - """ - - category = OperationCategory.ADDITION - - def __init__(self, model_name, constraint): - if not isinstance(constraint, CheckConstraint): - raise TypeError( - "AddConstraintNotValid.constraint must be a check constraint." - ) - super().__init__(model_name, constraint) - - def describe(self): - return "Create not valid constraint %s on model %s" % ( - self.constraint.name, - self.model_name, - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - model = from_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - constraint_sql = self.constraint.create_sql(model, schema_editor) - if constraint_sql: - # Constraint.create_sql returns interpolated SQL which makes - # params=None a necessity to avoid escaping attempts on - # execution. - schema_editor.execute(str(constraint_sql) + " NOT VALID", params=None) - - @property - def migration_name_fragment(self): - return super().migration_name_fragment + "_not_valid" - - -class ValidateConstraint(Operation): - """Validate a table NOT VALID constraint.""" - - category = OperationCategory.ALTERATION - - def __init__(self, model_name, name): - self.model_name = model_name - self.name = name - - def describe(self): - return "Validate constraint %s on model %s" % (self.name, self.model_name) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - model = from_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.execute( - "ALTER TABLE %s VALIDATE CONSTRAINT %s" - % ( - schema_editor.quote_name(model._meta.db_table), - schema_editor.quote_name(self.name), - ) - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - # PostgreSQL does not provide a way to make a constraint invalid. - pass - - def state_forwards(self, app_label, state): - pass - - @property - def migration_name_fragment(self): - return "%s_validate_%s" % (self.model_name.lower(), self.name.lower()) - - def deconstruct(self): - return ( - self.__class__.__name__, - [], - { - "model_name": self.model_name, - "name": self.name, - }, - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/search.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/search.py deleted file mode 100644 index 4d27985..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/search.py +++ /dev/null @@ -1,383 +0,0 @@ -from django.db.models import ( - CharField, - Expression, - Field, - FloatField, - Func, - Lookup, - TextField, - Value, -) -from django.db.models.expressions import CombinedExpression, register_combinable_fields -from django.db.models.functions import Cast, Coalesce - - -class SearchVectorExact(Lookup): - lookup_name = "exact" - - def process_rhs(self, qn, connection): - if not isinstance(self.rhs, (SearchQuery, CombinedSearchQuery)): - config = getattr(self.lhs, "config", None) - self.rhs = SearchQuery(self.rhs, config=config) - rhs, rhs_params = super().process_rhs(qn, connection) - return rhs, rhs_params - - def as_sql(self, qn, connection): - lhs, lhs_params = self.process_lhs(qn, connection) - rhs, rhs_params = self.process_rhs(qn, connection) - params = lhs_params + rhs_params - return "%s @@ %s" % (lhs, rhs), params - - -class SearchVectorField(Field): - def db_type(self, connection): - return "tsvector" - - -class SearchQueryField(Field): - def db_type(self, connection): - return "tsquery" - - -class _Float4Field(Field): - def db_type(self, connection): - return "float4" - - -class SearchConfig(Expression): - def __init__(self, config): - super().__init__() - if not hasattr(config, "resolve_expression"): - config = Value(config) - self.config = config - - @classmethod - def from_parameter(cls, config): - if config is None or isinstance(config, cls): - return config - return cls(config) - - def get_source_expressions(self): - return [self.config] - - def set_source_expressions(self, exprs): - (self.config,) = exprs - - def as_sql(self, compiler, connection): - sql, params = compiler.compile(self.config) - return "%s::regconfig" % sql, params - - -class SearchVectorCombinable: - ADD = "||" - - def _combine(self, other, connector, reversed): - if not isinstance(other, SearchVectorCombinable): - raise TypeError( - "SearchVector can only be combined with other SearchVector " - "instances, got %s." % type(other).__name__ - ) - if reversed: - return CombinedSearchVector(other, connector, self, self.config) - return CombinedSearchVector(self, connector, other, self.config) - - -register_combinable_fields( - SearchVectorField, SearchVectorCombinable.ADD, SearchVectorField, SearchVectorField -) - - -class SearchVector(SearchVectorCombinable, Func): - function = "to_tsvector" - arg_joiner = " || ' ' || " - output_field = SearchVectorField() - - def __init__(self, *expressions, config=None, weight=None): - super().__init__(*expressions) - self.config = SearchConfig.from_parameter(config) - if weight is not None and not hasattr(weight, "resolve_expression"): - weight = Value(weight) - self.weight = weight - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - resolved = super().resolve_expression( - query, allow_joins, reuse, summarize, for_save - ) - if self.config: - resolved.config = self.config.resolve_expression( - query, allow_joins, reuse, summarize, for_save - ) - return resolved - - def as_sql(self, compiler, connection, function=None, template=None): - clone = self.copy() - clone.set_source_expressions( - [ - Coalesce( - ( - expression - if isinstance(expression.output_field, (CharField, TextField)) - else Cast(expression, TextField()) - ), - Value(""), - ) - for expression in clone.get_source_expressions() - ] - ) - config_sql = None - config_params = [] - if template is None: - if clone.config: - config_sql, config_params = compiler.compile(clone.config) - template = "%(function)s(%(config)s, %(expressions)s)" - else: - template = clone.template - sql, params = super(SearchVector, clone).as_sql( - compiler, - connection, - function=function, - template=template, - config=config_sql, - ) - extra_params = [] - if clone.weight: - weight_sql, extra_params = compiler.compile(clone.weight) - sql = "setweight({}, {})".format(sql, weight_sql) - - return sql, config_params + params + extra_params - - -class CombinedSearchVector(SearchVectorCombinable, CombinedExpression): - def __init__(self, lhs, connector, rhs, config, output_field=None): - self.config = config - super().__init__(lhs, connector, rhs, output_field) - - -class SearchQueryCombinable: - BITAND = "&&" - BITOR = "||" - - def _combine(self, other, connector, reversed): - if not isinstance(other, SearchQueryCombinable): - raise TypeError( - "SearchQuery can only be combined with other SearchQuery " - "instances, got %s." % type(other).__name__ - ) - if reversed: - return CombinedSearchQuery(other, connector, self, self.config) - return CombinedSearchQuery(self, connector, other, self.config) - - # On Combinable, these are not implemented to reduce confusion with Q. In - # this case we are actually (ab)using them to do logical combination so - # it's consistent with other usage in Django. - def __or__(self, other): - return self._combine(other, self.BITOR, False) - - def __ror__(self, other): - return self._combine(other, self.BITOR, True) - - def __and__(self, other): - return self._combine(other, self.BITAND, False) - - def __rand__(self, other): - return self._combine(other, self.BITAND, True) - - -class SearchQuery(SearchQueryCombinable, Func): - output_field = SearchQueryField() - SEARCH_TYPES = { - "plain": "plainto_tsquery", - "phrase": "phraseto_tsquery", - "raw": "to_tsquery", - "websearch": "websearch_to_tsquery", - } - - def __init__( - self, - value, - output_field=None, - *, - config=None, - invert=False, - search_type="plain", - ): - self.function = self.SEARCH_TYPES.get(search_type) - if self.function is None: - raise ValueError("Unknown search_type argument '%s'." % search_type) - if not hasattr(value, "resolve_expression"): - value = Value(value) - expressions = (value,) - self.config = SearchConfig.from_parameter(config) - if self.config is not None: - expressions = (self.config,) + expressions - self.invert = invert - super().__init__(*expressions, output_field=output_field) - - def as_sql(self, compiler, connection, function=None, template=None): - sql, params = super().as_sql(compiler, connection, function, template) - if self.invert: - sql = "!!(%s)" % sql - return sql, params - - def __invert__(self): - clone = self.copy() - clone.invert = not self.invert - return clone - - def __str__(self): - result = super().__str__() - return ("~%s" % result) if self.invert else result - - -class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression): - def __init__(self, lhs, connector, rhs, config, output_field=None): - self.config = config - super().__init__(lhs, connector, rhs, output_field) - - def __str__(self): - return "(%s)" % super().__str__() - - -class SearchRank(Func): - function = "ts_rank" - output_field = FloatField() - - def __init__( - self, - vector, - query, - weights=None, - normalization=None, - cover_density=False, - ): - from .fields.array import ArrayField - - if not hasattr(vector, "resolve_expression"): - vector = SearchVector(vector) - if not hasattr(query, "resolve_expression"): - query = SearchQuery(query) - expressions = (vector, query) - if weights is not None: - if not hasattr(weights, "resolve_expression"): - weights = Value(weights) - weights = Cast(weights, ArrayField(_Float4Field())) - expressions = (weights,) + expressions - if normalization is not None: - if not hasattr(normalization, "resolve_expression"): - normalization = Value(normalization) - expressions += (normalization,) - if cover_density: - self.function = "ts_rank_cd" - super().__init__(*expressions) - - -class SearchHeadline(Func): - function = "ts_headline" - template = "%(function)s(%(expressions)s%(options)s)" - output_field = TextField() - - def __init__( - self, - expression, - query, - *, - config=None, - start_sel=None, - stop_sel=None, - max_words=None, - min_words=None, - short_word=None, - highlight_all=None, - max_fragments=None, - fragment_delimiter=None, - ): - if not hasattr(query, "resolve_expression"): - query = SearchQuery(query) - options = { - "StartSel": start_sel, - "StopSel": stop_sel, - "MaxWords": max_words, - "MinWords": min_words, - "ShortWord": short_word, - "HighlightAll": highlight_all, - "MaxFragments": max_fragments, - "FragmentDelimiter": fragment_delimiter, - } - self.options = { - option: value for option, value in options.items() if value is not None - } - expressions = (expression, query) - if config is not None: - config = SearchConfig.from_parameter(config) - expressions = (config,) + expressions - super().__init__(*expressions) - - def as_sql(self, compiler, connection, function=None, template=None): - options_sql = "" - options_params = [] - if self.options: - options_params.append( - ", ".join( - connection.ops.compose_sql(f"{option}=%s", [value]) - for option, value in self.options.items() - ) - ) - options_sql = ", %s" - sql, params = super().as_sql( - compiler, - connection, - function=function, - template=template, - options=options_sql, - ) - return sql, params + options_params - - -SearchVectorField.register_lookup(SearchVectorExact) - - -class TrigramBase(Func): - output_field = FloatField() - - def __init__(self, expression, string, **extra): - if not hasattr(string, "resolve_expression"): - string = Value(string) - super().__init__(expression, string, **extra) - - -class TrigramWordBase(Func): - output_field = FloatField() - - def __init__(self, string, expression, **extra): - if not hasattr(string, "resolve_expression"): - string = Value(string) - super().__init__(string, expression, **extra) - - -class TrigramSimilarity(TrigramBase): - function = "SIMILARITY" - - -class TrigramDistance(TrigramBase): - function = "" - arg_joiner = " <-> " - - -class TrigramWordDistance(TrigramWordBase): - function = "" - arg_joiner = " <<-> " - - -class TrigramStrictWordDistance(TrigramWordBase): - function = "" - arg_joiner = " <<<-> " - - -class TrigramWordSimilarity(TrigramWordBase): - function = "WORD_SIMILARITY" - - -class TrigramStrictWordSimilarity(TrigramWordBase): - function = "STRICT_WORD_SIMILARITY" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/serializers.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/serializers.py deleted file mode 100644 index d04bfdb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/serializers.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.db.migrations.serializer import BaseSerializer - - -class RangeSerializer(BaseSerializer): - def serialize(self): - module = self.value.__class__.__module__ - # Ranges are implemented in psycopg2._range but the public import - # location is psycopg2.extras. - module = "psycopg2.extras" if module == "psycopg2._range" else module - return "%s.%r" % (module, self.value), {"import %s" % module} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/signals.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/signals.py deleted file mode 100644 index a3816d3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/signals.py +++ /dev/null @@ -1,80 +0,0 @@ -import functools - -from django.db import connections -from django.db.backends.base.base import NO_DB_ALIAS -from django.db.backends.postgresql.psycopg_any import is_psycopg3 - - -def get_type_oids(connection_alias, type_name): - with connections[connection_alias].cursor() as cursor: - cursor.execute( - "SELECT oid, typarray FROM pg_type WHERE typname = %s", (type_name,) - ) - oids = [] - array_oids = [] - for row in cursor: - oids.append(row[0]) - array_oids.append(row[1]) - return tuple(oids), tuple(array_oids) - - -@functools.lru_cache -def get_hstore_oids(connection_alias): - """Return hstore and hstore array OIDs.""" - return get_type_oids(connection_alias, "hstore") - - -@functools.lru_cache -def get_citext_oids(connection_alias): - """Return citext and citext array OIDs.""" - return get_type_oids(connection_alias, "citext") - - -if is_psycopg3: - from psycopg.types import TypeInfo, hstore - - def register_type_handlers(connection, **kwargs): - if connection.vendor != "postgresql" or connection.alias == NO_DB_ALIAS: - return - - oids, array_oids = get_hstore_oids(connection.alias) - for oid, array_oid in zip(oids, array_oids): - ti = TypeInfo("hstore", oid, array_oid) - hstore.register_hstore(ti, connection.connection) - - _, citext_oids = get_citext_oids(connection.alias) - for array_oid in citext_oids: - ti = TypeInfo("citext", 0, array_oid) - ti.register(connection.connection) - -else: - import psycopg2 - from psycopg2.extras import register_hstore - - def register_type_handlers(connection, **kwargs): - if connection.vendor != "postgresql" or connection.alias == NO_DB_ALIAS: - return - - oids, array_oids = get_hstore_oids(connection.alias) - # Don't register handlers when hstore is not available on the database. - # - # If someone tries to create an hstore field it will error there. This is - # necessary as someone may be using PSQL without extensions installed but - # be using other features of contrib.postgres. - # - # This is also needed in order to create the connection in order to install - # the hstore extension. - if oids: - register_hstore( - connection.connection, globally=True, oid=oids, array_oid=array_oids - ) - - oids, citext_oids = get_citext_oids(connection.alias) - # Don't register handlers when citext is not available on the database. - # - # The same comments in the above call to register_hstore() also apply here. - if oids: - array_type = psycopg2.extensions.new_array_type( - citext_oids, "citext[]", psycopg2.STRING - ) - psycopg2.extensions.register_type(array_type, None) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/templates/postgres/widgets/split_array.html b/.venv/lib/python3.10/site-packages/django/contrib/postgres/templates/postgres/widgets/split_array.html deleted file mode 100644 index 32fda82..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/templates/postgres/widgets/split_array.html +++ /dev/null @@ -1 +0,0 @@ -{% include 'django/forms/widgets/multiwidget.html' %} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/utils.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/utils.py deleted file mode 100644 index e4f4d81..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/utils.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.core.exceptions import ValidationError -from django.utils.functional import SimpleLazyObject -from django.utils.text import format_lazy - - -def prefix_validation_error(error, prefix, code, params): - """ - Prefix a validation error message while maintaining the existing - validation data structure. - """ - if error.error_list == [error]: - error_params = error.params or {} - return ValidationError( - # We can't simply concatenate messages since they might require - # their associated parameters to be expressed correctly which - # is not something `format_lazy` does. For example, proxied - # ngettext calls require a count parameter and are converted - # to an empty string if they are missing it. - message=format_lazy( - "{} {}", - SimpleLazyObject(lambda: prefix % params), - SimpleLazyObject(lambda: error.message % error_params), - ), - code=code, - params={**error_params, **params}, - ) - return ValidationError( - [prefix_validation_error(e, prefix, code, params) for e in error.error_list] - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/postgres/validators.py b/.venv/lib/python3.10/site-packages/django/contrib/postgres/validators.py deleted file mode 100644 index 330b69b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/postgres/validators.py +++ /dev/null @@ -1,91 +0,0 @@ -from django.core.exceptions import ValidationError -from django.core.validators import ( - MaxLengthValidator, - MaxValueValidator, - MinLengthValidator, - MinValueValidator, -) -from django.utils.deconstruct import deconstructible -from django.utils.translation import gettext_lazy as _ -from django.utils.translation import ngettext_lazy - - -class ArrayMaxLengthValidator(MaxLengthValidator): - message = ngettext_lazy( - "List contains %(show_value)d item, it should contain no more than " - "%(limit_value)d.", - "List contains %(show_value)d items, it should contain no more than " - "%(limit_value)d.", - "show_value", - ) - - -class ArrayMinLengthValidator(MinLengthValidator): - message = ngettext_lazy( - "List contains %(show_value)d item, it should contain no fewer than " - "%(limit_value)d.", - "List contains %(show_value)d items, it should contain no fewer than " - "%(limit_value)d.", - "show_value", - ) - - -@deconstructible -class KeysValidator: - """A validator designed for HStore to require/restrict keys.""" - - messages = { - "missing_keys": _("Some keys were missing: %(keys)s"), - "extra_keys": _("Some unknown keys were provided: %(keys)s"), - } - strict = False - - def __init__(self, keys, strict=False, messages=None): - self.keys = set(keys) - self.strict = strict - if messages is not None: - self.messages = {**self.messages, **messages} - - def __call__(self, value): - keys = set(value) - missing_keys = self.keys - keys - if missing_keys: - raise ValidationError( - self.messages["missing_keys"], - code="missing_keys", - params={"keys": ", ".join(missing_keys)}, - ) - if self.strict: - extra_keys = keys - self.keys - if extra_keys: - raise ValidationError( - self.messages["extra_keys"], - code="extra_keys", - params={"keys": ", ".join(extra_keys)}, - ) - - def __eq__(self, other): - return ( - isinstance(other, self.__class__) - and self.keys == other.keys - and self.messages == other.messages - and self.strict == other.strict - ) - - -class RangeMaxValueValidator(MaxValueValidator): - def compare(self, a, b): - return a.upper is None or a.upper > b - - message = _( - "Ensure that the upper bound of the range is not greater than %(limit_value)s." - ) - - -class RangeMinValueValidator(MinValueValidator): - def compare(self, a, b): - return a.lower is None or a.lower < b - - message = _( - "Ensure that the lower bound of the range is not less than %(limit_value)s." - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/redirects/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/admin.py b/.venv/lib/python3.10/site-packages/django/contrib/redirects/admin.py deleted file mode 100644 index 39400ad..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/admin.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.contrib import admin -from django.contrib.redirects.models import Redirect - - -@admin.register(Redirect) -class RedirectAdmin(admin.ModelAdmin): - list_display = ("old_path", "new_path") - list_filter = ("site",) - search_fields = ("old_path", "new_path") - radio_fields = {"site": admin.VERTICAL} diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/redirects/apps.py deleted file mode 100644 index d770671..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/apps.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.apps import AppConfig -from django.utils.translation import gettext_lazy as _ - - -class RedirectsConfig(AppConfig): - default_auto_field = "django.db.models.AutoField" - name = "django.contrib.redirects" - verbose_name = _("Redirects") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/af/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index 5df03ce..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/af/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index 379ef04..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Charl du Plessis , 2021 -# F Wolff , 2019,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2023-12-04 18:32+0000\n" -"Last-Translator: F Wolff , 2019,2023\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Aansture" - -msgid "site" -msgstr "werf" - -msgid "redirect from" -msgstr "aanstuurvorm" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Hierdie moet ’n absolute pad wees met die domeinnaam uitgesluit. Soos " -"byvoorbeeld: “/events/search/”." - -msgid "redirect to" -msgstr "stuur aan na" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Hierdie kan óf 'n absolute pad wees (soos bo) óf ’n volledige URL wees wat " -"begin met ’n skema soos “https://”." - -msgid "redirect" -msgstr "aanstuur" - -msgid "redirects" -msgstr "aansture" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index 97afd31..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index 523327a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2016,2021 -# Bashar Al-Abdulhadi, 2014 -# Jannis Leidel , 2011 -# Muaaz Alsaied, 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-10-15 21:27+0000\n" -"Last-Translator: Bashar Al-Abdulhadi\n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Redirects" -msgstr "إعادات التوجيه" - -msgid "site" -msgstr "موقع" - -msgid "redirect from" -msgstr "إعادة التوجيه من" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "يجب أن يكون هذا مساراً مطلقاً وبدون اسم النطاق. مثال: “/events/search/”." - -msgid "redirect to" -msgstr "إعادة التوجيه إلى" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"يجب أن يكون هذا مسارا مطلقا (كما هو أعلاه) أو عنوانا كاملا يبدأ بالمقطع " -"“https://”." - -msgid "redirect" -msgstr "إعادة التوجيه" - -msgid "redirects" -msgstr "إعادات التوجيه" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index 62162dd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index 6da32dd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jihad Bahmaid Al-Halki, 2022 -# Riterix , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2022-07-24 18:32+0000\n" -"Last-Translator: Jihad Bahmaid Al-Halki\n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Redirects" -msgstr "إعادات التوجيه" - -msgid "site" -msgstr "موقع" - -msgid "redirect from" -msgstr "إعادة التوجيه من" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "يجب أن يكون هذا مساراً مطلقاً وبدون اسم النطاق. مثال: '/events/search/'." - -msgid "redirect to" -msgstr "إعادة التوجيه إلى" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"قد يكون هذا المسار منتهي الصلاحية (كما هو موضح أعلاه) أو أن العنوان له بادئة " -"بصيغة مثل\"https://\"." - -msgid "redirect" -msgstr "إعادة التوجيه" - -msgid "redirects" -msgstr "إعادات التوجيه" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ast/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index 6d2d993..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ast/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index 908c020..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 19:51+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "redireicionáu de" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Esto debería ser un camín absolutu, escluyendo'l nome de dominiu. Exemplu: '/" -"events/search/'." - -msgid "redirect to" -msgstr "redireicionáu a" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Esto pue tamién ser un camín absolutu (como enriba) o una URL completa " -"entamando con 'http://'." - -msgid "redirect" -msgstr "redireicionar" - -msgid "redirects" -msgstr "redireiciones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/az/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 0e1dda2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/az/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index 26231d2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Ismayilov , 2011 -# Emin Mastizada , 2020 -# Emin Mastizada , 2016 -# Nijat Mammadov, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2024-08-07 18:32+0000\n" -"Last-Translator: Nijat Mammadov, 2024\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Yönləndirmələr" - -msgid "site" -msgstr "sayt" - -msgid "redirect from" -msgstr "burdan yönləndir" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "Bu, domen adı xaric, tam yol olmalıdır. Məsələn: “/events/search/”." - -msgid "redirect to" -msgstr "bura yönləndir" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Bu ya tam yol (yuxarıdakı kimi), ya da “https://” ilə başyalan full URL " -"olmalıdır." - -msgid "redirect" -msgstr "yönləndirmə" - -msgid "redirects" -msgstr "yönləndirmələr" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/be/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index f8c704b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/be/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index 667bddc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2015 -# znotdead , 2016,2019,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-15 17:28+0000\n" -"Last-Translator: znotdead \n" -"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Redirects" -msgstr "Перанакіраванні" - -msgid "site" -msgstr "сайт" - -msgid "redirect from" -msgstr "накіраваць з" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Тут мусіць быць поўны шлях бяз назвы дамэна. Прыклад: “/events/search/”." - -msgid "redirect to" -msgstr "накіраваць да" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Тут, як і ўверсе, мусіць быць поўны шлях, або поўная сеціўная спасылка, якая " -"пачынаецца з “https://”." - -msgid "redirect" -msgstr "накіраваньне" - -msgid "redirects" -msgstr "накіраваньні" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index f47e604..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index 0fc628b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022 -# Jannis Leidel , 2011 -# Venelin Stoykov , 2015 -# vestimir , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2022-01-14 11:55+0000\n" -"Last-Translator: arneatec \n" -"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Препратки" - -msgid "site" -msgstr "сайт" - -msgid "redirect from" -msgstr "препратка от" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Това трябва да бъде абсолютен път, без името на домейна. Пример: \"/events/" -"search/\"." - -msgid "redirect to" -msgstr "препратка към" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Това може да бъде или абсолютен път (като горното) или пълен URL, започващ " -"със схема, например \"https://\"." - -msgid "redirect" -msgstr "препратка" - -msgid "redirects" -msgstr "препратки" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index 3d5ed41..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index f7a9334..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,48 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "রিডাইরেক্ট করা হবে" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"এর মান অবশ্যই এবসল্যুট পথ, ডোমেইন নাম বাদ দিয়ে, হতে হবে, উদাহরণঃ '/events/" -"search/'।" - -msgid "redirect to" -msgstr "রিডাইরেক্ট করুন" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "এর মান এবসল্যুট পথ (উপরের মত) অথবা পুরো URL পাথ ('http://' সহ) হতে পারে।" - -msgid "redirect" -msgstr "রিডাইরেক্ট" - -msgid "redirects" -msgstr "রিডাইরেক্ট" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/br/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index 3c20edc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/br/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index 920f068..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,54 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fulup , 2012 -# Irriep Nala Novram , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2018-10-19 23:15+0000\n" -"Last-Translator: Irriep Nala Novram \n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -msgid "Redirects" -msgstr "Adkasadennoù" - -msgid "site" -msgstr "lec'hienn" - -msgid "redirect from" -msgstr "adkaset eus" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"An dra-se a rankfe bezañ un hent absolud, en ur dennañ an holl anvioù " -"domani. Da skouer: '/events/search /'." - -msgid "redirect to" -msgstr "adkas da" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"An dra-se a c'hall bezañ un hent absolud (evel a-us) pe un URL klok o kregiñ " -"gant 'http://'." - -msgid "redirect" -msgstr "adkas" - -msgid "redirects" -msgstr "adkasoù" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index f986b59..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index b4f065e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "preusmjeren sa" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Ovo mora biti apsolutna putanja bez imena domena. Na primjer: '/events/" -"search/'." - -msgid "redirect to" -msgstr "preusmjeri ka" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Ovo može biti ili apsolutna putanja (kao gore) ili pun URL koji počinje sa " -"'http://'." - -msgid "redirect" -msgstr "preusmjeravanje" - -msgid "redirects" -msgstr "preusmjeravanja" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ca/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index fedd26a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ca/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index e94f9c8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,54 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2021 -# Carles Barrobés , 2014 -# Jannis Leidel , 2011 -# Manel Clos , 2020 -# Roger Pons , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-10-27 09:06+0000\n" -"Last-Translator: Antoni Aloy \n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redireccions" - -msgid "site" -msgstr "lloc" - -msgid "redirect from" -msgstr "redirecció des de" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Aquesta ruta hauria de ser una camí absolut, excloent-ne el nom del domini. " -"Exemple: '/events/search/'." - -msgid "redirect to" -msgstr "redirigir a" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Això pot ser bé una ruta absoluta (com a sobre) o una URL completa que " -"comenci per un esquema com 'https://'." - -msgid "redirect" -msgstr "redirecció" - -msgid "redirects" -msgstr "redireccions" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ckb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index 5e5fad9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ckb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index 596f66d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# kosar tofiq , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2023-04-24 18:32+0000\n" -"Last-Translator: kosar tofiq , 2021\n" -"Language-Team: Central Kurdish (http://www.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "ئاڕاستەکردنەوەکان" - -msgid "site" -msgstr "پێگە" - -msgid "redirect from" -msgstr "ئاڕاستەکردنەوە لە" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"ئەمە دەبێت ڕێجکەیەکی ڕەهابێت، بەبێ ناوی دۆمەین. نمونە: “/events/search/”." - -msgid "redirect to" -msgstr "ئاڕاستەکردنەوە بۆ" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"دەکرێت ئەمە یان ڕچکەی ڕەها بێت (وەکو سەرەوە) یان هەموو URL بێت کە بە سکیم " -"دەستپێبکات وەک “https://”." - -msgid "redirect" -msgstr "ئاڕاستەکردنەوە" - -msgid "redirects" -msgstr "ئاڕاستەکردنەوەکان" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index 978d833..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index 08c57c4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vláďa Macek , 2014 -# Vláďa Macek , 2015,2019,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-18 23:14+0000\n" -"Last-Translator: Vláďa Macek \n" -"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -msgid "Redirects" -msgstr "Přesměrování" - -msgid "site" -msgstr "web" - -msgid "redirect from" -msgstr "přesměrovat z" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Toto by měla být absolutní cesta bez domény. Příklad: \"/udalosti/hledat/\"." - -msgid "redirect to" -msgstr "přesměrovat na" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Toto by měla být buď absolutní cesta (jako výše) nebo plná adresa URL " -"začínající schématem, tedy například \"https://\"." - -msgid "redirect" -msgstr "přesměrování" - -msgid "redirects" -msgstr "přesměrování" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index 737534d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index ab8a428..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2012,2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -msgid "Redirects" -msgstr "Ailgyfeiriadau" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "ailgyfeirio o" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Dylai hon fod yn lwybr absoliwt, heb yr enw parth. Er enghraifft: '/" -"digwyddiadau/chwilio/'." - -msgid "redirect to" -msgstr "ailgyfeirio i" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Gellir fod naill ai yn lwybr absoliwt (fel uchod) neu URL llawn yn dechrau â " -"'http://'." - -msgid "redirect" -msgstr "ailgyfeiriad" - -msgid "redirects" -msgstr "ailgyfeiriadau" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/da/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index dfe4c63..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/da/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index 0c6521c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Erik Ramsgaard Wognsen , 2021 -# Erik Ramsgaard Wognsen , 2014-2015,2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-15 18:30+0000\n" -"Last-Translator: Erik Ramsgaard Wognsen \n" -"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Omdirigeringer" - -msgid "site" -msgstr "webside" - -msgid "redirect from" -msgstr "omdiriger fra" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Dette skal være en absolut sti uden domænenavnet. Eksempel: “/nyheder/soeg/”" - -msgid "redirect to" -msgstr "omdiriger til" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Dette kan være enten en absolut sti (som ovenfor) eller en hel URL der " -"starter med en protokol, fx “https://”." - -msgid "redirect" -msgstr "omdiriger" - -msgid "redirects" -msgstr "omdirigeringer" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/de/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index 2db36dc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/de/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 78f928a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2015 -# Florian Apolloner , 2021 -# Jannis Leidel , 2011,2013-2017,2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-11-28 17:21+0000\n" -"Last-Translator: Raphael Michel \n" -"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Umleitungen" - -msgid "site" -msgstr "Website" - -msgid "redirect from" -msgstr "Umleitung von" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Hier sollte ein absoluter Pfad stehen, ohne den Domainnamen. Beispiel: „/" -"events/search/“." - -msgid "redirect to" -msgstr "Umleitung nach" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Hier muss entweder ein absoluter Pfad (wie darüber) oder eine komplette URL " -"mit einem Schema, wie zum Beispiel „https://“, stehen." - -msgid "redirect" -msgstr "Umleitung" - -msgid "redirects" -msgstr "Umleitungen" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/dsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index ab747ca..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/dsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index 06b51ff..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2020-2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-02-01 22:11+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Redirects" -msgstr "Dalejpósrědnjenja" - -msgid "site" -msgstr "sedło" - -msgid "redirect from" -msgstr "dalejpósrědnjenje wót" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"To by dejało absolutna sćažka byś, mimo domenowego mjenja. Pśikład: „/events/" -"search/“." - -msgid "redirect to" -msgstr "dalejpósrědnjenje do" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"To móžo pak absolutna sćažka byś (ako górjejce) pak dopołny URL, kótaryž " -"zachopina se z „https://“." - -msgid "redirect" -msgstr "dalejpósrědnjenje" - -msgid "redirects" -msgstr "dalejpósrědnjenja" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/el/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index 89b919c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/el/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index c1d13e7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Nick Mavrakis , 2016 -# Pãnoș , 2014 -# Serafeim Papastefanos , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-06-03 18:27+0000\n" -"Last-Translator: Serafeim Papastefanos \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Ανακατευθύνσεις" - -msgid "site" -msgstr "ιστότοπος" - -msgid "redirect from" -msgstr "ανακατεύθυνση από" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Πρέπει να είναι ένα απόλυτο μονοπάτι χωρίς το όνομα τομέα. Για παράδειγμα \"/" -"events/search\"." - -msgid "redirect to" -msgstr "ανακατεύθυνση προς" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Μπορεί να είναι είτε ένα απόλυτο μονοπάτι (όπως πιο πάνω) είτε ένα πλήρες " -"URL που ξεκινά με κατάλληλο σχημα πχ \"https://\"." - -msgid "redirect" -msgstr "ανακατεύθυνση" - -msgid "redirects" -msgstr "ανακατευθύνσεις" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 08a7b68..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index 01a3eb7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: contrib/redirects/apps.py:8 -msgid "Redirects" -msgstr "" - -#: contrib/redirects/models.py:7 -msgid "site" -msgstr "" - -#: contrib/redirects/models.py:9 -msgid "redirect from" -msgstr "" - -#: contrib/redirects/models.py:12 -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" - -#: contrib/redirects/models.py:15 -msgid "redirect to" -msgstr "" - -#: contrib/redirects/models.py:19 -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" - -#: contrib/redirects/models.py:25 -msgid "redirect" -msgstr "" - -#: contrib/redirects/models.py:26 -msgid "redirects" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index f8b5bf1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index 13be8ad..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-11 13:16+0000\n" -"Last-Translator: Tom Fifield \n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redirects" - -msgid "site" -msgstr "site" - -msgid "redirect from" -msgstr "redirect from" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." - -msgid "redirect to" -msgstr "redirect to" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." - -msgid "redirect" -msgstr "redirect" - -msgid "redirects" -msgstr "redirects" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index c362746..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index d86a8e9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ross Poulton , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "redirect from" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." - -msgid "redirect to" -msgstr "redirect to" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." - -msgid "redirect" -msgstr "redirect" - -msgid "redirects" -msgstr "redirects" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eo/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index dfe9412..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eo/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index 72c4b91..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Batist D 🐍 , 2011 -# Batist D 🐍 , 2014-2015 -# kristjan , 2011 -# Meiyer , 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2022-04-24 18:32+0000\n" -"Last-Translator: Meiyer , 2022\n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Alidirektigiloj" - -msgid "site" -msgstr "retejo" - -msgid "redirect from" -msgstr "alidirektigo de" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" - -msgid "redirect to" -msgstr "alidirektigo al" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" - -msgid "redirect" -msgstr "alidirektigilo" - -msgid "redirects" -msgstr "alidirektigiloj" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 715b372..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 808849e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# e4db27214f7e7544f2022c647b585925_bb0e321, 2015 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2014 -# Jannis Leidel , 2011 -# Uriel Medina , 2020-2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-02-11 05:54+0000\n" -"Last-Translator: Uriel Medina \n" -"Language-Team: Spanish (http://www.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redirecciones" - -msgid "site" -msgstr "sitio" - -msgid "redirect from" -msgstr "redireccionar desde" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Esta debe ser una ruta absoluta, excluyendo el nombre de dominio. Ejemplo: “/" -"eventos/búsqueda/”." - -msgid "redirect to" -msgstr "redireccionar a" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Esto puede ser una ruta absoluta (como se indica arriba) o una URL completa " -"que comience con un esquema como \"https: //\"." - -msgid "redirect" -msgstr "redirección" - -msgid "redirects" -msgstr "redirecciones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index f690dc3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 1eb774c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ramiro Morales, 2014-2015,2019,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-21 13:00+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redirecciones" - -msgid "site" -msgstr "sitio" - -msgid "redirect from" -msgstr "redirigir desde" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Esta ruta debe ser absoluta, excluyendo el nombre de dominio. Ejemplo: “/" -"events/search”." - -msgid "redirect to" -msgstr "redirigir a" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Esto puede ser bien una ruta absoluta (como arriba) o una URL completa que " -"empiece con un esquema, por ejemplo “https://”." - -msgid "redirect" -msgstr "redirección" - -msgid "redirects" -msgstr "redirecciones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index e591305..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index 2e84843..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Carlos Muñoz , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 22:02+0000\n" -"Last-Translator: Carlos Muñoz \n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redirecciones" - -msgid "site" -msgstr "sitio" - -msgid "redirect from" -msgstr "redirigir desde" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Esta ruta debería ser absoluta, excluyendo el nombre de dominio. Ejemplo: '/" -"events/search/'." - -msgid "redirect to" -msgstr "redirigir a" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Esto puede ser una ruta absoluta (como antes) o una URL completa que empiece " -"con 'http://'." - -msgid "redirect" -msgstr "redirección" - -msgid "redirects" -msgstr "redirecciones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index e7f3b41..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index 73c1eb2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abe Estrada, 2011 -# Alex Dzul , 2015 -# Jesús Bautista , 2019 -# zodman , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-26 16:57+0000\n" -"Last-Translator: Jesús Bautista \n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redirección" - -msgid "site" -msgstr "sitio" - -msgid "redirect from" -msgstr "redirigir desde" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Esta debería ser una ruta absoluta, excluyendo el nombre de dominio. Por " -"ejemplo: \"/events/search/\"." - -msgid "redirect to" -msgstr "redirigir a" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"“http://”." -msgstr "" -"Esto puede ser una ruta absoluta (como arriba) o una URL completa que " -"comience con \"http://\"." - -msgid "redirect" -msgstr "redirigir" - -msgid "redirects" -msgstr "redirecciona" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index 32f6e8f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index 392e5d3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/" -"django/language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "redirect from" -msgstr "" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" - -msgid "redirect to" -msgstr "" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" - -msgid "redirect" -msgstr "" - -msgid "redirects" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/et/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index b9b37ba..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/et/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index 43ed079..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,54 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Janno Liivak , 2015 -# Martin , 2021 -# Marti Raudsepp , 2014 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-11-22 11:23+0000\n" -"Last-Translator: Martin \n" -"Language-Team: Estonian (http://www.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Ümbersuunamised" - -msgid "site" -msgstr "sait" - -msgid "redirect from" -msgstr "ümbersuunatav asukoht" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"See peaks olema absoluutne asukoht, v.a. domeeninimi. Näide: “/events/" -"search/”." - -msgid "redirect to" -msgstr "suuna aadressile" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"See võib olla kas absoluutne asukoht (nagu ülemine) või täielik URL, mis " -"algab skeemiga nagu “https://”." - -msgid "redirect" -msgstr "suunamine" - -msgid "redirects" -msgstr "suunamised" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index a223a93..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index ccd0ffe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eneko Illarramendi , 2017 -# Jannis Leidel , 2011 -# Urtzi Odriozola , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-18 15:50+0000\n" -"Last-Translator: Urtzi Odriozola \n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redirects" - -msgid "site" -msgstr "webgunea" - -msgid "redirect from" -msgstr "nondik berbidalia" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Honek “bide” absolutua izan behar du, domeinu izena kenduta. Adibidez: “/" -"events/search/”." - -msgid "redirect to" -msgstr "Nora berbidali" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Hau “bide“ absolutua (goian bezala) edo URL osoa , “https://”-rekin hasiz, " -"izan daiteke." - -msgid "redirect" -msgstr "berbidali" - -msgid "redirects" -msgstr "berbidali" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index 2b46809..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index 0200108..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Nikneshan , 2015 -# Ali Vakilzade , 2015 -# Jannis Leidel , 2011 -# rahim agh , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-19 03:19+0000\n" -"Last-Translator: rahim agh \n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Redirects" -msgstr "باز-ارسال‌ها" - -msgid "site" -msgstr "سایت" - -msgid "redirect from" -msgstr "فرم ارسال به نشانی جدید" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "می‌بایست یک مسیر مطلق و بدون نام دامنه باشد. مانند: '/events/search/'." - -msgid "redirect to" -msgstr "ارسال به نشانی" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"می‌تواند یک مسیر مطلق (همانند بالا) و یا یک آدرس کامل با 'http://‎' باشد." - -msgid "redirect" -msgstr "باز-ارسال" - -msgid "redirects" -msgstr "باز-ارسال‌ها" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index 355a427..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index a19d41c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2020-2021 -# Jannis Leidel , 2011 -# Klaus Dahlén , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-14 12:18+0000\n" -"Last-Translator: Aarni Koskela\n" -"Language-Team: Finnish (http://www.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Edelleenohjaukset" - -msgid "site" -msgstr "sivusto" - -msgid "redirect from" -msgstr "ohjaa osoitteesta" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Tässä on käytettävä absoluuttista polkua ilman verkkotunnusta. Esimerkki: \"/" -"tapahtumat/haku/\"." - -msgid "redirect to" -msgstr "ohjaa osoitteeseen" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Tässä on käytettävä joko absoluuttista polkua (kuten yllä) tai täydellistä " -"URL-osoitetta joka alkaa skeemalla (esim. \"https://\")." - -msgid "redirect" -msgstr "edelleenohjaus" - -msgid "redirects" -msgstr "edelleenohjaukset" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 4902f97..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index a9fdb05..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2014-2015,2019,2021 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-02 13:17+0000\n" -"Last-Translator: Bruno Brouard \n" -"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Redirects" -msgstr "Redirections" - -msgid "site" -msgstr "site" - -msgid "redirect from" -msgstr "redirigé depuis" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Ceci doit être un chemin absolu, sans nom de domaine. Par exemple, « /" -"evenements/rechercher/ »." - -msgid "redirect to" -msgstr "redirigé vers" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Ceci peut être soit un chemin absolu (voir ci-dessus) soit une URL complète " -"débutant par un protocole tel que « https:// »." - -msgid "redirect" -msgstr "redirection" - -msgid "redirects" -msgstr "redirections" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index 489bbab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index ecf5b4b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "redirect from" -msgstr "" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" - -msgid "redirect to" -msgstr "" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" - -msgid "redirect" -msgstr "" - -msgid "redirects" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ga/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index 0ed0c01..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ga/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index 805902a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Jannis Leidel , 2011 -# Luke Blaney , 2019 -# Michael Thornhill , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2024-10-07 18:32+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -msgid "Redirects" -msgstr "Athsheolaidh" - -msgid "site" -msgstr "suíomh" - -msgid "redirect from" -msgstr "atreoraigh ó" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Ba cheart gur cosán iomlán é seo, gan an t-ainm fearainn a áireamh. Sampla: " -"\\u201c/events/search/\\u201d." - -msgid "redirect to" -msgstr "atreoraigh go dtí" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Is féidir gur cosán iomlán é seo (mar atá thuas) nó URL iomlán ag tosú le " -"scéim mar \\u201chttps://\\u201d." - -msgid "redirect" -msgstr "athsheol" - -msgid "redirects" -msgstr "atreoraithe" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gd/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index e611c50..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gd/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index 232e298..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2015 -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-07-15 10:46+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -msgid "Redirects" -msgstr "Ath-stiùiridhean" - -msgid "site" -msgstr "làrach" - -msgid "redirect from" -msgstr "ath-stiùireadh o" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Bu chòir seo a bhith ’na shlighe absaloideach as aonais ainm na h-àrainne. " -"Ball-eisimpleir: “/tachartasan/lorg/”." - -msgid "redirect to" -msgstr "ath-stiùireadh gu" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Faodaidh seo a bhith ’na shlighe absaloideach (mar a tha gu h-àrd) no ’na " -"URL slàn a thòisicheas le sgeama, can “https://”." - -msgid "redirect" -msgstr "ath-stiùireadh" - -msgid "redirects" -msgstr "ath-stiùiridhean" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index c64e8e1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index 0ad209f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# fasouto , 2017,2019 -# Jannis Leidel , 2011 -# X Bello , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2023-04-24 18:32+0000\n" -"Last-Translator: X Bello , 2023\n" -"Language-Team: Galician (http://www.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redireccións" - -msgid "site" -msgstr "sitio" - -msgid "redirect from" -msgstr "orixe da redirección" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Ten que ser unha ruta absoluta, sen o nome de cominio. Por exemplo: “/" -"eventos/busca/”." - -msgid "redirect to" -msgstr "destino da redirección" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Pode ser unha ruta absoluta (coma a de enriba) ou un URL completo que empece " -"por “https://”." - -msgid "redirect" -msgstr "redirección" - -msgid "redirects" -msgstr "redireccións" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/he/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index c8e13ce..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/he/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index fc05599..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Meir Kriheli , 2014-2015,2020,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2023-12-04 18:32+0000\n" -"Last-Translator: Meir Kriheli , 2014-2015,2020,2023\n" -"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -msgid "Redirects" -msgstr "הפניות" - -msgid "site" -msgstr "אתר" - -msgid "redirect from" -msgstr "הפניה מ" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "זה אמור להיות נתיב מלא, ללא שם המתחם. לדוגמה: “/events/search/”." - -msgid "redirect to" -msgstr "הפניה אל" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"זה יכול להיות נתיב מלא (כמו לעיל) או כתובת URL מלאה שמתחילה בסכימה כגון " -"\"https://\"." - -msgid "redirect" -msgstr "הפניה" - -msgid "redirects" -msgstr "הפניות" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index 367e4a9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index 44b447f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Sandeep Satavlekar , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "से अनुप्रेषित" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"डोमेन नाम को छोड़कर बाकि सब संपूर्ण पथ होना चाहिए | उदाहरण: '/events/search'" - -msgid "redirect to" -msgstr "को अनुप्रेषित" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"यह या तो एक संपूर्ण पथ (जैसा ऊपर निर्दिष्ट किया हैं ) हो सकता है या 'http://' के साथ " -"शुरू होनेवाला पूर्ण URL हो सकता है." - -msgid "redirect" -msgstr "पुनः प्रेषित" - -msgid "redirects" -msgstr "पुनः प्रेषित" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index 65b8363..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index 75a97c3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Mislav Cimperšak \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgid "Redirects" -msgstr "Preusmjeravanja" - -msgid "site" -msgstr "stranica" - -msgid "redirect from" -msgstr "preusmjeri od" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Ovo bi trebala biti apsolutna putanja, bez imena domene. Primjer: '/events/" -"search/'." - -msgid "redirect to" -msgstr "preusmjeri na" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Ovo može biti ili apsolutna putanja (kao gore) ili potpuni URL koji počinje " -"sa 'http://'" - -msgid "redirect" -msgstr "preusmjeri" - -msgid "redirects" -msgstr "preusmjeravanja" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index 4e0312e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index 4d22553..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2019,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-02-01 22:11+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Redirects" -msgstr "Dalesposrědkowanja" - -msgid "site" -msgstr "sydło" - -msgid "redirect from" -msgstr "dalesposrědkowanje wot" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"To měło absolutna šćežka być, nimo domenoweho mjena. Přikład: \"/events/" -"search/\"." - -msgid "redirect to" -msgstr "dalesposrědkowanje do" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"To móže pak absolutna šćežka być (kaž horjeka) pak dospołny URL, kotryž so z " -"\"https:/\" započina." - -msgid "redirect" -msgstr "dalesposrědkowanje" - -msgid "redirects" -msgstr "dalesposrědkowanja" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index 8321e8b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index 8e778d4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# András Veres-Szentkirályi, 2016,2021 -# Istvan Farkas , 2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-01 15:20+0000\n" -"Last-Translator: András Veres-Szentkirályi\n" -"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Átirányítások" - -msgid "site" -msgstr "honlap" - -msgid "redirect from" -msgstr "átirányítva innen" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Abszolút útvonal legyen, a domain név nélkül. Például: \"/cikk/keres/\"." - -msgid "redirect to" -msgstr "átirányítva ide" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Lehet abszolút útvonal is (mint feljebb), vagy teljes URL, amely \"https://" -"\"-sel kezdődik." - -msgid "redirect" -msgstr "átirányítás" - -msgid "redirects" -msgstr "átirányít" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index f141d22..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index a4ab584..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2018-11-01 20:45+0000\n" -"Last-Translator: Ruben Harutyunov \n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Վերահղում" - -msgid "site" -msgstr "կայք" - -msgid "redirect from" -msgstr "վերահղում" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Սա պետք է լինի բացարձակ ճանապարհ, բացի տիրույթի անվանից։ Օրինակ․ '/events/" -"search/'։" - -msgid "redirect to" -msgstr "վերահղում" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Սա կարող է լինել բացարձակ ճանապարհ կամ ամբողջական URL, որը սկսվում է " -"'http://'֊ով։" - -msgid "redirect" -msgstr "վերահղում" - -msgid "redirects" -msgstr "վերահղումներ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ia/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index 6b3b87b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ia/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index c4f1b40..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 22:02+0000\n" -"Last-Translator: Martijn Dekker \n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redirectiones" - -msgid "site" -msgstr "sito" - -msgid "redirect from" -msgstr "formulario de redirection" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Isto debe esser un cammino absolute, excludente le nomine de dominio. " -"Exemplo: '/eventos/recerca'." - -msgid "redirect to" -msgstr "rediriger a" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Isto pote esser o un cammino absolute (como supra) o un URL complete " -"comenciante con 'http://'." - -msgid "redirect" -msgstr "redirection" - -msgid "redirects" -msgstr "redirectiones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/id/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index e253951..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/id/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index 4ef7ed1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fery Setiawan , 2015,2021 -# rodin , 2011 -# rodin , 2015 -# sag᠎e , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-09-14 00:29+0000\n" -"Last-Translator: Fery Setiawan \n" -"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "Pengalihan" - -msgid "site" -msgstr "situs" - -msgid "redirect from" -msgstr "pengalihan dari" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Harus berupa lokasi absolut, tanpa nama domain. Contoh: “/events/search/”." - -msgid "redirect to" -msgstr "pengalihan ke" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Ini dapat berupa jalur mutlak (seperti diatas) atau URL lengkap diawali " -"dengan skema seperti “https://”." - -msgid "redirect" -msgstr "pengalihan" - -msgid "redirects" -msgstr "pengalihan" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/io/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index 89f3bde..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/io/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index b79e1d3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,48 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viko Bartero , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-20 01:58+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "ridirektar de" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Ico devas esar absoluta voyo, exkluzante la domeno nomo. Exemple: \"/eventi/" -"serchado/\"." - -msgid "redirect to" -msgstr "ridirektar a" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Ico devas esar absoluta voyo (kam supre) o kompleta URL uzante \"http://\"." - -msgid "redirect" -msgstr "ridirekturo" - -msgid "redirects" -msgstr "ridirekturi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/is/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index 5fa353f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/is/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index 29be147..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Thordur Sigurdsson , 2016,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-20 05:10+0000\n" -"Last-Translator: Thordur Sigurdsson \n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "vefur" - -msgid "redirect from" -msgstr "vísun frá" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "Þetta þarf að vera full slóð án lénsins. Dæmi: „/events/search/“." - -msgid "redirect to" -msgstr "vísa á" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"“http://”." -msgstr "" -"Þetta getur verið full slóð (eins og hér að ofan) eða veffang með „http://“ " -"fremst." - -msgid "redirect" -msgstr "vísun" - -msgid "redirects" -msgstr "vísanir" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/it/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index 097ab6b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/it/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index a201ce7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Marco Bonetti, 2014 -# Mirco Grillo , 2020 -# palmux , 2014-2015,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-15 16:04+0000\n" -"Last-Translator: palmux \n" -"Language-Team: Italian (http://www.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redirezioni" - -msgid "site" -msgstr "sito" - -msgid "redirect from" -msgstr "redirezione da" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Deve essere un percorso assoluto, senza nome a dominio. Esempio: '/events/" -"search/'." - -msgid "redirect to" -msgstr "redirezione verso" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Può essere un percorso assoluto (come sopra) o un URL completo che inizia " -"con \"https: //\"." - -msgid "redirect" -msgstr "redirezione" - -msgid "redirects" -msgstr "redirezioni" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ja/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index 3b223b6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ja/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index 8c6ab2b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Goto Hayato , 2021 -# Jannis Leidel , 2011 -# Shinya Okano , 2014-2015 -# Takuya N , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-07-02 13:57+0000\n" -"Last-Translator: Goto Hayato \n" -"Language-Team: Japanese (http://www.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "リダイレクト" - -msgid "site" -msgstr "サイト" - -msgid "redirect from" -msgstr "リダイレクト元" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "“/events/search/” のように、ドメイン名を除いた絶対パスにします。 " - -msgid "redirect to" -msgstr "リダイレクト先" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"これは上のような絶対パスにも「 https:// 」のようなスキームで始まる完全な URL " -"にもすることができます。" - -msgid "redirect" -msgstr "リダイレクト" - -msgid "redirects" -msgstr "リダイレクト" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ka/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index 475955e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ka/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index bf76c7a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2015 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Redirects" -msgstr "გადამისამართებები" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "გადამისამართება გვერდიდან" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"უნდა იყოს აბსოლუტური გზა დომენის სახელის გარეშე. მაგალითი: '/events/search/'." - -msgid "redirect to" -msgstr "გადამისამართება გვერდზე" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"უნდა იყოს აბსოლუტური გზა (როგორც ზემოთ) ან სრული URL, რომელიც იწყება " -"'http://' სტრიქონით." - -msgid "redirect" -msgstr "გადამისამართება" - -msgid "redirects" -msgstr "გადამისამართებები" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.mo deleted file mode 100644 index 63b7782..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.po deleted file mode 100644 index 437f1a2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-10-09 12:26+0000\n" -"Last-Translator: Slimane Amiri\n" -"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" -"kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Iceggiɛen" - -msgid "site" -msgstr "asmel" - -msgid "redirect from" -msgstr "yettwaceggeɛ seg" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" - -msgid "redirect to" -msgstr "aceggeɛ ar" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" - -msgid "redirect" -msgstr "aceggeɛ" - -msgid "redirects" -msgstr "iceggiɛen" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index fb9d36f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index 8c6af97..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,48 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Leo Trubach , 2017 -# yun_man_ger , 2011 -# Zhazira , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Leo Trubach \n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Redirects" -msgstr "Қайта бағыттаулар" - -msgid "site" -msgstr "сайт" - -msgid "redirect from" -msgstr " бағыттау (қайдан)" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "Бұл домен атаусыз абсолюттік жол болу керек. Мысал: '/events/search/'." - -msgid "redirect to" -msgstr "бағыттау (қайда)" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Бұл абсолюттік жол немесе 'http://'-мен басталатын толық URL бола алады." - -msgid "redirect" -msgstr "қайта бағыттау" - -msgid "redirects" -msgstr "қайта бағыттаулар" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/km/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index e76f40f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/km/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index 75cf301..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,47 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "នាំចេញពី" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"គួរតែជាផ្លូវពេញ (absolute path) ហើយមិនបញ្ជូលឈ្មោះ ដមែន (domain name​)។​ឧទាហរណ៍ '/" -"events/search/'។" - -msgid "redirect to" -msgstr "នាំចេញទៅ" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "អាចជាផ្លូវពេញ (absolute path) ឬក៏ URL ទាំងមូលដែលចាប់ផ្តើមជាមួយ 'http://'។" - -msgid "redirect" -msgstr "នាំចេញ" - -msgid "redirects" -msgstr "នាំចេញ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index 24a289a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index bfeadbe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,47 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Rohith PR, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-08-03 10:56+0000\n" -"Last-Translator: Rohith PR\n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "ತಾಣ" - -msgid "redirect from" -msgstr "ಪುನರ್ನಿರ್ದೇಶನ ಇಲ್ಲಿಂದ->" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" - -msgid "redirect to" -msgstr "ಪುನರ್ನಿರ್ದೇಶನ ಇಲ್ಲಿಗೆ->" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" - -msgid "redirect" -msgstr "ಪುನರ್ನಿರ್ದೇಶನ" - -msgid "redirects" -msgstr "ಪುನರ್ನಿರ್ದೇಶನ(ಗಳು)" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ko/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index 82d3615..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ko/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index 4209b98..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,56 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jiyoon, Ha , 2016 -# Hyeonho Kang, 2024 -# Jannis Leidel , 2011 -# Jay Oh , 2020 -# JunGu Kang , 2015 -# Kwangho Kim , 2019 -# minsung kang, 2015 -# 정훈 이, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2024-10-07 18:32+0000\n" -"Last-Translator: Hyeonho Kang, 2024\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "리다이렉트" - -msgid "site" -msgstr "사이트" - -msgid "redirect from" -msgstr "에서 리다이렉트" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"도메인 이름을 제외한 절대 경로여야 합니다.\n" -"예시: \"/events/search/\"." - -msgid "redirect to" -msgstr "(으)로 리다이렉트" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"이것은 절대 경로 (위와 같이) 이거나 “https://”와 같은 체계로 시작하는 전체 " -"URL 일 수 있습니다." - -msgid "redirect" -msgstr "리다이렉트" - -msgid "redirects" -msgstr "리다이렉트" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ky/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index 99bc33a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ky/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 892f148..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soyuzbek Orozbek uulu , 2020-2021 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-02 11:57+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "Буруулар" - -msgid "site" -msgstr "сайт" - -msgid "redirect from" -msgstr "бурулуп келатат" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Бул доменди камтыбаган абсолюттук жол болуусу керек. Мисалы: “/events/" -"search/”." - -msgid "redirect to" -msgstr "Бул жакка бар" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Бул абсолюттук жол (жогорудай) же толук \"https://\" сыяктуу схема менен " -"башталган URL боло алат. " - -msgid "redirect" -msgstr "буруу" - -msgid "redirects" -msgstr "буруулар" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index 5b7937f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index c97c1c7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "redirect from" -msgstr "" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" - -msgid "redirect to" -msgstr "" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" - -msgid "redirect" -msgstr "" - -msgid "redirects" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index 294ce4c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index 811c248..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Matas Dailyda , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Matas Dailyda \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Redirects" -msgstr "Nukreipimai" - -msgid "site" -msgstr "tinklalapis" - -msgid "redirect from" -msgstr "nukreiptas (redirect) iš" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Turi būti absoliutus adresas neįtraukiant domaino. Pavyzdžiui: '/events/" -"search/'." - -msgid "redirect to" -msgstr "nukreipti(redirect) į" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Gali būti absoliutus adresas (kaip viršuj) arba pilnas URL pradedant " -"'http://'." - -msgid "redirect" -msgstr "nukreipti" - -msgid "redirects" -msgstr "nukreipia" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index d204bf6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index 89b3001..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# NullIsNot0 , 2019,2021 -# peterisb , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-25 22:49+0000\n" -"Last-Translator: NullIsNot0 \n" -"Language-Team: Latvian (http://www.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -msgid "Redirects" -msgstr "Pārvirzīšanas" - -msgid "site" -msgstr "vietne" - -msgid "redirect from" -msgstr "pārvirzīt(redirect) no" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Tam jābūt absolūtajam ceļam, atskaitot domēna vārdu. Piemēram: \"/notikumi/" -"meklet/\"." - -msgid "redirect to" -msgstr "pārvirzīt(redirect) uz" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Šis var būt vai nu absolūtais ceļš (kā augstāk), vai pilnais URL, kas sākas " -"ar \"https://\"." - -msgid "redirect" -msgstr "pārvirzīt" - -msgid "redirects" -msgstr "pārvirzījumi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index 8353fbd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index 57e8324..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vasil Vangelovski , 2016 -# Vasil Vangelovski , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Vasil Vangelovski \n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgid "Redirects" -msgstr "Пренасочувања" - -msgid "site" -msgstr "сајт" - -msgid "redirect from" -msgstr "пренасочи од" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Ова треба да биде апсолутна патека без името на домејнот. На пр. „/nastani/" -"prebaraj/“." - -msgid "redirect to" -msgstr "пренасочи кон" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Ова може да биде или апсолутна патека (како погоре) или цела адреса што " -"почнува со „http://“." - -msgid "redirect" -msgstr "пренасочување" - -msgid "redirects" -msgstr "пренасочувања" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ml/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index 5f3537a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ml/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index dbfbca6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Hrishikesh , 2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2019-03-03 10:36+0000\n" -"Last-Translator: Hrishikesh \n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "തിരിച്ചുവിടലുകൾ" - -msgid "site" -msgstr "സൈറ്റ്" - -msgid "redirect from" -msgstr "എവിടെ നിന്ന്" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"ഇത് ഡൊമൈനിന്റെ പേര് ഉൾപ്പെടാതെയുള്ള ഒരു അബ്സല്യൂട്ട് പാത്ത് ആയിരിക്കണം. ഉദാഹരണം: '/events/" -"search/'." - -msgid "redirect to" -msgstr "എങ്ങോട്ട്" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"ഇതൊരു അബ്സല്യൂട്ട് പാത്തോ (മുകളിലത്തേതു പോലെ) 'http://' എന്നു തുടങ്ങുന്ന ഒരു മുഴുവൻ യു.ആർ.എല്ലോ " -"ആവാം" - -msgid "redirect" -msgstr "തിരിച്ചുവിടൽ" - -msgid "redirects" -msgstr "തിരിച്ചുവിടലുകൾ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index ecd0a04..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 3f474c4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bayarkhuu Bataa, 2014 -# Jannis Leidel , 2011 -# Анхбаяр Анхаа , 2011,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Анхбаяр Анхаа \n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Чиглүүлэлтүүд" - -msgid "site" -msgstr "сайт" - -msgid "redirect from" -msgstr "redirect хаанаас" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Энэ нь домэйн нэр агуулаагүй абсолют зам байх ёстой. Жишээ нь: '/events/" -"search/'." - -msgid "redirect to" -msgstr "redirect хаашаа" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Энэ нь (дээрхийн нэгэн адил) абсолют зам юм уу 'http://' гэж эхэлсэн бүтэн " -"URL байж болно. " - -msgid "redirect" -msgstr "redirect" - -msgid "redirects" -msgstr "redirect-ууд" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index 54b53f3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index 403f9fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,48 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Omkar Parab, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2024-01-24 18:32+0000\n" -"Last-Translator: Omkar Parab, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "पुनर्निर्देशने" - -msgid "site" -msgstr "स्थळ" - -msgid "redirect from" -msgstr "पासून पुनर्निर्देशित" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "डोमेन नाव वगळून हा एक परिपूर्ण मार्ग असावा. उदाहरण: \"/events/search/\"." - -msgid "redirect to" -msgstr "ला पुनर्निर्देशित" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"हा एकतर निरपेक्ष मार्ग असू शकतो (वरीलप्रमाणे) किंवा एखाद्या योजनेपासून सुरू होणारी पूर्ण " -"URL असू शकते जसे की \"https://\"" - -msgid "redirect" -msgstr "पुनर्निर्देशित" - -msgid "redirects" -msgstr "पुनर्निर्देशने" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ms/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index 54eddda..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ms/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index ef67357..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-11-16 12:45+0000\n" -"Last-Translator: Jafry Hisham\n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "Lencongan-lencongan" - -msgid "site" -msgstr "laman" - -msgid "redirect from" -msgstr "borang lencongan" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Ini sepatutnya laluan mutlak, tidak termasuk nama domain. Contoh: \"/" -"peristiwa/cari/\"" - -msgid "redirect to" -msgstr "Lencong ke" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Ini boleh menjadi laluan mutlak (seperti diatas) atau URL penuh bermula " -"dengan skema seperti \"https://\"." - -msgid "redirect" -msgstr "lencongan" - -msgid "redirects" -msgstr "lencongan-lencongan" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/my/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index 38a9b9f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/my/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index dd18026..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 22:02+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "ပြန်လည်ဝင်ရောက်များ" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" - -msgid "redirect to" -msgstr "" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" - -msgid "redirect" -msgstr "" - -msgid "redirects" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index 0c2d5a1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index 22579b2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,54 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Jon, 2015 -# Jon, 2014 -# Jon, 2020-2021 -# Sigurd Gartmann , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-18 14:19+0000\n" -"Last-Translator: Jon\n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Omadresseringer" - -msgid "site" -msgstr "nettsted" - -msgid "redirect from" -msgstr "omadresser fra" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Dette bør være en fullstendig sti uten domenenavn. Eksempel: \"/hendelser/" -"finn/\"." - -msgid "redirect to" -msgstr "omadresser til" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Dette kan være enten en full sti (som over) eller en full URL som starter " -"med en protokoll som “https://”." - -msgid "redirect" -msgstr "omadressering" - -msgid "redirects" -msgstr "omadresseringer" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ne/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index b2c1863..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ne/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index 9a4164f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,47 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Paras Nath Chaudhary , 2012 -# Sagar Chalise , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Sagar Chalise \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "बाटो फेर्ने" - -msgid "site" -msgstr "साईट" - -msgid "redirect from" -msgstr "बाटो फेर्ने फरम" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "यो डोमेन नाम छोडेर, पूर्ण बाटो हुनुपर्छ । उदाहरण : '/events/search'" - -msgid "redirect to" -msgstr "बाटो फेर्नेको लागि" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"यो कि (माथीको जस्तै )पूर्ण बाटो हुनुपर्छ वा 'http://' बाट सुरुभएको पुरा हुनुपर्छ । " - -msgid "redirect" -msgstr "बाटो फेर्ने" - -msgid "redirects" -msgstr "बाटो फेर्ने" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index e573bcd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index da242f7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ilja Maas , 2015 -# Jannis Leidel , 2011 -# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2015 -# Tonnes , 2019,2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2022-07-24 18:32+0000\n" -"Last-Translator: Tonnes \n" -"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Omleidingen" - -msgid "site" -msgstr "website" - -msgid "redirect from" -msgstr "omgeleid via" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Dit moet een absoluut pad zijn, zonder de domeinnaam. Voorbeeld: ‘/events/" -"search/’." - -msgid "redirect to" -msgstr "omleiden naar" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Dit kan een absoluut pad zijn (zoals hierboven), of een volledige URL " -"beginnend met een schema, zoals ‘https://’." - -msgid "redirect" -msgstr "omleiding" - -msgid "redirects" -msgstr "omleidingen" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index 8eadeb0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index 363e0ff..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Sivert Olstad, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-11-11 10:05+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Omadresseringar" - -msgid "site" -msgstr "nettstad" - -msgid "redirect from" -msgstr "omadresser frå" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Dette bør vere ein fullstendig sti utan domenenavn. Døme: “/hendingar/finn/”." - -msgid "redirect to" -msgstr "omadresser til" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Dette kan enten vere ein fullstendig sti (som over), eller ei fullstendig " -"nettadresse som startar med eit skjema som “https://”." - -msgid "redirect" -msgstr "omadressering" - -msgid "redirects" -msgstr "omadresseringar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index f80ae2e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index 26f4042..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:58+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "арвитӕны формӕ" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Ай хъуамӕ уа ӕнӕ домены ном абсолютон фӕт. Цӕвиддон: '/events/search/'." - -msgid "redirect to" -msgstr "арвитӕн ардӕм" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Ай гӕнӕн ис уа абсолютон фӕт (куыд уӕлийӕ) кӕнӕ 'http://'-йӕ байдайгӕ " -"ӕнӕхъӕн URL." - -msgid "redirect" -msgstr "арвитӕн" - -msgid "redirects" -msgstr "арвитӕнтӕ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index 0481d7e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index a82e053..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,47 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# A S Alam , 2013 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "ਇਸ ਤੋਂ ਮੁੜ-ਡਾਇਰੈਕਟ" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" - -msgid "redirect to" -msgstr "ਇਸ ਵੱਲ ਡਾਇਰੈਕਟ" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" - -msgid "redirect" -msgstr "ਰੀ-ਡਾਇਰੈਕਟ" - -msgid "redirects" -msgstr "ਮੁੜ-ਡਾਇਰੈਕਟ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index 113b2eb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index 9afa71c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,54 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Janusz Harkot , 2014-2015 -# m_aciek , 2019,2021 -# Tomasz Kajtoch , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-09-06 21:50+0000\n" -"Last-Translator: m_aciek \n" -"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" -"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" -"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -msgid "Redirects" -msgstr "Przekierowania" - -msgid "site" -msgstr "strona" - -msgid "redirect from" -msgstr "przekieruj z" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Podaj ścieżkę bezwzględną pomijając nazwę domeny. Na przykład „/events/" -"search/”." - -msgid "redirect to" -msgstr "przekieruj na" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Może to być ścieżka bezwzględna (jak powyżej) lub pełny URL rozpoczynający " -"się schematem takim jak \"https://\"." - -msgid "redirect" -msgstr "przekierowanie" - -msgid "redirects" -msgstr "przekierowania" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index f40afe3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index f6dc3f0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Manuela Silva , 2025 -# Nuno Mariz , 2011,2015 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Manuela Silva , 2025\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Redireccionamentos" - -msgid "site" -msgstr "site" - -msgid "redirect from" -msgstr "redirecionar de" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Isto deveria ser um caminho absoluto, excluindo o domínio. Exemplo: \"/" -"events/search/\"." - -msgid "redirect to" -msgstr "redirecionar para" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Isto pode ser um caminho absoluto (como acima) ou um URL completo, começando " -"com um esquema como \"https://\"." - -msgid "redirect" -msgstr "redirecionar" - -msgid "redirects" -msgstr "redireciona" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index 30c3a67..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index bdab9b2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,57 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# Amanda Savluchinske , 2019 -# Eduardo Felipe Castegnaro , 2024 -# fa9e10542e458baef0599ae856e43651_13d2225, 2013 -# Jannis Leidel , 2011 -# Lucas Infante , 2015 -# Rafael Fontenelle , 2021 -# R.J Lelis , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2024-08-07 18:32+0000\n" -"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" -"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Redirects" -msgstr "Redirecionamentos" - -msgid "site" -msgstr "site" - -msgid "redirect from" -msgstr "redirecionar de" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Este deve ser um caminho absoluto, excluindo o domínio. Exemplo: \"/events/" -"search/\"." - -msgid "redirect to" -msgstr "redirecionar para" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Este pode ser um caminho absoluto (como acima) ou uma URL completa começando " -"com um esquema como \"https://\"." - -msgid "redirect" -msgstr "redirecionamento" - -msgid "redirects" -msgstr "redirecionamentos" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index bb9da5b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index fbd2c98..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,54 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Daniel Ursache-Dogariu, 2011 -# Eugenol Man , 2020 -# Jannis Leidel , 2011 -# Razvan Stefanescu , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-07-15 11:20+0000\n" -"Last-Translator: Eugenol Man \n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -msgid "Redirects" -msgstr "Redirecționări" - -msgid "site" -msgstr "site" - -msgid "redirect from" -msgstr "redirecționat de la " - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Trebuie sa fie o cale absoluta, exeptand numele domeniului. Exemplu: “/" -"events/search/”." - -msgid "redirect to" -msgstr "redirecționat către" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"“http://”." -msgstr "" -"Poate fi cale absolută (ca mai sus) sau link URL complet, începând cu " -"“http://”." - -msgid "redirect" -msgstr "redirecționare" - -msgid "redirects" -msgstr "redirecționări" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index 12be90b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index 7a95bbe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# crazyzubr , 2020 -# Jannis Leidel , 2011 -# Panasoft, 2021 -# Алексей Борискин , 2014-2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-16 22:53+0000\n" -"Last-Translator: Panasoft\n" -"Language-Team: Russian (http://www.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Redirects" -msgstr "Перенаправления" - -msgid "site" -msgstr "сайт" - -msgid "redirect from" -msgstr "перенаправить с" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "Нужно указать корневой относительный путь. Пример: “/events/search/”." - -msgid "redirect to" -msgstr "перенаправить на" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Это может быть либо абсолютный путь (как указано выше), либо полный URL-" -"адрес, начинающийся со схемы, такой как «https://»." - -msgid "redirect" -msgstr "перенаправление" - -msgid "redirects" -msgstr "перенаправления" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index 16623d8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index 07ea9c9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Martin Tóth , 2017,2023 -# Peter Kuma, 2021 -# supowski , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2023-12-04 18:32+0000\n" -"Last-Translator: Martin Tóth , 2017,2023\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Redirects" -msgstr "Presmerovania" - -msgid "site" -msgstr "sídlo" - -msgid "redirect from" -msgstr "presmerovať z" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Toto by sa mala byť absolútna cesta bez názvu domény. Napríklad: „/events/" -"search/“." - -msgid "redirect to" -msgstr "presmerovať na" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Toto môže byť buď absolútna cesta (ako vyššie), alebo úplné URL začínajúce " -"schémou ako „https://“." - -msgid "redirect" -msgstr "presmerovanie" - -msgid "redirects" -msgstr "presmerovania" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index 41e11af..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index e8da74c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# zejn , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Primož Verdnik \n" -"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Redirects" -msgstr "Preusmeritve" - -msgid "site" -msgstr "stran" - -msgid "redirect from" -msgstr "preusmeri iz" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Pot mora biti navedena absolutno in brez imena domene. Primer: '/events/" -"search/'." - -msgid "redirect to" -msgstr "preusmeri na" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Pot je lahko navedena absolutno (kot zgoraj) ali pa kot popoln naslov URL, " -"začet z 'http://'." - -msgid "redirect" -msgstr "preusmeri" - -msgid "redirects" -msgstr "preusmeritve" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sq/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index a8bec40..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sq/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index 7217fea..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2011 -# Besnik Bleta , 2021,2025 -# Besnik Bleta , 2015,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2021,2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Ridrejtime" - -msgid "site" -msgstr "sajt" - -msgid "redirect from" -msgstr "ridrejtim prej" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Ky do të duhej të ishte shteg absolut, pa emrin e përkatësisë. Për shembull: " -"“/veprimtari/kërkim/”." - -msgid "redirect to" -msgstr "ridrejtim te" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Ky mund të jetë ose një shteg absolut (si më sipër), ose një URL e plotë që " -"fillon me një skemë të tillë si “http://”." - -msgid "redirect" -msgstr "ridrejtim" - -msgid "redirects" -msgstr "ridrejtime" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index 0054565..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index bf812eb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Igor Jerosimić, 2020-2021 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-15 17:04+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (http://www.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Redirects" -msgstr "Преусмеравања" - -msgid "site" -msgstr "сајт" - -msgid "redirect from" -msgstr "преусмерен са" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Ово треба да буде апсолутна путања, искључујући име домена. Пример: “/events/" -"search/”." - -msgid "redirect to" -msgstr "преусмери ка" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Ово може да буде апсолутна путања (као изнад) или потпун URL који почиње са " -"шемом као нпр. “https://”." - -msgid "redirect" -msgstr "преусмеравање" - -msgid "redirects" -msgstr "преусмеравања" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index 901715d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index f1b3374..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,52 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Igor Jerosimić, 2019-2021 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-15 17:03+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" -"language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Redirects" -msgstr "Preusmeravanja" - -msgid "site" -msgstr "sajt" - -msgid "redirect from" -msgstr "preusmeren sa" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Ovo treba da bude apsolutna putanja, isključujući ime domena. Primer: “/" -"events/search/”." - -msgid "redirect to" -msgstr "preusmeri ka" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Ovo može da bude apsolutna putanja (kao iznad) ili potpun URL koji počinje " -"sa šemom kao npr. “https://”." - -msgid "redirect" -msgstr "preusmeravanje" - -msgid "redirects" -msgstr "preusmeravanja" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index 0017860..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index 9c4a8f9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Elias Johnstone , 2022 -# Jannis Leidel , 2011 -# Jonathan Lindén, 2014 -# Thomas Lundqvist, 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2022-07-24 18:32+0000\n" -"Last-Translator: Elias Johnstone \n" -"Language-Team: Swedish (http://www.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Omdirigeringar" - -msgid "site" -msgstr "webbplats" - -msgid "redirect from" -msgstr "omdirigera från" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Detta bör vara en absolut sökväg utan domännamnet. Exempel: '/handelser/" -"sok/'." - -msgid "redirect to" -msgstr "omdirigera till" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Detta kan vara antingen en absolut sökväg (som ovan) eller en fullständig " -"URL som börjar med 'https://'." - -msgid "redirect" -msgstr "omdirigera" - -msgid "redirects" -msgstr "omdirigeringar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sw/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index 2344b93..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sw/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index 8c361de..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Machaku, 2013-2014 -# Millicent Atieno Obwanda , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2023-12-04 18:32+0000\n" -"Last-Translator: Millicent Atieno Obwanda , 2023\n" -"Language-Team: Swahili (http://app.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Maelekezo upya" - -msgid "site" -msgstr "Tovuti" - -msgid "redirect from" -msgstr "Imeelekezwa kutoka" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Hii inapaswa kuwa njia kamili, isiyojumuisha jina la uwanja. Mfano: '/events/" -"search/" - -msgid "redirect to" -msgstr "elekeza kwenda" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Hii inaweza kuwa njia kamili (kama ilivyoelezwa hapo juu) au URL kamili " -"ikiwa na mwanzo na mpango kama vile 'https://'." - -msgid "redirect" -msgstr "maelekezo upya" - -msgid "redirects" -msgstr "maelekezo upya" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ta/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index e2a9b43..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ta/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index 156ade3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "லிருந்து திசைமாற்று" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"இது ஒரு முழுமையான பாதையாக இருக்கவேண்டும். இணையத்தளப்பெயராக இருக்கக்கூடாது. உதாரணம்:'/" -"events/search/'." - -msgid "redirect to" -msgstr "திரும்ப அனுப்பு" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"இது முழுமையான பாதையாக (மேலே உள்ளது போல) அல்லது \"http\"//\" என தொடங்கும் வலை " -"முகவரியாக இருக்கலாம்." - -msgid "redirect" -msgstr "திரும்ப அனுப்பு" - -msgid "redirects" -msgstr "திரும்ப அனுப்புகிறது. " diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/te/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index 2c23446..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/te/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index dd102f2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/projects/p/django/language/" -"te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "redirect from" -msgstr "" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" - -msgid "redirect to" -msgstr "" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" - -msgid "redirect" -msgstr "" - -msgid "redirects" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index c7908d6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index 43e7c17..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-05-15 00:33+0000\n" -"Last-Translator: Surush Sufiew \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Самтдигаркунӣ(Redirects)" - -msgid "site" -msgstr "сомона" - -msgid "redirect from" -msgstr "Самтдигаркунӣ аз" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" - -msgid "redirect to" -msgstr "Самтдигаркунӣ ба" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"“http://”." -msgstr "" - -msgid "redirect" -msgstr "самтдигаркунӣ" - -msgid "redirects" -msgstr "самтдигаркунӣ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/th/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index 247f902..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/th/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index 78ba247..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2018-05-06 08:37+0000\n" -"Last-Translator: Kowit Charoenratchatabhan \n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "เปลี่ยนทิศทาง" - -msgid "site" -msgstr "ไซต์" - -msgid "redirect from" -msgstr "เปลี่ยนทิศทางจาก" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "พาธไม่รวมโดเมน ตัวอย่าง : '/events/search/'" - -msgid "redirect to" -msgstr "เปลี่ยนทิศทางไปที่" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "มันอาจจะเป็นพาธหรือ URL แบบเต็มที่ขึ้นต้นด้วย 'http://'." - -msgid "redirect" -msgstr "เปลี่ยนทิศทาง" - -msgid "redirects" -msgstr "เปลี่ยนทิศทาง" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index 93c7662..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index 202ce22..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Resul , 2020 -# Welbeck Garli , 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2022-07-24 18:32+0000\n" -"Last-Translator: Welbeck Garli \n" -"Language-Team: Turkmen (http://www.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "Gaýtadan gönükdirmeler" - -msgid "site" -msgstr "sahypa" - -msgid "redirect from" -msgstr "gönükdirilen salgy" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Bu domen ady hasaba almazdan, doly ýol bolmaly. Mysal: “/wakalar/gozleg/”." - -msgid "redirect to" -msgstr "gönükdirilen salgy" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"(ýokarydaky ýaly) absolýut yzarlama ýa-da \"https://\" bilen başlanýan " -"sahypa gönükdirmesi bolup biler." - -msgid "redirect" -msgstr "gönükdirme" - -msgid "redirects" -msgstr "gönükdirmeler" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index 5a9237b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index 87029e3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BouRock, 2015,2019,2021 -# BouRock, 2014 -# Cihad GÜNDOĞDU , 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-16 19:34+0000\n" -"Last-Translator: BouRock\n" -"Language-Team: Turkish (http://www.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Redirects" -msgstr "Yönlendirmeler" - -msgid "site" -msgstr "site" - -msgid "redirect from" -msgstr "yönlendirilen adres" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Bu, bir tam yol olmalıdır, etki alanı adı kullanılmadan yazılmalı. Örnek: “/" -"olaylar/arama/”." - -msgid "redirect to" -msgstr "yönlendirildiği adres" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Bu, ya bir tam yol (yukarıdaki gibi) ya da “https://” gibi bir şema ile " -"başlayan tam bir URL olabilir." - -msgid "redirect" -msgstr "yönlendirme" - -msgid "redirects" -msgstr "yönlendirmeler" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index a1635b6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index d06da14..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,48 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "бу сәхифәдән юнәлтергә:" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Бу домен исеменнән тыш абсолүт юл булырга тиеш. Мәсәлән: '/events/search/'." - -msgid "redirect to" -msgstr "бу сәхифәгә юнәлтергә:" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Бу я абсолүт юл (өстәге кебек), я 'http://' белән башланган тулы URL булырга " -"тиеш." - -msgid "redirect" -msgstr "юнәлтү" - -msgid "redirects" -msgstr "юнәлтүләр" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/udm/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index af7ab53..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/udm/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index 3bfa4d1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "" - -msgid "redirect from" -msgstr "" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" - -msgid "redirect to" -msgstr "" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" - -msgid "redirect" -msgstr "" - -msgid "redirects" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ug/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index 33f6838..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ug/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index 051920f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,50 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abduqadir Abliz , 2023 -# Murat Orhun , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2023-12-04 18:32+0000\n" -"Last-Translator: Murat Orhun , 2023\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "قايتا نىشانلانغان" - -msgid "site" -msgstr "بېكەت" - -msgid "redirect from" -msgstr "قايتا نىشانلانغان مەنبەسى" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"بۇ مۇتلەق يول بولۇشى كېرەك، دائىرە نامىنى ئۆز ئىچىگە ئالمايدۇ. مەسىلە: «/" -"events/search/»." - -msgid "redirect to" -msgstr "قايتا نىشانلانغان مەنزىلى" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"بۇ مۇتلەق يول (يۇقىرىقىغا ئوخشاش) بولسا بولىدۇ ياكى «https://» دىن باشلانغان " -"تولۇق تور ئادرېسى بولسىمۇ بولىدۇ." - -msgid "redirect" -msgstr "قايتا نىشانلا" - -msgid "redirects" -msgstr "قايتا نىشانلانغانلار" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index 2a1fb7b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index c82f937..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,56 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Oleksandr Chernihov , 2014 -# Illia Volochii , 2021 -# Jannis Leidel , 2011 -# Mykola Zamkovoi , 2014 -# Vitaliy Kozlovskyi , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-20 00:12+0000\n" -"Last-Translator: Illia Volochii \n" -"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -msgid "Redirects" -msgstr "Перенаправлення" - -msgid "site" -msgstr "сайт" - -msgid "redirect from" -msgstr "перенаправлення з" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Шлях має бути абсолютним без доменного імені. Наприклад, “/events/search/”." - -msgid "redirect to" -msgstr "перенаправлення до" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"Шлях може бути або абсолютним (як вказано вище), або повним URL (який " -"починається із схеми, як-от “https://”)." - -msgid "redirect" -msgstr "перенаправлення" - -msgid "redirects" -msgstr "перенаправлення" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ur/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index 4b302db..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ur/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index bf3a9b2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "سے ری ڈائریکٹ" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "یہ مطلق پاتھ ھونا چاھئے، بغیر ڈومین نام کے۔ مثلاً '/events/search/'" - -msgid "redirect to" -msgstr "ری ڈائریکٹ از طرف" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"یہ مطلق پاتھ ھو سکتا ھے (جیسے اوپر ھے) یا مکمل یو آر ایل (URL) بمع 'http://'۔" - -msgid "redirect" -msgstr "ری ڈائریکٹ" - -msgid "redirects" -msgstr "ری ڈائیکٹس" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uz/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uz/LC_MESSAGES/django.mo deleted file mode 100644 index 89aa2e0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uz/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uz/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uz/LC_MESSAGES/django.po deleted file mode 100644 index 1357fa2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/uz/LC_MESSAGES/django.po +++ /dev/null @@ -1,48 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bedilbek Khamidov , 2019 -# Nuruddin Iminokhunov , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-19 08:25+0000\n" -"Last-Translator: Bedilbek Khamidov \n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "Redirektlar" - -msgid "site" -msgstr "sayt" - -msgid "redirect from" -msgstr "redirekt formasi" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "" -"Domen nomidan tashqari, bu mutlaq manzil bo'lishi kerak. \n" -"Masalan: “/events/search/”." - -msgid "redirect to" -msgstr "" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"“http://”." -msgstr "" - -msgid "redirect" -msgstr "" - -msgid "redirects" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index ae80abd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index 40e3ddb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 17:42+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Tran Van \n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "" - -msgid "site" -msgstr "" - -msgid "redirect from" -msgstr "Chuyển hướng từ" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Đây phải là đường dẫn tuyệt đối, không bao gồm tên miền. Ví dụ: '/events/" -"search/'." - -msgid "redirect to" -msgstr "Chuyển hướng tới" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Đây có thể là đường dẫn tuyệt đối hoặc địa chỉ đầy đủ bắt đầu với 'http://'" - -msgid "redirect" -msgstr "Chuyển hướng" - -msgid "redirects" -msgstr "Chuyển hướng" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index 915e7c5..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index 93e04fe..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,53 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# HuanCheng Bai白宦成 , 2018 -# Jannis Leidel , 2011 -# mozillazg , 2016 -# Ronald White , 2014 -# Veoco , 2021 -# wolf ice , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-02-07 04:22+0000\n" -"Last-Translator: Veoco \n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "重定向" - -msgid "site" -msgstr "站点" - -msgid "redirect from" -msgstr "重定向自" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "这应该是绝对路径,不包括域名。例如:“/events/search/”。" - -msgid "redirect to" -msgstr "重定向到" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"这可以是绝对路径(如上所述),也可以是一个以 “https://” 等协议开头的完整 " -"URL。" - -msgid "redirect" -msgstr "重定向" - -msgid "redirects" -msgstr "重定向" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index dbaf36d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index 4a1dbf1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,51 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chen Chun-Chia , 2015 -# yubike, 2024 -# Jannis Leidel , 2011 -# Tzu-ping Chung , 2016,2019 -# YAO WEN LIANG, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2024-08-07 18:32+0000\n" -"Last-Translator: YAO WEN LIANG, 2024\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Redirects" -msgstr "重新導向" - -msgid "site" -msgstr "網站" - -msgid "redirect from" -msgstr "重新導向自" - -msgid "" -"This should be an absolute path, excluding the domain name. Example: “/" -"events/search/”." -msgstr "這應該是一個絕對路徑,不包括網域。例如:「/events/search/」。" - -msgid "redirect to" -msgstr "重新導向到" - -msgid "" -"This can be either an absolute path (as above) or a full URL starting with a " -"scheme such as “https://”." -msgstr "" -"這可以是絕對路徑(如上)也可以是一個以 \"https://\" 等協議開頭的完整 URL。" - -msgid "redirect" -msgstr "重新導向" - -msgid "redirects" -msgstr "重新導向" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/middleware.py b/.venv/lib/python3.10/site-packages/django/contrib/redirects/middleware.py deleted file mode 100644 index bc4fe9c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/middleware.py +++ /dev/null @@ -1,50 +0,0 @@ -from django.apps import apps -from django.conf import settings -from django.contrib.redirects.models import Redirect -from django.contrib.sites.shortcuts import get_current_site -from django.core.exceptions import ImproperlyConfigured -from django.http import HttpResponseGone, HttpResponsePermanentRedirect -from django.utils.deprecation import MiddlewareMixin - - -class RedirectFallbackMiddleware(MiddlewareMixin): - # Defined as class-level attributes to be subclassing-friendly. - response_gone_class = HttpResponseGone - response_redirect_class = HttpResponsePermanentRedirect - - def __init__(self, get_response): - if not apps.is_installed("django.contrib.sites"): - raise ImproperlyConfigured( - "You cannot use RedirectFallbackMiddleware when " - "django.contrib.sites is not installed." - ) - super().__init__(get_response) - - def process_response(self, request, response): - # No need to check for a redirect for non-404 responses. - if response.status_code != 404: - return response - - full_path = request.get_full_path() - current_site = get_current_site(request) - - r = None - try: - r = Redirect.objects.get(site=current_site, old_path=full_path) - except Redirect.DoesNotExist: - pass - if r is None and settings.APPEND_SLASH and not request.path.endswith("/"): - try: - r = Redirect.objects.get( - site=current_site, - old_path=request.get_full_path(force_append_slash=True), - ) - except Redirect.DoesNotExist: - pass - if r is not None: - if r.new_path == "": - return self.response_gone_class() - return self.response_redirect_class(r.new_path) - - # No redirect was found. Return the response. - return response diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/migrations/0001_initial.py b/.venv/lib/python3.10/site-packages/django/contrib/redirects/migrations/0001_initial.py deleted file mode 100644 index 7881d57..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/migrations/0001_initial.py +++ /dev/null @@ -1,64 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("sites", "0001_initial"), - ] - - operations = [ - migrations.CreateModel( - name="Redirect", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "site", - models.ForeignKey( - to="sites.Site", - on_delete=models.CASCADE, - verbose_name="site", - ), - ), - ( - "old_path", - models.CharField( - help_text=( - "This should be an absolute path, excluding the domain " - "name. Example: “/events/search/”." - ), - max_length=200, - verbose_name="redirect from", - db_index=True, - ), - ), - ( - "new_path", - models.CharField( - help_text=( - "This can be either an absolute path (as above) or a full " - "URL starting with “http://”." - ), - max_length=200, - verbose_name="redirect to", - blank=True, - ), - ), - ], - options={ - "ordering": ["old_path"], - "unique_together": {("site", "old_path")}, - "db_table": "django_redirect", - "verbose_name": "redirect", - "verbose_name_plural": "redirects", - }, - bases=(models.Model,), - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/migrations/0002_alter_redirect_new_path_help_text.py b/.venv/lib/python3.10/site-packages/django/contrib/redirects/migrations/0002_alter_redirect_new_path_help_text.py deleted file mode 100644 index 9976366..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/migrations/0002_alter_redirect_new_path_help_text.py +++ /dev/null @@ -1,23 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("redirects", "0001_initial"), - ] - - operations = [ - migrations.AlterField( - model_name="redirect", - name="new_path", - field=models.CharField( - blank=True, - help_text=( - "This can be either an absolute path (as above) or a full " - "URL starting with a scheme such as “https://”." - ), - max_length=200, - verbose_name="redirect to", - ), - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/migrations/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/redirects/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/redirects/models.py b/.venv/lib/python3.10/site-packages/django/contrib/redirects/models.py deleted file mode 100644 index 1552414..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/redirects/models.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.contrib.sites.models import Site -from django.db import models -from django.utils.translation import gettext_lazy as _ - - -class Redirect(models.Model): - site = models.ForeignKey(Site, models.CASCADE, verbose_name=_("site")) - old_path = models.CharField( - _("redirect from"), - max_length=200, - db_index=True, - help_text=_( - "This should be an absolute path, excluding the domain name. Example: " - "“/events/search/”." - ), - ) - new_path = models.CharField( - _("redirect to"), - max_length=200, - blank=True, - help_text=_( - "This can be either an absolute path (as above) or a full URL " - "starting with a scheme such as “https://”." - ), - ) - - class Meta: - verbose_name = _("redirect") - verbose_name_plural = _("redirects") - db_table = "django_redirect" - unique_together = [["site", "old_path"]] - ordering = ["old_path"] - - def __str__(self): - return "%s ---> %s" % (self.old_path, self.new_path) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/apps.py deleted file mode 100644 index 83f0cef..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.apps import AppConfig -from django.utils.translation import gettext_lazy as _ - - -class SessionsConfig(AppConfig): - name = "django.contrib.sessions" - verbose_name = _("Sessions") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/base.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/base.py deleted file mode 100644 index 69f756a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/base.py +++ /dev/null @@ -1,523 +0,0 @@ -import logging -import string -from datetime import datetime, timedelta - -from asgiref.sync import sync_to_async - -from django.conf import settings -from django.core import signing -from django.utils import timezone -from django.utils.crypto import get_random_string -from django.utils.module_loading import import_string - -# session_key should not be case sensitive because some backends can store it -# on case insensitive file systems. -VALID_KEY_CHARS = string.ascii_lowercase + string.digits - - -class CreateError(Exception): - """ - Used internally as a consistent exception type to catch from save (see the - docstring for SessionBase.save() for details). - """ - - pass - - -class UpdateError(Exception): - """ - Occurs if Django tries to update a session that was deleted. - """ - - pass - - -class SessionBase: - """ - Base class for all Session classes. - """ - - TEST_COOKIE_NAME = "testcookie" - TEST_COOKIE_VALUE = "worked" - - __not_given = object() - - def __init__(self, session_key=None): - self._session_key = session_key - self.accessed = False - self.modified = False - self.serializer = import_string(settings.SESSION_SERIALIZER) - - def __contains__(self, key): - return key in self._session - - def __getitem__(self, key): - return self._session[key] - - def __setitem__(self, key, value): - self._session[key] = value - self.modified = True - - async def aset(self, key, value): - (await self._aget_session())[key] = value - self.modified = True - - def __delitem__(self, key): - del self._session[key] - self.modified = True - - @property - def key_salt(self): - return "django.contrib.sessions." + self.__class__.__qualname__ - - def get(self, key, default=None): - return self._session.get(key, default) - - async def aget(self, key, default=None): - return (await self._aget_session()).get(key, default) - - def pop(self, key, default=__not_given): - self.modified = self.modified or key in self._session - args = () if default is self.__not_given else (default,) - return self._session.pop(key, *args) - - async def apop(self, key, default=__not_given): - self.modified = self.modified or key in (await self._aget_session()) - args = () if default is self.__not_given else (default,) - return (await self._aget_session()).pop(key, *args) - - def setdefault(self, key, value): - if key in self._session: - return self._session[key] - else: - self[key] = value - return value - - async def asetdefault(self, key, value): - session = await self._aget_session() - if key in session: - return session[key] - else: - await self.aset(key, value) - return value - - def set_test_cookie(self): - self[self.TEST_COOKIE_NAME] = self.TEST_COOKIE_VALUE - - async def aset_test_cookie(self): - await self.aset(self.TEST_COOKIE_NAME, self.TEST_COOKIE_VALUE) - - def test_cookie_worked(self): - return self.get(self.TEST_COOKIE_NAME) == self.TEST_COOKIE_VALUE - - async def atest_cookie_worked(self): - return (await self.aget(self.TEST_COOKIE_NAME)) == self.TEST_COOKIE_VALUE - - def delete_test_cookie(self): - del self[self.TEST_COOKIE_NAME] - - async def adelete_test_cookie(self): - del (await self._aget_session())[self.TEST_COOKIE_NAME] - - def encode(self, session_dict): - "Return the given session dictionary serialized and encoded as a string." - return signing.dumps( - session_dict, - salt=self.key_salt, - serializer=self.serializer, - compress=True, - ) - - def decode(self, session_data): - try: - return signing.loads( - session_data, salt=self.key_salt, serializer=self.serializer - ) - except signing.BadSignature: - logger = logging.getLogger("django.security.SuspiciousSession") - logger.warning("Session data corrupted") - except Exception: - # ValueError, unpickling exceptions. If any of these happen, just - # return an empty dictionary (an empty session). - pass - return {} - - def update(self, dict_): - self._session.update(dict_) - self.modified = True - - async def aupdate(self, dict_): - (await self._aget_session()).update(dict_) - self.modified = True - - def has_key(self, key): - return key in self._session - - async def ahas_key(self, key): - return key in (await self._aget_session()) - - def keys(self): - return self._session.keys() - - async def akeys(self): - return (await self._aget_session()).keys() - - def values(self): - return self._session.values() - - async def avalues(self): - return (await self._aget_session()).values() - - def items(self): - return self._session.items() - - async def aitems(self): - return (await self._aget_session()).items() - - def clear(self): - # To avoid unnecessary persistent storage accesses, we set up the - # internals directly (loading data wastes time, since we are going to - # set it to an empty dict anyway). - self._session_cache = {} - self.accessed = True - self.modified = True - - def is_empty(self): - "Return True when there is no session_key and the session is empty." - try: - return not self._session_key and not self._session_cache - except AttributeError: - return True - - def _get_new_session_key(self): - "Return session key that isn't being used." - while True: - session_key = get_random_string(32, VALID_KEY_CHARS) - if not self.exists(session_key): - return session_key - - async def _aget_new_session_key(self): - while True: - session_key = get_random_string(32, VALID_KEY_CHARS) - if not await self.aexists(session_key): - return session_key - - def _get_or_create_session_key(self): - if self._session_key is None: - self._session_key = self._get_new_session_key() - return self._session_key - - async def _aget_or_create_session_key(self): - if self._session_key is None: - self._session_key = await self._aget_new_session_key() - return self._session_key - - def _validate_session_key(self, key): - """ - Key must be truthy and at least 8 characters long. 8 characters is an - arbitrary lower bound for some minimal key security. - """ - return key and len(key) >= 8 - - def _get_session_key(self): - return self.__session_key - - def _set_session_key(self, value): - """ - Validate session key on assignment. Invalid values will set to None. - """ - if self._validate_session_key(value): - self.__session_key = value - else: - self.__session_key = None - - session_key = property(_get_session_key) - _session_key = property(_get_session_key, _set_session_key) - - def _get_session(self, no_load=False): - """ - Lazily load session from storage (unless "no_load" is True, when only - an empty dict is stored) and store it in the current instance. - """ - self.accessed = True - try: - return self._session_cache - except AttributeError: - if self.session_key is None or no_load: - self._session_cache = {} - else: - self._session_cache = self.load() - return self._session_cache - - async def _aget_session(self, no_load=False): - self.accessed = True - try: - return self._session_cache - except AttributeError: - if self.session_key is None or no_load: - self._session_cache = {} - else: - self._session_cache = await self.aload() - return self._session_cache - - _session = property(_get_session) - - def get_session_cookie_age(self): - return settings.SESSION_COOKIE_AGE - - def get_expiry_age(self, **kwargs): - """Get the number of seconds until the session expires. - - Optionally, this function accepts `modification` and `expiry` keyword - arguments specifying the modification and expiry of the session. - """ - try: - modification = kwargs["modification"] - except KeyError: - modification = timezone.now() - # Make the difference between "expiry=None passed in kwargs" and - # "expiry not passed in kwargs", in order to guarantee not to trigger - # self.load() when expiry is provided. - try: - expiry = kwargs["expiry"] - except KeyError: - expiry = self.get("_session_expiry") - - if not expiry: # Checks both None and 0 cases - return self.get_session_cookie_age() - if not isinstance(expiry, (datetime, str)): - return expiry - if isinstance(expiry, str): - expiry = datetime.fromisoformat(expiry) - delta = expiry - modification - return delta.days * 86400 + delta.seconds - - async def aget_expiry_age(self, **kwargs): - try: - modification = kwargs["modification"] - except KeyError: - modification = timezone.now() - try: - expiry = kwargs["expiry"] - except KeyError: - expiry = await self.aget("_session_expiry") - - if not expiry: # Checks both None and 0 cases - return self.get_session_cookie_age() - if not isinstance(expiry, (datetime, str)): - return expiry - if isinstance(expiry, str): - expiry = datetime.fromisoformat(expiry) - delta = expiry - modification - return delta.days * 86400 + delta.seconds - - def get_expiry_date(self, **kwargs): - """Get session the expiry date (as a datetime object). - - Optionally, this function accepts `modification` and `expiry` keyword - arguments specifying the modification and expiry of the session. - """ - try: - modification = kwargs["modification"] - except KeyError: - modification = timezone.now() - # Same comment as in get_expiry_age - try: - expiry = kwargs["expiry"] - except KeyError: - expiry = self.get("_session_expiry") - - if isinstance(expiry, datetime): - return expiry - elif isinstance(expiry, str): - return datetime.fromisoformat(expiry) - expiry = expiry or self.get_session_cookie_age() - return modification + timedelta(seconds=expiry) - - async def aget_expiry_date(self, **kwargs): - try: - modification = kwargs["modification"] - except KeyError: - modification = timezone.now() - try: - expiry = kwargs["expiry"] - except KeyError: - expiry = await self.aget("_session_expiry") - - if isinstance(expiry, datetime): - return expiry - elif isinstance(expiry, str): - return datetime.fromisoformat(expiry) - expiry = expiry or self.get_session_cookie_age() - return modification + timedelta(seconds=expiry) - - def set_expiry(self, value): - """ - Set a custom expiration for the session. ``value`` can be an integer, - a Python ``datetime`` or ``timedelta`` object or ``None``. - - If ``value`` is an integer, the session will expire after that many - seconds of inactivity. If set to ``0`` then the session will expire on - browser close. - - If ``value`` is a ``datetime`` or ``timedelta`` object, the session - will expire at that specific future time. - - If ``value`` is ``None``, the session uses the global session expiry - policy. - """ - if value is None: - # Remove any custom expiration for this session. - try: - del self["_session_expiry"] - except KeyError: - pass - return - if isinstance(value, timedelta): - value = timezone.now() + value - if isinstance(value, datetime): - value = value.isoformat() - self["_session_expiry"] = value - - async def aset_expiry(self, value): - if value is None: - # Remove any custom expiration for this session. - try: - await self.apop("_session_expiry") - except KeyError: - pass - return - if isinstance(value, timedelta): - value = timezone.now() + value - if isinstance(value, datetime): - value = value.isoformat() - await self.aset("_session_expiry", value) - - def get_expire_at_browser_close(self): - """ - Return ``True`` if the session is set to expire when the browser - closes, and ``False`` if there's an expiry date. Use - ``get_expiry_date()`` or ``get_expiry_age()`` to find the actual expiry - date/age, if there is one. - """ - if (expiry := self.get("_session_expiry")) is None: - return settings.SESSION_EXPIRE_AT_BROWSER_CLOSE - return expiry == 0 - - async def aget_expire_at_browser_close(self): - if (expiry := await self.aget("_session_expiry")) is None: - return settings.SESSION_EXPIRE_AT_BROWSER_CLOSE - return expiry == 0 - - def flush(self): - """ - Remove the current session data from the database and regenerate the - key. - """ - self.clear() - self.delete() - self._session_key = None - - async def aflush(self): - self.clear() - await self.adelete() - self._session_key = None - - def cycle_key(self): - """ - Create a new session key, while retaining the current session data. - """ - data = self._session - key = self.session_key - self.create() - self._session_cache = data - if key: - self.delete(key) - - async def acycle_key(self): - """ - Create a new session key, while retaining the current session data. - """ - data = await self._aget_session() - key = self.session_key - await self.acreate() - self._session_cache = data - if key: - await self.adelete(key) - - # Methods that child classes must implement. - - def exists(self, session_key): - """ - Return True if the given session_key already exists. - """ - raise NotImplementedError( - "subclasses of SessionBase must provide an exists() method" - ) - - async def aexists(self, session_key): - return await sync_to_async(self.exists)(session_key) - - def create(self): - """ - Create a new session instance. Guaranteed to create a new object with - a unique key and will have saved the result once (with empty data) - before the method returns. - """ - raise NotImplementedError( - "subclasses of SessionBase must provide a create() method" - ) - - async def acreate(self): - return await sync_to_async(self.create)() - - def save(self, must_create=False): - """ - Save the session data. If 'must_create' is True, create a new session - object (or raise CreateError). Otherwise, only update an existing - object and don't create one (raise UpdateError if needed). - """ - raise NotImplementedError( - "subclasses of SessionBase must provide a save() method" - ) - - async def asave(self, must_create=False): - return await sync_to_async(self.save)(must_create) - - def delete(self, session_key=None): - """ - Delete the session data under this key. If the key is None, use the - current session key value. - """ - raise NotImplementedError( - "subclasses of SessionBase must provide a delete() method" - ) - - async def adelete(self, session_key=None): - return await sync_to_async(self.delete)(session_key) - - def load(self): - """ - Load the session data and return a dictionary. - """ - raise NotImplementedError( - "subclasses of SessionBase must provide a load() method" - ) - - async def aload(self): - return await sync_to_async(self.load)() - - @classmethod - def clear_expired(cls): - """ - Remove expired sessions from the session store. - - If this operation isn't possible on a given backend, it should raise - NotImplementedError. If it isn't necessary, because the backend has - a built-in expiration mechanism, it should be a no-op. - """ - raise NotImplementedError("This backend does not support clear_expired().") - - @classmethod - async def aclear_expired(cls): - return await sync_to_async(cls.clear_expired)() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/cache.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/cache.py deleted file mode 100644 index b87afd6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/cache.py +++ /dev/null @@ -1,145 +0,0 @@ -from django.conf import settings -from django.contrib.sessions.backends.base import CreateError, SessionBase, UpdateError -from django.core.cache import caches - -KEY_PREFIX = "django.contrib.sessions.cache" - - -class SessionStore(SessionBase): - """ - A cache-based session store. - """ - - cache_key_prefix = KEY_PREFIX - - def __init__(self, session_key=None): - self._cache = caches[settings.SESSION_CACHE_ALIAS] - super().__init__(session_key) - - @property - def cache_key(self): - return self.cache_key_prefix + self._get_or_create_session_key() - - async def acache_key(self): - return self.cache_key_prefix + await self._aget_or_create_session_key() - - def load(self): - try: - session_data = self._cache.get(self.cache_key) - except Exception: - # Some backends (e.g. memcache) raise an exception on invalid - # cache keys. If this happens, reset the session. See #17810. - session_data = None - if session_data is not None: - return session_data - self._session_key = None - return {} - - async def aload(self): - try: - session_data = await self._cache.aget(await self.acache_key()) - except Exception: - session_data = None - if session_data is not None: - return session_data - self._session_key = None - return {} - - def create(self): - # Because a cache can fail silently (e.g. memcache), we don't know if - # we are failing to create a new session because of a key collision or - # because the cache is missing. So we try for a (large) number of times - # and then raise an exception. That's the risk you shoulder if using - # cache backing. - for i in range(10000): - self._session_key = self._get_new_session_key() - try: - self.save(must_create=True) - except CreateError: - continue - self.modified = True - return - raise RuntimeError( - "Unable to create a new session key. " - "It is likely that the cache is unavailable." - ) - - async def acreate(self): - for i in range(10000): - self._session_key = await self._aget_new_session_key() - try: - await self.asave(must_create=True) - except CreateError: - continue - self.modified = True - return - raise RuntimeError( - "Unable to create a new session key. " - "It is likely that the cache is unavailable." - ) - - def save(self, must_create=False): - if self.session_key is None: - return self.create() - if must_create: - func = self._cache.add - elif self._cache.get(self.cache_key) is not None: - func = self._cache.set - else: - raise UpdateError - result = func( - self.cache_key, - self._get_session(no_load=must_create), - self.get_expiry_age(), - ) - if must_create and not result: - raise CreateError - - async def asave(self, must_create=False): - if self.session_key is None: - return await self.acreate() - if must_create: - func = self._cache.aadd - elif await self._cache.aget(await self.acache_key()) is not None: - func = self._cache.aset - else: - raise UpdateError - result = await func( - await self.acache_key(), - await self._aget_session(no_load=must_create), - await self.aget_expiry_age(), - ) - if must_create and not result: - raise CreateError - - def exists(self, session_key): - return ( - bool(session_key) and (self.cache_key_prefix + session_key) in self._cache - ) - - async def aexists(self, session_key): - return bool(session_key) and await self._cache.ahas_key( - self.cache_key_prefix + session_key - ) - - def delete(self, session_key=None): - if session_key is None: - if self.session_key is None: - return - session_key = self.session_key - self._cache.delete(self.cache_key_prefix + session_key) - - async def adelete(self, session_key=None): - if session_key is None: - if self.session_key is None: - return - session_key = self.session_key - await self._cache.adelete(self.cache_key_prefix + session_key) - - @classmethod - def clear_expired(cls): - pass - - @classmethod - async def aclear_expired(cls): - pass diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/cached_db.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/cached_db.py deleted file mode 100644 index 2195f57..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/cached_db.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -Cached, database-backed sessions. -""" - -import logging - -from django.conf import settings -from django.contrib.sessions.backends.db import SessionStore as DBStore -from django.core.cache import caches - -KEY_PREFIX = "django.contrib.sessions.cached_db" - -logger = logging.getLogger("django.contrib.sessions") - - -class SessionStore(DBStore): - """ - Implement cached, database backed sessions. - """ - - cache_key_prefix = KEY_PREFIX - - def __init__(self, session_key=None): - self._cache = caches[settings.SESSION_CACHE_ALIAS] - super().__init__(session_key) - - @property - def cache_key(self): - return self.cache_key_prefix + self._get_or_create_session_key() - - async def acache_key(self): - return self.cache_key_prefix + await self._aget_or_create_session_key() - - def load(self): - try: - data = self._cache.get(self.cache_key) - except Exception: - # Some backends (e.g. memcache) raise an exception on invalid - # cache keys. If this happens, reset the session. See #17810. - data = None - - if data is None: - s = self._get_session_from_db() - if s: - data = self.decode(s.session_data) - self._cache.set( - self.cache_key, data, self.get_expiry_age(expiry=s.expire_date) - ) - else: - data = {} - return data - - async def aload(self): - try: - data = await self._cache.aget(await self.acache_key()) - except Exception: - # Some backends (e.g. memcache) raise an exception on invalid - # cache keys. If this happens, reset the session. See #17810. - data = None - - if data is None: - s = await self._aget_session_from_db() - if s: - data = self.decode(s.session_data) - await self._cache.aset( - await self.acache_key(), - data, - await self.aget_expiry_age(expiry=s.expire_date), - ) - else: - data = {} - return data - - def exists(self, session_key): - return ( - session_key - and (self.cache_key_prefix + session_key) in self._cache - or super().exists(session_key) - ) - - async def aexists(self, session_key): - return ( - session_key - and (self.cache_key_prefix + session_key) in self._cache - or await super().aexists(session_key) - ) - - def save(self, must_create=False): - super().save(must_create) - try: - self._cache.set(self.cache_key, self._session, self.get_expiry_age()) - except Exception: - logger.exception("Error saving to cache (%s)", self._cache) - - async def asave(self, must_create=False): - await super().asave(must_create) - try: - await self._cache.aset( - await self.acache_key(), - self._session, - await self.aget_expiry_age(), - ) - except Exception: - logger.exception("Error saving to cache (%s)", self._cache) - - def delete(self, session_key=None): - super().delete(session_key) - if session_key is None: - if self.session_key is None: - return - session_key = self.session_key - self._cache.delete(self.cache_key_prefix + session_key) - - async def adelete(self, session_key=None): - await super().adelete(session_key) - if session_key is None: - if self.session_key is None: - return - session_key = self.session_key - await self._cache.adelete(self.cache_key_prefix + session_key) - - def flush(self): - """ - Remove the current session data from the database and regenerate the - key. - """ - self.clear() - self.delete(self.session_key) - self._session_key = None - - async def aflush(self): - """See flush().""" - self.clear() - await self.adelete(self.session_key) - self._session_key = None diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/db.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/db.py deleted file mode 100644 index 6d6247d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/db.py +++ /dev/null @@ -1,198 +0,0 @@ -import logging - -from asgiref.sync import sync_to_async - -from django.contrib.sessions.backends.base import CreateError, SessionBase, UpdateError -from django.core.exceptions import SuspiciousOperation -from django.db import DatabaseError, IntegrityError, router, transaction -from django.utils import timezone -from django.utils.functional import cached_property - - -class SessionStore(SessionBase): - """ - Implement database session store. - """ - - def __init__(self, session_key=None): - super().__init__(session_key) - - @classmethod - def get_model_class(cls): - # Avoids a circular import and allows importing SessionStore when - # django.contrib.sessions is not in INSTALLED_APPS. - from django.contrib.sessions.models import Session - - return Session - - @cached_property - def model(self): - return self.get_model_class() - - def _get_session_from_db(self): - try: - return self.model.objects.get( - session_key=self.session_key, expire_date__gt=timezone.now() - ) - except (self.model.DoesNotExist, SuspiciousOperation) as e: - if isinstance(e, SuspiciousOperation): - logger = logging.getLogger("django.security.%s" % e.__class__.__name__) - logger.warning(str(e)) - self._session_key = None - - async def _aget_session_from_db(self): - try: - return await self.model.objects.aget( - session_key=self.session_key, expire_date__gt=timezone.now() - ) - except (self.model.DoesNotExist, SuspiciousOperation) as e: - if isinstance(e, SuspiciousOperation): - logger = logging.getLogger("django.security.%s" % e.__class__.__name__) - logger.warning(str(e)) - self._session_key = None - - def load(self): - s = self._get_session_from_db() - return self.decode(s.session_data) if s else {} - - async def aload(self): - s = await self._aget_session_from_db() - return self.decode(s.session_data) if s else {} - - def exists(self, session_key): - return self.model.objects.filter(session_key=session_key).exists() - - async def aexists(self, session_key): - return await self.model.objects.filter(session_key=session_key).aexists() - - def create(self): - while True: - self._session_key = self._get_new_session_key() - try: - # Save immediately to ensure we have a unique entry in the - # database. - self.save(must_create=True) - except CreateError: - # Key wasn't unique. Try again. - continue - self.modified = True - return - - async def acreate(self): - while True: - self._session_key = await self._aget_new_session_key() - try: - # Save immediately to ensure we have a unique entry in the - # database. - await self.asave(must_create=True) - except CreateError: - # Key wasn't unique. Try again. - continue - self.modified = True - return - - def create_model_instance(self, data): - """ - Return a new instance of the session model object, which represents the - current session state. Intended to be used for saving the session data - to the database. - """ - return self.model( - session_key=self._get_or_create_session_key(), - session_data=self.encode(data), - expire_date=self.get_expiry_date(), - ) - - async def acreate_model_instance(self, data): - """See create_model_instance().""" - return self.model( - session_key=await self._aget_or_create_session_key(), - session_data=self.encode(data), - expire_date=await self.aget_expiry_date(), - ) - - def save(self, must_create=False): - """ - Save the current session data to the database. If 'must_create' is - True, raise a database error if the saving operation doesn't create a - new entry (as opposed to possibly updating an existing entry). - """ - if self.session_key is None: - return self.create() - data = self._get_session(no_load=must_create) - obj = self.create_model_instance(data) - using = router.db_for_write(self.model, instance=obj) - try: - with transaction.atomic(using=using): - obj.save( - force_insert=must_create, force_update=not must_create, using=using - ) - except IntegrityError: - if must_create: - raise CreateError - raise - except DatabaseError: - if not must_create: - raise UpdateError - raise - - async def asave(self, must_create=False): - """See save().""" - if self.session_key is None: - return await self.acreate() - data = await self._aget_session(no_load=must_create) - obj = await self.acreate_model_instance(data) - using = router.db_for_write(self.model, instance=obj) - try: - # This code MOST run in a transaction, so it requires - # @sync_to_async wrapping until transaction.atomic() supports - # async. - @sync_to_async - def sync_transaction(): - with transaction.atomic(using=using): - obj.save( - force_insert=must_create, - force_update=not must_create, - using=using, - ) - - await sync_transaction() - except IntegrityError: - if must_create: - raise CreateError - raise - except DatabaseError: - if not must_create: - raise UpdateError - raise - - def delete(self, session_key=None): - if session_key is None: - if self.session_key is None: - return - session_key = self.session_key - try: - self.model.objects.get(session_key=session_key).delete() - except self.model.DoesNotExist: - pass - - async def adelete(self, session_key=None): - if session_key is None: - if self.session_key is None: - return - session_key = self.session_key - try: - obj = await self.model.objects.aget(session_key=session_key) - await obj.adelete() - except self.model.DoesNotExist: - pass - - @classmethod - def clear_expired(cls): - cls.get_model_class().objects.filter(expire_date__lt=timezone.now()).delete() - - @classmethod - async def aclear_expired(cls): - await cls.get_model_class().objects.filter( - expire_date__lt=timezone.now() - ).adelete() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/file.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/file.py deleted file mode 100644 index e15b3f0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/file.py +++ /dev/null @@ -1,226 +0,0 @@ -import datetime -import logging -import os -import shutil -import tempfile - -from django.conf import settings -from django.contrib.sessions.backends.base import ( - VALID_KEY_CHARS, - CreateError, - SessionBase, - UpdateError, -) -from django.contrib.sessions.exceptions import InvalidSessionKey -from django.core.exceptions import ImproperlyConfigured, SuspiciousOperation - - -class SessionStore(SessionBase): - """ - Implement a file based session store. - """ - - def __init__(self, session_key=None): - self.storage_path = self._get_storage_path() - self.file_prefix = settings.SESSION_COOKIE_NAME - super().__init__(session_key) - - @classmethod - def _get_storage_path(cls): - try: - return cls._storage_path - except AttributeError: - storage_path = ( - getattr(settings, "SESSION_FILE_PATH", None) or tempfile.gettempdir() - ) - # Make sure the storage path is valid. - if not os.path.isdir(storage_path): - raise ImproperlyConfigured( - "The session storage path %r doesn't exist. Please set your" - " SESSION_FILE_PATH setting to an existing directory in which" - " Django can store session data." % storage_path - ) - - cls._storage_path = storage_path - return storage_path - - def _key_to_file(self, session_key=None): - """ - Get the file associated with this session key. - """ - if session_key is None: - session_key = self._get_or_create_session_key() - - # Make sure we're not vulnerable to directory traversal. Session keys - # should always be md5s, so they should never contain directory - # components. - if not set(session_key).issubset(VALID_KEY_CHARS): - raise InvalidSessionKey("Invalid characters in session key") - - return os.path.join(self.storage_path, self.file_prefix + session_key) - - def _last_modification(self): - """ - Return the modification time of the file storing the session's content. - """ - modification = os.stat(self._key_to_file()).st_mtime - tz = datetime.timezone.utc if settings.USE_TZ else None - return datetime.datetime.fromtimestamp(modification, tz=tz) - - def _expiry_date(self, session_data): - """ - Return the expiry time of the file storing the session's content. - """ - return session_data.get("_session_expiry") or ( - self._last_modification() - + datetime.timedelta(seconds=self.get_session_cookie_age()) - ) - - def load(self): - session_data = {} - try: - with open(self._key_to_file(), encoding="ascii") as session_file: - file_data = session_file.read() - # Don't fail if there is no data in the session file. - # We may have opened the empty placeholder file. - if file_data: - try: - session_data = self.decode(file_data) - except (EOFError, SuspiciousOperation) as e: - if isinstance(e, SuspiciousOperation): - logger = logging.getLogger( - "django.security.%s" % e.__class__.__name__ - ) - logger.warning(str(e)) - self.create() - - # Remove expired sessions. - expiry_age = self.get_expiry_age(expiry=self._expiry_date(session_data)) - if expiry_age <= 0: - session_data = {} - self.delete() - self.create() - except (OSError, SuspiciousOperation): - self._session_key = None - return session_data - - async def aload(self): - return self.load() - - def create(self): - while True: - self._session_key = self._get_new_session_key() - try: - self.save(must_create=True) - except CreateError: - continue - self.modified = True - return - - async def acreate(self): - return self.create() - - def save(self, must_create=False): - if self.session_key is None: - return self.create() - # Get the session data now, before we start messing - # with the file it is stored within. - session_data = self._get_session(no_load=must_create) - - session_file_name = self._key_to_file() - - try: - # Make sure the file exists. If it does not already exist, an - # empty placeholder file is created. - flags = os.O_WRONLY | getattr(os, "O_BINARY", 0) - if must_create: - flags |= os.O_EXCL | os.O_CREAT - fd = os.open(session_file_name, flags) - os.close(fd) - except FileNotFoundError: - if not must_create: - raise UpdateError - except FileExistsError: - if must_create: - raise CreateError - - # Write the session file without interfering with other threads - # or processes. By writing to an atomically generated temporary - # file and then using the atomic os.rename() to make the complete - # file visible, we avoid having to lock the session file, while - # still maintaining its integrity. - # - # Note: Locking the session file was explored, but rejected in part - # because in order to be atomic and cross-platform, it required a - # long-lived lock file for each session, doubling the number of - # files in the session storage directory at any given time. This - # rename solution is cleaner and avoids any additional overhead - # when reading the session data, which is the more common case - # unless SESSION_SAVE_EVERY_REQUEST = True. - # - # See ticket #8616. - dir, prefix = os.path.split(session_file_name) - - try: - output_file_fd, output_file_name = tempfile.mkstemp( - dir=dir, prefix=prefix + "_out_" - ) - renamed = False - try: - try: - os.write(output_file_fd, self.encode(session_data).encode()) - finally: - os.close(output_file_fd) - - # This will atomically rename the file (os.rename) if the OS - # supports it. Otherwise this will result in a shutil.copy2 - # and os.unlink (for example on Windows). See #9084. - shutil.move(output_file_name, session_file_name) - renamed = True - finally: - if not renamed: - os.unlink(output_file_name) - except (EOFError, OSError): - pass - - async def asave(self, must_create=False): - return self.save(must_create=must_create) - - def exists(self, session_key): - return os.path.exists(self._key_to_file(session_key)) - - async def aexists(self, session_key): - return self.exists(session_key) - - def delete(self, session_key=None): - if session_key is None: - if self.session_key is None: - return - session_key = self.session_key - try: - os.unlink(self._key_to_file(session_key)) - except OSError: - pass - - async def adelete(self, session_key=None): - return self.delete(session_key=session_key) - - @classmethod - def clear_expired(cls): - storage_path = cls._get_storage_path() - file_prefix = settings.SESSION_COOKIE_NAME - - for session_file in os.listdir(storage_path): - if not session_file.startswith(file_prefix): - continue - session_key = session_file.removeprefix(file_prefix) - session = cls(session_key) - # When an expired session is loaded, its file is removed, and a - # new file is immediately created. Prevent this by disabling - # the create() method. - session.create = lambda: None - session.load() - - @classmethod - async def aclear_expired(cls): - cls.clear_expired() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/signed_cookies.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/signed_cookies.py deleted file mode 100644 index 604cb99..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/backends/signed_cookies.py +++ /dev/null @@ -1,103 +0,0 @@ -from django.contrib.sessions.backends.base import SessionBase -from django.core import signing - - -class SessionStore(SessionBase): - def load(self): - """ - Load the data from the key itself instead of fetching from some - external data store. Opposite of _get_session_key(), raise BadSignature - if signature fails. - """ - try: - return signing.loads( - self.session_key, - serializer=self.serializer, - # This doesn't handle non-default expiry dates, see #19201 - max_age=self.get_session_cookie_age(), - salt="django.contrib.sessions.backends.signed_cookies", - ) - except Exception: - # BadSignature, ValueError, or unpickling exceptions. If any of - # these happen, reset the session. - self.create() - return {} - - async def aload(self): - return self.load() - - def create(self): - """ - To create a new key, set the modified flag so that the cookie is set - on the client for the current request. - """ - self.modified = True - - async def acreate(self): - return self.create() - - def save(self, must_create=False): - """ - To save, get the session key as a securely signed string and then set - the modified flag so that the cookie is set on the client for the - current request. - """ - self._session_key = self._get_session_key() - self.modified = True - - async def asave(self, must_create=False): - return self.save(must_create=must_create) - - def exists(self, session_key=None): - """ - This method makes sense when you're talking to a shared resource, but - it doesn't matter when you're storing the information in the client's - cookie. - """ - return False - - async def aexists(self, session_key=None): - return self.exists(session_key=session_key) - - def delete(self, session_key=None): - """ - To delete, clear the session key and the underlying data structure - and set the modified flag so that the cookie is set on the client for - the current request. - """ - self._session_key = "" - self._session_cache = {} - self.modified = True - - async def adelete(self, session_key=None): - return self.delete(session_key=session_key) - - def cycle_key(self): - """ - Keep the same data but with a new key. Call save() and it will - automatically save a cookie with a new key at the end of the request. - """ - self.save() - - async def acycle_key(self): - return self.cycle_key() - - def _get_session_key(self): - """ - Instead of generating a random string, generate a secure url-safe - base64-encoded string of data as our session key. - """ - return signing.dumps( - self._session, - compress=True, - salt="django.contrib.sessions.backends.signed_cookies", - serializer=self.serializer, - ) - - @classmethod - def clear_expired(cls): - pass - - @classmethod - async def aclear_expired(cls): - pass diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/base_session.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/base_session.py deleted file mode 100644 index 8809dd3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/base_session.py +++ /dev/null @@ -1,48 +0,0 @@ -""" -This module allows importing AbstractBaseSession even -when django.contrib.sessions is not in INSTALLED_APPS. -""" - -from django.db import models -from django.utils.translation import gettext_lazy as _ - - -class BaseSessionManager(models.Manager): - def encode(self, session_dict): - """ - Return the given session dictionary serialized and encoded as a string. - """ - session_store_class = self.model.get_session_store_class() - return session_store_class().encode(session_dict) - - def save(self, session_key, session_dict, expire_date): - s = self.model(session_key, self.encode(session_dict), expire_date) - if session_dict: - s.save() - else: - s.delete() # Clear sessions with no data. - return s - - -class AbstractBaseSession(models.Model): - session_key = models.CharField(_("session key"), max_length=40, primary_key=True) - session_data = models.TextField(_("session data")) - expire_date = models.DateTimeField(_("expire date"), db_index=True) - - objects = BaseSessionManager() - - class Meta: - abstract = True - verbose_name = _("session") - verbose_name_plural = _("sessions") - - def __str__(self): - return self.session_key - - @classmethod - def get_session_store_class(cls): - raise NotImplementedError - - def get_decoded(self): - session_store_class = self.get_session_store_class() - return session_store_class().decode(self.session_data) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/exceptions.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/exceptions.py deleted file mode 100644 index 8a4853c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/exceptions.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.core.exceptions import BadRequest, SuspiciousOperation - - -class InvalidSessionKey(SuspiciousOperation): - """Invalid characters in session key""" - - pass - - -class SuspiciousSession(SuspiciousOperation): - """The session may be tampered with""" - - pass - - -class SessionInterrupted(BadRequest): - """The session was interrupted.""" - - pass diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/af/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index 25d7ab6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/af/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index 09560cf..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-01-04 18:57+0000\n" -"Last-Translator: F Wolff \n" -"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessies" - -msgid "session key" -msgstr "sessiesleutel" - -msgid "session data" -msgstr "sessiedata" - -msgid "expire date" -msgstr "vervaldatum" - -msgid "session" -msgstr "sessie" - -msgid "sessions" -msgstr "sessies" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index 027a065..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index 3108223..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Sessions" -msgstr "جلسات" - -msgid "session key" -msgstr "مفتاح الجلسة" - -msgid "session data" -msgstr "بيانات الجلسة" - -msgid "expire date" -msgstr "تاريخ الانتهاء" - -msgid "session" -msgstr "جلسة" - -msgid "sessions" -msgstr "جلسات" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar_DZ/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index 0f55320..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar_DZ/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index 2ff47ed..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Riterix , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-12-14 22:50+0000\n" -"Last-Translator: Riterix \n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Sessions" -msgstr "جلسات" - -msgid "session key" -msgstr "مفتاح الجلسة" - -msgid "session data" -msgstr "بيانات الجلسة" - -msgid "expire date" -msgstr "تاريخ الانتهاء" - -msgid "session" -msgstr "جلسة" - -msgid "sessions" -msgstr "جلسات" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ast/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index 4b363bf..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ast/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index 57d8681..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 19:51+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "clave de sesión" - -msgid "session data" -msgstr "datos de sesión" - -msgid "expire date" -msgstr "data de caducidá" - -msgid "session" -msgstr "sesión" - -msgid "sessions" -msgstr "sesiones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/az/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 9b488a3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/az/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index 7ce647a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Ismayilov , 2011 -# Emin Mastizada , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-04-27 13:19+0000\n" -"Last-Translator: Emin Mastizada \n" -"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Seanslar" - -msgid "session key" -msgstr "seans açarı" - -msgid "session data" -msgstr "seansın məlumatları" - -msgid "expire date" -msgstr "bitmə tarixi" - -msgid "session" -msgstr "seans" - -msgid "sessions" -msgstr "seanslar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/be/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index 100a157..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/be/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index 68d074a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Viktar Palstsiuk \n" -"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Sessions" -msgstr "Сесіі" - -msgid "session key" -msgstr "ключ сэансу" - -msgid "session data" -msgstr "зьвесткі сэансу" - -msgid "expire date" -msgstr "тэрмін" - -msgid "session" -msgstr "сэсія" - -msgid "sessions" -msgstr "сэсіі" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index 68e4b05..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index aeab9b8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022 -# Jannis Leidel , 2011 -# vestimir , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2022-01-14 11:56+0000\n" -"Last-Translator: arneatec \n" -"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Сесии" - -msgid "session key" -msgstr "ключ на сесията" - -msgid "session data" -msgstr "данни от сесията" - -msgid "expire date" -msgstr "дата на изтичане на валидност" - -msgid "session" -msgstr "сесия" - -msgid "sessions" -msgstr "сесии" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index c029c76..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index aa4a335..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "সেশন কি" - -msgid "session data" -msgstr "সেশন ডাটা" - -msgid "expire date" -msgstr "মেয়াদ শেষের তারিখ" - -msgid "session" -msgstr "সেশন" - -msgid "sessions" -msgstr "সেশনসমূহ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/br/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index 777a187..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/br/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index a6c8c04..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,40 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fulup , 2012 -# Irriep Nala Novram , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-10-19 23:05+0000\n" -"Last-Translator: Irriep Nala Novram \n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -msgid "Sessions" -msgstr "Dalc'hoù" - -msgid "session key" -msgstr "alc'hwez dalc'h" - -msgid "session data" -msgstr "roadennoù an dalc'h" - -msgid "expire date" -msgstr "deiziad fin" - -msgid "session" -msgstr "dalc'h" - -msgid "sessions" -msgstr "dalc'hoù" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index f167bc8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index 2ba36a9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "ključ sesije" - -msgid "session data" -msgstr "podaci sesije" - -msgid "expire date" -msgstr "datum isteka" - -msgid "session" -msgstr "sesija" - -msgid "sessions" -msgstr "sesije" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ca/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 480400c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ca/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index cd7ea3f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Carles Barrobés , 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessions" - -msgid "session key" -msgstr "clau de la sessió" - -msgid "session data" -msgstr "dades de la sessió" - -msgid "expire date" -msgstr "data de caducitat" - -msgid "session" -msgstr "sessió" - -msgid "sessions" -msgstr "sessions" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ckb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index 24a4cc6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ckb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index fb8d23a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# kosar tofiq , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2023-04-24 18:26+0000\n" -"Last-Translator: kosar tofiq , 2020\n" -"Language-Team: Central Kurdish (http://www.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "کۆڕەکان" - -msgid "session key" -msgstr "کلیلی کۆڕ" - -msgid "session data" -msgstr "دراوەی کۆڕ" - -msgid "expire date" -msgstr "بەرواری بەسەرچوون" - -msgid "session" -msgstr "کۆڕ" - -msgid "sessions" -msgstr "کۆڕەکان" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index 80a9b27..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index 743e3e4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vláďa Macek , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -msgid "Sessions" -msgstr "Sezení" - -msgid "session key" -msgstr "klíč sezení" - -msgid "session data" -msgstr "data sezení" - -msgid "expire date" -msgstr "datum expirace" - -msgid "session" -msgstr "sezení" - -msgid "sessions" -msgstr "sezení" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index d4bee0c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index efd21c2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Maredudd ap Gwyndaf \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -msgid "Sessions" -msgstr "Sesiynau" - -msgid "session key" -msgstr "allwedd sesiwn" - -msgid "session data" -msgstr "data sesiwn" - -msgid "expire date" -msgstr "dyddiad terfyn" - -msgid "session" -msgstr "sesiwn" - -msgid "sessions" -msgstr "sesiynau" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/da/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index 489874b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/da/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index 8d1689c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Erik Wognsen , 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessioner" - -msgid "session key" -msgstr "sessionsnøgle" - -msgid "session data" -msgstr "sessionsdata" - -msgid "expire date" -msgstr "udløbsdato" - -msgid "session" -msgstr "session" - -msgid "sessions" -msgstr "sessioner" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/de/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index 3af9146..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/de/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index a3153e6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011,2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessions" - -msgid "session key" -msgstr "Sitzungs-ID" - -msgid "session data" -msgstr "Sitzungsdaten" - -msgid "expire date" -msgstr "Verfallsdatum" - -msgid "session" -msgstr "Sitzung" - -msgid "sessions" -msgstr "Sitzungen" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/dsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index cb8a5e8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/dsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index 9e2a233..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 00:02+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Sessions" -msgstr "Póseźenja" - -msgid "session key" -msgstr "pósejźeński kluc" - -msgid "session data" -msgstr "pósejźeńske daty" - -msgid "expire date" -msgstr "datum spadnjenja" - -msgid "session" -msgstr "pósejźenje" - -msgid "sessions" -msgstr "pósejźenja" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index a8ef4ca..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index 3813c31..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Pãnoș , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Pãnoș \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Συνεδρίες" - -msgid "session key" -msgstr "κλειδί συνεδρίας" - -msgid "session data" -msgstr "δεδομένα συνεδρίας" - -msgid "expire date" -msgstr "ημερομηνία λήξης" - -msgid "session" -msgstr "συνεδρία" - -msgid "sessions" -msgstr "συνεδρίες" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 08a7b68..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index 2ce1872..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: contrib/sessions/apps.py:8 -msgid "Sessions" -msgstr "" - -#: contrib/sessions/models.py:44 -msgid "session key" -msgstr "" - -#: contrib/sessions/models.py:46 -msgid "session data" -msgstr "" - -#: contrib/sessions/models.py:47 -msgid "expire date" -msgstr "" - -#: contrib/sessions/models.py:52 -msgid "session" -msgstr "" - -#: contrib/sessions/models.py:53 -msgid "sessions" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index fbc756b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index da9a8d4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2021-04-11 13:15+0000\n" -"Last-Translator: Tom Fifield \n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessions" - -msgid "session key" -msgstr "session key" - -msgid "session data" -msgstr "session data" - -msgid "expire date" -msgstr "expire date" - -msgid "session" -msgstr "session" - -msgid "sessions" -msgstr "sessions" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index fd83c31..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index ee4a40d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ross Poulton , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "session key" - -msgid "session data" -msgstr "session data" - -msgid "expire date" -msgstr "expire date" - -msgid "session" -msgstr "session" - -msgid "sessions" -msgstr "sessions" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eo/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index 258b370..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eo/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index 7c1ab40..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Baptiste Darthenay , 2014 -# kristjan , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Seancoj" - -msgid "session key" -msgstr "seanco-ŝlosilo" - -msgid "session data" -msgstr "seanco-datumo" - -msgid "expire date" -msgstr "senvalidiĝ-dato" - -msgid "session" -msgstr "seanco" - -msgid "sessions" -msgstr "seancoj" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 20e0a1c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 85241b3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ernesto Avilés Vázquez , 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (http://www.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sesiones" - -msgid "session key" -msgstr "clave de sesión" - -msgid "session data" -msgstr "datos de sesión" - -msgid "expire date" -msgstr "fecha de caducidad" - -msgid "session" -msgstr "sesión" - -msgid "sessions" -msgstr "sesiones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index 4a94ca3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 3840a2d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ramiro Morales, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sesiones" - -msgid "session key" -msgstr "clave de sesión" - -msgid "session data" -msgstr "datos de la sesión" - -msgid "expire date" -msgstr "fecha de caducidad" - -msgid "session" -msgstr "sesión" - -msgid "sessions" -msgstr "sesiones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index 238fe24..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index 5d2faab..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Carlos Muñoz , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 22:00+0000\n" -"Last-Translator: Carlos Muñoz \n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sesiones" - -msgid "session key" -msgstr "clave de sesión" - -msgid "session data" -msgstr "datos de sesión" - -msgid "expire date" -msgstr "fecha de caducidad" - -msgid "session" -msgstr "sesión" - -msgid "sessions" -msgstr "sesiones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index 33f2811..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index cb53c81..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abraham Estrada, 2011 -# zodman , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: zodman \n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sesiones" - -msgid "session key" -msgstr "clave de sesión" - -msgid "session data" -msgstr "datos de la sesión" - -msgid "expire date" -msgstr "fecha de caducidad" - -msgid "session" -msgstr "período de sesiones" - -msgid "sessions" -msgstr "sesiones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index 32f6e8f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index ccd4d09..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/" -"django/language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "" - -msgid "session data" -msgstr "" - -msgid "expire date" -msgstr "" - -msgid "session" -msgstr "" - -msgid "sessions" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/et/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index 8d9fe06..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/et/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index b7efce9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Marti Raudsepp , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Estonian (http://www.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessioonid" - -msgid "session key" -msgstr "sessioonivõti" - -msgid "session data" -msgstr "sessiooni andmed" - -msgid "expire date" -msgstr "kehtivusaja lõpp" - -msgid "session" -msgstr "sessioon" - -msgid "sessions" -msgstr "sessioonid" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index 1d92fef..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index aafbe62..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eneko Illarramendi , 2017 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Eneko Illarramendi \n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sesioak" - -msgid "session key" -msgstr "sesioaren giltza" - -msgid "session data" -msgstr "sesioaren datuak" - -msgid "expire date" -msgstr "amaiera data" - -msgid "session" -msgstr "sesioa" - -msgid "sessions" -msgstr "sesioak" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index c2fb662..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index 276d2de..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Reza Mohammadi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Sessions" -msgstr "نشست‌ها" - -msgid "session key" -msgstr "کلید نشست" - -msgid "session data" -msgstr "اطلاعات نشست" - -msgid "expire date" -msgstr "تاریخ انقضاء" - -msgid "session" -msgstr "نشست" - -msgid "sessions" -msgstr "نشست‌ها" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index 7273f8a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index 40b2425..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Klaus Dahlén , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Finnish (http://www.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Istunnot" - -msgid "session key" -msgstr "istunnon avain" - -msgid "session data" -msgstr "istunnon tiedot" - -msgid "expire date" -msgstr "vanhenee" - -msgid "session" -msgstr "istunto" - -msgid "sessions" -msgstr "istunnot" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 753c301..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index cc4a9e6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Sessions" -msgstr "Sessions" - -msgid "session key" -msgstr "clé de session" - -msgid "session data" -msgstr "données de session" - -msgid "expire date" -msgstr "date d'expiration" - -msgid "session" -msgstr "session" - -msgid "sessions" -msgstr "sessions" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index 489bbab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index 6e216b3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "" - -msgid "session data" -msgstr "" - -msgid "expire date" -msgstr "" - -msgid "session" -msgstr "" - -msgid "sessions" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ga/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index 2b854bd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ga/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index e9e1278..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Luke Blaney , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-06-22 21:45+0000\n" -"Last-Translator: Luke Blaney \n" -"Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -msgid "Sessions" -msgstr "Seisiúin" - -msgid "session key" -msgstr "eochair an seisiún" - -msgid "session data" -msgstr "sonraíocht an seisiún" - -msgid "expire date" -msgstr "Data dul as feidhm" - -msgid "session" -msgstr "seisiún" - -msgid "sessions" -msgstr "seisúin" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gd/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index ef41ac8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gd/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index b291970..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-22 17:29+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -msgid "Sessions" -msgstr "Seiseanan" - -msgid "session key" -msgstr "iuchair an t-seisein" - -msgid "session data" -msgstr "dàta an t-seisein" - -msgid "expire date" -msgstr "falbhaidh an ùine air" - -msgid "session" -msgstr "seisean" - -msgid "sessions" -msgstr "seiseanan" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index f620215..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index 5e90f74..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Leandro Regueiro , 2013 -# X Bello , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2023-04-24 18:26+0000\n" -"Last-Translator: X Bello , 2023\n" -"Language-Team: Galician (http://www.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sesións" - -msgid "session key" -msgstr "chave da sesión" - -msgid "session data" -msgstr "datos da sesión" - -msgid "expire date" -msgstr "data de caducidade" - -msgid "session" -msgstr "sesión" - -msgid "sessions" -msgstr "sesións" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/he/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index 1cce904..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/he/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index e8bd934..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Meir Kriheli , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -msgid "Sessions" -msgstr "התחברויות" - -msgid "session key" -msgstr "מפתח התחברות (session key)" - -msgid "session data" -msgstr "מידע התחברות (session data)" - -msgid "expire date" -msgstr "תאריך פג תוקף" - -msgid "session" -msgstr "התחברות" - -msgid "sessions" -msgstr "התחברויות" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index 34947ca..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index 90a5061..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Sandeep Satavlekar , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "सत्र कुंजी" - -msgid "session data" -msgstr "सत्र सामग्री" - -msgid "expire date" -msgstr "समाप्ति तिथी" - -msgid "session" -msgstr "सत्र" - -msgid "sessions" -msgstr "सत्रें" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index d697c5f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index cb0405c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Mislav Cimperšak \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgid "Sessions" -msgstr "Sessions" - -msgid "session key" -msgstr "session ključ (key)" - -msgid "session data" -msgstr "session podaci" - -msgid "expire date" -msgstr "ističe na datum" - -msgid "session" -msgstr "session" - -msgid "sessions" -msgstr "sessions" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index e2dcbe6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index 04fd111..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 00:02+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Sessions" -msgstr "Posedźenja" - -msgid "session key" -msgstr "posedźenski kluč" - -msgid "session data" -msgstr "posedźenske daty" - -msgid "expire date" -msgstr "datum spadnjenja" - -msgid "session" -msgstr "posedźenje" - -msgid "sessions" -msgstr "posedźenja" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index 01e0540..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index 17623ec..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# András Veres-Szentkirályi, 2016 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: János R (Hangya)\n" -"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Munkamenetek" - -msgid "session key" -msgstr "munkamenet kulcs" - -msgid "session data" -msgstr "munkamenet adat" - -msgid "expire date" -msgstr "lejárat dátuma" - -msgid "session" -msgstr "munkamenet" - -msgid "sessions" -msgstr "munkamenetek" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index 5845568..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index 9961a82..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-11-01 20:47+0000\n" -"Last-Translator: Ruben Harutyunov \n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Սեսսիաներ" - -msgid "session key" -msgstr "սեսսիայի բանալի" - -msgid "session data" -msgstr "սեսսիայի տվյալներ" - -msgid "expire date" -msgstr "պիտանիության ժամկետը" - -msgid "session" -msgstr "սեսսիա" - -msgid "sessions" -msgstr "սեսսիաներ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ia/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index 24f465c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ia/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index 1e271ee..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 22:00+0000\n" -"Last-Translator: Martijn Dekker \n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessiones" - -msgid "session key" -msgstr "clave de session" - -msgid "session data" -msgstr "datos de session" - -msgid "expire date" -msgstr "data de expiration" - -msgid "session" -msgstr "session" - -msgid "sessions" -msgstr "sessiones" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/id/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index d02dea8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/id/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index ef9b14f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# M Asep Indrayana , 2015 -# rodin , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: rodin \n" -"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "Sesi" - -msgid "session key" -msgstr "kunci sesi" - -msgid "session data" -msgstr "data sesi" - -msgid "expire date" -msgstr "tanggal kedaluwarsa" - -msgid "session" -msgstr "sesi" - -msgid "sessions" -msgstr "sesi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/io/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index e781b05..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/io/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index 8487664..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viko Bartero , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-20 01:58+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "sesiono klefo" - -msgid "session data" -msgstr "sesiono datumi" - -msgid "expire date" -msgstr "expiro dato" - -msgid "session" -msgstr "sesiono" - -msgid "sessions" -msgstr "sesioni" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/is/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index a6dd863..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/is/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index 0bdaf5d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "setulykill" - -msgid "session data" -msgstr "setugögn" - -msgid "expire date" -msgstr "fyrningardagsetning" - -msgid "session" -msgstr "seta" - -msgid "sessions" -msgstr "setur" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/it/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index 33e2cd7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/it/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index 3d8353c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Marco Bonetti, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: palmux \n" -"Language-Team: Italian (http://www.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessioni" - -msgid "session key" -msgstr "chiave di sessione" - -msgid "session data" -msgstr "dati di sessione" - -msgid "expire date" -msgstr "data di scadenza" - -msgid "session" -msgstr "sessione" - -msgid "sessions" -msgstr "sessioni" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ja/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index 0de4c29..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ja/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index 25ef99a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Shinya Okano , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Japanese (http://www.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "セッション" - -msgid "session key" -msgstr "セッションキー" - -msgid "session data" -msgstr "セッションデータ" - -msgid "expire date" -msgstr "有効期限" - -msgid "session" -msgstr "セッション" - -msgid "sessions" -msgstr "セッション" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ka/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index be4e5d8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ka/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index bcdcb5f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "სესიის გასაღები" - -msgid "session data" -msgstr "სესიის მონაცემები" - -msgid "expire date" -msgstr "ამოწურვის თარიღი" - -msgid "session" -msgstr "სესია" - -msgid "sessions" -msgstr "სესიები" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kab/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kab/LC_MESSAGES/django.mo deleted file mode 100644 index 6f22bc4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kab/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kab/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kab/LC_MESSAGES/django.po deleted file mode 100644 index b3aa45f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kab/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-10-06 11:49+0000\n" -"Last-Translator: Muḥend Belqasem \n" -"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" -"kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Tiɣimiyin" - -msgid "session key" -msgstr "tasarutt n tɣimit" - -msgid "session data" -msgstr "isefka n tɣimit" - -msgid "expire date" -msgstr "azemz n tgara" - -msgid "session" -msgstr "tiɣimit" - -msgid "sessions" -msgstr "tiɣimiyin" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index f3b0c1b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index 5777dc2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Baurzhan Muftakhidinov , 2015 -# yun_man_ger , 2011 -# Zhazira , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Baurzhan Muftakhidinov \n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Sessions" -msgstr "Сессиялар" - -msgid "session key" -msgstr "сессия кілті" - -msgid "session data" -msgstr "сессия деректері" - -msgid "expire date" -msgstr "мерзімі аяқталу уақыты" - -msgid "session" -msgstr "сессия" - -msgid "sessions" -msgstr "сессиялар" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/km/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index af28c29..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/km/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index 1c1252c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "លេខសំគាល់​រយះពេល​ពិនិត្យ​ចូល" - -msgid "session data" -msgstr "ទិន្នន័យរយះពេល​ពិនិត្យ​ចូល" - -msgid "expire date" -msgstr "ហួសពេលកំណត់" - -msgid "session" -msgstr "រយះពេល​ពិនិត្យ​ចូល" - -msgid "sessions" -msgstr "រយះពេល​ពិនិត្យ​ចូល" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index 23b8948..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index 0811ad8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Rohith PR, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2021-08-03 10:50+0000\n" -"Last-Translator: Rohith PR\n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Sessions" -msgstr "ಅಧಿವೇಶನಗಳು" - -msgid "session key" -msgstr "ಅಧಿವೇಶನದ ಕೀಲಿಕೈ" - -msgid "session data" -msgstr "ಅಧಿವೇಶನದ ದತ್ತಾಂಶ" - -msgid "expire date" -msgstr "ಅವಧಿಮೀರುವ ದಿನಾಂಕ" - -msgid "session" -msgstr "ಅಧಿವೇಶನ" - -msgid "sessions" -msgstr "ಅಧಿವೇಶನಗಳು" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index 02949db..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index b49ff0e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Hyeonho Kang, 2024 -# Jannis Leidel , 2011 -# JunGu Kang , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2024-10-07 18:26+0000\n" -"Last-Translator: Hyeonho Kang, 2024\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "세션" - -msgid "session key" -msgstr "세션 키" - -msgid "session data" -msgstr "세션 날짜" - -msgid "expire date" -msgstr "만료 날짜" - -msgid "session" -msgstr "세션" - -msgid "sessions" -msgstr "세션들" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ky/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index f24928a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ky/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 7d9feac..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2020-05-23 06:08+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "Отурумдар" - -msgid "session key" -msgstr "отурум ачкычы" - -msgid "session data" -msgstr "отурум берилиши" - -msgid "expire date" -msgstr "мөөнөтү" - -msgid "session" -msgstr "отурум" - -msgid "sessions" -msgstr "отурумдар" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index 5b7937f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index e7c83d4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "" - -msgid "session data" -msgstr "" - -msgid "expire date" -msgstr "" - -msgid "session" -msgstr "" - -msgid "sessions" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index bfd37fb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index 0051e30..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Matas Dailyda , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Matas Dailyda \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Sessions" -msgstr "Sesijos" - -msgid "session key" -msgstr "sesijos raktas" - -msgid "session data" -msgstr "sesijos data" - -msgid "expire date" -msgstr "galiojima data" - -msgid "session" -msgstr "sesija" - -msgid "sessions" -msgstr "sesijos" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index 07f5308..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index 45fdde5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# peterisb , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: peterisb \n" -"Language-Team: Latvian (http://www.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -msgid "Sessions" -msgstr "Sesijas" - -msgid "session key" -msgstr "sesijas atslēga" - -msgid "session data" -msgstr "sesijas dati" - -msgid "expire date" -msgstr "izbeigšanās datums" - -msgid "session" -msgstr "sesija" - -msgid "sessions" -msgstr "sesijas" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index bdf114e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index 1e1162b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vasil Vangelovski , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgid "Sessions" -msgstr "Сесии" - -msgid "session key" -msgstr "сесиски клуч" - -msgid "session data" -msgstr "сесиски податоци" - -msgid "expire date" -msgstr "датум на истекување" - -msgid "session" -msgstr "сесија" - -msgid "sessions" -msgstr "сесии" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ml/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index 9710d02..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ml/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index ecaa341..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Hrishikesh , 2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-03-03 10:00+0000\n" -"Last-Translator: Hrishikesh \n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "സെഷനുകൾ" - -msgid "session key" -msgstr "സെഷന്‍ കീ" - -msgid "session data" -msgstr "സെഷനിലെ ഡാറ്റ" - -msgid "expire date" -msgstr "കാലാവധി തീരുന്ന തിയ്യതി" - -msgid "session" -msgstr "സെഷന്‍" - -msgid "sessions" -msgstr "സെഷനുകള്‍" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index f214362..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 4ff7c35..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bayarkhuu Bataa, 2014 -# Jannis Leidel , 2011 -# Анхбаяр Анхаа , 2011,2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-07-09 06:53+0000\n" -"Last-Translator: Анхбаяр Анхаа \n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Session-ууд" - -msgid "session key" -msgstr "session түлхүүр" - -msgid "session data" -msgstr "session өгөгдөл" - -msgid "expire date" -msgstr "дуусах хугацаа" - -msgid "session" -msgstr "session" - -msgid "sessions" -msgstr "session-ууд" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index 0dc523d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index cefc17d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Omkar Parab, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2024-01-24 18:26+0000\n" -"Last-Translator: Omkar Parab, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "सत्रे" - -msgid "session key" -msgstr "सत्राची किल्ली" - -msgid "session data" -msgstr "सत्रातील डेटा" - -msgid "expire date" -msgstr "संपण्याची दिनांक" - -msgid "session" -msgstr "सत्र" - -msgid "sessions" -msgstr "सत्रे" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ms/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index f46c07b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ms/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index 4e3b6aa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2021-11-16 12:39+0000\n" -"Last-Translator: Jafry Hisham\n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "Sesi-sesi" - -msgid "session key" -msgstr "Kunci sesi" - -msgid "session data" -msgstr "Data sesi" - -msgid "expire date" -msgstr "Tarikh tamat tempoh" - -msgid "session" -msgstr "sesi" - -msgid "sessions" -msgstr "sesi-sesi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/my/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index 73d049a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/my/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index 7457874..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2013,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:50+0000\n" -"Last-Translator: Yhal Htet Aung \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "ကြားကာလများ" - -msgid "session key" -msgstr "ကြားကာလသော့" - -msgid "session data" -msgstr "ကြားကာလအချက်အလက်" - -msgid "expire date" -msgstr "သက်တမ်းကုန်နေ့စွဲ" - -msgid "session" -msgstr "ကြားကာလ" - -msgid "sessions" -msgstr "ကြားကာလများ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index 78c5727..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index 7a6d5d0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# jensadne , 2014 -# Jon , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Økter" - -msgid "session key" -msgstr "øktnøkkel" - -msgid "session data" -msgstr "øktdata" - -msgid "expire date" -msgstr "utløpsdato" - -msgid "session" -msgstr "økt" - -msgid "sessions" -msgstr "økter" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ne/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index 93ff678..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ne/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index c2b6e8c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Paras Nath Chaudhary , 2012 -# Sagar Chalise , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Sagar Chalise \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "अवधिहरु" - -msgid "session key" -msgstr "अवधि साँचो" - -msgid "session data" -msgstr "अवधि विवरण" - -msgid "expire date" -msgstr "खारेज मिति" - -msgid "session" -msgstr "अवधि" - -msgid "sessions" -msgstr "अवधिहरु" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index c44a8fc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index 60698e5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Sander Steffann , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Sander Steffann \n" -"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessies" - -msgid "session key" -msgstr "sessiesleutel" - -msgid "session data" -msgstr "sessiegegevens" - -msgid "expire date" -msgstr "verloopdatum" - -msgid "session" -msgstr "sessie" - -msgid "sessions" -msgstr "sessies" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index 285d386..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index 802d36d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Sivert Olstad, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2021-10-26 12:34+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sesjonar" - -msgid "session key" -msgstr "sesjonsnøkkel" - -msgid "session data" -msgstr "sesjonsdata" - -msgid "expire date" -msgstr "utløpsdato" - -msgid "session" -msgstr "sesjon" - -msgid "sessions" -msgstr "sesjonar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/os/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index 4ab9e90..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/os/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index 0588ebb..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:58+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "сессийы амонӕн" - -msgid "session data" -msgstr "сессийы рардтӕ" - -msgid "expire date" -msgstr "фӕуды афон" - -msgid "session" -msgstr "сесси" - -msgid "sessions" -msgstr "сесситӕ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index 9c4c9da..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index 3895f30..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "ਸ਼ੈਸ਼ਨ ਕੁੰਜੀ" - -msgid "session data" -msgstr "ਸ਼ੈਸ਼ਨ ਡਾਟਾ" - -msgid "expire date" -msgstr "ਮਿਆਦ ਮਿਤੀ" - -msgid "session" -msgstr "ਸ਼ੈਸ਼ਨ" - -msgid "sessions" -msgstr "ਸ਼ੈਸ਼ਨ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index b479f2b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index b72de94..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Mattia Procopio , 2014 -# Tomasz Kajtoch , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Tomasz Kajtoch \n" -"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" -"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" -"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -msgid "Sessions" -msgstr "Sesje" - -msgid "session key" -msgstr "klucz sesji" - -msgid "session data" -msgstr "dane sesji" - -msgid "expire date" -msgstr "data wygaśnięcia sesji" - -msgid "session" -msgstr "sesja" - -msgid "sessions" -msgstr "sesje" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index bb50e3a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index 69a3fa0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessões" - -msgid "session key" -msgstr "chave da sessão" - -msgid "session data" -msgstr "dados da sessão" - -msgid "expire date" -msgstr "data de expiração" - -msgid "session" -msgstr "sessão" - -msgid "sessions" -msgstr "sessões" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index e4e0da1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index ebe8e6a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: andrewsmedina \n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Sessions" -msgstr "Sessões" - -msgid "session key" -msgstr "chave da sessão" - -msgid "session data" -msgstr "dados da sessão" - -msgid "expire date" -msgstr "data de expiração" - -msgid "session" -msgstr "sessão" - -msgid "sessions" -msgstr "sessões" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ro/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index 49ade94..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ro/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index daae11e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Daniel Ursache-Dogariu, 2011 -# Jannis Leidel , 2011 -# Razvan Stefanescu , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Razvan Stefanescu \n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -msgid "Sessions" -msgstr "Sesiuni" - -msgid "session key" -msgstr "cheie sesiune" - -msgid "session data" -msgstr "date sesiune" - -msgid "expire date" -msgstr "dată expirare" - -msgid "session" -msgstr "sesiune" - -msgid "sessions" -msgstr "sesiuni" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ru/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index 8934770..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ru/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index 1f4a938..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Алексей Борискин , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Eugene MechanisM \n" -"Language-Team: Russian (http://www.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Sessions" -msgstr "Сессии" - -msgid "session key" -msgstr "ключ сессии" - -msgid "session data" -msgstr "данные сессии" - -msgid "expire date" -msgstr "дата окончания" - -msgid "session" -msgstr "сессия" - -msgid "sessions" -msgstr "сессии" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index 675f761..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index ca01c84..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Martin Tóth , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Martin Tóth \n" -"Language-Team: Slovak (http://www.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Sessions" -msgstr "Relácie" - -msgid "session key" -msgstr "kľúč relácie" - -msgid "session data" -msgstr "údaje relácie" - -msgid "expire date" -msgstr "dátum vypršania platnosti" - -msgid "session" -msgstr "relácia" - -msgid "sessions" -msgstr "relácie" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index a44169f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index f06a9a2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# zejn , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Primož Verdnik \n" -"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Sessions" -msgstr "Seje" - -msgid "session key" -msgstr "ključ seje" - -msgid "session data" -msgstr "podatki seje" - -msgid "expire date" -msgstr "čas preteka" - -msgid "session" -msgstr "seja" - -msgid "sessions" -msgstr "seje" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sq/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index 001dbcd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sq/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index 3299ef0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Besnik \n" -"Language-Team: Albanian (http://www.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sesione" - -msgid "session key" -msgstr "kyç sesioni" - -msgid "session data" -msgstr "të dhëna sesioni" - -msgid "expire date" -msgstr "datë skadimi" - -msgid "session" -msgstr "sesion" - -msgid "sessions" -msgstr "sesione" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index d89316d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index 97759a0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-01-30 10:08+0000\n" -"Last-Translator: Branko Kokanovic \n" -"Language-Team: Serbian (http://www.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Sessions" -msgstr "Сесије" - -msgid "session key" -msgstr "кључ сесије" - -msgid "session data" -msgstr "подаци сесије" - -msgid "expire date" -msgstr "датум застаревања" - -msgid "session" -msgstr "сесија" - -msgid "sessions" -msgstr "сесије" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index 708ede0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index 1132d52..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Igor Jerosimić, 2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-06-27 12:40+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" -"language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Sessions" -msgstr "Sesije" - -msgid "session key" -msgstr "ključ sesije" - -msgid "session data" -msgstr "podaci sesije" - -msgid "expire date" -msgstr "datum zastarevanja" - -msgid "session" -msgstr "sesija" - -msgid "sessions" -msgstr "sesije" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index b44d13a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index bf18a34..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Jonathan Lindén, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jonathan Lindén\n" -"Language-Team: Swedish (http://www.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessioner" - -msgid "session key" -msgstr "sessionsnyckel" - -msgid "session data" -msgstr "sessionsdata" - -msgid "expire date" -msgstr "utgångsdatum" - -msgid "session" -msgstr "session" - -msgid "sessions" -msgstr "sessioner" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sw/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index 3b4e3a4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sw/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index f645ab4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Machaku , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Vipindi" - -msgid "session key" -msgstr "ufunguo wa kipindi" - -msgid "session data" -msgstr "data za kipindi" - -msgid "expire date" -msgstr "tarehe ya mwisho ya matumizi" - -msgid "session" -msgstr "kipindi" - -msgid "sessions" -msgstr "vipindi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ta/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index a81d60d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ta/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index 21779b0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "அமர்வு குறியீ" - -msgid "session data" -msgstr "அமர்வு தகவல்" - -msgid "expire date" -msgstr "காலாவதியாகும் தேதி" - -msgid "session" -msgstr "அமர்வு" - -msgid "sessions" -msgstr "அமர்வுகள்" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index 7a2be87..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index c9832a4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# bhaskar teja yerneni , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "భాగము తాళంచెవి" - -msgid "session data" -msgstr "భాగము దత్తం" - -msgid "expire date" -msgstr "కాలం చెల్లు తేది." - -msgid "session" -msgstr "భాగము" - -msgid "sessions" -msgstr "భాగములు" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index 7a64c5b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index 0860033..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2020-05-15 00:34+0000\n" -"Last-Translator: Surush Sufiew \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Сессияҳо" - -msgid "session key" -msgstr "калиди сессияҳо" - -msgid "session data" -msgstr "додаҳои сессияҳо" - -msgid "expire date" -msgstr "санаи анҷом" - -msgid "session" -msgstr "сессия" - -msgid "sessions" -msgstr "сессияҳо" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index 462cce8..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index 9f7648f..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-05-06 07:45+0000\n" -"Last-Translator: Kowit Charoenratchatabhan \n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "เซสชัน" - -msgid "session key" -msgstr "เซสชันคีย์" - -msgid "session data" -msgstr "ข้อมูลเซสชัน" - -msgid "expire date" -msgstr "วันหมดอายุ" - -msgid "session" -msgstr "เซสชัน" - -msgid "sessions" -msgstr "เซสชัน" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index 18fdb60..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index f5ace16..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Welbeck Garli , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2020-07-06 11:50+0000\n" -"Last-Translator: Resulkary \n" -"Language-Team: Turkmen (http://www.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "Sessiýalar" - -msgid "session key" -msgstr "sessiýa açary" - -msgid "session data" -msgstr "sessiýa maglumaty" - -msgid "expire date" -msgstr "gutarýan senesi" - -msgid "session" -msgstr "sessiýa" - -msgid "sessions" -msgstr "sessiýalar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index 3125a69..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index a23226b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BouRock, 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Turkish (http://www.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Sessions" -msgstr "Oturumlar" - -msgid "session key" -msgstr "oturum anahtarı" - -msgid "session data" -msgstr "oturum verisi" - -msgid "expire date" -msgstr "bitiş tarihi" - -msgid "session" -msgstr "oturum" - -msgid "sessions" -msgstr "oturumlar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index e552192..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index d74b9f4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -# v_ildar , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "Эш сеанслары" - -msgid "session key" -msgstr "эш сеансы ачкычы" - -msgid "session data" -msgstr "эш сеансы бирелмәләре" - -msgid "expire date" -msgstr "искерү көне" - -msgid "session" -msgstr "эш сеансы" - -msgid "sessions" -msgstr "эш сеанслары" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/udm/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index af7ab53..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/udm/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index d0a7115..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "" - -msgid "session data" -msgstr "" - -msgid "expire date" -msgstr "" - -msgid "session" -msgstr "" - -msgid "sessions" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ug/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index 1a4986d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ug/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index 5ee4065..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,34 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2023-12-04 18:26+0000\n" -"Last-Translator: Django team\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "ئەڭگىمە" - -msgid "session key" -msgstr "ئەڭگىمە ئاچقۇچى" - -msgid "session data" -msgstr "ئەڭگىمە سانلىق مەلۇماتى" - -msgid "expire date" -msgstr "ئاخىرلىشىش ۋاقتى" - -msgid "session" -msgstr "ئەڭگىمە" - -msgid "sessions" -msgstr "ئەڭگىمەلەر" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index a2def30..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index befabf0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,40 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Oleksandr Chernihov , 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Mykola Zamkovoi \n" -"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -msgid "Sessions" -msgstr "Сесії" - -msgid "session key" -msgstr "ключ сесії" - -msgid "session data" -msgstr "дані сесії" - -msgid "expire date" -msgstr "термін придатності" - -msgid "session" -msgstr "сесія" - -msgid "sessions" -msgstr "сесії" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ur/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index 493b9c2..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ur/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index 62f6255..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "کلید نشست" - -msgid "session data" -msgstr "نشست کا ڈیٹا" - -msgid "expire date" -msgstr "مدت ختم ھونے کی تاریخ" - -msgid "session" -msgstr "نشست" - -msgid "sessions" -msgstr "نشستیں" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uz/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uz/LC_MESSAGES/django.mo deleted file mode 100644 index 9346a6c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uz/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uz/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uz/LC_MESSAGES/django.po deleted file mode 100644 index 47fa681..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/uz/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Nuruddin Iminokhunov , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 01:18+0000\n" -"Last-Translator: Nuruddin Iminokhunov \n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "Sessiyalar" - -msgid "session key" -msgstr "sessiya kaliti" - -msgid "session data" -msgstr "sessiya ma'lumotlari " - -msgid "expire date" -msgstr "tugash vaqti" - -msgid "session" -msgstr "sessiya" - -msgid "sessions" -msgstr "sessiyalar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/vi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index 69b82fd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/vi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index 731d24c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Thanh Le Viet , 2013 -# Tran Van , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Tran Van \n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "" - -msgid "session key" -msgstr "session key" - -msgid "session data" -msgstr "session data" - -msgid "expire date" -msgstr "Ngày hết hạn" - -msgid "session" -msgstr "Phiên" - -msgid "sessions" -msgstr "session" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index 4d762f6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index ee25859..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ronald White , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "会话" - -msgid "session key" -msgstr "会话密钥" - -msgid "session data" -msgstr "会话数据" - -msgid "expire date" -msgstr "过期时间" - -msgid "session" -msgstr "会话" - -msgid "sessions" -msgstr "会话" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index 1cf5a54..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index 45198f4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chen Chun-Chia , 2015 -# Jannis Leidel , 2011 -# YAO WEN LIANG, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2024-08-07 18:26+0000\n" -"Last-Translator: YAO WEN LIANG, 2024\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sessions" -msgstr "Sessions" - -msgid "session key" -msgstr "session 鍵值" - -msgid "session data" -msgstr "session 資料" - -msgid "expire date" -msgstr "過期時間" - -msgid "session" -msgstr "session" - -msgid "sessions" -msgstr "sessions" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/management/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/management/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/management/commands/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/management/commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/management/commands/clearsessions.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/management/commands/clearsessions.py deleted file mode 100644 index 899f537..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/management/commands/clearsessions.py +++ /dev/null @@ -1,21 +0,0 @@ -from importlib import import_module - -from django.conf import settings -from django.core.management.base import BaseCommand, CommandError - - -class Command(BaseCommand): - help = ( - "Can be run as a cronjob or directly to clean out expired sessions " - "when the backend supports it." - ) - - def handle(self, **options): - engine = import_module(settings.SESSION_ENGINE) - try: - engine.SessionStore.clear_expired() - except NotImplementedError: - raise CommandError( - "Session engine '%s' doesn't support clearing expired " - "sessions." % settings.SESSION_ENGINE - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/middleware.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/middleware.py deleted file mode 100644 index 9c934f9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/middleware.py +++ /dev/null @@ -1,77 +0,0 @@ -import time -from importlib import import_module - -from django.conf import settings -from django.contrib.sessions.backends.base import UpdateError -from django.contrib.sessions.exceptions import SessionInterrupted -from django.utils.cache import patch_vary_headers -from django.utils.deprecation import MiddlewareMixin -from django.utils.http import http_date - - -class SessionMiddleware(MiddlewareMixin): - def __init__(self, get_response): - super().__init__(get_response) - engine = import_module(settings.SESSION_ENGINE) - self.SessionStore = engine.SessionStore - - def process_request(self, request): - session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME) - request.session = self.SessionStore(session_key) - - def process_response(self, request, response): - """ - If request.session was modified, or if the configuration is to save the - session every time, save the changes and set a session cookie or delete - the session cookie if the session has been emptied. - """ - try: - accessed = request.session.accessed - modified = request.session.modified - empty = request.session.is_empty() - except AttributeError: - return response - # First check if we need to delete this cookie. - # The session should be deleted only if the session is entirely empty. - if settings.SESSION_COOKIE_NAME in request.COOKIES and empty: - response.delete_cookie( - settings.SESSION_COOKIE_NAME, - path=settings.SESSION_COOKIE_PATH, - domain=settings.SESSION_COOKIE_DOMAIN, - samesite=settings.SESSION_COOKIE_SAMESITE, - ) - patch_vary_headers(response, ("Cookie",)) - else: - if accessed: - patch_vary_headers(response, ("Cookie",)) - if (modified or settings.SESSION_SAVE_EVERY_REQUEST) and not empty: - if request.session.get_expire_at_browser_close(): - max_age = None - expires = None - else: - max_age = request.session.get_expiry_age() - expires_time = time.time() + max_age - expires = http_date(expires_time) - # Save the session data and refresh the client cookie. - # Skip session save for 5xx responses. - if response.status_code < 500: - try: - request.session.save() - except UpdateError: - raise SessionInterrupted( - "The request's session was deleted before the " - "request completed. The user may have logged " - "out in a concurrent request, for example." - ) - response.set_cookie( - settings.SESSION_COOKIE_NAME, - request.session.session_key, - max_age=max_age, - expires=expires, - domain=settings.SESSION_COOKIE_DOMAIN, - path=settings.SESSION_COOKIE_PATH, - secure=settings.SESSION_COOKIE_SECURE or None, - httponly=settings.SESSION_COOKIE_HTTPONLY or None, - samesite=settings.SESSION_COOKIE_SAMESITE, - ) - return response diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/migrations/0001_initial.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/migrations/0001_initial.py deleted file mode 100644 index 42e382a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/migrations/0001_initial.py +++ /dev/null @@ -1,37 +0,0 @@ -import django.contrib.sessions.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [] - - operations = [ - migrations.CreateModel( - name="Session", - fields=[ - ( - "session_key", - models.CharField( - max_length=40, - serialize=False, - verbose_name="session key", - primary_key=True, - ), - ), - ("session_data", models.TextField(verbose_name="session data")), - ( - "expire_date", - models.DateTimeField(verbose_name="expire date", db_index=True), - ), - ], - options={ - "abstract": False, - "db_table": "django_session", - "verbose_name": "session", - "verbose_name_plural": "sessions", - }, - managers=[ - ("objects", django.contrib.sessions.models.SessionManager()), - ], - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/migrations/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/models.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/models.py deleted file mode 100644 index e786ab4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/models.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.contrib.sessions.base_session import AbstractBaseSession, BaseSessionManager - - -class SessionManager(BaseSessionManager): - use_in_migrations = True - - -class Session(AbstractBaseSession): - """ - Django provides full support for anonymous sessions. The session - framework lets you store and retrieve arbitrary data on a - per-site-visitor basis. It stores data on the server side and - abstracts the sending and receiving of cookies. Cookies contain a - session ID -- not the data itself. - - The Django sessions framework is entirely cookie-based. It does - not fall back to putting session IDs in URLs. This is an intentional - design decision. Not only does that behavior make URLs ugly, it makes - your site vulnerable to session-ID theft via the "Referer" header. - - For complete documentation on using Sessions in your code, consult - the sessions documentation that is shipped with Django (also available - on the Django web site). - """ - - objects = SessionManager() - - @classmethod - def get_session_store_class(cls): - from django.contrib.sessions.backends.db import SessionStore - - return SessionStore - - class Meta(AbstractBaseSession.Meta): - db_table = "django_session" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sessions/serializers.py b/.venv/lib/python3.10/site-packages/django/contrib/sessions/serializers.py deleted file mode 100644 index 16a248c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sessions/serializers.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.core.signing import JSONSerializer as BaseJSONSerializer - -JSONSerializer = BaseJSONSerializer diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/__init__.py deleted file mode 100644 index dd21d88..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/__init__.py +++ /dev/null @@ -1,200 +0,0 @@ -from django.apps import apps as django_apps -from django.conf import settings -from django.core import paginator -from django.core.exceptions import ImproperlyConfigured -from django.utils import translation - - -class Sitemap: - # This limit is defined by Google. See the index documentation at - # https://www.sitemaps.org/protocol.html#index. - limit = 50000 - - # If protocol is None, the URLs in the sitemap will use the protocol - # with which the sitemap was requested. - protocol = None - - # Enables generating URLs for all languages. - i18n = False - - # Override list of languages to use. - languages = None - - # Enables generating alternate/hreflang links. - alternates = False - - # Add an alternate/hreflang link with value 'x-default'. - x_default = False - - def _get(self, name, item, default=None): - try: - attr = getattr(self, name) - except AttributeError: - return default - if callable(attr): - if self.i18n: - # Split the (item, lang_code) tuples again for the location, - # priority, lastmod and changefreq method calls. - item, lang_code = item - return attr(item) - return attr - - def get_languages_for_item(self, item): - """Languages for which this item is displayed.""" - return self._languages() - - def _languages(self): - if self.languages is not None: - return self.languages - return [lang_code for lang_code, _ in settings.LANGUAGES] - - def _items(self): - if self.i18n: - # Create (item, lang_code) tuples for all items and languages. - # This is necessary to paginate with all languages already considered. - items = [ - (item, lang_code) - for item in self.items() - for lang_code in self.get_languages_for_item(item) - ] - return items - return self.items() - - def _location(self, item, force_lang_code=None): - if self.i18n: - obj, lang_code = item - # Activate language from item-tuple or forced one before calling location. - with translation.override(force_lang_code or lang_code): - return self._get("location", item) - return self._get("location", item) - - @property - def paginator(self): - return paginator.Paginator(self._items(), self.limit) - - def items(self): - return [] - - def location(self, item): - return item.get_absolute_url() - - def get_protocol(self, protocol=None): - # Determine protocol - return self.protocol or protocol or "https" - - def get_domain(self, site=None): - # Determine domain - if site is None: - if django_apps.is_installed("django.contrib.sites"): - Site = django_apps.get_model("sites.Site") - try: - site = Site.objects.get_current() - except Site.DoesNotExist: - pass - if site is None: - raise ImproperlyConfigured( - "To use sitemaps, either enable the sites framework or pass " - "a Site/RequestSite object in your view." - ) - return site.domain - - def get_urls(self, page=1, site=None, protocol=None): - protocol = self.get_protocol(protocol) - domain = self.get_domain(site) - return self._urls(page, protocol, domain) - - def get_latest_lastmod(self): - if not hasattr(self, "lastmod"): - return None - if callable(self.lastmod): - try: - return max([self.lastmod(item) for item in self.items()], default=None) - except TypeError: - return None - else: - return self.lastmod - - def _urls(self, page, protocol, domain): - urls = [] - latest_lastmod = None - all_items_lastmod = True # track if all items have a lastmod - - paginator_page = self.paginator.page(page) - for item in paginator_page.object_list: - loc = f"{protocol}://{domain}{self._location(item)}" - priority = self._get("priority", item) - lastmod = self._get("lastmod", item) - - if all_items_lastmod: - all_items_lastmod = lastmod is not None - if all_items_lastmod and ( - latest_lastmod is None or lastmod > latest_lastmod - ): - latest_lastmod = lastmod - - url_info = { - "item": item, - "location": loc, - "lastmod": lastmod, - "changefreq": self._get("changefreq", item), - "priority": str(priority if priority is not None else ""), - "alternates": [], - } - - if self.i18n and self.alternates: - item_languages = self.get_languages_for_item(item[0]) - for lang_code in item_languages: - loc = f"{protocol}://{domain}{self._location(item, lang_code)}" - url_info["alternates"].append( - { - "location": loc, - "lang_code": lang_code, - } - ) - if self.x_default and settings.LANGUAGE_CODE in item_languages: - lang_code = settings.LANGUAGE_CODE - loc = f"{protocol}://{domain}{self._location(item, lang_code)}" - loc = loc.replace(f"/{lang_code}/", "/", 1) - url_info["alternates"].append( - { - "location": loc, - "lang_code": "x-default", - } - ) - - urls.append(url_info) - - if all_items_lastmod and latest_lastmod: - self.latest_lastmod = latest_lastmod - - return urls - - -class GenericSitemap(Sitemap): - priority = None - changefreq = None - - def __init__(self, info_dict, priority=None, changefreq=None, protocol=None): - self.queryset = info_dict["queryset"] - self.date_field = info_dict.get("date_field") - self.priority = self.priority or priority - self.changefreq = self.changefreq or changefreq - self.protocol = self.protocol or protocol - - def items(self): - # Make sure to return a clone; we don't want premature evaluation. - return self.queryset.filter() - - def lastmod(self, item): - if self.date_field is not None: - return getattr(item, self.date_field) - return None - - def get_latest_lastmod(self): - if self.date_field is not None: - return ( - self.queryset.order_by("-" + self.date_field) - .values_list(self.date_field, flat=True) - .first() - ) - return None diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/apps.py deleted file mode 100644 index 70c200c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/apps.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.apps import AppConfig -from django.utils.translation import gettext_lazy as _ - - -class SiteMapsConfig(AppConfig): - default_auto_field = "django.db.models.AutoField" - name = "django.contrib.sitemaps" - verbose_name = _("Site Maps") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/templates/sitemap.xml b/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/templates/sitemap.xml deleted file mode 100644 index 67b166a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/templates/sitemap.xml +++ /dev/null @@ -1,16 +0,0 @@ - - -{% spaceless %} -{% for url in urlset %} - - {{ url.location }} - {% if url.lastmod %}{{ url.lastmod|date:"Y-m-d" }}{% endif %} - {% if url.changefreq %}{{ url.changefreq }}{% endif %} - {% if url.priority %}{{ url.priority }}{% endif %} - {% for alternate in url.alternates %} - - {% endfor %} - -{% endfor %} -{% endspaceless %} - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/templates/sitemap_index.xml b/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/templates/sitemap_index.xml deleted file mode 100644 index b7abd12..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/templates/sitemap_index.xml +++ /dev/null @@ -1,13 +0,0 @@ - - -{% spaceless %} -{% for site in sitemaps %} - - {{ site.location }} - {% if site.last_mod %} - {{ site.last_mod|date:"c" }} - {% endif %} - -{% endfor %} -{% endspaceless %} - diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/views.py b/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/views.py deleted file mode 100644 index 166563b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sitemaps/views.py +++ /dev/null @@ -1,140 +0,0 @@ -import datetime -from dataclasses import dataclass -from functools import wraps - -from django.contrib.sites.shortcuts import get_current_site -from django.core.paginator import EmptyPage, PageNotAnInteger -from django.http import Http404 -from django.template.response import TemplateResponse -from django.urls import reverse -from django.utils import timezone -from django.utils.http import http_date - - -@dataclass -class SitemapIndexItem: - location: str - last_mod: bool = None - - -def x_robots_tag(func): - @wraps(func) - def inner(request, *args, **kwargs): - response = func(request, *args, **kwargs) - response.headers["X-Robots-Tag"] = "noindex, noodp, noarchive" - return response - - return inner - - -def _get_latest_lastmod(current_lastmod, new_lastmod): - """ - Returns the latest `lastmod` where `lastmod` can be either a date or a - datetime. - """ - if not isinstance(new_lastmod, datetime.datetime): - new_lastmod = datetime.datetime.combine(new_lastmod, datetime.time.min) - if timezone.is_naive(new_lastmod): - new_lastmod = timezone.make_aware(new_lastmod, datetime.timezone.utc) - return new_lastmod if current_lastmod is None else max(current_lastmod, new_lastmod) - - -@x_robots_tag -def index( - request, - sitemaps, - template_name="sitemap_index.xml", - content_type="application/xml", - sitemap_url_name="django.contrib.sitemaps.views.sitemap", -): - req_protocol = request.scheme - req_site = get_current_site(request) - - sites = [] # all sections' sitemap URLs - all_indexes_lastmod = True - latest_lastmod = None - for section, site in sitemaps.items(): - # For each section label, add links of all pages of its sitemap - # (usually generated by the `sitemap` view). - if callable(site): - site = site() - protocol = req_protocol if site.protocol is None else site.protocol - sitemap_url = reverse(sitemap_url_name, kwargs={"section": section}) - absolute_url = "%s://%s%s" % (protocol, req_site.domain, sitemap_url) - site_lastmod = site.get_latest_lastmod() - if all_indexes_lastmod: - if site_lastmod is not None: - latest_lastmod = _get_latest_lastmod(latest_lastmod, site_lastmod) - else: - all_indexes_lastmod = False - sites.append(SitemapIndexItem(absolute_url, site_lastmod)) - # Add links to all pages of the sitemap. - for page in range(2, site.paginator.num_pages + 1): - sites.append( - SitemapIndexItem("%s?p=%s" % (absolute_url, page), site_lastmod) - ) - # If lastmod is defined for all sites, set header so as - # ConditionalGetMiddleware is able to send 304 NOT MODIFIED - if all_indexes_lastmod and latest_lastmod: - headers = {"Last-Modified": http_date(latest_lastmod.timestamp())} - else: - headers = None - return TemplateResponse( - request, - template_name, - {"sitemaps": sites}, - content_type=content_type, - headers=headers, - ) - - -@x_robots_tag -def sitemap( - request, - sitemaps, - section=None, - template_name="sitemap.xml", - content_type="application/xml", -): - req_protocol = request.scheme - req_site = get_current_site(request) - - if section is not None: - if section not in sitemaps: - raise Http404("No sitemap available for section: %r" % section) - maps = [sitemaps[section]] - else: - maps = sitemaps.values() - page = request.GET.get("p", 1) - - lastmod = None - all_sites_lastmod = True - urls = [] - for site in maps: - try: - if callable(site): - site = site() - urls.extend(site.get_urls(page=page, site=req_site, protocol=req_protocol)) - if all_sites_lastmod: - site_lastmod = getattr(site, "latest_lastmod", None) - if site_lastmod is not None: - lastmod = _get_latest_lastmod(lastmod, site_lastmod) - else: - all_sites_lastmod = False - except EmptyPage: - raise Http404("Page %s empty" % page) - except PageNotAnInteger: - raise Http404("No page '%s'" % page) - # If lastmod is defined for all sites, set header so as - # ConditionalGetMiddleware is able to send 304 NOT MODIFIED - if all_sites_lastmod: - headers = {"Last-Modified": http_date(lastmod.timestamp())} if lastmod else None - else: - headers = None - return TemplateResponse( - request, - template_name, - {"urlset": urls}, - content_type=content_type, - headers=headers, - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/admin.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/admin.py deleted file mode 100644 index 53ad53d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/admin.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.contrib import admin -from django.contrib.sites.models import Site - - -@admin.register(Site) -class SiteAdmin(admin.ModelAdmin): - list_display = ("domain", "name") - search_fields = ("domain", "name") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/apps.py deleted file mode 100644 index ac51a84..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/apps.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.apps import AppConfig -from django.contrib.sites.checks import check_site_id -from django.core import checks -from django.db.models.signals import post_migrate -from django.utils.translation import gettext_lazy as _ - -from .management import create_default_site - - -class SitesConfig(AppConfig): - default_auto_field = "django.db.models.AutoField" - name = "django.contrib.sites" - verbose_name = _("Sites") - - def ready(self): - post_migrate.connect(create_default_site, sender=self) - checks.register(check_site_id, checks.Tags.sites) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/checks.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/checks.py deleted file mode 100644 index 66e8551..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/checks.py +++ /dev/null @@ -1,14 +0,0 @@ -from types import NoneType - -from django.conf import settings -from django.core.checks import Error - - -def check_site_id(app_configs, **kwargs): - if hasattr(settings, "SITE_ID") and not isinstance( - settings.SITE_ID, (NoneType, int) - ): - return [ - Error("The SITE_ID setting must be an integer", id="sites.E101"), - ] - return [] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/af/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index d613267..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/af/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index e4742e2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-01-04 18:46+0000\n" -"Last-Translator: F Wolff \n" -"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Werwe" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Die domeinnaam mag nie spasies of tab-karakters bevat nie." - -msgid "domain name" -msgstr "domeinnaam" - -msgid "display name" -msgstr "vertoonnaam" - -msgid "site" -msgstr "werf" - -msgid "sites" -msgstr "werwe" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index bc0ef77..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index f04d717..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2014 -# Eyad Toma , 2013 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Sites" -msgstr "المواقع" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "اسم النطاق يجب أن لا يحتوي على فراغات أو فراغات طويلة tabs." - -msgid "domain name" -msgstr "اسم النطاق" - -msgid "display name" -msgstr "اسم العرض" - -msgid "site" -msgstr "موقع" - -msgid "sites" -msgstr "المواقع" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar_DZ/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index 35e42fa..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar_DZ/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index 815f973..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Riterix , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-12-14 22:52+0000\n" -"Last-Translator: Riterix \n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgid "Sites" -msgstr "المواقع" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "اسم النطاق يجب أن لا يحتوي على فراغات أو فراغات طويلة tabs." - -msgid "domain name" -msgstr "اسم النطاق" - -msgid "display name" -msgstr "اسم العرض" - -msgid "site" -msgstr "موقع" - -msgid "sites" -msgstr "المواقع" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ast/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index 0f14b98..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ast/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index 4fff0b4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 19:51+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "El nome de dominiu nun pue contener dengún espaciu o tabulación." - -msgid "domain name" -msgstr "nome de dominiu" - -msgid "display name" -msgstr "amosar nome" - -msgid "site" -msgstr "sitiu" - -msgid "sites" -msgstr "sitios" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 0ec03f9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index cd3d29b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Ismayilov , 2011 -# Emin Mastizada , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-04-27 17:01+0000\n" -"Last-Translator: Emin Mastizada \n" -"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Saytlar" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domen adında boşluq və tab boşluğu olmamalıdır." - -msgid "domain name" -msgstr "domen" - -msgid "display name" -msgstr "adı" - -msgid "site" -msgstr "sayt" - -msgid "sites" -msgstr "saytlar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/be/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index ec75cef..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/be/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index 8b44db3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Viktar Palstsiuk \n" -"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Sites" -msgstr "Сайты" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Даменнае імя ня можа ўтрымліваць прабелы або сымбалі табуляцыі." - -msgid "domain name" -msgstr "назва дамэна" - -msgid "display name" -msgstr "бачная назва" - -msgid "site" -msgstr "сайт" - -msgid "sites" -msgstr "сайты" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index b337e3d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index 4ebb4ba..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Lyuboslav Petrov , 2014 -# vestimir , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Сайтове" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Името на домейна не може да съдържа никакви интервали или табулации." - -msgid "domain name" -msgstr "име на домейна" - -msgid "display name" -msgstr "наименование" - -msgid "site" -msgstr "сайт" - -msgid "sites" -msgstr "сайтове" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index 11265f6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index 2325fe3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Tahmid Rafi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Tahmid Rafi \n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "সাইট" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "ডোমেইন নাম এ কোন স্পেস বা ট্যাব থাকতে পারবে না।" - -msgid "domain name" -msgstr "ডোমেইন নাম" - -msgid "display name" -msgstr "ডিসপ্লে নাম" - -msgid "site" -msgstr "সাইট" - -msgid "sites" -msgstr "সাইটসমূহ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/br/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index e8547ba..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/br/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index 4294e2b..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,40 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fulup , 2012 -# Irriep Nala Novram , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-10-19 23:07+0000\n" -"Last-Translator: Irriep Nala Novram \n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -msgid "Sites" -msgstr "Lec'hiennoù" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "An anv domani n'hall na enderc'hel spasoù pe taolennadurioù." - -msgid "domain name" -msgstr "anv domani" - -msgid "display name" -msgstr "anv da ziskouez" - -msgid "site" -msgstr "lec'hienn" - -msgid "sites" -msgstr "lec'hiennoù" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index 1b76e2f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index 7a10cea..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "ime domena" - -msgid "display name" -msgstr "prikazano ime" - -msgid "site" -msgstr "sajt" - -msgid "sites" -msgstr "sajtovi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ca/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 36107e0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ca/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index 22f2c13..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2013 -# Carles Barrobés , 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Llocs" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "El nom de domini no pot contenir cap espai ni tabuladors." - -msgid "domain name" -msgstr "nom del domini" - -msgid "display name" -msgstr "nom per mostrar" - -msgid "site" -msgstr "lloc" - -msgid "sites" -msgstr "llocs" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ckb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index 9ae5e76..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ckb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index aeaca57..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# kosar tofiq , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2023-04-24 18:05+0000\n" -"Last-Translator: kosar tofiq , 2020\n" -"Language-Team: Central Kurdish (http://www.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "ماڵپەڕەکان" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "ناوی دۆمەین نابێت بۆشایی یان تابی تێدابێت." - -msgid "domain name" -msgstr "ناوی دۆمەین" - -msgid "display name" -msgstr "ناوی پیشاندان" - -msgid "site" -msgstr "ماڵپەڕ" - -msgid "sites" -msgstr "ماڵپەڕەکان" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cs/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index 26ea691..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cs/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index 3fb2c3a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vláďa Macek , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -msgid "Sites" -msgstr "Weby" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Název domény nemůže obsahovat mezery ani tabulátory." - -msgid "domain name" -msgstr "název domény" - -msgid "display name" -msgstr "zobrazený název" - -msgid "site" -msgstr "web" - -msgid "sites" -msgstr "weby" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index d4b4ecd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index 5e37db2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Maredudd ap Gwyndaf \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -msgid "Sites" -msgstr "Safleoedd" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Ni all yr enw parth gynnwys bylchau neu dabiau." - -msgid "domain name" -msgstr "enw parth" - -msgid "display name" -msgstr "enw arddangos" - -msgid "site" -msgstr "safle" - -msgid "sites" -msgstr "safleoedd" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/da/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index 2380ff3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/da/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index 7626119..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Erik Wognsen , 2013-2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Websider" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domænenavnet må ikke indeholde mellemrum eller tabulatorer." - -msgid "domain name" -msgstr "domænenavn" - -msgid "display name" -msgstr "vist navn" - -msgid "site" -msgstr "webside" - -msgid "sites" -msgstr "websider" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/de/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index 74e1685..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/de/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 6029124..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011,2013-2014,2016 -# Markus Holtermann , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Websites" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Der Domainname darf keine Leerzeichen oder Tabs enthalten." - -msgid "domain name" -msgstr "Domainname" - -msgid "display name" -msgstr "Anzeigename" - -msgid "site" -msgstr "Website" - -msgid "sites" -msgstr "Websites" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/dsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index 8179a5c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/dsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index b8706de..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 00:02+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Sites" -msgstr "Sedła" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domenowe mě njamóžo prozne znamjenja abo tabulatory wopśimowaś." - -msgid "domain name" -msgstr "domenowe mě" - -msgid "display name" -msgstr "zwobraznjeńske mě" - -msgid "site" -msgstr "sedło" - -msgid "sites" -msgstr "sedła" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/el/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index 10479c1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/el/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index 94d8e19..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Nikolas Demiridis , 2014 -# Pãnoș , 2014 -# Pãnoș , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Pãnoș \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Ιστότοποι" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Το όνομα τομέα δεν μπορεί να περιέχει κενά." - -msgid "domain name" -msgstr "όνομα τομέα" - -msgid "display name" -msgstr "εμφανιζόμενο όνομα" - -msgid "site" -msgstr "ιστότοπος" - -msgid "sites" -msgstr "ιστότοποι" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 08a7b68..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index 3b1884c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: contrib/sites/apps.py:11 -msgid "Sites" -msgstr "" - -#: contrib/sites/models.py:30 -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -#: contrib/sites/models.py:81 -msgid "domain name" -msgstr "" - -#: contrib/sites/models.py:83 -msgid "display name" -msgstr "" - -#: contrib/sites/models.py:88 -msgid "site" -msgstr "" - -#: contrib/sites/models.py:89 -msgid "sites" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_AU/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index e6e4917..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_AU/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index 0659ec5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2021-04-11 13:15+0000\n" -"Last-Translator: Tom Fifield \n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sites" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "The domain name cannot contain any spaces or tabs." - -msgid "domain name" -msgstr "domain name" - -msgid "display name" -msgstr "display name" - -msgid "site" -msgstr "site" - -msgid "sites" -msgstr "sites" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_GB/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index 772da82..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_GB/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index b212e34..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ross Poulton , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "domain name" - -msgid "display name" -msgstr "display name" - -msgid "site" -msgstr "site" - -msgid "sites" -msgstr "sites" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eo/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index 23a4700..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eo/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index a65e597..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Baptiste Darthenay , 2013 -# Baptiste Darthenay , 2014 -# kristjan , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Retejoj" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Tiu domajna nomo ne povas enteni nek spacojn nek tabojn." - -msgid "domain name" -msgstr "domajna nomo" - -msgid "display name" -msgstr "vidiga nomo" - -msgid "site" -msgstr "retejo" - -msgid "sites" -msgstr "retejoj" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 8e3f12b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 89fbdbc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# abraham.martin , 2014 -# Antoni Aloy , 2013 -# Ernesto Avilés Vázquez , 2014 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (http://www.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sitios" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "El nombre de dominio no puede contener espacios ni tabulaciones" - -msgid "domain name" -msgstr "nombre de dominio" - -msgid "display name" -msgstr "nombre a mostrar" - -msgid "site" -msgstr "sitio" - -msgid "sites" -msgstr "sitios" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_AR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index cc88304..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_AR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 2ea4307..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ramiro Morales, 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sitios" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" -"El nombre de dominio no puede incluir espacios ni marcas de tabulación." - -msgid "domain name" -msgstr "nombre de dominio" - -msgid "display name" -msgstr "nombre para visualizar" - -msgid "site" -msgstr "sitio" - -msgid "sites" -msgstr "sitios" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index 1fff5d9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index 9344265..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Carlos Muñoz , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 21:51+0000\n" -"Last-Translator: Carlos Muñoz \n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sitios" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "El nombre de dominio no puede contener espacios y/o tabulaciones" - -msgid "domain name" -msgstr "nombre de dominio" - -msgid "display name" -msgstr "nombre a mostrar" - -msgid "site" -msgstr "sitio" - -msgid "sites" -msgstr "sitios" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_MX/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index 02a2e53..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_MX/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index 29d4401..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abraham Estrada, 2011 -# Carlos Castro , 2011 -# zodman , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: zodman \n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sitios" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "El nombre de dominio no puede contener espacios o tabulaciones." - -msgid "domain name" -msgstr "nombre del dominio" - -msgid "display name" -msgstr "nombre visible" - -msgid "site" -msgstr "sitio" - -msgid "sites" -msgstr "sitios" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_VE/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index 32f6e8f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_VE/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index a6b74fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/" -"django/language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "" - -msgid "display name" -msgstr "" - -msgid "site" -msgstr "" - -msgid "sites" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index 3e3e38a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index 91ef8f3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Janno Liivak , 2013 -# Marti Raudsepp , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Estonian (http://www.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Saidid" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domeeni nimes ei tohi olla ei tühikuid ega tabeldusmärke." - -msgid "domain name" -msgstr "domeeninimi" - -msgid "display name" -msgstr "hüüdnimi" - -msgid "site" -msgstr "sait" - -msgid "sites" -msgstr "saidid" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index ca7a350..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index d7d4138..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ander Martínez , 2013 -# Eneko Illarramendi , 2017 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Eneko Illarramendi \n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Webguneak" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domeinu izenak ezin du zuriunerik edo tabuladorerik eduki." - -msgid "domain name" -msgstr "domeinu-izena" - -msgid "display name" -msgstr "erakusteko izena" - -msgid "site" -msgstr "webgunea" - -msgid "sites" -msgstr "webguneak" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index 7bc004f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index ba91492..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Mohammad Hossein Mojtahedi , 2013 -# Reza Mohammadi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Sites" -msgstr "وب‌گاه‌ها" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "نام دامنه نمی‌تواند حاوی فاصله یا پرش -tab- باشد." - -msgid "domain name" -msgstr "نام دامنه" - -msgid "display name" -msgstr "نام نمایش داده شده" - -msgid "site" -msgstr "وب‌گاه" - -msgid "sites" -msgstr "وب‌گاه‌ها" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index 65ba6a0..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index 13c88ce..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Aarni Koskela\n" -"Language-Team: Finnish (http://www.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sivustot" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Verkkotunnus ei voi sisältää välilyöntejä tai sarkainmerkkejä." - -msgid "domain name" -msgstr "verkkotunnus" - -msgid "display name" -msgstr "näyttönimi" - -msgid "site" -msgstr "sivusto" - -msgid "sites" -msgstr "sivustot" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 54df18d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index 26f86dc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2014 -# Claude Paroz , 2013 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Sites" -msgstr "Sites" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Le nom de domaine ne peut pas contenir d'espace ni de tabulation." - -msgid "domain name" -msgstr "nom de domaine" - -msgid "display name" -msgstr "nom à afficher" - -msgid "site" -msgstr "site" - -msgid "sites" -msgstr "sites" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index 489bbab..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index 599ab98..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "" - -msgid "display name" -msgstr "" - -msgid "site" -msgstr "" - -msgid "sites" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ga/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index b828e40..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ga/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index 2b1c9bf..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Jannis Leidel , 2011 -# Luke Blaney , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2024-10-07 18:05+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -msgid "Sites" -msgstr "Suíomhanna" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Ní féidir spásanna ná cluaisíní ar bith a bheith san ainm fearainn." - -msgid "domain name" -msgstr "ainm fearainn" - -msgid "display name" -msgstr "ainm taispeáinta" - -msgid "site" -msgstr "suíomh" - -msgid "sites" -msgstr "suíomhanna" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gd/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index 726462c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gd/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index 6426918..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-22 17:29+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -msgid "Sites" -msgstr "Làraichean" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Chan fhaod beàrnan no tabaichean a bhith ann an ainm àrainne." - -msgid "domain name" -msgstr "ainm àrainne" - -msgid "display name" -msgstr "ainm taisbeanaidh" - -msgid "site" -msgstr "làrach" - -msgid "sites" -msgstr "làraichean" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index a820edd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index ddf5436..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Leandro Regueiro , 2013 -# X Bello , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2023-04-24 18:05+0000\n" -"Last-Translator: X Bello , 2023\n" -"Language-Team: Galician (http://www.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sitios" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "O dominio non pode conter espazos nin tabulacións." - -msgid "domain name" -msgstr "dominio" - -msgid "display name" -msgstr "nome" - -msgid "site" -msgstr "sitio" - -msgid "sites" -msgstr "sitios" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/he/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index 3cdf5dc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/he/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index 62de695..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Meir Kriheli , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -msgid "Sites" -msgstr "אתרים" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "שם המתחם אינו יכול להכיל רווחים או טאבים." - -msgid "domain name" -msgstr "שם מתחם" - -msgid "display name" -msgstr "שם לתצוגה" - -msgid "site" -msgstr "אתר" - -msgid "sites" -msgstr "אתרים" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index 699024a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index 437c402..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "डोमेन नाम" - -msgid "display name" -msgstr "प्रदर्शन नाम" - -msgid "site" -msgstr "साइट" - -msgid "sites" -msgstr "साइट" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index 90773e6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index cd6a0dd..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Mislav Cimperšak \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgid "Sites" -msgstr "Stranice" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Naziv domene ne može sadržavati razmake ili tabove." - -msgid "domain name" -msgstr "ime domene" - -msgid "display name" -msgstr "ime za prikaz" - -msgid "site" -msgstr "stranica" - -msgid "sites" -msgstr "stranice" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index a6fc772..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index 5ef2659..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 00:02+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Sites" -msgstr "Sydła" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domenowe mjeno njemóže mjezoty abo tabulatory wobsahować." - -msgid "domain name" -msgstr "domenowe mjeno" - -msgid "display name" -msgstr "zwobraznjenske mjeno" - -msgid "site" -msgstr "sydło" - -msgid "sites" -msgstr "sydła" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hu/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index bb2a102..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hu/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index 6a511f9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# András Veres-Szentkirályi, 2016 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: János R (Hangya)\n" -"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Honlapok" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "A domainnév nem tartalmazhat szóközöket és tabulátorokat." - -msgid "domain name" -msgstr "tartománynév" - -msgid "display name" -msgstr "megjelenítendő név" - -msgid "site" -msgstr "honlap" - -msgid "sites" -msgstr "honlapok" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hy/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index 17c2ef3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hy/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index adede4d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Սմբատ Պետրոսյան , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 21:51+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Կայքեր" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Տիրույթի անվանում դաշտը չի կարող պարունակել բացատներ կամ թաբեր" - -msgid "domain name" -msgstr "Տիրույթի անվանում" - -msgid "display name" -msgstr "Ցուցադրվող անունը" - -msgid "site" -msgstr "կայք" - -msgid "sites" -msgstr "կայքեր" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ia/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index d1251a1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ia/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index b777ce6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 21:51+0000\n" -"Last-Translator: Martijn Dekker \n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sitos" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Le nomine de dominio non pote continer spatios o tabulationes." - -msgid "domain name" -msgstr "nomine de dominio" - -msgid "display name" -msgstr "nomine a monstrar" - -msgid "site" -msgstr "sito" - -msgid "sites" -msgstr "sitos" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/id/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index 5b6b923..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/id/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index 40228ed..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# M Asep Indrayana , 2015 -# rodin , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: rodin \n" -"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "Situs" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Nama domain tidak dapat mengandung karakter spasi atau tab." - -msgid "domain name" -msgstr "nama domain" - -msgid "display name" -msgstr "nama yang ditampilkan" - -msgid "site" -msgstr "situs" - -msgid "sites" -msgstr "situs" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/io/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index e22612f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/io/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index 3669499..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viko Bartero , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-20 01:58+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "La domeno nomo ne povas kontenar spaci, nek tab-signi." - -msgid "domain name" -msgstr "domeno nomo" - -msgid "display name" -msgstr "montrita nomo" - -msgid "site" -msgstr "ret-situo" - -msgid "sites" -msgstr "ret-situi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/is/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index cbfa0fc..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/is/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index 201b4c0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Thordur Sigurdsson , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Thordur Sigurdsson \n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -msgid "Sites" -msgstr "Vefir" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Lénið má ekki innihalda bil eða dálkastafi (tab characters)." - -msgid "domain name" -msgstr "lén" - -msgid "display name" -msgstr "birtingarnafn" - -msgid "site" -msgstr "vefur" - -msgid "sites" -msgstr "vefir" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/it/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index a370612..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/it/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index 49adfaf..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Marco Bonetti, 2014 -# Nicola Larosa , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Stefano Brentegani \n" -"Language-Team: Italian (http://www.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Siti" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Il nome di dominio non può contenere spazi né tab." - -msgid "domain name" -msgstr "nome di dominio" - -msgid "display name" -msgstr "nome visualizzato" - -msgid "site" -msgstr "sito" - -msgid "sites" -msgstr "siti" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ja/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index 6670c45..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ja/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index 335a1d7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Shinya Okano , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Japanese (http://www.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "サイト" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "ドメイン名にスペース、タブを含めることはできません。" - -msgid "domain name" -msgstr "ドメイン名" - -msgid "display name" -msgstr "表示名" - -msgid "site" -msgstr "サイト" - -msgid "sites" -msgstr "サイト" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ka/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index c7eb889..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ka/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index 5d05019..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2015 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: André Bouatchidzé \n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Sites" -msgstr "საიტები" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "დომენის სახელი არ შეიძლება შეიცავდეს ჰარებს ან ტაბულაციებს." - -msgid "domain name" -msgstr "დომენის სახელი" - -msgid "display name" -msgstr "საჩვენებელი სახელი" - -msgid "site" -msgstr "საიტი" - -msgid "sites" -msgstr "საიტები" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kab/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kab/LC_MESSAGES/django.mo deleted file mode 100644 index 3571d0d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kab/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kab/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kab/LC_MESSAGES/django.po deleted file mode 100644 index db4aa28..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kab/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-10-06 11:44+0000\n" -"Last-Translator: Muḥend Belqasem \n" -"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" -"kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Ismal" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Isem n taɣult ur izmir ara ad yegber isekkilen ilmawen n tirigliwin." - -msgid "domain name" -msgstr "isem n taɣult" - -msgid "display name" -msgstr "mefffer isem" - -msgid "site" -msgstr "asmel" - -msgid "sites" -msgstr "ismal" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index edfaf6d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index 23c0f00..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Leo Trubach , 2017 -# yun_man_ger , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Leo Trubach \n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Sites" -msgstr "Сайттар" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Домен атауының ішінде аралық және табуляция белілерге тыйым салынады" - -msgid "domain name" -msgstr "домен атауы" - -msgid "display name" -msgstr "бейнелеу атауы" - -msgid "site" -msgstr "сайт" - -msgid "sites" -msgstr "сайттар" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/km/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index bb7aa00..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/km/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index a039e77..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "ឈ្មោះដមែន" - -msgid "display name" -msgstr "ឈ្មោះសំរាប់បង្ហាញ" - -msgid "site" -msgstr "គេហទំព័រ" - -msgid "sites" -msgstr "គេហទំព័រ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index 0d41465..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index 8ff543a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Rohith PR, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2021-08-03 10:54+0000\n" -"Last-Translator: Rohith PR\n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Sites" -msgstr "ತಾಣಗಳು" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "ಡೊಮೈನ್ ಹೆಸರು" - -msgid "display name" -msgstr "ತೋರಿಸುವ ಹೆಸರು" - -msgid "site" -msgstr "ತಾಣ" - -msgid "sites" -msgstr "ತಾಣಗಳು" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ko/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index 6cd4146..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ko/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index fcf8adc..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jiyoon, Ha , 2016 -# Hyeonho Kang, 2024 -# Jannis Leidel , 2011 -# Le Tartuffe , 2014 -# JunGu Kang , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2024-10-07 18:05+0000\n" -"Last-Translator: Hyeonho Kang, 2024\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "사이트" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "도메인 이름은 공백이나 탭을 포함할 수 없습니다." - -msgid "domain name" -msgstr "도메인명" - -msgid "display name" -msgstr "표시명" - -msgid "site" -msgstr "사이트" - -msgid "sites" -msgstr "사이트들" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ky/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index 7bb9164..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ky/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index e38cf65..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,34 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2020-05-23 06:09+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "Сайттар" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "домен аты боштук жана секирик камтый албайт." - -msgid "domain name" -msgstr "домен аты" - -msgid "display name" -msgstr "көрүнүү аты" - -msgid "site" -msgstr "сайт" - -msgid "sites" -msgstr "сайттар" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index 5b7937f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index 9e43bb9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "" - -msgid "display name" -msgstr "" - -msgid "site" -msgstr "" - -msgid "sites" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index 8cdaf71..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index afcb5ac..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kostas , 2011 -# Matas Dailyda , 2015 -# Simonas Kazlauskas , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Matas Dailyda \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Sites" -msgstr "Tinklalapiai" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domene negali būti tarpų ar tabuliavimo ženklų." - -msgid "domain name" -msgstr "domeno vardas" - -msgid "display name" -msgstr "rodomas vardas" - -msgid "site" -msgstr "tinklalapis" - -msgid "sites" -msgstr "tinklalapiai" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index a3ffa5f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index 65fceb0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# edgars , 2011 -# Jannis Leidel , 2011 -# peterisb , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: peterisb \n" -"Language-Team: Latvian (http://www.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -msgid "Sites" -msgstr "Vietnes" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domēna nosaukumā nevar būt tukšumi vai tabulatori." - -msgid "domain name" -msgstr "domēna vārds" - -msgid "display name" -msgstr "attēlojamais vārds" - -msgid "site" -msgstr "vietne" - -msgid "sites" -msgstr "vietnes" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index 15763b6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index ad7a47d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vasil Vangelovski , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgid "Sites" -msgstr "Сајтови" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Домејнот не може да содржи празни места и табови." - -msgid "domain name" -msgstr "домејн" - -msgid "display name" -msgstr "име за приказ" - -msgid "site" -msgstr "сајт" - -msgid "sites" -msgstr "сајтови" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ml/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index d1d7170..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ml/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index 3e70265..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Hrishikesh , 2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-03-03 09:57+0000\n" -"Last-Translator: Hrishikesh \n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "സൈറ്റുകൾ" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "ഡൊമൈനിന്റെ പേരിൽ സ്പെയ്സുകളോ ടാബുകളോ അനുവദനീയമല്ല." - -msgid "domain name" -msgstr "ഡൊമൈനിന്റെ പേര്" - -msgid "display name" -msgstr "കാഴ്ചയ്ക്കായുള്ള പേര്" - -msgid "site" -msgstr "സൈറ്റ്" - -msgid "sites" -msgstr "സൈറ്റുകള്‍" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index 6b1748b..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 1ab16b7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bayarbat.U , 2015 -# Jannis Leidel , 2011 -# Zorig , 2014 -# Анхбаяр Анхаа , 2011,2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Bayarbat.U \n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Вэб сайтууд" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Домэйн нэрэнд таб болон хоосон зай бичиж болохгүй." - -msgid "domain name" -msgstr "домэйн нэр" - -msgid "display name" -msgstr "харагдах нэр" - -msgid "site" -msgstr "сайт" - -msgid "sites" -msgstr "сайтууд" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index 40f1412..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index 3e041c1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Omkar Parab, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2024-01-24 18:05+0000\n" -"Last-Translator: Omkar Parab, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "स्थळे" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "डोमेन नावामध्ये कोणताही स्पेस किंवा टॅब असू शकत नाहीत." - -msgid "domain name" -msgstr "डोमेनचे नाव" - -msgid "display name" -msgstr "प्रदर्शन नाव" - -msgid "site" -msgstr "स्थळ" - -msgid "sites" -msgstr "स्थळे" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ms/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index 57289a7..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ms/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index 250a2da..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2021-11-16 12:40+0000\n" -"Last-Translator: Jafry Hisham\n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "Laman-laman" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Nama domain tidak boleh mengandungi ruang kosong atau tab." - -msgid "domain name" -msgstr "nama domain" - -msgid "display name" -msgstr "nama paparan" - -msgid "site" -msgstr "laman" - -msgid "sites" -msgstr "laman-laman" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/my/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index e706a9d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/my/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index 4d75d5c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2013,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:50+0000\n" -"Last-Translator: Yhal Htet Aung \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "ဆိုက်များ" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "ဒိုမိန်းနာမည်တွင်ကွက်လပ်(သို့)အမည်များမပါဝင်နိုင်။" - -msgid "domain name" -msgstr "ဒိုမိန်းနာမည်" - -msgid "display name" -msgstr "ပြသနာမည်" - -msgid "site" -msgstr "ဆိုက်" - -msgid "sites" -msgstr "ဆိုက်များ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nb/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index b18fe64..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nb/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index 281b517..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Alexander Hansen , 2013 -# Jannis Leidel , 2011 -# Jon , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Nettsteder" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domenenavnet kan ikke inneholde mellomrom." - -msgid "domain name" -msgstr "domenenavn" - -msgid "display name" -msgstr "visningsnavn" - -msgid "site" -msgstr "nettsted" - -msgid "sites" -msgstr "nettsteder" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ne/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index 8ece467..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ne/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index c0d04d1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Sagar Chalise , 2011 -# Santosh Purbey , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2020-01-21 09:32+0000\n" -"Last-Translator: Santosh Purbey \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "साइटहरु" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "डोमेनमा खाली ठाउँहरु हुनु हुँदैन ।" - -msgid "domain name" -msgstr "डोमेनको नाम" - -msgid "display name" -msgstr "देखिने नाम" - -msgid "site" -msgstr "साईट" - -msgid "sites" -msgstr "साईटहरू" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index 1f62384..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index 073ed78..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bouke Haarsma , 2013 -# Jannis Leidel , 2011 -# Sander Steffann , 2015 -# Tonnes , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-02-24 16:01+0000\n" -"Last-Translator: Tonnes \n" -"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Websites" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "De domeinnaam mag geen spaties of tabs bevatten." - -msgid "domain name" -msgstr "domeinnaam" - -msgid "display name" -msgstr "weergavenaam" - -msgid "site" -msgstr "website" - -msgid "sites" -msgstr "websites" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index 9f44459..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index 22e6ec6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Sivert Olstad, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2021-11-11 00:23+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Nettstader" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domenenamnet kan ikkje innehalde mellomrom." - -msgid "domain name" -msgstr "domenenamn" - -msgid "display name" -msgstr "visingsnamn" - -msgid "site" -msgstr "nettstad" - -msgid "sites" -msgstr "nettstader" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/os/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index 6dbbccd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/os/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index f0bcd2a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:58+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Домены номы ма хъуамӕ уой табтӕ ӕмӕ хъӕнтӕ." - -msgid "domain name" -msgstr "домены ном" - -msgid "display name" -msgstr "ӕвдисгӕ ном" - -msgid "site" -msgstr "сайт" - -msgid "sites" -msgstr "сайттӕ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pa/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index 2d6701f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pa/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index 0d685d4..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "ਡੋਮੇਨ ਨਾਂ" - -msgid "display name" -msgstr "ਵੇਖਾਉਣ ਲਈ ਨਾਂ" - -msgid "site" -msgstr "ਸਾਈਟ" - -msgid "sites" -msgstr "ਸਾਈਟਾਂ" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index b0339c9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index ca0cdf3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,40 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# angularcircle, 2013 -# Jannis Leidel , 2011 -# Mattia Procopio , 2014 -# Tomasz Kajtoch , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Tomasz Kajtoch \n" -"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" -"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" -"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -msgid "Sites" -msgstr "Strony" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Nazwa domeny nie może zawierać spacji ani tabulatorów." - -msgid "domain name" -msgstr "nazwa domeny" - -msgid "display name" -msgstr "nazwa wyświetlana" - -msgid "site" -msgstr "strona" - -msgid "sites" -msgstr "strony" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index 5d885d1..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index ba716ae..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Nuno Mariz , 2013 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sites" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "O nome do domínio não pode conter espaços ou tabulações." - -msgid "domain name" -msgstr "nome do domínio" - -msgid "display name" -msgstr "mostrar nome" - -msgid "site" -msgstr "site" - -msgid "sites" -msgstr "sites" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index 81c6300..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index e146026..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# Eduardo Cereto Carvalho, 2013 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: andrewsmedina \n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Sites" -msgstr "Sites" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "O nome do domínio não pode conter espaços ou tabulações." - -msgid "domain name" -msgstr "nome do domínio" - -msgid "display name" -msgstr "nome para exibição" - -msgid "site" -msgstr "site" - -msgid "sites" -msgstr "sites" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ro/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index 7ebbf59..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ro/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index d5579e3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,40 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Daniel Ursache-Dogariu, 2011 -# Denis Darii , 2014 -# Jannis Leidel , 2011 -# Razvan Stefanescu , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Razvan Stefanescu \n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -msgid "Sites" -msgstr "Pagini web" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Numele de domeniu nu poate conține spații sau tab-uri." - -msgid "domain name" -msgstr "nume domeniu" - -msgid "display name" -msgstr "nume afișat" - -msgid "site" -msgstr "pagină web" - -msgid "sites" -msgstr "pagini web" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ru/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index cd6daf4..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ru/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index 353ed76..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eugene MechanisM , 2013 -# Eugene MechanisM , 2016 -# Jannis Leidel , 2011 -# Алексей Борискин , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Eugene MechanisM \n" -"Language-Team: Russian (http://www.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -msgid "Sites" -msgstr "Сайты" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Доменное имя не может содержать пробелы или табуляцию." - -msgid "domain name" -msgstr "доменное имя" - -msgid "display name" -msgstr "отображаемое имя" - -msgid "site" -msgstr "сайт" - -msgid "sites" -msgstr "сайты" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index fbcf69a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index 0f48ec9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Marian Andre , 2013 -# Martin Tóth , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Martin Tóth \n" -"Language-Team: Slovak (http://www.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Sites" -msgstr "Sídla" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Názov domény nemôže obsahovať medzery alebo tabulátory." - -msgid "domain name" -msgstr "názov domény" - -msgid "display name" -msgstr "zobrazené meno" - -msgid "site" -msgstr "sídlo" - -msgid "sites" -msgstr "sídla" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sl/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index 77d008f..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sl/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index 7a69572..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Primož Verdnik , 2017 -# zejn , 2013,2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Primož Verdnik \n" -"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -msgid "Sites" -msgstr "Strani" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domena ne sme vsebovati presledkov ali tabulatorjev." - -msgid "domain name" -msgstr "ime domene" - -msgid "display name" -msgstr "prikazano ime" - -msgid "site" -msgstr "stran" - -msgid "sites" -msgstr "strani" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sq/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index cbd1a6a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sq/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index 3ce9830..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-11-29 23:00+0000\n" -"Last-Translator: Besnik \n" -"Language-Team: Albanian (http://www.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sajte" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Emri i përkatësisë s’mund të përmbajë hapësira ose tabulacione." - -msgid "domain name" -msgstr "emër përkatësie" - -msgid "display name" -msgstr "emër shfaqjeje" - -msgid "site" -msgstr "sajt" - -msgid "sites" -msgstr "sajte" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index 8ac57bb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index 47e2e65..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-01-30 10:13+0000\n" -"Last-Translator: Branko Kokanovic \n" -"Language-Team: Serbian (http://www.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Sites" -msgstr "Сајтови" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Име домена не може да садржи размаке ни табове." - -msgid "domain name" -msgstr "име домена" - -msgid "display name" -msgstr "приказано име" - -msgid "site" -msgstr "сајт" - -msgid "sites" -msgstr "сајтови" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index deabe45..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index 03d3db0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Igor Jerosimić, 2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2019-06-27 12:41+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" -"language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Sites" -msgstr "Sajtovi" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Ime domena ne može da sadrži razmake ni tabove." - -msgid "domain name" -msgstr "ime domena" - -msgid "display name" -msgstr "prikazano ime" - -msgid "site" -msgstr "sajt" - -msgid "sites" -msgstr "sajtovi" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sv/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index 9b09021..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sv/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index d727d90..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Anders Hovmöller , 2023 -# Jannis Leidel , 2011 -# Jonathan Lindén, 2014 -# Thomas Lundqvist, 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2023-04-24 18:05+0000\n" -"Last-Translator: Anders Hovmöller , 2023\n" -"Language-Team: Swedish (http://www.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Webbplatser" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domännamnet kan inte innehålla mellanslag eller tab." - -msgid "domain name" -msgstr "domännamn" - -msgid "display name" -msgstr "visningsnamn" - -msgid "site" -msgstr "webbplats" - -msgid "sites" -msgstr "webbplatser" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sw/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index 1447715..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sw/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index c3206e9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Machaku , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Tovuti" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Jina la kikoa haliwezi kuwa na nafasi yeyote kati yake." - -msgid "domain name" -msgstr "jina la kikoa" - -msgid "display name" -msgstr "jina" - -msgid "site" -msgstr "tovuti" - -msgid "sites" -msgstr "tovuti" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ta/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index 9cdaa1e..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ta/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index 883c04a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "களப் பெயர்" - -msgid "display name" -msgstr "காட்டும் பெயர்" - -msgid "site" -msgstr "வலைத்தளம்" - -msgid "sites" -msgstr "வலைத்தளங்கள்" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/te/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index 9be611d..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/te/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index 3598aa6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "డొమైన్ నామము" - -msgid "display name" -msgstr "కనిపిచ్చే పేరు" - -msgid "site" -msgstr "సైట్" - -msgid "sites" -msgstr "సైట్లు" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tg/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index e557293..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tg/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index cc7f86e..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2020-05-15 00:35+0000\n" -"Last-Translator: Surush Sufiew \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Сомонаҳо" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Номи домен наметавонад аз фосилаҳо ва табулятсия иборат бошад." - -msgid "domain name" -msgstr "номи доменӣ" - -msgid "display name" -msgstr "номи инъикосшуда" - -msgid "site" -msgstr "сомона" - -msgid "sites" -msgstr "сомонаҳо" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/th/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index bd461b6..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/th/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index 89df6a6..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2013,2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2018-05-06 08:37+0000\n" -"Last-Translator: Kowit Charoenratchatabhan \n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "ไซต์" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "ชื่อโดนเมนต้องไม่ไม่ช่องว่างหรือแท็บ" - -msgid "domain name" -msgstr "ชื่อโดเมน" - -msgid "display name" -msgstr "ชื่อที่แสดง" - -msgid "site" -msgstr "ไซต์" - -msgid "sites" -msgstr "ไซต์" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index 854a902..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index a54affa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Resulkary , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2020-07-06 11:50+0000\n" -"Last-Translator: Resulkary \n" -"Language-Team: Turkmen (http://www.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "Sahypalar" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domen adynda boşluklar ýa-da goýmalar bolup bilmez." - -msgid "domain name" -msgstr "domen ady" - -msgid "display name" -msgstr "görkezilýän ady" - -msgid "site" -msgstr "sahypa" - -msgid "sites" -msgstr "sahypalar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tr/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index b077813..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tr/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index 2372c14..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ahmet Emre Aladağ , 2014 -# BouRock, 2014 -# Caner Başaran , 2013 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Turkish (http://www.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Sites" -msgstr "Siteler" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Etki alanı adı, herhangi bir boşluk ya da sekme içeremez." - -msgid "domain name" -msgstr "etki alanı adı" - -msgid "display name" -msgstr "görünen isim" - -msgid "site" -msgstr "site" - -msgid "sites" -msgstr "siteler" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tt/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index 384d79a..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tt/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index 519ece3..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -# v_ildar , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "Сайтлар" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "домен исеме" - -msgid "display name" -msgstr "чагылдырылган исем" - -msgid "site" -msgstr "сайт" - -msgid "sites" -msgstr "сайтлар" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/udm/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index af7ab53..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/udm/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index 26b17e7..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "" - -msgid "display name" -msgstr "" - -msgid "site" -msgstr "" - -msgid "sites" -msgstr "" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ug/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index 993ca82..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ug/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index e5b00f8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abduqadir Abliz , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2023-12-04 18:05+0000\n" -"Last-Translator: Abduqadir Abliz , 2023\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "بېكەتلەر" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "دائىرە نامى ھەر قانداق بوشلۇق ياكى tab بوشلۇقنى ئۆز ئىچىگە ئالمايدۇ." - -msgid "domain name" -msgstr "دائىرە ئاتى" - -msgid "display name" -msgstr "كۆرسىتىش ئاتى" - -msgid "site" -msgstr "بېكەت" - -msgid "sites" -msgstr "بېكەتلەر" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uk/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index 8ffb1b9..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uk/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index f98454c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Oleksandr Chernihov , 2014 -# Jannis Leidel , 2011 -# Alex Bolotov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Mykola Zamkovoi \n" -"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -msgid "Sites" -msgstr "Сайти" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Доменне ім'я не може містити пробіли або символи табуляції." - -msgid "domain name" -msgstr "доменне ім'я" - -msgid "display name" -msgstr "відображуване ім'я" - -msgid "site" -msgstr "сайт" - -msgid "sites" -msgstr "сайти" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ur/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index 733aebd..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ur/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index b16ddb2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "" - -msgid "domain name" -msgstr "ڈومین کا نام" - -msgid "display name" -msgstr "ظاھر ھونے والا نام" - -msgid "site" -msgstr "سائٹ" - -msgid "sites" -msgstr "سائٹس" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uz/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uz/LC_MESSAGES/django.mo deleted file mode 100644 index f1c68e3..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uz/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uz/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uz/LC_MESSAGES/django.po deleted file mode 100644 index 4f26906..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/uz/LC_MESSAGES/django.po +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Nuruddin Iminokhunov , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 01:18+0000\n" -"Last-Translator: Nuruddin Iminokhunov \n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "Saytlar" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Domen ismi tab`lar va bo'shliqlarsiz bo'lishi kerak" - -msgid "domain name" -msgstr "domen nomi" - -msgid "display name" -msgstr "ko'rsatiladigan ismi" - -msgid "site" -msgstr "sayt" - -msgid "sites" -msgstr "saytlar" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/vi/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index 36fa075..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/vi/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index 6f7d6a0..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Thanh Le Viet , 2013 -# Tran , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Tran Van \n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "Tên miền không gồm kí tự trống hoặc tab" - -msgid "domain name" -msgstr "Tên miền" - -msgid "display name" -msgstr "Tên hiển thị" - -msgid "site" -msgstr "trang web" - -msgid "sites" -msgstr "các trang web" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index 028280c..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index 82f53fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ronald White , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "站点" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "域名不能包含任何空格或制表符。" - -msgid "domain name" -msgstr "域名" - -msgid "display name" -msgstr "显示名称" - -msgid "site" -msgstr "站点" - -msgid "sites" -msgstr "站点" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.mo b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index adf09fb..0000000 Binary files a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.po b/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index 5b8b24d..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,40 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chen Chun-Chia , 2015 -# Jannis Leidel , 2011 -# mail6543210 , 2013 -# Tzu-ping Chung , 2016 -# YAO WEN LIANG, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2024-08-07 18:05+0000\n" -"Last-Translator: YAO WEN LIANG, 2024\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Sites" -msgstr "網站" - -msgid "The domain name cannot contain any spaces or tabs." -msgstr "網域名稱不能包含空格或製表符(tabs)。" - -msgid "domain name" -msgstr "網域名稱" - -msgid "display name" -msgstr "顯示名稱" - -msgid "site" -msgstr "網站" - -msgid "sites" -msgstr "網站" diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/management.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/management.py deleted file mode 100644 index dd75bc1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/management.py +++ /dev/null @@ -1,47 +0,0 @@ -""" -Creates the default Site object. -""" - -from django.apps import apps as global_apps -from django.conf import settings -from django.core.management.color import no_style -from django.db import DEFAULT_DB_ALIAS, connections, router - - -def create_default_site( - app_config, - verbosity=2, - interactive=True, - using=DEFAULT_DB_ALIAS, - apps=global_apps, - **kwargs, -): - try: - Site = apps.get_model("sites", "Site") - except LookupError: - return - - if not router.allow_migrate_model(using, Site): - return - - if not Site.objects.using(using).exists(): - # The default settings set SITE_ID = 1, and some tests in Django's test - # suite rely on this value. However, if database sequences are reused - # (e.g. in the test suite after flush/syncdb), it isn't guaranteed that - # the next id will be 1, so we coerce it. See #15573 and #16353. This - # can also crop up outside of tests - see #15346. - if verbosity >= 2: - print("Creating example.com Site object") - Site( - pk=getattr(settings, "SITE_ID", 1), domain="example.com", name="example.com" - ).save(using=using) - - # We set an explicit pk instead of relying on auto-incrementation, - # so we need to reset the database sequence. See #17415. - sequence_sql = connections[using].ops.sequence_reset_sql(no_style(), [Site]) - if sequence_sql: - if verbosity >= 2: - print("Resetting sequence") - with connections[using].cursor() as cursor: - for command in sequence_sql: - cursor.execute(command) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/managers.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/managers.py deleted file mode 100644 index ec28826..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/managers.py +++ /dev/null @@ -1,65 +0,0 @@ -from django.conf import settings -from django.core import checks -from django.core.exceptions import FieldDoesNotExist -from django.db import models - - -class CurrentSiteManager(models.Manager): - "Use this to limit objects to those associated with the current site." - - use_in_migrations = True - - def __init__(self, field_name=None): - super().__init__() - self.__field_name = field_name - - def check(self, **kwargs): - errors = super().check(**kwargs) - errors.extend(self._check_field_name()) - return errors - - def _check_field_name(self): - field_name = self._get_field_name() - try: - field = self.model._meta.get_field(field_name) - except FieldDoesNotExist: - return [ - checks.Error( - "CurrentSiteManager could not find a field named '%s'." - % field_name, - obj=self, - id="sites.E001", - ) - ] - - if not field.many_to_many and not isinstance(field, (models.ForeignKey)): - return [ - checks.Error( - "CurrentSiteManager cannot use '%s.%s' as it is not a foreign key " - "or a many-to-many field." - % (self.model._meta.object_name, field_name), - obj=self, - id="sites.E002", - ) - ] - - return [] - - def _get_field_name(self): - """Return self.__field_name or 'site' or 'sites'.""" - - if not self.__field_name: - try: - self.model._meta.get_field("site") - except FieldDoesNotExist: - self.__field_name = "sites" - else: - self.__field_name = "site" - return self.__field_name - - def get_queryset(self): - return ( - super() - .get_queryset() - .filter(**{self._get_field_name() + "__id": settings.SITE_ID}) - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/middleware.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/middleware.py deleted file mode 100644 index bc3bf20..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/middleware.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.utils.deprecation import MiddlewareMixin - -from .shortcuts import get_current_site - - -class CurrentSiteMiddleware(MiddlewareMixin): - """ - Middleware that sets `site` attribute to request object. - """ - - def process_request(self, request): - request.site = get_current_site(request) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/migrations/0001_initial.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/migrations/0001_initial.py deleted file mode 100644 index a23f0f1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/migrations/0001_initial.py +++ /dev/null @@ -1,43 +0,0 @@ -import django.contrib.sites.models -from django.contrib.sites.models import _simple_domain_name_validator -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [] - - operations = [ - migrations.CreateModel( - name="Site", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "domain", - models.CharField( - max_length=100, - verbose_name="domain name", - validators=[_simple_domain_name_validator], - ), - ), - ("name", models.CharField(max_length=50, verbose_name="display name")), - ], - options={ - "ordering": ["domain"], - "db_table": "django_site", - "verbose_name": "site", - "verbose_name_plural": "sites", - }, - bases=(models.Model,), - managers=[ - ("objects", django.contrib.sites.models.SiteManager()), - ], - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/migrations/0002_alter_domain_unique.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/migrations/0002_alter_domain_unique.py deleted file mode 100644 index e379a91..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/migrations/0002_alter_domain_unique.py +++ /dev/null @@ -1,21 +0,0 @@ -import django.contrib.sites.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("sites", "0001_initial"), - ] - - operations = [ - migrations.AlterField( - model_name="site", - name="domain", - field=models.CharField( - max_length=100, - unique=True, - validators=[django.contrib.sites.models._simple_domain_name_validator], - verbose_name="domain name", - ), - ), - ] diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/migrations/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/models.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/models.py deleted file mode 100644 index 7f8bce9..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/models.py +++ /dev/null @@ -1,120 +0,0 @@ -import string - -from django.core.exceptions import ImproperlyConfigured, ValidationError -from django.db import models -from django.db.models.signals import pre_delete, pre_save -from django.http.request import split_domain_port -from django.utils.translation import gettext_lazy as _ - -SITE_CACHE = {} - - -def _simple_domain_name_validator(value): - """ - Validate that the given value contains no whitespaces to prevent common - typos. - """ - checks = ((s in value) for s in string.whitespace) - if any(checks): - raise ValidationError( - _("The domain name cannot contain any spaces or tabs."), - code="invalid", - ) - - -class SiteManager(models.Manager): - use_in_migrations = True - - def _get_site_by_id(self, site_id): - if site_id not in SITE_CACHE: - site = self.get(pk=site_id) - SITE_CACHE[site_id] = site - return SITE_CACHE[site_id] - - def _get_site_by_request(self, request): - host = request.get_host() - try: - # First attempt to look up the site by host with or without port. - if host not in SITE_CACHE: - SITE_CACHE[host] = self.get(domain__iexact=host) - return SITE_CACHE[host] - except Site.DoesNotExist: - # Fallback to looking up site after stripping port from the host. - domain, port = split_domain_port(host) - if domain not in SITE_CACHE: - SITE_CACHE[domain] = self.get(domain__iexact=domain) - return SITE_CACHE[domain] - - def get_current(self, request=None): - """ - Return the current Site based on the SITE_ID in the project's settings. - If SITE_ID isn't defined, return the site with domain matching - request.get_host(). The ``Site`` object is cached the first time it's - retrieved from the database. - """ - from django.conf import settings - - if getattr(settings, "SITE_ID", ""): - site_id = settings.SITE_ID - return self._get_site_by_id(site_id) - elif request: - return self._get_site_by_request(request) - - raise ImproperlyConfigured( - 'You\'re using the Django "sites framework" without having ' - "set the SITE_ID setting. Create a site in your database and " - "set the SITE_ID setting or pass a request to " - "Site.objects.get_current() to fix this error." - ) - - def clear_cache(self): - """Clear the ``Site`` object cache.""" - global SITE_CACHE - SITE_CACHE = {} - - def get_by_natural_key(self, domain): - return self.get(domain=domain) - - -class Site(models.Model): - domain = models.CharField( - _("domain name"), - max_length=100, - validators=[_simple_domain_name_validator], - unique=True, - ) - name = models.CharField(_("display name"), max_length=50) - - objects = SiteManager() - - class Meta: - db_table = "django_site" - verbose_name = _("site") - verbose_name_plural = _("sites") - ordering = ["domain"] - - def __str__(self): - return self.domain - - def natural_key(self): - return (self.domain,) - - -def clear_site_cache(sender, **kwargs): - """ - Clear the cache (if primed) each time a site is saved or deleted. - """ - instance = kwargs["instance"] - using = kwargs["using"] - try: - del SITE_CACHE[instance.pk] - except KeyError: - pass - try: - del SITE_CACHE[Site.objects.using(using).get(pk=instance.pk).domain] - except (KeyError, Site.DoesNotExist): - pass - - -pre_save.connect(clear_site_cache, sender=Site) -pre_delete.connect(clear_site_cache, sender=Site) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/requests.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/requests.py deleted file mode 100644 index a0c9c18..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/requests.py +++ /dev/null @@ -1,20 +0,0 @@ -class RequestSite: - """ - A class that shares the primary interface of Site (i.e., it has ``domain`` - and ``name`` attributes) but gets its data from an HttpRequest object - rather than from a database. - - The save() and delete() methods raise NotImplementedError. - """ - - def __init__(self, request): - self.domain = self.name = request.get_host() - - def __str__(self): - return self.domain - - def save(self, force_insert=False, force_update=False): - raise NotImplementedError("RequestSite cannot be saved.") - - def delete(self): - raise NotImplementedError("RequestSite cannot be deleted.") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/sites/shortcuts.py b/.venv/lib/python3.10/site-packages/django/contrib/sites/shortcuts.py deleted file mode 100644 index d4b6510..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/sites/shortcuts.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.apps import apps - -from .requests import RequestSite - - -def get_current_site(request): - """ - Check if contrib.sites is installed and return either the current - ``Site`` object or a ``RequestSite`` object based on the request. - """ - # Import is inside the function because its point is to avoid importing the - # Site models when django.contrib.sites isn't installed. - if apps.is_installed("django.contrib.sites"): - from .models import Site - - return Site.objects.get_current(request) - else: - return RequestSite(request) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/apps.py deleted file mode 100644 index 08d827c..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/apps.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.apps import AppConfig -from django.contrib.staticfiles.checks import check_finders, check_storages -from django.core import checks -from django.utils.translation import gettext_lazy as _ - - -class StaticFilesConfig(AppConfig): - name = "django.contrib.staticfiles" - verbose_name = _("Static Files") - ignore_patterns = ["CVS", ".*", "*~"] - - def ready(self): - checks.register(check_finders, checks.Tags.staticfiles) - checks.register(check_storages, checks.Tags.staticfiles) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/checks.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/checks.py deleted file mode 100644 index 06b87c2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/checks.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.conf import STATICFILES_STORAGE_ALIAS, settings -from django.contrib.staticfiles.finders import get_finders -from django.core.checks import Error - -E005 = Error( - f"The STORAGES setting must define a '{STATICFILES_STORAGE_ALIAS}' storage.", - id="staticfiles.E005", -) - - -def check_finders(app_configs=None, **kwargs): - """Check all registered staticfiles finders.""" - errors = [] - for finder in get_finders(): - try: - finder_errors = finder.check() - except NotImplementedError: - pass - else: - errors.extend(finder_errors) - return errors - - -def check_storages(app_configs=None, **kwargs): - """Ensure staticfiles is defined in STORAGES setting.""" - errors = [] - if STATICFILES_STORAGE_ALIAS not in settings.STORAGES: - errors.append(E005) - return errors diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/finders.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/finders.py deleted file mode 100644 index c208756..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/finders.py +++ /dev/null @@ -1,382 +0,0 @@ -import functools -import os -import warnings - -from django.apps import apps -from django.conf import settings -from django.contrib.staticfiles import utils -from django.core.checks import Error, Warning -from django.core.exceptions import ImproperlyConfigured -from django.core.files.storage import FileSystemStorage, Storage, default_storage -from django.utils._os import safe_join -from django.utils.deprecation import RemovedInDjango61Warning -from django.utils.functional import LazyObject, empty -from django.utils.module_loading import import_string - -# To keep track on which directories the finder has searched the static files. -searched_locations = [] - - -# RemovedInDjango61Warning: When the deprecation ends, remove completely. -def _check_deprecated_find_param(class_name="", find_all=False, stacklevel=3, **kwargs): - method_name = "find" if not class_name else f"{class_name}.find" - if "all" in kwargs: - legacy_all = kwargs.pop("all") - msg = ( - "Passing the `all` argument to find() is deprecated. Use `find_all` " - "instead." - ) - warnings.warn(msg, RemovedInDjango61Warning, stacklevel=stacklevel) - - # If both `find_all` and `all` were given, raise TypeError. - if find_all is not False: - raise TypeError( - f"{method_name}() got multiple values for argument 'find_all'" - ) - - find_all = legacy_all - - if kwargs: # any remaining kwargs must be a TypeError - first = list(kwargs.keys()).pop() - raise TypeError(f"{method_name}() got an unexpected keyword argument '{first}'") - - return find_all - - -class BaseFinder: - """ - A base file finder to be used for custom staticfiles finder classes. - """ - - def check(self, **kwargs): - raise NotImplementedError( - "subclasses may provide a check() method to verify the finder is " - "configured correctly." - ) - - # RemovedInDjango61Warning: When the deprecation ends, remove completely. - def _check_deprecated_find_param(self, **kwargs): - return _check_deprecated_find_param( - class_name=self.__class__.__qualname__, stacklevel=4, **kwargs - ) - - # RemovedInDjango61Warning: When the deprecation ends, replace with: - # def find(self, path, find_all=False): - def find(self, path, find_all=False, **kwargs): - """ - Given a relative file path, find an absolute file path. - - If the ``find_all`` parameter is False (default) return only the first - found file path; if True, return a list of all found files paths. - """ - raise NotImplementedError( - "subclasses of BaseFinder must provide a find() method" - ) - - def list(self, ignore_patterns): - """ - Given an optional list of paths to ignore, return a two item iterable - consisting of the relative path and storage instance. - """ - raise NotImplementedError( - "subclasses of BaseFinder must provide a list() method" - ) - - -class FileSystemFinder(BaseFinder): - """ - A static files finder that uses the ``STATICFILES_DIRS`` setting - to locate files. - """ - - def __init__(self, app_names=None, *args, **kwargs): - # List of locations with static files - self.locations = [] - # Maps dir paths to an appropriate storage instance - self.storages = {} - for root in settings.STATICFILES_DIRS: - if isinstance(root, (list, tuple)): - prefix, root = root - else: - prefix = "" - if (prefix, root) not in self.locations: - self.locations.append((prefix, root)) - for prefix, root in self.locations: - filesystem_storage = FileSystemStorage(location=root) - filesystem_storage.prefix = prefix - self.storages[root] = filesystem_storage - super().__init__(*args, **kwargs) - - def check(self, **kwargs): - errors = [] - if not isinstance(settings.STATICFILES_DIRS, (list, tuple)): - errors.append( - Error( - "The STATICFILES_DIRS setting is not a tuple or list.", - hint="Perhaps you forgot a trailing comma?", - id="staticfiles.E001", - ) - ) - return errors - for root in settings.STATICFILES_DIRS: - if isinstance(root, (list, tuple)): - prefix, root = root - if prefix.endswith("/"): - errors.append( - Error( - "The prefix %r in the STATICFILES_DIRS setting must " - "not end with a slash." % prefix, - id="staticfiles.E003", - ) - ) - if settings.STATIC_ROOT and os.path.abspath( - settings.STATIC_ROOT - ) == os.path.abspath(root): - errors.append( - Error( - "The STATICFILES_DIRS setting should not contain the " - "STATIC_ROOT setting.", - id="staticfiles.E002", - ) - ) - if not os.path.isdir(root): - errors.append( - Warning( - f"The directory '{root}' in the STATICFILES_DIRS setting " - f"does not exist.", - id="staticfiles.W004", - ) - ) - return errors - - # RemovedInDjango61Warning: When the deprecation ends, replace with: - # def find(self, path, find_all=False): - def find(self, path, find_all=False, **kwargs): - """ - Look for files in the extra locations as defined in STATICFILES_DIRS. - """ - # RemovedInDjango61Warning. - if kwargs: - find_all = self._check_deprecated_find_param(find_all=find_all, **kwargs) - matches = [] - for prefix, root in self.locations: - if root not in searched_locations: - searched_locations.append(root) - matched_path = self.find_location(root, path, prefix) - if matched_path: - if not find_all: - return matched_path - matches.append(matched_path) - return matches - - def find_location(self, root, path, prefix=None): - """ - Find a requested static file in a location and return the found - absolute path (or ``None`` if no match). - """ - if prefix: - prefix = "%s%s" % (prefix, os.sep) - if not path.startswith(prefix): - return None - path = path.removeprefix(prefix) - path = safe_join(root, path) - if os.path.exists(path): - return path - - def list(self, ignore_patterns): - """ - List all files in all locations. - """ - for prefix, root in self.locations: - # Skip nonexistent directories. - if os.path.isdir(root): - storage = self.storages[root] - for path in utils.get_files(storage, ignore_patterns): - yield path, storage - - -class AppDirectoriesFinder(BaseFinder): - """ - A static files finder that looks in the directory of each app as - specified in the source_dir attribute. - """ - - storage_class = FileSystemStorage - source_dir = "static" - - def __init__(self, app_names=None, *args, **kwargs): - # The list of apps that are handled - self.apps = [] - # Mapping of app names to storage instances - self.storages = {} - app_configs = apps.get_app_configs() - if app_names: - app_names = set(app_names) - app_configs = [ac for ac in app_configs if ac.name in app_names] - for app_config in app_configs: - app_storage = self.storage_class( - os.path.join(app_config.path, self.source_dir) - ) - if os.path.isdir(app_storage.location): - self.storages[app_config.name] = app_storage - if app_config.name not in self.apps: - self.apps.append(app_config.name) - super().__init__(*args, **kwargs) - - def list(self, ignore_patterns): - """ - List all files in all app storages. - """ - for storage in self.storages.values(): - if storage.exists(""): # check if storage location exists - for path in utils.get_files(storage, ignore_patterns): - yield path, storage - - # RemovedInDjango61Warning: When the deprecation ends, replace with: - # def find(self, path, find_all=False): - def find(self, path, find_all=False, **kwargs): - """ - Look for files in the app directories. - """ - # RemovedInDjango61Warning. - if kwargs: - find_all = self._check_deprecated_find_param(find_all=find_all, **kwargs) - matches = [] - for app in self.apps: - app_location = self.storages[app].location - if app_location not in searched_locations: - searched_locations.append(app_location) - match = self.find_in_app(app, path) - if match: - if not find_all: - return match - matches.append(match) - return matches - - def find_in_app(self, app, path): - """ - Find a requested static file in an app's static locations. - """ - storage = self.storages.get(app) - # Only try to find a file if the source dir actually exists. - if storage and storage.exists(path): - matched_path = storage.path(path) - if matched_path: - return matched_path - - -class BaseStorageFinder(BaseFinder): - """ - A base static files finder to be used to extended - with an own storage class. - """ - - storage = None - - def __init__(self, storage=None, *args, **kwargs): - if storage is not None: - self.storage = storage - if self.storage is None: - raise ImproperlyConfigured( - "The staticfiles storage finder %r " - "doesn't have a storage class " - "assigned." % self.__class__ - ) - # Make sure we have a storage instance here. - if not isinstance(self.storage, (Storage, LazyObject)): - self.storage = self.storage() - super().__init__(*args, **kwargs) - - # RemovedInDjango61Warning: When the deprecation ends, replace with: - # def find(self, path, find_all=False): - def find(self, path, find_all=False, **kwargs): - """ - Look for files in the default file storage, if it's local. - """ - # RemovedInDjango61Warning. - if kwargs: - find_all = self._check_deprecated_find_param(find_all=find_all, **kwargs) - try: - self.storage.path("") - except NotImplementedError: - pass - else: - if self.storage.location not in searched_locations: - searched_locations.append(self.storage.location) - if self.storage.exists(path): - match = self.storage.path(path) - if find_all: - match = [match] - return match - return [] - - def list(self, ignore_patterns): - """ - List all files of the storage. - """ - for path in utils.get_files(self.storage, ignore_patterns): - yield path, self.storage - - -class DefaultStorageFinder(BaseStorageFinder): - """ - A static files finder that uses the default storage backend. - """ - - storage = default_storage - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - base_location = getattr(self.storage, "base_location", empty) - if not base_location: - raise ImproperlyConfigured( - "The storage backend of the " - "staticfiles finder %r doesn't have " - "a valid location." % self.__class__ - ) - - -# RemovedInDjango61Warning: When the deprecation ends, replace with: -# def find(path, find_all=False): -def find(path, find_all=False, **kwargs): - """ - Find a static file with the given path using all enabled finders. - - If ``find_all`` is ``False`` (default), return the first matching - absolute path (or ``None`` if no match). Otherwise return a list. - """ - # RemovedInDjango61Warning. - if kwargs: - find_all = _check_deprecated_find_param(find_all=find_all, **kwargs) - searched_locations[:] = [] - matches = [] - for finder in get_finders(): - result = finder.find(path, find_all=find_all) - if not find_all and result: - return result - if not isinstance(result, (list, tuple)): - result = [result] - matches.extend(result) - if matches: - return matches - # No match. - return [] if find_all else None - - -def get_finders(): - for finder_path in settings.STATICFILES_FINDERS: - yield get_finder(finder_path) - - -@functools.cache -def get_finder(import_path): - """ - Import the staticfiles finder class described by import_path, where - import_path is the full Python path to the class. - """ - Finder = import_string(import_path) - if not issubclass(Finder, BaseFinder): - raise ImproperlyConfigured( - 'Finder "%s" is not a subclass of "%s"' % (Finder, BaseFinder) - ) - return Finder() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/handlers.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/handlers.py deleted file mode 100644 index 686718a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/handlers.py +++ /dev/null @@ -1,115 +0,0 @@ -from urllib.parse import urlparse -from urllib.request import url2pathname - -from asgiref.sync import sync_to_async - -from django.conf import settings -from django.contrib.staticfiles import utils -from django.contrib.staticfiles.views import serve -from django.core.handlers.asgi import ASGIHandler -from django.core.handlers.exception import response_for_exception -from django.core.handlers.wsgi import WSGIHandler, get_path_info -from django.http import Http404 - - -class StaticFilesHandlerMixin: - """ - Common methods used by WSGI and ASGI handlers. - """ - - # May be used to differentiate between handler types (e.g. in a - # request_finished signal) - handles_files = True - - def load_middleware(self): - # Middleware are already loaded for self.application; no need to reload - # them for self. - pass - - def get_base_url(self): - utils.check_settings() - return settings.STATIC_URL - - def _should_handle(self, path): - """ - Check if the path should be handled. Ignore the path if: - * the host is provided as part of the base_url - * the request's path isn't under the media path (or equal) - """ - return path.startswith(self.base_url.path) and not self.base_url.netloc - - def file_path(self, url): - """ - Return the relative path to the media file on disk for the given URL. - """ - relative_url = url.removeprefix(self.base_url.path) - return url2pathname(relative_url) - - def serve(self, request): - """Serve the request path.""" - return serve(request, self.file_path(request.path), insecure=True) - - def get_response(self, request): - try: - return self.serve(request) - except Http404 as e: - return response_for_exception(request, e) - - async def get_response_async(self, request): - try: - return await sync_to_async(self.serve, thread_sensitive=False)(request) - except Http404 as e: - return await sync_to_async(response_for_exception, thread_sensitive=False)( - request, e - ) - - -class StaticFilesHandler(StaticFilesHandlerMixin, WSGIHandler): - """ - WSGI middleware that intercepts calls to the static files directory, as - defined by the STATIC_URL setting, and serves those files. - """ - - def __init__(self, application): - self.application = application - self.base_url = urlparse(self.get_base_url()) - super().__init__() - - def __call__(self, environ, start_response): - if not self._should_handle(get_path_info(environ)): - return self.application(environ, start_response) - return super().__call__(environ, start_response) - - -class ASGIStaticFilesHandler(StaticFilesHandlerMixin, ASGIHandler): - """ - ASGI application which wraps another and intercepts requests for static - files, passing them off to Django's static file serving. - """ - - def __init__(self, application): - self.application = application - self.base_url = urlparse(self.get_base_url()) - - async def __call__(self, scope, receive, send): - # Only even look at HTTP requests - if scope["type"] == "http" and self._should_handle(scope["path"]): - # Serve static content - # (the one thing super() doesn't do is __call__, apparently) - return await super().__call__(scope, receive, send) - # Hand off to the main app - return await self.application(scope, receive, send) - - async def get_response_async(self, request): - response = await super().get_response_async(request) - response._resource_closers.append(request.close) - # FileResponse is not async compatible. - if response.streaming and not response.is_async: - _iterator = response.streaming_content - - async def awrapper(): - for part in await sync_to_async(list)(_iterator): - yield part - - response.streaming_content = awrapper() - return response diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py deleted file mode 100644 index d5cd3f5..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py +++ /dev/null @@ -1,379 +0,0 @@ -import os - -from django.apps import apps -from django.contrib.staticfiles.finders import get_finders -from django.contrib.staticfiles.storage import staticfiles_storage -from django.core.checks import Tags -from django.core.files.storage import FileSystemStorage -from django.core.management.base import BaseCommand, CommandError -from django.core.management.color import no_style -from django.utils.functional import cached_property - - -class Command(BaseCommand): - """ - Copies or symlinks static files from different locations to the - settings.STATIC_ROOT. - """ - - help = "Collect static files in a single location." - requires_system_checks = [Tags.staticfiles] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.copied_files = [] - self.symlinked_files = [] - self.unmodified_files = [] - self.post_processed_files = [] - self.storage = staticfiles_storage - self.style = no_style() - - @cached_property - def local(self): - try: - self.storage.path("") - except NotImplementedError: - return False - return True - - def add_arguments(self, parser): - parser.add_argument( - "--noinput", - "--no-input", - action="store_false", - dest="interactive", - help="Do NOT prompt the user for input of any kind.", - ) - parser.add_argument( - "--no-post-process", - action="store_false", - dest="post_process", - help="Do NOT post process collected files.", - ) - parser.add_argument( - "-i", - "--ignore", - action="append", - default=[], - dest="ignore_patterns", - metavar="PATTERN", - help="Ignore files or directories matching this glob-style " - "pattern. Use multiple times to ignore more.", - ) - parser.add_argument( - "-n", - "--dry-run", - action="store_true", - help="Do everything except modify the filesystem.", - ) - parser.add_argument( - "-c", - "--clear", - action="store_true", - help="Clear the existing files using the storage " - "before trying to copy or link the original file.", - ) - parser.add_argument( - "-l", - "--link", - action="store_true", - help="Create a symbolic link to each file instead of copying.", - ) - parser.add_argument( - "--no-default-ignore", - action="store_false", - dest="use_default_ignore_patterns", - help=( - "Don't ignore the common private glob-style patterns (defaults to " - "'CVS', '.*' and '*~')." - ), - ) - - def set_options(self, **options): - """ - Set instance variables based on an options dict - """ - self.interactive = options["interactive"] - self.verbosity = options["verbosity"] - self.symlink = options["link"] - self.clear = options["clear"] - self.dry_run = options["dry_run"] - ignore_patterns = options["ignore_patterns"] - if options["use_default_ignore_patterns"]: - ignore_patterns += apps.get_app_config("staticfiles").ignore_patterns - self.ignore_patterns = list({os.path.normpath(p) for p in ignore_patterns}) - self.post_process = options["post_process"] - - def collect(self): - """ - Perform the bulk of the work of collectstatic. - - Split off from handle() to facilitate testing. - """ - if self.symlink and not self.local: - raise CommandError("Can't symlink to a remote destination.") - - if self.clear: - self.clear_dir("") - - if self.symlink: - handler = self.link_file - else: - handler = self.copy_file - - found_files = {} - for finder in get_finders(): - for path, storage in finder.list(self.ignore_patterns): - # Prefix the relative path if the source storage contains it - if getattr(storage, "prefix", None): - prefixed_path = os.path.join(storage.prefix, path) - else: - prefixed_path = path - - if prefixed_path not in found_files: - found_files[prefixed_path] = (storage, path) - handler(path, prefixed_path, storage) - else: - self.log( - "Found another file with the destination path '%s'. It " - "will be ignored since only the first encountered file " - "is collected. If this is not what you want, make sure " - "every static file has a unique path." % prefixed_path, - level=1, - ) - - # Storage backends may define a post_process() method. - if self.post_process and hasattr(self.storage, "post_process"): - processor = self.storage.post_process(found_files, dry_run=self.dry_run) - for original_path, processed_path, processed in processor: - if isinstance(processed, Exception): - self.stderr.write("Post-processing '%s' failed!" % original_path) - # Add a blank line before the traceback, otherwise it's - # too easy to miss the relevant part of the error message. - self.stderr.write() - raise processed - if processed: - self.log( - "Post-processed '%s' as '%s'" % (original_path, processed_path), - level=2, - ) - self.post_processed_files.append(original_path) - else: - self.log("Skipped post-processing '%s'" % original_path) - - return { - "modified": self.copied_files + self.symlinked_files, - "unmodified": self.unmodified_files, - "post_processed": self.post_processed_files, - } - - def handle(self, **options): - self.set_options(**options) - message = ["\n"] - if self.dry_run: - message.append( - "You have activated the --dry-run option so no files will be " - "modified.\n\n" - ) - - message.append( - "You have requested to collect static files at the destination\n" - "location as specified in your settings" - ) - - if self.is_local_storage() and self.storage.location: - destination_path = self.storage.location - message.append(":\n\n %s\n\n" % destination_path) - should_warn_user = self.storage.exists(destination_path) and any( - self.storage.listdir(destination_path) - ) - else: - destination_path = None - message.append(".\n\n") - # Destination files existence not checked; play it safe and warn. - should_warn_user = True - - if self.interactive and should_warn_user: - if self.clear: - message.append("This will DELETE ALL FILES in this location!\n") - else: - message.append("This will overwrite existing files!\n") - - message.append( - "Are you sure you want to do this?\n\n" - "Type 'yes' to continue, or 'no' to cancel: " - ) - if input("".join(message)) != "yes": - raise CommandError("Collecting static files cancelled.") - - collected = self.collect() - - if self.verbosity >= 1: - modified_count = len(collected["modified"]) - unmodified_count = len(collected["unmodified"]) - post_processed_count = len(collected["post_processed"]) - return ( - "\n%(modified_count)s %(identifier)s %(action)s" - "%(destination)s%(unmodified)s%(post_processed)s." - ) % { - "modified_count": modified_count, - "identifier": "static file" + ("" if modified_count == 1 else "s"), - "action": "symlinked" if self.symlink else "copied", - "destination": ( - " to '%s'" % destination_path if destination_path else "" - ), - "unmodified": ( - ", %s unmodified" % unmodified_count - if collected["unmodified"] - else "" - ), - "post_processed": ( - collected["post_processed"] - and ", %s post-processed" % post_processed_count - or "" - ), - } - - def log(self, msg, level=2): - """ - Small log helper - """ - if self.verbosity >= level: - self.stdout.write(msg) - - def is_local_storage(self): - return isinstance(self.storage, FileSystemStorage) - - def clear_dir(self, path): - """ - Delete the given relative path using the destination storage backend. - """ - if not self.storage.exists(path): - return - - dirs, files = self.storage.listdir(path) - for f in files: - fpath = os.path.join(path, f) - if self.dry_run: - self.log("Pretending to delete '%s'" % fpath, level=1) - else: - self.log("Deleting '%s'" % fpath, level=1) - try: - full_path = self.storage.path(fpath) - except NotImplementedError: - self.storage.delete(fpath) - else: - if not os.path.exists(full_path) and os.path.lexists(full_path): - # Delete broken symlinks - os.unlink(full_path) - else: - self.storage.delete(fpath) - for d in dirs: - self.clear_dir(os.path.join(path, d)) - - def delete_file(self, path, prefixed_path, source_storage): - """ - Check if the target file should be deleted if it already exists. - """ - if self.storage.exists(prefixed_path): - try: - # When was the target file modified last time? - target_last_modified = self.storage.get_modified_time(prefixed_path) - except (OSError, NotImplementedError): - # The storage doesn't support get_modified_time() or failed - pass - else: - try: - # When was the source file modified last time? - source_last_modified = source_storage.get_modified_time(path) - except (OSError, NotImplementedError): - pass - else: - # The full path of the target file - if self.local: - full_path = self.storage.path(prefixed_path) - # If it's --link mode and the path isn't a link (i.e. - # the previous collectstatic wasn't with --link) or if - # it's non-link mode and the path is a link (i.e. the - # previous collectstatic was with --link), the old - # links/files must be deleted so it's not safe to skip - # unmodified files. - can_skip_unmodified_files = not ( - self.symlink ^ os.path.islink(full_path) - ) - else: - # In remote storages, skipping is only based on the - # modified times since symlinks aren't relevant. - can_skip_unmodified_files = True - # Avoid sub-second precision (see #14665, #19540) - file_is_unmodified = target_last_modified.replace( - microsecond=0 - ) >= source_last_modified.replace(microsecond=0) - if file_is_unmodified and can_skip_unmodified_files: - if prefixed_path not in self.unmodified_files: - self.unmodified_files.append(prefixed_path) - self.log("Skipping '%s' (not modified)" % path) - return False - # Then delete the existing file if really needed - if self.dry_run: - self.log("Pretending to delete '%s'" % path) - else: - self.log("Deleting '%s'" % path) - self.storage.delete(prefixed_path) - return True - - def link_file(self, path, prefixed_path, source_storage): - """ - Attempt to link ``path`` - """ - # Skip this file if it was already copied earlier - if prefixed_path in self.symlinked_files: - return self.log("Skipping '%s' (already linked earlier)" % path) - # Delete the target file if needed or break - if not self.delete_file(path, prefixed_path, source_storage): - return - # The full path of the source file - source_path = source_storage.path(path) - # Finally link the file - if self.dry_run: - self.log("Pretending to link '%s'" % source_path, level=1) - else: - self.log("Linking '%s'" % source_path, level=2) - full_path = self.storage.path(prefixed_path) - os.makedirs(os.path.dirname(full_path), exist_ok=True) - try: - if os.path.lexists(full_path): - os.unlink(full_path) - os.symlink(source_path, full_path) - except NotImplementedError: - import platform - - raise CommandError( - "Symlinking is not supported in this " - "platform (%s)." % platform.platform() - ) - except OSError as e: - raise CommandError(e) - if prefixed_path not in self.symlinked_files: - self.symlinked_files.append(prefixed_path) - - def copy_file(self, path, prefixed_path, source_storage): - """ - Attempt to copy ``path`` with storage - """ - # Skip this file if it was already copied earlier - if prefixed_path in self.copied_files: - return self.log("Skipping '%s' (already copied earlier)" % path) - # Delete the target file if needed or break - if not self.delete_file(path, prefixed_path, source_storage): - return - # The full path of the source file - source_path = source_storage.path(path) - # Finally start copying - if self.dry_run: - self.log("Pretending to copy '%s'" % source_path, level=1) - else: - self.log("Copying '%s'" % source_path, level=2) - with source_storage.open(path) as source_file: - self.storage.save(prefixed_path, source_file) - self.copied_files.append(prefixed_path) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/findstatic.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/findstatic.py deleted file mode 100644 index 1caebf8..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/findstatic.py +++ /dev/null @@ -1,48 +0,0 @@ -import os - -from django.contrib.staticfiles import finders -from django.core.management.base import LabelCommand - - -class Command(LabelCommand): - help = "Finds the absolute paths for the given static file(s)." - label = "staticfile" - - def add_arguments(self, parser): - super().add_arguments(parser) - parser.add_argument( - "--first", - action="store_false", - dest="all", - help="Only return the first match for each static file.", - ) - - def handle_label(self, path, **options): - verbosity = options["verbosity"] - result = finders.find(path, find_all=options["all"]) - if verbosity >= 2: - searched_locations = ( - "\nLooking in the following locations:\n %s" - % "\n ".join([str(loc) for loc in finders.searched_locations]) - ) - else: - searched_locations = "" - if result: - if not isinstance(result, (list, tuple)): - result = [result] - result = (os.path.realpath(path) for path in result) - if verbosity >= 1: - file_list = "\n ".join(result) - return "Found '%s' here:\n %s%s" % ( - path, - file_list, - searched_locations, - ) - else: - return "\n".join(result) - else: - message = ["No matching file found for '%s'." % path] - if verbosity >= 2: - message.append(searched_locations) - if verbosity >= 1: - self.stderr.write("\n".join(message)) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/runserver.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/runserver.py deleted file mode 100644 index fd9ddb1..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/runserver.py +++ /dev/null @@ -1,36 +0,0 @@ -from django.conf import settings -from django.contrib.staticfiles.handlers import StaticFilesHandler -from django.core.management.commands.runserver import Command as RunserverCommand - - -class Command(RunserverCommand): - help = ( - "Starts a lightweight web server for development and also serves static files." - ) - - def add_arguments(self, parser): - super().add_arguments(parser) - parser.add_argument( - "--nostatic", - action="store_false", - dest="use_static_handler", - help="Tells Django to NOT automatically serve static files at STATIC_URL.", - ) - parser.add_argument( - "--insecure", - action="store_true", - dest="insecure_serving", - help="Allows serving static files even if DEBUG is False.", - ) - - def get_handler(self, *args, **options): - """ - Return the static files serving handler wrapping the default handler, - if static files should be served. Otherwise return the default handler. - """ - handler = super().get_handler(*args, **options) - use_static_handler = options["use_static_handler"] - insecure_serving = options["insecure_serving"] - if use_static_handler and (settings.DEBUG or insecure_serving): - return StaticFilesHandler(handler) - return handler diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/storage.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/storage.py deleted file mode 100644 index dfc3137..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/storage.py +++ /dev/null @@ -1,545 +0,0 @@ -import json -import os -import posixpath -import re -from hashlib import md5 -from urllib.parse import unquote, urldefrag, urlsplit, urlunsplit - -from django.conf import STATICFILES_STORAGE_ALIAS, settings -from django.contrib.staticfiles.utils import check_settings, matches_patterns -from django.core.exceptions import ImproperlyConfigured -from django.core.files.base import ContentFile -from django.core.files.storage import FileSystemStorage, storages -from django.utils.functional import LazyObject - - -class StaticFilesStorage(FileSystemStorage): - """ - Standard file system storage for static files. - - The defaults for ``location`` and ``base_url`` are - ``STATIC_ROOT`` and ``STATIC_URL``. - """ - - def __init__(self, location=None, base_url=None, *args, **kwargs): - if location is None: - location = settings.STATIC_ROOT - if base_url is None: - base_url = settings.STATIC_URL - check_settings(base_url) - super().__init__(location, base_url, *args, **kwargs) - # FileSystemStorage fallbacks to MEDIA_ROOT when location - # is empty, so we restore the empty value. - if not location: - self.base_location = None - self.location = None - - def path(self, name): - if not self.location: - raise ImproperlyConfigured( - "You're using the staticfiles app " - "without having set the STATIC_ROOT " - "setting to a filesystem path." - ) - return super().path(name) - - -class HashedFilesMixin: - default_template = """url("%(url)s")""" - max_post_process_passes = 5 - support_js_module_import_aggregation = False - _js_module_import_aggregation_patterns = ( - "*.js", - ( - ( - ( - r"""(?Pimport""" - r"""(?s:(?P[\s\{].*?|\*\s*as\s*\w+))""" - r"""\s*from\s*['"](?P[./].*?)["']\s*;)""" - ), - """import%(import)s from "%(url)s";""", - ), - ( - ( - r"""(?Pexport(?s:(?P[\s\{].*?))""" - r"""\s*from\s*["'](?P[./].*?)["']\s*;)""" - ), - """export%(exports)s from "%(url)s";""", - ), - ( - r"""(?Pimport\s*['"](?P[./].*?)["']\s*;)""", - """import"%(url)s";""", - ), - ( - r"""(?Pimport\(["'](?P.*?)["']\))""", - """import("%(url)s")""", - ), - ), - ) - patterns = ( - ( - "*.css", - ( - r"""(?Purl\(['"]{0,1}\s*(?P.*?)["']{0,1}\))""", - ( - r"""(?P@import\s*["']\s*(?P.*?)["'])""", - """@import url("%(url)s")""", - ), - ( - ( - r"(?m)^(?P/\*#[ \t]" - r"(?-i:sourceMappingURL)=(?P.*)[ \t]*\*/)$" - ), - "/*# sourceMappingURL=%(url)s */", - ), - ), - ), - ( - "*.js", - ( - ( - r"(?m)^(?P//# (?-i:sourceMappingURL)=(?P.*))$", - "//# sourceMappingURL=%(url)s", - ), - ), - ), - ) - keep_intermediate_files = True - - def __init__(self, *args, **kwargs): - if self.support_js_module_import_aggregation: - self.patterns += (self._js_module_import_aggregation_patterns,) - super().__init__(*args, **kwargs) - self._patterns = {} - self.hashed_files = {} - for extension, patterns in self.patterns: - for pattern in patterns: - if isinstance(pattern, (tuple, list)): - pattern, template = pattern - else: - template = self.default_template - compiled = re.compile(pattern, re.IGNORECASE) - self._patterns.setdefault(extension, []).append((compiled, template)) - - def file_hash(self, name, content=None): - """ - Return a hash of the file with the given name and optional content. - """ - if content is None: - return None - hasher = md5(usedforsecurity=False) - for chunk in content.chunks(): - hasher.update(chunk) - return hasher.hexdigest()[:12] - - def hashed_name(self, name, content=None, filename=None): - # `filename` is the name of file to hash if `content` isn't given. - # `name` is the base name to construct the new hashed filename from. - parsed_name = urlsplit(unquote(name)) - clean_name = parsed_name.path.strip() - filename = (filename and urlsplit(unquote(filename)).path.strip()) or clean_name - opened = content is None - if opened: - if not self.exists(filename): - raise ValueError( - "The file '%s' could not be found with %r." % (filename, self) - ) - try: - content = self.open(filename) - except OSError: - # Handle directory paths and fragments - return name - try: - file_hash = self.file_hash(clean_name, content) - finally: - if opened: - content.close() - path, filename = os.path.split(clean_name) - root, ext = os.path.splitext(filename) - file_hash = (".%s" % file_hash) if file_hash else "" - hashed_name = os.path.join(path, "%s%s%s" % (root, file_hash, ext)) - unparsed_name = list(parsed_name) - unparsed_name[2] = hashed_name - # Special casing for a @font-face hack, like url(myfont.eot?#iefix") - # http://www.fontspring.com/blog/the-new-bulletproof-font-face-syntax - if "?#" in name and not unparsed_name[3]: - unparsed_name[2] += "?" - return urlunsplit(unparsed_name) - - def _url(self, hashed_name_func, name, force=False, hashed_files=None): - """ - Return the non-hashed URL in DEBUG mode. - """ - if settings.DEBUG and not force: - hashed_name, fragment = name, "" - else: - clean_name, fragment = urldefrag(name) - if urlsplit(clean_name).path.endswith("/"): # don't hash paths - hashed_name = name - else: - args = (clean_name,) - if hashed_files is not None: - args += (hashed_files,) - hashed_name = hashed_name_func(*args) - - final_url = super().url(hashed_name) - - # Special casing for a @font-face hack, like url(myfont.eot?#iefix") - # http://www.fontspring.com/blog/the-new-bulletproof-font-face-syntax - query_fragment = "?#" in name # [sic!] - if fragment or query_fragment: - urlparts = list(urlsplit(final_url)) - if fragment and not urlparts[4]: - urlparts[4] = fragment - if query_fragment and not urlparts[3]: - urlparts[2] += "?" - final_url = urlunsplit(urlparts) - - return unquote(final_url) - - def url(self, name, force=False): - """ - Return the non-hashed URL in DEBUG mode. - """ - return self._url(self.stored_name, name, force) - - def url_converter(self, name, hashed_files, template=None): - """ - Return the custom URL converter for the given file name. - """ - if template is None: - template = self.default_template - - def converter(matchobj): - """ - Convert the matched URL to a normalized and hashed URL. - - This requires figuring out which files the matched URL resolves - to and calling the url() method of the storage. - """ - matches = matchobj.groupdict() - matched = matches["matched"] - url = matches["url"] - - # Ignore absolute/protocol-relative and data-uri URLs. - if re.match(r"^[a-z]+:", url) or url.startswith("//"): - return matched - - # Ignore absolute URLs that don't point to a static file (dynamic - # CSS / JS?). Note that STATIC_URL cannot be empty. - if url.startswith("/") and not url.startswith(settings.STATIC_URL): - return matched - - # Strip off the fragment so a path-like fragment won't interfere. - url_path, fragment = urldefrag(url) - - # Ignore URLs without a path - if not url_path: - return matched - - if url_path.startswith("/"): - # Otherwise the condition above would have returned prematurely. - assert url_path.startswith(settings.STATIC_URL) - target_name = url_path.removeprefix(settings.STATIC_URL) - else: - # We're using the posixpath module to mix paths and URLs conveniently. - source_name = name if os.sep == "/" else name.replace(os.sep, "/") - target_name = posixpath.join(posixpath.dirname(source_name), url_path) - - # Determine the hashed name of the target file with the storage backend. - hashed_url = self._url( - self._stored_name, - unquote(target_name), - force=True, - hashed_files=hashed_files, - ) - - transformed_url = "/".join( - url_path.split("/")[:-1] + hashed_url.split("/")[-1:] - ) - - # Restore the fragment that was stripped off earlier. - if fragment: - transformed_url += ("?#" if "?#" in url else "#") + fragment - - # Return the hashed version to the file - matches["url"] = unquote(transformed_url) - return template % matches - - return converter - - def post_process(self, paths, dry_run=False, **options): - """ - Post process the given dictionary of files (called from collectstatic). - - Processing is actually two separate operations: - - 1. renaming files to include a hash of their content for cache-busting, - and copying those files to the target storage. - 2. adjusting files which contain references to other files so they - refer to the cache-busting filenames. - - If either of these are performed on a file, then that file is considered - post-processed. - """ - # don't even dare to process the files if we're in dry run mode - if dry_run: - return - - # where to store the new paths - hashed_files = {} - - # build a list of adjustable files - adjustable_paths = [ - path for path in paths if matches_patterns(path, self._patterns) - ] - - # Adjustable files to yield at end, keyed by the original path. - processed_adjustable_paths = {} - - # Do a single pass first. Post-process all files once, yielding not - # adjustable files and exceptions, and collecting adjustable files. - for name, hashed_name, processed, _ in self._post_process( - paths, adjustable_paths, hashed_files - ): - if name not in adjustable_paths or isinstance(processed, Exception): - yield name, hashed_name, processed - else: - processed_adjustable_paths[name] = (name, hashed_name, processed) - - paths = {path: paths[path] for path in adjustable_paths} - unresolved_paths = [] - for i in range(self.max_post_process_passes): - unresolved_paths = [] - for name, hashed_name, processed, subst in self._post_process( - paths, adjustable_paths, hashed_files - ): - # Overwrite since hashed_name may be newer. - processed_adjustable_paths[name] = (name, hashed_name, processed) - if subst: - unresolved_paths.append(name) - - if not unresolved_paths: - break - - if unresolved_paths: - problem_paths = ", ".join(sorted(unresolved_paths)) - yield problem_paths, None, RuntimeError("Max post-process passes exceeded.") - - # Store the processed paths - self.hashed_files.update(hashed_files) - - # Yield adjustable files with final, hashed name. - yield from processed_adjustable_paths.values() - - def _post_process(self, paths, adjustable_paths, hashed_files): - # Sort the files by directory level - def path_level(name): - return len(name.split(os.sep)) - - for name in sorted(paths, key=path_level, reverse=True): - substitutions = True - # use the original, local file, not the copied-but-unprocessed - # file, which might be somewhere far away, like S3 - storage, path = paths[name] - with storage.open(path) as original_file: - cleaned_name = self.clean_name(name) - hash_key = self.hash_key(cleaned_name) - - # generate the hash with the original content, even for - # adjustable files. - if hash_key not in hashed_files: - hashed_name = self.hashed_name(name, original_file) - else: - hashed_name = hashed_files[hash_key] - - # then get the original's file content.. - if hasattr(original_file, "seek"): - original_file.seek(0) - - hashed_file_exists = self.exists(hashed_name) - processed = False - - # ..to apply each replacement pattern to the content - if name in adjustable_paths: - old_hashed_name = hashed_name - try: - content = original_file.read().decode("utf-8") - except UnicodeDecodeError as exc: - yield name, None, exc, False - for extension, patterns in self._patterns.items(): - if matches_patterns(path, (extension,)): - for pattern, template in patterns: - converter = self.url_converter( - name, hashed_files, template - ) - try: - content = pattern.sub(converter, content) - except ValueError as exc: - yield name, None, exc, False - if hashed_file_exists: - self.delete(hashed_name) - # then save the processed result - content_file = ContentFile(content.encode()) - if self.keep_intermediate_files: - # Save intermediate file for reference - self._save(hashed_name, content_file) - hashed_name = self.hashed_name(name, content_file) - - if self.exists(hashed_name): - self.delete(hashed_name) - - saved_name = self._save(hashed_name, content_file) - hashed_name = self.clean_name(saved_name) - # If the file hash stayed the same, this file didn't change - if old_hashed_name == hashed_name: - substitutions = False - processed = True - - if not processed: - # or handle the case in which neither processing nor - # a change to the original file happened - if not hashed_file_exists: - processed = True - saved_name = self._save(hashed_name, original_file) - hashed_name = self.clean_name(saved_name) - - # and then set the cache accordingly - hashed_files[hash_key] = hashed_name - - yield name, hashed_name, processed, substitutions - - def clean_name(self, name): - return name.replace("\\", "/") - - def hash_key(self, name): - return name - - def _stored_name(self, name, hashed_files): - # Normalize the path to avoid multiple names for the same file like - # ../foo/bar.css and ../foo/../foo/bar.css which normalize to the same - # path. - name = posixpath.normpath(name) - cleaned_name = self.clean_name(name) - hash_key = self.hash_key(cleaned_name) - cache_name = hashed_files.get(hash_key) - if cache_name is None: - cache_name = self.clean_name(self.hashed_name(name)) - return cache_name - - def stored_name(self, name): - cleaned_name = self.clean_name(name) - hash_key = self.hash_key(cleaned_name) - cache_name = self.hashed_files.get(hash_key) - if cache_name: - return cache_name - # No cached name found, recalculate it from the files. - intermediate_name = name - for i in range(self.max_post_process_passes + 1): - cache_name = self.clean_name( - self.hashed_name(name, content=None, filename=intermediate_name) - ) - if intermediate_name == cache_name: - # Store the hashed name if there was a miss. - self.hashed_files[hash_key] = cache_name - return cache_name - else: - # Move on to the next intermediate file. - intermediate_name = cache_name - # If the cache name can't be determined after the max number of passes, - # the intermediate files on disk may be corrupt; avoid an infinite loop. - raise ValueError("The name '%s' could not be hashed with %r." % (name, self)) - - -class ManifestFilesMixin(HashedFilesMixin): - manifest_version = "1.1" # the manifest format standard - manifest_name = "staticfiles.json" - manifest_strict = True - keep_intermediate_files = False - - def __init__(self, *args, manifest_storage=None, **kwargs): - super().__init__(*args, **kwargs) - if manifest_storage is None: - manifest_storage = self - self.manifest_storage = manifest_storage - self.hashed_files, self.manifest_hash = self.load_manifest() - - def read_manifest(self): - try: - with self.manifest_storage.open(self.manifest_name) as manifest: - return manifest.read().decode() - except FileNotFoundError: - return None - - def load_manifest(self): - content = self.read_manifest() - if content is None: - return {}, "" - try: - stored = json.loads(content) - except json.JSONDecodeError: - pass - else: - version = stored.get("version") - if version in ("1.0", "1.1"): - return stored.get("paths", {}), stored.get("hash", "") - raise ValueError( - "Couldn't load manifest '%s' (version %s)" - % (self.manifest_name, self.manifest_version) - ) - - def post_process(self, *args, **kwargs): - self.hashed_files = {} - yield from super().post_process(*args, **kwargs) - if not kwargs.get("dry_run"): - self.save_manifest() - - def save_manifest(self): - self.manifest_hash = self.file_hash( - None, ContentFile(json.dumps(sorted(self.hashed_files.items())).encode()) - ) - payload = { - "paths": self.hashed_files, - "version": self.manifest_version, - "hash": self.manifest_hash, - } - if self.manifest_storage.exists(self.manifest_name): - self.manifest_storage.delete(self.manifest_name) - contents = json.dumps(payload).encode() - self.manifest_storage._save(self.manifest_name, ContentFile(contents)) - - def stored_name(self, name): - parsed_name = urlsplit(unquote(name)) - clean_name = parsed_name.path.strip() - hash_key = self.hash_key(clean_name) - cache_name = self.hashed_files.get(hash_key) - if cache_name is None: - if self.manifest_strict: - raise ValueError( - "Missing staticfiles manifest entry for '%s'" % clean_name - ) - cache_name = self.clean_name(self.hashed_name(name)) - unparsed_name = list(parsed_name) - unparsed_name[2] = cache_name - # Special casing for a @font-face hack, like url(myfont.eot?#iefix") - # http://www.fontspring.com/blog/the-new-bulletproof-font-face-syntax - if "?#" in name and not unparsed_name[3]: - unparsed_name[2] += "?" - return urlunsplit(unparsed_name) - - -class ManifestStaticFilesStorage(ManifestFilesMixin, StaticFilesStorage): - """ - A static file system storage backend which also saves - hashed copies of the files it saves. - """ - - pass - - -class ConfiguredStorage(LazyObject): - def _setup(self): - self._wrapped = storages[STATICFILES_STORAGE_ALIAS] - - -staticfiles_storage = ConfiguredStorage() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/testing.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/testing.py deleted file mode 100644 index 546a24a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/testing.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.contrib.staticfiles.handlers import StaticFilesHandler -from django.test import LiveServerTestCase - - -class StaticLiveServerTestCase(LiveServerTestCase): - """ - Extend django.test.LiveServerTestCase to transparently overlay at test - execution-time the assets provided by the staticfiles app finders. This - means you don't need to run collectstatic before or as a part of your tests - setup. - """ - - static_handler = StaticFilesHandler diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/urls.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/urls.py deleted file mode 100644 index 6278f35..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/urls.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.conf import settings -from django.conf.urls.static import static -from django.contrib.staticfiles.views import serve - -urlpatterns = [] - - -def staticfiles_urlpatterns(prefix=None): - """ - Helper function to return a URL pattern for serving static files. - """ - if prefix is None: - prefix = settings.STATIC_URL - return static(prefix, view=serve) - - -# Only append if urlpatterns are empty -if settings.DEBUG and not urlpatterns: - urlpatterns += staticfiles_urlpatterns() diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/utils.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/utils.py deleted file mode 100644 index efd67ac..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/utils.py +++ /dev/null @@ -1,71 +0,0 @@ -import fnmatch -import os - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured - - -def matches_patterns(path, patterns): - """ - Return True or False depending on whether the ``path`` should be - ignored (if it matches any pattern in ``ignore_patterns``). - """ - return any(fnmatch.fnmatchcase(path, pattern) for pattern in patterns) - - -def get_files(storage, ignore_patterns=None, location=""): - """ - Recursively walk the storage directories yielding the paths - of all files that should be copied. - """ - if ignore_patterns is None: - ignore_patterns = [] - directories, files = storage.listdir(location) - for fn in files: - # Match only the basename. - if matches_patterns(fn, ignore_patterns): - continue - if location: - fn = os.path.join(location, fn) - # Match the full file path. - if matches_patterns(fn, ignore_patterns): - continue - yield fn - for dir in directories: - if matches_patterns(dir, ignore_patterns): - continue - if location: - dir = os.path.join(location, dir) - yield from get_files(storage, ignore_patterns, dir) - - -def check_settings(base_url=None): - """ - Check if the staticfiles settings have sane values. - """ - if base_url is None: - base_url = settings.STATIC_URL - if not base_url: - raise ImproperlyConfigured( - "You're using the staticfiles app " - "without having set the required STATIC_URL setting." - ) - if settings.MEDIA_URL == base_url: - raise ImproperlyConfigured( - "The MEDIA_URL and STATIC_URL settings must have different values" - ) - if ( - settings.DEBUG - and settings.MEDIA_URL - and settings.STATIC_URL - and settings.MEDIA_URL.startswith(settings.STATIC_URL) - ): - raise ImproperlyConfigured( - "runserver can't serve media if MEDIA_URL is within STATIC_URL." - ) - if (settings.MEDIA_ROOT and settings.STATIC_ROOT) and ( - settings.MEDIA_ROOT == settings.STATIC_ROOT - ): - raise ImproperlyConfigured( - "The MEDIA_ROOT and STATIC_ROOT settings must have different values" - ) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/views.py b/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/views.py deleted file mode 100644 index 3fb2677..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/staticfiles/views.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Views and functions for serving static files. These are only to be used during -development, and SHOULD NOT be used in a production setting. - -""" - -import os -import posixpath - -from django.conf import settings -from django.contrib.staticfiles import finders -from django.http import Http404 -from django.views import static - - -def serve(request, path, insecure=False, **kwargs): - """ - Serve static files below a given point in the directory structure or - from locations inferred from the staticfiles finders. - - To use, put a URL pattern such as:: - - from django.contrib.staticfiles import views - - path('', views.serve) - - in your URLconf. - - It uses the django.views.static.serve() view to serve the found files. - """ - if not settings.DEBUG and not insecure: - raise Http404 - normalized_path = posixpath.normpath(path).lstrip("/") - absolute_path = finders.find(normalized_path) - if not absolute_path: - if path.endswith("/") or path == "": - raise Http404("Directory indexes are not allowed here.") - raise Http404("'%s' could not be found" % path) - document_root, path = os.path.split(absolute_path) - return static.serve(request, path, document_root=document_root, **kwargs) diff --git a/.venv/lib/python3.10/site-packages/django/contrib/syndication/__init__.py b/.venv/lib/python3.10/site-packages/django/contrib/syndication/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/contrib/syndication/apps.py b/.venv/lib/python3.10/site-packages/django/contrib/syndication/apps.py deleted file mode 100644 index bb0f86a..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/syndication/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.apps import AppConfig -from django.utils.translation import gettext_lazy as _ - - -class SyndicationConfig(AppConfig): - name = "django.contrib.syndication" - verbose_name = _("Syndication") diff --git a/.venv/lib/python3.10/site-packages/django/contrib/syndication/views.py b/.venv/lib/python3.10/site-packages/django/contrib/syndication/views.py deleted file mode 100644 index 0947ab2..0000000 --- a/.venv/lib/python3.10/site-packages/django/contrib/syndication/views.py +++ /dev/null @@ -1,235 +0,0 @@ -from inspect import getattr_static, unwrap - -from django.contrib.sites.shortcuts import get_current_site -from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist -from django.http import Http404, HttpResponse -from django.template import TemplateDoesNotExist, loader -from django.utils import feedgenerator -from django.utils.encoding import iri_to_uri -from django.utils.html import escape -from django.utils.http import http_date -from django.utils.timezone import get_default_timezone, is_naive, make_aware -from django.utils.translation import get_language - - -def add_domain(domain, url, secure=False): - protocol = "https" if secure else "http" - if url.startswith("//"): - # Support network-path reference (see #16753) - RSS requires a protocol - url = "%s:%s" % (protocol, url) - elif not url.startswith(("http://", "https://", "mailto:")): - url = iri_to_uri("%s://%s%s" % (protocol, domain, url)) - return url - - -class FeedDoesNotExist(ObjectDoesNotExist): - pass - - -class Feed: - feed_type = feedgenerator.DefaultFeed - title_template = None - description_template = None - language = None - - def __call__(self, request, *args, **kwargs): - try: - obj = self.get_object(request, *args, **kwargs) - except ObjectDoesNotExist: - raise Http404("Feed object does not exist.") - feedgen = self.get_feed(obj, request) - response = HttpResponse(content_type=feedgen.content_type) - if hasattr(self, "item_pubdate") or hasattr(self, "item_updateddate"): - # if item_pubdate or item_updateddate is defined for the feed, set - # header so as ConditionalGetMiddleware is able to send 304 NOT MODIFIED - response.headers["Last-Modified"] = http_date( - feedgen.latest_post_date().timestamp() - ) - feedgen.write(response, "utf-8") - return response - - def item_title(self, item): - # Titles should be double escaped by default (see #6533) - return escape(str(item)) - - def item_description(self, item): - return str(item) - - def item_link(self, item): - try: - return item.get_absolute_url() - except AttributeError: - raise ImproperlyConfigured( - "Give your %s class a get_absolute_url() method, or define an " - "item_link() method in your Feed class." % item.__class__.__name__ - ) - - def item_enclosures(self, item): - enc_url = self._get_dynamic_attr("item_enclosure_url", item) - if enc_url: - enc = feedgenerator.Enclosure( - url=str(enc_url), - length=str(self._get_dynamic_attr("item_enclosure_length", item)), - mime_type=str(self._get_dynamic_attr("item_enclosure_mime_type", item)), - ) - return [enc] - return [] - - def _get_dynamic_attr(self, attname, obj, default=None): - try: - attr = getattr(self, attname) - except AttributeError: - return default - if callable(attr): - # Check co_argcount rather than try/excepting the function and - # catching the TypeError, because something inside the function - # may raise the TypeError. This technique is more accurate. - func = unwrap(attr) - try: - code = func.__code__ - except AttributeError: - func = unwrap(attr.__call__) - code = func.__code__ - # If function doesn't have arguments and it is not a static method, - # it was decorated without using @functools.wraps. - if not code.co_argcount and not isinstance( - getattr_static(self, func.__name__, None), staticmethod - ): - raise ImproperlyConfigured( - f"Feed method {attname!r} decorated by {func.__name__!r} needs to " - f"use @functools.wraps." - ) - if code.co_argcount == 2: # one argument is 'self' - return attr(obj) - else: - return attr() - return attr - - def feed_extra_kwargs(self, obj): - """ - Return an extra keyword arguments dictionary that is used when - initializing the feed generator. - """ - return {} - - def item_extra_kwargs(self, item): - """ - Return an extra keyword arguments dictionary that is used with - the `add_item` call of the feed generator. - """ - return {} - - def get_object(self, request, *args, **kwargs): - return None - - def get_context_data(self, **kwargs): - """ - Return a dictionary to use as extra context if either - ``self.description_template`` or ``self.item_template`` are used. - - Default implementation preserves the old behavior - of using {'obj': item, 'site': current_site} as the context. - """ - return {"obj": kwargs.get("item"), "site": kwargs.get("site")} - - def get_feed(self, obj, request): - """ - Return a feedgenerator.DefaultFeed object, fully populated, for - this feed. Raise FeedDoesNotExist for invalid parameters. - """ - current_site = get_current_site(request) - - link = self._get_dynamic_attr("link", obj) - link = add_domain(current_site.domain, link, request.is_secure()) - - feed = self.feed_type( - title=self._get_dynamic_attr("title", obj), - subtitle=self._get_dynamic_attr("subtitle", obj), - link=link, - description=self._get_dynamic_attr("description", obj), - language=self.language or get_language(), - feed_url=add_domain( - current_site.domain, - self._get_dynamic_attr("feed_url", obj) or request.path, - request.is_secure(), - ), - author_name=self._get_dynamic_attr("author_name", obj), - author_link=self._get_dynamic_attr("author_link", obj), - author_email=self._get_dynamic_attr("author_email", obj), - categories=self._get_dynamic_attr("categories", obj), - feed_copyright=self._get_dynamic_attr("feed_copyright", obj), - feed_guid=self._get_dynamic_attr("feed_guid", obj), - ttl=self._get_dynamic_attr("ttl", obj), - stylesheets=self._get_dynamic_attr("stylesheets", obj), - **self.feed_extra_kwargs(obj), - ) - - title_tmp = None - if self.title_template is not None: - try: - title_tmp = loader.get_template(self.title_template) - except TemplateDoesNotExist: - pass - - description_tmp = None - if self.description_template is not None: - try: - description_tmp = loader.get_template(self.description_template) - except TemplateDoesNotExist: - pass - - for item in self._get_dynamic_attr("items", obj): - context = self.get_context_data( - item=item, site=current_site, obj=obj, request=request - ) - if title_tmp is not None: - title = title_tmp.render(context, request) - else: - title = self._get_dynamic_attr("item_title", item) - if description_tmp is not None: - description = description_tmp.render(context, request) - else: - description = self._get_dynamic_attr("item_description", item) - link = add_domain( - current_site.domain, - self._get_dynamic_attr("item_link", item), - request.is_secure(), - ) - enclosures = self._get_dynamic_attr("item_enclosures", item) - author_name = self._get_dynamic_attr("item_author_name", item) - if author_name is not None: - author_email = self._get_dynamic_attr("item_author_email", item) - author_link = self._get_dynamic_attr("item_author_link", item) - else: - author_email = author_link = None - - tz = get_default_timezone() - - pubdate = self._get_dynamic_attr("item_pubdate", item) - if pubdate and is_naive(pubdate): - pubdate = make_aware(pubdate, tz) - - updateddate = self._get_dynamic_attr("item_updateddate", item) - if updateddate and is_naive(updateddate): - updateddate = make_aware(updateddate, tz) - - feed.add_item( - title=title, - link=link, - description=description, - unique_id=self._get_dynamic_attr("item_guid", item, link), - unique_id_is_permalink=self._get_dynamic_attr( - "item_guid_is_permalink", item - ), - enclosures=enclosures, - pubdate=pubdate, - updateddate=updateddate, - author_name=author_name, - author_email=author_email, - author_link=author_link, - comments=self._get_dynamic_attr("item_comments", item), - categories=self._get_dynamic_attr("item_categories", item), - item_copyright=self._get_dynamic_attr("item_copyright", item), - **self.item_extra_kwargs(item), - ) - return feed diff --git a/.venv/lib/python3.10/site-packages/django/core/__init__.py b/.venv/lib/python3.10/site-packages/django/core/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/core/asgi.py b/.venv/lib/python3.10/site-packages/django/core/asgi.py deleted file mode 100644 index 0d846cc..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/asgi.py +++ /dev/null @@ -1,13 +0,0 @@ -import django -from django.core.handlers.asgi import ASGIHandler - - -def get_asgi_application(): - """ - The public interface to Django's ASGI support. Return an ASGI 3 callable. - - Avoids making django.core.handlers.ASGIHandler a public API, in case the - internal implementation changes or moves in the future. - """ - django.setup(set_prefix=False) - return ASGIHandler() diff --git a/.venv/lib/python3.10/site-packages/django/core/cache/__init__.py b/.venv/lib/python3.10/site-packages/django/core/cache/__init__.py deleted file mode 100644 index 444d958..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/cache/__init__.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -Caching framework. - -This package defines set of cache backends that all conform to a simple API. -In a nutshell, a cache is a set of values -- which can be any object that -may be pickled -- identified by string keys. For the complete API, see -the abstract BaseCache class in django.core.cache.backends.base. - -Client code should use the `cache` variable defined here to access the default -cache backend and look up non-default cache backends in the `caches` dict-like -object. - -See docs/topics/cache.txt for information on the public API. -""" - -from django.core import signals -from django.core.cache.backends.base import ( - BaseCache, - CacheKeyWarning, - InvalidCacheBackendError, - InvalidCacheKey, -) -from django.utils.connection import BaseConnectionHandler, ConnectionProxy -from django.utils.module_loading import import_string - -__all__ = [ - "cache", - "caches", - "DEFAULT_CACHE_ALIAS", - "InvalidCacheBackendError", - "CacheKeyWarning", - "BaseCache", - "InvalidCacheKey", -] - -DEFAULT_CACHE_ALIAS = "default" - - -class CacheHandler(BaseConnectionHandler): - settings_name = "CACHES" - exception_class = InvalidCacheBackendError - - def create_connection(self, alias): - params = self.settings[alias].copy() - backend = params.pop("BACKEND") - location = params.pop("LOCATION", "") - try: - backend_cls = import_string(backend) - except ImportError as e: - raise InvalidCacheBackendError( - "Could not find backend '%s': %s" % (backend, e) - ) from e - return backend_cls(location, params) - - -caches = CacheHandler() - -cache = ConnectionProxy(caches, DEFAULT_CACHE_ALIAS) - - -def close_caches(**kwargs): - # Some caches need to do a cleanup at the end of a request cycle. If not - # implemented in a particular backend cache.close() is a no-op. - caches.close_all() - - -signals.request_finished.connect(close_caches) diff --git a/.venv/lib/python3.10/site-packages/django/core/cache/backends/__init__.py b/.venv/lib/python3.10/site-packages/django/core/cache/backends/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/core/cache/backends/base.py b/.venv/lib/python3.10/site-packages/django/core/cache/backends/base.py deleted file mode 100644 index 1111fdb..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/cache/backends/base.py +++ /dev/null @@ -1,406 +0,0 @@ -"Base Cache class." - -import time -import warnings - -from asgiref.sync import sync_to_async - -from django.core.exceptions import ImproperlyConfigured -from django.utils.module_loading import import_string -from django.utils.regex_helper import _lazy_re_compile - - -class InvalidCacheBackendError(ImproperlyConfigured): - pass - - -class CacheKeyWarning(RuntimeWarning): - pass - - -class InvalidCacheKey(ValueError): - pass - - -# Stub class to ensure not passing in a `timeout` argument results in -# the default timeout -DEFAULT_TIMEOUT = object() - -# Memcached does not accept keys longer than this. -MEMCACHE_MAX_KEY_LENGTH = 250 - - -def default_key_func(key, key_prefix, version): - """ - Default function to generate keys. - - Construct the key used by all other methods. By default, prepend - the `key_prefix`. KEY_FUNCTION can be used to specify an alternate - function with custom key making behavior. - """ - return "%s:%s:%s" % (key_prefix, version, key) - - -def get_key_func(key_func): - """ - Function to decide which key function to use. - - Default to ``default_key_func``. - """ - if key_func is not None: - if callable(key_func): - return key_func - else: - return import_string(key_func) - return default_key_func - - -class BaseCache: - _missing_key = object() - - def __init__(self, params): - timeout = params.get("timeout", params.get("TIMEOUT", 300)) - if timeout is not None: - try: - timeout = int(timeout) - except (ValueError, TypeError): - timeout = 300 - self.default_timeout = timeout - - options = params.get("OPTIONS", {}) - max_entries = params.get("max_entries", options.get("MAX_ENTRIES", 300)) - try: - self._max_entries = int(max_entries) - except (ValueError, TypeError): - self._max_entries = 300 - - cull_frequency = params.get("cull_frequency", options.get("CULL_FREQUENCY", 3)) - try: - self._cull_frequency = int(cull_frequency) - except (ValueError, TypeError): - self._cull_frequency = 3 - - self.key_prefix = params.get("KEY_PREFIX", "") - self.version = params.get("VERSION", 1) - self.key_func = get_key_func(params.get("KEY_FUNCTION")) - - def get_backend_timeout(self, timeout=DEFAULT_TIMEOUT): - """ - Return the timeout value usable by this backend based upon the provided - timeout. - """ - if timeout == DEFAULT_TIMEOUT: - timeout = self.default_timeout - elif timeout == 0: - # ticket 21147 - avoid time.time() related precision issues - timeout = -1 - return None if timeout is None else time.time() + timeout - - def make_key(self, key, version=None): - """ - Construct the key used by all other methods. By default, use the - key_func to generate a key (which, by default, prepends the - `key_prefix' and 'version'). A different key function can be provided - at the time of cache construction; alternatively, you can subclass the - cache backend to provide custom key making behavior. - """ - if version is None: - version = self.version - - return self.key_func(key, self.key_prefix, version) - - def validate_key(self, key): - """ - Warn about keys that would not be portable to the memcached - backend. This encourages (but does not force) writing backend-portable - cache code. - """ - for warning in memcache_key_warnings(key): - warnings.warn(warning, CacheKeyWarning) - - def make_and_validate_key(self, key, version=None): - """Helper to make and validate keys.""" - key = self.make_key(key, version=version) - self.validate_key(key) - return key - - def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - """ - Set a value in the cache if the key does not already exist. If - timeout is given, use that timeout for the key; otherwise use the - default cache timeout. - - Return True if the value was stored, False otherwise. - """ - raise NotImplementedError( - "subclasses of BaseCache must provide an add() method" - ) - - async def aadd(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - return await sync_to_async(self.add, thread_sensitive=True)( - key, value, timeout, version - ) - - def get(self, key, default=None, version=None): - """ - Fetch a given key from the cache. If the key does not exist, return - default, which itself defaults to None. - """ - raise NotImplementedError("subclasses of BaseCache must provide a get() method") - - async def aget(self, key, default=None, version=None): - return await sync_to_async(self.get, thread_sensitive=True)( - key, default, version - ) - - def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - """ - Set a value in the cache. If timeout is given, use that timeout for the - key; otherwise use the default cache timeout. - """ - raise NotImplementedError("subclasses of BaseCache must provide a set() method") - - async def aset(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - return await sync_to_async(self.set, thread_sensitive=True)( - key, value, timeout, version - ) - - def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): - """ - Update the key's expiry time using timeout. Return True if successful - or False if the key does not exist. - """ - raise NotImplementedError( - "subclasses of BaseCache must provide a touch() method" - ) - - async def atouch(self, key, timeout=DEFAULT_TIMEOUT, version=None): - return await sync_to_async(self.touch, thread_sensitive=True)( - key, timeout, version - ) - - def delete(self, key, version=None): - """ - Delete a key from the cache and return whether it succeeded, failing - silently. - """ - raise NotImplementedError( - "subclasses of BaseCache must provide a delete() method" - ) - - async def adelete(self, key, version=None): - return await sync_to_async(self.delete, thread_sensitive=True)(key, version) - - def get_many(self, keys, version=None): - """ - Fetch a bunch of keys from the cache. For certain backends (memcached, - pgsql) this can be *much* faster when fetching multiple values. - - Return a dict mapping each key in keys to its value. If the given - key is missing, it will be missing from the response dict. - """ - d = {} - for k in keys: - val = self.get(k, self._missing_key, version=version) - if val is not self._missing_key: - d[k] = val - return d - - async def aget_many(self, keys, version=None): - """See get_many().""" - d = {} - for k in keys: - val = await self.aget(k, self._missing_key, version=version) - if val is not self._missing_key: - d[k] = val - return d - - def get_or_set(self, key, default, timeout=DEFAULT_TIMEOUT, version=None): - """ - Fetch a given key from the cache. If the key does not exist, - add the key and set it to the default value. The default value can - also be any callable. If timeout is given, use that timeout for the - key; otherwise use the default cache timeout. - - Return the value of the key stored or retrieved. - """ - val = self.get(key, self._missing_key, version=version) - if val is self._missing_key: - if callable(default): - default = default() - self.add(key, default, timeout=timeout, version=version) - # Fetch the value again to avoid a race condition if another caller - # added a value between the first get() and the add() above. - return self.get(key, default, version=version) - return val - - async def aget_or_set(self, key, default, timeout=DEFAULT_TIMEOUT, version=None): - """See get_or_set().""" - val = await self.aget(key, self._missing_key, version=version) - if val is self._missing_key: - if callable(default): - default = default() - await self.aadd(key, default, timeout=timeout, version=version) - # Fetch the value again to avoid a race condition if another caller - # added a value between the first aget() and the aadd() above. - return await self.aget(key, default, version=version) - return val - - def has_key(self, key, version=None): - """ - Return True if the key is in the cache and has not expired. - """ - return ( - self.get(key, self._missing_key, version=version) is not self._missing_key - ) - - async def ahas_key(self, key, version=None): - return ( - await self.aget(key, self._missing_key, version=version) - is not self._missing_key - ) - - def incr(self, key, delta=1, version=None): - """ - Add delta to value in the cache. If the key does not exist, raise a - ValueError exception. - """ - value = self.get(key, self._missing_key, version=version) - if value is self._missing_key: - raise ValueError("Key '%s' not found" % key) - new_value = value + delta - self.set(key, new_value, version=version) - return new_value - - async def aincr(self, key, delta=1, version=None): - """See incr().""" - value = await self.aget(key, self._missing_key, version=version) - if value is self._missing_key: - raise ValueError("Key '%s' not found" % key) - new_value = value + delta - await self.aset(key, new_value, version=version) - return new_value - - def decr(self, key, delta=1, version=None): - """ - Subtract delta from value in the cache. If the key does not exist, raise - a ValueError exception. - """ - return self.incr(key, -delta, version=version) - - async def adecr(self, key, delta=1, version=None): - return await self.aincr(key, -delta, version=version) - - def __contains__(self, key): - """ - Return True if the key is in the cache and has not expired. - """ - # This is a separate method, rather than just a copy of has_key(), - # so that it always has the same functionality as has_key(), even - # if a subclass overrides it. - return self.has_key(key) - - def set_many(self, data, timeout=DEFAULT_TIMEOUT, version=None): - """ - Set a bunch of values in the cache at once from a dict of key/value - pairs. For certain backends (memcached), this is much more efficient - than calling set() multiple times. - - If timeout is given, use that timeout for the key; otherwise use the - default cache timeout. - - On backends that support it, return a list of keys that failed - insertion, or an empty list if all keys were inserted successfully. - """ - for key, value in data.items(): - self.set(key, value, timeout=timeout, version=version) - return [] - - async def aset_many(self, data, timeout=DEFAULT_TIMEOUT, version=None): - for key, value in data.items(): - await self.aset(key, value, timeout=timeout, version=version) - return [] - - def delete_many(self, keys, version=None): - """ - Delete a bunch of values in the cache at once. For certain backends - (memcached), this is much more efficient than calling delete() multiple - times. - """ - for key in keys: - self.delete(key, version=version) - - async def adelete_many(self, keys, version=None): - for key in keys: - await self.adelete(key, version=version) - - def clear(self): - """Remove *all* values from the cache at once.""" - raise NotImplementedError( - "subclasses of BaseCache must provide a clear() method" - ) - - async def aclear(self): - return await sync_to_async(self.clear, thread_sensitive=True)() - - def incr_version(self, key, delta=1, version=None): - """ - Add delta to the cache version for the supplied key. Return the new - version. - """ - if version is None: - version = self.version - - value = self.get(key, self._missing_key, version=version) - if value is self._missing_key: - raise ValueError("Key '%s' not found" % key) - - self.set(key, value, version=version + delta) - self.delete(key, version=version) - return version + delta - - async def aincr_version(self, key, delta=1, version=None): - """See incr_version().""" - if version is None: - version = self.version - - value = await self.aget(key, self._missing_key, version=version) - if value is self._missing_key: - raise ValueError("Key '%s' not found" % key) - - await self.aset(key, value, version=version + delta) - await self.adelete(key, version=version) - return version + delta - - def decr_version(self, key, delta=1, version=None): - """ - Subtract delta from the cache version for the supplied key. Return the - new version. - """ - return self.incr_version(key, -delta, version) - - async def adecr_version(self, key, delta=1, version=None): - return await self.aincr_version(key, -delta, version) - - def close(self, **kwargs): - """Close the cache connection""" - pass - - async def aclose(self, **kwargs): - pass - - -memcached_error_chars_re = _lazy_re_compile(r"[\x00-\x20\x7f]") - - -def memcache_key_warnings(key): - if len(key) > MEMCACHE_MAX_KEY_LENGTH: - yield ( - "Cache key will cause errors if used with memcached: %r " - "(longer than %s)" % (key, MEMCACHE_MAX_KEY_LENGTH) - ) - if memcached_error_chars_re.search(key): - yield ( - "Cache key contains characters that will cause errors if used with " - f"memcached: {key!r}" - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/cache/backends/db.py b/.venv/lib/python3.10/site-packages/django/core/cache/backends/db.py deleted file mode 100644 index 2dd847c..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/cache/backends/db.py +++ /dev/null @@ -1,294 +0,0 @@ -"Database cache backend." - -import base64 -import pickle -from datetime import datetime, timezone - -from django.conf import settings -from django.core.cache.backends.base import DEFAULT_TIMEOUT, BaseCache -from django.db import DatabaseError, connections, models, router, transaction -from django.utils.timezone import now as tz_now - - -class Options: - """A class that will quack like a Django model _meta class. - - This allows cache operations to be controlled by the router - """ - - def __init__(self, table): - self.db_table = table - self.app_label = "django_cache" - self.model_name = "cacheentry" - self.verbose_name = "cache entry" - self.verbose_name_plural = "cache entries" - self.object_name = "CacheEntry" - self.abstract = False - self.managed = True - self.proxy = False - self.swapped = False - - -class BaseDatabaseCache(BaseCache): - def __init__(self, table, params): - super().__init__(params) - self._table = table - - class CacheEntry: - _meta = Options(table) - - self.cache_model_class = CacheEntry - - -class DatabaseCache(BaseDatabaseCache): - # This class uses cursors provided by the database connection. This means - # it reads expiration values as aware or naive datetimes, depending on the - # value of USE_TZ and whether the database supports time zones. The ORM's - # conversion and adaptation infrastructure is then used to avoid comparing - # aware and naive datetimes accidentally. - - pickle_protocol = pickle.HIGHEST_PROTOCOL - - def get(self, key, default=None, version=None): - return self.get_many([key], version).get(key, default) - - def get_many(self, keys, version=None): - if not keys: - return {} - - key_map = { - self.make_and_validate_key(key, version=version): key for key in keys - } - - db = router.db_for_read(self.cache_model_class) - connection = connections[db] - quote_name = connection.ops.quote_name - table = quote_name(self._table) - - with connection.cursor() as cursor: - cursor.execute( - "SELECT %s, %s, %s FROM %s WHERE %s IN (%s)" - % ( - quote_name("cache_key"), - quote_name("value"), - quote_name("expires"), - table, - quote_name("cache_key"), - ", ".join(["%s"] * len(key_map)), - ), - list(key_map), - ) - rows = cursor.fetchall() - - result = {} - expired_keys = [] - expression = models.Expression(output_field=models.DateTimeField()) - converters = connection.ops.get_db_converters( - expression - ) + expression.get_db_converters(connection) - for key, value, expires in rows: - for converter in converters: - expires = converter(expires, expression, connection) - if expires < tz_now(): - expired_keys.append(key) - else: - value = connection.ops.process_clob(value) - value = pickle.loads(base64.b64decode(value.encode())) - result[key_map.get(key)] = value - self._base_delete_many(expired_keys) - return result - - def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - self._base_set("set", key, value, timeout) - - def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - return self._base_set("add", key, value, timeout) - - def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - return self._base_set("touch", key, None, timeout) - - def _base_set(self, mode, key, value, timeout=DEFAULT_TIMEOUT): - timeout = self.get_backend_timeout(timeout) - db = router.db_for_write(self.cache_model_class) - connection = connections[db] - quote_name = connection.ops.quote_name - table = quote_name(self._table) - - with connection.cursor() as cursor: - cursor.execute("SELECT COUNT(*) FROM %s" % table) - num = cursor.fetchone()[0] - now = tz_now() - now = now.replace(microsecond=0) - if timeout is None: - exp = datetime.max - else: - tz = timezone.utc if settings.USE_TZ else None - exp = datetime.fromtimestamp(timeout, tz=tz) - exp = exp.replace(microsecond=0) - if num > self._max_entries: - self._cull(db, cursor, now, num) - pickled = pickle.dumps(value, self.pickle_protocol) - # The DB column is expecting a string, so make sure the value is a - # string, not bytes. Refs #19274. - b64encoded = base64.b64encode(pickled).decode("latin1") - try: - # Note: typecasting for datetimes is needed by some 3rd party - # database backends. All core backends work without typecasting, - # so be careful about changes here - test suite will NOT pick - # regressions. - with transaction.atomic(using=db): - cursor.execute( - "SELECT %s, %s FROM %s WHERE %s = %%s" - % ( - quote_name("cache_key"), - quote_name("expires"), - table, - quote_name("cache_key"), - ), - [key], - ) - result = cursor.fetchone() - - if result: - current_expires = result[1] - expression = models.Expression( - output_field=models.DateTimeField() - ) - for converter in connection.ops.get_db_converters( - expression - ) + expression.get_db_converters(connection): - current_expires = converter( - current_expires, expression, connection - ) - - exp = connection.ops.adapt_datetimefield_value(exp) - if result and mode == "touch": - cursor.execute( - "UPDATE %s SET %s = %%s WHERE %s = %%s" - % (table, quote_name("expires"), quote_name("cache_key")), - [exp, key], - ) - elif result and ( - mode == "set" or (mode == "add" and current_expires < now) - ): - cursor.execute( - "UPDATE %s SET %s = %%s, %s = %%s WHERE %s = %%s" - % ( - table, - quote_name("value"), - quote_name("expires"), - quote_name("cache_key"), - ), - [b64encoded, exp, key], - ) - elif mode != "touch": - cursor.execute( - "INSERT INTO %s (%s, %s, %s) VALUES (%%s, %%s, %%s)" - % ( - table, - quote_name("cache_key"), - quote_name("value"), - quote_name("expires"), - ), - [key, b64encoded, exp], - ) - else: - return False # touch failed. - except DatabaseError: - # To be threadsafe, updates/inserts are allowed to fail silently - return False - else: - return True - - def delete(self, key, version=None): - key = self.make_and_validate_key(key, version=version) - return self._base_delete_many([key]) - - def delete_many(self, keys, version=None): - keys = [self.make_and_validate_key(key, version=version) for key in keys] - self._base_delete_many(keys) - - def _base_delete_many(self, keys): - if not keys: - return False - - db = router.db_for_write(self.cache_model_class) - connection = connections[db] - quote_name = connection.ops.quote_name - table = quote_name(self._table) - - with connection.cursor() as cursor: - cursor.execute( - "DELETE FROM %s WHERE %s IN (%s)" - % ( - table, - quote_name("cache_key"), - ", ".join(["%s"] * len(keys)), - ), - keys, - ) - return bool(cursor.rowcount) - - def has_key(self, key, version=None): - key = self.make_and_validate_key(key, version=version) - - db = router.db_for_read(self.cache_model_class) - connection = connections[db] - quote_name = connection.ops.quote_name - - now = tz_now().replace(microsecond=0, tzinfo=None) - - with connection.cursor() as cursor: - cursor.execute( - "SELECT %s FROM %s WHERE %s = %%s and %s > %%s" - % ( - quote_name("cache_key"), - quote_name(self._table), - quote_name("cache_key"), - quote_name("expires"), - ), - [key, connection.ops.adapt_datetimefield_value(now)], - ) - return cursor.fetchone() is not None - - def _cull(self, db, cursor, now, num): - if self._cull_frequency == 0: - self.clear() - else: - connection = connections[db] - table = connection.ops.quote_name(self._table) - cursor.execute( - "DELETE FROM %s WHERE %s < %%s" - % ( - table, - connection.ops.quote_name("expires"), - ), - [connection.ops.adapt_datetimefield_value(now)], - ) - deleted_count = cursor.rowcount - remaining_num = num - deleted_count - if remaining_num > self._max_entries: - cull_num = remaining_num // self._cull_frequency - cursor.execute( - connection.ops.cache_key_culling_sql() % table, [cull_num] - ) - last_cache_key = cursor.fetchone() - if last_cache_key: - cursor.execute( - "DELETE FROM %s WHERE %s < %%s" - % ( - table, - connection.ops.quote_name("cache_key"), - ), - [last_cache_key[0]], - ) - - def clear(self): - db = router.db_for_write(self.cache_model_class) - connection = connections[db] - table = connection.ops.quote_name(self._table) - with connection.cursor() as cursor: - cursor.execute("DELETE FROM %s" % table) diff --git a/.venv/lib/python3.10/site-packages/django/core/cache/backends/dummy.py b/.venv/lib/python3.10/site-packages/django/core/cache/backends/dummy.py deleted file mode 100644 index 7b4d339..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/cache/backends/dummy.py +++ /dev/null @@ -1,34 +0,0 @@ -"Dummy cache backend" - -from django.core.cache.backends.base import DEFAULT_TIMEOUT, BaseCache - - -class DummyCache(BaseCache): - def __init__(self, host, *args, **kwargs): - super().__init__(*args, **kwargs) - - def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - self.make_and_validate_key(key, version=version) - return True - - def get(self, key, default=None, version=None): - self.make_and_validate_key(key, version=version) - return default - - def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - self.make_and_validate_key(key, version=version) - - def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): - self.make_and_validate_key(key, version=version) - return False - - def delete(self, key, version=None): - self.make_and_validate_key(key, version=version) - return False - - def has_key(self, key, version=None): - self.make_and_validate_key(key, version=version) - return False - - def clear(self): - pass diff --git a/.venv/lib/python3.10/site-packages/django/core/cache/backends/filebased.py b/.venv/lib/python3.10/site-packages/django/core/cache/backends/filebased.py deleted file mode 100644 index 862a8b5..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/cache/backends/filebased.py +++ /dev/null @@ -1,171 +0,0 @@ -"File-based cache backend" - -import glob -import os -import pickle -import random -import tempfile -import time -import zlib -from hashlib import md5 - -from django.core.cache.backends.base import DEFAULT_TIMEOUT, BaseCache -from django.core.files import locks -from django.core.files.move import file_move_safe - - -class FileBasedCache(BaseCache): - cache_suffix = ".djcache" - pickle_protocol = pickle.HIGHEST_PROTOCOL - - def __init__(self, dir, params): - super().__init__(params) - self._dir = os.path.abspath(dir) - self._createdir() - - def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - if self.has_key(key, version): - return False - self.set(key, value, timeout, version) - return True - - def get(self, key, default=None, version=None): - fname = self._key_to_file(key, version) - try: - with open(fname, "rb") as f: - if not self._is_expired(f): - return pickle.loads(zlib.decompress(f.read())) - except FileNotFoundError: - pass - return default - - def _write_content(self, file, timeout, value): - expiry = self.get_backend_timeout(timeout) - file.write(pickle.dumps(expiry, self.pickle_protocol)) - file.write(zlib.compress(pickle.dumps(value, self.pickle_protocol))) - - def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - self._createdir() # Cache dir can be deleted at any time. - fname = self._key_to_file(key, version) - self._cull() # make some room if necessary - fd, tmp_path = tempfile.mkstemp(dir=self._dir) - renamed = False - try: - with open(fd, "wb") as f: - self._write_content(f, timeout, value) - file_move_safe(tmp_path, fname, allow_overwrite=True) - renamed = True - finally: - if not renamed: - os.remove(tmp_path) - - def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): - try: - with open(self._key_to_file(key, version), "r+b") as f: - try: - locks.lock(f, locks.LOCK_EX) - if self._is_expired(f): - return False - else: - previous_value = pickle.loads(zlib.decompress(f.read())) - f.seek(0) - self._write_content(f, timeout, previous_value) - return True - finally: - locks.unlock(f) - except FileNotFoundError: - return False - - def delete(self, key, version=None): - return self._delete(self._key_to_file(key, version)) - - def _delete(self, fname): - if not fname.startswith(self._dir) or not os.path.exists(fname): - return False - try: - os.remove(fname) - except FileNotFoundError: - # The file may have been removed by another process. - return False - return True - - def has_key(self, key, version=None): - fname = self._key_to_file(key, version) - try: - with open(fname, "rb") as f: - return not self._is_expired(f) - except FileNotFoundError: - return False - - def _cull(self): - """ - Remove random cache entries if max_entries is reached at a ratio - of num_entries / cull_frequency. A value of 0 for CULL_FREQUENCY means - that the entire cache will be purged. - """ - filelist = self._list_cache_files() - num_entries = len(filelist) - if num_entries < self._max_entries: - return # return early if no culling is required - if self._cull_frequency == 0: - return self.clear() # Clear the cache when CULL_FREQUENCY = 0 - # Delete a random selection of entries - filelist = random.sample(filelist, int(num_entries / self._cull_frequency)) - for fname in filelist: - self._delete(fname) - - def _createdir(self): - # Set the umask because os.makedirs() doesn't apply the "mode" argument - # to intermediate-level directories. - old_umask = os.umask(0o077) - try: - os.makedirs(self._dir, 0o700, exist_ok=True) - finally: - os.umask(old_umask) - - def _key_to_file(self, key, version=None): - """ - Convert a key into a cache file path. Basically this is the - root cache path joined with the md5sum of the key and a suffix. - """ - key = self.make_and_validate_key(key, version=version) - return os.path.join( - self._dir, - "".join( - [ - md5(key.encode(), usedforsecurity=False).hexdigest(), - self.cache_suffix, - ] - ), - ) - - def clear(self): - """ - Remove all the cache files. - """ - for fname in self._list_cache_files(): - self._delete(fname) - - def _is_expired(self, f): - """ - Take an open cache file `f` and delete it if it's expired. - """ - try: - exp = pickle.load(f) - except EOFError: - exp = 0 # An empty file is considered expired. - if exp is not None and exp < time.time(): - f.close() # On Windows a file has to be closed before deleting - self._delete(f.name) - return True - return False - - def _list_cache_files(self): - """ - Get a list of paths to all the cache files. These are all the files - in the root cache dir that end on the cache_suffix. - """ - return [ - os.path.join(self._dir, fname) - for fname in glob.glob(f"*{self.cache_suffix}", root_dir=self._dir) - ] diff --git a/.venv/lib/python3.10/site-packages/django/core/cache/backends/locmem.py b/.venv/lib/python3.10/site-packages/django/core/cache/backends/locmem.py deleted file mode 100644 index b62fedb..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/cache/backends/locmem.py +++ /dev/null @@ -1,118 +0,0 @@ -"Thread-safe in-memory cache backend." - -import pickle -import time -from collections import OrderedDict -from threading import Lock - -from django.core.cache.backends.base import DEFAULT_TIMEOUT, BaseCache - -# Global in-memory store of cache data. Keyed by name, to provide -# multiple named local memory caches. -_caches = {} -_expire_info = {} -_locks = {} - - -class LocMemCache(BaseCache): - pickle_protocol = pickle.HIGHEST_PROTOCOL - - def __init__(self, name, params): - super().__init__(params) - self._cache = _caches.setdefault(name, OrderedDict()) - self._expire_info = _expire_info.setdefault(name, {}) - self._lock = _locks.setdefault(name, Lock()) - - def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - pickled = pickle.dumps(value, self.pickle_protocol) - with self._lock: - if self._has_expired(key): - self._set(key, pickled, timeout) - return True - return False - - def get(self, key, default=None, version=None): - key = self.make_and_validate_key(key, version=version) - with self._lock: - if self._has_expired(key): - self._delete(key) - return default - pickled = self._cache[key] - self._cache.move_to_end(key, last=False) - return pickle.loads(pickled) - - def _set(self, key, value, timeout=DEFAULT_TIMEOUT): - if len(self._cache) >= self._max_entries: - self._cull() - self._cache[key] = value - self._cache.move_to_end(key, last=False) - self._expire_info[key] = self.get_backend_timeout(timeout) - - def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - pickled = pickle.dumps(value, self.pickle_protocol) - with self._lock: - self._set(key, pickled, timeout) - - def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - with self._lock: - if self._has_expired(key): - return False - self._expire_info[key] = self.get_backend_timeout(timeout) - return True - - def incr(self, key, delta=1, version=None): - key = self.make_and_validate_key(key, version=version) - with self._lock: - if self._has_expired(key): - self._delete(key) - raise ValueError("Key '%s' not found" % key) - pickled = self._cache[key] - value = pickle.loads(pickled) - new_value = value + delta - pickled = pickle.dumps(new_value, self.pickle_protocol) - self._cache[key] = pickled - self._cache.move_to_end(key, last=False) - return new_value - - def has_key(self, key, version=None): - key = self.make_and_validate_key(key, version=version) - with self._lock: - if self._has_expired(key): - self._delete(key) - return False - return True - - def _has_expired(self, key): - exp = self._expire_info.get(key, -1) - return exp is not None and exp <= time.time() - - def _cull(self): - if self._cull_frequency == 0: - self._cache.clear() - self._expire_info.clear() - else: - count = len(self._cache) // self._cull_frequency - for i in range(count): - key, _ = self._cache.popitem() - del self._expire_info[key] - - def _delete(self, key): - try: - del self._cache[key] - del self._expire_info[key] - except KeyError: - return False - return True - - def delete(self, key, version=None): - key = self.make_and_validate_key(key, version=version) - with self._lock: - return self._delete(key) - - def clear(self): - with self._lock: - self._cache.clear() - self._expire_info.clear() diff --git a/.venv/lib/python3.10/site-packages/django/core/cache/backends/memcached.py b/.venv/lib/python3.10/site-packages/django/core/cache/backends/memcached.py deleted file mode 100644 index 6e2c761..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/cache/backends/memcached.py +++ /dev/null @@ -1,188 +0,0 @@ -"Memcached cache backend" - -import re -import time - -from django.core.cache.backends.base import ( - DEFAULT_TIMEOUT, - BaseCache, - InvalidCacheKey, - memcache_key_warnings, -) -from django.utils.functional import cached_property - - -class BaseMemcachedCache(BaseCache): - def __init__(self, server, params, library, value_not_found_exception): - super().__init__(params) - if isinstance(server, str): - self._servers = re.split("[;,]", server) - else: - self._servers = server - - # Exception type raised by the underlying client library for a - # nonexistent key. - self.LibraryValueNotFoundException = value_not_found_exception - - self._lib = library - self._class = library.Client - self._options = params.get("OPTIONS") or {} - - @property - def client_servers(self): - return self._servers - - @cached_property - def _cache(self): - """ - Implement transparent thread-safe access to a memcached client. - """ - return self._class(self.client_servers, **self._options) - - def get_backend_timeout(self, timeout=DEFAULT_TIMEOUT): - """ - Memcached deals with long (> 30 days) timeouts in a special - way. Call this function to obtain a safe value for your timeout. - """ - if timeout == DEFAULT_TIMEOUT: - timeout = self.default_timeout - - if timeout is None: - # Using 0 in memcache sets a non-expiring timeout. - return 0 - elif int(timeout) == 0: - # Other cache backends treat 0 as set-and-expire. To achieve this - # in memcache backends, a negative timeout must be passed. - timeout = -1 - - if timeout > 2592000: # 60*60*24*30, 30 days - # See https://github.com/memcached/memcached/wiki/Programming#expiration - # "Expiration times can be set from 0, meaning "never expire", to - # 30 days. Any time higher than 30 days is interpreted as a Unix - # timestamp date. If you want to expire an object on January 1st of - # next year, this is how you do that." - # - # This means that we have to switch to absolute timestamps. - timeout += int(time.time()) - return int(timeout) - - def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - return self._cache.add(key, value, self.get_backend_timeout(timeout)) - - def get(self, key, default=None, version=None): - key = self.make_and_validate_key(key, version=version) - return self._cache.get(key, default) - - def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - if not self._cache.set(key, value, self.get_backend_timeout(timeout)): - # Make sure the key doesn't keep its old value in case of failure - # to set (memcached's 1MB limit). - self._cache.delete(key) - - def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - return bool(self._cache.touch(key, self.get_backend_timeout(timeout))) - - def delete(self, key, version=None): - key = self.make_and_validate_key(key, version=version) - return bool(self._cache.delete(key)) - - def get_many(self, keys, version=None): - key_map = { - self.make_and_validate_key(key, version=version): key for key in keys - } - ret = self._cache.get_multi(key_map.keys()) - return {key_map[k]: v for k, v in ret.items()} - - def close(self, **kwargs): - # Many clients don't clean up connections properly. - self._cache.disconnect_all() - - def incr(self, key, delta=1, version=None): - key = self.make_and_validate_key(key, version=version) - try: - # Memcached doesn't support negative delta. - if delta < 0: - val = self._cache.decr(key, -delta) - else: - val = self._cache.incr(key, delta) - # Normalize an exception raised by the underlying client library to - # ValueError in the event of a nonexistent key when calling - # incr()/decr(). - except self.LibraryValueNotFoundException: - val = None - if val is None: - raise ValueError("Key '%s' not found" % key) - return val - - def set_many(self, data, timeout=DEFAULT_TIMEOUT, version=None): - safe_data = {} - original_keys = {} - for key, value in data.items(): - safe_key = self.make_and_validate_key(key, version=version) - safe_data[safe_key] = value - original_keys[safe_key] = key - failed_keys = self._cache.set_multi( - safe_data, self.get_backend_timeout(timeout) - ) - return [original_keys[k] for k in failed_keys] - - def delete_many(self, keys, version=None): - keys = [self.make_and_validate_key(key, version=version) for key in keys] - self._cache.delete_multi(keys) - - def clear(self): - self._cache.flush_all() - - def validate_key(self, key): - for warning in memcache_key_warnings(key): - raise InvalidCacheKey(warning) - - -class PyLibMCCache(BaseMemcachedCache): - "An implementation of a cache binding using pylibmc" - - def __init__(self, server, params): - import pylibmc - - super().__init__( - server, params, library=pylibmc, value_not_found_exception=pylibmc.NotFound - ) - - @property - def client_servers(self): - output = [] - for server in self._servers: - output.append(server.removeprefix("unix:")) - return output - - def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - if timeout == 0: - return self._cache.delete(key) - return self._cache.touch(key, self.get_backend_timeout(timeout)) - - def close(self, **kwargs): - # libmemcached manages its own connections. Don't call disconnect_all() - # as it resets the failover state and creates unnecessary reconnects. - pass - - -class PyMemcacheCache(BaseMemcachedCache): - """An implementation of a cache binding using pymemcache.""" - - def __init__(self, server, params): - import pymemcache.serde - - super().__init__( - server, params, library=pymemcache, value_not_found_exception=KeyError - ) - self._class = self._lib.HashClient - self._options = { - "allow_unicode_keys": True, - "default_noreply": False, - "serde": pymemcache.serde.pickle_serde, - **self._options, - } diff --git a/.venv/lib/python3.10/site-packages/django/core/cache/backends/redis.py b/.venv/lib/python3.10/site-packages/django/core/cache/backends/redis.py deleted file mode 100644 index bbf070a..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/cache/backends/redis.py +++ /dev/null @@ -1,234 +0,0 @@ -"""Redis cache backend.""" - -import pickle -import random -import re - -from django.core.cache.backends.base import DEFAULT_TIMEOUT, BaseCache -from django.utils.functional import cached_property -from django.utils.module_loading import import_string - - -class RedisSerializer: - def __init__(self, protocol=None): - self.protocol = pickle.HIGHEST_PROTOCOL if protocol is None else protocol - - def dumps(self, obj): - # For better incr() and decr() atomicity, don't pickle integers. - # Using type() rather than isinstance() matches only integers and not - # subclasses like bool. - if type(obj) is int: - return obj - return pickle.dumps(obj, self.protocol) - - def loads(self, data): - try: - return int(data) - except ValueError: - return pickle.loads(data) - - -class RedisCacheClient: - def __init__( - self, - servers, - serializer=None, - pool_class=None, - parser_class=None, - **options, - ): - import redis - - self._lib = redis - self._servers = servers - self._pools = {} - - self._client = self._lib.Redis - - if isinstance(pool_class, str): - pool_class = import_string(pool_class) - self._pool_class = pool_class or self._lib.ConnectionPool - - if isinstance(serializer, str): - serializer = import_string(serializer) - if callable(serializer): - serializer = serializer() - self._serializer = serializer or RedisSerializer() - - if isinstance(parser_class, str): - parser_class = import_string(parser_class) - parser_class = parser_class or self._lib.connection.DefaultParser - - self._pool_options = {"parser_class": parser_class, **options} - - def _get_connection_pool_index(self, write): - # Write to the first server. Read from other servers if there are more, - # otherwise read from the first server. - if write or len(self._servers) == 1: - return 0 - return random.randint(1, len(self._servers) - 1) - - def _get_connection_pool(self, write): - index = self._get_connection_pool_index(write) - if index not in self._pools: - self._pools[index] = self._pool_class.from_url( - self._servers[index], - **self._pool_options, - ) - return self._pools[index] - - def get_client(self, key=None, *, write=False): - # key is used so that the method signature remains the same and custom - # cache client can be implemented which might require the key to select - # the server, e.g. sharding. - pool = self._get_connection_pool(write) - return self._client(connection_pool=pool) - - def add(self, key, value, timeout): - client = self.get_client(key, write=True) - value = self._serializer.dumps(value) - - if timeout == 0: - if ret := bool(client.set(key, value, nx=True)): - client.delete(key) - return ret - else: - return bool(client.set(key, value, ex=timeout, nx=True)) - - def get(self, key, default): - client = self.get_client(key) - value = client.get(key) - return default if value is None else self._serializer.loads(value) - - def set(self, key, value, timeout): - client = self.get_client(key, write=True) - value = self._serializer.dumps(value) - if timeout == 0: - client.delete(key) - else: - client.set(key, value, ex=timeout) - - def touch(self, key, timeout): - client = self.get_client(key, write=True) - if timeout is None: - return bool(client.persist(key)) - else: - return bool(client.expire(key, timeout)) - - def delete(self, key): - client = self.get_client(key, write=True) - return bool(client.delete(key)) - - def get_many(self, keys): - client = self.get_client(None) - ret = client.mget(keys) - return { - k: self._serializer.loads(v) for k, v in zip(keys, ret) if v is not None - } - - def has_key(self, key): - client = self.get_client(key) - return bool(client.exists(key)) - - def incr(self, key, delta): - client = self.get_client(key, write=True) - if not client.exists(key): - raise ValueError("Key '%s' not found." % key) - return client.incr(key, delta) - - def set_many(self, data, timeout): - client = self.get_client(None, write=True) - pipeline = client.pipeline() - pipeline.mset({k: self._serializer.dumps(v) for k, v in data.items()}) - - if timeout is not None: - # Setting timeout for each key as redis does not support timeout - # with mset(). - for key in data: - pipeline.expire(key, timeout) - pipeline.execute() - - def delete_many(self, keys): - client = self.get_client(None, write=True) - client.delete(*keys) - - def clear(self): - client = self.get_client(None, write=True) - return bool(client.flushdb()) - - -class RedisCache(BaseCache): - def __init__(self, server, params): - super().__init__(params) - if isinstance(server, str): - self._servers = re.split("[;,]", server) - else: - self._servers = server - - self._class = RedisCacheClient - self._options = params.get("OPTIONS", {}) - - @cached_property - def _cache(self): - return self._class(self._servers, **self._options) - - def get_backend_timeout(self, timeout=DEFAULT_TIMEOUT): - if timeout == DEFAULT_TIMEOUT: - timeout = self.default_timeout - # The key will be made persistent if None used as a timeout. - # Non-positive values will cause the key to be deleted. - return None if timeout is None else max(0, int(timeout)) - - def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - return self._cache.add(key, value, self.get_backend_timeout(timeout)) - - def get(self, key, default=None, version=None): - key = self.make_and_validate_key(key, version=version) - return self._cache.get(key, default) - - def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - self._cache.set(key, value, self.get_backend_timeout(timeout)) - - def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): - key = self.make_and_validate_key(key, version=version) - return self._cache.touch(key, self.get_backend_timeout(timeout)) - - def delete(self, key, version=None): - key = self.make_and_validate_key(key, version=version) - return self._cache.delete(key) - - def get_many(self, keys, version=None): - key_map = { - self.make_and_validate_key(key, version=version): key for key in keys - } - ret = self._cache.get_many(key_map.keys()) - return {key_map[k]: v for k, v in ret.items()} - - def has_key(self, key, version=None): - key = self.make_and_validate_key(key, version=version) - return self._cache.has_key(key) - - def incr(self, key, delta=1, version=None): - key = self.make_and_validate_key(key, version=version) - return self._cache.incr(key, delta) - - def set_many(self, data, timeout=DEFAULT_TIMEOUT, version=None): - if not data: - return [] - safe_data = {} - for key, value in data.items(): - key = self.make_and_validate_key(key, version=version) - safe_data[key] = value - self._cache.set_many(safe_data, self.get_backend_timeout(timeout)) - return [] - - def delete_many(self, keys, version=None): - if not keys: - return - safe_keys = [self.make_and_validate_key(key, version=version) for key in keys] - self._cache.delete_many(safe_keys) - - def clear(self): - return self._cache.clear() diff --git a/.venv/lib/python3.10/site-packages/django/core/cache/utils.py b/.venv/lib/python3.10/site-packages/django/core/cache/utils.py deleted file mode 100644 index 87f0f9c..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/cache/utils.py +++ /dev/null @@ -1,12 +0,0 @@ -from hashlib import md5 - -TEMPLATE_FRAGMENT_KEY_TEMPLATE = "template.cache.%s.%s" - - -def make_template_fragment_key(fragment_name, vary_on=None): - hasher = md5(usedforsecurity=False) - if vary_on is not None: - for arg in vary_on: - hasher.update(str(arg).encode()) - hasher.update(b":") - return TEMPLATE_FRAGMENT_KEY_TEMPLATE % (fragment_name, hasher.hexdigest()) diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/__init__.py b/.venv/lib/python3.10/site-packages/django/core/checks/__init__.py deleted file mode 100644 index 2502450..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/__init__.py +++ /dev/null @@ -1,48 +0,0 @@ -from .messages import ( - CRITICAL, - DEBUG, - ERROR, - INFO, - WARNING, - CheckMessage, - Critical, - Debug, - Error, - Info, - Warning, -) -from .registry import Tags, register, run_checks, tag_exists - -# Import these to force registration of checks -import django.core.checks.async_checks # NOQA isort:skip -import django.core.checks.caches # NOQA isort:skip -import django.core.checks.commands # NOQA isort:skip -import django.core.checks.compatibility.django_4_0 # NOQA isort:skip -import django.core.checks.database # NOQA isort:skip -import django.core.checks.files # NOQA isort:skip -import django.core.checks.model_checks # NOQA isort:skip -import django.core.checks.security.base # NOQA isort:skip -import django.core.checks.security.csrf # NOQA isort:skip -import django.core.checks.security.sessions # NOQA isort:skip -import django.core.checks.templates # NOQA isort:skip -import django.core.checks.translation # NOQA isort:skip -import django.core.checks.urls # NOQA isort:skip - - -__all__ = [ - "CheckMessage", - "Debug", - "Info", - "Warning", - "Error", - "Critical", - "DEBUG", - "INFO", - "WARNING", - "ERROR", - "CRITICAL", - "register", - "run_checks", - "tag_exists", - "Tags", -] diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/async_checks.py b/.venv/lib/python3.10/site-packages/django/core/checks/async_checks.py deleted file mode 100644 index a0e0186..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/async_checks.py +++ /dev/null @@ -1,16 +0,0 @@ -import os - -from . import Error, Tags, register - -E001 = Error( - "You should not set the DJANGO_ALLOW_ASYNC_UNSAFE environment variable in " - "deployment. This disables async safety protection.", - id="async.E001", -) - - -@register(Tags.async_support, deploy=True) -def check_async_unsafe(app_configs, **kwargs): - if os.environ.get("DJANGO_ALLOW_ASYNC_UNSAFE"): - return [E001] - return [] diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/caches.py b/.venv/lib/python3.10/site-packages/django/core/checks/caches.py deleted file mode 100644 index c288a6f..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/caches.py +++ /dev/null @@ -1,76 +0,0 @@ -import pathlib - -from django.conf import settings -from django.core.cache import DEFAULT_CACHE_ALIAS, caches -from django.core.cache.backends.filebased import FileBasedCache - -from . import Error, Tags, Warning, register - -E001 = Error( - "You must define a '%s' cache in your CACHES setting." % DEFAULT_CACHE_ALIAS, - id="caches.E001", -) - - -@register(Tags.caches) -def check_default_cache_is_configured(app_configs, **kwargs): - if DEFAULT_CACHE_ALIAS not in settings.CACHES: - return [E001] - return [] - - -@register(Tags.caches, deploy=True) -def check_cache_location_not_exposed(app_configs, **kwargs): - errors = [] - for name in ("MEDIA_ROOT", "STATIC_ROOT", "STATICFILES_DIRS"): - setting = getattr(settings, name, None) - if not setting: - continue - if name == "STATICFILES_DIRS": - paths = set() - for staticfiles_dir in setting: - if isinstance(staticfiles_dir, (list, tuple)): - _, staticfiles_dir = staticfiles_dir - paths.add(pathlib.Path(staticfiles_dir).resolve()) - else: - paths = {pathlib.Path(setting).resolve()} - for alias in settings.CACHES: - cache = caches[alias] - if not isinstance(cache, FileBasedCache): - continue - cache_path = pathlib.Path(cache._dir).resolve() - if any(path == cache_path for path in paths): - relation = "matches" - elif any(path in cache_path.parents for path in paths): - relation = "is inside" - elif any(cache_path in path.parents for path in paths): - relation = "contains" - else: - continue - errors.append( - Warning( - f"Your '{alias}' cache configuration might expose your cache " - f"or lead to corruption of your data because its LOCATION " - f"{relation} {name}.", - id="caches.W002", - ) - ) - return errors - - -@register(Tags.caches) -def check_file_based_cache_is_absolute(app_configs, **kwargs): - errors = [] - for alias, config in settings.CACHES.items(): - cache = caches[alias] - if not isinstance(cache, FileBasedCache): - continue - if not pathlib.Path(config["LOCATION"]).is_absolute(): - errors.append( - Warning( - f"Your '{alias}' cache LOCATION path is relative. Use an " - f"absolute path instead.", - id="caches.W003", - ) - ) - return errors diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/commands.py b/.venv/lib/python3.10/site-packages/django/core/checks/commands.py deleted file mode 100644 index eee1e93..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/commands.py +++ /dev/null @@ -1,28 +0,0 @@ -from django.core.checks import Error, Tags, register - - -@register(Tags.commands) -def migrate_and_makemigrations_autodetector(**kwargs): - from django.core.management import get_commands, load_command_class - - commands = get_commands() - - make_migrations = load_command_class(commands["makemigrations"], "makemigrations") - migrate = load_command_class(commands["migrate"], "migrate") - - if make_migrations.autodetector is not migrate.autodetector: - return [ - Error( - "The migrate and makemigrations commands must have the same " - "autodetector.", - hint=( - f"makemigrations.Command.autodetector is " - f"{make_migrations.autodetector.__name__}, but " - f"migrate.Command.autodetector is " - f"{migrate.autodetector.__name__}." - ), - id="commands.E001", - ) - ] - - return [] diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/compatibility/__init__.py b/.venv/lib/python3.10/site-packages/django/core/checks/compatibility/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/compatibility/django_4_0.py b/.venv/lib/python3.10/site-packages/django/core/checks/compatibility/django_4_0.py deleted file mode 100644 index 79ee5fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/compatibility/django_4_0.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.conf import settings - -from .. import Error, Tags, register - - -@register(Tags.compatibility) -def check_csrf_trusted_origins(app_configs, **kwargs): - errors = [] - for origin in settings.CSRF_TRUSTED_ORIGINS: - if "://" not in origin: - errors.append( - Error( - "As of Django 4.0, the values in the CSRF_TRUSTED_ORIGINS " - "setting must start with a scheme (usually http:// or " - "https://) but found %s. See the release notes for details." - % origin, - id="4_0.E001", - ) - ) - return errors diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/database.py b/.venv/lib/python3.10/site-packages/django/core/checks/database.py deleted file mode 100644 index d125f1e..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/database.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import connections - -from . import Tags, register - - -@register(Tags.database) -def check_database_backends(databases=None, **kwargs): - if databases is None: - return [] - issues = [] - for alias in databases: - conn = connections[alias] - issues.extend(conn.validation.check(**kwargs)) - return issues diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/files.py b/.venv/lib/python3.10/site-packages/django/core/checks/files.py deleted file mode 100644 index 40dc745..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/files.py +++ /dev/null @@ -1,19 +0,0 @@ -from pathlib import Path - -from django.conf import settings - -from . import Error, Tags, register - - -@register(Tags.files) -def check_setting_file_upload_temp_dir(app_configs, **kwargs): - setting = getattr(settings, "FILE_UPLOAD_TEMP_DIR", None) - if setting and not Path(setting).is_dir(): - return [ - Error( - f"The FILE_UPLOAD_TEMP_DIR setting refers to the nonexistent " - f"directory '{setting}'.", - id="files.E001", - ), - ] - return [] diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/messages.py b/.venv/lib/python3.10/site-packages/django/core/checks/messages.py deleted file mode 100644 index db7aa55..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/messages.py +++ /dev/null @@ -1,81 +0,0 @@ -# Levels -DEBUG = 10 -INFO = 20 -WARNING = 30 -ERROR = 40 -CRITICAL = 50 - - -class CheckMessage: - def __init__(self, level, msg, hint=None, obj=None, id=None): - if not isinstance(level, int): - raise TypeError("The first argument should be level.") - self.level = level - self.msg = msg - self.hint = hint - self.obj = obj - self.id = id - - def __eq__(self, other): - return isinstance(other, self.__class__) and all( - getattr(self, attr) == getattr(other, attr) - for attr in ["level", "msg", "hint", "obj", "id"] - ) - - def __str__(self): - from django.db import models - - if self.obj is None: - obj = "?" - elif isinstance(self.obj, models.base.ModelBase): - # We need to hardcode ModelBase and Field cases because its __str__ - # method doesn't return "applabel.modellabel" and cannot be changed. - obj = self.obj._meta.label - else: - obj = str(self.obj) - id = "(%s) " % self.id if self.id else "" - hint = "\n\tHINT: %s" % self.hint if self.hint else "" - return "%s: %s%s%s" % (obj, id, self.msg, hint) - - def __repr__(self): - return "<%s: level=%r, msg=%r, hint=%r, obj=%r, id=%r>" % ( - self.__class__.__name__, - self.level, - self.msg, - self.hint, - self.obj, - self.id, - ) - - def is_serious(self, level=ERROR): - return self.level >= level - - def is_silenced(self): - from django.conf import settings - - return self.id in settings.SILENCED_SYSTEM_CHECKS - - -class Debug(CheckMessage): - def __init__(self, *args, **kwargs): - super().__init__(DEBUG, *args, **kwargs) - - -class Info(CheckMessage): - def __init__(self, *args, **kwargs): - super().__init__(INFO, *args, **kwargs) - - -class Warning(CheckMessage): - def __init__(self, *args, **kwargs): - super().__init__(WARNING, *args, **kwargs) - - -class Error(CheckMessage): - def __init__(self, *args, **kwargs): - super().__init__(ERROR, *args, **kwargs) - - -class Critical(CheckMessage): - def __init__(self, *args, **kwargs): - super().__init__(CRITICAL, *args, **kwargs) diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/model_checks.py b/.venv/lib/python3.10/site-packages/django/core/checks/model_checks.py deleted file mode 100644 index 7a5bef9..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/model_checks.py +++ /dev/null @@ -1,227 +0,0 @@ -import inspect -import types -from collections import defaultdict -from itertools import chain - -from django.apps import apps -from django.conf import settings -from django.core.checks import Error, Tags, Warning, register - - -@register(Tags.models) -def check_all_models(app_configs=None, **kwargs): - db_table_models = defaultdict(list) - indexes = defaultdict(list) - constraints = defaultdict(list) - errors = [] - if app_configs is None: - models = apps.get_models() - else: - models = chain.from_iterable( - app_config.get_models() for app_config in app_configs - ) - for model in models: - if model._meta.managed and not model._meta.proxy: - db_table_models[model._meta.db_table].append(model._meta.label) - if not inspect.ismethod(model.check): - errors.append( - Error( - "The '%s.check()' class method is currently overridden by %r." - % (model.__name__, model.check), - obj=model, - id="models.E020", - ) - ) - else: - errors.extend(model.check(**kwargs)) - for model_index in model._meta.indexes: - indexes[model_index.name].append(model._meta.label) - for model_constraint in model._meta.constraints: - constraints[model_constraint.name].append(model._meta.label) - if settings.DATABASE_ROUTERS: - error_class, error_id = Warning, "models.W035" - error_hint = ( - "You have configured settings.DATABASE_ROUTERS. Verify that %s " - "are correctly routed to separate databases." - ) - else: - error_class, error_id = Error, "models.E028" - error_hint = None - for db_table, model_labels in db_table_models.items(): - if len(model_labels) != 1: - model_labels_str = ", ".join(model_labels) - errors.append( - error_class( - "db_table '%s' is used by multiple models: %s." - % (db_table, model_labels_str), - obj=db_table, - hint=(error_hint % model_labels_str) if error_hint else None, - id=error_id, - ) - ) - for index_name, model_labels in indexes.items(): - if len(model_labels) > 1: - model_labels = set(model_labels) - errors.append( - Error( - "index name '%s' is not unique %s %s." - % ( - index_name, - "for model" if len(model_labels) == 1 else "among models:", - ", ".join(sorted(model_labels)), - ), - id="models.E029" if len(model_labels) == 1 else "models.E030", - ), - ) - for constraint_name, model_labels in constraints.items(): - if len(model_labels) > 1: - model_labels = set(model_labels) - errors.append( - Error( - "constraint name '%s' is not unique %s %s." - % ( - constraint_name, - "for model" if len(model_labels) == 1 else "among models:", - ", ".join(sorted(model_labels)), - ), - id="models.E031" if len(model_labels) == 1 else "models.E032", - ), - ) - return errors - - -def _check_lazy_references(apps, ignore=None): - """ - Ensure all lazy (i.e. string) model references have been resolved. - - Lazy references are used in various places throughout Django, primarily in - related fields and model signals. Identify those common cases and provide - more helpful error messages for them. - - The ignore parameter is used by StateApps to exclude swappable models from - this check. - """ - pending_models = set(apps._pending_operations) - (ignore or set()) - - # Short circuit if there aren't any errors. - if not pending_models: - return [] - - from django.db.models import signals - - model_signals = { - signal: name - for name, signal in vars(signals).items() - if isinstance(signal, signals.ModelSignal) - } - - def extract_operation(obj): - """ - Take a callable found in Apps._pending_operations and identify the - original callable passed to Apps.lazy_model_operation(). If that - callable was a partial, return the inner, non-partial function and - any arguments and keyword arguments that were supplied with it. - - obj is a callback defined locally in Apps.lazy_model_operation() and - annotated there with a `func` attribute so as to imitate a partial. - """ - operation, args, keywords = obj, [], {} - while hasattr(operation, "func"): - args.extend(getattr(operation, "args", [])) - keywords.update(getattr(operation, "keywords", {})) - operation = operation.func - return operation, args, keywords - - def app_model_error(model_key): - try: - apps.get_app_config(model_key[0]) - model_error = "app '%s' doesn't provide model '%s'" % model_key - except LookupError: - model_error = "app '%s' isn't installed" % model_key[0] - return model_error - - # Here are several functions which return CheckMessage instances for the - # most common usages of lazy operations throughout Django. These functions - # take the model that was being waited on as an (app_label, modelname) - # pair, the original lazy function, and its positional and keyword args as - # determined by extract_operation(). - - def field_error(model_key, func, args, keywords): - error_msg = ( - "The field %(field)s was declared with a lazy reference " - "to '%(model)s', but %(model_error)s." - ) - params = { - "model": ".".join(model_key), - "field": keywords["field"], - "model_error": app_model_error(model_key), - } - return Error(error_msg % params, obj=keywords["field"], id="fields.E307") - - def signal_connect_error(model_key, func, args, keywords): - error_msg = ( - "%(receiver)s was connected to the '%(signal)s' signal with a " - "lazy reference to the sender '%(model)s', but %(model_error)s." - ) - receiver = args[0] - # The receiver is either a function or an instance of class - # defining a `__call__` method. - if isinstance(receiver, types.FunctionType): - description = "The function '%s'" % receiver.__name__ - elif isinstance(receiver, types.MethodType): - description = "Bound method '%s.%s'" % ( - receiver.__self__.__class__.__name__, - receiver.__name__, - ) - else: - description = "An instance of class '%s'" % receiver.__class__.__name__ - signal_name = model_signals.get(func.__self__, "unknown") - params = { - "model": ".".join(model_key), - "receiver": description, - "signal": signal_name, - "model_error": app_model_error(model_key), - } - return Error(error_msg % params, obj=receiver.__module__, id="signals.E001") - - def default_error(model_key, func, args, keywords): - error_msg = ( - "%(op)s contains a lazy reference to %(model)s, but %(model_error)s." - ) - params = { - "op": func, - "model": ".".join(model_key), - "model_error": app_model_error(model_key), - } - return Error(error_msg % params, obj=func, id="models.E022") - - # Maps common uses of lazy operations to corresponding error functions - # defined above. If a key maps to None, no error will be produced. - # default_error() will be used for usages that don't appear in this dict. - known_lazy = { - ("django.db.models.fields.related", "resolve_related_class"): field_error, - ("django.db.models.fields.related", "set_managed"): None, - ("django.dispatch.dispatcher", "connect"): signal_connect_error, - } - - def build_error(model_key, func, args, keywords): - key = (func.__module__, func.__name__) - error_fn = known_lazy.get(key, default_error) - return error_fn(model_key, func, args, keywords) if error_fn else None - - return sorted( - filter( - None, - ( - build_error(model_key, *extract_operation(func)) - for model_key in pending_models - for func in apps._pending_operations[model_key] - ), - ), - key=lambda error: error.msg, - ) - - -@register(Tags.models) -def check_lazy_references(app_configs=None, **kwargs): - return _check_lazy_references(apps) diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/registry.py b/.venv/lib/python3.10/site-packages/django/core/checks/registry.py deleted file mode 100644 index 3139fc3..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/registry.py +++ /dev/null @@ -1,118 +0,0 @@ -from collections.abc import Iterable -from itertools import chain - -from django.utils.inspect import func_accepts_kwargs - - -class Tags: - """ - Built-in tags for internal checks. - """ - - admin = "admin" - async_support = "async_support" - caches = "caches" - commands = "commands" - compatibility = "compatibility" - database = "database" - files = "files" - models = "models" - security = "security" - signals = "signals" - sites = "sites" - staticfiles = "staticfiles" - templates = "templates" - translation = "translation" - urls = "urls" - - -class CheckRegistry: - def __init__(self): - self.registered_checks = set() - self.deployment_checks = set() - - def register(self, check=None, *tags, **kwargs): - """ - Can be used as a function or a decorator. Register given function - `f` labeled with given `tags`. The function should receive **kwargs - and return list of Errors and Warnings. - - Example:: - - registry = CheckRegistry() - @registry.register('mytag', 'anothertag') - def my_check(app_configs, **kwargs): - # ... perform checks and collect `errors` ... - return errors - # or - registry.register(my_check, 'mytag', 'anothertag') - """ - - def inner(check): - if not func_accepts_kwargs(check): - raise TypeError( - "Check functions must accept keyword arguments (**kwargs)." - ) - check.tags = tags - checks = ( - self.deployment_checks - if kwargs.get("deploy") - else self.registered_checks - ) - checks.add(check) - return check - - if callable(check): - return inner(check) - else: - if check: - tags += (check,) - return inner - - def run_checks( - self, - app_configs=None, - tags=None, - include_deployment_checks=False, - databases=None, - ): - """ - Run all registered checks and return list of Errors and Warnings. - """ - errors = [] - checks = self.get_checks(include_deployment_checks) - - if tags is not None: - checks = [check for check in checks if not set(check.tags).isdisjoint(tags)] - - for check in checks: - new_errors = check(app_configs=app_configs, databases=databases) - if not isinstance(new_errors, Iterable): - raise TypeError( - "The function %r did not return a list. All functions " - "registered with the checks registry must return a list." % check, - ) - errors.extend(new_errors) - return errors - - def tag_exists(self, tag, include_deployment_checks=False): - return tag in self.tags_available(include_deployment_checks) - - def tags_available(self, deployment_checks=False): - return set( - chain.from_iterable( - check.tags for check in self.get_checks(deployment_checks) - ) - ) - - def get_checks(self, include_deployment_checks=False): - checks = list(self.registered_checks) - if include_deployment_checks: - checks.extend(self.deployment_checks) - return checks - - -registry = CheckRegistry() -register = registry.register -run_checks = registry.run_checks -tag_exists = registry.tag_exists diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/security/__init__.py b/.venv/lib/python3.10/site-packages/django/core/checks/security/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/security/base.py b/.venv/lib/python3.10/site-packages/django/core/checks/security/base.py deleted file mode 100644 index f85adab..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/security/base.py +++ /dev/null @@ -1,283 +0,0 @@ -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured - -from .. import Error, Tags, Warning, register - -CROSS_ORIGIN_OPENER_POLICY_VALUES = { - "same-origin", - "same-origin-allow-popups", - "unsafe-none", -} -REFERRER_POLICY_VALUES = { - "no-referrer", - "no-referrer-when-downgrade", - "origin", - "origin-when-cross-origin", - "same-origin", - "strict-origin", - "strict-origin-when-cross-origin", - "unsafe-url", -} - -SECRET_KEY_INSECURE_PREFIX = "django-insecure-" -SECRET_KEY_MIN_LENGTH = 50 -SECRET_KEY_MIN_UNIQUE_CHARACTERS = 5 - -SECRET_KEY_WARNING_MSG = ( - f"Your %s has less than {SECRET_KEY_MIN_LENGTH} characters, less than " - f"{SECRET_KEY_MIN_UNIQUE_CHARACTERS} unique characters, or it's prefixed " - f"with '{SECRET_KEY_INSECURE_PREFIX}' indicating that it was generated " - f"automatically by Django. Please generate a long and random value, " - f"otherwise many of Django's security-critical features will be " - f"vulnerable to attack." -) - -W001 = Warning( - "You do not have 'django.middleware.security.SecurityMiddleware' " - "in your MIDDLEWARE so the SECURE_HSTS_SECONDS, " - "SECURE_CONTENT_TYPE_NOSNIFF, SECURE_REFERRER_POLICY, " - "SECURE_CROSS_ORIGIN_OPENER_POLICY, and SECURE_SSL_REDIRECT settings will " - "have no effect.", - id="security.W001", -) - -W002 = Warning( - "You do not have " - "'django.middleware.clickjacking.XFrameOptionsMiddleware' in your " - "MIDDLEWARE, so your pages will not be served with an " - "'x-frame-options' header. Unless there is a good reason for your " - "site to be served in a frame, you should consider enabling this " - "header to help prevent clickjacking attacks.", - id="security.W002", -) - -W004 = Warning( - "You have not set a value for the SECURE_HSTS_SECONDS setting. " - "If your entire site is served only over SSL, you may want to consider " - "setting a value and enabling HTTP Strict Transport Security. " - "Be sure to read the documentation first; enabling HSTS carelessly " - "can cause serious, irreversible problems.", - id="security.W004", -) - -W005 = Warning( - "You have not set the SECURE_HSTS_INCLUDE_SUBDOMAINS setting to True. " - "Without this, your site is potentially vulnerable to attack " - "via an insecure connection to a subdomain. Only set this to True if " - "you are certain that all subdomains of your domain should be served " - "exclusively via SSL.", - id="security.W005", -) - -W006 = Warning( - "Your SECURE_CONTENT_TYPE_NOSNIFF setting is not set to True, " - "so your pages will not be served with an " - "'X-Content-Type-Options: nosniff' header. " - "You should consider enabling this header to prevent the " - "browser from identifying content types incorrectly.", - id="security.W006", -) - -W008 = Warning( - "Your SECURE_SSL_REDIRECT setting is not set to True. " - "Unless your site should be available over both SSL and non-SSL " - "connections, you may want to either set this setting True " - "or configure a load balancer or reverse-proxy server " - "to redirect all connections to HTTPS.", - id="security.W008", -) - -W009 = Warning( - SECRET_KEY_WARNING_MSG % "SECRET_KEY", - id="security.W009", -) - -W018 = Warning( - "You should not have DEBUG set to True in deployment.", - id="security.W018", -) - -W019 = Warning( - "You have " - "'django.middleware.clickjacking.XFrameOptionsMiddleware' in your " - "MIDDLEWARE, but X_FRAME_OPTIONS is not set to 'DENY'. " - "Unless there is a good reason for your site to serve other parts of " - "itself in a frame, you should change it to 'DENY'.", - id="security.W019", -) - -W020 = Warning( - "ALLOWED_HOSTS must not be empty in deployment.", - id="security.W020", -) - -W021 = Warning( - "You have not set the SECURE_HSTS_PRELOAD setting to True. Without this, " - "your site cannot be submitted to the browser preload list.", - id="security.W021", -) - -W022 = Warning( - "You have not set the SECURE_REFERRER_POLICY setting. Without this, your " - "site will not send a Referrer-Policy header. You should consider " - "enabling this header to protect user privacy.", - id="security.W022", -) - -E023 = Error( - "You have set the SECURE_REFERRER_POLICY setting to an invalid value.", - hint="Valid values are: {}.".format(", ".join(sorted(REFERRER_POLICY_VALUES))), - id="security.E023", -) - -E024 = Error( - "You have set the SECURE_CROSS_ORIGIN_OPENER_POLICY setting to an invalid " - "value.", - hint="Valid values are: {}.".format( - ", ".join(sorted(CROSS_ORIGIN_OPENER_POLICY_VALUES)), - ), - id="security.E024", -) - -W025 = Warning(SECRET_KEY_WARNING_MSG, id="security.W025") - - -def _security_middleware(): - return "django.middleware.security.SecurityMiddleware" in settings.MIDDLEWARE - - -def _xframe_middleware(): - return ( - "django.middleware.clickjacking.XFrameOptionsMiddleware" in settings.MIDDLEWARE - ) - - -@register(Tags.security, deploy=True) -def check_security_middleware(app_configs, **kwargs): - passed_check = _security_middleware() - return [] if passed_check else [W001] - - -@register(Tags.security, deploy=True) -def check_xframe_options_middleware(app_configs, **kwargs): - passed_check = _xframe_middleware() - return [] if passed_check else [W002] - - -@register(Tags.security, deploy=True) -def check_sts(app_configs, **kwargs): - passed_check = not _security_middleware() or settings.SECURE_HSTS_SECONDS - return [] if passed_check else [W004] - - -@register(Tags.security, deploy=True) -def check_sts_include_subdomains(app_configs, **kwargs): - passed_check = ( - not _security_middleware() - or not settings.SECURE_HSTS_SECONDS - or settings.SECURE_HSTS_INCLUDE_SUBDOMAINS is True - ) - return [] if passed_check else [W005] - - -@register(Tags.security, deploy=True) -def check_sts_preload(app_configs, **kwargs): - passed_check = ( - not _security_middleware() - or not settings.SECURE_HSTS_SECONDS - or settings.SECURE_HSTS_PRELOAD is True - ) - return [] if passed_check else [W021] - - -@register(Tags.security, deploy=True) -def check_content_type_nosniff(app_configs, **kwargs): - passed_check = ( - not _security_middleware() or settings.SECURE_CONTENT_TYPE_NOSNIFF is True - ) - return [] if passed_check else [W006] - - -@register(Tags.security, deploy=True) -def check_ssl_redirect(app_configs, **kwargs): - passed_check = not _security_middleware() or settings.SECURE_SSL_REDIRECT is True - return [] if passed_check else [W008] - - -def _check_secret_key(secret_key): - return ( - len(set(secret_key)) >= SECRET_KEY_MIN_UNIQUE_CHARACTERS - and len(secret_key) >= SECRET_KEY_MIN_LENGTH - and not secret_key.startswith(SECRET_KEY_INSECURE_PREFIX) - ) - - -@register(Tags.security, deploy=True) -def check_secret_key(app_configs, **kwargs): - try: - secret_key = settings.SECRET_KEY - except (ImproperlyConfigured, AttributeError): - passed_check = False - else: - passed_check = _check_secret_key(secret_key) - return [] if passed_check else [W009] - - -@register(Tags.security, deploy=True) -def check_secret_key_fallbacks(app_configs, **kwargs): - warnings = [] - try: - fallbacks = settings.SECRET_KEY_FALLBACKS - except (ImproperlyConfigured, AttributeError): - warnings.append(Warning(W025.msg % "SECRET_KEY_FALLBACKS", id=W025.id)) - else: - for index, key in enumerate(fallbacks): - if not _check_secret_key(key): - warnings.append( - Warning(W025.msg % f"SECRET_KEY_FALLBACKS[{index}]", id=W025.id) - ) - return warnings - - -@register(Tags.security, deploy=True) -def check_debug(app_configs, **kwargs): - passed_check = not settings.DEBUG - return [] if passed_check else [W018] - - -@register(Tags.security, deploy=True) -def check_xframe_deny(app_configs, **kwargs): - passed_check = not _xframe_middleware() or settings.X_FRAME_OPTIONS == "DENY" - return [] if passed_check else [W019] - - -@register(Tags.security, deploy=True) -def check_allowed_hosts(app_configs, **kwargs): - return [] if settings.ALLOWED_HOSTS else [W020] - - -@register(Tags.security, deploy=True) -def check_referrer_policy(app_configs, **kwargs): - if _security_middleware(): - if settings.SECURE_REFERRER_POLICY is None: - return [W022] - # Support a comma-separated string or iterable of values to allow fallback. - if isinstance(settings.SECURE_REFERRER_POLICY, str): - values = {v.strip() for v in settings.SECURE_REFERRER_POLICY.split(",")} - else: - values = set(settings.SECURE_REFERRER_POLICY) - if not values <= REFERRER_POLICY_VALUES: - return [E023] - return [] - - -@register(Tags.security, deploy=True) -def check_cross_origin_opener_policy(app_configs, **kwargs): - if ( - _security_middleware() - and settings.SECURE_CROSS_ORIGIN_OPENER_POLICY is not None - and settings.SECURE_CROSS_ORIGIN_OPENER_POLICY - not in CROSS_ORIGIN_OPENER_POLICY_VALUES - ): - return [E024] - return [] diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/security/csrf.py b/.venv/lib/python3.10/site-packages/django/core/checks/security/csrf.py deleted file mode 100644 index d00f225..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/security/csrf.py +++ /dev/null @@ -1,67 +0,0 @@ -import inspect - -from django.conf import settings - -from .. import Error, Tags, Warning, register - -W003 = Warning( - "You don't appear to be using Django's built-in " - "cross-site request forgery protection via the middleware " - "('django.middleware.csrf.CsrfViewMiddleware' is not in your " - "MIDDLEWARE). Enabling the middleware is the safest approach " - "to ensure you don't leave any holes.", - id="security.W003", -) - -W016 = Warning( - "You have 'django.middleware.csrf.CsrfViewMiddleware' in your " - "MIDDLEWARE, but you have not set CSRF_COOKIE_SECURE to True. " - "Using a secure-only CSRF cookie makes it more difficult for network " - "traffic sniffers to steal the CSRF token.", - id="security.W016", -) - - -def _csrf_middleware(): - return "django.middleware.csrf.CsrfViewMiddleware" in settings.MIDDLEWARE - - -@register(Tags.security, deploy=True) -def check_csrf_middleware(app_configs, **kwargs): - passed_check = _csrf_middleware() - return [] if passed_check else [W003] - - -@register(Tags.security, deploy=True) -def check_csrf_cookie_secure(app_configs, **kwargs): - passed_check = ( - settings.CSRF_USE_SESSIONS - or not _csrf_middleware() - or settings.CSRF_COOKIE_SECURE is True - ) - return [] if passed_check else [W016] - - -@register(Tags.security) -def check_csrf_failure_view(app_configs, **kwargs): - from django.middleware.csrf import _get_failure_view - - errors = [] - try: - view = _get_failure_view() - except ImportError: - msg = ( - "The CSRF failure view '%s' could not be imported." - % settings.CSRF_FAILURE_VIEW - ) - errors.append(Error(msg, id="security.E102")) - else: - try: - inspect.signature(view).bind(None, reason=None) - except TypeError: - msg = ( - "The CSRF failure view '%s' does not take the correct number of " - "arguments." % settings.CSRF_FAILURE_VIEW - ) - errors.append(Error(msg, id="security.E101")) - return errors diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/security/sessions.py b/.venv/lib/python3.10/site-packages/django/core/checks/security/sessions.py deleted file mode 100644 index f317d09..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/security/sessions.py +++ /dev/null @@ -1,99 +0,0 @@ -from django.conf import settings - -from .. import Tags, Warning, register - - -def add_session_cookie_message(message): - return message + ( - " Using a secure-only session cookie makes it more difficult for " - "network traffic sniffers to hijack user sessions." - ) - - -W010 = Warning( - add_session_cookie_message( - "You have 'django.contrib.sessions' in your INSTALLED_APPS, " - "but you have not set SESSION_COOKIE_SECURE to True." - ), - id="security.W010", -) - -W011 = Warning( - add_session_cookie_message( - "You have 'django.contrib.sessions.middleware.SessionMiddleware' " - "in your MIDDLEWARE, but you have not set " - "SESSION_COOKIE_SECURE to True." - ), - id="security.W011", -) - -W012 = Warning( - add_session_cookie_message("SESSION_COOKIE_SECURE is not set to True."), - id="security.W012", -) - - -def add_httponly_message(message): - return message + ( - " Using an HttpOnly session cookie makes it more difficult for " - "cross-site scripting attacks to hijack user sessions." - ) - - -W013 = Warning( - add_httponly_message( - "You have 'django.contrib.sessions' in your INSTALLED_APPS, " - "but you have not set SESSION_COOKIE_HTTPONLY to True.", - ), - id="security.W013", -) - -W014 = Warning( - add_httponly_message( - "You have 'django.contrib.sessions.middleware.SessionMiddleware' " - "in your MIDDLEWARE, but you have not set " - "SESSION_COOKIE_HTTPONLY to True." - ), - id="security.W014", -) - -W015 = Warning( - add_httponly_message("SESSION_COOKIE_HTTPONLY is not set to True."), - id="security.W015", -) - - -@register(Tags.security, deploy=True) -def check_session_cookie_secure(app_configs, **kwargs): - if settings.SESSION_COOKIE_SECURE is True: - return [] - errors = [] - if _session_app(): - errors.append(W010) - if _session_middleware(): - errors.append(W011) - if len(errors) > 1: - errors = [W012] - return errors - - -@register(Tags.security, deploy=True) -def check_session_cookie_httponly(app_configs, **kwargs): - if settings.SESSION_COOKIE_HTTPONLY is True: - return [] - errors = [] - if _session_app(): - errors.append(W013) - if _session_middleware(): - errors.append(W014) - if len(errors) > 1: - errors = [W015] - return errors - - -def _session_middleware(): - return "django.contrib.sessions.middleware.SessionMiddleware" in settings.MIDDLEWARE - - -def _session_app(): - return "django.contrib.sessions" in settings.INSTALLED_APPS diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/templates.py b/.venv/lib/python3.10/site-packages/django/core/checks/templates.py deleted file mode 100644 index 72a3212..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/templates.py +++ /dev/null @@ -1,12 +0,0 @@ -from . import Tags, register - - -@register(Tags.templates) -def check_templates(app_configs, **kwargs): - """Check all registered template engines.""" - from django.template import engines - - errors = [] - for engine in engines.all(): - errors.extend(engine.check()) - return errors diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/translation.py b/.venv/lib/python3.10/site-packages/django/core/checks/translation.py deleted file mode 100644 index 214e970..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/translation.py +++ /dev/null @@ -1,66 +0,0 @@ -from django.conf import settings -from django.utils.translation import get_supported_language_variant -from django.utils.translation.trans_real import language_code_re - -from . import Error, Tags, register - -E001 = Error( - "You have provided an invalid value for the LANGUAGE_CODE setting: {!r}.", - id="translation.E001", -) - -E002 = Error( - "You have provided an invalid language code in the LANGUAGES setting: {!r}.", - id="translation.E002", -) - -E003 = Error( - "You have provided an invalid language code in the LANGUAGES_BIDI setting: {!r}.", - id="translation.E003", -) - -E004 = Error( - "You have provided a value for the LANGUAGE_CODE setting that is not in " - "the LANGUAGES setting.", - id="translation.E004", -) - - -@register(Tags.translation) -def check_setting_language_code(app_configs, **kwargs): - """Error if LANGUAGE_CODE setting is invalid.""" - tag = settings.LANGUAGE_CODE - if not isinstance(tag, str) or not language_code_re.match(tag): - return [Error(E001.msg.format(tag), id=E001.id)] - return [] - - -@register(Tags.translation) -def check_setting_languages(app_configs, **kwargs): - """Error if LANGUAGES setting is invalid.""" - return [ - Error(E002.msg.format(tag), id=E002.id) - for tag, _ in settings.LANGUAGES - if not isinstance(tag, str) or not language_code_re.match(tag) - ] - - -@register(Tags.translation) -def check_setting_languages_bidi(app_configs, **kwargs): - """Error if LANGUAGES_BIDI setting is invalid.""" - return [ - Error(E003.msg.format(tag), id=E003.id) - for tag in settings.LANGUAGES_BIDI - if not isinstance(tag, str) or not language_code_re.match(tag) - ] - - -@register(Tags.translation) -def check_language_settings_consistent(app_configs, **kwargs): - """Error if language settings are not consistent with each other.""" - try: - get_supported_language_variant(settings.LANGUAGE_CODE) - except LookupError: - return [E004] - else: - return [] diff --git a/.venv/lib/python3.10/site-packages/django/core/checks/urls.py b/.venv/lib/python3.10/site-packages/django/core/checks/urls.py deleted file mode 100644 index aef2bfe..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/checks/urls.py +++ /dev/null @@ -1,159 +0,0 @@ -import inspect -from collections import Counter - -from django.conf import settings -from django.core.exceptions import ViewDoesNotExist - -from . import Error, Tags, Warning, register - - -@register(Tags.urls) -def check_url_config(app_configs, **kwargs): - if getattr(settings, "ROOT_URLCONF", None): - from django.urls import get_resolver - - resolver = get_resolver() - return check_resolver(resolver) - return [] - - -def check_resolver(resolver): - """ - Recursively check the resolver. - """ - check_method = getattr(resolver, "check", None) - if check_method is not None: - return check_method() - elif not hasattr(resolver, "resolve"): - return get_warning_for_invalid_pattern(resolver) - else: - return [] - - -@register(Tags.urls) -def check_url_namespaces_unique(app_configs, **kwargs): - """ - Warn if URL namespaces used in applications aren't unique. - """ - if not getattr(settings, "ROOT_URLCONF", None): - return [] - - from django.urls import get_resolver - - resolver = get_resolver() - all_namespaces = _load_all_namespaces(resolver) - counter = Counter(all_namespaces) - non_unique_namespaces = [n for n, count in counter.items() if count > 1] - errors = [] - for namespace in non_unique_namespaces: - errors.append( - Warning( - "URL namespace '{}' isn't unique. You may not be able to reverse " - "all URLs in this namespace".format(namespace), - id="urls.W005", - ) - ) - return errors - - -def _load_all_namespaces(resolver, parents=()): - """ - Recursively load all namespaces from URL patterns. - """ - url_patterns = getattr(resolver, "url_patterns", []) - namespaces = [ - ":".join(parents + (url.namespace,)) - for url in url_patterns - if getattr(url, "namespace", None) is not None - ] - for pattern in url_patterns: - namespace = getattr(pattern, "namespace", None) - current = parents - if namespace is not None: - current += (namespace,) - namespaces.extend(_load_all_namespaces(pattern, current)) - return namespaces - - -def get_warning_for_invalid_pattern(pattern): - """ - Return a list containing a warning that the pattern is invalid. - - describe_pattern() cannot be used here, because we cannot rely on the - urlpattern having regex or name attributes. - """ - if isinstance(pattern, str): - hint = ( - "Try removing the string '{}'. The list of urlpatterns should not " - "have a prefix string as the first element.".format(pattern) - ) - elif isinstance(pattern, tuple): - hint = "Try using path() instead of a tuple." - else: - hint = None - - return [ - Error( - "Your URL pattern {!r} is invalid. Ensure that urlpatterns is a list " - "of path() and/or re_path() instances.".format(pattern), - hint=hint, - id="urls.E004", - ) - ] - - -@register(Tags.urls) -def check_url_settings(app_configs, **kwargs): - errors = [] - for name in ("STATIC_URL", "MEDIA_URL"): - value = getattr(settings, name) - if value and not value.endswith("/"): - errors.append(E006(name)) - return errors - - -def E006(name): - return Error( - "The {} setting must end with a slash.".format(name), - id="urls.E006", - ) - - -@register(Tags.urls) -def check_custom_error_handlers(app_configs, **kwargs): - if not getattr(settings, "ROOT_URLCONF", None): - return [] - - from django.urls import get_resolver - - resolver = get_resolver() - - errors = [] - # All handlers take (request, exception) arguments except handler500 - # which takes (request). - for status_code, num_parameters in [(400, 2), (403, 2), (404, 2), (500, 1)]: - try: - handler = resolver.resolve_error_handler(status_code) - except (ImportError, ViewDoesNotExist) as e: - path = getattr(resolver.urlconf_module, "handler%s" % status_code) - msg = ( - "The custom handler{status_code} view '{path}' could not be " - "imported." - ).format(status_code=status_code, path=path) - errors.append(Error(msg, hint=str(e), id="urls.E008")) - continue - signature = inspect.signature(handler) - args = [None] * num_parameters - try: - signature.bind(*args) - except TypeError: - msg = ( - "The custom handler{status_code} view '{path}' does not " - "take the correct number of arguments ({args})." - ).format( - status_code=status_code, - path=handler.__module__ + "." + handler.__qualname__, - args="request, exception" if num_parameters == 2 else "request", - ) - errors.append(Error(msg, id="urls.E007")) - return errors diff --git a/.venv/lib/python3.10/site-packages/django/core/exceptions.py b/.venv/lib/python3.10/site-packages/django/core/exceptions.py deleted file mode 100644 index 7a02aa1..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/exceptions.py +++ /dev/null @@ -1,255 +0,0 @@ -""" -Global Django exception classes. -""" - -import operator - -from django.utils.hashable import make_hashable - - -class FieldDoesNotExist(Exception): - """The requested model field does not exist""" - - pass - - -class AppRegistryNotReady(Exception): - """The django.apps registry is not populated yet""" - - pass - - -class ObjectDoesNotExist(Exception): - """The requested object does not exist""" - - silent_variable_failure = True - - -class MultipleObjectsReturned(Exception): - """The query returned multiple objects when only one was expected.""" - - pass - - -class SuspiciousOperation(Exception): - """The user did something suspicious""" - - -class SuspiciousMultipartForm(SuspiciousOperation): - """Suspect MIME request in multipart form data""" - - pass - - -class SuspiciousFileOperation(SuspiciousOperation): - """A Suspicious filesystem operation was attempted""" - - pass - - -class DisallowedHost(SuspiciousOperation): - """HTTP_HOST header contains invalid value""" - - pass - - -class DisallowedRedirect(SuspiciousOperation): - """Redirect to scheme not in allowed list""" - - pass - - -class TooManyFieldsSent(SuspiciousOperation): - """ - The number of fields in a GET or POST request exceeded - settings.DATA_UPLOAD_MAX_NUMBER_FIELDS. - """ - - pass - - -class TooManyFilesSent(SuspiciousOperation): - """ - The number of fields in a GET or POST request exceeded - settings.DATA_UPLOAD_MAX_NUMBER_FILES. - """ - - pass - - -class RequestDataTooBig(SuspiciousOperation): - """ - The size of the request (excluding any file uploads) exceeded - settings.DATA_UPLOAD_MAX_MEMORY_SIZE. - """ - - pass - - -class RequestAborted(Exception): - """The request was closed before it was completed, or timed out.""" - - pass - - -class BadRequest(Exception): - """The request is malformed and cannot be processed.""" - - pass - - -class PermissionDenied(Exception): - """The user did not have permission to do that""" - - pass - - -class ViewDoesNotExist(Exception): - """The requested view does not exist""" - - pass - - -class MiddlewareNotUsed(Exception): - """This middleware is not used in this server configuration""" - - pass - - -class ImproperlyConfigured(Exception): - """Django is somehow improperly configured""" - - pass - - -class FieldError(Exception): - """Some kind of problem with a model field.""" - - pass - - -NON_FIELD_ERRORS = "__all__" - - -class ValidationError(Exception): - """An error while validating data.""" - - def __init__(self, message, code=None, params=None): - """ - The `message` argument can be a single error, a list of errors, or a - dictionary that maps field names to lists of errors. What we define as - an "error" can be either a simple string or an instance of - ValidationError with its message attribute set, and what we define as - list or dictionary can be an actual `list` or `dict` or an instance - of ValidationError with its `error_list` or `error_dict` attribute set. - """ - super().__init__(message, code, params) - - if isinstance(message, ValidationError): - if hasattr(message, "error_dict"): - message = message.error_dict - elif not hasattr(message, "message"): - message = message.error_list - else: - message, code, params = message.message, message.code, message.params - - if isinstance(message, dict): - self.error_dict = {} - for field, messages in message.items(): - if not isinstance(messages, ValidationError): - messages = ValidationError(messages) - self.error_dict[field] = messages.error_list - - elif isinstance(message, list): - self.error_list = [] - for message in message: - # Normalize plain strings to instances of ValidationError. - if not isinstance(message, ValidationError): - message = ValidationError(message) - if hasattr(message, "error_dict"): - self.error_list.extend(sum(message.error_dict.values(), [])) - else: - self.error_list.extend(message.error_list) - - else: - self.message = message - self.code = code - self.params = params - self.error_list = [self] - - @property - def message_dict(self): - # Trigger an AttributeError if this ValidationError - # doesn't have an error_dict. - getattr(self, "error_dict") - - return dict(self) - - @property - def messages(self): - if hasattr(self, "error_dict"): - return sum(dict(self).values(), []) - return list(self) - - def update_error_dict(self, error_dict): - if hasattr(self, "error_dict"): - for field, error_list in self.error_dict.items(): - error_dict.setdefault(field, []).extend(error_list) - else: - error_dict.setdefault(NON_FIELD_ERRORS, []).extend(self.error_list) - return error_dict - - def __iter__(self): - if hasattr(self, "error_dict"): - for field, errors in self.error_dict.items(): - yield field, list(ValidationError(errors)) - else: - for error in self.error_list: - message = error.message - if error.params: - message %= error.params - yield str(message) - - def __str__(self): - if hasattr(self, "error_dict"): - return repr(dict(self)) - return repr(list(self)) - - def __repr__(self): - return "ValidationError(%s)" % self - - def __eq__(self, other): - if not isinstance(other, ValidationError): - return NotImplemented - return hash(self) == hash(other) - - def __hash__(self): - if hasattr(self, "message"): - return hash( - ( - self.message, - self.code, - make_hashable(self.params), - ) - ) - if hasattr(self, "error_dict"): - return hash(make_hashable(self.error_dict)) - return hash(tuple(sorted(self.error_list, key=operator.attrgetter("message")))) - - -class EmptyResultSet(Exception): - """A database query predicate is impossible.""" - - pass - - -class FullResultSet(Exception): - """A database query predicate is matches everything.""" - - pass - - -class SynchronousOnlyOperation(Exception): - """The user tried to call a sync-only function from an async context.""" - - pass diff --git a/.venv/lib/python3.10/site-packages/django/core/files/__init__.py b/.venv/lib/python3.10/site-packages/django/core/files/__init__.py deleted file mode 100644 index d046aca..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.core.files.base import File - -__all__ = ["File"] diff --git a/.venv/lib/python3.10/site-packages/django/core/files/base.py b/.venv/lib/python3.10/site-packages/django/core/files/base.py deleted file mode 100644 index 9682467..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/base.py +++ /dev/null @@ -1,161 +0,0 @@ -import os -from io import BytesIO, StringIO, UnsupportedOperation - -from django.core.files.utils import FileProxyMixin -from django.utils.functional import cached_property - - -class File(FileProxyMixin): - DEFAULT_CHUNK_SIZE = 64 * 2**10 - - def __init__(self, file, name=None): - self.file = file - if name is None: - name = getattr(file, "name", None) - self.name = name - if hasattr(file, "mode"): - self.mode = file.mode - - def __str__(self): - return self.name or "" - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self or "None") - - def __bool__(self): - return bool(self.name) - - def __len__(self): - return self.size - - @cached_property - def size(self): - if hasattr(self.file, "size"): - return self.file.size - if hasattr(self.file, "name"): - try: - return os.path.getsize(self.file.name) - except (OSError, TypeError): - pass - if hasattr(self.file, "tell") and hasattr(self.file, "seek"): - pos = self.file.tell() - self.file.seek(0, os.SEEK_END) - size = self.file.tell() - self.file.seek(pos) - return size - raise AttributeError("Unable to determine the file's size.") - - def chunks(self, chunk_size=None): - """ - Read the file and yield chunks of ``chunk_size`` bytes (defaults to - ``File.DEFAULT_CHUNK_SIZE``). - """ - chunk_size = chunk_size or self.DEFAULT_CHUNK_SIZE - try: - self.seek(0) - except (AttributeError, UnsupportedOperation): - pass - - while True: - data = self.read(chunk_size) - if not data: - break - yield data - - def multiple_chunks(self, chunk_size=None): - """ - Return ``True`` if you can expect multiple chunks. - - NB: If a particular file representation is in memory, subclasses should - always return ``False`` -- there's no good reason to read from memory in - chunks. - """ - return self.size > (chunk_size or self.DEFAULT_CHUNK_SIZE) - - def __iter__(self): - # Iterate over this file-like object by newlines - buffer_ = None - for chunk in self.chunks(): - for line in chunk.splitlines(True): - if buffer_: - if endswith_cr(buffer_) and not equals_lf(line): - # Line split after a \r newline; yield buffer_. - yield buffer_ - # Continue with line. - else: - # Line either split without a newline (line - # continues after buffer_) or with \r\n - # newline (line == b'\n'). - line = buffer_ + line - # buffer_ handled, clear it. - buffer_ = None - - # If this is the end of a \n or \r\n line, yield. - if endswith_lf(line): - yield line - else: - buffer_ = line - - if buffer_ is not None: - yield buffer_ - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, tb): - self.close() - - def open(self, mode=None, *args, **kwargs): - if not self.closed: - self.seek(0) - elif self.name and os.path.exists(self.name): - self.file = open(self.name, mode or self.mode, *args, **kwargs) - else: - raise ValueError("The file cannot be reopened.") - return self - - def close(self): - self.file.close() - - -class ContentFile(File): - """ - A File-like object that takes just raw content, rather than an actual file. - """ - - def __init__(self, content, name=None): - stream_class = StringIO if isinstance(content, str) else BytesIO - super().__init__(stream_class(content), name=name) - self.size = len(content) - - def __str__(self): - return "Raw content" - - def __bool__(self): - return True - - def open(self, mode=None): - self.seek(0) - return self - - def close(self): - pass - - def write(self, data): - self.__dict__.pop("size", None) # Clear the computed size. - return self.file.write(data) - - -def endswith_cr(line): - """Return True if line (a text or bytestring) ends with '\r'.""" - return line.endswith("\r" if isinstance(line, str) else b"\r") - - -def endswith_lf(line): - """Return True if line (a text or bytestring) ends with '\n'.""" - return line.endswith("\n" if isinstance(line, str) else b"\n") - - -def equals_lf(line): - """Return True if line (a text or bytestring) equals '\n'.""" - return line == ("\n" if isinstance(line, str) else b"\n") diff --git a/.venv/lib/python3.10/site-packages/django/core/files/images.py b/.venv/lib/python3.10/site-packages/django/core/files/images.py deleted file mode 100644 index 7c1532a..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/images.py +++ /dev/null @@ -1,89 +0,0 @@ -""" -Utility functions for handling images. - -Requires Pillow as you might imagine. -""" - -import struct -import zlib - -from django.core.files import File - - -class ImageFile(File): - """ - A mixin for use alongside django.core.files.base.File, which provides - additional features for dealing with images. - """ - - @property - def width(self): - return self._get_image_dimensions()[0] - - @property - def height(self): - return self._get_image_dimensions()[1] - - def _get_image_dimensions(self): - if not hasattr(self, "_dimensions_cache"): - close = self.closed - self.open() - self._dimensions_cache = get_image_dimensions(self, close=close) - return self._dimensions_cache - - -def get_image_dimensions(file_or_path, close=False): - """ - Return the (width, height) of an image, given an open file or a path. Set - 'close' to True to close the file at the end if it is initially in an open - state. - """ - from PIL import ImageFile as PillowImageFile - - p = PillowImageFile.Parser() - if hasattr(file_or_path, "read"): - file = file_or_path - file_pos = file.tell() - file.seek(0) - else: - try: - file = open(file_or_path, "rb") - except OSError: - return (None, None) - close = True - try: - # Most of the time Pillow only needs a small chunk to parse the image - # and get the dimensions, but with some TIFF files Pillow needs to - # parse the whole file. - chunk_size = 1024 - while 1: - data = file.read(chunk_size) - if not data: - break - try: - p.feed(data) - except zlib.error as e: - # ignore zlib complaining on truncated stream, just feed more - # data to parser (ticket #19457). - if e.args[0].startswith("Error -5"): - pass - else: - raise - except struct.error: - # Ignore PIL failing on a too short buffer when reads return - # less bytes than expected. Skip and feed more data to the - # parser (ticket #24544). - pass - except RuntimeError: - # e.g. "RuntimeError: could not create decoder object" for - # WebP files. A different chunk_size may work. - pass - if p.image: - return p.image.size - chunk_size *= 2 - return (None, None) - finally: - if close: - file.close() - else: - file.seek(file_pos) diff --git a/.venv/lib/python3.10/site-packages/django/core/files/locks.py b/.venv/lib/python3.10/site-packages/django/core/files/locks.py deleted file mode 100644 index a7a7a22..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/locks.py +++ /dev/null @@ -1,128 +0,0 @@ -""" -Portable file locking utilities. - -Based partially on an example by Jonathan Feignberg in the Python -Cookbook [1] (licensed under the Python Software License) and a ctypes port by -Anatoly Techtonik for Roundup [2] (license [3]). - -[1] https://code.activestate.com/recipes/65203/ -[2] https://sourceforge.net/p/roundup/code/ci/default/tree/roundup/backends/portalocker.py # NOQA -[3] https://sourceforge.net/p/roundup/code/ci/default/tree/COPYING.txt - -Example Usage:: - - >>> from django.core.files import locks - >>> with open('./file', 'wb') as f: - ... locks.lock(f, locks.LOCK_EX) - ... f.write('Django') -""" - -import os - -__all__ = ("LOCK_EX", "LOCK_SH", "LOCK_NB", "lock", "unlock") - - -def _fd(f): - """Get a filedescriptor from something which could be a file or an fd.""" - return f.fileno() if hasattr(f, "fileno") else f - - -if os.name == "nt": - import msvcrt - from ctypes import ( - POINTER, - Structure, - Union, - WinDLL, - byref, - c_int64, - c_ulong, - c_void_p, - sizeof, - ) - from ctypes.wintypes import BOOL, DWORD, HANDLE - - LOCK_SH = 0 # the default - LOCK_NB = 0x1 # LOCKFILE_FAIL_IMMEDIATELY - LOCK_EX = 0x2 # LOCKFILE_EXCLUSIVE_LOCK - - # --- Adapted from the pyserial project --- - # detect size of ULONG_PTR - if sizeof(c_ulong) != sizeof(c_void_p): - ULONG_PTR = c_int64 - else: - ULONG_PTR = c_ulong - PVOID = c_void_p - - # --- Union inside Structure by stackoverflow:3480240 --- - class _OFFSET(Structure): - _fields_ = [("Offset", DWORD), ("OffsetHigh", DWORD)] - - class _OFFSET_UNION(Union): - _anonymous_ = ["_offset"] - _fields_ = [("_offset", _OFFSET), ("Pointer", PVOID)] - - class OVERLAPPED(Structure): - _anonymous_ = ["_offset_union"] - _fields_ = [ - ("Internal", ULONG_PTR), - ("InternalHigh", ULONG_PTR), - ("_offset_union", _OFFSET_UNION), - ("hEvent", HANDLE), - ] - - LPOVERLAPPED = POINTER(OVERLAPPED) - - # --- Define function prototypes for extra safety --- - kernel32 = WinDLL("kernel32") - LockFileEx = kernel32.LockFileEx - LockFileEx.restype = BOOL - LockFileEx.argtypes = [HANDLE, DWORD, DWORD, DWORD, DWORD, LPOVERLAPPED] - UnlockFileEx = kernel32.UnlockFileEx - UnlockFileEx.restype = BOOL - UnlockFileEx.argtypes = [HANDLE, DWORD, DWORD, DWORD, LPOVERLAPPED] - - def lock(f, flags): - hfile = msvcrt.get_osfhandle(_fd(f)) - overlapped = OVERLAPPED() - ret = LockFileEx(hfile, flags, 0, 0, 0xFFFF0000, byref(overlapped)) - return bool(ret) - - def unlock(f): - hfile = msvcrt.get_osfhandle(_fd(f)) - overlapped = OVERLAPPED() - ret = UnlockFileEx(hfile, 0, 0, 0xFFFF0000, byref(overlapped)) - return bool(ret) - -else: - try: - import fcntl - - LOCK_SH = fcntl.LOCK_SH # shared lock - LOCK_NB = fcntl.LOCK_NB # non-blocking - LOCK_EX = fcntl.LOCK_EX - except (ImportError, AttributeError): - # File locking is not supported. - LOCK_EX = LOCK_SH = LOCK_NB = 0 - - # Dummy functions that don't do anything. - def lock(f, flags): - # File is not locked - return False - - def unlock(f): - # File is unlocked - return True - - else: - - def lock(f, flags): - try: - fcntl.flock(_fd(f), flags) - return True - except BlockingIOError: - return False - - def unlock(f): - fcntl.flock(_fd(f), fcntl.LOCK_UN) - return True diff --git a/.venv/lib/python3.10/site-packages/django/core/files/move.py b/.venv/lib/python3.10/site-packages/django/core/files/move.py deleted file mode 100644 index d7a9c70..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/move.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -Move a file in the safest way possible:: - - >>> from django.core.files.move import file_move_safe - >>> file_move_safe("/tmp/old_file", "/tmp/new_file") -""" - -import os -from shutil import copymode, copystat - -from django.core.files import locks - -__all__ = ["file_move_safe"] - - -def file_move_safe( - old_file_name, new_file_name, chunk_size=1024 * 64, allow_overwrite=False -): - """ - Move a file from one location to another in the safest way possible. - - First, try ``os.rename``, which is simple but will break across filesystems. - If that fails, stream manually from one file to another in pure Python. - - If the destination file exists and ``allow_overwrite`` is ``False``, raise - ``FileExistsError``. - """ - # There's no reason to move if we don't have to. - try: - if os.path.samefile(old_file_name, new_file_name): - return - except OSError: - pass - - if not allow_overwrite and os.access(new_file_name, os.F_OK): - raise FileExistsError( - f"Destination file {new_file_name} exists and allow_overwrite is False." - ) - - try: - os.rename(old_file_name, new_file_name) - return - except OSError: - # OSError happens with os.rename() if moving to another filesystem or - # when moving opened files on certain operating systems. - pass - - # first open the old file, so that it won't go away - with open(old_file_name, "rb") as old_file: - # now open the new file, not forgetting allow_overwrite - fd = os.open( - new_file_name, - ( - os.O_WRONLY - | os.O_CREAT - | getattr(os, "O_BINARY", 0) - | (os.O_EXCL if not allow_overwrite else 0) - ), - ) - try: - locks.lock(fd, locks.LOCK_EX) - current_chunk = None - while current_chunk != b"": - current_chunk = old_file.read(chunk_size) - os.write(fd, current_chunk) - finally: - locks.unlock(fd) - os.close(fd) - - try: - copystat(old_file_name, new_file_name) - except PermissionError: - # Certain filesystems (e.g. CIFS) fail to copy the file's metadata if - # the type of the destination filesystem isn't the same as the source - # filesystem. This also happens with some SELinux-enabled systems. - # Ignore that, but try to set basic permissions. - try: - copymode(old_file_name, new_file_name) - except PermissionError: - pass - - try: - os.remove(old_file_name) - except PermissionError as e: - # Certain operating systems (Cygwin and Windows) - # fail when deleting opened files, ignore it. (For the - # systems where this happens, temporary files will be auto-deleted - # on close anyway.) - if getattr(e, "winerror", 0) != 32: - raise diff --git a/.venv/lib/python3.10/site-packages/django/core/files/storage/__init__.py b/.venv/lib/python3.10/site-packages/django/core/files/storage/__init__.py deleted file mode 100644 index a236cab..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/storage/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -from django.conf import DEFAULT_STORAGE_ALIAS -from django.utils.functional import LazyObject - -from .base import Storage -from .filesystem import FileSystemStorage -from .handler import InvalidStorageError, StorageHandler -from .memory import InMemoryStorage - -__all__ = ( - "FileSystemStorage", - "InMemoryStorage", - "Storage", - "DefaultStorage", - "default_storage", - "InvalidStorageError", - "StorageHandler", - "storages", -) - - -class DefaultStorage(LazyObject): - def _setup(self): - self._wrapped = storages[DEFAULT_STORAGE_ALIAS] - - -storages = StorageHandler() -default_storage = DefaultStorage() diff --git a/.venv/lib/python3.10/site-packages/django/core/files/storage/base.py b/.venv/lib/python3.10/site-packages/django/core/files/storage/base.py deleted file mode 100644 index 31ecbd2..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/storage/base.py +++ /dev/null @@ -1,206 +0,0 @@ -import os -import pathlib - -from django.core.exceptions import SuspiciousFileOperation -from django.core.files import File -from django.core.files.utils import validate_file_name -from django.utils.crypto import get_random_string -from django.utils.text import get_valid_filename - - -class Storage: - """ - A base storage class, providing some default behaviors that all other - storage systems can inherit or override, as necessary. - """ - - # The following methods represent a public interface to private methods. - # These shouldn't be overridden by subclasses unless absolutely necessary. - - def open(self, name, mode="rb"): - """Retrieve the specified file from storage.""" - return self._open(name, mode) - - def save(self, name, content, max_length=None): - """ - Save new content to the file specified by name. The content should be - a proper File object or any Python file-like object, ready to be read - from the beginning. - """ - # Get the proper name for the file, as it will actually be saved. - if name is None: - name = content.name - - if not hasattr(content, "chunks"): - content = File(content, name) - - # Ensure that the name is valid, before and after having the storage - # system potentially modifying the name. This duplicates the check made - # inside `get_available_name` but it's necessary for those cases where - # `get_available_name` is overriden and validation is lost. - validate_file_name(name, allow_relative_path=True) - - # Potentially find a different name depending on storage constraints. - name = self.get_available_name(name, max_length=max_length) - # Validate the (potentially) new name. - validate_file_name(name, allow_relative_path=True) - - # The save operation should return the actual name of the file saved. - name = self._save(name, content) - # Ensure that the name returned from the storage system is still valid. - validate_file_name(name, allow_relative_path=True) - return name - - def is_name_available(self, name, max_length=None): - exceeds_max_length = max_length and len(name) > max_length - return not self.exists(name) and not exceeds_max_length - - # These methods are part of the public API, with default implementations. - - def get_valid_name(self, name): - """ - Return a filename, based on the provided filename, that's suitable for - use in the target storage system. - """ - return get_valid_filename(name) - - def get_alternative_name(self, file_root, file_ext): - """ - Return an alternative filename, by adding an underscore and a random 7 - character alphanumeric string (before the file extension, if one - exists) to the filename. - """ - return "%s_%s%s" % (file_root, get_random_string(7), file_ext) - - def get_available_name(self, name, max_length=None): - """ - Return a filename that's free on the target storage system and - available for new content to be written to. - """ - name = str(name).replace("\\", "/") - dir_name, file_name = os.path.split(name) - if ".." in pathlib.PurePath(dir_name).parts: - raise SuspiciousFileOperation( - "Detected path traversal attempt in '%s'" % dir_name - ) - validate_file_name(file_name) - file_ext = "".join(pathlib.PurePath(file_name).suffixes) - file_root = file_name.removesuffix(file_ext) - # If the filename is not available, generate an alternative - # filename until one is available. - # Truncate original name if required, so the new filename does not - # exceed the max_length. - while not self.is_name_available(name, max_length=max_length): - # file_ext includes the dot. - name = os.path.join( - dir_name, self.get_alternative_name(file_root, file_ext) - ) - if max_length is None: - continue - # Truncate file_root if max_length exceeded. - truncation = len(name) - max_length - if truncation > 0: - file_root = file_root[:-truncation] - # Entire file_root was truncated in attempt to find an - # available filename. - if not file_root: - raise SuspiciousFileOperation( - 'Storage can not find an available filename for "%s". ' - "Please make sure that the corresponding file field " - 'allows sufficient "max_length".' % name - ) - name = os.path.join( - dir_name, self.get_alternative_name(file_root, file_ext) - ) - return name - - def generate_filename(self, filename): - """ - Validate the filename by calling get_valid_name() and return a filename - to be passed to the save() method. - """ - filename = str(filename).replace("\\", "/") - # `filename` may include a path as returned by FileField.upload_to. - dirname, filename = os.path.split(filename) - if ".." in pathlib.PurePath(dirname).parts: - raise SuspiciousFileOperation( - "Detected path traversal attempt in '%s'" % dirname - ) - return os.path.normpath(os.path.join(dirname, self.get_valid_name(filename))) - - def path(self, name): - """ - Return a local filesystem path where the file can be retrieved using - Python's built-in open() function. Storage systems that can't be - accessed using open() should *not* implement this method. - """ - raise NotImplementedError("This backend doesn't support absolute paths.") - - # The following methods form the public API for storage systems, but with - # no default implementations. Subclasses must implement *all* of these. - - def delete(self, name): - """ - Delete the specified file from the storage system. - """ - raise NotImplementedError( - "subclasses of Storage must provide a delete() method" - ) - - def exists(self, name): - """ - Return True if a file referenced by the given name already exists in the - storage system, or False if the name is available for a new file. - """ - raise NotImplementedError( - "subclasses of Storage must provide an exists() method" - ) - - def listdir(self, path): - """ - List the contents of the specified path. Return a 2-tuple of lists: - the first item being directories, the second item being files. - """ - raise NotImplementedError( - "subclasses of Storage must provide a listdir() method" - ) - - def size(self, name): - """ - Return the total size, in bytes, of the file specified by name. - """ - raise NotImplementedError("subclasses of Storage must provide a size() method") - - def url(self, name): - """ - Return an absolute URL where the file's contents can be accessed - directly by a web browser. - """ - raise NotImplementedError("subclasses of Storage must provide a url() method") - - def get_accessed_time(self, name): - """ - Return the last accessed time (as a datetime) of the file specified by - name. The datetime will be timezone-aware if USE_TZ=True. - """ - raise NotImplementedError( - "subclasses of Storage must provide a get_accessed_time() method" - ) - - def get_created_time(self, name): - """ - Return the creation time (as a datetime) of the file specified by name. - The datetime will be timezone-aware if USE_TZ=True. - """ - raise NotImplementedError( - "subclasses of Storage must provide a get_created_time() method" - ) - - def get_modified_time(self, name): - """ - Return the last modified time (as a datetime) of the file specified by - name. The datetime will be timezone-aware if USE_TZ=True. - """ - raise NotImplementedError( - "subclasses of Storage must provide a get_modified_time() method" - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/files/storage/filesystem.py b/.venv/lib/python3.10/site-packages/django/core/files/storage/filesystem.py deleted file mode 100644 index 1bd9aa0..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/storage/filesystem.py +++ /dev/null @@ -1,248 +0,0 @@ -import os -import warnings -from datetime import datetime, timezone -from urllib.parse import urljoin - -from django.conf import settings -from django.core.files import File, locks -from django.core.files.move import file_move_safe -from django.core.signals import setting_changed -from django.utils._os import safe_join -from django.utils.deconstruct import deconstructible -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.encoding import filepath_to_uri -from django.utils.functional import cached_property - -from .base import Storage -from .mixins import StorageSettingsMixin - - -@deconstructible(path="django.core.files.storage.FileSystemStorage") -class FileSystemStorage(Storage, StorageSettingsMixin): - """ - Standard filesystem storage - """ - - # RemovedInDjango60Warning: remove OS_OPEN_FLAGS. - OS_OPEN_FLAGS = os.O_WRONLY | os.O_CREAT | os.O_EXCL | getattr(os, "O_BINARY", 0) - - def __init__( - self, - location=None, - base_url=None, - file_permissions_mode=None, - directory_permissions_mode=None, - allow_overwrite=False, - ): - self._location = location - self._base_url = base_url - self._file_permissions_mode = file_permissions_mode - self._directory_permissions_mode = directory_permissions_mode - self._allow_overwrite = allow_overwrite - setting_changed.connect(self._clear_cached_properties) - # RemovedInDjango60Warning: remove this warning. - if self.OS_OPEN_FLAGS != os.O_WRONLY | os.O_CREAT | os.O_EXCL | getattr( - os, "O_BINARY", 0 - ): - warnings.warn( - "Overriding OS_OPEN_FLAGS is deprecated. Use " - "the allow_overwrite parameter instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - - @cached_property - def base_location(self): - return self._value_or_setting(self._location, settings.MEDIA_ROOT) - - @cached_property - def location(self): - return os.path.abspath(self.base_location) - - @cached_property - def base_url(self): - if self._base_url is not None and not self._base_url.endswith("/"): - self._base_url += "/" - return self._value_or_setting(self._base_url, settings.MEDIA_URL) - - @cached_property - def file_permissions_mode(self): - return self._value_or_setting( - self._file_permissions_mode, settings.FILE_UPLOAD_PERMISSIONS - ) - - @cached_property - def directory_permissions_mode(self): - return self._value_or_setting( - self._directory_permissions_mode, settings.FILE_UPLOAD_DIRECTORY_PERMISSIONS - ) - - def _open(self, name, mode="rb"): - return File(open(self.path(name), mode)) - - def _save(self, name, content): - full_path = self.path(name) - - # Create any intermediate directories that do not exist. - directory = os.path.dirname(full_path) - try: - if self.directory_permissions_mode is not None: - # Set the umask because os.makedirs() doesn't apply the "mode" - # argument to intermediate-level directories. - old_umask = os.umask(0o777 & ~self.directory_permissions_mode) - try: - os.makedirs( - directory, self.directory_permissions_mode, exist_ok=True - ) - finally: - os.umask(old_umask) - else: - os.makedirs(directory, exist_ok=True) - except FileExistsError: - raise FileExistsError("%s exists and is not a directory." % directory) - - # There's a potential race condition between get_available_name and - # saving the file; it's possible that two threads might return the - # same name, at which point all sorts of fun happens. So we need to - # try to create the file, but if it already exists we have to go back - # to get_available_name() and try again. - - while True: - try: - # This file has a file path that we can move. - if hasattr(content, "temporary_file_path"): - file_move_safe( - content.temporary_file_path(), - full_path, - allow_overwrite=self._allow_overwrite, - ) - - # This is a normal uploadedfile that we can stream. - else: - # The combination of O_CREAT and O_EXCL makes os.open() raises an - # OSError if the file already exists before it's opened. - open_flags = ( - os.O_WRONLY - | os.O_CREAT - | os.O_EXCL - | getattr(os, "O_BINARY", 0) - ) - # RemovedInDjango60Warning: when the deprecation ends, replace with: - # if self._allow_overwrite: - # open_flags = open_flags & ~os.O_EXCL | os.O_TRUNC - if self.OS_OPEN_FLAGS != open_flags: - open_flags = self.OS_OPEN_FLAGS - elif self._allow_overwrite: - open_flags = open_flags & ~os.O_EXCL | os.O_TRUNC - fd = os.open(full_path, open_flags, 0o666) - _file = None - try: - locks.lock(fd, locks.LOCK_EX) - for chunk in content.chunks(): - if _file is None: - mode = "wb" if isinstance(chunk, bytes) else "wt" - _file = os.fdopen(fd, mode) - _file.write(chunk) - finally: - locks.unlock(fd) - if _file is not None: - _file.close() - else: - os.close(fd) - except FileExistsError: - # A new name is needed if the file exists. - name = self.get_available_name(name) - full_path = self.path(name) - else: - # OK, the file save worked. Break out of the loop. - break - - if self.file_permissions_mode is not None: - os.chmod(full_path, self.file_permissions_mode) - - # Ensure the saved path is always relative to the storage root. - name = os.path.relpath(full_path, self.location) - # Ensure the moved file has the same gid as the storage root. - self._ensure_location_group_id(full_path) - # Store filenames with forward slashes, even on Windows. - return str(name).replace("\\", "/") - - def _ensure_location_group_id(self, full_path): - if os.name == "posix": - file_gid = os.stat(full_path).st_gid - location_gid = os.stat(self.location).st_gid - if file_gid != location_gid: - try: - os.chown(full_path, uid=-1, gid=location_gid) - except PermissionError: - pass - - def delete(self, name): - if not name: - raise ValueError("The name must be given to delete().") - name = self.path(name) - # If the file or directory exists, delete it from the filesystem. - try: - if os.path.isdir(name): - os.rmdir(name) - else: - os.remove(name) - except FileNotFoundError: - # FileNotFoundError is raised if the file or directory was removed - # concurrently. - pass - - def is_name_available(self, name, max_length=None): - if self._allow_overwrite: - return not (max_length and len(name) > max_length) - return super().is_name_available(name, max_length=max_length) - - def get_alternative_name(self, file_root, file_ext): - if self._allow_overwrite: - return f"{file_root}{file_ext}" - return super().get_alternative_name(file_root, file_ext) - - def exists(self, name): - return os.path.lexists(self.path(name)) - - def listdir(self, path): - path = self.path(path) - directories, files = [], [] - with os.scandir(path) as entries: - for entry in entries: - if entry.is_dir(): - directories.append(entry.name) - else: - files.append(entry.name) - return directories, files - - def path(self, name): - return safe_join(self.location, name) - - def size(self, name): - return os.path.getsize(self.path(name)) - - def url(self, name): - if self.base_url is None: - raise ValueError("This file is not accessible via a URL.") - url = filepath_to_uri(name) - if url is not None: - url = url.lstrip("/") - return urljoin(self.base_url, url) - - def _datetime_from_timestamp(self, ts): - """ - If timezone support is enabled, make an aware datetime object in UTC; - otherwise make a naive one in the local timezone. - """ - tz = timezone.utc if settings.USE_TZ else None - return datetime.fromtimestamp(ts, tz=tz) - - def get_accessed_time(self, name): - return self._datetime_from_timestamp(os.path.getatime(self.path(name))) - - def get_created_time(self, name): - return self._datetime_from_timestamp(os.path.getctime(self.path(name))) - - def get_modified_time(self, name): - return self._datetime_from_timestamp(os.path.getmtime(self.path(name))) diff --git a/.venv/lib/python3.10/site-packages/django/core/files/storage/handler.py b/.venv/lib/python3.10/site-packages/django/core/files/storage/handler.py deleted file mode 100644 index ca379c9..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/storage/handler.py +++ /dev/null @@ -1,46 +0,0 @@ -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.utils.functional import cached_property -from django.utils.module_loading import import_string - - -class InvalidStorageError(ImproperlyConfigured): - pass - - -class StorageHandler: - def __init__(self, backends=None): - # backends is an optional dict of storage backend definitions - # (structured like settings.STORAGES). - self._backends = backends - self._storages = {} - - @cached_property - def backends(self): - if self._backends is None: - self._backends = settings.STORAGES.copy() - return self._backends - - def __getitem__(self, alias): - try: - return self._storages[alias] - except KeyError: - try: - params = self.backends[alias] - except KeyError: - raise InvalidStorageError( - f"Could not find config for '{alias}' in settings.STORAGES." - ) - storage = self.create_storage(params) - self._storages[alias] = storage - return storage - - def create_storage(self, params): - params = params.copy() - backend = params.pop("BACKEND") - options = params.pop("OPTIONS", {}) - try: - storage_cls = import_string(backend) - except ImportError as e: - raise InvalidStorageError(f"Could not find backend {backend!r}: {e}") from e - return storage_cls(**options) diff --git a/.venv/lib/python3.10/site-packages/django/core/files/storage/memory.py b/.venv/lib/python3.10/site-packages/django/core/files/storage/memory.py deleted file mode 100644 index 22b8c62..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/storage/memory.py +++ /dev/null @@ -1,293 +0,0 @@ -""" -Based on dj-inmemorystorage (BSD) by Cody Soyland, Seán Hayes, Tore Birkeland, -and Nick Presta. -""" - -import errno -import io -import os -import pathlib -from urllib.parse import urljoin - -from django.conf import settings -from django.core.files.base import ContentFile -from django.core.signals import setting_changed -from django.utils._os import safe_join -from django.utils.deconstruct import deconstructible -from django.utils.encoding import filepath_to_uri -from django.utils.functional import cached_property -from django.utils.timezone import now - -from .base import Storage -from .mixins import StorageSettingsMixin - -__all__ = ("InMemoryStorage",) - - -class TimingMixin: - def _initialize_times(self): - self.created_time = now() - self.accessed_time = self.created_time - self.modified_time = self.created_time - - def _update_accessed_time(self): - self.accessed_time = now() - - def _update_modified_time(self): - self.modified_time = now() - - -class InMemoryFileNode(ContentFile, TimingMixin): - """ - Helper class representing an in-memory file node. - - Handle unicode/bytes conversion during I/O operations and record creation, - modification, and access times. - """ - - def __init__(self, content="", name=None): - super().__init__(content, name) - self._content_type = type(content) - self._initialize_times() - - def open(self, mode): - self._convert_stream_content(mode) - self._update_accessed_time() - return super().open(mode) - - def write(self, data): - super().write(data) - self._update_modified_time() - - def _initialize_stream(self): - """Initialize underlying stream according to the content type.""" - self.file = io.BytesIO() if self._content_type == bytes else io.StringIO() - - def _convert_stream_content(self, mode): - """Convert actual file content according to the opening mode.""" - new_content_type = bytes if "b" in mode else str - # No conversion needed. - if self._content_type == new_content_type: - return - - content = self.file.getvalue() - content = content.encode() if isinstance(content, str) else content.decode() - self._content_type = new_content_type - self._initialize_stream() - - self.file.write(content) - - -class InMemoryDirNode(TimingMixin): - """ - Helper class representing an in-memory directory node. - - Handle path navigation of directory trees, creating missing nodes if - needed. - """ - - def __init__(self): - self._children = {} - self._initialize_times() - - def resolve(self, path, create_if_missing=False, leaf_cls=None, check_exists=True): - """ - Navigate current directory tree, returning node matching path or - creating a new one, if missing. - - path: path of the node to search - - create_if_missing: create nodes if not exist. Defaults to False. - - leaf_cls: expected type of leaf node. Defaults to None. - - check_exists: if True and the leaf node does not exist, raise a - FileNotFoundError. Defaults to True. - """ - path_segments = list(pathlib.Path(path).parts) - current_node = self - - while path_segments: - path_segment = path_segments.pop(0) - # If current node is a file node and there are unprocessed - # segments, raise an error. - if isinstance(current_node, InMemoryFileNode): - path_segments = os.path.split(path) - current_path = "/".join( - path_segments[: path_segments.index(path_segment)] - ) - raise NotADirectoryError( - errno.ENOTDIR, os.strerror(errno.ENOTDIR), current_path - ) - current_node = current_node._resolve_child( - path_segment, - create_if_missing, - leaf_cls if len(path_segments) == 0 else InMemoryDirNode, - ) - if current_node is None: - break - - if current_node is None and check_exists: - raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), path) - - # If a leaf_cls is not None, check if leaf node is of right type. - if leaf_cls and not isinstance(current_node, leaf_cls): - error_cls, error_code = ( - (NotADirectoryError, errno.ENOTDIR) - if leaf_cls is InMemoryDirNode - else (IsADirectoryError, errno.EISDIR) - ) - raise error_cls(error_code, os.strerror(error_code), path) - - return current_node - - def _resolve_child(self, path_segment, create_if_missing, child_cls): - if create_if_missing: - self._update_accessed_time() - self._update_modified_time() - if child_cls is InMemoryFileNode: - child = child_cls(name=path_segment) - else: - child = child_cls() - return self._children.setdefault(path_segment, child) - return self._children.get(path_segment) - - def listdir(self): - directories, files = [], [] - for name, entry in self._children.items(): - if isinstance(entry, InMemoryDirNode): - directories.append(name) - else: - files.append(name) - return directories, files - - def remove_child(self, name): - if name in self._children: - self._update_accessed_time() - self._update_modified_time() - del self._children[name] - - -@deconstructible(path="django.core.files.storage.InMemoryStorage") -class InMemoryStorage(Storage, StorageSettingsMixin): - """A storage saving files in memory.""" - - def __init__( - self, - location=None, - base_url=None, - file_permissions_mode=None, - directory_permissions_mode=None, - ): - self._location = location - self._base_url = base_url - self._file_permissions_mode = file_permissions_mode - self._directory_permissions_mode = directory_permissions_mode - self._root = InMemoryDirNode() - self._resolve( - self.base_location, create_if_missing=True, leaf_cls=InMemoryDirNode - ) - setting_changed.connect(self._clear_cached_properties) - - @cached_property - def base_location(self): - return self._value_or_setting(self._location, settings.MEDIA_ROOT) - - @cached_property - def location(self): - return os.path.abspath(self.base_location) - - @cached_property - def base_url(self): - if self._base_url is not None and not self._base_url.endswith("/"): - self._base_url += "/" - return self._value_or_setting(self._base_url, settings.MEDIA_URL) - - @cached_property - def file_permissions_mode(self): - return self._value_or_setting( - self._file_permissions_mode, settings.FILE_UPLOAD_PERMISSIONS - ) - - @cached_property - def directory_permissions_mode(self): - return self._value_or_setting( - self._directory_permissions_mode, settings.FILE_UPLOAD_DIRECTORY_PERMISSIONS - ) - - def _relative_path(self, name): - full_path = self.path(name) - return os.path.relpath(full_path, self.location) - - def _resolve(self, name, create_if_missing=False, leaf_cls=None, check_exists=True): - try: - relative_path = self._relative_path(name) - return self._root.resolve( - relative_path, - create_if_missing=create_if_missing, - leaf_cls=leaf_cls, - check_exists=check_exists, - ) - except NotADirectoryError as exc: - absolute_path = self.path(exc.filename) - raise FileExistsError(f"{absolute_path} exists and is not a directory.") - - def _open(self, name, mode="rb"): - create_if_missing = "w" in mode - file_node = self._resolve( - name, create_if_missing=create_if_missing, leaf_cls=InMemoryFileNode - ) - return file_node.open(mode) - - def _save(self, name, content): - file_node = self._resolve( - name, create_if_missing=True, leaf_cls=InMemoryFileNode - ) - fd = None - for chunk in content.chunks(): - if fd is None: - mode = "wb" if isinstance(chunk, bytes) else "wt" - fd = file_node.open(mode) - fd.write(chunk) - - if hasattr(content, "temporary_file_path"): - os.remove(content.temporary_file_path()) - - file_node.modified_time = now() - return self._relative_path(name).replace("\\", "/") - - def path(self, name): - return safe_join(self.location, name) - - def delete(self, name): - path, filename = os.path.split(name) - dir_node = self._resolve(path, check_exists=False) - if dir_node is None: - return None - dir_node.remove_child(filename) - - def exists(self, name): - return self._resolve(name, check_exists=False) is not None - - def listdir(self, path): - node = self._resolve(path, leaf_cls=InMemoryDirNode) - return node.listdir() - - def size(self, name): - return len(self._open(name, "rb").file.getvalue()) - - def url(self, name): - if self.base_url is None: - raise ValueError("This file is not accessible via a URL.") - url = filepath_to_uri(name) - if url is not None: - url = url.lstrip("/") - return urljoin(self.base_url, url) - - def get_accessed_time(self, name): - file_node = self._resolve(name) - return file_node.accessed_time - - def get_created_time(self, name): - file_node = self._resolve(name) - return file_node.created_time - - def get_modified_time(self, name): - file_node = self._resolve(name) - return file_node.modified_time diff --git a/.venv/lib/python3.10/site-packages/django/core/files/storage/mixins.py b/.venv/lib/python3.10/site-packages/django/core/files/storage/mixins.py deleted file mode 100644 index 663a163..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/storage/mixins.py +++ /dev/null @@ -1,15 +0,0 @@ -class StorageSettingsMixin: - def _clear_cached_properties(self, setting, **kwargs): - """Reset setting based property values.""" - if setting == "MEDIA_ROOT": - self.__dict__.pop("base_location", None) - self.__dict__.pop("location", None) - elif setting == "MEDIA_URL": - self.__dict__.pop("base_url", None) - elif setting == "FILE_UPLOAD_PERMISSIONS": - self.__dict__.pop("file_permissions_mode", None) - elif setting == "FILE_UPLOAD_DIRECTORY_PERMISSIONS": - self.__dict__.pop("directory_permissions_mode", None) - - def _value_or_setting(self, value, setting): - return setting if value is None else value diff --git a/.venv/lib/python3.10/site-packages/django/core/files/temp.py b/.venv/lib/python3.10/site-packages/django/core/files/temp.py deleted file mode 100644 index b719d94..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/temp.py +++ /dev/null @@ -1,79 +0,0 @@ -""" -The temp module provides a NamedTemporaryFile that can be reopened in the same -process on any platform. Most platforms use the standard Python -tempfile.NamedTemporaryFile class, but Windows users are given a custom class. - -This is needed because the Python implementation of NamedTemporaryFile uses the -O_TEMPORARY flag under Windows, which prevents the file from being reopened -if the same flag is not provided [1][2]. Note that this does not address the -more general issue of opening a file for writing and reading in multiple -processes in a manner that works across platforms. - -The custom version of NamedTemporaryFile doesn't support the same keyword -arguments available in tempfile.NamedTemporaryFile. - -1: https://mail.python.org/pipermail/python-list/2005-December/336955.html -2: https://bugs.python.org/issue14243 -""" - -import os -import tempfile - -from django.core.files.utils import FileProxyMixin - -__all__ = ( - "NamedTemporaryFile", - "gettempdir", -) - - -if os.name == "nt": - - class TemporaryFile(FileProxyMixin): - """ - Temporary file object constructor that supports reopening of the - temporary file in Windows. - - Unlike tempfile.NamedTemporaryFile from the standard library, - __init__() doesn't support the 'delete', 'buffering', 'encoding', or - 'newline' keyword arguments. - """ - - def __init__(self, mode="w+b", bufsize=-1, suffix="", prefix="", dir=None): - fd, name = tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dir) - self.name = name - self.file = os.fdopen(fd, mode, bufsize) - self.close_called = False - - # Because close can be called during shutdown - # we need to cache os.unlink and access it - # as self.unlink only - unlink = os.unlink - - def close(self): - if not self.close_called: - self.close_called = True - try: - self.file.close() - except OSError: - pass - try: - self.unlink(self.name) - except OSError: - pass - - def __del__(self): - self.close() - - def __enter__(self): - self.file.__enter__() - return self - - def __exit__(self, exc, value, tb): - self.file.__exit__(exc, value, tb) - - NamedTemporaryFile = TemporaryFile -else: - NamedTemporaryFile = tempfile.NamedTemporaryFile - -gettempdir = tempfile.gettempdir diff --git a/.venv/lib/python3.10/site-packages/django/core/files/uploadedfile.py b/.venv/lib/python3.10/site-packages/django/core/files/uploadedfile.py deleted file mode 100644 index efbfcac..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/uploadedfile.py +++ /dev/null @@ -1,150 +0,0 @@ -""" -Classes representing uploaded files. -""" - -import os -from io import BytesIO - -from django.conf import settings -from django.core.files import temp as tempfile -from django.core.files.base import File -from django.core.files.utils import validate_file_name - -__all__ = ( - "UploadedFile", - "TemporaryUploadedFile", - "InMemoryUploadedFile", - "SimpleUploadedFile", -) - - -class UploadedFile(File): - """ - An abstract uploaded file (``TemporaryUploadedFile`` and - ``InMemoryUploadedFile`` are the built-in concrete subclasses). - - An ``UploadedFile`` object behaves somewhat like a file object and - represents some file data that the user submitted with a form. - """ - - def __init__( - self, - file=None, - name=None, - content_type=None, - size=None, - charset=None, - content_type_extra=None, - ): - super().__init__(file, name) - self.size = size - self.content_type = content_type - self.charset = charset - self.content_type_extra = content_type_extra - - def __repr__(self): - return "<%s: %s (%s)>" % (self.__class__.__name__, self.name, self.content_type) - - def _get_name(self): - return self._name - - def _set_name(self, name): - # Sanitize the file name so that it can't be dangerous. - if name is not None: - # Just use the basename of the file -- anything else is dangerous. - name = os.path.basename(name) - - # File names longer than 255 characters can cause problems on older OSes. - if len(name) > 255: - name, ext = os.path.splitext(name) - ext = ext[:255] - name = name[: 255 - len(ext)] + ext - - name = validate_file_name(name) - - self._name = name - - name = property(_get_name, _set_name) - - -class TemporaryUploadedFile(UploadedFile): - """ - A file uploaded to a temporary location (i.e. stream-to-disk). - """ - - def __init__(self, name, content_type, size, charset, content_type_extra=None): - _, ext = os.path.splitext(name) - file = tempfile.NamedTemporaryFile( - suffix=".upload" + ext, dir=settings.FILE_UPLOAD_TEMP_DIR - ) - super().__init__(file, name, content_type, size, charset, content_type_extra) - - def temporary_file_path(self): - """Return the full path of this file.""" - return self.file.name - - def close(self): - try: - return self.file.close() - except FileNotFoundError: - # The file was moved or deleted before the tempfile could unlink - # it. Still sets self.file.close_called and calls - # self.file.file.close() before the exception. - pass - - -class InMemoryUploadedFile(UploadedFile): - """ - A file uploaded into memory (i.e. stream-to-memory). - """ - - def __init__( - self, - file, - field_name, - name, - content_type, - size, - charset, - content_type_extra=None, - ): - super().__init__(file, name, content_type, size, charset, content_type_extra) - self.field_name = field_name - - def open(self, mode=None): - self.file.seek(0) - return self - - def chunks(self, chunk_size=None): - self.file.seek(0) - yield self.read() - - def multiple_chunks(self, chunk_size=None): - # Since it's in memory, we'll never have multiple chunks. - return False - - -class SimpleUploadedFile(InMemoryUploadedFile): - """ - A simple representation of a file, which just has content, size, and a name. - """ - - def __init__(self, name, content, content_type="text/plain"): - content = content or b"" - super().__init__( - BytesIO(content), None, name, content_type, len(content), None, None - ) - - @classmethod - def from_dict(cls, file_dict): - """ - Create a SimpleUploadedFile object from a dictionary with keys: - - filename - - content-type - - content - """ - return cls( - file_dict["filename"], - file_dict["content"], - file_dict.get("content-type", "text/plain"), - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/files/uploadhandler.py b/.venv/lib/python3.10/site-packages/django/core/files/uploadhandler.py deleted file mode 100644 index ab86f7f..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/uploadhandler.py +++ /dev/null @@ -1,252 +0,0 @@ -""" -Base file upload handler classes, and the built-in concrete subclasses -""" - -import os -from io import BytesIO - -from django.conf import settings -from django.core.files.uploadedfile import InMemoryUploadedFile, TemporaryUploadedFile -from django.utils.module_loading import import_string - -__all__ = [ - "UploadFileException", - "StopUpload", - "SkipFile", - "FileUploadHandler", - "TemporaryFileUploadHandler", - "MemoryFileUploadHandler", - "load_handler", - "StopFutureHandlers", -] - - -class UploadFileException(Exception): - """ - Any error having to do with uploading files. - """ - - pass - - -class StopUpload(UploadFileException): - """ - This exception is raised when an upload must abort. - """ - - def __init__(self, connection_reset=False): - """ - If ``connection_reset`` is ``True``, Django knows will halt the upload - without consuming the rest of the upload. This will cause the browser to - show a "connection reset" error. - """ - self.connection_reset = connection_reset - - def __str__(self): - if self.connection_reset: - return "StopUpload: Halt current upload." - else: - return "StopUpload: Consume request data, then halt." - - -class SkipFile(UploadFileException): - """ - This exception is raised by an upload handler that wants to skip a given file. - """ - - pass - - -class StopFutureHandlers(UploadFileException): - """ - Upload handlers that have handled a file and do not want future handlers to - run should raise this exception instead of returning None. - """ - - pass - - -class FileUploadHandler: - """ - Base class for streaming upload handlers. - """ - - chunk_size = 64 * 2**10 # : The default chunk size is 64 KB. - - def __init__(self, request=None): - self.file_name = None - self.content_type = None - self.content_length = None - self.charset = None - self.content_type_extra = None - self.request = request - - def handle_raw_input( - self, input_data, META, content_length, boundary, encoding=None - ): - """ - Handle the raw input from the client. - - Parameters: - - :input_data: - An object that supports reading via .read(). - :META: - ``request.META``. - :content_length: - The (integer) value of the Content-Length header from the - client. - :boundary: The boundary from the Content-Type header. Be sure to - prepend two '--'. - """ - pass - - def new_file( - self, - field_name, - file_name, - content_type, - content_length, - charset=None, - content_type_extra=None, - ): - """ - Signal that a new file has been started. - - Warning: As with any data from the client, you should not trust - content_length (and sometimes won't even get it). - """ - self.field_name = field_name - self.file_name = file_name - self.content_type = content_type - self.content_length = content_length - self.charset = charset - self.content_type_extra = content_type_extra - - def receive_data_chunk(self, raw_data, start): - """ - Receive data from the streamed upload parser. ``start`` is the position - in the file of the chunk. - """ - raise NotImplementedError( - "subclasses of FileUploadHandler must provide a receive_data_chunk() method" - ) - - def file_complete(self, file_size): - """ - Signal that a file has completed. File size corresponds to the actual - size accumulated by all the chunks. - - Subclasses should return a valid ``UploadedFile`` object. - """ - raise NotImplementedError( - "subclasses of FileUploadHandler must provide a file_complete() method" - ) - - def upload_complete(self): - """ - Signal that the upload is complete. Subclasses should perform cleanup - that is necessary for this handler. - """ - pass - - def upload_interrupted(self): - """ - Signal that the upload was interrupted. Subclasses should perform - cleanup that is necessary for this handler. - """ - pass - - -class TemporaryFileUploadHandler(FileUploadHandler): - """ - Upload handler that streams data into a temporary file. - """ - - def new_file(self, *args, **kwargs): - """ - Create the file object to append to as data is coming in. - """ - super().new_file(*args, **kwargs) - self.file = TemporaryUploadedFile( - self.file_name, self.content_type, 0, self.charset, self.content_type_extra - ) - - def receive_data_chunk(self, raw_data, start): - self.file.write(raw_data) - - def file_complete(self, file_size): - self.file.seek(0) - self.file.size = file_size - return self.file - - def upload_interrupted(self): - if hasattr(self, "file"): - temp_location = self.file.temporary_file_path() - try: - self.file.close() - os.remove(temp_location) - except FileNotFoundError: - pass - - -class MemoryFileUploadHandler(FileUploadHandler): - """ - File upload handler to stream uploads into memory (used for small files). - """ - - def handle_raw_input( - self, input_data, META, content_length, boundary, encoding=None - ): - """ - Use the content_length to signal whether or not this handler should be - used. - """ - # Check the content-length header to see if we should - # If the post is too large, we cannot use the Memory handler. - self.activated = content_length <= settings.FILE_UPLOAD_MAX_MEMORY_SIZE - - def new_file(self, *args, **kwargs): - super().new_file(*args, **kwargs) - if self.activated: - self.file = BytesIO() - raise StopFutureHandlers() - - def receive_data_chunk(self, raw_data, start): - """Add the data to the BytesIO file.""" - if self.activated: - self.file.write(raw_data) - else: - return raw_data - - def file_complete(self, file_size): - """Return a file object if this handler is activated.""" - if not self.activated: - return - - self.file.seek(0) - return InMemoryUploadedFile( - file=self.file, - field_name=self.field_name, - name=self.file_name, - content_type=self.content_type, - size=file_size, - charset=self.charset, - content_type_extra=self.content_type_extra, - ) - - -def load_handler(path, *args, **kwargs): - """ - Given a path to a handler, return an instance of that handler. - - E.g.:: - >>> from django.http import HttpRequest - >>> request = HttpRequest() - >>> load_handler( - ... 'django.core.files.uploadhandler.TemporaryFileUploadHandler', - ... request, - ... ) - - """ - return import_string(path)(*args, **kwargs) diff --git a/.venv/lib/python3.10/site-packages/django/core/files/utils.py b/.venv/lib/python3.10/site-packages/django/core/files/utils.py deleted file mode 100644 index c730ca1..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/files/utils.py +++ /dev/null @@ -1,77 +0,0 @@ -import os -import pathlib - -from django.core.exceptions import SuspiciousFileOperation - - -def validate_file_name(name, allow_relative_path=False): - # Remove potentially dangerous names - if os.path.basename(name) in {"", ".", ".."}: - raise SuspiciousFileOperation("Could not derive file name from '%s'" % name) - - if allow_relative_path: - # Ensure that name can be treated as a pure posix path, i.e. Unix - # style (with forward slashes). - path = pathlib.PurePosixPath(str(name).replace("\\", "/")) - if path.is_absolute() or ".." in path.parts: - raise SuspiciousFileOperation( - "Detected path traversal attempt in '%s'" % name - ) - elif name != os.path.basename(name): - raise SuspiciousFileOperation("File name '%s' includes path elements" % name) - - return name - - -class FileProxyMixin: - """ - A mixin class used to forward file methods to an underlying file - object. The internal file object has to be called "file":: - - class FileProxy(FileProxyMixin): - def __init__(self, file): - self.file = file - """ - - encoding = property(lambda self: self.file.encoding) - fileno = property(lambda self: self.file.fileno) - flush = property(lambda self: self.file.flush) - isatty = property(lambda self: self.file.isatty) - newlines = property(lambda self: self.file.newlines) - read = property(lambda self: self.file.read) - readinto = property(lambda self: self.file.readinto) - readline = property(lambda self: self.file.readline) - readlines = property(lambda self: self.file.readlines) - seek = property(lambda self: self.file.seek) - tell = property(lambda self: self.file.tell) - truncate = property(lambda self: self.file.truncate) - write = property(lambda self: self.file.write) - writelines = property(lambda self: self.file.writelines) - - @property - def closed(self): - return not self.file or self.file.closed - - def readable(self): - if self.closed: - return False - if hasattr(self.file, "readable"): - return self.file.readable() - return True - - def writable(self): - if self.closed: - return False - if hasattr(self.file, "writable"): - return self.file.writable() - return "w" in getattr(self.file, "mode", "") - - def seekable(self): - if self.closed: - return False - if hasattr(self.file, "seekable"): - return self.file.seekable() - return True - - def __iter__(self): - return iter(self.file) diff --git a/.venv/lib/python3.10/site-packages/django/core/handlers/__init__.py b/.venv/lib/python3.10/site-packages/django/core/handlers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/core/handlers/asgi.py b/.venv/lib/python3.10/site-packages/django/core/handlers/asgi.py deleted file mode 100644 index bb6a6bf..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/handlers/asgi.py +++ /dev/null @@ -1,372 +0,0 @@ -import asyncio -import logging -import sys -import tempfile -import traceback -from contextlib import aclosing - -from asgiref.sync import ThreadSensitiveContext, sync_to_async - -from django.conf import settings -from django.core import signals -from django.core.exceptions import RequestAborted, RequestDataTooBig -from django.core.handlers import base -from django.http import ( - FileResponse, - HttpRequest, - HttpResponse, - HttpResponseBadRequest, - HttpResponseServerError, - QueryDict, - parse_cookie, -) -from django.urls import set_script_prefix -from django.utils.functional import cached_property - -logger = logging.getLogger("django.request") - - -def get_script_prefix(scope): - """ - Return the script prefix to use from either the scope or a setting. - """ - if settings.FORCE_SCRIPT_NAME: - return settings.FORCE_SCRIPT_NAME - return scope.get("root_path", "") or "" - - -class ASGIRequest(HttpRequest): - """ - Custom request subclass that decodes from an ASGI-standard request dict - and wraps request body handling. - """ - - # Number of seconds until a Request gives up on trying to read a request - # body and aborts. - body_receive_timeout = 60 - - def __init__(self, scope, body_file): - self.scope = scope - self._post_parse_error = False - self._read_started = False - self.resolver_match = None - self.path = scope["path"] - self.script_name = get_script_prefix(scope) - if self.script_name: - # TODO: Better is-prefix checking, slash handling? - self.path_info = scope["path"].removeprefix(self.script_name) - else: - self.path_info = scope["path"] - # HTTP basics. - self.method = self.scope["method"].upper() - # Ensure query string is encoded correctly. - query_string = self.scope.get("query_string", "") - if isinstance(query_string, bytes): - query_string = query_string.decode() - self.META = { - "REQUEST_METHOD": self.method, - "QUERY_STRING": query_string, - "SCRIPT_NAME": self.script_name, - "PATH_INFO": self.path_info, - # WSGI-expecting code will need these for a while - "wsgi.multithread": True, - "wsgi.multiprocess": True, - } - if self.scope.get("client"): - self.META["REMOTE_ADDR"] = self.scope["client"][0] - self.META["REMOTE_HOST"] = self.META["REMOTE_ADDR"] - self.META["REMOTE_PORT"] = self.scope["client"][1] - if self.scope.get("server"): - self.META["SERVER_NAME"] = self.scope["server"][0] - self.META["SERVER_PORT"] = str(self.scope["server"][1]) - else: - self.META["SERVER_NAME"] = "unknown" - self.META["SERVER_PORT"] = "0" - # Headers go into META. - for name, value in self.scope.get("headers", []): - name = name.decode("latin1") - if name == "content-length": - corrected_name = "CONTENT_LENGTH" - elif name == "content-type": - corrected_name = "CONTENT_TYPE" - else: - corrected_name = "HTTP_%s" % name.upper().replace("-", "_") - # HTTP/2 say only ASCII chars are allowed in headers, but decode - # latin1 just in case. - value = value.decode("latin1") - if corrected_name in self.META: - value = self.META[corrected_name] + "," + value - self.META[corrected_name] = value - # Pull out request encoding, if provided. - self._set_content_type_params(self.META) - # Directly assign the body file to be our stream. - self._stream = body_file - # Other bits. - self.resolver_match = None - - @cached_property - def GET(self): - return QueryDict(self.META["QUERY_STRING"]) - - def _get_scheme(self): - return self.scope.get("scheme") or super()._get_scheme() - - def _get_post(self): - if not hasattr(self, "_post"): - self._load_post_and_files() - return self._post - - def _set_post(self, post): - self._post = post - - def _get_files(self): - if not hasattr(self, "_files"): - self._load_post_and_files() - return self._files - - POST = property(_get_post, _set_post) - FILES = property(_get_files) - - @cached_property - def COOKIES(self): - return parse_cookie(self.META.get("HTTP_COOKIE", "")) - - def close(self): - super().close() - self._stream.close() - - -class ASGIHandler(base.BaseHandler): - """Handler for ASGI requests.""" - - request_class = ASGIRequest - # Size to chunk response bodies into for multiple response messages. - chunk_size = 2**16 - - def __init__(self): - super().__init__() - self.load_middleware(is_async=True) - - async def __call__(self, scope, receive, send): - """ - Async entrypoint - parses the request and hands off to get_response. - """ - # Serve only HTTP connections. - # FIXME: Allow to override this. - if scope["type"] != "http": - raise ValueError( - "Django can only handle ASGI/HTTP connections, not %s." % scope["type"] - ) - - async with ThreadSensitiveContext(): - await self.handle(scope, receive, send) - - async def handle(self, scope, receive, send): - """ - Handles the ASGI request. Called via the __call__ method. - """ - # Receive the HTTP request body as a stream object. - try: - body_file = await self.read_body(receive) - except RequestAborted: - return - # Request is complete and can be served. - set_script_prefix(get_script_prefix(scope)) - await signals.request_started.asend(sender=self.__class__, scope=scope) - # Get the request and check for basic issues. - request, error_response = self.create_request(scope, body_file) - if request is None: - body_file.close() - await self.send_response(error_response, send) - await sync_to_async(error_response.close)() - return - - async def process_request(request, send): - response = await self.run_get_response(request) - try: - await self.send_response(response, send) - except asyncio.CancelledError: - # Client disconnected during send_response (ignore exception). - pass - - return response - - # Try to catch a disconnect while getting response. - tasks = [ - # Check the status of these tasks and (optionally) terminate them - # in this order. The listen_for_disconnect() task goes first - # because it should not raise unexpected errors that would prevent - # us from cancelling process_request(). - asyncio.create_task(self.listen_for_disconnect(receive)), - asyncio.create_task(process_request(request, send)), - ] - await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) - # Now wait on both tasks (they may have both finished by now). - for task in tasks: - if task.done(): - try: - task.result() - except RequestAborted: - # Ignore client disconnects. - pass - except AssertionError: - body_file.close() - raise - else: - # Allow views to handle cancellation. - task.cancel() - try: - await task - except asyncio.CancelledError: - # Task re-raised the CancelledError as expected. - pass - - try: - response = tasks[1].result() - except asyncio.CancelledError: - await signals.request_finished.asend(sender=self.__class__) - else: - await sync_to_async(response.close)() - - body_file.close() - - async def listen_for_disconnect(self, receive): - """Listen for disconnect from the client.""" - message = await receive() - if message["type"] == "http.disconnect": - raise RequestAborted() - # This should never happen. - assert False, "Invalid ASGI message after request body: %s" % message["type"] - - async def run_get_response(self, request): - """Get async response.""" - # Use the async mode of BaseHandler. - response = await self.get_response_async(request) - response._handler_class = self.__class__ - # Increase chunk size on file responses (ASGI servers handles low-level - # chunking). - if isinstance(response, FileResponse): - response.block_size = self.chunk_size - return response - - async def read_body(self, receive): - """Reads an HTTP body from an ASGI connection.""" - # Use the tempfile that auto rolls-over to a disk file as it fills up. - body_file = tempfile.SpooledTemporaryFile( - max_size=settings.FILE_UPLOAD_MAX_MEMORY_SIZE, mode="w+b" - ) - while True: - message = await receive() - if message["type"] == "http.disconnect": - body_file.close() - # Early client disconnect. - raise RequestAborted() - # Add a body chunk from the message, if provided. - if "body" in message: - body_file.write(message["body"]) - # Quit out if that's the end. - if not message.get("more_body", False): - break - body_file.seek(0) - return body_file - - def create_request(self, scope, body_file): - """ - Create the Request object and returns either (request, None) or - (None, response) if there is an error response. - """ - try: - return self.request_class(scope, body_file), None - except UnicodeDecodeError: - logger.warning( - "Bad Request (UnicodeDecodeError)", - exc_info=sys.exc_info(), - extra={"status_code": 400}, - ) - return None, HttpResponseBadRequest() - except RequestDataTooBig: - return None, HttpResponse("413 Payload too large", status=413) - - def handle_uncaught_exception(self, request, resolver, exc_info): - """Last-chance handler for exceptions.""" - # There's no WSGI server to catch the exception further up - # if this fails, so translate it into a plain text response. - try: - return super().handle_uncaught_exception(request, resolver, exc_info) - except Exception: - return HttpResponseServerError( - traceback.format_exc() if settings.DEBUG else "Internal Server Error", - content_type="text/plain", - ) - - async def send_response(self, response, send): - """Encode and send a response out over ASGI.""" - # Collect cookies into headers. Have to preserve header case as there - # are some non-RFC compliant clients that require e.g. Content-Type. - response_headers = [] - for header, value in response.items(): - if isinstance(header, str): - header = header.encode("ascii") - if isinstance(value, str): - value = value.encode("latin1") - response_headers.append((bytes(header), bytes(value))) - for c in response.cookies.values(): - response_headers.append( - (b"Set-Cookie", c.output(header="").encode("ascii").strip()) - ) - # Initial response message. - await send( - { - "type": "http.response.start", - "status": response.status_code, - "headers": response_headers, - } - ) - # Streaming responses need to be pinned to their iterator. - if response.streaming: - # - Consume via `__aiter__` and not `streaming_content` directly, to - # allow mapping of a sync iterator. - # - Use aclosing() when consuming aiter. - # See https://github.com/python/cpython/commit/6e8dcda - async with aclosing(aiter(response)) as content: - async for part in content: - for chunk, _ in self.chunk_bytes(part): - await send( - { - "type": "http.response.body", - "body": chunk, - # Ignore "more" as there may be more parts; instead, - # use an empty final closing message with False. - "more_body": True, - } - ) - # Final closing message. - await send({"type": "http.response.body"}) - # Other responses just need chunking. - else: - # Yield chunks of response. - for chunk, last in self.chunk_bytes(response.content): - await send( - { - "type": "http.response.body", - "body": chunk, - "more_body": not last, - } - ) - - @classmethod - def chunk_bytes(cls, data): - """ - Chunks some data up so it can be sent in reasonable size messages. - Yields (chunk, last_chunk) tuples. - """ - position = 0 - if not data: - yield data, True - return - while position < len(data): - yield ( - data[position : position + cls.chunk_size], - (position + cls.chunk_size) >= len(data), - ) - position += cls.chunk_size diff --git a/.venv/lib/python3.10/site-packages/django/core/handlers/base.py b/.venv/lib/python3.10/site-packages/django/core/handlers/base.py deleted file mode 100644 index 8911543..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/handlers/base.py +++ /dev/null @@ -1,373 +0,0 @@ -import asyncio -import logging -import types - -from asgiref.sync import async_to_sync, iscoroutinefunction, sync_to_async - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured, MiddlewareNotUsed -from django.core.signals import request_finished -from django.db import connections, transaction -from django.urls import get_resolver, set_urlconf -from django.utils.log import log_response -from django.utils.module_loading import import_string - -from .exception import convert_exception_to_response - -logger = logging.getLogger("django.request") - - -class BaseHandler: - _view_middleware = None - _template_response_middleware = None - _exception_middleware = None - _middleware_chain = None - - def load_middleware(self, is_async=False): - """ - Populate middleware lists from settings.MIDDLEWARE. - - Must be called after the environment is fixed (see __call__ in subclasses). - """ - self._view_middleware = [] - self._template_response_middleware = [] - self._exception_middleware = [] - - get_response = self._get_response_async if is_async else self._get_response - handler = convert_exception_to_response(get_response) - handler_is_async = is_async - for middleware_path in reversed(settings.MIDDLEWARE): - middleware = import_string(middleware_path) - middleware_can_sync = getattr(middleware, "sync_capable", True) - middleware_can_async = getattr(middleware, "async_capable", False) - if not middleware_can_sync and not middleware_can_async: - raise RuntimeError( - "Middleware %s must have at least one of " - "sync_capable/async_capable set to True." % middleware_path - ) - elif not handler_is_async and middleware_can_sync: - middleware_is_async = False - else: - middleware_is_async = middleware_can_async - try: - # Adapt handler, if needed. - adapted_handler = self.adapt_method_mode( - middleware_is_async, - handler, - handler_is_async, - debug=settings.DEBUG, - name="middleware %s" % middleware_path, - ) - mw_instance = middleware(adapted_handler) - except MiddlewareNotUsed as exc: - if settings.DEBUG: - if str(exc): - logger.debug("MiddlewareNotUsed(%r): %s", middleware_path, exc) - else: - logger.debug("MiddlewareNotUsed: %r", middleware_path) - continue - else: - handler = adapted_handler - - if mw_instance is None: - raise ImproperlyConfigured( - "Middleware factory %s returned None." % middleware_path - ) - - if hasattr(mw_instance, "process_view"): - self._view_middleware.insert( - 0, - self.adapt_method_mode(is_async, mw_instance.process_view), - ) - if hasattr(mw_instance, "process_template_response"): - self._template_response_middleware.append( - self.adapt_method_mode( - is_async, mw_instance.process_template_response - ), - ) - if hasattr(mw_instance, "process_exception"): - # The exception-handling stack is still always synchronous for - # now, so adapt that way. - self._exception_middleware.append( - self.adapt_method_mode(False, mw_instance.process_exception), - ) - - handler = convert_exception_to_response(mw_instance) - handler_is_async = middleware_is_async - - # Adapt the top of the stack, if needed. - handler = self.adapt_method_mode(is_async, handler, handler_is_async) - # We only assign to this when initialization is complete as it is used - # as a flag for initialization being complete. - self._middleware_chain = handler - - def adapt_method_mode( - self, - is_async, - method, - method_is_async=None, - debug=False, - name=None, - ): - """ - Adapt a method to be in the correct "mode": - - If is_async is False: - - Synchronous methods are left alone - - Asynchronous methods are wrapped with async_to_sync - - If is_async is True: - - Synchronous methods are wrapped with sync_to_async() - - Asynchronous methods are left alone - """ - if method_is_async is None: - method_is_async = iscoroutinefunction(method) - if debug and not name: - name = name or "method %s()" % method.__qualname__ - if is_async: - if not method_is_async: - if debug: - logger.debug("Synchronous handler adapted for %s.", name) - return sync_to_async(method, thread_sensitive=True) - elif method_is_async: - if debug: - logger.debug("Asynchronous handler adapted for %s.", name) - return async_to_sync(method) - return method - - def get_response(self, request): - """Return an HttpResponse object for the given HttpRequest.""" - # Setup default url resolver for this thread - set_urlconf(settings.ROOT_URLCONF) - response = self._middleware_chain(request) - response._resource_closers.append(request.close) - if response.status_code >= 400: - log_response( - "%s: %s", - response.reason_phrase, - request.path, - response=response, - request=request, - ) - return response - - async def get_response_async(self, request): - """ - Asynchronous version of get_response. - - Funneling everything, including WSGI, into a single async - get_response() is too slow. Avoid the context switch by using - a separate async response path. - """ - # Setup default url resolver for this thread. - set_urlconf(settings.ROOT_URLCONF) - response = await self._middleware_chain(request) - response._resource_closers.append(request.close) - if response.status_code >= 400: - await sync_to_async(log_response, thread_sensitive=False)( - "%s: %s", - response.reason_phrase, - request.path, - response=response, - request=request, - ) - return response - - def _get_response(self, request): - """ - Resolve and call the view, then apply view, exception, and - template_response middleware. This method is everything that happens - inside the request/response middleware. - """ - response = None - callback, callback_args, callback_kwargs = self.resolve_request(request) - - # Apply view middleware - for middleware_method in self._view_middleware: - response = middleware_method( - request, callback, callback_args, callback_kwargs - ) - if response: - break - - if response is None: - wrapped_callback = self.make_view_atomic(callback) - # If it is an asynchronous view, run it in a subthread. - if iscoroutinefunction(wrapped_callback): - wrapped_callback = async_to_sync(wrapped_callback) - try: - response = wrapped_callback(request, *callback_args, **callback_kwargs) - except Exception as e: - response = self.process_exception_by_middleware(e, request) - if response is None: - raise - - # Complain if the view returned None (a common error). - self.check_response(response, callback) - - # If the response supports deferred rendering, apply template - # response middleware and then render the response - if hasattr(response, "render") and callable(response.render): - for middleware_method in self._template_response_middleware: - response = middleware_method(request, response) - # Complain if the template response middleware returned None - # (a common error). - self.check_response( - response, - middleware_method, - name="%s.process_template_response" - % (middleware_method.__self__.__class__.__name__,), - ) - try: - response = response.render() - except Exception as e: - response = self.process_exception_by_middleware(e, request) - if response is None: - raise - - return response - - async def _get_response_async(self, request): - """ - Resolve and call the view, then apply view, exception, and - template_response middleware. This method is everything that happens - inside the request/response middleware. - """ - response = None - callback, callback_args, callback_kwargs = self.resolve_request(request) - - # Apply view middleware. - for middleware_method in self._view_middleware: - response = await middleware_method( - request, callback, callback_args, callback_kwargs - ) - if response: - break - - if response is None: - wrapped_callback = self.make_view_atomic(callback) - # If it is a synchronous view, run it in a subthread - if not iscoroutinefunction(wrapped_callback): - wrapped_callback = sync_to_async( - wrapped_callback, thread_sensitive=True - ) - try: - response = await wrapped_callback( - request, *callback_args, **callback_kwargs - ) - except Exception as e: - response = await sync_to_async( - self.process_exception_by_middleware, - thread_sensitive=True, - )(e, request) - if response is None: - raise - - # Complain if the view returned None or an uncalled coroutine. - self.check_response(response, callback) - - # If the response supports deferred rendering, apply template - # response middleware and then render the response - if hasattr(response, "render") and callable(response.render): - for middleware_method in self._template_response_middleware: - response = await middleware_method(request, response) - # Complain if the template response middleware returned None or - # an uncalled coroutine. - self.check_response( - response, - middleware_method, - name="%s.process_template_response" - % (middleware_method.__self__.__class__.__name__,), - ) - try: - if iscoroutinefunction(response.render): - response = await response.render() - else: - response = await sync_to_async( - response.render, thread_sensitive=True - )() - except Exception as e: - response = await sync_to_async( - self.process_exception_by_middleware, - thread_sensitive=True, - )(e, request) - if response is None: - raise - - # Make sure the response is not a coroutine - if asyncio.iscoroutine(response): - raise RuntimeError("Response is still a coroutine.") - return response - - def resolve_request(self, request): - """ - Retrieve/set the urlconf for the request. Return the view resolved, - with its args and kwargs. - """ - # Work out the resolver. - if hasattr(request, "urlconf"): - urlconf = request.urlconf - set_urlconf(urlconf) - resolver = get_resolver(urlconf) - else: - resolver = get_resolver() - # Resolve the view, and assign the match object back to the request. - resolver_match = resolver.resolve(request.path_info) - request.resolver_match = resolver_match - return resolver_match - - def check_response(self, response, callback, name=None): - """ - Raise an error if the view returned None or an uncalled coroutine. - """ - if not (response is None or asyncio.iscoroutine(response)): - return - if not name: - if isinstance(callback, types.FunctionType): # FBV - name = "The view %s.%s" % (callback.__module__, callback.__name__) - else: # CBV - name = "The view %s.%s.__call__" % ( - callback.__module__, - callback.__class__.__name__, - ) - if response is None: - raise ValueError( - "%s didn't return an HttpResponse object. It returned None " - "instead." % name - ) - elif asyncio.iscoroutine(response): - raise ValueError( - "%s didn't return an HttpResponse object. It returned an " - "unawaited coroutine instead. You may need to add an 'await' " - "into your view." % name - ) - - # Other utility methods. - - def make_view_atomic(self, view): - non_atomic_requests = getattr(view, "_non_atomic_requests", set()) - for alias, settings_dict in connections.settings.items(): - if settings_dict["ATOMIC_REQUESTS"] and alias not in non_atomic_requests: - if iscoroutinefunction(view): - raise RuntimeError( - "You cannot use ATOMIC_REQUESTS with async views." - ) - view = transaction.atomic(using=alias)(view) - return view - - def process_exception_by_middleware(self, exception, request): - """ - Pass the exception to the exception middleware. If no middleware - return a response for this exception, return None. - """ - for middleware_method in self._exception_middleware: - response = middleware_method(request, exception) - if response: - return response - return None - - -def reset_urlconf(sender, **kwargs): - """Reset the URLconf after each request is finished.""" - set_urlconf(None) - - -request_finished.connect(reset_urlconf) diff --git a/.venv/lib/python3.10/site-packages/django/core/handlers/exception.py b/.venv/lib/python3.10/site-packages/django/core/handlers/exception.py deleted file mode 100644 index a63291f..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/handlers/exception.py +++ /dev/null @@ -1,185 +0,0 @@ -import logging -import sys -from functools import wraps - -from asgiref.sync import iscoroutinefunction, sync_to_async - -from django.conf import settings -from django.core import signals -from django.core.exceptions import ( - BadRequest, - PermissionDenied, - RequestDataTooBig, - SuspiciousOperation, - TooManyFieldsSent, - TooManyFilesSent, -) -from django.http import Http404 -from django.http.multipartparser import MultiPartParserError -from django.urls import get_resolver, get_urlconf -from django.utils.log import log_response -from django.views import debug - - -def convert_exception_to_response(get_response): - """ - Wrap the given get_response callable in exception-to-response conversion. - - All exceptions will be converted. All known 4xx exceptions (Http404, - PermissionDenied, MultiPartParserError, SuspiciousOperation) will be - converted to the appropriate response, and all other exceptions will be - converted to 500 responses. - - This decorator is automatically applied to all middleware to ensure that - no middleware leaks an exception and that the next middleware in the stack - can rely on getting a response instead of an exception. - """ - if iscoroutinefunction(get_response): - - @wraps(get_response) - async def inner(request): - try: - response = await get_response(request) - except Exception as exc: - response = await sync_to_async( - response_for_exception, thread_sensitive=False - )(request, exc) - return response - - return inner - else: - - @wraps(get_response) - def inner(request): - try: - response = get_response(request) - except Exception as exc: - response = response_for_exception(request, exc) - return response - - return inner - - -def response_for_exception(request, exc): - if isinstance(exc, Http404): - if settings.DEBUG: - response = debug.technical_404_response(request, exc) - else: - response = get_exception_response( - request, get_resolver(get_urlconf()), 404, exc - ) - - elif isinstance(exc, PermissionDenied): - response = get_exception_response( - request, get_resolver(get_urlconf()), 403, exc - ) - log_response( - "Forbidden (Permission denied): %s", - request.path, - response=response, - request=request, - exception=exc, - ) - - elif isinstance(exc, MultiPartParserError): - response = get_exception_response( - request, get_resolver(get_urlconf()), 400, exc - ) - log_response( - "Bad request (Unable to parse request body): %s", - request.path, - response=response, - request=request, - exception=exc, - ) - - elif isinstance(exc, BadRequest): - if settings.DEBUG: - response = debug.technical_500_response( - request, *sys.exc_info(), status_code=400 - ) - else: - response = get_exception_response( - request, get_resolver(get_urlconf()), 400, exc - ) - log_response( - "%s: %s", - str(exc), - request.path, - response=response, - request=request, - exception=exc, - ) - elif isinstance(exc, SuspiciousOperation): - if isinstance(exc, (RequestDataTooBig, TooManyFieldsSent, TooManyFilesSent)): - # POST data can't be accessed again, otherwise the original - # exception would be raised. - request._mark_post_parse_error() - - # The request logger receives events for any problematic request - # The security logger receives events for all SuspiciousOperations - security_logger = logging.getLogger( - "django.security.%s" % exc.__class__.__name__ - ) - security_logger.error( - str(exc), - exc_info=exc, - extra={"status_code": 400, "request": request}, - ) - if settings.DEBUG: - response = debug.technical_500_response( - request, *sys.exc_info(), status_code=400 - ) - else: - response = get_exception_response( - request, get_resolver(get_urlconf()), 400, exc - ) - - else: - signals.got_request_exception.send(sender=None, request=request) - response = handle_uncaught_exception( - request, get_resolver(get_urlconf()), sys.exc_info() - ) - log_response( - "%s: %s", - response.reason_phrase, - request.path, - response=response, - request=request, - exception=exc, - ) - - # Force a TemplateResponse to be rendered. - if not getattr(response, "is_rendered", True) and callable( - getattr(response, "render", None) - ): - response = response.render() - - return response - - -def get_exception_response(request, resolver, status_code, exception): - try: - callback = resolver.resolve_error_handler(status_code) - response = callback(request, exception=exception) - except Exception: - signals.got_request_exception.send(sender=None, request=request) - response = handle_uncaught_exception(request, resolver, sys.exc_info()) - - return response - - -def handle_uncaught_exception(request, resolver, exc_info): - """ - Processing for any otherwise uncaught exceptions (those that will - generate HTTP 500 responses). - """ - if settings.DEBUG_PROPAGATE_EXCEPTIONS: - raise - - if settings.DEBUG: - return debug.technical_500_response(request, *exc_info) - - # Return an HttpResponse that displays a friendly error message. - callback = resolver.resolve_error_handler(500) - return callback(request) diff --git a/.venv/lib/python3.10/site-packages/django/core/handlers/wsgi.py b/.venv/lib/python3.10/site-packages/django/core/handlers/wsgi.py deleted file mode 100644 index 9324af0..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/handlers/wsgi.py +++ /dev/null @@ -1,207 +0,0 @@ -from io import IOBase - -from django.conf import settings -from django.core import signals -from django.core.handlers import base -from django.http import HttpRequest, QueryDict, parse_cookie -from django.urls import set_script_prefix -from django.utils.encoding import repercent_broken_unicode -from django.utils.functional import cached_property -from django.utils.regex_helper import _lazy_re_compile - -_slashes_re = _lazy_re_compile(rb"/+") - - -class LimitedStream(IOBase): - """ - Wrap another stream to disallow reading it past a number of bytes. - - Based on the implementation from werkzeug.wsgi.LimitedStream - See https://github.com/pallets/werkzeug/blob/dbf78f67/src/werkzeug/wsgi.py#L828 - """ - - def __init__(self, stream, limit): - self._read = stream.read - self._readline = stream.readline - self._pos = 0 - self.limit = limit - - def read(self, size=-1, /): - _pos = self._pos - limit = self.limit - if _pos >= limit: - return b"" - if size == -1 or size is None: - size = limit - _pos - else: - size = min(size, limit - _pos) - data = self._read(size) - self._pos += len(data) - return data - - def readline(self, size=-1, /): - _pos = self._pos - limit = self.limit - if _pos >= limit: - return b"" - if size == -1 or size is None: - size = limit - _pos - else: - size = min(size, limit - _pos) - line = self._readline(size) - self._pos += len(line) - return line - - -class WSGIRequest(HttpRequest): - def __init__(self, environ): - script_name = get_script_name(environ) - # If PATH_INFO is empty (e.g. accessing the SCRIPT_NAME URL without a - # trailing slash), operate as if '/' was requested. - path_info = get_path_info(environ) or "/" - self.environ = environ - self.path_info = path_info - # be careful to only replace the first slash in the path because of - # http://test/something and http://test//something being different as - # stated in RFC 3986. - self.path = "%s/%s" % (script_name.rstrip("/"), path_info.replace("/", "", 1)) - self.META = environ - self.META["PATH_INFO"] = path_info - self.META["SCRIPT_NAME"] = script_name - self.method = environ["REQUEST_METHOD"].upper() - # Set content_type, content_params, and encoding. - self._set_content_type_params(environ) - try: - content_length = int(environ.get("CONTENT_LENGTH")) - except (ValueError, TypeError): - content_length = 0 - self._stream = LimitedStream(self.environ["wsgi.input"], content_length) - self._read_started = False - self.resolver_match = None - - def _get_scheme(self): - return self.environ.get("wsgi.url_scheme") - - @cached_property - def GET(self): - # The WSGI spec says 'QUERY_STRING' may be absent. - raw_query_string = get_bytes_from_wsgi(self.environ, "QUERY_STRING", "") - return QueryDict(raw_query_string, encoding=self._encoding) - - def _get_post(self): - if not hasattr(self, "_post"): - self._load_post_and_files() - return self._post - - def _set_post(self, post): - self._post = post - - @cached_property - def COOKIES(self): - raw_cookie = get_str_from_wsgi(self.environ, "HTTP_COOKIE", "") - return parse_cookie(raw_cookie) - - @property - def FILES(self): - if not hasattr(self, "_files"): - self._load_post_and_files() - return self._files - - POST = property(_get_post, _set_post) - - -class WSGIHandler(base.BaseHandler): - request_class = WSGIRequest - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.load_middleware() - - def __call__(self, environ, start_response): - set_script_prefix(get_script_name(environ)) - signals.request_started.send(sender=self.__class__, environ=environ) - request = self.request_class(environ) - response = self.get_response(request) - - response._handler_class = self.__class__ - - status = "%d %s" % (response.status_code, response.reason_phrase) - response_headers = [ - *response.items(), - *(("Set-Cookie", c.output(header="")) for c in response.cookies.values()), - ] - start_response(status, response_headers) - if getattr(response, "file_to_stream", None) is not None and environ.get( - "wsgi.file_wrapper" - ): - # If `wsgi.file_wrapper` is used the WSGI server does not call - # .close on the response, but on the file wrapper. Patch it to use - # response.close instead which takes care of closing all files. - response.file_to_stream.close = response.close - response = environ["wsgi.file_wrapper"]( - response.file_to_stream, response.block_size - ) - return response - - -def get_path_info(environ): - """Return the HTTP request's PATH_INFO as a string.""" - path_info = get_bytes_from_wsgi(environ, "PATH_INFO", "/") - - return repercent_broken_unicode(path_info).decode() - - -def get_script_name(environ): - """ - Return the equivalent of the HTTP request's SCRIPT_NAME environment - variable. If Apache mod_rewrite is used, return what would have been - the script name prior to any rewriting (so it's the script name as seen - from the client's perspective), unless the FORCE_SCRIPT_NAME setting is - set (to anything). - """ - if settings.FORCE_SCRIPT_NAME is not None: - return settings.FORCE_SCRIPT_NAME - - # If Apache's mod_rewrite had a whack at the URL, Apache set either - # SCRIPT_URL or REDIRECT_URL to the full resource URL before applying any - # rewrites. Unfortunately not every web server (lighttpd!) passes this - # information through all the time, so FORCE_SCRIPT_NAME, above, is still - # needed. - script_url = get_bytes_from_wsgi(environ, "SCRIPT_URL", "") or get_bytes_from_wsgi( - environ, "REDIRECT_URL", "" - ) - - if script_url: - if b"//" in script_url: - # mod_wsgi squashes multiple successive slashes in PATH_INFO, - # do the same with script_url before manipulating paths (#17133). - script_url = _slashes_re.sub(b"/", script_url) - path_info = get_bytes_from_wsgi(environ, "PATH_INFO", "") - script_name = script_url.removesuffix(path_info) - else: - script_name = get_bytes_from_wsgi(environ, "SCRIPT_NAME", "") - - return script_name.decode() - - -def get_bytes_from_wsgi(environ, key, default): - """ - Get a value from the WSGI environ dictionary as bytes. - - key and default should be strings. - """ - value = environ.get(key, default) - # Non-ASCII values in the WSGI environ are arbitrarily decoded with - # ISO-8859-1. This is wrong for Django websites where UTF-8 is the default. - # Re-encode to recover the original bytestring. - return value.encode("iso-8859-1") - - -def get_str_from_wsgi(environ, key, default): - """ - Get a value from the WSGI environ dictionary as str. - - key and default should be str objects. - """ - value = get_bytes_from_wsgi(environ, key, default) - return value.decode(errors="replace") diff --git a/.venv/lib/python3.10/site-packages/django/core/mail/__init__.py b/.venv/lib/python3.10/site-packages/django/core/mail/__init__.py deleted file mode 100644 index b179736..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/mail/__init__.py +++ /dev/null @@ -1,159 +0,0 @@ -""" -Tools for sending email. -""" - -from django.conf import settings - -# Imported for backwards compatibility and for the sake -# of a cleaner namespace. These symbols used to be in -# django/core/mail.py before the introduction of email -# backends and the subsequent reorganization (See #10355) -from django.core.mail.message import ( - DEFAULT_ATTACHMENT_MIME_TYPE, - BadHeaderError, - EmailAlternative, - EmailAttachment, - EmailMessage, - EmailMultiAlternatives, - SafeMIMEMultipart, - SafeMIMEText, - forbid_multi_line_headers, - make_msgid, -) -from django.core.mail.utils import DNS_NAME, CachedDnsName -from django.utils.module_loading import import_string - -__all__ = [ - "CachedDnsName", - "DNS_NAME", - "EmailMessage", - "EmailMultiAlternatives", - "SafeMIMEText", - "SafeMIMEMultipart", - "DEFAULT_ATTACHMENT_MIME_TYPE", - "make_msgid", - "BadHeaderError", - "forbid_multi_line_headers", - "get_connection", - "send_mail", - "send_mass_mail", - "mail_admins", - "mail_managers", - "EmailAlternative", - "EmailAttachment", -] - - -def get_connection(backend=None, fail_silently=False, **kwds): - """Load an email backend and return an instance of it. - - If backend is None (default), use settings.EMAIL_BACKEND. - - Both fail_silently and other keyword arguments are used in the - constructor of the backend. - """ - klass = import_string(backend or settings.EMAIL_BACKEND) - return klass(fail_silently=fail_silently, **kwds) - - -def send_mail( - subject, - message, - from_email, - recipient_list, - fail_silently=False, - auth_user=None, - auth_password=None, - connection=None, - html_message=None, -): - """ - Easy wrapper for sending a single message to a recipient list. All members - of the recipient list will see the other recipients in the 'To' field. - - If from_email is None, use the DEFAULT_FROM_EMAIL setting. - If auth_user is None, use the EMAIL_HOST_USER setting. - If auth_password is None, use the EMAIL_HOST_PASSWORD setting. - - Note: The API for this method is frozen. New code wanting to extend the - functionality should use the EmailMessage class directly. - """ - connection = connection or get_connection( - username=auth_user, - password=auth_password, - fail_silently=fail_silently, - ) - mail = EmailMultiAlternatives( - subject, message, from_email, recipient_list, connection=connection - ) - if html_message: - mail.attach_alternative(html_message, "text/html") - - return mail.send() - - -def send_mass_mail( - datatuple, fail_silently=False, auth_user=None, auth_password=None, connection=None -): - """ - Given a datatuple of (subject, message, from_email, recipient_list), send - each message to each recipient list. Return the number of emails sent. - - If from_email is None, use the DEFAULT_FROM_EMAIL setting. - If auth_user and auth_password are set, use them to log in. - If auth_user is None, use the EMAIL_HOST_USER setting. - If auth_password is None, use the EMAIL_HOST_PASSWORD setting. - - Note: The API for this method is frozen. New code wanting to extend the - functionality should use the EmailMessage class directly. - """ - connection = connection or get_connection( - username=auth_user, - password=auth_password, - fail_silently=fail_silently, - ) - messages = [ - EmailMessage(subject, message, sender, recipient, connection=connection) - for subject, message, sender, recipient in datatuple - ] - return connection.send_messages(messages) - - -def mail_admins( - subject, message, fail_silently=False, connection=None, html_message=None -): - """Send a message to the admins, as defined by the ADMINS setting.""" - if not settings.ADMINS: - return - if not all(isinstance(a, (list, tuple)) and len(a) == 2 for a in settings.ADMINS): - raise ValueError("The ADMINS setting must be a list of 2-tuples.") - mail = EmailMultiAlternatives( - "%s%s" % (settings.EMAIL_SUBJECT_PREFIX, subject), - message, - settings.SERVER_EMAIL, - [a[1] for a in settings.ADMINS], - connection=connection, - ) - if html_message: - mail.attach_alternative(html_message, "text/html") - mail.send(fail_silently=fail_silently) - - -def mail_managers( - subject, message, fail_silently=False, connection=None, html_message=None -): - """Send a message to the managers, as defined by the MANAGERS setting.""" - if not settings.MANAGERS: - return - if not all(isinstance(a, (list, tuple)) and len(a) == 2 for a in settings.MANAGERS): - raise ValueError("The MANAGERS setting must be a list of 2-tuples.") - mail = EmailMultiAlternatives( - "%s%s" % (settings.EMAIL_SUBJECT_PREFIX, subject), - message, - settings.SERVER_EMAIL, - [a[1] for a in settings.MANAGERS], - connection=connection, - ) - if html_message: - mail.attach_alternative(html_message, "text/html") - mail.send(fail_silently=fail_silently) diff --git a/.venv/lib/python3.10/site-packages/django/core/mail/backends/__init__.py b/.venv/lib/python3.10/site-packages/django/core/mail/backends/__init__.py deleted file mode 100644 index 5973b49..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/mail/backends/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Mail backends shipped with Django. diff --git a/.venv/lib/python3.10/site-packages/django/core/mail/backends/base.py b/.venv/lib/python3.10/site-packages/django/core/mail/backends/base.py deleted file mode 100644 index b35b964..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/mail/backends/base.py +++ /dev/null @@ -1,62 +0,0 @@ -"""Base email backend class.""" - - -class BaseEmailBackend: - """ - Base class for email backend implementations. - - Subclasses must at least overwrite send_messages(). - - open() and close() can be called indirectly by using a backend object as a - context manager: - - with backend as connection: - # do something with connection - pass - """ - - def __init__(self, fail_silently=False, **kwargs): - self.fail_silently = fail_silently - - def open(self): - """ - Open a network connection. - - This method can be overwritten by backend implementations to - open a network connection. - - It's up to the backend implementation to track the status of - a network connection if it's needed by the backend. - - This method can be called by applications to force a single - network connection to be used when sending mails. See the - send_messages() method of the SMTP backend for a reference - implementation. - - The default implementation does nothing. - """ - pass - - def close(self): - """Close a network connection.""" - pass - - def __enter__(self): - try: - self.open() - except Exception: - self.close() - raise - return self - - def __exit__(self, exc_type, exc_value, traceback): - self.close() - - def send_messages(self, email_messages): - """ - Send one or more EmailMessage objects and return the number of email - messages sent. - """ - raise NotImplementedError( - "subclasses of BaseEmailBackend must override send_messages() method" - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/mail/backends/console.py b/.venv/lib/python3.10/site-packages/django/core/mail/backends/console.py deleted file mode 100644 index 2d7c778..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/mail/backends/console.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -Email backend that writes messages to console instead of sending them. -""" - -import sys -import threading - -from django.core.mail.backends.base import BaseEmailBackend - - -class EmailBackend(BaseEmailBackend): - def __init__(self, *args, **kwargs): - self.stream = kwargs.pop("stream", sys.stdout) - self._lock = threading.RLock() - super().__init__(*args, **kwargs) - - def write_message(self, message): - msg = message.message() - msg_data = msg.as_bytes() - charset = ( - msg.get_charset().get_output_charset() if msg.get_charset() else "utf-8" - ) - msg_data = msg_data.decode(charset) - self.stream.write("%s\n" % msg_data) - self.stream.write("-" * 79) - self.stream.write("\n") - - def send_messages(self, email_messages): - """Write all messages to the stream in a thread-safe way.""" - if not email_messages: - return - msg_count = 0 - with self._lock: - try: - stream_created = self.open() - for message in email_messages: - self.write_message(message) - self.stream.flush() # flush after each message - msg_count += 1 - if stream_created: - self.close() - except Exception: - if not self.fail_silently: - raise - return msg_count diff --git a/.venv/lib/python3.10/site-packages/django/core/mail/backends/dummy.py b/.venv/lib/python3.10/site-packages/django/core/mail/backends/dummy.py deleted file mode 100644 index 7e47fe7..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/mail/backends/dummy.py +++ /dev/null @@ -1,10 +0,0 @@ -""" -Dummy email backend that does nothing. -""" - -from django.core.mail.backends.base import BaseEmailBackend - - -class EmailBackend(BaseEmailBackend): - def send_messages(self, email_messages): - return len(list(email_messages)) diff --git a/.venv/lib/python3.10/site-packages/django/core/mail/backends/filebased.py b/.venv/lib/python3.10/site-packages/django/core/mail/backends/filebased.py deleted file mode 100644 index 3b2b037..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/mail/backends/filebased.py +++ /dev/null @@ -1,66 +0,0 @@ -"""Email backend that writes messages to a file.""" - -import datetime -import os - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.core.mail.backends.console import EmailBackend as ConsoleEmailBackend - - -class EmailBackend(ConsoleEmailBackend): - def __init__(self, *args, file_path=None, **kwargs): - self._fname = None - if file_path is not None: - self.file_path = file_path - else: - self.file_path = getattr(settings, "EMAIL_FILE_PATH", None) - self.file_path = os.path.abspath(self.file_path) - try: - os.makedirs(self.file_path, exist_ok=True) - except FileExistsError: - raise ImproperlyConfigured( - "Path for saving email messages exists, but is not a directory: %s" - % self.file_path - ) - except OSError as err: - raise ImproperlyConfigured( - "Could not create directory for saving email messages: %s (%s)" - % (self.file_path, err) - ) - # Make sure that self.file_path is writable. - if not os.access(self.file_path, os.W_OK): - raise ImproperlyConfigured( - "Could not write to directory: %s" % self.file_path - ) - # Finally, call super(). - # Since we're using the console-based backend as a base, - # force the stream to be None, so we don't default to stdout - kwargs["stream"] = None - super().__init__(*args, **kwargs) - - def write_message(self, message): - self.stream.write(message.message().as_bytes() + b"\n") - self.stream.write(b"-" * 79) - self.stream.write(b"\n") - - def _get_filename(self): - """Return a unique file name.""" - if self._fname is None: - timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S") - fname = "%s-%s.log" % (timestamp, abs(id(self))) - self._fname = os.path.join(self.file_path, fname) - return self._fname - - def open(self): - if self.stream is None: - self.stream = open(self._get_filename(), "ab") - return True - return False - - def close(self): - try: - if self.stream is not None: - self.stream.close() - finally: - self.stream = None diff --git a/.venv/lib/python3.10/site-packages/django/core/mail/backends/locmem.py b/.venv/lib/python3.10/site-packages/django/core/mail/backends/locmem.py deleted file mode 100644 index f5473da..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/mail/backends/locmem.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Backend for test environment. -""" - -import copy - -from django.core import mail -from django.core.mail.backends.base import BaseEmailBackend - - -class EmailBackend(BaseEmailBackend): - """ - An email backend for use during test sessions. - - The test connection stores email messages in a dummy outbox, - rather than sending them out on the wire. - - The dummy outbox is accessible through the outbox instance attribute. - """ - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - if not hasattr(mail, "outbox"): - mail.outbox = [] - - def send_messages(self, messages): - """Redirect messages to the dummy outbox""" - msg_count = 0 - for message in messages: # .message() triggers header validation - message.message() - mail.outbox.append(copy.deepcopy(message)) - msg_count += 1 - return msg_count diff --git a/.venv/lib/python3.10/site-packages/django/core/mail/backends/smtp.py b/.venv/lib/python3.10/site-packages/django/core/mail/backends/smtp.py deleted file mode 100644 index 6820148..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/mail/backends/smtp.py +++ /dev/null @@ -1,162 +0,0 @@ -"""SMTP email backend class.""" - -import smtplib -import ssl -import threading - -from django.conf import settings -from django.core.mail.backends.base import BaseEmailBackend -from django.core.mail.message import sanitize_address -from django.core.mail.utils import DNS_NAME -from django.utils.functional import cached_property - - -class EmailBackend(BaseEmailBackend): - """ - A wrapper that manages the SMTP network connection. - """ - - def __init__( - self, - host=None, - port=None, - username=None, - password=None, - use_tls=None, - fail_silently=False, - use_ssl=None, - timeout=None, - ssl_keyfile=None, - ssl_certfile=None, - **kwargs, - ): - super().__init__(fail_silently=fail_silently) - self.host = host or settings.EMAIL_HOST - self.port = port or settings.EMAIL_PORT - self.username = settings.EMAIL_HOST_USER if username is None else username - self.password = settings.EMAIL_HOST_PASSWORD if password is None else password - self.use_tls = settings.EMAIL_USE_TLS if use_tls is None else use_tls - self.use_ssl = settings.EMAIL_USE_SSL if use_ssl is None else use_ssl - self.timeout = settings.EMAIL_TIMEOUT if timeout is None else timeout - self.ssl_keyfile = ( - settings.EMAIL_SSL_KEYFILE if ssl_keyfile is None else ssl_keyfile - ) - self.ssl_certfile = ( - settings.EMAIL_SSL_CERTFILE if ssl_certfile is None else ssl_certfile - ) - if self.use_ssl and self.use_tls: - raise ValueError( - "EMAIL_USE_TLS/EMAIL_USE_SSL are mutually exclusive, so only set " - "one of those settings to True." - ) - self.connection = None - self._lock = threading.RLock() - - @property - def connection_class(self): - return smtplib.SMTP_SSL if self.use_ssl else smtplib.SMTP - - @cached_property - def ssl_context(self): - if self.ssl_certfile or self.ssl_keyfile: - ssl_context = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS_CLIENT) - ssl_context.load_cert_chain(self.ssl_certfile, self.ssl_keyfile) - return ssl_context - else: - return ssl.create_default_context() - - def open(self): - """ - Ensure an open connection to the email server. Return whether or not a - new connection was required (True or False) or None if an exception - passed silently. - """ - if self.connection: - # Nothing to do if the connection is already open. - return False - - # If local_hostname is not specified, socket.getfqdn() gets used. - # For performance, we use the cached FQDN for local_hostname. - connection_params = {"local_hostname": DNS_NAME.get_fqdn()} - if self.timeout is not None: - connection_params["timeout"] = self.timeout - if self.use_ssl: - connection_params["context"] = self.ssl_context - try: - self.connection = self.connection_class( - self.host, self.port, **connection_params - ) - - # TLS/SSL are mutually exclusive, so only attempt TLS over - # non-secure connections. - if not self.use_ssl and self.use_tls: - self.connection.starttls(context=self.ssl_context) - if self.username and self.password: - self.connection.login(self.username, self.password) - return True - except OSError: - if not self.fail_silently: - raise - - def close(self): - """Close the connection to the email server.""" - if self.connection is None: - return - try: - try: - self.connection.quit() - except (ssl.SSLError, smtplib.SMTPServerDisconnected): - # This happens when calling quit() on a TLS connection - # sometimes, or when the connection was already disconnected - # by the server. - self.connection.close() - except smtplib.SMTPException: - if self.fail_silently: - return - raise - finally: - self.connection = None - - def send_messages(self, email_messages): - """ - Send one or more EmailMessage objects and return the number of email - messages sent. - """ - if not email_messages: - return 0 - with self._lock: - new_conn_created = self.open() - if not self.connection or new_conn_created is None: - # We failed silently on open(). - # Trying to send would be pointless. - return 0 - num_sent = 0 - try: - for message in email_messages: - sent = self._send(message) - if sent: - num_sent += 1 - finally: - if new_conn_created: - self.close() - return num_sent - - def _send(self, email_message): - """A helper method that does the actual sending.""" - if not email_message.recipients(): - return False - encoding = email_message.encoding or settings.DEFAULT_CHARSET - from_email = sanitize_address(email_message.from_email, encoding) - recipients = [ - sanitize_address(addr, encoding) for addr in email_message.recipients() - ] - message = email_message.message() - try: - self.connection.sendmail( - from_email, recipients, message.as_bytes(linesep="\r\n") - ) - except smtplib.SMTPException: - if not self.fail_silently: - raise - return False - return True diff --git a/.venv/lib/python3.10/site-packages/django/core/mail/message.py b/.venv/lib/python3.10/site-packages/django/core/mail/message.py deleted file mode 100644 index adcd9fc..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/mail/message.py +++ /dev/null @@ -1,520 +0,0 @@ -import mimetypes -from collections import namedtuple -from email import charset as Charset -from email import encoders as Encoders -from email import generator, message_from_bytes -from email.errors import HeaderParseError -from email.header import Header -from email.headerregistry import Address, parser -from email.message import Message -from email.mime.base import MIMEBase -from email.mime.message import MIMEMessage -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.utils import formataddr, formatdate, getaddresses, make_msgid -from io import BytesIO, StringIO -from pathlib import Path - -from django.conf import settings -from django.core.mail.utils import DNS_NAME -from django.utils.encoding import force_bytes, force_str, punycode - -# Don't BASE64-encode UTF-8 messages so that we avoid unwanted attention from -# some spam filters. -utf8_charset = Charset.Charset("utf-8") -utf8_charset.body_encoding = None # Python defaults to BASE64 -utf8_charset_qp = Charset.Charset("utf-8") -utf8_charset_qp.body_encoding = Charset.QP - -# Default MIME type to use on attachments (if it is not explicitly given -# and cannot be guessed). -DEFAULT_ATTACHMENT_MIME_TYPE = "application/octet-stream" - -RFC5322_EMAIL_LINE_LENGTH_LIMIT = 998 - - -class BadHeaderError(ValueError): - pass - - -# Header names that contain structured address data (RFC 5322). -ADDRESS_HEADERS = { - "from", - "sender", - "reply-to", - "to", - "cc", - "bcc", - "resent-from", - "resent-sender", - "resent-to", - "resent-cc", - "resent-bcc", -} - - -def forbid_multi_line_headers(name, val, encoding): - """Forbid multi-line headers to prevent header injection.""" - encoding = encoding or settings.DEFAULT_CHARSET - val = str(val) # val may be lazy - if "\n" in val or "\r" in val: - raise BadHeaderError( - "Header values can't contain newlines (got %r for header %r)" % (val, name) - ) - try: - val.encode("ascii") - except UnicodeEncodeError: - if name.lower() in ADDRESS_HEADERS: - val = ", ".join( - sanitize_address(addr, encoding) for addr in getaddresses((val,)) - ) - else: - val = Header(val, encoding).encode() - else: - if name.lower() == "subject": - val = Header(val).encode() - return name, val - - -def sanitize_address(addr, encoding): - """ - Format a pair of (name, address) or an email address string. - """ - address = None - if not isinstance(addr, tuple): - addr = force_str(addr) - try: - token, rest = parser.get_mailbox(addr) - except (HeaderParseError, ValueError, IndexError): - raise ValueError('Invalid address "%s"' % addr) - else: - if rest: - # The entire email address must be parsed. - raise ValueError( - 'Invalid address; only %s could be parsed from "%s"' % (token, addr) - ) - nm = token.display_name or "" - localpart = token.local_part - domain = token.domain or "" - else: - nm, address = addr - if "@" not in address: - raise ValueError(f'Invalid address "{address}"') - localpart, domain = address.rsplit("@", 1) - - address_parts = nm + localpart + domain - if "\n" in address_parts or "\r" in address_parts: - raise ValueError("Invalid address; address parts cannot contain newlines.") - - # Avoid UTF-8 encode, if it's possible. - try: - nm.encode("ascii") - nm = Header(nm).encode() - except UnicodeEncodeError: - nm = Header(nm, encoding).encode() - try: - localpart.encode("ascii") - except UnicodeEncodeError: - localpart = Header(localpart, encoding).encode() - domain = punycode(domain) - - parsed_address = Address(username=localpart, domain=domain) - return formataddr((nm, parsed_address.addr_spec)) - - -class MIMEMixin: - def as_string(self, unixfrom=False, linesep="\n"): - """Return the entire formatted message as a string. - Optional `unixfrom' when True, means include the Unix From_ envelope - header. - - This overrides the default as_string() implementation to not mangle - lines that begin with 'From '. See bug #13433 for details. - """ - fp = StringIO() - g = generator.Generator(fp, mangle_from_=False) - g.flatten(self, unixfrom=unixfrom, linesep=linesep) - return fp.getvalue() - - def as_bytes(self, unixfrom=False, linesep="\n"): - """Return the entire formatted message as bytes. - Optional `unixfrom' when True, means include the Unix From_ envelope - header. - - This overrides the default as_bytes() implementation to not mangle - lines that begin with 'From '. See bug #13433 for details. - """ - fp = BytesIO() - g = generator.BytesGenerator(fp, mangle_from_=False) - g.flatten(self, unixfrom=unixfrom, linesep=linesep) - return fp.getvalue() - - -class SafeMIMEMessage(MIMEMixin, MIMEMessage): - def __setitem__(self, name, val): - # Per RFC 2046 Section 5.2.1, message/rfc822 attachment headers must be ASCII. - name, val = forbid_multi_line_headers(name, val, "ascii") - MIMEMessage.__setitem__(self, name, val) - - -class SafeMIMEText(MIMEMixin, MIMEText): - def __init__(self, _text, _subtype="plain", _charset=None): - self.encoding = _charset - MIMEText.__init__(self, _text, _subtype=_subtype, _charset=_charset) - - def __setitem__(self, name, val): - name, val = forbid_multi_line_headers(name, val, self.encoding) - MIMEText.__setitem__(self, name, val) - - def set_payload(self, payload, charset=None): - if charset == "utf-8" and not isinstance(charset, Charset.Charset): - has_long_lines = any( - len(line.encode(errors="surrogateescape")) - > RFC5322_EMAIL_LINE_LENGTH_LIMIT - for line in payload.splitlines() - ) - # Quoted-Printable encoding has the side effect of shortening long - # lines, if any (#22561). - charset = utf8_charset_qp if has_long_lines else utf8_charset - MIMEText.set_payload(self, payload, charset=charset) - - -class SafeMIMEMultipart(MIMEMixin, MIMEMultipart): - def __init__( - self, _subtype="mixed", boundary=None, _subparts=None, encoding=None, **_params - ): - self.encoding = encoding - MIMEMultipart.__init__(self, _subtype, boundary, _subparts, **_params) - - def __setitem__(self, name, val): - name, val = forbid_multi_line_headers(name, val, self.encoding) - MIMEMultipart.__setitem__(self, name, val) - - -EmailAlternative = namedtuple("Alternative", ["content", "mimetype"]) -EmailAttachment = namedtuple("Attachment", ["filename", "content", "mimetype"]) - - -class EmailMessage: - """A container for email information.""" - - content_subtype = "plain" - mixed_subtype = "mixed" - encoding = None # None => use settings default - - def __init__( - self, - subject="", - body="", - from_email=None, - to=None, - bcc=None, - connection=None, - attachments=None, - headers=None, - cc=None, - reply_to=None, - ): - """ - Initialize a single email message (which can be sent to multiple - recipients). - """ - if to: - if isinstance(to, str): - raise TypeError('"to" argument must be a list or tuple') - self.to = list(to) - else: - self.to = [] - if cc: - if isinstance(cc, str): - raise TypeError('"cc" argument must be a list or tuple') - self.cc = list(cc) - else: - self.cc = [] - if bcc: - if isinstance(bcc, str): - raise TypeError('"bcc" argument must be a list or tuple') - self.bcc = list(bcc) - else: - self.bcc = [] - if reply_to: - if isinstance(reply_to, str): - raise TypeError('"reply_to" argument must be a list or tuple') - self.reply_to = list(reply_to) - else: - self.reply_to = [] - self.from_email = from_email or settings.DEFAULT_FROM_EMAIL - self.subject = subject - self.body = body or "" - self.attachments = [] - if attachments: - for attachment in attachments: - if isinstance(attachment, MIMEBase): - self.attach(attachment) - else: - self.attach(*attachment) - self.extra_headers = headers or {} - self.connection = connection - - def get_connection(self, fail_silently=False): - from django.core.mail import get_connection - - if not self.connection: - self.connection = get_connection(fail_silently=fail_silently) - return self.connection - - def message(self): - encoding = self.encoding or settings.DEFAULT_CHARSET - msg = SafeMIMEText(self.body, self.content_subtype, encoding) - msg = self._create_message(msg) - msg["Subject"] = self.subject - msg["From"] = self.extra_headers.get("From", self.from_email) - self._set_list_header_if_not_empty(msg, "To", self.to) - self._set_list_header_if_not_empty(msg, "Cc", self.cc) - self._set_list_header_if_not_empty(msg, "Reply-To", self.reply_to) - - # Email header names are case-insensitive (RFC 2045), so we have to - # accommodate that when doing comparisons. - header_names = [key.lower() for key in self.extra_headers] - if "date" not in header_names: - # formatdate() uses stdlib methods to format the date, which use - # the stdlib/OS concept of a timezone, however, Django sets the - # TZ environment variable based on the TIME_ZONE setting which - # will get picked up by formatdate(). - msg["Date"] = formatdate(localtime=settings.EMAIL_USE_LOCALTIME) - if "message-id" not in header_names: - # Use cached DNS_NAME for performance - msg["Message-ID"] = make_msgid(domain=DNS_NAME) - for name, value in self.extra_headers.items(): - # Avoid headers handled above. - if name.lower() not in {"from", "to", "cc", "reply-to"}: - msg[name] = value - return msg - - def recipients(self): - """ - Return a list of all recipients of the email (includes direct - addressees as well as Cc and Bcc entries). - """ - return [email for email in (self.to + self.cc + self.bcc) if email] - - def send(self, fail_silently=False): - """Send the email message.""" - if not self.recipients(): - # Don't bother creating the network connection if there's nobody to - # send to. - return 0 - return self.get_connection(fail_silently).send_messages([self]) - - def attach(self, filename=None, content=None, mimetype=None): - """ - Attach a file with the given filename and content. The filename can - be omitted and the mimetype is guessed, if not provided. - - If the first parameter is a MIMEBase subclass, insert it directly - into the resulting message attachments. - - For a text/* mimetype (guessed or specified), when a bytes object is - specified as content, decode it as UTF-8. If that fails, set the - mimetype to DEFAULT_ATTACHMENT_MIME_TYPE and don't decode the content. - """ - if isinstance(filename, MIMEBase): - if content is not None or mimetype is not None: - raise ValueError( - "content and mimetype must not be given when a MIMEBase " - "instance is provided." - ) - self.attachments.append(filename) - elif content is None: - raise ValueError("content must be provided.") - else: - mimetype = ( - mimetype - or mimetypes.guess_type(filename)[0] - or DEFAULT_ATTACHMENT_MIME_TYPE - ) - basetype, subtype = mimetype.split("/", 1) - - if basetype == "text": - if isinstance(content, bytes): - try: - content = content.decode() - except UnicodeDecodeError: - # If mimetype suggests the file is text but it's - # actually binary, read() raises a UnicodeDecodeError. - mimetype = DEFAULT_ATTACHMENT_MIME_TYPE - - self.attachments.append(EmailAttachment(filename, content, mimetype)) - - def attach_file(self, path, mimetype=None): - """ - Attach a file from the filesystem. - - Set the mimetype to DEFAULT_ATTACHMENT_MIME_TYPE if it isn't specified - and cannot be guessed. - - For a text/* mimetype (guessed or specified), decode the file's content - as UTF-8. If that fails, set the mimetype to - DEFAULT_ATTACHMENT_MIME_TYPE and don't decode the content. - """ - path = Path(path) - with path.open("rb") as file: - content = file.read() - self.attach(path.name, content, mimetype) - - def _create_message(self, msg): - return self._create_attachments(msg) - - def _create_attachments(self, msg): - if self.attachments: - encoding = self.encoding or settings.DEFAULT_CHARSET - body_msg = msg - msg = SafeMIMEMultipart(_subtype=self.mixed_subtype, encoding=encoding) - if self.body or body_msg.is_multipart(): - msg.attach(body_msg) - for attachment in self.attachments: - if isinstance(attachment, MIMEBase): - msg.attach(attachment) - else: - msg.attach(self._create_attachment(*attachment)) - return msg - - def _create_mime_attachment(self, content, mimetype): - """ - Convert the content, mimetype pair into a MIME attachment object. - - If the mimetype is message/rfc822, content may be an - email.Message or EmailMessage object, as well as a str. - """ - basetype, subtype = mimetype.split("/", 1) - if basetype == "text": - encoding = self.encoding or settings.DEFAULT_CHARSET - attachment = SafeMIMEText(content, subtype, encoding) - elif basetype == "message" and subtype == "rfc822": - # Bug #18967: Per RFC 2046 Section 5.2.1, message/rfc822 - # attachments must not be base64 encoded. - if isinstance(content, EmailMessage): - # convert content into an email.Message first - content = content.message() - elif not isinstance(content, Message): - # For compatibility with existing code, parse the message - # into an email.Message object if it is not one already. - content = message_from_bytes(force_bytes(content)) - - attachment = SafeMIMEMessage(content, subtype) - else: - # Encode non-text attachments with base64. - attachment = MIMEBase(basetype, subtype) - attachment.set_payload(content) - Encoders.encode_base64(attachment) - return attachment - - def _create_attachment(self, filename, content, mimetype=None): - """ - Convert the filename, content, mimetype triple into a MIME attachment - object. - """ - attachment = self._create_mime_attachment(content, mimetype) - if filename: - try: - filename.encode("ascii") - except UnicodeEncodeError: - filename = ("utf-8", "", filename) - attachment.add_header( - "Content-Disposition", "attachment", filename=filename - ) - return attachment - - def _set_list_header_if_not_empty(self, msg, header, values): - """ - Set msg's header, either from self.extra_headers, if present, or from - the values argument if not empty. - """ - try: - msg[header] = self.extra_headers[header] - except KeyError: - if values: - msg[header] = ", ".join(str(v) for v in values) - - -class EmailMultiAlternatives(EmailMessage): - """ - A version of EmailMessage that makes it easy to send multipart/alternative - messages. For example, including text and HTML versions of the text is - made easier. - """ - - alternative_subtype = "alternative" - - def __init__( - self, - subject="", - body="", - from_email=None, - to=None, - bcc=None, - connection=None, - attachments=None, - headers=None, - alternatives=None, - cc=None, - reply_to=None, - ): - """ - Initialize a single email message (which can be sent to multiple - recipients). - """ - super().__init__( - subject, - body, - from_email, - to, - bcc, - connection, - attachments, - headers, - cc, - reply_to, - ) - self.alternatives = [ - EmailAlternative(*alternative) for alternative in (alternatives or []) - ] - - def attach_alternative(self, content, mimetype): - """Attach an alternative content representation.""" - if content is None or mimetype is None: - raise ValueError("Both content and mimetype must be provided.") - self.alternatives.append(EmailAlternative(content, mimetype)) - - def _create_message(self, msg): - return self._create_attachments(self._create_alternatives(msg)) - - def _create_alternatives(self, msg): - encoding = self.encoding or settings.DEFAULT_CHARSET - if self.alternatives: - body_msg = msg - msg = SafeMIMEMultipart( - _subtype=self.alternative_subtype, encoding=encoding - ) - if self.body: - msg.attach(body_msg) - for alternative in self.alternatives: - msg.attach( - self._create_mime_attachment( - alternative.content, alternative.mimetype - ) - ) - return msg - - def body_contains(self, text): - """ - Checks that ``text`` occurs in the email body and in all attached MIME - type text/* alternatives. - """ - if text not in self.body: - return False - - for content, mimetype in self.alternatives: - if mimetype.startswith("text/") and text not in content: - return False - return True diff --git a/.venv/lib/python3.10/site-packages/django/core/mail/utils.py b/.venv/lib/python3.10/site-packages/django/core/mail/utils.py deleted file mode 100644 index 8143c23..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/mail/utils.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -Email message and email sending related helper functions. -""" - -import socket - -from django.utils.encoding import punycode - - -# Cache the hostname, but do it lazily: socket.getfqdn() can take a couple of -# seconds, which slows down the restart of the server. -class CachedDnsName: - def __str__(self): - return self.get_fqdn() - - def get_fqdn(self): - if not hasattr(self, "_fqdn"): - self._fqdn = punycode(socket.getfqdn()) - return self._fqdn - - -DNS_NAME = CachedDnsName() diff --git a/.venv/lib/python3.10/site-packages/django/core/management/__init__.py b/.venv/lib/python3.10/site-packages/django/core/management/__init__.py deleted file mode 100644 index 0c16447..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/__init__.py +++ /dev/null @@ -1,442 +0,0 @@ -import functools -import os -import pkgutil -import sys -from argparse import ( - _AppendConstAction, - _CountAction, - _StoreConstAction, - _SubParsersAction, -) -from collections import defaultdict -from difflib import get_close_matches -from importlib import import_module - -import django -from django.apps import apps -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.core.management.base import ( - BaseCommand, - CommandError, - CommandParser, - handle_default_options, -) -from django.core.management.color import color_style -from django.utils import autoreload - - -def find_commands(management_dir): - """ - Given a path to a management directory, return a list of all the command - names that are available. - """ - command_dir = os.path.join(management_dir, "commands") - return [ - name - for _, name, is_pkg in pkgutil.iter_modules([command_dir]) - if not is_pkg and not name.startswith("_") - ] - - -def load_command_class(app_name, name): - """ - Given a command name and an application name, return the Command - class instance. Allow all errors raised by the import process - (ImportError, AttributeError) to propagate. - """ - module = import_module("%s.management.commands.%s" % (app_name, name)) - return module.Command() - - -@functools.cache -def get_commands(): - """ - Return a dictionary mapping command names to their callback applications. - - Look for a management.commands package in django.core, and in each - installed application -- if a commands package exists, register all - commands in that package. - - Core commands are always included. If a settings module has been - specified, also include user-defined commands. - - The dictionary is in the format {command_name: app_name}. Key-value - pairs from this dictionary can then be used in calls to - load_command_class(app_name, command_name) - - The dictionary is cached on the first call and reused on subsequent - calls. - """ - commands = {name: "django.core" for name in find_commands(__path__[0])} - - if not settings.configured: - return commands - - for app_config in reversed(apps.get_app_configs()): - path = os.path.join(app_config.path, "management") - commands.update({name: app_config.name for name in find_commands(path)}) - - return commands - - -def call_command(command_name, *args, **options): - """ - Call the given command, with the given options and args/kwargs. - - This is the primary API you should use for calling specific commands. - - `command_name` may be a string or a command object. Using a string is - preferred unless the command object is required for further processing or - testing. - - Some examples: - call_command('migrate') - call_command('shell', plain=True) - call_command('sqlmigrate', 'myapp') - - from django.core.management.commands import flush - cmd = flush.Command() - call_command(cmd, verbosity=0, interactive=False) - # Do something with cmd ... - """ - if isinstance(command_name, BaseCommand): - # Command object passed in. - command = command_name - command_name = command.__class__.__module__.split(".")[-1] - else: - # Load the command object by name. - try: - app_name = get_commands()[command_name] - except KeyError: - raise CommandError("Unknown command: %r" % command_name) - - if isinstance(app_name, BaseCommand): - # If the command is already loaded, use it directly. - command = app_name - else: - command = load_command_class(app_name, command_name) - - # Simulate argument parsing to get the option defaults (see #10080 for details). - parser = command.create_parser("", command_name) - # Use the `dest` option name from the parser option - opt_mapping = { - min(s_opt.option_strings).lstrip("-").replace("-", "_"): s_opt.dest - for s_opt in parser._actions - if s_opt.option_strings - } - arg_options = {opt_mapping.get(key, key): value for key, value in options.items()} - parse_args = [] - for arg in args: - if isinstance(arg, (list, tuple)): - parse_args += map(str, arg) - else: - parse_args.append(str(arg)) - - def get_actions(parser): - # Parser actions and actions from sub-parser choices. - for opt in parser._actions: - if isinstance(opt, _SubParsersAction): - for sub_opt in opt.choices.values(): - yield from get_actions(sub_opt) - else: - yield opt - - parser_actions = list(get_actions(parser)) - mutually_exclusive_required_options = { - opt - for group in parser._mutually_exclusive_groups - for opt in group._group_actions - if group.required - } - # Any required arguments which are passed in via **options must be passed - # to parse_args(). - for opt in parser_actions: - if opt.dest in options and ( - opt.required or opt in mutually_exclusive_required_options - ): - opt_dest_count = sum(v == opt.dest for v in opt_mapping.values()) - if opt_dest_count > 1: - raise TypeError( - f"Cannot pass the dest {opt.dest!r} that matches multiple " - f"arguments via **options." - ) - parse_args.append(min(opt.option_strings)) - if isinstance(opt, (_AppendConstAction, _CountAction, _StoreConstAction)): - continue - value = arg_options[opt.dest] - if isinstance(value, (list, tuple)): - parse_args += map(str, value) - else: - parse_args.append(str(value)) - defaults = parser.parse_args(args=parse_args) - defaults = dict(defaults._get_kwargs(), **arg_options) - # Raise an error if any unknown options were passed. - stealth_options = set(command.base_stealth_options + command.stealth_options) - dest_parameters = {action.dest for action in parser_actions} - valid_options = (dest_parameters | stealth_options).union(opt_mapping) - unknown_options = set(options) - valid_options - if unknown_options: - raise TypeError( - "Unknown option(s) for %s command: %s. " - "Valid options are: %s." - % ( - command_name, - ", ".join(sorted(unknown_options)), - ", ".join(sorted(valid_options)), - ) - ) - # Move positional args out of options to mimic legacy optparse - args = defaults.pop("args", ()) - if "skip_checks" not in options: - defaults["skip_checks"] = True - - return command.execute(*args, **defaults) - - -class ManagementUtility: - """ - Encapsulate the logic of the django-admin and manage.py utilities. - """ - - def __init__(self, argv=None): - self.argv = argv or sys.argv[:] - self.prog_name = os.path.basename(self.argv[0]) - if self.prog_name == "__main__.py": - self.prog_name = "python -m django" - self.settings_exception = None - - def main_help_text(self, commands_only=False): - """Return the script's main help text, as a string.""" - if commands_only: - usage = sorted(get_commands()) - else: - usage = [ - "", - "Type '%s help ' for help on a specific subcommand." - % self.prog_name, - "", - "Available subcommands:", - ] - commands_dict = defaultdict(lambda: []) - for name, app in get_commands().items(): - if app == "django.core": - app = "django" - else: - app = app.rpartition(".")[-1] - commands_dict[app].append(name) - style = color_style() - for app in sorted(commands_dict): - usage.append("") - usage.append(style.NOTICE("[%s]" % app)) - for name in sorted(commands_dict[app]): - usage.append(" %s" % name) - # Output an extra note if settings are not properly configured - if self.settings_exception is not None: - usage.append( - style.NOTICE( - "Note that only Django core commands are listed " - "as settings are not properly configured (error: %s)." - % self.settings_exception - ) - ) - - return "\n".join(usage) - - def fetch_command(self, subcommand): - """ - Try to fetch the given subcommand, printing a message with the - appropriate command called from the command line (usually - "django-admin" or "manage.py") if it can't be found. - """ - # Get commands outside of try block to prevent swallowing exceptions - commands = get_commands() - try: - app_name = commands[subcommand] - except KeyError: - if os.environ.get("DJANGO_SETTINGS_MODULE"): - # If `subcommand` is missing due to misconfigured settings, the - # following line will retrigger an ImproperlyConfigured exception - # (get_commands() swallows the original one) so the user is - # informed about it. - settings.INSTALLED_APPS - elif not settings.configured: - sys.stderr.write("No Django settings specified.\n") - possible_matches = get_close_matches(subcommand, commands) - sys.stderr.write("Unknown command: %r" % subcommand) - if possible_matches: - sys.stderr.write(". Did you mean %s?" % possible_matches[0]) - sys.stderr.write("\nType '%s help' for usage.\n" % self.prog_name) - sys.exit(1) - if isinstance(app_name, BaseCommand): - # If the command is already loaded, use it directly. - klass = app_name - else: - klass = load_command_class(app_name, subcommand) - return klass - - def autocomplete(self): - """ - Output completion suggestions for BASH. - - The output of this function is passed to BASH's `COMPREPLY` variable - and treated as completion suggestions. `COMPREPLY` expects a space - separated string as the result. - - The `COMP_WORDS` and `COMP_CWORD` BASH environment variables are used - to get information about the cli input. Please refer to the BASH - man-page for more information about this variables. - - Subcommand options are saved as pairs. A pair consists of - the long option string (e.g. '--exclude') and a boolean - value indicating if the option requires arguments. When printing to - stdout, an equal sign is appended to options which require arguments. - - Note: If debugging this function, it is recommended to write the debug - output in a separate file. Otherwise the debug output will be treated - and formatted as potential completion suggestions. - """ - # Don't complete if user hasn't sourced bash_completion file. - if "DJANGO_AUTO_COMPLETE" not in os.environ: - return - - cwords = os.environ["COMP_WORDS"].split()[1:] - cword = int(os.environ["COMP_CWORD"]) - - try: - curr = cwords[cword - 1] - except IndexError: - curr = "" - - subcommands = [*get_commands(), "help"] - options = [("--help", False)] - - # subcommand - if cword == 1: - print(" ".join(sorted(filter(lambda x: x.startswith(curr), subcommands)))) - # subcommand options - # special case: the 'help' subcommand has no options - elif cwords[0] in subcommands and cwords[0] != "help": - subcommand_cls = self.fetch_command(cwords[0]) - # special case: add the names of installed apps to options - if cwords[0] in ("dumpdata", "sqlmigrate", "sqlsequencereset", "test"): - try: - app_configs = apps.get_app_configs() - # Get the last part of the dotted path as the app name. - options.extend((app_config.label, 0) for app_config in app_configs) - except ImportError: - # Fail silently if DJANGO_SETTINGS_MODULE isn't set. The - # user will find out once they execute the command. - pass - parser = subcommand_cls.create_parser("", cwords[0]) - options.extend( - (min(s_opt.option_strings), s_opt.nargs != 0) - for s_opt in parser._actions - if s_opt.option_strings - ) - # filter out previously specified options from available options - prev_opts = {x.split("=")[0] for x in cwords[1 : cword - 1]} - options = (opt for opt in options if opt[0] not in prev_opts) - - # filter options by current input - options = sorted((k, v) for k, v in options if k.startswith(curr)) - for opt_label, require_arg in options: - # append '=' to options which require args - if require_arg: - opt_label += "=" - print(opt_label) - # Exit code of the bash completion function is never passed back to - # the user, so it's safe to always exit with 0. - # For more details see #25420. - sys.exit(0) - - def execute(self): - """ - Given the command-line arguments, figure out which subcommand is being - run, create a parser appropriate to that command, and run it. - """ - try: - subcommand = self.argv[1] - except IndexError: - subcommand = "help" # Display help if no arguments were given. - - # Preprocess options to extract --settings and --pythonpath. - # These options could affect the commands that are available, so they - # must be processed early. - parser = CommandParser( - prog=self.prog_name, - usage="%(prog)s subcommand [options] [args]", - add_help=False, - allow_abbrev=False, - ) - parser.add_argument("--settings") - parser.add_argument("--pythonpath") - parser.add_argument("args", nargs="*") # catch-all - try: - options, args = parser.parse_known_args(self.argv[2:]) - handle_default_options(options) - except CommandError: - pass # Ignore any option errors at this point. - - try: - settings.INSTALLED_APPS - except ImproperlyConfigured as exc: - self.settings_exception = exc - except ImportError as exc: - self.settings_exception = exc - - if settings.configured: - # Start the auto-reloading dev server even if the code is broken. - # The hardcoded condition is a code smell but we can't rely on a - # flag on the command class because we haven't located it yet. - if subcommand == "runserver" and "--noreload" not in self.argv: - try: - autoreload.check_errors(django.setup)() - except Exception: - # The exception will be raised later in the child process - # started by the autoreloader. Pretend it didn't happen by - # loading an empty list of applications. - apps.all_models = defaultdict(dict) - apps.app_configs = {} - apps.apps_ready = apps.models_ready = apps.ready = True - - # Remove options not compatible with the built-in runserver - # (e.g. options for the contrib.staticfiles' runserver). - # Changes here require manually testing as described in - # #27522. - _parser = self.fetch_command("runserver").create_parser( - "django", "runserver" - ) - _options, _args = _parser.parse_known_args(self.argv[2:]) - for _arg in _args: - self.argv.remove(_arg) - - # In all other cases, django.setup() is required to succeed. - else: - django.setup() - - self.autocomplete() - - if subcommand == "help": - if "--commands" in args: - sys.stdout.write(self.main_help_text(commands_only=True) + "\n") - elif not options.args: - sys.stdout.write(self.main_help_text() + "\n") - else: - self.fetch_command(options.args[0]).print_help( - self.prog_name, options.args[0] - ) - # Special-cases: We want 'django-admin --version' and - # 'django-admin --help' to work, for backwards compatibility. - elif subcommand == "version" or self.argv[1:] == ["--version"]: - sys.stdout.write(django.get_version() + "\n") - elif self.argv[1:] in (["--help"], ["-h"]): - sys.stdout.write(self.main_help_text() + "\n") - else: - self.fetch_command(subcommand).run_from_argv(self.argv) - - -def execute_from_command_line(argv=None): - """Run a ManagementUtility.""" - utility = ManagementUtility(argv) - utility.execute() diff --git a/.venv/lib/python3.10/site-packages/django/core/management/base.py b/.venv/lib/python3.10/site-packages/django/core/management/base.py deleted file mode 100644 index 12b4b42..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/base.py +++ /dev/null @@ -1,707 +0,0 @@ -""" -Base classes for writing management commands (named commands which can -be executed through ``django-admin`` or ``manage.py``). -""" - -import argparse -import os -import sys -from argparse import ArgumentParser, HelpFormatter -from functools import partial -from io import TextIOBase - -import django -from django.core import checks -from django.core.exceptions import ImproperlyConfigured -from django.core.management.color import color_style, no_style -from django.db import DEFAULT_DB_ALIAS, connections - -ALL_CHECKS = "__all__" - - -class CommandError(Exception): - """ - Exception class indicating a problem while executing a management - command. - - If this exception is raised during the execution of a management - command, it will be caught and turned into a nicely-printed error - message to the appropriate output stream (i.e., stderr); as a - result, raising this exception (with a sensible description of the - error) is the preferred way to indicate that something has gone - wrong in the execution of a command. - """ - - def __init__(self, *args, returncode=1, **kwargs): - self.returncode = returncode - super().__init__(*args, **kwargs) - - -class SystemCheckError(CommandError): - """ - The system check framework detected unrecoverable errors. - """ - - pass - - -class CommandParser(ArgumentParser): - """ - Customized ArgumentParser class to improve some error messages and prevent - SystemExit in several occasions, as SystemExit is unacceptable when a - command is called programmatically. - """ - - def __init__( - self, *, missing_args_message=None, called_from_command_line=None, **kwargs - ): - self.missing_args_message = missing_args_message - self.called_from_command_line = called_from_command_line - super().__init__(**kwargs) - - def parse_args(self, args=None, namespace=None): - # Catch missing argument for a better error message - if self.missing_args_message and not ( - args or any(not arg.startswith("-") for arg in args) - ): - self.error(self.missing_args_message) - return super().parse_args(args, namespace) - - def error(self, message): - if self.called_from_command_line: - super().error(message) - else: - raise CommandError("Error: %s" % message) - - def add_subparsers(self, **kwargs): - parser_class = kwargs.get("parser_class", type(self)) - if issubclass(parser_class, CommandParser): - kwargs["parser_class"] = partial( - parser_class, - called_from_command_line=self.called_from_command_line, - ) - return super().add_subparsers(**kwargs) - - -def handle_default_options(options): - """ - Include any default options that all commands should accept here - so that ManagementUtility can handle them before searching for - user commands. - """ - if options.settings: - os.environ["DJANGO_SETTINGS_MODULE"] = options.settings - if options.pythonpath: - sys.path.insert(0, options.pythonpath) - - -def no_translations(handle_func): - """Decorator that forces a command to run with translations deactivated.""" - - def wrapper(*args, **kwargs): - from django.utils import translation - - saved_locale = translation.get_language() - translation.deactivate_all() - try: - res = handle_func(*args, **kwargs) - finally: - if saved_locale is not None: - translation.activate(saved_locale) - return res - - return wrapper - - -class DjangoHelpFormatter(HelpFormatter): - """ - Customized formatter so that command-specific arguments appear in the - --help output before arguments common to all commands. - """ - - show_last = { - "--version", - "--verbosity", - "--traceback", - "--settings", - "--pythonpath", - "--no-color", - "--force-color", - "--skip-checks", - } - - def _reordered_actions(self, actions): - return sorted( - actions, key=lambda a: set(a.option_strings) & self.show_last != set() - ) - - def add_usage(self, usage, actions, *args, **kwargs): - super().add_usage(usage, self._reordered_actions(actions), *args, **kwargs) - - def add_arguments(self, actions): - super().add_arguments(self._reordered_actions(actions)) - - -class OutputWrapper: - """ - Wrapper around stdout/stderr - """ - - @property - def style_func(self): - return self._style_func - - @style_func.setter - def style_func(self, style_func): - if style_func and self.isatty(): - self._style_func = style_func - else: - self._style_func = lambda x: x - - def __init__(self, out, ending="\n"): - self._out = out - self.style_func = None - self.ending = ending - - def __getattr__(self, name): - return getattr(self._out, name) - - def flush(self): - if hasattr(self._out, "flush"): - self._out.flush() - - def isatty(self): - return hasattr(self._out, "isatty") and self._out.isatty() - - def write(self, msg="", style_func=None, ending=None): - ending = self.ending if ending is None else ending - if ending and not msg.endswith(ending): - msg += ending - style_func = style_func or self.style_func - self._out.write(style_func(msg)) - - -TextIOBase.register(OutputWrapper) - - -class BaseCommand: - """ - The base class from which all management commands ultimately - derive. - - Use this class if you want access to all of the mechanisms which - parse the command-line arguments and work out what code to call in - response; if you don't need to change any of that behavior, - consider using one of the subclasses defined in this file. - - If you are interested in overriding/customizing various aspects of - the command-parsing and -execution behavior, the normal flow works - as follows: - - 1. ``django-admin`` or ``manage.py`` loads the command class - and calls its ``run_from_argv()`` method. - - 2. The ``run_from_argv()`` method calls ``create_parser()`` to get - an ``ArgumentParser`` for the arguments, parses them, performs - any environment changes requested by options like - ``pythonpath``, and then calls the ``execute()`` method, - passing the parsed arguments. - - 3. The ``execute()`` method attempts to carry out the command by - calling the ``handle()`` method with the parsed arguments; any - output produced by ``handle()`` will be printed to standard - output and, if the command is intended to produce a block of - SQL statements, will be wrapped in ``BEGIN`` and ``COMMIT``. - - 4. If ``handle()`` or ``execute()`` raised any exception (e.g. - ``CommandError``), ``run_from_argv()`` will instead print an error - message to ``stderr``. - - Thus, the ``handle()`` method is typically the starting point for - subclasses; many built-in commands and command types either place - all of their logic in ``handle()``, or perform some additional - parsing work in ``handle()`` and then delegate from it to more - specialized methods as needed. - - Several attributes affect behavior at various steps along the way: - - ``help`` - A short description of the command, which will be printed in - help messages. - - ``output_transaction`` - A boolean indicating whether the command outputs SQL - statements; if ``True``, the output will automatically be - wrapped with ``BEGIN;`` and ``COMMIT;``. Default value is - ``False``. - - ``requires_migrations_checks`` - A boolean; if ``True``, the command prints a warning if the set of - migrations on disk don't match the migrations in the database. - - ``requires_system_checks`` - A list or tuple of tags, e.g. [Tags.staticfiles, Tags.models]. System - checks registered in the chosen tags will be checked for errors prior - to executing the command. The value '__all__' can be used to specify - that all system checks should be performed. Default value is '__all__'. - - To validate an individual application's models - rather than all applications' models, call - ``self.check(app_configs)`` from ``handle()``, where ``app_configs`` - is the list of application's configuration provided by the - app registry. - - ``stealth_options`` - A tuple of any options the command uses which aren't defined by the - argument parser. - """ - - # Metadata about this command. - help = "" - - # Configuration shortcuts that alter various logic. - _called_from_command_line = False - output_transaction = False # Whether to wrap the output in a "BEGIN; COMMIT;" - requires_migrations_checks = False - requires_system_checks = "__all__" - # Arguments, common to all commands, which aren't defined by the argument - # parser. - base_stealth_options = ("stderr", "stdout") - # Command-specific options not defined by the argument parser. - stealth_options = () - suppressed_base_arguments = set() - - def __init__(self, stdout=None, stderr=None, no_color=False, force_color=False): - self.stdout = OutputWrapper(stdout or sys.stdout) - self.stderr = OutputWrapper(stderr or sys.stderr) - if no_color and force_color: - raise CommandError("'no_color' and 'force_color' can't be used together.") - if no_color: - self.style = no_style() - else: - self.style = color_style(force_color) - self.stderr.style_func = self.style.ERROR - if ( - not isinstance(self.requires_system_checks, (list, tuple)) - and self.requires_system_checks != ALL_CHECKS - ): - raise TypeError("requires_system_checks must be a list or tuple.") - - def get_version(self): - """ - Return the Django version, which should be correct for all built-in - Django commands. User-supplied commands can override this method to - return their own version. - """ - return django.get_version() - - def create_parser(self, prog_name, subcommand, **kwargs): - """ - Create and return the ``ArgumentParser`` which will be used to - parse the arguments to this command. - """ - kwargs.setdefault("formatter_class", DjangoHelpFormatter) - parser = CommandParser( - prog="%s %s" % (os.path.basename(prog_name), subcommand), - description=self.help or None, - missing_args_message=getattr(self, "missing_args_message", None), - called_from_command_line=getattr(self, "_called_from_command_line", None), - **kwargs, - ) - self.add_base_argument( - parser, - "--version", - action="version", - version=self.get_version(), - help="Show program's version number and exit.", - ) - self.add_base_argument( - parser, - "-v", - "--verbosity", - default=1, - type=int, - choices=[0, 1, 2, 3], - help=( - "Verbosity level; 0=minimal output, 1=normal output, 2=verbose output, " - "3=very verbose output" - ), - ) - self.add_base_argument( - parser, - "--settings", - help=( - "The Python path to a settings module, e.g. " - '"myproject.settings.main". If this isn\'t provided, the ' - "DJANGO_SETTINGS_MODULE environment variable will be used." - ), - ) - self.add_base_argument( - parser, - "--pythonpath", - help=( - "A directory to add to the Python path, e.g. " - '"/home/djangoprojects/myproject".' - ), - ) - self.add_base_argument( - parser, - "--traceback", - action="store_true", - help="Display a full stack trace on CommandError exceptions.", - ) - self.add_base_argument( - parser, - "--no-color", - action="store_true", - help="Don't colorize the command output.", - ) - self.add_base_argument( - parser, - "--force-color", - action="store_true", - help="Force colorization of the command output.", - ) - if self.requires_system_checks: - parser.add_argument( - "--skip-checks", - action="store_true", - help="Skip system checks.", - ) - self.add_arguments(parser) - return parser - - def add_arguments(self, parser): - """ - Entry point for subclassed commands to add custom arguments. - """ - pass - - def add_base_argument(self, parser, *args, **kwargs): - """ - Call the parser's add_argument() method, suppressing the help text - according to BaseCommand.suppressed_base_arguments. - """ - for arg in args: - if arg in self.suppressed_base_arguments: - kwargs["help"] = argparse.SUPPRESS - break - parser.add_argument(*args, **kwargs) - - def print_help(self, prog_name, subcommand): - """ - Print the help message for this command, derived from - ``self.usage()``. - """ - parser = self.create_parser(prog_name, subcommand) - parser.print_help() - - def run_from_argv(self, argv): - """ - Set up any environment changes requested (e.g., Python path - and Django settings), then run this command. If the - command raises a ``CommandError``, intercept it and print it sensibly - to stderr. If the ``--traceback`` option is present or the raised - ``Exception`` is not ``CommandError``, raise it. - """ - self._called_from_command_line = True - parser = self.create_parser(argv[0], argv[1]) - - options = parser.parse_args(argv[2:]) - cmd_options = vars(options) - # Move positional args out of options to mimic legacy optparse - args = cmd_options.pop("args", ()) - handle_default_options(options) - try: - self.execute(*args, **cmd_options) - except CommandError as e: - if options.traceback: - raise - - # SystemCheckError takes care of its own formatting. - if isinstance(e, SystemCheckError): - self.stderr.write(str(e), lambda x: x) - else: - self.stderr.write("%s: %s" % (e.__class__.__name__, e)) - sys.exit(e.returncode) - finally: - try: - connections.close_all() - except ImproperlyConfigured: - # Ignore if connections aren't setup at this point (e.g. no - # configured settings). - pass - - def execute(self, *args, **options): - """ - Try to execute this command, performing system checks if needed (as - controlled by the ``requires_system_checks`` attribute, except if - force-skipped). - """ - if options["force_color"] and options["no_color"]: - raise CommandError( - "The --no-color and --force-color options can't be used together." - ) - if options["force_color"]: - self.style = color_style(force_color=True) - elif options["no_color"]: - self.style = no_style() - self.stderr.style_func = None - if options.get("stdout"): - self.stdout = OutputWrapper(options["stdout"]) - if options.get("stderr"): - self.stderr = OutputWrapper(options["stderr"]) - - if self.requires_system_checks and not options["skip_checks"]: - check_kwargs = self.get_check_kwargs(options) - self.check(**check_kwargs) - if self.requires_migrations_checks: - self.check_migrations() - output = self.handle(*args, **options) - if output: - if self.output_transaction: - connection = connections[options.get("database", DEFAULT_DB_ALIAS)] - output = "%s\n%s\n%s" % ( - self.style.SQL_KEYWORD(connection.ops.start_transaction_sql()), - output, - self.style.SQL_KEYWORD(connection.ops.end_transaction_sql()), - ) - self.stdout.write(output) - return output - - def get_check_kwargs(self, options): - if self.requires_system_checks == ALL_CHECKS: - return {} - return {"tags": self.requires_system_checks} - - def check( - self, - app_configs=None, - tags=None, - display_num_errors=False, - include_deployment_checks=False, - fail_level=checks.ERROR, - databases=None, - ): - """ - Use the system check framework to validate entire Django project. - Raise CommandError for any serious message (error or critical errors). - If there are only light messages (like warnings), print them to stderr - and don't raise an exception. - """ - all_issues = checks.run_checks( - app_configs=app_configs, - tags=tags, - include_deployment_checks=include_deployment_checks, - databases=databases, - ) - - header, body, footer = "", "", "" - visible_issue_count = 0 # excludes silenced warnings - - if all_issues: - debugs = [ - e for e in all_issues if e.level < checks.INFO and not e.is_silenced() - ] - infos = [ - e - for e in all_issues - if checks.INFO <= e.level < checks.WARNING and not e.is_silenced() - ] - warnings = [ - e - for e in all_issues - if checks.WARNING <= e.level < checks.ERROR and not e.is_silenced() - ] - errors = [ - e - for e in all_issues - if checks.ERROR <= e.level < checks.CRITICAL and not e.is_silenced() - ] - criticals = [ - e - for e in all_issues - if checks.CRITICAL <= e.level and not e.is_silenced() - ] - sorted_issues = [ - (criticals, "CRITICALS"), - (errors, "ERRORS"), - (warnings, "WARNINGS"), - (infos, "INFOS"), - (debugs, "DEBUGS"), - ] - - for issues, group_name in sorted_issues: - if issues: - visible_issue_count += len(issues) - formatted = ( - ( - self.style.ERROR(str(e)) - if e.is_serious() - else self.style.WARNING(str(e)) - ) - for e in issues - ) - formatted = "\n".join(sorted(formatted)) - body += "\n%s:\n%s\n" % (group_name, formatted) - - if visible_issue_count: - header = "System check identified some issues:\n" - - if display_num_errors: - if visible_issue_count: - footer += "\n" - footer += "System check identified %s (%s silenced)." % ( - ( - "no issues" - if visible_issue_count == 0 - else ( - "1 issue" - if visible_issue_count == 1 - else "%s issues" % visible_issue_count - ) - ), - len(all_issues) - visible_issue_count, - ) - - if any(e.is_serious(fail_level) and not e.is_silenced() for e in all_issues): - msg = self.style.ERROR("SystemCheckError: %s" % header) + body + footer - raise SystemCheckError(msg) - else: - msg = header + body + footer - - if msg: - if visible_issue_count: - self.stderr.write(msg, lambda x: x) - else: - self.stdout.write(msg) - - def check_migrations(self): - """ - Print a warning if the set of migrations on disk don't match the - migrations in the database. - """ - from django.db.migrations.executor import MigrationExecutor - - try: - executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS]) - except ImproperlyConfigured: - # No databases are configured (or the dummy one) - return - - plan = executor.migration_plan(executor.loader.graph.leaf_nodes()) - if plan: - apps_waiting_migration = sorted( - {migration.app_label for migration, backwards in plan} - ) - self.stdout.write( - self.style.NOTICE( - "\nYou have %(unapplied_migration_count)s unapplied migration(s). " - "Your project may not work properly until you apply the " - "migrations for app(s): %(apps_waiting_migration)s." - % { - "unapplied_migration_count": len(plan), - "apps_waiting_migration": ", ".join(apps_waiting_migration), - } - ) - ) - self.stdout.write( - self.style.NOTICE("Run 'python manage.py migrate' to apply them.") - ) - - def handle(self, *args, **options): - """ - The actual logic of the command. Subclasses must implement - this method. - """ - raise NotImplementedError( - "subclasses of BaseCommand must provide a handle() method" - ) - - -class AppCommand(BaseCommand): - """ - A management command which takes one or more installed application labels - as arguments, and does something with each of them. - - Rather than implementing ``handle()``, subclasses must implement - ``handle_app_config()``, which will be called once for each application. - """ - - missing_args_message = "Enter at least one application label." - - def add_arguments(self, parser): - parser.add_argument( - "args", - metavar="app_label", - nargs="+", - help="One or more application label.", - ) - - def handle(self, *app_labels, **options): - from django.apps import apps - - try: - app_configs = [apps.get_app_config(app_label) for app_label in app_labels] - except (LookupError, ImportError) as e: - raise CommandError( - "%s. Are you sure your INSTALLED_APPS setting is correct?" % e - ) - output = [] - for app_config in app_configs: - app_output = self.handle_app_config(app_config, **options) - if app_output: - output.append(app_output) - return "\n".join(output) - - def handle_app_config(self, app_config, **options): - """ - Perform the command's actions for app_config, an AppConfig instance - corresponding to an application label given on the command line. - """ - raise NotImplementedError( - "Subclasses of AppCommand must provide a handle_app_config() method." - ) - - -class LabelCommand(BaseCommand): - """ - A management command which takes one or more arbitrary arguments - (labels) on the command line, and does something with each of - them. - - Rather than implementing ``handle()``, subclasses must implement - ``handle_label()``, which will be called once for each label. - - If the arguments should be names of installed applications, use - ``AppCommand`` instead. - """ - - label = "label" - missing_args_message = "Enter at least one %s." - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - if self.missing_args_message == LabelCommand.missing_args_message: - self.missing_args_message = self.missing_args_message % self.label - - def add_arguments(self, parser): - parser.add_argument("args", metavar=self.label, nargs="+") - - def handle(self, *labels, **options): - output = [] - for label in labels: - label_output = self.handle_label(label, **options) - if label_output: - output.append(label_output) - return "\n".join(output) - - def handle_label(self, label, **options): - """ - Perform the command's actions for ``label``, which will be the - string as given on the command line. - """ - raise NotImplementedError( - "subclasses of LabelCommand must provide a handle_label() method" - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/color.py b/.venv/lib/python3.10/site-packages/django/core/management/color.py deleted file mode 100644 index eef64b2..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/color.py +++ /dev/null @@ -1,120 +0,0 @@ -""" -Sets up the terminal color scheme. -""" - -import functools -import os -import sys - -from django.utils import termcolors - -try: - import colorama - - # Avoid initializing colorama in non-Windows platforms. - colorama.just_fix_windows_console() -except ( - AttributeError, # colorama <= 0.4.6. - ImportError, # colorama is not installed. - # If just_fix_windows_console() accesses sys.stdout with - # WSGIRestrictedStdout. - OSError, -): - HAS_COLORAMA = False -else: - HAS_COLORAMA = True - - -def supports_color(): - """ - Return True if the running system's terminal supports color, - and False otherwise. - """ - - def vt_codes_enabled_in_windows_registry(): - """ - Check the Windows Registry to see if VT code handling has been enabled - by default, see https://superuser.com/a/1300251/447564. - """ - try: - # winreg is only available on Windows. - import winreg - except ImportError: - return False - else: - try: - reg_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Console") - reg_key_value, _ = winreg.QueryValueEx(reg_key, "VirtualTerminalLevel") - except FileNotFoundError: - return False - else: - return reg_key_value == 1 - - # isatty is not always implemented, #6223. - is_a_tty = hasattr(sys.stdout, "isatty") and sys.stdout.isatty() - - return is_a_tty and ( - sys.platform != "win32" - or (HAS_COLORAMA and getattr(colorama, "fixed_windows_console", False)) - or "ANSICON" in os.environ - or - # Windows Terminal supports VT codes. - "WT_SESSION" in os.environ - or - # Microsoft Visual Studio Code's built-in terminal supports colors. - os.environ.get("TERM_PROGRAM") == "vscode" - or vt_codes_enabled_in_windows_registry() - ) - - -class Style: - pass - - -def make_style(config_string=""): - """ - Create a Style object from the given config_string. - - If config_string is empty django.utils.termcolors.DEFAULT_PALETTE is used. - """ - - style = Style() - - color_settings = termcolors.parse_color_setting(config_string) - - # The nocolor palette has all available roles. - # Use that palette as the basis for populating - # the palette as defined in the environment. - for role in termcolors.PALETTES[termcolors.NOCOLOR_PALETTE]: - if color_settings: - format = color_settings.get(role, {}) - style_func = termcolors.make_style(**format) - else: - - def style_func(x): - return x - - setattr(style, role, style_func) - - # For backwards compatibility, - # set style for ERROR_OUTPUT == ERROR - style.ERROR_OUTPUT = style.ERROR - - return style - - -@functools.cache -def no_style(): - """ - Return a Style object with no color scheme. - """ - return make_style("nocolor") - - -def color_style(force_color=False): - """ - Return a Style object from the Django color scheme. - """ - if not force_color and not supports_color(): - return no_style() - return make_style(os.environ.get("DJANGO_COLORS", "")) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/__init__.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/check.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/check.py deleted file mode 100644 index e61cff7..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/check.py +++ /dev/null @@ -1,88 +0,0 @@ -from django.apps import apps -from django.core import checks -from django.core.checks.registry import registry -from django.core.management.base import BaseCommand, CommandError -from django.db import connections - - -class Command(BaseCommand): - help = "Checks the entire Django project for potential problems." - - requires_system_checks = [] - - def add_arguments(self, parser): - parser.add_argument("args", metavar="app_label", nargs="*") - parser.add_argument( - "--tag", - "-t", - action="append", - dest="tags", - help="Run only checks labeled with given tag.", - ) - parser.add_argument( - "--list-tags", - action="store_true", - help=( - "List available tags. Specify --deploy to include available deployment " - "tags." - ), - ) - parser.add_argument( - "--deploy", - action="store_true", - help="Check deployment settings.", - ) - parser.add_argument( - "--fail-level", - default="ERROR", - choices=["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"], - help=( - "Message level that will cause the command to exit with a " - "non-zero status. Default is ERROR." - ), - ) - parser.add_argument( - "--database", - action="append", - choices=tuple(connections), - dest="databases", - help="Run database related checks against these aliases.", - ) - - def handle(self, *app_labels, **options): - include_deployment_checks = options["deploy"] - if options["list_tags"]: - self.stdout.write( - "\n".join(sorted(registry.tags_available(include_deployment_checks))) - ) - return - - if app_labels: - app_configs = [apps.get_app_config(app_label) for app_label in app_labels] - else: - app_configs = None - - tags = options["tags"] - if tags: - try: - invalid_tag = next( - tag - for tag in tags - if not checks.tag_exists(tag, include_deployment_checks) - ) - except StopIteration: - # no invalid tags - pass - else: - raise CommandError( - 'There is no system check with the "%s" tag.' % invalid_tag - ) - - self.check( - app_configs=app_configs, - tags=tags, - display_num_errors=True, - include_deployment_checks=include_deployment_checks, - fail_level=getattr(checks, options["fail_level"]), - databases=options["databases"], - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/compilemessages.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/compilemessages.py deleted file mode 100644 index 0aaff58..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/compilemessages.py +++ /dev/null @@ -1,195 +0,0 @@ -import codecs -import concurrent.futures -import glob -import os -import tempfile -from pathlib import Path - -from django.core.management.base import BaseCommand, CommandError -from django.core.management.utils import find_command, is_ignored_path, popen_wrapper - - -def has_bom(fn): - with fn.open("rb") as f: - sample = f.read(4) - return sample.startswith( - (codecs.BOM_UTF8, codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE) - ) - - -def is_dir_writable(path): - try: - with tempfile.NamedTemporaryFile(dir=path): - pass - except OSError: - return False - return True - - -class Command(BaseCommand): - help = "Compiles .po files to .mo files for use with builtin gettext support." - - requires_system_checks = [] - - program = "msgfmt" - program_options = ["--check-format"] - - def add_arguments(self, parser): - parser.add_argument( - "--locale", - "-l", - action="append", - default=[], - help="Locale(s) to process (e.g. de_AT). Default is to process all. " - "Can be used multiple times.", - ) - parser.add_argument( - "--exclude", - "-x", - action="append", - default=[], - help="Locales to exclude. Default is none. Can be used multiple times.", - ) - parser.add_argument( - "--use-fuzzy", - "-f", - dest="fuzzy", - action="store_true", - help="Use fuzzy translations.", - ) - parser.add_argument( - "--ignore", - "-i", - action="append", - dest="ignore_patterns", - default=[], - metavar="PATTERN", - help="Ignore directories matching this glob-style pattern. " - "Use multiple times to ignore more.", - ) - - def handle(self, **options): - locale = options["locale"] - exclude = options["exclude"] - ignore_patterns = set(options["ignore_patterns"]) - self.verbosity = options["verbosity"] - if options["fuzzy"]: - self.program_options = self.program_options + ["-f"] - - if find_command(self.program) is None: - raise CommandError( - f"Can't find {self.program}. Make sure you have GNU gettext " - "tools 0.19 or newer installed." - ) - - basedirs = [os.path.join("conf", "locale"), "locale"] - if os.environ.get("DJANGO_SETTINGS_MODULE"): - from django.conf import settings - - basedirs.extend(settings.LOCALE_PATHS) - - # Walk entire tree, looking for locale directories - for dirpath, dirnames, filenames in os.walk(".", topdown=True): - # As we may modify dirnames, iterate through a copy of it instead - for dirname in list(dirnames): - if is_ignored_path( - os.path.normpath(os.path.join(dirpath, dirname)), ignore_patterns - ): - dirnames.remove(dirname) - elif dirname == "locale": - basedirs.append(os.path.join(dirpath, dirname)) - - # Gather existing directories. - basedirs = set(map(os.path.abspath, filter(os.path.isdir, basedirs))) - - if not basedirs: - raise CommandError( - "This script should be run from the Django Git " - "checkout or your project or app tree, or with " - "the settings module specified." - ) - - # Build locale list - all_locales = [] - for basedir in basedirs: - locale_dirs = filter(os.path.isdir, glob.glob("%s/*" % basedir)) - all_locales.extend(map(os.path.basename, locale_dirs)) - - # Account for excluded locales - locales = locale or all_locales - locales = set(locales).difference(exclude) - - self.has_errors = False - for basedir in basedirs: - if locales: - dirs = [ - os.path.join(basedir, locale, "LC_MESSAGES") for locale in locales - ] - else: - dirs = [basedir] - locations = [] - for ldir in dirs: - for dirpath, dirnames, filenames in os.walk(ldir): - locations.extend( - (dirpath, f) for f in filenames if f.endswith(".po") - ) - if locations: - self.compile_messages(locations) - - if self.has_errors: - raise CommandError("compilemessages generated one or more errors.") - - def compile_messages(self, locations): - """ - Locations is a list of tuples: [(directory, file), ...] - """ - with concurrent.futures.ThreadPoolExecutor() as executor: - futures = [] - for i, (dirpath, f) in enumerate(locations): - po_path = Path(dirpath) / f - mo_path = po_path.with_suffix(".mo") - try: - if mo_path.stat().st_mtime >= po_path.stat().st_mtime: - if self.verbosity > 0: - self.stdout.write( - "File “%s” is already compiled and up to date." - % po_path - ) - continue - except FileNotFoundError: - pass - if self.verbosity > 0: - self.stdout.write("processing file %s in %s" % (f, dirpath)) - - if has_bom(po_path): - self.stderr.write( - "The %s file has a BOM (Byte Order Mark). Django only " - "supports .po files encoded in UTF-8 and without any BOM." - % po_path - ) - self.has_errors = True - continue - - # Check writability on first location - if i == 0 and not is_dir_writable(mo_path.parent): - self.stderr.write( - "The po files under %s are in a seemingly not writable " - "location. mo files will not be updated/created." % dirpath - ) - self.has_errors = True - return - - args = [self.program, *self.program_options, "-o", mo_path, po_path] - futures.append(executor.submit(popen_wrapper, args)) - - for future in concurrent.futures.as_completed(futures): - output, errors, status = future.result() - if status: - if self.verbosity > 0: - if errors: - self.stderr.write( - "Execution of %s failed: %s" % (self.program, errors) - ) - else: - self.stderr.write("Execution of %s failed" % self.program) - self.has_errors = True diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/createcachetable.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/createcachetable.py deleted file mode 100644 index a8965b1..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/createcachetable.py +++ /dev/null @@ -1,131 +0,0 @@ -from django.conf import settings -from django.core.cache import caches -from django.core.cache.backends.db import BaseDatabaseCache -from django.core.management.base import BaseCommand, CommandError -from django.db import ( - DEFAULT_DB_ALIAS, - DatabaseError, - connections, - models, - router, - transaction, -) - - -class Command(BaseCommand): - help = "Creates the tables needed to use the SQL cache backend." - - requires_system_checks = [] - - def add_arguments(self, parser): - parser.add_argument( - "args", - metavar="table_name", - nargs="*", - help=( - "Optional table names. Otherwise, settings.CACHES is used to find " - "cache tables." - ), - ) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help="Nominates a database onto which the cache tables will be " - 'installed. Defaults to the "default" database.', - ) - parser.add_argument( - "--dry-run", - action="store_true", - help="Does not create the table, just prints the SQL that would be run.", - ) - - def handle(self, *tablenames, **options): - db = options["database"] - self.verbosity = options["verbosity"] - dry_run = options["dry_run"] - if tablenames: - # Legacy behavior, tablename specified as argument - for tablename in tablenames: - self.create_table(db, tablename, dry_run) - else: - for cache_alias in settings.CACHES: - cache = caches[cache_alias] - if isinstance(cache, BaseDatabaseCache): - self.create_table(db, cache._table, dry_run) - - def create_table(self, database, tablename, dry_run): - cache = BaseDatabaseCache(tablename, {}) - if not router.allow_migrate_model(database, cache.cache_model_class): - return - connection = connections[database] - - if tablename in connection.introspection.table_names(): - if self.verbosity > 0: - self.stdout.write("Cache table '%s' already exists." % tablename) - return - - fields = ( - # "key" is a reserved word in MySQL, so use "cache_key" instead. - models.CharField( - name="cache_key", max_length=255, unique=True, primary_key=True - ), - models.TextField(name="value"), - models.DateTimeField(name="expires", db_index=True), - ) - table_output = [] - index_output = [] - qn = connection.ops.quote_name - for f in fields: - field_output = [ - qn(f.name), - f.db_type(connection=connection), - "%sNULL" % ("NOT " if not f.null else ""), - ] - if f.primary_key: - field_output.append("PRIMARY KEY") - elif f.unique: - field_output.append("UNIQUE") - if f.db_index: - unique = "UNIQUE " if f.unique else "" - index_output.append( - "CREATE %sINDEX %s ON %s (%s);" - % ( - unique, - qn("%s_%s" % (tablename, f.name)), - qn(tablename), - qn(f.name), - ) - ) - table_output.append(" ".join(field_output)) - full_statement = ["CREATE TABLE %s (" % qn(tablename)] - for i, line in enumerate(table_output): - full_statement.append( - " %s%s" % (line, "," if i < len(table_output) - 1 else "") - ) - full_statement.append(");") - - full_statement = "\n".join(full_statement) - - if dry_run: - self.stdout.write(full_statement) - for statement in index_output: - self.stdout.write(statement) - return - - with transaction.atomic( - using=database, savepoint=connection.features.can_rollback_ddl - ): - with connection.cursor() as curs: - try: - curs.execute(full_statement) - except DatabaseError as e: - raise CommandError( - "Cache table '%s' could not be created.\nThe error was: %s." - % (tablename, e) - ) - for statement in index_output: - curs.execute(statement) - - if self.verbosity > 1: - self.stdout.write("Cache table '%s' created." % tablename) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/dbshell.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/dbshell.py deleted file mode 100644 index 07bc967..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/dbshell.py +++ /dev/null @@ -1,49 +0,0 @@ -import subprocess - -from django.core.management.base import BaseCommand, CommandError -from django.db import DEFAULT_DB_ALIAS, connections - - -class Command(BaseCommand): - help = ( - "Runs the command-line client for specified database, or the " - "default database if none is provided." - ) - - requires_system_checks = [] - - def add_arguments(self, parser): - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help=( - "Nominates a database onto which to open a shell. Defaults to the " - '"default" database.' - ), - ) - parameters = parser.add_argument_group("parameters") - parameters.add_argument("parameters", nargs="*") - - def handle(self, **options): - connection = connections[options["database"]] - try: - connection.client.runshell(options["parameters"]) - except FileNotFoundError: - # Note that we're assuming the FileNotFoundError relates to the - # command missing. It could be raised for some other reason, in - # which case this error message would be inaccurate. Still, this - # message catches the common case. - raise CommandError( - "You appear not to have the %r program installed or on your path." - % connection.client.executable_name - ) - except subprocess.CalledProcessError as e: - raise CommandError( - '"%s" returned non-zero exit status %s.' - % ( - " ".join(map(str, e.cmd)), - e.returncode, - ), - returncode=e.returncode, - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/diffsettings.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/diffsettings.py deleted file mode 100644 index 047e476..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/diffsettings.py +++ /dev/null @@ -1,91 +0,0 @@ -from django.core.management.base import BaseCommand - - -def module_to_dict(module, omittable=lambda k: k.startswith("_") or not k.isupper()): - """Convert a module namespace to a Python dictionary.""" - return {k: repr(getattr(module, k)) for k in dir(module) if not omittable(k)} - - -class Command(BaseCommand): - help = """Displays differences between the current settings.py and Django's - default settings.""" - - requires_system_checks = [] - - def add_arguments(self, parser): - parser.add_argument( - "--all", - action="store_true", - help=( - 'Display all settings, regardless of their value. In "hash" ' - 'mode, default values are prefixed by "###".' - ), - ) - parser.add_argument( - "--default", - metavar="MODULE", - help=( - "The settings module to compare the current settings against. Leave " - "empty to compare against Django's default settings." - ), - ) - parser.add_argument( - "--output", - default="hash", - choices=("hash", "unified"), - help=( - "Selects the output format. 'hash' mode displays each changed " - "setting, with the settings that don't appear in the defaults " - "followed by ###. 'unified' mode prefixes the default setting " - "with a minus sign, followed by the changed setting prefixed " - "with a plus sign." - ), - ) - - def handle(self, **options): - from django.conf import Settings, global_settings, settings - - # Because settings are imported lazily, we need to explicitly load them. - if not settings.configured: - settings._setup() - - user_settings = module_to_dict(settings._wrapped) - default = options["default"] - default_settings = module_to_dict( - Settings(default) if default else global_settings - ) - output_func = { - "hash": self.output_hash, - "unified": self.output_unified, - }[options["output"]] - return "\n".join(output_func(user_settings, default_settings, **options)) - - def output_hash(self, user_settings, default_settings, **options): - # Inspired by Postfix's "postconf -n". - output = [] - for key in sorted(user_settings): - if key not in default_settings: - output.append("%s = %s ###" % (key, user_settings[key])) - elif user_settings[key] != default_settings[key]: - output.append("%s = %s" % (key, user_settings[key])) - elif options["all"]: - output.append("### %s = %s" % (key, user_settings[key])) - return output - - def output_unified(self, user_settings, default_settings, **options): - output = [] - for key in sorted(user_settings): - if key not in default_settings: - output.append( - self.style.SUCCESS("+ %s = %s" % (key, user_settings[key])) - ) - elif user_settings[key] != default_settings[key]: - output.append( - self.style.ERROR("- %s = %s" % (key, default_settings[key])) - ) - output.append( - self.style.SUCCESS("+ %s = %s" % (key, user_settings[key])) - ) - elif options["all"]: - output.append(" %s = %s" % (key, user_settings[key])) - return output diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/dumpdata.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/dumpdata.py deleted file mode 100644 index 5a9ab83..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/dumpdata.py +++ /dev/null @@ -1,285 +0,0 @@ -import gzip -import os -import warnings - -from django.apps import apps -from django.core import serializers -from django.core.management.base import BaseCommand, CommandError -from django.core.management.utils import parse_apps_and_model_labels -from django.db import DEFAULT_DB_ALIAS, connections, router - -try: - import bz2 - - has_bz2 = True -except ImportError: - has_bz2 = False - -try: - import lzma - - has_lzma = True -except ImportError: - has_lzma = False - - -class ProxyModelWarning(Warning): - pass - - -class Command(BaseCommand): - help = ( - "Output the contents of the database as a fixture of the given format " - "(using each model's default manager unless --all is specified)." - ) - - def add_arguments(self, parser): - parser.add_argument( - "args", - metavar="app_label[.ModelName]", - nargs="*", - help=( - "Restricts dumped data to the specified app_label or " - "app_label.ModelName." - ), - ) - parser.add_argument( - "--format", - default="json", - help="Specifies the output serialization format for fixtures.", - ) - parser.add_argument( - "--indent", - type=int, - help="Specifies the indent level to use when pretty-printing output.", - ) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help="Nominates a specific database to dump fixtures from. " - 'Defaults to the "default" database.', - ) - parser.add_argument( - "-e", - "--exclude", - action="append", - default=[], - help="An app_label or app_label.ModelName to exclude " - "(use multiple --exclude to exclude multiple apps/models).", - ) - parser.add_argument( - "--natural-foreign", - action="store_true", - dest="use_natural_foreign_keys", - help="Use natural foreign keys if they are available.", - ) - parser.add_argument( - "--natural-primary", - action="store_true", - dest="use_natural_primary_keys", - help="Use natural primary keys if they are available.", - ) - parser.add_argument( - "-a", - "--all", - action="store_true", - dest="use_base_manager", - help=( - "Use Django's base manager to dump all models stored in the database, " - "including those that would otherwise be filtered or modified by a " - "custom manager." - ), - ) - parser.add_argument( - "--pks", - dest="primary_keys", - help="Only dump objects with given primary keys. Accepts a comma-separated " - "list of keys. This option only works when you specify one model.", - ) - parser.add_argument( - "-o", "--output", help="Specifies file to which the output is written." - ) - - def handle(self, *app_labels, **options): - format = options["format"] - indent = options["indent"] - using = options["database"] - excludes = options["exclude"] - output = options["output"] - show_traceback = options["traceback"] - use_natural_foreign_keys = options["use_natural_foreign_keys"] - use_natural_primary_keys = options["use_natural_primary_keys"] - use_base_manager = options["use_base_manager"] - pks = options["primary_keys"] - - if pks: - primary_keys = [pk.strip() for pk in pks.split(",")] - else: - primary_keys = [] - - excluded_models, excluded_apps = parse_apps_and_model_labels(excludes) - - if not app_labels: - if primary_keys: - raise CommandError("You can only use --pks option with one model") - app_list = dict.fromkeys( - app_config - for app_config in apps.get_app_configs() - if app_config.models_module is not None - and app_config not in excluded_apps - ) - else: - if len(app_labels) > 1 and primary_keys: - raise CommandError("You can only use --pks option with one model") - app_list = {} - for label in app_labels: - try: - app_label, model_label = label.split(".") - try: - app_config = apps.get_app_config(app_label) - except LookupError as e: - raise CommandError(str(e)) - if app_config.models_module is None or app_config in excluded_apps: - continue - try: - model = app_config.get_model(model_label) - except LookupError: - raise CommandError( - "Unknown model: %s.%s" % (app_label, model_label) - ) - - app_list_value = app_list.setdefault(app_config, []) - - # We may have previously seen an "all-models" request for - # this app (no model qualifier was given). In this case - # there is no need adding specific models to the list. - if app_list_value is not None and model not in app_list_value: - app_list_value.append(model) - except ValueError: - if primary_keys: - raise CommandError( - "You can only use --pks option with one model" - ) - # This is just an app - no model qualifier - app_label = label - try: - app_config = apps.get_app_config(app_label) - except LookupError as e: - raise CommandError(str(e)) - if app_config.models_module is None or app_config in excluded_apps: - continue - app_list[app_config] = None - - # Check that the serialization format exists; this is a shortcut to - # avoid collating all the objects and _then_ failing. - if format not in serializers.get_public_serializer_formats(): - try: - serializers.get_serializer(format) - except serializers.SerializerDoesNotExist: - pass - - raise CommandError("Unknown serialization format: %s" % format) - - def get_objects(count_only=False): - """ - Collate the objects to be serialized. If count_only is True, just - count the number of objects to be serialized. - """ - if use_natural_foreign_keys: - models = serializers.sort_dependencies( - app_list.items(), allow_cycles=True - ) - else: - # There is no need to sort dependencies when natural foreign - # keys are not used. - models = [] - for app_config, model_list in app_list.items(): - if model_list is None: - models.extend(app_config.get_models()) - else: - models.extend(model_list) - for model in models: - if model in excluded_models: - continue - if model._meta.proxy and model._meta.proxy_for_model not in models: - warnings.warn( - "%s is a proxy model and won't be serialized." - % model._meta.label, - category=ProxyModelWarning, - ) - if not model._meta.proxy and router.allow_migrate_model(using, model): - if use_base_manager: - objects = model._base_manager - else: - objects = model._default_manager - - queryset = objects.using(using).order_by(model._meta.pk.name) - if primary_keys: - queryset = queryset.filter(pk__in=primary_keys) - if count_only: - yield queryset.order_by().count() - else: - chunk_size = ( - 2000 if queryset._prefetch_related_lookups else None - ) - yield from queryset.iterator(chunk_size=chunk_size) - - try: - self.stdout.ending = None - progress_output = None - object_count = 0 - # If dumpdata is outputting to stdout, there is no way to display progress - if output and self.stdout.isatty() and options["verbosity"] > 0: - progress_output = self.stdout - object_count = sum(get_objects(count_only=True)) - if output: - file_root, file_ext = os.path.splitext(output) - compression_formats = { - ".bz2": (open, {}, file_root), - ".gz": (gzip.open, {}, output), - ".lzma": (open, {}, file_root), - ".xz": (open, {}, file_root), - ".zip": (open, {}, file_root), - } - if has_bz2: - compression_formats[".bz2"] = (bz2.open, {}, output) - if has_lzma: - compression_formats[".lzma"] = ( - lzma.open, - {"format": lzma.FORMAT_ALONE}, - output, - ) - compression_formats[".xz"] = (lzma.open, {}, output) - try: - open_method, kwargs, file_path = compression_formats[file_ext] - except KeyError: - open_method, kwargs, file_path = (open, {}, output) - if file_path != output: - file_name = os.path.basename(file_path) - warnings.warn( - f"Unsupported file extension ({file_ext}). " - f"Fixtures saved in '{file_name}'.", - RuntimeWarning, - ) - stream = open_method(file_path, "wt", **kwargs) - else: - stream = None - try: - serializers.serialize( - format, - get_objects(), - indent=indent, - use_natural_foreign_keys=use_natural_foreign_keys, - use_natural_primary_keys=use_natural_primary_keys, - stream=stream or self.stdout, - progress_output=progress_output, - object_count=object_count, - ) - finally: - if stream: - stream.close() - except Exception as e: - if show_traceback: - raise - raise CommandError("Unable to serialize database: %s" % e) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/flush.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/flush.py deleted file mode 100644 index a057393..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/flush.py +++ /dev/null @@ -1,93 +0,0 @@ -from importlib import import_module - -from django.apps import apps -from django.core.management.base import BaseCommand, CommandError -from django.core.management.color import no_style -from django.core.management.sql import emit_post_migrate_signal, sql_flush -from django.db import DEFAULT_DB_ALIAS, connections - - -class Command(BaseCommand): - help = ( - "Removes ALL DATA from the database, including data added during " - 'migrations. Does not achieve a "fresh install" state.' - ) - stealth_options = ("reset_sequences", "allow_cascade", "inhibit_post_migrate") - - def add_arguments(self, parser): - parser.add_argument( - "--noinput", - "--no-input", - action="store_false", - dest="interactive", - help="Tells Django to NOT prompt the user for input of any kind.", - ) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help='Nominates a database to flush. Defaults to the "default" database.', - ) - - def handle(self, **options): - database = options["database"] - connection = connections[database] - verbosity = options["verbosity"] - interactive = options["interactive"] - # The following are stealth options used by Django's internals. - reset_sequences = options.get("reset_sequences", True) - allow_cascade = options.get("allow_cascade", False) - inhibit_post_migrate = options.get("inhibit_post_migrate", False) - - self.style = no_style() - - # Import the 'management' module within each installed app, to register - # dispatcher events. - for app_config in apps.get_app_configs(): - try: - import_module(".management", app_config.name) - except ImportError: - pass - - sql_list = sql_flush( - self.style, - connection, - reset_sequences=reset_sequences, - allow_cascade=allow_cascade, - ) - - if interactive: - confirm = input( - """You have requested a flush of the database. -This will IRREVERSIBLY DESTROY all data currently in the "%s" database, -and return each table to an empty state. -Are you sure you want to do this? - - Type 'yes' to continue, or 'no' to cancel: """ - % connection.settings_dict["NAME"] - ) - else: - confirm = "yes" - - if confirm == "yes": - try: - connection.ops.execute_sql_flush(sql_list) - except Exception as exc: - raise CommandError( - "Database %s couldn't be flushed. Possible reasons:\n" - " * The database isn't running or isn't configured correctly.\n" - " * At least one of the expected database tables doesn't exist.\n" - " * The SQL was invalid.\n" - "Hint: Look at the output of 'django-admin sqlflush'. " - "That's the SQL this command wasn't able to run." - % (connection.settings_dict["NAME"],) - ) from exc - - # Empty sql_list may signify an empty database and post_migrate - # would then crash. - if sql_list and not inhibit_post_migrate: - # Emit the post migrate signal. This allows individual applications to - # respond as if the database had been migrated from scratch. - emit_post_migrate_signal(verbosity, interactive, database) - else: - self.stdout.write("Flush cancelled.") diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/inspectdb.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/inspectdb.py deleted file mode 100644 index 58594fb..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/inspectdb.py +++ /dev/null @@ -1,417 +0,0 @@ -import keyword -import re - -from django.core.management.base import BaseCommand, CommandError -from django.db import DEFAULT_DB_ALIAS, connections -from django.db.models.constants import LOOKUP_SEP - - -class Command(BaseCommand): - help = ( - "Introspects the database tables in the given database and outputs a Django " - "model module." - ) - requires_system_checks = [] - stealth_options = ("table_name_filter",) - db_module = "django.db" - - def add_arguments(self, parser): - parser.add_argument( - "table", - nargs="*", - type=str, - help="Selects what tables or views should be introspected.", - ) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help=( - 'Nominates a database to introspect. Defaults to using the "default" ' - "database." - ), - ) - parser.add_argument( - "--include-partitions", - action="store_true", - help="Also output models for partition tables.", - ) - parser.add_argument( - "--include-views", - action="store_true", - help="Also output models for database views.", - ) - - def handle(self, **options): - try: - for line in self.handle_inspection(options): - self.stdout.write(line) - except NotImplementedError: - raise CommandError( - "Database inspection isn't supported for the currently selected " - "database backend." - ) - - def handle_inspection(self, options): - connection = connections[options["database"]] - # 'table_name_filter' is a stealth option - table_name_filter = options.get("table_name_filter") - - with connection.cursor() as cursor: - yield "# This is an auto-generated Django model module." - yield "# You'll have to do the following manually to clean this up:" - yield "# * Rearrange models' order" - yield "# * Make sure each model has one field with primary_key=True" - yield ( - "# * Make sure each ForeignKey and OneToOneField has `on_delete` set " - "to the desired behavior" - ) - yield ( - "# * Remove `managed = False` lines if you wish to allow " - "Django to create, modify, and delete the table" - ) - yield ( - "# Feel free to rename the models, but don't rename db_table values or " - "field names." - ) - yield "from %s import models" % self.db_module - known_models = [] - # Determine types of tables and/or views to be introspected. - types = {"t"} - if options["include_partitions"]: - types.add("p") - if options["include_views"]: - types.add("v") - table_info = connection.introspection.get_table_list(cursor) - table_info = {info.name: info for info in table_info if info.type in types} - - for table_name in options["table"] or sorted(name for name in table_info): - if table_name_filter is not None and callable(table_name_filter): - if not table_name_filter(table_name): - continue - try: - try: - relations = connection.introspection.get_relations( - cursor, table_name - ) - except NotImplementedError: - relations = {} - try: - constraints = connection.introspection.get_constraints( - cursor, table_name - ) - except NotImplementedError: - constraints = {} - primary_key_columns = ( - connection.introspection.get_primary_key_columns( - cursor, table_name - ) - or [] - ) - primary_key_column = ( - primary_key_columns[0] - if len(primary_key_columns) == 1 - else None - ) - unique_columns = [ - c["columns"][0] - for c in constraints.values() - if c["unique"] and len(c["columns"]) == 1 - ] - table_description = connection.introspection.get_table_description( - cursor, table_name - ) - except Exception as e: - yield "# Unable to inspect table '%s'" % table_name - yield "# The error was: %s" % e - continue - - model_name = self.normalize_table_name(table_name) - yield "" - yield "" - yield "class %s(models.Model):" % model_name - known_models.append(model_name) - - if len(primary_key_columns) > 1: - fields = ", ".join([f"'{col}'" for col in primary_key_columns]) - yield f" pk = models.CompositePrimaryKey({fields})" - - used_column_names = [] # Holds column names used in the table so far - column_to_field_name = {} # Maps column names to names of model fields - used_relations = set() # Holds foreign relations used in the table. - for row in table_description: - comment_notes = ( - [] - ) # Holds Field notes, to be displayed in a Python comment. - extra_params = {} # Holds Field parameters such as 'db_column'. - column_name = row.name - is_relation = column_name in relations - - att_name, params, notes = self.normalize_col_name( - column_name, used_column_names, is_relation - ) - extra_params.update(params) - comment_notes.extend(notes) - - used_column_names.append(att_name) - column_to_field_name[column_name] = att_name - - # Add primary_key and unique, if necessary. - if column_name == primary_key_column: - extra_params["primary_key"] = True - elif column_name in unique_columns: - extra_params["unique"] = True - - if is_relation: - ref_db_column, ref_db_table = relations[column_name] - if extra_params.pop("unique", False) or extra_params.get( - "primary_key" - ): - rel_type = "OneToOneField" - else: - rel_type = "ForeignKey" - ref_pk_column = ( - connection.introspection.get_primary_key_column( - cursor, ref_db_table - ) - ) - if ref_pk_column and ref_pk_column != ref_db_column: - extra_params["to_field"] = ref_db_column - rel_to = ( - "self" - if ref_db_table == table_name - else self.normalize_table_name(ref_db_table) - ) - if rel_to in known_models: - field_type = "%s(%s" % (rel_type, rel_to) - else: - field_type = "%s('%s'" % (rel_type, rel_to) - if rel_to in used_relations: - extra_params["related_name"] = "%s_%s_set" % ( - model_name.lower(), - att_name, - ) - used_relations.add(rel_to) - else: - # Calling `get_field_type` to get the field type string and any - # additional parameters and notes. - field_type, field_params, field_notes = self.get_field_type( - connection, table_name, row - ) - extra_params.update(field_params) - comment_notes.extend(field_notes) - - field_type += "(" - - # Don't output 'id = meta.AutoField(primary_key=True)', because - # that's assumed if it doesn't exist. - if att_name == "id" and extra_params == {"primary_key": True}: - if field_type == "AutoField(": - continue - elif ( - field_type - == connection.features.introspected_field_types["AutoField"] - + "(" - ): - comment_notes.append("AutoField?") - - # Add 'null' and 'blank', if the 'null_ok' flag was present in the - # table description. - if row.null_ok: # If it's NULL... - extra_params["blank"] = True - extra_params["null"] = True - - field_desc = "%s = %s%s" % ( - att_name, - # Custom fields will have a dotted path - "" if "." in field_type else "models.", - field_type, - ) - if field_type.startswith(("ForeignKey(", "OneToOneField(")): - field_desc += ", models.DO_NOTHING" - - # Add comment. - if connection.features.supports_comments and row.comment: - extra_params["db_comment"] = row.comment - - if extra_params: - if not field_desc.endswith("("): - field_desc += ", " - field_desc += ", ".join( - "%s=%r" % (k, v) for k, v in extra_params.items() - ) - field_desc += ")" - if comment_notes: - field_desc += " # " + " ".join(comment_notes) - yield " %s" % field_desc - comment = None - if info := table_info.get(table_name): - is_view = info.type == "v" - is_partition = info.type == "p" - if connection.features.supports_comments: - comment = info.comment - else: - is_view = False - is_partition = False - yield from self.get_meta( - table_name, - constraints, - column_to_field_name, - is_view, - is_partition, - comment, - ) - - def normalize_col_name(self, col_name, used_column_names, is_relation): - """ - Modify the column name to make it Python-compatible as a field name - """ - field_params = {} - field_notes = [] - - new_name = col_name.lower() - if new_name != col_name: - field_notes.append("Field name made lowercase.") - - if is_relation: - if new_name.endswith("_id"): - new_name = new_name.removesuffix("_id") - else: - field_params["db_column"] = col_name - - new_name, num_repl = re.subn(r"\W", "_", new_name) - if num_repl > 0: - field_notes.append("Field renamed to remove unsuitable characters.") - - if new_name.find(LOOKUP_SEP) >= 0: - while new_name.find(LOOKUP_SEP) >= 0: - new_name = new_name.replace(LOOKUP_SEP, "_") - if col_name.lower().find(LOOKUP_SEP) >= 0: - # Only add the comment if the double underscore was in the original name - field_notes.append( - "Field renamed because it contained more than one '_' in a row." - ) - - if new_name.startswith("_"): - new_name = "field%s" % new_name - field_notes.append("Field renamed because it started with '_'.") - - if new_name.endswith("_"): - new_name = "%sfield" % new_name - field_notes.append("Field renamed because it ended with '_'.") - - if keyword.iskeyword(new_name): - new_name += "_field" - field_notes.append("Field renamed because it was a Python reserved word.") - - if new_name[0].isdigit(): - new_name = "number_%s" % new_name - field_notes.append( - "Field renamed because it wasn't a valid Python identifier." - ) - - if new_name in used_column_names: - num = 0 - while "%s_%d" % (new_name, num) in used_column_names: - num += 1 - new_name = "%s_%d" % (new_name, num) - field_notes.append("Field renamed because of name conflict.") - - if col_name != new_name and field_notes: - field_params["db_column"] = col_name - - return new_name, field_params, field_notes - - def normalize_table_name(self, table_name): - """Translate the table name to a Python-compatible model name.""" - return re.sub(r"[^a-zA-Z0-9]", "", table_name.title()) - - def get_field_type(self, connection, table_name, row): - """ - Given the database connection, the table name, and the cursor row - description, this routine will return the given field type name, as - well as any additional keyword parameters and notes for the field. - """ - field_params = {} - field_notes = [] - - try: - field_type = connection.introspection.get_field_type(row.type_code, row) - except KeyError: - field_type = "TextField" - field_notes.append("This field type is a guess.") - - # Add max_length for all CharFields. - if field_type == "CharField" and row.display_size: - if (size := int(row.display_size)) and size > 0: - field_params["max_length"] = size - - if field_type in {"CharField", "TextField"} and row.collation: - field_params["db_collation"] = row.collation - - if field_type == "DecimalField": - if row.precision is None or row.scale is None: - field_notes.append( - "max_digits and decimal_places have been guessed, as this " - "database handles decimal fields as float" - ) - field_params["max_digits"] = ( - row.precision if row.precision is not None else 10 - ) - field_params["decimal_places"] = ( - row.scale if row.scale is not None else 5 - ) - else: - field_params["max_digits"] = row.precision - field_params["decimal_places"] = row.scale - - return field_type, field_params, field_notes - - def get_meta( - self, - table_name, - constraints, - column_to_field_name, - is_view, - is_partition, - comment, - ): - """ - Return a sequence comprising the lines of code necessary - to construct the inner Meta class for the model corresponding - to the given database table name. - """ - unique_together = [] - has_unsupported_constraint = False - for params in constraints.values(): - if params["unique"]: - columns = params["columns"] - if None in columns: - has_unsupported_constraint = True - columns = [ - x for x in columns if x is not None and x in column_to_field_name - ] - if len(columns) > 1: - unique_together.append( - str(tuple(column_to_field_name[c] for c in columns)) - ) - if is_view: - managed_comment = " # Created from a view. Don't remove." - elif is_partition: - managed_comment = " # Created from a partition. Don't remove." - else: - managed_comment = "" - meta = [""] - if has_unsupported_constraint: - meta.append(" # A unique constraint could not be introspected.") - meta += [ - " class Meta:", - " managed = False%s" % managed_comment, - " db_table = %r" % table_name, - ] - if unique_together: - tup = "(" + ", ".join(unique_together) + ",)" - meta += [" unique_together = %s" % tup] - if comment: - meta += [f" db_table_comment = {comment!r}"] - return meta diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/loaddata.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/loaddata.py deleted file mode 100644 index 8c76e52..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/loaddata.py +++ /dev/null @@ -1,433 +0,0 @@ -import functools -import glob -import gzip -import os -import sys -import warnings -import zipfile -from itertools import product - -from django.apps import apps -from django.conf import settings -from django.core import serializers -from django.core.exceptions import ImproperlyConfigured -from django.core.management.base import BaseCommand, CommandError -from django.core.management.color import no_style -from django.core.management.utils import parse_apps_and_model_labels -from django.db import ( - DEFAULT_DB_ALIAS, - DatabaseError, - IntegrityError, - connections, - router, - transaction, -) -from django.utils.functional import cached_property - -try: - import bz2 - - has_bz2 = True -except ImportError: - has_bz2 = False - -try: - import lzma - - has_lzma = True -except ImportError: - has_lzma = False - -READ_STDIN = "-" - - -class Command(BaseCommand): - help = "Installs the named fixture(s) in the database." - missing_args_message = ( - "No database fixture specified. Please provide the path of at least " - "one fixture in the command line." - ) - - def add_arguments(self, parser): - parser.add_argument( - "args", metavar="fixture", nargs="+", help="Fixture labels." - ) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help=( - "Nominates a specific database to load fixtures into. Defaults to the " - '"default" database.' - ), - ) - parser.add_argument( - "--app", - dest="app_label", - help="Only look for fixtures in the specified app.", - ) - parser.add_argument( - "--ignorenonexistent", - "-i", - action="store_true", - dest="ignore", - help="Ignores entries in the serialized data for fields that do not " - "currently exist on the model.", - ) - parser.add_argument( - "-e", - "--exclude", - action="append", - default=[], - help=( - "An app_label or app_label.ModelName to exclude. Can be used multiple " - "times." - ), - ) - parser.add_argument( - "--format", - help="Format of serialized data when reading from stdin.", - ) - - def handle(self, *fixture_labels, **options): - self.ignore = options["ignore"] - self.using = options["database"] - self.app_label = options["app_label"] - self.verbosity = options["verbosity"] - self.excluded_models, self.excluded_apps = parse_apps_and_model_labels( - options["exclude"] - ) - self.format = options["format"] - - with transaction.atomic(using=self.using): - self.loaddata(fixture_labels) - - # Close the DB connection -- unless we're still in a transaction. This - # is required as a workaround for an edge case in MySQL: if the same - # connection is used to create tables, load data, and query, the query - # can return incorrect results. See Django #7572, MySQL #37735. - if transaction.get_autocommit(self.using): - connections[self.using].close() - - @cached_property - def compression_formats(self): - """A dict mapping format names to (open function, mode arg) tuples.""" - # Forcing binary mode may be revisited after dropping Python 2 support - # (see #22399). - compression_formats = { - None: (open, "rb"), - "gz": (gzip.GzipFile, "rb"), - "zip": (SingleZipReader, "r"), - "stdin": (lambda *args: sys.stdin, None), - } - if has_bz2: - compression_formats["bz2"] = (bz2.BZ2File, "r") - if has_lzma: - compression_formats["lzma"] = (lzma.LZMAFile, "r") - compression_formats["xz"] = (lzma.LZMAFile, "r") - return compression_formats - - def reset_sequences(self, connection, models): - """Reset database sequences for the given connection and models.""" - sequence_sql = connection.ops.sequence_reset_sql(no_style(), models) - if sequence_sql: - if self.verbosity >= 2: - self.stdout.write("Resetting sequences") - with connection.cursor() as cursor: - for line in sequence_sql: - cursor.execute(line) - - def loaddata(self, fixture_labels): - connection = connections[self.using] - - # Keep a count of the installed objects and fixtures - self.fixture_count = 0 - self.loaded_object_count = 0 - self.fixture_object_count = 0 - self.models = set() - - self.serialization_formats = serializers.get_public_serializer_formats() - - # Django's test suite repeatedly tries to load initial_data fixtures - # from apps that don't have any fixtures. Because disabling constraint - # checks can be expensive on some database (especially MSSQL), bail - # out early if no fixtures are found. - for fixture_label in fixture_labels: - if self.find_fixtures(fixture_label): - break - else: - return - - self.objs_with_deferred_fields = [] - with connection.constraint_checks_disabled(): - for fixture_label in fixture_labels: - self.load_label(fixture_label) - for obj in self.objs_with_deferred_fields: - obj.save_deferred_fields(using=self.using) - - # Since we disabled constraint checks, we must manually check for - # any invalid keys that might have been added - table_names = [model._meta.db_table for model in self.models] - try: - connection.check_constraints(table_names=table_names) - except Exception as e: - e.args = ("Problem installing fixtures: %s" % e,) - raise - - # If we found even one object in a fixture, we need to reset the - # database sequences. - if self.loaded_object_count > 0: - self.reset_sequences(connection, self.models) - - if self.verbosity >= 1: - if self.fixture_object_count == self.loaded_object_count: - self.stdout.write( - "Installed %d object(s) from %d fixture(s)" - % (self.loaded_object_count, self.fixture_count) - ) - else: - self.stdout.write( - "Installed %d object(s) (of %d) from %d fixture(s)" - % ( - self.loaded_object_count, - self.fixture_object_count, - self.fixture_count, - ) - ) - - def save_obj(self, obj): - """Save an object if permitted.""" - if ( - obj.object._meta.app_config in self.excluded_apps - or type(obj.object) in self.excluded_models - ): - return False - saved = False - if router.allow_migrate_model(self.using, obj.object.__class__): - saved = True - self.models.add(obj.object.__class__) - try: - obj.save(using=self.using) - # psycopg raises ValueError if data contains NUL chars. - except (DatabaseError, IntegrityError, ValueError) as e: - e.args = ( - "Could not load %(object_label)s(pk=%(pk)s): %(error_msg)s" - % { - "object_label": obj.object._meta.label, - "pk": obj.object.pk, - "error_msg": e, - }, - ) - raise - if obj.deferred_fields: - self.objs_with_deferred_fields.append(obj) - return saved - - def load_label(self, fixture_label): - """Load fixtures files for a given label.""" - show_progress = self.verbosity >= 3 - for fixture_file, fixture_dir, fixture_name in self.find_fixtures( - fixture_label - ): - _, ser_fmt, cmp_fmt = self.parse_name(os.path.basename(fixture_file)) - open_method, mode = self.compression_formats[cmp_fmt] - fixture = open_method(fixture_file, mode) - self.fixture_count += 1 - objects_in_fixture = 0 - loaded_objects_in_fixture = 0 - if self.verbosity >= 2: - self.stdout.write( - "Installing %s fixture '%s' from %s." - % (ser_fmt, fixture_name, humanize(fixture_dir)) - ) - try: - objects = serializers.deserialize( - ser_fmt, - fixture, - using=self.using, - ignorenonexistent=self.ignore, - handle_forward_references=True, - ) - - for obj in objects: - objects_in_fixture += 1 - if self.save_obj(obj): - loaded_objects_in_fixture += 1 - if show_progress: - self.stdout.write( - "\rProcessed %i object(s)." % loaded_objects_in_fixture, - ending="", - ) - except Exception as e: - if not isinstance(e, CommandError): - e.args = ( - "Problem installing fixture '%s': %s" % (fixture_file, e), - ) - raise - finally: - fixture.close() - - if objects_in_fixture and show_progress: - self.stdout.write() # Add a newline after progress indicator. - self.loaded_object_count += loaded_objects_in_fixture - self.fixture_object_count += objects_in_fixture - # Warn if the fixture we loaded contains 0 objects. - if objects_in_fixture == 0: - warnings.warn( - "No fixture data found for '%s'. (File format may be " - "invalid.)" % fixture_name, - RuntimeWarning, - ) - - def get_fixture_name_and_dirs(self, fixture_name): - dirname, basename = os.path.split(fixture_name) - if os.path.isabs(fixture_name): - fixture_dirs = [dirname] - else: - fixture_dirs = self.fixture_dirs - if os.path.sep in os.path.normpath(fixture_name): - fixture_dirs = [os.path.join(dir_, dirname) for dir_ in fixture_dirs] - return basename, fixture_dirs - - def get_targets(self, fixture_name, ser_fmt, cmp_fmt): - databases = [self.using, None] - cmp_fmts = self.compression_formats if cmp_fmt is None else [cmp_fmt] - ser_fmts = self.serialization_formats if ser_fmt is None else [ser_fmt] - return { - "%s.%s" - % ( - fixture_name, - ".".join([ext for ext in combo if ext]), - ) - for combo in product(databases, ser_fmts, cmp_fmts) - } - - def find_fixture_files_in_dir(self, fixture_dir, fixture_name, targets): - fixture_files_in_dir = [] - path = os.path.join(fixture_dir, fixture_name) - for candidate in glob.iglob(glob.escape(path) + "*"): - if os.path.basename(candidate) in targets: - # Save the fixture_dir and fixture_name for future error - # messages. - fixture_files_in_dir.append((candidate, fixture_dir, fixture_name)) - return fixture_files_in_dir - - @functools.cache - def find_fixtures(self, fixture_label): - """Find fixture files for a given label.""" - if fixture_label == READ_STDIN: - return [(READ_STDIN, None, READ_STDIN)] - - fixture_name, ser_fmt, cmp_fmt = self.parse_name(fixture_label) - if self.verbosity >= 2: - self.stdout.write("Loading '%s' fixtures..." % fixture_name) - - fixture_name, fixture_dirs = self.get_fixture_name_and_dirs(fixture_name) - targets = self.get_targets(fixture_name, ser_fmt, cmp_fmt) - fixture_files = [] - for fixture_dir in fixture_dirs: - if self.verbosity >= 2: - self.stdout.write("Checking %s for fixtures..." % humanize(fixture_dir)) - fixture_files_in_dir = self.find_fixture_files_in_dir( - fixture_dir, - fixture_name, - targets, - ) - if self.verbosity >= 2 and not fixture_files_in_dir: - self.stdout.write( - "No fixture '%s' in %s." % (fixture_name, humanize(fixture_dir)) - ) - - # Check kept for backwards-compatibility; it isn't clear why - # duplicates are only allowed in different directories. - if len(fixture_files_in_dir) > 1: - raise CommandError( - "Multiple fixtures named '%s' in %s. Aborting." - % (fixture_name, humanize(fixture_dir)) - ) - fixture_files.extend(fixture_files_in_dir) - - if not fixture_files: - raise CommandError("No fixture named '%s' found." % fixture_name) - - return fixture_files - - @cached_property - def fixture_dirs(self): - """ - Return a list of fixture directories. - - The list contains the 'fixtures' subdirectory of each installed - application, if it exists, the directories in FIXTURE_DIRS, and the - current directory. - """ - dirs = [] - fixture_dirs = settings.FIXTURE_DIRS - if len(fixture_dirs) != len(set(fixture_dirs)): - raise ImproperlyConfigured("settings.FIXTURE_DIRS contains duplicates.") - for app_config in apps.get_app_configs(): - app_label = app_config.label - app_dir = os.path.join(app_config.path, "fixtures") - if app_dir in [str(d) for d in fixture_dirs]: - raise ImproperlyConfigured( - "'%s' is a default fixture directory for the '%s' app " - "and cannot be listed in settings.FIXTURE_DIRS." - % (app_dir, app_label) - ) - - if self.app_label and app_label != self.app_label: - continue - if os.path.isdir(app_dir): - dirs.append(app_dir) - dirs.extend(fixture_dirs) - dirs.append("") - return [os.path.realpath(d) for d in dirs] - - def parse_name(self, fixture_name): - """ - Split fixture name in name, serialization format, compression format. - """ - if fixture_name == READ_STDIN: - if not self.format: - raise CommandError( - "--format must be specified when reading from stdin." - ) - return READ_STDIN, self.format, "stdin" - - parts = fixture_name.rsplit(".", 2) - - if len(parts) > 1 and parts[-1] in self.compression_formats: - cmp_fmt = parts[-1] - parts = parts[:-1] - else: - cmp_fmt = None - - if len(parts) > 1: - if parts[-1] in self.serialization_formats: - ser_fmt = parts[-1] - parts = parts[:-1] - else: - raise CommandError( - "Problem installing fixture '%s': %s is not a known " - "serialization format." % (".".join(parts[:-1]), parts[-1]) - ) - else: - ser_fmt = None - - name = ".".join(parts) - - return name, ser_fmt, cmp_fmt - - -class SingleZipReader(zipfile.ZipFile): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - if len(self.namelist()) != 1: - raise ValueError("Zip-compressed fixtures must contain one file.") - - def read(self): - return zipfile.ZipFile.read(self, self.namelist()[0]) - - -def humanize(dirname): - return "'%s'" % dirname if dirname else "absolute path" diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/makemessages.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/makemessages.py deleted file mode 100644 index 23ad424..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/makemessages.py +++ /dev/null @@ -1,769 +0,0 @@ -import glob -import os -import re -import sys -from functools import total_ordering -from itertools import dropwhile -from pathlib import Path - -import django -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.core.files.temp import NamedTemporaryFile -from django.core.management.base import BaseCommand, CommandError -from django.core.management.utils import ( - find_command, - handle_extensions, - is_ignored_path, - popen_wrapper, -) -from django.utils.encoding import DEFAULT_LOCALE_ENCODING -from django.utils.functional import cached_property -from django.utils.regex_helper import _lazy_re_compile -from django.utils.text import get_text_list -from django.utils.translation import templatize - -plural_forms_re = _lazy_re_compile( - r'^(?P"Plural-Forms.+?\\n")\s*$', re.MULTILINE | re.DOTALL -) -STATUS_OK = 0 -NO_LOCALE_DIR = object() - - -def check_programs(*programs): - for program in programs: - if find_command(program) is None: - raise CommandError( - f"Can't find {program}. Make sure you have GNU gettext tools " - "0.19 or newer installed." - ) - - -def is_valid_locale(locale): - return re.match(r"^[a-z]+$", locale) or re.match(r"^[a-z]+_[A-Z0-9].*$", locale) - - -@total_ordering -class TranslatableFile: - def __init__(self, dirpath, file_name, locale_dir): - self.file = file_name - self.dirpath = dirpath - self.locale_dir = locale_dir - - def __repr__(self): - return "<%s: %s>" % ( - self.__class__.__name__, - os.sep.join([self.dirpath, self.file]), - ) - - def __eq__(self, other): - return self.path == other.path - - def __lt__(self, other): - return self.path < other.path - - @property - def path(self): - return os.path.join(self.dirpath, self.file) - - -class BuildFile: - """ - Represent the state of a translatable file during the build process. - """ - - def __init__(self, command, domain, translatable): - self.command = command - self.domain = domain - self.translatable = translatable - - @cached_property - def is_templatized(self): - if self.domain == "django": - file_ext = os.path.splitext(self.translatable.file)[1] - return file_ext != ".py" - return False - - @cached_property - def path(self): - return self.translatable.path - - @cached_property - def work_path(self): - """ - Path to a file which is being fed into GNU gettext pipeline. This may - be either a translatable or its preprocessed version. - """ - if not self.is_templatized: - return self.path - filename = f"{self.translatable.file}.py" - return os.path.join(self.translatable.dirpath, filename) - - def preprocess(self): - """ - Preprocess (if necessary) a translatable file before passing it to - xgettext GNU gettext utility. - """ - if not self.is_templatized: - return - - with open(self.path, encoding="utf-8") as fp: - src_data = fp.read() - - if self.domain == "django": - content = templatize(src_data, origin=self.path[2:]) - - with open(self.work_path, "w", encoding="utf-8") as fp: - fp.write(content) - - def postprocess_messages(self, msgs): - """ - Postprocess messages generated by xgettext GNU gettext utility. - - Transform paths as if these messages were generated from original - translatable files rather than from preprocessed versions. - """ - if not self.is_templatized: - return msgs - - # Remove '.py' suffix - if os.name == "nt": - # Preserve '.\' prefix on Windows to respect gettext behavior - old_path = self.work_path - new_path = self.path - else: - old_path = self.work_path[2:] - new_path = self.path[2:] - - return re.sub( - r"^(#: .*)(" + re.escape(old_path) + r")", - lambda match: match[0].replace(old_path, new_path), - msgs, - flags=re.MULTILINE, - ) - - def cleanup(self): - """ - Remove a preprocessed copy of a translatable file (if any). - """ - if self.is_templatized: - # This check is needed for the case of a symlinked file and its - # source being processed inside a single group (locale dir); - # removing either of those two removes both. - if os.path.exists(self.work_path): - os.unlink(self.work_path) - - -def normalize_eols(raw_contents): - """ - Take a block of raw text that will be passed through str.splitlines() to - get universal newlines treatment. - - Return the resulting block of text with normalized `\n` EOL sequences ready - to be written to disk using current platform's native EOLs. - """ - lines_list = raw_contents.splitlines() - # Ensure last line has its EOL - if lines_list and lines_list[-1]: - lines_list.append("") - return "\n".join(lines_list) - - -def write_pot_file(potfile, msgs): - """ - Write the `potfile` with the `msgs` contents, making sure its format is - valid. - """ - pot_lines = msgs.splitlines() - if os.path.exists(potfile): - # Strip the header - lines = dropwhile(len, pot_lines) - else: - lines = [] - found, header_read = False, False - for line in pot_lines: - if not found and not header_read: - if "charset=CHARSET" in line: - found = True - line = line.replace("charset=CHARSET", "charset=UTF-8") - if not line and not found: - header_read = True - lines.append(line) - msgs = "\n".join(lines) - # Force newlines of POT files to '\n' to work around - # https://savannah.gnu.org/bugs/index.php?52395 - with open(potfile, "a", encoding="utf-8", newline="\n") as fp: - fp.write(msgs) - - -class Command(BaseCommand): - help = ( - "Runs over the entire source tree of the current directory and pulls out all " - "strings marked for translation. It creates (or updates) a message file in the " - "conf/locale (in the django tree) or locale (for projects and applications) " - "directory.\n\nYou must run this command with one of either the --locale, " - "--exclude, or --all options." - ) - - translatable_file_class = TranslatableFile - build_file_class = BuildFile - - requires_system_checks = [] - - msgmerge_options = ["-q", "--backup=none", "--previous", "--update"] - msguniq_options = ["--to-code=utf-8"] - msgattrib_options = ["--no-obsolete"] - xgettext_options = ["--from-code=UTF-8", "--add-comments=Translators"] - - def add_arguments(self, parser): - parser.add_argument( - "--locale", - "-l", - default=[], - action="append", - help=( - "Creates or updates the message files for the given locale(s) (e.g. " - "pt_BR). Can be used multiple times." - ), - ) - parser.add_argument( - "--exclude", - "-x", - default=[], - action="append", - help="Locales to exclude. Default is none. Can be used multiple times.", - ) - parser.add_argument( - "--domain", - "-d", - default="django", - help='The domain of the message files (default: "django").', - ) - parser.add_argument( - "--all", - "-a", - action="store_true", - help="Updates the message files for all existing locales.", - ) - parser.add_argument( - "--extension", - "-e", - dest="extensions", - action="append", - help='The file extension(s) to examine (default: "html,txt,py", or "js" ' - 'if the domain is "djangojs"). Separate multiple extensions with ' - "commas, or use -e multiple times.", - ) - parser.add_argument( - "--symlinks", - "-s", - action="store_true", - help="Follows symlinks to directories when examining source code " - "and templates for translation strings.", - ) - parser.add_argument( - "--ignore", - "-i", - action="append", - dest="ignore_patterns", - default=[], - metavar="PATTERN", - help="Ignore files or directories matching this glob-style pattern. " - "Use multiple times to ignore more.", - ) - parser.add_argument( - "--no-default-ignore", - action="store_false", - dest="use_default_ignore_patterns", - help=( - "Don't ignore the common glob-style patterns 'CVS', '.*', '*~' and " - "'*.pyc'." - ), - ) - parser.add_argument( - "--no-wrap", - action="store_true", - help="Don't break long message lines into several lines.", - ) - parser.add_argument( - "--no-location", - action="store_true", - help="Don't write '#: filename:line' lines.", - ) - parser.add_argument( - "--add-location", - choices=("full", "file", "never"), - const="full", - nargs="?", - help=( - "Controls '#: filename:line' lines. If the option is 'full' " - "(the default if not given), the lines include both file name " - "and line number. If it's 'file', the line number is omitted. If " - "it's 'never', the lines are suppressed (same as --no-location). " - "--add-location requires gettext 0.19 or newer." - ), - ) - parser.add_argument( - "--no-obsolete", - action="store_true", - help="Remove obsolete message strings.", - ) - parser.add_argument( - "--keep-pot", - action="store_true", - help="Keep .pot file after making messages. Useful when debugging.", - ) - - def handle(self, *args, **options): - locale = options["locale"] - exclude = options["exclude"] - self.domain = options["domain"] - self.verbosity = options["verbosity"] - process_all = options["all"] - extensions = options["extensions"] - self.symlinks = options["symlinks"] - - ignore_patterns = options["ignore_patterns"] - if options["use_default_ignore_patterns"]: - ignore_patterns += ["CVS", ".*", "*~", "*.pyc"] - self.ignore_patterns = list(set(ignore_patterns)) - - # Avoid messing with mutable class variables - if options["no_wrap"]: - self.msgmerge_options = self.msgmerge_options[:] + ["--no-wrap"] - self.msguniq_options = self.msguniq_options[:] + ["--no-wrap"] - self.msgattrib_options = self.msgattrib_options[:] + ["--no-wrap"] - self.xgettext_options = self.xgettext_options[:] + ["--no-wrap"] - if options["no_location"]: - self.msgmerge_options = self.msgmerge_options[:] + ["--no-location"] - self.msguniq_options = self.msguniq_options[:] + ["--no-location"] - self.msgattrib_options = self.msgattrib_options[:] + ["--no-location"] - self.xgettext_options = self.xgettext_options[:] + ["--no-location"] - if options["add_location"]: - arg_add_location = "--add-location=%s" % options["add_location"] - self.msgmerge_options = self.msgmerge_options[:] + [arg_add_location] - self.msguniq_options = self.msguniq_options[:] + [arg_add_location] - self.msgattrib_options = self.msgattrib_options[:] + [arg_add_location] - self.xgettext_options = self.xgettext_options[:] + [arg_add_location] - - self.no_obsolete = options["no_obsolete"] - self.keep_pot = options["keep_pot"] - - if self.domain not in ("django", "djangojs"): - raise CommandError( - "currently makemessages only supports domains " - "'django' and 'djangojs'" - ) - if self.domain == "djangojs": - exts = extensions or ["js"] - else: - exts = extensions or ["html", "txt", "py"] - self.extensions = handle_extensions(exts) - - if (not locale and not exclude and not process_all) or self.domain is None: - raise CommandError( - "Type '%s help %s' for usage information." - % (os.path.basename(sys.argv[0]), sys.argv[1]) - ) - - if self.verbosity > 1: - self.stdout.write( - "examining files with the extensions: %s" - % get_text_list(list(self.extensions), "and") - ) - - self.invoked_for_django = False - self.locale_paths = [] - self.default_locale_path = None - if os.path.isdir(os.path.join("conf", "locale")): - self.locale_paths = [os.path.abspath(os.path.join("conf", "locale"))] - self.default_locale_path = self.locale_paths[0] - self.ignore_patterns.append("views/templates/i18n_catalog.js") - self.invoked_for_django = True - else: - if self.settings_available: - self.locale_paths.extend(settings.LOCALE_PATHS) - # Allow to run makemessages inside an app dir - if os.path.isdir("locale"): - self.locale_paths.append(os.path.abspath("locale")) - if self.locale_paths: - self.default_locale_path = self.locale_paths[0] - os.makedirs(self.default_locale_path, exist_ok=True) - - # Build locale list - looks_like_locale = re.compile(r"[a-z]{2}") - locale_dirs = filter( - os.path.isdir, glob.glob("%s/*" % self.default_locale_path) - ) - all_locales = [ - lang_code - for lang_code in map(os.path.basename, locale_dirs) - if looks_like_locale.match(lang_code) - ] - - # Account for excluded locales - if process_all: - locales = all_locales - else: - locales = locale or all_locales - locales = set(locales).difference(exclude) - - if locales: - check_programs("msguniq", "msgmerge", "msgattrib") - - check_programs("xgettext") - - try: - potfiles = self.build_potfiles() - - # Build po files for each selected locale - for locale in locales: - if not is_valid_locale(locale): - # Try to guess what valid locale it could be - # Valid examples are: en_GB, shi_Latn_MA and nl_NL-x-informal - - # Search for characters followed by a non character (i.e. separator) - match = re.match( - r"^(?P[a-zA-Z]+)" - r"(?P[^a-zA-Z])" - r"(?P.+)$", - locale, - ) - if match: - locale_parts = match.groupdict() - language = locale_parts["language"].lower() - territory = ( - locale_parts["territory"][:2].upper() - + locale_parts["territory"][2:] - ) - proposed_locale = f"{language}_{territory}" - else: - # It could be a language in uppercase - proposed_locale = locale.lower() - - # Recheck if the proposed locale is valid - if is_valid_locale(proposed_locale): - self.stdout.write( - "invalid locale %s, did you mean %s?" - % ( - locale, - proposed_locale, - ), - ) - else: - self.stdout.write("invalid locale %s" % locale) - - continue - if self.verbosity > 0: - self.stdout.write("processing locale %s" % locale) - for potfile in potfiles: - self.write_po_file(potfile, locale) - finally: - if not self.keep_pot: - self.remove_potfiles() - - @cached_property - def gettext_version(self): - # Gettext tools will output system-encoded bytestrings instead of UTF-8, - # when looking up the version. It's especially a problem on Windows. - out, err, status = popen_wrapper( - ["xgettext", "--version"], - stdout_encoding=DEFAULT_LOCALE_ENCODING, - ) - m = re.search(r"(\d+)\.(\d+)\.?(\d+)?", out) - if m: - return tuple(int(d) for d in m.groups() if d is not None) - else: - raise CommandError("Unable to get gettext version. Is it installed?") - - @cached_property - def settings_available(self): - try: - settings.LOCALE_PATHS - except ImproperlyConfigured: - if self.verbosity > 1: - self.stderr.write("Running without configured settings.") - return False - return True - - def build_potfiles(self): - """ - Build pot files and apply msguniq to them. - """ - file_list = self.find_files(".") - self.remove_potfiles() - self.process_files(file_list) - potfiles = [] - for path in self.locale_paths: - potfile = os.path.join(path, "%s.pot" % self.domain) - if not os.path.exists(potfile): - continue - args = ["msguniq"] + self.msguniq_options + [potfile] - msgs, errors, status = popen_wrapper(args) - if errors: - if status != STATUS_OK: - raise CommandError( - "errors happened while running msguniq\n%s" % errors - ) - elif self.verbosity > 0: - self.stdout.write(errors) - msgs = normalize_eols(msgs) - with open(potfile, "w", encoding="utf-8") as fp: - fp.write(msgs) - potfiles.append(potfile) - return potfiles - - def remove_potfiles(self): - for path in self.locale_paths: - pot_path = os.path.join(path, "%s.pot" % self.domain) - if os.path.exists(pot_path): - os.unlink(pot_path) - - def find_files(self, root): - """ - Get all files in the given root. Also check that there is a matching - locale dir for each file. - """ - all_files = [] - ignored_roots = [] - if self.settings_available: - ignored_roots = [ - os.path.normpath(p) - for p in (settings.MEDIA_ROOT, settings.STATIC_ROOT) - if p - ] - for dirpath, dirnames, filenames in os.walk( - root, topdown=True, followlinks=self.symlinks - ): - for dirname in dirnames[:]: - if ( - is_ignored_path( - os.path.normpath(os.path.join(dirpath, dirname)), - self.ignore_patterns, - ) - or os.path.join(os.path.abspath(dirpath), dirname) in ignored_roots - ): - dirnames.remove(dirname) - if self.verbosity > 1: - self.stdout.write("ignoring directory %s" % dirname) - elif dirname == "locale": - dirnames.remove(dirname) - self.locale_paths.insert( - 0, os.path.join(os.path.abspath(dirpath), dirname) - ) - for filename in filenames: - file_path = os.path.normpath(os.path.join(dirpath, filename)) - file_ext = os.path.splitext(filename)[1] - if file_ext not in self.extensions or is_ignored_path( - file_path, self.ignore_patterns - ): - if self.verbosity > 1: - self.stdout.write( - "ignoring file %s in %s" % (filename, dirpath) - ) - else: - locale_dir = None - for path in self.locale_paths: - if os.path.abspath(dirpath).startswith(os.path.dirname(path)): - locale_dir = path - break - locale_dir = locale_dir or self.default_locale_path or NO_LOCALE_DIR - all_files.append( - self.translatable_file_class(dirpath, filename, locale_dir) - ) - return sorted(all_files) - - def process_files(self, file_list): - """ - Group translatable files by locale directory and run pot file build - process for each group. - """ - file_groups = {} - for translatable in file_list: - file_group = file_groups.setdefault(translatable.locale_dir, []) - file_group.append(translatable) - for locale_dir, files in file_groups.items(): - self.process_locale_dir(locale_dir, files) - - def process_locale_dir(self, locale_dir, files): - """ - Extract translatable literals from the specified files, creating or - updating the POT file for a given locale directory. - - Use the xgettext GNU gettext utility. - """ - build_files = [] - for translatable in files: - if self.verbosity > 1: - self.stdout.write( - "processing file %s in %s" - % (translatable.file, translatable.dirpath) - ) - if self.domain not in ("djangojs", "django"): - continue - build_file = self.build_file_class(self, self.domain, translatable) - try: - build_file.preprocess() - except UnicodeDecodeError as e: - self.stdout.write( - "UnicodeDecodeError: skipped file %s in %s (reason: %s)" - % ( - translatable.file, - translatable.dirpath, - e, - ) - ) - continue - except BaseException: - # Cleanup before exit. - for build_file in build_files: - build_file.cleanup() - raise - build_files.append(build_file) - - if self.domain == "djangojs": - args = [ - "xgettext", - "-d", - self.domain, - "--language=JavaScript", - "--keyword=gettext_noop", - "--keyword=gettext_lazy", - "--keyword=ngettext_lazy:1,2", - "--keyword=pgettext:1c,2", - "--keyword=npgettext:1c,2,3", - "--output=-", - ] - elif self.domain == "django": - args = [ - "xgettext", - "-d", - self.domain, - "--language=Python", - "--keyword=gettext_noop", - "--keyword=gettext_lazy", - "--keyword=ngettext_lazy:1,2", - "--keyword=pgettext:1c,2", - "--keyword=npgettext:1c,2,3", - "--keyword=pgettext_lazy:1c,2", - "--keyword=npgettext_lazy:1c,2,3", - "--output=-", - ] - else: - return - - input_files = [bf.work_path for bf in build_files] - with NamedTemporaryFile(mode="w+") as input_files_list: - input_files_list.write("\n".join(input_files)) - input_files_list.flush() - args.extend(["--files-from", input_files_list.name]) - args.extend(self.xgettext_options) - msgs, errors, status = popen_wrapper(args) - - if errors: - if status != STATUS_OK: - for build_file in build_files: - build_file.cleanup() - raise CommandError( - "errors happened while running xgettext on %s\n%s" - % ("\n".join(input_files), errors) - ) - elif self.verbosity > 0: - # Print warnings - self.stdout.write(errors) - - if msgs: - if locale_dir is NO_LOCALE_DIR: - for build_file in build_files: - build_file.cleanup() - file_path = os.path.normpath(build_files[0].path) - raise CommandError( - "Unable to find a locale path to store translations for " - "file %s. Make sure the 'locale' directory exists in an " - "app or LOCALE_PATHS setting is set." % file_path - ) - for build_file in build_files: - msgs = build_file.postprocess_messages(msgs) - potfile = os.path.join(locale_dir, "%s.pot" % self.domain) - write_pot_file(potfile, msgs) - - for build_file in build_files: - build_file.cleanup() - - def write_po_file(self, potfile, locale): - """ - Create or update the PO file for self.domain and `locale`. - Use contents of the existing `potfile`. - - Use msgmerge and msgattrib GNU gettext utilities. - """ - basedir = os.path.join(os.path.dirname(potfile), locale, "LC_MESSAGES") - os.makedirs(basedir, exist_ok=True) - pofile = os.path.join(basedir, "%s.po" % self.domain) - - if os.path.exists(pofile): - args = ["msgmerge"] + self.msgmerge_options + [pofile, potfile] - _, errors, status = popen_wrapper(args) - if errors: - if status != STATUS_OK: - raise CommandError( - "errors happened while running msgmerge\n%s" % errors - ) - elif self.verbosity > 0: - self.stdout.write(errors) - msgs = Path(pofile).read_text(encoding="utf-8") - else: - with open(potfile, encoding="utf-8") as fp: - msgs = fp.read() - if not self.invoked_for_django: - msgs = self.copy_plural_forms(msgs, locale) - msgs = normalize_eols(msgs) - msgs = msgs.replace( - "#. #-#-#-#-# %s.pot (PACKAGE VERSION) #-#-#-#-#\n" % self.domain, "" - ) - with open(pofile, "w", encoding="utf-8") as fp: - fp.write(msgs) - - if self.no_obsolete: - args = ["msgattrib"] + self.msgattrib_options + ["-o", pofile, pofile] - msgs, errors, status = popen_wrapper(args) - if errors: - if status != STATUS_OK: - raise CommandError( - "errors happened while running msgattrib\n%s" % errors - ) - elif self.verbosity > 0: - self.stdout.write(errors) - - def copy_plural_forms(self, msgs, locale): - """ - Copy plural forms header contents from a Django catalog of locale to - the msgs string, inserting it at the right place. msgs should be the - contents of a newly created .po file. - """ - django_dir = os.path.normpath(os.path.join(os.path.dirname(django.__file__))) - if self.domain == "djangojs": - domains = ("djangojs", "django") - else: - domains = ("django",) - for domain in domains: - django_po = os.path.join( - django_dir, "conf", "locale", locale, "LC_MESSAGES", "%s.po" % domain - ) - if os.path.exists(django_po): - with open(django_po, encoding="utf-8") as fp: - m = plural_forms_re.search(fp.read()) - if m: - plural_form_line = m["value"] - if self.verbosity > 1: - self.stdout.write("copying plural forms: %s" % plural_form_line) - lines = [] - found = False - for line in msgs.splitlines(): - if not found and (not line or plural_forms_re.search(line)): - line = plural_form_line - found = True - lines.append(line) - msgs = "\n".join(lines) - break - return msgs diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/makemigrations.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/makemigrations.py deleted file mode 100644 index 690d0e5..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/makemigrations.py +++ /dev/null @@ -1,516 +0,0 @@ -import os -import sys -import warnings -from itertools import takewhile - -from django.apps import apps -from django.conf import settings -from django.core.management.base import BaseCommand, CommandError, no_translations -from django.core.management.utils import run_formatters -from django.db import DEFAULT_DB_ALIAS, OperationalError, connections, router -from django.db.migrations import Migration -from django.db.migrations.autodetector import MigrationAutodetector -from django.db.migrations.loader import MigrationLoader -from django.db.migrations.migration import SwappableTuple -from django.db.migrations.optimizer import MigrationOptimizer -from django.db.migrations.questioner import ( - InteractiveMigrationQuestioner, - MigrationQuestioner, - NonInteractiveMigrationQuestioner, -) -from django.db.migrations.state import ProjectState -from django.db.migrations.utils import get_migration_name_timestamp -from django.db.migrations.writer import MigrationWriter - - -class Command(BaseCommand): - autodetector = MigrationAutodetector - help = "Creates new migration(s) for apps." - - def add_arguments(self, parser): - parser.add_argument( - "args", - metavar="app_label", - nargs="*", - help="Specify the app label(s) to create migrations for.", - ) - parser.add_argument( - "--dry-run", - action="store_true", - help="Just show what migrations would be made; don't actually write them.", - ) - parser.add_argument( - "--merge", - action="store_true", - help="Enable fixing of migration conflicts.", - ) - parser.add_argument( - "--empty", - action="store_true", - help="Create an empty migration.", - ) - parser.add_argument( - "--noinput", - "--no-input", - action="store_false", - dest="interactive", - help="Tells Django to NOT prompt the user for input of any kind.", - ) - parser.add_argument( - "-n", - "--name", - help="Use this name for migration file(s).", - ) - parser.add_argument( - "--no-header", - action="store_false", - dest="include_header", - help="Do not add header comments to new migration file(s).", - ) - parser.add_argument( - "--check", - action="store_true", - dest="check_changes", - help=( - "Exit with a non-zero status if model changes are missing migrations " - "and don't actually write them. Implies --dry-run." - ), - ) - parser.add_argument( - "--scriptable", - action="store_true", - dest="scriptable", - help=( - "Divert log output and input prompts to stderr, writing only " - "paths of generated migration files to stdout." - ), - ) - parser.add_argument( - "--update", - action="store_true", - dest="update", - help=( - "Merge model changes into the latest migration and optimize the " - "resulting operations." - ), - ) - - @property - def log_output(self): - return self.stderr if self.scriptable else self.stdout - - def log(self, msg): - self.log_output.write(msg) - - @no_translations - def handle(self, *app_labels, **options): - self.written_files = [] - self.verbosity = options["verbosity"] - self.interactive = options["interactive"] - self.dry_run = options["dry_run"] - self.merge = options["merge"] - self.empty = options["empty"] - self.migration_name = options["name"] - if self.migration_name and not self.migration_name.isidentifier(): - raise CommandError("The migration name must be a valid Python identifier.") - self.include_header = options["include_header"] - check_changes = options["check_changes"] - if check_changes: - self.dry_run = True - self.scriptable = options["scriptable"] - self.update = options["update"] - # If logs and prompts are diverted to stderr, remove the ERROR style. - if self.scriptable: - self.stderr.style_func = None - - # Make sure the app they asked for exists - app_labels = set(app_labels) - has_bad_labels = False - for app_label in app_labels: - try: - apps.get_app_config(app_label) - except LookupError as err: - self.stderr.write(str(err)) - has_bad_labels = True - if has_bad_labels: - sys.exit(2) - - # Load the current graph state. Pass in None for the connection so - # the loader doesn't try to resolve replaced migrations from DB. - loader = MigrationLoader(None, ignore_no_migrations=True) - - # Raise an error if any migrations are applied before their dependencies. - consistency_check_labels = {config.label for config in apps.get_app_configs()} - # Non-default databases are only checked if database routers used. - aliases_to_check = ( - connections if settings.DATABASE_ROUTERS else [DEFAULT_DB_ALIAS] - ) - for alias in sorted(aliases_to_check): - connection = connections[alias] - if connection.settings_dict["ENGINE"] != "django.db.backends.dummy" and any( - # At least one model must be migrated to the database. - router.allow_migrate( - connection.alias, app_label, model_name=model._meta.object_name - ) - for app_label in consistency_check_labels - for model in apps.get_app_config(app_label).get_models() - ): - try: - loader.check_consistent_history(connection) - except OperationalError as error: - warnings.warn( - "Got an error checking a consistent migration history " - "performed for database connection '%s': %s" % (alias, error), - RuntimeWarning, - ) - # Before anything else, see if there's conflicting apps and drop out - # hard if there are any and they don't want to merge - conflicts = loader.detect_conflicts() - - # If app_labels is specified, filter out conflicting migrations for - # unspecified apps. - if app_labels: - conflicts = { - app_label: conflict - for app_label, conflict in conflicts.items() - if app_label in app_labels - } - - if conflicts and not self.merge: - name_str = "; ".join( - "%s in %s" % (", ".join(names), app) for app, names in conflicts.items() - ) - raise CommandError( - "Conflicting migrations detected; multiple leaf nodes in the " - "migration graph: (%s).\nTo fix them run " - "'python manage.py makemigrations --merge'" % name_str - ) - - # If they want to merge and there's nothing to merge, then politely exit - if self.merge and not conflicts: - self.log("No conflicts detected to merge.") - return - - # If they want to merge and there is something to merge, then - # divert into the merge code - if self.merge and conflicts: - return self.handle_merge(loader, conflicts) - - if self.interactive: - questioner = InteractiveMigrationQuestioner( - specified_apps=app_labels, - dry_run=self.dry_run, - prompt_output=self.log_output, - ) - else: - questioner = NonInteractiveMigrationQuestioner( - specified_apps=app_labels, - dry_run=self.dry_run, - verbosity=self.verbosity, - log=self.log, - ) - # Set up autodetector - autodetector = self.autodetector( - loader.project_state(), - ProjectState.from_apps(apps), - questioner, - ) - - # If they want to make an empty migration, make one for each app - if self.empty: - if not app_labels: - raise CommandError( - "You must supply at least one app label when using --empty." - ) - # Make a fake changes() result we can pass to arrange_for_graph - changes = {app: [Migration("custom", app)] for app in app_labels} - changes = autodetector.arrange_for_graph( - changes=changes, - graph=loader.graph, - migration_name=self.migration_name, - ) - self.write_migration_files(changes) - return - - # Detect changes - changes = autodetector.changes( - graph=loader.graph, - trim_to_apps=app_labels or None, - convert_apps=app_labels or None, - migration_name=self.migration_name, - ) - - if not changes: - # No changes? Tell them. - if self.verbosity >= 1: - if app_labels: - if len(app_labels) == 1: - self.log("No changes detected in app '%s'" % app_labels.pop()) - else: - self.log( - "No changes detected in apps '%s'" - % ("', '".join(app_labels)) - ) - else: - self.log("No changes detected") - else: - if self.update: - self.write_to_last_migration_files(changes) - else: - self.write_migration_files(changes) - if check_changes: - sys.exit(1) - - def write_to_last_migration_files(self, changes): - loader = MigrationLoader(connections[DEFAULT_DB_ALIAS]) - new_changes = {} - update_previous_migration_paths = {} - for app_label, app_migrations in changes.items(): - # Find last migration. - leaf_migration_nodes = loader.graph.leaf_nodes(app=app_label) - if len(leaf_migration_nodes) == 0: - raise CommandError( - f"App {app_label} has no migration, cannot update last migration." - ) - leaf_migration_node = leaf_migration_nodes[0] - # Multiple leaf nodes have already been checked earlier in command. - leaf_migration = loader.graph.nodes[leaf_migration_node] - # Updated migration cannot be a squash migration, a dependency of - # another migration, and cannot be already applied. - if leaf_migration.replaces: - raise CommandError( - f"Cannot update squash migration '{leaf_migration}'." - ) - if leaf_migration_node in loader.applied_migrations: - raise CommandError( - f"Cannot update applied migration '{leaf_migration}'." - ) - depending_migrations = [ - migration - for migration in loader.disk_migrations.values() - if leaf_migration_node in migration.dependencies - ] - if depending_migrations: - formatted_migrations = ", ".join( - [f"'{migration}'" for migration in depending_migrations] - ) - raise CommandError( - f"Cannot update migration '{leaf_migration}' that migrations " - f"{formatted_migrations} depend on." - ) - # Build new migration. - for migration in app_migrations: - leaf_migration.operations.extend(migration.operations) - - for dependency in migration.dependencies: - if isinstance(dependency, SwappableTuple): - if settings.AUTH_USER_MODEL == dependency.setting: - leaf_migration.dependencies.append( - ("__setting__", "AUTH_USER_MODEL") - ) - else: - leaf_migration.dependencies.append(dependency) - elif dependency[0] != migration.app_label: - leaf_migration.dependencies.append(dependency) - # Optimize migration. - optimizer = MigrationOptimizer() - leaf_migration.operations = optimizer.optimize( - leaf_migration.operations, app_label - ) - # Update name. - previous_migration_path = MigrationWriter(leaf_migration).path - name_fragment = self.migration_name or leaf_migration.suggest_name() - suggested_name = leaf_migration.name[:4] + f"_{name_fragment}" - if leaf_migration.name == suggested_name: - new_name = leaf_migration.name + "_updated" - else: - new_name = suggested_name - leaf_migration.name = new_name - # Register overridden migration. - new_changes[app_label] = [leaf_migration] - update_previous_migration_paths[app_label] = previous_migration_path - - self.write_migration_files(new_changes, update_previous_migration_paths) - - def write_migration_files(self, changes, update_previous_migration_paths=None): - """ - Take a changes dict and write them out as migration files. - """ - directory_created = {} - for app_label, app_migrations in changes.items(): - if self.verbosity >= 1: - self.log(self.style.MIGRATE_HEADING("Migrations for '%s':" % app_label)) - for migration in app_migrations: - # Describe the migration - writer = MigrationWriter(migration, self.include_header) - if self.verbosity >= 1: - # Display a relative path if it's below the current working - # directory, or an absolute path otherwise. - migration_string = self.get_relative_path(writer.path) - self.log(" %s\n" % self.style.MIGRATE_LABEL(migration_string)) - for operation in migration.operations: - self.log(" %s" % operation.formatted_description()) - if self.scriptable: - self.stdout.write(migration_string) - if not self.dry_run: - # Write the migrations file to the disk. - migrations_directory = os.path.dirname(writer.path) - if not directory_created.get(app_label): - os.makedirs(migrations_directory, exist_ok=True) - init_path = os.path.join(migrations_directory, "__init__.py") - if not os.path.isfile(init_path): - open(init_path, "w").close() - # We just do this once per app - directory_created[app_label] = True - migration_string = writer.as_string() - with open(writer.path, "w", encoding="utf-8") as fh: - fh.write(migration_string) - self.written_files.append(writer.path) - if update_previous_migration_paths: - prev_path = update_previous_migration_paths[app_label] - rel_prev_path = self.get_relative_path(prev_path) - if writer.needs_manual_porting: - migration_path = self.get_relative_path(writer.path) - self.log( - self.style.WARNING( - f"Updated migration {migration_path} requires " - f"manual porting.\n" - f"Previous migration {rel_prev_path} was kept and " - f"must be deleted after porting functions manually." - ) - ) - else: - os.remove(prev_path) - self.log(f"Deleted {rel_prev_path}") - elif self.verbosity == 3: - # Alternatively, makemigrations --dry-run --verbosity 3 - # will log the migrations rather than saving the file to - # the disk. - self.log( - self.style.MIGRATE_HEADING( - "Full migrations file '%s':" % writer.filename - ) - ) - self.log(writer.as_string()) - run_formatters(self.written_files, stderr=self.stderr) - - @staticmethod - def get_relative_path(path): - try: - migration_string = os.path.relpath(path) - except ValueError: - migration_string = path - if migration_string.startswith(".."): - migration_string = path - return migration_string - - def handle_merge(self, loader, conflicts): - """ - Handles merging together conflicted migrations interactively, - if it's safe; otherwise, advises on how to fix it. - """ - if self.interactive: - questioner = InteractiveMigrationQuestioner(prompt_output=self.log_output) - else: - questioner = MigrationQuestioner(defaults={"ask_merge": True}) - - for app_label, migration_names in conflicts.items(): - # Grab out the migrations in question, and work out their - # common ancestor. - merge_migrations = [] - for migration_name in migration_names: - migration = loader.get_migration(app_label, migration_name) - migration.ancestry = [ - mig - for mig in loader.graph.forwards_plan((app_label, migration_name)) - if mig[0] == migration.app_label - ] - merge_migrations.append(migration) - - def all_items_equal(seq): - return all(item == seq[0] for item in seq[1:]) - - merge_migrations_generations = zip(*(m.ancestry for m in merge_migrations)) - common_ancestor_count = sum( - 1 - for common_ancestor_generation in takewhile( - all_items_equal, merge_migrations_generations - ) - ) - if not common_ancestor_count: - raise ValueError( - "Could not find common ancestor of %s" % migration_names - ) - # Now work out the operations along each divergent branch - for migration in merge_migrations: - migration.branch = migration.ancestry[common_ancestor_count:] - migrations_ops = ( - loader.get_migration(node_app, node_name).operations - for node_app, node_name in migration.branch - ) - migration.merged_operations = sum(migrations_ops, []) - # In future, this could use some of the Optimizer code - # (can_optimize_through) to automatically see if they're - # mergeable. For now, we always just prompt the user. - if self.verbosity > 0: - self.log(self.style.MIGRATE_HEADING("Merging %s" % app_label)) - for migration in merge_migrations: - self.log(self.style.MIGRATE_LABEL(" Branch %s" % migration.name)) - for operation in migration.merged_operations: - self.log(" %s" % operation.formatted_description()) - if questioner.ask_merge(app_label): - # If they still want to merge it, then write out an empty - # file depending on the migrations needing merging. - numbers = [ - self.autodetector.parse_number(migration.name) - for migration in merge_migrations - ] - try: - biggest_number = max(x for x in numbers if x is not None) - except ValueError: - biggest_number = 1 - subclass = type( - "Migration", - (Migration,), - { - "dependencies": [ - (app_label, migration.name) - for migration in merge_migrations - ], - }, - ) - parts = ["%04i" % (biggest_number + 1)] - if self.migration_name: - parts.append(self.migration_name) - else: - parts.append("merge") - leaf_names = "_".join( - sorted(migration.name for migration in merge_migrations) - ) - if len(leaf_names) > 47: - parts.append(get_migration_name_timestamp()) - else: - parts.append(leaf_names) - migration_name = "_".join(parts) - new_migration = subclass(migration_name, app_label) - writer = MigrationWriter(new_migration, self.include_header) - - if not self.dry_run: - # Write the merge migrations file to the disk - with open(writer.path, "w", encoding="utf-8") as fh: - fh.write(writer.as_string()) - run_formatters([writer.path], stderr=self.stderr) - if self.verbosity > 0: - self.log("\nCreated new merge migration %s" % writer.path) - if self.scriptable: - self.stdout.write(writer.path) - elif self.verbosity == 3: - # Alternatively, makemigrations --merge --dry-run --verbosity 3 - # will log the merge migrations rather than saving the file - # to the disk. - self.log( - self.style.MIGRATE_HEADING( - "Full merge migrations file '%s':" % writer.filename - ) - ) - self.log(writer.as_string()) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/migrate.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/migrate.py deleted file mode 100644 index 4ef6e1a..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/migrate.py +++ /dev/null @@ -1,508 +0,0 @@ -import sys -import time -from importlib import import_module - -from django.apps import apps -from django.core.management.base import BaseCommand, CommandError, no_translations -from django.core.management.sql import emit_post_migrate_signal, emit_pre_migrate_signal -from django.db import DEFAULT_DB_ALIAS, connections, router -from django.db.migrations.autodetector import MigrationAutodetector -from django.db.migrations.executor import MigrationExecutor -from django.db.migrations.loader import AmbiguityError -from django.db.migrations.state import ModelState, ProjectState -from django.utils.module_loading import module_has_submodule -from django.utils.text import Truncator - - -class Command(BaseCommand): - autodetector = MigrationAutodetector - help = ( - "Updates database schema. Manages both apps with migrations and those without." - ) - - def add_arguments(self, parser): - parser.add_argument( - "app_label", - nargs="?", - help="App label of an application to synchronize the state.", - ) - parser.add_argument( - "migration_name", - nargs="?", - help="Database state will be brought to the state after that " - 'migration. Use the name "zero" to unapply all migrations.', - ) - parser.add_argument( - "--noinput", - "--no-input", - action="store_false", - dest="interactive", - help="Tells Django to NOT prompt the user for input of any kind.", - ) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help=( - 'Nominates a database to synchronize. Defaults to the "default" ' - "database." - ), - ) - parser.add_argument( - "--fake", - action="store_true", - help="Mark migrations as run without actually running them.", - ) - parser.add_argument( - "--fake-initial", - action="store_true", - help=( - "Detect if tables already exist and fake-apply initial migrations if " - "so. Make sure that the current database schema matches your initial " - "migration before using this flag. Django will only check for an " - "existing table name." - ), - ) - parser.add_argument( - "--plan", - action="store_true", - help="Shows a list of the migration actions that will be performed.", - ) - parser.add_argument( - "--run-syncdb", - action="store_true", - help="Creates tables for apps without migrations.", - ) - parser.add_argument( - "--check", - action="store_true", - dest="check_unapplied", - help=( - "Exits with a non-zero status if unapplied migrations exist and does " - "not actually apply migrations." - ), - ) - parser.add_argument( - "--prune", - action="store_true", - dest="prune", - help="Delete nonexistent migrations from the django_migrations table.", - ) - - def get_check_kwargs(self, options): - kwargs = super().get_check_kwargs(options) - return {**kwargs, "databases": [options["database"]]} - - @no_translations - def handle(self, *args, **options): - database = options["database"] - self.verbosity = options["verbosity"] - self.interactive = options["interactive"] - - # Import the 'management' module within each installed app, to register - # dispatcher events. - for app_config in apps.get_app_configs(): - if module_has_submodule(app_config.module, "management"): - import_module(".management", app_config.name) - - # Get the database we're operating from - connection = connections[database] - - # Hook for backends needing any database preparation - connection.prepare_database() - # Work out which apps have migrations and which do not - executor = MigrationExecutor(connection, self.migration_progress_callback) - - # Raise an error if any migrations are applied before their dependencies. - executor.loader.check_consistent_history(connection) - - # Before anything else, see if there's conflicting apps and drop out - # hard if there are any - conflicts = executor.loader.detect_conflicts() - if conflicts: - name_str = "; ".join( - "%s in %s" % (", ".join(names), app) for app, names in conflicts.items() - ) - raise CommandError( - "Conflicting migrations detected; multiple leaf nodes in the " - "migration graph: (%s).\nTo fix them run " - "'python manage.py makemigrations --merge'" % name_str - ) - - # If they supplied command line arguments, work out what they mean. - run_syncdb = options["run_syncdb"] - target_app_labels_only = True - if options["app_label"]: - # Validate app_label. - app_label = options["app_label"] - try: - apps.get_app_config(app_label) - except LookupError as err: - raise CommandError(str(err)) - if run_syncdb: - if app_label in executor.loader.migrated_apps: - raise CommandError( - "Can't use run_syncdb with app '%s' as it has migrations." - % app_label - ) - elif app_label not in executor.loader.migrated_apps: - raise CommandError("App '%s' does not have migrations." % app_label) - - if options["app_label"] and options["migration_name"]: - migration_name = options["migration_name"] - if migration_name == "zero": - targets = [(app_label, None)] - else: - try: - migration = executor.loader.get_migration_by_prefix( - app_label, migration_name - ) - except AmbiguityError: - raise CommandError( - "More than one migration matches '%s' in app '%s'. " - "Please be more specific." % (migration_name, app_label) - ) - except KeyError: - raise CommandError( - "Cannot find a migration matching '%s' from app '%s'." - % (migration_name, app_label) - ) - target = (app_label, migration.name) - # Partially applied squashed migrations are not included in the - # graph, use the last replacement instead. - if ( - target not in executor.loader.graph.nodes - and target in executor.loader.replacements - ): - incomplete_migration = executor.loader.replacements[target] - target = incomplete_migration.replaces[-1] - targets = [target] - target_app_labels_only = False - elif options["app_label"]: - targets = [ - key for key in executor.loader.graph.leaf_nodes() if key[0] == app_label - ] - else: - targets = executor.loader.graph.leaf_nodes() - - if options["prune"]: - if not options["app_label"]: - raise CommandError( - "Migrations can be pruned only when an app is specified." - ) - if self.verbosity > 0: - self.stdout.write("Pruning migrations:", self.style.MIGRATE_HEADING) - to_prune = sorted( - migration - for migration in set(executor.loader.applied_migrations) - - set(executor.loader.disk_migrations) - if migration[0] == app_label - ) - squashed_migrations_with_deleted_replaced_migrations = [ - migration_key - for migration_key, migration_obj in executor.loader.replacements.items() - if any(replaced in to_prune for replaced in migration_obj.replaces) - ] - if squashed_migrations_with_deleted_replaced_migrations: - self.stdout.write( - self.style.NOTICE( - " Cannot use --prune because the following squashed " - "migrations have their 'replaces' attributes and may not " - "be recorded as applied:" - ) - ) - for migration in squashed_migrations_with_deleted_replaced_migrations: - app, name = migration - self.stdout.write(f" {app}.{name}") - self.stdout.write( - self.style.NOTICE( - " Re-run 'manage.py migrate' if they are not marked as " - "applied, and remove 'replaces' attributes in their " - "Migration classes." - ) - ) - else: - if to_prune: - for migration in to_prune: - app, name = migration - if self.verbosity > 0: - self.stdout.write( - self.style.MIGRATE_LABEL(f" Pruning {app}.{name}"), - ending="", - ) - executor.recorder.record_unapplied(app, name) - if self.verbosity > 0: - self.stdout.write(self.style.SUCCESS(" OK")) - elif self.verbosity > 0: - self.stdout.write(" No migrations to prune.") - - plan = executor.migration_plan(targets) - - if options["plan"]: - self.stdout.write("Planned operations:", self.style.MIGRATE_LABEL) - if not plan: - self.stdout.write(" No planned migration operations.") - else: - for migration, backwards in plan: - self.stdout.write(str(migration), self.style.MIGRATE_HEADING) - for operation in migration.operations: - message, is_error = self.describe_operation( - operation, backwards - ) - style = self.style.WARNING if is_error else None - self.stdout.write(" " + message, style) - if options["check_unapplied"]: - sys.exit(1) - return - if options["check_unapplied"]: - if plan: - sys.exit(1) - return - if options["prune"]: - return - - # At this point, ignore run_syncdb if there aren't any apps to sync. - run_syncdb = options["run_syncdb"] and executor.loader.unmigrated_apps - # Print some useful info - if self.verbosity >= 1: - self.stdout.write(self.style.MIGRATE_HEADING("Operations to perform:")) - if run_syncdb: - if options["app_label"]: - self.stdout.write( - self.style.MIGRATE_LABEL( - " Synchronize unmigrated app: %s" % app_label - ) - ) - else: - self.stdout.write( - self.style.MIGRATE_LABEL(" Synchronize unmigrated apps: ") - + (", ".join(sorted(executor.loader.unmigrated_apps))) - ) - if target_app_labels_only: - self.stdout.write( - self.style.MIGRATE_LABEL(" Apply all migrations: ") - + (", ".join(sorted({a for a, n in targets})) or "(none)") - ) - else: - if targets[0][1] is None: - self.stdout.write( - self.style.MIGRATE_LABEL(" Unapply all migrations: ") - + str(targets[0][0]) - ) - else: - self.stdout.write( - self.style.MIGRATE_LABEL(" Target specific migration: ") - + "%s, from %s" % (targets[0][1], targets[0][0]) - ) - - pre_migrate_state = executor._create_project_state(with_applied_migrations=True) - pre_migrate_apps = pre_migrate_state.apps - emit_pre_migrate_signal( - self.verbosity, - self.interactive, - connection.alias, - stdout=self.stdout, - apps=pre_migrate_apps, - plan=plan, - ) - - # Run the syncdb phase. - if run_syncdb: - if self.verbosity >= 1: - self.stdout.write( - self.style.MIGRATE_HEADING("Synchronizing apps without migrations:") - ) - if options["app_label"]: - self.sync_apps(connection, [app_label]) - else: - self.sync_apps(connection, executor.loader.unmigrated_apps) - - # Migrate! - if self.verbosity >= 1: - self.stdout.write(self.style.MIGRATE_HEADING("Running migrations:")) - if not plan: - if self.verbosity >= 1: - self.stdout.write(" No migrations to apply.") - # If there's changes that aren't in migrations yet, tell them - # how to fix it. - autodetector = self.autodetector( - executor.loader.project_state(), - ProjectState.from_apps(apps), - ) - changes = autodetector.changes(graph=executor.loader.graph) - if changes: - self.stdout.write( - self.style.NOTICE( - " Your models in app(s): %s have changes that are not " - "yet reflected in a migration, and so won't be " - "applied." % ", ".join(repr(app) for app in sorted(changes)) - ) - ) - self.stdout.write( - self.style.NOTICE( - " Run 'manage.py makemigrations' to make new " - "migrations, and then re-run 'manage.py migrate' to " - "apply them." - ) - ) - fake = False - fake_initial = False - else: - fake = options["fake"] - fake_initial = options["fake_initial"] - post_migrate_state = executor.migrate( - targets, - plan=plan, - state=pre_migrate_state.clone(), - fake=fake, - fake_initial=fake_initial, - ) - # post_migrate signals have access to all models. Ensure that all models - # are reloaded in case any are delayed. - post_migrate_state.clear_delayed_apps_cache() - post_migrate_apps = post_migrate_state.apps - - # Re-render models of real apps to include relationships now that - # we've got a final state. This wouldn't be necessary if real apps - # models were rendered with relationships in the first place. - with post_migrate_apps.bulk_update(): - model_keys = [] - for model_state in post_migrate_apps.real_models: - model_key = model_state.app_label, model_state.name_lower - model_keys.append(model_key) - post_migrate_apps.unregister_model(*model_key) - post_migrate_apps.render_multiple( - [ModelState.from_model(apps.get_model(*model)) for model in model_keys] - ) - - # Send the post_migrate signal, so individual apps can do whatever they need - # to do at this point. - emit_post_migrate_signal( - self.verbosity, - self.interactive, - connection.alias, - stdout=self.stdout, - apps=post_migrate_apps, - plan=plan, - ) - - def migration_progress_callback(self, action, migration=None, fake=False): - if self.verbosity >= 1: - compute_time = self.verbosity > 1 - if action == "apply_start": - if compute_time: - self.start = time.monotonic() - self.stdout.write(" Applying %s..." % migration, ending="") - self.stdout.flush() - elif action == "apply_success": - elapsed = ( - " (%.3fs)" % (time.monotonic() - self.start) if compute_time else "" - ) - if fake: - self.stdout.write(self.style.SUCCESS(" FAKED" + elapsed)) - else: - self.stdout.write(self.style.SUCCESS(" OK" + elapsed)) - elif action == "unapply_start": - if compute_time: - self.start = time.monotonic() - self.stdout.write(" Unapplying %s..." % migration, ending="") - self.stdout.flush() - elif action == "unapply_success": - elapsed = ( - " (%.3fs)" % (time.monotonic() - self.start) if compute_time else "" - ) - if fake: - self.stdout.write(self.style.SUCCESS(" FAKED" + elapsed)) - else: - self.stdout.write(self.style.SUCCESS(" OK" + elapsed)) - elif action == "render_start": - if compute_time: - self.start = time.monotonic() - self.stdout.write(" Rendering model states...", ending="") - self.stdout.flush() - elif action == "render_success": - elapsed = ( - " (%.3fs)" % (time.monotonic() - self.start) if compute_time else "" - ) - self.stdout.write(self.style.SUCCESS(" DONE" + elapsed)) - - def sync_apps(self, connection, app_labels): - """Run the old syncdb-style operation on a list of app_labels.""" - with connection.cursor() as cursor: - tables = connection.introspection.table_names(cursor) - - # Build the manifest of apps and models that are to be synchronized. - all_models = [ - ( - app_config.label, - router.get_migratable_models( - app_config, connection.alias, include_auto_created=False - ), - ) - for app_config in apps.get_app_configs() - if app_config.models_module is not None and app_config.label in app_labels - ] - - def model_installed(model): - opts = model._meta - converter = connection.introspection.identifier_converter - return not ( - (converter(opts.db_table) in tables) - or ( - opts.auto_created - and converter(opts.auto_created._meta.db_table) in tables - ) - ) - - manifest = { - app_name: list(filter(model_installed, model_list)) - for app_name, model_list in all_models - } - - # Create the tables for each model - if self.verbosity >= 1: - self.stdout.write(" Creating tables...") - with connection.schema_editor() as editor: - for app_name, model_list in manifest.items(): - for model in model_list: - # Never install unmanaged models, etc. - if not model._meta.can_migrate(connection): - continue - if self.verbosity >= 3: - self.stdout.write( - " Processing %s.%s model" - % (app_name, model._meta.object_name) - ) - if self.verbosity >= 1: - self.stdout.write( - " Creating table %s" % model._meta.db_table - ) - editor.create_model(model) - - # Deferred SQL is executed when exiting the editor's context. - if self.verbosity >= 1: - self.stdout.write(" Running deferred SQL...") - - @staticmethod - def describe_operation(operation, backwards): - """Return a string that describes a migration operation for --plan.""" - prefix = "" - is_error = False - if hasattr(operation, "code"): - code = operation.reverse_code if backwards else operation.code - action = (code.__doc__ or "") if code else None - elif hasattr(operation, "sql"): - action = operation.reverse_sql if backwards else operation.sql - else: - action = "" - if backwards: - prefix = "Undo " - if action is not None: - action = str(action).replace("\n", "") - elif backwards: - action = "IRREVERSIBLE" - is_error = True - if action: - action = " -> " + action - truncated = Truncator(action) - return prefix + operation.describe() + truncated.chars(40), is_error diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/optimizemigration.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/optimizemigration.py deleted file mode 100644 index 90db2d2..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/optimizemigration.py +++ /dev/null @@ -1,129 +0,0 @@ -import shutil -import sys - -from django.apps import apps -from django.core.management.base import BaseCommand, CommandError -from django.core.management.utils import run_formatters -from django.db import migrations -from django.db.migrations.exceptions import AmbiguityError -from django.db.migrations.loader import MigrationLoader -from django.db.migrations.optimizer import MigrationOptimizer -from django.db.migrations.writer import MigrationWriter -from django.utils.version import get_docs_version - - -class Command(BaseCommand): - help = "Optimizes the operations for the named migration." - - def add_arguments(self, parser): - parser.add_argument( - "app_label", - help="App label of the application to optimize the migration for.", - ) - parser.add_argument( - "migration_name", help="Migration name to optimize the operations for." - ) - parser.add_argument( - "--check", - action="store_true", - help="Exit with a non-zero status if the migration can be optimized.", - ) - - def handle(self, *args, **options): - verbosity = options["verbosity"] - app_label = options["app_label"] - migration_name = options["migration_name"] - check = options["check"] - - # Validate app_label. - try: - apps.get_app_config(app_label) - except LookupError as err: - raise CommandError(str(err)) - - # Load the current graph state. - loader = MigrationLoader(None) - if app_label not in loader.migrated_apps: - raise CommandError(f"App '{app_label}' does not have migrations.") - # Find a migration. - try: - migration = loader.get_migration_by_prefix(app_label, migration_name) - except AmbiguityError: - raise CommandError( - f"More than one migration matches '{migration_name}' in app " - f"'{app_label}'. Please be more specific." - ) - except KeyError: - raise CommandError( - f"Cannot find a migration matching '{migration_name}' from app " - f"'{app_label}'." - ) - - # Optimize the migration. - optimizer = MigrationOptimizer() - new_operations = optimizer.optimize(migration.operations, migration.app_label) - if len(migration.operations) == len(new_operations): - if verbosity > 0: - self.stdout.write("No optimizations possible.") - return - else: - if verbosity > 0: - self.stdout.write( - "Optimizing from %d operations to %d operations." - % (len(migration.operations), len(new_operations)) - ) - if check: - sys.exit(1) - - # Set the new migration optimizations. - migration.operations = new_operations - - # Write out the optimized migration file. - writer = MigrationWriter(migration) - migration_file_string = writer.as_string() - if writer.needs_manual_porting: - if migration.replaces: - raise CommandError( - "Migration will require manual porting but is already a squashed " - "migration.\nTransition to a normal migration first: " - "https://docs.djangoproject.com/en/%s/topics/migrations/" - "#squashing-migrations" % get_docs_version() - ) - # Make a new migration with those operations. - subclass = type( - "Migration", - (migrations.Migration,), - { - "dependencies": migration.dependencies, - "operations": new_operations, - "replaces": [(migration.app_label, migration.name)], - }, - ) - optimized_migration_name = "%s_optimized" % migration.name - optimized_migration = subclass(optimized_migration_name, app_label) - writer = MigrationWriter(optimized_migration) - migration_file_string = writer.as_string() - if verbosity > 0: - self.stdout.write( - self.style.MIGRATE_HEADING("Manual porting required") + "\n" - " Your migrations contained functions that must be manually " - "copied over,\n" - " as we could not safely copy their implementation.\n" - " See the comment at the top of the optimized migration for " - "details." - ) - if shutil.which("black"): - self.stdout.write( - self.style.WARNING( - "Optimized migration couldn't be formatted using the " - '"black" command. You can call it manually.' - ) - ) - with open(writer.path, "w", encoding="utf-8") as fh: - fh.write(migration_file_string) - run_formatters([writer.path], stderr=self.stderr) - - if verbosity > 0: - self.stdout.write( - self.style.MIGRATE_HEADING(f"Optimized migration {writer.path}") - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/runserver.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/runserver.py deleted file mode 100644 index 0cf841b..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/runserver.py +++ /dev/null @@ -1,201 +0,0 @@ -import errno -import os -import re -import socket -import sys -from datetime import datetime - -from django.conf import settings -from django.core.management.base import BaseCommand, CommandError -from django.core.servers.basehttp import WSGIServer, get_internal_wsgi_application, run -from django.db import connections -from django.utils import autoreload -from django.utils.regex_helper import _lazy_re_compile -from django.utils.version import get_docs_version - -naiveip_re = _lazy_re_compile( - r"""^(?: -(?P - (?P\d{1,3}(?:\.\d{1,3}){3}) | # IPv4 address - (?P\[[a-fA-F0-9:]+\]) | # IPv6 address - (?P[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*) # FQDN -):)?(?P\d+)$""", - re.X, -) - - -class Command(BaseCommand): - help = "Starts a lightweight web server for development." - - stealth_options = ("shutdown_message",) - suppressed_base_arguments = {"--verbosity", "--traceback"} - - default_addr = "127.0.0.1" - default_addr_ipv6 = "::1" - default_port = "8000" - protocol = "http" - server_cls = WSGIServer - - def add_arguments(self, parser): - parser.add_argument( - "addrport", nargs="?", help="Optional port number, or ipaddr:port" - ) - parser.add_argument( - "--ipv6", - "-6", - action="store_true", - dest="use_ipv6", - help="Tells Django to use an IPv6 address.", - ) - parser.add_argument( - "--nothreading", - action="store_false", - dest="use_threading", - help="Tells Django to NOT use threading.", - ) - parser.add_argument( - "--noreload", - action="store_false", - dest="use_reloader", - help="Tells Django to NOT use the auto-reloader.", - ) - - def execute(self, *args, **options): - if options["no_color"]: - # We rely on the environment because it's currently the only - # way to reach WSGIRequestHandler. This seems an acceptable - # compromise considering `runserver` runs indefinitely. - os.environ["DJANGO_COLORS"] = "nocolor" - super().execute(*args, **options) - - def get_handler(self, *args, **options): - """Return the default WSGI handler for the runner.""" - return get_internal_wsgi_application() - - def get_check_kwargs(self, options): - """Validation is called explicitly each time the server reloads.""" - return {"tags": set()} - - def handle(self, *args, **options): - if not settings.DEBUG and not settings.ALLOWED_HOSTS: - raise CommandError("You must set settings.ALLOWED_HOSTS if DEBUG is False.") - - self.use_ipv6 = options["use_ipv6"] - if self.use_ipv6 and not socket.has_ipv6: - raise CommandError("Your Python does not support IPv6.") - self._raw_ipv6 = False - if not options["addrport"]: - self.addr = "" - self.port = self.default_port - else: - m = re.match(naiveip_re, options["addrport"]) - if m is None: - raise CommandError( - '"%s" is not a valid port number ' - "or address:port pair." % options["addrport"] - ) - self.addr, _ipv4, _ipv6, _fqdn, self.port = m.groups() - if not self.port.isdigit(): - raise CommandError("%r is not a valid port number." % self.port) - if self.addr: - if _ipv6: - self.addr = self.addr[1:-1] - self.use_ipv6 = True - self._raw_ipv6 = True - elif self.use_ipv6 and not _fqdn: - raise CommandError('"%s" is not a valid IPv6 address.' % self.addr) - if not self.addr: - self.addr = self.default_addr_ipv6 if self.use_ipv6 else self.default_addr - self._raw_ipv6 = self.use_ipv6 - self.run(**options) - - def run(self, **options): - """Run the server, using the autoreloader if needed.""" - use_reloader = options["use_reloader"] - - if use_reloader: - autoreload.run_with_reloader(self.inner_run, **options) - else: - self.inner_run(None, **options) - - def inner_run(self, *args, **options): - # If an exception was silenced in ManagementUtility.execute in order - # to be raised in the child process, raise it now. - autoreload.raise_last_exception() - - threading = options["use_threading"] - # 'shutdown_message' is a stealth option. - shutdown_message = options.get("shutdown_message", "") - - if not options["skip_checks"]: - self.stdout.write("Performing system checks...\n\n") - check_kwargs = super().get_check_kwargs(options) - check_kwargs["display_num_errors"] = True - self.check(**check_kwargs) - # Need to check migrations here, so can't use the - # requires_migrations_check attribute. - self.check_migrations() - # Close all connections opened during migration checking. - for conn in connections.all(initialized_only=True): - conn.close() - - try: - handler = self.get_handler(*args, **options) - run( - self.addr, - int(self.port), - handler, - ipv6=self.use_ipv6, - threading=threading, - on_bind=self.on_bind, - server_cls=self.server_cls, - ) - except OSError as e: - # Use helpful error messages instead of ugly tracebacks. - ERRORS = { - errno.EACCES: "You don't have permission to access that port.", - errno.EADDRINUSE: "That port is already in use.", - errno.EADDRNOTAVAIL: "That IP address can't be assigned to.", - } - try: - error_text = ERRORS[e.errno] - except KeyError: - error_text = e - self.stderr.write("Error: %s" % error_text) - # Need to use an OS exit because sys.exit doesn't work in a thread - os._exit(1) - except KeyboardInterrupt: - if shutdown_message: - self.stdout.write(shutdown_message) - sys.exit(0) - - def on_bind(self, server_port): - quit_command = "CTRL-BREAK" if sys.platform == "win32" else "CONTROL-C" - - if self._raw_ipv6: - addr = f"[{self.addr}]" - elif self.addr == "0": - addr = "0.0.0.0" - else: - addr = self.addr - - now = datetime.now().strftime("%B %d, %Y - %X") - version = self.get_version() - print( - f"{now}\n" - f"Django version {version}, using settings {settings.SETTINGS_MODULE!r}\n" - f"Starting development server at {self.protocol}://{addr}:{server_port}/\n" - f"Quit the server with {quit_command}.", - file=self.stdout, - ) - docs_version = get_docs_version() - if os.environ.get("DJANGO_RUNSERVER_HIDE_WARNING") != "true": - self.stdout.write( - self.style.WARNING( - "WARNING: This is a development server. Do not use it in a " - "production setting. Use a production WSGI or ASGI server " - "instead.\nFor more information on production servers see: " - f"https://docs.djangoproject.com/en/{docs_version}/howto/" - "deployment/" - ) - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/sendtestemail.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/sendtestemail.py deleted file mode 100644 index fbb2a78..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/sendtestemail.py +++ /dev/null @@ -1,46 +0,0 @@ -import socket - -from django.core.mail import mail_admins, mail_managers, send_mail -from django.core.management.base import BaseCommand -from django.utils import timezone - - -class Command(BaseCommand): - help = "Sends a test email to the email addresses specified as arguments." - missing_args_message = ( - "You must specify some email recipients, or pass the --managers or --admin " - "options." - ) - - def add_arguments(self, parser): - parser.add_argument( - "email", - nargs="*", - help="One or more email addresses to send a test email to.", - ) - parser.add_argument( - "--managers", - action="store_true", - help="Send a test email to the addresses specified in settings.MANAGERS.", - ) - parser.add_argument( - "--admins", - action="store_true", - help="Send a test email to the addresses specified in settings.ADMINS.", - ) - - def handle(self, *args, **kwargs): - subject = "Test email from %s on %s" % (socket.gethostname(), timezone.now()) - - send_mail( - subject=subject, - message="If you're reading this, it was successful.", - from_email=None, - recipient_list=kwargs["email"], - ) - - if kwargs["managers"]: - mail_managers(subject, "This email was sent to the site managers.") - - if kwargs["admins"]: - mail_admins(subject, "This email was sent to the site admins.") diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/shell.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/shell.py deleted file mode 100644 index 132e7f8..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/shell.py +++ /dev/null @@ -1,269 +0,0 @@ -import os -import select -import sys -import traceback -from collections import defaultdict -from importlib import import_module - -from django.apps import apps -from django.core.exceptions import AppRegistryNotReady -from django.core.management import BaseCommand, CommandError -from django.utils.datastructures import OrderedSet -from django.utils.module_loading import import_string as import_dotted_path - - -class Command(BaseCommand): - help = ( - "Runs a Python interactive interpreter. Tries to use IPython or " - "bpython, if one of them is available. Any standard input is executed " - "as code." - ) - - requires_system_checks = [] - shells = ["ipython", "bpython", "python"] - - def add_arguments(self, parser): - parser.add_argument( - "--no-startup", - action="store_true", - help=( - "When using plain Python, ignore the PYTHONSTARTUP environment " - "variable and ~/.pythonrc.py script." - ), - ) - parser.add_argument( - "--no-imports", - action="store_true", - help="Disable automatic imports of models.", - ) - parser.add_argument( - "-i", - "--interface", - choices=self.shells, - help=( - "Specify an interactive interpreter interface. Available options: " - '"ipython", "bpython", and "python"' - ), - ) - parser.add_argument( - "-c", - "--command", - help=( - "Instead of opening an interactive shell, run a command as Django and " - "exit." - ), - ) - - def ipython(self, options): - from IPython import start_ipython - - start_ipython(argv=[], user_ns=self.get_namespace(**options)) - - def bpython(self, options): - import bpython - - bpython.embed(self.get_namespace(**options)) - - def python(self, options): - import code - - # Set up a dictionary to serve as the environment for the shell. - imported_objects = self.get_namespace(**options) - - # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system - # conventions and get $PYTHONSTARTUP first then .pythonrc.py. - if not options["no_startup"]: - for pythonrc in OrderedSet( - [os.environ.get("PYTHONSTARTUP"), os.path.expanduser("~/.pythonrc.py")] - ): - if not pythonrc: - continue - if not os.path.isfile(pythonrc): - continue - with open(pythonrc) as handle: - pythonrc_code = handle.read() - # Match the behavior of the cpython shell where an error in - # PYTHONSTARTUP prints an exception and continues. - try: - exec(compile(pythonrc_code, pythonrc, "exec"), imported_objects) - except Exception: - traceback.print_exc() - - # By default, this will set up readline to do tab completion and to read and - # write history to the .python_history file, but this can be overridden by - # $PYTHONSTARTUP or ~/.pythonrc.py. - try: - hook = sys.__interactivehook__ - except AttributeError: - # Match the behavior of the cpython shell where a missing - # sys.__interactivehook__ is ignored. - pass - else: - try: - hook() - except Exception: - # Match the behavior of the cpython shell where an error in - # sys.__interactivehook__ prints a warning and the exception - # and continues. - print("Failed calling sys.__interactivehook__") - traceback.print_exc() - - # Set up tab completion for objects imported by $PYTHONSTARTUP or - # ~/.pythonrc.py. - try: - import readline - import rlcompleter - - readline.set_completer(rlcompleter.Completer(imported_objects).complete) - except ImportError: - pass - - # Start the interactive interpreter. - code.interact(local=imported_objects) - - def get_auto_imports(self): - """Return a sequence of import paths for objects to be auto-imported. - - By default, import paths for models in INSTALLED_APPS are included, - with models from earlier apps taking precedence in case of a name - collision. - - For example, for an unchanged INSTALLED_APPS, this method returns: - - [ - "django.contrib.sessions.models.Session", - "django.contrib.contenttypes.models.ContentType", - "django.contrib.auth.models.User", - "django.contrib.auth.models.Group", - "django.contrib.auth.models.Permission", - "django.contrib.admin.models.LogEntry", - ] - - """ - app_models_imports = [ - f"{model.__module__}.{model.__name__}" - for model in reversed(apps.get_models()) - if model.__module__ - ] - return app_models_imports - - def get_namespace(self, **options): - if options and options.get("no_imports"): - return {} - - verbosity = options["verbosity"] if options else 0 - - try: - apps.check_models_ready() - except AppRegistryNotReady: - if verbosity > 0: - settings_env_var = os.getenv("DJANGO_SETTINGS_MODULE") - self.stdout.write( - "Automatic imports are disabled since settings are not configured." - f"\nDJANGO_SETTINGS_MODULE value is {settings_env_var!r}.\n" - "HINT: Ensure that the settings module is configured and set.", - self.style.ERROR, - ending="\n\n", - ) - return {} - - path_imports = self.get_auto_imports() - if path_imports is None: - return {} - - auto_imports = defaultdict(list) - import_errors = [] - for path in path_imports: - try: - obj = import_dotted_path(path) if "." in path else import_module(path) - except ImportError: - import_errors.append(path) - continue - - if "." in path: - module, name = path.rsplit(".", 1) - else: - module = None - name = path - if (name, obj) not in auto_imports[module]: - auto_imports[module].append((name, obj)) - - namespace = { - name: obj for items in auto_imports.values() for name, obj in items - } - - if verbosity < 1: - return namespace - - errors = len(import_errors) - if errors: - msg = "\n".join(f" {e}" for e in import_errors) - objects = "objects" if errors != 1 else "object" - self.stdout.write( - f"{errors} {objects} could not be automatically imported:\n\n{msg}", - self.style.ERROR, - ending="\n\n", - ) - - amount = len(namespace) - objects_str = "objects" if amount != 1 else "object" - msg = f"{amount} {objects_str} imported automatically" - - if verbosity < 2: - if amount: - msg += " (use -v 2 for details)" - self.stdout.write(f"{msg}.", self.style.SUCCESS, ending="\n\n") - return namespace - - top_level = auto_imports.pop(None, []) - import_string = "\n".join( - [f" import {obj}" for obj, _ in top_level] - + [ - f" from {module} import {objects}" - for module, imported_objects in auto_imports.items() - if (objects := ", ".join(i[0] for i in imported_objects)) - ] - ) - - try: - import isort - except ImportError: - pass - else: - import_string = isort.code(import_string) - - if import_string: - msg = f"{msg}:\n\n{import_string}" - else: - msg = f"{msg}." - - self.stdout.write(msg, self.style.SUCCESS, ending="\n\n") - - return namespace - - def handle(self, **options): - # Execute the command and exit. - if options["command"]: - exec(options["command"], {**globals(), **self.get_namespace(**options)}) - return - - # Execute stdin if it has anything to read and exit. - # Not supported on Windows due to select.select() limitations. - if ( - sys.platform != "win32" - and not sys.stdin.isatty() - and select.select([sys.stdin], [], [], 0)[0] - ): - exec(sys.stdin.read(), {**globals(), **self.get_namespace(**options)}) - return - - available_shells = ( - [options["interface"]] if options["interface"] else self.shells - ) - - for shell in available_shells: - try: - return getattr(self, shell)(options) - except ImportError: - pass - raise CommandError("Couldn't import {} interface.".format(shell)) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/showmigrations.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/showmigrations.py deleted file mode 100644 index e88f83f..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/showmigrations.py +++ /dev/null @@ -1,177 +0,0 @@ -import sys - -from django.apps import apps -from django.core.management.base import BaseCommand -from django.db import DEFAULT_DB_ALIAS, connections -from django.db.migrations.loader import MigrationLoader -from django.db.migrations.recorder import MigrationRecorder - - -class Command(BaseCommand): - help = "Shows all available migrations for the current project" - - def add_arguments(self, parser): - parser.add_argument( - "app_label", - nargs="*", - help="App labels of applications to limit the output to.", - ) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help=( - "Nominates a database to show migrations for. Defaults to the " - '"default" database.' - ), - ) - - formats = parser.add_mutually_exclusive_group() - formats.add_argument( - "--list", - "-l", - action="store_const", - dest="format", - const="list", - help=( - "Shows a list of all migrations and which are applied. " - "With a verbosity level of 2 or above, the applied datetimes " - "will be included." - ), - ) - formats.add_argument( - "--plan", - "-p", - action="store_const", - dest="format", - const="plan", - help=( - "Shows all migrations in the order they will be applied. With a " - "verbosity level of 2 or above all direct migration dependencies and " - "reverse dependencies (run_before) will be included." - ), - ) - - parser.set_defaults(format="list") - - def handle(self, *args, **options): - self.verbosity = options["verbosity"] - - # Get the database we're operating from - db = options["database"] - connection = connections[db] - - if options["format"] == "plan": - return self.show_plan(connection, options["app_label"]) - else: - return self.show_list(connection, options["app_label"]) - - def _validate_app_names(self, loader, app_names): - has_bad_names = False - for app_name in app_names: - try: - apps.get_app_config(app_name) - except LookupError as err: - self.stderr.write(str(err)) - has_bad_names = True - if has_bad_names: - sys.exit(2) - - def show_list(self, connection, app_names=None): - """ - Show a list of all migrations on the system, or only those of - some named apps. - """ - # Load migrations from disk/DB - loader = MigrationLoader(connection, ignore_no_migrations=True) - recorder = MigrationRecorder(connection) - recorded_migrations = recorder.applied_migrations() - graph = loader.graph - # If we were passed a list of apps, validate it - if app_names: - self._validate_app_names(loader, app_names) - # Otherwise, show all apps in alphabetic order - else: - app_names = sorted(loader.migrated_apps) - # For each app, print its migrations in order from oldest (roots) to - # newest (leaves). - for app_name in app_names: - self.stdout.write(app_name, self.style.MIGRATE_LABEL) - shown = set() - for node in graph.leaf_nodes(app_name): - for plan_node in graph.forwards_plan(node): - if plan_node not in shown and plan_node[0] == app_name: - # Give it a nice title if it's a squashed one - title = plan_node[1] - if graph.nodes[plan_node].replaces: - title += " (%s squashed migrations)" % len( - graph.nodes[plan_node].replaces - ) - applied_migration = loader.applied_migrations.get(plan_node) - # Mark it as applied/unapplied - if applied_migration: - if plan_node in recorded_migrations: - output = " [X] %s" % title - else: - title += " Run 'manage.py migrate' to finish recording." - output = " [-] %s" % title - if self.verbosity >= 2 and hasattr( - applied_migration, "applied" - ): - output += ( - " (applied at %s)" - % applied_migration.applied.strftime( - "%Y-%m-%d %H:%M:%S" - ) - ) - self.stdout.write(output) - else: - self.stdout.write(" [ ] %s" % title) - shown.add(plan_node) - # If we didn't print anything, then a small message - if not shown: - self.stdout.write(" (no migrations)", self.style.ERROR) - - def show_plan(self, connection, app_names=None): - """ - Show all known migrations (or only those of the specified app_names) - in the order they will be applied. - """ - # Load migrations from disk/DB - loader = MigrationLoader(connection) - graph = loader.graph - if app_names: - self._validate_app_names(loader, app_names) - targets = [key for key in graph.leaf_nodes() if key[0] in app_names] - else: - targets = graph.leaf_nodes() - plan = [] - seen = set() - - # Generate the plan - for target in targets: - for migration in graph.forwards_plan(target): - if migration not in seen: - node = graph.node_map[migration] - plan.append(node) - seen.add(migration) - - # Output - def print_deps(node): - out = [] - for parent in sorted(node.parents): - out.append("%s.%s" % parent.key) - if out: - return " ... (%s)" % ", ".join(out) - return "" - - for node in plan: - deps = "" - if self.verbosity >= 2: - deps = print_deps(node) - if node.key in loader.applied_migrations: - self.stdout.write("[X] %s.%s%s" % (node.key[0], node.key[1], deps)) - else: - self.stdout.write("[ ] %s.%s%s" % (node.key[0], node.key[1], deps)) - if not plan: - self.stdout.write("(no migrations)", self.style.ERROR) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/sqlflush.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/sqlflush.py deleted file mode 100644 index d0512a6..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/sqlflush.py +++ /dev/null @@ -1,30 +0,0 @@ -from django.core.management.base import BaseCommand -from django.core.management.sql import sql_flush -from django.db import DEFAULT_DB_ALIAS, connections - - -class Command(BaseCommand): - help = ( - "Returns a list of the SQL statements required to return all tables in " - "the database to the state they were in just after they were installed." - ) - - output_transaction = True - - def add_arguments(self, parser): - super().add_arguments(parser) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help=( - 'Nominates a database to print the SQL for. Defaults to the "default" ' - "database." - ), - ) - - def handle(self, **options): - sql_statements = sql_flush(self.style, connections[options["database"]]) - if not sql_statements and options["verbosity"] >= 1: - self.stderr.write("No tables found.") - return "\n".join(sql_statements) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/sqlmigrate.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/sqlmigrate.py deleted file mode 100644 index 076499b..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/sqlmigrate.py +++ /dev/null @@ -1,83 +0,0 @@ -from django.apps import apps -from django.core.management.base import BaseCommand, CommandError -from django.db import DEFAULT_DB_ALIAS, connections -from django.db.migrations.loader import AmbiguityError, MigrationLoader - - -class Command(BaseCommand): - help = "Prints the SQL statements for the named migration." - - output_transaction = True - - def add_arguments(self, parser): - parser.add_argument( - "app_label", help="App label of the application containing the migration." - ) - parser.add_argument( - "migration_name", help="Migration name to print the SQL for." - ) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help=( - 'Nominates a database to create SQL for. Defaults to the "default" ' - "database." - ), - ) - parser.add_argument( - "--backwards", - action="store_true", - help="Creates SQL to unapply the migration, rather than to apply it", - ) - - def execute(self, *args, **options): - # sqlmigrate doesn't support coloring its output, so make the - # BEGIN/COMMIT statements added by output_transaction colorless also. - self.style.SQL_KEYWORD = lambda noop: noop - return super().execute(*args, **options) - - def handle(self, *args, **options): - # Get the database we're operating from - connection = connections[options["database"]] - - # Load up a loader to get all the migration data, but don't replace - # migrations. - loader = MigrationLoader(connection, replace_migrations=False) - - # Resolve command-line arguments into a migration - app_label, migration_name = options["app_label"], options["migration_name"] - # Validate app_label - try: - apps.get_app_config(app_label) - except LookupError as err: - raise CommandError(str(err)) - if app_label not in loader.migrated_apps: - raise CommandError("App '%s' does not have migrations" % app_label) - try: - migration = loader.get_migration_by_prefix(app_label, migration_name) - except AmbiguityError: - raise CommandError( - "More than one migration matches '%s' in app '%s'. Please be more " - "specific." % (migration_name, app_label) - ) - except KeyError: - raise CommandError( - "Cannot find a migration matching '%s' from app '%s'. Is it in " - "INSTALLED_APPS?" % (migration_name, app_label) - ) - target = (app_label, migration.name) - - # Show begin/end around output for atomic migrations, if the database - # supports transactional DDL. - self.output_transaction = ( - migration.atomic and connection.features.can_rollback_ddl - ) - - # Make a plan that represents just the requested migrations and show SQL - # for it - plan = [(loader.graph.nodes[target], options["backwards"])] - sql_statements = loader.collect_sql(plan) - if not sql_statements and options["verbosity"] >= 1: - self.stderr.write("No operations found.") - return "\n".join(sql_statements) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/sqlsequencereset.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/sqlsequencereset.py deleted file mode 100644 index cc0d100..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/sqlsequencereset.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.core.management.base import AppCommand -from django.db import DEFAULT_DB_ALIAS, connections - - -class Command(AppCommand): - help = ( - "Prints the SQL statements for resetting sequences for the given app name(s)." - ) - - output_transaction = True - - def add_arguments(self, parser): - super().add_arguments(parser) - parser.add_argument( - "--database", - default=DEFAULT_DB_ALIAS, - choices=tuple(connections), - help=( - 'Nominates a database to print the SQL for. Defaults to the "default" ' - "database." - ), - ) - - def handle_app_config(self, app_config, **options): - if app_config.models_module is None: - return - connection = connections[options["database"]] - models = app_config.get_models(include_auto_created=True) - statements = connection.ops.sequence_reset_sql(self.style, models) - if not statements and options["verbosity"] >= 1: - self.stderr.write("No sequences found.") - return "\n".join(statements) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/squashmigrations.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/squashmigrations.py deleted file mode 100644 index bb63611..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/squashmigrations.py +++ /dev/null @@ -1,267 +0,0 @@ -import os -import shutil - -from django.apps import apps -from django.conf import settings -from django.core.management.base import BaseCommand, CommandError -from django.core.management.utils import run_formatters -from django.db import DEFAULT_DB_ALIAS, connections, migrations -from django.db.migrations.loader import AmbiguityError, MigrationLoader -from django.db.migrations.migration import SwappableTuple -from django.db.migrations.optimizer import MigrationOptimizer -from django.db.migrations.writer import MigrationWriter -from django.utils.version import get_docs_version - - -class Command(BaseCommand): - help = ( - "Squashes an existing set of migrations (from first until specified) into a " - "single new one." - ) - - def add_arguments(self, parser): - parser.add_argument( - "app_label", - help="App label of the application to squash migrations for.", - ) - parser.add_argument( - "start_migration_name", - nargs="?", - help=( - "Migrations will be squashed starting from and including this " - "migration." - ), - ) - parser.add_argument( - "migration_name", - help="Migrations will be squashed until and including this migration.", - ) - parser.add_argument( - "--no-optimize", - action="store_true", - help="Do not try to optimize the squashed operations.", - ) - parser.add_argument( - "--noinput", - "--no-input", - action="store_false", - dest="interactive", - help="Tells Django to NOT prompt the user for input of any kind.", - ) - parser.add_argument( - "--squashed-name", - help="Sets the name of the new squashed migration.", - ) - parser.add_argument( - "--no-header", - action="store_false", - dest="include_header", - help="Do not add a header comment to the new squashed migration.", - ) - - def handle(self, **options): - self.verbosity = options["verbosity"] - self.interactive = options["interactive"] - app_label = options["app_label"] - start_migration_name = options["start_migration_name"] - migration_name = options["migration_name"] - no_optimize = options["no_optimize"] - squashed_name = options["squashed_name"] - include_header = options["include_header"] - # Validate app_label. - try: - apps.get_app_config(app_label) - except LookupError as err: - raise CommandError(str(err)) - # Load the current graph state, check the app and migration they asked - # for exists. - loader = MigrationLoader(connections[DEFAULT_DB_ALIAS]) - if app_label not in loader.migrated_apps: - raise CommandError( - "App '%s' does not have migrations (so squashmigrations on " - "it makes no sense)" % app_label - ) - - migration = self.find_migration(loader, app_label, migration_name) - - # Work out the list of predecessor migrations - migrations_to_squash = [ - loader.get_migration(al, mn) - for al, mn in loader.graph.forwards_plan( - (migration.app_label, migration.name) - ) - if al == migration.app_label - ] - - if start_migration_name: - start_migration = self.find_migration( - loader, app_label, start_migration_name - ) - start = loader.get_migration( - start_migration.app_label, start_migration.name - ) - try: - start_index = migrations_to_squash.index(start) - migrations_to_squash = migrations_to_squash[start_index:] - except ValueError: - raise CommandError( - "The migration '%s' cannot be found. Maybe it comes after " - "the migration '%s'?\n" - "Have a look at:\n" - " python manage.py showmigrations %s\n" - "to debug this issue." % (start_migration, migration, app_label) - ) - - # Tell them what we're doing and optionally ask if we should proceed - if self.verbosity > 0 or self.interactive: - self.stdout.write( - self.style.MIGRATE_HEADING("Will squash the following migrations:") - ) - for migration in migrations_to_squash: - self.stdout.write(" - %s" % migration.name) - - if self.interactive: - answer = None - while not answer or answer not in "yn": - answer = input("Do you wish to proceed? [y/N] ") - if not answer: - answer = "n" - break - else: - answer = answer[0].lower() - if answer != "y": - return - - # Load the operations from all those migrations and concat together, - # along with collecting external dependencies and detecting - # double-squashing - operations = [] - dependencies = set() - # We need to take all dependencies from the first migration in the list - # as it may be 0002 depending on 0001 - first_migration = True - for smigration in migrations_to_squash: - if smigration.replaces: - raise CommandError( - "You cannot squash squashed migrations! Please transition it to a " - "normal migration first: https://docs.djangoproject.com/en/%s/" - "topics/migrations/#squashing-migrations" % get_docs_version() - ) - operations.extend(smigration.operations) - for dependency in smigration.dependencies: - if isinstance(dependency, SwappableTuple): - if settings.AUTH_USER_MODEL == dependency.setting: - dependencies.add(("__setting__", "AUTH_USER_MODEL")) - else: - dependencies.add(dependency) - elif dependency[0] != smigration.app_label or first_migration: - dependencies.add(dependency) - first_migration = False - - if no_optimize: - if self.verbosity > 0: - self.stdout.write( - self.style.MIGRATE_HEADING("(Skipping optimization.)") - ) - new_operations = operations - else: - if self.verbosity > 0: - self.stdout.write(self.style.MIGRATE_HEADING("Optimizing...")) - - optimizer = MigrationOptimizer() - new_operations = optimizer.optimize(operations, migration.app_label) - - if self.verbosity > 0: - if len(new_operations) == len(operations): - self.stdout.write(" No optimizations possible.") - else: - self.stdout.write( - " Optimized from %s operations to %s operations." - % (len(operations), len(new_operations)) - ) - - # Work out the value of replaces (any squashed ones we're re-squashing) - # need to feed their replaces into ours - replaces = [] - for migration in migrations_to_squash: - if migration.replaces: - replaces.extend(migration.replaces) - else: - replaces.append((migration.app_label, migration.name)) - - # Make a new migration with those operations - subclass = type( - "Migration", - (migrations.Migration,), - { - "dependencies": dependencies, - "operations": new_operations, - "replaces": replaces, - }, - ) - if start_migration_name: - if squashed_name: - # Use the name from --squashed-name. - prefix, _ = start_migration.name.split("_", 1) - name = "%s_%s" % (prefix, squashed_name) - else: - # Generate a name. - name = "%s_squashed_%s" % (start_migration.name, migration.name) - new_migration = subclass(name, app_label) - else: - name = "0001_%s" % (squashed_name or "squashed_%s" % migration.name) - new_migration = subclass(name, app_label) - new_migration.initial = True - - # Write out the new migration file - writer = MigrationWriter(new_migration, include_header) - if os.path.exists(writer.path): - raise CommandError( - f"Migration {new_migration.name} already exists. Use a different name." - ) - with open(writer.path, "w", encoding="utf-8") as fh: - fh.write(writer.as_string()) - run_formatters([writer.path], stderr=self.stderr) - - if self.verbosity > 0: - self.stdout.write( - self.style.MIGRATE_HEADING( - "Created new squashed migration %s" % writer.path - ) - + "\n" - " You should commit this migration but leave the old ones in place;\n" - " the new migration will be used for new installs. Once you are sure\n" - " all instances of the codebase have applied the migrations you " - "squashed,\n" - " you can delete them." - ) - if writer.needs_manual_porting: - self.stdout.write( - self.style.MIGRATE_HEADING("Manual porting required") + "\n" - " Your migrations contained functions that must be manually " - "copied over,\n" - " as we could not safely copy their implementation.\n" - " See the comment at the top of the squashed migration for " - "details." - ) - if shutil.which("black"): - self.stdout.write( - self.style.WARNING( - "Squashed migration couldn't be formatted using the " - '"black" command. You can call it manually.' - ) - ) - - def find_migration(self, loader, app_label, name): - try: - return loader.get_migration_by_prefix(app_label, name) - except AmbiguityError: - raise CommandError( - "More than one migration matches '%s' in app '%s'. Please be " - "more specific." % (name, app_label) - ) - except KeyError: - raise CommandError( - "Cannot find a migration matching '%s' from app '%s'." - % (name, app_label) - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/startapp.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/startapp.py deleted file mode 100644 index e85833b..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/startapp.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.core.management.templates import TemplateCommand - - -class Command(TemplateCommand): - help = ( - "Creates a Django app directory structure for the given app name in " - "the current directory or optionally in the given directory." - ) - missing_args_message = "You must provide an application name." - - def handle(self, **options): - app_name = options.pop("name") - target = options.pop("directory") - super().handle("app", app_name, target, **options) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/startproject.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/startproject.py deleted file mode 100644 index ca17fa5..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/startproject.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.core.checks.security.base import SECRET_KEY_INSECURE_PREFIX -from django.core.management.templates import TemplateCommand - -from ..utils import get_random_secret_key - - -class Command(TemplateCommand): - help = ( - "Creates a Django project directory structure for the given project " - "name in the current directory or optionally in the given directory." - ) - missing_args_message = "You must provide a project name." - - def handle(self, **options): - project_name = options.pop("name") - target = options.pop("directory") - - # Create a random SECRET_KEY to put it in the main settings. - options["secret_key"] = SECRET_KEY_INSECURE_PREFIX + get_random_secret_key() - - super().handle("project", project_name, target, **options) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/test.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/test.py deleted file mode 100644 index 7452b3f..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/test.py +++ /dev/null @@ -1,66 +0,0 @@ -import sys - -from django.conf import settings -from django.core.management.base import BaseCommand -from django.core.management.utils import get_command_line_option -from django.test.runner import get_max_test_processes -from django.test.utils import NullTimeKeeper, TimeKeeper, get_runner - - -class Command(BaseCommand): - help = "Discover and run tests in the specified modules or the current directory." - - # DiscoverRunner runs the checks after databases are set up. - requires_system_checks = [] - test_runner = None - - def run_from_argv(self, argv): - """ - Pre-parse the command line to extract the value of the --testrunner - option. This allows a test runner to define additional command line - arguments. - """ - self.test_runner = get_command_line_option(argv, "--testrunner") - super().run_from_argv(argv) - - def add_arguments(self, parser): - parser.add_argument( - "args", - metavar="test_label", - nargs="*", - help=( - "Module paths to test; can be modulename, modulename.TestCase or " - "modulename.TestCase.test_method" - ), - ) - parser.add_argument( - "--noinput", - "--no-input", - action="store_false", - dest="interactive", - help="Tells Django to NOT prompt the user for input of any kind.", - ) - parser.add_argument( - "--testrunner", - help="Tells Django to use specified test runner class instead of " - "the one specified by the TEST_RUNNER setting.", - ) - - test_runner_class = get_runner(settings, self.test_runner) - - if hasattr(test_runner_class, "add_arguments"): - test_runner_class.add_arguments(parser) - - def handle(self, *test_labels, **options): - TestRunner = get_runner(settings, options["testrunner"]) - - time_keeper = TimeKeeper() if options.get("timing", False) else NullTimeKeeper() - parallel = options.get("parallel") - if parallel == "auto": - options["parallel"] = get_max_test_processes() - test_runner = TestRunner(**options) - with time_keeper.timed("Total run"): - failures = test_runner.run_tests(test_labels) - time_keeper.print_results() - if failures: - sys.exit(1) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/commands/testserver.py b/.venv/lib/python3.10/site-packages/django/core/management/commands/testserver.py deleted file mode 100644 index a8a0376..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/commands/testserver.py +++ /dev/null @@ -1,65 +0,0 @@ -from django.core.management import call_command -from django.core.management.base import BaseCommand -from django.db import connection - - -class Command(BaseCommand): - help = "Runs a development server with data from the given fixture(s)." - - requires_system_checks = [] - - def add_arguments(self, parser): - parser.add_argument( - "args", - metavar="fixture", - nargs="*", - help="Path(s) to fixtures to load before running the server.", - ) - parser.add_argument( - "--noinput", - "--no-input", - action="store_false", - dest="interactive", - help="Tells Django to NOT prompt the user for input of any kind.", - ) - parser.add_argument( - "--addrport", - default="", - help="Port number or ipaddr:port to run the server on.", - ) - parser.add_argument( - "--ipv6", - "-6", - action="store_true", - dest="use_ipv6", - help="Tells Django to use an IPv6 address.", - ) - - def handle(self, *fixture_labels, **options): - verbosity = options["verbosity"] - interactive = options["interactive"] - - # Create a test database. - db_name = connection.creation.create_test_db( - verbosity=verbosity, autoclobber=not interactive, serialize=False - ) - - # Import the fixture data into the test database. - call_command("loaddata", *fixture_labels, verbosity=verbosity) - - # Run the development server. Turn off auto-reloading because it causes - # a strange error -- it causes this handle() method to be called - # multiple times. - shutdown_message = ( - "\nServer stopped.\nNote that the test database, %r, has not been " - "deleted. You can explore it on your own." % db_name - ) - use_threading = connection.features.test_db_allows_multiple_connections - call_command( - "runserver", - addrport=options["addrport"], - shutdown_message=shutdown_message, - use_reloader=False, - use_ipv6=options["use_ipv6"], - use_threading=use_threading, - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/sql.py b/.venv/lib/python3.10/site-packages/django/core/management/sql.py deleted file mode 100644 index 2375cc2..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/sql.py +++ /dev/null @@ -1,59 +0,0 @@ -import sys - -from django.apps import apps -from django.db import models - - -def sql_flush(style, connection, reset_sequences=True, allow_cascade=False): - """ - Return a list of the SQL statements used to flush the database. - """ - tables = connection.introspection.django_table_names( - only_existing=True, include_views=False - ) - return connection.ops.sql_flush( - style, - tables, - reset_sequences=reset_sequences, - allow_cascade=allow_cascade, - ) - - -def emit_pre_migrate_signal(verbosity, interactive, db, **kwargs): - # Emit the pre_migrate signal for every application. - for app_config in apps.get_app_configs(): - if app_config.models_module is None: - continue - if verbosity >= 2: - stdout = kwargs.get("stdout", sys.stdout) - stdout.write( - "Running pre-migrate handlers for application %s" % app_config.label - ) - models.signals.pre_migrate.send( - sender=app_config, - app_config=app_config, - verbosity=verbosity, - interactive=interactive, - using=db, - **kwargs, - ) - - -def emit_post_migrate_signal(verbosity, interactive, db, **kwargs): - # Emit the post_migrate signal for every application. - for app_config in apps.get_app_configs(): - if app_config.models_module is None: - continue - if verbosity >= 2: - stdout = kwargs.get("stdout", sys.stdout) - stdout.write( - "Running post-migrate handlers for application %s" % app_config.label - ) - models.signals.post_migrate.send( - sender=app_config, - app_config=app_config, - verbosity=verbosity, - interactive=interactive, - using=db, - **kwargs, - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/templates.py b/.venv/lib/python3.10/site-packages/django/core/management/templates.py deleted file mode 100644 index dbaea11..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/templates.py +++ /dev/null @@ -1,402 +0,0 @@ -import argparse -import mimetypes -import os -import posixpath -import shutil -import stat -import tempfile -from importlib.util import find_spec -from urllib.request import build_opener - -import django -from django.conf import settings -from django.core.management.base import BaseCommand, CommandError -from django.core.management.utils import ( - find_formatters, - handle_extensions, - run_formatters, -) -from django.template import Context, Engine -from django.utils import archive -from django.utils.http import parse_header_parameters -from django.utils.version import get_docs_version - - -class TemplateCommand(BaseCommand): - """ - Copy either a Django application layout template or a Django project - layout template into the specified directory. - - :param style: A color style object (see django.core.management.color). - :param app_or_project: The string 'app' or 'project'. - :param name: The name of the application or project. - :param directory: The directory to which the template should be copied. - :param options: The additional variables passed to project or app templates - """ - - requires_system_checks = [] - # The supported URL schemes - url_schemes = ["http", "https", "ftp"] - # Rewrite the following suffixes when determining the target filename. - rewrite_template_suffixes = ( - # Allow shipping invalid .py files without byte-compilation. - (".py-tpl", ".py"), - ) - - def add_arguments(self, parser): - parser.add_argument("name", help="Name of the application or project.") - parser.add_argument( - "directory", nargs="?", help="Optional destination directory" - ) - parser.add_argument( - "--template", help="The path or URL to load the template from." - ) - parser.add_argument( - "--extension", - "-e", - dest="extensions", - action="append", - default=["py"], - help='The file extension(s) to render (default: "py"). ' - "Separate multiple extensions with commas, or use " - "-e multiple times.", - ) - parser.add_argument( - "--name", - "-n", - dest="files", - action="append", - default=[], - help="The file name(s) to render. Separate multiple file names " - "with commas, or use -n multiple times.", - ) - parser.add_argument( - "--exclude", - "-x", - action="append", - default=argparse.SUPPRESS, - nargs="?", - const="", - help=( - "The directory name(s) to exclude, in addition to .git and " - "__pycache__. Can be used multiple times." - ), - ) - - def handle(self, app_or_project, name, target=None, **options): - self.app_or_project = app_or_project - self.a_or_an = "an" if app_or_project == "app" else "a" - self.paths_to_remove = [] - self.verbosity = options["verbosity"] - - self.validate_name(name) - - # if some directory is given, make sure it's nicely expanded - if target is None: - top_dir = os.path.join(os.getcwd(), name) - try: - os.makedirs(top_dir) - except FileExistsError: - raise CommandError("'%s' already exists" % top_dir) - except OSError as e: - raise CommandError(e) - else: - top_dir = os.path.abspath(os.path.expanduser(target)) - if app_or_project == "app": - self.validate_name(os.path.basename(top_dir), "directory") - if not os.path.exists(top_dir): - raise CommandError( - "Destination directory '%s' does not " - "exist, please create it first." % top_dir - ) - - # Find formatters, which are external executables, before input - # from the templates can sneak into the path. - formatter_paths = find_formatters() - - extensions = tuple(handle_extensions(options["extensions"])) - extra_files = [] - excluded_directories = [".git", "__pycache__"] - for file in options["files"]: - extra_files.extend(map(lambda x: x.strip(), file.split(","))) - if exclude := options.get("exclude"): - for directory in exclude: - excluded_directories.append(directory.strip()) - if self.verbosity >= 2: - self.stdout.write( - "Rendering %s template files with extensions: %s" - % (app_or_project, ", ".join(extensions)) - ) - self.stdout.write( - "Rendering %s template files with filenames: %s" - % (app_or_project, ", ".join(extra_files)) - ) - base_name = "%s_name" % app_or_project - base_subdir = "%s_template" % app_or_project - base_directory = "%s_directory" % app_or_project - camel_case_name = "camel_case_%s_name" % app_or_project - camel_case_value = "".join(x for x in name.title() if x != "_") - - context = Context( - { - **options, - base_name: name, - base_directory: top_dir, - camel_case_name: camel_case_value, - "docs_version": get_docs_version(), - "django_version": django.__version__, - }, - autoescape=False, - ) - - # Setup a stub settings environment for template rendering - if not settings.configured: - settings.configure() - django.setup() - - template_dir = self.handle_template(options["template"], base_subdir) - prefix_length = len(template_dir) + 1 - - for root, dirs, files in os.walk(template_dir): - path_rest = root[prefix_length:] - relative_dir = path_rest.replace(base_name, name) - if relative_dir: - target_dir = os.path.join(top_dir, relative_dir) - os.makedirs(target_dir, exist_ok=True) - - for dirname in dirs[:]: - if "exclude" not in options: - if dirname.startswith(".") or dirname == "__pycache__": - dirs.remove(dirname) - elif dirname in excluded_directories: - dirs.remove(dirname) - - for filename in files: - if filename.endswith((".pyo", ".pyc", ".py.class")): - # Ignore some files as they cause various breakages. - continue - old_path = os.path.join(root, filename) - new_path = os.path.join( - top_dir, relative_dir, filename.replace(base_name, name) - ) - for old_suffix, new_suffix in self.rewrite_template_suffixes: - if new_path.endswith(old_suffix): - new_path = new_path.removesuffix(old_suffix) + new_suffix - break # Only rewrite once - - if os.path.exists(new_path): - raise CommandError( - "%s already exists. Overlaying %s %s into an existing " - "directory won't replace conflicting files." - % ( - new_path, - self.a_or_an, - app_or_project, - ) - ) - - # Only render the Python files, as we don't want to - # accidentally render Django templates files - if new_path.endswith(extensions) or filename in extra_files: - with open(old_path, encoding="utf-8") as template_file: - content = template_file.read() - template = Engine().from_string(content) - content = template.render(context) - with open(new_path, "w", encoding="utf-8") as new_file: - new_file.write(content) - else: - shutil.copyfile(old_path, new_path) - - if self.verbosity >= 2: - self.stdout.write("Creating %s" % new_path) - try: - self.apply_umask(old_path, new_path) - self.make_writeable(new_path) - except OSError: - self.stderr.write( - "Notice: Couldn't set permission bits on %s. You're " - "probably using an uncommon filesystem setup. No " - "problem." % new_path, - self.style.NOTICE, - ) - - if self.paths_to_remove: - if self.verbosity >= 2: - self.stdout.write("Cleaning up temporary files.") - for path_to_remove in self.paths_to_remove: - if os.path.isfile(path_to_remove): - os.remove(path_to_remove) - else: - shutil.rmtree(path_to_remove) - - run_formatters([top_dir], **formatter_paths, stderr=self.stderr) - - def handle_template(self, template, subdir): - """ - Determine where the app or project templates are. - Use django.__path__[0] as the default because the Django install - directory isn't known. - """ - if template is None: - return os.path.join(django.__path__[0], "conf", subdir) - else: - template = template.removeprefix("file://") - expanded_template = os.path.expanduser(template) - expanded_template = os.path.normpath(expanded_template) - if os.path.isdir(expanded_template): - return expanded_template - if self.is_url(template): - # downloads the file and returns the path - absolute_path = self.download(template) - else: - absolute_path = os.path.abspath(expanded_template) - if os.path.exists(absolute_path): - return self.extract(absolute_path) - - raise CommandError( - "couldn't handle %s template %s." % (self.app_or_project, template) - ) - - def validate_name(self, name, name_or_dir="name"): - if name is None: - raise CommandError( - "you must provide {an} {app} name".format( - an=self.a_or_an, - app=self.app_or_project, - ) - ) - # Check it's a valid directory name. - if not name.isidentifier(): - raise CommandError( - "'{name}' is not a valid {app} {type}. Please make sure the " - "{type} is a valid identifier.".format( - name=name, - app=self.app_or_project, - type=name_or_dir, - ) - ) - # Check that __spec__ doesn't exist. - if find_spec(name) is not None: - raise CommandError( - "'{name}' conflicts with the name of an existing Python " - "module and cannot be used as {an} {app} {type}. Please try " - "another {type}.".format( - name=name, - an=self.a_or_an, - app=self.app_or_project, - type=name_or_dir, - ) - ) - - def download(self, url): - """ - Download the given URL and return the file name. - """ - - def cleanup_url(url): - tmp = url.rstrip("/") - filename = tmp.split("/")[-1] - if url.endswith("/"): - display_url = tmp + "/" - else: - display_url = url - return filename, display_url - - prefix = "django_%s_template_" % self.app_or_project - tempdir = tempfile.mkdtemp(prefix=prefix, suffix="_download") - self.paths_to_remove.append(tempdir) - filename, display_url = cleanup_url(url) - - if self.verbosity >= 2: - self.stdout.write("Downloading %s" % display_url) - - the_path = os.path.join(tempdir, filename) - opener = build_opener() - opener.addheaders = [("User-Agent", f"Django/{django.__version__}")] - try: - with opener.open(url) as source, open(the_path, "wb") as target: - headers = source.info() - target.write(source.read()) - except OSError as e: - raise CommandError( - "couldn't download URL %s to %s: %s" % (url, filename, e) - ) - - used_name = the_path.split("/")[-1] - - # Trying to get better name from response headers - content_disposition = headers["content-disposition"] - if content_disposition: - _, params = parse_header_parameters(content_disposition) - guessed_filename = params.get("filename") or used_name - else: - guessed_filename = used_name - - # Falling back to content type guessing - ext = self.splitext(guessed_filename)[1] - content_type = headers["content-type"] - if not ext and content_type: - ext = mimetypes.guess_extension(content_type) - if ext: - guessed_filename += ext - - # Move the temporary file to a filename that has better - # chances of being recognized by the archive utils - if used_name != guessed_filename: - guessed_path = os.path.join(tempdir, guessed_filename) - shutil.move(the_path, guessed_path) - return guessed_path - - # Giving up - return the_path - - def splitext(self, the_path): - """ - Like os.path.splitext, but takes off .tar, too - """ - base, ext = posixpath.splitext(the_path) - if base.lower().endswith(".tar"): - ext = base[-4:] + ext - base = base[:-4] - return base, ext - - def extract(self, filename): - """ - Extract the given file to a temporary directory and return - the path of the directory with the extracted content. - """ - prefix = "django_%s_template_" % self.app_or_project - tempdir = tempfile.mkdtemp(prefix=prefix, suffix="_extract") - self.paths_to_remove.append(tempdir) - if self.verbosity >= 2: - self.stdout.write("Extracting %s" % filename) - try: - archive.extract(filename, tempdir) - return tempdir - except (archive.ArchiveException, OSError) as e: - raise CommandError( - "couldn't extract file %s to %s: %s" % (filename, tempdir, e) - ) - - def is_url(self, template): - """Return True if the name looks like a URL.""" - if ":" not in template: - return False - scheme = template.split(":", 1)[0].lower() - return scheme in self.url_schemes - - def apply_umask(self, old_path, new_path): - current_umask = os.umask(0) - os.umask(current_umask) - current_mode = stat.S_IMODE(os.stat(old_path).st_mode) - os.chmod(new_path, current_mode & ~current_umask) - - def make_writeable(self, filename): - """ - Make sure that the file is writeable. - Useful if our source is read-only. - """ - if not os.access(filename, os.W_OK): - st = os.stat(filename) - new_permissions = stat.S_IMODE(st.st_mode) | stat.S_IWUSR - os.chmod(filename, new_permissions) diff --git a/.venv/lib/python3.10/site-packages/django/core/management/utils.py b/.venv/lib/python3.10/site-packages/django/core/management/utils.py deleted file mode 100644 index 6ca88fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/management/utils.py +++ /dev/null @@ -1,181 +0,0 @@ -import fnmatch -import os -import shutil -import subprocess -import sys -import traceback -from pathlib import Path -from subprocess import run - -from django.apps import apps as installed_apps -from django.utils.crypto import get_random_string -from django.utils.encoding import DEFAULT_LOCALE_ENCODING - -from .base import CommandError, CommandParser - - -def popen_wrapper(args, stdout_encoding="utf-8"): - """ - Friendly wrapper around Popen. - - Return stdout output, stderr output, and OS status code. - """ - try: - p = run(args, capture_output=True, close_fds=os.name != "nt") - except OSError as err: - raise CommandError("Error executing %s" % args[0]) from err - return ( - p.stdout.decode(stdout_encoding), - p.stderr.decode(DEFAULT_LOCALE_ENCODING, errors="replace"), - p.returncode, - ) - - -def handle_extensions(extensions): - """ - Organize multiple extensions that are separated with commas or passed by - using --extension/-e multiple times. - - For example: running 'django-admin makemessages -e js,txt -e xhtml -a' - would result in an extension list: ['.js', '.txt', '.xhtml'] - - >>> handle_extensions(['.html', 'html,js,py,py,py,.py', 'py,.py']) - {'.html', '.js', '.py'} - >>> handle_extensions(['.html, txt,.tpl']) - {'.html', '.tpl', '.txt'} - """ - ext_list = [] - for ext in extensions: - ext_list.extend(ext.replace(" ", "").split(",")) - for i, ext in enumerate(ext_list): - if not ext.startswith("."): - ext_list[i] = ".%s" % ext_list[i] - return set(ext_list) - - -def find_command(cmd, path=None, pathext=None): - if path is None: - path = os.environ.get("PATH", "").split(os.pathsep) - if isinstance(path, str): - path = [path] - # check if there are funny path extensions for executables, e.g. Windows - if pathext is None: - pathext = os.environ.get("PATHEXT", ".COM;.EXE;.BAT;.CMD").split(os.pathsep) - # don't use extensions if the command ends with one of them - for ext in pathext: - if cmd.endswith(ext): - pathext = [""] - break - # check if we find the command on PATH - for p in path: - f = os.path.join(p, cmd) - if os.path.isfile(f): - return f - for ext in pathext: - fext = f + ext - if os.path.isfile(fext): - return fext - return None - - -def get_random_secret_key(): - """ - Return a 50 character random string usable as a SECRET_KEY setting value. - """ - chars = "abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)" - return get_random_string(50, chars) - - -def parse_apps_and_model_labels(labels): - """ - Parse a list of "app_label.ModelName" or "app_label" strings into actual - objects and return a two-element tuple: - (set of model classes, set of app_configs). - Raise a CommandError if some specified models or apps don't exist. - """ - apps = set() - models = set() - - for label in labels: - if "." in label: - try: - model = installed_apps.get_model(label) - except LookupError: - raise CommandError("Unknown model: %s" % label) - models.add(model) - else: - try: - app_config = installed_apps.get_app_config(label) - except LookupError as e: - raise CommandError(str(e)) - apps.add(app_config) - - return models, apps - - -def get_command_line_option(argv, option): - """ - Return the value of a command line option (which should include leading - dashes, e.g. '--testrunner') from an argument list. Return None if the - option wasn't passed or if the argument list couldn't be parsed. - """ - parser = CommandParser(add_help=False, allow_abbrev=False) - parser.add_argument(option, dest="value") - try: - options, _ = parser.parse_known_args(argv[2:]) - except CommandError: - return None - else: - return options.value - - -def normalize_path_patterns(patterns): - """Normalize an iterable of glob style patterns based on OS.""" - patterns = [os.path.normcase(p) for p in patterns] - dir_suffixes = {"%s*" % path_sep for path_sep in {"/", os.sep}} - norm_patterns = [] - for pattern in patterns: - for dir_suffix in dir_suffixes: - if pattern.endswith(dir_suffix): - norm_patterns.append(pattern.removesuffix(dir_suffix)) - break - else: - norm_patterns.append(pattern) - return norm_patterns - - -def is_ignored_path(path, ignore_patterns): - """ - Check if the given path should be ignored or not based on matching - one of the glob style `ignore_patterns`. - """ - path = Path(path) - - def ignore(pattern): - return fnmatch.fnmatchcase(path.name, pattern) or fnmatch.fnmatchcase( - str(path), pattern - ) - - return any(ignore(pattern) for pattern in normalize_path_patterns(ignore_patterns)) - - -def find_formatters(): - return {"black_path": shutil.which("black")} - - -def run_formatters(written_files, black_path=(sentinel := object()), stderr=sys.stderr): - """ - Run the black formatter on the specified files. - """ - # Use a sentinel rather than None, as which() returns None when not found. - if black_path is sentinel: - black_path = shutil.which("black") - if black_path: - try: - subprocess.run( - [black_path, "--fast", "--", *written_files], - capture_output=True, - ) - except OSError: - stderr.write("Formatters failed to launch:") - traceback.print_exc(file=stderr) diff --git a/.venv/lib/python3.10/site-packages/django/core/paginator.py b/.venv/lib/python3.10/site-packages/django/core/paginator.py deleted file mode 100644 index 7b3189c..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/paginator.py +++ /dev/null @@ -1,238 +0,0 @@ -import collections.abc -import inspect -import warnings -from math import ceil - -from django.utils.functional import cached_property -from django.utils.inspect import method_has_no_args -from django.utils.translation import gettext_lazy as _ - - -class UnorderedObjectListWarning(RuntimeWarning): - pass - - -class InvalidPage(Exception): - pass - - -class PageNotAnInteger(InvalidPage): - pass - - -class EmptyPage(InvalidPage): - pass - - -class Paginator: - # Translators: String used to replace omitted page numbers in elided page - # range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. - ELLIPSIS = _("…") - default_error_messages = { - "invalid_page": _("That page number is not an integer"), - "min_page": _("That page number is less than 1"), - "no_results": _("That page contains no results"), - } - - def __init__( - self, - object_list, - per_page, - orphans=0, - allow_empty_first_page=True, - error_messages=None, - ): - self.object_list = object_list - self._check_object_list_is_ordered() - self.per_page = int(per_page) - self.orphans = int(orphans) - self.allow_empty_first_page = allow_empty_first_page - self.error_messages = ( - self.default_error_messages - if error_messages is None - else self.default_error_messages | error_messages - ) - - def __iter__(self): - for page_number in self.page_range: - yield self.page(page_number) - - def validate_number(self, number): - """Validate the given 1-based page number.""" - try: - if isinstance(number, float) and not number.is_integer(): - raise ValueError - number = int(number) - except (TypeError, ValueError): - raise PageNotAnInteger(self.error_messages["invalid_page"]) - if number < 1: - raise EmptyPage(self.error_messages["min_page"]) - if number > self.num_pages: - raise EmptyPage(self.error_messages["no_results"]) - return number - - def get_page(self, number): - """ - Return a valid page, even if the page argument isn't a number or isn't - in range. - """ - try: - number = self.validate_number(number) - except PageNotAnInteger: - number = 1 - except EmptyPage: - number = self.num_pages - return self.page(number) - - def page(self, number): - """Return a Page object for the given 1-based page number.""" - number = self.validate_number(number) - bottom = (number - 1) * self.per_page - top = bottom + self.per_page - if top + self.orphans >= self.count: - top = self.count - return self._get_page(self.object_list[bottom:top], number, self) - - def _get_page(self, *args, **kwargs): - """ - Return an instance of a single page. - - This hook can be used by subclasses to use an alternative to the - standard :cls:`Page` object. - """ - return Page(*args, **kwargs) - - @cached_property - def count(self): - """Return the total number of objects, across all pages.""" - c = getattr(self.object_list, "count", None) - if callable(c) and not inspect.isbuiltin(c) and method_has_no_args(c): - return c() - return len(self.object_list) - - @cached_property - def num_pages(self): - """Return the total number of pages.""" - if self.count == 0 and not self.allow_empty_first_page: - return 0 - hits = max(1, self.count - self.orphans) - return ceil(hits / self.per_page) - - @property - def page_range(self): - """ - Return a 1-based range of pages for iterating through within - a template for loop. - """ - return range(1, self.num_pages + 1) - - def _check_object_list_is_ordered(self): - """ - Warn if self.object_list is unordered (typically a QuerySet). - """ - ordered = getattr(self.object_list, "ordered", None) - if ordered is not None and not ordered: - obj_list_repr = ( - "{} {}".format( - self.object_list.model, self.object_list.__class__.__name__ - ) - if hasattr(self.object_list, "model") - else "{!r}".format(self.object_list) - ) - warnings.warn( - "Pagination may yield inconsistent results with an unordered " - "object_list: {}.".format(obj_list_repr), - UnorderedObjectListWarning, - stacklevel=3, - ) - - def get_elided_page_range(self, number=1, *, on_each_side=3, on_ends=2): - """ - Return a 1-based range of pages with some values elided. - - If the page range is larger than a given size, the whole range is not - provided and a compact form is returned instead, e.g. for a paginator - with 50 pages, if page 43 were the current page, the output, with the - default arguments, would be: - - 1, 2, …, 40, 41, 42, 43, 44, 45, 46, …, 49, 50. - """ - number = self.validate_number(number) - - if self.num_pages <= (on_each_side + on_ends) * 2: - yield from self.page_range - return - - if number > (1 + on_each_side + on_ends) + 1: - yield from range(1, on_ends + 1) - yield self.ELLIPSIS - yield from range(number - on_each_side, number + 1) - else: - yield from range(1, number + 1) - - if number < (self.num_pages - on_each_side - on_ends) - 1: - yield from range(number + 1, number + on_each_side + 1) - yield self.ELLIPSIS - yield from range(self.num_pages - on_ends + 1, self.num_pages + 1) - else: - yield from range(number + 1, self.num_pages + 1) - - -class Page(collections.abc.Sequence): - def __init__(self, object_list, number, paginator): - self.object_list = object_list - self.number = number - self.paginator = paginator - - def __repr__(self): - return "" % (self.number, self.paginator.num_pages) - - def __len__(self): - return len(self.object_list) - - def __getitem__(self, index): - if not isinstance(index, (int, slice)): - raise TypeError( - "Page indices must be integers or slices, not %s." - % type(index).__name__ - ) - # The object_list is converted to a list so that if it was a QuerySet - # it won't be a database hit per __getitem__. - if not isinstance(self.object_list, list): - self.object_list = list(self.object_list) - return self.object_list[index] - - def has_next(self): - return self.number < self.paginator.num_pages - - def has_previous(self): - return self.number > 1 - - def has_other_pages(self): - return self.has_previous() or self.has_next() - - def next_page_number(self): - return self.paginator.validate_number(self.number + 1) - - def previous_page_number(self): - return self.paginator.validate_number(self.number - 1) - - def start_index(self): - """ - Return the 1-based index of the first object on this page, - relative to total objects in the paginator. - """ - # Special case, return zero if no items. - if self.paginator.count == 0: - return 0 - return (self.paginator.per_page * (self.number - 1)) + 1 - - def end_index(self): - """ - Return the 1-based index of the last object on this page, - relative to total objects found (hits). - """ - # Special case for the last page because there can be orphans. - if self.number == self.paginator.num_pages: - return self.paginator.count - return self.number * self.paginator.per_page diff --git a/.venv/lib/python3.10/site-packages/django/core/serializers/__init__.py b/.venv/lib/python3.10/site-packages/django/core/serializers/__init__.py deleted file mode 100644 index 480c54b..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/serializers/__init__.py +++ /dev/null @@ -1,254 +0,0 @@ -""" -Interfaces for serializing Django objects. - -Usage:: - - from django.core import serializers - json = serializers.serialize("json", some_queryset) - objects = list(serializers.deserialize("json", json)) - -To add your own serializers, use the SERIALIZATION_MODULES setting:: - - SERIALIZATION_MODULES = { - "csv": "path.to.csv.serializer", - "txt": "path.to.txt.serializer", - } - -""" - -import importlib - -from django.apps import apps -from django.conf import settings -from django.core.serializers.base import SerializerDoesNotExist - -# Built-in serializers -BUILTIN_SERIALIZERS = { - "xml": "django.core.serializers.xml_serializer", - "python": "django.core.serializers.python", - "json": "django.core.serializers.json", - "yaml": "django.core.serializers.pyyaml", - "jsonl": "django.core.serializers.jsonl", -} - -_serializers = {} - - -class BadSerializer: - """ - Stub serializer to hold exception raised during registration - - This allows the serializer registration to cache serializers and if there - is an error raised in the process of creating a serializer it will be - raised and passed along to the caller when the serializer is used. - """ - - internal_use_only = False - - def __init__(self, exception): - self.exception = exception - - def __call__(self, *args, **kwargs): - raise self.exception - - -def register_serializer(format, serializer_module, serializers=None): - """Register a new serializer. - - ``serializer_module`` should be the fully qualified module name - for the serializer. - - If ``serializers`` is provided, the registration will be added - to the provided dictionary. - - If ``serializers`` is not provided, the registration will be made - directly into the global register of serializers. Adding serializers - directly is not a thread-safe operation. - """ - if serializers is None and not _serializers: - _load_serializers() - - try: - module = importlib.import_module(serializer_module) - except ImportError as exc: - bad_serializer = BadSerializer(exc) - - module = type( - "BadSerializerModule", - (), - { - "Deserializer": bad_serializer, - "Serializer": bad_serializer, - }, - ) - - if serializers is None: - _serializers[format] = module - else: - serializers[format] = module - - -def unregister_serializer(format): - "Unregister a given serializer. This is not a thread-safe operation." - if not _serializers: - _load_serializers() - if format not in _serializers: - raise SerializerDoesNotExist(format) - del _serializers[format] - - -def get_serializer(format): - if not _serializers: - _load_serializers() - if format not in _serializers: - raise SerializerDoesNotExist(format) - return _serializers[format].Serializer - - -def get_serializer_formats(): - if not _serializers: - _load_serializers() - return list(_serializers) - - -def get_public_serializer_formats(): - if not _serializers: - _load_serializers() - return [k for k, v in _serializers.items() if not v.Serializer.internal_use_only] - - -def get_deserializer(format): - if not _serializers: - _load_serializers() - if format not in _serializers: - raise SerializerDoesNotExist(format) - return _serializers[format].Deserializer - - -def serialize(format, queryset, **options): - """ - Serialize a queryset (or any iterator that returns database objects) using - a certain serializer. - """ - s = get_serializer(format)() - s.serialize(queryset, **options) - return s.getvalue() - - -def deserialize(format, stream_or_string, **options): - """ - Deserialize a stream or a string. Return an iterator that yields ``(obj, - m2m_relation_dict)``, where ``obj`` is an instantiated -- but *unsaved* -- - object, and ``m2m_relation_dict`` is a dictionary of ``{m2m_field_name : - list_of_related_objects}``. - """ - d = get_deserializer(format) - return d(stream_or_string, **options) - - -def _load_serializers(): - """ - Register built-in and settings-defined serializers. This is done lazily so - that user code has a chance to (e.g.) set up custom settings without - needing to be careful of import order. - """ - global _serializers - serializers = {} - for format in BUILTIN_SERIALIZERS: - register_serializer(format, BUILTIN_SERIALIZERS[format], serializers) - if hasattr(settings, "SERIALIZATION_MODULES"): - for format in settings.SERIALIZATION_MODULES: - register_serializer( - format, settings.SERIALIZATION_MODULES[format], serializers - ) - _serializers = serializers - - -def sort_dependencies(app_list, allow_cycles=False): - """Sort a list of (app_config, models) pairs into a single list of models. - - The single list of models is sorted so that any model with a natural key - is serialized before a normal model, and any model with a natural key - dependency has it's dependencies serialized first. - - If allow_cycles is True, return the best-effort ordering that will respect - most of dependencies but ignore some of them to break the cycles. - """ - # Process the list of models, and get the list of dependencies - model_dependencies = [] - models = set() - for app_config, model_list in app_list: - if model_list is None: - model_list = app_config.get_models() - - for model in model_list: - models.add(model) - # Add any explicitly defined dependencies - if hasattr(model, "natural_key"): - deps = getattr(model.natural_key, "dependencies", []) - if deps: - deps = [apps.get_model(dep) for dep in deps] - else: - deps = [] - - # Now add a dependency for any FK relation with a model that - # defines a natural key - for field in model._meta.fields: - if field.remote_field: - rel_model = field.remote_field.model - if hasattr(rel_model, "natural_key") and rel_model != model: - deps.append(rel_model) - # Also add a dependency for any simple M2M relation with a model - # that defines a natural key. M2M relations with explicit through - # models don't count as dependencies. - for field in model._meta.many_to_many: - if field.remote_field.through._meta.auto_created: - rel_model = field.remote_field.model - if hasattr(rel_model, "natural_key") and rel_model != model: - deps.append(rel_model) - model_dependencies.append((model, deps)) - - model_dependencies.reverse() - # Now sort the models to ensure that dependencies are met. This - # is done by repeatedly iterating over the input list of models. - # If all the dependencies of a given model are in the final list, - # that model is promoted to the end of the final list. This process - # continues until the input list is empty, or we do a full iteration - # over the input models without promoting a model to the final list. - # If we do a full iteration without a promotion, that means there are - # circular dependencies in the list. - model_list = [] - while model_dependencies: - skipped = [] - changed = False - while model_dependencies: - model, deps = model_dependencies.pop() - - # If all of the models in the dependency list are either already - # on the final model list, or not on the original serialization list, - # then we've found another model with all it's dependencies satisfied. - if all(d not in models or d in model_list for d in deps): - model_list.append(model) - changed = True - else: - skipped.append((model, deps)) - if not changed: - if allow_cycles: - # If cycles are allowed, add the last skipped model and ignore - # its dependencies. This could be improved by some graph - # analysis to ignore as few dependencies as possible. - model, _ = skipped.pop() - model_list.append(model) - else: - raise RuntimeError( - "Can't resolve dependencies for %s in serialized app list." - % ", ".join( - model._meta.label - for model, deps in sorted( - skipped, key=lambda obj: obj[0].__name__ - ) - ), - ) - model_dependencies = skipped - - return model_list diff --git a/.venv/lib/python3.10/site-packages/django/core/serializers/base.py b/.venv/lib/python3.10/site-packages/django/core/serializers/base.py deleted file mode 100644 index 1fbca92..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/serializers/base.py +++ /dev/null @@ -1,387 +0,0 @@ -""" -Module for abstract serializer/unserializer base classes. -""" - -from io import StringIO - -from django.core.exceptions import ObjectDoesNotExist -from django.db import models - -DEFER_FIELD = object() - - -class SerializerDoesNotExist(KeyError): - """The requested serializer was not found.""" - - pass - - -class SerializationError(Exception): - """Something bad happened during serialization.""" - - pass - - -class DeserializationError(Exception): - """Something bad happened during deserialization.""" - - @classmethod - def WithData(cls, original_exc, model, fk, field_value): - """ - Factory method for creating a deserialization error which has a more - explanatory message. - """ - return cls( - "%s: (%s:pk=%s) field_value was '%s'" - % (original_exc, model, fk, field_value) - ) - - -class M2MDeserializationError(Exception): - """Something bad happened during deserialization of a ManyToManyField.""" - - def __init__(self, original_exc, pk): - self.original_exc = original_exc - self.pk = pk - - -class ProgressBar: - progress_width = 75 - - def __init__(self, output, total_count): - self.output = output - self.total_count = total_count - self.prev_done = 0 - - def update(self, count): - if not self.output: - return - perc = count * 100 // self.total_count - done = perc * self.progress_width // 100 - if self.prev_done >= done: - return - self.prev_done = done - cr = "" if self.total_count == 1 else "\r" - self.output.write( - cr + "[" + "." * done + " " * (self.progress_width - done) + "]" - ) - if done == self.progress_width: - self.output.write("\n") - self.output.flush() - - -class Serializer: - """ - Abstract serializer base class. - """ - - # Indicates if the implemented serializer is only available for - # internal Django use. - internal_use_only = False - progress_class = ProgressBar - stream_class = StringIO - - def serialize( - self, - queryset, - *, - stream=None, - fields=None, - use_natural_foreign_keys=False, - use_natural_primary_keys=False, - progress_output=None, - object_count=0, - **options, - ): - """ - Serialize a queryset. - """ - self.options = options - - self.stream = stream if stream is not None else self.stream_class() - self.selected_fields = fields - self.use_natural_foreign_keys = use_natural_foreign_keys - self.use_natural_primary_keys = use_natural_primary_keys - progress_bar = self.progress_class(progress_output, object_count) - - self.start_serialization() - self.first = True - for count, obj in enumerate(queryset, start=1): - self.start_object(obj) - # Use the concrete parent class' _meta instead of the object's _meta - # This is to avoid local_fields problems for proxy models. Refs #17717. - concrete_model = obj._meta.concrete_model - # When using natural primary keys, retrieve the pk field of the - # parent for multi-table inheritance child models. That field must - # be serialized, otherwise deserialization isn't possible. - if self.use_natural_primary_keys: - pk = concrete_model._meta.pk - pk_parent = ( - pk if pk.remote_field and pk.remote_field.parent_link else None - ) - else: - pk_parent = None - for field in concrete_model._meta.local_fields: - if field.serialize or field is pk_parent: - if field.remote_field is None: - if ( - self.selected_fields is None - or field.attname in self.selected_fields - ): - self.handle_field(obj, field) - else: - if ( - self.selected_fields is None - or field.attname[:-3] in self.selected_fields - ): - self.handle_fk_field(obj, field) - for field in concrete_model._meta.local_many_to_many: - if field.serialize: - if ( - self.selected_fields is None - or field.attname in self.selected_fields - ): - self.handle_m2m_field(obj, field) - self.end_object(obj) - progress_bar.update(count) - self.first = self.first and False - self.end_serialization() - return self.getvalue() - - def start_serialization(self): - """ - Called when serializing of the queryset starts. - """ - raise NotImplementedError( - "subclasses of Serializer must provide a start_serialization() method" - ) - - def end_serialization(self): - """ - Called when serializing of the queryset ends. - """ - pass - - def start_object(self, obj): - """ - Called when serializing of an object starts. - """ - raise NotImplementedError( - "subclasses of Serializer must provide a start_object() method" - ) - - def end_object(self, obj): - """ - Called when serializing of an object ends. - """ - pass - - def handle_field(self, obj, field): - """ - Called to handle each individual (non-relational) field on an object. - """ - raise NotImplementedError( - "subclasses of Serializer must provide a handle_field() method" - ) - - def handle_fk_field(self, obj, field): - """ - Called to handle a ForeignKey field. - """ - raise NotImplementedError( - "subclasses of Serializer must provide a handle_fk_field() method" - ) - - def handle_m2m_field(self, obj, field): - """ - Called to handle a ManyToManyField. - """ - raise NotImplementedError( - "subclasses of Serializer must provide a handle_m2m_field() method" - ) - - def getvalue(self): - """ - Return the fully serialized queryset (or None if the output stream is - not seekable). - """ - if callable(getattr(self.stream, "getvalue", None)): - return self.stream.getvalue() - - -class Deserializer: - """ - Abstract base deserializer class. - """ - - def __init__(self, stream_or_string, **options): - """ - Init this serializer given a stream or a string - """ - self.options = options - if isinstance(stream_or_string, str): - self.stream = StringIO(stream_or_string) - else: - self.stream = stream_or_string - - def __iter__(self): - return self - - def __next__(self): - """Iteration interface -- return the next item in the stream""" - raise NotImplementedError( - "subclasses of Deserializer must provide a __next__() method" - ) - - -class DeserializedObject: - """ - A deserialized model. - - Basically a container for holding the pre-saved deserialized data along - with the many-to-many data saved with the object. - - Call ``save()`` to save the object (with the many-to-many data) to the - database; call ``save(save_m2m=False)`` to save just the object fields - (and not touch the many-to-many stuff.) - """ - - def __init__(self, obj, m2m_data=None, deferred_fields=None): - self.object = obj - self.m2m_data = m2m_data - self.deferred_fields = deferred_fields - - def __repr__(self): - return "<%s: %s(pk=%s)>" % ( - self.__class__.__name__, - self.object._meta.label, - self.object.pk, - ) - - def save(self, save_m2m=True, using=None, **kwargs): - # Call save on the Model baseclass directly. This bypasses any - # model-defined save. The save is also forced to be raw. - # raw=True is passed to any pre/post_save signals. - models.Model.save_base(self.object, using=using, raw=True, **kwargs) - if self.m2m_data and save_m2m: - for accessor_name, object_list in self.m2m_data.items(): - getattr(self.object, accessor_name).set(object_list) - - # prevent a second (possibly accidental) call to save() from saving - # the m2m data twice. - self.m2m_data = None - - def save_deferred_fields(self, using=None): - self.m2m_data = {} - for field, field_value in self.deferred_fields.items(): - opts = self.object._meta - label = opts.app_label + "." + opts.model_name - if isinstance(field.remote_field, models.ManyToManyRel): - try: - values = deserialize_m2m_values( - field, field_value, using, handle_forward_references=False - ) - except M2MDeserializationError as e: - raise DeserializationError.WithData( - e.original_exc, label, self.object.pk, e.pk - ) - self.m2m_data[field.name] = values - elif isinstance(field.remote_field, models.ManyToOneRel): - try: - value = deserialize_fk_value( - field, field_value, using, handle_forward_references=False - ) - except Exception as e: - raise DeserializationError.WithData( - e, label, self.object.pk, field_value - ) - setattr(self.object, field.attname, value) - self.save() - - -def build_instance(Model, data, db): - """ - Build a model instance. - - If the model instance doesn't have a primary key and the model supports - natural keys, try to retrieve it from the database. - """ - default_manager = Model._meta.default_manager - pk = data.get(Model._meta.pk.attname) - if ( - pk is None - and hasattr(default_manager, "get_by_natural_key") - and hasattr(Model, "natural_key") - ): - obj = Model(**data) - obj._state.db = db - natural_key = obj.natural_key() - try: - data[Model._meta.pk.attname] = Model._meta.pk.to_python( - default_manager.db_manager(db).get_by_natural_key(*natural_key).pk - ) - except Model.DoesNotExist: - pass - return Model(**data) - - -def deserialize_m2m_values(field, field_value, using, handle_forward_references): - model = field.remote_field.model - if hasattr(model._default_manager, "get_by_natural_key"): - - def m2m_convert(value): - if hasattr(value, "__iter__") and not isinstance(value, str): - return ( - model._default_manager.db_manager(using) - .get_by_natural_key(*value) - .pk - ) - else: - return model._meta.pk.to_python(value) - - else: - - def m2m_convert(v): - return model._meta.pk.to_python(v) - - try: - pks_iter = iter(field_value) - except TypeError as e: - raise M2MDeserializationError(e, field_value) - try: - values = [] - for pk in pks_iter: - values.append(m2m_convert(pk)) - return values - except Exception as e: - if isinstance(e, ObjectDoesNotExist) and handle_forward_references: - return DEFER_FIELD - else: - raise M2MDeserializationError(e, pk) - - -def deserialize_fk_value(field, field_value, using, handle_forward_references): - if field_value is None: - return None - model = field.remote_field.model - default_manager = model._default_manager - field_name = field.remote_field.field_name - if ( - hasattr(default_manager, "get_by_natural_key") - and hasattr(field_value, "__iter__") - and not isinstance(field_value, str) - ): - try: - obj = default_manager.db_manager(using).get_by_natural_key(*field_value) - except ObjectDoesNotExist: - if handle_forward_references: - return DEFER_FIELD - else: - raise - value = getattr(obj, field_name) - # If this is a natural foreign key to an object that has a FK/O2O as - # the foreign key, use the FK value. - if model._meta.pk.remote_field: - value = value.pk - return value - return model._meta.get_field(field_name).to_python(field_value) diff --git a/.venv/lib/python3.10/site-packages/django/core/serializers/json.py b/.venv/lib/python3.10/site-packages/django/core/serializers/json.py deleted file mode 100644 index 7683368..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/serializers/json.py +++ /dev/null @@ -1,114 +0,0 @@ -""" -Serialize data to/from JSON -""" - -import datetime -import decimal -import json -import uuid - -from django.core.serializers.base import DeserializationError -from django.core.serializers.python import Deserializer as PythonDeserializer -from django.core.serializers.python import Serializer as PythonSerializer -from django.utils.duration import duration_iso_string -from django.utils.functional import Promise -from django.utils.timezone import is_aware - - -class Serializer(PythonSerializer): - """Convert a queryset to JSON.""" - - internal_use_only = False - - def _init_options(self): - self._current = None - self.json_kwargs = self.options.copy() - self.json_kwargs.pop("stream", None) - self.json_kwargs.pop("fields", None) - if self.options.get("indent"): - # Prevent trailing spaces - self.json_kwargs["separators"] = (",", ": ") - self.json_kwargs.setdefault("cls", DjangoJSONEncoder) - self.json_kwargs.setdefault("ensure_ascii", False) - - def start_serialization(self): - self._init_options() - self.stream.write("[") - - def end_serialization(self): - if self.options.get("indent"): - self.stream.write("\n") - self.stream.write("]") - if self.options.get("indent"): - self.stream.write("\n") - - def end_object(self, obj): - # self._current has the field data - indent = self.options.get("indent") - if not self.first: - self.stream.write(",") - if not indent: - self.stream.write(" ") - if indent: - self.stream.write("\n") - json.dump(self.get_dump_object(obj), self.stream, **self.json_kwargs) - self._current = None - - def getvalue(self): - # Grandparent super - return super(PythonSerializer, self).getvalue() - - -class Deserializer(PythonDeserializer): - """Deserialize a stream or string of JSON data.""" - - def __init__(self, stream_or_string, **options): - if not isinstance(stream_or_string, (bytes, str)): - stream_or_string = stream_or_string.read() - if isinstance(stream_or_string, bytes): - stream_or_string = stream_or_string.decode() - try: - objects = json.loads(stream_or_string) - except Exception as exc: - raise DeserializationError() from exc - super().__init__(objects, **options) - - def _handle_object(self, obj): - try: - yield from super()._handle_object(obj) - except (GeneratorExit, DeserializationError): - raise - except Exception as exc: - raise DeserializationError(f"Error deserializing object: {exc}") from exc - - -class DjangoJSONEncoder(json.JSONEncoder): - """ - JSONEncoder subclass that knows how to encode date/time, decimal types, and - UUIDs. - """ - - def default(self, o): - # See "Date Time String Format" in the ECMA-262 specification. - if isinstance(o, datetime.datetime): - r = o.isoformat() - if o.microsecond: - r = r[:23] + r[26:] - if r.endswith("+00:00"): - r = r.removesuffix("+00:00") + "Z" - return r - elif isinstance(o, datetime.date): - return o.isoformat() - elif isinstance(o, datetime.time): - if is_aware(o): - raise ValueError("JSON can't represent timezone-aware times.") - r = o.isoformat() - if o.microsecond: - r = r[:12] - return r - elif isinstance(o, datetime.timedelta): - return duration_iso_string(o) - elif isinstance(o, (decimal.Decimal, uuid.UUID, Promise)): - return str(o) - else: - return super().default(o) diff --git a/.venv/lib/python3.10/site-packages/django/core/serializers/jsonl.py b/.venv/lib/python3.10/site-packages/django/core/serializers/jsonl.py deleted file mode 100644 index 7bc9bed..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/serializers/jsonl.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -Serialize data to/from JSON Lines -""" - -import json - -from django.core.serializers.base import DeserializationError -from django.core.serializers.json import DjangoJSONEncoder -from django.core.serializers.python import Deserializer as PythonDeserializer -from django.core.serializers.python import Serializer as PythonSerializer - - -class Serializer(PythonSerializer): - """Convert a queryset to JSON Lines.""" - - internal_use_only = False - - def _init_options(self): - self._current = None - self.json_kwargs = self.options.copy() - self.json_kwargs.pop("stream", None) - self.json_kwargs.pop("fields", None) - self.json_kwargs.pop("indent", None) - self.json_kwargs["separators"] = (",", ": ") - self.json_kwargs.setdefault("cls", DjangoJSONEncoder) - self.json_kwargs.setdefault("ensure_ascii", False) - - def start_serialization(self): - self._init_options() - - def end_object(self, obj): - # self._current has the field data - json.dump(self.get_dump_object(obj), self.stream, **self.json_kwargs) - self.stream.write("\n") - self._current = None - - def getvalue(self): - # Grandparent super - return super(PythonSerializer, self).getvalue() - - -class Deserializer(PythonDeserializer): - """Deserialize a stream or string of JSON data.""" - - def __init__(self, stream_or_string, **options): - if isinstance(stream_or_string, bytes): - stream_or_string = stream_or_string.decode() - if isinstance(stream_or_string, str): - stream_or_string = stream_or_string.splitlines() - super().__init__(Deserializer._get_lines(stream_or_string), **options) - - def _handle_object(self, obj): - try: - yield from super()._handle_object(obj) - except (GeneratorExit, DeserializationError): - raise - except Exception as exc: - raise DeserializationError(f"Error deserializing object: {exc}") from exc - - @staticmethod - def _get_lines(stream): - for line in stream: - if not line.strip(): - continue - try: - yield json.loads(line) - except Exception as exc: - raise DeserializationError() from exc diff --git a/.venv/lib/python3.10/site-packages/django/core/serializers/python.py b/.venv/lib/python3.10/site-packages/django/core/serializers/python.py deleted file mode 100644 index 807d4b3..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/serializers/python.py +++ /dev/null @@ -1,222 +0,0 @@ -""" -A Python "serializer". Doesn't do much serializing per se -- just converts to -and from basic Python data types (lists, dicts, strings, etc.). Useful as a basis for -other serializers. -""" - -from django.apps import apps -from django.core.serializers import base -from django.db import DEFAULT_DB_ALIAS, models -from django.db.models import CompositePrimaryKey -from django.utils.encoding import is_protected_type - - -class Serializer(base.Serializer): - """ - Serialize a QuerySet to basic Python objects. - """ - - internal_use_only = True - - def start_serialization(self): - self._current = None - self.objects = [] - - def end_serialization(self): - pass - - def start_object(self, obj): - self._current = {} - - def end_object(self, obj): - self.objects.append(self.get_dump_object(obj)) - self._current = None - - def get_dump_object(self, obj): - data = {"model": str(obj._meta)} - if not self.use_natural_primary_keys or not hasattr(obj, "natural_key"): - data["pk"] = self._value_from_field(obj, obj._meta.pk) - data["fields"] = self._current - return data - - def _value_from_field(self, obj, field): - if isinstance(field, CompositePrimaryKey): - return [self._value_from_field(obj, f) for f in field] - value = field.value_from_object(obj) - # Protected types (i.e., primitives like None, numbers, dates, - # and Decimals) are passed through as is. All other values are - # converted to string first. - return value if is_protected_type(value) else field.value_to_string(obj) - - def handle_field(self, obj, field): - self._current[field.name] = self._value_from_field(obj, field) - - def handle_fk_field(self, obj, field): - if self.use_natural_foreign_keys and hasattr( - field.remote_field.model, "natural_key" - ): - related = getattr(obj, field.name) - if related: - value = related.natural_key() - else: - value = None - else: - value = self._value_from_field(obj, field) - self._current[field.name] = value - - def handle_m2m_field(self, obj, field): - if field.remote_field.through._meta.auto_created: - if self.use_natural_foreign_keys and hasattr( - field.remote_field.model, "natural_key" - ): - - def m2m_value(value): - return value.natural_key() - - def queryset_iterator(obj, field): - attr = getattr(obj, field.name) - chunk_size = ( - 2000 if getattr(attr, "prefetch_cache_name", None) else None - ) - return attr.iterator(chunk_size) - - else: - - def m2m_value(value): - return self._value_from_field(value, value._meta.pk) - - def queryset_iterator(obj, field): - query_set = getattr(obj, field.name).select_related(None).only("pk") - chunk_size = 2000 if query_set._prefetch_related_lookups else None - return query_set.iterator(chunk_size=chunk_size) - - m2m_iter = getattr(obj, "_prefetched_objects_cache", {}).get( - field.name, - queryset_iterator(obj, field), - ) - self._current[field.name] = [m2m_value(related) for related in m2m_iter] - - def getvalue(self): - return self.objects - - -class Deserializer(base.Deserializer): - """ - Deserialize simple Python objects back into Django ORM instances. - - It's expected that you pass the Python objects themselves (instead of a - stream or a string) to the constructor - """ - - def __init__( - self, object_list, *, using=DEFAULT_DB_ALIAS, ignorenonexistent=False, **options - ): - super().__init__(object_list, **options) - self.handle_forward_references = options.pop("handle_forward_references", False) - self.using = using - self.ignorenonexistent = ignorenonexistent - self.field_names_cache = {} # Model: - self._iterator = None - - def __iter__(self): - for obj in self.stream: - yield from self._handle_object(obj) - - def __next__(self): - if self._iterator is None: - self._iterator = iter(self) - return next(self._iterator) - - def _handle_object(self, obj): - data = {} - m2m_data = {} - deferred_fields = {} - - # Look up the model and starting build a dict of data for it. - try: - Model = self._get_model_from_node(obj["model"]) - except base.DeserializationError: - if self.ignorenonexistent: - return - raise - if "pk" in obj: - try: - data[Model._meta.pk.attname] = Model._meta.pk.to_python(obj.get("pk")) - except Exception as e: - raise base.DeserializationError.WithData( - e, obj["model"], obj.get("pk"), None - ) - - if Model not in self.field_names_cache: - self.field_names_cache[Model] = {f.name for f in Model._meta.get_fields()} - field_names = self.field_names_cache[Model] - - # Handle each field - for field_name, field_value in obj["fields"].items(): - if self.ignorenonexistent and field_name not in field_names: - # skip fields no longer on model - continue - - field = Model._meta.get_field(field_name) - - # Handle M2M relations - if field.remote_field and isinstance( - field.remote_field, models.ManyToManyRel - ): - try: - values = self._handle_m2m_field_node(field, field_value) - if values == base.DEFER_FIELD: - deferred_fields[field] = field_value - else: - m2m_data[field.name] = values - except base.M2MDeserializationError as e: - raise base.DeserializationError.WithData( - e.original_exc, obj["model"], obj.get("pk"), e.pk - ) - - # Handle FK fields - elif field.remote_field and isinstance( - field.remote_field, models.ManyToOneRel - ): - try: - value = self._handle_fk_field_node(field, field_value) - if value == base.DEFER_FIELD: - deferred_fields[field] = field_value - else: - data[field.attname] = value - except Exception as e: - raise base.DeserializationError.WithData( - e, obj["model"], obj.get("pk"), field_value - ) - - # Handle all other fields - else: - try: - data[field.name] = field.to_python(field_value) - except Exception as e: - raise base.DeserializationError.WithData( - e, obj["model"], obj.get("pk"), field_value - ) - - model_instance = base.build_instance(Model, data, self.using) - yield base.DeserializedObject(model_instance, m2m_data, deferred_fields) - - def _handle_m2m_field_node(self, field, field_value): - return base.deserialize_m2m_values( - field, field_value, self.using, self.handle_forward_references - ) - - def _handle_fk_field_node(self, field, field_value): - return base.deserialize_fk_value( - field, field_value, self.using, self.handle_forward_references - ) - - @staticmethod - def _get_model_from_node(model_identifier): - """Look up a model from an "app_label.model_name" string.""" - try: - return apps.get_model(model_identifier) - except (LookupError, TypeError): - raise base.DeserializationError( - f"Invalid model identifier: {model_identifier}" - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/serializers/pyyaml.py b/.venv/lib/python3.10/site-packages/django/core/serializers/pyyaml.py deleted file mode 100644 index c72d1fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/serializers/pyyaml.py +++ /dev/null @@ -1,87 +0,0 @@ -""" -YAML serializer. - -Requires PyYaml (https://pyyaml.org/), but that's checked for in __init__. -""" - -import collections -import datetime -import decimal - -import yaml - -from django.core.serializers.base import DeserializationError -from django.core.serializers.python import Deserializer as PythonDeserializer -from django.core.serializers.python import Serializer as PythonSerializer - -# Use the C (faster) implementation if possible -try: - from yaml import CSafeDumper as SafeDumper - from yaml import CSafeLoader as SafeLoader -except ImportError: - from yaml import SafeDumper, SafeLoader - - -class DjangoSafeDumper(SafeDumper): - def represent_decimal(self, data): - return self.represent_scalar("tag:yaml.org,2002:str", str(data)) - - def represent_ordered_dict(self, data): - return self.represent_mapping("tag:yaml.org,2002:map", data.items()) - - -DjangoSafeDumper.add_representer(decimal.Decimal, DjangoSafeDumper.represent_decimal) -DjangoSafeDumper.add_representer( - collections.OrderedDict, DjangoSafeDumper.represent_ordered_dict -) -# Workaround to represent dictionaries in insertion order. -# See https://github.com/yaml/pyyaml/pull/143. -DjangoSafeDumper.add_representer(dict, DjangoSafeDumper.represent_ordered_dict) - - -class Serializer(PythonSerializer): - """Convert a queryset to YAML.""" - - internal_use_only = False - - def _value_from_field(self, obj, field): - # A nasty special case: base YAML doesn't support serialization of time - # types (as opposed to dates or datetimes, which it does support). Since - # we want to use the "safe" serializer for better interoperability, we - # need to do something with those pesky times. Converting 'em to strings - # isn't perfect, but it's better than a "!!python/time" type which would - # halt deserialization under any other language. - value = super()._value_from_field(obj, field) - if isinstance(value, datetime.time): - value = str(value) - return value - - def end_serialization(self): - self.options.setdefault("allow_unicode", True) - yaml.dump(self.objects, self.stream, Dumper=DjangoSafeDumper, **self.options) - - def getvalue(self): - # Grandparent super - return super(PythonSerializer, self).getvalue() - - -class Deserializer(PythonDeserializer): - """Deserialize a stream or string of YAML data.""" - - def __init__(self, stream_or_string, **options): - stream = stream_or_string - if isinstance(stream_or_string, bytes): - stream = stream_or_string.decode() - try: - objects = yaml.load(stream, Loader=SafeLoader) - except Exception as exc: - raise DeserializationError() from exc - super().__init__(objects, **options) - - def _handle_object(self, obj): - try: - yield from super()._handle_object(obj) - except (GeneratorExit, DeserializationError): - raise - except Exception as exc: - raise DeserializationError(f"Error deserializing object: {exc}") from exc diff --git a/.venv/lib/python3.10/site-packages/django/core/serializers/xml_serializer.py b/.venv/lib/python3.10/site-packages/django/core/serializers/xml_serializer.py deleted file mode 100644 index 360d530..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/serializers/xml_serializer.py +++ /dev/null @@ -1,501 +0,0 @@ -""" -XML serializer. -""" - -import json -from xml.dom import pulldom -from xml.sax import handler -from xml.sax.expatreader import ExpatParser as _ExpatParser - -from django.apps import apps -from django.conf import settings -from django.core.exceptions import ObjectDoesNotExist -from django.core.serializers import base -from django.db import DEFAULT_DB_ALIAS, models -from django.utils.xmlutils import SimplerXMLGenerator, UnserializableContentError - - -class Serializer(base.Serializer): - """Serialize a QuerySet to XML.""" - - def indent(self, level): - if self.options.get("indent") is not None: - self.xml.ignorableWhitespace( - "\n" + " " * self.options.get("indent") * level - ) - - def start_serialization(self): - """ - Start serialization -- open the XML document and the root element. - """ - self.xml = SimplerXMLGenerator( - self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET) - ) - self.xml.startDocument() - self.xml.startElement("django-objects", {"version": "1.0"}) - - def end_serialization(self): - """ - End serialization -- end the document. - """ - self.indent(0) - self.xml.endElement("django-objects") - self.xml.endDocument() - - def start_object(self, obj): - """ - Called as each object is handled. - """ - if not hasattr(obj, "_meta"): - raise base.SerializationError( - "Non-model object (%s) encountered during serialization" % type(obj) - ) - - self.indent(1) - attrs = {"model": str(obj._meta)} - if not self.use_natural_primary_keys or not hasattr(obj, "natural_key"): - obj_pk = obj.pk - if obj_pk is not None: - attrs["pk"] = obj._meta.pk.value_to_string(obj) - - self.xml.startElement("object", attrs) - - def end_object(self, obj): - """ - Called after handling all fields for an object. - """ - self.indent(1) - self.xml.endElement("object") - - def handle_field(self, obj, field): - """ - Handle each field on an object (except for ForeignKeys and - ManyToManyFields). - """ - self.indent(2) - self.xml.startElement( - "field", - { - "name": field.name, - "type": field.get_internal_type(), - }, - ) - - # Get a "string version" of the object's data. - if getattr(obj, field.name) is not None: - value = field.value_to_string(obj) - if field.get_internal_type() == "JSONField": - # Dump value since JSONField.value_to_string() doesn't output - # strings. - value = json.dumps(value, cls=field.encoder) - try: - self.xml.characters(value) - except UnserializableContentError: - raise ValueError( - "%s.%s (pk:%s) contains unserializable characters" - % (obj.__class__.__name__, field.name, obj.pk) - ) - else: - self.xml.addQuickElement("None") - - self.xml.endElement("field") - - def handle_fk_field(self, obj, field): - """ - Handle a ForeignKey (they need to be treated slightly - differently from regular fields). - """ - self._start_relational_field(field) - related_att = getattr(obj, field.attname) - if related_att is not None: - if self.use_natural_foreign_keys and hasattr( - field.remote_field.model, "natural_key" - ): - related = getattr(obj, field.name) - # If related object has a natural key, use it - related = related.natural_key() - # Iterable natural keys are rolled out as subelements - for key_value in related: - self.xml.startElement("natural", {}) - self.xml.characters(str(key_value)) - self.xml.endElement("natural") - else: - self.xml.characters(str(related_att)) - else: - self.xml.addQuickElement("None") - self.xml.endElement("field") - - def handle_m2m_field(self, obj, field): - """ - Handle a ManyToManyField. Related objects are only serialized as - references to the object's PK (i.e. the related *data* is not dumped, - just the relation). - """ - if field.remote_field.through._meta.auto_created: - self._start_relational_field(field) - if self.use_natural_foreign_keys and hasattr( - field.remote_field.model, "natural_key" - ): - # If the objects in the m2m have a natural key, use it - def handle_m2m(value): - natural = value.natural_key() - # Iterable natural keys are rolled out as subelements - self.xml.startElement("object", {}) - for key_value in natural: - self.xml.startElement("natural", {}) - self.xml.characters(str(key_value)) - self.xml.endElement("natural") - self.xml.endElement("object") - - def queryset_iterator(obj, field): - attr = getattr(obj, field.name) - chunk_size = ( - 2000 if getattr(attr, "prefetch_cache_name", None) else None - ) - return attr.iterator(chunk_size) - - else: - - def handle_m2m(value): - self.xml.addQuickElement("object", attrs={"pk": str(value.pk)}) - - def queryset_iterator(obj, field): - query_set = getattr(obj, field.name).select_related(None).only("pk") - chunk_size = 2000 if query_set._prefetch_related_lookups else None - return query_set.iterator(chunk_size=chunk_size) - - m2m_iter = getattr(obj, "_prefetched_objects_cache", {}).get( - field.name, - queryset_iterator(obj, field), - ) - for relobj in m2m_iter: - handle_m2m(relobj) - - self.xml.endElement("field") - - def _start_relational_field(self, field): - """Output the element for relational fields.""" - self.indent(2) - self.xml.startElement( - "field", - { - "name": field.name, - "rel": field.remote_field.__class__.__name__, - "to": str(field.remote_field.model._meta), - }, - ) - - -class Deserializer(base.Deserializer): - """Deserialize XML.""" - - def __init__( - self, - stream_or_string, - *, - using=DEFAULT_DB_ALIAS, - ignorenonexistent=False, - **options, - ): - super().__init__(stream_or_string, **options) - self.handle_forward_references = options.pop("handle_forward_references", False) - self.event_stream = pulldom.parse(self.stream, self._make_parser()) - self.db = using - self.ignore = ignorenonexistent - - def _make_parser(self): - """Create a hardened XML parser (no custom/external entities).""" - return DefusedExpatParser() - - def __next__(self): - for event, node in self.event_stream: - if event == "START_ELEMENT" and node.nodeName == "object": - self.event_stream.expandNode(node) - return self._handle_object(node) - raise StopIteration - - def _handle_object(self, node): - """Convert an node to a DeserializedObject.""" - # Look up the model using the model loading mechanism. If this fails, - # bail. - Model = self._get_model_from_node(node, "model") - - # Start building a data dictionary from the object. - data = {} - if node.hasAttribute("pk"): - data[Model._meta.pk.attname] = Model._meta.pk.to_python( - node.getAttribute("pk") - ) - - # Also start building a dict of m2m data (this is saved as - # {m2m_accessor_attribute : [list_of_related_objects]}) - m2m_data = {} - deferred_fields = {} - - field_names = {f.name for f in Model._meta.get_fields()} - # Deserialize each field. - for field_node in node.getElementsByTagName("field"): - # If the field is missing the name attribute, bail (are you - # sensing a pattern here?) - field_name = field_node.getAttribute("name") - if not field_name: - raise base.DeserializationError( - " node is missing the 'name' attribute" - ) - - # Get the field from the Model. This will raise a - # FieldDoesNotExist if, well, the field doesn't exist, which will - # be propagated correctly unless ignorenonexistent=True is used. - if self.ignore and field_name not in field_names: - continue - field = Model._meta.get_field(field_name) - - # As is usually the case, relation fields get the special treatment. - if field.remote_field and isinstance( - field.remote_field, models.ManyToManyRel - ): - value = self._handle_m2m_field_node(field_node, field) - if value == base.DEFER_FIELD: - deferred_fields[field] = [ - [ - getInnerText(nat_node).strip() - for nat_node in obj_node.getElementsByTagName("natural") - ] - for obj_node in field_node.getElementsByTagName("object") - ] - else: - m2m_data[field.name] = value - elif field.remote_field and isinstance( - field.remote_field, models.ManyToOneRel - ): - value = self._handle_fk_field_node(field_node, field) - if value == base.DEFER_FIELD: - deferred_fields[field] = [ - getInnerText(k).strip() - for k in field_node.getElementsByTagName("natural") - ] - else: - data[field.attname] = value - else: - if field_node.getElementsByTagName("None"): - value = None - else: - value = field.to_python(getInnerText(field_node).strip()) - # Load value since JSONField.to_python() outputs strings. - if field.get_internal_type() == "JSONField": - value = json.loads(value, cls=field.decoder) - data[field.name] = value - - obj = base.build_instance(Model, data, self.db) - - # Return a DeserializedObject so that the m2m data has a place to live. - return base.DeserializedObject(obj, m2m_data, deferred_fields) - - def _handle_fk_field_node(self, node, field): - """ - Handle a node for a ForeignKey - """ - # Check if there is a child node named 'None', returning None if so. - if node.getElementsByTagName("None"): - return None - else: - model = field.remote_field.model - if hasattr(model._default_manager, "get_by_natural_key"): - keys = node.getElementsByTagName("natural") - if keys: - # If there are 'natural' subelements, it must be a natural key - field_value = [getInnerText(k).strip() for k in keys] - try: - obj = model._default_manager.db_manager( - self.db - ).get_by_natural_key(*field_value) - except ObjectDoesNotExist: - if self.handle_forward_references: - return base.DEFER_FIELD - else: - raise - obj_pk = getattr(obj, field.remote_field.field_name) - # If this is a natural foreign key to an object that - # has a FK/O2O as the foreign key, use the FK value - if field.remote_field.model._meta.pk.remote_field: - obj_pk = obj_pk.pk - else: - # Otherwise, treat like a normal PK - field_value = getInnerText(node).strip() - obj_pk = model._meta.get_field( - field.remote_field.field_name - ).to_python(field_value) - return obj_pk - else: - field_value = getInnerText(node).strip() - return model._meta.get_field(field.remote_field.field_name).to_python( - field_value - ) - - def _handle_m2m_field_node(self, node, field): - """ - Handle a node for a ManyToManyField. - """ - model = field.remote_field.model - default_manager = model._default_manager - if hasattr(default_manager, "get_by_natural_key"): - - def m2m_convert(n): - keys = n.getElementsByTagName("natural") - if keys: - # If there are 'natural' subelements, it must be a natural key - field_value = [getInnerText(k).strip() for k in keys] - obj_pk = ( - default_manager.db_manager(self.db) - .get_by_natural_key(*field_value) - .pk - ) - else: - # Otherwise, treat like a normal PK value. - obj_pk = model._meta.pk.to_python(n.getAttribute("pk")) - return obj_pk - - else: - - def m2m_convert(n): - return model._meta.pk.to_python(n.getAttribute("pk")) - - values = [] - try: - for c in node.getElementsByTagName("object"): - values.append(m2m_convert(c)) - except Exception as e: - if isinstance(e, ObjectDoesNotExist) and self.handle_forward_references: - return base.DEFER_FIELD - else: - raise base.M2MDeserializationError(e, c) - else: - return values - - def _get_model_from_node(self, node, attr): - """ - Look up a model from a or a - node. - """ - model_identifier = node.getAttribute(attr) - if not model_identifier: - raise base.DeserializationError( - "<%s> node is missing the required '%s' attribute" - % (node.nodeName, attr) - ) - try: - return apps.get_model(model_identifier) - except (LookupError, TypeError): - raise base.DeserializationError( - "<%s> node has invalid model identifier: '%s'" - % (node.nodeName, model_identifier) - ) - - -def getInnerText(node): - """Get all the inner text of a DOM node (recursively).""" - # inspired by https://mail.python.org/pipermail/xml-sig/2005-March/011022.html - inner_text = [] - for child in node.childNodes: - if ( - child.nodeType == child.TEXT_NODE - or child.nodeType == child.CDATA_SECTION_NODE - ): - inner_text.append(child.data) - elif child.nodeType == child.ELEMENT_NODE: - inner_text.extend(getInnerText(child)) - else: - pass - return "".join(inner_text) - - -# Below code based on Christian Heimes' defusedxml - - -class DefusedExpatParser(_ExpatParser): - """ - An expat parser hardened against XML bomb attacks. - - Forbid DTDs, external entity references - """ - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.setFeature(handler.feature_external_ges, False) - self.setFeature(handler.feature_external_pes, False) - - def start_doctype_decl(self, name, sysid, pubid, has_internal_subset): - raise DTDForbidden(name, sysid, pubid) - - def entity_decl( - self, name, is_parameter_entity, value, base, sysid, pubid, notation_name - ): - raise EntitiesForbidden(name, value, base, sysid, pubid, notation_name) - - def unparsed_entity_decl(self, name, base, sysid, pubid, notation_name): - # expat 1.2 - raise EntitiesForbidden(name, None, base, sysid, pubid, notation_name) - - def external_entity_ref_handler(self, context, base, sysid, pubid): - raise ExternalReferenceForbidden(context, base, sysid, pubid) - - def reset(self): - _ExpatParser.reset(self) - parser = self._parser - parser.StartDoctypeDeclHandler = self.start_doctype_decl - parser.EntityDeclHandler = self.entity_decl - parser.UnparsedEntityDeclHandler = self.unparsed_entity_decl - parser.ExternalEntityRefHandler = self.external_entity_ref_handler - - -class DefusedXmlException(ValueError): - """Base exception.""" - - def __repr__(self): - return str(self) - - -class DTDForbidden(DefusedXmlException): - """Document type definition is forbidden.""" - - def __init__(self, name, sysid, pubid): - super().__init__() - self.name = name - self.sysid = sysid - self.pubid = pubid - - def __str__(self): - tpl = "DTDForbidden(name='{}', system_id={!r}, public_id={!r})" - return tpl.format(self.name, self.sysid, self.pubid) - - -class EntitiesForbidden(DefusedXmlException): - """Entity definition is forbidden.""" - - def __init__(self, name, value, base, sysid, pubid, notation_name): - super().__init__() - self.name = name - self.value = value - self.base = base - self.sysid = sysid - self.pubid = pubid - self.notation_name = notation_name - - def __str__(self): - tpl = "EntitiesForbidden(name='{}', system_id={!r}, public_id={!r})" - return tpl.format(self.name, self.sysid, self.pubid) - - -class ExternalReferenceForbidden(DefusedXmlException): - """Resolving an external reference is forbidden.""" - - def __init__(self, context, base, sysid, pubid): - super().__init__() - self.context = context - self.base = base - self.sysid = sysid - self.pubid = pubid - - def __str__(self): - tpl = "ExternalReferenceForbidden(system_id='{}', public_id={})" - return tpl.format(self.sysid, self.pubid) diff --git a/.venv/lib/python3.10/site-packages/django/core/servers/__init__.py b/.venv/lib/python3.10/site-packages/django/core/servers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/core/servers/basehttp.py b/.venv/lib/python3.10/site-packages/django/core/servers/basehttp.py deleted file mode 100644 index 495657d..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/servers/basehttp.py +++ /dev/null @@ -1,282 +0,0 @@ -""" -HTTP server that implements the Python WSGI protocol (PEP 333, rev 1.21). - -Based on wsgiref.simple_server which is part of the standard library since 2.5. - -This is a simple server for use in testing or debugging Django apps. It hasn't -been reviewed for security issues. DON'T USE IT FOR PRODUCTION USE! -""" - -import logging -import socket -import socketserver -import sys -from collections import deque -from wsgiref import simple_server - -from django.core.exceptions import ImproperlyConfigured -from django.core.handlers.wsgi import LimitedStream -from django.core.wsgi import get_wsgi_application -from django.db import connections -from django.utils.module_loading import import_string - -__all__ = ("WSGIServer", "WSGIRequestHandler") - -logger = logging.getLogger("django.server") - - -def get_internal_wsgi_application(): - """ - Load and return the WSGI application as configured by the user in - ``settings.WSGI_APPLICATION``. With the default ``startproject`` layout, - this will be the ``application`` object in ``projectname/wsgi.py``. - - This function, and the ``WSGI_APPLICATION`` setting itself, are only useful - for Django's internal server (runserver); external WSGI servers should just - be configured to point to the correct application object directly. - - If settings.WSGI_APPLICATION is not set (is ``None``), return - whatever ``django.core.wsgi.get_wsgi_application`` returns. - """ - from django.conf import settings - - app_path = getattr(settings, "WSGI_APPLICATION") - if app_path is None: - return get_wsgi_application() - - try: - return import_string(app_path) - except ImportError as err: - raise ImproperlyConfigured( - "WSGI application '%s' could not be loaded; " - "Error importing module." % app_path - ) from err - - -def is_broken_pipe_error(): - exc_type, _, _ = sys.exc_info() - return issubclass( - exc_type, - ( - BrokenPipeError, - ConnectionAbortedError, - ConnectionResetError, - ), - ) - - -class WSGIServer(simple_server.WSGIServer): - """BaseHTTPServer that implements the Python WSGI protocol""" - - request_queue_size = 10 - - def __init__(self, *args, ipv6=False, allow_reuse_address=True, **kwargs): - if ipv6: - self.address_family = socket.AF_INET6 - self.allow_reuse_address = allow_reuse_address - super().__init__(*args, **kwargs) - - def handle_error(self, request, client_address): - if is_broken_pipe_error(): - logger.info("- Broken pipe from %s", client_address) - else: - super().handle_error(request, client_address) - - -class ThreadedWSGIServer(socketserver.ThreadingMixIn, WSGIServer): - """A threaded version of the WSGIServer""" - - daemon_threads = True - - def __init__(self, *args, connections_override=None, **kwargs): - super().__init__(*args, **kwargs) - self.connections_override = connections_override - - # socketserver.ThreadingMixIn.process_request() passes this method as - # the target to a new Thread object. - def process_request_thread(self, request, client_address): - if self.connections_override: - # Override this thread's database connections with the ones - # provided by the parent thread. - for alias, conn in self.connections_override.items(): - connections[alias] = conn - super().process_request_thread(request, client_address) - - def _close_connections(self): - # Used for mocking in tests. - connections.close_all() - - def close_request(self, request): - self._close_connections() - super().close_request(request) - - -class ServerHandler(simple_server.ServerHandler): - http_version = "1.1" - - def __init__(self, stdin, stdout, stderr, environ, **kwargs): - """ - Use a LimitedStream so that unread request data will be ignored at - the end of the request. WSGIRequest uses a LimitedStream but it - shouldn't discard the data since the upstream servers usually do this. - This fix applies only for testserver/runserver. - """ - try: - content_length = int(environ.get("CONTENT_LENGTH")) - except (ValueError, TypeError): - content_length = 0 - super().__init__( - LimitedStream(stdin, content_length), stdout, stderr, environ, **kwargs - ) - - def cleanup_headers(self): - super().cleanup_headers() - if ( - self.environ["REQUEST_METHOD"] == "HEAD" - and "Content-Length" in self.headers - and str(self.headers["Content-Length"]) == "0" - ): - del self.headers["Content-Length"] - # HTTP/1.1 requires support for persistent connections. Send 'close' if - # the content length is unknown to prevent clients from reusing the - # connection. - if ( - self.environ["REQUEST_METHOD"] != "HEAD" - and "Content-Length" not in self.headers - ): - self.headers["Connection"] = "close" - # Persistent connections require threading server. - elif not isinstance(self.request_handler.server, socketserver.ThreadingMixIn): - self.headers["Connection"] = "close" - # Mark the connection for closing if it's set as such above or if the - # application sent the header. - if self.headers.get("Connection") == "close": - self.request_handler.close_connection = True - - def close(self): - self.get_stdin().read() - super().close() - - def finish_response(self): - if self.environ["REQUEST_METHOD"] == "HEAD": - try: - deque(self.result, maxlen=0) # Consume iterator. - # Don't call self.finish_content() as, if the headers have not - # been sent and Content-Length isn't set, it'll default to "0" - # which will prevent omission of the Content-Length header with - # HEAD requests as permitted by RFC 9110 Section 9.3.2. - # Instead, send the headers, if not sent yet. - if not self.headers_sent: - self.send_headers() - finally: - self.close() - else: - super().finish_response() - - -class WSGIRequestHandler(simple_server.WSGIRequestHandler): - protocol_version = "HTTP/1.1" - - def address_string(self): - # Short-circuit parent method to not call socket.getfqdn - return self.client_address[0] - - def log_message(self, format, *args): - extra = { - "request": self.request, - "server_time": self.log_date_time_string(), - } - if args[1][0] == "4": - # 0x16 = Handshake, 0x03 = SSL 3.0 or TLS 1.x - if args[0].startswith("\x16\x03"): - extra["status_code"] = 500 - logger.error( - "You're accessing the development server over HTTPS, but " - "it only supports HTTP.", - extra=extra, - ) - return - - if args[1].isdigit() and len(args[1]) == 3: - status_code = int(args[1]) - extra["status_code"] = status_code - - if status_code >= 500: - level = logger.error - elif status_code >= 400: - level = logger.warning - else: - level = logger.info - else: - level = logger.info - - level(format, *args, extra=extra) - - def get_environ(self): - # Strip all headers with underscores in the name before constructing - # the WSGI environ. This prevents header-spoofing based on ambiguity - # between underscores and dashes both normalized to underscores in WSGI - # env vars. Nginx and Apache 2.4+ both do this as well. - for k in self.headers: - if "_" in k: - del self.headers[k] - - return super().get_environ() - - def handle(self): - self.close_connection = True - self.handle_one_request() - while not self.close_connection: - self.handle_one_request() - try: - self.connection.shutdown(socket.SHUT_WR) - except (AttributeError, OSError): - pass - - def handle_one_request(self): - """Copy of WSGIRequestHandler.handle() but with different ServerHandler""" - self.raw_requestline = self.rfile.readline(65537) - if len(self.raw_requestline) > 65536: - self.requestline = "" - self.request_version = "" - self.command = "" - self.send_error(414) - return - - if not self.parse_request(): # An error code has been sent, just exit - return - - handler = ServerHandler( - self.rfile, self.wfile, self.get_stderr(), self.get_environ() - ) - handler.request_handler = self # backpointer for logging & connection closing - handler.run(self.server.get_app()) - - -def run( - addr, - port, - wsgi_handler, - ipv6=False, - threading=False, - on_bind=None, - server_cls=WSGIServer, -): - server_address = (addr, port) - if threading: - httpd_cls = type("WSGIServer", (socketserver.ThreadingMixIn, server_cls), {}) - else: - httpd_cls = server_cls - httpd = httpd_cls(server_address, WSGIRequestHandler, ipv6=ipv6) - if on_bind is not None: - on_bind(getattr(httpd, "server_port", port)) - if threading: - # ThreadingMixIn.daemon_threads indicates how threads will behave on an - # abrupt shutdown; like quitting the server by the user or restarting - # by the auto-reloader. True means the server will not wait for thread - # termination before it quits. This will make auto-reloader faster - # and will prevent the need to kill the server manually if a thread - # isn't terminating correctly. - httpd.daemon_threads = True - httpd.set_app(wsgi_handler) - httpd.serve_forever() diff --git a/.venv/lib/python3.10/site-packages/django/core/signals.py b/.venv/lib/python3.10/site-packages/django/core/signals.py deleted file mode 100644 index 960f5c3..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/signals.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.dispatch import Signal - -request_started = Signal() -request_finished = Signal() -got_request_exception = Signal() -setting_changed = Signal() diff --git a/.venv/lib/python3.10/site-packages/django/core/signing.py b/.venv/lib/python3.10/site-packages/django/core/signing.py deleted file mode 100644 index e3d7785..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/signing.py +++ /dev/null @@ -1,277 +0,0 @@ -""" -Functions for creating and restoring url-safe signed JSON objects. - -The format used looks like this: - ->>> signing.dumps("hello") -'ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv422nZA4sgmk' - -There are two components here, separated by a ':'. The first component is a -URLsafe base64 encoded JSON of the object passed to dumps(). The second -component is a base64 encoded hmac/SHA-256 hash of "$first_component:$secret" - -signing.loads(s) checks the signature and returns the deserialized object. -If the signature fails, a BadSignature exception is raised. - ->>> signing.loads("ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv422nZA4sgmk") -'hello' ->>> signing.loads("ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv42-modified") -... -BadSignature: Signature "ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv42-modified" does not match - -You can optionally compress the JSON prior to base64 encoding it to save -space, using the compress=True argument. This checks if compression actually -helps and only applies compression if the result is a shorter string: - ->>> signing.dumps(list(range(1, 20)), compress=True) -'.eJwFwcERACAIwLCF-rCiILN47r-GyZVJsNgkxaFxoDgxcOHGxMKD_T7vhAml:1QaUaL:BA0thEZrp4FQVXIXuOvYJtLJSrQ' - -The fact that the string is compressed is signalled by the prefixed '.' at the -start of the base64 JSON. - -There are 65 url-safe characters: the 64 used by url-safe base64 and the ':'. -These functions make use of all of them. -""" - -import base64 -import datetime -import json -import time -import zlib - -from django.conf import settings -from django.utils.crypto import constant_time_compare, salted_hmac -from django.utils.encoding import force_bytes -from django.utils.module_loading import import_string -from django.utils.regex_helper import _lazy_re_compile - -_SEP_UNSAFE = _lazy_re_compile(r"^[A-z0-9-_=]*$") -BASE62_ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - - -class BadSignature(Exception): - """Signature does not match.""" - - pass - - -class SignatureExpired(BadSignature): - """Signature timestamp is older than required max_age.""" - - pass - - -def b62_encode(s): - if s == 0: - return "0" - sign = "-" if s < 0 else "" - s = abs(s) - encoded = "" - while s > 0: - s, remainder = divmod(s, 62) - encoded = BASE62_ALPHABET[remainder] + encoded - return sign + encoded - - -def b62_decode(s): - if s == "0": - return 0 - sign = 1 - if s[0] == "-": - s = s[1:] - sign = -1 - decoded = 0 - for digit in s: - decoded = decoded * 62 + BASE62_ALPHABET.index(digit) - return sign * decoded - - -def b64_encode(s): - return base64.urlsafe_b64encode(s).strip(b"=") - - -def b64_decode(s): - pad = b"=" * (-len(s) % 4) - return base64.urlsafe_b64decode(s + pad) - - -def base64_hmac(salt, value, key, algorithm="sha1"): - return b64_encode( - salted_hmac(salt, value, key, algorithm=algorithm).digest() - ).decode() - - -def _cookie_signer_key(key): - # SECRET_KEYS items may be str or bytes. - return b"django.http.cookies" + force_bytes(key) - - -def get_cookie_signer(salt="django.core.signing.get_cookie_signer"): - Signer = import_string(settings.SIGNING_BACKEND) - return Signer( - key=_cookie_signer_key(settings.SECRET_KEY), - fallback_keys=map(_cookie_signer_key, settings.SECRET_KEY_FALLBACKS), - salt=salt, - ) - - -class JSONSerializer: - """ - Simple wrapper around json to be used in signing.dumps and - signing.loads. - """ - - def dumps(self, obj): - return json.dumps(obj, separators=(",", ":")).encode("latin-1") - - def loads(self, data): - return json.loads(data.decode("latin-1")) - - -def dumps( - obj, key=None, salt="django.core.signing", serializer=JSONSerializer, compress=False -): - """ - Return URL-safe, hmac signed base64 compressed JSON string. If key is - None, use settings.SECRET_KEY instead. The hmac algorithm is the default - Signer algorithm. - - If compress is True (not the default), check if compressing using zlib can - save some space. Prepend a '.' to signify compression. This is included - in the signature, to protect against zip bombs. - - Salt can be used to namespace the hash, so that a signed string is - only valid for a given namespace. Leaving this at the default - value or re-using a salt value across different parts of your - application without good cause is a security risk. - - The serializer is expected to return a bytestring. - """ - return TimestampSigner(key=key, salt=salt).sign_object( - obj, serializer=serializer, compress=compress - ) - - -def loads( - s, - key=None, - salt="django.core.signing", - serializer=JSONSerializer, - max_age=None, - fallback_keys=None, -): - """ - Reverse of dumps(), raise BadSignature if signature fails. - - The serializer is expected to accept a bytestring. - """ - return TimestampSigner( - key=key, salt=salt, fallback_keys=fallback_keys - ).unsign_object( - s, - serializer=serializer, - max_age=max_age, - ) - - -class Signer: - def __init__( - self, *, key=None, sep=":", salt=None, algorithm=None, fallback_keys=None - ): - self.key = key or settings.SECRET_KEY - self.fallback_keys = ( - fallback_keys - if fallback_keys is not None - else settings.SECRET_KEY_FALLBACKS - ) - self.sep = sep - self.salt = salt or "%s.%s" % ( - self.__class__.__module__, - self.__class__.__name__, - ) - self.algorithm = algorithm or "sha256" - if _SEP_UNSAFE.match(self.sep): - raise ValueError( - "Unsafe Signer separator: %r (cannot be empty or consist of " - "only A-z0-9-_=)" % sep, - ) - - def signature(self, value, key=None): - key = key or self.key - return base64_hmac(self.salt + "signer", value, key, algorithm=self.algorithm) - - def sign(self, value): - return "%s%s%s" % (value, self.sep, self.signature(value)) - - def unsign(self, signed_value): - if self.sep not in signed_value: - raise BadSignature('No "%s" found in value' % self.sep) - value, sig = signed_value.rsplit(self.sep, 1) - for key in [self.key, *self.fallback_keys]: - if constant_time_compare(sig, self.signature(value, key)): - return value - raise BadSignature('Signature "%s" does not match' % sig) - - def sign_object(self, obj, serializer=JSONSerializer, compress=False): - """ - Return URL-safe, hmac signed base64 compressed JSON string. - - If compress is True (not the default), check if compressing using zlib - can save some space. Prepend a '.' to signify compression. This is - included in the signature, to protect against zip bombs. - - The serializer is expected to return a bytestring. - """ - data = serializer().dumps(obj) - # Flag for if it's been compressed or not. - is_compressed = False - - if compress: - # Avoid zlib dependency unless compress is being used. - compressed = zlib.compress(data) - if len(compressed) < (len(data) - 1): - data = compressed - is_compressed = True - base64d = b64_encode(data).decode() - if is_compressed: - base64d = "." + base64d - return self.sign(base64d) - - def unsign_object(self, signed_obj, serializer=JSONSerializer, **kwargs): - # Signer.unsign() returns str but base64 and zlib compression operate - # on bytes. - base64d = self.unsign(signed_obj, **kwargs).encode() - decompress = base64d[:1] == b"." - if decompress: - # It's compressed; uncompress it first. - base64d = base64d[1:] - data = b64_decode(base64d) - if decompress: - data = zlib.decompress(data) - return serializer().loads(data) - - -class TimestampSigner(Signer): - def timestamp(self): - return b62_encode(int(time.time())) - - def sign(self, value): - value = "%s%s%s" % (value, self.sep, self.timestamp()) - return super().sign(value) - - def unsign(self, value, max_age=None): - """ - Retrieve original value and check it wasn't signed more - than max_age seconds ago. - """ - result = super().unsign(value) - value, timestamp = result.rsplit(self.sep, 1) - timestamp = b62_decode(timestamp) - if max_age is not None: - if isinstance(max_age, datetime.timedelta): - max_age = max_age.total_seconds() - # Check timestamp is not older than max_age - age = time.time() - timestamp - if age > max_age: - raise SignatureExpired("Signature age %s > %s seconds" % (age, max_age)) - return value diff --git a/.venv/lib/python3.10/site-packages/django/core/validators.py b/.venv/lib/python3.10/site-packages/django/core/validators.py deleted file mode 100644 index 534acdd..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/validators.py +++ /dev/null @@ -1,677 +0,0 @@ -import ipaddress -import math -import re -from pathlib import Path -from urllib.parse import urlsplit - -from django.core.exceptions import ValidationError -from django.utils.deconstruct import deconstructible -from django.utils.http import MAX_URL_LENGTH -from django.utils.ipv6 import is_valid_ipv6_address -from django.utils.regex_helper import _lazy_re_compile -from django.utils.translation import gettext_lazy as _ -from django.utils.translation import ngettext_lazy - -# These values, if given to validate(), will trigger the self.required check. -EMPTY_VALUES = (None, "", [], (), {}) - - -@deconstructible -class RegexValidator: - regex = "" - message = _("Enter a valid value.") - code = "invalid" - inverse_match = False - flags = 0 - - def __init__( - self, regex=None, message=None, code=None, inverse_match=None, flags=None - ): - if regex is not None: - self.regex = regex - if message is not None: - self.message = message - if code is not None: - self.code = code - if inverse_match is not None: - self.inverse_match = inverse_match - if flags is not None: - self.flags = flags - if self.flags and not isinstance(self.regex, str): - raise TypeError( - "If the flags are set, regex must be a regular expression string." - ) - - self.regex = _lazy_re_compile(self.regex, self.flags) - - def __call__(self, value): - """ - Validate that the input contains (or does *not* contain, if - inverse_match is True) a match for the regular expression. - """ - regex_matches = self.regex.search(str(value)) - invalid_input = regex_matches if self.inverse_match else not regex_matches - if invalid_input: - raise ValidationError(self.message, code=self.code, params={"value": value}) - - def __eq__(self, other): - return ( - isinstance(other, RegexValidator) - and self.regex.pattern == other.regex.pattern - and self.regex.flags == other.regex.flags - and (self.message == other.message) - and (self.code == other.code) - and (self.inverse_match == other.inverse_match) - ) - - -@deconstructible -class DomainNameValidator(RegexValidator): - message = _("Enter a valid domain name.") - ul = "\u00a1-\uffff" # Unicode letters range (must not be a raw string). - # Host patterns. - hostname_re = ( - r"[a-z" + ul + r"0-9](?:[a-z" + ul + r"0-9-]{0,61}[a-z" + ul + r"0-9])?" - ) - # Max length for domain name labels is 63 characters per RFC 1034 sec. 3.1. - domain_re = r"(?:\.(?!-)[a-z" + ul + r"0-9-]{1,63}(? self.max_length: - raise ValidationError(self.message, code=self.code, params={"value": value}) - if not self.accept_idna and not value.isascii(): - raise ValidationError(self.message, code=self.code, params={"value": value}) - super().__call__(value) - - -validate_domain_name = DomainNameValidator() - - -@deconstructible -class URLValidator(RegexValidator): - # IP patterns - ipv4_re = ( - r"(?:0|25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?)" - r"(?:\.(?:0|25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?)){3}" - ) - ipv6_re = r"\[[0-9a-f:.]+\]" # (simple regex, validated later) - - hostname_re = DomainNameValidator.hostname_re - domain_re = DomainNameValidator.domain_re - tld_re = DomainNameValidator.tld_re - - host_re = "(" + hostname_re + domain_re + tld_re + "|localhost)" - - regex = _lazy_re_compile( - r"^(?:[a-z0-9.+-]*)://" # scheme is validated separately - r"(?:[^\s:@/]+(?::[^\s:@/]*)?@)?" # user:pass authentication - r"(?:" + ipv4_re + "|" + ipv6_re + "|" + host_re + ")" - r"(?::[0-9]{1,5})?" # port - r"(?:[/?#][^\s]*)?" # resource path - r"\Z", - re.IGNORECASE, - ) - message = _("Enter a valid URL.") - schemes = ["http", "https", "ftp", "ftps"] - unsafe_chars = frozenset("\t\r\n") - max_length = MAX_URL_LENGTH - - def __init__(self, schemes=None, **kwargs): - super().__init__(**kwargs) - if schemes is not None: - self.schemes = schemes - - def __call__(self, value): - if not isinstance(value, str) or len(value) > self.max_length: - raise ValidationError(self.message, code=self.code, params={"value": value}) - if self.unsafe_chars.intersection(value): - raise ValidationError(self.message, code=self.code, params={"value": value}) - # Check if the scheme is valid. - scheme = value.split("://")[0].lower() - if scheme not in self.schemes: - raise ValidationError(self.message, code=self.code, params={"value": value}) - - # Then check full URL - try: - splitted_url = urlsplit(value) - except ValueError: - raise ValidationError(self.message, code=self.code, params={"value": value}) - super().__call__(value) - # Now verify IPv6 in the netloc part - host_match = re.search(r"^\[(.+)\](?::[0-9]{1,5})?$", splitted_url.netloc) - if host_match: - potential_ip = host_match[1] - try: - validate_ipv6_address(potential_ip) - except ValidationError: - raise ValidationError( - self.message, code=self.code, params={"value": value} - ) - - # The maximum length of a full host name is 253 characters per RFC 1034 - # section 3.1. It's defined to be 255 bytes or less, but this includes - # one byte for the length of the name and one byte for the trailing dot - # that's used to indicate absolute names in DNS. - if splitted_url.hostname is None or len(splitted_url.hostname) > 253: - raise ValidationError(self.message, code=self.code, params={"value": value}) - - -integer_validator = RegexValidator( - _lazy_re_compile(r"^-?\d+\Z"), - message=_("Enter a valid integer."), - code="invalid", -) - - -def validate_integer(value): - return integer_validator(value) - - -@deconstructible -class EmailValidator: - message = _("Enter a valid email address.") - code = "invalid" - hostname_re = DomainNameValidator.hostname_re - domain_re = DomainNameValidator.domain_re - tld_no_fqdn_re = DomainNameValidator.tld_no_fqdn_re - - user_regex = _lazy_re_compile( - # dot-atom - r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*\Z" - # quoted-string - r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])' - r'*"\Z)', - re.IGNORECASE, - ) - domain_regex = _lazy_re_compile( - r"^" + hostname_re + domain_re + tld_no_fqdn_re + r"\Z", - re.IGNORECASE, - ) - literal_regex = _lazy_re_compile( - # literal form, ipv4 or ipv6 address (SMTP 4.1.3) - r"\[([A-F0-9:.]+)\]\Z", - re.IGNORECASE, - ) - domain_allowlist = ["localhost"] - - def __init__(self, message=None, code=None, allowlist=None): - if message is not None: - self.message = message - if code is not None: - self.code = code - if allowlist is not None: - self.domain_allowlist = allowlist - - def __call__(self, value): - # The maximum length of an email is 320 characters per RFC 3696 - # section 3. - if not value or "@" not in value or len(value) > 320: - raise ValidationError(self.message, code=self.code, params={"value": value}) - - user_part, domain_part = value.rsplit("@", 1) - - if not self.user_regex.match(user_part): - raise ValidationError(self.message, code=self.code, params={"value": value}) - - if domain_part not in self.domain_allowlist and not self.validate_domain_part( - domain_part - ): - raise ValidationError(self.message, code=self.code, params={"value": value}) - - def validate_domain_part(self, domain_part): - if self.domain_regex.match(domain_part): - return True - - literal_match = self.literal_regex.match(domain_part) - if literal_match: - ip_address = literal_match[1] - try: - validate_ipv46_address(ip_address) - return True - except ValidationError: - pass - return False - - def __eq__(self, other): - return ( - isinstance(other, EmailValidator) - and (set(self.domain_allowlist) == set(other.domain_allowlist)) - and (self.message == other.message) - and (self.code == other.code) - ) - - -validate_email = EmailValidator() - -slug_re = _lazy_re_compile(r"^[-a-zA-Z0-9_]+\Z") -validate_slug = RegexValidator( - slug_re, - # Translators: "letters" means latin letters: a-z and A-Z. - _("Enter a valid “slug” consisting of letters, numbers, underscores or hyphens."), - "invalid", -) - -slug_unicode_re = _lazy_re_compile(r"^[-\w]+\Z") -validate_unicode_slug = RegexValidator( - slug_unicode_re, - _( - "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " - "hyphens." - ), - "invalid", -) - - -def validate_ipv4_address(value): - try: - ipaddress.IPv4Address(value) - except ValueError: - raise ValidationError( - _("Enter a valid %(protocol)s address."), - code="invalid", - params={"protocol": _("IPv4"), "value": value}, - ) - - -def validate_ipv6_address(value): - if not is_valid_ipv6_address(value): - raise ValidationError( - _("Enter a valid %(protocol)s address."), - code="invalid", - params={"protocol": _("IPv6"), "value": value}, - ) - - -def validate_ipv46_address(value): - try: - validate_ipv4_address(value) - except ValidationError: - try: - validate_ipv6_address(value) - except ValidationError: - raise ValidationError( - _("Enter a valid %(protocol)s address."), - code="invalid", - params={"protocol": _("IPv4 or IPv6"), "value": value}, - ) - - -ip_address_validator_map = { - "both": [validate_ipv46_address], - "ipv4": [validate_ipv4_address], - "ipv6": [validate_ipv6_address], -} - - -def ip_address_validators(protocol, unpack_ipv4): - """ - Depending on the given parameters, return the appropriate validators for - the GenericIPAddressField. - """ - if protocol != "both" and unpack_ipv4: - raise ValueError( - "You can only use `unpack_ipv4` if `protocol` is set to 'both'" - ) - try: - return ip_address_validator_map[protocol.lower()] - except KeyError: - raise ValueError( - "The protocol '%s' is unknown. Supported: %s" - % (protocol, list(ip_address_validator_map)) - ) - - -def int_list_validator(sep=",", message=None, code="invalid", allow_negative=False): - regexp = _lazy_re_compile( - r"^%(neg)s\d+(?:%(sep)s%(neg)s\d+)*\Z" - % { - "neg": "(-)?" if allow_negative else "", - "sep": re.escape(sep), - } - ) - return RegexValidator(regexp, message=message, code=code) - - -validate_comma_separated_integer_list = int_list_validator( - message=_("Enter only digits separated by commas."), -) - - -@deconstructible -class BaseValidator: - message = _("Ensure this value is %(limit_value)s (it is %(show_value)s).") - code = "limit_value" - - def __init__(self, limit_value, message=None): - self.limit_value = limit_value - if message: - self.message = message - - def __call__(self, value): - cleaned = self.clean(value) - limit_value = ( - self.limit_value() if callable(self.limit_value) else self.limit_value - ) - params = {"limit_value": limit_value, "show_value": cleaned, "value": value} - if self.compare(cleaned, limit_value): - raise ValidationError(self.message, code=self.code, params=params) - - def __eq__(self, other): - if not isinstance(other, self.__class__): - return NotImplemented - return ( - self.limit_value == other.limit_value - and self.message == other.message - and self.code == other.code - ) - - def compare(self, a, b): - return a is not b - - def clean(self, x): - return x - - -@deconstructible -class MaxValueValidator(BaseValidator): - message = _("Ensure this value is less than or equal to %(limit_value)s.") - code = "max_value" - - def compare(self, a, b): - return a > b - - -@deconstructible -class MinValueValidator(BaseValidator): - message = _("Ensure this value is greater than or equal to %(limit_value)s.") - code = "min_value" - - def compare(self, a, b): - return a < b - - -@deconstructible -class StepValueValidator(BaseValidator): - message = _("Ensure this value is a multiple of step size %(limit_value)s.") - code = "step_size" - - def __init__(self, limit_value, message=None, offset=None): - super().__init__(limit_value, message) - if offset is not None: - self.message = _( - "Ensure this value is a multiple of step size %(limit_value)s, " - "starting from %(offset)s, e.g. %(offset)s, %(valid_value1)s, " - "%(valid_value2)s, and so on." - ) - self.offset = offset - - def __call__(self, value): - if self.offset is None: - super().__call__(value) - else: - cleaned = self.clean(value) - limit_value = ( - self.limit_value() if callable(self.limit_value) else self.limit_value - ) - if self.compare(cleaned, limit_value): - offset = cleaned.__class__(self.offset) - params = { - "limit_value": limit_value, - "offset": offset, - "valid_value1": offset + limit_value, - "valid_value2": offset + 2 * limit_value, - } - raise ValidationError(self.message, code=self.code, params=params) - - def compare(self, a, b): - offset = 0 if self.offset is None else self.offset - return not math.isclose(math.remainder(a - offset, b), 0, abs_tol=1e-9) - - -@deconstructible -class MinLengthValidator(BaseValidator): - message = ngettext_lazy( - "Ensure this value has at least %(limit_value)d character (it has " - "%(show_value)d).", - "Ensure this value has at least %(limit_value)d characters (it has " - "%(show_value)d).", - "limit_value", - ) - code = "min_length" - - def compare(self, a, b): - return a < b - - def clean(self, x): - return len(x) - - -@deconstructible -class MaxLengthValidator(BaseValidator): - message = ngettext_lazy( - "Ensure this value has at most %(limit_value)d character (it has " - "%(show_value)d).", - "Ensure this value has at most %(limit_value)d characters (it has " - "%(show_value)d).", - "limit_value", - ) - code = "max_length" - - def compare(self, a, b): - return a > b - - def clean(self, x): - return len(x) - - -@deconstructible -class DecimalValidator: - """ - Validate that the input does not exceed the maximum number of digits - expected, otherwise raise ValidationError. - """ - - messages = { - "invalid": _("Enter a number."), - "max_digits": ngettext_lazy( - "Ensure that there are no more than %(max)s digit in total.", - "Ensure that there are no more than %(max)s digits in total.", - "max", - ), - "max_decimal_places": ngettext_lazy( - "Ensure that there are no more than %(max)s decimal place.", - "Ensure that there are no more than %(max)s decimal places.", - "max", - ), - "max_whole_digits": ngettext_lazy( - "Ensure that there are no more than %(max)s digit before the decimal " - "point.", - "Ensure that there are no more than %(max)s digits before the decimal " - "point.", - "max", - ), - } - - def __init__(self, max_digits, decimal_places): - self.max_digits = max_digits - self.decimal_places = decimal_places - - def __call__(self, value): - digit_tuple, exponent = value.as_tuple()[1:] - if exponent in {"F", "n", "N"}: - raise ValidationError( - self.messages["invalid"], code="invalid", params={"value": value} - ) - if exponent >= 0: - digits = len(digit_tuple) - if digit_tuple != (0,): - # A positive exponent adds that many trailing zeros. - digits += exponent - decimals = 0 - else: - # If the absolute value of the negative exponent is larger than the - # number of digits, then it's the same as the number of digits, - # because it'll consume all of the digits in digit_tuple and then - # add abs(exponent) - len(digit_tuple) leading zeros after the - # decimal point. - if abs(exponent) > len(digit_tuple): - digits = decimals = abs(exponent) - else: - digits = len(digit_tuple) - decimals = abs(exponent) - whole_digits = digits - decimals - - if self.max_digits is not None and digits > self.max_digits: - raise ValidationError( - self.messages["max_digits"], - code="max_digits", - params={"max": self.max_digits, "value": value}, - ) - if self.decimal_places is not None and decimals > self.decimal_places: - raise ValidationError( - self.messages["max_decimal_places"], - code="max_decimal_places", - params={"max": self.decimal_places, "value": value}, - ) - if ( - self.max_digits is not None - and self.decimal_places is not None - and whole_digits > (self.max_digits - self.decimal_places) - ): - raise ValidationError( - self.messages["max_whole_digits"], - code="max_whole_digits", - params={"max": (self.max_digits - self.decimal_places), "value": value}, - ) - - def __eq__(self, other): - return ( - isinstance(other, self.__class__) - and self.max_digits == other.max_digits - and self.decimal_places == other.decimal_places - ) - - -@deconstructible -class FileExtensionValidator: - message = _( - "File extension “%(extension)s” is not allowed. " - "Allowed extensions are: %(allowed_extensions)s." - ) - code = "invalid_extension" - - def __init__(self, allowed_extensions=None, message=None, code=None): - if allowed_extensions is not None: - allowed_extensions = [ - allowed_extension.lower() for allowed_extension in allowed_extensions - ] - self.allowed_extensions = allowed_extensions - if message is not None: - self.message = message - if code is not None: - self.code = code - - def __call__(self, value): - extension = Path(value.name).suffix[1:].lower() - if ( - self.allowed_extensions is not None - and extension not in self.allowed_extensions - ): - raise ValidationError( - self.message, - code=self.code, - params={ - "extension": extension, - "allowed_extensions": ", ".join(self.allowed_extensions), - "value": value, - }, - ) - - def __eq__(self, other): - return ( - isinstance(other, self.__class__) - and set(self.allowed_extensions or []) - == set(other.allowed_extensions or []) - and self.message == other.message - and self.code == other.code - ) - - -def get_available_image_extensions(): - try: - from PIL import Image - except ImportError: - return [] - else: - Image.init() - return [ext.lower()[1:] for ext in Image.EXTENSION] - - -def validate_image_file_extension(value): - return FileExtensionValidator(allowed_extensions=get_available_image_extensions())( - value - ) - - -@deconstructible -class ProhibitNullCharactersValidator: - """Validate that the string doesn't contain the null character.""" - - message = _("Null characters are not allowed.") - code = "null_characters_not_allowed" - - def __init__(self, message=None, code=None): - if message is not None: - self.message = message - if code is not None: - self.code = code - - def __call__(self, value): - if "\x00" in str(value): - raise ValidationError(self.message, code=self.code, params={"value": value}) - - def __eq__(self, other): - return ( - isinstance(other, self.__class__) - and self.message == other.message - and self.code == other.code - ) diff --git a/.venv/lib/python3.10/site-packages/django/core/wsgi.py b/.venv/lib/python3.10/site-packages/django/core/wsgi.py deleted file mode 100644 index 35e0fa8..0000000 --- a/.venv/lib/python3.10/site-packages/django/core/wsgi.py +++ /dev/null @@ -1,13 +0,0 @@ -import django -from django.core.handlers.wsgi import WSGIHandler - - -def get_wsgi_application(): - """ - The public interface to Django's WSGI support. Return a WSGI callable. - - Avoids making django.core.handlers.WSGIHandler a public API, in case the - internal WSGI implementation changes or moves in the future. - """ - django.setup(set_prefix=False) - return WSGIHandler() diff --git a/.venv/lib/python3.10/site-packages/django/db/__init__.py b/.venv/lib/python3.10/site-packages/django/db/__init__.py deleted file mode 100644 index aa7d02d..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/__init__.py +++ /dev/null @@ -1,63 +0,0 @@ -from django.core import signals -from django.db.utils import ( - DEFAULT_DB_ALIAS, - DJANGO_VERSION_PICKLE_KEY, - ConnectionHandler, - ConnectionRouter, - DatabaseError, - DataError, - Error, - IntegrityError, - InterfaceError, - InternalError, - NotSupportedError, - OperationalError, - ProgrammingError, -) -from django.utils.connection import ConnectionProxy - -__all__ = [ - "close_old_connections", - "connection", - "connections", - "reset_queries", - "router", - "DatabaseError", - "IntegrityError", - "InternalError", - "ProgrammingError", - "DataError", - "NotSupportedError", - "Error", - "InterfaceError", - "OperationalError", - "DEFAULT_DB_ALIAS", - "DJANGO_VERSION_PICKLE_KEY", -] - -connections = ConnectionHandler() - -router = ConnectionRouter() - -# For backwards compatibility. Prefer connections['default'] instead. -connection = ConnectionProxy(connections, DEFAULT_DB_ALIAS) - - -# Register an event to reset saved queries when a Django request is started. -def reset_queries(**kwargs): - for conn in connections.all(initialized_only=True): - conn.queries_log.clear() - - -signals.request_started.connect(reset_queries) - - -# Register an event to reset transaction state and close connections past -# their lifetime. -def close_old_connections(**kwargs): - for conn in connections.all(initialized_only=True): - conn.close_if_unusable_or_obsolete() - - -signals.request_started.connect(close_old_connections) -signals.request_finished.connect(close_old_connections) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/__init__.py b/.venv/lib/python3.10/site-packages/django/db/backends/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/base/__init__.py b/.venv/lib/python3.10/site-packages/django/db/backends/base/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/base/base.py b/.venv/lib/python3.10/site-packages/django/db/backends/base/base.py deleted file mode 100644 index aa9cdb5..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/base/base.py +++ /dev/null @@ -1,792 +0,0 @@ -import _thread -import copy -import datetime -import logging -import threading -import time -import warnings -import zoneinfo -from collections import deque -from contextlib import contextmanager - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.db import DEFAULT_DB_ALIAS, DatabaseError, NotSupportedError -from django.db.backends import utils -from django.db.backends.base.validation import BaseDatabaseValidation -from django.db.backends.signals import connection_created -from django.db.backends.utils import debug_transaction -from django.db.transaction import TransactionManagementError -from django.db.utils import DatabaseErrorWrapper, ProgrammingError -from django.utils.asyncio import async_unsafe -from django.utils.functional import cached_property - -NO_DB_ALIAS = "__no_db__" -RAN_DB_VERSION_CHECK = set() - -logger = logging.getLogger("django.db.backends.base") - - -class BaseDatabaseWrapper: - """Represent a database connection.""" - - # Mapping of Field objects to their column types. - data_types = {} - # Mapping of Field objects to their SQL suffix such as AUTOINCREMENT. - data_types_suffix = {} - # Mapping of Field objects to their SQL for CHECK constraints. - data_type_check_constraints = {} - ops = None - vendor = "unknown" - display_name = "unknown" - SchemaEditorClass = None - # Classes instantiated in __init__(). - client_class = None - creation_class = None - features_class = None - introspection_class = None - ops_class = None - validation_class = BaseDatabaseValidation - - queries_limit = 9000 - - def __init__(self, settings_dict, alias=DEFAULT_DB_ALIAS): - # Connection related attributes. - # The underlying database connection. - self.connection = None - # `settings_dict` should be a dictionary containing keys such as - # NAME, USER, etc. It's called `settings_dict` instead of `settings` - # to disambiguate it from Django settings modules. - self.settings_dict = settings_dict - self.alias = alias - # Query logging in debug mode or when explicitly enabled. - self.queries_log = deque(maxlen=self.queries_limit) - self.force_debug_cursor = False - - # Transaction related attributes. - # Tracks if the connection is in autocommit mode. Per PEP 249, by - # default, it isn't. - self.autocommit = False - # Tracks if the connection is in a transaction managed by 'atomic'. - self.in_atomic_block = False - # Increment to generate unique savepoint ids. - self.savepoint_state = 0 - # List of savepoints created by 'atomic'. - self.savepoint_ids = [] - # Stack of active 'atomic' blocks. - self.atomic_blocks = [] - # Tracks if the outermost 'atomic' block should commit on exit, - # ie. if autocommit was active on entry. - self.commit_on_exit = True - # Tracks if the transaction should be rolled back to the next - # available savepoint because of an exception in an inner block. - self.needs_rollback = False - self.rollback_exc = None - - # Connection termination related attributes. - self.close_at = None - self.closed_in_transaction = False - self.errors_occurred = False - self.health_check_enabled = False - self.health_check_done = False - - # Thread-safety related attributes. - self._thread_sharing_lock = threading.Lock() - self._thread_sharing_count = 0 - self._thread_ident = _thread.get_ident() - - # A list of no-argument functions to run when the transaction commits. - # Each entry is an (sids, func, robust) tuple, where sids is a set of - # the active savepoint IDs when this function was registered and robust - # specifies whether it's allowed for the function to fail. - self.run_on_commit = [] - - # Should we run the on-commit hooks the next time set_autocommit(True) - # is called? - self.run_commit_hooks_on_set_autocommit_on = False - - # A stack of wrappers to be invoked around execute()/executemany() - # calls. Each entry is a function taking five arguments: execute, sql, - # params, many, and context. It's the function's responsibility to - # call execute(sql, params, many, context). - self.execute_wrappers = [] - - self.client = self.client_class(self) - self.creation = self.creation_class(self) - self.features = self.features_class(self) - self.introspection = self.introspection_class(self) - self.ops = self.ops_class(self) - self.validation = self.validation_class(self) - - def __repr__(self): - return ( - f"<{self.__class__.__qualname__} " - f"vendor={self.vendor!r} alias={self.alias!r}>" - ) - - def ensure_timezone(self): - """ - Ensure the connection's timezone is set to `self.timezone_name` and - return whether it changed or not. - """ - return False - - @cached_property - def timezone(self): - """ - Return a tzinfo of the database connection time zone. - - This is only used when time zone support is enabled. When a datetime is - read from the database, it is always returned in this time zone. - - When the database backend supports time zones, it doesn't matter which - time zone Django uses, as long as aware datetimes are used everywhere. - Other users connecting to the database can choose their own time zone. - - When the database backend doesn't support time zones, the time zone - Django uses may be constrained by the requirements of other users of - the database. - """ - if not settings.USE_TZ: - return None - elif self.settings_dict["TIME_ZONE"] is None: - return datetime.timezone.utc - else: - return zoneinfo.ZoneInfo(self.settings_dict["TIME_ZONE"]) - - @cached_property - def timezone_name(self): - """ - Name of the time zone of the database connection. - """ - if not settings.USE_TZ: - return settings.TIME_ZONE - elif self.settings_dict["TIME_ZONE"] is None: - return "UTC" - else: - return self.settings_dict["TIME_ZONE"] - - @property - def queries_logged(self): - return self.force_debug_cursor or settings.DEBUG - - @property - def queries(self): - if len(self.queries_log) == self.queries_log.maxlen: - warnings.warn( - "Limit for query logging exceeded, only the last {} queries " - "will be returned.".format(self.queries_log.maxlen), - stacklevel=2, - ) - return list(self.queries_log) - - def get_database_version(self): - """Return a tuple of the database's version.""" - raise NotImplementedError( - "subclasses of BaseDatabaseWrapper may require a get_database_version() " - "method." - ) - - def check_database_version_supported(self): - """ - Raise an error if the database version isn't supported by this - version of Django. - """ - if ( - self.features.minimum_database_version is not None - and self.get_database_version() < self.features.minimum_database_version - ): - db_version = ".".join(map(str, self.get_database_version())) - min_db_version = ".".join(map(str, self.features.minimum_database_version)) - raise NotSupportedError( - f"{self.display_name} {min_db_version} or later is required " - f"(found {db_version})." - ) - - # ##### Backend-specific methods for creating connections and cursors ##### - - def get_connection_params(self): - """Return a dict of parameters suitable for get_new_connection.""" - raise NotImplementedError( - "subclasses of BaseDatabaseWrapper may require a get_connection_params() " - "method" - ) - - def get_new_connection(self, conn_params): - """Open a connection to the database.""" - raise NotImplementedError( - "subclasses of BaseDatabaseWrapper may require a get_new_connection() " - "method" - ) - - def init_connection_state(self): - """Initialize the database connection settings.""" - if self.alias not in RAN_DB_VERSION_CHECK: - self.check_database_version_supported() - RAN_DB_VERSION_CHECK.add(self.alias) - - def create_cursor(self, name=None): - """Create a cursor. Assume that a connection is established.""" - raise NotImplementedError( - "subclasses of BaseDatabaseWrapper may require a create_cursor() method" - ) - - # ##### Backend-specific methods for creating connections ##### - - @async_unsafe - def connect(self): - """Connect to the database. Assume that the connection is closed.""" - # Check for invalid configurations. - self.check_settings() - # In case the previous connection was closed while in an atomic block - self.in_atomic_block = False - self.savepoint_ids = [] - self.atomic_blocks = [] - self.needs_rollback = False - # Reset parameters defining when to close/health-check the connection. - self.health_check_enabled = self.settings_dict["CONN_HEALTH_CHECKS"] - max_age = self.settings_dict["CONN_MAX_AGE"] - self.close_at = None if max_age is None else time.monotonic() + max_age - self.closed_in_transaction = False - self.errors_occurred = False - # New connections are healthy. - self.health_check_done = True - # Establish the connection - conn_params = self.get_connection_params() - self.connection = self.get_new_connection(conn_params) - self.set_autocommit(self.settings_dict["AUTOCOMMIT"]) - self.init_connection_state() - connection_created.send(sender=self.__class__, connection=self) - - self.run_on_commit = [] - - def check_settings(self): - if self.settings_dict["TIME_ZONE"] is not None and not settings.USE_TZ: - raise ImproperlyConfigured( - "Connection '%s' cannot set TIME_ZONE because USE_TZ is False." - % self.alias - ) - - @async_unsafe - def ensure_connection(self): - """Guarantee that a connection to the database is established.""" - if self.connection is None: - if self.in_atomic_block and self.closed_in_transaction: - raise ProgrammingError( - "Cannot open a new connection in an atomic block." - ) - with self.wrap_database_errors: - self.connect() - - # ##### Backend-specific wrappers for PEP-249 connection methods ##### - - def _prepare_cursor(self, cursor): - """ - Validate the connection is usable and perform database cursor wrapping. - """ - self.validate_thread_sharing() - if self.queries_logged: - wrapped_cursor = self.make_debug_cursor(cursor) - else: - wrapped_cursor = self.make_cursor(cursor) - return wrapped_cursor - - def _cursor(self, name=None): - self.close_if_health_check_failed() - self.ensure_connection() - with self.wrap_database_errors: - return self._prepare_cursor(self.create_cursor(name)) - - def _commit(self): - if self.connection is not None: - with debug_transaction(self, "COMMIT"), self.wrap_database_errors: - return self.connection.commit() - - def _rollback(self): - if self.connection is not None: - with debug_transaction(self, "ROLLBACK"), self.wrap_database_errors: - return self.connection.rollback() - - def _close(self): - if self.connection is not None: - with self.wrap_database_errors: - return self.connection.close() - - # ##### Generic wrappers for PEP-249 connection methods ##### - - @async_unsafe - def cursor(self): - """Create a cursor, opening a connection if necessary.""" - return self._cursor() - - @async_unsafe - def commit(self): - """Commit a transaction and reset the dirty flag.""" - self.validate_thread_sharing() - self.validate_no_atomic_block() - self._commit() - # A successful commit means that the database connection works. - self.errors_occurred = False - self.run_commit_hooks_on_set_autocommit_on = True - - @async_unsafe - def rollback(self): - """Roll back a transaction and reset the dirty flag.""" - self.validate_thread_sharing() - self.validate_no_atomic_block() - self._rollback() - # A successful rollback means that the database connection works. - self.errors_occurred = False - self.needs_rollback = False - self.run_on_commit = [] - - @async_unsafe - def close(self): - """Close the connection to the database.""" - self.validate_thread_sharing() - self.run_on_commit = [] - - # Don't call validate_no_atomic_block() to avoid making it difficult - # to get rid of a connection in an invalid state. The next connect() - # will reset the transaction state anyway. - if self.closed_in_transaction or self.connection is None: - return - try: - self._close() - finally: - if self.in_atomic_block: - self.closed_in_transaction = True - self.needs_rollback = True - else: - self.connection = None - - # ##### Backend-specific savepoint management methods ##### - - def _savepoint(self, sid): - with self.cursor() as cursor: - cursor.execute(self.ops.savepoint_create_sql(sid)) - - def _savepoint_rollback(self, sid): - with self.cursor() as cursor: - cursor.execute(self.ops.savepoint_rollback_sql(sid)) - - def _savepoint_commit(self, sid): - with self.cursor() as cursor: - cursor.execute(self.ops.savepoint_commit_sql(sid)) - - def _savepoint_allowed(self): - # Savepoints cannot be created outside a transaction - return self.features.uses_savepoints and not self.get_autocommit() - - # ##### Generic savepoint management methods ##### - - @async_unsafe - def savepoint(self): - """ - Create a savepoint inside the current transaction. Return an - identifier for the savepoint that will be used for the subsequent - rollback or commit. Do nothing if savepoints are not supported. - """ - if not self._savepoint_allowed(): - return - - thread_ident = _thread.get_ident() - tid = str(thread_ident).replace("-", "") - - self.savepoint_state += 1 - sid = "s%s_x%d" % (tid, self.savepoint_state) - - self.validate_thread_sharing() - self._savepoint(sid) - - return sid - - @async_unsafe - def savepoint_rollback(self, sid): - """ - Roll back to a savepoint. Do nothing if savepoints are not supported. - """ - if not self._savepoint_allowed(): - return - - self.validate_thread_sharing() - self._savepoint_rollback(sid) - - # Remove any callbacks registered while this savepoint was active. - self.run_on_commit = [ - (sids, func, robust) - for (sids, func, robust) in self.run_on_commit - if sid not in sids - ] - - @async_unsafe - def savepoint_commit(self, sid): - """ - Release a savepoint. Do nothing if savepoints are not supported. - """ - if not self._savepoint_allowed(): - return - - self.validate_thread_sharing() - self._savepoint_commit(sid) - - @async_unsafe - def clean_savepoints(self): - """ - Reset the counter used to generate unique savepoint ids in this thread. - """ - self.savepoint_state = 0 - - # ##### Backend-specific transaction management methods ##### - - def _set_autocommit(self, autocommit): - """ - Backend-specific implementation to enable or disable autocommit. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseWrapper may require a _set_autocommit() method" - ) - - # ##### Generic transaction management methods ##### - - def get_autocommit(self): - """Get the autocommit state.""" - self.ensure_connection() - return self.autocommit - - def set_autocommit( - self, autocommit, force_begin_transaction_with_broken_autocommit=False - ): - """ - Enable or disable autocommit. - - The usual way to start a transaction is to turn autocommit off. - SQLite does not properly start a transaction when disabling - autocommit. To avoid this buggy behavior and to actually enter a new - transaction, an explicit BEGIN is required. Using - force_begin_transaction_with_broken_autocommit=True will issue an - explicit BEGIN with SQLite. This option will be ignored for other - backends. - """ - self.validate_no_atomic_block() - self.close_if_health_check_failed() - self.ensure_connection() - - start_transaction_under_autocommit = ( - force_begin_transaction_with_broken_autocommit - and not autocommit - and hasattr(self, "_start_transaction_under_autocommit") - ) - - if start_transaction_under_autocommit: - self._start_transaction_under_autocommit() - elif autocommit: - self._set_autocommit(autocommit) - else: - with debug_transaction(self, "BEGIN"): - self._set_autocommit(autocommit) - self.autocommit = autocommit - - if autocommit and self.run_commit_hooks_on_set_autocommit_on: - self.run_and_clear_commit_hooks() - self.run_commit_hooks_on_set_autocommit_on = False - - def get_rollback(self): - """Get the "needs rollback" flag -- for *advanced use* only.""" - if not self.in_atomic_block: - raise TransactionManagementError( - "The rollback flag doesn't work outside of an 'atomic' block." - ) - return self.needs_rollback - - def set_rollback(self, rollback): - """ - Set or unset the "needs rollback" flag -- for *advanced use* only. - """ - if not self.in_atomic_block: - raise TransactionManagementError( - "The rollback flag doesn't work outside of an 'atomic' block." - ) - self.needs_rollback = rollback - - def validate_no_atomic_block(self): - """Raise an error if an atomic block is active.""" - if self.in_atomic_block: - raise TransactionManagementError( - "This is forbidden when an 'atomic' block is active." - ) - - def validate_no_broken_transaction(self): - if self.needs_rollback: - raise TransactionManagementError( - "An error occurred in the current transaction. You can't " - "execute queries until the end of the 'atomic' block." - ) from self.rollback_exc - - # ##### Foreign key constraints checks handling ##### - - @contextmanager - def constraint_checks_disabled(self): - """ - Disable foreign key constraint checking. - """ - disabled = self.disable_constraint_checking() - try: - yield - finally: - if disabled: - self.enable_constraint_checking() - - def disable_constraint_checking(self): - """ - Backends can implement as needed to temporarily disable foreign key - constraint checking. Should return True if the constraints were - disabled and will need to be reenabled. - """ - return False - - def enable_constraint_checking(self): - """ - Backends can implement as needed to re-enable foreign key constraint - checking. - """ - pass - - def check_constraints(self, table_names=None): - """ - Backends can override this method if they can apply constraint - checking (e.g. via "SET CONSTRAINTS ALL IMMEDIATE"). Should raise an - IntegrityError if any invalid foreign key references are encountered. - """ - pass - - # ##### Connection termination handling ##### - - def is_usable(self): - """ - Test if the database connection is usable. - - This method may assume that self.connection is not None. - - Actual implementations should take care not to raise exceptions - as that may prevent Django from recycling unusable connections. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseWrapper may require an is_usable() method" - ) - - def close_if_health_check_failed(self): - """Close existing connection if it fails a health check.""" - if ( - self.connection is None - or not self.health_check_enabled - or self.health_check_done - ): - return - - if not self.is_usable(): - self.close() - self.health_check_done = True - - def close_if_unusable_or_obsolete(self): - """ - Close the current connection if unrecoverable errors have occurred - or if it outlived its maximum age. - """ - if self.connection is not None: - self.health_check_done = False - # If the application didn't restore the original autocommit setting, - # don't take chances, drop the connection. - if self.get_autocommit() != self.settings_dict["AUTOCOMMIT"]: - self.close() - return - - # If an exception other than DataError or IntegrityError occurred - # since the last commit / rollback, check if the connection works. - if self.errors_occurred: - if self.is_usable(): - self.errors_occurred = False - self.health_check_done = True - else: - self.close() - return - - if self.close_at is not None and time.monotonic() >= self.close_at: - self.close() - return - - # ##### Thread safety handling ##### - - @property - def allow_thread_sharing(self): - with self._thread_sharing_lock: - return self._thread_sharing_count > 0 - - def inc_thread_sharing(self): - with self._thread_sharing_lock: - self._thread_sharing_count += 1 - - def dec_thread_sharing(self): - with self._thread_sharing_lock: - if self._thread_sharing_count <= 0: - raise RuntimeError( - "Cannot decrement the thread sharing count below zero." - ) - self._thread_sharing_count -= 1 - - def validate_thread_sharing(self): - """ - Validate that the connection isn't accessed by another thread than the - one which originally created it, unless the connection was explicitly - authorized to be shared between threads (via the `inc_thread_sharing()` - method). Raise an exception if the validation fails. - """ - if not (self.allow_thread_sharing or self._thread_ident == _thread.get_ident()): - raise DatabaseError( - "DatabaseWrapper objects created in a " - "thread can only be used in that same thread. The object " - "with alias '%s' was created in thread id %s and this is " - "thread id %s." % (self.alias, self._thread_ident, _thread.get_ident()) - ) - - # ##### Miscellaneous ##### - - def prepare_database(self): - """ - Hook to do any database check or preparation, generally called before - migrating a project or an app. - """ - pass - - @cached_property - def wrap_database_errors(self): - """ - Context manager and decorator that re-throws backend-specific database - exceptions using Django's common wrappers. - """ - return DatabaseErrorWrapper(self) - - def chunked_cursor(self): - """ - Return a cursor that tries to avoid caching in the database (if - supported by the database), otherwise return a regular cursor. - """ - return self.cursor() - - def make_debug_cursor(self, cursor): - """Create a cursor that logs all queries in self.queries_log.""" - return utils.CursorDebugWrapper(cursor, self) - - def make_cursor(self, cursor): - """Create a cursor without debug logging.""" - return utils.CursorWrapper(cursor, self) - - @contextmanager - def temporary_connection(self): - """ - Context manager that ensures that a connection is established, and - if it opened one, closes it to avoid leaving a dangling connection. - This is useful for operations outside of the request-response cycle. - - Provide a cursor: with self.temporary_connection() as cursor: ... - """ - must_close = self.connection is None - try: - with self.cursor() as cursor: - yield cursor - finally: - if must_close: - self.close() - - @contextmanager - def _nodb_cursor(self): - """ - Return a cursor from an alternative connection to be used when there is - no need to access the main database, specifically for test db - creation/deletion. This also prevents the production database from - being exposed to potential child threads while (or after) the test - database is destroyed. Refs #10868, #17786, #16969. - """ - conn = self.__class__({**self.settings_dict, "NAME": None}, alias=NO_DB_ALIAS) - try: - with conn.cursor() as cursor: - yield cursor - finally: - conn.close() - - def schema_editor(self, *args, **kwargs): - """ - Return a new instance of this backend's SchemaEditor. - """ - if self.SchemaEditorClass is None: - raise NotImplementedError( - "The SchemaEditorClass attribute of this database wrapper is still None" - ) - return self.SchemaEditorClass(self, *args, **kwargs) - - def on_commit(self, func, robust=False): - if not callable(func): - raise TypeError("on_commit()'s callback must be a callable.") - if self.in_atomic_block: - # Transaction in progress; save for execution on commit. - self.run_on_commit.append((set(self.savepoint_ids), func, robust)) - elif not self.get_autocommit(): - raise TransactionManagementError( - "on_commit() cannot be used in manual transaction management" - ) - else: - # No transaction in progress and in autocommit mode; execute - # immediately. - if robust: - try: - func() - except Exception as e: - logger.error( - f"Error calling {func.__qualname__} in on_commit() (%s).", - e, - exc_info=True, - ) - else: - func() - - def run_and_clear_commit_hooks(self): - self.validate_no_atomic_block() - current_run_on_commit = self.run_on_commit - self.run_on_commit = [] - while current_run_on_commit: - _, func, robust = current_run_on_commit.pop(0) - if robust: - try: - func() - except Exception as e: - logger.error( - f"Error calling {func.__qualname__} in on_commit() during " - f"transaction (%s).", - e, - exc_info=True, - ) - else: - func() - - @contextmanager - def execute_wrapper(self, wrapper): - """ - Return a context manager under which the wrapper is applied to suitable - database query executions. - """ - self.execute_wrappers.append(wrapper) - try: - yield - finally: - self.execute_wrappers.pop() - - def copy(self, alias=None): - """ - Return a copy of this connection. - - For tests that require two connections to the same database. - """ - settings_dict = copy.deepcopy(self.settings_dict) - if alias is None: - alias = self.alias - return type(self)(settings_dict, alias) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/base/client.py b/.venv/lib/python3.10/site-packages/django/db/backends/base/client.py deleted file mode 100644 index 0310563..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/base/client.py +++ /dev/null @@ -1,28 +0,0 @@ -import os -import subprocess - - -class BaseDatabaseClient: - """Encapsulate backend-specific methods for opening a client shell.""" - - # This should be a string representing the name of the executable - # (e.g., "psql"). Subclasses must override this. - executable_name = None - - def __init__(self, connection): - # connection is an instance of BaseDatabaseWrapper. - self.connection = connection - - @classmethod - def settings_to_cmd_args_env(cls, settings_dict, parameters): - raise NotImplementedError( - "subclasses of BaseDatabaseClient must provide a " - "settings_to_cmd_args_env() method or override a runshell()." - ) - - def runshell(self, parameters): - args, env = self.settings_to_cmd_args_env( - self.connection.settings_dict, parameters - ) - env = {**os.environ, **env} if env else None - subprocess.run(args, env=env, check=True) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/base/creation.py b/.venv/lib/python3.10/site-packages/django/db/backends/base/creation.py deleted file mode 100644 index 6856fdb..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/base/creation.py +++ /dev/null @@ -1,384 +0,0 @@ -import os -import sys -from io import StringIO - -from django.apps import apps -from django.conf import settings -from django.core import serializers -from django.db import router -from django.db.transaction import atomic -from django.utils.module_loading import import_string - -# The prefix to put on the default database name when creating -# the test database. -TEST_DATABASE_PREFIX = "test_" - - -class BaseDatabaseCreation: - """ - Encapsulate backend-specific differences pertaining to creation and - destruction of the test database. - """ - - def __init__(self, connection): - self.connection = connection - - def _nodb_cursor(self): - return self.connection._nodb_cursor() - - def log(self, msg): - sys.stderr.write(msg + os.linesep) - - def create_test_db( - self, verbosity=1, autoclobber=False, serialize=True, keepdb=False - ): - """ - Create a test database, prompting the user for confirmation if the - database already exists. Return the name of the test database created. - """ - # Don't import django.core.management if it isn't needed. - from django.core.management import call_command - - test_database_name = self._get_test_db_name() - - if verbosity >= 1: - action = "Creating" - if keepdb: - action = "Using existing" - - self.log( - "%s test database for alias %s..." - % ( - action, - self._get_database_display_str(verbosity, test_database_name), - ) - ) - - # We could skip this call if keepdb is True, but we instead - # give it the keepdb param. This is to handle the case - # where the test DB doesn't exist, in which case we need to - # create it, then just not destroy it. If we instead skip - # this, we will get an exception. - self._create_test_db(verbosity, autoclobber, keepdb) - - self.connection.close() - settings.DATABASES[self.connection.alias]["NAME"] = test_database_name - self.connection.settings_dict["NAME"] = test_database_name - - try: - if self.connection.settings_dict["TEST"]["MIGRATE"] is False: - # Disable migrations for all apps. - old_migration_modules = settings.MIGRATION_MODULES - settings.MIGRATION_MODULES = { - app.label: None for app in apps.get_app_configs() - } - # We report migrate messages at one level lower than that - # requested. This ensures we don't get flooded with messages during - # testing (unless you really ask to be flooded). - call_command( - "migrate", - verbosity=max(verbosity - 1, 0), - interactive=False, - database=self.connection.alias, - run_syncdb=True, - ) - finally: - if self.connection.settings_dict["TEST"]["MIGRATE"] is False: - settings.MIGRATION_MODULES = old_migration_modules - - # We then serialize the current state of the database into a string - # and store it on the connection. This slightly horrific process is so people - # who are testing on databases without transactions or who are using - # a TransactionTestCase still get a clean database on every test run. - if serialize: - self.connection._test_serialized_contents = self.serialize_db_to_string() - - call_command("createcachetable", database=self.connection.alias) - - # Ensure a connection for the side effect of initializing the test database. - self.connection.ensure_connection() - - if os.environ.get("RUNNING_DJANGOS_TEST_SUITE") == "true": - self.mark_expected_failures_and_skips() - - return test_database_name - - def set_as_test_mirror(self, primary_settings_dict): - """ - Set this database up to be used in testing as a mirror of a primary - database whose settings are given. - """ - self.connection.settings_dict["NAME"] = primary_settings_dict["NAME"] - - def serialize_db_to_string(self): - """ - Serialize all data in the database into a JSON string. - Designed only for test runner usage; will not handle large - amounts of data. - """ - - # Iteratively return every object for all models to serialize. - def get_objects(): - from django.db.migrations.loader import MigrationLoader - - loader = MigrationLoader(self.connection) - for app_config in apps.get_app_configs(): - if ( - app_config.models_module is not None - and app_config.label in loader.migrated_apps - and app_config.name not in settings.TEST_NON_SERIALIZED_APPS - ): - for model in app_config.get_models(): - if model._meta.can_migrate( - self.connection - ) and router.allow_migrate_model(self.connection.alias, model): - queryset = model._base_manager.using( - self.connection.alias, - ).order_by(model._meta.pk.name) - chunk_size = ( - 2000 if queryset._prefetch_related_lookups else None - ) - yield from queryset.iterator(chunk_size=chunk_size) - - # Serialize to a string - out = StringIO() - serializers.serialize("json", get_objects(), indent=None, stream=out) - return out.getvalue() - - def deserialize_db_from_string(self, data): - """ - Reload the database with data from a string generated by - the serialize_db_to_string() method. - """ - data = StringIO(data) - table_names = set() - # Load data in a transaction to handle forward references and cycles. - with atomic(using=self.connection.alias): - # Disable constraint checks, because some databases (MySQL) doesn't - # support deferred checks. - with self.connection.constraint_checks_disabled(): - for obj in serializers.deserialize( - "json", data, using=self.connection.alias - ): - obj.save() - table_names.add(obj.object.__class__._meta.db_table) - # Manually check for any invalid keys that might have been added, - # because constraint checks were disabled. - self.connection.check_constraints(table_names=table_names) - - def _get_database_display_str(self, verbosity, database_name): - """ - Return display string for a database for use in various actions. - """ - return "'%s'%s" % ( - self.connection.alias, - (" ('%s')" % database_name) if verbosity >= 2 else "", - ) - - def _get_test_db_name(self): - """ - Internal implementation - return the name of the test DB that will be - created. Only useful when called from create_test_db() and - _create_test_db() and when no external munging is done with the 'NAME' - settings. - """ - if self.connection.settings_dict["TEST"]["NAME"]: - return self.connection.settings_dict["TEST"]["NAME"] - return TEST_DATABASE_PREFIX + self.connection.settings_dict["NAME"] - - def _execute_create_test_db(self, cursor, parameters, keepdb=False): - cursor.execute("CREATE DATABASE %(dbname)s %(suffix)s" % parameters) - - def _create_test_db(self, verbosity, autoclobber, keepdb=False): - """ - Internal implementation - create the test db tables. - """ - test_database_name = self._get_test_db_name() - test_db_params = { - "dbname": self.connection.ops.quote_name(test_database_name), - "suffix": self.sql_table_creation_suffix(), - } - # Create the test database and connect to it. - with self._nodb_cursor() as cursor: - try: - self._execute_create_test_db(cursor, test_db_params, keepdb) - except Exception as e: - # if we want to keep the db, then no need to do any of the below, - # just return and skip it all. - if keepdb: - return test_database_name - - self.log("Got an error creating the test database: %s" % e) - if not autoclobber: - confirm = input( - "Type 'yes' if you would like to try deleting the test " - "database '%s', or 'no' to cancel: " % test_database_name - ) - if autoclobber or confirm == "yes": - try: - if verbosity >= 1: - self.log( - "Destroying old test database for alias %s..." - % ( - self._get_database_display_str( - verbosity, test_database_name - ), - ) - ) - cursor.execute("DROP DATABASE %(dbname)s" % test_db_params) - self._execute_create_test_db(cursor, test_db_params, keepdb) - except Exception as e: - self.log("Got an error recreating the test database: %s" % e) - sys.exit(2) - else: - self.log("Tests cancelled.") - sys.exit(1) - - return test_database_name - - def clone_test_db(self, suffix, verbosity=1, autoclobber=False, keepdb=False): - """ - Clone a test database. - """ - source_database_name = self.connection.settings_dict["NAME"] - - if verbosity >= 1: - action = "Cloning test database" - if keepdb: - action = "Using existing clone" - self.log( - "%s for alias %s..." - % ( - action, - self._get_database_display_str(verbosity, source_database_name), - ) - ) - - # We could skip this call if keepdb is True, but we instead - # give it the keepdb param. See create_test_db for details. - self._clone_test_db(suffix, verbosity, keepdb) - - def get_test_db_clone_settings(self, suffix): - """ - Return a modified connection settings dict for the n-th clone of a DB. - """ - # When this function is called, the test database has been created - # already and its name has been copied to settings_dict['NAME'] so - # we don't need to call _get_test_db_name. - orig_settings_dict = self.connection.settings_dict - return { - **orig_settings_dict, - "NAME": "{}_{}".format(orig_settings_dict["NAME"], suffix), - } - - def _clone_test_db(self, suffix, verbosity, keepdb=False): - """ - Internal implementation - duplicate the test db tables. - """ - raise NotImplementedError( - "The database backend doesn't support cloning databases. " - "Disable the option to run tests in parallel processes." - ) - - def destroy_test_db( - self, old_database_name=None, verbosity=1, keepdb=False, suffix=None - ): - """ - Destroy a test database, prompting the user for confirmation if the - database already exists. - """ - self.connection.close() - if suffix is None: - test_database_name = self.connection.settings_dict["NAME"] - else: - test_database_name = self.get_test_db_clone_settings(suffix)["NAME"] - - if verbosity >= 1: - action = "Destroying" - if keepdb: - action = "Preserving" - self.log( - "%s test database for alias %s..." - % ( - action, - self._get_database_display_str(verbosity, test_database_name), - ) - ) - - # if we want to preserve the database - # skip the actual destroying piece. - if not keepdb: - self._destroy_test_db(test_database_name, verbosity) - - # Restore the original database name - if old_database_name is not None: - settings.DATABASES[self.connection.alias]["NAME"] = old_database_name - self.connection.settings_dict["NAME"] = old_database_name - - def _destroy_test_db(self, test_database_name, verbosity): - """ - Internal implementation - remove the test db tables. - """ - # Remove the test database to clean up after - # ourselves. Connect to the previous database (not the test database) - # to do so, because it's not allowed to delete a database while being - # connected to it. - with self._nodb_cursor() as cursor: - cursor.execute( - "DROP DATABASE %s" % self.connection.ops.quote_name(test_database_name) - ) - - def mark_expected_failures_and_skips(self): - """ - Mark tests in Django's test suite which are expected failures on this - database and test which should be skipped on this database. - """ - # Only load unittest if we're actually testing. - from unittest import expectedFailure, skip - - for test_name in self.connection.features.django_test_expected_failures: - test_case_name, _, test_method_name = test_name.rpartition(".") - test_app = test_name.split(".")[0] - # Importing a test app that isn't installed raises RuntimeError. - if test_app in settings.INSTALLED_APPS: - test_case = import_string(test_case_name) - test_method = getattr(test_case, test_method_name) - setattr(test_case, test_method_name, expectedFailure(test_method)) - for reason, tests in self.connection.features.django_test_skips.items(): - for test_name in tests: - test_case_name, _, test_method_name = test_name.rpartition(".") - test_app = test_name.split(".")[0] - # Importing a test app that isn't installed raises RuntimeError. - if test_app in settings.INSTALLED_APPS: - test_case = import_string(test_case_name) - test_method = getattr(test_case, test_method_name) - setattr(test_case, test_method_name, skip(reason)(test_method)) - - def sql_table_creation_suffix(self): - """ - SQL to append to the end of the test table creation statements. - """ - return "" - - def test_db_signature(self): - """ - Return a tuple with elements of self.connection.settings_dict (a - DATABASES setting value) that uniquely identify a database - accordingly to the RDBMS particularities. - """ - settings_dict = self.connection.settings_dict - return ( - settings_dict["HOST"], - settings_dict["PORT"], - settings_dict["ENGINE"], - self._get_test_db_name(), - ) - - def setup_worker_connection(self, _worker_id): - settings_dict = self.get_test_db_clone_settings(str(_worker_id)) - # connection.settings_dict must be updated in place for changes to be - # reflected in django.db.connections. If the following line assigned - # connection.settings_dict = settings_dict, new threads would connect - # to the default database instead of the appropriate clone. - self.connection.settings_dict.update(settings_dict) - self.connection.close() diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/base/features.py b/.venv/lib/python3.10/site-packages/django/db/backends/base/features.py deleted file mode 100644 index 0f8e6f4..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/base/features.py +++ /dev/null @@ -1,423 +0,0 @@ -from django.db import ProgrammingError -from django.utils.functional import cached_property - - -class BaseDatabaseFeatures: - # An optional tuple indicating the minimum supported database version. - minimum_database_version = None - gis_enabled = False - # Oracle can't group by LOB (large object) data types. - allows_group_by_lob = True - allows_group_by_selected_pks = False - allows_group_by_select_index = True - empty_fetchmany_value = [] - update_can_self_select = True - # Does the backend support self-reference subqueries in the DELETE - # statement? - delete_can_self_reference_subquery = True - - # Does the backend distinguish between '' and None? - interprets_empty_strings_as_nulls = False - - # Does the backend allow inserting duplicate NULL rows in a nullable - # unique field? All core backends implement this correctly, but other - # databases such as SQL Server do not. - supports_nullable_unique_constraints = True - - # Does the backend allow inserting duplicate rows when a unique_together - # constraint exists and some fields are nullable but not all of them? - supports_partially_nullable_unique_constraints = True - - # Does the backend supports specifying whether NULL values should be - # considered distinct in unique constraints? - supports_nulls_distinct_unique_constraints = False - - # Does the backend support initially deferrable unique constraints? - supports_deferrable_unique_constraints = False - - can_use_chunked_reads = True - can_return_columns_from_insert = False - can_return_rows_from_bulk_insert = False - has_bulk_insert = True - uses_savepoints = True - can_release_savepoints = False - - # If True, don't use integer foreign keys referring to, e.g., positive - # integer primary keys. - related_fields_match_type = False - allow_sliced_subqueries_with_in = True - has_select_for_update = False - has_select_for_update_nowait = False - has_select_for_update_skip_locked = False - has_select_for_update_of = False - has_select_for_no_key_update = False - # Does the database's SELECT FOR UPDATE OF syntax require a column rather - # than a table? - select_for_update_of_column = False - - # Does the default test database allow multiple connections? - # Usually an indication that the test database is in-memory - test_db_allows_multiple_connections = True - - # Can an object be saved without an explicit primary key? - supports_unspecified_pk = False - - # Can a fixture contain forward references? i.e., are - # FK constraints checked at the end of transaction, or - # at the end of each save operation? - supports_forward_references = True - - # Does the backend truncate names properly when they are too long? - truncates_names = False - - # Is there a REAL datatype in addition to floats/doubles? - has_real_datatype = False - supports_subqueries_in_group_by = True - - # Does the backend ignore unnecessary ORDER BY clauses in subqueries? - ignores_unnecessary_order_by_in_subqueries = True - - # Is there a true datatype for uuid? - has_native_uuid_field = False - - # Is there a true datatype for timedeltas? - has_native_duration_field = False - - # Does the database driver supports same type temporal data subtraction - # by returning the type used to store duration field? - supports_temporal_subtraction = False - - # Does the __regex lookup support backreferencing and grouping? - supports_regex_backreferencing = True - - # Can date/datetime lookups be performed using a string? - supports_date_lookup_using_string = True - - # Can datetimes with timezones be used? - supports_timezones = True - - # Does the database have a copy of the zoneinfo database? - has_zoneinfo_database = True - - # When performing a GROUP BY, is an ORDER BY NULL required - # to remove any ordering? - requires_explicit_null_ordering_when_grouping = False - - # Does the backend order NULL values as largest or smallest? - nulls_order_largest = False - - # Does the backend support NULLS FIRST and NULLS LAST in ORDER BY? - supports_order_by_nulls_modifier = True - - # Does the backend orders NULLS FIRST by default? - order_by_nulls_first = False - - # The database's limit on the number of query parameters. - max_query_params = None - - # Can an object have an autoincrement primary key of 0? - allows_auto_pk_0 = True - - # Do we need to NULL a ForeignKey out, or can the constraint check be - # deferred - can_defer_constraint_checks = False - - # Does the backend support tablespaces? Default to False because it isn't - # in the SQL standard. - supports_tablespaces = False - - # Does the backend reset sequences between tests? - supports_sequence_reset = True - - # Can the backend introspect the default value of a column? - can_introspect_default = True - - # Confirm support for introspected foreign keys - # Every database can do this reliably, except MySQL, - # which can't do it for MyISAM tables - can_introspect_foreign_keys = True - - # Map fields which some backends may not be able to differentiate to the - # field it's introspected as. - introspected_field_types = { - "AutoField": "AutoField", - "BigAutoField": "BigAutoField", - "BigIntegerField": "BigIntegerField", - "BinaryField": "BinaryField", - "BooleanField": "BooleanField", - "CharField": "CharField", - "DurationField": "DurationField", - "GenericIPAddressField": "GenericIPAddressField", - "IntegerField": "IntegerField", - "PositiveBigIntegerField": "PositiveBigIntegerField", - "PositiveIntegerField": "PositiveIntegerField", - "PositiveSmallIntegerField": "PositiveSmallIntegerField", - "SmallAutoField": "SmallAutoField", - "SmallIntegerField": "SmallIntegerField", - "TimeField": "TimeField", - } - - # Can the backend introspect the column order (ASC/DESC) for indexes? - supports_index_column_ordering = True - - # Does the backend support introspection of materialized views? - can_introspect_materialized_views = False - - # Support for the DISTINCT ON clause - can_distinct_on_fields = False - - # Does the backend prevent running SQL queries in broken transactions? - atomic_transactions = True - - # Can we roll back DDL in a transaction? - can_rollback_ddl = False - - schema_editor_uses_clientside_param_binding = False - - # Can we issue more than one ALTER COLUMN clause in an ALTER TABLE? - supports_combined_alters = False - - # Does it support foreign keys? - supports_foreign_keys = True - - # Can it create foreign key constraints inline when adding columns? - can_create_inline_fk = True - - # Can an index be renamed? - can_rename_index = False - - # Does it automatically index foreign keys? - indexes_foreign_keys = True - - # Does it support CHECK constraints? - supports_column_check_constraints = True - supports_table_check_constraints = True - # Does the backend support introspection of CHECK constraints? - can_introspect_check_constraints = True - - # Does the backend support 'pyformat' style ("... %(name)s ...", {'name': value}) - # parameter passing? Note this can be provided by the backend even if not - # supported by the Python driver - supports_paramstyle_pyformat = True - - # Does the backend require literal defaults, rather than parameterized ones? - requires_literal_defaults = False - - # Does the backend support functions in defaults? - supports_expression_defaults = True - - # Does the backend support the DEFAULT keyword in insert queries? - supports_default_keyword_in_insert = True - - # Does the backend support the DEFAULT keyword in bulk insert queries? - supports_default_keyword_in_bulk_insert = True - - # Does the backend require a connection reset after each material schema change? - connection_persists_old_columns = False - - # What kind of error does the backend throw when accessing closed cursor? - closed_cursor_error_class = ProgrammingError - - # Does 'a' LIKE 'A' match? - has_case_insensitive_like = False - - # Suffix for backends that don't support "SELECT xxx;" queries. - bare_select_suffix = "" - - # If NULL is implied on columns without needing to be explicitly specified - implied_column_null = False - - # Does the backend support "select for update" queries with limit (and offset)? - supports_select_for_update_with_limit = True - - # Does the backend ignore null expressions in GREATEST and LEAST queries unless - # every expression is null? - greatest_least_ignores_nulls = False - - # Can the backend clone databases for parallel test execution? - # Defaults to False to allow third-party backends to opt-in. - can_clone_databases = False - - # Does the backend consider table names with different casing to - # be equal? - ignores_table_name_case = False - - # Place FOR UPDATE right after FROM clause. Used on MSSQL. - for_update_after_from = False - - # Combinatorial flags - supports_select_union = True - supports_select_intersection = True - supports_select_difference = True - supports_slicing_ordering_in_compound = False - supports_parentheses_in_compound = True - requires_compound_order_by_subquery = False - - # Does the database support SQL 2003 FILTER (WHERE ...) in aggregate - # expressions? - supports_aggregate_filter_clause = False - - # Does the backend support indexing a TextField? - supports_index_on_text_field = True - - # Does the backend support window expressions (expression OVER (...))? - supports_over_clause = False - supports_frame_range_fixed_distance = False - supports_frame_exclusion = False - only_supports_unbounded_with_preceding_and_following = False - - # Does the backend support CAST with precision? - supports_cast_with_precision = True - - # How many second decimals does the database return when casting a value to - # a type with time? - time_cast_precision = 6 - - # SQL to create a procedure for use by the Django test suite. The - # functionality of the procedure isn't important. - create_test_procedure_without_params_sql = None - create_test_procedure_with_int_param_sql = None - - # SQL to create a table with a composite primary key for use by the Django - # test suite. - create_test_table_with_composite_primary_key = None - - # Does the backend support keyword parameters for cursor.callproc()? - supports_callproc_kwargs = False - - # What formats does the backend EXPLAIN syntax support? - supported_explain_formats = set() - - # Does the backend support the default parameter in lead() and lag()? - supports_default_in_lead_lag = True - - # Does the backend support ignoring constraint or uniqueness errors during - # INSERT? - supports_ignore_conflicts = True - # Does the backend support updating rows on constraint or uniqueness errors - # during INSERT? - supports_update_conflicts = False - supports_update_conflicts_with_target = False - - # Does this backend require casting the results of CASE expressions used - # in UPDATE statements to ensure the expression has the correct type? - requires_casted_case_in_updates = False - - # Does the backend support partial indexes (CREATE INDEX ... WHERE ...)? - supports_partial_indexes = True - supports_functions_in_partial_indexes = True - # Does the backend support covering indexes (CREATE INDEX ... INCLUDE ...)? - supports_covering_indexes = False - # Does the backend support indexes on expressions? - supports_expression_indexes = True - # Does the backend treat COLLATE as an indexed expression? - collate_as_index_expression = False - - # Does the database allow more than one constraint or index on the same - # field(s)? - allows_multiple_constraints_on_same_fields = True - - # Does the backend support boolean expressions in SELECT and GROUP BY - # clauses? - supports_boolean_expr_in_select_clause = True - # Does the backend support comparing boolean expressions in WHERE clauses? - # Eg: WHERE (price > 0) IS NOT NULL - supports_comparing_boolean_expr = True - - # Does the backend support JSONField? - supports_json_field = True - # Can the backend introspect a JSONField? - can_introspect_json_field = True - # Does the backend support primitives in JSONField? - supports_primitives_in_json_field = True - # Is there a true datatype for JSON? - has_native_json_field = False - # Does the backend use PostgreSQL-style JSON operators like '->'? - has_json_operators = False - # Does the backend support __contains and __contained_by lookups for - # a JSONField? - supports_json_field_contains = True - # Does value__d__contains={'f': 'g'} (without a list around the dict) match - # {'d': [{'f': 'g'}]}? - json_key_contains_list_matching_requires_list = False - # Does the backend support JSONObject() database function? - has_json_object_function = True - - # Does the backend support column collations? - supports_collation_on_charfield = True - supports_collation_on_textfield = True - # Does the backend support non-deterministic collations? - supports_non_deterministic_collations = True - - # Does the backend support column and table comments? - supports_comments = False - # Does the backend support column comments in ADD COLUMN statements? - supports_comments_inline = False - - # Does the backend support stored generated columns? - supports_stored_generated_columns = False - # Does the backend support virtual generated columns? - supports_virtual_generated_columns = False - - # Does the backend support the logical XOR operator? - supports_logical_xor = False - - # Set to (exception, message) if null characters in text are disallowed. - prohibits_null_characters_in_text_exception = None - - # Does the backend support unlimited character columns? - supports_unlimited_charfield = False - - # Does the backend support native tuple lookups (=, >, <, IN)? - supports_tuple_lookups = True - - # Collation names for use by the Django test suite. - test_collations = { - "ci": None, # Case-insensitive. - "cs": None, # Case-sensitive. - "non_default": None, # Non-default. - "swedish_ci": None, # Swedish case-insensitive. - "virtual": None, # A collation that can be used for virtual columns. - } - # SQL template override for tests.aggregation.tests.NowUTC - test_now_utc_template = None - - # SQL to create a model instance using the database defaults. - insert_test_table_with_defaults = None - - # Does the Round() database function round to even? - rounds_to_even = False - - # A set of dotted paths to tests in Django's test suite that are expected - # to fail on this database. - django_test_expected_failures = set() - # A map of reasons to sets of dotted paths to tests in Django's test suite - # that should be skipped for this database. - django_test_skips = {} - - def __init__(self, connection): - self.connection = connection - - @cached_property - def supports_explaining_query_execution(self): - """Does this backend support explaining query execution?""" - return self.connection.ops.explain_prefix is not None - - @cached_property - def supports_transactions(self): - """Confirm support for transactions.""" - with self.connection.cursor() as cursor: - cursor.execute("CREATE TABLE ROLLBACK_TEST (X INT)") - self.connection.set_autocommit(False) - cursor.execute("INSERT INTO ROLLBACK_TEST (X) VALUES (8)") - self.connection.rollback() - self.connection.set_autocommit(True) - cursor.execute("SELECT COUNT(X) FROM ROLLBACK_TEST") - (count,) = cursor.fetchone() - cursor.execute("DROP TABLE ROLLBACK_TEST") - return count == 0 - - def allows_group_by_selected_pks_on_model(self, model): - if not self.allows_group_by_selected_pks: - return False - return model._meta.managed diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/base/introspection.py b/.venv/lib/python3.10/site-packages/django/db/backends/base/introspection.py deleted file mode 100644 index 5e4acb3..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/base/introspection.py +++ /dev/null @@ -1,212 +0,0 @@ -from collections import namedtuple - -# Structure returned by DatabaseIntrospection.get_table_list() -TableInfo = namedtuple("TableInfo", ["name", "type"]) - -# Structure returned by the DB-API cursor.description interface (PEP 249) -FieldInfo = namedtuple( - "FieldInfo", - "name type_code display_size internal_size precision scale null_ok " - "default collation", -) - - -class BaseDatabaseIntrospection: - """Encapsulate backend-specific introspection utilities.""" - - data_types_reverse = {} - - def __init__(self, connection): - self.connection = connection - - def get_field_type(self, data_type, description): - """ - Hook for a database backend to use the cursor description to - match a Django field type to a database column. - - For Oracle, the column data_type on its own is insufficient to - distinguish between a FloatField and IntegerField, for example. - """ - return self.data_types_reverse[data_type] - - def identifier_converter(self, name): - """ - Apply a conversion to the identifier for the purposes of comparison. - - The default identifier converter is for case sensitive comparison. - """ - return name - - def table_names(self, cursor=None, include_views=False): - """ - Return a list of names of all tables that exist in the database. - Sort the returned table list by Python's default sorting. Do NOT use - the database's ORDER BY here to avoid subtle differences in sorting - order between databases. - """ - - def get_names(cursor): - return sorted( - ti.name - for ti in self.get_table_list(cursor) - if include_views or ti.type == "t" - ) - - if cursor is None: - with self.connection.cursor() as cursor: - return get_names(cursor) - return get_names(cursor) - - def get_table_list(self, cursor): - """ - Return an unsorted list of TableInfo named tuples of all tables and - views that exist in the database. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseIntrospection may require a get_table_list() " - "method" - ) - - def get_table_description(self, cursor, table_name): - """ - Return a description of the table with the DB-API cursor.description - interface. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseIntrospection may require a " - "get_table_description() method." - ) - - def get_migratable_models(self): - from django.apps import apps - from django.db import router - - return ( - model - for app_config in apps.get_app_configs() - for model in router.get_migratable_models(app_config, self.connection.alias) - if model._meta.can_migrate(self.connection) - ) - - def django_table_names(self, only_existing=False, include_views=True): - """ - Return a list of all table names that have associated Django models and - are in INSTALLED_APPS. - - If only_existing is True, include only the tables in the database. - """ - tables = set() - for model in self.get_migratable_models(): - if not model._meta.managed: - continue - tables.add(model._meta.db_table) - tables.update( - f.m2m_db_table() - for f in model._meta.local_many_to_many - if f.remote_field.through._meta.managed - ) - tables = list(tables) - if only_existing: - existing_tables = set(self.table_names(include_views=include_views)) - tables = [ - t for t in tables if self.identifier_converter(t) in existing_tables - ] - return tables - - def installed_models(self, tables): - """ - Return a set of all models represented by the provided list of table - names. - """ - tables = set(map(self.identifier_converter, tables)) - return { - m - for m in self.get_migratable_models() - if self.identifier_converter(m._meta.db_table) in tables - } - - def sequence_list(self): - """ - Return a list of information about all DB sequences for all models in - all apps. - """ - sequence_list = [] - with self.connection.cursor() as cursor: - for model in self.get_migratable_models(): - if not model._meta.managed: - continue - if model._meta.swapped: - continue - sequence_list.extend( - self.get_sequences( - cursor, model._meta.db_table, model._meta.local_fields - ) - ) - for f in model._meta.local_many_to_many: - # If this is an m2m using an intermediate table, - # we don't need to reset the sequence. - if f.remote_field.through._meta.auto_created: - sequence = self.get_sequences(cursor, f.m2m_db_table()) - sequence_list.extend( - sequence or [{"table": f.m2m_db_table(), "column": None}] - ) - return sequence_list - - def get_sequences(self, cursor, table_name, table_fields=()): - """ - Return a list of introspected sequences for table_name. Each sequence - is a dict: {'table': , 'column': }. An optional - 'name' key can be added if the backend supports named sequences. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseIntrospection may require a get_sequences() " - "method" - ) - - def get_relations(self, cursor, table_name): - """ - Return a dictionary of {field_name: (field_name_other_table, other_table)} - representing all foreign keys in the given table. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseIntrospection may require a " - "get_relations() method." - ) - - def get_primary_key_column(self, cursor, table_name): - """ - Return the name of the primary key column for the given table. - """ - columns = self.get_primary_key_columns(cursor, table_name) - return columns[0] if columns else None - - def get_primary_key_columns(self, cursor, table_name): - """Return a list of primary key columns for the given table.""" - for constraint in self.get_constraints(cursor, table_name).values(): - if constraint["primary_key"]: - return constraint["columns"] - return None - - def get_constraints(self, cursor, table_name): - """ - Retrieve any constraints or keys (unique, pk, fk, check, index) - across one or more columns. - - Return a dict mapping constraint names to their attributes, - where attributes is a dict with keys: - * columns: List of columns this covers - * primary_key: True if primary key, False otherwise - * unique: True if this is a unique constraint, False otherwise - * foreign_key: (table, column) of target, or None - * check: True if check constraint, False otherwise - * index: True if index, False otherwise. - * orders: The order (ASC/DESC) defined for the columns of indexes - * type: The type of the index (btree, hash, etc.) - - Some backends may return special constraint names that don't exist - if they don't name constraints of a certain type (e.g. SQLite) - """ - raise NotImplementedError( - "subclasses of BaseDatabaseIntrospection may require a get_constraints() " - "method" - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/base/operations.py b/.venv/lib/python3.10/site-packages/django/db/backends/base/operations.py deleted file mode 100644 index 60de2d6..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/base/operations.py +++ /dev/null @@ -1,806 +0,0 @@ -import datetime -import decimal -import json -import warnings -from importlib import import_module - -import sqlparse - -from django.conf import settings -from django.db import NotSupportedError, transaction -from django.db.models.expressions import Col -from django.utils import timezone -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.encoding import force_str - - -class BaseDatabaseOperations: - """ - Encapsulate backend-specific differences, such as the way a backend - performs ordering or calculates the ID of a recently-inserted row. - """ - - compiler_module = "django.db.models.sql.compiler" - - # Integer field safe ranges by `internal_type` as documented - # in docs/ref/models/fields.txt. - integer_field_ranges = { - "SmallIntegerField": (-32768, 32767), - "IntegerField": (-2147483648, 2147483647), - "BigIntegerField": (-9223372036854775808, 9223372036854775807), - "PositiveBigIntegerField": (0, 9223372036854775807), - "PositiveSmallIntegerField": (0, 32767), - "PositiveIntegerField": (0, 2147483647), - "SmallAutoField": (-32768, 32767), - "AutoField": (-2147483648, 2147483647), - "BigAutoField": (-9223372036854775808, 9223372036854775807), - } - set_operators = { - "union": "UNION", - "intersection": "INTERSECT", - "difference": "EXCEPT", - } - # Mapping of Field.get_internal_type() (typically the model field's class - # name) to the data type to use for the Cast() function, if different from - # DatabaseWrapper.data_types. - cast_data_types = {} - # CharField data type if the max_length argument isn't provided. - cast_char_field_without_max_length = None - - # Start and end points for window expressions. - PRECEDING = "PRECEDING" - FOLLOWING = "FOLLOWING" - UNBOUNDED_PRECEDING = "UNBOUNDED " + PRECEDING - UNBOUNDED_FOLLOWING = "UNBOUNDED " + FOLLOWING - CURRENT_ROW = "CURRENT ROW" - - # Prefix for EXPLAIN queries, or None EXPLAIN isn't supported. - explain_prefix = None - - def __init__(self, connection): - self.connection = connection - self._cache = None - - def autoinc_sql(self, table, column): - """ - Return any SQL needed to support auto-incrementing primary keys, or - None if no SQL is necessary. - - This SQL is executed when a table is created. - """ - return None - - def bulk_batch_size(self, fields, objs): - """ - Return the maximum allowed batch size for the backend. The fields - are the fields going to be inserted in the batch, the objs contains - all the objects to be inserted. - """ - return len(objs) - - def format_for_duration_arithmetic(self, sql): - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a " - "format_for_duration_arithmetic() method." - ) - - def cache_key_culling_sql(self): - """ - Return an SQL query that retrieves the first cache key greater than the - n smallest. - - This is used by the 'db' cache backend to determine where to start - culling. - """ - cache_key = self.quote_name("cache_key") - return f"SELECT {cache_key} FROM %s ORDER BY {cache_key} LIMIT 1 OFFSET %%s" - - def unification_cast_sql(self, output_field): - """ - Given a field instance, return the SQL that casts the result of a union - to that type. The resulting string should contain a '%s' placeholder - for the expression being cast. - """ - return "%s" - - def date_extract_sql(self, lookup_type, sql, params): - """ - Given a lookup_type of 'year', 'month', or 'day', return the SQL that - extracts a value from the given date field field_name. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a date_extract_sql() " - "method" - ) - - def date_trunc_sql(self, lookup_type, sql, params, tzname=None): - """ - Given a lookup_type of 'year', 'month', or 'day', return the SQL that - truncates the given date or datetime field field_name to a date object - with only the given specificity. - - If `tzname` is provided, the given value is truncated in a specific - timezone. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a date_trunc_sql() " - "method." - ) - - def datetime_cast_date_sql(self, sql, params, tzname): - """ - Return the SQL to cast a datetime value to date value. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a " - "datetime_cast_date_sql() method." - ) - - def datetime_cast_time_sql(self, sql, params, tzname): - """ - Return the SQL to cast a datetime value to time value. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a " - "datetime_cast_time_sql() method" - ) - - def datetime_extract_sql(self, lookup_type, sql, params, tzname): - """ - Given a lookup_type of 'year', 'month', 'day', 'hour', 'minute', or - 'second', return the SQL that extracts a value from the given - datetime field field_name. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a datetime_extract_sql() " - "method" - ) - - def datetime_trunc_sql(self, lookup_type, sql, params, tzname): - """ - Given a lookup_type of 'year', 'month', 'day', 'hour', 'minute', or - 'second', return the SQL that truncates the given datetime field - field_name to a datetime object with only the given specificity. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a datetime_trunc_sql() " - "method" - ) - - def time_trunc_sql(self, lookup_type, sql, params, tzname=None): - """ - Given a lookup_type of 'hour', 'minute' or 'second', return the SQL - that truncates the given time or datetime field field_name to a time - object with only the given specificity. - - If `tzname` is provided, the given value is truncated in a specific - timezone. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a time_trunc_sql() method" - ) - - def time_extract_sql(self, lookup_type, sql, params): - """ - Given a lookup_type of 'hour', 'minute', or 'second', return the SQL - that extracts a value from the given time field field_name. - """ - return self.date_extract_sql(lookup_type, sql, params) - - def deferrable_sql(self): - """ - Return the SQL to make a constraint "initially deferred" during a - CREATE TABLE statement. - """ - return "" - - def distinct_sql(self, fields, params): - """ - Return an SQL DISTINCT clause which removes duplicate rows from the - result set. If any fields are given, only check the given fields for - duplicates. - """ - if fields: - raise NotSupportedError( - "DISTINCT ON fields is not supported by this database backend" - ) - else: - return ["DISTINCT"], [] - - def fetch_returned_insert_columns(self, cursor, returning_params): - """ - Given a cursor object that has just performed an INSERT...RETURNING - statement into a table, return the newly created data. - """ - return cursor.fetchone() - - def field_cast_sql(self, db_type, internal_type): - """ - Given a column type (e.g. 'BLOB', 'VARCHAR') and an internal type - (e.g. 'GenericIPAddressField'), return the SQL to cast it before using - it in a WHERE statement. The resulting string should contain a '%s' - placeholder for the column being searched against. - """ - warnings.warn( - ( - "DatabaseOperations.field_cast_sql() is deprecated use " - "DatabaseOperations.lookup_cast() instead." - ), - RemovedInDjango60Warning, - stacklevel=2, - ) - return "%s" - - def force_group_by(self): - """ - Return a GROUP BY clause to use with a HAVING clause when no grouping - is specified. - """ - return [] - - def force_no_ordering(self): - """ - Return a list used in the "ORDER BY" clause to force no ordering at - all. Return an empty list to include nothing in the ordering. - """ - return [] - - def for_update_sql(self, nowait=False, skip_locked=False, of=(), no_key=False): - """ - Return the FOR UPDATE SQL clause to lock rows for an update operation. - """ - return "FOR%s UPDATE%s%s%s" % ( - " NO KEY" if no_key else "", - " OF %s" % ", ".join(of) if of else "", - " NOWAIT" if nowait else "", - " SKIP LOCKED" if skip_locked else "", - ) - - def _get_limit_offset_params(self, low_mark, high_mark): - offset = low_mark or 0 - if high_mark is not None: - return (high_mark - offset), offset - elif offset: - return self.connection.ops.no_limit_value(), offset - return None, offset - - def limit_offset_sql(self, low_mark, high_mark): - """Return LIMIT/OFFSET SQL clause.""" - limit, offset = self._get_limit_offset_params(low_mark, high_mark) - return " ".join( - sql - for sql in ( - ("LIMIT %d" % limit) if limit else None, - ("OFFSET %d" % offset) if offset else None, - ) - if sql - ) - - def bulk_insert_sql(self, fields, placeholder_rows): - placeholder_rows_sql = (", ".join(row) for row in placeholder_rows) - values_sql = ", ".join([f"({sql})" for sql in placeholder_rows_sql]) - return f"VALUES {values_sql}" - - def last_executed_query(self, cursor, sql, params): - """ - Return a string of the query last executed by the given cursor, with - placeholders replaced with actual values. - - `sql` is the raw query containing placeholders and `params` is the - sequence of parameters. These are used by default, but this method - exists for database backends to provide a better implementation - according to their own quoting schemes. - """ - - # Convert params to contain string values. - def to_string(s): - return force_str(s, strings_only=True, errors="replace") - - if isinstance(params, (list, tuple)): - u_params = tuple(to_string(val) for val in params) - elif params is None: - u_params = () - else: - u_params = {to_string(k): to_string(v) for k, v in params.items()} - - return "QUERY = %r - PARAMS = %r" % (sql, u_params) - - def last_insert_id(self, cursor, table_name, pk_name): - """ - Given a cursor object that has just performed an INSERT statement into - a table that has an auto-incrementing ID, return the newly created ID. - - `pk_name` is the name of the primary-key column. - """ - return cursor.lastrowid - - def lookup_cast(self, lookup_type, internal_type=None): - """ - Return the string to use in a query when performing lookups - ("contains", "like", etc.). It should contain a '%s' placeholder for - the column being searched against. - """ - return "%s" - - def max_in_list_size(self): - """ - Return the maximum number of items that can be passed in a single 'IN' - list condition, or None if the backend does not impose a limit. - """ - return None - - def max_name_length(self): - """ - Return the maximum length of table and column names, or None if there - is no limit. - """ - return None - - def no_limit_value(self): - """ - Return the value to use for the LIMIT when we are wanting "LIMIT - infinity". Return None if the limit clause can be omitted in this case. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a no_limit_value() method" - ) - - def pk_default_value(self): - """ - Return the value to use during an INSERT statement to specify that - the field should use its default value. - """ - return "DEFAULT" - - def prepare_sql_script(self, sql): - """ - Take an SQL script that may contain multiple lines and return a list - of statements to feed to successive cursor.execute() calls. - - Since few databases are able to process raw SQL scripts in a single - cursor.execute() call and PEP 249 doesn't talk about this use case, - the default implementation is conservative. - """ - return [ - sqlparse.format(statement, strip_comments=True) - for statement in sqlparse.split(sql) - if statement - ] - - def process_clob(self, value): - """ - Return the value of a CLOB column, for backends that return a locator - object that requires additional processing. - """ - return value - - def return_insert_columns(self, fields): - """ - For backends that support returning columns as part of an insert query, - return the SQL and params to append to the INSERT query. The returned - fragment should contain a format string to hold the appropriate column. - """ - pass - - def compiler(self, compiler_name): - """ - Return the SQLCompiler class corresponding to the given name, - in the namespace corresponding to the `compiler_module` attribute - on this backend. - """ - if self._cache is None: - self._cache = import_module(self.compiler_module) - return getattr(self._cache, compiler_name) - - def quote_name(self, name): - """ - Return a quoted version of the given table, index, or column name. Do - not quote the given name if it's already been quoted. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a quote_name() method" - ) - - def regex_lookup(self, lookup_type): - """ - Return the string to use in a query when performing regular expression - lookups (using "regex" or "iregex"). It should contain a '%s' - placeholder for the column being searched against. - - If the feature is not supported (or part of it is not supported), raise - NotImplementedError. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations may require a regex_lookup() method" - ) - - def savepoint_create_sql(self, sid): - """ - Return the SQL for starting a new savepoint. Only required if the - "uses_savepoints" feature is True. The "sid" parameter is a string - for the savepoint id. - """ - return "SAVEPOINT %s" % self.quote_name(sid) - - def savepoint_commit_sql(self, sid): - """ - Return the SQL for committing the given savepoint. - """ - return "RELEASE SAVEPOINT %s" % self.quote_name(sid) - - def savepoint_rollback_sql(self, sid): - """ - Return the SQL for rolling back the given savepoint. - """ - return "ROLLBACK TO SAVEPOINT %s" % self.quote_name(sid) - - def set_time_zone_sql(self): - """ - Return the SQL that will set the connection's time zone. - - Return '' if the backend doesn't support time zones. - """ - return "" - - def sql_flush(self, style, tables, *, reset_sequences=False, allow_cascade=False): - """ - Return a list of SQL statements required to remove all data from - the given database tables (without actually removing the tables - themselves). - - The `style` argument is a Style object as returned by either - color_style() or no_style() in django.core.management.color. - - If `reset_sequences` is True, the list includes SQL statements required - to reset the sequences. - - The `allow_cascade` argument determines whether truncation may cascade - to tables with foreign keys pointing the tables being truncated. - PostgreSQL requires a cascade even if these tables are empty. - """ - raise NotImplementedError( - "subclasses of BaseDatabaseOperations must provide an sql_flush() method" - ) - - def execute_sql_flush(self, sql_list): - """Execute a list of SQL statements to flush the database.""" - with transaction.atomic( - using=self.connection.alias, - savepoint=self.connection.features.can_rollback_ddl, - ): - with self.connection.cursor() as cursor: - for sql in sql_list: - cursor.execute(sql) - - def sequence_reset_by_name_sql(self, style, sequences): - """ - Return a list of the SQL statements required to reset sequences - passed in `sequences`. - - The `style` argument is a Style object as returned by either - color_style() or no_style() in django.core.management.color. - """ - return [] - - def sequence_reset_sql(self, style, model_list): - """ - Return a list of the SQL statements required to reset sequences for - the given models. - - The `style` argument is a Style object as returned by either - color_style() or no_style() in django.core.management.color. - """ - return [] # No sequence reset required by default. - - def start_transaction_sql(self): - """Return the SQL statement required to start a transaction.""" - return "BEGIN;" - - def end_transaction_sql(self, success=True): - """Return the SQL statement required to end a transaction.""" - if not success: - return "ROLLBACK;" - return "COMMIT;" - - def tablespace_sql(self, tablespace, inline=False): - """ - Return the SQL that will be used in a query to define the tablespace. - - Return '' if the backend doesn't support tablespaces. - - If `inline` is True, append the SQL to a row; otherwise append it to - the entire CREATE TABLE or CREATE INDEX statement. - """ - return "" - - def prep_for_like_query(self, x): - """Prepare a value for use in a LIKE query.""" - return str(x).replace("\\", "\\\\").replace("%", r"\%").replace("_", r"\_") - - # Same as prep_for_like_query(), but called for "iexact" matches, which - # need not necessarily be implemented using "LIKE" in the backend. - prep_for_iexact_query = prep_for_like_query - - def validate_autopk_value(self, value): - """ - Certain backends do not accept some values for "serial" fields - (for example zero in MySQL). Raise a ValueError if the value is - invalid, otherwise return the validated value. - """ - return value - - def adapt_unknown_value(self, value): - """ - Transform a value to something compatible with the backend driver. - - This method only depends on the type of the value. It's designed for - cases where the target type isn't known, such as .raw() SQL queries. - As a consequence it may not work perfectly in all circumstances. - """ - if isinstance(value, datetime.datetime): # must be before date - return self.adapt_datetimefield_value(value) - elif isinstance(value, datetime.date): - return self.adapt_datefield_value(value) - elif isinstance(value, datetime.time): - return self.adapt_timefield_value(value) - elif isinstance(value, decimal.Decimal): - return self.adapt_decimalfield_value(value) - else: - return value - - def adapt_integerfield_value(self, value, internal_type): - return value - - def adapt_datefield_value(self, value): - """ - Transform a date value to an object compatible with what is expected - by the backend driver for date columns. - """ - if value is None: - return None - return str(value) - - def adapt_datetimefield_value(self, value): - """ - Transform a datetime value to an object compatible with what is expected - by the backend driver for datetime columns. - """ - if value is None: - return None - return str(value) - - def adapt_timefield_value(self, value): - """ - Transform a time value to an object compatible with what is expected - by the backend driver for time columns. - """ - if value is None: - return None - if timezone.is_aware(value): - raise ValueError("Django does not support timezone-aware times.") - return str(value) - - def adapt_decimalfield_value(self, value, max_digits=None, decimal_places=None): - """ - Transform a decimal.Decimal value to an object compatible with what is - expected by the backend driver for decimal (numeric) columns. - """ - return value - - def adapt_ipaddressfield_value(self, value): - """ - Transform a string representation of an IP address into the expected - type for the backend driver. - """ - return value or None - - def adapt_json_value(self, value, encoder): - return json.dumps(value, cls=encoder) - - def year_lookup_bounds_for_date_field(self, value, iso_year=False): - """ - Return a two-elements list with the lower and upper bound to be used - with a BETWEEN operator to query a DateField value using a year - lookup. - - `value` is an int, containing the looked-up year. - If `iso_year` is True, return bounds for ISO-8601 week-numbering years. - """ - if iso_year: - first = datetime.date.fromisocalendar(value, 1, 1) - second = datetime.date.fromisocalendar( - value + 1, 1, 1 - ) - datetime.timedelta(days=1) - else: - first = datetime.date(value, 1, 1) - second = datetime.date(value, 12, 31) - first = self.adapt_datefield_value(first) - second = self.adapt_datefield_value(second) - return [first, second] - - def year_lookup_bounds_for_datetime_field(self, value, iso_year=False): - """ - Return a two-elements list with the lower and upper bound to be used - with a BETWEEN operator to query a DateTimeField value using a year - lookup. - - `value` is an int, containing the looked-up year. - If `iso_year` is True, return bounds for ISO-8601 week-numbering years. - """ - if iso_year: - first = datetime.datetime.fromisocalendar(value, 1, 1) - second = datetime.datetime.fromisocalendar( - value + 1, 1, 1 - ) - datetime.timedelta(microseconds=1) - else: - first = datetime.datetime(value, 1, 1) - second = datetime.datetime(value, 12, 31, 23, 59, 59, 999999) - if settings.USE_TZ: - tz = timezone.get_current_timezone() - first = timezone.make_aware(first, tz) - second = timezone.make_aware(second, tz) - first = self.adapt_datetimefield_value(first) - second = self.adapt_datetimefield_value(second) - return [first, second] - - def get_db_converters(self, expression): - """ - Return a list of functions needed to convert field data. - - Some field types on some backends do not provide data in the correct - format, this is the hook for converter functions. - """ - return [] - - def convert_durationfield_value(self, value, expression, connection): - if value is not None: - return datetime.timedelta(0, 0, value) - - def check_expression_support(self, expression): - """ - Check that the backend supports the provided expression. - - This is used on specific backends to rule out known expressions - that have problematic or nonexistent implementations. If the - expression has a known problem, the backend should raise - NotSupportedError. - """ - pass - - def conditional_expression_supported_in_where_clause(self, expression): - """ - Return True, if the conditional expression is supported in the WHERE - clause. - """ - return True - - def combine_expression(self, connector, sub_expressions): - """ - Combine a list of subexpressions into a single expression, using - the provided connecting operator. This is required because operators - can vary between backends (e.g., Oracle with %% and &) and between - subexpression types (e.g., date expressions). - """ - conn = " %s " % connector - return conn.join(sub_expressions) - - def combine_duration_expression(self, connector, sub_expressions): - return self.combine_expression(connector, sub_expressions) - - def binary_placeholder_sql(self, value): - """ - Some backends require special syntax to insert binary content (MySQL - for example uses '_binary %s'). - """ - return "%s" - - def modify_insert_params(self, placeholder, params): - """ - Allow modification of insert parameters. Needed for Oracle Spatial - backend due to #10888. - """ - return params - - def integer_field_range(self, internal_type): - """ - Given an integer field internal type (e.g. 'PositiveIntegerField'), - return a tuple of the (min_value, max_value) form representing the - range of the column type bound to the field. - """ - return self.integer_field_ranges[internal_type] - - def subtract_temporals(self, internal_type, lhs, rhs): - if self.connection.features.supports_temporal_subtraction: - lhs_sql, lhs_params = lhs - rhs_sql, rhs_params = rhs - return "(%s - %s)" % (lhs_sql, rhs_sql), (*lhs_params, *rhs_params) - raise NotSupportedError( - "This backend does not support %s subtraction." % internal_type - ) - - def window_frame_value(self, value): - if isinstance(value, int): - if value == 0: - return self.CURRENT_ROW - elif value < 0: - return "%d %s" % (abs(value), self.PRECEDING) - else: - return "%d %s" % (value, self.FOLLOWING) - - def window_frame_rows_start_end(self, start=None, end=None): - """ - Return SQL for start and end points in an OVER clause window frame. - """ - if isinstance(start, int) and isinstance(end, int) and start > end: - raise ValueError("start cannot be greater than end.") - if start is not None and not isinstance(start, int): - raise ValueError( - f"start argument must be an integer, zero, or None, but got '{start}'." - ) - if end is not None and not isinstance(end, int): - raise ValueError( - f"end argument must be an integer, zero, or None, but got '{end}'." - ) - start_ = self.window_frame_value(start) or self.UNBOUNDED_PRECEDING - end_ = self.window_frame_value(end) or self.UNBOUNDED_FOLLOWING - return start_, end_ - - def window_frame_range_start_end(self, start=None, end=None): - if (start is not None and not isinstance(start, int)) or ( - isinstance(start, int) and start > 0 - ): - raise ValueError( - "start argument must be a negative integer, zero, or None, " - "but got '%s'." % start - ) - if (end is not None and not isinstance(end, int)) or ( - isinstance(end, int) and end < 0 - ): - raise ValueError( - "end argument must be a positive integer, zero, or None, but got '%s'." - % end - ) - start_ = self.window_frame_value(start) or self.UNBOUNDED_PRECEDING - end_ = self.window_frame_value(end) or self.UNBOUNDED_FOLLOWING - features = self.connection.features - if features.only_supports_unbounded_with_preceding_and_following and ( - (start and start < 0) or (end and end > 0) - ): - raise NotSupportedError( - "%s only supports UNBOUNDED together with PRECEDING and " - "FOLLOWING." % self.connection.display_name - ) - return start_, end_ - - def explain_query_prefix(self, format=None, **options): - if not self.connection.features.supports_explaining_query_execution: - raise NotSupportedError( - "This backend does not support explaining query execution." - ) - if format: - supported_formats = self.connection.features.supported_explain_formats - normalized_format = format.upper() - if normalized_format not in supported_formats: - msg = "%s is not a recognized format." % normalized_format - if supported_formats: - msg += " Allowed formats: %s" % ", ".join(sorted(supported_formats)) - else: - msg += ( - f" {self.connection.display_name} does not support any formats." - ) - raise ValueError(msg) - if options: - raise ValueError("Unknown options: %s" % ", ".join(sorted(options.keys()))) - return self.explain_prefix - - def insert_statement(self, on_conflict=None): - return "INSERT INTO" - - def on_conflict_suffix_sql(self, fields, on_conflict, update_fields, unique_fields): - return "" - - def prepare_join_on_clause(self, lhs_table, lhs_field, rhs_table, rhs_field): - lhs_expr = Col(lhs_table, lhs_field) - rhs_expr = Col(rhs_table, rhs_field) - - return lhs_expr, rhs_expr diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/base/schema.py b/.venv/lib/python3.10/site-packages/django/db/backends/base/schema.py deleted file mode 100644 index 6303248..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/base/schema.py +++ /dev/null @@ -1,2046 +0,0 @@ -import logging -import operator -from datetime import datetime - -from django.conf import settings -from django.core.exceptions import FieldError -from django.db.backends.ddl_references import ( - Columns, - Expressions, - ForeignKeyName, - IndexName, - Statement, - Table, -) -from django.db.backends.utils import names_digest, split_identifier, truncate_name -from django.db.models import Deferrable, Index -from django.db.models.fields.composite import CompositePrimaryKey -from django.db.models.sql import Query -from django.db.transaction import TransactionManagementError, atomic -from django.utils import timezone - -logger = logging.getLogger("django.db.backends.schema") - - -def _is_relevant_relation(relation, altered_field): - """ - When altering the given field, must constraints on its model from the given - relation be temporarily dropped? - """ - field = relation.field - if field.many_to_many: - # M2M reverse field - return False - if altered_field.primary_key and field.to_fields == [None]: - # Foreign key constraint on the primary key, which is being altered. - return True - # Is the constraint targeting the field being altered? - return altered_field.name in field.to_fields - - -def _all_related_fields(model): - # Related fields must be returned in a deterministic order. - return sorted( - model._meta._get_fields( - forward=False, - reverse=True, - include_hidden=True, - include_parents=False, - ), - key=operator.attrgetter("name"), - ) - - -def _related_non_m2m_objects(old_field, new_field): - # Filter out m2m objects from reverse relations. - # Return (old_relation, new_relation) tuples. - related_fields = zip( - ( - obj - for obj in _all_related_fields(old_field.model) - if _is_relevant_relation(obj, old_field) - ), - ( - obj - for obj in _all_related_fields(new_field.model) - if _is_relevant_relation(obj, new_field) - ), - ) - for old_rel, new_rel in related_fields: - yield old_rel, new_rel - yield from _related_non_m2m_objects( - old_rel.remote_field, - new_rel.remote_field, - ) - - -class BaseDatabaseSchemaEditor: - """ - This class and its subclasses are responsible for emitting schema-changing - statements to the databases - model creation/removal/alteration, field - renaming, index fiddling, and so on. - """ - - # Overrideable SQL templates - sql_create_table = "CREATE TABLE %(table)s (%(definition)s)" - sql_rename_table = "ALTER TABLE %(old_table)s RENAME TO %(new_table)s" - sql_retablespace_table = "ALTER TABLE %(table)s SET TABLESPACE %(new_tablespace)s" - sql_delete_table = "DROP TABLE %(table)s CASCADE" - - sql_create_column = "ALTER TABLE %(table)s ADD COLUMN %(column)s %(definition)s" - sql_alter_column = "ALTER TABLE %(table)s %(changes)s" - sql_alter_column_type = "ALTER COLUMN %(column)s TYPE %(type)s%(collation)s" - sql_alter_column_null = "ALTER COLUMN %(column)s DROP NOT NULL" - sql_alter_column_not_null = "ALTER COLUMN %(column)s SET NOT NULL" - sql_alter_column_default = "ALTER COLUMN %(column)s SET DEFAULT %(default)s" - sql_alter_column_no_default = "ALTER COLUMN %(column)s DROP DEFAULT" - sql_alter_column_no_default_null = sql_alter_column_no_default - sql_delete_column = "ALTER TABLE %(table)s DROP COLUMN %(column)s CASCADE" - sql_rename_column = ( - "ALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)s" - ) - sql_update_with_default = ( - "UPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULL" - ) - - sql_unique_constraint = "UNIQUE (%(columns)s)%(deferrable)s" - sql_check_constraint = "CHECK (%(check)s)" - sql_delete_constraint = "ALTER TABLE %(table)s DROP CONSTRAINT %(name)s" - sql_constraint = "CONSTRAINT %(name)s %(constraint)s" - sql_pk_constraint = "PRIMARY KEY (%(columns)s)" - - sql_create_check = "ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)" - sql_delete_check = sql_delete_constraint - - sql_create_unique = ( - "ALTER TABLE %(table)s ADD CONSTRAINT %(name)s " - "UNIQUE%(nulls_distinct)s (%(columns)s)%(deferrable)s" - ) - sql_delete_unique = sql_delete_constraint - - sql_create_fk = ( - "ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) " - "REFERENCES %(to_table)s (%(to_column)s)%(deferrable)s" - ) - sql_create_inline_fk = None - sql_create_column_inline_fk = None - sql_delete_fk = sql_delete_constraint - - sql_create_index = ( - "CREATE INDEX %(name)s ON %(table)s " - "(%(columns)s)%(include)s%(extra)s%(condition)s" - ) - sql_create_unique_index = ( - "CREATE UNIQUE INDEX %(name)s ON %(table)s " - "(%(columns)s)%(include)s%(nulls_distinct)s%(condition)s" - ) - sql_rename_index = "ALTER INDEX %(old_name)s RENAME TO %(new_name)s" - sql_delete_index = "DROP INDEX %(name)s" - - sql_create_pk = ( - "ALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)" - ) - sql_delete_pk = sql_delete_constraint - - sql_delete_procedure = "DROP PROCEDURE %(procedure)s" - - sql_alter_table_comment = "COMMENT ON TABLE %(table)s IS %(comment)s" - sql_alter_column_comment = "COMMENT ON COLUMN %(table)s.%(column)s IS %(comment)s" - - def __init__(self, connection, collect_sql=False, atomic=True): - self.connection = connection - self.collect_sql = collect_sql - if self.collect_sql: - self.collected_sql = [] - self.atomic_migration = self.connection.features.can_rollback_ddl and atomic - - # State-managing methods - - def __enter__(self): - self.deferred_sql = [] - if self.atomic_migration: - self.atomic = atomic(self.connection.alias) - self.atomic.__enter__() - return self - - def __exit__(self, exc_type, exc_value, traceback): - if exc_type is None: - for sql in self.deferred_sql: - self.execute(sql, None) - if self.atomic_migration: - self.atomic.__exit__(exc_type, exc_value, traceback) - - # Core utility functions - - def execute(self, sql, params=()): - """Execute the given SQL statement, with optional parameters.""" - # Don't perform the transactional DDL check if SQL is being collected - # as it's not going to be executed anyway. - if ( - not self.collect_sql - and self.connection.in_atomic_block - and not self.connection.features.can_rollback_ddl - ): - raise TransactionManagementError( - "Executing DDL statements while in a transaction on databases " - "that can't perform a rollback is prohibited." - ) - # Account for non-string statement objects. - sql = str(sql) - # Log the command we're running, then run it - logger.debug( - "%s; (params %r)", sql, params, extra={"params": params, "sql": sql} - ) - if self.collect_sql: - ending = "" if sql.rstrip().endswith(";") else ";" - if params is not None: - self.collected_sql.append( - (sql % tuple(map(self.quote_value, params))) + ending - ) - else: - self.collected_sql.append(sql + ending) - else: - with self.connection.cursor() as cursor: - cursor.execute(sql, params) - - def quote_name(self, name): - return self.connection.ops.quote_name(name) - - def table_sql(self, model): - """Take a model and return its table definition.""" - # Add any unique_togethers (always deferred, as some fields might be - # created afterward, like geometry fields with some backends). - for field_names in model._meta.unique_together: - fields = [model._meta.get_field(field) for field in field_names] - self.deferred_sql.append(self._create_unique_sql(model, fields)) - # Create column SQL, add FK deferreds if needed. - column_sqls = [] - params = [] - for field in model._meta.local_fields: - # SQL. - definition, extra_params = self.column_sql(model, field) - if definition is None: - continue - # Check constraints can go on the column SQL here. - db_params = field.db_parameters(connection=self.connection) - if db_params["check"]: - definition += " " + self.sql_check_constraint % db_params - # Autoincrement SQL (for backends with inline variant). - col_type_suffix = field.db_type_suffix(connection=self.connection) - if col_type_suffix: - definition += " %s" % col_type_suffix - params.extend(extra_params) - # FK. - if field.remote_field and field.db_constraint: - to_table = field.remote_field.model._meta.db_table - to_column = field.remote_field.model._meta.get_field( - field.remote_field.field_name - ).column - if self.sql_create_inline_fk: - definition += " " + self.sql_create_inline_fk % { - "to_table": self.quote_name(to_table), - "to_column": self.quote_name(to_column), - } - elif self.connection.features.supports_foreign_keys: - self.deferred_sql.append( - self._create_fk_sql( - model, field, "_fk_%(to_table)s_%(to_column)s" - ) - ) - # Add the SQL to our big list. - column_sqls.append( - "%s %s" - % ( - self.quote_name(field.column), - definition, - ) - ) - # Autoincrement SQL (for backends with post table definition - # variant). - if field.get_internal_type() in ( - "AutoField", - "BigAutoField", - "SmallAutoField", - ): - autoinc_sql = self.connection.ops.autoinc_sql( - model._meta.db_table, field.column - ) - if autoinc_sql: - self.deferred_sql.extend(autoinc_sql) - # The BaseConstraint DDL creation methods such as constraint_sql(), - # create_sql(), and delete_sql(), were not designed in a way that - # separate SQL from parameters which make their generated SQL unfit to - # be used in a context where parametrization is delegated to the - # backend. - constraint_sqls = [] - if params: - # If parameters are present (e.g. a DEFAULT clause on backends that - # allow parametrization) defer constraint creation so they are not - # mixed with SQL meant to be parametrized. - for constraint in model._meta.constraints: - self.deferred_sql.append(constraint.create_sql(model, self)) - else: - constraint_sqls.extend( - constraint.constraint_sql(model, self) - for constraint in model._meta.constraints - ) - - pk = model._meta.pk - if isinstance(pk, CompositePrimaryKey): - constraint_sqls.append(self._pk_constraint_sql(pk.columns)) - - sql = self.sql_create_table % { - "table": self.quote_name(model._meta.db_table), - "definition": ", ".join( - str(statement) - for statement in (*column_sqls, *constraint_sqls) - if statement - ), - } - if model._meta.db_tablespace: - tablespace_sql = self.connection.ops.tablespace_sql( - model._meta.db_tablespace - ) - if tablespace_sql: - sql += " " + tablespace_sql - return sql, params - - # Field <-> database mapping functions - - def _iter_column_sql( - self, column_db_type, params, model, field, field_db_params, include_default - ): - yield column_db_type - if collation := field_db_params.get("collation"): - yield self._collate_sql(collation) - if self.connection.features.supports_comments_inline and field.db_comment: - yield self._comment_sql(field.db_comment) - # Work out nullability. - null = field.null - # Add database default. - if field.has_db_default(): - default_sql, default_params = self.db_default_sql(field) - yield f"DEFAULT {default_sql}" - params.extend(default_params) - include_default = False - # Include a default value, if requested. - include_default = ( - include_default - and not self.skip_default(field) - and - # Don't include a default value if it's a nullable field and the - # default cannot be dropped in the ALTER COLUMN statement (e.g. - # MySQL longtext and longblob). - not (null and self.skip_default_on_alter(field)) - ) - if include_default: - default_value = self.effective_default(field) - if default_value is not None: - column_default = "DEFAULT " + self._column_default_sql(field) - if self.connection.features.requires_literal_defaults: - # Some databases can't take defaults as a parameter - # (Oracle, SQLite). If this is the case, the individual - # schema backend should implement prepare_default(). - yield column_default % self.prepare_default(default_value) - else: - yield column_default - params.append(default_value) - # Oracle treats the empty string ('') as null, so coerce the null - # option whenever '' is a possible value. - if ( - field.empty_strings_allowed - and not field.primary_key - and self.connection.features.interprets_empty_strings_as_nulls - ): - null = True - if field.generated: - generated_sql, generated_params = self._column_generated_sql(field) - params.extend(generated_params) - yield generated_sql - elif not null: - yield "NOT NULL" - elif not self.connection.features.implied_column_null: - yield "NULL" - if field.primary_key: - yield "PRIMARY KEY" - elif field.unique: - yield "UNIQUE" - # Optionally add the tablespace if it's an implicitly indexed column. - tablespace = field.db_tablespace or model._meta.db_tablespace - if ( - tablespace - and self.connection.features.supports_tablespaces - and field.unique - ): - yield self.connection.ops.tablespace_sql(tablespace, inline=True) - - def column_sql(self, model, field, include_default=False): - """ - Return the column definition for a field. The field must already have - had set_attributes_from_name() called. - """ - # Get the column's type and use that as the basis of the SQL. - field_db_params = field.db_parameters(connection=self.connection) - column_db_type = field_db_params["type"] - # Check for fields that aren't actually columns (e.g. M2M). - if column_db_type is None: - return None, None - params = [] - return ( - " ".join( - # This appends to the params being returned. - self._iter_column_sql( - column_db_type, - params, - model, - field, - field_db_params, - include_default, - ) - ), - params, - ) - - def skip_default(self, field): - """ - Some backends don't accept default values for certain columns types - (i.e. MySQL longtext and longblob). - """ - return False - - def skip_default_on_alter(self, field): - """ - Some backends don't accept default values for certain columns types - (i.e. MySQL longtext and longblob) in the ALTER COLUMN statement. - """ - return False - - def prepare_default(self, value): - """ - Only used for backends which have requires_literal_defaults feature - """ - raise NotImplementedError( - "subclasses of BaseDatabaseSchemaEditor for backends which have " - "requires_literal_defaults must provide a prepare_default() method" - ) - - def _column_default_sql(self, field): - """ - Return the SQL to use in a DEFAULT clause. The resulting string should - contain a '%s' placeholder for a default value. - """ - return "%s" - - def db_default_sql(self, field): - """Return the sql and params for the field's database default.""" - from django.db.models.expressions import Value - - db_default = field._db_default_expression - sql = ( - self._column_default_sql(field) if isinstance(db_default, Value) else "(%s)" - ) - query = Query(model=field.model) - compiler = query.get_compiler(connection=self.connection) - default_sql, params = compiler.compile(db_default) - if self.connection.features.requires_literal_defaults: - # Some databases don't support parameterized defaults (Oracle, - # SQLite). If this is the case, the individual schema backend - # should implement prepare_default(). - default_sql %= tuple(self.prepare_default(p) for p in params) - params = [] - return sql % default_sql, params - - def _column_generated_sql(self, field): - """Return the SQL to use in a GENERATED ALWAYS clause.""" - expression_sql, params = field.generated_sql(self.connection) - persistency_sql = "STORED" if field.db_persist else "VIRTUAL" - if self.connection.features.requires_literal_defaults: - expression_sql = expression_sql % tuple(self.quote_value(p) for p in params) - params = () - return f"GENERATED ALWAYS AS ({expression_sql}) {persistency_sql}", params - - @staticmethod - def _effective_default(field): - # This method allows testing its logic without a connection. - if field.has_default(): - default = field.get_default() - elif field.generated: - default = None - elif not field.null and field.blank and field.empty_strings_allowed: - if field.get_internal_type() == "BinaryField": - default = b"" - else: - default = "" - elif getattr(field, "auto_now", False) or getattr(field, "auto_now_add", False): - internal_type = field.get_internal_type() - if internal_type == "DateTimeField": - default = timezone.now() - else: - default = datetime.now() - if internal_type == "DateField": - default = default.date() - elif internal_type == "TimeField": - default = default.time() - else: - default = None - return default - - def effective_default(self, field): - """Return a field's effective database default value.""" - return field.get_db_prep_save(self._effective_default(field), self.connection) - - def quote_value(self, value): - """ - Return a quoted version of the value so it's safe to use in an SQL - string. This is not safe against injection from user code; it is - intended only for use in making SQL scripts or preparing default values - for particularly tricky backends (defaults are not user-defined, though, - so this is safe). - """ - raise NotImplementedError() - - # Actions - - def create_model(self, model): - """ - Create a table and any accompanying indexes or unique constraints for - the given `model`. - """ - sql, params = self.table_sql(model) - # Prevent using [] as params, in the case a literal '%' is used in the - # definition on backends that don't support parametrized DDL. - self.execute(sql, params or None) - - if self.connection.features.supports_comments: - # Add table comment. - if model._meta.db_table_comment: - self.alter_db_table_comment(model, None, model._meta.db_table_comment) - # Add column comments. - if not self.connection.features.supports_comments_inline: - for field in model._meta.local_fields: - if field.db_comment: - field_db_params = field.db_parameters( - connection=self.connection - ) - field_type = field_db_params["type"] - self.execute( - *self._alter_column_comment_sql( - model, field, field_type, field.db_comment - ) - ) - # Add any field index (deferred as SQLite _remake_table needs it). - self.deferred_sql.extend(self._model_indexes_sql(model)) - - # Make M2M tables - for field in model._meta.local_many_to_many: - if field.remote_field.through._meta.auto_created: - self.create_model(field.remote_field.through) - - def delete_model(self, model): - """Delete a model from the database.""" - # Handle auto-created intermediary models - for field in model._meta.local_many_to_many: - if field.remote_field.through._meta.auto_created: - self.delete_model(field.remote_field.through) - - # Delete the table - self.execute( - self.sql_delete_table - % { - "table": self.quote_name(model._meta.db_table), - } - ) - # Remove all deferred statements referencing the deleted table. - for sql in list(self.deferred_sql): - if isinstance(sql, Statement) and sql.references_table( - model._meta.db_table - ): - self.deferred_sql.remove(sql) - - def add_index(self, model, index): - """Add an index on a model.""" - if ( - index.contains_expressions - and not self.connection.features.supports_expression_indexes - ): - return None - # Index.create_sql returns interpolated SQL which makes params=None a - # necessity to avoid escaping attempts on execution. - self.execute(index.create_sql(model, self), params=None) - - def remove_index(self, model, index): - """Remove an index from a model.""" - if ( - index.contains_expressions - and not self.connection.features.supports_expression_indexes - ): - return None - self.execute(index.remove_sql(model, self)) - - def rename_index(self, model, old_index, new_index): - if self.connection.features.can_rename_index: - self.execute( - self._rename_index_sql(model, old_index.name, new_index.name), - params=None, - ) - else: - self.remove_index(model, old_index) - self.add_index(model, new_index) - - def add_constraint(self, model, constraint): - """Add a constraint to a model.""" - sql = constraint.create_sql(model, self) - if sql: - # Constraint.create_sql returns interpolated SQL which makes - # params=None a necessity to avoid escaping attempts on execution. - self.execute(sql, params=None) - - def remove_constraint(self, model, constraint): - """Remove a constraint from a model.""" - sql = constraint.remove_sql(model, self) - if sql: - self.execute(sql) - - def alter_unique_together(self, model, old_unique_together, new_unique_together): - """ - Deal with a model changing its unique_together. The input - unique_togethers must be doubly-nested, not the single-nested - ["foo", "bar"] format. - """ - olds = {tuple(fields) for fields in old_unique_together} - news = {tuple(fields) for fields in new_unique_together} - # Deleted uniques - for fields in olds.difference(news): - self._delete_composed_index( - model, - fields, - {"unique": True, "primary_key": False}, - self.sql_delete_unique, - ) - # Created uniques - for field_names in news.difference(olds): - fields = [model._meta.get_field(field) for field in field_names] - self.execute(self._create_unique_sql(model, fields)) - - def alter_index_together(self, model, old_index_together, new_index_together): - """ - Deal with a model changing its index_together. The input - index_togethers must be doubly-nested, not the single-nested - ["foo", "bar"] format. - """ - olds = {tuple(fields) for fields in old_index_together} - news = {tuple(fields) for fields in new_index_together} - # Deleted indexes - for fields in olds.difference(news): - self._delete_composed_index( - model, - fields, - {"index": True, "unique": False}, - self.sql_delete_index, - ) - # Created indexes - for field_names in news.difference(olds): - fields = [model._meta.get_field(field) for field in field_names] - self.execute(self._create_index_sql(model, fields=fields, suffix="_idx")) - - def _delete_composed_index(self, model, fields, constraint_kwargs, sql): - meta_constraint_names = { - constraint.name for constraint in model._meta.constraints - } - meta_index_names = {constraint.name for constraint in model._meta.indexes} - columns = [model._meta.get_field(field).column for field in fields] - constraint_names = self._constraint_names( - model, - columns, - exclude=meta_constraint_names | meta_index_names, - **constraint_kwargs, - ) - if ( - constraint_kwargs.get("unique") is True - and constraint_names - and self.connection.features.allows_multiple_constraints_on_same_fields - ): - # Constraint matching the unique_together name. - default_name = str( - self._unique_constraint_name(model._meta.db_table, columns, quote=False) - ) - if default_name in constraint_names: - constraint_names = [default_name] - if len(constraint_names) != 1: - raise ValueError( - "Found wrong number (%s) of constraints for %s(%s)" - % ( - len(constraint_names), - model._meta.db_table, - ", ".join(columns), - ) - ) - self.execute(self._delete_constraint_sql(sql, model, constraint_names[0])) - - def alter_db_table(self, model, old_db_table, new_db_table): - """Rename the table a model points to.""" - if old_db_table == new_db_table or ( - self.connection.features.ignores_table_name_case - and old_db_table.lower() == new_db_table.lower() - ): - return - self.execute( - self.sql_rename_table - % { - "old_table": self.quote_name(old_db_table), - "new_table": self.quote_name(new_db_table), - } - ) - # Rename all references to the old table name. - for sql in self.deferred_sql: - if isinstance(sql, Statement): - sql.rename_table_references(old_db_table, new_db_table) - - def alter_db_table_comment(self, model, old_db_table_comment, new_db_table_comment): - if self.sql_alter_table_comment and self.connection.features.supports_comments: - self.execute( - self.sql_alter_table_comment - % { - "table": self.quote_name(model._meta.db_table), - "comment": self.quote_value(new_db_table_comment or ""), - } - ) - - def alter_db_tablespace(self, model, old_db_tablespace, new_db_tablespace): - """Move a model's table between tablespaces.""" - self.execute( - self.sql_retablespace_table - % { - "table": self.quote_name(model._meta.db_table), - "old_tablespace": self.quote_name(old_db_tablespace), - "new_tablespace": self.quote_name(new_db_tablespace), - } - ) - - def add_field(self, model, field): - """ - Create a field on a model. Usually involves adding a column, but may - involve adding a table instead (for M2M fields). - """ - # Special-case implicit M2M tables - if field.many_to_many and field.remote_field.through._meta.auto_created: - return self.create_model(field.remote_field.through) - # Get the column's definition - definition, params = self.column_sql(model, field, include_default=True) - # It might not actually have a column behind it - if definition is None: - return - if col_type_suffix := field.db_type_suffix(connection=self.connection): - definition += f" {col_type_suffix}" - # Check constraints can go on the column SQL here - db_params = field.db_parameters(connection=self.connection) - if db_params["check"]: - definition += " " + self.sql_check_constraint % db_params - if ( - field.remote_field - and self.connection.features.supports_foreign_keys - and field.db_constraint - ): - constraint_suffix = "_fk_%(to_table)s_%(to_column)s" - # Add FK constraint inline, if supported. - if self.sql_create_column_inline_fk: - to_table = field.remote_field.model._meta.db_table - to_column = field.remote_field.model._meta.get_field( - field.remote_field.field_name - ).column - namespace, _ = split_identifier(model._meta.db_table) - definition += " " + self.sql_create_column_inline_fk % { - "name": self._fk_constraint_name(model, field, constraint_suffix), - "namespace": ( - "%s." % self.quote_name(namespace) if namespace else "" - ), - "column": self.quote_name(field.column), - "to_table": self.quote_name(to_table), - "to_column": self.quote_name(to_column), - "deferrable": self.connection.ops.deferrable_sql(), - } - # Otherwise, add FK constraints later. - else: - self.deferred_sql.append( - self._create_fk_sql(model, field, constraint_suffix) - ) - # Build the SQL and run it - sql = self.sql_create_column % { - "table": self.quote_name(model._meta.db_table), - "column": self.quote_name(field.column), - "definition": definition, - } - # Prevent using [] as params, in the case a literal '%' is used in the - # definition on backends that don't support parametrized DDL. - self.execute(sql, params or None) - # Drop the default if we need to - if ( - not field.has_db_default() - and not self.skip_default_on_alter(field) - and self.effective_default(field) is not None - ): - changes_sql, params = self._alter_column_default_sql( - model, None, field, drop=True - ) - sql = self.sql_alter_column % { - "table": self.quote_name(model._meta.db_table), - "changes": changes_sql, - } - self.execute(sql, params) - # Add field comment, if required. - if ( - field.db_comment - and self.connection.features.supports_comments - and not self.connection.features.supports_comments_inline - ): - field_type = db_params["type"] - self.execute( - *self._alter_column_comment_sql( - model, field, field_type, field.db_comment - ) - ) - # Add an index, if required - self.deferred_sql.extend(self._field_indexes_sql(model, field)) - # Reset connection if required - if self.connection.features.connection_persists_old_columns: - self.connection.close() - - def remove_field(self, model, field): - """ - Remove a field from a model. Usually involves deleting a column, - but for M2Ms may involve deleting a table. - """ - # Special-case implicit M2M tables - if field.many_to_many and field.remote_field.through._meta.auto_created: - return self.delete_model(field.remote_field.through) - # It might not actually have a column behind it - if field.db_parameters(connection=self.connection)["type"] is None: - return - # Drop any FK constraints, MySQL requires explicit deletion - if field.remote_field: - fk_names = self._constraint_names(model, [field.column], foreign_key=True) - for fk_name in fk_names: - self.execute(self._delete_fk_sql(model, fk_name)) - # Delete the column - sql = self.sql_delete_column % { - "table": self.quote_name(model._meta.db_table), - "column": self.quote_name(field.column), - } - self.execute(sql) - # Reset connection if required - if self.connection.features.connection_persists_old_columns: - self.connection.close() - # Remove all deferred statements referencing the deleted column. - for sql in list(self.deferred_sql): - if isinstance(sql, Statement) and sql.references_column( - model._meta.db_table, field.column - ): - self.deferred_sql.remove(sql) - - def alter_field(self, model, old_field, new_field, strict=False): - """ - Allow a field's type, uniqueness, nullability, default, column, - constraints, etc. to be modified. - `old_field` is required to compute the necessary changes. - If `strict` is True, raise errors if the old column does not match - `old_field` precisely. - """ - if not self._field_should_be_altered(old_field, new_field): - return - # Ensure this field is even column-based - old_db_params = old_field.db_parameters(connection=self.connection) - old_type = old_db_params["type"] - new_db_params = new_field.db_parameters(connection=self.connection) - new_type = new_db_params["type"] - modifying_generated_field = False - if (old_type is None and old_field.remote_field is None) or ( - new_type is None and new_field.remote_field is None - ): - raise ValueError( - "Cannot alter field %s into %s - they do not properly define " - "db_type (are you using a badly-written custom field?)" - % (old_field, new_field), - ) - elif ( - old_type is None - and new_type is None - and ( - old_field.remote_field.through - and new_field.remote_field.through - and old_field.remote_field.through._meta.auto_created - and new_field.remote_field.through._meta.auto_created - ) - ): - return self._alter_many_to_many(model, old_field, new_field, strict) - elif ( - old_type is None - and new_type is None - and ( - old_field.remote_field.through - and new_field.remote_field.through - and not old_field.remote_field.through._meta.auto_created - and not new_field.remote_field.through._meta.auto_created - ) - ): - # Both sides have through models; this is a no-op. - return - elif old_type is None or new_type is None: - raise ValueError( - "Cannot alter field %s into %s - they are not compatible types " - "(you cannot alter to or from M2M fields, or add or remove " - "through= on M2M fields)" % (old_field, new_field) - ) - elif old_field.generated != new_field.generated or ( - new_field.generated and old_field.db_persist != new_field.db_persist - ): - modifying_generated_field = True - elif new_field.generated: - try: - old_field_sql = old_field.generated_sql(self.connection) - except FieldError: - # Field used in a generated field was renamed. - modifying_generated_field = True - else: - new_field_sql = new_field.generated_sql(self.connection) - modifying_generated_field = old_field_sql != new_field_sql - if modifying_generated_field: - raise ValueError( - f"Modifying GeneratedFields is not supported - the field {new_field} " - "must be removed and re-added with the new definition." - ) - - self._alter_field( - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict, - ) - - def _field_db_check(self, field, field_db_params): - # Always check constraints with the same mocked column name to avoid - # recreating constrains when the column is renamed. - check_constraints = self.connection.data_type_check_constraints - data = field.db_type_parameters(self.connection) - data["column"] = "__column_name__" - try: - return check_constraints[field.get_internal_type()] % data - except KeyError: - return None - - def _alter_field( - self, - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict=False, - ): - """Perform a "physical" (non-ManyToMany) field update.""" - # Drop any FK constraints, we'll remake them later - fks_dropped = set() - if ( - self.connection.features.supports_foreign_keys - and old_field.remote_field - and old_field.db_constraint - and self._field_should_be_altered( - old_field, - new_field, - ignore={"db_comment"}, - ) - ): - fk_names = self._constraint_names( - model, [old_field.column], foreign_key=True - ) - if strict and len(fk_names) != 1: - raise ValueError( - "Found wrong number (%s) of foreign key constraints for %s.%s" - % ( - len(fk_names), - model._meta.db_table, - old_field.column, - ) - ) - for fk_name in fk_names: - fks_dropped.add((old_field.column,)) - self.execute(self._delete_fk_sql(model, fk_name)) - # Has unique been removed? - if old_field.unique and ( - not new_field.unique or self._field_became_primary_key(old_field, new_field) - ): - # Find the unique constraint for this field - meta_constraint_names = { - constraint.name for constraint in model._meta.constraints - } - constraint_names = self._constraint_names( - model, - [old_field.column], - unique=True, - primary_key=False, - exclude=meta_constraint_names, - ) - if strict and len(constraint_names) != 1: - raise ValueError( - "Found wrong number (%s) of unique constraints for %s.%s" - % ( - len(constraint_names), - model._meta.db_table, - old_field.column, - ) - ) - for constraint_name in constraint_names: - self.execute(self._delete_unique_sql(model, constraint_name)) - # Drop incoming FK constraints if the field is a primary key or unique, - # which might be a to_field target, and things are going to change. - old_collation = old_db_params.get("collation") - new_collation = new_db_params.get("collation") - drop_foreign_keys = ( - self.connection.features.supports_foreign_keys - and ( - (old_field.primary_key and new_field.primary_key) - or (old_field.unique and new_field.unique) - ) - and ((old_type != new_type) or (old_collation != new_collation)) - ) - if drop_foreign_keys: - # '_meta.related_field' also contains M2M reverse fields, these - # will be filtered out - for _old_rel, new_rel in _related_non_m2m_objects(old_field, new_field): - rel_fk_names = self._constraint_names( - new_rel.related_model, [new_rel.field.column], foreign_key=True - ) - for fk_name in rel_fk_names: - self.execute(self._delete_fk_sql(new_rel.related_model, fk_name)) - # Removed an index? (no strict check, as multiple indexes are possible) - # Remove indexes if db_index switched to False or a unique constraint - # will now be used in lieu of an index. The following lines from the - # truth table show all True cases; the rest are False: - # - # old_field.db_index | old_field.unique | new_field.db_index | new_field.unique - # ------------------------------------------------------------------------------ - # True | False | False | False - # True | False | False | True - # True | False | True | True - if ( - old_field.db_index - and not old_field.unique - and (not new_field.db_index or new_field.unique) - ): - # Find the index for this field - meta_index_names = {index.name for index in model._meta.indexes} - # Retrieve only BTREE indexes since this is what's created with - # db_index=True. - index_names = self._constraint_names( - model, - [old_field.column], - index=True, - type_=Index.suffix, - exclude=meta_index_names, - ) - for index_name in index_names: - # The only way to check if an index was created with - # db_index=True or with Index(['field'], name='foo') - # is to look at its name (refs #28053). - self.execute(self._delete_index_sql(model, index_name)) - # Change check constraints? - old_db_check = self._field_db_check(old_field, old_db_params) - new_db_check = self._field_db_check(new_field, new_db_params) - if old_db_check != new_db_check and old_db_check: - meta_constraint_names = { - constraint.name for constraint in model._meta.constraints - } - constraint_names = self._constraint_names( - model, - [old_field.column], - check=True, - exclude=meta_constraint_names, - ) - if strict and len(constraint_names) != 1: - raise ValueError( - "Found wrong number (%s) of check constraints for %s.%s" - % ( - len(constraint_names), - model._meta.db_table, - old_field.column, - ) - ) - for constraint_name in constraint_names: - self.execute(self._delete_check_sql(model, constraint_name)) - # Have they renamed the column? - if old_field.column != new_field.column: - self.execute( - self._rename_field_sql( - model._meta.db_table, old_field, new_field, new_type - ) - ) - # Rename all references to the renamed column. - for sql in self.deferred_sql: - if isinstance(sql, Statement): - sql.rename_column_references( - model._meta.db_table, old_field.column, new_field.column - ) - # Next, start accumulating actions to do - actions = [] - null_actions = [] - post_actions = [] - # Type suffix change? (e.g. auto increment). - old_type_suffix = old_field.db_type_suffix(connection=self.connection) - new_type_suffix = new_field.db_type_suffix(connection=self.connection) - # Type, collation, or comment change? - if ( - old_type != new_type - or old_type_suffix != new_type_suffix - or old_collation != new_collation - or ( - self.connection.features.supports_comments - and old_field.db_comment != new_field.db_comment - ) - ): - fragment, other_actions = self._alter_column_type_sql( - model, old_field, new_field, new_type, old_collation, new_collation - ) - actions.append(fragment) - post_actions.extend(other_actions) - - if new_field.has_db_default(): - if ( - not old_field.has_db_default() - or new_field.db_default != old_field.db_default - ): - actions.append( - self._alter_column_database_default_sql(model, old_field, new_field) - ) - elif old_field.has_db_default(): - actions.append( - self._alter_column_database_default_sql( - model, old_field, new_field, drop=True - ) - ) - # When changing a column NULL constraint to NOT NULL with a given - # default value, we need to perform 4 steps: - # 1. Add a default for new incoming writes - # 2. Update existing NULL rows with new default - # 3. Replace NULL constraint with NOT NULL - # 4. Drop the default again. - # Default change? - needs_database_default = False - if old_field.null and not new_field.null and not new_field.has_db_default(): - old_default = self.effective_default(old_field) - new_default = self.effective_default(new_field) - if ( - not self.skip_default_on_alter(new_field) - and old_default != new_default - and new_default is not None - ): - needs_database_default = True - actions.append( - self._alter_column_default_sql(model, old_field, new_field) - ) - # Nullability change? - if old_field.null != new_field.null: - fragment = self._alter_column_null_sql(model, old_field, new_field) - if fragment: - null_actions.append(fragment) - # Only if we have a default and there is a change from NULL to NOT NULL - four_way_default_alteration = ( - new_field.has_default() or new_field.has_db_default() - ) and (old_field.null and not new_field.null) - if actions or null_actions: - if not four_way_default_alteration: - # If we don't have to do a 4-way default alteration we can - # directly run a (NOT) NULL alteration - actions += null_actions - # Combine actions together if we can (e.g. postgres) - if self.connection.features.supports_combined_alters and actions: - sql, params = tuple(zip(*actions)) - actions = [(", ".join(sql), sum(params, []))] - # Apply those actions - for sql, params in actions: - self.execute( - self.sql_alter_column - % { - "table": self.quote_name(model._meta.db_table), - "changes": sql, - }, - params, - ) - if four_way_default_alteration: - if not new_field.has_db_default(): - default_sql = "%s" - params = [new_default] - else: - default_sql, params = self.db_default_sql(new_field) - # Update existing rows with default value - self.execute( - self.sql_update_with_default - % { - "table": self.quote_name(model._meta.db_table), - "column": self.quote_name(new_field.column), - "default": default_sql, - }, - params, - ) - # Since we didn't run a NOT NULL change before we need to do it - # now - for sql, params in null_actions: - self.execute( - self.sql_alter_column - % { - "table": self.quote_name(model._meta.db_table), - "changes": sql, - }, - params, - ) - if post_actions: - for sql, params in post_actions: - self.execute(sql, params) - # If primary_key changed to False, delete the primary key constraint. - if old_field.primary_key and not new_field.primary_key: - self._delete_primary_key(model, strict) - # Added a unique? - if self._unique_should_be_added(old_field, new_field): - self.execute(self._create_unique_sql(model, [new_field])) - # Added an index? Add an index if db_index switched to True or a unique - # constraint will no longer be used in lieu of an index. The following - # lines from the truth table show all True cases; the rest are False: - # - # old_field.db_index | old_field.unique | new_field.db_index | new_field.unique - # ------------------------------------------------------------------------------ - # False | False | True | False - # False | True | True | False - # True | True | True | False - if ( - (not old_field.db_index or old_field.unique) - and new_field.db_index - and not new_field.unique - ): - self.execute(self._create_index_sql(model, fields=[new_field])) - # Type alteration on primary key? Then we need to alter the column - # referring to us. - rels_to_update = [] - if drop_foreign_keys: - rels_to_update.extend(_related_non_m2m_objects(old_field, new_field)) - # Changed to become primary key? - if self._field_became_primary_key(old_field, new_field): - # Make the new one - self.execute(self._create_primary_key_sql(model, new_field)) - # Update all referencing columns - rels_to_update.extend(_related_non_m2m_objects(old_field, new_field)) - # Handle our type alters on the other end of rels from the PK stuff above - for old_rel, new_rel in rels_to_update: - rel_db_params = new_rel.field.db_parameters(connection=self.connection) - rel_type = rel_db_params["type"] - rel_collation = rel_db_params.get("collation") - old_rel_db_params = old_rel.field.db_parameters(connection=self.connection) - old_rel_collation = old_rel_db_params.get("collation") - fragment, other_actions = self._alter_column_type_sql( - new_rel.related_model, - old_rel.field, - new_rel.field, - rel_type, - old_rel_collation, - rel_collation, - ) - self.execute( - self.sql_alter_column - % { - "table": self.quote_name(new_rel.related_model._meta.db_table), - "changes": fragment[0], - }, - fragment[1], - ) - for sql, params in other_actions: - self.execute(sql, params) - # Does it have a foreign key? - if ( - self.connection.features.supports_foreign_keys - and new_field.remote_field - and ( - fks_dropped or not old_field.remote_field or not old_field.db_constraint - ) - and new_field.db_constraint - ): - self.execute( - self._create_fk_sql(model, new_field, "_fk_%(to_table)s_%(to_column)s") - ) - # Rebuild FKs that pointed to us if we previously had to drop them - if drop_foreign_keys: - for _, rel in rels_to_update: - if rel.field.db_constraint: - self.execute( - self._create_fk_sql(rel.related_model, rel.field, "_fk") - ) - # Does it have check constraints we need to add? - if old_db_check != new_db_check and new_db_check: - constraint_name = self._create_index_name( - model._meta.db_table, [new_field.column], suffix="_check" - ) - self.execute( - self._create_check_sql(model, constraint_name, new_db_params["check"]) - ) - # Drop the default if we need to - # (Django usually does not use in-database defaults) - if needs_database_default: - changes_sql, params = self._alter_column_default_sql( - model, old_field, new_field, drop=True - ) - sql = self.sql_alter_column % { - "table": self.quote_name(model._meta.db_table), - "changes": changes_sql, - } - self.execute(sql, params) - # Reset connection if required - if self.connection.features.connection_persists_old_columns: - self.connection.close() - - def _alter_column_null_sql(self, model, old_field, new_field): - """ - Hook to specialize column null alteration. - - Return a (sql, params) fragment to set a column to null or non-null - as required by new_field, or None if no changes are required. - """ - if ( - self.connection.features.interprets_empty_strings_as_nulls - and new_field.empty_strings_allowed - ): - # The field is nullable in the database anyway, leave it alone. - return - else: - new_db_params = new_field.db_parameters(connection=self.connection) - sql = ( - self.sql_alter_column_null - if new_field.null - else self.sql_alter_column_not_null - ) - return ( - sql - % { - "column": self.quote_name(new_field.column), - "type": new_db_params["type"], - }, - [], - ) - - def _alter_column_default_sql(self, model, old_field, new_field, drop=False): - """ - Hook to specialize column default alteration. - - Return a (sql, params) fragment to add or drop (depending on the drop - argument) a default to new_field's column. - """ - new_default = self.effective_default(new_field) - default = self._column_default_sql(new_field) - params = [new_default] - - if drop: - params = [] - elif self.connection.features.requires_literal_defaults: - # Some databases (Oracle) can't take defaults as a parameter - # If this is the case, the SchemaEditor for that database should - # implement prepare_default(). - default = self.prepare_default(new_default) - params = [] - - new_db_params = new_field.db_parameters(connection=self.connection) - if drop: - if new_field.null: - sql = self.sql_alter_column_no_default_null - else: - sql = self.sql_alter_column_no_default - else: - sql = self.sql_alter_column_default - return ( - sql - % { - "column": self.quote_name(new_field.column), - "type": new_db_params["type"], - "default": default, - }, - params, - ) - - def _alter_column_database_default_sql( - self, model, old_field, new_field, drop=False - ): - """ - Hook to specialize column database default alteration. - - Return a (sql, params) fragment to add or drop (depending on the drop - argument) a default to new_field's column. - """ - if drop: - sql = self.sql_alter_column_no_default - default_sql = "" - params = [] - else: - sql = self.sql_alter_column_default - default_sql, params = self.db_default_sql(new_field) - - new_db_params = new_field.db_parameters(connection=self.connection) - return ( - sql - % { - "column": self.quote_name(new_field.column), - "type": new_db_params["type"], - "default": default_sql, - }, - params, - ) - - def _alter_column_type_sql( - self, model, old_field, new_field, new_type, old_collation, new_collation - ): - """ - Hook to specialize column type alteration for different backends, - for cases when a creation type is different to an alteration type - (e.g. SERIAL in PostgreSQL, PostGIS fields). - - Return a 2-tuple of: an SQL fragment of (sql, params) to insert into - an ALTER TABLE statement and a list of extra (sql, params) tuples to - run once the field is altered. - """ - other_actions = [] - if collate_sql := self._collate_sql( - new_collation, old_collation, model._meta.db_table - ): - collate_sql = f" {collate_sql}" - else: - collate_sql = "" - # Comment change? - comment_sql = "" - if self.connection.features.supports_comments and not new_field.many_to_many: - if old_field.db_comment != new_field.db_comment: - # PostgreSQL and Oracle can't execute 'ALTER COLUMN ...' and - # 'COMMENT ON ...' at the same time. - sql, params = self._alter_column_comment_sql( - model, new_field, new_type, new_field.db_comment - ) - if sql: - other_actions.append((sql, params)) - if new_field.db_comment: - comment_sql = self._comment_sql(new_field.db_comment) - return ( - ( - self.sql_alter_column_type - % { - "column": self.quote_name(new_field.column), - "type": new_type, - "collation": collate_sql, - "comment": comment_sql, - }, - [], - ), - other_actions, - ) - - def _alter_column_comment_sql(self, model, new_field, new_type, new_db_comment): - return ( - self.sql_alter_column_comment - % { - "table": self.quote_name(model._meta.db_table), - "column": self.quote_name(new_field.column), - "comment": self._comment_sql(new_db_comment), - }, - [], - ) - - def _comment_sql(self, comment): - return self.quote_value(comment or "") - - def _alter_many_to_many(self, model, old_field, new_field, strict): - """Alter M2Ms to repoint their to= endpoints.""" - # Rename the through table - if ( - old_field.remote_field.through._meta.db_table - != new_field.remote_field.through._meta.db_table - ): - self.alter_db_table( - old_field.remote_field.through, - old_field.remote_field.through._meta.db_table, - new_field.remote_field.through._meta.db_table, - ) - # Repoint the FK to the other side - self.alter_field( - new_field.remote_field.through, - # The field that points to the target model is needed, so we can - # tell alter_field to change it - this is m2m_reverse_field_name() - # (as opposed to m2m_field_name(), which points to our model). - old_field.remote_field.through._meta.get_field( - old_field.m2m_reverse_field_name() - ), - new_field.remote_field.through._meta.get_field( - new_field.m2m_reverse_field_name() - ), - ) - self.alter_field( - new_field.remote_field.through, - # for self-referential models we need to alter field from the other end too - old_field.remote_field.through._meta.get_field(old_field.m2m_field_name()), - new_field.remote_field.through._meta.get_field(new_field.m2m_field_name()), - ) - - def _create_index_name(self, table_name, column_names, suffix=""): - """ - Generate a unique name for an index/unique constraint. - - The name is divided into 3 parts: the table name, the column names, - and a unique digest and suffix. - """ - _, table_name = split_identifier(table_name) - hash_suffix_part = "%s%s" % ( - names_digest(table_name, *column_names, length=8), - suffix, - ) - max_length = self.connection.ops.max_name_length() or 200 - # If everything fits into max_length, use that name. - index_name = "%s_%s_%s" % (table_name, "_".join(column_names), hash_suffix_part) - if len(index_name) <= max_length: - return index_name - # Shorten a long suffix. - if len(hash_suffix_part) > max_length / 3: - hash_suffix_part = hash_suffix_part[: max_length // 3] - other_length = (max_length - len(hash_suffix_part)) // 2 - 1 - index_name = "%s_%s_%s" % ( - table_name[:other_length], - "_".join(column_names)[:other_length], - hash_suffix_part, - ) - # Prepend D if needed to prevent the name from starting with an - # underscore or a number (not permitted on Oracle). - if index_name[0] == "_" or index_name[0].isdigit(): - index_name = "D%s" % index_name[:-1] - return index_name - - def _get_index_tablespace_sql(self, model, fields, db_tablespace=None): - if db_tablespace is None: - if len(fields) == 1 and fields[0].db_tablespace: - db_tablespace = fields[0].db_tablespace - elif settings.DEFAULT_INDEX_TABLESPACE: - db_tablespace = settings.DEFAULT_INDEX_TABLESPACE - elif model._meta.db_tablespace: - db_tablespace = model._meta.db_tablespace - if db_tablespace is not None: - return " " + self.connection.ops.tablespace_sql(db_tablespace) - return "" - - def _index_condition_sql(self, condition): - if condition: - return " WHERE " + condition - return "" - - def _index_include_sql(self, model, columns): - if not columns or not self.connection.features.supports_covering_indexes: - return "" - return Statement( - " INCLUDE (%(columns)s)", - columns=Columns(model._meta.db_table, columns, self.quote_name), - ) - - def _create_index_sql( - self, - model, - *, - fields=None, - name=None, - suffix="", - using="", - db_tablespace=None, - col_suffixes=(), - sql=None, - opclasses=(), - condition=None, - include=None, - expressions=None, - ): - """ - Return the SQL statement to create the index for one or several fields - or expressions. `sql` can be specified if the syntax differs from the - standard (GIS indexes, ...). - """ - fields = fields or [] - expressions = expressions or [] - compiler = Query(model, alias_cols=False).get_compiler( - connection=self.connection, - ) - tablespace_sql = self._get_index_tablespace_sql( - model, fields, db_tablespace=db_tablespace - ) - columns = [field.column for field in fields] - sql_create_index = sql or self.sql_create_index - table = model._meta.db_table - - def create_index_name(*args, **kwargs): - nonlocal name - if name is None: - name = self._create_index_name(*args, **kwargs) - return self.quote_name(name) - - return Statement( - sql_create_index, - table=Table(table, self.quote_name), - name=IndexName(table, columns, suffix, create_index_name), - using=using, - columns=( - self._index_columns(table, columns, col_suffixes, opclasses) - if columns - else Expressions(table, expressions, compiler, self.quote_value) - ), - extra=tablespace_sql, - condition=self._index_condition_sql(condition), - include=self._index_include_sql(model, include), - ) - - def _delete_index_sql(self, model, name, sql=None): - statement = Statement( - sql or self.sql_delete_index, - table=Table(model._meta.db_table, self.quote_name), - name=self.quote_name(name), - ) - - # Remove all deferred statements referencing the deleted index. - table_name = statement.parts["table"].table - index_name = statement.parts["name"] - for sql in list(self.deferred_sql): - if isinstance(sql, Statement) and sql.references_index( - table_name, index_name - ): - self.deferred_sql.remove(sql) - - return statement - - def _rename_index_sql(self, model, old_name, new_name): - return Statement( - self.sql_rename_index, - table=Table(model._meta.db_table, self.quote_name), - old_name=self.quote_name(old_name), - new_name=self.quote_name(new_name), - ) - - def _index_columns(self, table, columns, col_suffixes, opclasses): - return Columns(table, columns, self.quote_name, col_suffixes=col_suffixes) - - def _model_indexes_sql(self, model): - """ - Return a list of all index SQL statements (field indexes, Meta.indexes) - for the specified model. - """ - if not model._meta.managed or model._meta.proxy or model._meta.swapped: - return [] - output = [] - for field in model._meta.local_fields: - output.extend(self._field_indexes_sql(model, field)) - - for index in model._meta.indexes: - if ( - not index.contains_expressions - or self.connection.features.supports_expression_indexes - ): - output.append(index.create_sql(model, self)) - return output - - def _field_indexes_sql(self, model, field): - """ - Return a list of all index SQL statements for the specified field. - """ - output = [] - if self._field_should_be_indexed(model, field): - output.append(self._create_index_sql(model, fields=[field])) - return output - - def _field_should_be_altered(self, old_field, new_field, ignore=None): - if not old_field.concrete and not new_field.concrete: - return False - ignore = ignore or set() - _, old_path, old_args, old_kwargs = old_field.deconstruct() - _, new_path, new_args, new_kwargs = new_field.deconstruct() - # Don't alter when: - # - changing only a field name - # - changing an attribute that doesn't affect the schema - # - changing an attribute in the provided set of ignored attributes - # - adding only a db_column and the column name is not changed - # - db_table does not change for model referenced by foreign keys - for attr in ignore.union(old_field.non_db_attrs): - old_kwargs.pop(attr, None) - for attr in ignore.union(new_field.non_db_attrs): - new_kwargs.pop(attr, None) - if ( - not new_field.many_to_many - and old_field.remote_field - and new_field.remote_field - and old_field.remote_field.model._meta.db_table - == new_field.remote_field.model._meta.db_table - ): - old_kwargs.pop("to", None) - new_kwargs.pop("to", None) - # db_default can take many form but result in the same SQL. - if ( - old_kwargs.get("db_default") - and new_kwargs.get("db_default") - and self.db_default_sql(old_field) == self.db_default_sql(new_field) - ): - old_kwargs.pop("db_default") - new_kwargs.pop("db_default") - return self.quote_name(old_field.column) != self.quote_name( - new_field.column - ) or (old_path, old_args, old_kwargs) != (new_path, new_args, new_kwargs) - - def _field_should_be_indexed(self, model, field): - return field.db_index and not field.unique - - def _field_became_primary_key(self, old_field, new_field): - return not old_field.primary_key and new_field.primary_key - - def _unique_should_be_added(self, old_field, new_field): - return ( - not new_field.primary_key - and new_field.unique - and (not old_field.unique or old_field.primary_key) - ) - - def _rename_field_sql(self, table, old_field, new_field, new_type): - return self.sql_rename_column % { - "table": self.quote_name(table), - "old_column": self.quote_name(old_field.column), - "new_column": self.quote_name(new_field.column), - "type": new_type, - } - - def _create_fk_sql(self, model, field, suffix): - table = Table(model._meta.db_table, self.quote_name) - name = self._fk_constraint_name(model, field, suffix) - column = Columns(model._meta.db_table, [field.column], self.quote_name) - to_table = Table(field.target_field.model._meta.db_table, self.quote_name) - to_column = Columns( - field.target_field.model._meta.db_table, - [field.target_field.column], - self.quote_name, - ) - deferrable = self.connection.ops.deferrable_sql() - return Statement( - self.sql_create_fk, - table=table, - name=name, - column=column, - to_table=to_table, - to_column=to_column, - deferrable=deferrable, - ) - - def _fk_constraint_name(self, model, field, suffix): - def create_fk_name(*args, **kwargs): - return self.quote_name(self._create_index_name(*args, **kwargs)) - - return ForeignKeyName( - model._meta.db_table, - [field.column], - split_identifier(field.target_field.model._meta.db_table)[1], - [field.target_field.column], - suffix, - create_fk_name, - ) - - def _delete_fk_sql(self, model, name): - return self._delete_constraint_sql(self.sql_delete_fk, model, name) - - def _deferrable_constraint_sql(self, deferrable): - if deferrable is None: - return "" - if deferrable == Deferrable.DEFERRED: - return " DEFERRABLE INITIALLY DEFERRED" - if deferrable == Deferrable.IMMEDIATE: - return " DEFERRABLE INITIALLY IMMEDIATE" - - def _unique_index_nulls_distinct_sql(self, nulls_distinct): - if nulls_distinct is False: - return " NULLS NOT DISTINCT" - elif nulls_distinct is True: - return " NULLS DISTINCT" - return "" - - def _unique_supported( - self, - condition=None, - deferrable=None, - include=None, - expressions=None, - nulls_distinct=None, - ): - return ( - (not condition or self.connection.features.supports_partial_indexes) - and ( - not deferrable - or self.connection.features.supports_deferrable_unique_constraints - ) - and (not include or self.connection.features.supports_covering_indexes) - and ( - not expressions or self.connection.features.supports_expression_indexes - ) - and ( - nulls_distinct is None - or self.connection.features.supports_nulls_distinct_unique_constraints - ) - ) - - def _unique_sql( - self, - model, - fields, - name, - condition=None, - deferrable=None, - include=None, - opclasses=None, - expressions=None, - nulls_distinct=None, - ): - if not self._unique_supported( - condition=condition, - deferrable=deferrable, - include=include, - expressions=expressions, - nulls_distinct=nulls_distinct, - ): - return None - - if ( - condition - or include - or opclasses - or expressions - or nulls_distinct is not None - ): - # Databases support conditional, covering, functional unique, - # and nulls distinct constraints via a unique index. - sql = self._create_unique_sql( - model, - fields, - name=name, - condition=condition, - include=include, - opclasses=opclasses, - expressions=expressions, - nulls_distinct=nulls_distinct, - ) - if sql: - self.deferred_sql.append(sql) - return None - constraint = self.sql_unique_constraint % { - "columns": ", ".join([self.quote_name(field.column) for field in fields]), - "deferrable": self._deferrable_constraint_sql(deferrable), - } - return self.sql_constraint % { - "name": self.quote_name(name), - "constraint": constraint, - } - - def _create_unique_sql( - self, - model, - fields, - name=None, - condition=None, - deferrable=None, - include=None, - opclasses=None, - expressions=None, - nulls_distinct=None, - ): - if not self._unique_supported( - condition=condition, - deferrable=deferrable, - include=include, - expressions=expressions, - nulls_distinct=nulls_distinct, - ): - return None - - compiler = Query(model, alias_cols=False).get_compiler( - connection=self.connection - ) - table = model._meta.db_table - columns = [field.column for field in fields] - if name is None: - name = self._unique_constraint_name(table, columns, quote=True) - else: - name = self.quote_name(name) - if condition or include or opclasses or expressions: - sql = self.sql_create_unique_index - else: - sql = self.sql_create_unique - if columns: - columns = self._index_columns( - table, columns, col_suffixes=(), opclasses=opclasses - ) - else: - columns = Expressions(table, expressions, compiler, self.quote_value) - return Statement( - sql, - table=Table(table, self.quote_name), - name=name, - columns=columns, - condition=self._index_condition_sql(condition), - deferrable=self._deferrable_constraint_sql(deferrable), - include=self._index_include_sql(model, include), - nulls_distinct=self._unique_index_nulls_distinct_sql(nulls_distinct), - ) - - def _unique_constraint_name(self, table, columns, quote=True): - if quote: - - def create_unique_name(*args, **kwargs): - return self.quote_name(self._create_index_name(*args, **kwargs)) - - else: - create_unique_name = self._create_index_name - - return IndexName(table, columns, "_uniq", create_unique_name) - - def _delete_unique_sql( - self, - model, - name, - condition=None, - deferrable=None, - include=None, - opclasses=None, - expressions=None, - nulls_distinct=None, - ): - if not self._unique_supported( - condition=condition, - deferrable=deferrable, - include=include, - expressions=expressions, - nulls_distinct=nulls_distinct, - ): - return None - if condition or include or opclasses or expressions: - sql = self.sql_delete_index - else: - sql = self.sql_delete_unique - return self._delete_constraint_sql(sql, model, name) - - def _check_sql(self, name, check): - return self.sql_constraint % { - "name": self.quote_name(name), - "constraint": self.sql_check_constraint % {"check": check}, - } - - def _create_check_sql(self, model, name, check): - if not self.connection.features.supports_table_check_constraints: - return None - return Statement( - self.sql_create_check, - table=Table(model._meta.db_table, self.quote_name), - name=self.quote_name(name), - check=check, - ) - - def _delete_check_sql(self, model, name): - if not self.connection.features.supports_table_check_constraints: - return None - return self._delete_constraint_sql(self.sql_delete_check, model, name) - - def _delete_constraint_sql(self, template, model, name): - return Statement( - template, - table=Table(model._meta.db_table, self.quote_name), - name=self.quote_name(name), - ) - - def _constraint_names( - self, - model, - column_names=None, - unique=None, - primary_key=None, - index=None, - foreign_key=None, - check=None, - type_=None, - exclude=None, - ): - """Return all constraint names matching the columns and conditions.""" - if column_names is not None: - column_names = [ - ( - self.connection.introspection.identifier_converter( - truncate_name(name, self.connection.ops.max_name_length()) - ) - if self.connection.features.truncates_names - else self.connection.introspection.identifier_converter(name) - ) - for name in column_names - ] - with self.connection.cursor() as cursor: - constraints = self.connection.introspection.get_constraints( - cursor, model._meta.db_table - ) - result = [] - for name, infodict in constraints.items(): - if column_names is None or column_names == infodict["columns"]: - if unique is not None and infodict["unique"] != unique: - continue - if primary_key is not None and infodict["primary_key"] != primary_key: - continue - if index is not None and infodict["index"] != index: - continue - if check is not None and infodict["check"] != check: - continue - if foreign_key is not None and not infodict["foreign_key"]: - continue - if type_ is not None and infodict["type"] != type_: - continue - if not exclude or name not in exclude: - result.append(name) - return result - - def _pk_constraint_sql(self, columns): - return self.sql_pk_constraint % { - "columns": ", ".join(self.quote_name(column) for column in columns) - } - - def _delete_primary_key(self, model, strict=False): - constraint_names = self._constraint_names(model, primary_key=True) - if strict and len(constraint_names) != 1: - raise ValueError( - "Found wrong number (%s) of PK constraints for %s" - % ( - len(constraint_names), - model._meta.db_table, - ) - ) - for constraint_name in constraint_names: - self.execute(self._delete_primary_key_sql(model, constraint_name)) - - def _create_primary_key_sql(self, model, field): - return Statement( - self.sql_create_pk, - table=Table(model._meta.db_table, self.quote_name), - name=self.quote_name( - self._create_index_name( - model._meta.db_table, [field.column], suffix="_pk" - ) - ), - columns=Columns(model._meta.db_table, [field.column], self.quote_name), - ) - - def _delete_primary_key_sql(self, model, name): - return self._delete_constraint_sql(self.sql_delete_pk, model, name) - - def _collate_sql(self, collation, old_collation=None, table_name=None): - return "COLLATE " + self.quote_name(collation) if collation else "" - - def remove_procedure(self, procedure_name, param_types=()): - sql = self.sql_delete_procedure % { - "procedure": self.quote_name(procedure_name), - "param_types": ",".join(param_types), - } - self.execute(sql) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/base/validation.py b/.venv/lib/python3.10/site-packages/django/db/backends/base/validation.py deleted file mode 100644 index d0e3e21..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/base/validation.py +++ /dev/null @@ -1,29 +0,0 @@ -class BaseDatabaseValidation: - """Encapsulate backend-specific validation.""" - - def __init__(self, connection): - self.connection = connection - - def check(self, **kwargs): - return [] - - def check_field(self, field, **kwargs): - errors = [] - # Backends may implement a check_field_type() method. - if ( - hasattr(self, "check_field_type") - and - # Ignore any related fields. - not getattr(field, "remote_field", None) - ): - # Ignore fields with unsupported features. - db_supports_all_required_features = all( - getattr(self.connection.features, feature, False) - for feature in field.model._meta.required_db_features - ) - if db_supports_all_required_features: - field_type = field.db_type(self.connection) - # Ignore non-concrete fields. - if field_type is not None: - errors.extend(self.check_field_type(field, field_type)) - return errors diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/ddl_references.py b/.venv/lib/python3.10/site-packages/django/db/backends/ddl_references.py deleted file mode 100644 index cb8d2de..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/ddl_references.py +++ /dev/null @@ -1,270 +0,0 @@ -""" -Helpers to manipulate deferred DDL statements that might need to be adjusted or -discarded within when executing a migration. -""" - -from copy import deepcopy - - -class Reference: - """Base class that defines the reference interface.""" - - def references_table(self, table): - """ - Return whether or not this instance references the specified table. - """ - return False - - def references_column(self, table, column): - """ - Return whether or not this instance references the specified column. - """ - return False - - def references_index(self, table, index): - """ - Return whether or not this instance references the specified index. - """ - return False - - def rename_table_references(self, old_table, new_table): - """ - Rename all references to the old_name to the new_table. - """ - pass - - def rename_column_references(self, table, old_column, new_column): - """ - Rename all references to the old_column to the new_column. - """ - pass - - def __repr__(self): - return "<%s %r>" % (self.__class__.__name__, str(self)) - - def __str__(self): - raise NotImplementedError( - "Subclasses must define how they should be converted to string." - ) - - -class Table(Reference): - """Hold a reference to a table.""" - - def __init__(self, table, quote_name): - self.table = table - self.quote_name = quote_name - - def references_table(self, table): - return self.table == table - - def references_index(self, table, index): - return self.references_table(table) and str(self) == index - - def rename_table_references(self, old_table, new_table): - if self.table == old_table: - self.table = new_table - - def __str__(self): - return self.quote_name(self.table) - - -class TableColumns(Table): - """Base class for references to multiple columns of a table.""" - - def __init__(self, table, columns): - self.table = table - self.columns = columns - - def references_column(self, table, column): - return self.table == table and column in self.columns - - def rename_column_references(self, table, old_column, new_column): - if self.table == table: - for index, column in enumerate(self.columns): - if column == old_column: - self.columns[index] = new_column - - -class Columns(TableColumns): - """Hold a reference to one or many columns.""" - - def __init__(self, table, columns, quote_name, col_suffixes=()): - self.quote_name = quote_name - self.col_suffixes = col_suffixes - super().__init__(table, columns) - - def __str__(self): - def col_str(column, idx): - col = self.quote_name(column) - try: - suffix = self.col_suffixes[idx] - if suffix: - col = "{} {}".format(col, suffix) - except IndexError: - pass - return col - - return ", ".join( - col_str(column, idx) for idx, column in enumerate(self.columns) - ) - - -class IndexName(TableColumns): - """Hold a reference to an index name.""" - - def __init__(self, table, columns, suffix, create_index_name): - self.suffix = suffix - self.create_index_name = create_index_name - super().__init__(table, columns) - - def __str__(self): - return self.create_index_name(self.table, self.columns, self.suffix) - - -class IndexColumns(Columns): - def __init__(self, table, columns, quote_name, col_suffixes=(), opclasses=()): - self.opclasses = opclasses - super().__init__(table, columns, quote_name, col_suffixes) - - def __str__(self): - def col_str(column, idx): - # Index.__init__() guarantees that self.opclasses is the same - # length as self.columns. - col = "{} {}".format(self.quote_name(column), self.opclasses[idx]) - try: - suffix = self.col_suffixes[idx] - if suffix: - col = "{} {}".format(col, suffix) - except IndexError: - pass - return col - - return ", ".join( - col_str(column, idx) for idx, column in enumerate(self.columns) - ) - - -class ForeignKeyName(TableColumns): - """Hold a reference to a foreign key name.""" - - def __init__( - self, - from_table, - from_columns, - to_table, - to_columns, - suffix_template, - create_fk_name, - ): - self.to_reference = TableColumns(to_table, to_columns) - self.suffix_template = suffix_template - self.create_fk_name = create_fk_name - super().__init__( - from_table, - from_columns, - ) - - def references_table(self, table): - return super().references_table(table) or self.to_reference.references_table( - table - ) - - def references_column(self, table, column): - return super().references_column( - table, column - ) or self.to_reference.references_column(table, column) - - def rename_table_references(self, old_table, new_table): - super().rename_table_references(old_table, new_table) - self.to_reference.rename_table_references(old_table, new_table) - - def rename_column_references(self, table, old_column, new_column): - super().rename_column_references(table, old_column, new_column) - self.to_reference.rename_column_references(table, old_column, new_column) - - def __str__(self): - suffix = self.suffix_template % { - "to_table": self.to_reference.table, - "to_column": self.to_reference.columns[0], - } - return self.create_fk_name(self.table, self.columns, suffix) - - -class Statement(Reference): - """ - Statement template and formatting parameters container. - - Allows keeping a reference to a statement without interpolating identifiers - that might have to be adjusted if they're referencing a table or column - that is removed - """ - - def __init__(self, template, **parts): - self.template = template - self.parts = parts - - def references_table(self, table): - return any( - hasattr(part, "references_table") and part.references_table(table) - for part in self.parts.values() - ) - - def references_column(self, table, column): - return any( - hasattr(part, "references_column") and part.references_column(table, column) - for part in self.parts.values() - ) - - def references_index(self, table, index): - return any( - hasattr(part, "references_index") and part.references_index(table, index) - for part in self.parts.values() - ) - - def rename_table_references(self, old_table, new_table): - for part in self.parts.values(): - if hasattr(part, "rename_table_references"): - part.rename_table_references(old_table, new_table) - - def rename_column_references(self, table, old_column, new_column): - for part in self.parts.values(): - if hasattr(part, "rename_column_references"): - part.rename_column_references(table, old_column, new_column) - - def __str__(self): - return self.template % self.parts - - -class Expressions(TableColumns): - def __init__(self, table, expressions, compiler, quote_value): - self.compiler = compiler - self.expressions = expressions - self.quote_value = quote_value - columns = [ - col.target.column - for col in self.compiler.query._gen_cols([self.expressions]) - ] - super().__init__(table, columns) - - def rename_table_references(self, old_table, new_table): - if self.table != old_table: - return - self.expressions = self.expressions.relabeled_clone({old_table: new_table}) - super().rename_table_references(old_table, new_table) - - def rename_column_references(self, table, old_column, new_column): - if self.table != table: - return - expressions = deepcopy(self.expressions) - self.columns = [] - for col in self.compiler.query._gen_cols([expressions]): - if col.target.column == old_column: - col.target.column = new_column - self.columns.append(col.target.column) - self.expressions = expressions - - def __str__(self): - sql, params = self.compiler.compile(self.expressions) - params = map(self.quote_value, params) - return sql % tuple(params) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/dummy/__init__.py b/.venv/lib/python3.10/site-packages/django/db/backends/dummy/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/dummy/base.py b/.venv/lib/python3.10/site-packages/django/db/backends/dummy/base.py deleted file mode 100644 index 0e2edc7..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/dummy/base.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -Dummy database backend for Django. - -Django uses this if the database ENGINE setting is empty (None or empty string). - -Each of these API functions, except connection.close(), raise -ImproperlyConfigured. -""" - -from django.core.exceptions import ImproperlyConfigured -from django.db.backends.base.base import BaseDatabaseWrapper -from django.db.backends.base.client import BaseDatabaseClient -from django.db.backends.base.creation import BaseDatabaseCreation -from django.db.backends.base.introspection import BaseDatabaseIntrospection -from django.db.backends.base.operations import BaseDatabaseOperations -from django.db.backends.dummy.features import DummyDatabaseFeatures - - -def complain(*args, **kwargs): - raise ImproperlyConfigured( - "settings.DATABASES is improperly configured. " - "Please supply the ENGINE value. Check " - "settings documentation for more details." - ) - - -def ignore(*args, **kwargs): - pass - - -class DatabaseOperations(BaseDatabaseOperations): - quote_name = complain - - -class DatabaseClient(BaseDatabaseClient): - runshell = complain - - -class DatabaseCreation(BaseDatabaseCreation): - create_test_db = ignore - destroy_test_db = ignore - serialize_db_to_string = ignore - - -class DatabaseIntrospection(BaseDatabaseIntrospection): - get_table_list = complain - get_table_description = complain - get_relations = complain - get_indexes = complain - - -class DatabaseWrapper(BaseDatabaseWrapper): - operators = {} - # Override the base class implementations with null - # implementations. Anything that tries to actually - # do something raises complain; anything that tries - # to rollback or undo something raises ignore. - _cursor = complain - ensure_connection = complain - _commit = complain - _rollback = ignore - _close = ignore - _savepoint = ignore - _savepoint_commit = complain - _savepoint_rollback = ignore - _set_autocommit = complain - # Classes instantiated in __init__(). - client_class = DatabaseClient - creation_class = DatabaseCreation - features_class = DummyDatabaseFeatures - introspection_class = DatabaseIntrospection - ops_class = DatabaseOperations - - def is_usable(self): - return True diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/dummy/features.py b/.venv/lib/python3.10/site-packages/django/db/backends/dummy/features.py deleted file mode 100644 index ac91731..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/dummy/features.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.db.backends.base.features import BaseDatabaseFeatures - - -class DummyDatabaseFeatures(BaseDatabaseFeatures): - supports_transactions = False - uses_savepoints = False diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/__init__.py b/.venv/lib/python3.10/site-packages/django/db/backends/mysql/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/base.py b/.venv/lib/python3.10/site-packages/django/db/backends/mysql/base.py deleted file mode 100644 index eb0e361..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/base.py +++ /dev/null @@ -1,449 +0,0 @@ -""" -MySQL database backend for Django. - -Requires mysqlclient: https://pypi.org/project/mysqlclient/ -""" - -from django.core.exceptions import ImproperlyConfigured -from django.db import IntegrityError -from django.db.backends import utils as backend_utils -from django.db.backends.base.base import BaseDatabaseWrapper -from django.utils.asyncio import async_unsafe -from django.utils.functional import cached_property -from django.utils.regex_helper import _lazy_re_compile - -try: - import MySQLdb as Database -except ImportError as err: - raise ImproperlyConfigured( - "Error loading MySQLdb module.\nDid you install mysqlclient?" - ) from err - -from MySQLdb.constants import CLIENT, FIELD_TYPE -from MySQLdb.converters import conversions - -# Some of these import MySQLdb, so import them after checking if it's installed. -from .client import DatabaseClient -from .creation import DatabaseCreation -from .features import DatabaseFeatures -from .introspection import DatabaseIntrospection -from .operations import DatabaseOperations -from .schema import DatabaseSchemaEditor -from .validation import DatabaseValidation - -version = Database.version_info -if version < (1, 4, 3): - raise ImproperlyConfigured( - "mysqlclient 1.4.3 or newer is required; you have %s." % Database.__version__ - ) - - -# MySQLdb returns TIME columns as timedelta -- they are more like timedelta in -# terms of actual behavior as they are signed and include days -- and Django -# expects time. -django_conversions = { - **conversions, - **{FIELD_TYPE.TIME: backend_utils.typecast_time}, -} - -# This should match the numerical portion of the version numbers (we can treat -# versions like 5.0.24 and 5.0.24a as the same). -server_version_re = _lazy_re_compile(r"(\d{1,2})\.(\d{1,2})\.(\d{1,2})") - - -class CursorWrapper: - """ - A thin wrapper around MySQLdb's normal cursor class that catches particular - exception instances and reraises them with the correct types. - - Implemented as a wrapper, rather than a subclass, so that it isn't stuck - to the particular underlying representation returned by Connection.cursor(). - """ - - codes_for_integrityerror = ( - 1048, # Column cannot be null - 1690, # BIGINT UNSIGNED value is out of range - 3819, # CHECK constraint is violated - 4025, # CHECK constraint failed - ) - - def __init__(self, cursor): - self.cursor = cursor - - def execute(self, query, args=None): - try: - # args is None means no string interpolation - return self.cursor.execute(query, args) - except Database.OperationalError as e: - # Map some error codes to IntegrityError, since they seem to be - # misclassified and Django would prefer the more logical place. - if e.args[0] in self.codes_for_integrityerror: - raise IntegrityError(*tuple(e.args)) - raise - - def executemany(self, query, args): - try: - return self.cursor.executemany(query, args) - except Database.OperationalError as e: - # Map some error codes to IntegrityError, since they seem to be - # misclassified and Django would prefer the more logical place. - if e.args[0] in self.codes_for_integrityerror: - raise IntegrityError(*tuple(e.args)) - raise - - def __getattr__(self, attr): - return getattr(self.cursor, attr) - - def __iter__(self): - return iter(self.cursor) - - -class DatabaseWrapper(BaseDatabaseWrapper): - vendor = "mysql" - # This dictionary maps Field objects to their associated MySQL column - # types, as strings. Column-type strings can contain format strings; they'll - # be interpolated against the values of Field.__dict__ before being output. - # If a column type is set to None, it won't be included in the output. - - _data_types = { - "AutoField": "integer AUTO_INCREMENT", - "BigAutoField": "bigint AUTO_INCREMENT", - "BinaryField": "longblob", - "BooleanField": "bool", - "CharField": "varchar(%(max_length)s)", - "DateField": "date", - "DateTimeField": "datetime(6)", - "DecimalField": "numeric(%(max_digits)s, %(decimal_places)s)", - "DurationField": "bigint", - "FileField": "varchar(%(max_length)s)", - "FilePathField": "varchar(%(max_length)s)", - "FloatField": "double precision", - "IntegerField": "integer", - "BigIntegerField": "bigint", - "IPAddressField": "char(15)", - "GenericIPAddressField": "char(39)", - "JSONField": "json", - "OneToOneField": "integer", - "PositiveBigIntegerField": "bigint UNSIGNED", - "PositiveIntegerField": "integer UNSIGNED", - "PositiveSmallIntegerField": "smallint UNSIGNED", - "SlugField": "varchar(%(max_length)s)", - "SmallAutoField": "smallint AUTO_INCREMENT", - "SmallIntegerField": "smallint", - "TextField": "longtext", - "TimeField": "time(6)", - "UUIDField": "char(32)", - } - - @cached_property - def data_types(self): - _data_types = self._data_types.copy() - if self.features.has_native_uuid_field: - _data_types["UUIDField"] = "uuid" - return _data_types - - # For these data types: - # - MySQL < 8.0.13 doesn't accept default values and implicitly treats them - # as nullable - # - all versions of MySQL and MariaDB don't support full width database - # indexes - _limited_data_types = ( - "tinyblob", - "blob", - "mediumblob", - "longblob", - "tinytext", - "text", - "mediumtext", - "longtext", - "json", - ) - - operators = { - "exact": "= %s", - "iexact": "LIKE %s", - "contains": "LIKE BINARY %s", - "icontains": "LIKE %s", - "gt": "> %s", - "gte": ">= %s", - "lt": "< %s", - "lte": "<= %s", - "startswith": "LIKE BINARY %s", - "endswith": "LIKE BINARY %s", - "istartswith": "LIKE %s", - "iendswith": "LIKE %s", - } - - # The patterns below are used to generate SQL pattern lookup clauses when - # the right-hand side of the lookup isn't a raw string (it might be an expression - # or the result of a bilateral transformation). - # In those cases, special characters for LIKE operators (e.g. \, *, _) should be - # escaped on database side. - # - # Note: we use str.format() here for readability as '%' is used as a wildcard for - # the LIKE operator. - pattern_esc = r"REPLACE(REPLACE(REPLACE({}, '\\', '\\\\'), '%%', '\%%'), '_', '\_')" - pattern_ops = { - "contains": "LIKE BINARY CONCAT('%%', {}, '%%')", - "icontains": "LIKE CONCAT('%%', {}, '%%')", - "startswith": "LIKE BINARY CONCAT({}, '%%')", - "istartswith": "LIKE CONCAT({}, '%%')", - "endswith": "LIKE BINARY CONCAT('%%', {})", - "iendswith": "LIKE CONCAT('%%', {})", - } - - isolation_levels = { - "read uncommitted", - "read committed", - "repeatable read", - "serializable", - } - - Database = Database - SchemaEditorClass = DatabaseSchemaEditor - # Classes instantiated in __init__(). - client_class = DatabaseClient - creation_class = DatabaseCreation - features_class = DatabaseFeatures - introspection_class = DatabaseIntrospection - ops_class = DatabaseOperations - validation_class = DatabaseValidation - - def get_database_version(self): - return self.mysql_version - - def get_connection_params(self): - kwargs = { - "conv": django_conversions, - "charset": "utf8mb4", - } - settings_dict = self.settings_dict - if settings_dict["USER"]: - kwargs["user"] = settings_dict["USER"] - if settings_dict["NAME"]: - kwargs["database"] = settings_dict["NAME"] - if settings_dict["PASSWORD"]: - kwargs["password"] = settings_dict["PASSWORD"] - if settings_dict["HOST"].startswith("/"): - kwargs["unix_socket"] = settings_dict["HOST"] - elif settings_dict["HOST"]: - kwargs["host"] = settings_dict["HOST"] - if settings_dict["PORT"]: - kwargs["port"] = int(settings_dict["PORT"]) - # We need the number of potentially affected rows after an - # "UPDATE", not the number of changed rows. - kwargs["client_flag"] = CLIENT.FOUND_ROWS - # Validate the transaction isolation level, if specified. - options = settings_dict["OPTIONS"].copy() - isolation_level = options.pop("isolation_level", "read committed") - if isolation_level: - isolation_level = isolation_level.lower() - if isolation_level not in self.isolation_levels: - raise ImproperlyConfigured( - "Invalid transaction isolation level '%s' specified.\n" - "Use one of %s, or None." - % ( - isolation_level, - ", ".join("'%s'" % s for s in sorted(self.isolation_levels)), - ) - ) - self.isolation_level = isolation_level - kwargs.update(options) - return kwargs - - @async_unsafe - def get_new_connection(self, conn_params): - connection = Database.connect(**conn_params) - # bytes encoder in mysqlclient doesn't work and was added only to - # prevent KeyErrors in Django < 2.0. We can remove this workaround when - # mysqlclient 2.1 becomes the minimal mysqlclient supported by Django. - # See https://github.com/PyMySQL/mysqlclient/issues/489 - if connection.encoders.get(bytes) is bytes: - connection.encoders.pop(bytes) - return connection - - def init_connection_state(self): - super().init_connection_state() - assignments = [] - if self.features.is_sql_auto_is_null_enabled: - # SQL_AUTO_IS_NULL controls whether an AUTO_INCREMENT column on - # a recently inserted row will return when the field is tested - # for NULL. Disabling this brings this aspect of MySQL in line - # with SQL standards. - assignments.append("SET SQL_AUTO_IS_NULL = 0") - - if self.isolation_level: - assignments.append( - "SET SESSION TRANSACTION ISOLATION LEVEL %s" - % self.isolation_level.upper() - ) - - if assignments: - with self.cursor() as cursor: - cursor.execute("; ".join(assignments)) - - @async_unsafe - def create_cursor(self, name=None): - cursor = self.connection.cursor() - return CursorWrapper(cursor) - - def _rollback(self): - try: - BaseDatabaseWrapper._rollback(self) - except Database.NotSupportedError: - pass - - def _set_autocommit(self, autocommit): - with self.wrap_database_errors: - self.connection.autocommit(autocommit) - - def disable_constraint_checking(self): - """ - Disable foreign key checks, primarily for use in adding rows with - forward references. Always return True to indicate constraint checks - need to be re-enabled. - """ - with self.cursor() as cursor: - cursor.execute("SET foreign_key_checks=0") - return True - - def enable_constraint_checking(self): - """ - Re-enable foreign key checks after they have been disabled. - """ - # Override needs_rollback in case constraint_checks_disabled is - # nested inside transaction.atomic. - self.needs_rollback, needs_rollback = False, self.needs_rollback - try: - with self.cursor() as cursor: - cursor.execute("SET foreign_key_checks=1") - finally: - self.needs_rollback = needs_rollback - - def check_constraints(self, table_names=None): - """ - Check each table name in `table_names` for rows with invalid foreign - key references. This method is intended to be used in conjunction with - `disable_constraint_checking()` and `enable_constraint_checking()`, to - determine if rows with invalid references were entered while constraint - checks were off. - """ - with self.cursor() as cursor: - if table_names is None: - table_names = self.introspection.table_names(cursor) - for table_name in table_names: - primary_key_column_name = self.introspection.get_primary_key_column( - cursor, table_name - ) - if not primary_key_column_name: - continue - relations = self.introspection.get_relations(cursor, table_name) - for column_name, ( - referenced_column_name, - referenced_table_name, - ) in relations.items(): - cursor.execute( - """ - SELECT REFERRING.`%s`, REFERRING.`%s` FROM `%s` as REFERRING - LEFT JOIN `%s` as REFERRED - ON (REFERRING.`%s` = REFERRED.`%s`) - WHERE REFERRING.`%s` IS NOT NULL AND REFERRED.`%s` IS NULL - """ - % ( - primary_key_column_name, - column_name, - table_name, - referenced_table_name, - column_name, - referenced_column_name, - column_name, - referenced_column_name, - ) - ) - for bad_row in cursor.fetchall(): - raise IntegrityError( - "The row in table '%s' with primary key '%s' has an " - "invalid foreign key: %s.%s contains a value '%s' that " - "does not have a corresponding value in %s.%s." - % ( - table_name, - bad_row[0], - table_name, - column_name, - bad_row[1], - referenced_table_name, - referenced_column_name, - ) - ) - - def is_usable(self): - try: - self.connection.ping() - except Database.Error: - return False - else: - return True - - @cached_property - def display_name(self): - return "MariaDB" if self.mysql_is_mariadb else "MySQL" - - @cached_property - def data_type_check_constraints(self): - if self.features.supports_column_check_constraints: - check_constraints = { - "PositiveBigIntegerField": "`%(column)s` >= 0", - "PositiveIntegerField": "`%(column)s` >= 0", - "PositiveSmallIntegerField": "`%(column)s` >= 0", - } - return check_constraints - return {} - - @cached_property - def mysql_server_data(self): - with self.temporary_connection() as cursor: - # Select some server variables and test if the time zone - # definitions are installed. CONVERT_TZ returns NULL if 'UTC' - # timezone isn't loaded into the mysql.time_zone table. - cursor.execute( - """ - SELECT VERSION(), - @@sql_mode, - @@default_storage_engine, - @@sql_auto_is_null, - @@lower_case_table_names, - CONVERT_TZ('2001-01-01 01:00:00', 'UTC', 'UTC') IS NOT NULL - """ - ) - row = cursor.fetchone() - return { - "version": row[0], - "sql_mode": row[1], - "default_storage_engine": row[2], - "sql_auto_is_null": bool(row[3]), - "lower_case_table_names": bool(row[4]), - "has_zoneinfo_database": bool(row[5]), - } - - @cached_property - def mysql_server_info(self): - return self.mysql_server_data["version"] - - @cached_property - def mysql_version(self): - match = server_version_re.match(self.mysql_server_info) - if not match: - raise Exception( - "Unable to determine MySQL version from version string %r" - % self.mysql_server_info - ) - return tuple(int(x) for x in match.groups()) - - @cached_property - def mysql_is_mariadb(self): - return "mariadb" in self.mysql_server_info.lower() - - @cached_property - def sql_mode(self): - sql_mode = self.mysql_server_data["sql_mode"] - return set(sql_mode.split(",") if sql_mode else ()) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/client.py b/.venv/lib/python3.10/site-packages/django/db/backends/mysql/client.py deleted file mode 100644 index 6aa11b2..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/client.py +++ /dev/null @@ -1,72 +0,0 @@ -import signal - -from django.db.backends.base.client import BaseDatabaseClient - - -class DatabaseClient(BaseDatabaseClient): - executable_name = "mysql" - - @classmethod - def settings_to_cmd_args_env(cls, settings_dict, parameters): - args = [cls.executable_name] - env = None - database = settings_dict["OPTIONS"].get( - "database", - settings_dict["OPTIONS"].get("db", settings_dict["NAME"]), - ) - user = settings_dict["OPTIONS"].get("user", settings_dict["USER"]) - password = settings_dict["OPTIONS"].get( - "password", - settings_dict["OPTIONS"].get("passwd", settings_dict["PASSWORD"]), - ) - host = settings_dict["OPTIONS"].get("host", settings_dict["HOST"]) - port = settings_dict["OPTIONS"].get("port", settings_dict["PORT"]) - server_ca = settings_dict["OPTIONS"].get("ssl", {}).get("ca") - client_cert = settings_dict["OPTIONS"].get("ssl", {}).get("cert") - client_key = settings_dict["OPTIONS"].get("ssl", {}).get("key") - defaults_file = settings_dict["OPTIONS"].get("read_default_file") - charset = settings_dict["OPTIONS"].get("charset") - # Seems to be no good way to set sql_mode with CLI. - - if defaults_file: - args += ["--defaults-file=%s" % defaults_file] - if user: - args += ["--user=%s" % user] - if password: - # The MYSQL_PWD environment variable usage is discouraged per - # MySQL's documentation due to the possibility of exposure through - # `ps` on old Unix flavors but --password suffers from the same - # flaw on even more systems. Usage of an environment variable also - # prevents password exposure if the subprocess.run(check=True) call - # raises a CalledProcessError since the string representation of - # the latter includes all of the provided `args`. - env = {"MYSQL_PWD": password} - if host: - if "/" in host: - args += ["--socket=%s" % host] - else: - args += ["--host=%s" % host] - if port: - args += ["--port=%s" % port] - if server_ca: - args += ["--ssl-ca=%s" % server_ca] - if client_cert: - args += ["--ssl-cert=%s" % client_cert] - if client_key: - args += ["--ssl-key=%s" % client_key] - if charset: - args += ["--default-character-set=%s" % charset] - if database: - args += [database] - args.extend(parameters) - return args, env - - def runshell(self, parameters): - sigint_handler = signal.getsignal(signal.SIGINT) - try: - # Allow SIGINT to pass to mysql to abort queries. - signal.signal(signal.SIGINT, signal.SIG_IGN) - super().runshell(parameters) - finally: - # Restore the original SIGINT handler. - signal.signal(signal.SIGINT, sigint_handler) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/compiler.py b/.venv/lib/python3.10/site-packages/django/db/backends/mysql/compiler.py deleted file mode 100644 index 0291b76..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/compiler.py +++ /dev/null @@ -1,72 +0,0 @@ -from django.core.exceptions import FieldError, FullResultSet -from django.db.models.expressions import Col -from django.db.models.sql.compiler import SQLAggregateCompiler, SQLCompiler -from django.db.models.sql.compiler import SQLDeleteCompiler as BaseSQLDeleteCompiler -from django.db.models.sql.compiler import SQLInsertCompiler -from django.db.models.sql.compiler import SQLUpdateCompiler as BaseSQLUpdateCompiler - -__all__ = [ - "SQLAggregateCompiler", - "SQLCompiler", - "SQLDeleteCompiler", - "SQLInsertCompiler", - "SQLUpdateCompiler", -] - - -class SQLDeleteCompiler(BaseSQLDeleteCompiler): - def as_sql(self): - # Prefer the non-standard DELETE FROM syntax over the SQL generated by - # the SQLDeleteCompiler's default implementation when multiple tables - # are involved since MySQL/MariaDB will generate a more efficient query - # plan than when using a subquery. - where, having, qualify = self.query.where.split_having_qualify( - must_group_by=self.query.group_by is not None - ) - if self.single_alias or having or qualify: - # DELETE FROM cannot be used when filtering against aggregates or - # window functions as it doesn't allow for GROUP BY/HAVING clauses - # and the subquery wrapping (necessary to emulate QUALIFY). - return super().as_sql() - result = [ - "DELETE %s FROM" - % self.quote_name_unless_alias(self.query.get_initial_alias()) - ] - from_sql, params = self.get_from_clause() - result.extend(from_sql) - try: - where_sql, where_params = self.compile(where) - except FullResultSet: - pass - else: - result.append("WHERE %s" % where_sql) - params.extend(where_params) - return " ".join(result), tuple(params) - - -class SQLUpdateCompiler(BaseSQLUpdateCompiler): - def as_sql(self): - update_query, update_params = super().as_sql() - # MySQL and MariaDB support UPDATE ... ORDER BY syntax. - if self.query.order_by: - order_by_sql = [] - order_by_params = [] - db_table = self.query.get_meta().db_table - try: - for resolved, (sql, params, _) in self.get_order_by(): - if ( - isinstance(resolved.expression, Col) - and resolved.expression.alias != db_table - ): - # Ignore ordering if it contains joined fields, because - # they cannot be used in the ORDER BY clause. - raise FieldError - order_by_sql.append(sql) - order_by_params.extend(params) - update_query += " ORDER BY " + ", ".join(order_by_sql) - update_params += tuple(order_by_params) - except FieldError: - # Ignore ordering if it contains annotations, because they're - # removed in .update() and cannot be resolved. - pass - return update_query, update_params diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/creation.py b/.venv/lib/python3.10/site-packages/django/db/backends/mysql/creation.py deleted file mode 100644 index a060f41..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/creation.py +++ /dev/null @@ -1,87 +0,0 @@ -import os -import subprocess -import sys - -from django.db.backends.base.creation import BaseDatabaseCreation - -from .client import DatabaseClient - - -class DatabaseCreation(BaseDatabaseCreation): - def sql_table_creation_suffix(self): - suffix = [] - test_settings = self.connection.settings_dict["TEST"] - if test_settings["CHARSET"]: - suffix.append("CHARACTER SET %s" % test_settings["CHARSET"]) - if test_settings["COLLATION"]: - suffix.append("COLLATE %s" % test_settings["COLLATION"]) - return " ".join(suffix) - - def _execute_create_test_db(self, cursor, parameters, keepdb=False): - try: - super()._execute_create_test_db(cursor, parameters, keepdb) - except Exception as e: - if len(e.args) < 1 or e.args[0] != 1007: - # All errors except "database exists" (1007) cancel tests. - self.log("Got an error creating the test database: %s" % e) - sys.exit(2) - else: - raise - - def _clone_test_db(self, suffix, verbosity, keepdb=False): - source_database_name = self.connection.settings_dict["NAME"] - target_database_name = self.get_test_db_clone_settings(suffix)["NAME"] - test_db_params = { - "dbname": self.connection.ops.quote_name(target_database_name), - "suffix": self.sql_table_creation_suffix(), - } - with self._nodb_cursor() as cursor: - try: - self._execute_create_test_db(cursor, test_db_params, keepdb) - except Exception: - if keepdb: - # If the database should be kept, skip everything else. - return - try: - if verbosity >= 1: - self.log( - "Destroying old test database for alias %s..." - % ( - self._get_database_display_str( - verbosity, target_database_name - ), - ) - ) - cursor.execute("DROP DATABASE %(dbname)s" % test_db_params) - self._execute_create_test_db(cursor, test_db_params, keepdb) - except Exception as e: - self.log("Got an error recreating the test database: %s" % e) - sys.exit(2) - self._clone_db(source_database_name, target_database_name) - - def _clone_db(self, source_database_name, target_database_name): - cmd_args, cmd_env = DatabaseClient.settings_to_cmd_args_env( - self.connection.settings_dict, [] - ) - dump_cmd = [ - "mysqldump", - *cmd_args[1:-1], - "--routines", - "--events", - source_database_name, - ] - dump_env = load_env = {**os.environ, **cmd_env} if cmd_env else None - load_cmd = cmd_args - load_cmd[-1] = target_database_name - - with subprocess.Popen( - dump_cmd, stdout=subprocess.PIPE, env=dump_env - ) as dump_proc: - with subprocess.Popen( - load_cmd, - stdin=dump_proc.stdout, - stdout=subprocess.DEVNULL, - env=load_env, - ): - # Allow dump_proc to receive a SIGPIPE if the load process exits. - dump_proc.stdout.close() diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/features.py b/.venv/lib/python3.10/site-packages/django/db/backends/mysql/features.py deleted file mode 100644 index 414f552..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/features.py +++ /dev/null @@ -1,324 +0,0 @@ -import operator - -from django.db.backends.base.features import BaseDatabaseFeatures -from django.utils.functional import cached_property - - -class DatabaseFeatures(BaseDatabaseFeatures): - empty_fetchmany_value = () - related_fields_match_type = True - # MySQL doesn't support sliced subqueries with IN/ALL/ANY/SOME. - allow_sliced_subqueries_with_in = False - has_select_for_update = True - has_select_for_update_nowait = True - supports_forward_references = False - supports_regex_backreferencing = False - supports_date_lookup_using_string = False - supports_timezones = False - requires_explicit_null_ordering_when_grouping = True - atomic_transactions = False - can_clone_databases = True - supports_comments = True - supports_comments_inline = True - supports_temporal_subtraction = True - supports_slicing_ordering_in_compound = True - supports_index_on_text_field = False - supports_over_clause = True - supports_frame_range_fixed_distance = True - supports_update_conflicts = True - delete_can_self_reference_subquery = False - create_test_procedure_without_params_sql = """ - CREATE PROCEDURE test_procedure () - BEGIN - DECLARE V_I INTEGER; - SET V_I = 1; - END; - """ - create_test_procedure_with_int_param_sql = """ - CREATE PROCEDURE test_procedure (P_I INTEGER) - BEGIN - DECLARE V_I INTEGER; - SET V_I = P_I; - END; - """ - create_test_table_with_composite_primary_key = """ - CREATE TABLE test_table_composite_pk ( - column_1 INTEGER NOT NULL, - column_2 INTEGER NOT NULL, - PRIMARY KEY(column_1, column_2) - ) - """ - # Neither MySQL nor MariaDB support partial indexes. - supports_partial_indexes = False - # COLLATE must be wrapped in parentheses because MySQL treats COLLATE as an - # indexed expression. - collate_as_index_expression = True - insert_test_table_with_defaults = "INSERT INTO {} () VALUES ()" - - supports_order_by_nulls_modifier = False - order_by_nulls_first = True - supports_logical_xor = True - - supports_stored_generated_columns = True - supports_virtual_generated_columns = True - - @cached_property - def minimum_database_version(self): - if self.connection.mysql_is_mariadb: - return (10, 5) - else: - return (8, 0, 11) - - @cached_property - def test_collations(self): - return { - "ci": "utf8mb4_general_ci", - "non_default": "utf8mb4_esperanto_ci", - "swedish_ci": "utf8mb4_swedish_ci", - "virtual": "utf8mb4_esperanto_ci", - } - - test_now_utc_template = "UTC_TIMESTAMP(6)" - - @cached_property - def django_test_skips(self): - skips = { - "This doesn't work on MySQL.": { - "db_functions.comparison.test_greatest.GreatestTests." - "test_coalesce_workaround", - "db_functions.comparison.test_least.LeastTests." - "test_coalesce_workaround", - }, - "MySQL doesn't support functional indexes on a function that " - "returns JSON": { - "schema.tests.SchemaTests.test_func_index_json_key_transform", - }, - "MySQL supports multiplying and dividing DurationFields by a " - "scalar value but it's not implemented (#25287).": { - "expressions.tests.FTimeDeltaTests.test_durationfield_multiply_divide", - }, - "UPDATE ... ORDER BY syntax on MySQL/MariaDB does not support ordering by" - "related fields.": { - "update.tests.AdvancedTests." - "test_update_ordered_by_inline_m2m_annotation", - "update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation", - "update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation_desc", - }, - } - if self.connection.mysql_is_mariadb and ( - self.connection.mysql_version < (10, 5, 2) - ): - skips.update( - { - "https://jira.mariadb.org/browse/MDEV-19598": { - "schema.tests.SchemaTests." - "test_alter_not_unique_field_to_primary_key", - }, - } - ) - if not self.supports_explain_analyze: - skips.update( - { - "MariaDB and MySQL >= 8.0.18 specific.": { - "queries.test_explain.ExplainTests.test_mysql_analyze", - }, - } - ) - if "ONLY_FULL_GROUP_BY" in self.connection.sql_mode: - skips.update( - { - "GROUP BY cannot contain nonaggregated column when " - "ONLY_FULL_GROUP_BY mode is enabled on MySQL, see #34262.": { - "aggregation.tests.AggregateTestCase." - "test_group_by_nested_expression_with_params", - }, - } - ) - if self.connection.mysql_version < (8, 0, 31): - skips.update( - { - "Nesting of UNIONs at the right-hand side is not supported on " - "MySQL < 8.0.31": { - "queries.test_qs_combinators.QuerySetSetOperationTests." - "test_union_nested" - }, - } - ) - if not self.connection.mysql_is_mariadb: - skips.update( - { - "MySQL doesn't allow renaming columns referenced by generated " - "columns": { - "migrations.test_operations.OperationTests." - "test_invalid_generated_field_changes_on_rename_stored", - "migrations.test_operations.OperationTests." - "test_invalid_generated_field_changes_on_rename_virtual", - }, - } - ) - return skips - - @cached_property - def _mysql_storage_engine(self): - "Internal method used in Django tests. Don't rely on this from your code" - return self.connection.mysql_server_data["default_storage_engine"] - - @cached_property - def allows_auto_pk_0(self): - """ - Autoincrement primary key can be set to 0 if it doesn't generate new - autoincrement values. - """ - return "NO_AUTO_VALUE_ON_ZERO" in self.connection.sql_mode - - @cached_property - def update_can_self_select(self): - return self.connection.mysql_is_mariadb - - @cached_property - def can_introspect_foreign_keys(self): - "Confirm support for introspected foreign keys" - return self._mysql_storage_engine != "MyISAM" - - @cached_property - def introspected_field_types(self): - return { - **super().introspected_field_types, - "BinaryField": "TextField", - "BooleanField": "IntegerField", - "DurationField": "BigIntegerField", - "GenericIPAddressField": "CharField", - } - - @cached_property - def can_return_columns_from_insert(self): - return self.connection.mysql_is_mariadb - - can_return_rows_from_bulk_insert = property( - operator.attrgetter("can_return_columns_from_insert") - ) - - @cached_property - def has_zoneinfo_database(self): - return self.connection.mysql_server_data["has_zoneinfo_database"] - - @cached_property - def is_sql_auto_is_null_enabled(self): - return self.connection.mysql_server_data["sql_auto_is_null"] - - @cached_property - def supports_column_check_constraints(self): - if self.connection.mysql_is_mariadb: - return True - return self.connection.mysql_version >= (8, 0, 16) - - supports_table_check_constraints = property( - operator.attrgetter("supports_column_check_constraints") - ) - - @cached_property - def can_introspect_check_constraints(self): - if self.connection.mysql_is_mariadb: - return True - return self.connection.mysql_version >= (8, 0, 16) - - @cached_property - def has_select_for_update_skip_locked(self): - if self.connection.mysql_is_mariadb: - return self.connection.mysql_version >= (10, 6) - return True - - @cached_property - def has_select_for_update_of(self): - return not self.connection.mysql_is_mariadb - - @cached_property - def supports_explain_analyze(self): - return self.connection.mysql_is_mariadb or self.connection.mysql_version >= ( - 8, - 0, - 18, - ) - - @cached_property - def supported_explain_formats(self): - # Alias MySQL's TRADITIONAL to TEXT for consistency with other - # backends. - formats = {"JSON", "TEXT", "TRADITIONAL"} - if not self.connection.mysql_is_mariadb and self.connection.mysql_version >= ( - 8, - 0, - 16, - ): - formats.add("TREE") - return formats - - @cached_property - def supports_transactions(self): - """ - All storage engines except MyISAM support transactions. - """ - return self._mysql_storage_engine != "MyISAM" - - @cached_property - def ignores_table_name_case(self): - return self.connection.mysql_server_data["lower_case_table_names"] - - @cached_property - def supports_default_in_lead_lag(self): - # To be added in https://jira.mariadb.org/browse/MDEV-12981. - return not self.connection.mysql_is_mariadb - - @cached_property - def can_introspect_json_field(self): - if self.connection.mysql_is_mariadb: - return self.can_introspect_check_constraints - return True - - @cached_property - def supports_index_column_ordering(self): - if self._mysql_storage_engine != "InnoDB": - return False - if self.connection.mysql_is_mariadb: - return self.connection.mysql_version >= (10, 8) - return True - - @cached_property - def supports_expression_indexes(self): - return ( - not self.connection.mysql_is_mariadb - and self._mysql_storage_engine != "MyISAM" - and self.connection.mysql_version >= (8, 0, 13) - ) - - @cached_property - def supports_select_intersection(self): - is_mariadb = self.connection.mysql_is_mariadb - return is_mariadb or self.connection.mysql_version >= (8, 0, 31) - - supports_select_difference = property( - operator.attrgetter("supports_select_intersection") - ) - - @cached_property - def can_rename_index(self): - if self.connection.mysql_is_mariadb: - return self.connection.mysql_version >= (10, 5, 2) - return True - - @cached_property - def supports_expression_defaults(self): - if self.connection.mysql_is_mariadb: - return True - return self.connection.mysql_version >= (8, 0, 13) - - @cached_property - def has_native_uuid_field(self): - is_mariadb = self.connection.mysql_is_mariadb - return is_mariadb and self.connection.mysql_version >= (10, 7) - - @cached_property - def allows_group_by_selected_pks(self): - if self.connection.mysql_is_mariadb: - return "ONLY_FULL_GROUP_BY" not in self.connection.sql_mode - return True diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/introspection.py b/.venv/lib/python3.10/site-packages/django/db/backends/mysql/introspection.py deleted file mode 100644 index ea1d0aa..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/introspection.py +++ /dev/null @@ -1,358 +0,0 @@ -from collections import namedtuple - -import sqlparse -from MySQLdb.constants import FIELD_TYPE - -from django.db.backends.base.introspection import BaseDatabaseIntrospection -from django.db.backends.base.introspection import FieldInfo as BaseFieldInfo -from django.db.backends.base.introspection import TableInfo as BaseTableInfo -from django.db.models import Index -from django.utils.datastructures import OrderedSet - -FieldInfo = namedtuple( - "FieldInfo", - BaseFieldInfo._fields - + ("extra", "is_unsigned", "has_json_constraint", "comment", "data_type"), -) -InfoLine = namedtuple( - "InfoLine", - "col_name data_type max_len num_prec num_scale extra column_default " - "collation is_unsigned comment", -) -TableInfo = namedtuple("TableInfo", BaseTableInfo._fields + ("comment",)) - - -class DatabaseIntrospection(BaseDatabaseIntrospection): - data_types_reverse = { - FIELD_TYPE.BLOB: "TextField", - FIELD_TYPE.CHAR: "CharField", - FIELD_TYPE.DECIMAL: "DecimalField", - FIELD_TYPE.NEWDECIMAL: "DecimalField", - FIELD_TYPE.DATE: "DateField", - FIELD_TYPE.DATETIME: "DateTimeField", - FIELD_TYPE.DOUBLE: "FloatField", - FIELD_TYPE.FLOAT: "FloatField", - FIELD_TYPE.INT24: "IntegerField", - FIELD_TYPE.JSON: "JSONField", - FIELD_TYPE.LONG: "IntegerField", - FIELD_TYPE.LONGLONG: "BigIntegerField", - FIELD_TYPE.SHORT: "SmallIntegerField", - FIELD_TYPE.STRING: "CharField", - FIELD_TYPE.TIME: "TimeField", - FIELD_TYPE.TIMESTAMP: "DateTimeField", - FIELD_TYPE.TINY: "IntegerField", - FIELD_TYPE.TINY_BLOB: "TextField", - FIELD_TYPE.MEDIUM_BLOB: "TextField", - FIELD_TYPE.LONG_BLOB: "TextField", - FIELD_TYPE.VAR_STRING: "CharField", - } - - def get_field_type(self, data_type, description): - field_type = super().get_field_type(data_type, description) - if "auto_increment" in description.extra: - if field_type == "IntegerField": - return "AutoField" - elif field_type == "BigIntegerField": - return "BigAutoField" - elif field_type == "SmallIntegerField": - return "SmallAutoField" - if description.is_unsigned: - if field_type == "BigIntegerField": - return "PositiveBigIntegerField" - elif field_type == "IntegerField": - return "PositiveIntegerField" - elif field_type == "SmallIntegerField": - return "PositiveSmallIntegerField" - if description.data_type.upper() == "UUID": - return "UUIDField" - # JSON data type is an alias for LONGTEXT in MariaDB, use check - # constraints clauses to introspect JSONField. - if description.has_json_constraint: - return "JSONField" - return field_type - - def get_table_list(self, cursor): - """Return a list of table and view names in the current database.""" - cursor.execute( - """ - SELECT - table_name, - table_type, - table_comment - FROM information_schema.tables - WHERE table_schema = DATABASE() - """ - ) - return [ - TableInfo(row[0], {"BASE TABLE": "t", "VIEW": "v"}.get(row[1]), row[2]) - for row in cursor.fetchall() - ] - - def get_table_description(self, cursor, table_name): - """ - Return a description of the table with the DB-API cursor.description - interface." - """ - json_constraints = {} - if ( - self.connection.mysql_is_mariadb - and self.connection.features.can_introspect_json_field - ): - # JSON data type is an alias for LONGTEXT in MariaDB, select - # JSON_VALID() constraints to introspect JSONField. - cursor.execute( - """ - SELECT c.constraint_name AS column_name - FROM information_schema.check_constraints AS c - WHERE - c.table_name = %s AND - LOWER(c.check_clause) = - 'json_valid(`' + LOWER(c.constraint_name) + '`)' AND - c.constraint_schema = DATABASE() - """, - [table_name], - ) - json_constraints = {row[0] for row in cursor.fetchall()} - # A default collation for the given table. - cursor.execute( - """ - SELECT table_collation - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = %s - """, - [table_name], - ) - row = cursor.fetchone() - default_column_collation = row[0] if row else "" - # information_schema database gives more accurate results for some figures: - # - varchar length returned by cursor.description is an internal length, - # not visible length (#5725) - # - precision and scale (for decimal fields) (#5014) - # - auto_increment is not available in cursor.description - cursor.execute( - """ - SELECT - column_name, data_type, character_maximum_length, - numeric_precision, numeric_scale, extra, column_default, - CASE - WHEN collation_name = %s THEN NULL - ELSE collation_name - END AS collation_name, - CASE - WHEN column_type LIKE '%% unsigned' THEN 1 - ELSE 0 - END AS is_unsigned, - column_comment - FROM information_schema.columns - WHERE table_name = %s AND table_schema = DATABASE() - """, - [default_column_collation, table_name], - ) - field_info = {line[0]: InfoLine(*line) for line in cursor.fetchall()} - - cursor.execute( - "SELECT * FROM %s LIMIT 1" % self.connection.ops.quote_name(table_name) - ) - - def to_int(i): - return int(i) if i is not None else i - - fields = [] - for line in cursor.description: - info = field_info[line[0]] - fields.append( - FieldInfo( - *line[:2], - to_int(info.max_len) or line[2], - to_int(info.max_len) or line[3], - to_int(info.num_prec) or line[4], - to_int(info.num_scale) or line[5], - line[6], - info.column_default, - info.collation, - info.extra, - info.is_unsigned, - line[0] in json_constraints, - info.comment, - info.data_type, - ) - ) - return fields - - def get_sequences(self, cursor, table_name, table_fields=()): - for field_info in self.get_table_description(cursor, table_name): - if "auto_increment" in field_info.extra: - # MySQL allows only one auto-increment column per table. - return [{"table": table_name, "column": field_info.name}] - return [] - - def get_relations(self, cursor, table_name): - """ - Return a dictionary of {field_name: (field_name_other_table, other_table)} - representing all foreign keys in the given table. - """ - cursor.execute( - """ - SELECT column_name, referenced_column_name, referenced_table_name - FROM information_schema.key_column_usage - WHERE table_name = %s - AND table_schema = DATABASE() - AND referenced_table_schema = DATABASE() - AND referenced_table_name IS NOT NULL - AND referenced_column_name IS NOT NULL - """, - [table_name], - ) - return { - field_name: (other_field, other_table) - for field_name, other_field, other_table in cursor.fetchall() - } - - def get_storage_engine(self, cursor, table_name): - """ - Retrieve the storage engine for a given table. Return the default - storage engine if the table doesn't exist. - """ - cursor.execute( - """ - SELECT engine - FROM information_schema.tables - WHERE - table_name = %s AND - table_schema = DATABASE() - """, - [table_name], - ) - result = cursor.fetchone() - if not result: - return self.connection.features._mysql_storage_engine - return result[0] - - def _parse_constraint_columns(self, check_clause, columns): - check_columns = OrderedSet() - statement = sqlparse.parse(check_clause)[0] - tokens = (token for token in statement.flatten() if not token.is_whitespace) - for token in tokens: - if ( - token.ttype == sqlparse.tokens.Name - and self.connection.ops.quote_name(token.value) == token.value - and token.value[1:-1] in columns - ): - check_columns.add(token.value[1:-1]) - return check_columns - - def get_constraints(self, cursor, table_name): - """ - Retrieve any constraints or keys (unique, pk, fk, check, index) across - one or more columns. - """ - constraints = {} - # Get the actual constraint names and columns - name_query = """ - SELECT kc.`constraint_name`, kc.`column_name`, - kc.`referenced_table_name`, kc.`referenced_column_name`, - c.`constraint_type` - FROM - information_schema.key_column_usage AS kc, - information_schema.table_constraints AS c - WHERE - kc.table_schema = DATABASE() AND - ( - kc.referenced_table_schema = DATABASE() OR - kc.referenced_table_schema IS NULL - ) AND - c.table_schema = kc.table_schema AND - c.constraint_name = kc.constraint_name AND - c.constraint_type != 'CHECK' AND - kc.table_name = %s - ORDER BY kc.`ordinal_position` - """ - cursor.execute(name_query, [table_name]) - for constraint, column, ref_table, ref_column, kind in cursor.fetchall(): - if constraint not in constraints: - constraints[constraint] = { - "columns": OrderedSet(), - "primary_key": kind == "PRIMARY KEY", - "unique": kind in {"PRIMARY KEY", "UNIQUE"}, - "index": False, - "check": False, - "foreign_key": (ref_table, ref_column) if ref_column else None, - } - if self.connection.features.supports_index_column_ordering: - constraints[constraint]["orders"] = [] - constraints[constraint]["columns"].add(column) - # Add check constraints. - if self.connection.features.can_introspect_check_constraints: - unnamed_constraints_index = 0 - columns = { - info.name for info in self.get_table_description(cursor, table_name) - } - if self.connection.mysql_is_mariadb: - type_query = """ - SELECT c.constraint_name, c.check_clause - FROM information_schema.check_constraints AS c - WHERE - c.constraint_schema = DATABASE() AND - c.table_name = %s - """ - else: - type_query = """ - SELECT cc.constraint_name, cc.check_clause - FROM - information_schema.check_constraints AS cc, - information_schema.table_constraints AS tc - WHERE - cc.constraint_schema = DATABASE() AND - tc.table_schema = cc.constraint_schema AND - cc.constraint_name = tc.constraint_name AND - tc.constraint_type = 'CHECK' AND - tc.table_name = %s - """ - cursor.execute(type_query, [table_name]) - for constraint, check_clause in cursor.fetchall(): - constraint_columns = self._parse_constraint_columns( - check_clause, columns - ) - # Ensure uniqueness of unnamed constraints. Unnamed unique - # and check columns constraints have the same name as - # a column. - if set(constraint_columns) == {constraint}: - unnamed_constraints_index += 1 - constraint = "__unnamed_constraint_%s__" % unnamed_constraints_index - constraints[constraint] = { - "columns": constraint_columns, - "primary_key": False, - "unique": False, - "index": False, - "check": True, - "foreign_key": None, - } - # Now add in the indexes - cursor.execute( - "SHOW INDEX FROM %s" % self.connection.ops.quote_name(table_name) - ) - for table, non_unique, index, colseq, column, order, type_ in [ - x[:6] + (x[10],) for x in cursor.fetchall() - ]: - if index not in constraints: - constraints[index] = { - "columns": OrderedSet(), - "primary_key": False, - "unique": not non_unique, - "check": False, - "foreign_key": None, - } - if self.connection.features.supports_index_column_ordering: - constraints[index]["orders"] = [] - constraints[index]["index"] = True - constraints[index]["type"] = ( - Index.suffix if type_ == "BTREE" else type_.lower() - ) - constraints[index]["columns"].add(column) - if self.connection.features.supports_index_column_ordering: - constraints[index]["orders"].append("DESC" if order == "D" else "ASC") - # Convert the sorted sets to lists - for constraint in constraints.values(): - constraint["columns"] = list(constraint["columns"]) - return constraints diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/operations.py b/.venv/lib/python3.10/site-packages/django/db/backends/mysql/operations.py deleted file mode 100644 index 9806303..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/operations.py +++ /dev/null @@ -1,455 +0,0 @@ -import uuid - -from django.conf import settings -from django.db.backends.base.operations import BaseDatabaseOperations -from django.db.backends.utils import split_tzname_delta -from django.db.models import Exists, ExpressionWrapper, Lookup -from django.db.models.constants import OnConflict -from django.utils import timezone -from django.utils.encoding import force_str -from django.utils.regex_helper import _lazy_re_compile - - -class DatabaseOperations(BaseDatabaseOperations): - compiler_module = "django.db.backends.mysql.compiler" - - # MySQL stores positive fields as UNSIGNED ints. - integer_field_ranges = { - **BaseDatabaseOperations.integer_field_ranges, - "PositiveSmallIntegerField": (0, 65535), - "PositiveIntegerField": (0, 4294967295), - "PositiveBigIntegerField": (0, 18446744073709551615), - } - cast_data_types = { - "AutoField": "signed integer", - "BigAutoField": "signed integer", - "SmallAutoField": "signed integer", - "CharField": "char(%(max_length)s)", - "DecimalField": "decimal(%(max_digits)s, %(decimal_places)s)", - "TextField": "char", - "IntegerField": "signed integer", - "BigIntegerField": "signed integer", - "SmallIntegerField": "signed integer", - "PositiveBigIntegerField": "unsigned integer", - "PositiveIntegerField": "unsigned integer", - "PositiveSmallIntegerField": "unsigned integer", - "DurationField": "signed integer", - } - cast_char_field_without_max_length = "char" - explain_prefix = "EXPLAIN" - - # EXTRACT format cannot be passed in parameters. - _extract_format_re = _lazy_re_compile(r"[A-Z_]+") - - def date_extract_sql(self, lookup_type, sql, params): - # https://dev.mysql.com/doc/mysql/en/date-and-time-functions.html - if lookup_type == "week_day": - # DAYOFWEEK() returns an integer, 1-7, Sunday=1. - return f"DAYOFWEEK({sql})", params - elif lookup_type == "iso_week_day": - # WEEKDAY() returns an integer, 0-6, Monday=0. - return f"WEEKDAY({sql}) + 1", params - elif lookup_type == "week": - # Override the value of default_week_format for consistency with - # other database backends. - # Mode 3: Monday, 1-53, with 4 or more days this year. - return f"WEEK({sql}, 3)", params - elif lookup_type == "iso_year": - # Get the year part from the YEARWEEK function, which returns a - # number as year * 100 + week. - return f"TRUNCATE(YEARWEEK({sql}, 3), -2) / 100", params - else: - # EXTRACT returns 1-53 based on ISO-8601 for the week number. - lookup_type = lookup_type.upper() - if not self._extract_format_re.fullmatch(lookup_type): - raise ValueError(f"Invalid loookup type: {lookup_type!r}") - return f"EXTRACT({lookup_type} FROM {sql})", params - - def date_trunc_sql(self, lookup_type, sql, params, tzname=None): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - fields = { - "year": "%Y-01-01", - "month": "%Y-%m-01", - } - if lookup_type in fields: - format_str = fields[lookup_type] - return f"CAST(DATE_FORMAT({sql}, %s) AS DATE)", (*params, format_str) - elif lookup_type == "quarter": - return ( - f"MAKEDATE(YEAR({sql}), 1) + " - f"INTERVAL QUARTER({sql}) QUARTER - INTERVAL 1 QUARTER", - (*params, *params), - ) - elif lookup_type == "week": - return f"DATE_SUB({sql}, INTERVAL WEEKDAY({sql}) DAY)", (*params, *params) - else: - return f"DATE({sql})", params - - def _prepare_tzname_delta(self, tzname): - tzname, sign, offset = split_tzname_delta(tzname) - return f"{sign}{offset}" if offset else tzname - - def _convert_sql_to_tz(self, sql, params, tzname): - if tzname and settings.USE_TZ and self.connection.timezone_name != tzname: - return f"CONVERT_TZ({sql}, %s, %s)", ( - *params, - self.connection.timezone_name, - self._prepare_tzname_delta(tzname), - ) - return sql, params - - def datetime_cast_date_sql(self, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - return f"DATE({sql})", params - - def datetime_cast_time_sql(self, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - return f"TIME({sql})", params - - def datetime_extract_sql(self, lookup_type, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - return self.date_extract_sql(lookup_type, sql, params) - - def datetime_trunc_sql(self, lookup_type, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - fields = ["year", "month", "day", "hour", "minute", "second"] - format = ("%Y-", "%m", "-%d", " %H:", "%i", ":%s") - format_def = ("0000-", "01", "-01", " 00:", "00", ":00") - if lookup_type == "quarter": - return ( - f"CAST(DATE_FORMAT(MAKEDATE(YEAR({sql}), 1) + " - f"INTERVAL QUARTER({sql}) QUARTER - " - f"INTERVAL 1 QUARTER, %s) AS DATETIME)" - ), (*params, *params, "%Y-%m-01 00:00:00") - if lookup_type == "week": - return ( - f"CAST(DATE_FORMAT(" - f"DATE_SUB({sql}, INTERVAL WEEKDAY({sql}) DAY), %s) AS DATETIME)" - ), (*params, *params, "%Y-%m-%d 00:00:00") - try: - i = fields.index(lookup_type) + 1 - except ValueError: - pass - else: - format_str = "".join(format[:i] + format_def[i:]) - return f"CAST(DATE_FORMAT({sql}, %s) AS DATETIME)", (*params, format_str) - return sql, params - - def time_trunc_sql(self, lookup_type, sql, params, tzname=None): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - fields = { - "hour": "%H:00:00", - "minute": "%H:%i:00", - "second": "%H:%i:%s", - } - if lookup_type in fields: - format_str = fields[lookup_type] - return f"CAST(DATE_FORMAT({sql}, %s) AS TIME)", (*params, format_str) - else: - return f"TIME({sql})", params - - def fetch_returned_insert_rows(self, cursor): - """ - Given a cursor object that has just performed an INSERT...RETURNING - statement into a table, return the tuple of returned data. - """ - return cursor.fetchall() - - def format_for_duration_arithmetic(self, sql): - return "INTERVAL %s MICROSECOND" % sql - - def force_no_ordering(self): - """ - "ORDER BY NULL" prevents MySQL from implicitly ordering by grouped - columns. If no ordering would otherwise be applied, we don't want any - implicit sorting going on. - """ - return [(None, ("NULL", [], False))] - - def last_executed_query(self, cursor, sql, params): - # With MySQLdb, cursor objects have an (undocumented) "_executed" - # attribute where the exact query sent to the database is saved. - # See MySQLdb/cursors.py in the source distribution. - # MySQLdb returns string, PyMySQL bytes. - return force_str(getattr(cursor, "_executed", None), errors="replace") - - def no_limit_value(self): - # 2**64 - 1, as recommended by the MySQL documentation - return 18446744073709551615 - - def quote_name(self, name): - if name.startswith("`") and name.endswith("`"): - return name # Quoting once is enough. - return "`%s`" % name - - def return_insert_columns(self, fields): - # MySQL doesn't support an INSERT...RETURNING statement. - if not fields: - return "", () - columns = [ - "%s.%s" - % ( - self.quote_name(field.model._meta.db_table), - self.quote_name(field.column), - ) - for field in fields - ] - return "RETURNING %s" % ", ".join(columns), () - - def sql_flush(self, style, tables, *, reset_sequences=False, allow_cascade=False): - if not tables: - return [] - - sql = ["SET FOREIGN_KEY_CHECKS = 0;"] - if reset_sequences: - # It's faster to TRUNCATE tables that require a sequence reset - # since ALTER TABLE AUTO_INCREMENT is slower than TRUNCATE. - sql.extend( - "%s %s;" - % ( - style.SQL_KEYWORD("TRUNCATE"), - style.SQL_FIELD(self.quote_name(table_name)), - ) - for table_name in tables - ) - else: - # Otherwise issue a simple DELETE since it's faster than TRUNCATE - # and preserves sequences. - sql.extend( - "%s %s %s;" - % ( - style.SQL_KEYWORD("DELETE"), - style.SQL_KEYWORD("FROM"), - style.SQL_FIELD(self.quote_name(table_name)), - ) - for table_name in tables - ) - sql.append("SET FOREIGN_KEY_CHECKS = 1;") - return sql - - def sequence_reset_by_name_sql(self, style, sequences): - return [ - "%s %s %s %s = 1;" - % ( - style.SQL_KEYWORD("ALTER"), - style.SQL_KEYWORD("TABLE"), - style.SQL_FIELD(self.quote_name(sequence_info["table"])), - style.SQL_FIELD("AUTO_INCREMENT"), - ) - for sequence_info in sequences - ] - - def validate_autopk_value(self, value): - # Zero in AUTO_INCREMENT field does not work without the - # NO_AUTO_VALUE_ON_ZERO SQL mode. - if value == 0 and not self.connection.features.allows_auto_pk_0: - raise ValueError( - "The database backend does not accept 0 as a value for AutoField." - ) - return value - - def adapt_datetimefield_value(self, value): - if value is None: - return None - - # Expression values are adapted by the database. - if hasattr(value, "resolve_expression"): - return value - - # MySQL doesn't support tz-aware datetimes - if timezone.is_aware(value): - if settings.USE_TZ: - value = timezone.make_naive(value, self.connection.timezone) - else: - raise ValueError( - "MySQL backend does not support timezone-aware datetimes when " - "USE_TZ is False." - ) - return str(value) - - def adapt_timefield_value(self, value): - if value is None: - return None - - # Expression values are adapted by the database. - if hasattr(value, "resolve_expression"): - return value - - # MySQL doesn't support tz-aware times - if timezone.is_aware(value): - raise ValueError("MySQL backend does not support timezone-aware times.") - - return value.isoformat(timespec="microseconds") - - def max_name_length(self): - return 64 - - def pk_default_value(self): - return "NULL" - - def combine_expression(self, connector, sub_expressions): - if connector == "^": - return "POW(%s)" % ",".join(sub_expressions) - # Convert the result to a signed integer since MySQL's binary operators - # return an unsigned integer. - elif connector in ("&", "|", "<<", "#"): - connector = "^" if connector == "#" else connector - return "CONVERT(%s, SIGNED)" % connector.join(sub_expressions) - elif connector == ">>": - lhs, rhs = sub_expressions - return "FLOOR(%(lhs)s / POW(2, %(rhs)s))" % {"lhs": lhs, "rhs": rhs} - return super().combine_expression(connector, sub_expressions) - - def get_db_converters(self, expression): - converters = super().get_db_converters(expression) - internal_type = expression.output_field.get_internal_type() - if internal_type == "BooleanField": - converters.append(self.convert_booleanfield_value) - elif internal_type == "DateTimeField": - if settings.USE_TZ: - converters.append(self.convert_datetimefield_value) - elif internal_type == "UUIDField": - converters.append(self.convert_uuidfield_value) - return converters - - def convert_booleanfield_value(self, value, expression, connection): - if value in (0, 1): - value = bool(value) - return value - - def convert_datetimefield_value(self, value, expression, connection): - if value is not None: - value = timezone.make_aware(value, self.connection.timezone) - return value - - def convert_uuidfield_value(self, value, expression, connection): - if value is not None: - value = uuid.UUID(value) - return value - - def binary_placeholder_sql(self, value): - return ( - "_binary %s" if value is not None and not hasattr(value, "as_sql") else "%s" - ) - - def subtract_temporals(self, internal_type, lhs, rhs): - lhs_sql, lhs_params = lhs - rhs_sql, rhs_params = rhs - if internal_type == "TimeField": - if self.connection.mysql_is_mariadb: - # MariaDB includes the microsecond component in TIME_TO_SEC as - # a decimal. MySQL returns an integer without microseconds. - return ( - "CAST((TIME_TO_SEC(%(lhs)s) - TIME_TO_SEC(%(rhs)s)) " - "* 1000000 AS SIGNED)" - ) % { - "lhs": lhs_sql, - "rhs": rhs_sql, - }, ( - *lhs_params, - *rhs_params, - ) - return ( - "((TIME_TO_SEC(%(lhs)s) * 1000000 + MICROSECOND(%(lhs)s)) -" - " (TIME_TO_SEC(%(rhs)s) * 1000000 + MICROSECOND(%(rhs)s)))" - ) % {"lhs": lhs_sql, "rhs": rhs_sql}, tuple(lhs_params) * 2 + tuple( - rhs_params - ) * 2 - params = (*rhs_params, *lhs_params) - return "TIMESTAMPDIFF(MICROSECOND, %s, %s)" % (rhs_sql, lhs_sql), params - - def explain_query_prefix(self, format=None, **options): - # Alias MySQL's TRADITIONAL to TEXT for consistency with other backends. - if format and format.upper() == "TEXT": - format = "TRADITIONAL" - elif ( - not format and "TREE" in self.connection.features.supported_explain_formats - ): - # Use TREE by default (if supported) as it's more informative. - format = "TREE" - analyze = options.pop("analyze", False) - prefix = super().explain_query_prefix(format, **options) - if analyze and self.connection.features.supports_explain_analyze: - # MariaDB uses ANALYZE instead of EXPLAIN ANALYZE. - prefix = ( - "ANALYZE" if self.connection.mysql_is_mariadb else prefix + " ANALYZE" - ) - if format and not (analyze and not self.connection.mysql_is_mariadb): - # Only MariaDB supports the analyze option with formats. - prefix += " FORMAT=%s" % format - return prefix - - def regex_lookup(self, lookup_type): - # REGEXP_LIKE doesn't exist in MariaDB. - if self.connection.mysql_is_mariadb: - if lookup_type == "regex": - return "%s REGEXP BINARY %s" - return "%s REGEXP %s" - - match_option = "c" if lookup_type == "regex" else "i" - return "REGEXP_LIKE(%%s, %%s, '%s')" % match_option - - def insert_statement(self, on_conflict=None): - if on_conflict == OnConflict.IGNORE: - return "INSERT IGNORE INTO" - return super().insert_statement(on_conflict=on_conflict) - - def lookup_cast(self, lookup_type, internal_type=None): - lookup = "%s" - if internal_type == "JSONField": - if self.connection.mysql_is_mariadb or lookup_type in ( - "iexact", - "contains", - "icontains", - "startswith", - "istartswith", - "endswith", - "iendswith", - "regex", - "iregex", - ): - lookup = "JSON_UNQUOTE(%s)" - return lookup - - def conditional_expression_supported_in_where_clause(self, expression): - # MySQL ignores indexes with boolean fields unless they're compared - # directly to a boolean value. - if isinstance(expression, (Exists, Lookup)): - return True - if isinstance(expression, ExpressionWrapper) and expression.conditional: - return self.conditional_expression_supported_in_where_clause( - expression.expression - ) - if getattr(expression, "conditional", False): - return False - return super().conditional_expression_supported_in_where_clause(expression) - - def on_conflict_suffix_sql(self, fields, on_conflict, update_fields, unique_fields): - if on_conflict == OnConflict.UPDATE: - conflict_suffix_sql = "ON DUPLICATE KEY UPDATE %(fields)s" - # The use of VALUES() is deprecated in MySQL 8.0.20+. Instead, use - # aliases for the new row and its columns available in MySQL - # 8.0.19+. - if not self.connection.mysql_is_mariadb: - if self.connection.mysql_version >= (8, 0, 19): - conflict_suffix_sql = f"AS new {conflict_suffix_sql}" - field_sql = "%(field)s = new.%(field)s" - else: - field_sql = "%(field)s = VALUES(%(field)s)" - # Use VALUE() on MariaDB. - else: - field_sql = "%(field)s = VALUE(%(field)s)" - - fields = ", ".join( - [ - field_sql % {"field": field} - for field in map(self.quote_name, update_fields) - ] - ) - return conflict_suffix_sql % {"fields": fields} - return super().on_conflict_suffix_sql( - fields, - on_conflict, - update_fields, - unique_fields, - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/schema.py b/.venv/lib/python3.10/site-packages/django/db/backends/mysql/schema.py deleted file mode 100644 index b4192bb..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/schema.py +++ /dev/null @@ -1,281 +0,0 @@ -from django.db.backends.base.schema import BaseDatabaseSchemaEditor -from django.db.models import NOT_PROVIDED, F, UniqueConstraint -from django.db.models.constants import LOOKUP_SEP - - -class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): - sql_rename_table = "RENAME TABLE %(old_table)s TO %(new_table)s" - - sql_alter_column_null = "MODIFY %(column)s %(type)s NULL" - sql_alter_column_not_null = "MODIFY %(column)s %(type)s NOT NULL" - sql_alter_column_type = "MODIFY %(column)s %(type)s%(collation)s%(comment)s" - sql_alter_column_no_default_null = "ALTER COLUMN %(column)s SET DEFAULT NULL" - - # No 'CASCADE' which works as a no-op in MySQL but is undocumented - sql_delete_column = "ALTER TABLE %(table)s DROP COLUMN %(column)s" - - sql_delete_unique = "ALTER TABLE %(table)s DROP INDEX %(name)s" - sql_create_column_inline_fk = ( - ", ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) " - "REFERENCES %(to_table)s(%(to_column)s)" - ) - sql_delete_fk = "ALTER TABLE %(table)s DROP FOREIGN KEY %(name)s" - - sql_delete_index = "DROP INDEX %(name)s ON %(table)s" - sql_rename_index = "ALTER TABLE %(table)s RENAME INDEX %(old_name)s TO %(new_name)s" - - sql_create_pk = ( - "ALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)" - ) - sql_delete_pk = "ALTER TABLE %(table)s DROP PRIMARY KEY" - - sql_create_index = "CREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)s" - - sql_alter_table_comment = "ALTER TABLE %(table)s COMMENT = %(comment)s" - sql_alter_column_comment = None - - @property - def sql_delete_check(self): - if self.connection.mysql_is_mariadb: - # The name of the column check constraint is the same as the field - # name on MariaDB. Adding IF EXISTS clause prevents migrations - # crash. Constraint is removed during a "MODIFY" column statement. - return "ALTER TABLE %(table)s DROP CONSTRAINT IF EXISTS %(name)s" - return "ALTER TABLE %(table)s DROP CHECK %(name)s" - - @property - def sql_rename_column(self): - is_mariadb = self.connection.mysql_is_mariadb - if is_mariadb and self.connection.mysql_version < (10, 5, 2): - # MariaDB < 10.5.2 doesn't support an - # "ALTER TABLE ... RENAME COLUMN" statement. - return "ALTER TABLE %(table)s CHANGE %(old_column)s %(new_column)s %(type)s" - return super().sql_rename_column - - def quote_value(self, value): - self.connection.ensure_connection() - # MySQLdb escapes to string, PyMySQL to bytes. - quoted = self.connection.connection.escape( - value, self.connection.connection.encoders - ) - if isinstance(value, str) and isinstance(quoted, bytes): - quoted = quoted.decode() - return quoted - - def _is_limited_data_type(self, field): - db_type = field.db_type(self.connection) - return ( - db_type is not None - and db_type.lower() in self.connection._limited_data_types - ) - - def _is_text_or_blob(self, field): - db_type = field.db_type(self.connection) - return db_type and db_type.lower().endswith(("blob", "text")) - - def skip_default(self, field): - default_is_empty = self.effective_default(field) in ("", b"") - if default_is_empty and self._is_text_or_blob(field): - return True - if not self._supports_limited_data_type_defaults: - return self._is_limited_data_type(field) - return False - - def skip_default_on_alter(self, field): - default_is_empty = self.effective_default(field) in ("", b"") - if default_is_empty and self._is_text_or_blob(field): - return True - if self._is_limited_data_type(field) and not self.connection.mysql_is_mariadb: - # MySQL doesn't support defaults for BLOB and TEXT in the - # ALTER COLUMN statement. - return True - return False - - @property - def _supports_limited_data_type_defaults(self): - # MariaDB and MySQL >= 8.0.13 support defaults for BLOB and TEXT. - if self.connection.mysql_is_mariadb: - return True - return self.connection.mysql_version >= (8, 0, 13) - - def _column_default_sql(self, field): - if ( - not self.connection.mysql_is_mariadb - and self._supports_limited_data_type_defaults - and self._is_limited_data_type(field) - ): - # MySQL supports defaults for BLOB and TEXT columns only if the - # default value is written as an expression i.e. in parentheses. - return "(%s)" - return super()._column_default_sql(field) - - def add_field(self, model, field): - super().add_field(model, field) - - # Simulate the effect of a one-off default. - # field.default may be unhashable, so a set isn't used for "in" check. - if self.skip_default(field) and field.default not in (None, NOT_PROVIDED): - effective_default = self.effective_default(field) - self.execute( - "UPDATE %(table)s SET %(column)s = %%s" - % { - "table": self.quote_name(model._meta.db_table), - "column": self.quote_name(field.column), - }, - [effective_default], - ) - - def remove_constraint(self, model, constraint): - if ( - isinstance(constraint, UniqueConstraint) - and constraint.create_sql(model, self) is not None - ): - self._create_missing_fk_index( - model, - fields=constraint.fields, - expressions=constraint.expressions, - ) - super().remove_constraint(model, constraint) - - def remove_index(self, model, index): - self._create_missing_fk_index( - model, - fields=[field_name for field_name, _ in index.fields_orders], - expressions=index.expressions, - ) - super().remove_index(model, index) - - def _field_should_be_indexed(self, model, field): - if not super()._field_should_be_indexed(model, field): - return False - - storage = self.connection.introspection.get_storage_engine( - self.connection.cursor(), model._meta.db_table - ) - # No need to create an index for ForeignKey fields except if - # db_constraint=False because the index from that constraint won't be - # created. - if ( - storage == "InnoDB" - and field.get_internal_type() == "ForeignKey" - and field.db_constraint - ): - return False - return not self._is_limited_data_type(field) - - def _create_missing_fk_index( - self, - model, - *, - fields, - expressions=None, - ): - """ - MySQL can remove an implicit FK index on a field when that field is - covered by another index like a unique_together. "covered" here means - that the more complex index has the FK field as its first field (see - https://bugs.mysql.com/bug.php?id=37910). - - Manually create an implicit FK index to make it possible to remove the - composed index. - """ - first_field_name = None - if fields: - first_field_name = fields[0] - elif ( - expressions - and self.connection.features.supports_expression_indexes - and isinstance(expressions[0], F) - and LOOKUP_SEP not in expressions[0].name - ): - first_field_name = expressions[0].name - - if not first_field_name: - return - - first_field = model._meta.get_field(first_field_name) - if first_field.get_internal_type() == "ForeignKey": - column = self.connection.introspection.identifier_converter( - first_field.column - ) - with self.connection.cursor() as cursor: - constraint_names = [ - name - for name, infodict in self.connection.introspection.get_constraints( - cursor, model._meta.db_table - ).items() - if infodict["index"] and infodict["columns"][0] == column - ] - # There are no other indexes that starts with the FK field, only - # the index that is expected to be deleted. - if len(constraint_names) == 1: - self.execute( - self._create_index_sql(model, fields=[first_field], suffix="") - ) - - def _delete_composed_index(self, model, fields, *args): - self._create_missing_fk_index(model, fields=fields) - return super()._delete_composed_index(model, fields, *args) - - def _set_field_new_type(self, field, new_type): - """ - Keep the NULL and DEFAULT properties of the old field. If it has - changed, it will be handled separately. - """ - if field.has_db_default(): - default_sql, params = self.db_default_sql(field) - default_sql %= tuple(self.quote_value(p) for p in params) - new_type += f" DEFAULT {default_sql}" - if field.null: - new_type += " NULL" - else: - new_type += " NOT NULL" - return new_type - - def _alter_column_type_sql( - self, model, old_field, new_field, new_type, old_collation, new_collation - ): - new_type = self._set_field_new_type(old_field, new_type) - return super()._alter_column_type_sql( - model, old_field, new_field, new_type, old_collation, new_collation - ) - - def _field_db_check(self, field, field_db_params): - if self.connection.mysql_is_mariadb and self.connection.mysql_version >= ( - 10, - 5, - 2, - ): - return super()._field_db_check(field, field_db_params) - # On MySQL and MariaDB < 10.5.2 (no support for - # "ALTER TABLE ... RENAME COLUMN" statements), check constraints with - # the column name as it requires explicit recreation when the column is - # renamed. - return field_db_params["check"] - - def _rename_field_sql(self, table, old_field, new_field, new_type): - new_type = self._set_field_new_type(old_field, new_type) - return super()._rename_field_sql(table, old_field, new_field, new_type) - - def _alter_column_comment_sql(self, model, new_field, new_type, new_db_comment): - # Comment is alter when altering the column type. - return "", [] - - def _comment_sql(self, comment): - comment_sql = super()._comment_sql(comment) - return f" COMMENT {comment_sql}" - - def _alter_column_null_sql(self, model, old_field, new_field): - if not new_field.has_db_default(): - return super()._alter_column_null_sql(model, old_field, new_field) - - new_db_params = new_field.db_parameters(connection=self.connection) - type_sql = self._set_field_new_type(new_field, new_db_params["type"]) - return ( - "MODIFY %(column)s %(type)s" - % { - "column": self.quote_name(new_field.column), - "type": type_sql, - }, - [], - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/validation.py b/.venv/lib/python3.10/site-packages/django/db/backends/mysql/validation.py deleted file mode 100644 index fdc3809..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/mysql/validation.py +++ /dev/null @@ -1,77 +0,0 @@ -from django.core import checks -from django.db.backends.base.validation import BaseDatabaseValidation -from django.utils.version import get_docs_version - - -class DatabaseValidation(BaseDatabaseValidation): - def check(self, **kwargs): - issues = super().check(**kwargs) - issues.extend(self._check_sql_mode(**kwargs)) - return issues - - def _check_sql_mode(self, **kwargs): - if not ( - self.connection.sql_mode & {"STRICT_TRANS_TABLES", "STRICT_ALL_TABLES"} - ): - return [ - checks.Warning( - "%s Strict Mode is not set for database connection '%s'" - % (self.connection.display_name, self.connection.alias), - hint=( - "%s's Strict Mode fixes many data integrity problems in " - "%s, such as data truncation upon insertion, by " - "escalating warnings into errors. It is strongly " - "recommended you activate it. See: " - "https://docs.djangoproject.com/en/%s/ref/databases/" - "#mysql-sql-mode" - % ( - self.connection.display_name, - self.connection.display_name, - get_docs_version(), - ), - ), - id="mysql.W002", - ) - ] - return [] - - def check_field_type(self, field, field_type): - """ - MySQL has the following field length restriction: - No character (varchar) fields can have a length exceeding 255 - characters if they have a unique index on them. - MySQL doesn't support a database index on some data types. - """ - errors = [] - if ( - field_type.startswith("varchar") - and field.unique - and (field.max_length is None or int(field.max_length) > 255) - ): - errors.append( - checks.Warning( - "%s may not allow unique CharFields to have a max_length " - "> 255." % self.connection.display_name, - obj=field, - hint=( - "See: https://docs.djangoproject.com/en/%s/ref/" - "databases/#mysql-character-fields" % get_docs_version() - ), - id="mysql.W003", - ) - ) - - if field.db_index and field_type.lower() in self.connection._limited_data_types: - errors.append( - checks.Warning( - "%s does not support a database index on %s columns." - % (self.connection.display_name, field_type), - hint=( - "An index won't be created. Silence this warning if " - "you don't care about it." - ), - obj=field, - id="fields.W162", - ) - ) - return errors diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/__init__.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/base.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/base.py deleted file mode 100644 index 3b37c38..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/base.py +++ /dev/null @@ -1,668 +0,0 @@ -""" -Oracle database backend for Django. - -Requires oracledb: https://oracle.github.io/python-oracledb/ -""" - -import datetime -import decimal -import os -import platform -from contextlib import contextmanager - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.db import IntegrityError -from django.db.backends.base.base import BaseDatabaseWrapper -from django.db.backends.oracle.oracledb_any import is_oracledb -from django.db.backends.utils import debug_transaction -from django.utils.asyncio import async_unsafe -from django.utils.encoding import force_bytes, force_str -from django.utils.functional import cached_property -from django.utils.version import get_version_tuple - -try: - from django.db.backends.oracle.oracledb_any import oracledb as Database -except ImportError as e: - raise ImproperlyConfigured(f"Error loading oracledb module: {e}") - - -def _setup_environment(environ): - # Cygwin requires some special voodoo to set the environment variables - # properly so that Oracle will see them. - if platform.system().upper().startswith("CYGWIN"): - try: - import ctypes - except ImportError as e: - raise ImproperlyConfigured( - "Error loading ctypes: %s; " - "the Oracle backend requires ctypes to " - "operate correctly under Cygwin." % e - ) - kernel32 = ctypes.CDLL("kernel32") - for name, value in environ: - kernel32.SetEnvironmentVariableA(name, value) - else: - os.environ.update(environ) - - -_setup_environment( - [ - # Oracle takes client-side character set encoding from the environment. - ("NLS_LANG", ".AL32UTF8"), - # This prevents Unicode from getting mangled by getting encoded into the - # potentially non-Unicode database character set. - ("ORA_NCHAR_LITERAL_REPLACE", "TRUE"), - ] -) - - -# Some of these import oracledb, so import them after checking if it's -# installed. -from .client import DatabaseClient # NOQA -from .creation import DatabaseCreation # NOQA -from .features import DatabaseFeatures # NOQA -from .introspection import DatabaseIntrospection # NOQA -from .operations import DatabaseOperations # NOQA -from .schema import DatabaseSchemaEditor # NOQA -from .utils import Oracle_datetime, dsn # NOQA -from .validation import DatabaseValidation # NOQA - - -@contextmanager -def wrap_oracle_errors(): - try: - yield - except Database.DatabaseError as e: - # oracledb raises a oracledb.DatabaseError exception with the - # following attributes and values: - # code = 2091 - # message = 'ORA-02091: transaction rolled back - # 'ORA-02291: integrity constraint (TEST_DJANGOTEST.SYS - # _C00102056) violated - parent key not found' - # or: - # 'ORA-00001: unique constraint (DJANGOTEST.DEFERRABLE_ - # PINK_CONSTRAINT) violated - # Convert that case to Django's IntegrityError exception. - x = e.args[0] - if ( - hasattr(x, "code") - and hasattr(x, "message") - and x.code == 2091 - and ("ORA-02291" in x.message or "ORA-00001" in x.message) - ): - raise IntegrityError(*tuple(e.args)) - raise - - -class _UninitializedOperatorsDescriptor: - def __get__(self, instance, cls=None): - # If connection.operators is looked up before a connection has been - # created, transparently initialize connection.operators to avert an - # AttributeError. - if instance is None: - raise AttributeError("operators not available as class attribute") - # Creating a cursor will initialize the operators. - instance.cursor().close() - return instance.__dict__["operators"] - - -class DatabaseWrapper(BaseDatabaseWrapper): - vendor = "oracle" - display_name = "Oracle" - # This dictionary maps Field objects to their associated Oracle column - # types, as strings. Column-type strings can contain format strings; they'll - # be interpolated against the values of Field.__dict__ before being output. - # If a column type is set to None, it won't be included in the output. - # - # Any format strings starting with "qn_" are quoted before being used in the - # output (the "qn_" prefix is stripped before the lookup is performed. - data_types = { - "AutoField": "NUMBER(11) GENERATED BY DEFAULT ON NULL AS IDENTITY", - "BigAutoField": "NUMBER(19) GENERATED BY DEFAULT ON NULL AS IDENTITY", - "BinaryField": "BLOB", - "BooleanField": "NUMBER(1)", - "CharField": "NVARCHAR2(%(max_length)s)", - "DateField": "DATE", - "DateTimeField": "TIMESTAMP", - "DecimalField": "NUMBER(%(max_digits)s, %(decimal_places)s)", - "DurationField": "INTERVAL DAY(9) TO SECOND(6)", - "FileField": "NVARCHAR2(%(max_length)s)", - "FilePathField": "NVARCHAR2(%(max_length)s)", - "FloatField": "DOUBLE PRECISION", - "IntegerField": "NUMBER(11)", - "JSONField": "NCLOB", - "BigIntegerField": "NUMBER(19)", - "IPAddressField": "VARCHAR2(15)", - "GenericIPAddressField": "VARCHAR2(39)", - "OneToOneField": "NUMBER(11)", - "PositiveBigIntegerField": "NUMBER(19)", - "PositiveIntegerField": "NUMBER(11)", - "PositiveSmallIntegerField": "NUMBER(11)", - "SlugField": "NVARCHAR2(%(max_length)s)", - "SmallAutoField": "NUMBER(5) GENERATED BY DEFAULT ON NULL AS IDENTITY", - "SmallIntegerField": "NUMBER(11)", - "TextField": "NCLOB", - "TimeField": "TIMESTAMP", - "URLField": "VARCHAR2(%(max_length)s)", - "UUIDField": "VARCHAR2(32)", - } - data_type_check_constraints = { - "BooleanField": "%(qn_column)s IN (0,1)", - "JSONField": "%(qn_column)s IS JSON", - "PositiveBigIntegerField": "%(qn_column)s >= 0", - "PositiveIntegerField": "%(qn_column)s >= 0", - "PositiveSmallIntegerField": "%(qn_column)s >= 0", - } - - # Oracle doesn't support a database index on these columns. - _limited_data_types = ("clob", "nclob", "blob") - - operators = _UninitializedOperatorsDescriptor() - - _standard_operators = { - "exact": "= %s", - "iexact": "= UPPER(%s)", - "contains": ( - "LIKE TRANSLATE(%s USING NCHAR_CS) ESCAPE TRANSLATE('\\' USING NCHAR_CS)" - ), - "icontains": ( - "LIKE UPPER(TRANSLATE(%s USING NCHAR_CS)) " - "ESCAPE TRANSLATE('\\' USING NCHAR_CS)" - ), - "gt": "> %s", - "gte": ">= %s", - "lt": "< %s", - "lte": "<= %s", - "startswith": ( - "LIKE TRANSLATE(%s USING NCHAR_CS) ESCAPE TRANSLATE('\\' USING NCHAR_CS)" - ), - "endswith": ( - "LIKE TRANSLATE(%s USING NCHAR_CS) ESCAPE TRANSLATE('\\' USING NCHAR_CS)" - ), - "istartswith": ( - "LIKE UPPER(TRANSLATE(%s USING NCHAR_CS)) " - "ESCAPE TRANSLATE('\\' USING NCHAR_CS)" - ), - "iendswith": ( - "LIKE UPPER(TRANSLATE(%s USING NCHAR_CS)) " - "ESCAPE TRANSLATE('\\' USING NCHAR_CS)" - ), - } - - _likec_operators = { - **_standard_operators, - "contains": "LIKEC %s ESCAPE '\\'", - "icontains": "LIKEC UPPER(%s) ESCAPE '\\'", - "startswith": "LIKEC %s ESCAPE '\\'", - "endswith": "LIKEC %s ESCAPE '\\'", - "istartswith": "LIKEC UPPER(%s) ESCAPE '\\'", - "iendswith": "LIKEC UPPER(%s) ESCAPE '\\'", - } - - # The patterns below are used to generate SQL pattern lookup clauses when - # the right-hand side of the lookup isn't a raw string (it might be an expression - # or the result of a bilateral transformation). - # In those cases, special characters for LIKE operators (e.g. \, %, _) - # should be escaped on the database side. - # - # Note: we use str.format() here for readability as '%' is used as a wildcard for - # the LIKE operator. - pattern_esc = r"REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')" - _pattern_ops = { - "contains": "'%%' || {} || '%%'", - "icontains": "'%%' || UPPER({}) || '%%'", - "startswith": "{} || '%%'", - "istartswith": "UPPER({}) || '%%'", - "endswith": "'%%' || {}", - "iendswith": "'%%' || UPPER({})", - } - - _standard_pattern_ops = { - k: "LIKE TRANSLATE( " + v + " USING NCHAR_CS)" - " ESCAPE TRANSLATE('\\' USING NCHAR_CS)" - for k, v in _pattern_ops.items() - } - _likec_pattern_ops = { - k: "LIKEC " + v + " ESCAPE '\\'" for k, v in _pattern_ops.items() - } - - Database = Database - SchemaEditorClass = DatabaseSchemaEditor - # Classes instantiated in __init__(). - client_class = DatabaseClient - creation_class = DatabaseCreation - features_class = DatabaseFeatures - introspection_class = DatabaseIntrospection - ops_class = DatabaseOperations - validation_class = DatabaseValidation - _connection_pools = {} - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - use_returning_into = self.settings_dict["OPTIONS"].get( - "use_returning_into", True - ) - self.features.can_return_columns_from_insert = use_returning_into - - @property - def is_pool(self): - return self.settings_dict["OPTIONS"].get("pool", False) - - @property - def pool(self): - if not self.is_pool: - return None - - if self.settings_dict.get("CONN_MAX_AGE", 0) != 0: - raise ImproperlyConfigured( - "Pooling doesn't support persistent connections." - ) - - pool_key = (self.alias, self.settings_dict["USER"]) - if pool_key not in self._connection_pools: - connect_kwargs = self.get_connection_params() - pool_options = connect_kwargs.pop("pool") - if pool_options is not True: - connect_kwargs.update(pool_options) - - pool = Database.create_pool( - user=self.settings_dict["USER"], - password=self.settings_dict["PASSWORD"], - dsn=dsn(self.settings_dict), - **connect_kwargs, - ) - self._connection_pools.setdefault(pool_key, pool) - - return self._connection_pools[pool_key] - - def close_pool(self): - if self.pool: - self.pool.close(force=True) - pool_key = (self.alias, self.settings_dict["USER"]) - del self._connection_pools[pool_key] - - def get_database_version(self): - return self.oracle_version - - def get_connection_params(self): - # Pooling feature is only supported for oracledb. - if self.is_pool and not is_oracledb: - raise ImproperlyConfigured( - "Pooling isn't supported by cx_Oracle. Use python-oracledb instead." - ) - conn_params = self.settings_dict["OPTIONS"].copy() - if "use_returning_into" in conn_params: - del conn_params["use_returning_into"] - return conn_params - - @async_unsafe - def get_new_connection(self, conn_params): - if self.pool: - return self.pool.acquire() - return Database.connect( - user=self.settings_dict["USER"], - password=self.settings_dict["PASSWORD"], - dsn=dsn(self.settings_dict), - **conn_params, - ) - - def init_connection_state(self): - super().init_connection_state() - cursor = self.create_cursor() - # Set the territory first. The territory overrides NLS_DATE_FORMAT - # and NLS_TIMESTAMP_FORMAT to the territory default. When all of - # these are set in single statement it isn't clear what is supposed - # to happen. - cursor.execute("ALTER SESSION SET NLS_TERRITORY = 'AMERICA'") - # Set Oracle date to ANSI date format. This only needs to execute - # once when we create a new connection. We also set the Territory - # to 'AMERICA' which forces Sunday to evaluate to a '1' in - # TO_CHAR(). - cursor.execute( - "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'" - " NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF'" - + (" TIME_ZONE = 'UTC'" if settings.USE_TZ else "") - ) - cursor.close() - if "operators" not in self.__dict__: - # Ticket #14149: Check whether our LIKE implementation will - # work for this connection or we need to fall back on LIKEC. - # This check is performed only once per DatabaseWrapper - # instance per thread, since subsequent connections will use - # the same settings. - cursor = self.create_cursor() - try: - cursor.execute( - "SELECT 1 FROM DUAL WHERE DUMMY %s" - % self._standard_operators["contains"], - ["X"], - ) - except Database.DatabaseError: - self.operators = self._likec_operators - self.pattern_ops = self._likec_pattern_ops - else: - self.operators = self._standard_operators - self.pattern_ops = self._standard_pattern_ops - cursor.close() - self.connection.stmtcachesize = 20 - # Ensure all changes are preserved even when AUTOCOMMIT is False. - if not self.get_autocommit(): - self.commit() - - @async_unsafe - def create_cursor(self, name=None): - return FormatStylePlaceholderCursor(self.connection, self) - - def _commit(self): - if self.connection is not None: - with debug_transaction(self, "COMMIT"), wrap_oracle_errors(): - return self.connection.commit() - - # Oracle doesn't support releasing savepoints. But we fake them when query - # logging is enabled to keep query counts consistent with other backends. - def _savepoint_commit(self, sid): - if self.queries_logged: - self.queries_log.append( - { - "sql": "-- RELEASE SAVEPOINT %s (faked)" % self.ops.quote_name(sid), - "time": "0.000", - } - ) - - def _set_autocommit(self, autocommit): - with self.wrap_database_errors: - self.connection.autocommit = autocommit - - def check_constraints(self, table_names=None): - """ - Check constraints by setting them to immediate. Return them to deferred - afterward. - """ - with self.cursor() as cursor: - cursor.execute("SET CONSTRAINTS ALL IMMEDIATE") - cursor.execute("SET CONSTRAINTS ALL DEFERRED") - - def is_usable(self): - try: - self.connection.ping() - except Database.Error: - return False - else: - return True - - def close_if_health_check_failed(self): - if self.pool: - # The pool only returns healthy connections. - return - return super().close_if_health_check_failed() - - @cached_property - def oracle_version(self): - with self.temporary_connection(): - return tuple(int(x) for x in self.connection.version.split(".")) - - @cached_property - def oracledb_version(self): - return get_version_tuple(Database.__version__) - - -class OracleParam: - """ - Wrapper object for formatting parameters for Oracle. If the string - representation of the value is large enough (greater than 4000 characters) - the input size needs to be set as CLOB. Alternatively, if the parameter - has an `input_size` attribute, then the value of the `input_size` attribute - will be used instead. Otherwise, no input size will be set for the - parameter when executing the query. - """ - - def __init__(self, param, cursor, strings_only=False): - # With raw SQL queries, datetimes can reach this function - # without being converted by DateTimeField.get_db_prep_value. - if settings.USE_TZ and ( - isinstance(param, datetime.datetime) - and not isinstance(param, Oracle_datetime) - ): - param = Oracle_datetime.from_datetime(param) - - string_size = 0 - has_boolean_data_type = ( - cursor.database.features.supports_boolean_expr_in_select_clause - ) - if not has_boolean_data_type: - # Oracle < 23c doesn't recognize True and False correctly. - if param is True: - param = 1 - elif param is False: - param = 0 - if hasattr(param, "bind_parameter"): - self.force_bytes = param.bind_parameter(cursor) - elif isinstance(param, (Database.Binary, datetime.timedelta)): - self.force_bytes = param - else: - # To transmit to the database, we need Unicode if supported - # To get size right, we must consider bytes. - self.force_bytes = force_str(param, cursor.charset, strings_only) - if isinstance(self.force_bytes, str): - # We could optimize by only converting up to 4000 bytes here - string_size = len(force_bytes(param, cursor.charset, strings_only)) - if hasattr(param, "input_size"): - # If parameter has `input_size` attribute, use that. - self.input_size = param.input_size - elif string_size > 4000: - # Mark any string param greater than 4000 characters as a CLOB. - self.input_size = Database.DB_TYPE_CLOB - elif isinstance(param, datetime.datetime): - self.input_size = Database.DB_TYPE_TIMESTAMP - elif has_boolean_data_type and isinstance(param, bool): - self.input_size = Database.DB_TYPE_BOOLEAN - else: - self.input_size = None - - -class VariableWrapper: - """ - An adapter class for cursor variables that prevents the wrapped object - from being converted into a string when used to instantiate an OracleParam. - This can be used generally for any other object that should be passed into - Cursor.execute as-is. - """ - - def __init__(self, var): - self.var = var - - def bind_parameter(self, cursor): - return self.var - - def __getattr__(self, key): - return getattr(self.var, key) - - def __setattr__(self, key, value): - if key == "var": - self.__dict__[key] = value - else: - setattr(self.var, key, value) - - -class FormatStylePlaceholderCursor: - """ - Django uses "format" (e.g. '%s') style placeholders, but Oracle uses ":var" - style. This fixes it -- but note that if you want to use a literal "%s" in - a query, you'll need to use "%%s". - """ - - charset = "utf-8" - - def __init__(self, connection, database): - self.cursor = connection.cursor() - self.cursor.outputtypehandler = self._output_type_handler - self.database = database - - @staticmethod - def _output_number_converter(value): - return decimal.Decimal(value) if "." in value else int(value) - - @staticmethod - def _get_decimal_converter(precision, scale): - if scale == 0: - return int - context = decimal.Context(prec=precision) - quantize_value = decimal.Decimal(1).scaleb(-scale) - return lambda v: decimal.Decimal(v).quantize(quantize_value, context=context) - - @staticmethod - def _output_type_handler(cursor, name, defaultType, length, precision, scale): - """ - Called for each db column fetched from cursors. Return numbers as the - appropriate Python type, and NCLOB with JSON as strings. - """ - if defaultType == Database.NUMBER: - if scale == -127: - if precision == 0: - # NUMBER column: decimal-precision floating point. - # This will normally be an integer from a sequence, - # but it could be a decimal value. - outconverter = FormatStylePlaceholderCursor._output_number_converter - else: - # FLOAT column: binary-precision floating point. - # This comes from FloatField columns. - outconverter = float - elif precision > 0: - # NUMBER(p,s) column: decimal-precision fixed point. - # This comes from IntegerField and DecimalField columns. - outconverter = FormatStylePlaceholderCursor._get_decimal_converter( - precision, scale - ) - else: - # No type information. This normally comes from a - # mathematical expression in the SELECT list. Guess int - # or Decimal based on whether it has a decimal point. - outconverter = FormatStylePlaceholderCursor._output_number_converter - return cursor.var( - Database.STRING, - size=255, - arraysize=cursor.arraysize, - outconverter=outconverter, - ) - # oracledb 2.0.0+ returns NLOB columns with IS JSON constraints as - # dicts. Use a no-op converter to avoid this. - elif defaultType == Database.DB_TYPE_NCLOB: - return cursor.var(Database.DB_TYPE_NCLOB, arraysize=cursor.arraysize) - - def _format_params(self, params): - try: - return {k: OracleParam(v, self, True) for k, v in params.items()} - except AttributeError: - return tuple(OracleParam(p, self, True) for p in params) - - def _guess_input_sizes(self, params_list): - # Try dict handling; if that fails, treat as sequence - if hasattr(params_list[0], "keys"): - sizes = {} - for params in params_list: - for k, value in params.items(): - if value.input_size: - sizes[k] = value.input_size - if sizes: - self.setinputsizes(**sizes) - else: - # It's not a list of dicts; it's a list of sequences - sizes = [None] * len(params_list[0]) - for params in params_list: - for i, value in enumerate(params): - if value.input_size: - sizes[i] = value.input_size - if sizes: - self.setinputsizes(*sizes) - - def _param_generator(self, params): - # Try dict handling; if that fails, treat as sequence - if hasattr(params, "items"): - return {k: v.force_bytes for k, v in params.items()} - else: - return [p.force_bytes for p in params] - - def _fix_for_params(self, query, params, unify_by_values=False): - # oracledb wants no trailing ';' for SQL statements. For PL/SQL, it - # it does want a trailing ';' but not a trailing '/'. However, these - # characters must be included in the original query in case the query - # is being passed to SQL*Plus. - if query.endswith(";") or query.endswith("/"): - query = query[:-1] - if params is None: - params = [] - elif hasattr(params, "keys"): - # Handle params as dict - args = {k: ":%s" % k for k in params} - query %= args - elif unify_by_values and params: - # Handle params as a dict with unified query parameters by their - # values. It can be used only in single query execute() because - # executemany() shares the formatted query with each of the params - # list. e.g. for input params = [0.75, 2, 0.75, 'sth', 0.75] - # params_dict = { - # (float, 0.75): ':arg0', - # (int, 2): ':arg1', - # (str, 'sth'): ':arg2', - # } - # args = [':arg0', ':arg1', ':arg0', ':arg2', ':arg0'] - # params = {':arg0': 0.75, ':arg1': 2, ':arg2': 'sth'} - # The type of parameters in param_types keys is necessary to avoid - # unifying 0/1 with False/True. - param_types = [(type(param), param) for param in params] - params_dict = { - param_type: ":arg%d" % i - for i, param_type in enumerate(dict.fromkeys(param_types)) - } - args = [params_dict[param_type] for param_type in param_types] - params = { - placeholder: param for (_, param), placeholder in params_dict.items() - } - query %= tuple(args) - else: - # Handle params as sequence - args = [(":arg%d" % i) for i in range(len(params))] - query %= tuple(args) - return query, self._format_params(params) - - def execute(self, query, params=None): - query, params = self._fix_for_params(query, params, unify_by_values=True) - self._guess_input_sizes([params]) - with wrap_oracle_errors(): - return self.cursor.execute(query, self._param_generator(params)) - - def executemany(self, query, params=None): - if not params: - # No params given, nothing to do - return None - # uniform treatment for sequences and iterables - params_iter = iter(params) - query, firstparams = self._fix_for_params(query, next(params_iter)) - # we build a list of formatted params; as we're going to traverse it - # more than once, we can't make it lazy by using a generator - formatted = [firstparams] + [self._format_params(p) for p in params_iter] - self._guess_input_sizes(formatted) - with wrap_oracle_errors(): - return self.cursor.executemany( - query, [self._param_generator(p) for p in formatted] - ) - - def close(self): - try: - self.cursor.close() - except Database.InterfaceError: - # already closed - pass - - def var(self, *args): - return VariableWrapper(self.cursor.var(*args)) - - def arrayvar(self, *args): - return VariableWrapper(self.cursor.arrayvar(*args)) - - def __getattr__(self, attr): - return getattr(self.cursor, attr) - - def __iter__(self): - return iter(self.cursor) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/client.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/client.py deleted file mode 100644 index 365b116..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/client.py +++ /dev/null @@ -1,27 +0,0 @@ -import shutil - -from django.db.backends.base.client import BaseDatabaseClient - - -class DatabaseClient(BaseDatabaseClient): - executable_name = "sqlplus" - wrapper_name = "rlwrap" - - @staticmethod - def connect_string(settings_dict): - from django.db.backends.oracle.utils import dsn - - return '%s/"%s"@%s' % ( - settings_dict["USER"], - settings_dict["PASSWORD"], - dsn(settings_dict), - ) - - @classmethod - def settings_to_cmd_args_env(cls, settings_dict, parameters): - args = [cls.executable_name, "-L", cls.connect_string(settings_dict)] - wrapper_path = shutil.which(cls.wrapper_name) - if wrapper_path: - args = [wrapper_path, *args] - args.extend(parameters) - return args, None diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/creation.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/creation.py deleted file mode 100644 index 6823799..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/creation.py +++ /dev/null @@ -1,467 +0,0 @@ -import sys - -from django.conf import settings -from django.db import DatabaseError -from django.db.backends.base.creation import BaseDatabaseCreation -from django.utils.crypto import get_random_string -from django.utils.functional import cached_property - -TEST_DATABASE_PREFIX = "test_" - - -class DatabaseCreation(BaseDatabaseCreation): - @cached_property - def _maindb_connection(self): - """ - This is analogous to other backends' `_nodb_connection` property, - which allows access to an "administrative" connection which can - be used to manage the test databases. - For Oracle, the only connection that can be used for that purpose - is the main (non-test) connection. - """ - settings_dict = settings.DATABASES[self.connection.alias] - user = settings_dict.get("SAVED_USER") or settings_dict["USER"] - password = settings_dict.get("SAVED_PASSWORD") or settings_dict["PASSWORD"] - settings_dict = {**settings_dict, "USER": user, "PASSWORD": password} - DatabaseWrapper = type(self.connection) - return DatabaseWrapper(settings_dict, alias=self.connection.alias) - - def _create_test_db(self, verbosity=1, autoclobber=False, keepdb=False): - parameters = self._get_test_db_params() - with self._maindb_connection.cursor() as cursor: - if self._test_database_create(): - try: - self._execute_test_db_creation( - cursor, parameters, verbosity, keepdb - ) - except Exception as e: - if "ORA-01543" not in str(e): - # All errors except "tablespace already exists" cancel tests - self.log("Got an error creating the test database: %s" % e) - sys.exit(2) - if not autoclobber: - confirm = input( - "It appears the test database, %s, already exists. " - "Type 'yes' to delete it, or 'no' to cancel: " - % parameters["user"] - ) - if autoclobber or confirm == "yes": - if verbosity >= 1: - self.log( - "Destroying old test database for alias '%s'..." - % self.connection.alias - ) - try: - self._execute_test_db_destruction( - cursor, parameters, verbosity - ) - except DatabaseError as e: - if "ORA-29857" in str(e): - self._handle_objects_preventing_db_destruction( - cursor, parameters, verbosity, autoclobber - ) - else: - # Ran into a database error that isn't about - # leftover objects in the tablespace. - self.log( - "Got an error destroying the old test database: %s" - % e - ) - sys.exit(2) - except Exception as e: - self.log( - "Got an error destroying the old test database: %s" % e - ) - sys.exit(2) - try: - self._execute_test_db_creation( - cursor, parameters, verbosity, keepdb - ) - except Exception as e: - self.log( - "Got an error recreating the test database: %s" % e - ) - sys.exit(2) - else: - self.log("Tests cancelled.") - sys.exit(1) - - if self._test_user_create(): - if verbosity >= 1: - self.log("Creating test user...") - try: - self._create_test_user(cursor, parameters, verbosity, keepdb) - except Exception as e: - if "ORA-01920" not in str(e): - # All errors except "user already exists" cancel tests - self.log("Got an error creating the test user: %s" % e) - sys.exit(2) - if not autoclobber: - confirm = input( - "It appears the test user, %s, already exists. Type " - "'yes' to delete it, or 'no' to cancel: " - % parameters["user"] - ) - if autoclobber or confirm == "yes": - try: - if verbosity >= 1: - self.log("Destroying old test user...") - self._destroy_test_user(cursor, parameters, verbosity) - if verbosity >= 1: - self.log("Creating test user...") - self._create_test_user( - cursor, parameters, verbosity, keepdb - ) - except Exception as e: - self.log("Got an error recreating the test user: %s" % e) - sys.exit(2) - else: - self.log("Tests cancelled.") - sys.exit(1) - # Done with main user -- test user and tablespaces created. - self._maindb_connection.close() - self._switch_to_test_user(parameters) - return self.connection.settings_dict["NAME"] - - def _switch_to_test_user(self, parameters): - """ - Switch to the user that's used for creating the test database. - - Oracle doesn't have the concept of separate databases under the same - user, so a separate user is used; see _create_test_db(). The main user - is also needed for cleanup when testing is completed, so save its - credentials in the SAVED_USER/SAVED_PASSWORD key in the settings dict. - """ - real_settings = settings.DATABASES[self.connection.alias] - real_settings["SAVED_USER"] = self.connection.settings_dict["SAVED_USER"] = ( - self.connection.settings_dict["USER"] - ) - real_settings["SAVED_PASSWORD"] = self.connection.settings_dict[ - "SAVED_PASSWORD" - ] = self.connection.settings_dict["PASSWORD"] - real_test_settings = real_settings["TEST"] - test_settings = self.connection.settings_dict["TEST"] - real_test_settings["USER"] = real_settings["USER"] = test_settings["USER"] = ( - self.connection.settings_dict["USER"] - ) = parameters["user"] - real_settings["PASSWORD"] = self.connection.settings_dict["PASSWORD"] = ( - parameters["password"] - ) - - def set_as_test_mirror(self, primary_settings_dict): - """ - Set this database up to be used in testing as a mirror of a primary - database whose settings are given. - """ - self.connection.settings_dict["USER"] = primary_settings_dict["USER"] - self.connection.settings_dict["PASSWORD"] = primary_settings_dict["PASSWORD"] - - def _handle_objects_preventing_db_destruction( - self, cursor, parameters, verbosity, autoclobber - ): - # There are objects in the test tablespace which prevent dropping it - # The easy fix is to drop the test user -- but are we allowed to do so? - self.log( - "There are objects in the old test database which prevent its destruction." - "\nIf they belong to the test user, deleting the user will allow the test " - "database to be recreated.\n" - "Otherwise, you will need to find and remove each of these objects, " - "or use a different tablespace.\n" - ) - if self._test_user_create(): - if not autoclobber: - confirm = input("Type 'yes' to delete user %s: " % parameters["user"]) - if autoclobber or confirm == "yes": - try: - if verbosity >= 1: - self.log("Destroying old test user...") - self._destroy_test_user(cursor, parameters, verbosity) - except Exception as e: - self.log("Got an error destroying the test user: %s" % e) - sys.exit(2) - try: - if verbosity >= 1: - self.log( - "Destroying old test database for alias '%s'..." - % self.connection.alias - ) - self._execute_test_db_destruction(cursor, parameters, verbosity) - except Exception as e: - self.log("Got an error destroying the test database: %s" % e) - sys.exit(2) - else: - self.log("Tests cancelled -- test database cannot be recreated.") - sys.exit(1) - else: - self.log( - "Django is configured to use pre-existing test user '%s'," - " and will not attempt to delete it." % parameters["user"] - ) - self.log("Tests cancelled -- test database cannot be recreated.") - sys.exit(1) - - def _destroy_test_db(self, test_database_name, verbosity=1): - """ - Destroy a test database, prompting the user for confirmation if the - database already exists. Return the name of the test database created. - """ - if not self.connection.is_pool: - self.connection.settings_dict["USER"] = self.connection.settings_dict[ - "SAVED_USER" - ] - self.connection.settings_dict["PASSWORD"] = self.connection.settings_dict[ - "SAVED_PASSWORD" - ] - self.connection.close() - self.connection.close_pool() - parameters = self._get_test_db_params() - with self._maindb_connection.cursor() as cursor: - if self._test_user_create(): - if verbosity >= 1: - self.log("Destroying test user...") - self._destroy_test_user(cursor, parameters, verbosity) - if self._test_database_create(): - if verbosity >= 1: - self.log("Destroying test database tables...") - self._execute_test_db_destruction(cursor, parameters, verbosity) - self._maindb_connection.close() - self._maindb_connection.close_pool() - - def _execute_test_db_creation(self, cursor, parameters, verbosity, keepdb=False): - if verbosity >= 2: - self.log("_create_test_db(): dbname = %s" % parameters["user"]) - if self._test_database_oracle_managed_files(): - statements = [ - """ - CREATE TABLESPACE %(tblspace)s - DATAFILE SIZE %(size)s - AUTOEXTEND ON NEXT %(extsize)s MAXSIZE %(maxsize)s - """, - """ - CREATE TEMPORARY TABLESPACE %(tblspace_temp)s - TEMPFILE SIZE %(size_tmp)s - AUTOEXTEND ON NEXT %(extsize_tmp)s MAXSIZE %(maxsize_tmp)s - """, - ] - else: - statements = [ - """ - CREATE TABLESPACE %(tblspace)s - DATAFILE '%(datafile)s' SIZE %(size)s REUSE - AUTOEXTEND ON NEXT %(extsize)s MAXSIZE %(maxsize)s - """, - """ - CREATE TEMPORARY TABLESPACE %(tblspace_temp)s - TEMPFILE '%(datafile_tmp)s' SIZE %(size_tmp)s REUSE - AUTOEXTEND ON NEXT %(extsize_tmp)s MAXSIZE %(maxsize_tmp)s - """, - ] - # Ignore "tablespace already exists" error when keepdb is on. - acceptable_ora_err = "ORA-01543" if keepdb else None - self._execute_allow_fail_statements( - cursor, statements, parameters, verbosity, acceptable_ora_err - ) - - def _create_test_user(self, cursor, parameters, verbosity, keepdb=False): - if verbosity >= 2: - self.log("_create_test_user(): username = %s" % parameters["user"]) - statements = [ - """CREATE USER %(user)s - IDENTIFIED BY "%(password)s" - DEFAULT TABLESPACE %(tblspace)s - TEMPORARY TABLESPACE %(tblspace_temp)s - QUOTA UNLIMITED ON %(tblspace)s - """, - """GRANT CREATE SESSION, - CREATE TABLE, - CREATE SEQUENCE, - CREATE PROCEDURE, - CREATE TRIGGER - TO %(user)s""", - ] - # Ignore "user already exists" error when keepdb is on - acceptable_ora_err = "ORA-01920" if keepdb else None - success = self._execute_allow_fail_statements( - cursor, statements, parameters, verbosity, acceptable_ora_err - ) - # If the password was randomly generated, change the user accordingly. - if not success and self._test_settings_get("PASSWORD") is None: - set_password = 'ALTER USER %(user)s IDENTIFIED BY "%(password)s"' - self._execute_statements(cursor, [set_password], parameters, verbosity) - # Most test suites can be run without "create view" and - # "create materialized view" privileges. But some need it. - for object_type in ("VIEW", "MATERIALIZED VIEW"): - extra = "GRANT CREATE %(object_type)s TO %(user)s" - parameters["object_type"] = object_type - success = self._execute_allow_fail_statements( - cursor, [extra], parameters, verbosity, "ORA-01031" - ) - if not success and verbosity >= 2: - self.log( - "Failed to grant CREATE %s permission to test user. This may be ok." - % object_type - ) - - def _execute_test_db_destruction(self, cursor, parameters, verbosity): - if verbosity >= 2: - self.log("_execute_test_db_destruction(): dbname=%s" % parameters["user"]) - statements = [ - "DROP TABLESPACE %(tblspace)s " - "INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS", - "DROP TABLESPACE %(tblspace_temp)s " - "INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS", - ] - self._execute_statements(cursor, statements, parameters, verbosity) - - def _destroy_test_user(self, cursor, parameters, verbosity): - if verbosity >= 2: - self.log("_destroy_test_user(): user=%s" % parameters["user"]) - self.log("Be patient. This can take some time...") - statements = [ - "DROP USER %(user)s CASCADE", - ] - self._execute_statements(cursor, statements, parameters, verbosity) - - def _execute_statements( - self, cursor, statements, parameters, verbosity, allow_quiet_fail=False - ): - for template in statements: - stmt = template % parameters - if verbosity >= 2: - print(stmt) - try: - cursor.execute(stmt) - except Exception as err: - if (not allow_quiet_fail) or verbosity >= 2: - self.log("Failed (%s)" % (err)) - raise - - def _execute_allow_fail_statements( - self, cursor, statements, parameters, verbosity, acceptable_ora_err - ): - """ - Execute statements which are allowed to fail silently if the Oracle - error code given by `acceptable_ora_err` is raised. Return True if the - statements execute without an exception, or False otherwise. - """ - try: - # Statement can fail when acceptable_ora_err is not None - allow_quiet_fail = ( - acceptable_ora_err is not None and len(acceptable_ora_err) > 0 - ) - self._execute_statements( - cursor, - statements, - parameters, - verbosity, - allow_quiet_fail=allow_quiet_fail, - ) - return True - except DatabaseError as err: - description = str(err) - if acceptable_ora_err is None or acceptable_ora_err not in description: - raise - return False - - def _get_test_db_params(self): - return { - "dbname": self._test_database_name(), - "user": self._test_database_user(), - "password": self._test_database_passwd(), - "tblspace": self._test_database_tblspace(), - "tblspace_temp": self._test_database_tblspace_tmp(), - "datafile": self._test_database_tblspace_datafile(), - "datafile_tmp": self._test_database_tblspace_tmp_datafile(), - "maxsize": self._test_database_tblspace_maxsize(), - "maxsize_tmp": self._test_database_tblspace_tmp_maxsize(), - "size": self._test_database_tblspace_size(), - "size_tmp": self._test_database_tblspace_tmp_size(), - "extsize": self._test_database_tblspace_extsize(), - "extsize_tmp": self._test_database_tblspace_tmp_extsize(), - } - - def _test_settings_get(self, key, default=None, prefixed=None): - """ - Return a value from the test settings dict, or a given default, or a - prefixed entry from the main settings dict. - """ - settings_dict = self.connection.settings_dict - val = settings_dict["TEST"].get(key, default) - if val is None and prefixed: - val = TEST_DATABASE_PREFIX + settings_dict[prefixed] - return val - - def _test_database_name(self): - return self._test_settings_get("NAME", prefixed="NAME") - - def _test_database_create(self): - return self._test_settings_get("CREATE_DB", default=True) - - def _test_user_create(self): - return self._test_settings_get("CREATE_USER", default=True) - - def _test_database_user(self): - return self._test_settings_get("USER", prefixed="USER") - - def _test_database_passwd(self): - password = self._test_settings_get("PASSWORD") - if password is None and self._test_user_create(): - # Oracle passwords are limited to 30 chars and can't contain symbols. - password = get_random_string(30) - return password - - def _test_database_tblspace(self): - return self._test_settings_get("TBLSPACE", prefixed="USER") - - def _test_database_tblspace_tmp(self): - settings_dict = self.connection.settings_dict - return settings_dict["TEST"].get( - "TBLSPACE_TMP", TEST_DATABASE_PREFIX + settings_dict["USER"] + "_temp" - ) - - def _test_database_tblspace_datafile(self): - tblspace = "%s.dbf" % self._test_database_tblspace() - return self._test_settings_get("DATAFILE", default=tblspace) - - def _test_database_tblspace_tmp_datafile(self): - tblspace = "%s.dbf" % self._test_database_tblspace_tmp() - return self._test_settings_get("DATAFILE_TMP", default=tblspace) - - def _test_database_tblspace_maxsize(self): - return self._test_settings_get("DATAFILE_MAXSIZE", default="500M") - - def _test_database_tblspace_tmp_maxsize(self): - return self._test_settings_get("DATAFILE_TMP_MAXSIZE", default="500M") - - def _test_database_tblspace_size(self): - return self._test_settings_get("DATAFILE_SIZE", default="50M") - - def _test_database_tblspace_tmp_size(self): - return self._test_settings_get("DATAFILE_TMP_SIZE", default="50M") - - def _test_database_tblspace_extsize(self): - return self._test_settings_get("DATAFILE_EXTSIZE", default="25M") - - def _test_database_tblspace_tmp_extsize(self): - return self._test_settings_get("DATAFILE_TMP_EXTSIZE", default="25M") - - def _test_database_oracle_managed_files(self): - return self._test_settings_get("ORACLE_MANAGED_FILES", default=False) - - def _get_test_db_name(self): - """ - Return the 'production' DB name to get the test DB creation machinery - to work. This isn't a great deal in this case because DB names as - handled by Django don't have real counterparts in Oracle. - """ - return self.connection.settings_dict["NAME"] - - def test_db_signature(self): - settings_dict = self.connection.settings_dict - return ( - settings_dict["HOST"], - settings_dict["PORT"], - settings_dict["ENGINE"], - settings_dict["NAME"], - self._test_database_user(), - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/features.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/features.py deleted file mode 100644 index 7ebe69c..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/features.py +++ /dev/null @@ -1,230 +0,0 @@ -from django.db import DatabaseError, InterfaceError -from django.db.backends.base.features import BaseDatabaseFeatures -from django.db.backends.oracle.oracledb_any import is_oracledb -from django.utils.functional import cached_property - - -class DatabaseFeatures(BaseDatabaseFeatures): - minimum_database_version = (19,) - # Oracle crashes with "ORA-00932: inconsistent datatypes: expected - got - # BLOB" when grouping by LOBs (#24096). - allows_group_by_lob = False - # Although GROUP BY select index is supported by Oracle 23c+, it requires - # GROUP_BY_POSITION_ENABLED to be enabled to avoid backward compatibility - # issues. Introspection of this settings is not straightforward. - allows_group_by_select_index = False - interprets_empty_strings_as_nulls = True - has_select_for_update = True - has_select_for_update_nowait = True - has_select_for_update_skip_locked = True - has_select_for_update_of = True - select_for_update_of_column = True - can_return_columns_from_insert = True - supports_subqueries_in_group_by = False - ignores_unnecessary_order_by_in_subqueries = False - supports_transactions = True - supports_timezones = False - has_native_duration_field = True - can_defer_constraint_checks = True - supports_partially_nullable_unique_constraints = False - supports_deferrable_unique_constraints = True - truncates_names = True - supports_comments = True - supports_tablespaces = True - supports_sequence_reset = False - can_introspect_materialized_views = True - atomic_transactions = False - nulls_order_largest = True - requires_literal_defaults = True - supports_default_keyword_in_bulk_insert = False - closed_cursor_error_class = InterfaceError - # Select for update with limit can be achieved on Oracle, but not with the - # current backend. - supports_select_for_update_with_limit = False - supports_temporal_subtraction = True - # Oracle doesn't ignore quoted identifiers case but the current backend - # does by uppercasing all identifiers. - ignores_table_name_case = True - supports_index_on_text_field = False - create_test_procedure_without_params_sql = """ - CREATE PROCEDURE "TEST_PROCEDURE" AS - V_I INTEGER; - BEGIN - V_I := 1; - END; - """ - create_test_procedure_with_int_param_sql = """ - CREATE PROCEDURE "TEST_PROCEDURE" (P_I INTEGER) AS - V_I INTEGER; - BEGIN - V_I := P_I; - END; - """ - create_test_table_with_composite_primary_key = """ - CREATE TABLE test_table_composite_pk ( - column_1 NUMBER(11) NOT NULL, - column_2 NUMBER(11) NOT NULL, - PRIMARY KEY (column_1, column_2) - ) - """ - supports_callproc_kwargs = True - supports_over_clause = True - supports_frame_range_fixed_distance = True - supports_ignore_conflicts = False - max_query_params = 2**16 - 1 - supports_partial_indexes = False - supports_stored_generated_columns = False - supports_virtual_generated_columns = True - can_rename_index = True - supports_slicing_ordering_in_compound = True - requires_compound_order_by_subquery = True - allows_multiple_constraints_on_same_fields = False - supports_json_field_contains = False - supports_collation_on_textfield = False - supports_tuple_lookups = False - test_now_utc_template = "CURRENT_TIMESTAMP AT TIME ZONE 'UTC'" - django_test_expected_failures = { - # A bug in Django/oracledb with respect to string handling (#23843). - "annotations.tests.NonAggregateAnnotationTestCase.test_custom_functions", - "annotations.tests.NonAggregateAnnotationTestCase." - "test_custom_functions_can_ref_other_functions", - } - insert_test_table_with_defaults = ( - "INSERT INTO {} VALUES (DEFAULT, DEFAULT, DEFAULT)" - ) - - @cached_property - def django_test_skips(self): - skips = { - "Oracle doesn't support SHA224.": { - "db_functions.text.test_sha224.SHA224Tests.test_basic", - "db_functions.text.test_sha224.SHA224Tests.test_transform", - }, - "Oracle doesn't correctly calculate ISO 8601 week numbering before " - "1583 (the Gregorian calendar was introduced in 1582).": { - "db_functions.datetime.test_extract_trunc.DateFunctionTests." - "test_trunc_week_before_1000", - "db_functions.datetime.test_extract_trunc." - "DateFunctionWithTimeZoneTests.test_trunc_week_before_1000", - }, - "Oracle doesn't support bitwise XOR.": { - "expressions.tests.ExpressionOperatorTests.test_lefthand_bitwise_xor", - "expressions.tests.ExpressionOperatorTests." - "test_lefthand_bitwise_xor_null", - "expressions.tests.ExpressionOperatorTests." - "test_lefthand_bitwise_xor_right_null", - }, - "Oracle requires ORDER BY in row_number, ANSI:SQL doesn't.": { - "expressions_window.tests.WindowFunctionTests." - "test_row_number_no_ordering", - "prefetch_related.tests.PrefetchLimitTests.test_empty_order", - }, - "Oracle doesn't support changing collations on indexed columns (#33671).": { - "migrations.test_operations.OperationTests." - "test_alter_field_pk_fk_db_collation", - }, - "Oracle doesn't support comparing NCLOB to NUMBER.": { - "generic_relations_regress.tests.GenericRelationTests." - "test_textlink_filter", - }, - "Oracle doesn't support casting filters to NUMBER.": { - "lookup.tests.LookupQueryingTests.test_aggregate_combined_lookup", - }, - } - if self.connection.oracle_version < (23,): - skips.update( - { - "Raises ORA-00600 on Oracle < 23c: internal error code.": { - "model_fields.test_jsonfield.TestQuerying." - "test_usage_in_subquery", - }, - } - ) - if self.connection.is_pool: - skips.update( - { - "Pooling does not support persistent connections": { - "backends.base.test_base.ConnectionHealthChecksTests." - "test_health_checks_enabled", - "backends.base.test_base.ConnectionHealthChecksTests." - "test_health_checks_enabled_errors_occurred", - "backends.base.test_base.ConnectionHealthChecksTests." - "test_health_checks_disabled", - "backends.base.test_base.ConnectionHealthChecksTests." - "test_set_autocommit_health_checks_enabled", - "servers.tests.LiveServerTestCloseConnectionTest." - "test_closes_connections", - "backends.oracle.tests.TransactionalTests." - "test_password_with_at_sign", - }, - } - ) - if is_oracledb and self.connection.oracledb_version >= (2, 1, 2): - skips.update( - { - "python-oracledb 2.1.2+ no longer hides 'ORA-1403: no data found' " - "exceptions raised in database triggers.": { - "backends.oracle.tests.TransactionalTests." - "test_hidden_no_data_found_exception" - }, - }, - ) - return skips - - @cached_property - def introspected_field_types(self): - return { - **super().introspected_field_types, - "GenericIPAddressField": "CharField", - "PositiveBigIntegerField": "BigIntegerField", - "PositiveIntegerField": "IntegerField", - "PositiveSmallIntegerField": "IntegerField", - "SmallIntegerField": "IntegerField", - "TimeField": "DateTimeField", - } - - @cached_property - def test_collations(self): - return { - "ci": "BINARY_CI", - "cs": "BINARY", - "non_default": "SWEDISH_CI", - "swedish_ci": "SWEDISH_CI", - "virtual": "SWEDISH_CI" if self.supports_collation_on_charfield else None, - } - - @cached_property - def supports_collation_on_charfield(self): - sql = "SELECT CAST('a' AS VARCHAR2(4001))" + self.bare_select_suffix - with self.connection.cursor() as cursor: - try: - cursor.execute(sql) - except DatabaseError as e: - if e.args[0].code == 910: - return False - raise - return True - - @cached_property - def supports_primitives_in_json_field(self): - return self.connection.oracle_version >= (21,) - - @cached_property - def supports_frame_exclusion(self): - return self.connection.oracle_version >= (21,) - - @cached_property - def supports_boolean_expr_in_select_clause(self): - return self.connection.oracle_version >= (23,) - - @cached_property - def supports_comparing_boolean_expr(self): - return self.connection.oracle_version >= (23,) - - @cached_property - def supports_aggregation_over_interval_types(self): - return self.connection.oracle_version >= (23,) - - @cached_property - def bare_select_suffix(self): - return "" if self.connection.oracle_version >= (23,) else " FROM DUAL" diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/functions.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/functions.py deleted file mode 100644 index 936cc9e..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/functions.py +++ /dev/null @@ -1,26 +0,0 @@ -from django.db.models import DecimalField, DurationField, Func - - -class IntervalToSeconds(Func): - function = "" - template = """ - EXTRACT(day from %(expressions)s) * 86400 + - EXTRACT(hour from %(expressions)s) * 3600 + - EXTRACT(minute from %(expressions)s) * 60 + - EXTRACT(second from %(expressions)s) - """ - - def __init__(self, expression, *, output_field=None, **extra): - super().__init__( - expression, output_field=output_field or DecimalField(), **extra - ) - - -class SecondsToInterval(Func): - function = "NUMTODSINTERVAL" - template = "%(function)s(%(expressions)s, 'SECOND')" - - def __init__(self, expression, *, output_field=None, **extra): - super().__init__( - expression, output_field=output_field or DurationField(), **extra - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/introspection.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/introspection.py deleted file mode 100644 index 07c2d9b..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/introspection.py +++ /dev/null @@ -1,414 +0,0 @@ -from collections import namedtuple - -from django.db import models -from django.db.backends.base.introspection import BaseDatabaseIntrospection -from django.db.backends.base.introspection import FieldInfo as BaseFieldInfo -from django.db.backends.base.introspection import TableInfo as BaseTableInfo -from django.db.backends.oracle.oracledb_any import oracledb - -FieldInfo = namedtuple( - "FieldInfo", BaseFieldInfo._fields + ("is_autofield", "is_json", "comment") -) -TableInfo = namedtuple("TableInfo", BaseTableInfo._fields + ("comment",)) - - -class DatabaseIntrospection(BaseDatabaseIntrospection): - cache_bust_counter = 1 - - # Maps type objects to Django Field types. - data_types_reverse = { - oracledb.DB_TYPE_DATE: "DateField", - oracledb.DB_TYPE_BINARY_DOUBLE: "FloatField", - oracledb.DB_TYPE_BLOB: "BinaryField", - oracledb.DB_TYPE_CHAR: "CharField", - oracledb.DB_TYPE_CLOB: "TextField", - oracledb.DB_TYPE_INTERVAL_DS: "DurationField", - oracledb.DB_TYPE_NCHAR: "CharField", - oracledb.DB_TYPE_NCLOB: "TextField", - oracledb.DB_TYPE_NVARCHAR: "CharField", - oracledb.DB_TYPE_NUMBER: "DecimalField", - oracledb.DB_TYPE_TIMESTAMP: "DateTimeField", - oracledb.DB_TYPE_VARCHAR: "CharField", - } - - def get_field_type(self, data_type, description): - if data_type == oracledb.NUMBER: - precision, scale = description[4:6] - if scale == 0: - if precision > 11: - return ( - "BigAutoField" - if description.is_autofield - else "BigIntegerField" - ) - elif 1 < precision < 6 and description.is_autofield: - return "SmallAutoField" - elif precision == 1: - return "BooleanField" - elif description.is_autofield: - return "AutoField" - else: - return "IntegerField" - elif scale == -127: - return "FloatField" - elif data_type == oracledb.NCLOB and description.is_json: - return "JSONField" - - return super().get_field_type(data_type, description) - - def get_table_list(self, cursor): - """Return a list of table and view names in the current database.""" - cursor.execute( - """ - SELECT - user_tables.table_name, - 't', - user_tab_comments.comments - FROM user_tables - LEFT OUTER JOIN - user_tab_comments - ON user_tab_comments.table_name = user_tables.table_name - WHERE - NOT EXISTS ( - SELECT 1 - FROM user_mviews - WHERE user_mviews.mview_name = user_tables.table_name - ) - UNION ALL - SELECT view_name, 'v', NULL FROM user_views - UNION ALL - SELECT mview_name, 'v', NULL FROM user_mviews - """ - ) - return [ - TableInfo(self.identifier_converter(row[0]), row[1], row[2]) - for row in cursor.fetchall() - ] - - def get_table_description(self, cursor, table_name): - """ - Return a description of the table with the DB-API cursor.description - interface. - """ - # A default collation for the given table/view/materialized view. - cursor.execute( - """ - SELECT user_tables.default_collation - FROM user_tables - WHERE - user_tables.table_name = UPPER(%s) AND - NOT EXISTS ( - SELECT 1 - FROM user_mviews - WHERE user_mviews.mview_name = user_tables.table_name - ) - UNION ALL - SELECT user_views.default_collation - FROM user_views - WHERE user_views.view_name = UPPER(%s) - UNION ALL - SELECT user_mviews.default_collation - FROM user_mviews - WHERE user_mviews.mview_name = UPPER(%s) - """, - [table_name, table_name, table_name], - ) - row = cursor.fetchone() - default_table_collation = row[0] if row else "" - # user_tab_columns gives data default for columns - cursor.execute( - """ - SELECT - user_tab_cols.column_name, - user_tab_cols.data_default, - CASE - WHEN user_tab_cols.collation = %s - THEN NULL - ELSE user_tab_cols.collation - END collation, - CASE - WHEN user_tab_cols.char_used IS NULL - THEN user_tab_cols.data_length - ELSE user_tab_cols.char_length - END as display_size, - CASE - WHEN user_tab_cols.identity_column = 'YES' THEN 1 - ELSE 0 - END as is_autofield, - CASE - WHEN EXISTS ( - SELECT 1 - FROM user_json_columns - WHERE - user_json_columns.table_name = user_tab_cols.table_name AND - user_json_columns.column_name = user_tab_cols.column_name - ) - THEN 1 - ELSE 0 - END as is_json, - user_col_comments.comments as col_comment - FROM user_tab_cols - LEFT OUTER JOIN - user_col_comments ON - user_col_comments.column_name = user_tab_cols.column_name AND - user_col_comments.table_name = user_tab_cols.table_name - WHERE user_tab_cols.table_name = UPPER(%s) - """, - [default_table_collation, table_name], - ) - field_map = { - column: ( - display_size, - default.rstrip() if default and default != "NULL" else None, - collation, - is_autofield, - is_json, - comment, - ) - for ( - column, - default, - collation, - display_size, - is_autofield, - is_json, - comment, - ) in cursor.fetchall() - } - self.cache_bust_counter += 1 - cursor.execute( - "SELECT * FROM {} WHERE ROWNUM < 2 AND {} > 0".format( - self.connection.ops.quote_name(table_name), self.cache_bust_counter - ) - ) - description = [] - for desc in cursor.description: - name = desc[0] - ( - display_size, - default, - collation, - is_autofield, - is_json, - comment, - ) = field_map[name] - name %= {} # oracledb, for some reason, doubles percent signs. - description.append( - FieldInfo( - self.identifier_converter(name), - desc[1], - display_size, - desc[3], - desc[4] or 0, - desc[5] or 0, - *desc[6:], - default, - collation, - is_autofield, - is_json, - comment, - ) - ) - return description - - def identifier_converter(self, name): - """Identifier comparison is case insensitive under Oracle.""" - return name.lower() - - def get_sequences(self, cursor, table_name, table_fields=()): - cursor.execute( - """ - SELECT - user_tab_identity_cols.sequence_name, - user_tab_identity_cols.column_name - FROM - user_tab_identity_cols, - user_constraints, - user_cons_columns cols - WHERE - user_constraints.constraint_name = cols.constraint_name - AND user_constraints.table_name = user_tab_identity_cols.table_name - AND cols.column_name = user_tab_identity_cols.column_name - AND user_constraints.constraint_type = 'P' - AND user_tab_identity_cols.table_name = UPPER(%s) - """, - [table_name], - ) - # Oracle allows only one identity column per table. - row = cursor.fetchone() - if row: - return [ - { - "name": self.identifier_converter(row[0]), - "table": self.identifier_converter(table_name), - "column": self.identifier_converter(row[1]), - } - ] - # To keep backward compatibility for AutoFields that aren't Oracle - # identity columns. - for f in table_fields: - if isinstance(f, models.AutoField): - return [{"table": table_name, "column": f.column}] - return [] - - def get_relations(self, cursor, table_name): - """ - Return a dictionary of {field_name: (field_name_other_table, other_table)} - representing all foreign keys in the given table. - """ - table_name = table_name.upper() - cursor.execute( - """ - SELECT ca.column_name, cb.table_name, cb.column_name - FROM user_constraints, USER_CONS_COLUMNS ca, USER_CONS_COLUMNS cb - WHERE user_constraints.table_name = %s AND - user_constraints.constraint_name = ca.constraint_name AND - user_constraints.r_constraint_name = cb.constraint_name AND - ca.position = cb.position""", - [table_name], - ) - - return { - self.identifier_converter(field_name): ( - self.identifier_converter(rel_field_name), - self.identifier_converter(rel_table_name), - ) - for field_name, rel_table_name, rel_field_name in cursor.fetchall() - } - - def get_primary_key_columns(self, cursor, table_name): - cursor.execute( - """ - SELECT - cols.column_name - FROM - user_constraints, - user_cons_columns cols - WHERE - user_constraints.constraint_name = cols.constraint_name AND - user_constraints.constraint_type = 'P' AND - user_constraints.table_name = UPPER(%s) - ORDER BY - cols.position - """, - [table_name], - ) - return [self.identifier_converter(row[0]) for row in cursor.fetchall()] - - def get_constraints(self, cursor, table_name): - """ - Retrieve any constraints or keys (unique, pk, fk, check, index) across - one or more columns. - """ - constraints = {} - # Loop over the constraints, getting PKs, uniques, and checks - cursor.execute( - """ - SELECT - user_constraints.constraint_name, - LISTAGG(LOWER(cols.column_name), ',') - WITHIN GROUP (ORDER BY cols.position), - CASE user_constraints.constraint_type - WHEN 'P' THEN 1 - ELSE 0 - END AS is_primary_key, - CASE - WHEN user_constraints.constraint_type IN ('P', 'U') THEN 1 - ELSE 0 - END AS is_unique, - CASE user_constraints.constraint_type - WHEN 'C' THEN 1 - ELSE 0 - END AS is_check_constraint - FROM - user_constraints - LEFT OUTER JOIN - user_cons_columns cols - ON user_constraints.constraint_name = cols.constraint_name - WHERE - user_constraints.constraint_type = ANY('P', 'U', 'C') - AND user_constraints.table_name = UPPER(%s) - GROUP BY user_constraints.constraint_name, user_constraints.constraint_type - """, - [table_name], - ) - for constraint, columns, pk, unique, check in cursor.fetchall(): - constraint = self.identifier_converter(constraint) - constraints[constraint] = { - "columns": columns.split(","), - "primary_key": pk, - "unique": unique, - "foreign_key": None, - "check": check, - "index": unique, # All uniques come with an index - } - # Foreign key constraints - cursor.execute( - """ - SELECT - cons.constraint_name, - LISTAGG(LOWER(cols.column_name), ',') - WITHIN GROUP (ORDER BY cols.position), - LOWER(rcols.table_name), - LOWER(rcols.column_name) - FROM - user_constraints cons - INNER JOIN - user_cons_columns rcols - ON rcols.constraint_name = cons.r_constraint_name AND rcols.position = 1 - LEFT OUTER JOIN - user_cons_columns cols - ON cons.constraint_name = cols.constraint_name - WHERE - cons.constraint_type = 'R' AND - cons.table_name = UPPER(%s) - GROUP BY cons.constraint_name, rcols.table_name, rcols.column_name - """, - [table_name], - ) - for constraint, columns, other_table, other_column in cursor.fetchall(): - constraint = self.identifier_converter(constraint) - constraints[constraint] = { - "primary_key": False, - "unique": False, - "foreign_key": (other_table, other_column), - "check": False, - "index": False, - "columns": columns.split(","), - } - # Now get indexes - cursor.execute( - """ - SELECT - ind.index_name, - LOWER(ind.index_type), - LOWER(ind.uniqueness), - LISTAGG(LOWER(cols.column_name), ',') - WITHIN GROUP (ORDER BY cols.column_position), - LISTAGG(cols.descend, ',') WITHIN GROUP (ORDER BY cols.column_position) - FROM - user_ind_columns cols, user_indexes ind - WHERE - cols.table_name = UPPER(%s) AND - NOT EXISTS ( - SELECT 1 - FROM user_constraints cons - WHERE ind.index_name = cons.index_name - ) AND cols.index_name = ind.index_name - GROUP BY ind.index_name, ind.index_type, ind.uniqueness - """, - [table_name], - ) - for constraint, type_, unique, columns, orders in cursor.fetchall(): - constraint = self.identifier_converter(constraint) - constraints[constraint] = { - "primary_key": False, - "unique": unique == "unique", - "foreign_key": None, - "check": False, - "index": True, - "type": "idx" if type_ == "normal" else type_, - "columns": columns.split(","), - "orders": orders.split(","), - } - return constraints diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/operations.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/operations.py deleted file mode 100644 index 59eecdb..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/operations.py +++ /dev/null @@ -1,741 +0,0 @@ -import datetime -import uuid -from functools import lru_cache -from itertools import chain - -from django.conf import settings -from django.db import DatabaseError, NotSupportedError -from django.db.backends.base.operations import BaseDatabaseOperations -from django.db.backends.utils import split_tzname_delta, strip_quotes, truncate_name -from django.db.models import ( - AutoField, - CompositePrimaryKey, - Exists, - ExpressionWrapper, - Lookup, -) -from django.db.models.expressions import RawSQL -from django.db.models.sql.where import WhereNode -from django.utils import timezone -from django.utils.encoding import force_bytes, force_str -from django.utils.functional import cached_property -from django.utils.regex_helper import _lazy_re_compile - -from .base import Database -from .utils import BulkInsertMapper, InsertVar, Oracle_datetime - - -class DatabaseOperations(BaseDatabaseOperations): - # Oracle uses NUMBER(5), NUMBER(11), and NUMBER(19) for integer fields. - # SmallIntegerField uses NUMBER(11) instead of NUMBER(5), which is used by - # SmallAutoField, to preserve backward compatibility. - integer_field_ranges = { - "SmallIntegerField": (-99999999999, 99999999999), - "IntegerField": (-99999999999, 99999999999), - "BigIntegerField": (-9999999999999999999, 9999999999999999999), - "PositiveBigIntegerField": (0, 9999999999999999999), - "PositiveSmallIntegerField": (0, 99999999999), - "PositiveIntegerField": (0, 99999999999), - "SmallAutoField": (-99999, 99999), - "AutoField": (-99999999999, 99999999999), - "BigAutoField": (-9999999999999999999, 9999999999999999999), - } - set_operators = {**BaseDatabaseOperations.set_operators, "difference": "MINUS"} - - # TODO: colorize this SQL code with style.SQL_KEYWORD(), etc. - _sequence_reset_sql = """ -DECLARE - table_value integer; - seq_value integer; - seq_name user_tab_identity_cols.sequence_name%%TYPE; -BEGIN - BEGIN - SELECT sequence_name INTO seq_name FROM user_tab_identity_cols - WHERE table_name = '%(table_name)s' AND - column_name = '%(column_name)s'; - EXCEPTION WHEN NO_DATA_FOUND THEN - seq_name := '%(no_autofield_sequence_name)s'; - END; - - SELECT NVL(MAX(%(column)s), 0) INTO table_value FROM %(table)s; - SELECT NVL(last_number - cache_size, 0) INTO seq_value FROM user_sequences - WHERE sequence_name = seq_name; - WHILE table_value > seq_value LOOP - EXECUTE IMMEDIATE 'SELECT "'||seq_name||'".nextval%(suffix)s' - INTO seq_value; - END LOOP; -END; -/""" - - # Oracle doesn't support string without precision; use the max string size. - cast_char_field_without_max_length = "NVARCHAR2(2000)" - cast_data_types = { - "AutoField": "NUMBER(11)", - "BigAutoField": "NUMBER(19)", - "SmallAutoField": "NUMBER(5)", - "TextField": cast_char_field_without_max_length, - } - - def cache_key_culling_sql(self): - cache_key = self.quote_name("cache_key") - return ( - f"SELECT {cache_key} " - f"FROM %s " - f"ORDER BY {cache_key} OFFSET %%s ROWS FETCH FIRST 1 ROWS ONLY" - ) - - # EXTRACT format cannot be passed in parameters. - _extract_format_re = _lazy_re_compile(r"[A-Z_]+") - - def date_extract_sql(self, lookup_type, sql, params): - extract_sql = f"TO_CHAR({sql}, %s)" - extract_param = None - if lookup_type == "week_day": - # TO_CHAR(field, 'D') returns an integer from 1-7, where 1=Sunday. - extract_param = "D" - elif lookup_type == "iso_week_day": - extract_sql = f"TO_CHAR({sql} - 1, %s)" - extract_param = "D" - elif lookup_type == "week": - # IW = ISO week number - extract_param = "IW" - elif lookup_type == "quarter": - extract_param = "Q" - elif lookup_type == "iso_year": - extract_param = "IYYY" - else: - lookup_type = lookup_type.upper() - if not self._extract_format_re.fullmatch(lookup_type): - raise ValueError(f"Invalid loookup type: {lookup_type!r}") - # https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/EXTRACT-datetime.html - return f"EXTRACT({lookup_type} FROM {sql})", params - return extract_sql, (*params, extract_param) - - def date_trunc_sql(self, lookup_type, sql, params, tzname=None): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - # https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/ROUND-and-TRUNC-Date-Functions.html - trunc_param = None - if lookup_type in ("year", "month"): - trunc_param = lookup_type.upper() - elif lookup_type == "quarter": - trunc_param = "Q" - elif lookup_type == "week": - trunc_param = "IW" - else: - return f"TRUNC({sql})", params - return f"TRUNC({sql}, %s)", (*params, trunc_param) - - # Oracle crashes with "ORA-03113: end-of-file on communication channel" - # if the time zone name is passed in parameter. Use interpolation instead. - # https://groups.google.com/forum/#!msg/django-developers/zwQju7hbG78/9l934yelwfsJ - # This regexp matches all time zone names from the zoneinfo database. - _tzname_re = _lazy_re_compile(r"^[\w/:+-]+$") - - def _prepare_tzname_delta(self, tzname): - tzname, sign, offset = split_tzname_delta(tzname) - return f"{sign}{offset}" if offset else tzname - - def _convert_sql_to_tz(self, sql, params, tzname): - if not (settings.USE_TZ and tzname): - return sql, params - if not self._tzname_re.match(tzname): - raise ValueError("Invalid time zone name: %s" % tzname) - # Convert from connection timezone to the local time, returning - # TIMESTAMP WITH TIME ZONE and cast it back to TIMESTAMP to strip the - # TIME ZONE details. - if self.connection.timezone_name != tzname: - from_timezone_name = self.connection.timezone_name - to_timezone_name = self._prepare_tzname_delta(tzname) - return ( - f"CAST((FROM_TZ({sql}, '{from_timezone_name}') AT TIME ZONE " - f"'{to_timezone_name}') AS TIMESTAMP)", - params, - ) - return sql, params - - def datetime_cast_date_sql(self, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - return f"TRUNC({sql})", params - - def datetime_cast_time_sql(self, sql, params, tzname): - # Since `TimeField` values are stored as TIMESTAMP change to the - # default date and convert the field to the specified timezone. - sql, params = self._convert_sql_to_tz(sql, params, tzname) - convert_datetime_sql = ( - f"TO_TIMESTAMP(CONCAT('1900-01-01 ', TO_CHAR({sql}, 'HH24:MI:SS.FF')), " - f"'YYYY-MM-DD HH24:MI:SS.FF')" - ) - return ( - f"CASE WHEN {sql} IS NOT NULL THEN {convert_datetime_sql} ELSE NULL END", - (*params, *params), - ) - - def datetime_extract_sql(self, lookup_type, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - if lookup_type == "second": - # Truncate fractional seconds. - return f"FLOOR(EXTRACT(SECOND FROM {sql}))", params - return self.date_extract_sql(lookup_type, sql, params) - - def datetime_trunc_sql(self, lookup_type, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - # https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/ROUND-and-TRUNC-Date-Functions.html - trunc_param = None - if lookup_type in ("year", "month"): - trunc_param = lookup_type.upper() - elif lookup_type == "quarter": - trunc_param = "Q" - elif lookup_type == "week": - trunc_param = "IW" - elif lookup_type == "hour": - trunc_param = "HH24" - elif lookup_type == "minute": - trunc_param = "MI" - elif lookup_type == "day": - return f"TRUNC({sql})", params - else: - # Cast to DATE removes sub-second precision. - return f"CAST({sql} AS DATE)", params - return f"TRUNC({sql}, %s)", (*params, trunc_param) - - def time_extract_sql(self, lookup_type, sql, params): - if lookup_type == "second": - # Truncate fractional seconds. - return f"FLOOR(EXTRACT(SECOND FROM {sql}))", params - return self.date_extract_sql(lookup_type, sql, params) - - def time_trunc_sql(self, lookup_type, sql, params, tzname=None): - # The implementation is similar to `datetime_trunc_sql` as both - # `DateTimeField` and `TimeField` are stored as TIMESTAMP where - # the date part of the later is ignored. - sql, params = self._convert_sql_to_tz(sql, params, tzname) - trunc_param = None - if lookup_type == "hour": - trunc_param = "HH24" - elif lookup_type == "minute": - trunc_param = "MI" - elif lookup_type == "second": - # Cast to DATE removes sub-second precision. - return f"CAST({sql} AS DATE)", params - return f"TRUNC({sql}, %s)", (*params, trunc_param) - - def get_db_converters(self, expression): - converters = super().get_db_converters(expression) - internal_type = expression.output_field.get_internal_type() - if internal_type in ["JSONField", "TextField"]: - converters.append(self.convert_textfield_value) - elif internal_type == "BinaryField": - converters.append(self.convert_binaryfield_value) - elif internal_type == "BooleanField": - converters.append(self.convert_booleanfield_value) - elif internal_type == "DateTimeField": - if settings.USE_TZ: - converters.append(self.convert_datetimefield_value) - elif internal_type == "DateField": - converters.append(self.convert_datefield_value) - elif internal_type == "TimeField": - converters.append(self.convert_timefield_value) - elif internal_type == "UUIDField": - converters.append(self.convert_uuidfield_value) - # Oracle stores empty strings as null. If the field accepts the empty - # string, undo this to adhere to the Django convention of using - # the empty string instead of null. - if expression.output_field.empty_strings_allowed: - converters.append( - self.convert_empty_bytes - if internal_type == "BinaryField" - else self.convert_empty_string - ) - return converters - - def convert_textfield_value(self, value, expression, connection): - if isinstance(value, Database.LOB): - value = value.read() - return value - - def convert_binaryfield_value(self, value, expression, connection): - if isinstance(value, Database.LOB): - value = force_bytes(value.read()) - return value - - def convert_booleanfield_value(self, value, expression, connection): - if value in (0, 1): - value = bool(value) - return value - - # oracledb always returns datetime.datetime objects for - # DATE and TIMESTAMP columns, but Django wants to see a - # python datetime.date, .time, or .datetime. - - def convert_datetimefield_value(self, value, expression, connection): - if value is not None: - value = timezone.make_aware(value, self.connection.timezone) - return value - - def convert_datefield_value(self, value, expression, connection): - if isinstance(value, Database.Timestamp): - value = value.date() - return value - - def convert_timefield_value(self, value, expression, connection): - if isinstance(value, Database.Timestamp): - value = value.time() - return value - - def convert_uuidfield_value(self, value, expression, connection): - if value is not None: - value = uuid.UUID(value) - return value - - @staticmethod - def convert_empty_string(value, expression, connection): - return "" if value is None else value - - @staticmethod - def convert_empty_bytes(value, expression, connection): - return b"" if value is None else value - - def deferrable_sql(self): - return " DEFERRABLE INITIALLY DEFERRED" - - def fetch_returned_insert_columns(self, cursor, returning_params): - columns = [] - for param in returning_params: - value = param.get_value() - # Can be removed when cx_Oracle is no longer supported and - # python-oracle 2.1.2 becomes the minimum supported version. - if value == []: - raise DatabaseError( - "The database did not return a new row id. Probably " - '"ORA-1403: no data found" was raised internally but was ' - "hidden by the Oracle OCI library (see " - "https://code.djangoproject.com/ticket/28859)." - ) - columns.append(value[0]) - return tuple(columns) - - def no_limit_value(self): - return None - - def limit_offset_sql(self, low_mark, high_mark): - fetch, offset = self._get_limit_offset_params(low_mark, high_mark) - return " ".join( - sql - for sql in ( - ("OFFSET %d ROWS" % offset) if offset else None, - ("FETCH FIRST %d ROWS ONLY" % fetch) if fetch else None, - ) - if sql - ) - - def last_executed_query(self, cursor, sql, params): - # https://python-oracledb.readthedocs.io/en/latest/api_manual/cursor.html#Cursor.statement - # The DB API definition does not define this attribute. - statement = cursor.statement - # Unlike Psycopg's `query` and MySQLdb`'s `_executed`, oracledb's - # `statement` doesn't contain the query parameters. Substitute - # parameters manually. - if statement and params: - if isinstance(params, (tuple, list)): - params = { - f":arg{i}": param for i, param in enumerate(dict.fromkeys(params)) - } - elif isinstance(params, dict): - params = {f":{key}": val for (key, val) in params.items()} - for key in sorted(params, key=len, reverse=True): - statement = statement.replace( - key, force_str(params[key], errors="replace") - ) - return statement - - def last_insert_id(self, cursor, table_name, pk_name): - sq_name = self._get_sequence_name(cursor, strip_quotes(table_name), pk_name) - cursor.execute('"%s".currval' % sq_name) - return cursor.fetchone()[0] - - def lookup_cast(self, lookup_type, internal_type=None): - if lookup_type in ("iexact", "icontains", "istartswith", "iendswith"): - return "UPPER(%s)" - if lookup_type != "isnull" and internal_type in ( - "BinaryField", - "TextField", - ): - return "DBMS_LOB.SUBSTR(%s)" - return "%s" - - def max_in_list_size(self): - return 1000 - - def max_name_length(self): - return 30 - - def pk_default_value(self): - return "NULL" - - def prep_for_iexact_query(self, x): - return x - - def process_clob(self, value): - if value is None: - return "" - return value.read() - - def quote_name(self, name): - # SQL92 requires delimited (quoted) names to be case-sensitive. When - # not quoted, Oracle has case-insensitive behavior for identifiers, but - # always defaults to uppercase. - # We simplify things by making Oracle identifiers always uppercase. - if not name.startswith('"') and not name.endswith('"'): - name = '"%s"' % truncate_name(name, self.max_name_length()) - # Oracle puts the query text into a (query % args) construct, so % signs - # in names need to be escaped. The '%%' will be collapsed back to '%' at - # that stage so we aren't really making the name longer here. - name = name.replace("%", "%%") - return name.upper() - - def regex_lookup(self, lookup_type): - if lookup_type == "regex": - match_option = "'c'" - else: - match_option = "'i'" - return "REGEXP_LIKE(%%s, %%s, %s)" % match_option - - def return_insert_columns(self, fields): - if not fields: - return "", () - field_names = [] - params = [] - for field in fields: - field_names.append( - "%s.%s" - % ( - self.quote_name(field.model._meta.db_table), - self.quote_name(field.column), - ) - ) - params.append(InsertVar(field)) - return "RETURNING %s INTO %s" % ( - ", ".join(field_names), - ", ".join(["%s"] * len(params)), - ), tuple(params) - - def __foreign_key_constraints(self, table_name, recursive): - with self.connection.cursor() as cursor: - if recursive: - cursor.execute( - """ - SELECT - user_tables.table_name, rcons.constraint_name - FROM - user_tables - JOIN - user_constraints cons - ON (user_tables.table_name = cons.table_name - AND cons.constraint_type = ANY('P', 'U')) - LEFT JOIN - user_constraints rcons - ON (user_tables.table_name = rcons.table_name - AND rcons.constraint_type = 'R') - START WITH user_tables.table_name = UPPER(%s) - CONNECT BY - NOCYCLE PRIOR cons.constraint_name = rcons.r_constraint_name - GROUP BY - user_tables.table_name, rcons.constraint_name - HAVING user_tables.table_name != UPPER(%s) - ORDER BY MAX(level) DESC - """, - (table_name, table_name), - ) - else: - cursor.execute( - """ - SELECT - cons.table_name, cons.constraint_name - FROM - user_constraints cons - WHERE - cons.constraint_type = 'R' - AND cons.table_name = UPPER(%s) - """, - (table_name,), - ) - return cursor.fetchall() - - @cached_property - def _foreign_key_constraints(self): - # 512 is large enough to fit the ~330 tables (as of this writing) in - # Django's test suite. - return lru_cache(maxsize=512)(self.__foreign_key_constraints) - - def sql_flush(self, style, tables, *, reset_sequences=False, allow_cascade=False): - if not tables: - return [] - - truncated_tables = {table.upper() for table in tables} - constraints = set() - # Oracle's TRUNCATE CASCADE only works with ON DELETE CASCADE foreign - # keys which Django doesn't define. Emulate the PostgreSQL behavior - # which truncates all dependent tables by manually retrieving all - # foreign key constraints and resolving dependencies. - for table in tables: - for foreign_table, constraint in self._foreign_key_constraints( - table, recursive=allow_cascade - ): - if allow_cascade: - truncated_tables.add(foreign_table) - constraints.add((foreign_table, constraint)) - sql = ( - [ - "%s %s %s %s %s %s %s %s;" - % ( - style.SQL_KEYWORD("ALTER"), - style.SQL_KEYWORD("TABLE"), - style.SQL_FIELD(self.quote_name(table)), - style.SQL_KEYWORD("DISABLE"), - style.SQL_KEYWORD("CONSTRAINT"), - style.SQL_FIELD(self.quote_name(constraint)), - style.SQL_KEYWORD("KEEP"), - style.SQL_KEYWORD("INDEX"), - ) - for table, constraint in constraints - ] - + [ - "%s %s %s;" - % ( - style.SQL_KEYWORD("TRUNCATE"), - style.SQL_KEYWORD("TABLE"), - style.SQL_FIELD(self.quote_name(table)), - ) - for table in truncated_tables - ] - + [ - "%s %s %s %s %s %s;" - % ( - style.SQL_KEYWORD("ALTER"), - style.SQL_KEYWORD("TABLE"), - style.SQL_FIELD(self.quote_name(table)), - style.SQL_KEYWORD("ENABLE"), - style.SQL_KEYWORD("CONSTRAINT"), - style.SQL_FIELD(self.quote_name(constraint)), - ) - for table, constraint in constraints - ] - ) - if reset_sequences: - sequences = [ - sequence - for sequence in self.connection.introspection.sequence_list() - if sequence["table"].upper() in truncated_tables - ] - # Since we've just deleted all the rows, running our sequence ALTER - # code will reset the sequence to 0. - sql.extend(self.sequence_reset_by_name_sql(style, sequences)) - return sql - - def sequence_reset_by_name_sql(self, style, sequences): - sql = [] - for sequence_info in sequences: - no_autofield_sequence_name = self._get_no_autofield_sequence_name( - sequence_info["table"] - ) - table = self.quote_name(sequence_info["table"]) - column = self.quote_name(sequence_info["column"] or "id") - query = self._sequence_reset_sql % { - "no_autofield_sequence_name": no_autofield_sequence_name, - "table": table, - "column": column, - "table_name": strip_quotes(table), - "column_name": strip_quotes(column), - "suffix": self.connection.features.bare_select_suffix, - } - sql.append(query) - return sql - - def sequence_reset_sql(self, style, model_list): - output = [] - query = self._sequence_reset_sql - for model in model_list: - for f in model._meta.local_fields: - if isinstance(f, AutoField): - no_autofield_sequence_name = self._get_no_autofield_sequence_name( - model._meta.db_table - ) - table = self.quote_name(model._meta.db_table) - column = self.quote_name(f.column) - output.append( - query - % { - "no_autofield_sequence_name": no_autofield_sequence_name, - "table": table, - "column": column, - "table_name": strip_quotes(table), - "column_name": strip_quotes(column), - "suffix": self.connection.features.bare_select_suffix, - } - ) - # Only one AutoField is allowed per model, so don't - # continue to loop - break - return output - - def start_transaction_sql(self): - return "" - - def tablespace_sql(self, tablespace, inline=False): - if inline: - return "USING INDEX TABLESPACE %s" % self.quote_name(tablespace) - else: - return "TABLESPACE %s" % self.quote_name(tablespace) - - def adapt_datefield_value(self, value): - """ - Transform a date value to an object compatible with what is expected - by the backend driver for date columns. - The default implementation transforms the date to text, but that is not - necessary for Oracle. - """ - return value - - def adapt_datetimefield_value(self, value): - """ - Transform a datetime value to an object compatible with what is expected - by the backend driver for datetime columns. - - If naive datetime is passed assumes that is in UTC. Normally Django - models.DateTimeField makes sure that if USE_TZ is True passed datetime - is timezone aware. - """ - - if value is None: - return None - - # oracledb doesn't support tz-aware datetimes - if timezone.is_aware(value): - if settings.USE_TZ: - value = timezone.make_naive(value, self.connection.timezone) - else: - raise ValueError( - "Oracle backend does not support timezone-aware datetimes when " - "USE_TZ is False." - ) - - return Oracle_datetime.from_datetime(value) - - def adapt_timefield_value(self, value): - if value is None: - return None - - if isinstance(value, str): - return datetime.datetime.strptime(value, "%H:%M:%S") - - # Oracle doesn't support tz-aware times - if timezone.is_aware(value): - raise ValueError("Oracle backend does not support timezone-aware times.") - - return Oracle_datetime( - 1900, 1, 1, value.hour, value.minute, value.second, value.microsecond - ) - - def combine_expression(self, connector, sub_expressions): - lhs, rhs = sub_expressions - if connector == "%%": - return "MOD(%s)" % ",".join(sub_expressions) - elif connector == "&": - return "BITAND(%s)" % ",".join(sub_expressions) - elif connector == "|": - return "BITAND(-%(lhs)s-1,%(rhs)s)+%(lhs)s" % {"lhs": lhs, "rhs": rhs} - elif connector == "<<": - return "(%(lhs)s * POWER(2, %(rhs)s))" % {"lhs": lhs, "rhs": rhs} - elif connector == ">>": - return "FLOOR(%(lhs)s / POWER(2, %(rhs)s))" % {"lhs": lhs, "rhs": rhs} - elif connector == "^": - return "POWER(%s)" % ",".join(sub_expressions) - elif connector == "#": - raise NotSupportedError("Bitwise XOR is not supported in Oracle.") - return super().combine_expression(connector, sub_expressions) - - def _get_no_autofield_sequence_name(self, table): - """ - Manually created sequence name to keep backward compatibility for - AutoFields that aren't Oracle identity columns. - """ - name_length = self.max_name_length() - 3 - return "%s_SQ" % truncate_name(strip_quotes(table), name_length).upper() - - def _get_sequence_name(self, cursor, table, pk_name): - cursor.execute( - """ - SELECT sequence_name - FROM user_tab_identity_cols - WHERE table_name = UPPER(%s) - AND column_name = UPPER(%s)""", - [table, pk_name], - ) - row = cursor.fetchone() - return self._get_no_autofield_sequence_name(table) if row is None else row[0] - - def bulk_insert_sql(self, fields, placeholder_rows): - field_placeholders = [ - BulkInsertMapper.types.get( - getattr(field, "target_field", field).get_internal_type(), "%s" - ) - for field in fields - if field - ] - query = [] - for row in placeholder_rows: - select = [] - for i, placeholder in enumerate(row): - # A model without any fields has fields=[None]. - if fields[i]: - placeholder = field_placeholders[i] % placeholder - # Add columns aliases to the first select to avoid "ORA-00918: - # column ambiguously defined" when two or more columns in the - # first select have the same value. - if not query: - placeholder = "%s col_%s" % (placeholder, i) - select.append(placeholder) - suffix = self.connection.features.bare_select_suffix - query.append(f"SELECT %s{suffix}" % ", ".join(select)) - # Bulk insert to tables with Oracle identity columns causes Oracle to - # add sequence.nextval to it. Sequence.nextval cannot be used with the - # UNION operator. To prevent incorrect SQL, move UNION to a subquery. - return "SELECT * FROM (%s)" % " UNION ALL ".join(query) - - def subtract_temporals(self, internal_type, lhs, rhs): - if internal_type == "DateField": - lhs_sql, lhs_params = lhs - rhs_sql, rhs_params = rhs - params = (*lhs_params, *rhs_params) - return ( - "NUMTODSINTERVAL(TO_NUMBER(%s - %s), 'DAY')" % (lhs_sql, rhs_sql), - params, - ) - return super().subtract_temporals(internal_type, lhs, rhs) - - def bulk_batch_size(self, fields, objs): - """Oracle restricts the number of parameters in a query.""" - fields = list( - chain.from_iterable( - field.fields if isinstance(field, CompositePrimaryKey) else [field] - for field in fields - ) - ) - if fields: - return self.connection.features.max_query_params // len(fields) - return len(objs) - - def conditional_expression_supported_in_where_clause(self, expression): - """ - Oracle supports only EXISTS(...) or filters in the WHERE clause, others - must be compared with True. - """ - if isinstance(expression, (Exists, Lookup, WhereNode)): - return True - if isinstance(expression, ExpressionWrapper) and expression.conditional: - return self.conditional_expression_supported_in_where_clause( - expression.expression - ) - if isinstance(expression, RawSQL) and expression.conditional: - return True - return False diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/oracledb_any.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/oracledb_any.py deleted file mode 100644 index 22a9b78..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/oracledb_any.py +++ /dev/null @@ -1,20 +0,0 @@ -import warnings - -from django.utils.deprecation import RemovedInDjango60Warning - -try: - import oracledb - - is_oracledb = True -except ImportError as e: - try: - import cx_Oracle as oracledb # NOQA - - warnings.warn( - "cx_Oracle is deprecated. Use oracledb instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - is_oracledb = False - except ImportError: - raise e from None diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/schema.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/schema.py deleted file mode 100644 index ba3c477..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/schema.py +++ /dev/null @@ -1,252 +0,0 @@ -import copy -import datetime -import re - -from django.db import DatabaseError -from django.db.backends.base.schema import ( - BaseDatabaseSchemaEditor, - _related_non_m2m_objects, -) -from django.utils.duration import duration_iso_string - - -class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): - sql_create_column = "ALTER TABLE %(table)s ADD %(column)s %(definition)s" - sql_alter_column_type = "MODIFY %(column)s %(type)s%(collation)s" - sql_alter_column_null = "MODIFY %(column)s NULL" - sql_alter_column_not_null = "MODIFY %(column)s NOT NULL" - sql_alter_column_default = "MODIFY %(column)s DEFAULT %(default)s" - sql_alter_column_no_default = "MODIFY %(column)s DEFAULT NULL" - sql_alter_column_no_default_null = sql_alter_column_no_default - - sql_delete_column = "ALTER TABLE %(table)s DROP COLUMN %(column)s" - sql_create_column_inline_fk = ( - "CONSTRAINT %(name)s REFERENCES %(to_table)s(%(to_column)s)%(deferrable)s" - ) - sql_delete_table = "DROP TABLE %(table)s CASCADE CONSTRAINTS" - sql_create_index = "CREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)s" - - def quote_value(self, value): - if isinstance(value, (datetime.date, datetime.time, datetime.datetime)): - return "'%s'" % value - elif isinstance(value, datetime.timedelta): - return "'%s'" % duration_iso_string(value) - elif isinstance(value, str): - return "'%s'" % value.replace("'", "''") - elif isinstance(value, (bytes, bytearray, memoryview)): - return "'%s'" % value.hex() - elif isinstance(value, bool): - return "1" if value else "0" - else: - return str(value) - - def remove_field(self, model, field): - # If the column is an identity column, drop the identity before - # removing the field. - if self._is_identity_column(model._meta.db_table, field.column): - self._drop_identity(model._meta.db_table, field.column) - super().remove_field(model, field) - - def delete_model(self, model): - # Run superclass action - super().delete_model(model) - # Clean up manually created sequence. - self.execute( - """ - DECLARE - i INTEGER; - BEGIN - SELECT COUNT(1) INTO i FROM USER_SEQUENCES - WHERE SEQUENCE_NAME = '%(sq_name)s'; - IF i = 1 THEN - EXECUTE IMMEDIATE 'DROP SEQUENCE "%(sq_name)s"'; - END IF; - END; - /""" - % { - "sq_name": self.connection.ops._get_no_autofield_sequence_name( - model._meta.db_table - ) - } - ) - - def alter_field(self, model, old_field, new_field, strict=False): - try: - super().alter_field(model, old_field, new_field, strict) - except DatabaseError as e: - description = str(e) - # If we're changing type to an unsupported type we need a - # SQLite-ish workaround - if "ORA-22858" in description or "ORA-22859" in description: - self._alter_field_type_workaround(model, old_field, new_field) - # If an identity column is changing to a non-numeric type, drop the - # identity first. - elif "ORA-30675" in description: - self._drop_identity(model._meta.db_table, old_field.column) - self.alter_field(model, old_field, new_field, strict) - # If a primary key column is changing to an identity column, drop - # the primary key first. - elif "ORA-30673" in description and old_field.primary_key: - self._delete_primary_key(model, strict=True) - self._alter_field_type_workaround(model, old_field, new_field) - # If a collation is changing on a primary key, drop the primary key - # first. - elif "ORA-43923" in description and old_field.primary_key: - self._delete_primary_key(model, strict=True) - self.alter_field(model, old_field, new_field, strict) - # Restore a primary key, if needed. - if new_field.primary_key: - self.execute(self._create_primary_key_sql(model, new_field)) - else: - raise - - def _alter_field_type_workaround(self, model, old_field, new_field): - """ - Oracle refuses to change from some type to other type. - What we need to do instead is: - - Add a nullable version of the desired field with a temporary name. If - the new column is an auto field, then the temporary column can't be - nullable. - - Update the table to transfer values from old to new - - Drop old column - - Rename the new column and possibly drop the nullable property - """ - # Make a new field that's like the new one but with a temporary - # column name. - new_temp_field = copy.deepcopy(new_field) - new_temp_field.null = new_field.get_internal_type() not in ( - "AutoField", - "BigAutoField", - "SmallAutoField", - ) - new_temp_field.column = self._generate_temp_name(new_field.column) - # Add it - self.add_field(model, new_temp_field) - # Explicit data type conversion - # https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf - # /Data-Type-Comparison-Rules.html#GUID-D0C5A47E-6F93-4C2D-9E49-4F2B86B359DD - new_value = self.quote_name(old_field.column) - old_type = old_field.db_type(self.connection) - if re.match("^N?CLOB", old_type): - new_value = "TO_CHAR(%s)" % new_value - old_type = "VARCHAR2" - if re.match("^N?VARCHAR2", old_type): - new_internal_type = new_field.get_internal_type() - if new_internal_type == "DateField": - new_value = "TO_DATE(%s, 'YYYY-MM-DD')" % new_value - elif new_internal_type == "DateTimeField": - new_value = "TO_TIMESTAMP(%s, 'YYYY-MM-DD HH24:MI:SS.FF')" % new_value - elif new_internal_type == "TimeField": - # TimeField are stored as TIMESTAMP with a 1900-01-01 date part. - new_value = "CONCAT('1900-01-01 ', %s)" % new_value - new_value = "TO_TIMESTAMP(%s, 'YYYY-MM-DD HH24:MI:SS.FF')" % new_value - # Transfer values across - self.execute( - "UPDATE %s set %s=%s" - % ( - self.quote_name(model._meta.db_table), - self.quote_name(new_temp_field.column), - new_value, - ) - ) - # Drop the old field - self.remove_field(model, old_field) - # Rename and possibly make the new field NOT NULL - super().alter_field(model, new_temp_field, new_field) - # Recreate foreign key (if necessary) because the old field is not - # passed to the alter_field() and data types of new_temp_field and - # new_field always match. - new_type = new_field.db_type(self.connection) - if ( - (old_field.primary_key and new_field.primary_key) - or (old_field.unique and new_field.unique) - ) and old_type != new_type: - for _, rel in _related_non_m2m_objects(new_temp_field, new_field): - if rel.field.db_constraint: - self.execute( - self._create_fk_sql(rel.related_model, rel.field, "_fk") - ) - - def _alter_column_type_sql( - self, model, old_field, new_field, new_type, old_collation, new_collation - ): - auto_field_types = {"AutoField", "BigAutoField", "SmallAutoField"} - # Drop the identity if migrating away from AutoField. - if ( - old_field.get_internal_type() in auto_field_types - and new_field.get_internal_type() not in auto_field_types - and self._is_identity_column(model._meta.db_table, new_field.column) - ): - self._drop_identity(model._meta.db_table, new_field.column) - return super()._alter_column_type_sql( - model, old_field, new_field, new_type, old_collation, new_collation - ) - - def normalize_name(self, name): - """ - Get the properly shortened and uppercased identifier as returned by - quote_name() but without the quotes. - """ - nn = self.quote_name(name) - if nn[0] == '"' and nn[-1] == '"': - nn = nn[1:-1] - return nn - - def _generate_temp_name(self, for_name): - """Generate temporary names for workarounds that need temp columns.""" - suffix = hex(hash(for_name)).upper()[1:] - return self.normalize_name(for_name + "_" + suffix) - - def prepare_default(self, value): - return self.quote_value(value) - - def _field_should_be_indexed(self, model, field): - create_index = super()._field_should_be_indexed(model, field) - db_type = field.db_type(self.connection) - if ( - db_type is not None - and db_type.lower() in self.connection._limited_data_types - ): - return False - return create_index - - def _is_identity_column(self, table_name, column_name): - if not column_name: - return False - with self.connection.cursor() as cursor: - cursor.execute( - """ - SELECT - CASE WHEN identity_column = 'YES' THEN 1 ELSE 0 END - FROM user_tab_cols - WHERE table_name = %s AND - column_name = %s - """, - [self.normalize_name(table_name), self.normalize_name(column_name)], - ) - row = cursor.fetchone() - return row[0] if row else False - - def _drop_identity(self, table_name, column_name): - self.execute( - "ALTER TABLE %(table)s MODIFY %(column)s DROP IDENTITY" - % { - "table": self.quote_name(table_name), - "column": self.quote_name(column_name), - } - ) - - def _get_default_collation(self, table_name): - with self.connection.cursor() as cursor: - cursor.execute( - """ - SELECT default_collation FROM user_tables WHERE table_name = %s - """, - [self.normalize_name(table_name)], - ) - return cursor.fetchone()[0] - - def _collate_sql(self, collation, old_collation=None, table_name=None): - if collation is None and old_collation is not None: - collation = self._get_default_collation(table_name) - return super()._collate_sql(collation, old_collation, table_name) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/utils.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/utils.py deleted file mode 100644 index 57d97b3..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/utils.py +++ /dev/null @@ -1,99 +0,0 @@ -import datetime -import decimal - -from .base import Database - - -class InsertVar: - """ - A late-binding cursor variable that can be passed to Cursor.execute - as a parameter, in order to receive the id of the row created by an - insert statement. - """ - - types = { - "AutoField": int, - "BigAutoField": int, - "SmallAutoField": int, - "IntegerField": int, - "BigIntegerField": int, - "SmallIntegerField": int, - "PositiveBigIntegerField": int, - "PositiveSmallIntegerField": int, - "PositiveIntegerField": int, - "BooleanField": int, - "FloatField": Database.DB_TYPE_BINARY_DOUBLE, - "DateTimeField": Database.DB_TYPE_TIMESTAMP, - "DateField": Database.Date, - "DecimalField": decimal.Decimal, - } - - def __init__(self, field): - internal_type = getattr(field, "target_field", field).get_internal_type() - self.db_type = self.types.get(internal_type, str) - self.bound_param = None - - def bind_parameter(self, cursor): - self.bound_param = cursor.cursor.var(self.db_type) - return self.bound_param - - def get_value(self): - return self.bound_param.getvalue() - - -class Oracle_datetime(datetime.datetime): - """ - A datetime object, with an additional class attribute - to tell oracledb to save the microseconds too. - """ - - input_size = Database.DB_TYPE_TIMESTAMP - - @classmethod - def from_datetime(cls, dt): - return Oracle_datetime( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - ) - - -class BulkInsertMapper: - BLOB = "TO_BLOB(%s)" - DATE = "TO_DATE(%s)" - INTERVAL = "CAST(%s as INTERVAL DAY(9) TO SECOND(6))" - NCLOB = "TO_NCLOB(%s)" - NUMBER = "TO_NUMBER(%s)" - TIMESTAMP = "TO_TIMESTAMP(%s)" - - types = { - "AutoField": NUMBER, - "BigAutoField": NUMBER, - "BigIntegerField": NUMBER, - "BinaryField": BLOB, - "BooleanField": NUMBER, - "DateField": DATE, - "DateTimeField": TIMESTAMP, - "DecimalField": NUMBER, - "DurationField": INTERVAL, - "FloatField": NUMBER, - "IntegerField": NUMBER, - "PositiveBigIntegerField": NUMBER, - "PositiveIntegerField": NUMBER, - "PositiveSmallIntegerField": NUMBER, - "SmallAutoField": NUMBER, - "SmallIntegerField": NUMBER, - "TextField": NCLOB, - "TimeField": TIMESTAMP, - } - - -def dsn(settings_dict): - if settings_dict["PORT"]: - host = settings_dict["HOST"].strip() or "localhost" - return Database.makedsn(host, int(settings_dict["PORT"]), settings_dict["NAME"]) - return settings_dict["NAME"] diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/validation.py b/.venv/lib/python3.10/site-packages/django/db/backends/oracle/validation.py deleted file mode 100644 index 4035b12..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/oracle/validation.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.core import checks -from django.db.backends.base.validation import BaseDatabaseValidation - - -class DatabaseValidation(BaseDatabaseValidation): - def check_field_type(self, field, field_type): - """Oracle doesn't support a database index on some data types.""" - errors = [] - if field.db_index and field_type.lower() in self.connection._limited_data_types: - errors.append( - checks.Warning( - "Oracle does not support a database index on %s columns." - % field_type, - hint=( - "An index won't be created. Silence this warning if " - "you don't care about it." - ), - obj=field, - id="fields.W162", - ) - ) - return errors diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/__init__.py b/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/base.py b/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/base.py deleted file mode 100644 index c864cab..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/base.py +++ /dev/null @@ -1,611 +0,0 @@ -""" -PostgreSQL database backend for Django. - -Requires psycopg2 >= 2.8.4 or psycopg >= 3.1.8 -""" - -import asyncio -import threading -import warnings -from contextlib import contextmanager - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.db import DatabaseError as WrappedDatabaseError -from django.db import connections -from django.db.backends.base.base import NO_DB_ALIAS, BaseDatabaseWrapper -from django.db.backends.utils import CursorDebugWrapper as BaseCursorDebugWrapper -from django.utils.asyncio import async_unsafe -from django.utils.functional import cached_property -from django.utils.safestring import SafeString -from django.utils.version import get_version_tuple - -try: - try: - import psycopg as Database - except ImportError: - import psycopg2 as Database -except ImportError: - raise ImproperlyConfigured("Error loading psycopg2 or psycopg module") - - -def psycopg_version(): - version = Database.__version__.split(" ", 1)[0] - return get_version_tuple(version) - - -if psycopg_version() < (2, 8, 4): - raise ImproperlyConfigured( - f"psycopg2 version 2.8.4 or newer is required; you have {Database.__version__}" - ) -if (3,) <= psycopg_version() < (3, 1, 8): - raise ImproperlyConfigured( - f"psycopg version 3.1.8 or newer is required; you have {Database.__version__}" - ) - - -from .psycopg_any import IsolationLevel, is_psycopg3 # NOQA isort:skip - -if is_psycopg3: - from psycopg import adapters, sql - from psycopg.pq import Format - - from .psycopg_any import get_adapters_template, register_tzloader - - TIMESTAMPTZ_OID = adapters.types["timestamptz"].oid - -else: - import psycopg2.extensions - import psycopg2.extras - - psycopg2.extensions.register_adapter(SafeString, psycopg2.extensions.QuotedString) - psycopg2.extras.register_uuid() - - # Register support for inet[] manually so we don't have to handle the Inet() - # object on load all the time. - INETARRAY_OID = 1041 - INETARRAY = psycopg2.extensions.new_array_type( - (INETARRAY_OID,), - "INETARRAY", - psycopg2.extensions.UNICODE, - ) - psycopg2.extensions.register_type(INETARRAY) - -# Some of these import psycopg, so import them after checking if it's installed. -from .client import DatabaseClient # NOQA isort:skip -from .creation import DatabaseCreation # NOQA isort:skip -from .features import DatabaseFeatures # NOQA isort:skip -from .introspection import DatabaseIntrospection # NOQA isort:skip -from .operations import DatabaseOperations # NOQA isort:skip -from .schema import DatabaseSchemaEditor # NOQA isort:skip - - -def _get_varchar_column(data): - if data["max_length"] is None: - return "varchar" - return "varchar(%(max_length)s)" % data - - -class DatabaseWrapper(BaseDatabaseWrapper): - vendor = "postgresql" - display_name = "PostgreSQL" - # This dictionary maps Field objects to their associated PostgreSQL column - # types, as strings. Column-type strings can contain format strings; they'll - # be interpolated against the values of Field.__dict__ before being output. - # If a column type is set to None, it won't be included in the output. - data_types = { - "AutoField": "integer", - "BigAutoField": "bigint", - "BinaryField": "bytea", - "BooleanField": "boolean", - "CharField": _get_varchar_column, - "DateField": "date", - "DateTimeField": "timestamp with time zone", - "DecimalField": "numeric(%(max_digits)s, %(decimal_places)s)", - "DurationField": "interval", - "FileField": "varchar(%(max_length)s)", - "FilePathField": "varchar(%(max_length)s)", - "FloatField": "double precision", - "IntegerField": "integer", - "BigIntegerField": "bigint", - "IPAddressField": "inet", - "GenericIPAddressField": "inet", - "JSONField": "jsonb", - "OneToOneField": "integer", - "PositiveBigIntegerField": "bigint", - "PositiveIntegerField": "integer", - "PositiveSmallIntegerField": "smallint", - "SlugField": "varchar(%(max_length)s)", - "SmallAutoField": "smallint", - "SmallIntegerField": "smallint", - "TextField": "text", - "TimeField": "time", - "UUIDField": "uuid", - } - data_type_check_constraints = { - "PositiveBigIntegerField": '"%(column)s" >= 0', - "PositiveIntegerField": '"%(column)s" >= 0', - "PositiveSmallIntegerField": '"%(column)s" >= 0', - } - data_types_suffix = { - "AutoField": "GENERATED BY DEFAULT AS IDENTITY", - "BigAutoField": "GENERATED BY DEFAULT AS IDENTITY", - "SmallAutoField": "GENERATED BY DEFAULT AS IDENTITY", - } - operators = { - "exact": "= %s", - "iexact": "= UPPER(%s)", - "contains": "LIKE %s", - "icontains": "LIKE UPPER(%s)", - "regex": "~ %s", - "iregex": "~* %s", - "gt": "> %s", - "gte": ">= %s", - "lt": "< %s", - "lte": "<= %s", - "startswith": "LIKE %s", - "endswith": "LIKE %s", - "istartswith": "LIKE UPPER(%s)", - "iendswith": "LIKE UPPER(%s)", - } - - # The patterns below are used to generate SQL pattern lookup clauses when - # the right-hand side of the lookup isn't a raw string (it might be an expression - # or the result of a bilateral transformation). - # In those cases, special characters for LIKE operators (e.g. \, *, _) should be - # escaped on database side. - # - # Note: we use str.format() here for readability as '%' is used as a wildcard for - # the LIKE operator. - pattern_esc = ( - r"REPLACE(REPLACE(REPLACE({}, E'\\', E'\\\\'), E'%%', E'\\%%'), E'_', E'\\_')" - ) - pattern_ops = { - "contains": "LIKE '%%' || {} || '%%'", - "icontains": "LIKE '%%' || UPPER({}) || '%%'", - "startswith": "LIKE {} || '%%'", - "istartswith": "LIKE UPPER({}) || '%%'", - "endswith": "LIKE '%%' || {}", - "iendswith": "LIKE '%%' || UPPER({})", - } - - Database = Database - SchemaEditorClass = DatabaseSchemaEditor - # Classes instantiated in __init__(). - client_class = DatabaseClient - creation_class = DatabaseCreation - features_class = DatabaseFeatures - introspection_class = DatabaseIntrospection - ops_class = DatabaseOperations - # PostgreSQL backend-specific attributes. - _named_cursor_idx = 0 - _connection_pools = {} - - @property - def pool(self): - pool_options = self.settings_dict["OPTIONS"].get("pool") - if self.alias == NO_DB_ALIAS or not pool_options: - return None - - if self.alias not in self._connection_pools: - if self.settings_dict.get("CONN_MAX_AGE", 0) != 0: - raise ImproperlyConfigured( - "Pooling doesn't support persistent connections." - ) - # Set the default options. - if pool_options is True: - pool_options = {} - - try: - from psycopg_pool import ConnectionPool - except ImportError as err: - raise ImproperlyConfigured( - "Error loading psycopg_pool module.\nDid you install psycopg[pool]?" - ) from err - - connect_kwargs = self.get_connection_params() - # Ensure we run in autocommit, Django properly sets it later on. - connect_kwargs["autocommit"] = True - enable_checks = self.settings_dict["CONN_HEALTH_CHECKS"] - pool = ConnectionPool( - kwargs=connect_kwargs, - open=False, # Do not open the pool during startup. - configure=self._configure_connection, - check=ConnectionPool.check_connection if enable_checks else None, - **pool_options, - ) - # setdefault() ensures that multiple threads don't set this in - # parallel. Since we do not open the pool during it's init above, - # this means that at worst during startup multiple threads generate - # pool objects and the first to set it wins. - self._connection_pools.setdefault(self.alias, pool) - - return self._connection_pools[self.alias] - - def close_pool(self): - if self.pool: - self.pool.close() - del self._connection_pools[self.alias] - - def get_database_version(self): - """ - Return a tuple of the database's version. - E.g. for pg_version 120004, return (12, 4). - """ - return divmod(self.pg_version, 10000) - - def get_connection_params(self): - settings_dict = self.settings_dict - # None may be used to connect to the default 'postgres' db - if settings_dict["NAME"] == "" and not settings_dict["OPTIONS"].get("service"): - raise ImproperlyConfigured( - "settings.DATABASES is improperly configured. " - "Please supply the NAME or OPTIONS['service'] value." - ) - if len(settings_dict["NAME"] or "") > self.ops.max_name_length(): - raise ImproperlyConfigured( - "The database name '%s' (%d characters) is longer than " - "PostgreSQL's limit of %d characters. Supply a shorter NAME " - "in settings.DATABASES." - % ( - settings_dict["NAME"], - len(settings_dict["NAME"]), - self.ops.max_name_length(), - ) - ) - if settings_dict["NAME"]: - conn_params = { - "dbname": settings_dict["NAME"], - **settings_dict["OPTIONS"], - } - elif settings_dict["NAME"] is None: - # Connect to the default 'postgres' db. - settings_dict["OPTIONS"].pop("service", None) - conn_params = {"dbname": "postgres", **settings_dict["OPTIONS"]} - else: - conn_params = {**settings_dict["OPTIONS"]} - conn_params["client_encoding"] = "UTF8" - - conn_params.pop("assume_role", None) - conn_params.pop("isolation_level", None) - - pool_options = conn_params.pop("pool", None) - if pool_options and not is_psycopg3: - raise ImproperlyConfigured("Database pooling requires psycopg >= 3") - - server_side_binding = conn_params.pop("server_side_binding", None) - conn_params.setdefault( - "cursor_factory", - ( - ServerBindingCursor - if is_psycopg3 and server_side_binding is True - else Cursor - ), - ) - if settings_dict["USER"]: - conn_params["user"] = settings_dict["USER"] - if settings_dict["PASSWORD"]: - conn_params["password"] = settings_dict["PASSWORD"] - if settings_dict["HOST"]: - conn_params["host"] = settings_dict["HOST"] - if settings_dict["PORT"]: - conn_params["port"] = settings_dict["PORT"] - if is_psycopg3: - conn_params["context"] = get_adapters_template( - settings.USE_TZ, self.timezone - ) - # Disable prepared statements by default to keep connection poolers - # working. Can be reenabled via OPTIONS in the settings dict. - conn_params["prepare_threshold"] = conn_params.pop( - "prepare_threshold", None - ) - return conn_params - - @async_unsafe - def get_new_connection(self, conn_params): - # self.isolation_level must be set: - # - after connecting to the database in order to obtain the database's - # default when no value is explicitly specified in options. - # - before calling _set_autocommit() because if autocommit is on, that - # will set connection.isolation_level to ISOLATION_LEVEL_AUTOCOMMIT. - options = self.settings_dict["OPTIONS"] - set_isolation_level = False - try: - isolation_level_value = options["isolation_level"] - except KeyError: - self.isolation_level = IsolationLevel.READ_COMMITTED - else: - # Set the isolation level to the value from OPTIONS. - try: - self.isolation_level = IsolationLevel(isolation_level_value) - set_isolation_level = True - except ValueError: - raise ImproperlyConfigured( - f"Invalid transaction isolation level {isolation_level_value} " - f"specified. Use one of the psycopg.IsolationLevel values." - ) - if self.pool: - # If nothing else has opened the pool, open it now. - self.pool.open() - connection = self.pool.getconn() - else: - connection = self.Database.connect(**conn_params) - if set_isolation_level: - connection.isolation_level = self.isolation_level - if not is_psycopg3: - # Register dummy loads() to avoid a round trip from psycopg2's - # decode to json.dumps() to json.loads(), when using a custom - # decoder in JSONField. - psycopg2.extras.register_default_jsonb( - conn_or_curs=connection, loads=lambda x: x - ) - return connection - - def ensure_timezone(self): - # Close the pool so new connections pick up the correct timezone. - self.close_pool() - if self.connection is None: - return False - return self._configure_timezone(self.connection) - - def _configure_timezone(self, connection): - conn_timezone_name = connection.info.parameter_status("TimeZone") - timezone_name = self.timezone_name - if timezone_name and conn_timezone_name != timezone_name: - with connection.cursor() as cursor: - cursor.execute(self.ops.set_time_zone_sql(), [timezone_name]) - return True - return False - - def _configure_role(self, connection): - if new_role := self.settings_dict["OPTIONS"].get("assume_role"): - with connection.cursor() as cursor: - sql = self.ops.compose_sql("SET ROLE %s", [new_role]) - cursor.execute(sql) - return True - return False - - def _configure_connection(self, connection): - # This function is called from init_connection_state and from the - # psycopg pool itself after a connection is opened. - - # Commit after setting the time zone. - commit_tz = self._configure_timezone(connection) - # Set the role on the connection. This is useful if the credential used - # to login is not the same as the role that owns database resources. As - # can be the case when using temporary or ephemeral credentials. - commit_role = self._configure_role(connection) - - return commit_role or commit_tz - - def _close(self): - if self.connection is not None: - # `wrap_database_errors` only works for `putconn` as long as there - # is no `reset` function set in the pool because it is deferred - # into a thread and not directly executed. - with self.wrap_database_errors: - if self.pool: - # Ensure the correct pool is returned. This is a workaround - # for tests so a pool can be changed on setting changes - # (e.g. USE_TZ, TIME_ZONE). - self.connection._pool.putconn(self.connection) - # Connection can no longer be used. - self.connection = None - else: - return self.connection.close() - - def init_connection_state(self): - super().init_connection_state() - - if self.connection is not None and not self.pool: - commit = self._configure_connection(self.connection) - - if commit and not self.get_autocommit(): - self.connection.commit() - - @async_unsafe - def create_cursor(self, name=None): - if name: - if is_psycopg3 and ( - self.settings_dict["OPTIONS"].get("server_side_binding") is not True - ): - # psycopg >= 3 forces the usage of server-side bindings for - # named cursors so a specialized class that implements - # server-side cursors while performing client-side bindings - # must be used if `server_side_binding` is disabled (default). - cursor = ServerSideCursor( - self.connection, - name=name, - scrollable=False, - withhold=self.connection.autocommit, - ) - else: - # In autocommit mode, the cursor will be used outside of a - # transaction, hence use a holdable cursor. - cursor = self.connection.cursor( - name, scrollable=False, withhold=self.connection.autocommit - ) - else: - cursor = self.connection.cursor() - - if is_psycopg3: - # Register the cursor timezone only if the connection disagrees, to - # avoid copying the adapter map. - tzloader = self.connection.adapters.get_loader(TIMESTAMPTZ_OID, Format.TEXT) - if self.timezone != tzloader.timezone: - register_tzloader(self.timezone, cursor) - else: - cursor.tzinfo_factory = self.tzinfo_factory if settings.USE_TZ else None - return cursor - - def tzinfo_factory(self, offset): - return self.timezone - - @async_unsafe - def chunked_cursor(self): - self._named_cursor_idx += 1 - # Get the current async task - # Note that right now this is behind @async_unsafe, so this is - # unreachable, but in future we'll start loosening this restriction. - # For now, it's here so that every use of "threading" is - # also async-compatible. - try: - current_task = asyncio.current_task() - except RuntimeError: - current_task = None - # Current task can be none even if the current_task call didn't error - if current_task: - task_ident = str(id(current_task)) - else: - task_ident = "sync" - # Use that and the thread ident to get a unique name - return self._cursor( - name="_django_curs_%d_%s_%d" - % ( - # Avoid reusing name in other threads / tasks - threading.current_thread().ident, - task_ident, - self._named_cursor_idx, - ) - ) - - def _set_autocommit(self, autocommit): - with self.wrap_database_errors: - self.connection.autocommit = autocommit - - def check_constraints(self, table_names=None): - """ - Check constraints by setting them to immediate. Return them to deferred - afterward. - """ - with self.cursor() as cursor: - cursor.execute("SET CONSTRAINTS ALL IMMEDIATE") - cursor.execute("SET CONSTRAINTS ALL DEFERRED") - - def is_usable(self): - if self.connection is None: - return False - try: - # Use a psycopg cursor directly, bypassing Django's utilities. - with self.connection.cursor() as cursor: - cursor.execute("SELECT 1") - except Database.Error: - return False - else: - return True - - def close_if_health_check_failed(self): - if self.pool: - # The pool only returns healthy connections. - return - return super().close_if_health_check_failed() - - @contextmanager - def _nodb_cursor(self): - cursor = None - try: - with super()._nodb_cursor() as cursor: - yield cursor - except (Database.DatabaseError, WrappedDatabaseError): - if cursor is not None: - raise - warnings.warn( - "Normally Django will use a connection to the 'postgres' database " - "to avoid running initialization queries against the production " - "database when it's not needed (for example, when running tests). " - "Django was unable to create a connection to the 'postgres' database " - "and will use the first PostgreSQL database instead.", - RuntimeWarning, - ) - for connection in connections.all(): - if ( - connection.vendor == "postgresql" - and connection.settings_dict["NAME"] != "postgres" - ): - conn = self.__class__( - { - **self.settings_dict, - "NAME": connection.settings_dict["NAME"], - }, - alias=self.alias, - ) - try: - with conn.cursor() as cursor: - yield cursor - finally: - conn.close() - break - else: - raise - - @cached_property - def pg_version(self): - with self.temporary_connection(): - return self.connection.info.server_version - - def make_debug_cursor(self, cursor): - return CursorDebugWrapper(cursor, self) - - -if is_psycopg3: - - class CursorMixin: - """ - A subclass of psycopg cursor implementing callproc. - """ - - def callproc(self, name, args=None): - if not isinstance(name, sql.Identifier): - name = sql.Identifier(name) - - qparts = [sql.SQL("SELECT * FROM "), name, sql.SQL("(")] - if args: - for item in args: - qparts.append(sql.Literal(item)) - qparts.append(sql.SQL(",")) - del qparts[-1] - - qparts.append(sql.SQL(")")) - stmt = sql.Composed(qparts) - self.execute(stmt) - return args - - class ServerBindingCursor(CursorMixin, Database.Cursor): - pass - - class Cursor(CursorMixin, Database.ClientCursor): - pass - - class ServerSideCursor( - CursorMixin, Database.client_cursor.ClientCursorMixin, Database.ServerCursor - ): - """ - psycopg >= 3 forces the usage of server-side bindings when using named - cursors but the ORM doesn't yet support the systematic generation of - prepareable SQL (#20516). - - ClientCursorMixin forces the usage of client-side bindings while - ServerCursor implements the logic required to declare and scroll - through named cursors. - - Mixing ClientCursorMixin in wouldn't be necessary if Cursor allowed to - specify how parameters should be bound instead, which ServerCursor - would inherit, but that's not the case. - """ - - class CursorDebugWrapper(BaseCursorDebugWrapper): - def copy(self, statement): - with self.debug_sql(statement): - return self.cursor.copy(statement) - -else: - Cursor = psycopg2.extensions.cursor - - class CursorDebugWrapper(BaseCursorDebugWrapper): - def copy_expert(self, sql, file, *args): - with self.debug_sql(sql): - return self.cursor.copy_expert(sql, file, *args) - - def copy_to(self, file, table, *args, **kwargs): - with self.debug_sql(sql="COPY %s TO STDOUT" % table): - return self.cursor.copy_to(file, table, *args, **kwargs) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/client.py b/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/client.py deleted file mode 100644 index 4d79869..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/client.py +++ /dev/null @@ -1,64 +0,0 @@ -import signal - -from django.db.backends.base.client import BaseDatabaseClient - - -class DatabaseClient(BaseDatabaseClient): - executable_name = "psql" - - @classmethod - def settings_to_cmd_args_env(cls, settings_dict, parameters): - args = [cls.executable_name] - options = settings_dict["OPTIONS"] - - host = settings_dict.get("HOST") - port = settings_dict.get("PORT") - dbname = settings_dict.get("NAME") - user = settings_dict.get("USER") - passwd = settings_dict.get("PASSWORD") - passfile = options.get("passfile") - service = options.get("service") - sslmode = options.get("sslmode") - sslrootcert = options.get("sslrootcert") - sslcert = options.get("sslcert") - sslkey = options.get("sslkey") - - if not dbname and not service: - # Connect to the default 'postgres' db. - dbname = "postgres" - if user: - args += ["-U", user] - if host: - args += ["-h", host] - if port: - args += ["-p", str(port)] - args.extend(parameters) - if dbname: - args += [dbname] - - env = {} - if passwd: - env["PGPASSWORD"] = str(passwd) - if service: - env["PGSERVICE"] = str(service) - if sslmode: - env["PGSSLMODE"] = str(sslmode) - if sslrootcert: - env["PGSSLROOTCERT"] = str(sslrootcert) - if sslcert: - env["PGSSLCERT"] = str(sslcert) - if sslkey: - env["PGSSLKEY"] = str(sslkey) - if passfile: - env["PGPASSFILE"] = str(passfile) - return args, (env or None) - - def runshell(self, parameters): - sigint_handler = signal.getsignal(signal.SIGINT) - try: - # Allow SIGINT to pass to psql to abort queries. - signal.signal(signal.SIGINT, signal.SIG_IGN) - super().runshell(parameters) - finally: - # Restore the original SIGINT handler. - signal.signal(signal.SIGINT, sigint_handler) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/compiler.py b/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/compiler.py deleted file mode 100644 index 3b972b5..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/compiler.py +++ /dev/null @@ -1,50 +0,0 @@ -from django.db.models.sql.compiler import ( - SQLAggregateCompiler, - SQLCompiler, - SQLDeleteCompiler, -) -from django.db.models.sql.compiler import SQLInsertCompiler as BaseSQLInsertCompiler -from django.db.models.sql.compiler import SQLUpdateCompiler - -__all__ = [ - "SQLAggregateCompiler", - "SQLCompiler", - "SQLDeleteCompiler", - "SQLInsertCompiler", - "SQLUpdateCompiler", -] - - -class InsertUnnest(list): - """ - Sentinel value to signal DatabaseOperations.bulk_insert_sql() that the - UNNEST strategy should be used for the bulk insert. - """ - - def __str__(self): - return "UNNEST(%s)" % ", ".join(self) - - -class SQLInsertCompiler(BaseSQLInsertCompiler): - def assemble_as_sql(self, fields, value_rows): - # Specialize bulk-insertion of literal non-array values through - # UNNEST to reduce the time spent planning the query. - if ( - # The optimization is not worth doing if there is a single - # row as it will result in the same number of placeholders. - len(value_rows) <= 1 - # Lack of fields denote the usage of the DEFAULT keyword - # for the insertion of empty rows. - or any(field is None for field in fields) - # Compilable cannot be combined in an array of literal values. - or any(any(hasattr(value, "as_sql") for value in row) for row in value_rows) - ): - return super().assemble_as_sql(fields, value_rows) - db_types = [field.db_type(self.connection) for field in fields] - # Abort if any of the fields are arrays as UNNEST indiscriminately - # flatten them instead of reducing their nesting by one. - if any(db_type.endswith("]") for db_type in db_types): - return super().assemble_as_sql(fields, value_rows) - return InsertUnnest(["(%%s)::%s[]" % db_type for db_type in db_types]), [ - list(map(list, zip(*value_rows))) - ] diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/creation.py b/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/creation.py deleted file mode 100644 index 938be0f..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/creation.py +++ /dev/null @@ -1,91 +0,0 @@ -import sys - -from django.core.exceptions import ImproperlyConfigured -from django.db.backends.base.creation import BaseDatabaseCreation -from django.db.backends.postgresql.psycopg_any import errors -from django.db.backends.utils import strip_quotes - - -class DatabaseCreation(BaseDatabaseCreation): - def _quote_name(self, name): - return self.connection.ops.quote_name(name) - - def _get_database_create_suffix(self, encoding=None, template=None): - suffix = "" - if encoding: - suffix += " ENCODING '{}'".format(encoding) - if template: - suffix += " TEMPLATE {}".format(self._quote_name(template)) - return suffix and "WITH" + suffix - - def sql_table_creation_suffix(self): - test_settings = self.connection.settings_dict["TEST"] - if test_settings.get("COLLATION") is not None: - raise ImproperlyConfigured( - "PostgreSQL does not support collation setting at database " - "creation time." - ) - return self._get_database_create_suffix( - encoding=test_settings["CHARSET"], - template=test_settings.get("TEMPLATE"), - ) - - def _database_exists(self, cursor, database_name): - cursor.execute( - "SELECT 1 FROM pg_catalog.pg_database WHERE datname = %s", - [strip_quotes(database_name)], - ) - return cursor.fetchone() is not None - - def _execute_create_test_db(self, cursor, parameters, keepdb=False): - try: - if keepdb and self._database_exists(cursor, parameters["dbname"]): - # If the database should be kept and it already exists, don't - # try to create a new one. - return - super()._execute_create_test_db(cursor, parameters, keepdb) - except Exception as e: - if not isinstance(e.__cause__, errors.DuplicateDatabase): - # All errors except "database already exists" cancel tests. - self.log("Got an error creating the test database: %s" % e) - sys.exit(2) - elif not keepdb: - # If the database should be kept, ignore "database already - # exists". - raise - - def _clone_test_db(self, suffix, verbosity, keepdb=False): - # CREATE DATABASE ... WITH TEMPLATE ... requires closing connections - # to the template database. - self.connection.close() - self.connection.close_pool() - - source_database_name = self.connection.settings_dict["NAME"] - target_database_name = self.get_test_db_clone_settings(suffix)["NAME"] - test_db_params = { - "dbname": self._quote_name(target_database_name), - "suffix": self._get_database_create_suffix(template=source_database_name), - } - with self._nodb_cursor() as cursor: - try: - self._execute_create_test_db(cursor, test_db_params, keepdb) - except Exception: - try: - if verbosity >= 1: - self.log( - "Destroying old test database for alias %s..." - % ( - self._get_database_display_str( - verbosity, target_database_name - ), - ) - ) - cursor.execute("DROP DATABASE %(dbname)s" % test_db_params) - self._execute_create_test_db(cursor, test_db_params, keepdb) - except Exception as e: - self.log("Got an error cloning the test database: %s" % e) - sys.exit(2) - - def _destroy_test_db(self, test_database_name, verbosity): - self.connection.close_pool() - return super()._destroy_test_db(test_database_name, verbosity) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/features.py b/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/features.py deleted file mode 100644 index 16653a0..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/features.py +++ /dev/null @@ -1,170 +0,0 @@ -import operator - -from django.db import DataError, InterfaceError -from django.db.backends.base.features import BaseDatabaseFeatures -from django.db.backends.postgresql.psycopg_any import is_psycopg3 -from django.utils.functional import cached_property - - -class DatabaseFeatures(BaseDatabaseFeatures): - minimum_database_version = (14,) - allows_group_by_selected_pks = True - can_return_columns_from_insert = True - can_return_rows_from_bulk_insert = True - has_real_datatype = True - has_native_uuid_field = True - has_native_duration_field = True - has_native_json_field = True - can_defer_constraint_checks = True - has_select_for_update = True - has_select_for_update_nowait = True - has_select_for_update_of = True - has_select_for_update_skip_locked = True - has_select_for_no_key_update = True - can_release_savepoints = True - supports_comments = True - supports_tablespaces = True - supports_transactions = True - can_introspect_materialized_views = True - can_distinct_on_fields = True - can_rollback_ddl = True - schema_editor_uses_clientside_param_binding = True - supports_combined_alters = True - nulls_order_largest = True - closed_cursor_error_class = InterfaceError - greatest_least_ignores_nulls = True - can_clone_databases = True - supports_temporal_subtraction = True - supports_slicing_ordering_in_compound = True - create_test_procedure_without_params_sql = """ - CREATE FUNCTION test_procedure () RETURNS void AS $$ - DECLARE - V_I INTEGER; - BEGIN - V_I := 1; - END; - $$ LANGUAGE plpgsql;""" - create_test_procedure_with_int_param_sql = """ - CREATE FUNCTION test_procedure (P_I INTEGER) RETURNS void AS $$ - DECLARE - V_I INTEGER; - BEGIN - V_I := P_I; - END; - $$ LANGUAGE plpgsql;""" - create_test_table_with_composite_primary_key = """ - CREATE TABLE test_table_composite_pk ( - column_1 INTEGER NOT NULL, - column_2 INTEGER NOT NULL, - PRIMARY KEY(column_1, column_2) - ) - """ - requires_casted_case_in_updates = True - supports_over_clause = True - supports_frame_exclusion = True - only_supports_unbounded_with_preceding_and_following = True - supports_aggregate_filter_clause = True - supported_explain_formats = {"JSON", "TEXT", "XML", "YAML"} - supports_deferrable_unique_constraints = True - has_json_operators = True - json_key_contains_list_matching_requires_list = True - supports_update_conflicts = True - supports_update_conflicts_with_target = True - supports_covering_indexes = True - supports_stored_generated_columns = True - supports_virtual_generated_columns = False - can_rename_index = True - test_collations = { - "deterministic": "C", - "non_default": "sv-x-icu", - "swedish_ci": "sv-x-icu", - "virtual": "sv-x-icu", - } - test_now_utc_template = "STATEMENT_TIMESTAMP() AT TIME ZONE 'UTC'" - insert_test_table_with_defaults = "INSERT INTO {} DEFAULT VALUES" - - @cached_property - def django_test_skips(self): - skips = { - "opclasses are PostgreSQL only.": { - "indexes.tests.SchemaIndexesNotPostgreSQLTests." - "test_create_index_ignores_opclasses", - }, - "PostgreSQL requires casting to text.": { - "lookup.tests.LookupTests.test_textfield_exact_null", - }, - } - if self.connection.settings_dict["OPTIONS"].get("pool"): - skips.update( - { - "Pool does implicit health checks": { - "backends.base.test_base.ConnectionHealthChecksTests." - "test_health_checks_enabled", - "backends.base.test_base.ConnectionHealthChecksTests." - "test_set_autocommit_health_checks_enabled", - }, - } - ) - if self.uses_server_side_binding: - skips.update( - { - "The actual query cannot be determined for server side bindings": { - "backends.base.test_base.ExecuteWrapperTests." - "test_wrapper_debug", - } - }, - ) - return skips - - @cached_property - def django_test_expected_failures(self): - expected_failures = set() - if self.uses_server_side_binding: - expected_failures.update( - { - # Parameters passed to expressions in SELECT and GROUP BY - # clauses are not recognized as the same values when using - # server-side binding cursors (#34255). - "aggregation.tests.AggregateTestCase." - "test_group_by_nested_expression_with_params", - } - ) - return expected_failures - - @cached_property - def uses_server_side_binding(self): - options = self.connection.settings_dict["OPTIONS"] - return is_psycopg3 and options.get("server_side_binding") is True - - @cached_property - def prohibits_null_characters_in_text_exception(self): - if is_psycopg3: - return DataError, "PostgreSQL text fields cannot contain NUL (0x00) bytes" - else: - return ValueError, "A string literal cannot contain NUL (0x00) characters." - - @cached_property - def introspected_field_types(self): - return { - **super().introspected_field_types, - "PositiveBigIntegerField": "BigIntegerField", - "PositiveIntegerField": "IntegerField", - "PositiveSmallIntegerField": "SmallIntegerField", - } - - @cached_property - def is_postgresql_15(self): - return self.connection.pg_version >= 150000 - - @cached_property - def is_postgresql_16(self): - return self.connection.pg_version >= 160000 - - @cached_property - def is_postgresql_17(self): - return self.connection.pg_version >= 170000 - - supports_unlimited_charfield = True - supports_nulls_distinct_unique_constraints = property( - operator.attrgetter("is_postgresql_15") - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/introspection.py b/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/introspection.py deleted file mode 100644 index 69bc871..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/introspection.py +++ /dev/null @@ -1,299 +0,0 @@ -from collections import namedtuple - -from django.db.backends.base.introspection import BaseDatabaseIntrospection -from django.db.backends.base.introspection import FieldInfo as BaseFieldInfo -from django.db.backends.base.introspection import TableInfo as BaseTableInfo -from django.db.models import Index - -FieldInfo = namedtuple("FieldInfo", BaseFieldInfo._fields + ("is_autofield", "comment")) -TableInfo = namedtuple("TableInfo", BaseTableInfo._fields + ("comment",)) - - -class DatabaseIntrospection(BaseDatabaseIntrospection): - # Maps type codes to Django Field types. - data_types_reverse = { - 16: "BooleanField", - 17: "BinaryField", - 20: "BigIntegerField", - 21: "SmallIntegerField", - 23: "IntegerField", - 25: "TextField", - 700: "FloatField", - 701: "FloatField", - 869: "GenericIPAddressField", - 1042: "CharField", # blank-padded - 1043: "CharField", - 1082: "DateField", - 1083: "TimeField", - 1114: "DateTimeField", - 1184: "DateTimeField", - 1186: "DurationField", - 1266: "TimeField", - 1700: "DecimalField", - 2950: "UUIDField", - 3802: "JSONField", - } - # A hook for subclasses. - index_default_access_method = "btree" - - ignored_tables = [] - - def get_field_type(self, data_type, description): - field_type = super().get_field_type(data_type, description) - if description.is_autofield or ( - # Required for pre-Django 4.1 serial columns. - description.default - and "nextval" in description.default - ): - if field_type == "IntegerField": - return "AutoField" - elif field_type == "BigIntegerField": - return "BigAutoField" - elif field_type == "SmallIntegerField": - return "SmallAutoField" - return field_type - - def get_table_list(self, cursor): - """Return a list of table and view names in the current database.""" - cursor.execute( - """ - SELECT - c.relname, - CASE - WHEN c.relispartition THEN 'p' - WHEN c.relkind IN ('m', 'v') THEN 'v' - ELSE 't' - END, - obj_description(c.oid, 'pg_class') - FROM pg_catalog.pg_class c - LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace - WHERE c.relkind IN ('f', 'm', 'p', 'r', 'v') - AND n.nspname NOT IN ('pg_catalog', 'pg_toast') - AND pg_catalog.pg_table_is_visible(c.oid) - """ - ) - return [ - TableInfo(*row) - for row in cursor.fetchall() - if row[0] not in self.ignored_tables - ] - - def get_table_description(self, cursor, table_name): - """ - Return a description of the table with the DB-API cursor.description - interface. - """ - # Query the pg_catalog tables as cursor.description does not reliably - # return the nullable property and information_schema.columns does not - # contain details of materialized views. - cursor.execute( - """ - SELECT - a.attname AS column_name, - NOT (a.attnotnull OR (t.typtype = 'd' AND t.typnotnull)) AS is_nullable, - pg_get_expr(ad.adbin, ad.adrelid) AS column_default, - CASE WHEN collname = 'default' THEN NULL ELSE collname END AS collation, - a.attidentity != '' AS is_autofield, - col_description(a.attrelid, a.attnum) AS column_comment - FROM pg_attribute a - LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum - LEFT JOIN pg_collation co ON a.attcollation = co.oid - JOIN pg_type t ON a.atttypid = t.oid - JOIN pg_class c ON a.attrelid = c.oid - JOIN pg_namespace n ON c.relnamespace = n.oid - WHERE c.relkind IN ('f', 'm', 'p', 'r', 'v') - AND c.relname = %s - AND n.nspname NOT IN ('pg_catalog', 'pg_toast') - AND pg_catalog.pg_table_is_visible(c.oid) - """, - [table_name], - ) - field_map = {line[0]: line[1:] for line in cursor.fetchall()} - cursor.execute( - "SELECT * FROM %s LIMIT 1" % self.connection.ops.quote_name(table_name) - ) - return [ - FieldInfo( - line.name, - line.type_code, - # display_size is always None on psycopg2. - line.internal_size if line.display_size is None else line.display_size, - line.internal_size, - line.precision, - line.scale, - *field_map[line.name], - ) - for line in cursor.description - ] - - def get_sequences(self, cursor, table_name, table_fields=()): - cursor.execute( - """ - SELECT - s.relname AS sequence_name, - a.attname AS colname - FROM - pg_class s - JOIN pg_depend d ON d.objid = s.oid - AND d.classid = 'pg_class'::regclass - AND d.refclassid = 'pg_class'::regclass - JOIN pg_attribute a ON d.refobjid = a.attrelid - AND d.refobjsubid = a.attnum - JOIN pg_class tbl ON tbl.oid = d.refobjid - AND tbl.relname = %s - AND pg_catalog.pg_table_is_visible(tbl.oid) - WHERE - s.relkind = 'S'; - """, - [table_name], - ) - return [ - {"name": row[0], "table": table_name, "column": row[1]} - for row in cursor.fetchall() - ] - - def get_relations(self, cursor, table_name): - """ - Return a dictionary of {field_name: (field_name_other_table, other_table)} - representing all foreign keys in the given table. - """ - cursor.execute( - """ - SELECT a1.attname, c2.relname, a2.attname - FROM pg_constraint con - LEFT JOIN pg_class c1 ON con.conrelid = c1.oid - LEFT JOIN pg_class c2 ON con.confrelid = c2.oid - LEFT JOIN - pg_attribute a1 ON c1.oid = a1.attrelid AND a1.attnum = con.conkey[1] - LEFT JOIN - pg_attribute a2 ON c2.oid = a2.attrelid AND a2.attnum = con.confkey[1] - WHERE - c1.relname = %s AND - con.contype = 'f' AND - c1.relnamespace = c2.relnamespace AND - pg_catalog.pg_table_is_visible(c1.oid) - """, - [table_name], - ) - return {row[0]: (row[2], row[1]) for row in cursor.fetchall()} - - def get_constraints(self, cursor, table_name): - """ - Retrieve any constraints or keys (unique, pk, fk, check, index) across - one or more columns. Also retrieve the definition of expression-based - indexes. - """ - constraints = {} - # Loop over the key table, collecting things as constraints. The column - # array must return column names in the same order in which they were - # created. - cursor.execute( - """ - SELECT - c.conname, - array( - SELECT attname - FROM unnest(c.conkey) WITH ORDINALITY cols(colid, arridx) - JOIN pg_attribute AS ca ON cols.colid = ca.attnum - WHERE ca.attrelid = c.conrelid - ORDER BY cols.arridx - ), - c.contype, - (SELECT fkc.relname || '.' || fka.attname - FROM pg_attribute AS fka - JOIN pg_class AS fkc ON fka.attrelid = fkc.oid - WHERE fka.attrelid = c.confrelid AND fka.attnum = c.confkey[1]), - cl.reloptions - FROM pg_constraint AS c - JOIN pg_class AS cl ON c.conrelid = cl.oid - WHERE cl.relname = %s AND pg_catalog.pg_table_is_visible(cl.oid) - """, - [table_name], - ) - for constraint, columns, kind, used_cols, options in cursor.fetchall(): - constraints[constraint] = { - "columns": columns, - "primary_key": kind == "p", - "unique": kind in ["p", "u"], - "foreign_key": tuple(used_cols.split(".", 1)) if kind == "f" else None, - "check": kind == "c", - "index": False, - "definition": None, - "options": options, - } - # Now get indexes - cursor.execute( - """ - SELECT - indexname, - array_agg(attname ORDER BY arridx), - indisunique, - indisprimary, - array_agg(ordering ORDER BY arridx), - amname, - exprdef, - s2.attoptions - FROM ( - SELECT - c2.relname as indexname, idx.*, attr.attname, am.amname, - CASE - WHEN idx.indexprs IS NOT NULL THEN - pg_get_indexdef(idx.indexrelid) - END AS exprdef, - CASE am.amname - WHEN %s THEN - CASE (option & 1) - WHEN 1 THEN 'DESC' ELSE 'ASC' - END - END as ordering, - c2.reloptions as attoptions - FROM ( - SELECT * - FROM - pg_index i, - unnest(i.indkey, i.indoption) - WITH ORDINALITY koi(key, option, arridx) - ) idx - LEFT JOIN pg_class c ON idx.indrelid = c.oid - LEFT JOIN pg_class c2 ON idx.indexrelid = c2.oid - LEFT JOIN pg_am am ON c2.relam = am.oid - LEFT JOIN - pg_attribute attr ON attr.attrelid = c.oid AND attr.attnum = idx.key - WHERE c.relname = %s AND pg_catalog.pg_table_is_visible(c.oid) - ) s2 - GROUP BY indexname, indisunique, indisprimary, amname, exprdef, attoptions; - """, - [self.index_default_access_method, table_name], - ) - for ( - index, - columns, - unique, - primary, - orders, - type_, - definition, - options, - ) in cursor.fetchall(): - if index not in constraints: - basic_index = ( - type_ == self.index_default_access_method - and - # '_btree' references - # django.contrib.postgres.indexes.BTreeIndex.suffix. - not index.endswith("_btree") - and options is None - ) - constraints[index] = { - "columns": columns if columns != [None] else [], - "orders": orders if orders != [None] else [], - "primary_key": primary, - "unique": unique, - "foreign_key": None, - "check": False, - "index": True, - "type": Index.suffix if basic_index else type_, - "definition": definition, - "options": options, - } - return constraints diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/operations.py b/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/operations.py deleted file mode 100644 index 9db755b..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/operations.py +++ /dev/null @@ -1,422 +0,0 @@ -import json -from functools import lru_cache, partial - -from django.conf import settings -from django.db.backends.base.operations import BaseDatabaseOperations -from django.db.backends.postgresql.compiler import InsertUnnest -from django.db.backends.postgresql.psycopg_any import ( - Inet, - Jsonb, - errors, - is_psycopg3, - mogrify, -) -from django.db.backends.utils import split_tzname_delta -from django.db.models.constants import OnConflict -from django.db.models.functions import Cast -from django.utils.regex_helper import _lazy_re_compile - - -@lru_cache -def get_json_dumps(encoder): - if encoder is None: - return json.dumps - return partial(json.dumps, cls=encoder) - - -class DatabaseOperations(BaseDatabaseOperations): - compiler_module = "django.db.backends.postgresql.compiler" - cast_char_field_without_max_length = "varchar" - explain_prefix = "EXPLAIN" - explain_options = frozenset( - [ - "ANALYZE", - "BUFFERS", - "COSTS", - "GENERIC_PLAN", - "MEMORY", - "SETTINGS", - "SERIALIZE", - "SUMMARY", - "TIMING", - "VERBOSE", - "WAL", - ] - ) - cast_data_types = { - "AutoField": "integer", - "BigAutoField": "bigint", - "SmallAutoField": "smallint", - } - - if is_psycopg3: - from psycopg.types import numeric - - integerfield_type_map = { - "SmallIntegerField": numeric.Int2, - "IntegerField": numeric.Int4, - "BigIntegerField": numeric.Int8, - "PositiveSmallIntegerField": numeric.Int2, - "PositiveIntegerField": numeric.Int4, - "PositiveBigIntegerField": numeric.Int8, - } - - def unification_cast_sql(self, output_field): - internal_type = output_field.get_internal_type() - if internal_type in ( - "GenericIPAddressField", - "IPAddressField", - "TimeField", - "UUIDField", - ): - # PostgreSQL will resolve a union as type 'text' if input types are - # 'unknown'. - # https://www.postgresql.org/docs/current/typeconv-union-case.html - # These fields cannot be implicitly cast back in the default - # PostgreSQL configuration so we need to explicitly cast them. - # We must also remove components of the type within brackets: - # varchar(255) -> varchar. - return ( - "CAST(%%s AS %s)" % output_field.db_type(self.connection).split("(")[0] - ) - return "%s" - - # EXTRACT format cannot be passed in parameters. - _extract_format_re = _lazy_re_compile(r"[A-Z_]+") - - def date_extract_sql(self, lookup_type, sql, params): - # https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT - if lookup_type == "week_day": - # For consistency across backends, we return Sunday=1, Saturday=7. - return f"EXTRACT(DOW FROM {sql}) + 1", params - elif lookup_type == "iso_week_day": - return f"EXTRACT(ISODOW FROM {sql})", params - elif lookup_type == "iso_year": - return f"EXTRACT(ISOYEAR FROM {sql})", params - - lookup_type = lookup_type.upper() - if not self._extract_format_re.fullmatch(lookup_type): - raise ValueError(f"Invalid lookup type: {lookup_type!r}") - return f"EXTRACT({lookup_type} FROM {sql})", params - - def date_trunc_sql(self, lookup_type, sql, params, tzname=None): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - # https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC - return f"DATE_TRUNC(%s, {sql})", (lookup_type, *params) - - def _prepare_tzname_delta(self, tzname): - tzname, sign, offset = split_tzname_delta(tzname) - if offset: - sign = "-" if sign == "+" else "+" - return f"{tzname}{sign}{offset}" - return tzname - - def _convert_sql_to_tz(self, sql, params, tzname): - if tzname and settings.USE_TZ: - tzname_param = self._prepare_tzname_delta(tzname) - return f"{sql} AT TIME ZONE %s", (*params, tzname_param) - return sql, params - - def datetime_cast_date_sql(self, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - return f"({sql})::date", params - - def datetime_cast_time_sql(self, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - return f"({sql})::time", params - - def datetime_extract_sql(self, lookup_type, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - if lookup_type == "second": - # Truncate fractional seconds. - return f"EXTRACT(SECOND FROM DATE_TRUNC(%s, {sql}))", ("second", *params) - return self.date_extract_sql(lookup_type, sql, params) - - def datetime_trunc_sql(self, lookup_type, sql, params, tzname): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - # https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC - return f"DATE_TRUNC(%s, {sql})", (lookup_type, *params) - - def time_extract_sql(self, lookup_type, sql, params): - if lookup_type == "second": - # Truncate fractional seconds. - return f"EXTRACT(SECOND FROM DATE_TRUNC(%s, {sql}))", ("second", *params) - return self.date_extract_sql(lookup_type, sql, params) - - def time_trunc_sql(self, lookup_type, sql, params, tzname=None): - sql, params = self._convert_sql_to_tz(sql, params, tzname) - return f"DATE_TRUNC(%s, {sql})::time", (lookup_type, *params) - - def deferrable_sql(self): - return " DEFERRABLE INITIALLY DEFERRED" - - def bulk_insert_sql(self, fields, placeholder_rows): - if isinstance(placeholder_rows, InsertUnnest): - return f"SELECT * FROM {placeholder_rows}" - return super().bulk_insert_sql(fields, placeholder_rows) - - def fetch_returned_insert_rows(self, cursor): - """ - Given a cursor object that has just performed an INSERT...RETURNING - statement into a table, return the tuple of returned data. - """ - return cursor.fetchall() - - def lookup_cast(self, lookup_type, internal_type=None): - lookup = "%s" - # Cast text lookups to text to allow things like filter(x__contains=4) - if lookup_type in ( - "iexact", - "contains", - "icontains", - "startswith", - "istartswith", - "endswith", - "iendswith", - "regex", - "iregex", - ): - if internal_type in ("IPAddressField", "GenericIPAddressField"): - lookup = "HOST(%s)" - else: - lookup = "%s::text" - - # Use UPPER(x) for case-insensitive lookups; it's faster. - if lookup_type in ("iexact", "icontains", "istartswith", "iendswith"): - lookup = "UPPER(%s)" % lookup - - return lookup - - def no_limit_value(self): - return None - - def prepare_sql_script(self, sql): - return [sql] - - def quote_name(self, name): - if name.startswith('"') and name.endswith('"'): - return name # Quoting once is enough. - return '"%s"' % name - - def compose_sql(self, sql, params): - return mogrify(sql, params, self.connection) - - def set_time_zone_sql(self): - return "SELECT set_config('TimeZone', %s, false)" - - def sql_flush(self, style, tables, *, reset_sequences=False, allow_cascade=False): - if not tables: - return [] - - # Perform a single SQL 'TRUNCATE x, y, z...;' statement. It allows us - # to truncate tables referenced by a foreign key in any other table. - sql_parts = [ - style.SQL_KEYWORD("TRUNCATE"), - ", ".join(style.SQL_FIELD(self.quote_name(table)) for table in tables), - ] - if reset_sequences: - sql_parts.append(style.SQL_KEYWORD("RESTART IDENTITY")) - if allow_cascade: - sql_parts.append(style.SQL_KEYWORD("CASCADE")) - return ["%s;" % " ".join(sql_parts)] - - def sequence_reset_by_name_sql(self, style, sequences): - # 'ALTER SEQUENCE sequence_name RESTART WITH 1;'... style SQL statements - # to reset sequence indices - sql = [] - for sequence_info in sequences: - table_name = sequence_info["table"] - # 'id' will be the case if it's an m2m using an autogenerated - # intermediate table (see BaseDatabaseIntrospection.sequence_list). - column_name = sequence_info["column"] or "id" - sql.append( - "%s setval(pg_get_serial_sequence('%s','%s'), 1, false);" - % ( - style.SQL_KEYWORD("SELECT"), - style.SQL_TABLE(self.quote_name(table_name)), - style.SQL_FIELD(column_name), - ) - ) - return sql - - def tablespace_sql(self, tablespace, inline=False): - if inline: - return "USING INDEX TABLESPACE %s" % self.quote_name(tablespace) - else: - return "TABLESPACE %s" % self.quote_name(tablespace) - - def sequence_reset_sql(self, style, model_list): - from django.db import models - - output = [] - qn = self.quote_name - for model in model_list: - # Use `coalesce` to set the sequence for each model to the max pk - # value if there are records, or 1 if there are none. Set the - # `is_called` property (the third argument to `setval`) to true if - # there are records (as the max pk value is already in use), - # otherwise set it to false. Use pg_get_serial_sequence to get the - # underlying sequence name from the table name and column name. - - for f in model._meta.local_fields: - if isinstance(f, models.AutoField): - output.append( - "%s setval(pg_get_serial_sequence('%s','%s'), " - "coalesce(max(%s), 1), max(%s) %s null) %s %s;" - % ( - style.SQL_KEYWORD("SELECT"), - style.SQL_TABLE(qn(model._meta.db_table)), - style.SQL_FIELD(f.column), - style.SQL_FIELD(qn(f.column)), - style.SQL_FIELD(qn(f.column)), - style.SQL_KEYWORD("IS NOT"), - style.SQL_KEYWORD("FROM"), - style.SQL_TABLE(qn(model._meta.db_table)), - ) - ) - # Only one AutoField is allowed per model, so don't bother - # continuing. - break - return output - - def prep_for_iexact_query(self, x): - return x - - def max_name_length(self): - """ - Return the maximum length of an identifier. - - The maximum length of an identifier is 63 by default, but can be - changed by recompiling PostgreSQL after editing the NAMEDATALEN - macro in src/include/pg_config_manual.h. - - This implementation returns 63, but can be overridden by a custom - database backend that inherits most of its behavior from this one. - """ - return 63 - - def distinct_sql(self, fields, params): - if fields: - params = [param for param_list in params for param in param_list] - return (["DISTINCT ON (%s)" % ", ".join(fields)], params) - else: - return ["DISTINCT"], [] - - if is_psycopg3: - - def last_executed_query(self, cursor, sql, params): - if self.connection.features.uses_server_side_binding: - try: - return self.compose_sql(sql, params) - except errors.DataError: - return None - else: - if cursor._query and cursor._query.query is not None: - return cursor._query.query.decode() - return None - - else: - - def last_executed_query(self, cursor, sql, params): - # https://www.psycopg.org/docs/cursor.html#cursor.query - # The query attribute is a Psycopg extension to the DB API 2.0. - if cursor.query is not None: - return cursor.query.decode() - return None - - def return_insert_columns(self, fields): - if not fields: - return "", () - columns = [ - "%s.%s" - % ( - self.quote_name(field.model._meta.db_table), - self.quote_name(field.column), - ) - for field in fields - ] - return "RETURNING %s" % ", ".join(columns), () - - if is_psycopg3: - - def adapt_integerfield_value(self, value, internal_type): - if value is None or hasattr(value, "resolve_expression"): - return value - return self.integerfield_type_map[internal_type](value) - - def adapt_datefield_value(self, value): - return value - - def adapt_datetimefield_value(self, value): - return value - - def adapt_timefield_value(self, value): - return value - - def adapt_ipaddressfield_value(self, value): - if value: - return Inet(value) - return None - - def adapt_json_value(self, value, encoder): - return Jsonb(value, dumps=get_json_dumps(encoder)) - - def subtract_temporals(self, internal_type, lhs, rhs): - if internal_type == "DateField": - lhs_sql, lhs_params = lhs - rhs_sql, rhs_params = rhs - params = (*lhs_params, *rhs_params) - return "(interval '1 day' * (%s - %s))" % (lhs_sql, rhs_sql), params - return super().subtract_temporals(internal_type, lhs, rhs) - - def explain_query_prefix(self, format=None, **options): - extra = {} - if serialize := options.pop("serialize", None): - if serialize.upper() in {"TEXT", "BINARY"}: - extra["SERIALIZE"] = serialize.upper() - # Normalize options. - if options: - options = { - name.upper(): "true" if value else "false" - for name, value in options.items() - } - for valid_option in self.explain_options: - value = options.pop(valid_option, None) - if value is not None: - extra[valid_option] = value - prefix = super().explain_query_prefix(format, **options) - if format: - extra["FORMAT"] = format - if extra: - prefix += " (%s)" % ", ".join("%s %s" % i for i in extra.items()) - return prefix - - def on_conflict_suffix_sql(self, fields, on_conflict, update_fields, unique_fields): - if on_conflict == OnConflict.IGNORE: - return "ON CONFLICT DO NOTHING" - if on_conflict == OnConflict.UPDATE: - return "ON CONFLICT(%s) DO UPDATE SET %s" % ( - ", ".join(map(self.quote_name, unique_fields)), - ", ".join( - [ - f"{field} = EXCLUDED.{field}" - for field in map(self.quote_name, update_fields) - ] - ), - ) - return super().on_conflict_suffix_sql( - fields, - on_conflict, - update_fields, - unique_fields, - ) - - def prepare_join_on_clause(self, lhs_table, lhs_field, rhs_table, rhs_field): - lhs_expr, rhs_expr = super().prepare_join_on_clause( - lhs_table, lhs_field, rhs_table, rhs_field - ) - - if lhs_field.db_type(self.connection) != rhs_field.db_type(self.connection): - rhs_expr = Cast(rhs_expr, lhs_field) - - return lhs_expr, rhs_expr diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/psycopg_any.py b/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/psycopg_any.py deleted file mode 100644 index 700fc6e..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/psycopg_any.py +++ /dev/null @@ -1,114 +0,0 @@ -import ipaddress -from functools import lru_cache - -try: - from psycopg import ClientCursor, IsolationLevel, adapt, adapters, errors, sql - from psycopg.postgres import types - from psycopg.types.datetime import TimestamptzLoader - from psycopg.types.json import Jsonb - from psycopg.types.range import Range, RangeDumper - from psycopg.types.string import TextLoader - - Inet = ipaddress.ip_address - - DateRange = DateTimeRange = DateTimeTZRange = NumericRange = Range - RANGE_TYPES = (Range,) - - TSRANGE_OID = types["tsrange"].oid - TSTZRANGE_OID = types["tstzrange"].oid - - def mogrify(sql, params, connection): - with connection.cursor() as cursor: - return ClientCursor(cursor.connection).mogrify(sql, params) - - # Adapters. - class BaseTzLoader(TimestamptzLoader): - """ - Load a PostgreSQL timestamptz using the a specific timezone. - The timezone can be None too, in which case it will be chopped. - """ - - timezone = None - - def load(self, data): - res = super().load(data) - return res.replace(tzinfo=self.timezone) - - def register_tzloader(tz, context): - class SpecificTzLoader(BaseTzLoader): - timezone = tz - - context.adapters.register_loader("timestamptz", SpecificTzLoader) - - class DjangoRangeDumper(RangeDumper): - """A Range dumper customized for Django.""" - - def upgrade(self, obj, format): - # Dump ranges containing naive datetimes as tstzrange, because - # Django doesn't use tz-aware ones. - dumper = super().upgrade(obj, format) - if dumper is not self and dumper.oid == TSRANGE_OID: - dumper.oid = TSTZRANGE_OID - return dumper - - @lru_cache - def get_adapters_template(use_tz, timezone): - # Create at adapters map extending the base one. - ctx = adapt.AdaptersMap(adapters) - # Register a no-op dumper to avoid a round trip from psycopg version 3 - # decode to json.dumps() to json.loads(), when using a custom decoder - # in JSONField. - ctx.register_loader("jsonb", TextLoader) - # Don't convert automatically from PostgreSQL network types to Python - # ipaddress. - ctx.register_loader("inet", TextLoader) - ctx.register_loader("cidr", TextLoader) - ctx.register_dumper(Range, DjangoRangeDumper) - # Register a timestamptz loader configured on self.timezone. - # This, however, can be overridden by create_cursor. - register_tzloader(timezone, ctx) - return ctx - - is_psycopg3 = True - -except ImportError: - from enum import IntEnum - - from psycopg2 import errors, extensions, sql # NOQA - from psycopg2.extras import ( # NOQA - DateRange, - DateTimeRange, - DateTimeTZRange, - Inet, - Json, - NumericRange, - Range, - ) - - RANGE_TYPES = (DateRange, DateTimeRange, DateTimeTZRange, NumericRange) - - class IsolationLevel(IntEnum): - READ_UNCOMMITTED = extensions.ISOLATION_LEVEL_READ_UNCOMMITTED - READ_COMMITTED = extensions.ISOLATION_LEVEL_READ_COMMITTED - REPEATABLE_READ = extensions.ISOLATION_LEVEL_REPEATABLE_READ - SERIALIZABLE = extensions.ISOLATION_LEVEL_SERIALIZABLE - - def _quote(value, connection=None): - adapted = extensions.adapt(value) - if hasattr(adapted, "encoding"): - adapted.encoding = "utf8" - # getquoted() returns a quoted bytestring of the adapted value. - return adapted.getquoted().decode() - - sql.quote = _quote - - def mogrify(sql, params, connection): - with connection.cursor() as cursor: - return cursor.mogrify(sql, params).decode() - - is_psycopg3 = False - - class Jsonb(Json): - def getquoted(self): - quoted = super().getquoted() - return quoted + b"::jsonb" diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/schema.py b/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/schema.py deleted file mode 100644 index 9640099..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/postgresql/schema.py +++ /dev/null @@ -1,380 +0,0 @@ -from django.db.backends.base.schema import BaseDatabaseSchemaEditor -from django.db.backends.ddl_references import IndexColumns -from django.db.backends.postgresql.psycopg_any import sql -from django.db.backends.utils import strip_quotes - - -class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): - # Setting all constraints to IMMEDIATE to allow changing data in the same - # transaction. - sql_update_with_default = ( - "UPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULL" - "; SET CONSTRAINTS ALL IMMEDIATE" - ) - sql_alter_sequence_type = "ALTER SEQUENCE IF EXISTS %(sequence)s AS %(type)s" - sql_delete_sequence = "DROP SEQUENCE IF EXISTS %(sequence)s CASCADE" - - sql_create_index = ( - "CREATE INDEX %(name)s ON %(table)s%(using)s " - "(%(columns)s)%(include)s%(extra)s%(condition)s" - ) - sql_create_index_concurrently = ( - "CREATE INDEX CONCURRENTLY %(name)s ON %(table)s%(using)s " - "(%(columns)s)%(include)s%(extra)s%(condition)s" - ) - sql_delete_index = "DROP INDEX IF EXISTS %(name)s" - sql_delete_index_concurrently = "DROP INDEX CONCURRENTLY IF EXISTS %(name)s" - - # Setting the constraint to IMMEDIATE to allow changing data in the same - # transaction. - sql_create_column_inline_fk = ( - "CONSTRAINT %(name)s REFERENCES %(to_table)s(%(to_column)s)%(deferrable)s" - "; SET CONSTRAINTS %(namespace)s%(name)s IMMEDIATE" - ) - # Setting the constraint to IMMEDIATE runs any deferred checks to allow - # dropping it in the same transaction. - sql_delete_fk = ( - "SET CONSTRAINTS %(name)s IMMEDIATE; " - "ALTER TABLE %(table)s DROP CONSTRAINT %(name)s" - ) - sql_delete_procedure = "DROP FUNCTION %(procedure)s(%(param_types)s)" - - def execute(self, sql, params=()): - # Merge the query client-side, as PostgreSQL won't do it server-side. - if params is None: - return super().execute(sql, params) - sql = self.connection.ops.compose_sql(str(sql), params) - # Don't let the superclass touch anything. - return super().execute(sql, None) - - sql_add_identity = ( - "ALTER TABLE %(table)s ALTER COLUMN %(column)s ADD " - "GENERATED BY DEFAULT AS IDENTITY" - ) - sql_drop_indentity = ( - "ALTER TABLE %(table)s ALTER COLUMN %(column)s DROP IDENTITY IF EXISTS" - ) - - def quote_value(self, value): - return sql.quote(value, self.connection.connection) - - def _field_indexes_sql(self, model, field): - output = super()._field_indexes_sql(model, field) - like_index_statement = self._create_like_index_sql(model, field) - if like_index_statement is not None: - output.append(like_index_statement) - return output - - def _field_data_type(self, field): - if field.is_relation: - return field.rel_db_type(self.connection) - return self.connection.data_types.get( - field.get_internal_type(), - field.db_type(self.connection), - ) - - def _field_base_data_types(self, field): - # Yield base data types for array fields. - if field.base_field.get_internal_type() == "ArrayField": - yield from self._field_base_data_types(field.base_field) - else: - yield self._field_data_type(field.base_field) - - def _create_like_index_sql(self, model, field): - """ - Return the statement to create an index with varchar operator pattern - when the column type is 'varchar' or 'text', otherwise return None. - """ - db_type = field.db_type(connection=self.connection) - if db_type is not None and (field.db_index or field.unique): - # Fields with database column types of `varchar` and `text` need - # a second index that specifies their operator class, which is - # needed when performing correct LIKE queries outside the - # C locale. See #12234. - # - # The same doesn't apply to array fields such as varchar[size] - # and text[size], so skip them. - if "[" in db_type: - return None - # Non-deterministic collations on Postgresql don't support indexes - # for operator classes varchar_pattern_ops/text_pattern_ops. - collation_name = getattr(field, "db_collation", None) - if not collation_name and field.is_relation: - collation_name = getattr(field.target_field, "db_collation", None) - if collation_name and not self._is_collation_deterministic(collation_name): - return None - if db_type.startswith("varchar"): - return self._create_index_sql( - model, - fields=[field], - suffix="_like", - opclasses=["varchar_pattern_ops"], - ) - elif db_type.startswith("text"): - return self._create_index_sql( - model, - fields=[field], - suffix="_like", - opclasses=["text_pattern_ops"], - ) - return None - - def _using_sql(self, new_field, old_field): - if new_field.generated: - return "" - using_sql = " USING %(column)s::%(type)s" - new_internal_type = new_field.get_internal_type() - old_internal_type = old_field.get_internal_type() - if new_internal_type == "ArrayField" and new_internal_type == old_internal_type: - # Compare base data types for array fields. - if list(self._field_base_data_types(old_field)) != list( - self._field_base_data_types(new_field) - ): - return using_sql - elif self._field_data_type(old_field) != self._field_data_type(new_field): - return using_sql - return "" - - def _get_sequence_name(self, table, column): - with self.connection.cursor() as cursor: - for sequence in self.connection.introspection.get_sequences(cursor, table): - if sequence["column"] == column: - return sequence["name"] - return None - - def _is_changing_type_of_indexed_text_column(self, old_field, old_type, new_type): - return (old_field.db_index or old_field.unique) and ( - (old_type.startswith("varchar") and not new_type.startswith("varchar")) - or (old_type.startswith("text") and not new_type.startswith("text")) - or (old_type.startswith("citext") and not new_type.startswith("citext")) - ) - - def _alter_column_type_sql( - self, model, old_field, new_field, new_type, old_collation, new_collation - ): - # Drop indexes on varchar/text/citext columns that are changing to a - # different type. - old_db_params = old_field.db_parameters(connection=self.connection) - old_type = old_db_params["type"] - if self._is_changing_type_of_indexed_text_column(old_field, old_type, new_type): - index_name = self._create_index_name( - model._meta.db_table, [old_field.column], suffix="_like" - ) - self.execute(self._delete_index_sql(model, index_name)) - - self.sql_alter_column_type = ( - "ALTER COLUMN %(column)s TYPE %(type)s%(collation)s" - ) - # Cast when data type changed. - if using_sql := self._using_sql(new_field, old_field): - self.sql_alter_column_type += using_sql - new_internal_type = new_field.get_internal_type() - old_internal_type = old_field.get_internal_type() - # Make ALTER TYPE with IDENTITY make sense. - table = strip_quotes(model._meta.db_table) - auto_field_types = { - "AutoField", - "BigAutoField", - "SmallAutoField", - } - old_is_auto = old_internal_type in auto_field_types - new_is_auto = new_internal_type in auto_field_types - if new_is_auto and not old_is_auto: - column = strip_quotes(new_field.column) - return ( - ( - self.sql_alter_column_type - % { - "column": self.quote_name(column), - "type": new_type, - "collation": "", - }, - [], - ), - [ - ( - self.sql_add_identity - % { - "table": self.quote_name(table), - "column": self.quote_name(column), - }, - [], - ), - ], - ) - elif old_is_auto and not new_is_auto: - # Drop IDENTITY if exists (pre-Django 4.1 serial columns don't have - # it). - self.execute( - self.sql_drop_indentity - % { - "table": self.quote_name(table), - "column": self.quote_name(strip_quotes(new_field.column)), - } - ) - column = strip_quotes(new_field.column) - fragment, _ = super()._alter_column_type_sql( - model, old_field, new_field, new_type, old_collation, new_collation - ) - # Drop the sequence if exists (Django 4.1+ identity columns don't - # have it). - other_actions = [] - if sequence_name := self._get_sequence_name(table, column): - other_actions = [ - ( - self.sql_delete_sequence - % { - "sequence": self.quote_name(sequence_name), - }, - [], - ) - ] - return fragment, other_actions - elif new_is_auto and old_is_auto and old_internal_type != new_internal_type: - fragment, _ = super()._alter_column_type_sql( - model, old_field, new_field, new_type, old_collation, new_collation - ) - column = strip_quotes(new_field.column) - db_types = { - "AutoField": "integer", - "BigAutoField": "bigint", - "SmallAutoField": "smallint", - } - # Alter the sequence type if exists (Django 4.1+ identity columns - # don't have it). - other_actions = [] - if sequence_name := self._get_sequence_name(table, column): - other_actions = [ - ( - self.sql_alter_sequence_type - % { - "sequence": self.quote_name(sequence_name), - "type": db_types[new_internal_type], - }, - [], - ), - ] - return fragment, other_actions - else: - return super()._alter_column_type_sql( - model, old_field, new_field, new_type, old_collation, new_collation - ) - - def _alter_field( - self, - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict=False, - ): - super()._alter_field( - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict, - ) - # Added an index? Create any PostgreSQL-specific indexes. - if ( - (not (old_field.db_index or old_field.unique) and new_field.db_index) - or (not old_field.unique and new_field.unique) - or ( - self._is_changing_type_of_indexed_text_column( - old_field, old_type, new_type - ) - ) - ): - like_index_statement = self._create_like_index_sql(model, new_field) - if like_index_statement is not None: - self.execute(like_index_statement) - - # Removed an index? Drop any PostgreSQL-specific indexes. - if old_field.unique and not (new_field.db_index or new_field.unique): - index_to_remove = self._create_index_name( - model._meta.db_table, [old_field.column], suffix="_like" - ) - self.execute(self._delete_index_sql(model, index_to_remove)) - - def _index_columns(self, table, columns, col_suffixes, opclasses): - if opclasses: - return IndexColumns( - table, - columns, - self.quote_name, - col_suffixes=col_suffixes, - opclasses=opclasses, - ) - return super()._index_columns(table, columns, col_suffixes, opclasses) - - def add_index(self, model, index, concurrently=False): - self.execute( - index.create_sql(model, self, concurrently=concurrently), params=None - ) - - def remove_index(self, model, index, concurrently=False): - self.execute(index.remove_sql(model, self, concurrently=concurrently)) - - def _delete_index_sql(self, model, name, sql=None, concurrently=False): - sql = ( - self.sql_delete_index_concurrently - if concurrently - else self.sql_delete_index - ) - return super()._delete_index_sql(model, name, sql) - - def _create_index_sql( - self, - model, - *, - fields=None, - name=None, - suffix="", - using="", - db_tablespace=None, - col_suffixes=(), - sql=None, - opclasses=(), - condition=None, - concurrently=False, - include=None, - expressions=None, - ): - sql = sql or ( - self.sql_create_index - if not concurrently - else self.sql_create_index_concurrently - ) - return super()._create_index_sql( - model, - fields=fields, - name=name, - suffix=suffix, - using=using, - db_tablespace=db_tablespace, - col_suffixes=col_suffixes, - sql=sql, - opclasses=opclasses, - condition=condition, - include=include, - expressions=expressions, - ) - - def _is_collation_deterministic(self, collation_name): - with self.connection.cursor() as cursor: - cursor.execute( - """ - SELECT collisdeterministic - FROM pg_collation - WHERE collname = %s - """, - [collation_name], - ) - row = cursor.fetchone() - return row[0] if row else None diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/signals.py b/.venv/lib/python3.10/site-packages/django/db/backends/signals.py deleted file mode 100644 index a8079d0..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/signals.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.dispatch import Signal - -connection_created = Signal() diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/__init__.py b/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/_functions.py b/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/_functions.py deleted file mode 100644 index 6d07d3d..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/_functions.py +++ /dev/null @@ -1,515 +0,0 @@ -""" -Implementations of SQL functions for SQLite. -""" - -import functools -import random -import statistics -import zoneinfo -from datetime import timedelta -from hashlib import md5, sha1, sha224, sha256, sha384, sha512 -from math import ( - acos, - asin, - atan, - atan2, - ceil, - cos, - degrees, - exp, - floor, - fmod, - log, - pi, - radians, - sin, - sqrt, - tan, -) -from re import search as re_search - -from django.db.backends.utils import ( - split_tzname_delta, - typecast_time, - typecast_timestamp, -) -from django.utils import timezone -from django.utils.duration import duration_microseconds - - -def register(connection): - create_deterministic_function = functools.partial( - connection.create_function, - deterministic=True, - ) - create_deterministic_function("django_date_extract", 2, _sqlite_datetime_extract) - create_deterministic_function("django_date_trunc", 4, _sqlite_date_trunc) - create_deterministic_function( - "django_datetime_cast_date", 3, _sqlite_datetime_cast_date - ) - create_deterministic_function( - "django_datetime_cast_time", 3, _sqlite_datetime_cast_time - ) - create_deterministic_function( - "django_datetime_extract", 4, _sqlite_datetime_extract - ) - create_deterministic_function("django_datetime_trunc", 4, _sqlite_datetime_trunc) - create_deterministic_function("django_time_extract", 2, _sqlite_time_extract) - create_deterministic_function("django_time_trunc", 4, _sqlite_time_trunc) - create_deterministic_function("django_time_diff", 2, _sqlite_time_diff) - create_deterministic_function("django_timestamp_diff", 2, _sqlite_timestamp_diff) - create_deterministic_function("django_format_dtdelta", 3, _sqlite_format_dtdelta) - create_deterministic_function("regexp", 2, _sqlite_regexp) - create_deterministic_function("BITXOR", 2, _sqlite_bitxor) - create_deterministic_function("COT", 1, _sqlite_cot) - create_deterministic_function("LPAD", 3, _sqlite_lpad) - create_deterministic_function("MD5", 1, _sqlite_md5) - create_deterministic_function("REPEAT", 2, _sqlite_repeat) - create_deterministic_function("REVERSE", 1, _sqlite_reverse) - create_deterministic_function("RPAD", 3, _sqlite_rpad) - create_deterministic_function("SHA1", 1, _sqlite_sha1) - create_deterministic_function("SHA224", 1, _sqlite_sha224) - create_deterministic_function("SHA256", 1, _sqlite_sha256) - create_deterministic_function("SHA384", 1, _sqlite_sha384) - create_deterministic_function("SHA512", 1, _sqlite_sha512) - create_deterministic_function("SIGN", 1, _sqlite_sign) - # Don't use the built-in RANDOM() function because it returns a value - # in the range [-1 * 2^63, 2^63 - 1] instead of [0, 1). - connection.create_function("RAND", 0, random.random) - connection.create_aggregate("STDDEV_POP", 1, StdDevPop) - connection.create_aggregate("STDDEV_SAMP", 1, StdDevSamp) - connection.create_aggregate("VAR_POP", 1, VarPop) - connection.create_aggregate("VAR_SAMP", 1, VarSamp) - # Some math functions are enabled by default in SQLite 3.35+. - sql = "select sqlite_compileoption_used('ENABLE_MATH_FUNCTIONS')" - if not connection.execute(sql).fetchone()[0]: - create_deterministic_function("ACOS", 1, _sqlite_acos) - create_deterministic_function("ASIN", 1, _sqlite_asin) - create_deterministic_function("ATAN", 1, _sqlite_atan) - create_deterministic_function("ATAN2", 2, _sqlite_atan2) - create_deterministic_function("CEILING", 1, _sqlite_ceiling) - create_deterministic_function("COS", 1, _sqlite_cos) - create_deterministic_function("DEGREES", 1, _sqlite_degrees) - create_deterministic_function("EXP", 1, _sqlite_exp) - create_deterministic_function("FLOOR", 1, _sqlite_floor) - create_deterministic_function("LN", 1, _sqlite_ln) - create_deterministic_function("LOG", 2, _sqlite_log) - create_deterministic_function("MOD", 2, _sqlite_mod) - create_deterministic_function("PI", 0, _sqlite_pi) - create_deterministic_function("POWER", 2, _sqlite_power) - create_deterministic_function("RADIANS", 1, _sqlite_radians) - create_deterministic_function("SIN", 1, _sqlite_sin) - create_deterministic_function("SQRT", 1, _sqlite_sqrt) - create_deterministic_function("TAN", 1, _sqlite_tan) - - -def _sqlite_datetime_parse(dt, tzname=None, conn_tzname=None): - if dt is None: - return None - try: - dt = typecast_timestamp(dt) - except (TypeError, ValueError): - return None - if conn_tzname: - dt = dt.replace(tzinfo=zoneinfo.ZoneInfo(conn_tzname)) - if tzname is not None and tzname != conn_tzname: - tzname, sign, offset = split_tzname_delta(tzname) - if offset: - hours, minutes = offset.split(":") - offset_delta = timedelta(hours=int(hours), minutes=int(minutes)) - dt += offset_delta if sign == "+" else -offset_delta - # The tzname may originally be just the offset e.g. "+3:00", - # which becomes an empty string after splitting the sign and offset. - # In this case, use the conn_tzname as fallback. - dt = timezone.localtime(dt, zoneinfo.ZoneInfo(tzname or conn_tzname)) - return dt - - -def _sqlite_date_trunc(lookup_type, dt, tzname, conn_tzname): - dt = _sqlite_datetime_parse(dt, tzname, conn_tzname) - if dt is None: - return None - if lookup_type == "year": - return f"{dt.year:04d}-01-01" - elif lookup_type == "quarter": - month_in_quarter = dt.month - (dt.month - 1) % 3 - return f"{dt.year:04d}-{month_in_quarter:02d}-01" - elif lookup_type == "month": - return f"{dt.year:04d}-{dt.month:02d}-01" - elif lookup_type == "week": - dt -= timedelta(days=dt.weekday()) - return f"{dt.year:04d}-{dt.month:02d}-{dt.day:02d}" - elif lookup_type == "day": - return f"{dt.year:04d}-{dt.month:02d}-{dt.day:02d}" - raise ValueError(f"Unsupported lookup type: {lookup_type!r}") - - -def _sqlite_time_trunc(lookup_type, dt, tzname, conn_tzname): - if dt is None: - return None - dt_parsed = _sqlite_datetime_parse(dt, tzname, conn_tzname) - if dt_parsed is None: - try: - dt = typecast_time(dt) - except (ValueError, TypeError): - return None - else: - dt = dt_parsed - if lookup_type == "hour": - return f"{dt.hour:02d}:00:00" - elif lookup_type == "minute": - return f"{dt.hour:02d}:{dt.minute:02d}:00" - elif lookup_type == "second": - return f"{dt.hour:02d}:{dt.minute:02d}:{dt.second:02d}" - raise ValueError(f"Unsupported lookup type: {lookup_type!r}") - - -def _sqlite_datetime_cast_date(dt, tzname, conn_tzname): - dt = _sqlite_datetime_parse(dt, tzname, conn_tzname) - if dt is None: - return None - return dt.date().isoformat() - - -def _sqlite_datetime_cast_time(dt, tzname, conn_tzname): - dt = _sqlite_datetime_parse(dt, tzname, conn_tzname) - if dt is None: - return None - return dt.time().isoformat() - - -def _sqlite_datetime_extract(lookup_type, dt, tzname=None, conn_tzname=None): - dt = _sqlite_datetime_parse(dt, tzname, conn_tzname) - if dt is None: - return None - if lookup_type == "week_day": - return (dt.isoweekday() % 7) + 1 - elif lookup_type == "iso_week_day": - return dt.isoweekday() - elif lookup_type == "week": - return dt.isocalendar().week - elif lookup_type == "quarter": - return ceil(dt.month / 3) - elif lookup_type == "iso_year": - return dt.isocalendar().year - else: - return getattr(dt, lookup_type) - - -def _sqlite_datetime_trunc(lookup_type, dt, tzname, conn_tzname): - dt = _sqlite_datetime_parse(dt, tzname, conn_tzname) - if dt is None: - return None - if lookup_type == "year": - return f"{dt.year:04d}-01-01 00:00:00" - elif lookup_type == "quarter": - month_in_quarter = dt.month - (dt.month - 1) % 3 - return f"{dt.year:04d}-{month_in_quarter:02d}-01 00:00:00" - elif lookup_type == "month": - return f"{dt.year:04d}-{dt.month:02d}-01 00:00:00" - elif lookup_type == "week": - dt -= timedelta(days=dt.weekday()) - return f"{dt.year:04d}-{dt.month:02d}-{dt.day:02d} 00:00:00" - elif lookup_type == "day": - return f"{dt.year:04d}-{dt.month:02d}-{dt.day:02d} 00:00:00" - elif lookup_type == "hour": - return f"{dt.year:04d}-{dt.month:02d}-{dt.day:02d} {dt.hour:02d}:00:00" - elif lookup_type == "minute": - return ( - f"{dt.year:04d}-{dt.month:02d}-{dt.day:02d} " - f"{dt.hour:02d}:{dt.minute:02d}:00" - ) - elif lookup_type == "second": - return ( - f"{dt.year:04d}-{dt.month:02d}-{dt.day:02d} " - f"{dt.hour:02d}:{dt.minute:02d}:{dt.second:02d}" - ) - raise ValueError(f"Unsupported lookup type: {lookup_type!r}") - - -def _sqlite_time_extract(lookup_type, dt): - if dt is None: - return None - try: - dt = typecast_time(dt) - except (ValueError, TypeError): - return None - return getattr(dt, lookup_type) - - -def _sqlite_prepare_dtdelta_param(conn, param): - if conn in ["+", "-"]: - if isinstance(param, int): - return timedelta(0, 0, param) - else: - return typecast_timestamp(param) - return param - - -def _sqlite_format_dtdelta(connector, lhs, rhs): - """ - LHS and RHS can be either: - - An integer number of microseconds - - A string representing a datetime - - A scalar value, e.g. float - """ - if connector is None or lhs is None or rhs is None: - return None - connector = connector.strip() - try: - real_lhs = _sqlite_prepare_dtdelta_param(connector, lhs) - real_rhs = _sqlite_prepare_dtdelta_param(connector, rhs) - except (ValueError, TypeError): - return None - if connector == "+": - # typecast_timestamp() returns a date or a datetime without timezone. - # It will be formatted as "%Y-%m-%d" or "%Y-%m-%d %H:%M:%S[.%f]" - out = str(real_lhs + real_rhs) - elif connector == "-": - out = str(real_lhs - real_rhs) - elif connector == "*": - out = real_lhs * real_rhs - else: - out = real_lhs / real_rhs - return out - - -def _sqlite_time_diff(lhs, rhs): - if lhs is None or rhs is None: - return None - left = typecast_time(lhs) - right = typecast_time(rhs) - return ( - (left.hour * 60 * 60 * 1000000) - + (left.minute * 60 * 1000000) - + (left.second * 1000000) - + (left.microsecond) - - (right.hour * 60 * 60 * 1000000) - - (right.minute * 60 * 1000000) - - (right.second * 1000000) - - (right.microsecond) - ) - - -def _sqlite_timestamp_diff(lhs, rhs): - if lhs is None or rhs is None: - return None - left = typecast_timestamp(lhs) - right = typecast_timestamp(rhs) - return duration_microseconds(left - right) - - -def _sqlite_regexp(pattern, string): - if pattern is None or string is None: - return None - if not isinstance(string, str): - string = str(string) - return bool(re_search(pattern, string)) - - -def _sqlite_acos(x): - if x is None: - return None - return acos(x) - - -def _sqlite_asin(x): - if x is None: - return None - return asin(x) - - -def _sqlite_atan(x): - if x is None: - return None - return atan(x) - - -def _sqlite_atan2(y, x): - if y is None or x is None: - return None - return atan2(y, x) - - -def _sqlite_bitxor(x, y): - if x is None or y is None: - return None - return x ^ y - - -def _sqlite_ceiling(x): - if x is None: - return None - return ceil(x) - - -def _sqlite_cos(x): - if x is None: - return None - return cos(x) - - -def _sqlite_cot(x): - if x is None: - return None - return 1 / tan(x) - - -def _sqlite_degrees(x): - if x is None: - return None - return degrees(x) - - -def _sqlite_exp(x): - if x is None: - return None - return exp(x) - - -def _sqlite_floor(x): - if x is None: - return None - return floor(x) - - -def _sqlite_ln(x): - if x is None: - return None - return log(x) - - -def _sqlite_log(base, x): - if base is None or x is None: - return None - # Arguments reversed to match SQL standard. - return log(x, base) - - -def _sqlite_lpad(text, length, fill_text): - if text is None or length is None or fill_text is None: - return None - delta = length - len(text) - if delta <= 0: - return text[:length] - return (fill_text * length)[:delta] + text - - -def _sqlite_md5(text): - if text is None: - return None - return md5(text.encode()).hexdigest() - - -def _sqlite_mod(x, y): - if x is None or y is None: - return None - return fmod(x, y) - - -def _sqlite_pi(): - return pi - - -def _sqlite_power(x, y): - if x is None or y is None: - return None - return x**y - - -def _sqlite_radians(x): - if x is None: - return None - return radians(x) - - -def _sqlite_repeat(text, count): - if text is None or count is None: - return None - return text * count - - -def _sqlite_reverse(text): - if text is None: - return None - return text[::-1] - - -def _sqlite_rpad(text, length, fill_text): - if text is None or length is None or fill_text is None: - return None - return (text + fill_text * length)[:length] - - -def _sqlite_sha1(text): - if text is None: - return None - return sha1(text.encode()).hexdigest() - - -def _sqlite_sha224(text): - if text is None: - return None - return sha224(text.encode()).hexdigest() - - -def _sqlite_sha256(text): - if text is None: - return None - return sha256(text.encode()).hexdigest() - - -def _sqlite_sha384(text): - if text is None: - return None - return sha384(text.encode()).hexdigest() - - -def _sqlite_sha512(text): - if text is None: - return None - return sha512(text.encode()).hexdigest() - - -def _sqlite_sign(x): - if x is None: - return None - return (x > 0) - (x < 0) - - -def _sqlite_sin(x): - if x is None: - return None - return sin(x) - - -def _sqlite_sqrt(x): - if x is None: - return None - return sqrt(x) - - -def _sqlite_tan(x): - if x is None: - return None - return tan(x) - - -class ListAggregate(list): - step = list.append - - -class StdDevPop(ListAggregate): - finalize = statistics.pstdev - - -class StdDevSamp(ListAggregate): - finalize = statistics.stdev - - -class VarPop(ListAggregate): - finalize = statistics.pvariance - - -class VarSamp(ListAggregate): - finalize = statistics.variance diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/base.py b/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/base.py deleted file mode 100644 index f7b6565..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/base.py +++ /dev/null @@ -1,379 +0,0 @@ -""" -SQLite backend for the sqlite3 module in the standard library. -""" - -import datetime -import decimal -import warnings -from collections.abc import Mapping -from itertools import chain, tee -from sqlite3 import dbapi2 as Database - -from django.core.exceptions import ImproperlyConfigured -from django.db import IntegrityError -from django.db.backends.base.base import BaseDatabaseWrapper -from django.utils.asyncio import async_unsafe -from django.utils.dateparse import parse_date, parse_datetime, parse_time -from django.utils.regex_helper import _lazy_re_compile - -from ._functions import register as register_functions -from .client import DatabaseClient -from .creation import DatabaseCreation -from .features import DatabaseFeatures -from .introspection import DatabaseIntrospection -from .operations import DatabaseOperations -from .schema import DatabaseSchemaEditor - - -def decoder(conv_func): - """ - Convert bytestrings from Python's sqlite3 interface to a regular string. - """ - return lambda s: conv_func(s.decode()) - - -def adapt_date(val): - return val.isoformat() - - -def adapt_datetime(val): - return val.isoformat(" ") - - -def _get_varchar_column(data): - if data["max_length"] is None: - return "varchar" - return "varchar(%(max_length)s)" % data - - -Database.register_converter("bool", b"1".__eq__) -Database.register_converter("date", decoder(parse_date)) -Database.register_converter("time", decoder(parse_time)) -Database.register_converter("datetime", decoder(parse_datetime)) -Database.register_converter("timestamp", decoder(parse_datetime)) - -Database.register_adapter(decimal.Decimal, str) -Database.register_adapter(datetime.date, adapt_date) -Database.register_adapter(datetime.datetime, adapt_datetime) - - -class DatabaseWrapper(BaseDatabaseWrapper): - vendor = "sqlite" - display_name = "SQLite" - # SQLite doesn't actually support most of these types, but it "does the right - # thing" given more verbose field definitions, so leave them as is so that - # schema inspection is more useful. - data_types = { - "AutoField": "integer", - "BigAutoField": "integer", - "BinaryField": "BLOB", - "BooleanField": "bool", - "CharField": _get_varchar_column, - "DateField": "date", - "DateTimeField": "datetime", - "DecimalField": "decimal", - "DurationField": "bigint", - "FileField": "varchar(%(max_length)s)", - "FilePathField": "varchar(%(max_length)s)", - "FloatField": "real", - "IntegerField": "integer", - "BigIntegerField": "bigint", - "IPAddressField": "char(15)", - "GenericIPAddressField": "char(39)", - "JSONField": "text", - "OneToOneField": "integer", - "PositiveBigIntegerField": "bigint unsigned", - "PositiveIntegerField": "integer unsigned", - "PositiveSmallIntegerField": "smallint unsigned", - "SlugField": "varchar(%(max_length)s)", - "SmallAutoField": "integer", - "SmallIntegerField": "smallint", - "TextField": "text", - "TimeField": "time", - "UUIDField": "char(32)", - } - data_type_check_constraints = { - "PositiveBigIntegerField": '"%(column)s" >= 0', - "JSONField": '(JSON_VALID("%(column)s") OR "%(column)s" IS NULL)', - "PositiveIntegerField": '"%(column)s" >= 0', - "PositiveSmallIntegerField": '"%(column)s" >= 0', - } - data_types_suffix = { - "AutoField": "AUTOINCREMENT", - "BigAutoField": "AUTOINCREMENT", - "SmallAutoField": "AUTOINCREMENT", - } - # SQLite requires LIKE statements to include an ESCAPE clause if the value - # being escaped has a percent or underscore in it. - # See https://www.sqlite.org/lang_expr.html for an explanation. - operators = { - "exact": "= %s", - "iexact": "LIKE %s ESCAPE '\\'", - "contains": "LIKE %s ESCAPE '\\'", - "icontains": "LIKE %s ESCAPE '\\'", - "regex": "REGEXP %s", - "iregex": "REGEXP '(?i)' || %s", - "gt": "> %s", - "gte": ">= %s", - "lt": "< %s", - "lte": "<= %s", - "startswith": "LIKE %s ESCAPE '\\'", - "endswith": "LIKE %s ESCAPE '\\'", - "istartswith": "LIKE %s ESCAPE '\\'", - "iendswith": "LIKE %s ESCAPE '\\'", - } - - # The patterns below are used to generate SQL pattern lookup clauses when - # the right-hand side of the lookup isn't a raw string (it might be an expression - # or the result of a bilateral transformation). - # In those cases, special characters for LIKE operators (e.g. \, *, _) should be - # escaped on database side. - # - # Note: we use str.format() here for readability as '%' is used as a wildcard for - # the LIKE operator. - pattern_esc = r"REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')" - pattern_ops = { - "contains": r"LIKE '%%' || {} || '%%' ESCAPE '\'", - "icontains": r"LIKE '%%' || UPPER({}) || '%%' ESCAPE '\'", - "startswith": r"LIKE {} || '%%' ESCAPE '\'", - "istartswith": r"LIKE UPPER({}) || '%%' ESCAPE '\'", - "endswith": r"LIKE '%%' || {} ESCAPE '\'", - "iendswith": r"LIKE '%%' || UPPER({}) ESCAPE '\'", - } - - transaction_modes = frozenset(["DEFERRED", "EXCLUSIVE", "IMMEDIATE"]) - - Database = Database - SchemaEditorClass = DatabaseSchemaEditor - # Classes instantiated in __init__(). - client_class = DatabaseClient - creation_class = DatabaseCreation - features_class = DatabaseFeatures - introspection_class = DatabaseIntrospection - ops_class = DatabaseOperations - - def get_connection_params(self): - settings_dict = self.settings_dict - if not settings_dict["NAME"]: - raise ImproperlyConfigured( - "settings.DATABASES is improperly configured. " - "Please supply the NAME value." - ) - kwargs = { - "database": settings_dict["NAME"], - "detect_types": Database.PARSE_DECLTYPES | Database.PARSE_COLNAMES, - **settings_dict["OPTIONS"], - } - # Always allow the underlying SQLite connection to be shareable - # between multiple threads. The safe-guarding will be handled at a - # higher level by the `BaseDatabaseWrapper.allow_thread_sharing` - # property. This is necessary as the shareability is disabled by - # default in sqlite3 and it cannot be changed once a connection is - # opened. - if "check_same_thread" in kwargs and kwargs["check_same_thread"]: - warnings.warn( - "The `check_same_thread` option was provided and set to " - "True. It will be overridden with False. Use the " - "`DatabaseWrapper.allow_thread_sharing` property instead " - "for controlling thread shareability.", - RuntimeWarning, - ) - kwargs.update({"check_same_thread": False, "uri": True}) - transaction_mode = kwargs.pop("transaction_mode", None) - if ( - transaction_mode is not None - and transaction_mode.upper() not in self.transaction_modes - ): - allowed_transaction_modes = ", ".join( - [f"{mode!r}" for mode in sorted(self.transaction_modes)] - ) - raise ImproperlyConfigured( - f"settings.DATABASES[{self.alias!r}]['OPTIONS']['transaction_mode'] " - f"is improperly configured to '{transaction_mode}'. Use one of " - f"{allowed_transaction_modes}, or None." - ) - self.transaction_mode = transaction_mode.upper() if transaction_mode else None - - init_command = kwargs.pop("init_command", "") - self.init_commands = init_command.split(";") - return kwargs - - def get_database_version(self): - return self.Database.sqlite_version_info - - @async_unsafe - def get_new_connection(self, conn_params): - conn = Database.connect(**conn_params) - register_functions(conn) - - conn.execute("PRAGMA foreign_keys = ON") - # The macOS bundled SQLite defaults legacy_alter_table ON, which - # prevents atomic table renames. - conn.execute("PRAGMA legacy_alter_table = OFF") - for init_command in self.init_commands: - if init_command := init_command.strip(): - conn.execute(init_command) - return conn - - def create_cursor(self, name=None): - return self.connection.cursor(factory=SQLiteCursorWrapper) - - @async_unsafe - def close(self): - self.validate_thread_sharing() - # If database is in memory, closing the connection destroys the - # database. To prevent accidental data loss, ignore close requests on - # an in-memory db. - if not self.is_in_memory_db(): - BaseDatabaseWrapper.close(self) - - def _savepoint_allowed(self): - # When 'isolation_level' is not None, sqlite3 commits before each - # savepoint; it's a bug. When it is None, savepoints don't make sense - # because autocommit is enabled. The only exception is inside 'atomic' - # blocks. To work around that bug, on SQLite, 'atomic' starts a - # transaction explicitly rather than simply disable autocommit. - return self.in_atomic_block - - def _set_autocommit(self, autocommit): - if autocommit: - level = None - else: - # sqlite3's internal default is ''. It's different from None. - # See Modules/_sqlite/connection.c. - level = "" - # 'isolation_level' is a misleading API. - # SQLite always runs at the SERIALIZABLE isolation level. - with self.wrap_database_errors: - self.connection.isolation_level = level - - def disable_constraint_checking(self): - with self.cursor() as cursor: - cursor.execute("PRAGMA foreign_keys = OFF") - # Foreign key constraints cannot be turned off while in a multi- - # statement transaction. Fetch the current state of the pragma - # to determine if constraints are effectively disabled. - enabled = cursor.execute("PRAGMA foreign_keys").fetchone()[0] - return not bool(enabled) - - def enable_constraint_checking(self): - with self.cursor() as cursor: - cursor.execute("PRAGMA foreign_keys = ON") - - def check_constraints(self, table_names=None): - """ - Check each table name in `table_names` for rows with invalid foreign - key references. This method is intended to be used in conjunction with - `disable_constraint_checking()` and `enable_constraint_checking()`, to - determine if rows with invalid references were entered while constraint - checks were off. - """ - with self.cursor() as cursor: - if table_names is None: - violations = cursor.execute("PRAGMA foreign_key_check").fetchall() - else: - violations = chain.from_iterable( - cursor.execute( - "PRAGMA foreign_key_check(%s)" % self.ops.quote_name(table_name) - ).fetchall() - for table_name in table_names - ) - # See https://www.sqlite.org/pragma.html#pragma_foreign_key_check - for ( - table_name, - rowid, - referenced_table_name, - foreign_key_index, - ) in violations: - foreign_key = cursor.execute( - "PRAGMA foreign_key_list(%s)" % self.ops.quote_name(table_name) - ).fetchall()[foreign_key_index] - column_name, referenced_column_name = foreign_key[3:5] - primary_key_column_name = self.introspection.get_primary_key_column( - cursor, table_name - ) - primary_key_value, bad_value = cursor.execute( - "SELECT %s, %s FROM %s WHERE rowid = %%s" - % ( - self.ops.quote_name(primary_key_column_name), - self.ops.quote_name(column_name), - self.ops.quote_name(table_name), - ), - (rowid,), - ).fetchone() - raise IntegrityError( - "The row in table '%s' with primary key '%s' has an " - "invalid foreign key: %s.%s contains a value '%s' that " - "does not have a corresponding value in %s.%s." - % ( - table_name, - primary_key_value, - table_name, - column_name, - bad_value, - referenced_table_name, - referenced_column_name, - ) - ) - - def is_usable(self): - return True - - def _start_transaction_under_autocommit(self): - """ - Start a transaction explicitly in autocommit mode. - - Staying in autocommit mode works around a bug of sqlite3 that breaks - savepoints when autocommit is disabled. - """ - if self.transaction_mode is None: - self.cursor().execute("BEGIN") - else: - self.cursor().execute(f"BEGIN {self.transaction_mode}") - - def is_in_memory_db(self): - return self.creation.is_in_memory_db(self.settings_dict["NAME"]) - - -FORMAT_QMARK_REGEX = _lazy_re_compile(r"(?= 1: - self.log( - "Destroying old test database for alias %s..." - % (self._get_database_display_str(verbosity, test_database_name),) - ) - if os.access(test_database_name, os.F_OK): - if not autoclobber: - confirm = input( - "Type 'yes' if you would like to try deleting the test " - "database '%s', or 'no' to cancel: " % test_database_name - ) - if autoclobber or confirm == "yes": - try: - os.remove(test_database_name) - except Exception as e: - self.log("Got an error deleting the old test database: %s" % e) - sys.exit(2) - else: - self.log("Tests cancelled.") - sys.exit(1) - return test_database_name - - def get_test_db_clone_settings(self, suffix): - orig_settings_dict = self.connection.settings_dict - source_database_name = orig_settings_dict["NAME"] or ":memory:" - - if not self.is_in_memory_db(source_database_name): - root, ext = os.path.splitext(source_database_name) - return {**orig_settings_dict, "NAME": f"{root}_{suffix}{ext}"} - - start_method = multiprocessing.get_start_method() - if start_method == "fork": - return orig_settings_dict - if start_method == "spawn": - return { - **orig_settings_dict, - "NAME": f"{self.connection.alias}_{suffix}.sqlite3", - } - raise NotSupportedError( - f"Cloning with start method {start_method!r} is not supported." - ) - - def _clone_test_db(self, suffix, verbosity, keepdb=False): - source_database_name = self.connection.settings_dict["NAME"] - target_database_name = self.get_test_db_clone_settings(suffix)["NAME"] - if not self.is_in_memory_db(source_database_name): - # Erase the old test database - if os.access(target_database_name, os.F_OK): - if keepdb: - return - if verbosity >= 1: - self.log( - "Destroying old test database for alias %s..." - % ( - self._get_database_display_str( - verbosity, target_database_name - ), - ) - ) - try: - os.remove(target_database_name) - except Exception as e: - self.log("Got an error deleting the old test database: %s" % e) - sys.exit(2) - try: - shutil.copy(source_database_name, target_database_name) - except Exception as e: - self.log("Got an error cloning the test database: %s" % e) - sys.exit(2) - # Forking automatically makes a copy of an in-memory database. - # Spawn requires migrating to disk which will be re-opened in - # setup_worker_connection. - elif multiprocessing.get_start_method() == "spawn": - ondisk_db = sqlite3.connect(target_database_name, uri=True) - self.connection.connection.backup(ondisk_db) - ondisk_db.close() - - def _destroy_test_db(self, test_database_name, verbosity): - if test_database_name and not self.is_in_memory_db(test_database_name): - # Remove the SQLite database file - os.remove(test_database_name) - - def test_db_signature(self): - """ - Return a tuple that uniquely identifies a test database. - - This takes into account the special cases of ":memory:" and "" for - SQLite since the databases will be distinct despite having the same - TEST NAME. See https://www.sqlite.org/inmemorydb.html - """ - test_database_name = self._get_test_db_name() - sig = [self.connection.settings_dict["NAME"]] - if self.is_in_memory_db(test_database_name): - sig.append(self.connection.alias) - else: - sig.append(test_database_name) - return tuple(sig) - - def setup_worker_connection(self, _worker_id): - settings_dict = self.get_test_db_clone_settings(_worker_id) - # connection.settings_dict must be updated in place for changes to be - # reflected in django.db.connections. Otherwise new threads would - # connect to the default database instead of the appropriate clone. - start_method = multiprocessing.get_start_method() - if start_method == "fork": - # Update settings_dict in place. - self.connection.settings_dict.update(settings_dict) - self.connection.close() - elif start_method == "spawn": - alias = self.connection.alias - connection_str = ( - f"file:memorydb_{alias}_{_worker_id}?mode=memory&cache=shared" - ) - source_db = self.connection.Database.connect( - f"file:{alias}_{_worker_id}.sqlite3?mode=ro", uri=True - ) - target_db = sqlite3.connect(connection_str, uri=True) - source_db.backup(target_db) - source_db.close() - # Update settings_dict in place. - self.connection.settings_dict.update(settings_dict) - self.connection.settings_dict["NAME"] = connection_str - # Re-open connection to in-memory database before closing copy - # connection. - self.connection.connect() - target_db.close() - if os.environ.get("RUNNING_DJANGOS_TEST_SUITE") == "true": - self.mark_expected_failures_and_skips() diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/features.py b/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/features.py deleted file mode 100644 index 6ab6308..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/features.py +++ /dev/null @@ -1,168 +0,0 @@ -import operator - -from django.db import transaction -from django.db.backends.base.features import BaseDatabaseFeatures -from django.db.utils import OperationalError -from django.utils.functional import cached_property - -from .base import Database - - -class DatabaseFeatures(BaseDatabaseFeatures): - minimum_database_version = (3, 31) - test_db_allows_multiple_connections = False - supports_unspecified_pk = True - supports_timezones = False - max_query_params = 999 - supports_transactions = True - atomic_transactions = False - can_rollback_ddl = True - can_create_inline_fk = False - requires_literal_defaults = True - can_clone_databases = True - supports_temporal_subtraction = True - ignores_table_name_case = True - supports_cast_with_precision = False - time_cast_precision = 3 - can_release_savepoints = True - has_case_insensitive_like = True - # Is "ALTER TABLE ... DROP COLUMN" supported? - can_alter_table_drop_column = Database.sqlite_version_info >= (3, 35, 5) - supports_parentheses_in_compound = False - can_defer_constraint_checks = True - supports_over_clause = True - supports_frame_range_fixed_distance = True - supports_frame_exclusion = True - supports_aggregate_filter_clause = True - order_by_nulls_first = True - supports_json_field_contains = False - supports_update_conflicts = True - supports_update_conflicts_with_target = True - supports_stored_generated_columns = True - supports_virtual_generated_columns = True - test_collations = { - "ci": "nocase", - "cs": "binary", - "non_default": "nocase", - "virtual": "nocase", - } - django_test_expected_failures = { - # The django_format_dtdelta() function doesn't properly handle mixed - # Date/DateTime fields and timedeltas. - "expressions.tests.FTimeDeltaTests.test_mixed_comparisons1", - } - create_test_table_with_composite_primary_key = """ - CREATE TABLE test_table_composite_pk ( - column_1 INTEGER NOT NULL, - column_2 INTEGER NOT NULL, - PRIMARY KEY(column_1, column_2) - ) - """ - insert_test_table_with_defaults = 'INSERT INTO {} ("null") VALUES (1)' - supports_default_keyword_in_insert = False - supports_unlimited_charfield = True - supports_tuple_lookups = False - - @cached_property - def django_test_skips(self): - skips = { - "SQLite stores values rounded to 15 significant digits.": { - "model_fields.test_decimalfield.DecimalFieldTests." - "test_fetch_from_db_without_float_rounding", - }, - "SQLite naively remakes the table on field alteration.": { - "schema.tests.SchemaTests.test_unique_no_unnecessary_fk_drops", - "schema.tests.SchemaTests.test_unique_and_reverse_m2m", - "schema.tests.SchemaTests." - "test_alter_field_default_doesnt_perform_queries", - "schema.tests.SchemaTests." - "test_rename_column_renames_deferred_sql_references", - }, - "SQLite doesn't support negative precision for ROUND().": { - "db_functions.math.test_round.RoundTests." - "test_null_with_negative_precision", - "db_functions.math.test_round.RoundTests." - "test_decimal_with_negative_precision", - "db_functions.math.test_round.RoundTests." - "test_float_with_negative_precision", - "db_functions.math.test_round.RoundTests." - "test_integer_with_negative_precision", - }, - "The actual query cannot be determined on SQLite": { - "backends.base.test_base.ExecuteWrapperTests.test_wrapper_debug", - }, - } - if self.connection.is_in_memory_db(): - skips.update( - { - "the sqlite backend's close() method is a no-op when using an " - "in-memory database": { - "servers.test_liveserverthread.LiveServerThreadTest." - "test_closes_connections", - "servers.tests.LiveServerTestCloseConnectionTest." - "test_closes_connections", - }, - "For SQLite in-memory tests, closing the connection destroys " - "the database.": { - "test_utils.tests.AssertNumQueriesUponConnectionTests." - "test_ignores_connection_configuration_queries", - }, - } - ) - else: - skips.update( - { - "Only connections to in-memory SQLite databases are passed to the " - "server thread.": { - "servers.tests.LiveServerInMemoryDatabaseLockTest." - "test_in_memory_database_lock", - }, - "multiprocessing's start method is checked only for in-memory " - "SQLite databases": { - "backends.sqlite.test_creation.TestDbSignatureTests." - "test_get_test_db_clone_settings_not_supported", - }, - } - ) - if Database.sqlite_version_info < (3, 47): - skips.update( - { - "SQLite does not parse escaped double quotes in the JSON path " - "notation": { - "model_fields.test_jsonfield.TestQuerying." - "test_lookups_special_chars_double_quotes", - }, - } - ) - return skips - - @cached_property - def introspected_field_types(self): - return { - **super().introspected_field_types, - "BigAutoField": "AutoField", - "DurationField": "BigIntegerField", - "GenericIPAddressField": "CharField", - "SmallAutoField": "AutoField", - } - - @cached_property - def supports_json_field(self): - with self.connection.cursor() as cursor: - try: - with transaction.atomic(self.connection.alias): - cursor.execute('SELECT JSON(\'{"a": "b"}\')') - except OperationalError: - return False - return True - - can_introspect_json_field = property(operator.attrgetter("supports_json_field")) - has_json_object_function = property(operator.attrgetter("supports_json_field")) - - @cached_property - def can_return_columns_from_insert(self): - return Database.sqlite_version_info >= (3, 35) - - can_return_rows_from_bulk_insert = property( - operator.attrgetter("can_return_columns_from_insert") - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/introspection.py b/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/introspection.py deleted file mode 100644 index a21bc22..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/introspection.py +++ /dev/null @@ -1,440 +0,0 @@ -from collections import namedtuple - -import sqlparse - -from django.db import DatabaseError -from django.db.backends.base.introspection import BaseDatabaseIntrospection -from django.db.backends.base.introspection import FieldInfo as BaseFieldInfo -from django.db.backends.base.introspection import TableInfo -from django.db.models import Index -from django.utils.regex_helper import _lazy_re_compile - -FieldInfo = namedtuple( - "FieldInfo", BaseFieldInfo._fields + ("pk", "has_json_constraint") -) - -field_size_re = _lazy_re_compile(r"^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$") - - -def get_field_size(name): - """Extract the size number from a "varchar(11)" type name""" - m = field_size_re.search(name) - return int(m[1]) if m else None - - -# This light wrapper "fakes" a dictionary interface, because some SQLite data -# types include variables in them -- e.g. "varchar(30)" -- and can't be matched -# as a simple dictionary lookup. -class FlexibleFieldLookupDict: - # Maps SQL types to Django Field types. Some of the SQL types have multiple - # entries here because SQLite allows for anything and doesn't normalize the - # field type; it uses whatever was given. - base_data_types_reverse = { - "bool": "BooleanField", - "boolean": "BooleanField", - "smallint": "SmallIntegerField", - "smallint unsigned": "PositiveSmallIntegerField", - "smallinteger": "SmallIntegerField", - "int": "IntegerField", - "integer": "IntegerField", - "bigint": "BigIntegerField", - "integer unsigned": "PositiveIntegerField", - "bigint unsigned": "PositiveBigIntegerField", - "decimal": "DecimalField", - "real": "FloatField", - "text": "TextField", - "char": "CharField", - "varchar": "CharField", - "blob": "BinaryField", - "date": "DateField", - "datetime": "DateTimeField", - "time": "TimeField", - } - - def __getitem__(self, key): - key = key.lower().split("(", 1)[0].strip() - return self.base_data_types_reverse[key] - - -class DatabaseIntrospection(BaseDatabaseIntrospection): - data_types_reverse = FlexibleFieldLookupDict() - - def get_field_type(self, data_type, description): - field_type = super().get_field_type(data_type, description) - if description.pk and field_type in { - "BigIntegerField", - "IntegerField", - "SmallIntegerField", - }: - # No support for BigAutoField or SmallAutoField as SQLite treats - # all integer primary keys as signed 64-bit integers. - return "AutoField" - if description.has_json_constraint: - return "JSONField" - return field_type - - def get_table_list(self, cursor): - """Return a list of table and view names in the current database.""" - # Skip the sqlite_sequence system table used for autoincrement key - # generation. - cursor.execute( - """ - SELECT name, type FROM sqlite_master - WHERE type in ('table', 'view') AND NOT name='sqlite_sequence' - ORDER BY name""" - ) - return [TableInfo(row[0], row[1][0]) for row in cursor.fetchall()] - - def get_table_description(self, cursor, table_name): - """ - Return a description of the table with the DB-API cursor.description - interface. - """ - cursor.execute( - "PRAGMA table_xinfo(%s)" % self.connection.ops.quote_name(table_name) - ) - table_info = cursor.fetchall() - if not table_info: - raise DatabaseError(f"Table {table_name} does not exist (empty pragma).") - collations = self._get_column_collations(cursor, table_name) - json_columns = set() - if self.connection.features.can_introspect_json_field: - for line in table_info: - column = line[1] - json_constraint_sql = '%%json_valid("%s")%%' % column - has_json_constraint = cursor.execute( - """ - SELECT sql - FROM sqlite_master - WHERE - type = 'table' AND - name = %s AND - sql LIKE %s - """, - [table_name, json_constraint_sql], - ).fetchone() - if has_json_constraint: - json_columns.add(column) - return [ - FieldInfo( - name, - data_type, - get_field_size(data_type), - None, - None, - None, - not notnull, - default, - collations.get(name), - pk == 1, - name in json_columns, - ) - for cid, name, data_type, notnull, default, pk, hidden in table_info - if hidden - in [ - 0, # Normal column. - 2, # Virtual generated column. - 3, # Stored generated column. - ] - ] - - def get_sequences(self, cursor, table_name, table_fields=()): - pk_col = self.get_primary_key_column(cursor, table_name) - return [{"table": table_name, "column": pk_col}] - - def get_relations(self, cursor, table_name): - """ - Return a dictionary of {column_name: (ref_column_name, ref_table_name)} - representing all foreign keys in the given table. - """ - cursor.execute( - "PRAGMA foreign_key_list(%s)" % self.connection.ops.quote_name(table_name) - ) - return { - column_name: (ref_column_name, ref_table_name) - for ( - _, - _, - ref_table_name, - column_name, - ref_column_name, - *_, - ) in cursor.fetchall() - } - - def get_primary_key_columns(self, cursor, table_name): - cursor.execute( - "PRAGMA table_info(%s)" % self.connection.ops.quote_name(table_name) - ) - return [name for _, name, *_, pk in cursor.fetchall() if pk] - - def _parse_column_or_constraint_definition(self, tokens, columns): - token = None - is_constraint_definition = None - field_name = None - constraint_name = None - unique = False - unique_columns = [] - check = False - check_columns = [] - braces_deep = 0 - for token in tokens: - if token.match(sqlparse.tokens.Punctuation, "("): - braces_deep += 1 - elif token.match(sqlparse.tokens.Punctuation, ")"): - braces_deep -= 1 - if braces_deep < 0: - # End of columns and constraints for table definition. - break - elif braces_deep == 0 and token.match(sqlparse.tokens.Punctuation, ","): - # End of current column or constraint definition. - break - # Detect column or constraint definition by first token. - if is_constraint_definition is None: - is_constraint_definition = token.match( - sqlparse.tokens.Keyword, "CONSTRAINT" - ) - if is_constraint_definition: - continue - if is_constraint_definition: - # Detect constraint name by second token. - if constraint_name is None: - if token.ttype in (sqlparse.tokens.Name, sqlparse.tokens.Keyword): - constraint_name = token.value - elif token.ttype == sqlparse.tokens.Literal.String.Symbol: - constraint_name = token.value[1:-1] - # Start constraint columns parsing after UNIQUE keyword. - if token.match(sqlparse.tokens.Keyword, "UNIQUE"): - unique = True - unique_braces_deep = braces_deep - elif unique: - if unique_braces_deep == braces_deep: - if unique_columns: - # Stop constraint parsing. - unique = False - continue - if token.ttype in (sqlparse.tokens.Name, sqlparse.tokens.Keyword): - unique_columns.append(token.value) - elif token.ttype == sqlparse.tokens.Literal.String.Symbol: - unique_columns.append(token.value[1:-1]) - else: - # Detect field name by first token. - if field_name is None: - if token.ttype in (sqlparse.tokens.Name, sqlparse.tokens.Keyword): - field_name = token.value - elif token.ttype == sqlparse.tokens.Literal.String.Symbol: - field_name = token.value[1:-1] - if token.match(sqlparse.tokens.Keyword, "UNIQUE"): - unique_columns = [field_name] - # Start constraint columns parsing after CHECK keyword. - if token.match(sqlparse.tokens.Keyword, "CHECK"): - check = True - check_braces_deep = braces_deep - elif check: - if check_braces_deep == braces_deep: - if check_columns: - # Stop constraint parsing. - check = False - continue - if token.ttype in (sqlparse.tokens.Name, sqlparse.tokens.Keyword): - if token.value in columns: - check_columns.append(token.value) - elif token.ttype == sqlparse.tokens.Literal.String.Symbol: - if token.value[1:-1] in columns: - check_columns.append(token.value[1:-1]) - unique_constraint = ( - { - "unique": True, - "columns": unique_columns, - "primary_key": False, - "foreign_key": None, - "check": False, - "index": False, - } - if unique_columns - else None - ) - check_constraint = ( - { - "check": True, - "columns": check_columns, - "primary_key": False, - "unique": False, - "foreign_key": None, - "index": False, - } - if check_columns - else None - ) - return constraint_name, unique_constraint, check_constraint, token - - def _parse_table_constraints(self, sql, columns): - # Check constraint parsing is based of SQLite syntax diagram. - # https://www.sqlite.org/syntaxdiagrams.html#table-constraint - statement = sqlparse.parse(sql)[0] - constraints = {} - unnamed_constrains_index = 0 - tokens = (token for token in statement.flatten() if not token.is_whitespace) - # Go to columns and constraint definition - for token in tokens: - if token.match(sqlparse.tokens.Punctuation, "("): - break - # Parse columns and constraint definition - while True: - ( - constraint_name, - unique, - check, - end_token, - ) = self._parse_column_or_constraint_definition(tokens, columns) - if unique: - if constraint_name: - constraints[constraint_name] = unique - else: - unnamed_constrains_index += 1 - constraints[ - "__unnamed_constraint_%s__" % unnamed_constrains_index - ] = unique - if check: - if constraint_name: - constraints[constraint_name] = check - else: - unnamed_constrains_index += 1 - constraints[ - "__unnamed_constraint_%s__" % unnamed_constrains_index - ] = check - if end_token.match(sqlparse.tokens.Punctuation, ")"): - break - return constraints - - def get_constraints(self, cursor, table_name): - """ - Retrieve any constraints or keys (unique, pk, fk, check, index) across - one or more columns. - """ - constraints = {} - # Find inline check constraints. - try: - table_schema = cursor.execute( - "SELECT sql FROM sqlite_master WHERE type='table' and name=%s", - [table_name], - ).fetchone()[0] - except TypeError: - # table_name is a view. - pass - else: - columns = { - info.name for info in self.get_table_description(cursor, table_name) - } - constraints.update(self._parse_table_constraints(table_schema, columns)) - - # Get the index info - cursor.execute( - "PRAGMA index_list(%s)" % self.connection.ops.quote_name(table_name) - ) - for row in cursor.fetchall(): - # SQLite 3.8.9+ has 5 columns, however older versions only give 3 - # columns. Discard last 2 columns if there. - number, index, unique = row[:3] - cursor.execute( - "SELECT sql FROM sqlite_master WHERE type='index' AND name=%s", - [index], - ) - # There's at most one row. - (sql,) = cursor.fetchone() or (None,) - # Inline constraints are already detected in - # _parse_table_constraints(). The reasons to avoid fetching inline - # constraints from `PRAGMA index_list` are: - # - Inline constraints can have a different name and information - # than what `PRAGMA index_list` gives. - # - Not all inline constraints may appear in `PRAGMA index_list`. - if not sql: - # An inline constraint - continue - # Get the index info for that index - cursor.execute( - "PRAGMA index_info(%s)" % self.connection.ops.quote_name(index) - ) - for index_rank, column_rank, column in cursor.fetchall(): - if index not in constraints: - constraints[index] = { - "columns": [], - "primary_key": False, - "unique": bool(unique), - "foreign_key": None, - "check": False, - "index": True, - } - constraints[index]["columns"].append(column) - # Add type and column orders for indexes - if constraints[index]["index"]: - # SQLite doesn't support any index type other than b-tree - constraints[index]["type"] = Index.suffix - orders = self._get_index_columns_orders(sql) - if orders is not None: - constraints[index]["orders"] = orders - # Get the PK - pk_columns = self.get_primary_key_columns(cursor, table_name) - if pk_columns: - # SQLite doesn't actually give a name to the PK constraint, - # so we invent one. This is fine, as the SQLite backend never - # deletes PK constraints by name, as you can't delete constraints - # in SQLite; we remake the table with a new PK instead. - constraints["__primary__"] = { - "columns": pk_columns, - "primary_key": True, - "unique": False, # It's not actually a unique constraint. - "foreign_key": None, - "check": False, - "index": False, - } - relations = enumerate(self.get_relations(cursor, table_name).items()) - constraints.update( - { - f"fk_{index}": { - "columns": [column_name], - "primary_key": False, - "unique": False, - "foreign_key": (ref_table_name, ref_column_name), - "check": False, - "index": False, - } - for index, (column_name, (ref_column_name, ref_table_name)) in relations - } - ) - return constraints - - def _get_index_columns_orders(self, sql): - tokens = sqlparse.parse(sql)[0] - for token in tokens: - if isinstance(token, sqlparse.sql.Parenthesis): - columns = str(token).strip("()").split(", ") - return ["DESC" if info.endswith("DESC") else "ASC" for info in columns] - return None - - def _get_column_collations(self, cursor, table_name): - row = cursor.execute( - """ - SELECT sql - FROM sqlite_master - WHERE type = 'table' AND name = %s - """, - [table_name], - ).fetchone() - if not row: - return {} - - sql = row[0] - columns = str(sqlparse.parse(sql)[0][-1]).strip("()").split(", ") - collations = {} - for column in columns: - tokens = column[1:].split() - column_name = tokens[0].strip('"') - for index, token in enumerate(tokens): - if token == "COLLATE": - collation = tokens[index + 1] - break - else: - collation = None - collations[column_name] = collation - return collations diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/operations.py b/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/operations.py deleted file mode 100644 index 08de246..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/operations.py +++ /dev/null @@ -1,443 +0,0 @@ -import datetime -import decimal -import uuid -from functools import lru_cache -from itertools import chain - -from django.conf import settings -from django.core.exceptions import FieldError -from django.db import DatabaseError, NotSupportedError, models -from django.db.backends.base.operations import BaseDatabaseOperations -from django.db.models.constants import OnConflict -from django.db.models.expressions import Col -from django.utils import timezone -from django.utils.dateparse import parse_date, parse_datetime, parse_time -from django.utils.functional import cached_property - -from .base import Database - - -class DatabaseOperations(BaseDatabaseOperations): - cast_char_field_without_max_length = "text" - cast_data_types = { - "DateField": "TEXT", - "DateTimeField": "TEXT", - } - explain_prefix = "EXPLAIN QUERY PLAN" - # List of datatypes to that cannot be extracted with JSON_EXTRACT() on - # SQLite. Use JSON_TYPE() instead. - jsonfield_datatype_values = frozenset(["null", "false", "true"]) - - def bulk_batch_size(self, fields, objs): - """ - SQLite has a compile-time default (SQLITE_LIMIT_VARIABLE_NUMBER) of - 999 variables per query. - - If there's only a single field to insert, the limit is 500 - (SQLITE_MAX_COMPOUND_SELECT). - """ - fields = list( - chain.from_iterable( - ( - field.fields - if isinstance(field, models.CompositePrimaryKey) - else [field] - ) - for field in fields - ) - ) - if len(fields) == 1: - return 500 - elif len(fields) > 1: - return self.connection.features.max_query_params // len(fields) - else: - return len(objs) - - def check_expression_support(self, expression): - bad_fields = (models.DateField, models.DateTimeField, models.TimeField) - bad_aggregates = (models.Sum, models.Avg, models.Variance, models.StdDev) - if isinstance(expression, bad_aggregates): - for expr in expression.get_source_expressions(): - try: - output_field = expr.output_field - except (AttributeError, FieldError): - # Not every subexpression has an output_field which is fine - # to ignore. - pass - else: - if isinstance(output_field, bad_fields): - raise NotSupportedError( - "You cannot use Sum, Avg, StdDev, and Variance " - "aggregations on date/time fields in sqlite3 " - "since date/time is saved as text." - ) - if ( - isinstance(expression, models.Aggregate) - and expression.distinct - and len(expression.source_expressions) > 1 - ): - raise NotSupportedError( - "SQLite doesn't support DISTINCT on aggregate functions " - "accepting multiple arguments." - ) - - def date_extract_sql(self, lookup_type, sql, params): - """ - Support EXTRACT with a user-defined function django_date_extract() - that's registered in connect(). Use single quotes because this is a - string and could otherwise cause a collision with a field name. - """ - return f"django_date_extract(%s, {sql})", (lookup_type.lower(), *params) - - def fetch_returned_insert_rows(self, cursor): - """ - Given a cursor object that has just performed an INSERT...RETURNING - statement into a table, return the list of returned data. - """ - return cursor.fetchall() - - def format_for_duration_arithmetic(self, sql): - """Do nothing since formatting is handled in the custom function.""" - return sql - - def date_trunc_sql(self, lookup_type, sql, params, tzname=None): - return f"django_date_trunc(%s, {sql}, %s, %s)", ( - lookup_type.lower(), - *params, - *self._convert_tznames_to_sql(tzname), - ) - - def time_trunc_sql(self, lookup_type, sql, params, tzname=None): - return f"django_time_trunc(%s, {sql}, %s, %s)", ( - lookup_type.lower(), - *params, - *self._convert_tznames_to_sql(tzname), - ) - - def _convert_tznames_to_sql(self, tzname): - if tzname and settings.USE_TZ: - return tzname, self.connection.timezone_name - return None, None - - def datetime_cast_date_sql(self, sql, params, tzname): - return f"django_datetime_cast_date({sql}, %s, %s)", ( - *params, - *self._convert_tznames_to_sql(tzname), - ) - - def datetime_cast_time_sql(self, sql, params, tzname): - return f"django_datetime_cast_time({sql}, %s, %s)", ( - *params, - *self._convert_tznames_to_sql(tzname), - ) - - def datetime_extract_sql(self, lookup_type, sql, params, tzname): - return f"django_datetime_extract(%s, {sql}, %s, %s)", ( - lookup_type.lower(), - *params, - *self._convert_tznames_to_sql(tzname), - ) - - def datetime_trunc_sql(self, lookup_type, sql, params, tzname): - return f"django_datetime_trunc(%s, {sql}, %s, %s)", ( - lookup_type.lower(), - *params, - *self._convert_tznames_to_sql(tzname), - ) - - def time_extract_sql(self, lookup_type, sql, params): - return f"django_time_extract(%s, {sql})", (lookup_type.lower(), *params) - - def pk_default_value(self): - return "NULL" - - def _quote_params_for_last_executed_query(self, params): - """ - Only for last_executed_query! Don't use this to execute SQL queries! - """ - # This function is limited both by SQLITE_LIMIT_VARIABLE_NUMBER (the - # number of parameters, default = 999) and SQLITE_MAX_COLUMN (the - # number of return values, default = 2000). Since Python's sqlite3 - # module doesn't expose the get_limit() C API, assume the default - # limits are in effect and split the work in batches if needed. - BATCH_SIZE = 999 - if len(params) > BATCH_SIZE: - results = () - for index in range(0, len(params), BATCH_SIZE): - chunk = params[index : index + BATCH_SIZE] - results += self._quote_params_for_last_executed_query(chunk) - return results - - sql = "SELECT " + ", ".join(["QUOTE(?)"] * len(params)) - # Bypass Django's wrappers and use the underlying sqlite3 connection - # to avoid logging this query - it would trigger infinite recursion. - cursor = self.connection.connection.cursor() - # Native sqlite3 cursors cannot be used as context managers. - try: - return cursor.execute(sql, params).fetchone() - finally: - cursor.close() - - def last_executed_query(self, cursor, sql, params): - # Python substitutes parameters in Modules/_sqlite/cursor.c with: - # bind_parameters(state, self->statement, parameters); - # Unfortunately there is no way to reach self->statement from Python, - # so we quote and substitute parameters manually. - if params: - if isinstance(params, (list, tuple)): - params = self._quote_params_for_last_executed_query(params) - else: - values = tuple(params.values()) - values = self._quote_params_for_last_executed_query(values) - params = dict(zip(params, values)) - return sql % params - # For consistency with SQLiteCursorWrapper.execute(), just return sql - # when there are no parameters. See #13648 and #17158. - else: - return sql - - def quote_name(self, name): - if name.startswith('"') and name.endswith('"'): - return name # Quoting once is enough. - return '"%s"' % name - - def no_limit_value(self): - return -1 - - def __references_graph(self, table_name): - query = """ - WITH tables AS ( - SELECT %s name - UNION - SELECT sqlite_master.name - FROM sqlite_master - JOIN tables ON (sql REGEXP %s || tables.name || %s) - ) SELECT name FROM tables; - """ - params = ( - table_name, - r'(?i)\s+references\s+("|\')?', - r'("|\')?\s*\(', - ) - with self.connection.cursor() as cursor: - results = cursor.execute(query, params) - return [row[0] for row in results.fetchall()] - - @cached_property - def _references_graph(self): - # 512 is large enough to fit the ~330 tables (as of this writing) in - # Django's test suite. - return lru_cache(maxsize=512)(self.__references_graph) - - def sql_flush(self, style, tables, *, reset_sequences=False, allow_cascade=False): - if tables and allow_cascade: - # Simulate TRUNCATE CASCADE by recursively collecting the tables - # referencing the tables to be flushed. - tables = set( - chain.from_iterable(self._references_graph(table) for table in tables) - ) - sql = [ - "%s %s %s;" - % ( - style.SQL_KEYWORD("DELETE"), - style.SQL_KEYWORD("FROM"), - style.SQL_FIELD(self.quote_name(table)), - ) - for table in tables - ] - if reset_sequences: - sequences = [{"table": table} for table in tables] - sql.extend(self.sequence_reset_by_name_sql(style, sequences)) - return sql - - def sequence_reset_by_name_sql(self, style, sequences): - if not sequences: - return [] - return [ - "%s %s %s %s = 0 %s %s %s (%s);" - % ( - style.SQL_KEYWORD("UPDATE"), - style.SQL_TABLE(self.quote_name("sqlite_sequence")), - style.SQL_KEYWORD("SET"), - style.SQL_FIELD(self.quote_name("seq")), - style.SQL_KEYWORD("WHERE"), - style.SQL_FIELD(self.quote_name("name")), - style.SQL_KEYWORD("IN"), - ", ".join( - ["'%s'" % sequence_info["table"] for sequence_info in sequences] - ), - ), - ] - - def adapt_datetimefield_value(self, value): - if value is None: - return None - - # SQLite doesn't support tz-aware datetimes - if timezone.is_aware(value): - if settings.USE_TZ: - value = timezone.make_naive(value, self.connection.timezone) - else: - raise ValueError( - "SQLite backend does not support timezone-aware datetimes when " - "USE_TZ is False." - ) - - return str(value) - - def adapt_timefield_value(self, value): - if value is None: - return None - - # SQLite doesn't support tz-aware datetimes - if timezone.is_aware(value): - raise ValueError("SQLite backend does not support timezone-aware times.") - - return str(value) - - def get_db_converters(self, expression): - converters = super().get_db_converters(expression) - internal_type = expression.output_field.get_internal_type() - if internal_type == "DateTimeField": - converters.append(self.convert_datetimefield_value) - elif internal_type == "DateField": - converters.append(self.convert_datefield_value) - elif internal_type == "TimeField": - converters.append(self.convert_timefield_value) - elif internal_type == "DecimalField": - converters.append(self.get_decimalfield_converter(expression)) - elif internal_type == "UUIDField": - converters.append(self.convert_uuidfield_value) - elif internal_type == "BooleanField": - converters.append(self.convert_booleanfield_value) - return converters - - def convert_datetimefield_value(self, value, expression, connection): - if value is not None: - if not isinstance(value, datetime.datetime): - value = parse_datetime(value) - if settings.USE_TZ and not timezone.is_aware(value): - value = timezone.make_aware(value, self.connection.timezone) - return value - - def convert_datefield_value(self, value, expression, connection): - if value is not None: - if not isinstance(value, datetime.date): - value = parse_date(value) - return value - - def convert_timefield_value(self, value, expression, connection): - if value is not None: - if not isinstance(value, datetime.time): - value = parse_time(value) - return value - - def get_decimalfield_converter(self, expression): - # SQLite stores only 15 significant digits. Digits coming from - # float inaccuracy must be removed. - create_decimal = decimal.Context(prec=15).create_decimal_from_float - if isinstance(expression, Col): - quantize_value = decimal.Decimal(1).scaleb( - -expression.output_field.decimal_places - ) - - def converter(value, expression, connection): - if value is not None: - return create_decimal(value).quantize( - quantize_value, context=expression.output_field.context - ) - - else: - - def converter(value, expression, connection): - if value is not None: - return create_decimal(value) - - return converter - - def convert_uuidfield_value(self, value, expression, connection): - if value is not None: - value = uuid.UUID(value) - return value - - def convert_booleanfield_value(self, value, expression, connection): - return bool(value) if value in (1, 0) else value - - def combine_expression(self, connector, sub_expressions): - # SQLite doesn't have a ^ operator, so use the user-defined POWER - # function that's registered in connect(). - if connector == "^": - return "POWER(%s)" % ",".join(sub_expressions) - elif connector == "#": - return "BITXOR(%s)" % ",".join(sub_expressions) - return super().combine_expression(connector, sub_expressions) - - def combine_duration_expression(self, connector, sub_expressions): - if connector not in ["+", "-", "*", "/"]: - raise DatabaseError("Invalid connector for timedelta: %s." % connector) - fn_params = ["'%s'" % connector] + sub_expressions - if len(fn_params) > 3: - raise ValueError("Too many params for timedelta operations.") - return "django_format_dtdelta(%s)" % ", ".join(fn_params) - - def integer_field_range(self, internal_type): - # SQLite doesn't enforce any integer constraints, but sqlite3 supports - # integers up to 64 bits. - if internal_type in [ - "PositiveBigIntegerField", - "PositiveIntegerField", - "PositiveSmallIntegerField", - ]: - return (0, 9223372036854775807) - return (-9223372036854775808, 9223372036854775807) - - def subtract_temporals(self, internal_type, lhs, rhs): - lhs_sql, lhs_params = lhs - rhs_sql, rhs_params = rhs - params = (*lhs_params, *rhs_params) - if internal_type == "TimeField": - return "django_time_diff(%s, %s)" % (lhs_sql, rhs_sql), params - return "django_timestamp_diff(%s, %s)" % (lhs_sql, rhs_sql), params - - def insert_statement(self, on_conflict=None): - if on_conflict == OnConflict.IGNORE: - return "INSERT OR IGNORE INTO" - return super().insert_statement(on_conflict=on_conflict) - - def return_insert_columns(self, fields): - # SQLite < 3.35 doesn't support an INSERT...RETURNING statement. - if not fields: - return "", () - columns = [ - "%s.%s" - % ( - self.quote_name(field.model._meta.db_table), - self.quote_name(field.column), - ) - for field in fields - ] - return "RETURNING %s" % ", ".join(columns), () - - def on_conflict_suffix_sql(self, fields, on_conflict, update_fields, unique_fields): - if ( - on_conflict == OnConflict.UPDATE - and self.connection.features.supports_update_conflicts_with_target - ): - return "ON CONFLICT(%s) DO UPDATE SET %s" % ( - ", ".join(map(self.quote_name, unique_fields)), - ", ".join( - [ - f"{field} = EXCLUDED.{field}" - for field in map(self.quote_name, update_fields) - ] - ), - ) - return super().on_conflict_suffix_sql( - fields, - on_conflict, - update_fields, - unique_fields, - ) - - def force_group_by(self): - return ["GROUP BY TRUE"] if Database.sqlite_version_info < (3, 39) else [] diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/schema.py b/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/schema.py deleted file mode 100644 index 3617d17..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/schema.py +++ /dev/null @@ -1,503 +0,0 @@ -import copy -from decimal import Decimal - -from django.apps.registry import Apps -from django.db import NotSupportedError -from django.db.backends.base.schema import BaseDatabaseSchemaEditor -from django.db.backends.ddl_references import Statement -from django.db.backends.utils import strip_quotes -from django.db.models import CompositePrimaryKey, UniqueConstraint - - -class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): - sql_delete_table = "DROP TABLE %(table)s" - sql_create_fk = None - sql_create_inline_fk = ( - "REFERENCES %(to_table)s (%(to_column)s) DEFERRABLE INITIALLY DEFERRED" - ) - sql_create_column_inline_fk = sql_create_inline_fk - sql_delete_column = "ALTER TABLE %(table)s DROP COLUMN %(column)s" - sql_create_unique = "CREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)" - sql_delete_unique = "DROP INDEX %(name)s" - sql_alter_table_comment = None - sql_alter_column_comment = None - - def __enter__(self): - # Some SQLite schema alterations need foreign key constraints to be - # disabled. Enforce it here for the duration of the schema edition. - if not self.connection.disable_constraint_checking(): - raise NotSupportedError( - "SQLite schema editor cannot be used while foreign key " - "constraint checks are enabled. Make sure to disable them " - "before entering a transaction.atomic() context because " - "SQLite does not support disabling them in the middle of " - "a multi-statement transaction." - ) - return super().__enter__() - - def __exit__(self, exc_type, exc_value, traceback): - self.connection.check_constraints() - super().__exit__(exc_type, exc_value, traceback) - self.connection.enable_constraint_checking() - - def quote_value(self, value): - # The backend "mostly works" without this function and there are use - # cases for compiling Python without the sqlite3 libraries (e.g. - # security hardening). - try: - import sqlite3 - - value = sqlite3.adapt(value) - except ImportError: - pass - except sqlite3.ProgrammingError: - pass - # Manual emulation of SQLite parameter quoting - if isinstance(value, bool): - return str(int(value)) - elif isinstance(value, (Decimal, float, int)): - return str(value) - elif isinstance(value, str): - return "'%s'" % value.replace("'", "''") - elif value is None: - return "NULL" - elif isinstance(value, (bytes, bytearray, memoryview)): - # Bytes are only allowed for BLOB fields, encoded as string - # literals containing hexadecimal data and preceded by a single "X" - # character. - return "X'%s'" % value.hex() - else: - raise ValueError( - "Cannot quote parameter value %r of type %s" % (value, type(value)) - ) - - def prepare_default(self, value): - return self.quote_value(value) - - def _remake_table( - self, model, create_field=None, delete_field=None, alter_fields=None - ): - """ - Shortcut to transform a model from old_model into new_model - - This follows the correct procedure to perform non-rename or column - addition operations based on SQLite's documentation - - https://www.sqlite.org/lang_altertable.html#caution - - The essential steps are: - 1. Create a table with the updated definition called "new__app_model" - 2. Copy the data from the existing "app_model" table to the new table - 3. Drop the "app_model" table - 4. Rename the "new__app_model" table to "app_model" - 5. Restore any index of the previous "app_model" table. - """ - - # Self-referential fields must be recreated rather than copied from - # the old model to ensure their remote_field.field_name doesn't refer - # to an altered field. - def is_self_referential(f): - return f.is_relation and f.remote_field.model is model - - # Work out the new fields dict / mapping - body = { - f.name: f.clone() if is_self_referential(f) else f - for f in model._meta.local_concrete_fields - } - - # Since CompositePrimaryKey is not a concrete field (column is None), - # it's not copied by default. - pk = model._meta.pk - if isinstance(pk, CompositePrimaryKey): - body[pk.name] = pk.clone() - - # Since mapping might mix column names and default values, - # its values must be already quoted. - mapping = { - f.column: self.quote_name(f.column) - for f in model._meta.local_concrete_fields - if f.generated is False - } - # This maps field names (not columns) for things like unique_together - rename_mapping = {} - # If any of the new or altered fields is introducing a new PK, - # remove the old one - restore_pk_field = None - alter_fields = alter_fields or [] - if getattr(create_field, "primary_key", False) or any( - getattr(new_field, "primary_key", False) for _, new_field in alter_fields - ): - for name, field in list(body.items()): - if field.primary_key and not any( - # Do not remove the old primary key when an altered field - # that introduces a primary key is the same field. - name == new_field.name - for _, new_field in alter_fields - ): - field.primary_key = False - restore_pk_field = field - if field.auto_created: - del body[name] - del mapping[field.column] - # Add in any created fields - if create_field: - body[create_field.name] = create_field - # Choose a default and insert it into the copy map - if ( - not create_field.has_db_default() - and not (create_field.many_to_many or create_field.generated) - and create_field.concrete - ): - mapping[create_field.column] = self.prepare_default( - self.effective_default(create_field) - ) - # Add in any altered fields - for alter_field in alter_fields: - old_field, new_field = alter_field - body.pop(old_field.name, None) - mapping.pop(old_field.column, None) - body[new_field.name] = new_field - rename_mapping[old_field.name] = new_field.name - if new_field.generated: - continue - if old_field.null and not new_field.null: - if not new_field.has_db_default(): - default = self.prepare_default(self.effective_default(new_field)) - else: - default, _ = self.db_default_sql(new_field) - case_sql = "coalesce(%(col)s, %(default)s)" % { - "col": self.quote_name(old_field.column), - "default": default, - } - mapping[new_field.column] = case_sql - else: - mapping[new_field.column] = self.quote_name(old_field.column) - # Remove any deleted fields - if delete_field: - del body[delete_field.name] - mapping.pop(delete_field.column, None) - # Remove any implicit M2M tables - if ( - delete_field.many_to_many - and delete_field.remote_field.through._meta.auto_created - ): - return self.delete_model(delete_field.remote_field.through) - # Work inside a new app registry - apps = Apps() - - # Work out the new value of unique_together, taking renames into - # account - unique_together = [ - [rename_mapping.get(n, n) for n in unique] - for unique in model._meta.unique_together - ] - - indexes = model._meta.indexes - if delete_field: - indexes = [ - index for index in indexes if delete_field.name not in index.fields - ] - - constraints = list(model._meta.constraints) - - # Provide isolated instances of the fields to the new model body so - # that the existing model's internals aren't interfered with when - # the dummy model is constructed. - body_copy = copy.deepcopy(body) - - # Construct a new model with the new fields to allow self referential - # primary key to resolve to. This model won't ever be materialized as a - # table and solely exists for foreign key reference resolution purposes. - # This wouldn't be required if the schema editor was operating on model - # states instead of rendered models. - meta_contents = { - "app_label": model._meta.app_label, - "db_table": model._meta.db_table, - "unique_together": unique_together, - "indexes": indexes, - "constraints": constraints, - "apps": apps, - } - meta = type("Meta", (), meta_contents) - body_copy["Meta"] = meta - body_copy["__module__"] = model.__module__ - type(model._meta.object_name, model.__bases__, body_copy) - - # Construct a model with a renamed table name. - body_copy = copy.deepcopy(body) - meta_contents = { - "app_label": model._meta.app_label, - "db_table": "new__%s" % strip_quotes(model._meta.db_table), - "unique_together": unique_together, - "indexes": indexes, - "constraints": constraints, - "apps": apps, - } - meta = type("Meta", (), meta_contents) - body_copy["Meta"] = meta - body_copy["__module__"] = model.__module__ - new_model = type("New%s" % model._meta.object_name, model.__bases__, body_copy) - - # Remove the automatically recreated default primary key, if it has - # been deleted. - if delete_field and delete_field.attname == new_model._meta.pk.attname: - auto_pk = new_model._meta.pk - delattr(new_model, auto_pk.attname) - new_model._meta.local_fields.remove(auto_pk) - new_model.pk = None - - # Create a new table with the updated schema. - self.create_model(new_model) - - # Copy data from the old table into the new table - self.execute( - "INSERT INTO %s (%s) SELECT %s FROM %s" - % ( - self.quote_name(new_model._meta.db_table), - ", ".join(self.quote_name(x) for x in mapping), - ", ".join(mapping.values()), - self.quote_name(model._meta.db_table), - ) - ) - - # Delete the old table to make way for the new - self.delete_model(model, handle_autom2m=False) - - # Rename the new table to take way for the old - self.alter_db_table( - new_model, - new_model._meta.db_table, - model._meta.db_table, - ) - - # Run deferred SQL on correct table - for sql in self.deferred_sql: - self.execute(sql) - self.deferred_sql = [] - # Fix any PK-removed field - if restore_pk_field: - restore_pk_field.primary_key = True - - def delete_model(self, model, handle_autom2m=True): - if handle_autom2m: - super().delete_model(model) - else: - # Delete the table (and only that) - self.execute( - self.sql_delete_table - % { - "table": self.quote_name(model._meta.db_table), - } - ) - # Remove all deferred statements referencing the deleted table. - for sql in list(self.deferred_sql): - if isinstance(sql, Statement) and sql.references_table( - model._meta.db_table - ): - self.deferred_sql.remove(sql) - - def add_field(self, model, field): - """Create a field on a model.""" - from django.db.models.expressions import Value - - # Special-case implicit M2M tables. - if field.many_to_many and field.remote_field.through._meta.auto_created: - self.create_model(field.remote_field.through) - elif isinstance(field, CompositePrimaryKey): - # If a CompositePrimaryKey field was added, the existing primary key field - # had to be altered too, resulting in an AddField, AlterField migration. - # The table cannot be re-created on AddField, it would result in a - # duplicate primary key error. - return - elif ( - # Primary keys and unique fields are not supported in ALTER TABLE - # ADD COLUMN. - field.primary_key - or field.unique - or not field.null - # Fields with default values cannot by handled by ALTER TABLE ADD - # COLUMN statement because DROP DEFAULT is not supported in - # ALTER TABLE. - or self.effective_default(field) is not None - # Fields with non-constant defaults cannot by handled by ALTER - # TABLE ADD COLUMN statement. - or (field.has_db_default() and not isinstance(field.db_default, Value)) - ): - self._remake_table(model, create_field=field) - else: - super().add_field(model, field) - - def remove_field(self, model, field): - """ - Remove a field from a model. Usually involves deleting a column, - but for M2Ms may involve deleting a table. - """ - # M2M fields are a special case - if field.many_to_many: - # For implicit M2M tables, delete the auto-created table - if field.remote_field.through._meta.auto_created: - self.delete_model(field.remote_field.through) - # For explicit "through" M2M fields, do nothing - elif ( - self.connection.features.can_alter_table_drop_column - # Primary keys, unique fields, indexed fields, and foreign keys are - # not supported in ALTER TABLE DROP COLUMN. - and not field.primary_key - and not field.unique - and not field.db_index - and not (field.remote_field and field.db_constraint) - ): - super().remove_field(model, field) - # For everything else, remake. - else: - # It might not actually have a column behind it - if field.db_parameters(connection=self.connection)["type"] is None: - return - self._remake_table(model, delete_field=field) - - def _alter_field( - self, - model, - old_field, - new_field, - old_type, - new_type, - old_db_params, - new_db_params, - strict=False, - ): - """Perform a "physical" (non-ManyToMany) field update.""" - # Use "ALTER TABLE ... RENAME COLUMN" if only the column name - # changed and there aren't any constraints. - if ( - old_field.column != new_field.column - and self.column_sql(model, old_field) == self.column_sql(model, new_field) - and not ( - old_field.remote_field - and old_field.db_constraint - or new_field.remote_field - and new_field.db_constraint - ) - ): - return self.execute( - self._rename_field_sql( - model._meta.db_table, old_field, new_field, new_type - ) - ) - # Alter by remaking table - self._remake_table(model, alter_fields=[(old_field, new_field)]) - # Rebuild tables with FKs pointing to this field. - old_collation = old_db_params.get("collation") - new_collation = new_db_params.get("collation") - if new_field.unique and ( - old_type != new_type or old_collation != new_collation - ): - related_models = set() - opts = new_field.model._meta - for remote_field in opts.related_objects: - # Ignore self-relationship since the table was already rebuilt. - if remote_field.related_model == model: - continue - if not remote_field.many_to_many: - if remote_field.field_name == new_field.name: - related_models.add(remote_field.related_model) - elif new_field.primary_key and remote_field.through._meta.auto_created: - related_models.add(remote_field.through) - if new_field.primary_key: - for many_to_many in opts.many_to_many: - # Ignore self-relationship since the table was already rebuilt. - if many_to_many.related_model == model: - continue - if many_to_many.remote_field.through._meta.auto_created: - related_models.add(many_to_many.remote_field.through) - for related_model in related_models: - self._remake_table(related_model) - - def _alter_many_to_many(self, model, old_field, new_field, strict): - """Alter M2Ms to repoint their to= endpoints.""" - if ( - old_field.remote_field.through._meta.db_table - == new_field.remote_field.through._meta.db_table - ): - # The field name didn't change, but some options did, so we have to - # propagate this altering. - self._remake_table( - old_field.remote_field.through, - alter_fields=[ - ( - # The field that points to the target model is needed, - # so that table can be remade with the new m2m field - - # this is m2m_reverse_field_name(). - old_field.remote_field.through._meta.get_field( - old_field.m2m_reverse_field_name() - ), - new_field.remote_field.through._meta.get_field( - new_field.m2m_reverse_field_name() - ), - ), - ( - # The field that points to the model itself is needed, - # so that table can be remade with the new self field - - # this is m2m_field_name(). - old_field.remote_field.through._meta.get_field( - old_field.m2m_field_name() - ), - new_field.remote_field.through._meta.get_field( - new_field.m2m_field_name() - ), - ), - ], - ) - return - - # Make a new through table - self.create_model(new_field.remote_field.through) - # Copy the data across - self.execute( - "INSERT INTO %s (%s) SELECT %s FROM %s" - % ( - self.quote_name(new_field.remote_field.through._meta.db_table), - ", ".join( - [ - "id", - new_field.m2m_column_name(), - new_field.m2m_reverse_name(), - ] - ), - ", ".join( - [ - "id", - old_field.m2m_column_name(), - old_field.m2m_reverse_name(), - ] - ), - self.quote_name(old_field.remote_field.through._meta.db_table), - ) - ) - # Delete the old through table - self.delete_model(old_field.remote_field.through) - - def add_constraint(self, model, constraint): - if isinstance(constraint, UniqueConstraint) and ( - constraint.condition - or constraint.contains_expressions - or constraint.include - or constraint.deferrable - ): - super().add_constraint(model, constraint) - else: - self._remake_table(model) - - def remove_constraint(self, model, constraint): - if isinstance(constraint, UniqueConstraint) and ( - constraint.condition - or constraint.contains_expressions - or constraint.include - or constraint.deferrable - ): - super().remove_constraint(model, constraint) - else: - self._remake_table(model) - - def _collate_sql(self, collation): - return "COLLATE " + collation diff --git a/.venv/lib/python3.10/site-packages/django/db/backends/utils.py b/.venv/lib/python3.10/site-packages/django/db/backends/utils.py deleted file mode 100644 index ab0ea82..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/backends/utils.py +++ /dev/null @@ -1,342 +0,0 @@ -import datetime -import decimal -import functools -import logging -import time -import warnings -from contextlib import contextmanager -from hashlib import md5 - -from django.apps import apps -from django.db import NotSupportedError -from django.utils.dateparse import parse_time - -logger = logging.getLogger("django.db.backends") - - -class CursorWrapper: - def __init__(self, cursor, db): - self.cursor = cursor - self.db = db - - WRAP_ERROR_ATTRS = frozenset(["fetchone", "fetchmany", "fetchall", "nextset"]) - - APPS_NOT_READY_WARNING_MSG = ( - "Accessing the database during app initialization is discouraged. To fix this " - "warning, avoid executing queries in AppConfig.ready() or when your app " - "modules are imported." - ) - - def __getattr__(self, attr): - cursor_attr = getattr(self.cursor, attr) - if attr in CursorWrapper.WRAP_ERROR_ATTRS: - return self.db.wrap_database_errors(cursor_attr) - else: - return cursor_attr - - def __iter__(self): - with self.db.wrap_database_errors: - yield from self.cursor - - def __enter__(self): - return self - - def __exit__(self, type, value, traceback): - # Close instead of passing through to avoid backend-specific behavior - # (#17671). Catch errors liberally because errors in cleanup code - # aren't useful. - try: - self.close() - except self.db.Database.Error: - pass - - # The following methods cannot be implemented in __getattr__, because the - # code must run when the method is invoked, not just when it is accessed. - - def callproc(self, procname, params=None, kparams=None): - # Keyword parameters for callproc aren't supported in PEP 249, but the - # database driver may support them (e.g. oracledb). - if kparams is not None and not self.db.features.supports_callproc_kwargs: - raise NotSupportedError( - "Keyword parameters for callproc are not supported on this " - "database backend." - ) - # Raise a warning during app initialization (stored_app_configs is only - # ever set during testing). - if not apps.ready and not apps.stored_app_configs: - warnings.warn(self.APPS_NOT_READY_WARNING_MSG, category=RuntimeWarning) - self.db.validate_no_broken_transaction() - with self.db.wrap_database_errors: - if params is None and kparams is None: - return self.cursor.callproc(procname) - elif kparams is None: - return self.cursor.callproc(procname, params) - else: - params = params or () - return self.cursor.callproc(procname, params, kparams) - - def execute(self, sql, params=None): - return self._execute_with_wrappers( - sql, params, many=False, executor=self._execute - ) - - def executemany(self, sql, param_list): - return self._execute_with_wrappers( - sql, param_list, many=True, executor=self._executemany - ) - - def _execute_with_wrappers(self, sql, params, many, executor): - context = {"connection": self.db, "cursor": self} - for wrapper in reversed(self.db.execute_wrappers): - executor = functools.partial(wrapper, executor) - return executor(sql, params, many, context) - - def _execute(self, sql, params, *ignored_wrapper_args): - # Raise a warning during app initialization (stored_app_configs is only - # ever set during testing). - if not apps.ready and not apps.stored_app_configs: - warnings.warn(self.APPS_NOT_READY_WARNING_MSG, category=RuntimeWarning) - self.db.validate_no_broken_transaction() - with self.db.wrap_database_errors: - if params is None: - # params default might be backend specific. - return self.cursor.execute(sql) - else: - return self.cursor.execute(sql, params) - - def _executemany(self, sql, param_list, *ignored_wrapper_args): - # Raise a warning during app initialization (stored_app_configs is only - # ever set during testing). - if not apps.ready and not apps.stored_app_configs: - warnings.warn(self.APPS_NOT_READY_WARNING_MSG, category=RuntimeWarning) - self.db.validate_no_broken_transaction() - with self.db.wrap_database_errors: - return self.cursor.executemany(sql, param_list) - - -class CursorDebugWrapper(CursorWrapper): - # XXX callproc isn't instrumented at this time. - - def execute(self, sql, params=None): - with self.debug_sql(sql, params, use_last_executed_query=True): - return super().execute(sql, params) - - def executemany(self, sql, param_list): - with self.debug_sql(sql, param_list, many=True): - return super().executemany(sql, param_list) - - @contextmanager - def debug_sql( - self, sql=None, params=None, use_last_executed_query=False, many=False - ): - start = time.monotonic() - try: - yield - finally: - stop = time.monotonic() - duration = stop - start - if use_last_executed_query: - sql = self.db.ops.last_executed_query(self.cursor, sql, params) - try: - times = len(params) if many else "" - except TypeError: - # params could be an iterator. - times = "?" - self.db.queries_log.append( - { - "sql": "%s times: %s" % (times, sql) if many else sql, - "time": "%.3f" % duration, - } - ) - logger.debug( - "(%.3f) %s; args=%s; alias=%s", - duration, - sql, - params, - self.db.alias, - extra={ - "duration": duration, - "sql": sql, - "params": params, - "alias": self.db.alias, - }, - ) - - -@contextmanager -def debug_transaction(connection, sql): - start = time.monotonic() - try: - yield - finally: - if connection.queries_logged: - stop = time.monotonic() - duration = stop - start - connection.queries_log.append( - { - "sql": "%s" % sql, - "time": "%.3f" % duration, - } - ) - logger.debug( - "(%.3f) %s; args=%s; alias=%s", - duration, - sql, - None, - connection.alias, - extra={ - "duration": duration, - "sql": sql, - "alias": connection.alias, - }, - ) - - -def split_tzname_delta(tzname): - """ - Split a time zone name into a 3-tuple of (name, sign, offset). - """ - for sign in ["+", "-"]: - if sign in tzname: - name, offset = tzname.rsplit(sign, 1) - if offset and parse_time(offset): - if ":" not in offset: - offset = f"{offset}:00" - return name, sign, offset - return tzname, None, None - - -############################################### -# Converters from database (string) to Python # -############################################### - - -def typecast_date(s): - return ( - datetime.date(*map(int, s.split("-"))) if s else None - ) # return None if s is null - - -def typecast_time(s): # does NOT store time zone information - if not s: - return None - hour, minutes, seconds = s.split(":") - if "." in seconds: # check whether seconds have a fractional part - seconds, microseconds = seconds.split(".") - else: - microseconds = "0" - return datetime.time( - int(hour), int(minutes), int(seconds), int((microseconds + "000000")[:6]) - ) - - -def typecast_timestamp(s): # does NOT store time zone information - # "2005-07-29 15:48:00.590358-05" - # "2005-07-29 09:56:00-05" - if not s: - return None - if " " not in s: - return typecast_date(s) - d, t = s.split() - # Remove timezone information. - if "-" in t: - t, _ = t.split("-", 1) - elif "+" in t: - t, _ = t.split("+", 1) - dates = d.split("-") - times = t.split(":") - seconds = times[2] - if "." in seconds: # check whether seconds have a fractional part - seconds, microseconds = seconds.split(".") - else: - microseconds = "0" - return datetime.datetime( - int(dates[0]), - int(dates[1]), - int(dates[2]), - int(times[0]), - int(times[1]), - int(seconds), - int((microseconds + "000000")[:6]), - ) - - -############################################### -# Converters from Python to database (string) # -############################################### - - -def split_identifier(identifier): - """ - Split an SQL identifier into a two element tuple of (namespace, name). - - The identifier could be a table, column, or sequence name might be prefixed - by a namespace. - """ - try: - namespace, name = identifier.split('"."') - except ValueError: - namespace, name = "", identifier - return namespace.strip('"'), name.strip('"') - - -def truncate_name(identifier, length=None, hash_len=4): - """ - Shorten an SQL identifier to a repeatable mangled version with the given - length. - - If a quote stripped name contains a namespace, e.g. USERNAME"."TABLE, - truncate the table portion only. - """ - namespace, name = split_identifier(identifier) - - if length is None or len(name) <= length: - return identifier - - digest = names_digest(name, length=hash_len) - return "%s%s%s" % ( - '%s"."' % namespace if namespace else "", - name[: length - hash_len], - digest, - ) - - -def names_digest(*args, length): - """ - Generate a 32-bit digest of a set of arguments that can be used to shorten - identifying names. - """ - h = md5(usedforsecurity=False) - for arg in args: - h.update(arg.encode()) - return h.hexdigest()[:length] - - -def format_number(value, max_digits, decimal_places): - """ - Format a number into a string with the requisite number of digits and - decimal places. - """ - if value is None: - return None - context = decimal.getcontext().copy() - if max_digits is not None: - context.prec = max_digits - if decimal_places is not None: - value = value.quantize( - decimal.Decimal(1).scaleb(-decimal_places), context=context - ) - else: - context.traps[decimal.Rounded] = 1 - value = context.create_decimal(value) - return "{:f}".format(value) - - -def strip_quotes(table_name): - """ - Strip quotes off of quoted table names to make them safe for use in index - names, sequence names, etc. For example '"USER"."TABLE"' (an Oracle naming - scheme) becomes 'USER"."TABLE'. - """ - has_quotes = table_name.startswith('"') and table_name.endswith('"') - return table_name[1:-1] if has_quotes else table_name diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/__init__.py b/.venv/lib/python3.10/site-packages/django/db/migrations/__init__.py deleted file mode 100644 index e7f3d2d..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .migration import Migration, swappable_dependency # NOQA -from .operations import * # NOQA diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/autodetector.py b/.venv/lib/python3.10/site-packages/django/db/migrations/autodetector.py deleted file mode 100644 index 934dab2..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/autodetector.py +++ /dev/null @@ -1,1963 +0,0 @@ -import functools -import re -from collections import defaultdict, namedtuple -from enum import Enum -from graphlib import TopologicalSorter -from itertools import chain - -from django.conf import settings -from django.db import models -from django.db.migrations import operations -from django.db.migrations.migration import Migration -from django.db.migrations.operations.models import AlterModelOptions -from django.db.migrations.optimizer import MigrationOptimizer -from django.db.migrations.questioner import MigrationQuestioner -from django.db.migrations.utils import ( - COMPILED_REGEX_TYPE, - RegexObject, - resolve_relation, -) -from django.utils.functional import cached_property - - -class OperationDependency( - namedtuple("OperationDependency", "app_label model_name field_name type") -): - class Type(Enum): - CREATE = 0 - REMOVE = 1 - ALTER = 2 - REMOVE_ORDER_WRT = 3 - ALTER_FOO_TOGETHER = 4 - - @cached_property - def model_name_lower(self): - return self.model_name.lower() - - @cached_property - def field_name_lower(self): - return self.field_name.lower() - - -class MigrationAutodetector: - """ - Take a pair of ProjectStates and compare them to see what the first would - need doing to make it match the second (the second usually being the - project's current state). - - Note that this naturally operates on entire projects at a time, - as it's likely that changes interact (for example, you can't - add a ForeignKey without having a migration to add the table it - depends on first). A user interface may offer single-app usage - if it wishes, with the caveat that it may not always be possible. - """ - - def __init__(self, from_state, to_state, questioner=None): - self.from_state = from_state - self.to_state = to_state - self.questioner = questioner or MigrationQuestioner() - self.existing_apps = {app for app, model in from_state.models} - - def changes(self, graph, trim_to_apps=None, convert_apps=None, migration_name=None): - """ - Main entry point to produce a list of applicable changes. - Take a graph to base names on and an optional set of apps - to try and restrict to (restriction is not guaranteed) - """ - changes = self._detect_changes(convert_apps, graph) - changes = self.arrange_for_graph(changes, graph, migration_name) - if trim_to_apps: - changes = self._trim_to_apps(changes, trim_to_apps) - return changes - - def deep_deconstruct(self, obj): - """ - Recursive deconstruction for a field and its arguments. - Used for full comparison for rename/alter; sometimes a single-level - deconstruction will not compare correctly. - """ - if isinstance(obj, list): - return [self.deep_deconstruct(value) for value in obj] - elif isinstance(obj, tuple): - return tuple(self.deep_deconstruct(value) for value in obj) - elif isinstance(obj, dict): - return {key: self.deep_deconstruct(value) for key, value in obj.items()} - elif isinstance(obj, functools.partial): - return ( - obj.func, - self.deep_deconstruct(obj.args), - self.deep_deconstruct(obj.keywords), - ) - elif isinstance(obj, COMPILED_REGEX_TYPE): - return RegexObject(obj) - elif isinstance(obj, type): - # If this is a type that implements 'deconstruct' as an instance method, - # avoid treating this as being deconstructible itself - see #22951 - return obj - elif hasattr(obj, "deconstruct"): - deconstructed = obj.deconstruct() - if isinstance(obj, models.Field): - # we have a field which also returns a name - deconstructed = deconstructed[1:] - path, args, kwargs = deconstructed - return ( - path, - [self.deep_deconstruct(value) for value in args], - {key: self.deep_deconstruct(value) for key, value in kwargs.items()}, - ) - else: - return obj - - def only_relation_agnostic_fields(self, fields): - """ - Return a definition of the fields that ignores field names and - what related fields actually relate to. Used for detecting renames (as - the related fields change during renames). - """ - fields_def = [] - for name, field in sorted(fields.items()): - deconstruction = self.deep_deconstruct(field) - if field.remote_field and field.remote_field.model: - deconstruction[2].pop("to", None) - fields_def.append(deconstruction) - return fields_def - - def _detect_changes(self, convert_apps=None, graph=None): - """ - Return a dict of migration plans which will achieve the - change from from_state to to_state. The dict has app labels - as keys and a list of migrations as values. - - The resulting migrations aren't specially named, but the names - do matter for dependencies inside the set. - - convert_apps is the list of apps to convert to use migrations - (i.e. to make initial migrations for, in the usual case) - - graph is an optional argument that, if provided, can help improve - dependency generation and avoid potential circular dependencies. - """ - # The first phase is generating all the operations for each app - # and gathering them into a big per-app list. - # Then go through that list, order it, and split into migrations to - # resolve dependencies caused by M2Ms and FKs. - self.generated_operations = {} - self.altered_indexes = {} - self.altered_constraints = {} - self.renamed_fields = {} - - # Prepare some old/new state and model lists, separating - # proxy models and ignoring unmigrated apps. - self.old_model_keys = set() - self.old_proxy_keys = set() - self.old_unmanaged_keys = set() - self.new_model_keys = set() - self.new_proxy_keys = set() - self.new_unmanaged_keys = set() - for (app_label, model_name), model_state in self.from_state.models.items(): - if not model_state.options.get("managed", True): - self.old_unmanaged_keys.add((app_label, model_name)) - elif app_label not in self.from_state.real_apps: - if model_state.options.get("proxy"): - self.old_proxy_keys.add((app_label, model_name)) - else: - self.old_model_keys.add((app_label, model_name)) - - for (app_label, model_name), model_state in self.to_state.models.items(): - if not model_state.options.get("managed", True): - self.new_unmanaged_keys.add((app_label, model_name)) - elif app_label not in self.from_state.real_apps or ( - convert_apps and app_label in convert_apps - ): - if model_state.options.get("proxy"): - self.new_proxy_keys.add((app_label, model_name)) - else: - self.new_model_keys.add((app_label, model_name)) - - self.from_state.resolve_fields_and_relations() - self.to_state.resolve_fields_and_relations() - - # Renames have to come first - self.generate_renamed_models() - - # Prepare lists of fields and generate through model map - self._prepare_field_lists() - self._generate_through_model_map() - - # Generate non-rename model operations - self.generate_deleted_models() - self.generate_created_models() - self.generate_deleted_proxies() - self.generate_created_proxies() - self.generate_altered_options() - self.generate_altered_managers() - self.generate_altered_db_table_comment() - - # Create the renamed fields and store them in self.renamed_fields. - # They are used by create_altered_indexes(), generate_altered_fields(), - # generate_removed_altered_index/unique_together(), and - # generate_altered_index/unique_together(). - self.create_renamed_fields() - # Create the altered indexes and store them in self.altered_indexes. - # This avoids the same computation in generate_removed_indexes() - # and generate_added_indexes(). - self.create_altered_indexes() - self.create_altered_constraints() - # Generate index removal operations before field is removed - self.generate_removed_constraints() - self.generate_removed_indexes() - # Generate field renaming operations. - self.generate_renamed_fields() - self.generate_renamed_indexes() - # Generate removal of foo together. - self.generate_removed_altered_unique_together() - # Generate field operations. - self.generate_removed_fields() - self.generate_added_fields() - self.generate_altered_fields() - self.generate_altered_order_with_respect_to() - self.generate_altered_unique_together() - self.generate_added_indexes() - self.generate_added_constraints() - self.generate_altered_constraints() - self.generate_altered_db_table() - - self._sort_migrations() - self._build_migration_list(graph) - self._optimize_migrations() - - return self.migrations - - def _prepare_field_lists(self): - """ - Prepare field lists and a list of the fields that used through models - in the old state so dependencies can be made from the through model - deletion to the field that uses it. - """ - self.kept_model_keys = self.old_model_keys & self.new_model_keys - self.kept_proxy_keys = self.old_proxy_keys & self.new_proxy_keys - self.kept_unmanaged_keys = self.old_unmanaged_keys & self.new_unmanaged_keys - self.through_users = {} - self.old_field_keys = { - (app_label, model_name, field_name) - for app_label, model_name in self.kept_model_keys - for field_name in self.from_state.models[ - app_label, self.renamed_models.get((app_label, model_name), model_name) - ].fields - } - self.new_field_keys = { - (app_label, model_name, field_name) - for app_label, model_name in self.kept_model_keys - for field_name in self.to_state.models[app_label, model_name].fields - } - - def _generate_through_model_map(self): - """Through model map generation.""" - for app_label, model_name in sorted(self.old_model_keys): - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_model_state = self.from_state.models[app_label, old_model_name] - for field_name, field in old_model_state.fields.items(): - if hasattr(field, "remote_field") and getattr( - field.remote_field, "through", None - ): - through_key = resolve_relation( - field.remote_field.through, app_label, model_name - ) - self.through_users[through_key] = ( - app_label, - old_model_name, - field_name, - ) - - @staticmethod - def _resolve_dependency(dependency): - """ - Return the resolved dependency and a boolean denoting whether or not - it was swappable. - """ - if dependency.app_label != "__setting__": - return dependency, False - resolved_app_label, resolved_object_name = getattr( - settings, dependency.model_name - ).split(".") - return ( - OperationDependency( - resolved_app_label, - resolved_object_name.lower(), - dependency.field_name, - dependency.type, - ), - True, - ) - - def _build_migration_list(self, graph=None): - """ - Chop the lists of operations up into migrations with dependencies on - each other. Do this by going through an app's list of operations until - one is found that has an outgoing dependency that isn't in another - app's migration yet (hasn't been chopped off its list). Then chop off - the operations before it into a migration and move onto the next app. - If the loops completes without doing anything, there's a circular - dependency (which _should_ be impossible as the operations are - all split at this point so they can't depend and be depended on). - """ - self.migrations = {} - num_ops = sum(len(x) for x in self.generated_operations.values()) - chop_mode = False - while num_ops: - # On every iteration, we step through all the apps and see if there - # is a completed set of operations. - # If we find that a subset of the operations are complete we can - # try to chop it off from the rest and continue, but we only - # do this if we've already been through the list once before - # without any chopping and nothing has changed. - for app_label in sorted(self.generated_operations): - chopped = [] - dependencies = set() - for operation in list(self.generated_operations[app_label]): - deps_satisfied = True - operation_dependencies = set() - for dep in operation._auto_deps: - # Temporarily resolve the swappable dependency to - # prevent circular references. While keeping the - # dependency checks on the resolved model, add the - # swappable dependencies. - original_dep = dep - dep, is_swappable_dep = self._resolve_dependency(dep) - if dep.app_label != app_label: - # External app dependency. See if it's not yet - # satisfied. - for other_operation in self.generated_operations.get( - dep.app_label, [] - ): - if self.check_dependency(other_operation, dep): - deps_satisfied = False - break - if not deps_satisfied: - break - else: - if is_swappable_dep: - operation_dependencies.add( - ( - original_dep.app_label, - original_dep.model_name, - ) - ) - elif dep.app_label in self.migrations: - operation_dependencies.add( - ( - dep.app_label, - self.migrations[dep.app_label][-1].name, - ) - ) - else: - # If we can't find the other app, we add a - # first/last dependency, but only if we've - # already been through once and checked - # everything. - if chop_mode: - # If the app already exists, we add a - # dependency on the last migration, as - # we don't know which migration - # contains the target field. If it's - # not yet migrated or has no - # migrations, we use __first__. - if graph and graph.leaf_nodes(dep.app_label): - operation_dependencies.add( - graph.leaf_nodes(dep.app_label)[0] - ) - else: - operation_dependencies.add( - (dep.app_label, "__first__") - ) - else: - deps_satisfied = False - if deps_satisfied: - chopped.append(operation) - dependencies.update(operation_dependencies) - del self.generated_operations[app_label][0] - else: - break - # Make a migration! Well, only if there's stuff to put in it - if dependencies or chopped: - if not self.generated_operations[app_label] or chop_mode: - subclass = type( - "Migration", - (Migration,), - {"operations": [], "dependencies": []}, - ) - instance = subclass( - "auto_%i" % (len(self.migrations.get(app_label, [])) + 1), - app_label, - ) - instance.dependencies = list(dependencies) - instance.operations = chopped - instance.initial = app_label not in self.existing_apps - self.migrations.setdefault(app_label, []).append(instance) - chop_mode = False - else: - self.generated_operations[app_label] = ( - chopped + self.generated_operations[app_label] - ) - new_num_ops = sum(len(x) for x in self.generated_operations.values()) - if new_num_ops == num_ops: - if not chop_mode: - chop_mode = True - else: - raise ValueError( - "Cannot resolve operation dependencies: %r" - % self.generated_operations - ) - num_ops = new_num_ops - - def _sort_migrations(self): - """ - Reorder to make things possible. Reordering may be needed so FKs work - nicely inside the same app. - """ - for app_label, ops in sorted(self.generated_operations.items()): - ts = TopologicalSorter() - for op in ops: - ts.add(op) - for dep in op._auto_deps: - # Resolve intra-app dependencies to handle circular - # references involving a swappable model. - dep = self._resolve_dependency(dep)[0] - if dep.app_label != app_label: - continue - ts.add(op, *(x for x in ops if self.check_dependency(x, dep))) - self.generated_operations[app_label] = list(ts.static_order()) - - def _optimize_migrations(self): - # Add in internal dependencies among the migrations - for app_label, migrations in self.migrations.items(): - for m1, m2 in zip(migrations, migrations[1:]): - m2.dependencies.append((app_label, m1.name)) - - # De-dupe dependencies - for migrations in self.migrations.values(): - for migration in migrations: - migration.dependencies = list(set(migration.dependencies)) - - # Optimize migrations - for app_label, migrations in self.migrations.items(): - for migration in migrations: - migration.operations = MigrationOptimizer().optimize( - migration.operations, app_label - ) - - def check_dependency(self, operation, dependency): - """ - Return True if the given operation depends on the given dependency, - False otherwise. - """ - # Created model - if ( - dependency.field_name is None - and dependency.type == OperationDependency.Type.CREATE - ): - return ( - isinstance(operation, operations.CreateModel) - and operation.name_lower == dependency.model_name_lower - ) - # Created field - elif ( - dependency.field_name is not None - and dependency.type == OperationDependency.Type.CREATE - ): - return ( - isinstance(operation, operations.CreateModel) - and operation.name_lower == dependency.model_name_lower - and any(dependency.field_name == x for x, y in operation.fields) - ) or ( - isinstance(operation, operations.AddField) - and operation.model_name_lower == dependency.model_name_lower - and operation.name_lower == dependency.field_name_lower - ) - # Removed field - elif ( - dependency.field_name is not None - and dependency.type == OperationDependency.Type.REMOVE - ): - return ( - isinstance(operation, operations.RemoveField) - and operation.model_name_lower == dependency.model_name_lower - and operation.name_lower == dependency.field_name_lower - ) - # Removed model - elif ( - dependency.field_name is None - and dependency.type == OperationDependency.Type.REMOVE - ): - return ( - isinstance(operation, operations.DeleteModel) - and operation.name_lower == dependency.model_name_lower - ) - # Field being altered - elif ( - dependency.field_name is not None - and dependency.type == OperationDependency.Type.ALTER - ): - return ( - isinstance(operation, operations.AlterField) - and operation.model_name_lower == dependency.model_name_lower - and operation.name_lower == dependency.field_name_lower - ) - # order_with_respect_to being unset for a field - elif ( - dependency.field_name is not None - and dependency.type == OperationDependency.Type.REMOVE_ORDER_WRT - ): - return ( - isinstance(operation, operations.AlterOrderWithRespectTo) - and operation.name_lower == dependency.model_name_lower - and (operation.order_with_respect_to or "").lower() - != dependency.field_name_lower - ) - # Field is removed and part of an index/unique_together - elif ( - dependency.field_name is not None - and dependency.type == OperationDependency.Type.ALTER_FOO_TOGETHER - ): - return ( - isinstance( - operation, - (operations.AlterUniqueTogether, operations.AlterIndexTogether), - ) - and operation.name_lower == dependency.model_name_lower - ) - # Unknown dependency. Raise an error. - else: - raise ValueError("Can't handle dependency %r" % (dependency,)) - - def add_operation(self, app_label, operation, dependencies=None, beginning=False): - # Dependencies are - # (app_label, model_name, field_name, create/delete as True/False) - operation._auto_deps = dependencies or [] - if beginning: - self.generated_operations.setdefault(app_label, []).insert(0, operation) - else: - self.generated_operations.setdefault(app_label, []).append(operation) - - def swappable_first_key(self, item): - """ - Place potential swappable models first in lists of created models (only - real way to solve #22783). - """ - try: - model_state = self.to_state.models[item] - base_names = { - base if isinstance(base, str) else base.__name__ - for base in model_state.bases - } - string_version = "%s.%s" % (item[0], item[1]) - if ( - model_state.options.get("swappable") - or "AbstractUser" in base_names - or "AbstractBaseUser" in base_names - or settings.AUTH_USER_MODEL.lower() == string_version.lower() - ): - return ("___" + item[0], "___" + item[1]) - except LookupError: - pass - return item - - def generate_renamed_models(self): - """ - Find any renamed models, generate the operations for them, and remove - the old entry from the model lists. Must be run before other - model-level generation. - """ - self.renamed_models = {} - self.renamed_models_rel = {} - added_models = self.new_model_keys - self.old_model_keys - for app_label, model_name in sorted(added_models): - model_state = self.to_state.models[app_label, model_name] - model_fields_def = self.only_relation_agnostic_fields(model_state.fields) - - removed_models = self.old_model_keys - self.new_model_keys - for rem_app_label, rem_model_name in removed_models: - if rem_app_label == app_label: - rem_model_state = self.from_state.models[ - rem_app_label, rem_model_name - ] - rem_model_fields_def = self.only_relation_agnostic_fields( - rem_model_state.fields - ) - if model_fields_def == rem_model_fields_def: - if self.questioner.ask_rename_model( - rem_model_state, model_state - ): - dependencies = [] - fields = list(model_state.fields.values()) + [ - field.remote_field - for relations in self.to_state.relations[ - app_label, model_name - ].values() - for field in relations.values() - ] - for field in fields: - if field.is_relation: - dependencies.extend( - self._get_dependencies_for_foreign_key( - app_label, - model_name, - field, - self.to_state, - ) - ) - self.add_operation( - app_label, - operations.RenameModel( - old_name=rem_model_state.name, - new_name=model_state.name, - ), - dependencies=dependencies, - ) - self.renamed_models[app_label, model_name] = rem_model_name - renamed_models_rel_key = "%s.%s" % ( - rem_model_state.app_label, - rem_model_state.name_lower, - ) - self.renamed_models_rel[renamed_models_rel_key] = ( - "%s.%s" - % ( - model_state.app_label, - model_state.name_lower, - ) - ) - self.old_model_keys.remove((rem_app_label, rem_model_name)) - self.old_model_keys.add((app_label, model_name)) - break - - def generate_created_models(self): - """ - Find all new models (both managed and unmanaged) and make create - operations for them as well as separate operations to create any - foreign key or M2M relationships (these are optimized later, if - possible). - - Defer any model options that refer to collections of fields that might - be deferred (e.g. unique_together). - """ - old_keys = self.old_model_keys | self.old_unmanaged_keys - added_models = self.new_model_keys - old_keys - added_unmanaged_models = self.new_unmanaged_keys - old_keys - all_added_models = chain( - sorted(added_models, key=self.swappable_first_key, reverse=True), - sorted(added_unmanaged_models, key=self.swappable_first_key, reverse=True), - ) - for app_label, model_name in all_added_models: - model_state = self.to_state.models[app_label, model_name] - # Gather related fields - related_fields = {} - primary_key_rel = None - for field_name, field in model_state.fields.items(): - if field.remote_field: - if field.remote_field.model: - if field.primary_key: - primary_key_rel = field.remote_field.model - elif not field.remote_field.parent_link: - related_fields[field_name] = field - if getattr(field.remote_field, "through", None): - related_fields[field_name] = field - - # Are there indexes/unique_together to defer? - indexes = model_state.options.pop("indexes") - constraints = model_state.options.pop("constraints") - unique_together = model_state.options.pop("unique_together", None) - order_with_respect_to = model_state.options.pop( - "order_with_respect_to", None - ) - # Depend on the deletion of any possible proxy version of us - dependencies = [ - OperationDependency( - app_label, model_name, None, OperationDependency.Type.REMOVE - ), - ] - # Depend on all bases - for base in model_state.bases: - if isinstance(base, str) and "." in base: - base_app_label, base_name = base.split(".", 1) - dependencies.append( - OperationDependency( - base_app_label, - base_name, - None, - OperationDependency.Type.CREATE, - ) - ) - # Depend on the removal of base fields if the new model has - # a field with the same name. - old_base_model_state = self.from_state.models.get( - (base_app_label, base_name) - ) - new_base_model_state = self.to_state.models.get( - (base_app_label, base_name) - ) - if old_base_model_state and new_base_model_state: - removed_base_fields = ( - set(old_base_model_state.fields) - .difference( - new_base_model_state.fields, - ) - .intersection(model_state.fields) - ) - for removed_base_field in removed_base_fields: - dependencies.append( - OperationDependency( - base_app_label, - base_name, - removed_base_field, - OperationDependency.Type.REMOVE, - ) - ) - # Depend on the other end of the primary key if it's a relation - if primary_key_rel: - dependencies.append( - OperationDependency( - *resolve_relation(primary_key_rel, app_label, model_name), - None, - OperationDependency.Type.CREATE, - ), - ) - # Generate creation operation - self.add_operation( - app_label, - operations.CreateModel( - name=model_state.name, - fields=[ - d - for d in model_state.fields.items() - if d[0] not in related_fields - ], - options=model_state.options, - bases=model_state.bases, - managers=model_state.managers, - ), - dependencies=dependencies, - beginning=True, - ) - - # Don't add operations which modify the database for unmanaged models - if not model_state.options.get("managed", True): - continue - - # Generate operations for each related field - for name, field in sorted(related_fields.items()): - dependencies = self._get_dependencies_for_foreign_key( - app_label, - model_name, - field, - self.to_state, - ) - # Depend on our own model being created - dependencies.append( - OperationDependency( - app_label, model_name, None, OperationDependency.Type.CREATE - ) - ) - # Make operation - self.add_operation( - app_label, - operations.AddField( - model_name=model_name, - name=name, - field=field, - ), - dependencies=list(set(dependencies)), - ) - # Generate other opns - if order_with_respect_to: - self.add_operation( - app_label, - operations.AlterOrderWithRespectTo( - name=model_name, - order_with_respect_to=order_with_respect_to, - ), - dependencies=[ - OperationDependency( - app_label, - model_name, - order_with_respect_to, - OperationDependency.Type.CREATE, - ), - OperationDependency( - app_label, model_name, None, OperationDependency.Type.CREATE - ), - ], - ) - related_dependencies = [ - OperationDependency( - app_label, model_name, name, OperationDependency.Type.CREATE - ) - for name in sorted(related_fields) - ] - related_dependencies.append( - OperationDependency( - app_label, model_name, None, OperationDependency.Type.CREATE - ) - ) - for index in indexes: - self.add_operation( - app_label, - operations.AddIndex( - model_name=model_name, - index=index, - ), - dependencies=related_dependencies, - ) - for constraint in constraints: - self.add_operation( - app_label, - operations.AddConstraint( - model_name=model_name, - constraint=constraint, - ), - dependencies=related_dependencies, - ) - if unique_together: - self.add_operation( - app_label, - operations.AlterUniqueTogether( - name=model_name, - unique_together=unique_together, - ), - dependencies=related_dependencies, - ) - # Fix relationships if the model changed from a proxy model to a - # concrete model. - relations = self.to_state.relations - if (app_label, model_name) in self.old_proxy_keys: - for related_model_key, related_fields in relations[ - app_label, model_name - ].items(): - related_model_state = self.to_state.models[related_model_key] - for related_field_name, related_field in related_fields.items(): - self.add_operation( - related_model_state.app_label, - operations.AlterField( - model_name=related_model_state.name, - name=related_field_name, - field=related_field, - ), - dependencies=[ - OperationDependency( - app_label, - model_name, - None, - OperationDependency.Type.CREATE, - ) - ], - ) - - def generate_created_proxies(self): - """ - Make CreateModel statements for proxy models. Use the same statements - as that way there's less code duplication, but for proxy models it's - safe to skip all the pointless field stuff and chuck out an operation. - """ - added = self.new_proxy_keys - self.old_proxy_keys - for app_label, model_name in sorted(added): - model_state = self.to_state.models[app_label, model_name] - assert model_state.options.get("proxy") - # Depend on the deletion of any possible non-proxy version of us - dependencies = [ - OperationDependency( - app_label, model_name, None, OperationDependency.Type.REMOVE - ), - ] - # Depend on all bases - for base in model_state.bases: - if isinstance(base, str) and "." in base: - base_app_label, base_name = base.split(".", 1) - dependencies.append( - OperationDependency( - base_app_label, - base_name, - None, - OperationDependency.Type.CREATE, - ) - ) - # Generate creation operation - self.add_operation( - app_label, - operations.CreateModel( - name=model_state.name, - fields=[], - options=model_state.options, - bases=model_state.bases, - managers=model_state.managers, - ), - # Depend on the deletion of any possible non-proxy version of us - dependencies=dependencies, - ) - - def generate_deleted_models(self): - """ - Find all deleted models (managed and unmanaged) and make delete - operations for them as well as separate operations to delete any - foreign key or M2M relationships (these are optimized later, if - possible). - - Also bring forward removal of any model options that refer to - collections of fields - the inverse of generate_created_models(). - """ - new_keys = self.new_model_keys | self.new_unmanaged_keys - deleted_models = self.old_model_keys - new_keys - deleted_unmanaged_models = self.old_unmanaged_keys - new_keys - all_deleted_models = chain( - sorted(deleted_models), sorted(deleted_unmanaged_models) - ) - for app_label, model_name in all_deleted_models: - model_state = self.from_state.models[app_label, model_name] - # Gather related fields - related_fields = {} - for field_name, field in model_state.fields.items(): - if field.remote_field: - if field.remote_field.model: - related_fields[field_name] = field - if getattr(field.remote_field, "through", None): - related_fields[field_name] = field - # Generate option removal first - unique_together = model_state.options.pop("unique_together", None) - if unique_together: - self.add_operation( - app_label, - operations.AlterUniqueTogether( - name=model_name, - unique_together=None, - ), - ) - # Then remove each related field - for name in sorted(related_fields): - self.add_operation( - app_label, - operations.RemoveField( - model_name=model_name, - name=name, - ), - ) - # Finally, remove the model. - # This depends on both the removal/alteration of all incoming fields - # and the removal of all its own related fields, and if it's - # a through model the field that references it. - dependencies = [] - relations = self.from_state.relations - for ( - related_object_app_label, - object_name, - ), relation_related_fields in relations[app_label, model_name].items(): - for field_name, field in relation_related_fields.items(): - dependencies.append( - OperationDependency( - related_object_app_label, - object_name, - field_name, - OperationDependency.Type.REMOVE, - ), - ) - if not field.many_to_many: - dependencies.append( - OperationDependency( - related_object_app_label, - object_name, - field_name, - OperationDependency.Type.ALTER, - ), - ) - - for name in sorted(related_fields): - dependencies.append( - OperationDependency( - app_label, model_name, name, OperationDependency.Type.REMOVE - ) - ) - # We're referenced in another field's through= - through_user = self.through_users.get((app_label, model_state.name_lower)) - if through_user: - dependencies.append( - OperationDependency(*through_user, OperationDependency.Type.REMOVE), - ) - # Finally, make the operation, deduping any dependencies - self.add_operation( - app_label, - operations.DeleteModel( - name=model_state.name, - ), - dependencies=list(set(dependencies)), - ) - - def generate_deleted_proxies(self): - """Make DeleteModel options for proxy models.""" - deleted = self.old_proxy_keys - self.new_proxy_keys - for app_label, model_name in sorted(deleted): - model_state = self.from_state.models[app_label, model_name] - assert model_state.options.get("proxy") - self.add_operation( - app_label, - operations.DeleteModel( - name=model_state.name, - ), - ) - - def create_renamed_fields(self): - """Work out renamed fields.""" - self.renamed_operations = [] - old_field_keys = self.old_field_keys.copy() - for app_label, model_name, field_name in sorted( - self.new_field_keys - old_field_keys - ): - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_model_state = self.from_state.models[app_label, old_model_name] - new_model_state = self.to_state.models[app_label, model_name] - field = new_model_state.get_field(field_name) - # Scan to see if this is actually a rename! - field_dec = self.deep_deconstruct(field) - for rem_app_label, rem_model_name, rem_field_name in sorted( - old_field_keys - self.new_field_keys - ): - if rem_app_label == app_label and rem_model_name == model_name: - old_field = old_model_state.get_field(rem_field_name) - old_field_dec = self.deep_deconstruct(old_field) - if ( - field.remote_field - and field.remote_field.model - and "to" in old_field_dec[2] - ): - old_rel_to = old_field_dec[2]["to"] - if old_rel_to in self.renamed_models_rel: - old_field_dec[2]["to"] = self.renamed_models_rel[old_rel_to] - old_field.set_attributes_from_name(rem_field_name) - old_db_column = old_field.get_attname_column()[1] - if old_field_dec == field_dec or ( - # Was the field renamed and db_column equal to the - # old field's column added? - old_field_dec[0:2] == field_dec[0:2] - and dict(old_field_dec[2], db_column=old_db_column) - == field_dec[2] - ): - if self.questioner.ask_rename( - model_name, rem_field_name, field_name, field - ): - self.renamed_operations.append( - ( - rem_app_label, - rem_model_name, - old_field.db_column, - rem_field_name, - app_label, - model_name, - field, - field_name, - ) - ) - old_field_keys.remove( - (rem_app_label, rem_model_name, rem_field_name) - ) - old_field_keys.add((app_label, model_name, field_name)) - self.renamed_fields[app_label, model_name, field_name] = ( - rem_field_name - ) - break - - def generate_renamed_fields(self): - """Generate RenameField operations.""" - for ( - rem_app_label, - rem_model_name, - rem_db_column, - rem_field_name, - app_label, - model_name, - field, - field_name, - ) in self.renamed_operations: - # A db_column mismatch requires a prior noop AlterField for the - # subsequent RenameField to be a noop on attempts at preserving the - # old name. - if rem_db_column != field.db_column: - altered_field = field.clone() - altered_field.name = rem_field_name - self.add_operation( - app_label, - operations.AlterField( - model_name=model_name, - name=rem_field_name, - field=altered_field, - ), - ) - self.add_operation( - app_label, - operations.RenameField( - model_name=model_name, - old_name=rem_field_name, - new_name=field_name, - ), - ) - self.old_field_keys.remove((rem_app_label, rem_model_name, rem_field_name)) - self.old_field_keys.add((app_label, model_name, field_name)) - - def generate_added_fields(self): - """Make AddField operations.""" - for app_label, model_name, field_name in sorted( - self.new_field_keys - self.old_field_keys - ): - self._generate_added_field(app_label, model_name, field_name) - - def _generate_added_field(self, app_label, model_name, field_name): - field = self.to_state.models[app_label, model_name].get_field(field_name) - # Adding a field always depends at least on its removal. - dependencies = [ - OperationDependency( - app_label, model_name, field_name, OperationDependency.Type.REMOVE - ) - ] - # Fields that are foreignkeys/m2ms depend on stuff. - if field.remote_field and field.remote_field.model: - dependencies.extend( - self._get_dependencies_for_foreign_key( - app_label, - model_name, - field, - self.to_state, - ) - ) - if field.generated: - dependencies.extend(self._get_dependencies_for_generated_field(field)) - # You can't just add NOT NULL fields with no default or fields - # which don't allow empty strings as default. - time_fields = (models.DateField, models.DateTimeField, models.TimeField) - auto_fields = (models.AutoField, models.SmallAutoField, models.BigAutoField) - preserve_default = ( - field.null - or field.has_default() - or field.has_db_default() - or field.many_to_many - or (field.blank and field.empty_strings_allowed) - or (isinstance(field, time_fields) and field.auto_now) - or (isinstance(field, auto_fields)) - ) - if not preserve_default: - field = field.clone() - if isinstance(field, time_fields) and field.auto_now_add: - field.default = self.questioner.ask_auto_now_add_addition( - field_name, model_name - ) - else: - field.default = self.questioner.ask_not_null_addition( - field_name, model_name - ) - if field.unique and field.has_default() and callable(field.default): - self.questioner.ask_unique_callable_default_addition(field_name, model_name) - self.add_operation( - app_label, - operations.AddField( - model_name=model_name, - name=field_name, - field=field, - preserve_default=preserve_default, - ), - dependencies=dependencies, - ) - - def generate_removed_fields(self): - """Make RemoveField operations.""" - for app_label, model_name, field_name in sorted( - self.old_field_keys - self.new_field_keys - ): - self._generate_removed_field(app_label, model_name, field_name) - - def _generate_removed_field(self, app_label, model_name, field_name): - self.add_operation( - app_label, - operations.RemoveField( - model_name=model_name, - name=field_name, - ), - # We might need to depend on the removal of an - # order_with_respect_to or index/unique_together operation; - # this is safely ignored if there isn't one - dependencies=[ - OperationDependency( - app_label, - model_name, - field_name, - OperationDependency.Type.REMOVE_ORDER_WRT, - ), - OperationDependency( - app_label, - model_name, - field_name, - OperationDependency.Type.ALTER_FOO_TOGETHER, - ), - ], - ) - - def generate_altered_fields(self): - """ - Make AlterField operations, or possibly RemovedField/AddField if alter - isn't possible. - """ - for app_label, model_name, field_name in sorted( - self.old_field_keys & self.new_field_keys - ): - # Did the field change? - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_field_name = self.renamed_fields.get( - (app_label, model_name, field_name), field_name - ) - old_field = self.from_state.models[app_label, old_model_name].get_field( - old_field_name - ) - new_field = self.to_state.models[app_label, model_name].get_field( - field_name - ) - dependencies = [] - # Implement any model renames on relations; these are handled by RenameModel - # so we need to exclude them from the comparison - if hasattr(new_field, "remote_field") and getattr( - new_field.remote_field, "model", None - ): - rename_key = resolve_relation( - new_field.remote_field.model, app_label, model_name - ) - if rename_key in self.renamed_models: - new_field.remote_field.model = old_field.remote_field.model - # Handle ForeignKey which can only have a single to_field. - remote_field_name = getattr(new_field.remote_field, "field_name", None) - if remote_field_name: - to_field_rename_key = rename_key + (remote_field_name,) - if to_field_rename_key in self.renamed_fields: - # Repoint both model and field name because to_field - # inclusion in ForeignKey.deconstruct() is based on - # both. - new_field.remote_field.model = old_field.remote_field.model - new_field.remote_field.field_name = ( - old_field.remote_field.field_name - ) - # Handle ForeignObjects which can have multiple from_fields/to_fields. - from_fields = getattr(new_field, "from_fields", None) - if from_fields: - from_rename_key = (app_label, model_name) - new_field.from_fields = tuple( - [ - self.renamed_fields.get( - from_rename_key + (from_field,), from_field - ) - for from_field in from_fields - ] - ) - new_field.to_fields = tuple( - [ - self.renamed_fields.get(rename_key + (to_field,), to_field) - for to_field in new_field.to_fields - ] - ) - if old_from_fields := getattr(old_field, "from_fields", None): - old_field.from_fields = tuple(old_from_fields) - old_field.to_fields = tuple(old_field.to_fields) - dependencies.extend( - self._get_dependencies_for_foreign_key( - app_label, - model_name, - new_field, - self.to_state, - ) - ) - if hasattr(new_field, "remote_field") and getattr( - new_field.remote_field, "through", None - ): - rename_key = resolve_relation( - new_field.remote_field.through, app_label, model_name - ) - if rename_key in self.renamed_models: - new_field.remote_field.through = old_field.remote_field.through - old_field_dec = self.deep_deconstruct(old_field) - new_field_dec = self.deep_deconstruct(new_field) - # If the field was confirmed to be renamed it means that only - # db_column was allowed to change which generate_renamed_fields() - # already accounts for by adding an AlterField operation. - if old_field_dec != new_field_dec and old_field_name == field_name: - both_m2m = old_field.many_to_many and new_field.many_to_many - neither_m2m = not old_field.many_to_many and not new_field.many_to_many - if both_m2m or neither_m2m: - # Either both fields are m2m or neither is - preserve_default = True - if ( - old_field.null - and not new_field.null - and not new_field.has_default() - and not new_field.has_db_default() - and not new_field.many_to_many - ): - field = new_field.clone() - new_default = self.questioner.ask_not_null_alteration( - field_name, model_name - ) - if new_default is not models.NOT_PROVIDED: - field.default = new_default - preserve_default = False - else: - field = new_field - self.add_operation( - app_label, - operations.AlterField( - model_name=model_name, - name=field_name, - field=field, - preserve_default=preserve_default, - ), - dependencies=dependencies, - ) - else: - # We cannot alter between m2m and concrete fields - self._generate_removed_field(app_label, model_name, field_name) - self._generate_added_field(app_label, model_name, field_name) - - def create_altered_indexes(self): - option_name = operations.AddIndex.option_name - self.renamed_index_together_values = defaultdict(list) - - for app_label, model_name in sorted(self.kept_model_keys): - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_model_state = self.from_state.models[app_label, old_model_name] - new_model_state = self.to_state.models[app_label, model_name] - - old_indexes = old_model_state.options[option_name] - new_indexes = new_model_state.options[option_name] - added_indexes = [idx for idx in new_indexes if idx not in old_indexes] - removed_indexes = [idx for idx in old_indexes if idx not in new_indexes] - renamed_indexes = [] - # Find renamed indexes. - remove_from_added = [] - remove_from_removed = [] - for new_index in added_indexes: - new_index_dec = new_index.deconstruct() - new_index_name = new_index_dec[2].pop("name") - for old_index in removed_indexes: - old_index_dec = old_index.deconstruct() - old_index_name = old_index_dec[2].pop("name") - # Indexes are the same except for the names. - if ( - new_index_dec == old_index_dec - and new_index_name != old_index_name - ): - renamed_indexes.append((old_index_name, new_index_name, None)) - remove_from_added.append(new_index) - remove_from_removed.append(old_index) - # Find index_together changed to indexes. - for ( - old_value, - new_value, - index_together_app_label, - index_together_model_name, - dependencies, - ) in self._get_altered_foo_together_operations( - operations.AlterIndexTogether.option_name - ): - if ( - app_label != index_together_app_label - or model_name != index_together_model_name - ): - continue - removed_values = old_value.difference(new_value) - for removed_index_together in removed_values: - renamed_index_together_indexes = [] - for new_index in added_indexes: - _, args, kwargs = new_index.deconstruct() - # Ensure only 'fields' are defined in the Index. - if ( - not args - and new_index.fields == list(removed_index_together) - and set(kwargs) == {"name", "fields"} - ): - renamed_index_together_indexes.append(new_index) - - if len(renamed_index_together_indexes) == 1: - renamed_index = renamed_index_together_indexes[0] - remove_from_added.append(renamed_index) - renamed_indexes.append( - (None, renamed_index.name, removed_index_together) - ) - self.renamed_index_together_values[ - index_together_app_label, index_together_model_name - ].append(removed_index_together) - # Remove renamed indexes from the lists of added and removed - # indexes. - added_indexes = [ - idx for idx in added_indexes if idx not in remove_from_added - ] - removed_indexes = [ - idx for idx in removed_indexes if idx not in remove_from_removed - ] - - self.altered_indexes.update( - { - (app_label, model_name): { - "added_indexes": added_indexes, - "removed_indexes": removed_indexes, - "renamed_indexes": renamed_indexes, - } - } - ) - - def generate_added_indexes(self): - for (app_label, model_name), alt_indexes in self.altered_indexes.items(): - dependencies = self._get_dependencies_for_model(app_label, model_name) - for index in alt_indexes["added_indexes"]: - self.add_operation( - app_label, - operations.AddIndex( - model_name=model_name, - index=index, - ), - dependencies=dependencies, - ) - - def generate_removed_indexes(self): - for (app_label, model_name), alt_indexes in self.altered_indexes.items(): - for index in alt_indexes["removed_indexes"]: - self.add_operation( - app_label, - operations.RemoveIndex( - model_name=model_name, - name=index.name, - ), - ) - - def generate_renamed_indexes(self): - for (app_label, model_name), alt_indexes in self.altered_indexes.items(): - for old_index_name, new_index_name, old_fields in alt_indexes[ - "renamed_indexes" - ]: - self.add_operation( - app_label, - operations.RenameIndex( - model_name=model_name, - new_name=new_index_name, - old_name=old_index_name, - old_fields=old_fields, - ), - ) - - def _constraint_should_be_dropped_and_recreated( - self, old_constraint, new_constraint - ): - old_path, old_args, old_kwargs = old_constraint.deconstruct() - new_path, new_args, new_kwargs = new_constraint.deconstruct() - - for attr in old_constraint.non_db_attrs: - old_kwargs.pop(attr, None) - for attr in new_constraint.non_db_attrs: - new_kwargs.pop(attr, None) - - return (old_path, old_args, old_kwargs) != (new_path, new_args, new_kwargs) - - def create_altered_constraints(self): - option_name = operations.AddConstraint.option_name - for app_label, model_name in sorted(self.kept_model_keys): - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_model_state = self.from_state.models[app_label, old_model_name] - new_model_state = self.to_state.models[app_label, model_name] - - old_constraints = old_model_state.options[option_name] - new_constraints = new_model_state.options[option_name] - - alt_constraints = [] - alt_constraints_name = [] - - for old_c in old_constraints: - for new_c in new_constraints: - old_c_dec = old_c.deconstruct() - new_c_dec = new_c.deconstruct() - if ( - old_c_dec != new_c_dec - and old_c.name == new_c.name - and not self._constraint_should_be_dropped_and_recreated( - old_c, new_c - ) - ): - alt_constraints.append(new_c) - alt_constraints_name.append(new_c.name) - - add_constraints = [ - c - for c in new_constraints - if c not in old_constraints and c.name not in alt_constraints_name - ] - rem_constraints = [ - c - for c in old_constraints - if c not in new_constraints and c.name not in alt_constraints_name - ] - - self.altered_constraints.update( - { - (app_label, model_name): { - "added_constraints": add_constraints, - "removed_constraints": rem_constraints, - "altered_constraints": alt_constraints, - } - } - ) - - def generate_added_constraints(self): - for ( - app_label, - model_name, - ), alt_constraints in self.altered_constraints.items(): - dependencies = self._get_dependencies_for_model(app_label, model_name) - for constraint in alt_constraints["added_constraints"]: - self.add_operation( - app_label, - operations.AddConstraint( - model_name=model_name, - constraint=constraint, - ), - dependencies=dependencies, - ) - - def generate_removed_constraints(self): - for ( - app_label, - model_name, - ), alt_constraints in self.altered_constraints.items(): - for constraint in alt_constraints["removed_constraints"]: - self.add_operation( - app_label, - operations.RemoveConstraint( - model_name=model_name, - name=constraint.name, - ), - ) - - def generate_altered_constraints(self): - for ( - app_label, - model_name, - ), alt_constraints in self.altered_constraints.items(): - dependencies = self._get_dependencies_for_model(app_label, model_name) - for constraint in alt_constraints["altered_constraints"]: - self.add_operation( - app_label, - operations.AlterConstraint( - model_name=model_name, - name=constraint.name, - constraint=constraint, - ), - dependencies=dependencies, - ) - - @staticmethod - def _get_dependencies_for_foreign_key(app_label, model_name, field, project_state): - remote_field_model = None - if hasattr(field.remote_field, "model"): - remote_field_model = field.remote_field.model - else: - relations = project_state.relations[app_label, model_name] - for (remote_app_label, remote_model_name), fields in relations.items(): - if any( - field == related_field.remote_field - for related_field in fields.values() - ): - remote_field_model = f"{remote_app_label}.{remote_model_name}" - break - # Account for FKs to swappable models - swappable_setting = getattr(field, "swappable_setting", None) - if swappable_setting is not None: - dep_app_label = "__setting__" - dep_object_name = swappable_setting - else: - dep_app_label, dep_object_name = resolve_relation( - remote_field_model, - app_label, - model_name, - ) - dependencies = [ - OperationDependency( - dep_app_label, dep_object_name, None, OperationDependency.Type.CREATE - ) - ] - if getattr(field.remote_field, "through", None): - through_app_label, through_object_name = resolve_relation( - field.remote_field.through, - app_label, - model_name, - ) - dependencies.append( - OperationDependency( - through_app_label, - through_object_name, - None, - OperationDependency.Type.CREATE, - ) - ) - return dependencies - - def _get_dependencies_for_generated_field(self, field): - dependencies = [] - referenced_base_fields = models.Q(field.expression).referenced_base_fields - newly_added_fields = sorted(self.new_field_keys - self.old_field_keys) - for app_label, model_name, added_field_name in newly_added_fields: - added_field = self.to_state.models[app_label, model_name].get_field( - added_field_name - ) - if ( - added_field.remote_field and added_field.remote_field.model - ) or added_field.name in referenced_base_fields: - dependencies.append( - OperationDependency( - app_label, - model_name, - added_field.name, - OperationDependency.Type.CREATE, - ) - ) - return dependencies - - def _get_dependencies_for_model(self, app_label, model_name): - """Return foreign key dependencies of the given model.""" - dependencies = [] - model_state = self.to_state.models[app_label, model_name] - for field in model_state.fields.values(): - if field.is_relation: - dependencies.extend( - self._get_dependencies_for_foreign_key( - app_label, - model_name, - field, - self.to_state, - ) - ) - return dependencies - - def _get_altered_foo_together_operations(self, option_name): - for app_label, model_name in sorted(self.kept_model_keys): - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_model_state = self.from_state.models[app_label, old_model_name] - new_model_state = self.to_state.models[app_label, model_name] - - # We run the old version through the field renames to account for those - old_value = old_model_state.options.get(option_name) - old_value = ( - { - tuple( - self.renamed_fields.get((app_label, model_name, n), n) - for n in unique - ) - for unique in old_value - } - if old_value - else set() - ) - - new_value = new_model_state.options.get(option_name) - new_value = set(new_value) if new_value else set() - - if old_value != new_value: - dependencies = [] - for foo_togethers in new_value: - for field_name in foo_togethers: - field = new_model_state.get_field(field_name) - if field.remote_field and field.remote_field.model: - dependencies.extend( - self._get_dependencies_for_foreign_key( - app_label, - model_name, - field, - self.to_state, - ) - ) - yield ( - old_value, - new_value, - app_label, - model_name, - dependencies, - ) - - def _generate_removed_altered_foo_together(self, operation): - for ( - old_value, - new_value, - app_label, - model_name, - dependencies, - ) in self._get_altered_foo_together_operations(operation.option_name): - if operation == operations.AlterIndexTogether: - old_value = { - value - for value in old_value - if value - not in self.renamed_index_together_values[app_label, model_name] - } - removal_value = new_value.intersection(old_value) - if removal_value or old_value: - self.add_operation( - app_label, - operation( - name=model_name, **{operation.option_name: removal_value} - ), - dependencies=dependencies, - ) - - def generate_removed_altered_unique_together(self): - self._generate_removed_altered_foo_together(operations.AlterUniqueTogether) - - def _generate_altered_foo_together(self, operation): - for ( - old_value, - new_value, - app_label, - model_name, - dependencies, - ) in self._get_altered_foo_together_operations(operation.option_name): - removal_value = new_value.intersection(old_value) - if new_value != removal_value: - self.add_operation( - app_label, - operation(name=model_name, **{operation.option_name: new_value}), - dependencies=dependencies, - ) - - def generate_altered_unique_together(self): - self._generate_altered_foo_together(operations.AlterUniqueTogether) - - def generate_altered_db_table(self): - models_to_check = self.kept_model_keys.union( - self.kept_proxy_keys, self.kept_unmanaged_keys - ) - for app_label, model_name in sorted(models_to_check): - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_model_state = self.from_state.models[app_label, old_model_name] - new_model_state = self.to_state.models[app_label, model_name] - old_db_table_name = old_model_state.options.get("db_table") - new_db_table_name = new_model_state.options.get("db_table") - if old_db_table_name != new_db_table_name: - self.add_operation( - app_label, - operations.AlterModelTable( - name=model_name, - table=new_db_table_name, - ), - ) - - def generate_altered_db_table_comment(self): - models_to_check = self.kept_model_keys.union( - self.kept_proxy_keys, self.kept_unmanaged_keys - ) - for app_label, model_name in sorted(models_to_check): - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_model_state = self.from_state.models[app_label, old_model_name] - new_model_state = self.to_state.models[app_label, model_name] - - old_db_table_comment = old_model_state.options.get("db_table_comment") - new_db_table_comment = new_model_state.options.get("db_table_comment") - if old_db_table_comment != new_db_table_comment: - self.add_operation( - app_label, - operations.AlterModelTableComment( - name=model_name, - table_comment=new_db_table_comment, - ), - ) - - def generate_altered_options(self): - """ - Work out if any non-schema-affecting options have changed and make an - operation to represent them in state changes (in case Python code in - migrations needs them). - """ - models_to_check = self.kept_model_keys.union( - self.kept_proxy_keys, - self.kept_unmanaged_keys, - # unmanaged converted to managed - self.old_unmanaged_keys & self.new_model_keys, - # managed converted to unmanaged - self.old_model_keys & self.new_unmanaged_keys, - ) - - for app_label, model_name in sorted(models_to_check): - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_model_state = self.from_state.models[app_label, old_model_name] - new_model_state = self.to_state.models[app_label, model_name] - old_options = { - key: value - for key, value in old_model_state.options.items() - if key in AlterModelOptions.ALTER_OPTION_KEYS - } - new_options = { - key: value - for key, value in new_model_state.options.items() - if key in AlterModelOptions.ALTER_OPTION_KEYS - } - if old_options != new_options: - self.add_operation( - app_label, - operations.AlterModelOptions( - name=model_name, - options=new_options, - ), - ) - - def generate_altered_order_with_respect_to(self): - for app_label, model_name in sorted(self.kept_model_keys): - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_model_state = self.from_state.models[app_label, old_model_name] - new_model_state = self.to_state.models[app_label, model_name] - if old_model_state.options.get( - "order_with_respect_to" - ) != new_model_state.options.get("order_with_respect_to"): - # Make sure it comes second if we're adding - # (removal dependency is part of RemoveField) - dependencies = [] - if new_model_state.options.get("order_with_respect_to"): - dependencies.append( - OperationDependency( - app_label, - model_name, - new_model_state.options["order_with_respect_to"], - OperationDependency.Type.CREATE, - ) - ) - # Actually generate the operation - self.add_operation( - app_label, - operations.AlterOrderWithRespectTo( - name=model_name, - order_with_respect_to=new_model_state.options.get( - "order_with_respect_to" - ), - ), - dependencies=dependencies, - ) - - def generate_altered_managers(self): - for app_label, model_name in sorted(self.kept_model_keys): - old_model_name = self.renamed_models.get( - (app_label, model_name), model_name - ) - old_model_state = self.from_state.models[app_label, old_model_name] - new_model_state = self.to_state.models[app_label, model_name] - if old_model_state.managers != new_model_state.managers: - self.add_operation( - app_label, - operations.AlterModelManagers( - name=model_name, - managers=new_model_state.managers, - ), - ) - - def arrange_for_graph(self, changes, graph, migration_name=None): - """ - Take a result from changes() and a MigrationGraph, and fix the names - and dependencies of the changes so they extend the graph from the leaf - nodes for each app. - """ - leaves = graph.leaf_nodes() - name_map = {} - for app_label, migrations in list(changes.items()): - if not migrations: - continue - # Find the app label's current leaf node - app_leaf = None - for leaf in leaves: - if leaf[0] == app_label: - app_leaf = leaf - break - # Do they want an initial migration for this app? - if app_leaf is None and not self.questioner.ask_initial(app_label): - # They don't. - for migration in migrations: - name_map[(app_label, migration.name)] = (app_label, "__first__") - del changes[app_label] - continue - # Work out the next number in the sequence - if app_leaf is None: - next_number = 1 - else: - next_number = (self.parse_number(app_leaf[1]) or 0) + 1 - # Name each migration - for i, migration in enumerate(migrations): - if i == 0 and app_leaf: - migration.dependencies.append(app_leaf) - new_name_parts = ["%04i" % next_number] - if migration_name: - new_name_parts.append(migration_name) - elif i == 0 and not app_leaf: - new_name_parts.append("initial") - else: - new_name_parts.append(migration.suggest_name()[:100]) - new_name = "_".join(new_name_parts) - name_map[(app_label, migration.name)] = (app_label, new_name) - next_number += 1 - migration.name = new_name - # Now fix dependencies - for migrations in changes.values(): - for migration in migrations: - migration.dependencies = [ - name_map.get(d, d) for d in migration.dependencies - ] - return changes - - def _trim_to_apps(self, changes, app_labels): - """ - Take changes from arrange_for_graph() and set of app labels, and return - a modified set of changes which trims out as many migrations that are - not in app_labels as possible. Note that some other migrations may - still be present as they may be required dependencies. - """ - # Gather other app dependencies in a first pass - app_dependencies = {} - for app_label, migrations in changes.items(): - for migration in migrations: - for dep_app_label, name in migration.dependencies: - app_dependencies.setdefault(app_label, set()).add(dep_app_label) - required_apps = set(app_labels) - # Keep resolving till there's no change - old_required_apps = None - while old_required_apps != required_apps: - old_required_apps = set(required_apps) - required_apps.update( - *[app_dependencies.get(app_label, ()) for app_label in required_apps] - ) - # Remove all migrations that aren't needed - for app_label in list(changes): - if app_label not in required_apps: - del changes[app_label] - return changes - - @classmethod - def parse_number(cls, name): - """ - Given a migration name, try to extract a number from the beginning of - it. For a squashed migration such as '0001_squashed_0004…', return the - second number. If no number is found, return None. - """ - if squashed_match := re.search(r".*_squashed_(\d+)", name): - return int(squashed_match[1]) - match = re.match(r"^\d+", name) - if match: - return int(match[0]) - return None diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/exceptions.py b/.venv/lib/python3.10/site-packages/django/db/migrations/exceptions.py deleted file mode 100644 index dd556da..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/exceptions.py +++ /dev/null @@ -1,60 +0,0 @@ -from django.db import DatabaseError - - -class AmbiguityError(Exception): - """More than one migration matches a name prefix.""" - - pass - - -class BadMigrationError(Exception): - """There's a bad migration (unreadable/bad format/etc.).""" - - pass - - -class CircularDependencyError(Exception): - """There's an impossible-to-resolve circular dependency.""" - - pass - - -class InconsistentMigrationHistory(Exception): - """An applied migration has some of its dependencies not applied.""" - - pass - - -class InvalidBasesError(ValueError): - """A model's base classes can't be resolved.""" - - pass - - -class IrreversibleError(RuntimeError): - """An irreversible migration is about to be reversed.""" - - pass - - -class NodeNotFoundError(LookupError): - """An attempt on a node is made that is not available in the graph.""" - - def __init__(self, message, node, origin=None): - self.message = message - self.origin = origin - self.node = node - - def __str__(self): - return self.message - - def __repr__(self): - return "NodeNotFoundError(%r)" % (self.node,) - - -class MigrationSchemaMissing(DatabaseError): - pass - - -class InvalidMigrationPlan(ValueError): - pass diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/executor.py b/.venv/lib/python3.10/site-packages/django/db/migrations/executor.py deleted file mode 100644 index 13afa59..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/executor.py +++ /dev/null @@ -1,413 +0,0 @@ -from django.apps.registry import apps as global_apps -from django.db import migrations, router - -from .exceptions import InvalidMigrationPlan -from .loader import MigrationLoader -from .recorder import MigrationRecorder -from .state import ProjectState - - -class MigrationExecutor: - """ - End-to-end migration execution - load migrations and run them up or down - to a specified set of targets. - """ - - def __init__(self, connection, progress_callback=None): - self.connection = connection - self.loader = MigrationLoader(self.connection) - self.recorder = MigrationRecorder(self.connection) - self.progress_callback = progress_callback - - def migration_plan(self, targets, clean_start=False): - """ - Given a set of targets, return a list of (Migration instance, backwards?). - """ - plan = [] - if clean_start: - applied = {} - else: - applied = dict(self.loader.applied_migrations) - for target in targets: - # If the target is (app_label, None), that means unmigrate everything - if target[1] is None: - for root in self.loader.graph.root_nodes(): - if root[0] == target[0]: - for migration in self.loader.graph.backwards_plan(root): - if migration in applied: - plan.append((self.loader.graph.nodes[migration], True)) - applied.pop(migration) - # If the migration is already applied, do backwards mode, - # otherwise do forwards mode. - elif target in applied: - # If the target is missing, it's likely a replaced migration. - # Reload the graph without replacements. - if ( - self.loader.replace_migrations - and target not in self.loader.graph.node_map - ): - self.loader.replace_migrations = False - self.loader.build_graph() - return self.migration_plan(targets, clean_start=clean_start) - # Don't migrate backwards all the way to the target node (that - # may roll back dependencies in other apps that don't need to - # be rolled back); instead roll back through target's immediate - # child(ren) in the same app, and no further. - next_in_app = sorted( - n - for n in self.loader.graph.node_map[target].children - if n[0] == target[0] - ) - for node in next_in_app: - for migration in self.loader.graph.backwards_plan(node): - if migration in applied: - plan.append((self.loader.graph.nodes[migration], True)) - applied.pop(migration) - else: - for migration in self.loader.graph.forwards_plan(target): - if migration not in applied: - plan.append((self.loader.graph.nodes[migration], False)) - applied[migration] = self.loader.graph.nodes[migration] - return plan - - def _create_project_state(self, with_applied_migrations=False): - """ - Create a project state including all the applications without - migrations and applied migrations if with_applied_migrations=True. - """ - state = ProjectState(real_apps=self.loader.unmigrated_apps) - if with_applied_migrations: - # Create the forwards plan Django would follow on an empty database - full_plan = self.migration_plan( - self.loader.graph.leaf_nodes(), clean_start=True - ) - applied_migrations = { - self.loader.graph.nodes[key] - for key in self.loader.applied_migrations - if key in self.loader.graph.nodes - } - for migration, _ in full_plan: - if migration in applied_migrations: - migration.mutate_state(state, preserve=False) - return state - - def migrate(self, targets, plan=None, state=None, fake=False, fake_initial=False): - """ - Migrate the database up to the given targets. - - Django first needs to create all project states before a migration is - (un)applied and in a second step run all the database operations. - """ - # The django_migrations table must be present to record applied - # migrations, but don't create it if there are no migrations to apply. - if plan == []: - if not self.recorder.has_table(): - return self._create_project_state(with_applied_migrations=False) - else: - self.recorder.ensure_schema() - - if plan is None: - plan = self.migration_plan(targets) - # Create the forwards plan Django would follow on an empty database - full_plan = self.migration_plan( - self.loader.graph.leaf_nodes(), clean_start=True - ) - - all_forwards = all(not backwards for mig, backwards in plan) - all_backwards = all(backwards for mig, backwards in plan) - - if not plan: - if state is None: - # The resulting state should include applied migrations. - state = self._create_project_state(with_applied_migrations=True) - elif all_forwards == all_backwards: - # This should only happen if there's a mixed plan - raise InvalidMigrationPlan( - "Migration plans with both forwards and backwards migrations " - "are not supported. Please split your migration process into " - "separate plans of only forwards OR backwards migrations.", - plan, - ) - elif all_forwards: - if state is None: - # The resulting state should still include applied migrations. - state = self._create_project_state(with_applied_migrations=True) - state = self._migrate_all_forwards( - state, plan, full_plan, fake=fake, fake_initial=fake_initial - ) - else: - # No need to check for `elif all_backwards` here, as that condition - # would always evaluate to true. - state = self._migrate_all_backwards(plan, full_plan, fake=fake) - - self.check_replacements() - - return state - - def _migrate_all_forwards(self, state, plan, full_plan, fake, fake_initial): - """ - Take a list of 2-tuples of the form (migration instance, False) and - apply them in the order they occur in the full_plan. - """ - migrations_to_run = {m[0] for m in plan} - for migration, _ in full_plan: - if not migrations_to_run: - # We remove every migration that we applied from these sets so - # that we can bail out once the last migration has been applied - # and don't always run until the very end of the migration - # process. - break - if migration in migrations_to_run: - if "apps" not in state.__dict__: - if self.progress_callback: - self.progress_callback("render_start") - state.apps # Render all -- performance critical - if self.progress_callback: - self.progress_callback("render_success") - state = self.apply_migration( - state, migration, fake=fake, fake_initial=fake_initial - ) - migrations_to_run.remove(migration) - - return state - - def _migrate_all_backwards(self, plan, full_plan, fake): - """ - Take a list of 2-tuples of the form (migration instance, True) and - unapply them in reverse order they occur in the full_plan. - - Since unapplying a migration requires the project state prior to that - migration, Django will compute the migration states before each of them - in a first run over the plan and then unapply them in a second run over - the plan. - """ - migrations_to_run = {m[0] for m in plan} - # Holds all migration states prior to the migrations being unapplied - states = {} - state = self._create_project_state() - applied_migrations = { - self.loader.graph.nodes[key] - for key in self.loader.applied_migrations - if key in self.loader.graph.nodes - } - if self.progress_callback: - self.progress_callback("render_start") - for migration, _ in full_plan: - if not migrations_to_run: - # We remove every migration that we applied from this set so - # that we can bail out once the last migration has been applied - # and don't always run until the very end of the migration - # process. - break - if migration in migrations_to_run: - if "apps" not in state.__dict__: - state.apps # Render all -- performance critical - # The state before this migration - states[migration] = state - # The old state keeps as-is, we continue with the new state - state = migration.mutate_state(state, preserve=True) - migrations_to_run.remove(migration) - elif migration in applied_migrations: - # Only mutate the state if the migration is actually applied - # to make sure the resulting state doesn't include changes - # from unrelated migrations. - migration.mutate_state(state, preserve=False) - if self.progress_callback: - self.progress_callback("render_success") - - for migration, _ in plan: - self.unapply_migration(states[migration], migration, fake=fake) - applied_migrations.remove(migration) - - # Generate the post migration state by starting from the state before - # the last migration is unapplied and mutating it to include all the - # remaining applied migrations. - last_unapplied_migration = plan[-1][0] - state = states[last_unapplied_migration] - # Avoid mutating state with apps rendered as it's an expensive - # operation. - del state.apps - for index, (migration, _) in enumerate(full_plan): - if migration == last_unapplied_migration: - for migration, _ in full_plan[index:]: - if migration in applied_migrations: - migration.mutate_state(state, preserve=False) - break - - return state - - def apply_migration(self, state, migration, fake=False, fake_initial=False): - """Run a migration forwards.""" - migration_recorded = False - if self.progress_callback: - self.progress_callback("apply_start", migration, fake) - if not fake: - if fake_initial: - # Test to see if this is an already-applied initial migration - applied, state = self.detect_soft_applied(state, migration) - if applied: - fake = True - if not fake: - # Alright, do it normally - with self.connection.schema_editor( - atomic=migration.atomic - ) as schema_editor: - state = migration.apply(state, schema_editor) - if not schema_editor.deferred_sql: - self.record_migration(migration) - migration_recorded = True - if not migration_recorded: - self.record_migration(migration) - # Report progress - if self.progress_callback: - self.progress_callback("apply_success", migration, fake) - return state - - def record_migration(self, migration): - # For replacement migrations, record individual statuses - if migration.replaces: - for app_label, name in migration.replaces: - self.recorder.record_applied(app_label, name) - else: - self.recorder.record_applied(migration.app_label, migration.name) - - def unapply_migration(self, state, migration, fake=False): - """Run a migration backwards.""" - if self.progress_callback: - self.progress_callback("unapply_start", migration, fake) - if not fake: - with self.connection.schema_editor( - atomic=migration.atomic - ) as schema_editor: - state = migration.unapply(state, schema_editor) - # For replacement migrations, also record individual statuses. - if migration.replaces: - for app_label, name in migration.replaces: - self.recorder.record_unapplied(app_label, name) - self.recorder.record_unapplied(migration.app_label, migration.name) - # Report progress - if self.progress_callback: - self.progress_callback("unapply_success", migration, fake) - return state - - def check_replacements(self): - """ - Mark replacement migrations applied if their replaced set all are. - - Do this unconditionally on every migrate, rather than just when - migrations are applied or unapplied, to correctly handle the case - when a new squash migration is pushed to a deployment that already had - all its replaced migrations applied. In this case no new migration will - be applied, but the applied state of the squashed migration must be - maintained. - """ - applied = self.recorder.applied_migrations() - for key, migration in self.loader.replacements.items(): - all_applied = all(m in applied for m in migration.replaces) - if all_applied and key not in applied: - self.recorder.record_applied(*key) - - def detect_soft_applied(self, project_state, migration): - """ - Test whether a migration has been implicitly applied - that the - tables or columns it would create exist. This is intended only for use - on initial migrations (as it only looks for CreateModel and AddField). - """ - - def should_skip_detecting_model(migration, model): - """ - No need to detect tables for proxy models, unmanaged models, or - models that can't be migrated on the current database. - """ - return ( - model._meta.proxy - or not model._meta.managed - or not router.allow_migrate( - self.connection.alias, - migration.app_label, - model_name=model._meta.model_name, - ) - ) - - if migration.initial is None: - # Bail if the migration isn't the first one in its app - if any(app == migration.app_label for app, name in migration.dependencies): - return False, project_state - elif migration.initial is False: - # Bail if it's NOT an initial migration - return False, project_state - - if project_state is None: - after_state = self.loader.project_state( - (migration.app_label, migration.name), at_end=True - ) - else: - after_state = migration.mutate_state(project_state) - apps = after_state.apps - found_create_model_migration = False - found_add_field_migration = False - fold_identifier_case = self.connection.features.ignores_table_name_case - with self.connection.cursor() as cursor: - existing_table_names = set( - self.connection.introspection.table_names(cursor) - ) - if fold_identifier_case: - existing_table_names = { - name.casefold() for name in existing_table_names - } - # Make sure all create model and add field operations are done - for operation in migration.operations: - if isinstance(operation, migrations.CreateModel): - model = apps.get_model(migration.app_label, operation.name) - if model._meta.swapped: - # We have to fetch the model to test with from the - # main app cache, as it's not a direct dependency. - model = global_apps.get_model(model._meta.swapped) - if should_skip_detecting_model(migration, model): - continue - db_table = model._meta.db_table - if fold_identifier_case: - db_table = db_table.casefold() - if db_table not in existing_table_names: - return False, project_state - found_create_model_migration = True - elif isinstance(operation, migrations.AddField): - model = apps.get_model(migration.app_label, operation.model_name) - if model._meta.swapped: - # We have to fetch the model to test with from the - # main app cache, as it's not a direct dependency. - model = global_apps.get_model(model._meta.swapped) - if should_skip_detecting_model(migration, model): - continue - - table = model._meta.db_table - field = model._meta.get_field(operation.name) - - # Handle implicit many-to-many tables created by AddField. - if field.many_to_many: - through_db_table = field.remote_field.through._meta.db_table - if fold_identifier_case: - through_db_table = through_db_table.casefold() - if through_db_table not in existing_table_names: - return False, project_state - else: - found_add_field_migration = True - continue - with self.connection.cursor() as cursor: - columns = self.connection.introspection.get_table_description( - cursor, table - ) - for column in columns: - field_column = field.column - column_name = column.name - if fold_identifier_case: - column_name = column_name.casefold() - field_column = field_column.casefold() - if column_name == field_column: - found_add_field_migration = True - break - else: - return False, project_state - # If we get this far and we found at least one CreateModel or AddField - # migration, the migration is considered implicitly applied. - return (found_create_model_migration or found_add_field_migration), after_state diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/graph.py b/.venv/lib/python3.10/site-packages/django/db/migrations/graph.py deleted file mode 100644 index dd845c1..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/graph.py +++ /dev/null @@ -1,333 +0,0 @@ -from functools import total_ordering - -from django.db.migrations.state import ProjectState - -from .exceptions import CircularDependencyError, NodeNotFoundError - - -@total_ordering -class Node: - """ - A single node in the migration graph. Contains direct links to adjacent - nodes in either direction. - """ - - def __init__(self, key): - self.key = key - self.children = set() - self.parents = set() - - def __eq__(self, other): - return self.key == other - - def __lt__(self, other): - return self.key < other - - def __hash__(self): - return hash(self.key) - - def __getitem__(self, item): - return self.key[item] - - def __str__(self): - return str(self.key) - - def __repr__(self): - return "<%s: (%r, %r)>" % (self.__class__.__name__, self.key[0], self.key[1]) - - def add_child(self, child): - self.children.add(child) - - def add_parent(self, parent): - self.parents.add(parent) - - -class DummyNode(Node): - """ - A node that doesn't correspond to a migration file on disk. - (A squashed migration that was removed, for example.) - - After the migration graph is processed, all dummy nodes should be removed. - If there are any left, a nonexistent dependency error is raised. - """ - - def __init__(self, key, origin, error_message): - super().__init__(key) - self.origin = origin - self.error_message = error_message - - def raise_error(self): - raise NodeNotFoundError(self.error_message, self.key, origin=self.origin) - - -class MigrationGraph: - """ - Represent the digraph of all migrations in a project. - - Each migration is a node, and each dependency is an edge. There are - no implicit dependencies between numbered migrations - the numbering is - merely a convention to aid file listing. Every new numbered migration - has a declared dependency to the previous number, meaning that VCS - branch merges can be detected and resolved. - - Migrations files can be marked as replacing another set of migrations - - this is to support the "squash" feature. The graph handler isn't responsible - for these; instead, the code to load them in here should examine the - migration files and if the replaced migrations are all either unapplied - or not present, it should ignore the replaced ones, load in just the - replacing migration, and repoint any dependencies that pointed to the - replaced migrations to point to the replacing one. - - A node should be a tuple: (app_path, migration_name). The tree special-cases - things within an app - namely, root nodes and leaf nodes ignore dependencies - to other apps. - """ - - def __init__(self): - self.node_map = {} - self.nodes = {} - - def add_node(self, key, migration): - assert key not in self.node_map - node = Node(key) - self.node_map[key] = node - self.nodes[key] = migration - - def add_dummy_node(self, key, origin, error_message): - node = DummyNode(key, origin, error_message) - self.node_map[key] = node - self.nodes[key] = None - - def add_dependency(self, migration, child, parent, skip_validation=False): - """ - This may create dummy nodes if they don't yet exist. If - `skip_validation=True`, validate_consistency() should be called - afterward. - """ - if child not in self.nodes: - error_message = ( - "Migration %s dependencies reference nonexistent" - " child node %r" % (migration, child) - ) - self.add_dummy_node(child, migration, error_message) - if parent not in self.nodes: - error_message = ( - "Migration %s dependencies reference nonexistent" - " parent node %r" % (migration, parent) - ) - self.add_dummy_node(parent, migration, error_message) - self.node_map[child].add_parent(self.node_map[parent]) - self.node_map[parent].add_child(self.node_map[child]) - if not skip_validation: - self.validate_consistency() - - def remove_replaced_nodes(self, replacement, replaced): - """ - Remove each of the `replaced` nodes (when they exist). Any - dependencies that were referencing them are changed to reference the - `replacement` node instead. - """ - # Cast list of replaced keys to set to speed up lookup later. - replaced = set(replaced) - try: - replacement_node = self.node_map[replacement] - except KeyError as err: - raise NodeNotFoundError( - "Unable to find replacement node %r. It was either never added" - " to the migration graph, or has been removed." % (replacement,), - replacement, - ) from err - for replaced_key in replaced: - self.nodes.pop(replaced_key, None) - replaced_node = self.node_map.pop(replaced_key, None) - if replaced_node: - for child in replaced_node.children: - child.parents.remove(replaced_node) - # We don't want to create dependencies between the replaced - # node and the replacement node as this would lead to - # self-referencing on the replacement node at a later iteration. - if child.key not in replaced: - replacement_node.add_child(child) - child.add_parent(replacement_node) - for parent in replaced_node.parents: - parent.children.remove(replaced_node) - # Again, to avoid self-referencing. - if parent.key not in replaced: - replacement_node.add_parent(parent) - parent.add_child(replacement_node) - - def remove_replacement_node(self, replacement, replaced): - """ - The inverse operation to `remove_replaced_nodes`. Almost. Remove the - replacement node `replacement` and remap its child nodes to `replaced` - - the list of nodes it would have replaced. Don't remap its parent - nodes as they are expected to be correct already. - """ - self.nodes.pop(replacement, None) - try: - replacement_node = self.node_map.pop(replacement) - except KeyError as err: - raise NodeNotFoundError( - "Unable to remove replacement node %r. It was either never added" - " to the migration graph, or has been removed already." - % (replacement,), - replacement, - ) from err - replaced_nodes = set() - replaced_nodes_parents = set() - for key in replaced: - replaced_node = self.node_map.get(key) - if replaced_node: - replaced_nodes.add(replaced_node) - replaced_nodes_parents |= replaced_node.parents - # We're only interested in the latest replaced node, so filter out - # replaced nodes that are parents of other replaced nodes. - replaced_nodes -= replaced_nodes_parents - for child in replacement_node.children: - child.parents.remove(replacement_node) - for replaced_node in replaced_nodes: - replaced_node.add_child(child) - child.add_parent(replaced_node) - for parent in replacement_node.parents: - parent.children.remove(replacement_node) - # NOTE: There is no need to remap parent dependencies as we can - # assume the replaced nodes already have the correct ancestry. - - def validate_consistency(self): - """Ensure there are no dummy nodes remaining in the graph.""" - [n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)] - - def forwards_plan(self, target): - """ - Given a node, return a list of which previous nodes (dependencies) must - be applied, ending with the node itself. This is the list you would - follow if applying the migrations to a database. - """ - if target not in self.nodes: - raise NodeNotFoundError("Node %r not a valid node" % (target,), target) - return self.iterative_dfs(self.node_map[target]) - - def backwards_plan(self, target): - """ - Given a node, return a list of which dependent nodes (dependencies) - must be unapplied, ending with the node itself. This is the list you - would follow if removing the migrations from a database. - """ - if target not in self.nodes: - raise NodeNotFoundError("Node %r not a valid node" % (target,), target) - return self.iterative_dfs(self.node_map[target], forwards=False) - - def iterative_dfs(self, start, forwards=True): - """Iterative depth-first search for finding dependencies.""" - visited = [] - visited_set = set() - stack = [(start, False)] - while stack: - node, processed = stack.pop() - if node in visited_set: - pass - elif processed: - visited_set.add(node) - visited.append(node.key) - else: - stack.append((node, True)) - stack += [ - (n, False) - for n in sorted(node.parents if forwards else node.children) - ] - return visited - - def root_nodes(self, app=None): - """ - Return all root nodes - that is, nodes with no dependencies inside - their app. These are the starting point for an app. - """ - roots = set() - for node in self.nodes: - if all(key[0] != node[0] for key in self.node_map[node].parents) and ( - not app or app == node[0] - ): - roots.add(node) - return sorted(roots) - - def leaf_nodes(self, app=None): - """ - Return all leaf nodes - that is, nodes with no dependents in their app. - These are the "most current" version of an app's schema. - Having more than one per app is technically an error, but one that - gets handled further up, in the interactive command - it's usually the - result of a VCS merge and needs some user input. - """ - leaves = set() - for node in self.nodes: - if all(key[0] != node[0] for key in self.node_map[node].children) and ( - not app or app == node[0] - ): - leaves.add(node) - return sorted(leaves) - - def ensure_not_cyclic(self): - # Algo from GvR: - # https://neopythonic.blogspot.com/2009/01/detecting-cycles-in-directed-graph.html - todo = set(self.nodes) - while todo: - node = todo.pop() - stack = [node] - while stack: - top = stack[-1] - for child in self.node_map[top].children: - # Use child.key instead of child to speed up the frequent - # hashing. - node = child.key - if node in stack: - cycle = stack[stack.index(node) :] - raise CircularDependencyError( - ", ".join("%s.%s" % n for n in cycle) - ) - if node in todo: - stack.append(node) - todo.remove(node) - break - else: - node = stack.pop() - - def __str__(self): - return "Graph: %s nodes, %s edges" % self._nodes_and_edges() - - def __repr__(self): - nodes, edges = self._nodes_and_edges() - return "<%s: nodes=%s, edges=%s>" % (self.__class__.__name__, nodes, edges) - - def _nodes_and_edges(self): - return len(self.nodes), sum( - len(node.parents) for node in self.node_map.values() - ) - - def _generate_plan(self, nodes, at_end): - plan = [] - for node in nodes: - for migration in self.forwards_plan(node): - if migration not in plan and (at_end or migration not in nodes): - plan.append(migration) - return plan - - def make_state(self, nodes=None, at_end=True, real_apps=None): - """ - Given a migration node or nodes, return a complete ProjectState for it. - If at_end is False, return the state before the migration has run. - If nodes is not provided, return the overall most current project state. - """ - if nodes is None: - nodes = list(self.leaf_nodes()) - if not nodes: - return ProjectState() - if not isinstance(nodes[0], tuple): - nodes = [nodes] - plan = self._generate_plan(nodes, at_end) - project_state = ProjectState(real_apps=real_apps) - for node in plan: - project_state = self.nodes[node].mutate_state(project_state, preserve=False) - return project_state - - def __contains__(self, node): - return node in self.nodes diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/loader.py b/.venv/lib/python3.10/site-packages/django/db/migrations/loader.py deleted file mode 100644 index 50445f3..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/loader.py +++ /dev/null @@ -1,385 +0,0 @@ -import pkgutil -import sys -from importlib import import_module, reload - -from django.apps import apps -from django.conf import settings -from django.db.migrations.graph import MigrationGraph -from django.db.migrations.recorder import MigrationRecorder - -from .exceptions import ( - AmbiguityError, - BadMigrationError, - InconsistentMigrationHistory, - NodeNotFoundError, -) - -MIGRATIONS_MODULE_NAME = "migrations" - - -class MigrationLoader: - """ - Load migration files from disk and their status from the database. - - Migration files are expected to live in the "migrations" directory of - an app. Their names are entirely unimportant from a code perspective, - but will probably follow the 1234_name.py convention. - - On initialization, this class will scan those directories, and open and - read the Python files, looking for a class called Migration, which should - inherit from django.db.migrations.Migration. See - django.db.migrations.migration for what that looks like. - - Some migrations will be marked as "replacing" another set of migrations. - These are loaded into a separate set of migrations away from the main ones. - If all the migrations they replace are either unapplied or missing from - disk, then they are injected into the main set, replacing the named migrations. - Any dependency pointers to the replaced migrations are re-pointed to the - new migration. - - This does mean that this class MUST also talk to the database as well as - to disk, but this is probably fine. We're already not just operating - in memory. - """ - - def __init__( - self, - connection, - load=True, - ignore_no_migrations=False, - replace_migrations=True, - ): - self.connection = connection - self.disk_migrations = None - self.applied_migrations = None - self.ignore_no_migrations = ignore_no_migrations - self.replace_migrations = replace_migrations - if load: - self.build_graph() - - @classmethod - def migrations_module(cls, app_label): - """ - Return the path to the migrations module for the specified app_label - and a boolean indicating if the module is specified in - settings.MIGRATION_MODULE. - """ - if app_label in settings.MIGRATION_MODULES: - return settings.MIGRATION_MODULES[app_label], True - else: - app_package_name = apps.get_app_config(app_label).name - return "%s.%s" % (app_package_name, MIGRATIONS_MODULE_NAME), False - - def load_disk(self): - """Load the migrations from all INSTALLED_APPS from disk.""" - self.disk_migrations = {} - self.unmigrated_apps = set() - self.migrated_apps = set() - for app_config in apps.get_app_configs(): - # Get the migrations module directory - module_name, explicit = self.migrations_module(app_config.label) - if module_name is None: - self.unmigrated_apps.add(app_config.label) - continue - was_loaded = module_name in sys.modules - try: - module = import_module(module_name) - except ModuleNotFoundError as e: - if (explicit and self.ignore_no_migrations) or ( - not explicit and MIGRATIONS_MODULE_NAME in e.name.split(".") - ): - self.unmigrated_apps.add(app_config.label) - continue - raise - else: - # Module is not a package (e.g. migrations.py). - if not hasattr(module, "__path__"): - self.unmigrated_apps.add(app_config.label) - continue - # Empty directories are namespaces. Namespace packages have no - # __file__ and don't use a list for __path__. See - # https://docs.python.org/3/reference/import.html#namespace-packages - if getattr(module, "__file__", None) is None and not isinstance( - module.__path__, list - ): - self.unmigrated_apps.add(app_config.label) - continue - # Force a reload if it's already loaded (tests need this) - if was_loaded: - reload(module) - self.migrated_apps.add(app_config.label) - migration_names = { - name - for _, name, is_pkg in pkgutil.iter_modules(module.__path__) - if not is_pkg and name[0] not in "_~" - } - # Load migrations - for migration_name in migration_names: - migration_path = "%s.%s" % (module_name, migration_name) - try: - migration_module = import_module(migration_path) - except ImportError as e: - if "bad magic number" in str(e): - raise ImportError( - "Couldn't import %r as it appears to be a stale " - ".pyc file." % migration_path - ) from e - else: - raise - if not hasattr(migration_module, "Migration"): - raise BadMigrationError( - "Migration %s in app %s has no Migration class" - % (migration_name, app_config.label) - ) - self.disk_migrations[app_config.label, migration_name] = ( - migration_module.Migration( - migration_name, - app_config.label, - ) - ) - - def get_migration(self, app_label, name_prefix): - """Return the named migration or raise NodeNotFoundError.""" - return self.graph.nodes[app_label, name_prefix] - - def get_migration_by_prefix(self, app_label, name_prefix): - """ - Return the migration(s) which match the given app label and name_prefix. - """ - # Do the search - results = [] - for migration_app_label, migration_name in self.disk_migrations: - if migration_app_label == app_label and migration_name.startswith( - name_prefix - ): - results.append((migration_app_label, migration_name)) - if len(results) > 1: - raise AmbiguityError( - "There is more than one migration for '%s' with the prefix '%s'" - % (app_label, name_prefix) - ) - elif not results: - raise KeyError( - f"There is no migration for '{app_label}' with the prefix " - f"'{name_prefix}'" - ) - else: - return self.disk_migrations[results[0]] - - def check_key(self, key, current_app): - if (key[1] != "__first__" and key[1] != "__latest__") or key in self.graph: - return key - # Special-case __first__, which means "the first migration" for - # migrated apps, and is ignored for unmigrated apps. It allows - # makemigrations to declare dependencies on apps before they even have - # migrations. - if key[0] == current_app: - # Ignore __first__ references to the same app (#22325) - return - if key[0] in self.unmigrated_apps: - # This app isn't migrated, but something depends on it. - # The models will get auto-added into the state, though - # so we're fine. - return - if key[0] in self.migrated_apps: - try: - if key[1] == "__first__": - return self.graph.root_nodes(key[0])[0] - else: # "__latest__" - return self.graph.leaf_nodes(key[0])[0] - except IndexError: - if self.ignore_no_migrations: - return None - else: - raise ValueError( - "Dependency on app with no migrations: %s" % key[0] - ) - raise ValueError("Dependency on unknown app: %s" % key[0]) - - def add_internal_dependencies(self, key, migration): - """ - Internal dependencies need to be added first to ensure `__first__` - dependencies find the correct root node. - """ - for parent in migration.dependencies: - # Ignore __first__ references to the same app. - if parent[0] == key[0] and parent[1] != "__first__": - self.graph.add_dependency(migration, key, parent, skip_validation=True) - - def add_external_dependencies(self, key, migration): - for parent in migration.dependencies: - # Skip internal dependencies - if key[0] == parent[0]: - continue - parent = self.check_key(parent, key[0]) - if parent is not None: - self.graph.add_dependency(migration, key, parent, skip_validation=True) - for child in migration.run_before: - child = self.check_key(child, key[0]) - if child is not None: - self.graph.add_dependency(migration, child, key, skip_validation=True) - - def build_graph(self): - """ - Build a migration dependency graph using both the disk and database. - You'll need to rebuild the graph if you apply migrations. This isn't - usually a problem as generally migration stuff runs in a one-shot process. - """ - # Load disk data - self.load_disk() - # Load database data - if self.connection is None: - self.applied_migrations = {} - else: - recorder = MigrationRecorder(self.connection) - self.applied_migrations = recorder.applied_migrations() - # To start, populate the migration graph with nodes for ALL migrations - # and their dependencies. Also make note of replacing migrations at this step. - self.graph = MigrationGraph() - self.replacements = {} - for key, migration in self.disk_migrations.items(): - self.graph.add_node(key, migration) - # Replacing migrations. - if migration.replaces: - self.replacements[key] = migration - for key, migration in self.disk_migrations.items(): - # Internal (same app) dependencies. - self.add_internal_dependencies(key, migration) - # Add external dependencies now that the internal ones have been resolved. - for key, migration in self.disk_migrations.items(): - self.add_external_dependencies(key, migration) - # Carry out replacements where possible and if enabled. - if self.replace_migrations: - for key, migration in self.replacements.items(): - # Get applied status of each of this migration's replacement - # targets. - applied_statuses = [ - (target in self.applied_migrations) for target in migration.replaces - ] - # The replacing migration is only marked as applied if all of - # its replacement targets are. - if all(applied_statuses): - self.applied_migrations[key] = migration - else: - self.applied_migrations.pop(key, None) - # A replacing migration can be used if either all or none of - # its replacement targets have been applied. - if all(applied_statuses) or (not any(applied_statuses)): - self.graph.remove_replaced_nodes(key, migration.replaces) - else: - # This replacing migration cannot be used because it is - # partially applied. Remove it from the graph and remap - # dependencies to it (#25945). - self.graph.remove_replacement_node(key, migration.replaces) - # Ensure the graph is consistent. - try: - self.graph.validate_consistency() - except NodeNotFoundError as exc: - # Check if the missing node could have been replaced by any squash - # migration but wasn't because the squash migration was partially - # applied before. In that case raise a more understandable exception - # (#23556). - # Get reverse replacements. - reverse_replacements = {} - for key, migration in self.replacements.items(): - for replaced in migration.replaces: - reverse_replacements.setdefault(replaced, set()).add(key) - # Try to reraise exception with more detail. - if exc.node in reverse_replacements: - candidates = reverse_replacements.get(exc.node, set()) - is_replaced = any( - candidate in self.graph.nodes for candidate in candidates - ) - if not is_replaced: - tries = ", ".join("%s.%s" % c for c in candidates) - raise NodeNotFoundError( - "Migration {0} depends on nonexistent node ('{1}', '{2}'). " - "Django tried to replace migration {1}.{2} with any of [{3}] " - "but wasn't able to because some of the replaced migrations " - "are already applied.".format( - exc.origin, exc.node[0], exc.node[1], tries - ), - exc.node, - ) from exc - raise - self.graph.ensure_not_cyclic() - - def check_consistent_history(self, connection): - """ - Raise InconsistentMigrationHistory if any applied migrations have - unapplied dependencies. - """ - recorder = MigrationRecorder(connection) - applied = recorder.applied_migrations() - for migration in applied: - # If the migration is unknown, skip it. - if migration not in self.graph.nodes: - continue - for parent in self.graph.node_map[migration].parents: - if parent not in applied: - # Skip unapplied squashed migrations that have all of their - # `replaces` applied. - if parent in self.replacements: - if all( - m in applied for m in self.replacements[parent].replaces - ): - continue - raise InconsistentMigrationHistory( - "Migration {}.{} is applied before its dependency " - "{}.{} on database '{}'.".format( - migration[0], - migration[1], - parent[0], - parent[1], - connection.alias, - ) - ) - - def detect_conflicts(self): - """ - Look through the loaded graph and detect any conflicts - apps - with more than one leaf migration. Return a dict of the app labels - that conflict with the migration names that conflict. - """ - seen_apps = {} - conflicting_apps = set() - for app_label, migration_name in self.graph.leaf_nodes(): - if app_label in seen_apps: - conflicting_apps.add(app_label) - seen_apps.setdefault(app_label, set()).add(migration_name) - return { - app_label: sorted(seen_apps[app_label]) for app_label in conflicting_apps - } - - def project_state(self, nodes=None, at_end=True): - """ - Return a ProjectState object representing the most recent state - that the loaded migrations represent. - - See graph.make_state() for the meaning of "nodes" and "at_end". - """ - return self.graph.make_state( - nodes=nodes, at_end=at_end, real_apps=self.unmigrated_apps - ) - - def collect_sql(self, plan): - """ - Take a migration plan and return a list of collected SQL statements - that represent the best-efforts version of that plan. - """ - statements = [] - state = None - for migration, backwards in plan: - with self.connection.schema_editor( - collect_sql=True, atomic=migration.atomic - ) as schema_editor: - if state is None: - state = self.project_state( - (migration.app_label, migration.name), at_end=False - ) - if not backwards: - state = migration.apply(state, schema_editor, collect_sql=True) - else: - state = migration.unapply(state, schema_editor, collect_sql=True) - statements.extend(schema_editor.collected_sql) - return statements diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/migration.py b/.venv/lib/python3.10/site-packages/django/db/migrations/migration.py deleted file mode 100644 index 3c7713c..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/migration.py +++ /dev/null @@ -1,239 +0,0 @@ -import re - -from django.db.migrations.utils import get_migration_name_timestamp -from django.db.transaction import atomic - -from .exceptions import IrreversibleError - - -class Migration: - """ - The base class for all migrations. - - Migration files will import this from django.db.migrations.Migration - and subclass it as a class called Migration. It will have one or more - of the following attributes: - - - operations: A list of Operation instances, probably from - django.db.migrations.operations - - dependencies: A list of tuples of (app_path, migration_name) - - run_before: A list of tuples of (app_path, migration_name) - - replaces: A list of migration_names - - Note that all migrations come out of migrations and into the Loader or - Graph as instances, having been initialized with their app label and name. - """ - - # Operations to apply during this migration, in order. - operations = [] - - # Other migrations that should be run before this migration. - # Should be a list of (app, migration_name). - dependencies = [] - - # Other migrations that should be run after this one (i.e. have - # this migration added to their dependencies). Useful to make third-party - # apps' migrations run after your AUTH_USER replacement, for example. - run_before = [] - - # Migration names in this app that this migration replaces. If this is - # non-empty, this migration will only be applied if all these migrations - # are not applied. - replaces = [] - - # Is this an initial migration? Initial migrations are skipped on - # --fake-initial if the table or fields already exist. If None, check if - # the migration has any dependencies to determine if there are dependencies - # to tell if db introspection needs to be done. If True, always perform - # introspection. If False, never perform introspection. - initial = None - - # Whether to wrap the whole migration in a transaction. Only has an effect - # on database backends which support transactional DDL. - atomic = True - - def __init__(self, name, app_label): - self.name = name - self.app_label = app_label - # Copy dependencies & other attrs as we might mutate them at runtime - self.operations = list(self.__class__.operations) - self.dependencies = list(self.__class__.dependencies) - self.run_before = list(self.__class__.run_before) - self.replaces = list(self.__class__.replaces) - - def __eq__(self, other): - return ( - isinstance(other, Migration) - and self.name == other.name - and self.app_label == other.app_label - ) - - def __repr__(self): - return "" % (self.app_label, self.name) - - def __str__(self): - return "%s.%s" % (self.app_label, self.name) - - def __hash__(self): - return hash("%s.%s" % (self.app_label, self.name)) - - def mutate_state(self, project_state, preserve=True): - """ - Take a ProjectState and return a new one with the migration's - operations applied to it. Preserve the original object state by - default and return a mutated state from a copy. - """ - new_state = project_state - if preserve: - new_state = project_state.clone() - - for operation in self.operations: - operation.state_forwards(self.app_label, new_state) - return new_state - - def apply(self, project_state, schema_editor, collect_sql=False): - """ - Take a project_state representing all migrations prior to this one - and a schema_editor for a live database and apply the migration - in a forwards order. - - Return the resulting project state for efficient reuse by following - Migrations. - """ - for operation in self.operations: - # If this operation cannot be represented as SQL, place a comment - # there instead - if collect_sql: - schema_editor.collected_sql.append("--") - schema_editor.collected_sql.append("-- %s" % operation.describe()) - schema_editor.collected_sql.append("--") - if not operation.reduces_to_sql: - schema_editor.collected_sql.append( - "-- THIS OPERATION CANNOT BE WRITTEN AS SQL" - ) - continue - collected_sql_before = len(schema_editor.collected_sql) - # Save the state before the operation has run - old_state = project_state.clone() - operation.state_forwards(self.app_label, project_state) - # Run the operation - atomic_operation = operation.atomic or ( - self.atomic and operation.atomic is not False - ) - if not schema_editor.atomic_migration and atomic_operation: - # Force a transaction on a non-transactional-DDL backend or an - # atomic operation inside a non-atomic migration. - with atomic(schema_editor.connection.alias): - operation.database_forwards( - self.app_label, schema_editor, old_state, project_state - ) - else: - # Normal behaviour - operation.database_forwards( - self.app_label, schema_editor, old_state, project_state - ) - if collect_sql and collected_sql_before == len(schema_editor.collected_sql): - schema_editor.collected_sql.append("-- (no-op)") - return project_state - - def unapply(self, project_state, schema_editor, collect_sql=False): - """ - Take a project_state representing all migrations prior to this one - and a schema_editor for a live database and apply the migration - in a reverse order. - - The backwards migration process consists of two phases: - - 1. The intermediate states from right before the first until right - after the last operation inside this migration are preserved. - 2. The operations are applied in reverse order using the states - recorded in step 1. - """ - # Construct all the intermediate states we need for a reverse migration - to_run = [] - new_state = project_state - # Phase 1 - for operation in self.operations: - # If it's irreversible, error out - if not operation.reversible: - raise IrreversibleError( - "Operation %s in %s is not reversible" % (operation, self) - ) - # Preserve new state from previous run to not tamper the same state - # over all operations - new_state = new_state.clone() - old_state = new_state.clone() - operation.state_forwards(self.app_label, new_state) - to_run.insert(0, (operation, old_state, new_state)) - - # Phase 2 - for operation, to_state, from_state in to_run: - if collect_sql: - schema_editor.collected_sql.append("--") - schema_editor.collected_sql.append("-- %s" % operation.describe()) - schema_editor.collected_sql.append("--") - if not operation.reduces_to_sql: - schema_editor.collected_sql.append( - "-- THIS OPERATION CANNOT BE WRITTEN AS SQL" - ) - continue - collected_sql_before = len(schema_editor.collected_sql) - atomic_operation = operation.atomic or ( - self.atomic and operation.atomic is not False - ) - if not schema_editor.atomic_migration and atomic_operation: - # Force a transaction on a non-transactional-DDL backend or an - # atomic operation inside a non-atomic migration. - with atomic(schema_editor.connection.alias): - operation.database_backwards( - self.app_label, schema_editor, from_state, to_state - ) - else: - # Normal behaviour - operation.database_backwards( - self.app_label, schema_editor, from_state, to_state - ) - if collect_sql and collected_sql_before == len(schema_editor.collected_sql): - schema_editor.collected_sql.append("-- (no-op)") - return project_state - - def suggest_name(self): - """ - Suggest a name for the operations this migration might represent. Names - are not guaranteed to be unique, but put some effort into the fallback - name to avoid VCS conflicts if possible. - """ - if self.initial: - return "initial" - - raw_fragments = [op.migration_name_fragment for op in self.operations] - fragments = [re.sub(r"\W+", "_", name) for name in raw_fragments if name] - - if not fragments or len(fragments) != len(self.operations): - return "auto_%s" % get_migration_name_timestamp() - - name = fragments[0] - for fragment in fragments[1:]: - new_name = f"{name}_{fragment}" - if len(new_name) > 52: - name = f"{name}_and_more" - break - name = new_name - return name - - -class SwappableTuple(tuple): - """ - Subclass of tuple so Django can tell this was originally a swappable - dependency when it reads the migration file. - """ - - def __new__(cls, value, setting): - self = tuple.__new__(cls, value) - self.setting = setting - return self - - -def swappable_dependency(value): - """Turn a setting value into a dependency.""" - return SwappableTuple((value.split(".", 1)[0], "__first__"), value) diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/operations/__init__.py b/.venv/lib/python3.10/site-packages/django/db/migrations/operations/__init__.py deleted file mode 100644 index 012f202..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/operations/__init__.py +++ /dev/null @@ -1,46 +0,0 @@ -from .fields import AddField, AlterField, RemoveField, RenameField -from .models import ( - AddConstraint, - AddIndex, - AlterConstraint, - AlterIndexTogether, - AlterModelManagers, - AlterModelOptions, - AlterModelTable, - AlterModelTableComment, - AlterOrderWithRespectTo, - AlterUniqueTogether, - CreateModel, - DeleteModel, - RemoveConstraint, - RemoveIndex, - RenameIndex, - RenameModel, -) -from .special import RunPython, RunSQL, SeparateDatabaseAndState - -__all__ = [ - "CreateModel", - "DeleteModel", - "AlterModelTable", - "AlterModelTableComment", - "AlterUniqueTogether", - "RenameModel", - "AlterIndexTogether", - "AlterModelOptions", - "AddIndex", - "RemoveIndex", - "RenameIndex", - "AddField", - "RemoveField", - "AlterField", - "RenameField", - "AddConstraint", - "RemoveConstraint", - "AlterConstraint", - "SeparateDatabaseAndState", - "RunSQL", - "RunPython", - "AlterOrderWithRespectTo", - "AlterModelManagers", -] diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/operations/base.py b/.venv/lib/python3.10/site-packages/django/db/migrations/operations/base.py deleted file mode 100644 index 3bd9546..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/operations/base.py +++ /dev/null @@ -1,166 +0,0 @@ -import enum - -from django.db import router - - -class OperationCategory(str, enum.Enum): - ADDITION = "+" - REMOVAL = "-" - ALTERATION = "~" - PYTHON = "p" - SQL = "s" - MIXED = "?" - - -class Operation: - """ - Base class for migration operations. - - It's responsible for both mutating the in-memory model state - (see db/migrations/state.py) to represent what it performs, as well - as actually performing it against a live database. - - Note that some operations won't modify memory state at all (e.g. data - copying operations), and some will need their modifications to be - optionally specified by the user (e.g. custom Python code snippets) - - Due to the way this class deals with deconstruction, it should be - considered immutable. - """ - - # If this migration can be run in reverse. - # Some operations are impossible to reverse, like deleting data. - reversible = True - - # Can this migration be represented as SQL? (things like RunPython cannot) - reduces_to_sql = True - - # Should this operation be forced as atomic even on backends with no - # DDL transaction support (i.e., does it have no DDL, like RunPython) - atomic = False - - # Should this operation be considered safe to elide and optimize across? - elidable = False - - serialization_expand_args = [] - - category = None - - def __new__(cls, *args, **kwargs): - # We capture the arguments to make returning them trivial - self = object.__new__(cls) - self._constructor_args = (args, kwargs) - return self - - def deconstruct(self): - """ - Return a 3-tuple of class import path (or just name if it lives - under django.db.migrations), positional arguments, and keyword - arguments. - """ - return ( - self.__class__.__name__, - self._constructor_args[0], - self._constructor_args[1], - ) - - def state_forwards(self, app_label, state): - """ - Take the state from the previous migration, and mutate it - so that it matches what this migration would perform. - """ - raise NotImplementedError( - "subclasses of Operation must provide a state_forwards() method" - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - """ - Perform the mutation on the database schema in the normal - (forwards) direction. - """ - raise NotImplementedError( - "subclasses of Operation must provide a database_forwards() method" - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - """ - Perform the mutation on the database schema in the reverse - direction - e.g. if this were CreateModel, it would in fact - drop the model's table. - """ - raise NotImplementedError( - "subclasses of Operation must provide a database_backwards() method" - ) - - def describe(self): - """ - Output a brief summary of what the action does. - """ - return "%s: %s" % (self.__class__.__name__, self._constructor_args) - - def formatted_description(self): - """Output a description prefixed by a category symbol.""" - description = self.describe() - if self.category is None: - return f"{OperationCategory.MIXED.value} {description}" - return f"{self.category.value} {description}" - - @property - def migration_name_fragment(self): - """ - A filename part suitable for automatically naming a migration - containing this operation, or None if not applicable. - """ - return None - - def references_model(self, name, app_label): - """ - Return True if there is a chance this operation references the given - model name (as a string), with an app label for accuracy. - - Used for optimization. If in doubt, return True; - returning a false positive will merely make the optimizer a little - less efficient, while returning a false negative may result in an - unusable optimized migration. - """ - return True - - def references_field(self, model_name, name, app_label): - """ - Return True if there is a chance this operation references the given - field name, with an app label for accuracy. - - Used for optimization. If in doubt, return True. - """ - return self.references_model(model_name, app_label) - - def allow_migrate_model(self, connection_alias, model): - """ - Return whether or not a model may be migrated. - - This is a thin wrapper around router.allow_migrate_model() that - preemptively rejects any proxy, swapped out, or unmanaged model. - """ - if not model._meta.can_migrate(connection_alias): - return False - - return router.allow_migrate_model(connection_alias, model) - - def reduce(self, operation, app_label): - """ - Return either a list of operations the actual operation should be - replaced with or a boolean that indicates whether or not the specified - operation can be optimized across. - """ - if self.elidable: - return [operation] - elif operation.elidable: - return [self] - return False - - def __repr__(self): - return "<%s %s%s>" % ( - self.__class__.__name__, - ", ".join(map(repr, self._constructor_args[0])), - ",".join(" %s=%r" % x for x in self._constructor_args[1].items()), - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/operations/fields.py b/.venv/lib/python3.10/site-packages/django/db/migrations/operations/fields.py deleted file mode 100644 index 34b441a..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/operations/fields.py +++ /dev/null @@ -1,365 +0,0 @@ -from django.db.migrations.utils import field_references -from django.db.models import NOT_PROVIDED -from django.utils.functional import cached_property - -from .base import Operation, OperationCategory - - -class FieldOperation(Operation): - def __init__(self, model_name, name, field=None): - self.model_name = model_name - self.name = name - self.field = field - - @cached_property - def model_name_lower(self): - return self.model_name.lower() - - @cached_property - def name_lower(self): - return self.name.lower() - - def is_same_model_operation(self, operation): - return self.model_name_lower == operation.model_name_lower - - def is_same_field_operation(self, operation): - return ( - self.is_same_model_operation(operation) - and self.name_lower == operation.name_lower - ) - - def references_model(self, name, app_label): - name_lower = name.lower() - if name_lower == self.model_name_lower: - return True - if self.field: - return bool( - field_references( - (app_label, self.model_name_lower), - self.field, - (app_label, name_lower), - ) - ) - return False - - def references_field(self, model_name, name, app_label): - model_name_lower = model_name.lower() - # Check if this operation locally references the field. - if model_name_lower == self.model_name_lower: - if name == self.name: - return True - elif ( - self.field - and hasattr(self.field, "from_fields") - and name in self.field.from_fields - ): - return True - # Check if this operation remotely references the field. - if self.field is None: - return False - return bool( - field_references( - (app_label, self.model_name_lower), - self.field, - (app_label, model_name_lower), - name, - ) - ) - - def reduce(self, operation, app_label): - return super().reduce(operation, app_label) or not operation.references_field( - self.model_name, self.name, app_label - ) - - -class AddField(FieldOperation): - """Add a field to a model.""" - - category = OperationCategory.ADDITION - - def __init__(self, model_name, name, field, preserve_default=True): - self.preserve_default = preserve_default - super().__init__(model_name, name, field) - - def deconstruct(self): - kwargs = { - "model_name": self.model_name, - "name": self.name, - "field": self.field, - } - if self.preserve_default is not True: - kwargs["preserve_default"] = self.preserve_default - return (self.__class__.__name__, [], kwargs) - - def state_forwards(self, app_label, state): - state.add_field( - app_label, - self.model_name_lower, - self.name, - self.field, - self.preserve_default, - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - to_model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, to_model): - from_model = from_state.apps.get_model(app_label, self.model_name) - field = to_model._meta.get_field(self.name) - if not self.preserve_default: - field.default = self.field.default - schema_editor.add_field( - from_model, - field, - ) - if not self.preserve_default: - field.default = NOT_PROVIDED - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - from_model = from_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, from_model): - schema_editor.remove_field( - from_model, from_model._meta.get_field(self.name) - ) - - def describe(self): - return "Add field %s to %s" % (self.name, self.model_name) - - @property - def migration_name_fragment(self): - return "%s_%s" % (self.model_name_lower, self.name_lower) - - def reduce(self, operation, app_label): - if isinstance(operation, FieldOperation) and self.is_same_field_operation( - operation - ): - if isinstance(operation, AlterField): - return [ - AddField( - model_name=self.model_name, - name=operation.name, - field=operation.field, - ), - ] - elif isinstance(operation, RemoveField): - return [] - elif isinstance(operation, RenameField): - return [ - AddField( - model_name=self.model_name, - name=operation.new_name, - field=self.field, - ), - ] - return super().reduce(operation, app_label) - - -class RemoveField(FieldOperation): - """Remove a field from a model.""" - - category = OperationCategory.REMOVAL - - def deconstruct(self): - kwargs = { - "model_name": self.model_name, - "name": self.name, - } - return (self.__class__.__name__, [], kwargs) - - def state_forwards(self, app_label, state): - state.remove_field(app_label, self.model_name_lower, self.name) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - from_model = from_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, from_model): - schema_editor.remove_field( - from_model, from_model._meta.get_field(self.name) - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - to_model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, to_model): - from_model = from_state.apps.get_model(app_label, self.model_name) - schema_editor.add_field(from_model, to_model._meta.get_field(self.name)) - - def describe(self): - return "Remove field %s from %s" % (self.name, self.model_name) - - @property - def migration_name_fragment(self): - return "remove_%s_%s" % (self.model_name_lower, self.name_lower) - - def reduce(self, operation, app_label): - from .models import DeleteModel - - if ( - isinstance(operation, DeleteModel) - and operation.name_lower == self.model_name_lower - ): - return [operation] - return super().reduce(operation, app_label) - - -class AlterField(FieldOperation): - """ - Alter a field's database column (e.g. null, max_length) to the provided - new field. - """ - - category = OperationCategory.ALTERATION - - def __init__(self, model_name, name, field, preserve_default=True): - self.preserve_default = preserve_default - super().__init__(model_name, name, field) - - def deconstruct(self): - kwargs = { - "model_name": self.model_name, - "name": self.name, - "field": self.field, - } - if self.preserve_default is not True: - kwargs["preserve_default"] = self.preserve_default - return (self.__class__.__name__, [], kwargs) - - def state_forwards(self, app_label, state): - state.alter_field( - app_label, - self.model_name_lower, - self.name, - self.field, - self.preserve_default, - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - to_model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, to_model): - from_model = from_state.apps.get_model(app_label, self.model_name) - from_field = from_model._meta.get_field(self.name) - to_field = to_model._meta.get_field(self.name) - if not self.preserve_default: - to_field.default = self.field.default - schema_editor.alter_field(from_model, from_field, to_field) - if not self.preserve_default: - to_field.default = NOT_PROVIDED - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - self.database_forwards(app_label, schema_editor, from_state, to_state) - - def describe(self): - return "Alter field %s on %s" % (self.name, self.model_name) - - @property - def migration_name_fragment(self): - return "alter_%s_%s" % (self.model_name_lower, self.name_lower) - - def reduce(self, operation, app_label): - if isinstance( - operation, (AlterField, RemoveField) - ) and self.is_same_field_operation(operation): - return [operation] - elif ( - isinstance(operation, RenameField) - and self.is_same_field_operation(operation) - and self.field.db_column is None - ): - return [ - operation, - AlterField( - model_name=self.model_name, - name=operation.new_name, - field=self.field, - ), - ] - return super().reduce(operation, app_label) - - -class RenameField(FieldOperation): - """Rename a field on the model. Might affect db_column too.""" - - category = OperationCategory.ALTERATION - - def __init__(self, model_name, old_name, new_name): - self.old_name = old_name - self.new_name = new_name - super().__init__(model_name, old_name) - - @cached_property - def old_name_lower(self): - return self.old_name.lower() - - @cached_property - def new_name_lower(self): - return self.new_name.lower() - - def deconstruct(self): - kwargs = { - "model_name": self.model_name, - "old_name": self.old_name, - "new_name": self.new_name, - } - return (self.__class__.__name__, [], kwargs) - - def state_forwards(self, app_label, state): - state.rename_field( - app_label, self.model_name_lower, self.old_name, self.new_name - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - to_model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, to_model): - from_model = from_state.apps.get_model(app_label, self.model_name) - schema_editor.alter_field( - from_model, - from_model._meta.get_field(self.old_name), - to_model._meta.get_field(self.new_name), - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - to_model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, to_model): - from_model = from_state.apps.get_model(app_label, self.model_name) - schema_editor.alter_field( - from_model, - from_model._meta.get_field(self.new_name), - to_model._meta.get_field(self.old_name), - ) - - def describe(self): - return "Rename field %s on %s to %s" % ( - self.old_name, - self.model_name, - self.new_name, - ) - - @property - def migration_name_fragment(self): - return "rename_%s_%s_%s" % ( - self.old_name_lower, - self.model_name_lower, - self.new_name_lower, - ) - - def references_field(self, model_name, name, app_label): - return self.references_model(model_name, app_label) and ( - name.lower() == self.old_name_lower or name.lower() == self.new_name_lower - ) - - def reduce(self, operation, app_label): - if ( - isinstance(operation, RenameField) - and self.is_same_model_operation(operation) - and self.new_name_lower == operation.old_name_lower - ): - return [ - RenameField( - self.model_name, - self.old_name, - operation.new_name, - ), - ] - # Skip `FieldOperation.reduce` as we want to run `references_field` - # against self.old_name and self.new_name. - return super(FieldOperation, self).reduce(operation, app_label) or not ( - operation.references_field(self.model_name, self.old_name, app_label) - or operation.references_field(self.model_name, self.new_name, app_label) - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/operations/models.py b/.venv/lib/python3.10/site-packages/django/db/migrations/operations/models.py deleted file mode 100644 index 266a3ef..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/operations/models.py +++ /dev/null @@ -1,1342 +0,0 @@ -from django.db import models -from django.db.migrations.operations.base import Operation, OperationCategory -from django.db.migrations.state import ModelState -from django.db.migrations.utils import field_references, resolve_relation -from django.db.models.options import normalize_together -from django.utils.functional import cached_property - -from .fields import AddField, AlterField, FieldOperation, RemoveField, RenameField - - -def _check_for_duplicates(arg_name, objs): - used_vals = set() - for val in objs: - if val in used_vals: - raise ValueError( - "Found duplicate value %s in CreateModel %s argument." % (val, arg_name) - ) - used_vals.add(val) - - -class ModelOperation(Operation): - def __init__(self, name): - self.name = name - - @cached_property - def name_lower(self): - return self.name.lower() - - def references_model(self, name, app_label): - return name.lower() == self.name_lower - - def reduce(self, operation, app_label): - return super().reduce(operation, app_label) or self.can_reduce_through( - operation, app_label - ) - - def can_reduce_through(self, operation, app_label): - return not operation.references_model(self.name, app_label) - - -class CreateModel(ModelOperation): - """Create a model's table.""" - - category = OperationCategory.ADDITION - serialization_expand_args = ["fields", "options", "managers"] - - def __init__(self, name, fields, options=None, bases=None, managers=None): - self.fields = fields - self.options = options or {} - self.bases = bases or (models.Model,) - self.managers = managers or [] - super().__init__(name) - # Sanity-check that there are no duplicated field names, bases, or - # manager names - _check_for_duplicates("fields", (name for name, _ in self.fields)) - _check_for_duplicates( - "bases", - ( - ( - base._meta.label_lower - if hasattr(base, "_meta") - else base.lower() if isinstance(base, str) else base - ) - for base in self.bases - ), - ) - _check_for_duplicates("managers", (name for name, _ in self.managers)) - - def deconstruct(self): - kwargs = { - "name": self.name, - "fields": self.fields, - } - if self.options: - kwargs["options"] = self.options - if self.bases and self.bases != (models.Model,): - kwargs["bases"] = self.bases - if self.managers and self.managers != [("objects", models.Manager())]: - kwargs["managers"] = self.managers - return (self.__class__.__qualname__, [], kwargs) - - def state_forwards(self, app_label, state): - state.add_model( - ModelState( - app_label, - self.name, - list(self.fields), - dict(self.options), - tuple(self.bases), - list(self.managers), - ) - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - model = to_state.apps.get_model(app_label, self.name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.create_model(model) - # While the `index_together` option has been deprecated some - # historical migrations might still have references to them. - # This can be moved to the schema editor once it's adapted to - # from model states instead of rendered models (#29898). - to_model_state = to_state.models[app_label, self.name_lower] - if index_together := to_model_state.options.get("index_together"): - schema_editor.alter_index_together( - model, - set(), - index_together, - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - model = from_state.apps.get_model(app_label, self.name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.delete_model(model) - - def describe(self): - return "Create %smodel %s" % ( - "proxy " if self.options.get("proxy", False) else "", - self.name, - ) - - @property - def migration_name_fragment(self): - return self.name_lower - - def references_model(self, name, app_label): - name_lower = name.lower() - if name_lower == self.name_lower: - return True - - # Check we didn't inherit from the model - reference_model_tuple = (app_label, name_lower) - for base in self.bases: - if ( - base is not models.Model - and isinstance(base, (models.base.ModelBase, str)) - and resolve_relation(base, app_label) == reference_model_tuple - ): - return True - - # Check we have no FKs/M2Ms with it - for _name, field in self.fields: - if field_references( - (app_label, self.name_lower), field, reference_model_tuple - ): - return True - return False - - def reduce(self, operation, app_label): - if ( - isinstance(operation, DeleteModel) - and self.name_lower == operation.name_lower - and not self.options.get("proxy", False) - ): - return [] - elif ( - isinstance(operation, RenameModel) - and self.name_lower == operation.old_name_lower - ): - return [ - CreateModel( - operation.new_name, - fields=self.fields, - options=self.options, - bases=self.bases, - managers=self.managers, - ), - ] - elif ( - isinstance(operation, AlterModelOptions) - and self.name_lower == operation.name_lower - ): - options = {**self.options, **operation.options} - for key in operation.ALTER_OPTION_KEYS: - if key not in operation.options: - options.pop(key, None) - return [ - CreateModel( - self.name, - fields=self.fields, - options=options, - bases=self.bases, - managers=self.managers, - ), - ] - elif ( - isinstance(operation, AlterModelManagers) - and self.name_lower == operation.name_lower - ): - return [ - CreateModel( - self.name, - fields=self.fields, - options=self.options, - bases=self.bases, - managers=operation.managers, - ), - ] - elif ( - isinstance(operation, AlterModelTable) - and self.name_lower == operation.name_lower - ): - return [ - CreateModel( - self.name, - fields=self.fields, - options={ - **self.options, - "db_table": operation.table, - }, - bases=self.bases, - managers=self.managers, - ), - ] - elif ( - isinstance(operation, AlterModelTableComment) - and self.name_lower == operation.name_lower - ): - return [ - CreateModel( - self.name, - fields=self.fields, - options={ - **self.options, - "db_table_comment": operation.table_comment, - }, - bases=self.bases, - managers=self.managers, - ), - ] - elif ( - isinstance(operation, AlterTogetherOptionOperation) - and self.name_lower == operation.name_lower - ): - return [ - CreateModel( - self.name, - fields=self.fields, - options={ - **self.options, - **{operation.option_name: operation.option_value}, - }, - bases=self.bases, - managers=self.managers, - ), - ] - elif ( - isinstance(operation, AlterOrderWithRespectTo) - and self.name_lower == operation.name_lower - ): - return [ - CreateModel( - self.name, - fields=self.fields, - options={ - **self.options, - "order_with_respect_to": operation.order_with_respect_to, - }, - bases=self.bases, - managers=self.managers, - ), - ] - elif ( - isinstance(operation, FieldOperation) - and self.name_lower == operation.model_name_lower - ): - if isinstance(operation, AddField): - return [ - CreateModel( - self.name, - fields=self.fields + [(operation.name, operation.field)], - options=self.options, - bases=self.bases, - managers=self.managers, - ), - ] - elif isinstance(operation, AlterField): - return [ - CreateModel( - self.name, - fields=[ - (n, operation.field if n == operation.name else v) - for n, v in self.fields - ], - options=self.options, - bases=self.bases, - managers=self.managers, - ), - ] - elif isinstance(operation, RemoveField): - options = self.options.copy() - for option_name in ("unique_together", "index_together"): - option = options.pop(option_name, None) - if option: - option = set( - filter( - bool, - ( - tuple( - f for f in fields if f != operation.name_lower - ) - for fields in option - ), - ) - ) - if option: - options[option_name] = option - order_with_respect_to = options.get("order_with_respect_to") - if order_with_respect_to == operation.name_lower: - del options["order_with_respect_to"] - return [ - CreateModel( - self.name, - fields=[ - (n, v) - for n, v in self.fields - if n.lower() != operation.name_lower - ], - options=options, - bases=self.bases, - managers=self.managers, - ), - ] - elif isinstance(operation, RenameField): - options = self.options.copy() - for option_name in ("unique_together", "index_together"): - option = options.get(option_name) - if option: - options[option_name] = { - tuple( - operation.new_name if f == operation.old_name else f - for f in fields - ) - for fields in option - } - order_with_respect_to = options.get("order_with_respect_to") - if order_with_respect_to == operation.old_name: - options["order_with_respect_to"] = operation.new_name - return [ - CreateModel( - self.name, - fields=[ - (operation.new_name if n == operation.old_name else n, v) - for n, v in self.fields - ], - options=options, - bases=self.bases, - managers=self.managers, - ), - ] - elif ( - isinstance(operation, IndexOperation) - and self.name_lower == operation.model_name_lower - ): - if isinstance(operation, AddIndex): - return [ - CreateModel( - self.name, - fields=self.fields, - options={ - **self.options, - "indexes": [ - *self.options.get("indexes", []), - operation.index, - ], - }, - bases=self.bases, - managers=self.managers, - ), - ] - elif isinstance(operation, RemoveIndex): - options_indexes = [ - index - for index in self.options.get("indexes", []) - if index.name != operation.name - ] - return [ - CreateModel( - self.name, - fields=self.fields, - options={ - **self.options, - "indexes": options_indexes, - }, - bases=self.bases, - managers=self.managers, - ), - ] - elif isinstance(operation, AddConstraint): - return [ - CreateModel( - self.name, - fields=self.fields, - options={ - **self.options, - "constraints": [ - *self.options.get("constraints", []), - operation.constraint, - ], - }, - bases=self.bases, - managers=self.managers, - ), - ] - elif isinstance(operation, RemoveConstraint): - options_constraints = [ - constraint - for constraint in self.options.get("constraints", []) - if constraint.name != operation.name - ] - return [ - CreateModel( - self.name, - fields=self.fields, - options={ - **self.options, - "constraints": options_constraints, - }, - bases=self.bases, - managers=self.managers, - ), - ] - return super().reduce(operation, app_label) - - -class DeleteModel(ModelOperation): - """Drop a model's table.""" - - category = OperationCategory.REMOVAL - - def deconstruct(self): - kwargs = { - "name": self.name, - } - return (self.__class__.__qualname__, [], kwargs) - - def state_forwards(self, app_label, state): - state.remove_model(app_label, self.name_lower) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - model = from_state.apps.get_model(app_label, self.name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.delete_model(model) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - model = to_state.apps.get_model(app_label, self.name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.create_model(model) - - def references_model(self, name, app_label): - # The deleted model could be referencing the specified model through - # related fields. - return True - - def describe(self): - return "Delete model %s" % self.name - - @property - def migration_name_fragment(self): - return "delete_%s" % self.name_lower - - -class RenameModel(ModelOperation): - """Rename a model.""" - - category = OperationCategory.ALTERATION - - def __init__(self, old_name, new_name): - self.old_name = old_name - self.new_name = new_name - super().__init__(old_name) - - @cached_property - def old_name_lower(self): - return self.old_name.lower() - - @cached_property - def new_name_lower(self): - return self.new_name.lower() - - def deconstruct(self): - kwargs = { - "old_name": self.old_name, - "new_name": self.new_name, - } - return (self.__class__.__qualname__, [], kwargs) - - def state_forwards(self, app_label, state): - state.rename_model(app_label, self.old_name, self.new_name) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - new_model = to_state.apps.get_model(app_label, self.new_name) - if self.allow_migrate_model(schema_editor.connection.alias, new_model): - old_model = from_state.apps.get_model(app_label, self.old_name) - # Move the main table - schema_editor.alter_db_table( - new_model, - old_model._meta.db_table, - new_model._meta.db_table, - ) - # Alter the fields pointing to us - for related_object in old_model._meta.related_objects: - if related_object.related_model == old_model: - model = new_model - related_key = (app_label, self.new_name_lower) - else: - related_key = ( - related_object.related_model._meta.app_label, - related_object.related_model._meta.model_name, - ) - model = to_state.apps.get_model(*related_key) - to_field = to_state.apps.get_model(*related_key)._meta.get_field( - related_object.field.name - ) - schema_editor.alter_field( - model, - related_object.field, - to_field, - ) - # Rename M2M fields whose name is based on this model's name. - fields = zip( - old_model._meta.local_many_to_many, new_model._meta.local_many_to_many - ) - for old_field, new_field in fields: - # Skip self-referential fields as these are renamed above. - if ( - new_field.model == new_field.related_model - or not new_field.remote_field.through._meta.auto_created - ): - continue - # Rename columns and the M2M table. - schema_editor._alter_many_to_many( - new_model, - old_field, - new_field, - strict=False, - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - self.new_name_lower, self.old_name_lower = ( - self.old_name_lower, - self.new_name_lower, - ) - self.new_name, self.old_name = self.old_name, self.new_name - - self.database_forwards(app_label, schema_editor, from_state, to_state) - - self.new_name_lower, self.old_name_lower = ( - self.old_name_lower, - self.new_name_lower, - ) - self.new_name, self.old_name = self.old_name, self.new_name - - def references_model(self, name, app_label): - return ( - name.lower() == self.old_name_lower or name.lower() == self.new_name_lower - ) - - def describe(self): - return "Rename model %s to %s" % (self.old_name, self.new_name) - - @property - def migration_name_fragment(self): - return "rename_%s_%s" % (self.old_name_lower, self.new_name_lower) - - def reduce(self, operation, app_label): - if ( - isinstance(operation, RenameModel) - and self.new_name_lower == operation.old_name_lower - ): - return [ - RenameModel( - self.old_name, - operation.new_name, - ), - ] - # Skip `ModelOperation.reduce` as we want to run `references_model` - # against self.new_name. - return super(ModelOperation, self).reduce( - operation, app_label - ) or not operation.references_model(self.new_name, app_label) - - -class ModelOptionOperation(ModelOperation): - category = OperationCategory.ALTERATION - - def reduce(self, operation, app_label): - if ( - isinstance(operation, (self.__class__, DeleteModel)) - and self.name_lower == operation.name_lower - ): - return [operation] - return super().reduce(operation, app_label) - - -class AlterModelTable(ModelOptionOperation): - """Rename a model's table.""" - - def __init__(self, name, table): - self.table = table - super().__init__(name) - - def deconstruct(self): - kwargs = { - "name": self.name, - "table": self.table, - } - return (self.__class__.__qualname__, [], kwargs) - - def state_forwards(self, app_label, state): - state.alter_model_options(app_label, self.name_lower, {"db_table": self.table}) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - new_model = to_state.apps.get_model(app_label, self.name) - if self.allow_migrate_model(schema_editor.connection.alias, new_model): - old_model = from_state.apps.get_model(app_label, self.name) - schema_editor.alter_db_table( - new_model, - old_model._meta.db_table, - new_model._meta.db_table, - ) - # Rename M2M fields whose name is based on this model's db_table - for old_field, new_field in zip( - old_model._meta.local_many_to_many, new_model._meta.local_many_to_many - ): - if new_field.remote_field.through._meta.auto_created: - schema_editor.alter_db_table( - new_field.remote_field.through, - old_field.remote_field.through._meta.db_table, - new_field.remote_field.through._meta.db_table, - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - return self.database_forwards(app_label, schema_editor, from_state, to_state) - - def describe(self): - return "Rename table for %s to %s" % ( - self.name, - self.table if self.table is not None else "(default)", - ) - - @property - def migration_name_fragment(self): - return "alter_%s_table" % self.name_lower - - -class AlterModelTableComment(ModelOptionOperation): - def __init__(self, name, table_comment): - self.table_comment = table_comment - super().__init__(name) - - def deconstruct(self): - kwargs = { - "name": self.name, - "table_comment": self.table_comment, - } - return (self.__class__.__qualname__, [], kwargs) - - def state_forwards(self, app_label, state): - state.alter_model_options( - app_label, self.name_lower, {"db_table_comment": self.table_comment} - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - new_model = to_state.apps.get_model(app_label, self.name) - if self.allow_migrate_model(schema_editor.connection.alias, new_model): - old_model = from_state.apps.get_model(app_label, self.name) - schema_editor.alter_db_table_comment( - new_model, - old_model._meta.db_table_comment, - new_model._meta.db_table_comment, - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - return self.database_forwards(app_label, schema_editor, from_state, to_state) - - def describe(self): - return f"Alter {self.name} table comment" - - @property - def migration_name_fragment(self): - return f"alter_{self.name_lower}_table_comment" - - -class AlterTogetherOptionOperation(ModelOptionOperation): - option_name = None - - def __init__(self, name, option_value): - if option_value: - option_value = set(normalize_together(option_value)) - setattr(self, self.option_name, option_value) - super().__init__(name) - - @cached_property - def option_value(self): - return getattr(self, self.option_name) - - def deconstruct(self): - kwargs = { - "name": self.name, - self.option_name: self.option_value, - } - return (self.__class__.__qualname__, [], kwargs) - - def state_forwards(self, app_label, state): - state.alter_model_options( - app_label, - self.name_lower, - {self.option_name: self.option_value}, - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - new_model = to_state.apps.get_model(app_label, self.name) - if self.allow_migrate_model(schema_editor.connection.alias, new_model): - from_model_state = from_state.models[app_label, self.name_lower] - to_model_state = to_state.models[app_label, self.name_lower] - alter_together = getattr(schema_editor, "alter_%s" % self.option_name) - alter_together( - new_model, - from_model_state.options.get(self.option_name) or set(), - to_model_state.options.get(self.option_name) or set(), - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - return self.database_forwards(app_label, schema_editor, from_state, to_state) - - def references_field(self, model_name, name, app_label): - return self.references_model(model_name, app_label) and ( - not self.option_value - or any((name in fields) for fields in self.option_value) - ) - - def describe(self): - return "Alter %s for %s (%s constraint(s))" % ( - self.option_name, - self.name, - len(self.option_value or ""), - ) - - @property - def migration_name_fragment(self): - return "alter_%s_%s" % (self.name_lower, self.option_name) - - def can_reduce_through(self, operation, app_label): - return super().can_reduce_through(operation, app_label) or ( - isinstance(operation, AlterTogetherOptionOperation) - and type(operation) is not type(self) - ) - - -class AlterUniqueTogether(AlterTogetherOptionOperation): - """ - Change the value of unique_together to the target one. - Input value of unique_together must be a set of tuples. - """ - - option_name = "unique_together" - - def __init__(self, name, unique_together): - super().__init__(name, unique_together) - - -class AlterIndexTogether(AlterTogetherOptionOperation): - """ - Change the value of index_together to the target one. - Input value of index_together must be a set of tuples. - """ - - option_name = "index_together" - - def __init__(self, name, index_together): - super().__init__(name, index_together) - - -class AlterOrderWithRespectTo(ModelOptionOperation): - """Represent a change with the order_with_respect_to option.""" - - option_name = "order_with_respect_to" - - def __init__(self, name, order_with_respect_to): - self.order_with_respect_to = order_with_respect_to - super().__init__(name) - - def deconstruct(self): - kwargs = { - "name": self.name, - "order_with_respect_to": self.order_with_respect_to, - } - return (self.__class__.__qualname__, [], kwargs) - - def state_forwards(self, app_label, state): - state.alter_model_options( - app_label, - self.name_lower, - {self.option_name: self.order_with_respect_to}, - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - to_model = to_state.apps.get_model(app_label, self.name) - if self.allow_migrate_model(schema_editor.connection.alias, to_model): - from_model = from_state.apps.get_model(app_label, self.name) - # Remove a field if we need to - if ( - from_model._meta.order_with_respect_to - and not to_model._meta.order_with_respect_to - ): - schema_editor.remove_field( - from_model, from_model._meta.get_field("_order") - ) - # Add a field if we need to (altering the column is untouched as - # it's likely a rename) - elif ( - to_model._meta.order_with_respect_to - and not from_model._meta.order_with_respect_to - ): - field = to_model._meta.get_field("_order") - if not field.has_default(): - field.default = 0 - schema_editor.add_field( - from_model, - field, - ) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - self.database_forwards(app_label, schema_editor, from_state, to_state) - - def references_field(self, model_name, name, app_label): - return self.references_model(model_name, app_label) and ( - self.order_with_respect_to is None or name == self.order_with_respect_to - ) - - def describe(self): - return "Set order_with_respect_to on %s to %s" % ( - self.name, - self.order_with_respect_to, - ) - - @property - def migration_name_fragment(self): - return "alter_%s_order_with_respect_to" % self.name_lower - - -class AlterModelOptions(ModelOptionOperation): - """ - Set new model options that don't directly affect the database schema - (like verbose_name, permissions, ordering). Python code in migrations - may still need them. - """ - - # Model options we want to compare and preserve in an AlterModelOptions op - ALTER_OPTION_KEYS = [ - "base_manager_name", - "default_manager_name", - "default_related_name", - "get_latest_by", - "managed", - "ordering", - "permissions", - "default_permissions", - "select_on_save", - "verbose_name", - "verbose_name_plural", - ] - - def __init__(self, name, options): - self.options = options - super().__init__(name) - - def deconstruct(self): - kwargs = { - "name": self.name, - "options": self.options, - } - return (self.__class__.__qualname__, [], kwargs) - - def state_forwards(self, app_label, state): - state.alter_model_options( - app_label, - self.name_lower, - self.options, - self.ALTER_OPTION_KEYS, - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - pass - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - pass - - def describe(self): - return "Change Meta options on %s" % self.name - - @property - def migration_name_fragment(self): - return "alter_%s_options" % self.name_lower - - -class AlterModelManagers(ModelOptionOperation): - """Alter the model's managers.""" - - serialization_expand_args = ["managers"] - - def __init__(self, name, managers): - self.managers = managers - super().__init__(name) - - def deconstruct(self): - return (self.__class__.__qualname__, [self.name, self.managers], {}) - - def state_forwards(self, app_label, state): - state.alter_model_managers(app_label, self.name_lower, self.managers) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - pass - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - pass - - def describe(self): - return "Change managers on %s" % self.name - - @property - def migration_name_fragment(self): - return "alter_%s_managers" % self.name_lower - - -class IndexOperation(Operation): - option_name = "indexes" - - @cached_property - def model_name_lower(self): - return self.model_name.lower() - - -class AddIndex(IndexOperation): - """Add an index on a model.""" - - category = OperationCategory.ADDITION - - def __init__(self, model_name, index): - self.model_name = model_name - if not index.name: - raise ValueError( - "Indexes passed to AddIndex operations require a name " - "argument. %r doesn't have one." % index - ) - self.index = index - - def state_forwards(self, app_label, state): - state.add_index(app_label, self.model_name_lower, self.index) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.add_index(model, self.index) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - model = from_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.remove_index(model, self.index) - - def deconstruct(self): - kwargs = { - "model_name": self.model_name, - "index": self.index, - } - return ( - self.__class__.__qualname__, - [], - kwargs, - ) - - def describe(self): - if self.index.expressions: - return "Create index %s on %s on model %s" % ( - self.index.name, - ", ".join([str(expression) for expression in self.index.expressions]), - self.model_name, - ) - return "Create index %s on field(s) %s of model %s" % ( - self.index.name, - ", ".join(self.index.fields), - self.model_name, - ) - - @property - def migration_name_fragment(self): - return "%s_%s" % (self.model_name_lower, self.index.name.lower()) - - def reduce(self, operation, app_label): - if isinstance(operation, RemoveIndex) and self.index.name == operation.name: - return [] - if isinstance(operation, RenameIndex) and self.index.name == operation.old_name: - self.index.name = operation.new_name - return [self.__class__(model_name=self.model_name, index=self.index)] - return super().reduce(operation, app_label) - - -class RemoveIndex(IndexOperation): - """Remove an index from a model.""" - - category = OperationCategory.REMOVAL - - def __init__(self, model_name, name): - self.model_name = model_name - self.name = name - - def state_forwards(self, app_label, state): - state.remove_index(app_label, self.model_name_lower, self.name) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - model = from_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - from_model_state = from_state.models[app_label, self.model_name_lower] - index = from_model_state.get_index_by_name(self.name) - schema_editor.remove_index(model, index) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - to_model_state = to_state.models[app_label, self.model_name_lower] - index = to_model_state.get_index_by_name(self.name) - schema_editor.add_index(model, index) - - def deconstruct(self): - kwargs = { - "model_name": self.model_name, - "name": self.name, - } - return ( - self.__class__.__qualname__, - [], - kwargs, - ) - - def describe(self): - return "Remove index %s from %s" % (self.name, self.model_name) - - @property - def migration_name_fragment(self): - return "remove_%s_%s" % (self.model_name_lower, self.name.lower()) - - -class RenameIndex(IndexOperation): - """Rename an index.""" - - category = OperationCategory.ALTERATION - - def __init__(self, model_name, new_name, old_name=None, old_fields=None): - if not old_name and not old_fields: - raise ValueError( - "RenameIndex requires one of old_name and old_fields arguments to be " - "set." - ) - if old_name and old_fields: - raise ValueError( - "RenameIndex.old_name and old_fields are mutually exclusive." - ) - self.model_name = model_name - self.new_name = new_name - self.old_name = old_name - self.old_fields = old_fields - - @cached_property - def old_name_lower(self): - return self.old_name.lower() - - @cached_property - def new_name_lower(self): - return self.new_name.lower() - - def deconstruct(self): - kwargs = { - "model_name": self.model_name, - "new_name": self.new_name, - } - if self.old_name: - kwargs["old_name"] = self.old_name - if self.old_fields: - kwargs["old_fields"] = self.old_fields - return (self.__class__.__qualname__, [], kwargs) - - def state_forwards(self, app_label, state): - if self.old_fields: - state.add_index( - app_label, - self.model_name_lower, - models.Index(fields=self.old_fields, name=self.new_name), - ) - state.remove_model_options( - app_label, - self.model_name_lower, - AlterIndexTogether.option_name, - self.old_fields, - ) - else: - state.rename_index( - app_label, self.model_name_lower, self.old_name, self.new_name - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - model = to_state.apps.get_model(app_label, self.model_name) - if not self.allow_migrate_model(schema_editor.connection.alias, model): - return - - if self.old_fields: - from_model = from_state.apps.get_model(app_label, self.model_name) - columns = [ - from_model._meta.get_field(field).column for field in self.old_fields - ] - matching_index_name = schema_editor._constraint_names( - from_model, - column_names=columns, - index=True, - unique=False, - ) - if len(matching_index_name) != 1: - raise ValueError( - "Found wrong number (%s) of indexes for %s(%s)." - % ( - len(matching_index_name), - from_model._meta.db_table, - ", ".join(columns), - ) - ) - old_index = models.Index( - fields=self.old_fields, - name=matching_index_name[0], - ) - else: - from_model_state = from_state.models[app_label, self.model_name_lower] - old_index = from_model_state.get_index_by_name(self.old_name) - # Don't alter when the index name is not changed. - if old_index.name == self.new_name: - return - - to_model_state = to_state.models[app_label, self.model_name_lower] - new_index = to_model_state.get_index_by_name(self.new_name) - schema_editor.rename_index(model, old_index, new_index) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - if self.old_fields: - # Backward operation with unnamed index is a no-op. - return - - self.new_name_lower, self.old_name_lower = ( - self.old_name_lower, - self.new_name_lower, - ) - self.new_name, self.old_name = self.old_name, self.new_name - - self.database_forwards(app_label, schema_editor, from_state, to_state) - - self.new_name_lower, self.old_name_lower = ( - self.old_name_lower, - self.new_name_lower, - ) - self.new_name, self.old_name = self.old_name, self.new_name - - def describe(self): - if self.old_name: - return ( - f"Rename index {self.old_name} on {self.model_name} to {self.new_name}" - ) - return ( - f"Rename unnamed index for {self.old_fields} on {self.model_name} to " - f"{self.new_name}" - ) - - @property - def migration_name_fragment(self): - if self.old_name: - return "rename_%s_%s" % (self.old_name_lower, self.new_name_lower) - return "rename_%s_%s_%s" % ( - self.model_name_lower, - "_".join(self.old_fields), - self.new_name_lower, - ) - - def reduce(self, operation, app_label): - if ( - isinstance(operation, RenameIndex) - and self.model_name_lower == operation.model_name_lower - and operation.old_name - and self.new_name_lower == operation.old_name_lower - ): - return [ - RenameIndex( - self.model_name, - new_name=operation.new_name, - old_name=self.old_name, - old_fields=self.old_fields, - ) - ] - return super().reduce(operation, app_label) - - -class AddConstraint(IndexOperation): - category = OperationCategory.ADDITION - option_name = "constraints" - - def __init__(self, model_name, constraint): - self.model_name = model_name - self.constraint = constraint - - def state_forwards(self, app_label, state): - state.add_constraint(app_label, self.model_name_lower, self.constraint) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.add_constraint(model, self.constraint) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - schema_editor.remove_constraint(model, self.constraint) - - def deconstruct(self): - return ( - self.__class__.__name__, - [], - { - "model_name": self.model_name, - "constraint": self.constraint, - }, - ) - - def describe(self): - return "Create constraint %s on model %s" % ( - self.constraint.name, - self.model_name, - ) - - @property - def migration_name_fragment(self): - return "%s_%s" % (self.model_name_lower, self.constraint.name.lower()) - - def reduce(self, operation, app_label): - if ( - isinstance(operation, RemoveConstraint) - and self.model_name_lower == operation.model_name_lower - and self.constraint.name == operation.name - ): - return [] - if ( - isinstance(operation, AlterConstraint) - and self.model_name_lower == operation.model_name_lower - and self.constraint.name == operation.name - ): - return [AddConstraint(self.model_name, operation.constraint)] - return super().reduce(operation, app_label) - - -class RemoveConstraint(IndexOperation): - category = OperationCategory.REMOVAL - option_name = "constraints" - - def __init__(self, model_name, name): - self.model_name = model_name - self.name = name - - def state_forwards(self, app_label, state): - state.remove_constraint(app_label, self.model_name_lower, self.name) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - from_model_state = from_state.models[app_label, self.model_name_lower] - constraint = from_model_state.get_constraint_by_name(self.name) - schema_editor.remove_constraint(model, constraint) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - model = to_state.apps.get_model(app_label, self.model_name) - if self.allow_migrate_model(schema_editor.connection.alias, model): - to_model_state = to_state.models[app_label, self.model_name_lower] - constraint = to_model_state.get_constraint_by_name(self.name) - schema_editor.add_constraint(model, constraint) - - def deconstruct(self): - return ( - self.__class__.__name__, - [], - { - "model_name": self.model_name, - "name": self.name, - }, - ) - - def describe(self): - return "Remove constraint %s from model %s" % (self.name, self.model_name) - - @property - def migration_name_fragment(self): - return "remove_%s_%s" % (self.model_name_lower, self.name.lower()) - - -class AlterConstraint(IndexOperation): - category = OperationCategory.ALTERATION - option_name = "constraints" - - def __init__(self, model_name, name, constraint): - self.model_name = model_name - self.name = name - self.constraint = constraint - - def state_forwards(self, app_label, state): - state.alter_constraint( - app_label, self.model_name_lower, self.name, self.constraint - ) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - pass - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - pass - - def deconstruct(self): - return ( - self.__class__.__name__, - [], - { - "model_name": self.model_name, - "name": self.name, - "constraint": self.constraint, - }, - ) - - def describe(self): - return f"Alter constraint {self.name} on {self.model_name}" - - @property - def migration_name_fragment(self): - return "alter_%s_%s" % (self.model_name_lower, self.constraint.name.lower()) - - def reduce(self, operation, app_label): - if ( - isinstance(operation, (AlterConstraint, RemoveConstraint)) - and self.model_name_lower == operation.model_name_lower - and self.name == operation.name - ): - return [operation] - return super().reduce(operation, app_label) diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/operations/special.py b/.venv/lib/python3.10/site-packages/django/db/migrations/operations/special.py deleted file mode 100644 index 196f24f..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/operations/special.py +++ /dev/null @@ -1,211 +0,0 @@ -from django.db import router - -from .base import Operation, OperationCategory - - -class SeparateDatabaseAndState(Operation): - """ - Take two lists of operations - ones that will be used for the database, - and ones that will be used for the state change. This allows operations - that don't support state change to have it applied, or have operations - that affect the state or not the database, or so on. - """ - - category = OperationCategory.MIXED - serialization_expand_args = ["database_operations", "state_operations"] - - def __init__(self, database_operations=None, state_operations=None): - self.database_operations = database_operations or [] - self.state_operations = state_operations or [] - - def deconstruct(self): - kwargs = {} - if self.database_operations: - kwargs["database_operations"] = self.database_operations - if self.state_operations: - kwargs["state_operations"] = self.state_operations - return (self.__class__.__qualname__, [], kwargs) - - def state_forwards(self, app_label, state): - for state_operation in self.state_operations: - state_operation.state_forwards(app_label, state) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - # We calculate state separately in here since our state functions aren't useful - for database_operation in self.database_operations: - to_state = from_state.clone() - database_operation.state_forwards(app_label, to_state) - database_operation.database_forwards( - app_label, schema_editor, from_state, to_state - ) - from_state = to_state - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - # We calculate state separately in here since our state functions aren't useful - to_states = {} - for dbop in self.database_operations: - to_states[dbop] = to_state - to_state = to_state.clone() - dbop.state_forwards(app_label, to_state) - # to_state now has the states of all the database_operations applied - # which is the from_state for the backwards migration of the last - # operation. - for database_operation in reversed(self.database_operations): - from_state = to_state - to_state = to_states[database_operation] - database_operation.database_backwards( - app_label, schema_editor, from_state, to_state - ) - - def describe(self): - return "Custom state/database change combination" - - -class RunSQL(Operation): - """ - Run some raw SQL. A reverse SQL statement may be provided. - - Also accept a list of operations that represent the state change effected - by this SQL change, in case it's custom column/table creation/deletion. - """ - - category = OperationCategory.SQL - noop = "" - - def __init__( - self, sql, reverse_sql=None, state_operations=None, hints=None, elidable=False - ): - self.sql = sql - self.reverse_sql = reverse_sql - self.state_operations = state_operations or [] - self.hints = hints or {} - self.elidable = elidable - - def deconstruct(self): - kwargs = { - "sql": self.sql, - } - if self.reverse_sql is not None: - kwargs["reverse_sql"] = self.reverse_sql - if self.state_operations: - kwargs["state_operations"] = self.state_operations - if self.hints: - kwargs["hints"] = self.hints - return (self.__class__.__qualname__, [], kwargs) - - @property - def reversible(self): - return self.reverse_sql is not None - - def state_forwards(self, app_label, state): - for state_operation in self.state_operations: - state_operation.state_forwards(app_label, state) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - if router.allow_migrate( - schema_editor.connection.alias, app_label, **self.hints - ): - self._run_sql(schema_editor, self.sql) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - if self.reverse_sql is None: - raise NotImplementedError("You cannot reverse this operation") - if router.allow_migrate( - schema_editor.connection.alias, app_label, **self.hints - ): - self._run_sql(schema_editor, self.reverse_sql) - - def describe(self): - return "Raw SQL operation" - - def _run_sql(self, schema_editor, sqls): - if isinstance(sqls, (list, tuple)): - for sql in sqls: - params = None - if isinstance(sql, (list, tuple)): - elements = len(sql) - if elements == 2: - sql, params = sql - else: - raise ValueError("Expected a 2-tuple but got %d" % elements) - schema_editor.execute(sql, params=params) - elif sqls != RunSQL.noop: - statements = schema_editor.connection.ops.prepare_sql_script(sqls) - for statement in statements: - schema_editor.execute(statement, params=None) - - -class RunPython(Operation): - """ - Run Python code in a context suitable for doing versioned ORM operations. - """ - - category = OperationCategory.PYTHON - reduces_to_sql = False - - def __init__( - self, code, reverse_code=None, atomic=None, hints=None, elidable=False - ): - self.atomic = atomic - # Forwards code - if not callable(code): - raise ValueError("RunPython must be supplied with a callable") - self.code = code - # Reverse code - if reverse_code is None: - self.reverse_code = None - else: - if not callable(reverse_code): - raise ValueError("RunPython must be supplied with callable arguments") - self.reverse_code = reverse_code - self.hints = hints or {} - self.elidable = elidable - - def deconstruct(self): - kwargs = { - "code": self.code, - } - if self.reverse_code is not None: - kwargs["reverse_code"] = self.reverse_code - if self.atomic is not None: - kwargs["atomic"] = self.atomic - if self.hints: - kwargs["hints"] = self.hints - return (self.__class__.__qualname__, [], kwargs) - - @property - def reversible(self): - return self.reverse_code is not None - - def state_forwards(self, app_label, state): - # RunPython objects have no state effect. To add some, combine this - # with SeparateDatabaseAndState. - pass - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - # RunPython has access to all models. Ensure that all models are - # reloaded in case any are delayed. - from_state.clear_delayed_apps_cache() - if router.allow_migrate( - schema_editor.connection.alias, app_label, **self.hints - ): - # We now execute the Python code in a context that contains a 'models' - # object, representing the versioned models as an app registry. - # We could try to override the global cache, but then people will still - # use direct imports, so we go with a documentation approach instead. - self.code(from_state.apps, schema_editor) - - def database_backwards(self, app_label, schema_editor, from_state, to_state): - if self.reverse_code is None: - raise NotImplementedError("You cannot reverse this operation") - if router.allow_migrate( - schema_editor.connection.alias, app_label, **self.hints - ): - self.reverse_code(from_state.apps, schema_editor) - - def describe(self): - return "Raw Python operation" - - @staticmethod - def noop(apps, schema_editor): - return None diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/optimizer.py b/.venv/lib/python3.10/site-packages/django/db/migrations/optimizer.py deleted file mode 100644 index 7e5dea2..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/optimizer.py +++ /dev/null @@ -1,69 +0,0 @@ -class MigrationOptimizer: - """ - Power the optimization process, where you provide a list of Operations - and you are returned a list of equal or shorter length - operations - are merged into one if possible. - - For example, a CreateModel and an AddField can be optimized into a - new CreateModel, and CreateModel and DeleteModel can be optimized into - nothing. - """ - - def optimize(self, operations, app_label): - """ - Main optimization entry point. Pass in a list of Operation instances, - get out a new list of Operation instances. - - Unfortunately, due to the scope of the optimization (two combinable - operations might be separated by several hundred others), this can't be - done as a peephole optimization with checks/output implemented on - the Operations themselves; instead, the optimizer looks at each - individual operation and scans forwards in the list to see if there - are any matches, stopping at boundaries - operations which can't - be optimized over (RunSQL, operations on the same field/model, etc.) - - The inner loop is run until the starting list is the same as the result - list, and then the result is returned. This means that operation - optimization must be stable and always return an equal or shorter list. - """ - # Internal tracking variable for test assertions about # of loops - if app_label is None: - raise TypeError("app_label must be a str.") - self._iterations = 0 - while True: - result = self.optimize_inner(operations, app_label) - self._iterations += 1 - if result == operations: - return result - operations = result - - def optimize_inner(self, operations, app_label): - """Inner optimization loop.""" - new_operations = [] - for i, operation in enumerate(operations): - right = True # Should we reduce on the right or on the left. - # Compare it to each operation after it - for j, other in enumerate(operations[i + 1 :]): - result = operation.reduce(other, app_label) - if isinstance(result, list): - in_between = operations[i + 1 : i + j + 1] - if right: - new_operations.extend(in_between) - new_operations.extend(result) - elif all(op.reduce(other, app_label) is True for op in in_between): - # Perform a left reduction if all of the in-between - # operations can optimize through other. - new_operations.extend(result) - new_operations.extend(in_between) - else: - # Otherwise keep trying. - new_operations.append(operation) - break - new_operations.extend(operations[i + j + 2 :]) - return new_operations - elif not result: - # Can't perform a right reduction. - right = False - else: - new_operations.append(operation) - return new_operations diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/questioner.py b/.venv/lib/python3.10/site-packages/django/db/migrations/questioner.py deleted file mode 100644 index 445d441..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/questioner.py +++ /dev/null @@ -1,347 +0,0 @@ -import datetime -import importlib -import os -import sys - -from django.apps import apps -from django.core.management.base import OutputWrapper -from django.db.models import NOT_PROVIDED -from django.utils import timezone -from django.utils.version import get_docs_version - -from .loader import MigrationLoader - - -class MigrationQuestioner: - """ - Give the autodetector responses to questions it might have. - This base class has a built-in noninteractive mode, but the - interactive subclass is what the command-line arguments will use. - """ - - def __init__(self, defaults=None, specified_apps=None, dry_run=None): - self.defaults = defaults or {} - self.specified_apps = specified_apps or set() - self.dry_run = dry_run - - def ask_initial(self, app_label): - """Should we create an initial migration for the app?""" - # If it was specified on the command line, definitely true - if app_label in self.specified_apps: - return True - # Otherwise, we look to see if it has a migrations module - # without any Python files in it, apart from __init__.py. - # Apps from the new app template will have these; the Python - # file check will ensure we skip South ones. - try: - app_config = apps.get_app_config(app_label) - except LookupError: # It's a fake app. - return self.defaults.get("ask_initial", False) - migrations_import_path, _ = MigrationLoader.migrations_module(app_config.label) - if migrations_import_path is None: - # It's an application with migrations disabled. - return self.defaults.get("ask_initial", False) - try: - migrations_module = importlib.import_module(migrations_import_path) - except ImportError: - return self.defaults.get("ask_initial", False) - else: - if getattr(migrations_module, "__file__", None): - filenames = os.listdir(os.path.dirname(migrations_module.__file__)) - elif hasattr(migrations_module, "__path__"): - if len(migrations_module.__path__) > 1: - return False - filenames = os.listdir(list(migrations_module.__path__)[0]) - return not any(x.endswith(".py") for x in filenames if x != "__init__.py") - - def ask_not_null_addition(self, field_name, model_name): - """Adding a NOT NULL field to a model.""" - # None means quit - return None - - def ask_not_null_alteration(self, field_name, model_name): - """Changing a NULL field to NOT NULL.""" - # None means quit - return None - - def ask_rename(self, model_name, old_name, new_name, field_instance): - """Was this field really renamed?""" - return self.defaults.get("ask_rename", False) - - def ask_rename_model(self, old_model_state, new_model_state): - """Was this model really renamed?""" - return self.defaults.get("ask_rename_model", False) - - def ask_merge(self, app_label): - """Should these migrations really be merged?""" - return self.defaults.get("ask_merge", False) - - def ask_auto_now_add_addition(self, field_name, model_name): - """Adding an auto_now_add field to a model.""" - # None means quit - return None - - def ask_unique_callable_default_addition(self, field_name, model_name): - """Adding a unique field with a callable default.""" - # None means continue. - return None - - -class InteractiveMigrationQuestioner(MigrationQuestioner): - def __init__( - self, defaults=None, specified_apps=None, dry_run=None, prompt_output=None - ): - super().__init__( - defaults=defaults, specified_apps=specified_apps, dry_run=dry_run - ) - self.prompt_output = prompt_output or OutputWrapper(sys.stdout) - - def _boolean_input(self, question, default=None): - self.prompt_output.write(f"{question} ", ending="") - result = input() - if not result and default is not None: - return default - while not result or result[0].lower() not in "yn": - self.prompt_output.write("Please answer yes or no: ", ending="") - result = input() - return result[0].lower() == "y" - - def _choice_input(self, question, choices): - self.prompt_output.write(f"{question}") - for i, choice in enumerate(choices): - self.prompt_output.write(" %s) %s" % (i + 1, choice)) - self.prompt_output.write("Select an option: ", ending="") - while True: - try: - result = input() - value = int(result) - except ValueError: - pass - except KeyboardInterrupt: - self.prompt_output.write("\nCancelled.") - sys.exit(1) - else: - if 0 < value <= len(choices): - return value - self.prompt_output.write("Please select a valid option: ", ending="") - - def _ask_default(self, default=""): - """ - Prompt for a default value. - - The ``default`` argument allows providing a custom default value (as a - string) which will be shown to the user and used as the return value - if the user doesn't provide any other input. - """ - self.prompt_output.write("Please enter the default value as valid Python.") - if default: - self.prompt_output.write( - f"Accept the default '{default}' by pressing 'Enter' or " - f"provide another value." - ) - self.prompt_output.write( - "The datetime and django.utils.timezone modules are available, so " - "it is possible to provide e.g. timezone.now as a value." - ) - self.prompt_output.write("Type 'exit' to exit this prompt") - while True: - if default: - prompt = "[default: {}] >>> ".format(default) - else: - prompt = ">>> " - self.prompt_output.write(prompt, ending="") - try: - code = input() - except KeyboardInterrupt: - self.prompt_output.write("\nCancelled.") - sys.exit(1) - if not code and default: - code = default - if not code: - self.prompt_output.write( - "Please enter some code, or 'exit' (without quotes) to exit." - ) - elif code == "exit": - sys.exit(1) - else: - try: - return eval(code, {}, {"datetime": datetime, "timezone": timezone}) - except Exception as e: - self.prompt_output.write(f"{e.__class__.__name__}: {e}") - - def ask_not_null_addition(self, field_name, model_name): - """Adding a NOT NULL field to a model.""" - if not self.dry_run: - choice = self._choice_input( - f"It is impossible to add a non-nullable field '{field_name}' " - f"to {model_name} without specifying a default. This is " - f"because the database needs something to populate existing " - f"rows.\n" - f"Please select a fix:", - [ - ( - "Provide a one-off default now (will be set on all existing " - "rows with a null value for this column)" - ), - "Quit and manually define a default value in models.py.", - ], - ) - if choice == 2: - sys.exit(3) - else: - return self._ask_default() - return None - - def ask_not_null_alteration(self, field_name, model_name): - """Changing a NULL field to NOT NULL.""" - if not self.dry_run: - choice = self._choice_input( - f"It is impossible to change a nullable field '{field_name}' " - f"on {model_name} to non-nullable without providing a " - f"default. This is because the database needs something to " - f"populate existing rows.\n" - f"Please select a fix:", - [ - ( - "Provide a one-off default now (will be set on all existing " - "rows with a null value for this column)" - ), - "Ignore for now. Existing rows that contain NULL values " - "will have to be handled manually, for example with a " - "RunPython or RunSQL operation.", - "Quit and manually define a default value in models.py.", - ], - ) - if choice == 2: - return NOT_PROVIDED - elif choice == 3: - sys.exit(3) - else: - return self._ask_default() - return None - - def ask_rename(self, model_name, old_name, new_name, field_instance): - """Was this field really renamed?""" - msg = "Was %s.%s renamed to %s.%s (a %s)? [y/N]" - return self._boolean_input( - msg - % ( - model_name, - old_name, - model_name, - new_name, - field_instance.__class__.__name__, - ), - False, - ) - - def ask_rename_model(self, old_model_state, new_model_state): - """Was this model really renamed?""" - msg = "Was the model %s.%s renamed to %s? [y/N]" - return self._boolean_input( - msg - % (old_model_state.app_label, old_model_state.name, new_model_state.name), - False, - ) - - def ask_merge(self, app_label): - return self._boolean_input( - "\nMerging will only work if the operations printed above do not conflict\n" - + "with each other (working on different fields or models)\n" - + "Should these migration branches be merged? [y/N]", - False, - ) - - def ask_auto_now_add_addition(self, field_name, model_name): - """Adding an auto_now_add field to a model.""" - if not self.dry_run: - choice = self._choice_input( - f"It is impossible to add the field '{field_name}' with " - f"'auto_now_add=True' to {model_name} without providing a " - f"default. This is because the database needs something to " - f"populate existing rows.\n", - [ - "Provide a one-off default now which will be set on all " - "existing rows", - "Quit and manually define a default value in models.py.", - ], - ) - if choice == 2: - sys.exit(3) - else: - return self._ask_default(default="timezone.now") - return None - - def ask_unique_callable_default_addition(self, field_name, model_name): - """Adding a unique field with a callable default.""" - if not self.dry_run: - version = get_docs_version() - choice = self._choice_input( - f"Callable default on unique field {model_name}.{field_name} " - f"will not generate unique values upon migrating.\n" - f"Please choose how to proceed:\n", - [ - f"Continue making this migration as the first step in " - f"writing a manual migration to generate unique values " - f"described here: " - f"https://docs.djangoproject.com/en/{version}/howto/" - f"writing-migrations/#migrations-that-add-unique-fields.", - "Quit and edit field options in models.py.", - ], - ) - if choice == 2: - sys.exit(3) - return None - - -class NonInteractiveMigrationQuestioner(MigrationQuestioner): - def __init__( - self, - defaults=None, - specified_apps=None, - dry_run=None, - verbosity=1, - log=None, - ): - self.verbosity = verbosity - self.log = log - super().__init__( - defaults=defaults, - specified_apps=specified_apps, - dry_run=dry_run, - ) - - def log_lack_of_migration(self, field_name, model_name, reason): - if self.verbosity > 0: - self.log( - f"Field '{field_name}' on model '{model_name}' not migrated: " - f"{reason}." - ) - - def ask_not_null_addition(self, field_name, model_name): - # We can't ask the user, so act like the user aborted. - self.log_lack_of_migration( - field_name, - model_name, - "it is impossible to add a non-nullable field without specifying " - "a default", - ) - sys.exit(3) - - def ask_not_null_alteration(self, field_name, model_name): - # We can't ask the user, so set as not provided. - self.log( - f"Field '{field_name}' on model '{model_name}' given a default of " - f"NOT PROVIDED and must be corrected." - ) - return NOT_PROVIDED - - def ask_auto_now_add_addition(self, field_name, model_name): - # We can't ask the user, so act like the user aborted. - self.log_lack_of_migration( - field_name, - model_name, - "it is impossible to add a field with 'auto_now_add=True' without " - "specifying a default", - ) - sys.exit(3) diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/recorder.py b/.venv/lib/python3.10/site-packages/django/db/migrations/recorder.py deleted file mode 100644 index cf0bd4a..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/recorder.py +++ /dev/null @@ -1,111 +0,0 @@ -from django.apps.registry import Apps -from django.db import DatabaseError, models -from django.utils.functional import classproperty -from django.utils.timezone import now - -from .exceptions import MigrationSchemaMissing - - -class MigrationRecorder: - """ - Deal with storing migration records in the database. - - Because this table is actually itself used for dealing with model - creation, it's the one thing we can't do normally via migrations. - We manually handle table creation/schema updating (using schema backend) - and then have a floating model to do queries with. - - If a migration is unapplied its row is removed from the table. Having - a row in the table always means a migration is applied. - """ - - _migration_class = None - - @classproperty - def Migration(cls): - """ - Lazy load to avoid AppRegistryNotReady if installed apps import - MigrationRecorder. - """ - if cls._migration_class is None: - - class Migration(models.Model): - app = models.CharField(max_length=255) - name = models.CharField(max_length=255) - applied = models.DateTimeField(default=now) - - class Meta: - apps = Apps() - app_label = "migrations" - db_table = "django_migrations" - - def __str__(self): - return "Migration %s for %s" % (self.name, self.app) - - cls._migration_class = Migration - return cls._migration_class - - def __init__(self, connection): - self.connection = connection - self._has_table = False - - @property - def migration_qs(self): - return self.Migration.objects.using(self.connection.alias) - - def has_table(self): - """Return True if the django_migrations table exists.""" - # If the migrations table has already been confirmed to exist, don't - # recheck it's existence. - if self._has_table: - return True - # It hasn't been confirmed to exist, recheck. - with self.connection.cursor() as cursor: - tables = self.connection.introspection.table_names(cursor) - - self._has_table = self.Migration._meta.db_table in tables - return self._has_table - - def ensure_schema(self): - """Ensure the table exists and has the correct schema.""" - # If the table's there, that's fine - we've never changed its schema - # in the codebase. - if self.has_table(): - return - # Make the table - try: - with self.connection.schema_editor() as editor: - editor.create_model(self.Migration) - except DatabaseError as exc: - raise MigrationSchemaMissing( - "Unable to create the django_migrations table (%s)" % exc - ) - - def applied_migrations(self): - """ - Return a dict mapping (app_name, migration_name) to Migration instances - for all applied migrations. - """ - if self.has_table(): - return { - (migration.app, migration.name): migration - for migration in self.migration_qs - } - else: - # If the django_migrations table doesn't exist, then no migrations - # are applied. - return {} - - def record_applied(self, app, name): - """Record that a migration was applied.""" - self.ensure_schema() - self.migration_qs.create(app=app, name=name) - - def record_unapplied(self, app, name): - """Record that a migration was unapplied.""" - self.ensure_schema() - self.migration_qs.filter(app=app, name=name).delete() - - def flush(self): - """Delete all migration records. Useful for testing migrations.""" - self.migration_qs.all().delete() diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/serializer.py b/.venv/lib/python3.10/site-packages/django/db/migrations/serializer.py deleted file mode 100644 index 4f61a69..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/serializer.py +++ /dev/null @@ -1,405 +0,0 @@ -import builtins -import collections.abc -import datetime -import decimal -import enum -import functools -import math -import os -import pathlib -import re -import types -import uuid - -from django.conf import SettingsReference -from django.db import models -from django.db.migrations.operations.base import Operation -from django.db.migrations.utils import COMPILED_REGEX_TYPE, RegexObject -from django.utils.functional import LazyObject, Promise -from django.utils.version import PY311, get_docs_version - -FUNCTION_TYPES = (types.FunctionType, types.BuiltinFunctionType, types.MethodType) - -if isinstance(functools._lru_cache_wrapper, type): - # When using CPython's _functools C module, LRU cache function decorators - # present as a class and not a function, so add that class to the list of - # function types. In the pure Python implementation and PyPy they present - # as normal functions which are already handled. - FUNCTION_TYPES += (functools._lru_cache_wrapper,) - - -class BaseSerializer: - def __init__(self, value): - self.value = value - - def serialize(self): - raise NotImplementedError( - "Subclasses of BaseSerializer must implement the serialize() method." - ) - - -class BaseSequenceSerializer(BaseSerializer): - def _format(self): - raise NotImplementedError( - "Subclasses of BaseSequenceSerializer must implement the _format() method." - ) - - def serialize(self): - imports = set() - strings = [] - for item in self.value: - item_string, item_imports = serializer_factory(item).serialize() - imports.update(item_imports) - strings.append(item_string) - value = self._format() - return value % (", ".join(strings)), imports - - -class BaseUnorderedSequenceSerializer(BaseSequenceSerializer): - def __init__(self, value): - super().__init__(sorted(value, key=repr)) - - -class BaseSimpleSerializer(BaseSerializer): - def serialize(self): - return repr(self.value), set() - - -class ChoicesSerializer(BaseSerializer): - def serialize(self): - return serializer_factory(self.value.value).serialize() - - -class DateTimeSerializer(BaseSerializer): - """For datetime.*, except datetime.datetime.""" - - def serialize(self): - return repr(self.value), {"import datetime"} - - -class DatetimeDatetimeSerializer(BaseSerializer): - """For datetime.datetime.""" - - def serialize(self): - if self.value.tzinfo is not None and self.value.tzinfo != datetime.timezone.utc: - self.value = self.value.astimezone(datetime.timezone.utc) - imports = ["import datetime"] - return repr(self.value), set(imports) - - -class DecimalSerializer(BaseSerializer): - def serialize(self): - return repr(self.value), {"from decimal import Decimal"} - - -class DeconstructableSerializer(BaseSerializer): - @staticmethod - def serialize_deconstructed(path, args, kwargs): - name, imports = DeconstructableSerializer._serialize_path(path) - strings = [] - for arg in args: - arg_string, arg_imports = serializer_factory(arg).serialize() - strings.append(arg_string) - imports.update(arg_imports) - for kw, arg in sorted(kwargs.items()): - arg_string, arg_imports = serializer_factory(arg).serialize() - imports.update(arg_imports) - strings.append("%s=%s" % (kw, arg_string)) - return "%s(%s)" % (name, ", ".join(strings)), imports - - @staticmethod - def _serialize_path(path): - module, name = path.rsplit(".", 1) - if module == "django.db.models": - imports = {"from django.db import models"} - name = "models.%s" % name - else: - imports = {"import %s" % module} - name = path - return name, imports - - def serialize(self): - return self.serialize_deconstructed(*self.value.deconstruct()) - - -class DictionarySerializer(BaseSerializer): - def serialize(self): - imports = set() - strings = [] - for k, v in sorted(self.value.items()): - k_string, k_imports = serializer_factory(k).serialize() - v_string, v_imports = serializer_factory(v).serialize() - imports.update(k_imports) - imports.update(v_imports) - strings.append((k_string, v_string)) - return "{%s}" % (", ".join("%s: %s" % (k, v) for k, v in strings)), imports - - -class EnumSerializer(BaseSerializer): - def serialize(self): - enum_class = self.value.__class__ - module = enum_class.__module__ - if issubclass(enum_class, enum.Flag): - if PY311: - members = list(self.value) - else: - members, _ = enum._decompose(enum_class, self.value) - members = reversed(members) - else: - members = (self.value,) - return ( - " | ".join( - [ - f"{module}.{enum_class.__qualname__}[{item.name!r}]" - for item in members - ] - ), - {"import %s" % module}, - ) - - -class FloatSerializer(BaseSimpleSerializer): - def serialize(self): - if math.isnan(self.value) or math.isinf(self.value): - return 'float("{}")'.format(self.value), set() - return super().serialize() - - -class FrozensetSerializer(BaseUnorderedSequenceSerializer): - def _format(self): - return "frozenset([%s])" - - -class FunctionTypeSerializer(BaseSerializer): - def serialize(self): - if getattr(self.value, "__self__", None) and isinstance( - self.value.__self__, type - ): - klass = self.value.__self__ - module = klass.__module__ - return "%s.%s.%s" % (module, klass.__qualname__, self.value.__name__), { - "import %s" % module - } - # Further error checking - if self.value.__name__ == "": - raise ValueError("Cannot serialize function: lambda") - if self.value.__module__ is None: - raise ValueError("Cannot serialize function %r: No module" % self.value) - - module_name = self.value.__module__ - - if "<" not in self.value.__qualname__: # Qualname can include - return "%s.%s" % (module_name, self.value.__qualname__), { - "import %s" % self.value.__module__ - } - - raise ValueError( - "Could not find function %s in %s.\n" % (self.value.__name__, module_name) - ) - - -class FunctoolsPartialSerializer(BaseSerializer): - def serialize(self): - # Serialize functools.partial() arguments - func_string, func_imports = serializer_factory(self.value.func).serialize() - args_string, args_imports = serializer_factory(self.value.args).serialize() - keywords_string, keywords_imports = serializer_factory( - self.value.keywords - ).serialize() - # Add any imports needed by arguments - imports = {"import functools", *func_imports, *args_imports, *keywords_imports} - return ( - "functools.%s(%s, *%s, **%s)" - % ( - self.value.__class__.__name__, - func_string, - args_string, - keywords_string, - ), - imports, - ) - - -class IterableSerializer(BaseSerializer): - def serialize(self): - imports = set() - strings = [] - for item in self.value: - item_string, item_imports = serializer_factory(item).serialize() - imports.update(item_imports) - strings.append(item_string) - # When len(strings)==0, the empty iterable should be serialized as - # "()", not "(,)" because (,) is invalid Python syntax. - value = "(%s)" if len(strings) != 1 else "(%s,)" - return value % (", ".join(strings)), imports - - -class ModelFieldSerializer(DeconstructableSerializer): - def serialize(self): - attr_name, path, args, kwargs = self.value.deconstruct() - return self.serialize_deconstructed(path, args, kwargs) - - -class ModelManagerSerializer(DeconstructableSerializer): - def serialize(self): - as_manager, manager_path, qs_path, args, kwargs = self.value.deconstruct() - if as_manager: - name, imports = self._serialize_path(qs_path) - return "%s.as_manager()" % name, imports - else: - return self.serialize_deconstructed(manager_path, args, kwargs) - - -class OperationSerializer(BaseSerializer): - def serialize(self): - from django.db.migrations.writer import OperationWriter - - string, imports = OperationWriter(self.value, indentation=0).serialize() - # Nested operation, trailing comma is handled in upper OperationWriter._write() - return string.rstrip(","), imports - - -class PathLikeSerializer(BaseSerializer): - def serialize(self): - return repr(os.fspath(self.value)), {} - - -class PathSerializer(BaseSerializer): - def serialize(self): - # Convert concrete paths to pure paths to avoid issues with migrations - # generated on one platform being used on a different platform. - prefix = "Pure" if isinstance(self.value, pathlib.Path) else "" - return "pathlib.%s%r" % (prefix, self.value), {"import pathlib"} - - -class RegexSerializer(BaseSerializer): - def serialize(self): - regex_pattern, pattern_imports = serializer_factory( - self.value.pattern - ).serialize() - # Turn off default implicit flags (e.g. re.U) because regexes with the - # same implicit and explicit flags aren't equal. - flags = self.value.flags ^ re.compile("").flags - regex_flags, flag_imports = serializer_factory(flags).serialize() - imports = {"import re", *pattern_imports, *flag_imports} - args = [regex_pattern] - if flags: - args.append(regex_flags) - return "re.compile(%s)" % ", ".join(args), imports - - -class SequenceSerializer(BaseSequenceSerializer): - def _format(self): - return "[%s]" - - -class SetSerializer(BaseUnorderedSequenceSerializer): - def _format(self): - # Serialize as a set literal except when value is empty because {} - # is an empty dict. - return "{%s}" if self.value else "set(%s)" - - -class SettingsReferenceSerializer(BaseSerializer): - def serialize(self): - return "settings.%s" % self.value.setting_name, { - "from django.conf import settings" - } - - -class TupleSerializer(BaseSequenceSerializer): - def _format(self): - # When len(value)==0, the empty tuple should be serialized as "()", - # not "(,)" because (,) is invalid Python syntax. - return "(%s)" if len(self.value) != 1 else "(%s,)" - - -class TypeSerializer(BaseSerializer): - def serialize(self): - special_cases = [ - (models.Model, "models.Model", ["from django.db import models"]), - (types.NoneType, "types.NoneType", ["import types"]), - ] - for case, string, imports in special_cases: - if case is self.value: - return string, set(imports) - if hasattr(self.value, "__module__"): - module = self.value.__module__ - if module == builtins.__name__: - return self.value.__name__, set() - else: - return "%s.%s" % (module, self.value.__qualname__), { - "import %s" % module - } - - -class UUIDSerializer(BaseSerializer): - def serialize(self): - return "uuid.%s" % repr(self.value), {"import uuid"} - - -class Serializer: - _registry = { - # Some of these are order-dependent. - frozenset: FrozensetSerializer, - list: SequenceSerializer, - set: SetSerializer, - tuple: TupleSerializer, - dict: DictionarySerializer, - models.Choices: ChoicesSerializer, - enum.Enum: EnumSerializer, - datetime.datetime: DatetimeDatetimeSerializer, - (datetime.date, datetime.timedelta, datetime.time): DateTimeSerializer, - SettingsReference: SettingsReferenceSerializer, - float: FloatSerializer, - (bool, int, types.NoneType, bytes, str, range): BaseSimpleSerializer, - decimal.Decimal: DecimalSerializer, - (functools.partial, functools.partialmethod): FunctoolsPartialSerializer, - FUNCTION_TYPES: FunctionTypeSerializer, - collections.abc.Iterable: IterableSerializer, - (COMPILED_REGEX_TYPE, RegexObject): RegexSerializer, - uuid.UUID: UUIDSerializer, - pathlib.PurePath: PathSerializer, - os.PathLike: PathLikeSerializer, - } - - @classmethod - def register(cls, type_, serializer): - if not issubclass(serializer, BaseSerializer): - raise ValueError( - "'%s' must inherit from 'BaseSerializer'." % serializer.__name__ - ) - cls._registry[type_] = serializer - - @classmethod - def unregister(cls, type_): - cls._registry.pop(type_) - - -def serializer_factory(value): - if isinstance(value, Promise): - value = str(value) - elif isinstance(value, LazyObject): - # The unwrapped value is returned as the first item of the arguments - # tuple. - value = value.__reduce__()[1][0] - - if isinstance(value, models.Field): - return ModelFieldSerializer(value) - if isinstance(value, models.manager.BaseManager): - return ModelManagerSerializer(value) - if isinstance(value, Operation): - return OperationSerializer(value) - if isinstance(value, type): - return TypeSerializer(value) - # Anything that knows how to deconstruct itself. - if hasattr(value, "deconstruct"): - return DeconstructableSerializer(value) - for type_, serializer_cls in Serializer._registry.items(): - if isinstance(value, type_): - return serializer_cls(value) - raise ValueError( - "Cannot serialize: %r\nThere are some values Django cannot serialize into " - "migration files.\nFor more, see https://docs.djangoproject.com/en/%s/" - "topics/migrations/#migration-serializing" % (value, get_docs_version()) - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/state.py b/.venv/lib/python3.10/site-packages/django/db/migrations/state.py deleted file mode 100644 index 92716aa..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/state.py +++ /dev/null @@ -1,1017 +0,0 @@ -import copy -from collections import defaultdict -from contextlib import contextmanager -from functools import partial - -from django.apps import AppConfig -from django.apps.registry import Apps -from django.apps.registry import apps as global_apps -from django.conf import settings -from django.core.exceptions import FieldDoesNotExist -from django.db import models -from django.db.migrations.utils import field_is_referenced, get_references -from django.db.models import NOT_PROVIDED -from django.db.models.fields.related import RECURSIVE_RELATIONSHIP_CONSTANT -from django.db.models.options import DEFAULT_NAMES, normalize_together -from django.db.models.utils import make_model_tuple -from django.utils.functional import cached_property -from django.utils.module_loading import import_string -from django.utils.version import get_docs_version - -from .exceptions import InvalidBasesError -from .utils import resolve_relation - - -def _get_app_label_and_model_name(model, app_label=""): - if isinstance(model, str): - split = model.split(".", 1) - return tuple(split) if len(split) == 2 else (app_label, split[0]) - else: - return model._meta.app_label, model._meta.model_name - - -def _get_related_models(m): - """Return all models that have a direct relationship to the given model.""" - related_models = [ - subclass - for subclass in m.__subclasses__() - if issubclass(subclass, models.Model) - ] - related_fields_models = set() - for f in m._meta.get_fields(include_parents=True, include_hidden=True): - if ( - f.is_relation - and f.related_model is not None - and not isinstance(f.related_model, str) - ): - related_fields_models.add(f.model) - related_models.append(f.related_model) - # Reverse accessors of foreign keys to proxy models are attached to their - # concrete proxied model. - opts = m._meta - if opts.proxy and m in related_fields_models: - related_models.append(opts.concrete_model) - return related_models - - -def get_related_models_tuples(model): - """ - Return a list of typical (app_label, model_name) tuples for all related - models for the given model. - """ - return { - (rel_mod._meta.app_label, rel_mod._meta.model_name) - for rel_mod in _get_related_models(model) - } - - -def get_related_models_recursive(model): - """ - Return all models that have a direct or indirect relationship - to the given model. - - Relationships are either defined by explicit relational fields, like - ForeignKey, ManyToManyField or OneToOneField, or by inheriting from another - model (a superclass is related to its subclasses, but not vice versa). Note, - however, that a model inheriting from a concrete model is also related to - its superclass through the implicit *_ptr OneToOneField on the subclass. - """ - seen = set() - queue = _get_related_models(model) - for rel_mod in queue: - rel_app_label, rel_model_name = ( - rel_mod._meta.app_label, - rel_mod._meta.model_name, - ) - if (rel_app_label, rel_model_name) in seen: - continue - seen.add((rel_app_label, rel_model_name)) - queue.extend(_get_related_models(rel_mod)) - return seen - {(model._meta.app_label, model._meta.model_name)} - - -class ProjectState: - """ - Represent the entire project's overall state. This is the item that is - passed around - do it here rather than at the app level so that cross-app - FKs/etc. resolve properly. - """ - - def __init__(self, models=None, real_apps=None): - self.models = models or {} - # Apps to include from main registry, usually unmigrated ones - if real_apps is None: - real_apps = set() - else: - assert isinstance(real_apps, set) - self.real_apps = real_apps - self.is_delayed = False - # {remote_model_key: {model_key: {field_name: field}}} - self._relations = None - - @property - def relations(self): - if self._relations is None: - self.resolve_fields_and_relations() - return self._relations - - def add_model(self, model_state): - model_key = model_state.app_label, model_state.name_lower - self.models[model_key] = model_state - if self._relations is not None: - self.resolve_model_relations(model_key) - if "apps" in self.__dict__: # hasattr would cache the property - self.reload_model(*model_key) - - def remove_model(self, app_label, model_name): - model_key = app_label, model_name - del self.models[model_key] - if self._relations is not None: - self._relations.pop(model_key, None) - # Call list() since _relations can change size during iteration. - for related_model_key, model_relations in list(self._relations.items()): - model_relations.pop(model_key, None) - if not model_relations: - del self._relations[related_model_key] - if "apps" in self.__dict__: # hasattr would cache the property - self.apps.unregister_model(*model_key) - # Need to do this explicitly since unregister_model() doesn't clear - # the cache automatically (#24513) - self.apps.clear_cache() - - def rename_model(self, app_label, old_name, new_name): - # Add a new model. - old_name_lower = old_name.lower() - new_name_lower = new_name.lower() - renamed_model = self.models[app_label, old_name_lower].clone() - renamed_model.name = new_name - self.models[app_label, new_name_lower] = renamed_model - # Repoint all fields pointing to the old model to the new one. - old_model_tuple = (app_label, old_name_lower) - new_remote_model = f"{app_label}.{new_name}" - to_reload = set() - for model_state, name, field, reference in get_references( - self, old_model_tuple - ): - changed_field = None - if reference.to: - changed_field = field.clone() - changed_field.remote_field.model = new_remote_model - if reference.through: - if changed_field is None: - changed_field = field.clone() - changed_field.remote_field.through = new_remote_model - if changed_field: - model_state.fields[name] = changed_field - to_reload.add((model_state.app_label, model_state.name_lower)) - if self._relations is not None: - old_name_key = app_label, old_name_lower - new_name_key = app_label, new_name_lower - if old_name_key in self._relations: - self._relations[new_name_key] = self._relations.pop(old_name_key) - for model_relations in self._relations.values(): - if old_name_key in model_relations: - model_relations[new_name_key] = model_relations.pop(old_name_key) - # Reload models related to old model before removing the old model. - self.reload_models(to_reload, delay=True) - # Remove the old model. - self.remove_model(app_label, old_name_lower) - self.reload_model(app_label, new_name_lower, delay=True) - - def alter_model_options(self, app_label, model_name, options, option_keys=None): - model_state = self.models[app_label, model_name] - model_state.options = {**model_state.options, **options} - if option_keys: - for key in option_keys: - if key not in options: - model_state.options.pop(key, False) - self.reload_model(app_label, model_name, delay=True) - - def remove_model_options(self, app_label, model_name, option_name, value_to_remove): - model_state = self.models[app_label, model_name] - if objs := model_state.options.get(option_name): - model_state.options[option_name] = [ - obj for obj in objs if tuple(obj) != tuple(value_to_remove) - ] - self.reload_model(app_label, model_name, delay=True) - - def alter_model_managers(self, app_label, model_name, managers): - model_state = self.models[app_label, model_name] - model_state.managers = list(managers) - self.reload_model(app_label, model_name, delay=True) - - def _append_option(self, app_label, model_name, option_name, obj): - model_state = self.models[app_label, model_name] - model_state.options[option_name] = [*model_state.options[option_name], obj] - self.reload_model(app_label, model_name, delay=True) - - def _remove_option(self, app_label, model_name, option_name, obj_name): - model_state = self.models[app_label, model_name] - objs = model_state.options[option_name] - model_state.options[option_name] = [obj for obj in objs if obj.name != obj_name] - self.reload_model(app_label, model_name, delay=True) - - def _alter_option(self, app_label, model_name, option_name, obj_name, alt_obj): - model_state = self.models[app_label, model_name] - objs = model_state.options[option_name] - model_state.options[option_name] = [ - obj if obj.name != obj_name else alt_obj for obj in objs - ] - self.reload_model(app_label, model_name, delay=True) - - def add_index(self, app_label, model_name, index): - self._append_option(app_label, model_name, "indexes", index) - - def remove_index(self, app_label, model_name, index_name): - self._remove_option(app_label, model_name, "indexes", index_name) - - def rename_index(self, app_label, model_name, old_index_name, new_index_name): - model_state = self.models[app_label, model_name] - objs = model_state.options["indexes"] - - new_indexes = [] - for obj in objs: - if obj.name == old_index_name: - obj = obj.clone() - obj.name = new_index_name - new_indexes.append(obj) - - model_state.options["indexes"] = new_indexes - self.reload_model(app_label, model_name, delay=True) - - def add_constraint(self, app_label, model_name, constraint): - self._append_option(app_label, model_name, "constraints", constraint) - - def remove_constraint(self, app_label, model_name, constraint_name): - self._remove_option(app_label, model_name, "constraints", constraint_name) - - def alter_constraint(self, app_label, model_name, constraint_name, constraint): - self._alter_option( - app_label, model_name, "constraints", constraint_name, constraint - ) - - def add_field(self, app_label, model_name, name, field, preserve_default): - # If preserve default is off, don't use the default for future state. - if not preserve_default: - field = field.clone() - field.default = NOT_PROVIDED - else: - field = field - model_key = app_label, model_name - self.models[model_key].fields[name] = field - if self._relations is not None: - self.resolve_model_field_relations(model_key, name, field) - # Delay rendering of relationships if it's not a relational field. - delay = not field.is_relation - self.reload_model(*model_key, delay=delay) - - def remove_field(self, app_label, model_name, name): - model_key = app_label, model_name - model_state = self.models[model_key] - old_field = model_state.fields.pop(name) - if self._relations is not None: - self.resolve_model_field_relations(model_key, name, old_field) - # Delay rendering of relationships if it's not a relational field. - delay = not old_field.is_relation - self.reload_model(*model_key, delay=delay) - - def alter_field(self, app_label, model_name, name, field, preserve_default): - if not preserve_default: - field = field.clone() - field.default = NOT_PROVIDED - else: - field = field - model_key = app_label, model_name - fields = self.models[model_key].fields - if self._relations is not None: - old_field = fields.pop(name) - if old_field.is_relation: - self.resolve_model_field_relations(model_key, name, old_field) - fields[name] = field - if field.is_relation: - self.resolve_model_field_relations(model_key, name, field) - else: - fields[name] = field - # TODO: investigate if old relational fields must be reloaded or if - # it's sufficient if the new field is (#27737). - # Delay rendering of relationships if it's not a relational field and - # not referenced by a foreign key. - delay = not field.is_relation and not field_is_referenced( - self, model_key, (name, field) - ) - self.reload_model(*model_key, delay=delay) - - def rename_field(self, app_label, model_name, old_name, new_name): - model_key = app_label, model_name - model_state = self.models[model_key] - # Rename the field. - fields = model_state.fields - try: - found = fields.pop(old_name) - except KeyError: - raise FieldDoesNotExist( - f"{app_label}.{model_name} has no field named '{old_name}'" - ) - fields[new_name] = found - for field in fields.values(): - # Fix from_fields to refer to the new field. - from_fields = getattr(field, "from_fields", None) - if from_fields: - field.from_fields = tuple( - [ - new_name if from_field_name == old_name else from_field_name - for from_field_name in from_fields - ] - ) - # Fix field names (e.g. for CompositePrimaryKey) to refer to the - # new field. - if field_names := getattr(field, "field_names", None): - if old_name in field_names: - field.field_names = tuple( - [ - new_name if field_name == old_name else field_name - for field_name in field.field_names - ] - ) - # Fix index/unique_together to refer to the new field. - options = model_state.options - for option in ("index_together", "unique_together"): - if option in options: - options[option] = [ - [new_name if n == old_name else n for n in together] - for together in options[option] - ] - # Fix to_fields to refer to the new field. - delay = True - references = get_references(self, model_key, (old_name, found)) - for *_, field, reference in references: - delay = False - if reference.to: - remote_field, to_fields = reference.to - if getattr(remote_field, "field_name", None) == old_name: - remote_field.field_name = new_name - if to_fields: - field.to_fields = tuple( - [ - new_name if to_field_name == old_name else to_field_name - for to_field_name in to_fields - ] - ) - if self._relations is not None: - old_name_lower = old_name.lower() - new_name_lower = new_name.lower() - for to_model in self._relations.values(): - if old_name_lower in to_model[model_key]: - field = to_model[model_key].pop(old_name_lower) - field.name = new_name_lower - to_model[model_key][new_name_lower] = field - self.reload_model(*model_key, delay=delay) - - def _find_reload_model(self, app_label, model_name, delay=False): - if delay: - self.is_delayed = True - - related_models = set() - - try: - old_model = self.apps.get_model(app_label, model_name) - except LookupError: - pass - else: - # Get all relations to and from the old model before reloading, - # as _meta.apps may change - if delay: - related_models = get_related_models_tuples(old_model) - else: - related_models = get_related_models_recursive(old_model) - - # Get all outgoing references from the model to be rendered - model_state = self.models[(app_label, model_name)] - # Directly related models are the models pointed to by ForeignKeys, - # OneToOneFields, and ManyToManyFields. - direct_related_models = set() - for field in model_state.fields.values(): - if field.is_relation: - if field.remote_field.model == RECURSIVE_RELATIONSHIP_CONSTANT: - continue - rel_app_label, rel_model_name = _get_app_label_and_model_name( - field.related_model, app_label - ) - direct_related_models.add((rel_app_label, rel_model_name.lower())) - - # For all direct related models recursively get all related models. - related_models.update(direct_related_models) - for rel_app_label, rel_model_name in direct_related_models: - try: - rel_model = self.apps.get_model(rel_app_label, rel_model_name) - except LookupError: - pass - else: - if delay: - related_models.update(get_related_models_tuples(rel_model)) - else: - related_models.update(get_related_models_recursive(rel_model)) - - # Include the model itself - related_models.add((app_label, model_name)) - - return related_models - - def reload_model(self, app_label, model_name, delay=False): - if "apps" in self.__dict__: # hasattr would cache the property - related_models = self._find_reload_model(app_label, model_name, delay) - self._reload(related_models) - - def reload_models(self, models, delay=True): - if "apps" in self.__dict__: # hasattr would cache the property - related_models = set() - for app_label, model_name in models: - related_models.update( - self._find_reload_model(app_label, model_name, delay) - ) - self._reload(related_models) - - def _reload(self, related_models): - # Unregister all related models - with self.apps.bulk_update(): - for rel_app_label, rel_model_name in related_models: - self.apps.unregister_model(rel_app_label, rel_model_name) - - states_to_be_rendered = [] - # Gather all models states of those models that will be rerendered. - # This includes: - # 1. All related models of unmigrated apps - for model_state in self.apps.real_models: - if (model_state.app_label, model_state.name_lower) in related_models: - states_to_be_rendered.append(model_state) - - # 2. All related models of migrated apps - for rel_app_label, rel_model_name in related_models: - try: - model_state = self.models[rel_app_label, rel_model_name] - except KeyError: - pass - else: - states_to_be_rendered.append(model_state) - - # Render all models - self.apps.render_multiple(states_to_be_rendered) - - def update_model_field_relation( - self, - model, - model_key, - field_name, - field, - concretes, - ): - remote_model_key = resolve_relation(model, *model_key) - if remote_model_key[0] not in self.real_apps and remote_model_key in concretes: - remote_model_key = concretes[remote_model_key] - relations_to_remote_model = self._relations[remote_model_key] - if field_name in self.models[model_key].fields: - # The assert holds because it's a new relation, or an altered - # relation, in which case references have been removed by - # alter_field(). - assert field_name not in relations_to_remote_model[model_key] - relations_to_remote_model[model_key][field_name] = field - else: - del relations_to_remote_model[model_key][field_name] - if not relations_to_remote_model[model_key]: - del relations_to_remote_model[model_key] - - def resolve_model_field_relations( - self, - model_key, - field_name, - field, - concretes=None, - ): - remote_field = field.remote_field - if not remote_field: - return - if concretes is None: - concretes, _ = self._get_concrete_models_mapping_and_proxy_models() - - self.update_model_field_relation( - remote_field.model, - model_key, - field_name, - field, - concretes, - ) - - through = getattr(remote_field, "through", None) - if not through: - return - self.update_model_field_relation( - through, model_key, field_name, field, concretes - ) - - def resolve_model_relations(self, model_key, concretes=None): - if concretes is None: - concretes, _ = self._get_concrete_models_mapping_and_proxy_models() - - model_state = self.models[model_key] - for field_name, field in model_state.fields.items(): - self.resolve_model_field_relations(model_key, field_name, field, concretes) - - def resolve_fields_and_relations(self): - # Resolve fields. - for model_state in self.models.values(): - for field_name, field in model_state.fields.items(): - field.name = field_name - # Resolve relations. - # {remote_model_key: {model_key: {field_name: field}}} - self._relations = defaultdict(partial(defaultdict, dict)) - concretes, proxies = self._get_concrete_models_mapping_and_proxy_models() - - for model_key in concretes: - self.resolve_model_relations(model_key, concretes) - - for model_key in proxies: - self._relations[model_key] = self._relations[concretes[model_key]] - - def get_concrete_model_key(self, model): - ( - concrete_models_mapping, - _, - ) = self._get_concrete_models_mapping_and_proxy_models() - model_key = make_model_tuple(model) - return concrete_models_mapping[model_key] - - def _get_concrete_models_mapping_and_proxy_models(self): - concrete_models_mapping = {} - proxy_models = {} - # Split models to proxy and concrete models. - for model_key, model_state in self.models.items(): - if model_state.options.get("proxy"): - proxy_models[model_key] = model_state - # Find a concrete model for the proxy. - concrete_models_mapping[model_key] = ( - self._find_concrete_model_from_proxy( - proxy_models, - model_state, - ) - ) - else: - concrete_models_mapping[model_key] = model_key - return concrete_models_mapping, proxy_models - - def _find_concrete_model_from_proxy(self, proxy_models, model_state): - for base in model_state.bases: - if not (isinstance(base, str) or issubclass(base, models.Model)): - continue - base_key = make_model_tuple(base) - base_state = proxy_models.get(base_key) - if not base_state: - # Concrete model found, stop looking at bases. - return base_key - return self._find_concrete_model_from_proxy(proxy_models, base_state) - - def clone(self): - """Return an exact copy of this ProjectState.""" - new_state = ProjectState( - models={k: v.clone() for k, v in self.models.items()}, - real_apps=self.real_apps, - ) - if "apps" in self.__dict__: - new_state.apps = self.apps.clone() - new_state.is_delayed = self.is_delayed - return new_state - - def clear_delayed_apps_cache(self): - if self.is_delayed and "apps" in self.__dict__: - del self.__dict__["apps"] - - @cached_property - def apps(self): - return StateApps(self.real_apps, self.models) - - @classmethod - def from_apps(cls, apps): - """Take an Apps and return a ProjectState matching it.""" - app_models = {} - for model in apps.get_models(include_swapped=True): - model_state = ModelState.from_model(model) - app_models[(model_state.app_label, model_state.name_lower)] = model_state - return cls(app_models) - - def __eq__(self, other): - return self.models == other.models and self.real_apps == other.real_apps - - -class AppConfigStub(AppConfig): - """Stub of an AppConfig. Only provides a label and a dict of models.""" - - def __init__(self, label): - self.apps = None - self.models = {} - # App-label and app-name are not the same thing, so technically passing - # in the label here is wrong. In practice, migrations don't care about - # the app name, but we need something unique, and the label works fine. - self.label = label - self.name = label - - def import_models(self): - self.models = self.apps.all_models[self.label] - - -class StateApps(Apps): - """ - Subclass of the global Apps registry class to better handle dynamic model - additions and removals. - """ - - def __init__(self, real_apps, models, ignore_swappable=False): - # Any apps in self.real_apps should have all their models included - # in the render. We don't use the original model instances as there - # are some variables that refer to the Apps object. - # FKs/M2Ms from real apps are also not included as they just - # mess things up with partial states (due to lack of dependencies) - self.real_models = [] - for app_label in real_apps: - app = global_apps.get_app_config(app_label) - for model in app.get_models(): - self.real_models.append(ModelState.from_model(model, exclude_rels=True)) - # Populate the app registry with a stub for each application. - app_labels = {model_state.app_label for model_state in models.values()} - app_configs = [ - AppConfigStub(label) for label in sorted([*real_apps, *app_labels]) - ] - super().__init__(app_configs) - - # These locks get in the way of copying as implemented in clone(), - # which is called whenever Django duplicates a StateApps before - # updating it. - self._lock = None - self.ready_event = None - - self.render_multiple([*models.values(), *self.real_models]) - - # There shouldn't be any operations pending at this point. - from django.core.checks.model_checks import _check_lazy_references - - ignore = ( - {make_model_tuple(settings.AUTH_USER_MODEL)} if ignore_swappable else set() - ) - errors = _check_lazy_references(self, ignore=ignore) - if errors: - raise ValueError("\n".join(error.msg for error in errors)) - - @contextmanager - def bulk_update(self): - # Avoid clearing each model's cache for each change. Instead, clear - # all caches when we're finished updating the model instances. - ready = self.ready - self.ready = False - try: - yield - finally: - self.ready = ready - self.clear_cache() - - def render_multiple(self, model_states): - # We keep trying to render the models in a loop, ignoring invalid - # base errors, until the size of the unrendered models doesn't - # decrease by at least one, meaning there's a base dependency loop/ - # missing base. - if not model_states: - return - # Prevent that all model caches are expired for each render. - with self.bulk_update(): - unrendered_models = model_states - while unrendered_models: - new_unrendered_models = [] - for model in unrendered_models: - try: - model.render(self) - except InvalidBasesError: - new_unrendered_models.append(model) - if len(new_unrendered_models) == len(unrendered_models): - raise InvalidBasesError( - "Cannot resolve bases for %r\nThis can happen if you are " - "inheriting models from an app with migrations (e.g. " - "contrib.auth)\n in an app with no migrations; see " - "https://docs.djangoproject.com/en/%s/topics/migrations/" - "#dependencies for more" - % (new_unrendered_models, get_docs_version()) - ) - unrendered_models = new_unrendered_models - - def clone(self): - """Return a clone of this registry.""" - clone = StateApps([], {}) - clone.all_models = copy.deepcopy(self.all_models) - - for app_label in self.app_configs: - app_config = AppConfigStub(app_label) - app_config.apps = clone - app_config.import_models() - clone.app_configs[app_label] = app_config - - # No need to actually clone them, they'll never change - clone.real_models = self.real_models - return clone - - def register_model(self, app_label, model): - self.all_models[app_label][model._meta.model_name] = model - if app_label not in self.app_configs: - self.app_configs[app_label] = AppConfigStub(app_label) - self.app_configs[app_label].apps = self - self.app_configs[app_label].models[model._meta.model_name] = model - self.do_pending_operations(model) - self.clear_cache() - - def unregister_model(self, app_label, model_name): - try: - del self.all_models[app_label][model_name] - del self.app_configs[app_label].models[model_name] - except KeyError: - pass - - -class ModelState: - """ - Represent a Django Model. Don't use the actual Model class as it's not - designed to have its options changed - instead, mutate this one and then - render it into a Model as required. - - Note that while you are allowed to mutate .fields, you are not allowed - to mutate the Field instances inside there themselves - you must instead - assign new ones, as these are not detached during a clone. - """ - - def __init__( - self, app_label, name, fields, options=None, bases=None, managers=None - ): - self.app_label = app_label - self.name = name - self.fields = dict(fields) - self.options = options or {} - self.options.setdefault("indexes", []) - self.options.setdefault("constraints", []) - self.bases = bases or (models.Model,) - self.managers = managers or [] - for name, field in self.fields.items(): - # Sanity-check that fields are NOT already bound to a model. - if hasattr(field, "model"): - raise ValueError( - 'ModelState.fields cannot be bound to a model - "%s" is.' % name - ) - # Sanity-check that relation fields are NOT referring to a model class. - if field.is_relation and hasattr(field.related_model, "_meta"): - raise ValueError( - 'Model fields in "ModelState.fields" cannot refer to a model class ' - f'- "{self.app_label}.{self.name}.{name}.to" does. Use a string ' - "reference instead." - ) - if field.many_to_many and hasattr(field.remote_field.through, "_meta"): - raise ValueError( - 'Model fields in "ModelState.fields" cannot refer to a model class ' - f'- "{self.app_label}.{self.name}.{name}.through" does. Use a ' - "string reference instead." - ) - # Sanity-check that indexes have their name set. - for index in self.options["indexes"]: - if not index.name: - raise ValueError( - "Indexes passed to ModelState require a name attribute. " - "%r doesn't have one." % index - ) - - @cached_property - def name_lower(self): - return self.name.lower() - - def get_field(self, field_name): - if ( - field_name == "_order" - and self.options.get("order_with_respect_to") is not None - ): - field_name = self.options["order_with_respect_to"] - return self.fields[field_name] - - @classmethod - def from_model(cls, model, exclude_rels=False): - """Given a model, return a ModelState representing it.""" - # Deconstruct the fields - fields = [] - for field in model._meta.local_fields: - if getattr(field, "remote_field", None) and exclude_rels: - continue - if isinstance(field, models.OrderWrt): - continue - name = field.name - try: - fields.append((name, field.clone())) - except TypeError as e: - raise TypeError( - "Couldn't reconstruct field %s on %s: %s" - % ( - name, - model._meta.label, - e, - ) - ) - if not exclude_rels: - for field in model._meta.local_many_to_many: - name = field.name - try: - fields.append((name, field.clone())) - except TypeError as e: - raise TypeError( - "Couldn't reconstruct m2m field %s on %s: %s" - % ( - name, - model._meta.object_name, - e, - ) - ) - # Extract the options - options = {} - for name in DEFAULT_NAMES: - # Ignore some special options - if name in ["apps", "app_label"]: - continue - elif name in model._meta.original_attrs: - if name == "unique_together": - ut = model._meta.original_attrs["unique_together"] - options[name] = set(normalize_together(ut)) - elif name == "indexes": - indexes = [idx.clone() for idx in model._meta.indexes] - for index in indexes: - if not index.name: - index.set_name_with_model(model) - options["indexes"] = indexes - elif name == "constraints": - options["constraints"] = [ - con.clone() for con in model._meta.constraints - ] - else: - options[name] = model._meta.original_attrs[name] - # If we're ignoring relationships, remove all field-listing model - # options (that option basically just means "make a stub model") - if exclude_rels: - for key in ["unique_together", "order_with_respect_to"]: - if key in options: - del options[key] - # Private fields are ignored, so remove options that refer to them. - elif options.get("order_with_respect_to") in { - field.name for field in model._meta.private_fields - }: - del options["order_with_respect_to"] - - def flatten_bases(model): - bases = [] - for base in model.__bases__: - if hasattr(base, "_meta") and base._meta.abstract: - bases.extend(flatten_bases(base)) - else: - bases.append(base) - return bases - - # We can't rely on __mro__ directly because we only want to flatten - # abstract models and not the whole tree. However by recursing on - # __bases__ we may end up with duplicates and ordering issues, we - # therefore discard any duplicates and reorder the bases according - # to their index in the MRO. - flattened_bases = sorted( - set(flatten_bases(model)), key=lambda x: model.__mro__.index(x) - ) - - # Make our record - bases = tuple( - (base._meta.label_lower if hasattr(base, "_meta") else base) - for base in flattened_bases - ) - # Ensure at least one base inherits from models.Model - if not any( - (isinstance(base, str) or issubclass(base, models.Model)) for base in bases - ): - bases = (models.Model,) - - managers = [] - manager_names = set() - default_manager_shim = None - for manager in model._meta.managers: - if manager.name in manager_names: - # Skip overridden managers. - continue - elif manager.use_in_migrations: - # Copy managers usable in migrations. - new_manager = copy.copy(manager) - new_manager._set_creation_counter() - elif manager is model._base_manager or manager is model._default_manager: - # Shim custom managers used as default and base managers. - new_manager = models.Manager() - new_manager.model = manager.model - new_manager.name = manager.name - if manager is model._default_manager: - default_manager_shim = new_manager - else: - continue - manager_names.add(manager.name) - managers.append((manager.name, new_manager)) - - # Ignore a shimmed default manager called objects if it's the only one. - if managers == [("objects", default_manager_shim)]: - managers = [] - - # Construct the new ModelState - return cls( - model._meta.app_label, - model._meta.object_name, - fields, - options, - bases, - managers, - ) - - def construct_managers(self): - """Deep-clone the managers using deconstruction.""" - # Sort all managers by their creation counter - sorted_managers = sorted(self.managers, key=lambda v: v[1].creation_counter) - for mgr_name, manager in sorted_managers: - as_manager, manager_path, qs_path, args, kwargs = manager.deconstruct() - if as_manager: - qs_class = import_string(qs_path) - yield mgr_name, qs_class.as_manager() - else: - manager_class = import_string(manager_path) - yield mgr_name, manager_class(*args, **kwargs) - - def clone(self): - """Return an exact copy of this ModelState.""" - return self.__class__( - app_label=self.app_label, - name=self.name, - fields=dict(self.fields), - # Since options are shallow-copied here, operations such as - # AddIndex must replace their option (e.g 'indexes') rather - # than mutating it. - options=dict(self.options), - bases=self.bases, - managers=list(self.managers), - ) - - def render(self, apps): - """Create a Model object from our current state into the given apps.""" - # First, make a Meta object - meta_options = {**self.options} - # Prune index_together from options as it's no longer an allowed meta - # attribute. - meta_options.pop("index_together", None) - meta_contents = {"app_label": self.app_label, "apps": apps, **meta_options} - meta = type("Meta", (), meta_contents) - # Then, work out our bases - try: - bases = tuple( - (apps.get_model(base) if isinstance(base, str) else base) - for base in self.bases - ) - except LookupError: - raise InvalidBasesError( - "Cannot resolve one or more bases from %r" % (self.bases,) - ) - # Clone fields for the body, add other bits. - body = {name: field.clone() for name, field in self.fields.items()} - body["Meta"] = meta - body["__module__"] = "__fake__" - - # Restore managers - body.update(self.construct_managers()) - # Then, make a Model object (apps.register_model is called in __new__) - return type(self.name, bases, body) - - def get_index_by_name(self, name): - for index in self.options["indexes"]: - if index.name == name: - return index - raise ValueError("No index named %s on model %s" % (name, self.name)) - - def get_constraint_by_name(self, name): - for constraint in self.options["constraints"]: - if constraint.name == name: - return constraint - raise ValueError("No constraint named %s on model %s" % (name, self.name)) - - def __repr__(self): - return "<%s: '%s.%s'>" % (self.__class__.__name__, self.app_label, self.name) - - def __eq__(self, other): - return ( - (self.app_label == other.app_label) - and (self.name == other.name) - and (len(self.fields) == len(other.fields)) - and all( - k1 == k2 and f1.deconstruct()[1:] == f2.deconstruct()[1:] - for (k1, f1), (k2, f2) in zip( - sorted(self.fields.items()), - sorted(other.fields.items()), - ) - ) - and (self.options == other.options) - and (self.bases == other.bases) - and (self.managers == other.managers) - ) diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/utils.py b/.venv/lib/python3.10/site-packages/django/db/migrations/utils.py deleted file mode 100644 index 6eb5a4c..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/utils.py +++ /dev/null @@ -1,129 +0,0 @@ -import datetime -import re -from collections import namedtuple - -from django.db.models.fields.related import RECURSIVE_RELATIONSHIP_CONSTANT - -FieldReference = namedtuple("FieldReference", "to through") - -COMPILED_REGEX_TYPE = type(re.compile("")) - - -class RegexObject: - def __init__(self, obj): - self.pattern = obj.pattern - self.flags = obj.flags - - def __eq__(self, other): - if not isinstance(other, RegexObject): - return NotImplemented - return self.pattern == other.pattern and self.flags == other.flags - - -def get_migration_name_timestamp(): - return datetime.datetime.now().strftime("%Y%m%d_%H%M") - - -def resolve_relation(model, app_label=None, model_name=None): - """ - Turn a model class or model reference string and return a model tuple. - - app_label and model_name are used to resolve the scope of recursive and - unscoped model relationship. - """ - if isinstance(model, str): - if model == RECURSIVE_RELATIONSHIP_CONSTANT: - if app_label is None or model_name is None: - raise TypeError( - "app_label and model_name must be provided to resolve " - "recursive relationships." - ) - return app_label, model_name - if "." in model: - app_label, model_name = model.split(".", 1) - return app_label, model_name.lower() - if app_label is None: - raise TypeError( - "app_label must be provided to resolve unscoped model relationships." - ) - return app_label, model.lower() - return model._meta.app_label, model._meta.model_name - - -def field_references( - model_tuple, - field, - reference_model_tuple, - reference_field_name=None, - reference_field=None, -): - """ - Return either False or a FieldReference if `field` references provided - context. - - False positives can be returned if `reference_field_name` is provided - without `reference_field` because of the introspection limitation it - incurs. This should not be an issue when this function is used to determine - whether or not an optimization can take place. - """ - remote_field = field.remote_field - if not remote_field: - return False - references_to = None - references_through = None - if resolve_relation(remote_field.model, *model_tuple) == reference_model_tuple: - to_fields = getattr(field, "to_fields", None) - if ( - reference_field_name is None - or - # Unspecified to_field(s). - to_fields is None - or - # Reference to primary key. - ( - None in to_fields - and (reference_field is None or reference_field.primary_key) - ) - or - # Reference to field. - reference_field_name in to_fields - ): - references_to = (remote_field, to_fields) - through = getattr(remote_field, "through", None) - if through and resolve_relation(through, *model_tuple) == reference_model_tuple: - through_fields = remote_field.through_fields - if ( - reference_field_name is None - or - # Unspecified through_fields. - through_fields is None - or - # Reference to field. - reference_field_name in through_fields - ): - references_through = (remote_field, through_fields) - if not (references_to or references_through): - return False - return FieldReference(references_to, references_through) - - -def get_references(state, model_tuple, field_tuple=()): - """ - Generator of (model_state, name, field, reference) referencing - provided context. - - If field_tuple is provided only references to this particular field of - model_tuple will be generated. - """ - for state_model_tuple, model_state in state.models.items(): - for name, field in model_state.fields.items(): - reference = field_references( - state_model_tuple, field, model_tuple, *field_tuple - ) - if reference: - yield model_state, name, field, reference - - -def field_is_referenced(state, model_tuple, field_tuple): - """Return whether `field_tuple` is referenced by any state models.""" - return next(get_references(state, model_tuple, field_tuple), None) is not None diff --git a/.venv/lib/python3.10/site-packages/django/db/migrations/writer.py b/.venv/lib/python3.10/site-packages/django/db/migrations/writer.py deleted file mode 100644 index 3dd3014..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/migrations/writer.py +++ /dev/null @@ -1,316 +0,0 @@ -import os -import re -from importlib import import_module - -from django import get_version -from django.apps import apps - -# SettingsReference imported for backwards compatibility in Django 2.2. -from django.conf import SettingsReference # NOQA -from django.db import migrations -from django.db.migrations.loader import MigrationLoader -from django.db.migrations.serializer import Serializer, serializer_factory -from django.utils.inspect import get_func_args -from django.utils.module_loading import module_dir -from django.utils.timezone import now - - -class OperationWriter: - def __init__(self, operation, indentation=2): - self.operation = operation - self.buff = [] - self.indentation = indentation - - def serialize(self): - def _write(_arg_name, _arg_value): - if _arg_name in self.operation.serialization_expand_args and isinstance( - _arg_value, (list, tuple, dict) - ): - if isinstance(_arg_value, dict): - self.feed("%s={" % _arg_name) - self.indent() - for key, value in _arg_value.items(): - key_string, key_imports = MigrationWriter.serialize(key) - arg_string, arg_imports = MigrationWriter.serialize(value) - args = arg_string.splitlines() - if len(args) > 1: - self.feed("%s: %s" % (key_string, args[0])) - for arg in args[1:-1]: - self.feed(arg) - self.feed("%s," % args[-1]) - else: - self.feed("%s: %s," % (key_string, arg_string)) - imports.update(key_imports) - imports.update(arg_imports) - self.unindent() - self.feed("},") - else: - self.feed("%s=[" % _arg_name) - self.indent() - for item in _arg_value: - arg_string, arg_imports = MigrationWriter.serialize(item) - args = arg_string.splitlines() - if len(args) > 1: - for arg in args[:-1]: - self.feed(arg) - self.feed("%s," % args[-1]) - else: - self.feed("%s," % arg_string) - imports.update(arg_imports) - self.unindent() - self.feed("],") - else: - arg_string, arg_imports = MigrationWriter.serialize(_arg_value) - args = arg_string.splitlines() - if len(args) > 1: - self.feed("%s=%s" % (_arg_name, args[0])) - for arg in args[1:-1]: - self.feed(arg) - self.feed("%s," % args[-1]) - else: - self.feed("%s=%s," % (_arg_name, arg_string)) - imports.update(arg_imports) - - imports = set() - name, args, kwargs = self.operation.deconstruct() - operation_args = get_func_args(self.operation.__init__) - - # See if this operation is in django.db.migrations. If it is, - # We can just use the fact we already have that imported, - # otherwise, we need to add an import for the operation class. - if getattr(migrations, name, None) == self.operation.__class__: - self.feed("migrations.%s(" % name) - else: - imports.add("import %s" % (self.operation.__class__.__module__)) - self.feed("%s.%s(" % (self.operation.__class__.__module__, name)) - - self.indent() - - for i, arg in enumerate(args): - arg_value = arg - arg_name = operation_args[i] - _write(arg_name, arg_value) - - i = len(args) - # Only iterate over remaining arguments - for arg_name in operation_args[i:]: - if arg_name in kwargs: # Don't sort to maintain signature order - arg_value = kwargs[arg_name] - _write(arg_name, arg_value) - - self.unindent() - self.feed("),") - return self.render(), imports - - def indent(self): - self.indentation += 1 - - def unindent(self): - self.indentation -= 1 - - def feed(self, line): - self.buff.append(" " * (self.indentation * 4) + line) - - def render(self): - return "\n".join(self.buff) - - -class MigrationWriter: - """ - Take a Migration instance and is able to produce the contents - of the migration file from it. - """ - - def __init__(self, migration, include_header=True): - self.migration = migration - self.include_header = include_header - self.needs_manual_porting = False - - def as_string(self): - """Return a string of the file contents.""" - items = { - "replaces_str": "", - "initial_str": "", - } - - imports = set() - - # Deconstruct operations - operations = [] - for operation in self.migration.operations: - operation_string, operation_imports = OperationWriter(operation).serialize() - imports.update(operation_imports) - operations.append(operation_string) - items["operations"] = "\n".join(operations) + "\n" if operations else "" - - # Format dependencies and write out swappable dependencies right - dependencies = [] - for dependency in self.migration.dependencies: - if dependency[0] == "__setting__": - dependencies.append( - " migrations.swappable_dependency(settings.%s)," - % dependency[1] - ) - imports.add("from django.conf import settings") - else: - dependencies.append(" %s," % self.serialize(dependency)[0]) - items["dependencies"] = ( - "\n".join(sorted(dependencies)) + "\n" if dependencies else "" - ) - - # Format imports nicely, swapping imports of functions from migration files - # for comments - migration_imports = set() - for line in list(imports): - if re.match(r"^import (.*)\.\d+[^\s]*$", line): - migration_imports.add(line.split("import")[1].strip()) - imports.remove(line) - self.needs_manual_porting = True - - # django.db.migrations is always used, but models import may not be. - # If models import exists, merge it with migrations import. - if "from django.db import models" in imports: - imports.discard("from django.db import models") - imports.add("from django.db import migrations, models") - else: - imports.add("from django.db import migrations") - - # Sort imports by the package / module to be imported (the part after - # "from" in "from ... import ..." or after "import" in "import ..."). - # First group the "import" statements, then "from ... import ...". - sorted_imports = sorted( - imports, key=lambda i: (i.split()[0] == "from", i.split()[1]) - ) - items["imports"] = "\n".join(sorted_imports) + "\n" if imports else "" - if migration_imports: - items["imports"] += ( - "\n\n# Functions from the following migrations need manual " - "copying.\n# Move them and any dependencies into this file, " - "then update the\n# RunPython operations to refer to the local " - "versions:\n# %s" - ) % "\n# ".join(sorted(migration_imports)) - # If there's a replaces, make a string for it - if self.migration.replaces: - items["replaces_str"] = ( - "\n replaces = %s\n" % self.serialize(self.migration.replaces)[0] - ) - # Hinting that goes into comment - if self.include_header: - items["migration_header"] = MIGRATION_HEADER_TEMPLATE % { - "version": get_version(), - "timestamp": now().strftime("%Y-%m-%d %H:%M"), - } - else: - items["migration_header"] = "" - - if self.migration.initial: - items["initial_str"] = "\n initial = True\n" - - return MIGRATION_TEMPLATE % items - - @property - def basedir(self): - migrations_package_name, _ = MigrationLoader.migrations_module( - self.migration.app_label - ) - - if migrations_package_name is None: - raise ValueError( - "Django can't create migrations for app '%s' because " - "migrations have been disabled via the MIGRATION_MODULES " - "setting." % self.migration.app_label - ) - - # See if we can import the migrations module directly - try: - migrations_module = import_module(migrations_package_name) - except ImportError: - pass - else: - try: - return module_dir(migrations_module) - except ValueError: - pass - - # Alright, see if it's a direct submodule of the app - app_config = apps.get_app_config(self.migration.app_label) - ( - maybe_app_name, - _, - migrations_package_basename, - ) = migrations_package_name.rpartition(".") - if app_config.name == maybe_app_name: - return os.path.join(app_config.path, migrations_package_basename) - - # In case of using MIGRATION_MODULES setting and the custom package - # doesn't exist, create one, starting from an existing package - existing_dirs, missing_dirs = migrations_package_name.split("."), [] - while existing_dirs: - missing_dirs.insert(0, existing_dirs.pop(-1)) - try: - base_module = import_module(".".join(existing_dirs)) - except (ImportError, ValueError): - continue - else: - try: - base_dir = module_dir(base_module) - except ValueError: - continue - else: - break - else: - raise ValueError( - "Could not locate an appropriate location to create " - "migrations package %s. Make sure the toplevel " - "package exists and can be imported." % migrations_package_name - ) - - final_dir = os.path.join(base_dir, *missing_dirs) - os.makedirs(final_dir, exist_ok=True) - for missing_dir in missing_dirs: - base_dir = os.path.join(base_dir, missing_dir) - with open(os.path.join(base_dir, "__init__.py"), "w"): - pass - - return final_dir - - @property - def filename(self): - return "%s.py" % self.migration.name - - @property - def path(self): - return os.path.join(self.basedir, self.filename) - - @classmethod - def serialize(cls, value): - return serializer_factory(value).serialize() - - @classmethod - def register_serializer(cls, type_, serializer): - Serializer.register(type_, serializer) - - @classmethod - def unregister_serializer(cls, type_): - Serializer.unregister(type_) - - -MIGRATION_HEADER_TEMPLATE = """\ -# Generated by Django %(version)s on %(timestamp)s - -""" - - -MIGRATION_TEMPLATE = """\ -%(migration_header)s%(imports)s - -class Migration(migrations.Migration): -%(replaces_str)s%(initial_str)s - dependencies = [ -%(dependencies)s\ - ] - - operations = [ -%(operations)s\ - ] -""" diff --git a/.venv/lib/python3.10/site-packages/django/db/models/__init__.py b/.venv/lib/python3.10/site-packages/django/db/models/__init__.py deleted file mode 100644 index ec54b65..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/__init__.py +++ /dev/null @@ -1,127 +0,0 @@ -from django.core.exceptions import ObjectDoesNotExist -from django.db.models import signals -from django.db.models.aggregates import * # NOQA -from django.db.models.aggregates import __all__ as aggregates_all -from django.db.models.constraints import * # NOQA -from django.db.models.constraints import __all__ as constraints_all -from django.db.models.deletion import ( - CASCADE, - DO_NOTHING, - PROTECT, - RESTRICT, - SET, - SET_DEFAULT, - SET_NULL, - ProtectedError, - RestrictedError, -) -from django.db.models.enums import * # NOQA -from django.db.models.enums import __all__ as enums_all -from django.db.models.expressions import ( - Case, - Exists, - Expression, - ExpressionList, - ExpressionWrapper, - F, - Func, - OrderBy, - OuterRef, - RowRange, - Subquery, - Value, - ValueRange, - When, - Window, - WindowFrame, - WindowFrameExclusion, -) -from django.db.models.fields import * # NOQA -from django.db.models.fields import __all__ as fields_all -from django.db.models.fields.composite import CompositePrimaryKey -from django.db.models.fields.files import FileField, ImageField -from django.db.models.fields.generated import GeneratedField -from django.db.models.fields.json import JSONField -from django.db.models.fields.proxy import OrderWrt -from django.db.models.indexes import * # NOQA -from django.db.models.indexes import __all__ as indexes_all -from django.db.models.lookups import Lookup, Transform -from django.db.models.manager import Manager -from django.db.models.query import ( - Prefetch, - QuerySet, - aprefetch_related_objects, - prefetch_related_objects, -) -from django.db.models.query_utils import FilteredRelation, Q - -# Imports that would create circular imports if sorted -from django.db.models.base import DEFERRED, Model # isort:skip -from django.db.models.fields.related import ( # isort:skip - ForeignKey, - ForeignObject, - OneToOneField, - ManyToManyField, - ForeignObjectRel, - ManyToOneRel, - ManyToManyRel, - OneToOneRel, -) - - -__all__ = aggregates_all + constraints_all + enums_all + fields_all + indexes_all -__all__ += [ - "ObjectDoesNotExist", - "signals", - "CASCADE", - "DO_NOTHING", - "PROTECT", - "RESTRICT", - "SET", - "SET_DEFAULT", - "SET_NULL", - "ProtectedError", - "RestrictedError", - "Case", - "CompositePrimaryKey", - "Exists", - "Expression", - "ExpressionList", - "ExpressionWrapper", - "F", - "Func", - "OrderBy", - "OuterRef", - "RowRange", - "Subquery", - "Value", - "ValueRange", - "When", - "Window", - "WindowFrame", - "WindowFrameExclusion", - "FileField", - "ImageField", - "GeneratedField", - "JSONField", - "OrderWrt", - "Lookup", - "Transform", - "Manager", - "Prefetch", - "Q", - "QuerySet", - "aprefetch_related_objects", - "prefetch_related_objects", - "DEFERRED", - "Model", - "FilteredRelation", - "ForeignKey", - "ForeignObject", - "OneToOneField", - "ManyToManyField", - "ForeignObjectRel", - "ManyToOneRel", - "ManyToManyRel", - "OneToOneRel", -] diff --git a/.venv/lib/python3.10/site-packages/django/db/models/aggregates.py b/.venv/lib/python3.10/site-packages/django/db/models/aggregates.py deleted file mode 100644 index ea16cc4..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/aggregates.py +++ /dev/null @@ -1,237 +0,0 @@ -""" -Classes to represent the definitions of aggregate functions. -""" - -from django.core.exceptions import FieldError, FullResultSet -from django.db.models.expressions import Case, ColPairs, Func, Star, Value, When -from django.db.models.fields import IntegerField -from django.db.models.functions import Coalesce -from django.db.models.functions.mixins import ( - FixDurationInputMixin, - NumericOutputFieldMixin, -) - -__all__ = [ - "Aggregate", - "Avg", - "Count", - "Max", - "Min", - "StdDev", - "Sum", - "Variance", -] - - -class Aggregate(Func): - template = "%(function)s(%(distinct)s%(expressions)s)" - contains_aggregate = True - name = None - filter_template = "%s FILTER (WHERE %%(filter)s)" - window_compatible = True - allow_distinct = False - empty_result_set_value = None - - def __init__( - self, *expressions, distinct=False, filter=None, default=None, **extra - ): - if distinct and not self.allow_distinct: - raise TypeError("%s does not allow distinct." % self.__class__.__name__) - if default is not None and self.empty_result_set_value is not None: - raise TypeError(f"{self.__class__.__name__} does not allow default.") - self.distinct = distinct - self.filter = filter - self.default = default - super().__init__(*expressions, **extra) - - def get_source_fields(self): - # Don't return the filter expression since it's not a source field. - return [e._output_field_or_none for e in super().get_source_expressions()] - - def get_source_expressions(self): - source_expressions = super().get_source_expressions() - return source_expressions + [self.filter] - - def set_source_expressions(self, exprs): - *exprs, self.filter = exprs - return super().set_source_expressions(exprs) - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - # Aggregates are not allowed in UPDATE queries, so ignore for_save - c = super().resolve_expression(query, allow_joins, reuse, summarize) - c.filter = ( - c.filter.resolve_expression(query, allow_joins, reuse, summarize) - if c.filter - else None - ) - if summarize: - # Summarized aggregates cannot refer to summarized aggregates. - for ref in c.get_refs(): - if query.annotations[ref].is_summary: - raise FieldError( - f"Cannot compute {c.name}('{ref}'): '{ref}' is an aggregate" - ) - elif not self.is_summary: - # Call Aggregate.get_source_expressions() to avoid - # returning self.filter and including that in this loop. - expressions = super(Aggregate, c).get_source_expressions() - for index, expr in enumerate(expressions): - if expr.contains_aggregate: - before_resolved = self.get_source_expressions()[index] - name = ( - before_resolved.name - if hasattr(before_resolved, "name") - else repr(before_resolved) - ) - raise FieldError( - "Cannot compute %s('%s'): '%s' is an aggregate" - % (c.name, name, name) - ) - if (default := c.default) is None: - return c - if hasattr(default, "resolve_expression"): - default = default.resolve_expression(query, allow_joins, reuse, summarize) - if default._output_field_or_none is None: - default.output_field = c._output_field_or_none - else: - default = Value(default, c._output_field_or_none) - c.default = None # Reset the default argument before wrapping. - coalesce = Coalesce(c, default, output_field=c._output_field_or_none) - coalesce.is_summary = c.is_summary - return coalesce - - @property - def default_alias(self): - expressions = [ - expr for expr in self.get_source_expressions() if expr is not None - ] - if len(expressions) == 1 and hasattr(expressions[0], "name"): - return "%s__%s" % (expressions[0].name, self.name.lower()) - raise TypeError("Complex expressions require an alias") - - def get_group_by_cols(self): - return [] - - def as_sql(self, compiler, connection, **extra_context): - extra_context["distinct"] = "DISTINCT " if self.distinct else "" - if self.filter: - if connection.features.supports_aggregate_filter_clause: - try: - filter_sql, filter_params = self.filter.as_sql(compiler, connection) - except FullResultSet: - pass - else: - template = self.filter_template % extra_context.get( - "template", self.template - ) - sql, params = super().as_sql( - compiler, - connection, - template=template, - filter=filter_sql, - **extra_context, - ) - return sql, (*params, *filter_params) - else: - copy = self.copy() - copy.filter = None - source_expressions = copy.get_source_expressions() - condition = When(self.filter, then=source_expressions[0]) - copy.set_source_expressions([Case(condition)] + source_expressions[1:]) - return super(Aggregate, copy).as_sql( - compiler, connection, **extra_context - ) - return super().as_sql(compiler, connection, **extra_context) - - def _get_repr_options(self): - options = super()._get_repr_options() - if self.distinct: - options["distinct"] = self.distinct - if self.filter: - options["filter"] = self.filter - return options - - -class Avg(FixDurationInputMixin, NumericOutputFieldMixin, Aggregate): - function = "AVG" - name = "Avg" - allow_distinct = True - arity = 1 - - -class Count(Aggregate): - function = "COUNT" - name = "Count" - output_field = IntegerField() - allow_distinct = True - empty_result_set_value = 0 - arity = 1 - allows_composite_expressions = True - - def __init__(self, expression, filter=None, **extra): - if expression == "*": - expression = Star() - if isinstance(expression, Star) and filter is not None: - raise ValueError("Star cannot be used with filter. Please specify a field.") - super().__init__(expression, filter=filter, **extra) - - def resolve_expression(self, *args, **kwargs): - result = super().resolve_expression(*args, **kwargs) - expr = result.source_expressions[0] - - # In case of composite primary keys, count the first column. - if isinstance(expr, ColPairs): - if self.distinct: - raise ValueError( - "COUNT(DISTINCT) doesn't support composite primary keys" - ) - - cols = expr.get_cols() - return Count(cols[0], filter=result.filter) - - return result - - -class Max(Aggregate): - function = "MAX" - name = "Max" - arity = 1 - - -class Min(Aggregate): - function = "MIN" - name = "Min" - arity = 1 - - -class StdDev(NumericOutputFieldMixin, Aggregate): - name = "StdDev" - arity = 1 - - def __init__(self, expression, sample=False, **extra): - self.function = "STDDEV_SAMP" if sample else "STDDEV_POP" - super().__init__(expression, **extra) - - def _get_repr_options(self): - return {**super()._get_repr_options(), "sample": self.function == "STDDEV_SAMP"} - - -class Sum(FixDurationInputMixin, Aggregate): - function = "SUM" - name = "Sum" - allow_distinct = True - arity = 1 - - -class Variance(NumericOutputFieldMixin, Aggregate): - name = "Variance" - arity = 1 - - def __init__(self, expression, sample=False, **extra): - self.function = "VAR_SAMP" if sample else "VAR_POP" - super().__init__(expression, **extra) - - def _get_repr_options(self): - return {**super()._get_repr_options(), "sample": self.function == "VAR_SAMP"} diff --git a/.venv/lib/python3.10/site-packages/django/db/models/base.py b/.venv/lib/python3.10/site-packages/django/db/models/base.py deleted file mode 100644 index d7d2079..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/base.py +++ /dev/null @@ -1,2582 +0,0 @@ -import copy -import inspect -import warnings -from collections import defaultdict -from functools import partialmethod -from itertools import chain - -from asgiref.sync import sync_to_async - -import django -from django.apps import apps -from django.conf import settings -from django.core import checks -from django.core.exceptions import ( - NON_FIELD_ERRORS, - FieldDoesNotExist, - FieldError, - MultipleObjectsReturned, - ObjectDoesNotExist, - ValidationError, -) -from django.db import ( - DJANGO_VERSION_PICKLE_KEY, - DatabaseError, - connection, - connections, - router, - transaction, -) -from django.db.models import NOT_PROVIDED, ExpressionWrapper, IntegerField, Max, Value -from django.db.models.constants import LOOKUP_SEP -from django.db.models.deletion import CASCADE, Collector -from django.db.models.expressions import DatabaseDefault -from django.db.models.fields.composite import CompositePrimaryKey -from django.db.models.fields.related import ( - ForeignObjectRel, - OneToOneField, - lazy_related_operation, - resolve_relation, -) -from django.db.models.functions import Coalesce -from django.db.models.manager import Manager -from django.db.models.options import Options -from django.db.models.query import F, Q -from django.db.models.signals import ( - class_prepared, - post_init, - post_save, - pre_init, - pre_save, -) -from django.db.models.utils import AltersData, make_model_tuple -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.encoding import force_str -from django.utils.hashable import make_hashable -from django.utils.text import capfirst, get_text_list -from django.utils.translation import gettext_lazy as _ - - -class Deferred: - def __repr__(self): - return "" - - def __str__(self): - return "" - - -DEFERRED = Deferred() - - -def subclass_exception(name, bases, module, attached_to): - """ - Create exception subclass. Used by ModelBase below. - - The exception is created in a way that allows it to be pickled, assuming - that the returned exception class will be added as an attribute to the - 'attached_to' class. - """ - return type( - name, - bases, - { - "__module__": module, - "__qualname__": "%s.%s" % (attached_to.__qualname__, name), - }, - ) - - -def _has_contribute_to_class(value): - # Only call contribute_to_class() if it's bound. - return not inspect.isclass(value) and hasattr(value, "contribute_to_class") - - -class ModelBase(type): - """Metaclass for all models.""" - - def __new__(cls, name, bases, attrs, **kwargs): - super_new = super().__new__ - - # Also ensure initialization is only performed for subclasses of Model - # (excluding Model class itself). - parents = [b for b in bases if isinstance(b, ModelBase)] - if not parents: - return super_new(cls, name, bases, attrs) - - # Create the class. - module = attrs.pop("__module__") - new_attrs = {"__module__": module} - classcell = attrs.pop("__classcell__", None) - if classcell is not None: - new_attrs["__classcell__"] = classcell - attr_meta = attrs.pop("Meta", None) - # Pass all attrs without a (Django-specific) contribute_to_class() - # method to type.__new__() so that they're properly initialized - # (i.e. __set_name__()). - contributable_attrs = {} - for obj_name, obj in attrs.items(): - if _has_contribute_to_class(obj): - contributable_attrs[obj_name] = obj - else: - new_attrs[obj_name] = obj - new_class = super_new(cls, name, bases, new_attrs, **kwargs) - - abstract = getattr(attr_meta, "abstract", False) - meta = attr_meta or getattr(new_class, "Meta", None) - base_meta = getattr(new_class, "_meta", None) - - app_label = None - - # Look for an application configuration to attach the model to. - app_config = apps.get_containing_app_config(module) - - if getattr(meta, "app_label", None) is None: - if app_config is None: - if not abstract: - raise RuntimeError( - "Model class %s.%s doesn't declare an explicit " - "app_label and isn't in an application in " - "INSTALLED_APPS." % (module, name) - ) - - else: - app_label = app_config.label - - new_class.add_to_class("_meta", Options(meta, app_label)) - if not abstract: - new_class.add_to_class( - "DoesNotExist", - subclass_exception( - "DoesNotExist", - tuple( - x.DoesNotExist - for x in parents - if hasattr(x, "_meta") and not x._meta.abstract - ) - or (ObjectDoesNotExist,), - module, - attached_to=new_class, - ), - ) - new_class.add_to_class( - "MultipleObjectsReturned", - subclass_exception( - "MultipleObjectsReturned", - tuple( - x.MultipleObjectsReturned - for x in parents - if hasattr(x, "_meta") and not x._meta.abstract - ) - or (MultipleObjectsReturned,), - module, - attached_to=new_class, - ), - ) - if base_meta and not base_meta.abstract: - # Non-abstract child classes inherit some attributes from their - # non-abstract parent (unless an ABC comes before it in the - # method resolution order). - if not hasattr(meta, "ordering"): - new_class._meta.ordering = base_meta.ordering - if not hasattr(meta, "get_latest_by"): - new_class._meta.get_latest_by = base_meta.get_latest_by - - is_proxy = new_class._meta.proxy - - # If the model is a proxy, ensure that the base class - # hasn't been swapped out. - if is_proxy and base_meta and base_meta.swapped: - raise TypeError( - "%s cannot proxy the swapped model '%s'." % (name, base_meta.swapped) - ) - - # Add remaining attributes (those with a contribute_to_class() method) - # to the class. - for obj_name, obj in contributable_attrs.items(): - new_class.add_to_class(obj_name, obj) - - # All the fields of any type declared on this model - new_fields = chain( - new_class._meta.local_fields, - new_class._meta.local_many_to_many, - new_class._meta.private_fields, - ) - field_names = {f.name for f in new_fields} - - # Basic setup for proxy models. - if is_proxy: - base = None - for parent in [kls for kls in parents if hasattr(kls, "_meta")]: - if parent._meta.abstract: - if parent._meta.fields: - raise TypeError( - "Abstract base class containing model fields not " - "permitted for proxy model '%s'." % name - ) - else: - continue - if base is None: - base = parent - elif parent._meta.concrete_model is not base._meta.concrete_model: - raise TypeError( - "Proxy model '%s' has more than one non-abstract model base " - "class." % name - ) - if base is None: - raise TypeError( - "Proxy model '%s' has no non-abstract model base class." % name - ) - new_class._meta.setup_proxy(base) - new_class._meta.concrete_model = base._meta.concrete_model - else: - new_class._meta.concrete_model = new_class - - # Collect the parent links for multi-table inheritance. - parent_links = {} - for base in reversed([new_class] + parents): - # Conceptually equivalent to `if base is Model`. - if not hasattr(base, "_meta"): - continue - # Skip concrete parent classes. - if base != new_class and not base._meta.abstract: - continue - # Locate OneToOneField instances. - for field in base._meta.local_fields: - if isinstance(field, OneToOneField) and field.remote_field.parent_link: - related = resolve_relation(new_class, field.remote_field.model) - parent_links[make_model_tuple(related)] = field - - # Track fields inherited from base models. - inherited_attributes = set() - # Do the appropriate setup for any model parents. - for base in new_class.mro(): - if base not in parents or not hasattr(base, "_meta"): - # Things without _meta aren't functional models, so they're - # uninteresting parents. - inherited_attributes.update(base.__dict__) - continue - - parent_fields = base._meta.local_fields + base._meta.local_many_to_many - if not base._meta.abstract: - # Check for clashes between locally declared fields and those - # on the base classes. - for field in parent_fields: - if field.name in field_names: - raise FieldError( - "Local field %r in class %r clashes with field of " - "the same name from base class %r." - % ( - field.name, - name, - base.__name__, - ) - ) - else: - inherited_attributes.add(field.name) - - # Concrete classes... - base = base._meta.concrete_model - base_key = make_model_tuple(base) - if base_key in parent_links: - field = parent_links[base_key] - elif not is_proxy: - attr_name = "%s_ptr" % base._meta.model_name - field = OneToOneField( - base, - on_delete=CASCADE, - name=attr_name, - auto_created=True, - parent_link=True, - ) - - if attr_name in field_names: - raise FieldError( - "Auto-generated field '%s' in class %r for " - "parent_link to base class %r clashes with " - "declared field of the same name." - % ( - attr_name, - name, - base.__name__, - ) - ) - - # Only add the ptr field if it's not already present; - # e.g. migrations will already have it specified - if not hasattr(new_class, attr_name): - new_class.add_to_class(attr_name, field) - else: - field = None - new_class._meta.parents[base] = field - else: - base_parents = base._meta.parents.copy() - - # Add fields from abstract base class if it wasn't overridden. - for field in parent_fields: - if ( - field.name not in field_names - and field.name not in new_class.__dict__ - and field.name not in inherited_attributes - ): - new_field = copy.deepcopy(field) - new_class.add_to_class(field.name, new_field) - # Replace parent links defined on this base by the new - # field. It will be appropriately resolved if required. - if field.one_to_one: - for parent, parent_link in base_parents.items(): - if field == parent_link: - base_parents[parent] = new_field - - # Pass any non-abstract parent classes onto child. - new_class._meta.parents.update(base_parents) - - # Inherit private fields (like GenericForeignKey) from the parent - # class - for field in base._meta.private_fields: - if field.name in field_names: - if not base._meta.abstract: - raise FieldError( - "Local field %r in class %r clashes with field of " - "the same name from base class %r." - % ( - field.name, - name, - base.__name__, - ) - ) - else: - field = copy.deepcopy(field) - if not base._meta.abstract: - field.mti_inherited = True - new_class.add_to_class(field.name, field) - - # Copy indexes so that index names are unique when models extend an - # abstract model. - new_class._meta.indexes = [ - copy.deepcopy(idx) for idx in new_class._meta.indexes - ] - - if abstract: - # Abstract base models can't be instantiated and don't appear in - # the list of models for an app. We do the final setup for them a - # little differently from normal models. - attr_meta.abstract = False - new_class.Meta = attr_meta - return new_class - - new_class._prepare() - new_class._meta.apps.register_model(new_class._meta.app_label, new_class) - return new_class - - def add_to_class(cls, name, value): - if _has_contribute_to_class(value): - value.contribute_to_class(cls, name) - else: - setattr(cls, name, value) - - def _prepare(cls): - """Create some methods once self._meta has been populated.""" - opts = cls._meta - opts._prepare(cls) - - if opts.order_with_respect_to: - cls.get_next_in_order = partialmethod( - cls._get_next_or_previous_in_order, is_next=True - ) - cls.get_previous_in_order = partialmethod( - cls._get_next_or_previous_in_order, is_next=False - ) - - # Defer creating accessors on the foreign class until it has been - # created and registered. If remote_field is None, we're ordering - # with respect to a GenericForeignKey and don't know what the - # foreign class is - we'll add those accessors later in - # contribute_to_class(). - if opts.order_with_respect_to.remote_field: - wrt = opts.order_with_respect_to - remote = wrt.remote_field.model - lazy_related_operation(make_foreign_order_accessors, cls, remote) - - # Give the class a docstring -- its definition. - if cls.__doc__ is None: - cls.__doc__ = "%s(%s)" % ( - cls.__name__, - ", ".join(f.name for f in opts.fields), - ) - - get_absolute_url_override = settings.ABSOLUTE_URL_OVERRIDES.get( - opts.label_lower - ) - if get_absolute_url_override: - setattr(cls, "get_absolute_url", get_absolute_url_override) - - if not opts.managers: - if any(f.name == "objects" for f in opts.fields): - raise ValueError( - "Model %s must specify a custom Manager, because it has a " - "field named 'objects'." % cls.__name__ - ) - manager = Manager() - manager.auto_created = True - cls.add_to_class("objects", manager) - - # Set the name of _meta.indexes. This can't be done in - # Options.contribute_to_class() because fields haven't been added to - # the model at that point. - for index in cls._meta.indexes: - if not index.name: - index.set_name_with_model(cls) - - class_prepared.send(sender=cls) - - @property - def _base_manager(cls): - return cls._meta.base_manager - - @property - def _default_manager(cls): - return cls._meta.default_manager - - -class ModelStateFieldsCacheDescriptor: - def __get__(self, instance, cls=None): - if instance is None: - return self - res = instance.fields_cache = {} - return res - - -class ModelState: - """Store model instance state.""" - - db = None - # If true, uniqueness validation checks will consider this a new, unsaved - # object. Necessary for correct validation of new instances of objects with - # explicit (non-auto) PKs. This impacts validation only; it has no effect - # on the actual save. - adding = True - fields_cache = ModelStateFieldsCacheDescriptor() - - -class Model(AltersData, metaclass=ModelBase): - def __init__(self, *args, **kwargs): - # Alias some things as locals to avoid repeat global lookups - cls = self.__class__ - opts = self._meta - _setattr = setattr - _DEFERRED = DEFERRED - if opts.abstract: - raise TypeError("Abstract models cannot be instantiated.") - - pre_init.send(sender=cls, args=args, kwargs=kwargs) - - # Set up the storage for instance state - self._state = ModelState() - - # There is a rather weird disparity here; if kwargs, it's set, then args - # overrides it. It should be one or the other; don't duplicate the work - # The reason for the kwargs check is that standard iterator passes in by - # args, and instantiation for iteration is 33% faster. - if len(args) > len(opts.concrete_fields): - # Daft, but matches old exception sans the err msg. - raise IndexError("Number of args exceeds number of fields") - - if not kwargs: - fields_iter = iter(opts.concrete_fields) - # The ordering of the zip calls matter - zip throws StopIteration - # when an iter throws it. So if the first iter throws it, the second - # is *not* consumed. We rely on this, so don't change the order - # without changing the logic. - for val, field in zip(args, fields_iter): - if val is _DEFERRED: - continue - _setattr(self, field.attname, val) - else: - # Slower, kwargs-ready version. - fields_iter = iter(opts.fields) - for val, field in zip(args, fields_iter): - if val is _DEFERRED: - continue - _setattr(self, field.attname, val) - if kwargs.pop(field.name, NOT_PROVIDED) is not NOT_PROVIDED: - raise TypeError( - f"{cls.__qualname__}() got both positional and " - f"keyword arguments for field '{field.name}'." - ) - - # Now we're left with the unprocessed fields that *must* come from - # keywords, or default. - - for field in fields_iter: - is_related_object = False - # Virtual field - if field.column is None or field.generated: - continue - if kwargs: - if isinstance(field.remote_field, ForeignObjectRel): - try: - # Assume object instance was passed in. - rel_obj = kwargs.pop(field.name) - is_related_object = True - except KeyError: - try: - # Object instance wasn't passed in -- must be an ID. - val = kwargs.pop(field.attname) - except KeyError: - val = field.get_default() - else: - try: - val = kwargs.pop(field.attname) - except KeyError: - # This is done with an exception rather than the - # default argument on pop because we don't want - # get_default() to be evaluated, and then not used. - # Refs #12057. - val = field.get_default() - else: - val = field.get_default() - - if is_related_object: - # If we are passed a related instance, set it using the - # field.name instead of field.attname (e.g. "user" instead of - # "user_id") so that the object gets properly cached (and type - # checked) by the RelatedObjectDescriptor. - if rel_obj is not _DEFERRED: - _setattr(self, field.name, rel_obj) - else: - if val is not _DEFERRED: - _setattr(self, field.attname, val) - - if kwargs: - property_names = opts._property_names - unexpected = () - for prop, value in kwargs.items(): - # Any remaining kwargs must correspond to properties or virtual - # fields. - if prop in property_names: - if value is not _DEFERRED: - _setattr(self, prop, value) - else: - try: - opts.get_field(prop) - except FieldDoesNotExist: - unexpected += (prop,) - else: - if value is not _DEFERRED: - _setattr(self, prop, value) - if unexpected: - unexpected_names = ", ".join(repr(n) for n in unexpected) - raise TypeError( - f"{cls.__name__}() got unexpected keyword arguments: " - f"{unexpected_names}" - ) - super().__init__() - post_init.send(sender=cls, instance=self) - - @classmethod - def from_db(cls, db, field_names, values): - if len(values) != len(cls._meta.concrete_fields): - values_iter = iter(values) - values = [ - next(values_iter) if f.attname in field_names else DEFERRED - for f in cls._meta.concrete_fields - ] - new = cls(*values) - new._state.adding = False - new._state.db = db - return new - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self) - - def __str__(self): - return "%s object (%s)" % (self.__class__.__name__, self.pk) - - def __eq__(self, other): - if not isinstance(other, Model): - return NotImplemented - if self._meta.concrete_model != other._meta.concrete_model: - return False - my_pk = self.pk - if my_pk is None: - return self is other - return my_pk == other.pk - - def __hash__(self): - if not self._is_pk_set(): - raise TypeError("Model instances without primary key value are unhashable") - return hash(self.pk) - - def __reduce__(self): - data = self.__getstate__() - data[DJANGO_VERSION_PICKLE_KEY] = django.__version__ - class_id = self._meta.app_label, self._meta.object_name - return model_unpickle, (class_id,), data - - def __getstate__(self): - """Hook to allow choosing the attributes to pickle.""" - state = self.__dict__.copy() - state["_state"] = copy.copy(state["_state"]) - state["_state"].fields_cache = state["_state"].fields_cache.copy() - # memoryview cannot be pickled, so cast it to bytes and store - # separately. - _memoryview_attrs = [] - for attr, value in state.items(): - if isinstance(value, memoryview): - _memoryview_attrs.append((attr, bytes(value))) - if _memoryview_attrs: - state["_memoryview_attrs"] = _memoryview_attrs - for attr, value in _memoryview_attrs: - state.pop(attr) - return state - - def __setstate__(self, state): - pickled_version = state.get(DJANGO_VERSION_PICKLE_KEY) - if pickled_version: - if pickled_version != django.__version__: - warnings.warn( - "Pickled model instance's Django version %s does not " - "match the current version %s." - % (pickled_version, django.__version__), - RuntimeWarning, - stacklevel=2, - ) - else: - warnings.warn( - "Pickled model instance's Django version is not specified.", - RuntimeWarning, - stacklevel=2, - ) - if "_memoryview_attrs" in state: - for attr, value in state.pop("_memoryview_attrs"): - state[attr] = memoryview(value) - self.__dict__.update(state) - - def _get_pk_val(self, meta=None): - meta = meta or self._meta - return getattr(self, meta.pk.attname) - - def _set_pk_val(self, value): - for parent_link in self._meta.parents.values(): - if parent_link and parent_link != self._meta.pk: - setattr(self, parent_link.target_field.attname, value) - return setattr(self, self._meta.pk.attname, value) - - pk = property(_get_pk_val, _set_pk_val) - - def _is_pk_set(self, meta=None): - pk_val = self._get_pk_val(meta) - return not ( - pk_val is None - or (isinstance(pk_val, tuple) and any(f is None for f in pk_val)) - ) - - def get_deferred_fields(self): - """ - Return a set containing names of deferred fields for this instance. - """ - return { - f.attname - for f in self._meta.concrete_fields - if f.attname not in self.__dict__ - } - - def refresh_from_db(self, using=None, fields=None, from_queryset=None): - """ - Reload field values from the database. - - By default, the reloading happens from the database this instance was - loaded from, or by the read router if this instance wasn't loaded from - any database. The using parameter will override the default. - - Fields can be used to specify which fields to reload. The fields - should be an iterable of field attnames. If fields is None, then - all non-deferred fields are reloaded. - - When accessing deferred fields of an instance, the deferred loading - of the field will call this method. - """ - if fields is None: - self._prefetched_objects_cache = {} - else: - prefetched_objects_cache = getattr(self, "_prefetched_objects_cache", ()) - fields = set(fields) - for field in fields.copy(): - if field in prefetched_objects_cache: - del prefetched_objects_cache[field] - fields.remove(field) - if not fields: - return - if any(LOOKUP_SEP in f for f in fields): - raise ValueError( - 'Found "%s" in fields argument. Relations and transforms ' - "are not allowed in fields." % LOOKUP_SEP - ) - - if from_queryset is None: - hints = {"instance": self} - from_queryset = self.__class__._base_manager.db_manager(using, hints=hints) - elif using is not None: - from_queryset = from_queryset.using(using) - - db_instance_qs = from_queryset.filter(pk=self.pk) - - # Use provided fields, if not set then reload all non-deferred fields. - deferred_fields = self.get_deferred_fields() - if fields is not None: - db_instance_qs = db_instance_qs.only(*fields) - elif deferred_fields: - db_instance_qs = db_instance_qs.only( - *{ - f.attname - for f in self._meta.concrete_fields - if f.attname not in deferred_fields - } - ) - - db_instance = db_instance_qs.get() - non_loaded_fields = db_instance.get_deferred_fields() - for field in self._meta.concrete_fields: - if field.attname in non_loaded_fields: - # This field wasn't refreshed - skip ahead. - continue - setattr(self, field.attname, getattr(db_instance, field.attname)) - # Clear or copy cached foreign keys. - if field.is_relation: - if field.is_cached(db_instance): - field.set_cached_value(self, field.get_cached_value(db_instance)) - elif field.is_cached(self): - field.delete_cached_value(self) - - # Clear cached relations. - for rel in self._meta.related_objects: - if (fields is None or rel.name in fields) and rel.is_cached(self): - rel.delete_cached_value(self) - - # Clear cached private relations. - for field in self._meta.private_fields: - if ( - (fields is None or field.name in fields) - and field.is_relation - and field.is_cached(self) - ): - field.delete_cached_value(self) - - self._state.db = db_instance._state.db - - async def arefresh_from_db(self, using=None, fields=None, from_queryset=None): - return await sync_to_async(self.refresh_from_db)( - using=using, fields=fields, from_queryset=from_queryset - ) - - def serializable_value(self, field_name): - """ - Return the value of the field name for this instance. If the field is - a foreign key, return the id value instead of the object. If there's - no Field object with this name on the model, return the model - attribute's value. - - Used to serialize a field's value (in the serializer, or form output, - for example). Normally, you would just access the attribute directly - and not use this method. - """ - try: - field = self._meta.get_field(field_name) - except FieldDoesNotExist: - return getattr(self, field_name) - return getattr(self, field.attname) - - # RemovedInDjango60Warning: When the deprecation ends, remove completely. - def _parse_save_params(self, *args, method_name, **kwargs): - defaults = { - "force_insert": False, - "force_update": False, - "using": None, - "update_fields": None, - } - - warnings.warn( - f"Passing positional arguments to {method_name}() is deprecated", - RemovedInDjango60Warning, - stacklevel=3, - ) - total_len_args = len(args) + 1 # include self - max_len_args = len(defaults) + 1 - if total_len_args > max_len_args: - # Recreate the proper TypeError message from Python. - raise TypeError( - f"Model.{method_name}() takes from 1 to {max_len_args} positional " - f"arguments but {total_len_args} were given" - ) - - def get_param(param_name, param_value, arg_index): - if arg_index < len(args): - if param_value is not defaults[param_name]: - # Recreate the proper TypeError message from Python. - raise TypeError( - f"Model.{method_name}() got multiple values for argument " - f"'{param_name}'" - ) - return args[arg_index] - - return param_value - - return [get_param(k, v, i) for i, (k, v) in enumerate(kwargs.items())] - - # RemovedInDjango60Warning: When the deprecation ends, replace with: - # def save( - # self, *, force_insert=False, force_update=False, using=None, update_fields=None, - # ): - def save( - self, - *args, - force_insert=False, - force_update=False, - using=None, - update_fields=None, - ): - """ - Save the current instance. Override this in a subclass if you want to - control the saving process. - - The 'force_insert' and 'force_update' parameters can be used to insist - that the "save" must be an SQL insert or update (or equivalent for - non-SQL backends), respectively. Normally, they should not be set. - """ - # RemovedInDjango60Warning. - if args: - force_insert, force_update, using, update_fields = self._parse_save_params( - *args, - method_name="save", - force_insert=force_insert, - force_update=force_update, - using=using, - update_fields=update_fields, - ) - - self._prepare_related_fields_for_save(operation_name="save") - - using = using or router.db_for_write(self.__class__, instance=self) - if force_insert and (force_update or update_fields): - raise ValueError("Cannot force both insert and updating in model saving.") - - deferred_non_generated_fields = { - f.attname - for f in self._meta.concrete_fields - if f.attname not in self.__dict__ and f.generated is False - } - if update_fields is not None: - # If update_fields is empty, skip the save. We do also check for - # no-op saves later on for inheritance cases. This bailout is - # still needed for skipping signal sending. - if not update_fields: - return - - update_fields = frozenset(update_fields) - field_names = self._meta._non_pk_concrete_field_names - not_updatable_fields = update_fields.difference(field_names) - - if not_updatable_fields: - raise ValueError( - "The following fields do not exist in this model, are m2m " - "fields, primary keys, or are non-concrete fields: %s" - % ", ".join(not_updatable_fields) - ) - - # If saving to the same database, and this model is deferred, then - # automatically do an "update_fields" save on the loaded fields. - elif ( - not force_insert - and deferred_non_generated_fields - and using == self._state.db - ): - field_names = set() - pk_fields = self._meta.pk_fields - for field in self._meta.concrete_fields: - if field not in pk_fields and not hasattr(field, "through"): - field_names.add(field.attname) - loaded_fields = field_names.difference(deferred_non_generated_fields) - if loaded_fields: - update_fields = frozenset(loaded_fields) - - self.save_base( - using=using, - force_insert=force_insert, - force_update=force_update, - update_fields=update_fields, - ) - - save.alters_data = True - - # RemovedInDjango60Warning: When the deprecation ends, replace with: - # async def asave( - # self, *, force_insert=False, force_update=False, using=None, update_fields=None, - # ): - async def asave( - self, - *args, - force_insert=False, - force_update=False, - using=None, - update_fields=None, - ): - # RemovedInDjango60Warning. - if args: - force_insert, force_update, using, update_fields = self._parse_save_params( - *args, - method_name="asave", - force_insert=force_insert, - force_update=force_update, - using=using, - update_fields=update_fields, - ) - return await sync_to_async(self.save)( - force_insert=force_insert, - force_update=force_update, - using=using, - update_fields=update_fields, - ) - - asave.alters_data = True - - @classmethod - def _validate_force_insert(cls, force_insert): - if force_insert is False: - return () - if force_insert is True: - return (cls,) - if not isinstance(force_insert, tuple): - raise TypeError("force_insert must be a bool or tuple.") - for member in force_insert: - if not isinstance(member, ModelBase): - raise TypeError( - f"Invalid force_insert member. {member!r} must be a model subclass." - ) - if not issubclass(cls, member): - raise TypeError( - f"Invalid force_insert member. {member.__qualname__} must be a " - f"base of {cls.__qualname__}." - ) - return force_insert - - def save_base( - self, - raw=False, - force_insert=False, - force_update=False, - using=None, - update_fields=None, - ): - """ - Handle the parts of saving which should be done only once per save, - yet need to be done in raw saves, too. This includes some sanity - checks and signal sending. - - The 'raw' argument is telling save_base not to save any parent - models and not to do any changes to the values before save. This - is used by fixture loading. - """ - using = using or router.db_for_write(self.__class__, instance=self) - assert not (force_insert and (force_update or update_fields)) - assert update_fields is None or update_fields - cls = origin = self.__class__ - # Skip proxies, but keep the origin as the proxy model. - if cls._meta.proxy: - cls = cls._meta.concrete_model - meta = cls._meta - if not meta.auto_created: - pre_save.send( - sender=origin, - instance=self, - raw=raw, - using=using, - update_fields=update_fields, - ) - # A transaction isn't needed if one query is issued. - if meta.parents: - context_manager = transaction.atomic(using=using, savepoint=False) - else: - context_manager = transaction.mark_for_rollback_on_error(using=using) - with context_manager: - parent_inserted = False - if not raw: - # Validate force insert only when parents are inserted. - force_insert = self._validate_force_insert(force_insert) - parent_inserted = self._save_parents( - cls, using, update_fields, force_insert - ) - updated = self._save_table( - raw, - cls, - force_insert or parent_inserted, - force_update, - using, - update_fields, - ) - # Store the database on which the object was saved - self._state.db = using - # Once saved, this is no longer a to-be-added instance. - self._state.adding = False - - # Signal that the save is complete - if not meta.auto_created: - post_save.send( - sender=origin, - instance=self, - created=(not updated), - update_fields=update_fields, - raw=raw, - using=using, - ) - - save_base.alters_data = True - - def _save_parents( - self, cls, using, update_fields, force_insert, updated_parents=None - ): - """Save all the parents of cls using values from self.""" - meta = cls._meta - inserted = False - if updated_parents is None: - updated_parents = {} - for parent, field in meta.parents.items(): - # Make sure the link fields are synced between parent and self. - if ( - field - and getattr(self, parent._meta.pk.attname) is None - and getattr(self, field.attname) is not None - ): - setattr(self, parent._meta.pk.attname, getattr(self, field.attname)) - if (parent_updated := updated_parents.get(parent)) is None: - parent_inserted = self._save_parents( - cls=parent, - using=using, - update_fields=update_fields, - force_insert=force_insert, - updated_parents=updated_parents, - ) - updated = self._save_table( - cls=parent, - using=using, - update_fields=update_fields, - force_insert=parent_inserted or issubclass(parent, force_insert), - ) - if not updated: - inserted = True - updated_parents[parent] = updated - elif not parent_updated: - inserted = True - # Set the parent's PK value to self. - if field: - setattr(self, field.attname, self._get_pk_val(parent._meta)) - # Since we didn't have an instance of the parent handy set - # attname directly, bypassing the descriptor. Invalidate - # the related object cache, in case it's been accidentally - # populated. A fresh instance will be re-built from the - # database if necessary. - if field.is_cached(self): - field.delete_cached_value(self) - return inserted - - def _save_table( - self, - raw=False, - cls=None, - force_insert=False, - force_update=False, - using=None, - update_fields=None, - ): - """ - Do the heavy-lifting involved in saving. Update or insert the data - for a single table. - """ - meta = cls._meta - pk_fields = meta.pk_fields - non_pks_non_generated = [ - f - for f in meta.local_concrete_fields - if f not in pk_fields and not f.generated - ] - - if update_fields: - non_pks_non_generated = [ - f - for f in non_pks_non_generated - if f.name in update_fields or f.attname in update_fields - ] - - if not self._is_pk_set(meta): - pk_val = meta.pk.get_pk_value_on_save(self) - setattr(self, meta.pk.attname, pk_val) - pk_set = self._is_pk_set(meta) - if not pk_set and (force_update or update_fields): - raise ValueError("Cannot force an update in save() with no primary key.") - updated = False - # Skip an UPDATE when adding an instance and primary key has a default. - if ( - not raw - and not force_insert - and not force_update - and self._state.adding - and all(f.has_default() or f.has_db_default() for f in meta.pk_fields) - ): - force_insert = True - # If possible, try an UPDATE. If that doesn't update anything, do an INSERT. - if pk_set and not force_insert: - base_qs = cls._base_manager.using(using) - values = [ - ( - f, - None, - (getattr(self, f.attname) if raw else f.pre_save(self, False)), - ) - for f in non_pks_non_generated - ] - forced_update = update_fields or force_update - pk_val = self._get_pk_val(meta) - updated = self._do_update( - base_qs, using, pk_val, values, update_fields, forced_update - ) - if force_update and not updated: - raise DatabaseError("Forced update did not affect any rows.") - if update_fields and not updated: - raise DatabaseError("Save with update_fields did not affect any rows.") - if not updated: - if meta.order_with_respect_to: - # If this is a model with an order_with_respect_to - # autopopulate the _order field - field = meta.order_with_respect_to - filter_args = field.get_filter_kwargs_for_object(self) - self._order = ( - cls._base_manager.using(using) - .filter(**filter_args) - .aggregate( - _order__max=Coalesce( - ExpressionWrapper( - Max("_order") + Value(1), output_field=IntegerField() - ), - Value(0), - ), - )["_order__max"] - ) - fields = [ - f - for f in meta.local_concrete_fields - if not f.generated and (pk_set or f is not meta.auto_field) - ] - returning_fields = meta.db_returning_fields - results = self._do_insert( - cls._base_manager, using, fields, returning_fields, raw - ) - if results: - for value, field in zip(results[0], returning_fields): - setattr(self, field.attname, value) - return updated - - def _do_update(self, base_qs, using, pk_val, values, update_fields, forced_update): - """ - Try to update the model. Return True if the model was updated (if an - update query was done and a matching row was found in the DB). - """ - filtered = base_qs.filter(pk=pk_val) - if not values: - # We can end up here when saving a model in inheritance chain where - # update_fields doesn't target any field in current model. In that - # case we just say the update succeeded. Another case ending up here - # is a model with just PK - in that case check that the PK still - # exists. - return update_fields is not None or filtered.exists() - if self._meta.select_on_save and not forced_update: - return ( - filtered.exists() - and - # It may happen that the object is deleted from the DB right after - # this check, causing the subsequent UPDATE to return zero matching - # rows. The same result can occur in some rare cases when the - # database returns zero despite the UPDATE being executed - # successfully (a row is matched and updated). In order to - # distinguish these two cases, the object's existence in the - # database is again checked for if the UPDATE query returns 0. - (filtered._update(values) > 0 or filtered.exists()) - ) - return filtered._update(values) > 0 - - def _do_insert(self, manager, using, fields, returning_fields, raw): - """ - Do an INSERT. If returning_fields is defined then this method should - return the newly created data for the model. - """ - return manager._insert( - [self], - fields=fields, - returning_fields=returning_fields, - using=using, - raw=raw, - ) - - def _prepare_related_fields_for_save(self, operation_name, fields=None): - # Ensure that a model instance without a PK hasn't been assigned to - # a ForeignKey, GenericForeignKey or OneToOneField on this model. If - # the field is nullable, allowing the save would result in silent data - # loss. - for field in self._meta.concrete_fields: - if fields and field not in fields: - continue - # If the related field isn't cached, then an instance hasn't been - # assigned and there's no need to worry about this check. - if field.is_relation and field.is_cached(self): - obj = getattr(self, field.name, None) - if not obj: - continue - # A pk may have been assigned manually to a model instance not - # saved to the database (or auto-generated in a case like - # UUIDField), but we allow the save to proceed and rely on the - # database to raise an IntegrityError if applicable. If - # constraints aren't supported by the database, there's the - # unavoidable risk of data corruption. - if not obj._is_pk_set(): - # Remove the object from a related instance cache. - if not field.remote_field.multiple: - field.remote_field.delete_cached_value(obj) - raise ValueError( - "%s() prohibited to prevent data loss due to unsaved " - "related object '%s'." % (operation_name, field.name) - ) - elif getattr(self, field.attname) in field.empty_values: - # Set related object if it has been saved after an - # assignment. - setattr(self, field.name, obj) - # If the relationship's pk/to_field was changed, clear the - # cached relationship. - if getattr(obj, field.target_field.attname) != getattr( - self, field.attname - ): - field.delete_cached_value(self) - # GenericForeignKeys are private. - for field in self._meta.private_fields: - if fields and field not in fields: - continue - if ( - field.is_relation - and field.is_cached(self) - and hasattr(field, "fk_field") - ): - obj = field.get_cached_value(self, default=None) - if obj and not obj._is_pk_set(): - raise ValueError( - f"{operation_name}() prohibited to prevent data loss due to " - f"unsaved related object '{field.name}'." - ) - - def delete(self, using=None, keep_parents=False): - if not self._is_pk_set(): - raise ValueError( - "%s object can't be deleted because its %s attribute is set " - "to None." % (self._meta.object_name, self._meta.pk.attname) - ) - using = using or router.db_for_write(self.__class__, instance=self) - collector = Collector(using=using, origin=self) - collector.collect([self], keep_parents=keep_parents) - return collector.delete() - - delete.alters_data = True - - async def adelete(self, using=None, keep_parents=False): - return await sync_to_async(self.delete)( - using=using, - keep_parents=keep_parents, - ) - - adelete.alters_data = True - - def _get_FIELD_display(self, field): - value = getattr(self, field.attname) - choices_dict = dict(make_hashable(field.flatchoices)) - # force_str() to coerce lazy strings. - return force_str( - choices_dict.get(make_hashable(value), value), strings_only=True - ) - - def _get_next_or_previous_by_FIELD(self, field, is_next, **kwargs): - if not self._is_pk_set(): - raise ValueError("get_next/get_previous cannot be used on unsaved objects.") - op = "gt" if is_next else "lt" - order = "" if is_next else "-" - param = getattr(self, field.attname) - q = Q.create([(field.name, param), (f"pk__{op}", self.pk)], connector=Q.AND) - q = Q.create([q, (f"{field.name}__{op}", param)], connector=Q.OR) - qs = ( - self.__class__._default_manager.using(self._state.db) - .filter(**kwargs) - .filter(q) - .order_by("%s%s" % (order, field.name), "%spk" % order) - ) - try: - return qs[0] - except IndexError: - raise self.DoesNotExist( - "%s matching query does not exist." % self.__class__._meta.object_name - ) - - def _get_next_or_previous_in_order(self, is_next): - cachename = "__%s_order_cache" % is_next - if not hasattr(self, cachename): - op = "gt" if is_next else "lt" - order = "_order" if is_next else "-_order" - order_field = self._meta.order_with_respect_to - filter_args = order_field.get_filter_kwargs_for_object(self) - obj = ( - self.__class__._default_manager.filter(**filter_args) - .filter( - **{ - "_order__%s" - % op: self.__class__._default_manager.values("_order").filter( - **{self._meta.pk.name: self.pk} - ) - } - ) - .order_by(order)[:1] - .get() - ) - setattr(self, cachename, obj) - return getattr(self, cachename) - - def _get_field_expression_map(self, meta, exclude=None): - if exclude is None: - exclude = set() - meta = meta or self._meta - field_map = {} - generated_fields = [] - for field in meta.local_concrete_fields: - if field.name in exclude: - continue - if field.generated: - if any( - ref[0] in exclude - for ref in self._get_expr_references(field.expression) - ): - continue - generated_fields.append(field) - continue - value = getattr(self, field.attname) - if not value or not hasattr(value, "resolve_expression"): - value = Value(value, field) - field_map[field.name] = value - if "pk" not in exclude: - field_map["pk"] = Value(self.pk, meta.pk) - if generated_fields: - replacements = {F(name): value for name, value in field_map.items()} - for generated_field in generated_fields: - field_map[generated_field.name] = ExpressionWrapper( - generated_field.expression.replace_expressions(replacements), - generated_field.output_field, - ) - - return field_map - - def prepare_database_save(self, field): - if not self._is_pk_set(): - raise ValueError( - "Unsaved model instance %r cannot be used in an ORM query." % self - ) - return getattr(self, field.remote_field.get_related_field().attname) - - def clean(self): - """ - Hook for doing any extra model-wide validation after clean() has been - called on every field by self.clean_fields. Any ValidationError raised - by this method will not be associated with a particular field; it will - have a special-case association with the field defined by NON_FIELD_ERRORS. - """ - pass - - def validate_unique(self, exclude=None): - """ - Check unique constraints on the model and raise ValidationError if any - failed. - """ - unique_checks, date_checks = self._get_unique_checks(exclude=exclude) - - errors = self._perform_unique_checks(unique_checks) - date_errors = self._perform_date_checks(date_checks) - - for k, v in date_errors.items(): - errors.setdefault(k, []).extend(v) - - if errors: - raise ValidationError(errors) - - def _get_unique_checks(self, exclude=None, include_meta_constraints=False): - """ - Return a list of checks to perform. Since validate_unique() could be - called from a ModelForm, some fields may have been excluded; we can't - perform a unique check on a model that is missing fields involved - in that check. Fields that did not validate should also be excluded, - but they need to be passed in via the exclude argument. - """ - if exclude is None: - exclude = set() - unique_checks = [] - - unique_togethers = [(self.__class__, self._meta.unique_together)] - constraints = [] - if include_meta_constraints: - constraints = [(self.__class__, self._meta.total_unique_constraints)] - for parent_class in self._meta.all_parents: - if parent_class._meta.unique_together: - unique_togethers.append( - (parent_class, parent_class._meta.unique_together) - ) - if include_meta_constraints and parent_class._meta.total_unique_constraints: - constraints.append( - (parent_class, parent_class._meta.total_unique_constraints) - ) - - for model_class, unique_together in unique_togethers: - for check in unique_together: - if not any(name in exclude for name in check): - # Add the check if the field isn't excluded. - unique_checks.append((model_class, tuple(check))) - - if include_meta_constraints: - for model_class, model_constraints in constraints: - for constraint in model_constraints: - if not any(name in exclude for name in constraint.fields): - unique_checks.append((model_class, constraint.fields)) - - # These are checks for the unique_for_. - date_checks = [] - - # Gather a list of checks for fields declared as unique and add them to - # the list of checks. - - fields_with_class = [(self.__class__, self._meta.local_fields)] - for parent_class in self._meta.all_parents: - fields_with_class.append((parent_class, parent_class._meta.local_fields)) - - for model_class, fields in fields_with_class: - for f in fields: - name = f.name - if name in exclude: - continue - if isinstance(f, CompositePrimaryKey): - names = tuple(field.name for field in f.fields) - if exclude.isdisjoint(names): - unique_checks.append((model_class, names)) - continue - if f.unique: - unique_checks.append((model_class, (name,))) - if f.unique_for_date and f.unique_for_date not in exclude: - date_checks.append((model_class, "date", name, f.unique_for_date)) - if f.unique_for_year and f.unique_for_year not in exclude: - date_checks.append((model_class, "year", name, f.unique_for_year)) - if f.unique_for_month and f.unique_for_month not in exclude: - date_checks.append((model_class, "month", name, f.unique_for_month)) - return unique_checks, date_checks - - def _perform_unique_checks(self, unique_checks): - errors = {} - - for model_class, unique_check in unique_checks: - # Try to look up an existing object with the same values as this - # object's values for all the unique field. - - lookup_kwargs = {} - for field_name in unique_check: - f = self._meta.get_field(field_name) - lookup_value = getattr(self, f.attname) - # TODO: Handle multiple backends with different feature flags. - if lookup_value is None or ( - lookup_value == "" - and connection.features.interprets_empty_strings_as_nulls - ): - # no value, skip the lookup - continue - if f in model_class._meta.pk_fields and not self._state.adding: - # no need to check for unique primary key when editing - continue - lookup_kwargs[str(field_name)] = lookup_value - - # some fields were skipped, no reason to do the check - if len(unique_check) != len(lookup_kwargs): - continue - - qs = model_class._default_manager.filter(**lookup_kwargs) - - # Exclude the current object from the query if we are editing an - # instance (as opposed to creating a new one) - # Note that we need to use the pk as defined by model_class, not - # self.pk. These can be different fields because model inheritance - # allows single model to have effectively multiple primary keys. - # Refs #17615. - model_class_pk = self._get_pk_val(model_class._meta) - if not self._state.adding and self._is_pk_set(model_class._meta): - qs = qs.exclude(pk=model_class_pk) - if qs.exists(): - if len(unique_check) == 1: - key = unique_check[0] - else: - key = NON_FIELD_ERRORS - errors.setdefault(key, []).append( - self.unique_error_message(model_class, unique_check) - ) - - return errors - - def _perform_date_checks(self, date_checks): - errors = {} - for model_class, lookup_type, field, unique_for in date_checks: - lookup_kwargs = {} - # there's a ticket to add a date lookup, we can remove this special - # case if that makes it's way in - date = getattr(self, unique_for) - if date is None: - continue - if lookup_type == "date": - lookup_kwargs["%s__day" % unique_for] = date.day - lookup_kwargs["%s__month" % unique_for] = date.month - lookup_kwargs["%s__year" % unique_for] = date.year - else: - lookup_kwargs["%s__%s" % (unique_for, lookup_type)] = getattr( - date, lookup_type - ) - lookup_kwargs[field] = getattr(self, field) - - qs = model_class._default_manager.filter(**lookup_kwargs) - # Exclude the current object from the query if we are editing an - # instance (as opposed to creating a new one) - if not self._state.adding and self._is_pk_set(): - qs = qs.exclude(pk=self.pk) - - if qs.exists(): - errors.setdefault(field, []).append( - self.date_error_message(lookup_type, field, unique_for) - ) - return errors - - def date_error_message(self, lookup_type, field_name, unique_for): - opts = self._meta - field = opts.get_field(field_name) - return ValidationError( - message=field.error_messages["unique_for_date"], - code="unique_for_date", - params={ - "model": self, - "model_name": capfirst(opts.verbose_name), - "lookup_type": lookup_type, - "field": field_name, - "field_label": capfirst(field.verbose_name), - "date_field": unique_for, - "date_field_label": capfirst(opts.get_field(unique_for).verbose_name), - }, - ) - - def unique_error_message(self, model_class, unique_check): - opts = model_class._meta - - params = { - "model": self, - "model_class": model_class, - "model_name": capfirst(opts.verbose_name), - "unique_check": unique_check, - } - - # A unique field - if len(unique_check) == 1: - field = opts.get_field(unique_check[0]) - params["field_label"] = capfirst(field.verbose_name) - return ValidationError( - message=field.error_messages["unique"], - code="unique", - params=params, - ) - - # unique_together - else: - field_labels = [ - capfirst(opts.get_field(f).verbose_name) for f in unique_check - ] - params["field_labels"] = get_text_list(field_labels, _("and")) - return ValidationError( - message=_("%(model_name)s with this %(field_labels)s already exists."), - code="unique_together", - params=params, - ) - - def get_constraints(self): - constraints = [(self.__class__, self._meta.constraints)] - for parent_class in self._meta.all_parents: - if parent_class._meta.constraints: - constraints.append((parent_class, parent_class._meta.constraints)) - return constraints - - def validate_constraints(self, exclude=None): - constraints = self.get_constraints() - using = router.db_for_write(self.__class__, instance=self) - - errors = {} - for model_class, model_constraints in constraints: - for constraint in model_constraints: - try: - constraint.validate(model_class, self, exclude=exclude, using=using) - except ValidationError as e: - if ( - getattr(e, "code", None) == "unique" - and len(constraint.fields) == 1 - ): - errors.setdefault(constraint.fields[0], []).append(e) - else: - errors = e.update_error_dict(errors) - if errors: - raise ValidationError(errors) - - def full_clean(self, exclude=None, validate_unique=True, validate_constraints=True): - """ - Call clean_fields(), clean(), validate_unique(), and - validate_constraints() on the model. Raise a ValidationError for any - errors that occur. - """ - errors = {} - if exclude is None: - exclude = set() - else: - exclude = set(exclude) - - try: - self.clean_fields(exclude=exclude) - except ValidationError as e: - errors = e.update_error_dict(errors) - - # Form.clean() is run even if other validation fails, so do the - # same with Model.clean() for consistency. - try: - self.clean() - except ValidationError as e: - errors = e.update_error_dict(errors) - - # Run unique checks, but only for fields that passed validation. - if validate_unique: - for name in errors: - if name != NON_FIELD_ERRORS and name not in exclude: - exclude.add(name) - try: - self.validate_unique(exclude=exclude) - except ValidationError as e: - errors = e.update_error_dict(errors) - - # Run constraints checks, but only for fields that passed validation. - if validate_constraints: - for name in errors: - if name != NON_FIELD_ERRORS and name not in exclude: - exclude.add(name) - try: - self.validate_constraints(exclude=exclude) - except ValidationError as e: - errors = e.update_error_dict(errors) - - if errors: - raise ValidationError(errors) - - def clean_fields(self, exclude=None): - """ - Clean all fields and raise a ValidationError containing a dict - of all validation errors if any occur. - """ - if exclude is None: - exclude = set() - - errors = {} - for f in self._meta.fields: - if f.name in exclude or f.generated: - continue - # Skip validation for empty fields with blank=True. The developer - # is responsible for making sure they have a valid value. - raw_value = getattr(self, f.attname) - if f.blank and raw_value in f.empty_values: - continue - # Skip validation for empty fields when db_default is used. - if isinstance(raw_value, DatabaseDefault): - continue - try: - setattr(self, f.attname, f.clean(raw_value, self)) - except ValidationError as e: - errors[f.name] = e.error_list - - if errors: - raise ValidationError(errors) - - @classmethod - def check(cls, **kwargs): - errors = [ - *cls._check_swappable(), - *cls._check_model(), - *cls._check_managers(**kwargs), - ] - if not cls._meta.swapped: - databases = kwargs.get("databases") or [] - errors += [ - *cls._check_fields(**kwargs), - *cls._check_m2m_through_same_relationship(), - *cls._check_long_column_names(databases), - ] - clash_errors = ( - *cls._check_id_field(), - *cls._check_field_name_clashes(), - *cls._check_model_name_db_lookup_clashes(), - *cls._check_property_name_related_field_accessor_clashes(), - *cls._check_single_primary_key(), - ) - errors.extend(clash_errors) - # If there are field name clashes, hide consequent column name - # clashes. - if not clash_errors: - errors.extend(cls._check_column_name_clashes()) - errors += [ - *cls._check_unique_together(), - *cls._check_indexes(databases), - *cls._check_ordering(), - *cls._check_constraints(databases), - *cls._check_default_pk(), - *cls._check_db_table_comment(databases), - *cls._check_composite_pk(), - ] - - return errors - - @classmethod - def _check_default_pk(cls): - if ( - not cls._meta.abstract - and cls._meta.pk.auto_created - and - # Inherited PKs are checked in parents models. - not ( - isinstance(cls._meta.pk, OneToOneField) - and cls._meta.pk.remote_field.parent_link - ) - and not settings.is_overridden("DEFAULT_AUTO_FIELD") - and cls._meta.app_config - and not cls._meta.app_config._is_default_auto_field_overridden - ): - return [ - checks.Warning( - f"Auto-created primary key used when not defining a " - f"primary key type, by default " - f"'{settings.DEFAULT_AUTO_FIELD}'.", - hint=( - f"Configure the DEFAULT_AUTO_FIELD setting or the " - f"{cls._meta.app_config.__class__.__qualname__}." - f"default_auto_field attribute to point to a subclass " - f"of AutoField, e.g. 'django.db.models.BigAutoField'." - ), - obj=cls, - id="models.W042", - ), - ] - return [] - - @classmethod - def _check_composite_pk(cls): - errors = [] - meta = cls._meta - pk = meta.pk - - if not isinstance(pk, CompositePrimaryKey): - return errors - - seen_columns = defaultdict(list) - - for field_name in pk.field_names: - hint = None - - try: - field = meta.get_field(field_name) - except FieldDoesNotExist: - field = None - - if not field: - hint = f"{field_name!r} is not a valid field." - elif not field.column: - hint = f"{field_name!r} field has no column." - elif field.null: - hint = f"{field_name!r} field may not set 'null=True'." - elif field.generated: - hint = f"{field_name!r} field is a generated field." - elif field not in meta.local_fields: - hint = f"{field_name!r} field is not a local field." - else: - seen_columns[field.column].append(field_name) - - if hint: - errors.append( - checks.Error( - f"{field_name!r} cannot be included in the composite primary " - "key.", - hint=hint, - obj=cls, - id="models.E042", - ) - ) - - for column, field_names in seen_columns.items(): - if len(field_names) > 1: - field_name, *rest = field_names - duplicates = ", ".join(repr(field) for field in rest) - errors.append( - checks.Error( - f"{duplicates} cannot be included in the composite primary " - "key.", - hint=f"{duplicates} and {field_name!r} are the same fields.", - obj=cls, - id="models.E042", - ) - ) - - return errors - - @classmethod - def _check_db_table_comment(cls, databases): - if not cls._meta.db_table_comment: - return [] - errors = [] - for db in databases: - if not router.allow_migrate_model(db, cls): - continue - connection = connections[db] - if not ( - connection.features.supports_comments - or "supports_comments" in cls._meta.required_db_features - ): - errors.append( - checks.Warning( - f"{connection.display_name} does not support comments on " - f"tables (db_table_comment).", - obj=cls, - id="models.W046", - ) - ) - return errors - - @classmethod - def _check_swappable(cls): - """Check if the swapped model exists.""" - errors = [] - if cls._meta.swapped: - try: - apps.get_model(cls._meta.swapped) - except ValueError: - errors.append( - checks.Error( - "'%s' is not of the form 'app_label.app_name'." - % cls._meta.swappable, - id="models.E001", - ) - ) - except LookupError: - app_label, model_name = cls._meta.swapped.split(".") - errors.append( - checks.Error( - "'%s' references '%s.%s', which has not been " - "installed, or is abstract." - % (cls._meta.swappable, app_label, model_name), - id="models.E002", - ) - ) - return errors - - @classmethod - def _check_model(cls): - errors = [] - if cls._meta.proxy: - if cls._meta.local_fields or cls._meta.local_many_to_many: - errors.append( - checks.Error( - "Proxy model '%s' contains model fields." % cls.__name__, - id="models.E017", - ) - ) - return errors - - @classmethod - def _check_managers(cls, **kwargs): - """Perform all manager checks.""" - errors = [] - for manager in cls._meta.managers: - errors.extend(manager.check(**kwargs)) - return errors - - @classmethod - def _check_fields(cls, **kwargs): - """Perform all field checks.""" - errors = [] - for field in cls._meta.local_fields: - errors.extend(field.check(**kwargs)) - for field in cls._meta.local_many_to_many: - errors.extend(field.check(from_model=cls, **kwargs)) - return errors - - @classmethod - def _check_m2m_through_same_relationship(cls): - """Check if no relationship model is used by more than one m2m field.""" - - errors = [] - seen_intermediary_signatures = [] - - fields = cls._meta.local_many_to_many - - # Skip when the target model wasn't found. - fields = (f for f in fields if isinstance(f.remote_field.model, ModelBase)) - - # Skip when the relationship model wasn't found. - fields = (f for f in fields if isinstance(f.remote_field.through, ModelBase)) - - for f in fields: - signature = ( - f.remote_field.model, - cls, - f.remote_field.through, - f.remote_field.through_fields, - ) - if signature in seen_intermediary_signatures: - errors.append( - checks.Error( - "The model has two identical many-to-many relations " - "through the intermediate model '%s'." - % f.remote_field.through._meta.label, - obj=cls, - id="models.E003", - ) - ) - else: - seen_intermediary_signatures.append(signature) - return errors - - @classmethod - def _check_id_field(cls): - """Check if `id` field is a primary key.""" - fields = [ - f for f in cls._meta.local_fields if f.name == "id" and f != cls._meta.pk - ] - # fields is empty or consists of the invalid "id" field - if fields and not fields[0].primary_key and cls._meta.pk.name == "id": - return [ - checks.Error( - "'id' can only be used as a field name if the field also " - "sets 'primary_key=True'.", - obj=cls, - id="models.E004", - ) - ] - else: - return [] - - @classmethod - def _check_field_name_clashes(cls): - """Forbid field shadowing in multi-table inheritance.""" - errors = [] - used_fields = {} # name or attname -> field - - # Check that multi-inheritance doesn't cause field name shadowing. - for parent in cls._meta.all_parents: - for f in parent._meta.local_fields: - clash = used_fields.get(f.name) or used_fields.get(f.attname) or None - if clash: - errors.append( - checks.Error( - "The field '%s' from parent model " - "'%s' clashes with the field '%s' " - "from parent model '%s'." - % (clash.name, clash.model._meta, f.name, f.model._meta), - obj=cls, - id="models.E005", - ) - ) - used_fields[f.name] = f - used_fields[f.attname] = f - - # Check that fields defined in the model don't clash with fields from - # parents, including auto-generated fields like multi-table inheritance - # child accessors. - for parent in cls._meta.all_parents: - for f in parent._meta.get_fields(): - if f not in used_fields: - used_fields[f.name] = f - - # Check that parent links in diamond-shaped MTI models don't clash. - for parent_link in cls._meta.parents.values(): - if not parent_link: - continue - clash = used_fields.get(parent_link.name) or None - if clash: - errors.append( - checks.Error( - f"The field '{parent_link.name}' clashes with the field " - f"'{clash.name}' from model '{clash.model._meta}'.", - obj=cls, - id="models.E006", - ) - ) - - for f in cls._meta.local_fields: - clash = used_fields.get(f.name) or used_fields.get(f.attname) or None - # Note that we may detect clash between user-defined non-unique - # field "id" and automatically added unique field "id", both - # defined at the same model. This special case is considered in - # _check_id_field and here we ignore it. - id_conflict = ( - f.name == "id" and clash and clash.name == "id" and clash.model == cls - ) - if clash and not id_conflict: - errors.append( - checks.Error( - "The field '%s' clashes with the field '%s' " - "from model '%s'." % (f.name, clash.name, clash.model._meta), - obj=f, - id="models.E006", - ) - ) - used_fields[f.name] = f - used_fields[f.attname] = f - - return errors - - @classmethod - def _check_column_name_clashes(cls): - # Store a list of column names which have already been used by other fields. - used_column_names = [] - errors = [] - - for f in cls._meta.local_fields: - column_name = f.column - - # Ensure the column name is not already in use. - if column_name and column_name in used_column_names: - errors.append( - checks.Error( - "Field '%s' has column name '%s' that is used by " - "another field." % (f.name, column_name), - hint="Specify a 'db_column' for the field.", - obj=cls, - id="models.E007", - ) - ) - else: - used_column_names.append(column_name) - - return errors - - @classmethod - def _check_model_name_db_lookup_clashes(cls): - errors = [] - model_name = cls.__name__ - if model_name.startswith("_") or model_name.endswith("_"): - errors.append( - checks.Error( - "The model name '%s' cannot start or end with an underscore " - "as it collides with the query lookup syntax." % model_name, - obj=cls, - id="models.E023", - ) - ) - elif LOOKUP_SEP in model_name: - errors.append( - checks.Error( - "The model name '%s' cannot contain double underscores as " - "it collides with the query lookup syntax." % model_name, - obj=cls, - id="models.E024", - ) - ) - return errors - - @classmethod - def _check_property_name_related_field_accessor_clashes(cls): - errors = [] - property_names = cls._meta._property_names - related_field_accessors = ( - f.attname - for f in cls._meta._get_fields(reverse=False) - if f.is_relation and f.related_model is not None - ) - for accessor in related_field_accessors: - if accessor in property_names: - errors.append( - checks.Error( - "The property '%s' clashes with a related field " - "accessor." % accessor, - obj=cls, - id="models.E025", - ) - ) - return errors - - @classmethod - def _check_single_primary_key(cls): - errors = [] - if sum(1 for f in cls._meta.local_fields if f.primary_key) > 1: - errors.append( - checks.Error( - "The model cannot have more than one field with " - "'primary_key=True'.", - obj=cls, - id="models.E026", - ) - ) - return errors - - @classmethod - def _check_unique_together(cls): - """Check the value of "unique_together" option.""" - if not isinstance(cls._meta.unique_together, (tuple, list)): - return [ - checks.Error( - "'unique_together' must be a list or tuple.", - obj=cls, - id="models.E010", - ) - ] - - elif any( - not isinstance(fields, (tuple, list)) - for fields in cls._meta.unique_together - ): - return [ - checks.Error( - "All 'unique_together' elements must be lists or tuples.", - obj=cls, - id="models.E011", - ) - ] - - else: - errors = [] - for fields in cls._meta.unique_together: - errors.extend(cls._check_local_fields(fields, "unique_together")) - return errors - - @classmethod - def _check_indexes(cls, databases): - """Check fields, names, and conditions of indexes.""" - errors = [] - references = set() - for index in cls._meta.indexes: - # Index name can't start with an underscore or a number, restricted - # for cross-database compatibility with Oracle. - if index.name[0] == "_" or index.name[0].isdigit(): - errors.append( - checks.Error( - "The index name '%s' cannot start with an underscore " - "or a number." % index.name, - obj=cls, - id="models.E033", - ), - ) - if len(index.name) > index.max_name_length: - errors.append( - checks.Error( - "The index name '%s' cannot be longer than %d " - "characters." % (index.name, index.max_name_length), - obj=cls, - id="models.E034", - ), - ) - if index.contains_expressions: - for expression in index.expressions: - references.update( - ref[0] for ref in cls._get_expr_references(expression) - ) - for db in databases: - if not router.allow_migrate_model(db, cls): - continue - connection = connections[db] - if not ( - connection.features.supports_partial_indexes - or "supports_partial_indexes" in cls._meta.required_db_features - ) and any(index.condition is not None for index in cls._meta.indexes): - errors.append( - checks.Warning( - "%s does not support indexes with conditions." - % connection.display_name, - hint=( - "Conditions will be ignored. Silence this warning " - "if you don't care about it." - ), - obj=cls, - id="models.W037", - ) - ) - if not ( - connection.features.supports_covering_indexes - or "supports_covering_indexes" in cls._meta.required_db_features - ) and any(index.include for index in cls._meta.indexes): - errors.append( - checks.Warning( - "%s does not support indexes with non-key columns." - % connection.display_name, - hint=( - "Non-key columns will be ignored. Silence this " - "warning if you don't care about it." - ), - obj=cls, - id="models.W040", - ) - ) - if not ( - connection.features.supports_expression_indexes - or "supports_expression_indexes" in cls._meta.required_db_features - ) and any(index.contains_expressions for index in cls._meta.indexes): - errors.append( - checks.Warning( - "%s does not support indexes on expressions." - % connection.display_name, - hint=( - "An index won't be created. Silence this warning " - "if you don't care about it." - ), - obj=cls, - id="models.W043", - ) - ) - fields = [ - field for index in cls._meta.indexes for field, _ in index.fields_orders - ] - fields += [include for index in cls._meta.indexes for include in index.include] - fields += references - errors.extend(cls._check_local_fields(fields, "indexes")) - return errors - - @classmethod - def _check_local_fields(cls, fields, option): - from django.db import models - - # In order to avoid hitting the relation tree prematurely, we use our - # own fields_map instead of using get_field() - forward_fields_map = {} - for field in cls._meta._get_fields(reverse=False): - forward_fields_map[field.name] = field - if hasattr(field, "attname"): - forward_fields_map[field.attname] = field - - errors = [] - for field_name in fields: - try: - field = forward_fields_map[field_name] - except KeyError: - errors.append( - checks.Error( - "'%s' refers to the nonexistent field '%s'." - % ( - option, - field_name, - ), - obj=cls, - id="models.E012", - ) - ) - else: - if isinstance(field.remote_field, models.ManyToManyRel): - errors.append( - checks.Error( - "'%s' refers to a ManyToManyField '%s', but " - "ManyToManyFields are not permitted in '%s'." - % ( - option, - field_name, - option, - ), - obj=cls, - id="models.E013", - ) - ) - elif isinstance(field, models.CompositePrimaryKey): - errors.append( - checks.Error( - f"{option!r} refers to a CompositePrimaryKey " - f"{field_name!r}, but CompositePrimaryKeys are not " - f"permitted in {option!r}.", - obj=cls, - id="models.E048", - ) - ) - elif field not in cls._meta.local_fields: - errors.append( - checks.Error( - "'%s' refers to field '%s' which is not local to model " - "'%s'." % (option, field_name, cls._meta.object_name), - hint="This issue may be caused by multi-table inheritance.", - obj=cls, - id="models.E016", - ) - ) - return errors - - @classmethod - def _check_ordering(cls): - """ - Check "ordering" option -- is it a list of strings and do all fields - exist? - """ - if cls._meta._ordering_clash: - return [ - checks.Error( - "'ordering' and 'order_with_respect_to' cannot be used together.", - obj=cls, - id="models.E021", - ), - ] - - if cls._meta.order_with_respect_to or not cls._meta.ordering: - return [] - - if not isinstance(cls._meta.ordering, (list, tuple)): - return [ - checks.Error( - "'ordering' must be a tuple or list (even if you want to order by " - "only one field).", - obj=cls, - id="models.E014", - ) - ] - - errors = [] - fields = cls._meta.ordering - - # Skip expressions and '?' fields. - fields = (f for f in fields if isinstance(f, str) and f != "?") - - # Convert "-field" to "field". - fields = (f.removeprefix("-") for f in fields) - - # Separate related fields and non-related fields. - _fields = [] - related_fields = [] - for f in fields: - if LOOKUP_SEP in f: - related_fields.append(f) - else: - _fields.append(f) - fields = _fields - - # Check related fields. - for field in related_fields: - _cls = cls - fld = None - for part in field.split(LOOKUP_SEP): - try: - # pk is an alias that won't be found by opts.get_field. - if part == "pk": - fld = _cls._meta.pk - else: - fld = _cls._meta.get_field(part) - if fld.is_relation: - _cls = fld.path_infos[-1].to_opts.model - else: - _cls = None - except (FieldDoesNotExist, AttributeError): - if fld is None or ( - fld.get_transform(part) is None and fld.get_lookup(part) is None - ): - errors.append( - checks.Error( - "'ordering' refers to the nonexistent field, " - "related field, or lookup '%s'." % field, - obj=cls, - id="models.E015", - ) - ) - - # Skip ordering on pk. This is always a valid order_by field - # but is an alias and therefore won't be found by opts.get_field. - fields = {f for f in fields if f != "pk"} - - # Check for invalid or nonexistent fields in ordering. - invalid_fields = [] - - # Any field name that is not present in field_names does not exist. - # Also, ordering by m2m fields is not allowed. - opts = cls._meta - valid_fields = set( - chain.from_iterable( - ( - (f.name, f.attname) - if not (f.auto_created and not f.concrete) - else (f.field.related_query_name(),) - ) - for f in chain(opts.fields, opts.related_objects) - ) - ) - - invalid_fields.extend(fields - valid_fields) - - for invalid_field in invalid_fields: - errors.append( - checks.Error( - "'ordering' refers to the nonexistent field, related " - "field, or lookup '%s'." % invalid_field, - obj=cls, - id="models.E015", - ) - ) - return errors - - @classmethod - def _check_long_column_names(cls, databases): - """ - Check that any auto-generated column names are shorter than the limits - for each database in which the model will be created. - """ - if not databases: - return [] - errors = [] - allowed_len = None - db_alias = None - - # Find the minimum max allowed length among all specified db_aliases. - for db in databases: - # skip databases where the model won't be created - if not router.allow_migrate_model(db, cls): - continue - connection = connections[db] - max_name_length = connection.ops.max_name_length() - if max_name_length is None or connection.features.truncates_names: - continue - else: - if allowed_len is None: - allowed_len = max_name_length - db_alias = db - elif max_name_length < allowed_len: - allowed_len = max_name_length - db_alias = db - - if allowed_len is None: - return errors - - for f in cls._meta.local_fields: - # Check if auto-generated name for the field is too long - # for the database. - if ( - f.db_column is None - and (column_name := f.column) is not None - and len(column_name) > allowed_len - ): - errors.append( - checks.Error( - 'Autogenerated column name too long for field "%s". ' - 'Maximum length is "%s" for database "%s".' - % (column_name, allowed_len, db_alias), - hint="Set the column name manually using 'db_column'.", - obj=cls, - id="models.E018", - ) - ) - - for f in cls._meta.local_many_to_many: - # Skip nonexistent models. - if isinstance(f.remote_field.through, str): - continue - - # Check if auto-generated name for the M2M field is too long - # for the database. - for m2m in f.remote_field.through._meta.local_fields: - if ( - m2m.db_column is None - and (rel_name := m2m.column) is not None - and len(rel_name) > allowed_len - ): - errors.append( - checks.Error( - "Autogenerated column name too long for M2M field " - '"%s". Maximum length is "%s" for database "%s".' - % (rel_name, allowed_len, db_alias), - hint=( - "Use 'through' to create a separate model for " - "M2M and then set column_name using 'db_column'." - ), - obj=cls, - id="models.E019", - ) - ) - - return errors - - @classmethod - def _get_expr_references(cls, expr): - if isinstance(expr, Q): - for child in expr.children: - if isinstance(child, tuple): - lookup, value = child - yield tuple(lookup.split(LOOKUP_SEP)) - yield from cls._get_expr_references(value) - else: - yield from cls._get_expr_references(child) - elif isinstance(expr, F): - yield tuple(expr.name.split(LOOKUP_SEP)) - elif hasattr(expr, "get_source_expressions"): - for src_expr in expr.get_source_expressions(): - yield from cls._get_expr_references(src_expr) - - @classmethod - def _check_constraints(cls, databases): - errors = [] - for db in databases: - if not router.allow_migrate_model(db, cls): - continue - connection = connections[db] - for constraint in cls._meta.constraints: - errors.extend(constraint._check(cls, connection)) - return errors - - -############################################ -# HELPER FUNCTIONS (CURRIED MODEL METHODS) # -############################################ - -# ORDERING METHODS ######################### - - -def method_set_order(self, ordered_obj, id_list, using=None): - order_wrt = ordered_obj._meta.order_with_respect_to - filter_args = order_wrt.get_forward_related_filter(self) - ordered_obj.objects.db_manager(using).filter(**filter_args).bulk_update( - [ordered_obj(pk=pk, _order=order) for order, pk in enumerate(id_list)], - ["_order"], - ) - - -def method_get_order(self, ordered_obj): - order_wrt = ordered_obj._meta.order_with_respect_to - filter_args = order_wrt.get_forward_related_filter(self) - pk_name = ordered_obj._meta.pk.name - return ordered_obj.objects.filter(**filter_args).values_list(pk_name, flat=True) - - -def make_foreign_order_accessors(model, related_model): - setattr( - related_model, - "get_%s_order" % model.__name__.lower(), - partialmethod(method_get_order, model), - ) - setattr( - related_model, - "set_%s_order" % model.__name__.lower(), - partialmethod(method_set_order, model), - ) - - -######## -# MISC # -######## - - -def model_unpickle(model_id): - """Used to unpickle Model subclasses with deferred fields.""" - if isinstance(model_id, tuple): - model = apps.get_model(*model_id) - else: - # Backwards compat - the model was cached directly in earlier versions. - model = model_id - return model.__new__(model) - - -model_unpickle.__safe_for_unpickle__ = True diff --git a/.venv/lib/python3.10/site-packages/django/db/models/constants.py b/.venv/lib/python3.10/site-packages/django/db/models/constants.py deleted file mode 100644 index cec1b9b..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/constants.py +++ /dev/null @@ -1,13 +0,0 @@ -""" -Constants used across the ORM in general. -""" - -from enum import Enum - -# Separator used to split filter strings apart. -LOOKUP_SEP = "__" - - -class OnConflict(Enum): - IGNORE = "ignore" - UPDATE = "update" diff --git a/.venv/lib/python3.10/site-packages/django/db/models/constraints.py b/.venv/lib/python3.10/site-packages/django/db/models/constraints.py deleted file mode 100644 index 1601fc9..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/constraints.py +++ /dev/null @@ -1,728 +0,0 @@ -import warnings -from enum import Enum -from types import NoneType - -from django.core import checks -from django.core.exceptions import FieldDoesNotExist, FieldError, ValidationError -from django.db import connections -from django.db.models.constants import LOOKUP_SEP -from django.db.models.expressions import Exists, ExpressionList, F, RawSQL -from django.db.models.indexes import IndexExpression -from django.db.models.lookups import Exact, IsNull -from django.db.models.query_utils import Q -from django.db.models.sql.query import Query -from django.db.utils import DEFAULT_DB_ALIAS -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.translation import gettext_lazy as _ - -__all__ = ["BaseConstraint", "CheckConstraint", "Deferrable", "UniqueConstraint"] - - -class BaseConstraint: - default_violation_error_message = _("Constraint “%(name)s” is violated.") - violation_error_code = None - violation_error_message = None - - non_db_attrs = ("violation_error_code", "violation_error_message") - - # RemovedInDjango60Warning: When the deprecation ends, replace with: - # def __init__( - # self, *, name, violation_error_code=None, violation_error_message=None - # ): - def __init__( - self, *args, name=None, violation_error_code=None, violation_error_message=None - ): - # RemovedInDjango60Warning. - if name is None and not args: - raise TypeError( - f"{self.__class__.__name__}.__init__() missing 1 required keyword-only " - f"argument: 'name'" - ) - self.name = name - if violation_error_code is not None: - self.violation_error_code = violation_error_code - if violation_error_message is not None: - self.violation_error_message = violation_error_message - else: - self.violation_error_message = self.default_violation_error_message - # RemovedInDjango60Warning. - if args: - warnings.warn( - f"Passing positional arguments to {self.__class__.__name__} is " - f"deprecated.", - RemovedInDjango60Warning, - stacklevel=2, - ) - for arg, attr in zip(args, ["name", "violation_error_message"]): - if arg: - setattr(self, attr, arg) - - @property - def contains_expressions(self): - return False - - def constraint_sql(self, model, schema_editor): - raise NotImplementedError("This method must be implemented by a subclass.") - - def create_sql(self, model, schema_editor): - raise NotImplementedError("This method must be implemented by a subclass.") - - def remove_sql(self, model, schema_editor): - raise NotImplementedError("This method must be implemented by a subclass.") - - @classmethod - def _expression_refs_exclude(cls, model, expression, exclude): - get_field = model._meta.get_field - for field_name, *__ in model._get_expr_references(expression): - if field_name in exclude: - return True - field = get_field(field_name) - if field.generated and cls._expression_refs_exclude( - model, field.expression, exclude - ): - return True - return False - - def validate(self, model, instance, exclude=None, using=DEFAULT_DB_ALIAS): - raise NotImplementedError("This method must be implemented by a subclass.") - - def get_violation_error_message(self): - return self.violation_error_message % {"name": self.name} - - def _check(self, model, connection): - return [] - - def _check_references(self, model, references): - from django.db.models.fields.composite import CompositePrimaryKey - - errors = [] - fields = set() - for field_name, *lookups in references: - # pk is an alias that won't be found by opts.get_field(). - if field_name != "pk" or isinstance(model._meta.pk, CompositePrimaryKey): - fields.add(field_name) - if not lookups: - # If it has no lookups it cannot result in a JOIN. - continue - try: - if field_name == "pk": - field = model._meta.pk - else: - field = model._meta.get_field(field_name) - if not field.is_relation or field.many_to_many or field.one_to_many: - continue - except FieldDoesNotExist: - continue - # JOIN must happen at the first lookup. - first_lookup = lookups[0] - if ( - hasattr(field, "get_transform") - and hasattr(field, "get_lookup") - and field.get_transform(first_lookup) is None - and field.get_lookup(first_lookup) is None - ): - errors.append( - checks.Error( - "'constraints' refers to the joined field '%s'." - % LOOKUP_SEP.join([field_name] + lookups), - obj=model, - id="models.E041", - ) - ) - errors.extend(model._check_local_fields(fields, "constraints")) - return errors - - def deconstruct(self): - path = "%s.%s" % (self.__class__.__module__, self.__class__.__name__) - path = path.replace("django.db.models.constraints", "django.db.models") - kwargs = {"name": self.name} - if ( - self.violation_error_message is not None - and self.violation_error_message != self.default_violation_error_message - ): - kwargs["violation_error_message"] = self.violation_error_message - if self.violation_error_code is not None: - kwargs["violation_error_code"] = self.violation_error_code - return (path, (), kwargs) - - def clone(self): - _, args, kwargs = self.deconstruct() - return self.__class__(*args, **kwargs) - - -class CheckConstraint(BaseConstraint): - # RemovedInDjango60Warning: when the deprecation ends, replace with - # def __init__( - # self, *, condition, name, violation_error_code=None, violation_error_message=None - # ) - def __init__( - self, - *, - name, - condition=None, - check=None, - violation_error_code=None, - violation_error_message=None, - ): - if check is not None: - warnings.warn( - "CheckConstraint.check is deprecated in favor of `.condition`.", - RemovedInDjango60Warning, - stacklevel=2, - ) - condition = check - self.condition = condition - if not getattr(condition, "conditional", False): - raise TypeError( - "CheckConstraint.condition must be a Q instance or boolean expression." - ) - super().__init__( - name=name, - violation_error_code=violation_error_code, - violation_error_message=violation_error_message, - ) - - def _get_check(self): - warnings.warn( - "CheckConstraint.check is deprecated in favor of `.condition`.", - RemovedInDjango60Warning, - stacklevel=2, - ) - return self.condition - - def _set_check(self, value): - warnings.warn( - "CheckConstraint.check is deprecated in favor of `.condition`.", - RemovedInDjango60Warning, - stacklevel=2, - ) - self.condition = value - - check = property(_get_check, _set_check) - - def _check(self, model, connection): - errors = [] - if not ( - connection.features.supports_table_check_constraints - or "supports_table_check_constraints" in model._meta.required_db_features - ): - errors.append( - checks.Warning( - f"{connection.display_name} does not support check constraints.", - hint=( - "A constraint won't be created. Silence this warning if you " - "don't care about it." - ), - obj=model, - id="models.W027", - ) - ) - elif ( - connection.features.supports_table_check_constraints - or "supports_table_check_constraints" - not in model._meta.required_db_features - ): - references = set() - condition = self.condition - if isinstance(condition, Q): - references.update(model._get_expr_references(condition)) - if any(isinstance(expr, RawSQL) for expr in condition.flatten()): - errors.append( - checks.Warning( - f"Check constraint {self.name!r} contains RawSQL() expression " - "and won't be validated during the model full_clean().", - hint="Silence this warning if you don't care about it.", - obj=model, - id="models.W045", - ), - ) - errors.extend(self._check_references(model, references)) - return errors - - def _get_check_sql(self, model, schema_editor): - query = Query(model=model, alias_cols=False) - where = query.build_where(self.condition) - compiler = query.get_compiler(connection=schema_editor.connection) - sql, params = where.as_sql(compiler, schema_editor.connection) - return sql % tuple(schema_editor.quote_value(p) for p in params) - - def constraint_sql(self, model, schema_editor): - check = self._get_check_sql(model, schema_editor) - return schema_editor._check_sql(self.name, check) - - def create_sql(self, model, schema_editor): - check = self._get_check_sql(model, schema_editor) - return schema_editor._create_check_sql(model, self.name, check) - - def remove_sql(self, model, schema_editor): - return schema_editor._delete_check_sql(model, self.name) - - def validate(self, model, instance, exclude=None, using=DEFAULT_DB_ALIAS): - against = instance._get_field_expression_map(meta=model._meta, exclude=exclude) - try: - if not Q(self.condition).check(against, using=using): - raise ValidationError( - self.get_violation_error_message(), code=self.violation_error_code - ) - except FieldError: - pass - - def __repr__(self): - return "<%s: condition=%s name=%s%s%s>" % ( - self.__class__.__qualname__, - self.condition, - repr(self.name), - ( - "" - if self.violation_error_code is None - else " violation_error_code=%r" % self.violation_error_code - ), - ( - "" - if self.violation_error_message is None - or self.violation_error_message == self.default_violation_error_message - else " violation_error_message=%r" % self.violation_error_message - ), - ) - - def __eq__(self, other): - if isinstance(other, CheckConstraint): - return ( - self.name == other.name - and self.condition == other.condition - and self.violation_error_code == other.violation_error_code - and self.violation_error_message == other.violation_error_message - ) - return super().__eq__(other) - - def deconstruct(self): - path, args, kwargs = super().deconstruct() - kwargs["condition"] = self.condition - return path, args, kwargs - - -class Deferrable(Enum): - DEFERRED = "deferred" - IMMEDIATE = "immediate" - - # A similar format was proposed for Python 3.10. - def __repr__(self): - return f"{self.__class__.__qualname__}.{self._name_}" - - -class UniqueConstraint(BaseConstraint): - def __init__( - self, - *expressions, - fields=(), - name=None, - condition=None, - deferrable=None, - include=None, - opclasses=(), - nulls_distinct=None, - violation_error_code=None, - violation_error_message=None, - ): - if not name: - raise ValueError("A unique constraint must be named.") - if not expressions and not fields: - raise ValueError( - "At least one field or expression is required to define a " - "unique constraint." - ) - if expressions and fields: - raise ValueError( - "UniqueConstraint.fields and expressions are mutually exclusive." - ) - if not isinstance(condition, (NoneType, Q)): - raise ValueError("UniqueConstraint.condition must be a Q instance.") - if condition and deferrable: - raise ValueError("UniqueConstraint with conditions cannot be deferred.") - if include and deferrable: - raise ValueError("UniqueConstraint with include fields cannot be deferred.") - if opclasses and deferrable: - raise ValueError("UniqueConstraint with opclasses cannot be deferred.") - if expressions and deferrable: - raise ValueError("UniqueConstraint with expressions cannot be deferred.") - if expressions and opclasses: - raise ValueError( - "UniqueConstraint.opclasses cannot be used with expressions. " - "Use django.contrib.postgres.indexes.OpClass() instead." - ) - if not isinstance(deferrable, (NoneType, Deferrable)): - raise TypeError( - "UniqueConstraint.deferrable must be a Deferrable instance." - ) - if not isinstance(include, (NoneType, list, tuple)): - raise TypeError("UniqueConstraint.include must be a list or tuple.") - if not isinstance(opclasses, (list, tuple)): - raise TypeError("UniqueConstraint.opclasses must be a list or tuple.") - if not isinstance(nulls_distinct, (NoneType, bool)): - raise TypeError("UniqueConstraint.nulls_distinct must be a bool.") - if opclasses and len(fields) != len(opclasses): - raise ValueError( - "UniqueConstraint.fields and UniqueConstraint.opclasses must " - "have the same number of elements." - ) - self.fields = tuple(fields) - self.condition = condition - self.deferrable = deferrable - self.include = tuple(include) if include else () - self.opclasses = opclasses - self.nulls_distinct = nulls_distinct - self.expressions = tuple( - F(expression) if isinstance(expression, str) else expression - for expression in expressions - ) - super().__init__( - name=name, - violation_error_code=violation_error_code, - violation_error_message=violation_error_message, - ) - - @property - def contains_expressions(self): - return bool(self.expressions) - - def _check(self, model, connection): - errors = model._check_local_fields({*self.fields, *self.include}, "constraints") - required_db_features = model._meta.required_db_features - if self.condition is not None and not ( - connection.features.supports_partial_indexes - or "supports_partial_indexes" in required_db_features - ): - errors.append( - checks.Warning( - f"{connection.display_name} does not support unique constraints " - "with conditions.", - hint=( - "A constraint won't be created. Silence this warning if you " - "don't care about it." - ), - obj=model, - id="models.W036", - ) - ) - if self.deferrable is not None and not ( - connection.features.supports_deferrable_unique_constraints - or "supports_deferrable_unique_constraints" in required_db_features - ): - errors.append( - checks.Warning( - f"{connection.display_name} does not support deferrable unique " - "constraints.", - hint=( - "A constraint won't be created. Silence this warning if you " - "don't care about it." - ), - obj=model, - id="models.W038", - ) - ) - if self.include and not ( - connection.features.supports_covering_indexes - or "supports_covering_indexes" in required_db_features - ): - errors.append( - checks.Warning( - f"{connection.display_name} does not support unique constraints " - "with non-key columns.", - hint=( - "A constraint won't be created. Silence this warning if you " - "don't care about it." - ), - obj=model, - id="models.W039", - ) - ) - if self.contains_expressions and not ( - connection.features.supports_expression_indexes - or "supports_expression_indexes" in required_db_features - ): - errors.append( - checks.Warning( - f"{connection.display_name} does not support unique constraints on " - "expressions.", - hint=( - "A constraint won't be created. Silence this warning if you " - "don't care about it." - ), - obj=model, - id="models.W044", - ) - ) - if self.nulls_distinct is not None and not ( - connection.features.supports_nulls_distinct_unique_constraints - or "supports_nulls_distinct_unique_constraints" in required_db_features - ): - errors.append( - checks.Warning( - f"{connection.display_name} does not support unique constraints " - "with nulls distinct.", - hint=( - "A constraint won't be created. Silence this warning if you " - "don't care about it." - ), - obj=model, - id="models.W047", - ) - ) - references = set() - if ( - connection.features.supports_partial_indexes - or "supports_partial_indexes" not in required_db_features - ) and isinstance(self.condition, Q): - references.update(model._get_expr_references(self.condition)) - if self.contains_expressions and ( - connection.features.supports_expression_indexes - or "supports_expression_indexes" not in required_db_features - ): - for expression in self.expressions: - references.update(model._get_expr_references(expression)) - errors.extend(self._check_references(model, references)) - return errors - - def _get_condition_sql(self, model, schema_editor): - if self.condition is None: - return None - query = Query(model=model, alias_cols=False) - where = query.build_where(self.condition) - compiler = query.get_compiler(connection=schema_editor.connection) - sql, params = where.as_sql(compiler, schema_editor.connection) - return sql % tuple(schema_editor.quote_value(p) for p in params) - - def _get_index_expressions(self, model, schema_editor): - if not self.expressions: - return None - index_expressions = [] - for expression in self.expressions: - index_expression = IndexExpression(expression) - index_expression.set_wrapper_classes(schema_editor.connection) - index_expressions.append(index_expression) - return ExpressionList(*index_expressions).resolve_expression( - Query(model, alias_cols=False), - ) - - def constraint_sql(self, model, schema_editor): - fields = [model._meta.get_field(field_name) for field_name in self.fields] - include = [ - model._meta.get_field(field_name).column for field_name in self.include - ] - condition = self._get_condition_sql(model, schema_editor) - expressions = self._get_index_expressions(model, schema_editor) - return schema_editor._unique_sql( - model, - fields, - self.name, - condition=condition, - deferrable=self.deferrable, - include=include, - opclasses=self.opclasses, - expressions=expressions, - nulls_distinct=self.nulls_distinct, - ) - - def create_sql(self, model, schema_editor): - fields = [model._meta.get_field(field_name) for field_name in self.fields] - include = [ - model._meta.get_field(field_name).column for field_name in self.include - ] - condition = self._get_condition_sql(model, schema_editor) - expressions = self._get_index_expressions(model, schema_editor) - return schema_editor._create_unique_sql( - model, - fields, - self.name, - condition=condition, - deferrable=self.deferrable, - include=include, - opclasses=self.opclasses, - expressions=expressions, - nulls_distinct=self.nulls_distinct, - ) - - def remove_sql(self, model, schema_editor): - condition = self._get_condition_sql(model, schema_editor) - include = [ - model._meta.get_field(field_name).column for field_name in self.include - ] - expressions = self._get_index_expressions(model, schema_editor) - return schema_editor._delete_unique_sql( - model, - self.name, - condition=condition, - deferrable=self.deferrable, - include=include, - opclasses=self.opclasses, - expressions=expressions, - nulls_distinct=self.nulls_distinct, - ) - - def __repr__(self): - return "<%s:%s%s%s%s%s%s%s%s%s%s>" % ( - self.__class__.__qualname__, - "" if not self.fields else " fields=%s" % repr(self.fields), - "" if not self.expressions else " expressions=%s" % repr(self.expressions), - " name=%s" % repr(self.name), - "" if self.condition is None else " condition=%s" % self.condition, - "" if self.deferrable is None else " deferrable=%r" % self.deferrable, - "" if not self.include else " include=%s" % repr(self.include), - "" if not self.opclasses else " opclasses=%s" % repr(self.opclasses), - ( - "" - if self.nulls_distinct is None - else " nulls_distinct=%r" % self.nulls_distinct - ), - ( - "" - if self.violation_error_code is None - else " violation_error_code=%r" % self.violation_error_code - ), - ( - "" - if self.violation_error_message is None - or self.violation_error_message == self.default_violation_error_message - else " violation_error_message=%r" % self.violation_error_message - ), - ) - - def __eq__(self, other): - if isinstance(other, UniqueConstraint): - return ( - self.name == other.name - and self.fields == other.fields - and self.condition == other.condition - and self.deferrable == other.deferrable - and self.include == other.include - and self.opclasses == other.opclasses - and self.expressions == other.expressions - and self.nulls_distinct is other.nulls_distinct - and self.violation_error_code == other.violation_error_code - and self.violation_error_message == other.violation_error_message - ) - return super().__eq__(other) - - def deconstruct(self): - path, args, kwargs = super().deconstruct() - if self.fields: - kwargs["fields"] = self.fields - if self.condition: - kwargs["condition"] = self.condition - if self.deferrable: - kwargs["deferrable"] = self.deferrable - if self.include: - kwargs["include"] = self.include - if self.opclasses: - kwargs["opclasses"] = self.opclasses - if self.nulls_distinct is not None: - kwargs["nulls_distinct"] = self.nulls_distinct - return path, self.expressions, kwargs - - def validate(self, model, instance, exclude=None, using=DEFAULT_DB_ALIAS): - queryset = model._default_manager.using(using) - if self.fields: - lookup_kwargs = {} - generated_field_names = [] - for field_name in self.fields: - if exclude and field_name in exclude: - return - field = model._meta.get_field(field_name) - if field.generated: - if exclude and self._expression_refs_exclude( - model, field.expression, exclude - ): - return - generated_field_names.append(field.name) - else: - lookup_value = getattr(instance, field.attname) - if ( - self.nulls_distinct is not False - and lookup_value is None - or ( - lookup_value == "" - and connections[ - using - ].features.interprets_empty_strings_as_nulls - ) - ): - # A composite constraint containing NULL value cannot cause - # a violation since NULL != NULL in SQL. - return - lookup_kwargs[field.name] = lookup_value - lookup_args = [] - if generated_field_names: - field_expression_map = instance._get_field_expression_map( - meta=model._meta, exclude=exclude - ) - for field_name in generated_field_names: - expression = field_expression_map[field_name] - if self.nulls_distinct is False: - lhs = F(field_name) - condition = Q(Exact(lhs, expression)) | Q( - IsNull(lhs, True), IsNull(expression, True) - ) - lookup_args.append(condition) - else: - lookup_kwargs[field_name] = expression - queryset = queryset.filter(*lookup_args, **lookup_kwargs) - else: - # Ignore constraints with excluded fields. - if exclude and any( - self._expression_refs_exclude(model, expression, exclude) - for expression in self.expressions - ): - return - replacements = { - F(field): value - for field, value in instance._get_field_expression_map( - meta=model._meta, exclude=exclude - ).items() - } - filters = [] - for expr in self.expressions: - if hasattr(expr, "get_expression_for_validation"): - expr = expr.get_expression_for_validation() - rhs = expr.replace_expressions(replacements) - condition = Exact(expr, rhs) - if self.nulls_distinct is False: - condition = Q(condition) | Q(IsNull(expr, True), IsNull(rhs, True)) - filters.append(condition) - queryset = queryset.filter(*filters) - model_class_pk = instance._get_pk_val(model._meta) - if not instance._state.adding and instance._is_pk_set(model._meta): - queryset = queryset.exclude(pk=model_class_pk) - if not self.condition: - if queryset.exists(): - if ( - self.fields - and self.violation_error_message - == self.default_violation_error_message - ): - # When fields are defined, use the unique_error_message() as - # a default for backward compatibility. - validation_error_message = instance.unique_error_message( - model, self.fields - ) - raise ValidationError( - validation_error_message, - code=validation_error_message.code, - ) - raise ValidationError( - self.get_violation_error_message(), - code=self.violation_error_code, - ) - else: - against = instance._get_field_expression_map( - meta=model._meta, exclude=exclude - ) - try: - if (self.condition & Exists(queryset.filter(self.condition))).check( - against, using=using - ): - raise ValidationError( - self.get_violation_error_message(), - code=self.violation_error_code, - ) - except FieldError: - pass diff --git a/.venv/lib/python3.10/site-packages/django/db/models/deletion.py b/.venv/lib/python3.10/site-packages/django/db/models/deletion.py deleted file mode 100644 index da2e934..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/deletion.py +++ /dev/null @@ -1,517 +0,0 @@ -from collections import Counter, defaultdict -from functools import partial, reduce -from itertools import chain -from operator import attrgetter, or_ - -from django.db import IntegrityError, connections, models, transaction -from django.db.models import query_utils, signals, sql - - -class ProtectedError(IntegrityError): - def __init__(self, msg, protected_objects): - self.protected_objects = protected_objects - super().__init__(msg, protected_objects) - - -class RestrictedError(IntegrityError): - def __init__(self, msg, restricted_objects): - self.restricted_objects = restricted_objects - super().__init__(msg, restricted_objects) - - -def CASCADE(collector, field, sub_objs, using): - collector.collect( - sub_objs, - source=field.remote_field.model, - source_attr=field.name, - nullable=field.null, - fail_on_restricted=False, - ) - if field.null and not connections[using].features.can_defer_constraint_checks: - collector.add_field_update(field, None, sub_objs) - - -def PROTECT(collector, field, sub_objs, using): - raise ProtectedError( - "Cannot delete some instances of model '%s' because they are " - "referenced through a protected foreign key: '%s.%s'" - % ( - field.remote_field.model.__name__, - sub_objs[0].__class__.__name__, - field.name, - ), - sub_objs, - ) - - -def RESTRICT(collector, field, sub_objs, using): - collector.add_restricted_objects(field, sub_objs) - collector.add_dependency(field.remote_field.model, field.model) - - -def SET(value): - if callable(value): - - def set_on_delete(collector, field, sub_objs, using): - collector.add_field_update(field, value(), sub_objs) - - else: - - def set_on_delete(collector, field, sub_objs, using): - collector.add_field_update(field, value, sub_objs) - - set_on_delete.lazy_sub_objs = True - - set_on_delete.deconstruct = lambda: ("django.db.models.SET", (value,), {}) - return set_on_delete - - -def SET_NULL(collector, field, sub_objs, using): - collector.add_field_update(field, None, sub_objs) - - -SET_NULL.lazy_sub_objs = True - - -def SET_DEFAULT(collector, field, sub_objs, using): - collector.add_field_update(field, field.get_default(), sub_objs) - - -def DO_NOTHING(collector, field, sub_objs, using): - pass - - -def get_candidate_relations_to_delete(opts): - # The candidate relations are the ones that come from N-1 and 1-1 relations. - # N-N (i.e., many-to-many) relations aren't candidates for deletion. - return ( - f - for f in opts.get_fields(include_hidden=True) - if f.auto_created and not f.concrete and (f.one_to_one or f.one_to_many) - ) - - -class Collector: - def __init__(self, using, origin=None): - self.using = using - # A Model or QuerySet object. - self.origin = origin - # Initially, {model: {instances}}, later values become lists. - self.data = defaultdict(set) - # {(field, value): [instances, …]} - self.field_updates = defaultdict(list) - # {model: {field: {instances}}} - self.restricted_objects = defaultdict(partial(defaultdict, set)) - # fast_deletes is a list of queryset-likes that can be deleted without - # fetching the objects into memory. - self.fast_deletes = [] - - # Tracks deletion-order dependency for databases without transactions - # or ability to defer constraint checks. Only concrete model classes - # should be included, as the dependencies exist only between actual - # database tables; proxy models are represented here by their concrete - # parent. - self.dependencies = defaultdict(set) # {model: {models}} - - def add(self, objs, source=None, nullable=False, reverse_dependency=False): - """ - Add 'objs' to the collection of objects to be deleted. If the call is - the result of a cascade, 'source' should be the model that caused it, - and 'nullable' should be set to True if the relation can be null. - - Return a list of all objects that were not already collected. - """ - if not objs: - return [] - new_objs = [] - model = objs[0].__class__ - instances = self.data[model] - for obj in objs: - if obj not in instances: - new_objs.append(obj) - instances.update(new_objs) - # Nullable relationships can be ignored -- they are nulled out before - # deleting, and therefore do not affect the order in which objects have - # to be deleted. - if source is not None and not nullable: - self.add_dependency(source, model, reverse_dependency=reverse_dependency) - return new_objs - - def add_dependency(self, model, dependency, reverse_dependency=False): - if reverse_dependency: - model, dependency = dependency, model - self.dependencies[model._meta.concrete_model].add( - dependency._meta.concrete_model - ) - self.data.setdefault(dependency, self.data.default_factory()) - - def add_field_update(self, field, value, objs): - """ - Schedule a field update. 'objs' must be a homogeneous iterable - collection of model instances (e.g. a QuerySet). - """ - self.field_updates[field, value].append(objs) - - def add_restricted_objects(self, field, objs): - if objs: - model = objs[0].__class__ - self.restricted_objects[model][field].update(objs) - - def clear_restricted_objects_from_set(self, model, objs): - if model in self.restricted_objects: - self.restricted_objects[model] = { - field: items - objs - for field, items in self.restricted_objects[model].items() - } - - def clear_restricted_objects_from_queryset(self, model, qs): - if model in self.restricted_objects: - objs = set( - qs.filter( - pk__in=[ - obj.pk - for objs in self.restricted_objects[model].values() - for obj in objs - ] - ) - ) - self.clear_restricted_objects_from_set(model, objs) - - def _has_signal_listeners(self, model): - return signals.pre_delete.has_listeners( - model - ) or signals.post_delete.has_listeners(model) - - def can_fast_delete(self, objs, from_field=None): - """ - Determine if the objects in the given queryset-like or single object - can be fast-deleted. This can be done if there are no cascades, no - parents and no signal listeners for the object class. - - The 'from_field' tells where we are coming from - we need this to - determine if the objects are in fact to be deleted. Allow also - skipping parent -> child -> parent chain preventing fast delete of - the child. - """ - if from_field and from_field.remote_field.on_delete is not CASCADE: - return False - if hasattr(objs, "_meta"): - model = objs._meta.model - elif hasattr(objs, "model") and hasattr(objs, "_raw_delete"): - model = objs.model - else: - return False - if self._has_signal_listeners(model): - return False - # The use of from_field comes from the need to avoid cascade back to - # parent when parent delete is cascading to child. - opts = model._meta - return ( - all( - link == from_field - for link in opts.concrete_model._meta.parents.values() - ) - and - # Foreign keys pointing to this model. - all( - related.field.remote_field.on_delete is DO_NOTHING - for related in get_candidate_relations_to_delete(opts) - ) - and ( - # Something like generic foreign key. - not any( - hasattr(field, "bulk_related_objects") - for field in opts.private_fields - ) - ) - ) - - def get_del_batches(self, objs, fields): - """ - Return the objs in suitably sized batches for the used connection. - """ - conn_batch_size = max( - connections[self.using].ops.bulk_batch_size(fields, objs), 1 - ) - if len(objs) > conn_batch_size: - return [ - objs[i : i + conn_batch_size] - for i in range(0, len(objs), conn_batch_size) - ] - else: - return [objs] - - def collect( - self, - objs, - source=None, - nullable=False, - collect_related=True, - source_attr=None, - reverse_dependency=False, - keep_parents=False, - fail_on_restricted=True, - ): - """ - Add 'objs' to the collection of objects to be deleted as well as all - parent instances. 'objs' must be a homogeneous iterable collection of - model instances (e.g. a QuerySet). If 'collect_related' is True, - related objects will be handled by their respective on_delete handler. - - If the call is the result of a cascade, 'source' should be the model - that caused it and 'nullable' should be set to True, if the relation - can be null. - - If 'reverse_dependency' is True, 'source' will be deleted before the - current model, rather than after. (Needed for cascading to parent - models, the one case in which the cascade follows the forwards - direction of an FK rather than the reverse direction.) - - If 'keep_parents' is True, data of parent model's will be not deleted. - - If 'fail_on_restricted' is False, error won't be raised even if it's - prohibited to delete such objects due to RESTRICT, that defers - restricted object checking in recursive calls where the top-level call - may need to collect more objects to determine whether restricted ones - can be deleted. - """ - if self.can_fast_delete(objs): - self.fast_deletes.append(objs) - return - new_objs = self.add( - objs, source, nullable, reverse_dependency=reverse_dependency - ) - if not new_objs: - return - - model = new_objs[0].__class__ - - if not keep_parents: - # Recursively collect concrete model's parent models, but not their - # related objects. These will be found by meta.get_fields() - concrete_model = model._meta.concrete_model - for ptr in concrete_model._meta.parents.values(): - if ptr: - parent_objs = [getattr(obj, ptr.name) for obj in new_objs] - self.collect( - parent_objs, - source=model, - source_attr=ptr.remote_field.related_name, - collect_related=False, - reverse_dependency=True, - fail_on_restricted=False, - ) - if not collect_related: - return - - model_fast_deletes = defaultdict(list) - protected_objects = defaultdict(list) - for related in get_candidate_relations_to_delete(model._meta): - # Preserve parent reverse relationships if keep_parents=True. - if keep_parents and related.model in model._meta.all_parents: - continue - field = related.field - on_delete = field.remote_field.on_delete - if on_delete == DO_NOTHING: - continue - related_model = related.related_model - if self.can_fast_delete(related_model, from_field=field): - model_fast_deletes[related_model].append(field) - continue - batches = self.get_del_batches(new_objs, [field]) - for batch in batches: - sub_objs = self.related_objects(related_model, [field], batch) - # Non-referenced fields can be deferred if no signal receivers - # are connected for the related model as they'll never be - # exposed to the user. Skip field deferring when some - # relationships are select_related as interactions between both - # features are hard to get right. This should only happen in - # the rare cases where .related_objects is overridden anyway. - if not ( - sub_objs.query.select_related - or self._has_signal_listeners(related_model) - ): - referenced_fields = set( - chain.from_iterable( - (rf.attname for rf in rel.field.foreign_related_fields) - for rel in get_candidate_relations_to_delete( - related_model._meta - ) - ) - ) - sub_objs = sub_objs.only(*tuple(referenced_fields)) - if getattr(on_delete, "lazy_sub_objs", False) or sub_objs: - try: - on_delete(self, field, sub_objs, self.using) - except ProtectedError as error: - key = "'%s.%s'" % (field.model.__name__, field.name) - protected_objects[key] += error.protected_objects - if protected_objects: - raise ProtectedError( - "Cannot delete some instances of model %r because they are " - "referenced through protected foreign keys: %s." - % ( - model.__name__, - ", ".join(protected_objects), - ), - set(chain.from_iterable(protected_objects.values())), - ) - for related_model, related_fields in model_fast_deletes.items(): - batches = self.get_del_batches(new_objs, related_fields) - for batch in batches: - sub_objs = self.related_objects(related_model, related_fields, batch) - self.fast_deletes.append(sub_objs) - for field in model._meta.private_fields: - if hasattr(field, "bulk_related_objects"): - # It's something like generic foreign key. - sub_objs = field.bulk_related_objects(new_objs, self.using) - self.collect( - sub_objs, source=model, nullable=True, fail_on_restricted=False - ) - - if fail_on_restricted: - # Raise an error if collected restricted objects (RESTRICT) aren't - # candidates for deletion also collected via CASCADE. - for related_model, instances in self.data.items(): - self.clear_restricted_objects_from_set(related_model, instances) - for qs in self.fast_deletes: - self.clear_restricted_objects_from_queryset(qs.model, qs) - if self.restricted_objects.values(): - restricted_objects = defaultdict(list) - for related_model, fields in self.restricted_objects.items(): - for field, objs in fields.items(): - if objs: - key = "'%s.%s'" % (related_model.__name__, field.name) - restricted_objects[key] += objs - if restricted_objects: - raise RestrictedError( - "Cannot delete some instances of model %r because " - "they are referenced through restricted foreign keys: " - "%s." - % ( - model.__name__, - ", ".join(restricted_objects), - ), - set(chain.from_iterable(restricted_objects.values())), - ) - - def related_objects(self, related_model, related_fields, objs): - """ - Get a QuerySet of the related model to objs via related fields. - """ - predicate = query_utils.Q.create( - [(f"{related_field.name}__in", objs) for related_field in related_fields], - connector=query_utils.Q.OR, - ) - return related_model._base_manager.using(self.using).filter(predicate) - - def instances_with_model(self): - for model, instances in self.data.items(): - for obj in instances: - yield model, obj - - def sort(self): - sorted_models = [] - concrete_models = set() - models = list(self.data) - while len(sorted_models) < len(models): - found = False - for model in models: - if model in sorted_models: - continue - dependencies = self.dependencies.get(model._meta.concrete_model) - if not (dependencies and dependencies.difference(concrete_models)): - sorted_models.append(model) - concrete_models.add(model._meta.concrete_model) - found = True - if not found: - return - self.data = {model: self.data[model] for model in sorted_models} - - def delete(self): - # sort instance collections - for model, instances in self.data.items(): - self.data[model] = sorted(instances, key=attrgetter("pk")) - - # if possible, bring the models in an order suitable for databases that - # don't support transactions or cannot defer constraint checks until the - # end of a transaction. - self.sort() - # number of objects deleted for each model label - deleted_counter = Counter() - - # Optimize for the case with a single obj and no dependencies - if len(self.data) == 1 and len(instances) == 1: - instance = list(instances)[0] - if self.can_fast_delete(instance): - with transaction.mark_for_rollback_on_error(self.using): - count = sql.DeleteQuery(model).delete_batch( - [instance.pk], self.using - ) - setattr(instance, model._meta.pk.attname, None) - return count, {model._meta.label: count} - - with transaction.atomic(using=self.using, savepoint=False): - # send pre_delete signals - for model, obj in self.instances_with_model(): - if not model._meta.auto_created: - signals.pre_delete.send( - sender=model, - instance=obj, - using=self.using, - origin=self.origin, - ) - - # fast deletes - for qs in self.fast_deletes: - count = qs._raw_delete(using=self.using) - if count: - deleted_counter[qs.model._meta.label] += count - - # update fields - for (field, value), instances_list in self.field_updates.items(): - updates = [] - objs = [] - for instances in instances_list: - if ( - isinstance(instances, models.QuerySet) - and instances._result_cache is None - ): - updates.append(instances) - else: - objs.extend(instances) - if updates: - combined_updates = reduce(or_, updates) - combined_updates.update(**{field.name: value}) - if objs: - model = objs[0].__class__ - query = sql.UpdateQuery(model) - query.update_batch( - list({obj.pk for obj in objs}), {field.name: value}, self.using - ) - - # reverse instance collections - for instances in self.data.values(): - instances.reverse() - - # delete instances - for model, instances in self.data.items(): - query = sql.DeleteQuery(model) - pk_list = [obj.pk for obj in instances] - count = query.delete_batch(pk_list, self.using) - if count: - deleted_counter[model._meta.label] += count - - if not model._meta.auto_created: - for obj in instances: - signals.post_delete.send( - sender=model, - instance=obj, - using=self.using, - origin=self.origin, - ) - - for model, instances in self.data.items(): - for instance in instances: - setattr(instance, model._meta.pk.attname, None) - return sum(deleted_counter.values()), dict(deleted_counter) diff --git a/.venv/lib/python3.10/site-packages/django/db/models/enums.py b/.venv/lib/python3.10/site-packages/django/db/models/enums.py deleted file mode 100644 index bdc669b..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/enums.py +++ /dev/null @@ -1,123 +0,0 @@ -import enum -import warnings - -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.functional import Promise -from django.utils.version import PY311, PY312 - -if PY311: - from enum import EnumType, IntEnum, StrEnum - from enum import property as enum_property -else: - from enum import EnumMeta as EnumType - from types import DynamicClassAttribute as enum_property - - class ReprEnum(enum.Enum): - def __str__(self): - return str(self.value) - - class IntEnum(int, ReprEnum): - pass - - class StrEnum(str, ReprEnum): - pass - - -__all__ = ["Choices", "IntegerChoices", "TextChoices"] - - -class ChoicesType(EnumType): - """A metaclass for creating a enum choices.""" - - def __new__(metacls, classname, bases, classdict, **kwds): - labels = [] - for key in classdict._member_names: - value = classdict[key] - if ( - isinstance(value, (list, tuple)) - and len(value) > 1 - and isinstance(value[-1], (Promise, str)) - ): - *value, label = value - value = tuple(value) - else: - label = key.replace("_", " ").title() - labels.append(label) - # Use dict.__setitem__() to suppress defenses against double - # assignment in enum's classdict. - dict.__setitem__(classdict, key, value) - cls = super().__new__(metacls, classname, bases, classdict, **kwds) - for member, label in zip(cls.__members__.values(), labels): - member._label_ = label - return enum.unique(cls) - - if not PY312: - - def __contains__(cls, member): - if not isinstance(member, enum.Enum): - # Allow non-enums to match against member values. - return any(x.value == member for x in cls) - return super().__contains__(member) - - @property - def names(cls): - empty = ["__empty__"] if hasattr(cls, "__empty__") else [] - return empty + [member.name for member in cls] - - @property - def choices(cls): - empty = [(None, cls.__empty__)] if hasattr(cls, "__empty__") else [] - return empty + [(member.value, member.label) for member in cls] - - @property - def labels(cls): - return [label for _, label in cls.choices] - - @property - def values(cls): - return [value for value, _ in cls.choices] - - -class Choices(enum.Enum, metaclass=ChoicesType): - """Class for creating enumerated choices.""" - - if PY311: - do_not_call_in_templates = enum.nonmember(True) - else: - - @property - def do_not_call_in_templates(self): - return True - - @enum_property - def label(self): - return self._label_ - - # A similar format was proposed for Python 3.10. - def __repr__(self): - return f"{self.__class__.__qualname__}.{self._name_}" - - -class IntegerChoices(Choices, IntEnum): - """Class for creating enumerated integer choices.""" - - pass - - -class TextChoices(Choices, StrEnum): - """Class for creating enumerated string choices.""" - - @staticmethod - def _generate_next_value_(name, start, count, last_values): - return name - - -def __getattr__(name): - if name == "ChoicesMeta": - warnings.warn( - "ChoicesMeta is deprecated in favor of ChoicesType.", - RemovedInDjango60Warning, - stacklevel=2, - ) - return ChoicesType - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/.venv/lib/python3.10/site-packages/django/db/models/expressions.py b/.venv/lib/python3.10/site-packages/django/db/models/expressions.py deleted file mode 100644 index 444e2fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/expressions.py +++ /dev/null @@ -1,2122 +0,0 @@ -import copy -import datetime -import functools -import inspect -from collections import defaultdict -from decimal import Decimal -from enum import Enum -from itertools import chain -from types import NoneType -from uuid import UUID - -from django.core.exceptions import EmptyResultSet, FieldError, FullResultSet -from django.db import DatabaseError, NotSupportedError, connection -from django.db.models import fields -from django.db.models.constants import LOOKUP_SEP -from django.db.models.query_utils import Q -from django.utils.deconstruct import deconstructible -from django.utils.functional import cached_property, classproperty -from django.utils.hashable import make_hashable - - -class SQLiteNumericMixin: - """ - Some expressions with output_field=DecimalField() must be cast to - numeric to be properly filtered. - """ - - def as_sqlite(self, compiler, connection, **extra_context): - sql, params = self.as_sql(compiler, connection, **extra_context) - try: - if self.output_field.get_internal_type() == "DecimalField": - sql = "(CAST(%s AS NUMERIC))" % sql - except FieldError: - pass - return sql, params - - -class Combinable: - """ - Provide the ability to combine one or two objects with - some connector. For example F('foo') + F('bar'). - """ - - # Arithmetic connectors - ADD = "+" - SUB = "-" - MUL = "*" - DIV = "/" - POW = "^" - # The following is a quoted % operator - it is quoted because it can be - # used in strings that also have parameter substitution. - MOD = "%%" - - # Bitwise operators - note that these are generated by .bitand() - # and .bitor(), the '&' and '|' are reserved for boolean operator - # usage. - BITAND = "&" - BITOR = "|" - BITLEFTSHIFT = "<<" - BITRIGHTSHIFT = ">>" - BITXOR = "#" - - def _combine(self, other, connector, reversed): - if not hasattr(other, "resolve_expression"): - # everything must be resolvable to an expression - other = Value(other) - - if reversed: - return CombinedExpression(other, connector, self) - return CombinedExpression(self, connector, other) - - ############# - # OPERATORS # - ############# - - def __neg__(self): - return self._combine(-1, self.MUL, False) - - def __add__(self, other): - return self._combine(other, self.ADD, False) - - def __sub__(self, other): - return self._combine(other, self.SUB, False) - - def __mul__(self, other): - return self._combine(other, self.MUL, False) - - def __truediv__(self, other): - return self._combine(other, self.DIV, False) - - def __mod__(self, other): - return self._combine(other, self.MOD, False) - - def __pow__(self, other): - return self._combine(other, self.POW, False) - - def __and__(self, other): - if getattr(self, "conditional", False) and getattr(other, "conditional", False): - return Q(self) & Q(other) - raise NotImplementedError( - "Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations." - ) - - def bitand(self, other): - return self._combine(other, self.BITAND, False) - - def bitleftshift(self, other): - return self._combine(other, self.BITLEFTSHIFT, False) - - def bitrightshift(self, other): - return self._combine(other, self.BITRIGHTSHIFT, False) - - def __xor__(self, other): - if getattr(self, "conditional", False) and getattr(other, "conditional", False): - return Q(self) ^ Q(other) - raise NotImplementedError( - "Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations." - ) - - def bitxor(self, other): - return self._combine(other, self.BITXOR, False) - - def __or__(self, other): - if getattr(self, "conditional", False) and getattr(other, "conditional", False): - return Q(self) | Q(other) - raise NotImplementedError( - "Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations." - ) - - def bitor(self, other): - return self._combine(other, self.BITOR, False) - - def __radd__(self, other): - return self._combine(other, self.ADD, True) - - def __rsub__(self, other): - return self._combine(other, self.SUB, True) - - def __rmul__(self, other): - return self._combine(other, self.MUL, True) - - def __rtruediv__(self, other): - return self._combine(other, self.DIV, True) - - def __rmod__(self, other): - return self._combine(other, self.MOD, True) - - def __rpow__(self, other): - return self._combine(other, self.POW, True) - - def __rand__(self, other): - raise NotImplementedError( - "Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations." - ) - - def __ror__(self, other): - raise NotImplementedError( - "Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations." - ) - - def __rxor__(self, other): - raise NotImplementedError( - "Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations." - ) - - def __invert__(self): - return NegatedExpression(self) - - -class OutputFieldIsNoneError(FieldError): - pass - - -class BaseExpression: - """Base class for all query expressions.""" - - empty_result_set_value = NotImplemented - # aggregate specific fields - is_summary = False - # Can the expression be used in a WHERE clause? - filterable = True - # Can the expression be used as a source expression in Window? - window_compatible = False - # Can the expression be used as a database default value? - allowed_default = False - # Can the expression be used during a constraint validation? - constraint_validation_compatible = True - # Does the expression possibly return more than one row? - set_returning = False - # Does the expression allow composite expressions? - allows_composite_expressions = False - - def __init__(self, output_field=None): - if output_field is not None: - self.output_field = output_field - - def __getstate__(self): - state = self.__dict__.copy() - state.pop("convert_value", None) - return state - - def get_db_converters(self, connection): - return ( - [] - if self.convert_value is self._convert_value_noop - else [self.convert_value] - ) + self.output_field.get_db_converters(connection) - - def get_source_expressions(self): - return [] - - def set_source_expressions(self, exprs): - assert not exprs - - def _parse_expressions(self, *expressions): - return [ - ( - arg - if hasattr(arg, "resolve_expression") - else (F(arg) if isinstance(arg, str) else Value(arg)) - ) - for arg in expressions - ] - - def as_sql(self, compiler, connection): - """ - Responsible for returning a (sql, [params]) tuple to be included - in the current query. - - Different backends can provide their own implementation, by - providing an `as_{vendor}` method and patching the Expression: - - ``` - def override_as_sql(self, compiler, connection): - # custom logic - return super().as_sql(compiler, connection) - setattr(Expression, 'as_' + connection.vendor, override_as_sql) - ``` - - Arguments: - * compiler: the query compiler responsible for generating the query. - Must have a compile method, returning a (sql, [params]) tuple. - Calling compiler(value) will return a quoted `value`. - - * connection: the database connection used for the current query. - - Return: (sql, params) - Where `sql` is a string containing ordered sql parameters to be - replaced with the elements of the list `params`. - """ - raise NotImplementedError("Subclasses must implement as_sql()") - - @cached_property - def contains_aggregate(self): - return any( - expr and expr.contains_aggregate for expr in self.get_source_expressions() - ) - - @cached_property - def contains_over_clause(self): - return any( - expr and expr.contains_over_clause for expr in self.get_source_expressions() - ) - - @cached_property - def contains_column_references(self): - return any( - expr and expr.contains_column_references - for expr in self.get_source_expressions() - ) - - @cached_property - def contains_subquery(self): - return any( - expr and (getattr(expr, "subquery", False) or expr.contains_subquery) - for expr in self.get_source_expressions() - ) - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - """ - Provide the chance to do any preprocessing or validation before being - added to the query. - - Arguments: - * query: the backend query implementation - * allow_joins: boolean allowing or denying use of joins - in this query - * reuse: a set of reusable joins for multijoins - * summarize: a terminal aggregate clause - * for_save: whether this expression about to be used in a save or update - - Return: an Expression to be added to the query. - """ - c = self.copy() - c.is_summary = summarize - source_expressions = [ - ( - expr.resolve_expression(query, allow_joins, reuse, summarize) - if expr is not None - else None - ) - for expr in c.get_source_expressions() - ] - if not self.allows_composite_expressions and any( - isinstance(expr, ColPairs) for expr in source_expressions - ): - raise ValueError( - f"{self.__class__.__name__} expression does not support " - "composite primary keys." - ) - c.set_source_expressions(source_expressions) - return c - - @property - def conditional(self): - return isinstance(self.output_field, fields.BooleanField) - - @property - def field(self): - return self.output_field - - @cached_property - def output_field(self): - """Return the output type of this expressions.""" - output_field = self._resolve_output_field() - if output_field is None: - raise OutputFieldIsNoneError( - "Cannot resolve expression type, unknown output_field" - ) - return output_field - - @property - def _output_field_or_none(self): - """ - Return the output field of this expression, or None if - _resolve_output_field() didn't return an output type. - """ - try: - return self.output_field - except OutputFieldIsNoneError: - return - - def _resolve_output_field(self): - """ - Attempt to infer the output type of the expression. - - As a guess, if the output fields of all source fields match then simply - infer the same type here. - - If a source's output field resolves to None, exclude it from this check. - If all sources are None, then an error is raised higher up the stack in - the output_field property. - """ - # This guess is mostly a bad idea, but there is quite a lot of code - # (especially 3rd party Func subclasses) that depend on it, we'd need a - # deprecation path to fix it. - sources_iter = ( - source for source in self.get_source_fields() if source is not None - ) - for output_field in sources_iter: - for source in sources_iter: - if not isinstance(output_field, source.__class__): - raise FieldError( - "Expression contains mixed types: %s, %s. You must " - "set output_field." - % ( - output_field.__class__.__name__, - source.__class__.__name__, - ) - ) - return output_field - - @staticmethod - def _convert_value_noop(value, expression, connection): - return value - - @cached_property - def convert_value(self): - """ - Expressions provide their own converters because users have the option - of manually specifying the output_field which may be a different type - from the one the database returns. - """ - field = self.output_field - internal_type = field.get_internal_type() - if internal_type == "FloatField": - return lambda value, expression, connection: ( - None if value is None else float(value) - ) - elif internal_type.endswith("IntegerField"): - return lambda value, expression, connection: ( - None if value is None else int(value) - ) - elif internal_type == "DecimalField": - return lambda value, expression, connection: ( - None if value is None else Decimal(value) - ) - return self._convert_value_noop - - def get_lookup(self, lookup): - return self.output_field.get_lookup(lookup) - - def get_transform(self, name): - return self.output_field.get_transform(name) - - def relabeled_clone(self, change_map): - clone = self.copy() - clone.set_source_expressions( - [ - e.relabeled_clone(change_map) if e is not None else None - for e in self.get_source_expressions() - ] - ) - return clone - - def replace_expressions(self, replacements): - if not replacements: - return self - if replacement := replacements.get(self): - return replacement - if not (source_expressions := self.get_source_expressions()): - return self - clone = self.copy() - clone.set_source_expressions( - [ - expr.replace_expressions(replacements) if expr else None - for expr in source_expressions - ] - ) - return clone - - def get_refs(self): - refs = set() - for expr in self.get_source_expressions(): - if expr is None: - continue - refs |= expr.get_refs() - return refs - - def copy(self): - return copy.copy(self) - - def prefix_references(self, prefix): - clone = self.copy() - clone.set_source_expressions( - [ - ( - F(f"{prefix}{expr.name}") - if isinstance(expr, F) - else expr.prefix_references(prefix) - ) - for expr in self.get_source_expressions() - ] - ) - return clone - - def get_group_by_cols(self): - if not self.contains_aggregate: - return [self] - cols = [] - for source in self.get_source_expressions(): - cols.extend(source.get_group_by_cols()) - return cols - - def get_source_fields(self): - """Return the underlying field types used by this aggregate.""" - return [e._output_field_or_none for e in self.get_source_expressions()] - - def asc(self, **kwargs): - return OrderBy(self, **kwargs) - - def desc(self, **kwargs): - return OrderBy(self, descending=True, **kwargs) - - def reverse_ordering(self): - return self - - def flatten(self): - """ - Recursively yield this expression and all subexpressions, in - depth-first order. - """ - yield self - for expr in self.get_source_expressions(): - if expr: - if hasattr(expr, "flatten"): - yield from expr.flatten() - else: - yield expr - - def select_format(self, compiler, sql, params): - """ - Custom format for select clauses. For example, EXISTS expressions need - to be wrapped in CASE WHEN on Oracle. - """ - if hasattr(self.output_field, "select_format"): - return self.output_field.select_format(compiler, sql, params) - return sql, params - - def get_expression_for_validation(self): - # Ignore expressions that cannot be used during a constraint validation. - if not getattr(self, "constraint_validation_compatible", True): - try: - (expression,) = self.get_source_expressions() - except ValueError as e: - raise ValueError( - "Expressions with constraint_validation_compatible set to False " - "must have only one source expression." - ) from e - else: - return expression - return self - - -@deconstructible -class Expression(BaseExpression, Combinable): - """An expression that can be combined with other expressions.""" - - @classproperty - @functools.lru_cache(maxsize=128) - def _constructor_signature(cls): - return inspect.signature(cls.__init__) - - @classmethod - def _identity(cls, value): - if isinstance(value, tuple): - return tuple(map(cls._identity, value)) - if isinstance(value, dict): - return tuple((key, cls._identity(val)) for key, val in value.items()) - if isinstance(value, fields.Field): - if value.name and value.model: - return value.model._meta.label, value.name - return type(value) - return make_hashable(value) - - @cached_property - def identity(self): - args, kwargs = self._constructor_args - signature = self._constructor_signature.bind_partial(self, *args, **kwargs) - signature.apply_defaults() - arguments = iter(signature.arguments.items()) - next(arguments) - identity = [self.__class__] - for arg, value in arguments: - # If __init__() makes use of *args or **kwargs captures `value` - # will respectively be a tuple or a dict that must have its - # constituents unpacked (mainly if contain Field instances). - value = self._identity(value) - identity.append((arg, value)) - return tuple(identity) - - def __eq__(self, other): - if not isinstance(other, Expression): - return NotImplemented - return other.identity == self.identity - - def __hash__(self): - return hash(self.identity) - - -# Type inference for CombinedExpression.output_field. -# Missing items will result in FieldError, by design. -# -# The current approach for NULL is based on lowest common denominator behavior -# i.e. if one of the supported databases is raising an error (rather than -# return NULL) for `val NULL`, then Django raises FieldError. - -_connector_combinations = [ - # Numeric operations - operands of same type. - # PositiveIntegerField should take precedence over IntegerField (except - # subtraction). - { - connector: [ - ( - fields.PositiveIntegerField, - fields.PositiveIntegerField, - fields.PositiveIntegerField, - ), - ] - for connector in ( - Combinable.ADD, - Combinable.MUL, - Combinable.DIV, - Combinable.MOD, - Combinable.POW, - ) - }, - # Other numeric operands. - { - connector: [ - (fields.IntegerField, fields.IntegerField, fields.IntegerField), - (fields.FloatField, fields.FloatField, fields.FloatField), - (fields.DecimalField, fields.DecimalField, fields.DecimalField), - ] - for connector in ( - Combinable.ADD, - Combinable.SUB, - Combinable.MUL, - # Behavior for DIV with integer arguments follows Postgres/SQLite, - # not MySQL/Oracle. - Combinable.DIV, - Combinable.MOD, - Combinable.POW, - ) - }, - # Numeric operations - operands of different type. - { - connector: [ - (fields.IntegerField, fields.DecimalField, fields.DecimalField), - (fields.DecimalField, fields.IntegerField, fields.DecimalField), - (fields.IntegerField, fields.FloatField, fields.FloatField), - (fields.FloatField, fields.IntegerField, fields.FloatField), - ] - for connector in ( - Combinable.ADD, - Combinable.SUB, - Combinable.MUL, - Combinable.DIV, - Combinable.MOD, - ) - }, - # Bitwise operators. - { - connector: [ - (fields.IntegerField, fields.IntegerField, fields.IntegerField), - ] - for connector in ( - Combinable.BITAND, - Combinable.BITOR, - Combinable.BITLEFTSHIFT, - Combinable.BITRIGHTSHIFT, - Combinable.BITXOR, - ) - }, - # Numeric with NULL. - { - connector: list( - chain.from_iterable( - [(field_type, NoneType, field_type), (NoneType, field_type, field_type)] - for field_type in ( - fields.IntegerField, - fields.DecimalField, - fields.FloatField, - ) - ) - ) - for connector in ( - Combinable.ADD, - Combinable.SUB, - Combinable.MUL, - Combinable.DIV, - Combinable.MOD, - Combinable.POW, - ) - }, - # Date/DateTimeField/DurationField/TimeField. - { - Combinable.ADD: [ - # Date/DateTimeField. - (fields.DateField, fields.DurationField, fields.DateTimeField), - (fields.DateTimeField, fields.DurationField, fields.DateTimeField), - (fields.DurationField, fields.DateField, fields.DateTimeField), - (fields.DurationField, fields.DateTimeField, fields.DateTimeField), - # DurationField. - (fields.DurationField, fields.DurationField, fields.DurationField), - # TimeField. - (fields.TimeField, fields.DurationField, fields.TimeField), - (fields.DurationField, fields.TimeField, fields.TimeField), - ], - }, - { - Combinable.SUB: [ - # Date/DateTimeField. - (fields.DateField, fields.DurationField, fields.DateTimeField), - (fields.DateTimeField, fields.DurationField, fields.DateTimeField), - (fields.DateField, fields.DateField, fields.DurationField), - (fields.DateField, fields.DateTimeField, fields.DurationField), - (fields.DateTimeField, fields.DateField, fields.DurationField), - (fields.DateTimeField, fields.DateTimeField, fields.DurationField), - # DurationField. - (fields.DurationField, fields.DurationField, fields.DurationField), - # TimeField. - (fields.TimeField, fields.DurationField, fields.TimeField), - (fields.TimeField, fields.TimeField, fields.DurationField), - ], - }, -] - -_connector_combinators = defaultdict(list) - - -def register_combinable_fields(lhs, connector, rhs, result): - """ - Register combinable types: - lhs rhs -> result - e.g. - register_combinable_fields( - IntegerField, Combinable.ADD, FloatField, FloatField - ) - """ - _connector_combinators[connector].append((lhs, rhs, result)) - - -for d in _connector_combinations: - for connector, field_types in d.items(): - for lhs, rhs, result in field_types: - register_combinable_fields(lhs, connector, rhs, result) - - -@functools.lru_cache(maxsize=128) -def _resolve_combined_type(connector, lhs_type, rhs_type): - combinators = _connector_combinators.get(connector, ()) - for combinator_lhs_type, combinator_rhs_type, combined_type in combinators: - if issubclass(lhs_type, combinator_lhs_type) and issubclass( - rhs_type, combinator_rhs_type - ): - return combined_type - - -class CombinedExpression(SQLiteNumericMixin, Expression): - def __init__(self, lhs, connector, rhs, output_field=None): - super().__init__(output_field=output_field) - self.connector = connector - self.lhs = lhs - self.rhs = rhs - - def __repr__(self): - return "<{}: {}>".format(self.__class__.__name__, self) - - def __str__(self): - return "{} {} {}".format(self.lhs, self.connector, self.rhs) - - def get_source_expressions(self): - return [self.lhs, self.rhs] - - def set_source_expressions(self, exprs): - self.lhs, self.rhs = exprs - - def _resolve_output_field(self): - # We avoid using super() here for reasons given in - # Expression._resolve_output_field() - combined_type = _resolve_combined_type( - self.connector, - type(self.lhs._output_field_or_none), - type(self.rhs._output_field_or_none), - ) - if combined_type is None: - raise FieldError( - f"Cannot infer type of {self.connector!r} expression involving these " - f"types: {self.lhs.output_field.__class__.__name__}, " - f"{self.rhs.output_field.__class__.__name__}. You must set " - f"output_field." - ) - return combined_type() - - def as_sql(self, compiler, connection): - expressions = [] - expression_params = [] - sql, params = compiler.compile(self.lhs) - expressions.append(sql) - expression_params.extend(params) - sql, params = compiler.compile(self.rhs) - expressions.append(sql) - expression_params.extend(params) - # order of precedence - expression_wrapper = "(%s)" - sql = connection.ops.combine_expression(self.connector, expressions) - return expression_wrapper % sql, expression_params - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - resolved = super().resolve_expression( - query, - allow_joins, - reuse, - summarize, - for_save, - ) - if not isinstance(self, (DurationExpression, TemporalSubtraction)): - try: - lhs_type = resolved.lhs.output_field.get_internal_type() - except (AttributeError, FieldError): - lhs_type = None - try: - rhs_type = resolved.rhs.output_field.get_internal_type() - except (AttributeError, FieldError): - rhs_type = None - if "DurationField" in {lhs_type, rhs_type} and lhs_type != rhs_type: - return DurationExpression( - resolved.lhs, resolved.connector, resolved.rhs - ) - datetime_fields = {"DateField", "DateTimeField", "TimeField"} - if ( - self.connector == self.SUB - and lhs_type in datetime_fields - and lhs_type == rhs_type - ): - return TemporalSubtraction(resolved.lhs, resolved.rhs) - return resolved - - @cached_property - def allowed_default(self): - return self.lhs.allowed_default and self.rhs.allowed_default - - -class DurationExpression(CombinedExpression): - def compile(self, side, compiler, connection): - try: - output = side.output_field - except FieldError: - pass - else: - if output.get_internal_type() == "DurationField": - sql, params = compiler.compile(side) - return connection.ops.format_for_duration_arithmetic(sql), params - return compiler.compile(side) - - def as_sql(self, compiler, connection): - if connection.features.has_native_duration_field: - return super().as_sql(compiler, connection) - connection.ops.check_expression_support(self) - expressions = [] - expression_params = [] - sql, params = self.compile(self.lhs, compiler, connection) - expressions.append(sql) - expression_params.extend(params) - sql, params = self.compile(self.rhs, compiler, connection) - expressions.append(sql) - expression_params.extend(params) - # order of precedence - expression_wrapper = "(%s)" - sql = connection.ops.combine_duration_expression(self.connector, expressions) - return expression_wrapper % sql, expression_params - - def as_sqlite(self, compiler, connection, **extra_context): - sql, params = self.as_sql(compiler, connection, **extra_context) - if self.connector in {Combinable.MUL, Combinable.DIV}: - try: - lhs_type = self.lhs.output_field.get_internal_type() - rhs_type = self.rhs.output_field.get_internal_type() - except (AttributeError, FieldError): - pass - else: - allowed_fields = { - "DecimalField", - "DurationField", - "FloatField", - "IntegerField", - } - if lhs_type not in allowed_fields or rhs_type not in allowed_fields: - raise DatabaseError( - f"Invalid arguments for operator {self.connector}." - ) - return sql, params - - -class TemporalSubtraction(CombinedExpression): - output_field = fields.DurationField() - - def __init__(self, lhs, rhs): - super().__init__(lhs, self.SUB, rhs) - - def as_sql(self, compiler, connection): - connection.ops.check_expression_support(self) - lhs = compiler.compile(self.lhs) - rhs = compiler.compile(self.rhs) - return connection.ops.subtract_temporals( - self.lhs.output_field.get_internal_type(), lhs, rhs - ) - - -@deconstructible(path="django.db.models.F") -class F(Combinable): - """An object capable of resolving references to existing query objects.""" - - allowed_default = False - - def __init__(self, name): - """ - Arguments: - * name: the name of the field this expression references - """ - self.name = name - - def __repr__(self): - return "{}({})".format(self.__class__.__name__, self.name) - - def __getitem__(self, subscript): - return Sliced(self, subscript) - - def __contains__(self, other): - # Disable old-style iteration protocol inherited from implementing - # __getitem__() to prevent this method from hanging. - raise TypeError(f"argument of type '{self.__class__.__name__}' is not iterable") - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - return query.resolve_ref(self.name, allow_joins, reuse, summarize) - - def replace_expressions(self, replacements): - return replacements.get(self, self) - - def asc(self, **kwargs): - return OrderBy(self, **kwargs) - - def desc(self, **kwargs): - return OrderBy(self, descending=True, **kwargs) - - def __eq__(self, other): - return self.__class__ == other.__class__ and self.name == other.name - - def __hash__(self): - return hash(self.name) - - def copy(self): - return copy.copy(self) - - -class ResolvedOuterRef(F): - """ - An object that contains a reference to an outer query. - - In this case, the reference to the outer query has been resolved because - the inner query has been used as a subquery. - """ - - contains_aggregate = False - contains_over_clause = False - - def as_sql(self, *args, **kwargs): - raise ValueError( - "This queryset contains a reference to an outer query and may " - "only be used in a subquery." - ) - - def resolve_expression(self, *args, **kwargs): - col = super().resolve_expression(*args, **kwargs) - if col.contains_over_clause: - raise NotSupportedError( - f"Referencing outer query window expression is not supported: " - f"{self.name}." - ) - # FIXME: Rename possibly_multivalued to multivalued and fix detection - # for non-multivalued JOINs (e.g. foreign key fields). This should take - # into account only many-to-many and one-to-many relationships. - col.possibly_multivalued = LOOKUP_SEP in self.name - return col - - def relabeled_clone(self, relabels): - return self - - def get_group_by_cols(self): - return [] - - -class OuterRef(F): - contains_aggregate = False - contains_over_clause = False - - def resolve_expression(self, *args, **kwargs): - if isinstance(self.name, self.__class__): - return self.name - return ResolvedOuterRef(self.name) - - def relabeled_clone(self, relabels): - return self - - -class Sliced(F): - """ - An object that contains a slice of an F expression. - - Object resolves the column on which the slicing is applied, and then - applies the slicing if possible. - """ - - def __init__(self, obj, subscript): - super().__init__(obj.name) - self.obj = obj - if isinstance(subscript, int): - if subscript < 0: - raise ValueError("Negative indexing is not supported.") - self.start = subscript + 1 - self.length = 1 - elif isinstance(subscript, slice): - if (subscript.start is not None and subscript.start < 0) or ( - subscript.stop is not None and subscript.stop < 0 - ): - raise ValueError("Negative indexing is not supported.") - if subscript.step is not None: - raise ValueError("Step argument is not supported.") - if subscript.stop and subscript.start and subscript.stop < subscript.start: - raise ValueError("Slice stop must be greater than slice start.") - self.start = 1 if subscript.start is None else subscript.start + 1 - if subscript.stop is None: - self.length = None - else: - self.length = subscript.stop - (subscript.start or 0) - else: - raise TypeError("Argument to slice must be either int or slice instance.") - - def __repr__(self): - start = self.start - 1 - stop = None if self.length is None else start + self.length - subscript = slice(start, stop) - return f"{self.__class__.__qualname__}({self.obj!r}, {subscript!r})" - - def resolve_expression( - self, - query=None, - allow_joins=True, - reuse=None, - summarize=False, - for_save=False, - ): - resolved = query.resolve_ref(self.name, allow_joins, reuse, summarize) - if isinstance(self.obj, (OuterRef, self.__class__)): - expr = self.obj.resolve_expression( - query, allow_joins, reuse, summarize, for_save - ) - else: - expr = resolved - return resolved.output_field.slice_expression(expr, self.start, self.length) - - -@deconstructible(path="django.db.models.Func") -class Func(SQLiteNumericMixin, Expression): - """An SQL function call.""" - - function = None - template = "%(function)s(%(expressions)s)" - arg_joiner = ", " - arity = None # The number of arguments the function accepts. - - def __init__(self, *expressions, output_field=None, **extra): - if self.arity is not None and len(expressions) != self.arity: - raise TypeError( - "'%s' takes exactly %s %s (%s given)" - % ( - self.__class__.__name__, - self.arity, - "argument" if self.arity == 1 else "arguments", - len(expressions), - ) - ) - super().__init__(output_field=output_field) - self.source_expressions = self._parse_expressions(*expressions) - self.extra = extra - - def __repr__(self): - args = self.arg_joiner.join(str(arg) for arg in self.source_expressions) - extra = {**self.extra, **self._get_repr_options()} - if extra: - extra = ", ".join( - str(key) + "=" + str(val) for key, val in sorted(extra.items()) - ) - return "{}({}, {})".format(self.__class__.__name__, args, extra) - return "{}({})".format(self.__class__.__name__, args) - - def _get_repr_options(self): - """Return a dict of extra __init__() options to include in the repr.""" - return {} - - def get_source_expressions(self): - return self.source_expressions - - def set_source_expressions(self, exprs): - self.source_expressions = exprs - - def as_sql( - self, - compiler, - connection, - function=None, - template=None, - arg_joiner=None, - **extra_context, - ): - connection.ops.check_expression_support(self) - sql_parts = [] - params = [] - for arg in self.source_expressions: - try: - arg_sql, arg_params = compiler.compile(arg) - except EmptyResultSet: - empty_result_set_value = getattr( - arg, "empty_result_set_value", NotImplemented - ) - if empty_result_set_value is NotImplemented: - raise - arg_sql, arg_params = compiler.compile(Value(empty_result_set_value)) - except FullResultSet: - arg_sql, arg_params = compiler.compile(Value(True)) - sql_parts.append(arg_sql) - params.extend(arg_params) - data = {**self.extra, **extra_context} - # Use the first supplied value in this order: the parameter to this - # method, a value supplied in __init__()'s **extra (the value in - # `data`), or the value defined on the class. - if function is not None: - data["function"] = function - else: - data.setdefault("function", self.function) - template = template or data.get("template", self.template) - arg_joiner = arg_joiner or data.get("arg_joiner", self.arg_joiner) - data["expressions"] = data["field"] = arg_joiner.join(sql_parts) - return template % data, params - - def copy(self): - copy = super().copy() - copy.source_expressions = self.source_expressions[:] - copy.extra = self.extra.copy() - return copy - - @cached_property - def allowed_default(self): - return all(expression.allowed_default for expression in self.source_expressions) - - -@deconstructible(path="django.db.models.Value") -class Value(SQLiteNumericMixin, Expression): - """Represent a wrapped value as a node within an expression.""" - - # Provide a default value for `for_save` in order to allow unresolved - # instances to be compiled until a decision is taken in #25425. - for_save = False - allowed_default = True - - def __init__(self, value, output_field=None): - """ - Arguments: - * value: the value this expression represents. The value will be - added into the sql parameter list and properly quoted. - - * output_field: an instance of the model field type that this - expression will return, such as IntegerField() or CharField(). - """ - super().__init__(output_field=output_field) - self.value = value - - def __repr__(self): - return f"{self.__class__.__name__}({self.value!r})" - - def as_sql(self, compiler, connection): - connection.ops.check_expression_support(self) - val = self.value - output_field = self._output_field_or_none - if output_field is not None: - if self.for_save: - val = output_field.get_db_prep_save(val, connection=connection) - else: - val = output_field.get_db_prep_value(val, connection=connection) - if hasattr(output_field, "get_placeholder"): - return output_field.get_placeholder(val, compiler, connection), [val] - if val is None: - # oracledb does not always convert None to the appropriate - # NULL type (like in case expressions using numbers), so we - # use a literal SQL NULL - return "NULL", [] - return "%s", [val] - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - c = super().resolve_expression(query, allow_joins, reuse, summarize, for_save) - c.for_save = for_save - return c - - def get_group_by_cols(self): - return [] - - def _resolve_output_field(self): - if isinstance(self.value, str): - return fields.CharField() - if isinstance(self.value, bool): - return fields.BooleanField() - if isinstance(self.value, int): - return fields.IntegerField() - if isinstance(self.value, float): - return fields.FloatField() - if isinstance(self.value, datetime.datetime): - return fields.DateTimeField() - if isinstance(self.value, datetime.date): - return fields.DateField() - if isinstance(self.value, datetime.time): - return fields.TimeField() - if isinstance(self.value, datetime.timedelta): - return fields.DurationField() - if isinstance(self.value, Decimal): - return fields.DecimalField() - if isinstance(self.value, bytes): - return fields.BinaryField() - if isinstance(self.value, UUID): - return fields.UUIDField() - - @property - def empty_result_set_value(self): - return self.value - - -class RawSQL(Expression): - allowed_default = True - - def __init__(self, sql, params, output_field=None): - if output_field is None: - output_field = fields.Field() - self.sql, self.params = sql, params - super().__init__(output_field=output_field) - - def __repr__(self): - return "{}({}, {})".format(self.__class__.__name__, self.sql, self.params) - - def as_sql(self, compiler, connection): - return "(%s)" % self.sql, self.params - - def get_group_by_cols(self): - return [self] - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - # Resolve parents fields used in raw SQL. - if query.model: - for parent in query.model._meta.all_parents: - for parent_field in parent._meta.local_fields: - if parent_field.column.lower() in self.sql.lower(): - query.resolve_ref( - parent_field.name, allow_joins, reuse, summarize - ) - break - return super().resolve_expression( - query, allow_joins, reuse, summarize, for_save - ) - - -class Star(Expression): - def __repr__(self): - return "'*'" - - def as_sql(self, compiler, connection): - return "*", [] - - -class DatabaseDefault(Expression): - """ - Expression to use DEFAULT keyword during insert otherwise the underlying expression. - """ - - def __init__(self, expression, output_field=None): - super().__init__(output_field) - self.expression = expression - - def get_source_expressions(self): - return [self.expression] - - def set_source_expressions(self, exprs): - (self.expression,) = exprs - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - resolved_expression = self.expression.resolve_expression( - query=query, - allow_joins=allow_joins, - reuse=reuse, - summarize=summarize, - for_save=for_save, - ) - # Defaults used outside an INSERT context should resolve to their - # underlying expression. - if not for_save: - return resolved_expression - return DatabaseDefault( - resolved_expression, output_field=self._output_field_or_none - ) - - def as_sql(self, compiler, connection): - if not connection.features.supports_default_keyword_in_insert: - return compiler.compile(self.expression) - return "DEFAULT", [] - - -class Col(Expression): - contains_column_references = True - possibly_multivalued = False - - def __init__(self, alias, target, output_field=None): - if output_field is None: - output_field = target - super().__init__(output_field=output_field) - self.alias, self.target = alias, target - - def __repr__(self): - alias, target = self.alias, self.target - identifiers = (alias, str(target)) if alias else (str(target),) - return "{}({})".format(self.__class__.__name__, ", ".join(identifiers)) - - def as_sql(self, compiler, connection): - alias, column = self.alias, self.target.column - identifiers = (alias, column) if alias else (column,) - sql = ".".join(map(compiler.quote_name_unless_alias, identifiers)) - return sql, [] - - def relabeled_clone(self, relabels): - if self.alias is None: - return self - return self.__class__( - relabels.get(self.alias, self.alias), self.target, self.output_field - ) - - def get_group_by_cols(self): - return [self] - - def get_db_converters(self, connection): - if self.target == self.output_field: - return self.output_field.get_db_converters(connection) - return self.output_field.get_db_converters( - connection - ) + self.target.get_db_converters(connection) - - -class ColPairs(Expression): - def __init__(self, alias, targets, sources, output_field): - super().__init__(output_field=output_field) - self.alias = alias - self.targets = targets - self.sources = sources - - def __len__(self): - return len(self.targets) - - def __iter__(self): - return iter(self.get_cols()) - - def __repr__(self): - return ( - f"{self.__class__.__name__}({self.alias!r}, {self.targets!r}, " - f"{self.sources!r}, {self.output_field!r})" - ) - - def get_cols(self): - return [ - Col(self.alias, target, source) - for target, source in zip(self.targets, self.sources) - ] - - def get_source_expressions(self): - return self.get_cols() - - def set_source_expressions(self, exprs): - assert all(isinstance(expr, Col) and expr.alias == self.alias for expr in exprs) - self.targets = [col.target for col in exprs] - self.sources = [col.field for col in exprs] - - def as_sql(self, compiler, connection): - cols_sql = [] - cols_params = [] - cols = self.get_cols() - - for col in cols: - sql, params = col.as_sql(compiler, connection) - cols_sql.append(sql) - cols_params.extend(params) - - return ", ".join(cols_sql), cols_params - - def relabeled_clone(self, relabels): - return self.__class__( - relabels.get(self.alias, self.alias), self.targets, self.sources, self.field - ) - - def resolve_expression(self, *args, **kwargs): - return self - - def select_format(self, compiler, sql, params): - return sql, params - - -class Ref(Expression): - """ - Reference to column alias of the query. For example, Ref('sum_cost') in - qs.annotate(sum_cost=Sum('cost')) query. - """ - - def __init__(self, refs, source): - super().__init__() - self.refs, self.source = refs, source - - def __repr__(self): - return "{}({}, {})".format(self.__class__.__name__, self.refs, self.source) - - def get_source_expressions(self): - return [self.source] - - def set_source_expressions(self, exprs): - (self.source,) = exprs - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - # The sub-expression `source` has already been resolved, as this is - # just a reference to the name of `source`. - return self - - def get_refs(self): - return {self.refs} - - def relabeled_clone(self, relabels): - clone = self.copy() - clone.source = self.source.relabeled_clone(relabels) - return clone - - def as_sql(self, compiler, connection): - return connection.ops.quote_name(self.refs), [] - - def get_group_by_cols(self): - return [self] - - -class ExpressionList(Func): - """ - An expression containing multiple expressions. Can be used to provide a - list of expressions as an argument to another expression, like a partition - clause. - """ - - template = "%(expressions)s" - - def __str__(self): - return self.arg_joiner.join(str(arg) for arg in self.source_expressions) - - def as_sql(self, *args, **kwargs): - if not self.source_expressions: - return "", () - return super().as_sql(*args, **kwargs) - - def as_sqlite(self, compiler, connection, **extra_context): - # Casting to numeric is unnecessary. - return self.as_sql(compiler, connection, **extra_context) - - def get_group_by_cols(self): - group_by_cols = [] - for expr in self.get_source_expressions(): - group_by_cols.extend(expr.get_group_by_cols()) - return group_by_cols - - -class OrderByList(ExpressionList): - allowed_default = False - template = "ORDER BY %(expressions)s" - - def __init__(self, *expressions, **extra): - expressions = ( - ( - OrderBy(F(expr[1:]), descending=True) - if isinstance(expr, str) and expr[0] == "-" - else expr - ) - for expr in expressions - ) - super().__init__(*expressions, **extra) - - -@deconstructible(path="django.db.models.ExpressionWrapper") -class ExpressionWrapper(SQLiteNumericMixin, Expression): - """ - An expression that can wrap another expression so that it can provide - extra context to the inner expression, such as the output_field. - """ - - def __init__(self, expression, output_field): - super().__init__(output_field=output_field) - self.expression = expression - - def set_source_expressions(self, exprs): - self.expression = exprs[0] - - def get_source_expressions(self): - return [self.expression] - - def get_group_by_cols(self): - if isinstance(self.expression, Expression): - expression = self.expression.copy() - expression.output_field = self.output_field - return expression.get_group_by_cols() - # For non-expressions e.g. an SQL WHERE clause, the entire - # `expression` must be included in the GROUP BY clause. - return super().get_group_by_cols() - - def as_sql(self, compiler, connection): - return compiler.compile(self.expression) - - def __repr__(self): - return "{}({})".format(self.__class__.__name__, self.expression) - - @property - def allowed_default(self): - return self.expression.allowed_default - - -class NegatedExpression(ExpressionWrapper): - """The logical negation of a conditional expression.""" - - def __init__(self, expression): - super().__init__(expression, output_field=fields.BooleanField()) - - def __invert__(self): - return self.expression.copy() - - def as_sql(self, compiler, connection): - try: - sql, params = super().as_sql(compiler, connection) - except EmptyResultSet: - features = compiler.connection.features - if not features.supports_boolean_expr_in_select_clause: - return "1=1", () - return compiler.compile(Value(True)) - ops = compiler.connection.ops - # Some database backends (e.g. Oracle) don't allow EXISTS() and filters - # to be compared to another expression unless they're wrapped in a CASE - # WHEN. - if not ops.conditional_expression_supported_in_where_clause(self.expression): - return f"CASE WHEN {sql} = 0 THEN 1 ELSE 0 END", params - return f"NOT {sql}", params - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - resolved = super().resolve_expression( - query, allow_joins, reuse, summarize, for_save - ) - if not getattr(resolved.expression, "conditional", False): - raise TypeError("Cannot negate non-conditional expressions.") - return resolved - - def select_format(self, compiler, sql, params): - # Wrap boolean expressions with a CASE WHEN expression if a database - # backend (e.g. Oracle) doesn't support boolean expression in SELECT or - # GROUP BY list. - expression_supported_in_where_clause = ( - compiler.connection.ops.conditional_expression_supported_in_where_clause - ) - if ( - not compiler.connection.features.supports_boolean_expr_in_select_clause - # Avoid double wrapping. - and expression_supported_in_where_clause(self.expression) - ): - sql = "CASE WHEN {} THEN 1 ELSE 0 END".format(sql) - return sql, params - - -@deconstructible(path="django.db.models.When") -class When(Expression): - template = "WHEN %(condition)s THEN %(result)s" - # This isn't a complete conditional expression, must be used in Case(). - conditional = False - - def __init__(self, condition=None, then=None, **lookups): - if lookups: - if condition is None: - condition, lookups = Q(**lookups), None - elif getattr(condition, "conditional", False): - condition, lookups = Q(condition, **lookups), None - if condition is None or not getattr(condition, "conditional", False) or lookups: - raise TypeError( - "When() supports a Q object, a boolean expression, or lookups " - "as a condition." - ) - if isinstance(condition, Q) and not condition: - raise ValueError("An empty Q() can't be used as a When() condition.") - super().__init__(output_field=None) - self.condition = condition - self.result = self._parse_expressions(then)[0] - - def __str__(self): - return "WHEN %r THEN %r" % (self.condition, self.result) - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self) - - def get_source_expressions(self): - return [self.condition, self.result] - - def set_source_expressions(self, exprs): - self.condition, self.result = exprs - - def get_source_fields(self): - # We're only interested in the fields of the result expressions. - return [self.result._output_field_or_none] - - def as_sql(self, compiler, connection, template=None, **extra_context): - connection.ops.check_expression_support(self) - template_params = extra_context - sql_params = [] - condition_sql, condition_params = compiler.compile(self.condition) - template_params["condition"] = condition_sql - result_sql, result_params = compiler.compile(self.result) - template_params["result"] = result_sql - template = template or self.template - return template % template_params, ( - *sql_params, - *condition_params, - *result_params, - ) - - def get_group_by_cols(self): - # This is not a complete expression and cannot be used in GROUP BY. - cols = [] - for source in self.get_source_expressions(): - cols.extend(source.get_group_by_cols()) - return cols - - @cached_property - def allowed_default(self): - return self.condition.allowed_default and self.result.allowed_default - - -@deconstructible(path="django.db.models.Case") -class Case(SQLiteNumericMixin, Expression): - """ - An SQL searched CASE expression: - - CASE - WHEN n > 0 - THEN 'positive' - WHEN n < 0 - THEN 'negative' - ELSE 'zero' - END - """ - - template = "CASE %(cases)s ELSE %(default)s END" - case_joiner = " " - - def __init__(self, *cases, default=None, output_field=None, **extra): - if not all(isinstance(case, When) for case in cases): - raise TypeError("Positional arguments must all be When objects.") - super().__init__(output_field) - self.cases = list(cases) - self.default = self._parse_expressions(default)[0] - self.extra = extra - - def __str__(self): - return "CASE %s, ELSE %r" % ( - ", ".join(str(c) for c in self.cases), - self.default, - ) - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self) - - def get_source_expressions(self): - return self.cases + [self.default] - - def set_source_expressions(self, exprs): - *self.cases, self.default = exprs - - def copy(self): - c = super().copy() - c.cases = c.cases[:] - return c - - def as_sql( - self, compiler, connection, template=None, case_joiner=None, **extra_context - ): - connection.ops.check_expression_support(self) - if not self.cases: - return compiler.compile(self.default) - template_params = {**self.extra, **extra_context} - case_parts = [] - sql_params = [] - for case in self.cases: - try: - case_sql, case_params = compiler.compile(case) - except EmptyResultSet: - continue - except FullResultSet: - default_sql, default_params = compiler.compile(case.result) - break - case_parts.append(case_sql) - sql_params.extend(case_params) - else: - default_sql, default_params = compiler.compile(self.default) - if not case_parts: - return default_sql, default_params - case_joiner = case_joiner or self.case_joiner - template_params["cases"] = case_joiner.join(case_parts) - template_params["default"] = default_sql - sql_params.extend(default_params) - template = template or template_params.get("template", self.template) - sql = template % template_params - if self._output_field_or_none is not None: - sql = connection.ops.unification_cast_sql(self.output_field) % sql - return sql, sql_params - - def get_group_by_cols(self): - if not self.cases: - return self.default.get_group_by_cols() - return super().get_group_by_cols() - - @cached_property - def allowed_default(self): - return self.default.allowed_default and all( - case_.allowed_default for case_ in self.cases - ) - - -class Subquery(BaseExpression, Combinable): - """ - An explicit subquery. It may contain OuterRef() references to the outer - query which will be resolved when it is applied to that query. - """ - - template = "(%(subquery)s)" - contains_aggregate = False - empty_result_set_value = None - subquery = True - - def __init__(self, queryset, output_field=None, **extra): - # Allow the usage of both QuerySet and sql.Query objects. - self.query = getattr(queryset, "query", queryset).clone() - self.query.subquery = True - self.extra = extra - super().__init__(output_field) - - def get_source_expressions(self): - return [self.query] - - def set_source_expressions(self, exprs): - self.query = exprs[0] - - def _resolve_output_field(self): - return self.query.output_field - - def copy(self): - clone = super().copy() - clone.query = clone.query.clone() - return clone - - @property - def external_aliases(self): - return self.query.external_aliases - - def get_external_cols(self): - return self.query.get_external_cols() - - def as_sql(self, compiler, connection, template=None, **extra_context): - connection.ops.check_expression_support(self) - template_params = {**self.extra, **extra_context} - subquery_sql, sql_params = self.query.as_sql(compiler, connection) - template_params["subquery"] = subquery_sql[1:-1] - - template = template or template_params.get("template", self.template) - sql = template % template_params - return sql, sql_params - - def get_group_by_cols(self): - return self.query.get_group_by_cols(wrapper=self) - - -class Exists(Subquery): - template = "EXISTS(%(subquery)s)" - output_field = fields.BooleanField() - empty_result_set_value = False - - def __init__(self, queryset, **kwargs): - super().__init__(queryset, **kwargs) - self.query = self.query.exists() - - def select_format(self, compiler, sql, params): - # Wrap EXISTS() with a CASE WHEN expression if a database backend - # (e.g. Oracle) doesn't support boolean expression in SELECT or GROUP - # BY list. - if not compiler.connection.features.supports_boolean_expr_in_select_clause: - sql = "CASE WHEN {} THEN 1 ELSE 0 END".format(sql) - return sql, params - - def as_sql(self, compiler, *args, **kwargs): - try: - return super().as_sql(compiler, *args, **kwargs) - except EmptyResultSet: - features = compiler.connection.features - if not features.supports_boolean_expr_in_select_clause: - return "1=0", () - return compiler.compile(Value(False)) - - -@deconstructible(path="django.db.models.OrderBy") -class OrderBy(Expression): - template = "%(expression)s %(ordering)s" - conditional = False - constraint_validation_compatible = False - allows_composite_expressions = True - - def __init__(self, expression, descending=False, nulls_first=None, nulls_last=None): - if nulls_first and nulls_last: - raise ValueError("nulls_first and nulls_last are mutually exclusive") - if nulls_first is False or nulls_last is False: - raise ValueError("nulls_first and nulls_last values must be True or None.") - self.nulls_first = nulls_first - self.nulls_last = nulls_last - self.descending = descending - if not hasattr(expression, "resolve_expression"): - raise ValueError("expression must be an expression type") - self.expression = expression - - def __repr__(self): - return "{}({}, descending={})".format( - self.__class__.__name__, self.expression, self.descending - ) - - def set_source_expressions(self, exprs): - self.expression = exprs[0] - - def get_source_expressions(self): - return [self.expression] - - def as_sql(self, compiler, connection, template=None, **extra_context): - if isinstance(self.expression, ColPairs): - sql_parts = [] - params = [] - for col in self.expression.get_cols(): - copy = self.copy() - copy.set_source_expressions([col]) - sql, col_params = compiler.compile(copy) - sql_parts.append(sql) - params.extend(col_params) - return ", ".join(sql_parts), params - template = template or self.template - if connection.features.supports_order_by_nulls_modifier: - if self.nulls_last: - template = "%s NULLS LAST" % template - elif self.nulls_first: - template = "%s NULLS FIRST" % template - else: - if self.nulls_last and not ( - self.descending and connection.features.order_by_nulls_first - ): - template = "%%(expression)s IS NULL, %s" % template - elif self.nulls_first and not ( - not self.descending and connection.features.order_by_nulls_first - ): - template = "%%(expression)s IS NOT NULL, %s" % template - connection.ops.check_expression_support(self) - expression_sql, params = compiler.compile(self.expression) - placeholders = { - "expression": expression_sql, - "ordering": "DESC" if self.descending else "ASC", - **extra_context, - } - params *= template.count("%(expression)s") - return (template % placeholders).rstrip(), params - - def as_oracle(self, compiler, connection): - # Oracle < 23c doesn't allow ORDER BY EXISTS() or filters unless it's - # wrapped in a CASE WHEN. - if ( - not connection.features.supports_boolean_expr_in_select_clause - and connection.ops.conditional_expression_supported_in_where_clause( - self.expression - ) - ): - copy = self.copy() - copy.expression = Case( - When(self.expression, then=True), - default=False, - ) - return copy.as_sql(compiler, connection) - return self.as_sql(compiler, connection) - - def get_group_by_cols(self): - cols = [] - for source in self.get_source_expressions(): - cols.extend(source.get_group_by_cols()) - return cols - - def reverse_ordering(self): - self.descending = not self.descending - if self.nulls_first: - self.nulls_last = True - self.nulls_first = None - elif self.nulls_last: - self.nulls_first = True - self.nulls_last = None - return self - - def asc(self): - self.descending = False - - def desc(self): - self.descending = True - - -class Window(SQLiteNumericMixin, Expression): - template = "%(expression)s OVER (%(window)s)" - # Although the main expression may either be an aggregate or an - # expression with an aggregate function, the GROUP BY that will - # be introduced in the query as a result is not desired. - contains_aggregate = False - contains_over_clause = True - - def __init__( - self, - expression, - partition_by=None, - order_by=None, - frame=None, - output_field=None, - ): - self.partition_by = partition_by - self.order_by = order_by - self.frame = frame - - if not getattr(expression, "window_compatible", False): - raise ValueError( - "Expression '%s' isn't compatible with OVER clauses." - % expression.__class__.__name__ - ) - - if self.partition_by is not None: - if not isinstance(self.partition_by, (tuple, list)): - self.partition_by = (self.partition_by,) - self.partition_by = ExpressionList(*self.partition_by) - - if self.order_by is not None: - if isinstance(self.order_by, (list, tuple)): - self.order_by = OrderByList(*self.order_by) - elif isinstance(self.order_by, (BaseExpression, str)): - self.order_by = OrderByList(self.order_by) - else: - raise ValueError( - "Window.order_by must be either a string reference to a " - "field, an expression, or a list or tuple of them." - ) - super().__init__(output_field=output_field) - self.source_expression = self._parse_expressions(expression)[0] - - def _resolve_output_field(self): - return self.source_expression.output_field - - def get_source_expressions(self): - return [self.source_expression, self.partition_by, self.order_by, self.frame] - - def set_source_expressions(self, exprs): - self.source_expression, self.partition_by, self.order_by, self.frame = exprs - - def as_sql(self, compiler, connection, template=None): - connection.ops.check_expression_support(self) - if not connection.features.supports_over_clause: - raise NotSupportedError("This backend does not support window expressions.") - expr_sql, params = compiler.compile(self.source_expression) - window_sql, window_params = [], () - - if self.partition_by is not None: - sql_expr, sql_params = self.partition_by.as_sql( - compiler=compiler, - connection=connection, - template="PARTITION BY %(expressions)s", - ) - window_sql.append(sql_expr) - window_params += tuple(sql_params) - - if self.order_by is not None: - order_sql, order_params = compiler.compile(self.order_by) - window_sql.append(order_sql) - window_params += tuple(order_params) - - if self.frame: - frame_sql, frame_params = compiler.compile(self.frame) - window_sql.append(frame_sql) - window_params += tuple(frame_params) - - template = template or self.template - - return ( - template % {"expression": expr_sql, "window": " ".join(window_sql).strip()}, - (*params, *window_params), - ) - - def as_sqlite(self, compiler, connection): - if isinstance(self.output_field, fields.DecimalField): - # Casting to numeric must be outside of the window expression. - copy = self.copy() - source_expressions = copy.get_source_expressions() - source_expressions[0].output_field = fields.FloatField() - copy.set_source_expressions(source_expressions) - return super(Window, copy).as_sqlite(compiler, connection) - return self.as_sql(compiler, connection) - - def __str__(self): - return "{} OVER ({}{}{})".format( - str(self.source_expression), - "PARTITION BY " + str(self.partition_by) if self.partition_by else "", - str(self.order_by or ""), - str(self.frame or ""), - ) - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self) - - def get_group_by_cols(self): - group_by_cols = [] - if self.partition_by: - group_by_cols.extend(self.partition_by.get_group_by_cols()) - if self.order_by is not None: - group_by_cols.extend(self.order_by.get_group_by_cols()) - return group_by_cols - - -class WindowFrameExclusion(Enum): - CURRENT_ROW = "CURRENT ROW" - GROUP = "GROUP" - TIES = "TIES" - NO_OTHERS = "NO OTHERS" - - def __repr__(self): - return f"{self.__class__.__qualname__}.{self._name_}" - - -class WindowFrame(Expression): - """ - Model the frame clause in window expressions. There are two types of frame - clauses which are subclasses, however, all processing and validation (by no - means intended to be complete) is done here. Thus, providing an end for a - frame is optional (the default is UNBOUNDED FOLLOWING, which is the last - row in the frame). - """ - - template = "%(frame_type)s BETWEEN %(start)s AND %(end)s%(exclude)s" - - def __init__(self, start=None, end=None, exclusion=None): - self.start = Value(start) - self.end = Value(end) - if not isinstance(exclusion, (NoneType, WindowFrameExclusion)): - raise TypeError( - f"{self.__class__.__qualname__}.exclusion must be a " - "WindowFrameExclusion instance." - ) - self.exclusion = exclusion - - def set_source_expressions(self, exprs): - self.start, self.end = exprs - - def get_source_expressions(self): - return [self.start, self.end] - - def get_exclusion(self): - if self.exclusion is None: - return "" - return f" EXCLUDE {self.exclusion.value}" - - def as_sql(self, compiler, connection): - connection.ops.check_expression_support(self) - start, end = self.window_frame_start_end( - connection, self.start.value, self.end.value - ) - if self.exclusion and not connection.features.supports_frame_exclusion: - raise NotSupportedError( - "This backend does not support window frame exclusions." - ) - return ( - self.template - % { - "frame_type": self.frame_type, - "start": start, - "end": end, - "exclude": self.get_exclusion(), - }, - [], - ) - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self) - - def get_group_by_cols(self): - return [] - - def __str__(self): - if self.start.value is not None and self.start.value < 0: - start = "%d %s" % (abs(self.start.value), connection.ops.PRECEDING) - elif self.start.value is not None and self.start.value == 0: - start = connection.ops.CURRENT_ROW - elif self.start.value is not None and self.start.value > 0: - start = "%d %s" % (self.start.value, connection.ops.FOLLOWING) - else: - start = connection.ops.UNBOUNDED_PRECEDING - - if self.end.value is not None and self.end.value > 0: - end = "%d %s" % (self.end.value, connection.ops.FOLLOWING) - elif self.end.value is not None and self.end.value == 0: - end = connection.ops.CURRENT_ROW - elif self.end.value is not None and self.end.value < 0: - end = "%d %s" % (abs(self.end.value), connection.ops.PRECEDING) - else: - end = connection.ops.UNBOUNDED_FOLLOWING - return self.template % { - "frame_type": self.frame_type, - "start": start, - "end": end, - "exclude": self.get_exclusion(), - } - - def window_frame_start_end(self, connection, start, end): - raise NotImplementedError("Subclasses must implement window_frame_start_end().") - - -class RowRange(WindowFrame): - frame_type = "ROWS" - - def window_frame_start_end(self, connection, start, end): - return connection.ops.window_frame_rows_start_end(start, end) - - -class ValueRange(WindowFrame): - frame_type = "RANGE" - - def window_frame_start_end(self, connection, start, end): - return connection.ops.window_frame_range_start_end(start, end) diff --git a/.venv/lib/python3.10/site-packages/django/db/models/fields/__init__.py b/.venv/lib/python3.10/site-packages/django/db/models/fields/__init__.py deleted file mode 100644 index 66d7962..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/fields/__init__.py +++ /dev/null @@ -1,2890 +0,0 @@ -import copy -import datetime -import decimal -import operator -import uuid -import warnings -from base64 import b64decode, b64encode -from collections.abc import Iterable -from functools import partialmethod, total_ordering - -from django import forms -from django.apps import apps -from django.conf import settings -from django.core import checks, exceptions, validators -from django.db import connection, connections, router -from django.db.models.constants import LOOKUP_SEP -from django.db.models.query_utils import DeferredAttribute, RegisterLookupMixin -from django.db.utils import NotSupportedError -from django.utils import timezone -from django.utils.choices import ( - BlankChoiceIterator, - CallableChoiceIterator, - flatten_choices, - normalize_choices, -) -from django.utils.datastructures import DictWrapper -from django.utils.dateparse import ( - parse_date, - parse_datetime, - parse_duration, - parse_time, -) -from django.utils.duration import duration_microseconds, duration_string -from django.utils.functional import Promise, cached_property -from django.utils.ipv6 import MAX_IPV6_ADDRESS_LENGTH, clean_ipv6_address -from django.utils.text import capfirst -from django.utils.translation import gettext_lazy as _ - -__all__ = [ - "AutoField", - "BLANK_CHOICE_DASH", - "BigAutoField", - "BigIntegerField", - "BinaryField", - "BooleanField", - "CharField", - "CommaSeparatedIntegerField", - "DateField", - "DateTimeField", - "DecimalField", - "DurationField", - "EmailField", - "Empty", - "Field", - "FilePathField", - "FloatField", - "GenericIPAddressField", - "IPAddressField", - "IntegerField", - "NOT_PROVIDED", - "NullBooleanField", - "PositiveBigIntegerField", - "PositiveIntegerField", - "PositiveSmallIntegerField", - "SlugField", - "SmallAutoField", - "SmallIntegerField", - "TextField", - "TimeField", - "URLField", - "UUIDField", -] - - -class Empty: - pass - - -class NOT_PROVIDED: - pass - - -# The values to use for "blank" in SelectFields. Will be appended to the start -# of most "choices" lists. -BLANK_CHOICE_DASH = [("", "---------")] - - -def _load_field(app_label, model_name, field_name): - return apps.get_model(app_label, model_name)._meta.get_field(field_name) - - -# A guide to Field parameters: -# -# * name: The name of the field specified in the model. -# * attname: The attribute to use on the model object. This is the same as -# "name", except in the case of ForeignKeys, where "_id" is -# appended. -# * db_column: The db_column specified in the model (or None). -# * column: The database column for this field. This is the same as -# "attname", except if db_column is specified. -# -# Code that introspects values, or does other dynamic things, should use -# attname. For example, this gets the primary key value of object "obj": -# -# getattr(obj, opts.pk.attname) - - -def _empty(of_cls): - new = Empty() - new.__class__ = of_cls - return new - - -def return_None(): - return None - - -@total_ordering -class Field(RegisterLookupMixin): - """Base class for all field types""" - - # Designates whether empty strings fundamentally are allowed at the - # database level. - empty_strings_allowed = True - empty_values = list(validators.EMPTY_VALUES) - - # These track each time a Field instance is created. Used to retain order. - # The auto_creation_counter is used for fields that Django implicitly - # creates, creation_counter is used for all user-specified fields. - creation_counter = 0 - auto_creation_counter = -1 - default_validators = [] # Default set of validators - default_error_messages = { - "invalid_choice": _("Value %(value)r is not a valid choice."), - "null": _("This field cannot be null."), - "blank": _("This field cannot be blank."), - "unique": _("%(model_name)s with this %(field_label)s already exists."), - "unique_for_date": _( - # Translators: The 'lookup_type' is one of 'date', 'year' or - # 'month'. Eg: "Title must be unique for pub_date year" - "%(field_label)s must be unique for " - "%(date_field_label)s %(lookup_type)s." - ), - } - system_check_deprecated_details = None - system_check_removed_details = None - - # Attributes that don't affect a column definition. - # These attributes are ignored when altering the field. - non_db_attrs = ( - "blank", - "choices", - "db_column", - "editable", - "error_messages", - "help_text", - "limit_choices_to", - # Database-level options are not supported, see #21961. - "on_delete", - "related_name", - "related_query_name", - "validators", - "verbose_name", - ) - - # Field flags - hidden = False - - many_to_many = None - many_to_one = None - one_to_many = None - one_to_one = None - related_model = None - generated = False - - descriptor_class = DeferredAttribute - - # Generic field type description, usually overridden by subclasses - def _description(self): - return _("Field of type: %(field_type)s") % { - "field_type": self.__class__.__name__ - } - - description = property(_description) - - def __init__( - self, - verbose_name=None, - name=None, - primary_key=False, - max_length=None, - unique=False, - blank=False, - null=False, - db_index=False, - rel=None, - default=NOT_PROVIDED, - editable=True, - serialize=True, - unique_for_date=None, - unique_for_month=None, - unique_for_year=None, - choices=None, - help_text="", - db_column=None, - db_tablespace=None, - auto_created=False, - validators=(), - error_messages=None, - db_comment=None, - db_default=NOT_PROVIDED, - ): - self.name = name - self.verbose_name = verbose_name # May be set by set_attributes_from_name - self._verbose_name = verbose_name # Store original for deconstruction - self.primary_key = primary_key - self.max_length, self._unique = max_length, unique - self.blank, self.null = blank, null - self.remote_field = rel - self.is_relation = self.remote_field is not None - self.default = default - self.db_default = db_default - self.editable = editable - self.serialize = serialize - self.unique_for_date = unique_for_date - self.unique_for_month = unique_for_month - self.unique_for_year = unique_for_year - self.choices = choices - self.help_text = help_text - self.db_index = db_index - self.db_column = db_column - self.db_comment = db_comment - self._db_tablespace = db_tablespace - self.auto_created = auto_created - - # Adjust the appropriate creation counter, and save our local copy. - if auto_created: - self.creation_counter = Field.auto_creation_counter - Field.auto_creation_counter -= 1 - else: - self.creation_counter = Field.creation_counter - Field.creation_counter += 1 - - self._validators = list(validators) # Store for deconstruction later - - self._error_messages = error_messages # Store for deconstruction later - - def __str__(self): - """ - Return "app_label.model_label.field_name" for fields attached to - models. - """ - if not hasattr(self, "model"): - return super().__str__() - model = self.model - return "%s.%s" % (model._meta.label, self.name) - - def __repr__(self): - """Display the module, class, and name of the field.""" - path = "%s.%s" % (self.__class__.__module__, self.__class__.__qualname__) - name = getattr(self, "name", None) - if name is not None: - return "<%s: %s>" % (path, name) - return "<%s>" % path - - def check(self, **kwargs): - return [ - *self._check_field_name(), - *self._check_choices(), - *self._check_db_default(**kwargs), - *self._check_db_index(), - *self._check_db_comment(**kwargs), - *self._check_null_allowed_for_primary_keys(), - *self._check_backend_specific_checks(**kwargs), - *self._check_validators(), - *self._check_deprecation_details(), - ] - - def _check_field_name(self): - """ - Check if field name is valid, i.e. 1) does not end with an - underscore, 2) does not contain "__" and 3) is not "pk". - """ - if self.name is None: - return [] - if self.name.endswith("_"): - return [ - checks.Error( - "Field names must not end with an underscore.", - obj=self, - id="fields.E001", - ) - ] - elif LOOKUP_SEP in self.name: - return [ - checks.Error( - 'Field names must not contain "%s".' % LOOKUP_SEP, - obj=self, - id="fields.E002", - ) - ] - elif self.name == "pk": - return [ - checks.Error( - "'pk' is a reserved word that cannot be used as a field name.", - obj=self, - id="fields.E003", - ) - ] - else: - return [] - - @classmethod - def _choices_is_value(cls, value): - return isinstance(value, (str, Promise)) or not isinstance(value, Iterable) - - def _check_choices(self): - if not self.choices: - return [] - - if not isinstance(self.choices, Iterable) or isinstance(self.choices, str): - return [ - checks.Error( - "'choices' must be a mapping (e.g. a dictionary) or an iterable " - "(e.g. a list or tuple).", - obj=self, - id="fields.E004", - ) - ] - - choice_max_length = 0 - # Expect [group_name, [value, display]] - for choices_group in self.choices: - try: - group_name, group_choices = choices_group - except (TypeError, ValueError): - # Containing non-pairs - break - try: - if not all( - self._choices_is_value(value) and self._choices_is_value(human_name) - for value, human_name in group_choices - ): - break - if self.max_length is not None and group_choices: - choice_max_length = max( - [ - choice_max_length, - *( - len(value) - for value, _ in group_choices - if isinstance(value, str) - ), - ] - ) - except (TypeError, ValueError): - # No groups, choices in the form [value, display] - value, human_name = group_name, group_choices - if not self._choices_is_value(value) or not self._choices_is_value( - human_name - ): - break - if self.max_length is not None and isinstance(value, str): - choice_max_length = max(choice_max_length, len(value)) - - # Special case: choices=['ab'] - if isinstance(choices_group, str): - break - else: - if self.max_length is not None and choice_max_length > self.max_length: - return [ - checks.Error( - "'max_length' is too small to fit the longest value " - "in 'choices' (%d characters)." % choice_max_length, - obj=self, - id="fields.E009", - ), - ] - return [] - - return [ - checks.Error( - "'choices' must be a mapping of actual values to human readable names " - "or an iterable containing (actual value, human readable name) tuples.", - obj=self, - id="fields.E005", - ) - ] - - def _check_db_default(self, databases=None, **kwargs): - from django.db.models.expressions import Value - - if ( - not self.has_db_default() - or ( - isinstance(self.db_default, Value) - or not hasattr(self.db_default, "resolve_expression") - ) - or databases is None - ): - return [] - errors = [] - for db in databases: - if not router.allow_migrate_model(db, self.model): - continue - connection = connections[db] - - if not getattr(self._db_default_expression, "allowed_default", False) and ( - connection.features.supports_expression_defaults - ): - msg = f"{self.db_default} cannot be used in db_default." - errors.append(checks.Error(msg, obj=self, id="fields.E012")) - - if not ( - connection.features.supports_expression_defaults - or "supports_expression_defaults" - in self.model._meta.required_db_features - ): - msg = ( - f"{connection.display_name} does not support default database " - "values with expressions (db_default)." - ) - errors.append(checks.Error(msg, obj=self, id="fields.E011")) - return errors - - def _check_db_index(self): - if self.db_index not in (None, True, False): - return [ - checks.Error( - "'db_index' must be None, True or False.", - obj=self, - id="fields.E006", - ) - ] - else: - return [] - - def _check_db_comment(self, databases=None, **kwargs): - if not self.db_comment or not databases: - return [] - errors = [] - for db in databases: - if not router.allow_migrate_model(db, self.model): - continue - connection = connections[db] - if not ( - connection.features.supports_comments - or "supports_comments" in self.model._meta.required_db_features - ): - errors.append( - checks.Warning( - f"{connection.display_name} does not support comments on " - f"columns (db_comment).", - obj=self, - id="fields.W163", - ) - ) - return errors - - def _check_null_allowed_for_primary_keys(self): - if ( - self.primary_key - and self.null - and not connection.features.interprets_empty_strings_as_nulls - ): - # We cannot reliably check this for backends like Oracle which - # consider NULL and '' to be equal (and thus set up - # character-based fields a little differently). - return [ - checks.Error( - "Primary keys must not have null=True.", - hint=( - "Set null=False on the field, or " - "remove primary_key=True argument." - ), - obj=self, - id="fields.E007", - ) - ] - else: - return [] - - def _check_backend_specific_checks(self, databases=None, **kwargs): - if databases is None: - return [] - errors = [] - for alias in databases: - if router.allow_migrate_model(alias, self.model): - errors.extend(connections[alias].validation.check_field(self, **kwargs)) - return errors - - def _check_validators(self): - errors = [] - for i, validator in enumerate(self.validators): - if not callable(validator): - errors.append( - checks.Error( - "All 'validators' must be callable.", - hint=( - "validators[{i}] ({repr}) isn't a function or " - "instance of a validator class.".format( - i=i, - repr=repr(validator), - ) - ), - obj=self, - id="fields.E008", - ) - ) - return errors - - def _check_deprecation_details(self): - if self.system_check_removed_details is not None: - return [ - checks.Error( - self.system_check_removed_details.get( - "msg", - "%s has been removed except for support in historical " - "migrations." % self.__class__.__name__, - ), - hint=self.system_check_removed_details.get("hint"), - obj=self, - id=self.system_check_removed_details.get("id", "fields.EXXX"), - ) - ] - elif self.system_check_deprecated_details is not None: - return [ - checks.Warning( - self.system_check_deprecated_details.get( - "msg", "%s has been deprecated." % self.__class__.__name__ - ), - hint=self.system_check_deprecated_details.get("hint"), - obj=self, - id=self.system_check_deprecated_details.get("id", "fields.WXXX"), - ) - ] - return [] - - def get_col(self, alias, output_field=None): - if alias == self.model._meta.db_table and ( - output_field is None or output_field == self - ): - return self.cached_col - from django.db.models.expressions import Col - - return Col(alias, self, output_field) - - @property - def choices(self): - return self._choices - - @choices.setter - def choices(self, value): - self._choices = normalize_choices(value) - - @cached_property - def cached_col(self): - from django.db.models.expressions import Col - - return Col(self.model._meta.db_table, self) - - def select_format(self, compiler, sql, params): - """ - Custom format for select clauses. For example, GIS columns need to be - selected as AsText(table.col) on MySQL as the table.col data can't be - used by Django. - """ - return sql, params - - def deconstruct(self): - """ - Return enough information to recreate the field as a 4-tuple: - - * The name of the field on the model, if contribute_to_class() has - been run. - * The import path of the field, including the class, e.g. - django.db.models.IntegerField. This should be the most portable - version, so less specific may be better. - * A list of positional arguments. - * A dict of keyword arguments. - - Note that the positional or keyword arguments must contain values of - the following types (including inner values of collection types): - - * None, bool, str, int, float, complex, set, frozenset, list, tuple, - dict - * UUID - * datetime.datetime (naive), datetime.date - * top-level classes, top-level functions - will be referenced by their - full import path - * Storage instances - these have their own deconstruct() method - - This is because the values here must be serialized into a text format - (possibly new Python code, possibly JSON) and these are the only types - with encoding handlers defined. - - There's no need to return the exact way the field was instantiated this - time, just ensure that the resulting field is the same - prefer keyword - arguments over positional ones, and omit parameters with their default - values. - """ - # Short-form way of fetching all the default parameters - keywords = {} - possibles = { - "verbose_name": None, - "primary_key": False, - "max_length": None, - "unique": False, - "blank": False, - "null": False, - "db_index": False, - "default": NOT_PROVIDED, - "db_default": NOT_PROVIDED, - "editable": True, - "serialize": True, - "unique_for_date": None, - "unique_for_month": None, - "unique_for_year": None, - "choices": None, - "help_text": "", - "db_column": None, - "db_comment": None, - "db_tablespace": None, - "auto_created": False, - "validators": [], - "error_messages": None, - } - attr_overrides = { - "unique": "_unique", - "error_messages": "_error_messages", - "validators": "_validators", - "verbose_name": "_verbose_name", - "db_tablespace": "_db_tablespace", - } - equals_comparison = {"choices", "validators"} - for name, default in possibles.items(): - value = getattr(self, attr_overrides.get(name, name)) - if isinstance(value, CallableChoiceIterator): - value = value.func - # Do correct kind of comparison - if name in equals_comparison: - if value != default: - keywords[name] = value - else: - if value is not default: - keywords[name] = value - # Work out path - we shorten it for known Django core fields - path = "%s.%s" % (self.__class__.__module__, self.__class__.__qualname__) - if path.startswith("django.db.models.fields.related"): - path = path.replace("django.db.models.fields.related", "django.db.models") - elif path.startswith("django.db.models.fields.files"): - path = path.replace("django.db.models.fields.files", "django.db.models") - elif path.startswith("django.db.models.fields.generated"): - path = path.replace("django.db.models.fields.generated", "django.db.models") - elif path.startswith("django.db.models.fields.json"): - path = path.replace("django.db.models.fields.json", "django.db.models") - elif path.startswith("django.db.models.fields.proxy"): - path = path.replace("django.db.models.fields.proxy", "django.db.models") - elif path.startswith("django.db.models.fields.composite"): - path = path.replace("django.db.models.fields.composite", "django.db.models") - elif path.startswith("django.db.models.fields"): - path = path.replace("django.db.models.fields", "django.db.models") - # Return basic info - other fields should override this. - return (self.name, path, [], keywords) - - def clone(self): - """ - Uses deconstruct() to clone a new copy of this Field. - Will not preserve any class attachments/attribute names. - """ - name, path, args, kwargs = self.deconstruct() - return self.__class__(*args, **kwargs) - - def __eq__(self, other): - # Needed for @total_ordering - if isinstance(other, Field): - return self.creation_counter == other.creation_counter and getattr( - self, "model", None - ) == getattr(other, "model", None) - return NotImplemented - - def __lt__(self, other): - # This is needed because bisect does not take a comparison function. - # Order by creation_counter first for backward compatibility. - if isinstance(other, Field): - if ( - self.creation_counter != other.creation_counter - or not hasattr(self, "model") - and not hasattr(other, "model") - ): - return self.creation_counter < other.creation_counter - elif hasattr(self, "model") != hasattr(other, "model"): - return not hasattr(self, "model") # Order no-model fields first - else: - # creation_counter's are equal, compare only models. - return (self.model._meta.app_label, self.model._meta.model_name) < ( - other.model._meta.app_label, - other.model._meta.model_name, - ) - return NotImplemented - - def __hash__(self): - return hash(self.creation_counter) - - def __deepcopy__(self, memodict): - # We don't have to deepcopy very much here, since most things are not - # intended to be altered after initial creation. - obj = copy.copy(self) - if self.remote_field: - obj.remote_field = copy.copy(self.remote_field) - if hasattr(self.remote_field, "field") and self.remote_field.field is self: - obj.remote_field.field = obj - memodict[id(self)] = obj - return obj - - def __copy__(self): - # We need to avoid hitting __reduce__, so define this - # slightly weird copy construct. - obj = Empty() - obj.__class__ = self.__class__ - obj.__dict__ = self.__dict__.copy() - return obj - - def __reduce__(self): - """ - Pickling should return the model._meta.fields instance of the field, - not a new copy of that field. So, use the app registry to load the - model and then the field back. - """ - if not hasattr(self, "model"): - # Fields are sometimes used without attaching them to models (for - # example in aggregation). In this case give back a plain field - # instance. The code below will create a new empty instance of - # class self.__class__, then update its dict with self.__dict__ - # values - so, this is very close to normal pickle. - state = self.__dict__.copy() - # The _get_default cached_property can't be pickled due to lambda - # usage. - state.pop("_get_default", None) - return _empty, (self.__class__,), state - return _load_field, ( - self.model._meta.app_label, - self.model._meta.object_name, - self.name, - ) - - def get_pk_value_on_save(self, instance): - """ - Hook to generate new PK values on save. This method is called when - saving instances with no primary key value set. If this method returns - something else than None, then the returned value is used when saving - the new instance. - """ - if self.default: - return self.get_default() - return None - - def to_python(self, value): - """ - Convert the input value into the expected Python data type, raising - django.core.exceptions.ValidationError if the data can't be converted. - Return the converted value. Subclasses should override this. - """ - return value - - @cached_property - def error_messages(self): - messages = {} - for c in reversed(self.__class__.__mro__): - messages.update(getattr(c, "default_error_messages", {})) - messages.update(self._error_messages or {}) - return messages - - @cached_property - def validators(self): - """ - Some validators can't be created at field initialization time. - This method provides a way to delay their creation until required. - """ - return [*self.default_validators, *self._validators] - - def run_validators(self, value): - if value in self.empty_values: - return - - errors = [] - for v in self.validators: - try: - v(value) - except exceptions.ValidationError as e: - if hasattr(e, "code") and e.code in self.error_messages: - e.message = self.error_messages[e.code] - errors.extend(e.error_list) - - if errors: - raise exceptions.ValidationError(errors) - - def validate(self, value, model_instance): - """ - Validate value and raise ValidationError if necessary. Subclasses - should override this to provide validation logic. - """ - if not self.editable: - # Skip validation for non-editable fields. - return - - if self.choices is not None and value not in self.empty_values: - for option_key, option_value in self.choices: - if isinstance(option_value, (list, tuple)): - # This is an optgroup, so look inside the group for - # options. - for optgroup_key, optgroup_value in option_value: - if value == optgroup_key: - return - elif value == option_key: - return - raise exceptions.ValidationError( - self.error_messages["invalid_choice"], - code="invalid_choice", - params={"value": value}, - ) - - if value is None and not self.null: - raise exceptions.ValidationError(self.error_messages["null"], code="null") - - if not self.blank and value in self.empty_values: - raise exceptions.ValidationError(self.error_messages["blank"], code="blank") - - def clean(self, value, model_instance): - """ - Convert the value's type and run validation. Validation errors - from to_python() and validate() are propagated. Return the correct - value if no error is raised. - """ - value = self.to_python(value) - self.validate(value, model_instance) - self.run_validators(value) - return value - - def db_type_parameters(self, connection): - return DictWrapper(self.__dict__, connection.ops.quote_name, "qn_") - - def db_check(self, connection): - """ - Return the database column check constraint for this field, for the - provided connection. Works the same way as db_type() for the case that - get_internal_type() does not map to a preexisting model field. - """ - data = self.db_type_parameters(connection) - try: - return ( - connection.data_type_check_constraints[self.get_internal_type()] % data - ) - except KeyError: - return None - - def db_type(self, connection): - """ - Return the database column data type for this field, for the provided - connection. - """ - # The default implementation of this method looks at the - # backend-specific data_types dictionary, looking up the field by its - # "internal type". - # - # A Field class can implement the get_internal_type() method to specify - # which *preexisting* Django Field class it's most similar to -- i.e., - # a custom field might be represented by a TEXT column type, which is - # the same as the TextField Django field type, which means the custom - # field's get_internal_type() returns 'TextField'. - # - # But the limitation of the get_internal_type() / data_types approach - # is that it cannot handle database column types that aren't already - # mapped to one of the built-in Django field types. In this case, you - # can implement db_type() instead of get_internal_type() to specify - # exactly which wacky database column type you want to use. - data = self.db_type_parameters(connection) - try: - column_type = connection.data_types[self.get_internal_type()] - except KeyError: - return None - else: - # column_type is either a single-parameter function or a string. - if callable(column_type): - return column_type(data) - return column_type % data - - def rel_db_type(self, connection): - """ - Return the data type that a related field pointing to this field should - use. For example, this method is called by ForeignKey and OneToOneField - to determine its data type. - """ - return self.db_type(connection) - - def cast_db_type(self, connection): - """Return the data type to use in the Cast() function.""" - db_type = connection.ops.cast_data_types.get(self.get_internal_type()) - if db_type: - return db_type % self.db_type_parameters(connection) - return self.db_type(connection) - - def db_parameters(self, connection): - """ - Extension of db_type(), providing a range of different return values - (type, checks). This will look at db_type(), allowing custom model - fields to override it. - """ - type_string = self.db_type(connection) - check_string = self.db_check(connection) - return { - "type": type_string, - "check": check_string, - } - - def db_type_suffix(self, connection): - return connection.data_types_suffix.get(self.get_internal_type()) - - def get_db_converters(self, connection): - if hasattr(self, "from_db_value"): - return [self.from_db_value] - return [] - - @cached_property - def unique(self): - return self._unique or self.primary_key - - @property - def db_tablespace(self): - return self._db_tablespace or settings.DEFAULT_INDEX_TABLESPACE - - @property - def db_returning(self): - """Private API intended only to be used by Django itself.""" - return ( - self.has_db_default() and connection.features.can_return_columns_from_insert - ) - - def set_attributes_from_name(self, name): - self.name = self.name or name - self.attname, self.column = self.get_attname_column() - self.concrete = self.column is not None - if self.verbose_name is None and self.name: - self.verbose_name = self.name.replace("_", " ") - - def contribute_to_class(self, cls, name, private_only=False): - """ - Register the field with the model class it belongs to. - - If private_only is True, create a separate instance of this field - for every subclass of cls, even if cls is not an abstract model. - """ - self.set_attributes_from_name(name) - self.model = cls - cls._meta.add_field(self, private=private_only) - if self.column: - setattr(cls, self.attname, self.descriptor_class(self)) - if self.choices is not None: - # Don't override a get_FOO_display() method defined explicitly on - # this class, but don't check methods derived from inheritance, to - # allow overriding inherited choices. For more complex inheritance - # structures users should override contribute_to_class(). - if "get_%s_display" % self.name not in cls.__dict__: - setattr( - cls, - "get_%s_display" % self.name, - partialmethod(cls._get_FIELD_display, field=self), - ) - - def get_filter_kwargs_for_object(self, obj): - """ - Return a dict that when passed as kwargs to self.model.filter(), would - yield all instances having the same value for this field as obj has. - """ - return {self.name: getattr(obj, self.attname)} - - def get_attname(self): - return self.name - - def get_attname_column(self): - attname = self.get_attname() - column = self.db_column or attname - return attname, column - - def get_internal_type(self): - return self.__class__.__name__ - - def pre_save(self, model_instance, add): - """Return field's value just before saving.""" - return getattr(model_instance, self.attname) - - def get_prep_value(self, value): - """Perform preliminary non-db specific value checks and conversions.""" - if isinstance(value, Promise): - value = value._proxy____cast() - return value - - def get_db_prep_value(self, value, connection, prepared=False): - """ - Return field's value prepared for interacting with the database backend. - - Used by the default implementations of get_db_prep_save(). - """ - if not prepared: - value = self.get_prep_value(value) - return value - - def get_db_prep_save(self, value, connection): - """Return field's value prepared for saving into a database.""" - if hasattr(value, "as_sql"): - return value - return self.get_db_prep_value(value, connection=connection, prepared=False) - - def has_default(self): - """Return a boolean of whether this field has a default value.""" - return self.default is not NOT_PROVIDED - - def has_db_default(self): - """Return a boolean of whether this field has a db_default value.""" - return self.db_default is not NOT_PROVIDED - - def get_default(self): - """Return the default value for this field.""" - return self._get_default() - - @cached_property - def _get_default(self): - if self.has_default(): - if callable(self.default): - return self.default - return lambda: self.default - - if self.has_db_default(): - from django.db.models.expressions import DatabaseDefault - - return lambda: DatabaseDefault( - self._db_default_expression, output_field=self - ) - - if ( - not self.empty_strings_allowed - or self.null - and not connection.features.interprets_empty_strings_as_nulls - ): - return return_None - return str # return empty string - - @cached_property - def _db_default_expression(self): - db_default = self.db_default - if self.has_db_default() and not hasattr(db_default, "resolve_expression"): - from django.db.models.expressions import Value - - db_default = Value(db_default, self) - return db_default - - def get_choices( - self, - include_blank=True, - blank_choice=BLANK_CHOICE_DASH, - limit_choices_to=None, - ordering=(), - ): - """ - Return choices with a default blank choices included, for use - as choices for this field. - - Analog of django.db.models.fields.Field.get_choices(), provided - initially for utilization by RelatedFieldListFilter. - """ - limit_choices_to = limit_choices_to or self.limit_choices_to - qs = self.related_model._default_manager.complex_filter(limit_choices_to) - if ordering: - qs = qs.order_by(*ordering) - return (blank_choice if include_blank else []) + [(x.pk, str(x)) for x in qs] - - def get_joining_columns(self): - warnings.warn( - "ForeignObjectRel.get_joining_columns() is deprecated. Use " - "get_joining_fields() instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - return self.field.get_reverse_joining_columns() - - def get_joining_fields(self): - return self.field.get_reverse_joining_fields() - - def get_extra_restriction(self, alias, related_alias): - return self.field.get_extra_restriction(related_alias, alias) - - def set_field_name(self): - """ - Set the related field's name, this is not available until later stages - of app loading, so set_field_name is called from - set_attributes_from_rel() - """ - # By default foreign object doesn't relate to any remote field (for - # example custom multicolumn joins currently have no remote field). - self.field_name = None - - @cached_property - def accessor_name(self): - return self.get_accessor_name() - - def get_accessor_name(self, model=None): - # This method encapsulates the logic that decides what name to give an - # accessor descriptor that retrieves related many-to-one or - # many-to-many objects. It uses the lowercased object_name + "_set", - # but this can be overridden with the "related_name" option. Due to - # backwards compatibility ModelForms need to be able to provide an - # alternate model. See BaseInlineFormSet.get_default_prefix(). - opts = model._meta if model else self.related_model._meta - model = model or self.related_model - if self.multiple: - # If this is a symmetrical m2m relation on self, there is no - # reverse accessor. - if self.symmetrical and model == self.model: - return None - if self.related_name: - return self.related_name - return opts.model_name + ("_set" if self.multiple else "") - - def get_path_info(self, filtered_relation=None): - if filtered_relation: - return self.field.get_reverse_path_info(filtered_relation) - else: - return self.field.reverse_path_infos - - @cached_property - def path_infos(self): - return self.get_path_info() - - @cached_property - def cache_name(self): - """ - Return the name of the cache key to use for storing an instance of the - forward model on the reverse model. - """ - return self.accessor_name - - -class ManyToOneRel(ForeignObjectRel): - """ - Used by the ForeignKey field to store information about the relation. - - ``_meta.get_fields()`` returns this class to provide access to the field - flags for the reverse relation. - - Note: Because we somewhat abuse the Rel objects by using them as reverse - fields we get the funny situation where - ``ManyToOneRel.many_to_one == False`` and - ``ManyToOneRel.one_to_many == True``. This is unfortunate but the actual - ManyToOneRel class is a private API and there is work underway to turn - reverse relations into actual fields. - """ - - def __init__( - self, - field, - to, - field_name, - related_name=None, - related_query_name=None, - limit_choices_to=None, - parent_link=False, - on_delete=None, - ): - super().__init__( - field, - to, - related_name=related_name, - related_query_name=related_query_name, - limit_choices_to=limit_choices_to, - parent_link=parent_link, - on_delete=on_delete, - ) - - self.field_name = field_name - - def __getstate__(self): - state = super().__getstate__() - state.pop("related_model", None) - return state - - @property - def identity(self): - return super().identity + (self.field_name,) - - def get_related_field(self): - """ - Return the Field in the 'to' object to which this relationship is tied. - """ - field = self.model._meta.get_field(self.field_name) - if not field.concrete: - raise exceptions.FieldDoesNotExist( - "No related field named '%s'" % self.field_name - ) - return field - - def set_field_name(self): - self.field_name = self.field_name or self.model._meta.pk.name - - -class OneToOneRel(ManyToOneRel): - """ - Used by OneToOneField to store information about the relation. - - ``_meta.get_fields()`` returns this class to provide access to the field - flags for the reverse relation. - """ - - def __init__( - self, - field, - to, - field_name, - related_name=None, - related_query_name=None, - limit_choices_to=None, - parent_link=False, - on_delete=None, - ): - super().__init__( - field, - to, - field_name, - related_name=related_name, - related_query_name=related_query_name, - limit_choices_to=limit_choices_to, - parent_link=parent_link, - on_delete=on_delete, - ) - - self.multiple = False - - -class ManyToManyRel(ForeignObjectRel): - """ - Used by ManyToManyField to store information about the relation. - - ``_meta.get_fields()`` returns this class to provide access to the field - flags for the reverse relation. - """ - - def __init__( - self, - field, - to, - related_name=None, - related_query_name=None, - limit_choices_to=None, - symmetrical=True, - through=None, - through_fields=None, - db_constraint=True, - ): - super().__init__( - field, - to, - related_name=related_name, - related_query_name=related_query_name, - limit_choices_to=limit_choices_to, - ) - - if through and not db_constraint: - raise ValueError("Can't supply a through model and db_constraint=False") - self.through = through - - if through_fields and not through: - raise ValueError("Cannot specify through_fields without a through model") - self.through_fields = through_fields - - self.symmetrical = symmetrical - self.db_constraint = db_constraint - - @property - def identity(self): - return super().identity + ( - self.through, - make_hashable(self.through_fields), - self.db_constraint, - ) - - def get_related_field(self): - """ - Return the field in the 'to' object to which this relationship is tied. - Provided for symmetry with ManyToOneRel. - """ - opts = self.through._meta - if self.through_fields: - field = opts.get_field(self.through_fields[0]) - else: - for field in opts.fields: - rel = getattr(field, "remote_field", None) - if rel and rel.model == self.model: - break - return field.foreign_related_fields[0] diff --git a/.venv/lib/python3.10/site-packages/django/db/models/fields/tuple_lookups.py b/.venv/lib/python3.10/site-packages/django/db/models/fields/tuple_lookups.py deleted file mode 100644 index 6c21263..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/fields/tuple_lookups.py +++ /dev/null @@ -1,359 +0,0 @@ -import itertools - -from django.core.exceptions import EmptyResultSet -from django.db.models import Field -from django.db.models.expressions import ( - ColPairs, - Func, - ResolvedOuterRef, - Subquery, - Value, -) -from django.db.models.lookups import ( - Exact, - GreaterThan, - GreaterThanOrEqual, - In, - IsNull, - LessThan, - LessThanOrEqual, -) -from django.db.models.sql import Query -from django.db.models.sql.where import AND, OR, WhereNode - - -class Tuple(Func): - allows_composite_expressions = True - function = "" - output_field = Field() - - def __len__(self): - return len(self.source_expressions) - - def __iter__(self): - return iter(self.source_expressions) - - -class TupleLookupMixin: - allows_composite_expressions = True - - def get_prep_lookup(self): - if self.rhs_is_direct_value(): - self.check_rhs_is_tuple_or_list() - self.check_rhs_length_equals_lhs_length() - else: - self.check_rhs_is_supported_expression() - super().get_prep_lookup() - return self.rhs - - def check_rhs_is_tuple_or_list(self): - if not isinstance(self.rhs, (tuple, list)): - lhs_str = self.get_lhs_str() - raise ValueError( - f"{self.lookup_name!r} lookup of {lhs_str} must be a tuple or a list" - ) - - def check_rhs_length_equals_lhs_length(self): - len_lhs = len(self.lhs) - if len_lhs != len(self.rhs): - lhs_str = self.get_lhs_str() - raise ValueError( - f"{self.lookup_name!r} lookup of {lhs_str} must have {len_lhs} elements" - ) - - def check_rhs_is_supported_expression(self): - if not isinstance(self.rhs, (ResolvedOuterRef, Query)): - lhs_str = self.get_lhs_str() - rhs_cls = self.rhs.__class__.__name__ - raise ValueError( - f"{self.lookup_name!r} subquery lookup of {lhs_str} " - f"only supports OuterRef and QuerySet objects (received {rhs_cls!r})" - ) - - def get_lhs_str(self): - if isinstance(self.lhs, ColPairs): - return repr(self.lhs.field.name) - else: - names = ", ".join(repr(f.name) for f in self.lhs) - return f"({names})" - - def get_prep_lhs(self): - if isinstance(self.lhs, (tuple, list)): - return Tuple(*self.lhs) - return super().get_prep_lhs() - - def process_lhs(self, compiler, connection, lhs=None): - sql, params = super().process_lhs(compiler, connection, lhs) - if not isinstance(self.lhs, Tuple): - sql = f"({sql})" - return sql, params - - def process_rhs(self, compiler, connection): - if self.rhs_is_direct_value(): - args = [ - Value(val, output_field=col.output_field) - for col, val in zip(self.lhs, self.rhs) - ] - return compiler.compile(Tuple(*args)) - else: - sql, params = compiler.compile(self.rhs) - if isinstance(self.rhs, ColPairs): - return "(%s)" % sql, params - elif isinstance(self.rhs, Query): - return super().process_rhs(compiler, connection) - else: - raise ValueError( - "Composite field lookups only work with composite expressions." - ) - - def get_fallback_sql(self, compiler, connection): - raise NotImplementedError( - f"{self.__class__.__name__}.get_fallback_sql() must be implemented " - f"for backends that don't have the supports_tuple_lookups feature enabled." - ) - - def as_sql(self, compiler, connection): - if not connection.features.supports_tuple_lookups: - return self.get_fallback_sql(compiler, connection) - return super().as_sql(compiler, connection) - - -class TupleExact(TupleLookupMixin, Exact): - def get_fallback_sql(self, compiler, connection): - if isinstance(self.rhs, Query): - return super(TupleLookupMixin, self).as_sql(compiler, connection) - # Process right-hand-side to trigger sanitization. - self.process_rhs(compiler, connection) - # e.g.: (a, b, c) == (x, y, z) as SQL: - # WHERE a = x AND b = y AND c = z - lookups = [Exact(col, val) for col, val in zip(self.lhs, self.rhs)] - root = WhereNode(lookups, connector=AND) - - return root.as_sql(compiler, connection) - - -class TupleIsNull(TupleLookupMixin, IsNull): - def get_prep_lookup(self): - rhs = self.rhs - if isinstance(rhs, (tuple, list)) and len(rhs) == 1: - rhs = rhs[0] - if isinstance(rhs, bool): - return rhs - raise ValueError( - "The QuerySet value for an isnull lookup must be True or False." - ) - - def as_sql(self, compiler, connection): - # e.g.: (a, b, c) is None as SQL: - # WHERE a IS NULL OR b IS NULL OR c IS NULL - # e.g.: (a, b, c) is not None as SQL: - # WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL - rhs = self.rhs - lookups = [IsNull(col, rhs) for col in self.lhs] - root = WhereNode(lookups, connector=OR if rhs else AND) - return root.as_sql(compiler, connection) - - -class TupleGreaterThan(TupleLookupMixin, GreaterThan): - def get_fallback_sql(self, compiler, connection): - # Process right-hand-side to trigger sanitization. - self.process_rhs(compiler, connection) - # e.g.: (a, b, c) > (x, y, z) as SQL: - # WHERE a > x OR (a = x AND (b > y OR (b = y AND c > z))) - lookups = itertools.cycle([GreaterThan, Exact]) - connectors = itertools.cycle([OR, AND]) - cols_list = [col for col in self.lhs for _ in range(2)] - vals_list = [val for val in self.rhs for _ in range(2)] - cols_iter = iter(cols_list[:-1]) - vals_iter = iter(vals_list[:-1]) - col = next(cols_iter) - val = next(vals_iter) - lookup = next(lookups) - connector = next(connectors) - root = node = WhereNode([lookup(col, val)], connector=connector) - - for col, val in zip(cols_iter, vals_iter): - lookup = next(lookups) - connector = next(connectors) - child = WhereNode([lookup(col, val)], connector=connector) - node.children.append(child) - node = child - - return root.as_sql(compiler, connection) - - -class TupleGreaterThanOrEqual(TupleLookupMixin, GreaterThanOrEqual): - def get_fallback_sql(self, compiler, connection): - # Process right-hand-side to trigger sanitization. - self.process_rhs(compiler, connection) - # e.g.: (a, b, c) >= (x, y, z) as SQL: - # WHERE a > x OR (a = x AND (b > y OR (b = y AND (c > z OR c = z)))) - lookups = itertools.cycle([GreaterThan, Exact]) - connectors = itertools.cycle([OR, AND]) - cols_list = [col for col in self.lhs for _ in range(2)] - vals_list = [val for val in self.rhs for _ in range(2)] - cols_iter = iter(cols_list) - vals_iter = iter(vals_list) - col = next(cols_iter) - val = next(vals_iter) - lookup = next(lookups) - connector = next(connectors) - root = node = WhereNode([lookup(col, val)], connector=connector) - - for col, val in zip(cols_iter, vals_iter): - lookup = next(lookups) - connector = next(connectors) - child = WhereNode([lookup(col, val)], connector=connector) - node.children.append(child) - node = child - - return root.as_sql(compiler, connection) - - -class TupleLessThan(TupleLookupMixin, LessThan): - def get_fallback_sql(self, compiler, connection): - # Process right-hand-side to trigger sanitization. - self.process_rhs(compiler, connection) - # e.g.: (a, b, c) < (x, y, z) as SQL: - # WHERE a < x OR (a = x AND (b < y OR (b = y AND c < z))) - lookups = itertools.cycle([LessThan, Exact]) - connectors = itertools.cycle([OR, AND]) - cols_list = [col for col in self.lhs for _ in range(2)] - vals_list = [val for val in self.rhs for _ in range(2)] - cols_iter = iter(cols_list[:-1]) - vals_iter = iter(vals_list[:-1]) - col = next(cols_iter) - val = next(vals_iter) - lookup = next(lookups) - connector = next(connectors) - root = node = WhereNode([lookup(col, val)], connector=connector) - - for col, val in zip(cols_iter, vals_iter): - lookup = next(lookups) - connector = next(connectors) - child = WhereNode([lookup(col, val)], connector=connector) - node.children.append(child) - node = child - - return root.as_sql(compiler, connection) - - -class TupleLessThanOrEqual(TupleLookupMixin, LessThanOrEqual): - def get_fallback_sql(self, compiler, connection): - # Process right-hand-side to trigger sanitization. - self.process_rhs(compiler, connection) - # e.g.: (a, b, c) <= (x, y, z) as SQL: - # WHERE a < x OR (a = x AND (b < y OR (b = y AND (c < z OR c = z)))) - lookups = itertools.cycle([LessThan, Exact]) - connectors = itertools.cycle([OR, AND]) - cols_list = [col for col in self.lhs for _ in range(2)] - vals_list = [val for val in self.rhs for _ in range(2)] - cols_iter = iter(cols_list) - vals_iter = iter(vals_list) - col = next(cols_iter) - val = next(vals_iter) - lookup = next(lookups) - connector = next(connectors) - root = node = WhereNode([lookup(col, val)], connector=connector) - - for col, val in zip(cols_iter, vals_iter): - lookup = next(lookups) - connector = next(connectors) - child = WhereNode([lookup(col, val)], connector=connector) - node.children.append(child) - node = child - - return root.as_sql(compiler, connection) - - -class TupleIn(TupleLookupMixin, In): - def get_prep_lookup(self): - if self.rhs_is_direct_value(): - self.check_rhs_is_tuple_or_list() - self.check_rhs_is_collection_of_tuples_or_lists() - self.check_rhs_elements_length_equals_lhs_length() - else: - self.check_rhs_is_query() - super(TupleLookupMixin, self).get_prep_lookup() - - return self.rhs # skip checks from mixin - - def check_rhs_is_collection_of_tuples_or_lists(self): - if not all(isinstance(vals, (tuple, list)) for vals in self.rhs): - lhs_str = self.get_lhs_str() - raise ValueError( - f"{self.lookup_name!r} lookup of {lhs_str} " - "must be a collection of tuples or lists" - ) - - def check_rhs_elements_length_equals_lhs_length(self): - len_lhs = len(self.lhs) - if not all(len_lhs == len(vals) for vals in self.rhs): - lhs_str = self.get_lhs_str() - raise ValueError( - f"{self.lookup_name!r} lookup of {lhs_str} " - f"must have {len_lhs} elements each" - ) - - def check_rhs_is_query(self): - if not isinstance(self.rhs, (Query, Subquery)): - lhs_str = self.get_lhs_str() - rhs_cls = self.rhs.__class__.__name__ - raise ValueError( - f"{self.lookup_name!r} subquery lookup of {lhs_str} " - f"must be a Query object (received {rhs_cls!r})" - ) - - def process_rhs(self, compiler, connection): - if not self.rhs_is_direct_value(): - return super(TupleLookupMixin, self).process_rhs(compiler, connection) - - rhs = self.rhs - if not rhs: - raise EmptyResultSet - - # e.g.: (a, b, c) in [(x1, y1, z1), (x2, y2, z2)] as SQL: - # WHERE (a, b, c) IN ((x1, y1, z1), (x2, y2, z2)) - result = [] - lhs = self.lhs - - for vals in rhs: - result.append( - Tuple( - *[ - Value(val, output_field=col.output_field) - for col, val in zip(lhs, vals) - ] - ) - ) - - return compiler.compile(Tuple(*result)) - - def get_fallback_sql(self, compiler, connection): - rhs = self.rhs - if not rhs: - raise EmptyResultSet - if not self.rhs_is_direct_value(): - return super(TupleLookupMixin, self).as_sql(compiler, connection) - - # e.g.: (a, b, c) in [(x1, y1, z1), (x2, y2, z2)] as SQL: - # WHERE (a = x1 AND b = y1 AND c = z1) OR (a = x2 AND b = y2 AND c = z2) - root = WhereNode([], connector=OR) - lhs = self.lhs - - for vals in rhs: - lookups = [Exact(col, val) for col, val in zip(lhs, vals)] - root.children.append(WhereNode(lookups, connector=AND)) - - return root.as_sql(compiler, connection) - - -tuple_lookups = { - "exact": TupleExact, - "gt": TupleGreaterThan, - "gte": TupleGreaterThanOrEqual, - "lt": TupleLessThan, - "lte": TupleLessThanOrEqual, - "in": TupleIn, - "isnull": TupleIsNull, -} diff --git a/.venv/lib/python3.10/site-packages/django/db/models/functions/__init__.py b/.venv/lib/python3.10/site-packages/django/db/models/functions/__init__.py deleted file mode 100644 index 2d36c69..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/functions/__init__.py +++ /dev/null @@ -1,193 +0,0 @@ -from .comparison import Cast, Coalesce, Collate, Greatest, Least, NullIf -from .datetime import ( - Extract, - ExtractDay, - ExtractHour, - ExtractIsoWeekDay, - ExtractIsoYear, - ExtractMinute, - ExtractMonth, - ExtractQuarter, - ExtractSecond, - ExtractWeek, - ExtractWeekDay, - ExtractYear, - Now, - Trunc, - TruncDate, - TruncDay, - TruncHour, - TruncMinute, - TruncMonth, - TruncQuarter, - TruncSecond, - TruncTime, - TruncWeek, - TruncYear, -) -from .json import JSONArray, JSONObject -from .math import ( - Abs, - ACos, - ASin, - ATan, - ATan2, - Ceil, - Cos, - Cot, - Degrees, - Exp, - Floor, - Ln, - Log, - Mod, - Pi, - Power, - Radians, - Random, - Round, - Sign, - Sin, - Sqrt, - Tan, -) -from .text import ( - MD5, - SHA1, - SHA224, - SHA256, - SHA384, - SHA512, - Chr, - Concat, - ConcatPair, - Left, - Length, - Lower, - LPad, - LTrim, - Ord, - Repeat, - Replace, - Reverse, - Right, - RPad, - RTrim, - StrIndex, - Substr, - Trim, - Upper, -) -from .window import ( - CumeDist, - DenseRank, - FirstValue, - Lag, - LastValue, - Lead, - NthValue, - Ntile, - PercentRank, - Rank, - RowNumber, -) - -__all__ = [ - # comparison and conversion - "Cast", - "Coalesce", - "Collate", - "Greatest", - "Least", - "NullIf", - # datetime - "Extract", - "ExtractDay", - "ExtractHour", - "ExtractMinute", - "ExtractMonth", - "ExtractQuarter", - "ExtractSecond", - "ExtractWeek", - "ExtractIsoWeekDay", - "ExtractWeekDay", - "ExtractIsoYear", - "ExtractYear", - "Now", - "Trunc", - "TruncDate", - "TruncDay", - "TruncHour", - "TruncMinute", - "TruncMonth", - "TruncQuarter", - "TruncSecond", - "TruncTime", - "TruncWeek", - "TruncYear", - # json - "JSONArray", - "JSONObject", - # math - "Abs", - "ACos", - "ASin", - "ATan", - "ATan2", - "Ceil", - "Cos", - "Cot", - "Degrees", - "Exp", - "Floor", - "Ln", - "Log", - "Mod", - "Pi", - "Power", - "Radians", - "Random", - "Round", - "Sign", - "Sin", - "Sqrt", - "Tan", - # text - "MD5", - "SHA1", - "SHA224", - "SHA256", - "SHA384", - "SHA512", - "Chr", - "Concat", - "ConcatPair", - "Left", - "Length", - "Lower", - "LPad", - "LTrim", - "Ord", - "Repeat", - "Replace", - "Reverse", - "Right", - "RPad", - "RTrim", - "StrIndex", - "Substr", - "Trim", - "Upper", - # window - "CumeDist", - "DenseRank", - "FirstValue", - "Lag", - "LastValue", - "Lead", - "NthValue", - "Ntile", - "PercentRank", - "Rank", - "RowNumber", -] diff --git a/.venv/lib/python3.10/site-packages/django/db/models/functions/comparison.py b/.venv/lib/python3.10/site-packages/django/db/models/functions/comparison.py deleted file mode 100644 index 11af0c0..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/functions/comparison.py +++ /dev/null @@ -1,172 +0,0 @@ -"""Database functions that do comparisons or type conversions.""" - -from django.db.models.expressions import Func, Value -from django.utils.regex_helper import _lazy_re_compile - - -class Cast(Func): - """Coerce an expression to a new field type.""" - - function = "CAST" - template = "%(function)s(%(expressions)s AS %(db_type)s)" - - def __init__(self, expression, output_field): - super().__init__(expression, output_field=output_field) - - def as_sql(self, compiler, connection, **extra_context): - extra_context["db_type"] = self.output_field.cast_db_type(connection) - return super().as_sql(compiler, connection, **extra_context) - - def as_sqlite(self, compiler, connection, **extra_context): - db_type = self.output_field.db_type(connection) - if db_type in {"datetime", "time"}: - # Use strftime as datetime/time don't keep fractional seconds. - template = "strftime(%%s, %(expressions)s)" - sql, params = super().as_sql( - compiler, connection, template=template, **extra_context - ) - format_string = "%H:%M:%f" if db_type == "time" else "%Y-%m-%d %H:%M:%f" - params.insert(0, format_string) - return sql, params - elif db_type == "date": - template = "date(%(expressions)s)" - return super().as_sql( - compiler, connection, template=template, **extra_context - ) - return self.as_sql(compiler, connection, **extra_context) - - def as_mysql(self, compiler, connection, **extra_context): - template = None - output_type = self.output_field.get_internal_type() - # MySQL doesn't support explicit cast to float. - if output_type == "FloatField": - template = "(%(expressions)s + 0.0)" - # MariaDB doesn't support explicit cast to JSON. - elif output_type == "JSONField" and connection.mysql_is_mariadb: - template = "JSON_EXTRACT(%(expressions)s, '$')" - return self.as_sql(compiler, connection, template=template, **extra_context) - - def as_postgresql(self, compiler, connection, **extra_context): - # CAST would be valid too, but the :: shortcut syntax is more readable. - # 'expressions' is wrapped in parentheses in case it's a complex - # expression. - return self.as_sql( - compiler, - connection, - template="(%(expressions)s)::%(db_type)s", - **extra_context, - ) - - def as_oracle(self, compiler, connection, **extra_context): - if self.output_field.get_internal_type() == "JSONField": - # Oracle doesn't support explicit cast to JSON. - template = "JSON_QUERY(%(expressions)s, '$')" - return super().as_sql( - compiler, connection, template=template, **extra_context - ) - return self.as_sql(compiler, connection, **extra_context) - - -class Coalesce(Func): - """Return, from left to right, the first non-null expression.""" - - function = "COALESCE" - - def __init__(self, *expressions, **extra): - if len(expressions) < 2: - raise ValueError("Coalesce must take at least two expressions") - super().__init__(*expressions, **extra) - - @property - def empty_result_set_value(self): - for expression in self.get_source_expressions(): - result = expression.empty_result_set_value - if result is NotImplemented or result is not None: - return result - return None - - def as_oracle(self, compiler, connection, **extra_context): - # Oracle prohibits mixing TextField (NCLOB) and CharField (NVARCHAR2), - # so convert all fields to NCLOB when that type is expected. - if self.output_field.get_internal_type() == "TextField": - clone = self.copy() - clone.set_source_expressions( - [ - Func(expression, function="TO_NCLOB") - for expression in self.get_source_expressions() - ] - ) - return super(Coalesce, clone).as_sql(compiler, connection, **extra_context) - return self.as_sql(compiler, connection, **extra_context) - - -class Collate(Func): - function = "COLLATE" - template = "%(expressions)s %(function)s %(collation)s" - allowed_default = False - # Inspired from - # https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS - collation_re = _lazy_re_compile(r"^[\w-]+$") - - def __init__(self, expression, collation): - if not (collation and self.collation_re.match(collation)): - raise ValueError("Invalid collation name: %r." % collation) - self.collation = collation - super().__init__(expression) - - def as_sql(self, compiler, connection, **extra_context): - extra_context.setdefault("collation", connection.ops.quote_name(self.collation)) - return super().as_sql(compiler, connection, **extra_context) - - -class Greatest(Func): - """ - Return the maximum expression. - - If any expression is null the return value is database-specific: - On PostgreSQL, the maximum not-null expression is returned. - On MySQL, Oracle, and SQLite, if any expression is null, null is returned. - """ - - function = "GREATEST" - - def __init__(self, *expressions, **extra): - if len(expressions) < 2: - raise ValueError("Greatest must take at least two expressions") - super().__init__(*expressions, **extra) - - def as_sqlite(self, compiler, connection, **extra_context): - """Use the MAX function on SQLite.""" - return super().as_sqlite(compiler, connection, function="MAX", **extra_context) - - -class Least(Func): - """ - Return the minimum expression. - - If any expression is null the return value is database-specific: - On PostgreSQL, return the minimum not-null expression. - On MySQL, Oracle, and SQLite, if any expression is null, return null. - """ - - function = "LEAST" - - def __init__(self, *expressions, **extra): - if len(expressions) < 2: - raise ValueError("Least must take at least two expressions") - super().__init__(*expressions, **extra) - - def as_sqlite(self, compiler, connection, **extra_context): - """Use the MIN function on SQLite.""" - return super().as_sqlite(compiler, connection, function="MIN", **extra_context) - - -class NullIf(Func): - function = "NULLIF" - arity = 2 - - def as_oracle(self, compiler, connection, **extra_context): - expression1 = self.get_source_expressions()[0] - if isinstance(expression1, Value) and expression1.value is None: - raise ValueError("Oracle does not allow Value(None) for expression1.") - return super().as_sql(compiler, connection, **extra_context) diff --git a/.venv/lib/python3.10/site-packages/django/db/models/functions/datetime.py b/.venv/lib/python3.10/site-packages/django/db/models/functions/datetime.py deleted file mode 100644 index 9937e79..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/functions/datetime.py +++ /dev/null @@ -1,439 +0,0 @@ -from datetime import datetime - -from django.conf import settings -from django.db.models.expressions import Func -from django.db.models.fields import ( - DateField, - DateTimeField, - DurationField, - Field, - IntegerField, - TimeField, -) -from django.db.models.lookups import ( - Transform, - YearExact, - YearGt, - YearGte, - YearLt, - YearLte, -) -from django.utils import timezone - - -class TimezoneMixin: - tzinfo = None - - def get_tzname(self): - # Timezone conversions must happen to the input datetime *before* - # applying a function. 2015-12-31 23:00:00 -02:00 is stored in the - # database as 2016-01-01 01:00:00 +00:00. Any results should be - # based on the input datetime not the stored datetime. - tzname = None - if settings.USE_TZ: - if self.tzinfo is None: - tzname = timezone.get_current_timezone_name() - else: - tzname = timezone._get_timezone_name(self.tzinfo) - return tzname - - -class Extract(TimezoneMixin, Transform): - lookup_name = None - output_field = IntegerField() - - def __init__(self, expression, lookup_name=None, tzinfo=None, **extra): - if self.lookup_name is None: - self.lookup_name = lookup_name - if self.lookup_name is None: - raise ValueError("lookup_name must be provided") - self.tzinfo = tzinfo - super().__init__(expression, **extra) - - def as_sql(self, compiler, connection): - sql, params = compiler.compile(self.lhs) - lhs_output_field = self.lhs.output_field - if isinstance(lhs_output_field, DateTimeField): - tzname = self.get_tzname() - sql, params = connection.ops.datetime_extract_sql( - self.lookup_name, sql, tuple(params), tzname - ) - elif self.tzinfo is not None: - raise ValueError("tzinfo can only be used with DateTimeField.") - elif isinstance(lhs_output_field, DateField): - sql, params = connection.ops.date_extract_sql( - self.lookup_name, sql, tuple(params) - ) - elif isinstance(lhs_output_field, TimeField): - sql, params = connection.ops.time_extract_sql( - self.lookup_name, sql, tuple(params) - ) - elif isinstance(lhs_output_field, DurationField): - if not connection.features.has_native_duration_field: - raise ValueError( - "Extract requires native DurationField database support." - ) - sql, params = connection.ops.time_extract_sql( - self.lookup_name, sql, tuple(params) - ) - else: - # resolve_expression has already validated the output_field so this - # assert should never be hit. - assert False, "Tried to Extract from an invalid type." - return sql, params - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - copy = super().resolve_expression( - query, allow_joins, reuse, summarize, for_save - ) - field = getattr(copy.lhs, "output_field", None) - if field is None: - return copy - if not isinstance(field, (DateField, DateTimeField, TimeField, DurationField)): - raise ValueError( - "Extract input expression must be DateField, DateTimeField, " - "TimeField, or DurationField." - ) - # Passing dates to functions expecting datetimes is most likely a mistake. - if type(field) is DateField and copy.lookup_name in ( - "hour", - "minute", - "second", - ): - raise ValueError( - "Cannot extract time component '%s' from DateField '%s'." - % (copy.lookup_name, field.name) - ) - if isinstance(field, DurationField) and copy.lookup_name in ( - "year", - "iso_year", - "month", - "week", - "week_day", - "iso_week_day", - "quarter", - ): - raise ValueError( - "Cannot extract component '%s' from DurationField '%s'." - % (copy.lookup_name, field.name) - ) - return copy - - -class ExtractYear(Extract): - lookup_name = "year" - - -class ExtractIsoYear(Extract): - """Return the ISO-8601 week-numbering year.""" - - lookup_name = "iso_year" - - -class ExtractMonth(Extract): - lookup_name = "month" - - -class ExtractDay(Extract): - lookup_name = "day" - - -class ExtractWeek(Extract): - """ - Return 1-52 or 53, based on ISO-8601, i.e., Monday is the first of the - week. - """ - - lookup_name = "week" - - -class ExtractWeekDay(Extract): - """ - Return Sunday=1 through Saturday=7. - - To replicate this in Python: (mydatetime.isoweekday() % 7) + 1 - """ - - lookup_name = "week_day" - - -class ExtractIsoWeekDay(Extract): - """Return Monday=1 through Sunday=7, based on ISO-8601.""" - - lookup_name = "iso_week_day" - - -class ExtractQuarter(Extract): - lookup_name = "quarter" - - -class ExtractHour(Extract): - lookup_name = "hour" - - -class ExtractMinute(Extract): - lookup_name = "minute" - - -class ExtractSecond(Extract): - lookup_name = "second" - - -DateField.register_lookup(ExtractYear) -DateField.register_lookup(ExtractMonth) -DateField.register_lookup(ExtractDay) -DateField.register_lookup(ExtractWeekDay) -DateField.register_lookup(ExtractIsoWeekDay) -DateField.register_lookup(ExtractWeek) -DateField.register_lookup(ExtractIsoYear) -DateField.register_lookup(ExtractQuarter) - -TimeField.register_lookup(ExtractHour) -TimeField.register_lookup(ExtractMinute) -TimeField.register_lookup(ExtractSecond) - -DateTimeField.register_lookup(ExtractHour) -DateTimeField.register_lookup(ExtractMinute) -DateTimeField.register_lookup(ExtractSecond) - -ExtractYear.register_lookup(YearExact) -ExtractYear.register_lookup(YearGt) -ExtractYear.register_lookup(YearGte) -ExtractYear.register_lookup(YearLt) -ExtractYear.register_lookup(YearLte) - -ExtractIsoYear.register_lookup(YearExact) -ExtractIsoYear.register_lookup(YearGt) -ExtractIsoYear.register_lookup(YearGte) -ExtractIsoYear.register_lookup(YearLt) -ExtractIsoYear.register_lookup(YearLte) - - -class Now(Func): - template = "CURRENT_TIMESTAMP" - output_field = DateTimeField() - - def as_postgresql(self, compiler, connection, **extra_context): - # PostgreSQL's CURRENT_TIMESTAMP means "the time at the start of the - # transaction". Use STATEMENT_TIMESTAMP to be cross-compatible with - # other databases. - return self.as_sql( - compiler, connection, template="STATEMENT_TIMESTAMP()", **extra_context - ) - - def as_mysql(self, compiler, connection, **extra_context): - return self.as_sql( - compiler, connection, template="CURRENT_TIMESTAMP(6)", **extra_context - ) - - def as_sqlite(self, compiler, connection, **extra_context): - return self.as_sql( - compiler, - connection, - template="STRFTIME('%%%%Y-%%%%m-%%%%d %%%%H:%%%%M:%%%%f', 'NOW')", - **extra_context, - ) - - def as_oracle(self, compiler, connection, **extra_context): - return self.as_sql( - compiler, connection, template="LOCALTIMESTAMP", **extra_context - ) - - -class TruncBase(TimezoneMixin, Transform): - kind = None - tzinfo = None - - def __init__( - self, - expression, - output_field=None, - tzinfo=None, - **extra, - ): - self.tzinfo = tzinfo - super().__init__(expression, output_field=output_field, **extra) - - def as_sql(self, compiler, connection): - sql, params = compiler.compile(self.lhs) - tzname = None - if isinstance(self.lhs.output_field, DateTimeField): - tzname = self.get_tzname() - elif self.tzinfo is not None: - raise ValueError("tzinfo can only be used with DateTimeField.") - if isinstance(self.output_field, DateTimeField): - sql, params = connection.ops.datetime_trunc_sql( - self.kind, sql, tuple(params), tzname - ) - elif isinstance(self.output_field, DateField): - sql, params = connection.ops.date_trunc_sql( - self.kind, sql, tuple(params), tzname - ) - elif isinstance(self.output_field, TimeField): - sql, params = connection.ops.time_trunc_sql( - self.kind, sql, tuple(params), tzname - ) - else: - raise ValueError( - "Trunc only valid on DateField, TimeField, or DateTimeField." - ) - return sql, params - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - copy = super().resolve_expression( - query, allow_joins, reuse, summarize, for_save - ) - field = copy.lhs.output_field - # DateTimeField is a subclass of DateField so this works for both. - if not isinstance(field, (DateField, TimeField)): - raise TypeError( - "%r isn't a DateField, TimeField, or DateTimeField." % field.name - ) - # If self.output_field was None, then accessing the field will trigger - # the resolver to assign it to self.lhs.output_field. - if not isinstance(copy.output_field, (DateField, DateTimeField, TimeField)): - raise ValueError( - "output_field must be either DateField, TimeField, or DateTimeField" - ) - # Passing dates or times to functions expecting datetimes is most - # likely a mistake. - class_output_field = ( - self.__class__.output_field - if isinstance(self.__class__.output_field, Field) - else None - ) - output_field = class_output_field or copy.output_field - has_explicit_output_field = ( - class_output_field or field.__class__ is not copy.output_field.__class__ - ) - if type(field) is DateField and ( - isinstance(output_field, DateTimeField) - or copy.kind in ("hour", "minute", "second", "time") - ): - raise ValueError( - "Cannot truncate DateField '%s' to %s." - % ( - field.name, - ( - output_field.__class__.__name__ - if has_explicit_output_field - else "DateTimeField" - ), - ) - ) - elif isinstance(field, TimeField) and ( - isinstance(output_field, DateTimeField) - or copy.kind in ("year", "quarter", "month", "week", "day", "date") - ): - raise ValueError( - "Cannot truncate TimeField '%s' to %s." - % ( - field.name, - ( - output_field.__class__.__name__ - if has_explicit_output_field - else "DateTimeField" - ), - ) - ) - return copy - - def convert_value(self, value, expression, connection): - if isinstance(self.output_field, DateTimeField): - if not settings.USE_TZ: - pass - elif value is not None: - value = value.replace(tzinfo=None) - value = timezone.make_aware(value, self.tzinfo) - elif not connection.features.has_zoneinfo_database: - raise ValueError( - "Database returned an invalid datetime value. Are time " - "zone definitions for your database installed?" - ) - elif isinstance(value, datetime): - if value is None: - pass - elif isinstance(self.output_field, DateField): - value = value.date() - elif isinstance(self.output_field, TimeField): - value = value.time() - return value - - -class Trunc(TruncBase): - def __init__( - self, - expression, - kind, - output_field=None, - tzinfo=None, - **extra, - ): - self.kind = kind - super().__init__(expression, output_field=output_field, tzinfo=tzinfo, **extra) - - -class TruncYear(TruncBase): - kind = "year" - - -class TruncQuarter(TruncBase): - kind = "quarter" - - -class TruncMonth(TruncBase): - kind = "month" - - -class TruncWeek(TruncBase): - """Truncate to midnight on the Monday of the week.""" - - kind = "week" - - -class TruncDay(TruncBase): - kind = "day" - - -class TruncDate(TruncBase): - kind = "date" - lookup_name = "date" - output_field = DateField() - - def as_sql(self, compiler, connection): - # Cast to date rather than truncate to date. - sql, params = compiler.compile(self.lhs) - tzname = self.get_tzname() - return connection.ops.datetime_cast_date_sql(sql, tuple(params), tzname) - - -class TruncTime(TruncBase): - kind = "time" - lookup_name = "time" - output_field = TimeField() - - def as_sql(self, compiler, connection): - # Cast to time rather than truncate to time. - sql, params = compiler.compile(self.lhs) - tzname = self.get_tzname() - return connection.ops.datetime_cast_time_sql(sql, tuple(params), tzname) - - -class TruncHour(TruncBase): - kind = "hour" - - -class TruncMinute(TruncBase): - kind = "minute" - - -class TruncSecond(TruncBase): - kind = "second" - - -DateTimeField.register_lookup(TruncDate) -DateTimeField.register_lookup(TruncTime) diff --git a/.venv/lib/python3.10/site-packages/django/db/models/functions/json.py b/.venv/lib/python3.10/site-packages/django/db/models/functions/json.py deleted file mode 100644 index 3a4c9c8..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/functions/json.py +++ /dev/null @@ -1,124 +0,0 @@ -from django.db import NotSupportedError -from django.db.models.expressions import Func, Value -from django.db.models.fields import TextField -from django.db.models.fields.json import JSONField -from django.db.models.functions import Cast - - -class JSONArray(Func): - function = "JSON_ARRAY" - output_field = JSONField() - - def as_sql(self, compiler, connection, **extra_context): - if not connection.features.supports_json_field: - raise NotSupportedError( - "JSONFields are not supported on this database backend." - ) - return super().as_sql(compiler, connection, **extra_context) - - def as_native(self, compiler, connection, *, returning, **extra_context): - # PostgreSQL 16+ and Oracle remove SQL NULL values from the array by - # default. Adds the NULL ON NULL clause to keep NULL values in the - # array, mapping them to JSON null values, which matches the behavior - # of SQLite. - null_on_null = "NULL ON NULL" if len(self.get_source_expressions()) > 0 else "" - - return self.as_sql( - compiler, - connection, - template=( - f"%(function)s(%(expressions)s {null_on_null} RETURNING {returning})" - ), - **extra_context, - ) - - def as_postgresql(self, compiler, connection, **extra_context): - # Casting source expressions is only required using JSONB_BUILD_ARRAY - # or when using JSON_ARRAY on PostgreSQL 16+ with server-side bindings. - # This is done in all cases for consistency. - casted_obj = self.copy() - casted_obj.set_source_expressions( - [ - ( - # Conditional Cast to avoid unnecessary wrapping. - expression - if isinstance(expression, Cast) - else Cast(expression, expression.output_field) - ) - for expression in casted_obj.get_source_expressions() - ] - ) - - if connection.features.is_postgresql_16: - return casted_obj.as_native( - compiler, connection, returning="JSONB", **extra_context - ) - - return casted_obj.as_sql( - compiler, - connection, - function="JSONB_BUILD_ARRAY", - **extra_context, - ) - - def as_oracle(self, compiler, connection, **extra_context): - return self.as_native(compiler, connection, returning="CLOB", **extra_context) - - -class JSONObject(Func): - function = "JSON_OBJECT" - output_field = JSONField() - - def __init__(self, **fields): - expressions = [] - for key, value in fields.items(): - expressions.extend((Value(key), value)) - super().__init__(*expressions) - - def as_sql(self, compiler, connection, **extra_context): - if not connection.features.has_json_object_function: - raise NotSupportedError( - "JSONObject() is not supported on this database backend." - ) - return super().as_sql(compiler, connection, **extra_context) - - def join(self, args): - pairs = zip(args[::2], args[1::2], strict=True) - # Wrap 'key' in parentheses in case of postgres cast :: syntax. - return ", ".join([f"({key}) VALUE {value}" for key, value in pairs]) - - def as_native(self, compiler, connection, *, returning, **extra_context): - return self.as_sql( - compiler, - connection, - arg_joiner=self, - template=f"%(function)s(%(expressions)s RETURNING {returning})", - **extra_context, - ) - - def as_postgresql(self, compiler, connection, **extra_context): - # Casting keys to text is only required when using JSONB_BUILD_OBJECT - # or when using JSON_OBJECT on PostgreSQL 16+ with server-side bindings. - # This is done in all cases for consistency. - copy = self.copy() - copy.set_source_expressions( - [ - Cast(expression, TextField()) if index % 2 == 0 else expression - for index, expression in enumerate(copy.get_source_expressions()) - ] - ) - - if connection.features.is_postgresql_16: - return copy.as_native( - compiler, connection, returning="JSONB", **extra_context - ) - - return super(JSONObject, copy).as_sql( - compiler, - connection, - function="JSONB_BUILD_OBJECT", - **extra_context, - ) - - def as_oracle(self, compiler, connection, **extra_context): - return self.as_native(compiler, connection, returning="CLOB", **extra_context) diff --git a/.venv/lib/python3.10/site-packages/django/db/models/functions/math.py b/.venv/lib/python3.10/site-packages/django/db/models/functions/math.py deleted file mode 100644 index 5fa4654..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/functions/math.py +++ /dev/null @@ -1,214 +0,0 @@ -import math - -from django.db.models.expressions import Func, Value -from django.db.models.fields import FloatField, IntegerField -from django.db.models.functions import Cast -from django.db.models.functions.mixins import ( - FixDecimalInputMixin, - NumericOutputFieldMixin, -) -from django.db.models.lookups import Transform - - -class Abs(Transform): - function = "ABS" - lookup_name = "abs" - - -class ACos(NumericOutputFieldMixin, Transform): - function = "ACOS" - lookup_name = "acos" - - -class ASin(NumericOutputFieldMixin, Transform): - function = "ASIN" - lookup_name = "asin" - - -class ATan(NumericOutputFieldMixin, Transform): - function = "ATAN" - lookup_name = "atan" - - -class ATan2(NumericOutputFieldMixin, Func): - function = "ATAN2" - arity = 2 - - def as_sqlite(self, compiler, connection, **extra_context): - if not getattr( - connection.ops, "spatialite", False - ) or connection.ops.spatial_version >= (5, 0, 0): - return self.as_sql(compiler, connection) - # This function is usually ATan2(y, x), returning the inverse tangent - # of y / x, but it's ATan2(x, y) on SpatiaLite < 5.0.0. - # Cast integers to float to avoid inconsistent/buggy behavior if the - # arguments are mixed between integer and float or decimal. - # https://www.gaia-gis.it/fossil/libspatialite/tktview?name=0f72cca3a2 - clone = self.copy() - clone.set_source_expressions( - [ - ( - Cast(expression, FloatField()) - if isinstance(expression.output_field, IntegerField) - else expression - ) - for expression in self.get_source_expressions()[::-1] - ] - ) - return clone.as_sql(compiler, connection, **extra_context) - - -class Ceil(Transform): - function = "CEILING" - lookup_name = "ceil" - - def as_oracle(self, compiler, connection, **extra_context): - return super().as_sql(compiler, connection, function="CEIL", **extra_context) - - -class Cos(NumericOutputFieldMixin, Transform): - function = "COS" - lookup_name = "cos" - - -class Cot(NumericOutputFieldMixin, Transform): - function = "COT" - lookup_name = "cot" - - def as_oracle(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, connection, template="(1 / TAN(%(expressions)s))", **extra_context - ) - - -class Degrees(NumericOutputFieldMixin, Transform): - function = "DEGREES" - lookup_name = "degrees" - - def as_oracle(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, - connection, - template="((%%(expressions)s) * 180 / %s)" % math.pi, - **extra_context, - ) - - -class Exp(NumericOutputFieldMixin, Transform): - function = "EXP" - lookup_name = "exp" - - -class Floor(Transform): - function = "FLOOR" - lookup_name = "floor" - - -class Ln(NumericOutputFieldMixin, Transform): - function = "LN" - lookup_name = "ln" - - -class Log(FixDecimalInputMixin, NumericOutputFieldMixin, Func): - function = "LOG" - arity = 2 - - def as_sqlite(self, compiler, connection, **extra_context): - if not getattr(connection.ops, "spatialite", False): - return self.as_sql(compiler, connection) - # This function is usually Log(b, x) returning the logarithm of x to - # the base b, but on SpatiaLite it's Log(x, b). - clone = self.copy() - clone.set_source_expressions(self.get_source_expressions()[::-1]) - return clone.as_sql(compiler, connection, **extra_context) - - -class Mod(FixDecimalInputMixin, NumericOutputFieldMixin, Func): - function = "MOD" - arity = 2 - - -class Pi(NumericOutputFieldMixin, Func): - function = "PI" - arity = 0 - - def as_oracle(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, connection, template=str(math.pi), **extra_context - ) - - -class Power(NumericOutputFieldMixin, Func): - function = "POWER" - arity = 2 - - -class Radians(NumericOutputFieldMixin, Transform): - function = "RADIANS" - lookup_name = "radians" - - def as_oracle(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, - connection, - template="((%%(expressions)s) * %s / 180)" % math.pi, - **extra_context, - ) - - -class Random(NumericOutputFieldMixin, Func): - function = "RANDOM" - arity = 0 - - def as_mysql(self, compiler, connection, **extra_context): - return super().as_sql(compiler, connection, function="RAND", **extra_context) - - def as_oracle(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, connection, function="DBMS_RANDOM.VALUE", **extra_context - ) - - def as_sqlite(self, compiler, connection, **extra_context): - return super().as_sql(compiler, connection, function="RAND", **extra_context) - - def get_group_by_cols(self): - return [] - - -class Round(FixDecimalInputMixin, Transform): - function = "ROUND" - lookup_name = "round" - arity = None # Override Transform's arity=1 to enable passing precision. - - def __init__(self, expression, precision=0, **extra): - super().__init__(expression, precision, **extra) - - def as_sqlite(self, compiler, connection, **extra_context): - precision = self.get_source_expressions()[1] - if isinstance(precision, Value) and precision.value < 0: - raise ValueError("SQLite does not support negative precision.") - return super().as_sqlite(compiler, connection, **extra_context) - - def _resolve_output_field(self): - source = self.get_source_expressions()[0] - return source.output_field - - -class Sign(Transform): - function = "SIGN" - lookup_name = "sign" - - -class Sin(NumericOutputFieldMixin, Transform): - function = "SIN" - lookup_name = "sin" - - -class Sqrt(NumericOutputFieldMixin, Transform): - function = "SQRT" - lookup_name = "sqrt" - - -class Tan(NumericOutputFieldMixin, Transform): - function = "TAN" - lookup_name = "tan" diff --git a/.venv/lib/python3.10/site-packages/django/db/models/functions/mixins.py b/.venv/lib/python3.10/site-packages/django/db/models/functions/mixins.py deleted file mode 100644 index 0f6f0a2..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/functions/mixins.py +++ /dev/null @@ -1,62 +0,0 @@ -import sys - -from django.db.models.fields import DecimalField, FloatField, IntegerField -from django.db.models.functions import Cast - - -class FixDecimalInputMixin: - def as_postgresql(self, compiler, connection, **extra_context): - # Cast FloatField to DecimalField as PostgreSQL doesn't support the - # following function signatures: - # - LOG(double, double) - # - MOD(double, double) - output_field = DecimalField(decimal_places=sys.float_info.dig, max_digits=1000) - clone = self.copy() - clone.set_source_expressions( - [ - ( - Cast(expression, output_field) - if isinstance(expression.output_field, FloatField) - else expression - ) - for expression in self.get_source_expressions() - ] - ) - return clone.as_sql(compiler, connection, **extra_context) - - -class FixDurationInputMixin: - def as_mysql(self, compiler, connection, **extra_context): - sql, params = super().as_sql(compiler, connection, **extra_context) - if self.output_field.get_internal_type() == "DurationField": - sql = "CAST(%s AS SIGNED)" % sql - return sql, params - - def as_oracle(self, compiler, connection, **extra_context): - if ( - self.output_field.get_internal_type() == "DurationField" - and not connection.features.supports_aggregation_over_interval_types - ): - expression = self.get_source_expressions()[0] - options = self._get_repr_options() - from django.db.backends.oracle.functions import ( - IntervalToSeconds, - SecondsToInterval, - ) - - return compiler.compile( - SecondsToInterval( - self.__class__(IntervalToSeconds(expression), **options) - ) - ) - return super().as_sql(compiler, connection, **extra_context) - - -class NumericOutputFieldMixin: - def _resolve_output_field(self): - source_fields = self.get_source_fields() - if any(isinstance(s, DecimalField) for s in source_fields): - return DecimalField() - if any(isinstance(s, IntegerField) for s in source_fields): - return FloatField() - return super()._resolve_output_field() if source_fields else FloatField() diff --git a/.venv/lib/python3.10/site-packages/django/db/models/functions/text.py b/.venv/lib/python3.10/site-packages/django/db/models/functions/text.py deleted file mode 100644 index 9c48659..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/functions/text.py +++ /dev/null @@ -1,376 +0,0 @@ -from django.db import NotSupportedError -from django.db.models.expressions import Func, Value -from django.db.models.fields import CharField, IntegerField, TextField -from django.db.models.functions import Cast, Coalesce -from django.db.models.lookups import Transform - - -class MySQLSHA2Mixin: - def as_mysql(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, - connection, - template="SHA2(%%(expressions)s, %s)" % self.function[3:], - **extra_context, - ) - - -class OracleHashMixin: - def as_oracle(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, - connection, - template=( - "LOWER(RAWTOHEX(STANDARD_HASH(UTL_I18N.STRING_TO_RAW(" - "%(expressions)s, 'AL32UTF8'), '%(function)s')))" - ), - **extra_context, - ) - - -class PostgreSQLSHAMixin: - def as_postgresql(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, - connection, - template="ENCODE(DIGEST(%(expressions)s, '%(function)s'), 'hex')", - function=self.function.lower(), - **extra_context, - ) - - -class Chr(Transform): - function = "CHR" - lookup_name = "chr" - output_field = CharField() - - def as_mysql(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, - connection, - function="CHAR", - template="%(function)s(%(expressions)s USING utf16)", - **extra_context, - ) - - def as_oracle(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, - connection, - template="%(function)s(%(expressions)s USING NCHAR_CS)", - **extra_context, - ) - - def as_sqlite(self, compiler, connection, **extra_context): - return super().as_sql(compiler, connection, function="CHAR", **extra_context) - - -class ConcatPair(Func): - """ - Concatenate two arguments together. This is used by `Concat` because not - all backend databases support more than two arguments. - """ - - function = "CONCAT" - - def pipes_concat_sql(self, compiler, connection, **extra_context): - coalesced = self.coalesce() - return super(ConcatPair, coalesced).as_sql( - compiler, - connection, - template="(%(expressions)s)", - arg_joiner=" || ", - **extra_context, - ) - - as_sqlite = pipes_concat_sql - - def as_postgresql(self, compiler, connection, **extra_context): - c = self.copy() - c.set_source_expressions( - [ - ( - expression - if isinstance(expression.output_field, (CharField, TextField)) - else Cast(expression, TextField()) - ) - for expression in c.get_source_expressions() - ] - ) - return c.pipes_concat_sql(compiler, connection, **extra_context) - - def as_mysql(self, compiler, connection, **extra_context): - # Use CONCAT_WS with an empty separator so that NULLs are ignored. - return super().as_sql( - compiler, - connection, - function="CONCAT_WS", - template="%(function)s('', %(expressions)s)", - **extra_context, - ) - - def coalesce(self): - # null on either side results in null for expression, wrap with coalesce - c = self.copy() - c.set_source_expressions( - [ - Coalesce(expression, Value("")) - for expression in c.get_source_expressions() - ] - ) - return c - - -class Concat(Func): - """ - Concatenate text fields together. Backends that result in an entire - null expression when any arguments are null will wrap each argument in - coalesce functions to ensure a non-null result. - """ - - function = None - template = "%(expressions)s" - - def __init__(self, *expressions, **extra): - if len(expressions) < 2: - raise ValueError("Concat must take at least two expressions") - paired = self._paired(expressions, output_field=extra.get("output_field")) - super().__init__(paired, **extra) - - def _paired(self, expressions, output_field): - # wrap pairs of expressions in successive concat functions - # exp = [a, b, c, d] - # -> ConcatPair(a, ConcatPair(b, ConcatPair(c, d)))) - if len(expressions) == 2: - return ConcatPair(*expressions, output_field=output_field) - return ConcatPair( - expressions[0], - self._paired(expressions[1:], output_field=output_field), - output_field=output_field, - ) - - -class Left(Func): - function = "LEFT" - arity = 2 - output_field = CharField() - - def __init__(self, expression, length, **extra): - """ - expression: the name of a field, or an expression returning a string - length: the number of characters to return from the start of the string - """ - if not hasattr(length, "resolve_expression"): - if length < 1: - raise ValueError("'length' must be greater than 0.") - super().__init__(expression, length, **extra) - - def get_substr(self): - return Substr(self.source_expressions[0], Value(1), self.source_expressions[1]) - - def as_oracle(self, compiler, connection, **extra_context): - return self.get_substr().as_oracle(compiler, connection, **extra_context) - - def as_sqlite(self, compiler, connection, **extra_context): - return self.get_substr().as_sqlite(compiler, connection, **extra_context) - - -class Length(Transform): - """Return the number of characters in the expression.""" - - function = "LENGTH" - lookup_name = "length" - output_field = IntegerField() - - def as_mysql(self, compiler, connection, **extra_context): - return super().as_sql( - compiler, connection, function="CHAR_LENGTH", **extra_context - ) - - -class Lower(Transform): - function = "LOWER" - lookup_name = "lower" - - -class LPad(Func): - function = "LPAD" - output_field = CharField() - - def __init__(self, expression, length, fill_text=Value(" "), **extra): - if ( - not hasattr(length, "resolve_expression") - and length is not None - and length < 0 - ): - raise ValueError("'length' must be greater or equal to 0.") - super().__init__(expression, length, fill_text, **extra) - - -class LTrim(Transform): - function = "LTRIM" - lookup_name = "ltrim" - - -class MD5(OracleHashMixin, Transform): - function = "MD5" - lookup_name = "md5" - - -class Ord(Transform): - function = "ASCII" - lookup_name = "ord" - output_field = IntegerField() - - def as_mysql(self, compiler, connection, **extra_context): - return super().as_sql(compiler, connection, function="ORD", **extra_context) - - def as_sqlite(self, compiler, connection, **extra_context): - return super().as_sql(compiler, connection, function="UNICODE", **extra_context) - - -class Repeat(Func): - function = "REPEAT" - output_field = CharField() - - def __init__(self, expression, number, **extra): - if ( - not hasattr(number, "resolve_expression") - and number is not None - and number < 0 - ): - raise ValueError("'number' must be greater or equal to 0.") - super().__init__(expression, number, **extra) - - def as_oracle(self, compiler, connection, **extra_context): - expression, number = self.source_expressions - length = None if number is None else Length(expression) * number - rpad = RPad(expression, length, expression) - return rpad.as_sql(compiler, connection, **extra_context) - - -class Replace(Func): - function = "REPLACE" - - def __init__(self, expression, text, replacement=Value(""), **extra): - super().__init__(expression, text, replacement, **extra) - - -class Reverse(Transform): - function = "REVERSE" - lookup_name = "reverse" - - def as_oracle(self, compiler, connection, **extra_context): - # REVERSE in Oracle is undocumented and doesn't support multi-byte - # strings. Use a special subquery instead. - suffix = connection.features.bare_select_suffix - sql, params = super().as_sql( - compiler, - connection, - template=( - "(SELECT LISTAGG(s) WITHIN GROUP (ORDER BY n DESC) FROM " - f"(SELECT LEVEL n, SUBSTR(%(expressions)s, LEVEL, 1) s{suffix} " - "CONNECT BY LEVEL <= LENGTH(%(expressions)s)) " - "GROUP BY %(expressions)s)" - ), - **extra_context, - ) - return sql, params * 3 - - -class Right(Left): - function = "RIGHT" - - def get_substr(self): - return Substr( - self.source_expressions[0], - self.source_expressions[1] * Value(-1), - self.source_expressions[1], - ) - - -class RPad(LPad): - function = "RPAD" - - -class RTrim(Transform): - function = "RTRIM" - lookup_name = "rtrim" - - -class SHA1(OracleHashMixin, PostgreSQLSHAMixin, Transform): - function = "SHA1" - lookup_name = "sha1" - - -class SHA224(MySQLSHA2Mixin, PostgreSQLSHAMixin, Transform): - function = "SHA224" - lookup_name = "sha224" - - def as_oracle(self, compiler, connection, **extra_context): - raise NotSupportedError("SHA224 is not supported on Oracle.") - - -class SHA256(MySQLSHA2Mixin, OracleHashMixin, PostgreSQLSHAMixin, Transform): - function = "SHA256" - lookup_name = "sha256" - - -class SHA384(MySQLSHA2Mixin, OracleHashMixin, PostgreSQLSHAMixin, Transform): - function = "SHA384" - lookup_name = "sha384" - - -class SHA512(MySQLSHA2Mixin, OracleHashMixin, PostgreSQLSHAMixin, Transform): - function = "SHA512" - lookup_name = "sha512" - - -class StrIndex(Func): - """ - Return a positive integer corresponding to the 1-indexed position of the - first occurrence of a substring inside another string, or 0 if the - substring is not found. - """ - - function = "INSTR" - arity = 2 - output_field = IntegerField() - - def as_postgresql(self, compiler, connection, **extra_context): - return super().as_sql(compiler, connection, function="STRPOS", **extra_context) - - -class Substr(Func): - function = "SUBSTRING" - output_field = CharField() - - def __init__(self, expression, pos, length=None, **extra): - """ - expression: the name of a field, or an expression returning a string - pos: an integer > 0, or an expression returning an integer - length: an optional number of characters to return - """ - if not hasattr(pos, "resolve_expression"): - if pos < 1: - raise ValueError("'pos' must be greater than 0") - expressions = [expression, pos] - if length is not None: - expressions.append(length) - super().__init__(*expressions, **extra) - - def as_sqlite(self, compiler, connection, **extra_context): - return super().as_sql(compiler, connection, function="SUBSTR", **extra_context) - - def as_oracle(self, compiler, connection, **extra_context): - return super().as_sql(compiler, connection, function="SUBSTR", **extra_context) - - -class Trim(Transform): - function = "TRIM" - lookup_name = "trim" - - -class Upper(Transform): - function = "UPPER" - lookup_name = "upper" diff --git a/.venv/lib/python3.10/site-packages/django/db/models/functions/window.py b/.venv/lib/python3.10/site-packages/django/db/models/functions/window.py deleted file mode 100644 index 671017a..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/functions/window.py +++ /dev/null @@ -1,120 +0,0 @@ -from django.db.models.expressions import Func -from django.db.models.fields import FloatField, IntegerField - -__all__ = [ - "CumeDist", - "DenseRank", - "FirstValue", - "Lag", - "LastValue", - "Lead", - "NthValue", - "Ntile", - "PercentRank", - "Rank", - "RowNumber", -] - - -class CumeDist(Func): - function = "CUME_DIST" - output_field = FloatField() - window_compatible = True - - -class DenseRank(Func): - function = "DENSE_RANK" - output_field = IntegerField() - window_compatible = True - - -class FirstValue(Func): - arity = 1 - function = "FIRST_VALUE" - window_compatible = True - - -class LagLeadFunction(Func): - window_compatible = True - - def __init__(self, expression, offset=1, default=None, **extra): - if expression is None: - raise ValueError( - "%s requires a non-null source expression." % self.__class__.__name__ - ) - if offset is None or offset <= 0: - raise ValueError( - "%s requires a positive integer for the offset." - % self.__class__.__name__ - ) - args = (expression, offset) - if default is not None: - args += (default,) - super().__init__(*args, **extra) - - def _resolve_output_field(self): - sources = self.get_source_expressions() - return sources[0].output_field - - -class Lag(LagLeadFunction): - function = "LAG" - - -class LastValue(Func): - arity = 1 - function = "LAST_VALUE" - window_compatible = True - - -class Lead(LagLeadFunction): - function = "LEAD" - - -class NthValue(Func): - function = "NTH_VALUE" - window_compatible = True - - def __init__(self, expression, nth=1, **extra): - if expression is None: - raise ValueError( - "%s requires a non-null source expression." % self.__class__.__name__ - ) - if nth is None or nth <= 0: - raise ValueError( - "%s requires a positive integer as for nth." % self.__class__.__name__ - ) - super().__init__(expression, nth, **extra) - - def _resolve_output_field(self): - sources = self.get_source_expressions() - return sources[0].output_field - - -class Ntile(Func): - function = "NTILE" - output_field = IntegerField() - window_compatible = True - - def __init__(self, num_buckets=1, **extra): - if num_buckets <= 0: - raise ValueError("num_buckets must be greater than 0.") - super().__init__(num_buckets, **extra) - - -class PercentRank(Func): - function = "PERCENT_RANK" - output_field = FloatField() - window_compatible = True - - -class Rank(Func): - function = "RANK" - output_field = IntegerField() - window_compatible = True - - -class RowNumber(Func): - function = "ROW_NUMBER" - output_field = IntegerField() - window_compatible = True diff --git a/.venv/lib/python3.10/site-packages/django/db/models/indexes.py b/.venv/lib/python3.10/site-packages/django/db/models/indexes.py deleted file mode 100644 index 0ddfefe..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/indexes.py +++ /dev/null @@ -1,299 +0,0 @@ -from types import NoneType - -from django.db.backends.utils import names_digest, split_identifier -from django.db.models.expressions import Col, ExpressionList, F, Func, OrderBy -from django.db.models.functions import Collate -from django.db.models.query_utils import Q -from django.db.models.sql import Query -from django.utils.functional import partition - -__all__ = ["Index"] - - -class Index: - suffix = "idx" - # The max length of the name of the index (restricted to 30 for - # cross-database compatibility with Oracle) - max_name_length = 30 - - def __init__( - self, - *expressions, - fields=(), - name=None, - db_tablespace=None, - opclasses=(), - condition=None, - include=None, - ): - if opclasses and not name: - raise ValueError("An index must be named to use opclasses.") - if not isinstance(condition, (NoneType, Q)): - raise ValueError("Index.condition must be a Q instance.") - if condition and not name: - raise ValueError("An index must be named to use condition.") - if not isinstance(fields, (list, tuple)): - raise ValueError("Index.fields must be a list or tuple.") - if not isinstance(opclasses, (list, tuple)): - raise ValueError("Index.opclasses must be a list or tuple.") - if not expressions and not fields: - raise ValueError( - "At least one field or expression is required to define an index." - ) - if expressions and fields: - raise ValueError( - "Index.fields and expressions are mutually exclusive.", - ) - if expressions and not name: - raise ValueError("An index must be named to use expressions.") - if expressions and opclasses: - raise ValueError( - "Index.opclasses cannot be used with expressions. Use " - "django.contrib.postgres.indexes.OpClass() instead." - ) - if opclasses and len(fields) != len(opclasses): - raise ValueError( - "Index.fields and Index.opclasses must have the same number of " - "elements." - ) - if fields and not all(isinstance(field, str) for field in fields): - raise ValueError("Index.fields must contain only strings with field names.") - if include and not name: - raise ValueError("A covering index must be named.") - if not isinstance(include, (NoneType, list, tuple)): - raise ValueError("Index.include must be a list or tuple.") - self.fields = list(fields) - # A list of 2-tuple with the field name and ordering ('' or 'DESC'). - self.fields_orders = [ - (field_name.removeprefix("-"), "DESC" if field_name.startswith("-") else "") - for field_name in self.fields - ] - self.name = name or "" - self.db_tablespace = db_tablespace - self.opclasses = opclasses - self.condition = condition - self.include = tuple(include) if include else () - self.expressions = tuple( - F(expression) if isinstance(expression, str) else expression - for expression in expressions - ) - - @property - def contains_expressions(self): - return bool(self.expressions) - - def _get_condition_sql(self, model, schema_editor): - if self.condition is None: - return None - query = Query(model=model, alias_cols=False) - where = query.build_where(self.condition) - compiler = query.get_compiler(connection=schema_editor.connection) - sql, params = where.as_sql(compiler, schema_editor.connection) - return sql % tuple(schema_editor.quote_value(p) for p in params) - - def create_sql(self, model, schema_editor, using="", **kwargs): - include = [ - model._meta.get_field(field_name).column for field_name in self.include - ] - condition = self._get_condition_sql(model, schema_editor) - if self.expressions: - index_expressions = [] - for expression in self.expressions: - index_expression = IndexExpression(expression) - index_expression.set_wrapper_classes(schema_editor.connection) - index_expressions.append(index_expression) - expressions = ExpressionList(*index_expressions).resolve_expression( - Query(model, alias_cols=False), - ) - fields = None - col_suffixes = None - else: - fields = [ - model._meta.get_field(field_name) - for field_name, _ in self.fields_orders - ] - if schema_editor.connection.features.supports_index_column_ordering: - col_suffixes = [order[1] for order in self.fields_orders] - else: - col_suffixes = [""] * len(self.fields_orders) - expressions = None - return schema_editor._create_index_sql( - model, - fields=fields, - name=self.name, - using=using, - db_tablespace=self.db_tablespace, - col_suffixes=col_suffixes, - opclasses=self.opclasses, - condition=condition, - include=include, - expressions=expressions, - **kwargs, - ) - - def remove_sql(self, model, schema_editor, **kwargs): - return schema_editor._delete_index_sql(model, self.name, **kwargs) - - def deconstruct(self): - path = "%s.%s" % (self.__class__.__module__, self.__class__.__name__) - path = path.replace("django.db.models.indexes", "django.db.models") - kwargs = {"name": self.name} - if self.fields: - kwargs["fields"] = self.fields - if self.db_tablespace is not None: - kwargs["db_tablespace"] = self.db_tablespace - if self.opclasses: - kwargs["opclasses"] = self.opclasses - if self.condition: - kwargs["condition"] = self.condition - if self.include: - kwargs["include"] = self.include - return (path, self.expressions, kwargs) - - def clone(self): - """Create a copy of this Index.""" - _, args, kwargs = self.deconstruct() - return self.__class__(*args, **kwargs) - - def set_name_with_model(self, model): - """ - Generate a unique name for the index. - - The name is divided into 3 parts - table name (12 chars), field name - (8 chars) and unique hash + suffix (10 chars). Each part is made to - fit its size by truncating the excess length. - """ - _, table_name = split_identifier(model._meta.db_table) - column_names = [ - model._meta.get_field(field_name).column - for field_name, order in self.fields_orders - ] - column_names_with_order = [ - (("-%s" if order else "%s") % column_name) - for column_name, (field_name, order) in zip( - column_names, self.fields_orders - ) - ] - # The length of the parts of the name is based on the default max - # length of 30 characters. - hash_data = [table_name] + column_names_with_order + [self.suffix] - self.name = "%s_%s_%s" % ( - table_name[:11], - column_names[0][:7], - "%s_%s" % (names_digest(*hash_data, length=6), self.suffix), - ) - if len(self.name) > self.max_name_length: - raise ValueError( - "Index too long for multiple database support. Is self.suffix " - "longer than 3 characters?" - ) - if self.name[0] == "_" or self.name[0].isdigit(): - self.name = "D%s" % self.name[1:] - - def __repr__(self): - return "<%s:%s%s%s%s%s%s%s>" % ( - self.__class__.__qualname__, - "" if not self.fields else " fields=%s" % repr(self.fields), - "" if not self.expressions else " expressions=%s" % repr(self.expressions), - "" if not self.name else " name=%s" % repr(self.name), - ( - "" - if self.db_tablespace is None - else " db_tablespace=%s" % repr(self.db_tablespace) - ), - "" if self.condition is None else " condition=%s" % self.condition, - "" if not self.include else " include=%s" % repr(self.include), - "" if not self.opclasses else " opclasses=%s" % repr(self.opclasses), - ) - - def __eq__(self, other): - if self.__class__ == other.__class__: - return self.deconstruct() == other.deconstruct() - return NotImplemented - - -class IndexExpression(Func): - """Order and wrap expressions for CREATE INDEX statements.""" - - template = "%(expressions)s" - wrapper_classes = (OrderBy, Collate) - - def set_wrapper_classes(self, connection=None): - # Some databases (e.g. MySQL) treats COLLATE as an indexed expression. - if connection and connection.features.collate_as_index_expression: - self.wrapper_classes = tuple( - [ - wrapper_cls - for wrapper_cls in self.wrapper_classes - if wrapper_cls is not Collate - ] - ) - - @classmethod - def register_wrappers(cls, *wrapper_classes): - cls.wrapper_classes = wrapper_classes - - def resolve_expression( - self, - query=None, - allow_joins=True, - reuse=None, - summarize=False, - for_save=False, - ): - expressions = list(self.flatten()) - # Split expressions and wrappers. - index_expressions, wrappers = partition( - lambda e: isinstance(e, self.wrapper_classes), - expressions, - ) - wrapper_types = [type(wrapper) for wrapper in wrappers] - if len(wrapper_types) != len(set(wrapper_types)): - raise ValueError( - "Multiple references to %s can't be used in an indexed " - "expression." - % ", ".join( - [wrapper_cls.__qualname__ for wrapper_cls in self.wrapper_classes] - ) - ) - if expressions[1 : len(wrappers) + 1] != wrappers: - raise ValueError( - "%s must be topmost expressions in an indexed expression." - % ", ".join( - [wrapper_cls.__qualname__ for wrapper_cls in self.wrapper_classes] - ) - ) - # Wrap expressions in parentheses if they are not column references. - root_expression = index_expressions[1] - resolve_root_expression = root_expression.resolve_expression( - query, - allow_joins, - reuse, - summarize, - for_save, - ) - if not isinstance(resolve_root_expression, Col): - root_expression = Func(root_expression, template="(%(expressions)s)") - - if wrappers: - # Order wrappers and set their expressions. - wrappers = sorted( - wrappers, - key=lambda w: self.wrapper_classes.index(type(w)), - ) - wrappers = [wrapper.copy() for wrapper in wrappers] - for i, wrapper in enumerate(wrappers[:-1]): - wrapper.set_source_expressions([wrappers[i + 1]]) - # Set the root expression on the deepest wrapper. - wrappers[-1].set_source_expressions([root_expression]) - self.set_source_expressions([wrappers[0]]) - else: - # Use the root expression, if there are no wrappers. - self.set_source_expressions([root_expression]) - return super().resolve_expression( - query, allow_joins, reuse, summarize, for_save - ) - - def as_sqlite(self, compiler, connection, **extra_context): - # Casting to numeric is unnecessary. - return self.as_sql(compiler, connection, **extra_context) diff --git a/.venv/lib/python3.10/site-packages/django/db/models/lookups.py b/.venv/lib/python3.10/site-packages/django/db/models/lookups.py deleted file mode 100644 index c5b2a7a..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/lookups.py +++ /dev/null @@ -1,837 +0,0 @@ -import itertools -import math -import warnings - -from django.core.exceptions import EmptyResultSet, FullResultSet -from django.db.backends.base.operations import BaseDatabaseOperations -from django.db.models.expressions import ( - Case, - ColPairs, - Expression, - ExpressionList, - Func, - Value, - When, -) -from django.db.models.fields import ( - BooleanField, - CharField, - DateTimeField, - Field, - IntegerField, - UUIDField, -) -from django.db.models.query_utils import RegisterLookupMixin -from django.utils.datastructures import OrderedSet -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.functional import cached_property -from django.utils.hashable import make_hashable - - -class Lookup(Expression): - lookup_name = None - prepare_rhs = True - can_use_none_as_rhs = False - - def __init__(self, lhs, rhs): - self.lhs, self.rhs = lhs, rhs - self.rhs = self.get_prep_lookup() - self.lhs = self.get_prep_lhs() - if hasattr(self.lhs, "get_bilateral_transforms"): - bilateral_transforms = self.lhs.get_bilateral_transforms() - else: - bilateral_transforms = [] - if bilateral_transforms: - # Warn the user as soon as possible if they are trying to apply - # a bilateral transformation on a nested QuerySet: that won't work. - from django.db.models.sql.query import Query # avoid circular import - - if isinstance(rhs, Query): - raise NotImplementedError( - "Bilateral transformations on nested querysets are not implemented." - ) - self.bilateral_transforms = bilateral_transforms - - def apply_bilateral_transforms(self, value): - for transform in self.bilateral_transforms: - value = transform(value) - return value - - def __repr__(self): - return f"{self.__class__.__name__}({self.lhs!r}, {self.rhs!r})" - - def batch_process_rhs(self, compiler, connection, rhs=None): - if rhs is None: - rhs = self.rhs - if self.bilateral_transforms: - sqls, sqls_params = [], [] - for p in rhs: - value = Value(p, output_field=self.lhs.output_field) - value = self.apply_bilateral_transforms(value) - value = value.resolve_expression(compiler.query) - sql, sql_params = compiler.compile(value) - sqls.append(sql) - sqls_params.extend(sql_params) - else: - _, params = self.get_db_prep_lookup(rhs, connection) - sqls, sqls_params = ["%s"] * len(params), params - return sqls, sqls_params - - def get_source_expressions(self): - if self.rhs_is_direct_value(): - return [self.lhs] - return [self.lhs, self.rhs] - - def set_source_expressions(self, new_exprs): - if len(new_exprs) == 1: - self.lhs = new_exprs[0] - else: - self.lhs, self.rhs = new_exprs - - def get_prep_lookup(self): - if not self.prepare_rhs or hasattr(self.rhs, "resolve_expression"): - return self.rhs - if hasattr(self.lhs, "output_field"): - if hasattr(self.lhs.output_field, "get_prep_value"): - return self.lhs.output_field.get_prep_value(self.rhs) - elif self.rhs_is_direct_value(): - return Value(self.rhs) - return self.rhs - - def get_prep_lhs(self): - if hasattr(self.lhs, "resolve_expression"): - return self.lhs - return Value(self.lhs) - - def get_db_prep_lookup(self, value, connection): - return ("%s", [value]) - - def process_lhs(self, compiler, connection, lhs=None): - lhs = lhs or self.lhs - if hasattr(lhs, "resolve_expression"): - lhs = lhs.resolve_expression(compiler.query) - sql, params = compiler.compile(lhs) - if isinstance(lhs, Lookup): - # Wrapped in parentheses to respect operator precedence. - sql = f"({sql})" - return sql, params - - def process_rhs(self, compiler, connection): - value = self.rhs - if self.bilateral_transforms: - if self.rhs_is_direct_value(): - # Do not call get_db_prep_lookup here as the value will be - # transformed before being used for lookup - value = Value(value, output_field=self.lhs.output_field) - value = self.apply_bilateral_transforms(value) - value = value.resolve_expression(compiler.query) - if hasattr(value, "as_sql"): - sql, params = compiler.compile(value) - if isinstance(value, ColPairs): - raise ValueError( - "CompositePrimaryKey cannot be used as a lookup value." - ) - # Ensure expression is wrapped in parentheses to respect operator - # precedence but avoid double wrapping as it can be misinterpreted - # on some backends (e.g. subqueries on SQLite). - if not isinstance(value, Value) and sql and sql[0] != "(": - sql = "(%s)" % sql - return sql, params - else: - return self.get_db_prep_lookup(value, connection) - - def rhs_is_direct_value(self): - return not hasattr(self.rhs, "as_sql") - - def get_group_by_cols(self): - cols = [] - for source in self.get_source_expressions(): - cols.extend(source.get_group_by_cols()) - return cols - - def as_oracle(self, compiler, connection): - # Oracle doesn't allow EXISTS() and filters to be compared to another - # expression unless they're wrapped in a CASE WHEN. - wrapped = False - exprs = [] - for expr in (self.lhs, self.rhs): - if connection.ops.conditional_expression_supported_in_where_clause(expr): - expr = Case(When(expr, then=True), default=False) - wrapped = True - exprs.append(expr) - lookup = type(self)(*exprs) if wrapped else self - return lookup.as_sql(compiler, connection) - - @cached_property - def output_field(self): - return BooleanField() - - @property - def identity(self): - return self.__class__, self.lhs, self.rhs - - def __eq__(self, other): - if not isinstance(other, Lookup): - return NotImplemented - return self.identity == other.identity - - def __hash__(self): - return hash(make_hashable(self.identity)) - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - c = self.copy() - c.is_summary = summarize - c.lhs = self.lhs.resolve_expression( - query, allow_joins, reuse, summarize, for_save - ) - if hasattr(self.rhs, "resolve_expression"): - c.rhs = self.rhs.resolve_expression( - query, allow_joins, reuse, summarize, for_save - ) - return c - - def select_format(self, compiler, sql, params): - # Wrap filters with a CASE WHEN expression if a database backend - # (e.g. Oracle) doesn't support boolean expression in SELECT or GROUP - # BY list. - if not compiler.connection.features.supports_boolean_expr_in_select_clause: - sql = f"CASE WHEN {sql} THEN 1 ELSE 0 END" - return sql, params - - @cached_property - def allowed_default(self): - return self.lhs.allowed_default and self.rhs.allowed_default - - -class Transform(RegisterLookupMixin, Func): - """ - RegisterLookupMixin() is first so that get_lookup() and get_transform() - first examine self and then check output_field. - """ - - bilateral = False - arity = 1 - - @property - def lhs(self): - return self.get_source_expressions()[0] - - def get_bilateral_transforms(self): - if hasattr(self.lhs, "get_bilateral_transforms"): - bilateral_transforms = self.lhs.get_bilateral_transforms() - else: - bilateral_transforms = [] - if self.bilateral: - bilateral_transforms.append(self.__class__) - return bilateral_transforms - - -class BuiltinLookup(Lookup): - def process_lhs(self, compiler, connection, lhs=None): - lhs_sql, params = super().process_lhs(compiler, connection, lhs) - field_internal_type = self.lhs.output_field.get_internal_type() - if ( - hasattr(connection.ops.__class__, "field_cast_sql") - and connection.ops.__class__.field_cast_sql - is not BaseDatabaseOperations.field_cast_sql - ): - warnings.warn( - ( - "The usage of DatabaseOperations.field_cast_sql() is deprecated. " - "Implement DatabaseOperations.lookup_cast() instead." - ), - RemovedInDjango60Warning, - ) - db_type = self.lhs.output_field.db_type(connection=connection) - lhs_sql = ( - connection.ops.field_cast_sql(db_type, field_internal_type) % lhs_sql - ) - lhs_sql = ( - connection.ops.lookup_cast(self.lookup_name, field_internal_type) % lhs_sql - ) - return lhs_sql, list(params) - - def as_sql(self, compiler, connection): - lhs_sql, params = self.process_lhs(compiler, connection) - rhs_sql, rhs_params = self.process_rhs(compiler, connection) - params.extend(rhs_params) - rhs_sql = self.get_rhs_op(connection, rhs_sql) - return "%s %s" % (lhs_sql, rhs_sql), params - - def get_rhs_op(self, connection, rhs): - return connection.operators[self.lookup_name] % rhs - - -class FieldGetDbPrepValueMixin: - """ - Some lookups require Field.get_db_prep_value() to be called on their - inputs. - """ - - get_db_prep_lookup_value_is_iterable = False - - def get_db_prep_lookup(self, value, connection): - # For relational fields, use the 'target_field' attribute of the - # output_field. - field = getattr(self.lhs.output_field, "target_field", None) - get_db_prep_value = ( - getattr(field, "get_db_prep_value", None) - or self.lhs.output_field.get_db_prep_value - ) - if not self.get_db_prep_lookup_value_is_iterable: - value = [value] - return ( - "%s", - [ - ( - v - if hasattr(v, "as_sql") - else get_db_prep_value(v, connection, prepared=True) - ) - for v in value - ], - ) - - -class FieldGetDbPrepValueIterableMixin(FieldGetDbPrepValueMixin): - """ - Some lookups require Field.get_db_prep_value() to be called on each value - in an iterable. - """ - - get_db_prep_lookup_value_is_iterable = True - - def get_prep_lookup(self): - if hasattr(self.rhs, "resolve_expression"): - return self.rhs - contains_expr = False - prepared_values = [] - for rhs_value in self.rhs: - if hasattr(rhs_value, "resolve_expression"): - # An expression will be handled by the database but can coexist - # alongside real values. - contains_expr = True - elif ( - self.prepare_rhs - and hasattr(self.lhs, "output_field") - and hasattr(self.lhs.output_field, "get_prep_value") - ): - rhs_value = self.lhs.output_field.get_prep_value(rhs_value) - prepared_values.append(rhs_value) - if contains_expr: - return ExpressionList( - *[ - # Expression defaults `str` to field references while - # lookups default them to literal values. - ( - Value(prep_value, self.lhs.output_field) - if isinstance(prep_value, str) - else prep_value - ) - for prep_value in prepared_values - ] - ) - return prepared_values - - def process_rhs(self, compiler, connection): - if self.rhs_is_direct_value(): - # rhs should be an iterable of values. Use batch_process_rhs() - # to prepare/transform those values. - return self.batch_process_rhs(compiler, connection) - elif isinstance(self.rhs, ExpressionList): - # rhs contains at least one expression. Unwrap them and delegate - # to batch_process_rhs() to prepare/transform those values. - copy = self.copy() - copy.rhs = self.rhs.get_source_expressions() - return copy.process_rhs(compiler, connection) - else: - return super().process_rhs(compiler, connection) - - def resolve_expression_parameter(self, compiler, connection, sql, param): - params = [param] - if hasattr(param, "resolve_expression"): - param = param.resolve_expression(compiler.query) - if hasattr(param, "as_sql"): - sql, params = compiler.compile(param) - return sql, params - - def batch_process_rhs(self, compiler, connection, rhs=None): - pre_processed = super().batch_process_rhs(compiler, connection, rhs) - # The params list may contain expressions which compile to a - # sql/param pair. Zip them to get sql and param pairs that refer to the - # same argument and attempt to replace them with the result of - # compiling the param step. - sql, params = zip( - *( - self.resolve_expression_parameter(compiler, connection, sql, param) - for sql, param in zip(*pre_processed) - ) - ) - params = itertools.chain.from_iterable(params) - return sql, tuple(params) - - -class PostgresOperatorLookup(Lookup): - """Lookup defined by operators on PostgreSQL.""" - - postgres_operator = None - - def as_postgresql(self, compiler, connection): - lhs, lhs_params = self.process_lhs(compiler, connection) - rhs, rhs_params = self.process_rhs(compiler, connection) - params = tuple(lhs_params) + tuple(rhs_params) - return "%s %s %s" % (lhs, self.postgres_operator, rhs), params - - -@Field.register_lookup -class Exact(FieldGetDbPrepValueMixin, BuiltinLookup): - lookup_name = "exact" - - def get_prep_lookup(self): - from django.db.models.sql.query import Query # avoid circular import - - if isinstance(query := self.rhs, Query): - if not query.has_limit_one(): - raise ValueError( - "The QuerySet value for an exact lookup must be limited to " - "one result using slicing." - ) - lhs_len = len(self.lhs) if isinstance(self.lhs, (ColPairs, tuple)) else 1 - if (rhs_len := query._subquery_fields_len) != lhs_len: - raise ValueError( - f"The QuerySet value for the exact lookup must have {lhs_len} " - f"selected fields (received {rhs_len})" - ) - if not query.has_select_fields: - query.clear_select_clause() - query.add_fields(["pk"]) - return super().get_prep_lookup() - - def as_sql(self, compiler, connection): - # Avoid comparison against direct rhs if lhs is a boolean value. That - # turns "boolfield__exact=True" into "WHERE boolean_field" instead of - # "WHERE boolean_field = True" when allowed. - if ( - isinstance(self.rhs, bool) - and getattr(self.lhs, "conditional", False) - and connection.ops.conditional_expression_supported_in_where_clause( - self.lhs - ) - ): - lhs_sql, params = self.process_lhs(compiler, connection) - template = "%s" if self.rhs else "NOT %s" - return template % lhs_sql, params - return super().as_sql(compiler, connection) - - -@Field.register_lookup -class IExact(BuiltinLookup): - lookup_name = "iexact" - prepare_rhs = False - - def process_rhs(self, qn, connection): - rhs, params = super().process_rhs(qn, connection) - if params: - params[0] = connection.ops.prep_for_iexact_query(params[0]) - return rhs, params - - -@Field.register_lookup -class GreaterThan(FieldGetDbPrepValueMixin, BuiltinLookup): - lookup_name = "gt" - - -@Field.register_lookup -class GreaterThanOrEqual(FieldGetDbPrepValueMixin, BuiltinLookup): - lookup_name = "gte" - - -@Field.register_lookup -class LessThan(FieldGetDbPrepValueMixin, BuiltinLookup): - lookup_name = "lt" - - -@Field.register_lookup -class LessThanOrEqual(FieldGetDbPrepValueMixin, BuiltinLookup): - lookup_name = "lte" - - -class IntegerFieldOverflow: - underflow_exception = EmptyResultSet - overflow_exception = EmptyResultSet - - def process_rhs(self, compiler, connection): - rhs = self.rhs - if isinstance(rhs, int): - field_internal_type = self.lhs.output_field.get_internal_type() - min_value, max_value = connection.ops.integer_field_range( - field_internal_type - ) - if min_value is not None and rhs < min_value: - raise self.underflow_exception - if max_value is not None and rhs > max_value: - raise self.overflow_exception - return super().process_rhs(compiler, connection) - - -class IntegerFieldFloatRounding: - """ - Allow floats to work as query values for IntegerField. Without this, the - decimal portion of the float would always be discarded. - """ - - def get_prep_lookup(self): - if isinstance(self.rhs, float): - self.rhs = math.ceil(self.rhs) - return super().get_prep_lookup() - - -@IntegerField.register_lookup -class IntegerFieldExact(IntegerFieldOverflow, Exact): - pass - - -@IntegerField.register_lookup -class IntegerGreaterThan(IntegerFieldOverflow, GreaterThan): - underflow_exception = FullResultSet - - -@IntegerField.register_lookup -class IntegerGreaterThanOrEqual( - IntegerFieldOverflow, IntegerFieldFloatRounding, GreaterThanOrEqual -): - underflow_exception = FullResultSet - - -@IntegerField.register_lookup -class IntegerLessThan(IntegerFieldOverflow, IntegerFieldFloatRounding, LessThan): - overflow_exception = FullResultSet - - -@IntegerField.register_lookup -class IntegerLessThanOrEqual(IntegerFieldOverflow, LessThanOrEqual): - overflow_exception = FullResultSet - - -@Field.register_lookup -class In(FieldGetDbPrepValueIterableMixin, BuiltinLookup): - lookup_name = "in" - - def get_prep_lookup(self): - from django.db.models.sql.query import Query # avoid circular import - - if isinstance(self.rhs, Query): - lhs_len = len(self.lhs) if isinstance(self.lhs, (ColPairs, tuple)) else 1 - if (rhs_len := self.rhs._subquery_fields_len) != lhs_len: - raise ValueError( - f"The QuerySet value for the 'in' lookup must have {lhs_len} " - f"selected fields (received {rhs_len})" - ) - self.rhs.clear_ordering(clear_default=True) - if not self.rhs.has_select_fields: - self.rhs.clear_select_clause() - self.rhs.add_fields(["pk"]) - return super().get_prep_lookup() - - def process_rhs(self, compiler, connection): - db_rhs = getattr(self.rhs, "_db", None) - if db_rhs is not None and db_rhs != connection.alias: - raise ValueError( - "Subqueries aren't allowed across different databases. Force " - "the inner query to be evaluated using `list(inner_query)`." - ) - - if self.rhs_is_direct_value(): - # Remove None from the list as NULL is never equal to anything. - try: - rhs = OrderedSet(self.rhs) - rhs.discard(None) - except TypeError: # Unhashable items in self.rhs - rhs = [r for r in self.rhs if r is not None] - - if not rhs: - raise EmptyResultSet - - # rhs should be an iterable; use batch_process_rhs() to - # prepare/transform those values. - sqls, sqls_params = self.batch_process_rhs(compiler, connection, rhs) - placeholder = "(" + ", ".join(sqls) + ")" - return (placeholder, sqls_params) - return super().process_rhs(compiler, connection) - - def get_rhs_op(self, connection, rhs): - return "IN %s" % rhs - - def as_sql(self, compiler, connection): - max_in_list_size = connection.ops.max_in_list_size() - if ( - self.rhs_is_direct_value() - and max_in_list_size - and len(self.rhs) > max_in_list_size - ): - return self.split_parameter_list_as_sql(compiler, connection) - return super().as_sql(compiler, connection) - - def split_parameter_list_as_sql(self, compiler, connection): - # This is a special case for databases which limit the number of - # elements which can appear in an 'IN' clause. - max_in_list_size = connection.ops.max_in_list_size() - lhs, lhs_params = self.process_lhs(compiler, connection) - rhs, rhs_params = self.batch_process_rhs(compiler, connection) - in_clause_elements = ["("] - params = [] - for offset in range(0, len(rhs_params), max_in_list_size): - if offset > 0: - in_clause_elements.append(" OR ") - in_clause_elements.append("%s IN (" % lhs) - params.extend(lhs_params) - sqls = rhs[offset : offset + max_in_list_size] - sqls_params = rhs_params[offset : offset + max_in_list_size] - param_group = ", ".join(sqls) - in_clause_elements.append(param_group) - in_clause_elements.append(")") - params.extend(sqls_params) - in_clause_elements.append(")") - return "".join(in_clause_elements), params - - -class PatternLookup(BuiltinLookup): - param_pattern = "%%%s%%" - prepare_rhs = False - - def get_rhs_op(self, connection, rhs): - # Assume we are in startswith. We need to produce SQL like: - # col LIKE %s, ['thevalue%'] - # For python values we can (and should) do that directly in Python, - # but if the value is for example reference to other column, then - # we need to add the % pattern match to the lookup by something like - # col LIKE othercol || '%%' - # So, for Python values we don't need any special pattern, but for - # SQL reference values or SQL transformations we need the correct - # pattern added. - if hasattr(self.rhs, "as_sql") or self.bilateral_transforms: - pattern = connection.pattern_ops[self.lookup_name].format( - connection.pattern_esc - ) - return pattern.format(rhs) - else: - return super().get_rhs_op(connection, rhs) - - def process_rhs(self, qn, connection): - rhs, params = super().process_rhs(qn, connection) - if self.rhs_is_direct_value() and params and not self.bilateral_transforms: - params[0] = self.param_pattern % connection.ops.prep_for_like_query( - params[0] - ) - return rhs, params - - -@Field.register_lookup -class Contains(PatternLookup): - lookup_name = "contains" - - -@Field.register_lookup -class IContains(Contains): - lookup_name = "icontains" - - -@Field.register_lookup -class StartsWith(PatternLookup): - lookup_name = "startswith" - param_pattern = "%s%%" - - -@Field.register_lookup -class IStartsWith(StartsWith): - lookup_name = "istartswith" - - -@Field.register_lookup -class EndsWith(PatternLookup): - lookup_name = "endswith" - param_pattern = "%%%s" - - -@Field.register_lookup -class IEndsWith(EndsWith): - lookup_name = "iendswith" - - -@Field.register_lookup -class Range(FieldGetDbPrepValueIterableMixin, BuiltinLookup): - lookup_name = "range" - - def get_rhs_op(self, connection, rhs): - return "BETWEEN %s AND %s" % (rhs[0], rhs[1]) - - -@Field.register_lookup -class IsNull(BuiltinLookup): - lookup_name = "isnull" - prepare_rhs = False - - def as_sql(self, compiler, connection): - if not isinstance(self.rhs, bool): - raise ValueError( - "The QuerySet value for an isnull lookup must be True or False." - ) - if isinstance(self.lhs, Value): - if self.lhs.value is None or ( - self.lhs.value == "" - and connection.features.interprets_empty_strings_as_nulls - ): - result_exception = FullResultSet if self.rhs else EmptyResultSet - else: - result_exception = EmptyResultSet if self.rhs else FullResultSet - raise result_exception - sql, params = self.process_lhs(compiler, connection) - if self.rhs: - return "%s IS NULL" % sql, params - else: - return "%s IS NOT NULL" % sql, params - - -@Field.register_lookup -class Regex(BuiltinLookup): - lookup_name = "regex" - prepare_rhs = False - - def as_sql(self, compiler, connection): - if self.lookup_name in connection.operators: - return super().as_sql(compiler, connection) - else: - lhs, lhs_params = self.process_lhs(compiler, connection) - rhs, rhs_params = self.process_rhs(compiler, connection) - sql_template = connection.ops.regex_lookup(self.lookup_name) - return sql_template % (lhs, rhs), lhs_params + rhs_params - - -@Field.register_lookup -class IRegex(Regex): - lookup_name = "iregex" - - -class YearLookup(Lookup): - def year_lookup_bounds(self, connection, year): - from django.db.models.functions import ExtractIsoYear - - iso_year = isinstance(self.lhs, ExtractIsoYear) - output_field = self.lhs.lhs.output_field - if isinstance(output_field, DateTimeField): - bounds = connection.ops.year_lookup_bounds_for_datetime_field( - year, - iso_year=iso_year, - ) - else: - bounds = connection.ops.year_lookup_bounds_for_date_field( - year, - iso_year=iso_year, - ) - return bounds - - def as_sql(self, compiler, connection): - # Avoid the extract operation if the rhs is a direct value to allow - # indexes to be used. - if self.rhs_is_direct_value(): - # Skip the extract part by directly using the originating field, - # that is self.lhs.lhs. - lhs_sql, params = self.process_lhs(compiler, connection, self.lhs.lhs) - rhs_sql, _ = self.process_rhs(compiler, connection) - rhs_sql = self.get_direct_rhs_sql(connection, rhs_sql) - start, finish = self.year_lookup_bounds(connection, self.rhs) - params.extend(self.get_bound_params(start, finish)) - return "%s %s" % (lhs_sql, rhs_sql), params - return super().as_sql(compiler, connection) - - def get_direct_rhs_sql(self, connection, rhs): - return connection.operators[self.lookup_name] % rhs - - def get_bound_params(self, start, finish): - raise NotImplementedError( - "subclasses of YearLookup must provide a get_bound_params() method" - ) - - -class YearExact(YearLookup, Exact): - def get_direct_rhs_sql(self, connection, rhs): - return "BETWEEN %s AND %s" - - def get_bound_params(self, start, finish): - return (start, finish) - - -class YearGt(YearLookup, GreaterThan): - def get_bound_params(self, start, finish): - return (finish,) - - -class YearGte(YearLookup, GreaterThanOrEqual): - def get_bound_params(self, start, finish): - return (start,) - - -class YearLt(YearLookup, LessThan): - def get_bound_params(self, start, finish): - return (start,) - - -class YearLte(YearLookup, LessThanOrEqual): - def get_bound_params(self, start, finish): - return (finish,) - - -class UUIDTextMixin: - """ - Strip hyphens from a value when filtering a UUIDField on backends without - a native datatype for UUID. - """ - - def process_rhs(self, qn, connection): - if not connection.features.has_native_uuid_field: - from django.db.models.functions import Replace - - if self.rhs_is_direct_value(): - self.rhs = Value(self.rhs) - self.rhs = Replace( - self.rhs, Value("-"), Value(""), output_field=CharField() - ) - rhs, params = super().process_rhs(qn, connection) - return rhs, params - - -@UUIDField.register_lookup -class UUIDIExact(UUIDTextMixin, IExact): - pass - - -@UUIDField.register_lookup -class UUIDContains(UUIDTextMixin, Contains): - pass - - -@UUIDField.register_lookup -class UUIDIContains(UUIDTextMixin, IContains): - pass - - -@UUIDField.register_lookup -class UUIDStartsWith(UUIDTextMixin, StartsWith): - pass - - -@UUIDField.register_lookup -class UUIDIStartsWith(UUIDTextMixin, IStartsWith): - pass - - -@UUIDField.register_lookup -class UUIDEndsWith(UUIDTextMixin, EndsWith): - pass - - -@UUIDField.register_lookup -class UUIDIEndsWith(UUIDTextMixin, IEndsWith): - pass diff --git a/.venv/lib/python3.10/site-packages/django/db/models/manager.py b/.venv/lib/python3.10/site-packages/django/db/models/manager.py deleted file mode 100644 index 467e79f..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/manager.py +++ /dev/null @@ -1,213 +0,0 @@ -import copy -import inspect -from functools import wraps -from importlib import import_module - -from django.db import router -from django.db.models.query import QuerySet - - -class BaseManager: - # To retain order, track each time a Manager instance is created. - creation_counter = 0 - - # Set to True for the 'objects' managers that are automatically created. - auto_created = False - - #: If set to True the manager will be serialized into migrations and will - #: thus be available in e.g. RunPython operations. - use_in_migrations = False - - def __new__(cls, *args, **kwargs): - # Capture the arguments to make returning them trivial. - obj = super().__new__(cls) - obj._constructor_args = (args, kwargs) - return obj - - def __init__(self): - super().__init__() - self._set_creation_counter() - self.model = None - self.name = None - self._db = None - self._hints = {} - - def __str__(self): - """Return "app_label.model_label.manager_name".""" - return "%s.%s" % (self.model._meta.label, self.name) - - def __class_getitem__(cls, *args, **kwargs): - return cls - - def deconstruct(self): - """ - Return a 5-tuple of the form (as_manager (True), manager_class, - queryset_class, args, kwargs). - - Raise a ValueError if the manager is dynamically generated. - """ - qs_class = self._queryset_class - if getattr(self, "_built_with_as_manager", False): - # using MyQuerySet.as_manager() - return ( - True, # as_manager - None, # manager_class - "%s.%s" % (qs_class.__module__, qs_class.__name__), # qs_class - None, # args - None, # kwargs - ) - else: - module_name = self.__module__ - name = self.__class__.__name__ - # Make sure it's actually there and not an inner class - module = import_module(module_name) - if not hasattr(module, name): - raise ValueError( - "Could not find manager %s in %s.\n" - "Please note that you need to inherit from managers you " - "dynamically generated with 'from_queryset()'." - % (name, module_name) - ) - return ( - False, # as_manager - "%s.%s" % (module_name, name), # manager_class - None, # qs_class - self._constructor_args[0], # args - self._constructor_args[1], # kwargs - ) - - def check(self, **kwargs): - return [] - - @classmethod - def _get_queryset_methods(cls, queryset_class): - def create_method(name, method): - @wraps(method) - def manager_method(self, *args, **kwargs): - return getattr(self.get_queryset(), name)(*args, **kwargs) - - return manager_method - - new_methods = {} - for name, method in inspect.getmembers( - queryset_class, predicate=inspect.isfunction - ): - # Only copy missing methods. - if hasattr(cls, name): - continue - # Only copy public methods or methods with the attribute - # queryset_only=False. - queryset_only = getattr(method, "queryset_only", None) - if queryset_only or (queryset_only is None and name.startswith("_")): - continue - # Copy the method onto the manager. - new_methods[name] = create_method(name, method) - return new_methods - - @classmethod - def from_queryset(cls, queryset_class, class_name=None): - if class_name is None: - class_name = "%sFrom%s" % (cls.__name__, queryset_class.__name__) - return type( - class_name, - (cls,), - { - "_queryset_class": queryset_class, - **cls._get_queryset_methods(queryset_class), - }, - ) - - def contribute_to_class(self, cls, name): - self.name = self.name or name - self.model = cls - - setattr(cls, name, ManagerDescriptor(self)) - - cls._meta.add_manager(self) - - def _set_creation_counter(self): - """ - Set the creation counter value for this instance and increment the - class-level copy. - """ - self.creation_counter = BaseManager.creation_counter - BaseManager.creation_counter += 1 - - def db_manager(self, using=None, hints=None): - obj = copy.copy(self) - obj._db = using or self._db - obj._hints = hints or self._hints - return obj - - @property - def db(self): - return self._db or router.db_for_read(self.model, **self._hints) - - ####################### - # PROXIES TO QUERYSET # - ####################### - - def get_queryset(self): - """ - Return a new QuerySet object. Subclasses can override this method to - customize the behavior of the Manager. - """ - return self._queryset_class(model=self.model, using=self._db, hints=self._hints) - - def all(self): - # We can't proxy this method through the `QuerySet` like we do for the - # rest of the `QuerySet` methods. This is because `QuerySet.all()` - # works by creating a "copy" of the current queryset and in making said - # copy, all the cached `prefetch_related` lookups are lost. See the - # implementation of `RelatedManager.get_queryset()` for a better - # understanding of how this comes into play. - return self.get_queryset() - - def __eq__(self, other): - return ( - isinstance(other, self.__class__) - and self._constructor_args == other._constructor_args - ) - - def __hash__(self): - return id(self) - - -class Manager(BaseManager.from_queryset(QuerySet)): - pass - - -class ManagerDescriptor: - def __init__(self, manager): - self.manager = manager - - def __get__(self, instance, cls=None): - if instance is not None: - raise AttributeError( - "Manager isn't accessible via %s instances" % cls.__name__ - ) - - if cls._meta.abstract: - raise AttributeError( - "Manager isn't available; %s is abstract" % (cls._meta.object_name,) - ) - - if cls._meta.swapped: - raise AttributeError( - "Manager isn't available; '%s' has been swapped for '%s'" - % ( - cls._meta.label, - cls._meta.swapped, - ) - ) - - return cls._meta.managers_map[self.manager.name] - - -class EmptyManager(Manager): - def __init__(self, model): - super().__init__() - self.model = model - - def get_queryset(self): - return super().get_queryset().none() diff --git a/.venv/lib/python3.10/site-packages/django/db/models/options.py b/.venv/lib/python3.10/site-packages/django/db/models/options.py deleted file mode 100644 index 11b2742..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/options.py +++ /dev/null @@ -1,1043 +0,0 @@ -import bisect -import copy -from collections import defaultdict - -from django.apps import apps -from django.conf import settings -from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured -from django.core.signals import setting_changed -from django.db import connections -from django.db.models import ( - AutoField, - CompositePrimaryKey, - Manager, - OrderWrt, - UniqueConstraint, -) -from django.db.models.fields import composite -from django.db.models.query_utils import PathInfo -from django.utils.datastructures import ImmutableList, OrderedSet -from django.utils.functional import cached_property -from django.utils.module_loading import import_string -from django.utils.text import camel_case_to_spaces, format_lazy -from django.utils.translation import override - -PROXY_PARENTS = object() - -EMPTY_RELATION_TREE = () - -IMMUTABLE_WARNING = ( - "The return type of '%s' should never be mutated. If you want to manipulate this " - "list for your own use, make a copy first." -) - -DEFAULT_NAMES = ( - "verbose_name", - "verbose_name_plural", - "db_table", - "db_table_comment", - "ordering", - "unique_together", - "permissions", - "get_latest_by", - "order_with_respect_to", - "app_label", - "db_tablespace", - "abstract", - "managed", - "proxy", - "swappable", - "auto_created", - "apps", - "default_permissions", - "select_on_save", - "default_related_name", - "required_db_features", - "required_db_vendor", - "base_manager_name", - "default_manager_name", - "indexes", - "constraints", -) - - -def normalize_together(option_together): - """ - option_together can be either a tuple of tuples, or a single - tuple of two strings. Normalize it to a tuple of tuples, so that - calling code can uniformly expect that. - """ - try: - if not option_together: - return () - if not isinstance(option_together, (tuple, list)): - raise TypeError - first_element = option_together[0] - if not isinstance(first_element, (tuple, list)): - option_together = (option_together,) - # Normalize everything to tuples - return tuple(tuple(ot) for ot in option_together) - except TypeError: - # If the value of option_together isn't valid, return it - # verbatim; this will be picked up by the check framework later. - return option_together - - -def make_immutable_fields_list(name, data): - return ImmutableList(data, warning=IMMUTABLE_WARNING % name) - - -class Options: - FORWARD_PROPERTIES = { - "fields", - "many_to_many", - "concrete_fields", - "local_concrete_fields", - "_non_pk_concrete_field_names", - "_reverse_one_to_one_field_names", - "_forward_fields_map", - "managers", - "managers_map", - "base_manager", - "default_manager", - } - REVERSE_PROPERTIES = {"related_objects", "fields_map", "_relation_tree"} - - default_apps = apps - - def __init__(self, meta, app_label=None): - self._get_fields_cache = {} - self.local_fields = [] - self.local_many_to_many = [] - self.private_fields = [] - self.local_managers = [] - self.base_manager_name = None - self.default_manager_name = None - self.model_name = None - self.verbose_name = None - self.verbose_name_plural = None - self.db_table = "" - self.db_table_comment = "" - self.ordering = [] - self._ordering_clash = False - self.indexes = [] - self.constraints = [] - self.unique_together = [] - self.select_on_save = False - self.default_permissions = ("add", "change", "delete", "view") - self.permissions = [] - self.object_name = None - self.app_label = app_label - self.get_latest_by = None - self.order_with_respect_to = None - self.db_tablespace = settings.DEFAULT_TABLESPACE - self.required_db_features = [] - self.required_db_vendor = None - self.meta = meta - self.pk = None - self.auto_field = None - self.abstract = False - self.managed = True - self.proxy = False - # For any class that is a proxy (including automatically created - # classes for deferred object loading), proxy_for_model tells us - # which class this model is proxying. Note that proxy_for_model - # can create a chain of proxy models. For non-proxy models, the - # variable is always None. - self.proxy_for_model = None - # For any non-abstract class, the concrete class is the model - # in the end of the proxy_for_model chain. In particular, for - # concrete models, the concrete_model is always the class itself. - self.concrete_model = None - self.swappable = None - self.parents = {} - self.auto_created = False - - # List of all lookups defined in ForeignKey 'limit_choices_to' options - # from *other* models. Needed for some admin checks. Internal use only. - self.related_fkey_lookups = [] - - # A custom app registry to use, if you're making a separate model set. - self.apps = self.default_apps - - self.default_related_name = None - - @property - def label(self): - return "%s.%s" % (self.app_label, self.object_name) - - @property - def label_lower(self): - return "%s.%s" % (self.app_label, self.model_name) - - @property - def app_config(self): - # Don't go through get_app_config to avoid triggering imports. - return self.apps.app_configs.get(self.app_label) - - def contribute_to_class(self, cls, name): - from django.db import connection - from django.db.backends.utils import truncate_name - - cls._meta = self - self.model = cls - # First, construct the default values for these options. - self.object_name = cls.__name__ - self.model_name = self.object_name.lower() - self.verbose_name = camel_case_to_spaces(self.object_name) - - # Store the original user-defined values for each option, - # for use when serializing the model definition - self.original_attrs = {} - - # Next, apply any overridden values from 'class Meta'. - if self.meta: - meta_attrs = self.meta.__dict__.copy() - for name in self.meta.__dict__: - # Ignore any private attributes that Django doesn't care about. - # NOTE: We can't modify a dictionary's contents while looping - # over it, so we loop over the *original* dictionary instead. - if name.startswith("_"): - del meta_attrs[name] - for attr_name in DEFAULT_NAMES: - if attr_name in meta_attrs: - setattr(self, attr_name, meta_attrs.pop(attr_name)) - self.original_attrs[attr_name] = getattr(self, attr_name) - elif hasattr(self.meta, attr_name): - setattr(self, attr_name, getattr(self.meta, attr_name)) - self.original_attrs[attr_name] = getattr(self, attr_name) - - self.unique_together = normalize_together(self.unique_together) - # App label/class name interpolation for names of constraints and - # indexes. - if not self.abstract: - self.constraints = self._format_names(self.constraints) - self.indexes = self._format_names(self.indexes) - - # verbose_name_plural is a special case because it uses a 's' - # by default. - if self.verbose_name_plural is None: - self.verbose_name_plural = format_lazy("{}s", self.verbose_name) - - # order_with_respect_and ordering are mutually exclusive. - self._ordering_clash = bool(self.ordering and self.order_with_respect_to) - - # Any leftover attributes must be invalid. - if meta_attrs != {}: - raise TypeError( - "'class Meta' got invalid attribute(s): %s" % ",".join(meta_attrs) - ) - else: - self.verbose_name_plural = format_lazy("{}s", self.verbose_name) - del self.meta - - # If the db_table wasn't provided, use the app_label + model_name. - if not self.db_table: - self.db_table = "%s_%s" % (self.app_label, self.model_name) - self.db_table = truncate_name( - self.db_table, connection.ops.max_name_length() - ) - - if self.swappable: - setting_changed.connect(self.setting_changed) - - def _format_names(self, objs): - """App label/class name interpolation for object names.""" - names = {"app_label": self.app_label.lower(), "class": self.model_name} - new_objs = [] - for obj in objs: - obj = obj.clone() - obj.name %= names - new_objs.append(obj) - return new_objs - - def _get_default_pk_class(self): - pk_class_path = getattr( - self.app_config, - "default_auto_field", - settings.DEFAULT_AUTO_FIELD, - ) - if self.app_config and self.app_config._is_default_auto_field_overridden: - app_config_class = type(self.app_config) - source = ( - f"{app_config_class.__module__}." - f"{app_config_class.__qualname__}.default_auto_field" - ) - else: - source = "DEFAULT_AUTO_FIELD" - if not pk_class_path: - raise ImproperlyConfigured(f"{source} must not be empty.") - try: - pk_class = import_string(pk_class_path) - except ImportError as e: - msg = ( - f"{source} refers to the module '{pk_class_path}' that could " - f"not be imported." - ) - raise ImproperlyConfigured(msg) from e - if not issubclass(pk_class, AutoField): - raise ValueError( - f"Primary key '{pk_class_path}' referred by {source} must " - f"subclass AutoField." - ) - return pk_class - - def _prepare(self, model): - if self.order_with_respect_to: - # The app registry will not be ready at this point, so we cannot - # use get_field(). - query = self.order_with_respect_to - try: - self.order_with_respect_to = next( - f - for f in self._get_fields(reverse=False) - if f.name == query or f.attname == query - ) - except StopIteration: - raise FieldDoesNotExist( - "%s has no field named '%s'" % (self.object_name, query) - ) - - self.ordering = ("_order",) - if not any( - isinstance(field, OrderWrt) for field in model._meta.local_fields - ): - model.add_to_class("_order", OrderWrt()) - else: - self.order_with_respect_to = None - - if self.pk is None: - if self.parents: - # Promote the first parent link in lieu of adding yet another - # field. - field = next(iter(self.parents.values())) - # Look for a local field with the same name as the - # first parent link. If a local field has already been - # created, use it instead of promoting the parent - already_created = [ - fld for fld in self.local_fields if fld.name == field.name - ] - if already_created: - field = already_created[0] - field.primary_key = True - self.setup_pk(field) - else: - pk_class = self._get_default_pk_class() - auto = pk_class(verbose_name="ID", primary_key=True, auto_created=True) - model.add_to_class("id", auto) - - def add_manager(self, manager): - self.local_managers.append(manager) - self._expire_cache() - - def add_field(self, field, private=False): - # Insert the given field in the order in which it was created, using - # the "creation_counter" attribute of the field. - # Move many-to-many related fields from self.fields into - # self.many_to_many. - if private: - self.private_fields.append(field) - elif field.is_relation and field.many_to_many: - bisect.insort(self.local_many_to_many, field) - else: - bisect.insort(self.local_fields, field) - self.setup_pk(field) - - # If the field being added is a relation to another known field, - # expire the cache on this field and the forward cache on the field - # being referenced, because there will be new relationships in the - # cache. Otherwise, expire the cache of references *to* this field. - # The mechanism for getting at the related model is slightly odd - - # ideally, we'd just ask for field.related_model. However, related_model - # is a cached property, and all the models haven't been loaded yet, so - # we need to make sure we don't cache a string reference. - if ( - field.is_relation - and hasattr(field.remote_field, "model") - and field.remote_field.model - ): - try: - field.remote_field.model._meta._expire_cache(forward=False) - except AttributeError: - pass - self._expire_cache() - else: - self._expire_cache(reverse=False) - - def setup_pk(self, field): - if not self.pk and field.primary_key: - self.pk = field - field.serialize = False - - def setup_proxy(self, target): - """ - Do the internal setup so that the current model is a proxy for - "target". - """ - self.pk = target._meta.pk - self.proxy_for_model = target - self.db_table = target._meta.db_table - - def __repr__(self): - return "" % self.object_name - - def __str__(self): - return self.label_lower - - def can_migrate(self, connection): - """ - Return True if the model can/should be migrated on the `connection`. - `connection` can be either a real connection or a connection alias. - """ - if self.proxy or self.swapped or not self.managed: - return False - if isinstance(connection, str): - connection = connections[connection] - if self.required_db_vendor: - return self.required_db_vendor == connection.vendor - if self.required_db_features: - return all( - getattr(connection.features, feat, False) - for feat in self.required_db_features - ) - return True - - @cached_property - def verbose_name_raw(self): - """Return the untranslated verbose name.""" - if isinstance(self.verbose_name, str): - return self.verbose_name - with override(None): - return str(self.verbose_name) - - @cached_property - def swapped(self): - """ - Has this model been swapped out for another? If so, return the model - name of the replacement; otherwise, return None. - - For historical reasons, model name lookups using get_model() are - case insensitive, so we make sure we are case insensitive here. - """ - if self.swappable: - swapped_for = getattr(settings, self.swappable, None) - if swapped_for: - try: - swapped_label, swapped_object = swapped_for.split(".") - except ValueError: - # setting not in the format app_label.model_name - # raising ImproperlyConfigured here causes problems with - # test cleanup code - instead it is raised in get_user_model - # or as part of validation. - return swapped_for - - if ( - "%s.%s" % (swapped_label, swapped_object.lower()) - != self.label_lower - ): - return swapped_for - return None - - def setting_changed(self, *, setting, **kwargs): - if setting == self.swappable and "swapped" in self.__dict__: - del self.swapped - - @cached_property - def managers(self): - managers = [] - seen_managers = set() - bases = (b for b in self.model.mro() if hasattr(b, "_meta")) - for depth, base in enumerate(bases): - for manager in base._meta.local_managers: - if manager.name in seen_managers: - continue - - manager = copy.copy(manager) - manager.model = self.model - seen_managers.add(manager.name) - managers.append((depth, manager.creation_counter, manager)) - - return make_immutable_fields_list( - "managers", - (m[2] for m in sorted(managers)), - ) - - @cached_property - def managers_map(self): - return {manager.name: manager for manager in self.managers} - - @cached_property - def base_manager(self): - base_manager_name = self.base_manager_name - if not base_manager_name: - # Get the first parent's base_manager_name if there's one. - for parent in self.model.mro()[1:]: - if hasattr(parent, "_meta"): - if parent._base_manager.name != "_base_manager": - base_manager_name = parent._base_manager.name - break - - if base_manager_name: - try: - return self.managers_map[base_manager_name] - except KeyError: - raise ValueError( - "%s has no manager named %r" - % ( - self.object_name, - base_manager_name, - ) - ) - - manager = Manager() - manager.name = "_base_manager" - manager.model = self.model - manager.auto_created = True - return manager - - @cached_property - def default_manager(self): - default_manager_name = self.default_manager_name - if not default_manager_name and not self.local_managers: - # Get the first parent's default_manager_name if there's one. - for parent in self.model.mro()[1:]: - if hasattr(parent, "_meta"): - default_manager_name = parent._meta.default_manager_name - break - - if default_manager_name: - try: - return self.managers_map[default_manager_name] - except KeyError: - raise ValueError( - "%s has no manager named %r" - % ( - self.object_name, - default_manager_name, - ) - ) - - if self.managers: - return self.managers[0] - - @cached_property - def fields(self): - """ - Return a list of all forward fields on the model and its parents, - excluding ManyToManyFields. - - Private API intended only to be used by Django itself; get_fields() - combined with filtering of field properties is the public API for - obtaining this field list. - """ - - # For legacy reasons, the fields property should only contain forward - # fields that are not private or with a m2m cardinality. Therefore we - # pass these three filters as filters to the generator. - # The third lambda is a longwinded way of checking f.related_model - we don't - # use that property directly because related_model is a cached property, - # and all the models may not have been loaded yet; we don't want to cache - # the string reference to the related_model. - def is_not_an_m2m_field(f): - return not (f.is_relation and f.many_to_many) - - def is_not_a_generic_relation(f): - return not (f.is_relation and f.one_to_many) - - def is_not_a_generic_foreign_key(f): - return not ( - f.is_relation - and f.many_to_one - and not (hasattr(f.remote_field, "model") and f.remote_field.model) - ) - - return make_immutable_fields_list( - "fields", - ( - f - for f in self._get_fields(reverse=False) - if is_not_an_m2m_field(f) - and is_not_a_generic_relation(f) - and is_not_a_generic_foreign_key(f) - ), - ) - - @cached_property - def concrete_fields(self): - """ - Return a list of all concrete fields on the model and its parents. - - Private API intended only to be used by Django itself; get_fields() - combined with filtering of field properties is the public API for - obtaining this field list. - """ - return make_immutable_fields_list( - "concrete_fields", (f for f in self.fields if f.concrete) - ) - - @cached_property - def local_concrete_fields(self): - """ - Return a list of all concrete fields on the model. - - Private API intended only to be used by Django itself; get_fields() - combined with filtering of field properties is the public API for - obtaining this field list. - """ - return make_immutable_fields_list( - "local_concrete_fields", (f for f in self.local_fields if f.concrete) - ) - - @cached_property - def many_to_many(self): - """ - Return a list of all many to many fields on the model and its parents. - - Private API intended only to be used by Django itself; get_fields() - combined with filtering of field properties is the public API for - obtaining this list. - """ - return make_immutable_fields_list( - "many_to_many", - ( - f - for f in self._get_fields(reverse=False) - if f.is_relation and f.many_to_many - ), - ) - - @cached_property - def related_objects(self): - """ - Return all related objects pointing to the current model. The related - objects can come from a one-to-one, one-to-many, or many-to-many field - relation type. - - Private API intended only to be used by Django itself; get_fields() - combined with filtering of field properties is the public API for - obtaining this field list. - """ - all_related_fields = self._get_fields( - forward=False, reverse=True, include_hidden=True - ) - return make_immutable_fields_list( - "related_objects", - ( - obj - for obj in all_related_fields - if not obj.hidden or obj.field.many_to_many - ), - ) - - @cached_property - def _forward_fields_map(self): - res = {} - fields = self._get_fields(reverse=False) - for field in fields: - res[field.name] = field - # Due to the way Django's internals work, get_field() should also - # be able to fetch a field by attname. In the case of a concrete - # field with relation, includes the *_id name too - try: - res[field.attname] = field - except AttributeError: - pass - return res - - @cached_property - def fields_map(self): - res = {} - fields = self._get_fields(forward=False, include_hidden=True) - for field in fields: - res[field.name] = field - # Due to the way Django's internals work, get_field() should also - # be able to fetch a field by attname. In the case of a concrete - # field with relation, includes the *_id name too - try: - res[field.attname] = field - except AttributeError: - pass - return res - - def get_field(self, field_name): - """ - Return a field instance given the name of a forward or reverse field. - """ - try: - # In order to avoid premature loading of the relation tree - # (expensive) we prefer checking if the field is a forward field. - return self._forward_fields_map[field_name] - except KeyError: - # If the app registry is not ready, reverse fields are - # unavailable, therefore we throw a FieldDoesNotExist exception. - if not self.apps.models_ready: - raise FieldDoesNotExist( - "%s has no field named '%s'. The app cache isn't ready yet, " - "so if this is an auto-created related field, it won't " - "be available yet." % (self.object_name, field_name) - ) - - try: - # Retrieve field instance by name from cached or just-computed - # field map. - return self.fields_map[field_name] - except KeyError: - raise FieldDoesNotExist( - "%s has no field named '%s'" % (self.object_name, field_name) - ) - - def get_base_chain(self, model): - """ - Return a list of parent classes leading to `model` (ordered from - closest to most distant ancestor). This has to handle the case where - `model` is a grandparent or even more distant relation. - """ - if not self.parents: - return [] - if model in self.parents: - return [model] - for parent in self.parents: - res = parent._meta.get_base_chain(model) - if res: - res.insert(0, parent) - return res - return [] - - @cached_property - def all_parents(self): - """ - Return all the ancestors of this model as a tuple ordered by MRO. - Useful for determining if something is an ancestor, regardless of lineage. - """ - result = OrderedSet(self.parents) - for parent in self.parents: - for ancestor in parent._meta.all_parents: - result.add(ancestor) - return tuple(result) - - def get_parent_list(self): - """ - Return all the ancestors of this model as a list ordered by MRO. - Backward compatibility method. - """ - return list(self.all_parents) - - def get_ancestor_link(self, ancestor): - """ - Return the field on the current model which points to the given - "ancestor". This is possible an indirect link (a pointer to a parent - model, which points, eventually, to the ancestor). Used when - constructing table joins for model inheritance. - - Return None if the model isn't an ancestor of this one. - """ - if ancestor in self.parents: - return self.parents[ancestor] - for parent in self.parents: - # Tries to get a link field from the immediate parent - parent_link = parent._meta.get_ancestor_link(ancestor) - if parent_link: - # In case of a proxied model, the first link - # of the chain to the ancestor is that parent - # links - return self.parents[parent] or parent_link - - def get_path_to_parent(self, parent): - """ - Return a list of PathInfos containing the path from the current - model to the parent model, or an empty list if parent is not a - parent of the current model. - """ - if self.model is parent: - return [] - # Skip the chain of proxy to the concrete proxied model. - proxied_model = self.concrete_model - path = [] - opts = self - for int_model in self.get_base_chain(parent): - if int_model is proxied_model: - opts = int_model._meta - else: - final_field = opts.parents[int_model] - targets = (final_field.remote_field.get_related_field(),) - opts = int_model._meta - path.append( - PathInfo( - from_opts=final_field.model._meta, - to_opts=opts, - target_fields=targets, - join_field=final_field, - m2m=False, - direct=True, - filtered_relation=None, - ) - ) - return path - - def get_path_from_parent(self, parent): - """ - Return a list of PathInfos containing the path from the parent - model to the current model, or an empty list if parent is not a - parent of the current model. - """ - if self.model is parent: - return [] - model = self.concrete_model - # Get a reversed base chain including both the current and parent - # models. - chain = model._meta.get_base_chain(parent) - chain.reverse() - chain.append(model) - # Construct a list of the PathInfos between models in chain. - path = [] - for i, ancestor in enumerate(chain[:-1]): - child = chain[i + 1] - link = child._meta.get_ancestor_link(ancestor) - path.extend(link.reverse_path_infos) - return path - - def _populate_directed_relation_graph(self): - """ - This method is used by each model to find its reverse objects. As this - method is very expensive and is accessed frequently (it looks up every - field in a model, in every app), it is computed on first access and then - is set as a property on every model. - """ - related_objects_graph = defaultdict(list) - - all_models = self.apps.get_models(include_auto_created=True) - for model in all_models: - opts = model._meta - # Abstract model's fields are copied to child models, hence we will - # see the fields from the child models. - if opts.abstract: - continue - fields_with_relations = ( - f - for f in opts._get_fields(reverse=False, include_parents=False) - if f.is_relation and f.related_model is not None - ) - for f in fields_with_relations: - if not isinstance(f.remote_field.model, str): - remote_label = f.remote_field.model._meta.concrete_model._meta.label - related_objects_graph[remote_label].append(f) - - for model in all_models: - # Set the relation_tree using the internal __dict__. In this way - # we avoid calling the cached property. In attribute lookup, - # __dict__ takes precedence over a data descriptor (such as - # @cached_property). This means that the _meta._relation_tree is - # only called if related_objects is not in __dict__. - related_objects = related_objects_graph[ - model._meta.concrete_model._meta.label - ] - model._meta.__dict__["_relation_tree"] = related_objects - # It seems it is possible that self is not in all_models, so guard - # against that with default for get(). - return self.__dict__.get("_relation_tree", EMPTY_RELATION_TREE) - - @cached_property - def _relation_tree(self): - return self._populate_directed_relation_graph() - - def _expire_cache(self, forward=True, reverse=True): - # This method is usually called by apps.cache_clear(), when the - # registry is finalized, or when a new field is added. - if forward: - for cache_key in self.FORWARD_PROPERTIES: - if cache_key in self.__dict__: - delattr(self, cache_key) - if reverse and not self.abstract: - for cache_key in self.REVERSE_PROPERTIES: - if cache_key in self.__dict__: - delattr(self, cache_key) - self._get_fields_cache = {} - - def get_fields(self, include_parents=True, include_hidden=False): - """ - Return a list of fields associated to the model. By default, include - forward and reverse fields, fields derived from inheritance, but not - hidden fields. The returned fields can be changed using the parameters: - - - include_parents: include fields derived from inheritance - - include_hidden: include fields that have a related_name that - starts with a "+" - """ - if include_parents is False: - include_parents = PROXY_PARENTS - return self._get_fields( - include_parents=include_parents, include_hidden=include_hidden - ) - - def _get_fields( - self, - forward=True, - reverse=True, - include_parents=True, - include_hidden=False, - topmost_call=True, - ): - """ - Internal helper function to return fields of the model. - * If forward=True, then fields defined on this model are returned. - * If reverse=True, then relations pointing to this model are returned. - * If include_hidden=True, then fields with is_hidden=True are returned. - * The include_parents argument toggles if fields from parent models - should be included. It has three values: True, False, and - PROXY_PARENTS. When set to PROXY_PARENTS, the call will return all - fields defined for the current model or any of its parents in the - parent chain to the model's concrete model. - """ - if include_parents not in (True, False, PROXY_PARENTS): - raise TypeError( - "Invalid argument for include_parents: %s" % (include_parents,) - ) - # This helper function is used to allow recursion in ``get_fields()`` - # implementation and to provide a fast way for Django's internals to - # access specific subsets of fields. - - # Creates a cache key composed of all arguments - cache_key = (forward, reverse, include_parents, include_hidden, topmost_call) - - try: - # In order to avoid list manipulation. Always return a shallow copy - # of the results. - return self._get_fields_cache[cache_key] - except KeyError: - pass - - fields = [] - # Recursively call _get_fields() on each parent, with the same - # options provided in this call. - if include_parents is not False: - # In diamond inheritance it is possible that we see the same model - # from two different routes. In that case, avoid adding fields from - # the same parent again. - parent_fields = set() - for parent in self.parents: - if ( - parent._meta.concrete_model != self.concrete_model - and include_parents == PROXY_PARENTS - ): - continue - for obj in parent._meta._get_fields( - forward=forward, - reverse=reverse, - include_parents=include_parents, - include_hidden=include_hidden, - topmost_call=False, - ): - if ( - not getattr(obj, "parent_link", False) - or obj.model == self.concrete_model - ) and obj not in parent_fields: - fields.append(obj) - parent_fields.add(obj) - - if reverse and not self.proxy: - # Tree is computed once and cached until the app cache is expired. - # It is composed of a list of fields pointing to the current model - # from other models. - all_fields = self._relation_tree - for field in all_fields: - # If hidden fields should be included or the relation is not - # intentionally hidden, add to the fields dict. - if include_hidden or not field.remote_field.hidden: - fields.append(field.remote_field) - - if forward: - fields += self.local_fields - fields += self.local_many_to_many - # Private fields are recopied to each child model, and they get a - # different model as field.model in each child. Hence we have to - # add the private fields separately from the topmost call. If we - # did this recursively similar to local_fields, we would get field - # instances with field.model != self.model. - if topmost_call: - fields += self.private_fields - - # In order to avoid list manipulation. Always - # return a shallow copy of the results - fields = make_immutable_fields_list("get_fields()", fields) - - # Store result into cache for later access - self._get_fields_cache[cache_key] = fields - return fields - - @cached_property - def total_unique_constraints(self): - """ - Return a list of total unique constraints. Useful for determining set - of fields guaranteed to be unique for all rows. - """ - return [ - constraint - for constraint in self.constraints - if ( - isinstance(constraint, UniqueConstraint) - and constraint.condition is None - and not constraint.contains_expressions - ) - ] - - @cached_property - def pk_fields(self): - return composite.unnest([self.pk]) - - @property - def is_composite_pk(self): - return isinstance(self.pk, CompositePrimaryKey) - - @cached_property - def _property_names(self): - """Return a set of the names of the properties defined on the model.""" - names = set() - seen = set() - for klass in self.model.__mro__: - names |= { - name - for name, value in klass.__dict__.items() - if isinstance(value, property) and name not in seen - } - seen |= set(klass.__dict__) - return frozenset(names) - - @cached_property - def _non_pk_concrete_field_names(self): - """ - Return a set of the non-pk concrete field names defined on the model. - """ - names = [] - all_pk_fields = set(self.pk_fields) - for parent in self.all_parents: - all_pk_fields.update(parent._meta.pk_fields) - for field in self.concrete_fields: - if field not in all_pk_fields: - names.append(field.name) - if field.name != field.attname: - names.append(field.attname) - return frozenset(names) - - @cached_property - def _reverse_one_to_one_field_names(self): - """ - Return a set of reverse one to one field names pointing to the current - model. - """ - return frozenset( - field.name for field in self.related_objects if field.one_to_one - ) - - @cached_property - def db_returning_fields(self): - """ - Private API intended only to be used by Django itself. - Fields to be returned after a database insert. - """ - return [ - field - for field in self._get_fields( - forward=True, reverse=False, include_parents=PROXY_PARENTS - ) - if getattr(field, "db_returning", False) - ] diff --git a/.venv/lib/python3.10/site-packages/django/db/models/query.py b/.venv/lib/python3.10/site-packages/django/db/models/query.py deleted file mode 100644 index b898f3e..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/query.py +++ /dev/null @@ -1,2735 +0,0 @@ -""" -The main QuerySet implementation. This provides the public API for the ORM. -""" - -import copy -import operator -import warnings -from itertools import chain, islice - -from asgiref.sync import sync_to_async - -import django -from django.conf import settings -from django.core import exceptions -from django.db import ( - DJANGO_VERSION_PICKLE_KEY, - IntegrityError, - NotSupportedError, - connections, - router, - transaction, -) -from django.db.models import AutoField, DateField, DateTimeField, Field, sql -from django.db.models.constants import LOOKUP_SEP, OnConflict -from django.db.models.deletion import Collector -from django.db.models.expressions import Case, F, Value, When -from django.db.models.functions import Cast, Trunc -from django.db.models.query_utils import FilteredRelation, Q -from django.db.models.sql.constants import GET_ITERATOR_CHUNK_SIZE, ROW_COUNT -from django.db.models.utils import ( - AltersData, - create_namedtuple_class, - resolve_callables, -) -from django.utils import timezone -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.functional import cached_property, partition - -# The maximum number of results to fetch in a get() query. -MAX_GET_RESULTS = 21 - -# The maximum number of items to display in a QuerySet.__repr__ -REPR_OUTPUT_SIZE = 20 - - -class BaseIterable: - def __init__( - self, queryset, chunked_fetch=False, chunk_size=GET_ITERATOR_CHUNK_SIZE - ): - self.queryset = queryset - self.chunked_fetch = chunked_fetch - self.chunk_size = chunk_size - - async def _async_generator(self): - # Generators don't actually start running until the first time you call - # next() on them, so make the generator object in the async thread and - # then repeatedly dispatch to it in a sync thread. - sync_generator = self.__iter__() - - def next_slice(gen): - return list(islice(gen, self.chunk_size)) - - while True: - chunk = await sync_to_async(next_slice)(sync_generator) - for item in chunk: - yield item - if len(chunk) < self.chunk_size: - break - - # __aiter__() is a *synchronous* method that has to then return an - # *asynchronous* iterator/generator. Thus, nest an async generator inside - # it. - # This is a generic iterable converter for now, and is going to suffer a - # performance penalty on large sets of items due to the cost of crossing - # over the sync barrier for each chunk. Custom __aiter__() methods should - # be added to each Iterable subclass, but that needs some work in the - # Compiler first. - def __aiter__(self): - return self._async_generator() - - -class ModelIterable(BaseIterable): - """Iterable that yields a model instance for each row.""" - - def __iter__(self): - queryset = self.queryset - db = queryset.db - compiler = queryset.query.get_compiler(using=db) - # Execute the query. This will also fill compiler.select, klass_info, - # and annotations. - results = compiler.execute_sql( - chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size - ) - select, klass_info, annotation_col_map = ( - compiler.select, - compiler.klass_info, - compiler.annotation_col_map, - ) - model_cls = klass_info["model"] - select_fields = klass_info["select_fields"] - model_fields_start, model_fields_end = select_fields[0], select_fields[-1] + 1 - init_list = [ - f[0].target.attname for f in select[model_fields_start:model_fields_end] - ] - related_populators = get_related_populators(klass_info, select, db) - known_related_objects = [ - ( - field, - related_objs, - operator.attrgetter( - *[ - ( - field.attname - if from_field == "self" - else queryset.model._meta.get_field(from_field).attname - ) - for from_field in field.from_fields - ] - ), - ) - for field, related_objs in queryset._known_related_objects.items() - ] - for row in compiler.results_iter(results): - obj = model_cls.from_db( - db, init_list, row[model_fields_start:model_fields_end] - ) - for rel_populator in related_populators: - rel_populator.populate(row, obj) - if annotation_col_map: - for attr_name, col_pos in annotation_col_map.items(): - setattr(obj, attr_name, row[col_pos]) - - # Add the known related objects to the model. - for field, rel_objs, rel_getter in known_related_objects: - # Avoid overwriting objects loaded by, e.g., select_related(). - if field.is_cached(obj): - continue - rel_obj_id = rel_getter(obj) - try: - rel_obj = rel_objs[rel_obj_id] - except KeyError: - pass # May happen in qs1 | qs2 scenarios. - else: - setattr(obj, field.name, rel_obj) - - yield obj - - -class RawModelIterable(BaseIterable): - """ - Iterable that yields a model instance for each row from a raw queryset. - """ - - def __iter__(self): - # Cache some things for performance reasons outside the loop. - db = self.queryset.db - query = self.queryset.query - connection = connections[db] - compiler = connection.ops.compiler("SQLCompiler")(query, connection, db) - query_iterator = iter(query) - - try: - ( - model_init_names, - model_init_pos, - annotation_fields, - ) = self.queryset.resolve_model_init_order() - model_cls = self.queryset.model - if model_cls._meta.pk.attname not in model_init_names: - raise exceptions.FieldDoesNotExist( - "Raw query must include the primary key" - ) - fields = [self.queryset.model_fields.get(c) for c in self.queryset.columns] - cols = [f.get_col(f.model._meta.db_table) if f else None for f in fields] - converters = compiler.get_converters(cols) - if converters: - query_iterator = compiler.apply_converters(query_iterator, converters) - if compiler.has_composite_fields(cols): - query_iterator = compiler.composite_fields_to_tuples( - query_iterator, cols - ) - for values in query_iterator: - # Associate fields to values - model_init_values = [values[pos] for pos in model_init_pos] - instance = model_cls.from_db(db, model_init_names, model_init_values) - if annotation_fields: - for column, pos in annotation_fields: - setattr(instance, column, values[pos]) - yield instance - finally: - # Done iterating the Query. If it has its own cursor, close it. - if hasattr(query, "cursor") and query.cursor: - query.cursor.close() - - -class ValuesIterable(BaseIterable): - """ - Iterable returned by QuerySet.values() that yields a dict for each row. - """ - - def __iter__(self): - queryset = self.queryset - query = queryset.query - compiler = query.get_compiler(queryset.db) - - if query.selected: - names = list(query.selected) - else: - # extra(select=...) cols are always at the start of the row. - names = [ - *query.extra_select, - *query.values_select, - *query.annotation_select, - ] - indexes = range(len(names)) - for row in compiler.results_iter( - chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size - ): - yield {names[i]: row[i] for i in indexes} - - -class ValuesListIterable(BaseIterable): - """ - Iterable returned by QuerySet.values_list(flat=False) that yields a tuple - for each row. - """ - - def __iter__(self): - queryset = self.queryset - query = queryset.query - compiler = query.get_compiler(queryset.db) - return compiler.results_iter( - tuple_expected=True, - chunked_fetch=self.chunked_fetch, - chunk_size=self.chunk_size, - ) - - -class NamedValuesListIterable(ValuesListIterable): - """ - Iterable returned by QuerySet.values_list(named=True) that yields a - namedtuple for each row. - """ - - def __iter__(self): - queryset = self.queryset - if queryset._fields: - names = queryset._fields - else: - query = queryset.query - names = [ - *query.extra_select, - *query.values_select, - *query.annotation_select, - ] - tuple_class = create_namedtuple_class(*names) - new = tuple.__new__ - for row in super().__iter__(): - yield new(tuple_class, row) - - -class FlatValuesListIterable(BaseIterable): - """ - Iterable returned by QuerySet.values_list(flat=True) that yields single - values. - """ - - def __iter__(self): - queryset = self.queryset - compiler = queryset.query.get_compiler(queryset.db) - for row in compiler.results_iter( - chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size - ): - yield row[0] - - -class QuerySet(AltersData): - """Represent a lazy database lookup for a set of objects.""" - - def __init__(self, model=None, query=None, using=None, hints=None): - self.model = model - self._db = using - self._hints = hints or {} - self._query = query or sql.Query(self.model) - self._result_cache = None - self._sticky_filter = False - self._for_write = False - self._prefetch_related_lookups = () - self._prefetch_done = False - self._known_related_objects = {} # {rel_field: {pk: rel_obj}} - self._iterable_class = ModelIterable - self._fields = None - self._defer_next_filter = False - self._deferred_filter = None - - @property - def query(self): - if self._deferred_filter: - negate, args, kwargs = self._deferred_filter - self._filter_or_exclude_inplace(negate, args, kwargs) - self._deferred_filter = None - return self._query - - @query.setter - def query(self, value): - if value.values_select: - self._iterable_class = ValuesIterable - self._query = value - - def as_manager(cls): - # Address the circular dependency between `Queryset` and `Manager`. - from django.db.models.manager import Manager - - manager = Manager.from_queryset(cls)() - manager._built_with_as_manager = True - return manager - - as_manager.queryset_only = True - as_manager = classmethod(as_manager) - - ######################## - # PYTHON MAGIC METHODS # - ######################## - - def __deepcopy__(self, memo): - """Don't populate the QuerySet's cache.""" - obj = self.__class__() - for k, v in self.__dict__.items(): - if k == "_result_cache": - obj.__dict__[k] = None - else: - obj.__dict__[k] = copy.deepcopy(v, memo) - return obj - - def __getstate__(self): - # Force the cache to be fully populated. - self._fetch_all() - return {**self.__dict__, DJANGO_VERSION_PICKLE_KEY: django.__version__} - - def __setstate__(self, state): - pickled_version = state.get(DJANGO_VERSION_PICKLE_KEY) - if pickled_version: - if pickled_version != django.__version__: - warnings.warn( - "Pickled queryset instance's Django version %s does not " - "match the current version %s." - % (pickled_version, django.__version__), - RuntimeWarning, - stacklevel=2, - ) - else: - warnings.warn( - "Pickled queryset instance's Django version is not specified.", - RuntimeWarning, - stacklevel=2, - ) - self.__dict__.update(state) - - def __repr__(self): - data = list(self[: REPR_OUTPUT_SIZE + 1]) - if len(data) > REPR_OUTPUT_SIZE: - data[-1] = "...(remaining elements truncated)..." - return "<%s %r>" % (self.__class__.__name__, data) - - def __len__(self): - self._fetch_all() - return len(self._result_cache) - - def __iter__(self): - """ - The queryset iterator protocol uses three nested iterators in the - default case: - 1. sql.compiler.execute_sql() - - Returns 100 rows at time (constants.GET_ITERATOR_CHUNK_SIZE) - using cursor.fetchmany(). This part is responsible for - doing some column masking, and returning the rows in chunks. - 2. sql.compiler.results_iter() - - Returns one row at time. At this point the rows are still just - tuples. In some cases the return values are converted to - Python values at this location. - 3. self.iterator() - - Responsible for turning the rows into model objects. - """ - self._fetch_all() - return iter(self._result_cache) - - def __aiter__(self): - # Remember, __aiter__ itself is synchronous, it's the thing it returns - # that is async! - async def generator(): - await sync_to_async(self._fetch_all)() - for item in self._result_cache: - yield item - - return generator() - - def __bool__(self): - self._fetch_all() - return bool(self._result_cache) - - def __getitem__(self, k): - """Retrieve an item or slice from the set of results.""" - if not isinstance(k, (int, slice)): - raise TypeError( - "QuerySet indices must be integers or slices, not %s." - % type(k).__name__ - ) - if (isinstance(k, int) and k < 0) or ( - isinstance(k, slice) - and ( - (k.start is not None and k.start < 0) - or (k.stop is not None and k.stop < 0) - ) - ): - raise ValueError("Negative indexing is not supported.") - - if self._result_cache is not None: - return self._result_cache[k] - - if isinstance(k, slice): - qs = self._chain() - if k.start is not None: - start = int(k.start) - else: - start = None - if k.stop is not None: - stop = int(k.stop) - else: - stop = None - qs.query.set_limits(start, stop) - return list(qs)[:: k.step] if k.step else qs - - qs = self._chain() - qs.query.set_limits(k, k + 1) - qs._fetch_all() - return qs._result_cache[0] - - def __class_getitem__(cls, *args, **kwargs): - return cls - - def __and__(self, other): - self._check_operator_queryset(other, "&") - self._merge_sanity_check(other) - if isinstance(other, EmptyQuerySet): - return other - if isinstance(self, EmptyQuerySet): - return self - combined = self._chain() - combined._merge_known_related_objects(other) - combined.query.combine(other.query, sql.AND) - return combined - - def __or__(self, other): - self._check_operator_queryset(other, "|") - self._merge_sanity_check(other) - if isinstance(self, EmptyQuerySet): - return other - if isinstance(other, EmptyQuerySet): - return self - query = ( - self - if self.query.can_filter() - else self.model._base_manager.filter(pk__in=self.values("pk")) - ) - combined = query._chain() - combined._merge_known_related_objects(other) - if not other.query.can_filter(): - other = other.model._base_manager.filter(pk__in=other.values("pk")) - combined.query.combine(other.query, sql.OR) - return combined - - def __xor__(self, other): - self._check_operator_queryset(other, "^") - self._merge_sanity_check(other) - if isinstance(self, EmptyQuerySet): - return other - if isinstance(other, EmptyQuerySet): - return self - query = ( - self - if self.query.can_filter() - else self.model._base_manager.filter(pk__in=self.values("pk")) - ) - combined = query._chain() - combined._merge_known_related_objects(other) - if not other.query.can_filter(): - other = other.model._base_manager.filter(pk__in=other.values("pk")) - combined.query.combine(other.query, sql.XOR) - return combined - - #################################### - # METHODS THAT DO DATABASE QUERIES # - #################################### - - def _iterator(self, use_chunked_fetch, chunk_size): - iterable = self._iterable_class( - self, - chunked_fetch=use_chunked_fetch, - chunk_size=chunk_size or 2000, - ) - if not self._prefetch_related_lookups or chunk_size is None: - yield from iterable - return - - iterator = iter(iterable) - while results := list(islice(iterator, chunk_size)): - prefetch_related_objects(results, *self._prefetch_related_lookups) - yield from results - - def iterator(self, chunk_size=None): - """ - An iterator over the results from applying this QuerySet to the - database. chunk_size must be provided for QuerySets that prefetch - related objects. Otherwise, a default chunk_size of 2000 is supplied. - """ - if chunk_size is None: - if self._prefetch_related_lookups: - raise ValueError( - "chunk_size must be provided when using QuerySet.iterator() after " - "prefetch_related()." - ) - elif chunk_size <= 0: - raise ValueError("Chunk size must be strictly positive.") - use_chunked_fetch = not connections[self.db].settings_dict.get( - "DISABLE_SERVER_SIDE_CURSORS" - ) - return self._iterator(use_chunked_fetch, chunk_size) - - async def aiterator(self, chunk_size=2000): - """ - An asynchronous iterator over the results from applying this QuerySet - to the database. - """ - if chunk_size <= 0: - raise ValueError("Chunk size must be strictly positive.") - use_chunked_fetch = not connections[self.db].settings_dict.get( - "DISABLE_SERVER_SIDE_CURSORS" - ) - iterable = self._iterable_class( - self, chunked_fetch=use_chunked_fetch, chunk_size=chunk_size - ) - if self._prefetch_related_lookups: - results = [] - - async for item in iterable: - results.append(item) - if len(results) >= chunk_size: - await aprefetch_related_objects( - results, *self._prefetch_related_lookups - ) - for result in results: - yield result - results.clear() - - if results: - await aprefetch_related_objects( - results, *self._prefetch_related_lookups - ) - for result in results: - yield result - else: - async for item in iterable: - yield item - - def aggregate(self, *args, **kwargs): - """ - Return a dictionary containing the calculations (aggregation) - over the current queryset. - - If args is present the expression is passed as a kwarg using - the Aggregate object's default alias. - """ - if self.query.distinct_fields: - raise NotImplementedError("aggregate() + distinct(fields) not implemented.") - self._validate_values_are_expressions( - (*args, *kwargs.values()), method_name="aggregate" - ) - for arg in args: - # The default_alias property raises TypeError if default_alias - # can't be set automatically or AttributeError if it isn't an - # attribute. - try: - arg.default_alias - except (AttributeError, TypeError): - raise TypeError("Complex aggregates require an alias") - kwargs[arg.default_alias] = arg - - return self.query.chain().get_aggregation(self.db, kwargs) - - async def aaggregate(self, *args, **kwargs): - return await sync_to_async(self.aggregate)(*args, **kwargs) - - def count(self): - """ - Perform a SELECT COUNT() and return the number of records as an - integer. - - If the QuerySet is already fully cached, return the length of the - cached results set to avoid multiple SELECT COUNT(*) calls. - """ - if self._result_cache is not None: - return len(self._result_cache) - - return self.query.get_count(using=self.db) - - async def acount(self): - return await sync_to_async(self.count)() - - def get(self, *args, **kwargs): - """ - Perform the query and return a single object matching the given - keyword arguments. - """ - if self.query.combinator and (args or kwargs): - raise NotSupportedError( - "Calling QuerySet.get(...) with filters after %s() is not " - "supported." % self.query.combinator - ) - clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs) - if self.query.can_filter() and not self.query.distinct_fields: - clone = clone.order_by() - limit = None - if ( - not clone.query.select_for_update - or connections[clone.db].features.supports_select_for_update_with_limit - ): - limit = MAX_GET_RESULTS - clone.query.set_limits(high=limit) - num = len(clone) - if num == 1: - return clone._result_cache[0] - if not num: - raise self.model.DoesNotExist( - "%s matching query does not exist." % self.model._meta.object_name - ) - raise self.model.MultipleObjectsReturned( - "get() returned more than one %s -- it returned %s!" - % ( - self.model._meta.object_name, - num if not limit or num < limit else "more than %s" % (limit - 1), - ) - ) - - async def aget(self, *args, **kwargs): - return await sync_to_async(self.get)(*args, **kwargs) - - def create(self, **kwargs): - """ - Create a new object with the given kwargs, saving it to the database - and returning the created object. - """ - reverse_one_to_one_fields = frozenset(kwargs).intersection( - self.model._meta._reverse_one_to_one_field_names - ) - if reverse_one_to_one_fields: - raise ValueError( - "The following fields do not exist in this model: %s" - % ", ".join(reverse_one_to_one_fields) - ) - - obj = self.model(**kwargs) - self._for_write = True - obj.save(force_insert=True, using=self.db) - return obj - - create.alters_data = True - - async def acreate(self, **kwargs): - return await sync_to_async(self.create)(**kwargs) - - acreate.alters_data = True - - def _prepare_for_bulk_create(self, objs): - from django.db.models.expressions import DatabaseDefault - - connection = connections[self.db] - for obj in objs: - if not obj._is_pk_set(): - # Populate new PK values. - obj.pk = obj._meta.pk.get_pk_value_on_save(obj) - if not connection.features.supports_default_keyword_in_bulk_insert: - for field in obj._meta.fields: - if field.generated: - continue - value = getattr(obj, field.attname) - if isinstance(value, DatabaseDefault): - setattr(obj, field.attname, field.db_default) - - obj._prepare_related_fields_for_save(operation_name="bulk_create") - - def _check_bulk_create_options( - self, ignore_conflicts, update_conflicts, update_fields, unique_fields - ): - if ignore_conflicts and update_conflicts: - raise ValueError( - "ignore_conflicts and update_conflicts are mutually exclusive." - ) - db_features = connections[self.db].features - if ignore_conflicts: - if not db_features.supports_ignore_conflicts: - raise NotSupportedError( - "This database backend does not support ignoring conflicts." - ) - return OnConflict.IGNORE - elif update_conflicts: - if not db_features.supports_update_conflicts: - raise NotSupportedError( - "This database backend does not support updating conflicts." - ) - if not update_fields: - raise ValueError( - "Fields that will be updated when a row insertion fails " - "on conflicts must be provided." - ) - if unique_fields and not db_features.supports_update_conflicts_with_target: - raise NotSupportedError( - "This database backend does not support updating " - "conflicts with specifying unique fields that can trigger " - "the upsert." - ) - if not unique_fields and db_features.supports_update_conflicts_with_target: - raise ValueError( - "Unique fields that can trigger the upsert must be provided." - ) - # Updating primary keys and non-concrete fields is forbidden. - if any(not f.concrete or f.many_to_many for f in update_fields): - raise ValueError( - "bulk_create() can only be used with concrete fields in " - "update_fields." - ) - if any(f in self.model._meta.pk_fields for f in update_fields): - raise ValueError( - "bulk_create() cannot be used with primary keys in " - "update_fields." - ) - if unique_fields: - if any(not f.concrete or f.many_to_many for f in unique_fields): - raise ValueError( - "bulk_create() can only be used with concrete fields " - "in unique_fields." - ) - return OnConflict.UPDATE - return None - - def bulk_create( - self, - objs, - batch_size=None, - ignore_conflicts=False, - update_conflicts=False, - update_fields=None, - unique_fields=None, - ): - """ - Insert each of the instances into the database. Do *not* call - save() on each of the instances, do not send any pre/post_save - signals, and do not set the primary key attribute if it is an - autoincrement field (except if features.can_return_rows_from_bulk_insert=True). - Multi-table models are not supported. - """ - # When you bulk insert you don't get the primary keys back (if it's an - # autoincrement, except if can_return_rows_from_bulk_insert=True), so - # you can't insert into the child tables which references this. There - # are two workarounds: - # 1) This could be implemented if you didn't have an autoincrement pk - # 2) You could do it by doing O(n) normal inserts into the parent - # tables to get the primary keys back and then doing a single bulk - # insert into the childmost table. - # We currently set the primary keys on the objects when using - # PostgreSQL via the RETURNING ID clause. It should be possible for - # Oracle as well, but the semantics for extracting the primary keys is - # trickier so it's not done yet. - if batch_size is not None and batch_size <= 0: - raise ValueError("Batch size must be a positive integer.") - # Check that the parents share the same concrete model with the our - # model to detect the inheritance pattern ConcreteGrandParent -> - # MultiTableParent -> ProxyChild. Simply checking self.model._meta.proxy - # would not identify that case as involving multiple tables. - for parent in self.model._meta.all_parents: - if parent._meta.concrete_model is not self.model._meta.concrete_model: - raise ValueError("Can't bulk create a multi-table inherited model") - if not objs: - return objs - opts = self.model._meta - if unique_fields: - # Primary key is allowed in unique_fields. - unique_fields = [ - self.model._meta.get_field(opts.pk.name if name == "pk" else name) - for name in unique_fields - ] - if update_fields: - update_fields = [self.model._meta.get_field(name) for name in update_fields] - on_conflict = self._check_bulk_create_options( - ignore_conflicts, - update_conflicts, - update_fields, - unique_fields, - ) - self._for_write = True - fields = [f for f in opts.concrete_fields if not f.generated] - objs = list(objs) - self._prepare_for_bulk_create(objs) - with transaction.atomic(using=self.db, savepoint=False): - objs_without_pk, objs_with_pk = partition(lambda o: o._is_pk_set(), objs) - if objs_with_pk: - returned_columns = self._batched_insert( - objs_with_pk, - fields, - batch_size, - on_conflict=on_conflict, - update_fields=update_fields, - unique_fields=unique_fields, - ) - for obj_with_pk, results in zip(objs_with_pk, returned_columns): - for result, field in zip(results, opts.db_returning_fields): - if field != opts.pk: - setattr(obj_with_pk, field.attname, result) - for obj_with_pk in objs_with_pk: - obj_with_pk._state.adding = False - obj_with_pk._state.db = self.db - if objs_without_pk: - fields = [f for f in fields if not isinstance(f, AutoField)] - returned_columns = self._batched_insert( - objs_without_pk, - fields, - batch_size, - on_conflict=on_conflict, - update_fields=update_fields, - unique_fields=unique_fields, - ) - connection = connections[self.db] - if ( - connection.features.can_return_rows_from_bulk_insert - and on_conflict is None - ): - assert len(returned_columns) == len(objs_without_pk) - for obj_without_pk, results in zip(objs_without_pk, returned_columns): - for result, field in zip(results, opts.db_returning_fields): - setattr(obj_without_pk, field.attname, result) - obj_without_pk._state.adding = False - obj_without_pk._state.db = self.db - - return objs - - bulk_create.alters_data = True - - async def abulk_create( - self, - objs, - batch_size=None, - ignore_conflicts=False, - update_conflicts=False, - update_fields=None, - unique_fields=None, - ): - return await sync_to_async(self.bulk_create)( - objs=objs, - batch_size=batch_size, - ignore_conflicts=ignore_conflicts, - update_conflicts=update_conflicts, - update_fields=update_fields, - unique_fields=unique_fields, - ) - - abulk_create.alters_data = True - - def bulk_update(self, objs, fields, batch_size=None): - """ - Update the given fields in each of the given objects in the database. - """ - if batch_size is not None and batch_size <= 0: - raise ValueError("Batch size must be a positive integer.") - if not fields: - raise ValueError("Field names must be given to bulk_update().") - objs = tuple(objs) - if not all(obj._is_pk_set() for obj in objs): - raise ValueError("All bulk_update() objects must have a primary key set.") - opts = self.model._meta - fields = [opts.get_field(name) for name in fields] - if any(not f.concrete or f.many_to_many for f in fields): - raise ValueError("bulk_update() can only be used with concrete fields.") - all_pk_fields = set(opts.pk_fields) - for parent in opts.all_parents: - all_pk_fields.update(parent._meta.pk_fields) - if any(f in all_pk_fields for f in fields): - raise ValueError("bulk_update() cannot be used with primary key fields.") - if not objs: - return 0 - for obj in objs: - obj._prepare_related_fields_for_save( - operation_name="bulk_update", fields=fields - ) - # PK is used twice in the resulting update query, once in the filter - # and once in the WHEN. Each field will also have one CAST. - self._for_write = True - connection = connections[self.db] - max_batch_size = connection.ops.bulk_batch_size( - [opts.pk, opts.pk] + fields, objs - ) - batch_size = min(batch_size, max_batch_size) if batch_size else max_batch_size - requires_casting = connection.features.requires_casted_case_in_updates - batches = (objs[i : i + batch_size] for i in range(0, len(objs), batch_size)) - updates = [] - for batch_objs in batches: - update_kwargs = {} - for field in fields: - when_statements = [] - for obj in batch_objs: - attr = getattr(obj, field.attname) - if not hasattr(attr, "resolve_expression"): - attr = Value(attr, output_field=field) - when_statements.append(When(pk=obj.pk, then=attr)) - case_statement = Case(*when_statements, output_field=field) - if requires_casting: - case_statement = Cast(case_statement, output_field=field) - update_kwargs[field.attname] = case_statement - updates.append(([obj.pk for obj in batch_objs], update_kwargs)) - rows_updated = 0 - queryset = self.using(self.db) - with transaction.atomic(using=self.db, savepoint=False): - for pks, update_kwargs in updates: - rows_updated += queryset.filter(pk__in=pks).update(**update_kwargs) - return rows_updated - - bulk_update.alters_data = True - - async def abulk_update(self, objs, fields, batch_size=None): - return await sync_to_async(self.bulk_update)( - objs=objs, - fields=fields, - batch_size=batch_size, - ) - - abulk_update.alters_data = True - - def get_or_create(self, defaults=None, **kwargs): - """ - Look up an object with the given kwargs, creating one if necessary. - Return a tuple of (object, created), where created is a boolean - specifying whether an object was created. - """ - # The get() needs to be targeted at the write database in order - # to avoid potential transaction consistency problems. - self._for_write = True - try: - return self.get(**kwargs), False - except self.model.DoesNotExist: - params = self._extract_model_params(defaults, **kwargs) - # Try to create an object using passed params. - try: - with transaction.atomic(using=self.db): - params = dict(resolve_callables(params)) - return self.create(**params), True - except IntegrityError: - try: - return self.get(**kwargs), False - except self.model.DoesNotExist: - pass - raise - - get_or_create.alters_data = True - - async def aget_or_create(self, defaults=None, **kwargs): - return await sync_to_async(self.get_or_create)( - defaults=defaults, - **kwargs, - ) - - aget_or_create.alters_data = True - - def update_or_create(self, defaults=None, create_defaults=None, **kwargs): - """ - Look up an object with the given kwargs, updating one with defaults - if it exists, otherwise create a new one. Optionally, an object can - be created with different values than defaults by using - create_defaults. - Return a tuple (object, created), where created is a boolean - specifying whether an object was created. - """ - update_defaults = defaults or {} - if create_defaults is None: - create_defaults = update_defaults - - self._for_write = True - with transaction.atomic(using=self.db): - # Lock the row so that a concurrent update is blocked until - # update_or_create() has performed its save. - obj, created = self.select_for_update().get_or_create( - create_defaults, **kwargs - ) - if created: - return obj, created - for k, v in resolve_callables(update_defaults): - setattr(obj, k, v) - - update_fields = set(update_defaults) - concrete_field_names = self.model._meta._non_pk_concrete_field_names - # update_fields does not support non-concrete fields. - if concrete_field_names.issuperset(update_fields): - # Add fields which are set on pre_save(), e.g. auto_now fields. - # This is to maintain backward compatibility as these fields - # are not updated unless explicitly specified in the - # update_fields list. - pk_fields = self.model._meta.pk_fields - for field in self.model._meta.local_concrete_fields: - if not ( - field in pk_fields or field.__class__.pre_save is Field.pre_save - ): - update_fields.add(field.name) - if field.name != field.attname: - update_fields.add(field.attname) - obj.save(using=self.db, update_fields=update_fields) - else: - obj.save(using=self.db) - return obj, False - - update_or_create.alters_data = True - - async def aupdate_or_create(self, defaults=None, create_defaults=None, **kwargs): - return await sync_to_async(self.update_or_create)( - defaults=defaults, - create_defaults=create_defaults, - **kwargs, - ) - - aupdate_or_create.alters_data = True - - def _extract_model_params(self, defaults, **kwargs): - """ - Prepare `params` for creating a model instance based on the given - kwargs; for use by get_or_create(). - """ - defaults = defaults or {} - params = {k: v for k, v in kwargs.items() if LOOKUP_SEP not in k} - params.update(defaults) - property_names = self.model._meta._property_names - invalid_params = [] - for param in params: - try: - self.model._meta.get_field(param) - except exceptions.FieldDoesNotExist: - # It's okay to use a model's property if it has a setter. - if not (param in property_names and getattr(self.model, param).fset): - invalid_params.append(param) - if invalid_params: - raise exceptions.FieldError( - "Invalid field name(s) for model %s: '%s'." - % ( - self.model._meta.object_name, - "', '".join(sorted(invalid_params)), - ) - ) - return params - - def _earliest(self, *fields): - """ - Return the earliest object according to fields (if given) or by the - model's Meta.get_latest_by. - """ - if fields: - order_by = fields - else: - order_by = getattr(self.model._meta, "get_latest_by") - if order_by and not isinstance(order_by, (tuple, list)): - order_by = (order_by,) - if order_by is None: - raise ValueError( - "earliest() and latest() require either fields as positional " - "arguments or 'get_latest_by' in the model's Meta." - ) - obj = self._chain() - obj.query.set_limits(high=1) - obj.query.clear_ordering(force=True) - obj.query.add_ordering(*order_by) - return obj.get() - - def earliest(self, *fields): - if self.query.is_sliced: - raise TypeError("Cannot change a query once a slice has been taken.") - return self._earliest(*fields) - - async def aearliest(self, *fields): - return await sync_to_async(self.earliest)(*fields) - - def latest(self, *fields): - """ - Return the latest object according to fields (if given) or by the - model's Meta.get_latest_by. - """ - if self.query.is_sliced: - raise TypeError("Cannot change a query once a slice has been taken.") - return self.reverse()._earliest(*fields) - - async def alatest(self, *fields): - return await sync_to_async(self.latest)(*fields) - - def first(self): - """Return the first object of a query or None if no match is found.""" - if self.ordered: - queryset = self - else: - self._check_ordering_first_last_queryset_aggregation(method="first") - queryset = self.order_by("pk") - for obj in queryset[:1]: - return obj - - async def afirst(self): - return await sync_to_async(self.first)() - - def last(self): - """Return the last object of a query or None if no match is found.""" - if self.ordered: - queryset = self.reverse() - else: - self._check_ordering_first_last_queryset_aggregation(method="last") - queryset = self.order_by("-pk") - for obj in queryset[:1]: - return obj - - async def alast(self): - return await sync_to_async(self.last)() - - def in_bulk(self, id_list=None, *, field_name="pk"): - """ - Return a dictionary mapping each of the given IDs to the object with - that ID. If `id_list` isn't provided, evaluate the entire QuerySet. - """ - if self.query.is_sliced: - raise TypeError("Cannot use 'limit' or 'offset' with in_bulk().") - if not issubclass(self._iterable_class, ModelIterable): - raise TypeError("in_bulk() cannot be used with values() or values_list().") - opts = self.model._meta - unique_fields = [ - constraint.fields[0] - for constraint in opts.total_unique_constraints - if len(constraint.fields) == 1 - ] - if ( - field_name != "pk" - and not opts.get_field(field_name).unique - and field_name not in unique_fields - and self.query.distinct_fields != (field_name,) - ): - raise ValueError( - "in_bulk()'s field_name must be a unique field but %r isn't." - % field_name - ) - if id_list is not None: - if not id_list: - return {} - filter_key = "{}__in".format(field_name) - batch_size = connections[self.db].features.max_query_params - id_list = tuple(id_list) - # If the database has a limit on the number of query parameters - # (e.g. SQLite), retrieve objects in batches if necessary. - if batch_size and batch_size < len(id_list): - qs = () - for offset in range(0, len(id_list), batch_size): - batch = id_list[offset : offset + batch_size] - qs += tuple(self.filter(**{filter_key: batch})) - else: - qs = self.filter(**{filter_key: id_list}) - else: - qs = self._chain() - return {getattr(obj, field_name): obj for obj in qs} - - async def ain_bulk(self, id_list=None, *, field_name="pk"): - return await sync_to_async(self.in_bulk)( - id_list=id_list, - field_name=field_name, - ) - - def delete(self): - """Delete the records in the current QuerySet.""" - self._not_support_combined_queries("delete") - if self.query.is_sliced: - raise TypeError("Cannot use 'limit' or 'offset' with delete().") - if self.query.distinct_fields: - raise TypeError("Cannot call delete() after .distinct(*fields).") - if self._fields is not None: - raise TypeError("Cannot call delete() after .values() or .values_list()") - - del_query = self._chain() - - # The delete is actually 2 queries - one to find related objects, - # and one to delete. Make sure that the discovery of related - # objects is performed on the same database as the deletion. - del_query._for_write = True - - # Disable non-supported fields. - del_query.query.select_for_update = False - del_query.query.select_related = False - del_query.query.clear_ordering(force=True) - - collector = Collector(using=del_query.db, origin=self) - collector.collect(del_query) - num_deleted, num_deleted_per_model = collector.delete() - - # Clear the result cache, in case this QuerySet gets reused. - self._result_cache = None - return num_deleted, num_deleted_per_model - - delete.alters_data = True - delete.queryset_only = True - - async def adelete(self): - return await sync_to_async(self.delete)() - - adelete.alters_data = True - adelete.queryset_only = True - - def _raw_delete(self, using): - """ - Delete objects found from the given queryset in single direct SQL - query. No signals are sent and there is no protection for cascades. - """ - query = self.query.clone() - query.__class__ = sql.DeleteQuery - return query.get_compiler(using).execute_sql(ROW_COUNT) - - _raw_delete.alters_data = True - - def update(self, **kwargs): - """ - Update all elements in the current QuerySet, setting all the given - fields to the appropriate values. - """ - self._not_support_combined_queries("update") - if self.query.is_sliced: - raise TypeError("Cannot update a query once a slice has been taken.") - self._for_write = True - query = self.query.chain(sql.UpdateQuery) - query.add_update_values(kwargs) - - # Inline annotations in order_by(), if possible. - new_order_by = [] - for col in query.order_by: - alias = col - descending = False - if isinstance(alias, str) and alias.startswith("-"): - alias = alias.removeprefix("-") - descending = True - if annotation := query.annotations.get(alias): - if getattr(annotation, "contains_aggregate", False): - raise exceptions.FieldError( - f"Cannot update when ordering by an aggregate: {annotation}" - ) - if descending: - annotation = annotation.desc() - new_order_by.append(annotation) - else: - new_order_by.append(col) - query.order_by = tuple(new_order_by) - - # Clear any annotations so that they won't be present in subqueries. - query.annotations = {} - with transaction.mark_for_rollback_on_error(using=self.db): - rows = query.get_compiler(self.db).execute_sql(ROW_COUNT) - self._result_cache = None - return rows - - update.alters_data = True - - async def aupdate(self, **kwargs): - return await sync_to_async(self.update)(**kwargs) - - aupdate.alters_data = True - - def _update(self, values): - """ - A version of update() that accepts field objects instead of field names. - Used primarily for model saving and not intended for use by general - code (it requires too much poking around at model internals to be - useful at that level). - """ - if self.query.is_sliced: - raise TypeError("Cannot update a query once a slice has been taken.") - query = self.query.chain(sql.UpdateQuery) - query.add_update_fields(values) - # Clear any annotations so that they won't be present in subqueries. - query.annotations = {} - self._result_cache = None - return query.get_compiler(self.db).execute_sql(ROW_COUNT) - - _update.alters_data = True - _update.queryset_only = False - - def exists(self): - """ - Return True if the QuerySet would have any results, False otherwise. - """ - if self._result_cache is None: - return self.query.has_results(using=self.db) - return bool(self._result_cache) - - async def aexists(self): - return await sync_to_async(self.exists)() - - def contains(self, obj): - """ - Return True if the QuerySet contains the provided obj, - False otherwise. - """ - self._not_support_combined_queries("contains") - if self._fields is not None: - raise TypeError( - "Cannot call QuerySet.contains() after .values() or .values_list()." - ) - try: - if obj._meta.concrete_model != self.model._meta.concrete_model: - return False - except AttributeError: - raise TypeError("'obj' must be a model instance.") - if not obj._is_pk_set(): - raise ValueError("QuerySet.contains() cannot be used on unsaved objects.") - if self._result_cache is not None: - return obj in self._result_cache - return self.filter(pk=obj.pk).exists() - - async def acontains(self, obj): - return await sync_to_async(self.contains)(obj=obj) - - def _prefetch_related_objects(self): - # This method can only be called once the result cache has been filled. - prefetch_related_objects(self._result_cache, *self._prefetch_related_lookups) - self._prefetch_done = True - - def explain(self, *, format=None, **options): - """ - Runs an EXPLAIN on the SQL query this QuerySet would perform, and - returns the results. - """ - return self.query.explain(using=self.db, format=format, **options) - - async def aexplain(self, *, format=None, **options): - return await sync_to_async(self.explain)(format=format, **options) - - ################################################## - # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS # - ################################################## - - def raw(self, raw_query, params=(), translations=None, using=None): - if using is None: - using = self.db - qs = RawQuerySet( - raw_query, - model=self.model, - params=params, - translations=translations, - using=using, - ) - qs._prefetch_related_lookups = self._prefetch_related_lookups[:] - return qs - - def _values(self, *fields, **expressions): - clone = self._chain() - if expressions: - clone = clone.annotate(**expressions) - clone._fields = fields - clone.query.set_values(fields) - return clone - - def values(self, *fields, **expressions): - fields += tuple(expressions) - clone = self._values(*fields, **expressions) - clone._iterable_class = ValuesIterable - return clone - - def values_list(self, *fields, flat=False, named=False): - if flat and named: - raise TypeError("'flat' and 'named' can't be used together.") - if flat and len(fields) > 1: - raise TypeError( - "'flat' is not valid when values_list is called with more than one " - "field." - ) - - field_names = {f for f in fields if not hasattr(f, "resolve_expression")} - _fields = [] - expressions = {} - counter = 1 - for field in fields: - if hasattr(field, "resolve_expression"): - field_id_prefix = getattr( - field, "default_alias", field.__class__.__name__.lower() - ) - while True: - field_id = field_id_prefix + str(counter) - counter += 1 - if field_id not in field_names: - break - expressions[field_id] = field - _fields.append(field_id) - else: - _fields.append(field) - - clone = self._values(*_fields, **expressions) - clone._iterable_class = ( - NamedValuesListIterable - if named - else FlatValuesListIterable if flat else ValuesListIterable - ) - return clone - - def dates(self, field_name, kind, order="ASC"): - """ - Return a list of date objects representing all available dates for - the given field_name, scoped to 'kind'. - """ - if kind not in ("year", "month", "week", "day"): - raise ValueError("'kind' must be one of 'year', 'month', 'week', or 'day'.") - if order not in ("ASC", "DESC"): - raise ValueError("'order' must be either 'ASC' or 'DESC'.") - return ( - self.annotate( - datefield=Trunc(field_name, kind, output_field=DateField()), - plain_field=F(field_name), - ) - .values_list("datefield", flat=True) - .distinct() - .filter(plain_field__isnull=False) - .order_by(("-" if order == "DESC" else "") + "datefield") - ) - - def datetimes(self, field_name, kind, order="ASC", tzinfo=None): - """ - Return a list of datetime objects representing all available - datetimes for the given field_name, scoped to 'kind'. - """ - if kind not in ("year", "month", "week", "day", "hour", "minute", "second"): - raise ValueError( - "'kind' must be one of 'year', 'month', 'week', 'day', " - "'hour', 'minute', or 'second'." - ) - if order not in ("ASC", "DESC"): - raise ValueError("'order' must be either 'ASC' or 'DESC'.") - if settings.USE_TZ: - if tzinfo is None: - tzinfo = timezone.get_current_timezone() - else: - tzinfo = None - return ( - self.annotate( - datetimefield=Trunc( - field_name, - kind, - output_field=DateTimeField(), - tzinfo=tzinfo, - ), - plain_field=F(field_name), - ) - .values_list("datetimefield", flat=True) - .distinct() - .filter(plain_field__isnull=False) - .order_by(("-" if order == "DESC" else "") + "datetimefield") - ) - - def none(self): - """Return an empty QuerySet.""" - clone = self._chain() - clone.query.set_empty() - return clone - - ################################################################## - # PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET # - ################################################################## - - def all(self): - """ - Return a new QuerySet that is a copy of the current one. This allows a - QuerySet to proxy for a model manager in some cases. - """ - return self._chain() - - def filter(self, *args, **kwargs): - """ - Return a new QuerySet instance with the args ANDed to the existing - set. - """ - self._not_support_combined_queries("filter") - return self._filter_or_exclude(False, args, kwargs) - - def exclude(self, *args, **kwargs): - """ - Return a new QuerySet instance with NOT (args) ANDed to the existing - set. - """ - self._not_support_combined_queries("exclude") - return self._filter_or_exclude(True, args, kwargs) - - def _filter_or_exclude(self, negate, args, kwargs): - if (args or kwargs) and self.query.is_sliced: - raise TypeError("Cannot filter a query once a slice has been taken.") - clone = self._chain() - if self._defer_next_filter: - self._defer_next_filter = False - clone._deferred_filter = negate, args, kwargs - else: - clone._filter_or_exclude_inplace(negate, args, kwargs) - return clone - - def _filter_or_exclude_inplace(self, negate, args, kwargs): - if negate: - self._query.add_q(~Q(*args, **kwargs)) - else: - self._query.add_q(Q(*args, **kwargs)) - - def complex_filter(self, filter_obj): - """ - Return a new QuerySet instance with filter_obj added to the filters. - - filter_obj can be a Q object or a dictionary of keyword lookup - arguments. - - This exists to support framework features such as 'limit_choices_to', - and usually it will be more natural to use other methods. - """ - if isinstance(filter_obj, Q): - clone = self._chain() - clone.query.add_q(filter_obj) - return clone - else: - return self._filter_or_exclude(False, args=(), kwargs=filter_obj) - - def _combinator_query(self, combinator, *other_qs, all=False): - # Clone the query to inherit the select list and everything - clone = self._chain() - # Clear limits and ordering so they can be reapplied - clone.query.clear_ordering(force=True) - clone.query.clear_limits() - clone.query.combined_queries = (self.query,) + tuple( - qs.query for qs in other_qs - ) - clone.query.combinator = combinator - clone.query.combinator_all = all - return clone - - def union(self, *other_qs, all=False): - # If the query is an EmptyQuerySet, combine all nonempty querysets. - if isinstance(self, EmptyQuerySet): - qs = [q for q in other_qs if not isinstance(q, EmptyQuerySet)] - if not qs: - return self - if len(qs) == 1: - return qs[0] - return qs[0]._combinator_query("union", *qs[1:], all=all) - return self._combinator_query("union", *other_qs, all=all) - - def intersection(self, *other_qs): - # If any query is an EmptyQuerySet, return it. - if isinstance(self, EmptyQuerySet): - return self - for other in other_qs: - if isinstance(other, EmptyQuerySet): - return other - return self._combinator_query("intersection", *other_qs) - - def difference(self, *other_qs): - # If the query is an EmptyQuerySet, return it. - if isinstance(self, EmptyQuerySet): - return self - return self._combinator_query("difference", *other_qs) - - def select_for_update(self, nowait=False, skip_locked=False, of=(), no_key=False): - """ - Return a new QuerySet instance that will select objects with a - FOR UPDATE lock. - """ - if nowait and skip_locked: - raise ValueError("The nowait option cannot be used with skip_locked.") - obj = self._chain() - obj._for_write = True - obj.query.select_for_update = True - obj.query.select_for_update_nowait = nowait - obj.query.select_for_update_skip_locked = skip_locked - obj.query.select_for_update_of = of - obj.query.select_for_no_key_update = no_key - return obj - - def select_related(self, *fields): - """ - Return a new QuerySet instance that will select related objects. - - If fields are specified, they must be ForeignKey fields and only those - related objects are included in the selection. - - If select_related(None) is called, clear the list. - """ - self._not_support_combined_queries("select_related") - if self._fields is not None: - raise TypeError( - "Cannot call select_related() after .values() or .values_list()" - ) - - obj = self._chain() - if fields == (None,): - obj.query.select_related = False - elif fields: - obj.query.add_select_related(fields) - else: - obj.query.select_related = True - return obj - - def prefetch_related(self, *lookups): - """ - Return a new QuerySet instance that will prefetch the specified - Many-To-One and Many-To-Many related objects when the QuerySet is - evaluated. - - When prefetch_related() is called more than once, append to the list of - prefetch lookups. If prefetch_related(None) is called, clear the list. - """ - self._not_support_combined_queries("prefetch_related") - clone = self._chain() - if lookups == (None,): - clone._prefetch_related_lookups = () - else: - for lookup in lookups: - if isinstance(lookup, Prefetch): - lookup = lookup.prefetch_to - lookup = lookup.split(LOOKUP_SEP, 1)[0] - if lookup in self.query._filtered_relations: - raise ValueError( - "prefetch_related() is not supported with FilteredRelation." - ) - clone._prefetch_related_lookups = clone._prefetch_related_lookups + lookups - return clone - - def annotate(self, *args, **kwargs): - """ - Return a query set in which the returned objects have been annotated - with extra data or aggregations. - """ - self._not_support_combined_queries("annotate") - return self._annotate(args, kwargs, select=True) - - def alias(self, *args, **kwargs): - """ - Return a query set with added aliases for extra data or aggregations. - """ - self._not_support_combined_queries("alias") - return self._annotate(args, kwargs, select=False) - - def _annotate(self, args, kwargs, select=True): - self._validate_values_are_expressions( - args + tuple(kwargs.values()), method_name="annotate" - ) - annotations = {} - for arg in args: - # The default_alias property raises TypeError if default_alias - # can't be set automatically or AttributeError if it isn't an - # attribute. - try: - if arg.default_alias in kwargs: - raise ValueError( - "The named annotation '%s' conflicts with the " - "default name for another annotation." % arg.default_alias - ) - except (TypeError, AttributeError): - raise TypeError("Complex annotations require an alias") - annotations[arg.default_alias] = arg - annotations.update(kwargs) - - clone = self._chain() - names = self._fields - if names is None: - names = set( - chain.from_iterable( - ( - (field.name, field.attname) - if hasattr(field, "attname") - else (field.name,) - ) - for field in self.model._meta.get_fields() - ) - ) - - for alias, annotation in annotations.items(): - if alias in names: - raise ValueError( - "The annotation '%s' conflicts with a field on " - "the model." % alias - ) - if isinstance(annotation, FilteredRelation): - clone.query.add_filtered_relation(annotation, alias) - else: - clone.query.add_annotation( - annotation, - alias, - select=select, - ) - for alias, annotation in clone.query.annotations.items(): - if alias in annotations and annotation.contains_aggregate: - if clone._fields is None: - clone.query.group_by = True - else: - clone.query.set_group_by() - break - - return clone - - def order_by(self, *field_names): - """Return a new QuerySet instance with the ordering changed.""" - if self.query.is_sliced: - raise TypeError("Cannot reorder a query once a slice has been taken.") - obj = self._chain() - obj.query.clear_ordering(force=True, clear_default=False) - obj.query.add_ordering(*field_names) - return obj - - def distinct(self, *field_names): - """ - Return a new QuerySet instance that will select only distinct results. - """ - self._not_support_combined_queries("distinct") - if self.query.is_sliced: - raise TypeError( - "Cannot create distinct fields once a slice has been taken." - ) - obj = self._chain() - obj.query.add_distinct_fields(*field_names) - return obj - - def extra( - self, - select=None, - where=None, - params=None, - tables=None, - order_by=None, - select_params=None, - ): - """Add extra SQL fragments to the query.""" - self._not_support_combined_queries("extra") - if self.query.is_sliced: - raise TypeError("Cannot change a query once a slice has been taken.") - clone = self._chain() - clone.query.add_extra(select, select_params, where, params, tables, order_by) - return clone - - def reverse(self): - """Reverse the ordering of the QuerySet.""" - if self.query.is_sliced: - raise TypeError("Cannot reverse a query once a slice has been taken.") - clone = self._chain() - clone.query.standard_ordering = not clone.query.standard_ordering - return clone - - def defer(self, *fields): - """ - Defer the loading of data for certain fields until they are accessed. - Add the set of deferred fields to any existing set of deferred fields. - The only exception to this is if None is passed in as the only - parameter, in which case remove all deferrals. - """ - self._not_support_combined_queries("defer") - if self._fields is not None: - raise TypeError("Cannot call defer() after .values() or .values_list()") - clone = self._chain() - if fields == (None,): - clone.query.clear_deferred_loading() - else: - clone.query.add_deferred_loading(fields) - return clone - - def only(self, *fields): - """ - Essentially, the opposite of defer(). Only the fields passed into this - method and that are not already specified as deferred are loaded - immediately when the queryset is evaluated. - """ - self._not_support_combined_queries("only") - if self._fields is not None: - raise TypeError("Cannot call only() after .values() or .values_list()") - if fields == (None,): - # Can only pass None to defer(), not only(), as the rest option. - # That won't stop people trying to do this, so let's be explicit. - raise TypeError("Cannot pass None as an argument to only().") - for field in fields: - field = field.split(LOOKUP_SEP, 1)[0] - if field in self.query._filtered_relations: - raise ValueError("only() is not supported with FilteredRelation.") - clone = self._chain() - clone.query.add_immediate_loading(fields) - return clone - - def using(self, alias): - """Select which database this QuerySet should execute against.""" - clone = self._chain() - clone._db = alias - return clone - - ################################### - # PUBLIC INTROSPECTION ATTRIBUTES # - ################################### - - @property - def ordered(self): - """ - Return True if the QuerySet is ordered -- i.e. has an order_by() - clause or a default ordering on the model (or is empty). - """ - if isinstance(self, EmptyQuerySet): - return True - if self.query.extra_order_by or self.query.order_by: - return True - elif ( - self.query.default_ordering - and self.query.get_meta().ordering - and - # A default ordering doesn't affect GROUP BY queries. - not self.query.group_by - ): - return True - else: - return False - - @property - def db(self): - """Return the database used if this query is executed now.""" - if self._for_write: - return self._db or router.db_for_write(self.model, **self._hints) - return self._db or router.db_for_read(self.model, **self._hints) - - ################### - # PRIVATE METHODS # - ################### - - def _insert( - self, - objs, - fields, - returning_fields=None, - raw=False, - using=None, - on_conflict=None, - update_fields=None, - unique_fields=None, - ): - """ - Insert a new record for the given model. This provides an interface to - the InsertQuery class and is how Model.save() is implemented. - """ - self._for_write = True - if using is None: - using = self.db - query = sql.InsertQuery( - self.model, - on_conflict=on_conflict, - update_fields=update_fields, - unique_fields=unique_fields, - ) - query.insert_values(fields, objs, raw=raw) - return query.get_compiler(using=using).execute_sql(returning_fields) - - _insert.alters_data = True - _insert.queryset_only = False - - def _batched_insert( - self, - objs, - fields, - batch_size, - on_conflict=None, - update_fields=None, - unique_fields=None, - ): - """ - Helper method for bulk_create() to insert objs one batch at a time. - """ - connection = connections[self.db] - ops = connection.ops - max_batch_size = max(ops.bulk_batch_size(fields, objs), 1) - batch_size = min(batch_size, max_batch_size) if batch_size else max_batch_size - inserted_rows = [] - bulk_return = connection.features.can_return_rows_from_bulk_insert - for item in [objs[i : i + batch_size] for i in range(0, len(objs), batch_size)]: - if bulk_return and ( - on_conflict is None or on_conflict == OnConflict.UPDATE - ): - inserted_rows.extend( - self._insert( - item, - fields=fields, - using=self.db, - on_conflict=on_conflict, - update_fields=update_fields, - unique_fields=unique_fields, - returning_fields=self.model._meta.db_returning_fields, - ) - ) - else: - self._insert( - item, - fields=fields, - using=self.db, - on_conflict=on_conflict, - update_fields=update_fields, - unique_fields=unique_fields, - ) - return inserted_rows - - def _chain(self): - """ - Return a copy of the current QuerySet that's ready for another - operation. - """ - obj = self._clone() - if obj._sticky_filter: - obj.query.filter_is_sticky = True - obj._sticky_filter = False - return obj - - def _clone(self): - """ - Return a copy of the current QuerySet. A lightweight alternative - to deepcopy(). - """ - c = self.__class__( - model=self.model, - query=self.query.chain(), - using=self._db, - hints=self._hints, - ) - c._sticky_filter = self._sticky_filter - c._for_write = self._for_write - c._prefetch_related_lookups = self._prefetch_related_lookups[:] - c._known_related_objects = self._known_related_objects - c._iterable_class = self._iterable_class - c._fields = self._fields - return c - - def _fetch_all(self): - if self._result_cache is None: - self._result_cache = list(self._iterable_class(self)) - if self._prefetch_related_lookups and not self._prefetch_done: - self._prefetch_related_objects() - - def _next_is_sticky(self): - """ - Indicate that the next filter call and the one following that should - be treated as a single filter. This is only important when it comes to - determining when to reuse tables for many-to-many filters. Required so - that we can filter naturally on the results of related managers. - - This doesn't return a clone of the current QuerySet (it returns - "self"). The method is only used internally and should be immediately - followed by a filter() that does create a clone. - """ - self._sticky_filter = True - return self - - def _merge_sanity_check(self, other): - """Check that two QuerySet classes may be merged.""" - if self._fields is not None and ( - set(self.query.values_select) != set(other.query.values_select) - or set(self.query.extra_select) != set(other.query.extra_select) - or set(self.query.annotation_select) != set(other.query.annotation_select) - ): - raise TypeError( - "Merging '%s' classes must involve the same values in each case." - % self.__class__.__name__ - ) - - def _merge_known_related_objects(self, other): - """ - Keep track of all known related objects from either QuerySet instance. - """ - for field, objects in other._known_related_objects.items(): - self._known_related_objects.setdefault(field, {}).update(objects) - - def resolve_expression(self, *args, **kwargs): - query = self.query.resolve_expression(*args, **kwargs) - query._db = self._db - return query - - resolve_expression.queryset_only = True - - def _add_hints(self, **hints): - """ - Update hinting information for use by routers. Add new key/values or - overwrite existing key/values. - """ - self._hints.update(hints) - - def _has_filters(self): - """ - Check if this QuerySet has any filtering going on. This isn't - equivalent with checking if all objects are present in results, for - example, qs[1:]._has_filters() -> False. - """ - return self.query.has_filters() - - @staticmethod - def _validate_values_are_expressions(values, method_name): - invalid_args = sorted( - str(arg) for arg in values if not hasattr(arg, "resolve_expression") - ) - if invalid_args: - raise TypeError( - "QuerySet.%s() received non-expression(s): %s." - % ( - method_name, - ", ".join(invalid_args), - ) - ) - - def _not_support_combined_queries(self, operation_name): - if self.query.combinator: - raise NotSupportedError( - "Calling QuerySet.%s() after %s() is not supported." - % (operation_name, self.query.combinator) - ) - - def _check_operator_queryset(self, other, operator_): - if self.query.combinator or other.query.combinator: - raise TypeError(f"Cannot use {operator_} operator with combined queryset.") - - def _check_ordering_first_last_queryset_aggregation(self, method): - if isinstance(self.query.group_by, tuple) and not any( - col.output_field is self.model._meta.pk for col in self.query.group_by - ): - raise TypeError( - f"Cannot use QuerySet.{method}() on an unordered queryset performing " - f"aggregation. Add an ordering with order_by()." - ) - - -class InstanceCheckMeta(type): - def __instancecheck__(self, instance): - return isinstance(instance, QuerySet) and instance.query.is_empty() - - -class EmptyQuerySet(metaclass=InstanceCheckMeta): - """ - Marker class to checking if a queryset is empty by .none(): - isinstance(qs.none(), EmptyQuerySet) -> True - """ - - def __init__(self, *args, **kwargs): - raise TypeError("EmptyQuerySet can't be instantiated") - - -class RawQuerySet: - """ - Provide an iterator which converts the results of raw SQL queries into - annotated model instances. - """ - - def __init__( - self, - raw_query, - model=None, - query=None, - params=(), - translations=None, - using=None, - hints=None, - ): - self.raw_query = raw_query - self.model = model - self._db = using - self._hints = hints or {} - self.query = query or sql.RawQuery(sql=raw_query, using=self.db, params=params) - self.params = params - self.translations = translations or {} - self._result_cache = None - self._prefetch_related_lookups = () - self._prefetch_done = False - - def resolve_model_init_order(self): - """Resolve the init field names and value positions.""" - converter = connections[self.db].introspection.identifier_converter - model_init_fields = [ - f for f in self.model._meta.fields if converter(f.column) in self.columns - ] - annotation_fields = [ - (column, pos) - for pos, column in enumerate(self.columns) - if column not in self.model_fields - ] - model_init_order = [ - self.columns.index(converter(f.column)) for f in model_init_fields - ] - model_init_names = [f.attname for f in model_init_fields] - return model_init_names, model_init_order, annotation_fields - - def prefetch_related(self, *lookups): - """Same as QuerySet.prefetch_related()""" - clone = self._clone() - if lookups == (None,): - clone._prefetch_related_lookups = () - else: - clone._prefetch_related_lookups = clone._prefetch_related_lookups + lookups - return clone - - def _prefetch_related_objects(self): - prefetch_related_objects(self._result_cache, *self._prefetch_related_lookups) - self._prefetch_done = True - - def _clone(self): - """Same as QuerySet._clone()""" - c = self.__class__( - self.raw_query, - model=self.model, - query=self.query, - params=self.params, - translations=self.translations, - using=self._db, - hints=self._hints, - ) - c._prefetch_related_lookups = self._prefetch_related_lookups[:] - return c - - def _fetch_all(self): - if self._result_cache is None: - self._result_cache = list(self.iterator()) - if self._prefetch_related_lookups and not self._prefetch_done: - self._prefetch_related_objects() - - def __len__(self): - self._fetch_all() - return len(self._result_cache) - - def __bool__(self): - self._fetch_all() - return bool(self._result_cache) - - def __iter__(self): - self._fetch_all() - return iter(self._result_cache) - - def __aiter__(self): - # Remember, __aiter__ itself is synchronous, it's the thing it returns - # that is async! - async def generator(): - await sync_to_async(self._fetch_all)() - for item in self._result_cache: - yield item - - return generator() - - def iterator(self): - yield from RawModelIterable(self) - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self.query) - - def __getitem__(self, k): - return list(self)[k] - - @property - def db(self): - """Return the database used if this query is executed now.""" - return self._db or router.db_for_read(self.model, **self._hints) - - def using(self, alias): - """Select the database this RawQuerySet should execute against.""" - return RawQuerySet( - self.raw_query, - model=self.model, - query=self.query.chain(using=alias), - params=self.params, - translations=self.translations, - using=alias, - ) - - @cached_property - def columns(self): - """ - A list of model field names in the order they'll appear in the - query results. - """ - columns = self.query.get_columns() - # Adjust any column names which don't match field names - for query_name, model_name in self.translations.items(): - # Ignore translations for nonexistent column names - try: - index = columns.index(query_name) - except ValueError: - pass - else: - columns[index] = model_name - return columns - - @cached_property - def model_fields(self): - """A dict mapping column names to model field names.""" - converter = connections[self.db].introspection.identifier_converter - model_fields = {} - for field in self.model._meta.fields: - model_fields[converter(field.column)] = field - return model_fields - - -class Prefetch: - def __init__(self, lookup, queryset=None, to_attr=None): - # `prefetch_through` is the path we traverse to perform the prefetch. - self.prefetch_through = lookup - # `prefetch_to` is the path to the attribute that stores the result. - self.prefetch_to = lookup - if queryset is not None and ( - isinstance(queryset, RawQuerySet) - or ( - hasattr(queryset, "_iterable_class") - and not issubclass(queryset._iterable_class, ModelIterable) - ) - ): - raise ValueError( - "Prefetch querysets cannot use raw(), values(), and values_list()." - ) - if to_attr: - self.prefetch_to = LOOKUP_SEP.join( - lookup.split(LOOKUP_SEP)[:-1] + [to_attr] - ) - - self.queryset = queryset - self.to_attr = to_attr - - def __getstate__(self): - obj_dict = self.__dict__.copy() - if self.queryset is not None: - queryset = self.queryset._chain() - # Prevent the QuerySet from being evaluated - queryset._result_cache = [] - queryset._prefetch_done = True - obj_dict["queryset"] = queryset - return obj_dict - - def add_prefix(self, prefix): - self.prefetch_through = prefix + LOOKUP_SEP + self.prefetch_through - self.prefetch_to = prefix + LOOKUP_SEP + self.prefetch_to - - def get_current_prefetch_to(self, level): - return LOOKUP_SEP.join(self.prefetch_to.split(LOOKUP_SEP)[: level + 1]) - - def get_current_to_attr(self, level): - parts = self.prefetch_to.split(LOOKUP_SEP) - to_attr = parts[level] - as_attr = self.to_attr and level == len(parts) - 1 - return to_attr, as_attr - - def get_current_queryset(self, level): - warnings.warn( - "Prefetch.get_current_queryset() is deprecated. Use " - "get_current_querysets() instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - querysets = self.get_current_querysets(level) - return querysets[0] if querysets is not None else None - - def get_current_querysets(self, level): - if ( - self.get_current_prefetch_to(level) == self.prefetch_to - and self.queryset is not None - ): - return [self.queryset] - return None - - def __eq__(self, other): - if not isinstance(other, Prefetch): - return NotImplemented - return self.prefetch_to == other.prefetch_to - - def __hash__(self): - return hash((self.__class__, self.prefetch_to)) - - -def normalize_prefetch_lookups(lookups, prefix=None): - """Normalize lookups into Prefetch objects.""" - ret = [] - for lookup in lookups: - if not isinstance(lookup, Prefetch): - lookup = Prefetch(lookup) - if prefix: - lookup.add_prefix(prefix) - ret.append(lookup) - return ret - - -def prefetch_related_objects(model_instances, *related_lookups): - """ - Populate prefetched object caches for a list of model instances based on - the lookups/Prefetch instances given. - """ - if not model_instances: - return # nothing to do - - # We need to be able to dynamically add to the list of prefetch_related - # lookups that we look up (see below). So we need some book keeping to - # ensure we don't do duplicate work. - done_queries = {} # dictionary of things like 'foo__bar': [results] - - auto_lookups = set() # we add to this as we go through. - followed_descriptors = set() # recursion protection - - all_lookups = normalize_prefetch_lookups(reversed(related_lookups)) - while all_lookups: - lookup = all_lookups.pop() - if lookup.prefetch_to in done_queries: - if lookup.queryset is not None: - raise ValueError( - "'%s' lookup was already seen with a different queryset. " - "You may need to adjust the ordering of your lookups." - % lookup.prefetch_to - ) - - continue - - # Top level, the list of objects to decorate is the result cache - # from the primary QuerySet. It won't be for deeper levels. - obj_list = model_instances - - through_attrs = lookup.prefetch_through.split(LOOKUP_SEP) - for level, through_attr in enumerate(through_attrs): - # Prepare main instances - if not obj_list: - break - - prefetch_to = lookup.get_current_prefetch_to(level) - if prefetch_to in done_queries: - # Skip any prefetching, and any object preparation - obj_list = done_queries[prefetch_to] - continue - - # Prepare objects: - good_objects = True - for obj in obj_list: - # Since prefetching can re-use instances, it is possible to have - # the same instance multiple times in obj_list, so obj might - # already be prepared. - if not hasattr(obj, "_prefetched_objects_cache"): - try: - obj._prefetched_objects_cache = {} - except (AttributeError, TypeError): - # Must be an immutable object from - # values_list(flat=True), for example (TypeError) or - # a QuerySet subclass that isn't returning Model - # instances (AttributeError), either in Django or a 3rd - # party. prefetch_related() doesn't make sense, so quit. - good_objects = False - break - if not good_objects: - break - - # Descend down tree - - # We assume that objects retrieved are homogeneous (which is the premise - # of prefetch_related), so what applies to first object applies to all. - first_obj = obj_list[0] - to_attr = lookup.get_current_to_attr(level)[0] - prefetcher, descriptor, attr_found, is_fetched = get_prefetcher( - first_obj, through_attr, to_attr - ) - - if not attr_found: - raise AttributeError( - "Cannot find '%s' on %s object, '%s' is an invalid " - "parameter to prefetch_related()" - % ( - through_attr, - first_obj.__class__.__name__, - lookup.prefetch_through, - ) - ) - - if level == len(through_attrs) - 1 and prefetcher is None: - # Last one, this *must* resolve to something that supports - # prefetching, otherwise there is no point adding it and the - # developer asking for it has made a mistake. - raise ValueError( - "'%s' does not resolve to an item that supports " - "prefetching - this is an invalid parameter to " - "prefetch_related()." % lookup.prefetch_through - ) - - obj_to_fetch = None - if prefetcher is not None: - obj_to_fetch = [obj for obj in obj_list if not is_fetched(obj)] - - if obj_to_fetch: - obj_list, additional_lookups = prefetch_one_level( - obj_to_fetch, - prefetcher, - lookup, - level, - ) - # We need to ensure we don't keep adding lookups from the - # same relationships to stop infinite recursion. So, if we - # are already on an automatically added lookup, don't add - # the new lookups from relationships we've seen already. - if not ( - prefetch_to in done_queries - and lookup in auto_lookups - and descriptor in followed_descriptors - ): - done_queries[prefetch_to] = obj_list - new_lookups = normalize_prefetch_lookups( - reversed(additional_lookups), prefetch_to - ) - auto_lookups.update(new_lookups) - all_lookups.extend(new_lookups) - followed_descriptors.add(descriptor) - else: - # Either a singly related object that has already been fetched - # (e.g. via select_related), or hopefully some other property - # that doesn't support prefetching but needs to be traversed. - - # We replace the current list of parent objects with the list - # of related objects, filtering out empty or missing values so - # that we can continue with nullable or reverse relations. - new_obj_list = [] - for obj in obj_list: - if through_attr in getattr(obj, "_prefetched_objects_cache", ()): - # If related objects have been prefetched, use the - # cache rather than the object's through_attr. - new_obj = list(obj._prefetched_objects_cache.get(through_attr)) - else: - try: - new_obj = getattr(obj, through_attr) - except exceptions.ObjectDoesNotExist: - continue - if new_obj is None: - continue - # We special-case `list` rather than something more generic - # like `Iterable` because we don't want to accidentally match - # user models that define __iter__. - if isinstance(new_obj, list): - new_obj_list.extend(new_obj) - else: - new_obj_list.append(new_obj) - obj_list = new_obj_list - - -async def aprefetch_related_objects(model_instances, *related_lookups): - """See prefetch_related_objects().""" - return await sync_to_async(prefetch_related_objects)( - model_instances, *related_lookups - ) - - -def get_prefetcher(instance, through_attr, to_attr): - """ - For the attribute 'through_attr' on the given instance, find - an object that has a get_prefetch_querysets(). - Return a 4 tuple containing: - (the object with get_prefetch_querysets (or None), - the descriptor object representing this relationship (or None), - a boolean that is False if the attribute was not found at all, - a function that takes an instance and returns a boolean that is True if - the attribute has already been fetched for that instance) - """ - - def is_to_attr_fetched(model, to_attr): - # Special case cached_property instances because hasattr() triggers - # attribute computation and assignment. - if isinstance(getattr(model, to_attr, None), cached_property): - - def has_cached_property(instance): - return to_attr in instance.__dict__ - - return has_cached_property - - def has_to_attr_attribute(instance): - return hasattr(instance, to_attr) - - return has_to_attr_attribute - - prefetcher = None - is_fetched = is_to_attr_fetched(instance.__class__, to_attr) - - # For singly related objects, we have to avoid getting the attribute - # from the object, as this will trigger the query. So we first try - # on the class, in order to get the descriptor object. - rel_obj_descriptor = getattr(instance.__class__, through_attr, None) - if rel_obj_descriptor is None: - attr_found = hasattr(instance, through_attr) - else: - attr_found = True - if rel_obj_descriptor: - # singly related object, descriptor object has the - # get_prefetch_querysets() method. - if ( - hasattr(rel_obj_descriptor, "get_prefetch_querysets") - # RemovedInDjango60Warning. - or hasattr(rel_obj_descriptor, "get_prefetch_queryset") - ): - prefetcher = rel_obj_descriptor - # If to_attr is set, check if the value has already been set, - # which is done with has_to_attr_attribute(). Do not use the - # method from the descriptor, as the cache_name it defines - # checks the field name, not the to_attr value. - if through_attr == to_attr: - is_fetched = rel_obj_descriptor.is_cached - else: - # descriptor doesn't support prefetching, so we go ahead and get - # the attribute on the instance rather than the class to - # support many related managers - rel_obj = getattr(instance, through_attr) - if ( - hasattr(rel_obj, "get_prefetch_querysets") - # RemovedInDjango60Warning. - or hasattr(rel_obj, "get_prefetch_queryset") - ): - prefetcher = rel_obj - if through_attr == to_attr: - - def in_prefetched_cache(instance): - return through_attr in instance._prefetched_objects_cache - - is_fetched = in_prefetched_cache - return prefetcher, rel_obj_descriptor, attr_found, is_fetched - - -def prefetch_one_level(instances, prefetcher, lookup, level): - """ - Helper function for prefetch_related_objects(). - - Run prefetches on all instances using the prefetcher object, - assigning results to relevant caches in instance. - - Return the prefetched objects along with any additional prefetches that - must be done due to prefetch_related lookups found from default managers. - """ - # prefetcher must have a method get_prefetch_querysets() which takes a list - # of instances, and returns a tuple: - - # (queryset of instances of self.model that are related to passed in instances, - # callable that gets value to be matched for returned instances, - # callable that gets value to be matched for passed in instances, - # boolean that is True for singly related objects, - # cache or field name to assign to, - # boolean that is True when the previous argument is a cache name vs a field name). - - # The 'values to be matched' must be hashable as they will be used - # in a dictionary. - - if hasattr(prefetcher, "get_prefetch_querysets"): - ( - rel_qs, - rel_obj_attr, - instance_attr, - single, - cache_name, - is_descriptor, - ) = prefetcher.get_prefetch_querysets( - instances, lookup.get_current_querysets(level) - ) - else: - warnings.warn( - "The usage of get_prefetch_queryset() in prefetch_related_objects() is " - "deprecated. Implement get_prefetch_querysets() instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - queryset = None - if querysets := lookup.get_current_querysets(level): - queryset = querysets[0] - ( - rel_qs, - rel_obj_attr, - instance_attr, - single, - cache_name, - is_descriptor, - ) = prefetcher.get_prefetch_queryset(instances, queryset) - # We have to handle the possibility that the QuerySet we just got back - # contains some prefetch_related lookups. We don't want to trigger the - # prefetch_related functionality by evaluating the query. Rather, we need - # to merge in the prefetch_related lookups. - # Copy the lookups in case it is a Prefetch object which could be reused - # later (happens in nested prefetch_related). - additional_lookups = [ - copy.copy(additional_lookup) - for additional_lookup in getattr(rel_qs, "_prefetch_related_lookups", ()) - ] - if additional_lookups: - # Don't need to clone because the manager should have given us a fresh - # instance, so we access an internal instead of using public interface - # for performance reasons. - rel_qs._prefetch_related_lookups = () - - all_related_objects = list(rel_qs) - - rel_obj_cache = {} - for rel_obj in all_related_objects: - rel_attr_val = rel_obj_attr(rel_obj) - rel_obj_cache.setdefault(rel_attr_val, []).append(rel_obj) - - to_attr, as_attr = lookup.get_current_to_attr(level) - # Make sure `to_attr` does not conflict with a field. - if as_attr and instances: - # We assume that objects retrieved are homogeneous (which is the premise - # of prefetch_related), so what applies to first object applies to all. - model = instances[0].__class__ - try: - model._meta.get_field(to_attr) - except exceptions.FieldDoesNotExist: - pass - else: - msg = "to_attr={} conflicts with a field on the {} model." - raise ValueError(msg.format(to_attr, model.__name__)) - - # Whether or not we're prefetching the last part of the lookup. - leaf = len(lookup.prefetch_through.split(LOOKUP_SEP)) - 1 == level - - for obj in instances: - instance_attr_val = instance_attr(obj) - vals = rel_obj_cache.get(instance_attr_val, []) - - if single: - val = vals[0] if vals else None - if as_attr: - # A to_attr has been given for the prefetch. - setattr(obj, to_attr, val) - elif is_descriptor: - # cache_name points to a field name in obj. - # This field is a descriptor for a related object. - setattr(obj, cache_name, val) - else: - # No to_attr has been given for this prefetch operation and the - # cache_name does not point to a descriptor. Store the value of - # the field in the object's field cache. - obj._state.fields_cache[cache_name] = val - else: - if as_attr: - setattr(obj, to_attr, vals) - else: - manager = getattr(obj, to_attr) - if leaf and lookup.queryset is not None: - qs = manager._apply_rel_filters(lookup.queryset) - else: - qs = manager.get_queryset() - qs._result_cache = vals - # We don't want the individual qs doing prefetch_related now, - # since we have merged this into the current work. - qs._prefetch_done = True - obj._prefetched_objects_cache[cache_name] = qs - return all_related_objects, additional_lookups - - -class RelatedPopulator: - """ - RelatedPopulator is used for select_related() object instantiation. - - The idea is that each select_related() model will be populated by a - different RelatedPopulator instance. The RelatedPopulator instances get - klass_info and select (computed in SQLCompiler) plus the used db as - input for initialization. That data is used to compute which columns - to use, how to instantiate the model, and how to populate the links - between the objects. - - The actual creation of the objects is done in populate() method. This - method gets row and from_obj as input and populates the select_related() - model instance. - """ - - def __init__(self, klass_info, select, db): - self.db = db - # Pre-compute needed attributes. The attributes are: - # - model_cls: the possibly deferred model class to instantiate - # - either: - # - cols_start, cols_end: usually the columns in the row are - # in the same order model_cls.__init__ expects them, so we - # can instantiate by model_cls(*row[cols_start:cols_end]) - # - reorder_for_init: When select_related descends to a child - # class, then we want to reuse the already selected parent - # data. However, in this case the parent data isn't necessarily - # in the same order that Model.__init__ expects it to be, so - # we have to reorder the parent data. The reorder_for_init - # attribute contains a function used to reorder the field data - # in the order __init__ expects it. - # - pk_idx: the index of the primary key field in the reordered - # model data. Used to check if a related object exists at all. - # - init_list: the field attnames fetched from the database. For - # deferred models this isn't the same as all attnames of the - # model's fields. - # - related_populators: a list of RelatedPopulator instances if - # select_related() descends to related models from this model. - # - local_setter, remote_setter: Methods to set cached values on - # the object being populated and on the remote object. Usually - # these are Field.set_cached_value() methods. - select_fields = klass_info["select_fields"] - from_parent = klass_info["from_parent"] - if not from_parent: - self.cols_start = select_fields[0] - self.cols_end = select_fields[-1] + 1 - self.init_list = [ - f[0].target.attname for f in select[self.cols_start : self.cols_end] - ] - self.reorder_for_init = None - else: - attname_indexes = { - select[idx][0].target.attname: idx for idx in select_fields - } - model_init_attnames = ( - f.attname for f in klass_info["model"]._meta.concrete_fields - ) - self.init_list = [ - attname for attname in model_init_attnames if attname in attname_indexes - ] - self.reorder_for_init = operator.itemgetter( - *[attname_indexes[attname] for attname in self.init_list] - ) - - self.model_cls = klass_info["model"] - self.pk_idx = self.init_list.index(self.model_cls._meta.pk.attname) - self.related_populators = get_related_populators(klass_info, select, self.db) - self.local_setter = klass_info["local_setter"] - self.remote_setter = klass_info["remote_setter"] - - def populate(self, row, from_obj): - if self.reorder_for_init: - obj_data = self.reorder_for_init(row) - else: - obj_data = row[self.cols_start : self.cols_end] - if obj_data[self.pk_idx] is None: - obj = None - else: - obj = self.model_cls.from_db(self.db, self.init_list, obj_data) - for rel_iter in self.related_populators: - rel_iter.populate(row, obj) - self.local_setter(from_obj, obj) - if obj is not None: - self.remote_setter(obj, from_obj) - - -def get_related_populators(klass_info, select, db): - iterators = [] - related_klass_infos = klass_info.get("related_klass_infos", []) - for rel_klass_info in related_klass_infos: - rel_cls = RelatedPopulator(rel_klass_info, select, db) - iterators.append(rel_cls) - return iterators diff --git a/.venv/lib/python3.10/site-packages/django/db/models/query_utils.py b/.venv/lib/python3.10/site-packages/django/db/models/query_utils.py deleted file mode 100644 index f0ae810..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/query_utils.py +++ /dev/null @@ -1,494 +0,0 @@ -""" -Various data structures used in query construction. - -Factored out from django.db.models.query to avoid making the main module very -large and/or so that they can be used by other modules without getting into -circular import difficulties. -""" - -import functools -import inspect -import logging -from collections import namedtuple -from contextlib import nullcontext - -from django.core.exceptions import FieldError -from django.db import DEFAULT_DB_ALIAS, DatabaseError, connections, transaction -from django.db.models.constants import LOOKUP_SEP -from django.utils import tree -from django.utils.functional import cached_property -from django.utils.hashable import make_hashable - -logger = logging.getLogger("django.db.models") - -# PathInfo is used when converting lookups (fk__somecol). The contents -# describe the relation in Model terms (model Options and Fields for both -# sides of the relation. The join_field is the field backing the relation. -PathInfo = namedtuple( - "PathInfo", - "from_opts to_opts target_fields join_field m2m direct filtered_relation", -) - - -def subclasses(cls): - yield cls - for subclass in cls.__subclasses__(): - yield from subclasses(subclass) - - -class Q(tree.Node): - """ - Encapsulate filters as objects that can then be combined logically (using - `&` and `|`). - """ - - # Connection types - AND = "AND" - OR = "OR" - XOR = "XOR" - default = AND - conditional = True - - def __init__(self, *args, _connector=None, _negated=False, **kwargs): - super().__init__( - children=[*args, *sorted(kwargs.items())], - connector=_connector, - negated=_negated, - ) - - def _combine(self, other, conn): - if getattr(other, "conditional", False) is False: - raise TypeError(other) - if not self: - return other.copy() - if not other and isinstance(other, Q): - return self.copy() - - obj = self.create(connector=conn) - obj.add(self, conn) - obj.add(other, conn) - return obj - - def __or__(self, other): - return self._combine(other, self.OR) - - def __and__(self, other): - return self._combine(other, self.AND) - - def __xor__(self, other): - return self._combine(other, self.XOR) - - def __invert__(self): - obj = self.copy() - obj.negate() - return obj - - def resolve_expression( - self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False - ): - # We must promote any new joins to left outer joins so that when Q is - # used as an expression, rows aren't filtered due to joins. - clause, joins = query._add_q( - self, - reuse, - allow_joins=allow_joins, - split_subq=False, - check_filterable=False, - summarize=summarize, - ) - query.promote_joins(joins) - return clause - - def flatten(self): - """ - Recursively yield this Q object and all subexpressions, in depth-first - order. - """ - yield self - for child in self.children: - if isinstance(child, tuple): - # Use the lookup. - child = child[1] - if hasattr(child, "flatten"): - yield from child.flatten() - else: - yield child - - def check(self, against, using=DEFAULT_DB_ALIAS): - """ - Do a database query to check if the expressions of the Q instance - matches against the expressions. - """ - # Avoid circular imports. - from django.db.models import BooleanField, Value - from django.db.models.functions import Coalesce - from django.db.models.sql import Query - from django.db.models.sql.constants import SINGLE - - query = Query(None) - for name, value in against.items(): - if not hasattr(value, "resolve_expression"): - value = Value(value) - query.add_annotation(value, name, select=False) - query.add_annotation(Value(1), "_check") - connection = connections[using] - # This will raise a FieldError if a field is missing in "against". - if connection.features.supports_comparing_boolean_expr: - query.add_q(Q(Coalesce(self, True, output_field=BooleanField()))) - else: - query.add_q(self) - compiler = query.get_compiler(using=using) - context_manager = ( - transaction.atomic(using=using) - if connection.in_atomic_block - else nullcontext() - ) - try: - with context_manager: - return compiler.execute_sql(SINGLE) is not None - except DatabaseError as e: - logger.warning("Got a database error calling check() on %r: %s", self, e) - return True - - def deconstruct(self): - path = "%s.%s" % (self.__class__.__module__, self.__class__.__name__) - if path.startswith("django.db.models.query_utils"): - path = path.replace("django.db.models.query_utils", "django.db.models") - args = tuple(self.children) - kwargs = {} - if self.connector != self.default: - kwargs["_connector"] = self.connector - if self.negated: - kwargs["_negated"] = True - return path, args, kwargs - - @cached_property - def identity(self): - path, args, kwargs = self.deconstruct() - identity = [path, *kwargs.items()] - for child in args: - if isinstance(child, tuple): - arg, value = child - value = make_hashable(value) - identity.append((arg, value)) - else: - identity.append(child) - return tuple(identity) - - def __eq__(self, other): - if not isinstance(other, Q): - return NotImplemented - return other.identity == self.identity - - def __hash__(self): - return hash(self.identity) - - @cached_property - def referenced_base_fields(self): - """ - Retrieve all base fields referenced directly or through F expressions - excluding any fields referenced through joins. - """ - # Avoid circular imports. - from django.db.models.sql import query - - return { - child.split(LOOKUP_SEP, 1)[0] for child in query.get_children_from_q(self) - } - - -class DeferredAttribute: - """ - A wrapper for a deferred-loading field. When the value is read from this - object the first time, the query is executed. - """ - - def __init__(self, field): - self.field = field - - def __get__(self, instance, cls=None): - """ - Retrieve and caches the value from the datastore on the first lookup. - Return the cached value. - """ - if instance is None: - return self - data = instance.__dict__ - field_name = self.field.attname - if field_name not in data: - # Let's see if the field is part of the parent chain. If so we - # might be able to reuse the already loaded value. Refs #18343. - val = self._check_parent_chain(instance) - if val is None: - if not instance._is_pk_set() and self.field.generated: - raise AttributeError( - "Cannot read a generated field from an unsaved model." - ) - instance.refresh_from_db(fields=[field_name]) - else: - data[field_name] = val - return data[field_name] - - def _check_parent_chain(self, instance): - """ - Check if the field value can be fetched from a parent field already - loaded in the instance. This can be done if the to-be fetched - field is a primary key field. - """ - opts = instance._meta - link_field = opts.get_ancestor_link(self.field.model) - if self.field.primary_key and self.field != link_field: - return getattr(instance, link_field.attname) - return None - - -class class_or_instance_method: - """ - Hook used in RegisterLookupMixin to return partial functions depending on - the caller type (instance or class of models.Field). - """ - - def __init__(self, class_method, instance_method): - self.class_method = class_method - self.instance_method = instance_method - - def __get__(self, instance, owner): - if instance is None: - return functools.partial(self.class_method, owner) - return functools.partial(self.instance_method, instance) - - -class RegisterLookupMixin: - def _get_lookup(self, lookup_name): - return self.get_lookups().get(lookup_name, None) - - @functools.cache - def get_class_lookups(cls): - class_lookups = [ - parent.__dict__.get("class_lookups", {}) for parent in inspect.getmro(cls) - ] - return cls.merge_dicts(class_lookups) - - def get_instance_lookups(self): - class_lookups = self.get_class_lookups() - if instance_lookups := getattr(self, "instance_lookups", None): - return {**class_lookups, **instance_lookups} - return class_lookups - - get_lookups = class_or_instance_method(get_class_lookups, get_instance_lookups) - get_class_lookups = classmethod(get_class_lookups) - - def get_lookup(self, lookup_name): - from django.db.models.lookups import Lookup - - found = self._get_lookup(lookup_name) - if found is None and hasattr(self, "output_field"): - return self.output_field.get_lookup(lookup_name) - if found is not None and not issubclass(found, Lookup): - return None - return found - - def get_transform(self, lookup_name): - from django.db.models.lookups import Transform - - found = self._get_lookup(lookup_name) - if found is None and hasattr(self, "output_field"): - return self.output_field.get_transform(lookup_name) - if found is not None and not issubclass(found, Transform): - return None - return found - - @staticmethod - def merge_dicts(dicts): - """ - Merge dicts in reverse to preference the order of the original list. e.g., - merge_dicts([a, b]) will preference the keys in 'a' over those in 'b'. - """ - merged = {} - for d in reversed(dicts): - merged.update(d) - return merged - - @classmethod - def _clear_cached_class_lookups(cls): - for subclass in subclasses(cls): - subclass.get_class_lookups.cache_clear() - - def register_class_lookup(cls, lookup, lookup_name=None): - if lookup_name is None: - lookup_name = lookup.lookup_name - if "class_lookups" not in cls.__dict__: - cls.class_lookups = {} - cls.class_lookups[lookup_name] = lookup - cls._clear_cached_class_lookups() - return lookup - - def register_instance_lookup(self, lookup, lookup_name=None): - if lookup_name is None: - lookup_name = lookup.lookup_name - if "instance_lookups" not in self.__dict__: - self.instance_lookups = {} - self.instance_lookups[lookup_name] = lookup - return lookup - - register_lookup = class_or_instance_method( - register_class_lookup, register_instance_lookup - ) - register_class_lookup = classmethod(register_class_lookup) - - def _unregister_class_lookup(cls, lookup, lookup_name=None): - """ - Remove given lookup from cls lookups. For use in tests only as it's - not thread-safe. - """ - if lookup_name is None: - lookup_name = lookup.lookup_name - del cls.class_lookups[lookup_name] - cls._clear_cached_class_lookups() - - def _unregister_instance_lookup(self, lookup, lookup_name=None): - """ - Remove given lookup from instance lookups. For use in tests only as - it's not thread-safe. - """ - if lookup_name is None: - lookup_name = lookup.lookup_name - del self.instance_lookups[lookup_name] - - _unregister_lookup = class_or_instance_method( - _unregister_class_lookup, _unregister_instance_lookup - ) - _unregister_class_lookup = classmethod(_unregister_class_lookup) - - -def select_related_descend(field, restricted, requested, select_mask): - """ - Return whether `field` should be used to descend deeper for - `select_related()` purposes. - - Arguments: - * `field` - the field to be checked. Can be either a `Field` or - `ForeignObjectRel` instance. - * `restricted` - a boolean field, indicating if the field list has been - manually restricted using a select_related() clause. - * `requested` - the select_related() dictionary. - * `select_mask` - the dictionary of selected fields. - """ - # Only relationships can be descended. - if not field.remote_field: - return False - # Forward MTI parent links should not be explicitly descended as they are - # always JOIN'ed against (unless excluded by `select_mask`). - if getattr(field.remote_field, "parent_link", False): - return False - # When `select_related()` is used without a `*requested` mask all - # relationships are descended unless they are nullable. - if not restricted: - return not field.null - # When `select_related(*requested)` is used only fields that are part of - # `requested` should be descended. - if field.name not in requested: - return False - # Prevent invalid usages of `select_related()` and `only()`/`defer()` such - # as `select_related("a").only("b")` and `select_related("a").defer("a")`. - if select_mask and field not in select_mask: - raise FieldError( - f"Field {field.model._meta.object_name}.{field.name} cannot be both " - "deferred and traversed using select_related at the same time." - ) - return True - - -def refs_expression(lookup_parts, annotations): - """ - Check if the lookup_parts contains references to the given annotations set. - Because the LOOKUP_SEP is contained in the default annotation names, check - each prefix of the lookup_parts for a match. - """ - for n in range(1, len(lookup_parts) + 1): - level_n_lookup = LOOKUP_SEP.join(lookup_parts[0:n]) - if annotations.get(level_n_lookup): - return level_n_lookup, lookup_parts[n:] - return None, () - - -def check_rel_lookup_compatibility(model, target_opts, field): - """ - Check that self.model is compatible with target_opts. Compatibility - is OK if: - 1) model and opts match (where proxy inheritance is removed) - 2) model is parent of opts' model or the other way around - """ - - def check(opts): - return ( - model._meta.concrete_model == opts.concrete_model - or opts.concrete_model in model._meta.all_parents - or model in opts.all_parents - ) - - # If the field is a primary key, then doing a query against the field's - # model is ok, too. Consider the case: - # class Restaurant(models.Model): - # place = OneToOneField(Place, primary_key=True): - # Restaurant.objects.filter(pk__in=Restaurant.objects.all()). - # If we didn't have the primary key check, then pk__in (== place__in) would - # give Place's opts as the target opts, but Restaurant isn't compatible - # with that. This logic applies only to primary keys, as when doing __in=qs, - # we are going to turn this into __in=qs.values('pk') later on. - return check(target_opts) or ( - getattr(field, "primary_key", False) and check(field.model._meta) - ) - - -class FilteredRelation: - """Specify custom filtering in the ON clause of SQL joins.""" - - def __init__(self, relation_name, *, condition=Q()): - if not relation_name: - raise ValueError("relation_name cannot be empty.") - self.relation_name = relation_name - self.alias = None - if not isinstance(condition, Q): - raise ValueError("condition argument must be a Q() instance.") - # .condition and .resolved_condition have to be stored independently - # as the former must remain unchanged for Join.__eq__ to remain stable - # and reusable even once their .filtered_relation are resolved. - self.condition = condition - self.resolved_condition = None - - def __eq__(self, other): - if not isinstance(other, self.__class__): - return NotImplemented - return ( - self.relation_name == other.relation_name - and self.alias == other.alias - and self.condition == other.condition - ) - - def clone(self): - clone = FilteredRelation(self.relation_name, condition=self.condition) - clone.alias = self.alias - if (resolved_condition := self.resolved_condition) is not None: - clone.resolved_condition = resolved_condition.clone() - return clone - - def relabeled_clone(self, change_map): - clone = self.clone() - if resolved_condition := clone.resolved_condition: - clone.resolved_condition = resolved_condition.relabeled_clone(change_map) - return clone - - def resolve_expression(self, query, reuse, *args, **kwargs): - clone = self.clone() - clone.resolved_condition = query.build_filter( - self.condition, - can_reuse=reuse, - allow_joins=True, - split_subq=False, - update_join_types=False, - )[0] - return clone - - def as_sql(self, compiler, connection): - return compiler.compile(self.resolved_condition) diff --git a/.venv/lib/python3.10/site-packages/django/db/models/signals.py b/.venv/lib/python3.10/site-packages/django/db/models/signals.py deleted file mode 100644 index a072093..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/signals.py +++ /dev/null @@ -1,54 +0,0 @@ -from functools import partial - -from django.db.models.utils import make_model_tuple -from django.dispatch import Signal - -class_prepared = Signal() - - -class ModelSignal(Signal): - """ - Signal subclass that allows the sender to be lazily specified as a string - of the `app_label.ModelName` form. - """ - - def _lazy_method(self, method, apps, receiver, sender, **kwargs): - from django.db.models.options import Options - - # This partial takes a single optional argument named "sender". - partial_method = partial(method, receiver, **kwargs) - if isinstance(sender, str): - apps = apps or Options.default_apps - apps.lazy_model_operation(partial_method, make_model_tuple(sender)) - else: - return partial_method(sender) - - def connect(self, receiver, sender=None, weak=True, dispatch_uid=None, apps=None): - self._lazy_method( - super().connect, - apps, - receiver, - sender, - weak=weak, - dispatch_uid=dispatch_uid, - ) - - def disconnect(self, receiver=None, sender=None, dispatch_uid=None, apps=None): - return self._lazy_method( - super().disconnect, apps, receiver, sender, dispatch_uid=dispatch_uid - ) - - -pre_init = ModelSignal(use_caching=True) -post_init = ModelSignal(use_caching=True) - -pre_save = ModelSignal(use_caching=True) -post_save = ModelSignal(use_caching=True) - -pre_delete = ModelSignal(use_caching=True) -post_delete = ModelSignal(use_caching=True) - -m2m_changed = ModelSignal(use_caching=True) - -pre_migrate = Signal() -post_migrate = Signal() diff --git a/.venv/lib/python3.10/site-packages/django/db/models/sql/__init__.py b/.venv/lib/python3.10/site-packages/django/db/models/sql/__init__.py deleted file mode 100644 index dd31a6e..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/sql/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.db.models.sql.query import * # NOQA -from django.db.models.sql.query import Query -from django.db.models.sql.subqueries import * # NOQA -from django.db.models.sql.where import AND, OR, XOR - -__all__ = ["Query", "AND", "OR", "XOR"] diff --git a/.venv/lib/python3.10/site-packages/django/db/models/sql/compiler.py b/.venv/lib/python3.10/site-packages/django/db/models/sql/compiler.py deleted file mode 100644 index 0b6cfbf..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/sql/compiler.py +++ /dev/null @@ -1,2173 +0,0 @@ -import collections -import json -import re -from functools import partial -from itertools import chain - -from django.core.exceptions import EmptyResultSet, FieldError, FullResultSet -from django.db import DatabaseError, NotSupportedError -from django.db.models.constants import LOOKUP_SEP -from django.db.models.expressions import ColPairs, F, OrderBy, RawSQL, Ref, Value -from django.db.models.fields import AutoField, composite -from django.db.models.functions import Cast, Random -from django.db.models.lookups import Lookup -from django.db.models.query_utils import select_related_descend -from django.db.models.sql.constants import ( - CURSOR, - GET_ITERATOR_CHUNK_SIZE, - MULTI, - NO_RESULTS, - ORDER_DIR, - ROW_COUNT, - SINGLE, -) -from django.db.models.sql.query import Query, get_order_dir -from django.db.transaction import TransactionManagementError -from django.utils.functional import cached_property -from django.utils.hashable import make_hashable -from django.utils.regex_helper import _lazy_re_compile - - -class PositionRef(Ref): - def __init__(self, ordinal, refs, source): - self.ordinal = ordinal - super().__init__(refs, source) - - def as_sql(self, compiler, connection): - return str(self.ordinal), () - - -class SQLCompiler: - # Multiline ordering SQL clause may appear from RawSQL. - ordering_parts = _lazy_re_compile( - r"^(.*)\s(?:ASC|DESC).*", - re.MULTILINE | re.DOTALL, - ) - - def __init__(self, query, connection, using, elide_empty=True): - self.query = query - self.connection = connection - self.using = using - # Some queries, e.g. coalesced aggregation, need to be executed even if - # they would return an empty result set. - self.elide_empty = elide_empty - self.quote_cache = {"*": "*"} - # The select, klass_info, and annotations are needed by QuerySet.iterator() - # these are set as a side-effect of executing the query. Note that we calculate - # separately a list of extra select columns needed for grammatical correctness - # of the query, but these columns are not included in self.select. - self.select = None - self.annotation_col_map = None - self.klass_info = None - self._meta_ordering = None - - def __repr__(self): - return ( - f"<{self.__class__.__qualname__} " - f"model={self.query.model.__qualname__} " - f"connection={self.connection!r} using={self.using!r}>" - ) - - def setup_query(self, with_col_aliases=False): - if all(self.query.alias_refcount[a] == 0 for a in self.query.alias_map): - self.query.get_initial_alias() - self.select, self.klass_info, self.annotation_col_map = self.get_select( - with_col_aliases=with_col_aliases, - ) - self.col_count = len(self.select) - - def pre_sql_setup(self, with_col_aliases=False): - """ - Do any necessary class setup immediately prior to producing SQL. This - is for things that can't necessarily be done in __init__ because we - might not have all the pieces in place at that time. - """ - self.setup_query(with_col_aliases=with_col_aliases) - order_by = self.get_order_by() - self.where, self.having, self.qualify = self.query.where.split_having_qualify( - must_group_by=self.query.group_by is not None - ) - extra_select = self.get_extra_select(order_by, self.select) - self.has_extra_select = bool(extra_select) - group_by = self.get_group_by(self.select + extra_select, order_by) - return extra_select, order_by, group_by - - def get_group_by(self, select, order_by): - """ - Return a list of 2-tuples of form (sql, params). - - The logic of what exactly the GROUP BY clause contains is hard - to describe in other words than "if it passes the test suite, - then it is correct". - """ - # Some examples: - # SomeModel.objects.annotate(Count('somecol')) - # GROUP BY: all fields of the model - # - # SomeModel.objects.values('name').annotate(Count('somecol')) - # GROUP BY: name - # - # SomeModel.objects.annotate(Count('somecol')).values('name') - # GROUP BY: all cols of the model - # - # SomeModel.objects.values('name', 'pk') - # .annotate(Count('somecol')).values('pk') - # GROUP BY: name, pk - # - # SomeModel.objects.values('name').annotate(Count('somecol')).values('pk') - # GROUP BY: name, pk - # - # In fact, the self.query.group_by is the minimal set to GROUP BY. It - # can't be ever restricted to a smaller set, but additional columns in - # HAVING, ORDER BY, and SELECT clauses are added to it. Unfortunately - # the end result is that it is impossible to force the query to have - # a chosen GROUP BY clause - you can almost do this by using the form: - # .values(*wanted_cols).annotate(AnAggregate()) - # but any later annotations, extra selects, values calls that - # refer some column outside of the wanted_cols, order_by, or even - # filter calls can alter the GROUP BY clause. - - # The query.group_by is either None (no GROUP BY at all), True - # (group by select fields), or a list of expressions to be added - # to the group by. - if self.query.group_by is None: - return [] - expressions = [] - group_by_refs = set() - if self.query.group_by is not True: - # If the group by is set to a list (by .values() call most likely), - # then we need to add everything in it to the GROUP BY clause. - # Backwards compatibility hack for setting query.group_by. Remove - # when we have public API way of forcing the GROUP BY clause. - # Converts string references to expressions. - for expr in self.query.group_by: - if not hasattr(expr, "as_sql"): - expr = self.query.resolve_ref(expr) - if isinstance(expr, Ref): - if expr.refs not in group_by_refs: - group_by_refs.add(expr.refs) - expressions.append(expr.source) - else: - expressions.append(expr) - # Note that even if the group_by is set, it is only the minimal - # set to group by. So, we need to add cols in select, order_by, and - # having into the select in any case. - selected_expr_positions = {} - for ordinal, (expr, _, alias) in enumerate(select, start=1): - if alias: - selected_expr_positions[expr] = ordinal - # Skip members of the select clause that are already explicitly - # grouped against. - if alias in group_by_refs: - continue - expressions.extend(expr.get_group_by_cols()) - if not self._meta_ordering: - for expr, (sql, params, is_ref) in order_by: - # Skip references to the SELECT clause, as all expressions in - # the SELECT clause are already part of the GROUP BY. - if not is_ref: - expressions.extend(expr.get_group_by_cols()) - having_group_by = self.having.get_group_by_cols() if self.having else () - for expr in having_group_by: - expressions.append(expr) - result = [] - seen = set() - expressions = self.collapse_group_by(expressions, having_group_by) - - allows_group_by_select_index = ( - self.connection.features.allows_group_by_select_index - ) - for expr in expressions: - try: - sql, params = self.compile(expr) - except (EmptyResultSet, FullResultSet): - continue - if ( - allows_group_by_select_index - and (position := selected_expr_positions.get(expr)) is not None - ): - sql, params = str(position), () - else: - sql, params = expr.select_format(self, sql, params) - params_hash = make_hashable(params) - if (sql, params_hash) not in seen: - result.append((sql, params)) - seen.add((sql, params_hash)) - return result - - def collapse_group_by(self, expressions, having): - # If the database supports group by functional dependence reduction, - # then the expressions can be reduced to the set of selected table - # primary keys as all other columns are functionally dependent on them. - if self.connection.features.allows_group_by_selected_pks: - # Filter out all expressions associated with a table's primary key - # present in the grouped columns. This is done by identifying all - # tables that have their primary key included in the grouped - # columns and removing non-primary key columns referring to them. - # Unmanaged models are excluded because they could be representing - # database views on which the optimization might not be allowed. - pks = { - expr - for expr in expressions - if ( - hasattr(expr, "target") - and expr.target.primary_key - and self.connection.features.allows_group_by_selected_pks_on_model( - expr.target.model - ) - ) - } - aliases = {expr.alias for expr in pks} - expressions = [ - expr - for expr in expressions - if expr in pks - or expr in having - or getattr(expr, "alias", None) not in aliases - ] - return expressions - - def get_select(self, with_col_aliases=False): - """ - Return three values: - - a list of 3-tuples of (expression, (sql, params), alias) - - a klass_info structure, - - a dictionary of annotations - - The (sql, params) is what the expression will produce, and alias is the - "AS alias" for the column (possibly None). - - The klass_info structure contains the following information: - - The base model of the query. - - Which columns for that model are present in the query (by - position of the select clause). - - related_klass_infos: [f, klass_info] to descent into - - The annotations is a dictionary of {'attname': column position} values. - """ - select = [] - klass_info = None - annotations = {} - assert not (self.query.select and self.query.default_cols) - select_mask = self.query.get_select_mask() - if self.query.default_cols: - cols = self.get_default_columns(select_mask) - else: - # self.query.select is a special case. These columns never go to - # any model. - cols = self.query.select - if cols: - klass_info = { - "model": self.query.model, - "select_fields": list( - range( - len(self.query.extra_select), - len(self.query.extra_select) + len(cols), - ) - ), - } - selected = [] - if self.query.selected is None: - selected = [ - *( - (alias, RawSQL(*args)) - for alias, args in self.query.extra_select.items() - ), - *((None, col) for col in cols), - *self.query.annotation_select.items(), - ] - else: - for alias, expression in self.query.selected.items(): - # Reference to an annotation. - if isinstance(expression, str): - expression = self.query.annotations[expression] - # Reference to a column. - elif isinstance(expression, int): - expression = cols[expression] - # ColPairs cannot be aliased. - if isinstance(expression, ColPairs): - alias = None - selected.append((alias, expression)) - - for select_idx, (alias, expression) in enumerate(selected): - if alias: - annotations[alias] = select_idx - select.append((expression, alias)) - - if self.query.select_related: - related_klass_infos = self.get_related_selections(select, select_mask) - klass_info["related_klass_infos"] = related_klass_infos - - def get_select_from_parent(klass_info): - for ki in klass_info["related_klass_infos"]: - if ki["from_parent"]: - ki["select_fields"] = ( - klass_info["select_fields"] + ki["select_fields"] - ) - get_select_from_parent(ki) - - get_select_from_parent(klass_info) - - ret = [] - col_idx = 1 - for col, alias in select: - try: - sql, params = self.compile(col) - except EmptyResultSet: - empty_result_set_value = getattr( - col, "empty_result_set_value", NotImplemented - ) - if empty_result_set_value is NotImplemented: - # Select a predicate that's always False. - sql, params = "0", () - else: - sql, params = self.compile(Value(empty_result_set_value)) - except FullResultSet: - sql, params = self.compile(Value(True)) - else: - sql, params = col.select_format(self, sql, params) - if alias is None and with_col_aliases: - alias = f"col{col_idx}" - col_idx += 1 - ret.append((col, (sql, params), alias)) - return ret, klass_info, annotations - - def _order_by_pairs(self): - if self.query.extra_order_by: - ordering = self.query.extra_order_by - elif not self.query.default_ordering: - ordering = self.query.order_by - elif self.query.order_by: - ordering = self.query.order_by - elif (meta := self.query.get_meta()) and meta.ordering: - ordering = meta.ordering - self._meta_ordering = ordering - else: - ordering = [] - if self.query.standard_ordering: - default_order, _ = ORDER_DIR["ASC"] - else: - default_order, _ = ORDER_DIR["DESC"] - - selected_exprs = {} - # Avoid computing `selected_exprs` if there is no `ordering` as it's - # relatively expensive. - if ordering and (select := self.select): - for ordinal, (expr, _, alias) in enumerate(select, start=1): - pos_expr = PositionRef(ordinal, alias, expr) - if alias: - selected_exprs[alias] = pos_expr - selected_exprs[expr] = pos_expr - - for field in ordering: - if hasattr(field, "resolve_expression"): - if isinstance(field, Value): - # output_field must be resolved for constants. - field = Cast(field, field.output_field) - if not isinstance(field, OrderBy): - field = field.asc() - if not self.query.standard_ordering: - field = field.copy() - field.reverse_ordering() - select_ref = selected_exprs.get(field.expression) - if select_ref or ( - isinstance(field.expression, F) - and (select_ref := selected_exprs.get(field.expression.name)) - ): - # Emulation of NULLS (FIRST|LAST) cannot be combined with - # the usage of ordering by position. - if ( - field.nulls_first is None and field.nulls_last is None - ) or self.connection.features.supports_order_by_nulls_modifier: - field = field.copy() - field.expression = select_ref - # Alias collisions are not possible when dealing with - # combined queries so fallback to it if emulation of NULLS - # handling is required. - elif self.query.combinator: - field = field.copy() - field.expression = Ref(select_ref.refs, select_ref.source) - yield field, select_ref is not None - continue - if field == "?": # random - yield OrderBy(Random()), False - continue - - col, order = get_order_dir(field, default_order) - descending = order == "DESC" - - if select_ref := selected_exprs.get(col): - # Reference to expression in SELECT clause - yield ( - OrderBy( - select_ref, - descending=descending, - ), - True, - ) - continue - - if expr := self.query.annotations.get(col): - ref = col - transforms = [] - else: - ref, *transforms = col.split(LOOKUP_SEP) - expr = self.query.annotations.get(ref) - if expr: - if self.query.combinator and self.select: - if transforms: - raise NotImplementedError( - "Ordering combined queries by transforms is not " - "implemented." - ) - # Don't use the resolved annotation because other - # combined queries might define it differently. - expr = F(ref) - if transforms: - for name in transforms: - expr = self.query.try_transform(expr, name) - if isinstance(expr, Value): - # output_field must be resolved for constants. - expr = Cast(expr, expr.output_field) - yield OrderBy(expr, descending=descending), False - continue - - if "." in field: - # This came in through an extra(order_by=...) addition. Pass it - # on verbatim. - table, col = col.split(".", 1) - yield ( - OrderBy( - RawSQL( - "%s.%s" % (self.quote_name_unless_alias(table), col), [] - ), - descending=descending, - ), - False, - ) - continue - - if self.query.extra and col in self.query.extra: - if col in self.query.extra_select: - yield ( - OrderBy( - Ref(col, RawSQL(*self.query.extra[col])), - descending=descending, - ), - True, - ) - else: - yield ( - OrderBy(RawSQL(*self.query.extra[col]), descending=descending), - False, - ) - else: - if self.query.combinator and self.select: - # Don't use the first model's field because other - # combinated queries might define it differently. - yield OrderBy(F(col), descending=descending), False - else: - # 'col' is of the form 'field' or 'field1__field2' or - # '-field1__field2__field', etc. - yield from self.find_ordering_name( - field, - self.query.get_meta(), - default_order=default_order, - ) - - def get_order_by(self): - """ - Return a list of 2-tuples of the form (expr, (sql, params, is_ref)) for - the ORDER BY clause. - - The order_by clause can alter the select clause (for example it can add - aliases to clauses that do not yet have one, or it can add totally new - select clauses). - """ - result = [] - seen = set() - for expr, is_ref in self._order_by_pairs(): - resolved = expr.resolve_expression(self.query, allow_joins=True, reuse=None) - if not is_ref and self.query.combinator and self.select: - src = resolved.expression - expr_src = expr.expression - for sel_expr, _, col_alias in self.select: - if src == sel_expr: - # When values() is used the exact alias must be used to - # reference annotations. - if ( - self.query.has_select_fields - and col_alias in self.query.annotation_select - and not ( - isinstance(expr_src, F) and col_alias == expr_src.name - ) - ): - continue - resolved.set_source_expressions( - [Ref(col_alias if col_alias else src.target.column, src)] - ) - break - else: - # Add column used in ORDER BY clause to the selected - # columns and to each combined query. - order_by_idx = len(self.query.select) + 1 - col_alias = f"__orderbycol{order_by_idx}" - for q in self.query.combined_queries: - # If fields were explicitly selected through values() - # combined queries cannot be augmented. - if q.has_select_fields: - raise DatabaseError( - "ORDER BY term does not match any column in " - "the result set." - ) - q.add_annotation(expr_src, col_alias) - self.query.add_select_col(resolved, col_alias) - resolved.set_source_expressions([Ref(col_alias, src)]) - sql, params = self.compile(resolved) - # Don't add the same column twice, but the order direction is - # not taken into account so we strip it. When this entire method - # is refactored into expressions, then we can check each part as we - # generate it. - without_ordering = self.ordering_parts.search(sql)[1] - params_hash = make_hashable(params) - if (without_ordering, params_hash) in seen: - continue - seen.add((without_ordering, params_hash)) - result.append((resolved, (sql, params, is_ref))) - return result - - def get_extra_select(self, order_by, select): - extra_select = [] - if self.query.distinct and not self.query.distinct_fields: - select_sql = [t[1] for t in select] - for expr, (sql, params, is_ref) in order_by: - without_ordering = self.ordering_parts.search(sql)[1] - if not is_ref and (without_ordering, params) not in select_sql: - extra_select.append((expr, (without_ordering, params), None)) - return extra_select - - def quote_name_unless_alias(self, name): - """ - A wrapper around connection.ops.quote_name that doesn't quote aliases - for table names. This avoids problems with some SQL dialects that treat - quoted strings specially (e.g. PostgreSQL). - """ - if name in self.quote_cache: - return self.quote_cache[name] - if ( - (name in self.query.alias_map and name not in self.query.table_map) - or name in self.query.extra_select - or ( - self.query.external_aliases.get(name) - and name not in self.query.table_map - ) - ): - self.quote_cache[name] = name - return name - r = self.connection.ops.quote_name(name) - self.quote_cache[name] = r - return r - - def compile(self, node): - vendor_impl = getattr(node, "as_" + self.connection.vendor, None) - if vendor_impl: - sql, params = vendor_impl(self, self.connection) - else: - sql, params = node.as_sql(self, self.connection) - return sql, params - - def get_combinator_sql(self, combinator, all): - features = self.connection.features - compilers = [ - query.get_compiler(self.using, self.connection, self.elide_empty) - for query in self.query.combined_queries - ] - if not features.supports_slicing_ordering_in_compound: - for compiler in compilers: - if compiler.query.is_sliced: - raise DatabaseError( - "LIMIT/OFFSET not allowed in subqueries of compound statements." - ) - if compiler.get_order_by(): - raise DatabaseError( - "ORDER BY not allowed in subqueries of compound statements." - ) - parts = [] - empty_compiler = None - for compiler in compilers: - try: - parts.append(self._get_combinator_part_sql(compiler)) - except EmptyResultSet: - # Omit the empty queryset with UNION and with DIFFERENCE if the - # first queryset is nonempty. - if combinator == "union" or (combinator == "difference" and parts): - empty_compiler = compiler - continue - raise - if not parts: - raise EmptyResultSet - elif len(parts) == 1 and combinator == "union" and self.query.is_sliced: - # A sliced union cannot be composed of a single component because - # in the event the later is also sliced it might result in invalid - # SQL due to the usage of multiple LIMIT clauses. Prevent that from - # happening by always including an empty resultset query to force - # the creation of an union. - empty_compiler.elide_empty = False - parts.append(self._get_combinator_part_sql(empty_compiler)) - combinator_sql = self.connection.ops.set_operators[combinator] - if all and combinator == "union": - combinator_sql += " ALL" - braces = "{}" - if not self.query.subquery and features.supports_slicing_ordering_in_compound: - braces = "({})" - sql_parts, args_parts = zip( - *((braces.format(sql), args) for sql, args in parts) - ) - result = [" {} ".format(combinator_sql).join(sql_parts)] - params = [] - for part in args_parts: - params.extend(part) - return result, params - - def _get_combinator_part_sql(self, compiler): - features = self.connection.features - # If the columns list is limited, then all combined queries - # must have the same columns list. Set the selects defined on - # the query on all combined queries, if not already set. - selected = self.query.selected - if selected is not None and compiler.query.selected is None: - compiler.query = compiler.query.clone() - compiler.query.set_values(selected) - part_sql, part_args = compiler.as_sql(with_col_aliases=True) - if compiler.query.combinator: - # Wrap in a subquery if wrapping in parentheses isn't - # supported. - if not features.supports_parentheses_in_compound: - part_sql = "SELECT * FROM ({})".format(part_sql) - # Add parentheses when combining with compound query if not - # already added for all compound queries. - elif ( - self.query.subquery - or not features.supports_slicing_ordering_in_compound - ): - part_sql = "({})".format(part_sql) - elif self.query.subquery and features.supports_slicing_ordering_in_compound: - part_sql = "({})".format(part_sql) - return part_sql, part_args - - def get_qualify_sql(self): - where_parts = [] - if self.where: - where_parts.append(self.where) - if self.having: - where_parts.append(self.having) - inner_query = self.query.clone() - inner_query.subquery = True - inner_query.where = inner_query.where.__class__(where_parts) - # Augment the inner query with any window function references that - # might have been masked via values() and alias(). If any masked - # aliases are added they'll be masked again to avoid fetching - # the data in the `if qual_aliases` branch below. - select = { - expr: alias for expr, _, alias in self.get_select(with_col_aliases=True)[0] - } - select_aliases = set(select.values()) - qual_aliases = set() - replacements = {} - - def collect_replacements(expressions): - while expressions: - expr = expressions.pop() - if expr in replacements: - continue - elif select_alias := select.get(expr): - replacements[expr] = select_alias - elif isinstance(expr, Lookup): - expressions.extend(expr.get_source_expressions()) - elif isinstance(expr, Ref): - if expr.refs not in select_aliases: - expressions.extend(expr.get_source_expressions()) - else: - num_qual_alias = len(qual_aliases) - select_alias = f"qual{num_qual_alias}" - qual_aliases.add(select_alias) - inner_query.add_annotation(expr, select_alias) - replacements[expr] = select_alias - - collect_replacements(list(self.qualify.leaves())) - self.qualify = self.qualify.replace_expressions( - {expr: Ref(alias, expr) for expr, alias in replacements.items()} - ) - order_by = [] - for order_by_expr, *_ in self.get_order_by(): - collect_replacements(order_by_expr.get_source_expressions()) - order_by.append( - order_by_expr.replace_expressions( - {expr: Ref(alias, expr) for expr, alias in replacements.items()} - ) - ) - inner_query_compiler = inner_query.get_compiler( - self.using, connection=self.connection, elide_empty=self.elide_empty - ) - inner_sql, inner_params = inner_query_compiler.as_sql( - # The limits must be applied to the outer query to avoid pruning - # results too eagerly. - with_limits=False, - # Force unique aliasing of selected columns to avoid collisions - # and make rhs predicates referencing easier. - with_col_aliases=True, - ) - qualify_sql, qualify_params = self.compile(self.qualify) - result = [ - "SELECT * FROM (", - inner_sql, - ")", - self.connection.ops.quote_name("qualify"), - "WHERE", - qualify_sql, - ] - if qual_aliases: - # If some select aliases were unmasked for filtering purposes they - # must be masked back. - cols = [self.connection.ops.quote_name(alias) for alias in select.values()] - result = [ - "SELECT", - ", ".join(cols), - "FROM (", - *result, - ")", - self.connection.ops.quote_name("qualify_mask"), - ] - params = list(inner_params) + qualify_params - # As the SQL spec is unclear on whether or not derived tables - # ordering must propagate it has to be explicitly repeated on the - # outer-most query to ensure it's preserved. - if order_by: - ordering_sqls = [] - for ordering in order_by: - ordering_sql, ordering_params = self.compile(ordering) - ordering_sqls.append(ordering_sql) - params.extend(ordering_params) - result.extend(["ORDER BY", ", ".join(ordering_sqls)]) - return result, params - - def as_sql(self, with_limits=True, with_col_aliases=False): - """ - Create the SQL for this query. Return the SQL string and list of - parameters. - - If 'with_limits' is False, any limit/offset information is not included - in the query. - """ - refcounts_before = self.query.alias_refcount.copy() - try: - combinator = self.query.combinator - extra_select, order_by, group_by = self.pre_sql_setup( - with_col_aliases=with_col_aliases or bool(combinator), - ) - for_update_part = None - # Is a LIMIT/OFFSET clause needed? - with_limit_offset = with_limits and self.query.is_sliced - combinator = self.query.combinator - features = self.connection.features - if combinator: - if not getattr(features, "supports_select_{}".format(combinator)): - raise NotSupportedError( - "{} is not supported on this database backend.".format( - combinator - ) - ) - result, params = self.get_combinator_sql( - combinator, self.query.combinator_all - ) - elif self.qualify: - result, params = self.get_qualify_sql() - order_by = None - else: - distinct_fields, distinct_params = self.get_distinct() - # This must come after 'select', 'ordering', and 'distinct' - # (see docstring of get_from_clause() for details). - from_, f_params = self.get_from_clause() - try: - where, w_params = ( - self.compile(self.where) if self.where is not None else ("", []) - ) - except EmptyResultSet: - if self.elide_empty: - raise - # Use a predicate that's always False. - where, w_params = "0 = 1", [] - except FullResultSet: - where, w_params = "", [] - try: - having, h_params = ( - self.compile(self.having) - if self.having is not None - else ("", []) - ) - except FullResultSet: - having, h_params = "", [] - result = ["SELECT"] - params = [] - - if self.query.distinct: - distinct_result, distinct_params = self.connection.ops.distinct_sql( - distinct_fields, - distinct_params, - ) - result += distinct_result - params += distinct_params - - out_cols = [] - for _, (s_sql, s_params), alias in self.select + extra_select: - if alias: - s_sql = "%s AS %s" % ( - s_sql, - self.connection.ops.quote_name(alias), - ) - params.extend(s_params) - out_cols.append(s_sql) - - result += [", ".join(out_cols)] - if from_: - result += ["FROM", *from_] - elif self.connection.features.bare_select_suffix: - result += [self.connection.features.bare_select_suffix] - params.extend(f_params) - - if self.query.select_for_update and features.has_select_for_update: - if ( - self.connection.get_autocommit() - # Don't raise an exception when database doesn't - # support transactions, as it's a noop. - and features.supports_transactions - ): - raise TransactionManagementError( - "select_for_update cannot be used outside of a transaction." - ) - - if ( - with_limit_offset - and not features.supports_select_for_update_with_limit - ): - raise NotSupportedError( - "LIMIT/OFFSET is not supported with " - "select_for_update on this database backend." - ) - nowait = self.query.select_for_update_nowait - skip_locked = self.query.select_for_update_skip_locked - of = self.query.select_for_update_of - no_key = self.query.select_for_no_key_update - # If it's a NOWAIT/SKIP LOCKED/OF/NO KEY query but the - # backend doesn't support it, raise NotSupportedError to - # prevent a possible deadlock. - if nowait and not features.has_select_for_update_nowait: - raise NotSupportedError( - "NOWAIT is not supported on this database backend." - ) - elif skip_locked and not features.has_select_for_update_skip_locked: - raise NotSupportedError( - "SKIP LOCKED is not supported on this database backend." - ) - elif of and not features.has_select_for_update_of: - raise NotSupportedError( - "FOR UPDATE OF is not supported on this database backend." - ) - elif no_key and not features.has_select_for_no_key_update: - raise NotSupportedError( - "FOR NO KEY UPDATE is not supported on this " - "database backend." - ) - for_update_part = self.connection.ops.for_update_sql( - nowait=nowait, - skip_locked=skip_locked, - of=self.get_select_for_update_of_arguments(), - no_key=no_key, - ) - - if for_update_part and features.for_update_after_from: - result.append(for_update_part) - - if where: - result.append("WHERE %s" % where) - params.extend(w_params) - - grouping = [] - for g_sql, g_params in group_by: - grouping.append(g_sql) - params.extend(g_params) - if grouping: - if distinct_fields: - raise NotImplementedError( - "annotate() + distinct(fields) is not implemented." - ) - order_by = order_by or self.connection.ops.force_no_ordering() - result.append("GROUP BY %s" % ", ".join(grouping)) - if self._meta_ordering: - order_by = None - if having: - if not grouping: - result.extend(self.connection.ops.force_group_by()) - result.append("HAVING %s" % having) - params.extend(h_params) - - if self.query.explain_info: - result.insert( - 0, - self.connection.ops.explain_query_prefix( - self.query.explain_info.format, - **self.query.explain_info.options, - ), - ) - - if order_by: - ordering = [] - for _, (o_sql, o_params, _) in order_by: - ordering.append(o_sql) - params.extend(o_params) - order_by_sql = "ORDER BY %s" % ", ".join(ordering) - if combinator and features.requires_compound_order_by_subquery: - result = ["SELECT * FROM (", *result, ")", order_by_sql] - else: - result.append(order_by_sql) - - if with_limit_offset: - result.append( - self.connection.ops.limit_offset_sql( - self.query.low_mark, self.query.high_mark - ) - ) - - if for_update_part and not features.for_update_after_from: - result.append(for_update_part) - - if self.query.subquery and extra_select: - # If the query is used as a subquery, the extra selects would - # result in more columns than the left-hand side expression is - # expecting. This can happen when a subquery uses a combination - # of order_by() and distinct(), forcing the ordering expressions - # to be selected as well. Wrap the query in another subquery - # to exclude extraneous selects. - sub_selects = [] - sub_params = [] - for index, (select, _, alias) in enumerate(self.select, start=1): - if alias: - sub_selects.append( - "%s.%s" - % ( - self.connection.ops.quote_name("subquery"), - self.connection.ops.quote_name(alias), - ) - ) - else: - select_clone = select.relabeled_clone( - {select.alias: "subquery"} - ) - subselect, subparams = select_clone.as_sql( - self, self.connection - ) - sub_selects.append(subselect) - sub_params.extend(subparams) - return "SELECT %s FROM (%s) subquery" % ( - ", ".join(sub_selects), - " ".join(result), - ), tuple(sub_params + params) - - return " ".join(result), tuple(params) - finally: - # Finally do cleanup - get rid of the joins we created above. - self.query.reset_refcounts(refcounts_before) - - def get_default_columns( - self, select_mask, start_alias=None, opts=None, from_parent=None - ): - """ - Compute the default columns for selecting every field in the base - model. Will sometimes be called to pull in related models (e.g. via - select_related), in which case "opts" and "start_alias" will be given - to provide a starting point for the traversal. - - Return a list of strings, quoted appropriately for use in SQL - directly, as well as a set of aliases used in the select statement (if - 'as_pairs' is True, return a list of (alias, col_name) pairs instead - of strings as the first component and None as the second component). - """ - result = [] - if opts is None: - if (opts := self.query.get_meta()) is None: - return result - start_alias = start_alias or self.query.get_initial_alias() - # The 'seen_models' is used to optimize checking the needed parent - # alias for a given field. This also includes None -> start_alias to - # be used by local fields. - seen_models = {None: start_alias} - select_mask_fields = set(composite.unnest(select_mask)) - - for field in opts.concrete_fields: - model = field.model._meta.concrete_model - # A proxy model will have a different model and concrete_model. We - # will assign None if the field belongs to this model. - if model == opts.model: - model = None - if ( - from_parent - and model is not None - and issubclass( - from_parent._meta.concrete_model, model._meta.concrete_model - ) - ): - # Avoid loading data for already loaded parents. - # We end up here in the case select_related() resolution - # proceeds from parent model to child model. In that case the - # parent model data is already present in the SELECT clause, - # and we want to avoid reloading the same data again. - continue - if select_mask and field not in select_mask_fields: - continue - alias = self.query.join_parent_model(opts, model, start_alias, seen_models) - column = field.get_col(alias) - result.append(column) - return result - - def get_distinct(self): - """ - Return a quoted list of fields to use in DISTINCT ON part of the query. - - This method can alter the tables in the query, and thus it must be - called before get_from_clause(). - """ - result = [] - params = [] - opts = self.query.get_meta() - - for name in self.query.distinct_fields: - parts = name.split(LOOKUP_SEP) - _, targets, alias, joins, path, _, transform_function = self._setup_joins( - parts, opts, None - ) - targets, alias, _ = self.query.trim_joins(targets, joins, path) - for target in targets: - if name in self.query.annotation_select: - result.append(self.connection.ops.quote_name(name)) - else: - r, p = self.compile(transform_function(target, alias)) - result.append(r) - params.append(p) - return result, params - - def find_ordering_name( - self, name, opts, alias=None, default_order="ASC", already_seen=None - ): - """ - Return the table alias (the name might be ambiguous, the alias will - not be) and column name for ordering by the given 'name' parameter. - The 'name' is of the form 'field1__field2__...__fieldN'. - """ - name, order = get_order_dir(name, default_order) - descending = order == "DESC" - pieces = name.split(LOOKUP_SEP) - ( - field, - targets, - alias, - joins, - path, - opts, - transform_function, - ) = self._setup_joins(pieces, opts, alias) - - # If we get to this point and the field is a relation to another model, - # append the default ordering for that model unless it is the pk - # shortcut or the attribute name of the field that is specified or - # there are transforms to process. - if ( - field.is_relation - and opts.ordering - and getattr(field, "attname", None) != pieces[-1] - and name != "pk" - and not getattr(transform_function, "has_transforms", False) - ): - # Firstly, avoid infinite loops. - already_seen = already_seen or set() - join_tuple = tuple( - getattr(self.query.alias_map[j], "join_cols", None) for j in joins - ) - if join_tuple in already_seen: - raise FieldError("Infinite loop caused by ordering.") - already_seen.add(join_tuple) - - results = [] - for item in opts.ordering: - if hasattr(item, "resolve_expression") and not isinstance( - item, OrderBy - ): - item = item.desc() if descending else item.asc() - if isinstance(item, OrderBy): - results.append( - (item.prefix_references(f"{name}{LOOKUP_SEP}"), False) - ) - continue - results.extend( - (expr.prefix_references(f"{name}{LOOKUP_SEP}"), is_ref) - for expr, is_ref in self.find_ordering_name( - item, opts, alias, order, already_seen - ) - ) - return results - targets, alias, _ = self.query.trim_joins(targets, joins, path) - return [ - (OrderBy(transform_function(t, alias), descending=descending), False) - for t in targets - ] - - def _setup_joins(self, pieces, opts, alias): - """ - Helper method for get_order_by() and get_distinct(). - - get_ordering() and get_distinct() must produce same target columns on - same input, as the prefixes of get_ordering() and get_distinct() must - match. Executing SQL where this is not true is an error. - """ - alias = alias or self.query.get_initial_alias() - field, targets, opts, joins, path, transform_function = self.query.setup_joins( - pieces, opts, alias - ) - alias = joins[-1] - return field, targets, alias, joins, path, opts, transform_function - - def get_from_clause(self): - """ - Return a list of strings that are joined together to go after the - "FROM" part of the query, as well as a list any extra parameters that - need to be included. Subclasses, can override this to create a - from-clause via a "select". - - This should only be called after any SQL construction methods that - might change the tables that are needed. This means the select columns, - ordering, and distinct must be done first. - """ - result = [] - params = [] - # Copy alias_map to a tuple in case Join.as_sql() subclasses (objects - # in alias_map) alter compiler.query.alias_map. That would otherwise - # raise "RuntimeError: dictionary changed size during iteration". - for alias, from_clause in tuple(self.query.alias_map.items()): - if not self.query.alias_refcount[alias]: - continue - clause_sql, clause_params = self.compile(from_clause) - result.append(clause_sql) - params.extend(clause_params) - for t in self.query.extra_tables: - alias, _ = self.query.table_alias(t) - # Only add the alias if it's not already present (the table_alias() - # call increments the refcount, so an alias refcount of one means - # this is the only reference). - if ( - alias not in self.query.alias_map - or self.query.alias_refcount[alias] == 1 - ): - result.append(", %s" % self.quote_name_unless_alias(alias)) - return result, params - - def get_related_selections( - self, - select, - select_mask, - opts=None, - root_alias=None, - cur_depth=1, - requested=None, - restricted=None, - ): - """ - Fill in the information needed for a select_related query. The current - depth is measured as the number of connections away from the root model - (for example, cur_depth=1 means we are looking at models with direct - connections to the root model). - """ - - def _get_field_choices(): - direct_choices = (f.name for f in opts.fields if f.is_relation) - reverse_choices = ( - f.field.related_query_name() - for f in opts.related_objects - if f.field.unique - ) - return chain( - direct_choices, reverse_choices, self.query._filtered_relations - ) - - related_klass_infos = [] - if not restricted and cur_depth > self.query.max_depth: - # We've recursed far enough; bail out. - return related_klass_infos - - if not opts: - opts = self.query.get_meta() - root_alias = self.query.get_initial_alias() - - # Setup for the case when only particular related fields should be - # included in the related selection. - fields_found = set() - if requested is None: - restricted = isinstance(self.query.select_related, dict) - if restricted: - requested = self.query.select_related - - def get_related_klass_infos(klass_info, related_klass_infos): - klass_info["related_klass_infos"] = related_klass_infos - - for f in opts.fields: - fields_found.add(f.name) - - if restricted: - next = requested.get(f.name, {}) - if not f.is_relation: - # If a non-related field is used like a relation, - # or if a single non-relational field is given. - if next or f.name in requested: - raise FieldError( - "Non-relational field given in select_related: '%s'. " - "Choices are: %s" - % ( - f.name, - ", ".join(_get_field_choices()) or "(none)", - ) - ) - else: - next = False - - if not select_related_descend(f, restricted, requested, select_mask): - continue - related_select_mask = select_mask.get(f) or {} - klass_info = { - "model": f.remote_field.model, - "field": f, - "reverse": False, - "local_setter": f.set_cached_value, - "remote_setter": ( - f.remote_field.set_cached_value if f.unique else lambda x, y: None - ), - "from_parent": False, - } - related_klass_infos.append(klass_info) - select_fields = [] - _, _, _, joins, _, _ = self.query.setup_joins([f.name], opts, root_alias) - alias = joins[-1] - columns = self.get_default_columns( - related_select_mask, start_alias=alias, opts=f.remote_field.model._meta - ) - for col in columns: - select_fields.append(len(select)) - select.append((col, None)) - klass_info["select_fields"] = select_fields - next_klass_infos = self.get_related_selections( - select, - related_select_mask, - f.remote_field.model._meta, - alias, - cur_depth + 1, - next, - restricted, - ) - get_related_klass_infos(klass_info, next_klass_infos) - - if restricted: - related_fields = [ - (o, o.field, o.related_model) - for o in opts.related_objects - if o.field.unique and not o.many_to_many - ] - for related_object, related_field, model in related_fields: - if not select_related_descend( - related_object, - restricted, - requested, - select_mask, - ): - continue - - related_select_mask = select_mask.get(related_object) or {} - related_field_name = related_field.related_query_name() - fields_found.add(related_field_name) - - join_info = self.query.setup_joins( - [related_field_name], opts, root_alias - ) - alias = join_info.joins[-1] - from_parent = issubclass(model, opts.model) and model is not opts.model - klass_info = { - "model": model, - "field": related_field, - "reverse": True, - "local_setter": related_object.set_cached_value, - "remote_setter": related_field.set_cached_value, - "from_parent": from_parent, - } - related_klass_infos.append(klass_info) - select_fields = [] - columns = self.get_default_columns( - related_select_mask, - start_alias=alias, - opts=model._meta, - from_parent=opts.model, - ) - for col in columns: - select_fields.append(len(select)) - select.append((col, None)) - klass_info["select_fields"] = select_fields - next = requested.get(related_field_name, {}) - next_klass_infos = self.get_related_selections( - select, - related_select_mask, - model._meta, - alias, - cur_depth + 1, - next, - restricted, - ) - get_related_klass_infos(klass_info, next_klass_infos) - - def local_setter(final_field, obj, from_obj): - # Set a reverse fk object when relation is non-empty. - if from_obj: - final_field.remote_field.set_cached_value(from_obj, obj) - - def local_setter_noop(obj, from_obj): - pass - - def remote_setter(name, obj, from_obj): - setattr(from_obj, name, obj) - - for name in list(requested): - # Filtered relations work only on the topmost level. - if cur_depth > 1: - break - if name in self.query._filtered_relations: - fields_found.add(name) - final_field, _, join_opts, joins, _, _ = self.query.setup_joins( - [name], opts, root_alias - ) - model = join_opts.model - alias = joins[-1] - from_parent = ( - issubclass(model, opts.model) and model is not opts.model - ) - klass_info = { - "model": model, - "field": final_field, - "reverse": True, - "local_setter": ( - partial(local_setter, final_field) - if len(joins) <= 2 - else local_setter_noop - ), - "remote_setter": partial(remote_setter, name), - "from_parent": from_parent, - } - related_klass_infos.append(klass_info) - select_fields = [] - field_select_mask = select_mask.get((name, final_field)) or {} - columns = self.get_default_columns( - field_select_mask, - start_alias=alias, - opts=model._meta, - from_parent=opts.model, - ) - for col in columns: - select_fields.append(len(select)) - select.append((col, None)) - klass_info["select_fields"] = select_fields - next_requested = requested.get(name, {}) - next_klass_infos = self.get_related_selections( - select, - field_select_mask, - opts=model._meta, - root_alias=alias, - cur_depth=cur_depth + 1, - requested=next_requested, - restricted=restricted, - ) - get_related_klass_infos(klass_info, next_klass_infos) - fields_not_found = set(requested).difference(fields_found) - if fields_not_found: - invalid_fields = ("'%s'" % s for s in fields_not_found) - raise FieldError( - "Invalid field name(s) given in select_related: %s. " - "Choices are: %s" - % ( - ", ".join(invalid_fields), - ", ".join(_get_field_choices()) or "(none)", - ) - ) - return related_klass_infos - - def get_select_for_update_of_arguments(self): - """ - Return a quoted list of arguments for the SELECT FOR UPDATE OF part of - the query. - """ - - def _get_parent_klass_info(klass_info): - concrete_model = klass_info["model"]._meta.concrete_model - for parent_model, parent_link in concrete_model._meta.parents.items(): - all_parents = parent_model._meta.all_parents - yield { - "model": parent_model, - "field": parent_link, - "reverse": False, - "select_fields": [ - select_index - for select_index in klass_info["select_fields"] - # Selected columns from a model or its parents. - if ( - self.select[select_index][0].target.model == parent_model - or self.select[select_index][0].target.model in all_parents - ) - ], - } - - def _get_first_selected_col_from_model(klass_info): - """ - Find the first selected column from a model. If it doesn't exist, - don't lock a model. - - select_fields is filled recursively, so it also contains fields - from the parent models. - """ - concrete_model = klass_info["model"]._meta.concrete_model - for select_index in klass_info["select_fields"]: - if self.select[select_index][0].target.model == concrete_model: - return self.select[select_index][0] - - def _get_field_choices(): - """Yield all allowed field paths in breadth-first search order.""" - queue = collections.deque([(None, self.klass_info)]) - while queue: - parent_path, klass_info = queue.popleft() - if parent_path is None: - path = [] - yield "self" - else: - field = klass_info["field"] - if klass_info["reverse"]: - field = field.remote_field - path = parent_path + [field.name] - yield LOOKUP_SEP.join(path) - queue.extend( - (path, klass_info) - for klass_info in _get_parent_klass_info(klass_info) - ) - queue.extend( - (path, klass_info) - for klass_info in klass_info.get("related_klass_infos", []) - ) - - if not self.klass_info: - return [] - result = [] - invalid_names = [] - for name in self.query.select_for_update_of: - klass_info = self.klass_info - if name == "self": - col = _get_first_selected_col_from_model(klass_info) - else: - for part in name.split(LOOKUP_SEP): - klass_infos = ( - *klass_info.get("related_klass_infos", []), - *_get_parent_klass_info(klass_info), - ) - for related_klass_info in klass_infos: - field = related_klass_info["field"] - if related_klass_info["reverse"]: - field = field.remote_field - if field.name == part: - klass_info = related_klass_info - break - else: - klass_info = None - break - if klass_info is None: - invalid_names.append(name) - continue - col = _get_first_selected_col_from_model(klass_info) - if col is not None: - if self.connection.features.select_for_update_of_column: - result.append(self.compile(col)[0]) - else: - result.append(self.quote_name_unless_alias(col.alias)) - if invalid_names: - raise FieldError( - "Invalid field name(s) given in select_for_update(of=(...)): %s. " - "Only relational fields followed in the query are allowed. " - "Choices are: %s." - % ( - ", ".join(invalid_names), - ", ".join(_get_field_choices()), - ) - ) - return result - - def get_converters(self, expressions): - i = 0 - converters = {} - - for expression in expressions: - if isinstance(expression, ColPairs): - cols = expression.get_source_expressions() - cols_converters = self.get_converters(cols) - for j, (convs, col) in cols_converters.items(): - converters[i + j] = (convs, col) - i += len(expression) - elif expression: - backend_converters = self.connection.ops.get_db_converters(expression) - field_converters = expression.get_db_converters(self.connection) - if backend_converters or field_converters: - converters[i] = (backend_converters + field_converters, expression) - i += 1 - else: - i += 1 - - return converters - - def apply_converters(self, rows, converters): - connection = self.connection - converters = list(converters.items()) - for row in map(list, rows): - for pos, (convs, expression) in converters: - value = row[pos] - for converter in convs: - value = converter(value, expression, connection) - row[pos] = value - yield row - - def has_composite_fields(self, expressions): - # Check for composite fields before calling the relatively costly - # composite_fields_to_tuples. - return any(isinstance(expression, ColPairs) for expression in expressions) - - def composite_fields_to_tuples(self, rows, expressions): - col_pair_slices = [ - slice(i, i + len(expression)) - for i, expression in enumerate(expressions) - if isinstance(expression, ColPairs) - ] - - for row in map(list, rows): - for pos in col_pair_slices: - row[pos] = (tuple(row[pos]),) - - yield row - - def results_iter( - self, - results=None, - tuple_expected=False, - chunked_fetch=False, - chunk_size=GET_ITERATOR_CHUNK_SIZE, - ): - """Return an iterator over the results from executing this query.""" - if results is None: - results = self.execute_sql( - MULTI, chunked_fetch=chunked_fetch, chunk_size=chunk_size - ) - fields = [s[0] for s in self.select[0 : self.col_count]] - converters = self.get_converters(fields) - rows = chain.from_iterable(results) - if converters: - rows = self.apply_converters(rows, converters) - if self.has_composite_fields(fields): - rows = self.composite_fields_to_tuples(rows, fields) - if tuple_expected: - rows = map(tuple, rows) - return rows - - def has_results(self): - """ - Backends (e.g. NoSQL) can override this in order to use optimized - versions of "query has any results." - """ - return bool(self.execute_sql(SINGLE)) - - def execute_sql( - self, result_type=MULTI, chunked_fetch=False, chunk_size=GET_ITERATOR_CHUNK_SIZE - ): - """ - Run the query against the database and return the result(s). The - return value depends on the value of result_type. - - When result_type is: - - MULTI: Retrieves all rows using fetchmany(). Wraps in an iterator for - chunked reads when supported. - - SINGLE: Retrieves a single row using fetchone(). - - ROW_COUNT: Retrieves the number of rows in the result. - - CURSOR: Runs the query, and returns the cursor object. It is the - caller's responsibility to close the cursor. - """ - result_type = result_type or NO_RESULTS - try: - sql, params = self.as_sql() - if not sql: - raise EmptyResultSet - except EmptyResultSet: - if result_type == MULTI: - return iter([]) - else: - return - if chunked_fetch: - cursor = self.connection.chunked_cursor() - else: - cursor = self.connection.cursor() - try: - cursor.execute(sql, params) - except Exception: - # Might fail for server-side cursors (e.g. connection closed) - cursor.close() - raise - - if result_type == ROW_COUNT: - try: - return cursor.rowcount - finally: - cursor.close() - if result_type == CURSOR: - # Give the caller the cursor to process and close. - return cursor - if result_type == SINGLE: - try: - val = cursor.fetchone() - if val: - return val[0 : self.col_count] - return val - finally: - # done with the cursor - cursor.close() - if result_type == NO_RESULTS: - cursor.close() - return - - result = cursor_iter( - cursor, - self.connection.features.empty_fetchmany_value, - self.col_count if self.has_extra_select else None, - chunk_size, - ) - if not chunked_fetch or not self.connection.features.can_use_chunked_reads: - # If we are using non-chunked reads, we return the same data - # structure as normally, but ensure it is all read into memory - # before going any further. Use chunked_fetch if requested, - # unless the database doesn't support it. - return list(result) - return result - - def explain_query(self): - result = list(self.execute_sql()) - # Some backends return 1 item tuples with strings, and others return - # tuples with integers and strings. Flatten them out into strings. - format_ = self.query.explain_info.format - output_formatter = json.dumps if format_ and format_.lower() == "json" else str - for row in result: - for value in row: - if not isinstance(value, str): - yield " ".join([output_formatter(c) for c in value]) - else: - yield value - - -class SQLInsertCompiler(SQLCompiler): - returning_fields = None - returning_params = () - - def field_as_sql(self, field, get_placeholder, val): - """ - Take a field and a value intended to be saved on that field, and - return placeholder SQL and accompanying params. Check for raw values, - expressions, and fields with get_placeholder() defined in that order. - - When field is None, consider the value raw and use it as the - placeholder, with no corresponding parameters returned. - """ - if field is None: - # A field value of None means the value is raw. - sql, params = val, [] - elif hasattr(val, "as_sql"): - # This is an expression, let's compile it. - sql, params = self.compile(val) - elif get_placeholder is not None: - # Some fields (e.g. geo fields) need special munging before - # they can be inserted. - sql, params = get_placeholder(val, self, self.connection), [val] - else: - # Return the common case for the placeholder - sql, params = "%s", [val] - - # The following hook is only used by Oracle Spatial, which sometimes - # needs to yield 'NULL' and [] as its placeholder and params instead - # of '%s' and [None]. The 'NULL' placeholder is produced earlier by - # OracleOperations.get_geom_placeholder(). The following line removes - # the corresponding None parameter. See ticket #10888. - params = self.connection.ops.modify_insert_params(sql, params) - - return sql, params - - def prepare_value(self, field, value): - """ - Prepare a value to be used in a query by resolving it if it is an - expression and otherwise calling the field's get_db_prep_save(). - """ - if hasattr(value, "resolve_expression"): - value = value.resolve_expression( - self.query, allow_joins=False, for_save=True - ) - # Don't allow values containing Col expressions. They refer to - # existing columns on a row, but in the case of insert the row - # doesn't exist yet. - if value.contains_column_references: - raise ValueError( - 'Failed to insert expression "%s" on %s. F() expressions ' - "can only be used to update, not to insert." % (value, field) - ) - if value.contains_aggregate: - raise FieldError( - "Aggregate functions are not allowed in this query " - "(%s=%r)." % (field.name, value) - ) - if value.contains_over_clause: - raise FieldError( - "Window expressions are not allowed in this query (%s=%r)." - % (field.name, value) - ) - return field.get_db_prep_save(value, connection=self.connection) - - def pre_save_val(self, field, obj): - """ - Get the given field's value off the given obj. pre_save() is used for - things like auto_now on DateTimeField. Skip it if this is a raw query. - """ - if self.query.raw: - return getattr(obj, field.attname) - return field.pre_save(obj, add=True) - - def assemble_as_sql(self, fields, value_rows): - """ - Take a sequence of N fields and a sequence of M rows of values, and - generate placeholder SQL and parameters for each field and value. - Return a pair containing: - * a sequence of M rows of N SQL placeholder strings, and - * a sequence of M rows of corresponding parameter values. - - Each placeholder string may contain any number of '%s' interpolation - strings, and each parameter row will contain exactly as many params - as the total number of '%s's in the corresponding placeholder row. - """ - if not value_rows: - return [], [] - - # list of (sql, [params]) tuples for each object to be saved - # Shape: [n_objs][n_fields][2] - get_placeholders = [getattr(field, "get_placeholder", None) for field in fields] - rows_of_fields_as_sql = ( - ( - self.field_as_sql(field, get_placeholder, value) - for field, get_placeholder, value in zip(fields, get_placeholders, row) - ) - for row in value_rows - ) - - # tuple like ([sqls], [[params]s]) for each object to be saved - # Shape: [n_objs][2][n_fields] - sql_and_param_pair_rows = (zip(*row) for row in rows_of_fields_as_sql) - - # Extract separate lists for placeholders and params. - # Each of these has shape [n_objs][n_fields] - placeholder_rows, param_rows = zip(*sql_and_param_pair_rows) - - # Params for each field are still lists, and need to be flattened. - param_rows = [[p for ps in row for p in ps] for row in param_rows] - - return placeholder_rows, param_rows - - def as_sql(self): - # We don't need quote_name_unless_alias() here, since these are all - # going to be column names (so we can avoid the extra overhead). - qn = self.connection.ops.quote_name - opts = self.query.get_meta() - insert_statement = self.connection.ops.insert_statement( - on_conflict=self.query.on_conflict, - ) - result = ["%s %s" % (insert_statement, qn(opts.db_table))] - fields = self.query.fields or [opts.pk] - result.append("(%s)" % ", ".join(qn(f.column) for f in fields)) - - if self.query.fields: - value_rows = [ - [ - self.prepare_value(field, self.pre_save_val(field, obj)) - for field in fields - ] - for obj in self.query.objs - ] - else: - # An empty object. - value_rows = [ - [self.connection.ops.pk_default_value()] for _ in self.query.objs - ] - fields = [None] - - # Currently the backends just accept values when generating bulk - # queries and generate their own placeholders. Doing that isn't - # necessary and it should be possible to use placeholders and - # expressions in bulk inserts too. - can_bulk = ( - not self.returning_fields and self.connection.features.has_bulk_insert - ) - - placeholder_rows, param_rows = self.assemble_as_sql(fields, value_rows) - - on_conflict_suffix_sql = self.connection.ops.on_conflict_suffix_sql( - fields, - self.query.on_conflict, - (f.column for f in self.query.update_fields), - (f.column for f in self.query.unique_fields), - ) - if ( - self.returning_fields - and self.connection.features.can_return_columns_from_insert - ): - if self.connection.features.can_return_rows_from_bulk_insert: - result.append( - self.connection.ops.bulk_insert_sql(fields, placeholder_rows) - ) - params = param_rows - else: - result.append("VALUES (%s)" % ", ".join(placeholder_rows[0])) - params = [param_rows[0]] - if on_conflict_suffix_sql: - result.append(on_conflict_suffix_sql) - # Skip empty r_sql to allow subclasses to customize behavior for - # 3rd party backends. Refs #19096. - r_sql, self.returning_params = self.connection.ops.return_insert_columns( - self.returning_fields - ) - if r_sql: - result.append(r_sql) - params += [self.returning_params] - return [(" ".join(result), tuple(chain.from_iterable(params)))] - - if can_bulk: - result.append(self.connection.ops.bulk_insert_sql(fields, placeholder_rows)) - if on_conflict_suffix_sql: - result.append(on_conflict_suffix_sql) - return [(" ".join(result), tuple(p for ps in param_rows for p in ps))] - else: - if on_conflict_suffix_sql: - result.append(on_conflict_suffix_sql) - return [ - (" ".join(result + ["VALUES (%s)" % ", ".join(p)]), vals) - for p, vals in zip(placeholder_rows, param_rows) - ] - - def execute_sql(self, returning_fields=None): - assert not ( - returning_fields - and len(self.query.objs) != 1 - and not self.connection.features.can_return_rows_from_bulk_insert - ) - opts = self.query.get_meta() - self.returning_fields = returning_fields - cols = [] - with self.connection.cursor() as cursor: - for sql, params in self.as_sql(): - cursor.execute(sql, params) - if not self.returning_fields: - return [] - if ( - self.connection.features.can_return_rows_from_bulk_insert - and len(self.query.objs) > 1 - ): - rows = self.connection.ops.fetch_returned_insert_rows(cursor) - cols = [field.get_col(opts.db_table) for field in self.returning_fields] - elif self.connection.features.can_return_columns_from_insert: - assert len(self.query.objs) == 1 - rows = [ - self.connection.ops.fetch_returned_insert_columns( - cursor, - self.returning_params, - ) - ] - cols = [field.get_col(opts.db_table) for field in self.returning_fields] - elif returning_fields and isinstance( - returning_field := returning_fields[0], AutoField - ): - cols = [returning_field.get_col(opts.db_table)] - rows = [ - ( - self.connection.ops.last_insert_id( - cursor, - opts.db_table, - returning_field.column, - ), - ) - ] - else: - # Backend doesn't support returning fields and no auto-field - # that can be retrieved from `last_insert_id` was specified. - return [] - converters = self.get_converters(cols) - if converters: - rows = self.apply_converters(rows, converters) - return list(rows) - - -class SQLDeleteCompiler(SQLCompiler): - @cached_property - def single_alias(self): - # Ensure base table is in aliases. - self.query.get_initial_alias() - return sum(self.query.alias_refcount[t] > 0 for t in self.query.alias_map) == 1 - - @classmethod - def _expr_refs_base_model(cls, expr, base_model): - if isinstance(expr, Query): - return expr.model == base_model - if not hasattr(expr, "get_source_expressions"): - return False - return any( - cls._expr_refs_base_model(source_expr, base_model) - for source_expr in expr.get_source_expressions() - ) - - @cached_property - def contains_self_reference_subquery(self): - return any( - self._expr_refs_base_model(expr, self.query.model) - for expr in chain( - self.query.annotations.values(), self.query.where.children - ) - ) - - def _as_sql(self, query): - delete = "DELETE FROM %s" % self.quote_name_unless_alias(query.base_table) - try: - where, params = self.compile(query.where) - except FullResultSet: - return delete, () - return f"{delete} WHERE {where}", tuple(params) - - def as_sql(self): - """ - Create the SQL for this query. Return the SQL string and list of - parameters. - """ - if self.single_alias and ( - self.connection.features.delete_can_self_reference_subquery - or not self.contains_self_reference_subquery - ): - return self._as_sql(self.query) - innerq = self.query.clone() - innerq.__class__ = Query - innerq.clear_select_clause() - pk = self.query.model._meta.pk - innerq.select = [pk.get_col(self.query.get_initial_alias())] - outerq = Query(self.query.model) - if not self.connection.features.update_can_self_select: - # Force the materialization of the inner query to allow reference - # to the target table on MySQL. - sql, params = innerq.get_compiler(connection=self.connection).as_sql() - innerq = RawSQL("SELECT * FROM (%s) subquery" % sql, params) - outerq.add_filter("pk__in", innerq) - return self._as_sql(outerq) - - -class SQLUpdateCompiler(SQLCompiler): - def as_sql(self): - """ - Create the SQL for this query. Return the SQL string and list of - parameters. - """ - self.pre_sql_setup() - if not self.query.values: - return "", () - qn = self.quote_name_unless_alias - values, update_params = [], [] - for field, model, val in self.query.values: - if hasattr(val, "resolve_expression"): - val = val.resolve_expression( - self.query, allow_joins=False, for_save=True - ) - if val.contains_aggregate: - raise FieldError( - "Aggregate functions are not allowed in this query " - "(%s=%r)." % (field.name, val) - ) - if val.contains_over_clause: - raise FieldError( - "Window expressions are not allowed in this query " - "(%s=%r)." % (field.name, val) - ) - if isinstance(val, ColPairs): - raise FieldError( - "Composite primary keys expressions are not allowed " - "in this query (%s=F('pk'))." % field.name - ) - elif hasattr(val, "prepare_database_save"): - if field.remote_field: - val = val.prepare_database_save(field) - else: - raise TypeError( - "Tried to update field %s with a model instance, %r. " - "Use a value compatible with %s." - % (field, val, field.__class__.__name__) - ) - val = field.get_db_prep_save(val, connection=self.connection) - - # Getting the placeholder for the field. - if hasattr(field, "get_placeholder"): - placeholder = field.get_placeholder(val, self, self.connection) - else: - placeholder = "%s" - name = field.column - if hasattr(val, "as_sql"): - sql, params = self.compile(val) - values.append("%s = %s" % (qn(name), placeholder % sql)) - update_params.extend(params) - elif val is not None: - values.append("%s = %s" % (qn(name), placeholder)) - update_params.append(val) - else: - values.append("%s = NULL" % qn(name)) - table = self.query.base_table - result = [ - "UPDATE %s SET" % qn(table), - ", ".join(values), - ] - try: - where, params = self.compile(self.query.where) - except FullResultSet: - params = [] - else: - result.append("WHERE %s" % where) - return " ".join(result), tuple(update_params + params) - - def execute_sql(self, result_type): - """ - Execute the specified update. Return the number of rows affected by - the primary update query. The "primary update query" is the first - non-empty query that is executed. Row counts for any subsequent, - related queries are not available. - """ - row_count = super().execute_sql(result_type) - is_empty = row_count is None - row_count = row_count or 0 - - for query in self.query.get_related_updates(): - # If the result_type is NO_RESULTS then the aux_row_count is None. - aux_row_count = query.get_compiler(self.using).execute_sql(result_type) - if is_empty and aux_row_count: - # Returns the row count for any related updates as the number of - # rows updated. - row_count = aux_row_count - is_empty = False - return row_count - - def pre_sql_setup(self): - """ - If the update depends on results from other tables, munge the "where" - conditions to match the format required for (portable) SQL updates. - - If multiple updates are required, pull out the id values to update at - this point so that they don't change as a result of the progressive - updates. - """ - refcounts_before = self.query.alias_refcount.copy() - # Ensure base table is in the query - self.query.get_initial_alias() - count = self.query.count_active_tables() - if not self.query.related_updates and count == 1: - return - query = self.query.chain(klass=Query) - query.select_related = False - query.clear_ordering(force=True) - query.extra = {} - query.select = [] - meta = query.get_meta() - fields = [meta.pk.name] - related_ids_index = [] - for related in self.query.related_updates: - if all( - path.join_field.primary_key for path in meta.get_path_to_parent(related) - ): - # If a primary key chain exists to the targeted related update, - # then the meta.pk value can be used for it. - related_ids_index.append((related, 0)) - else: - # This branch will only be reached when updating a field of an - # ancestor that is not part of the primary key chain of a MTI - # tree. - related_ids_index.append((related, len(fields))) - fields.append(related._meta.pk.name) - query.add_fields(fields) - super().pre_sql_setup() - - is_composite_pk = meta.is_composite_pk - must_pre_select = ( - count > 1 and not self.connection.features.update_can_self_select - ) - - # Now we adjust the current query: reset the where clause and get rid - # of all the tables we don't need (since they're in the sub-select). - self.query.clear_where() - if self.query.related_updates or must_pre_select: - # Either we're using the idents in multiple update queries (so - # don't want them to change), or the db backend doesn't support - # selecting from the updating table (e.g. MySQL). - idents = [] - related_ids = collections.defaultdict(list) - for rows in query.get_compiler(self.using).execute_sql(MULTI): - pks = [row if is_composite_pk else row[0] for row in rows] - idents.extend(pks) - for parent, index in related_ids_index: - related_ids[parent].extend(r[index] for r in rows) - self.query.add_filter("pk__in", idents) - self.query.related_ids = related_ids - else: - # The fast path. Filters and updates in one query. - self.query.add_filter("pk__in", query) - self.query.reset_refcounts(refcounts_before) - - -class SQLAggregateCompiler(SQLCompiler): - def as_sql(self): - """ - Create the SQL for this query. Return the SQL string and list of - parameters. - """ - sql, params = [], [] - for annotation in self.query.annotation_select.values(): - ann_sql, ann_params = self.compile(annotation) - ann_sql, ann_params = annotation.select_format(self, ann_sql, ann_params) - sql.append(ann_sql) - params.extend(ann_params) - self.col_count = len(self.query.annotation_select) - sql = ", ".join(sql) - params = tuple(params) - - inner_query_sql, inner_query_params = self.query.inner_query.get_compiler( - self.using, - elide_empty=self.elide_empty, - ).as_sql(with_col_aliases=True) - sql = "SELECT %s FROM (%s) subquery" % (sql, inner_query_sql) - params += inner_query_params - return sql, params - - -def cursor_iter(cursor, sentinel, col_count, itersize): - """ - Yield blocks of rows from a cursor and ensure the cursor is closed when - done. - """ - try: - for rows in iter((lambda: cursor.fetchmany(itersize)), sentinel): - yield rows if col_count is None else [r[:col_count] for r in rows] - finally: - cursor.close() diff --git a/.venv/lib/python3.10/site-packages/django/db/models/sql/constants.py b/.venv/lib/python3.10/site-packages/django/db/models/sql/constants.py deleted file mode 100644 index 709405b..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/sql/constants.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -Constants specific to the SQL storage portion of the ORM. -""" - -# Size of each "chunk" for get_iterator calls. -# Larger values are slightly faster at the expense of more storage space. -GET_ITERATOR_CHUNK_SIZE = 100 - -# Namedtuples for sql.* internal use. - -# How many results to expect from a cursor.execute call -MULTI = "multi" -SINGLE = "single" -NO_RESULTS = "no results" -# Rather than returning results, returns: -CURSOR = "cursor" -ROW_COUNT = "row count" - -ORDER_DIR = { - "ASC": ("ASC", "DESC"), - "DESC": ("DESC", "ASC"), -} - -# SQL join types. -INNER = "INNER JOIN" -LOUTER = "LEFT OUTER JOIN" diff --git a/.venv/lib/python3.10/site-packages/django/db/models/sql/datastructures.py b/.venv/lib/python3.10/site-packages/django/db/models/sql/datastructures.py deleted file mode 100644 index 7c0c14a..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/sql/datastructures.py +++ /dev/null @@ -1,238 +0,0 @@ -""" -Useful auxiliary data structures for query construction. Not useful outside -the SQL domain. -""" - -import warnings - -from django.core.exceptions import FullResultSet -from django.db.models.sql.constants import INNER, LOUTER -from django.utils.deprecation import RemovedInDjango60Warning - - -class MultiJoin(Exception): - """ - Used by join construction code to indicate the point at which a - multi-valued join was attempted (if the caller wants to treat that - exceptionally). - """ - - def __init__(self, names_pos, path_with_names): - self.level = names_pos - # The path travelled, this includes the path to the multijoin. - self.names_with_path = path_with_names - - -class Empty: - pass - - -class Join: - """ - Used by sql.Query and sql.SQLCompiler to generate JOIN clauses into the - FROM entry. For example, the SQL generated could be - LEFT OUTER JOIN "sometable" T1 - ON ("othertable"."sometable_id" = "sometable"."id") - - This class is primarily used in Query.alias_map. All entries in alias_map - must be Join compatible by providing the following attributes and methods: - - table_name (string) - - table_alias (possible alias for the table, can be None) - - join_type (can be None for those entries that aren't joined from - anything) - - parent_alias (which table is this join's parent, can be None similarly - to join_type) - - as_sql() - - relabeled_clone() - """ - - def __init__( - self, - table_name, - parent_alias, - table_alias, - join_type, - join_field, - nullable, - filtered_relation=None, - ): - # Join table - self.table_name = table_name - self.parent_alias = parent_alias - # Note: table_alias is not necessarily known at instantiation time. - self.table_alias = table_alias - # LOUTER or INNER - self.join_type = join_type - # A list of 2-tuples to use in the ON clause of the JOIN. - # Each 2-tuple will create one join condition in the ON clause. - if hasattr(join_field, "get_joining_fields"): - self.join_fields = join_field.get_joining_fields() - self.join_cols = tuple( - (lhs_field.column, rhs_field.column) - for lhs_field, rhs_field in self.join_fields - ) - else: - warnings.warn( - "The usage of get_joining_columns() in Join is deprecated. Implement " - "get_joining_fields() instead.", - RemovedInDjango60Warning, - ) - self.join_fields = None - self.join_cols = join_field.get_joining_columns() - # Along which field (or ForeignObjectRel in the reverse join case) - self.join_field = join_field - # Is this join nullabled? - self.nullable = nullable - self.filtered_relation = filtered_relation - - def as_sql(self, compiler, connection): - """ - Generate the full - LEFT OUTER JOIN sometable ON sometable.somecol = othertable.othercol, params - clause for this join. - """ - join_conditions = [] - params = [] - qn = compiler.quote_name_unless_alias - qn2 = connection.ops.quote_name - # Add a join condition for each pair of joining columns. - # RemovedInDjango60Warning: when the depraction ends, replace with: - # for lhs, rhs in self.join_field: - join_fields = self.join_fields or self.join_cols - for lhs, rhs in join_fields: - if isinstance(lhs, str): - # RemovedInDjango60Warning: when the depraction ends, remove - # the branch for strings. - lhs_full_name = "%s.%s" % (qn(self.parent_alias), qn2(lhs)) - rhs_full_name = "%s.%s" % (qn(self.table_alias), qn2(rhs)) - else: - lhs, rhs = connection.ops.prepare_join_on_clause( - self.parent_alias, lhs, self.table_alias, rhs - ) - lhs_sql, lhs_params = compiler.compile(lhs) - lhs_full_name = lhs_sql % lhs_params - rhs_sql, rhs_params = compiler.compile(rhs) - rhs_full_name = rhs_sql % rhs_params - join_conditions.append(f"{lhs_full_name} = {rhs_full_name}") - - # Add a single condition inside parentheses for whatever - # get_extra_restriction() returns. - extra_cond = self.join_field.get_extra_restriction( - self.table_alias, self.parent_alias - ) - if extra_cond: - extra_sql, extra_params = compiler.compile(extra_cond) - join_conditions.append("(%s)" % extra_sql) - params.extend(extra_params) - if self.filtered_relation: - try: - extra_sql, extra_params = compiler.compile(self.filtered_relation) - except FullResultSet: - pass - else: - join_conditions.append("(%s)" % extra_sql) - params.extend(extra_params) - if not join_conditions: - # This might be a rel on the other end of an actual declared field. - declared_field = getattr(self.join_field, "field", self.join_field) - raise ValueError( - "Join generated an empty ON clause. %s did not yield either " - "joining columns or extra restrictions." % declared_field.__class__ - ) - on_clause_sql = " AND ".join(join_conditions) - alias_str = ( - "" if self.table_alias == self.table_name else (" %s" % self.table_alias) - ) - sql = "%s %s%s ON (%s)" % ( - self.join_type, - qn(self.table_name), - alias_str, - on_clause_sql, - ) - return sql, params - - def relabeled_clone(self, change_map): - new_parent_alias = change_map.get(self.parent_alias, self.parent_alias) - new_table_alias = change_map.get(self.table_alias, self.table_alias) - if self.filtered_relation is not None: - filtered_relation = self.filtered_relation.relabeled_clone(change_map) - else: - filtered_relation = None - return self.__class__( - self.table_name, - new_parent_alias, - new_table_alias, - self.join_type, - self.join_field, - self.nullable, - filtered_relation=filtered_relation, - ) - - @property - def identity(self): - return ( - self.__class__, - self.table_name, - self.parent_alias, - self.join_field, - self.filtered_relation, - ) - - def __eq__(self, other): - if not isinstance(other, Join): - return NotImplemented - return self.identity == other.identity - - def __hash__(self): - return hash(self.identity) - - def demote(self): - new = self.relabeled_clone({}) - new.join_type = INNER - return new - - def promote(self): - new = self.relabeled_clone({}) - new.join_type = LOUTER - return new - - -class BaseTable: - """ - The BaseTable class is used for base table references in FROM clause. For - example, the SQL "foo" in - SELECT * FROM "foo" WHERE somecond - could be generated by this class. - """ - - join_type = None - parent_alias = None - filtered_relation = None - - def __init__(self, table_name, alias): - self.table_name = table_name - self.table_alias = alias - - def as_sql(self, compiler, connection): - alias_str = ( - "" if self.table_alias == self.table_name else (" %s" % self.table_alias) - ) - base_sql = compiler.quote_name_unless_alias(self.table_name) - return base_sql + alias_str, [] - - def relabeled_clone(self, change_map): - return self.__class__( - self.table_name, change_map.get(self.table_alias, self.table_alias) - ) - - @property - def identity(self): - return self.__class__, self.table_name, self.table_alias - - def __eq__(self, other): - if not isinstance(other, BaseTable): - return NotImplemented - return self.identity == other.identity - - def __hash__(self): - return hash(self.identity) diff --git a/.venv/lib/python3.10/site-packages/django/db/models/sql/query.py b/.venv/lib/python3.10/site-packages/django/db/models/sql/query.py deleted file mode 100644 index 0d1fe5f..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/sql/query.py +++ /dev/null @@ -1,2793 +0,0 @@ -""" -Create SQL statements for QuerySets. - -The code in here encapsulates all of the SQL construction so that QuerySets -themselves do not have to (and could be backed by things other than SQL -databases). The abstraction barrier only works one way: this module has to know -all about the internals of models in order to get the information it needs. -""" - -import copy -import difflib -import functools -import sys -from collections import Counter, namedtuple -from collections.abc import Iterator, Mapping -from itertools import chain, count, product -from string import ascii_uppercase - -from django.core.exceptions import FieldDoesNotExist, FieldError -from django.db import DEFAULT_DB_ALIAS, NotSupportedError, connections -from django.db.models.aggregates import Count -from django.db.models.constants import LOOKUP_SEP -from django.db.models.expressions import ( - BaseExpression, - Col, - ColPairs, - Exists, - F, - OuterRef, - RawSQL, - Ref, - ResolvedOuterRef, - Value, -) -from django.db.models.fields import Field -from django.db.models.lookups import Lookup -from django.db.models.query_utils import ( - Q, - check_rel_lookup_compatibility, - refs_expression, -) -from django.db.models.sql.constants import INNER, LOUTER, ORDER_DIR, SINGLE -from django.db.models.sql.datastructures import BaseTable, Empty, Join, MultiJoin -from django.db.models.sql.where import AND, OR, ExtraWhere, NothingNode, WhereNode -from django.utils.functional import cached_property -from django.utils.regex_helper import _lazy_re_compile -from django.utils.tree import Node - -__all__ = ["Query", "RawQuery"] - -# Quotation marks ('"`[]), whitespace characters, semicolons, or inline -# SQL comments are forbidden in column aliases. -FORBIDDEN_ALIAS_PATTERN = _lazy_re_compile(r"['`\"\]\[;\s]|--|/\*|\*/") - -# Inspired from -# https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS -EXPLAIN_OPTIONS_PATTERN = _lazy_re_compile(r"[\w-]+") - - -def get_field_names_from_opts(opts): - if opts is None: - return set() - return set( - chain.from_iterable( - (f.name, f.attname) if f.concrete else (f.name,) for f in opts.get_fields() - ) - ) - - -def get_paths_from_expression(expr): - if isinstance(expr, F): - yield expr.name - elif hasattr(expr, "flatten"): - for child in expr.flatten(): - if isinstance(child, F): - yield child.name - elif isinstance(child, Q): - yield from get_children_from_q(child) - - -def get_children_from_q(q): - for child in q.children: - if isinstance(child, Node): - yield from get_children_from_q(child) - elif isinstance(child, tuple): - lhs, rhs = child - yield lhs - if hasattr(rhs, "resolve_expression"): - yield from get_paths_from_expression(rhs) - elif hasattr(child, "resolve_expression"): - yield from get_paths_from_expression(child) - - -def get_child_with_renamed_prefix(prefix, replacement, child): - from django.db.models.query import QuerySet - - if isinstance(child, Node): - return rename_prefix_from_q(prefix, replacement, child) - if isinstance(child, tuple): - lhs, rhs = child - if lhs.startswith(prefix + LOOKUP_SEP): - lhs = lhs.replace(prefix, replacement, 1) - if not isinstance(rhs, F) and hasattr(rhs, "resolve_expression"): - rhs = get_child_with_renamed_prefix(prefix, replacement, rhs) - return lhs, rhs - - if isinstance(child, F): - child = child.copy() - if child.name.startswith(prefix + LOOKUP_SEP): - child.name = child.name.replace(prefix, replacement, 1) - elif isinstance(child, QuerySet): - # QuerySet may contain OuterRef() references which cannot work properly - # without repointing to the filtered annotation and will spawn a - # different JOIN. Always raise ValueError instead of providing partial - # support in other cases. - raise ValueError( - "Passing a QuerySet within a FilteredRelation is not supported." - ) - elif hasattr(child, "resolve_expression"): - child = child.copy() - child.set_source_expressions( - [ - get_child_with_renamed_prefix(prefix, replacement, grand_child) - for grand_child in child.get_source_expressions() - ] - ) - return child - - -def rename_prefix_from_q(prefix, replacement, q): - return Q.create( - [get_child_with_renamed_prefix(prefix, replacement, c) for c in q.children], - q.connector, - q.negated, - ) - - -JoinInfo = namedtuple( - "JoinInfo", - ("final_field", "targets", "opts", "joins", "path", "transform_function"), -) - - -class RawQuery: - """A single raw SQL query.""" - - def __init__(self, sql, using, params=()): - self.params = params - self.sql = sql - self.using = using - self.cursor = None - - # Mirror some properties of a normal query so that - # the compiler can be used to process results. - self.low_mark, self.high_mark = 0, None # Used for offset/limit - self.extra_select = {} - self.annotation_select = {} - - def chain(self, using): - return self.clone(using) - - def clone(self, using): - return RawQuery(self.sql, using, params=self.params) - - def get_columns(self): - if self.cursor is None: - self._execute_query() - converter = connections[self.using].introspection.identifier_converter - return [converter(column_meta[0]) for column_meta in self.cursor.description] - - def __iter__(self): - # Always execute a new query for a new iterator. - # This could be optimized with a cache at the expense of RAM. - self._execute_query() - if not connections[self.using].features.can_use_chunked_reads: - # If the database can't use chunked reads we need to make sure we - # evaluate the entire query up front. - result = list(self.cursor) - else: - result = self.cursor - return iter(result) - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self) - - @property - def params_type(self): - if self.params is None: - return None - return dict if isinstance(self.params, Mapping) else tuple - - def __str__(self): - if self.params_type is None: - return self.sql - return self.sql % self.params_type(self.params) - - def _execute_query(self): - connection = connections[self.using] - - # Adapt parameters to the database, as much as possible considering - # that the target type isn't known. See #17755. - params_type = self.params_type - adapter = connection.ops.adapt_unknown_value - if params_type is tuple: - params = tuple(adapter(val) for val in self.params) - elif params_type is dict: - params = {key: adapter(val) for key, val in self.params.items()} - elif params_type is None: - params = None - else: - raise RuntimeError("Unexpected params type: %s" % params_type) - - self.cursor = connection.cursor() - self.cursor.execute(self.sql, params) - - -ExplainInfo = namedtuple("ExplainInfo", ("format", "options")) - - -class Query(BaseExpression): - """A single SQL query.""" - - alias_prefix = "T" - empty_result_set_value = None - subq_aliases = frozenset([alias_prefix]) - - compiler = "SQLCompiler" - - base_table_class = BaseTable - join_class = Join - - default_cols = True - default_ordering = True - standard_ordering = True - - filter_is_sticky = False - subquery = False - - # SQL-related attributes. - # Select and related select clauses are expressions to use in the SELECT - # clause of the query. The select is used for cases where we want to set up - # the select clause to contain other than default fields (values(), - # subqueries...). Note that annotations go to annotations dictionary. - select = () - # The group_by attribute can have one of the following forms: - # - None: no group by at all in the query - # - A tuple of expressions: group by (at least) those expressions. - # String refs are also allowed for now. - # - True: group by all select fields of the model - # See compiler.get_group_by() for details. - group_by = None - order_by = () - low_mark = 0 # Used for offset/limit. - high_mark = None # Used for offset/limit. - distinct = False - distinct_fields = () - select_for_update = False - select_for_update_nowait = False - select_for_update_skip_locked = False - select_for_update_of = () - select_for_no_key_update = False - select_related = False - # Arbitrary limit for select_related to prevents infinite recursion. - max_depth = 5 - # Holds the selects defined by a call to values() or values_list() - # excluding annotation_select and extra_select. - values_select = () - selected = None - - # SQL annotation-related attributes. - annotation_select_mask = None - _annotation_select_cache = None - - # Set combination attributes. - combinator = None - combinator_all = False - combined_queries = () - - # These are for extensions. The contents are more or less appended verbatim - # to the appropriate clause. - extra_select_mask = None - _extra_select_cache = None - - extra_tables = () - extra_order_by = () - - # A tuple that is a set of model field names and either True, if these are - # the fields to defer, or False if these are the only fields to load. - deferred_loading = (frozenset(), True) - - explain_info = None - - def __init__(self, model, alias_cols=True): - self.model = model - self.alias_refcount = {} - # alias_map is the most important data structure regarding joins. - # It's used for recording which joins exist in the query and what - # types they are. The key is the alias of the joined table (possibly - # the table name) and the value is a Join-like object (see - # sql.datastructures.Join for more information). - self.alias_map = {} - # Whether to provide alias to columns during reference resolving. - self.alias_cols = alias_cols - # Sometimes the query contains references to aliases in outer queries (as - # a result of split_exclude). Correct alias quoting needs to know these - # aliases too. - # Map external tables to whether they are aliased. - self.external_aliases = {} - self.table_map = {} # Maps table names to list of aliases. - self.used_aliases = set() - - self.where = WhereNode() - # Maps alias -> Annotation Expression. - self.annotations = {} - # These are for extensions. The contents are more or less appended - # verbatim to the appropriate clause. - self.extra = {} # Maps col_alias -> (col_sql, params). - - self._filtered_relations = {} - - @property - def output_field(self): - if len(self.select) == 1: - select = self.select[0] - return getattr(select, "target", None) or select.field - elif len(self.annotation_select) == 1: - return next(iter(self.annotation_select.values())).output_field - - @cached_property - def base_table(self): - for alias in self.alias_map: - return alias - - def __str__(self): - """ - Return the query as a string of SQL with the parameter values - substituted in (use sql_with_params() to see the unsubstituted string). - - Parameter values won't necessarily be quoted correctly, since that is - done by the database interface at execution time. - """ - sql, params = self.sql_with_params() - return sql % params - - def sql_with_params(self): - """ - Return the query as an SQL string and the parameters that will be - substituted into the query. - """ - return self.get_compiler(DEFAULT_DB_ALIAS).as_sql() - - def __deepcopy__(self, memo): - """Limit the amount of work when a Query is deepcopied.""" - result = self.clone() - memo[id(self)] = result - return result - - def get_compiler(self, using=None, connection=None, elide_empty=True): - if using is None and connection is None: - raise ValueError("Need either using or connection") - if using: - connection = connections[using] - return connection.ops.compiler(self.compiler)( - self, connection, using, elide_empty - ) - - def get_meta(self): - """ - Return the Options instance (the model._meta) from which to start - processing. Normally, this is self.model._meta, but it can be changed - by subclasses. - """ - if self.model: - return self.model._meta - - def clone(self): - """ - Return a copy of the current Query. A lightweight alternative to - deepcopy(). - """ - obj = Empty() - obj.__class__ = self.__class__ - # Copy references to everything. - obj.__dict__ = self.__dict__.copy() - # Clone attributes that can't use shallow copy. - obj.alias_refcount = self.alias_refcount.copy() - obj.alias_map = self.alias_map.copy() - obj.external_aliases = self.external_aliases.copy() - obj.table_map = self.table_map.copy() - obj.where = self.where.clone() - obj.annotations = self.annotations.copy() - if self.annotation_select_mask is not None: - obj.annotation_select_mask = self.annotation_select_mask.copy() - if self.combined_queries: - obj.combined_queries = tuple( - [query.clone() for query in self.combined_queries] - ) - # _annotation_select_cache cannot be copied, as doing so breaks the - # (necessary) state in which both annotations and - # _annotation_select_cache point to the same underlying objects. - # It will get re-populated in the cloned queryset the next time it's - # used. - obj._annotation_select_cache = None - obj.extra = self.extra.copy() - if self.extra_select_mask is not None: - obj.extra_select_mask = self.extra_select_mask.copy() - if self._extra_select_cache is not None: - obj._extra_select_cache = self._extra_select_cache.copy() - if self.select_related is not False: - # Use deepcopy because select_related stores fields in nested - # dicts. - obj.select_related = copy.deepcopy(obj.select_related) - if "subq_aliases" in self.__dict__: - obj.subq_aliases = self.subq_aliases.copy() - obj.used_aliases = self.used_aliases.copy() - obj._filtered_relations = self._filtered_relations.copy() - # Clear the cached_property, if it exists. - obj.__dict__.pop("base_table", None) - return obj - - def chain(self, klass=None): - """ - Return a copy of the current Query that's ready for another operation. - The klass argument changes the type of the Query, e.g. UpdateQuery. - """ - obj = self.clone() - if klass and obj.__class__ != klass: - obj.__class__ = klass - if not obj.filter_is_sticky: - obj.used_aliases = set() - obj.filter_is_sticky = False - if hasattr(obj, "_setup_query"): - obj._setup_query() - return obj - - def relabeled_clone(self, change_map): - clone = self.clone() - clone.change_aliases(change_map) - return clone - - def _get_col(self, target, field, alias): - if not self.alias_cols: - alias = None - return target.get_col(alias, field) - - def get_aggregation(self, using, aggregate_exprs): - """ - Return the dictionary with the values of the existing aggregations. - """ - if not aggregate_exprs: - return {} - # Store annotation mask prior to temporarily adding aggregations for - # resolving purpose to facilitate their subsequent removal. - refs_subquery = False - refs_window = False - replacements = {} - annotation_select_mask = self.annotation_select_mask - for alias, aggregate_expr in aggregate_exprs.items(): - self.check_alias(alias) - aggregate = aggregate_expr.resolve_expression( - self, allow_joins=True, reuse=None, summarize=True - ) - if not aggregate.contains_aggregate: - raise TypeError("%s is not an aggregate expression" % alias) - # Temporarily add aggregate to annotations to allow remaining - # members of `aggregates` to resolve against each others. - self.append_annotation_mask([alias]) - aggregate_refs = aggregate.get_refs() - refs_subquery |= any( - getattr(self.annotations[ref], "contains_subquery", False) - for ref in aggregate_refs - ) - refs_window |= any( - getattr(self.annotations[ref], "contains_over_clause", True) - for ref in aggregate_refs - ) - aggregate = aggregate.replace_expressions(replacements) - self.annotations[alias] = aggregate - replacements[Ref(alias, aggregate)] = aggregate - # Stash resolved aggregates now that they have been allowed to resolve - # against each other. - aggregates = {alias: self.annotations.pop(alias) for alias in aggregate_exprs} - self.set_annotation_mask(annotation_select_mask) - # Existing usage of aggregation can be determined by the presence of - # selected aggregates but also by filters against aliased aggregates. - _, having, qualify = self.where.split_having_qualify() - has_existing_aggregation = ( - any( - getattr(annotation, "contains_aggregate", True) - for annotation in self.annotations.values() - ) - or having - ) - set_returning_annotations = { - alias - for alias, annotation in self.annotation_select.items() - if getattr(annotation, "set_returning", False) - } - # Decide if we need to use a subquery. - # - # Existing aggregations would cause incorrect results as - # get_aggregation() must produce just one result and thus must not use - # GROUP BY. - # - # If the query has limit or distinct, or uses set operations, then - # those operations must be done in a subquery so that the query - # aggregates on the limit and/or distinct results instead of applying - # the distinct and limit after the aggregation. - if ( - isinstance(self.group_by, tuple) - or self.is_sliced - or has_existing_aggregation - or refs_subquery - or refs_window - or qualify - or self.distinct - or self.combinator - or set_returning_annotations - ): - from django.db.models.sql.subqueries import AggregateQuery - - inner_query = self.clone() - inner_query.subquery = True - outer_query = AggregateQuery(self.model, inner_query) - inner_query.select_for_update = False - inner_query.select_related = False - inner_query.set_annotation_mask(self.annotation_select) - # Queries with distinct_fields need ordering and when a limit is - # applied we must take the slice from the ordered query. Otherwise - # no need for ordering. - inner_query.clear_ordering(force=False) - if not inner_query.distinct: - # If the inner query uses default select and it has some - # aggregate annotations, then we must make sure the inner - # query is grouped by the main model's primary key. However, - # clearing the select clause can alter results if distinct is - # used. - if inner_query.default_cols and has_existing_aggregation: - inner_query.group_by = ( - self.model._meta.pk.get_col(inner_query.get_initial_alias()), - ) - inner_query.default_cols = False - if not qualify and not self.combinator: - # Mask existing annotations that are not referenced by - # aggregates to be pushed to the outer query unless - # filtering against window functions or if the query is - # combined as both would require complex realiasing logic. - annotation_mask = set() - if isinstance(self.group_by, tuple): - for expr in self.group_by: - annotation_mask |= expr.get_refs() - for aggregate in aggregates.values(): - annotation_mask |= aggregate.get_refs() - # Avoid eliding expressions that might have an incidence on - # the implicit grouping logic. - for annotation_alias, annotation in self.annotation_select.items(): - if annotation.get_group_by_cols(): - annotation_mask.add(annotation_alias) - inner_query.set_annotation_mask(annotation_mask) - # Annotations that possibly return multiple rows cannot - # be masked as they might have an incidence on the query. - annotation_mask |= set_returning_annotations - - # Add aggregates to the outer AggregateQuery. This requires making - # sure all columns referenced by the aggregates are selected in the - # inner query. It is achieved by retrieving all column references - # by the aggregates, explicitly selecting them in the inner query, - # and making sure the aggregates are repointed to them. - col_refs = {} - for alias, aggregate in aggregates.items(): - replacements = {} - for col in self._gen_cols([aggregate], resolve_refs=False): - if not (col_ref := col_refs.get(col)): - index = len(col_refs) + 1 - col_alias = f"__col{index}" - col_ref = Ref(col_alias, col) - col_refs[col] = col_ref - inner_query.add_annotation(col, col_alias) - replacements[col] = col_ref - outer_query.annotations[alias] = aggregate.replace_expressions( - replacements - ) - if ( - inner_query.select == () - and not inner_query.default_cols - and not inner_query.annotation_select_mask - ): - # In case of Model.objects[0:3].count(), there would be no - # field selected in the inner query, yet we must use a subquery. - # So, make sure at least one field is selected. - inner_query.select = ( - self.model._meta.pk.get_col(inner_query.get_initial_alias()), - ) - else: - outer_query = self - self.select = () - self.selected = None - self.default_cols = False - self.extra = {} - if self.annotations: - # Inline reference to existing annotations and mask them as - # they are unnecessary given only the summarized aggregations - # are requested. - replacements = { - Ref(alias, annotation): annotation - for alias, annotation in self.annotations.items() - } - self.annotations = { - alias: aggregate.replace_expressions(replacements) - for alias, aggregate in aggregates.items() - } - else: - self.annotations = aggregates - self.set_annotation_mask(aggregates) - - empty_set_result = [ - expression.empty_result_set_value - for expression in outer_query.annotation_select.values() - ] - elide_empty = not any(result is NotImplemented for result in empty_set_result) - outer_query.clear_ordering(force=True) - outer_query.clear_limits() - outer_query.select_for_update = False - outer_query.select_related = False - compiler = outer_query.get_compiler(using, elide_empty=elide_empty) - result = compiler.execute_sql(SINGLE) - if result is None: - result = empty_set_result - else: - cols = outer_query.annotation_select.values() - converters = compiler.get_converters(cols) - rows = compiler.apply_converters((result,), converters) - if compiler.has_composite_fields(cols): - rows = compiler.composite_fields_to_tuples(rows, cols) - result = next(rows) - - return dict(zip(outer_query.annotation_select, result)) - - def get_count(self, using): - """ - Perform a COUNT() query using the current filter constraints. - """ - obj = self.clone() - return obj.get_aggregation(using, {"__count": Count("*")})["__count"] - - def has_filters(self): - return self.where - - def exists(self, limit=True): - q = self.clone() - if not (q.distinct and q.is_sliced): - if q.group_by is True: - q.add_fields( - (f.attname for f in self.model._meta.concrete_fields), False - ) - # Disable GROUP BY aliases to avoid orphaning references to the - # SELECT clause which is about to be cleared. - q.set_group_by(allow_aliases=False) - q.clear_select_clause() - if q.combined_queries and q.combinator == "union": - q.combined_queries = tuple( - combined_query.exists(limit=False) - for combined_query in q.combined_queries - ) - q.clear_ordering(force=True) - if limit is True: - q.set_limits(high=1) - q.add_annotation(Value(1), "a") - return q - - def has_results(self, using): - q = self.exists() - compiler = q.get_compiler(using=using) - return compiler.has_results() - - def explain(self, using, format=None, **options): - q = self.clone() - for option_name in options: - if ( - not EXPLAIN_OPTIONS_PATTERN.fullmatch(option_name) - or "--" in option_name - ): - raise ValueError(f"Invalid option name: {option_name!r}.") - q.explain_info = ExplainInfo(format, options) - compiler = q.get_compiler(using=using) - return "\n".join(compiler.explain_query()) - - def combine(self, rhs, connector): - """ - Merge the 'rhs' query into the current one (with any 'rhs' effects - being applied *after* (that is, "to the right of") anything in the - current query. 'rhs' is not modified during a call to this function. - - The 'connector' parameter describes how to connect filters from the - 'rhs' query. - """ - if self.model != rhs.model: - raise TypeError("Cannot combine queries on two different base models.") - if self.is_sliced: - raise TypeError("Cannot combine queries once a slice has been taken.") - if self.distinct != rhs.distinct: - raise TypeError("Cannot combine a unique query with a non-unique query.") - if self.distinct_fields != rhs.distinct_fields: - raise TypeError("Cannot combine queries with different distinct fields.") - - # If lhs and rhs shares the same alias prefix, it is possible to have - # conflicting alias changes like T4 -> T5, T5 -> T6, which might end up - # as T4 -> T6 while combining two querysets. To prevent this, change an - # alias prefix of the rhs and update current aliases accordingly, - # except if the alias is the base table since it must be present in the - # query on both sides. - initial_alias = self.get_initial_alias() - rhs = rhs.clone() - rhs.bump_prefix(self, exclude={initial_alias}) - - # Work out how to relabel the rhs aliases, if necessary. - change_map = {} - conjunction = connector == AND - - # Determine which existing joins can be reused. When combining the - # query with AND we must recreate all joins for m2m filters. When - # combining with OR we can reuse joins. The reason is that in AND - # case a single row can't fulfill a condition like: - # revrel__col=1 & revrel__col=2 - # But, there might be two different related rows matching this - # condition. In OR case a single True is enough, so single row is - # enough, too. - # - # Note that we will be creating duplicate joins for non-m2m joins in - # the AND case. The results will be correct but this creates too many - # joins. This is something that could be fixed later on. - reuse = set() if conjunction else set(self.alias_map) - joinpromoter = JoinPromoter(connector, 2, False) - joinpromoter.add_votes( - j for j in self.alias_map if self.alias_map[j].join_type == INNER - ) - rhs_votes = set() - # Now, add the joins from rhs query into the new query (skipping base - # table). - rhs_tables = list(rhs.alias_map)[1:] - for alias in rhs_tables: - join = rhs.alias_map[alias] - # If the left side of the join was already relabeled, use the - # updated alias. - join = join.relabeled_clone(change_map) - new_alias = self.join(join, reuse=reuse) - if join.join_type == INNER: - rhs_votes.add(new_alias) - # We can't reuse the same join again in the query. If we have two - # distinct joins for the same connection in rhs query, then the - # combined query must have two joins, too. - reuse.discard(new_alias) - if alias != new_alias: - change_map[alias] = new_alias - if not rhs.alias_refcount[alias]: - # The alias was unused in the rhs query. Unref it so that it - # will be unused in the new query, too. We have to add and - # unref the alias so that join promotion has information of - # the join type for the unused alias. - self.unref_alias(new_alias) - joinpromoter.add_votes(rhs_votes) - joinpromoter.update_join_types(self) - - # Combine subqueries aliases to ensure aliases relabelling properly - # handle subqueries when combining where and select clauses. - self.subq_aliases |= rhs.subq_aliases - - # Now relabel a copy of the rhs where-clause and add it to the current - # one. - w = rhs.where.clone() - w.relabel_aliases(change_map) - self.where.add(w, connector) - - # Selection columns and extra extensions are those provided by 'rhs'. - if rhs.select: - self.set_select([col.relabeled_clone(change_map) for col in rhs.select]) - else: - self.select = () - - if connector == OR: - # It would be nice to be able to handle this, but the queries don't - # really make sense (or return consistent value sets). Not worth - # the extra complexity when you can write a real query instead. - if self.extra and rhs.extra: - raise ValueError( - "When merging querysets using 'or', you cannot have " - "extra(select=...) on both sides." - ) - self.extra.update(rhs.extra) - extra_select_mask = set() - if self.extra_select_mask is not None: - extra_select_mask.update(self.extra_select_mask) - if rhs.extra_select_mask is not None: - extra_select_mask.update(rhs.extra_select_mask) - if extra_select_mask: - self.set_extra_mask(extra_select_mask) - self.extra_tables += rhs.extra_tables - - # Ordering uses the 'rhs' ordering, unless it has none, in which case - # the current ordering is used. - self.order_by = rhs.order_by or self.order_by - self.extra_order_by = rhs.extra_order_by or self.extra_order_by - - def _get_defer_select_mask(self, opts, mask, select_mask=None): - if select_mask is None: - select_mask = {} - select_mask[opts.pk] = {} - # All concrete fields and related objects that are not part of the - # defer mask must be included. If a relational field is encountered it - # gets added to the mask for it be considered if `select_related` and - # the cycle continues by recursively calling this function. - for field in opts.concrete_fields + opts.related_objects: - field_mask = mask.pop(field.name, None) - field_att_mask = None - if field_attname := getattr(field, "attname", None): - field_att_mask = mask.pop(field_attname, None) - if field_mask is None and field_att_mask is None: - select_mask.setdefault(field, {}) - elif field_mask: - if not field.is_relation: - raise FieldError(next(iter(field_mask))) - # Virtual fields such as many-to-many and generic foreign keys - # cannot be effectively deferred. Historically, they were - # allowed to be passed to QuerySet.defer(). Ignore such field - # references until a layer of validation at mask alteration - # time is eventually implemented. - if field.many_to_many: - continue - field_select_mask = select_mask.setdefault(field, {}) - related_model = field.related_model._meta.concrete_model - self._get_defer_select_mask( - related_model._meta, field_mask, field_select_mask - ) - # Remaining defer entries must be references to filtered relations - # otherwise they are surfaced as missing field errors. - for field_name, field_mask in mask.items(): - if filtered_relation := self._filtered_relations.get(field_name): - relation = opts.get_field(filtered_relation.relation_name) - field_select_mask = select_mask.setdefault((field_name, relation), {}) - related_model = relation.related_model._meta.concrete_model - self._get_defer_select_mask( - related_model._meta, field_mask, field_select_mask - ) - else: - opts.get_field(field_name) - return select_mask - - def _get_only_select_mask(self, opts, mask, select_mask=None): - if select_mask is None: - select_mask = {} - select_mask[opts.pk] = {} - # Only include fields mentioned in the mask. - for field_name, field_mask in mask.items(): - field = opts.get_field(field_name) - field_select_mask = select_mask.setdefault(field, {}) - if field_mask: - if not field.is_relation: - raise FieldError(next(iter(field_mask))) - related_model = field.remote_field.model._meta.concrete_model - self._get_only_select_mask( - related_model._meta, field_mask, field_select_mask - ) - return select_mask - - def get_select_mask(self): - """ - Convert the self.deferred_loading data structure to an alternate data - structure, describing the field that *will* be loaded. This is used to - compute the columns to select from the database and also by the - QuerySet class to work out which fields are being initialized on each - model. Models that have all their fields included aren't mentioned in - the result, only those that have field restrictions in place. - """ - field_names, defer = self.deferred_loading - if not field_names: - return {} - mask = {} - for field_name in field_names: - part_mask = mask - for part in field_name.split(LOOKUP_SEP): - part_mask = part_mask.setdefault(part, {}) - opts = self.get_meta() - if defer: - return self._get_defer_select_mask(opts, mask) - return self._get_only_select_mask(opts, mask) - - def table_alias(self, table_name, create=False, filtered_relation=None): - """ - Return a table alias for the given table_name and whether this is a - new alias or not. - - If 'create' is true, a new alias is always created. Otherwise, the - most recently created alias for the table (if one exists) is reused. - """ - alias_list = self.table_map.get(table_name) - if not create and alias_list: - alias = alias_list[0] - self.alias_refcount[alias] += 1 - return alias, False - - # Create a new alias for this table. - if alias_list: - alias = "%s%d" % (self.alias_prefix, len(self.alias_map) + 1) - alias_list.append(alias) - else: - # The first occurrence of a table uses the table name directly. - alias = ( - filtered_relation.alias if filtered_relation is not None else table_name - ) - self.table_map[table_name] = [alias] - self.alias_refcount[alias] = 1 - return alias, True - - def ref_alias(self, alias): - """Increases the reference count for this alias.""" - self.alias_refcount[alias] += 1 - - def unref_alias(self, alias, amount=1): - """Decreases the reference count for this alias.""" - self.alias_refcount[alias] -= amount - - def promote_joins(self, aliases): - """ - Promote recursively the join type of given aliases and its children to - an outer join. If 'unconditional' is False, only promote the join if - it is nullable or the parent join is an outer join. - - The children promotion is done to avoid join chains that contain a LOUTER - b INNER c. So, if we have currently a INNER b INNER c and a->b is promoted, - then we must also promote b->c automatically, or otherwise the promotion - of a->b doesn't actually change anything in the query results. - """ - aliases = list(aliases) - while aliases: - alias = aliases.pop(0) - if self.alias_map[alias].join_type is None: - # This is the base table (first FROM entry) - this table - # isn't really joined at all in the query, so we should not - # alter its join type. - continue - # Only the first alias (skipped above) should have None join_type - assert self.alias_map[alias].join_type is not None - parent_alias = self.alias_map[alias].parent_alias - parent_louter = ( - parent_alias and self.alias_map[parent_alias].join_type == LOUTER - ) - already_louter = self.alias_map[alias].join_type == LOUTER - if (self.alias_map[alias].nullable or parent_louter) and not already_louter: - self.alias_map[alias] = self.alias_map[alias].promote() - # Join type of 'alias' changed, so re-examine all aliases that - # refer to this one. - aliases.extend( - join - for join in self.alias_map - if self.alias_map[join].parent_alias == alias - and join not in aliases - ) - - def demote_joins(self, aliases): - """ - Change join type from LOUTER to INNER for all joins in aliases. - - Similarly to promote_joins(), this method must ensure no join chains - containing first an outer, then an inner join are generated. If we - are demoting b->c join in chain a LOUTER b LOUTER c then we must - demote a->b automatically, or otherwise the demotion of b->c doesn't - actually change anything in the query results. . - """ - aliases = list(aliases) - while aliases: - alias = aliases.pop(0) - if self.alias_map[alias].join_type == LOUTER: - self.alias_map[alias] = self.alias_map[alias].demote() - parent_alias = self.alias_map[alias].parent_alias - if self.alias_map[parent_alias].join_type == INNER: - aliases.append(parent_alias) - - def reset_refcounts(self, to_counts): - """ - Reset reference counts for aliases so that they match the value passed - in `to_counts`. - """ - for alias, cur_refcount in self.alias_refcount.copy().items(): - unref_amount = cur_refcount - to_counts.get(alias, 0) - self.unref_alias(alias, unref_amount) - - def change_aliases(self, change_map): - """ - Change the aliases in change_map (which maps old-alias -> new-alias), - relabelling any references to them in select columns and the where - clause. - """ - if not change_map: - return self - # If keys and values of change_map were to intersect, an alias might be - # updated twice (e.g. T4 -> T5, T5 -> T6, so also T4 -> T6) depending - # on their order in change_map. - assert set(change_map).isdisjoint(change_map.values()) - - # 1. Update references in "select" (normal columns plus aliases), - # "group by" and "where". - self.where.relabel_aliases(change_map) - if isinstance(self.group_by, tuple): - self.group_by = tuple( - [col.relabeled_clone(change_map) for col in self.group_by] - ) - self.select = tuple([col.relabeled_clone(change_map) for col in self.select]) - self.annotations = self.annotations and { - key: col.relabeled_clone(change_map) - for key, col in self.annotations.items() - } - - # 2. Rename the alias in the internal table/alias datastructures. - for old_alias, new_alias in change_map.items(): - if old_alias not in self.alias_map: - continue - alias_data = self.alias_map[old_alias].relabeled_clone(change_map) - self.alias_map[new_alias] = alias_data - self.alias_refcount[new_alias] = self.alias_refcount[old_alias] - del self.alias_refcount[old_alias] - del self.alias_map[old_alias] - - table_aliases = self.table_map[alias_data.table_name] - for pos, alias in enumerate(table_aliases): - if alias == old_alias: - table_aliases[pos] = new_alias - break - - # 3. Rename the direct external aliases and the ones of combined - # queries (union, intersection, difference). - self.external_aliases = { - # Table is aliased or it's being changed and thus is aliased. - change_map.get(alias, alias): (aliased or alias in change_map) - for alias, aliased in self.external_aliases.items() - } - for combined_query in self.combined_queries: - external_change_map = { - alias: aliased - for alias, aliased in change_map.items() - if alias in combined_query.external_aliases - } - combined_query.change_aliases(external_change_map) - - def bump_prefix(self, other_query, exclude=None): - """ - Change the alias prefix to the next letter in the alphabet in a way - that the other query's aliases and this query's aliases will not - conflict. Even tables that previously had no alias will get an alias - after this call. To prevent changing aliases use the exclude parameter. - """ - - def prefix_gen(): - """ - Generate a sequence of characters in alphabetical order: - -> 'A', 'B', 'C', ... - - When the alphabet is finished, the sequence will continue with the - Cartesian product: - -> 'AA', 'AB', 'AC', ... - """ - alphabet = ascii_uppercase - prefix = chr(ord(self.alias_prefix) + 1) - yield prefix - for n in count(1): - seq = alphabet[alphabet.index(prefix) :] if prefix else alphabet - for s in product(seq, repeat=n): - yield "".join(s) - prefix = None - - if self.alias_prefix != other_query.alias_prefix: - # No clashes between self and outer query should be possible. - return - - # Explicitly avoid infinite loop. The constant divider is based on how - # much depth recursive subquery references add to the stack. This value - # might need to be adjusted when adding or removing function calls from - # the code path in charge of performing these operations. - local_recursion_limit = sys.getrecursionlimit() // 16 - for pos, prefix in enumerate(prefix_gen()): - if prefix not in self.subq_aliases: - self.alias_prefix = prefix - break - if pos > local_recursion_limit: - raise RecursionError( - "Maximum recursion depth exceeded: too many subqueries." - ) - self.subq_aliases = self.subq_aliases.union([self.alias_prefix]) - other_query.subq_aliases = other_query.subq_aliases.union(self.subq_aliases) - if exclude is None: - exclude = {} - self.change_aliases( - { - alias: "%s%d" % (self.alias_prefix, pos) - for pos, alias in enumerate(self.alias_map) - if alias not in exclude - } - ) - - def get_initial_alias(self): - """ - Return the first alias for this query, after increasing its reference - count. - """ - if self.alias_map: - alias = self.base_table - self.ref_alias(alias) - elif self.model: - alias = self.join(self.base_table_class(self.get_meta().db_table, None)) - else: - alias = None - return alias - - def count_active_tables(self): - """ - Return the number of tables in this query with a non-zero reference - count. After execution, the reference counts are zeroed, so tables - added in compiler will not be seen by this method. - """ - return len([1 for count in self.alias_refcount.values() if count]) - - def join(self, join, reuse=None): - """ - Return an alias for the 'join', either reusing an existing alias for - that join or creating a new one. 'join' is either a base_table_class or - join_class. - - The 'reuse' parameter can be either None which means all joins are - reusable, or it can be a set containing the aliases that can be reused. - - A join is always created as LOUTER if the lhs alias is LOUTER to make - sure chains like t1 LOUTER t2 INNER t3 aren't generated. All new - joins are created as LOUTER if the join is nullable. - """ - reuse_aliases = [ - a - for a, j in self.alias_map.items() - if (reuse is None or a in reuse) and j == join - ] - if reuse_aliases: - if join.table_alias in reuse_aliases: - reuse_alias = join.table_alias - else: - # Reuse the most recent alias of the joined table - # (a many-to-many relation may be joined multiple times). - reuse_alias = reuse_aliases[-1] - self.ref_alias(reuse_alias) - return reuse_alias - - # No reuse is possible, so we need a new alias. - alias, _ = self.table_alias( - join.table_name, create=True, filtered_relation=join.filtered_relation - ) - if join.join_type: - if self.alias_map[join.parent_alias].join_type == LOUTER or join.nullable: - join_type = LOUTER - else: - join_type = INNER - join.join_type = join_type - join.table_alias = alias - self.alias_map[alias] = join - if filtered_relation := join.filtered_relation: - resolve_reuse = reuse - if resolve_reuse is not None: - resolve_reuse = set(reuse) | {alias} - joins_len = len(self.alias_map) - join.filtered_relation = filtered_relation.resolve_expression( - self, reuse=resolve_reuse - ) - # Some joins were during expression resolving, they must be present - # before the one we just added. - if joins_len < len(self.alias_map): - self.alias_map[alias] = self.alias_map.pop(alias) - return alias - - def join_parent_model(self, opts, model, alias, seen): - """ - Make sure the given 'model' is joined in the query. If 'model' isn't - a parent of 'opts' or if it is None this method is a no-op. - - The 'alias' is the root alias for starting the join, 'seen' is a dict - of model -> alias of existing joins. It must also contain a mapping - of None -> some alias. This will be returned in the no-op case. - """ - if model in seen: - return seen[model] - chain = opts.get_base_chain(model) - if not chain: - return alias - curr_opts = opts - for int_model in chain: - if int_model in seen: - curr_opts = int_model._meta - alias = seen[int_model] - continue - # Proxy model have elements in base chain - # with no parents, assign the new options - # object and skip to the next base in that - # case - if not curr_opts.parents[int_model]: - curr_opts = int_model._meta - continue - link_field = curr_opts.get_ancestor_link(int_model) - join_info = self.setup_joins([link_field.name], curr_opts, alias) - curr_opts = int_model._meta - alias = seen[int_model] = join_info.joins[-1] - return alias or seen[None] - - def check_alias(self, alias): - if FORBIDDEN_ALIAS_PATTERN.search(alias): - raise ValueError( - "Column aliases cannot contain whitespace characters, quotation marks, " - "semicolons, or SQL comments." - ) - - def add_annotation(self, annotation, alias, select=True): - """Add a single annotation expression to the Query.""" - self.check_alias(alias) - annotation = annotation.resolve_expression(self, allow_joins=True, reuse=None) - if select: - self.append_annotation_mask([alias]) - else: - self.set_annotation_mask(set(self.annotation_select).difference({alias})) - self.annotations[alias] = annotation - if self.selected: - self.selected[alias] = alias - - @property - def _subquery_fields_len(self): - if self.has_select_fields: - return len(self.selected) - return len(self.model._meta.pk_fields) - - def resolve_expression(self, query, *args, **kwargs): - clone = self.clone() - # Subqueries need to use a different set of aliases than the outer query. - clone.bump_prefix(query) - clone.subquery = True - clone.where.resolve_expression(query, *args, **kwargs) - # Resolve combined queries. - if clone.combinator: - clone.combined_queries = tuple( - [ - combined_query.resolve_expression(query, *args, **kwargs) - for combined_query in clone.combined_queries - ] - ) - for key, value in clone.annotations.items(): - resolved = value.resolve_expression(query, *args, **kwargs) - if hasattr(resolved, "external_aliases"): - resolved.external_aliases.update(clone.external_aliases) - clone.annotations[key] = resolved - # Outer query's aliases are considered external. - for alias, table in query.alias_map.items(): - clone.external_aliases[alias] = ( - isinstance(table, Join) - and table.join_field.related_model._meta.db_table != alias - ) or ( - isinstance(table, BaseTable) and table.table_name != table.table_alias - ) - return clone - - def get_external_cols(self): - exprs = chain(self.annotations.values(), self.where.children) - return [ - col - for col in self._gen_cols(exprs, include_external=True) - if col.alias in self.external_aliases - ] - - def get_group_by_cols(self, wrapper=None): - # If wrapper is referenced by an alias for an explicit GROUP BY through - # values() a reference to this expression and not the self must be - # returned to ensure external column references are not grouped against - # as well. - external_cols = self.get_external_cols() - if any(col.possibly_multivalued for col in external_cols): - return [wrapper or self] - return external_cols - - def as_sql(self, compiler, connection): - # Some backends (e.g. Oracle) raise an error when a subquery contains - # unnecessary ORDER BY clause. - if ( - self.subquery - and not connection.features.ignores_unnecessary_order_by_in_subqueries - ): - self.clear_ordering(force=False) - for query in self.combined_queries: - query.clear_ordering(force=False) - sql, params = self.get_compiler(connection=connection).as_sql() - if self.subquery: - sql = "(%s)" % sql - return sql, params - - def resolve_lookup_value(self, value, can_reuse, allow_joins, summarize=False): - if hasattr(value, "resolve_expression"): - value = value.resolve_expression( - self, - reuse=can_reuse, - allow_joins=allow_joins, - summarize=summarize, - ) - elif isinstance(value, (list, tuple)): - # The items of the iterable may be expressions and therefore need - # to be resolved independently. - values = ( - self.resolve_lookup_value(sub_value, can_reuse, allow_joins, summarize) - for sub_value in value - ) - type_ = type(value) - if hasattr(type_, "_make"): # namedtuple - return type_(*values) - return type_(values) - return value - - def solve_lookup_type(self, lookup, summarize=False): - """ - Solve the lookup type from the lookup (e.g.: 'foobar__id__icontains'). - """ - lookup_splitted = lookup.split(LOOKUP_SEP) - if self.annotations: - annotation, expression_lookups = refs_expression( - lookup_splitted, self.annotations - ) - if annotation: - expression = self.annotations[annotation] - if summarize: - expression = Ref(annotation, expression) - return expression_lookups, (), expression - _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) - field_parts = lookup_splitted[0 : len(lookup_splitted) - len(lookup_parts)] - if len(lookup_parts) > 1 and not field_parts: - raise FieldError( - 'Invalid lookup "%s" for model %s".' - % (lookup, self.get_meta().model.__name__) - ) - return lookup_parts, field_parts, False - - def check_query_object_type(self, value, opts, field): - """ - Check whether the object passed while querying is of the correct type. - If not, raise a ValueError specifying the wrong object. - """ - if hasattr(value, "_meta"): - if not check_rel_lookup_compatibility(value._meta.model, opts, field): - raise ValueError( - 'Cannot query "%s": Must be "%s" instance.' - % (value, opts.object_name) - ) - - def check_related_objects(self, field, value, opts): - """Check the type of object passed to query relations.""" - if field.is_relation: - # Check that the field and the queryset use the same model in a - # query like .filter(author=Author.objects.all()). For example, the - # opts would be Author's (from the author field) and value.model - # would be Author.objects.all() queryset's .model (Author also). - # The field is the related field on the lhs side. - if ( - isinstance(value, Query) - and not value.has_select_fields - and not check_rel_lookup_compatibility(value.model, opts, field) - ): - raise ValueError( - 'Cannot use QuerySet for "%s": Use a QuerySet for "%s".' - % (value.model._meta.object_name, opts.object_name) - ) - elif hasattr(value, "_meta"): - self.check_query_object_type(value, opts, field) - elif hasattr(value, "__iter__"): - for v in value: - self.check_query_object_type(v, opts, field) - - def check_filterable(self, expression): - """Raise an error if expression cannot be used in a WHERE clause.""" - if hasattr(expression, "resolve_expression") and not getattr( - expression, "filterable", True - ): - raise NotSupportedError( - expression.__class__.__name__ + " is disallowed in the filter " - "clause." - ) - if hasattr(expression, "get_source_expressions"): - for expr in expression.get_source_expressions(): - self.check_filterable(expr) - - def build_lookup(self, lookups, lhs, rhs): - """ - Try to extract transforms and lookup from given lhs. - - The lhs value is something that works like SQLExpression. - The rhs value is what the lookup is going to compare against. - The lookups is a list of names to extract using get_lookup() - and get_transform(). - """ - # __exact is the default lookup if one isn't given. - *transforms, lookup_name = lookups or ["exact"] - for name in transforms: - lhs = self.try_transform(lhs, name, lookups) - # First try get_lookup() so that the lookup takes precedence if the lhs - # supports both transform and lookup for the name. - lookup_class = lhs.get_lookup(lookup_name) - if not lookup_class: - # A lookup wasn't found. Try to interpret the name as a transform - # and do an Exact lookup against it. - lhs = self.try_transform(lhs, lookup_name) - lookup_name = "exact" - lookup_class = lhs.get_lookup(lookup_name) - if not lookup_class: - return - - lookup = lookup_class(lhs, rhs) - # Interpret '__exact=None' as the sql 'is NULL'; otherwise, reject all - # uses of None as a query value unless the lookup supports it. - if lookup.rhs is None and not lookup.can_use_none_as_rhs: - if lookup_name not in ("exact", "iexact"): - raise ValueError("Cannot use None as a query value") - return lhs.get_lookup("isnull")(lhs, True) - - # For Oracle '' is equivalent to null. The check must be done at this - # stage because join promotion can't be done in the compiler. Using - # DEFAULT_DB_ALIAS isn't nice but it's the best that can be done here. - # A similar thing is done in is_nullable(), too. - if ( - lookup_name == "exact" - and lookup.rhs == "" - and connections[DEFAULT_DB_ALIAS].features.interprets_empty_strings_as_nulls - ): - return lhs.get_lookup("isnull")(lhs, True) - - return lookup - - def try_transform(self, lhs, name, lookups=None): - """ - Helper method for build_lookup(). Try to fetch and initialize - a transform for name parameter from lhs. - """ - transform_class = lhs.get_transform(name) - if transform_class: - return transform_class(lhs) - else: - output_field = lhs.output_field.__class__ - suggested_lookups = difflib.get_close_matches( - name, lhs.output_field.get_lookups() - ) - if suggested_lookups: - suggestion = ", perhaps you meant %s?" % " or ".join(suggested_lookups) - else: - suggestion = "." - if lookups is not None: - name_index = lookups.index(name) - unsupported_lookup = LOOKUP_SEP.join(lookups[name_index:]) - else: - unsupported_lookup = name - raise FieldError( - "Unsupported lookup '%s' for %s or join on the field not " - "permitted%s" % (unsupported_lookup, output_field.__name__, suggestion) - ) - - def build_filter( - self, - filter_expr, - branch_negated=False, - current_negated=False, - can_reuse=None, - allow_joins=True, - split_subq=True, - check_filterable=True, - summarize=False, - update_join_types=True, - ): - """ - Build a WhereNode for a single filter clause but don't add it - to this Query. Query.add_q() will then add this filter to the where - Node. - - The 'branch_negated' tells us if the current branch contains any - negations. This will be used to determine if subqueries are needed. - - The 'current_negated' is used to determine if the current filter is - negated or not and this will be used to determine if IS NULL filtering - is needed. - - The difference between current_negated and branch_negated is that - branch_negated is set on first negation, but current_negated is - flipped for each negation. - - Note that add_filter will not do any negating itself, that is done - upper in the code by add_q(). - - The 'can_reuse' is a set of reusable joins for multijoins. - - The method will create a filter clause that can be added to the current - query. However, if the filter isn't added to the query then the caller - is responsible for unreffing the joins used. - """ - if isinstance(filter_expr, dict): - raise FieldError("Cannot parse keyword query as dict") - if isinstance(filter_expr, Q): - return self._add_q( - filter_expr, - branch_negated=branch_negated, - current_negated=current_negated, - used_aliases=can_reuse, - allow_joins=allow_joins, - split_subq=split_subq, - check_filterable=check_filterable, - summarize=summarize, - update_join_types=update_join_types, - ) - if hasattr(filter_expr, "resolve_expression"): - if not getattr(filter_expr, "conditional", False): - raise TypeError("Cannot filter against a non-conditional expression.") - condition = filter_expr.resolve_expression( - self, allow_joins=allow_joins, reuse=can_reuse, summarize=summarize - ) - if not isinstance(condition, Lookup): - condition = self.build_lookup(["exact"], condition, True) - return WhereNode([condition], connector=AND), [] - arg, value = filter_expr - if not arg: - raise FieldError("Cannot parse keyword query %r" % arg) - lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) - - if check_filterable: - self.check_filterable(reffed_expression) - - if not allow_joins and len(parts) > 1: - raise FieldError("Joined field references are not permitted in this query") - - pre_joins = self.alias_refcount.copy() - value = self.resolve_lookup_value(value, can_reuse, allow_joins, summarize) - used_joins = { - k for k, v in self.alias_refcount.items() if v > pre_joins.get(k, 0) - } - - if check_filterable: - self.check_filterable(value) - - if reffed_expression: - condition = self.build_lookup(lookups, reffed_expression, value) - return WhereNode([condition], connector=AND), [] - - opts = self.get_meta() - alias = self.get_initial_alias() - allow_many = not branch_negated or not split_subq - - try: - join_info = self.setup_joins( - parts, - opts, - alias, - can_reuse=can_reuse, - allow_many=allow_many, - ) - - # Prevent iterator from being consumed by check_related_objects() - if isinstance(value, Iterator): - value = list(value) - self.check_related_objects(join_info.final_field, value, join_info.opts) - - # split_exclude() needs to know which joins were generated for the - # lookup parts - self._lookup_joins = join_info.joins - except MultiJoin as e: - return self.split_exclude(filter_expr, can_reuse, e.names_with_path) - - # Update used_joins before trimming since they are reused to determine - # which joins could be later promoted to INNER. - used_joins.update(join_info.joins) - targets, alias, join_list = self.trim_joins( - join_info.targets, join_info.joins, join_info.path - ) - if can_reuse is not None: - can_reuse.update(join_list) - - if join_info.final_field.is_relation: - if len(targets) == 1: - col = self._get_col(targets[0], join_info.final_field, alias) - else: - col = ColPairs(alias, targets, join_info.targets, join_info.final_field) - else: - col = self._get_col(targets[0], join_info.final_field, alias) - - condition = self.build_lookup(lookups, col, value) - lookup_type = condition.lookup_name - clause = WhereNode([condition], connector=AND) - - require_outer = ( - lookup_type == "isnull" and condition.rhs is True and not current_negated - ) - if ( - current_negated - and (lookup_type != "isnull" or condition.rhs is False) - and condition.rhs is not None - ): - require_outer = True - if lookup_type != "isnull": - # The condition added here will be SQL like this: - # NOT (col IS NOT NULL), where the first NOT is added in - # upper layers of code. The reason for addition is that if col - # is null, then col != someval will result in SQL "unknown" - # which isn't the same as in Python. The Python None handling - # is wanted, and it can be gotten by - # (col IS NULL OR col != someval) - # <=> - # NOT (col IS NOT NULL AND col = someval). - if ( - self.is_nullable(targets[0]) - or self.alias_map[join_list[-1]].join_type == LOUTER - ): - lookup_class = targets[0].get_lookup("isnull") - col = self._get_col(targets[0], join_info.targets[0], alias) - clause.add(lookup_class(col, False), AND) - # If someval is a nullable column, someval IS NOT NULL is - # added. - if isinstance(value, Col) and self.is_nullable(value.target): - lookup_class = value.target.get_lookup("isnull") - clause.add(lookup_class(value, False), AND) - return clause, used_joins if not require_outer else () - - def add_filter(self, filter_lhs, filter_rhs): - self.add_q(Q((filter_lhs, filter_rhs))) - - def add_q(self, q_object, reuse_all=False): - """ - A preprocessor for the internal _add_q(). Responsible for doing final - join promotion. - """ - # For join promotion this case is doing an AND for the added q_object - # and existing conditions. So, any existing inner join forces the join - # type to remain inner. Existing outer joins can however be demoted. - # (Consider case where rel_a is LOUTER and rel_a__col=1 is added - if - # rel_a doesn't produce any rows, then the whole condition must fail. - # So, demotion is OK. - existing_inner = { - a for a in self.alias_map if self.alias_map[a].join_type == INNER - } - if reuse_all: - can_reuse = set(self.alias_map) - else: - can_reuse = self.used_aliases - clause, _ = self._add_q(q_object, can_reuse) - if clause: - self.where.add(clause, AND) - self.demote_joins(existing_inner) - - def build_where(self, filter_expr): - return self.build_filter(filter_expr, allow_joins=False)[0] - - def clear_where(self): - self.where = WhereNode() - - def _add_q( - self, - q_object, - used_aliases, - branch_negated=False, - current_negated=False, - allow_joins=True, - split_subq=True, - check_filterable=True, - summarize=False, - update_join_types=True, - ): - """Add a Q-object to the current filter.""" - connector = q_object.connector - current_negated ^= q_object.negated - branch_negated = branch_negated or q_object.negated - target_clause = WhereNode(connector=connector, negated=q_object.negated) - joinpromoter = JoinPromoter( - q_object.connector, len(q_object.children), current_negated - ) - for child in q_object.children: - child_clause, needed_inner = self.build_filter( - child, - can_reuse=used_aliases, - branch_negated=branch_negated, - current_negated=current_negated, - allow_joins=allow_joins, - split_subq=split_subq, - check_filterable=check_filterable, - summarize=summarize, - update_join_types=update_join_types, - ) - joinpromoter.add_votes(needed_inner) - if child_clause: - target_clause.add(child_clause, connector) - if update_join_types: - needed_inner = joinpromoter.update_join_types(self) - else: - needed_inner = [] - return target_clause, needed_inner - - def add_filtered_relation(self, filtered_relation, alias): - filtered_relation.alias = alias - relation_lookup_parts, relation_field_parts, _ = self.solve_lookup_type( - filtered_relation.relation_name - ) - if relation_lookup_parts: - raise ValueError( - "FilteredRelation's relation_name cannot contain lookups " - "(got %r)." % filtered_relation.relation_name - ) - for lookup in get_children_from_q(filtered_relation.condition): - lookup_parts, lookup_field_parts, _ = self.solve_lookup_type(lookup) - shift = 2 if not lookup_parts else 1 - lookup_field_path = lookup_field_parts[:-shift] - for idx, lookup_field_part in enumerate(lookup_field_path): - if len(relation_field_parts) > idx: - if relation_field_parts[idx] != lookup_field_part: - raise ValueError( - "FilteredRelation's condition doesn't support " - "relations outside the %r (got %r)." - % (filtered_relation.relation_name, lookup) - ) - if len(lookup_field_parts) > len(relation_field_parts) + 1: - raise ValueError( - "FilteredRelation's condition doesn't support nested " - "relations deeper than the relation_name (got %r for " - "%r)." % (lookup, filtered_relation.relation_name) - ) - filtered_relation.condition = rename_prefix_from_q( - filtered_relation.relation_name, - alias, - filtered_relation.condition, - ) - self._filtered_relations[filtered_relation.alias] = filtered_relation - - def names_to_path(self, names, opts, allow_many=True, fail_on_missing=False): - """ - Walk the list of names and turns them into PathInfo tuples. A single - name in 'names' can generate multiple PathInfos (m2m, for example). - - 'names' is the path of names to travel, 'opts' is the model Options we - start the name resolving from, 'allow_many' is as for setup_joins(). - If fail_on_missing is set to True, then a name that can't be resolved - will generate a FieldError. - - Return a list of PathInfo tuples. In addition return the final field - (the last used join field) and target (which is a field guaranteed to - contain the same value as the final field). Finally, return those names - that weren't found (which are likely transforms and the final lookup). - """ - path, names_with_path = [], [] - for pos, name in enumerate(names): - cur_names_with_path = (name, []) - if name == "pk" and opts is not None: - name = opts.pk.name - - field = None - filtered_relation = None - try: - if opts is None: - raise FieldDoesNotExist - field = opts.get_field(name) - except FieldDoesNotExist: - if name in self.annotation_select: - field = self.annotation_select[name].output_field - elif name in self._filtered_relations and pos == 0: - filtered_relation = self._filtered_relations[name] - if LOOKUP_SEP in filtered_relation.relation_name: - parts = filtered_relation.relation_name.split(LOOKUP_SEP) - filtered_relation_path, field, _, _ = self.names_to_path( - parts, - opts, - allow_many, - fail_on_missing, - ) - path.extend(filtered_relation_path[:-1]) - else: - field = opts.get_field(filtered_relation.relation_name) - if field is not None: - # Fields that contain one-to-many relations with a generic - # model (like a GenericForeignKey) cannot generate reverse - # relations and therefore cannot be used for reverse querying. - if field.is_relation and not field.related_model: - raise FieldError( - "Field %r does not generate an automatic reverse " - "relation and therefore cannot be used for reverse " - "querying. If it is a GenericForeignKey, consider " - "adding a GenericRelation." % name - ) - try: - model = field.model._meta.concrete_model - except AttributeError: - # QuerySet.annotate() may introduce fields that aren't - # attached to a model. - model = None - else: - # We didn't find the current field, so move position back - # one step. - pos -= 1 - if pos == -1 or fail_on_missing: - available = sorted( - [ - *get_field_names_from_opts(opts), - *self.annotation_select, - *self._filtered_relations, - ] - ) - raise FieldError( - "Cannot resolve keyword '%s' into field. " - "Choices are: %s" % (name, ", ".join(available)) - ) - break - # Check if we need any joins for concrete inheritance cases (the - # field lives in parent, but we are currently in one of its - # children) - if opts is not None and model is not opts.model: - path_to_parent = opts.get_path_to_parent(model) - if path_to_parent: - path.extend(path_to_parent) - cur_names_with_path[1].extend(path_to_parent) - opts = path_to_parent[-1].to_opts - if hasattr(field, "path_infos"): - if filtered_relation: - pathinfos = field.get_path_info(filtered_relation) - else: - pathinfos = field.path_infos - if not allow_many: - for inner_pos, p in enumerate(pathinfos): - if p.m2m: - cur_names_with_path[1].extend(pathinfos[0 : inner_pos + 1]) - names_with_path.append(cur_names_with_path) - raise MultiJoin(pos + 1, names_with_path) - last = pathinfos[-1] - path.extend(pathinfos) - final_field = last.join_field - opts = last.to_opts - targets = last.target_fields - cur_names_with_path[1].extend(pathinfos) - names_with_path.append(cur_names_with_path) - else: - # Local non-relational field. - final_field = field - targets = (field,) - if fail_on_missing and pos + 1 != len(names): - raise FieldError( - "Cannot resolve keyword %r into field. Join on '%s'" - " not permitted." % (names[pos + 1], name) - ) - break - return path, final_field, targets, names[pos + 1 :] - - def setup_joins( - self, - names, - opts, - alias, - can_reuse=None, - allow_many=True, - ): - """ - Compute the necessary table joins for the passage through the fields - given in 'names'. 'opts' is the Options class for the current model - (which gives the table we are starting from), 'alias' is the alias for - the table to start the joining from. - - The 'can_reuse' defines the reverse foreign key joins we can reuse. It - can be None in which case all joins are reusable or a set of aliases - that can be reused. Note that non-reverse foreign keys are always - reusable when using setup_joins(). - - If 'allow_many' is False, then any reverse foreign key seen will - generate a MultiJoin exception. - - Return the final field involved in the joins, the target field (used - for any 'where' constraint), the final 'opts' value, the joins, the - field path traveled to generate the joins, and a transform function - that takes a field and alias and is equivalent to `field.get_col(alias)` - in the simple case but wraps field transforms if they were included in - names. - - The target field is the field containing the concrete value. Final - field can be something different, for example foreign key pointing to - that value. Final field is needed for example in some value - conversions (convert 'obj' in fk__id=obj to pk val using the foreign - key field for example). - """ - joins = [alias] - # The transform can't be applied yet, as joins must be trimmed later. - # To avoid making every caller of this method look up transforms - # directly, compute transforms here and create a partial that converts - # fields to the appropriate wrapped version. - - def final_transformer(field, alias): - if not self.alias_cols: - alias = None - return field.get_col(alias) - - # Try resolving all the names as fields first. If there's an error, - # treat trailing names as lookups until a field can be resolved. - last_field_exception = None - for pivot in range(len(names), 0, -1): - try: - path, final_field, targets, rest = self.names_to_path( - names[:pivot], - opts, - allow_many, - fail_on_missing=True, - ) - except FieldError as exc: - if pivot == 1: - # The first item cannot be a lookup, so it's safe - # to raise the field error here. - raise - else: - last_field_exception = exc - else: - # The transforms are the remaining items that couldn't be - # resolved into fields. - transforms = names[pivot:] - break - for name in transforms: - - def transform(field, alias, *, name, previous): - try: - wrapped = previous(field, alias) - return self.try_transform(wrapped, name) - except FieldError: - # FieldError is raised if the transform doesn't exist. - if isinstance(final_field, Field) and last_field_exception: - raise last_field_exception - else: - raise - - final_transformer = functools.partial( - transform, name=name, previous=final_transformer - ) - final_transformer.has_transforms = True - # Then, add the path to the query's joins. Note that we can't trim - # joins at this stage - we will need the information about join type - # of the trimmed joins. - for join in path: - if join.filtered_relation: - filtered_relation = join.filtered_relation.clone() - table_alias = filtered_relation.alias - else: - filtered_relation = None - table_alias = None - opts = join.to_opts - if join.direct: - nullable = self.is_nullable(join.join_field) - else: - nullable = True - connection = self.join_class( - opts.db_table, - alias, - table_alias, - INNER, - join.join_field, - nullable, - filtered_relation=filtered_relation, - ) - reuse = can_reuse if join.m2m else None - alias = self.join(connection, reuse=reuse) - joins.append(alias) - if join.filtered_relation and can_reuse is not None: - can_reuse.add(alias) - return JoinInfo(final_field, targets, opts, joins, path, final_transformer) - - def trim_joins(self, targets, joins, path): - """ - The 'target' parameter is the final field being joined to, 'joins' - is the full list of join aliases. The 'path' contain the PathInfos - used to create the joins. - - Return the final target field and table alias and the new active - joins. - - Always trim any direct join if the target column is already in the - previous table. Can't trim reverse joins as it's unknown if there's - anything on the other side of the join. - """ - joins = joins[:] - for pos, info in enumerate(reversed(path)): - if len(joins) == 1 or not info.direct: - break - if info.filtered_relation: - break - join_targets = {t.column for t in info.join_field.foreign_related_fields} - cur_targets = {t.column for t in targets} - if not cur_targets.issubset(join_targets): - break - targets_dict = { - r[1].column: r[0] - for r in info.join_field.related_fields - if r[1].column in cur_targets - } - targets = tuple(targets_dict[t.column] for t in targets) - self.unref_alias(joins.pop()) - return targets, joins[-1], joins - - @classmethod - def _gen_cols(cls, exprs, include_external=False, resolve_refs=True): - for expr in exprs: - if isinstance(expr, Col): - yield expr - elif include_external and callable( - getattr(expr, "get_external_cols", None) - ): - yield from expr.get_external_cols() - elif hasattr(expr, "get_source_expressions"): - if not resolve_refs and isinstance(expr, Ref): - continue - yield from cls._gen_cols( - expr.get_source_expressions(), - include_external=include_external, - resolve_refs=resolve_refs, - ) - - @classmethod - def _gen_col_aliases(cls, exprs): - yield from (expr.alias for expr in cls._gen_cols(exprs)) - - def resolve_ref(self, name, allow_joins=True, reuse=None, summarize=False): - annotation = self.annotations.get(name) - if annotation is not None: - if not allow_joins: - for alias in self._gen_col_aliases([annotation]): - if isinstance(self.alias_map[alias], Join): - raise FieldError( - "Joined field references are not permitted in this query" - ) - if summarize: - # Summarize currently means we are doing an aggregate() query - # which is executed as a wrapped subquery if any of the - # aggregate() elements reference an existing annotation. In - # that case we need to return a Ref to the subquery's annotation. - if name not in self.annotation_select: - raise FieldError( - "Cannot aggregate over the '%s' alias. Use annotate() " - "to promote it." % name - ) - return Ref(name, self.annotation_select[name]) - else: - return annotation - else: - field_list = name.split(LOOKUP_SEP) - annotation = self.annotations.get(field_list[0]) - if annotation is not None: - for transform in field_list[1:]: - annotation = self.try_transform(annotation, transform) - return annotation - join_info = self.setup_joins( - field_list, self.get_meta(), self.get_initial_alias(), can_reuse=reuse - ) - targets, final_alias, join_list = self.trim_joins( - join_info.targets, join_info.joins, join_info.path - ) - if not allow_joins and len(join_list) > 1: - raise FieldError( - "Joined field references are not permitted in this query" - ) - if len(targets) > 1: - raise FieldError( - "Referencing multicolumn fields with F() objects isn't supported" - ) - # Verify that the last lookup in name is a field or a transform: - # transform_function() raises FieldError if not. - transform = join_info.transform_function(targets[0], final_alias) - if reuse is not None: - reuse.update(join_list) - return transform - - def split_exclude(self, filter_expr, can_reuse, names_with_path): - """ - When doing an exclude against any kind of N-to-many relation, we need - to use a subquery. This method constructs the nested query, given the - original exclude filter (filter_expr) and the portion up to the first - N-to-many relation field. - - For example, if the origin filter is ~Q(child__name='foo'), filter_expr - is ('child__name', 'foo') and can_reuse is a set of joins usable for - filters in the original query. - - We will turn this into equivalent of: - WHERE NOT EXISTS( - SELECT 1 - FROM child - WHERE name = 'foo' AND child.parent_id = parent.id - LIMIT 1 - ) - """ - # Generate the inner query. - query = self.__class__(self.model) - query._filtered_relations = self._filtered_relations - filter_lhs, filter_rhs = filter_expr - if isinstance(filter_rhs, OuterRef): - filter_rhs = OuterRef(filter_rhs) - elif isinstance(filter_rhs, F): - filter_rhs = OuterRef(filter_rhs.name) - query.add_filter(filter_lhs, filter_rhs) - query.clear_ordering(force=True) - # Try to have as simple as possible subquery -> trim leading joins from - # the subquery. - trimmed_prefix, contains_louter = query.trim_start(names_with_path) - - col = query.select[0] - select_field = col.target - alias = col.alias - if alias in can_reuse: - pk = select_field.model._meta.pk - # Need to add a restriction so that outer query's filters are in effect for - # the subquery, too. - query.bump_prefix(self) - lookup_class = select_field.get_lookup("exact") - # Note that the query.select[0].alias is different from alias - # due to bump_prefix above. - lookup = lookup_class(pk.get_col(query.select[0].alias), pk.get_col(alias)) - query.where.add(lookup, AND) - query.external_aliases[alias] = True - else: - lookup_class = select_field.get_lookup("exact") - lookup = lookup_class(col, ResolvedOuterRef(trimmed_prefix)) - query.where.add(lookup, AND) - - condition, needed_inner = self.build_filter(Exists(query)) - - if contains_louter: - or_null_condition, _ = self.build_filter( - ("%s__isnull" % trimmed_prefix, True), - current_negated=True, - branch_negated=True, - can_reuse=can_reuse, - ) - condition.add(or_null_condition, OR) - # Note that the end result will be: - # NOT EXISTS (inner_q) OR outercol IS NULL - # this might look crazy but due to how NULL works, this seems to be - # correct. If the IS NULL check is removed, then if outercol - # IS NULL we will not match the row. - return condition, needed_inner - - def set_empty(self): - self.where.add(NothingNode(), AND) - for query in self.combined_queries: - query.set_empty() - - def is_empty(self): - return any(isinstance(c, NothingNode) for c in self.where.children) - - def set_limits(self, low=None, high=None): - """ - Adjust the limits on the rows retrieved. Use low/high to set these, - as it makes it more Pythonic to read and write. When the SQL query is - created, convert them to the appropriate offset and limit values. - - Apply any limits passed in here to the existing constraints. Add low - to the current low value and clamp both to any existing high value. - """ - if high is not None: - if self.high_mark is not None: - self.high_mark = min(self.high_mark, self.low_mark + high) - else: - self.high_mark = self.low_mark + high - if low is not None: - if self.high_mark is not None: - self.low_mark = min(self.high_mark, self.low_mark + low) - else: - self.low_mark = self.low_mark + low - - if self.low_mark == self.high_mark: - self.set_empty() - - def clear_limits(self): - """Clear any existing limits.""" - self.low_mark, self.high_mark = 0, None - - @property - def is_sliced(self): - return self.low_mark != 0 or self.high_mark is not None - - def has_limit_one(self): - return self.high_mark is not None and (self.high_mark - self.low_mark) == 1 - - def can_filter(self): - """ - Return True if adding filters to this instance is still possible. - - Typically, this means no limits or offsets have been put on the results. - """ - return not self.is_sliced - - def clear_select_clause(self): - """Remove all fields from SELECT clause.""" - self.select = () - self.default_cols = False - self.select_related = False - self.set_extra_mask(()) - self.set_annotation_mask(()) - self.selected = None - - def clear_select_fields(self): - """ - Clear the list of fields to select (but not extra_select columns). - Some queryset types completely replace any existing list of select - columns. - """ - self.select = () - self.values_select = () - self.selected = None - - def add_select_col(self, col, name): - self.select += (col,) - self.values_select += (name,) - self.selected[name] = len(self.select) - 1 - - def set_select(self, cols): - self.default_cols = False - self.select = tuple(cols) - - def add_distinct_fields(self, *field_names): - """ - Add and resolve the given fields to the query's "distinct on" clause. - """ - self.distinct_fields = field_names - self.distinct = True - - def add_fields(self, field_names, allow_m2m=True): - """ - Add the given (model) fields to the select set. Add the field names in - the order specified. - """ - alias = self.get_initial_alias() - opts = self.get_meta() - - try: - cols = [] - for name in field_names: - # Join promotion note - we must not remove any rows here, so - # if there is no existing joins, use outer join. - join_info = self.setup_joins( - name.split(LOOKUP_SEP), opts, alias, allow_many=allow_m2m - ) - targets, final_alias, joins = self.trim_joins( - join_info.targets, - join_info.joins, - join_info.path, - ) - for target in targets: - cols.append(join_info.transform_function(target, final_alias)) - if cols: - self.set_select(cols) - except MultiJoin: - raise FieldError("Invalid field name: '%s'" % name) - except FieldError: - if LOOKUP_SEP in name: - # For lookups spanning over relationships, show the error - # from the model on which the lookup failed. - raise - else: - names = sorted( - [ - *get_field_names_from_opts(opts), - *self.extra, - *self.annotation_select, - *self._filtered_relations, - ] - ) - raise FieldError( - "Cannot resolve keyword %r into field. " - "Choices are: %s" % (name, ", ".join(names)) - ) - - def add_ordering(self, *ordering): - """ - Add items from the 'ordering' sequence to the query's "order by" - clause. These items are either field names (not column names) -- - possibly with a direction prefix ('-' or '?') -- or OrderBy - expressions. - - If 'ordering' is empty, clear all ordering from the query. - """ - errors = [] - for item in ordering: - if isinstance(item, str): - if item == "?": - continue - item = item.removeprefix("-") - if item in self.annotations: - continue - if self.extra and item in self.extra: - continue - # names_to_path() validates the lookup. A descriptive - # FieldError will be raise if it's not. - self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) - elif not hasattr(item, "resolve_expression"): - errors.append(item) - if getattr(item, "contains_aggregate", False): - raise FieldError( - "Using an aggregate in order_by() without also including " - "it in annotate() is not allowed: %s" % item - ) - if errors: - raise FieldError("Invalid order_by arguments: %s" % errors) - if ordering: - self.order_by += ordering - else: - self.default_ordering = False - - def clear_ordering(self, force=False, clear_default=True): - """ - Remove any ordering settings if the current query allows it without - side effects, set 'force' to True to clear the ordering regardless. - If 'clear_default' is True, there will be no ordering in the resulting - query (not even the model's default). - """ - if not force and ( - self.is_sliced or self.distinct_fields or self.select_for_update - ): - return - self.order_by = () - self.extra_order_by = () - if clear_default: - self.default_ordering = False - - def set_group_by(self, allow_aliases=True): - """ - Expand the GROUP BY clause required by the query. - - This will usually be the set of all non-aggregate fields in the - return data. If the database backend supports grouping by the - primary key, and the query would be equivalent, the optimization - will be made automatically. - """ - if allow_aliases and self.values_select: - # If grouping by aliases is allowed assign selected value aliases - # by moving them to annotations. - group_by_annotations = {} - values_select = {} - for alias, expr in zip(self.values_select, self.select): - if isinstance(expr, Col): - values_select[alias] = expr - else: - group_by_annotations[alias] = expr - self.annotations = {**group_by_annotations, **self.annotations} - self.append_annotation_mask(group_by_annotations) - self.select = tuple(values_select.values()) - self.values_select = tuple(values_select) - group_by = list(self.select) - for alias, annotation in self.annotation_select.items(): - if not (group_by_cols := annotation.get_group_by_cols()): - continue - if allow_aliases and not annotation.contains_aggregate: - group_by.append(Ref(alias, annotation)) - else: - group_by.extend(group_by_cols) - self.group_by = tuple(group_by) - - def add_select_related(self, fields): - """ - Set up the select_related data structure so that we only select - certain related models (as opposed to all models, when - self.select_related=True). - """ - if isinstance(self.select_related, bool): - field_dict = {} - else: - field_dict = self.select_related - for field in fields: - d = field_dict - for part in field.split(LOOKUP_SEP): - d = d.setdefault(part, {}) - self.select_related = field_dict - - def add_extra(self, select, select_params, where, params, tables, order_by): - """ - Add data to the various extra_* attributes for user-created additions - to the query. - """ - if select: - # We need to pair any placeholder markers in the 'select' - # dictionary with their parameters in 'select_params' so that - # subsequent updates to the select dictionary also adjust the - # parameters appropriately. - select_pairs = {} - if select_params: - param_iter = iter(select_params) - else: - param_iter = iter([]) - for name, entry in select.items(): - self.check_alias(name) - entry = str(entry) - entry_params = [] - pos = entry.find("%s") - while pos != -1: - if pos == 0 or entry[pos - 1] != "%": - entry_params.append(next(param_iter)) - pos = entry.find("%s", pos + 2) - select_pairs[name] = (entry, entry_params) - self.extra.update(select_pairs) - if where or params: - self.where.add(ExtraWhere(where, params), AND) - if tables: - self.extra_tables += tuple(tables) - if order_by: - self.extra_order_by = order_by - - def clear_deferred_loading(self): - """Remove any fields from the deferred loading set.""" - self.deferred_loading = (frozenset(), True) - - def add_deferred_loading(self, field_names): - """ - Add the given list of model field names to the set of fields to - exclude from loading from the database when automatic column selection - is done. Add the new field names to any existing field names that - are deferred (or removed from any existing field names that are marked - as the only ones for immediate loading). - """ - # Fields on related models are stored in the literal double-underscore - # format, so that we can use a set datastructure. We do the foo__bar - # splitting and handling when computing the SQL column names (as part of - # get_columns()). - existing, defer = self.deferred_loading - if defer: - # Add to existing deferred names. - self.deferred_loading = existing.union(field_names), True - else: - # Remove names from the set of any existing "immediate load" names. - if new_existing := existing.difference(field_names): - self.deferred_loading = new_existing, False - else: - self.clear_deferred_loading() - if new_only := set(field_names).difference(existing): - self.deferred_loading = new_only, True - - def add_immediate_loading(self, field_names): - """ - Add the given list of model field names to the set of fields to - retrieve when the SQL is executed ("immediate loading" fields). The - field names replace any existing immediate loading field names. If - there are field names already specified for deferred loading, remove - those names from the new field_names before storing the new names - for immediate loading. (That is, immediate loading overrides any - existing immediate values, but respects existing deferrals.) - """ - existing, defer = self.deferred_loading - field_names = set(field_names) - if "pk" in field_names: - field_names.remove("pk") - field_names.add(self.get_meta().pk.name) - - if defer: - # Remove any existing deferred names from the current set before - # setting the new names. - self.deferred_loading = field_names.difference(existing), False - else: - # Replace any existing "immediate load" field names. - self.deferred_loading = frozenset(field_names), False - - def set_annotation_mask(self, names): - """Set the mask of annotations that will be returned by the SELECT.""" - if names is None: - self.annotation_select_mask = None - else: - self.annotation_select_mask = set(names) - if self.selected: - # Prune the masked annotations. - self.selected = { - key: value - for key, value in self.selected.items() - if not isinstance(value, str) - or value in self.annotation_select_mask - } - # Append the unmasked annotations. - for name in names: - self.selected[name] = name - self._annotation_select_cache = None - - def append_annotation_mask(self, names): - if self.annotation_select_mask is not None: - self.set_annotation_mask(self.annotation_select_mask.union(names)) - - def set_extra_mask(self, names): - """ - Set the mask of extra select items that will be returned by SELECT. - Don't remove them from the Query since they might be used later. - """ - if names is None: - self.extra_select_mask = None - else: - self.extra_select_mask = set(names) - self._extra_select_cache = None - - @property - def has_select_fields(self): - return self.selected is not None - - def set_values(self, fields): - self.select_related = False - self.clear_deferred_loading() - self.clear_select_fields() - - selected = {} - if fields: - for field in fields: - self.check_alias(field) - field_names = [] - extra_names = [] - annotation_names = [] - if not self.extra and not self.annotations: - # Shortcut - if there are no extra or annotations, then - # the values() clause must be just field names. - field_names = list(fields) - selected = dict(zip(fields, range(len(fields)))) - else: - self.default_cols = False - for f in fields: - if extra := self.extra_select.get(f): - extra_names.append(f) - selected[f] = RawSQL(*extra) - elif f in self.annotation_select: - annotation_names.append(f) - selected[f] = f - elif f in self.annotations: - raise FieldError( - f"Cannot select the '{f}' alias. Use annotate() to " - "promote it." - ) - else: - # Call `names_to_path` to ensure a FieldError including - # annotations about to be masked as valid choices if - # `f` is not resolvable. - if self.annotation_select: - self.names_to_path(f.split(LOOKUP_SEP), self.model._meta) - selected[f] = len(field_names) - field_names.append(f) - self.set_extra_mask(extra_names) - self.set_annotation_mask(annotation_names) - else: - field_names = [f.attname for f in self.model._meta.concrete_fields] - selected = dict.fromkeys(field_names, None) - # Selected annotations must be known before setting the GROUP BY - # clause. - if self.group_by is True: - self.add_fields( - (f.attname for f in self.model._meta.concrete_fields), False - ) - # Disable GROUP BY aliases to avoid orphaning references to the - # SELECT clause which is about to be cleared. - self.set_group_by(allow_aliases=False) - self.clear_select_fields() - elif self.group_by: - # Resolve GROUP BY annotation references if they are not part of - # the selected fields anymore. - group_by = [] - for expr in self.group_by: - if isinstance(expr, Ref) and expr.refs not in selected: - expr = self.annotations[expr.refs] - group_by.append(expr) - self.group_by = tuple(group_by) - - self.values_select = tuple(field_names) - self.add_fields(field_names, True) - self.selected = selected if fields else None - - @property - def annotation_select(self): - """ - Return the dictionary of aggregate columns that are not masked and - should be used in the SELECT clause. Cache this result for performance. - """ - if self._annotation_select_cache is not None: - return self._annotation_select_cache - elif not self.annotations: - return {} - elif self.annotation_select_mask is not None: - self._annotation_select_cache = { - k: v - for k, v in self.annotations.items() - if k in self.annotation_select_mask - } - return self._annotation_select_cache - else: - return self.annotations - - @property - def extra_select(self): - if self._extra_select_cache is not None: - return self._extra_select_cache - if not self.extra: - return {} - elif self.extra_select_mask is not None: - self._extra_select_cache = { - k: v for k, v in self.extra.items() if k in self.extra_select_mask - } - return self._extra_select_cache - else: - return self.extra - - def trim_start(self, names_with_path): - """ - Trim joins from the start of the join path. The candidates for trim - are the PathInfos in names_with_path structure that are m2m joins. - - Also set the select column so the start matches the join. - - This method is meant to be used for generating the subquery joins & - cols in split_exclude(). - - Return a lookup usable for doing outerq.filter(lookup=self) and a - boolean indicating if the joins in the prefix contain a LEFT OUTER join. - _""" - all_paths = [] - for _, paths in names_with_path: - all_paths.extend(paths) - contains_louter = False - # Trim and operate only on tables that were generated for - # the lookup part of the query. That is, avoid trimming - # joins generated for F() expressions. - lookup_tables = [ - t for t in self.alias_map if t in self._lookup_joins or t == self.base_table - ] - for trimmed_paths, path in enumerate(all_paths): - if path.m2m: - break - if self.alias_map[lookup_tables[trimmed_paths + 1]].join_type == LOUTER: - contains_louter = True - alias = lookup_tables[trimmed_paths] - self.unref_alias(alias) - # The path.join_field is a Rel, lets get the other side's field - join_field = path.join_field.field - # Build the filter prefix. - paths_in_prefix = trimmed_paths - trimmed_prefix = [] - for name, path in names_with_path: - if paths_in_prefix - len(path) < 0: - break - trimmed_prefix.append(name) - paths_in_prefix -= len(path) - trimmed_prefix.append(join_field.foreign_related_fields[0].name) - trimmed_prefix = LOOKUP_SEP.join(trimmed_prefix) - # Lets still see if we can trim the first join from the inner query - # (that is, self). We can't do this for: - # - LEFT JOINs because we would miss those rows that have nothing on - # the outer side, - # - INNER JOINs from filtered relations because we would miss their - # filters. - first_join = self.alias_map[lookup_tables[trimmed_paths + 1]] - if first_join.join_type != LOUTER and not first_join.filtered_relation: - select_fields = [r[0] for r in join_field.related_fields] - select_alias = lookup_tables[trimmed_paths + 1] - self.unref_alias(lookup_tables[trimmed_paths]) - extra_restriction = join_field.get_extra_restriction( - None, lookup_tables[trimmed_paths + 1] - ) - if extra_restriction: - self.where.add(extra_restriction, AND) - else: - # TODO: It might be possible to trim more joins from the start of the - # inner query if it happens to have a longer join chain containing the - # values in select_fields. Lets punt this one for now. - select_fields = [r[1] for r in join_field.related_fields] - select_alias = lookup_tables[trimmed_paths] - # The found starting point is likely a join_class instead of a - # base_table_class reference. But the first entry in the query's FROM - # clause must not be a JOIN. - for table in self.alias_map: - if self.alias_refcount[table] > 0: - self.alias_map[table] = self.base_table_class( - self.alias_map[table].table_name, - table, - ) - break - self.set_select([f.get_col(select_alias) for f in select_fields]) - return trimmed_prefix, contains_louter - - def is_nullable(self, field): - """ - Check if the given field should be treated as nullable. - - Some backends treat '' as null and Django treats such fields as - nullable for those backends. In such situations field.null can be - False even if we should treat the field as nullable. - """ - # We need to use DEFAULT_DB_ALIAS here, as QuerySet does not have - # (nor should it have) knowledge of which connection is going to be - # used. The proper fix would be to defer all decisions where - # is_nullable() is needed to the compiler stage, but that is not easy - # to do currently. - return field.null or ( - field.empty_strings_allowed - and connections[DEFAULT_DB_ALIAS].features.interprets_empty_strings_as_nulls - ) - - -def get_order_dir(field, default="ASC"): - """ - Return the field name and direction for an order specification. For - example, '-foo' is returned as ('foo', 'DESC'). - - The 'default' param is used to indicate which way no prefix (or a '+' - prefix) should sort. The '-' prefix always sorts the opposite way. - """ - dirn = ORDER_DIR[default] - if field[0] == "-": - return field[1:], dirn[1] - return field, dirn[0] - - -class JoinPromoter: - """ - A class to abstract away join promotion problems for complex filter - conditions. - """ - - def __init__(self, connector, num_children, negated): - self.connector = connector - self.negated = negated - if self.negated: - if connector == AND: - self.effective_connector = OR - else: - self.effective_connector = AND - else: - self.effective_connector = self.connector - self.num_children = num_children - # Maps of table alias to how many times it is seen as required for - # inner and/or outer joins. - self.votes = Counter() - - def __repr__(self): - return ( - f"{self.__class__.__qualname__}(connector={self.connector!r}, " - f"num_children={self.num_children!r}, negated={self.negated!r})" - ) - - def add_votes(self, votes): - """ - Add single vote per item to self.votes. Parameter can be any - iterable. - """ - self.votes.update(votes) - - def update_join_types(self, query): - """ - Change join types so that the generated query is as efficient as - possible, but still correct. So, change as many joins as possible - to INNER, but don't make OUTER joins INNER if that could remove - results from the query. - """ - to_promote = set() - to_demote = set() - # The effective_connector is used so that NOT (a AND b) is treated - # similarly to (a OR b) for join promotion. - for table, votes in self.votes.items(): - # We must use outer joins in OR case when the join isn't contained - # in all of the joins. Otherwise the INNER JOIN itself could remove - # valid results. Consider the case where a model with rel_a and - # rel_b relations is queried with rel_a__col=1 | rel_b__col=2. Now, - # if rel_a join doesn't produce any results is null (for example - # reverse foreign key or null value in direct foreign key), and - # there is a matching row in rel_b with col=2, then an INNER join - # to rel_a would remove a valid match from the query. So, we need - # to promote any existing INNER to LOUTER (it is possible this - # promotion in turn will be demoted later on). - if self.effective_connector == OR and votes < self.num_children: - to_promote.add(table) - # If connector is AND and there is a filter that can match only - # when there is a joinable row, then use INNER. For example, in - # rel_a__col=1 & rel_b__col=2, if either of the rels produce NULL - # as join output, then the col=1 or col=2 can't match (as - # NULL=anything is always false). - # For the OR case, if all children voted for a join to be inner, - # then we can use INNER for the join. For example: - # (rel_a__col__icontains=Alex | rel_a__col__icontains=Russell) - # then if rel_a doesn't produce any rows, the whole condition - # can't match. Hence we can safely use INNER join. - if self.effective_connector == AND or ( - self.effective_connector == OR and votes == self.num_children - ): - to_demote.add(table) - # Finally, what happens in cases where we have: - # (rel_a__col=1|rel_b__col=2) & rel_a__col__gte=0 - # Now, we first generate the OR clause, and promote joins for it - # in the first if branch above. Both rel_a and rel_b are promoted - # to LOUTER joins. After that we do the AND case. The OR case - # voted no inner joins but the rel_a__col__gte=0 votes inner join - # for rel_a. We demote it back to INNER join (in AND case a single - # vote is enough). The demotion is OK, if rel_a doesn't produce - # rows, then the rel_a__col__gte=0 clause can't be true, and thus - # the whole clause must be false. So, it is safe to use INNER - # join. - # Note that in this example we could just as well have the __gte - # clause and the OR clause swapped. Or we could replace the __gte - # clause with an OR clause containing rel_a__col=1|rel_a__col=2, - # and again we could safely demote to INNER. - query.promote_joins(to_promote) - query.demote_joins(to_demote) - return to_demote diff --git a/.venv/lib/python3.10/site-packages/django/db/models/sql/subqueries.py b/.venv/lib/python3.10/site-packages/django/db/models/sql/subqueries.py deleted file mode 100644 index 9cb971b..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/sql/subqueries.py +++ /dev/null @@ -1,178 +0,0 @@ -""" -Query subclasses which provide extra functionality beyond simple data retrieval. -""" - -from django.core.exceptions import FieldError -from django.db.models.sql.constants import ( - GET_ITERATOR_CHUNK_SIZE, - NO_RESULTS, - ROW_COUNT, -) -from django.db.models.sql.query import Query - -__all__ = ["DeleteQuery", "UpdateQuery", "InsertQuery", "AggregateQuery"] - - -class DeleteQuery(Query): - """A DELETE SQL query.""" - - compiler = "SQLDeleteCompiler" - - def do_query(self, table, where, using): - self.alias_map = {table: self.alias_map[table]} - self.where = where - return self.get_compiler(using).execute_sql(ROW_COUNT) - - def delete_batch(self, pk_list, using): - """ - Set up and execute delete queries for all the objects in pk_list. - - More than one physical query may be executed if there are a - lot of values in pk_list. - """ - # number of objects deleted - num_deleted = 0 - field = self.get_meta().pk - for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): - self.clear_where() - self.add_filter( - f"{field.attname}__in", - pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE], - ) - num_deleted += self.do_query( - self.get_meta().db_table, self.where, using=using - ) - return num_deleted - - -class UpdateQuery(Query): - """An UPDATE SQL query.""" - - compiler = "SQLUpdateCompiler" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._setup_query() - - def _setup_query(self): - """ - Run on initialization and at the end of chaining. Any attributes that - would normally be set in __init__() should go here instead. - """ - self.values = [] - self.related_ids = None - self.related_updates = {} - - def clone(self): - obj = super().clone() - obj.related_updates = self.related_updates.copy() - return obj - - def update_batch(self, pk_list, values, using): - self.add_update_values(values) - for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): - self.clear_where() - self.add_filter( - "pk__in", pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE] - ) - self.get_compiler(using).execute_sql(NO_RESULTS) - - def add_update_values(self, values): - """ - Convert a dictionary of field name to value mappings into an update - query. This is the entry point for the public update() method on - querysets. - """ - values_seq = [] - for name, val in values.items(): - field = self.get_meta().get_field(name) - direct = ( - not (field.auto_created and not field.concrete) or not field.concrete - ) - model = field.model._meta.concrete_model - if field.name == "pk" and model._meta.is_composite_pk: - raise FieldError( - "Composite primary key fields must be updated individually." - ) - if not direct or (field.is_relation and field.many_to_many): - raise FieldError( - "Cannot update model field %r (only non-relations and " - "foreign keys permitted)." % field - ) - if model is not self.get_meta().concrete_model: - self.add_related_update(model, field, val) - continue - values_seq.append((field, model, val)) - return self.add_update_fields(values_seq) - - def add_update_fields(self, values_seq): - """ - Append a sequence of (field, model, value) triples to the internal list - that will be used to generate the UPDATE query. Might be more usefully - called add_update_targets() to hint at the extra information here. - """ - for field, model, val in values_seq: - # Omit generated fields. - if field.generated: - continue - if hasattr(val, "resolve_expression"): - # Resolve expressions here so that annotations are no longer needed - val = val.resolve_expression(self, allow_joins=False, for_save=True) - self.values.append((field, model, val)) - - def add_related_update(self, model, field, value): - """ - Add (name, value) to an update query for an ancestor model. - - Update are coalesced so that only one update query per ancestor is run. - """ - self.related_updates.setdefault(model, []).append((field, None, value)) - - def get_related_updates(self): - """ - Return a list of query objects: one for each update required to an - ancestor model. Each query will have the same filtering conditions as - the current query but will only update a single table. - """ - if not self.related_updates: - return [] - result = [] - for model, values in self.related_updates.items(): - query = UpdateQuery(model) - query.values = values - if self.related_ids is not None: - query.add_filter("pk__in", self.related_ids[model]) - result.append(query) - return result - - -class InsertQuery(Query): - compiler = "SQLInsertCompiler" - - def __init__( - self, *args, on_conflict=None, update_fields=None, unique_fields=None, **kwargs - ): - super().__init__(*args, **kwargs) - self.fields = [] - self.objs = [] - self.on_conflict = on_conflict - self.update_fields = update_fields or [] - self.unique_fields = unique_fields or [] - - def insert_values(self, fields, objs, raw=False): - self.fields = fields - self.objs = objs - self.raw = raw - - -class AggregateQuery(Query): - """ - Take another query as a parameter to the FROM clause and only select the - elements in the provided list. - """ - - compiler = "SQLAggregateCompiler" - - def __init__(self, model, inner_query): - self.inner_query = inner_query - super().__init__(model) diff --git a/.venv/lib/python3.10/site-packages/django/db/models/sql/where.py b/.venv/lib/python3.10/site-packages/django/db/models/sql/where.py deleted file mode 100644 index 82f96aa..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/sql/where.py +++ /dev/null @@ -1,345 +0,0 @@ -""" -Code to manage the creation and SQL rendering of 'where' constraints. -""" - -import operator -from functools import reduce - -from django.core.exceptions import EmptyResultSet, FullResultSet -from django.db.models.expressions import Case, When -from django.db.models.functions import Mod -from django.db.models.lookups import Exact -from django.utils import tree -from django.utils.functional import cached_property - -# Connection types -AND = "AND" -OR = "OR" -XOR = "XOR" - - -class WhereNode(tree.Node): - """ - An SQL WHERE clause. - - The class is tied to the Query class that created it (in order to create - the correct SQL). - - A child is usually an expression producing boolean values. Most likely the - expression is a Lookup instance. - - However, a child could also be any class with as_sql() and either - relabeled_clone() method or relabel_aliases() and clone() methods and - contains_aggregate attribute. - """ - - default = AND - resolved = False - conditional = True - - def split_having_qualify(self, negated=False, must_group_by=False): - """ - Return three possibly None nodes: one for those parts of self that - should be included in the WHERE clause, one for those parts of self - that must be included in the HAVING clause, and one for those parts - that refer to window functions. - """ - if not self.contains_aggregate and not self.contains_over_clause: - return self, None, None - in_negated = negated ^ self.negated - # Whether or not children must be connected in the same filtering - # clause (WHERE > HAVING > QUALIFY) to maintain logical semantic. - must_remain_connected = ( - (in_negated and self.connector == AND) - or (not in_negated and self.connector == OR) - or self.connector == XOR - ) - if ( - must_remain_connected - and self.contains_aggregate - and not self.contains_over_clause - ): - # It's must cheaper to short-circuit and stash everything in the - # HAVING clause than split children if possible. - return None, self, None - where_parts = [] - having_parts = [] - qualify_parts = [] - for c in self.children: - if hasattr(c, "split_having_qualify"): - where_part, having_part, qualify_part = c.split_having_qualify( - in_negated, must_group_by - ) - if where_part is not None: - where_parts.append(where_part) - if having_part is not None: - having_parts.append(having_part) - if qualify_part is not None: - qualify_parts.append(qualify_part) - elif c.contains_over_clause: - qualify_parts.append(c) - elif c.contains_aggregate: - having_parts.append(c) - else: - where_parts.append(c) - if must_remain_connected and qualify_parts: - # Disjunctive heterogeneous predicates can be pushed down to - # qualify as long as no conditional aggregation is involved. - if not where_parts or (where_parts and not must_group_by): - return None, None, self - elif where_parts: - # In theory this should only be enforced when dealing with - # where_parts containing predicates against multi-valued - # relationships that could affect aggregation results but this - # is complex to infer properly. - raise NotImplementedError( - "Heterogeneous disjunctive predicates against window functions are " - "not implemented when performing conditional aggregation." - ) - where_node = ( - self.create(where_parts, self.connector, self.negated) - if where_parts - else None - ) - having_node = ( - self.create(having_parts, self.connector, self.negated) - if having_parts - else None - ) - qualify_node = ( - self.create(qualify_parts, self.connector, self.negated) - if qualify_parts - else None - ) - return where_node, having_node, qualify_node - - def as_sql(self, compiler, connection): - """ - Return the SQL version of the where clause and the value to be - substituted in. Return '', [] if this node matches everything, - None, [] if this node is empty, and raise EmptyResultSet if this - node can't match anything. - """ - result = [] - result_params = [] - if self.connector == AND: - full_needed, empty_needed = len(self.children), 1 - else: - full_needed, empty_needed = 1, len(self.children) - - if self.connector == XOR and not connection.features.supports_logical_xor: - # Convert if the database doesn't support XOR: - # a XOR b XOR c XOR ... - # to: - # (a OR b OR c OR ...) AND MOD(a + b + c + ..., 2) == 1 - # The result of an n-ary XOR is true when an odd number of operands - # are true. - lhs = self.__class__(self.children, OR) - rhs_sum = reduce( - operator.add, - (Case(When(c, then=1), default=0) for c in self.children), - ) - if len(self.children) > 2: - rhs_sum = Mod(rhs_sum, 2) - rhs = Exact(1, rhs_sum) - return self.__class__([lhs, rhs], AND, self.negated).as_sql( - compiler, connection - ) - - for child in self.children: - try: - sql, params = compiler.compile(child) - except EmptyResultSet: - empty_needed -= 1 - except FullResultSet: - full_needed -= 1 - else: - if sql: - result.append(sql) - result_params.extend(params) - else: - full_needed -= 1 - # Check if this node matches nothing or everything. - # First check the amount of full nodes and empty nodes - # to make this node empty/full. - # Now, check if this node is full/empty using the - # counts. - if empty_needed == 0: - if self.negated: - raise FullResultSet - else: - raise EmptyResultSet - if full_needed == 0: - if self.negated: - raise EmptyResultSet - else: - raise FullResultSet - conn = " %s " % self.connector - sql_string = conn.join(result) - if not sql_string: - raise FullResultSet - if self.negated: - # Some backends (Oracle at least) need parentheses around the inner - # SQL in the negated case, even if the inner SQL contains just a - # single expression. - sql_string = "NOT (%s)" % sql_string - elif len(result) > 1 or self.resolved: - sql_string = "(%s)" % sql_string - return sql_string, result_params - - def get_group_by_cols(self): - cols = [] - for child in self.children: - cols.extend(child.get_group_by_cols()) - return cols - - def get_source_expressions(self): - return self.children[:] - - def set_source_expressions(self, children): - assert len(children) == len(self.children) - self.children = children - - def relabel_aliases(self, change_map): - """ - Relabel the alias values of any children. 'change_map' is a dictionary - mapping old (current) alias values to the new values. - """ - if not change_map: - return self - for pos, child in enumerate(self.children): - if hasattr(child, "relabel_aliases"): - # For example another WhereNode - child.relabel_aliases(change_map) - elif hasattr(child, "relabeled_clone"): - self.children[pos] = child.relabeled_clone(change_map) - - def clone(self): - clone = self.create(connector=self.connector, negated=self.negated) - for child in self.children: - if hasattr(child, "clone"): - child = child.clone() - clone.children.append(child) - return clone - - def relabeled_clone(self, change_map): - clone = self.clone() - clone.relabel_aliases(change_map) - return clone - - def replace_expressions(self, replacements): - if not replacements: - return self - if replacement := replacements.get(self): - return replacement - clone = self.create(connector=self.connector, negated=self.negated) - for child in self.children: - clone.children.append(child.replace_expressions(replacements)) - return clone - - def get_refs(self): - refs = set() - for child in self.children: - refs |= child.get_refs() - return refs - - @classmethod - def _contains_aggregate(cls, obj): - if isinstance(obj, tree.Node): - return any(cls._contains_aggregate(c) for c in obj.children) - return obj.contains_aggregate - - @cached_property - def contains_aggregate(self): - return self._contains_aggregate(self) - - @classmethod - def _contains_over_clause(cls, obj): - if isinstance(obj, tree.Node): - return any(cls._contains_over_clause(c) for c in obj.children) - return obj.contains_over_clause - - @cached_property - def contains_over_clause(self): - return self._contains_over_clause(self) - - @property - def is_summary(self): - return any(child.is_summary for child in self.children) - - @staticmethod - def _resolve_leaf(expr, query, *args, **kwargs): - if hasattr(expr, "resolve_expression"): - expr = expr.resolve_expression(query, *args, **kwargs) - return expr - - @classmethod - def _resolve_node(cls, node, query, *args, **kwargs): - if hasattr(node, "children"): - for child in node.children: - cls._resolve_node(child, query, *args, **kwargs) - if hasattr(node, "lhs"): - node.lhs = cls._resolve_leaf(node.lhs, query, *args, **kwargs) - if hasattr(node, "rhs"): - node.rhs = cls._resolve_leaf(node.rhs, query, *args, **kwargs) - - def resolve_expression(self, *args, **kwargs): - clone = self.clone() - clone._resolve_node(clone, *args, **kwargs) - clone.resolved = True - return clone - - @cached_property - def output_field(self): - from django.db.models import BooleanField - - return BooleanField() - - @property - def _output_field_or_none(self): - return self.output_field - - def select_format(self, compiler, sql, params): - # Wrap filters with a CASE WHEN expression if a database backend - # (e.g. Oracle) doesn't support boolean expression in SELECT or GROUP - # BY list. - if not compiler.connection.features.supports_boolean_expr_in_select_clause: - sql = f"CASE WHEN {sql} THEN 1 ELSE 0 END" - return sql, params - - def get_db_converters(self, connection): - return self.output_field.get_db_converters(connection) - - def get_lookup(self, lookup): - return self.output_field.get_lookup(lookup) - - def leaves(self): - for child in self.children: - if isinstance(child, WhereNode): - yield from child.leaves() - else: - yield child - - -class NothingNode: - """A node that matches nothing.""" - - contains_aggregate = False - contains_over_clause = False - - def as_sql(self, compiler=None, connection=None): - raise EmptyResultSet - - -class ExtraWhere: - # The contents are a black box - assume no aggregates or windows are used. - contains_aggregate = False - contains_over_clause = False - - def __init__(self, sqls, params): - self.sqls = sqls - self.params = params - - def as_sql(self, compiler=None, connection=None): - sqls = ["(%s)" % sql for sql in self.sqls] - return " AND ".join(sqls), list(self.params or ()) diff --git a/.venv/lib/python3.10/site-packages/django/db/models/utils.py b/.venv/lib/python3.10/site-packages/django/db/models/utils.py deleted file mode 100644 index c6cb5ef..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/models/utils.py +++ /dev/null @@ -1,69 +0,0 @@ -import functools -from collections import namedtuple - - -def make_model_tuple(model): - """ - Take a model or a string of the form "app_label.ModelName" and return a - corresponding ("app_label", "modelname") tuple. If a tuple is passed in, - assume it's a valid model tuple already and return it unchanged. - """ - try: - if isinstance(model, tuple): - model_tuple = model - elif isinstance(model, str): - app_label, model_name = model.split(".") - model_tuple = app_label, model_name.lower() - else: - model_tuple = model._meta.app_label, model._meta.model_name - assert len(model_tuple) == 2 - return model_tuple - except (ValueError, AssertionError): - raise ValueError( - "Invalid model reference '%s'. String model references " - "must be of the form 'app_label.ModelName'." % model - ) - - -def resolve_callables(mapping): - """ - Generate key/value pairs for the given mapping where the values are - evaluated if they're callable. - """ - for k, v in mapping.items(): - yield k, v() if callable(v) else v - - -def unpickle_named_row(names, values): - return create_namedtuple_class(*names)(*values) - - -@functools.lru_cache -def create_namedtuple_class(*names): - # Cache type() with @lru_cache since it's too slow to be called for every - # QuerySet evaluation. - def __reduce__(self): - return unpickle_named_row, (names, tuple(self)) - - return type( - "Row", - (namedtuple("Row", names),), - {"__reduce__": __reduce__, "__slots__": ()}, - ) - - -class AltersData: - """ - Make subclasses preserve the alters_data attribute on overridden methods. - """ - - def __init_subclass__(cls, **kwargs): - for fn_name, fn in vars(cls).items(): - if callable(fn) and not hasattr(fn, "alters_data"): - for base in cls.__bases__: - if base_fn := getattr(base, fn_name, None): - if hasattr(base_fn, "alters_data"): - fn.alters_data = base_fn.alters_data - break - - super().__init_subclass__(**kwargs) diff --git a/.venv/lib/python3.10/site-packages/django/db/transaction.py b/.venv/lib/python3.10/site-packages/django/db/transaction.py deleted file mode 100644 index 0c2eee8..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/transaction.py +++ /dev/null @@ -1,340 +0,0 @@ -from contextlib import ContextDecorator, contextmanager - -from django.db import ( - DEFAULT_DB_ALIAS, - DatabaseError, - Error, - ProgrammingError, - connections, -) - - -class TransactionManagementError(ProgrammingError): - """Transaction management is used improperly.""" - - pass - - -def get_connection(using=None): - """ - Get a database connection by name, or the default database connection - if no name is provided. This is a private API. - """ - if using is None: - using = DEFAULT_DB_ALIAS - return connections[using] - - -def get_autocommit(using=None): - """Get the autocommit status of the connection.""" - return get_connection(using).get_autocommit() - - -def set_autocommit(autocommit, using=None): - """Set the autocommit status of the connection.""" - return get_connection(using).set_autocommit(autocommit) - - -def commit(using=None): - """Commit a transaction.""" - get_connection(using).commit() - - -def rollback(using=None): - """Roll back a transaction.""" - get_connection(using).rollback() - - -def savepoint(using=None): - """ - Create a savepoint (if supported and required by the backend) inside the - current transaction. Return an identifier for the savepoint that will be - used for the subsequent rollback or commit. - """ - return get_connection(using).savepoint() - - -def savepoint_rollback(sid, using=None): - """ - Roll back the most recent savepoint (if one exists). Do nothing if - savepoints are not supported. - """ - get_connection(using).savepoint_rollback(sid) - - -def savepoint_commit(sid, using=None): - """ - Commit the most recent savepoint (if one exists). Do nothing if - savepoints are not supported. - """ - get_connection(using).savepoint_commit(sid) - - -def clean_savepoints(using=None): - """ - Reset the counter used to generate unique savepoint ids in this thread. - """ - get_connection(using).clean_savepoints() - - -def get_rollback(using=None): - """Get the "needs rollback" flag -- for *advanced use* only.""" - return get_connection(using).get_rollback() - - -def set_rollback(rollback, using=None): - """ - Set or unset the "needs rollback" flag -- for *advanced use* only. - - When `rollback` is `True`, trigger a rollback when exiting the innermost - enclosing atomic block that has `savepoint=True` (that's the default). Use - this to force a rollback without raising an exception. - - When `rollback` is `False`, prevent such a rollback. Use this only after - rolling back to a known-good state! Otherwise, you break the atomic block - and data corruption may occur. - """ - return get_connection(using).set_rollback(rollback) - - -@contextmanager -def mark_for_rollback_on_error(using=None): - """ - Internal low-level utility to mark a transaction as "needs rollback" when - an exception is raised while not enforcing the enclosed block to be in a - transaction. This is needed by Model.save() and friends to avoid starting a - transaction when in autocommit mode and a single query is executed. - - It's equivalent to: - - connection = get_connection(using) - if connection.get_autocommit(): - yield - else: - with transaction.atomic(using=using, savepoint=False): - yield - - but it uses low-level utilities to avoid performance overhead. - """ - try: - yield - except Exception as exc: - connection = get_connection(using) - if connection.in_atomic_block: - connection.needs_rollback = True - connection.rollback_exc = exc - raise - - -def on_commit(func, using=None, robust=False): - """ - Register `func` to be called when the current transaction is committed. - If the current transaction is rolled back, `func` will not be called. - """ - get_connection(using).on_commit(func, robust) - - -################################# -# Decorators / context managers # -################################# - - -class Atomic(ContextDecorator): - """ - Guarantee the atomic execution of a given block. - - An instance can be used either as a decorator or as a context manager. - - When it's used as a decorator, __call__ wraps the execution of the - decorated function in the instance itself, used as a context manager. - - When it's used as a context manager, __enter__ creates a transaction or a - savepoint, depending on whether a transaction is already in progress, and - __exit__ commits the transaction or releases the savepoint on normal exit, - and rolls back the transaction or to the savepoint on exceptions. - - It's possible to disable the creation of savepoints if the goal is to - ensure that some code runs within a transaction without creating overhead. - - A stack of savepoint identifiers is maintained as an attribute of the - connection. None denotes the absence of a savepoint. - - This allows reentrancy even if the same AtomicWrapper is reused. For - example, it's possible to define `oa = atomic('other')` and use `@oa` or - `with oa:` multiple times. - - Since database connections are thread-local, this is thread-safe. - - An atomic block can be tagged as durable. In this case, a RuntimeError is - raised if it's nested within another atomic block. This guarantees - that database changes in a durable block are committed to the database when - the block exits without error. - - This is a private API. - """ - - def __init__(self, using, savepoint, durable): - self.using = using - self.savepoint = savepoint - self.durable = durable - self._from_testcase = False - - def __enter__(self): - connection = get_connection(self.using) - - if ( - self.durable - and connection.atomic_blocks - and not connection.atomic_blocks[-1]._from_testcase - ): - raise RuntimeError( - "A durable atomic block cannot be nested within another " - "atomic block." - ) - if not connection.in_atomic_block: - # Reset state when entering an outermost atomic block. - connection.commit_on_exit = True - connection.needs_rollback = False - if not connection.get_autocommit(): - # Pretend we're already in an atomic block to bypass the code - # that disables autocommit to enter a transaction, and make a - # note to deal with this case in __exit__. - connection.in_atomic_block = True - connection.commit_on_exit = False - - if connection.in_atomic_block: - # We're already in a transaction; create a savepoint, unless we - # were told not to or we're already waiting for a rollback. The - # second condition avoids creating useless savepoints and prevents - # overwriting needs_rollback until the rollback is performed. - if self.savepoint and not connection.needs_rollback: - sid = connection.savepoint() - connection.savepoint_ids.append(sid) - else: - connection.savepoint_ids.append(None) - else: - connection.set_autocommit( - False, force_begin_transaction_with_broken_autocommit=True - ) - connection.in_atomic_block = True - - if connection.in_atomic_block: - connection.atomic_blocks.append(self) - - def __exit__(self, exc_type, exc_value, traceback): - connection = get_connection(self.using) - - if connection.in_atomic_block: - connection.atomic_blocks.pop() - - if connection.savepoint_ids: - sid = connection.savepoint_ids.pop() - else: - # Prematurely unset this flag to allow using commit or rollback. - connection.in_atomic_block = False - - try: - if connection.closed_in_transaction: - # The database will perform a rollback by itself. - # Wait until we exit the outermost block. - pass - - elif exc_type is None and not connection.needs_rollback: - if connection.in_atomic_block: - # Release savepoint if there is one - if sid is not None: - try: - connection.savepoint_commit(sid) - except DatabaseError: - try: - connection.savepoint_rollback(sid) - # The savepoint won't be reused. Release it to - # minimize overhead for the database server. - connection.savepoint_commit(sid) - except Error: - # If rolling back to a savepoint fails, mark for - # rollback at a higher level and avoid shadowing - # the original exception. - connection.needs_rollback = True - raise - else: - # Commit transaction - try: - connection.commit() - except DatabaseError: - try: - connection.rollback() - except Error: - # An error during rollback means that something - # went wrong with the connection. Drop it. - connection.close() - raise - else: - # This flag will be set to True again if there isn't a savepoint - # allowing to perform the rollback at this level. - connection.needs_rollback = False - if connection.in_atomic_block: - # Roll back to savepoint if there is one, mark for rollback - # otherwise. - if sid is None: - connection.needs_rollback = True - else: - try: - connection.savepoint_rollback(sid) - # The savepoint won't be reused. Release it to - # minimize overhead for the database server. - connection.savepoint_commit(sid) - except Error: - # If rolling back to a savepoint fails, mark for - # rollback at a higher level and avoid shadowing - # the original exception. - connection.needs_rollback = True - else: - # Roll back transaction - try: - connection.rollback() - except Error: - # An error during rollback means that something - # went wrong with the connection. Drop it. - connection.close() - - finally: - # Outermost block exit when autocommit was enabled. - if not connection.in_atomic_block: - if connection.closed_in_transaction: - connection.connection = None - else: - connection.set_autocommit(True) - # Outermost block exit when autocommit was disabled. - elif not connection.savepoint_ids and not connection.commit_on_exit: - if connection.closed_in_transaction: - connection.connection = None - else: - connection.in_atomic_block = False - - -def atomic(using=None, savepoint=True, durable=False): - # Bare decorator: @atomic -- although the first argument is called - # `using`, it's actually the function being decorated. - if callable(using): - return Atomic(DEFAULT_DB_ALIAS, savepoint, durable)(using) - # Decorator: @atomic(...) or context manager: with atomic(...): ... - else: - return Atomic(using, savepoint, durable) - - -def _non_atomic_requests(view, using): - try: - view._non_atomic_requests.add(using) - except AttributeError: - view._non_atomic_requests = {using} - return view - - -def non_atomic_requests(using=None): - if callable(using): - return _non_atomic_requests(using, DEFAULT_DB_ALIAS) - else: - if using is None: - using = DEFAULT_DB_ALIAS - return lambda view: _non_atomic_requests(view, using) diff --git a/.venv/lib/python3.10/site-packages/django/db/utils.py b/.venv/lib/python3.10/site-packages/django/db/utils.py deleted file mode 100644 index e45f1db..0000000 --- a/.venv/lib/python3.10/site-packages/django/db/utils.py +++ /dev/null @@ -1,278 +0,0 @@ -import pkgutil -from importlib import import_module - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured - -# For backwards compatibility with Django < 3.2 -from django.utils.connection import ConnectionDoesNotExist # NOQA: F401 -from django.utils.connection import BaseConnectionHandler -from django.utils.functional import cached_property -from django.utils.module_loading import import_string - -DEFAULT_DB_ALIAS = "default" -DJANGO_VERSION_PICKLE_KEY = "_django_version" - - -class Error(Exception): - pass - - -class InterfaceError(Error): - pass - - -class DatabaseError(Error): - pass - - -class DataError(DatabaseError): - pass - - -class OperationalError(DatabaseError): - pass - - -class IntegrityError(DatabaseError): - pass - - -class InternalError(DatabaseError): - pass - - -class ProgrammingError(DatabaseError): - pass - - -class NotSupportedError(DatabaseError): - pass - - -class DatabaseErrorWrapper: - """ - Context manager and decorator that reraises backend-specific database - exceptions using Django's common wrappers. - """ - - def __init__(self, wrapper): - """ - wrapper is a database wrapper. - - It must have a Database attribute defining PEP-249 exceptions. - """ - self.wrapper = wrapper - - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_value, traceback): - if exc_type is None: - return - for dj_exc_type in ( - DataError, - OperationalError, - IntegrityError, - InternalError, - ProgrammingError, - NotSupportedError, - DatabaseError, - InterfaceError, - Error, - ): - db_exc_type = getattr(self.wrapper.Database, dj_exc_type.__name__) - if issubclass(exc_type, db_exc_type): - dj_exc_value = dj_exc_type(*exc_value.args) - # Only set the 'errors_occurred' flag for errors that may make - # the connection unusable. - if dj_exc_type not in (DataError, IntegrityError): - self.wrapper.errors_occurred = True - raise dj_exc_value.with_traceback(traceback) from exc_value - - def __call__(self, func): - # Note that we are intentionally not using @wraps here for performance - # reasons. Refs #21109. - def inner(*args, **kwargs): - with self: - return func(*args, **kwargs) - - return inner - - -def load_backend(backend_name): - """ - Return a database backend's "base" module given a fully qualified database - backend name, or raise an error if it doesn't exist. - """ - # This backend was renamed in Django 1.9. - if backend_name == "django.db.backends.postgresql_psycopg2": - backend_name = "django.db.backends.postgresql" - - try: - return import_module("%s.base" % backend_name) - except ImportError as e_user: - # The database backend wasn't found. Display a helpful error message - # listing all built-in database backends. - import django.db.backends - - builtin_backends = [ - name - for _, name, ispkg in pkgutil.iter_modules(django.db.backends.__path__) - if ispkg and name not in {"base", "dummy"} - ] - if backend_name not in ["django.db.backends.%s" % b for b in builtin_backends]: - backend_reprs = map(repr, sorted(builtin_backends)) - raise ImproperlyConfigured( - "%r isn't an available database backend or couldn't be " - "imported. Check the above exception. To use one of the " - "built-in backends, use 'django.db.backends.XXX', where XXX " - "is one of:\n" - " %s" % (backend_name, ", ".join(backend_reprs)) - ) from e_user - else: - # If there's some other error, this must be an error in Django - raise - - -class ConnectionHandler(BaseConnectionHandler): - settings_name = "DATABASES" - # Connections needs to still be an actual thread local, as it's truly - # thread-critical. Database backends should use @async_unsafe to protect - # their code from async contexts, but this will give those contexts - # separate connections in case it's needed as well. There's no cleanup - # after async contexts, though, so we don't allow that if we can help it. - thread_critical = True - - def configure_settings(self, databases): - databases = super().configure_settings(databases) - if databases == {}: - databases[DEFAULT_DB_ALIAS] = {"ENGINE": "django.db.backends.dummy"} - elif DEFAULT_DB_ALIAS not in databases: - raise ImproperlyConfigured( - f"You must define a '{DEFAULT_DB_ALIAS}' database." - ) - elif databases[DEFAULT_DB_ALIAS] == {}: - databases[DEFAULT_DB_ALIAS]["ENGINE"] = "django.db.backends.dummy" - - # Configure default settings. - for conn in databases.values(): - conn.setdefault("ATOMIC_REQUESTS", False) - conn.setdefault("AUTOCOMMIT", True) - conn.setdefault("ENGINE", "django.db.backends.dummy") - if conn["ENGINE"] == "django.db.backends." or not conn["ENGINE"]: - conn["ENGINE"] = "django.db.backends.dummy" - conn.setdefault("CONN_MAX_AGE", 0) - conn.setdefault("CONN_HEALTH_CHECKS", False) - conn.setdefault("OPTIONS", {}) - conn.setdefault("TIME_ZONE", None) - for setting in ["NAME", "USER", "PASSWORD", "HOST", "PORT"]: - conn.setdefault(setting, "") - - test_settings = conn.setdefault("TEST", {}) - default_test_settings = [ - ("CHARSET", None), - ("COLLATION", None), - ("MIGRATE", True), - ("MIRROR", None), - ("NAME", None), - ] - for key, value in default_test_settings: - test_settings.setdefault(key, value) - return databases - - @property - def databases(self): - # Maintained for backward compatibility as some 3rd party packages have - # made use of this private API in the past. It is no longer used within - # Django itself. - return self.settings - - def create_connection(self, alias): - db = self.settings[alias] - backend = load_backend(db["ENGINE"]) - return backend.DatabaseWrapper(db, alias) - - -class ConnectionRouter: - def __init__(self, routers=None): - """ - If routers is not specified, default to settings.DATABASE_ROUTERS. - """ - self._routers = routers - - @cached_property - def routers(self): - if self._routers is None: - self._routers = settings.DATABASE_ROUTERS - routers = [] - for r in self._routers: - if isinstance(r, str): - router = import_string(r)() - else: - router = r - routers.append(router) - return routers - - def _router_func(action): - def _route_db(self, model, **hints): - chosen_db = None - for router in self.routers: - try: - method = getattr(router, action) - except AttributeError: - # If the router doesn't have a method, skip to the next one. - pass - else: - chosen_db = method(model, **hints) - if chosen_db: - return chosen_db - instance = hints.get("instance") - if instance is not None and instance._state.db: - return instance._state.db - return DEFAULT_DB_ALIAS - - return _route_db - - db_for_read = _router_func("db_for_read") - db_for_write = _router_func("db_for_write") - - def allow_relation(self, obj1, obj2, **hints): - for router in self.routers: - try: - method = router.allow_relation - except AttributeError: - # If the router doesn't have a method, skip to the next one. - pass - else: - allow = method(obj1, obj2, **hints) - if allow is not None: - return allow - return obj1._state.db == obj2._state.db - - def allow_migrate(self, db, app_label, **hints): - for router in self.routers: - try: - method = router.allow_migrate - except AttributeError: - # If the router doesn't have a method, skip to the next one. - continue - - allow = method(db, app_label, **hints) - - if allow is not None: - return allow - return True - - def allow_migrate_model(self, db, model): - return self.allow_migrate( - db, - model._meta.app_label, - model_name=model._meta.model_name, - model=model, - ) - - def get_migratable_models(self, app_config, db, include_auto_created=False): - """Return app models allowed to be migrated on provided db.""" - models = app_config.get_models(include_auto_created=include_auto_created) - return [model for model in models if self.allow_migrate_model(db, model)] diff --git a/.venv/lib/python3.10/site-packages/django/dispatch/__init__.py b/.venv/lib/python3.10/site-packages/django/dispatch/__init__.py deleted file mode 100644 index a615f99..0000000 --- a/.venv/lib/python3.10/site-packages/django/dispatch/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -"""Multi-consumer multi-producer dispatching mechanism - -Originally based on pydispatch (BSD) https://pypi.org/project/PyDispatcher/2.0.1/ -See license.txt for original license. - -Heavily modified for Django's purposes. -""" - -from django.dispatch.dispatcher import Signal, receiver # NOQA diff --git a/.venv/lib/python3.10/site-packages/django/dispatch/dispatcher.py b/.venv/lib/python3.10/site-packages/django/dispatch/dispatcher.py deleted file mode 100644 index fe0e1fa..0000000 --- a/.venv/lib/python3.10/site-packages/django/dispatch/dispatcher.py +++ /dev/null @@ -1,494 +0,0 @@ -import asyncio -import logging -import threading -import weakref - -from asgiref.sync import async_to_sync, iscoroutinefunction, sync_to_async - -from django.utils.inspect import func_accepts_kwargs - -logger = logging.getLogger("django.dispatch") - - -def _make_id(target): - if hasattr(target, "__func__"): - return (id(target.__self__), id(target.__func__)) - return id(target) - - -NONE_ID = _make_id(None) - -# A marker for caching -NO_RECEIVERS = object() - - -class Signal: - """ - Base class for all signals - - Internal attributes: - - receivers - { receiverkey (id) : weakref(receiver) } - """ - - def __init__(self, use_caching=False): - """ - Create a new signal. - """ - self.receivers = [] - self.lock = threading.Lock() - self.use_caching = use_caching - # For convenience we create empty caches even if they are not used. - # A note about caching: if use_caching is defined, then for each - # distinct sender we cache the receivers that sender has in - # 'sender_receivers_cache'. The cache is cleaned when .connect() or - # .disconnect() is called and populated on send(). - self.sender_receivers_cache = weakref.WeakKeyDictionary() if use_caching else {} - self._dead_receivers = False - - def connect(self, receiver, sender=None, weak=True, dispatch_uid=None): - """ - Connect receiver to sender for signal. - - Arguments: - - receiver - A function or an instance method which is to receive signals. - Receivers must be hashable objects. Receivers can be - asynchronous. - - If weak is True, then receiver must be weak referenceable. - - Receivers must be able to accept keyword arguments. - - If a receiver is connected with a dispatch_uid argument, it - will not be added if another receiver was already connected - with that dispatch_uid. - - sender - The sender to which the receiver should respond. Must either be - a Python object, or None to receive events from any sender. - - weak - Whether to use weak references to the receiver. By default, the - module will attempt to use weak references to the receiver - objects. If this parameter is false, then strong references will - be used. - - dispatch_uid - An identifier used to uniquely identify a particular instance of - a receiver. This will usually be a string, though it may be - anything hashable. - """ - from django.conf import settings - - # If DEBUG is on, check that we got a good receiver - if settings.configured and settings.DEBUG: - if not callable(receiver): - raise TypeError("Signal receivers must be callable.") - # Check for **kwargs - if not func_accepts_kwargs(receiver): - raise ValueError( - "Signal receivers must accept keyword arguments (**kwargs)." - ) - - if dispatch_uid: - lookup_key = (dispatch_uid, _make_id(sender)) - else: - lookup_key = (_make_id(receiver), _make_id(sender)) - - is_async = iscoroutinefunction(receiver) - - if weak: - ref = weakref.ref - receiver_object = receiver - # Check for bound methods - if hasattr(receiver, "__self__") and hasattr(receiver, "__func__"): - ref = weakref.WeakMethod - receiver_object = receiver.__self__ - receiver = ref(receiver) - weakref.finalize(receiver_object, self._remove_receiver) - - with self.lock: - self._clear_dead_receivers() - if not any(r_key == lookup_key for r_key, _, _ in self.receivers): - self.receivers.append((lookup_key, receiver, is_async)) - self.sender_receivers_cache.clear() - - def disconnect(self, receiver=None, sender=None, dispatch_uid=None): - """ - Disconnect receiver from sender for signal. - - If weak references are used, disconnect need not be called. The receiver - will be removed from dispatch automatically. - - Arguments: - - receiver - The registered receiver to disconnect. May be none if - dispatch_uid is specified. - - sender - The registered sender to disconnect - - dispatch_uid - the unique identifier of the receiver to disconnect - """ - if dispatch_uid: - lookup_key = (dispatch_uid, _make_id(sender)) - else: - lookup_key = (_make_id(receiver), _make_id(sender)) - - disconnected = False - with self.lock: - self._clear_dead_receivers() - for index in range(len(self.receivers)): - r_key, *_ = self.receivers[index] - if r_key == lookup_key: - disconnected = True - del self.receivers[index] - break - self.sender_receivers_cache.clear() - return disconnected - - def has_listeners(self, sender=None): - sync_receivers, async_receivers = self._live_receivers(sender) - return bool(sync_receivers) or bool(async_receivers) - - def send(self, sender, **named): - """ - Send signal from sender to all connected receivers. - - If any receiver raises an error, the error propagates back through send, - terminating the dispatch loop. So it's possible that all receivers - won't be called if an error is raised. - - If any receivers are asynchronous, they are called after all the - synchronous receivers via a single call to async_to_sync(). They are - also executed concurrently with asyncio.gather(). - - Arguments: - - sender - The sender of the signal. Either a specific object or None. - - named - Named arguments which will be passed to receivers. - - Return a list of tuple pairs [(receiver, response), ... ]. - """ - if ( - not self.receivers - or self.sender_receivers_cache.get(sender) is NO_RECEIVERS - ): - return [] - responses = [] - sync_receivers, async_receivers = self._live_receivers(sender) - for receiver in sync_receivers: - response = receiver(signal=self, sender=sender, **named) - responses.append((receiver, response)) - if async_receivers: - - async def asend(): - async_responses = await asyncio.gather( - *( - receiver(signal=self, sender=sender, **named) - for receiver in async_receivers - ) - ) - return zip(async_receivers, async_responses) - - responses.extend(async_to_sync(asend)()) - return responses - - async def asend(self, sender, **named): - """ - Send signal from sender to all connected receivers in async mode. - - All sync receivers will be wrapped by sync_to_async() - If any receiver raises an error, the error propagates back through - send, terminating the dispatch loop. So it's possible that all - receivers won't be called if an error is raised. - - If any receivers are synchronous, they are grouped and called behind a - sync_to_async() adaption before executing any asynchronous receivers. - - If any receivers are asynchronous, they are grouped and executed - concurrently with asyncio.gather(). - - Arguments: - - sender - The sender of the signal. Either a specific object or None. - - named - Named arguments which will be passed to receivers. - - Return a list of tuple pairs [(receiver, response), ...]. - """ - if ( - not self.receivers - or self.sender_receivers_cache.get(sender) is NO_RECEIVERS - ): - return [] - sync_receivers, async_receivers = self._live_receivers(sender) - if sync_receivers: - - @sync_to_async - def sync_send(): - responses = [] - for receiver in sync_receivers: - response = receiver(signal=self, sender=sender, **named) - responses.append((receiver, response)) - return responses - - else: - - async def sync_send(): - return [] - - responses, async_responses = await asyncio.gather( - sync_send(), - asyncio.gather( - *( - receiver(signal=self, sender=sender, **named) - for receiver in async_receivers - ) - ), - ) - responses.extend(zip(async_receivers, async_responses)) - return responses - - def _log_robust_failure(self, receiver, err): - logger.error( - "Error calling %s in Signal.send_robust() (%s)", - receiver.__qualname__, - err, - exc_info=err, - ) - - def send_robust(self, sender, **named): - """ - Send signal from sender to all connected receivers catching errors. - - If any receivers are asynchronous, they are called after all the - synchronous receivers via a single call to async_to_sync(). They are - also executed concurrently with asyncio.gather(). - - Arguments: - - sender - The sender of the signal. Can be any Python object (normally one - registered with a connect if you actually want something to - occur). - - named - Named arguments which will be passed to receivers. - - Return a list of tuple pairs [(receiver, response), ... ]. - - If any receiver raises an error (specifically any subclass of - Exception), return the error instance as the result for that receiver. - """ - if ( - not self.receivers - or self.sender_receivers_cache.get(sender) is NO_RECEIVERS - ): - return [] - - # Call each receiver with whatever arguments it can accept. - # Return a list of tuple pairs [(receiver, response), ... ]. - responses = [] - sync_receivers, async_receivers = self._live_receivers(sender) - for receiver in sync_receivers: - try: - response = receiver(signal=self, sender=sender, **named) - except Exception as err: - self._log_robust_failure(receiver, err) - responses.append((receiver, err)) - else: - responses.append((receiver, response)) - if async_receivers: - - async def asend_and_wrap_exception(receiver): - try: - response = await receiver(signal=self, sender=sender, **named) - except Exception as err: - self._log_robust_failure(receiver, err) - return err - return response - - async def asend(): - async_responses = await asyncio.gather( - *( - asend_and_wrap_exception(receiver) - for receiver in async_receivers - ) - ) - return zip(async_receivers, async_responses) - - responses.extend(async_to_sync(asend)()) - return responses - - async def asend_robust(self, sender, **named): - """ - Send signal from sender to all connected receivers catching errors. - - If any receivers are synchronous, they are grouped and called behind a - sync_to_async() adaption before executing any asynchronous receivers. - - If any receivers are asynchronous, they are grouped and executed - concurrently with asyncio.gather. - - Arguments: - - sender - The sender of the signal. Can be any Python object (normally one - registered with a connect if you actually want something to - occur). - - named - Named arguments which will be passed to receivers. - - Return a list of tuple pairs [(receiver, response), ... ]. - - If any receiver raises an error (specifically any subclass of - Exception), return the error instance as the result for that receiver. - """ - if ( - not self.receivers - or self.sender_receivers_cache.get(sender) is NO_RECEIVERS - ): - return [] - - # Call each receiver with whatever arguments it can accept. - # Return a list of tuple pairs [(receiver, response), ... ]. - sync_receivers, async_receivers = self._live_receivers(sender) - - if sync_receivers: - - @sync_to_async - def sync_send(): - responses = [] - for receiver in sync_receivers: - try: - response = receiver(signal=self, sender=sender, **named) - except Exception as err: - self._log_robust_failure(receiver, err) - responses.append((receiver, err)) - else: - responses.append((receiver, response)) - return responses - - else: - - async def sync_send(): - return [] - - async def asend_and_wrap_exception(receiver): - try: - response = await receiver(signal=self, sender=sender, **named) - except Exception as err: - self._log_robust_failure(receiver, err) - return err - return response - - responses, async_responses = await asyncio.gather( - sync_send(), - asyncio.gather( - *(asend_and_wrap_exception(receiver) for receiver in async_receivers), - ), - ) - responses.extend(zip(async_receivers, async_responses)) - return responses - - def _clear_dead_receivers(self): - # Note: caller is assumed to hold self.lock. - if self._dead_receivers: - self._dead_receivers = False - self.receivers = [ - r - for r in self.receivers - if not (isinstance(r[1], weakref.ReferenceType) and r[1]() is None) - ] - - def _live_receivers(self, sender): - """ - Filter sequence of receivers to get resolved, live receivers. - - This checks for weak references and resolves them, then returning only - live receivers. - """ - receivers = None - if self.use_caching and not self._dead_receivers: - receivers = self.sender_receivers_cache.get(sender) - # We could end up here with NO_RECEIVERS even if we do check this case in - # .send() prior to calling _live_receivers() due to concurrent .send() call. - if receivers is NO_RECEIVERS: - return [], [] - if receivers is None: - with self.lock: - self._clear_dead_receivers() - senderkey = _make_id(sender) - receivers = [] - for (_receiverkey, r_senderkey), receiver, is_async in self.receivers: - if r_senderkey == NONE_ID or r_senderkey == senderkey: - receivers.append((receiver, is_async)) - if self.use_caching: - if not receivers: - self.sender_receivers_cache[sender] = NO_RECEIVERS - else: - # Note, we must cache the weakref versions. - self.sender_receivers_cache[sender] = receivers - non_weak_sync_receivers = [] - non_weak_async_receivers = [] - for receiver, is_async in receivers: - if isinstance(receiver, weakref.ReferenceType): - # Dereference the weak reference. - receiver = receiver() - if receiver is not None: - if is_async: - non_weak_async_receivers.append(receiver) - else: - non_weak_sync_receivers.append(receiver) - else: - if is_async: - non_weak_async_receivers.append(receiver) - else: - non_weak_sync_receivers.append(receiver) - return non_weak_sync_receivers, non_weak_async_receivers - - def _remove_receiver(self, receiver=None): - # Mark that the self.receivers list has dead weakrefs. If so, we will - # clean those up in connect, disconnect and _live_receivers while - # holding self.lock. Note that doing the cleanup here isn't a good - # idea, _remove_receiver() will be called as side effect of garbage - # collection, and so the call can happen while we are already holding - # self.lock. - self._dead_receivers = True - - -def receiver(signal, **kwargs): - """ - A decorator for connecting receivers to signals. Used by passing in the - signal (or list of signals) and keyword arguments to connect:: - - @receiver(post_save, sender=MyModel) - def signal_receiver(sender, **kwargs): - ... - - @receiver([post_save, post_delete], sender=MyModel) - def signals_receiver(sender, **kwargs): - ... - """ - - def _decorator(func): - if isinstance(signal, (list, tuple)): - for s in signal: - s.connect(func, **kwargs) - else: - signal.connect(func, **kwargs) - return func - - return _decorator diff --git a/.venv/lib/python3.10/site-packages/django/dispatch/license.txt b/.venv/lib/python3.10/site-packages/django/dispatch/license.txt deleted file mode 100644 index 505090d..0000000 --- a/.venv/lib/python3.10/site-packages/django/dispatch/license.txt +++ /dev/null @@ -1,36 +0,0 @@ -django.dispatch was originally forked from PyDispatcher. - -PyDispatcher License: - - Copyright (c) 2001-2003, Patrick K. O'Brien and Contributors - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - The name of Patrick K. O'Brien, or the name of any Contributor, - may not be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/.venv/lib/python3.10/site-packages/django/forms/__init__.py b/.venv/lib/python3.10/site-packages/django/forms/__init__.py deleted file mode 100644 index 1c31921..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -""" -Django validation and HTML form handling. -""" - -from django.core.exceptions import ValidationError # NOQA -from django.forms.boundfield import * # NOQA -from django.forms.fields import * # NOQA -from django.forms.forms import * # NOQA -from django.forms.formsets import * # NOQA -from django.forms.models import * # NOQA -from django.forms.widgets import * # NOQA diff --git a/.venv/lib/python3.10/site-packages/django/forms/boundfield.py b/.venv/lib/python3.10/site-packages/django/forms/boundfield.py deleted file mode 100644 index c0324d5..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/boundfield.py +++ /dev/null @@ -1,365 +0,0 @@ -import re - -from django.core.exceptions import ValidationError -from django.forms.utils import RenderableFieldMixin, pretty_name -from django.forms.widgets import MultiWidget, Textarea, TextInput -from django.utils.functional import cached_property -from django.utils.html import format_html, html_safe -from django.utils.translation import gettext_lazy as _ - -__all__ = ("BoundField",) - - -class BoundField(RenderableFieldMixin): - "A Field plus data" - - def __init__(self, form, field, name): - self.form = form - self.field = field - self.name = name - self.html_name = form.add_prefix(name) - self.html_initial_name = form.add_initial_prefix(name) - self.html_initial_id = form.add_initial_prefix(self.auto_id) - if self.field.label is None: - self.label = pretty_name(name) - else: - self.label = self.field.label - self.help_text = field.help_text or "" - self.renderer = form.renderer - - @cached_property - def subwidgets(self): - """ - Most widgets yield a single subwidget, but others like RadioSelect and - CheckboxSelectMultiple produce one subwidget for each choice. - - This property is cached so that only one database query occurs when - rendering ModelChoiceFields. - """ - id_ = self.field.widget.attrs.get("id") or self.auto_id - attrs = {"id": id_} if id_ else {} - attrs = self.build_widget_attrs(attrs) - return [ - BoundWidget(self.field.widget, widget, self.form.renderer) - for widget in self.field.widget.subwidgets( - self.html_name, self.value(), attrs=attrs - ) - ] - - def __bool__(self): - # BoundField evaluates to True even if it doesn't have subwidgets. - return True - - def __iter__(self): - return iter(self.subwidgets) - - def __len__(self): - return len(self.subwidgets) - - def __getitem__(self, idx): - # Prevent unnecessary reevaluation when accessing BoundField's attrs - # from templates. - if not isinstance(idx, (int, slice)): - raise TypeError( - "BoundField indices must be integers or slices, not %s." - % type(idx).__name__ - ) - return self.subwidgets[idx] - - @property - def errors(self): - """ - Return an ErrorList (empty if there are no errors) for this field. - """ - return self.form.errors.get( - self.name, self.form.error_class(renderer=self.form.renderer) - ) - - @property - def template_name(self): - return self.field.template_name or self.form.renderer.field_template_name - - def get_context(self): - return {"field": self} - - def as_widget(self, widget=None, attrs=None, only_initial=False): - """ - Render the field by rendering the passed widget, adding any HTML - attributes passed as attrs. If a widget isn't specified, use the - field's default widget. - """ - widget = widget or self.field.widget - if self.field.localize: - widget.is_localized = True - attrs = attrs or {} - attrs = self.build_widget_attrs(attrs, widget) - if self.auto_id and "id" not in widget.attrs: - attrs.setdefault( - "id", self.html_initial_id if only_initial else self.auto_id - ) - if only_initial and self.html_initial_name in self.form.data: - # Propagate the hidden initial value. - value = self.form._widget_data_value( - self.field.hidden_widget(), - self.html_initial_name, - ) - else: - value = self.value() - return widget.render( - name=self.html_initial_name if only_initial else self.html_name, - value=value, - attrs=attrs, - renderer=self.form.renderer, - ) - - def as_text(self, attrs=None, **kwargs): - """ - Return a string of HTML for representing this as an . - """ - return self.as_widget(TextInput(), attrs, **kwargs) - - def as_textarea(self, attrs=None, **kwargs): - """Return a string of HTML for representing this as a diff --git a/.venv/lib/python3.10/site-packages/django/forms/jinja2/django/forms/widgets/time.html b/.venv/lib/python3.10/site-packages/django/forms/jinja2/django/forms/widgets/time.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/jinja2/django/forms/widgets/time.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/jinja2/django/forms/widgets/url.html b/.venv/lib/python3.10/site-packages/django/forms/jinja2/django/forms/widgets/url.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/jinja2/django/forms/widgets/url.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/models.py b/.venv/lib/python3.10/site-packages/django/forms/models.py deleted file mode 100644 index be59dbe..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/models.py +++ /dev/null @@ -1,1687 +0,0 @@ -""" -Helper functions for creating Form classes from Django models -and database field objects. -""" - -from itertools import chain - -from django.core.exceptions import ( - NON_FIELD_ERRORS, - FieldError, - ImproperlyConfigured, - ValidationError, -) -from django.core.validators import ProhibitNullCharactersValidator -from django.db.models.utils import AltersData -from django.forms.fields import ChoiceField, Field -from django.forms.forms import BaseForm, DeclarativeFieldsMetaclass -from django.forms.formsets import BaseFormSet, formset_factory -from django.forms.utils import ErrorList -from django.forms.widgets import ( - HiddenInput, - MultipleHiddenInput, - RadioSelect, - SelectMultiple, -) -from django.utils.choices import BaseChoiceIterator -from django.utils.hashable import make_hashable -from django.utils.text import capfirst, get_text_list -from django.utils.translation import gettext -from django.utils.translation import gettext_lazy as _ - -__all__ = ( - "ModelForm", - "BaseModelForm", - "model_to_dict", - "fields_for_model", - "ModelChoiceField", - "ModelMultipleChoiceField", - "ALL_FIELDS", - "BaseModelFormSet", - "modelformset_factory", - "BaseInlineFormSet", - "inlineformset_factory", - "modelform_factory", -) - -ALL_FIELDS = "__all__" - - -def construct_instance(form, instance, fields=None, exclude=None): - """ - Construct and return a model instance from the bound ``form``'s - ``cleaned_data``, but do not save the returned instance to the database. - """ - from django.db import models - - opts = instance._meta - - cleaned_data = form.cleaned_data - file_field_list = [] - for f in opts.fields: - if ( - not f.editable - or isinstance(f, models.AutoField) - or f.name not in cleaned_data - ): - continue - if fields is not None and f.name not in fields: - continue - if exclude and f.name in exclude: - continue - # Leave defaults for fields that aren't in POST data, except for - # checkbox inputs because they don't appear in POST data if not checked. - if ( - f.has_default() - and form[f.name].field.widget.value_omitted_from_data( - form.data, form.files, form.add_prefix(f.name) - ) - and cleaned_data.get(f.name) in form[f.name].field.empty_values - ): - continue - # Defer saving file-type fields until after the other fields, so a - # callable upload_to can use the values from other fields. - if isinstance(f, models.FileField): - file_field_list.append(f) - else: - f.save_form_data(instance, cleaned_data[f.name]) - - for f in file_field_list: - f.save_form_data(instance, cleaned_data[f.name]) - - return instance - - -# ModelForms ################################################################# - - -def model_to_dict(instance, fields=None, exclude=None): - """ - Return a dict containing the data in ``instance`` suitable for passing as - a Form's ``initial`` keyword argument. - - ``fields`` is an optional list of field names. If provided, return only the - named. - - ``exclude`` is an optional list of field names. If provided, exclude the - named from the returned dict, even if they are listed in the ``fields`` - argument. - """ - opts = instance._meta - data = {} - for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many): - if not getattr(f, "editable", False): - continue - if fields is not None and f.name not in fields: - continue - if exclude and f.name in exclude: - continue - data[f.name] = f.value_from_object(instance) - return data - - -def apply_limit_choices_to_to_formfield(formfield): - """Apply limit_choices_to to the formfield's queryset if needed.""" - from django.db.models import Exists, OuterRef, Q - - if hasattr(formfield, "queryset") and hasattr(formfield, "get_limit_choices_to"): - limit_choices_to = formfield.get_limit_choices_to() - if limit_choices_to: - complex_filter = limit_choices_to - if not isinstance(complex_filter, Q): - complex_filter = Q(**limit_choices_to) - complex_filter &= Q(pk=OuterRef("pk")) - # Use Exists() to avoid potential duplicates. - formfield.queryset = formfield.queryset.filter( - Exists(formfield.queryset.model._base_manager.filter(complex_filter)), - ) - - -def fields_for_model( - model, - fields=None, - exclude=None, - widgets=None, - formfield_callback=None, - localized_fields=None, - labels=None, - help_texts=None, - error_messages=None, - field_classes=None, - *, - apply_limit_choices_to=True, - form_declared_fields=None, -): - """ - Return a dictionary containing form fields for the given model. - - ``fields`` is an optional list of field names. If provided, return only the - named fields. - - ``exclude`` is an optional list of field names. If provided, exclude the - named fields from the returned fields, even if they are listed in the - ``fields`` argument. - - ``widgets`` is a dictionary of model field names mapped to a widget. - - ``formfield_callback`` is a callable that takes a model field and returns - a form field. - - ``localized_fields`` is a list of names of fields which should be localized. - - ``labels`` is a dictionary of model field names mapped to a label. - - ``help_texts`` is a dictionary of model field names mapped to a help text. - - ``error_messages`` is a dictionary of model field names mapped to a - dictionary of error messages. - - ``field_classes`` is a dictionary of model field names mapped to a form - field class. - - ``apply_limit_choices_to`` is a boolean indicating if limit_choices_to - should be applied to a field's queryset. - - ``form_declared_fields`` is a dictionary of form fields created directly on - a form. - """ - form_declared_fields = form_declared_fields or {} - field_dict = {} - ignored = [] - opts = model._meta - # Avoid circular import - from django.db.models import Field as ModelField - - sortable_private_fields = [ - f for f in opts.private_fields if isinstance(f, ModelField) - ] - for f in sorted( - chain(opts.concrete_fields, sortable_private_fields, opts.many_to_many) - ): - if not getattr(f, "editable", False): - if ( - fields is not None - and f.name in fields - and (exclude is None or f.name not in exclude) - ): - raise FieldError( - "'%s' cannot be specified for %s model form as it is a " - "non-editable field" % (f.name, model.__name__) - ) - continue - if fields is not None and f.name not in fields: - continue - if exclude and f.name in exclude: - continue - if f.name in form_declared_fields: - field_dict[f.name] = form_declared_fields[f.name] - continue - - kwargs = {} - if widgets and f.name in widgets: - kwargs["widget"] = widgets[f.name] - if localized_fields == ALL_FIELDS or ( - localized_fields and f.name in localized_fields - ): - kwargs["localize"] = True - if labels and f.name in labels: - kwargs["label"] = labels[f.name] - if help_texts and f.name in help_texts: - kwargs["help_text"] = help_texts[f.name] - if error_messages and f.name in error_messages: - kwargs["error_messages"] = error_messages[f.name] - if field_classes and f.name in field_classes: - kwargs["form_class"] = field_classes[f.name] - - if formfield_callback is None: - formfield = f.formfield(**kwargs) - elif not callable(formfield_callback): - raise TypeError("formfield_callback must be a function or callable") - else: - formfield = formfield_callback(f, **kwargs) - - if formfield: - if apply_limit_choices_to: - apply_limit_choices_to_to_formfield(formfield) - field_dict[f.name] = formfield - else: - ignored.append(f.name) - if fields: - field_dict = { - f: field_dict.get(f) - for f in fields - if (not exclude or f not in exclude) and f not in ignored - } - return field_dict - - -class ModelFormOptions: - def __init__(self, options=None): - self.model = getattr(options, "model", None) - self.fields = getattr(options, "fields", None) - self.exclude = getattr(options, "exclude", None) - self.widgets = getattr(options, "widgets", None) - self.localized_fields = getattr(options, "localized_fields", None) - self.labels = getattr(options, "labels", None) - self.help_texts = getattr(options, "help_texts", None) - self.error_messages = getattr(options, "error_messages", None) - self.field_classes = getattr(options, "field_classes", None) - self.formfield_callback = getattr(options, "formfield_callback", None) - - -class ModelFormMetaclass(DeclarativeFieldsMetaclass): - def __new__(mcs, name, bases, attrs): - new_class = super().__new__(mcs, name, bases, attrs) - - if bases == (BaseModelForm,): - return new_class - - opts = new_class._meta = ModelFormOptions(getattr(new_class, "Meta", None)) - - # We check if a string was passed to `fields` or `exclude`, - # which is likely to be a mistake where the user typed ('foo') instead - # of ('foo',) - for opt in ["fields", "exclude", "localized_fields"]: - value = getattr(opts, opt) - if isinstance(value, str) and value != ALL_FIELDS: - msg = ( - "%(model)s.Meta.%(opt)s cannot be a string. " - "Did you mean to type: ('%(value)s',)?" - % { - "model": new_class.__name__, - "opt": opt, - "value": value, - } - ) - raise TypeError(msg) - - if opts.model: - # If a model is defined, extract form fields from it. - if opts.fields is None and opts.exclude is None: - raise ImproperlyConfigured( - "Creating a ModelForm without either the 'fields' attribute " - "or the 'exclude' attribute is prohibited; form %s " - "needs updating." % name - ) - - if opts.fields == ALL_FIELDS: - # Sentinel for fields_for_model to indicate "get the list of - # fields from the model" - opts.fields = None - - fields = fields_for_model( - opts.model, - opts.fields, - opts.exclude, - opts.widgets, - opts.formfield_callback, - opts.localized_fields, - opts.labels, - opts.help_texts, - opts.error_messages, - opts.field_classes, - # limit_choices_to will be applied during ModelForm.__init__(). - apply_limit_choices_to=False, - form_declared_fields=new_class.declared_fields, - ) - - # make sure opts.fields doesn't specify an invalid field - none_model_fields = {k for k, v in fields.items() if not v} - missing_fields = none_model_fields.difference(new_class.declared_fields) - if missing_fields: - message = "Unknown field(s) (%s) specified for %s" - message %= (", ".join(missing_fields), opts.model.__name__) - raise FieldError(message) - # Include all the other declared fields. - fields.update(new_class.declared_fields) - else: - fields = new_class.declared_fields - - new_class.base_fields = fields - - return new_class - - -class BaseModelForm(BaseForm, AltersData): - def __init__( - self, - data=None, - files=None, - auto_id="id_%s", - prefix=None, - initial=None, - error_class=ErrorList, - label_suffix=None, - empty_permitted=False, - instance=None, - use_required_attribute=None, - renderer=None, - ): - opts = self._meta - if opts.model is None: - raise ValueError("ModelForm has no model class specified.") - if instance is None: - # if we didn't get an instance, instantiate a new one - self.instance = opts.model() - object_data = {} - else: - self.instance = instance - object_data = model_to_dict(instance, opts.fields, opts.exclude) - # if initial was provided, it should override the values from instance - if initial is not None: - object_data.update(initial) - # self._validate_unique will be set to True by BaseModelForm.clean(). - # It is False by default so overriding self.clean() and failing to call - # super will stop validate_unique from being called. - self._validate_unique = False - super().__init__( - data, - files, - auto_id, - prefix, - object_data, - error_class, - label_suffix, - empty_permitted, - use_required_attribute=use_required_attribute, - renderer=renderer, - ) - for formfield in self.fields.values(): - apply_limit_choices_to_to_formfield(formfield) - - def _get_validation_exclusions(self): - """ - For backwards-compatibility, exclude several types of fields from model - validation. See tickets #12507, #12521, #12553. - """ - exclude = set() - # Build up a list of fields that should be excluded from model field - # validation and unique checks. - for f in self.instance._meta.fields: - field = f.name - # Exclude fields that aren't on the form. The developer may be - # adding these values to the model after form validation. - if field not in self.fields: - exclude.add(f.name) - - # Don't perform model validation on fields that were defined - # manually on the form and excluded via the ModelForm's Meta - # class. See #12901. - elif self._meta.fields and field not in self._meta.fields: - exclude.add(f.name) - elif self._meta.exclude and field in self._meta.exclude: - exclude.add(f.name) - - # Exclude fields that failed form validation. There's no need for - # the model fields to validate them as well. - elif field in self._errors: - exclude.add(f.name) - - # Exclude empty fields that are not required by the form, if the - # underlying model field is required. This keeps the model field - # from raising a required error. Note: don't exclude the field from - # validation if the model field allows blanks. If it does, the blank - # value may be included in a unique check, so cannot be excluded - # from validation. - else: - form_field = self.fields[field] - field_value = self.cleaned_data.get(field) - if ( - not f.blank - and not form_field.required - and field_value in form_field.empty_values - ): - exclude.add(f.name) - return exclude - - def clean(self): - self._validate_unique = True - return self.cleaned_data - - def _update_errors(self, errors): - # Override any validation error messages defined at the model level - # with those defined at the form level. - opts = self._meta - - # Allow the model generated by construct_instance() to raise - # ValidationError and have them handled in the same way as others. - if hasattr(errors, "error_dict"): - error_dict = errors.error_dict - else: - error_dict = {NON_FIELD_ERRORS: errors} - - for field, messages in error_dict.items(): - if ( - field == NON_FIELD_ERRORS - and opts.error_messages - and NON_FIELD_ERRORS in opts.error_messages - ): - error_messages = opts.error_messages[NON_FIELD_ERRORS] - elif field in self.fields: - error_messages = self.fields[field].error_messages - else: - continue - - for message in messages: - if ( - isinstance(message, ValidationError) - and message.code in error_messages - ): - message.message = error_messages[message.code] - - self.add_error(None, errors) - - def _post_clean(self): - opts = self._meta - - exclude = self._get_validation_exclusions() - - # Foreign Keys being used to represent inline relationships - # are excluded from basic field value validation. This is for two - # reasons: firstly, the value may not be supplied (#12507; the - # case of providing new values to the admin); secondly the - # object being referred to may not yet fully exist (#12749). - # However, these fields *must* be included in uniqueness checks, - # so this can't be part of _get_validation_exclusions(). - for name, field in self.fields.items(): - if isinstance(field, InlineForeignKeyField): - exclude.add(name) - - try: - self.instance = construct_instance( - self, self.instance, opts.fields, opts.exclude - ) - except ValidationError as e: - self._update_errors(e) - - try: - self.instance.full_clean(exclude=exclude, validate_unique=False) - except ValidationError as e: - self._update_errors(e) - - # Validate uniqueness if needed. - if self._validate_unique: - self.validate_unique() - - def validate_unique(self): - """ - Call the instance's validate_unique() method and update the form's - validation errors if any were raised. - """ - exclude = self._get_validation_exclusions() - try: - self.instance.validate_unique(exclude=exclude) - except ValidationError as e: - self._update_errors(e) - - def _save_m2m(self): - """ - Save the many-to-many fields and generic relations for this form. - """ - cleaned_data = self.cleaned_data - exclude = self._meta.exclude - fields = self._meta.fields - opts = self.instance._meta - # Note that for historical reasons we want to include also - # private_fields here. (GenericRelation was previously a fake - # m2m field). - for f in chain(opts.many_to_many, opts.private_fields): - if not hasattr(f, "save_form_data"): - continue - if fields and f.name not in fields: - continue - if exclude and f.name in exclude: - continue - if f.name in cleaned_data: - f.save_form_data(self.instance, cleaned_data[f.name]) - - def save(self, commit=True): - """ - Save this form's self.instance object if commit=True. Otherwise, add - a save_m2m() method to the form which can be called after the instance - is saved manually at a later time. Return the model instance. - """ - if self.errors: - raise ValueError( - "The %s could not be %s because the data didn't validate." - % ( - self.instance._meta.object_name, - "created" if self.instance._state.adding else "changed", - ) - ) - if commit: - # If committing, save the instance and the m2m data immediately. - self.instance.save() - self._save_m2m() - else: - # If not committing, add a method to the form to allow deferred - # saving of m2m data. - self.save_m2m = self._save_m2m - return self.instance - - save.alters_data = True - - -class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass): - pass - - -def modelform_factory( - model, - form=ModelForm, - fields=None, - exclude=None, - formfield_callback=None, - widgets=None, - localized_fields=None, - labels=None, - help_texts=None, - error_messages=None, - field_classes=None, -): - """ - Return a ModelForm containing form fields for the given model. You can - optionally pass a `form` argument to use as a starting point for - constructing the ModelForm. - - ``fields`` is an optional list of field names. If provided, include only - the named fields in the returned fields. If omitted or '__all__', use all - fields. - - ``exclude`` is an optional list of field names. If provided, exclude the - named fields from the returned fields, even if they are listed in the - ``fields`` argument. - - ``widgets`` is a dictionary of model field names mapped to a widget. - - ``localized_fields`` is a list of names of fields which should be localized. - - ``formfield_callback`` is a callable that takes a model field and returns - a form field. - - ``labels`` is a dictionary of model field names mapped to a label. - - ``help_texts`` is a dictionary of model field names mapped to a help text. - - ``error_messages`` is a dictionary of model field names mapped to a - dictionary of error messages. - - ``field_classes`` is a dictionary of model field names mapped to a form - field class. - """ - # Create the inner Meta class. FIXME: ideally, we should be able to - # construct a ModelForm without creating and passing in a temporary - # inner class. - - # Build up a list of attributes that the Meta object will have. - attrs = {"model": model} - if fields is not None: - attrs["fields"] = fields - if exclude is not None: - attrs["exclude"] = exclude - if widgets is not None: - attrs["widgets"] = widgets - if localized_fields is not None: - attrs["localized_fields"] = localized_fields - if labels is not None: - attrs["labels"] = labels - if help_texts is not None: - attrs["help_texts"] = help_texts - if error_messages is not None: - attrs["error_messages"] = error_messages - if field_classes is not None: - attrs["field_classes"] = field_classes - - # If parent form class already has an inner Meta, the Meta we're - # creating needs to inherit from the parent's inner meta. - bases = (form.Meta,) if hasattr(form, "Meta") else () - Meta = type("Meta", bases, attrs) - if formfield_callback: - Meta.formfield_callback = staticmethod(formfield_callback) - # Give this new form class a reasonable name. - class_name = model.__name__ + "Form" - - # Class attributes for the new form class. - form_class_attrs = {"Meta": Meta} - - if getattr(Meta, "fields", None) is None and getattr(Meta, "exclude", None) is None: - raise ImproperlyConfigured( - "Calling modelform_factory without defining 'fields' or " - "'exclude' explicitly is prohibited." - ) - - # Instantiate type(form) in order to use the same metaclass as form. - return type(form)(class_name, (form,), form_class_attrs) - - -# ModelFormSets ############################################################## - - -class BaseModelFormSet(BaseFormSet, AltersData): - """ - A ``FormSet`` for editing a queryset and/or adding new objects to it. - """ - - model = None - edit_only = False - - # Set of fields that must be unique among forms of this set. - unique_fields = set() - - def __init__( - self, - data=None, - files=None, - auto_id="id_%s", - prefix=None, - queryset=None, - *, - initial=None, - **kwargs, - ): - self.queryset = queryset - self.initial_extra = initial - super().__init__( - **{ - "data": data, - "files": files, - "auto_id": auto_id, - "prefix": prefix, - **kwargs, - } - ) - - def initial_form_count(self): - """Return the number of forms that are required in this FormSet.""" - if not self.is_bound: - return len(self.get_queryset()) - return super().initial_form_count() - - def _existing_object(self, pk): - if not hasattr(self, "_object_dict"): - self._object_dict = {o.pk: o for o in self.get_queryset()} - return self._object_dict.get(pk) - - def _get_to_python(self, field): - """ - If the field is a related field, fetch the concrete field's (that - is, the ultimate pointed-to field's) to_python. - """ - while field.remote_field is not None: - field = field.remote_field.get_related_field() - return field.to_python - - def _construct_form(self, i, **kwargs): - pk_required = i < self.initial_form_count() - if pk_required: - if self.is_bound: - pk_key = "%s-%s" % (self.add_prefix(i), self.model._meta.pk.name) - try: - pk = self.data[pk_key] - except KeyError: - # The primary key is missing. The user may have tampered - # with POST data. - pass - else: - to_python = self._get_to_python(self.model._meta.pk) - try: - pk = to_python(pk) - except ValidationError: - # The primary key exists but is an invalid value. The - # user may have tampered with POST data. - pass - else: - kwargs["instance"] = self._existing_object(pk) - else: - kwargs["instance"] = self.get_queryset()[i] - elif self.initial_extra: - # Set initial values for extra forms - try: - kwargs["initial"] = self.initial_extra[i - self.initial_form_count()] - except IndexError: - pass - form = super()._construct_form(i, **kwargs) - if pk_required: - form.fields[self.model._meta.pk.name].required = True - return form - - def get_queryset(self): - if not hasattr(self, "_queryset"): - if self.queryset is not None: - qs = self.queryset - else: - qs = self.model._default_manager.get_queryset() - - # If the queryset isn't already ordered we need to add an - # artificial ordering here to make sure that all formsets - # constructed from this queryset have the same form order. - if not qs.ordered: - qs = qs.order_by(self.model._meta.pk.name) - - # Removed queryset limiting here. As per discussion re: #13023 - # on django-dev, max_num should not prevent existing - # related objects/inlines from being displayed. - self._queryset = qs - return self._queryset - - def save_new(self, form, commit=True): - """Save and return a new model instance for the given form.""" - return form.save(commit=commit) - - def save_existing(self, form, obj, commit=True): - """Save and return an existing model instance for the given form.""" - return form.save(commit=commit) - - def delete_existing(self, obj, commit=True): - """Deletes an existing model instance.""" - if commit: - obj.delete() - - def save(self, commit=True): - """ - Save model instances for every form, adding and changing instances - as necessary, and return the list of instances. - """ - if not commit: - self.saved_forms = [] - - def save_m2m(): - for form in self.saved_forms: - form.save_m2m() - - self.save_m2m = save_m2m - if self.edit_only: - return self.save_existing_objects(commit) - else: - return self.save_existing_objects(commit) + self.save_new_objects(commit) - - save.alters_data = True - - def clean(self): - self.validate_unique() - - def validate_unique(self): - # Collect unique_checks and date_checks to run from all the forms. - all_unique_checks = set() - all_date_checks = set() - forms_to_delete = self.deleted_forms - valid_forms = [ - form - for form in self.forms - if form.is_valid() and form not in forms_to_delete - ] - for form in valid_forms: - exclude = form._get_validation_exclusions() - unique_checks, date_checks = form.instance._get_unique_checks( - exclude=exclude, - include_meta_constraints=True, - ) - all_unique_checks.update(unique_checks) - all_date_checks.update(date_checks) - - errors = [] - # Do each of the unique checks (unique and unique_together) - for uclass, unique_check in all_unique_checks: - seen_data = set() - for form in valid_forms: - # Get the data for the set of fields that must be unique among - # the forms. - row_data = ( - field if field in self.unique_fields else form.cleaned_data[field] - for field in unique_check - if field in form.cleaned_data - ) - # Reduce Model instances to their primary key values - row_data = tuple( - ( - d._get_pk_val() - if hasattr(d, "_get_pk_val") - # Prevent "unhashable type" errors later on. - else make_hashable(d) - ) - for d in row_data - ) - if row_data and None not in row_data: - # if we've already seen it then we have a uniqueness failure - if row_data in seen_data: - # poke error messages into the right places and mark - # the form as invalid - errors.append(self.get_unique_error_message(unique_check)) - form._errors[NON_FIELD_ERRORS] = self.error_class( - [self.get_form_error()], - renderer=self.renderer, - ) - # Remove the data from the cleaned_data dict since it - # was invalid. - for field in unique_check: - if field in form.cleaned_data: - del form.cleaned_data[field] - # mark the data as seen - seen_data.add(row_data) - # iterate over each of the date checks now - for date_check in all_date_checks: - seen_data = set() - uclass, lookup, field, unique_for = date_check - for form in valid_forms: - # see if we have data for both fields - if ( - form.cleaned_data - and form.cleaned_data[field] is not None - and form.cleaned_data[unique_for] is not None - ): - # if it's a date lookup we need to get the data for all the fields - if lookup == "date": - date = form.cleaned_data[unique_for] - date_data = (date.year, date.month, date.day) - # otherwise it's just the attribute on the date/datetime - # object - else: - date_data = (getattr(form.cleaned_data[unique_for], lookup),) - data = (form.cleaned_data[field],) + date_data - # if we've already seen it then we have a uniqueness failure - if data in seen_data: - # poke error messages into the right places and mark - # the form as invalid - errors.append(self.get_date_error_message(date_check)) - form._errors[NON_FIELD_ERRORS] = self.error_class( - [self.get_form_error()], - renderer=self.renderer, - ) - # Remove the data from the cleaned_data dict since it - # was invalid. - del form.cleaned_data[field] - # mark the data as seen - seen_data.add(data) - - if errors: - raise ValidationError(errors) - - def get_unique_error_message(self, unique_check): - if len(unique_check) == 1: - return gettext("Please correct the duplicate data for %(field)s.") % { - "field": unique_check[0], - } - else: - return gettext( - "Please correct the duplicate data for %(field)s, which must be unique." - ) % { - "field": get_text_list(unique_check, _("and")), - } - - def get_date_error_message(self, date_check): - return gettext( - "Please correct the duplicate data for %(field_name)s " - "which must be unique for the %(lookup)s in %(date_field)s." - ) % { - "field_name": date_check[2], - "date_field": date_check[3], - "lookup": str(date_check[1]), - } - - def get_form_error(self): - return gettext("Please correct the duplicate values below.") - - def save_existing_objects(self, commit=True): - self.changed_objects = [] - self.deleted_objects = [] - if not self.initial_forms: - return [] - - saved_instances = [] - forms_to_delete = self.deleted_forms - for form in self.initial_forms: - obj = form.instance - # If the pk is None, it means either: - # 1. The object is an unexpected empty model, created by invalid - # POST data such as an object outside the formset's queryset. - # 2. The object was already deleted from the database. - if not obj._is_pk_set(): - continue - if form in forms_to_delete: - self.deleted_objects.append(obj) - self.delete_existing(obj, commit=commit) - elif form.has_changed(): - self.changed_objects.append((obj, form.changed_data)) - saved_instances.append(self.save_existing(form, obj, commit=commit)) - if not commit: - self.saved_forms.append(form) - return saved_instances - - def save_new_objects(self, commit=True): - self.new_objects = [] - for form in self.extra_forms: - if not form.has_changed(): - continue - # If someone has marked an add form for deletion, don't save the - # object. - if self.can_delete and self._should_delete_form(form): - continue - self.new_objects.append(self.save_new(form, commit=commit)) - if not commit: - self.saved_forms.append(form) - return self.new_objects - - def add_fields(self, form, index): - """Add a hidden field for the object's primary key.""" - from django.db.models import AutoField, ForeignKey, OneToOneField - - self._pk_field = pk = self.model._meta.pk - # If a pk isn't editable, then it won't be on the form, so we need to - # add it here so we can tell which object is which when we get the - # data back. Generally, pk.editable should be false, but for some - # reason, auto_created pk fields and AutoField's editable attribute is - # True, so check for that as well. - - def pk_is_not_editable(pk): - return ( - (not pk.editable) - or (pk.auto_created or isinstance(pk, AutoField)) - or ( - pk.remote_field - and pk.remote_field.parent_link - and pk_is_not_editable(pk.remote_field.model._meta.pk) - ) - ) - - if pk_is_not_editable(pk) or pk.name not in form.fields: - if form.is_bound: - # If we're adding the related instance, ignore its primary key - # as it could be an auto-generated default which isn't actually - # in the database. - pk_value = None if form.instance._state.adding else form.instance.pk - else: - try: - if index is not None: - pk_value = self.get_queryset()[index].pk - else: - pk_value = None - except IndexError: - pk_value = None - if isinstance(pk, (ForeignKey, OneToOneField)): - qs = pk.remote_field.model._default_manager.get_queryset() - else: - qs = self.model._default_manager.get_queryset() - qs = qs.using(form.instance._state.db) - if form._meta.widgets: - widget = form._meta.widgets.get(self._pk_field.name, HiddenInput) - else: - widget = HiddenInput - form.fields[self._pk_field.name] = ModelChoiceField( - qs, initial=pk_value, required=False, widget=widget - ) - super().add_fields(form, index) - - -def modelformset_factory( - model, - form=ModelForm, - formfield_callback=None, - formset=BaseModelFormSet, - extra=1, - can_delete=False, - can_order=False, - max_num=None, - fields=None, - exclude=None, - widgets=None, - validate_max=False, - localized_fields=None, - labels=None, - help_texts=None, - error_messages=None, - min_num=None, - validate_min=False, - field_classes=None, - absolute_max=None, - can_delete_extra=True, - renderer=None, - edit_only=False, -): - """Return a FormSet class for the given Django model class.""" - meta = getattr(form, "Meta", None) - if ( - getattr(meta, "fields", fields) is None - and getattr(meta, "exclude", exclude) is None - ): - raise ImproperlyConfigured( - "Calling modelformset_factory without defining 'fields' or " - "'exclude' explicitly is prohibited." - ) - - form = modelform_factory( - model, - form=form, - fields=fields, - exclude=exclude, - formfield_callback=formfield_callback, - widgets=widgets, - localized_fields=localized_fields, - labels=labels, - help_texts=help_texts, - error_messages=error_messages, - field_classes=field_classes, - ) - FormSet = formset_factory( - form, - formset, - extra=extra, - min_num=min_num, - max_num=max_num, - can_order=can_order, - can_delete=can_delete, - validate_min=validate_min, - validate_max=validate_max, - absolute_max=absolute_max, - can_delete_extra=can_delete_extra, - renderer=renderer, - ) - FormSet.model = model - FormSet.edit_only = edit_only - return FormSet - - -# InlineFormSets ############################################################# - - -class BaseInlineFormSet(BaseModelFormSet): - """A formset for child objects related to a parent.""" - - def __init__( - self, - data=None, - files=None, - instance=None, - save_as_new=False, - prefix=None, - queryset=None, - **kwargs, - ): - if instance is None: - self.instance = self.fk.remote_field.model() - else: - self.instance = instance - self.save_as_new = save_as_new - if queryset is None: - queryset = self.model._default_manager - if self.instance._is_pk_set(): - qs = queryset.filter(**{self.fk.name: self.instance}) - else: - qs = queryset.none() - self.unique_fields = {self.fk.name} - super().__init__(data, files, prefix=prefix, queryset=qs, **kwargs) - - # Add the generated field to form._meta.fields if it's defined to make - # sure validation isn't skipped on that field. - if self.form._meta.fields and self.fk.name not in self.form._meta.fields: - if isinstance(self.form._meta.fields, tuple): - self.form._meta.fields = list(self.form._meta.fields) - self.form._meta.fields.append(self.fk.name) - - def initial_form_count(self): - if self.save_as_new: - return 0 - return super().initial_form_count() - - def _construct_form(self, i, **kwargs): - form = super()._construct_form(i, **kwargs) - if self.save_as_new: - mutable = getattr(form.data, "_mutable", None) - # Allow modifying an immutable QueryDict. - if mutable is not None: - form.data._mutable = True - # Remove the primary key from the form's data, we are only - # creating new instances - form.data[form.add_prefix(self._pk_field.name)] = None - # Remove the foreign key from the form's data - form.data[form.add_prefix(self.fk.name)] = None - if mutable is not None: - form.data._mutable = mutable - - # Set the fk value here so that the form can do its validation. - fk_value = self.instance.pk - if self.fk.remote_field.field_name != self.fk.remote_field.model._meta.pk.name: - fk_value = getattr(self.instance, self.fk.remote_field.field_name) - fk_value = getattr(fk_value, "pk", fk_value) - setattr(form.instance, self.fk.attname, fk_value) - return form - - @classmethod - def get_default_prefix(cls): - return cls.fk.remote_field.get_accessor_name(model=cls.model).replace("+", "") - - def save_new(self, form, commit=True): - # Ensure the latest copy of the related instance is present on each - # form (it may have been saved after the formset was originally - # instantiated). - setattr(form.instance, self.fk.name, self.instance) - return super().save_new(form, commit=commit) - - def add_fields(self, form, index): - super().add_fields(form, index) - if self._pk_field == self.fk: - name = self._pk_field.name - kwargs = {"pk_field": True} - else: - # The foreign key field might not be on the form, so we poke at the - # Model field to get the label, since we need that for error messages. - name = self.fk.name - kwargs = { - "label": getattr( - form.fields.get(name), "label", capfirst(self.fk.verbose_name) - ) - } - - # The InlineForeignKeyField assumes that the foreign key relation is - # based on the parent model's pk. If this isn't the case, set to_field - # to correctly resolve the initial form value. - if self.fk.remote_field.field_name != self.fk.remote_field.model._meta.pk.name: - kwargs["to_field"] = self.fk.remote_field.field_name - - # If we're adding a new object, ignore a parent's auto-generated key - # as it will be regenerated on the save request. - if self.instance._state.adding: - if kwargs.get("to_field") is not None: - to_field = self.instance._meta.get_field(kwargs["to_field"]) - else: - to_field = self.instance._meta.pk - - if to_field.has_default() and ( - # Don't ignore a parent's auto-generated key if it's not the - # parent model's pk and form data is provided. - to_field.attname == self.fk.remote_field.model._meta.pk.name - or not form.data - ): - setattr(self.instance, to_field.attname, None) - - form.fields[name] = InlineForeignKeyField(self.instance, **kwargs) - - def get_unique_error_message(self, unique_check): - unique_check = [field for field in unique_check if field != self.fk.name] - return super().get_unique_error_message(unique_check) - - -def _get_foreign_key(parent_model, model, fk_name=None, can_fail=False): - """ - Find and return the ForeignKey from model to parent if there is one - (return None if can_fail is True and no such field exists). If fk_name is - provided, assume it is the name of the ForeignKey field. Unless can_fail is - True, raise an exception if there isn't a ForeignKey from model to - parent_model. - """ - # avoid circular import - from django.db.models import ForeignKey - - opts = model._meta - if fk_name: - fks_to_parent = [f for f in opts.fields if f.name == fk_name] - if len(fks_to_parent) == 1: - fk = fks_to_parent[0] - all_parents = (*parent_model._meta.all_parents, parent_model) - if ( - not isinstance(fk, ForeignKey) - or ( - # ForeignKey to proxy models. - fk.remote_field.model._meta.proxy - and fk.remote_field.model._meta.proxy_for_model not in all_parents - ) - or ( - # ForeignKey to concrete models. - not fk.remote_field.model._meta.proxy - and fk.remote_field.model != parent_model - and fk.remote_field.model not in all_parents - ) - ): - raise ValueError( - "fk_name '%s' is not a ForeignKey to '%s'." - % (fk_name, parent_model._meta.label) - ) - elif not fks_to_parent: - raise ValueError( - "'%s' has no field named '%s'." % (model._meta.label, fk_name) - ) - else: - # Try to discover what the ForeignKey from model to parent_model is - all_parents = (*parent_model._meta.all_parents, parent_model) - fks_to_parent = [ - f - for f in opts.fields - if isinstance(f, ForeignKey) - and ( - f.remote_field.model == parent_model - or f.remote_field.model in all_parents - or ( - f.remote_field.model._meta.proxy - and f.remote_field.model._meta.proxy_for_model in all_parents - ) - ) - ] - if len(fks_to_parent) == 1: - fk = fks_to_parent[0] - elif not fks_to_parent: - if can_fail: - return - raise ValueError( - "'%s' has no ForeignKey to '%s'." - % ( - model._meta.label, - parent_model._meta.label, - ) - ) - else: - raise ValueError( - "'%s' has more than one ForeignKey to '%s'. You must specify " - "a 'fk_name' attribute." - % ( - model._meta.label, - parent_model._meta.label, - ) - ) - return fk - - -def inlineformset_factory( - parent_model, - model, - form=ModelForm, - formset=BaseInlineFormSet, - fk_name=None, - fields=None, - exclude=None, - extra=3, - can_order=False, - can_delete=True, - max_num=None, - formfield_callback=None, - widgets=None, - validate_max=False, - localized_fields=None, - labels=None, - help_texts=None, - error_messages=None, - min_num=None, - validate_min=False, - field_classes=None, - absolute_max=None, - can_delete_extra=True, - renderer=None, - edit_only=False, -): - """ - Return an ``InlineFormSet`` for the given kwargs. - - ``fk_name`` must be provided if ``model`` has more than one ``ForeignKey`` - to ``parent_model``. - """ - fk = _get_foreign_key(parent_model, model, fk_name=fk_name) - # enforce a max_num=1 when the foreign key to the parent model is unique. - if fk.unique: - max_num = 1 - kwargs = { - "form": form, - "formfield_callback": formfield_callback, - "formset": formset, - "extra": extra, - "can_delete": can_delete, - "can_order": can_order, - "fields": fields, - "exclude": exclude, - "min_num": min_num, - "max_num": max_num, - "widgets": widgets, - "validate_min": validate_min, - "validate_max": validate_max, - "localized_fields": localized_fields, - "labels": labels, - "help_texts": help_texts, - "error_messages": error_messages, - "field_classes": field_classes, - "absolute_max": absolute_max, - "can_delete_extra": can_delete_extra, - "renderer": renderer, - "edit_only": edit_only, - } - FormSet = modelformset_factory(model, **kwargs) - FormSet.fk = fk - return FormSet - - -# Fields ##################################################################### - - -class InlineForeignKeyField(Field): - """ - A basic integer field that deals with validating the given value to a - given parent instance in an inline. - """ - - widget = HiddenInput - default_error_messages = { - "invalid_choice": _("The inline value did not match the parent instance."), - } - - def __init__(self, parent_instance, *args, pk_field=False, to_field=None, **kwargs): - self.parent_instance = parent_instance - self.pk_field = pk_field - self.to_field = to_field - if self.parent_instance is not None: - if self.to_field: - kwargs["initial"] = getattr(self.parent_instance, self.to_field) - else: - kwargs["initial"] = self.parent_instance.pk - kwargs["required"] = False - super().__init__(*args, **kwargs) - - def clean(self, value): - if value in self.empty_values: - if self.pk_field: - return None - # if there is no value act as we did before. - return self.parent_instance - # ensure the we compare the values as equal types. - if self.to_field: - orig = getattr(self.parent_instance, self.to_field) - else: - orig = self.parent_instance.pk - if str(value) != str(orig): - raise ValidationError( - self.error_messages["invalid_choice"], code="invalid_choice" - ) - return self.parent_instance - - def has_changed(self, initial, data): - return False - - -class ModelChoiceIteratorValue: - def __init__(self, value, instance): - self.value = value - self.instance = instance - - def __str__(self): - return str(self.value) - - def __hash__(self): - return hash(self.value) - - def __eq__(self, other): - if isinstance(other, ModelChoiceIteratorValue): - other = other.value - return self.value == other - - -class ModelChoiceIterator(BaseChoiceIterator): - def __init__(self, field): - self.field = field - self.queryset = field.queryset - - def __iter__(self): - if self.field.empty_label is not None: - yield ("", self.field.empty_label) - queryset = self.queryset - # Can't use iterator() when queryset uses prefetch_related() - if not queryset._prefetch_related_lookups: - queryset = queryset.iterator() - for obj in queryset: - yield self.choice(obj) - - def __len__(self): - # count() adds a query but uses less memory since the QuerySet results - # won't be cached. In most cases, the choices will only be iterated on, - # and __len__() won't be called. - return self.queryset.count() + (1 if self.field.empty_label is not None else 0) - - def __bool__(self): - return self.field.empty_label is not None or self.queryset.exists() - - def choice(self, obj): - return ( - ModelChoiceIteratorValue(self.field.prepare_value(obj), obj), - self.field.label_from_instance(obj), - ) - - -class ModelChoiceField(ChoiceField): - """A ChoiceField whose choices are a model QuerySet.""" - - # This class is a subclass of ChoiceField for purity, but it doesn't - # actually use any of ChoiceField's implementation. - default_error_messages = { - "invalid_choice": _( - "Select a valid choice. That choice is not one of the available choices." - ), - } - iterator = ModelChoiceIterator - - def __init__( - self, - queryset, - *, - empty_label="---------", - required=True, - widget=None, - label=None, - initial=None, - help_text="", - to_field_name=None, - limit_choices_to=None, - blank=False, - **kwargs, - ): - # Call Field instead of ChoiceField __init__() because we don't need - # ChoiceField.__init__(). - Field.__init__( - self, - required=required, - widget=widget, - label=label, - initial=initial, - help_text=help_text, - **kwargs, - ) - if (required and initial is not None) or ( - isinstance(self.widget, RadioSelect) and not blank - ): - self.empty_label = None - else: - self.empty_label = empty_label - self.queryset = queryset - self.limit_choices_to = limit_choices_to # limit the queryset later. - self.to_field_name = to_field_name - - def validate_no_null_characters(self, value): - non_null_character_validator = ProhibitNullCharactersValidator() - return non_null_character_validator(value) - - def get_limit_choices_to(self): - """ - Return ``limit_choices_to`` for this form field. - - If it is a callable, invoke it and return the result. - """ - if callable(self.limit_choices_to): - return self.limit_choices_to() - return self.limit_choices_to - - def __deepcopy__(self, memo): - result = super(ChoiceField, self).__deepcopy__(memo) - # Need to force a new ModelChoiceIterator to be created, bug #11183 - if self.queryset is not None: - result.queryset = self.queryset.all() - return result - - def _get_queryset(self): - return self._queryset - - def _set_queryset(self, queryset): - self._queryset = None if queryset is None else queryset.all() - self.widget.choices = self.choices - - queryset = property(_get_queryset, _set_queryset) - - # this method will be used to create object labels by the QuerySetIterator. - # Override it to customize the label. - def label_from_instance(self, obj): - """ - Convert objects into strings and generate the labels for the choices - presented by this object. Subclasses can override this method to - customize the display of the choices. - """ - return str(obj) - - def _get_choices(self): - # If self._choices is set, then somebody must have manually set - # the property self.choices. In this case, just return self._choices. - if hasattr(self, "_choices"): - return self._choices - - # Otherwise, execute the QuerySet in self.queryset to determine the - # choices dynamically. Return a fresh ModelChoiceIterator that has not been - # consumed. Note that we're instantiating a new ModelChoiceIterator *each* - # time _get_choices() is called (and, thus, each time self.choices is - # accessed) so that we can ensure the QuerySet has not been consumed. This - # construct might look complicated but it allows for lazy evaluation of - # the queryset. - return self.iterator(self) - - choices = property(_get_choices, ChoiceField.choices.fset) - - def prepare_value(self, value): - if hasattr(value, "_meta"): - if self.to_field_name: - return value.serializable_value(self.to_field_name) - else: - return value.pk - return super().prepare_value(value) - - def to_python(self, value): - if value in self.empty_values: - return None - self.validate_no_null_characters(value) - try: - key = self.to_field_name or "pk" - if isinstance(value, self.queryset.model): - value = getattr(value, key) - value = self.queryset.get(**{key: value}) - except (ValueError, TypeError, self.queryset.model.DoesNotExist): - raise ValidationError( - self.error_messages["invalid_choice"], - code="invalid_choice", - params={"value": value}, - ) - return value - - def validate(self, value): - return Field.validate(self, value) - - def has_changed(self, initial, data): - if self.disabled: - return False - initial_value = initial if initial is not None else "" - data_value = data if data is not None else "" - return str(self.prepare_value(initial_value)) != str(data_value) - - -class ModelMultipleChoiceField(ModelChoiceField): - """A MultipleChoiceField whose choices are a model QuerySet.""" - - widget = SelectMultiple - hidden_widget = MultipleHiddenInput - default_error_messages = { - "invalid_list": _("Enter a list of values."), - "invalid_choice": _( - "Select a valid choice. %(value)s is not one of the available choices." - ), - "invalid_pk_value": _("“%(pk)s” is not a valid value."), - } - - def __init__(self, queryset, **kwargs): - super().__init__(queryset, empty_label=None, **kwargs) - - def to_python(self, value): - if not value: - return [] - return list(self._check_values(value)) - - def clean(self, value): - value = self.prepare_value(value) - if self.required and not value: - raise ValidationError(self.error_messages["required"], code="required") - elif not self.required and not value: - return self.queryset.none() - if not isinstance(value, (list, tuple)): - raise ValidationError( - self.error_messages["invalid_list"], - code="invalid_list", - ) - qs = self._check_values(value) - # Since this overrides the inherited ModelChoiceField.clean - # we run custom validators here - self.run_validators(value) - return qs - - def _check_values(self, value): - """ - Given a list of possible PK values, return a QuerySet of the - corresponding objects. Raise a ValidationError if a given value is - invalid (not a valid PK, not in the queryset, etc.) - """ - key = self.to_field_name or "pk" - # deduplicate given values to avoid creating many querysets or - # requiring the database backend deduplicate efficiently. - try: - value = frozenset(value) - except TypeError: - # list of lists isn't hashable, for example - raise ValidationError( - self.error_messages["invalid_list"], - code="invalid_list", - ) - for pk in value: - self.validate_no_null_characters(pk) - try: - self.queryset.filter(**{key: pk}) - except (ValueError, TypeError): - raise ValidationError( - self.error_messages["invalid_pk_value"], - code="invalid_pk_value", - params={"pk": pk}, - ) - qs = self.queryset.filter(**{"%s__in" % key: value}) - pks = {str(getattr(o, key)) for o in qs} - for val in value: - if str(val) not in pks: - raise ValidationError( - self.error_messages["invalid_choice"], - code="invalid_choice", - params={"value": val}, - ) - return qs - - def prepare_value(self, value): - if ( - hasattr(value, "__iter__") - and not isinstance(value, str) - and not hasattr(value, "_meta") - ): - prepare_value = super().prepare_value - return [prepare_value(v) for v in value] - return super().prepare_value(value) - - def has_changed(self, initial, data): - if self.disabled: - return False - if initial is None: - initial = [] - if data is None: - data = [] - if len(initial) != len(data): - return True - initial_set = {str(value) for value in self.prepare_value(initial)} - data_set = {str(value) for value in data} - return data_set != initial_set - - -def modelform_defines_fields(form_class): - return hasattr(form_class, "_meta") and ( - form_class._meta.fields is not None or form_class._meta.exclude is not None - ) diff --git a/.venv/lib/python3.10/site-packages/django/forms/renderers.py b/.venv/lib/python3.10/site-packages/django/forms/renderers.py deleted file mode 100644 index 20eaf26..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/renderers.py +++ /dev/null @@ -1,114 +0,0 @@ -import functools -import warnings -from pathlib import Path - -from django.conf import settings -from django.template.backends.django import DjangoTemplates -from django.template.loader import get_template -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.functional import cached_property -from django.utils.module_loading import import_string - - -@functools.lru_cache -def get_default_renderer(): - renderer_class = import_string(settings.FORM_RENDERER) - return renderer_class() - - -class BaseRenderer: - form_template_name = "django/forms/div.html" - formset_template_name = "django/forms/formsets/div.html" - field_template_name = "django/forms/field.html" - - bound_field_class = None - - def get_template(self, template_name): - raise NotImplementedError("subclasses must implement get_template()") - - def render(self, template_name, context, request=None): - template = self.get_template(template_name) - return template.render(context, request=request).strip() - - -class EngineMixin: - def get_template(self, template_name): - return self.engine.get_template(template_name) - - @cached_property - def engine(self): - return self.backend( - { - "APP_DIRS": True, - "DIRS": [Path(__file__).parent / self.backend.app_dirname], - "NAME": "djangoforms", - "OPTIONS": {}, - } - ) - - -class DjangoTemplates(EngineMixin, BaseRenderer): - """ - Load Django templates from the built-in widget templates in - django/forms/templates and from apps' 'templates' directory. - """ - - backend = DjangoTemplates - - -class Jinja2(EngineMixin, BaseRenderer): - """ - Load Jinja2 templates from the built-in widget templates in - django/forms/jinja2 and from apps' 'jinja2' directory. - """ - - @cached_property - def backend(self): - from django.template.backends.jinja2 import Jinja2 - - return Jinja2 - - -# RemovedInDjango60Warning. -class DjangoDivFormRenderer(DjangoTemplates): - """ - Load Django templates from django/forms/templates and from apps' - 'templates' directory and use the 'div.html' template to render forms and - formsets. - """ - - def __init__(self, *args, **kwargs): - warnings.warn( - "The DjangoDivFormRenderer transitional form renderer is deprecated. Use " - "DjangoTemplates instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) - - -# RemovedInDjango60Warning. -class Jinja2DivFormRenderer(Jinja2): - """ - Load Jinja2 templates from the built-in widget templates in - django/forms/jinja2 and from apps' 'jinja2' directory. - """ - - def __init__(self, *args, **kwargs): - warnings.warn( - "The Jinja2DivFormRenderer transitional form renderer is deprecated. Use " - "Jinja2 instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) - - -class TemplatesSetting(BaseRenderer): - """ - Load templates using template.loader.get_template() which is configured - based on settings.TEMPLATES. - """ - - def get_template(self, template_name): - return get_template(template_name) diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/attrs.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/attrs.html deleted file mode 100644 index 50de36b..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/attrs.html +++ /dev/null @@ -1 +0,0 @@ -{% for name, value in attrs.items %}{% if value is not False %} {{ name }}{% if value is not True %}="{{ value|stringformat:'s' }}"{% endif %}{% endif %}{% endfor %} \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/div.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/div.html deleted file mode 100644 index c20eead..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/div.html +++ /dev/null @@ -1,15 +0,0 @@ -{{ errors }} -{% if errors and not fields %} -
    {% for field in hidden_fields %}{{ field }}{% endfor %}
    -{% endif %} -{% for field, errors in fields %} - - {{ field.as_field_group }} - {% if forloop.last %} - {% for field in hidden_fields %}{{ field }}{% endfor %} - {% endif %} - -{% endfor %} -{% if not fields and not errors %} - {% for field in hidden_fields %}{{ field }}{% endfor %} -{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/dict/default.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/dict/default.html deleted file mode 100644 index 8a833c6..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/dict/default.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/errors/dict/ul.html" %} \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/dict/text.txt b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/dict/text.txt deleted file mode 100644 index dc9fd80..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/dict/text.txt +++ /dev/null @@ -1,3 +0,0 @@ -{% for field, errors in errors %}* {{ field }} -{% for error in errors %} * {{ error }} -{% endfor %}{% endfor %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/dict/ul.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/dict/ul.html deleted file mode 100644 index c16fd65..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/dict/ul.html +++ /dev/null @@ -1 +0,0 @@ -{% if errors %}
      {% for field, error in errors %}
    • {{ field }}{{ error }}
    • {% endfor %}
    {% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/list/default.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/list/default.html deleted file mode 100644 index b174f26..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/list/default.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/errors/list/ul.html" %} \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/list/text.txt b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/list/text.txt deleted file mode 100644 index aa7f870..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/list/text.txt +++ /dev/null @@ -1,2 +0,0 @@ -{% for error in errors %}* {{ error }} -{% endfor %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/list/ul.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/list/ul.html deleted file mode 100644 index c28ce8a..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/errors/list/ul.html +++ /dev/null @@ -1 +0,0 @@ -{% if errors %}
      {% for error in errors %}
    • {{ error }}
    • {% endfor %}
    {% endif %} \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/field.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/field.html deleted file mode 100644 index 791bc49..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/field.html +++ /dev/null @@ -1,9 +0,0 @@ -{% if field.use_fieldset %} - - {% if field.label %}{{ field.legend_tag }}{% endif %} -{% else %} - {% if field.label %}{{ field.label_tag }}{% endif %} -{% endif %} -{% if field.help_text %}
    {{ field.help_text|safe }}
    {% endif %} -{{ field.errors }} -{{ field }}{% if field.use_fieldset %}{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/div.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/div.html deleted file mode 100644 index 9349989..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/div.html +++ /dev/null @@ -1 +0,0 @@ -{{ formset.management_form }}{% for form in formset %}{{ form.as_div }}{% endfor %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/p.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/p.html deleted file mode 100644 index 00c2df6..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/p.html +++ /dev/null @@ -1 +0,0 @@ -{{ formset.management_form }}{% for form in formset %}{{ form.as_p }}{% endfor %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/table.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/table.html deleted file mode 100644 index 4fa5e42..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/table.html +++ /dev/null @@ -1 +0,0 @@ -{{ formset.management_form }}{% for form in formset %}{{ form.as_table }}{% endfor %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/ul.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/ul.html deleted file mode 100644 index 272e129..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/formsets/ul.html +++ /dev/null @@ -1 +0,0 @@ -{{ formset.management_form }}{% for form in formset %}{{ form.as_ul }}{% endfor %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/label.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/label.html deleted file mode 100644 index 0eba630..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/label.html +++ /dev/null @@ -1 +0,0 @@ -{% if use_tag %}<{{ tag }}{% include 'django/forms/attrs.html' %}>{{ label }}{% else %}{{ label }}{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/p.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/p.html deleted file mode 100644 index 89f0a2b..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/p.html +++ /dev/null @@ -1,20 +0,0 @@ -{{ errors }} -{% if errors and not fields %} -

    {% for field in hidden_fields %}{{ field }}{% endfor %}

    -{% endif %} -{% for field, errors in fields %} - {{ errors }} - - {% if field.label %}{{ field.label_tag }}{% endif %} - {{ field }} - {% if field.help_text %} - {{ field.help_text|safe }} - {% endif %} - {% if forloop.last %} - {% for field in hidden_fields %}{{ field }}{% endfor %} - {% endif %} -

    -{% endfor %} -{% if not fields and not errors %} - {% for field in hidden_fields %}{{ field }}{% endfor %} -{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/table.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/table.html deleted file mode 100644 index 4fbd3b9..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/table.html +++ /dev/null @@ -1,29 +0,0 @@ -{% if errors %} - - - {{ errors }} - {% if not fields %} - {% for field in hidden_fields %}{{ field }}{% endfor %} - {% endif %} - - -{% endif %} -{% for field, errors in fields %} - - {% if field.label %}{{ field.label_tag }}{% endif %} - - {{ errors }} - {{ field }} - {% if field.help_text %} -
    - {{ field.help_text|safe }} - {% endif %} - {% if forloop.last %} - {% for field in hidden_fields %}{{ field }}{% endfor %} - {% endif %} - - -{% endfor %} -{% if not fields and not errors %} - {% for field in hidden_fields %}{{ field }}{% endfor %} -{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/ul.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/ul.html deleted file mode 100644 index d78a79a..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/ul.html +++ /dev/null @@ -1,24 +0,0 @@ -{% if errors %} -
  • - {{ errors }} - {% if not fields %} - {% for field in hidden_fields %}{{ field }}{% endfor %} - {% endif %} -
  • -{% endif %} -{% for field, errors in fields %} - - {{ errors }} - {% if field.label %}{{ field.label_tag }}{% endif %} - {{ field }} - {% if field.help_text %} - {{ field.help_text|safe }} - {% endif %} - {% if forloop.last %} - {% for field in hidden_fields %}{{ field }}{% endfor %} - {% endif %} - -{% endfor %} -{% if not fields and not errors %} - {% for field in hidden_fields %}{{ field }}{% endfor %} -{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/attrs.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/attrs.html deleted file mode 100644 index 7a5592a..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/attrs.html +++ /dev/null @@ -1 +0,0 @@ -{% for name, value in widget.attrs.items %}{% if value is not False %} {{ name }}{% if value is not True %}="{{ value|stringformat:'s' }}"{% endif %}{% endif %}{% endfor %} \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/checkbox.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/checkbox.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/checkbox.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/checkbox_option.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/checkbox_option.html deleted file mode 100644 index bb9acba..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/checkbox_option.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input_option.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/checkbox_select.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/checkbox_select.html deleted file mode 100644 index 780899a..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/checkbox_select.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/multiple_input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/clearable_file_input.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/clearable_file_input.html deleted file mode 100644 index 4f3a936..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/clearable_file_input.html +++ /dev/null @@ -1,5 +0,0 @@ -{% if widget.is_initial %}{{ widget.initial_text }}: {{ widget.value }}{% if not widget.required %} - -{% endif %}
    -{{ widget.input_text }}:{% endif %} - diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/color.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/color.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/color.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/date.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/date.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/date.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/datetime.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/datetime.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/datetime.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/email.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/email.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/email.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/file.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/file.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/file.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/hidden.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/hidden.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/hidden.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/input.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/input.html deleted file mode 100644 index 9010a92..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/input.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/input_option.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/input_option.html deleted file mode 100644 index 48cd65b..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/input_option.html +++ /dev/null @@ -1 +0,0 @@ -{% if widget.wrap_label %}{% endif %}{% include "django/forms/widgets/input.html" %}{% if widget.wrap_label %} {{ widget.label }}{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/multiple_hidden.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/multiple_hidden.html deleted file mode 100644 index b9695de..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/multiple_hidden.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/multiwidget.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/multiple_input.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/multiple_input.html deleted file mode 100644 index 2a0fec6..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/multiple_input.html +++ /dev/null @@ -1,5 +0,0 @@ -{% with id=widget.attrs.id %}{% for group, options, index in widget.optgroups %}{% if group %} -
    {% endif %}{% for option in options %}
    - {% include option.template_name with widget=option %}
    {% endfor %}{% if group %} -
    {% endif %}{% endfor %} -{% endwith %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/multiwidget.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/multiwidget.html deleted file mode 100644 index 7e687a1..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/multiwidget.html +++ /dev/null @@ -1 +0,0 @@ -{% spaceless %}{% for widget in widget.subwidgets %}{% include widget.template_name %}{% endfor %}{% endspaceless %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/number.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/number.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/number.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/password.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/password.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/password.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/radio.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/radio.html deleted file mode 100644 index 780899a..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/radio.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/multiple_input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/radio_option.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/radio_option.html deleted file mode 100644 index bb9acba..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/radio_option.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input_option.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/search.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/search.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/search.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/select.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/select.html deleted file mode 100644 index 4d1f6b0..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/select.html +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/select_date.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/select_date.html deleted file mode 100644 index 32fda82..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/select_date.html +++ /dev/null @@ -1 +0,0 @@ -{% include 'django/forms/widgets/multiwidget.html' %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/select_option.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/select_option.html deleted file mode 100644 index 8d31961..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/select_option.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/splitdatetime.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/splitdatetime.html deleted file mode 100644 index 32fda82..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/splitdatetime.html +++ /dev/null @@ -1 +0,0 @@ -{% include 'django/forms/widgets/multiwidget.html' %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/splithiddendatetime.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/splithiddendatetime.html deleted file mode 100644 index 32fda82..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/splithiddendatetime.html +++ /dev/null @@ -1 +0,0 @@ -{% include 'django/forms/widgets/multiwidget.html' %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/tel.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/tel.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/tel.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/text.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/text.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/text.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/textarea.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/textarea.html deleted file mode 100644 index b86766c..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/textarea.html +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/time.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/time.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/time.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/url.html b/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/url.html deleted file mode 100644 index 08b1e61..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/templates/django/forms/widgets/url.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/input.html" %} diff --git a/.venv/lib/python3.10/site-packages/django/forms/utils.py b/.venv/lib/python3.10/site-packages/django/forms/utils.py deleted file mode 100644 index 27eabe5..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/utils.py +++ /dev/null @@ -1,246 +0,0 @@ -import json -from collections import UserList - -from django.conf import settings -from django.core.exceptions import ValidationError -from django.forms.renderers import get_default_renderer -from django.utils import timezone -from django.utils.html import escape, format_html_join -from django.utils.safestring import mark_safe -from django.utils.translation import gettext_lazy as _ - - -def pretty_name(name): - """Convert 'first_name' to 'First name'.""" - if not name: - return "" - return name.replace("_", " ").capitalize() - - -def flatatt(attrs): - """ - Convert a dictionary of attributes to a single string. - The returned string will contain a leading space followed by key="value", - XML-style pairs. In the case of a boolean value, the key will appear - without a value. It is assumed that the keys do not need to be - XML-escaped. If the passed dictionary is empty, then return an empty - string. - - The result is passed through 'mark_safe' (by way of 'format_html_join'). - """ - key_value_attrs = [] - boolean_attrs = [] - for attr, value in attrs.items(): - if isinstance(value, bool): - if value: - boolean_attrs.append((attr,)) - elif value is not None: - key_value_attrs.append((attr, value)) - - return format_html_join("", ' {}="{}"', sorted(key_value_attrs)) + format_html_join( - "", " {}", sorted(boolean_attrs) - ) - - -class RenderableMixin: - def get_context(self): - raise NotImplementedError( - "Subclasses of RenderableMixin must provide a get_context() method." - ) - - def render(self, template_name=None, context=None, renderer=None): - renderer = renderer or self.renderer - template = template_name or self.template_name - context = context or self.get_context() - return mark_safe(renderer.render(template, context)) - - __str__ = render - __html__ = render - - -class RenderableFieldMixin(RenderableMixin): - def as_field_group(self): - return self.render() - - def as_hidden(self): - raise NotImplementedError( - "Subclasses of RenderableFieldMixin must provide an as_hidden() method." - ) - - def as_widget(self): - raise NotImplementedError( - "Subclasses of RenderableFieldMixin must provide an as_widget() method." - ) - - def __str__(self): - """Render this field as an HTML widget.""" - if self.field.show_hidden_initial: - return self.as_widget() + self.as_hidden(only_initial=True) - return self.as_widget() - - __html__ = __str__ - - -class RenderableFormMixin(RenderableMixin): - def as_p(self): - """Render as

    elements.""" - return self.render(self.template_name_p) - - def as_table(self): - """Render as elements excluding the surrounding tag.""" - return self.render(self.template_name_table) - - def as_ul(self): - """Render as
  • elements excluding the surrounding
      tag.""" - return self.render(self.template_name_ul) - - def as_div(self): - """Render as
      elements.""" - return self.render(self.template_name_div) - - -class RenderableErrorMixin(RenderableMixin): - def as_json(self, escape_html=False): - return json.dumps(self.get_json_data(escape_html)) - - def as_text(self): - return self.render(self.template_name_text) - - def as_ul(self): - return self.render(self.template_name_ul) - - -class ErrorDict(dict, RenderableErrorMixin): - """ - A collection of errors that knows how to display itself in various formats. - - The dictionary keys are the field names, and the values are the errors. - """ - - template_name = "django/forms/errors/dict/default.html" - template_name_text = "django/forms/errors/dict/text.txt" - template_name_ul = "django/forms/errors/dict/ul.html" - - def __init__(self, *args, renderer=None, **kwargs): - super().__init__(*args, **kwargs) - self.renderer = renderer or get_default_renderer() - - def as_data(self): - return {f: e.as_data() for f, e in self.items()} - - def get_json_data(self, escape_html=False): - return {f: e.get_json_data(escape_html) for f, e in self.items()} - - def get_context(self): - return { - "errors": self.items(), - "error_class": "errorlist", - } - - -class ErrorList(UserList, list, RenderableErrorMixin): - """ - A collection of errors that knows how to display itself in various formats. - """ - - template_name = "django/forms/errors/list/default.html" - template_name_text = "django/forms/errors/list/text.txt" - template_name_ul = "django/forms/errors/list/ul.html" - - def __init__(self, initlist=None, error_class=None, renderer=None, field_id=None): - super().__init__(initlist) - - if error_class is None: - self.error_class = "errorlist" - else: - self.error_class = "errorlist {}".format(error_class) - self.renderer = renderer or get_default_renderer() - self.field_id = field_id - - def as_data(self): - return ValidationError(self.data).error_list - - def copy(self): - copy = super().copy() - copy.error_class = self.error_class - copy.renderer = self.renderer - return copy - - def get_json_data(self, escape_html=False): - errors = [] - for error in self.as_data(): - message = next(iter(error)) - errors.append( - { - "message": escape(message) if escape_html else message, - "code": error.code or "", - } - ) - return errors - - def get_context(self): - return { - "errors": self, - "error_class": self.error_class, - } - - def __repr__(self): - return repr(list(self)) - - def __contains__(self, item): - return item in list(self) - - def __eq__(self, other): - return list(self) == other - - def __getitem__(self, i): - error = self.data[i] - if isinstance(error, ValidationError): - return next(iter(error)) - return error - - def __reduce_ex__(self, *args, **kwargs): - # The `list` reduce function returns an iterator as the fourth element - # that is normally used for repopulating. Since we only inherit from - # `list` for `isinstance` backward compatibility (Refs #17413) we - # nullify this iterator as it would otherwise result in duplicate - # entries. (Refs #23594) - info = super(UserList, self).__reduce_ex__(*args, **kwargs) - return info[:3] + (None, None) - - -# Utilities for time zone support in DateTimeField et al. - - -def from_current_timezone(value): - """ - When time zone support is enabled, convert naive datetimes - entered in the current time zone to aware datetimes. - """ - if settings.USE_TZ and value is not None and timezone.is_naive(value): - current_timezone = timezone.get_current_timezone() - try: - if timezone._datetime_ambiguous_or_imaginary(value, current_timezone): - raise ValueError("Ambiguous or non-existent time.") - return timezone.make_aware(value, current_timezone) - except Exception as exc: - raise ValidationError( - _( - "%(datetime)s couldn’t be interpreted " - "in time zone %(current_timezone)s; it " - "may be ambiguous or it may not exist." - ), - code="ambiguous_timezone", - params={"datetime": value, "current_timezone": current_timezone}, - ) from exc - return value - - -def to_current_timezone(value): - """ - When time zone support is enabled, convert aware datetimes - to naive datetimes in the current time zone for display. - """ - if settings.USE_TZ and value is not None and timezone.is_aware(value): - return timezone.make_naive(value) - return value diff --git a/.venv/lib/python3.10/site-packages/django/forms/widgets.py b/.venv/lib/python3.10/site-packages/django/forms/widgets.py deleted file mode 100644 index 9b5ad1b..0000000 --- a/.venv/lib/python3.10/site-packages/django/forms/widgets.py +++ /dev/null @@ -1,1276 +0,0 @@ -""" -HTML Widget classes -""" - -import copy -import datetime -import warnings -from collections import defaultdict -from graphlib import CycleError, TopologicalSorter -from itertools import chain - -from django.forms.utils import flatatt, to_current_timezone -from django.templatetags.static import static -from django.utils import formats -from django.utils.choices import normalize_choices -from django.utils.dates import MONTHS -from django.utils.formats import get_format -from django.utils.html import format_html, html_safe -from django.utils.regex_helper import _lazy_re_compile -from django.utils.safestring import mark_safe -from django.utils.translation import gettext_lazy as _ - -from .renderers import get_default_renderer - -__all__ = ( - "Script", - "Media", - "MediaDefiningClass", - "Widget", - "TextInput", - "NumberInput", - "EmailInput", - "URLInput", - "ColorInput", - "SearchInput", - "TelInput", - "PasswordInput", - "HiddenInput", - "MultipleHiddenInput", - "FileInput", - "ClearableFileInput", - "Textarea", - "DateInput", - "DateTimeInput", - "TimeInput", - "CheckboxInput", - "Select", - "NullBooleanSelect", - "SelectMultiple", - "RadioSelect", - "CheckboxSelectMultiple", - "MultiWidget", - "SplitDateTimeWidget", - "SplitHiddenDateTimeWidget", - "SelectDateWidget", -) - -MEDIA_TYPES = ("css", "js") - - -class MediaOrderConflictWarning(RuntimeWarning): - pass - - -@html_safe -class MediaAsset: - element_template = "{path}" - - def __init__(self, path, **attributes): - self._path = path - self.attributes = attributes - - def __eq__(self, other): - # Compare the path only, to ensure performant comparison in Media.merge. - return (self.__class__ is other.__class__ and self.path == other.path) or ( - isinstance(other, str) and self._path == other - ) - - def __hash__(self): - # Hash the path only, to ensure performant comparison in Media.merge. - return hash(self._path) - - def __str__(self): - return format_html( - self.element_template, - path=self.path, - attributes=flatatt(self.attributes), - ) - - def __repr__(self): - return f"{type(self).__qualname__}({self._path!r})" - - @property - def path(self): - """ - Ensure an absolute path. - Relative paths are resolved via the {% static %} template tag. - """ - if self._path.startswith(("http://", "https://", "/")): - return self._path - return static(self._path) - - -class Script(MediaAsset): - element_template = '' - - def __init__(self, src, **attributes): - # Alter the signature to allow src to be passed as a keyword argument. - super().__init__(src, **attributes) - - -@html_safe -class Media: - def __init__(self, media=None, css=None, js=None): - if media is not None: - css = getattr(media, "css", {}) - js = getattr(media, "js", []) - else: - if css is None: - css = {} - if js is None: - js = [] - self._css_lists = [css] - self._js_lists = [js] - - def __repr__(self): - return "Media(css=%r, js=%r)" % (self._css, self._js) - - def __str__(self): - return self.render() - - @property - def _css(self): - css = defaultdict(list) - for css_list in self._css_lists: - for medium, sublist in css_list.items(): - css[medium].append(sublist) - return {medium: self.merge(*lists) for medium, lists in css.items()} - - @property - def _js(self): - return self.merge(*self._js_lists) - - def render(self): - return mark_safe( - "\n".join( - chain.from_iterable( - getattr(self, "render_" + name)() for name in MEDIA_TYPES - ) - ) - ) - - def render_js(self): - return [ - ( - path.__html__() - if hasattr(path, "__html__") - else format_html('', self.absolute_path(path)) - ) - for path in self._js - ] - - def render_css(self): - # To keep rendering order consistent, we can't just iterate over items(). - # We need to sort the keys, and iterate over the sorted list. - media = sorted(self._css) - return chain.from_iterable( - [ - ( - path.__html__() - if hasattr(path, "__html__") - else format_html( - '', - self.absolute_path(path), - medium, - ) - ) - for path in self._css[medium] - ] - for medium in media - ) - - def absolute_path(self, path): - """ - Given a relative or absolute path to a static asset, return an absolute - path. An absolute path will be returned unchanged while a relative path - will be passed to django.templatetags.static.static(). - """ - if path.startswith(("http://", "https://", "/")): - return path - return static(path) - - def __getitem__(self, name): - """Return a Media object that only contains media of the given type.""" - if name in MEDIA_TYPES: - return Media(**{str(name): getattr(self, "_" + name)}) - raise KeyError('Unknown media type "%s"' % name) - - @staticmethod - def merge(*lists): - """ - Merge lists while trying to keep the relative order of the elements. - Warn if the lists have the same elements in a different relative order. - - For static assets it can be important to have them included in the DOM - in a certain order. In JavaScript you may not be able to reference a - global or in CSS you might want to override a style. - """ - ts = TopologicalSorter() - for head, *tail in filter(None, lists): - ts.add(head) # Ensure that the first items are included. - for item in tail: - if head != item: # Avoid circular dependency to self. - ts.add(item, head) - head = item - try: - return list(ts.static_order()) - except CycleError: - warnings.warn( - "Detected duplicate Media files in an opposite order: {}".format( - ", ".join(repr(list_) for list_ in lists) - ), - MediaOrderConflictWarning, - ) - return list(dict.fromkeys(chain.from_iterable(filter(None, lists)))) - - def __add__(self, other): - combined = Media() - combined._css_lists = self._css_lists[:] - combined._js_lists = self._js_lists[:] - for item in other._css_lists: - if item and item not in self._css_lists: - combined._css_lists.append(item) - for item in other._js_lists: - if item and item not in self._js_lists: - combined._js_lists.append(item) - return combined - - -def media_property(cls): - def _media(self): - # Get the media property of the superclass, if it exists - sup_cls = super(cls, self) - try: - base = sup_cls.media - except AttributeError: - base = Media() - - # Get the media definition for this class - definition = getattr(cls, "Media", None) - if definition: - extend = getattr(definition, "extend", True) - if extend: - if extend is True: - m = base - else: - m = Media() - for medium in extend: - m += base[medium] - return m + Media(definition) - return Media(definition) - return base - - return property(_media) - - -class MediaDefiningClass(type): - """ - Metaclass for classes that can have media definitions. - """ - - def __new__(mcs, name, bases, attrs): - new_class = super().__new__(mcs, name, bases, attrs) - - if "media" not in attrs: - new_class.media = media_property(new_class) - - return new_class - - -class Widget(metaclass=MediaDefiningClass): - needs_multipart_form = False # Determines does this widget need multipart form - is_localized = False - is_required = False - supports_microseconds = True - use_fieldset = False - - def __init__(self, attrs=None): - self.attrs = {} if attrs is None else attrs.copy() - - def __deepcopy__(self, memo): - obj = copy.copy(self) - obj.attrs = self.attrs.copy() - memo[id(self)] = obj - return obj - - @property - def is_hidden(self): - return self.input_type == "hidden" if hasattr(self, "input_type") else False - - def subwidgets(self, name, value, attrs=None): - context = self.get_context(name, value, attrs) - yield context["widget"] - - def format_value(self, value): - """ - Return a value as it should appear when rendered in a template. - """ - if value == "" or value is None: - return None - if self.is_localized: - return formats.localize_input(value) - return str(value) - - def get_context(self, name, value, attrs): - return { - "widget": { - "name": name, - "is_hidden": self.is_hidden, - "required": self.is_required, - "value": self.format_value(value), - "attrs": self.build_attrs(self.attrs, attrs), - "template_name": self.template_name, - }, - } - - def render(self, name, value, attrs=None, renderer=None): - """Render the widget as an HTML string.""" - context = self.get_context(name, value, attrs) - return self._render(self.template_name, context, renderer) - - def _render(self, template_name, context, renderer=None): - if renderer is None: - renderer = get_default_renderer() - return mark_safe(renderer.render(template_name, context)) - - def build_attrs(self, base_attrs, extra_attrs=None): - """Build an attribute dictionary.""" - return {**base_attrs, **(extra_attrs or {})} - - def value_from_datadict(self, data, files, name): - """ - Given a dictionary of data and this widget's name, return the value - of this widget or None if it's not provided. - """ - return data.get(name) - - def value_omitted_from_data(self, data, files, name): - return name not in data - - def id_for_label(self, id_): - """ - Return the HTML ID attribute of this Widget for use by a
  • - - - - - - - - - {% if raising_view_name %} - - - - - {% endif %} -
    Request Method:{{ request.META.REQUEST_METHOD }}
    Request URL:{{ request.build_absolute_uri }}
    Raised by:{{ raising_view_name }}
    - - -

    - {% if urlpatterns %} -

    - Using the URLconf defined in {{ urlconf }}, - Django tried these URL patterns, in this order: -

    -
      - {% for pattern in urlpatterns %} -
    1. - {% for pat in pattern %} - - {{ pat.pattern }} - {% if forloop.last and pat.name %}[name='{{ pat.name }}']{% endif %} - - {% endfor %} -
    2. - {% endfor %} -
    -

    - {% if request_path %} - The current path, {{ request_path }}, - {% else %} - The empty path - {% endif %} - {% if resolved %}matched the last one.{% else %}didn’t match any of these.{% endif %} -

    - {% endif %} -
    - -
    -

    - You’re seeing this error because you have DEBUG = True in - your Django settings file. Change that to False, and Django - will display a standard 404 page. -

    -
    - - diff --git a/.venv/lib/python3.10/site-packages/django/views/templates/technical_500.html b/.venv/lib/python3.10/site-packages/django/views/templates/technical_500.html deleted file mode 100644 index a2fc841..0000000 --- a/.venv/lib/python3.10/site-packages/django/views/templates/technical_500.html +++ /dev/null @@ -1,497 +0,0 @@ - - - - - - {% if exception_type %}{{ exception_type }}{% else %}Report{% endif %} - {% if request %} at {{ request.path_info }}{% endif %} - - {% if not is_email %} - - {% endif %} - - -
    -

    {% if exception_type %}{{ exception_type }}{% else %}Report{% endif %} - {% if request %} at {{ request.path_info }}{% endif %}

    -
    {% if exception_value %}{{ exception_value|force_escape }}{% if exception_notes %}{{ exception_notes }}{% endif %}{% else %}No exception message supplied{% endif %}
    - -{% if request %} - - - - - - - - -{% endif %} - - - - -{% if exception_type %} - - - - -{% endif %} -{% if exception_type and exception_value %} - - - - -{% endif %} -{% if lastframe %} - - - - -{% endif %} -{% if raising_view_name %} - - - - -{% endif %} - - - - - - - - - - - - - - - - -
    Request Method:{{ request.META.REQUEST_METHOD }}
    Request URL:{{ request_insecure_uri }}
    Django Version:{{ django_version_info }}
    Exception Type:{{ exception_type }}
    Exception Value:
    {{ exception_value|force_escape }}
    Exception Location:{{ lastframe.filename }}, line {{ lastframe.lineno }}, in {{ lastframe.function }}
    Raised during:{{ raising_view_name }}
    Python Executable:{{ sys_executable }}
    Python Version:{{ sys_version_info }}
    Python Path:
    {{ sys_path|pprint }}
    Server time:{{server_time|date:"r"}}
    -
    - -
    -{% if unicode_hint %} -
    -

    Unicode error hint

    -

    The string that could not be encoded/decoded was: {{ unicode_hint }}

    -
    -{% endif %} -{% if template_does_not_exist %} -
    -

    Template-loader postmortem

    - {% if postmortem %} -

    Django tried loading these templates, in this order:

    - {% for entry in postmortem %} -

    Using engine {{ entry.backend.name }}:

    -
      - {% if entry.tried %} - {% for attempt in entry.tried %} -
    • {{ attempt.0.loader_name }}: {{ attempt.0.name }} ({{ attempt.1 }})
    • - {% endfor %} - {% else %} -
    • This engine did not provide a list of tried templates.
    • - {% endif %} -
    - {% endfor %} - {% else %} -

    No templates were found because your 'TEMPLATES' setting is not configured.

    - {% endif %} -
    -{% endif %} -{% if template_info %} -
    -

    Error during template rendering

    -

    In template {{ template_info.name }}, error at line {{ template_info.line }}

    -

    {{ template_info.message|force_escape }}

    - - {% for source_line in template_info.source_lines %} - {% if source_line.0 == template_info.line %} - - - - {% else %} - - - {% endif %} - {% endfor %} -
    {{ source_line.0 }}{{ template_info.before }}{{ template_info.during }}{{ template_info.after }}
    {{ source_line.0 }}{{ source_line.1 }}
    -
    -{% endif %} -{% if frames %} -
    -

    Traceback{% if not is_email %} - Switch to copy-and-paste view{% endif %} -

    -
    -
      - {% for frame in frames %} - {% ifchanged frame.exc_cause %}{% if frame.exc_cause %} -
    • - {% if frame.exc_cause_explicit %} - The above exception ({{ frame.exc_cause|force_escape }}) was the direct cause of the following exception: - {% else %} - During handling of the above exception ({{ frame.exc_cause|force_escape }}), another exception occurred: - {% endif %} -

    • - {% endif %}{% endifchanged %} -
    • - {% if frame.tb %} - {{ frame.filename }}, line {{ frame.lineno }}, in {{ frame.function }} - {% elif forloop.first %} - None - {% else %} - Traceback: None - {% endif %} - - {% if frame.context_line %} -
      - {% if frame.pre_context and not is_email %} -
        - {% for line in frame.pre_context %} -
      1. {{ line }}
      2. - {% endfor %} -
      - {% endif %} -
        -
      1. {{ frame.context_line }}{{ frame.colno }}
        {% if not is_email %} {% endif %}
      2. -
      - {% if frame.post_context and not is_email %} -
        - {% for line in frame.post_context %} -
      1. {{ line }}
      2. - {% endfor %} -
      - {% endif %} -
      - {% endif %} - - {% if frame.vars %} - {% if is_email %} -
      -

      Local Vars

      -
      - {% else %} -
      - Local vars - {% endif %} - - - - - - - - - {% for var in frame.vars|dictsort:0 %} - - - - - {% endfor %} - -
      VariableValue
      {{ var.0 }}
      {{ var.1 }}
      - {% if not is_email %}
      {% endif %} - {% endif %} -
    • - {% endfor %} -
    -
    -{% if not is_email %} -
    -
    - - - - - -

    - -
    -
    -{% endif %} -
    -{% endif %} - -
    -

    Request information

    - -{% if request %} - {% if user_str %} -

    USER

    -

    {{ user_str }}

    - {% endif %} - -

    GET

    - {% if request.GET %} - - - - - - - - - {% for k, v in request_GET_items %} - - - - - {% endfor %} - -
    VariableValue
    {{ k }}
    {{ v|pprint }}
    - {% else %} -

    No GET data

    - {% endif %} - -

    POST

    - {% if filtered_POST_items %} - - - - - - - - - {% for k, v in filtered_POST_items %} - - - - - {% endfor %} - -
    VariableValue
    {{ k }}
    {{ v|pprint }}
    - {% else %} -

    No POST data

    - {% endif %} - -

    FILES

    - {% if request.FILES %} - - - - - - - - - {% for k, v in request_FILES_items %} - - - - - {% endfor %} - -
    VariableValue
    {{ k }}
    {{ v|pprint }}
    - {% else %} -

    No FILES data

    - {% endif %} - - - {% if request.COOKIES %} - - - - - - - - - {% for k, v in request_COOKIES_items %} - - - - - {% endfor %} - -
    VariableValue
    {{ k }}
    {{ v|pprint }}
    - {% else %} -

    No cookie data

    - {% endif %} - -

    META

    - - - - - - - - - {% for k, v in request_meta.items|dictsort:0 %} - - - - - {% endfor %} - -
    VariableValue
    {{ k }}
    {{ v|pprint }}
    -{% else %} -

    Request data not supplied

    -{% endif %} - -

    Settings

    -

    Using settings module {{ settings.SETTINGS_MODULE }}

    - - - - - - - - - {% for k, v in settings.items|dictsort:0 %} - - - - - {% endfor %} - -
    SettingValue
    {{ k }}
    {{ v|pprint }}
    - -
    -
    - -{% if not is_email %} -
    -

    - You’re seeing this error because you have DEBUG = True in your - Django settings file. Change that to False, and Django will - display a standard page generated by the handler for this status code. -

    -
    -{% endif %} - - diff --git a/.venv/lib/python3.10/site-packages/django/views/templates/technical_500.txt b/.venv/lib/python3.10/site-packages/django/views/templates/technical_500.txt deleted file mode 100644 index 5a75324..0000000 --- a/.venv/lib/python3.10/site-packages/django/views/templates/technical_500.txt +++ /dev/null @@ -1,66 +0,0 @@ -{% firstof exception_type 'Report' %}{% if request %} at {{ request.path_info }}{% endif %} -{% firstof exception_value 'No exception message supplied' %} -{% if request %} -Request Method: {{ request.META.REQUEST_METHOD }} -Request URL: {{ request_insecure_uri }}{% endif %} -Django Version: {{ django_version_info }} -Python Executable: {{ sys_executable }} -Python Version: {{ sys_version_info }} -Python Path: {{ sys_path }} -Server time: {{server_time|date:"r"}} -Installed Applications: -{{ settings.INSTALLED_APPS|pprint }} -Installed Middleware: -{{ settings.MIDDLEWARE|pprint }} -{% if template_does_not_exist %}Template loader postmortem -{% if postmortem %}Django tried loading these templates, in this order: -{% for entry in postmortem %} -Using engine {{ entry.backend.name }}: -{% if entry.tried %}{% for attempt in entry.tried %} * {{ attempt.0.loader_name }}: {{ attempt.0.name }} ({{ attempt.1 }}) -{% endfor %}{% else %} This engine did not provide a list of tried templates. -{% endif %}{% endfor %} -{% else %}No templates were found because your 'TEMPLATES' setting is not configured. -{% endif %} -{% endif %}{% if template_info %} -Template error: -In template {{ template_info.name }}, error at line {{ template_info.line }} - {{ template_info.message }} -{% for source_line in template_info.source_lines %}{% if source_line.0 == template_info.line %} {{ source_line.0 }} : {{ template_info.before }} {{ template_info.during }} {{ template_info.after }}{% else %} {{ source_line.0 }} : {{ source_line.1 }}{% endif %}{% endfor %}{% endif %}{% if frames %} - -Traceback (most recent call last): -{% for frame in frames %}{% ifchanged frame.exc_cause %}{% if frame.exc_cause %} -{% if frame.exc_cause_explicit %}The above exception ({{ frame.exc_cause }}) was the direct cause of the following exception:{% else %}During handling of the above exception ({{ frame.exc_cause }}), another exception occurred:{% endif %} -{% endif %}{% endifchanged %} {% if frame.tb %}File "{{ frame.filename }}"{% if frame.context_line %}, line {{ frame.lineno }}{% endif %}, in {{ frame.function }} -{% if frame.context_line %} {% spaceless %}{{ frame.context_line }}{% endspaceless %}{{ frame.tb_area_colno }}{% endif %}{% elif forloop.first %}None{% else %}Traceback: None{% endif %} -{% endfor %} -{% if exception_type %}Exception Type: {{ exception_type }}{% if request %} at {{ request.path_info }}{% endif %} -{% if exception_value %}Exception Value: {{ exception_value }}{% endif %}{% if exception_notes %}{{ exception_notes }}{% endif %}{% endif %}{% endif %} -{% if raising_view_name %}Raised during: {{ raising_view_name }}{% endif %} -{% if request %}Request information: -{% if user_str %}USER: {{ user_str }}{% endif %} - -GET:{% for k, v in request_GET_items %} -{{ k }} = {{ v|stringformat:"r" }}{% empty %} No GET data{% endfor %} - -POST:{% for k, v in filtered_POST_items %} -{{ k }} = {{ v|stringformat:"r" }}{% empty %} No POST data{% endfor %} - -FILES:{% for k, v in request_FILES_items %} -{{ k }} = {{ v|stringformat:"r" }}{% empty %} No FILES data{% endfor %} - -COOKIES:{% for k, v in request_COOKIES_items %} -{{ k }} = {{ v|stringformat:"r" }}{% empty %} No cookie data{% endfor %} - -META:{% for k, v in request_meta.items|dictsort:0 %} -{{ k }} = {{ v|stringformat:"r" }}{% endfor %} -{% else %}Request data not supplied -{% endif %} -Settings: -Using settings module {{ settings.SETTINGS_MODULE }}{% for k, v in settings.items|dictsort:0 %} -{{ k }} = {{ v|stringformat:"r" }}{% endfor %} - -{% if not is_email %} -You’re seeing this error because you have DEBUG = True in your -Django settings file. Change that to False, and Django will -display a standard page generated by the handler for this status code. -{% endif %} diff --git a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/LICENSE b/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/LICENSE deleted file mode 100644 index 68df125..0000000 --- a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Otto Yiu (https://ottoyiu.com) and other contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/METADATA b/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/METADATA deleted file mode 100644 index 11c74c2..0000000 --- a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/METADATA +++ /dev/null @@ -1,441 +0,0 @@ -Metadata-Version: 2.2 -Name: django-cors-headers -Version: 4.7.0 -Summary: django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS). -Author-email: Otto Yiu -Maintainer-email: Adam Johnson -Project-URL: Changelog, https://github.com/adamchainz/django-cors-headers/blob/main/CHANGELOG.rst -Project-URL: Funding, https://adamj.eu/books/ -Project-URL: Repository, https://github.com/adamchainz/django-cors-headers -Keywords: api,cors,django,middleware,rest -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Framework :: Django :: 4.2 -Classifier: Framework :: Django :: 5.0 -Classifier: Framework :: Django :: 5.1 -Classifier: Framework :: Django :: 5.2 -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Natural Language :: English -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Typing :: Typed -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: asgiref>=3.6 -Requires-Dist: django>=4.2 - -=================== -django-cors-headers -=================== - -.. image:: https://img.shields.io/github/actions/workflow/status/adamchainz/django-cors-headers/main.yml.svg?branch=main&style=for-the-badge - :target: https://github.com/adamchainz/django-cors-headers/actions?workflow=CI - -.. image:: https://img.shields.io/badge/Coverage-100%25-success?style=for-the-badge - :target: https://github.com/adamchainz/django-cors-headers/actions?workflow=CI - -.. image:: https://img.shields.io/pypi/v/django-cors-headers.svg?style=for-the-badge - :target: https://pypi.org/project/django-cors-headers/ - -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge - :target: https://github.com/psf/black - -.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge - :target: https://github.com/pre-commit/pre-commit - :alt: pre-commit - -A Django App that adds Cross-Origin Resource Sharing (CORS) headers to -responses. This allows in-browser requests to your Django application from -other origins. - ----- - -**Improve your Django and Git skills** with `my books `__. - ----- - -About CORS ----------- - -Adding CORS headers allows your resources to be accessed on other domains. It's -important you understand the implications before adding the headers, since you -could be unintentionally opening up your site's private data to others. - -Some good resources to read on the subject are: - -* Julia Evans' `introductory comic `__ and - `educational quiz `__. -* Jake Archibald’s `How to win at CORS `__ -* The `MDN Article `_ -* The `web.dev Article `_ -* The `Wikipedia Page `_ - -Requirements ------------- - -Python 3.9 to 3.13 supported. - -Django 4.2 to 5.2 supported. - -Setup ------ - -Install from **pip**: - -.. code-block:: sh - - python -m pip install django-cors-headers - -and then add it to your installed apps: - -.. code-block:: python - - INSTALLED_APPS = [ - ..., - "corsheaders", - ..., - ] - -Make sure you add the trailing comma or you might get a ``ModuleNotFoundError`` -(see `this blog -post `__). - -You will also need to add a middleware class to listen in on responses: - -.. code-block:: python - - MIDDLEWARE = [ - ..., - "corsheaders.middleware.CorsMiddleware", - "django.middleware.common.CommonMiddleware", - ..., - ] - -``CorsMiddleware`` should be placed as high as possible, especially before any -middleware that can generate responses such as Django's ``CommonMiddleware`` or -Whitenoise's ``WhiteNoiseMiddleware``. If it is not before, it will not be able -to add the CORS headers to these responses. - -About ------ - -**django-cors-headers** was created in January 2013 by Otto Yiu. It went -unmaintained from August 2015 and was forked in January 2016 to the package -`django-cors-middleware `_ -by Laville Augustin at Zeste de Savoir. -In September 2016, Adam Johnson, Ed Morley, and others gained maintenance -responsibility for **django-cors-headers** -(`Issue 110 `__) -from Otto Yiu. -Basically all of the changes in the forked **django-cors-middleware** were -merged back, or re-implemented in a different way, so it should be possible to -switch back. If there's a feature that hasn't been merged, please open an issue -about it. - -**django-cors-headers** has had `40+ contributors -`__ -in its time; thanks to every one of them. - -Configuration -------------- - -Configure the middleware's behaviour in your Django settings. You must set at -least one of three following settings: - -* ``CORS_ALLOWED_ORIGINS`` -* ``CORS_ALLOWED_ORIGIN_REGEXES`` -* ``CORS_ALLOW_ALL_ORIGINS`` - -``CORS_ALLOWED_ORIGINS: Sequence[str]`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A list of origins that are authorized to make cross-site HTTP requests. -The origins in this setting will be allowed, and the requesting origin will be echoed back to the client in the |access-control-allow-origin header|__. -Defaults to ``[]``. - -.. |access-control-allow-origin header| replace:: ``access-control-allow-origin`` header -__ https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin - -An Origin is defined by `the CORS RFC Section 3.2 `_ as a URI scheme + hostname + port, or one of the special values ``'null'`` or ``'file://'``. -Default ports (HTTPS = 443, HTTP = 80) are optional. - -The special value ``null`` is sent by the browser in `"privacy-sensitive contexts" `__, such as when the client is running from a ``file://`` domain. -The special value `file://` is sent accidentally by some versions of Chrome on Android as per `this bug `__. - -Example: - -.. code-block:: python - - CORS_ALLOWED_ORIGINS = [ - "https://example.com", - "https://sub.example.com", - "http://localhost:8080", - "http://127.0.0.1:9000", - ] - -Previously this setting was called ``CORS_ORIGIN_WHITELIST``, which still works as an alias, with the new name taking precedence. - -``CORS_ALLOWED_ORIGIN_REGEXES: Sequence[str | Pattern[str]]`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A list of strings representing regexes that match Origins that are authorized to make cross-site HTTP requests. -Defaults to ``[]``. -Useful when ``CORS_ALLOWED_ORIGINS`` is impractical, such as when you have a large number of subdomains. - -Example: - -.. code-block:: python - - CORS_ALLOWED_ORIGIN_REGEXES = [ - r"^https://\w+\.example\.com$", - ] - -Previously this setting was called ``CORS_ORIGIN_REGEX_WHITELIST``, which still works as an alias, with the new name taking precedence. - -``CORS_ALLOW_ALL_ORIGINS: bool`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If ``True``, all origins will be allowed. -Other settings restricting allowed origins will be ignored. -Defaults to ``False``. - -Setting this to ``True`` can be *dangerous*, as it allows any website to make cross-origin requests to yours. -Generally you'll want to restrict the list of allowed origins with ``CORS_ALLOWED_ORIGINS`` or ``CORS_ALLOWED_ORIGIN_REGEXES``. - -Previously this setting was called ``CORS_ORIGIN_ALLOW_ALL``, which still works as an alias, with the new name taking precedence. - --------------- - -The following are optional settings, for which the defaults probably suffice. - -``CORS_URLS_REGEX: str | Pattern[str]`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A regex which restricts the URL's for which the CORS headers will be sent. -Defaults to ``r'^.*$'``, i.e. match all URL's. -Useful when you only need CORS on a part of your site, e.g. an API at ``/api/``. - -Example: - -.. code-block:: python - - CORS_URLS_REGEX = r"^/api/.*$" - -``CORS_ALLOW_METHODS: Sequence[str]`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A list of HTTP verbs that are allowed for the actual request. -Defaults to: - -.. code-block:: python - - CORS_ALLOW_METHODS = ( - "DELETE", - "GET", - "OPTIONS", - "PATCH", - "POST", - "PUT", - ) - -The default can be imported as ``corsheaders.defaults.default_methods`` so you can just extend it with your custom methods. -This allows you to keep up to date with any future changes. -For example: - -.. code-block:: python - - from corsheaders.defaults import default_methods - - CORS_ALLOW_METHODS = ( - *default_methods, - "POKE", - ) - -``CORS_ALLOW_HEADERS: Sequence[str]`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The list of non-standard HTTP headers that you permit in requests from the browser. -Sets the |Access-Control-Allow-Headers header|__ in responses to `preflight requests `__. -Defaults to: - -.. |Access-Control-Allow-Headers header| replace:: ``Access-Control-Allow-Headers`` header -__ https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers - -.. code-block:: python - - CORS_ALLOW_HEADERS = ( - "accept", - "authorization", - "content-type", - "user-agent", - "x-csrftoken", - "x-requested-with", - ) - -The default can be imported as ``corsheaders.defaults.default_headers`` so you can extend it with your custom headers. -This allows you to keep up to date with any future changes. -For example: - -.. code-block:: python - - from corsheaders.defaults import default_headers - - CORS_ALLOW_HEADERS = ( - *default_headers, - "my-custom-header", - ) - -``CORS_EXPOSE_HEADERS: Sequence[str]`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The list of extra HTTP headers to expose to the browser, in addition to the default `safelisted headers `__. -If non-empty, these are declared in the |access-control-expose-headers header|__. -Defaults to ``[]``. - -.. |access-control-expose-headers header| replace:: ``access-control-expose-headers`` header -__ https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers - -``CORS_PREFLIGHT_MAX_AGE: int`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The number of seconds the browser can cache the preflight response. -This sets the |access-control-max-age header|__ in preflight responses. -If this is 0 (or any falsey value), no max age header will be sent. -Defaults to ``86400`` (one day). - -.. |access-control-max-age header| replace:: ``access-control-max-age`` header -__ https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age - -**Note:** -Browsers send `preflight requests `__ before certain “non-simple” requests, to check they will be allowed. -Read more about it in the `CORS MDN article `_. - -``CORS_ALLOW_CREDENTIALS: bool`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If ``True``, cookies will be allowed to be included in cross-site HTTP requests. -This sets the |access-control-allow-credentials header|__ in preflight and normal responses. -Defaults to ``False``. - -.. |access-control-allow-credentials header| replace:: ``Access-Control-Allow-Credentials`` header -__ https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/access-control-allow-credentials - -Note: in Django 2.1 the `SESSION_COOKIE_SAMESITE`_ setting was added, set to ``'Lax'`` by default, which will prevent Django's session cookie being sent cross-domain. -Change the setting to ``'None'`` if you need to bypass this security restriction. - -.. _SESSION_COOKIE_SAMESITE: https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-SESSION_COOKIE_SAMESITE - -``CORS_ALLOW_PRIVATE_NETWORK: bool`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If ``True``, allow requests from sites on “public” IP to this server on a “private” IP. -In such cases, browsers send an extra CORS header ``access-control-request-private-network``, for which ``OPTIONS`` responses must contain ``access-control-allow-private-network: true``. - -Refer to: - -* `Local Network Access `__, the W3C Community Draft specification. -* `Private Network Access: introducing preflights `__, a blog post from the Google Chrome team. - -CSRF Integration ----------------- - -Most sites will need to take advantage of the `Cross-Site Request Forgery -protection `_ that Django -offers. CORS and CSRF are separate, and Django has no way of using your CORS -configuration to exempt sites from the ``Referer`` checking that it does on -secure requests. The way to do that is with its `CSRF_TRUSTED_ORIGINS setting -`_. -For example: - -.. code-block:: python - - CORS_ALLOWED_ORIGINS = [ - "https://read-only.example.com", - "https://read-and-write.example.com", - ] - - CSRF_TRUSTED_ORIGINS = [ - "https://read-and-write.example.com", - ] - -Signals -------- - -If you have a use case that requires more than just the above configuration, -you can attach code to check if a given request should be allowed. For example, -this can be used to read the list of origins you allow from a model. Attach any -number of handlers to the ``check_request_enabled`` -`Django signal `_, which -provides the ``request`` argument (use ``**kwargs`` in your handler to protect -against any future arguments being added). If any handler attached to the -signal returns a truthy value, the request will be allowed. - -For example you might define a handler like this: - -.. code-block:: python - - # myapp/handlers.py - from corsheaders.signals import check_request_enabled - - from myapp.models import MySite - - - def cors_allow_mysites(sender, request, **kwargs): - return MySite.objects.filter(host=request.headers["origin"]).exists() - - - check_request_enabled.connect(cors_allow_mysites) - -Then connect it at app ready time using a `Django AppConfig -`_: - -.. code-block:: python - - # myapp/__init__.py - - default_app_config = "myapp.apps.MyAppConfig" - -.. code-block:: python - - # myapp/apps.py - - from django.apps import AppConfig - - - class MyAppConfig(AppConfig): - name = "myapp" - - def ready(self): - # Makes sure all signal handlers are connected - from myapp import handlers # noqa - -A common use case for the signal is to allow *all* origins to access a subset -of URL's, whilst allowing a normal set of origins to access *all* URL's. This -isn't possible using just the normal configuration, but it can be achieved with -a signal handler. - -First set ``CORS_ALLOWED_ORIGINS`` to the list of trusted origins that are -allowed to access every URL, and then add a handler to -``check_request_enabled`` to allow CORS regardless of the origin for the -unrestricted URL's. For example: - -.. code-block:: python - - # myapp/handlers.py - from corsheaders.signals import check_request_enabled - - - def cors_allow_api_to_everyone(sender, request, **kwargs): - return request.path.startswith("/api/") - - - check_request_enabled.connect(cors_allow_api_to_everyone) diff --git a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/RECORD b/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/RECORD deleted file mode 100644 index cd9bcb8..0000000 --- a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -corsheaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -corsheaders/__pycache__/__init__.cpython-310.pyc,, -corsheaders/__pycache__/apps.cpython-310.pyc,, -corsheaders/__pycache__/checks.cpython-310.pyc,, -corsheaders/__pycache__/conf.cpython-310.pyc,, -corsheaders/__pycache__/defaults.cpython-310.pyc,, -corsheaders/__pycache__/middleware.cpython-310.pyc,, -corsheaders/__pycache__/signals.cpython-310.pyc,, -corsheaders/apps.py,sha256=xrVRF6G81O6lLvcA2Qynoktn-dONYMvEZHR_k2KI7VI,378 -corsheaders/checks.py,sha256=GzNumKHHeiMAp0ELI3aOpEo9LLsUcRVAWOhjDPgcjxQ,5953 -corsheaders/conf.py,sha256=Ho60muEQpypsTAglU6qJSapYckQJkHJZLodfxmcdZuc,2061 -corsheaders/defaults.py,sha256=ctF9qn6wSAeONAKSbt1-IO9Chrs5zKL8LnbpqRlmdxg,314 -corsheaders/middleware.py,sha256=dVHWMPaR4XOqX9CzS93xU4OpkfoFhBNQc2TAft3Hl1Q,6100 -corsheaders/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -corsheaders/signals.py,sha256=bTl3tzkpzsQf24UsW2rsN-Hezso8Rj5Df7rGMl8xQ7M,291 -django_cors_headers-4.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -django_cors_headers-4.7.0.dist-info/LICENSE,sha256=7_iZBmxotWFfTGg_sstLYEGSFbC8BoCGs0DlOijeU-E,1111 -django_cors_headers-4.7.0.dist-info/METADATA,sha256=vm1nrPf1LHasVUp_T8yTFwjuB0kQPnxQybTI64MoDsc,16409 -django_cors_headers-4.7.0.dist-info/RECORD,, -django_cors_headers-4.7.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_cors_headers-4.7.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91 -django_cors_headers-4.7.0.dist-info/top_level.txt,sha256=WMa2XHHh4UQPVdmbuFNGg4Kb21BC2OJw5pKAhxpg1gg,12 diff --git a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/REQUESTED b/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/WHEEL deleted file mode 100644 index 505164b..0000000 --- a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.8.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/top_level.txt deleted file mode 100644 index 59006e3..0000000 --- a/.venv/lib/python3.10/site-packages/django_cors_headers-4.7.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -corsheaders diff --git a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/METADATA b/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/METADATA deleted file mode 100644 index c0a365e..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/METADATA +++ /dev/null @@ -1,175 +0,0 @@ -Metadata-Version: 2.4 -Name: django-extensions -Version: 4.1 -Summary: Extensions for Django -Author-email: Michael Trier -Maintainer-email: Bas van Oostveen -License-Expression: MIT -Project-URL: Changelog, https://github.com/django-extensions/django-extensions/blob/main/CHANGELOG.md -Project-URL: Documentation, https://django-extensions.readthedocs.io/ -Project-URL: Homepage, https://github.com/django-extensions/django-extensions -Project-URL: Source, https://github.com/django-extensions/django-extensions -Project-URL: Tracker, https://github.com/django-extensions/django-extensions/issues -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Framework :: Django :: 4.2 -Classifier: Framework :: Django :: 5.1 -Classifier: Framework :: Django :: 5.2 -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Utilities -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: django>=4.2 -Dynamic: license-file - -=================== - Django Extensions -=================== - -.. image:: https://img.shields.io/pypi/l/django-extensions.svg - :target: https://raw.githubusercontent.com/django-extensions/django-extensions/master/LICENSE - -.. image:: https://github.com/django-extensions/django-extensions/actions/workflows/compile_catalog.yml/badge.svg - :target: https://github.com/django-extensions/django-extensions/actions - -.. image:: https://github.com/django-extensions/django-extensions/actions/workflows/linters.yml/badge.svg - :target: https://github.com/django-extensions/django-extensions/actions - -.. image:: https://github.com/django-extensions/django-extensions/actions/workflows/precommit.yml/badge.svg - :target: https://github.com/django-extensions/django-extensions/actions - -.. image:: https://github.com/django-extensions/django-extensions/actions/workflows/pytest.yml/badge.svg - :target: https://github.com/django-extensions/django-extensions/actions - -.. image:: https://github.com/django-extensions/django-extensions/actions/workflows/security.yml/badge.svg - :target: https://github.com/django-extensions/django-extensions/actions - -.. image:: https://img.shields.io/pypi/v/django-extensions.svg - :target: https://pypi.python.org/pypi/django-extensions/ - :alt: Latest PyPI version - -.. image:: https://img.shields.io/pypi/wheel/django-extensions.svg - :target: https://pypi.python.org/pypi/django-extensions/ - :alt: Supports Wheel format - -.. image:: https://coveralls.io/repos/django-extensions/django-extensions/badge.svg?branch=master - :target: https://coveralls.io/r/django-extensions/django-extensions?branch=master - :alt: Coverage - -Django Extensions is a collection of custom extensions for the Django Framework. - - -Getting Started -=============== - -The easiest way to figure out what Django Extensions are all about is to watch the -`excellent screencast by Eric Holscher`__ (`watch the video on vimeo`__). In a couple -minutes Eric walks you through a half a dozen command extensions. There is also a -`short screencast on GoDjango's Youtube Channel`__ to help show you even more. - - -Requirements -============ - -Django Extensions requires Django 4.2 or later. - - -Getting It -========== - -You can get Django Extensions by using pip:: - - $ pip install django-extensions - -If you want to install it from source, grab the git repository from GitHub:: - - $ git clone git://github.com/django-extensions/django-extensions.git - $ cd django-extensions - $ pip install . - - -Installing It -============= - -To enable `django_extensions` in your project you need to add it to `INSTALLED_APPS` in your projects -`settings.py` file: - -.. code-block:: python - - INSTALLED_APPS = ( - ... - 'django_extensions', - ... - ) - - -Using It -======== - -Generate (and view) a graphviz graph of app models:: - - $ python manage.py graph_models -a -o myapp_models.png - -Produce a tab-separated list of `(url_pattern, view_function, name)` tuples for a project:: - - $ python manage.py show_urls - -Check templates for rendering errors:: - - $ python manage.py validate_templates - -Run the enhanced django shell:: - - $ python manage.py shell_plus - -Run the enhanced django runserver, (requires Werkzeug install):: - - $ python manage.py runserver_plus - - -Getting Involved -================ - -Open Source projects can always use more help. Fixing a problem, documenting a feature, adding -translation in your language. If you have some time to spare and like to help us, here are the places to do so: - -- GitHub: https://github.com/django-extensions/django-extensions -- Mailing list: https://groups.google.com/group/django-extensions -- Translations: https://www.transifex.com/projects/p/django-extensions/ - - -Documentation -============= - -You can view documentation online at: - -- https://django-extensions.readthedocs.io - -Or you can look at the docs/ directory in the repository. - - -Support -======= - -Django Extensions is free and always will be. It is developed and maintained by developers in an Open Source manner. -Any support is welcome. You could help by writing documentation, pull-requests, report issues and/or translations. - -Please remember that nobody is paid directly to develop or maintain Django Extensions so we do have to divide our time -between putting food on the table, family, this project and the rest of life :-) - - -__ https://ericholscher.com/blog/2008/sep/12/screencast-django-command-extensions/ -__ https://vimeo.com/1720508 -__ https://www.youtube.com/watch?v=1F6G3ONhr4k diff --git a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/RECORD b/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/RECORD deleted file mode 100644 index 21dcf31..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/RECORD +++ /dev/null @@ -1,278 +0,0 @@ -django_extensions-4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -django_extensions-4.1.dist-info/METADATA,sha256=Io0sR9z1a9ryd8sJ3W8y3ukkMjYfwlLKoQtl0r1d1ZA,6128 -django_extensions-4.1.dist-info/RECORD,, -django_extensions-4.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions-4.1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91 -django_extensions-4.1.dist-info/licenses/LICENSE,sha256=hfh-J08r7s6vlJVWdNgyPZ_B69b8NdSvzdOLVEygyyA,1057 -django_extensions-4.1.dist-info/top_level.txt,sha256=a-Shg8eC0Rl6_AoTRvqIUhzOFzQeCFU1Z7ee7myIYMg,18 -django_extensions/__init__.py,sha256=1buxjH-04dCr3atSCJ4SLw1U0jsesMeqEKcujgH1nWs,138 -django_extensions/__pycache__/__init__.cpython-310.pyc,, -django_extensions/__pycache__/apps.cpython-310.pyc,, -django_extensions/__pycache__/collision_resolvers.cpython-310.pyc,, -django_extensions/__pycache__/compat.cpython-310.pyc,, -django_extensions/__pycache__/import_subclasses.cpython-310.pyc,, -django_extensions/__pycache__/models.cpython-310.pyc,, -django_extensions/__pycache__/settings.cpython-310.pyc,, -django_extensions/__pycache__/validators.cpython-310.pyc,, -django_extensions/admin/__init__.py,sha256=ihqhcGHxN5I82DgBQ4DLCieJ9zscQUiXtPq4eiRYI4M,7316 -django_extensions/admin/__pycache__/__init__.cpython-310.pyc,, -django_extensions/admin/__pycache__/filter.cpython-310.pyc,, -django_extensions/admin/__pycache__/widgets.cpython-310.pyc,, -django_extensions/admin/filter.py,sha256=TOK2bF9GjYhwl49L9Lfmsg_aGDENKzzgYtJ8EqeoNGo,1902 -django_extensions/admin/widgets.py,sha256=xy3hYTe8p89tu7IIm0L4T7RVAWWYjZiVBEncxiWyoyw,3361 -django_extensions/apps.py,sha256=sK4VOcpveKq7ODjBojfJLpr5yYHMvdYL_T106o8ibVk,171 -django_extensions/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/auth/__pycache__/__init__.cpython-310.pyc,, -django_extensions/auth/__pycache__/mixins.cpython-310.pyc,, -django_extensions/auth/mixins.py,sha256=x8mBHy8mzQ2o7arKCTFN6Ku4Qufk6s8DltgvN17FlNg,488 -django_extensions/collision_resolvers.py,sha256=ksvGapdiBMRL-011fl15V0ExcsYdKTsm2hQnXbwpZgU,11109 -django_extensions/compat.py,sha256=KtFhHKGo116vlku5HzS7Y3cs9qe0e2WlzXy8Lv-VV_Q,1929 -django_extensions/conf/app_template/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/app_template/forms.py.tmpl,sha256=_K9nXjI1BEn-aPQYmNM9mcBwp21EnzAvtHF6lXeLQmY,55 -django_extensions/conf/app_template/migrations/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/app_template/models.py.tmpl,sha256=Vjc0p2XbAPgE6HyTF6vll98A4eDhA5AvaQqsc4kQ9AQ,57 -django_extensions/conf/app_template/urls.py.tmpl,sha256=nzK9G5Qi-8ECvgQ-5A5UhVYB9nmKTuWxKkrqWYgSzS4,69 -django_extensions/conf/app_template/views.py.tmpl,sha256=F42JXgnqFqK0fajXeutyJJxwOszRxoLMNkIhfc4Z7KI,26 -django_extensions/conf/command_template/management/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/command_template/management/commands/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/command_template/management/commands/sample.py.tmpl,sha256=VWqndBmkpZ5jw_3DrisYjXD76Si5lVSVcZlkifG57gs,306 -django_extensions/conf/jobs_template/jobs/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/jobs_template/jobs/daily/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/jobs_template/jobs/hourly/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/jobs_template/jobs/monthly/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/jobs_template/jobs/sample.py.tmpl,sha256=r2cd8E0jNTKIJYQmPULuxjZFxzg1yrv72IHsipWkWtY,178 -django_extensions/conf/jobs_template/jobs/weekly/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/jobs_template/jobs/yearly/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/template_tags_template/templatetags/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/conf/template_tags_template/templatetags/sample.py.tmpl,sha256=IOMcdXaX3IBAawoGoteRYqF5Y2ggxsLweR5XZqxfpMk,59 -django_extensions/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/db/__pycache__/__init__.cpython-310.pyc,, -django_extensions/db/__pycache__/models.cpython-310.pyc,, -django_extensions/db/fields/__init__.py,sha256=Z6UD1GhVBvCXGxVobeC_dVoK3TynLLvT6iZjvQbsLhs,21363 -django_extensions/db/fields/__pycache__/__init__.cpython-310.pyc,, -django_extensions/db/fields/__pycache__/json.cpython-310.pyc,, -django_extensions/db/fields/json.py,sha256=UJm8E7VHqqW2dyuY2VzUvLOuAFx9XshQvB-mrBCbrUg,3168 -django_extensions/db/models.py,sha256=h-2AGZfP8r47ieUfTcK4Yg7qo9kLu1V4wO_GVi_Ufgg,3928 -django_extensions/import_subclasses.py,sha256=ViDGIEoRIrfIv1GVfG1PJmJs2WMRrPwKG_StAulNqic,2343 -django_extensions/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/jobs/__pycache__/__init__.cpython-310.pyc,, -django_extensions/jobs/daily/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/jobs/daily/__pycache__/__init__.cpython-310.pyc,, -django_extensions/jobs/daily/__pycache__/cache_cleanup.cpython-310.pyc,, -django_extensions/jobs/daily/__pycache__/daily_cleanup.cpython-310.pyc,, -django_extensions/jobs/daily/cache_cleanup.py,sha256=am0xy2aejVodGr7063ijNYQuiGhdg_PayflHte3_22w,646 -django_extensions/jobs/daily/daily_cleanup.py,sha256=hSLNGhiI9A-wKpxj8ie3wjmMTGOMq_kWjE-kt3_JqAU,389 -django_extensions/jobs/hourly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/jobs/hourly/__pycache__/__init__.cpython-310.pyc,, -django_extensions/jobs/minutely/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/jobs/minutely/__pycache__/__init__.cpython-310.pyc,, -django_extensions/jobs/monthly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/jobs/monthly/__pycache__/__init__.cpython-310.pyc,, -django_extensions/jobs/weekly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/jobs/weekly/__pycache__/__init__.cpython-310.pyc,, -django_extensions/jobs/yearly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/jobs/yearly/__pycache__/__init__.cpython-310.pyc,, -django_extensions/locale/ar/LC_MESSAGES/django.po,sha256=j23ombvXVqaqcz5Zr3XRs9NuEkbBI1FiZlsmdeiaPWU,3126 -django_extensions/locale/da/LC_MESSAGES/django.mo,sha256=R7WNKaXc0q4iM1cUsgzdbdRZ08r7m14EmM1znFTo1FI,797 -django_extensions/locale/da/LC_MESSAGES/django.po,sha256=Zl33Wn5Sz6JsDUcbR_2aMtFCTqmDYz1XpXXsrY2GBl0,1667 -django_extensions/locale/de/LC_MESSAGES/django.mo,sha256=kuhHiXWrfazxsvFzvENWfY5sN3XpLvy1-AKQ0jKOnAs,1227 -django_extensions/locale/de/LC_MESSAGES/django.po,sha256=OLFLDJbZLPk3oK5DUcJ-V7eeBKZcHjlu_Vl0WTHW9F4,1755 -django_extensions/locale/el/LC_MESSAGES/django.mo,sha256=0CafRFBnuy4QdqtoaipoKpONaVMvtfP1J_4eMBB2gAg,1581 -django_extensions/locale/el/LC_MESSAGES/django.po,sha256=UC2b1GCXVnUteg1ZFqooRp6wkcxBufQGWCSZW8Hxndw,2116 -django_extensions/locale/en/LC_MESSAGES/django.mo,sha256=9JJOWscsqQUH_P7IWH5P5MEJPDJjDGzGl-Zz5-xGDFo,367 -django_extensions/locale/en/LC_MESSAGES/django.po,sha256=l27VRI3peRt_aKdlaQ7zVXj03wR2PfIex2X3SWrrSBc,2229 -django_extensions/locale/es/LC_MESSAGES/django.mo,sha256=SH8ojro4wqhcR8yKM2vn9JVxTMbke7zwUjsc_W60jfA,1260 -django_extensions/locale/es/LC_MESSAGES/django.po,sha256=euh9NBu3f-f-CuNgPGaJDebN0TbalfKKJ_X5q55VqA8,1788 -django_extensions/locale/fr/LC_MESSAGES/django.mo,sha256=XIMBOSYt8pHAhP3pUBs1N-iKLn3e0LRgTNYe_ippr58,743 -django_extensions/locale/fr/LC_MESSAGES/django.po,sha256=xKyEMPuZ_jFx7_7kY0plfHZV_gB8gUr2nvKdU_X3CLY,1931 -django_extensions/locale/hu/LC_MESSAGES/django.mo,sha256=7rWzOkIurHDcvi4uCgh4hkQjUpV182FSyjKZz6mIBFU,1242 -django_extensions/locale/hu/LC_MESSAGES/django.po,sha256=SOHXX186PGybAII05VA5QRZvSjtXR9fLJpgS2acxwt8,1770 -django_extensions/locale/id/LC_MESSAGES/django.mo,sha256=X3tKDCM5qiuVi5dYOnzxAxx6mQ3w-wTJBvP7_ENnHhg,1508 -django_extensions/locale/id/LC_MESSAGES/django.po,sha256=a4dguUsySnXLdDDafyXcq2lXFmYN-DS6uoEOQQJGEV4,2243 -django_extensions/locale/it/LC_MESSAGES/django.mo,sha256=y3dS8jT30b2P9il5kxQaCj_JgaLLCCkR_vLEllX8L0g,1247 -django_extensions/locale/it/LC_MESSAGES/django.po,sha256=AENMGV_gkuUqp2gVWnENI5hlCtJipNykZkAWcvlRia0,1775 -django_extensions/locale/ja/LC_MESSAGES/django.mo,sha256=5fTQjN83bExfQbkaAMq3zve2B3fEWkf6rF-QYGZf9fA,1397 -django_extensions/locale/ja/LC_MESSAGES/django.po,sha256=CGrMk9hH64qBE_6NF-qPMwHpdfW57FwY3PlF0g0_g0M,1925 -django_extensions/locale/pl/LC_MESSAGES/django.mo,sha256=G3yZYzIwUHJ0PK14VhRXxJaYSXRkBQWa4yfFwJyhSBs,2002 -django_extensions/locale/pl/LC_MESSAGES/django.po,sha256=hVRdMxQmgRhtruCm66bZQVY-OIfSSYVBSJViuZNHB_4,2788 -django_extensions/locale/pt/LC_MESSAGES/django.mo,sha256=F_q92e6dFwPbjvYWHNBvCjgd5mIj3_ezrHvCOFeUZCw,1262 -django_extensions/locale/pt/LC_MESSAGES/django.po,sha256=oKucDPxqIFZAOeVa_mbvOsmXXwyTydd82_Z_pXpkfvI,1790 -django_extensions/locale/pt_BR/LC_MESSAGES/django.mo,sha256=bN2RG97zI3S6qEuMmvbDvPCo4YSZ_KEY5UxviD9WzlA,1310 -django_extensions/locale/pt_BR/LC_MESSAGES/django.po,sha256=VDIRUodyxJr4PDcgiOuR6o3k1Ss_4ge5rx0DZgk5QwY,2082 -django_extensions/locale/ro/LC_MESSAGES/django.mo,sha256=8-8B-I7iFCGZKBj1XKMbMqQLl6Yg2W1IEG39miSI8Hk,1352 -django_extensions/locale/ro/LC_MESSAGES/django.po,sha256=CWaWS2C08-8lNWMCtPSPvDj4xONYrD3UGx4QSWXuWgg,1891 -django_extensions/locale/ru/LC_MESSAGES/django.mo,sha256=C_kjCXvZuZ2ZdiU8ffcjKwcnA-d5IiUTgpglX7JdD-U,2009 -django_extensions/locale/ru/LC_MESSAGES/django.po,sha256=luenXP4hypDODQUVWowDSCkYW9VMF_9NBlTUVkAmB3o,3820 -django_extensions/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/logging/__pycache__/__init__.cpython-310.pyc,, -django_extensions/logging/__pycache__/filters.cpython-310.pyc,, -django_extensions/logging/filters.py,sha256=sESzvZ3U6V4lH5kUKBl7zc0D9IFpCWND9flxBKVc7vA,1126 -django_extensions/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/management/__pycache__/__init__.cpython-310.pyc,, -django_extensions/management/__pycache__/base.cpython-310.pyc,, -django_extensions/management/__pycache__/color.cpython-310.pyc,, -django_extensions/management/__pycache__/debug_cursor.cpython-310.pyc,, -django_extensions/management/__pycache__/email_notifications.cpython-310.pyc,, -django_extensions/management/__pycache__/jobs.cpython-310.pyc,, -django_extensions/management/__pycache__/modelviz.cpython-310.pyc,, -django_extensions/management/__pycache__/mysql.cpython-310.pyc,, -django_extensions/management/__pycache__/notebook_extension.cpython-310.pyc,, -django_extensions/management/__pycache__/shells.cpython-310.pyc,, -django_extensions/management/__pycache__/signals.cpython-310.pyc,, -django_extensions/management/__pycache__/technical_response.cpython-310.pyc,, -django_extensions/management/__pycache__/utils.cpython-310.pyc,, -django_extensions/management/base.py,sha256=HUiUTdXwYkvjwwgxkTfcNw5TWbWwlLFNIP4kp_Cb1hg,1431 -django_extensions/management/color.py,sha256=cnoHNtMDJN_bXfBYyACWW_CQxiX-LU13-2CHxxjw4t8,907 -django_extensions/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/management/commands/__pycache__/__init__.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/admin_generator.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/clean_pyc.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/clear_cache.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/compile_pyc.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/create_command.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/create_jobs.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/create_template_tags.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/delete_squashed_migrations.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/describe_form.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/drop_test_database.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/dumpscript.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/export_emails.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/find_template.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/generate_password.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/generate_secret_key.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/graph_models.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/list_model_info.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/list_signals.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/mail_debug.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/managestate.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/merge_model_instances.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/notes.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/print_settings.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/print_user_for_session.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/raise_test_exception.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/reset_db.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/reset_schema.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/runjob.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/runjobs.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/runprofileserver.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/runscript.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/runserver_plus.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/set_default_site.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/set_fake_emails.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/set_fake_passwords.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/shell_plus.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/show_permissions.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/show_template_tags.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/show_urls.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/sqlcreate.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/sqldiff.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/sqldsn.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/sync_s3.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/syncdata.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/unreferenced_files.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/update_permissions.cpython-310.pyc,, -django_extensions/management/commands/__pycache__/validate_templates.cpython-310.pyc,, -django_extensions/management/commands/admin_generator.py,sha256=bnp8Y0huCsBID-aKcAvhoOBSWqtDY6y8KI2XpDiHjvE,12188 -django_extensions/management/commands/clean_pyc.py,sha256=S4udDKSlcF-MvVKZBcI3oPfi-TCxXeG68EHWqeKuP9E,1671 -django_extensions/management/commands/clear_cache.py,sha256=3xsdc0twEN99Ll6u2bW8UZwKVjIZVnePYCUVLLlffbc,1514 -django_extensions/management/commands/compile_pyc.py,sha256=7EvZLJR3PhLYFkbcGkFJH0WnYFztX-R6WrFx3GlXThw,1346 -django_extensions/management/commands/create_command.py,sha256=Sg6_SJgPeP2qUkfyWJ2zEbPnOzQ3woF2t7pIjHQjzyk,4068 -django_extensions/management/commands/create_jobs.py,sha256=jCvjlf9g-aduJx7PCIb0BKlOQ4dGc7ISzpu2fz_lSpM,2537 -django_extensions/management/commands/create_template_tags.py,sha256=PiKRh6P0_byU37Ni_tGYqd9Jog3CNfECyu0xAvuWVNQ,2981 -django_extensions/management/commands/delete_squashed_migrations.py,sha256=9zEI6Tqxmv5dI7k2DZOeTdHAhlqM6bS6shjotgv7urs,7711 -django_extensions/management/commands/describe_form.py,sha256=RvSaaYkiW-IT2PEdtethWQ4LNeVsL5Gcgilj4uNUW9w,2981 -django_extensions/management/commands/drop_test_database.py,sha256=ghYtG4HX3htOCJxYHeZEqHKHFF6xLakYal2P88ILdu0,9292 -django_extensions/management/commands/dumpscript.py,sha256=gnS8hzRO0fD9WuZnaT63Mx9JqX9xqgnp7_I_DUKt4yc,29150 -django_extensions/management/commands/export_emails.py,sha256=qXZPOt0XDGstS91piUoKUDAR2xX2doRsU5zcU66jl8w,6314 -django_extensions/management/commands/find_template.py,sha256=GImM8uPJ_3wNUDwOVTZNvWcyun4pa5aevBpsT2qtsMk,695 -django_extensions/management/commands/generate_password.py,sha256=if1gl5s3Bds6lpAiffvy34au3hpN0MNq5-QOMd4CNRU,1155 -django_extensions/management/commands/generate_secret_key.py,sha256=bisQO7XRV1sOe1GqQ0-mTQZgXviWQrdiLxJJ7qWSYq8,484 -django_extensions/management/commands/graph_models.py,sha256=Qf_rgGVEWgBbbWmg3VDqPtZ0xSim28rJJixax4fMGXs,17929 -django_extensions/management/commands/list_model_info.py,sha256=IUVNFVeK-P-93CCvjzqLLJD5htir5I4WEpskGuixucc,6532 -django_extensions/management/commands/list_signals.py,sha256=j8ow4YtbUf9ujZdQMl0Ce0zXA0oYn3uf8Xi5QI9N6bs,2974 -django_extensions/management/commands/mail_debug.py,sha256=3NH_xjx46O5t9vDxPsgEIu5qxYA2hAnz1HUAcyoULuk,3264 -django_extensions/management/commands/managestate.py,sha256=2PNf7Q6XxjQUxIvuFJeSM48AVv6eIMfdgdnuh2Rl1NM,7164 -django_extensions/management/commands/merge_model_instances.py,sha256=zF9kbfGL3C7D2WypXl3B-07kgjeX1EDO-1PGt1Wy6nY,9777 -django_extensions/management/commands/notes.py,sha256=7tW2Pcy1YaMfcnygg1TYZivZE7aIQN9x5iKqGGvSER0,3024 -django_extensions/management/commands/print_settings.py,sha256=L6Ros6V4o40cYnng2vhrIuMjLpDj3SiWA0Sfu0RKYSc,2728 -django_extensions/management/commands/print_user_for_session.py,sha256=RqTC0xgP2DWBVUvsTEFimSiCkzAemKIBAUKa2w4tamg,2120 -django_extensions/management/commands/raise_test_exception.py,sha256=71c2pIi__scpzvKrFGsfaS4TTYeuxulI4I4vlJaldQo,659 -django_extensions/management/commands/reset_db.py,sha256=x9RZM5PQ-SyMYmyOr97KEbMVb1BHeQ_M96-Ip41lt2s,8677 -django_extensions/management/commands/reset_schema.py,sha256=xA4S2_osQt0x9vS9egYyezsfX-LhYdNruKmS3VTSye8,3132 -django_extensions/management/commands/runjob.py,sha256=fl3WV3IZUxZhw6mmbWulCkHcJz0WcdTYeU30pOmUShE,2074 -django_extensions/management/commands/runjobs.py,sha256=Idd9aL7SRsk2YwoBlALkeM0OWJnD9p20NTRcBlXxfUE,3542 -django_extensions/management/commands/runprofileserver.py,sha256=xxhes9xQo_xT8jktTOzLihR2SZ3t9jiaOTn6FyASNN8,10761 -django_extensions/management/commands/runscript.py,sha256=j06vV2-fMyiPSELoijC1fyoXX6D1BG2143523lg8KZg,12975 -django_extensions/management/commands/runserver_plus.py,sha256=4pIaQJNlOO1CALbRVGqq9q2uHghw0eOAfo0dFOR9aSI,26690 -django_extensions/management/commands/set_default_site.py,sha256=jv9a9EN81_tlGR75Eua-P8b2fo6oIZ_UIgWxfvsuFjM,2915 -django_extensions/management/commands/set_fake_emails.py,sha256=LLTNC6QzGIxWwwv517Tu5U3FSVuf01SJfYpC7h3NjWE,4228 -django_extensions/management/commands/set_fake_passwords.py,sha256=hcLUiXu5iu6l3ACpObEEIzPJm6NXOQGO182nE60BxRU,1829 -django_extensions/management/commands/shell_plus.py,sha256=UKnpROY0nrQ2LVAdmqSucxxZvYG0FfGeAVh721cP3ak,25055 -django_extensions/management/commands/show_permissions.py,sha256=sCDPjeUus-Wl8-Imq0oSvsh_xV73g4QblcrMCPTrfq0,2383 -django_extensions/management/commands/show_template_tags.py,sha256=gTJtfR2VqjJJ4j5waq4XJ7oYNWeix5CLA-iS_3pgYvE,3939 -django_extensions/management/commands/show_urls.py,sha256=C96jaQu-FWWW9hJwplOBV_dnGah-K3HYauC3cfCBKhs,10482 -django_extensions/management/commands/sqlcreate.py,sha256=HSpvqRK4iXxx_SUEdnoX5os2RScqhmyNfC1BCYcleh0,4780 -django_extensions/management/commands/sqldiff.py,sha256=ScncsaTLd8dZWDkCFRB46ikYYY--a1o9ODRM7VqeiTs,71112 -django_extensions/management/commands/sqldsn.py,sha256=MrSb6bMnc3pV1tL4CzPugn_Gu2qa-3n9o6Z_0kABoRY,6632 -django_extensions/management/commands/sync_s3.py,sha256=8Yrm0NYL54EK0cnQMjxsu6U1JoPSzN9ZK9tITttEuZA,16905 -django_extensions/management/commands/syncdata.py,sha256=nbu-FRVZk2GJiooAkDB0q14O_FS6N-kXrqClLoXmDYg,11091 -django_extensions/management/commands/unreferenced_files.py,sha256=R7Ke26ubKUoQPXILJzUQoYn-R1_cFkKjOlfczTbHtag,1801 -django_extensions/management/commands/update_permissions.py,sha256=QxQitwADzlTfKPgJhMBngaKVrwbR_KGzVirDQWgmaus,2977 -django_extensions/management/commands/validate_templates.py,sha256=HwDA1394LpFgh2lVdUIyGPPXYO5_7VBDiiK51LtKfAE,4064 -django_extensions/management/debug_cursor.py,sha256=cUERDVfj6KTjd43oGYhsoBn66yzNtktj1x2Xo70fWLw,4846 -django_extensions/management/email_notifications.py,sha256=Ac2mOcehDK6FOKcIeus4YfEPSvJTqFQsnKOoDw4qDT8,5333 -django_extensions/management/jobs.py,sha256=Ihd4dVWdEWwTsc25YVmbeYBl2_eWvcOgqC8m1L79pdk,5432 -django_extensions/management/modelviz.py,sha256=75JKEWC2QzNhtl0T_cjo15iLQ_jYWEQzQLp_r80dP6c,19546 -django_extensions/management/mysql.py,sha256=GrAJHzMGZ7UUkmP6fovKQJSZtqNSSjSY4V-A6tBhbL8,1557 -django_extensions/management/notebook_extension.py,sha256=2UzcvcUpaD704dLx4uSVY3rZGN6RQ-L_OVOgjdDYKyI,324 -django_extensions/management/shells.py,sha256=xVscuW74iFhwTgzqjrNntmZxCypbSYp7h8uvFEEwJvI,18095 -django_extensions/management/signals.py,sha256=yWTcyz8hhcB-PLJKeH2UWOAypCIvaeijKy3CfNJ3ZhU,307 -django_extensions/management/technical_response.py,sha256=8WJUUH-ZDpbGrH6Oc0mHTLnIN5vQLOiB0aeMMvENqjs,1782 -django_extensions/management/utils.py,sha256=nK9pNrF2esYxIufxh5U9aKLKiZj2CVWK3nIRCmD6OJo,2351 -django_extensions/models.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/mongodb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/mongodb/__pycache__/__init__.cpython-310.pyc,, -django_extensions/mongodb/__pycache__/models.cpython-310.pyc,, -django_extensions/mongodb/fields/__init__.py,sha256=nM7ikY-oMKxUBl5jSPiZq8INwjVZQraqWqXmwOl8hSg,9489 -django_extensions/mongodb/fields/__pycache__/__init__.cpython-310.pyc,, -django_extensions/mongodb/fields/__pycache__/json.cpython-310.pyc,, -django_extensions/mongodb/fields/json.py,sha256=8JA5_ObbTlENTkVfHxeE_RtMYiYQw_5QSwaPGfPWKDk,2154 -django_extensions/mongodb/models.py,sha256=N-ABdyit6Y93diCnWsO0J8C7U1DyPbLrtNRuSGgmwh8,2458 -django_extensions/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/settings.py,sha256=9G14bG8M-1ucGFVh7PVXuiMdwaJ-QJ8jV58i4EnTm08,1369 -django_extensions/static/django_extensions/css/jquery.autocomplete.css,sha256=3yUz9XJFKdXHv34Xe4QNWjA9ghEr2ieEoQ0KaO3e49Q,740 -django_extensions/static/django_extensions/img/indicator.gif,sha256=0-OUTUZJRQ3uZqVcae7O0tgltsoaNJ9yx1_TeArj8AY,1553 -django_extensions/static/django_extensions/js/jquery.ajaxQueue.js,sha256=hPrJgQn9AOWP5fixvJ2ty6_ncPDKXGtW3hjZY6omo70,2800 -django_extensions/static/django_extensions/js/jquery.autocomplete.js,sha256=5DV9zxN6TgVpbkscqlkoiK5qhEEGdmxV2v7d265QQog,36679 -django_extensions/static/django_extensions/js/jquery.bgiframe.js,sha256=ACFjwe9ie5i4LysU-w9gpisHaCzHbS0kEOtIL0UcDM4,1821 -django_extensions/templates/django_extensions/graph_models/django2018/digraph.dot,sha256=Y0wcDGN58wjZQTvnytRcHzu3H0gOmnq_Qf4CkWTwrTQ,904 -django_extensions/templates/django_extensions/graph_models/django2018/label.dot,sha256=vsKxchMm6DQVTPx8gFxijpHOGNJuqdItN2WEI8mvc14,1875 -django_extensions/templates/django_extensions/graph_models/django2018/relation.dot,sha256=6KlECRFCmCmTTOQs5vYEr2sPWdDgiUbgH4ZkWLt_SjE,589 -django_extensions/templates/django_extensions/graph_models/django2018style/digraph.dot,sha256=X5gkfd8UNCo8JhlONpe30hxb4ZtomxccBUeC254GlG0,856 -django_extensions/templates/django_extensions/graph_models/django2018style/label.dot,sha256=hk1x5SYFEpxwccrqEV8ay80fh7YYi3TY0fWfbCS5820,1983 -django_extensions/templates/django_extensions/graph_models/django2018style/relation.dot,sha256=6KlECRFCmCmTTOQs5vYEr2sPWdDgiUbgH4ZkWLt_SjE,589 -django_extensions/templates/django_extensions/graph_models/original/digraph.dot,sha256=mwfMx95mrkZofdoGj7E4RVfQilGgSNV45-ZklCoBd0Y,909 -django_extensions/templates/django_extensions/graph_models/original/label.dot,sha256=0-UHhFDl-XTkOr1wUAoEBd-xSfnAea922vUX0N1cCeQ,1697 -django_extensions/templates/django_extensions/graph_models/original/relation.dot,sha256=Y-wvocs_14QreSILBv9ESWvnF6B3pUcrRrjx_q0oINk,591 -django_extensions/templates/django_extensions/widgets/foreignkey_searchinput.html,sha256=8DhLt6B0oUlpVq1gSoPy4uImyJxUueUczwYHraZeKNg,2032 -django_extensions/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_extensions/templatetags/__pycache__/__init__.cpython-310.pyc,, -django_extensions/templatetags/__pycache__/debugger_tags.cpython-310.pyc,, -django_extensions/templatetags/__pycache__/highlighting.cpython-310.pyc,, -django_extensions/templatetags/__pycache__/indent_text.cpython-310.pyc,, -django_extensions/templatetags/__pycache__/syntax_color.cpython-310.pyc,, -django_extensions/templatetags/__pycache__/widont.cpython-310.pyc,, -django_extensions/templatetags/debugger_tags.py,sha256=I-IjazMNelcBx9tQ41-NA0ERntY04nrj1FFdYssQg9U,596 -django_extensions/templatetags/highlighting.py,sha256=F32yOpVmcv3MvlD2Se-U6zTLBDNI3k1KW5nI4HieNgY,3103 -django_extensions/templatetags/indent_text.py,sha256=kXmJmcrezyoHyTqsN1jxKljLCiLMMdakYls4E_dn5-c,1750 -django_extensions/templatetags/syntax_color.py,sha256=d_zCxFGNr3WXHHwtLwcSKscxFMcrTBWJIrZvoVWPmVg,3204 -django_extensions/templatetags/widont.py,sha256=kwqiQYOuCIxXGVYomacPzbZ9bcH2Ba9wEeDMiCWEckE,1957 -django_extensions/utils/__init__.py,sha256=Xb0RrRwc1dqCwkASV8I2MSLy14c_FhmE1HeaxxaeO1E,70 -django_extensions/utils/__pycache__/__init__.cpython-310.pyc,, -django_extensions/utils/__pycache__/deprecation.cpython-310.pyc,, -django_extensions/utils/__pycache__/dia2django.cpython-310.pyc,, -django_extensions/utils/__pycache__/internal_ips.cpython-310.pyc,, -django_extensions/utils/deprecation.py,sha256=t2fLgdgEj2l2dp_8S581QyDMwA2sg7OhE33AFYYxjts,156 -django_extensions/utils/dia2django.py,sha256=YuVbOTHIqYw9QcF1lHVA05EjMZvAwGcuVNaRGj0SfYo,12183 -django_extensions/utils/internal_ips.py,sha256=rmqZttBwaTWbPHW3DRGHtcA3HXT8NIpQ0TG7Sar44Ls,1952 -django_extensions/validators.py,sha256=mkhSbBOFggSfycePTLf1vkxxgC2tP44JGjUT8vhRMkE,4023 diff --git a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/REQUESTED b/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/WHEEL deleted file mode 100644 index 1eb3c49..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (78.1.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/licenses/LICENSE b/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/licenses/LICENSE deleted file mode 100644 index 279c6da..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/licenses/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2007 Michael Trier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/top_level.txt deleted file mode 100644 index ee49386..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions-4.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -django_extensions diff --git a/.venv/lib/python3.10/site-packages/django_extensions/__init__.py b/.venv/lib/python3.10/site-packages/django_extensions/__init__.py deleted file mode 100644 index 87cef49..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -from django.utils.version import get_version - -VERSION = (4, 1, 0, "final", 0) - -__version__ = get_version(VERSION) diff --git a/.venv/lib/python3.10/site-packages/django_extensions/admin/__init__.py b/.venv/lib/python3.10/site-packages/django_extensions/admin/__init__.py deleted file mode 100644 index ab9e697..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/admin/__init__.py +++ /dev/null @@ -1,195 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Autocomplete feature for admin panel -# -import operator -from functools import update_wrapper, reduce -from typing import Tuple, Dict, Callable # NOQA - -from django.apps import apps -from django.http import HttpResponse, HttpResponseNotFound -from django.conf import settings -from django.db import models -from django.db.models.query import QuerySet -from django.utils.encoding import smart_str -from django.utils.translation import gettext as _ -from django.utils.text import get_text_list -from django.contrib import admin - -from django_extensions.admin.widgets import ForeignKeySearchInput - - -class ForeignKeyAutocompleteAdminMixin: - """ - Admin class for models using the autocomplete feature. - - There are two additional fields: - - related_search_fields: defines fields of managed model that - have to be represented by autocomplete input, together with - a list of target model fields that are searched for - input string, e.g.: - - related_search_fields = { - 'author': ('first_name', 'email'), - } - - - related_string_functions: contains optional functions which - take target model instance as only argument and return string - representation. By default __unicode__() method of target - object is used. - - And also an optional additional field to set the limit on the - results returned by the autocomplete query. You can set this integer - value in your settings file using FOREIGNKEY_AUTOCOMPLETE_LIMIT or - you can set this per ForeignKeyAutocompleteAdmin basis. If any value - is set the results will not be limited. - """ - - related_search_fields = {} # type: Dict[str, Tuple[str]] - related_string_functions = {} # type: Dict[str, Callable] - autocomplete_limit = getattr(settings, "FOREIGNKEY_AUTOCOMPLETE_LIMIT", None) - - def get_urls(self): - from django.urls import path - - def wrap(view): - def wrapper(*args, **kwargs): - return self.admin_site.admin_view(view)(*args, **kwargs) - - return update_wrapper(wrapper, view) - - return [ - path( - "foreignkey_autocomplete/", - wrap(self.foreignkey_autocomplete), - name="%s_%s_autocomplete" - % (self.model._meta.app_label, self.model._meta.model_name), - ) - ] + super().get_urls() - - def foreignkey_autocomplete(self, request): - """ - Search in the fields of the given related model and returns the - result as a simple string to be used by the jQuery Autocomplete plugin - """ - query = request.GET.get("q", None) - app_label = request.GET.get("app_label", None) - model_name = request.GET.get("model_name", None) - search_fields = request.GET.get("search_fields", None) - object_pk = request.GET.get("object_pk", None) - - try: - to_string_function = self.related_string_functions[model_name] - except KeyError: - to_string_function = lambda x: x.__str__() - - if search_fields and app_label and model_name and (query or object_pk): - - def construct_search(field_name): - # use different lookup methods depending on the notation - if field_name.startswith("^"): - return "%s__istartswith" % field_name[1:] - elif field_name.startswith("="): - return "%s__iexact" % field_name[1:] - elif field_name.startswith("@"): - return "%s__search" % field_name[1:] - else: - return "%s__icontains" % field_name - - model = apps.get_model(app_label, model_name) - - queryset = model._default_manager.all() - data = "" - if query: - for bit in query.split(): - or_queries = [ - models.Q( - **{construct_search(smart_str(field_name)): smart_str(bit)} - ) - for field_name in search_fields.split(",") - ] - other_qs = QuerySet(model) - other_qs.query.select_related = queryset.query.select_related - other_qs = other_qs.filter(reduce(operator.or_, or_queries)) - queryset = queryset & other_qs - - additional_filter = self.get_related_filter(model, request) - if additional_filter: - queryset = queryset.filter(additional_filter) - - if self.autocomplete_limit: - queryset = queryset[: self.autocomplete_limit] - - data = "".join( - [str("%s|%s\n") % (to_string_function(f), f.pk) for f in queryset] - ) - elif object_pk: - try: - obj = queryset.get(pk=object_pk) - except Exception: # FIXME: use stricter exception checking - pass - else: - data = to_string_function(obj) - return HttpResponse(data, content_type="text/plain") - return HttpResponseNotFound() - - def get_related_filter(self, model, request): - """ - Given a model class and current request return an optional Q object - that should be applied as an additional filter for autocomplete query. - If no additional filtering is needed, this method should return - None. - """ - return None - - def get_help_text(self, field_name, model_name): - searchable_fields = self.related_search_fields.get(field_name, None) - if searchable_fields: - help_kwargs = { - "model_name": model_name, - "field_list": get_text_list(searchable_fields, _("and")), - } - return ( - _( - "Use the left field to do %(model_name)s lookups " - "in the fields %(field_list)s." - ) - % help_kwargs - ) - return "" - - def formfield_for_dbfield(self, db_field, request, **kwargs): - """ - Override the default widget for Foreignkey fields if they are - specified in the related_search_fields class attribute. - """ - if ( - isinstance(db_field, models.ForeignKey) - and db_field.name in self.related_search_fields - ): - help_text = self.get_help_text( - db_field.name, db_field.remote_field.model._meta.object_name - ) - if kwargs.get("help_text"): - help_text = str("%s %s") % (kwargs["help_text"], help_text) - kwargs["widget"] = ForeignKeySearchInput( - db_field.remote_field, self.related_search_fields[db_field.name] - ) - kwargs["help_text"] = help_text - return super().formfield_for_dbfield(db_field, request, **kwargs) - - -class ForeignKeyAutocompleteAdmin(ForeignKeyAutocompleteAdminMixin, admin.ModelAdmin): - pass - - -class ForeignKeyAutocompleteTabularInline( - ForeignKeyAutocompleteAdminMixin, admin.TabularInline -): - pass - - -class ForeignKeyAutocompleteStackedInline( - ForeignKeyAutocompleteAdminMixin, admin.StackedInline -): - pass diff --git a/.venv/lib/python3.10/site-packages/django_extensions/admin/filter.py b/.venv/lib/python3.10/site-packages/django_extensions/admin/filter.py deleted file mode 100644 index 392b0c9..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/admin/filter.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -from django.contrib.admin import FieldListFilter -from django.contrib.admin.utils import prepare_lookup_value -from django.utils.translation import gettext_lazy as _ - - -class NullFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - self.lookup_kwarg = "{0}__isnull".format(field_path) - super().__init__(field, request, params, model, model_admin, field_path) - lookup_choices = self.lookups(request, model_admin) - self.lookup_choices = () if lookup_choices is None else list(lookup_choices) - - def expected_parameters(self): - return [self.lookup_kwarg] - - def value(self): - return self.used_parameters.get(self.lookup_kwarg, None) - - def lookups(self, request, model_admin): - return ( - ("1", _("Yes")), - ("0", _("No")), - ) - - def choices(self, cl): - yield { - "selected": self.value() is None, - "query_string": cl.get_query_string({}, [self.lookup_kwarg]), - "display": _("All"), - } - for lookup, title in self.lookup_choices: - yield { - "selected": self.value() - == prepare_lookup_value(self.lookup_kwarg, lookup), - "query_string": cl.get_query_string( - { - self.lookup_kwarg: lookup, - }, - [], - ), - "display": title, - } - - def queryset(self, request, queryset): - if self.value() is not None: - kwargs = {self.lookup_kwarg: self.value()} - return queryset.filter(**kwargs) - return queryset - - -class NotNullFieldListFilter(NullFieldListFilter): - def lookups(self, request, model_admin): - return ( - ("0", _("Yes")), - ("1", _("No")), - ) diff --git a/.venv/lib/python3.10/site-packages/django_extensions/admin/widgets.py b/.venv/lib/python3.10/site-packages/django_extensions/admin/widgets.py deleted file mode 100644 index 9ed89c3..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/admin/widgets.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding: utf-8 -*- -import urllib - -from django import forms -from django.contrib.admin.sites import site -from django.contrib.admin.widgets import ForeignKeyRawIdWidget -from django.template.loader import render_to_string -from django.templatetags.static import static -from django.urls import reverse -from django.utils.safestring import mark_safe -from django.utils.text import Truncator - - -class ForeignKeySearchInput(ForeignKeyRawIdWidget): - """ - Widget for displaying ForeignKeys in an autocomplete search input - instead in a - - diff --git a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/__init__.py b/.venv/lib/python3.10/site-packages/django_extensions/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/debugger_tags.py b/.venv/lib/python3.10/site-packages/django_extensions/templatetags/debugger_tags.py deleted file mode 100644 index 5ff7dd0..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/debugger_tags.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Make debugging Django templates easier. - -Example: - - {% load debugger_tags %} - - {{ object|ipdb }} - -""" - -from django import template - - -register = template.Library() - - -@register.filter -def ipdb(obj): # pragma: no cover - """Interactive Python debugger filter.""" - __import__("ipdb").set_trace() - return obj - - -@register.filter -def pdb(obj): - """Python debugger filter.""" - __import__("pdb").set_trace() - return obj - - -@register.filter -def wdb(obj): # pragma: no cover - """Web debugger filter.""" - __import__("wdb").set_trace() - return obj diff --git a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/highlighting.py b/.venv/lib/python3.10/site-packages/django_extensions/templatetags/highlighting.py deleted file mode 100644 index 9ff0e83..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/highlighting.py +++ /dev/null @@ -1,104 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Similar to syntax_color.py but this is intended more for being able to -copy+paste actual code into your Django templates without needing to -escape or anything crazy. - -Example: - - {% load highlighting %} - - - -

    check out this code

    - - {% highlight 'python' 'Excerpt: blah.py' %} - def need_food(self): - print("Love is than &death&") - {% endhighlight %} -""" - -from django import template -from django.template import ( - Context, - Node, - Template, - TemplateSyntaxError, - Variable, -) -from django.template.defaultfilters import stringfilter -from django.utils.safestring import mark_safe - -try: - from pygments import highlight as pyghighlight - from pygments.lexers import get_lexer_by_name - from pygments.formatters import HtmlFormatter - - HAS_PYGMENTS = True -except ImportError: # pragma: no cover - HAS_PYGMENTS = False - -register = template.Library() - - -@register.filter(is_safe=True) -@stringfilter -def parse_template(value): - return mark_safe(Template(value).render(Context())) - - -class CodeNode(Node): - def __init__(self, language, nodelist, name=""): - self.language = Variable(language) - self.nodelist = nodelist - if name: - self.name = Variable(name) - else: - self.name = None - - def render(self, context): - code = self.nodelist.render(context).strip() - lexer = get_lexer_by_name(self.language.resolve(context)) - formatter = HtmlFormatter(linenos=False) - html = "" - if self.name: - name = self.name.resolve(context) - html = '
    %s
    ' % name - return html + pyghighlight(code, lexer, formatter) - - -@register.tag -def highlight(parser, token): - """ - Tag to put a highlighted source code
     block in your code.
    -    This takes two arguments, the language and a little explaination message
    -    that will be generated before the code.  The second argument is optional.
    -
    -    Your code will be fed through pygments so you can use any language it
    -    supports.
    -
    -    Usage::
    -
    -      {% load highlighting %}
    -      {% highlight 'python' 'Excerpt: blah.py' %}
    -      def need_food(self):
    -          print("Love is colder than death")
    -      {% endhighlight %}
    -
    -    """
    -    if not HAS_PYGMENTS:  # pragma: no cover
    -        raise ImportError("Please install 'pygments' library to use highlighting.")
    -    nodelist = parser.parse(("endhighlight",))
    -    parser.delete_first_token()
    -    bits = token.split_contents()[1:]
    -    if len(bits) < 1:
    -        raise TemplateSyntaxError("'highlight' statement requires an argument")
    -    return CodeNode(bits[0], nodelist, *bits[1:])
    diff --git a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/indent_text.py b/.venv/lib/python3.10/site-packages/django_extensions/templatetags/indent_text.py
    deleted file mode 100644
    index fb3f280..0000000
    --- a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/indent_text.py
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -# -*- coding: utf-8 -*-
    -from django import template
    -
    -register = template.Library()
    -
    -
    -class IndentByNode(template.Node):
    -    def __init__(self, nodelist, indent_level, if_statement):
    -        self.nodelist = nodelist
    -        self.indent_level = template.Variable(indent_level)
    -        if if_statement:
    -            self.if_statement = template.Variable(if_statement)
    -        else:
    -            self.if_statement = None
    -
    -    def render(self, context):
    -        indent_level = self.indent_level.resolve(context)
    -        if self.if_statement:
    -            try:
    -                if_statement = bool(self.if_statement.resolve(context))
    -            except template.VariableDoesNotExist:
    -                if_statement = False
    -        else:
    -            if_statement = True
    -        output = self.nodelist.render(context)
    -        if if_statement:
    -            indent = " " * indent_level
    -            output = indent + indent.join(output.splitlines(True))
    -        return output
    -
    -
    -@register.tag
    -def indentby(parser, token):
    -    """
    -    Add indentation to text between the tags by the given indentation level.
    -
    -    {% indentby  [if ] %}
    -    ...
    -    {% endindentby %}
    -
    -    Arguments:
    -      indent_level - Number of spaces to indent text with.
    -      statement - Only apply indent_level if the boolean statement evalutates to True.
    -    """
    -    args = token.split_contents()
    -    largs = len(args)
    -    if largs not in (2, 4):
    -        raise template.TemplateSyntaxError("indentby tag requires 1 or 3 arguments")
    -    indent_level = args[1]
    -    if_statement = None
    -    if largs == 4:
    -        if_statement = args[3]
    -    nodelist = parser.parse(("endindentby",))
    -    parser.delete_first_token()
    -    return IndentByNode(nodelist, indent_level, if_statement)
    diff --git a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/syntax_color.py b/.venv/lib/python3.10/site-packages/django_extensions/templatetags/syntax_color.py
    deleted file mode 100644
    index c82fc18..0000000
    --- a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/syntax_color.py
    +++ /dev/null
    @@ -1,118 +0,0 @@
    -# -*- coding: utf-8 -*-
    -r"""
    -Template filter for rendering a string with syntax highlighting.
    -It relies on Pygments to accomplish this.
    -
    -Some standard usage examples (from within Django templates).
    -Coloring a string with the Python lexer:
    -
    -    {% load syntax_color %}
    -    {{ code_string|colorize:"python" }}
    -
    -You may use any lexer in Pygments. The complete list of which
    -can be found [on the Pygments website][1].
    -
    -[1]: https://pygments.org/docs/lexers/
    -
    -You may also have Pygments attempt to guess the correct lexer for
    -a particular string. However, if may not be able to choose a lexer,
    -in which case it will simply return the string unmodified. This is
    -less efficient compared to specifying the lexer to use.
    -
    -    {{ code_string|colorize }}
    -
    -You may also render the syntax highlighted text with line numbers.
    -
    -    {% load syntax_color %}
    -    {{ some_code|colorize_table:"html+django" }}
    -    {{ let_pygments_pick_for_this_code|colorize_table }}
    -
    -Please note that before you can load the ``syntax_color`` template filters
    -you will need to add the ``django_extensions.utils`` application to the
    -``INSTALLED_APPS``setting in your project's ``settings.py`` file.
    -"""
    -
    -import os
    -
    -from django import template
    -from django.template.defaultfilters import stringfilter
    -from django.utils.safestring import mark_safe
    -
    -try:
    -    from pygments import highlight
    -    from pygments.formatters import HtmlFormatter
    -    from pygments.lexers import get_lexer_by_name, guess_lexer, ClassNotFound
    -
    -    HAS_PYGMENTS = True
    -except ImportError:  # pragma: no cover
    -    HAS_PYGMENTS = False
    -
    -__author__ = "Will Larson "
    -
    -
    -register = template.Library()
    -
    -
    -def pygments_required(func):
    -    """Raise ImportError if pygments is not installed."""
    -
    -    def wrapper(*args, **kwargs):
    -        if not HAS_PYGMENTS:  # pragma: no cover
    -            raise ImportError("Please install 'pygments' library to use syntax_color.")
    -        rv = func(*args, **kwargs)
    -        return rv
    -
    -    return wrapper
    -
    -
    -@pygments_required
    -@register.simple_tag
    -def pygments_css():
    -    return HtmlFormatter().get_style_defs(".highlight")
    -
    -
    -def generate_pygments_css(path=None):
    -    path = os.path.join(path or os.getcwd(), "pygments.css")
    -    f = open(path, "w")
    -    f.write(pygments_css())
    -    f.close()
    -
    -
    -def get_lexer(value, arg):
    -    if arg is None:
    -        return guess_lexer(value)
    -    return get_lexer_by_name(arg)
    -
    -
    -@pygments_required
    -@register.filter(name="colorize")
    -@stringfilter
    -def colorize(value, arg=None):
    -    try:
    -        return mark_safe(highlight(value, get_lexer(value, arg), HtmlFormatter()))
    -    except ClassNotFound:
    -        return value
    -
    -
    -@pygments_required
    -@register.filter(name="colorize_table")
    -@stringfilter
    -def colorize_table(value, arg=None):
    -    try:
    -        return mark_safe(
    -            highlight(value, get_lexer(value, arg), HtmlFormatter(linenos="table"))
    -        )
    -    except ClassNotFound:
    -        return value
    -
    -
    -@pygments_required
    -@register.filter(name="colorize_noclasses")
    -@stringfilter
    -def colorize_noclasses(value, arg=None):
    -    try:
    -        return mark_safe(
    -            highlight(value, get_lexer(value, arg), HtmlFormatter(noclasses=True))
    -        )
    -    except ClassNotFound:
    -        return value
    diff --git a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/widont.py b/.venv/lib/python3.10/site-packages/django_extensions/templatetags/widont.py
    deleted file mode 100644
    index a0ab237..0000000
    --- a/.venv/lib/python3.10/site-packages/django_extensions/templatetags/widont.py
    +++ /dev/null
    @@ -1,74 +0,0 @@
    -# -*- coding: utf-8 -*-
    -import re
    -
    -from django.template import Library
    -from django.utils.encoding import force_str
    -
    -
    -register = Library()
    -re_widont = re.compile(r"\s+(\S+\s*)$")
    -re_widont_html = re.compile(
    -    r"([^<>\s])\s+([^<>\s]+\s*)(]*>|$)",
    -    re.IGNORECASE,
    -)
    -
    -
    -@register.filter
    -def widont(value, count=1):
    -    """
    -    Add an HTML non-breaking space between the final two words of the string to
    -    avoid "widowed" words.
    -
    -    Examples:
    -
    -    >>> print(widont('Test   me   out'))
    -    Test   me out
    -
    -    >>> print("'",widont('It works with trailing spaces too  '), "'")
    -    ' It works with trailing spaces too   '
    -
    -    >>> print(widont('NoEffect'))
    -    NoEffect
    -    """
    -
    -    def replace(matchobj):
    -        return force_str(" %s" % matchobj.group(1))
    -
    -    for i in range(count):
    -        value = re_widont.sub(replace, force_str(value))
    -    return value
    -
    -
    -@register.filter
    -def widont_html(value):
    -    """
    -    Add an HTML non-breaking space between the final two words at the end of
    -    (and in sentences just outside of) block level tags to avoid "widowed"
    -    words.
    -
    -    Examples:
    -
    -    >>> print(widont_html('

    Here is a simple example

    Single

    ')) -

    Here is a simple example

    Single

    - - >>> print(widont_html('

    test me
    out

    Ok?

    Not in a p

    and this

    ')) -

    test me
    out

    Ok?

    Not in a p

    and this

    - - >>> print(widont_html('leading text

    test me out

    trailing text')) - leading text

    test me out

    trailing text - """ # noqa: E501 - - def replace(matchobj): - return force_str("%s %s%s" % matchobj.groups()) - - return re_widont_html.sub(replace, force_str(value)) - - -if __name__ == "__main__": - - def _test(): - import doctest - - doctest.testmod() - - _test() diff --git a/.venv/lib/python3.10/site-packages/django_extensions/utils/__init__.py b/.venv/lib/python3.10/site-packages/django_extensions/utils/__init__.py deleted file mode 100644 index a5923e8..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/utils/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -from .internal_ips import InternalIPS # NOQA diff --git a/.venv/lib/python3.10/site-packages/django_extensions/utils/deprecation.py b/.venv/lib/python3.10/site-packages/django_extensions/utils/deprecation.py deleted file mode 100644 index 9b7b835..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/utils/deprecation.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- - - -class MarkedForDeprecationWarning(DeprecationWarning): - pass - - -class RemovedInNextVersionWarning(DeprecationWarning): - pass diff --git a/.venv/lib/python3.10/site-packages/django_extensions/utils/dia2django.py b/.venv/lib/python3.10/site-packages/django_extensions/utils/dia2django.py deleted file mode 100644 index 06736da..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/utils/dia2django.py +++ /dev/null @@ -1,272 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Author Igor Támara igor@tamarapatino.org -Use this little program as you wish, if you -include it in your work, let others know you -are using it preserving this note, you have -the right to make derivative works, Use it -at your own risk. -Tested to work on(etch testing 13-08-2007): - Python 2.4.4 (#2, Jul 17 2007, 11:56:54) - [GCC 4.1.3 20070629 (prerelease) (Debian 4.1.2-13)] on linux2 -""" - -import codecs -import gzip -import re -import sys -from xml.dom.minidom import Node, parseString - -dependclasses = ["User", "Group", "Permission", "Message"] - -# Type dictionary translation types SQL -> Django -tsd = { - "text": "TextField", - "date": "DateField", - "varchar": "CharField", - "int": "IntegerField", - "float": "FloatField", - "serial": "AutoField", - "boolean": "BooleanField", - "numeric": "FloatField", - "timestamp": "DateTimeField", - "bigint": "IntegerField", - "datetime": "DateTimeField", - "time": "TimeField", - "bool": "BooleanField", -} - -# convert varchar -> CharField -v2c = re.compile(r"varchar\((\d+)\)") - - -def find_index(fks, id_): - """ - Look for the id on fks, fks is an array of arrays, each array has on [1] - the id of the class in a dia diagram. When not present returns None, else - it returns the position of the class with id on fks - """ - for i, _ in fks.items(): - if fks[i][1] == id_: - return i - return None - - -def addparentstofks(rels, fks): - """ - Get a list of relations, between parents and sons and a dict of - clases named in dia, and modifies the fks to add the parent as fk to get - order on the output of classes and replaces the base class of the son, to - put the class parent name. - """ - for j in rels: - son = find_index(fks, j[1]) - parent = find_index(fks, j[0]) - fks[son][2] = fks[son][2].replace("models.Model", parent) - if parent not in fks[son][0]: - fks[son][0].append(parent) - - -def dia2django(archivo): - models_txt = "" - f = codecs.open(archivo, "rb") - # dia files are gzipped - data = gzip.GzipFile(fileobj=f).read() - ppal = parseString(data) - # diagram -> layer -> object -> UML - Class -> name, - # (attribs : composite -> name,type) - datos = ( - ppal.getElementsByTagName("dia:diagram")[0] - .getElementsByTagName("dia:layer")[0] - .getElementsByTagName("dia:object") - ) - clases = {} - herit = [] - imports = str("") - for i in datos: - # Look for the classes - if i.getAttribute("type") == "UML - Class": - myid = i.getAttribute("id") - for j in i.childNodes: - if j.nodeType == Node.ELEMENT_NODE and j.hasAttributes(): - if j.getAttribute("name") == "name": - actclas = ( - j.getElementsByTagName("dia:string")[0] - .childNodes[0] - .data[1:-1] - ) - myname = "\nclass %s(models.Model) :\n" % actclas - clases[actclas] = [[], myid, myname, 0] - if j.getAttribute("name") == "attributes": - for ll in j.getElementsByTagName("dia:composite"): - if ll.getAttribute("type") == "umlattribute": - # Look for the attribute name and type - for k in ll.getElementsByTagName("dia:attribute"): - if k.getAttribute("name") == "name": - nc = ( - k.getElementsByTagName("dia:string")[0] - .childNodes[0] - .data[1:-1] - ) - elif k.getAttribute("name") == "type": - tc = ( - k.getElementsByTagName("dia:string")[0] - .childNodes[0] - .data[1:-1] - ) - elif k.getAttribute("name") == "value": - val = ( - k.getElementsByTagName("dia:string")[0] - .childNodes[0] - .data[1:-1] - ) - if val == "##": - val = "" - elif ( - k.getAttribute("name") == "visibility" - and k.getElementsByTagName("dia:enum")[ - 0 - ].getAttribute("val") - == "2" - ): - if ( - tc.replace(" ", "") - .lower() - .startswith("manytomanyfield(") - ): - # If we find a class not in our model that - # is marked as being to another model - newc = tc.replace(" ", "")[16:-1] - if dependclasses.count(newc) == 0: - dependclasses.append(newc) - if ( - tc.replace(" ", "") - .lower() - .startswith("foreignkey(") - ): - # If we find a class not in our model that - # is marked as being to another model - newc = tc.replace(" ", "")[11:-1] - if dependclasses.count(newc) == 0: - dependclasses.append(newc) - - # Mapping SQL types to Django - varch = v2c.search(tc) - if tc.replace(" ", "").startswith("ManyToManyField("): - myfor = tc.replace(" ", "")[16:-1] - if actclas == myfor: - # In case of a recursive type, we use 'self' - tc = tc.replace(myfor, "'self'") - elif clases[actclas][0].count(myfor) == 0: - # Adding related class - if myfor not in dependclasses: - # In case we are using Auth classes or - # external via protected dia visibility - clases[actclas][0].append(myfor) - tc = "models." + tc - if len(val) > 0: - tc = tc.replace(")", "," + val + ")") - elif tc.find("Field") != -1: - if tc.count("()") > 0 and len(val) > 0: - tc = "models.%s" % tc.replace( - ")", "," + val + ")" - ) - else: - tc = "models.%s(%s)" % (tc, val) - elif tc.replace(" ", "").startswith("ForeignKey("): - myfor = tc.replace(" ", "")[11:-1] - if actclas == myfor: - # In case of a recursive type, we use 'self' - tc = tc.replace(myfor, "'self'") - elif clases[actclas][0].count(myfor) == 0: - # Adding foreign classes - if myfor not in dependclasses: - # In case we are using Auth classes - clases[actclas][0].append(myfor) - tc = "models." + tc - if len(val) > 0: - tc = tc.replace(")", "," + val + ")") - elif varch is None: - tc = ( - "models." - + tsd[tc.strip().lower()] - + "(" - + val - + ")" - ) - else: - tc = ( - "models.CharField(max_length=" - + varch.group(1) - + ")" - ) - if len(val) > 0: - tc = tc.replace(")", ", " + val + " )") - if not (nc == "id" and tc == "AutoField()"): - clases[actclas][2] += " %s = %s\n" % (nc, tc) - elif i.getAttribute("type") == "UML - Generalization": - mycons = ["A", "A"] - a = i.getElementsByTagName("dia:connection") - for j in a: - if len(j.getAttribute("to")): - mycons[int(j.getAttribute("handle"))] = j.getAttribute("to") - print(mycons) - if "A" not in mycons: - herit.append(mycons) - elif i.getAttribute("type") == "UML - SmallPackage": - a = i.getElementsByTagName("dia:string") - for j in a: - if len(j.childNodes[0].data[1:-1]): - imports += str( - "from %s.models import *" % j.childNodes[0].data[1:-1] - ) - - addparentstofks(herit, clases) - # Ordering the appearance of classes - # First we make a list of the classes each classs is related to. - ordered = [] - for j, k in clases.items(): - k[2] += '\n def __str__(self):\n return u""\n' - for fk in k[0]: - if fk not in dependclasses: - clases[fk][3] += 1 - ordered.append([j] + k) - - i = 0 - while i < len(ordered): - mark = i - j = i + 1 - while j < len(ordered): - if ordered[i][0] in ordered[j][1]: - mark = j - j += 1 - if mark == i: - i += 1 - else: - # swap ( ordered[i] , ordered[mark]) to make ordered[i] to be at the end - if ordered[i][0] in ordered[mark][1] and ordered[mark][0] in ordered[i][1]: - # Resolving simplistic circular ForeignKeys - print( - "Not able to resolve circular ForeignKeys between %s and %s" - % (ordered[i][1], ordered[mark][0]) - ) - break - a = ordered[i] - ordered[i] = ordered[mark] - ordered[mark] = a - if i == len(ordered) - 1: - break - ordered.reverse() - if imports: - models_txt = str(imports) - for i in ordered: - models_txt += "%s\n" % str(i[3]) - - return models_txt - - -if __name__ == "__main__": - if len(sys.argv) == 2: - dia2django(sys.argv[1]) - else: - print(" Use:\n \n " + sys.argv[0] + " diagram.dia\n\n") diff --git a/.venv/lib/python3.10/site-packages/django_extensions/utils/internal_ips.py b/.venv/lib/python3.10/site-packages/django_extensions/utils/internal_ips.py deleted file mode 100644 index 0a00e85..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/utils/internal_ips.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -from collections.abc import Container -import ipaddress -import itertools - - -class InternalIPS(Container): - """ - InternalIPS allows to specify CIDRs for INTERNAL_IPS. - - It takes an iterable of ip addresses or ranges. - - Inspiration taken from netaddr.IPSet, please use it if you can since - it support more advanced features like optimizing ranges and lookups. - """ - - __slots__ = ["_cidrs"] - - def __init__(self, iterable, sort_by_size=False): - """ - Constructor. - - :param iterable: (optional) an iterable containing IP addresses and - subnets. - - :param sort_by_size: sorts internal list according to size of ip - ranges, largest first. - """ - self._cidrs = [] - for address in iterable: - self._cidrs.append(ipaddress.ip_network(address)) - - if sort_by_size: - self._cidrs = sorted(self._cidrs) - - def __contains__(self, address): - """ - :param ip: An IP address or subnet. - - :return: ``True`` if IP address or subnet is a member of this InternalIPS set. - """ - address = ipaddress.ip_address(address) - for cidr in self._cidrs: - if address in cidr: - return True - return False - - def __hash__(self): - """ - Raises ``TypeError`` if this method is called. - """ - raise TypeError("InternalIPS containers are unhashable!") - - def __len__(self): - """ - :return: the cardinality of this InternalIPS set. - """ - return sum(cidr.num_addresses for cidr in self._cidrs) - - def __iter__(self): - """ - :return: an iterator over the IP addresses within this IP set. - """ - return itertools.chain(*self._cidrs) - - def iter_cidrs(self): - """ - :return: an iterator over individual IP subnets within this IP set. - """ - return sorted(self._cidrs) diff --git a/.venv/lib/python3.10/site-packages/django_extensions/validators.py b/.venv/lib/python3.10/site-packages/django_extensions/validators.py deleted file mode 100644 index 05b12ad..0000000 --- a/.venv/lib/python3.10/site-packages/django_extensions/validators.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- -import unicodedata -import binascii - -from django.core.exceptions import ValidationError -from django.utils.deconstruct import deconstructible -from django.utils.encoding import force_str -from django.utils.translation import gettext_lazy as _ - - -@deconstructible -class NoControlCharactersValidator: - message = _("Control Characters like new lines or tabs are not allowed.") - code = "no_control_characters" - whitelist = None - - def __init__(self, message=None, code=None, whitelist=None): - if message: - self.message = message - if code: - self.code = code - if whitelist: - self.whitelist = whitelist - - def __call__(self, value): - value = force_str(value) - whitelist = self.whitelist - category = unicodedata.category - for character in value: - if whitelist and character in whitelist: - continue - if category(character)[0] == "C": - params = {"value": value, "whitelist": whitelist} - raise ValidationError(self.message, code=self.code, params=params) - - def __eq__(self, other): - return ( - isinstance(other, NoControlCharactersValidator) - and (self.whitelist == other.whitelist) - and (self.message == other.message) - and (self.code == other.code) - ) - - -@deconstructible -class NoWhitespaceValidator: - message = _("Leading and Trailing whitespaces are not allowed.") - code = "no_whitespace" - - def __init__(self, message=None, code=None, whitelist=None): - if message: - self.message = message - if code: - self.code = code - - def __call__(self, value): - value = force_str(value) - if value != value.strip(): - params = {"value": value} - raise ValidationError(self.message, code=self.code, params=params) - - def __eq__(self, other): - return ( - isinstance(other, NoWhitespaceValidator) - and (self.message == other.message) - and (self.code == other.code) - ) - - -@deconstructible -class HexValidator: - messages = { - "invalid": _("Only a hex string is allowed."), - "length": _("Invalid length. Must be %(length)d characters."), - "min_length": _("Ensure that there are more than %(min)s characters."), - "max_length": _("Ensure that there are no more than %(max)s characters."), - } - code = "hex_only" - - def __init__( - self, length=None, min_length=None, max_length=None, message=None, code=None - ): - self.length = length - self.min_length = min_length - self.max_length = max_length - if message: - self.message = message - else: - self.message = self.messages["invalid"] - if code: - self.code = code - - def __call__(self, value): - value = force_str(value) - if self.length and len(value) != self.length: - raise ValidationError( - self.messages["length"], - code="hex_only_length", - params={"length": self.length}, - ) - if self.min_length and len(value) < self.min_length: - raise ValidationError( - self.messages["min_length"], - code="hex_only_min_length", - params={"min": self.min_length}, - ) - if self.max_length and len(value) > self.max_length: - raise ValidationError( - self.messages["max_length"], - code="hex_only_max_length", - params={"max": self.max_length}, - ) - - try: - binascii.unhexlify(value) - except (TypeError, binascii.Error): - raise ValidationError(self.messages["invalid"], code="hex_only") - - def __eq__(self, other): - return ( - isinstance(other, HexValidator) - and (self.message == other.message) - and (self.code == other.code) - ) diff --git a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/LICENSE b/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/LICENSE deleted file mode 100644 index d5d54e8..0000000 --- a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019 Tim Kamanin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/METADATA b/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/METADATA deleted file mode 100644 index b31e92b..0000000 --- a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/METADATA +++ /dev/null @@ -1,69 +0,0 @@ -Metadata-Version: 2.1 -Name: django-tailwind -Version: 4.0.1 -Summary: Tailwind CSS Framework for Django projects -Home-page: https://github.com/timonweb/django-tailwind -License: MIT -Keywords: django,tailwind,css -Author: Tim Kamanin -Author-email: tim@timonweb.com -Requires-Python: >=3.10,<4.0 -Classifier: Development Status :: 4 - Beta -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Topic :: Software Development :: Libraries -Classifier: Topic :: Utilities -Provides-Extra: reload -Requires-Dist: django (>=4.2.20) -Requires-Dist: django-browser-reload (>=1.18.0,<2.0.0) ; extra == "reload" -Description-Content-Type: text/markdown - -# Tailwind CSS integration for Django a.k.a. Django + Tailwind = 💚 -![Django Tailwind Demo](https://raw.githubusercontent.com/timonweb/django-tailwind/master/docs/django-tailwind-demo-800.gif) - -## Goal -This project aims to provide a comfortable way of using the *Tailwind CSS* framework within a Django project. - -## Features -* An opinionated *Tailwind CSS* setup that makes your life easier; -* Hot reloading of CSS, configuration files, and *Django* templates. No more manual page refreshes! -* Out of the box support for CSS imports, SASS-like variables, and nesting; -* Includes official *Tailwind CSS* plugins like *typography*, *form*, *line-clamp*, and *aspect-ratio*; -* Supports the latest *Tailwind CSS* `v3.x`; - -> [For instructions on upgrading from `v2` to `v3`, see this post on my blog](https://timonweb.com/django/django-tailwind-with-support-for-the-latest-tailwind-css-v3-is-out/). - -## Requirements -Python 3.10 or newer with Django >= 4.2.20 or newer. - -## Documentation -The full documentation is at https://django-tailwind.readthedocs.io/ - -## Installation -Via PIP: -```bash -pip install django-tailwind -``` - -[RECOMMENDED IN DEV] If you want to use automatic page reloads during development use the `[reload]` extras, which installs the `django-browser-reload` package in addition: - - ```bash - pip install 'django-tailwind[reload]' - ``` - -Check docs for the [Installation](https://django-tailwind.readthedocs.io/en/latest/installation.html) instructions. - -## Bugs and suggestions - -Please see [CONTRIBUTING](CONTRIBUTING.md). - -2019 - 2025 (c) [Tim Kamanin - A Full Stack Django Developer](https://timonweb.com) - diff --git a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/RECORD b/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/RECORD deleted file mode 100644 index 60386d6..0000000 --- a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/RECORD +++ /dev/null @@ -1,49 +0,0 @@ -django_tailwind-4.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -django_tailwind-4.0.1.dist-info/LICENSE,sha256=htQDvjKtOLJxi8Tz0hybW1juf4G24j4iKgXTP1JovzQ,1078 -django_tailwind-4.0.1.dist-info/METADATA,sha256=2lSt18317fwc21z4tx7otHKGgHmumNlBQcEdpIIFsFc,2679 -django_tailwind-4.0.1.dist-info/RECORD,, -django_tailwind-4.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django_tailwind-4.0.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88 -tailwind/__init__.py,sha256=CRzJlI9k7yXv1Rfx8zUXWAtfAt9oQOZqCJvEt5HSWKk,524 -tailwind/__pycache__/__init__.cpython-310.pyc,, -tailwind/__pycache__/apps.cpython-310.pyc,, -tailwind/__pycache__/npm.cpython-310.pyc,, -tailwind/__pycache__/utils.cpython-310.pyc,, -tailwind/__pycache__/validate.cpython-310.pyc,, -tailwind/app_template_v3/cookiecutter.json,sha256=F4wiRyFqW0l9w3B2NvqTKdW-jiRdaR9ok63pn3q7Tho,80 -tailwind/app_template_v3/hooks/__pycache__/pre_gen_project.cpython-310.pyc,, -tailwind/app_template_v3/hooks/pre_gen_project.py,sha256=qMM4UNU7ElqLJHI61WmKyXVwYIPdNmegUw8bXkf8qd8,292 -tailwind/app_template_v3/{{cookiecutter.app_name}}/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tailwind/app_template_v3/{{cookiecutter.app_name}}/__pycache__/__init__.cpython-310.pyc,, -tailwind/app_template_v3/{{cookiecutter.app_name}}/apps.py,sha256=jcTyTzc1Yq8Bd2fh7SFt-_YCU7Xh2lRX_PZlZuJU96g,169 -tailwind/app_template_v3/{{cookiecutter.app_name}}/static_src/.gitignore,sha256=FtMORGIYn7FN1hG9twjFEGMMV2ofNbk4PomkNS2jbJc,13 -tailwind/app_template_v3/{{cookiecutter.app_name}}/static_src/package.json,sha256=MuUmw16ojFOZQBd2CjZayEUP1hYr835QtQ7uqipiB5c,982 -tailwind/app_template_v3/{{cookiecutter.app_name}}/static_src/postcss.config.js,sha256=ykvWj3ftwiOvYH45RtyXnDPXiSFn55Y6-Kd62HahDk0,121 -tailwind/app_template_v3/{{cookiecutter.app_name}}/static_src/src/styles.css,sha256=zBp60NAZ3bHTLQ7LWIugrCbOQdhiXdbDZjSLJfg6KOw,59 -tailwind/app_template_v3/{{cookiecutter.app_name}}/static_src/tailwind.config.js,sha256=5XUxfI0OigO27rd-LH4R0UjOnZ4tJeaD6JSkPUfXsgU,1891 -tailwind/app_template_v3/{{cookiecutter.app_name}}/templates/base.html,sha256=a2QubGMnr7ohaFXfq83rBtmsxKbJ40XFzb64jHpiZvQ,556 -tailwind/app_template_v4/cookiecutter.json,sha256=F4wiRyFqW0l9w3B2NvqTKdW-jiRdaR9ok63pn3q7Tho,80 -tailwind/app_template_v4/hooks/__pycache__/pre_gen_project.cpython-310.pyc,, -tailwind/app_template_v4/hooks/pre_gen_project.py,sha256=qMM4UNU7ElqLJHI61WmKyXVwYIPdNmegUw8bXkf8qd8,292 -tailwind/app_template_v4/{{cookiecutter.app_name}}/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tailwind/app_template_v4/{{cookiecutter.app_name}}/__pycache__/__init__.cpython-310.pyc,, -tailwind/app_template_v4/{{cookiecutter.app_name}}/apps.py,sha256=jcTyTzc1Yq8Bd2fh7SFt-_YCU7Xh2lRX_PZlZuJU96g,169 -tailwind/app_template_v4/{{cookiecutter.app_name}}/static_src/.gitignore,sha256=FtMORGIYn7FN1hG9twjFEGMMV2ofNbk4PomkNS2jbJc,13 -tailwind/app_template_v4/{{cookiecutter.app_name}}/static_src/package.json,sha256=PCvQWDX5cv3AprctfegprzKzxjS0ABW7KAISqWP3fSI,800 -tailwind/app_template_v4/{{cookiecutter.app_name}}/static_src/postcss.config.js,sha256=FT6DnhbgJACRwKDb3RmShJew1vWWpb94QuXspuOGAwE,127 -tailwind/app_template_v4/{{cookiecutter.app_name}}/static_src/src/styles.css,sha256=-9viOFfq5dRJRvmPU9ssdpXhDa2wgSgH9uiV8oS2PK8,383 -tailwind/app_template_v4/{{cookiecutter.app_name}}/templates/base.html,sha256=a2QubGMnr7ohaFXfq83rBtmsxKbJ40XFzb64jHpiZvQ,556 -tailwind/apps.py,sha256=_OUAG1Bnh1CjoNshiCQntp6-zB1i-YDtxvBMwqQeGV0,91 -tailwind/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tailwind/management/__pycache__/__init__.cpython-310.pyc,, -tailwind/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tailwind/management/commands/__pycache__/__init__.cpython-310.pyc,, -tailwind/management/commands/__pycache__/tailwind.cpython-310.pyc,, -tailwind/management/commands/tailwind.py,sha256=qoXpYwUQcoh08Y38t5Gx68Wo5mVxRklTeVd5vVUZxqM,4951 -tailwind/npm.py,sha256=lo4_Jzi1-dZH0B4rMZkXwo4qr2kbb450VFXxzSSIbws,1150 -tailwind/templates/tailwind/tags/css.html,sha256=RZgCXf-NgCAfvpudydZmVqPuj0AfGbAPT-rJ6JMdIhg,510 -tailwind/templates/tailwind/tags/preload_css.html,sha256=I3f9JJHjVGlsCrkVnG5QiGvfTEUmi1miQz3weyXcb8c,187 -tailwind/templatetags/__pycache__/tailwind_tags.cpython-310.pyc,, -tailwind/templatetags/tailwind_tags.py,sha256=H0f9g-KHMywhcg8kqxjqws02m9pOXVeJquBdRnvggDE,896 -tailwind/utils.py,sha256=kDTEZa8UobFk-Ud45i00p0HJG6wBhc6dLN0zOarQ8-8,762 -tailwind/validate.py,sha256=k578cN0rFVNxgRSo0YstVBav1Hv0L6YpICLrYz1rkQo,1012 diff --git a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/REQUESTED b/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/WHEEL deleted file mode 100644 index d73ccaa..0000000 --- a/.venv/lib/python3.10/site-packages/django_tailwind-4.0.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: poetry-core 1.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/METADATA b/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/METADATA deleted file mode 100644 index fd5a1aa..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/METADATA +++ /dev/null @@ -1,274 +0,0 @@ -Metadata-Version: 2.4 -Name: djangorestframework -Version: 3.16.0 -Summary: Web APIs for Django, made easy. -Home-page: https://www.django-rest-framework.org/ -Author: Tom Christie -Author-email: tom@tomchristie.com -License: BSD -Project-URL: Funding, https://fund.django-rest-framework.org/topics/funding/ -Project-URL: Source, https://github.com/encode/django-rest-framework -Project-URL: Changelog, https://www.django-rest-framework.org/community/release-notes/ -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Framework :: Django :: 4.2 -Classifier: Framework :: Django :: 5.0 -Classifier: Framework :: Django :: 5.1 -Classifier: Framework :: Django :: 5.2 -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Topic :: Internet :: WWW/HTTP -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -License-File: LICENSE.md -Requires-Dist: django>=4.2 -Requires-Dist: backports.zoneinfo; python_version < "3.9" -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: description-content-type -Dynamic: home-page -Dynamic: license -Dynamic: license-file -Dynamic: project-url -Dynamic: requires-dist -Dynamic: requires-python -Dynamic: summary - -# [Django REST framework][docs] - -[![build-status-image]][build-status] -[![coverage-status-image]][codecov] -[![pypi-version]][pypi] - -**Awesome web-browsable Web APIs.** - -Full documentation for the project is available at [https://www.django-rest-framework.org/][docs]. - ---- - -# Funding - -REST framework is a *collaboratively funded project*. If you use -REST framework commercially we strongly encourage you to invest in its -continued development by [signing up for a paid plan][funding]. - -The initial aim is to provide a single full-time position on REST framework. -*Every single sign-up makes a significant impact towards making that possible.* - -[![][sentry-img]][sentry-url] -[![][stream-img]][stream-url] -[![][spacinov-img]][spacinov-url] -[![][retool-img]][retool-url] -[![][bitio-img]][bitio-url] -[![][posthog-img]][posthog-url] -[![][cryptapi-img]][cryptapi-url] -[![][fezto-img]][fezto-url] -[![][svix-img]][svix-url] -[![][zuplo-img]][zuplo-url] - -Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry][sentry-url], [Stream][stream-url], [Spacinov][spacinov-url], [Retool][retool-url], [bit.io][bitio-url], [PostHog][posthog-url], [CryptAPI][cryptapi-url], [FEZTO][fezto-url], [Svix][svix-url], and [Zuplo][zuplo-url]. - ---- - -# Overview - -Django REST framework is a powerful and flexible toolkit for building Web APIs. - -Some reasons you might want to use REST framework: - -* The Web browsable API is a huge usability win for your developers. -* [Authentication policies][authentication] including optional packages for [OAuth1a][oauth1-section] and [OAuth2][oauth2-section]. -* [Serialization][serializers] that supports both [ORM][modelserializer-section] and [non-ORM][serializer-section] data sources. -* Customizable all the way down - just use [regular function-based views][functionview-section] if you don't need the [more][generic-views] [powerful][viewsets] [features][routers]. -* [Extensive documentation][docs], and [great community support][group]. - -**Below**: *Screenshot from the browsable API* - -![Screenshot][image] - ----- - -# Requirements - -* Python 3.9+ -* Django 4.2, 5.0, 5.1, 5.2 - -We **highly recommend** and only officially support the latest patch release of -each Python and Django series. - -# Installation - -Install using `pip`... - - pip install djangorestframework - -Add `'rest_framework'` to your `INSTALLED_APPS` setting. -```python -INSTALLED_APPS = [ - ... - 'rest_framework', -] -``` - -# Example - -Let's take a look at a quick example of using REST framework to build a simple model-backed API for accessing users and groups. - -Startup up a new project like so... - - pip install django - pip install djangorestframework - django-admin startproject example . - ./manage.py migrate - ./manage.py createsuperuser - - -Now edit the `example/urls.py` module in your project: - -```python -from django.contrib.auth.models import User -from django.urls import include, path -from rest_framework import routers, serializers, viewsets - - -# Serializers define the API representation. -class UserSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = User - fields = ['url', 'username', 'email', 'is_staff'] - - -# ViewSets define the view behavior. -class UserViewSet(viewsets.ModelViewSet): - queryset = User.objects.all() - serializer_class = UserSerializer - - -# Routers provide a way of automatically determining the URL conf. -router = routers.DefaultRouter() -router.register(r'users', UserViewSet) - -# Wire up our API using automatic URL routing. -# Additionally, we include login URLs for the browsable API. -urlpatterns = [ - path('', include(router.urls)), - path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), -] -``` - -We'd also like to configure a couple of settings for our API. - -Add the following to your `settings.py` module: - -```python -INSTALLED_APPS = [ - ... # Make sure to include the default installed apps here. - 'rest_framework', -] - -REST_FRAMEWORK = { - # Use Django's standard `django.contrib.auth` permissions, - # or allow read-only access for unauthenticated users. - 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly', - ] -} -``` - -That's it, we're done! - - ./manage.py runserver - -You can now open the API in your browser at `http://127.0.0.1:8000/`, and view your new 'users' API. If you use the `Login` control in the top right corner you'll also be able to add, create and delete users from the system. - -You can also interact with the API using command line tools such as [`curl`](https://curl.haxx.se/). For example, to list the users endpoint: - - $ curl -H 'Accept: application/json; indent=4' -u admin:password http://127.0.0.1:8000/users/ - [ - { - "url": "http://127.0.0.1:8000/users/1/", - "username": "admin", - "email": "admin@example.com", - "is_staff": true, - } - ] - -Or to create a new user: - - $ curl -X POST -d username=new -d email=new@example.com -d is_staff=false -H 'Accept: application/json; indent=4' -u admin:password http://127.0.0.1:8000/users/ - { - "url": "http://127.0.0.1:8000/users/2/", - "username": "new", - "email": "new@example.com", - "is_staff": false, - } - -# Documentation & Support - -Full documentation for the project is available at [https://www.django-rest-framework.org/][docs]. - -For questions and support, use the [REST framework discussion group][group], or `#restframework` on libera.chat IRC. - -# Security - -Please see the [security policy][security-policy]. - -[build-status-image]: https://github.com/encode/django-rest-framework/actions/workflows/main.yml/badge.svg -[build-status]: https://github.com/encode/django-rest-framework/actions/workflows/main.yml -[coverage-status-image]: https://img.shields.io/codecov/c/github/encode/django-rest-framework/master.svg -[codecov]: https://codecov.io/github/encode/django-rest-framework?branch=master -[pypi-version]: https://img.shields.io/pypi/v/djangorestframework.svg -[pypi]: https://pypi.org/project/djangorestframework/ -[group]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework - -[funding]: https://fund.django-rest-framework.org/topics/funding/ -[sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors - -[sentry-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/sentry-readme.png -[stream-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/stream-readme.png -[spacinov-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/spacinov-readme.png -[retool-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/retool-readme.png -[bitio-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/bitio-readme.png -[posthog-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/posthog-readme.png -[cryptapi-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/cryptapi-readme.png -[fezto-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/fezto-readme.png -[svix-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/svix-premium.png -[zuplo-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/zuplo-readme.png - -[sentry-url]: https://getsentry.com/welcome/ -[stream-url]: https://getstream.io/?utm_source=DjangoRESTFramework&utm_medium=Webpage_Logo_Ad&utm_content=Developer&utm_campaign=DjangoRESTFramework_Jan2022_HomePage -[spacinov-url]: https://www.spacinov.com/ -[retool-url]: https://retool.com/?utm_source=djangorest&utm_medium=sponsorship -[bitio-url]: https://bit.io/jobs?utm_source=DRF&utm_medium=sponsor&utm_campaign=DRF_sponsorship -[posthog-url]: https://posthog.com?utm_source=drf&utm_medium=sponsorship&utm_campaign=open-source-sponsorship -[cryptapi-url]: https://cryptapi.io -[fezto-url]: https://www.fezto.xyz/?utm_source=DjangoRESTFramework -[svix-url]: https://www.svix.com/?utm_source=django-REST&utm_medium=sponsorship -[zuplo-url]: https://zuplo.link/django-gh - -[oauth1-section]: https://www.django-rest-framework.org/api-guide/authentication/#django-rest-framework-oauth -[oauth2-section]: https://www.django-rest-framework.org/api-guide/authentication/#django-oauth-toolkit -[serializer-section]: https://www.django-rest-framework.org/api-guide/serializers/#serializers -[modelserializer-section]: https://www.django-rest-framework.org/api-guide/serializers/#modelserializer -[functionview-section]: https://www.django-rest-framework.org/api-guide/views/#function-based-views -[generic-views]: https://www.django-rest-framework.org/api-guide/generic-views/ -[viewsets]: https://www.django-rest-framework.org/api-guide/viewsets/ -[routers]: https://www.django-rest-framework.org/api-guide/routers/ -[serializers]: https://www.django-rest-framework.org/api-guide/serializers/ -[authentication]: https://www.django-rest-framework.org/api-guide/authentication/ -[image]: https://www.django-rest-framework.org/img/quickstart.png - -[docs]: https://www.django-rest-framework.org/ -[security-policy]: https://github.com/encode/django-rest-framework/security/policy diff --git a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/RECORD b/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/RECORD deleted file mode 100644 index c0a5a53..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/RECORD +++ /dev/null @@ -1,318 +0,0 @@ -djangorestframework-3.16.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -djangorestframework-3.16.0.dist-info/METADATA,sha256=DM3nXeQn5ktR9_O9vzahM3iXjDjrXT_T6fTAuIe4vgc,11134 -djangorestframework-3.16.0.dist-info/RECORD,, -djangorestframework-3.16.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -djangorestframework-3.16.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91 -djangorestframework-3.16.0.dist-info/licenses/LICENSE.md,sha256=zBKwuFNolyF36_QiCJQZuf4-6lcp_ssREFxkD27qzNQ,1537 -djangorestframework-3.16.0.dist-info/top_level.txt,sha256=_sDOIN5T7esgAN5zlnfLHLo7AG7TWqBYVTyFKVRdXv4,15 -rest_framework/__init__.py,sha256=KuzWyDUQJ89rKCPNG-7oC5i6yuuwszxxf6II1RinrSA,855 -rest_framework/__pycache__/__init__.cpython-310.pyc,, -rest_framework/__pycache__/apps.cpython-310.pyc,, -rest_framework/__pycache__/authentication.cpython-310.pyc,, -rest_framework/__pycache__/checks.cpython-310.pyc,, -rest_framework/__pycache__/compat.cpython-310.pyc,, -rest_framework/__pycache__/decorators.cpython-310.pyc,, -rest_framework/__pycache__/documentation.cpython-310.pyc,, -rest_framework/__pycache__/exceptions.cpython-310.pyc,, -rest_framework/__pycache__/fields.cpython-310.pyc,, -rest_framework/__pycache__/filters.cpython-310.pyc,, -rest_framework/__pycache__/generics.cpython-310.pyc,, -rest_framework/__pycache__/metadata.cpython-310.pyc,, -rest_framework/__pycache__/mixins.cpython-310.pyc,, -rest_framework/__pycache__/negotiation.cpython-310.pyc,, -rest_framework/__pycache__/pagination.cpython-310.pyc,, -rest_framework/__pycache__/parsers.cpython-310.pyc,, -rest_framework/__pycache__/permissions.cpython-310.pyc,, -rest_framework/__pycache__/relations.cpython-310.pyc,, -rest_framework/__pycache__/renderers.cpython-310.pyc,, -rest_framework/__pycache__/request.cpython-310.pyc,, -rest_framework/__pycache__/response.cpython-310.pyc,, -rest_framework/__pycache__/reverse.cpython-310.pyc,, -rest_framework/__pycache__/routers.cpython-310.pyc,, -rest_framework/__pycache__/serializers.cpython-310.pyc,, -rest_framework/__pycache__/settings.cpython-310.pyc,, -rest_framework/__pycache__/status.cpython-310.pyc,, -rest_framework/__pycache__/test.cpython-310.pyc,, -rest_framework/__pycache__/throttling.cpython-310.pyc,, -rest_framework/__pycache__/urlpatterns.cpython-310.pyc,, -rest_framework/__pycache__/urls.cpython-310.pyc,, -rest_framework/__pycache__/validators.cpython-310.pyc,, -rest_framework/__pycache__/versioning.cpython-310.pyc,, -rest_framework/__pycache__/views.cpython-310.pyc,, -rest_framework/__pycache__/viewsets.cpython-310.pyc,, -rest_framework/apps.py,sha256=e-soDnr6WzO5YU4VKliGBgP_vneqoR85SiftQ7H7Ge4,255 -rest_framework/authentication.py,sha256=PXz8rBwYqWgwnZMflWO7jPBiUuGyvQ0fE3b89lb431M,7701 -rest_framework/authtoken/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework/authtoken/__pycache__/__init__.cpython-310.pyc,, -rest_framework/authtoken/__pycache__/admin.cpython-310.pyc,, -rest_framework/authtoken/__pycache__/apps.cpython-310.pyc,, -rest_framework/authtoken/__pycache__/models.cpython-310.pyc,, -rest_framework/authtoken/__pycache__/serializers.cpython-310.pyc,, -rest_framework/authtoken/__pycache__/views.cpython-310.pyc,, -rest_framework/authtoken/admin.py,sha256=9gS4KYEb5j0Rq9HDWuisyopoUTqtpkqzfXIJMAKA5-I,1892 -rest_framework/authtoken/apps.py,sha256=O5R_48w8g0cThVJ0k2TH3x5t7D1KTdN3zsKwPXZDYSQ,198 -rest_framework/authtoken/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework/authtoken/management/__pycache__/__init__.cpython-310.pyc,, -rest_framework/authtoken/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework/authtoken/management/commands/__pycache__/__init__.cpython-310.pyc,, -rest_framework/authtoken/management/commands/__pycache__/drf_create_token.cpython-310.pyc,, -rest_framework/authtoken/management/commands/drf_create_token.py,sha256=CcGkuS62daT8YXIMt64mbc0Qu1zA5sInKSI0K1Vsx9U,1380 -rest_framework/authtoken/migrations/0001_initial.py,sha256=8hmactx2pKGeJV95raW4F7klyXNlcNQBvmahvnLj2xU,706 -rest_framework/authtoken/migrations/0002_auto_20160226_1747.py,sha256=f2C8kJ1D4A2uTte1H2UCc2-p_gxPWzT4_96oagJ56nk,994 -rest_framework/authtoken/migrations/0003_tokenproxy.py,sha256=bsFvzO_i8iMRaHvebIZU55HKNr08kg2D6LtduZQDXGw,552 -rest_framework/authtoken/migrations/0004_alter_tokenproxy_options.py,sha256=K2H4fArY_5XGFsoCfkBekbl4Q_w3XD2Ww2Zlb-AZfig,379 -rest_framework/authtoken/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework/authtoken/migrations/__pycache__/0001_initial.cpython-310.pyc,, -rest_framework/authtoken/migrations/__pycache__/0002_auto_20160226_1747.cpython-310.pyc,, -rest_framework/authtoken/migrations/__pycache__/0003_tokenproxy.cpython-310.pyc,, -rest_framework/authtoken/migrations/__pycache__/0004_alter_tokenproxy_options.cpython-310.pyc,, -rest_framework/authtoken/migrations/__pycache__/__init__.cpython-310.pyc,, -rest_framework/authtoken/models.py,sha256=CJzKy2OLiqzYYqBK8iscBUUNRdnBlQAYRpCHfeQMKDA,1608 -rest_framework/authtoken/serializers.py,sha256=gZFJ3qhW17dOPigqY0_Qx9xVQeRD1V8fy1j07QXKmUc,1384 -rest_framework/authtoken/views.py,sha256=IXX6PNUwguRq7ZGebrG-vguAMFkSOmq4qPJI7CTcyAY,2216 -rest_framework/checks.py,sha256=WO57Y9Ks_MQKq0FsFVXoP7odQMQyVIr-LbPt6fcx2LU,970 -rest_framework/compat.py,sha256=dgnKa5qMPo_EXgVFZ61xrmFs478nedWdzA4zyF3Bqm8,6298 -rest_framework/decorators.py,sha256=Wave2lj0AJzdng_IiQBzsaF3Gj7uHJXQHaFVyLksvPs,7784 -rest_framework/documentation.py,sha256=EKZGzMUzXq8H_bri0dRJ89npwT6JwKQOENNPHaYQ5-k,3054 -rest_framework/exceptions.py,sha256=k15a5yZPMk4IT2FbVmIFkeARH15nIENRTX2b5B3LoGI,8159 -rest_framework/fields.py,sha256=SRE2mQf2LKb2Vbj4-UPJzg6k3J6XuG6VAG_yPHu2qdo,68906 -rest_framework/filters.py,sha256=50TqkJ_6tfOUnEA8AU9TQ7cSd_dPg70PIGhot4wahlw,14802 -rest_framework/generics.py,sha256=po8I479IOJpGEpNyMF7pg9FISwiM-ZBwOG-piE6vraA,10164 -rest_framework/locale/ach/LC_MESSAGES/django.mo,sha256=3LyV_OzlARDfeuhvZp6OCdt6xH4esewLh5fU8a4eXxg,472 -rest_framework/locale/ar/LC_MESSAGES/django.mo,sha256=th7efxoto1P_iFZKFezHyVuQYOyspbvusm-fAnk5j84,12150 -rest_framework/locale/az/LC_MESSAGES/django.mo,sha256=B3IIoIYmYPkM9iOsm0I10Zb__w7rVVZ9HhWMhbvv5bA,10428 -rest_framework/locale/be/LC_MESSAGES/django.mo,sha256=TvqPpcP1PWvOx6RwBM1vO5fUaqXMRddmwRb05TuqTaQ,614 -rest_framework/locale/bg/LC_MESSAGES/django.mo,sha256=j8UXyFO7YdRsZ5OwtI15fUmrN6QnSJonpX_eIo74WCQ,13083 -rest_framework/locale/ca/LC_MESSAGES/django.mo,sha256=5h1KYV14JnFIX02ABU8WeFlqJGKCBKtgbRMcR2lzjpE,9300 -rest_framework/locale/ca_ES/LC_MESSAGES/django.mo,sha256=Toqlh8opAxtm46W5UGvLZW_nsXjkjUoAMQjc5dF-WiQ,487 -rest_framework/locale/cs/LC_MESSAGES/django.mo,sha256=KMLhUh-qAPlAvKWaGZYgFJKCMaLH0N5SdgOY2d0gSig,10519 -rest_framework/locale/da/LC_MESSAGES/django.mo,sha256=_RNWqDszm5SPR6m6LJSkpkLsOlxX6FCm7mV2Ln8JDZw,9955 -rest_framework/locale/de/LC_MESSAGES/django.mo,sha256=8v8nY8HmMIOteF2s24sTFK7lOKTShTxvMWhbm0qMm3A,10490 -rest_framework/locale/el/LC_MESSAGES/django.mo,sha256=RbxSQ08hrFB173iNcfVTvoAU5teTkl9SKsEFLuOK2BI,12933 -rest_framework/locale/el_GR/LC_MESSAGES/django.mo,sha256=_oUBBH7uSAlTcQ3Km2U2kwFRMnpG3Fz0X1CuAQbU_9I,486 -rest_framework/locale/en/LC_MESSAGES/django.mo,sha256=NTQOG7G0S5cILPfjiwr5jGLFS6-BLSkJWz-IZ34WnqU,12285 -rest_framework/locale/en_AU/LC_MESSAGES/django.mo,sha256=6yNdQp3uMV-f63P7xuvX6fzRyb-iG3upwHmz2cJHNlU,491 -rest_framework/locale/en_CA/LC_MESSAGES/django.mo,sha256=JT4wh-kQWfeO4T-be9lwbDaLz0QVu5P0SnK4BDJfOSQ,488 -rest_framework/locale/en_US/LC_MESSAGES/django.mo,sha256=UXCQbz2AxBvh-IQ7bGgjoBnijo8h9DfE9107A-2Mgkk,337 -rest_framework/locale/es/LC_MESSAGES/django.mo,sha256=2NqCq4Rk6k0sZUOk1OO55VWSOgHRnuUuvgcc3wB7MUY,10627 -rest_framework/locale/et/LC_MESSAGES/django.mo,sha256=-ZMrAfUiqMzPnxJD6qNCY3RqRl7m0jY8LjwFz68dxM4,10096 -rest_framework/locale/fa/LC_MESSAGES/django.mo,sha256=a1B7CgBlwt9D_cHqB6VJbj-PUiSvG1QNsij6cPVom_s,11976 -rest_framework/locale/fa_IR/LC_MESSAGES/django.mo,sha256=noozw2D2GAuSX9HrpQY3S0PdrWc0olkbyoeNjYVDQLI,11989 -rest_framework/locale/fi/LC_MESSAGES/django.mo,sha256=-TPYxiKlLMCOfjPRM9rvvO5KTuj5XnrJhABw9Db8dSs,10197 -rest_framework/locale/fr/LC_MESSAGES/django.mo,sha256=56a48bfyLGVnGrTiKqGNe6fb4fYDkoJSarLeP3dbmc0,10662 -rest_framework/locale/fr_CA/LC_MESSAGES/django.mo,sha256=AIkTPlyS_J4u1-DtjroxlYZ4_xK8s_dBR8ps593XVTE,486 -rest_framework/locale/gl/LC_MESSAGES/django.mo,sha256=-dhiLFcnF6nZSm2F1jLGOu9JYHAKz468w2hD48Hf7qU,474 -rest_framework/locale/gl_ES/LC_MESSAGES/django.mo,sha256=IQjsBgbgFHZ48iWHMeHzfbnlhReQNoeFq3pCYMSb8gA,628 -rest_framework/locale/he_IL/LC_MESSAGES/django.mo,sha256=JmkZjjtdpkm_51gHbWDa6LnAXK8dHBdxWvkZLVchTPU,487 -rest_framework/locale/hu/LC_MESSAGES/django.mo,sha256=DsEmG9PSPMP_thCE2j_Z4MUIxVb9JY0IPxwxSjit9DI,10844 -rest_framework/locale/hy/LC_MESSAGES/django.mo,sha256=r5Gjh2x7RTGjPt05NzsxzeS6nQxqNClR9J1UYpR1W30,12885 -rest_framework/locale/id/LC_MESSAGES/django.mo,sha256=X8mmBaEYQ0U1PBKpmVzEv07jqdrZAQmWaINMjnFEIGo,5188 -rest_framework/locale/it/LC_MESSAGES/django.mo,sha256=Seuvke2Kb3XZyBgsLndK4kc4ABOHFb1ok2SNWZLBk3o,10480 -rest_framework/locale/ja/LC_MESSAGES/django.mo,sha256=D19OXy2vt0t54yPYCbDe9BGwnrBemcH3zkwXD2YphcA,11759 -rest_framework/locale/ko_KR/LC_MESSAGES/django.mo,sha256=M09dPfSrFqcX8Te7xXGgnhgIk52LhxksiLrooZ3sFvE,11698 -rest_framework/locale/lt/LC_MESSAGES/django.mo,sha256=-6W2uJJ3gYEYkd1H1CF4MfRykn75_HJ2V4vgm0rlu48,5056 -rest_framework/locale/lv/LC_MESSAGES/django.mo,sha256=VcPsDP3hVZt8YMlq1RdgYm_WUIo5QWt4SBTe9KyIn_k,10423 -rest_framework/locale/mk/LC_MESSAGES/django.mo,sha256=HA51S3Es40nX29BcU4Qh1BNbLWLXjpa51p_7c_u-Drk,12121 -rest_framework/locale/nb/LC_MESSAGES/django.mo,sha256=U0jYbFS-Kxj08Thb7fF8oMrab5S2nu1lhlQhsUCpi-A,9928 -rest_framework/locale/ne_NP/LC_MESSAGES/django.mo,sha256=7ohVBTeeKYoPiTFwYA14fSxkqRgx7GBZAgyjDk15OTA,15636 -rest_framework/locale/nl/LC_MESSAGES/django.mo,sha256=ad5I7tegcNW8FOqn9E1O_cqrtHdvlkEoKvHEokjRqQo,10163 -rest_framework/locale/nn/LC_MESSAGES/django.mo,sha256=3oQQnH3UF9nHmTsj3pqv5R2iakv-wdjy0k_EQvbo4ds,483 -rest_framework/locale/no/LC_MESSAGES/django.mo,sha256=ZpgR0-XMg7oQXeS9Q6Pdhk1Y8G6hXnQVx1x3iv8yAA4,475 -rest_framework/locale/pl/LC_MESSAGES/django.mo,sha256=0mc9ltZnrL60-T2yOLavGH8DwRnEN9wu8a8_zB5RkgE,10673 -rest_framework/locale/pt/LC_MESSAGES/django.mo,sha256=j1Y5sfsqtQYVEKWxbrO6AJHw_hfh5adocwYdaVyG9CY,10382 -rest_framework/locale/pt_BR/LC_MESSAGES/django.mo,sha256=mn1IClfteWM9J3Y6uvy5arKR7AdzEwhvqtw1Xvdpuew,10397 -rest_framework/locale/pt_PT/LC_MESSAGES/django.mo,sha256=sCkzHosWkIhNbRljJWvK4x_UlbSK3SNickNyp17cOpM,493 -rest_framework/locale/ro/LC_MESSAGES/django.mo,sha256=CEab6ZJC7xeFrN2v6UKkDWNegXkbGpFBZSWeno0qN0w,10701 -rest_framework/locale/ru/LC_MESSAGES/django.mo,sha256=IxiOtRY_UAVUT6Is4Gh09pGj7kLyqBHaUJh7S3uiRcI,13160 -rest_framework/locale/ru_RU/LC_MESSAGES/django.mo,sha256=AmZPL7_x-1BT9COfEDAitvyhXvkWeYINhXj1htyhq0g,5208 -rest_framework/locale/sk/LC_MESSAGES/django.mo,sha256=hPXX50ijI61arUGVjMhEhz_S-zZqA1WmUNjTEJUgI8I,9164 -rest_framework/locale/sl/LC_MESSAGES/django.mo,sha256=_6IhTyJmeOb73eMhSmeVBVoKztxBQ1ldnwET_N-rT6g,9985 -rest_framework/locale/sv/LC_MESSAGES/django.mo,sha256=OV3cEUiafwnLwesNOlHr3h0fur29GJVMFHAUYUdIHBc,10204 -rest_framework/locale/th/LC_MESSAGES/django.mo,sha256=FHJKADSeYWVdvsQ285jz_865vzUelHIqkxSa4QSLlOw,8880 -rest_framework/locale/tr/LC_MESSAGES/django.mo,sha256=UJEBznyWnRnVKmRn56MwAGc7s0FAcToGXmd-O-k-58g,10073 -rest_framework/locale/tr_TR/LC_MESSAGES/django.mo,sha256=Nm3vmt38r3DxKdl2Astxny_E4IEkJlhDkzYpwiio7NQ,10292 -rest_framework/locale/uk/LC_MESSAGES/django.mo,sha256=fWmrOfNUsagv9jsIfQzP4QYQRKUugCaTBitRfvG-7gg,13245 -rest_framework/locale/vi/LC_MESSAGES/django.mo,sha256=_TekVPiXtQP0HsHrqt0S5fa669Auow5EaDsvoimUzPY,2179 -rest_framework/locale/zh_CN/LC_MESSAGES/django.mo,sha256=K9xrJnn5hyO5dM7sveYajph49Vveoo9kBLxrs9nyXfQ,9915 -rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=GVmnW3r-jCqyllmF87w5sxGPLA3p49BaS0n0ufRqsI8,9938 -rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=fZErAq1tsNswSyVXhMm96AUqQM3IwIZarbdLTWDhu64,4809 -rest_framework/locale/zh_TW/LC_MESSAGES/django.mo,sha256=x_Ba_GQLy-sIMYRRex0kGn9zZKzY5L8y69SSY2HasZU,481 -rest_framework/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework/management/__pycache__/__init__.cpython-310.pyc,, -rest_framework/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework/management/commands/__pycache__/__init__.cpython-310.pyc,, -rest_framework/management/commands/__pycache__/generateschema.cpython-310.pyc,, -rest_framework/management/commands/generateschema.py,sha256=egmCNu1eXyDxH-zDf466qjlckNVWrsc7mMMV1uZoK0w,2931 -rest_framework/metadata.py,sha256=k_pjpTOBATB3ssJyzUH8aGIdlFhyXRfIOVQVm-rWXbM,5862 -rest_framework/mixins.py,sha256=bqdlz6p0JlhRNIA3cxhjPkY24dPTWMcMsvWUfx-Mews,2937 -rest_framework/negotiation.py,sha256=-bEEaxcsoxyWRvDFdzyZ3jxraytSqjBVL84zPzO5USw,4044 -rest_framework/pagination.py,sha256=vUzEkP7U4o9LCwtIAhuv5AgL1gfPhOjbCuetwdmQNhU,36605 -rest_framework/parsers.py,sha256=8hdbNIAhhlLQ79J7yKdQFAlNR39imjZg-xP1G92R0-o,7717 -rest_framework/permissions.py,sha256=XQcS4PSVplTaaQ6WrulLFkB2xupfKTMUKynAp6T5j64,9596 -rest_framework/relations.py,sha256=e7PvSgUV4mQXKeO-SBN_e_8EeZwlkIG_scONHWBw7qk,21238 -rest_framework/renderers.py,sha256=AGqRoDIde1FbzijuZhkDCVcOAg1imjPTTLGgWAOk4Js,41024 -rest_framework/request.py,sha256=ufgyByl7EMxdA3HhKpiyH6D1Wa6b_yQGXXmWOJpQT4M,15121 -rest_framework/response.py,sha256=vvBY5ZtuIq22UbofEYdPN59ZAzeQXJ4DNGGOdAX3aL8,3553 -rest_framework/reverse.py,sha256=veLMPqo0v81NP0X7J_I6rCqtirJmCnJ4-Mm3-lOgBbY,2144 -rest_framework/routers.py,sha256=Pi5ptYXEoYdcAb5qKVu5BkZc5wqjTzSk7EmCDalF_ow,13923 -rest_framework/schemas/__init__.py,sha256=1CkgqzGW08pYGEPFqrUO4qjbUohDfcDf2boFe7-TVSw,1781 -rest_framework/schemas/__pycache__/__init__.cpython-310.pyc,, -rest_framework/schemas/__pycache__/coreapi.cpython-310.pyc,, -rest_framework/schemas/__pycache__/generators.cpython-310.pyc,, -rest_framework/schemas/__pycache__/inspectors.cpython-310.pyc,, -rest_framework/schemas/__pycache__/openapi.cpython-310.pyc,, -rest_framework/schemas/__pycache__/utils.cpython-310.pyc,, -rest_framework/schemas/__pycache__/views.cpython-310.pyc,, -rest_framework/schemas/coreapi.py,sha256=s3X-iML4NQQqWA08iguGug1gy1s8hVBvwGQNQUAmcfI,21411 -rest_framework/schemas/generators.py,sha256=GnVsXygC2Sl0b6x2z8_AZ5Y46mq-WCQWg4zESkAM0Mw,7995 -rest_framework/schemas/inspectors.py,sha256=oLWoCwbIjZVV_RGWOe1l7Ds_mUqw0VES2JJ2Ip8CLEk,4227 -rest_framework/schemas/openapi.py,sha256=2r07cQqlK0675l2EQ41yJgefs8Zsjhqgbh6hdlMkIlE,26893 -rest_framework/schemas/utils.py,sha256=iGGJfS7S-MwTvr2gPystxrEO3TaRb-x0fpyUjDWkkW8,1195 -rest_framework/schemas/views.py,sha256=epv16dSdBIUpmqOMKGvS61wtSCJhlzT1JZH84w4QNHw,1836 -rest_framework/serializers.py,sha256=pGDCbRUmjD0GZ2MddWpQmYSnkFPHWI3Ecq-JZxRzF2o,67957 -rest_framework/settings.py,sha256=8rW8H94l3m7c3cnVYI83v8jDNOCpa_fm8gsBZ3LbeG4,7950 -rest_framework/static/rest_framework/css/bootstrap-theme.min.css,sha256=8uHMIn1ru0GS5KO-zf7Zccf8Uw12IA5DrdEcmMuWLFM,23411 -rest_framework/static/rest_framework/css/bootstrap-theme.min.css.map,sha256=Xrq8Sds3hoHPZBKqAL07ehEaCfKBUjH0tW4pb6xIYTA,75600 -rest_framework/static/rest_framework/css/bootstrap-tweaks.css,sha256=RjLCy2jm2n3gQbSdNFjWncQ4lVB9Qm2-5Bc-xw7O8us,3426 -rest_framework/static/rest_framework/css/bootstrap.min.css,sha256=bZLfwXAP04zRMK2BjiO8iu9pf4FbLqX6zitd-tIvLhE,121457 -rest_framework/static/rest_framework/css/bootstrap.min.css.map,sha256=eLWMnr_ULsLGG8T99Gpd-ZjmzZB8dzB2oKbo9Whrr8M,540434 -rest_framework/static/rest_framework/css/default.css,sha256=EWV35tstD5m0GezGG0U5Fa8O_4IGsL8_noeJdxnBs3s,1152 -rest_framework/static/rest_framework/css/font-awesome-4.0.3.css,sha256=MIPo07Id3D8ObWXsNYCqbt-q3KXZc32cqifmojPhzPM,21658 -rest_framework/static/rest_framework/css/prettify.css,sha256=-ZMq8eZ6blEFtxcVudM1hzv4gFwBwqlgPjHpbMSpWBk,817 -rest_framework/static/rest_framework/docs/css/base.css,sha256=fZ9Os4iAF3DBq3Aww8qbbRypx6fkGV_-PjxQ8YqssM4,6156 -rest_framework/static/rest_framework/docs/css/highlight.css,sha256=h-4d4bDFtOId4PkL4xBXl-XtRfav47B8cPUBoYWlc3M,1682 -rest_framework/static/rest_framework/docs/css/jquery.json-view.min.css,sha256=w4_hEoz19Kk_fC7uLct1FzPE3gEIvNulKydv75PFyew,1307 -rest_framework/static/rest_framework/docs/img/favicon.ico,sha256=Ww2bNjGXyE2y9FeO6sW7YksqF2CQ89pdTrksiFbP4n4,5430 -rest_framework/static/rest_framework/docs/img/grid.png,sha256=bipYUDSUpwgQWsZG069cCMjIkDJbt4GiV9EPkf-Wipw,1458 -rest_framework/static/rest_framework/docs/js/api.js,sha256=SZIptx1KE3KDkMbfZmc4OSg5JSNkTLsQalPdb-NwkUY,10391 -rest_framework/static/rest_framework/docs/js/highlight.pack.js,sha256=TpVs16YPyRxjTs122mIsboTVOpoTUb1AmzlBnOHjU4A,300764 -rest_framework/static/rest_framework/docs/js/jquery.json-view.min.js,sha256=xUY7pJMePDtQPh8KrWWP8GcwFpNVJn5AhLbXraVWvZY,2700 -rest_framework/static/rest_framework/fonts/fontawesome-webfont.eot,sha256=OeI3wHQD5i8AvW3fC1nTNJx704aSUKqtw4lBnbaqQO8,38205 -rest_framework/static/rest_framework/fonts/fontawesome-webfont.svg,sha256=m_HPYZuOy2MUAJCBqEjDemn70HtKKnzeM59jQrjrom4,202148 -rest_framework/static/rest_framework/fonts/fontawesome-webfont.ttf,sha256=a0k0itU4htCc5MMvoUbomcgg3j-FqN03BKBiTrO_f6E,80652 -rest_framework/static/rest_framework/fonts/fontawesome-webfont.woff,sha256=D9KP7Onr1ga4sHFGDr0_wu17x6Zu-RyINPEd-sq0qEk,44432 -rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.eot,sha256=E2NNqH2eI_jD7ZEIzhck0YOjmtBy5z4bPYy_ZG0tBAc,20127 -rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.svg,sha256=BogzMSnL5KzIuuo7NfgBUocHjzA1ufVnaDid2c-KDZE,108738 -rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.ttf,sha256=45UEQJN1fYKvyxOJV9BqHqk2G9zwtELQahioBRr1dFY,45404 -rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.woff,sha256=omOU9-3hAMoRjv8u2ghZYnWpg5uVnCJuFUOVV6WoB0I,23424 -rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.woff2,sha256=_hhdEaSWdokNR7t4MxKgzaWkTEA5IUCU55V7TAQO8Rw,18028 -rest_framework/static/rest_framework/img/glyphicons-halflings-white.png,sha256=8ODZWpyKvN-r9GNI4tQoWCm7BJH19q8OBa9Sv_tjJMQ,8777 -rest_framework/static/rest_framework/img/glyphicons-halflings.png,sha256=G9UbUyeER8HbM_AMR3PnEdsh5Vfs3SbZua6Wypk_BeI,12762 -rest_framework/static/rest_framework/img/grid.png,sha256=bipYUDSUpwgQWsZG069cCMjIkDJbt4GiV9EPkf-Wipw,1458 -rest_framework/static/rest_framework/js/ajax-form.js,sha256=IMzB6t8H1OghYxwefb2jbzA2M7n-9htuejv9huuX8eA,3796 -rest_framework/static/rest_framework/js/bootstrap.min.js,sha256=nuL8_2cJ5NDSSwnKD8VqreErSWHtnEP9E7AySL-1ev4,39680 -rest_framework/static/rest_framework/js/coreapi-0.1.1.js,sha256=_gzyPn-2cx0Wgfjvj_tlUhPf4laKnzYbgkcr_uNGW6E,157600 -rest_framework/static/rest_framework/js/csrf.js,sha256=MZTSvRZZ1JEfNzyjA5oi1hN4zQe7IvFMW6xjP6eHRU4,1793 -rest_framework/static/rest_framework/js/default.js,sha256=mJOP3JMDyQnRSX60X_T4WgtYzOBNDYpqc1ZhOUC85iM,1268 -rest_framework/static/rest_framework/js/jquery-3.7.1.min.js,sha256=_JqT3SQfawRcv_BIHPThkBvs0OEvtFFmqPF_lYI_Cxo,87533 -rest_framework/static/rest_framework/js/load-ajax-form.js,sha256=1FfQ5Vw7jJqE_4U93loswPA6vWtsyyf_Sjhvx38l-nc,59 -rest_framework/static/rest_framework/js/prettify-min.js,sha256=4uV247xgfNF5_1EZRwEPZF00QaNTE67A29BsRDf4O3c,13632 -rest_framework/status.py,sha256=gJjvtWPVEe2A4SWIQ9olI6_MThRJgSJ1KDSb_ItRiOw,2547 -rest_framework/templates/rest_framework/admin.html,sha256=7uJFyGvem690pUv01t2LRe1AJWkEH2y0vWQSlG4XLbE,10902 -rest_framework/templates/rest_framework/admin/detail.html,sha256=_ONyhbRK32d7IsUxmUVKQCWjxzZqwT-zK2u1CgB4lvk,306 -rest_framework/templates/rest_framework/admin/dict_value.html,sha256=KidLEu38kqvPGElnFDjiQMh72xsjT5Sq3L4gchrqMps,242 -rest_framework/templates/rest_framework/admin/list.html,sha256=sFoqx8GeL2gFZ0Yx35dq6DVXEgQIIAFYlA8h-65FEQM,819 -rest_framework/templates/rest_framework/admin/list_value.html,sha256=Z9VmS1f3mwk5LypgA8HAvogVPbDa09hABa389AYxQCo,241 -rest_framework/templates/rest_framework/admin/simple_list_value.html,sha256=d9cVgqyigNa0K0W7CYPNGcvRAqy5M-ZJAzkgA-Al70Q,121 -rest_framework/templates/rest_framework/api.html,sha256=6GkppzK1R50yjAVZJoqFnR_FdGlZBpfftD2m2WNPTVM,116 -rest_framework/templates/rest_framework/base.html,sha256=jtrF-PM4RlL8H2gbwHT3qAK0X6B8PKHGYLIq6E_sFCw,13928 -rest_framework/templates/rest_framework/docs/auth/basic.html,sha256=GsLRwieUOwxvQRSI4nRz2PYVq72e7NLEXiprmoTbzsI,1250 -rest_framework/templates/rest_framework/docs/auth/session.html,sha256=jhtMeLg6Lq5yPb2noOabUj61UAOQe--NQGEYYwWZY_E,1154 -rest_framework/templates/rest_framework/docs/auth/token.html,sha256=0KcVSQ8w2ZvOO8A2oNlTwqmYyJ2O-12eWZL-NCBm1Rc,1618 -rest_framework/templates/rest_framework/docs/document.html,sha256=r7bWwBnt2NGaP3XbABVg-yxCiRkQuB3_-nh1cK1Wr5M,906 -rest_framework/templates/rest_framework/docs/error.html,sha256=0e_MHIsjYRYUf41VshHcSkDBm-KHev2AjuoUvRb2IRM,1850 -rest_framework/templates/rest_framework/docs/index.html,sha256=K9bMTwOaWuFV5FtiC3ypuYkJH1guN9srNIgSJNhvQe8,2519 -rest_framework/templates/rest_framework/docs/interact.html,sha256=_8yaSo9DUW8eRVH-KEH5zJJ8MBIlI5QM_ajWPb4yrI8,1831 -rest_framework/templates/rest_framework/docs/langs/javascript-intro.html,sha256=TOLjcCnyA0MYI5w99Jtg2mN7w1wjXz0lfSM8b0wabZ4,330 -rest_framework/templates/rest_framework/docs/langs/javascript.html,sha256=vy1N2rMRSTKZjEo5mZ_rIp2g57TSa9PuuHXzeghpksk,714 -rest_framework/templates/rest_framework/docs/langs/python-intro.html,sha256=LBpDVN9qkOO5Itej4M6gl4WynB4Q2CpJ_ZEti1fAY8I,189 -rest_framework/templates/rest_framework/docs/langs/python.html,sha256=y24kdg1AdRDAWl2nu6UksrXMjbMTQcdTXuRpTOXSIJo,676 -rest_framework/templates/rest_framework/docs/langs/shell-intro.html,sha256=TQo-Y2ksj2T9kzsmENH7MEB1Mt940wW941AGGbIRjVE,189 -rest_framework/templates/rest_framework/docs/langs/shell.html,sha256=jcRLGn3Eu0Xc-lr7lGFUj-1z0e9wdMwfbFIi3Cs8mV4,441 -rest_framework/templates/rest_framework/docs/link.html,sha256=ITaS3W3sqL7gOHwVvtMi2fcuETv1eVhQedlkOsT7pTg,4624 -rest_framework/templates/rest_framework/docs/sidebar.html,sha256=S_D8Tbxo08fbmVT9FmEc8No1ESS1JMJID4q5SZRz5ZY,2581 -rest_framework/templates/rest_framework/filters/base.html,sha256=OjBIbd29onA2R-iUmkwrlXw0N5CJIsU1FOpsEJ-ZJRg,610 -rest_framework/templates/rest_framework/filters/ordering.html,sha256=wiAOyvmjypM4DJGMMWbdD4Il26Z8P7J_HcIurjv3xhA,556 -rest_framework/templates/rest_framework/filters/search.html,sha256=rO3_-Z2QVIom9WVErxMprYn-sJEe1inXHH4oAG-juWk,467 -rest_framework/templates/rest_framework/horizontal/checkbox.html,sha256=t8EJW3CIcuDb2NSa7VElCzj49b0S1RcZcS7mdkOEXMw,658 -rest_framework/templates/rest_framework/horizontal/checkbox_multiple.html,sha256=iUVqbdxQ37iejUtfT0x6UeF8RcA4t71B61dhiQsqFgk,1184 -rest_framework/templates/rest_framework/horizontal/dict_field.html,sha256=VgZ3iSqrPK02VU3gDoDuK0szJbu_PGex1HnYIpYx6ao,324 -rest_framework/templates/rest_framework/horizontal/fieldset.html,sha256=bXy7Q_zBGMpE8a7K-2SxJfVDMsHZ24xniLoCw8Xmzyg,480 -rest_framework/templates/rest_framework/horizontal/form.html,sha256=yo9PS2__lzBuYSue812MwGmi3HT6kIAzHvAQBaqJAGY,149 -rest_framework/templates/rest_framework/horizontal/input.html,sha256=pOLeWdni3DNqZCN1Dbvj5xA0D-jdM0QEok_1XpIHfBE,889 -rest_framework/templates/rest_framework/horizontal/list_field.html,sha256=_BlSeMbpE8vpnyqHp6jmou2f441hrtYBvbdBjYxJeew,317 -rest_framework/templates/rest_framework/horizontal/list_fieldset.html,sha256=5W-9tZ-GvTHR4JlHwVdDJo-1FlH6-cmUu33x2RKsnkM,384 -rest_framework/templates/rest_framework/horizontal/radio.html,sha256=xpgDdvdW3FojnB3x-OqWzIiSsdcw9sd1z-g8vYz7ofg,1796 -rest_framework/templates/rest_framework/horizontal/select.html,sha256=_Eow62zUMM9VWJ03P1HlfTNB4vyv9GfqB9WjYRhfTBY,1222 -rest_framework/templates/rest_framework/horizontal/select_multiple.html,sha256=wdiLntt2k0iMJ4LlmBCRucDDC0VzqI_5K-feK9ncwtE,1191 -rest_framework/templates/rest_framework/horizontal/textarea.html,sha256=8myshnZKHjohQtuVVPN2gmcYN0RTMNGkSh95CEIobx4,782 -rest_framework/templates/rest_framework/inline/checkbox.html,sha256=zpUnpKg-oMZ843vtmW7ec8lzxQttwGpFE7F2vmHxZFw,294 -rest_framework/templates/rest_framework/inline/checkbox_multiple.html,sha256=vGndr0cjo-Q-sj6rn0JdH9LTn2BO27xvcKBY7YBbJ3c,487 -rest_framework/templates/rest_framework/inline/dict_field.html,sha256=4EWRFxidLMSc_2kbaP3VcXSaQFVAjfmPi00gb3pHiKg,228 -rest_framework/templates/rest_framework/inline/fieldset.html,sha256=acBYZDeivx33bLNIYNKlXG_11YDBtIVUihbFeHGmy8M,171 -rest_framework/templates/rest_framework/inline/form.html,sha256=yo9PS2__lzBuYSue812MwGmi3HT6kIAzHvAQBaqJAGY,149 -rest_framework/templates/rest_framework/inline/input.html,sha256=mMWTdifDKSnma20ga7gYoHGuGbHAJuxinBQIrBqjs1A,530 -rest_framework/templates/rest_framework/inline/list_field.html,sha256=bafZBHQw3YqlJYGVaxFJgtj_pon9BiuEuCU7WU6a-LM,221 -rest_framework/templates/rest_framework/inline/list_fieldset.html,sha256=gPL69kBW9RBq_qIRvFrc26a0bvFqrCaWkOnarN5uJsw,62 -rest_framework/templates/rest_framework/inline/radio.html,sha256=nqjfBZcfpFjZ-ELyaLkio-wlw5fkPAG1OAlEbAsxk2Q,793 -rest_framework/templates/rest_framework/inline/select.html,sha256=rIDuGfGFZuc-5CUVMIRne4x0vBbAg-z_MWz139hVJvw,879 -rest_framework/templates/rest_framework/inline/select_multiple.html,sha256=3zoyMlBWFNDVT7yI-zgN3lMVPGmWOBRKB6-Qyzlu174,917 -rest_framework/templates/rest_framework/inline/textarea.html,sha256=0ZpewR8LDx9xLoMgs59r12AQsZVnbolNf4P7EsnIrEc,376 -rest_framework/templates/rest_framework/login.html,sha256=mZOh88AfLsiRWGPjJlvvOkvuvmMQwxTyjGZrzcXkxlQ,122 -rest_framework/templates/rest_framework/login_base.html,sha256=ZsWKtNWD0Em0cxHn-bjkeEFTecTOzsL4Qu_pgAO48L0,2857 -rest_framework/templates/rest_framework/pagination/numbers.html,sha256=vN1hd0tP3HU7yiKInSYkC1qTn6yu_bQ3On1cVPlcHwE,1154 -rest_framework/templates/rest_framework/pagination/previous_and_next.html,sha256=tvVdDzQeAX_mqre0ei8PO-bviFlTmEWVEGpfPQ9tmuc,456 -rest_framework/templates/rest_framework/raw_data_form.html,sha256=-96O3lHTPA0zP3zq19xofYvzT8oPbmghHY5DvP-laIM,335 -rest_framework/templates/rest_framework/schema.js,sha256=UFL1wg4ArGD2gAyDfqVNCTm1V9_5dxv7kYGyR5oBaGc,136 -rest_framework/templates/rest_framework/vertical/checkbox.html,sha256=5ZMJNFq6ERwAI06iGHL5m3XmMIgTmJG7vaw6WczjTfg,543 -rest_framework/templates/rest_framework/vertical/checkbox_multiple.html,sha256=MzJT5dw-vV2zNaJYgmL6W9lTlDx_CDGV-vA8AEEW6Fs,1157 -rest_framework/templates/rest_framework/vertical/dict_field.html,sha256=Pqk22yWIWaXUJYhqYCHmGwOCiKbhvUPjl-IWsC8uSbs,252 -rest_framework/templates/rest_framework/vertical/fieldset.html,sha256=TQsf1yWktrPAiPZCavwjyX3p5p9IjFk1bQOAXynS73E,346 -rest_framework/templates/rest_framework/vertical/form.html,sha256=yo9PS2__lzBuYSue812MwGmi3HT6kIAzHvAQBaqJAGY,149 -rest_framework/templates/rest_framework/vertical/input.html,sha256=lLcDs6xixer6eQZqjI5x-5pThUDNcil9lWNYTmNOIkk,801 -rest_framework/templates/rest_framework/vertical/list_field.html,sha256=JySAf36X8WXjDtNObb1kpYb6_lJXsLqB6Z99-c2_MnE,245 -rest_framework/templates/rest_framework/vertical/list_fieldset.html,sha256=TvSzps4U1WQTvbxWRrubRvjfiD8KdUym4wthTRxsumg,222 -rest_framework/templates/rest_framework/vertical/radio.html,sha256=xOYpOkf0SkCnNOwLSXZ9nJkjIc-KY3XnRU1_JJwcd8g,1809 -rest_framework/templates/rest_framework/vertical/select.html,sha256=qZcO0qN2XZIcGw1Rrsdkm8dfVqWw4nKMVaUettX-W3k,1162 -rest_framework/templates/rest_framework/vertical/select_multiple.html,sha256=97Rtt11FQHTX0yk-ksj3dchMXO7BBC2U4_6WZqqpegI,1184 -rest_framework/templates/rest_framework/vertical/textarea.html,sha256=xaGbiWJDGIWHgWLSCBpZXjf8FVDBo0LvCqHlSs-h5EY,694 -rest_framework/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework/templatetags/__pycache__/__init__.cpython-310.pyc,, -rest_framework/templatetags/__pycache__/rest_framework.cpython-310.pyc,, -rest_framework/templatetags/rest_framework.py,sha256=CCT7_DRUgQRrYtCd8ZoDVNWDD7PKFDlURIw_aGHM2-U,10129 -rest_framework/test.py,sha256=dXG48YOWbJsC_QvjHa2Tg-CBy6P3cIjBqnrE8Tx2cNg,14823 -rest_framework/throttling.py,sha256=WGKkN9i2u2O0EcSQMQKSpaufZOMZIjEsuaR4srg7cK0,8067 -rest_framework/urlpatterns.py,sha256=57Spl1GQpvyleNXEuwS8iBxJE0jvGHtSMISrdGs6css,4401 -rest_framework/urls.py,sha256=JiEpSQau4E-m8xjNj-4mdcP3oGdf5MnsvFdnTFk7y0Y,615 -rest_framework/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework/utils/__pycache__/__init__.cpython-310.pyc,, -rest_framework/utils/__pycache__/breadcrumbs.cpython-310.pyc,, -rest_framework/utils/__pycache__/encoders.cpython-310.pyc,, -rest_framework/utils/__pycache__/field_mapping.cpython-310.pyc,, -rest_framework/utils/__pycache__/formatting.cpython-310.pyc,, -rest_framework/utils/__pycache__/html.cpython-310.pyc,, -rest_framework/utils/__pycache__/humanize_datetime.cpython-310.pyc,, -rest_framework/utils/__pycache__/json.cpython-310.pyc,, -rest_framework/utils/__pycache__/mediatypes.cpython-310.pyc,, -rest_framework/utils/__pycache__/model_meta.cpython-310.pyc,, -rest_framework/utils/__pycache__/representation.cpython-310.pyc,, -rest_framework/utils/__pycache__/serializer_helpers.cpython-310.pyc,, -rest_framework/utils/__pycache__/timezone.cpython-310.pyc,, -rest_framework/utils/__pycache__/urls.cpython-310.pyc,, -rest_framework/utils/breadcrumbs.py,sha256=IwjiRRwqTjXkdFR4sIt76EV9ucvzQA-ORiF1yI1Tj2I,2039 -rest_framework/utils/encoders.py,sha256=8Pd-4Qo92fxQE1DYYuoDrcSwUzsJYlWWtR5KAZ1JH0w,2825 -rest_framework/utils/field_mapping.py,sha256=nz_8WRtz5Zu-IZeecIiglf4z2bfta7wZAN2Kh1TDXUI,12131 -rest_framework/utils/formatting.py,sha256=z292GYwr3WpcgRECnlouhQZgQk-m7LhsoQXRz1O0p-M,3015 -rest_framework/utils/html.py,sha256=2Bas2KS7dst6mdGUVSROPi9RUyD38Z1SPza_0WbV8Ts,2294 -rest_framework/utils/humanize_datetime.py,sha256=CeC4QWwfFKdn2RXHGYRaqVcOwp0J80J_AJsnx2ClVJ0,1281 -rest_framework/utils/json.py,sha256=1qVOOt_DuaQqO4ePub-jT29lZG-9sNmGLDEqW42BAZ0,1027 -rest_framework/utils/mediatypes.py,sha256=AYiGTnA9SReUZY18AxoQJNW0EyT06HFtlO9QI7-tIps,2490 -rest_framework/utils/model_meta.py,sha256=t8VF2kHoNUM8yDs_ts1lc7VYnB3tI9gw0CMO5YENqeM,5068 -rest_framework/utils/representation.py,sha256=93GsXt1zVMAO9mvfpafzstySmN9nbXimNCsaY1qw4M8,2970 -rest_framework/utils/serializer_helpers.py,sha256=5NccvsAlbpEOwGcn2Y6QW1BHQjpdrv5zf4D2EL8xpac,5867 -rest_framework/utils/timezone.py,sha256=TT_ORE5v84dJfCCnRubo6_Eeq8ZDGtj5OcgaFLhu310,1086 -rest_framework/utils/urls.py,sha256=5hagmITUV4AvYmhFRHccOvXx3Yn-OL6yEA1eYT4_bk8,1052 -rest_framework/validators.py,sha256=aoc9RsuzltLWRp467rgv8idWdtqeMcAGKHGmeIccZkw,13202 -rest_framework/versioning.py,sha256=ndWtifG_xnJS5Gx3q6Fc5oNpDLvG9-QU7XwxAw6gXUA,6801 -rest_framework/views.py,sha256=XXTOqDy2i1G1NYbN9VnYF3VMmejkMxhVt_Zpmtd4EOs,19102 -rest_framework/viewsets.py,sha256=HKVbxzZ3thZcCXU1oel67CIiD-bcsWil4tDgOcf8BLI,9292 diff --git a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/REQUESTED b/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/WHEEL deleted file mode 100644 index 1eb3c49..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (78.1.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/licenses/LICENSE.md b/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/licenses/LICENSE.md deleted file mode 100644 index 3dea39c..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/licenses/LICENSE.md +++ /dev/null @@ -1,29 +0,0 @@ -# License - -Copyright © 2011-present, [Encode OSS Ltd](https://www.encode.io/). -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/top_level.txt deleted file mode 100644 index 6adea4d..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework-3.16.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -rest_framework diff --git a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/LICENSE.txt b/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/LICENSE.txt deleted file mode 100644 index 4f17f35..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2017 David Sanders - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/METADATA b/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/METADATA deleted file mode 100644 index b1dd437..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/METADATA +++ /dev/null @@ -1,114 +0,0 @@ -Metadata-Version: 2.2 -Name: djangorestframework_simplejwt -Version: 5.5.0 -Summary: A minimal JSON Web Token authentication plugin for Django REST Framework -Home-page: https://github.com/jazzband/djangorestframework-simplejwt -Author: David Sanders -Author-email: davesque@gmail.com -License: MIT -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Framework :: Django :: 4.2 -Classifier: Framework :: Django :: 5.0 -Classifier: Framework :: Django :: 5.1 -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Topic :: Internet :: WWW/HTTP -Requires-Python: >=3.9 -License-File: LICENSE.txt -Requires-Dist: django>=4.2 -Requires-Dist: djangorestframework>=3.14 -Requires-Dist: pyjwt<2.10.0,>=1.7.1 -Provides-Extra: test -Requires-Dist: cryptography; extra == "test" -Requires-Dist: freezegun; extra == "test" -Requires-Dist: pytest-cov; extra == "test" -Requires-Dist: pytest-django; extra == "test" -Requires-Dist: pytest-xdist; extra == "test" -Requires-Dist: pytest; extra == "test" -Requires-Dist: tox; extra == "test" -Provides-Extra: lint -Requires-Dist: ruff; extra == "lint" -Requires-Dist: yesqa; extra == "lint" -Requires-Dist: pyupgrade; extra == "lint" -Requires-Dist: pre-commit; extra == "lint" -Provides-Extra: doc -Requires-Dist: Sphinx<2,>=1.6.5; extra == "doc" -Requires-Dist: sphinx_rtd_theme>=0.1.9; extra == "doc" -Provides-Extra: dev -Requires-Dist: pytest-watch; extra == "dev" -Requires-Dist: wheel; extra == "dev" -Requires-Dist: twine; extra == "dev" -Requires-Dist: ipython; extra == "dev" -Requires-Dist: cryptography; extra == "dev" -Requires-Dist: freezegun; extra == "dev" -Requires-Dist: pytest-cov; extra == "dev" -Requires-Dist: pytest-django; extra == "dev" -Requires-Dist: pytest-xdist; extra == "dev" -Requires-Dist: pytest; extra == "dev" -Requires-Dist: tox; extra == "dev" -Requires-Dist: ruff; extra == "dev" -Requires-Dist: yesqa; extra == "dev" -Requires-Dist: pyupgrade; extra == "dev" -Requires-Dist: pre-commit; extra == "dev" -Requires-Dist: Sphinx<2,>=1.6.5; extra == "dev" -Requires-Dist: sphinx_rtd_theme>=0.1.9; extra == "dev" -Requires-Dist: python-jose==3.3.0; extra == "dev" -Provides-Extra: python-jose -Requires-Dist: python-jose==3.3.0; extra == "python-jose" -Provides-Extra: crypto -Requires-Dist: cryptography>=3.3.1; extra == "crypto" -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: home-page -Dynamic: license -Dynamic: provides-extra -Dynamic: requires-dist -Dynamic: requires-python -Dynamic: summary - -Simple JWT -========== - -.. image:: https://jazzband.co/static/img/badge.svg - :target: https://jazzband.co/ - :alt: Jazzband -.. image:: https://github.com/jazzband/djangorestframework-simplejwt/workflows/Test/badge.svg - :target: https://github.com/jazzband/djangorestframework-simplejwt/actions - :alt: GitHub Actions -.. image:: https://codecov.io/gh/jazzband/djangorestframework-simplejwt/branch/master/graph/badge.svg - :target: https://codecov.io/gh/jazzband/djangorestframework-simplejwt -.. image:: https://img.shields.io/pypi/v/djangorestframework-simplejwt.svg - :target: https://pypi.python.org/pypi/djangorestframework-simplejwt -.. image:: https://img.shields.io/pypi/pyversions/djangorestframework-simplejwt.svg - :target: https://pypi.python.org/pypi/djangorestframework-simplejwt -.. image:: https://img.shields.io/pypi/djversions/djangorestframework-simplejwt.svg - :target: https://pypi.python.org/pypi/djangorestframework-simplejwt -.. image:: https://readthedocs.org/projects/django-rest-framework-simplejwt/badge/?version=latest - :target: https://django-rest-framework-simplejwt.readthedocs.io/en/latest/ - -Abstract --------- - -Simple JWT is a JSON Web Token authentication plugin for the `Django REST -Framework `__. - -For full documentation, visit `django-rest-framework-simplejwt.readthedocs.io -`__. - - -Translations ------------- - -Contribute translations directly with PRs or via inlang https://inlang.com/editor/github.com/jazzband/djangorestframework-simplejwt diff --git a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/RECORD b/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/RECORD deleted file mode 100644 index 2b8583f..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/RECORD +++ /dev/null @@ -1,114 +0,0 @@ -djangorestframework_simplejwt-5.5.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -djangorestframework_simplejwt-5.5.0.dist-info/LICENSE.txt,sha256=ciQ8ALb0EdxGfuovFpFHIOHbMu3sbmGzV66o1F46vVs,1053 -djangorestframework_simplejwt-5.5.0.dist-info/METADATA,sha256=QOVJ6K4d46I8O8nVbOUkw8bSCgBOjfprOzZ651BGyso,4570 -djangorestframework_simplejwt-5.5.0.dist-info/RECORD,, -djangorestframework_simplejwt-5.5.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -djangorestframework_simplejwt-5.5.0.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91 -djangorestframework_simplejwt-5.5.0.dist-info/top_level.txt,sha256=ULa72yxXIj-d43kS2qYIdb-929ri5OcYWJk3P-7wd0E,25 -rest_framework_simplejwt/__init__.py,sha256=ygXobQ5Fdt9AUINVtsmfYHpGIRdb0ad47c2Tl5THs_A,209 -rest_framework_simplejwt/__pycache__/__init__.cpython-310.pyc,, -rest_framework_simplejwt/__pycache__/authentication.cpython-310.pyc,, -rest_framework_simplejwt/__pycache__/backends.cpython-310.pyc,, -rest_framework_simplejwt/__pycache__/exceptions.cpython-310.pyc,, -rest_framework_simplejwt/__pycache__/models.cpython-310.pyc,, -rest_framework_simplejwt/__pycache__/serializers.cpython-310.pyc,, -rest_framework_simplejwt/__pycache__/settings.cpython-310.pyc,, -rest_framework_simplejwt/__pycache__/state.cpython-310.pyc,, -rest_framework_simplejwt/__pycache__/tokens.cpython-310.pyc,, -rest_framework_simplejwt/__pycache__/utils.cpython-310.pyc,, -rest_framework_simplejwt/__pycache__/views.cpython-310.pyc,, -rest_framework_simplejwt/authentication.py,sha256=h3NlDXxBxuJMBUQg9ny1TgDRsaezQnfjIkaESgZWXN8,6314 -rest_framework_simplejwt/backends.py,sha256=3h9ZrVefdTi3tUH9l9sIzl3qngFLhd7_y-yKTvjo3TU,5741 -rest_framework_simplejwt/exceptions.py,sha256=fOkvn8MQDmXS4gzUvfrD-_HUX7XXpj-hJs_GqRn4_Wk,1300 -rest_framework_simplejwt/locale/ar/LC_MESSAGES/django.mo,sha256=gjaN_yaODGc-G-T36ysCeEAHIpsPlhav8W8AXqgcp6I,3121 -rest_framework_simplejwt/locale/ar/LC_MESSAGES/django.po,sha256=TIjuHHjgrW0UmBxwJVETYdqrda9Y50XAkCO1sZLhn8g,4476 -rest_framework_simplejwt/locale/cs/LC_MESSAGES/django.mo,sha256=gIts-nw3-UkC3BZop3FMOIYQoX95UtbE5mytLYWvxoQ,2050 -rest_framework_simplejwt/locale/cs/LC_MESSAGES/django.po,sha256=j3QOp0-ntEvzWXRbPjwB-KK1x1Wtq-tjYhwDVHc0a9c,3543 -rest_framework_simplejwt/locale/de/LC_MESSAGES/django.mo,sha256=8v2_6RbtiwT7kPoXJER1RORDfdjioYb9TCFuL2KPBr0,2057 -rest_framework_simplejwt/locale/de/LC_MESSAGES/django.po,sha256=pvOnsGkO8ClgeuOM6QPynC4sw7R4L-U_lz-wExnKdeg,3532 -rest_framework_simplejwt/locale/es/LC_MESSAGES/django.mo,sha256=EA0GLEVoWx2eJFjBaJ8Ccbu_idd3qXgp0WvyN5EvxF0,2350 -rest_framework_simplejwt/locale/es/LC_MESSAGES/django.po,sha256=9PWBLRkSSLAa-9BuZctQA--N76MVhkzp_f0gu1M8ETs,3693 -rest_framework_simplejwt/locale/es_AR/LC_MESSAGES/django.mo,sha256=Vbd9o4d_NeyH-5ea7v7HoecLdIZYGl-OOVlcziFFkC0,2166 -rest_framework_simplejwt/locale/es_AR/LC_MESSAGES/django.po,sha256=eyZmicLr6Cng6rUDFUJX1uEDdSmbwFsXyIcNPGQGKcQ,3752 -rest_framework_simplejwt/locale/es_CL/LC_MESSAGES/django.mo,sha256=7j2aI8wjaUvkNiN0FwiOmjtMRfZYMflFWjAzqoD0j2A,2128 -rest_framework_simplejwt/locale/es_CL/LC_MESSAGES/django.po,sha256=XQzgYnMyUENBVOMplSxjBf29LkdoMwOuZCG5vxIY_RU,3621 -rest_framework_simplejwt/locale/fa/LC_MESSAGES/django.mo,sha256=8yKxKpfKhHhoHxECNNm4z7wUzCIxiScyI5YeEok-ZA4,3006 -rest_framework_simplejwt/locale/fa/LC_MESSAGES/django.po,sha256=yChUs8fGZUE5BZ6pVhCLbJjtp3mzrrz0VFAE3YL6NtQ,4369 -rest_framework_simplejwt/locale/fa_IR/LC_MESSAGES/django.mo,sha256=157beDhr0nflnfnbfJ152LfnRjM00snDno1sF0cV5p8,2941 -rest_framework_simplejwt/locale/fa_IR/LC_MESSAGES/django.po,sha256=YQ7zMGt6HFsvx--kX7AHWu5cAvjX1MZF-QnLAerrweo,4206 -rest_framework_simplejwt/locale/fr/LC_MESSAGES/django.mo,sha256=z0ZtzKkGYjaIeFb0z8apGswKZySX2IMT3cGmr8mhJ0g,2352 -rest_framework_simplejwt/locale/fr/LC_MESSAGES/django.po,sha256=CWiV54Jeh3lEkleNTEe4KrYfrYDgeFpEhMh-LBFWFuk,3702 -rest_framework_simplejwt/locale/he_IL/LC_MESSAGES/django.mo,sha256=CpMNgB4R7p7ej_7Q9yD8oClU29VLzl5oWXqc4rYl10U,2768 -rest_framework_simplejwt/locale/he_IL/LC_MESSAGES/django.po,sha256=pe1XUPO3IdNo-_Btp8rId3VUxXDe4cBBx-93ikYnGi0,4056 -rest_framework_simplejwt/locale/id_ID/LC_MESSAGES/django.mo,sha256=m99L1yKry6fC4sNiiBlWSZf9jIlg3BySF5EZMYVoseU,2528 -rest_framework_simplejwt/locale/id_ID/LC_MESSAGES/django.po,sha256=zuLonn9VUcJzkTD2XaA3Yb3sMmo1xxJCKkC7cxJJofM,3833 -rest_framework_simplejwt/locale/it_IT/LC_MESSAGES/django.mo,sha256=qWXz8NAll-sPs-QgoAJPPY2LJ1koqUL9LPAXH10I8UE,2433 -rest_framework_simplejwt/locale/it_IT/LC_MESSAGES/django.po,sha256=EZfzMjSXJEJPa4_8RqnqL2Q01y0ONY9NF7fGJjFYNV8,3781 -rest_framework_simplejwt/locale/ko_KR/LC_MESSAGES/django.mo,sha256=qblJjQsfGm-hJgOQbJ5P-NzWspdkEz05vf-v-371Yn4,2912 -rest_framework_simplejwt/locale/ko_KR/LC_MESSAGES/django.po,sha256=qny0o7DnVrQj264J9brbBlxl3Gctu3kz8oG9L_kDW1Q,4175 -rest_framework_simplejwt/locale/nl_NL/LC_MESSAGES/django.mo,sha256=dvfmoRBUtvba6JtyXXGJ3RsBUyk7KT2iKVMbSD0-zYw,1989 -rest_framework_simplejwt/locale/nl_NL/LC_MESSAGES/django.po,sha256=xesKhe93FCF5JqqmyEMx7vOnyWUaNGYrL-7i5lsTUBQ,3454 -rest_framework_simplejwt/locale/pl_PL/LC_MESSAGES/django.mo,sha256=i3FV5EshMgmZXmwtL8gIWy96VaUhwtjsxdVd6-yZxyY,2106 -rest_framework_simplejwt/locale/pl_PL/LC_MESSAGES/django.po,sha256=W9w8sMmtWLSzoG0LSAbR7Pc4Qxim4UB_C9K6I0g7t34,3591 -rest_framework_simplejwt/locale/pt_BR/LC_MESSAGES/django.mo,sha256=ZLUB0sYVw30sXmVrD5pPF9Ap2XOHf4GRUIF14TD83g4,2324 -rest_framework_simplejwt/locale/pt_BR/LC_MESSAGES/django.po,sha256=0RC3FhPOxLpU1GTMUDTuJ8kfKmU9xhM7P56X4xZcFUA,3633 -rest_framework_simplejwt/locale/ro/LC_MESSAGES/django.mo,sha256=4Aua36lH0Q8t5i3_0RhGBszFnvijjqgsd2MzImX-knE,2548 -rest_framework_simplejwt/locale/ro/LC_MESSAGES/django.po,sha256=c957A99y-aE4pi3B0ysQRZjhxuhZUIs1Qqh7BBo0y5s,3825 -rest_framework_simplejwt/locale/ru_RU/LC_MESSAGES/django.mo,sha256=TEUJ1ZcybkRAPYTiHfFhujTdg5DKmNWCWxyAULN9CSE,2784 -rest_framework_simplejwt/locale/ru_RU/LC_MESSAGES/django.po,sha256=1-HBMl5p5UENnjTbIlGXQ5c-saXp6YsKds0l_6HoZrM,4387 -rest_framework_simplejwt/locale/sl/LC_MESSAGES/django.mo,sha256=pYRr7K5tXScDto-z0lXXmrIQs-551S6g8tawVWGL1I8,2525 -rest_framework_simplejwt/locale/sl/LC_MESSAGES/django.po,sha256=Asw1CnnnKrczaXJIYscNJ-GN6tp5xBmyr631PCdEv50,3777 -rest_framework_simplejwt/locale/sv/LC_MESSAGES/django.mo,sha256=GzJ0YTS-1Vf-Kz88kWCFiGF5wNSGlKnEVQCzNJ13bJo,2281 -rest_framework_simplejwt/locale/sv/LC_MESSAGES/django.po,sha256=zpJPJefbAuK7bg5ZdLDeu1jUgKltYYUteW5ZUaSGdlU,3641 -rest_framework_simplejwt/locale/tr/LC_MESSAGES/django.mo,sha256=Pkndjeu-uaT0W-t98DXAD357wocmQIeUAqG9ZLPKFNA,2326 -rest_framework_simplejwt/locale/tr/LC_MESSAGES/django.po,sha256=zFduFDmTCgiequrv_qduahbUM5F2jVHgxiGNTifaPrs,3667 -rest_framework_simplejwt/locale/uk_UA/LC_MESSAGES/django.mo,sha256=EdndFgTOeg3QI54kgkiefp6-Zp8ahHcI7fOmG8-iYYM,3039 -rest_framework_simplejwt/locale/uk_UA/LC_MESSAGES/django.po,sha256=sOGVbzGMYsGYp2zBronshouiCHrRKJ2NyjY0G3yjckM,4559 -rest_framework_simplejwt/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=6GCeHocaKNDVskioSPa6OiMMKwU-liZInizILJFtn20,2162 -rest_framework_simplejwt/locale/zh_Hans/LC_MESSAGES/django.po,sha256=QA5E9ej3JQMlGKV1DP7ODfbdZ5madsgBcN9VLm70IAc,3501 -rest_framework_simplejwt/models.py,sha256=2895SIHdtAVBCzjVwWkixdyg7lulVA-o8i19xeSQBtA,3527 -rest_framework_simplejwt/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework_simplejwt/serializers.py,sha256=1KcuQkaadY_ENWUYF5LZmtFe2tnojVukIUZQvUQaepM,6064 -rest_framework_simplejwt/settings.py,sha256=hmzQrVMVM4dV1DpsUqNqcrRde0H1lIWEP0Ku-93ZsDU,3409 -rest_framework_simplejwt/state.py,sha256=8uzbhCNXNdocvV0CMc5F9i4SlmOr3hAuWCxzFjUh9Ik,327 -rest_framework_simplejwt/token_blacklist/__init__.py,sha256=n8LHDHOtUS3ZqYZEwAwF0rqwPFVuJ5MpmPlBbrc2cow,159 -rest_framework_simplejwt/token_blacklist/__pycache__/__init__.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/__pycache__/admin.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/__pycache__/apps.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/__pycache__/models.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/admin.py,sha256=DI0VFF5XKgeX7cD0nP2529woH_-g8QnUyEQP6PEniF8,2941 -rest_framework_simplejwt/token_blacklist/apps.py,sha256=HXc2A4RaN_FP05brH7u2MvM-BXcsGuZ6iZuezHEBPGE,281 -rest_framework_simplejwt/token_blacklist/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework_simplejwt/token_blacklist/management/__pycache__/__init__.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework_simplejwt/token_blacklist/management/commands/__pycache__/__init__.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/management/commands/__pycache__/flushexpiredtokens.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/management/commands/flushexpiredtokens.py,sha256=Yc0AvXOp4IGRrP7MuekvfwzS_Zp86AgRCTNkrOuv2Ng,378 -rest_framework_simplejwt/token_blacklist/migrations/0001_initial.py,sha256=TiBwa0DsJHhkclUoXVctDJ8vdlGlI8kFvEVRtij6DeM,2003 -rest_framework_simplejwt/token_blacklist/migrations/0002_outstandingtoken_jti_hex.py,sha256=f4Q1mpRBWdw8VXYSsyIFIizCfS5Sn_GJKu1Ffz5DmCs,366 -rest_framework_simplejwt/token_blacklist/migrations/0003_auto_20171017_2007.py,sha256=kxc111DnLcUIBYLbd7oZ8VXIUp10CdPYgl1cwo8gzYU,906 -rest_framework_simplejwt/token_blacklist/migrations/0004_auto_20171017_2013.py,sha256=BOwPaDuofvkpcgPQe7ERhK14pXoZXyG71kXGy84FRkA,369 -rest_framework_simplejwt/token_blacklist/migrations/0005_remove_outstandingtoken_jti.py,sha256=6mZY9ftpDy6kb5QHPvePWNcM7Tj0wF61WCZDksutHcc,293 -rest_framework_simplejwt/token_blacklist/migrations/0006_auto_20171017_2113.py,sha256=6S6lFQBmCzfcYRzWhLQjLoZJiE4jDAHftqCzZnIBR8M,338 -rest_framework_simplejwt/token_blacklist/migrations/0007_auto_20171017_2214.py,sha256=MfCRyJP2wHIAstpXGb-tass98Cw88OfqqaG9LhS4gpU,759 -rest_framework_simplejwt/token_blacklist/migrations/0008_migrate_to_bigautofield.py,sha256=h8aSGQuXYN4umgwaonSlUbECXx2wHm2JfE3bE9ALwI0,691 -rest_framework_simplejwt/token_blacklist/migrations/0010_fix_migrate_to_bigautofield.py,sha256=3n6gnMQMQzhT18kdzkMF2tndkzISQWncEvI7WGDTuYE,692 -rest_framework_simplejwt/token_blacklist/migrations/0011_linearizes_history.py,sha256=h8NGnU_BlFitqkxKP9be2BPA2gdhjkI-1QuEoG-PEuE,578 -rest_framework_simplejwt/token_blacklist/migrations/0012_alter_outstandingtoken_user.py,sha256=I4IjBauzxZ7bBxRcaK-bsQ6VQT1wafUg8AOggiHA4eg,698 -rest_framework_simplejwt/token_blacklist/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0001_initial.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0002_outstandingtoken_jti_hex.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0003_auto_20171017_2007.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0004_auto_20171017_2013.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0005_remove_outstandingtoken_jti.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0006_auto_20171017_2113.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0007_auto_20171017_2214.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0008_migrate_to_bigautofield.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0010_fix_migrate_to_bigautofield.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0011_linearizes_history.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/0012_alter_outstandingtoken_user.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/migrations/__pycache__/__init__.cpython-310.pyc,, -rest_framework_simplejwt/token_blacklist/models.py,sha256=5GXx_nLnDq2ZKuKgdOY29-YmzbyK_3zIg19hqmHP3Yw,1667 -rest_framework_simplejwt/tokens.py,sha256=Mp9GgrQAYtym5G19NKicm7gU8-y_hfq0eyw8O5T0gCE,13673 -rest_framework_simplejwt/utils.py,sha256=Hq-OiXNpNtyOAyfI9rW1K0l61Jfj9PKTYmEQ4WLJ2KU,1064 -rest_framework_simplejwt/views.py,sha256=n8aPwTR0fPJrahRJjhJB5Z2AG5Vv7GCqqlyd6XME3k0,3381 diff --git a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/REQUESTED b/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/WHEEL deleted file mode 100644 index 0d711c0..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.8.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/top_level.txt deleted file mode 100644 index d88fdcf..0000000 --- a/.venv/lib/python3.10/site-packages/djangorestframework_simplejwt-5.5.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -rest_framework_simplejwt diff --git a/.venv/lib/python3.10/site-packages/dotenv/__init__.py b/.venv/lib/python3.10/site-packages/dotenv/__init__.py deleted file mode 100644 index 7f4c631..0000000 --- a/.venv/lib/python3.10/site-packages/dotenv/__init__.py +++ /dev/null @@ -1,49 +0,0 @@ -from typing import Any, Optional - -from .main import (dotenv_values, find_dotenv, get_key, load_dotenv, set_key, - unset_key) - - -def load_ipython_extension(ipython: Any) -> None: - from .ipython import load_ipython_extension - load_ipython_extension(ipython) - - -def get_cli_string( - path: Optional[str] = None, - action: Optional[str] = None, - key: Optional[str] = None, - value: Optional[str] = None, - quote: Optional[str] = None, -): - """Returns a string suitable for running as a shell script. - - Useful for converting a arguments passed to a fabric task - to be passed to a `local` or `run` command. - """ - command = ['dotenv'] - if quote: - command.append(f'-q {quote}') - if path: - command.append(f'-f {path}') - if action: - command.append(action) - if key: - command.append(key) - if value: - if ' ' in value: - command.append(f'"{value}"') - else: - command.append(value) - - return ' '.join(command).strip() - - -__all__ = ['get_cli_string', - 'load_dotenv', - 'dotenv_values', - 'get_key', - 'set_key', - 'unset_key', - 'find_dotenv', - 'load_ipython_extension'] diff --git a/.venv/lib/python3.10/site-packages/dotenv/__main__.py b/.venv/lib/python3.10/site-packages/dotenv/__main__.py deleted file mode 100644 index 3977f55..0000000 --- a/.venv/lib/python3.10/site-packages/dotenv/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Entry point for cli, enables execution with `python -m dotenv`""" - -from .cli import cli - -if __name__ == "__main__": - cli() diff --git a/.venv/lib/python3.10/site-packages/dotenv/cli.py b/.venv/lib/python3.10/site-packages/dotenv/cli.py deleted file mode 100644 index 33ae148..0000000 --- a/.venv/lib/python3.10/site-packages/dotenv/cli.py +++ /dev/null @@ -1,190 +0,0 @@ -import json -import os -import shlex -import sys -from contextlib import contextmanager -from typing import Any, Dict, IO, Iterator, List, Optional - -try: - import click -except ImportError: - sys.stderr.write('It seems python-dotenv is not installed with cli option. \n' - 'Run pip install "python-dotenv[cli]" to fix this.') - sys.exit(1) - -from .main import dotenv_values, set_key, unset_key -from .version import __version__ - - -def enumerate_env() -> Optional[str]: - """ - Return a path for the ${pwd}/.env file. - - If pwd does not exist, return None. - """ - try: - cwd = os.getcwd() - except FileNotFoundError: - return None - path = os.path.join(cwd, '.env') - return path - - -@click.group() -@click.option('-f', '--file', default=enumerate_env(), - type=click.Path(file_okay=True), - help="Location of the .env file, defaults to .env file in current working directory.") -@click.option('-q', '--quote', default='always', - type=click.Choice(['always', 'never', 'auto']), - help="Whether to quote or not the variable values. Default mode is always. This does not affect parsing.") -@click.option('-e', '--export', default=False, - type=click.BOOL, - help="Whether to write the dot file as an executable bash script.") -@click.version_option(version=__version__) -@click.pass_context -def cli(ctx: click.Context, file: Any, quote: Any, export: Any) -> None: - """This script is used to set, get or unset values from a .env file.""" - ctx.obj = {'QUOTE': quote, 'EXPORT': export, 'FILE': file} - - -@contextmanager -def stream_file(path: os.PathLike) -> Iterator[IO[str]]: - """ - Open a file and yield the corresponding (decoded) stream. - - Exits with error code 2 if the file cannot be opened. - """ - - try: - with open(path) as stream: - yield stream - except OSError as exc: - print(f"Error opening env file: {exc}", file=sys.stderr) - exit(2) - - -@cli.command() -@click.pass_context -@click.option('--format', default='simple', - type=click.Choice(['simple', 'json', 'shell', 'export']), - help="The format in which to display the list. Default format is simple, " - "which displays name=value without quotes.") -def list(ctx: click.Context, format: bool) -> None: - """Display all the stored key/value.""" - file = ctx.obj['FILE'] - - with stream_file(file) as stream: - values = dotenv_values(stream=stream) - - if format == 'json': - click.echo(json.dumps(values, indent=2, sort_keys=True)) - else: - prefix = 'export ' if format == 'export' else '' - for k in sorted(values): - v = values[k] - if v is not None: - if format in ('export', 'shell'): - v = shlex.quote(v) - click.echo(f'{prefix}{k}={v}') - - -@cli.command() -@click.pass_context -@click.argument('key', required=True) -@click.argument('value', required=True) -def set(ctx: click.Context, key: Any, value: Any) -> None: - """Store the given key/value.""" - file = ctx.obj['FILE'] - quote = ctx.obj['QUOTE'] - export = ctx.obj['EXPORT'] - success, key, value = set_key(file, key, value, quote, export) - if success: - click.echo(f'{key}={value}') - else: - exit(1) - - -@cli.command() -@click.pass_context -@click.argument('key', required=True) -def get(ctx: click.Context, key: Any) -> None: - """Retrieve the value for the given key.""" - file = ctx.obj['FILE'] - - with stream_file(file) as stream: - values = dotenv_values(stream=stream) - - stored_value = values.get(key) - if stored_value: - click.echo(stored_value) - else: - exit(1) - - -@cli.command() -@click.pass_context -@click.argument('key', required=True) -def unset(ctx: click.Context, key: Any) -> None: - """Removes the given key.""" - file = ctx.obj['FILE'] - quote = ctx.obj['QUOTE'] - success, key = unset_key(file, key, quote) - if success: - click.echo(f"Successfully removed {key}") - else: - exit(1) - - -@cli.command(context_settings={'ignore_unknown_options': True}) -@click.pass_context -@click.option( - "--override/--no-override", - default=True, - help="Override variables from the environment file with those from the .env file.", -) -@click.argument('commandline', nargs=-1, type=click.UNPROCESSED) -def run(ctx: click.Context, override: bool, commandline: List[str]) -> None: - """Run command with environment variables present.""" - file = ctx.obj['FILE'] - if not os.path.isfile(file): - raise click.BadParameter( - f'Invalid value for \'-f\' "{file}" does not exist.', - ctx=ctx - ) - dotenv_as_dict = { - k: v - for (k, v) in dotenv_values(file).items() - if v is not None and (override or k not in os.environ) - } - - if not commandline: - click.echo('No command given.') - exit(1) - run_command(commandline, dotenv_as_dict) - - -def run_command(command: List[str], env: Dict[str, str]) -> None: - """Replace the current process with the specified command. - - Replaces the current process with the specified command and the variables from `env` - added in the current environment variables. - - Parameters - ---------- - command: List[str] - The command and it's parameters - env: Dict - The additional environment variables - - Returns - ------- - None - This function does not return any value. It replaces the current process with the new one. - - """ - # copy the current environment variables and add the vales from - # `env` - cmd_env = os.environ.copy() - cmd_env.update(env) - - os.execvpe(command[0], args=command, env=cmd_env) diff --git a/.venv/lib/python3.10/site-packages/dotenv/ipython.py b/.venv/lib/python3.10/site-packages/dotenv/ipython.py deleted file mode 100644 index 7df727c..0000000 --- a/.venv/lib/python3.10/site-packages/dotenv/ipython.py +++ /dev/null @@ -1,39 +0,0 @@ -from IPython.core.magic import Magics, line_magic, magics_class # type: ignore -from IPython.core.magic_arguments import (argument, magic_arguments, # type: ignore - parse_argstring) # type: ignore - -from .main import find_dotenv, load_dotenv - - -@magics_class -class IPythonDotEnv(Magics): - - @magic_arguments() - @argument( - '-o', '--override', action='store_true', - help="Indicate to override existing variables" - ) - @argument( - '-v', '--verbose', action='store_true', - help="Indicate function calls to be verbose" - ) - @argument('dotenv_path', nargs='?', type=str, default='.env', - help='Search in increasingly higher folders for the `dotenv_path`') - @line_magic - def dotenv(self, line): - args = parse_argstring(self.dotenv, line) - # Locate the .env file - dotenv_path = args.dotenv_path - try: - dotenv_path = find_dotenv(dotenv_path, True, True) - except IOError: - print("cannot find .env file") - return - - # Load the .env file - load_dotenv(dotenv_path, verbose=args.verbose, override=args.override) - - -def load_ipython_extension(ipython): - """Register the %dotenv magic.""" - ipython.register_magics(IPythonDotEnv) diff --git a/.venv/lib/python3.10/site-packages/dotenv/main.py b/.venv/lib/python3.10/site-packages/dotenv/main.py deleted file mode 100644 index 1848d60..0000000 --- a/.venv/lib/python3.10/site-packages/dotenv/main.py +++ /dev/null @@ -1,398 +0,0 @@ -import io -import logging -import os -import pathlib -import shutil -import sys -import tempfile -from collections import OrderedDict -from contextlib import contextmanager -from typing import IO, Dict, Iterable, Iterator, Mapping, Optional, Tuple, Union - -from .parser import Binding, parse_stream -from .variables import parse_variables - -# A type alias for a string path to be used for the paths in this file. -# These paths may flow to `open()` and `shutil.move()`; `shutil.move()` -# only accepts string paths, not byte paths or file descriptors. See -# https://github.com/python/typeshed/pull/6832. -StrPath = Union[str, "os.PathLike[str]"] - -logger = logging.getLogger(__name__) - - -def with_warn_for_invalid_lines(mappings: Iterator[Binding]) -> Iterator[Binding]: - for mapping in mappings: - if mapping.error: - logger.warning( - "python-dotenv could not parse statement starting at line %s", - mapping.original.line, - ) - yield mapping - - -class DotEnv: - def __init__( - self, - dotenv_path: Optional[StrPath], - stream: Optional[IO[str]] = None, - verbose: bool = False, - encoding: Optional[str] = None, - interpolate: bool = True, - override: bool = True, - ) -> None: - self.dotenv_path: Optional[StrPath] = dotenv_path - self.stream: Optional[IO[str]] = stream - self._dict: Optional[Dict[str, Optional[str]]] = None - self.verbose: bool = verbose - self.encoding: Optional[str] = encoding - self.interpolate: bool = interpolate - self.override: bool = override - - @contextmanager - def _get_stream(self) -> Iterator[IO[str]]: - if self.dotenv_path and os.path.isfile(self.dotenv_path): - with open(self.dotenv_path, encoding=self.encoding) as stream: - yield stream - elif self.stream is not None: - yield self.stream - else: - if self.verbose: - logger.info( - "python-dotenv could not find configuration file %s.", - self.dotenv_path or ".env", - ) - yield io.StringIO("") - - def dict(self) -> Dict[str, Optional[str]]: - """Return dotenv as dict""" - if self._dict: - return self._dict - - raw_values = self.parse() - - if self.interpolate: - self._dict = OrderedDict( - resolve_variables(raw_values, override=self.override) - ) - else: - self._dict = OrderedDict(raw_values) - - return self._dict - - def parse(self) -> Iterator[Tuple[str, Optional[str]]]: - with self._get_stream() as stream: - for mapping in with_warn_for_invalid_lines(parse_stream(stream)): - if mapping.key is not None: - yield mapping.key, mapping.value - - def set_as_environment_variables(self) -> bool: - """ - Load the current dotenv as system environment variable. - """ - if not self.dict(): - return False - - for k, v in self.dict().items(): - if k in os.environ and not self.override: - continue - if v is not None: - os.environ[k] = v - - return True - - def get(self, key: str) -> Optional[str]: - """ """ - data = self.dict() - - if key in data: - return data[key] - - if self.verbose: - logger.warning("Key %s not found in %s.", key, self.dotenv_path) - - return None - - -def get_key( - dotenv_path: StrPath, - key_to_get: str, - encoding: Optional[str] = "utf-8", -) -> Optional[str]: - """ - Get the value of a given key from the given .env. - - Returns `None` if the key isn't found or doesn't have a value. - """ - return DotEnv(dotenv_path, verbose=True, encoding=encoding).get(key_to_get) - - -@contextmanager -def rewrite( - path: StrPath, - encoding: Optional[str], -) -> Iterator[Tuple[IO[str], IO[str]]]: - pathlib.Path(path).touch() - - with tempfile.NamedTemporaryFile(mode="w", encoding=encoding, delete=False) as dest: - error = None - try: - with open(path, encoding=encoding) as source: - yield (source, dest) - except BaseException as err: - error = err - - if error is None: - shutil.move(dest.name, path) - else: - os.unlink(dest.name) - raise error from None - - -def set_key( - dotenv_path: StrPath, - key_to_set: str, - value_to_set: str, - quote_mode: str = "always", - export: bool = False, - encoding: Optional[str] = "utf-8", -) -> Tuple[Optional[bool], str, str]: - """ - Adds or Updates a key/value to the given .env - - If the .env path given doesn't exist, fails instead of risking creating - an orphan .env somewhere in the filesystem - """ - if quote_mode not in ("always", "auto", "never"): - raise ValueError(f"Unknown quote_mode: {quote_mode}") - - quote = quote_mode == "always" or ( - quote_mode == "auto" and not value_to_set.isalnum() - ) - - if quote: - value_out = "'{}'".format(value_to_set.replace("'", "\\'")) - else: - value_out = value_to_set - if export: - line_out = f"export {key_to_set}={value_out}\n" - else: - line_out = f"{key_to_set}={value_out}\n" - - with rewrite(dotenv_path, encoding=encoding) as (source, dest): - replaced = False - missing_newline = False - for mapping in with_warn_for_invalid_lines(parse_stream(source)): - if mapping.key == key_to_set: - dest.write(line_out) - replaced = True - else: - dest.write(mapping.original.string) - missing_newline = not mapping.original.string.endswith("\n") - if not replaced: - if missing_newline: - dest.write("\n") - dest.write(line_out) - - return True, key_to_set, value_to_set - - -def unset_key( - dotenv_path: StrPath, - key_to_unset: str, - quote_mode: str = "always", - encoding: Optional[str] = "utf-8", -) -> Tuple[Optional[bool], str]: - """ - Removes a given key from the given `.env` file. - - If the .env path given doesn't exist, fails. - If the given key doesn't exist in the .env, fails. - """ - if not os.path.exists(dotenv_path): - logger.warning("Can't delete from %s - it doesn't exist.", dotenv_path) - return None, key_to_unset - - removed = False - with rewrite(dotenv_path, encoding=encoding) as (source, dest): - for mapping in with_warn_for_invalid_lines(parse_stream(source)): - if mapping.key == key_to_unset: - removed = True - else: - dest.write(mapping.original.string) - - if not removed: - logger.warning( - "Key %s not removed from %s - key doesn't exist.", key_to_unset, dotenv_path - ) - return None, key_to_unset - - return removed, key_to_unset - - -def resolve_variables( - values: Iterable[Tuple[str, Optional[str]]], - override: bool, -) -> Mapping[str, Optional[str]]: - new_values: Dict[str, Optional[str]] = {} - - for name, value in values: - if value is None: - result = None - else: - atoms = parse_variables(value) - env: Dict[str, Optional[str]] = {} - if override: - env.update(os.environ) # type: ignore - env.update(new_values) - else: - env.update(new_values) - env.update(os.environ) # type: ignore - result = "".join(atom.resolve(env) for atom in atoms) - - new_values[name] = result - - return new_values - - -def _walk_to_root(path: str) -> Iterator[str]: - """ - Yield directories starting from the given directory up to the root - """ - if not os.path.exists(path): - raise IOError("Starting path not found") - - if os.path.isfile(path): - path = os.path.dirname(path) - - last_dir = None - current_dir = os.path.abspath(path) - while last_dir != current_dir: - yield current_dir - parent_dir = os.path.abspath(os.path.join(current_dir, os.path.pardir)) - last_dir, current_dir = current_dir, parent_dir - - -def find_dotenv( - filename: str = ".env", - raise_error_if_not_found: bool = False, - usecwd: bool = False, -) -> str: - """ - Search in increasingly higher folders for the given file - - Returns path to the file if found, or an empty string otherwise - """ - - def _is_interactive(): - """Decide whether this is running in a REPL or IPython notebook""" - try: - main = __import__("__main__", None, None, fromlist=["__file__"]) - except ModuleNotFoundError: - return False - return not hasattr(main, "__file__") - - def _is_debugger(): - return sys.gettrace() is not None - - if usecwd or _is_interactive() or _is_debugger() or getattr(sys, "frozen", False): - # Should work without __file__, e.g. in REPL or IPython notebook. - path = os.getcwd() - else: - # will work for .py files - frame = sys._getframe() - current_file = __file__ - - while frame.f_code.co_filename == current_file or not os.path.exists( - frame.f_code.co_filename - ): - assert frame.f_back is not None - frame = frame.f_back - frame_filename = frame.f_code.co_filename - path = os.path.dirname(os.path.abspath(frame_filename)) - - for dirname in _walk_to_root(path): - check_path = os.path.join(dirname, filename) - if os.path.isfile(check_path): - return check_path - - if raise_error_if_not_found: - raise IOError("File not found") - - return "" - - -def load_dotenv( - dotenv_path: Optional[StrPath] = None, - stream: Optional[IO[str]] = None, - verbose: bool = False, - override: bool = False, - interpolate: bool = True, - encoding: Optional[str] = "utf-8", -) -> bool: - """Parse a .env file and then load all the variables found as environment variables. - - Parameters: - dotenv_path: Absolute or relative path to .env file. - stream: Text stream (such as `io.StringIO`) with .env content, used if - `dotenv_path` is `None`. - verbose: Whether to output a warning the .env file is missing. - override: Whether to override the system environment variables with the variables - from the `.env` file. - encoding: Encoding to be used to read the file. - Returns: - Bool: True if at least one environment variable is set else False - - If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the - .env file with it's default parameters. If you need to change the default parameters - of `find_dotenv()`, you can explicitly call `find_dotenv()` and pass the result - to this function as `dotenv_path`. - """ - if dotenv_path is None and stream is None: - dotenv_path = find_dotenv() - - dotenv = DotEnv( - dotenv_path=dotenv_path, - stream=stream, - verbose=verbose, - interpolate=interpolate, - override=override, - encoding=encoding, - ) - return dotenv.set_as_environment_variables() - - -def dotenv_values( - dotenv_path: Optional[StrPath] = None, - stream: Optional[IO[str]] = None, - verbose: bool = False, - interpolate: bool = True, - encoding: Optional[str] = "utf-8", -) -> Dict[str, Optional[str]]: - """ - Parse a .env file and return its content as a dict. - - The returned dict will have `None` values for keys without values in the .env file. - For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in - `{"foo": None}` - - Parameters: - dotenv_path: Absolute or relative path to the .env file. - stream: `StringIO` object with .env content, used if `dotenv_path` is `None`. - verbose: Whether to output a warning if the .env file is missing. - encoding: Encoding to be used to read the file. - - If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the - .env file. - """ - if dotenv_path is None and stream is None: - dotenv_path = find_dotenv() - - return DotEnv( - dotenv_path=dotenv_path, - stream=stream, - verbose=verbose, - interpolate=interpolate, - override=True, - encoding=encoding, - ).dict() diff --git a/.venv/lib/python3.10/site-packages/dotenv/parser.py b/.venv/lib/python3.10/site-packages/dotenv/parser.py deleted file mode 100644 index 735f14a..0000000 --- a/.venv/lib/python3.10/site-packages/dotenv/parser.py +++ /dev/null @@ -1,175 +0,0 @@ -import codecs -import re -from typing import (IO, Iterator, Match, NamedTuple, Optional, # noqa:F401 - Pattern, Sequence, Tuple) - - -def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]: - return re.compile(string, re.UNICODE | extra_flags) - - -_newline = make_regex(r"(\r\n|\n|\r)") -_multiline_whitespace = make_regex(r"\s*", extra_flags=re.MULTILINE) -_whitespace = make_regex(r"[^\S\r\n]*") -_export = make_regex(r"(?:export[^\S\r\n]+)?") -_single_quoted_key = make_regex(r"'([^']+)'") -_unquoted_key = make_regex(r"([^=\#\s]+)") -_equal_sign = make_regex(r"(=[^\S\r\n]*)") -_single_quoted_value = make_regex(r"'((?:\\'|[^'])*)'") -_double_quoted_value = make_regex(r'"((?:\\"|[^"])*)"') -_unquoted_value = make_regex(r"([^\r\n]*)") -_comment = make_regex(r"(?:[^\S\r\n]*#[^\r\n]*)?") -_end_of_line = make_regex(r"[^\S\r\n]*(?:\r\n|\n|\r|$)") -_rest_of_line = make_regex(r"[^\r\n]*(?:\r|\n|\r\n)?") -_double_quote_escapes = make_regex(r"\\[\\'\"abfnrtv]") -_single_quote_escapes = make_regex(r"\\[\\']") - - -class Original(NamedTuple): - string: str - line: int - - -class Binding(NamedTuple): - key: Optional[str] - value: Optional[str] - original: Original - error: bool - - -class Position: - def __init__(self, chars: int, line: int) -> None: - self.chars = chars - self.line = line - - @classmethod - def start(cls) -> "Position": - return cls(chars=0, line=1) - - def set(self, other: "Position") -> None: - self.chars = other.chars - self.line = other.line - - def advance(self, string: str) -> None: - self.chars += len(string) - self.line += len(re.findall(_newline, string)) - - -class Error(Exception): - pass - - -class Reader: - def __init__(self, stream: IO[str]) -> None: - self.string = stream.read() - self.position = Position.start() - self.mark = Position.start() - - def has_next(self) -> bool: - return self.position.chars < len(self.string) - - def set_mark(self) -> None: - self.mark.set(self.position) - - def get_marked(self) -> Original: - return Original( - string=self.string[self.mark.chars:self.position.chars], - line=self.mark.line, - ) - - def peek(self, count: int) -> str: - return self.string[self.position.chars:self.position.chars + count] - - def read(self, count: int) -> str: - result = self.string[self.position.chars:self.position.chars + count] - if len(result) < count: - raise Error("read: End of string") - self.position.advance(result) - return result - - def read_regex(self, regex: Pattern[str]) -> Sequence[str]: - match = regex.match(self.string, self.position.chars) - if match is None: - raise Error("read_regex: Pattern not found") - self.position.advance(self.string[match.start():match.end()]) - return match.groups() - - -def decode_escapes(regex: Pattern[str], string: str) -> str: - def decode_match(match: Match[str]) -> str: - return codecs.decode(match.group(0), 'unicode-escape') # type: ignore - - return regex.sub(decode_match, string) - - -def parse_key(reader: Reader) -> Optional[str]: - char = reader.peek(1) - if char == "#": - return None - elif char == "'": - (key,) = reader.read_regex(_single_quoted_key) - else: - (key,) = reader.read_regex(_unquoted_key) - return key - - -def parse_unquoted_value(reader: Reader) -> str: - (part,) = reader.read_regex(_unquoted_value) - return re.sub(r"\s+#.*", "", part).rstrip() - - -def parse_value(reader: Reader) -> str: - char = reader.peek(1) - if char == u"'": - (value,) = reader.read_regex(_single_quoted_value) - return decode_escapes(_single_quote_escapes, value) - elif char == u'"': - (value,) = reader.read_regex(_double_quoted_value) - return decode_escapes(_double_quote_escapes, value) - elif char in (u"", u"\n", u"\r"): - return u"" - else: - return parse_unquoted_value(reader) - - -def parse_binding(reader: Reader) -> Binding: - reader.set_mark() - try: - reader.read_regex(_multiline_whitespace) - if not reader.has_next(): - return Binding( - key=None, - value=None, - original=reader.get_marked(), - error=False, - ) - reader.read_regex(_export) - key = parse_key(reader) - reader.read_regex(_whitespace) - if reader.peek(1) == "=": - reader.read_regex(_equal_sign) - value: Optional[str] = parse_value(reader) - else: - value = None - reader.read_regex(_comment) - reader.read_regex(_end_of_line) - return Binding( - key=key, - value=value, - original=reader.get_marked(), - error=False, - ) - except Error: - reader.read_regex(_rest_of_line) - return Binding( - key=None, - value=None, - original=reader.get_marked(), - error=True, - ) - - -def parse_stream(stream: IO[str]) -> Iterator[Binding]: - reader = Reader(stream) - while reader.has_next(): - yield parse_binding(reader) diff --git a/.venv/lib/python3.10/site-packages/dotenv/py.typed b/.venv/lib/python3.10/site-packages/dotenv/py.typed deleted file mode 100644 index 7632ecf..0000000 --- a/.venv/lib/python3.10/site-packages/dotenv/py.typed +++ /dev/null @@ -1 +0,0 @@ -# Marker file for PEP 561 diff --git a/.venv/lib/python3.10/site-packages/dotenv/variables.py b/.venv/lib/python3.10/site-packages/dotenv/variables.py deleted file mode 100644 index 667f2f2..0000000 --- a/.venv/lib/python3.10/site-packages/dotenv/variables.py +++ /dev/null @@ -1,86 +0,0 @@ -import re -from abc import ABCMeta, abstractmethod -from typing import Iterator, Mapping, Optional, Pattern - -_posix_variable: Pattern[str] = re.compile( - r""" - \$\{ - (?P[^\}:]*) - (?::- - (?P[^\}]*) - )? - \} - """, - re.VERBOSE, -) - - -class Atom(metaclass=ABCMeta): - def __ne__(self, other: object) -> bool: - result = self.__eq__(other) - if result is NotImplemented: - return NotImplemented - return not result - - @abstractmethod - def resolve(self, env: Mapping[str, Optional[str]]) -> str: ... - - -class Literal(Atom): - def __init__(self, value: str) -> None: - self.value = value - - def __repr__(self) -> str: - return f"Literal(value={self.value})" - - def __eq__(self, other: object) -> bool: - if not isinstance(other, self.__class__): - return NotImplemented - return self.value == other.value - - def __hash__(self) -> int: - return hash((self.__class__, self.value)) - - def resolve(self, env: Mapping[str, Optional[str]]) -> str: - return self.value - - -class Variable(Atom): - def __init__(self, name: str, default: Optional[str]) -> None: - self.name = name - self.default = default - - def __repr__(self) -> str: - return f"Variable(name={self.name}, default={self.default})" - - def __eq__(self, other: object) -> bool: - if not isinstance(other, self.__class__): - return NotImplemented - return (self.name, self.default) == (other.name, other.default) - - def __hash__(self) -> int: - return hash((self.__class__, self.name, self.default)) - - def resolve(self, env: Mapping[str, Optional[str]]) -> str: - default = self.default if self.default is not None else "" - result = env.get(self.name, default) - return result if result is not None else "" - - -def parse_variables(value: str) -> Iterator[Atom]: - cursor = 0 - - for match in _posix_variable.finditer(value): - (start, end) = match.span() - name = match["name"] - default = match["default"] - - if start > cursor: - yield Literal(value=value[cursor:start]) - - yield Variable(name=name, default=default) - cursor = end - - length = len(value) - if cursor < length: - yield Literal(value=value[cursor:length]) diff --git a/.venv/lib/python3.10/site-packages/dotenv/version.py b/.venv/lib/python3.10/site-packages/dotenv/version.py deleted file mode 100644 index 6849410..0000000 --- a/.venv/lib/python3.10/site-packages/dotenv/version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "1.1.0" diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/LICENSE b/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/LICENSE deleted file mode 100644 index 76001f6..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -Copyright © 2011-present, Encode OSS Ltd. -Copyright © 2019-2021, T. Franzel , Cashlink Technologies GmbH. -Copyright © 2021-present, T. Franzel . - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/METADATA b/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/METADATA deleted file mode 100644 index 2ff670b..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/METADATA +++ /dev/null @@ -1,359 +0,0 @@ -Metadata-Version: 2.1 -Name: drf-spectacular -Version: 0.28.0 -Summary: Sane and flexible OpenAPI 3 schema generation for Django REST framework -Home-page: https://github.com/tfranzel/drf-spectacular -Author: T. Franzel -Author-email: tfranzel@gmail.com -License: BSD -Project-URL: Source, https://github.com/tfranzel/drf-spectacular -Project-URL: Documentation, https://drf-spectacular.readthedocs.io -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Framework :: Django :: 2.2 -Classifier: Framework :: Django :: 3.2 -Classifier: Framework :: Django :: 4.0 -Classifier: Framework :: Django :: 4.1 -Classifier: Framework :: Django :: 4.2 -Classifier: Framework :: Django :: 5.0 -Classifier: Framework :: Django :: 5.1 -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Natural Language :: English -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: Documentation -Classifier: Topic :: Software Development :: Code Generators -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: Django>=2.2 -Requires-Dist: djangorestframework>=3.10.3 -Requires-Dist: uritemplate>=2.0.0 -Requires-Dist: PyYAML>=5.1 -Requires-Dist: jsonschema>=2.6.0 -Requires-Dist: inflection>=0.3.1 -Requires-Dist: typing-extensions; python_version < "3.10" -Provides-Extra: offline -Requires-Dist: drf-spectacular-sidecar; extra == "offline" -Provides-Extra: sidecar -Requires-Dist: drf-spectacular-sidecar; extra == "sidecar" - -=============== -drf-spectacular -=============== - -|build-status| |codecov| |docs| |pypi-version| |pypi-dl| - -Sane and flexible `OpenAPI`_ (`3.0.3`_ & `3.1`_) schema generation for `Django REST framework`_. - -This project has 3 goals: - 1. Extract as much schema information from DRF as possible. - 2. Provide flexibility to make the schema usable in the real world (not only toy examples). - 3. Generate a schema that works well with the most popular client generators. - -The code is a heavily modified fork of the -`DRF OpenAPI generator `_, -which is/was lacking all of the below listed features. - -Features - - Serializers modelled as components. (arbitrary nesting and recursion supported) - - `@extend_schema `_ decorator for customization of APIView, Viewsets, function-based views, and ``@action`` - - additional parameters - - request/response serializer override (with status codes) - - polymorphic responses either manually with ``PolymorphicProxySerializer`` helper or via ``rest_polymorphic``'s PolymorphicSerializer) - - ... and more customization options - - Authentication support (DRF natives included, easily extendable) - - Custom serializer class support (easily extendable) - - ``SerializerMethodField()`` type via type hinting or ``@extend_schema_field`` - - i18n support - - Tags extraction - - Request/response/parameter examples - - Description extraction from ``docstrings`` - - Vendor specification extensions (``x-*``) in info, operations, parameters, components, and security schemes - - Sane fallbacks - - Sane ``operation_id`` naming (based on path) - - Schema serving with ``SpectacularAPIView`` (Redoc and Swagger-UI views are also available) - - Optional input/output serializer component split - - Callback operations - - OpenAPI 3.1 support (via setting ``OAS_VERSION``) - - Included support for: - - `django-polymorphic `_ / `django-rest-polymorphic `_ - - `SimpleJWT `_ - - `DjangoOAuthToolkit `_ - - `djangorestframework-jwt `_ (tested fork `drf-jwt `_) - - `dj-rest-auth `_ (maintained fork of `django-rest-auth `_) - - `djangorestframework-camel-case `_ (via postprocessing hook ``camelize_serializer_fields``) - - `django-filter `_ - - `drf-nested-routers `_ - - `djangorestframework-recursive `_ - - `djangorestframework-dataclasses `_ - - `django-rest-framework-gis `_ - - `Pydantic (>=2.0) `_ - - -For more information visit the `documentation `_. - -License -------- - -Provided by `T. Franzel `_. `Licensed under 3-Clause BSD `_. - -Requirements ------------- - -- Python >= 3.7 -- Django (2.2, 3.2, 4.0, 4.1, 4.2, 5.0) -- Django REST Framework (3.10.3, 3.11, 3.12, 3.13, 3.14, 3.15) - -Installation ------------- - -Install using ``pip``\ ... - -.. code:: bash - - $ pip install drf-spectacular - -then add drf-spectacular to installed apps in ``settings.py`` - -.. code:: python - - INSTALLED_APPS = [ - # ALL YOUR APPS - 'drf_spectacular', - ] - - -and finally register our spectacular AutoSchema with DRF. - -.. code:: python - - REST_FRAMEWORK = { - # YOUR SETTINGS - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', - } - -drf-spectacular ships with sane `default settings `_ -that should work reasonably well out of the box. It is not necessary to -specify any settings, but we recommend to specify at least some metadata. - -.. code:: python - - SPECTACULAR_SETTINGS = { - 'TITLE': 'Your Project API', - 'DESCRIPTION': 'Your project description', - 'VERSION': '1.0.0', - 'SERVE_INCLUDE_SCHEMA': False, - # OTHER SETTINGS - } - -.. _self-contained-ui-installation: - -Self-contained UI installation -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Certain environments have no direct access to the internet and as such are unable -to retrieve Swagger UI or Redoc from CDNs. `drf-spectacular-sidecar`_ provides -these static files as a separate optional package. Usage is as follows: - -.. code:: bash - - $ pip install drf-spectacular[sidecar] - -.. code:: python - - INSTALLED_APPS = [ - # ALL YOUR APPS - 'drf_spectacular', - 'drf_spectacular_sidecar', # required for Django collectstatic discovery - ] - SPECTACULAR_SETTINGS = { - 'SWAGGER_UI_DIST': 'SIDECAR', # shorthand to use the sidecar instead - 'SWAGGER_UI_FAVICON_HREF': 'SIDECAR', - 'REDOC_DIST': 'SIDECAR', - # OTHER SETTINGS - } - - -Release management -^^^^^^^^^^^^^^^^^^ - -*drf-spectacular* deliberately stays below version *1.x.x* to signal that every -new version may potentially break you. For production we strongly recommend pinning the -version and inspecting a schema diff on update. - -With that said, we aim to be extremely defensive w.r.t. breaking API changes. However, -we also acknowledge the fact that even slight schema changes may break your toolchain, -as any existing bug may somehow also be used as a feature. - -We define version increments with the following semantics. *y-stream* increments may contain -potentially breaking changes to both API and schema. *z-stream* increments will never break the -API and may only contain schema changes that should have a low chance of breaking you. - - -Take it for a spin ------------------- - -Generate your schema with the CLI: - -.. code:: bash - - $ ./manage.py spectacular --color --file schema.yml - $ docker run -p 80:8080 -e SWAGGER_JSON=/schema.yml -v ${PWD}/schema.yml:/schema.yml swaggerapi/swagger-ui - -If you also want to validate your schema add the ``--validate`` flag. Or serve your schema directly -from your API. We also provide convenience wrappers for ``swagger-ui`` or ``redoc``. - -.. code:: python - - from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView - urlpatterns = [ - # YOUR PATTERNS - path('api/schema/', SpectacularAPIView.as_view(), name='schema'), - # Optional UI: - path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), - path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'), - ] - -Usage ------ - -*drf-spectacular* works pretty well out of the box. You might also want to set some metadata for your API. -Just create a ``SPECTACULAR_SETTINGS`` dictionary in your ``settings.py`` and override the defaults. -Have a look at the `available settings `_. - -The toy examples do not cover your cases? No problem, you can heavily customize how your schema will be rendered. - -Customization by using ``@extend_schema`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Most customization cases should be covered by the ``extend_schema`` decorator. We usually get -pretty far with specifying ``OpenApiParameter`` and splitting request/response serializers, but -the sky is the limit. - -.. code:: python - - from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiExample - from drf_spectacular.types import OpenApiTypes - - class AlbumViewset(viewset.ModelViewset): - serializer_class = AlbumSerializer - - @extend_schema( - request=AlbumCreationSerializer, - responses={201: AlbumSerializer}, - ) - def create(self, request): - # your non-standard behaviour - return super().create(request) - - @extend_schema( - # extra parameters added to the schema - parameters=[ - OpenApiParameter(name='artist', description='Filter by artist', required=False, type=str), - OpenApiParameter( - name='release', - type=OpenApiTypes.DATE, - location=OpenApiParameter.QUERY, - description='Filter by release date', - examples=[ - OpenApiExample( - 'Example 1', - summary='short optional summary', - description='longer description', - value='1993-08-23' - ), - ... - ], - ), - ], - # override default docstring extraction - description='More descriptive text', - # provide Authentication class that deviates from the views default - auth=None, - # change the auto-generated operation name - operation_id=None, - # or even completely override what AutoSchema would generate. Provide raw Open API spec as Dict. - operation=None, - # attach request/response examples to the operation. - examples=[ - OpenApiExample( - 'Example 1', - description='longer description', - value=... - ), - ... - ], - ) - def list(self, request): - # your non-standard behaviour - return super().list(request) - - @extend_schema( - request=AlbumLikeSerializer, - responses={204: None}, - methods=["POST"] - ) - @extend_schema(description='Override a specific method', methods=["GET"]) - @action(detail=True, methods=['post', 'get']) - def set_password(self, request, pk=None): - # your action behaviour - ... - -More customization -^^^^^^^^^^^^^^^^^^ - -Still not satisfied? You want more! We still got you covered. -Visit `customization `_ for more information. - - -Testing -------- - -Install testing requirements. - -.. code:: bash - - $ pip install -r requirements.txt - -Run with runtests. - -.. code:: bash - - $ ./runtests.py - -You can also use the excellent `tox`_ testing tool to run the tests -against all supported versions of Python and Django. Install tox -globally, and then simply run: - -.. code:: bash - - $ tox - -.. _Django REST framework: https://www.django-rest-framework.org/ -.. _OpenAPI: https://swagger.io/ -.. _3.0.3: https://spec.openapis.org/oas/v3.0.3 -.. _3.1: https://spec.openapis.org/oas/v3.1.0 -.. _tox: https://tox.wiki/ -.. _drf-spectacular-sidecar: https://github.com/tfranzel/drf-spectacular-sidecar - -.. |build-status| image:: https://github.com/tfranzel/drf-spectacular/actions/workflows/ci.yml/badge.svg - :target: https://github.com/tfranzel/drf-spectacular/actions/workflows/ci.yml -.. |pypi-version| image:: https://img.shields.io/pypi/v/drf-spectacular.svg - :target: https://pypi.org/project/drf-spectacular/ -.. |codecov| image:: https://codecov.io/gh/tfranzel/drf-spectacular/branch/master/graph/badge.svg - :target: https://codecov.io/gh/tfranzel/drf-spectacular -.. |docs| image:: https://readthedocs.org/projects/drf-spectacular/badge/ - :target: https://drf-spectacular.readthedocs.io/ -.. |pypi-dl| image:: https://img.shields.io/pypi/dm/drf-spectacular - :target: https://pypi.org/project/drf-spectacular/ diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/RECORD b/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/RECORD deleted file mode 100644 index ff7ee9c..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/RECORD +++ /dev/null @@ -1,83 +0,0 @@ -drf_spectacular-0.28.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -drf_spectacular-0.28.0.dist-info/LICENSE,sha256=QYOFgQ6OE21kX9uZ9cPYrBpSTI4Eli12oKzinGUAGVM,1646 -drf_spectacular-0.28.0.dist-info/METADATA,sha256=IoV3VfI6NuzMMmUsJeqi3CTvGjL8_JGQXulINYhh_Rw,14218 -drf_spectacular-0.28.0.dist-info/RECORD,, -drf_spectacular-0.28.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -drf_spectacular-0.28.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91 -drf_spectacular-0.28.0.dist-info/top_level.txt,sha256=hQTyZgYWQaodX0YT-ugk6FZUaeg6dzSGF0l5peXNs8k,16 -drf_spectacular/__init__.py,sha256=cV5prtSsCfRXCGRgZjJjxh7KPRrZr_fKRPIJw8pLziI,133 -drf_spectacular/__pycache__/__init__.cpython-310.pyc,, -drf_spectacular/__pycache__/apps.cpython-310.pyc,, -drf_spectacular/__pycache__/authentication.cpython-310.pyc,, -drf_spectacular/__pycache__/checks.cpython-310.pyc,, -drf_spectacular/__pycache__/drainage.cpython-310.pyc,, -drf_spectacular/__pycache__/extensions.cpython-310.pyc,, -drf_spectacular/__pycache__/generators.cpython-310.pyc,, -drf_spectacular/__pycache__/helpers.cpython-310.pyc,, -drf_spectacular/__pycache__/hooks.cpython-310.pyc,, -drf_spectacular/__pycache__/openapi.cpython-310.pyc,, -drf_spectacular/__pycache__/plumbing.cpython-310.pyc,, -drf_spectacular/__pycache__/renderers.cpython-310.pyc,, -drf_spectacular/__pycache__/serializers.cpython-310.pyc,, -drf_spectacular/__pycache__/settings.cpython-310.pyc,, -drf_spectacular/__pycache__/types.cpython-310.pyc,, -drf_spectacular/__pycache__/utils.cpython-310.pyc,, -drf_spectacular/__pycache__/views.cpython-310.pyc,, -drf_spectacular/apps.py,sha256=zDCZJ3QNHLVtN2SIyNm_1s4QOAMmHOesS6X7YjZgS5k,212 -drf_spectacular/authentication.py,sha256=ldCdXPZRSEDbqSx4zaGn46aeciyz3AiaiyF_HBMoWdM,1234 -drf_spectacular/checks.py,sha256=9aszmP_N0uyJqByBXZ_dK-laq0ljEZaCrBbDp3O8OGk,999 -drf_spectacular/contrib/__init__.py,sha256=poIlUpgG6NhGu7NTwNR6AhGjin6p0JhAAt6St1fVxx0,354 -drf_spectacular/contrib/__pycache__/__init__.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/django_filters.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/django_oauth_toolkit.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/djangorestframework_camel_case.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/knox_auth_token.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/pydantic.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/rest_auth.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/rest_framework.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/rest_framework_dataclasses.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/rest_framework_gis.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/rest_framework_jwt.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/rest_framework_recursive.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/rest_framework_simplejwt.cpython-310.pyc,, -drf_spectacular/contrib/__pycache__/rest_polymorphic.cpython-310.pyc,, -drf_spectacular/contrib/django_filters.py,sha256=tp6kc7fxc2-a-LgxEs5pNrKxlFocjF81KSiaAoHBidw,13785 -drf_spectacular/contrib/django_oauth_toolkit.py,sha256=8MOIQ4vU_cxe28S-py9QzwJaN8eFc-EGBe_96wm6cEg,2366 -drf_spectacular/contrib/djangorestframework_camel_case.py,sha256=aA6KdHthYNtvbV1wWWwLmjmtobPTXhrpLjSxu_gDyv0,2617 -drf_spectacular/contrib/knox_auth_token.py,sha256=hbAk57CMEb4aYXZT_Ed5C-CGqtLDaPS8Iu5mXozr0vQ,495 -drf_spectacular/contrib/pydantic.py,sha256=oiFP-hOT2DFOCOiC2_8X_ep7UcH9YSVVL-nigD-WITQ,2244 -drf_spectacular/contrib/rest_auth.py,sha256=oft9cRhik-PCHvDHJx-RjkCuDVnoUpjF0SmUxuvEuKs,5689 -drf_spectacular/contrib/rest_framework.py,sha256=UGr8dNgQvwTn97hdi9s1uxXynfmBd5FqqXL1h05Ev4U,1213 -drf_spectacular/contrib/rest_framework_dataclasses.py,sha256=FTCllwxuZztjwWVzjS3tDWnXuVLaQ_3CJuWFjFKEiLs,1876 -drf_spectacular/contrib/rest_framework_gis.py,sha256=hEilPs8R3E4N3o3PwqQFL4hvnJ0RS4kLurTIjO_528Y,7906 -drf_spectacular/contrib/rest_framework_jwt.py,sha256=sOiFPnh2p0DP-a7ukETgXrkjWEHrUTCfOmmkxZ1SLF8,609 -drf_spectacular/contrib/rest_framework_recursive.py,sha256=RG8O7i-rq3AdqgBOcHckhjLmdPEg9fKbjo2-dx80deA,652 -drf_spectacular/contrib/rest_framework_simplejwt.py,sha256=twBKYZWG4ZOycKOL3AwmUeJM1MWws4kHgrQ-q6HbDLw,3637 -drf_spectacular/contrib/rest_polymorphic.py,sha256=TQcHzIWTZDFXdDSbL7xUAU-jZKUoeb2PCPNQI08Pwzs,3510 -drf_spectacular/drainage.py,sha256=DEjmZyT4Hm6AIrv2-0dQWt9S74lR8N4fAYgx8KuUciY,7398 -drf_spectacular/extensions.py,sha256=F0X8jNF7r4TKPn60gvKKEcZplQU4wqTWFEhgrRR0QfE,6325 -drf_spectacular/generators.py,sha256=4sD2FcLGUSduSMS-n0yRAxAIDF-xBs-eqvl6DLqrGo4,13104 -drf_spectacular/helpers.py,sha256=oScO_1VuXQKEWqWLoWtVzKMJg5pzDUEN69SbHvHHXL8,1369 -drf_spectacular/hooks.py,sha256=FofG394vvHTpUHFEjf6d9mdr55bsIHY99odjpXdCQVI,10126 -drf_spectacular/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -drf_spectacular/management/__pycache__/__init__.cpython-310.pyc,, -drf_spectacular/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -drf_spectacular/management/commands/__pycache__/__init__.cpython-310.pyc,, -drf_spectacular/management/commands/__pycache__/spectacular.cpython-310.pyc,, -drf_spectacular/management/commands/spectacular.py,sha256=jVoZ5Ln0Rk1KDjrQ7WnWlNEBPdiZ2Q3byEZr9HWBnyA,3907 -drf_spectacular/openapi.py,sha256=0IgoALjRYyBun7wz9i96tXW9llGKgSj9WLR3G4tTAnA,76364 -drf_spectacular/plumbing.py,sha256=zKSBstjWsb55wBk5cLNBWWNY9qZtsDTSpeFyDtRY1qk,57366 -drf_spectacular/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -drf_spectacular/renderers.py,sha256=VM0l-roiJr77l1a7Rga7z_uXIxzpXEjR1hRVDIbjF-Y,2997 -drf_spectacular/serializers.py,sha256=xZU0ww6esXeOgB4-Y53-omTpbUywF2QOio9tKBugfjU,4456 -drf_spectacular/settings.py,sha256=q3L4eKyz1XSXNCsUDllq2kU_oMTEIN6a66B-1t9kJWw,14136 -drf_spectacular/templates/drf_spectacular/redoc.html,sha256=lzNZBn6Ca0-CnYnm6cE0fJSX2YQhKXkjR8nCO6BNeBY,1118 -drf_spectacular/templates/drf_spectacular/swagger_ui.html,sha256=TR4ZUxdVBxCkHUhr1LlJavmT5YRY-ABfWhu1MZZ-3Eg,924 -drf_spectacular/templates/drf_spectacular/swagger_ui.js,sha256=0Mjhaxp1Z6LSd9_9rULHQlf43O6paVHRWPFdD8w-ct8,3804 -drf_spectacular/types.py,sha256=fFIajFqzo5P__vhZ6ejDPpad1H8kdTLLAlw0Ih8DLRU,7684 -drf_spectacular/utils.py,sha256=1fWFscRdyu3womDhRDUFHILjmGFeHg75EPo47UksQEE,29939 -drf_spectacular/validation/__init__.py,sha256=zBRkiLGrMbkFmIPIWyixVEL1dOO4a-Lt29-spyM4ltA,1446 -drf_spectacular/validation/__pycache__/__init__.cpython-310.pyc,, -drf_spectacular/validation/openapi_3_0_schema.json,sha256=Q9qfIPZwU17pohQYXQZqh5ZklCDM_ZQil49RtSgaVkg,35816 -drf_spectacular/validation/openapi_3_1_schema.json,sha256=Bk8Gm_pfHwdvs8ORXvjlD64-sPry8yn-5ta2GcGfsQw,34246 -drf_spectacular/views.py,sha256=cZsbyWz-KVoiD49il_kNvE3QFT92k4Z8dBDy39GahI8,12159 diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/REQUESTED b/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/WHEEL deleted file mode 100644 index ae527e7..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.6.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/top_level.txt deleted file mode 100644 index a27958a..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular-0.28.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -drf_spectacular diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/__init__.py b/.venv/lib/python3.10/site-packages/drf_spectacular/__init__.py deleted file mode 100644 index a1024a1..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -import django - -__version__ = '0.28.0' - -if django.VERSION < (3, 2): - default_app_config = 'drf_spectacular.apps.SpectacularConfig' diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/apps.py b/.venv/lib/python3.10/site-packages/drf_spectacular/apps.py deleted file mode 100644 index 220e55d..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/apps.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.apps import AppConfig - - -class SpectacularConfig(AppConfig): - name = 'drf_spectacular' - verbose_name = "drf-spectacular" - - def ready(self): - import drf_spectacular.checks # noqa: F401 diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/authentication.py b/.venv/lib/python3.10/site-packages/drf_spectacular/authentication.py deleted file mode 100644 index afd2725..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/authentication.py +++ /dev/null @@ -1,42 +0,0 @@ -from django.conf import settings - -from drf_spectacular.extensions import OpenApiAuthenticationExtension -from drf_spectacular.plumbing import build_bearer_security_scheme_object - - -class SessionScheme(OpenApiAuthenticationExtension): - target_class = 'rest_framework.authentication.SessionAuthentication' - name = 'cookieAuth' - priority = -1 - - def get_security_definition(self, auto_schema): - return { - 'type': 'apiKey', - 'in': 'cookie', - 'name': settings.SESSION_COOKIE_NAME, - } - - -class BasicScheme(OpenApiAuthenticationExtension): - target_class = 'rest_framework.authentication.BasicAuthentication' - name = 'basicAuth' - priority = -1 - - def get_security_definition(self, auto_schema): - return { - 'type': 'http', - 'scheme': 'basic', - } - - -class TokenScheme(OpenApiAuthenticationExtension): - target_class = 'rest_framework.authentication.TokenAuthentication' - name = 'tokenAuth' - match_subclasses = True - priority = -1 - - def get_security_definition(self, auto_schema): - return build_bearer_security_scheme_object( - header_name='Authorization', - token_prefix=self.target.keyword, - ) diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/checks.py b/.venv/lib/python3.10/site-packages/drf_spectacular/checks.py deleted file mode 100644 index 1f2ca7c..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/checks.py +++ /dev/null @@ -1,26 +0,0 @@ -from django.core.checks import Error, Warning, register - - -@register(deploy=True) -def schema_check(app_configs, **kwargs): - """ Perform dummy generation and emit warnings/errors as part of Django's check framework """ - from drf_spectacular.drainage import GENERATOR_STATS - from drf_spectacular.settings import spectacular_settings - - if not spectacular_settings.ENABLE_DJANGO_DEPLOY_CHECK: - return [] - - errors = [] - try: - with GENERATOR_STATS.silence(): - spectacular_settings.DEFAULT_GENERATOR_CLASS().get_schema(request=None, public=True) - except Exception as exc: - errors.append( - Error(f'Schema generation threw exception "{exc}"', id='drf_spectacular.E001') - ) - if GENERATOR_STATS: - for w in GENERATOR_STATS._warn_cache: - errors.append(Warning(w, id='drf_spectacular.W001')) - for e in GENERATOR_STATS._error_cache: - errors.append(Warning(e, id='drf_spectacular.W002')) - return errors diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/__init__.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/__init__.py deleted file mode 100644 index 4da50f0..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -__all__ = [ - 'django_oauth_toolkit', - 'djangorestframework_camel_case', - 'rest_auth', - 'rest_framework', - 'rest_polymorphic', - 'rest_framework_dataclasses', - 'rest_framework_jwt', - 'rest_framework_simplejwt', - 'django_filters', - 'rest_framework_recursive', - 'rest_framework_gis', - 'pydantic', - 'knox_auth_token', -] diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/django_filters.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/django_filters.py deleted file mode 100644 index 5b45e61..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/django_filters.py +++ /dev/null @@ -1,305 +0,0 @@ -from django.db import models - -from drf_spectacular.drainage import add_trace_message, get_override, has_override, warn -from drf_spectacular.extensions import OpenApiFilterExtension -from drf_spectacular.plumbing import ( - build_array_type, build_basic_type, build_choice_description_list, build_parameter_type, - follow_field_source, force_instance, get_manager, get_type_hints, get_view_model, is_basic_type, - is_field, -) -from drf_spectacular.settings import spectacular_settings -from drf_spectacular.types import OpenApiTypes -from drf_spectacular.utils import OpenApiParameter - -_NoHint = object() - - -class DjangoFilterExtension(OpenApiFilterExtension): - """ - Extensions that specifically deals with ``django-filter`` fields. The introspection - attempts to estimate the underlying model field types to generate filter types. - - However, there are under-specified filter fields for which heuristics need to be performed. - This serves as an explicit list of all partially-handled filter fields: - - - ``AllValuesFilter``: skip choices to prevent DB query - - ``AllValuesMultipleFilter``: skip choices to prevent DB query, multi handled though - - ``ChoiceFilter``: enum handled, type under-specified - - ``DateRangeFilter``: N/A - - ``LookupChoiceFilter``: N/A - - ``ModelChoiceFilter``: enum handled - - ``ModelMultipleChoiceFilter``: enum, multi handled - - ``MultipleChoiceFilter``: enum, multi handled - - ``RangeFilter``: min/max handled, type under-specified - - ``TypedChoiceFilter``: enum handled - - ``TypedMultipleChoiceFilter``: enum, multi handled - - In case of warnings or incorrect filter types, you can manually override the underlying - field type with a manual ``extend_schema_field`` decoration. Alternatively, if you have a - filter method for your filter field, you can attach ``extend_schema_field`` to that filter - method. - - .. code-block:: - - class SomeFilter(FilterSet): - some_field = extend_schema_field(OpenApiTypes.NUMBER)( - RangeFilter(field_name='some_manually_annotated_field_in_qs') - ) - - """ - target_class = 'django_filters.rest_framework.DjangoFilterBackend' - match_subclasses = True - - def get_schema_operation_parameters(self, auto_schema, *args, **kwargs): - model = get_view_model(auto_schema.view) - if not model: - return [] - - filterset_class = self.target.get_filterset_class(auto_schema.view, get_manager(model).none()) - if not filterset_class: - return [] - - result = [] - with add_trace_message(filterset_class): - for field_name, filter_field in filterset_class.base_filters.items(): - result += self.resolve_filter_field( - auto_schema, model, filterset_class, field_name, filter_field - ) - return result - - def resolve_filter_field(self, auto_schema, model, filterset_class, field_name, filter_field): - from django_filters import filters - - unambiguous_mapping = { - filters.CharFilter: OpenApiTypes.STR, - filters.BooleanFilter: OpenApiTypes.BOOL, - filters.DateFilter: OpenApiTypes.DATE, - filters.DateTimeFilter: OpenApiTypes.DATETIME, - filters.IsoDateTimeFilter: OpenApiTypes.DATETIME, - filters.TimeFilter: OpenApiTypes.TIME, - filters.UUIDFilter: OpenApiTypes.UUID, - filters.DurationFilter: OpenApiTypes.DURATION, - filters.OrderingFilter: OpenApiTypes.STR, - filters.TimeRangeFilter: OpenApiTypes.TIME, - filters.DateFromToRangeFilter: OpenApiTypes.DATE, - filters.IsoDateTimeFromToRangeFilter: OpenApiTypes.DATETIME, - filters.DateTimeFromToRangeFilter: OpenApiTypes.DATETIME, - } - filter_method = self._get_filter_method(filterset_class, filter_field) - filter_method_hint = self._get_filter_method_hint(filter_method) - filter_choices = self._get_explicit_filter_choices(filter_field) - schema_from_override = False - - if has_override(filter_field, 'field') or has_override(filter_method, 'field'): - schema_from_override = True - annotation = ( - get_override(filter_field, 'field') or get_override(filter_method, 'field') - ) - if is_basic_type(annotation): - schema = build_basic_type(annotation) - elif isinstance(annotation, dict): - # allow injecting raw schema via @extend_schema_field decorator - schema = annotation.copy() - elif is_field(annotation): - schema = auto_schema._map_serializer_field(force_instance(annotation), "request") - else: - warn( - f"Unsupported annotation {annotation} on filter field {field_name}. defaulting to string." - ) - schema = build_basic_type(OpenApiTypes.STR) - elif filter_method_hint is not _NoHint: - if is_basic_type(filter_method_hint): - schema = build_basic_type(filter_method_hint) - else: - schema = build_basic_type(OpenApiTypes.STR) - elif isinstance(filter_field, tuple(unambiguous_mapping)): - for cls in filter_field.__class__.__mro__: - if cls in unambiguous_mapping: - schema = build_basic_type(unambiguous_mapping[cls]) - break - elif isinstance(filter_field, (filters.NumberFilter, filters.NumericRangeFilter)): - # NumberField is underspecified by itself. try to find the - # type that makes the most sense or default to generic NUMBER - model_field = self._get_model_field(filter_field, model) - if isinstance(model_field, (models.IntegerField, models.AutoField)): - schema = build_basic_type(OpenApiTypes.INT) - elif isinstance(model_field, models.FloatField): - schema = build_basic_type(OpenApiTypes.FLOAT) - elif isinstance(model_field, models.DecimalField): - schema = build_basic_type(OpenApiTypes.NUMBER) # TODO may be improved - else: - schema = build_basic_type(OpenApiTypes.NUMBER) - elif isinstance(filter_field, (filters.ChoiceFilter, filters.MultipleChoiceFilter)): - try: - schema = self._get_schema_from_model_field(auto_schema, filter_field, model) - except Exception: - if filter_choices and is_basic_type(type(filter_choices[0])): - # fallback to type guessing from first choice element - schema = build_basic_type(type(filter_choices[0])) - else: - warn( - f'Unable to guess choice types from values, filter method\'s type hint ' - f'or find "{field_name}" in model. Defaulting to string.' - ) - schema = build_basic_type(OpenApiTypes.STR) - else: - # the last resort is to look up the type via the model or queryset field - # and emit a warning if we were unsuccessful. - try: - schema = self._get_schema_from_model_field(auto_schema, filter_field, model) - except Exception as exc: # pragma: no cover - warn( - f'Exception raised while trying resolve model field for django-filter ' - f'field "{field_name}". Defaulting to string (Exception: {exc})' - ) - schema = build_basic_type(OpenApiTypes.STR) - - # primary keys are usually non-editable (readOnly=True) and map_model_field correctly - # signals that attribute. however this does not apply in this context. - schema.pop('readOnly', None) - # enrich schema with additional info from filter_field - enum = schema.pop('enum', None) - # explicit filter choices may disable enum retrieved from model - if not schema_from_override and filter_choices is not None: - enum = filter_choices - - description = schema.pop('description', None) - if not schema_from_override: - description = self._get_field_description(filter_field, description) - - # parameter style variations based on filter base class - if isinstance(filter_field, filters.BaseCSVFilter): - schema = build_array_type(schema) - field_names = [field_name] - explode = False - style = 'form' - elif isinstance(filter_field, filters.MultipleChoiceFilter): - schema = build_array_type(schema) - field_names = [field_name] - explode = True - style = 'form' - elif isinstance(filter_field, (filters.RangeFilter, filters.NumericRangeFilter)): - try: - suffixes = filter_field.field_class.widget.suffixes - except AttributeError: - suffixes = ['min', 'max'] - field_names = [ - f'{field_name}_{suffix}' if suffix else field_name for suffix in suffixes - ] - explode = None - style = None - else: - field_names = [field_name] - explode = None - style = None - - return [ - build_parameter_type( - name=field_name, - required=filter_field.extra['required'], - location=OpenApiParameter.QUERY, - description=description, - schema=schema, - enum=enum, - explode=explode, - style=style - ) - for field_name in field_names - ] - - def _get_filter_method(self, filterset_class, filter_field): - if callable(filter_field.method): - return filter_field.method - elif isinstance(filter_field.method, str): - return getattr(filterset_class, filter_field.method) - else: - return None - - def _get_filter_method_hint(self, filter_method): - try: - return get_type_hints(filter_method)['value'] - except: # noqa: E722 - return _NoHint - - def _get_explicit_filter_choices(self, filter_field): - if 'choices' not in filter_field.extra: - return None - elif callable(filter_field.extra['choices']): - # choices function may utilize the DB, so refrain from actually calling it. - return [] - else: - return [c for c, _ in filter_field.extra['choices']] - - def _get_model_field(self, filter_field, model): - if not filter_field.field_name: - return None - path = filter_field.field_name.split('__') - return follow_field_source(model, path, emit_warnings=False) - - def _get_schema_from_model_field(self, auto_schema, filter_field, model): - # Has potential to throw exceptions. Needs to be wrapped in try/except! - # - # first search for the field in the model as this has the least amount of - # potential side effects. Only after that fails, attempt to call - # get_queryset() to check for potential query annotations. - model_field = self._get_model_field(filter_field, model) - - # this is a cross feature between rest-framework-gis and django-filter. Regular - # behavior needs to be sidestepped as the model information is lost down the line. - # TODO for now this will be just a string to cover WKT, WKB, and urlencoded GeoJSON - # build_geo_schema(model_field) would yield the correct result - if self._is_gis(model_field): - return build_basic_type(OpenApiTypes.STR) - - if not isinstance(model_field, models.Field): - qs = auto_schema.view.get_queryset() - model_field = qs.query.annotations[filter_field.field_name].field - return auto_schema._map_model_field(model_field, direction=None) - - def _get_field_description(self, filter_field, description): - # Try to improve description beyond auto-generated model description - if filter_field.extra.get('help_text', None): - description = filter_field.extra['help_text'] - elif filter_field.label is not None: - description = filter_field.label - - choices = filter_field.extra.get('choices') - if choices and callable(choices): - # remove auto-generated enum list, since choices come from a callable - if '\n\n*' in (description or ''): - description, _, _ = description.partition('\n\n*') - elif (description or '').startswith('* `'): - description = '' - return description - - choice_description = '' - if spectacular_settings.ENUM_GENERATE_CHOICE_DESCRIPTION and choices and not callable(choices): - choice_description = build_choice_description_list(choices) - - if not choices: - return description - - if not description: - return choice_description - - if '\n\n*' in description: - description, _, _ = description.partition('\n\n*') - return description + '\n\n' + choice_description - - if description.startswith('* `'): - return choice_description - - return description + '\n\n' + choice_description - - @classmethod - def _is_gis(cls, field): - if not getattr(cls, '_has_gis', True): - return False - try: - from django.contrib.gis.db.models import GeometryField - from rest_framework_gis.filters import GeometryFilter - - return isinstance(field, (GeometryField, GeometryFilter)) - except: # noqa - cls._has_gis = False - return False diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/django_oauth_toolkit.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/django_oauth_toolkit.py deleted file mode 100644 index d60c509..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/django_oauth_toolkit.py +++ /dev/null @@ -1,49 +0,0 @@ -from drf_spectacular.extensions import OpenApiAuthenticationExtension - - -class DjangoOAuthToolkitScheme(OpenApiAuthenticationExtension): - target_class = 'oauth2_provider.contrib.rest_framework.OAuth2Authentication' - name = 'oauth2' - - def get_security_requirement(self, auto_schema): - from oauth2_provider.contrib.rest_framework import ( - IsAuthenticatedOrTokenHasScope, TokenHasScope, TokenMatchesOASRequirements, - ) - view = auto_schema.view - request = view.request - - for permission in auto_schema.view.get_permissions(): - if isinstance(permission, TokenMatchesOASRequirements): - alt_scopes = permission.get_required_alternate_scopes(request, view) - alt_scopes = alt_scopes.get(auto_schema.method, []) - return [{self.name: group} for group in alt_scopes] - if isinstance(permission, IsAuthenticatedOrTokenHasScope): - return {self.name: TokenHasScope().get_scopes(request, view)} - if isinstance(permission, TokenHasScope): - # catch-all for subclasses of TokenHasScope like TokenHasReadWriteScope - return {self.name: permission.get_scopes(request, view)} - - def get_security_definition(self, auto_schema): - from oauth2_provider.scopes import get_scopes_backend - - from drf_spectacular.settings import spectacular_settings - - flows = {} - for flow_type in spectacular_settings.OAUTH2_FLOWS: - flows[flow_type] = {} - if flow_type in ('implicit', 'authorizationCode'): - flows[flow_type]['authorizationUrl'] = spectacular_settings.OAUTH2_AUTHORIZATION_URL - if flow_type in ('password', 'clientCredentials', 'authorizationCode'): - flows[flow_type]['tokenUrl'] = spectacular_settings.OAUTH2_TOKEN_URL - if spectacular_settings.OAUTH2_REFRESH_URL: - flows[flow_type]['refreshUrl'] = spectacular_settings.OAUTH2_REFRESH_URL - if spectacular_settings.OAUTH2_SCOPES: - flows[flow_type]['scopes'] = spectacular_settings.OAUTH2_SCOPES - else: - scope_backend = get_scopes_backend() - flows[flow_type]['scopes'] = scope_backend.get_all_scopes() - - return { - 'type': 'oauth2', - 'flows': flows - } diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/djangorestframework_camel_case.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/djangorestframework_camel_case.py deleted file mode 100644 index e37d7a8..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/djangorestframework_camel_case.py +++ /dev/null @@ -1,62 +0,0 @@ -import re -from typing import Optional - -from django.utils.module_loading import import_string - - -def camelize_serializer_fields(result, generator, request, public): - from django.conf import settings - from djangorestframework_camel_case.settings import api_settings - from djangorestframework_camel_case.util import camelize_re, underscore_to_camel - - # prunes subtrees from camelization based on owning field name - ignore_fields = api_settings.JSON_UNDERSCOREIZE.get("ignore_fields") or () - # ignore certain field names while camelizing - ignore_keys = api_settings.JSON_UNDERSCOREIZE.get("ignore_keys") or () - - def has_middleware_installed(): - try: - from djangorestframework_camel_case.middleware import CamelCaseMiddleWare - except ImportError: - return False - - for middleware in [import_string(m) for m in settings.MIDDLEWARE]: - try: - if issubclass(middleware, CamelCaseMiddleWare): - return True - except TypeError: - pass - - def camelize_str(key: str) -> str: - new_key = re.sub(camelize_re, underscore_to_camel, key) if "_" in key else key - if key in ignore_keys or new_key in ignore_keys: - return key - return new_key - - def camelize_component(schema: dict, name: Optional[str] = None) -> dict: - if name is not None and (name in ignore_fields or camelize_str(name) in ignore_fields): - return schema - elif schema.get('type') == 'object': - if 'properties' in schema: - schema['properties'] = { - camelize_str(field_name): camelize_component(field_schema, field_name) - for field_name, field_schema in schema['properties'].items() - } - if 'required' in schema: - schema['required'] = [camelize_str(field) for field in schema['required']] - elif schema.get('type') == 'array': - camelize_component(schema['items']) - return schema - - for (_, component_type), component in generator.registry._components.items(): - if component_type == 'schemas': - camelize_component(component.schema) - - if has_middleware_installed(): - for url_schema in result["paths"].values(): - for method_schema in url_schema.values(): - for parameter in method_schema.get("parameters", []): - parameter["name"] = camelize_str(parameter["name"]) - - # inplace modification of components also affect result dict, so regeneration is not necessary - return result diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/knox_auth_token.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/knox_auth_token.py deleted file mode 100644 index 16f11d7..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/knox_auth_token.py +++ /dev/null @@ -1,13 +0,0 @@ -from drf_spectacular.extensions import OpenApiAuthenticationExtension -from drf_spectacular.plumbing import build_bearer_security_scheme_object - - -class KnoxTokenScheme(OpenApiAuthenticationExtension): - target_class = 'knox.auth.TokenAuthentication' - name = 'knoxApiToken' - - def get_security_definition(self, auto_schema): - return build_bearer_security_scheme_object( - header_name='Authorization', - token_prefix=self.target.authenticate_header(""), - ) diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/pydantic.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/pydantic.py deleted file mode 100644 index 395a8a9..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/pydantic.py +++ /dev/null @@ -1,50 +0,0 @@ -from drf_spectacular.drainage import set_override, warn -from drf_spectacular.extensions import OpenApiSerializerExtension -from drf_spectacular.plumbing import ResolvedComponent, build_basic_type -from drf_spectacular.types import OpenApiTypes - - -class PydanticExtension(OpenApiSerializerExtension): - """ - Allows using pydantic models on @extend_schema(request=..., response=...) to - describe your API. - - We only have partial support for pydantic's version of dataclass, due to the way they - are designed. The outermost class (the @extend_schema argument) has to be a subclass - of pydantic.BaseModel. Inside this outermost BaseModel, any combination of dataclass - and BaseModel can be used. - """ - - target_class = "pydantic.BaseModel" - match_subclasses = True - - def get_name(self, auto_schema, direction): - # due to the fact that it is complicated to pull out every field member BaseModel class - # of the entry model, we simply use the class name as string for object. This hack may - # create false positive warnings, so turn it off. However, this may suppress correct - # warnings involving the entry class. - # TODO suppression may be migrated to new ComponentIdentity system - set_override(self.target, 'suppress_collision_warning', True) - return self.target.__name__ - - def map_serializer(self, auto_schema, direction): - # let pydantic generate a JSON schema - try: - from pydantic.json_schema import model_json_schema - except ImportError: - warn("Only pydantic >= 2 is supported. defaulting to generic object.") - return build_basic_type(OpenApiTypes.OBJECT) - - schema = model_json_schema(self.target, ref_template="#/components/schemas/{model}", mode="serialization") - - # pull out potential sub-schemas and put them into component section - for sub_name, sub_schema in schema.pop("$defs", {}).items(): - component = ResolvedComponent( - name=sub_name, - type=ResolvedComponent.SCHEMA, - object=sub_name, - schema=sub_schema, - ) - auto_schema.registry.register_on_missing(component) - - return schema diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_auth.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_auth.py deleted file mode 100644 index df9305b..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_auth.py +++ /dev/null @@ -1,173 +0,0 @@ -from django.conf import settings -from django.utils.version import get_version_tuple -from rest_framework import serializers - -from drf_spectacular.contrib.rest_framework_simplejwt import ( - SimpleJWTScheme, TokenRefreshSerializerExtension, -) -from drf_spectacular.drainage import warn -from drf_spectacular.extensions import OpenApiSerializerExtension, OpenApiViewExtension -from drf_spectacular.utils import extend_schema - - -def get_dj_rest_auth_setting(class_name, setting_name): - from dj_rest_auth.__version__ import __version__ - - if get_version_tuple(__version__) < (3, 0, 0): - from dj_rest_auth import app_settings - - return getattr(app_settings, class_name) - else: - from dj_rest_auth.app_settings import api_settings - - return getattr(api_settings, setting_name) - - -def get_token_serializer_class(): - from dj_rest_auth.__version__ import __version__ - - if get_version_tuple(__version__) < (3, 0, 0): - use_jwt = getattr(settings, 'REST_USE_JWT', False) - else: - from dj_rest_auth.app_settings import api_settings - - use_jwt = api_settings.USE_JWT - - if use_jwt: - return get_dj_rest_auth_setting('JWTSerializer', 'JWT_SERIALIZER') - else: - return get_dj_rest_auth_setting('TokenSerializer', 'TOKEN_SERIALIZER') - - -class RestAuthDetailSerializer(serializers.Serializer): - detail = serializers.CharField(read_only=True, required=False) - - -class RestAuthDefaultResponseView(OpenApiViewExtension): - def view_replacement(self): - class Fixed(self.target_class): - @extend_schema(responses=RestAuthDetailSerializer) - def post(self, request, *args, **kwargs): - pass # pragma: no cover - - return Fixed - - -class RestAuthLoginView(OpenApiViewExtension): - target_class = 'dj_rest_auth.views.LoginView' - - def view_replacement(self): - class Fixed(self.target_class): - @extend_schema(responses=get_token_serializer_class()) - def post(self, request, *args, **kwargs): - pass # pragma: no cover - - return Fixed - - -class RestAuthLogoutView(OpenApiViewExtension): - target_class = 'dj_rest_auth.views.LogoutView' - - def view_replacement(self): - if getattr(settings, 'ACCOUNT_LOGOUT_ON_GET', None): - get_schema_params = {'responses': RestAuthDetailSerializer} - else: - get_schema_params = {'exclude': True} - - class Fixed(self.target_class): - @extend_schema(**get_schema_params) - def get(self, request, *args, **kwargs): - pass # pragma: no cover - - @extend_schema(request=None, responses=RestAuthDetailSerializer) - def post(self, request, *args, **kwargs): - pass # pragma: no cover - - return Fixed - - -class RestAuthPasswordChangeView(RestAuthDefaultResponseView): - target_class = 'dj_rest_auth.views.PasswordChangeView' - - -class RestAuthPasswordResetView(RestAuthDefaultResponseView): - target_class = 'dj_rest_auth.views.PasswordResetView' - - -class RestAuthPasswordResetConfirmView(RestAuthDefaultResponseView): - target_class = 'dj_rest_auth.views.PasswordResetConfirmView' - - -class RestAuthVerifyEmailView(RestAuthDefaultResponseView): - target_class = 'dj_rest_auth.registration.views.VerifyEmailView' - optional = True - - -class RestAuthResendEmailVerificationView(RestAuthDefaultResponseView): - target_class = 'dj_rest_auth.registration.views.ResendEmailVerificationView' - optional = True - - -class RestAuthJWTSerializer(OpenApiSerializerExtension): - target_class = 'dj_rest_auth.serializers.JWTSerializer' - - def map_serializer(self, auto_schema, direction): - class Fixed(self.target_class): - user = get_dj_rest_auth_setting('UserDetailsSerializer', 'USER_DETAILS_SERIALIZER')() - - return auto_schema._map_serializer(Fixed, direction) - - -class CookieTokenRefreshSerializerExtension(TokenRefreshSerializerExtension): - target_class = 'dj_rest_auth.jwt_auth.CookieTokenRefreshSerializer' - optional = True - - def get_name(self): - return 'TokenRefresh' - - -class RestAuthRegisterView(OpenApiViewExtension): - target_class = 'dj_rest_auth.registration.views.RegisterView' - optional = True - - def view_replacement(self): - from allauth.account.app_settings import EMAIL_VERIFICATION, EmailVerificationMethod - - if EMAIL_VERIFICATION == EmailVerificationMethod.MANDATORY: - response_serializer = RestAuthDetailSerializer - else: - response_serializer = get_token_serializer_class() - - class Fixed(self.target_class): - @extend_schema(responses=response_serializer) - def post(self, request, *args, **kwargs): - pass # pragma: no cover - - return Fixed - - -class SimpleJWTCookieScheme(SimpleJWTScheme): - target_class = 'dj_rest_auth.jwt_auth.JWTCookieAuthentication' - optional = True - name = ['jwtHeaderAuth', 'jwtCookieAuth'] # type: ignore - - def get_security_requirement(self, auto_schema): - return [{name: []} for name in self.name] - - def get_security_definition(self, auto_schema): - cookie_name = get_dj_rest_auth_setting('JWT_AUTH_COOKIE', 'JWT_AUTH_COOKIE') - if not cookie_name: - cookie_name = 'jwt-auth' - warn( - f'"JWT_AUTH_COOKIE" setting required for JWTCookieAuthentication. ' - f'defaulting to {cookie_name}' - ) - - return [ - super().get_security_definition(auto_schema), # JWT from header - { - 'type': 'apiKey', - 'in': 'cookie', - 'name': cookie_name, - } - ] diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework.py deleted file mode 100644 index edf4395..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework.py +++ /dev/null @@ -1,32 +0,0 @@ -from drf_spectacular.extensions import OpenApiViewExtension - - -class ObtainAuthTokenView(OpenApiViewExtension): - target_class = 'rest_framework.authtoken.views.ObtainAuthToken' - match_subclasses = True - - def view_replacement(self): - """ - Prior to DRF 3.12.0, usage of ObtainAuthToken resulted in AssertionError - - Incompatible AutoSchema used on View "ObtainAuthToken". Is DRF's DEFAULT_SCHEMA_CLASS ... - - This is because DRF had a bug which made it NOT honor DEFAULT_SCHEMA_CLASS and instead - injected an unsolicited coreschema class for this view and this view only. This extension - fixes the view before the wrong schema class is used. - - Bug in DRF that was fixed in later versions: - https://github.com/encode/django-rest-framework/blob/4121b01b912668c049b26194a9a107c27a332429/rest_framework/authtoken/views.py#L16 - """ - from rest_framework import VERSION - - from drf_spectacular.openapi import AutoSchema - - # no intervention needed - if VERSION >= '3.12': - return self.target - - class FixedObtainAuthToken(self.target): - schema = AutoSchema() - - return FixedObtainAuthToken diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_dataclasses.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_dataclasses.py deleted file mode 100644 index 95a8ade..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_dataclasses.py +++ /dev/null @@ -1,36 +0,0 @@ -from typing import Any - -from drf_spectacular.drainage import get_override, has_override -from drf_spectacular.extensions import OpenApiSerializerExtension -from drf_spectacular.plumbing import ComponentIdentity, get_doc -from drf_spectacular.utils import Direction - - -class OpenApiDataclassSerializerExtensions(OpenApiSerializerExtension): - target_class = "rest_framework_dataclasses.serializers.DataclassSerializer" - match_subclasses = True - - def get_name(self): - """Use the dataclass name in the schema, instead of the serializer prefix (which can be just Dataclass).""" - if has_override(self.target, 'component_name'): - return get_override(self.target, 'component_name') - if getattr(getattr(self.target, 'Meta', None), 'ref_name', None) is not None: - return self.target.Meta.ref_name - if has_override(self.target.dataclass_definition.dataclass_type, 'component_name'): - return get_override(self.target.dataclass_definition.dataclass_type, 'component_name') - return self.target.dataclass_definition.dataclass_type.__name__ - - def get_identity(self, auto_schema, direction: Direction) -> Any: - return ComponentIdentity(self.target.dataclass_definition.dataclass_type) - - def strip_library_doc(self, schema): - """Strip the DataclassSerializer library documentation from the schema.""" - from rest_framework_dataclasses.serializers import DataclassSerializer - if 'description' in schema and schema['description'] == get_doc(DataclassSerializer): - del schema['description'] - return schema - - def map_serializer(self, auto_schema, direction: Direction): - """"Generate the schema for a DataclassSerializer.""" - schema = auto_schema._map_serializer(self.target, direction, bypass_extensions=True) - return self.strip_library_doc(schema) diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_gis.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_gis.py deleted file mode 100644 index 874a99d..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_gis.py +++ /dev/null @@ -1,219 +0,0 @@ -from rest_framework.utils.model_meta import get_field_info - -from drf_spectacular.drainage import warn -from drf_spectacular.extensions import OpenApiSerializerExtension, OpenApiSerializerFieldExtension -from drf_spectacular.plumbing import ( - ResolvedComponent, build_array_type, build_object_type, follow_field_source, get_doc, -) - - -def build_point_schema(): - return { - "type": "array", - "items": {"type": "number", "format": "float"}, - "example": [12.9721, 77.5933], - "minItems": 2, - "maxItems": 3, - } - - -def build_linestring_schema(): - return { - "type": "array", - "items": build_point_schema(), - "example": [[22.4707, 70.0577], [12.9721, 77.5933]], - "minItems": 2, - } - - -def build_polygon_schema(): - return { - "type": "array", - "items": {**build_linestring_schema(), "minItems": 4}, - "example": [ - [ - [0.0, 0.0], - [0.0, 50.0], - [50.0, 50.0], - [50.0, 0.0], - [0.0, 0.0], - ], - ] - } - - -def build_geo_container_schema(name, coords): - return build_object_type( - properties={ - "type": {"type": "string", "enum": [name]}, - "coordinates": coords, - } - ) - - -def build_point_geo_schema(): - return build_geo_container_schema("Point", build_point_schema()) - - -def build_linestring_geo_schema(): - return build_geo_container_schema("LineString", build_linestring_schema()) - - -def build_polygon_geo_schema(): - return build_geo_container_schema("Polygon", build_polygon_schema()) - - -def build_geometry_geo_schema(): - return { - 'oneOf': [ - build_point_geo_schema(), - build_linestring_geo_schema(), - build_polygon_geo_schema(), - ] - } - - -def build_bbox_schema(): - return { - "type": "array", - "items": {"type": "number"}, - "minItems": 4, - "maxItems": 4, - "example": [12.9721, 77.5933, 12.9721, 77.5933], - } - - -def build_geo_schema(model_field): - from django.contrib.gis.db import models - - if isinstance(model_field, models.PointField): - return build_point_geo_schema() - elif isinstance(model_field, models.LineStringField): - return build_linestring_geo_schema() - elif isinstance(model_field, models.PolygonField): - return build_polygon_geo_schema() - elif isinstance(model_field, models.MultiPointField): - return build_geo_container_schema( - "MultiPoint", build_array_type(build_point_schema()) - ) - elif isinstance(model_field, models.MultiLineStringField): - return build_geo_container_schema( - "MultiLineString", build_array_type(build_linestring_schema()) - ) - elif isinstance(model_field, models.MultiPolygonField): - return build_geo_container_schema( - "MultiPolygon", build_array_type(build_polygon_schema()) - ) - elif isinstance(model_field, models.GeometryCollectionField): - return build_geo_container_schema( - "GeometryCollection", build_array_type(build_geometry_geo_schema()) - ) - elif isinstance(model_field, models.GeometryField): - return build_geometry_geo_schema() - else: - warn("Encountered unknown GIS geometry field") - return {} - - -def map_geo_field(serializer, geo_field_name): - from rest_framework_gis.fields import GeometrySerializerMethodField - - field = serializer.fields[geo_field_name] - if isinstance(field, GeometrySerializerMethodField): - warn("Geometry generation for GeometrySerializerMethodField is not supported.") - return {} - model_field = get_field_info(serializer.Meta.model).fields[geo_field_name] - return build_geo_schema(model_field) - - -def _inject_enum_collision_fix(collection): - from drf_spectacular.settings import spectacular_settings - if not collection and 'GisFeatureEnum' not in spectacular_settings.ENUM_NAME_OVERRIDES: - spectacular_settings.ENUM_NAME_OVERRIDES['GisFeatureEnum'] = ('Feature',) - if collection and 'GisFeatureCollectionEnum' not in spectacular_settings.ENUM_NAME_OVERRIDES: - spectacular_settings.ENUM_NAME_OVERRIDES['GisFeatureCollectionEnum'] = ('FeatureCollection',) - - -class GeoFeatureModelSerializerExtension(OpenApiSerializerExtension): - target_class = 'rest_framework_gis.serializers.GeoFeatureModelSerializer' - match_subclasses = True - - def map_serializer(self, auto_schema, direction): - _inject_enum_collision_fix(collection=False) - - base_schema = auto_schema._map_serializer(self.target, direction, bypass_extensions=True) - return self.map_geo_feature_model_serializer(self.target, base_schema) - - def map_geo_feature_model_serializer(self, serializer, base_schema): - from rest_framework_gis.serializers import GeoFeatureModelSerializer - - geo_properties = { - "type": {"type": "string", "enum": ["Feature"]} - } - if serializer.Meta.id_field: - geo_properties["id"] = base_schema["properties"].pop(serializer.Meta.id_field) - - geo_properties["geometry"] = map_geo_field(serializer, serializer.Meta.geo_field) - base_schema["properties"].pop(serializer.Meta.geo_field) - - if serializer.Meta.auto_bbox or serializer.Meta.bbox_geo_field: - geo_properties["bbox"] = build_bbox_schema() - base_schema["properties"].pop(serializer.Meta.bbox_geo_field, None) - - # only expose if description comes from the user - description = base_schema.pop('description', None) - if description == get_doc(GeoFeatureModelSerializer): - description = None - - # ignore this aspect for now - base_schema.pop('required', None) - - # nest remaining fields under property "properties" - geo_properties["properties"] = base_schema - - return build_object_type( - properties=geo_properties, - description=description, - ) - - -class GeoFeatureModelListSerializerExtension(OpenApiSerializerExtension): - target_class = 'rest_framework_gis.serializers.GeoFeatureModelListSerializer' - - def map_serializer(self, auto_schema, direction): - _inject_enum_collision_fix(collection=True) - - # build/retrieve feature component generated by GeoFeatureModelSerializerExtension. - # wrap the ref in the special list structure and build another component based on that. - feature_component = auto_schema.resolve_serializer(self.target.child, direction) - collection_schema = build_object_type( - properties={ - "type": {"type": "string", "enum": ["FeatureCollection"]}, - "features": build_array_type(feature_component.ref) - } - ) - list_component = ResolvedComponent( - name=f'{feature_component.name}List', - type=ResolvedComponent.SCHEMA, - object=self.target.child, - schema=collection_schema - ) - auto_schema.registry.register_on_missing(list_component) - return list_component.ref - - -class GeometryFieldExtension(OpenApiSerializerFieldExtension): - target_class = 'rest_framework_gis.fields.GeometryField' - match_subclasses = True - - def map_serializer_field(self, auto_schema, direction): - # running this extension for GeoFeatureModelSerializer's geo_field is superfluous - # as above extension already handles that individually. We run it anyway because - # robustly checking the proper condition is harder. - try: - model = self.target.parent.Meta.model - model_field = follow_field_source(model, self.target.source.split('.')) - return build_geo_schema(model_field) - except: # noqa: E722 - warn(f'Encountered an issue resolving field {self.target}. defaulting to generic object.') - return {} diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_jwt.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_jwt.py deleted file mode 100644 index a3ebfc6..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_jwt.py +++ /dev/null @@ -1,16 +0,0 @@ -from drf_spectacular.extensions import OpenApiAuthenticationExtension -from drf_spectacular.plumbing import build_bearer_security_scheme_object - - -class JWTScheme(OpenApiAuthenticationExtension): - target_class = 'rest_framework_jwt.authentication.JSONWebTokenAuthentication' - name = 'jwtAuth' - - def get_security_definition(self, auto_schema): - from rest_framework_jwt.settings import api_settings - - return build_bearer_security_scheme_object( - header_name='AUTHORIZATION', - token_prefix=api_settings.JWT_AUTH_HEADER_PREFIX, - bearer_format='JWT' - ) diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_recursive.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_recursive.py deleted file mode 100644 index 21e82fa..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_recursive.py +++ /dev/null @@ -1,16 +0,0 @@ -from drf_spectacular.extensions import OpenApiSerializerFieldExtension -from drf_spectacular.plumbing import build_array_type, is_list_serializer - - -class RecursiveFieldExtension(OpenApiSerializerFieldExtension): - target_class = "rest_framework_recursive.fields.RecursiveField" - - def map_serializer_field(self, auto_schema, direction): - proxied = self.target.proxied - - if is_list_serializer(proxied): - component = auto_schema.resolve_serializer(proxied.child, direction) - return build_array_type(component.ref) - - component = auto_schema.resolve_serializer(proxied, direction) - return component.ref diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_simplejwt.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_simplejwt.py deleted file mode 100644 index 460d42b..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_framework_simplejwt.py +++ /dev/null @@ -1,87 +0,0 @@ -from rest_framework import serializers - -from drf_spectacular.drainage import warn -from drf_spectacular.extensions import OpenApiAuthenticationExtension, OpenApiSerializerExtension -from drf_spectacular.plumbing import build_bearer_security_scheme_object -from drf_spectacular.utils import inline_serializer - - -class TokenObtainPairSerializerExtension(OpenApiSerializerExtension): - target_class = 'rest_framework_simplejwt.serializers.TokenObtainPairSerializer' - - def map_serializer(self, auto_schema, direction): - Fixed = inline_serializer('Fixed', fields={ - self.target_class.username_field: serializers.CharField(write_only=True), - 'password': serializers.CharField(write_only=True), - 'access': serializers.CharField(read_only=True), - 'refresh': serializers.CharField(read_only=True), - }) - return auto_schema._map_serializer(Fixed, direction) - - -class TokenObtainSlidingSerializerExtension(OpenApiSerializerExtension): - target_class = 'rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer' - - def map_serializer(self, auto_schema, direction): - Fixed = inline_serializer('Fixed', fields={ - self.target_class.username_field: serializers.CharField(write_only=True), - 'password': serializers.CharField(write_only=True), - 'token': serializers.CharField(read_only=True), - }) - return auto_schema._map_serializer(Fixed, direction) - - -class TokenRefreshSerializerExtension(OpenApiSerializerExtension): - target_class = 'rest_framework_simplejwt.serializers.TokenRefreshSerializer' - - def map_serializer(self, auto_schema, direction): - from rest_framework_simplejwt.settings import api_settings - - if api_settings.ROTATE_REFRESH_TOKENS: - class Fixed(serializers.Serializer): - access = serializers.CharField(read_only=True) - refresh = serializers.CharField() - else: - class Fixed(serializers.Serializer): - access = serializers.CharField(read_only=True) - refresh = serializers.CharField(write_only=True) - - return auto_schema._map_serializer(Fixed, direction) - - -class TokenVerifySerializerExtension(OpenApiSerializerExtension): - target_class = 'rest_framework_simplejwt.serializers.TokenVerifySerializer' - - def map_serializer(self, auto_schema, direction): - Fixed = inline_serializer('Fixed', fields={ - 'token': serializers.CharField(write_only=True), - }) - return auto_schema._map_serializer(Fixed, direction) - - -class SimpleJWTScheme(OpenApiAuthenticationExtension): - target_class = 'rest_framework_simplejwt.authentication.JWTAuthentication' - name = 'jwtAuth' - - def get_security_definition(self, auto_schema): - from rest_framework_simplejwt.settings import api_settings - - if len(api_settings.AUTH_HEADER_TYPES) > 1: - warn( - f'OpenAPI3 can only have one "bearerFormat". JWT Settings specify ' - f'{api_settings.AUTH_HEADER_TYPES}. Using the first one.' - ) - - return build_bearer_security_scheme_object( - header_name=getattr(api_settings, 'AUTH_HEADER_NAME', 'HTTP_AUTHORIZATION'), - token_prefix=api_settings.AUTH_HEADER_TYPES[0], - bearer_format='JWT' - ) - - -class SimpleJWTTokenUserScheme(SimpleJWTScheme): - target_class = 'rest_framework_simplejwt.authentication.JWTTokenUserAuthentication' - - -class SimpleJWTStatelessUserScheme(SimpleJWTScheme): - target_class = "rest_framework_simplejwt.authentication.JWTStatelessUserAuthentication" diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_polymorphic.py b/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_polymorphic.py deleted file mode 100644 index fe0c64d..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/contrib/rest_polymorphic.py +++ /dev/null @@ -1,81 +0,0 @@ -from drf_spectacular.drainage import warn -from drf_spectacular.extensions import OpenApiSerializerExtension -from drf_spectacular.plumbing import ( - ComponentIdentity, ResolvedComponent, build_basic_type, build_object_type, - is_patched_serializer, -) -from drf_spectacular.settings import spectacular_settings -from drf_spectacular.types import OpenApiTypes - - -class PolymorphicSerializerExtension(OpenApiSerializerExtension): - target_class = 'rest_polymorphic.serializers.PolymorphicSerializer' - match_subclasses = True - - def map_serializer(self, auto_schema, direction): - sub_components = [] - serializer = self.target - - for sub_model in serializer.model_serializer_mapping: - sub_serializer = serializer._get_serializer_from_model_or_instance(sub_model) - sub_serializer.partial = serializer.partial - resource_type = serializer.to_resource_type(sub_model) - component = auto_schema.resolve_serializer(sub_serializer, direction) - if not component: - # rebuild a virtual schema-less component to model empty serializers - component = ResolvedComponent( - name=auto_schema._get_serializer_name(sub_serializer, direction), - type=ResolvedComponent.SCHEMA, - object=ComponentIdentity('virtual') - ) - typed_component = self.build_typed_component( - auto_schema=auto_schema, - component=component, - resource_type_field_name=serializer.resource_type_field_name, - patched=is_patched_serializer(sub_serializer, direction) - ) - sub_components.append((resource_type, typed_component.ref)) - - if not resource_type: - warn( - f'discriminator mapping key is empty for {sub_serializer.__class__}. ' - f'this might lead to code generation issues.' - ) - - one_of_list = [] - for _, ref in sub_components: - if ref not in one_of_list: - one_of_list.append(ref) - - return { - 'oneOf': one_of_list, - 'discriminator': { - 'propertyName': serializer.resource_type_field_name, - 'mapping': {resource_type: ref['$ref'] for resource_type, ref in sub_components}, - } - } - - def build_typed_component(self, auto_schema, component, resource_type_field_name, patched): - if spectacular_settings.COMPONENT_SPLIT_REQUEST and component.name.endswith('Request'): - typed_component_name = component.name[:-len('Request')] + 'TypedRequest' - else: - typed_component_name = f'{component.name}Typed' - - resource_type_schema = build_object_type( - properties={resource_type_field_name: build_basic_type(OpenApiTypes.STR)}, - required=None if patched else [resource_type_field_name] - ) - # if sub-serializer has an empty schema, only expose the resource_type field part - if component.schema: - schema = {'allOf': [resource_type_schema, component.ref]} - else: - schema = resource_type_schema - - component_typed = ResolvedComponent( - name=typed_component_name, - type=ResolvedComponent.SCHEMA, - object=component.object, - schema=schema, - ) - auto_schema.registry.register_on_missing(component_typed) - return component_typed diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/drainage.py b/.venv/lib/python3.10/site-packages/drf_spectacular/drainage.py deleted file mode 100644 index 7c44890..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/drainage.py +++ /dev/null @@ -1,220 +0,0 @@ -import contextlib -import functools -import inspect -import sys -from collections import defaultdict -from typing import Any, Callable, DefaultDict, List, Optional, Tuple, TypeVar - -if sys.version_info >= (3, 8): - from typing import ( # type: ignore[attr-defined] # noqa: F401 - Final, Literal, TypedDict, _TypedDictMeta, - ) -else: - from typing_extensions import Final, Literal, TypedDict, _TypedDictMeta # noqa: F401 - -if sys.version_info >= (3, 10): - from typing import TypeGuard # noqa: F401 -else: - from typing_extensions import TypeGuard # noqa: F401 - -F = TypeVar('F', bound=Callable[..., Any]) - - -class GeneratorStats: - _warn_cache: DefaultDict[str, int] = defaultdict(int) - _error_cache: DefaultDict[str, int] = defaultdict(int) - _traces: List[Tuple[Optional[str], Optional[str], str]] = [] - _trace_lineno = False - - _blue = '' - _red = '' - _yellow = '' - _clear = '' - - def __getattr__(self, name): - if 'silent' not in self.__dict__: - from drf_spectacular.settings import spectacular_settings - self.silent = spectacular_settings.DISABLE_ERRORS_AND_WARNINGS - try: - return self.__dict__[name] - except KeyError: - raise AttributeError(name) - - def __bool__(self): - return bool(self._warn_cache or self._error_cache) - - @contextlib.contextmanager - def silence(self): - self.silent, tmp = True, self.silent - try: - yield - finally: - self.silent = tmp - - def reset(self) -> None: - self._warn_cache.clear() - self._error_cache.clear() - - def enable_color(self) -> None: - self._blue = '\033[0;34m' - self._red = '\033[0;31m' - self._yellow = '\033[0;33m' - self._clear = '\033[0m' - - def enable_trace_lineno(self) -> None: - self._trace_lineno = True - - def _get_current_trace(self) -> Tuple[Optional[str], str]: - source_locations = [t for t in self._traces if t[0]] - if source_locations: - sourcefile, lineno, _ = source_locations[-1] - source_location = f'{sourcefile}:{lineno}' if lineno else sourcefile - else: - source_location = '' - breadcrumbs = ' > '.join(t[2] for t in self._traces) - return source_location, breadcrumbs - - def emit(self, msg: str, severity: str) -> None: - assert severity in ['warning', 'error'] - cache = self._warn_cache if severity == 'warning' else self._error_cache - - source_location, breadcrumbs = self._get_current_trace() - prefix = f'{self._blue}{source_location}: ' if source_location else '' - prefix += self._yellow if severity == 'warning' else self._red - prefix += f'{severity.capitalize()}' - prefix += f' [{breadcrumbs}]: ' if breadcrumbs else ': ' - - msg = prefix + self._clear + str(msg) - if not self.silent and msg not in cache: - print(msg, file=sys.stderr) - cache[msg] += 1 - - def emit_summary(self) -> None: - if not self.silent and (self._warn_cache or self._error_cache): - print( - f'\nSchema generation summary:\n' - f'Warnings: {sum(self._warn_cache.values())} ({len(self._warn_cache)} unique)\n' - f'Errors: {sum(self._error_cache.values())} ({len(self._error_cache)} unique)\n', - file=sys.stderr - ) - - -GENERATOR_STATS = GeneratorStats() - - -def warn(msg: str, delayed: Any = None) -> None: - if delayed: - warnings = get_override(delayed, 'warnings', []) - warnings.append(msg) - set_override(delayed, 'warnings', warnings) - else: - GENERATOR_STATS.emit(msg, 'warning') - - -def error(msg: str, delayed: Any = None) -> None: - if delayed: - errors = get_override(delayed, 'errors', []) - errors.append(msg) - set_override(delayed, 'errors', errors) - else: - GENERATOR_STATS.emit(msg, 'error') - - -def reset_generator_stats() -> None: - GENERATOR_STATS.reset() - - -@contextlib.contextmanager -def add_trace_message(obj): - """ - Adds a message to be used as a prefix when emitting warnings and errors. - """ - sourcefile, lineno = _get_source_location(obj) - GENERATOR_STATS._traces.append((sourcefile, lineno, obj.__name__)) - yield - GENERATOR_STATS._traces.pop() - - -@functools.lru_cache(maxsize=1000) -def _get_source_location(obj): - try: - sourcefile = inspect.getsourcefile(obj) - except: # noqa: E722 - sourcefile = None - try: - # This is a rather expensive operation. Only do it when explicitly enabled (CLI) - # and cache results to speed up some recurring objects like serializers. - lineno = inspect.getsourcelines(obj)[1] if GENERATOR_STATS._trace_lineno else None - except: # noqa: E722 - lineno = None - return sourcefile, lineno - - -def has_override(obj: Any, prop: str) -> bool: - if isinstance(obj, functools.partial): - obj = obj.func - if not hasattr(obj, '_spectacular_annotation'): - return False - if prop not in obj._spectacular_annotation: - return False - return True - - -def get_override(obj: Any, prop: str, default: Any = None) -> Any: - if isinstance(obj, functools.partial): - obj = obj.func - if not has_override(obj, prop): - return default - return obj._spectacular_annotation[prop] - - -def set_override(obj: Any, prop: str, value: Any) -> Any: - if not hasattr(obj, '_spectacular_annotation'): - obj._spectacular_annotation = {} - elif '_spectacular_annotation' not in obj.__dict__: - obj._spectacular_annotation = obj._spectacular_annotation.copy() - obj._spectacular_annotation[prop] = value - return obj - - -def get_view_method_names(view, schema=None) -> List[str]: - schema = schema or view.schema - return [ - item for item in dir(view) if callable(getattr(view, item, None)) and ( - item in view.http_method_names - or item in schema.method_mapping.values() - or item == 'list' - or hasattr(getattr(view, item, None), 'mapping') - ) - ] - - -def isolate_view_method(view, method_name): - """ - Prevent modifying a view method which is derived from other views. Changes to - a derived method would leak into the view where the method originated from. - Break derivation by wrapping the method and explicitly setting it on the view. - """ - method = getattr(view, method_name) - # no isolation is required if the view method is not derived. - # @api_view is a special case that also breaks isolation. It proxies all view - # methods through a single handler function, which then also requires isolation. - if method_name in view.__dict__ and method.__name__ != 'handler': - return method - - @functools.wraps(method) - def wrapped_method(self, request, *args, **kwargs): - return method(self, request, *args, **kwargs) - - # wraps() will only create a shallow copy of method.__dict__. Updates to "kwargs" - # via @extend_schema would leak to the original method. Isolate by creating a copy. - if hasattr(method, 'kwargs'): - wrapped_method.kwargs = method.kwargs.copy() - - setattr(view, method_name, wrapped_method) - return wrapped_method - - -def cache(user_function: F) -> F: - """ simple polyfill for python < 3.9 """ - return functools.lru_cache(maxsize=None)(user_function) # type: ignore diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/extensions.py b/.venv/lib/python3.10/site-packages/drf_spectacular/extensions.py deleted file mode 100644 index 1eae1c6..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/extensions.py +++ /dev/null @@ -1,143 +0,0 @@ -from abc import abstractmethod -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type, Union - -from drf_spectacular.plumbing import OpenApiGeneratorExtension -from drf_spectacular.utils import Direction - -if TYPE_CHECKING: - from rest_framework.views import APIView - - from drf_spectacular.openapi import AutoSchema - - -_SchemaType = Dict[str, Any] - - -class OpenApiAuthenticationExtension(OpenApiGeneratorExtension['OpenApiAuthenticationExtension']): - """ - Extension for specifying authentication schemes. - - The common use-case usually consists of setting a ``name`` string and returning a dict from - ``get_security_definition``. To model a group of headers that go together, set a list - of names and return a corresponding list of definitions from ``get_security_definition``. - - The view class is available via ``auto_schema.view``, while the original authentication class - can be accessed via ``self.target``. If you want to override an included extension, be sure to - set a higher matching priority by setting the class attribute ``priority = 1`` or higher. - - get_security_requirement is expected to return a dict with security object names as keys and a - scope list as value (usually just []). More than one key in the dict means that each entry is - required (AND). If you need alternate variations (OR), return a list of those dicts instead. - - ``get_security_definition()`` is expected to return a valid `OpenAPI security scheme object - `_ - """ - _registry: List[Type['OpenApiAuthenticationExtension']] = [] - - name: Union[str, List[str]] - - def get_security_requirement( - self, auto_schema: 'AutoSchema' - ) -> Union[Dict[str, List[Any]], List[Dict[str, List[Any]]]]: - assert self.name, 'name(s) must be specified' - if isinstance(self.name, str): - return {self.name: []} - else: - return {name: [] for name in self.name} - - @abstractmethod - def get_security_definition(self, auto_schema: 'AutoSchema') -> Union[_SchemaType, List[_SchemaType]]: - pass # pragma: no cover - - -class OpenApiSerializerExtension(OpenApiGeneratorExtension['OpenApiSerializerExtension']): - """ - Extension for replacing an insufficient or specifying an unknown Serializer schema. - - The existing implementation of ``map_serializer()`` will generate the same result - as *drf-spectacular* would. Either augment or replace the generated schema. The - view instance is available via ``auto_schema.view``, while the original serializer - can be accessed via ``self.target``. - - ``map_serializer()`` is expected to return a valid `OpenAPI schema object - `_. - """ - _registry: List[Type['OpenApiSerializerExtension']] = [] - - def get_name(self, auto_schema: 'AutoSchema', direction: Direction) -> Optional[str]: - """ return str for overriding default name extraction """ - return None - - def get_identity(self, auto_schema: 'AutoSchema', direction: Direction) -> Any: - """ return anything to compare instances of target. Target will be used by default. """ - return None - - def map_serializer(self, auto_schema: 'AutoSchema', direction: Direction) -> _SchemaType: - """ override for customized serializer mapping """ - return auto_schema._map_serializer(self.target_class, direction, bypass_extensions=True) - - -class OpenApiSerializerFieldExtension(OpenApiGeneratorExtension['OpenApiSerializerFieldExtension']): - """ - Extension for replacing an insufficient or specifying an unknown SerializerField schema. - - To augment the default schema, you can get what *drf-spectacular* would generate with - ``auto_schema._map_serializer_field(self.target, direction, bypass_extensions=True)``. - and edit the returned schema at your discretion. Beware that this may still emit - warnings, in which case manual construction is advisable. - - ``map_serializer_field()`` is expected to return a valid `OpenAPI schema object - `_. - """ - _registry: List[Type['OpenApiSerializerFieldExtension']] = [] - - def get_name(self) -> Optional[str]: - """ return str for breaking out field schema into separate named component """ - return None - - @abstractmethod - def map_serializer_field(self, auto_schema: 'AutoSchema', direction: Direction) -> _SchemaType: - """ override for customized serializer field mapping """ - pass # pragma: no cover - - -class OpenApiViewExtension(OpenApiGeneratorExtension['OpenApiViewExtension']): - """ - Extension for replacing discovered views with a more schema-appropriate/annotated version. - - ``view_replacement()`` is expected to return a subclass of ``APIView`` (which includes - ``ViewSet`` et al.). The discovered original view instance can be accessed with - ``self.target`` and be subclassed if desired. - """ - _registry: List[Type['OpenApiViewExtension']] = [] - - @classmethod - def _load_class(cls): - super()._load_class() - # special case @api_view: view class is nested in the cls attr of the function object - if hasattr(cls.target_class, 'cls'): - cls.target_class = cls.target_class.cls - - @abstractmethod - def view_replacement(self) -> 'Type[APIView]': - pass # pragma: no cover - - -class OpenApiFilterExtension(OpenApiGeneratorExtension['OpenApiFilterExtension']): - """ - Extension for specifying a list of filter parameters for a given ``FilterBackend``. - - The original filter class object can be accessed via ``self.target``. The attached view - is accessible via ``auto_schema.view``. - - ``get_schema_operation_parameters()`` is expected to return either an empty list or a list - of valid raw `OpenAPI parameter objects - `_. - Using ``drf_spectacular.plumbing.build_parameter_type`` is recommended to generate - the appropriate raw dict objects. - """ - _registry: List[Type['OpenApiFilterExtension']] = [] - - @abstractmethod - def get_schema_operation_parameters(self, auto_schema: 'AutoSchema', *args, **kwargs) -> List[_SchemaType]: - pass # pragma: no cover diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/generators.py b/.venv/lib/python3.10/site-packages/drf_spectacular/generators.py deleted file mode 100644 index 15f7ba9..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/generators.py +++ /dev/null @@ -1,293 +0,0 @@ -import os -import re - -from django.urls import URLPattern, URLResolver -from rest_framework import views, viewsets -from rest_framework.schemas.generators import BaseSchemaGenerator -from rest_framework.schemas.generators import EndpointEnumerator as BaseEndpointEnumerator -from rest_framework.settings import api_settings - -from drf_spectacular.drainage import ( - add_trace_message, error, get_override, reset_generator_stats, warn, -) -from drf_spectacular.extensions import OpenApiViewExtension -from drf_spectacular.openapi import AutoSchema -from drf_spectacular.plumbing import ( - ComponentRegistry, alpha_operation_sorter, build_root_object, camelize_operation, get_class, - is_versioning_supported, modify_for_versioning, normalize_result_object, - operation_matches_version, process_webhooks, sanitize_result_object, -) -from drf_spectacular.settings import spectacular_settings - - -class EndpointEnumerator(BaseEndpointEnumerator): - def get_api_endpoints(self, patterns=None, prefix=''): - api_endpoints = self._get_api_endpoints(patterns, prefix) - - for hook in spectacular_settings.PREPROCESSING_HOOKS: - api_endpoints = hook(endpoints=api_endpoints) - - api_endpoints_deduplicated = {} - for path, path_regex, method, callback in api_endpoints: - if (path, method) not in api_endpoints_deduplicated: - api_endpoints_deduplicated[path, method] = (path, path_regex, method, callback) - - api_endpoints = list(api_endpoints_deduplicated.values()) - - if callable(spectacular_settings.SORT_OPERATIONS): - return sorted(api_endpoints, key=spectacular_settings.SORT_OPERATIONS) - elif spectacular_settings.SORT_OPERATIONS: - return sorted(api_endpoints, key=alpha_operation_sorter) - else: - return api_endpoints - - def get_path_from_regex(self, path_regex): - path = super().get_path_from_regex(path_regex) - # bugfix oversight in DRF regex stripping - path = path.replace('\\.', '.') - return path - - def _get_api_endpoints(self, patterns, prefix): - """ - Return a list of all available API endpoints by inspecting the URL conf. - Only modification the DRF version is passing through the path_regex. - """ - if patterns is None: - patterns = self.patterns - - api_endpoints = [] - - for pattern in patterns: - path_regex = prefix + str(pattern.pattern) - if isinstance(pattern, URLPattern): - path = self.get_path_from_regex(path_regex) - callback = pattern.callback - if self.should_include_endpoint(path, callback): - for method in self.get_allowed_methods(callback): - endpoint = (path, path_regex, method, callback) - api_endpoints.append(endpoint) - - elif isinstance(pattern, URLResolver): - nested_endpoints = self._get_api_endpoints( - patterns=pattern.url_patterns, - prefix=path_regex - ) - api_endpoints.extend(nested_endpoints) - - return api_endpoints - - def get_allowed_methods(self, callback): - if hasattr(callback, 'actions'): - actions = set(callback.actions) - if 'http_method_names' in callback.initkwargs: - http_method_names = set(callback.initkwargs['http_method_names']) - else: - http_method_names = set(callback.cls.http_method_names) - - methods = [method.upper() for method in actions & http_method_names] - else: - # pass to constructor allowed method names to get valid ones - kwargs = {} - if 'http_method_names' in callback.initkwargs: - kwargs['http_method_names'] = callback.initkwargs['http_method_names'] - - methods = callback.cls(**kwargs).allowed_methods - - return [ - method for method in methods - if method not in ('OPTIONS', 'HEAD', 'TRACE', 'CONNECT') - ] - - -class SchemaGenerator(BaseSchemaGenerator): - endpoint_inspector_cls = EndpointEnumerator - - def __init__(self, *args, **kwargs): - self.registry = ComponentRegistry() - self.api_version = kwargs.pop('api_version', None) - self.inspector = None - super().__init__(*args, **kwargs) - - def coerce_path(self, path, method, view): - """ - Customized coerce_path which also considers the `_pk` suffix in URL paths - of nested routers. - """ - path = super().coerce_path(path, method, view) # take care of {pk} - if spectacular_settings.SCHEMA_COERCE_PATH_PK_SUFFIX: - path = re.sub(pattern=r'{(\w+)_pk}', repl=r'{\1_id}', string=path) - return path - - def create_view(self, callback, method, request=None): - """ - customized create_view which is called when all routes are traversed. part of this - is instantiating views with default params. in case of custom routes (@action) the - custom AutoSchema is injected properly through 'initkwargs' on view. However, when - decorating plain views like retrieve, this initialization logic is not running. - Therefore forcefully set the schema if @extend_schema decorator was used. - """ - override_view = OpenApiViewExtension.get_match(callback.cls) - if override_view: - original_cls = callback.cls - callback.cls = override_view.view_replacement() - - # we refrain from passing request and deal with it ourselves in parse() - view = super().create_view(callback, method, None) - - # drf-yasg compatibility feature. makes the view aware that we are running - # schema generation and not a real request. - view.swagger_fake_view = True - - # callback.cls is hosted in urlpatterns and is therefore not an ephemeral modification. - # restore after view creation so potential revisits have a clean state as basis. - if override_view: - callback.cls = original_cls - - if isinstance(view, viewsets.ViewSetMixin): - action = getattr(view, view.action) - elif isinstance(view, views.APIView): - action = getattr(view, method.lower()) - else: - error( - 'Using not supported View class. Class must be derived from APIView ' - 'or any of its subclasses like GenericApiView, GenericViewSet.' - ) - return view - - action_schema = getattr(action, 'kwargs', {}).get('schema', None) - if not action_schema: - # there is no method/action customized schema so we are done here. - return view - - # action_schema is either a class or instance. when @extend_schema is used, it - # is always a class to prevent the weakref reverse "schema.view" bug for multi - # annotations. The bug is prevented by delaying the instantiation of the schema - # class until create_view (here) and not doing it immediately in @extend_schema. - action_schema_class = get_class(action_schema) - view_schema_class = get_class(callback.cls.schema) - - if not issubclass(action_schema_class, view_schema_class): - # this handles the case of having a manually set custom AutoSchema on the - # view together with extend_schema. In most cases, the decorator mechanics - # prevent extend_schema from having access to the view's schema class. So - # extend_schema is forced to use DEFAULT_SCHEMA_CLASS as fallback base class - # instead of the correct base class set in view. We remedy this chicken-egg - # problem here by rearranging the class hierarchy. - mro = tuple( - cls for cls in action_schema_class.__mro__ - if cls not in api_settings.DEFAULT_SCHEMA_CLASS.__mro__ - ) + view_schema_class.__mro__ - action_schema_class = type('ExtendedRearrangedSchema', mro, {}) - - view.schema = action_schema_class() - return view - - def _initialise_endpoints(self): - if self.endpoints is None: - self.inspector = self.endpoint_inspector_cls(self.patterns, self.urlconf) - self.endpoints = self.inspector.get_api_endpoints() - - def _get_paths_and_endpoints(self): - """ - Generate (path, method, view) given (path, method, callback) for paths. - """ - view_endpoints = [] - for path, path_regex, method, callback in self.endpoints: - view = self.create_view(callback, method) - path = self.coerce_path(path, method, view) - view_endpoints.append((path, path_regex, method, view)) - - return view_endpoints - - def parse(self, input_request, public): - """ Iterate endpoints generating per method path operations. """ - result = {} - self._initialise_endpoints() - endpoints = self._get_paths_and_endpoints() - - if spectacular_settings.SCHEMA_PATH_PREFIX is None: - # estimate common path prefix if none was given. only use it if we encountered more - # than one view to prevent emission of erroneous and unnecessary fallback names. - non_trivial_prefix = len(set([view.__class__ for _, _, _, view in endpoints])) > 1 - if non_trivial_prefix: - path_prefix = os.path.commonpath([path for path, _, _, _ in endpoints]) - path_prefix = re.escape(path_prefix) # guard for RE special chars in path - else: - path_prefix = '/' - else: - path_prefix = spectacular_settings.SCHEMA_PATH_PREFIX - if not path_prefix.startswith('^'): - path_prefix = '^' + path_prefix # make sure regex only matches from the start - - for path, path_regex, method, view in endpoints: - # emit queued up warnings/error that happened prior to generation (decoration) - for w in get_override(view, 'warnings', []): - warn(w) - for e in get_override(view, 'errors', []): - error(e) - - view.request = spectacular_settings.GET_MOCK_REQUEST(method, path, view, input_request) - - if not (public or self.has_view_permissions(path, method, view)): - continue - - if view.versioning_class and not is_versioning_supported(view.versioning_class): - warn( - f'using unsupported versioning class "{view.versioning_class}". view will be ' - f'processed as unversioned view.' - ) - elif view.versioning_class: - version = ( - self.api_version # explicit version from CLI, SpecView or SpecView request - or view.versioning_class.default_version # fallback - ) - if not version: - continue - path = modify_for_versioning(self.inspector.patterns, method, path, view, version) - if not operation_matches_version(view, version): - continue - - assert isinstance(view.schema, AutoSchema), ( - f'Incompatible AutoSchema used on View {view.__class__}. Is DRF\'s ' - f'DEFAULT_SCHEMA_CLASS pointing to "drf_spectacular.openapi.AutoSchema" ' - f'or any other drf-spectacular compatible AutoSchema?' - ) - with add_trace_message(getattr(view, '__class__', view)): - operation = view.schema.get_operation( - path, path_regex, path_prefix, method, self.registry - ) - - # operation was manually removed via @extend_schema - if not operation: - continue - - if spectacular_settings.SCHEMA_PATH_PREFIX_TRIM: - path = re.sub(pattern=path_prefix, repl='', string=path, flags=re.IGNORECASE) - - if spectacular_settings.SCHEMA_PATH_PREFIX_INSERT: - path = spectacular_settings.SCHEMA_PATH_PREFIX_INSERT + path - - if not path.startswith('/'): - path = '/' + path - - if spectacular_settings.CAMELIZE_NAMES: - path, operation = camelize_operation(path, operation) - - result.setdefault(path, {}) - result[path][method.lower()] = operation - - return result - - def get_schema(self, request=None, public=False): - """ Generate a OpenAPI schema. """ - reset_generator_stats() - result = build_root_object( - paths=self.parse(request, public), - components=self.registry.build(spectacular_settings.APPEND_COMPONENTS), - webhooks=process_webhooks(spectacular_settings.WEBHOOKS, self.registry), - version=self.api_version or getattr(request, 'version', None), - ) - for hook in spectacular_settings.POSTPROCESSING_HOOKS: - result = hook(result=result, generator=self, request=request, public=public) - - return sanitize_result_object(normalize_result_object(result)) diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/helpers.py b/.venv/lib/python3.10/site-packages/drf_spectacular/helpers.py deleted file mode 100644 index 2d60ea0..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/helpers.py +++ /dev/null @@ -1,42 +0,0 @@ -from django.utils.module_loading import import_string - - -def lazy_serializer(path: str): - """ simulate initiated object but actually load class and init on first usage """ - - class LazySerializer: - def __init__(self, *args, **kwargs): - self.lazy_args, self.lazy_kwargs, self.lazy_obj = args, kwargs, None - - def __getattr__(self, item): - if not self.lazy_obj: - self.lazy_obj = import_string(path)(*self.lazy_args, **self.lazy_kwargs) - return getattr(self.lazy_obj, item) - - @property # type: ignore - def __class__(self): - return self.__getattr__('__class__') - - @property - def __dict__(self): - return self.__getattr__('__dict__') - - def __str__(self): - return self.__getattr__('__str__')() - - def __repr__(self): - return self.__getattr__('__repr__')() - - return LazySerializer - - -def forced_singular_serializer(serializer_class): - from drf_spectacular.drainage import set_override - from drf_spectacular.utils import extend_schema_serializer - - patched_serializer_class = type(serializer_class.__name__, (serializer_class,), {}) - - extend_schema_serializer(many=False)(patched_serializer_class) - set_override(patched_serializer_class, 'suppress_collision_warning', True) - - return patched_serializer_class diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/hooks.py b/.venv/lib/python3.10/site-packages/drf_spectacular/hooks.py deleted file mode 100644 index c4d2f8a..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/hooks.py +++ /dev/null @@ -1,210 +0,0 @@ -import re -from collections import defaultdict - -from inflection import camelize -from rest_framework.settings import api_settings - -from drf_spectacular.drainage import warn -from drf_spectacular.plumbing import ( - ResolvedComponent, list_hash, load_enum_name_overrides, safe_ref, -) -from drf_spectacular.settings import spectacular_settings - - -def postprocess_schema_enums(result, generator, **kwargs): - """ - simple replacement of Enum/Choices that globally share the same name and have - the same choices. Aids client generation to not generate a separate enum for - every occurrence. only takes effect when replacement is guaranteed to be correct. - """ - - def iter_prop_containers(schema, component_name=None): - if not component_name: - for component_name, schema in schema.items(): - if spectacular_settings.COMPONENT_SPLIT_PATCH: - component_name = re.sub('^Patched(.+)', r'\1', component_name) - if spectacular_settings.COMPONENT_SPLIT_REQUEST: - component_name = re.sub('(.+)Request$', r'\1', component_name) - yield from iter_prop_containers(schema, component_name) - elif isinstance(schema, list): - for item in schema: - yield from iter_prop_containers(item, component_name) - elif isinstance(schema, dict): - if schema.get('properties'): - yield component_name, schema['properties'] - yield from iter_prop_containers(schema.get('oneOf', []), component_name) - yield from iter_prop_containers(schema.get('allOf', []), component_name) - yield from iter_prop_containers(schema.get('anyOf', []), component_name) - - def create_enum_component(name, schema): - component = ResolvedComponent( - name=name, - type=ResolvedComponent.SCHEMA, - schema=schema, - object=name, - ) - generator.registry.register_on_missing(component) - return component - - def extract_hash(schema): - if 'x-spec-enum-id' in schema: - # try to use the injected enum hash first as it generated from (name, value) tuples, - # which prevents collisions on choice sets only differing in labels not values. - return schema['x-spec-enum-id'] - else: - # fall back to actual list hashing when we encounter enums not generated by us. - # remove blank/null entry for hashing. will be reconstructed in the last step - return list_hash([(i, i) for i in schema['enum'] if i not in ('', None)]) - - schemas = result.get('components', {}).get('schemas', {}) - - overrides = load_enum_name_overrides() - - prop_hash_mapping = defaultdict(set) - hash_name_mapping = defaultdict(set) - # collect all enums, their names and choice sets - for component_name, props in iter_prop_containers(schemas): - for prop_name, prop_schema in props.items(): - if prop_schema.get('type') == 'array': - prop_schema = prop_schema.get('items', {}) - if 'enum' not in prop_schema: - continue - - prop_enum_cleaned_hash = extract_hash(prop_schema) - prop_hash_mapping[prop_name].add(prop_enum_cleaned_hash) - hash_name_mapping[prop_enum_cleaned_hash].add((component_name, prop_name)) - - # get the suffix to be used for enums from settings - enum_suffix = spectacular_settings.ENUM_SUFFIX - - # traverse all enum properties and generate a name for the choice set. naming collisions - # are resolved and a warning is emitted. giving a choice set multiple names is technically - # correct but potentially unwanted. also emit a warning there to make the user aware. - enum_name_mapping = {} - for prop_name, prop_hash_set in prop_hash_mapping.items(): - for prop_hash in prop_hash_set: - if prop_hash in overrides: - enum_name = overrides[prop_hash] - elif len(prop_hash_set) == 1: - # prop_name has been used exclusively for one choice set (best case) - enum_name = f'{camelize(prop_name)}{enum_suffix}' - elif len(hash_name_mapping[prop_hash]) == 1: - # prop_name has multiple choice sets, but each one limited to one component only - component_name, _ = next(iter(hash_name_mapping[prop_hash])) - enum_name = f'{camelize(component_name)}{camelize(prop_name)}{enum_suffix}' - else: - enum_name = f'{camelize(prop_name)}{prop_hash[:3].capitalize()}{enum_suffix}' - warn( - f'enum naming encountered a non-optimally resolvable collision for fields ' - f'named "{prop_name}". The same name has been used for multiple choice sets ' - f'in multiple components. The collision was resolved with "{enum_name}". ' - f'add an entry to ENUM_NAME_OVERRIDES to fix the naming.' - ) - if enum_name_mapping.get(prop_hash, enum_name) != enum_name: - warn( - f'encountered multiple names for the same choice set ({enum_name}). This ' - f'may be unwanted even though the generated schema is technically correct. ' - f'Add an entry to ENUM_NAME_OVERRIDES to fix the naming.' - ) - del enum_name_mapping[prop_hash] - else: - enum_name_mapping[prop_hash] = enum_name - enum_name_mapping[(prop_hash, prop_name)] = enum_name - - # replace all enum occurrences with a enum schema component. cut out the - # enum, replace it with a reference and add a corresponding component. - for _, props in iter_prop_containers(schemas): - for prop_name, prop_schema in props.items(): - is_array = prop_schema.get('type') == 'array' - if is_array: - prop_schema = prop_schema.get('items', {}) - - if 'enum' not in prop_schema: - continue - - prop_enum_original_list = prop_schema['enum'] - prop_schema['enum'] = [i for i in prop_schema['enum'] if i not in ['', None]] - prop_hash = extract_hash(prop_schema) - # when choice sets are reused under multiple names, the generated name cannot be - # resolved from the hash alone. fall back to prop_name and hash for resolution. - enum_name = enum_name_mapping.get(prop_hash) or enum_name_mapping[prop_hash, prop_name] - - # split property into remaining property and enum component parts - enum_schema = {k: v for k, v in prop_schema.items() if k in ['type', 'enum']} - prop_schema = {k: v for k, v in prop_schema.items() if k not in ['type', 'enum', 'x-spec-enum-id']} - - # separate actual description from name-value tuples - if spectacular_settings.ENUM_GENERATE_CHOICE_DESCRIPTION: - if prop_schema.get('description', '').startswith('*'): - enum_schema['description'] = prop_schema.pop('description') - elif '\n\n*' in prop_schema.get('description', ''): - _, _, post = prop_schema['description'].partition('\n\n*') - enum_schema['description'] = '*' + post - - components = [ - create_enum_component(enum_name, schema=enum_schema) - ] - if spectacular_settings.ENUM_ADD_EXPLICIT_BLANK_NULL_CHOICE: - if '' in prop_enum_original_list: - components.append(create_enum_component(f'Blank{enum_suffix}', schema={'enum': ['']})) - if None in prop_enum_original_list: - if spectacular_settings.OAS_VERSION.startswith('3.1'): - components.append(create_enum_component(f'Null{enum_suffix}', schema={'type': 'null'})) - else: - components.append(create_enum_component(f'Null{enum_suffix}', schema={'enum': [None]})) - - # undo OAS 3.1 type list NULL construction as we cover this in a separate component already - if spectacular_settings.OAS_VERSION.startswith('3.1') and isinstance(enum_schema['type'], list): - enum_schema['type'] = [t for t in enum_schema['type'] if t != 'null'][0] - - if len(components) == 1: - prop_schema.update(components[0].ref) - else: - prop_schema.update({'oneOf': [c.ref for c in components]}) - - if is_array: - props[prop_name]['items'] = safe_ref(prop_schema) - else: - props[prop_name] = safe_ref(prop_schema) - - # sort again with additional components - result['components'] = generator.registry.build(spectacular_settings.APPEND_COMPONENTS) - - # remove remaining ids that were not part of this hook (operation parameters mainly) - postprocess_schema_enum_id_removal(result, generator) - - return result - - -def postprocess_schema_enum_id_removal(result, generator, **kwargs): - """ - Iterative modifying approach to scanning the whole schema and removing the - temporary helper ids that allowed us to distinguish similar enums. - """ - def clean(sub_result): - if isinstance(sub_result, dict): - for key in list(sub_result): - if key == 'x-spec-enum-id': - del sub_result['x-spec-enum-id'] - else: - clean(sub_result[key]) - elif isinstance(sub_result, (list, tuple)): - for item in sub_result: - clean(item) - - clean(result) - - return result - - -def preprocess_exclude_path_format(endpoints, **kwargs): - """ - preprocessing hook that filters out {format} suffixed paths, in case - format_suffix_patterns is used and {format} path params are unwanted. - """ - format_path = f'{{{api_settings.FORMAT_SUFFIX_KWARG}}}' - return [ - (path, path_regex, method, callback) - for path, path_regex, method, callback in endpoints - if not (path.endswith(format_path) or path.endswith(format_path + '/')) - ] diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/management/__init__.py b/.venv/lib/python3.10/site-packages/drf_spectacular/management/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/management/commands/__init__.py b/.venv/lib/python3.10/site-packages/drf_spectacular/management/commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/management/commands/spectacular.py b/.venv/lib/python3.10/site-packages/drf_spectacular/management/commands/spectacular.py deleted file mode 100644 index d3fd067..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/management/commands/spectacular.py +++ /dev/null @@ -1,98 +0,0 @@ -from textwrap import dedent - -from django.core.management.base import BaseCommand, CommandError -from django.utils import translation -from django.utils.module_loading import import_string - -from drf_spectacular.drainage import GENERATOR_STATS -from drf_spectacular.renderers import OpenApiJsonRenderer, OpenApiYamlRenderer -from drf_spectacular.settings import patched_settings, spectacular_settings -from drf_spectacular.validation import validate_schema - - -class SchemaGenerationError(CommandError): - pass - - -class SchemaValidationError(CommandError): - pass - - -class Command(BaseCommand): - help = dedent(""" - Generate a spectacular OpenAPI3-compliant schema for your API. - - The warnings serve as a indicator for where your API could not be properly - resolved. @extend_schema and @extend_schema_field are your friends. - The spec should be valid in any case. If not, please open an issue - on github: https://github.com/tfranzel/drf-spectacular/issues - - Remember to configure your APIs meta data like servers, version, url, - documentation and so on in your SPECTACULAR_SETTINGS." - """) - - def add_arguments(self, parser): - parser.add_argument('--format', dest="format", choices=['openapi', 'openapi-json'], default='openapi', type=str) - parser.add_argument('--urlconf', dest="urlconf", default=None, type=str) - parser.add_argument('--generator-class', dest="generator_class", default=None, type=str) - parser.add_argument('--file', dest="file", default=None, type=str) - parser.add_argument('--fail-on-warn', dest="fail_on_warn", default=False, action='store_true') - parser.add_argument('--validate', dest="validate", default=False, action='store_true') - parser.add_argument('--api-version', dest="api_version", default=None, type=str) - parser.add_argument('--lang', dest="lang", default=None, type=str) - parser.add_argument('--color', dest="color", default=False, action='store_true') - parser.add_argument('--custom-settings', dest="custom_settings", default=None, type=str) - - def handle(self, *args, **options): - if options['generator_class']: - generator_class = import_string(options['generator_class']) - else: - generator_class = spectacular_settings.DEFAULT_GENERATOR_CLASS - - GENERATOR_STATS.enable_trace_lineno() - - if options['color']: - GENERATOR_STATS.enable_color() - - generator = generator_class( - urlconf=options['urlconf'], - api_version=options['api_version'], - ) - - if options['custom_settings']: - custom_settings = import_string(options['custom_settings']) - else: - custom_settings = None - - with patched_settings(custom_settings): - if options['lang']: - with translation.override(options['lang']): - schema = generator.get_schema(request=None, public=True) - else: - schema = generator.get_schema(request=None, public=True) - - GENERATOR_STATS.emit_summary() - - if options['fail_on_warn'] and GENERATOR_STATS: - raise SchemaGenerationError('Failing as requested due to warnings') - if options['validate']: - try: - validate_schema(schema) - except Exception as e: - raise SchemaValidationError(e) - - renderer = self.get_renderer(options['format']) - output = renderer.render(schema, renderer_context={}) - - if options['file']: - with open(options['file'], 'wb') as f: - f.write(output) - else: - self.stdout.write(output.decode()) - - def get_renderer(self, format): - renderer_cls = { - 'openapi': OpenApiYamlRenderer, - 'openapi-json': OpenApiJsonRenderer, - }[format] - return renderer_cls() diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/openapi.py b/.venv/lib/python3.10/site-packages/drf_spectacular/openapi.py deleted file mode 100644 index 534a529..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/openapi.py +++ /dev/null @@ -1,1664 +0,0 @@ -import copy -import functools -import itertools -import re -from collections import defaultdict -from typing import Any, Dict, List, Optional, Union - -import uritemplate -from django.core import exceptions as django_exceptions -from django.core import validators -from django.db import models -from django.utils.translation import gettext_lazy as _ -from rest_framework import permissions, renderers, serializers -from rest_framework.fields import _UnvalidatedField, empty -from rest_framework.generics import CreateAPIView, GenericAPIView, ListCreateAPIView -from rest_framework.mixins import ListModelMixin -from rest_framework.schemas.inspectors import ViewInspector -from rest_framework.schemas.utils import get_pk_description -from rest_framework.settings import api_settings -from rest_framework.utils.model_meta import get_field_info -from rest_framework.views import APIView - -import drf_spectacular.authentication # noqa: F403, F401 -import drf_spectacular.serializers # noqa: F403, F401 -from drf_spectacular.contrib import * # noqa: F403, F401 -from drf_spectacular.drainage import add_trace_message, error, get_override, has_override, warn -from drf_spectacular.extensions import ( - OpenApiAuthenticationExtension, OpenApiFilterExtension, OpenApiSerializerExtension, - OpenApiSerializerFieldExtension, -) -from drf_spectacular.plumbing import ( - ComponentRegistry, ResolvedComponent, UnableToProceedError, append_meta, - assert_basic_serializer, build_array_type, build_basic_type, build_choice_field, - build_examples_list, build_generic_type, build_listed_example_value, build_media_type_object, - build_mocked_view, build_object_type, build_parameter_type, build_serializer_context, - filter_supported_arguments, follow_field_source, follow_model_field_lookup, force_instance, - get_doc, get_list_serializer, get_manager, get_type_hints, get_view_model, is_basic_serializer, - is_basic_type, is_field, is_higher_order_type_hint, is_list_serializer, - is_list_serializer_customized, is_patched_serializer, is_serializer, - is_trivial_string_variation, modify_media_types_for_versioning, resolve_django_path_parameter, - resolve_regex_path_parameter, resolve_type_hint, safe_ref, sanitize_specification_extensions, - whitelisted, -) -from drf_spectacular.settings import spectacular_settings -from drf_spectacular.types import OpenApiTypes -from drf_spectacular.utils import ( - Direction, OpenApiCallback, OpenApiExample, OpenApiParameter, OpenApiRequest, OpenApiResponse, - _SchemaType, _SerializerType, -) - - -class AutoSchema(ViewInspector): - method_mapping = { - 'get': 'retrieve', - 'post': 'create', - 'put': 'update', - 'patch': 'partial_update', - 'delete': 'destroy', - } - - def get_operation( - self, - path: str, - path_regex: str, - path_prefix: str, - method: str, - registry: ComponentRegistry - ) -> Optional[_SchemaType]: - self.registry = registry - self.path = path - self.path_regex = path_regex - self.path_prefix = path_prefix - self.method = method.upper() - - if self.is_excluded(): - return None - - operation: _SchemaType = {'operationId': self.get_operation_id()} - - description = self.get_description() - if description: - operation['description'] = description - - summary = self.get_summary() - if summary: - operation['summary'] = summary - - external_docs = self._get_external_docs() - if external_docs: - operation['externalDocs'] = external_docs - - parameters = self._get_parameters() - if parameters: - operation['parameters'] = parameters - - tags = self.get_tags() - if tags: - operation['tags'] = tags - - request_body = self._get_request_body() - if request_body: - operation['requestBody'] = request_body - - auth = self.get_auth() - if auth: - operation['security'] = auth - - deprecated = self.is_deprecated() - if deprecated: - operation['deprecated'] = deprecated - - operation['responses'] = self._get_response_bodies() - - extensions = self.get_extensions() - if extensions: - operation.update(sanitize_specification_extensions(extensions)) - - callbacks = self._get_callbacks() - if callbacks: - operation['callbacks'] = callbacks - - return operation - - def is_excluded(self) -> bool: - """ override this for custom behaviour """ - return False - - def _is_list_view(self, serializer: Optional[_SerializerType] = None) -> bool: - """ - partially heuristic approach to determine if a view yields an object or a - list of objects. used for operationId naming, array building and pagination. - defaults to False if all introspection fail. - """ - if serializer is None: - serializer = self.get_response_serializers() - - if isinstance(serializer, dict) and serializer: - # extract likely main serializer from @extend_schema override - serializer = {str(code): s for code, s in serializer.items()} - serializer = serializer[min(serializer)] - - if is_list_serializer(serializer): - return True - if is_basic_type(serializer): - return False - if hasattr(self.view, 'action'): - return self.view.action == 'list' - # list responses are "usually" only returned by GET - if self.method != 'GET': - return False - if isinstance(self.view, ListModelMixin): - return True - # primary key/lookup variable in path is a strong indicator for retrieve - if isinstance(self.view, GenericAPIView): - lookup_url_kwarg = self.view.lookup_url_kwarg or self.view.lookup_field - if lookup_url_kwarg in uritemplate.variables(self.path): - return False - - return False - - def _is_create_operation(self) -> bool: - if self.method != 'POST': - return False - if getattr(self.view, 'action', None) == 'create': - return True - if isinstance(self.view, (ListCreateAPIView, CreateAPIView)): - return True - return False - - def get_override_parameters(self) -> List[Union[OpenApiParameter, _SerializerType]]: - """ override this for custom behaviour """ - return [] - - def _process_override_parameters(self, direction='request'): - result = {} - for parameter in self.get_override_parameters(): - if isinstance(parameter, OpenApiParameter): - if parameter.response: - continue - - if is_basic_type(parameter.type): - schema = build_basic_type(parameter.type) - elif is_basic_serializer(parameter.type): - schema = self.resolve_serializer(parameter.type, direction).ref - elif isinstance(parameter.type, dict): - schema = parameter.type - else: - warn(f'unsupported type for parameter "{parameter.name}". Skipping.') - continue - - if parameter.many: - if is_basic_type(parameter.type): - schema = build_array_type(schema) - else: - warn( - f'parameter "{parameter.name}" has many=True and is not a basic type. ' - f'many=True only makes sense for basic types. Ignoring.' - ) - - if parameter.exclude: - result[parameter.name, parameter.location] = None - else: - result[parameter.name, parameter.location] = build_parameter_type( - name=parameter.name, - schema=schema, - location=parameter.location, - required=parameter.required, - description=parameter.description, - enum=parameter.enum, - pattern=parameter.pattern, - deprecated=parameter.deprecated, - style=parameter.style, - explode=parameter.explode, - default=parameter.default, - allow_blank=parameter.allow_blank, - examples=build_examples_list(parameter.examples), - extensions=parameter.extensions, - ) - elif is_basic_serializer(parameter): - # explode serializer into separate parameters. defaults to QUERY location - parameter = force_instance(parameter) - mapped = self._map_serializer(parameter, 'request') - for property_name, property_schema in mapped['properties'].items(): - try: - # be graceful when serializer might be non-DRF (via extension). - field = parameter.fields.get(property_name) - except Exception: - field = None - result[property_name, OpenApiParameter.QUERY] = build_parameter_type( - name=property_name, - schema=property_schema, - description=property_schema.pop('description', None), - location=OpenApiParameter.QUERY, - allow_blank=getattr(field, 'allow_blank', True), - required=bool(property_name in mapped.get('required', [])), - ) - else: - warn(f'could not resolve parameter annotation {parameter}. Skipping.') - return result - - def _get_format_parameters(self) -> List[_SchemaType]: - parameters = [] - formats = self.map_renderers('format') - if api_settings.URL_FORMAT_OVERRIDE and len(formats) > 1: - parameters.append(build_parameter_type( - name=api_settings.URL_FORMAT_OVERRIDE, - schema=build_basic_type(OpenApiTypes.STR), # type: ignore - location=OpenApiParameter.QUERY, - enum=formats - )) - return parameters - - def _get_parameters(self) -> List[_SchemaType]: - def dict_helper(parameters): - return {(p['name'], p['in']): p for p in parameters} - - override_parameters = self._process_override_parameters() - # remove overridden path parameters beforehand so that there are no irrelevant warnings. - path_variables = [ - v for v in uritemplate.variables(self.path) if (v, 'path') not in override_parameters - ] - parameters = { - **dict_helper(self._resolve_path_parameters(path_variables)), - **dict_helper(self._get_filter_parameters()), - **dict_helper(self._get_pagination_parameters()), - **dict_helper(self._get_format_parameters()), - } - # override/add/remove @extend_schema parameters - for key, parameter in override_parameters.items(): - if parameter is None: - # either omit or explicitly remove parameter - if key in parameters: - del parameters[key] - else: - parameters[key] = parameter - - # collect independently specified parameter examples from @extend_schema. - # Append to both discovered and manually specified parameters. - examples_by_key = defaultdict(list) - for example in self.get_examples(): - if example.parameter_only: - examples_by_key[example.parameter_only].append(example) - for key, examples in examples_by_key.items(): - if key in parameters: - parameters[key].setdefault('examples', {}) - parameters[key]['examples'].update(build_examples_list(examples)) - - if callable(spectacular_settings.SORT_OPERATION_PARAMETERS): - return sorted(parameters.values(), key=spectacular_settings.SORT_OPERATION_PARAMETERS) - elif spectacular_settings.SORT_OPERATION_PARAMETERS: - return sorted(parameters.values(), key=lambda p: p['name']) - else: - return list(parameters.values()) - - def get_description(self) -> str: # type: ignore[override] - """ override this for custom behaviour """ - action_or_method = getattr(self.view, getattr(self.view, 'action', self.method.lower()), None) - view_doc = get_doc(self.view.__class__) - action_doc = get_doc(action_or_method) - return action_doc or view_doc - - def get_summary(self) -> Optional[str]: - """ override this for custom behaviour """ - return None - - def _get_external_docs(self) -> Optional[Dict[str, str]]: - external_docs = self.get_external_docs() - if isinstance(external_docs, str): - return {'url': external_docs} - else: - return external_docs - - def get_external_docs(self) -> Optional[Union[Dict[str, str], str]]: - """ override this for custom behaviour """ - return None - - def get_auth(self) -> List[_SchemaType]: - """ - Obtains authentication classes and permissions from view. If authentication - is known, resolve security requirement for endpoint and security definition for - the component section. - For custom authentication subclass ``OpenApiAuthenticationExtension``. - """ - auths = [] - - for authenticator in self.view.get_authenticators(): - if not whitelisted(authenticator, spectacular_settings.AUTHENTICATION_WHITELIST, True): - continue - - scheme = OpenApiAuthenticationExtension.get_match(authenticator) - if not scheme: - warn( - f'could not resolve authenticator {authenticator.__class__}. There ' - f'was no OpenApiAuthenticationExtension registered for that class. ' - f'Try creating one by subclassing it. Ignoring for now.' - ) - continue - - security_requirements = scheme.get_security_requirement(self) - if security_requirements is not None: - if isinstance(security_requirements, dict): - auths.append(security_requirements) - else: - auths.extend(security_requirements) - - if isinstance(scheme.name, str): - names, definitions = [scheme.name], [scheme.get_security_definition(self)] - else: - names, definitions = scheme.name, scheme.get_security_definition(self) # type: ignore[assignment] - - for name, definition in zip(names, definitions): - self.registry.register_on_missing( - ResolvedComponent( - name=name, - type=ResolvedComponent.SECURITY_SCHEMA, - object=authenticator.__class__, - schema=definition - ) - ) - - if spectacular_settings.SECURITY: - auths.extend(spectacular_settings.SECURITY) - - perms = [p.__class__ for p in self.view.get_permissions()] - if permissions.AllowAny in perms: - auths.append({}) - elif permissions.IsAuthenticatedOrReadOnly in perms and self.method in permissions.SAFE_METHODS: - auths.append({}) - return auths - - def get_request_serializer(self) -> Optional[_SerializerType]: - """ override this for custom behaviour """ - return self._get_serializer() - - def get_response_serializers(self) -> Optional[_SerializerType]: - """ override this for custom behaviour """ - return self._get_serializer() - - def get_tags(self) -> List[str]: - """ override this for custom behaviour """ - tokenized_path = self._tokenize_path() - # use first non-parameter path part as tag - return tokenized_path[:1] - - def get_extensions(self) -> _SchemaType: - return {} - - def _get_callbacks(self): - """ - Creates a mocked view for every callback. The given extend_schema decorator then - specifies the expectations on the receiving end of the callback. Effectively - simulates a sub-schema from the opposing perspective via a virtual view definition. - """ - result = {} - - for callback in self.get_callbacks(): - if isinstance(callback.decorator, dict): - methods = callback.decorator - else: - methods = {'post': callback.decorator} - - path_items = {} - - for method, decorator in methods.items(): - # a dict indicates a raw schema; use directly - if isinstance(decorator, dict): - path_items[method.lower()] = decorator - continue - - mocked_view = build_mocked_view( - method=method, - path=callback.path, - extend_schema_decorator=decorator, - registry=self.registry - ) - operation = {} - - description = mocked_view.schema.get_description() - if description: - operation['description'] = description - - summary = mocked_view.schema.get_summary() - if summary: - operation['summary'] = summary - - request_body = mocked_view.schema._get_request_body('response') - if request_body: - operation['requestBody'] = request_body - - deprecated = mocked_view.schema.is_deprecated() - if deprecated: - operation['deprecated'] = deprecated - - operation['responses'] = mocked_view.schema._get_response_bodies('request') - - extensions = mocked_view.schema.get_extensions() - if extensions: - operation.update(sanitize_specification_extensions(extensions)) - - path_items[method.lower()] = operation - - result[callback.name] = {callback.path: path_items} - - return result - - def get_callbacks(self) -> List[OpenApiCallback]: - """ override this for custom behaviour """ - return [] - - def get_operation_id(self) -> str: - """ override this for custom behaviour """ - tokenized_path = self._tokenize_path() - # replace dashes as they can be problematic later in code generation - tokenized_path = [t.replace('-', '_') for t in tokenized_path] - - if self.method == 'GET' and self._is_list_view(): - action = 'list' - else: - action = self.method_mapping[self.method.lower()] - - if not tokenized_path: - tokenized_path.append('root') - - if re.search(r'', self.path_regex): - tokenized_path.append('formatted') - - if spectacular_settings.OPERATION_ID_METHOD_POSITION == 'PRE': - return '_'.join([action] + tokenized_path) - elif spectacular_settings.OPERATION_ID_METHOD_POSITION == 'POST': - return '_'.join(tokenized_path + [action]) - else: - assert False, 'Invalid value for OPERATION_ID_METHOD_POSITION. Allowed: PRE, POST' - - def is_deprecated(self) -> bool: - """ override this for custom behaviour """ - return False - - def _tokenize_path(self) -> List[str]: - # remove path prefix - path = re.sub( - pattern=self.path_prefix, - repl='', - string=self.path, - flags=re.IGNORECASE - ) - # remove path variables - path = re.sub(pattern=r'\{[\w\-]+\}', repl='', string=path) - # cleanup and tokenize remaining parts. - tokenized_path = path.rstrip('/').lstrip('/').split('/') - return [t for t in tokenized_path if t] - - def _resolve_path_parameters(self, variables): - model = get_view_model(self.view, emit_warnings=False) - - parameters = [] - for variable in variables: - schema = build_basic_type(OpenApiTypes.STR) - description = '' - - resolved_parameter = resolve_django_path_parameter( - self.path_regex, variable, self.map_renderers('format'), - ) - if not resolved_parameter: - resolved_parameter = resolve_regex_path_parameter(self.path_regex, variable) - - if resolved_parameter: - schema = resolved_parameter['schema'] - elif model is None: - warn( - f'could not derive type of path parameter "{variable}" because it ' - f'is untyped and obtaining queryset from the viewset failed. ' - f'Consider adding a type to the path (e.g. ) or annotating ' - f'the parameter type with @extend_schema. Defaulting to "string".' - ) - else: - try: - if getattr(self.view, 'lookup_url_kwarg', None) == variable: - model_field_name = getattr(self.view, 'lookup_field', variable) - elif variable.endswith('_pk'): - # Django naturally coins foreign keys *_id. improve chances to match a field - model_field_name = f'{variable[:-3]}_id' - else: - model_field_name = variable - model_field = follow_model_field_lookup(model, model_field_name) - schema = self._map_model_field(model_field, direction=None) - if 'description' not in schema and model_field.primary_key: - description = get_pk_description(model, model_field) - except django_exceptions.FieldError: - warn( - f'could not derive type of path parameter "{variable}" because model ' - f'"{model.__module__}.{model.__name__}" contained no such field. Consider ' - f'annotating parameter with @extend_schema. Defaulting to "string".' - ) - - parameters.append(build_parameter_type( - name=variable, - location=OpenApiParameter.PATH, - description=description, - schema=schema - )) - - return parameters - - def get_filter_backends(self) -> List[Any]: - """ override this for custom behaviour """ - if not self._is_list_view(): - return [] - return getattr(self.view, 'filter_backends', []) - - def _get_filter_parameters(self): - parameters = [] - for filter_backend in self.get_filter_backends(): - filter_extension = OpenApiFilterExtension.get_match(filter_backend()) - if filter_extension: - parameters += filter_extension.get_schema_operation_parameters(self) - else: - parameters += filter_backend().get_schema_operation_parameters(self.view) - return parameters - - def _get_pagination_parameters(self): - if not self._is_list_view(): - return [] - - paginator = self._get_paginator() - if not paginator: - return [] - - filter_extension = OpenApiFilterExtension.get_match(paginator) - if filter_extension: - return filter_extension.get_schema_operation_parameters(self) - else: - return paginator.get_schema_operation_parameters(self.view) - - def _map_model_field(self, model_field, direction): - assert isinstance(model_field, models.Field) - # to get a fully initialized serializer field we use DRF's own init logic - try: - field_cls, field_kwargs = serializers.ModelSerializer().build_field( - field_name=model_field.name, - info=get_field_info(model_field.model), - model_class=model_field.model, - nested_depth=0, - ) - field = field_cls(**field_kwargs) - field.field_name = model_field.name - except: # noqa - field = None - - # For some cases, the DRF init logic either breaks (custom field with internal type) or - # the resulting field is underspecified with regards to the schema (ReadOnlyField). - if field and isinstance(field, serializers.PrimaryKeyRelatedField): - # special case handling only for _resolve_path_parameters() where neither queryset nor - # parent is set by build_field. patch in queryset as _map_serializer_field requires it - if not field.queryset: - field.queryset = get_manager(model_field.related_model).none() - return self._map_serializer_field(field, direction) - elif isinstance(field, serializers.ManyRelatedField): - # special case handling similar to the case above. "parent.parent" on child_relation - # is None and there is no queryset. patch in as _map_serializer_field requires one. - if not field.child_relation.queryset: - field.child_relation.queryset = get_manager(model_field.related_model).none() - return self._map_serializer_field(field, direction) - elif field and not isinstance(field, (serializers.ReadOnlyField, serializers.ModelField)): - return self._map_serializer_field(field, direction) - elif isinstance(model_field, models.ForeignKey): - return self._map_model_field(model_field.target_field, direction) - elif hasattr(models, 'JSONField') and isinstance(model_field, models.JSONField): - # fix for DRF==3.11 with django>=3.1 as it is not yet represented in the field_mapping - return build_basic_type(OpenApiTypes.ANY) - elif isinstance(model_field, models.BinaryField): - return build_basic_type(OpenApiTypes.BYTE) - elif hasattr(models, model_field.get_internal_type()): - # be graceful when the model field is not explicitly mapped to a serializer - internal_type = getattr(models, model_field.get_internal_type()) - field_cls = serializers.ModelSerializer.serializer_field_mapping.get(internal_type) - if not field_cls: - warn( - f'model field "{model_field.get_internal_type()}" has no mapping in ' - f'ModelSerializer. It may be a deprecated field. Defaulting to "string"' - ) - return build_basic_type(OpenApiTypes.STR) - return self._map_serializer_field(field_cls(), direction) - else: - error( - f'could not resolve model field "{model_field}". Failed to resolve through ' - f'serializer_field_mapping, get_internal_type(), or any override mechanism. ' - f'Defaulting to "string"' - ) - return build_basic_type(OpenApiTypes.STR) - - def _map_serializer_field(self, field, direction, bypass_extensions=False): - meta = self._get_serializer_field_meta(field, direction) - - if has_override(field, 'field'): - override = get_override(field, 'field') - if is_basic_type(override): - schema = build_basic_type(override) - if schema is None: - return None - elif is_higher_order_type_hint(override): - schema = resolve_type_hint(override) - elif isinstance(override, dict): - schema = override - else: - schema = self._map_serializer_field(force_instance(override), direction) - - field_component_name = get_override(field, 'field_component_name') - if field_component_name: - component = ResolvedComponent( - name=field_component_name, - type=ResolvedComponent.SCHEMA, - schema=schema, - object=field, - ) - self.registry.register_on_missing(component) - return append_meta(component.ref, meta) - else: - return append_meta(schema, meta) - - serializer_field_extension = OpenApiSerializerFieldExtension.get_match(field) - if serializer_field_extension and not bypass_extensions: - schema = serializer_field_extension.map_serializer_field(self, direction) - if schema is None: - return None - elif serializer_field_extension.get_name(): - component = ResolvedComponent( - name=serializer_field_extension.get_name(), - type=ResolvedComponent.SCHEMA, - schema=schema, - object=field, - ) - self.registry.register_on_missing(component) - return append_meta(component.ref, meta) - else: - return append_meta(schema, meta) - - # nested serializer with many=True gets automatically replaced with ListSerializer - if is_list_serializer(field): - schema = self._unwrap_list_serializer(field, direction) - return append_meta(schema, meta) if schema else None - - # nested serializer - if is_serializer(field): - component = self.resolve_serializer(field, direction) - return append_meta(component.ref, meta) if component else None - - # Related fields. - if isinstance(field, serializers.ManyRelatedField): - schema = self._map_serializer_field(field.child_relation, direction) - # remove hand-over initkwargs applying only to outer scope - schema.pop('readOnly', None) - if meta.get('description') == schema.get('description'): - schema.pop('description', None) - return append_meta(build_array_type(schema), meta) - - if isinstance(field, (serializers.PrimaryKeyRelatedField, serializers.SlugRelatedField)): - # SlugRelatedField is essentially a non-pk version of PrimaryKeyRelatedField. - is_slug = isinstance(field, serializers.SlugRelatedField) - # read_only fields do not have a Manager by design. go around and get field - # from parent. also avoid calling Manager. __bool__ as it might be customized - # to hit the database. - if not is_slug and getattr(field, 'pk_field') is not None: - schema = self._map_serializer_field(field.pk_field, direction) - return append_meta(schema, meta) - elif getattr(field, 'queryset', None) is not None: - if is_slug: - model = field.queryset.model - source = [field.slug_field] - model_field = follow_field_source(model, source, default=models.TextField()) - else: - model_field = field.queryset.model._meta.pk - else: - if isinstance(field.parent, serializers.ManyRelatedField): - model = field.parent.parent.Meta.model - source = field.parent.source.split('.') - elif hasattr(field.parent, 'Meta'): - model = field.parent.Meta.model - source = field.source.split('.') - else: - warn( - f'Could not derive type for under-specified {field.__class__.__name__} ' - f'"{field.field_name}". The serializer has no associated model (Meta class) ' - f'and this particular field has no type without a model association. Consider ' - f'changing the field or adding a Meta class. Defaulting to string.' - ) - return append_meta(build_basic_type(OpenApiTypes.STR), meta) - - if is_slug: - source.append(field.slug_field) - - # estimates the relating model field and jumps to its target model PK field. - # also differentiate as source can be direct (pk) or relation field (model). - # be graceful and default to string. - model_field = follow_field_source(model, source, default=models.TextField()) - - # Special case: SlugRelatedField also allows to point to a callable @property. - if callable(model_field): - schema = self._map_response_type_hint(model_field) - elif isinstance(model_field, models.Field): - schema = self._map_model_field(model_field, direction) - else: - assert False, f'Field "{field.field_name}" must point to either a property or a model field.' - - # primary keys are usually non-editable (readOnly=True) and map_model_field correctly - # signals that attribute. however this does not apply in the context of relations. - schema.pop('readOnly', None) - return append_meta(schema, meta) - - if isinstance(field, serializers.StringRelatedField): - return append_meta(build_basic_type(OpenApiTypes.STR), meta) - - if isinstance(field, serializers.HyperlinkedIdentityField): - return append_meta(build_basic_type(OpenApiTypes.URI), meta) - - if isinstance(field, serializers.HyperlinkedRelatedField): - return append_meta(build_basic_type(OpenApiTypes.URI), meta) - - if isinstance(field, serializers.MultipleChoiceField): - return append_meta(build_array_type(build_choice_field(field)), meta) - - if isinstance(field, serializers.ChoiceField): - schema = build_choice_field(field) - if 'description' in meta and 'description' in schema: - meta['description'] = meta['description'] + '\n\n' + schema.pop('description') - return append_meta(schema, meta) - - if isinstance(field, serializers.ListField): - if isinstance(field.child, _UnvalidatedField): - return append_meta(build_array_type(build_basic_type(OpenApiTypes.ANY)), meta) - elif is_basic_serializer(field.child): - component = self.resolve_serializer(field.child, direction) - return append_meta(build_array_type(component.ref), meta) if component else None - else: - schema = self._map_serializer_field(field.child, direction) - self._insert_field_validators(field.child, schema) - # remove automatically attached but redundant title - if is_trivial_string_variation(field.field_name, schema.get('title')): - schema.pop('title', None) - return append_meta(build_array_type(schema), meta) - - # DateField and DateTimeField type is string - if isinstance(field, serializers.DateField): - return append_meta(build_basic_type(OpenApiTypes.DATE), meta) - - if isinstance(field, serializers.DateTimeField): - return append_meta(build_basic_type(OpenApiTypes.DATETIME), meta) - - if isinstance(field, serializers.TimeField): - return append_meta(build_basic_type(OpenApiTypes.TIME), meta) - - if isinstance(field, serializers.EmailField): - return append_meta(build_basic_type(OpenApiTypes.EMAIL), meta) - - if isinstance(field, serializers.URLField): - return append_meta(build_basic_type(OpenApiTypes.URI), meta) - - if isinstance(field, serializers.UUIDField): - return append_meta(build_basic_type(OpenApiTypes.UUID), meta) - - if isinstance(field, serializers.DurationField): - return append_meta(build_basic_type(OpenApiTypes.STR), meta) - - if isinstance(field, serializers.IPAddressField): - # TODO this might be a DRF bug. protocol is not propagated to serializer although it - # should have been. results in always 'both' (thus no format) - if 'ipv4' == field.protocol.lower(): - schema = build_basic_type(OpenApiTypes.IP4) - elif 'ipv6' == field.protocol.lower(): - schema = build_basic_type(OpenApiTypes.IP6) - else: - schema = build_basic_type(OpenApiTypes.STR) - return append_meta(schema, meta) - - # DecimalField has multipleOf based on decimal_places - if isinstance(field, serializers.DecimalField): - if getattr(field, 'coerce_to_string', api_settings.COERCE_DECIMAL_TO_STRING): - content = {**build_basic_type(OpenApiTypes.STR), 'format': 'decimal'} - if field.max_whole_digits: - content['pattern'] = ( - fr'^-?\d{{0,{field.max_whole_digits}}}' - fr'(?:\.\d{{0,{field.decimal_places}}})?$' - ) - else: - content = build_basic_type(OpenApiTypes.DECIMAL) - if field.max_whole_digits: - value = 10 ** field.max_whole_digits - content.update({ - 'maximum': value, - 'minimum': -value, - 'exclusiveMaximum': True, - 'exclusiveMinimum': True, - }) - self._insert_min_max(field, content) - return append_meta(content, meta) - - if isinstance(field, serializers.FloatField): - content = build_basic_type(OpenApiTypes.DOUBLE) - self._insert_min_max(field, content) - return append_meta(content, meta) - - if isinstance(field, serializers.IntegerField): - content = build_basic_type(OpenApiTypes.INT) - self._insert_min_max(field, content) - # Use int64 for format if value outside the 32-bit signed integer range [-2,147,483,648 to 2,147,483,647]. - if not all(-2147483648 <= int(content.get(key, 0)) <= 2147483647 for key in ('maximum', 'minimum')): - content['format'] = 'int64' - return append_meta(content, meta) - - if isinstance(field, serializers.FileField): - if spectacular_settings.COMPONENT_SPLIT_REQUEST and direction == 'request': - content = build_basic_type(OpenApiTypes.BINARY) - else: - use_url = getattr(field, 'use_url', api_settings.UPLOADED_FILES_USE_URL) - content = build_basic_type(OpenApiTypes.URI if use_url else OpenApiTypes.STR) - return append_meta(content, meta) - - if isinstance(field, serializers.SerializerMethodField): - method = getattr(field.parent, field.method_name, None) - if method is None: - error( - f'SerializerMethodField "{field.field_name}" is missing required method ' - f'"{field.method_name}". defaulting to "string".' - ) - return append_meta(build_basic_type(OpenApiTypes.STR), meta) - - return append_meta(self._map_response_type_hint(method), meta) - - # NullBooleanField was removed in 3.14. Since 3.12.0 NullBooleanField was a subclass of BooleanField - if hasattr(serializers, "NullBooleanField"): - boolean_field_classes = (serializers.BooleanField, serializers.NullBooleanField) - else: - boolean_field_classes = (serializers.BooleanField,) - - if isinstance(field, boolean_field_classes): - return append_meta(build_basic_type(OpenApiTypes.BOOL), meta) - - if isinstance(field, serializers.JSONField): - return append_meta(build_basic_type(OpenApiTypes.ANY), meta) - - if isinstance(field, (serializers.DictField, serializers.HStoreField)): - content = build_basic_type(OpenApiTypes.OBJECT) - if not isinstance(field.child, _UnvalidatedField): - content['additionalProperties'] = self._map_serializer_field(field.child, direction) - self._insert_field_validators(field.child, content['additionalProperties']) - return append_meta(content, meta) - - if isinstance(field, serializers.CharField): - return append_meta(build_basic_type(OpenApiTypes.STR), meta) - - if isinstance(field, serializers.ReadOnlyField): - # when field is nested inside a ListSerializer, the Meta class is 2 steps removed - if is_list_serializer(field.parent): - model = getattr(getattr(field.parent.parent, 'Meta', None), 'model', None) - source = field.parent.source_attrs - else: - model = getattr(getattr(field.parent, 'Meta', None), 'model', None) - source = field.source_attrs - - if model is None: - warn( - f'Could not derive type for ReadOnlyField "{field.field_name}" because the ' - f'serializer class has no associated model (Meta class). Consider using some ' - f'other field like CharField(read_only=True) instead. defaulting to string.' - ) - return append_meta(build_basic_type(OpenApiTypes.STR), meta) - - target = follow_field_source(model, source) - if ( - hasattr(target, "_partialmethod") - and target._partialmethod.func.__name__ == '_get_FIELD_display' - ): - # the only way to detect an uninitialized partial method - # this is a convenience method for model choice fields and is mostly a string - schema = build_basic_type(str) - elif callable(target): - schema = self._map_response_type_hint(target) - elif isinstance(target, models.Field): - schema = self._map_model_field(target, direction) - else: - assert False, f'ReadOnlyField target "{field}" must be property or model field' - return append_meta(schema, meta) - - # DRF was not able to match the model field to an explicit SerializerField and therefore - # used its generic fallback serializer field that simply wraps the model field. - if isinstance(field, serializers.ModelField): - schema = self._map_model_field(field.model_field, direction) - return append_meta(schema, meta) - - warn(f'could not resolve serializer field "{field}". Defaulting to "string"') - return append_meta(build_basic_type(OpenApiTypes.STR), meta) - - def _insert_min_max(self, field: Any, content: _SchemaType) -> None: - if field.max_value is not None: - content['maximum'] = field.max_value - if 'exclusiveMaximum' in content: - del content['exclusiveMaximum'] - if field.min_value is not None: - content['minimum'] = field.min_value - if 'exclusiveMinimum' in content: - del content['exclusiveMinimum'] - - def _map_serializer(self, serializer, direction, bypass_extensions=False): - serializer = force_instance(serializer) - serializer_extension = OpenApiSerializerExtension.get_match(serializer) - - if serializer_extension and not bypass_extensions: - schema = serializer_extension.map_serializer(self, direction) - else: - schema = self._map_basic_serializer(serializer, direction) - - extensions = get_override(serializer, 'extensions', {}) - if extensions: - schema.update(sanitize_specification_extensions(extensions)) - - return self._postprocess_serializer_schema(schema, serializer, direction) - - def _postprocess_serializer_schema(self, schema, serializer, direction): - """ - postprocess generated schema for component splitting, if enabled. - does only apply to direct component schemas and not intermediate schemas - like components composed of sub-component via e.g. oneOf. - """ - if not spectacular_settings.COMPONENT_SPLIT_REQUEST: - return schema - - properties = schema.get('properties', []) - required = schema.get('required', []) - - for prop_name in list(properties): - if direction == 'request' and properties[prop_name].get('readOnly'): - del schema['properties'][prop_name] - if prop_name in required: - required.remove(prop_name) - if direction == 'response' and properties[prop_name].get('writeOnly'): - del schema['properties'][prop_name] - if prop_name in required: - required.remove(prop_name) - - # remove empty listing as it violates schema specification - if 'required' in schema and not required: - del schema['required'] - return schema - - def _get_serializer_field_meta(self, field, direction): - if not isinstance(field, serializers.Field): - return {} - - meta = {} - if field.read_only: - meta['readOnly'] = True - if field.write_only: - meta['writeOnly'] = True - if field.allow_null: - # this will be converted later in case of OAS 3.1 - meta['nullable'] = True - if isinstance(field, serializers.CharField) and not field.allow_blank: - # blank check only applies to inbound requests - if spectacular_settings.COMPONENT_SPLIT_REQUEST: - if direction == 'request': - meta['minLength'] = 1 - elif spectacular_settings.ENFORCE_NON_BLANK_FIELDS: - if not field.read_only: - meta['minLength'] = 1 - if field.default is not None and field.default != empty and not callable(field.default): - if isinstance( - field, - ( - serializers.ModelField, - serializers.SerializerMethodField, - serializers.PrimaryKeyRelatedField, - serializers.SlugRelatedField, - ), - ): - # Skip coercion for lack of a better solution. These are special in that they require - # a model instance or object (which we don't have) instead of a plain value. - default = field.default - else: - try: - # gracefully attempt to transform value or just use as plain on error - default = field.to_representation(field.default) - except: # noqa: E722 - default = field.default - if isinstance(default, set): - default = list(default) - meta['default'] = default - if field.label and not is_trivial_string_variation(field.label, field.field_name): - meta['title'] = str(field.label) - if field.help_text: - meta['description'] = str(field.help_text) - return meta - - def _map_basic_serializer(self, serializer, direction): - assert_basic_serializer(serializer) - serializer = force_instance(serializer) - # serializers provided through @extend_schema will not receive the mock context - # via _get_serializer(). Establish behavioral symmetry for those use-cases. - if not serializer.context: - serializer.context.update(build_serializer_context(self.view)) - required = set() - properties = {} - - for field in serializer.fields.values(): - if isinstance(field, serializers.HiddenField): - continue - if field.field_name in get_override(serializer, 'exclude_fields', []): - continue - - schema = self._map_serializer_field(field, direction) - # skip field if there is no schema for the direction - if schema is None: - continue - - add_to_required = ( - field.required - or (schema.get('readOnly') and not spectacular_settings.COMPONENT_NO_READ_ONLY_REQUIRED) - ) - if add_to_required: - required.add(field.field_name) - - self._insert_field_validators(field, schema) - - if field.field_name in get_override(serializer, 'deprecate_fields', []): - schema['deprecated'] = True - - properties[field.field_name] = safe_ref(schema) - - if is_patched_serializer(serializer, direction): - required = [] - - return build_object_type( - properties=properties, - required=required, - description=get_doc(serializer.__class__), - ) - - def _insert_field_validators(self, field, schema): - schema_type = schema.get('type') - - # OAS 3.1 special case - extract the main type - if isinstance(schema_type, list): - schema_type = [t for t in schema_type if t != 'null'][0] - - def update_constraint(schema, key, function, value, *, exclusive=False): - if callable(value): - value = value() - current_value = schema.get(key) - if current_value is not None: - new_value = function(current_value, value) - else: - new_value = value - schema[key] = new_value - if key in ('maximum', 'minimum'): - exclusive_key = f'exclusive{key.title()}' - if exclusive: - if new_value != current_value: - schema[exclusive_key] = True - elif exclusive_key in schema: - del schema[exclusive_key] - - for v in field.validators: - if schema_type == 'string': - if isinstance(v, validators.EmailValidator): - if 'format' not in schema: - schema['format'] = 'email' - elif isinstance(v, validators.URLValidator): - if 'format' not in schema: - schema['format'] = 'uri' - elif isinstance(v, validators.RegexValidator): - if 'pattern' not in schema: - pattern = v.regex.pattern.encode('ascii', 'backslashreplace').decode() - pattern = pattern.replace(r'\x', r'\u00') # unify escaping - pattern = pattern.replace(r'\Z', '$').replace(r'\A', '^') # ECMA anchors - schema['pattern'] = pattern - elif isinstance(v, validators.MaxLengthValidator): - update_constraint(schema, 'maxLength', min, v.limit_value) - elif isinstance(v, validators.MinLengthValidator): - update_constraint(schema, 'minLength', max, v.limit_value) - elif isinstance(v, validators.FileExtensionValidator) and v.allowed_extensions: - if 'pattern' not in schema: - schema['pattern'] = '(?:%s)$' % '|'.join([re.escape(extn) for extn in v.allowed_extensions]) - elif schema_type in ('integer', 'number'): - if isinstance(v, validators.MaxValueValidator): - update_constraint(schema, 'maximum', min, v.limit_value) - elif isinstance(v, validators.MinValueValidator): - update_constraint(schema, 'minimum', max, v.limit_value) - elif isinstance(v, validators.DecimalValidator) and v.max_digits: - value = 10 ** (v.max_digits - (v.decimal_places or 0)) - update_constraint(schema, 'maximum', min, value, exclusive=True) - update_constraint(schema, 'minimum', max, -value, exclusive=True) - elif schema_type == 'array': - if isinstance(v, validators.MaxLengthValidator): - update_constraint(schema, 'maxItems', min, v.limit_value) - elif isinstance(v, validators.MinLengthValidator): - update_constraint(schema, 'minItems', max, v.limit_value) - elif schema_type == 'object': - if isinstance(v, validators.MaxLengthValidator): - update_constraint(schema, 'maxProperties', min, v.limit_value) - elif isinstance(v, validators.MinLengthValidator): - update_constraint(schema, 'minProperties', max, v.limit_value) - - def _map_response_type_hint(self, method): - hint = get_override(method, 'field') or get_type_hints(method).get('return') - - if is_serializer(hint) or is_field(hint): - return self._map_serializer_field(force_instance(hint), 'response') - if isinstance(hint, dict): - return hint - - try: - schema = resolve_type_hint(hint) - except UnableToProceedError: - warn( - f'unable to resolve type hint for function "{method.__name__}". Consider ' - f'using a type hint or @extend_schema_field. Defaulting to string.' - ) - return build_basic_type(OpenApiTypes.STR) - - description = get_doc( - method.func if isinstance(method, functools.partial) else method - ) - if description: - schema['description'] = description - - return schema - - def _get_paginator(self): - pagination_class = getattr(self.view, 'pagination_class', None) - if pagination_class: - return pagination_class() - return None - - def get_paginated_name(self, serializer_name: str) -> str: - return f'Paginated{serializer_name}List' - - def map_parsers(self) -> List[Any]: - return list(dict.fromkeys([ - p.media_type for p in self.view.get_parsers() - if whitelisted(p, spectacular_settings.PARSER_WHITELIST) - ])) - - def map_renderers(self, attribute: str) -> List[Any]: - assert attribute in ['media_type', 'format'] - - # Either use whitelist or default back to old behavior by excluding BrowsableAPIRenderer - def use_renderer(r): - if spectacular_settings.RENDERER_WHITELIST is not None: - return whitelisted(r, spectacular_settings.RENDERER_WHITELIST) - else: - return not isinstance(r, renderers.BrowsableAPIRenderer) - - return list(dict.fromkeys([ - getattr(r, attribute).split(';')[0] - for r in self.view.get_renderers() - if use_renderer(r) and hasattr(r, attribute) - ])) - - def _get_serializer(self): - view = self.view - context = build_serializer_context(view) - try: - if isinstance(view, GenericAPIView): - # try to circumvent queryset issues with calling get_serializer. if view has NOT - # overridden get_serializer, its safe to use get_serializer_class. - if view.__class__.get_serializer == GenericAPIView.get_serializer: - return view.get_serializer_class()(context=context) - return view.get_serializer(context=context) - elif isinstance(view, APIView): - # APIView does not implement the required interface, but be lenient and make - # good guesses before giving up and emitting a warning. - if callable(getattr(view, 'get_serializer', None)): - return view.get_serializer(context=context) - elif callable(getattr(view, 'get_serializer_class', None)): - return view.get_serializer_class()(context=context) - elif hasattr(view, 'serializer_class'): - return view.serializer_class - else: - error( - 'unable to guess serializer. This is graceful fallback handling for APIViews. ' - 'Consider using GenericAPIView as view base class, if view is under your control. ' - 'Either way you may want to add a serializer_class (or method). Ignoring view for now.' - ) - else: - error('Encountered unknown view base class. Please report this issue. Ignoring for now') - except Exception as exc: - error( - f'exception raised while getting serializer. Hint: ' - f'Is get_serializer_class() returning None or is get_queryset() not working without ' - f'a request? Ignoring the view for now. (Exception: {exc})' - ) - - def get_examples(self) -> List[OpenApiExample]: - """ override this for custom behaviour """ - return [] - - def _get_examples(self, serializer, direction, media_type, status_code=None, extras=None): - """ Handles examples for request/response. purposefully ignores parameter examples """ - - # don't let the parameter examples influence the serializer example retrieval - examples = [e for e in self.get_examples() if not e.parameter_only] - - # Examples from Serializers via @extend_schema_serializer are only considered, if - # there were no higher priority examples directly from view annotation. - if not examples: - if is_list_serializer(serializer): - examples = get_override(serializer.child, 'examples', []) - elif is_serializer(serializer): - examples = get_override(serializer, 'examples', []) - - # additional examples provided via OpenApiResponse/Request are merged with the other methods - extras = extras or [] - - filtered_examples = [] - for example in examples + extras: - if direction == 'request' and example.response_only: - continue - if direction == 'response' and example.request_only: - continue - # default to 'application/json' unless nested in OpenApiResponse, in which case inherit - if not example.media_type: - example_media_type = media_type if (example in extras) else 'application/json' - else: - example_media_type = example.media_type - if media_type and media_type != example_media_type: - continue - # default to [200, 201] unless nested in OpenApiResponse, in which case inherit - if not example.status_codes: - example_status_codes = (status_code,) if (example in extras) else ('200', '201') - else: - example_status_codes = tuple(map(str, example.status_codes)) - if status_code and status_code not in example_status_codes: - continue - - if ( - self._is_list_view(serializer) - and get_override(serializer, 'many') is not False - and ( - direction == 'request' or '200' <= status_code < '300' - or spectacular_settings.ENABLE_LIST_MECHANICS_ON_NON_2XX - ) - ): - # contain modification to this context so "listing" is not propagated elsewhere - example = copy.copy(example) - example.value = build_listed_example_value(example.value, self._get_paginator(), direction) - - filtered_examples.append(example) - - return build_examples_list(filtered_examples) - - def _get_request_body(self, direction='request'): - # only unsafe methods can have a body - if self.method not in ('PUT', 'PATCH', 'POST'): - return None - - request_serializer = self.get_request_serializer() - request_body_required = True - content = [] - - # either implicit media-types via available parsers or manual list via decoration - if isinstance(request_serializer, dict): - media_types_iter = request_serializer.items() - else: - media_types_iter = zip(self.map_parsers(), itertools.repeat(request_serializer)) - - for media_type, serializer in media_types_iter: - if isinstance(serializer, OpenApiRequest): - serializer, examples, encoding = serializer.request, serializer.examples, serializer.encoding - else: - encoding, examples = None, None - - if ( - encoding - and media_type != "application/x-www-form-urlencoded" - and not media_type.startswith('multipart') - ): - warn( - 'Encodings object on media types other than "application/x-www-form-urlencoded" ' - 'or "multipart/*" have undefined behavior.' - ) - - examples = self._get_examples(serializer, direction, media_type, None, examples) - schema, partial_request_body_required = self._get_request_for_media_type(serializer, direction) - - if schema is not None: - content.append((media_type, schema, examples, encoding)) - request_body_required &= partial_request_body_required - - if not content: - return None - - request_body = { - 'content': { - media_type: build_media_type_object(schema, examples, encoding) - for media_type, schema, examples, encoding in content - } - } - if request_body_required: - request_body['required'] = request_body_required - return request_body - - def _get_request_for_media_type(self, serializer, direction='request'): - serializer = force_instance(serializer) - - if is_list_serializer(serializer): - schema = self._unwrap_list_serializer(serializer, direction) - request_body_required = bool(schema) - elif is_serializer(serializer): - if self.method == 'PATCH': - # we simulate what DRF is doing: the entry serializer is set to partial - # for PATCH requests. serializer instances received via extend_schema - # may be reused; prevent race conditions by modifying a copy. - serializer = copy.copy(serializer) - serializer.partial = True - component = self.resolve_serializer(serializer, direction) - if not component: - # serializer is empty so skip content enumeration - return None, False - schema = component.ref - # request body is only required if any required property is not read-only - readonly_props = [ - p for p, s in component.schema.get('properties', {}).items() if s.get('readOnly') - ] - required_props = component.schema.get('required', []) - request_body_required = any(req not in readonly_props for req in required_props) - elif is_basic_type(serializer): - schema = build_basic_type(serializer) - request_body_required = False - elif is_higher_order_type_hint(serializer): - schema = resolve_type_hint(serializer) - request_body_required = False - elif isinstance(serializer, dict): - # bypass processing and use given schema directly - schema = serializer - request_body_required = False - else: - warn( - f'could not resolve request body for {self.method} {self.path}. Defaulting to generic ' - 'free-form object. (Maybe annotate a Serializer class?)' - ) - schema = build_generic_type() - schema['description'] = 'Unspecified request body' - request_body_required = False - return schema, request_body_required - - def _get_response_bodies(self, direction: Direction = 'response') -> _SchemaType: - response_serializers = self.get_response_serializers() - - if ( - is_serializer(response_serializers) - or is_basic_type(response_serializers) - or is_higher_order_type_hint(response_serializers) - or isinstance(response_serializers, OpenApiResponse) - ): - if self.method == 'DELETE': - return {'204': {'description': _('No response body')}} - if self._is_create_operation(): - return {'201': self._get_response_for_code(response_serializers, '201', direction=direction)} - return {'200': self._get_response_for_code(response_serializers, '200', direction=direction)} - elif isinstance(response_serializers, dict): - # custom handling for overriding default return codes with @extend_schema - responses = {} - for code, serializer in response_serializers.items(): - if isinstance(code, tuple): - code, media_types = str(code[0]), code[1:] - else: - code, media_types = str(code), None - content_response = self._get_response_for_code(serializer, code, media_types, direction) - if code in responses: - responses[code]['content'].update(content_response['content']) - else: - responses[code] = content_response - return responses - else: - warn( - f'could not resolve "{response_serializers}" for {self.method} {self.path}. ' - f'Expected either a serializer or some supported override mechanism. ' - f'Defaulting to generic free-form object.' - ) - schema = build_basic_type(OpenApiTypes.OBJECT) - schema['description'] = _('Unspecified response body') # type: ignore - return {'200': self._get_response_for_code(schema, '200', direction=direction)} - - def _unwrap_list_serializer(self, serializer, direction: Direction) -> Optional[_SchemaType]: - if is_field(serializer): - return self._map_serializer_field(serializer, direction) - elif is_basic_serializer(serializer): - component = self.resolve_serializer(serializer, direction) - return component.ref if component else None - elif is_list_serializer(serializer): - result = self._unwrap_list_serializer(serializer.child, direction) - return build_array_type(result) if result else None - else: - assert False, 'Serializer is of unknown type.' - - def _get_response_for_code(self, serializer, status_code, media_types=None, direction='response'): - if isinstance(serializer, OpenApiResponse): - serializer, description, examples = ( - serializer.response, serializer.description, serializer.examples - ) - else: - description, examples = '', [] - - serializer = force_instance(serializer) - headers = self._get_response_headers_for_code(status_code, direction) - headers = {'headers': headers} if headers else {} - - if not serializer: - return {**headers, 'description': description or _('No response body')} - elif is_list_serializer(serializer): - schema = self._unwrap_list_serializer(serializer.child, direction) - if not schema: - return {**headers, 'description': description or _('No response body')} - elif is_serializer(serializer): - component = self.resolve_serializer(serializer, direction) - if not component: - return {**headers, 'description': description or _('No response body')} - schema = component.ref - elif is_basic_type(serializer): - schema = build_basic_type(serializer) - elif is_higher_order_type_hint(serializer): - schema = resolve_type_hint(serializer) - elif isinstance(serializer, dict): - # bypass processing and use given schema directly - schema = serializer - # prevent invalid dict case in _is_list_view() as this not a status_code dict. - serializer = None - else: - warn( - f'could not resolve "{serializer}" for {self.method} {self.path}. Expected either ' - f'a serializer or some supported override mechanism. Defaulting to ' - f'generic free-form object.' - ) - schema = build_basic_type(OpenApiTypes.OBJECT) - schema['description'] = _('Unspecified response body') - - if ( - self._is_list_view(serializer) - and get_override(serializer, 'many') is not False - and ('200' <= status_code < '300' or spectacular_settings.ENABLE_LIST_MECHANICS_ON_NON_2XX) - ): - # In case of a non-default ListSerializer, check for matching extension and - # bypass regular list wrapping by delegating handling to extension. - if ( - is_list_serializer_customized(serializer) - and OpenApiSerializerExtension.get_match(get_list_serializer(serializer)) - ): - schema = self._map_serializer(get_list_serializer(serializer), direction) - else: - schema = build_array_type(schema) - - paginator = self._get_paginator() - - if ( - paginator - and is_serializer(serializer) - and (not is_list_serializer(serializer) or is_serializer(serializer.child)) - ): - component = ResolvedComponent( - name=self.get_paginated_name(self._get_serializer_name(serializer, 'response')), - type=ResolvedComponent.SCHEMA, - schema=paginator.get_paginated_response_schema(schema), - object=self.get_serializer_identity( - serializer.child if is_list_serializer(serializer) else serializer, 'response' - ) - ) - self.registry.register_on_missing(component) - schema = component.ref - elif paginator: - schema = paginator.get_paginated_response_schema(schema) - - if not media_types: - media_types = self.map_renderers('media_type') - - media_types = modify_media_types_for_versioning(self.view, media_types) - - return { - **headers, - 'content': { - media_type: build_media_type_object( - schema, - self._get_examples(serializer, direction, media_type, status_code, examples) - ) - for media_type in media_types - }, - 'description': description - } - - def _get_response_headers_for_code(self, status_code, direction='response') -> _SchemaType: - result = {} - for parameter in self.get_override_parameters(): - if not isinstance(parameter, OpenApiParameter): - continue - if not parameter.response: - continue - if ( - isinstance(parameter.response, list) - and status_code not in [str(code) for code in parameter.response] - ): - continue - - if is_basic_type(parameter.type): - schema = build_basic_type(parameter.type) - elif is_serializer(parameter.type): - schema = self.resolve_serializer(parameter.type, direction).ref - else: - schema = parameter.type # type: ignore - - if not schema: - warn(f'response parameter {parameter.name} requires non-empty schema') - continue - - if parameter.location not in [OpenApiParameter.HEADER, OpenApiParameter.COOKIE]: - warn(f'incompatible location type ignored for response parameter {parameter.name}') - - parameter_type = build_parameter_type( - name=parameter.name, - schema=schema, - location=parameter.location, - required=parameter.required, - description=parameter.description, - enum=parameter.enum, - pattern=parameter.pattern, - deprecated=parameter.deprecated, - style=parameter.style, - explode=parameter.explode, - default=parameter.default, - allow_blank=parameter.allow_blank, - examples=build_examples_list(parameter.examples), - extensions=parameter.extensions, - ) - del parameter_type['name'] - del parameter_type['in'] - result[parameter.name] = parameter_type - - return result - - def get_serializer_identity(self, serializer, direction: Direction) -> Any: - serializer_extension = OpenApiSerializerExtension.get_match(serializer) - if serializer_extension: - identity = serializer_extension.get_identity(self, direction) - if identity is not None: - return identity - - return serializer - - def get_serializer_name(self, serializer: serializers.Serializer, direction: Direction) -> str: - """ override this for custom behaviour """ - return serializer.__class__.__name__ - - def _get_serializer_name(self, serializer, direction, bypass_extensions=False) -> str: - serializer_extension = OpenApiSerializerExtension.get_match(serializer) - if serializer_extension and not bypass_extensions: - custom_name = serializer_extension.get_name(**filter_supported_arguments( - serializer_extension.get_name, auto_schema=self, direction=direction - )) - else: - custom_name = None - - if custom_name: - name = custom_name - elif has_override(serializer, 'component_name'): - name = get_override(serializer, 'component_name') - elif getattr(getattr(serializer, 'Meta', None), 'ref_name', None) is not None: - # local override mechanisms. for compatibility with drf-yasg we support meta ref_name, - # though we do not support the serializer inlining feature. - # https://drf-yasg.readthedocs.io/en/stable/custom_spec.html#serializer-meta-nested-class - name = serializer.Meta.ref_name - elif is_list_serializer(serializer): - return self._get_serializer_name(serializer.child, direction) - else: - name = self.get_serializer_name(serializer, direction) - - assert name - - if name.endswith('Serializer'): - name = name[:-10] - - if is_patched_serializer(serializer, direction): - name = 'Patched' + name - - if direction == 'request' and spectacular_settings.COMPONENT_SPLIT_REQUEST: - name = name + 'Request' - - if not re.match(r'^[\w.-]+$', name): - warn( - f'Component name "{name}" contains illegal characters. Only "A-Z a-z 0-9 - . _" ' - f'are allowed. Furthermore, "-" and "." are discoursed due to potential tooling ' - f'issues. This likely leads to an invalid schema.' - ) - - return name - - def resolve_serializer( - self, serializer: _SerializerType, direction: Direction, bypass_extensions=False - ) -> ResolvedComponent: - assert_basic_serializer(serializer) - serializer = force_instance(serializer) - - with add_trace_message(serializer.__class__): - component = ResolvedComponent( - name=self._get_serializer_name(serializer, direction, bypass_extensions), - type=ResolvedComponent.SCHEMA, - object=self.get_serializer_identity(serializer, direction), - ) - if component in self.registry: - return self.registry[component] # return component with schema - - self.registry.register(component) - component.schema = self._map_serializer(serializer, direction, bypass_extensions) - - discard_component = ( - # components with empty schemas serve no purpose - not component.schema - # concrete component without properties are likely only transactional so discard - or ( - component.schema.get('type') == 'object' - and not component.schema.get('properties') - and 'additionalProperties' not in component.schema - ) - ) - - if discard_component: - del self.registry[component] - return ResolvedComponent(None, None) # sentinel - return component diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/plumbing.py b/.venv/lib/python3.10/site-packages/drf_spectacular/plumbing.py deleted file mode 100644 index eb4799f..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/plumbing.py +++ /dev/null @@ -1,1545 +0,0 @@ -import collections -import functools -import hashlib -import inspect -import json -import re -import sys -import types -import typing -import urllib.parse -from abc import ABCMeta -from collections import OrderedDict, defaultdict -from decimal import Decimal -from enum import Enum -from typing import ( - Any, DefaultDict, Dict, Generic, List, Optional, Sequence, Tuple, Type, TypeVar, Union, -) - -if sys.version_info >= (3, 10): - from typing import TypeGuard # noqa: F401 -else: - from typing_extensions import TypeGuard # noqa: F401 - -import inflection -import uritemplate -from django.apps import apps -from django.db.models.constants import LOOKUP_SEP -from django.db.models.fields.related_descriptors import ( - ForwardManyToOneDescriptor, ManyToManyDescriptor, ReverseManyToOneDescriptor, - ReverseOneToOneDescriptor, -) -from django.db.models.fields.reverse_related import ForeignObjectRel -from django.db.models.sql.query import Query -from django.urls.converters import get_converters -from django.urls.resolvers import ( # type: ignore[attr-defined] - _PATH_PARAMETER_COMPONENT_RE, RegexPattern, Resolver404, RoutePattern, URLPattern, URLResolver, - get_resolver, -) -from django.utils.functional import Promise, cached_property -from django.utils.module_loading import import_string -from django.utils.translation import get_language -from django.utils.translation import gettext_lazy as _ -from rest_framework import exceptions, fields, mixins, serializers, versioning -from rest_framework.compat import unicode_http_header -from rest_framework.fields import empty -from rest_framework.settings import api_settings -from rest_framework.test import APIRequestFactory -from rest_framework.utils.encoders import JSONEncoder -from rest_framework.utils.mediatypes import _MediaType -from rest_framework.utils.serializer_helpers import ReturnDict, ReturnList -from uritemplate import URITemplate - -from drf_spectacular.drainage import cache, error, get_override, warn -from drf_spectacular.settings import spectacular_settings -from drf_spectacular.types import ( - DJANGO_PATH_CONVERTER_MAPPING, OPENAPI_TYPE_MAPPING, PYTHON_TYPE_MAPPING, OpenApiTypes, - _KnownPythonTypes, -) -from drf_spectacular.utils import ( - OpenApiExample, OpenApiParameter, OpenApiWebhook, _FieldType, _ListSerializerType, - _ParameterLocationType, _SchemaType, _SerializerType, -) - -try: - from django.db.models.enums import Choices # only available in Django>3 -except ImportError: - class Choices: # type: ignore - pass - -# types.UnionType was added in Python 3.10 for new PEP 604 pipe union syntax -if hasattr(types, 'UnionType'): - UNION_TYPES: Tuple[Any, ...] = (Union, types.UnionType) -else: - UNION_TYPES = (Union,) - -LITERAL_TYPES: Tuple[Any, ...] = () -TYPED_DICT_META_TYPES: Tuple[Any, ...] = () -TYPE_ALIAS_TYPES: Tuple[Any, ...] = () - -if sys.version_info >= (3, 8): - from typing import Literal as _PyLiteral - from typing import _TypedDictMeta as _PyTypedDictMeta # type: ignore[attr-defined] - LITERAL_TYPES += (_PyLiteral,) - TYPED_DICT_META_TYPES += (_PyTypedDictMeta,) - -if sys.version_info >= (3, 12): - from typing import TypeAliasType - TYPE_ALIAS_TYPES += (TypeAliasType,) - -try: - from typing_extensions import Literal as _PxLiteral - from typing_extensions import _TypedDictMeta as _PxTypedDictMeta # type: ignore[attr-defined] - LITERAL_TYPES += (_PxLiteral,) - TYPED_DICT_META_TYPES += (_PxTypedDictMeta,) -except ImportError: - pass - -if sys.version_info >= (3, 8): - CACHED_PROPERTY_FUNCS = (functools.cached_property, cached_property) -else: - CACHED_PROPERTY_FUNCS = (cached_property,) - -T = TypeVar('T') - - -class _Sentinel: - pass - - -class UnableToProceedError(Exception): - pass - - -def get_class(obj) -> type: - return obj if inspect.isclass(obj) else obj.__class__ - - -def force_instance(serializer_or_field): - if not inspect.isclass(serializer_or_field): - return serializer_or_field - elif issubclass(serializer_or_field, (serializers.BaseSerializer, fields.Field)): - return serializer_or_field() - else: - return serializer_or_field - - -def is_serializer(obj, strict=False) -> TypeGuard[_SerializerType]: - - from drf_spectacular.extensions import OpenApiSerializerExtension - return ( - isinstance(force_instance(obj), serializers.BaseSerializer) - or (bool(OpenApiSerializerExtension.get_match(obj)) and not strict) - ) - - -def is_list_serializer(obj: Any) -> TypeGuard[_ListSerializerType]: - return isinstance(force_instance(obj), serializers.ListSerializer) - - -def get_list_serializer(obj: Any): - return force_instance(obj) if is_list_serializer(obj) else get_class(obj)(many=True, context=obj.context) - - -def is_list_serializer_customized(obj) -> bool: - return ( - is_serializer(obj, strict=True) - and get_class(get_list_serializer(obj)).to_representation # type: ignore - is not serializers.ListSerializer.to_representation - ) - - -def is_basic_serializer(obj: Any) -> TypeGuard[_SerializerType]: - return is_serializer(obj) and not is_list_serializer(obj) - - -def is_field(obj: Any) -> TypeGuard[_FieldType]: - # make sure obj is a serializer field and nothing else. - # guard against serializers because BaseSerializer(Field) - return isinstance(force_instance(obj), fields.Field) and not is_serializer(obj) - - -def is_basic_type(obj: Any, allow_none=True) -> TypeGuard[_KnownPythonTypes]: - if not isinstance(obj, collections.abc.Hashable): - return False - if not allow_none and (obj is None or obj is OpenApiTypes.NONE): - return False - return obj in get_openapi_type_mapping() or obj in PYTHON_TYPE_MAPPING - - -def is_patched_serializer(serializer, direction) -> bool: - return bool( - spectacular_settings.COMPONENT_SPLIT_PATCH - and getattr(serializer, 'partial', None) - and not getattr(serializer, 'read_only', None) - and not (spectacular_settings.COMPONENT_SPLIT_REQUEST and direction == 'response') - ) - - -def is_trivial_string_variation(a: str, b: str) -> bool: - a = (a or '').strip().lower().replace(' ', '_').replace('-', '_') - b = (b or '').strip().lower().replace(' ', '_').replace('-', '_') - return a == b - - -def assert_basic_serializer(serializer) -> None: - assert is_basic_serializer(serializer), ( - f'internal assumption violated because we expected a basic serializer here and ' - f'instead got a "{serializer}". This may be the result of another app doing ' - f'some unexpected magic or an invalid internal call. Feel free to report this ' - f'as a bug at https://github.com/tfranzel/drf-spectacular/issues' - ) - - -@cache -def get_lib_doc_excludes(): - # do not import on package level due to potential import recursion when loading - # extensions as recommended: USER's settings.py -> USER EXTENSIONS -> extensions.py - # -> plumbing.py -> DRF views -> DRF DefaultSchema -> openapi.py - plumbing.py -> Loop - from rest_framework import generics, views, viewsets - return [ - object, - dict, - views.APIView, - *[getattr(serializers, c) for c in dir(serializers) if c.endswith('Serializer')], - *[getattr(viewsets, c) for c in dir(viewsets) if c.endswith('ViewSet')], - *[getattr(generics, c) for c in dir(generics) if c.endswith('APIView')], - *[getattr(mixins, c) for c in dir(mixins) if c.endswith('Mixin')], - ] - - -def get_view_model(view, emit_warnings=True): - """ - obtain model from view via view's queryset. try safer view attribute first - before going through get_queryset(), which may perform arbitrary operations. - """ - model = getattr(getattr(view, 'queryset', None), 'model', None) - - if model is not None: - return model - - try: - return view.get_queryset().model - except Exception as exc: - if emit_warnings: - warn( - f'Failed to obtain model through view\'s queryset due to raised exception. ' - f'Prevent this either by setting "queryset = Model.objects.none()" on the ' - f'view, checking for "getattr(self, "swagger_fake_view", False)" in ' - f'get_queryset() or by simply using @extend_schema. (Exception: {exc})' - ) - - -def get_doc(obj) -> str: - """ get doc string with fallback on obj's base classes (ignoring DRF documentation). """ - def post_cleanup(doc: str) -> str: - # also clean up trailing whitespace for each line - return '\n'.join(line.rstrip() for line in doc.rstrip().split('\n')) - - if not inspect.isclass(obj): - return post_cleanup(inspect.getdoc(obj) or '') - - def safe_index(lst, item): - try: - return lst.index(item) - except ValueError: - return float("inf") - - lib_barrier = min( - safe_index(obj.__mro__, c) for c in spectacular_settings.GET_LIB_DOC_EXCLUDES() - ) - for cls in obj.__mro__[:lib_barrier]: - if cls.__doc__: - return post_cleanup(inspect.cleandoc(cls.__doc__)) - return '' - - -def get_type_hints(obj) -> Dict[str, Any]: - """ unpack wrapped partial object and use actual func object """ - if isinstance(obj, functools.partial): - obj = obj.func - return typing.get_type_hints(obj) - - -@cache -def get_openapi_type_mapping(): - return { - **OPENAPI_TYPE_MAPPING, - OpenApiTypes.OBJECT: build_generic_type(), - } - - -def get_manager(model): - if not hasattr(model, spectacular_settings.DEFAULT_QUERY_MANAGER): - error( - f'Failed to obtain queryset from model "{model.__name__}" because manager ' - f'"{spectacular_settings.DEFAULT_QUERY_MANAGER}" was not found. You may ' - f'need to change the DEFAULT_QUERY_MANAGER setting. bailing.' - ) - return getattr(model, spectacular_settings.DEFAULT_QUERY_MANAGER) - - -def build_generic_type(): - if spectacular_settings.GENERIC_ADDITIONAL_PROPERTIES is None: - return {'type': 'object'} - elif spectacular_settings.GENERIC_ADDITIONAL_PROPERTIES == 'bool': - return {'type': 'object', 'additionalProperties': True} - else: - return {'type': 'object', 'additionalProperties': {}} - - -def build_basic_type(obj: Union[_KnownPythonTypes, OpenApiTypes]) -> Optional[_SchemaType]: - """ - resolve either enum or actual type and yield schema template for modification - """ - openapi_type_mapping = get_openapi_type_mapping() - if obj is None or type(obj) is None or obj is OpenApiTypes.NONE: - return None - elif obj in openapi_type_mapping: - return dict(openapi_type_mapping[obj]) - elif obj in PYTHON_TYPE_MAPPING: - return dict(openapi_type_mapping[PYTHON_TYPE_MAPPING[obj]]) - else: - warn(f'could not resolve type for "{obj}". defaulting to "string"') - return dict(openapi_type_mapping[OpenApiTypes.STR]) - - -def build_array_type(schema: _SchemaType, min_length=None, max_length=None) -> _SchemaType: - schema = {'type': 'array', 'items': schema} - if min_length is not None: - schema['minLength'] = min_length - if max_length is not None: - schema['maxLength'] = max_length - return schema - - -def build_object_type( - properties: Optional[_SchemaType] = None, - required=None, - description: Optional[str] = None, - **kwargs -) -> _SchemaType: - schema: _SchemaType = {'type': 'object'} - if description: - schema['description'] = description.strip() - if properties: - schema['properties'] = properties - if 'additionalProperties' in kwargs: - schema['additionalProperties'] = kwargs.pop('additionalProperties') - if required: - schema['required'] = sorted(required) - schema.update(kwargs) - return schema - - -def build_media_type_object(schema, examples=None, encoding=None) -> _SchemaType: - media_type_object = {'schema': schema} - if examples: - media_type_object['examples'] = examples - if encoding: - media_type_object['encoding'] = encoding - return media_type_object - - -def build_examples_list(examples: Sequence[OpenApiExample]) -> _SchemaType: - schema = {} - for example in examples: - normalized_name = inflection.camelize(example.name.replace(' ', '_')) - sub_schema = {} - if example.value is not empty: - sub_schema['value'] = example.value - if example.external_value: - sub_schema['externalValue'] = example.external_value - if example.summary: - sub_schema['summary'] = example.summary - elif normalized_name != example.name: - sub_schema['summary'] = example.name - if example.description: - sub_schema['description'] = example.description - schema[normalized_name] = sub_schema - return schema - - -def build_parameter_type( - name: str, - schema: _SchemaType, - location: _ParameterLocationType, - required=False, - description=None, - enum=None, - pattern=None, - deprecated=False, - explode=None, - style=None, - default=None, - allow_blank=True, - examples=None, - extensions=None, -) -> _SchemaType: - irrelevant_field_meta = ['readOnly', 'writeOnly'] - if location == OpenApiParameter.PATH: - irrelevant_field_meta += ['nullable', 'default'] - schema = { - 'in': location, - 'name': name, - 'schema': {k: v for k, v in schema.items() if k not in irrelevant_field_meta}, - } - if description: - schema['description'] = description - if required or location == 'path': - schema['required'] = True - if deprecated: - schema['deprecated'] = True - if explode is not None: - schema['explode'] = explode - if style is not None: - schema['style'] = style - if enum: - # in case of array schema, enum makes little sense on the array itself - if schema['schema'].get('type') == 'array': - schema['schema']['items']['enum'] = sorted(enum, key=str) - else: - schema['schema']['enum'] = sorted(enum, key=str) - if pattern is not None: - # in case of array schema, pattern only makes sense on the items - if schema['schema'].get('type') == 'array': - schema['schema']['items']['pattern'] = pattern - else: - schema['schema']['pattern'] = pattern - if default is not None and 'default' not in irrelevant_field_meta: - schema['schema']['default'] = default - if not allow_blank and schema['schema'].get('type') == 'string': - schema['schema']['minLength'] = schema['schema'].get('minLength', 1) - if examples: - schema['examples'] = examples - if extensions: - schema.update(sanitize_specification_extensions(extensions)) - return schema - - -def build_choice_field(field) -> _SchemaType: - choices = list(OrderedDict.fromkeys(field.choices)) # preserve order and remove duplicates - - if field.allow_blank and '' not in choices: - choices.append('') - - if not choices: - type = None - elif all(isinstance(choice, bool) for choice in choices): - type = 'boolean' - elif all(isinstance(choice, int) for choice in choices): - type = 'integer' - elif all(isinstance(choice, (int, float, Decimal)) for choice in choices): # `number` includes `integer` - # Ref: https://tools.ietf.org/html/draft-wright-json-schema-validation-00#section-5.21 - type = 'number' - elif all(isinstance(choice, str) for choice in choices): - type = 'string' - else: - type = None - - if field.allow_null and None not in choices: - choices.append(None) - - schema: _SchemaType = { - # The value of `enum` keyword MUST be an array and SHOULD be unique. - # Ref: https://tools.ietf.org/html/draft-wright-json-schema-validation-00#section-5.20 - 'enum': choices - } - - # If We figured out `type` then and only then we should set it. It must be a string. - # Ref: https://swagger.io/docs/specification/data-models/data-types/#mixed-type - # It is optional but it can not be null. - # Ref: https://tools.ietf.org/html/draft-wright-json-schema-validation-00#section-5.21 - if type: - schema['type'] = type - - if spectacular_settings.ENUM_GENERATE_CHOICE_DESCRIPTION: - schema['description'] = build_choice_description_list(field.choices.items()) - - schema['x-spec-enum-id'] = list_hash([(k, v) for k, v in field.choices.items() if k not in ('', None)]) - - return schema - - -def build_choice_description_list(choices) -> str: - return '\n'.join(f'* `{value}` - {label}' for value, label in choices) - - -def build_bearer_security_scheme_object(header_name, token_prefix, bearer_format=None): - """ Either build a bearer scheme or a fallback due to OpenAPI 3.0.3 limitations """ - # normalize Django header quirks - if header_name.startswith('HTTP_'): - header_name = header_name[5:] - header_name = header_name.replace('_', '-').capitalize() - - if token_prefix == 'Bearer' and header_name == 'Authorization': - return { - 'type': 'http', - 'scheme': 'bearer', - **({'bearerFormat': bearer_format} if bearer_format else {}), - } - else: - return { - 'type': 'apiKey', - 'in': 'header', - 'name': header_name, - 'description': _( - 'Token-based authentication with required prefix "%s"' - ) % token_prefix - } - - -def build_root_object(paths, components, webhooks, version) -> _SchemaType: - settings = spectacular_settings - if settings.VERSION and version: - version = f'{settings.VERSION} ({version})' - else: - version = settings.VERSION or version or '' - root = { - 'openapi': settings.OAS_VERSION, - 'info': { - 'title': settings.TITLE, - 'version': version, - **sanitize_specification_extensions(settings.EXTENSIONS_INFO), - }, - 'paths': {**paths, **settings.APPEND_PATHS}, - 'components': components, - **sanitize_specification_extensions(settings.EXTENSIONS_ROOT), - } - if settings.DESCRIPTION: - root['info']['description'] = settings.DESCRIPTION - if settings.TOS: - root['info']['termsOfService'] = settings.TOS - if settings.CONTACT: - root['info']['contact'] = settings.CONTACT - if settings.LICENSE: - root['info']['license'] = settings.LICENSE - if settings.SERVERS: - root['servers'] = settings.SERVERS - if settings.TAGS: - root['tags'] = settings.TAGS - if settings.EXTERNAL_DOCS: - root['externalDocs'] = settings.EXTERNAL_DOCS - if webhooks: - root['webhooks'] = webhooks - return root - - -def safe_ref(schema: _SchemaType) -> _SchemaType: - """ - ensure that $ref has its own context and does not remove potential sibling - entries when $ref is substituted. also remove useless singular "allOf" . - """ - if '$ref' in schema and len(schema) > 1: - return {'allOf': [{'$ref': schema.pop('$ref')}], **schema} - if 'allOf' in schema and len(schema) == 1 and len(schema['allOf']) == 1: - return schema['allOf'][0] - return schema - - -def append_meta(schema: _SchemaType, meta: _SchemaType) -> _SchemaType: - if spectacular_settings.OAS_VERSION.startswith('3.1'): - schema = schema.copy() - meta = meta.copy() - - schema_nullable = meta.pop('nullable', None) - meta_nullable = schema.pop('nullable', None) - - if schema_nullable or meta_nullable: - if 'type' in schema: - if isinstance(schema['type'], str): - schema['type'] = [schema['type'], 'null'] - else: - schema['type'] = [*schema['type'], 'null'] - elif '$ref' in schema: - schema = {'oneOf': [schema, {'type': 'null'}]} - elif len(schema) == 1 and 'oneOf' in schema: - schema['oneOf'].append({'type': 'null'}) - elif not schema: - schema = {'oneOf': [{}, {'type': 'null'}]} - else: - assert False, 'Invalid nullable case' # pragma: no cover - - # these two aspects were merged in OpenAPI 3.1 - if "exclusiveMinimum" in schema and "minimum" in schema: - schema["exclusiveMinimum"] = schema.pop("minimum") - if "exclusiveMaximum" in schema and "maximum" in schema: - schema["exclusiveMaximum"] = schema.pop("maximum") - - return safe_ref({**schema, **meta}) - - -def _follow_field_source(model, path: List[str]): - """ - navigate through root model via given navigation path. supports forward/reverse relations. - """ - field_or_property = getattr(model, path[0], None) - - if len(path) == 1: - # end of traversal - if isinstance(field_or_property, property): - return field_or_property.fget - elif isinstance(field_or_property, CACHED_PROPERTY_FUNCS): - return field_or_property.func - elif callable(field_or_property): - return field_or_property - elif isinstance(field_or_property, ManyToManyDescriptor): - if field_or_property.reverse: - return field_or_property.rel.target_field # m2m reverse - else: - return field_or_property.field.target_field # m2m forward - elif isinstance(field_or_property, ReverseOneToOneDescriptor): - return field_or_property.related.target_field # o2o reverse - elif isinstance(field_or_property, ReverseManyToOneDescriptor): - return field_or_property.rel.target_field # foreign reverse - elif isinstance(field_or_property, ForwardManyToOneDescriptor): - return field_or_property.field.target_field # o2o & foreign forward - else: - field = model._meta.get_field(path[0]) - if isinstance(field, ForeignObjectRel): - # case only occurs when relations are traversed in reverse and - # not via the related_name (default: X_set) but the model name. - return field.target_field - else: - return field - else: - if ( - isinstance(field_or_property, (property,) + CACHED_PROPERTY_FUNCS) - or callable(field_or_property) - ): - if isinstance(field_or_property, property): - target_model = _follow_return_type(field_or_property.fget) - elif isinstance(field_or_property, CACHED_PROPERTY_FUNCS): - target_model = _follow_return_type(field_or_property.func) - else: - target_model = _follow_return_type(field_or_property) - if not target_model: - raise UnableToProceedError( - f'could not follow field source through intermediate property "{path[0]}" ' - f'on model {model}. Please add a type hint on the model\'s property/function ' - f'to enable traversal of the source path "{".".join(path)}".' - ) - return _follow_field_source(target_model, path[1:]) - else: - target_model = model._meta.get_field(path[0]).related_model - return _follow_field_source(target_model, path[1:]) - - -def _follow_return_type(a_callable): - target_type = get_type_hints(a_callable).get('return') - if target_type is None: - return target_type - origin, args = _get_type_hint_origin(target_type) - if origin in UNION_TYPES: - type_args = [arg for arg in args if arg is not type(None)] # noqa: E721 - if len(type_args) > 1: - warn( - f'could not traverse Union type, because we don\'t know which type to choose ' - f'from {type_args}. Consider terminating "source" on a custom property ' - f'that indicates the expected Optional/Union type. Defaulting to "string"' - ) - return target_type - # Optional: - return type_args[0] - return target_type - - -def follow_field_source(model, path, default=None, emit_warnings=True): - """ - a model traversal chain "foreignkey.foreignkey.value" can either end with an actual model field - instance "value" or a model property function named "value". differentiate the cases. - - :return: models.Field or function object - """ - try: - return _follow_field_source(model, path) - except UnableToProceedError as e: - if emit_warnings: - warn(e) - except Exception as exc: - if emit_warnings: - warn( - f'could not resolve field on model {model} with path "{".".join(path)}". ' - f'This is likely a custom field that does some unknown magic. Maybe ' - f'consider annotating the field/property? Defaulting to "string". (Exception: {exc})' - ) - - def dummy_property(obj) -> str: # type: ignore - pass # pragma: no cover - return default or dummy_property - - -def follow_model_field_lookup(model, lookup): - """ - Follow a model lookup `foreignkey__foreignkey__field` in the same - way that Django QuerySet.filter() does, returning the final models.Field. - """ - query = Query(model) - lookup_splitted = lookup.split(LOOKUP_SEP) - _, field, _, _ = query.names_to_path(lookup_splitted, query.get_meta()) - return field - - -def alpha_operation_sorter(endpoint): - """ sort endpoints first alphanumerically by path, then by method order """ - path, path_regex, method, callback = endpoint - method_priority = { - 'GET': 0, - 'POST': 1, - 'PUT': 2, - 'PATCH': 3, - 'DELETE': 4 - }.get(method, 5) - - # Sort foo{arg} after foo/, but before foo/bar - if path.endswith('/'): - path = path[:-1] + ' ' - path = path.replace('{', '!') - - return path, method_priority - - -class ResolvedComponent: - # OpenAPI 3.0.3 - SCHEMA = 'schemas' - RESPONSE = 'responses' - PARAMETER = 'parameters' - EXAMPLE = 'examples' - REQUEST_BODY = 'requestBodies' - HEADER = 'headers' - SECURITY_SCHEMA = 'securitySchemes' - LINK = 'links' - CALLBACK = 'callbacks' - # OpenAPI 3.1.0+ - PATH_ITEM = 'pathItems' - - def __init__(self, name, type, schema=None, object=None): - self.name = name - self.type = type - self.schema = schema - self.object = object - - def __bool__(self): - return bool(self.name and self.type and self.object) - - @property - def key(self) -> Tuple[str, str]: - return self.name, self.type - - @property - def ref(self) -> _SchemaType: - assert self.__bool__() - return {'$ref': f'#/components/{self.type}/{self.name}'} - - -class ComponentIdentity: - """ A container class to make object/component comparison explicit """ - def __init__(self, obj): - self.obj = obj - - def __eq__(self, other): - if isinstance(other, ComponentIdentity): - return self.obj == other.obj - return self.obj == other - - -class ComponentRegistry: - def __init__(self) -> None: - self._components: Dict[Tuple[str, str], ResolvedComponent] = {} - - def register(self, component: ResolvedComponent) -> None: - if component in self: - warn( - f'trying to re-register a {component.type} component with name ' - f'{self._components[component.key].name}. this might lead to ' - f'a incorrect schema. Look out for reused names' - ) - self._components[component.key] = component - - def register_on_missing(self, component: ResolvedComponent) -> None: - if component not in self: - self._components[component.key] = component - - def __contains__(self, component): - if component.key not in self._components: - return False - - query_obj = component.object - registry_obj = self._components[component.key].object - - if isinstance(query_obj, ComponentIdentity) or inspect.isclass(query_obj): - query_id = query_obj - else: - query_id = query_obj.__class__ - - if isinstance(registry_obj, ComponentIdentity) or inspect.isclass(registry_obj): - registry_id = registry_obj - else: - registry_id = registry_obj.__class__ - - suppress_collision_warning = ( - get_override(registry_id, 'suppress_collision_warning', False) - or get_override(query_id, 'suppress_collision_warning', False) - ) - if query_id != registry_id and not suppress_collision_warning: - warn( - f'Encountered 2 components with identical names "{component.name}" and ' - f'different identities {query_id} and {registry_id}. This will very ' - f'likely result in an incorrect schema. Try renaming one.' - ) - return True - - def __getitem__(self, key) -> ResolvedComponent: - if isinstance(key, ResolvedComponent): - key = key.key - return self._components[key] - - def __delitem__(self, key): - if isinstance(key, ResolvedComponent): - key = key.key - del self._components[key] - - def build(self, extra_components) -> _SchemaType: - output: DefaultDict[str, _SchemaType] = defaultdict(dict) - # build tree from flat registry - for component in self._components.values(): - output[component.type][component.name] = component.schema - # add/override extra components - for extra_type, extra_component_dict in extra_components.items(): - for component_name, component_schema in extra_component_dict.items(): - output[extra_type][component_name] = component_schema - # sort by component type then by name - return { - type: {name: output[type][name] for name in sorted(output[type].keys())} - for type in sorted(output.keys()) - } - - -class OpenApiGeneratorExtension(Generic[T], metaclass=ABCMeta): - _registry: List[Type[T]] = [] - target_class: Union[None, str, Type[object]] = None - match_subclasses = False - priority = 0 - optional = False - - def __init_subclass__(cls, **kwargs): - super().__init_subclass__(**kwargs) - cls._registry.append(cls) - - def __init__(self, target): - self.target = target - - @classmethod - def _load_class(cls): - try: - cls.target_class = import_string(cls.target_class) - except ImportError: - installed_apps = apps.app_configs.keys() - if any(cls.target_class.startswith(app + '.') for app in installed_apps) and not cls.optional: - warn( - f'registered extensions {cls.__name__} for "{cls.target_class}" ' - f'has an installed app but target class was not found.' - ) - cls.target_class = None - except Exception as e: # pragma: no cover - installed_apps = apps.app_configs.keys() - if any(cls.target_class.startswith(app + '.') for app in installed_apps): - warn( - f'Unexpected error {e.__class__.__name__} occurred when attempting ' - f'to import {cls.target_class} for extension {cls.__name__} ({e}).' - ) - cls.target_class = None - - @classmethod - def _matches(cls, target: Any) -> bool: - if isinstance(cls.target_class, str): - cls._load_class() - - if cls.target_class is None: - return False # app not installed - elif cls.match_subclasses: - # Targets may trigger customized check through __subclasscheck__. Attempt to be more robust - try: - return issubclass(get_class(target), cls.target_class) # type: ignore - except TypeError: - return False - else: - return get_class(target) == cls.target_class - - @classmethod - def get_match(cls, target) -> Optional[T]: - for extension in sorted(cls._registry, key=lambda e: e.priority, reverse=True): - if extension._matches(target): - return extension(target) - return None - - -def deep_import_string(string: str) -> Any: - """ augmented import from string, e.g. MODULE.CLASS/OBJECT.ATTRIBUTE """ - try: - return import_string(string) - except ImportError: - pass - try: - *path, attr = string.split('.') - obj = import_string('.'.join(path)) - return getattr(obj, attr) - except (ImportError, AttributeError): - pass - - -def load_enum_name_overrides(): - return _load_enum_name_overrides(get_language()) - - -@functools.lru_cache() -def _load_enum_name_overrides(language: str): - overrides = {} - for name, choices in spectacular_settings.ENUM_NAME_OVERRIDES.items(): - if isinstance(choices, str): - choices = deep_import_string(choices) - if not choices: - warn( - f'unable to load choice override for {name} from ENUM_NAME_OVERRIDES. ' - f'please check module path string.' - ) - continue - if inspect.isclass(choices) and issubclass(choices, Choices): - choices = choices.choices - if inspect.isclass(choices) and issubclass(choices, Enum): - choices = [(c.value, c.name) for c in choices] - normalized_choices = [] - for choice in choices: - # Allow None values in the simple values list case - if isinstance(choice, str) or choice is None: - # TODO warning - normalized_choices.append((choice, choice)) # simple choice list - elif isinstance(choice[1], (list, tuple)): - normalized_choices.extend(choice[1]) # categorized nested choices - else: - normalized_choices.append(choice) # normal 2-tuple form - - # Get all of choice values that should be used in the hash, blank and None values get excluded - # in the post-processing hook for enum overrides, so we do the same here to ensure the hashes match - hashable_values = [ - (value, label) for value, label in normalized_choices if value not in ['', None] - ] - overrides[list_hash(hashable_values)] = name - - if len(spectacular_settings.ENUM_NAME_OVERRIDES) != len(overrides): - error( - 'ENUM_NAME_OVERRIDES has duplication issues. Encountered multiple names ' - 'for the same choice set. Enum naming might be unexpected.' - ) - return overrides - - -def list_hash(lst: Any) -> str: - return hashlib.sha256(json.dumps(list(lst), sort_keys=True, cls=JSONEncoder).encode()).hexdigest()[:16] - - -def anchor_pattern(pattern: str) -> str: - if not pattern.startswith('^'): - pattern = '^' + pattern - if not pattern.endswith('$'): - pattern = pattern + '$' - return pattern - - -def resolve_django_path_parameter(path_regex, variable, available_formats): - """ - convert django style path parameters to OpenAPI parameters. - """ - registered_converters = get_converters() - for match in _PATH_PARAMETER_COMPONENT_RE.finditer(path_regex): - converter, parameter = match.group('converter'), match.group('parameter') - enum_values = None - - if api_settings.SCHEMA_COERCE_PATH_PK and parameter == 'pk': - parameter = 'id' - elif spectacular_settings.SCHEMA_COERCE_PATH_PK_SUFFIX and parameter.endswith('_pk'): - parameter = f'{parameter[:-3]}_id' - - if parameter != variable: - continue - # RE also matches untyped patterns (e.g. "") - if not converter: - return None - - # special handling for drf_format_suffix - if converter.startswith('drf_format_suffix_'): - explicit_formats = converter[len('drf_format_suffix_'):].split('_') - enum_values = [ - f'.{suffix}' for suffix in explicit_formats if suffix in available_formats - ] - converter = 'drf_format_suffix' - elif converter == 'drf_format_suffix': - enum_values = [f'.{suffix}' for suffix in available_formats] - - if converter in spectacular_settings.PATH_CONVERTER_OVERRIDES: - override = spectacular_settings.PATH_CONVERTER_OVERRIDES[converter] - if is_basic_type(override): - schema = build_basic_type(override) - elif isinstance(override, dict): - schema = dict(override) - else: - warn( - f'Unable to use path converter override for "{converter}". ' - f'Please refer to the documentation on how to use this.' - ) - return None - elif converter in DJANGO_PATH_CONVERTER_MAPPING: - schema = build_basic_type(DJANGO_PATH_CONVERTER_MAPPING[converter]) - elif converter in registered_converters: - # gracious fallback for custom converters that have no override specified. - schema = build_basic_type(OpenApiTypes.STR) - schema['pattern'] = anchor_pattern(registered_converters[converter].regex) - else: - error(f'Encountered path converter "{converter}" that is unknown to Django.') - return None - - return build_parameter_type( - name=variable, - schema=schema, - location=OpenApiParameter.PATH, - enum=enum_values, - ) - - return None - - -def resolve_regex_path_parameter(path_regex, variable): - """ - convert regex path parameter to OpenAPI parameter, if pattern is - explicitly chosen and not the generic non-empty default '[^/.]+'. - """ - for parameter, pattern in analyze_named_regex_pattern(path_regex).items(): - if api_settings.SCHEMA_COERCE_PATH_PK and parameter == 'pk': - parameter = 'id' - elif spectacular_settings.SCHEMA_COERCE_PATH_PK_SUFFIX and parameter.endswith('_pk'): - parameter = f'{parameter[:-3]}_id' - - if parameter != variable: - continue - # do not use default catch-all pattern and defer to model resolution - if pattern == '[^/.]+': - return None - - return build_parameter_type( - name=variable, - schema=build_basic_type(OpenApiTypes.STR), - pattern=anchor_pattern(pattern), - location=OpenApiParameter.PATH, - ) - - return None - - -def is_versioning_supported(versioning_class) -> bool: - return issubclass(versioning_class, ( - versioning.URLPathVersioning, - versioning.NamespaceVersioning, - versioning.AcceptHeaderVersioning - )) - - -def operation_matches_version(view, requested_version) -> bool: - try: - version, _ = view.determine_version(view.request, **view.kwargs) - except exceptions.NotAcceptable: - return False - else: - return str(version) == str(requested_version) - - -def modify_for_versioning(patterns, method, path, view, requested_version): - assert view.versioning_class and view.request - assert requested_version - - view.request.version = requested_version - - if issubclass(view.versioning_class, versioning.URLPathVersioning): - version_param = view.versioning_class.version_param - # substitute version variable to emulate request - path = uritemplate.partial(path, var_dict={version_param: requested_version}) - if isinstance(path, URITemplate): - path = path.uri - # emulate router behaviour by injecting substituted variable into view - view.kwargs[version_param] = requested_version - elif issubclass(view.versioning_class, versioning.NamespaceVersioning): - try: - view.request.resolver_match = get_resolver( - urlconf=detype_patterns(tuple(patterns)), - ).resolve(path) - except Resolver404: - error(f"namespace versioning path resolution failed for {path}. Path will be ignored.") - elif issubclass(view.versioning_class, versioning.AcceptHeaderVersioning): - # Append the version into request accepted_media_type. - # e.g "application/json; version=1.0" - # To allow the AcceptHeaderVersioning negotiator going through. - if not hasattr(view.request, 'accepted_renderer'): - # Probably a mock request, content negotiation was not performed, so, we do it now. - negotiated = view.perform_content_negotiation(view.request) - view.request.accepted_renderer, view.request.accepted_media_type = negotiated - media_type = _MediaType(view.request.accepted_media_type) - view.request.accepted_media_type = ( - f'{media_type.full_type}; {view.versioning_class.version_param}={requested_version}' - ) - - return path - - -def modify_media_types_for_versioning(view, media_types: List[str]) -> List[str]: - if ( - not view.versioning_class - or not issubclass(view.versioning_class, versioning.AcceptHeaderVersioning) - ): - return media_types - - media_type = _MediaType(view.request.accepted_media_type) - version = media_type.params.get(view.versioning_class.version_param) # type: ignore - version = unicode_http_header(version) - - if not version or version == view.versioning_class.default_version: - return media_types - - return [ - f'{media_type}; {view.versioning_class.version_param}={version}' - for media_type in media_types - ] - - -def analyze_named_regex_pattern(path: str) -> Dict[str, str]: - """ safely extract named groups and their pattern from given regex pattern """ - result = {} - stack = 0 - name_capture, name_buffer = False, '' - regex_capture, regex_buffer = False, '' - i = 0 - while i < len(path): - # estimate state at position i - skip = False - if path[i] == '\\': - ff = 2 - elif path[i:i + 4] == '(?P<': - skip = True - name_capture = True - ff = 4 - elif path[i] in '(' and regex_capture: - stack += 1 - ff = 1 - elif path[i] == '>' and name_capture: - assert name_buffer - name_capture = False - regex_capture = True - skip = True - ff = 1 - elif path[i] in ')' and regex_capture: - if not stack: - regex_capture = False - result[name_buffer] = regex_buffer - name_buffer, regex_buffer = '', '' - else: - stack -= 1 - ff = 1 - else: - ff = 1 - # fill buffer based on state - if name_capture and not skip: - name_buffer += path[i:i + ff] - elif regex_capture and not skip: - regex_buffer += path[i:i + ff] - i += ff - assert not stack - return result - - -@cache -def detype_patterns(patterns): - """Cache detyped patterns due to the expensive nature of rebuilding URLResolver.""" - return tuple(detype_pattern(pattern) for pattern in patterns) - - -def detype_pattern(pattern): - """ - return an equivalent pattern that accepts arbitrary values for path parameters. - de-typing the path will ease determining a matching route without having properly - formatted dummy values for all path parameters. - """ - if isinstance(pattern, URLResolver): - return URLResolver( - pattern=detype_pattern(pattern.pattern), - urlconf_name=[detype_pattern(p) for p in pattern.url_patterns], - default_kwargs=pattern.default_kwargs, - app_name=pattern.app_name, - namespace=pattern.namespace, - ) - elif isinstance(pattern, URLPattern): - return URLPattern( - pattern=detype_pattern(pattern.pattern), - callback=pattern.callback, - default_args=pattern.default_args, - name=pattern.name, - ) - elif isinstance(pattern, RoutePattern): - return RoutePattern( - route=re.sub(r'<\w+:(\w+)>', r'<\1>', pattern._route), - name=pattern.name, - is_endpoint=pattern._is_endpoint - ) - elif isinstance(pattern, RegexPattern): - detyped_regex = pattern._regex - for name, regex in analyze_named_regex_pattern(pattern._regex).items(): - detyped_regex = detyped_regex.replace( - f'(?P<{name}>{regex})', - f'(?P<{name}>[^/]+)', - ) - return RegexPattern( - regex=detyped_regex, - name=pattern.name, - is_endpoint=pattern._is_endpoint - ) - else: - warn(f'unexpected pattern "{pattern}" encountered while simplifying urlpatterns.') - return pattern - - -def normalize_result_object(result): - """ resolve non-serializable objects like lazy translation strings and OrderedDict """ - if isinstance(result, dict) or isinstance(result, OrderedDict): - return {k: normalize_result_object(v) for k, v in result.items()} - if isinstance(result, list) or isinstance(result, tuple): - return [normalize_result_object(v) for v in result] - if isinstance(result, Promise): - return str(result) - for base_type in [bool, int, float, str]: - if isinstance(result, base_type): - return base_type(result) # coerce basic sub types - return result - - -def sanitize_result_object(result): - # warn about and resolve operationId collisions with suffixes - operations = defaultdict(list) - for path, methods in result['paths'].items(): - for method, operation in methods.items(): - operations[operation['operationId']].append((path, method)) - for operation_id, paths in operations.items(): - if len(paths) == 1: - continue - warn(f'operationId "{operation_id}" has collisions {paths}. resolving with numeral suffixes.') - for idx, (path, method) in enumerate(sorted(paths)[1:], start=2): - suffix = str(idx) if spectacular_settings.CAMELIZE_NAMES else f'_{idx}' - result['paths'][path][method]['operationId'] += suffix - - return result - - -def sanitize_specification_extensions(extensions): - # https://spec.openapis.org/oas/v3.0.3#specification-extensions - output = {} - for key, value in extensions.items(): - if not re.match(r'^x-', key): - warn(f'invalid extension {key!r}. vendor extensions must start with "x-"') - else: - output[key] = value - return output - - -def camelize_operation(path, operation): - for path_variable in re.findall(r'\{(\w+)\}', path): - path = path.replace( - f'{{{path_variable}}}', - f'{{{inflection.camelize(path_variable, False)}}}' - ) - - for parameter in operation.get('parameters', []): - if parameter['in'] == OpenApiParameter.PATH: - parameter['name'] = inflection.camelize(parameter['name'], False) - - operation['operationId'] = inflection.camelize(operation['operationId'], False) - - return path, operation - - -def build_mock_request(method, path, view, original_request, **kwargs): - """ build a mocked request and use original request as reference if available """ - request = getattr(APIRequestFactory(), method.lower())(path=path) - request = view.initialize_request(request) - if original_request: - request.user = original_request.user - request.auth = original_request.auth - # ignore headers related to authorization as it has been handled above. - # also ignore ACCEPT as the MIME type refers to SpectacularAPIView and the - # version (if available) has already been processed by SpectacularAPIView. - for name, value in original_request.META.items(): - if not name.startswith('HTTP_'): - continue - if name in ['HTTP_ACCEPT', 'HTTP_COOKIE', 'HTTP_AUTHORIZATION']: - continue - request.META[name] = value - return request - - -def set_query_parameters(url, **kwargs) -> str: - """ deconstruct url, safely attach query parameters in kwargs, and serialize again """ - url = str(url) # Force evaluation of reverse_lazy urls - scheme, netloc, path, params, query, fragment = urllib.parse.urlparse(url) - query = urllib.parse.parse_qs(query) - query.update({k: v for k, v in kwargs.items() if v is not None}) - query = urllib.parse.urlencode(query, doseq=True) - return urllib.parse.urlunparse((scheme, netloc, path, params, query, fragment)) - - -def get_relative_url(url: str) -> str: - url = str(url) # Force evaluation of reverse_lazy urls - scheme, netloc, path, params, query, fragment = urllib.parse.urlparse(url) - return urllib.parse.urlunparse(('', '', path, params, query, fragment)) - - -def _get_type_hint_origin(hint): - """ graceful fallback for py 3.8 typing functionality """ - if sys.version_info >= (3, 8): - return typing.get_origin(hint), typing.get_args(hint) - else: - origin = getattr(hint, '__origin__', None) - args = getattr(hint, '__args__', None) - origin = { - typing.List: list, - typing.Dict: dict, - typing.Tuple: tuple, - typing.Set: set, - typing.FrozenSet: frozenset - }.get(origin, origin) - return origin, args - - -def _resolve_typeddict(hint): - """resolve required fields for TypedDicts if on 3.9 or above""" - required = None - - if hasattr(hint, '__required_keys__'): - required = [h for h in hint.__required_keys__] - - return build_object_type( - properties={ - k: resolve_type_hint(v) for k, v in get_type_hints(hint).items() - }, - required=required, - description=get_doc(hint), - ) - - -def is_higher_order_type_hint(hint) -> bool: - return isinstance(hint, ( - getattr(types, 'GenericAlias', _Sentinel), - getattr(types, 'UnionType', _Sentinel), - getattr(typing, '_GenericAlias', _Sentinel), - getattr(typing, '_UnionGenericAlias', _Sentinel), - )) - - -def resolve_type_hint(hint): - """ resolve return value type hints to schema """ - origin, args = _get_type_hint_origin(hint) - - if origin is None and is_basic_type(hint, allow_none=False): - return build_basic_type(hint) - elif origin is None and inspect.isclass(hint) and issubclass(hint, tuple): - # a convoluted way to catch NamedTuple. suggestions welcome. - if get_type_hints(hint): - properties = {k: resolve_type_hint(v) for k, v in get_type_hints(hint).items()} - else: - properties = {k: build_basic_type(OpenApiTypes.ANY) for k in hint._fields} - return build_object_type(properties=properties, required=properties.keys()) - elif origin is list or hint is list or hint is ReturnList: - return build_array_type( - resolve_type_hint(args[0]) if args else build_basic_type(OpenApiTypes.ANY) - ) - elif origin is tuple: - return build_array_type( - schema=build_basic_type(args[0]), - max_length=len(args), - min_length=len(args), - ) - elif origin is dict or origin is defaultdict or origin is OrderedDict or hint is ReturnDict: - schema = build_basic_type(OpenApiTypes.OBJECT) - if args and args[1] is not typing.Any: - schema['additionalProperties'] = resolve_type_hint(args[1]) - return schema - elif origin is set: - return build_array_type(resolve_type_hint(args[0])) - elif origin is frozenset: - return build_array_type(resolve_type_hint(args[0])) - elif origin in LITERAL_TYPES: - # Literal only works for python >= 3.8 despite typing_extensions, because it - # behaves slightly different w.r.t. __origin__ - schema = {'enum': list(args)} - if all(type(args[0]) is type(choice) for choice in args): - schema.update(build_basic_type(type(args[0]))) - return schema - elif inspect.isclass(hint) and issubclass(hint, Enum): - schema = {'enum': [item.value for item in hint]} - mixin_base_types = [t for t in hint.__mro__ if is_basic_type(t)] - if mixin_base_types: - schema.update(build_basic_type(mixin_base_types[0])) - return schema - elif isinstance(hint, TYPED_DICT_META_TYPES): - return _resolve_typeddict(hint) - elif isinstance(hint, TYPE_ALIAS_TYPES): - return resolve_type_hint(hint.__value__) - elif origin in UNION_TYPES: - type_args = [arg for arg in args if arg is not type(None)] # noqa: E721 - if len(type_args) > 1: - schema = {'oneOf': [resolve_type_hint(arg) for arg in type_args]} - else: - schema = resolve_type_hint(type_args[0]) - if type(None) in args: - schema['nullable'] = True - return schema - elif origin is collections.abc.Iterable: - return build_array_type(resolve_type_hint(args[0])) - else: - raise UnableToProceedError(hint) - - -def whitelisted(obj: object, classes: Optional[List[Type[object]]], exact=False) -> bool: - if classes is None: - return True - if exact: - return obj.__class__ in classes - else: - return isinstance(obj, tuple(classes)) - - -def build_mocked_view(method: str, path: str, extend_schema_decorator, registry): - from rest_framework import parsers, views - - @extend_schema_decorator - class TmpView(views.APIView): - parser_classes = [parsers.JSONParser] - - # emulate what Generator would do to setup schema generation. - view_callable = TmpView.as_view() - view: views.APIView = view_callable.cls() - view.request = spectacular_settings.GET_MOCK_REQUEST( - method.upper(), path, view, None - ) - view.kwargs = {} - # prepare AutoSchema with "init" values as if get_operation() was called - schema: Any = view.schema - schema.registry = registry - schema.path = path - schema.path_regex = path - schema.path_prefix = '' - schema.method = method.upper() - return view - - -def build_listed_example_value(value: Any, paginator, direction): - if not paginator or direction == 'request': - return [value] - - sentinel = object() - schema = paginator.get_paginated_response_schema(sentinel) - - if schema is sentinel: - return [value] - - def drilldown_schema_example(schema, sentinel): - # Recursively travel schema properties to build example. - if schema is sentinel: - return [value] - if 'properties' in schema.keys(): - return { - field_name: drilldown_schema_example(field_schema, sentinel) - for field_name, field_schema in schema['properties'].items() - } - return schema['example'] - - try: - return drilldown_schema_example(schema, sentinel) - except (AttributeError, KeyError): - warn( - f"OpenApiExample could not be paginated because {paginator.__class__} either " - f"has an unknown schema structure or the individual pagination fields did not " - f"provide example values themselves. Using the plain example value as fallback." - ) - return value - - -def filter_supported_arguments(func, **kwargs): - sig = inspect.signature(func) - return { - arg: val for arg, val in kwargs.items() if arg in sig.parameters - } - - -def build_serializer_context(view) -> typing.Dict[str, Any]: - try: - return view.get_serializer_context() - except: # noqa - return {'request': view.request} - - -def process_webhooks(webhooks: List[OpenApiWebhook], registry: ComponentRegistry): - """ - Creates a mocked view for every webhook. The given extend_schema decorator then - specifies the expectations on the receiving end of the callback. Effectively - simulates a sub-schema from the opposing perspective via a virtual view definition. - """ - result = {} - - for webhook in webhooks: - if isinstance(webhook.decorator, dict): - methods = webhook.decorator - else: - methods = {'post': webhook.decorator} - - path_items = {} - - for method, decorator in methods.items(): - # a dict indicates a raw schema; use directly - if isinstance(decorator, dict): - path_items[method.lower()] = decorator - continue - - mocked_view = build_mocked_view( - method=method, - path="/", - extend_schema_decorator=decorator, - registry=registry, - ) - operation = {} - - description = mocked_view.schema.get_description() - if description: - operation['description'] = description - - summary = mocked_view.schema.get_summary() - if summary: - operation['summary'] = summary - - tags = mocked_view.schema.get_tags() - if tags: - operation['tags'] = tags - - request_body = mocked_view.schema._get_request_body('response') - if request_body: - operation['requestBody'] = request_body - - deprecated = mocked_view.schema.is_deprecated() - if deprecated: - operation['deprecated'] = deprecated - - operation['responses'] = mocked_view.schema._get_response_bodies('request') - - extensions = mocked_view.schema.get_extensions() - if extensions: - operation.update(sanitize_specification_extensions(extensions)) - - path_items[method.lower()] = operation - - result[webhook.name] = path_items - - return result diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/py.typed b/.venv/lib/python3.10/site-packages/drf_spectacular/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/renderers.py b/.venv/lib/python3.10/site-packages/drf_spectacular/renderers.py deleted file mode 100644 index 949331b..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/renderers.py +++ /dev/null @@ -1,82 +0,0 @@ -from collections import OrderedDict -from datetime import time, timedelta -from decimal import Decimal -from uuid import UUID - -import yaml -from django.utils.safestring import SafeString -from rest_framework.exceptions import ErrorDetail -from rest_framework.renderers import BaseRenderer, JSONRenderer - - -class OpenApiYamlRenderer(BaseRenderer): - media_type = 'application/vnd.oai.openapi' - format = 'yaml' - - def render(self, data, accepted_media_type=None, renderer_context=None): - # disable yaml advanced feature 'alias' for clean, portable, and readable output - class Dumper(yaml.SafeDumper): - def ignore_aliases(self, data): - return True - - def error_detail_representer(dumper, data): - return dumper.represent_dict({'string': str(data), 'code': data.code}) - Dumper.add_representer(ErrorDetail, error_detail_representer) - - def multiline_str_representer(dumper, data): - scalar = dumper.represent_str(data) - scalar.style = '|' if '\n' in data else None - return scalar - Dumper.add_representer(str, multiline_str_representer) - - def decimal_representer(dumper, data): - # prevent emitting "!! float" tags on fractionless decimals - value = f'{data:f}' - if '.' in value: - return dumper.represent_scalar('tag:yaml.org,2002:float', value) - else: - return dumper.represent_scalar('tag:yaml.org,2002:int', value) - Dumper.add_representer(Decimal, decimal_representer) - - def timedelta_representer(dumper, data): - return dumper.represent_str(str(data.total_seconds())) - Dumper.add_representer(timedelta, timedelta_representer) - - def time_representer(dumper, data): - return dumper.represent_str(data.isoformat()) - Dumper.add_representer(time, time_representer) - - def uuid_representer(dumper, data): - return dumper.represent_str(str(data)) - Dumper.add_representer(UUID, uuid_representer) - - def safestring_representer(dumper, data): - return dumper.represent_str(data) - Dumper.add_representer(SafeString, safestring_representer) - - def ordereddict_representer(dumper, data): - return dumper.represent_dict(dict(data)) - Dumper.add_representer(OrderedDict, ordereddict_representer) - - return yaml.dump( - data, - default_flow_style=False, - sort_keys=False, - allow_unicode=True, - Dumper=Dumper - ).encode('utf-8') - - -class OpenApiYamlRenderer2(OpenApiYamlRenderer): - media_type = 'application/yaml' - - -class OpenApiJsonRenderer(JSONRenderer): - media_type = 'application/vnd.oai.openapi+json' - - def get_indent(self, accepted_media_type, renderer_context): - return super().get_indent(accepted_media_type, renderer_context) or 4 - - -class OpenApiJsonRenderer2(OpenApiJsonRenderer): - media_type = 'application/json' diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/serializers.py b/.venv/lib/python3.10/site-packages/drf_spectacular/serializers.py deleted file mode 100644 index 5721abe..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/serializers.py +++ /dev/null @@ -1,94 +0,0 @@ -from drf_spectacular.drainage import error, warn -from drf_spectacular.extensions import OpenApiSerializerExtension -from drf_spectacular.plumbing import force_instance, is_list_serializer, is_serializer - - -class PolymorphicProxySerializerExtension(OpenApiSerializerExtension): - target_class = 'drf_spectacular.utils.PolymorphicProxySerializer' - priority = -1 - - def get_name(self): - return self.target.component_name - - def map_serializer(self, auto_schema, direction): - """ custom handling for @extend_schema's injection of PolymorphicProxySerializer """ - if isinstance(self.target.serializers, dict): - sub_components = self._get_explicit_sub_components(auto_schema, direction) - else: - sub_components = self._get_implicit_sub_components(auto_schema, direction) - - if not self._has_discriminator(): - return {'oneOf': [schema for _, schema in sub_components]} - else: - one_of_list = [] - for _, schema in sub_components: - if schema not in one_of_list: - one_of_list.append(schema) - return { - 'oneOf': one_of_list, - 'discriminator': { - 'propertyName': self.target.resource_type_field_name, - 'mapping': {resource_type: schema['$ref'] for resource_type, schema in sub_components} - } - } - - def _get_implicit_sub_components(self, auto_schema, direction): - sub_components = [] - for sub_serializer in self.target.serializers: - sub_serializer = self._prep_serializer(sub_serializer) - (resolved_name, resolved_schema) = self._process_serializer(auto_schema, sub_serializer, direction) - if not resolved_schema: - continue - - if not self._has_discriminator(): - sub_components.append((None, resolved_schema)) - else: - try: - discriminator_field = sub_serializer.fields[self.target.resource_type_field_name] - resource_type = discriminator_field.to_representation(None) - except: # noqa: E722 - warn( - f'sub-serializer {resolved_name} of {self.target.component_name} ' - f'must contain the discriminator field "{self.target.resource_type_field_name}". ' - f'defaulting to sub-serializer name, but schema will likely not match the API.' - ) - resource_type = resolved_name - sub_components.append((resource_type, resolved_schema)) - - return sub_components - - def _get_explicit_sub_components(self, auto_schema, direction): - sub_components = [] - for resource_type, sub_serializer in self.target.serializers.items(): - sub_serializer = self._prep_serializer(sub_serializer) - (_, resolved_schema) = self._process_serializer(auto_schema, sub_serializer, direction) - if resolved_schema: - sub_components.append((resource_type, resolved_schema)) - - return sub_components - - def _has_discriminator(self): - return self.target.resource_type_field_name is not None - - def _prep_serializer(self, serializer): - serializer = force_instance(serializer) - serializer.partial = self.target.partial - return serializer - - def _process_serializer(self, auto_schema, serializer, direction): - if is_list_serializer(serializer): - if self._has_discriminator() or self.target._many is not False: - warn( - "To control sub-serializer's \"many\" attribute, following usage pattern is necessary: " - "PolymorphicProxySerializer(serializers=[...], resource_type_field_name=None, " - "many=False). Ignoring serializer as it is not processable in this configuration." - ) - return None, None - schema = auto_schema._unwrap_list_serializer(serializer, direction) - return None, schema - elif is_serializer(serializer): - resolved = auto_schema.resolve_serializer(serializer, direction) - return (resolved.name, resolved.ref) if resolved else (None, None) - else: - error("PolymorphicProxySerializer's serializer argument contained unknown objects.") - return None, None diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/settings.py b/.venv/lib/python3.10/site-packages/drf_spectacular/settings.py deleted file mode 100644 index 075f3c2..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/settings.py +++ /dev/null @@ -1,288 +0,0 @@ -from contextlib import contextmanager -from typing import Any, Dict - -from django.conf import settings -from rest_framework.settings import APISettings, perform_import - -SPECTACULAR_DEFAULTS: Dict[str, Any] = { - # A regex specifying the common denominator for all operation paths. If - # SCHEMA_PATH_PREFIX is set to None, drf-spectacular will attempt to estimate - # a common prefix. Use '' to disable. - # Mainly used for tag extraction, where paths like '/api/v1/albums' with - # a SCHEMA_PATH_PREFIX regex '/api/v[0-9]' would yield the tag 'albums'. - 'SCHEMA_PATH_PREFIX': None, - # Remove matching SCHEMA_PATH_PREFIX from operation path. Usually used in - # conjunction with appended prefixes in SERVERS. - 'SCHEMA_PATH_PREFIX_TRIM': False, - # Insert a manual path prefix to the operation path, e.g. '/service/backend'. - # Use this for example to align paths when the API is mounted as a sub-resource - # behind a proxy and Django is not aware of that. Alternatively, prefixes can - # also specified via SERVERS, but this makes the operation path more explicit. - 'SCHEMA_PATH_PREFIX_INSERT': '', - # Coercion of {pk} to {id} is controlled by SCHEMA_COERCE_PATH_PK. Additionally, - # some libraries (e.g. drf-nested-routers) use "_pk" suffixed path variables. - # This setting globally coerces path variables like "{user_pk}" to "{user_id}". - 'SCHEMA_COERCE_PATH_PK_SUFFIX': False, - - # Schema generation parameters to influence how components are constructed. - # Some schema features might not translate well to your target. - # Demultiplexing/modifying components might help alleviate those issues. - 'DEFAULT_GENERATOR_CLASS': 'drf_spectacular.generators.SchemaGenerator', - # Create separate components for PATCH endpoints (without required list) - 'COMPONENT_SPLIT_PATCH': True, - # Split components into request and response parts where appropriate - # This setting is highly recommended to achieve the most accurate API - # description, however it comes at the cost of having more components. - 'COMPONENT_SPLIT_REQUEST': False, - # Aid client generator targets that have trouble with read-only properties. - 'COMPONENT_NO_READ_ONLY_REQUIRED': False, - - # Adds "minLength: 1" to fields that do not allow blank strings. Deactivated - # by default because serializers do not strictly enforce this on responses and - # so "minLength: 1" may not always accurately describe API behavior. - # Gets implicitly enabled by COMPONENT_SPLIT_REQUEST, because this can be - # accurately modeled when request and response components are separated. - 'ENFORCE_NON_BLANK_FIELDS': False, - - # This version string will end up the in schema header. The default OpenAPI - # version is 3.0.3, which is heavily tested. We now also support 3.1.0, - # which contains the same features and a few mandatory, but minor changes. - 'OAS_VERSION': '3.0.3', - - # Configuration for serving a schema subset with SpectacularAPIView - 'SERVE_URLCONF': None, - # complete public schema or a subset based on the requesting user - 'SERVE_PUBLIC': True, - # include schema endpoint into schema - 'SERVE_INCLUDE_SCHEMA': True, - # list of authentication/permission classes for spectacular's views. - 'SERVE_PERMISSIONS': ['rest_framework.permissions.AllowAny'], - # None will default to DRF's AUTHENTICATION_CLASSES - 'SERVE_AUTHENTICATION': None, - - # Dictionary of general configuration to pass to the SwaggerUI({ ... }) - # https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/ - # The settings are serialized with json.dumps(). If you need customized JS, use a - # string instead. The string must then contain valid JS and is passed unchanged. - 'SWAGGER_UI_SETTINGS': { - 'deepLinking': True, - }, - # Initialize SwaggerUI with additional OAuth2 configuration. - # https://swagger.io/docs/open-source-tools/swagger-ui/usage/oauth2/ - 'SWAGGER_UI_OAUTH2_CONFIG': {}, - - # Dictionary of general configuration to pass to the Redoc.init({ ... }) - # https://redocly.com/docs/redoc/config/#functional-settings - # The settings are serialized with json.dumps(). If you need customized JS, use a - # string instead. The string must then contain valid JS and is passed unchanged. - 'REDOC_UI_SETTINGS': {}, - - # CDNs for swagger and redoc. You can change the version or even host your - # own depending on your requirements. For self-hosting, have a look at - # the sidecar option in the README. - 'SWAGGER_UI_DIST': 'https://cdn.jsdelivr.net/npm/swagger-ui-dist@latest', - 'SWAGGER_UI_FAVICON_HREF': 'https://cdn.jsdelivr.net/npm/swagger-ui-dist@latest/favicon-32x32.png', - 'REDOC_DIST': 'https://cdn.jsdelivr.net/npm/redoc@latest', - - # Append OpenAPI objects to path and components in addition to the generated objects - 'APPEND_PATHS': {}, - 'APPEND_COMPONENTS': {}, - - # STRONGLY DISCOURAGED (with the exception for the djangorestframework-api-key library) - # please don't use this anymore as it has tricky implications that - # are hard to get right. For authentication, OpenApiAuthenticationExtension are - # strongly preferred because they are more robust and easy to write. - # However if used, the list of methods is appended to every endpoint in the schema! - 'SECURITY': [], - - # Postprocessing functions that run at the end of schema generation. - # must satisfy interface result = hook(generator, request, public, result) - 'POSTPROCESSING_HOOKS': [ - 'drf_spectacular.hooks.postprocess_schema_enums' - ], - - # Preprocessing functions that run before schema generation. - # must satisfy interface result = hook(endpoints=result) where result - # is a list of Tuples (path, path_regex, method, callback). - # Example: 'drf_spectacular.hooks.preprocess_exclude_path_format' - 'PREPROCESSING_HOOKS': [], - - # Determines how operations should be sorted. If you intend to do sorting with a - # PREPROCESSING_HOOKS, be sure to disable this setting. If configured, the sorting - # is applied after the PREPROCESSING_HOOKS. Accepts either - # True (drf-spectacular's alpha-sorter), False, or a callable for sort's key arg. - 'SORT_OPERATIONS': True, - - # enum name overrides. dict with keys "YourEnum" and their choice values "field.choices" - # e.g. {'SomeEnum': ['A', 'B'], 'OtherEnum': 'import.path.to.choices'} - 'ENUM_NAME_OVERRIDES': {}, - # Adds "blank" and "null" enum choices where appropriate. disable on client generation issues - 'ENUM_ADD_EXPLICIT_BLANK_NULL_CHOICE': True, - # Add/Append a list of (``choice value`` - choice name) to the enum description string. - 'ENUM_GENERATE_CHOICE_DESCRIPTION': True, - # Optional suffix for generated enum. - # e.g. {'ENUM_SUFFIX': "Type"} would produce an enum name 'StatusType'. - 'ENUM_SUFFIX': 'Enum', - - # function that returns a list of all classes that should be excluded from doc string extraction - 'GET_LIB_DOC_EXCLUDES': 'drf_spectacular.plumbing.get_lib_doc_excludes', - - # Function that returns a mocked request for view processing. For CLI usage - # original_request will be None. - # interface: request = build_mock_request(method, path, view, original_request, **kwargs) - 'GET_MOCK_REQUEST': 'drf_spectacular.plumbing.build_mock_request', - - # Camelize names like "operationId" and path parameter names - # Camelization of the operation schema itself requires the addition of - # 'drf_spectacular.contrib.djangorestframework_camel_case.camelize_serializer_fields' - # to POSTPROCESSING_HOOKS. Please note that the hook depends on - # ``djangorestframework_camel_case``, while CAMELIZE_NAMES itself does not. - 'CAMELIZE_NAMES': False, - - # Changes the location of the action/method on the generated OperationId. For example, - # "POST": "group_person_list", "group_person_create" - # "PRE": "list_group_person", "create_group_person" - 'OPERATION_ID_METHOD_POSITION': 'POST', - - # Determines if and how free-form 'additionalProperties' should be emitted in the schema. Some - # code generator targets are sensitive to this. None disables generic 'additionalProperties'. - # allowed values are 'dict', 'bool', None - 'GENERIC_ADDITIONAL_PROPERTIES': 'dict', - - # Path converter schema overrides (e.g. ). Can be used to either modify default - # behavior or provide a schema for custom converters registered with register_converter(...). - # Takes converter labels as keys and either basic python types, OpenApiType, or raw schemas - # as values. Example: {'aint': OpenApiTypes.INT, 'bint': str, 'cint': {'type': ...}} - 'PATH_CONVERTER_OVERRIDES': {}, - - # Determines whether operation parameters should be sorted alphanumerically or just in - # the order they arrived. Accepts either True, False, or a callable for sort's key arg. - 'SORT_OPERATION_PARAMETERS': True, - - # @extend_schema allows to specify status codes besides 200. This functionality is usually used - # to describe error responses, which rarely make use of list mechanics. Therefore, we suppress - # listing (pagination and filtering) on non-2XX status codes by default. Toggle this to enable - # list responses with ListSerializers/many=True irrespective of the status code. - 'ENABLE_LIST_MECHANICS_ON_NON_2XX': False, - - # This setting allows you to deviate from the default manager by accessing a different model - # property. We use "objects" by default for compatibility reasons. Using "_default_manager" - # will likely fix most issues, though you are free to choose any name. - "DEFAULT_QUERY_MANAGER": 'objects', - - # Controls which authentication methods are exposed in the schema. If not None, will hide - # authentication classes that are not contained in the whitelist. Use full import paths - # like ['rest_framework.authentication.TokenAuthentication', ...]. - # Empty list ([]) will hide all authentication methods. The default None will show all. - 'AUTHENTICATION_WHITELIST': None, - # Controls which parsers are exposed in the schema. Works analog to AUTHENTICATION_WHITELIST. - # List of allowed parsers or None to allow all. - 'PARSER_WHITELIST': None, - # Controls which renderers are exposed in the schema. Works analog to AUTHENTICATION_WHITELIST. - # rest_framework.renderers.BrowsableAPIRenderer is ignored by default if whitelist is None - 'RENDERER_WHITELIST': None, - - # Option for turning off error and warn messages - 'DISABLE_ERRORS_AND_WARNINGS': False, - - # Runs exemplary schema generation and emits warnings as part of "./manage.py check --deploy" - 'ENABLE_DJANGO_DEPLOY_CHECK': True, - - # General schema metadata. Refer to spec for valid inputs - # https://spec.openapis.org/oas/v3.0.3#openapi-object - 'TITLE': '', - 'DESCRIPTION': '', - 'TOS': None, - # Optional: MAY contain "name", "url", "email" - 'CONTACT': {}, - # Optional: MUST contain "name", MAY contain URL - 'LICENSE': {}, - # Statically set schema version. May also be an empty string. When used together with - # view versioning, will become '0.0.0 (v2)' for 'v2' versioned requests. - # Set VERSION to None if only the request version should be rendered. - 'VERSION': '0.0.0', - # Optional list of servers. - # Each entry MUST contain "url", MAY contain "description", "variables" - # e.g. [{'url': 'https://example.com/v1', 'description': 'Text'}, ...] - 'SERVERS': [], - # Tags defined in the global scope - 'TAGS': [], - # Optional: List of OpenAPI 3.1 webhooks. Each entry should be an import path to an - # OpenApiWebhook instance. - 'WEBHOOKS': [], - # Optional: MUST contain 'url', may contain "description" - 'EXTERNAL_DOCS': {}, - - # Arbitrary specification extensions attached to the schema's info object. - # https://swagger.io/specification/#specification-extensions - 'EXTENSIONS_INFO': {}, - - # Arbitrary specification extensions attached to the schema's root object. - # https://swagger.io/specification/#specification-extensions - 'EXTENSIONS_ROOT': {}, - - # Oauth2 related settings. used for example by django-oauth2-toolkit. - # https://spec.openapis.org/oas/v3.0.3#oauth-flows-object - 'OAUTH2_FLOWS': [], - 'OAUTH2_AUTHORIZATION_URL': None, - 'OAUTH2_TOKEN_URL': None, - 'OAUTH2_REFRESH_URL': None, - 'OAUTH2_SCOPES': None, -} - -IMPORT_STRINGS = [ - 'DEFAULT_GENERATOR_CLASS', - 'SERVE_AUTHENTICATION', - 'SERVE_PERMISSIONS', - 'POSTPROCESSING_HOOKS', - 'PREPROCESSING_HOOKS', - 'GET_LIB_DOC_EXCLUDES', - 'GET_MOCK_REQUEST', - 'SORT_OPERATIONS', - 'SORT_OPERATION_PARAMETERS', - 'AUTHENTICATION_WHITELIST', - 'RENDERER_WHITELIST', - 'PARSER_WHITELIST', - 'WEBHOOKS', -] - - -class SpectacularSettings(APISettings): - _original_settings: Dict[str, Any] = {} - - def apply_patches(self, patches): - for attr, val in patches.items(): - if attr.startswith('SERVE_') or attr == 'DEFAULT_GENERATOR_CLASS': - raise AttributeError( - f'{attr} not allowed in custom_settings. use dedicated parameter instead.' - ) - if attr in self.import_strings: - val = perform_import(val, attr) - # load and store original value, then override __dict__ entry - self._original_settings[attr] = getattr(self, attr) - setattr(self, attr, val) - - def clear_patches(self): - for attr, orig_val in self._original_settings.items(): - setattr(self, attr, orig_val) - self._original_settings = {} - - -spectacular_settings = SpectacularSettings( - user_settings=getattr(settings, 'SPECTACULAR_SETTINGS', {}), # type: ignore - defaults=SPECTACULAR_DEFAULTS, # type: ignore - import_strings=IMPORT_STRINGS, -) - - -@contextmanager -def patched_settings(patches): - """ temporarily patch the global spectacular settings (or do nothing) """ - if not patches: - yield - else: - try: - spectacular_settings.apply_patches(patches) - yield - finally: - spectacular_settings.clear_patches() diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/templates/drf_spectacular/redoc.html b/.venv/lib/python3.10/site-packages/drf_spectacular/templates/drf_spectacular/redoc.html deleted file mode 100644 index cfe8e8b..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/templates/drf_spectacular/redoc.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - {% block head %} - {{ title|default:"Redoc" }} - - - - - - - {% endblock head %} - - - {% block body %} - {% if settings %} -
    - - - {% else %} - - - {% endif %} - {% endblock body %} - - diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/templates/drf_spectacular/swagger_ui.html b/.venv/lib/python3.10/site-packages/drf_spectacular/templates/drf_spectacular/swagger_ui.html deleted file mode 100644 index 6908b71..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/templates/drf_spectacular/swagger_ui.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - {% block head %} - {{ title|default:"Swagger" }} - - - {% if favicon_href %}{% endif %} - - - {% endblock head %} - - - {% block body %} -
    - - - {% if script_url %} - - {% else %} - - {% endif %} - {% endblock %} - - diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/templates/drf_spectacular/swagger_ui.js b/.venv/lib/python3.10/site-packages/drf_spectacular/templates/drf_spectacular/swagger_ui.js deleted file mode 100644 index 0c9b954..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/templates/drf_spectacular/swagger_ui.js +++ /dev/null @@ -1,126 +0,0 @@ -"use strict"; - -const swaggerSettings = {{ settings|safe }}; -const schemaAuthNames = {{ schema_auth_names|safe }}; -let schemaAuthFailed = false; -const plugins = []; - -const reloadSchemaOnAuthChange = () => { - return { - statePlugins: { - auth: { - wrapActions: { - authorizeOauth2:(ori) => (...args) => { - schemaAuthFailed = false; - setTimeout(() => ui.specActions.download()); - return ori(...args); - }, - authorize: (ori) => (...args) => { - schemaAuthFailed = false; - setTimeout(() => ui.specActions.download()); - return ori(...args); - }, - logout: (ori) => (...args) => { - schemaAuthFailed = false; - setTimeout(() => ui.specActions.download()); - return ori(...args); - }, - }, - }, - }, - }; -}; - -if (schemaAuthNames.length > 0) { - plugins.push(reloadSchemaOnAuthChange); -} - -const uiInitialized = () => { - try { - ui; - return true; - } catch { - return false; - } -}; - -const isSchemaUrl = (url) => { - if (!uiInitialized()) { - return false; - } - return url === new URL(ui.getConfigs().url, document.baseURI).href; -}; - -const responseInterceptor = (response, ...args) => { - if (!response.ok && isSchemaUrl(response.url)) { - console.warn("schema request received '" + response.status + "'. disabling credentials for schema till logout."); - if (!schemaAuthFailed) { - // only retry once to prevent endless loop. - schemaAuthFailed = true; - setTimeout(() => ui.specActions.download()); - } - } - return response; -}; - -const injectAuthCredentials = (request) => { - let authorized; - if (uiInitialized()) { - const state = ui.getState().get("auth").get("authorized"); - if (state !== undefined && Object.keys(state.toJS()).length !== 0) { - authorized = state.toJS(); - } - } else if (![undefined, "{}"].includes(localStorage.authorized)) { - authorized = JSON.parse(localStorage.authorized); - } - if (authorized === undefined) { - return; - } - for (const authName of schemaAuthNames) { - const authDef = authorized[authName]; - if (authDef === undefined || authDef.schema === undefined) { - continue; - } - if (authDef.schema.type === "http" && authDef.schema.scheme === "bearer") { - request.headers["Authorization"] = "Bearer " + authDef.value; - return; - } else if (authDef.schema.type === "http" && authDef.schema.scheme === "basic") { - request.headers["Authorization"] = "Basic " + btoa(authDef.value.username + ":" + authDef.value.password); - return; - } else if (authDef.schema.type === "apiKey" && authDef.schema.in === "header") { - request.headers[authDef.schema.name] = authDef.value; - return; - } else if (authDef.schema.type === "oauth2" && authDef.token.token_type === "Bearer") { - request.headers["Authorization"] = `Bearer ${authDef.token.access_token}`; - return; - } - } -}; - -const requestInterceptor = (request, ...args) => { - if (request.loadSpec && schemaAuthNames.length > 0 && !schemaAuthFailed) { - try { - injectAuthCredentials(request); - } catch (e) { - console.error("schema auth injection failed with error: ", e); - } - } - // selectively omit adding headers to mitigate CORS issues. - if (!["GET", undefined].includes(request.method) && request.credentials === "same-origin") { - request.headers["{{ csrf_header_name }}"] = "{{ csrf_token }}"; - } - return request; -}; - -const ui = SwaggerUIBundle({ - url: "{{ schema_url|escapejs }}", - dom_id: "#swagger-ui", - presets: [SwaggerUIBundle.presets.apis], - plugins, - layout: "BaseLayout", - requestInterceptor, - responseInterceptor, - ...swaggerSettings, -}); - -{% if oauth2_config %}ui.initOAuth({{ oauth2_config|safe }});{% endif %} diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/types.py b/.venv/lib/python3.10/site-packages/drf_spectacular/types.py deleted file mode 100644 index 19fc88b..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/types.py +++ /dev/null @@ -1,177 +0,0 @@ -import enum -import typing -from datetime import date, datetime, time, timedelta -from decimal import Decimal -from ipaddress import IPv4Address, IPv6Address -from uuid import UUID - -_KnownPythonTypes = typing.Type[typing.Union[ - str, float, bool, bytes, int, dict, UUID, Decimal, datetime, date, time, - timedelta, IPv4Address, IPv6Address, -]] - - -class OpenApiTypes(enum.Enum): - """ - Basic types known to the OpenAPI specification or at least common format extension of it. - - - Use ``BYTE`` for base64-encoded data wrapped in a string - - Use ``BINARY`` for raw binary data - - Use ``OBJECT`` for arbitrary free-form object (usually a :py:class:`dict`) - """ - #: Converted to ``{"type": "number"}``. - NUMBER = enum.auto() - #: Converted to ``{"type": "number", "format": "float"}``. - #: Equivalent to :py:class:`float`. - FLOAT = enum.auto() - #: Converted to ``{"type": "number", "format": "double"}``. - DOUBLE = enum.auto() - #: Converted to ``{"type": "boolean"}``. - #: Equivalent to :py:class:`bool`. - BOOL = enum.auto() - #: Converted to ``{"type": "string"}``. - #: Equivalent to :py:class:`str`. - STR = enum.auto() - #: Converted to ``{"type": "string", "format": "byte"}``. - #: Use this for base64-encoded data wrapped in a string. - BYTE = enum.auto() - #: Converted to ``{"type": "string", "format": "binary"}``. - #: Equivalent to :py:class:`bytes`. - #: Use this for raw binary data. - BINARY = enum.auto() - #: Converted to ``{"type": "string", "format": "password"}``. - PASSWORD = enum.auto() - #: Converted to ``{"type": "integer"}``. - #: Equivalent to :py:class:`int`. - INT = enum.auto() - #: Converted to ``{"type": "integer", "format": "int32"}``. - INT32 = enum.auto() - #: Converted to ``{"type": "integer", "format": "int64"}``. - INT64 = enum.auto() - #: Converted to ``{"type": "string", "format": "uuid"}``. - #: Equivalent to :py:class:`~uuid.UUID`. - UUID = enum.auto() - #: Converted to ``{"type": "string", "format": "uri"}``. - URI = enum.auto() - #: Converted to ``{"type": "string", "format": "uri-reference"}``. - URI_REF = enum.auto() - #: Converted to ``{"type": "string", "format": "uri-template"}``. - URI_TPL = enum.auto() - #: Converted to ``{"type": "string", "format": "iri"}``. - IRI = enum.auto() - #: Converted to ``{"type": "string", "format": "iri-reference"}``. - IRI_REF = enum.auto() - #: Converted to ``{"type": "string", "format": "ipv4"}``. - #: Equivalent to :py:class:`~ipaddress.IPv4Address`. - IP4 = enum.auto() - #: Converted to ``{"type": "string", "format": "ipv6"}``. - #: Equivalent to :py:class:`~ipaddress.IPv6Address`. - IP6 = enum.auto() - #: Converted to ``{"type": "string", "format": "hostname"}``. - HOSTNAME = enum.auto() - #: Converted to ``{"type": "string", "format": "idn-hostname"}``. - IDN_HOSTNAME = enum.auto() - #: Converted to ``{"type": "number", "format": "double"}``. - #: The same as :py:attr:`~drf_spectacular.types.OpenApiTypes.DOUBLE`. - #: Equivalent to :py:class:`~decimal.Decimal`. - DECIMAL = enum.auto() - #: Converted to ``{"type": "string", "format": "date-time"}``. - #: Equivalent to :py:class:`~datetime.datetime`. - DATETIME = enum.auto() - #: Converted to ``{"type": "string", "format": "date"}``. - #: Equivalent to :py:class:`~datetime.date`. - DATE = enum.auto() - #: Converted to ``{"type": "string", "format": "time"}``. - #: Equivalent to :py:class:`~datetime.time`. - TIME = enum.auto() - #: Converted to ``{"type": "string", "format": "duration"}``. - #: Equivalent to :py:class:`~datetime.timedelta`. - #: Expressed according to ISO 8601. - DURATION = enum.auto() - #: Converted to ``{"type": "string", "format": "email"}``. - EMAIL = enum.auto() - #: Converted to ``{"type": "string", "format": "idn-email"}``. - IDN_EMAIL = enum.auto() - #: Converted to ``{"type": "string", "format": "json-pointer"}``. - JSON_PTR = enum.auto() - #: Converted to ``{"type": "string", "format": "relative-json-pointer"}``. - JSON_PTR_REL = enum.auto() - #: Converted to ``{"type": "string", "format": "regex"}``. - REGEX = enum.auto() - #: Converted to ``{"type": "object", ...}``. - #: Use this for arbitrary free-form objects (usually a :py:class:`dict`). - #: The ``additionalProperties`` item is added depending on the ``GENERIC_ADDITIONAL_PROPERTIES`` setting. - OBJECT = enum.auto() - #: Equivalent to :py:data:`None`. - #: This signals that the request or response is empty. - NONE = enum.auto() - #: Converted to ``{}`` which sets no type and format. - #: Equivalent to :py:class:`typing.Any`. - ANY = enum.auto() - - -# make a copy with dict() before modifying returned dict -OPENAPI_TYPE_MAPPING = { - OpenApiTypes.NUMBER: {'type': 'number'}, - OpenApiTypes.FLOAT: {'type': 'number', 'format': 'float'}, - OpenApiTypes.DOUBLE: {'type': 'number', 'format': 'double'}, - OpenApiTypes.BOOL: {'type': 'boolean'}, - OpenApiTypes.STR: {'type': 'string'}, - OpenApiTypes.BYTE: {'type': 'string', 'format': 'byte'}, - OpenApiTypes.BINARY: {'type': 'string', 'format': 'binary'}, - OpenApiTypes.PASSWORD: {'type': 'string', 'format': 'password'}, - OpenApiTypes.INT: {'type': 'integer'}, - OpenApiTypes.INT32: {'type': 'integer', 'format': 'int32'}, - OpenApiTypes.INT64: {'type': 'integer', 'format': 'int64'}, - OpenApiTypes.UUID: {'type': 'string', 'format': 'uuid'}, - OpenApiTypes.URI: {'type': 'string', 'format': 'uri'}, - OpenApiTypes.URI_REF: {'type': 'string', 'format': 'uri-reference'}, - OpenApiTypes.URI_TPL: {'type': 'string', 'format': 'uri-template'}, - OpenApiTypes.IRI: {'type': 'string', 'format': 'iri'}, - OpenApiTypes.IRI_REF: {'type': 'string', 'format': 'iri-reference'}, - OpenApiTypes.IP4: {'type': 'string', 'format': 'ipv4'}, - OpenApiTypes.IP6: {'type': 'string', 'format': 'ipv6'}, - OpenApiTypes.HOSTNAME: {'type': 'string', 'format': 'hostname'}, - OpenApiTypes.IDN_HOSTNAME: {'type': 'string', 'format': 'idn-hostname'}, - OpenApiTypes.DECIMAL: {'type': 'number', 'format': 'double'}, - OpenApiTypes.DATETIME: {'type': 'string', 'format': 'date-time'}, - OpenApiTypes.DATE: {'type': 'string', 'format': 'date'}, - OpenApiTypes.TIME: {'type': 'string', 'format': 'time'}, - OpenApiTypes.DURATION: {'type': 'string', 'format': 'duration'}, # ISO 8601 - OpenApiTypes.EMAIL: {'type': 'string', 'format': 'email'}, - OpenApiTypes.IDN_EMAIL: {'type': 'string', 'format': 'idn-email'}, - OpenApiTypes.JSON_PTR: {'type': 'string', 'format': 'json-pointer'}, - OpenApiTypes.JSON_PTR_REL: {'type': 'string', 'format': 'relative-json-pointer'}, - OpenApiTypes.REGEX: {'type': 'string', 'format': 'regex'}, - OpenApiTypes.ANY: {}, - OpenApiTypes.NONE: None, - # OpenApiTypes.OBJECT is inserted at runtime due to dependency on settings -} - -PYTHON_TYPE_MAPPING = { - str: OpenApiTypes.STR, - float: OpenApiTypes.DOUBLE, - bool: OpenApiTypes.BOOL, - bytes: OpenApiTypes.BINARY, - int: OpenApiTypes.INT, - UUID: OpenApiTypes.UUID, - Decimal: OpenApiTypes.DECIMAL, - datetime: OpenApiTypes.DATETIME, - date: OpenApiTypes.DATE, - time: OpenApiTypes.TIME, - timedelta: OpenApiTypes.DURATION, - IPv4Address: OpenApiTypes.IP4, - IPv6Address: OpenApiTypes.IP6, - dict: OpenApiTypes.OBJECT, - typing.Any: OpenApiTypes.ANY, - None: OpenApiTypes.NONE, -} - -DJANGO_PATH_CONVERTER_MAPPING = { - 'int': OpenApiTypes.INT, - 'path': OpenApiTypes.STR, - 'slug': OpenApiTypes.STR, - 'str': OpenApiTypes.STR, - 'uuid': OpenApiTypes.UUID, - 'drf_format_suffix': OpenApiTypes.STR, -} diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/utils.py b/.venv/lib/python3.10/site-packages/drf_spectacular/utils.py deleted file mode 100644 index c0c33f7..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/utils.py +++ /dev/null @@ -1,693 +0,0 @@ -import inspect -import sys -from typing import Any, Callable, Dict, Optional, Sequence, Tuple, Type, TypeVar, Union - -from django.utils.functional import Promise - -# direct import due to https://github.com/microsoft/pyright/issues/3025 -if sys.version_info >= (3, 8): - from typing import Final, Literal -else: - from typing_extensions import Final, Literal - -from rest_framework.fields import Field, empty -from rest_framework.serializers import ListSerializer, Serializer -from rest_framework.settings import api_settings - -from drf_spectacular.drainage import ( - error, get_view_method_names, isolate_view_method, set_override, warn, -) -from drf_spectacular.types import OpenApiTypes, _KnownPythonTypes - -_ListSerializerType = Union[ListSerializer, Type[ListSerializer]] -_SerializerType = Union[Serializer, Type[Serializer]] -_FieldType = Union[Field, Type[Field]] -_ParameterLocationType = Literal['query', 'path', 'header', 'cookie'] -_StrOrPromise = Union[str, Promise] -_SchemaType = Dict[str, Any] -Direction = Literal['request', 'response'] - - -class PolymorphicProxySerializer(Serializer): - """ - This class is to be used with :func:`@extend_schema <.extend_schema>` to - signal a request/response might be polymorphic (accepts/returns data - possibly from different serializers). Usage usually looks like this: - - .. code-block:: - - @extend_schema( - request=PolymorphicProxySerializer( - component_name='MetaPerson', - serializers=[ - LegalPersonSerializer, NaturalPersonSerializer, - ], - resource_type_field_name='person_type', - ) - ) - def create(self, request, *args, **kwargs): - return Response(...) - - **Beware** that this is not a real serializer and it will raise an AssertionError - if used in that way. It **cannot** be used in views as ``serializer_class`` - or as field in an actual serializer. It is solely meant for annotation purposes. - - Also make sure that each sub-serializer has a field named after the value of - ``resource_type_field_name`` (discriminator field). Generated clients will likely - depend on the existence of this field. - - Setting ``resource_type_field_name`` to ``None`` will remove the discriminator - altogether. This may be useful in certain situations, but will most likely break - client generation. Another use-case is explicit control over sub-serializer's ``many`` - attribute. To explicitly control this aspect, you need disable the discriminator with - ``resource_type_field_name=None`` as well as disable automatic list handling with - ``many=False``. - - It is **strongly** recommended to pass the ``Serializers`` as **list**, - and by that let *drf-spectacular* retrieve the field and handle the mapping - automatically. In special circumstances, the field may not available when - *drf-spectacular* processes the serializer. In those cases you can explicitly state - the mapping with ``{'legal': LegalPersonSerializer, ...}``, but it is then your - responsibility to have a valid mapping. - - It is also permissible to provide a callable with no parameters for ``serializers``, - such as a lambda that will return an appropriate list or dict when evaluated. - """ - def __init__( - self, - component_name: str, - serializers: Union[ - Sequence[_SerializerType], - Dict[str, _SerializerType], - Callable[[], Sequence[_SerializerType]], - Callable[[], Dict[str, _SerializerType]] - ], - resource_type_field_name: Optional[str], - many: Optional[bool] = None, - **kwargs - ): - self.component_name = component_name - self.serializers = serializers - self.resource_type_field_name = resource_type_field_name - if self._many is False: # type: ignore[attr-defined] - set_override(self, 'many', False) - # retain kwargs in context for potential anonymous re-init with many=True - kwargs.setdefault('context', {}).update({ - 'component_name': component_name, - 'serializers': serializers, - 'resource_type_field_name': resource_type_field_name - }) - super().__init__(**kwargs) - - def __new__(cls, *args, **kwargs): - many = kwargs.pop('many', None) - if many is True: - context = kwargs.get('context', {}) - for arg in ['component_name', 'serializers', 'resource_type_field_name']: - if arg in context: - kwargs[arg] = context.pop(arg) # re-apply retained args - instance = cls.many_init(*args, **kwargs) - else: - instance = super().__new__(cls, *args, **kwargs) - instance._many = many - return instance - - @property - def serializers(self): - if callable(self._serializers): - self._serializers = self._serializers() - return self._serializers - - @serializers.setter - def serializers(self, value): - self._serializers = value - - @property - def data(self): - self._trap() - - def to_internal_value(self, data): - self._trap() - - def to_representation(self, instance): - self._trap() - - def _trap(self): - raise AssertionError( - "PolymorphicProxySerializer is an annotation helper and not supposed to " - "be used for real requests. See documentation for correct usage." - ) - - -class OpenApiSchemaBase: - pass - - -class OpenApiExample(OpenApiSchemaBase): - """ - Helper class to document a API parameter / request body / response body - with a concrete example value. - - It is recommended to provide a singular example value, since pagination - and list responses are handled by drf-spectacular. - - The example will be attached to the operation object where appropriate, - i.e. where the given ``media_type``, ``status_code`` and modifiers match. - Example that do not match any scenario are ignored. - - - media_type will default to 'application/json' unless implicitly specified - through :class:`.OpenApiResponse` - - status_codes will default to [200, 201] unless implicitly specified - through :class:`.OpenApiResponse` - """ - def __init__( - self, - name: str, - value: Any = empty, - external_value: str = '', - summary: _StrOrPromise = '', - description: _StrOrPromise = '', - request_only: bool = False, - response_only: bool = False, - parameter_only: Optional[Tuple[str, _ParameterLocationType]] = None, - media_type: Optional[str] = None, - status_codes: Optional[Sequence[Union[str, int]]] = None, - ): - self.name = name - self.summary = summary - self.description = description - self.value = value - self.external_value = external_value - self.request_only = request_only - self.response_only = response_only - self.parameter_only = parameter_only - self.media_type = media_type - self.status_codes = status_codes - - -class OpenApiParameter(OpenApiSchemaBase): - """ - Helper class to document request query/path/header/cookie parameters. - Can also be used to document response headers. - - Please note that not all arguments apply to all ``location``/``type``/direction - variations, e.g. path parameters are ``required=True`` by definition. - - For valid ``style`` choices please consult the - `OpenAPI specification `_. - """ - QUERY: Final = 'query' - PATH: Final = 'path' - HEADER: Final = 'header' - COOKIE: Final = 'cookie' - - def __init__( - self, - name: str, - type: Union[_SerializerType, _KnownPythonTypes, OpenApiTypes, _SchemaType] = str, - location: _ParameterLocationType = QUERY, - required: bool = False, - description: _StrOrPromise = '', - enum: Optional[Sequence[Any]] = None, - pattern: Optional[str] = None, - deprecated: bool = False, - style: Optional[str] = None, - explode: Optional[bool] = None, - default: Any = None, - allow_blank: bool = True, - many: Optional[bool] = None, - examples: Optional[Sequence[OpenApiExample]] = None, - extensions: Optional[Dict[str, Any]] = None, - exclude: bool = False, - response: Union[bool, Sequence[Union[int, str]]] = False, - ): - self.name = name - self.type = type - self.location = location - self.required = required - self.description = description - self.enum = enum - self.pattern = pattern - self.deprecated = deprecated - self.style = style - self.explode = explode - self.default = default - self.allow_blank = allow_blank - self.many = many - self.examples = examples or [] - self.extensions = extensions - self.exclude = exclude - self.response = response - - -class OpenApiResponse(OpenApiSchemaBase): - """ - Helper class to bundle a response object (``Serializer``, ``OpenApiType``, - raw schema, etc) together with a response object description and/or examples. - Examples can alternatively be provided via :func:`@extend_schema <.extend_schema>`. - - This class is especially helpful for explicitly describing status codes on a - "Response Object" level. - """ - def __init__( - self, - response: Any = None, - description: _StrOrPromise = '', - examples: Optional[Sequence[OpenApiExample]] = None - ): - self.response = response - self.description = description - self.examples = examples or [] - - -class OpenApiRequest(OpenApiSchemaBase): - """ - Helper class to combine a request object (``Serializer``, ``OpenApiType``, - raw schema, etc.) together with an encoding object and/or examples. - Examples can alternatively be provided via :func:`@extend_schema <.extend_schema>`. - - This class is especially helpful for customizing value encoding for - ``application/x-www-form-urlencoded`` and ``multipart/*``. The encoding parameter - takes a dictionary with field names as keys and encoding objects as values. - Refer to the `specification `_ - on how to build a valid encoding object. - """ - def __init__( - self, - request: Any = None, - encoding: Optional[Dict[str, Dict[str, Any]]] = None, - examples: Optional[Sequence[OpenApiExample]] = None, - ): - self.request = request - self.encoding = encoding - self.examples = examples or [] - - -F = TypeVar('F', bound=Callable[..., Any]) - - -class OpenApiCallback(OpenApiSchemaBase): - """ - Helper class to bundle a callback definition. This specifies a view on the callee's - side, effectively stating the expectations on the receiving end. Please note that this - particular :func:`@extend_schema <.extend_schema>` instance operates from the perspective - of the callback origin, which means that ``request`` specifies the outgoing request. - - For convenience sake, we assume the callback sends ``application/json`` and return a ``200``. - If that is not sufficient, you can use ``request`` and ``responses`` overloads just as you - normally would. - - :param name: Name under which the this callback is listed in the schema. - :param path: Path on which the callback operation is performed. To reference request - body contents, please refer to OpenAPI specification's - `key expressions `_ for valid choices. - :param decorator: :func:`@extend_schema <.extend_schema>` decorator that specifies the receiving - endpoint. In this special context the allowed parameters are ``requests``, ``responses``, - ``summary``, ``description``, ``deprecated``. - """ - def __init__( - self, - name: _StrOrPromise, - path: str, - decorator: Union[Callable[[F], F], Dict[str, Callable[[F], F]], Dict[str, Any]], - ): - self.name = name - self.path = path - self.decorator = decorator - - -class OpenApiWebhook(OpenApiSchemaBase): - """ - Helper class to document webhook definitions. A webhook specifies a possible out-of-band - request initiated by the API provider and the expected responses from the consumer. - - Please note that this particular :func:`@extend_schema <.extend_schema>` instance operates - from the perspective of the webhook origin, which means that ``request`` specifies the - outgoing request. - - For convenience sake, we assume the API provider sends a POST request with a body of type - ``application/json`` and the receiver responds with ``200`` if the event was successfully - received. - - :param name: Name under which this webhook is listed in the schema. - :param decorator: :func:`@extend_schema <.extend_schema>` decorator that specifies the receiving - endpoint. In this special context the allowed parameters are ``requests``, ``responses``, - ``summary``, ``description``, ``deprecated``. - """ - def __init__( - self, - name: _StrOrPromise, - decorator: Union[Callable[[F], F], Dict[str, Callable[[F], F]], Dict[str, Any]], - ): - self.name = name - self.decorator = decorator - - -def extend_schema( - operation_id: Optional[str] = None, - parameters: Optional[Sequence[Union[OpenApiParameter, _SerializerType]]] = None, - request: Any = empty, - responses: Any = empty, - auth: Optional[Sequence[str]] = None, - description: Optional[_StrOrPromise] = None, - summary: Optional[_StrOrPromise] = None, - deprecated: Optional[bool] = None, - tags: Optional[Sequence[str]] = None, - filters: Optional[bool] = None, - exclude: Optional[bool] = None, - operation: Optional[_SchemaType] = None, - methods: Optional[Sequence[str]] = None, - versions: Optional[Sequence[str]] = None, - examples: Optional[Sequence[OpenApiExample]] = None, - extensions: Optional[Dict[str, Any]] = None, - callbacks: Optional[Sequence[OpenApiCallback]] = None, - external_docs: Optional[Union[Dict[str, str], str]] = None, -) -> Callable[[F], F]: - """ - Decorator mainly for the "view" method kind. Partially or completely overrides - what would be otherwise generated by drf-spectacular. - - :param operation_id: replaces the auto-generated operation_id. make sure there - are no naming collisions. - :param parameters: list of additional or replacement parameters added to the - auto-discovered fields. - :param responses: replaces the discovered Serializer. Takes a variety of - inputs that can be used individually or combined - - - ``Serializer`` class - - ``Serializer`` instance (e.g. ``Serializer(many=True)`` for listings) - - basic types or instances of ``OpenApiTypes`` - - :class:`.OpenApiResponse` for bundling any of the other choices together with - either a dedicated response description and/or examples. - - :class:`.PolymorphicProxySerializer` for signaling that - the operation may yield data from different serializers depending - on the circumstances. - - ``dict`` with status codes as keys and one of the above as values. - Additionally in this case, it is also possible to provide a raw schema dict - as value. - - ``dict`` with tuples (status_code, media_type) as keys and one of the above - as values. Additionally in this case, it is also possible to provide a raw - schema dict as value. - :param request: replaces the discovered ``Serializer``. Takes a variety of inputs - - - ``Serializer`` class/instance - - basic types or instances of ``OpenApiTypes`` - - :class:`.PolymorphicProxySerializer` for signaling that the operation - accepts a set of different types of objects. - - ``dict`` with media_type as keys and one of the above as values. Additionally, in - this case, it is also possible to provide a raw schema dict as value. - :param auth: replace discovered auth with explicit list of auth methods - :param description: replaces discovered doc strings - :param summary: an optional short summary of the description - :param deprecated: mark operation as deprecated - :param tags: override default list of tags - :param filters: ignore list detection and forcefully enable/disable filter discovery - :param exclude: set True to exclude operation from schema - :param operation: manually override what auto-discovery would generate. you must - provide a OpenAPI3-compliant dictionary that gets directly translated to YAML. - :param methods: scope extend_schema to specific methods. matches all by default. - :param versions: scope extend_schema to specific API version. matches all by default. - :param examples: attach request/response examples to the operation - :param extensions: specification extensions, e.g. ``x-badges``, ``x-code-samples``, etc. - :param callbacks: associate callbacks with this endpoint - :param external_docs: Link external documentation. Provide a dict with an "url" key and - optionally a "description" key. For convenience, if only a string is given it is - treated as the URL. - :return: - """ - if methods is not None: - methods = [method.upper() for method in methods] - - def decorator(f): - BaseSchema = ( - # explicit manually set schema or previous view annotation - getattr(f, 'schema', None) - # previously set schema with @extend_schema on views methods - or getattr(f, 'kwargs', {}).get('schema', None) - # previously set schema with @extend_schema on @api_view - or getattr(getattr(f, 'cls', None), 'kwargs', {}).get('schema', None) - # the default - or api_settings.DEFAULT_SCHEMA_CLASS - ) - - if not inspect.isclass(BaseSchema): - BaseSchema = BaseSchema.__class__ - - def is_in_scope(ext_schema): - version, _ = ext_schema.view.determine_version( - ext_schema.view.request, - **ext_schema.view.kwargs - ) - version_scope = versions is None or version in versions - method_scope = methods is None or ext_schema.method in methods - return method_scope and version_scope - - class ExtendedSchema(BaseSchema): - def get_operation(self, path, path_regex, path_prefix, method, registry): - self.method = method.upper() - - if operation is not None and is_in_scope(self): - return operation - return super().get_operation(path, path_regex, path_prefix, method, registry) - - def is_excluded(self): - if exclude is not None and is_in_scope(self): - return exclude - return super().is_excluded() - - def get_operation_id(self): - if operation_id and is_in_scope(self): - return operation_id - return super().get_operation_id() - - def get_override_parameters(self): - if parameters and is_in_scope(self): - return super().get_override_parameters() + parameters - return super().get_override_parameters() - - def get_auth(self): - if auth is not None and is_in_scope(self): - return auth - return super().get_auth() - - def get_examples(self): - if examples and is_in_scope(self): - return super().get_examples() + examples - return super().get_examples() - - def get_request_serializer(self): - if request is not empty and is_in_scope(self): - return request - return super().get_request_serializer() - - def get_response_serializers(self): - if responses is not empty and is_in_scope(self): - return responses - return super().get_response_serializers() - - def get_description(self): - if description and is_in_scope(self): - return description - return super().get_description() - - def get_summary(self): - if summary and is_in_scope(self): - return str(summary) - return super().get_summary() - - def is_deprecated(self): - if deprecated and is_in_scope(self): - return deprecated - return super().is_deprecated() - - def get_tags(self): - if tags is not None and is_in_scope(self): - return tags - return super().get_tags() - - def get_extensions(self): - if extensions and is_in_scope(self): - return extensions - return super().get_extensions() - - def get_filter_backends(self): - if filters is not None and is_in_scope(self): - return getattr(self.view, 'filter_backends', []) if filters else [] - return super().get_filter_backends() - - def get_callbacks(self): - if callbacks is not None and is_in_scope(self): - return callbacks - return super().get_callbacks() - - def get_external_docs(self): - if external_docs is not None and is_in_scope(self): - return external_docs - return super().get_external_docs() - - if inspect.isclass(f): - # either direct decoration of views, or unpacked @api_view from OpenApiViewExtension - if operation_id is not None or operation is not None: - error( - f'using @extend_schema on viewset class {f.__name__} with parameters ' - f'operation_id or operation will most likely result in a broken schema.', - delayed=f, - ) - # reorder schema class MRO so that view method annotation takes precedence - # over view class annotation. only relevant if there is a method annotation - for view_method_name in get_view_method_names(view=f, schema=BaseSchema): - if 'schema' not in getattr(getattr(f, view_method_name), 'kwargs', {}): - continue - view_method = isolate_view_method(f, view_method_name) - view_method.kwargs['schema'] = type( - 'ExtendedMetaSchema', (view_method.kwargs['schema'], ExtendedSchema), {} - ) - # persist schema on class to provide annotation to derived view methods. - # the second purpose is to serve as base for view multi-annotation - f.schema = ExtendedSchema() - return f - elif callable(f) and hasattr(f, 'cls'): - # 'cls' attr signals that as_view() was called, which only applies to @api_view. - # keep a "unused" schema reference at root level for multi annotation convenience. - setattr(f.cls, 'kwargs', {'schema': ExtendedSchema}) - # set schema on method kwargs context to emulate regular view behaviour. - for method in f.cls.http_method_names: - setattr(getattr(f.cls, method), 'kwargs', {'schema': ExtendedSchema}) - return f - elif callable(f): - # custom actions have kwargs in their context, others don't. create it so our create_view - # implementation can overwrite the default schema - if not hasattr(f, 'kwargs'): - f.kwargs = {} - # this simulates what @action is actually doing. somewhere along the line in this process - # the schema is picked up from kwargs and used. it's involved my dear friends. - # use class instead of instance due to descriptor weakref reverse collisions - f.kwargs['schema'] = ExtendedSchema - return f - else: - return f - - return decorator - - -def extend_schema_field( - field: Union[_SerializerType, _FieldType, OpenApiTypes, _SchemaType, _KnownPythonTypes], - component_name: Optional[str] = None -) -> Callable[[F], F]: - """ - Decorator for the "field" kind. Can be used with ``SerializerMethodField`` (annotate the actual - method) or with custom ``serializers.Field`` implementations. - - If your custom serializer field base class is already the desired type, decoration is not necessary. - To override the discovered base class type, you can decorate your custom field class. - - Always takes precedence over other mechanisms (e.g. type hints, auto-discovery). - - :param field: accepts a ``Serializer``, :class:`~.types.OpenApiTypes` or raw ``dict`` - :param component_name: signals that the field should be broken out as separate component - """ - - def decorator(f): - set_override(f, 'field', field) - set_override(f, 'field_component_name', component_name) - return f - - return decorator - - -def extend_schema_serializer( - many: Optional[bool] = None, - exclude_fields: Optional[Sequence[str]] = None, - deprecate_fields: Optional[Sequence[str]] = None, - examples: Optional[Sequence[OpenApiExample]] = None, - extensions: Optional[Dict[str, Any]] = None, - component_name: Optional[str] = None, -) -> Callable[[F], F]: - """ - Decorator for the "serializer" kind. Intended for overriding default serializer behaviour that - cannot be influenced through :func:`@extend_schema <.extend_schema>`. - - :param many: override how serializer is initialized. Mainly used to coerce the list view detection - heuristic to acknowledge a non-list serializer. - :param exclude_fields: fields to ignore while processing the serializer. only affects the - schema. fields will still be exposed through the API. - :param deprecate_fields: fields to mark as deprecated while processing the serializer. - :param examples: define example data to serializer. - :param extensions: specification extensions, e.g. ``x-is-dynamic``, etc. - :param component_name: override default class name extraction. - """ - def decorator(klass): - if many is not None: - set_override(klass, 'many', many) - if exclude_fields: - set_override(klass, 'exclude_fields', exclude_fields) - if deprecate_fields: - set_override(klass, 'deprecate_fields', deprecate_fields) - if examples: - set_override(klass, 'examples', examples) - if extensions: - set_override(klass, 'extensions', extensions) - if component_name: - set_override(klass, 'component_name', component_name) - return klass - - return decorator - - -def extend_schema_view(**kwargs) -> Callable[[F], F]: - """ - Convenience decorator for the "view" kind. Intended for annotating derived view methods that - are are not directly present in the view (usually methods like ``list`` or ``retrieve``). - Spares you from overriding methods like ``list``, only to perform a super call in the body - so that you have have something to attach :func:`@extend_schema <.extend_schema>` to. - - This decorator also takes care of safely attaching annotations to derived view methods, - preventing leakage into unrelated views. - - This decorator also supports custom DRF ``@action`` with the method name as the key. - - :param kwargs: method names as argument names and :func:`@extend_schema <.extend_schema>` - calls as values - """ - def decorator(view): - # special case for @api_view. redirect decoration to enclosed WrappedAPIView - if callable(view) and hasattr(view, 'cls'): - extend_schema_view(**kwargs)(view.cls) - return view - - available_view_methods = get_view_method_names(view) - - for method_name, method_decorator in kwargs.items(): - if method_name not in available_view_methods: - warn( - f'@extend_schema_view argument "{method_name}" was not found on view ' - f'{view.__name__}. method override for "{method_name}" will be ignored.', - delayed=view - ) - continue - - # the context of derived methods must not be altered, as it belongs to the - # other view. create a new context so the schema can be safely stored in the - # wrapped_method. view methods that are not derived can be safely altered. - if hasattr(method_decorator, '__iter__'): - for sub_method_decorator in method_decorator: - sub_method_decorator(isolate_view_method(view, method_name)) - else: - method_decorator(isolate_view_method(view, method_name)) - return view - - return decorator - - -def inline_serializer(name: str, fields: Dict[str, Field], **kwargs) -> Serializer: - """ - A helper function to create an inline serializer. Primary use is with - :func:`@extend_schema <.extend_schema>`, where one needs an implicit one-off - serializer that is not reflected in an actual class. - - :param name: name of the - :param fields: dict with field names as keys and serializer fields as values - :param kwargs: optional kwargs for serializer initialization - """ - serializer_class = type(name, (Serializer,), fields) - return serializer_class(**kwargs) diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/validation/__init__.py b/.venv/lib/python3.10/site-packages/drf_spectacular/validation/__init__.py deleted file mode 100644 index 284e0f1..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/validation/__init__.py +++ /dev/null @@ -1,34 +0,0 @@ -import json -import os - -import jsonschema - - -def validate_schema(api_schema): - """ - Validate generated API schema against OpenAPI 3.0.X json schema specification. - Note: On conflict, the written specification always wins over the json schema. - - OpenApi3 schema specification taken from: - - https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v3.0/schema.json - https://github.com/OAI/OpenAPI-Specification/blob/9dff244e5708fbe16e768738f4f17cf3fddf4066/schemas/v3.0/schema.json - - https://github.com/OAI/OpenAPI-Specification/blob/main/schemas/v3.1/schema.json - https://github.com/OAI/OpenAPI-Specification/blob/9dff244e5708fbe16e768738f4f17cf3fddf4066/schemas/v3.1/schema.json - """ - if api_schema['openapi'].startswith("3.0"): - schema_spec_path = os.path.join(os.path.dirname(__file__), 'openapi_3_0_schema.json') - elif api_schema['openapi'].startswith("3.1"): - schema_spec_path = os.path.join(os.path.dirname(__file__), 'openapi_3_1_schema.json') - else: - raise RuntimeError('No validation specification available') # pragma: no cover - - with open(schema_spec_path) as fh: - openapi3_schema_spec = json.load(fh) - - # coerce any remnants of objects to basic types - from drf_spectacular.renderers import OpenApiJsonRenderer - api_schema = json.loads(OpenApiJsonRenderer().render(api_schema)) - - jsonschema.validate(instance=api_schema, schema=openapi3_schema_spec) diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/validation/openapi_3_0_schema.json b/.venv/lib/python3.10/site-packages/drf_spectacular/validation/openapi_3_0_schema.json deleted file mode 100644 index 6e8eab8..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/validation/openapi_3_0_schema.json +++ /dev/null @@ -1,1666 +0,0 @@ -{ - "id": "https://spec.openapis.org/oas/3.0/schema/2021-09-28", - "$schema": "http://json-schema.org/draft-04/schema#", - "description": "The description of OpenAPI v3.0.x documents, as defined by https://spec.openapis.org/oas/v3.0.3", - "type": "object", - "required": [ - "openapi", - "info", - "paths" - ], - "properties": { - "openapi": { - "type": "string", - "pattern": "^3\\.0\\.\\d(-.+)?$" - }, - "info": { - "$ref": "#/definitions/Info" - }, - "externalDocs": { - "$ref": "#/definitions/ExternalDocumentation" - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/definitions/Server" - } - }, - "security": { - "type": "array", - "items": { - "$ref": "#/definitions/SecurityRequirement" - } - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - }, - "uniqueItems": true - }, - "paths": { - "$ref": "#/definitions/Paths" - }, - "components": { - "$ref": "#/definitions/Components" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false, - "definitions": { - "Reference": { - "type": "object", - "required": [ - "$ref" - ], - "patternProperties": { - "^\\$ref$": { - "type": "string", - "format": "uri-reference" - } - } - }, - "Info": { - "type": "object", - "required": [ - "title", - "version" - ], - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "termsOfService": { - "type": "string", - "format": "uri-reference" - }, - "contact": { - "$ref": "#/definitions/Contact" - }, - "license": { - "$ref": "#/definitions/License" - }, - "version": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "Contact": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri-reference" - }, - "email": { - "type": "string", - "format": "email" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "License": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri-reference" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "Server": { - "type": "object", - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string" - }, - "description": { - "type": "string" - }, - "variables": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/ServerVariable" - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "ServerVariable": { - "type": "object", - "required": [ - "default" - ], - "properties": { - "enum": { - "type": "array", - "items": { - "type": "string" - } - }, - "default": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "Components": { - "type": "object", - "properties": { - "schemas": { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9\\.\\-_]+$": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - } - }, - "responses": { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9\\.\\-_]+$": { - "oneOf": [ - { - "$ref": "#/definitions/Reference" - }, - { - "$ref": "#/definitions/Response" - } - ] - } - } - }, - "parameters": { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9\\.\\-_]+$": { - "oneOf": [ - { - "$ref": "#/definitions/Reference" - }, - { - "$ref": "#/definitions/Parameter" - } - ] - } - } - }, - "examples": { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9\\.\\-_]+$": { - "oneOf": [ - { - "$ref": "#/definitions/Reference" - }, - { - "$ref": "#/definitions/Example" - } - ] - } - } - }, - "requestBodies": { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9\\.\\-_]+$": { - "oneOf": [ - { - "$ref": "#/definitions/Reference" - }, - { - "$ref": "#/definitions/RequestBody" - } - ] - } - } - }, - "headers": { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9\\.\\-_]+$": { - "oneOf": [ - { - "$ref": "#/definitions/Reference" - }, - { - "$ref": "#/definitions/Header" - } - ] - } - } - }, - "securitySchemes": { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9\\.\\-_]+$": { - "oneOf": [ - { - "$ref": "#/definitions/Reference" - }, - { - "$ref": "#/definitions/SecurityScheme" - } - ] - } - } - }, - "links": { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9\\.\\-_]+$": { - "oneOf": [ - { - "$ref": "#/definitions/Reference" - }, - { - "$ref": "#/definitions/Link" - } - ] - } - } - }, - "callbacks": { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9\\.\\-_]+$": { - "oneOf": [ - { - "$ref": "#/definitions/Reference" - }, - { - "$ref": "#/definitions/Callback" - } - ] - } - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "Schema": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "multipleOf": { - "type": "number", - "minimum": 0, - "exclusiveMinimum": true - }, - "maximum": { - "type": "number" - }, - "exclusiveMaximum": { - "type": "boolean", - "default": false - }, - "minimum": { - "type": "number" - }, - "exclusiveMinimum": { - "type": "boolean", - "default": false - }, - "maxLength": { - "type": "integer", - "minimum": 0 - }, - "minLength": { - "type": "integer", - "minimum": 0, - "default": 0 - }, - "pattern": { - "type": "string", - "format": "regex" - }, - "maxItems": { - "type": "integer", - "minimum": 0 - }, - "minItems": { - "type": "integer", - "minimum": 0, - "default": 0 - }, - "uniqueItems": { - "type": "boolean", - "default": false - }, - "maxProperties": { - "type": "integer", - "minimum": 0 - }, - "minProperties": { - "type": "integer", - "minimum": 0, - "default": 0 - }, - "required": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true - }, - "enum": { - "type": "array", - "items": { - }, - "minItems": 1, - "uniqueItems": false - }, - "type": { - "type": "string", - "enum": [ - "array", - "boolean", - "integer", - "number", - "object", - "string" - ] - }, - "not": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - } - ] - }, - "allOf": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - }, - "oneOf": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - }, - "anyOf": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - }, - "items": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - } - ] - }, - "properties": { - "type": "object", - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - }, - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - }, - { - "type": "boolean" - } - ], - "default": true - }, - "description": { - "type": "string" - }, - "format": { - "type": "string" - }, - "default": { - }, - "nullable": { - "type": "boolean", - "default": false - }, - "discriminator": { - "$ref": "#/definitions/Discriminator" - }, - "readOnly": { - "type": "boolean", - "default": false - }, - "writeOnly": { - "type": "boolean", - "default": false - }, - "example": { - }, - "externalDocs": { - "$ref": "#/definitions/ExternalDocumentation" - }, - "deprecated": { - "type": "boolean", - "default": false - }, - "xml": { - "$ref": "#/definitions/XML" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "Discriminator": { - "type": "object", - "required": [ - "propertyName" - ], - "properties": { - "propertyName": { - "type": "string" - }, - "mapping": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - }, - "XML": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string", - "format": "uri" - }, - "prefix": { - "type": "string" - }, - "attribute": { - "type": "boolean", - "default": false - }, - "wrapped": { - "type": "boolean", - "default": false - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "Response": { - "type": "object", - "required": [ - "description" - ], - "properties": { - "description": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/Header" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - }, - "content": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/MediaType" - } - }, - "links": { - "type": "object", - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/Link" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "MediaType": { - "type": "object", - "properties": { - "schema": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - } - ] - }, - "example": { - }, - "examples": { - "type": "object", - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/Example" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - }, - "encoding": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Encoding" - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false, - "allOf": [ - { - "$ref": "#/definitions/ExampleXORExamples" - } - ] - }, - "Example": { - "type": "object", - "properties": { - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "value": { - }, - "externalValue": { - "type": "string", - "format": "uri-reference" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "Header": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "required": { - "type": "boolean", - "default": false - }, - "deprecated": { - "type": "boolean", - "default": false - }, - "allowEmptyValue": { - "type": "boolean", - "default": false - }, - "style": { - "type": "string", - "enum": [ - "simple" - ], - "default": "simple" - }, - "explode": { - "type": "boolean" - }, - "allowReserved": { - "type": "boolean", - "default": false - }, - "schema": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - } - ] - }, - "content": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/MediaType" - }, - "minProperties": 1, - "maxProperties": 1 - }, - "example": { - }, - "examples": { - "type": "object", - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/Example" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false, - "allOf": [ - { - "$ref": "#/definitions/ExampleXORExamples" - }, - { - "$ref": "#/definitions/SchemaXORContent" - } - ] - }, - "Paths": { - "type": "object", - "patternProperties": { - "^\\/": { - "$ref": "#/definitions/PathItem" - }, - "^x-": { - } - }, - "additionalProperties": false - }, - "PathItem": { - "type": "object", - "properties": { - "$ref": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/definitions/Server" - } - }, - "parameters": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/definitions/Parameter" - }, - { - "$ref": "#/definitions/Reference" - } - ] - }, - "uniqueItems": true - } - }, - "patternProperties": { - "^(get|put|post|delete|options|head|patch|trace)$": { - "$ref": "#/definitions/Operation" - }, - "^x-": { - } - }, - "additionalProperties": false - }, - "Operation": { - "type": "object", - "required": [ - "responses" - ], - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - } - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "externalDocs": { - "$ref": "#/definitions/ExternalDocumentation" - }, - "operationId": { - "type": "string" - }, - "parameters": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/definitions/Parameter" - }, - { - "$ref": "#/definitions/Reference" - } - ] - }, - "uniqueItems": true - }, - "requestBody": { - "oneOf": [ - { - "$ref": "#/definitions/RequestBody" - }, - { - "$ref": "#/definitions/Reference" - } - ] - }, - "responses": { - "$ref": "#/definitions/Responses" - }, - "callbacks": { - "type": "object", - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/Callback" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - }, - "deprecated": { - "type": "boolean", - "default": false - }, - "security": { - "type": "array", - "items": { - "$ref": "#/definitions/SecurityRequirement" - } - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/definitions/Server" - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "Responses": { - "type": "object", - "properties": { - "default": { - "oneOf": [ - { - "$ref": "#/definitions/Response" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - }, - "patternProperties": { - "^[1-5](?:\\d{2}|XX)$": { - "oneOf": [ - { - "$ref": "#/definitions/Response" - }, - { - "$ref": "#/definitions/Reference" - } - ] - }, - "^x-": { - } - }, - "minProperties": 1, - "additionalProperties": false - }, - "SecurityRequirement": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "Tag": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "externalDocs": { - "$ref": "#/definitions/ExternalDocumentation" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "ExternalDocumentation": { - "type": "object", - "required": [ - "url" - ], - "properties": { - "description": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri-reference" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "ExampleXORExamples": { - "description": "Example and examples are mutually exclusive", - "not": { - "required": [ - "example", - "examples" - ] - } - }, - "SchemaXORContent": { - "description": "Schema and content are mutually exclusive, at least one is required", - "not": { - "required": [ - "schema", - "content" - ] - }, - "oneOf": [ - { - "required": [ - "schema" - ] - }, - { - "required": [ - "content" - ], - "description": "Some properties are not allowed if content is present", - "allOf": [ - { - "not": { - "required": [ - "style" - ] - } - }, - { - "not": { - "required": [ - "explode" - ] - } - }, - { - "not": { - "required": [ - "allowReserved" - ] - } - }, - { - "not": { - "required": [ - "example" - ] - } - }, - { - "not": { - "required": [ - "examples" - ] - } - } - ] - } - ] - }, - "Parameter": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "in": { - "type": "string" - }, - "description": { - "type": "string" - }, - "required": { - "type": "boolean", - "default": false - }, - "deprecated": { - "type": "boolean", - "default": false - }, - "allowEmptyValue": { - "type": "boolean", - "default": false - }, - "style": { - "type": "string" - }, - "explode": { - "type": "boolean" - }, - "allowReserved": { - "type": "boolean", - "default": false - }, - "schema": { - "oneOf": [ - { - "$ref": "#/definitions/Schema" - }, - { - "$ref": "#/definitions/Reference" - } - ] - }, - "content": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/MediaType" - }, - "minProperties": 1, - "maxProperties": 1 - }, - "example": { - }, - "examples": { - "type": "object", - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/Example" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false, - "required": [ - "name", - "in" - ], - "allOf": [ - { - "$ref": "#/definitions/ExampleXORExamples" - }, - { - "$ref": "#/definitions/SchemaXORContent" - }, - { - "$ref": "#/definitions/ParameterLocation" - } - ] - }, - "ParameterLocation": { - "description": "Parameter location", - "oneOf": [ - { - "description": "Parameter in path", - "required": [ - "required" - ], - "properties": { - "in": { - "enum": [ - "path" - ] - }, - "style": { - "enum": [ - "matrix", - "label", - "simple" - ], - "default": "simple" - }, - "required": { - "enum": [ - true - ] - } - } - }, - { - "description": "Parameter in query", - "properties": { - "in": { - "enum": [ - "query" - ] - }, - "style": { - "enum": [ - "form", - "spaceDelimited", - "pipeDelimited", - "deepObject" - ], - "default": "form" - } - } - }, - { - "description": "Parameter in header", - "properties": { - "in": { - "enum": [ - "header" - ] - }, - "style": { - "enum": [ - "simple" - ], - "default": "simple" - } - } - }, - { - "description": "Parameter in cookie", - "properties": { - "in": { - "enum": [ - "cookie" - ] - }, - "style": { - "enum": [ - "form" - ], - "default": "form" - } - } - } - ] - }, - "RequestBody": { - "type": "object", - "required": [ - "content" - ], - "properties": { - "description": { - "type": "string" - }, - "content": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/MediaType" - } - }, - "required": { - "type": "boolean", - "default": false - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "SecurityScheme": { - "oneOf": [ - { - "$ref": "#/definitions/APIKeySecurityScheme" - }, - { - "$ref": "#/definitions/HTTPSecurityScheme" - }, - { - "$ref": "#/definitions/OAuth2SecurityScheme" - }, - { - "$ref": "#/definitions/OpenIdConnectSecurityScheme" - } - ] - }, - "APIKeySecurityScheme": { - "type": "object", - "required": [ - "type", - "name", - "in" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "apiKey" - ] - }, - "name": { - "type": "string" - }, - "in": { - "type": "string", - "enum": [ - "header", - "query", - "cookie" - ] - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "HTTPSecurityScheme": { - "type": "object", - "required": [ - "scheme", - "type" - ], - "properties": { - "scheme": { - "type": "string" - }, - "bearerFormat": { - "type": "string" - }, - "description": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "http" - ] - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false, - "oneOf": [ - { - "description": "Bearer", - "properties": { - "scheme": { - "type": "string", - "pattern": "^[Bb][Ee][Aa][Rr][Ee][Rr]$" - } - } - }, - { - "description": "Non Bearer", - "not": { - "required": [ - "bearerFormat" - ] - }, - "properties": { - "scheme": { - "not": { - "type": "string", - "pattern": "^[Bb][Ee][Aa][Rr][Ee][Rr]$" - } - } - } - } - ] - }, - "OAuth2SecurityScheme": { - "type": "object", - "required": [ - "type", - "flows" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "oauth2" - ] - }, - "flows": { - "$ref": "#/definitions/OAuthFlows" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "OpenIdConnectSecurityScheme": { - "type": "object", - "required": [ - "type", - "openIdConnectUrl" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "openIdConnect" - ] - }, - "openIdConnectUrl": { - "type": "string", - "format": "uri-reference" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "OAuthFlows": { - "type": "object", - "properties": { - "implicit": { - "$ref": "#/definitions/ImplicitOAuthFlow" - }, - "password": { - "$ref": "#/definitions/PasswordOAuthFlow" - }, - "clientCredentials": { - "$ref": "#/definitions/ClientCredentialsFlow" - }, - "authorizationCode": { - "$ref": "#/definitions/AuthorizationCodeOAuthFlow" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "ImplicitOAuthFlow": { - "type": "object", - "required": [ - "authorizationUrl", - "scopes" - ], - "properties": { - "authorizationUrl": { - "type": "string", - "format": "uri-reference" - }, - "refreshUrl": { - "type": "string", - "format": "uri-reference" - }, - "scopes": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "PasswordOAuthFlow": { - "type": "object", - "required": [ - "tokenUrl", - "scopes" - ], - "properties": { - "tokenUrl": { - "type": "string", - "format": "uri-reference" - }, - "refreshUrl": { - "type": "string", - "format": "uri-reference" - }, - "scopes": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "ClientCredentialsFlow": { - "type": "object", - "required": [ - "tokenUrl", - "scopes" - ], - "properties": { - "tokenUrl": { - "type": "string", - "format": "uri-reference" - }, - "refreshUrl": { - "type": "string", - "format": "uri-reference" - }, - "scopes": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "AuthorizationCodeOAuthFlow": { - "type": "object", - "required": [ - "authorizationUrl", - "tokenUrl", - "scopes" - ], - "properties": { - "authorizationUrl": { - "type": "string", - "format": "uri-reference" - }, - "tokenUrl": { - "type": "string", - "format": "uri-reference" - }, - "refreshUrl": { - "type": "string", - "format": "uri-reference" - }, - "scopes": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - }, - "Link": { - "type": "object", - "properties": { - "operationId": { - "type": "string" - }, - "operationRef": { - "type": "string", - "format": "uri-reference" - }, - "parameters": { - "type": "object", - "additionalProperties": { - } - }, - "requestBody": { - }, - "description": { - "type": "string" - }, - "server": { - "$ref": "#/definitions/Server" - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false, - "not": { - "description": "Operation Id and Operation Ref are mutually exclusive", - "required": [ - "operationId", - "operationRef" - ] - } - }, - "Callback": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/PathItem" - }, - "patternProperties": { - "^x-": { - } - } - }, - "Encoding": { - "type": "object", - "properties": { - "contentType": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/Header" - }, - { - "$ref": "#/definitions/Reference" - } - ] - } - }, - "style": { - "type": "string", - "enum": [ - "form", - "spaceDelimited", - "pipeDelimited", - "deepObject" - ] - }, - "explode": { - "type": "boolean" - }, - "allowReserved": { - "type": "boolean", - "default": false - } - }, - "patternProperties": { - "^x-": { - } - }, - "additionalProperties": false - } - } -} \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/validation/openapi_3_1_schema.json b/.venv/lib/python3.10/site-packages/drf_spectacular/validation/openapi_3_1_schema.json deleted file mode 100644 index 5c5165f..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/validation/openapi_3_1_schema.json +++ /dev/null @@ -1,1449 +0,0 @@ -{ - "$id": "https://spec.openapis.org/oas/3.1/schema/2022-10-07", - "$schema": "https://json-schema.org/draft/2020-12/schema", - "description": "The description of OpenAPI v3.1.x documents without schema validation, as defined by https://spec.openapis.org/oas/v3.1.0", - "type": "object", - "properties": { - "openapi": { - "type": "string", - "pattern": "^3\\.1\\.\\d+(-.+)?$" - }, - "info": { - "$ref": "#/$defs/info" - }, - "jsonSchemaDialect": { - "type": "string", - "format": "uri", - "default": "https://spec.openapis.org/oas/3.1/dialect/base" - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/$defs/server" - }, - "default": [ - { - "url": "/" - } - ] - }, - "paths": { - "$ref": "#/$defs/paths" - }, - "webhooks": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/path-item-or-reference" - } - }, - "components": { - "$ref": "#/$defs/components" - }, - "security": { - "type": "array", - "items": { - "$ref": "#/$defs/security-requirement" - } - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/$defs/tag" - } - }, - "externalDocs": { - "$ref": "#/$defs/external-documentation" - } - }, - "required": [ - "openapi", - "info" - ], - "anyOf": [ - { - "required": [ - "paths" - ] - }, - { - "required": [ - "components" - ] - }, - { - "required": [ - "webhooks" - ] - } - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false, - "$defs": { - "info": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#info-object", - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "termsOfService": { - "type": "string", - "format": "uri" - }, - "contact": { - "$ref": "#/$defs/contact" - }, - "license": { - "$ref": "#/$defs/license" - }, - "version": { - "type": "string" - } - }, - "required": [ - "title", - "version" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "contact": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#contact-object", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri" - }, - "email": { - "type": "string", - "format": "email" - } - }, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "license": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#license-object", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "identifier": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri" - } - }, - "required": [ - "name" - ], - "dependentSchemas": { - "identifier": { - "not": { - "required": [ - "url" - ] - } - } - }, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "server": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#server-object", - "type": "object", - "properties": { - "url": { - "type": "string", - "format": "uri-reference" - }, - "description": { - "type": "string" - }, - "variables": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/server-variable" - } - } - }, - "required": [ - "url" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "server-variable": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#server-variable-object", - "type": "object", - "properties": { - "enum": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "default": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "required": [ - "default" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "components": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#components-object", - "type": "object", - "properties": { - "schemas": { - "type": "object", - "additionalProperties": { - "$dynamicRef": "#meta" - } - }, - "responses": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/response-or-reference" - } - }, - "parameters": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/parameter-or-reference" - } - }, - "examples": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/example-or-reference" - } - }, - "requestBodies": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/request-body-or-reference" - } - }, - "headers": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/header-or-reference" - } - }, - "securitySchemes": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/security-scheme-or-reference" - } - }, - "links": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/link-or-reference" - } - }, - "callbacks": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/callbacks-or-reference" - } - }, - "pathItems": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/path-item-or-reference" - } - } - }, - "patternProperties": { - "^(schemas|responses|parameters|examples|requestBodies|headers|securitySchemes|links|callbacks|pathItems)$": { - "$comment": "Enumerating all of the property names in the regex above is necessary for unevaluatedProperties to work as expected", - "propertyNames": { - "pattern": "^[a-zA-Z0-9._-]+$" - } - } - }, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "paths": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#paths-object", - "type": "object", - "patternProperties": { - "^/": { - "$ref": "#/$defs/path-item" - } - }, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "path-item": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#path-item-object", - "type": "object", - "properties": { - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/$defs/server" - } - }, - "parameters": { - "type": "array", - "items": { - "$ref": "#/$defs/parameter-or-reference" - } - }, - "get": { - "$ref": "#/$defs/operation" - }, - "put": { - "$ref": "#/$defs/operation" - }, - "post": { - "$ref": "#/$defs/operation" - }, - "delete": { - "$ref": "#/$defs/operation" - }, - "options": { - "$ref": "#/$defs/operation" - }, - "head": { - "$ref": "#/$defs/operation" - }, - "patch": { - "$ref": "#/$defs/operation" - }, - "trace": { - "$ref": "#/$defs/operation" - } - }, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "path-item-or-reference": { - "if": { - "type": "object", - "required": [ - "$ref" - ] - }, - "then": { - "$ref": "#/$defs/reference" - }, - "else": { - "$ref": "#/$defs/path-item" - } - }, - "operation": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#operation-object", - "type": "object", - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - } - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "externalDocs": { - "$ref": "#/$defs/external-documentation" - }, - "operationId": { - "type": "string" - }, - "parameters": { - "type": "array", - "items": { - "$ref": "#/$defs/parameter-or-reference" - } - }, - "requestBody": { - "$ref": "#/$defs/request-body-or-reference" - }, - "responses": { - "$ref": "#/$defs/responses" - }, - "callbacks": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/callbacks-or-reference" - } - }, - "deprecated": { - "default": false, - "type": "boolean" - }, - "security": { - "type": "array", - "items": { - "$ref": "#/$defs/security-requirement" - } - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/$defs/server" - } - } - }, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "external-documentation": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#external-documentation-object", - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri" - } - }, - "required": [ - "url" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "parameter": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#parameter-object", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "in": { - "enum": [ - "query", - "header", - "path", - "cookie" - ] - }, - "description": { - "type": "string" - }, - "required": { - "default": false, - "type": "boolean" - }, - "deprecated": { - "default": false, - "type": "boolean" - }, - "schema": { - "$dynamicRef": "#meta" - }, - "content": { - "$ref": "#/$defs/content", - "minProperties": 1, - "maxProperties": 1 - } - }, - "required": [ - "name", - "in" - ], - "oneOf": [ - { - "required": [ - "schema" - ] - }, - { - "required": [ - "content" - ] - } - ], - "if": { - "properties": { - "in": { - "const": "query" - } - }, - "required": [ - "in" - ] - }, - "then": { - "properties": { - "allowEmptyValue": { - "default": false, - "type": "boolean" - } - } - }, - "dependentSchemas": { - "schema": { - "properties": { - "style": { - "type": "string" - }, - "explode": { - "type": "boolean" - } - }, - "allOf": [ - { - "$ref": "#/$defs/examples" - }, - { - "$ref": "#/$defs/parameter/dependentSchemas/schema/$defs/styles-for-path" - }, - { - "$ref": "#/$defs/parameter/dependentSchemas/schema/$defs/styles-for-header" - }, - { - "$ref": "#/$defs/parameter/dependentSchemas/schema/$defs/styles-for-query" - }, - { - "$ref": "#/$defs/parameter/dependentSchemas/schema/$defs/styles-for-cookie" - }, - { - "$ref": "#/$defs/parameter/dependentSchemas/schema/$defs/styles-for-form" - } - ], - "$defs": { - "styles-for-path": { - "if": { - "properties": { - "in": { - "const": "path" - } - }, - "required": [ - "in" - ] - }, - "then": { - "properties": { - "name": { - "pattern": "[^/#?]+$" - }, - "style": { - "default": "simple", - "enum": [ - "matrix", - "label", - "simple" - ] - }, - "required": { - "const": true - } - }, - "required": [ - "required" - ] - } - }, - "styles-for-header": { - "if": { - "properties": { - "in": { - "const": "header" - } - }, - "required": [ - "in" - ] - }, - "then": { - "properties": { - "style": { - "default": "simple", - "const": "simple" - } - } - } - }, - "styles-for-query": { - "if": { - "properties": { - "in": { - "const": "query" - } - }, - "required": [ - "in" - ] - }, - "then": { - "properties": { - "style": { - "default": "form", - "enum": [ - "form", - "spaceDelimited", - "pipeDelimited", - "deepObject" - ] - }, - "allowReserved": { - "default": false, - "type": "boolean" - } - } - } - }, - "styles-for-cookie": { - "if": { - "properties": { - "in": { - "const": "cookie" - } - }, - "required": [ - "in" - ] - }, - "then": { - "properties": { - "style": { - "default": "form", - "const": "form" - } - } - } - }, - "styles-for-form": { - "if": { - "properties": { - "style": { - "const": "form" - } - }, - "required": [ - "style" - ] - }, - "then": { - "properties": { - "explode": { - "default": true - } - } - }, - "else": { - "properties": { - "explode": { - "default": false - } - } - } - } - } - } - }, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "parameter-or-reference": { - "if": { - "type": "object", - "required": [ - "$ref" - ] - }, - "then": { - "$ref": "#/$defs/reference" - }, - "else": { - "$ref": "#/$defs/parameter" - } - }, - "request-body": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#request-body-object", - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "content": { - "$ref": "#/$defs/content" - }, - "required": { - "default": false, - "type": "boolean" - } - }, - "required": [ - "content" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "request-body-or-reference": { - "if": { - "type": "object", - "required": [ - "$ref" - ] - }, - "then": { - "$ref": "#/$defs/reference" - }, - "else": { - "$ref": "#/$defs/request-body" - } - }, - "content": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#fixed-fields-10", - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/media-type" - }, - "propertyNames": { - "format": "media-range" - } - }, - "media-type": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#media-type-object", - "type": "object", - "properties": { - "schema": { - "$dynamicRef": "#meta" - }, - "encoding": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/encoding" - } - } - }, - "allOf": [ - { - "$ref": "#/$defs/specification-extensions" - }, - { - "$ref": "#/$defs/examples" - } - ], - "unevaluatedProperties": false - }, - "encoding": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#encoding-object", - "type": "object", - "properties": { - "contentType": { - "type": "string", - "format": "media-range" - }, - "headers": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/header-or-reference" - } - }, - "style": { - "default": "form", - "enum": [ - "form", - "spaceDelimited", - "pipeDelimited", - "deepObject" - ] - }, - "explode": { - "type": "boolean" - }, - "allowReserved": { - "default": false, - "type": "boolean" - } - }, - "allOf": [ - { - "$ref": "#/$defs/specification-extensions" - }, - { - "$ref": "#/$defs/encoding/$defs/explode-default" - } - ], - "unevaluatedProperties": false, - "$defs": { - "explode-default": { - "if": { - "properties": { - "style": { - "const": "form" - } - }, - "required": [ - "style" - ] - }, - "then": { - "properties": { - "explode": { - "default": true - } - } - }, - "else": { - "properties": { - "explode": { - "default": false - } - } - } - } - } - }, - "responses": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#responses-object", - "type": "object", - "properties": { - "default": { - "$ref": "#/$defs/response-or-reference" - } - }, - "patternProperties": { - "^[1-5](?:[0-9]{2}|XX)$": { - "$ref": "#/$defs/response-or-reference" - } - }, - "minProperties": 1, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false, - "if": { - "$comment": "either default, or at least one response code property must exist", - "patternProperties": { - "^[1-5](?:[0-9]{2}|XX)$": false - } - }, - "then" : { - "required": [ "default" ] - } - }, - "response": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#response-object", - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/header-or-reference" - } - }, - "content": { - "$ref": "#/$defs/content" - }, - "links": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/link-or-reference" - } - } - }, - "required": [ - "description" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "response-or-reference": { - "if": { - "type": "object", - "required": [ - "$ref" - ] - }, - "then": { - "$ref": "#/$defs/reference" - }, - "else": { - "$ref": "#/$defs/response" - } - }, - "callbacks": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#callback-object", - "type": "object", - "$ref": "#/$defs/specification-extensions", - "additionalProperties": { - "$ref": "#/$defs/path-item-or-reference" - } - }, - "callbacks-or-reference": { - "if": { - "type": "object", - "required": [ - "$ref" - ] - }, - "then": { - "$ref": "#/$defs/reference" - }, - "else": { - "$ref": "#/$defs/callbacks" - } - }, - "example": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#example-object", - "type": "object", - "properties": { - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "value": true, - "externalValue": { - "type": "string", - "format": "uri" - } - }, - "not": { - "required": [ - "value", - "externalValue" - ] - }, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "example-or-reference": { - "if": { - "type": "object", - "required": [ - "$ref" - ] - }, - "then": { - "$ref": "#/$defs/reference" - }, - "else": { - "$ref": "#/$defs/example" - } - }, - "link": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#link-object", - "type": "object", - "properties": { - "operationRef": { - "type": "string", - "format": "uri-reference" - }, - "operationId": { - "type": "string" - }, - "parameters": { - "$ref": "#/$defs/map-of-strings" - }, - "requestBody": true, - "description": { - "type": "string" - }, - "body": { - "$ref": "#/$defs/server" - } - }, - "oneOf": [ - { - "required": [ - "operationRef" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "link-or-reference": { - "if": { - "type": "object", - "required": [ - "$ref" - ] - }, - "then": { - "$ref": "#/$defs/reference" - }, - "else": { - "$ref": "#/$defs/link" - } - }, - "header": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#header-object", - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "required": { - "default": false, - "type": "boolean" - }, - "deprecated": { - "default": false, - "type": "boolean" - }, - "schema": { - "$dynamicRef": "#meta" - }, - "content": { - "$ref": "#/$defs/content", - "minProperties": 1, - "maxProperties": 1 - } - }, - "oneOf": [ - { - "required": [ - "schema" - ] - }, - { - "required": [ - "content" - ] - } - ], - "dependentSchemas": { - "schema": { - "properties": { - "style": { - "default": "simple", - "const": "simple" - }, - "explode": { - "default": false, - "type": "boolean" - } - }, - "$ref": "#/$defs/examples" - } - }, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "header-or-reference": { - "if": { - "type": "object", - "required": [ - "$ref" - ] - }, - "then": { - "$ref": "#/$defs/reference" - }, - "else": { - "$ref": "#/$defs/header" - } - }, - "tag": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#tag-object", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "externalDocs": { - "$ref": "#/$defs/external-documentation" - } - }, - "required": [ - "name" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "reference": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#reference-object", - "type": "object", - "properties": { - "$ref": { - "type": "string", - "format": "uri-reference" - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "unevaluatedProperties": false - }, - "schema": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#schema-object", - "$dynamicAnchor": "meta", - "type": [ - "object", - "boolean" - ] - }, - "security-scheme": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#security-scheme-object", - "type": "object", - "properties": { - "type": { - "enum": [ - "apiKey", - "http", - "mutualTLS", - "oauth2", - "openIdConnect" - ] - }, - "description": { - "type": "string" - } - }, - "required": [ - "type" - ], - "allOf": [ - { - "$ref": "#/$defs/specification-extensions" - }, - { - "$ref": "#/$defs/security-scheme/$defs/type-apikey" - }, - { - "$ref": "#/$defs/security-scheme/$defs/type-http" - }, - { - "$ref": "#/$defs/security-scheme/$defs/type-http-bearer" - }, - { - "$ref": "#/$defs/security-scheme/$defs/type-oauth2" - }, - { - "$ref": "#/$defs/security-scheme/$defs/type-oidc" - } - ], - "unevaluatedProperties": false, - "$defs": { - "type-apikey": { - "if": { - "properties": { - "type": { - "const": "apiKey" - } - }, - "required": [ - "type" - ] - }, - "then": { - "properties": { - "name": { - "type": "string" - }, - "in": { - "enum": [ - "query", - "header", - "cookie" - ] - } - }, - "required": [ - "name", - "in" - ] - } - }, - "type-http": { - "if": { - "properties": { - "type": { - "const": "http" - } - }, - "required": [ - "type" - ] - }, - "then": { - "properties": { - "scheme": { - "type": "string" - } - }, - "required": [ - "scheme" - ] - } - }, - "type-http-bearer": { - "if": { - "properties": { - "type": { - "const": "http" - }, - "scheme": { - "type": "string", - "pattern": "^[Bb][Ee][Aa][Rr][Ee][Rr]$" - } - }, - "required": [ - "type", - "scheme" - ] - }, - "then": { - "properties": { - "bearerFormat": { - "type": "string" - } - } - } - }, - "type-oauth2": { - "if": { - "properties": { - "type": { - "const": "oauth2" - } - }, - "required": [ - "type" - ] - }, - "then": { - "properties": { - "flows": { - "$ref": "#/$defs/oauth-flows" - } - }, - "required": [ - "flows" - ] - } - }, - "type-oidc": { - "if": { - "properties": { - "type": { - "const": "openIdConnect" - } - }, - "required": [ - "type" - ] - }, - "then": { - "properties": { - "openIdConnectUrl": { - "type": "string", - "format": "uri" - } - }, - "required": [ - "openIdConnectUrl" - ] - } - } - } - }, - "security-scheme-or-reference": { - "if": { - "type": "object", - "required": [ - "$ref" - ] - }, - "then": { - "$ref": "#/$defs/reference" - }, - "else": { - "$ref": "#/$defs/security-scheme" - } - }, - "oauth-flows": { - "type": "object", - "properties": { - "implicit": { - "$ref": "#/$defs/oauth-flows/$defs/implicit" - }, - "password": { - "$ref": "#/$defs/oauth-flows/$defs/password" - }, - "clientCredentials": { - "$ref": "#/$defs/oauth-flows/$defs/client-credentials" - }, - "authorizationCode": { - "$ref": "#/$defs/oauth-flows/$defs/authorization-code" - } - }, - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false, - "$defs": { - "implicit": { - "type": "object", - "properties": { - "authorizationUrl": { - "type": "string", - "format": "uri" - }, - "refreshUrl": { - "type": "string", - "format": "uri" - }, - "scopes": { - "$ref": "#/$defs/map-of-strings" - } - }, - "required": [ - "authorizationUrl", - "scopes" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "password": { - "type": "object", - "properties": { - "tokenUrl": { - "type": "string", - "format": "uri" - }, - "refreshUrl": { - "type": "string", - "format": "uri" - }, - "scopes": { - "$ref": "#/$defs/map-of-strings" - } - }, - "required": [ - "tokenUrl", - "scopes" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "client-credentials": { - "type": "object", - "properties": { - "tokenUrl": { - "type": "string", - "format": "uri" - }, - "refreshUrl": { - "type": "string", - "format": "uri" - }, - "scopes": { - "$ref": "#/$defs/map-of-strings" - } - }, - "required": [ - "tokenUrl", - "scopes" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - }, - "authorization-code": { - "type": "object", - "properties": { - "authorizationUrl": { - "type": "string", - "format": "uri" - }, - "tokenUrl": { - "type": "string", - "format": "uri" - }, - "refreshUrl": { - "type": "string", - "format": "uri" - }, - "scopes": { - "$ref": "#/$defs/map-of-strings" - } - }, - "required": [ - "authorizationUrl", - "tokenUrl", - "scopes" - ], - "$ref": "#/$defs/specification-extensions", - "unevaluatedProperties": false - } - } - }, - "security-requirement": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#security-requirement-object", - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "specification-extensions": { - "$comment": "https://spec.openapis.org/oas/v3.1.0#specification-extensions", - "patternProperties": { - "^x-": true - } - }, - "examples": { - "properties": { - "example": true, - "examples": { - "type": "object", - "additionalProperties": { - "$ref": "#/$defs/example-or-reference" - } - } - } - }, - "map-of-strings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } -} \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular/views.py b/.venv/lib/python3.10/site-packages/drf_spectacular/views.py deleted file mode 100644 index 804f127..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular/views.py +++ /dev/null @@ -1,288 +0,0 @@ -import json -from collections import namedtuple -from importlib import import_module -from typing import Any, Dict, List, Optional, Type - -from django.conf import settings -from django.templatetags.static import static -from django.utils import translation -from django.utils.translation import gettext_lazy as _ -from django.views.generic import RedirectView -from rest_framework.renderers import TemplateHTMLRenderer -from rest_framework.response import Response -from rest_framework.reverse import reverse -from rest_framework.settings import api_settings -from rest_framework.views import APIView - -from drf_spectacular.generators import SchemaGenerator -from drf_spectacular.plumbing import get_relative_url, set_query_parameters -from drf_spectacular.renderers import ( - OpenApiJsonRenderer, OpenApiJsonRenderer2, OpenApiYamlRenderer, OpenApiYamlRenderer2, -) -from drf_spectacular.settings import patched_settings, spectacular_settings -from drf_spectacular.types import OpenApiTypes -from drf_spectacular.utils import OpenApiParameter, extend_schema - -if spectacular_settings.SERVE_INCLUDE_SCHEMA: - SCHEMA_KWARGS: Dict[str, Any] = {'responses': {200: OpenApiTypes.OBJECT}} - - if settings.USE_I18N: - SCHEMA_KWARGS['parameters'] = [ - OpenApiParameter( - 'lang', str, OpenApiParameter.QUERY, enum=list(dict(settings.LANGUAGES).keys()) - ) - ] -else: - SCHEMA_KWARGS = {'exclude': True} - -if spectacular_settings.SERVE_AUTHENTICATION is not None: - AUTHENTICATION_CLASSES = spectacular_settings.SERVE_AUTHENTICATION -else: - AUTHENTICATION_CLASSES = api_settings.DEFAULT_AUTHENTICATION_CLASSES - - -class SpectacularAPIView(APIView): - __doc__ = _(""" - OpenApi3 schema for this API. Format can be selected via content negotiation. - - - YAML: application/vnd.oai.openapi - - JSON: application/vnd.oai.openapi+json - """) # type: ignore - renderer_classes = [ - OpenApiYamlRenderer, OpenApiYamlRenderer2, OpenApiJsonRenderer, OpenApiJsonRenderer2 - ] - permission_classes = spectacular_settings.SERVE_PERMISSIONS - authentication_classes = AUTHENTICATION_CLASSES - generator_class: Type[SchemaGenerator] = spectacular_settings.DEFAULT_GENERATOR_CLASS - serve_public: bool = spectacular_settings.SERVE_PUBLIC - urlconf: Optional[str] = spectacular_settings.SERVE_URLCONF - api_version: Optional[str] = None - custom_settings: Optional[Dict[str, Any]] = None - patterns: Optional[List[Any]] = None - - @extend_schema(**SCHEMA_KWARGS) - def get(self, request, *args, **kwargs): - # special handling of custom urlconf parameter - if isinstance(self.urlconf, list) or isinstance(self.urlconf, tuple): - ModuleWrapper = namedtuple('ModuleWrapper', ['urlpatterns']) - if all(isinstance(i, str) for i in self.urlconf): - # list of import string for urlconf - patterns = [] - for item in self.urlconf: - url = import_module(item) - patterns += url.urlpatterns - self.urlconf = ModuleWrapper(tuple(patterns)) - else: - # explicitly resolved urlconf - self.urlconf = ModuleWrapper(tuple(self.urlconf)) - - with patched_settings(self.custom_settings): - if settings.USE_I18N and request.GET.get('lang'): - with translation.override(request.GET.get('lang')): - return self._get_schema_response(request) - else: - return self._get_schema_response(request) - - def _get_schema_response(self, request): - # version specified as parameter to the view always takes precedence. after - # that we try to source version through the schema view's own versioning_class. - version = self.api_version or request.version or self._get_version_parameter(request) - generator = self.generator_class(urlconf=self.urlconf, api_version=version, patterns=self.patterns) - return Response( - data=generator.get_schema(request=request, public=self.serve_public), - headers={"Content-Disposition": f'inline; filename="{self._get_filename(request, version)}"'} - ) - - def _get_filename(self, request, version): - return "{title}{version}.{suffix}".format( - title=spectacular_settings.TITLE or 'schema', - version=f' ({version})' if version else '', - suffix=self.perform_content_negotiation(request, force=True)[0].format - ) - - def _get_version_parameter(self, request): - version = request.GET.get('version') - if not api_settings.ALLOWED_VERSIONS or version in api_settings.ALLOWED_VERSIONS: - return version - return None - - -class SpectacularYAMLAPIView(SpectacularAPIView): - renderer_classes = [OpenApiYamlRenderer, OpenApiYamlRenderer2] - - -class SpectacularJSONAPIView(SpectacularAPIView): - renderer_classes = [OpenApiJsonRenderer, OpenApiJsonRenderer2] - - -def _get_sidecar_url(filepath): - return static(f'drf_spectacular_sidecar/{filepath}') - - -class SpectacularSwaggerView(APIView): - renderer_classes = [TemplateHTMLRenderer] - permission_classes = spectacular_settings.SERVE_PERMISSIONS - authentication_classes = AUTHENTICATION_CLASSES - url_name: str = 'schema' - url: Optional[str] = None - template_name: str = 'drf_spectacular/swagger_ui.html' - template_name_js: str = 'drf_spectacular/swagger_ui.js' - title: str = spectacular_settings.TITLE - - @extend_schema(exclude=True) - def get(self, request, *args, **kwargs): - return Response( - data={ - 'title': self.title, - 'swagger_ui_css': self._swagger_ui_resource('swagger-ui.css'), - 'swagger_ui_bundle': self._swagger_ui_resource('swagger-ui-bundle.js'), - 'swagger_ui_standalone': self._swagger_ui_resource('swagger-ui-standalone-preset.js'), - 'favicon_href': self._swagger_ui_favicon(), - 'schema_url': self._get_schema_url(request), - 'settings': self._dump(spectacular_settings.SWAGGER_UI_SETTINGS), - 'oauth2_config': self._dump(spectacular_settings.SWAGGER_UI_OAUTH2_CONFIG), - 'template_name_js': self.template_name_js, - 'script_url': None, - 'csrf_header_name': self._get_csrf_header_name(), - 'schema_auth_names': self._dump(self._get_schema_auth_names()), - }, - template_name=self.template_name, - headers={ - "Cross-Origin-Opener-Policy": "unsafe-none", - } - ) - - def _dump(self, data): - return data if isinstance(data, str) else json.dumps(data, indent=2) - - def _get_schema_url(self, request): - schema_url = self.url or get_relative_url(reverse(self.url_name, request=request)) - return set_query_parameters( - url=schema_url, - lang=request.GET.get('lang'), - version=request.GET.get('version') - ) - - def _get_csrf_header_name(self): - csrf_header_name = settings.CSRF_HEADER_NAME - if csrf_header_name.startswith('HTTP_'): - csrf_header_name = csrf_header_name[5:] - return csrf_header_name.replace('_', '-') - - def _get_schema_auth_names(self): - from drf_spectacular.extensions import OpenApiAuthenticationExtension - if spectacular_settings.SERVE_PUBLIC: - return [] - auth_extensions = [ - OpenApiAuthenticationExtension.get_match(klass) - for klass in self.authentication_classes - ] - return [auth.name for auth in auth_extensions if auth] - - @staticmethod - def _swagger_ui_resource(filename): - if spectacular_settings.SWAGGER_UI_DIST == 'SIDECAR': - return _get_sidecar_url(f'swagger-ui-dist/{filename}') - return f'{spectacular_settings.SWAGGER_UI_DIST}/{filename}' - - @staticmethod - def _swagger_ui_favicon(): - if spectacular_settings.SWAGGER_UI_FAVICON_HREF == 'SIDECAR': - return _get_sidecar_url('swagger-ui-dist/favicon-32x32.png') - return spectacular_settings.SWAGGER_UI_FAVICON_HREF - - -class SpectacularSwaggerSplitView(SpectacularSwaggerView): - """ - Alternate Swagger UI implementation that separates the html request from the - javascript request to cater to web servers with stricter CSP policies. - """ - url_self: Optional[str] = None - - @extend_schema(exclude=True) - def get(self, request, *args, **kwargs): - if request.GET.get('script') is not None: - return Response( - data={ - 'schema_url': self._get_schema_url(request), - 'settings': self._dump(spectacular_settings.SWAGGER_UI_SETTINGS), - 'oauth2_config': self._dump(spectacular_settings.SWAGGER_UI_OAUTH2_CONFIG), - 'csrf_header_name': self._get_csrf_header_name(), - 'schema_auth_names': self._dump(self._get_schema_auth_names()), - }, - template_name=self.template_name_js, - content_type='application/javascript', - ) - else: - script_url = self.url_self or request.get_full_path() - return Response( - data={ - 'title': self.title, - 'swagger_ui_css': self._swagger_ui_resource('swagger-ui.css'), - 'swagger_ui_bundle': self._swagger_ui_resource('swagger-ui-bundle.js'), - 'swagger_ui_standalone': self._swagger_ui_resource('swagger-ui-standalone-preset.js'), - 'favicon_href': self._swagger_ui_favicon(), - 'script_url': set_query_parameters( - url=script_url, - lang=request.GET.get('lang'), - script='' # signal to deliver init script - ) - }, - template_name=self.template_name, - ) - - -class SpectacularRedocView(APIView): - renderer_classes = [TemplateHTMLRenderer] - permission_classes = spectacular_settings.SERVE_PERMISSIONS - authentication_classes = AUTHENTICATION_CLASSES - url_name: str = 'schema' - url: Optional[str] = None - template_name: str = 'drf_spectacular/redoc.html' - title: Optional[str] = spectacular_settings.TITLE - - @extend_schema(exclude=True) - def get(self, request, *args, **kwargs): - return Response( - data={ - 'title': self.title, - 'redoc_standalone': self._redoc_standalone(), - 'schema_url': self._get_schema_url(request), - 'settings': self._dump(spectacular_settings.REDOC_UI_SETTINGS), - }, - template_name=self.template_name - ) - - def _dump(self, data): - if not data: - return None - elif isinstance(data, str): - return data - else: - return json.dumps(data, indent=2) - - @staticmethod - def _redoc_standalone(): - if spectacular_settings.REDOC_DIST == 'SIDECAR': - return _get_sidecar_url('redoc/bundles/redoc.standalone.js') - return f'{spectacular_settings.REDOC_DIST}/bundles/redoc.standalone.js' - - def _get_schema_url(self, request): - schema_url = self.url or get_relative_url(reverse(self.url_name, request=request)) - return set_query_parameters( - url=schema_url, - lang=request.GET.get('lang'), - version=request.GET.get('version') - ) - - -class SpectacularSwaggerOauthRedirectView(RedirectView): - """ - A view that serves the SwaggerUI oauth2-redirect.html file so that SwaggerUI can authenticate itself using Oauth2 - - This view should be served as ``./oauth2-redirect.html`` relative to the SwaggerUI itself. - If that is not possible, this views absolute url can also be set via the - ``SPECTACULAR_SETTINGS.SWAGGER_UI_SETTINGS.oauth2RedirectUrl`` django settings. - """ - def get_redirect_url(self, *args, **kwargs): - return _get_sidecar_url("swagger-ui-dist/oauth2-redirect.html") + "?" + self.request.GET.urlencode() diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/METADATA b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/METADATA deleted file mode 100644 index 6e8c2c3..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/METADATA +++ /dev/null @@ -1,99 +0,0 @@ -Metadata-Version: 2.4 -Name: drf-spectacular-sidecar -Version: 2025.5.1 -Summary: Serve self-contained distribution builds of Swagger UI and Redoc with Django -Home-page: https://github.com/tfranzel/drf-spectacular-sidecar -Author: T. Franzel -Author-email: tfranzel@gmail.com -License: BSD -Project-URL: Source, https://github.com/tfranzel/drf-spectacular-sidecar -Project-URL: Documentation, https://drf-spectacular.readthedocs.io -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Natural Language :: English -Classifier: Programming Language :: Python :: 3 -Classifier: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: Documentation -Classifier: Topic :: Software Development :: Code Generators -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: Django>=2.2 -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: description-content-type -Dynamic: home-page -Dynamic: license -Dynamic: license-file -Dynamic: project-url -Dynamic: requires-dist -Dynamic: requires-python -Dynamic: summary - -======================= -drf-spectacular-sidecar -======================= - -|pypi-version| |pypi-dl| - -Serve self-contained distribution builds of `Swagger UI`_ and `Redoc`_ with `Django`_ either via `runserver`_ or `collectstatic`_. - -This Django app is an optional addition to `drf-spectacular`_, but does not depend on it. It may also be used independently. - -* `Swagger UI`_ version ``5.21.0`` (`npm `__) -* `Redoc`_ version ``2.5.0`` (`npm `__) - -This is a self-updating and self-publishing repository that looks for updates on the 1st of every month. -The distribution files are sourced from npm via `jsdelivr`_, validated, packaged and uploaded to `PyPI`_. - -Installation ------------- - -.. code:: bash - - $ pip install drf-spectacular-sidecar - -The package needs to be registered to allow Django to discover the static files. - -.. code:: python - - INSTALLED_APPS = [ - # ALL YOUR APPS - 'drf_spectacular_sidecar', - ] - -Requirements ------------- - -Django >= 2.2 - -Licenses --------- - -Provided by `T. Franzel `_. `Licensed under 3-Clause BSD `_. - -This package includes distribution builds of - -* `Swagger UI`_: The `original license (Apache 2.0) `_ and copyright apply to those files. -* `Redoc`_: The `original license (MIT) `_ and copyright apply to those files. - - -.. |pypi-version| image:: https://img.shields.io/pypi/v/drf-spectacular-sidecar.svg - :target: https://pypi.org/project/drf-spectacular-sidecar/ -.. |pypi-dl| image:: https://img.shields.io/pypi/dm/drf-spectacular-sidecar - :target: https://pypi.org/project/drf-spectacular-sidecar/ - -.. _PyPI: https://pypi.org/project/drf-spectacular-sidecar/ -.. _jsdelivr: https://www.jsdelivr.com/ -.. _Django: https://www.djangoproject.com/ -.. _drf-spectacular: https://github.com/tfranzel/drf-spectacular -.. _Redoc: https://github.com/Redocly/redoc -.. _Swagger UI: https://github.com/swagger-api/swagger-ui -.. _collectstatic: https://docs.djangoproject.com/en/3.2/ref/contrib/staticfiles/#collectstatic -.. _runserver: https://docs.djangoproject.com/en/3.2/ref/contrib/staticfiles/#runserver diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/RECORD b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/RECORD deleted file mode 100644 index 55e95bf..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/RECORD +++ /dev/null @@ -1,24 +0,0 @@ -drf_spectacular_sidecar-2025.5.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -drf_spectacular_sidecar-2025.5.1.dist-info/METADATA,sha256=OVeffx95YNG-lQauT3a3aqJuZh4VTgLpL7CrDdrE3LA,3644 -drf_spectacular_sidecar-2025.5.1.dist-info/RECORD,, -drf_spectacular_sidecar-2025.5.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -drf_spectacular_sidecar-2025.5.1.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91 -drf_spectacular_sidecar-2025.5.1.dist-info/licenses/LICENSE,sha256=XSslWG6oMYAsr9jDsXatmyafrvE5ImpixovTZxtGjj4,1517 -drf_spectacular_sidecar-2025.5.1.dist-info/top_level.txt,sha256=lA-NFKAUCQ2YBWBr2REMk10S89VO98JbkozlqJrnvpo,24 -drf_spectacular_sidecar/__init__.py,sha256=lgGlBKtoy65FE-6FPPoASYXQnvfUfkos2Y3W5yQ9PUQ,150 -drf_spectacular_sidecar/__pycache__/__init__.cpython-310.pyc,, -drf_spectacular_sidecar/__pycache__/apps.cpython-310.pyc,, -drf_spectacular_sidecar/apps.py,sha256=RLj2Go2u4YSwaiL6aq0gUE6hOMDYh3a6IHvp0iXFBao,161 -drf_spectacular_sidecar/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/redoc/bundles/redoc.standalone.js,sha256=DsBb4oWsiFozAomwL0cOG9vStrMiOp-iE_JL-AWoUdE,910994 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/redoc/bundles/redoc.standalone.js.LICENSE.txt,sha256=Gxi5hiJfioX6f8rxkfARi7KXuoxvAntmnkt5goycF-0,2729 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/redoc/bundles/redoc.standalone.js.map,sha256=GQyjeZQvqYSEEGha_oyLEcvrccZXBhBlqXFYcNGYuOI,3225162 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/swagger-ui-dist/favicon-32x32.png,sha256=PtYS9B4FDKXnAAytbxy-fn2jn2X8qZwC6Z5lkQVuWDc,628 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/swagger-ui-dist/oauth2-redirect.html,sha256=OX_TCiSZzSxfNBGt4Mp_vXhtUBFjnKeKBoJNWAuDwSI,2715 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/swagger-ui-dist/swagger-ui-bundle.js,sha256=9VfbU42JadwPNda0QbPHzAvoRdncD8-_ZupnBTrokzs,1468326 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/swagger-ui-dist/swagger-ui-bundle.js.LICENSE.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/swagger-ui-dist/swagger-ui-bundle.js.map,sha256=XA0HBcAHnjwbJK6IBi38JZaPT5dU3o-hTLtUiviZaVQ,1920878 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/swagger-ui-dist/swagger-ui-standalone-preset.js,sha256=hxC22Q7OcRPdRnUA-hTtM7WEi2i4aVrQdfjVxsmvOwE,229223 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/swagger-ui-dist/swagger-ui-standalone-preset.js.map,sha256=Y2JB5Bwr5afywvXmw_lyIRGbefR6zvxhsglWioWFv9Q,330036 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/swagger-ui-dist/swagger-ui.css,sha256=KeeoUP6jsaHmQb_y_5szAvjABj1DWXEka1kuGJuAiYk,154986 -drf_spectacular_sidecar/static/drf_spectacular_sidecar/swagger-ui-dist/swagger-ui.css.map,sha256=ewlQ9XaMaMGNe4eQ8imNjoCcayiKoU0OZgBRqlDaCds,258848 diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/REQUESTED b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/WHEEL deleted file mode 100644 index 8b9e2d3..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.1.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/licenses/LICENSE b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/licenses/LICENSE deleted file mode 100644 index 56e0b3e..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/licenses/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright © 2021-present, T. Franzel - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/top_level.txt deleted file mode 100644 index f61161f..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar-2025.5.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -drf_spectacular_sidecar diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/__init__.py b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/__init__.py deleted file mode 100644 index b9f366d..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -import django - -__version__ = '2025.5.1' - -if django.VERSION < (3, 2): - default_app_config = 'drf_spectacular_sidecar.apps.SpectacularSidecarConfig' diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/apps.py b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/apps.py deleted file mode 100644 index 51d07fe..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class SpectacularSidecarConfig(AppConfig): - name = 'drf_spectacular_sidecar' - verbose_name = "drf-spectacular-sidecar" diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/py.typed b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/static/drf_spectacular_sidecar/redoc/bundles/redoc.standalone.js b/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/static/drf_spectacular_sidecar/redoc/bundles/redoc.standalone.js deleted file mode 100644 index ed4b16e..0000000 --- a/.venv/lib/python3.10/site-packages/drf_spectacular_sidecar/static/drf_spectacular_sidecar/redoc/bundles/redoc.standalone.js +++ /dev/null @@ -1,1832 +0,0 @@ -/*! For license information please see redoc.standalone.js.LICENSE.txt */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")):"function"==typeof define&&define.amd?define(["null"],t):"object"==typeof exports?exports.Redoc=t(require("null")):e.Redoc=t(e.null)}(this,(function(e){return function(){var t={854:function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{l(r.next(e))}catch(e){o(e)}}function s(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}l((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.mapTypeToComponent=t.bundleDocument=t.bundleFromString=t.bundle=t.OasVersion=void 0;const i=n(8142),o=n(2928),a=n(2161),s=n(1990),l=n(5735),c=n(3101),u=n(3873),p=n(2900),d=n(3416),f=n(8209),h=n(4125),m=n(474),g=n(4335);var y;function b(e){return r(this,void 0,void 0,(function*(){const{document:t,config:n,customTypes:r,externalRefResolver:i,dereference:u=!1,skipRedoclyRegistryRefs:d=!1,removeUnusedComponents:f=!1,keepUrlRefs:h=!1}=e,y=(0,c.detectSpec)(t.parsed),b=(0,c.getMajorSpecVersion)(y),v=n.getRulesForOasVersion(b),w=(0,s.normalizeTypes)(n.extendTypes(null!=r?r:(0,c.getTypes)(y),y),n),k=(0,p.initRules)(v,n,"preprocessors",y),S=(0,p.initRules)(v,n,"decorators",y),E={problems:[],oasVersion:y,refTypes:new Map,visitorsData:{}};f&&S.push({severity:"error",ruleId:"remove-unused-components",visitor:b===c.SpecMajorVersion.OAS2?(0,m.RemoveUnusedComponents)({}):(0,g.RemoveUnusedComponents)({})});let O=yield(0,o.resolveDocument)({rootDocument:t,rootType:w.Root,externalRefResolver:i});k.length>0&&((0,l.walkDocument)({document:t,rootType:w.Root,normalizedVisitors:(0,a.normalizeVisitors)(k,w),resolvedRefMap:O,ctx:E}),O=yield(0,o.resolveDocument)({rootDocument:t,rootType:w.Root,externalRefResolver:i}));const _=(0,a.normalizeVisitors)([{severity:"error",ruleId:"bundler",visitor:x(b,u,d,t,O,h)},...S],w);return(0,l.walkDocument)({document:t,rootType:w.Root,normalizedVisitors:_,resolvedRefMap:O,ctx:E}),{bundle:t,problems:E.problems.map((e=>n.addProblemToIgnore(e))),fileDependencies:i.getFiles(),rootType:w.Root,refTypes:E.refTypes,visitorsData:E.visitorsData}}))}function v(e,t){switch(t){case c.SpecMajorVersion.OAS3:switch(e){case"Schema":return"schemas";case"Parameter":return"parameters";case"Response":return"responses";case"Example":return"examples";case"RequestBody":return"requestBodies";case"Header":return"headers";case"SecuritySchema":return"securitySchemes";case"Link":return"links";case"Callback":return"callbacks";default:return null}case c.SpecMajorVersion.OAS2:switch(e){case"Schema":return"definitions";case"Parameter":return"parameters";case"Response":return"responses";default:return null}case c.SpecMajorVersion.Async2:switch(e){case"Schema":return"schemas";case"Parameter":return"parameters";default:return null}}}function x(e,t,n,r,a,s){let l,p;const m={ref:{leave(i,l,c){if(!c.location||void 0===c.node)return void(0,d.reportUnresolvedRef)(c,l.report,l.location);if(c.location.source===r.source&&c.location.source===l.location.source&&"scalar"!==l.type.name&&!t)return;if(n&&(0,h.isRedoclyRegistryURL)(i.$ref))return;if(s&&(0,u.isAbsoluteUrl)(i.$ref))return;const p=v(l.type.name,e);p?t?(y(p,c,l),g(i,c,l)):(i.$ref=y(p,c,l),function(e,t,n){const i=(0,o.makeRefId)(n.location.source.absoluteRef,e.$ref);a.set(i,{document:r,isRemote:!1,node:t.node,nodePointer:e.$ref,resolved:!0})}(i,c,l)):g(i,c,l)}},Root:{enter(t,n){p=n.location,e===c.SpecMajorVersion.OAS3?l=t.components=t.components||{}:e===c.SpecMajorVersion.OAS2&&(l=t)}}};function g(e,t,n){if((0,f.isPlainObject)(t.node)){delete e.$ref;const n=Object.assign({},t.node,e);Object.assign(e,n)}else n.parent[n.key]=t.node}function y(t,n,r){l[t]=l[t]||{};const i=function(e,t,n){const[r,i]=[e.location.source.absoluteRef,e.location.pointer],o=l[t];let a="";const s=i.slice(2).split("/").filter(f.isTruthy);for(;s.length>0;)if(a=s.pop()+(a?`-${a}`:""),!o||!o[a]||b(o[a],e,n))return a;if(a=(0,u.refBaseName)(r)+(a?`_${a}`:""),!o[a]||b(o[a],e,n))return a;const c=a;let p=2;for(;o[a]&&!b(o[a],e,n);)a=`${c}-${p}`,p++;return o[a]||n.report({message:`Two schemas are referenced with the same name but different content. Renamed ${c} to ${a}.`,location:n.location,forceSeverity:"warn"}),a}(n,t,r);return l[t][i]=n.node,e===c.SpecMajorVersion.OAS3?`#/components/${t}/${i}`:`#/${t}/${i}`}function b(e,t,n){var r;return!(!(0,u.isRef)(e)||(null===(r=n.resolve(e,p.absolutePointer).location)||void 0===r?void 0:r.absolutePointer)!==t.location.absolutePointer)||i(e,t.node)}return e===c.SpecMajorVersion.OAS3&&(m.DiscriminatorMapping={leave(n,r){for(const i of Object.keys(n)){const o=n[i],a=r.resolve({$ref:o});if(!a.location||void 0===a.node)return void(0,d.reportUnresolvedRef)(a,r.report,r.location.child(i));const s=v("Schema",e);t?y(s,a,r):n[i]=y(s,a,r)}}}),m}!function(e){e.Version2="oas2",e.Version3_0="oas3_0",e.Version3_1="oas3_1"}(y||(t.OasVersion=y={})),t.bundle=function(e){return r(this,void 0,void 0,(function*(){const{ref:t,doc:n,externalRefResolver:r=new o.BaseResolver(e.config.resolve),base:i=null}=e;if(!t&&!n)throw new Error("Document or reference is required.\n");const a=void 0===n?yield r.resolveDocument(i,t,!0):n;if(a instanceof Error)throw a;return b(Object.assign(Object.assign({document:a},e),{config:e.config.styleguide,externalRefResolver:r}))}))},t.bundleFromString=function(e){return r(this,void 0,void 0,(function*(){const{source:t,absoluteRef:n,externalRefResolver:r=new o.BaseResolver(e.config.resolve)}=e,i=(0,o.makeDocumentFromString)(t,n||"/");return b(Object.assign(Object.assign({document:i},e),{externalRefResolver:r,config:e.config.styleguide}))}))},t.bundleDocument=b,t.mapTypeToComponent=v},8921:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Config=t.StyleguideConfig=t.AVAILABLE_REGIONS=t.DOMAINS=t.DEFAULT_REGION=t.IGNORE_FILE=void 0;const r=n(7992),i=n(7975),o=n(970),a=n(8209),s=n(3101),l=n(1827),c=n(462),u=n(3873);t.IGNORE_FILE=".redocly.lint-ignore.yaml",t.DEFAULT_REGION="us",t.DOMAINS=function(){const e={us:"redocly.com",eu:"eu.redocly.com"},t=l.env.REDOCLY_DOMAIN;return(null==t?void 0:t.endsWith(".redocly.host"))&&(e[t.split(".")[0]]=t),"redoc.online"===t&&(e[t]=t),e}(),t.AVAILABLE_REGIONS=Object.keys(t.DOMAINS);class p{constructor(e,n){this.rawConfig=e,this.configFile=n,this.ignore={},this._usedRules=new Set,this._usedVersions=new Set,this.plugins=e.plugins||[],this.doNotResolveExamples=!!e.doNotResolveExamples,this.recommendedFallback=e.recommendedFallback||!1,this.rules={[s.SpecVersion.OAS2]:Object.assign(Object.assign({},e.rules),e.oas2Rules),[s.SpecVersion.OAS3_0]:Object.assign(Object.assign({},e.rules),e.oas3_0Rules),[s.SpecVersion.OAS3_1]:Object.assign(Object.assign({},e.rules),e.oas3_1Rules),[s.SpecVersion.Async2]:Object.assign(Object.assign({},e.rules),e.async2Rules)},this.preprocessors={[s.SpecVersion.OAS2]:Object.assign(Object.assign({},e.preprocessors),e.oas2Preprocessors),[s.SpecVersion.OAS3_0]:Object.assign(Object.assign({},e.preprocessors),e.oas3_0Preprocessors),[s.SpecVersion.OAS3_1]:Object.assign(Object.assign({},e.preprocessors),e.oas3_1Preprocessors),[s.SpecVersion.Async2]:Object.assign(Object.assign({},e.preprocessors),e.async2Preprocessors)},this.decorators={[s.SpecVersion.OAS2]:Object.assign(Object.assign({},e.decorators),e.oas2Decorators),[s.SpecVersion.OAS3_0]:Object.assign(Object.assign({},e.decorators),e.oas3_0Decorators),[s.SpecVersion.OAS3_1]:Object.assign(Object.assign({},e.decorators),e.oas3_1Decorators),[s.SpecVersion.Async2]:Object.assign(Object.assign({},e.decorators),e.async2Decorators)},this.extendPaths=e.extendPaths||[],this.pluginPaths=e.pluginPaths||[],this.resolveIgnore(function(e){return e?(0,a.doesYamlFileExist)(e)?i.join(i.dirname(e),t.IGNORE_FILE):i.join(e,t.IGNORE_FILE):l.isBrowser?void 0:i.join(process.cwd(),t.IGNORE_FILE)}(n))}resolveIgnore(e){if(e&&(0,a.doesYamlFileExist)(e)){this.ignore=(0,o.parseYaml)(r.readFileSync(e,"utf-8"))||{};for(const t of Object.keys(this.ignore)){this.ignore[(0,u.isAbsoluteUrl)(t)?t:i.resolve(i.dirname(e),t)]=this.ignore[t];for(const e of Object.keys(this.ignore[t]))this.ignore[t][e]=new Set(this.ignore[t][e]);(0,u.isAbsoluteUrl)(t)||delete this.ignore[t]}}}saveIgnore(){const e=this.configFile?i.dirname(this.configFile):process.cwd(),n=i.join(e,t.IGNORE_FILE),s={};for(const t of Object.keys(this.ignore)){const n=s[(0,u.isAbsoluteUrl)(t)?t:(0,a.slash)(i.relative(e,t))]=this.ignore[t];for(const e of Object.keys(n))n[e]=Array.from(n[e])}r.writeFileSync(n,"# This file instructs Redocly's linter to ignore the rules contained for specific parts of your API.\n# See https://redoc.ly/docs/cli/ for more information.\n"+(0,o.stringifyYaml)(s))}addIgnore(e){const t=this.ignore,n=e.location[0];if(void 0===n.pointer)return;const r=t[n.source.absoluteRef]=t[n.source.absoluteRef]||{};(r[e.ruleId]=r[e.ruleId]||new Set).add(n.pointer)}addProblemToIgnore(e){const t=e.location[0];if(void 0===t.pointer)return e;const n=(this.ignore[t.source.absoluteRef]||{})[e.ruleId],r=n&&n.has(t.pointer);return r?Object.assign(Object.assign({},e),{ignored:r}):e}extendTypes(e,t){let n=e;for(const e of this.plugins)if(void 0!==e.typeExtension)switch(t){case s.SpecVersion.OAS3_0:case s.SpecVersion.OAS3_1:if(!e.typeExtension.oas3)continue;n=e.typeExtension.oas3(n,t);break;case s.SpecVersion.OAS2:if(!e.typeExtension.oas2)continue;n=e.typeExtension.oas2(n,t);break;case s.SpecVersion.Async2:if(!e.typeExtension.async2)continue;n=e.typeExtension.async2(n,t);break;default:throw new Error("Not implemented")}return n}getRuleSettings(e,t){this._usedRules.add(e),this._usedVersions.add(t);const n=this.rules[t][e]||"off";return"string"==typeof n?{severity:n}:Object.assign({severity:"error"},n)}getPreprocessorSettings(e,t){this._usedRules.add(e),this._usedVersions.add(t);const n=this.preprocessors[t][e]||"off";return"string"==typeof n?{severity:"on"===n?"error":n}:Object.assign({severity:"error"},n)}getDecoratorSettings(e,t){this._usedRules.add(e),this._usedVersions.add(t);const n=this.decorators[t][e]||"off";return"string"==typeof n?{severity:"on"===n?"error":n}:Object.assign({severity:"error"},n)}getUnusedRules(){const e=[],t=[],n=[];for(const r of Array.from(this._usedVersions))e.push(...Object.keys(this.rules[r]).filter((e=>!this._usedRules.has(e)))),t.push(...Object.keys(this.decorators[r]).filter((e=>!this._usedRules.has(e)))),n.push(...Object.keys(this.preprocessors[r]).filter((e=>!this._usedRules.has(e))));return{rules:e,preprocessors:n,decorators:t}}getRulesForOasVersion(e){switch(e){case s.SpecMajorVersion.OAS3:const e=[];return this.plugins.forEach((t=>{var n;return(null===(n=t.preprocessors)||void 0===n?void 0:n.oas3)&&e.push(t.preprocessors.oas3)})),this.plugins.forEach((t=>{var n;return(null===(n=t.rules)||void 0===n?void 0:n.oas3)&&e.push(t.rules.oas3)})),this.plugins.forEach((t=>{var n;return(null===(n=t.decorators)||void 0===n?void 0:n.oas3)&&e.push(t.decorators.oas3)})),e;case s.SpecMajorVersion.OAS2:const t=[];return this.plugins.forEach((e=>{var n;return(null===(n=e.preprocessors)||void 0===n?void 0:n.oas2)&&t.push(e.preprocessors.oas2)})),this.plugins.forEach((e=>{var n;return(null===(n=e.rules)||void 0===n?void 0:n.oas2)&&t.push(e.rules.oas2)})),this.plugins.forEach((e=>{var n;return(null===(n=e.decorators)||void 0===n?void 0:n.oas2)&&t.push(e.decorators.oas2)})),t;case s.SpecMajorVersion.Async2:const n=[];return this.plugins.forEach((e=>{var t;return(null===(t=e.preprocessors)||void 0===t?void 0:t.async2)&&n.push(e.preprocessors.async2)})),this.plugins.forEach((e=>{var t;return(null===(t=e.rules)||void 0===t?void 0:t.async2)&&n.push(e.rules.async2)})),this.plugins.forEach((e=>{var t;return(null===(t=e.decorators)||void 0===t?void 0:t.async2)&&n.push(e.decorators.async2)})),n}}skipRules(e){for(const t of e||[])for(const e of Object.values(s.SpecVersion))this.rules[e][t]&&(this.rules[e][t]="off")}skipPreprocessors(e){for(const t of e||[])for(const e of Object.values(s.SpecVersion))this.preprocessors[e][t]&&(this.preprocessors[e][t]="off")}skipDecorators(e){for(const t of e||[])for(const e of Object.values(s.SpecVersion))this.decorators[e][t]&&(this.decorators[e][t]="off")}}t.StyleguideConfig=p,t.Config=class{constructor(e,t){this.rawConfig=e,this.configFile=t,this.apis=e.apis||{},this.styleguide=new p(e.styleguide||{},t),this.theme=e.theme||{},this.resolve=(0,c.getResolveConfig)(null==e?void 0:e.resolve),this.region=e.region,this.organization=e.organization,this.files=e.files||[],this.telemetry=e.telemetry}}},2900:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initRules=void 0;const r=n(8209);t.initRules=function(e,t,n,i){return e.flatMap((e=>Object.keys(e).map((r=>{const o=e[r],a="rules"===n?t.getRuleSettings(r,i):"preprocessors"===n?t.getPreprocessorSettings(r,i):t.getDecoratorSettings(r,i);if("off"===a.severity)return;const s=a.severity,l=o(a);return Array.isArray(l)?l.map((e=>({severity:s,ruleId:r,visitor:e}))):{severity:s,ruleId:r,visitor:l}})))).flatMap((e=>e)).filter(r.isDefined)}},462:function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(r=Object.getOwnPropertySymbols(e);it[e]));n[e]&&null===t&&(0,i.showWarningForDeprecatedField)(e),n[e]&&t&&n[t]&&(0,i.showErrorForDeprecatedField)(e,t),n[e]&&r&&n[r]&&(0,i.showErrorForDeprecatedField)(e,t,r),(n[e]||o)&&(0,i.showWarningForDeprecatedField)(e,t,r)}t.parsePresetName=function(e){if(e.indexOf("/")>-1){const[t,n]=e.split("/");return{pluginId:t,configName:n}}return{pluginId:"",configName:e}},t.transformApiDefinitionsToApis=s,t.prefixRules=function(e,t){if(!t)return e;const n={};for(const r of Object.keys(e))n[`${t}/${r}`]=e[r];return n},t.mergeExtends=function(e){const t={rules:{},oas2Rules:{},oas3_0Rules:{},oas3_1Rules:{},async2Rules:{},preprocessors:{},oas2Preprocessors:{},oas3_0Preprocessors:{},oas3_1Preprocessors:{},async2Preprocessors:{},decorators:{},oas2Decorators:{},oas3_0Decorators:{},oas3_1Decorators:{},async2Decorators:{},plugins:[],pluginPaths:[],extendPaths:[]};for(const n of e){if(n.extends)throw new Error(`'extends' is not supported in shared configs yet: ${JSON.stringify(n,null,2)}.`);Object.assign(t.rules,n.rules),Object.assign(t.oas2Rules,n.oas2Rules),(0,i.assignExisting)(t.oas2Rules,n.rules||{}),Object.assign(t.oas3_0Rules,n.oas3_0Rules),(0,i.assignExisting)(t.oas3_0Rules,n.rules||{}),Object.assign(t.oas3_1Rules,n.oas3_1Rules),(0,i.assignExisting)(t.oas3_1Rules,n.rules||{}),Object.assign(t.async2Rules,n.async2Rules),(0,i.assignExisting)(t.async2Rules,n.rules||{}),Object.assign(t.preprocessors,n.preprocessors),Object.assign(t.oas2Preprocessors,n.oas2Preprocessors),(0,i.assignExisting)(t.oas2Preprocessors,n.preprocessors||{}),Object.assign(t.oas3_0Preprocessors,n.oas3_0Preprocessors),(0,i.assignExisting)(t.oas3_0Preprocessors,n.preprocessors||{}),Object.assign(t.oas3_1Preprocessors,n.oas3_1Preprocessors),(0,i.assignExisting)(t.oas3_1Preprocessors,n.preprocessors||{}),Object.assign(t.async2Preprocessors,n.async2Preprocessors),(0,i.assignExisting)(t.async2Preprocessors,n.preprocessors||{}),Object.assign(t.decorators,n.decorators),Object.assign(t.oas2Decorators,n.oas2Decorators),(0,i.assignExisting)(t.oas2Decorators,n.decorators||{}),Object.assign(t.oas3_0Decorators,n.oas3_0Decorators),(0,i.assignExisting)(t.oas3_0Decorators,n.decorators||{}),Object.assign(t.oas3_1Decorators,n.oas3_1Decorators),(0,i.assignExisting)(t.oas3_1Decorators,n.decorators||{}),Object.assign(t.async2Decorators,n.async2Decorators),(0,i.assignExisting)(t.async2Decorators,n.decorators||{}),t.plugins.push(...n.plugins||[]),t.pluginPaths.push(...n.pluginPaths||[]),t.extendPaths.push(...new Set(n.extendPaths))}return t},t.getMergedConfig=function(e,t){var n,r,a,s,l,c,u,p;const d=[...Object.values(e.apis).map((e=>{var t;return null===(t=null==e?void 0:e.styleguide)||void 0===t?void 0:t.extendPaths})),null===(r=null===(n=e.rawConfig)||void 0===n?void 0:n.styleguide)||void 0===r?void 0:r.extendPaths].flat().filter(i.isTruthy),f=[...Object.values(e.apis).map((e=>{var t;return null===(t=null==e?void 0:e.styleguide)||void 0===t?void 0:t.pluginPaths})),null===(s=null===(a=e.rawConfig)||void 0===a?void 0:a.styleguide)||void 0===s?void 0:s.pluginPaths].flat().filter(i.isTruthy);return t?new o.Config(Object.assign(Object.assign({},e.rawConfig),{styleguide:Object.assign(Object.assign({},e.apis[t]?e.apis[t].styleguide:e.rawConfig.styleguide),{extendPaths:d,pluginPaths:f}),theme:Object.assign(Object.assign({},e.rawConfig.theme),null===(l=e.apis[t])||void 0===l?void 0:l.theme),files:[...e.files,...null!==(p=null===(u=null===(c=e.apis)||void 0===c?void 0:c[t])||void 0===u?void 0:u.files)&&void 0!==p?p:[]]}),e.configFile):e},t.checkForDeprecatedFields=u,t.transformConfig=function(e){var t,n;const i=[["apiDefinitions","apis",void 0],["referenceDocs","openapi","theme"],["lint",void 0,void 0],["styleguide",void 0,void 0],["features.openapi","openapi","theme"]];for(const[t,n,r]of i)u(t,n,e,r);const{apis:o,apiDefinitions:p,referenceDocs:d,lint:f}=e,h=r(e,["apis","apiDefinitions","referenceDocs","lint"]),{styleguideConfig:m,rawConfigRest:g}=l(h),y=Object.assign({theme:{openapi:Object.assign(Object.assign(Object.assign({},d),e["features.openapi"]),null===(t=e.theme)||void 0===t?void 0:t.openapi),mockServer:Object.assign(Object.assign({},e["features.mockServer"]),null===(n=e.theme)||void 0===n?void 0:n.mockServer)},apis:c(o)||s(p),styleguide:m||f},g);return function(e){var t,n;let r=Object.assign({},null===(t=e.styleguide)||void 0===t?void 0:t.rules);for(const t of Object.values(e.apis||{}))r=Object.assign(Object.assign({},r),null===(n=null==t?void 0:t.styleguide)||void 0===n?void 0:n.rules);for(const e of Object.keys(r))e.startsWith("assert/")&&a.logger.warn(`\nThe 'assert/' syntax in ${e} is deprecated. Update your configuration to use 'rule/' instead. Examples and more information: https://redocly.com/docs/cli/rules/configurable-rules/\n`)}(y),y},t.getResolveConfig=function(e){var t,n;return{http:{headers:null!==(n=null===(t=null==e?void 0:e.http)||void 0===t?void 0:t.headers)&&void 0!==n?n:[],customFetch:void 0}}},t.getUniquePlugins=function(e){const t=new Set,n=[];for(const r of e)t.has(r.id)?r.id&&a.logger.warn(`Duplicate plugin id "${a.colorize.red(r.id)}".\n`):(n.push(r),t.add(r.id));return n};class p extends Error{}t.ConfigValidationError=p},1827:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.env=t.isBrowser=void 0,t.isBrowser="undefined"!=typeof window||"undefined"!=typeof self||"undefined"==typeof process,t.env=t.isBrowser?{}:{}||{}},970:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.stringifyYaml=t.parseYaml=void 0;const r=n(7210),i=r.JSON_SCHEMA.extend({implicit:[r.types.merge],explicit:[r.types.binary,r.types.omap,r.types.pairs,r.types.set]});t.parseYaml=(e,t)=>(0,r.load)(e,Object.assign({schema:i},t)),t.stringifyYaml=(e,t)=>(0,r.dump)(e,t)},2678:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.logger=t.colorize=t.colorOptions=void 0;const r=n(8825);var i=n(8825);Object.defineProperty(t,"colorOptions",{enumerable:!0,get:function(){return i.options}});const o=n(1827),a=n(8209);t.colorize=new Proxy(r,{get(e,t){return o.isBrowser?a.identity:e[t]}}),t.logger=new class{stderr(e){return process.stderr.write(e)}info(e){return o.isBrowser?console.log(e):this.stderr(e)}warn(e){return o.isBrowser?console.warn(e):this.stderr(t.colorize.yellow(e))}error(e){return o.isBrowser?console.error(e):this.stderr(t.colorize.red(e))}}},3101:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getTypes=t.getMajorSpecVersion=t.detectSpec=t.SpecMajorVersion=t.SpecVersion=void 0;const r=n(4409),i=n(4154),o=n(2082),a=n(264);var s,l;!function(e){e.OAS2="oas2",e.OAS3_0="oas3_0",e.OAS3_1="oas3_1",e.Async2="async2"}(s||(t.SpecVersion=s={})),function(e){e.OAS2="oas2",e.OAS3="oas3",e.Async2="async2"}(l||(t.SpecMajorVersion=l={}));const c={[s.OAS2]:r.Oas2Types,[s.OAS3_0]:i.Oas3Types,[s.OAS3_1]:o.Oas3_1Types,[s.Async2]:a.AsyncApi2Types};t.detectSpec=function(e){if("object"!=typeof e)throw new Error("Document must be JSON object, got "+typeof e);if(e.openapi&&"string"!=typeof e.openapi)throw new Error(`Invalid OpenAPI version: should be a string but got "${typeof e.openapi}"`);if(e.openapi&&e.openapi.startsWith("3.0"))return s.OAS3_0;if(e.openapi&&e.openapi.startsWith("3.1"))return s.OAS3_1;if(e.swagger&&"2.0"===e.swagger)return s.OAS2;if(e.openapi||e.swagger)throw new Error(`Unsupported OpenAPI version: ${e.openapi||e.swagger}`);if(e.asyncapi&&e.asyncapi.startsWith("2."))return s.Async2;if(e.asyncapi)throw new Error(`Unsupported AsyncAPI version: ${e.asyncapi}`);throw new Error("Unsupported specification")},t.getMajorSpecVersion=function(e){return e===s.OAS2?l.OAS2:e===s.Async2?l.Async2:l.OAS3},t.getTypes=function(e){return c[e]}},4125:function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{l(r.next(e))}catch(e){o(e)}}function s(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}l((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.isRedoclyRegistryURL=t.RedoclyClient=void 0;const i=n(3986),o=n(7975),a=n(2941),s=n(919),l=n(8921),c=n(1827),u=n(8209),p=n(2678),d=".redocly-config.json";t.RedoclyClient=class{constructor(e){this.accessTokens={},this.region=this.loadRegion(e),this.loadTokens(),this.domain=e?l.DOMAINS[e]:c.env.REDOCLY_DOMAIN||l.DOMAINS[l.DEFAULT_REGION],c.env.REDOCLY_DOMAIN=this.domain,this.registryApi=new s.RegistryApi(this.accessTokens,this.region)}loadRegion(e){if(e&&!l.DOMAINS[e])throw new Error(`Invalid argument: region in config file.\nGiven: ${p.colorize.green(e)}, choices: "us", "eu".`);return c.env.REDOCLY_DOMAIN?l.AVAILABLE_REGIONS.find((e=>l.DOMAINS[e]===c.env.REDOCLY_DOMAIN))||l.DEFAULT_REGION:e||l.DEFAULT_REGION}getRegion(){return this.region}hasTokens(){return(0,u.isNotEmptyObject)(this.accessTokens)}hasToken(){return!!this.accessTokens[this.region]}getAuthorizationHeader(){return r(this,void 0,void 0,(function*(){return this.accessTokens[this.region]}))}setAccessTokens(e){this.accessTokens=e}loadTokens(){const e=(0,o.resolve)((0,a.homedir)(),d),t=this.readCredentialsFile(e);(0,u.isNotEmptyObject)(t)&&this.setAccessTokens(Object.assign(Object.assign({},t),t.token&&!t[this.region]&&{[this.region]:t.token})),c.env.REDOCLY_AUTHORIZATION&&this.setAccessTokens(Object.assign(Object.assign({},this.accessTokens),{[this.region]:c.env.REDOCLY_AUTHORIZATION}))}getAllTokens(){return Object.entries(this.accessTokens).filter((([e])=>l.AVAILABLE_REGIONS.includes(e))).map((([e,t])=>({region:e,token:t})))}getValidTokens(){return r(this,void 0,void 0,(function*(){const e=this.getAllTokens(),t=yield Promise.allSettled(e.map((({token:e,region:t})=>this.verifyToken(e,t))));return e.filter(((e,n)=>"fulfilled"===t[n].status)).map((({token:e,region:t})=>({token:e,region:t,valid:!0})))}))}getTokens(){return r(this,void 0,void 0,(function*(){return this.hasTokens()?yield this.getValidTokens():[]}))}isAuthorizedWithRedoclyByRegion(){return r(this,void 0,void 0,(function*(){if(!this.hasTokens())return!1;const e=this.accessTokens[this.region];if(!e)return!1;try{return yield this.verifyToken(e,this.region),!0}catch(e){return!1}}))}isAuthorizedWithRedocly(){return r(this,void 0,void 0,(function*(){return this.hasTokens()&&(0,u.isNotEmptyObject)(yield this.getValidTokens())}))}readCredentialsFile(e){return(0,i.existsSync)(e)?JSON.parse((0,i.readFileSync)(e,"utf-8")):{}}verifyToken(e,t,n=!1){return r(this,void 0,void 0,(function*(){return this.registryApi.authStatus(e,t,n)}))}login(e,t=!1){return r(this,void 0,void 0,(function*(){const n=(0,o.resolve)((0,a.homedir)(),d);try{yield this.verifyToken(e,this.region,t)}catch(e){throw new Error("Authorization failed. Please check if you entered a valid API key.")}const r=Object.assign(Object.assign({},this.readCredentialsFile(n)),{[this.region]:e,token:e});this.accessTokens=r,this.registryApi.setAccessTokens(r),(0,i.writeFileSync)(n,JSON.stringify(r,null,2))}))}logout(){const e=(0,o.resolve)((0,a.homedir)(),d);(0,i.existsSync)(e)&&(0,i.unlinkSync)(e)}},t.isRedoclyRegistryURL=function(e){const t=c.env.REDOCLY_DOMAIN||l.DOMAINS[l.DEFAULT_REGION],n="redocly.com"===t?"redoc.ly":t;return!(!e.startsWith(`https://api.${t}/registry/`)&&!e.startsWith(`https://api.${n}/registry/`))}},919:function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{l(r.next(e))}catch(e){o(e)}}function s(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}l((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.RegistryApi=void 0;const i=n(8381),o=n(8921),a=n(8209),s=n(2079).rE;t.RegistryApi=class{constructor(e,t){this.accessTokens=e,this.region=t}get accessToken(){return(0,a.isNotEmptyObject)(this.accessTokens)&&this.accessTokens[this.region]}getBaseUrl(e=o.DEFAULT_REGION){return`https://api.${o.DOMAINS[e]}/registry`}setAccessTokens(e){return this.accessTokens=e,this}request(e="",t={},n){var o,a;return r(this,void 0,void 0,(function*(){const r="undefined"!=typeof process&&(null===(o={})||void 0===o?void 0:o.REDOCLY_CLI_COMMAND)||"",l="undefined"!=typeof process&&(null===(a={})||void 0===a?void 0:a.REDOCLY_ENVIRONMENT)||"",c=Object.assign({},t.headers||{},{"x-redocly-cli-version":s,"user-agent":`redocly-cli / ${s} ${r} ${l}`});if(!c.hasOwnProperty("authorization"))throw new Error("Unauthorized");const u=yield(0,i.default)(`${this.getBaseUrl(n)}${e}`,Object.assign({},t,{headers:c}));if(401===u.status)throw new Error("Unauthorized");if(404===u.status){const e=yield u.json();throw new Error(e.code)}return u}))}authStatus(e,t,n=!1){return r(this,void 0,void 0,(function*(){try{const n=yield this.request("",{headers:{authorization:e}},t);return yield n.json()}catch(e){throw n&&console.log(e),e}}))}prepareFileUpload({organizationId:e,name:t,version:n,filesHash:i,filename:o,isUpsert:a}){return r(this,void 0,void 0,(function*(){const r=yield this.request(`/${e}/${t}/${n}/prepare-file-upload`,{method:"POST",headers:{"content-type":"application/json",authorization:this.accessToken},body:JSON.stringify({filesHash:i,filename:o,isUpsert:a})},this.region);if(r.ok)return r.json();throw new Error("Could not prepare file upload")}))}pushApi({organizationId:e,name:t,version:n,rootFilePath:i,filePaths:o,branch:a,isUpsert:s,isPublic:l,batchId:c,batchSize:u}){return r(this,void 0,void 0,(function*(){if(!(yield this.request(`/${e}/${t}/${n}`,{method:"PUT",headers:{"content-type":"application/json",authorization:this.accessToken},body:JSON.stringify({rootFilePath:i,filePaths:o,branch:a,isUpsert:s,isPublic:l,batchId:c,batchSize:u})},this.region)).ok)throw new Error("Could not push api")}))}}},3873:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isAnchor=t.isMappingRef=t.isAbsoluteUrl=t.refBaseName=t.pointerBaseName=t.parsePointer=t.parseRef=t.escapePointer=t.unescapePointer=t.Location=t.isRef=t.joinPointer=void 0;const r=n(8209);function i(e,t){return""===e&&(e="#/"),"/"===e[e.length-1]?e+t:e+"/"+t}t.joinPointer=i,t.isRef=function(e){return e&&"string"==typeof e.$ref};class o{constructor(e,t){this.source=e,this.pointer=t}child(e){return new o(this.source,i(this.pointer,(Array.isArray(e)?e:[e]).map(s).join("/")))}key(){return Object.assign(Object.assign({},this),{reportOnKey:!0})}get absolutePointer(){return this.source.absoluteRef+("#/"===this.pointer?"":this.pointer)}}function a(e){return decodeURIComponent(e.replace(/~1/g,"/").replace(/~0/g,"~"))}function s(e){return"number"==typeof e?e:e.replace(/~/g,"~0").replace(/\//g,"~1")}t.Location=o,t.unescapePointer=a,t.escapePointer=s,t.parseRef=function(e){const[t,n]=e.split("#/");return{uri:t||null,pointer:n?n.split("/").map(a).filter(r.isTruthy):[]}},t.parsePointer=function(e){return e.substr(2).split("/").map(a)},t.pointerBaseName=function(e){const t=e.split("/");return t[t.length-1]},t.refBaseName=function(e){const t=e.split(/[\/\\]/);return t[t.length-1].replace(/\.[^.]+$/,"")},t.isAbsoluteUrl=function(e){return e.startsWith("http://")||e.startsWith("https://")},t.isMappingRef=function(e){return e.startsWith("#")||e.startsWith("https://")||e.startsWith("http://")||e.startsWith("./")||e.startsWith("../")||e.indexOf("/")>-1},t.isAnchor=function(e){return/^#[A-Za-z][A-Za-z0-9\-_:.]*$/.test(e)}},2928:function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{l(r.next(e))}catch(e){o(e)}}function s(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}l((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.resolveDocument=t.BaseResolver=t.makeDocumentFromString=t.makeRefId=t.YamlParseError=t.ResolveError=t.Source=void 0;const i=n(7411),o=n(7975),a=n(3873),s=n(1990),l=n(8209);class c{constructor(e,t,n){this.absoluteRef=e,this.body=t,this.mimeType=n}getAst(e){var t;return void 0===this._ast&&(this._ast=null!==(t=e(this.body,{filename:this.absoluteRef}))&&void 0!==t?t:void 0,this._ast&&0===this._ast.kind&&""===this._ast.value&&1!==this._ast.startPosition&&(this._ast.startPosition=1,this._ast.endPosition=1)),this._ast}getLines(){return void 0===this._lines&&(this._lines=this.body.split(/\r\n|[\n\r]/g)),this._lines}}t.Source=c;class u extends Error{constructor(e){super(e.message),this.originalError=e,Object.setPrototypeOf(this,u.prototype)}}t.ResolveError=u;const p=/\((\d+):(\d+)\)$/;class d extends Error{constructor(e,t){super(e.message.split("\n")[0]),this.originalError=e,this.source=t,Object.setPrototypeOf(this,d.prototype);const[,n,r]=this.message.match(p)||[];this.line=parseInt(n,10),this.col=parseInt(r,10)}}function f(e,t){return e+"::"+t}function h(e,t){return{prev:e,node:t}}t.YamlParseError=d,t.makeRefId=f,t.makeDocumentFromString=function(e,t){const n=new c(t,e);try{return{source:n,parsed:(0,l.parseYaml)(e,{filename:t})}}catch(e){throw new d(e,n)}},t.BaseResolver=class{constructor(e={http:{headers:[]}}){this.config=e,this.cache=new Map}getFiles(){return new Set(Array.from(this.cache.keys()))}resolveExternalRef(e,t){return(0,a.isAbsoluteUrl)(t)?t:e&&(0,a.isAbsoluteUrl)(e)?new URL(t,e).href:o.resolve(e?o.dirname(e):process.cwd(),t)}loadExternalRef(e){return r(this,void 0,void 0,(function*(){try{if((0,a.isAbsoluteUrl)(e)){const{body:t,mimeType:n}=yield(0,l.readFileFromUrl)(e,this.config.http);return new c(e,t,n)}{if(i.lstatSync(e).isDirectory())throw new Error(`Expected a file but received a folder at ${e}`);const t=yield i.promises.readFile(e,"utf-8");return new c(e,t.replace(/\r\n/g,"\n"))}}catch(e){throw e.message=e.message.replace(", lstat",""),new u(e)}}))}parseDocument(e,t=!1){var n;const r=e.absoluteRef.substr(e.absoluteRef.lastIndexOf("."));if(![".json",".json",".yml",".yaml"].includes(r)&&!(null===(n=e.mimeType)||void 0===n?void 0:n.match(/(json|yaml|openapi)/))&&!t)return{source:e,parsed:e.body};try{return{source:e,parsed:(0,l.parseYaml)(e.body,{filename:e.absoluteRef})}}catch(t){throw new d(t,e)}}resolveDocument(e,t,n=!1){return r(this,void 0,void 0,(function*(){const r=this.resolveExternalRef(e,t),i=this.cache.get(r);if(i)return i;const o=this.loadExternalRef(r).then((e=>this.parseDocument(e,n)));return this.cache.set(r,o),o}))}};const m={name:"unknown",properties:{}},g={name:"scalar",properties:{}};t.resolveDocument=function(e){return r(this,void 0,void 0,(function*(){const{rootDocument:t,externalRefResolver:n,rootType:i}=e,o=new Map,c=new Set,u=[];let p;!function e(t,i,p,d){const y=i.source.absoluteRef,b=new Map;function v(e,t,i){return r(this,void 0,void 0,(function*(){if(function(e,t){for(;e;){if(e.node===t)return!0;e=e.prev}return!1}(i.prev,t))throw new Error("Self-referencing circular pointer");if((0,a.isAnchor)(t.$ref)){yield(0,l.nextTick)();const n={resolved:!0,isRemote:!1,node:b.get(t.$ref),document:e,nodePointer:t.$ref},r=f(e.source.absoluteRef,t.$ref);return o.set(r,n),n}const{uri:r,pointer:s}=(0,a.parseRef)(t.$ref),c=null!==r;let u;try{u=c?yield n.resolveDocument(e.source.absoluteRef,r):e}catch(n){const r={resolved:!1,isRemote:c,document:void 0,error:n},i=f(e.source.absoluteRef,t.$ref);return o.set(i,r),r}let p={resolved:!0,document:u,isRemote:c,node:e.parsed,nodePointer:"#/"},d=u.parsed;const m=s;for(const e of m){if("object"!=typeof d){d=void 0;break}if(void 0!==d[e])d=d[e],p.nodePointer=(0,a.joinPointer)(p.nodePointer,(0,a.escapePointer)(e));else{if(!(0,a.isRef)(d)){d=void 0;break}if(p=yield v(u,d,h(i,d)),u=p.document||u,"object"!=typeof p.node){d=void 0;break}d=p.node[e],p.nodePointer=(0,a.joinPointer)(p.nodePointer,(0,a.escapePointer)(e))}}p.node=d,p.document=u;const g=f(e.source.absoluteRef,t.$ref);return p.document&&(0,a.isRef)(d)&&(p=yield v(p.document,d,h(i,d))),o.set(g,p),Object.assign({},p)}))}!function t(n,r,o){if("object"!=typeof n||null===n)return;const l=`${r.name}::${o}`;if(c.has(l))return;c.add(l);const[p,d]=Object.entries(n).find((([e])=>"$anchor"===e))||[];if(d&&b.set(`#${d}`,n),Array.isArray(n)){const e=r.items;if(void 0===e&&r!==m&&r!==s.SpecExtension)return;for(let r=0;r{t.resolved&&e(t.node,t.document,t.nodePointer,r)}));u.push(t)}}}(t,d,y+p)}(t.parsed,t,"#/",i);do{p=yield Promise.all(u)}while(u.length!==p.length);return o}))}},3416:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.reportUnresolvedRef=t.NoUnresolvedRefs=void 0;const r=n(2928);function i(e,t,n){var i;const o=e.error;o instanceof r.YamlParseError&&t({message:"Failed to parse: "+o.message,location:{source:o.source,pointer:void 0,start:{col:o.col,line:o.line}}});const a=null===(i=e.error)||void 0===i?void 0:i.message;t({location:n,message:"Can't resolve $ref"+(a?": "+a:"")})}t.NoUnresolvedRefs=()=>({ref:{leave(e,{report:t,location:n},r){void 0===r.node&&i(r,t,n)}},DiscriminatorMapping(e,{report:t,resolve:n,location:r}){for(const o of Object.keys(e)){const a=n({$ref:e[o]});if(void 0!==a.node)return;i(a,t,r.child(o))}}}),t.reportUnresolvedRef=i},474:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RemoveUnusedComponents=void 0;const r=n(8209);t.RemoveUnusedComponents=()=>{const e=new Map;function t(t,n,r){var i;e.set(t.absolutePointer,{used:(null===(i=e.get(t.absolutePointer))||void 0===i?void 0:i.used)||!1,componentType:n,name:r})}return{ref:{leave(t,{type:n,resolve:r,key:i}){if(["Schema","Parameter","Response","SecurityScheme"].includes(n.name)){const n=r(t);if(!n.location)return;const[o,a]=n.location.absolutePointer.split("#",2),s=`${o}#${a.split("/").slice(0,3).join("/")}`;e.set(s,{used:!0,name:i.toString()})}}},Root:{leave(t,n){const i=n.getVisitorData();i.removedCount=0;const o=new Set;e.forEach((e=>{const{used:n,name:r,componentType:a}=e;!n&&a&&(o.add(a),delete t[a][r],i.removedCount++)}));for(const e of o)(0,r.isEmptyObject)(t[e])&&delete t[e]}},NamedSchemas:{Schema(e,{location:n,key:r}){e.allOf||t(n,"definitions",r.toString())}},NamedParameters:{Parameter(e,{location:n,key:r}){t(n,"parameters",r.toString())}},NamedResponses:{Response(e,{location:n,key:r}){t(n,"responses",r.toString())}},NamedSecuritySchemes:{SecurityScheme(e,{location:n,key:r}){t(n,"securityDefinitions",r.toString())}}}}},4335:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RemoveUnusedComponents=void 0;const r=n(8209);t.RemoveUnusedComponents=()=>{const e=new Map;function t(t,n,r){var i;e.set(t.absolutePointer,{used:(null===(i=e.get(t.absolutePointer))||void 0===i?void 0:i.used)||!1,componentType:n,name:r})}return{ref:{leave(t,{type:n,resolve:r,key:i}){if(["Schema","Header","Parameter","Response","Example","RequestBody"].includes(n.name)){const n=r(t);if(!n.location)return;const[o,a]=n.location.absolutePointer.split("#",2),s=`${o}#${a.split("/").slice(0,4).join("/")}`;e.set(s,{used:!0,name:i.toString()})}}},Root:{leave(t,n){const i=n.getVisitorData();i.removedCount=0,e.forEach((e=>{const{used:n,componentType:o,name:a}=e;if(!n&&o&&t.components){const e=t.components[o];delete e[a],i.removedCount++,(0,r.isEmptyObject)(e)&&delete t.components[o]}})),(0,r.isEmptyObject)(t.components)&&delete t.components}},NamedSchemas:{Schema(e,{location:n,key:r}){e.allOf||t(n,"schemas",r.toString())}},NamedParameters:{Parameter(e,{location:n,key:r}){t(n,"parameters",r.toString())}},NamedResponses:{Response(e,{location:n,key:r}){t(n,"responses",r.toString())}},NamedExamples:{Example(e,{location:n,key:r}){t(n,"examples",r.toString())}},NamedRequestBodies:{RequestBody(e,{location:n,key:r}){t(n,"requestBodies",r.toString())}},NamedHeaders:{Header(e,{location:n,key:r}){t(n,"headers",r.toString())}}}}},264:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AsyncApi2Types=void 0;const r=n(1990),i=n(3873),o={properties:{},allowed(){return["http","ws","kafka","anypointmq","amqp","amqp1","mqtt","mqtt5","nats","jms","sns","solace","sqs","stomp","redis","mercure","ibmmq","googlepubsub","pulsar"]},additionalProperties:{type:"object"}},a={properties:{},allowed(){return["http","ws","kafka","anypointmq","amqp","amqp1","mqtt","mqtt5","nats","jms","sns","solace","sqs","stomp","redis","mercure","ibmmq","googlepubsub","pulsar"]},additionalProperties:{type:"object"}},s={properties:{},allowed(){return["http","ws","kafka","anypointmq","amqp","amqp1","mqtt","mqtt5","nats","jms","sns","solace","sqs","stomp","redis","mercure","ibmmq","googlepubsub","pulsar"]},additionalProperties:{type:"object"}},l={properties:{},allowed(){return["http","ws","kafka","anypointmq","amqp","amqp1","mqtt","mqtt5","nats","jms","sns","solace","sqs","stomp","redis","mercure","ibmmq","googlepubsub","pulsar"]},additionalProperties:{type:"object"}},c={properties:{$id:{type:"string"},id:{type:"string"},$schema:{type:"string"},definitions:"NamedSchemas",$defs:"NamedSchemas",$vocabulary:{type:"string"},externalDocs:"ExternalDocs",discriminator:"Discriminator",myArbitraryKeyword:{type:"boolean"},title:{type:"string"},multipleOf:{type:"number",minimum:0},maximum:{type:"number"},minimum:{type:"number"},exclusiveMaximum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{type:"integer",minimum:0},minLength:{type:"integer",minimum:0},pattern:{type:"string"},maxItems:{type:"integer",minimum:0},minItems:{type:"integer",minimum:0},uniqueItems:{type:"boolean"},maxProperties:{type:"integer",minimum:0},minProperties:{type:"integer",minimum:0},required:{type:"array",items:{type:"string"}},enum:{type:"array"},type:e=>Array.isArray(e)?{type:"array",items:{enum:["object","array","string","number","integer","boolean","null"]}}:{enum:["object","array","string","number","integer","boolean","null"]},allOf:(0,r.listOf)("Schema"),anyOf:(0,r.listOf)("Schema"),oneOf:(0,r.listOf)("Schema"),not:"Schema",if:"Schema",then:"Schema",else:"Schema",dependentSchemas:(0,r.listOf)("Schema"),prefixItems:(0,r.listOf)("Schema"),contains:"Schema",minContains:{type:"integer",minimum:0},maxContains:{type:"integer",minimum:0},patternProperties:{type:"object"},propertyNames:"Schema",unevaluatedItems:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",unevaluatedProperties:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",summary:{type:"string"},properties:"SchemaProperties",items:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",additionalProperties:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",description:{type:"string"},format:{type:"string"},contentEncoding:{type:"string"},contentMediaType:{type:"string"},default:null,readOnly:{type:"boolean"},writeOnly:{type:"boolean"},examples:{type:"array"},example:{isExample:!0},deprecated:{type:"boolean"},const:null,$comment:{type:"string"},dependencies:{type:"object"}}},u={properties:{},additionalProperties:e=>(0,i.isMappingRef)(e)?{type:"string",directResolveAs:"Schema"}:{type:"string"}},p={properties:{type:{enum:["userPassword","apiKey","X509","symmetricEncryption","asymmetricEncryption","httpApiKey","http","oauth2","openIdConnect","plain","scramSha256","scramSha512","gssapi"]},description:{type:"string"},name:{type:"string"},in:{type:"string",enum:["query","header","cookie","user","password"]},scheme:{type:"string"},bearerFormat:{type:"string"},flows:"SecuritySchemeFlows",openIdConnectUrl:{type:"string"}},required(e){switch(null==e?void 0:e.type){case"apiKey":return["type","in"];case"httpApiKey":return["type","name","in"];case"http":return["type","scheme"];case"oauth2":return["type","flows"];case"openIdConnect":return["type","openIdConnectUrl"];default:return["type"]}},allowed(e){switch(null==e?void 0:e.type){case"apiKey":return["type","in","description"];case"httpApiKey":return["type","name","in","description"];case"http":return["type","scheme","bearerFormat","description"];case"oauth2":return["type","flows","description"];case"openIdConnect":return["type","openIdConnectUrl","description"];default:return["type","description"]}},extensionsPrefix:"x-"},d={properties:{}};o.properties.http=d;const f={properties:{}};a.properties.http=f;const h={properties:{headers:"Schema",bindingVersion:{type:"string"}}};s.properties.http=h;const m={properties:{type:{type:"string"},method:{type:"string",enum:["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS","CONNECT","TRACE"]},headers:"Schema",bindingVersion:{type:"string"}}};l.properties.http=m;const g={properties:{method:{type:"string"},query:"Schema",headers:"Schema",bindingVersion:{type:"string"}}};o.properties.ws=g;const y={properties:{}};a.properties.ws=y;const b={properties:{}};s.properties.ws=b;const v={properties:{}};l.properties.ws=v;const x={properties:{topic:{type:"string"},partitions:{type:"integer"},replicas:{type:"integer"},topicConfiguration:"KafkaTopicConfiguration",bindingVersion:{type:"string"}}};o.properties.kafka=x;const w={properties:{}};a.properties.kafka=w;const k={properties:{key:"Schema",schemaIdLocation:{type:"string"},schemaIdPayloadEncoding:{type:"string"},schemaLookupStrategy:{type:"string"},bindingVersion:{type:"string"}}};s.properties.kafka=k;const S={properties:{groupId:"Schema",clientId:"Schema",bindingVersion:{type:"string"}}};l.properties.kafka=S;const E={properties:{destination:{type:"string"},destinationType:{type:"string"},bindingVersion:{type:"string"}}};o.properties.anypointmq=E;const O={properties:{}};a.properties.anypointmq=O;const _={properties:{headers:"Schema",bindingVersion:{type:"string"}}};s.properties.anypointmq=_;const A={properties:{}};l.properties.anypointmq=A;const j={properties:{}};o.properties.amqp=j;const C={properties:{}};a.properties.amqp=C;const P={properties:{contentEncoding:{type:"string"},messageType:{type:"string"},bindingVersion:{type:"string"}}};s.properties.amqp=P;const T={properties:{expiration:{type:"integer"},userId:{type:"string"},cc:{type:"array",items:{type:"string"}},priority:{type:"integer"},deliveryMode:{type:"integer"},mandatory:{type:"boolean"},bcc:{type:"array",items:{type:"string"}},replyTo:{type:"string"},timestamp:{type:"boolean"},ack:{type:"boolean"},bindingVersion:{type:"string"}}};l.properties.amqp=T;const I={properties:{}};o.properties.amqp1=I;const R={properties:{}};a.properties.amqp1=R;const N={properties:{}};s.properties.amqp1=N;const $={properties:{}};l.properties.amqp1=$;const L={properties:{qos:{type:"integer"},retain:{type:"boolean"},bindingVersion:{type:"string"}}};o.properties.mqtt=L;const D={properties:{clientId:{type:"string"},cleanSession:{type:"boolean"},lastWill:"MqttServerBindingLastWill",keepAlive:{type:"integer"},bindingVersion:{type:"string"}}};a.properties.mqtt=D;const M={properties:{bindingVersion:{type:"string"}}};s.properties.mqtt=M;const z={properties:{qos:{type:"integer"},retain:{type:"boolean"},bindingVersion:{type:"string"}}};l.properties.mqtt=z;const F={properties:{}};o.properties.mqtt5=F;const U={properties:{}};a.properties.mqtt5=U;const B={properties:{}};s.properties.mqtt5=B;const q={properties:{}};l.properties.mqtt5=q;const V={properties:{}};o.properties.nats=V;const W={properties:{}};a.properties.nats=W;const H={properties:{}};s.properties.nats=H;const Y={properties:{queue:{type:"string"},bindingVersion:{type:"string"}}};l.properties.nats=Y;const Q={properties:{destination:{type:"string"},destinationType:{type:"string"},bindingVersion:{type:"string"}}};o.properties.jms=Q;const G={properties:{}};a.properties.jms=G;const X={properties:{headers:"Schema",bindingVersion:{type:"string"}}};s.properties.jms=X;const K={properties:{headers:"Schema",bindingVersion:{type:"string"}}};l.properties.jms=K;const Z={properties:{}};o.properties.solace=Z;const J={properties:{bindingVersion:{type:"string"},msgVpn:{type:"string"}}};a.properties.solace=J;const ee={properties:{}};s.properties.solace=ee;const te={properties:{bindingVersion:{type:"string"},destinations:(0,r.listOf)("SolaceDestination")}};l.properties.solace=te;const ne={properties:{}};o.properties.stomp=ne;const re={properties:{}};a.properties.stomp=re;const ie={properties:{}};s.properties.stomp=ie;const oe={properties:{}};l.properties.stomp=oe;const ae={properties:{}};o.properties.redis=ae;const se={properties:{}};a.properties.redis=se;const le={properties:{}};s.properties.redis=le;const ce={properties:{}};l.properties.redis=ce;const ue={properties:{}};o.properties.mercure=ue;const pe={properties:{}};a.properties.mercure=pe;const de={properties:{}};s.properties.mercure=de;const fe={properties:{}};l.properties.mercure=fe,t.AsyncApi2Types={Root:{properties:{asyncapi:null,info:"Info",id:{type:"string"},servers:"ServerMap",channels:"ChannelMap",components:"Components",tags:"TagList",externalDocs:"ExternalDocs",defaultContentType:{type:"string"}},required:["asyncapi","channels","info"]},Tag:{properties:{name:{type:"string"},description:{type:"string"},externalDocs:"ExternalDocs"},required:["name"]},TagList:(0,r.listOf)("Tag"),ServerMap:{properties:{},additionalProperties:(e,t)=>t.match(/^[A-Za-z0-9_\-]+$/)?"Server":void 0},ExternalDocs:{properties:{description:{type:"string"},url:{type:"string"}},required:["url"]},Server:{properties:{url:{type:"string"},protocol:{type:"string"},protocolVersion:{type:"string"},description:{type:"string"},variables:"ServerVariablesMap",security:"SecurityRequirementList",bindings:"ServerBindings",tags:"TagList"},required:["url","protocol"]},ServerVariable:{properties:{enum:{type:"array",items:{type:"string"}},default:{type:"string"},description:{type:"string"},examples:{type:"array",items:{type:"string"}}},required:[]},ServerVariablesMap:(0,r.mapOf)("ServerVariable"),SecurityRequirement:{properties:{},additionalProperties:{type:"array",items:{type:"string"}}},SecurityRequirementList:(0,r.listOf)("SecurityRequirement"),Info:{properties:{title:{type:"string"},version:{type:"string"},description:{type:"string"},termsOfService:{type:"string"},contact:"Contact",license:"License"},required:["title","version"]},Contact:{properties:{name:{type:"string"},url:{type:"string"},email:{type:"string"}}},License:{properties:{name:{type:"string"},url:{type:"string"}},required:["name"]},HttpServerBinding:f,HttpChannelBinding:d,HttpMessageBinding:h,HttpOperationBinding:m,WsServerBinding:y,WsChannelBinding:g,WsMessageBinding:b,WsOperationBinding:v,KafkaServerBinding:w,KafkaTopicConfiguration:{properties:{"cleanup.policy":{type:"array",items:{enum:["delete","compact"]}},"retention.ms":{type:"integer"},"retention.bytes":{type:"integer"},"delete.retention.ms":{type:"integer"},"max.message.bytes":{type:"integer"}}},KafkaChannelBinding:x,KafkaMessageBinding:k,KafkaOperationBinding:S,AnypointmqServerBinding:O,AnypointmqChannelBinding:E,AnypointmqMessageBinding:_,AnypointmqOperationBinding:A,AmqpServerBinding:C,AmqpChannelBinding:j,AmqpMessageBinding:P,AmqpOperationBinding:T,Amqp1ServerBinding:R,Amqp1ChannelBinding:I,Amqp1MessageBinding:N,Amqp1OperationBinding:$,MqttServerBindingLastWill:{properties:{topic:{type:"string"},qos:{type:"integer"},message:{type:"string"},retain:{type:"boolean"}}},MqttServerBinding:D,MqttChannelBinding:L,MqttMessageBinding:M,MqttOperationBinding:z,Mqtt5ServerBinding:U,Mqtt5ChannelBinding:F,Mqtt5MessageBinding:B,Mqtt5OperationBinding:q,NatsServerBinding:W,NatsChannelBinding:V,NatsMessageBinding:H,NatsOperationBinding:Y,JmsServerBinding:G,JmsChannelBinding:Q,JmsMessageBinding:X,JmsOperationBinding:K,SolaceServerBinding:J,SolaceChannelBinding:Z,SolaceMessageBinding:ee,SolaceDestination:{properties:{destinationType:{type:"string",enum:["queue","topic"]},deliveryMode:{type:"string",enum:["direct","persistent"]},"queue.name":{type:"string"},"queue.topicSubscriptions":{type:"array",items:{type:"string"}},"queue.accessType":{type:"string",enum:["exclusive","nonexclusive"]},"queue.maxMsgSpoolSize":{type:"string"},"queue.maxTtl":{type:"string"},"topic.topicSubscriptions":{type:"array",items:{type:"string"}}}},SolaceOperationBinding:te,StompServerBinding:re,StompChannelBinding:ne,StompMessageBinding:ie,StompOperationBinding:oe,RedisServerBinding:se,RedisChannelBinding:ae,RedisMessageBinding:le,RedisOperationBinding:ce,MercureServerBinding:pe,MercureChannelBinding:ue,MercureMessageBinding:de,MercureOperationBinding:fe,ServerBindings:a,ChannelBindings:o,ChannelMap:{properties:{},additionalProperties:"Channel"},Channel:{properties:{description:{type:"string"},subscribe:"Operation",publish:"Operation",parameters:"ParametersMap",bindings:"ChannelBindings",servers:{type:"array",items:{type:"string"}}}},Parameter:{properties:{description:{type:"string"},schema:"Schema",location:{type:"string"}}},ParametersMap:(0,r.mapOf)("Parameter"),Operation:{properties:{tags:{type:"array",items:{type:"string"}},summary:{type:"string"},description:{type:"string"},externalDocs:"ExternalDocs",operationId:{type:"string"},security:"SecurityRequirementList",bindings:"OperationBindings",traits:"OperationTraitList",message:"Message"},required:[]},Schema:c,MessageExample:{properties:{payload:{isExample:!0},summary:{type:"string"},name:{type:"string"},headers:{type:"object"}}},SchemaProperties:{properties:{},additionalProperties:e=>"boolean"==typeof e?{type:"boolean"}:"Schema"},DiscriminatorMapping:u,Discriminator:{properties:{propertyName:{type:"string"},mapping:"DiscriminatorMapping"},required:["propertyName"]},Components:{properties:{messages:"NamedMessages",parameters:"NamedParameters",schemas:"NamedSchemas",correlationIds:"NamedCorrelationIds",messageTraits:"NamedMessageTraits",operationTraits:"NamedOperationTraits",streamHeaders:"NamedStreamHeaders",securitySchemes:"NamedSecuritySchemes",servers:"ServerMap",serverVariables:"ServerVariablesMap",channels:"ChannelMap",serverBindings:"ServerBindings",channelBindings:"ChannelBindings",operationBindings:"OperationBindings",messageBindings:"MessageBindings"}},NamedSchemas:(0,r.mapOf)("Schema"),NamedMessages:(0,r.mapOf)("Message"),NamedMessageTraits:(0,r.mapOf)("MessageTrait"),NamedOperationTraits:(0,r.mapOf)("OperationTrait"),NamedParameters:(0,r.mapOf)("Parameter"),NamedSecuritySchemes:(0,r.mapOf)("SecurityScheme"),NamedCorrelationIds:(0,r.mapOf)("CorrelationId"),NamedStreamHeaders:(0,r.mapOf)("StreamHeader"),ImplicitFlow:{properties:{refreshUrl:{type:"string"},scopes:{type:"object",additionalProperties:{type:"string"}},authorizationUrl:{type:"string"}},required:["authorizationUrl","scopes"]},PasswordFlow:{properties:{refreshUrl:{type:"string"},scopes:{type:"object",additionalProperties:{type:"string"}},tokenUrl:{type:"string"}},required:["tokenUrl","scopes"]},ClientCredentials:{properties:{refreshUrl:{type:"string"},scopes:{type:"object",additionalProperties:{type:"string"}},tokenUrl:{type:"string"}},required:["tokenUrl","scopes"]},AuthorizationCode:{properties:{refreshUrl:{type:"string"},authorizationUrl:{type:"string"},scopes:{type:"object",additionalProperties:{type:"string"}},tokenUrl:{type:"string"}},required:["authorizationUrl","tokenUrl","scopes"]},SecuritySchemeFlows:{properties:{implicit:"ImplicitFlow",password:"PasswordFlow",clientCredentials:"ClientCredentials",authorizationCode:"AuthorizationCode"}},SecurityScheme:p,Message:{properties:{messageId:{type:"string"},headers:"Schema",payload:"Schema",correlationId:"CorrelationId",schemaFormat:{type:"string"},contentType:{type:"string"},name:{type:"string"},title:{type:"string"},summary:{type:"string"},description:{type:"string"},tags:"TagList",externalDocs:"ExternalDocs",bindings:"MessageBindings",traits:"MessageTraitList"},additionalProperties:{}},MessageBindings:s,OperationBindings:l,OperationTrait:{properties:{tags:{type:"array",items:{type:"string"}},summary:{type:"string"},description:{type:"string"},externalDocs:"ExternalDocs",operationId:{type:"string"},security:"SecurityRequirementList",bindings:"OperationBindings"},required:[]},OperationTraitList:(0,r.listOf)("OperationTrait"),MessageTrait:{properties:{messageId:{type:"string"},headers:"Schema",correlationId:"CorrelationId",schemaFormat:{type:"string"},contentType:{type:"string"},name:{type:"string"},title:{type:"string"},summary:{type:"string"},description:{type:"string"},tags:"TagList",externalDocs:"ExternalDocs",bindings:"MessageBindings"},additionalProperties:{}},MessageTraitList:(0,r.listOf)("MessageTrait"),CorrelationId:{properties:{description:{type:"string"},location:{type:"string"}},required:["location"]}}},1990:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isNamedType=t.normalizeTypes=t.SpecExtension=t.mapOf=t.listOf=void 0,t.listOf=function(e){return{name:`${e}List`,properties:{},items:e}},t.mapOf=function(e){return{name:`${e}Map`,properties:{},additionalProperties:()=>e}},t.SpecExtension={name:"SpecExtension",properties:{},additionalProperties:{resolvable:!0}},t.normalizeTypes=function(e,n={}){const r={};for(const t of Object.keys(e))r[t]=Object.assign(Object.assign({},e[t]),{name:t});for(const e of Object.values(r))i(e);return r.SpecExtension=t.SpecExtension,r;function i(e){if(e.additionalProperties&&(e.additionalProperties=o(e.additionalProperties)),e.items&&(e.items=o(e.items)),e.properties){const t={};for(const[r,i]of Object.entries(e.properties))t[r]=o(i),n.doNotResolveExamples&&i&&i.isExample&&(t[r]=Object.assign(Object.assign({},i),{resolvable:!1}));e.properties=t}}function o(e){if("string"==typeof e){if(!r[e])throw new Error(`Unknown type name found: ${e}`);return r[e]}return"function"==typeof e?(t,n)=>o(e(t,n)):e&&e.name?(i(e=Object.assign({},e)),e):e&&e.directResolveAs?Object.assign(Object.assign({},e),{directResolveAs:o(e.directResolveAs)}):e}},t.isNamedType=function(e){return"string"==typeof(null==e?void 0:e.name)}},4409:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Oas2Types=void 0;const r=n(1990),i=/^[0-9][0-9Xx]{2}$/,o={properties:{name:{type:"string"},in:{type:"string",enum:["query","header","path","formData","body"]},description:{type:"string"},required:{type:"boolean"},schema:"Schema",type:{type:"string",enum:["string","number","integer","boolean","array","file"]},format:{type:"string"},allowEmptyValue:{type:"boolean"},items:"ParameterItems",collectionFormat:{type:"string",enum:["csv","ssv","tsv","pipes","multi"]},default:null,maximum:{type:"integer"},exclusiveMaximum:{type:"boolean"},minimum:{type:"integer"},exclusiveMinimum:{type:"boolean"},maxLength:{type:"integer"},minLength:{type:"integer"},pattern:{type:"string"},maxItems:{type:"integer"},minItems:{type:"integer"},uniqueItems:{type:"boolean"},enum:{type:"array"},multipleOf:{type:"number"},"x-example":"Example","x-examples":"ExamplesMap"},required(e){return e&&e.in?"body"===e.in?["name","in","schema"]:"array"===e.type?["name","in","type","items"]:["name","in","type"]:["name","in"]},extensionsPrefix:"x-"},a={properties:{type:{type:"string",enum:["string","number","integer","boolean","array"]},format:{type:"string"},items:"ParameterItems",collectionFormat:{type:"string",enum:["csv","ssv","tsv","pipes","multi"]},default:null,maximum:{type:"integer"},exclusiveMaximum:{type:"boolean"},minimum:{type:"integer"},exclusiveMinimum:{type:"boolean"},maxLength:{type:"integer"},minLength:{type:"integer"},pattern:{type:"string"},maxItems:{type:"integer"},minItems:{type:"integer"},uniqueItems:{type:"boolean"},enum:{type:"array"},multipleOf:{type:"number"}},required(e){return e&&"array"===e.type?["type","items"]:["type"]},extensionsPrefix:"x-"},s={properties:{default:"Response"},additionalProperties:(e,t)=>i.test(t)?"Response":void 0},l={properties:{description:{type:"string"},schema:"Schema",headers:(0,r.mapOf)("Header"),examples:"Examples","x-summary":{type:"string"}},required:["description"],extensionsPrefix:"x-"},c={properties:{description:{type:"string"},type:{type:"string",enum:["string","number","integer","boolean","array"]},format:{type:"string"},items:"ParameterItems",collectionFormat:{type:"string",enum:["csv","ssv","tsv","pipes","multi"]},default:null,maximum:{type:"integer"},exclusiveMaximum:{type:"boolean"},minimum:{type:"integer"},exclusiveMinimum:{type:"boolean"},maxLength:{type:"integer"},minLength:{type:"integer"},pattern:{type:"string"},maxItems:{type:"integer"},minItems:{type:"integer"},uniqueItems:{type:"boolean"},enum:{type:"array"},multipleOf:{type:"number"}},required(e){return e&&"array"===e.type?["type","items"]:["type"]},extensionsPrefix:"x-"},u={properties:{format:{type:"string"},title:{type:"string"},description:{type:"string"},default:null,multipleOf:{type:"number"},maximum:{type:"number"},minimum:{type:"number"},exclusiveMaximum:{type:"boolean"},exclusiveMinimum:{type:"boolean"},maxLength:{type:"number"},minLength:{type:"number"},pattern:{type:"string"},maxItems:{type:"number"},minItems:{type:"number"},uniqueItems:{type:"boolean"},maxProperties:{type:"number"},minProperties:{type:"number"},required:{type:"array",items:{type:"string"}},enum:{type:"array"},type:{type:"string",enum:["object","array","string","number","integer","boolean","null"]},items:e=>Array.isArray(e)?(0,r.listOf)("Schema"):"Schema",allOf:(0,r.listOf)("Schema"),properties:"SchemaProperties",additionalProperties:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",discriminator:{type:"string"},readOnly:{type:"boolean"},xml:"Xml",externalDocs:"ExternalDocs",example:{isExample:!0},"x-tags":{type:"array",items:{type:"string"}},"x-nullable":{type:"boolean"},"x-extendedDiscriminator":{type:"string"},"x-additionalPropertiesName":{type:"string"},"x-explicitMappingOnly":{type:"boolean"},"x-enumDescriptions":"EnumDescriptions"},extensionsPrefix:"x-"},p={properties:{type:{enum:["basic","apiKey","oauth2"]},description:{type:"string"},name:{type:"string"},in:{type:"string",enum:["query","header"]},flow:{enum:["implicit","password","application","accessCode"]},authorizationUrl:{type:"string"},tokenUrl:{type:"string"},scopes:{type:"object",additionalProperties:{type:"string"}},"x-defaultClientId":{type:"string"}},required(e){switch(null==e?void 0:e.type){case"apiKey":return["type","name","in"];case"oauth2":switch(null==e?void 0:e.flow){case"implicit":return["type","flow","authorizationUrl","scopes"];case"accessCode":return["type","flow","authorizationUrl","tokenUrl","scopes"];case"application":case"password":return["type","flow","tokenUrl","scopes"];default:return["type","flow","scopes"]}default:return["type"]}},allowed(e){switch(null==e?void 0:e.type){case"basic":return["type","description"];case"apiKey":return["type","name","in","description"];case"oauth2":switch(null==e?void 0:e.flow){case"implicit":return["type","flow","authorizationUrl","description","scopes"];case"accessCode":return["type","flow","authorizationUrl","tokenUrl","description","scopes"];case"application":case"password":return["type","flow","tokenUrl","description","scopes"];default:return["type","flow","tokenUrl","authorizationUrl","description","scopes"]}default:return["type","description"]}},extensionsPrefix:"x-"};t.Oas2Types={Root:{properties:{swagger:{type:"string"},info:"Info",host:{type:"string"},basePath:{type:"string"},schemes:{type:"array",items:{type:"string"}},consumes:{type:"array",items:{type:"string"}},produces:{type:"array",items:{type:"string"}},paths:"Paths",definitions:"NamedSchemas",parameters:"NamedParameters",responses:"NamedResponses",securityDefinitions:"NamedSecuritySchemes",security:"SecurityRequirementList",tags:"TagList",externalDocs:"ExternalDocs","x-servers":"XServerList","x-tagGroups":"TagGroups","x-ignoredHeaderParameters":{type:"array",items:{type:"string"}}},required:["swagger","paths","info"],extensionsPrefix:"x-"},Tag:{properties:{name:{type:"string"},description:{type:"string"},externalDocs:"ExternalDocs","x-traitTag":{type:"boolean"},"x-displayName":{type:"string"}},required:["name"],extensionsPrefix:"x-"},TagList:(0,r.listOf)("Tag"),TagGroups:(0,r.listOf)("TagGroup"),TagGroup:{properties:{name:{type:"string"},tags:{type:"array",items:{type:"string"}}}},ExternalDocs:{properties:{description:{type:"string"},url:{type:"string"}},required:["url"],extensionsPrefix:"x-"},Example:{properties:{value:{isExample:!0},summary:{type:"string"},description:{type:"string"},externalValue:{type:"string"}},extensionsPrefix:"x-"},ExamplesMap:(0,r.mapOf)("Example"),EnumDescriptions:{properties:{},additionalProperties:{type:"string"}},SecurityRequirement:{properties:{},additionalProperties:{type:"array",items:{type:"string"}}},SecurityRequirementList:(0,r.listOf)("SecurityRequirement"),Info:{properties:{title:{type:"string"},description:{type:"string"},termsOfService:{type:"string"},contact:"Contact",license:"License",version:{type:"string"},"x-logo":"Logo"},required:["title","version"],extensionsPrefix:"x-"},Contact:{properties:{name:{type:"string"},url:{type:"string"},email:{type:"string"}},extensionsPrefix:"x-"},License:{properties:{name:{type:"string"},url:{type:"string"}},required:["name"],extensionsPrefix:"x-"},Logo:{properties:{url:{type:"string"},altText:{type:"string"},backgroundColor:{type:"string"},href:{type:"string"}},extensionsPrefix:"x-"},Paths:{properties:{},additionalProperties:(e,t)=>t.startsWith("/")?"PathItem":void 0},PathItem:{properties:{$ref:{type:"string"},parameters:"ParameterList",get:"Operation",put:"Operation",post:"Operation",delete:"Operation",options:"Operation",head:"Operation",patch:"Operation"},extensionsPrefix:"x-"},Parameter:o,ParameterItems:a,ParameterList:(0,r.listOf)("Parameter"),Operation:{properties:{tags:{type:"array",items:{type:"string"}},summary:{type:"string"},description:{type:"string"},externalDocs:"ExternalDocs",operationId:{type:"string"},consumes:{type:"array",items:{type:"string"}},produces:{type:"array",items:{type:"string"}},parameters:"ParameterList",responses:"Responses",schemes:{type:"array",items:{type:"string"}},deprecated:{type:"boolean"},security:"SecurityRequirementList","x-codeSamples":"XCodeSampleList","x-code-samples":"XCodeSampleList","x-hideTryItPanel":{type:"boolean"}},required:["responses"],extensionsPrefix:"x-"},Examples:{properties:{},additionalProperties:{isExample:!0}},Header:c,Responses:s,Response:l,Schema:u,Xml:{properties:{name:{type:"string"},namespace:{type:"string"},prefix:{type:"string"},attribute:{type:"boolean"},wrapped:{type:"boolean"}},extensionsPrefix:"x-"},SchemaProperties:{properties:{},additionalProperties:"Schema"},NamedSchemas:(0,r.mapOf)("Schema"),NamedResponses:(0,r.mapOf)("Response"),NamedParameters:(0,r.mapOf)("Parameter"),NamedSecuritySchemes:(0,r.mapOf)("SecurityScheme"),SecurityScheme:p,XCodeSample:{properties:{lang:{type:"string"},label:{type:"string"},source:{type:"string"}}},XCodeSampleList:(0,r.listOf)("XCodeSample"),XServerList:(0,r.listOf)("XServer"),XServer:{properties:{url:{type:"string"},description:{type:"string"}},required:["url"]}}},4154:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Oas3Types=void 0;const r=n(1990),i=n(3873),o=/^[0-9][0-9Xx]{2}$/,a={properties:{default:"Response"},additionalProperties:(e,t)=>o.test(t)?"Response":void 0},s={properties:{externalDocs:"ExternalDocs",discriminator:"Discriminator",title:{type:"string"},multipleOf:{type:"number",minimum:0},maximum:{type:"number"},minimum:{type:"number"},exclusiveMaximum:{type:"boolean"},exclusiveMinimum:{type:"boolean"},maxLength:{type:"integer",minimum:0},minLength:{type:"integer",minimum:0},pattern:{type:"string"},maxItems:{type:"integer",minimum:0},minItems:{type:"integer",minimum:0},uniqueItems:{type:"boolean"},maxProperties:{type:"integer",minimum:0},minProperties:{type:"integer",minimum:0},required:{type:"array",items:{type:"string"}},enum:{type:"array"},type:{enum:["object","array","string","number","integer","boolean","null"]},allOf:(0,r.listOf)("Schema"),anyOf:(0,r.listOf)("Schema"),oneOf:(0,r.listOf)("Schema"),not:"Schema",properties:"SchemaProperties",items:e=>Array.isArray(e)?(0,r.listOf)("Schema"):"Schema",additionalItems:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",additionalProperties:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",description:{type:"string"},format:{type:"string"},default:null,nullable:{type:"boolean"},readOnly:{type:"boolean"},writeOnly:{type:"boolean"},xml:"Xml",example:{isExample:!0},deprecated:{type:"boolean"},"x-tags":{type:"array",items:{type:"string"}},"x-additionalPropertiesName":{type:"string"},"x-explicitMappingOnly":{type:"boolean"}},extensionsPrefix:"x-"},l={properties:{},additionalProperties:e=>(0,i.isMappingRef)(e)?{type:"string",directResolveAs:"Schema"}:{type:"string"}},c={properties:{type:{enum:["apiKey","http","oauth2","openIdConnect"]},description:{type:"string"},name:{type:"string"},in:{type:"string",enum:["query","header","cookie"]},scheme:{type:"string"},bearerFormat:{type:"string"},flows:"OAuth2Flows",openIdConnectUrl:{type:"string"},"x-defaultClientId":{type:"string"}},required(e){switch(null==e?void 0:e.type){case"apiKey":return["type","name","in"];case"http":return["type","scheme"];case"oauth2":return["type","flows"];case"openIdConnect":return["type","openIdConnectUrl"];default:return["type"]}},allowed(e){switch(null==e?void 0:e.type){case"apiKey":return["type","name","in","description"];case"http":return["type","scheme","bearerFormat","description"];case"oauth2":return["type","flows","description"];case"openIdConnect":return["type","openIdConnectUrl","description"];default:return["type","description"]}},extensionsPrefix:"x-"};t.Oas3Types={Root:{properties:{openapi:null,info:"Info",servers:"ServerList",security:"SecurityRequirementList",tags:"TagList",externalDocs:"ExternalDocs",paths:"Paths",components:"Components","x-webhooks":"WebhooksMap","x-tagGroups":"TagGroups","x-ignoredHeaderParameters":{type:"array",items:{type:"string"}}},required:["openapi","paths","info"],extensionsPrefix:"x-"},Tag:{properties:{name:{type:"string"},description:{type:"string"},externalDocs:"ExternalDocs","x-traitTag":{type:"boolean"},"x-displayName":{type:"string"}},required:["name"],extensionsPrefix:"x-"},TagList:(0,r.listOf)("Tag"),TagGroups:(0,r.listOf)("TagGroup"),TagGroup:{properties:{name:{type:"string"},tags:{type:"array",items:{type:"string"}}},extensionsPrefix:"x-"},ExternalDocs:{properties:{description:{type:"string"},url:{type:"string"}},required:["url"],extensionsPrefix:"x-"},Server:{properties:{url:{type:"string"},description:{type:"string"},variables:"ServerVariablesMap"},required:["url"],extensionsPrefix:"x-"},ServerList:(0,r.listOf)("Server"),ServerVariable:{properties:{enum:{type:"array",items:{type:"string"}},default:{type:"string"},description:{type:"string"}},required:["default"],extensionsPrefix:"x-"},ServerVariablesMap:(0,r.mapOf)("ServerVariable"),SecurityRequirement:{properties:{},additionalProperties:{type:"array",items:{type:"string"}}},SecurityRequirementList:(0,r.listOf)("SecurityRequirement"),Info:{properties:{title:{type:"string"},version:{type:"string"},description:{type:"string"},termsOfService:{type:"string"},contact:"Contact",license:"License","x-logo":"Logo"},required:["title","version"],extensionsPrefix:"x-"},Contact:{properties:{name:{type:"string"},url:{type:"string"},email:{type:"string"}},extensionsPrefix:"x-"},License:{properties:{name:{type:"string"},url:{type:"string"}},required:["name"],extensionsPrefix:"x-"},Paths:{properties:{},additionalProperties:(e,t)=>t.startsWith("/")?"PathItem":void 0},PathItem:{properties:{$ref:{type:"string"},servers:"ServerList",parameters:"ParameterList",summary:{type:"string"},description:{type:"string"},get:"Operation",put:"Operation",post:"Operation",delete:"Operation",options:"Operation",head:"Operation",patch:"Operation",trace:"Operation"},extensionsPrefix:"x-"},Parameter:{properties:{name:{type:"string"},in:{enum:["query","header","path","cookie"]},description:{type:"string"},required:{type:"boolean"},deprecated:{type:"boolean"},allowEmptyValue:{type:"boolean"},style:{enum:["form","simple","label","matrix","spaceDelimited","pipeDelimited","deepObject"]},explode:{type:"boolean"},allowReserved:{type:"boolean"},schema:"Schema",example:{isExample:!0},examples:"ExamplesMap",content:"MediaTypesMap"},required:["name","in"],requiredOneOf:["schema","content"],extensionsPrefix:"x-"},ParameterList:(0,r.listOf)("Parameter"),Operation:{properties:{tags:{type:"array",items:{type:"string"}},summary:{type:"string"},description:{type:"string"},externalDocs:"ExternalDocs",operationId:{type:"string"},parameters:"ParameterList",security:"SecurityRequirementList",servers:"ServerList",requestBody:"RequestBody",responses:"Responses",deprecated:{type:"boolean"},callbacks:"CallbacksMap","x-codeSamples":"XCodeSampleList","x-code-samples":"XCodeSampleList","x-hideTryItPanel":{type:"boolean"}},required:["responses"],extensionsPrefix:"x-"},Callback:(0,r.mapOf)("PathItem"),CallbacksMap:(0,r.mapOf)("Callback"),RequestBody:{properties:{description:{type:"string"},required:{type:"boolean"},content:"MediaTypesMap"},required:["content"],extensionsPrefix:"x-"},MediaTypesMap:{properties:{},additionalProperties:"MediaType"},MediaType:{properties:{schema:"Schema",example:{isExample:!0},examples:"ExamplesMap",encoding:"EncodingMap"},extensionsPrefix:"x-"},Example:{properties:{value:{isExample:!0},summary:{type:"string"},description:{type:"string"},externalValue:{type:"string"}},extensionsPrefix:"x-"},ExamplesMap:(0,r.mapOf)("Example"),Encoding:{properties:{contentType:{type:"string"},headers:"HeadersMap",style:{enum:["form","simple","label","matrix","spaceDelimited","pipeDelimited","deepObject"]},explode:{type:"boolean"},allowReserved:{type:"boolean"}},extensionsPrefix:"x-"},EncodingMap:(0,r.mapOf)("Encoding"),EnumDescriptions:{properties:{},additionalProperties:{type:"string"}},Header:{properties:{description:{type:"string"},required:{type:"boolean"},deprecated:{type:"boolean"},allowEmptyValue:{type:"boolean"},style:{enum:["form","simple","label","matrix","spaceDelimited","pipeDelimited","deepObject"]},explode:{type:"boolean"},allowReserved:{type:"boolean"},schema:"Schema",example:{isExample:!0},examples:"ExamplesMap",content:"MediaTypesMap"},requiredOneOf:["schema","content"],extensionsPrefix:"x-"},HeadersMap:(0,r.mapOf)("Header"),Responses:a,Response:{properties:{description:{type:"string"},headers:"HeadersMap",content:"MediaTypesMap",links:"LinksMap","x-summary":{type:"string"}},required:["description"],extensionsPrefix:"x-"},Link:{properties:{operationRef:{type:"string"},operationId:{type:"string"},parameters:null,requestBody:null,description:{type:"string"},server:"Server"},extensionsPrefix:"x-"},Logo:{properties:{url:{type:"string"},altText:{type:"string"},backgroundColor:{type:"string"},href:{type:"string"}}},Schema:s,Xml:{properties:{name:{type:"string"},namespace:{type:"string"},prefix:{type:"string"},attribute:{type:"boolean"},wrapped:{type:"boolean"}},extensionsPrefix:"x-"},SchemaProperties:{properties:{},additionalProperties:"Schema"},DiscriminatorMapping:l,Discriminator:{properties:{propertyName:{type:"string"},mapping:"DiscriminatorMapping"},required:["propertyName"],extensionsPrefix:"x-"},Components:{properties:{parameters:"NamedParameters",schemas:"NamedSchemas",responses:"NamedResponses",examples:"NamedExamples",requestBodies:"NamedRequestBodies",headers:"NamedHeaders",securitySchemes:"NamedSecuritySchemes",links:"NamedLinks",callbacks:"NamedCallbacks"},extensionsPrefix:"x-"},LinksMap:(0,r.mapOf)("Link"),NamedSchemas:(0,r.mapOf)("Schema"),NamedResponses:(0,r.mapOf)("Response"),NamedParameters:(0,r.mapOf)("Parameter"),NamedExamples:(0,r.mapOf)("Example"),NamedRequestBodies:(0,r.mapOf)("RequestBody"),NamedHeaders:(0,r.mapOf)("Header"),NamedSecuritySchemes:(0,r.mapOf)("SecurityScheme"),NamedLinks:(0,r.mapOf)("Link"),NamedCallbacks:(0,r.mapOf)("Callback"),ImplicitFlow:{properties:{refreshUrl:{type:"string"},scopes:{type:"object",additionalProperties:{type:"string"}},authorizationUrl:{type:"string"}},required:["authorizationUrl","scopes"],extensionsPrefix:"x-"},PasswordFlow:{properties:{refreshUrl:{type:"string"},scopes:{type:"object",additionalProperties:{type:"string"}},tokenUrl:{type:"string"}},required:["tokenUrl","scopes"],extensionsPrefix:"x-"},ClientCredentials:{properties:{refreshUrl:{type:"string"},scopes:{type:"object",additionalProperties:{type:"string"}},tokenUrl:{type:"string"}},required:["tokenUrl","scopes"],extensionsPrefix:"x-"},AuthorizationCode:{properties:{refreshUrl:{type:"string"},authorizationUrl:{type:"string"},scopes:{type:"object",additionalProperties:{type:"string"}},tokenUrl:{type:"string"},"x-usePkce":e=>"boolean"==typeof e?{type:"boolean"}:"XUsePkce"},required:["authorizationUrl","tokenUrl","scopes"],extensionsPrefix:"x-"},OAuth2Flows:{properties:{implicit:"ImplicitFlow",password:"PasswordFlow",clientCredentials:"ClientCredentials",authorizationCode:"AuthorizationCode"},extensionsPrefix:"x-"},SecurityScheme:c,XCodeSample:{properties:{lang:{type:"string"},label:{type:"string"},source:{type:"string"}}},XCodeSampleList:(0,r.listOf)("XCodeSample"),XUsePkce:{properties:{disableManualConfiguration:{type:"boolean"},hideClientSecretInput:{type:"boolean"}}},WebhooksMap:{properties:{},additionalProperties:()=>"PathItem"}}},2082:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Oas3_1Types=void 0;const r=n(1990),i=n(4154),o={properties:{$id:{type:"string"},$anchor:{type:"string"},id:{type:"string"},$schema:{type:"string"},definitions:"NamedSchemas",$defs:"NamedSchemas",$vocabulary:{type:"string"},externalDocs:"ExternalDocs",discriminator:"Discriminator",title:{type:"string"},multipleOf:{type:"number",minimum:0},maximum:{type:"number"},minimum:{type:"number"},exclusiveMaximum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{type:"integer",minimum:0},minLength:{type:"integer",minimum:0},pattern:{type:"string"},maxItems:{type:"integer",minimum:0},minItems:{type:"integer",minimum:0},uniqueItems:{type:"boolean"},maxProperties:{type:"integer",minimum:0},minProperties:{type:"integer",minimum:0},required:{type:"array",items:{type:"string"}},enum:{type:"array"},type:e=>Array.isArray(e)?{type:"array",items:{enum:["object","array","string","number","integer","boolean","null"]}}:{enum:["object","array","string","number","integer","boolean","null"]},allOf:(0,r.listOf)("Schema"),anyOf:(0,r.listOf)("Schema"),oneOf:(0,r.listOf)("Schema"),not:"Schema",if:"Schema",then:"Schema",else:"Schema",dependentSchemas:(0,r.listOf)("Schema"),prefixItems:(0,r.listOf)("Schema"),contains:"Schema",minContains:{type:"integer",minimum:0},maxContains:{type:"integer",minimum:0},patternProperties:{type:"object"},propertyNames:"Schema",unevaluatedItems:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",unevaluatedProperties:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",summary:{type:"string"},properties:"SchemaProperties",items:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",additionalProperties:e=>"boolean"==typeof e?{type:"boolean"}:"Schema",description:{type:"string"},format:{type:"string"},contentEncoding:{type:"string"},contentMediaType:{type:"string"},default:null,readOnly:{type:"boolean"},writeOnly:{type:"boolean"},xml:"Xml",examples:{type:"array"},example:{isExample:!0},deprecated:{type:"boolean"},const:null,$comment:{type:"string"},"x-tags":{type:"array",items:{type:"string"}}},extensionsPrefix:"x-"},a={properties:{type:{enum:["apiKey","http","oauth2","openIdConnect","mutualTLS"]},description:{type:"string"},name:{type:"string"},in:{type:"string",enum:["query","header","cookie"]},scheme:{type:"string"},bearerFormat:{type:"string"},flows:"OAuth2Flows",openIdConnectUrl:{type:"string"}},required(e){switch(null==e?void 0:e.type){case"apiKey":return["type","name","in"];case"http":return["type","scheme"];case"oauth2":return["type","flows"];case"openIdConnect":return["type","openIdConnectUrl"];default:return["type"]}},allowed(e){switch(null==e?void 0:e.type){case"apiKey":return["type","name","in","description"];case"http":return["type","scheme","bearerFormat","description"];case"oauth2":switch(null==e?void 0:e.flows){case"implicit":return["type","flows","authorizationUrl","refreshUrl","description","scopes"];case"password":case"clientCredentials":return["type","flows","tokenUrl","refreshUrl","description","scopes"];default:return["type","flows","authorizationUrl","refreshUrl","tokenUrl","description","scopes"]}case"openIdConnect":return["type","openIdConnectUrl","description"];default:return["type","description"]}},extensionsPrefix:"x-"};t.Oas3_1Types=Object.assign(Object.assign({},i.Oas3Types),{Info:{properties:{title:{type:"string"},version:{type:"string"},description:{type:"string"},termsOfService:{type:"string"},summary:{type:"string"},contact:"Contact",license:"License","x-logo":"Logo"},required:["title","version"],extensionsPrefix:"x-"},Root:{properties:{openapi:null,info:"Info",servers:"ServerList",security:"SecurityRequirementList",tags:"TagList",externalDocs:"ExternalDocs",paths:"Paths",webhooks:"WebhooksMap",components:"Components",jsonSchemaDialect:{type:"string"}},required:["openapi","info"],requiredOneOf:["paths","components","webhooks"],extensionsPrefix:"x-"},Schema:o,License:{properties:{name:{type:"string"},url:{type:"string"},identifier:{type:"string"}},required:["name"],extensionsPrefix:"x-"},Components:{properties:{parameters:"NamedParameters",schemas:"NamedSchemas",responses:"NamedResponses",examples:"NamedExamples",requestBodies:"NamedRequestBodies",headers:"NamedHeaders",securitySchemes:"NamedSecuritySchemes",links:"NamedLinks",callbacks:"NamedCallbacks",pathItems:"NamedPathItems"},extensionsPrefix:"x-"},NamedPathItems:(0,r.mapOf)("PathItem"),SecurityScheme:a,Operation:{properties:{tags:{type:"array",items:{type:"string"}},summary:{type:"string"},description:{type:"string"},externalDocs:"ExternalDocs",operationId:{type:"string"},parameters:"ParameterList",security:"SecurityRequirementList",servers:"ServerList",requestBody:"RequestBody",responses:"Responses",deprecated:{type:"boolean"},callbacks:"CallbacksMap","x-codeSamples":"XCodeSampleList","x-code-samples":"XCodeSampleList","x-hideTryItPanel":{type:"boolean"}},extensionsPrefix:"x-"}})},8209:function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{l(r.next(e))}catch(e){o(e)}}function s(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}l((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.nextTick=t.pickDefined=t.keysOf=t.identity=t.isTruthy=t.showErrorForDeprecatedField=t.showWarningForDeprecatedField=t.doesYamlFileExist=t.isCustomRuleId=t.getMatchingStatusCodeRange=t.assignExisting=t.isNotString=t.isString=t.isNotEmptyObject=t.slash=t.isPathParameter=t.yamlAndJsonSyncReader=t.readFileAsStringSync=t.isSingular=t.validateMimeTypeOAS3=t.validateMimeType=t.splitCamelCaseIntoWords=t.omitObjectProps=t.pickObjectProps=t.readFileFromUrl=t.isEmptyArray=t.isEmptyObject=t.isPlainObject=t.isDefined=t.loadYaml=t.popStack=t.pushStack=t.stringifyYaml=t.parseYaml=void 0;const i=n(7411),o=n(7975),a=n(4536),s=n(8381),l=n(5127),c=n(970),u=n(1827),p=n(2678);var d=n(970);function f(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function h(e,t){return t.match(/^https?:\/\//)||(e=e.replace(/^https?:\/\//,"")),a(e,t)}function m(e){return"string"==typeof e}function g(e){return!!e}function y(e,t){return`${void 0!==t?`${t}.`:""}${e}`}Object.defineProperty(t,"parseYaml",{enumerable:!0,get:function(){return d.parseYaml}}),Object.defineProperty(t,"stringifyYaml",{enumerable:!0,get:function(){return d.stringifyYaml}}),t.pushStack=function(e,t){return{prev:e,value:t}},t.popStack=function(e){var t;return null!==(t=null==e?void 0:e.prev)&&void 0!==t?t:null},t.loadYaml=function(e){return r(this,void 0,void 0,(function*(){const t=yield i.promises.readFile(e,"utf-8");return(0,c.parseYaml)(t)}))},t.isDefined=function(e){return void 0!==e},t.isPlainObject=f,t.isEmptyObject=function(e){return f(e)&&0===Object.keys(e).length},t.isEmptyArray=function(e){return Array.isArray(e)&&0===e.length},t.readFileFromUrl=function(e,t){return r(this,void 0,void 0,(function*(){const n={};for(const r of t.headers)h(e,r.matches)&&(n[r.name]=void 0!==r.envVariable?u.env[r.envVariable]||"":r.value);const r=yield(t.customFetch||s.default)(e,{headers:n});if(!r.ok)throw new Error(`Failed to load ${e}: ${r.status} ${r.statusText}`);return{body:yield r.text(),mimeType:r.headers.get("content-type")}}))},t.pickObjectProps=function(e,t){return Object.fromEntries(t.filter((t=>t in e)).map((t=>[t,e[t]])))},t.omitObjectProps=function(e,t){return Object.fromEntries(Object.entries(e).filter((([e])=>!t.includes(e))))},t.splitCamelCaseIntoWords=function(e){const t=e.split(/(?:[-._])|([A-Z][a-z]+)/).filter(g).map((e=>e.toLocaleLowerCase())),n=e.split(/([A-Z]{2,})/).filter((e=>e&&e===e.toUpperCase())).map((e=>e.toLocaleLowerCase()));return new Set([...t,...n])},t.validateMimeType=function({type:e,value:t},{report:n,location:r},i){if(!i)throw new Error(`Parameter "allowedValues" is not provided for "${"consumes"===e?"request":"response"}-mime-type" rule`);if(t[e])for(const o of t[e])i.includes(o)||n({message:`Mime type "${o}" is not allowed`,location:r.child(t[e].indexOf(o)).key()})},t.validateMimeTypeOAS3=function({type:e,value:t},{report:n,location:r},i){if(!i)throw new Error(`Parameter "allowedValues" is not provided for "${"consumes"===e?"request":"response"}-mime-type" rule`);if(t.content)for(const e of Object.keys(t.content))i.includes(e)||n({message:`Mime type "${e}" is not allowed`,location:r.child("content").child(e).key()})},t.isSingular=function(e){return l.isSingular(e)},t.readFileAsStringSync=function(e){return i.readFileSync(e,"utf-8")},t.yamlAndJsonSyncReader=function(e){const t=i.readFileSync(e,"utf-8");return(0,c.parseYaml)(t)},t.isPathParameter=function(e){return e.startsWith("{")&&e.endsWith("}")},t.slash=function(e){return/^\\\\\?\\/.test(e)?e:e.replace(/\\/g,"/")},t.isNotEmptyObject=function(e){return!!e&&Object.keys(e).length>0},t.isString=m,t.isNotString=function(e){return!m(e)},t.assignExisting=function(e,t){for(const n of Object.keys(t))e.hasOwnProperty(n)&&(e[n]=t[n])},t.getMatchingStatusCodeRange=function(e){return`${e}`.replace(/^(\d)\d\d$/,((e,t)=>`${t}XX`))},t.isCustomRuleId=function(e){return e.includes("/")},t.doesYamlFileExist=function(e){return(".yaml"===(0,o.extname)(e)||".yml"===(0,o.extname)(e))&&i.hasOwnProperty("existsSync")&&i.existsSync(e)},t.showWarningForDeprecatedField=function(e,t,n){p.logger.warn(`The '${p.colorize.red(e)}' field is deprecated. ${t?`Use ${p.colorize.green(y(t,n))} instead. `:""}Read more about this change: https://redocly.com/docs/api-registry/guides/migration-guide-config-file/#changed-properties\n`)},t.showErrorForDeprecatedField=function(e,t,n){throw new Error(`Do not use '${e}' field. ${t?`Use '${y(t,n)}' instead. `:""}\n`)},t.isTruthy=g,t.identity=function(e){return e},t.keysOf=function(e){return e?Object.keys(e):[]},t.pickDefined=function(e){if(!e)return;const t={};for(const n in e)void 0!==e[n]&&(t[n]=e[n]);return t},t.nextTick=function(){new Promise((e=>{setTimeout(e)}))}},2161:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.normalizeVisitors=void 0;const r=n(1990),i={Root:"DefinitionRoot",ServerVariablesMap:"ServerVariableMap",Paths:["PathMap","PathsMap"],CallbacksMap:"CallbackMap",MediaTypesMap:"MediaTypeMap",ExamplesMap:"ExampleMap",EncodingMap:"EncodingsMap",HeadersMap:"HeaderMap",LinksMap:"LinkMap",OAuth2Flows:"SecuritySchemeFlows",Responses:"ResponsesMap"};t.normalizeVisitors=function(e,t){const n={any:{enter:[],leave:[]}};for(const e of Object.keys(t))n[e]={enter:[],leave:[]};n.ref={enter:[],leave:[]};for(const{ruleId:t,severity:n,visitor:r}of e)s({ruleId:t,severity:n},r,null);for(const e of Object.keys(n))n[e].enter.sort(((e,t)=>t.depth-e.depth)),n[e].leave.sort(((e,t)=>e.depth-t.depth));return n;function o(e,t,i,a,s=[]){if(s.includes(t))return;s=[...s,t];const l=new Set;for(const n of Object.values(t.properties))n!==i?"object"==typeof n&&null!==n&&n.name&&l.add(n):c(e,s);t.additionalProperties&&"function"!=typeof t.additionalProperties&&(t.additionalProperties===i?c(e,s):void 0!==t.additionalProperties.name&&l.add(t.additionalProperties)),t.items&&(t.items===i?c(e,s):void 0!==t.items.name&&l.add(t.items)),t.extensionsPrefix&&l.add(r.SpecExtension);for(const t of Array.from(l.values()))o(e,t,i,a,s);function c(e,t){for(const r of t.slice(1))n[r.name]=n[r.name]||{enter:[],leave:[]},n[r.name].enter.push(Object.assign(Object.assign({},e),{visit:()=>{},depth:0,context:{isSkippedLevel:!0,seen:new Set,parent:a}}))}}function a(e,t){if(Array.isArray(t)){const n=t.find((t=>e[t]))||void 0;return n&&e[n]}return e[t]}function s(e,r,l,c=0){const u=Object.keys(t);if(0===c)u.push("any"),u.push("ref");else{if(r.any)throw new Error("any() is allowed only on top level");if(r.ref)throw new Error("ref() is allowed only on top level")}for(const p of u){const u=r[p]||a(r,i[p]),d=n[p];if(!u)continue;let f,h,m;const g="object"==typeof u;if("ref"===p&&g&&u.skip)throw new Error("ref() visitor does not support skip");"function"==typeof u?f=u:g&&(f=u.enter,h=u.leave,m=u.skip);const y={activatedOn:null,type:t[p],parent:l,isSkippedLevel:!1};if("object"==typeof u&&s(e,u,y,c+1),l&&o(e,l.type,t[p],l),f||g){if(f&&"function"!=typeof f)throw new Error("DEV: should be function");d.enter.push(Object.assign(Object.assign({},e),{visit:f||(()=>{}),skip:m,depth:c,context:y}))}if(h){if("function"!=typeof h)throw new Error("DEV: should be function");d.leave.push(Object.assign(Object.assign({},e),{visit:h,depth:c,context:y}))}}}}},5735:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.walkDocument=void 0;const r=n(3873),i=n(8209),o=n(2928),a=n(1990);function s(e){var t,n;const r={};for(;e.parent;)(null===(t=e.parent.activatedOn)||void 0===t?void 0:t.value.location)&&(r[e.parent.type.name]=null===(n=e.parent.activatedOn)||void 0===n?void 0:n.value.location),e=e.parent;return r}t.walkDocument=function(e){const{document:t,rootType:n,normalizedVisitors:l,resolvedRefMap:c,ctx:u}=e,p={},d=new Set;!function e(t,n,f,h,m){var g,y,b,v,x,w,k,S,E,O,_;const A=(e,t=C.source.absoluteRef)=>{if(!(0,r.isRef)(e))return{location:f,node:e};const n=(0,o.makeRefId)(t,e.$ref),i=c.get(n);if(!i)return{location:void 0,node:void 0};const{resolved:a,node:s,document:l,nodePointer:u,error:p}=i;return{location:a?new r.Location(l.source,u):p instanceof o.YamlParseError?new r.Location(p.source,""):void 0,node:s,error:p}},j=f;let C=f;const{node:P,location:T,error:I}=A(t),R=new Set;if((0,r.isRef)(t)){const e=l.ref.enter;for(const{visit:r,ruleId:i,severity:o,context:a}of e)R.add(a),r(t,{report:$.bind(void 0,i,o),resolve:A,rawNode:t,rawLocation:j,location:f,type:n,parent:h,key:m,parentLocations:{},oasVersion:u.oasVersion,getVisitorData:L.bind(void 0,i)},{node:P,location:T,error:I}),(null==T?void 0:T.source.absoluteRef)&&u.refTypes&&u.refTypes.set(null==T?void 0:T.source.absoluteRef,n)}if(void 0!==P&&T&&"scalar"!==n.name){C=T;const o=null===(y=null===(g=p[n.name])||void 0===g?void 0:g.has)||void 0===y?void 0:y.call(g,P);let s=!1;const c=l.any.enter.concat((null===(b=l[n.name])||void 0===b?void 0:b.enter)||[]),u=[];for(const{context:e,visit:r,skip:a,ruleId:l,severity:p}of c){if(d.has(C.pointer))break;if(e.isSkippedLevel)!e.parent.activatedOn||e.parent.activatedOn.value.nextLevelTypeActivated||e.seen.has(t)||(e.seen.add(t),s=!0,u.push(e));else if(e.parent&&e.parent.activatedOn&&(null===(v=e.activatedOn)||void 0===v?void 0:v.value.withParentNode)!==e.parent.activatedOn.value.node&&(null===(x=e.parent.activatedOn.value.nextLevelTypeActivated)||void 0===x?void 0:x.value)!==n||!e.parent&&!o){u.push(e);const o={node:P,location:T,nextLevelTypeActivated:null,withParentNode:null===(k=null===(w=e.parent)||void 0===w?void 0:w.activatedOn)||void 0===k?void 0:k.value.node,skipped:null!==(O=(null===(E=null===(S=e.parent)||void 0===S?void 0:S.activatedOn)||void 0===E?void 0:E.value.skipped)||(null==a?void 0:a(P,m,{location:f,rawLocation:j,resolve:A,rawNode:t})))&&void 0!==O&&O};e.activatedOn=(0,i.pushStack)(e.activatedOn,o);let c=e.parent;for(;c;)c.activatedOn.value.nextLevelTypeActivated=(0,i.pushStack)(c.activatedOn.value.nextLevelTypeActivated,n),c=c.parent;o.skipped||(s=!0,R.add(e),N(r,P,t,e,l,p))}}if(s||!o)if(p[n.name]=p[n.name]||new Set,p[n.name].add(P),Array.isArray(P)){const t=n.items;if(void 0!==t)for(let n=0;n!i.includes(e)))):n.extensionsPrefix&&i.push(...Object.keys(P).filter((e=>e.startsWith(n.extensionsPrefix)))),(0,r.isRef)(t)&&i.push(...Object.keys(t).filter((e=>"$ref"!==e&&!i.includes(e))));for(const o of i){let i=P[o],s=T;void 0===i&&(i=t[o],s=f);let l=n.properties[o];void 0===l&&(l=n.additionalProperties),"function"==typeof l&&(l=l(i,o)),void 0===l&&n.extensionsPrefix&&o.startsWith(n.extensionsPrefix)&&(l=a.SpecExtension),!(0,a.isNamedType)(l)&&(null==l?void 0:l.directResolveAs)&&(l=l.directResolveAs,i={$ref:i}),l&&void 0===l.name&&!1!==l.resolvable&&(l={name:"scalar",properties:{}}),(0,a.isNamedType)(l)&&("scalar"!==l.name||(0,r.isRef)(i))&&e(i,l,s.child([o]),P,o)}}const h=l.any.leave,I=((null===(_=l[n.name])||void 0===_?void 0:_.leave)||[]).concat(h);for(const e of u.reverse())if(e.isSkippedLevel)e.seen.delete(P);else if(e.activatedOn=(0,i.popStack)(e.activatedOn),e.parent){let t=e.parent;for(;t;)t.activatedOn.value.nextLevelTypeActivated=(0,i.popStack)(t.activatedOn.value.nextLevelTypeActivated),t=t.parent}for(const{context:e,visit:n,ruleId:r,severity:i}of I)!e.isSkippedLevel&&R.has(e)&&N(n,P,t,e,r,i)}if(C=f,(0,r.isRef)(t)){const e=l.ref.leave;for(const{visit:r,ruleId:i,severity:o,context:a}of e)R.has(a)&&r(t,{report:$.bind(void 0,i,o),resolve:A,rawNode:t,rawLocation:j,location:f,type:n,parent:h,key:m,parentLocations:{},oasVersion:u.oasVersion,getVisitorData:L.bind(void 0,i)},{node:P,location:T,error:I})}function N(e,t,r,i,o,a){e(t,{report:$.bind(void 0,o,a),resolve:A,rawNode:r,location:C,rawLocation:j,type:n,parent:h,key:m,parentLocations:s(i),oasVersion:u.oasVersion,ignoreNextVisitorsOnNode:()=>{d.add(C.pointer)},getVisitorData:L.bind(void 0,o)},function(e){var t;const n={};for(;e.parent;)n[e.parent.type.name]=null===(t=e.parent.activatedOn)||void 0===t?void 0:t.value.node,e=e.parent;return n}(i),i)}function $(e,t,n){const r=(n.location?Array.isArray(n.location)?n.location:[n.location]:[Object.assign(Object.assign({},C),{reportOnKey:!1})]).map((e=>Object.assign(Object.assign(Object.assign({},C),{reportOnKey:!1}),e))),i=n.forceSeverity||t;"off"!==i&&u.problems.push(Object.assign(Object.assign({ruleId:n.ruleId||e,severity:i},n),{suggest:n.suggest||[],location:r}))}function L(e){return u.visitorsData[e]=u.visitorsData[e]||{},u.visitorsData[e]}}(t.parsed,n,new r.Location(t.source,"#/"),void 0,"")}},1431:function(e,t,n){var r=n(8505);e.exports=function(e){return e?("{}"===e.substr(0,2)&&(e="\\{\\}"+e.substr(2)),g(function(e){return e.split("\\\\").join(i).split("\\{").join(o).split("\\}").join(a).split("\\,").join(s).split("\\.").join(l)}(e),!0).map(u)):[]};var i="\0SLASH"+Math.random()+"\0",o="\0OPEN"+Math.random()+"\0",a="\0CLOSE"+Math.random()+"\0",s="\0COMMA"+Math.random()+"\0",l="\0PERIOD"+Math.random()+"\0";function c(e){return parseInt(e,10)==e?parseInt(e,10):e.charCodeAt(0)}function u(e){return e.split(i).join("\\").split(o).join("{").split(a).join("}").split(s).join(",").split(l).join(".")}function p(e){if(!e)return[""];var t=[],n=r("{","}",e);if(!n)return e.split(",");var i=n.pre,o=n.body,a=n.post,s=i.split(",");s[s.length-1]+="{"+o+"}";var l=p(a);return a.length&&(s[s.length-1]+=l.shift(),s.push.apply(s,l)),t.push.apply(t,s),t}function d(e){return"{"+e+"}"}function f(e){return/^-?0\d/.test(e)}function h(e,t){return e<=t}function m(e,t){return e>=t}function g(e,t){var n=[],i=r("{","}",e);if(!i)return[e];var o=i.pre,s=i.post.length?g(i.post,!1):[""];if(/\$$/.test(i.pre))for(var l=0;l=0;if(!w&&!k)return i.post.match(/,.*\}/)?g(e=i.pre+"{"+i.body+a+i.post):[e];if(w)y=i.body.split(/\.\./);else if(1===(y=p(i.body)).length&&1===(y=g(y[0],!1).map(d)).length)return s.map((function(e){return i.pre+y[0]+e}));if(w){var S=c(y[0]),E=c(y[1]),O=Math.max(y[0].length,y[1].length),_=3==y.length?Math.abs(c(y[2])):1,A=h;E0){var I=new Array(T+1).join("0");P=C<0?"-"+I+P.slice(1):I+P}}b.push(P)}}else{b=[];for(var R=0;R(g(t),!(!n.nocomment&&"#"===t.charAt(0))&&new v(t,n).match(e));e.exports=r;const i=n(4077);r.sep=i.sep;const o=Symbol("globstar **");r.GLOBSTAR=o;const a=n(1431),s={"!":{open:"(?:(?!(?:",close:"))[^/]*?)"},"?":{open:"(?:",close:")?"},"+":{open:"(?:",close:")+"},"*":{open:"(?:",close:")*"},"@":{open:"(?:",close:")"}},l="[^/]",c=l+"*?",u=e=>e.split("").reduce(((e,t)=>(e[t]=!0,e)),{}),p=u("().*{}+?[]^$\\!"),d=u("[.("),f=/\/+/;r.filter=(e,t={})=>(n,i,o)=>r(n,e,t);const h=(e,t={})=>{const n={};return Object.keys(e).forEach((t=>n[t]=e[t])),Object.keys(t).forEach((e=>n[e]=t[e])),n};r.defaults=e=>{if(!e||"object"!=typeof e||!Object.keys(e).length)return r;const t=r,n=(n,r,i)=>t(n,r,h(e,i));return(n.Minimatch=class extends t.Minimatch{constructor(t,n){super(t,h(e,n))}}).defaults=n=>t.defaults(h(e,n)).Minimatch,n.filter=(n,r)=>t.filter(n,h(e,r)),n.defaults=n=>t.defaults(h(e,n)),n.makeRe=(n,r)=>t.makeRe(n,h(e,r)),n.braceExpand=(n,r)=>t.braceExpand(n,h(e,r)),n.match=(n,r,i)=>t.match(n,r,h(e,i)),n},r.braceExpand=(e,t)=>m(e,t);const m=(e,t={})=>(g(e),t.nobrace||!/\{(?:(?!\{).)*\}/.test(e)?[e]:a(e)),g=e=>{if("string"!=typeof e)throw new TypeError("invalid pattern");if(e.length>65536)throw new TypeError("pattern is too long")},y=Symbol("subparse");r.makeRe=(e,t)=>new v(e,t||{}).makeRe(),r.match=(e,t,n={})=>{const r=new v(t,n);return e=e.filter((e=>r.match(e))),r.options.nonull&&!e.length&&e.push(t),e};const b=e=>e.replace(/[[\]\\]/g,"\\$&");class v{constructor(e,t){g(e),t||(t={}),this.options=t,this.set=[],this.pattern=e,this.windowsPathsNoEscape=!!t.windowsPathsNoEscape||!1===t.allowWindowsEscape,this.windowsPathsNoEscape&&(this.pattern=this.pattern.replace(/\\/g,"/")),this.regexp=null,this.negate=!1,this.comment=!1,this.empty=!1,this.partial=!!t.partial,this.make()}debug(){}make(){const e=this.pattern,t=this.options;if(!t.nocomment&&"#"===e.charAt(0))return void(this.comment=!0);if(!e)return void(this.empty=!0);this.parseNegate();let n=this.globSet=this.braceExpand();t.debug&&(this.debug=(...e)=>console.error(...e)),this.debug(this.pattern,n),n=this.globParts=n.map((e=>e.split(f))),this.debug(this.pattern,n),n=n.map(((e,t,n)=>e.map(this.parse,this))),this.debug(this.pattern,n),n=n.filter((e=>-1===e.indexOf(!1))),this.debug(this.pattern,n),this.set=n}parseNegate(){if(this.options.nonegate)return;const e=this.pattern;let t=!1,n=0;for(let r=0;r>> no match, partial?",e,d,t,f),d!==s))}if("string"==typeof u?(c=p===u,this.debug("string match",u,p,c)):(c=p.match(u),this.debug("pattern match",u,p,c)),!c)return!1}if(i===s&&a===l)return!0;if(i===s)return n;if(a===l)return i===s-1&&""===e[i];throw new Error("wtf?")}braceExpand(){return m(this.pattern,this.options)}parse(e,t){g(e);const n=this.options;if("**"===e){if(!n.noglobstar)return o;e="*"}if(""===e)return"";let r="",i=!1,a=!1;const u=[],f=[];let h,m,v,x,w=!1,k=-1,S=-1,E="."===e.charAt(0),O=n.dot||E;const _=e=>"."===e.charAt(0)?"":n.dot?"(?!(?:^|\\/)\\.{1,2}(?:$|\\/))":"(?!\\.)",A=()=>{if(h){switch(h){case"*":r+=c,i=!0;break;case"?":r+=l,i=!0;break;default:r+="\\"+h}this.debug("clearStateChar %j %j",h,r),h=!1}};for(let t,o=0;o(n||(n="\\"),t+t+n+"|"))),this.debug("tail=%j\n %s",e,e,v,r);const t="*"===v.type?c:"?"===v.type?l:"\\"+v.type;i=!0,r=r.slice(0,v.reStart)+t+"\\("+e}A(),a&&(r+="\\\\");const j=d[r.charAt(0)];for(let e=f.length-1;e>-1;e--){const n=f[e],i=r.slice(0,n.reStart),o=r.slice(n.reStart,n.reEnd-8);let a=r.slice(n.reEnd);const s=r.slice(n.reEnd-8,n.reEnd)+a,l=i.split(")").length,c=i.split("(").length-l;let u=a;for(let e=0;ee.replace(/\\(.)/g,"$1"))(e);const C=n.nocase?"i":"";try{return Object.assign(new RegExp("^"+r+"$",C),{_glob:e,_src:r})}catch(e){return new RegExp("$.")}}makeRe(){if(this.regexp||!1===this.regexp)return this.regexp;const e=this.set;if(!e.length)return this.regexp=!1,this.regexp;const t=this.options,n=t.noglobstar?c:t.dot?"(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?":"(?:(?!(?:\\/|^)\\.).)*?",r=t.nocase?"i":"";let i=e.map((e=>(e=e.map((e=>"string"==typeof e?e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"):e===o?o:e._src)).reduce(((e,t)=>(e[e.length-1]===o&&t===o||e.push(t),e)),[]),e.forEach(((t,r)=>{t===o&&e[r-1]!==o&&(0===r?e.length>1?e[r+1]="(?:\\/|"+n+"\\/)?"+e[r+1]:e[r]=n:r===e.length-1?e[r-1]+="(?:\\/|"+n+")?":(e[r-1]+="(?:\\/|\\/"+n+"\\/)"+e[r+1],e[r+1]=o))})),e.filter((e=>e!==o)).join("/")))).join("|");i="^(?:"+i+")$",this.negate&&(i="^(?!"+i+").*$");try{this.regexp=new RegExp(i,r)}catch(e){this.regexp=!1}return this.regexp}match(e,t=this.partial){if(this.debug("match",e,this.pattern),this.comment)return!1;if(this.empty)return""===e;if("/"===e&&t)return!0;const n=this.options;"/"!==i.sep&&(e=e.split(i.sep).join("/")),e=e.split(f),this.debug(this.pattern,"split",e);const r=this.set;let o;this.debug(this.pattern,"set",r);for(let t=e.length-1;t>=0&&(o=e[t],!o);t--);for(let i=0;i=0&&c>0){if(e===t)return[l,c];for(r=[],o=n.length;u>=0&&!s;)u==l?(r.push(u),l=n.indexOf(e,u+1)):1==r.length?s=[r.pop(),c]:((i=r.pop())=0?l:c;r.length&&(s=[o,a])}return s}e.exports=t,t.range=r},3998:function(e,t,n){"use strict";var r=n(1137);e.exports=function(e,t){return e?void t.then((function(t){r((function(){e(null,t)}))}),(function(t){r((function(){e(t)}))})):t}},1137:function(e){"use strict";e.exports="object"==typeof process&&"function"==typeof process.nextTick?process.nextTick:"function"==typeof setImmediate?setImmediate:function(e){setTimeout(e,0)}},2485:function(e,t){var n;!function(){"use strict";var r={}.hasOwnProperty;function i(){for(var e=[],t=0;tu;)if((s=l[u++])!=s)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},1344:function(e,t,n){var r=n(6885),i=n(8664),o=n(2612),a=n(3747),s=n(2998),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,p=6==e,d=7==e,f=5==e||p;return function(h,m,g,y){for(var b,v,x=o(h),w=i(x),k=r(m,g,3),S=a(w.length),E=0,O=y||s,_=t?O(h,S):n||d?O(h,0):void 0;S>E;E++)if((f||E in w)&&(v=k(b=w[E],E,x),e))if(t)_[E]=v;else if(v)switch(e){case 3:return!0;case 5:return b;case 6:return E;case 2:l.call(_,b)}else switch(e){case 4:return!1;case 7:l.call(_,b)}return p?-1:c||u?u:_}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},5634:function(e,t,n){var r=n(2074),i=n(1602),o=n(6845),a=i("species");e.exports=function(e){return o>=51||!r((function(){var t=[];return(t.constructor={})[a]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},2998:function(e,t,n){var r=n(5335),i=n(8679),o=n(1602)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},8569:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},3062:function(e,t,n){var r=n(3129),i=n(8569),o=n(1602)("toStringTag"),a="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:a?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},4361:function(e,t,n){var r=n(1883),i=n(5816),o=n(7632),a=n(3610);e.exports=function(e,t){for(var n=i(t),s=a.f,l=o.f,c=0;c=74)&&(r=a.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},290:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},1605:function(e,t,n){var r=n(200),i=n(7632).f,o=n(7712),a=n(7485),s=n(5975),l=n(4361),c=n(4977);e.exports=function(e,t){var n,u,p,d,f,h=e.target,m=e.global,g=e.stat;if(n=m?r:g?r[h]||s(h,{}):(r[h]||{}).prototype)for(u in t){if(d=t[u],p=e.noTargetGet?(f=i(n,u))&&f.value:n[u],!c(m?u:h+(g?".":"#")+u,e.forced)&&void 0!==p){if(typeof d==typeof p)continue;l(d,p)}(e.sham||p&&p.sham)&&o(d,"sham",!0),a(n,u,d,e)}}},2074:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},6885:function(e,t,n){var r=n(9085);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},6492:function(e,t,n){var r=n(9720),i=n(200),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},200:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},1883:function(e,t,n){var r=n(2612),i={}.hasOwnProperty;e.exports=Object.hasOwn||function(e,t){return i.call(r(e),t)}},7708:function(e){e.exports={}},8890:function(e,t,n){var r=n(6492);e.exports=r("document","documentElement")},7694:function(e,t,n){var r=n(5077),i=n(2074),o=n(3262);e.exports=!r&&!i((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},8664:function(e,t,n){var r=n(2074),i=n(8569),o="".split;e.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9965:function(e,t,n){var r=n(9310),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9206:function(e,t,n){var r,i,o,a=n(2886),s=n(200),l=n(5335),c=n(7712),u=n(1883),p=n(9310),d=n(5904),f=n(7708),h="Object already initialized",m=s.WeakMap;if(a||p.state){var g=p.state||(p.state=new m),y=g.get,b=g.has,v=g.set;r=function(e,t){if(b.call(g,e))throw new TypeError(h);return t.facade=e,v.call(g,e,t),t},i=function(e){return y.call(g,e)||{}},o=function(e){return b.call(g,e)}}else{var x=d("state");f[x]=!0,r=function(e,t){if(u(e,x))throw new TypeError(h);return t.facade=e,c(e,x,t),t},i=function(e){return u(e,x)?e[x]:{}},o=function(e){return u(e,x)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},8679:function(e,t,n){var r=n(8569);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4977:function(e,t,n){var r=n(2074),i=/#|\.prototype\./,o=function(e,t){var n=s[a(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},a=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},s=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},5335:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},6926:function(e){e.exports=!1},1849:function(e,t,n){var r=n(6845),i=n(2074);e.exports=!!Object.getOwnPropertySymbols&&!i((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},2886:function(e,t,n){var r=n(200),i=n(9965),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},3105:function(e,t,n){var r,i=n(3938),o=n(5318),a=n(290),s=n(7708),l=n(8890),c=n(3262),u=n(5904),p="prototype",d="script",f=u("IE_PROTO"),h=function(){},m=function(e){return"<"+d+">"+e+""},g=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;g=r?function(e){e.write(m("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+d+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(m("document.F=Object")),e.close(),e.F);for(var i=a.length;i--;)delete g[p][a[i]];return g()};s[f]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[p]=i(e),n=new h,h[p]=null,n[f]=e):n=g(),void 0===t?n:o(n,t)}},5318:function(e,t,n){var r=n(5077),i=n(3610),o=n(3938),a=n(1641);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=a(t),s=r.length,l=0;s>l;)i.f(e,n=r[l++],t[n]);return e}},3610:function(e,t,n){var r=n(5077),i=n(7694),o=n(3938),a=n(874),s=Object.defineProperty;t.f=r?s:function(e,t,n){if(o(e),t=a(t,!0),o(n),i)try{return s(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},7632:function(e,t,n){var r=n(5077),i=n(9304),o=n(6843),a=n(5476),s=n(874),l=n(1883),c=n(7694),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=a(e),t=s(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},6509:function(e,t,n){var r=n(5476),i=n(4789).f,o={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return a&&"[object Window]"==o.call(e)?function(e){try{return i(e)}catch(e){return a.slice()}}(e):i(r(e))}},4789:function(e,t,n){var r=n(6347),i=n(290).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},8916:function(e,t){t.f=Object.getOwnPropertySymbols},6347:function(e,t,n){var r=n(1883),i=n(5476),o=n(8186).indexOf,a=n(7708);e.exports=function(e,t){var n,s=i(e),l=0,c=[];for(n in s)!r(a,n)&&r(s,n)&&c.push(n);for(;t.length>l;)r(s,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1641:function(e,t,n){var r=n(6347),i=n(290);e.exports=Object.keys||function(e){return r(e,i)}},9304:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},4972:function(e,t,n){"use strict";var r=n(3129),i=n(3062);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},5816:function(e,t,n){var r=n(6492),i=n(4789),o=n(8916),a=n(3938);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(a(e)),n=o.f;return n?t.concat(n(e)):t}},9720:function(e,t,n){var r=n(200);e.exports=r},7485:function(e,t,n){var r=n(200),i=n(7712),o=n(1883),a=n(5975),s=n(9965),l=n(9206),c=l.get,u=l.enforce,p=String(String).split("String");(e.exports=function(e,t,n,s){var l,c=!!s&&!!s.unsafe,d=!!s&&!!s.enumerable,f=!!s&&!!s.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=p.join("string"==typeof t?t:""))),e!==r?(c?!f&&e[t]&&(d=!0):delete e[t],d?e[t]=n:i(e,t,n)):d?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&c(this).source||s(this)}))},1229:function(e){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},5975:function(e,t,n){var r=n(200),i=n(7712);e.exports=function(e,t){try{i(r,e,t)}catch(n){r[e]=t}return t}},5282:function(e,t,n){var r=n(3610).f,i=n(1883),o=n(1602)("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},5904:function(e,t,n){var r=n(2),i=n(665),o=r("keys");e.exports=function(e){return o[e]||(o[e]=i(e))}},9310:function(e,t,n){var r=n(200),i=n(5975),o="__core-js_shared__",a=r[o]||i(o,{});e.exports=a},2:function(e,t,n){var r=n(6926),i=n(9310);(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.14.0",mode:r?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},6539:function(e,t,n){var r=n(7317),i=Math.max,o=Math.min;e.exports=function(e,t){var n=r(e);return n<0?i(n+t,0):o(n,t)}},5476:function(e,t,n){var r=n(8664),i=n(1229);e.exports=function(e){return r(i(e))}},7317:function(e){var t=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:t)(e)}},3747:function(e,t,n){var r=n(7317),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},2612:function(e,t,n){var r=n(1229);e.exports=function(e){return Object(r(e))}},874:function(e,t,n){var r=n(5335);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},3129:function(e,t,n){var r={};r[n(1602)("toStringTag")]="z",e.exports="[object z]"===String(r)},665:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},5225:function(e,t,n){var r=n(1849);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},802:function(e,t,n){var r=n(1602);t.f=r},1602:function(e,t,n){var r=n(200),i=n(2),o=n(1883),a=n(665),s=n(1849),l=n(5225),c=i("wks"),u=r.Symbol,p=l?u:u&&u.withoutSetter||a;e.exports=function(e){return o(c,e)&&(s||"string"==typeof c[e])||(s&&o(u,e)?c[e]=u[e]:c[e]=p("Symbol."+e)),c[e]}},115:function(e,t,n){"use strict";var r=n(1605),i=n(2074),o=n(8679),a=n(5335),s=n(2612),l=n(3747),c=n(2057),u=n(2998),p=n(5634),d=n(1602),f=n(6845),h=d("isConcatSpreadable"),m=9007199254740991,g="Maximum allowed index exceeded",y=f>=51||!i((function(){var e=[];return e[h]=!1,e.concat()[0]!==e})),b=p("concat"),v=function(e){if(!a(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!y||!b},{concat:function(e){var t,n,r,i,o,a=s(this),p=u(a,0),d=0;for(t=-1,r=arguments.length;tm)throw TypeError(g);for(n=0;n=m)throw TypeError(g);c(p,d++,o)}return p.length=d,p}})},1586:function(e,t,n){var r=n(200);n(5282)(r.JSON,"JSON",!0)},6982:function(e,t,n){n(5282)(Math,"Math",!0)},5086:function(e,t,n){var r=n(3129),i=n(7485),o=n(4972);r||i(Object.prototype,"toString",o,{unsafe:!0})},3719:function(e,t,n){var r=n(1605),i=n(200),o=n(5282);r({global:!0},{Reflect:{}}),o(i.Reflect,"Reflect",!0)},7727:function(e,t,n){n(1272)("asyncIterator")},590:function(e,t,n){"use strict";var r=n(1605),i=n(5077),o=n(200),a=n(1883),s=n(5335),l=n(3610).f,c=n(4361),u=o.Symbol;if(i&&"function"==typeof u&&(!("description"in u.prototype)||void 0!==u().description)){var p={},d=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof d?new u(e):void 0===e?u():u(e);return""===e&&(p[t]=!0),t};c(d,u);var f=d.prototype=u.prototype;f.constructor=d;var h=f.toString,m="Symbol(test)"==String(u("test")),g=/^Symbol\((.*)\)[^)]+$/;l(f,"description",{configurable:!0,get:function(){var e=s(this)?this.valueOf():this,t=h.call(e);if(a(p,e))return"";var n=m?t.slice(7,-1):t.replace(g,"$1");return""===n?void 0:n}}),r({global:!0,forced:!0},{Symbol:d})}},8290:function(e,t,n){n(1272)("hasInstance")},2619:function(e,t,n){n(1272)("isConcatSpreadable")},4216:function(e,t,n){n(1272)("iterator")},3534:function(e,t,n){"use strict";var r=n(1605),i=n(200),o=n(6492),a=n(6926),s=n(5077),l=n(1849),c=n(5225),u=n(2074),p=n(1883),d=n(8679),f=n(5335),h=n(3938),m=n(2612),g=n(5476),y=n(874),b=n(6843),v=n(3105),x=n(1641),w=n(4789),k=n(6509),S=n(8916),E=n(7632),O=n(3610),_=n(9304),A=n(7712),j=n(7485),C=n(2),P=n(5904),T=n(7708),I=n(665),R=n(1602),N=n(802),$=n(1272),L=n(5282),D=n(9206),M=n(1344).forEach,z=P("hidden"),F="Symbol",U="prototype",B=R("toPrimitive"),q=D.set,V=D.getterFor(F),W=Object[U],H=i.Symbol,Y=o("JSON","stringify"),Q=E.f,G=O.f,X=k.f,K=_.f,Z=C("symbols"),J=C("op-symbols"),ee=C("string-to-symbol-registry"),te=C("symbol-to-string-registry"),ne=C("wks"),re=i.QObject,ie=!re||!re[U]||!re[U].findChild,oe=s&&u((function(){return 7!=v(G({},"a",{get:function(){return G(this,"a",{value:7}).a}})).a}))?function(e,t,n){var r=Q(W,t);r&&delete W[t],G(e,t,n),r&&e!==W&&G(W,t,r)}:G,ae=function(e,t){var n=Z[e]=v(H[U]);return q(n,{type:F,tag:e,description:t}),s||(n.description=t),n},se=c?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof H},le=function(e,t,n){e===W&&le(J,t,n),h(e);var r=y(t,!0);return h(n),p(Z,r)?(n.enumerable?(p(e,z)&&e[z][r]&&(e[z][r]=!1),n=v(n,{enumerable:b(0,!1)})):(p(e,z)||G(e,z,b(1,{})),e[z][r]=!0),oe(e,r,n)):G(e,r,n)},ce=function(e,t){h(e);var n=g(t),r=x(n).concat(fe(n));return M(r,(function(t){s&&!ue.call(n,t)||le(e,t,n[t])})),e},ue=function(e){var t=y(e,!0),n=K.call(this,t);return!(this===W&&p(Z,t)&&!p(J,t))&&(!(n||!p(this,t)||!p(Z,t)||p(this,z)&&this[z][t])||n)},pe=function(e,t){var n=g(e),r=y(t,!0);if(n!==W||!p(Z,r)||p(J,r)){var i=Q(n,r);return!i||!p(Z,r)||p(n,z)&&n[z][r]||(i.enumerable=!0),i}},de=function(e){var t=X(g(e)),n=[];return M(t,(function(e){p(Z,e)||p(T,e)||n.push(e)})),n},fe=function(e){var t=e===W,n=X(t?J:g(e)),r=[];return M(n,(function(e){!p(Z,e)||t&&!p(W,e)||r.push(Z[e])})),r};l||(H=function(){if(this instanceof H)throw TypeError("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=I(e),n=function(e){this===W&&n.call(J,e),p(this,z)&&p(this[z],t)&&(this[z][t]=!1),oe(this,t,b(1,e))};return s&&ie&&oe(W,t,{configurable:!0,set:n}),ae(t,e)},j(H[U],"toString",(function(){return V(this).tag})),j(H,"withoutSetter",(function(e){return ae(I(e),e)})),_.f=ue,O.f=le,E.f=pe,w.f=k.f=de,S.f=fe,N.f=function(e){return ae(R(e),e)},s&&(G(H[U],"description",{configurable:!0,get:function(){return V(this).description}}),a||j(W,"propertyIsEnumerable",ue,{unsafe:!0}))),r({global:!0,wrap:!0,forced:!l,sham:!l},{Symbol:H}),M(x(ne),(function(e){$(e)})),r({target:F,stat:!0,forced:!l},{for:function(e){var t=String(e);if(p(ee,t))return ee[t];var n=H(t);return ee[t]=n,te[n]=t,n},keyFor:function(e){if(!se(e))throw TypeError(e+" is not a symbol");if(p(te,e))return te[e]},useSetter:function(){ie=!0},useSimple:function(){ie=!1}}),r({target:"Object",stat:!0,forced:!l,sham:!s},{create:function(e,t){return void 0===t?v(e):ce(v(e),t)},defineProperty:le,defineProperties:ce,getOwnPropertyDescriptor:pe}),r({target:"Object",stat:!0,forced:!l},{getOwnPropertyNames:de,getOwnPropertySymbols:fe}),r({target:"Object",stat:!0,forced:u((function(){S.f(1)}))},{getOwnPropertySymbols:function(e){return S.f(m(e))}}),Y&&r({target:"JSON",stat:!0,forced:!l||u((function(){var e=H();return"[null]"!=Y([e])||"{}"!=Y({a:e})||"{}"!=Y(Object(e))}))},{stringify:function(e,t,n){for(var r,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(r=t,(f(t)||void 0!==e)&&!se(e))return d(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!se(t))return t}),i[1]=t,Y.apply(null,i)}}),H[U][B]||A(H[U],B,H[U].valueOf),L(H,F),T[z]=!0},6195:function(e,t,n){n(1272)("matchAll")},2957:function(e,t,n){n(1272)("match")},4100:function(e,t,n){n(1272)("replace")},3006:function(e,t,n){n(1272)("search")},4910:function(e,t,n){n(1272)("species")},2820:function(e,t,n){n(1272)("split")},6611:function(e,t,n){n(1272)("toPrimitive")},9576:function(e,t,n){n(1272)("toStringTag")},9747:function(e,t,n){n(1272)("unscopables")},8997:function(e,t,n){"use strict";var r=n(4991),i=n.n(r),o=n(6314),a=n.n(o)()(i());a.push([e.id,".ps{overflow:hidden!important;overflow-anchor:none;-ms-overflow-style:none;touch-action:auto;-ms-touch-action:auto}.ps__rail-x{display:none;opacity:0;transition:background-color .2s linear,opacity .2s linear;-webkit-transition:background-color .2s linear,opacity .2s linear;height:15px;bottom:0;position:absolute}.ps__rail-y{display:none;opacity:0;transition:background-color .2s linear,opacity .2s linear;-webkit-transition:background-color .2s linear,opacity .2s linear;width:15px;right:0;position:absolute}.ps--active-x>.ps__rail-x,.ps--active-y>.ps__rail-y{display:block;background-color:transparent}.ps:hover>.ps__rail-x,.ps:hover>.ps__rail-y,.ps--focus>.ps__rail-x,.ps--focus>.ps__rail-y,.ps--scrolling-x>.ps__rail-x,.ps--scrolling-y>.ps__rail-y{opacity:.6}.ps .ps__rail-x:hover,.ps .ps__rail-y:hover,.ps .ps__rail-x:focus,.ps .ps__rail-y:focus,.ps .ps__rail-x.ps--clicking,.ps .ps__rail-y.ps--clicking{background-color:#eee;opacity:.9}.ps__thumb-x{background-color:#aaa;border-radius:6px;transition:background-color .2s linear,height .2s ease-in-out;-webkit-transition:background-color .2s linear,height .2s ease-in-out;height:6px;bottom:2px;position:absolute}.ps__thumb-y{background-color:#aaa;border-radius:6px;transition:background-color .2s linear,width .2s ease-in-out;-webkit-transition:background-color .2s linear,width .2s ease-in-out;width:6px;right:2px;position:absolute}.ps__rail-x:hover>.ps__thumb-x,.ps__rail-x:focus>.ps__thumb-x,.ps__rail-x.ps--clicking .ps__thumb-x{background-color:#999;height:11px}.ps__rail-y:hover>.ps__thumb-y,.ps__rail-y:focus>.ps__thumb-y,.ps__rail-y.ps--clicking .ps__thumb-y{background-color:#999;width:11px}@supports (-ms-overflow-style: none){.ps{overflow:auto!important}}@media screen and (-ms-high-contrast: active),(-ms-high-contrast: none){.ps{overflow:auto!important}}\n","",{version:3,sources:["webpack://./node_modules/perfect-scrollbar/css/perfect-scrollbar.css"],names:[],mappings:"AAGA,IACE,yBAAU,CACV,oBAAiB,CACjB,uBAAoB,CACpB,iBAAc,CACd,qBACF,CAKA,YACE,YAAS,CACT,SAAS,CACT,yDAAqD,CACrD,iEAA6D,CAC7D,WAAQ,CAER,QAAQ,CAER,iBACF,CAEA,YACE,YAAS,CACT,SAAS,CACT,yDAAqD,CACrD,iEAA6D,CAC7D,UAAO,CAEP,OAAO,CAEP,iBACF,CAEA,oDAEE,aAAS,CACT,4BACF,CAEA,oJAME,UACF,CAEA,kJAME,qBAAkB,CAClB,UACF,CAKA,aACE,qBAAkB,CAnEpB,iBAoEiB,CACf,6DAAoD,CACpD,qEAA4D,CAC5D,UAAQ,CAER,UAAQ,CAER,iBACF,CAEA,aACE,qBAAkB,CA/EpB,iBAgFiB,CACf,4DAAmD,CACnD,oEAA2D,CAC3D,SAAO,CAEP,SAAO,CAEP,iBACF,CAEA,oGAGE,qBAAkB,CAClB,WACF,CAEA,oGAGE,qBAAkB,CAClB,UACF,CAGA,qCACE,IACE,uBACF,CACF,CAEA,wEACE,IACE,uBACF,CACF",sourcesContent:["/*\n * Container style\n */\n.ps {\n overflow: hidden !important;\n overflow-anchor: none;\n -ms-overflow-style: none;\n touch-action: auto;\n -ms-touch-action: auto;\n}\n\n/*\n * Scrollbar rail styles\n */\n.ps__rail-x {\n display: none;\n opacity: 0;\n transition: background-color .2s linear, opacity .2s linear;\n -webkit-transition: background-color .2s linear, opacity .2s linear;\n height: 15px;\n /* there must be 'bottom' or 'top' for ps__rail-x */\n bottom: 0px;\n /* please don't change 'position' */\n position: absolute;\n}\n\n.ps__rail-y {\n display: none;\n opacity: 0;\n transition: background-color .2s linear, opacity .2s linear;\n -webkit-transition: background-color .2s linear, opacity .2s linear;\n width: 15px;\n /* there must be 'right' or 'left' for ps__rail-y */\n right: 0;\n /* please don't change 'position' */\n position: absolute;\n}\n\n.ps--active-x > .ps__rail-x,\n.ps--active-y > .ps__rail-y {\n display: block;\n background-color: transparent;\n}\n\n.ps:hover > .ps__rail-x,\n.ps:hover > .ps__rail-y,\n.ps--focus > .ps__rail-x,\n.ps--focus > .ps__rail-y,\n.ps--scrolling-x > .ps__rail-x,\n.ps--scrolling-y > .ps__rail-y {\n opacity: 0.6;\n}\n\n.ps .ps__rail-x:hover,\n.ps .ps__rail-y:hover,\n.ps .ps__rail-x:focus,\n.ps .ps__rail-y:focus,\n.ps .ps__rail-x.ps--clicking,\n.ps .ps__rail-y.ps--clicking {\n background-color: #eee;\n opacity: 0.9;\n}\n\n/*\n * Scrollbar thumb styles\n */\n.ps__thumb-x {\n background-color: #aaa;\n border-radius: 6px;\n transition: background-color .2s linear, height .2s ease-in-out;\n -webkit-transition: background-color .2s linear, height .2s ease-in-out;\n height: 6px;\n /* there must be 'bottom' for ps__thumb-x */\n bottom: 2px;\n /* please don't change 'position' */\n position: absolute;\n}\n\n.ps__thumb-y {\n background-color: #aaa;\n border-radius: 6px;\n transition: background-color .2s linear, width .2s ease-in-out;\n -webkit-transition: background-color .2s linear, width .2s ease-in-out;\n width: 6px;\n /* there must be 'right' for ps__thumb-y */\n right: 2px;\n /* please don't change 'position' */\n position: absolute;\n}\n\n.ps__rail-x:hover > .ps__thumb-x,\n.ps__rail-x:focus > .ps__thumb-x,\n.ps__rail-x.ps--clicking .ps__thumb-x {\n background-color: #999;\n height: 11px;\n}\n\n.ps__rail-y:hover > .ps__thumb-y,\n.ps__rail-y:focus > .ps__thumb-y,\n.ps__rail-y.ps--clicking .ps__thumb-y {\n background-color: #999;\n width: 11px;\n}\n\n/* MS supports */\n@supports (-ms-overflow-style: none) {\n .ps {\n overflow: auto !important;\n }\n}\n\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n .ps {\n overflow: auto !important;\n }\n}\n"],sourceRoot:""}]),t.A=a},6314:function(e){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,r){"string"==typeof e&&(e=[[null,e,""]]);var i={};if(r)for(var o=0;oe.length)&&(t=e.length);for(var n=0,r=new Array(t);n2?r:e).apply(void 0,i)}}e.memoize=a,e.debounce=s,e.bind=l,e.default={memoize:a,debounce:s,bind:l}},void 0===(r=n.apply(t,[t]))||(e.exports=r)},6364:function(e){e.exports={}},228:function(e){"use strict";var t=Object.prototype.hasOwnProperty,n="~";function r(){}function i(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(e,t,r,o,a){if("function"!=typeof r)throw new TypeError("The listener must be a function");var s=new i(r,o||e,a),l=n?n+t:t;return e._events[l]?e._events[l].fn?e._events[l]=[e._events[l],s]:e._events[l].push(s):(e._events[l]=s,e._eventsCount++),e}function a(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function s(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),s.prototype.eventNames=function(){var e,r,i=[];if(0===this._eventsCount)return i;for(r in e=this._events)t.call(e,r)&&i.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(e)):i},s.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,o=r.length,a=new Array(o);iu.depthLimit)return void s(t,e,r,a);if(void 0!==u.edgesLimit&&i+1>u.edgesLimit)return void s(t,e,r,a);if(o.push(e),Array.isArray(e))for(p=0;pt?1:0}function u(e,t,n,a){void 0===a&&(a=o());var s,l=p(e,"",0,[],void 0,0,a)||e;try{s=0===i.length?JSON.stringify(l,t,n):JSON.stringify(l,d(t),n)}catch(e){return JSON.stringify("[unable to serialize, circular reference is too complex to analyze]")}finally{for(;0!==r.length;){var c=r.pop();4===c.length?Object.defineProperty(c[0],c[1],c[3]):c[0][c[1]]=c[2]}}return s}function p(e,i,o,a,l,u,d){var f;if(u+=1,"object"==typeof e&&null!==e){for(f=0;fd.depthLimit)return void s(t,e,i,l);if(void 0!==d.edgesLimit&&o+1>d.edgesLimit)return void s(t,e,i,l);if(a.push(e),Array.isArray(e))for(f=0;f0)for(var r=0;r=55296&&r<=56319&&t+1=56320&&n<=57343?1024*(r-55296)+n-56320+65536:r}function H(e){return/^\n* /.test(e)}var Y=1,Q=2,G=3,X=4,K=5;function Z(e,t,n,r,o){e.dump=function(){if(0===t.length)return e.quotingType===D?'""':"''";if(!e.noCompatMode&&(-1!==N.indexOf(t)||$.test(t)))return e.quotingType===D?'"'+t+'"':"'"+t+"'";var a=e.indent*Math.max(1,n),s=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),c=r||e.flowLevel>-1&&n>=e.flowLevel;switch(function(e,t,n,r,i,o,a,s){var c,p,d=0,R=null,N=!1,$=!1,L=-1!==r,M=-1,z=B(p=W(e,0))&&p!==l&&!U(p)&&p!==w&&p!==O&&p!==k&&p!==x&&p!==A&&p!==j&&p!==P&&p!==I&&p!==m&&p!==y&&p!==v&&p!==f&&p!==T&&p!==S&&p!==E&&p!==b&&p!==h&&p!==g&&p!==_&&p!==C&&function(e){return!U(e)&&e!==k}(W(e,e.length-1));if(t||a)for(c=0;c=65536?c+=2:c++){if(!B(d=W(e,c)))return K;z=z&&V(d,R,s),R=d}else{for(c=0;c=65536?c+=2:c++){if((d=W(e,c))===u)N=!0,L&&($=$||c-M-1>r&&" "!==e[M+1],M=c);else if(!B(d))return K;z=z&&V(d,R,s),R=d}$=$||L&&c-M-1>r&&" "!==e[M+1]}return N||$?n>9&&H(e)?K:a?o===D?K:Q:$?X:G:!z||a||i(e)?o===D?K:Q:Y}(t,c,e.indent,s,(function(t){return function(e,t){var n,r;for(n=0,r=e.implicitTypes.length;n"+J(t,e.indent)+ee(z(function(e,t){for(var n,r,i,o=/(\n+)([^\n]*)/g,a=(i=-1!==(i=e.indexOf("\n"))?i:e.length,o.lastIndex=i,te(e.slice(0,i),t)),s="\n"===e[0]||" "===e[0];r=o.exec(e);){var l=r[1],c=r[2];n=" "===c[0],a+=l+(s||n||""===c?"":"\n")+te(c,t),s=n}return a}(t,s),a));case K:return'"'+function(e){for(var t,n="",r=0,i=0;i=65536?i+=2:i++)r=W(e,i),!(t=R[r])&&B(r)?(n+=e[i],r>=65536&&(n+=e[i+1])):n+=t||L(r);return n}(t)+'"';default:throw new i("impossible error: invalid scalar style")}}()}function J(e,t){var n=H(e)?String(t):"",r="\n"===e[e.length-1];return n+(!r||"\n"!==e[e.length-2]&&"\n"!==e?r?"":"-":"+")+"\n"}function ee(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function te(e,t){if(""===e||" "===e[0])return e;for(var n,r,i=/ [^ ]/g,o=0,a=0,s=0,l="";n=i.exec(e);)(s=n.index)-o>t&&(r=a>o?a:s,l+="\n"+e.slice(o,r),o=r+1),a=s;return l+="\n",e.length-o>t&&a>o?l+=e.slice(o,a)+"\n"+e.slice(a+1):l+=e.slice(o),l.slice(1)}function ne(e,t,n,r){var i,o,a,s="",l=e.tag;for(i=0,o=n.length;i tag resolver accepts not "'+p+'" style');r=u.represent[p](t,p)}e.dump=r}return!0}return!1}function ie(e,t,n,r,o,s,l){e.tag=null,e.dump=n,re(e,n,!1)||re(e,n,!0);var c,p=a.call(e.dump),d=r;r&&(r=e.flowLevel<0||e.flowLevel>t);var f,h,m="[object Object]"===p||"[object Array]"===p;if(m&&(h=-1!==(f=e.duplicates.indexOf(n))),(null!==e.tag&&"?"!==e.tag||h||2!==e.indent&&t>0)&&(o=!1),h&&e.usedDuplicates[f])e.dump="*ref_"+f;else{if(m&&h&&!e.usedDuplicates[f]&&(e.usedDuplicates[f]=!0),"[object Object]"===p)r&&0!==Object.keys(e.dump).length?(function(e,t,n,r){var o,a,s,l,c,p,d="",f=e.tag,h=Object.keys(n);if(!0===e.sortKeys)h.sort();else if("function"==typeof e.sortKeys)h.sort(e.sortKeys);else if(e.sortKeys)throw new i("sortKeys must be a boolean or a function");for(o=0,a=h.length;o1024)&&(e.dump&&u===e.dump.charCodeAt(0)?p+="?":p+="? "),p+=e.dump,c&&(p+=F(e,t)),ie(e,t+1,l,!0,c)&&(e.dump&&u===e.dump.charCodeAt(0)?p+=":":p+=": ",d+=p+=e.dump));e.tag=f,e.dump=d||"{}"}(e,t,e.dump,o),h&&(e.dump="&ref_"+f+e.dump)):(function(e,t,n){var r,i,o,a,s,l="",c=e.tag,u=Object.keys(n);for(r=0,i=u.length;r1024&&(s+="? "),s+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),ie(e,t,a,!1,!1)&&(l+=s+=e.dump));e.tag=c,e.dump="{"+l+"}"}(e,t,e.dump),h&&(e.dump="&ref_"+f+" "+e.dump));else if("[object Array]"===p)r&&0!==e.dump.length?(e.noArrayIndent&&!l&&t>0?ne(e,t-1,e.dump,o):ne(e,t,e.dump,o),h&&(e.dump="&ref_"+f+e.dump)):(function(e,t,n){var r,i,o,a="",s=e.tag;for(r=0,i=n.length;r",e.dump=c+" "+e.dump)}return!0}function oe(e,t){var n,r,i=[],o=[];for(ae(e,i,o),n=0,r=o.length;n>10),56320+(e-65536&1023))}for(var j=new Array(256),C=new Array(256),P=0;P<256;P++)j[P]=_(P)?1:0,C[P]=_(P);function T(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||a,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function I(e,t){var n={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return n.snippet=o(n),new i(t,n)}function R(e,t){throw I(e,t)}function N(e,t){e.onWarning&&e.onWarning.call(null,I(e,t))}var $={YAML:function(e,t,n){var r,i,o;null!==e.version&&R(e,"duplication of %YAML directive"),1!==n.length&&R(e,"YAML directive accepts exactly one argument"),null===(r=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&R(e,"ill-formed argument of the YAML directive"),i=parseInt(r[1],10),o=parseInt(r[2],10),1!==i&&R(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&N(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var r,i;2!==n.length&&R(e,"TAG directive accepts exactly two arguments"),r=n[0],i=n[1],b.test(r)||R(e,"ill-formed tag handle (first argument) of the TAG directive"),s.call(e.tagMap,r)&&R(e,'there is a previously declared suffix for "'+r+'" tag handle'),v.test(i)||R(e,"ill-formed tag prefix (second argument) of the TAG directive");try{i=decodeURIComponent(i)}catch(t){R(e,"tag prefix is malformed: "+i)}e.tagMap[r]=i}};function L(e,t,n,r){var i,o,a,s;if(t1&&(e.result+=r.repeat("\n",t-1))}function q(e,t){var n,r,i=e.tag,o=e.anchor,a=[],s=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=a),r=e.input.charCodeAt(e.position);0!==r&&(-1!==e.firstTabInLine&&(e.position=e.firstTabInLine,R(e,"tab characters must not be used in indentation")),45===r)&&S(e.input.charCodeAt(e.position+1));)if(s=!0,e.position++,F(e,!0,-1)&&e.lineIndent<=t)a.push(null),r=e.input.charCodeAt(e.position);else if(n=e.line,H(e,t,u,!1,!0),a.push(e.result),F(e,!0,-1),r=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==r)R(e,"bad indentation of a sequence entry");else if(e.lineIndentt?T=1:e.lineIndent===t?T=0:e.lineIndentt?T=1:e.lineIndent===t?T=0:e.lineIndentt)&&(v&&(a=e.line,s=e.lineStart,l=e.position),H(e,t,p,!0,i)&&(v?y=e.result:b=e.result),v||(M(e,h,m,g,y,b,a,s,l),g=y=b=null),F(e,!0,-1),u=e.input.charCodeAt(e.position)),(e.line===o||e.lineIndent>t)&&0!==u)R(e,"bad indentation of a mapping entry");else if(e.lineIndent=0))break;0===o?R(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?R(e,"repeat of an indentation width identifier"):(p=t+o-1,u=!0)}if(k(a)){do{a=e.input.charCodeAt(++e.position)}while(k(a));if(35===a)do{a=e.input.charCodeAt(++e.position)}while(!w(a)&&0!==a)}for(;0!==a;){for(z(e),e.lineIndent=0,a=e.input.charCodeAt(e.position);(!u||e.lineIndentp&&(p=e.lineIndent),w(a))m++;else{if(e.lineIndent0){for(i=a,o=0;i>0;i--)(a=O(s=e.input.charCodeAt(++e.position)))>=0?o=(o<<4)+a:R(e,"expected hexadecimal character");e.result+=A(o),e.position++}else R(e,"unknown escape sequence");n=r=e.position}else w(s)?(L(e,n,r,!0),B(e,F(e,!1,t)),n=r=e.position):e.position===e.lineStart&&U(e)?R(e,"unexpected end of the document within a double quoted scalar"):(e.position++,r=e.position)}R(e,"unexpected end of the stream within a double quoted scalar")}(e,_)?N=!0:function(e){var t,n,r;if(42!==(r=e.input.charCodeAt(e.position)))return!1;for(r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!S(r)&&!E(r);)r=e.input.charCodeAt(++e.position);return e.position===t&&R(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),s.call(e.anchorMap,n)||R(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],F(e,!0,-1),!0}(e)?(N=!0,null===e.tag&&null===e.anchor||R(e,"alias node should not have any properties")):function(e,t,n){var r,i,o,a,s,l,c,u,p=e.kind,d=e.result;if(S(u=e.input.charCodeAt(e.position))||E(u)||35===u||38===u||42===u||33===u||124===u||62===u||39===u||34===u||37===u||64===u||96===u)return!1;if((63===u||45===u)&&(S(r=e.input.charCodeAt(e.position+1))||n&&E(r)))return!1;for(e.kind="scalar",e.result="",i=o=e.position,a=!1;0!==u;){if(58===u){if(S(r=e.input.charCodeAt(e.position+1))||n&&E(r))break}else if(35===u){if(S(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&U(e)||n&&E(u))break;if(w(u)){if(s=e.line,l=e.lineStart,c=e.lineIndent,F(e,!1,-1),e.lineIndent>=t){a=!0,u=e.input.charCodeAt(e.position);continue}e.position=o,e.line=s,e.lineStart=l,e.lineIndent=c;break}}a&&(L(e,i,o,!1),B(e,e.line-s),i=o=e.position,a=!1),k(u)||(o=e.position+1),u=e.input.charCodeAt(++e.position)}return L(e,i,o,!1),!!e.result||(e.kind=p,e.result=d,!1)}(e,_,l===n)&&(N=!0,null===e.tag&&(e.tag="?")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===T&&(N=g&&q(e,P))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&R(e,'unacceptable node kind for ! tag; it should be "scalar", not "'+e.kind+'"'),y=0,b=e.implicitTypes.length;y"),null!==e.result&&x.kind!==e.kind&&R(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+x.kind+'", not "'+e.kind+'"'),x.resolve(e.result,e.tag)?(e.result=x.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):R(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||N}function Y(e){var t,n,r,i,o=e.position,a=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(i=e.input.charCodeAt(e.position))&&(F(e,!0,-1),i=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==i));){for(a=!0,i=e.input.charCodeAt(++e.position),t=e.position;0!==i&&!S(i);)i=e.input.charCodeAt(++e.position);for(r=[],(n=e.input.slice(t,e.position)).length<1&&R(e,"directive name must not be less than one character in length");0!==i;){for(;k(i);)i=e.input.charCodeAt(++e.position);if(35===i){do{i=e.input.charCodeAt(++e.position)}while(0!==i&&!w(i));break}if(w(i))break;for(t=e.position;0!==i&&!S(i);)i=e.input.charCodeAt(++e.position);r.push(e.input.slice(t,e.position))}0!==i&&z(e),s.call($,n)?$[n](e,n,r):N(e,'unknown document directive "'+n+'"')}F(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,F(e,!0,-1)):a&&R(e,"directives end mark is expected"),H(e,e.lineIndent-1,p,!1,!0),F(e,!0,-1),e.checkLineBreaks&&g.test(e.input.slice(o,e.position))&&N(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&U(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,F(e,!0,-1)):e.positions&&(t=r-s+(o=" ... ").length),n-r>s&&(n=r+s-(a=" ...").length),{str:o+e.slice(t,n).replace(/\t/g,"→")+a,pos:r-t+o.length}}function o(e,t){return r.repeat(" ",t-e.length)+e}e.exports=function(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),"number"!=typeof t.indent&&(t.indent=1),"number"!=typeof t.linesBefore&&(t.linesBefore=3),"number"!=typeof t.linesAfter&&(t.linesAfter=2);for(var n,a=/\r?\n|\r|\0/g,s=[0],l=[],c=-1;n=a.exec(e.buffer);)l.push(n.index),s.push(n.index+n[0].length),e.position<=n.index&&c<0&&(c=s.length-2);c<0&&(c=s.length-1);var u,p,d="",f=Math.min(e.line+t.linesAfter,l.length).toString().length,h=t.maxLength-(t.indent+f+3);for(u=1;u<=t.linesBefore&&!(c-u<0);u++)p=i(e.buffer,s[c-u],l[c-u],e.position-(s[c]-s[c-u]),h),d=r.repeat(" ",t.indent)+o((e.line-u+1).toString(),f)+" | "+p.str+"\n"+d;for(p=i(e.buffer,s[c],l[c],e.position,h),d+=r.repeat(" ",t.indent)+o((e.line+1).toString(),f)+" | "+p.str+"\n",d+=r.repeat("-",t.indent+f+3+p.pos)+"^\n",u=1;u<=t.linesAfter&&!(c+u>=l.length);u++)p=i(e.buffer,s[c+u],l[c+u],e.position-(s[c]-s[c+u]),h),d+=r.repeat(" ",t.indent)+o((e.line+u+1).toString(),f)+" | "+p.str+"\n";return d.replace(/\n$/,"")}},5388:function(e,t,n){"use strict";var r=n(1231),i=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],o=["scalar","sequence","mapping"];e.exports=function(e,t){var n,a;if(t=t||{},Object.keys(t).forEach((function(t){if(-1===i.indexOf(t))throw new r('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=(n=t.styleAliases||null,a={},null!==n&&Object.keys(n).forEach((function(e){n[e].forEach((function(t){a[String(t)]=e}))})),a),-1===o.indexOf(this.kind))throw new r('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}},9342:function(e,t,n){"use strict";var r=n(5388),i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";e.exports=new r("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,r=0,o=e.length,a=i;for(n=0;n64)){if(t<0)return!1;r+=6}return r%8==0},construct:function(e){var t,n,r=e.replace(/[\r\n=]/g,""),o=r.length,a=i,s=0,l=[];for(t=0;t>16&255),l.push(s>>8&255),l.push(255&s)),s=s<<6|a.indexOf(r.charAt(t));return 0==(n=o%4*6)?(l.push(s>>16&255),l.push(s>>8&255),l.push(255&s)):18===n?(l.push(s>>10&255),l.push(s>>2&255)):12===n&&l.push(s>>4&255),new Uint8Array(l)},predicate:function(e){return"[object Uint8Array]"===Object.prototype.toString.call(e)},represent:function(e){var t,n,r="",o=0,a=e.length,s=i;for(t=0;t>18&63],r+=s[o>>12&63],r+=s[o>>6&63],r+=s[63&o]),o=(o<<8)+e[t];return 0==(n=a%3)?(r+=s[o>>18&63],r+=s[o>>12&63],r+=s[o>>6&63],r+=s[63&o]):2===n?(r+=s[o>>10&63],r+=s[o>>4&63],r+=s[o<<2&63],r+=s[64]):1===n&&(r+=s[o>>2&63],r+=s[o<<4&63],r+=s[64],r+=s[64]),r}})},6199:function(e,t,n){"use strict";var r=n(5388);e.exports=new r("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)},construct:function(e){return"true"===e||"True"===e||"TRUE"===e},predicate:function(e){return"[object Boolean]"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},1461:function(e,t,n){"use strict";var r=n(8433),i=n(5388),o=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),a=/^[-+]?[0-9]+e/;e.exports=new i("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!o.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n;return n="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:n*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||r.isNegativeZero(e))},represent:function(e,t){var n;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(r.isNegativeZero(e))return"-0.0";return n=e.toString(10),a.test(n)?n.replace("e",".e"):n},defaultStyle:"lowercase"})},4466:function(e,t,n){"use strict";var r=n(8433),i=n(5388);function o(e){return 48<=e&&e<=55}function a(e){return 48<=e&&e<=57}e.exports=new i("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,r=e.length,i=0,s=!1;if(!r)return!1;if("-"!==(t=e[i])&&"+"!==t||(t=e[++i]),"0"===t){if(i+1===r)return!0;if("b"===(t=e[++i])){for(i++;i=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},2369:function(e,t,n){"use strict";var r=n(5388);e.exports=new r("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})},1851:function(e,t,n){"use strict";var r=n(5388);e.exports=new r("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}})},9198:function(e,t,n){"use strict";var r=n(5388);e.exports=new r("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)},construct:function(){return null},predicate:function(e){return null===e},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"})},6946:function(e,t,n){"use strict";var r=n(5388),i=Object.prototype.hasOwnProperty,o=Object.prototype.toString;e.exports=new r("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,n,r,a,s,l=[],c=e;for(t=0,n=c.length;tc))return!1;var p=s.get(e);if(p&&s.get(t))return p==t;var d=-1,f=!0,h=n&o?new Ae:void 0;for(s.set(e,t),s.set(t,e);++d-1},Oe.prototype.set=function(e,t){var n=this.__data__,r=Ce(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this},_e.prototype.clear=function(){this.size=0,this.__data__={hash:new Ee,map:new(de||Oe),string:new Ee}},_e.prototype.delete=function(e){var t=$e(this,e).delete(e);return this.size-=t?1:0,t},_e.prototype.get=function(e){return $e(this,e).get(e)},_e.prototype.has=function(e){return $e(this,e).has(e)},_e.prototype.set=function(e,t){var n=$e(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this},Ae.prototype.add=Ae.prototype.push=function(e){return this.__data__.set(e,r),this},Ae.prototype.has=function(e){return this.__data__.has(e)},je.prototype.clear=function(){this.__data__=new Oe,this.size=0},je.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},je.prototype.get=function(e){return this.__data__.get(e)},je.prototype.has=function(e){return this.__data__.has(e)},je.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Oe){var r=n.__data__;if(!de||r.length<199)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new _e(r)}return n.set(e,t),this.size=n.size,this};var De=le?function(e){return null==e?[]:(e=Object(e),function(t){for(var n=-1,r=null==t?0:t.length,i=0,o=[];++n-1&&e%1==0&&e-1&&e%1==0&&e<=a}function Ye(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Qe(e){return null!=e&&"object"==typeof e}var Ge=z?function(e){return function(t){return e(t)}}(z):function(e){return Qe(e)&&He(e.length)&&!!P[Pe(e)]};function Xe(e){return null!=(t=e)&&He(t.length)&&!We(t)?function(e,t){var n=qe(e),r=!n&&Be(e),i=!n&&!r&&Ve(e),o=!n&&!r&&!i&&Ge(e),a=n||r||i||o,s=a?function(e,t){for(var n=-1,r=Array(e);++n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,l=0;a=Array.prototype.slice.call(a);var c=function(){--s<=0&&o(l)};s||c(),a.forEach((function(t){e.matches(t,i.exclude)?c():i.onIframeReady(t,(function(e){n(t)&&(l++,r(e)),c()}),c)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach((function(e,t){e.val===n&&(i=t,o=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach((function(e){e.handled||i.getIframeContents(e.val,(function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o=this,a=this.createIterator(t,e,r),s=[],l=[],c=void 0,u=void 0;p=void 0,p=o.getIteratorNode(a),u=p.prevNode,c=p.node;)this.iframes&&this.forEachIframe(t,(function(e){return o.checkIframeFilter(c,u,e,s)}),(function(t){o.createInstanceOnIframe(t).forEachNode(e,(function(e){return l.push(e)}),r)})),l.push(c);var p;l.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(s,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach((function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,(function(){--a<=0&&i()}))};r.iframes?r.waitForIframes(o,s):s()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every((function(t){return!r.call(e,t)||(i=!0,!1)})),i}return!1}}]),e}(),o=function(){function o(e){t(this,o),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(o,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynomyms(a)+"|"+this.processSynomyms(s)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":""}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":""}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach((function(i){n.every((function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="string"==typeof n?[]:n.limiters,o="";switch(i.forEach((function(e){o+="|"+t.escapeStr(e)})),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(o="\\s"+(o||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+o+"]*)";case"exactly":return"(^|\\s"+o+")("+e+")(?=$|\\s"+o+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every((function(a,s){var l=e.nodes[s+1];if(void 0===l||l.start>t){if(!r(a.node))return!1;var c=t-a.start,u=(n>a.end?a.end:n)-a.start,p=e.value.substr(0,a.start),d=e.value.substr(u+a.start);if(a.node=o.wrapRangeInTextNode(a.node,c,u),e.value=p+d,e.nodes.forEach((function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=u),e.nodes[n].end-=u)})),n-=u,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];)if(n(i[a],t)){var s=i.index;if(0!==a)for(var l=1;l1&&console.warn("Replacing with",t),m++}}else{let i=u(l(t,e[n]));if(a.verbose>1&&console.warn((!1===i?f.colour.red:f.colour.green)+"Fragment resolution",e[n],f.colour.normal),!1===i){if(r.parent[r.pkey]={},a.fatal){let t=new Error("Fragment $ref resolution failed "+e[n]);if(!a.promise)throw t;a.promise.reject(t)}}else m++,r.parent[r.pkey]=i,h[e[n]]=r.path.replace("/%24ref","")}else if(p.protocol){let t=o.resolve(i,e[n]).toString();a.verbose>1&&console.warn(f.colour.yellow+"Rewriting external url ref",e[n],"as",t,f.colour.normal),e["x-miro"]=e[n],a.externalRefs[e[n]]&&(a.externalRefs[t]||(a.externalRefs[t]=a.externalRefs[e[n]]),a.externalRefs[t].failed=a.externalRefs[e[n]].failed),e[n]=t}else if(!e["x-miro"]){let t=o.resolve(i,e[n]).toString(),r=!1;a.externalRefs[e[n]]&&(r=a.externalRefs[e[n]].failed),r||(a.verbose>1&&console.warn(f.colour.yellow+"Rewriting external ref",e[n],"as",t,f.colour.normal),e["x-miro"]=e[n],e[n]=t)}}));return c(e,{},(function(e,t,n){d(e,t)&&void 0!==e.$fixed&&delete e.$fixed})),a.verbose>1&&console.warn("Finished fragment resolution"),e}function m(e,t){if(!t.filters||!t.filters.length)return e;for(let n of t.filters)e=n(e,t);return e}function g(e,t,n,a){var c=o.parse(n.source),p=n.source.split("\\").join("/").split("/");p.pop()||p.pop();let d="",f=t.split("#");f.length>1&&(d="#"+f[1],t=f[0]),p=p.join("/");let g=(y=o.parse(t).protocol,b=c.protocol,y&&y.length>2?y:b&&b.length>2?b:"file:");var y,b;let v;if(v="file:"===g?i.resolve(p?p+"/":"",t):o.resolve(p?p+"/":"",t),n.cache[v]){n.verbose&&console.warn("CACHED",v,d);let e=u(n.cache[v]),r=n.externalRef=e;if(d&&(r=l(r,d),!1===r&&(r={},n.fatal))){let e=new Error("Cached $ref resolution failed "+v+d);if(!n.promise)throw e;n.promise.reject(e)}return r=h(r,e,t,d,v,n),r=m(r,n),a(u(r),v,n),Promise.resolve(r)}if(n.verbose&&console.warn("GET",v,d),n.handlers&&n.handlers[g])return n.handlers[g](p,t,d,n).then((function(e){return n.externalRef=e,e=m(e,n),n.cache[v]=e,a(e,v,n),e})).catch((function(e){throw n.verbose&&console.warn(e),e}));if(g&&g.startsWith("http")){const e=Object.assign({},n.fetchOptions,{agent:n.agent});return n.fetch(v,e).then((function(e){if(200!==e.status){if(n.ignoreIOErrors)return n.verbose&&console.warn("FAILED",t),n.externalRefs[t].failed=!0,'{"$ref":"'+t+'"}';throw new Error(`Received status code ${e.status}: ${v}`)}return e.text()})).then((function(e){try{let r=s.parse(e,{schema:"core",prettyErrors:!0});if(e=n.externalRef=r,n.cache[v]=u(e),d&&!1===(e=l(e,d))&&(e={},n.fatal)){let e=new Error("Remote $ref resolution failed "+v+d);if(!n.promise)throw e;n.promise.reject(e)}e=m(e=h(e,r,t,d,v,n),n)}catch(e){if(n.verbose&&console.warn(e),!n.promise||!n.fatal)throw e;n.promise.reject(e)}return a(e,v,n),e})).catch((function(e){if(n.verbose&&console.warn(e),n.cache[v]={},!n.promise||!n.fatal)throw e;n.promise.reject(e)}))}{const e='{"$ref":"'+t+'"}';return function(e,t,n,i,o){return new Promise((function(a,s){r.readFile(e,t,(function(e,t){e?n.ignoreIOErrors&&o?(n.verbose&&console.warn("FAILED",i),n.externalRefs[i].failed=!0,a(o)):s(e):a(t)}))}))}(v,n.encoding||"utf8",n,t,e).then((function(e){try{let r=s.parse(e,{schema:"core",prettyErrors:!0});if(e=n.externalRef=r,n.cache[v]=u(e),d&&!1===(e=l(e,d))&&(e={},n.fatal)){let e=new Error("File $ref resolution failed "+v+d);if(!n.promise)throw e;n.promise.reject(e)}e=m(e=h(e,r,t,d,v,n),n)}catch(e){if(n.verbose&&console.warn(e),!n.promise||!n.fatal)throw e;n.promise.reject(e)}return a(e,v,n),e})).catch((function(e){if(n.verbose&&console.warn(e),!n.promise||!n.fatal)throw e;n.promise.reject(e)}))}}function y(e){return new Promise((function(t,n){(function(e){return new Promise((function(t,n){function r(t,n,r){if(t[n]&&d(t[n],"$ref")){let o=t[n].$ref;if(!o.startsWith("#")){let a="";if(!i[o]){let t=Object.keys(i).find((function(e,t,n){return o.startsWith(e+"/")}));t&&(e.verbose&&console.warn("Found potential subschema at",t),a="/"+(o.split("#")[1]||"").replace(t.split("#")[1]||""),a=a.split("/undefined").join(""),o=t)}if(i[o]||(i[o]={resolved:!1,paths:[],extras:{},description:t[n].description}),i[o].resolved)if(i[o].failed);else if(e.rewriteRefs){let r=i[o].resolvedAt;e.verbose>1&&console.warn("Rewriting ref",o,r),t[n]["x-miro"]=o,t[n].$ref=r+a}else t[n]=u(i[o].data);else i[o].paths.push(r.path),i[o].extras[r.path]=a}}}let i=e.externalRefs;if(e.resolver.depth>0&&e.source===e.resolver.base)return t(i);c(e.openapi.definitions,{identityDetection:!0,path:"#/definitions"},r),c(e.openapi.components,{identityDetection:!0,path:"#/components"},r),c(e.openapi,{identityDetection:!0},r),t(i)}))})(e).then((function(t){for(let n in t)if(!t[n].resolved){let r=e.resolver.depth;r>0&&r++,e.resolver.actions[r].push((function(){return g(e.openapi,n,e,(function(e,r,i){if(!t[n].resolved){let o={};o.context=t[n],o.$ref=n,o.original=u(e),o.updated=e,o.source=r,i.externals.push(o),t[n].resolved=!0}let o=Object.assign({},i,{source:"",resolver:{actions:i.resolver.actions,depth:i.resolver.actions.length-1,base:i.resolver.base}});i.patch&&t[n].description&&!e.description&&"object"==typeof e&&(e.description=t[n].description),t[n].data=e;let a=(s=t[n].paths,[...new Set(s)]);var s;a=a.sort((function(e,t){const n=e.startsWith("#/components/")||e.startsWith("#/definitions/"),r=t.startsWith("#/components/")||t.startsWith("#/definitions/");return n&&!r?-1:r&&!n?1:0}));for(let r of a)if(t[n].resolvedAt&&r!==t[n].resolvedAt&&r.indexOf("x-ms-examples/")<0)i.verbose>1&&console.warn("Creating pointer to data at",r),l(i.openapi,r,{$ref:t[n].resolvedAt+t[n].extras[r],"x-miro":n+t[n].extras[r]});else{t[n].resolvedAt?i.verbose>1&&console.warn("Avoiding circular reference"):(t[n].resolvedAt=r,i.verbose>1&&console.warn("Creating initial clone of data at",r));let o=u(e);l(i.openapi,r,o)}0===i.resolver.actions[o.resolver.depth].length&&i.resolver.actions[o.resolver.depth].push((function(){return y(o)}))}))}))}})).catch((function(t){e.verbose&&console.warn(t),n(t)}));let r={options:e};r.actions=e.resolver.actions[e.resolver.depth],t(r)}))}function b(e,t,n){e.resolver.actions.push([]),y(e).then((function(r){var i;(i=r.actions,i.reduce(((e,t)=>e.then((e=>t().then(Array.prototype.concat.bind(e))))),Promise.resolve([]))).then((function(){if(e.resolver.depth>=e.resolver.actions.length)return console.warn("Ran off the end of resolver actions"),t(!0);e.resolver.depth++,e.resolver.actions[e.resolver.depth].length?setTimeout((function(){b(r.options,t,n)}),0):(e.verbose>1&&console.warn(f.colour.yellow+"Finished external resolution!",f.colour.normal),e.resolveInternal&&(e.verbose>1&&console.warn(f.colour.yellow+"Starting internal resolution!",f.colour.normal),e.openapi=p(e.openapi,e.original,{verbose:e.verbose-1}),e.verbose>1&&console.warn(f.colour.yellow+"Finished internal resolution!",f.colour.normal)),c(e.openapi,{},(function(t,n,r){d(t,n)&&(e.preserveMiro||delete t["x-miro"])})),t(e))})).catch((function(t){e.verbose&&console.warn(t),n(t)}))})).catch((function(t){e.verbose&&console.warn(t),n(t)}))}function v(e){if(e.cache||(e.cache={}),e.fetch||(e.fetch=a),e.source){let t=o.parse(e.source);(!t.protocol||t.protocol.length<=2)&&(e.source=i.resolve(e.source))}e.externals=[],e.externalRefs={},e.rewriteRefs=!0,e.resolver={},e.resolver.depth=0,e.resolver.base=e.source,e.resolver.actions=[[]]}e.exports={optionalResolve:function(e){return v(e),new Promise((function(t,n){e.resolve?b(e,t,n):t(e)}))},resolve:function(e,t,n){return n||(n={}),n.openapi=e,n.source=t,n.resolve=!0,v(n),new Promise((function(e,t){b(n,e,t)}))}}},1319:function(e){"use strict";function t(){return{depth:0,seen:new WeakMap,top:!0,combine:!1,allowRefSiblings:!1}}e.exports={getDefaultState:t,walkSchema:function e(n,r,i,o){if(void 0===i.depth&&(i=t()),null==n)return n;if(void 0!==n.$ref){let e={$ref:n.$ref};return i.allowRefSiblings&&n.description&&(e.description=n.description),o(e,r,i),e}if(i.combine&&(n.allOf&&Array.isArray(n.allOf)&&1===n.allOf.length&&delete(n=Object.assign({},n.allOf[0],n)).allOf,n.anyOf&&Array.isArray(n.anyOf)&&1===n.anyOf.length&&delete(n=Object.assign({},n.anyOf[0],n)).anyOf,n.oneOf&&Array.isArray(n.oneOf)&&1===n.oneOf.length&&delete(n=Object.assign({},n.oneOf[0],n)).oneOf),o(n,r,i),i.seen.has(n))return n;if("object"==typeof n&&null!==n&&i.seen.set(n,!0),i.top=!1,i.depth++,void 0!==n.items&&(i.property="items",e(n.items,n,i,o)),n.additionalItems&&"object"==typeof n.additionalItems&&(i.property="additionalItems",e(n.additionalItems,n,i,o)),n.additionalProperties&&"object"==typeof n.additionalProperties&&(i.property="additionalProperties",e(n.additionalProperties,n,i,o)),n.properties)for(let t in n.properties){let r=n.properties[t];i.property="properties/"+t,e(r,n,i,o)}if(n.patternProperties)for(let t in n.patternProperties){let r=n.patternProperties[t];i.property="patternProperties/"+t,e(r,n,i,o)}if(n.allOf)for(let t in n.allOf){let r=n.allOf[t];i.property="allOf/"+t,e(r,n,i,o)}if(n.anyOf)for(let t in n.anyOf){let r=n.anyOf[t];i.property="anyOf/"+t,e(r,n,i,o)}if(n.oneOf)for(let t in n.oneOf){let r=n.oneOf[t];i.property="oneOf/"+t,e(r,n,i,o)}return n.not&&(i.property="not",e(n.not,n,i,o)),i.depth--,n}}},7975:function(e){"use strict";function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function n(e,t){for(var n,r="",i=0,o=-1,a=0,s=0;s<=e.length;++s){if(s2){var l=r.lastIndexOf("/");if(l!==r.length-1){-1===l?(r="",i=0):i=(r=r.slice(0,l)).length-1-r.lastIndexOf("/"),o=s,a=0;continue}}else if(2===r.length||1===r.length){r="",i=0,o=s,a=0;continue}t&&(r.length>0?r+="/..":r="..",i=2)}else r.length>0?r+="/"+e.slice(o+1,s):r=e.slice(o+1,s),i=s-o-1;o=s,a=0}else 46===n&&-1!==a?++a:a=-1}return r}var r={resolve:function(){for(var e,r="",i=!1,o=arguments.length-1;o>=-1&&!i;o--){var a;o>=0?a=arguments[o]:(void 0===e&&(e=process.cwd()),a=e),t(a),0!==a.length&&(r=a+"/"+r,i=47===a.charCodeAt(0))}return r=n(r,!i),i?r.length>0?"/"+r:"/":r.length>0?r:"."},normalize:function(e){if(t(e),0===e.length)return".";var r=47===e.charCodeAt(0),i=47===e.charCodeAt(e.length-1);return 0!==(e=n(e,!r)).length||r||(e="."),e.length>0&&i&&(e+="/"),r?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,n=0;n0&&(void 0===e?e=i:e+="/"+i)}return void 0===e?".":r.normalize(e)},relative:function(e,n){if(t(e),t(n),e===n)return"";if((e=r.resolve(e))===(n=r.resolve(n)))return"";for(var i=1;ic){if(47===n.charCodeAt(s+p))return n.slice(s+p+1);if(0===p)return n.slice(s+p)}else a>c&&(47===e.charCodeAt(i+p)?u=p:0===p&&(u=0));break}var d=e.charCodeAt(i+p);if(d!==n.charCodeAt(s+p))break;47===d&&(u=p)}var f="";for(p=i+u+1;p<=o;++p)p!==o&&47!==e.charCodeAt(p)||(0===f.length?f+="..":f+="/..");return f.length>0?f+n.slice(s+u):(s+=u,47===n.charCodeAt(s)&&++s,n.slice(s))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var n=e.charCodeAt(0),r=47===n,i=-1,o=!0,a=e.length-1;a>=1;--a)if(47===(n=e.charCodeAt(a))){if(!o){i=a;break}}else o=!1;return-1===i?r?"/":".":r&&1===i?"//":e.slice(0,i)},basename:function(e,n){if(void 0!==n&&"string"!=typeof n)throw new TypeError('"ext" argument must be a string');t(e);var r,i=0,o=-1,a=!0;if(void 0!==n&&n.length>0&&n.length<=e.length){if(n.length===e.length&&n===e)return"";var s=n.length-1,l=-1;for(r=e.length-1;r>=0;--r){var c=e.charCodeAt(r);if(47===c){if(!a){i=r+1;break}}else-1===l&&(a=!1,l=r+1),s>=0&&(c===n.charCodeAt(s)?-1==--s&&(o=r):(s=-1,o=l))}return i===o?o=l:-1===o&&(o=e.length),e.slice(i,o)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!a){i=r+1;break}}else-1===o&&(a=!1,o=r+1);return-1===o?"":e.slice(i,o)},extname:function(e){t(e);for(var n=-1,r=0,i=-1,o=!0,a=0,s=e.length-1;s>=0;--s){var l=e.charCodeAt(s);if(47!==l)-1===i&&(o=!1,i=s+1),46===l?-1===n?n=s:1!==a&&(a=1):-1!==n&&(a=-1);else if(!o){r=s+1;break}}return-1===n||-1===i||0===a||1===a&&n===i-1&&n===r+1?"":e.slice(n,i)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var n=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return n?n===t.root?n+r:n+"/"+r:r}(0,e)},parse:function(e){t(e);var n={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return n;var r,i=e.charCodeAt(0),o=47===i;o?(n.root="/",r=1):r=0;for(var a=-1,s=0,l=-1,c=!0,u=e.length-1,p=0;u>=r;--u)if(47!==(i=e.charCodeAt(u)))-1===l&&(c=!1,l=u+1),46===i?-1===a?a=u:1!==p&&(p=1):-1!==a&&(p=-1);else if(!c){s=u+1;break}return-1===a||-1===l||0===p||1===p&&a===l-1&&a===s+1?-1!==l&&(n.base=n.name=0===s&&o?e.slice(1,l):e.slice(s,l)):(0===s&&o?(n.name=e.slice(1,a),n.base=e.slice(1,l)):(n.name=e.slice(s,a),n.base=e.slice(s,l)),n.ext=e.slice(a,l)),s>0?n.dir=e.slice(0,s-1):o&&(n.dir="/"),n},sep:"/",delimiter:":",win32:null,posix:null};r.posix=r,e.exports=r},5127:function(e){e.exports=function(){var e=[],t=[],n={},r={},i={};function o(e){return"string"==typeof e?new RegExp("^"+e+"$","i"):e}function a(e,t){return e===t?t:e===e.toLowerCase()?t.toLowerCase():e===e.toUpperCase()?t.toUpperCase():e[0]===e[0].toUpperCase()?t.charAt(0).toUpperCase()+t.substr(1).toLowerCase():t.toLowerCase()}function s(e,t){return e.replace(t[0],(function(n,r){var i,o,s=(i=t[1],o=arguments,i.replace(/\$(\d{1,2})/g,(function(e,t){return o[t]||""})));return a(""===n?e[r-1]:n,s)}))}function l(e,t,r){if(!e.length||n.hasOwnProperty(e))return t;for(var i=r.length;i--;){var o=r[i];if(o[0].test(t))return s(t,o)}return t}function c(e,t,n){return function(r){var i=r.toLowerCase();return t.hasOwnProperty(i)?a(r,i):e.hasOwnProperty(i)?a(r,e[i]):l(i,r,n)}}function u(e,t,n,r){return function(r){var i=r.toLowerCase();return!!t.hasOwnProperty(i)||!e.hasOwnProperty(i)&&l(i,i,n)===i}}function p(e,t,n){return(n?t+" ":"")+(1===t?p.singular(e):p.plural(e))}return p.plural=c(i,r,e),p.isPlural=u(i,r,e),p.singular=c(r,i,t),p.isSingular=u(r,i,t),p.addPluralRule=function(t,n){e.push([o(t),n])},p.addSingularRule=function(e,n){t.push([o(e),n])},p.addUncountableRule=function(e){"string"!=typeof e?(p.addPluralRule(e,"$0"),p.addSingularRule(e,"$0")):n[e.toLowerCase()]=!0},p.addIrregularRule=function(e,t){t=t.toLowerCase(),e=e.toLowerCase(),i[e]=t,r[t]=e},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["passerby","passersby"]].forEach((function(e){return p.addIrregularRule(e[0],e[1])})),[[/s?$/i,"s"],[/[^\u0000-\u007F]$/i,"$0"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|t[lm]as|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/\b((?:tit)?m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach((function(e){return p.addPluralRule(e[0],e[1])})),[[/s$/i,""],[/(ss)$/i,"$1"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/\b((?:tit)?m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i,"$1"],[/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i,"$1sis"],[/(movie|twelve|abuse|e[mn]u)s$/i,"$1"],[/(test)(?:is|es)$/i,"$1is"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach((function(e){return p.addSingularRule(e[0],e[1])})),["adulthood","advice","agenda","aid","aircraft","alcohol","ammo","analytics","anime","athletics","audio","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","cod","commerce","cooperation","corps","debris","diabetes","digestion","elk","energy","equipment","excretion","expertise","firmware","flounder","fun","gallows","garbage","graffiti","hardware","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","mud","manga","news","only","personnel","pike","plankton","pliers","police","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","software","species","staff","swine","tennis","traffic","transportation","trout","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pok[eé]mon$/i,/[^aeiou]ese$/i,/deer$/i,/fish$/i,/measles$/i,/o[iu]s$/i,/pox$/i,/sheep$/i].forEach(p.addUncountableRule),p}()},7022:function(){!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var i=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,a=0;a>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean},5624:function(){Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}},4511:function(){!function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(Prism)},2415:function(){!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism)},5651:function(){!function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return"(?:"+t[+n]+")"}))}function n(e,n,r){return RegExp(t(e,n),r||"")}function r(e,t){for(var n=0;n>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var i="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",o="class enum interface record struct",a="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",s="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var c=l(o),u=RegExp(l(i+" "+o+" "+a+" "+s)),p=l(o+" "+a+" "+s),d=l(i+" "+o+" "+s),f=r(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),h=r(/\((?:[^()]|<>)*\)/.source,2),m=/@?\b[A-Za-z_]\w*\b/.source,g=t(/<<0>>(?:\s*<<1>>)?/.source,[m,f]),y=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[p,g]),b=/\[\s*(?:,\s*)*\]/.source,v=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[y,b]),x=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[f,h,b]),w=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[x]),k=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[w,y,b]),S={keyword:u,punctuation:/[<>()?,.:[\]]/},E=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,O=/"(?:\\.|[^\\"\r\n])*"/.source,_=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[_]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[O]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[y]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[m,k]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[m]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[c,g]),lookbehind:!0,inside:S},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[y]),lookbehind:!0,inside:S},{pattern:n(/(\bwhere\s+)<<0>>/.source,[m]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[v]),lookbehind:!0,inside:S},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[k,d,m]),inside:S}],keyword:u,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[m]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[m]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[h]),lookbehind:!0,alias:"class-name",inside:S},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[k,y]),inside:S,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[k]),lookbehind:!0,inside:S,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[m,f]),inside:{function:n(/^<<0>>/.source,[m]),generic:{pattern:RegExp(f),alias:"class-name",inside:S}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[c,g,m,k,u.source,h,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[g,h]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:u,"class-name":{pattern:RegExp(k),greedy:!0,inside:S},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var A=O+"|"+E,j=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[A]),C=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[j]),2),P=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,T=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[y,C]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[P,T]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[P]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[C]),inside:e.languages.csharp},"class-name":{pattern:RegExp(y),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var I=/:[^}\r\n]+/.source,R=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[j]),2),N=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[R,I]),$=r(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[A]),2),L=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[$,I]);function D(t,r){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[r,I]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:D(N,R)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[L]),lookbehind:!0,greedy:!0,inside:D(L,$)}],char:{pattern:RegExp(E),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism)},2630:function(){Prism.languages.csv={value:/[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,punctuation:/,/}},6378:function(){Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]},4784:function(){!function(e){function t(e){return RegExp("(^(?:"+e+"):[ \t]*(?![ \t]))[^]+","i")}e.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:t(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:e.languages.csp},{pattern:t(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:e.languages.hpkp},{pattern:t(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:e.languages.hsts},{pattern:t(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var n,r=e.languages,i={"application/javascript":r.javascript,"application/json":r.json||r.javascript,"application/xml":r.xml,"text/xml":r.xml,"text/html":r.html,"text/css":r.css,"text/plain":r.plain},o={"application/json":!0,"application/xml":!0};function a(e){var t=e.replace(/^[a-z]+\//,"");return"(?:"+e+"|\\w+/(?:[\\w.-]+\\+)+"+t+"(?![+\\w.-]))"}for(var s in i)if(i[s]){n=n||{};var l=o[s]?a(s):s;n[s.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+l+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:i[s]}}n&&e.languages.insertBefore("http","header",n)}(Prism)},6976:function(){!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},64:function(){Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},9700:function(){!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,i,o){if(n.language===r){var a=n.tokenStack=[];n.code=n.code.replace(i,(function(e){if("function"==typeof o&&!o(e))return e;for(var i,s=a.length;-1!==n.code.indexOf(i=t(r,s));)++s;return a[s]=e,i})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var i=0,o=Object.keys(n.tokenStack);!function a(s){for(var l=0;l=o.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[i],p=n.tokenStack[u],d="string"==typeof c?c:c.content,f=t(r,u),h=d.indexOf(f);if(h>-1){++i;var m=d.substring(0,h),g=new e.Token(r,e.tokenize(p,n.grammar),"language-"+r,p),y=d.substring(h+f.length),b=[];m&&b.push.apply(b,a([m])),b.push(g),y&&b.push.apply(b,a([y])),"string"==typeof c?s.splice.apply(s,[l,1].concat(b)):c.content=b}}else c.content&&a(c.content)}return s}(n.tokens)}}}})}(Prism)},4312:function(){Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:Prism.languages[t]};var i={};i[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},Prism.languages.insertBefore("markup","cdata",i)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(e,t){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:Prism.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml},596:function(){Prism.languages.objectivec=Prism.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete Prism.languages.objectivec["class-name"],Prism.languages.objc=Prism.languages.objectivec},2821:function(){!function(e){var t=/(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/.source;e.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(/\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,t].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp(/\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,t].join("|")+")"+/[msixpodualngc]*/.source),greedy:!0},{pattern:RegExp(/(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,/([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/.source,t+/\s*/.source+t].join("|")+")"+/[msixpodualngcer]*/.source),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(Prism)},3554:function(){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],r=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,i=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,o=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:r,operator:i,punctuation:o};var a={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},s=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:a}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:a}}];e.languages.insertBefore("php","variable",{string:s,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:s,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:r,operator:i,punctuation:o}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},2342:function(){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},4113:function(){Prism.languages.q={string:/"(?:\\.|[^"\\\r\n])*"/,comment:[{pattern:/([\t )\]}])\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,lookbehind:!0,greedy:!0},{pattern:/^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,greedy:!0},{pattern:/^#!.+/m,greedy:!0}],symbol:/`(?::\S+|[\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,alias:"number"},number:/\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,keyword:/\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,adverb:{pattern:/['\/\\]:?|\beach\b/,alias:"function"},verb:{pattern:/(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,alias:"operator"},punctuation:/[(){}\[\];.]/}},1648:function(){!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",r=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+r),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+r+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},4252:function(){Prism.languages.scala=Prism.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|derives|do|else|enum|extends|extension|final|finally|for|forSome|given|if|implicit|import|infix|inline|lazy|match|new|null|object|opaque|open|override|package|private|protected|return|sealed|self|super|this|throw|trait|transparent|try|type|using|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,symbol:/'[^\d\s\\]\w*/}),Prism.languages.insertBefore("scala","triple-quoted-string",{"string-interpolation":{pattern:/\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,greedy:!0,inside:{id:{pattern:/^\w+/,greedy:!0,alias:"function"},escape:{pattern:/\\\$"|\$[$"]/,greedy:!0,alias:"symbol"},interpolation:{pattern:/\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,greedy:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:Prism.languages.scala}}},string:/[\s\S]+/}}}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala.function,delete Prism.languages.scala.constant},6966:function(){Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}},4793:function(){Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift}))},83:function(){!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",i=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function a(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+i+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:a(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:a(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:a(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:a(o),lookbehind:!0,greedy:!0},number:{pattern:a(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},8848:function(e,t,n){var r=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,r={},i={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=p.reach);S+=k.value.length,k=k.next){var E=k.value;if(t.length>e.length)return;if(!(E instanceof o)){var O,_=1;if(b){if(!(O=a(w,S,e,y))||O.index>=e.length)break;var A=O.index,j=O.index+O[0].length,C=S;for(C+=k.value.length;A>=C;)C+=(k=k.next).value.length;if(S=C-=k.value.length,k.value instanceof o)continue;for(var P=k;P!==t.tail&&(Cp.reach&&(p.reach=N);var $=k.prev;if(I&&($=c(t,$,I),S+=I.length),u(t,$,_),k=c(t,$,new o(d,g?i.tokenize(T,g):T,v,T)),R&&c(t,k,R),_>1){var L={cause:d+","+h,reach:N};s(e,t,n,k.prev,S,L),p&&L.reach>p.reach&&(p.reach=L.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function c(e,t,n){var r=t.next,i={value:n,prev:t,next:r};return t.next=i,r.prev=i,e.length++,i}function u(e,t,n){for(var r=t.next,i=0;i"+o.content+""},!e.document)return e.addEventListener?(i.disableWorkerMessageHandler||e.addEventListener("message",(function(t){var n=JSON.parse(t.data),r=n.language,o=n.code,a=n.immediateClose;e.postMessage(i.highlight(o,i.languages[r],r)),a&&e.close()}),!1),i):i;var p=i.util.currentScript();function d(){i.manual||i.highlightAll()}if(p&&(i.filename=p.src,p.hasAttribute("data-manual")&&(i.manual=!0)),!i.manual){var f=document.readyState;"loading"===f||"interactive"===f&&p&&p.defer?document.addEventListener("DOMContentLoaded",d):window.requestAnimationFrame?window.requestAnimationFrame(d):window.setTimeout(d,16)}return i}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});e.exports&&(e.exports=r),void 0!==n.g&&(n.g.Prism=r),r.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},r.languages.markup.tag.inside["attr-value"].inside.entity=r.languages.markup.entity,r.languages.markup.doctype.inside["internal-subset"].inside=r.languages.markup,r.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(r.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:r.languages[t]},n.cdata=/^$/i;var i={"included-cdata":{pattern://i,inside:n}};i["language-"+t]={pattern:/[\s\S]+/,inside:r.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:i},r.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(r.languages.markup.tag,"addAttribute",{value:function(e,t){r.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:r.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),r.languages.html=r.languages.markup,r.languages.mathml=r.languages.markup,r.languages.svg=r.languages.markup,r.languages.xml=r.languages.extend("markup",{}),r.languages.ssml=r.languages.xml,r.languages.atom=r.languages.xml,r.languages.rss=r.languages.xml,function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(r),r.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},r.languages.javascript=r.languages.extend("clike",{"class-name":[r.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),r.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,r.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:r.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:r.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:r.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:r.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:r.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),r.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:r.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),r.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),r.languages.markup&&(r.languages.markup.tag.addInlined("script","javascript"),r.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),r.languages.js=r.languages.javascript,function(){if(void 0!==r&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},t="data-src-status",n="loading",i="loaded",o="pre[data-src]:not(["+t+'="'+i+'"]):not(['+t+'="'+n+'"])';r.hooks.add("before-highlightall",(function(e){e.selector+=", "+o})),r.hooks.add("before-sanity-check",(function(a){var s=a.element;if(s.matches(o)){a.code="",s.setAttribute(t,n);var l=s.appendChild(document.createElement("CODE"));l.textContent="Loading…";var c=s.getAttribute("data-src"),u=a.language;if("none"===u){var p=(/\.(\w+)$/.exec(c)||[,"none"])[1];u=e[p]||p}r.util.setLanguage(l,u),r.util.setLanguage(s,u);var d=r.plugins.autoloader;d&&d.loadLanguages(u),function(e,n,o){var a=new XMLHttpRequest;a.open("GET",e,!0),a.onreadystatechange=function(){4==a.readyState&&(a.status<400&&a.responseText?function(e){s.setAttribute(t,i);var n=function(e){var t=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(e||"");if(t){var n=Number(t[1]),r=t[2],i=t[3];return r?i?[n,Number(i)]:[n,void 0]:[n,n]}}(s.getAttribute("data-range"));if(n){var o=e.split(/\r\n?|\n/g),a=n[0],c=null==n[1]?o.length:n[1];a<0&&(a+=o.length),a=Math.max(0,Math.min(a-1,o.length)),c<0&&(c+=o.length),c=Math.max(0,Math.min(c,o.length)),e=o.slice(a,c).join("\n"),s.hasAttribute("data-start")||s.setAttribute("data-start",String(a+1))}l.textContent=e,r.highlightElement(l)}(a.responseText):a.status>=400?o("✖ Error "+a.status+" while fetching file: "+a.statusText):o("✖ Error: File does not exist or is empty"))},a.send(null)}(c,0,(function(e){s.setAttribute(t,"failed"),l.textContent=e}))}})),r.plugins.fileHighlight={highlight:function(e){for(var t,n=(e||document).querySelectorAll(o),i=0;t=n[i++];)r.highlightElement(t)}};var a=!1;r.fileHighlight=function(){a||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),a=!0),r.plugins.fileHighlight.highlight.apply(this,arguments)}}}()},2694:function(e,t,n){"use strict";var r=n(6925);function i(){}function o(){}o.resetWarningCache=i,e.exports=function(){function e(e,t,n,i,o,a){if(a!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:i};return n.PropTypes=n,n}},5556:function(e,t,n){e.exports=n(2694)()},6925:function(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:function(e,t,n){"use strict";var r=n(6540),i=n(194);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n